changeset 0:f990fcb411a9

Копия текущей версии из github
author cin
date Thu, 27 Mar 2014 21:46:09 +0400
parents
children 8f65451dc28f
files .editorconfig .gitignore .hgignore BLToolkit.2008.6.0.ReSharper BLToolkit.2008.6.1.ReSharper BLToolkit.2008.sln BLToolkit.2010.sln BLToolkit.2012.sln Data/BLToolkitData.mdb Data/BLToolkitData.sqlite Data/Create Scripts/Access.sql Data/Create Scripts/DB2.sql Data/Create Scripts/Firebird2.sql Data/Create Scripts/Informix.sql Data/Create Scripts/MsSql.sql Data/Create Scripts/MsSql2000.sql Data/Create Scripts/MySql.sql Data/Create Scripts/Oracle.sql Data/Create Scripts/PostgreSQL.sql Data/Create Scripts/SQLite.sql Data/Create Scripts/SqlCe.sql Data/Create Scripts/Sybase.sql Data/Data.dbp Data/Queries/Person_SelectAll.sql DataProviders/Compile3.bat DataProviders/Compile4.bat DataProviders/DB2/BLToolkit.Data.DataProvider.DB2.3.csproj DataProviders/DB2/BLToolkit.Data.DataProvider.DB2.4.csproj DataProviders/DB2/Properties/AssemblyInfo.cs DataProviders/DevartOraclePro/BLToolkit.Data.DataProvider.DevartOracle.4.csproj DataProviders/DevartOraclePro/BLToolkit.Data.DataProvider.DevartOraclePro.4.csproj DataProviders/DevartOraclePro/DevartOracleDataProvider.cs DataProviders/DevartOraclePro/Properties/AssemblyInfo.cs DataProviders/DevartOraclePro/Properties/licenses.config DataProviders/DevartOraclePro/Properties/licenses.licx DataProviders/DevartOraclePro/app.config DataProviders/DevartOraclePro/packages.config DataProviders/Firebird/BLToolkit.Data.DataProvider.Firebird.3.csproj DataProviders/Firebird/BLToolkit.Data.DataProvider.Firebird.4.csproj DataProviders/Firebird/Properties/AssemblyInfo.cs DataProviders/Firebird/packages.config DataProviders/Generic/App.config DataProviders/Generic/BLToolkit.Data.DataProvider.Generic.4.csproj DataProviders/Generic/Properties/AssemblyInfo.cs DataProviders/Informix/BLToolkit.Data.DataProvider.Informix.3.csproj DataProviders/Informix/BLToolkit.Data.DataProvider.Informix.4.csproj DataProviders/Informix/Properties/AssemblyInfo.cs DataProviders/MySql/BLToolkit.Data.DataProvider.MySql.3.csproj DataProviders/MySql/BLToolkit.Data.DataProvider.MySql.4.csproj DataProviders/MySql/Properties/AssemblyInfo.cs DataProviders/MySql/packages.config DataProviders/Oracle/BLToolkit.Data.DataProvider.Oracle.3.csproj DataProviders/Oracle/BLToolkit.Data.DataProvider.Oracle.4.csproj DataProviders/Oracle/BLToolkit.Data.DataProvider.OracleManaged.4.csproj DataProviders/Oracle/Properties/AssemblyInfo.cs DataProviders/Oracle/packages.config DataProviders/PostgreSQL/BLToolkit.Data.DataProvider.PostgreSQL.3.csproj DataProviders/PostgreSQL/BLToolkit.Data.DataProvider.PostgreSQL.4.csproj DataProviders/PostgreSQL/Properties/AssemblyInfo.cs DataProviders/PostgreSQL/packages.config DataProviders/SQLite/BLToolkit.Data.DataProvider.SQLite.3.csproj DataProviders/SQLite/BLToolkit.Data.DataProvider.SQLite.4.csproj DataProviders/SQLite/Properties/AssemblyInfo.cs DataProviders/SQLite/packages.config DataProviders/SQLite/x64/SQLite.Interop.dll DataProviders/SQLite/x86/SQLite.Interop.dll DataProviders/SqlCe/BLToolkit.Data.DataProvider.SqlCe.3.csproj DataProviders/SqlCe/BLToolkit.Data.DataProvider.SqlCe.4.csproj DataProviders/SqlCe/Properties/AssemblyInfo.cs DataProviders/SqlCe/packages.config DataProviders/Sybase/BLToolkit.Data.DataProvider.Sybase.3.csproj DataProviders/Sybase/BLToolkit.Data.DataProvider.Sybase.4.csproj DataProviders/Sybase/Properties/AssemblyInfo.cs Demo/Asp.Net/BusinessLogic/Cart.cs Demo/Asp.Net/BusinessLogic/DataAccess/AccessorBase.cs Demo/Asp.Net/BusinessLogic/DataAccess/InventoryAccessor.cs Demo/Asp.Net/BusinessLogic/DataAccess/OrderAccessor.cs Demo/Asp.Net/BusinessLogic/DataAccess/ProductAccessor.cs Demo/Asp.Net/BusinessLogic/DataAccess/ProfileAccessor.cs Demo/Asp.Net/BusinessLogic/OrderManager.cs Demo/Asp.Net/BusinessLogic/PetShop.BusinessLogic.2005.csproj Demo/Asp.Net/BusinessLogic/PetShop.BusinessLogic.csproj Demo/Asp.Net/BusinessLogic/ProductManager.cs Demo/Asp.Net/BusinessLogic/ProfileProvider.cs Demo/Asp.Net/BusinessLogic/Properties/AssemblyInfo.cs Demo/Asp.Net/ObjectModel/Address.cs Demo/Asp.Net/ObjectModel/CartItem.cs Demo/Asp.Net/ObjectModel/Category.cs Demo/Asp.Net/ObjectModel/CreditCard.cs Demo/Asp.Net/ObjectModel/CustomProfile.cs Demo/Asp.Net/ObjectModel/Item.cs Demo/Asp.Net/ObjectModel/ItemStatus.cs Demo/Asp.Net/ObjectModel/Order.cs Demo/Asp.Net/ObjectModel/OrderLineItem.cs Demo/Asp.Net/ObjectModel/PetShop.ObjectModel.2005.csproj Demo/Asp.Net/ObjectModel/PetShop.ObjectModel.csproj Demo/Asp.Net/ObjectModel/Product.cs Demo/Asp.Net/ObjectModel/Properties/AssemblyInfo.cs Demo/Asp.Net/ReadMe.txt Demo/Asp.Net/Web/Admin/Counters.aspx Demo/Asp.Net/Web/Admin/Counters.aspx.cs Demo/Asp.Net/Web/Admin/Items.aspx Demo/Asp.Net/Web/Admin/Items.aspx.cs Demo/Asp.Net/Web/Admin/MasterPage.master Demo/Asp.Net/Web/Admin/MasterPage.master.cs Demo/Asp.Net/Web/Admin/Orders.aspx Demo/Asp.Net/Web/Admin/Orders.aspx.cs Demo/Asp.Net/Web/App_Code/AssemblyInfo.cs Demo/Asp.Net/Web/App_Code/CustomGrid.cs Demo/Asp.Net/Web/App_Code/CustomList.cs Demo/Asp.Net/Web/App_Code/PageBase.cs Demo/Asp.Net/Web/App_Code/WebUtility.cs Demo/Asp.Net/Web/App_Themes/PetShop/SkinFile.skin Demo/Asp.Net/Web/App_Themes/PetShop/StyleSheet.css Demo/Asp.Net/Web/CheckOut.aspx Demo/Asp.Net/Web/CheckOut.aspx.cs Demo/Asp.Net/Web/Comm_Images/Logo-home.gif Demo/Asp.Net/Web/Comm_Images/Logo.gif Demo/Asp.Net/Web/Comm_Images/bg-body.gif Demo/Asp.Net/Web/Comm_Images/bg-labelLists.gif Demo/Asp.Net/Web/Comm_Images/bg-search.gif Demo/Asp.Net/Web/Comm_Images/bg-sign-in.gif Demo/Asp.Net/Web/Comm_Images/button-back.gif Demo/Asp.Net/Web/Comm_Images/button-calculate.gif Demo/Asp.Net/Web/Comm_Images/button-cart-grey.gif Demo/Asp.Net/Web/Comm_Images/button-cart.gif Demo/Asp.Net/Web/Comm_Images/button-checkout.gif Demo/Asp.Net/Web/Comm_Images/button-continue.gif Demo/Asp.Net/Web/Comm_Images/button-delete.gif Demo/Asp.Net/Web/Comm_Images/button-home.gif Demo/Asp.Net/Web/Comm_Images/button-search.gif Demo/Asp.Net/Web/Comm_Images/button-wishlist-grey.gif Demo/Asp.Net/Web/Comm_Images/button-wishlist.gif Demo/Asp.Net/Web/Comm_Images/dotten-line.gif Demo/Asp.Net/Web/Comm_Images/home-bg-body.gif Demo/Asp.Net/Web/Comm_Images/home-fish.gif Demo/Asp.Net/Web/Comm_Images/seahorse.gif Demo/Asp.Net/Web/Comm_Images/spacer.gif Demo/Asp.Net/Web/Comm_Images/vertigo-icon.gif Demo/Asp.Net/Web/Controls/AddressConfirm.ascx Demo/Asp.Net/Web/Controls/AddressConfirm.ascx.cs Demo/Asp.Net/Web/Controls/AddressForm.ascx Demo/Asp.Net/Web/Controls/AddressForm.ascx.cs Demo/Asp.Net/Web/Controls/BreadCrumbControl.ascx Demo/Asp.Net/Web/Controls/BreadCrumbControl.ascx.cs Demo/Asp.Net/Web/Controls/CartList.ascx Demo/Asp.Net/Web/Controls/CartList.ascx.cs Demo/Asp.Net/Web/Controls/CreditCardForm.ascx Demo/Asp.Net/Web/Controls/CreditCardForm.ascx.cs Demo/Asp.Net/Web/Controls/ItemsControl.ascx Demo/Asp.Net/Web/Controls/ItemsControl.ascx.cs Demo/Asp.Net/Web/Controls/NavigationControl.ascx Demo/Asp.Net/Web/Controls/NavigationControl.ascx.cs Demo/Asp.Net/Web/Controls/ProductsControl.ascx Demo/Asp.Net/Web/Controls/ProductsControl.ascx.cs Demo/Asp.Net/Web/Controls/SearchControl.ascx Demo/Asp.Net/Web/Controls/SearchControl.ascx.cs Demo/Asp.Net/Web/Controls/ShoppingCartControl.ascx Demo/Asp.Net/Web/Controls/ShoppingCartControl.ascx.cs Demo/Asp.Net/Web/Controls/WishListControl.ascx Demo/Asp.Net/Web/Controls/WishListControl.ascx.cs Demo/Asp.Net/Web/Default.aspx Demo/Asp.Net/Web/Default.aspx.cs Demo/Asp.Net/Web/Error.aspx Demo/Asp.Net/Web/Global.asax Demo/Asp.Net/Web/Items.aspx Demo/Asp.Net/Web/Items.aspx.cs Demo/Asp.Net/Web/MasterPage.master Demo/Asp.Net/Web/MasterPage.master.cs Demo/Asp.Net/Web/NewUser.aspx Demo/Asp.Net/Web/Prod_Images/Backyard/icon-cat.gif Demo/Asp.Net/Web/Prod_Images/Backyard/icon-crab.gif Demo/Asp.Net/Web/Prod_Images/Backyard/icon-goose.gif Demo/Asp.Net/Web/Prod_Images/Backyard/icon-raccoon.gif Demo/Asp.Net/Web/Prod_Images/Backyard/icon-sheep.gif Demo/Asp.Net/Web/Prod_Images/Backyard/icon-skunk.gif Demo/Asp.Net/Web/Prod_Images/Backyard/icon-zebra.gif Demo/Asp.Net/Web/Prod_Images/Backyard/item-cat-patterned.gif Demo/Asp.Net/Web/Prod_Images/Backyard/item-cat-transparent.gif Demo/Asp.Net/Web/Prod_Images/Backyard/item-cat-uncolored.gif Demo/Asp.Net/Web/Prod_Images/Backyard/item-crab-dotted.gif Demo/Asp.Net/Web/Prod_Images/Backyard/item-crab-orange.gif Demo/Asp.Net/Web/Prod_Images/Backyard/item-crab-red.gif Demo/Asp.Net/Web/Prod_Images/Backyard/item-goose-feathered.gif Demo/Asp.Net/Web/Prod_Images/Backyard/item-goose-plucked.gif Demo/Asp.Net/Web/Prod_Images/Backyard/item-raccoon-hairy-tongue.gif Demo/Asp.Net/Web/Prod_Images/Backyard/item-raccoon-long-tongue.gif Demo/Asp.Net/Web/Prod_Images/Backyard/item-raccoon-rough-tongue.gif Demo/Asp.Net/Web/Prod_Images/Backyard/item-sheep-fuzzy.gif Demo/Asp.Net/Web/Prod_Images/Backyard/item-sheep-ironed.gif Demo/Asp.Net/Web/Prod_Images/Backyard/item-skunk-bad-smell.gif Demo/Asp.Net/Web/Prod_Images/Backyard/item-skunk-really-bad-smell.gif Demo/Asp.Net/Web/Prod_Images/Backyard/item-skunk-worst-smell.gif Demo/Asp.Net/Web/Prod_Images/Backyard/item-zebra-large.gif Demo/Asp.Net/Web/Prod_Images/Backyard/item-zebra-medium.gif Demo/Asp.Net/Web/Prod_Images/Backyard/item-zebra-small.gif Demo/Asp.Net/Web/Prod_Images/Backyard/item-zebra-tiny.gif Demo/Asp.Net/Web/Prod_Images/Birds/icon-Duck.gif Demo/Asp.Net/Web/Prod_Images/Birds/icon-Owl.gif Demo/Asp.Net/Web/Prod_Images/Birds/icon-Pelican.gif Demo/Asp.Net/Web/Prod_Images/Birds/icon-Penguin.gif Demo/Asp.Net/Web/Prod_Images/Birds/icon-Pteranodon.gif Demo/Asp.Net/Web/Prod_Images/Birds/item-duck-domestic.gif Demo/Asp.Net/Web/Prod_Images/Birds/item-duck-wild.gif Demo/Asp.Net/Web/Prod_Images/Birds/item-owl-day.gif Demo/Asp.Net/Web/Prod_Images/Birds/item-owl-night.gif Demo/Asp.Net/Web/Prod_Images/Birds/item-pelican-flowerloving.gif Demo/Asp.Net/Web/Prod_Images/Birds/item-pelican-grassloving.gif Demo/Asp.Net/Web/Prod_Images/Birds/item-penguine-adventurous.gif Demo/Asp.Net/Web/Prod_Images/Birds/item-penguine-homey.gif Demo/Asp.Net/Web/Prod_Images/Birds/item-pteranodon-ancient.gif Demo/Asp.Net/Web/Prod_Images/Birds/item-pteranodon-old.gif Demo/Asp.Net/Web/Prod_Images/Bugs/icon-ant.gif Demo/Asp.Net/Web/Prod_Images/Bugs/icon-butterfly.gif Demo/Asp.Net/Web/Prod_Images/Bugs/icon-dragonfly.gif Demo/Asp.Net/Web/Prod_Images/Bugs/icon-frog.gif Demo/Asp.Net/Web/Prod_Images/Bugs/icon-slug.gif Demo/Asp.Net/Web/Prod_Images/Bugs/icon-spider.gif Demo/Asp.Net/Web/Prod_Images/Bugs/item-ant-queen.gif Demo/Asp.Net/Web/Prod_Images/Bugs/item-ant-soldier.gif Demo/Asp.Net/Web/Prod_Images/Bugs/item-ant-worker.gif Demo/Asp.Net/Web/Prod_Images/Bugs/item-butterfly-adult.gif Demo/Asp.Net/Web/Prod_Images/Bugs/item-butterfly-larva.gif Demo/Asp.Net/Web/Prod_Images/Bugs/item-butterfly-pupa.gif Demo/Asp.Net/Web/Prod_Images/Bugs/item-dragonfly-omnivore.gif Demo/Asp.Net/Web/Prod_Images/Bugs/item-dragonfly-vegan.gif Demo/Asp.Net/Web/Prod_Images/Bugs/item-dragonfly-vegetarian.gif Demo/Asp.Net/Web/Prod_Images/Bugs/item-frog-false.gif Demo/Asp.Net/Web/Prod_Images/Bugs/item-frog-true.gif Demo/Asp.Net/Web/Prod_Images/Bugs/item-slug-habitat.gif Demo/Asp.Net/Web/Prod_Images/Bugs/item-slug-naked.gif Demo/Asp.Net/Web/Prod_Images/Bugs/item-spider-Aranielladisplicata.gif Demo/Asp.Net/Web/Prod_Images/Bugs/item-spider-Dysderacrocata.gif Demo/Asp.Net/Web/Prod_Images/Endangered/icon-dino.gif Demo/Asp.Net/Web/Prod_Images/Endangered/icon-fish.gif Demo/Asp.Net/Web/Prod_Images/Endangered/icon-panda.gif Demo/Asp.Net/Web/Prod_Images/Endangered/icon-pet.gif Demo/Asp.Net/Web/Prod_Images/Endangered/icon-skeleton.gif Demo/Asp.Net/Web/Prod_Images/Endangered/item-dino-pointy.gif Demo/Asp.Net/Web/Prod_Images/Endangered/item-dino-shaved.gif Demo/Asp.Net/Web/Prod_Images/Endangered/item-dino-spiky.gif Demo/Asp.Net/Web/Prod_Images/Endangered/item-fish-caught.gif Demo/Asp.Net/Web/Prod_Images/Endangered/item-fish-drunk.gif Demo/Asp.Net/Web/Prod_Images/Endangered/item-fish-lost.gif Demo/Asp.Net/Web/Prod_Images/Endangered/item-panda-exclusive.gif Demo/Asp.Net/Web/Prod_Images/Endangered/item-pet-kitty.gif Demo/Asp.Net/Web/Prod_Images/Endangered/item-pet-rover.gif Demo/Asp.Net/Web/Prod_Images/Endangered/item-pet-thumper.gif Demo/Asp.Net/Web/Prod_Images/Endangered/item-skeleton-aphrodite.gif Demo/Asp.Net/Web/Prod_Images/Endangered/item-skeleton-female.gif Demo/Asp.Net/Web/Prod_Images/Endangered/item-skeleton-hermaphrodite.gif Demo/Asp.Net/Web/Prod_Images/Endangered/item-skeleton-male.gif Demo/Asp.Net/Web/Prod_Images/Fish/icon-Ballonfish.gif Demo/Asp.Net/Web/Prod_Images/Fish/icon-Blindfish.gif Demo/Asp.Net/Web/Prod_Images/Fish/icon-crabfish.gif Demo/Asp.Net/Web/Prod_Images/Fish/icon-eucalyptus.gif Demo/Asp.Net/Web/Prod_Images/Fish/icon-meno.gif Demo/Asp.Net/Web/Prod_Images/Fish/icon-misterno.gif Demo/Asp.Net/Web/Prod_Images/Fish/icon-nosyfish.gif Demo/Asp.Net/Web/Prod_Images/Fish/icon-toothferry.gif Demo/Asp.Net/Web/Prod_Images/Fish/item-MisterNo-black.gif Demo/Asp.Net/Web/Prod_Images/Fish/item-MisterNo-sable.gif Demo/Asp.Net/Web/Prod_Images/Fish/item-MisterNo-sepia.gif Demo/Asp.Net/Web/Prod_Images/Fish/item-balloon-extra-stretch.gif Demo/Asp.Net/Web/Prod_Images/Fish/item-balloon-flammable.gif Demo/Asp.Net/Web/Prod_Images/Fish/item-balloon-natural.gif Demo/Asp.Net/Web/Prod_Images/Fish/item-blindfish-blind.gif Demo/Asp.Net/Web/Prod_Images/Fish/item-blindfish-farsighted.gif Demo/Asp.Net/Web/Prod_Images/Fish/item-blindfish-shortsighted.gif Demo/Asp.Net/Web/Prod_Images/Fish/item-crabfish-ballet.gif Demo/Asp.Net/Web/Prod_Images/Fish/item-crabfish-ballroom.gif Demo/Asp.Net/Web/Prod_Images/Fish/item-crabfish-tabdance.gif Demo/Asp.Net/Web/Prod_Images/Fish/item-eucalyptus-longarms.gif Demo/Asp.Net/Web/Prod_Images/Fish/item-eucalyptus-shortarms.gif Demo/Asp.Net/Web/Prod_Images/Fish/item-meno-camouflage.gif Demo/Asp.Net/Web/Prod_Images/Fish/item-meno-happy.gif Demo/Asp.Net/Web/Prod_Images/Fish/item-meno-worried.gif Demo/Asp.Net/Web/Prod_Images/Fish/item-nosyfish-beastly.gif Demo/Asp.Net/Web/Prod_Images/Fish/item-nosyfish-invidious.gif Demo/Asp.Net/Web/Prod_Images/Fish/item-nosyfish-mean.gif Demo/Asp.Net/Web/Prod_Images/Fish/item-nosyfish-sneaky.gif Demo/Asp.Net/Web/Prod_Images/Fish/item-toothferry-toothless.gif Demo/Asp.Net/Web/Prod_Images/Fish/item-toothferry-withteeth.gif Demo/Asp.Net/Web/Products.aspx Demo/Asp.Net/Web/Products.aspx.cs Demo/Asp.Net/Web/Search.aspx Demo/Asp.Net/Web/ShoppingCart.aspx Demo/Asp.Net/Web/ShoppingCart.aspx.cs Demo/Asp.Net/Web/SignIn.aspx Demo/Asp.Net/Web/UserProfile.aspx Demo/Asp.Net/Web/UserProfile.aspx.cs Demo/Asp.Net/Web/Web.config Demo/Asp.Net/Web/WishList.aspx Demo/Asp.Net/Web/WishList.aspx.cs Demo/Linq/Demo/App.config Demo/Linq/Demo/BLToolkit/BLToolkit.3.dll Demo/Linq/Demo/DataModel/BLToolkit.ttinclude Demo/Linq/Demo/DataModel/MSSQL.ttinclude Demo/Linq/Demo/DataModel/Northwind.sql Demo/Linq/Demo/DataModel/NorthwindDB.cs Demo/Linq/Demo/DataModel/NorthwindDB.generated.cs Demo/Linq/Demo/DataModel/NorthwindDB.tt Demo/Linq/Demo/Linq.Demo.2008.csproj Demo/Linq/Demo/Linq.Demo.2008.sln Demo/Linq/Demo/Linq.Demo.2010.csproj Demo/Linq/Demo/Linq.Demo.2010.sln Demo/Linq/Demo/Program.cs Demo/Linq/Demo/Properties/AssemblyInfo.cs Demo/Linq/OverWCF/App.config Demo/Linq/OverWCF/Client.cs Demo/Linq/OverWCF/DataModel.generated.cs Demo/Linq/OverWCF/DataModel.tt Demo/Linq/OverWCF/DemoService.cs Demo/Linq/OverWCF/IDemoService.cs Demo/Linq/OverWCF/Linq.OverWCF.csproj Demo/Linq/OverWCF/Program.cs Demo/Linq/OverWCF/Properties/AssemblyInfo.cs Demo/Partial.Trust/Asp.Net/Default.aspx Demo/Partial.Trust/Asp.Net/Default.aspx.cs Demo/Partial.Trust/Asp.Net/Default.aspx.designer.cs Demo/Partial.Trust/Asp.Net/Partial.Trust.Asp.Net.2008.csproj Demo/Partial.Trust/Asp.Net/Partial.Trust.Asp.Net.csproj Demo/Partial.Trust/Asp.Net/Properties/AssemblyInfo.cs Demo/Partial.Trust/Asp.Net/Web.config Demo/Partial.Trust/Components/Customer.cs Demo/Partial.Trust/Components/Partial.Trust.Components.2008.csproj Demo/Partial.Trust/Components/Partial.Trust.Components.csproj Demo/Partial.Trust/Components/Partial.Trust.snk Demo/Partial.Trust/Components/PersonDataAccessor.cs Demo/Partial.Trust/Components/Properties/AssemblyInfo.cs Demo/Partial.Trust/ReadMe.txt Demo/Silverlight/Client.Web/Client.Web.csproj Demo/Silverlight/Client.Web/ClientTestPage.aspx Demo/Silverlight/Client.Web/ClientTestPage.html Demo/Silverlight/Client.Web/DataModel.generated.cs Demo/Silverlight/Client.Web/DataModel.tt Demo/Silverlight/Client.Web/LinqWebService.asmx Demo/Silverlight/Client.Web/LinqWebService.asmx.cs Demo/Silverlight/Client.Web/Properties/AssemblyInfo.cs Demo/Silverlight/Client.Web/Silverlight.js Demo/Silverlight/Client.Web/Web.Debug.config Demo/Silverlight/Client.Web/Web.Release.config Demo/Silverlight/Client.Web/Web.config Demo/Silverlight/Client/App.xaml Demo/Silverlight/Client/App.xaml.cs Demo/Silverlight/Client/Client.csproj Demo/Silverlight/Client/DataModel.generated.cs Demo/Silverlight/Client/DataModel.tt Demo/Silverlight/Client/MainPage.xaml Demo/Silverlight/Client/MainPage.xaml.cs Demo/Silverlight/Client/Properties/AppManifest.xml Demo/Silverlight/Client/Properties/AssemblyInfo.cs Demo/WebServices/Client/Client.csproj Demo/WebServices/Client/Client.csproj.DotSettings Demo/WebServices/Client/Client.csproj.ReSharper Demo/WebServices/Client/PersonClient.cs Demo/WebServices/Client/Program.cs Demo/WebServices/Client/Properties/AssemblyInfo.cs Demo/WebServices/Client/WebClient/AsyncCallState.cs Demo/WebServices/Client/WebClient/Compatibility.cs Demo/WebServices/Client/WebClient/GenerateXmlIncludeAttribute.cs Demo/WebServices/Client/WebClient/UpToDateAttribute.cs Demo/WebServices/Client/WebClient/WebClientAttribute.cs Demo/WebServices/Client/WebClient/WebClientBase.cs Demo/WebServices/Client/WebClient/WebClientBaseT.cs Demo/WebServices/Client/WebClient/WebClientTypeBuilder.cs Demo/WebServices/Client/WebClient/WebOperationCancelledEventArgs.cs Demo/WebServices/Client/WebClient/WebOperationExceptionEventArgs.cs Demo/WebServices/Client/app.config Demo/WebServices/NorthwindDataService/DataContext.cs Demo/WebServices/NorthwindDataService/DataContext.generated.cs Demo/WebServices/NorthwindDataService/DataContext.tt Demo/WebServices/NorthwindDataService/DataService.svc Demo/WebServices/NorthwindDataService/DataService.svc.cs Demo/WebServices/NorthwindDataService/EFDataService.svc Demo/WebServices/NorthwindDataService/EFDataService.svc.cs Demo/WebServices/NorthwindDataService/NorthwindDataService.csproj Demo/WebServices/NorthwindDataService/NorthwindModel.Designer.cs Demo/WebServices/NorthwindDataService/NorthwindModel.edmx Demo/WebServices/NorthwindDataService/Properties/AssemblyInfo.cs Demo/WebServices/NorthwindDataService/Web.Debug.config Demo/WebServices/NorthwindDataService/Web.Release.config Demo/WebServices/NorthwindDataService/Web.config Demo/WebServices/ObjectModel/Gender.cs Demo/WebServices/ObjectModel/IDataAccessor.cs Demo/WebServices/ObjectModel/ObjectModel.csproj Demo/WebServices/ObjectModel/Person.cs Demo/WebServices/ObjectModel/Properties/AssemblyInfo.cs Demo/WebServices/ObjectModel/XmlMap.cs Demo/WebServices/Server/PersonService.asmx Demo/WebServices/Server/PersonService.asmx.cs Demo/WebServices/Server/Properties/AssemblyInfo.cs Demo/WebServices/Server/Server.2005.csproj Demo/WebServices/Server/Server.csproj Demo/WebServices/Server/Web.config Demo/WebServices/Server/WebServices/GenerateWebMethodAttribute.cs Demo/WebServices/Server/WebServices/GenerateWebServiceAttribute.cs Demo/WebServices/Server/WebServices/GenerateXmlIncludeAttribute.cs Demo/WinForms/App.config Demo/WinForms/BLToolkit.Demo.2005.csproj Demo/WinForms/BLToolkit.Demo.csproj Demo/WinForms/BusinessLogic/DataAccess/AccessorBase.cs Demo/WinForms/BusinessLogic/DataAccess/PersonAccessor.cs Demo/WinForms/BusinessLogic/ManagerBase.cs Demo/WinForms/BusinessLogic/PersonManager.cs Demo/WinForms/Controls/EnumSelector.Designer.cs Demo/WinForms/Controls/EnumSelector.cs Demo/WinForms/Forms/BizEntityForm.cs Demo/WinForms/Forms/EditPersonForm.Designer.cs Demo/WinForms/Forms/EditPersonForm.cs Demo/WinForms/Forms/EditPersonForm.resx Demo/WinForms/Forms/MainForm.Designer.cs Demo/WinForms/Forms/MainForm.cs Demo/WinForms/Forms/MainForm.resx Demo/WinForms/Forms/ObjectViews/PersonView.cs Demo/WinForms/ObjectModel/BizEntity.cs Demo/WinForms/ObjectModel/Gender.cs Demo/WinForms/ObjectModel/Person.cs Demo/WinForms/Program.cs Demo/WinForms/Properties/AssemblyInfo.cs Demo/WinForms/Properties/DataSources/BLToolkit.Demo.Forms.ObjectViews.PersonView.datasource Demo/WinForms/Properties/DataSources/BLToolkit.Demo.ObjectModel.Gender.datasource Demo/WinForms/Properties/DataSources/BLToolkit.Demo.ObjectModel.Person.datasource Demo/WinForms/Properties/Resources.Designer.cs Demo/WinForms/Properties/Resources.resx Demo/WinForms/Properties/Settings.Designer.cs Demo/WinForms/Properties/Settings.settings Documentation/BLToolkit.ndoc Examples/CS/Examples.CS.csproj Examples/CS/Properties/AssemblyInfo.cs Examples/CS/Reflection.Emit/HelloWorld.cs Examples/CS/Reflection.Emit/HelloWorldNormal.cs Examples/CS/packages.config Examples/Cpp/AssemblyInfo.cpp Examples/Cpp/Examples.Cpp.cpp Examples/Cpp/Examples.Cpp.h Examples/Cpp/Examples.Cpp.vcxproj Examples/Cpp/Examples.Cpp.vcxproj.filters Examples/Cpp/HelloWorld.cpp Examples/Cpp/ReadMe.txt Examples/Cpp/Stdafx.cpp Examples/Cpp/Stdafx.h Examples/Cpp/app.ico Examples/Cpp/app.rc Examples/Cpp/resource.h Examples/Nemerle/Examples.Nemerle.2.nproj Examples/Nemerle/Main.n Examples/Nemerle/app.config Examples/VB/AssemblyInfo.vb Examples/VB/Examples.VB.vbproj Examples/VB/My Project/Application.Designer.vb Examples/VB/My Project/Application.myapp Examples/VB/My Project/AssemblyInfo.vb Examples/VB/My Project/Resources.Designer.vb Examples/VB/My Project/Resources.resx Examples/VB/My Project/Settings.Designer.vb Examples/VB/My Project/Settings.settings Examples/VB/OverloadWithDefValue.vb Examples/VB/Reflection.Emit/HelloWorld.vb Examples/VB/packages.config Extensions/JointureAddOn/BLToolkit.4.JointureAddOn.csproj Extensions/JointureAddOn/DataAccess/FullSqlQuery.cs Extensions/JointureAddOn/DataAccess/FullSqlQueryBase.cs Extensions/JointureAddOn/DataAccess/FullSqlQueryInfo.cs Extensions/JointureAddOn/DataAccess/FullSqlQueryParameterInfo.cs Extensions/JointureAddOn/DataAccess/FullSqlQueryT.cs Extensions/JointureAddOn/Emit/DynamicCompilationSpike.cs Extensions/JointureAddOn/Emit/FunctionFactory.cs Extensions/JointureAddOn/Mapping/CollectionFullObjectMapper.cs Extensions/JointureAddOn/Mapping/DataBindingFactory.cs Extensions/JointureAddOn/Mapping/DataBindingMappingSchema.cs Extensions/JointureAddOn/Mapping/DataBindingObjectMapper.cs Extensions/JointureAddOn/Mapping/FactoryType.cs Extensions/JointureAddOn/Mapping/FullMappingSchema.cs Extensions/JointureAddOn/Mapping/FullObjectMapper.cs Extensions/JointureAddOn/Mapping/ILazyMapper.cs Extensions/JointureAddOn/Mapping/IMapper.cs Extensions/JointureAddOn/Mapping/IObjectMapper.cs Extensions/JointureAddOn/Mapping/IPropertiesMapping.cs Extensions/JointureAddOn/Mapping/LazyValueLoadInterceptor.cs Extensions/JointureAddOn/Mapping/MappingOrder.cs Extensions/JointureAddOn/Mapping/NotifyPropertyChangedInterceptor.cs Extensions/JointureAddOn/Mapping/OwnerDescription.cs Extensions/JointureAddOn/Mapping/TableDescription.cs Extensions/JointureAddOn/Mapping/TypeFactory.cs Extensions/JointureAddOn/Mapping/ValueMapper.cs Extensions/JointureAddOn/Properties/AssemblyInfo.cs Extensions/JointureAddOn/Reflection/FullInitContext.cs Extensions/JointureAddOn/packages.config HowTo/Aspects/AsyncAspect.cs HowTo/Aspects/CacheAspect.cs HowTo/Aspects/ClearCacheAspect.cs HowTo/Aspects/CounterAspect.cs HowTo/Aspects/LoggingAspect.cs HowTo/Aspects/MixinAspect.cs HowTo/Aspects/NoCache.cs HowTo/Aspects/NotNull.cs HowTo/Aspects/OverloadAspect.cs HowTo/Data/AdoDemo.cs HowTo/Data/Close.cs HowTo/Data/ComplexMapping.cs HowTo/Data/DataProvider/AddDataProvider.cs HowTo/Data/DbManagerDemo.cs HowTo/Data/ExecuteDataSet.cs HowTo/Data/ExecuteDataTable.cs HowTo/Data/ExecuteDictionary.cs HowTo/Data/ExecuteForEach.cs HowTo/Data/ExecuteList.cs HowTo/Data/ExecuteNonQuery.cs HowTo/Data/ExecuteObject.cs HowTo/Data/ExecuteReader.cs HowTo/Data/ExecuteScalar.cs HowTo/Data/ExecuteScalarDictionary.cs HowTo/Data/ExecuteScalarList.cs HowTo/Data/OpenConfig1.cs HowTo/Data/OpenConfig1FW2.cs HowTo/Data/OpenConfig2.cs HowTo/Data/OpenConfig3.cs HowTo/Data/Parameter.cs HowTo/Data/Prepare.cs HowTo/Data/RelationExtension.xml HowTo/Data/SetCommand.cs HowTo/Data/SetSpCommand.cs HowTo/Data/Transaction.cs HowTo/Data/UpdateObject.cs HowTo/DataAccess/AbstractAccessor.cs HowTo/DataAccess/ActionName.cs HowTo/DataAccess/ActionSprocName.cs HowTo/DataAccess/ActualType.cs HowTo/DataAccess/CommandBehavior.cs HowTo/DataAccess/CustomSqlQuery1.cs HowTo/DataAccess/CustomSqlQuery2.cs HowTo/DataAccess/DataSetTable.cs HowTo/DataAccess/Delete.cs HowTo/DataAccess/DeleteSql.cs HowTo/DataAccess/Destination.cs HowTo/DataAccess/Direction.cs HowTo/DataAccess/DiscoverParameters.cs HowTo/DataAccess/ExecuteDictionary.cs HowTo/DataAccess/ExecuteList.cs HowTo/DataAccess/ExecuteObject.cs HowTo/DataAccess/ExecuteScalar.cs HowTo/DataAccess/Format.cs HowTo/DataAccess/Gender.cs HowTo/DataAccess/Insert.cs HowTo/DataAccess/InsertSql.cs HowTo/DataAccess/MultiplePrimaryKey.cs HowTo/DataAccess/NonUpdatable.cs HowTo/DataAccess/OpenConfig.cs HowTo/DataAccess/OpenConfigQuery.cs HowTo/DataAccess/Param.cs HowTo/DataAccess/ParamName.cs HowTo/DataAccess/ParamNullValue.cs HowTo/DataAccess/Person.cs HowTo/DataAccess/PersonAccessor.cs HowTo/DataAccess/PrimaryKey.cs HowTo/DataAccess/ScalarFieldName.cs HowTo/DataAccess/ScalarSource.cs HowTo/DataAccess/SelectAll.cs HowTo/DataAccess/SelectAllSql.cs HowTo/DataAccess/SelectByKey.cs HowTo/DataAccess/SelectByKeySql.cs HowTo/DataAccess/SprocName.cs HowTo/DataAccess/Sql/Access.xml HowTo/DataAccess/Sql/Fdp.xml HowTo/DataAccess/Sql/Oracle.xml HowTo/DataAccess/Sql/SQLite.xml HowTo/DataAccess/Sql/Sql.xml HowTo/DataAccess/SqlQuery.cs HowTo/DataAccess/TableName.cs HowTo/DataAccess/Transaction.cs HowTo/DataAccess/Update.cs HowTo/DataAccess/UpdateSql.cs HowTo/DataAccess/XmlExtension.cs HowTo/DataAccess/XmlExtension.xml HowTo/EditableObjects/AcceptRejectChanges.cs HowTo/EditableObjects/EditableObjectTest.cs HowTo/EditableObjects/IsDirty.cs HowTo/EditableObjects/PropertyChanged.cs HowTo/HowTo.csproj HowTo/Mapping/EnumToValue.cs HowTo/Mapping/FluentMapping.cs HowTo/Mapping/MapFieldAttribute.cs HowTo/Mapping/MapToJson.cs HowTo/Mapping/MapValueAttribute1.cs HowTo/Mapping/MapValueAttribute2.cs HowTo/Mapping/ObjectToObject.cs HowTo/Mapping/ValueToEnum.cs HowTo/Patterns/DuckTyping.cs HowTo/Properties/AssemblyInfo.cs HowTo/Reflection/ObjectFactory.cs HowTo/TypeBuilder/InitialValues.cs HowTo/TypeBuilder/InternalTypes.cs HowTo/TypeBuilder/XmlSerialization.cs HowTo/app.config HowTo/packages.config Mono/Mono.sln Mono/Mono.sln.docstates Mono/Test/App.config Mono/Test/Program.cs Mono/Test/Properties/AssemblyInfo.cs Mono/Test/Test.csproj NuGet/BLToolkit.DB2.nuspec NuGet/BLToolkit.DevartOraclePro.nuspec NuGet/BLToolkit.Firebird.nuspec NuGet/BLToolkit.Informix.nuspec NuGet/BLToolkit.MySql.nuspec NuGet/BLToolkit.Oracle.nuspec NuGet/BLToolkit.PostgreSql.nuspec NuGet/BLToolkit.SQLite.nuspec NuGet/BLToolkit.SqlCe.nuspec NuGet/BLToolkit.Sybase.nuspec NuGet/BLToolkit.nuspec NuGet/BLToolkit.symbols.nuspec NuGet/Pack.bat NuGet/Push.bat Redist/Castle/Castle.Core.dll Redist/Castle/Castle.Core.xml Redist/Castle/Castle.Windsor.XML Redist/Castle/Castle.Windsor.dll Redist/IBM/IBM.Data.DB2.dll Redist/IBM/IBM.Data.Informix.dll Redist/Sybase/Sybase.AdoNet2.AseClient.dll Redist/Sybase/sybdrvado20.dll Snapshot.cmd Snapshot.ps1 Source/Aspects/AsyncAttribute.cs Source/Aspects/Builders/AsyncAspectBuilder.cs Source/Aspects/Builders/ClearCacheAspectBuilder.cs Source/Aspects/Builders/InterceptorAspectBuilder.cs Source/Aspects/Builders/MixinAspectBuilder.cs Source/Aspects/Builders/NotNullAspectBuilder.cs Source/Aspects/Builders/OverloadAspectBuilder.cs Source/Aspects/CacheAspect.cs Source/Aspects/CacheAspectItem.cs Source/Aspects/CacheAspectT.cs Source/Aspects/CacheAttribute.cs Source/Aspects/CallMethodInfo.cs Source/Aspects/ClearCacheAspect.cs Source/Aspects/ClearCacheAttribute.cs Source/Aspects/CounterAspect.cs Source/Aspects/CounterAttribute.cs Source/Aspects/IInterceptor.cs Source/Aspects/InstanceCacheAttribute.cs Source/Aspects/InterceptCallInfo.cs Source/Aspects/InterceptResult.cs Source/Aspects/InterceptType.cs Source/Aspects/Interceptor.cs Source/Aspects/InterceptorAttribute.cs Source/Aspects/LogAttribute.cs Source/Aspects/LoggingAspect.cs Source/Aspects/MethodCallCounter.cs Source/Aspects/MixinAttribute.cs Source/Aspects/MixinOverrideAttribute.cs Source/Aspects/NoCacheAttribute.cs Source/Aspects/NoCounterAttribute.cs Source/Aspects/NoInterceptionAttribute.cs Source/Aspects/NoLogAttribute.cs Source/Aspects/NotNullAttribute.cs Source/Aspects/OverloadAttribute.cs Source/BLToolkit.3.csproj Source/BLToolkit.4.csproj Source/BLToolkit.4.csproj.DotSettings Source/BLToolkit.4.csproj.ReSharper Source/BLToolkit.CP.4.csproj Source/BLToolkit.Data.4.csproj Source/BLToolkit.SL.4.csproj Source/BLToolkit.mono.csproj Source/BLToolkit.snk Source/Common/ArrayT.cs Source/Common/Compatibility3.cs Source/Common/Compatibility4.cs Source/Common/CompatibilitySL.cs Source/Common/CompoundValue.cs Source/Common/Configuration.cs Source/Common/Convert.cs Source/Common/Convert.generated.cs Source/Common/Convert.tt Source/Common/ConvertT.cs Source/Common/EntityBase.cs Source/Common/EntityBaseT.cs Source/Common/IOperable.cs Source/Common/NameOrIndexParameter.cs Source/Common/Operator.cs Source/Common/Tuple.cs Source/Compile3.bat Source/Compile4.bat Source/ComponentModel/BindingListImpl.cs Source/ComponentModel/CustomTypeDescriptorImpl.cs Source/ComponentModel/Design/Assembly.bmp Source/ComponentModel/Design/GetTypeDialog.Designer.cs Source/ComponentModel/Design/GetTypeDialog.cs Source/ComponentModel/Design/GetTypeDialog.resx Source/ComponentModel/Design/Namespace.bmp Source/ComponentModel/Design/None.bmp Source/ComponentModel/Design/Object.bmp Source/ComponentModel/Design/ObjectViewTypeEditor.cs Source/ComponentModel/Design/ObjectViewTypeNameEditor.cs Source/ComponentModel/Design/TypeEditor.cs Source/ComponentModel/Design/TypeNameEditor.cs Source/ComponentModel/Design/TypePicker.Designer.cs Source/ComponentModel/Design/TypePicker.cs Source/ComponentModel/Design/TypePicker.resx Source/ComponentModel/INotifyObjectEdit.cs Source/ComponentModel/IObjectView.cs Source/ComponentModel/ISortable.cs Source/ComponentModel/ITypeDescriptionProvider.cs Source/ComponentModel/MemberPropertyDescriptor.cs Source/ComponentModel/ObjectBinder.bmp Source/ComponentModel/ObjectBinder.cs Source/ComponentModel/ObjectBinder.ico Source/ComponentModel/ObjectBinder.resx Source/ComponentModel/ObjectEditEventArgs.cs Source/ComponentModel/ObjectEditType.cs Source/ComponentModel/ObjectHolder.cs Source/ComponentModel/PropertyDescriptorWrapper.cs Source/ComponentModel/TypeDescriptorExtender.cs Source/ComponentModel/TypeDescriptorExtenderT.cs Source/ComponentModel/TypeTypeConverter.cs Source/ComponentModel/TypedListImpl.cs Source/Configuration/BLToolkitSection.cs Source/Configuration/DataProviderElement.cs Source/Configuration/DataProviderElementCollection.cs Source/Configuration/ElementBase.cs Source/Configuration/ElementCollectionBase.cs Source/Configuration/TypeFactoryElement.cs Source/Data/DataException.cs Source/Data/DataExceptionType.cs Source/Data/DataProvider/AccessDataProvider.cs Source/Data/DataProvider/ConvertType.cs Source/Data/DataProvider/DB2DataProvider.cs Source/Data/DataProvider/DataProviderBase.cs Source/Data/DataProvider/DataProviderInterpreterBase.cs Source/Data/DataProvider/FdpDataProvider.cs Source/Data/DataProvider/FirebirdMappingSchema.cs Source/Data/DataProvider/GenericDataProvider.cs Source/Data/DataProvider/InformixDataProvider.cs Source/Data/DataProvider/Interpreters/OracleDataProviderInterpreter.cs Source/Data/DataProvider/Interpreters/SqliteDataProviderInterpreter.cs Source/Data/DataProvider/MonoSqliteDataProvider.cs Source/Data/DataProvider/MySqlDataProvider.cs Source/Data/DataProvider/OdbcDataProvider.cs Source/Data/DataProvider/OdpDataProvider.cs Source/Data/DataProvider/OleDbDataProvider.cs Source/Data/DataProvider/OracleDataProvider.cs Source/Data/DataProvider/OracleHelper.cs Source/Data/DataProvider/PostgreSQLDataProvider.cs Source/Data/DataProvider/ProviderName.cs Source/Data/DataProvider/SQLiteDataProvider.cs Source/Data/DataProvider/Sql2000DataProvider.cs Source/Data/DataProvider/Sql2005DataProvider.cs Source/Data/DataProvider/Sql2008DataProvider.cs Source/Data/DataProvider/Sql2012DataProvider.cs Source/Data/DataProvider/SqlCeDataProvider.cs Source/Data/DataProvider/SqlDataProvider.cs Source/Data/DataProvider/SqlDataProviderBase.cs Source/Data/DataProvider/SybaseAdoDataProvider.cs Source/Data/DataProvider/SybaseDataProvider.cs Source/Data/DbConnectionFactory.cs Source/Data/DbManager.Config.cs Source/Data/DbManager.Linq.cs Source/Data/DbManager.cs Source/Data/IDataReaderEx.cs Source/Data/IDbConnectionFactory.cs Source/Data/InitCommandEventArgs.cs Source/Data/Linq/Builder/AggregationBuilder.cs Source/Data/Linq/Builder/AllAnyBuilder.cs Source/Data/Linq/Builder/AsUpdatableBuilder.cs Source/Data/Linq/Builder/BuildInfo.cs Source/Data/Linq/Builder/CastBuilder.cs Source/Data/Linq/Builder/ChangeTypeExpression.cs Source/Data/Linq/Builder/ConcatUnionBuilder.cs Source/Data/Linq/Builder/ContainsBuilder.cs Source/Data/Linq/Builder/ConvertFlags.cs Source/Data/Linq/Builder/CountBuilder.cs Source/Data/Linq/Builder/DefaultIfEmptyBuilder.cs Source/Data/Linq/Builder/DeleteBuilder.cs Source/Data/Linq/Builder/DistinctBuilder.cs Source/Data/Linq/Builder/ExpressionBuilder.QueryBuilder.cs Source/Data/Linq/Builder/ExpressionBuilder.SqlBuilder.cs Source/Data/Linq/Builder/ExpressionBuilder.cs Source/Data/Linq/Builder/ExpressionContext.cs Source/Data/Linq/Builder/ExpressionHoder.cs Source/Data/Linq/Builder/ExpressionTestGenerator.cs Source/Data/Linq/Builder/FirstSingleBuilder.cs Source/Data/Linq/Builder/GroupByBuilder.cs Source/Data/Linq/Builder/IBuildContext.cs Source/Data/Linq/Builder/ISequenceBuilder.cs Source/Data/Linq/Builder/InsertBuilder.cs Source/Data/Linq/Builder/InsertOrUpdateBuilder.cs Source/Data/Linq/Builder/IntersectBuilder.cs Source/Data/Linq/Builder/IsExpressionResult.cs Source/Data/Linq/Builder/JoinBuilder.cs Source/Data/Linq/Builder/MethodCallBuilder.cs Source/Data/Linq/Builder/OfTypeBuilder.cs Source/Data/Linq/Builder/OrderByBuilder.cs Source/Data/Linq/Builder/PassThroughBuilder.cs Source/Data/Linq/Builder/PassThroughContext.cs Source/Data/Linq/Builder/RequestFor.cs Source/Data/Linq/Builder/ScalarSelectBuilder.cs Source/Data/Linq/Builder/SelectBuilder.cs Source/Data/Linq/Builder/SelectContext.cs Source/Data/Linq/Builder/SelectManyBuilder.cs Source/Data/Linq/Builder/SequenceContextBase.cs Source/Data/Linq/Builder/SequenceConvertInfo.cs Source/Data/Linq/Builder/SequenceConvertPath.cs Source/Data/Linq/Builder/SqlInfo.cs Source/Data/Linq/Builder/SubQueryContext.cs Source/Data/Linq/Builder/TableAttributeBuilder.cs Source/Data/Linq/Builder/TableBuilder.cs Source/Data/Linq/Builder/TakeSkipBuilder.cs Source/Data/Linq/Builder/UpdateBuilder.cs Source/Data/Linq/Builder/WhereBuilder.cs Source/Data/Linq/CompiledQuery.cs Source/Data/Linq/CompiledTableT.cs Source/Data/Linq/DataContext.cs Source/Data/Linq/DataContextInfo.cs Source/Data/Linq/DataContextTransaction.cs Source/Data/Linq/DefaultDataContextInfo.cs Source/Data/Linq/ExpressionQuery.cs Source/Data/Linq/ExpressionQueryImpl.cs Source/Data/Linq/Expressions.cs Source/Data/Linq/Extensions.cs Source/Data/Linq/IDataContext.cs Source/Data/Linq/IDataContextInfo.cs Source/Data/Linq/IExpressionQuery.cs Source/Data/Linq/IQueryContext.cs Source/Data/Linq/ISelectInsertable.cs Source/Data/Linq/ITable.cs Source/Data/Linq/IUpdatable.cs Source/Data/Linq/IValueInsertable.cs Source/Data/Linq/IgnoreIEnumerableAttribute.cs Source/Data/Linq/LinqException.cs Source/Data/Linq/LinqExtensions.cs Source/Data/Linq/MemberInfoComparer.cs Source/Data/Linq/MethodExpressionAttribute.cs Source/Data/Linq/Query.cs Source/Data/Linq/QueryContext.cs Source/Data/Linq/QueryableAccessor.cs Source/Data/Linq/ReflectionHelper.cs Source/Data/Linq/Settings.cs Source/Data/Linq/Sql.cs Source/Data/Linq/SqlEnumAttribute.cs Source/Data/Linq/SqlExpressionAttribute.cs Source/Data/Linq/SqlFunctionAttribute.cs Source/Data/Linq/SqlPropertyAttribute.cs Source/Data/Linq/TableExpressionAttribute.cs Source/Data/Linq/TableFunctionAttribute.cs Source/Data/Linq/TableT.cs Source/Data/OperationExceptionEventArgs.cs Source/Data/OperationType.cs Source/Data/OperationTypeEventArgs.cs Source/Data/ScalarSourceType.cs Source/Data/Sql/ChildContainer.cs Source/Data/Sql/Extensions.cs Source/Data/Sql/IChild.cs Source/Data/Sql/ICloneableElement.cs Source/Data/Sql/IQueryElement.cs Source/Data/Sql/ISqlExpression.cs Source/Data/Sql/ISqlExpressionWalkable.cs Source/Data/Sql/ISqlPredicate.cs Source/Data/Sql/ISqlTableSource.cs Source/Data/Sql/IValueContainer.cs Source/Data/Sql/Join.cs Source/Data/Sql/JoinOn.cs Source/Data/Sql/Precedence.cs Source/Data/Sql/QueryElementType.cs Source/Data/Sql/QueryType.cs Source/Data/Sql/QueryVisitor.cs Source/Data/Sql/ReservedWords.txt Source/Data/Sql/SqlBinaryExpression.cs Source/Data/Sql/SqlDataType.cs Source/Data/Sql/SqlException.cs Source/Data/Sql/SqlExpression.cs Source/Data/Sql/SqlField.cs Source/Data/Sql/SqlFunction.cs Source/Data/Sql/SqlParameter.cs Source/Data/Sql/SqlProvider/AccessSqlProvider.cs Source/Data/Sql/SqlProvider/BasicSqlProvider.cs Source/Data/Sql/SqlProvider/DB2SqlProvider.cs Source/Data/Sql/SqlProvider/FirebirdSqlProvider.cs Source/Data/Sql/SqlProvider/ISqlProvider.cs Source/Data/Sql/SqlProvider/InformixSqlProvider.cs Source/Data/Sql/SqlProvider/MSSqlSqlProvider.cs Source/Data/Sql/SqlProvider/MsSql2000SqlProvider.cs Source/Data/Sql/SqlProvider/MsSql2005SqlProvider.cs Source/Data/Sql/SqlProvider/MsSql2008SqlProvider.cs Source/Data/Sql/SqlProvider/MsSql2012SqlProvider.cs Source/Data/Sql/SqlProvider/MySqlSqlProvider.cs Source/Data/Sql/SqlProvider/OracleSqlProvider.cs Source/Data/Sql/SqlProvider/PostgreSQLSqlProvider.cs Source/Data/Sql/SqlProvider/SQLiteSqlProvider.cs Source/Data/Sql/SqlProvider/SequenceNameAttribute.cs Source/Data/Sql/SqlProvider/SqlCeSqlProvider.cs Source/Data/Sql/SqlProvider/SybaseSqlProvider.cs Source/Data/Sql/SqlQuery.cs Source/Data/Sql/SqlTable.cs Source/Data/Sql/SqlTableT.cs Source/Data/Sql/SqlTableType.cs Source/Data/Sql/SqlValue.cs Source/Data/Sql/SqlValueBase.cs Source/DataAccess/ActionNameAttribute.cs Source/DataAccess/ActionSprocNameAttribute.cs Source/DataAccess/ActualTypeAttribute.cs Source/DataAccess/CommandBehaviorAttribute.cs Source/DataAccess/DataAccess.xsd Source/DataAccess/DataAccess.xsx Source/DataAccess/DataAccessException.cs Source/DataAccess/DataAccessor.cs Source/DataAccess/DataAccessorAttribute.cs Source/DataAccess/DataAccessorBase.cs Source/DataAccess/DataAccessorBuilder.cs Source/DataAccess/DataAccessorT.cs Source/DataAccess/DataAccessorTA.cs Source/DataAccess/DataSetTableAttribute.cs Source/DataAccess/DbTypeAttribute.cs Source/DataAccess/DestinationAttribute.cs Source/DataAccess/Direction.cs Source/DataAccess/DiscoverParametersAttribute.cs Source/DataAccess/FormatAttribute.cs Source/DataAccess/ISqlQueryT.cs Source/DataAccess/IdentityAttribute.cs Source/DataAccess/IndexAttribute.cs Source/DataAccess/NoMapAttribute.cs Source/DataAccess/NonUpdatableAttribute.cs Source/DataAccess/ObjectTypeAttribute.cs Source/DataAccess/ParamDbTypeAttribute.cs Source/DataAccess/ParamNameAttribute.cs Source/DataAccess/ParamNullValue.cs Source/DataAccess/ParamSizeAttribute.cs Source/DataAccess/ParamTypeNameAttribute.cs Source/DataAccess/PrimaryKeyAttribute.cs Source/DataAccess/PrimaryKeyGeneratorType.cs Source/DataAccess/ScalarAttribute.cs Source/DataAccess/ScalarFieldNameAttribute.cs Source/DataAccess/ScalarSourceAttribute.cs Source/DataAccess/SequenceKeyGenerator.cs Source/DataAccess/SprocNameAttribute.cs Source/DataAccess/SprocQuery.cs Source/DataAccess/SprocQueryT.cs Source/DataAccess/SqlIgnoreAttribute.cs Source/DataAccess/SqlQuery.cs Source/DataAccess/SqlQueryAttribute.cs Source/DataAccess/SqlQueryBase.cs Source/DataAccess/SqlQueryInfo.cs Source/DataAccess/SqlQueryParameterInfo.cs Source/DataAccess/SqlQueryT.cs Source/DataAccess/TableNameAttribute.cs Source/Doc/BLToolkit.chm Source/Doc/ChangeLog.txt Source/Doc/Development rules and regulations.doc Source/Doc/License.txt Source/Doc/OnlineDoc.txt Source/EditableObjects/EditableArrayList.cs Source/EditableObjects/EditableList.cs Source/EditableObjects/EditableListChangedEventArgs.cs Source/EditableObjects/EditableObject.cs Source/EditableObjects/EditableObjectHolder.cs Source/EditableObjects/EditableObjectT.cs Source/EditableObjects/EditableValue.cs Source/EditableObjects/EditableXmlDocument.cs Source/EditableObjects/IEditable.cs Source/EditableObjects/IMemberwiseEditable.cs Source/EditableObjects/IPrintDebugState.cs Source/Linq/ExpressionHelper.cs Source/Linq/Extensions.cs Source/Mapping/Association.cs Source/Mapping/AssociationAttribute.cs Source/Mapping/DataReaderListMapper.cs Source/Mapping/DataReaderMapper.cs Source/Mapping/DataRowMapper.cs Source/Mapping/DataTableMapper.cs Source/Mapping/DefaultMappingSchema.cs Source/Mapping/DefaultMemberMapper.cs Source/Mapping/DefaultValueAttribute.cs Source/Mapping/DictionaryIndexListMapper.cs Source/Mapping/DictionaryIndexListMapperT.cs Source/Mapping/DictionaryListMapper.cs Source/Mapping/DictionaryListMapperT.cs Source/Mapping/DictionaryMapper.cs Source/Mapping/EnumeratorMapper.cs Source/Mapping/ExpressionMapIgnoreAttribute.cs Source/Mapping/ExpressionMapper.cs Source/Mapping/Fluent/AssociationMap.cs Source/Mapping/Fluent/Attributes.cs Source/Mapping/Fluent/FluentConfig.cs Source/Mapping/Fluent/FluentMap.Interface.cs Source/Mapping/Fluent/FluentMap.cs Source/Mapping/Fluent/FluentMapHelper.cs Source/Mapping/Fluent/IFluentMap.cs Source/Mapping/Fluent/MapFieldMap.cs Source/Mapping/Fluent/MappedProperty.cs Source/Mapping/IMapDataDestination.cs Source/Mapping/IMapDataDestinationList.cs Source/Mapping/IMapDataSource.cs Source/Mapping/IMapDataSourceList.cs Source/Mapping/IMappingSchemaProvider.cs Source/Mapping/ISupportMapping.cs Source/Mapping/IValueMapper.cs Source/Mapping/InheritanceMappingAttribute.cs Source/Mapping/Map.cs Source/Mapping/MapDataDestinationBase.cs Source/Mapping/MapDataSourceBase.cs Source/Mapping/MapDataSourceDestinationBase.cs Source/Mapping/MapFieldAttribute.cs Source/Mapping/MapGetDataT.cs Source/Mapping/MapIgnoreAttribute.cs Source/Mapping/MapImplicitAttribute.cs Source/Mapping/MapIndex.cs Source/Mapping/MapMemberInfo.cs Source/Mapping/MapNextResult.cs Source/Mapping/MapRelation.cs Source/Mapping/MapRelationBase.cs Source/Mapping/MapResultSet.cs Source/Mapping/MapSetDataT.cs Source/Mapping/MapValue.cs Source/Mapping/MapValueAttribute.cs Source/Mapping/Mapping.xsd Source/Mapping/Mapping.xsx Source/Mapping/MappingException.cs Source/Mapping/MappingSchema.cs Source/Mapping/MemberMapper.cs Source/Mapping/MemberMapper.generated.cs Source/Mapping/MemberMapper.tt Source/Mapping/MemberMapperAttribute.cs Source/Mapping/MemberMappers/BinarySerialisationMapper.cs Source/Mapping/MemberMappers/BinarySerialisationToBase64StringMapper.cs Source/Mapping/MemberMappers/JSONSerialisationMapper.cs Source/Mapping/MemberMappers/TimeSpanBigIntMapper.cs Source/Mapping/MemberMappers/XMLSerialisationMapper.cs Source/Mapping/NotNullAttribute.cs Source/Mapping/NullDateTimeAttribute.cs Source/Mapping/NullDecimalAttribute.cs Source/Mapping/NullGuidAttribute.cs Source/Mapping/NullValueAttribute.cs Source/Mapping/NullableAttribute.cs Source/Mapping/ObjectListMapper.cs Source/Mapping/ObjectMapper.cs Source/Mapping/ObjectMapperAttribute.cs Source/Mapping/ObjectMapperT.cs Source/Mapping/RelationAttribute.cs Source/Mapping/ScalarDataReaderMapper.cs Source/Mapping/ScalarListMapper.cs Source/Mapping/ScalarListMapperT.cs Source/Mapping/SimpleDestinationListMapper.cs Source/Mapping/SimpleSourceListMapper.cs Source/Mapping/TextDataListMapper.cs Source/Mapping/TextDataMapper.cs Source/Mapping/TextDataReader.cs Source/Mapping/TextDataWriter.cs Source/Mapping/TrimmableAttribute.cs Source/Mapping/ValueMapping.cs Source/Net/HttpReader.cs Source/Patterns/DuckType.cs Source/Patterns/DuckTyping.cs Source/Patterns/MustImplementAttribute.cs Source/Properties/AssemblyInfo.cs Source/Properties/BLToolkitConstants.cs Source/Properties/JetBrains.Annotations.cs Source/Properties/Resources.Designer.cs Source/Properties/Resources.resx Source/Properties/Revision.generated.cs Source/Properties/Revision.tt Source/Reflection/Emit/AssemblyBuilderHelper.cs Source/Reflection/Emit/ConstructorBuilderHelper.cs Source/Reflection/Emit/EmitHelper.cs Source/Reflection/Emit/Examples.CS.xml Source/Reflection/Emit/Examples.VB.xml Source/Reflection/Emit/MethodBuilderBase.cs Source/Reflection/Emit/MethodBuilderHelper.cs Source/Reflection/Emit/TypeBuilderHelper.cs Source/Reflection/ExprMemberAccessor.cs Source/Reflection/ExprTypeAccessor.cs Source/Reflection/Extension/AttributeExtension.cs Source/Reflection/Extension/AttributeExtensionCollection.cs Source/Reflection/Extension/AttributeNameCollection.cs Source/Reflection/Extension/ExtensionList.cs Source/Reflection/Extension/MemberExtension.cs Source/Reflection/Extension/MemberExtensionCollection.cs Source/Reflection/Extension/TypeExtension.cs Source/Reflection/Extension/TypeExtension.xsd Source/Reflection/Extension/TypeExtension.xsx Source/Reflection/Extension/TypeExtensionAttribute.cs Source/Reflection/Extension/TypeExtensionException.cs Source/Reflection/Extension/ValueCollection.cs Source/Reflection/GenericBinder.cs Source/Reflection/IObjectFactory.cs Source/Reflection/InitContext.cs Source/Reflection/MemberAccessor.cs Source/Reflection/MetadataProvider/AttributeMetadataProvider.cs Source/Reflection/MetadataProvider/ExtensionMetadataProvider.cs Source/Reflection/MetadataProvider/LinqMetadataProvider.cs Source/Reflection/MetadataProvider/MetadataProviderBase.cs Source/Reflection/MetadataProvider/MetadataProviderList.cs Source/Reflection/ObjectFactoryAttribute.cs Source/Reflection/TypeAccessor.cs Source/Reflection/TypeAccessorT.cs Source/Reflection/TypeHelper.cs Source/Reflection/XmlIncludeAbstractAttribute.cs Source/ServiceModel/Async/ILinqService.cs Source/ServiceModel/Async/ILinqSoapService.cs Source/ServiceModel/DataService.cs Source/ServiceModel/ILinqService.cs Source/ServiceModel/ILinqSoapService.cs Source/ServiceModel/LinqService.cs Source/ServiceModel/LinqServiceClient.Silverlight.cs Source/ServiceModel/LinqServiceClient.cs Source/ServiceModel/LinqServiceQuery.cs Source/ServiceModel/LinqServiceResult.cs Source/ServiceModel/LinqServiceSerializer.cs Source/ServiceModel/LinqSoapServiceClient.Silverlight.cs Source/ServiceModel/LinqSoapServiceClient.cs Source/ServiceModel/RemoteDataContextBase.cs Source/ServiceModel/ServiceModelDataContext.cs Source/ServiceModel/ServiceModelDataReader.cs Source/ServiceModel/SoapDataContext.cs Source/Templates/BLT4Toolkit.ttinclude Source/Templates/BLToolkit.ttinclude Source/Templates/BLToolkitConstants.Revision.cs.template Source/Templates/MSSQL.ttinclude Source/Templates/MySql.ttinclude Source/Templates/PluralSingular.ttinclude Source/Templates/PostgreSQL.ttinclude Source/Templates/Renamer.ttinclude Source/Templates/Sybase.ttinclude Source/Templates/VB.ttinclude Source/Templates/ValidationAttributes.ttinclude Source/Templates/WCFAttributes.ttinclude Source/TypeBuilder/AutoImplementInterfaceAttribute.cs Source/TypeBuilder/BLToolkitGeneratedAttribute.cs Source/TypeBuilder/Builders/AbstractClassBuilder.cs Source/TypeBuilder/Builders/AbstractTypeBuilderBase.cs Source/TypeBuilder/Builders/AbstractTypeBuilderList.cs Source/TypeBuilder/Builders/BuildContext.cs Source/TypeBuilder/Builders/BuildElement.cs Source/TypeBuilder/Builders/BuildStep.cs Source/TypeBuilder/Builders/DefaultTypeBuilder.cs Source/TypeBuilder/Builders/DuckTypeBuilder.cs Source/TypeBuilder/Builders/FakeGetter.cs Source/TypeBuilder/Builders/FakeMethodInfo.cs Source/TypeBuilder/Builders/FakeParameterInfo.cs Source/TypeBuilder/Builders/FakeSetter.cs Source/TypeBuilder/Builders/GeneratedAttributeBuilder.cs Source/TypeBuilder/Builders/IAbstractTypeBuilder.cs Source/TypeBuilder/Builders/ITypeBuilder.cs Source/TypeBuilder/Builders/ImplementInterfaceBuilder.cs Source/TypeBuilder/Builders/InstanceTypeBuilder.cs Source/TypeBuilder/Builders/PropertyChangedBuilder.cs Source/TypeBuilder/Builders/TypeAccessorBuilder.cs Source/TypeBuilder/Builders/TypeBuilderAttribute.cs Source/TypeBuilder/Builders/TypeBuilderConsts.cs Source/TypeBuilder/DefaultInstanceTypeAttribute.cs Source/TypeBuilder/GenerateAttributeAttribute.cs Source/TypeBuilder/GetValueAttribute.cs Source/TypeBuilder/GlobalInstanceTypeAttribute.cs Source/TypeBuilder/IPropertyChanged.cs Source/TypeBuilder/ISetParent.cs Source/TypeBuilder/ImplementInterfaceAttribute.cs Source/TypeBuilder/InstanceTypeAttribute.cs Source/TypeBuilder/LazyInstanceAttribute.cs Source/TypeBuilder/LazyInstancesAttribute.cs Source/TypeBuilder/NoInstanceAttribute.cs Source/TypeBuilder/ParameterAttribute.cs Source/TypeBuilder/ParentAttribute.cs Source/TypeBuilder/PropertyChangedAttribute.cs Source/TypeBuilder/PropertyInfoAttribute.cs Source/TypeBuilder/RefCursorAttribute.cs Source/TypeBuilder/ReturnIfFalseAttribute.cs Source/TypeBuilder/ReturnIfNonZeroAttribute.cs Source/TypeBuilder/ReturnIfNotNullAttribute.cs Source/TypeBuilder/ReturnIfNullAttribute.cs Source/TypeBuilder/ReturnIfTrueAttribute.cs Source/TypeBuilder/ReturnIfZeroAttribute.cs Source/TypeBuilder/SetValueAttribute.cs Source/TypeBuilder/TypeBuilderException.cs Source/TypeBuilder/TypeFactory.cs Source/Validation/FriendlyNameAttribute.cs Source/Validation/IValidatable.cs Source/Validation/MaxDateValueAttribute.cs Source/Validation/MaxLengthAttribute.cs Source/Validation/MaxValueAttribute.cs Source/Validation/MinDateValueAttribute.cs Source/Validation/MinLengthAttribute.cs Source/Validation/MinValueAttribute.cs Source/Validation/RegExAttribute.cs Source/Validation/RequiredAttribute.cs Source/Validation/ValidatableObjectBase.cs Source/Validation/ValidationContext.cs Source/Validation/ValidationException.cs Source/Validation/Validator.cs Source/Validation/ValidatorBaseAttribute.cs Source/Web/UI/Design/WebObjectBinderDesigner.cs Source/Web/UI/WebObjectBinder.cs Source/Web/UI/WebObjectBinder.ico Tools/BLTgen/BLTgen.2005.csproj Tools/BLTgen/BLTgen.2008.csproj Tools/BLTgen/BLTgen.2010.csproj Tools/BLTgen/Program.cs Tools/BLTgen/Properties/AssemblyInfo.cs Tools/BLTgen/StringListMapper.cs Tools/BLTgen/app.config Tools/CodeGenerator/CodeGenerator.2.csproj Tools/CodeGenerator/CodeGenerator.2008.csproj Tools/CodeGenerator/Convert.Declare.cs Tools/CodeGenerator/Convert.xml Tools/CodeGenerator/Convert.xslt Tools/CodeGenerator/TransformCodeGenerator.dll Tools/CodeGenerator/ValueMapping.Declare.cs Tools/CodeGenerator/ValueMapping.xml Tools/CodeGenerator/ValueMapping.xslt Tools/CodeGenerator/install.bat Tools/DocGen/ChmGen.csproj Tools/DocGen/Content/ChmTemplate.html Tools/DocGen/Content/Doc/Aspects/AsyncAspect.cs Tools/DocGen/Content/Doc/Aspects/AsyncAspect.htm Tools/DocGen/Content/Doc/Aspects/CacheAspect.cs Tools/DocGen/Content/Doc/Aspects/CacheAspect.htm Tools/DocGen/Content/Doc/Aspects/ClearCacheAspect.cs Tools/DocGen/Content/Doc/Aspects/ClearCacheAspect.htm Tools/DocGen/Content/Doc/Aspects/CounterAspect.cs Tools/DocGen/Content/Doc/Aspects/CounterAspect.htm Tools/DocGen/Content/Doc/Aspects/Counters.png Tools/DocGen/Content/Doc/Aspects/LoggingAspect.htm Tools/DocGen/Content/Doc/Aspects/MixinAspect.cs Tools/DocGen/Content/Doc/Aspects/MixinAspect.htm Tools/DocGen/Content/Doc/Aspects/NoCacheAttribute.htm Tools/DocGen/Content/Doc/Aspects/NotNull.cs Tools/DocGen/Content/Doc/Aspects/NotNullAttribute.htm Tools/DocGen/Content/Doc/Aspects/OverloadAspect.cs Tools/DocGen/Content/Doc/Aspects/OverloadAspect.htm Tools/DocGen/Content/Doc/Aspects/index.htm Tools/DocGen/Content/Doc/ComponentModel/ObjectBinder.htm Tools/DocGen/Content/Doc/ComponentModel/index.htm Tools/DocGen/Content/Doc/Data/App.config Tools/DocGen/Content/Doc/Data/App1.config Tools/DocGen/Content/Doc/Data/App2.config Tools/DocGen/Content/Doc/Data/Close.htm Tools/DocGen/Content/Doc/Data/CreateSql.htm Tools/DocGen/Content/Doc/Data/DataProvider/App.config Tools/DocGen/Content/Doc/Data/DataProvider/index.htm Tools/DocGen/Content/Doc/Data/DbManagerVsAdo.htm Tools/DocGen/Content/Doc/Data/ExecuteDataSet.htm Tools/DocGen/Content/Doc/Data/ExecuteDataTable.htm Tools/DocGen/Content/Doc/Data/ExecuteDictionary.htm Tools/DocGen/Content/Doc/Data/ExecuteForEach.htm Tools/DocGen/Content/Doc/Data/ExecuteList.htm Tools/DocGen/Content/Doc/Data/ExecuteNonQuery.htm Tools/DocGen/Content/Doc/Data/ExecuteObject.htm Tools/DocGen/Content/Doc/Data/ExecuteReader.htm Tools/DocGen/Content/Doc/Data/ExecuteResultSet.htm Tools/DocGen/Content/Doc/Data/ExecuteScalar.htm Tools/DocGen/Content/Doc/Data/ExecuteScalarDictionary.htm Tools/DocGen/Content/Doc/Data/ExecuteScalarList.htm Tools/DocGen/Content/Doc/Data/Linq.htm Tools/DocGen/Content/Doc/Data/LinqDateTimeCoreFunctions.txt Tools/DocGen/Content/Doc/Data/LinqDateTimeFunctions.txt Tools/DocGen/Content/Doc/Data/LinqOperators.txt Tools/DocGen/Content/Doc/Data/LinqSqlTransformations.txt Tools/DocGen/Content/Doc/Data/LinqStringCoreFunctions.txt Tools/DocGen/Content/Doc/Data/LinqStringFunctions.txt Tools/DocGen/Content/Doc/Data/OpenConfig1.htm Tools/DocGen/Content/Doc/Data/OpenConfig2.htm Tools/DocGen/Content/Doc/Data/OpenConfig3.htm Tools/DocGen/Content/Doc/Data/Parameter.htm Tools/DocGen/Content/Doc/Data/Prepare.htm Tools/DocGen/Content/Doc/Data/SetCommand.htm Tools/DocGen/Content/Doc/Data/SetSpCommand.htm Tools/DocGen/Content/Doc/Data/Transaction.htm Tools/DocGen/Content/Doc/Data/index.htm Tools/DocGen/Content/Doc/DataAccess/AbstractAccessor.htm Tools/DocGen/Content/Doc/DataAccess/ActionName.htm Tools/DocGen/Content/Doc/DataAccess/ActionSprocName.htm Tools/DocGen/Content/Doc/DataAccess/ActualType.htm Tools/DocGen/Content/Doc/DataAccess/CommandBehavior.htm Tools/DocGen/Content/Doc/DataAccess/CustomSqlQuery1.htm Tools/DocGen/Content/Doc/DataAccess/CustomSqlQuery2.htm Tools/DocGen/Content/Doc/DataAccess/DataSetTable.htm Tools/DocGen/Content/Doc/DataAccess/Delete.htm Tools/DocGen/Content/Doc/DataAccess/DeleteSql.htm Tools/DocGen/Content/Doc/DataAccess/Destination.htm Tools/DocGen/Content/Doc/DataAccess/Direction.htm Tools/DocGen/Content/Doc/DataAccess/DiscoverParameters.htm Tools/DocGen/Content/Doc/DataAccess/ExecuteDictionary.htm Tools/DocGen/Content/Doc/DataAccess/ExecuteList.htm Tools/DocGen/Content/Doc/DataAccess/ExecuteObject.htm Tools/DocGen/Content/Doc/DataAccess/ExecuteScalar.htm Tools/DocGen/Content/Doc/DataAccess/Format.htm Tools/DocGen/Content/Doc/DataAccess/IndexAttribute.htm Tools/DocGen/Content/Doc/DataAccess/Insert.htm Tools/DocGen/Content/Doc/DataAccess/InsertSql.htm Tools/DocGen/Content/Doc/DataAccess/Introduction.htm Tools/DocGen/Content/Doc/DataAccess/NonUpdatable.htm Tools/DocGen/Content/Doc/DataAccess/ObjectType.htm Tools/DocGen/Content/Doc/DataAccess/OpenConfig.htm Tools/DocGen/Content/Doc/DataAccess/OpenConfigQuery.htm Tools/DocGen/Content/Doc/DataAccess/ParamDbType.htm Tools/DocGen/Content/Doc/DataAccess/ParamName.htm Tools/DocGen/Content/Doc/DataAccess/ParamNullValue.htm Tools/DocGen/Content/Doc/DataAccess/ParamSize.htm Tools/DocGen/Content/Doc/DataAccess/PrimaryKey.htm Tools/DocGen/Content/Doc/DataAccess/ScalarFieldName.htm Tools/DocGen/Content/Doc/DataAccess/ScalarSource.htm Tools/DocGen/Content/Doc/DataAccess/SelectAll.htm Tools/DocGen/Content/Doc/DataAccess/SelectAllSql.htm Tools/DocGen/Content/Doc/DataAccess/SelectByKey.htm Tools/DocGen/Content/Doc/DataAccess/SelectByKeySql.htm Tools/DocGen/Content/Doc/DataAccess/SprocName.htm Tools/DocGen/Content/Doc/DataAccess/SqlQuery.htm Tools/DocGen/Content/Doc/DataAccess/TableName.htm Tools/DocGen/Content/Doc/DataAccess/Transaction.htm Tools/DocGen/Content/Doc/DataAccess/Update.htm Tools/DocGen/Content/Doc/DataAccess/UpdateSql.htm Tools/DocGen/Content/Doc/DataAccess/XmlExtension.htm Tools/DocGen/Content/Doc/DataAccess/index.htm Tools/DocGen/Content/Doc/EditableObjects/AcceptRejectChanges.htm Tools/DocGen/Content/Doc/EditableObjects/EditableObject.cs Tools/DocGen/Content/Doc/EditableObjects/EditableObject.htm Tools/DocGen/Content/Doc/EditableObjects/IsDirty.htm Tools/DocGen/Content/Doc/EditableObjects/ManualEditableObject.cs Tools/DocGen/Content/Doc/EditableObjects/index.htm Tools/DocGen/Content/Doc/Mapping/EnumToValue.htm Tools/DocGen/Content/Doc/Mapping/MapFieldAttribute.htm Tools/DocGen/Content/Doc/Mapping/MapToJson.htm Tools/DocGen/Content/Doc/Mapping/MapValueAttribute.htm Tools/DocGen/Content/Doc/Mapping/ObjectToObject.htm Tools/DocGen/Content/Doc/Mapping/ValueToEnum.htm Tools/DocGen/Content/Doc/Mapping/index.htm Tools/DocGen/Content/Doc/Reflection/Emit/HelloWorld.htm Tools/DocGen/Content/Doc/Reflection/Emit/index.htm Tools/DocGen/Content/Doc/Reflection/ObjectFactory.htm Tools/DocGen/Content/Doc/Reflection/index.htm Tools/DocGen/Content/Doc/TypeBuilder/InitialValues.htm Tools/DocGen/Content/Doc/TypeBuilder/InternalTypes.htm Tools/DocGen/Content/Doc/TypeBuilder/XmlSerialization.htm Tools/DocGen/Content/Doc/TypeBuilder/index.htm Tools/DocGen/Content/Doc/Validation/index.htm Tools/DocGen/Content/Doc/index.htm Tools/DocGen/Content/Download.htm Tools/DocGen/Content/Home.htm Tools/DocGen/Content/License.htm Tools/DocGen/Content/WebTemplate.html Tools/DocGen/Content/bltoolkit.css Tools/DocGen/Content/index.htm Tools/DocGen/Content/robots.txt Tools/DocGen/Content/rss.xml Tools/DocGen/DocGen.sln Tools/DocGen/FileAction.cs Tools/DocGen/FileItem.cs Tools/DocGen/Generator.Chm.cs Tools/DocGen/Generator.Web.cs Tools/DocGen/Generator.cs Tools/DocGen/IndexItem.cs Tools/DocGen/Program.Chm.cs Tools/DocGen/Program.Web.cs Tools/DocGen/Program.cs Tools/DocGen/Properties/AssemblyInfo.cs Tools/DocGen/WebGen.csproj Tools/DocGen/_Content.csproj Tools/ExampleGenerator/App.ico Tools/ExampleGenerator/ExampleGenerator.csproj Tools/ExampleGenerator/Generator.cs Tools/ExampleGenerator/Properties/AssemblyInfo.cs Tools/NUnitAddin/Class1.cs Tools/NUnitAddin/NUnitAddin.csproj Tools/NUnitAddin/Properties/AssemblyInfo.cs Tools/Rsdn/Rsdn.Framework.Common.dll Tools/Rsdn/Rsdn.Framework.Formatting.dll Tools/Templates.VB/DataModel.generated.vb Tools/Templates.VB/DataModel.tt Tools/Templates.VB/My Project/Application.Designer.vb Tools/Templates.VB/My Project/Application.myapp Tools/Templates.VB/My Project/AssemblyInfo.vb Tools/Templates.VB/My Project/Resources.Designer.vb Tools/Templates.VB/My Project/Resources.resx Tools/Templates.VB/My Project/Settings.Designer.vb Tools/Templates.VB/My Project/Settings.settings Tools/Templates.VB/Templates.VB.vbproj Tools/Templates.VB/app.config Tools/Templates/MSSqlDataModel.generated.cs Tools/Templates/MSSqlDataModel.tt Tools/Templates/MySqlDataModel.generated.cs Tools/Templates/MySqlDataModel.tt Tools/Templates/PostgreSQLDataModel.generated.cs Tools/Templates/PostgreSQLDataModel.tt Tools/Templates/Properties/AssemblyInfo.cs Tools/Templates/SybaseDataModel.generated.cs Tools/Templates/SybaseDataModel.tt Tools/Templates/Templates.2008.csproj Tools/Templates/Templates.csproj Tools/Templates/packages.config UnitTests/All/App.config UnitTests/All/GetValueTest.cs UnitTests/All/Properties/AssemblyInfo.cs UnitTests/All/UnitTests.All.csproj UnitTests/All/packages.config UnitTests/BLToolkit.Linq.nunit UnitTests/BLToolkit.nunit UnitTests/CS/Aspects/AsyncAndDataAccessorTest.cs UnitTests/CS/Aspects/AsyncAspectTest.cs UnitTests/CS/Aspects/CacheAspectTest.cs UnitTests/CS/Aspects/ClearCacheAspect.cs UnitTests/CS/Aspects/CounterAspectTest.cs UnitTests/CS/Aspects/InterceptorAspectTest.cs UnitTests/CS/Aspects/LoggingAspectTest.cs UnitTests/CS/Aspects/MixinAspectTest.cs UnitTests/CS/Aspects/NotNullAspectTest.cs UnitTests/CS/Aspects/OverloadAspectTest.cs UnitTests/CS/Common/ConvertTest.cs UnitTests/CS/Common/NameOrIndexParameterTest.cs UnitTests/CS/Common/OperatorTest.cs UnitTests/CS/ComponenetModel/ObjectBinderTest.cs UnitTests/CS/Data/BinaryTest.cs UnitTests/CS/Data/ComplexMappingTest.cs UnitTests/CS/Data/CompositeKeyTest.cs UnitTests/CS/Data/DbManagerTest.cs UnitTests/CS/Data/EventsTest.cs UnitTests/CS/Data/ExecuteDictionaryTest.cs UnitTests/CS/Data/ExecuteForEach.cs UnitTests/CS/Data/ExecuteListT.cs UnitTests/CS/Data/ExecuteObjectTest.cs UnitTests/CS/Data/ExecuteScalarDictionaryTest.cs UnitTests/CS/Data/ExecuteScalarListTest.cs UnitTests/CS/Data/ExecuteScalarTest.cs UnitTests/CS/Data/InnerTypesTest.cs UnitTests/CS/Data/Linq/LinqTest.cs UnitTests/CS/Data/Model/BinaryData.cs UnitTests/CS/Data/Model/DataTypeTest.cs UnitTests/CS/Data/Model/Doctor.cs UnitTests/CS/Data/Model/Patient.cs UnitTests/CS/Data/Model/Person.cs UnitTests/CS/Data/NullableParameter.cs UnitTests/CS/Data/OutputParameter.cs UnitTests/CS/Data/Sql/DefinitionData.xml UnitTests/CS/Data/Sql/DefinitionTest.cs UnitTests/CS/Data/Sql/FromTest.cs UnitTests/CS/Data/Sql/SelectTest.cs UnitTests/CS/DataAccess/ActualTypeAttributeTest.cs UnitTests/CS/DataAccess/ArrayTest.cs UnitTests/CS/DataAccess/CreateEntityTest.cs UnitTests/CS/DataAccess/DataAccessorBuilderTest.cs UnitTests/CS/DataAccess/DataAccessorTest.cs UnitTests/CS/DataAccess/DataTypeTest.cs UnitTests/CS/DataAccess/DictionaryTest.cs UnitTests/CS/DataAccess/DynamicSqlQueryTest.cs UnitTests/CS/DataAccess/EnumTest.cs UnitTests/CS/DataAccess/OutRefTest.cs UnitTests/CS/DataAccess/PersonDataSet2.Designer.cs UnitTests/CS/DataAccess/PersonDataSet2.cs UnitTests/CS/DataAccess/PersonDataSet2.xsc UnitTests/CS/DataAccess/PersonDataSet2.xsd UnitTests/CS/DataAccess/PersonDataSet2.xss UnitTests/CS/DataAccess/PersonDataSet2.xsx UnitTests/CS/DataAccess/PrimaryKeyAttributeTest.cs UnitTests/CS/DataAccess/ScalarListTest.cs UnitTests/CS/DataAccess/ScalarTest.cs UnitTests/CS/DataAccess/SqlQueryTest.cs UnitTests/CS/DataAccess/SqlQueryTest2.cs UnitTests/CS/DataAccess/SqlTest.cs UnitTests/CS/DataAccess/TestQueryAttribute.cs UnitTests/CS/DataAccess/XmlExtension.cs UnitTests/CS/DataAccess/XmlExtension.xml UnitTests/CS/DataAccess/XmlTypeTest.cs UnitTests/CS/EditableObjects/EditableArrayListTest.cs UnitTests/CS/EditableObjects/EditableList_AcceptChanges.cs UnitTests/CS/EditableObjects/EditableObjectT.cs UnitTests/CS/EditableObjects/EditableObjectTest.cs UnitTests/CS/EditableObjects/InnerObjectTest.cs UnitTests/CS/EditableObjects/NestedObjectTest.cs UnitTests/CS/EditableObjects/NotifyCollectionChangeTest.cs UnitTests/CS/EditableObjects/NotifyPropertyChangedTest.cs UnitTests/CS/JointureTests/Artist.cs UnitTests/CS/JointureTests/Artist2.cs UnitTests/CS/JointureTests/AssociationTests.cs UnitTests/CS/JointureTests/Consts.cs UnitTests/CS/JointureTests/MusicDB.cs UnitTests/CS/JointureTests/Title.cs UnitTests/CS/Mapping/BltMapTests.cs UnitTests/CS/Mapping/DefaultValueAttributeTest.cs UnitTests/CS/Mapping/EnumExtension.cs UnitTests/CS/Mapping/ExpressionMapperTest.cs UnitTests/CS/Mapping/ISupportMappingTest.cs UnitTests/CS/Mapping/Map.xml UnitTests/CS/Mapping/MapFieldAttributeTest.cs UnitTests/CS/Mapping/MapTest.cs UnitTests/CS/Mapping/MapValueAttributeTest.cs UnitTests/CS/Mapping/MapperMemberAttributeTest.cs UnitTests/CS/Mapping/MemberMapperDefaultMappersTest.cs UnitTests/CS/Mapping/MemberMapperTest.cs UnitTests/CS/Mapping/MetadataProvider/MetadataProviderTest.cs UnitTests/CS/Mapping/NullableAttributeTest.cs UnitTests/CS/Mapping/NullableEnum.cs UnitTests/CS/Mapping/ObjectMapperAttributeTest.cs UnitTests/CS/Mapping/ObjectMapperTest.cs UnitTests/CS/Mapping/Person.mapping.cs UnitTests/CS/Mapping/Person.mapping.xml UnitTests/CS/Mapping/ResultSetTest.cs UnitTests/CS/Mapping/TestFluentNullable.cs UnitTests/CS/Mapping/TrimmableAttributeTest.cs UnitTests/CS/Mapping/XmlMap.cs UnitTests/CS/Mapping/XmlMap.xml UnitTests/CS/Patterns/DuckTypingTest.cs UnitTests/CS/Patterns/MustImplementAttributeTest.cs UnitTests/CS/Properties/AssemblyInfo.cs UnitTests/CS/Properties/Settings.Designer.cs UnitTests/CS/Properties/Settings.settings UnitTests/CS/Reflection/Emit/MethodBuilderHelperTest.cs UnitTests/CS/Reflection/ExtendedPropertyDescriptorTest.cs UnitTests/CS/Reflection/Extension/DefaultValueTest.cs UnitTests/CS/Reflection/Extension/ExtensionTest.cs UnitTests/CS/Reflection/ObjectFactoryAttributeTest.cs UnitTests/CS/Reflection/TypeAccessorTest.cs UnitTests/CS/Reflection/TypeAccessorTest2.cs UnitTests/CS/Reflection/TypeAccessorTest3.cs UnitTests/CS/Reflection/TypeHelperTest.cs UnitTests/CS/TestFixtureBase.cs UnitTests/CS/TestObject.cs UnitTests/CS/TypeBuilder/Builders/ArrayBuilderTest.cs UnitTests/CS/TypeBuilder/Builders/AutoImplementInterfaceTest.cs UnitTests/CS/TypeBuilder/Builders/DefaultTypeBuilderTest.cs UnitTests/CS/TypeBuilder/Builders/IAbstractTypeBuilderTest.cs UnitTests/CS/TypeBuilder/Builders/ImplemetInterfaceBuilderTest.cs UnitTests/CS/TypeBuilder/Builders/PropertyChangeBuilderTest.cs UnitTests/CS/TypeBuilder/Builders/TypeAccessorBuilderTest.cs UnitTests/CS/TypeBuilder/GenerateAtributeTest.cs UnitTests/CS/TypeBuilder/GenericMethodTest.cs UnitTests/CS/TypeBuilder/GetSetValueAttributeTest.cs UnitTests/CS/TypeBuilder/InstanceTypeAttributeTest.cs UnitTests/CS/TypeBuilder/InternalTypesTest.cs UnitTests/CS/TypeBuilder/InternalTypesTest.snk UnitTests/CS/TypeBuilder/LazyInstanceAttributeTest.cs UnitTests/CS/TypeBuilder/NoInstanceAttributeTest.cs UnitTests/CS/TypeBuilder/NoInstanceAttributeTest2.cs UnitTests/CS/TypeBuilder/ParameterAttributeTest.cs UnitTests/CS/TypeBuilder/TypeFactoryTest.cs UnitTests/CS/UnitTests.CS.csproj UnitTests/CS/UnitTests.CS.csproj.DotSettings UnitTests/CS/UnitTests.CS.csproj.ReSharper UnitTests/CS/Validation/MinValue.cs UnitTests/CS/Validation/NullValue.cs UnitTests/CS/Validation/RegExValidationTest.cs UnitTests/CS/app.config UnitTests/CS/packages.config UnitTests/DataProvider/Access/App.config UnitTests/DataProvider/Access/UnitTests.Access.csproj UnitTests/DataProvider/FireBird/App.config UnitTests/DataProvider/FireBird/CreateDatabase.cs UnitTests/DataProvider/FireBird/UnitTests.Firebird.csproj UnitTests/DataProvider/Oracle/App.config UnitTests/DataProvider/Oracle/UnitTests.Oracle.csproj UnitTests/DataProvider/SQLite/App.config UnitTests/DataProvider/SQLite/UnitTests.SQLite.csproj UnitTests/DataProvider/SqlCe/App.config UnitTests/DataProvider/SqlCe/CreateDatabase.cs UnitTests/DataProvider/SqlCe/UnitTests.SqlCe.csproj UnitTests/DataProvider/UnitTests.DataProviders.sln UnitTests/Fluent/AssertExceptionEx.cs UnitTests/Fluent/FluentConfigTest.cs UnitTests/Fluent/FluentMapAttributesTest.cs UnitTests/Fluent/FluentMapTest.cs UnitTests/Fluent/MockDataBase/AssertCommandData.cs UnitTests/Fluent/MockDataBase/AssertDb.cs UnitTests/Fluent/MockDataBase/AssertMockDataBaseEx.cs UnitTests/Fluent/MockDataBase/MockCommand.cs UnitTests/Fluent/MockDataBase/MockCommandData.cs UnitTests/Fluent/MockDataBase/MockDataProvider.cs UnitTests/Fluent/MockDataBase/MockDb.cs UnitTests/Fluent/MockDataBase/MockDbConnection.cs UnitTests/Fluent/MockDataBase/MockDbDataParameter.cs UnitTests/Fluent/MockDataBase/MockReader.cs UnitTests/Fluent/MockDataBase/MockReaderData.cs UnitTests/Fluent/MockDataBase/MockReaderResultData.cs UnitTests/Fluent/MockDataBase/MockSqlProvider.cs UnitTests/Fluent/Properties/AssemblyInfo.cs UnitTests/Fluent/UnitTests.Fluent.csproj UnitTests/Linq/App.config UnitTests/Linq/AssociationTest.cs UnitTests/Linq/BatchTest.cs UnitTests/Linq/Common.cs UnitTests/Linq/CompileTest.cs UnitTests/Linq/CompilerServices.vb UnitTests/Linq/ComplexTest.cs UnitTests/Linq/ConcatUnionTest.cs UnitTests/Linq/ConvertExpression.cs UnitTests/Linq/ConvertTest.cs UnitTests/Linq/CountTest.cs UnitTests/Linq/CreateData.cs UnitTests/Linq/DataContextTest.cs UnitTests/Linq/DataServiceTest.cs UnitTests/Linq/DateTimeFunctions.cs UnitTests/Linq/DefaultDataProviders.txt UnitTests/Linq/DeleteTest.cs UnitTests/Linq/Distinct.cs UnitTests/Linq/ElementOperationTest.cs UnitTests/Linq/EnumMapping.cs UnitTests/Linq/Exceptions/Aggregation.cs UnitTests/Linq/Exceptions/Common.cs UnitTests/Linq/Exceptions/DataExceptionTest.cs UnitTests/Linq/Exceptions/DmlTest.cs UnitTests/Linq/Exceptions/ElementOperationTest.cs UnitTests/Linq/Exceptions/Inheritance.cs UnitTests/Linq/Exceptions/JoinTest.cs UnitTests/Linq/Exceptions/Mapping.cs UnitTests/Linq/ExplicitInterfaceTests.cs UnitTests/Linq/ExpressionsTest.cs UnitTests/Linq/ExtensionTests.cs UnitTests/Linq/Functions.cs UnitTests/Linq/GenerateTest.cs UnitTests/Linq/GroupByTest.cs UnitTests/Linq/ITestDataContext.cs UnitTests/Linq/IdlTest.cs UnitTests/Linq/IdlTest.mono.cs UnitTests/Linq/Inheritance.cs UnitTests/Linq/InsertTest.cs UnitTests/Linq/JoinTest.cs UnitTests/Linq/L2SAttributes.cs UnitTests/Linq/Mapping.cs UnitTests/Linq/MathFunctions.cs UnitTests/Linq/Model/BinaryData.cs UnitTests/Linq/Model/DataTypeTest.cs UnitTests/Linq/Model/Doctor.cs UnitTests/Linq/Model/EditableParent.cs UnitTests/Linq/Model/FirebirdSpecific.cs UnitTests/Linq/Model/Gender.cs UnitTests/Linq/Model/LinqDataTypes.cs UnitTests/Linq/Model/Northwind.cs UnitTests/Linq/Model/NorthwindDB.cs UnitTests/Linq/Model/OracleSpecific.cs UnitTests/Linq/Model/ParentChild.cs UnitTests/Linq/Model/Patient.cs UnitTests/Linq/Model/Person.cs UnitTests/Linq/Model/PostgreSQLSpecific.cs UnitTests/Linq/Model/TestIdentity.cs UnitTests/Linq/Model/TypeValue.cs UnitTests/Linq/MultipleQuery.cs UnitTests/Linq/OrderByTest.cs UnitTests/Linq/ParserTest.cs UnitTests/Linq/Properties/AssemblyInfo.cs UnitTests/Linq/ProviderSpecific/Access.cs UnitTests/Linq/ProviderSpecific/Firebird.cs UnitTests/Linq/ProviderSpecific/MsSql2008s.cs UnitTests/Linq/ProviderSpecific/MySqlSprocParameterPrefixTests.cs UnitTests/Linq/ProviderSpecific/Oracle.cs UnitTests/Linq/ProviderSpecific/PostgreSQL.cs UnitTests/Linq/ProviderSpecific/SqlCe.cs UnitTests/Linq/Providers.cs UnitTests/Linq/SelectManyTest.cs UnitTests/Linq/SelectScalar.cs UnitTests/Linq/SelectTest.cs UnitTests/Linq/SelectTest.cs.orig UnitTests/Linq/SetTest.cs UnitTests/Linq/StringFunctions.cs UnitTests/Linq/SubQuery.cs UnitTests/Linq/TableFunctionTest.cs UnitTests/Linq/TakeSkipTest.cs UnitTests/Linq/TestAK107.cs UnitTests/Linq/TestBase.cs UnitTests/Linq/TestDbManager.cs UnitTests/Linq/TestServiceModelDataContext.cs UnitTests/Linq/Types.cs UnitTests/Linq/UnitTests.Linq.Interface.csproj UnitTests/Linq/UnitTests.Linq.VisualBasic.vbproj UnitTests/Linq/UnitTests.Linq.csproj UnitTests/Linq/UpdateTest.cs UnitTests/Linq/UserTests/CompareNullableChars.cs UnitTests/Linq/UserTests/FirstOrDefaultNullReferenceExceptionTest.cs UnitTests/Linq/UserTests/GroupBySubqueryTest.cs UnitTests/Linq/UserTests/LetTest.cs UnitTests/Linq/UserTests/LetTest1.cs UnitTests/Linq/UserTests/LetTest2.cs UnitTests/Linq/UserTests/MultiPartIdentifierTest.cs UnitTests/Linq/UserTests/SelectManyDeleteTest.cs UnitTests/Linq/UserTests/SelectManyUpdateTest.cs UnitTests/Linq/UserTests/UnknownSqlTest.cs UnitTests/Linq/UserTests/UnnecessaryInnerJoinTest.cs UnitTests/Linq/VisualBasicCommon.vb UnitTests/Linq/VisualBasicTest.cs UnitTests/Linq/WhereTest.cs UnitTests/Linq/packages.config UnitTests/Linq/x64/SQLite.Interop.dll UnitTests/Linq/x86/SQLite.Interop.dll packages/Castle.Core.3.2.1/ASL - Apache Software Foundation License.txt packages/Castle.Core.3.2.1/BreakingChanges.txt packages/Castle.Core.3.2.1/Castle.Core.3.2.1.nupkg packages/Castle.Core.3.2.1/Castle.Core.3.2.1.nuspec packages/Castle.Core.3.2.1/Changes.txt packages/Castle.Core.3.2.1/License.txt packages/Castle.Core.3.2.1/lib/net35/Castle.Core.dll packages/Castle.Core.3.2.1/lib/net35/Castle.Core.xml packages/Castle.Core.3.2.1/lib/net40-client/Castle.Core.dll packages/Castle.Core.3.2.1/lib/net40-client/Castle.Core.xml packages/Castle.Core.3.2.1/lib/net45/Castle.Core.dll packages/Castle.Core.3.2.1/lib/net45/Castle.Core.xml packages/Castle.Core.3.2.1/lib/sl4/Castle.Core.dll packages/Castle.Core.3.2.1/lib/sl4/Castle.Core.xml packages/Castle.Core.3.2.1/lib/sl5/Castle.Core.dll packages/Castle.Core.3.2.1/lib/sl5/Castle.Core.xml packages/Castle.Core.3.2.1/readme.txt packages/FirebirdSql.Data.FirebirdClient.4.0.0.0/FirebirdSql.Data.FirebirdClient.4.0.0.0.nupkg packages/FirebirdSql.Data.FirebirdClient.4.0.0.0/FirebirdSql.Data.FirebirdClient.4.0.0.0.nuspec packages/FirebirdSql.Data.FirebirdClient.4.0.0.0/lib/net40-client/FirebirdSql.Data.FirebirdClient.dll packages/FirebirdSql.Data.FirebirdClient.4.0.0.0/lib/net45/FirebirdSql.Data.FirebirdClient.dll packages/Microsoft.SqlServer.Compact.4.0.8876.1/Content/web.config.transform packages/Microsoft.SqlServer.Compact.4.0.8876.1/Microsoft.SqlServer.Compact.4.0.8876.1.nupkg packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/amd64/Microsoft.VC90.CRT/Microsoft.VC90.CRT.manifest packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/amd64/Microsoft.VC90.CRT/README_ENU.txt packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/amd64/Microsoft.VC90.CRT/msvcr90.dll packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/amd64/sqlceca40.dll packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/amd64/sqlcecompact40.dll packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/amd64/sqlceer40EN.dll packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/amd64/sqlceme40.dll packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/amd64/sqlceqp40.dll packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/amd64/sqlcese40.dll packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/x86/Microsoft.VC90.CRT/Microsoft.VC90.CRT.manifest packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/x86/Microsoft.VC90.CRT/README_ENU.txt packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/x86/Microsoft.VC90.CRT/msvcr90.dll packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/x86/sqlceca40.dll packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/x86/sqlcecompact40.dll packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/x86/sqlceer40EN.dll packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/x86/sqlceme40.dll packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/x86/sqlceqp40.dll packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/x86/sqlcese40.dll packages/Microsoft.SqlServer.Compact.4.0.8876.1/SQLCE_EULA_ENU.rtf packages/Microsoft.SqlServer.Compact.4.0.8876.1/lib/net40/System.Data.SqlServerCe.dll packages/Microsoft.SqlServer.Compact.4.0.8876.1/tools/Install.ps1 packages/Microsoft.SqlServer.Compact.4.0.8876.1/tools/Uninstall.ps1 packages/Microsoft.SqlServer.Compact.4.0.8876.1/tools/VS.psd1 packages/Microsoft.SqlServer.Compact.4.0.8876.1/tools/VS.psm1 packages/MySql.Data.6.8.3/MySql.Data.6.8.3.nupkg packages/MySql.Data.6.8.3/MySql.Data.6.8.3.nuspec packages/MySql.Data.6.8.3/lib/net20-cf/MySql.Data.cf.dll packages/MySql.Data.6.8.3/lib/net20/MySql.Data.dll packages/MySql.Data.6.8.3/lib/net40/MySql.Data.dll packages/MySql.Data.6.8.3/lib/net45/MySql.Data.dll packages/MySql.Data.6.8.3/lib/netcore45/MySql.Data.RT.dll packages/NUnit.2.6.3/NUnit.2.6.3.nupkg packages/NUnit.2.6.3/NUnit.2.6.3.nuspec packages/NUnit.2.6.3/lib/nunit.framework.dll packages/NUnit.2.6.3/lib/nunit.framework.xml packages/NUnit.2.6.3/license.txt packages/Npgsql.2.0.14.3/Npgsql.2.0.14.3.nupkg packages/Npgsql.2.0.14.3/Npgsql.2.0.14.3.nuspec packages/Npgsql.2.0.14.3/lib/net20/Mono.Security.dll packages/Npgsql.2.0.14.3/lib/net20/Npgsql.dll packages/Npgsql.2.0.14.3/lib/net20/Npgsql.xml packages/Npgsql.2.0.14.3/lib/net20/de/Npgsql.resources.dll packages/Npgsql.2.0.14.3/lib/net20/es/Npgsql.resources.dll packages/Npgsql.2.0.14.3/lib/net20/fi/Npgsql.resources.dll packages/Npgsql.2.0.14.3/lib/net20/fr/Npgsql.resources.dll packages/Npgsql.2.0.14.3/lib/net20/ja/Npgsql.resources.dll packages/Npgsql.2.0.14.3/lib/net20/zh-CN/Npgsql.resources.dll packages/Npgsql.2.0.14.3/lib/net35/Mono.Security.dll packages/Npgsql.2.0.14.3/lib/net35/Npgsql.dll packages/Npgsql.2.0.14.3/lib/net35/Npgsql.xml packages/Npgsql.2.0.14.3/lib/net35/de/Npgsql.resources.dll packages/Npgsql.2.0.14.3/lib/net35/es/Npgsql.resources.dll packages/Npgsql.2.0.14.3/lib/net35/fi/Npgsql.resources.dll packages/Npgsql.2.0.14.3/lib/net35/fr/Npgsql.resources.dll packages/Npgsql.2.0.14.3/lib/net35/ja/Npgsql.resources.dll packages/Npgsql.2.0.14.3/lib/net35/zh-CN/Npgsql.resources.dll packages/Npgsql.2.0.14.3/lib/net40/Mono.Security.dll packages/Npgsql.2.0.14.3/lib/net40/Npgsql.dll packages/Npgsql.2.0.14.3/lib/net40/Npgsql.xml packages/Npgsql.2.0.14.3/lib/net40/de/Npgsql.resources.dll packages/Npgsql.2.0.14.3/lib/net40/es/Npgsql.resources.dll packages/Npgsql.2.0.14.3/lib/net40/fi/Npgsql.resources.dll packages/Npgsql.2.0.14.3/lib/net40/fr/Npgsql.resources.dll packages/Npgsql.2.0.14.3/lib/net40/ja/Npgsql.resources.dll packages/Npgsql.2.0.14.3/lib/net40/zh-CN/Npgsql.resources.dll packages/Npgsql.2.0.14.3/lib/net45/Mono.Security.dll packages/Npgsql.2.0.14.3/lib/net45/Npgsql.dll packages/Npgsql.2.0.14.3/lib/net45/Npgsql.xml packages/Npgsql.2.0.14.3/lib/net45/de/Npgsql.resources.dll packages/Npgsql.2.0.14.3/lib/net45/es/Npgsql.resources.dll packages/Npgsql.2.0.14.3/lib/net45/fi/Npgsql.resources.dll packages/Npgsql.2.0.14.3/lib/net45/fr/Npgsql.resources.dll packages/Npgsql.2.0.14.3/lib/net45/ja/Npgsql.resources.dll packages/Npgsql.2.0.14.3/lib/net45/zh-CN/Npgsql.resources.dll packages/System.Data.SQLite.1.0.90.0/System.Data.SQLite.1.0.90.0.nupkg packages/System.Data.SQLite.1.0.90.0/System.Data.SQLite.1.0.90.0.nuspec packages/System.Data.SQLite.1.0.90.0/content/net20/x64/SQLite.Interop.dll packages/System.Data.SQLite.1.0.90.0/content/net20/x86/SQLite.Interop.dll packages/System.Data.SQLite.1.0.90.0/content/net40/x64/SQLite.Interop.dll packages/System.Data.SQLite.1.0.90.0/content/net40/x86/SQLite.Interop.dll packages/System.Data.SQLite.1.0.90.0/content/net45/x64/SQLite.Interop.dll packages/System.Data.SQLite.1.0.90.0/content/net45/x86/SQLite.Interop.dll packages/System.Data.SQLite.1.0.90.0/content/net451/x64/SQLite.Interop.dll packages/System.Data.SQLite.1.0.90.0/content/net451/x86/SQLite.Interop.dll packages/System.Data.SQLite.1.0.90.0/lib/net20/System.Data.SQLite.Linq.dll packages/System.Data.SQLite.1.0.90.0/lib/net20/System.Data.SQLite.dll packages/System.Data.SQLite.1.0.90.0/lib/net20/System.Data.SQLite.xml packages/System.Data.SQLite.1.0.90.0/lib/net40/System.Data.SQLite.Linq.dll packages/System.Data.SQLite.1.0.90.0/lib/net40/System.Data.SQLite.dll packages/System.Data.SQLite.1.0.90.0/lib/net40/System.Data.SQLite.xml packages/System.Data.SQLite.1.0.90.0/lib/net45/System.Data.SQLite.Linq.dll packages/System.Data.SQLite.1.0.90.0/lib/net45/System.Data.SQLite.dll packages/System.Data.SQLite.1.0.90.0/lib/net45/System.Data.SQLite.xml packages/System.Data.SQLite.1.0.90.0/lib/net451/System.Data.SQLite.Linq.dll packages/System.Data.SQLite.1.0.90.0/lib/net451/System.Data.SQLite.dll packages/System.Data.SQLite.1.0.90.0/lib/net451/System.Data.SQLite.xml packages/System.Data.SQLite.1.0.90.0/tools/install.ps1 packages/dotConnect.Express.for.Oracle.8.1.36/content/app.config.transform packages/dotConnect.Express.for.Oracle.8.1.36/content/web.config.transform packages/dotConnect.Express.for.Oracle.8.1.36/dotConnect.Express.for.Oracle.8.1.36.nupkg packages/dotConnect.Express.for.Oracle.8.1.36/dotConnect.Express.for.Oracle.8.1.36.nuspec packages/dotConnect.Express.for.Oracle.8.1.36/lib/Devart.Data.Oracle.dll packages/dotConnect.Express.for.Oracle.8.1.36/lib/Devart.Data.dll packages/odp.net.managed.121.1.1/lib/net40/Oracle.ManagedDataAccess.dll packages/odp.net.managed.121.1.1/odp.net.managed.121.1.1.nupkg packages/odp.net.managed.121.1.1/odp.net.managed.121.1.1.nuspec packages/odp.net.x86.112.3.20/lib/net20/Oracle.DataAccess.dll packages/odp.net.x86.112.3.20/lib/net40/Oracle.DataAccess.dll packages/odp.net.x86.112.3.20/odp.net.x86.112.3.20.nupkg packages/odp.net.x86.112.3.20/odp.net.x86.112.3.20.nuspec packages/repositories.config
diffstat 1814 files changed, 363075 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.editorconfig	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+; What is EditorConfig? http://editorconfig.org/
+; Extension for VS2010/2012 to support .editorconfig files: http://visualstudiogallery.msdn.microsoft.com/c8bccfe2-650c-4b42-bc5c-845e21f96328
+
+root = true
+
+; use tabs identation for all files
+[*]
+indent_style = tab
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.gitignore	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,50 @@
+
+Binary file: E:\Projects\Git\BLToolkit\.gitignore (Detected)
+#ignore thumbnails created by windows
+Thumbs.db
+#Ignore files build by Visual Studio
+*.obj
+*.exe
+*.pdb
+*.user
+*.aps
+*.pch
+*.vspscc
+*_i.c
+*_p.c
+*.ncb
+*.suo
+*.tlb
+*.tlh
+*.bak
+*.cache
+*.ilk
+*.log
+[Bb]in
+[Dd]ebug*/
+*.lib
+*.sbr
+*.pidb
+*.cache
+*.userprefs
+*.sdf
+*.xap
+obj/
+[Rr]elease*/
+_ReSharper*/
+[Tt]est[Rr]esult*
+BLToolkit.2010.opensdf
+BLToolkit.2010.sdf
+BLToolkit.2010.userprefs
+BLToolkit.2010.sdf
+BLToolkit.2010.userprefs
+Mono/_ReSharper.Mono/*
+BLToolkit.2010.sln.docstates
+*.csproj.user
+UnitTests/BLToolkit.Linq.VisualState.xml
+UnitTests/Linq/UserDataProviders.txt
+!*.dll
+!*.exe
+!*.pdb
+BLToolkit.2012.opensdf
+ipch/examples.cpp-54293a33/examples.ipch
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.hgignore	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,47 @@
+syntax: glob
+Thumbs.db
+*.obj
+*.exe
+*.pdb
+*.user
+*.aps
+*.pch
+*.vspscc
+*_i.c
+*_p.c
+*.ncb
+*.suo
+*.tlb
+*.tlh
+*.bak
+*.cache
+*.ilk
+*.log
+bin
+debug*/
+*.lib
+*.sbr
+*.pidb
+*.cache
+*.userprefs
+*.sdf
+*.xap
+obj/
+release*/
+_ReSharper*/
+TestResult*
+BLToolkit.2010.opensdf
+BLToolkit.2010.sdf
+BLToolkit.2010.userprefs
+BLToolkit.2010.sdf
+BLToolkit.2010.userprefs
+Mono/_ReSharper.Mono/*
+BLToolkit.2010.sln.docstates
+*.csproj.user
+UnitTests/BLToolkit.Linq.VisualState.xml
+UnitTests/Linq/UserDataProviders.txt
+!*.dll
+!*.exe
+!*.pdb
+BLToolkit.2012.opensdf
+ipch/examples.cpp-54293a33/examples.ipch
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BLToolkit.2008.6.0.ReSharper	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,97 @@
+<Configuration>
+  <CodeStyleSettings>
+    <ExternalPath IsNull="False">
+    </ExternalPath>
+    <Sharing>SOLUTION</Sharing>
+    <CSS>
+      <FormatSettings />
+      <Naming2 />
+    </CSS>
+    <CSharp>
+      <FormatSettings>
+        <MODIFIERS_ORDER IsNull="False">
+          <Item>public</Item>
+          <Item>protected</Item>
+          <Item>internal</Item>
+          <Item>private</Item>
+          <Item>new</Item>
+          <Item>abstract</Item>
+          <Item>virtual</Item>
+          <Item>override</Item>
+          <Item>sealed</Item>
+          <Item>static</Item>
+          <Item>readonly</Item>
+          <Item>extern</Item>
+          <Item>unsafe</Item>
+          <Item>volatile</Item>
+        </MODIFIERS_ORDER>
+        <SPACE_AFTER_TYPECAST_PARENTHESES>False</SPACE_AFTER_TYPECAST_PARENTHESES>
+        <SPACE_AROUND_MULTIPLICATIVE_OP>True</SPACE_AROUND_MULTIPLICATIVE_OP>
+        <SPACE_BEFORE_COLON_IN_CASE>True</SPACE_BEFORE_COLON_IN_CASE>
+        <SPACE_BEFORE_FIXED_PARENTHESES>False</SPACE_BEFORE_FIXED_PARENTHESES>
+        <SPACE_BEFORE_SIZEOF_PARENTHESES>False</SPACE_BEFORE_SIZEOF_PARENTHESES>
+        <SPACE_BEFORE_TYPEOF_PARENTHESES>False</SPACE_BEFORE_TYPEOF_PARENTHESES>
+        <SPACE_WITHIN_SINGLE_LINE_ARRAY_INITIALIZER_BRACES>True</SPACE_WITHIN_SINGLE_LINE_ARRAY_INITIALIZER_BRACES>
+      </FormatSettings>
+      <UsingsSettings>
+        <KeepImports IsNull="False">
+          <Item>System</Item>
+        </KeepImports>
+        <MandatoryImports IsNull="False">
+          <Item>System</Item>
+        </MandatoryImports>
+      </UsingsSettings>
+      <Naming2>
+        <EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>
+        <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>
+      </Naming2>
+    </CSharp>
+    <HTML>
+      <FormatSettings />
+    </HTML>
+    <JavaScript>
+      <FormatSettings />
+      <Naming2 />
+    </JavaScript>
+    <VB>
+      <FormatSettings />
+      <ImportsSettings />
+      <Naming2>
+        <EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>
+        <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>
+      </Naming2>
+    </VB>
+    <Web>
+      <Naming2 />
+    </Web>
+    <XML>
+      <FormatSettings />
+    </XML>
+    <Xaml>
+      <Naming2 />
+    </Xaml>
+    <GenerateMemberBody />
+    <Naming2>
+      <EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>
+      <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="TypesAndNamespaces" />
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="MethodPropertyEvent" />
+      <PredefinedRule Inspect="True" Prefix="I" Suffix="" Style="AaBb" ElementKind="Interfaces" />
+      <PredefinedRule Inspect="True" Prefix="T" Suffix="" Style="AaBb" ElementKind="TypeParameters" />
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="Locals" />
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="LocalConstants" />
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="Parameters" />
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PublicFields" />
+      <PredefinedRule Inspect="True" Prefix="_" Suffix="" Style="aaBb" ElementKind="PrivateInstanceFields" />
+      <PredefinedRule Inspect="True" Prefix="_" Suffix="" Style="aaBb" ElementKind="PrivateStaticFields" />
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="Constants" />
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateConstants" />
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="StaticReadonly" />
+      <PredefinedRule Inspect="True" Prefix="_" Suffix="" Style="aaBb" ElementKind="PrivateStaticReadonly" />
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="EnumMember" />
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="Other" />
+      <Abbreviation Text="BL" />
+      <Abbreviation Text="ID" />
+    </Naming2>
+  </CodeStyleSettings>
+</Configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BLToolkit.2008.6.1.ReSharper	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,96 @@
+<Configuration>
+  <CodeStyleSettings>
+    <ExternalPath IsNull="False" />
+    <Sharing>SOLUTION</Sharing>
+    <CSS>
+      <FormatSettings />
+      <Naming2 />
+    </CSS>
+    <CSharp>
+      <FormatSettings>
+        <MODIFIERS_ORDER IsNull="False">
+          <Item>public</Item>
+          <Item>protected</Item>
+          <Item>internal</Item>
+          <Item>private</Item>
+          <Item>new</Item>
+          <Item>abstract</Item>
+          <Item>virtual</Item>
+          <Item>override</Item>
+          <Item>sealed</Item>
+          <Item>static</Item>
+          <Item>readonly</Item>
+          <Item>extern</Item>
+          <Item>unsafe</Item>
+          <Item>volatile</Item>
+        </MODIFIERS_ORDER>
+        <SPACE_AFTER_TYPECAST_PARENTHESES>False</SPACE_AFTER_TYPECAST_PARENTHESES>
+        <SPACE_AROUND_MULTIPLICATIVE_OP>True</SPACE_AROUND_MULTIPLICATIVE_OP>
+        <SPACE_BEFORE_COLON_IN_CASE>True</SPACE_BEFORE_COLON_IN_CASE>
+        <SPACE_BEFORE_FIXED_PARENTHESES>False</SPACE_BEFORE_FIXED_PARENTHESES>
+        <SPACE_BEFORE_SIZEOF_PARENTHESES>False</SPACE_BEFORE_SIZEOF_PARENTHESES>
+        <SPACE_BEFORE_TYPEOF_PARENTHESES>False</SPACE_BEFORE_TYPEOF_PARENTHESES>
+        <SPACE_WITHIN_SINGLE_LINE_ARRAY_INITIALIZER_BRACES>True</SPACE_WITHIN_SINGLE_LINE_ARRAY_INITIALIZER_BRACES>
+      </FormatSettings>
+      <UsingsSettings>
+        <KeepImports IsNull="False">
+          <Item>System</Item>
+        </KeepImports>
+        <MandatoryImports IsNull="False">
+          <Item>System</Item>
+        </MandatoryImports>
+      </UsingsSettings>
+      <Naming2>
+        <EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>
+        <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>
+      </Naming2>
+    </CSharp>
+    <HTML>
+      <FormatSettings />
+    </HTML>
+    <JavaScript>
+      <FormatSettings />
+      <Naming2 />
+    </JavaScript>
+    <VB>
+      <FormatSettings />
+      <ImportsSettings />
+      <Naming2>
+        <EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>
+        <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>
+      </Naming2>
+    </VB>
+    <Web>
+      <Naming2 />
+    </Web>
+    <XML>
+      <FormatSettings />
+    </XML>
+    <Xaml>
+      <Naming2 />
+    </Xaml>
+    <GenerateMemberBody />
+    <Naming2>
+      <EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>
+      <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="TypesAndNamespaces" />
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="MethodPropertyEvent" />
+      <PredefinedRule Inspect="True" Prefix="I" Suffix="" Style="AaBb" ElementKind="Interfaces" />
+      <PredefinedRule Inspect="True" Prefix="T" Suffix="" Style="AaBb" ElementKind="TypeParameters" />
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="Locals" />
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="LocalConstants" />
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="Parameters" />
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PublicFields" />
+      <PredefinedRule Inspect="True" Prefix="_" Suffix="" Style="aaBb" ElementKind="PrivateInstanceFields" />
+      <PredefinedRule Inspect="True" Prefix="_" Suffix="" Style="aaBb" ElementKind="PrivateStaticFields" />
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="Constants" />
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateConstants" />
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="StaticReadonly" />
+      <PredefinedRule Inspect="True" Prefix="_" Suffix="" Style="aaBb" ElementKind="PrivateStaticReadonly" />
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="EnumMember" />
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="Other" />
+      <Abbreviation Text="BL" />
+      <Abbreviation Text="ID" />
+    </Naming2>
+  </CodeStyleSettings>
+</Configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BLToolkit.2008.sln	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,249 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{92307E70-A839-4A76-9701-B5603B05BC08}"
+	ProjectSection(FolderStartupServices) = postProject
+		{B4F97281-0DBD-4835-9ED8-7DFB966E87FF} = {B4F97281-0DBD-4835-9ED8-7DFB966E87FF}
+	EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Demo", "Demo", "{F45E2E57-2D88-49DF-8C97-9D8EE7A0A4B1}"
+	ProjectSection(FolderStartupServices) = postProject
+		{B4F97281-0DBD-4835-9ED8-7DFB966E87FF} = {B4F97281-0DBD-4835-9ED8-7DFB966E87FF}
+	EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.3", "Source\BLToolkit.3.csproj", "{0C325F5D-E50E-4340-8724-D29896CCC583}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExampleGenerator", "Tools\ExampleGenerator\ExampleGenerator.csproj", "{DE735B24-E20B-4440-BBBB-35AECC3F1124}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLTgen.2008", "Tools\BLTgen\BLTgen.2008.csproj", "{65FC918C-FF12-4C75-96F5-180B552989E5}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Templates.2008", "Tools\Templates\Templates.2008.csproj", "{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Linq", "Linq", "{4ABA64DA-8981-42F5-9144-DFD5350BEC2D}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DataProviders", "DataProviders", "{9F229425-A623-4066-9A92-84F31DD54FD2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.DB2.3", "DataProviders\DB2\BLToolkit.Data.DataProvider.DB2.3.csproj", "{86BF4F10-3606-4016-9919-84C3335813B6}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.Firebird.3", "DataProviders\Firebird\BLToolkit.Data.DataProvider.Firebird.3.csproj", "{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.Informix.3", "DataProviders\Informix\BLToolkit.Data.DataProvider.Informix.3.csproj", "{B1DEA25C-7667-471B-BBAD-64D017FDD104}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.MySql.3", "DataProviders\MySql\BLToolkit.Data.DataProvider.MySql.3.csproj", "{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.Oracle.3", "DataProviders\Oracle\BLToolkit.Data.DataProvider.Oracle.3.csproj", "{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.PostgreSQL.3", "DataProviders\PostgreSQL\BLToolkit.Data.DataProvider.PostgreSQL.3.csproj", "{5A556D57-0D68-433B-AD78-02849583582B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.SqlCe.3", "DataProviders\SqlCe\BLToolkit.Data.DataProvider.SqlCe.3.csproj", "{85E90F57-8DE1-4912-8414-28578F4D71CD}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.SQLite.3", "DataProviders\SQLite\BLToolkit.Data.DataProvider.SQLite.3.csproj", "{3E414663-B673-47A8-AB59-0E08FE43DA86}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.Sybase.3", "DataProviders\Sybase\BLToolkit.Data.DataProvider.Sybase.3.csproj", "{6CD8CC3D-643D-4D09-8660-A26085C44FBC}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Linq.Demo.2008", "Demo\Linq\Demo\Linq.Demo.2008.csproj", "{57CE5505-44CB-42E4-A346-3471F68A5B60}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|.NET = Debug|.NET
+		Debug|Any CPU = Debug|Any CPU
+		Debug|Mixed Platforms = Debug|Mixed Platforms
+		Debug|Win32 = Debug|Win32
+		Release|.NET = Release|.NET
+		Release|Any CPU = Release|Any CPU
+		Release|Mixed Platforms = Release|Mixed Platforms
+		Release|Win32 = Release|Win32
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|.NET.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|Win32.ActiveCfg = Release|Any CPU
+		{DE735B24-E20B-4440-BBBB-35AECC3F1124}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{DE735B24-E20B-4440-BBBB-35AECC3F1124}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{DE735B24-E20B-4440-BBBB-35AECC3F1124}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{DE735B24-E20B-4440-BBBB-35AECC3F1124}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{DE735B24-E20B-4440-BBBB-35AECC3F1124}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{DE735B24-E20B-4440-BBBB-35AECC3F1124}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{DE735B24-E20B-4440-BBBB-35AECC3F1124}.Release|.NET.ActiveCfg = Release|Any CPU
+		{DE735B24-E20B-4440-BBBB-35AECC3F1124}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{DE735B24-E20B-4440-BBBB-35AECC3F1124}.Release|Any CPU.Build.0 = Release|Any CPU
+		{DE735B24-E20B-4440-BBBB-35AECC3F1124}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{DE735B24-E20B-4440-BBBB-35AECC3F1124}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{DE735B24-E20B-4440-BBBB-35AECC3F1124}.Release|Win32.ActiveCfg = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Release|.NET.ActiveCfg = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Release|Any CPU.Build.0 = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Release|Win32.ActiveCfg = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Release|.NET.ActiveCfg = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Release|Win32.ActiveCfg = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Release|.NET.ActiveCfg = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Release|Any CPU.Build.0 = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Release|Win32.ActiveCfg = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Release|.NET.ActiveCfg = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Release|Any CPU.Build.0 = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Release|Win32.ActiveCfg = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Release|.NET.ActiveCfg = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Release|Win32.ActiveCfg = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Release|.NET.ActiveCfg = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Release|Win32.ActiveCfg = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Release|.NET.ActiveCfg = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Release|Win32.ActiveCfg = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Release|.NET.ActiveCfg = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Release|Win32.ActiveCfg = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Release|.NET.ActiveCfg = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Release|Any CPU.Build.0 = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Release|Win32.ActiveCfg = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Release|.NET.ActiveCfg = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Release|Win32.ActiveCfg = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Release|.NET.ActiveCfg = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Release|Win32.ActiveCfg = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Release|.NET.ActiveCfg = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Release|Any CPU.Build.0 = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Release|Win32.ActiveCfg = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(NestedProjects) = preSolution
+		{DE735B24-E20B-4440-BBBB-35AECC3F1124} = {92307E70-A839-4A76-9701-B5603B05BC08}
+		{65FC918C-FF12-4C75-96F5-180B552989E5} = {92307E70-A839-4A76-9701-B5603B05BC08}
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF} = {92307E70-A839-4A76-9701-B5603B05BC08}
+		{4ABA64DA-8981-42F5-9144-DFD5350BEC2D} = {F45E2E57-2D88-49DF-8C97-9D8EE7A0A4B1}
+		{57CE5505-44CB-42E4-A346-3471F68A5B60} = {4ABA64DA-8981-42F5-9144-DFD5350BEC2D}
+		{86BF4F10-3606-4016-9919-84C3335813B6} = {9F229425-A623-4066-9A92-84F31DD54FD2}
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68} = {9F229425-A623-4066-9A92-84F31DD54FD2}
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104} = {9F229425-A623-4066-9A92-84F31DD54FD2}
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD} = {9F229425-A623-4066-9A92-84F31DD54FD2}
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D} = {9F229425-A623-4066-9A92-84F31DD54FD2}
+		{5A556D57-0D68-433B-AD78-02849583582B} = {9F229425-A623-4066-9A92-84F31DD54FD2}
+		{85E90F57-8DE1-4912-8414-28578F4D71CD} = {9F229425-A623-4066-9A92-84F31DD54FD2}
+		{3E414663-B673-47A8-AB59-0E08FE43DA86} = {9F229425-A623-4066-9A92-84F31DD54FD2}
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC} = {9F229425-A623-4066-9A92-84F31DD54FD2}
+	EndGlobalSection
+	GlobalSection(TextTemplating) = postSolution
+		TextTemplating = 1
+	EndGlobalSection
+EndGlobal
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BLToolkit.2010.sln	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,2028 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.4", "Source\BLToolkit.4.csproj", "{0C325F5D-E50E-4340-8724-D29896CCC583}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UnitTests", "UnitTests", "{2CC0A340-512C-4F0D-A5E6-87C042EE13B9}"
+	ProjectSection(SolutionItems) = preProject
+		UnitTests\BLToolkit.Linq.nunit = UnitTests\BLToolkit.Linq.nunit
+		UnitTests\BLToolkit.nunit = UnitTests\BLToolkit.nunit
+	EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests.Linq.Interface", "UnitTests\Linq\UnitTests.Linq.Interface.csproj", "{D527524F-EC92-465E-9CAE-86278121675A}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "UnitTests.Linq.VisualBasic", "UnitTests\Linq\UnitTests.Linq.VisualBasic.vbproj", "{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests.Linq", "UnitTests\Linq\UnitTests.Linq.csproj", "{07997A18-86D3-47AC-A514-AB1B03E6AEC8}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{C0306556-68F4-4DD5-95F2-AAFEE8FACDFA}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Templates", "Tools\Templates\Templates.csproj", "{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DataProviders", "DataProviders", "{E6CE0ECB-3373-4DC0-98CB-F4E9DC2293C4}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.DB2.4", "DataProviders\DB2\BLToolkit.Data.DataProvider.DB2.4.csproj", "{86BF4F10-3606-4016-9919-84C3335813B6}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.Firebird.4", "DataProviders\Firebird\BLToolkit.Data.DataProvider.Firebird.4.csproj", "{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.Informix.4", "DataProviders\Informix\BLToolkit.Data.DataProvider.Informix.4.csproj", "{B1DEA25C-7667-471B-BBAD-64D017FDD104}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.MySql.4", "DataProviders\MySql\BLToolkit.Data.DataProvider.MySql.4.csproj", "{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.Oracle.4", "DataProviders\Oracle\BLToolkit.Data.DataProvider.Oracle.4.csproj", "{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.PostgreSQL.4", "DataProviders\PostgreSQL\BLToolkit.Data.DataProvider.PostgreSQL.4.csproj", "{5A556D57-0D68-433B-AD78-02849583582B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.SqlCe.4", "DataProviders\SqlCe\BLToolkit.Data.DataProvider.SqlCe.4.csproj", "{85E90F57-8DE1-4912-8414-28578F4D71CD}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.SQLite.4", "DataProviders\SQLite\BLToolkit.Data.DataProvider.SQLite.4.csproj", "{3E414663-B673-47A8-AB59-0E08FE43DA86}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.Sybase.4", "DataProviders\Sybase\BLToolkit.Data.DataProvider.Sybase.4.csproj", "{6CD8CC3D-643D-4D09-8660-A26085C44FBC}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.SL.4", "Source\BLToolkit.SL.4.csproj", "{663D4BFC-F565-41F7-9409-510B560CCEE8}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Demo", "Demo", "{B75C60BF-F5B7-472E-A0A8-8A12DDDDAA7D}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Silverlight", "Silverlight", "{83C0070F-E639-4D65-B392-34F621165A1C}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Client", "Demo\Silverlight\Client\Client.csproj", "{28693777-369C-4C0D-B076-38F7C0E5D06C}"
+	ProjectSection(ProjectDependencies) = postProject
+		{E796EF23-D63D-4EBD-A34D-5F243834933B} = {E796EF23-D63D-4EBD-A34D-5F243834933B}
+	EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Client.Web", "Demo\Silverlight\Client.Web\Client.Web.csproj", "{E796EF23-D63D-4EBD-A34D-5F243834933B}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Partial.Trust", "Partial.Trust", "{0F3F166F-9927-4BC0-855F-ADB0D20218F1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Partial.Trust.Components", "Demo\Partial.Trust\Components\Partial.Trust.Components.csproj", "{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Partial.Trust.Asp.Net", "Demo\Partial.Trust\Asp.Net\Partial.Trust.Asp.Net.csproj", "{16272F10-9E3D-4C24-8761-8A43E9FB525F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLTgen.2010", "Tools\BLTgen\BLTgen.2010.csproj", "{65FC918C-FF12-4C75-96F5-180B552989E5}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WinForms", "WinForms", "{35E61C2A-2B8C-4AF4-AD21-353936581EF5}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Demo", "Demo\WinForms\BLToolkit.Demo.csproj", "{854749E5-9264-42FF-A576-3B5784C7C14C}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Linq", "Linq", "{9475B894-944A-47CF-855D-93A0C42136C9}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Linq.Demo.2010", "Demo\Linq\Demo\Linq.Demo.2010.csproj", "{57CE5505-44CB-42E4-A346-3471F68A5B60}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Linq.OverWCF", "Demo\Linq\OverWCF\Linq.OverWCF.csproj", "{7ED3B518-7CEA-4991-98BD-9752E5F32F58}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Asp.Net", "Asp.Net", "{FC77CB0E-4DBF-4CDF-A1AD-C6F830A849B0}"
+	ProjectSection(SolutionItems) = preProject
+		Demo\Asp.Net\ReadMe.txt = Demo\Asp.Net\ReadMe.txt
+	EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PetShop.ObjectModel", "Demo\Asp.Net\ObjectModel\PetShop.ObjectModel.csproj", "{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PetShop.BusinessLogic", "Demo\Asp.Net\BusinessLogic\PetShop.BusinessLogic.csproj", "{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}"
+EndProject
+Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "Web", "Demo\Asp.Net\Web\", "{7DAA2EBB-A724-498F-93BB-68966E2B738F}"
+	ProjectSection(WebsiteProperties) = preProject
+		SccProjectName = ""
+		SccAuxPath = ""
+		SccLocalPath = ""
+		SccProvider = ""
+		TargetFrameworkMoniker = ".NETFramework,Version%3Dv4.0"
+		ProjectReferences = "{0C325F5D-E50E-4340-8724-D29896CCC583}|BLToolkit.4.dll;{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}|PetShop.BusinessLogic.dll;{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}|PetShop.ObjectModel.dll;"
+		Debug.AspNetCompiler.VirtualPath = "/Web"
+		Debug.AspNetCompiler.PhysicalPath = "Demo\Asp.Net\Web\"
+		Debug.AspNetCompiler.TargetPath = "PrecompiledWeb\Web\"
+		Debug.AspNetCompiler.Updateable = "true"
+		Debug.AspNetCompiler.ForceOverwrite = "true"
+		Debug.AspNetCompiler.FixedNames = "false"
+		Debug.AspNetCompiler.Debug = "True"
+		Release.AspNetCompiler.VirtualPath = "/Web"
+		Release.AspNetCompiler.PhysicalPath = "Demo\Asp.Net\Web\"
+		Release.AspNetCompiler.TargetPath = "PrecompiledWeb\Web\"
+		Release.AspNetCompiler.Updateable = "true"
+		Release.AspNetCompiler.ForceOverwrite = "true"
+		Release.AspNetCompiler.FixedNames = "false"
+		Release.AspNetCompiler.Debug = "False"
+		VWDPort = "51456"
+		VWDDynamicPort = "false"
+	EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{2F6B63C4-295A-433C-91CB-CAE4CADE6B8B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectModel", "Demo\WebServices\ObjectModel\ObjectModel.csproj", "{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Server", "Demo\WebServices\Server\Server.csproj", "{711A3803-4395-4E92-9B26-DC8DDDF80366}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Client", "Demo\WebServices\Client\Client.csproj", "{4EBBF9E9-53B2-493C-ABAB-E915C187558F}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Examples", "Examples", "{8A7F38C5-EF9A-410B-8539-A58879F3AA22}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Examples.Cpp", "Examples\Cpp\Examples.Cpp.vcxproj", "{FF377109-1931-499F-9346-449D259977F2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Examples.CS", "Examples\CS\Examples.CS.csproj", "{34989C73-F82A-4905-9349-D0CF1419CD1C}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Examples.VB", "Examples\VB\Examples.VB.vbproj", "{308A4189-53AB-460D-B2B1-0EB4B9219654}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HowTo", "HowTo\HowTo.csproj", "{8DA66999-005A-49AB-86A9-2C1F62905B50}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Templates.VB", "Tools\Templates.VB\Templates.VB.vbproj", "{F2B014F7-3807-4938-8F02-3CF8247C47DC}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Create Scripts", "Create Scripts", "{4FDE7340-F60F-49BC-86CD-756CCD26C92A}"
+	ProjectSection(SolutionItems) = preProject
+		Data\Create Scripts\Access.sql = Data\Create Scripts\Access.sql
+		Data\Create Scripts\DB2.sql = Data\Create Scripts\DB2.sql
+		Data\Create Scripts\Firebird2.sql = Data\Create Scripts\Firebird2.sql
+		Data\Create Scripts\Informix.sql = Data\Create Scripts\Informix.sql
+		Data\Create Scripts\MsSql.sql = Data\Create Scripts\MsSql.sql
+		Data\Create Scripts\MsSql2000.sql = Data\Create Scripts\MsSql2000.sql
+		Data\Create Scripts\MySql.sql = Data\Create Scripts\MySql.sql
+		Data\Create Scripts\Oracle.sql = Data\Create Scripts\Oracle.sql
+		Data\Create Scripts\PostgreSQL.sql = Data\Create Scripts\PostgreSQL.sql
+		Data\Create Scripts\SqlCe.sql = Data\Create Scripts\SqlCe.sql
+		Data\Create Scripts\SQLite.sql = Data\Create Scripts\SQLite.sql
+		Data\Create Scripts\Sybase.sql = Data\Create Scripts\Sybase.sql
+	EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests.CS", "UnitTests\CS\UnitTests.CS.csproj", "{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests.All", "UnitTests\All\UnitTests.All.csproj", "{6AE74A35-B337-4B17-8092-E1B98DEF06AF}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.4.JointureAddOn", "Extensions\JointureAddOn\BLToolkit.4.JointureAddOn.csproj", "{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Extensions", "Extensions", "{218E3584-CDC7-4A77-AD1A-CF9FBE90F67F}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NuGet", "NuGet", "{4A9C0E31-8697-48BA-A46B-6A5EE78424D6}"
+	ProjectSection(SolutionItems) = preProject
+		NuGet\BLToolkit.DB2.nuspec = NuGet\BLToolkit.DB2.nuspec
+		NuGet\BLToolkit.DevartOraclePro.nuspec = NuGet\BLToolkit.DevartOraclePro.nuspec
+		NuGet\BLToolkit.Firebird.nuspec = NuGet\BLToolkit.Firebird.nuspec
+		NuGet\BLToolkit.Informix.nuspec = NuGet\BLToolkit.Informix.nuspec
+		NuGet\BLToolkit.MySql.nuspec = NuGet\BLToolkit.MySql.nuspec
+		NuGet\BLToolkit.nuspec = NuGet\BLToolkit.nuspec
+		NuGet\BLToolkit.Oracle.nuspec = NuGet\BLToolkit.Oracle.nuspec
+		NuGet\BLToolkit.PostgreSql.nuspec = NuGet\BLToolkit.PostgreSql.nuspec
+		NuGet\BLToolkit.SqlCe.nuspec = NuGet\BLToolkit.SqlCe.nuspec
+		NuGet\BLToolkit.SQLite.nuspec = NuGet\BLToolkit.SQLite.nuspec
+		NuGet\BLToolkit.Sybase.nuspec = NuGet\BLToolkit.Sybase.nuspec
+		NuGet\BLToolkit.symbols.nuspec = NuGet\BLToolkit.symbols.nuspec
+	EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.4", "Source\BLToolkit.Data.4.csproj", "{0C325F5D-E50E-4340-8724-D29896CCC584}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.CP.4", "Source\BLToolkit.CP.4.csproj", "{0C325F5D-E50E-4340-8724-D29896CCC585}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NorthwindDataService", "Demo\WebServices\NorthwindDataService\NorthwindDataService.csproj", "{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.OracleManaged.4", "DataProviders\Oracle\BLToolkit.Data.DataProvider.OracleManaged.4.csproj", "{785CE174-0A91-465F-9E41-65E6E05A0EC9}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.DevartOracle.4", "DataProviders\DevartOraclePro\BLToolkit.Data.DataProvider.DevartOracle.4.csproj", "{CB303F0B-0AA3-4589-850A-95E985A09492}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug FW 3.5|Any CPU = Debug FW 3.5|Any CPU
+		Debug FW 3.5|Mixed Platforms = Debug FW 3.5|Mixed Platforms
+		Debug FW 3.5|Win32 = Debug FW 3.5|Win32
+		Debug FW 3.5|x64 = Debug FW 3.5|x64
+		Debug FW 3.5|x86 = Debug FW 3.5|x86
+		Debug|Any CPU = Debug|Any CPU
+		Debug|Mixed Platforms = Debug|Mixed Platforms
+		Debug|Win32 = Debug|Win32
+		Debug|x64 = Debug|x64
+		Debug|x86 = Debug|x86
+		DebugMono|Any CPU = DebugMono|Any CPU
+		DebugMono|Mixed Platforms = DebugMono|Mixed Platforms
+		DebugMono|Win32 = DebugMono|Win32
+		DebugMono|x64 = DebugMono|x64
+		DebugMono|x86 = DebugMono|x86
+		Release|Any CPU = Release|Any CPU
+		Release|Mixed Platforms = Release|Mixed Platforms
+		Release|Win32 = Release|Win32
+		Release|x64 = Release|x64
+		Release|x86 = Release|x86
+		ReleaseMono|Any CPU = ReleaseMono|Any CPU
+		ReleaseMono|Mixed Platforms = ReleaseMono|Mixed Platforms
+		ReleaseMono|Win32 = ReleaseMono|Win32
+		ReleaseMono|x64 = ReleaseMono|x64
+		ReleaseMono|x86 = ReleaseMono|x86
+		Template|Any CPU = Template|Any CPU
+		Template|Mixed Platforms = Template|Mixed Platforms
+		Template|Win32 = Template|Win32
+		Template|x64 = Template|x64
+		Template|x86 = Template|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug FW 3.5|Any CPU.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug FW 3.5|Any CPU.Build.0 = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug FW 3.5|Mixed Platforms.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug FW 3.5|Mixed Platforms.Build.0 = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug FW 3.5|Win32.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug FW 3.5|x64.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug FW 3.5|x86.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|Win32.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|x64.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|x86.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Template|Any CPU.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Template|Any CPU.Build.0 = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Template|Mixed Platforms.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Template|Mixed Platforms.Build.0 = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Template|Win32.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Template|x64.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Template|x86.ActiveCfg = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug FW 3.5|Any CPU.ActiveCfg = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug FW 3.5|Any CPU.Build.0 = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug FW 3.5|Mixed Platforms.ActiveCfg = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug FW 3.5|Mixed Platforms.Build.0 = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug FW 3.5|Win32.ActiveCfg = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug FW 3.5|x64.ActiveCfg = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug FW 3.5|x86.ActiveCfg = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Release|Win32.ActiveCfg = Release|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Release|x64.ActiveCfg = Release|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Release|x86.ActiveCfg = Release|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Template|Any CPU.ActiveCfg = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Template|Any CPU.Build.0 = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Template|Mixed Platforms.ActiveCfg = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Template|Mixed Platforms.Build.0 = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Template|Win32.ActiveCfg = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Template|x64.ActiveCfg = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Template|x86.ActiveCfg = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug FW 3.5|Any CPU.ActiveCfg = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug FW 3.5|Any CPU.Build.0 = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug FW 3.5|Mixed Platforms.ActiveCfg = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug FW 3.5|Mixed Platforms.Build.0 = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug FW 3.5|Win32.ActiveCfg = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug FW 3.5|x64.ActiveCfg = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug FW 3.5|x86.ActiveCfg = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Release|Win32.ActiveCfg = Release|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Release|x64.ActiveCfg = Release|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Release|x86.ActiveCfg = Release|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Template|Any CPU.ActiveCfg = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Template|Any CPU.Build.0 = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Template|Mixed Platforms.ActiveCfg = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Template|Mixed Platforms.Build.0 = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Template|Win32.ActiveCfg = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Template|x64.ActiveCfg = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Template|x86.ActiveCfg = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug FW 3.5|Any CPU.ActiveCfg = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug FW 3.5|Any CPU.Build.0 = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug FW 3.5|Mixed Platforms.ActiveCfg = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug FW 3.5|Mixed Platforms.Build.0 = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug FW 3.5|Win32.ActiveCfg = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug FW 3.5|x64.ActiveCfg = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug FW 3.5|x86.ActiveCfg = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Release|Any CPU.Build.0 = Release|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Release|Win32.ActiveCfg = Release|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Release|x64.ActiveCfg = Release|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Release|x86.ActiveCfg = Release|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Template|Any CPU.ActiveCfg = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Template|Any CPU.Build.0 = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Template|Mixed Platforms.ActiveCfg = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Template|Mixed Platforms.Build.0 = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Template|Win32.ActiveCfg = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Template|x64.ActiveCfg = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Template|x86.ActiveCfg = Debug FW 3.5|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Release|Win32.ActiveCfg = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Release|x64.ActiveCfg = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Release|x86.ActiveCfg = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Template|Any CPU.Build.0 = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Template|Win32.ActiveCfg = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Template|x64.ActiveCfg = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Template|x86.ActiveCfg = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Release|Any CPU.Build.0 = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Release|Win32.ActiveCfg = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Release|x64.ActiveCfg = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Release|x86.ActiveCfg = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Template|Any CPU.Build.0 = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Template|Win32.ActiveCfg = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Template|x64.ActiveCfg = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Template|x86.ActiveCfg = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Release|Any CPU.Build.0 = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Release|Win32.ActiveCfg = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Release|x64.ActiveCfg = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Release|x86.ActiveCfg = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Template|Any CPU.Build.0 = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Template|Win32.ActiveCfg = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Template|x64.ActiveCfg = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Template|x86.ActiveCfg = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Release|Win32.ActiveCfg = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Release|x64.ActiveCfg = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Release|x86.ActiveCfg = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Template|Any CPU.Build.0 = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Template|Win32.ActiveCfg = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Template|x64.ActiveCfg = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Template|x86.ActiveCfg = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Release|Win32.ActiveCfg = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Release|x64.ActiveCfg = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Release|x86.ActiveCfg = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Template|Any CPU.Build.0 = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Template|Win32.ActiveCfg = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Template|x64.ActiveCfg = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Template|x86.ActiveCfg = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Release|Win32.ActiveCfg = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Release|x64.ActiveCfg = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Release|x86.ActiveCfg = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Template|Any CPU.Build.0 = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Template|Win32.ActiveCfg = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Template|x64.ActiveCfg = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Template|x86.ActiveCfg = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Release|Win32.ActiveCfg = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Release|x64.ActiveCfg = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Release|x86.ActiveCfg = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Template|Any CPU.Build.0 = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Template|Win32.ActiveCfg = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Template|x64.ActiveCfg = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Template|x86.ActiveCfg = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Release|Any CPU.Build.0 = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Release|Win32.ActiveCfg = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Release|x64.ActiveCfg = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Release|x86.ActiveCfg = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Template|Any CPU.Build.0 = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Template|Win32.ActiveCfg = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Template|x64.ActiveCfg = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Template|x86.ActiveCfg = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Release|Win32.ActiveCfg = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Release|x64.ActiveCfg = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Release|x86.ActiveCfg = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Template|Any CPU.Build.0 = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Template|Win32.ActiveCfg = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Template|x64.ActiveCfg = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Template|x86.ActiveCfg = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Release|Win32.ActiveCfg = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Release|x64.ActiveCfg = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Release|x86.ActiveCfg = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Template|Any CPU.Build.0 = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Template|Win32.ActiveCfg = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Template|x64.ActiveCfg = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Template|x86.ActiveCfg = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Release|Any CPU.Build.0 = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Release|Win32.ActiveCfg = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Release|x64.ActiveCfg = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Release|x86.ActiveCfg = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Template|Any CPU.Build.0 = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Template|Win32.ActiveCfg = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Template|x64.ActiveCfg = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Template|x86.ActiveCfg = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Release|Win32.ActiveCfg = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Release|x64.ActiveCfg = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Release|x86.ActiveCfg = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Template|Any CPU.Build.0 = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Template|Win32.ActiveCfg = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Template|x64.ActiveCfg = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Template|x86.ActiveCfg = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Release|Win32.ActiveCfg = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Release|x64.ActiveCfg = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Release|x86.ActiveCfg = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Template|Any CPU.Build.0 = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Template|Win32.ActiveCfg = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Template|x64.ActiveCfg = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Template|x86.ActiveCfg = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Release|Win32.ActiveCfg = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Release|x64.ActiveCfg = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Release|x86.ActiveCfg = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Template|Any CPU.Build.0 = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Template|Win32.ActiveCfg = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Template|x64.ActiveCfg = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Template|x86.ActiveCfg = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Release|Win32.ActiveCfg = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Release|x64.ActiveCfg = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Release|x86.ActiveCfg = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Template|Any CPU.Build.0 = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Template|Win32.ActiveCfg = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Template|x64.ActiveCfg = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Template|x86.ActiveCfg = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Release|Any CPU.Build.0 = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Release|Win32.ActiveCfg = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Release|x64.ActiveCfg = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Release|x86.ActiveCfg = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Template|Any CPU.Build.0 = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Template|Win32.ActiveCfg = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Template|x64.ActiveCfg = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Template|x86.ActiveCfg = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Release|Win32.ActiveCfg = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Release|x64.ActiveCfg = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Release|x86.ActiveCfg = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Template|Any CPU.Build.0 = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Template|Win32.ActiveCfg = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Template|x64.ActiveCfg = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Template|x86.ActiveCfg = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Release|Any CPU.Build.0 = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Release|Win32.ActiveCfg = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Release|x64.ActiveCfg = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Release|x86.ActiveCfg = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Template|Any CPU.Build.0 = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Template|Win32.ActiveCfg = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Template|x64.ActiveCfg = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Template|x86.ActiveCfg = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Release|Any CPU.Build.0 = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Release|Win32.ActiveCfg = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Release|x64.ActiveCfg = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Release|x86.ActiveCfg = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Template|Any CPU.Build.0 = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Template|Win32.ActiveCfg = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Template|x64.ActiveCfg = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Template|x86.ActiveCfg = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Release|Any CPU.Build.0 = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Release|Win32.ActiveCfg = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Release|x64.ActiveCfg = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Release|x86.ActiveCfg = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Template|Any CPU.Build.0 = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Template|Win32.ActiveCfg = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Template|x64.ActiveCfg = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Template|x86.ActiveCfg = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Release|Any CPU.Build.0 = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Release|Win32.ActiveCfg = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Release|x64.ActiveCfg = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Release|x86.ActiveCfg = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Template|Any CPU.Build.0 = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Template|Win32.ActiveCfg = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Template|x64.ActiveCfg = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Template|x86.ActiveCfg = Release|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug FW 3.5|Any CPU.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug FW 3.5|Any CPU.Build.0 = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug FW 3.5|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug FW 3.5|Mixed Platforms.Build.0 = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug FW 3.5|Win32.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug FW 3.5|x64.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug FW 3.5|x86.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.DebugMono|Any CPU.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.DebugMono|Any CPU.Build.0 = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.DebugMono|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.DebugMono|Mixed Platforms.Build.0 = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.DebugMono|Win32.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.DebugMono|x64.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.DebugMono|x86.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Release|Any CPU.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Release|Any CPU.Build.0 = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Release|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Release|Mixed Platforms.Build.0 = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Release|Win32.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Release|x64.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Release|x86.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.ReleaseMono|Any CPU.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.ReleaseMono|Any CPU.Build.0 = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.ReleaseMono|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.ReleaseMono|Mixed Platforms.Build.0 = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.ReleaseMono|Win32.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.ReleaseMono|x64.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.ReleaseMono|x86.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Template|Any CPU.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Template|Any CPU.Build.0 = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Template|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Template|Mixed Platforms.Build.0 = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Template|Win32.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Template|x64.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Template|x86.ActiveCfg = Debug|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Release|Any CPU.Build.0 = Release|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Release|Win32.ActiveCfg = Release|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Release|x64.ActiveCfg = Release|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Release|x86.ActiveCfg = Release|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Template|Any CPU.Build.0 = Release|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Template|Win32.ActiveCfg = Release|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Template|x64.ActiveCfg = Release|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Template|x86.ActiveCfg = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Release|Any CPU.Build.0 = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Release|Win32.ActiveCfg = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Release|x64.ActiveCfg = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Release|x86.ActiveCfg = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Template|Any CPU.Build.0 = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Template|Win32.ActiveCfg = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Template|x64.ActiveCfg = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Template|x86.ActiveCfg = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Release|Win32.ActiveCfg = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Release|x64.ActiveCfg = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Release|x86.ActiveCfg = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Template|Any CPU.Build.0 = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Template|Win32.ActiveCfg = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Template|x64.ActiveCfg = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Template|x86.ActiveCfg = Release|Any CPU
+		{FF377109-1931-499F-9346-449D259977F2}.Debug FW 3.5|Any CPU.ActiveCfg = Debug|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Debug FW 3.5|Mixed Platforms.ActiveCfg = Debug|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Debug FW 3.5|Mixed Platforms.Build.0 = Debug|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Debug FW 3.5|Win32.ActiveCfg = Debug|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Debug FW 3.5|Win32.Build.0 = Debug|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Debug FW 3.5|x64.ActiveCfg = Debug|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Debug FW 3.5|x86.ActiveCfg = Debug|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Debug|Any CPU.ActiveCfg = Debug|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Debug|Any CPU.Build.0 = Debug|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Debug|Mixed Platforms.Build.0 = Debug|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Debug|Win32.ActiveCfg = Debug|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Debug|Win32.Build.0 = Debug|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Debug|x64.ActiveCfg = Debug|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Debug|x86.ActiveCfg = Debug|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.DebugMono|Any CPU.ActiveCfg = DebugMono|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.DebugMono|Win32.ActiveCfg = DebugMono|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.DebugMono|Win32.Build.0 = DebugMono|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.DebugMono|x64.ActiveCfg = DebugMono|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.DebugMono|x86.ActiveCfg = DebugMono|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Release|Any CPU.ActiveCfg = Release|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Release|Mixed Platforms.Build.0 = Release|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Release|Win32.ActiveCfg = Release|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Release|Win32.Build.0 = Release|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Release|x64.ActiveCfg = Release|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Release|x86.ActiveCfg = Release|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.ReleaseMono|Win32.Build.0 = ReleaseMono|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Template|Any CPU.ActiveCfg = ReleaseMono|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Template|Mixed Platforms.ActiveCfg = ReleaseMono|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Template|Mixed Platforms.Build.0 = ReleaseMono|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Template|Win32.ActiveCfg = ReleaseMono|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Template|Win32.Build.0 = ReleaseMono|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Template|x64.ActiveCfg = ReleaseMono|Win32
+		{FF377109-1931-499F-9346-449D259977F2}.Template|x86.ActiveCfg = ReleaseMono|Win32
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Release|Win32.ActiveCfg = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Release|x64.ActiveCfg = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Release|x86.ActiveCfg = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Template|Any CPU.Build.0 = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Template|Win32.ActiveCfg = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Template|x64.ActiveCfg = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Template|x86.ActiveCfg = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Release|Any CPU.Build.0 = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Release|Win32.ActiveCfg = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Release|x64.ActiveCfg = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Release|x86.ActiveCfg = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Template|Any CPU.Build.0 = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Template|Win32.ActiveCfg = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Template|x64.ActiveCfg = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Template|x86.ActiveCfg = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Release|Any CPU.Build.0 = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Release|Win32.ActiveCfg = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Release|x64.ActiveCfg = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Release|x86.ActiveCfg = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Template|Any CPU.Build.0 = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Template|Win32.ActiveCfg = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Template|x64.ActiveCfg = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Template|x86.ActiveCfg = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Release|Win32.ActiveCfg = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Release|x64.ActiveCfg = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Release|x86.ActiveCfg = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Template|Any CPU.Build.0 = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Template|Win32.ActiveCfg = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Template|x64.ActiveCfg = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Template|x86.ActiveCfg = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Release|Any CPU.Build.0 = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Release|Win32.ActiveCfg = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Release|x64.ActiveCfg = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Release|x86.ActiveCfg = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Template|Any CPU.Build.0 = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Template|Win32.ActiveCfg = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Template|x64.ActiveCfg = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Template|x86.ActiveCfg = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Release|Win32.ActiveCfg = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Release|x64.ActiveCfg = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Release|x86.ActiveCfg = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Template|Any CPU.Build.0 = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Template|Win32.ActiveCfg = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Template|x64.ActiveCfg = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Template|x86.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug FW 3.5|Any CPU.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug FW 3.5|Any CPU.Build.0 = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug FW 3.5|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug FW 3.5|Mixed Platforms.Build.0 = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug FW 3.5|Win32.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug FW 3.5|x64.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug FW 3.5|x86.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.DebugMono|Any CPU.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.DebugMono|Any CPU.Build.0 = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.DebugMono|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.DebugMono|Mixed Platforms.Build.0 = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.DebugMono|Win32.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.DebugMono|x64.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.DebugMono|x86.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Release|Any CPU.Build.0 = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Release|Win32.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Release|x64.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Release|x86.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.ReleaseMono|Any CPU.Build.0 = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.ReleaseMono|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.ReleaseMono|Mixed Platforms.Build.0 = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.ReleaseMono|Win32.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.ReleaseMono|x64.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.ReleaseMono|x86.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Template|Any CPU.Build.0 = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Template|Win32.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Template|x64.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Template|x86.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug FW 3.5|Any CPU.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug FW 3.5|Any CPU.Build.0 = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug FW 3.5|Mixed Platforms.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug FW 3.5|Mixed Platforms.Build.0 = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug FW 3.5|Win32.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug FW 3.5|x64.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug FW 3.5|x86.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Release|Win32.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Release|x64.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Release|x86.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Template|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Template|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Template|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Template|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Template|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Template|x64.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Template|x86.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug FW 3.5|Any CPU.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug FW 3.5|Any CPU.Build.0 = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug FW 3.5|Mixed Platforms.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug FW 3.5|Mixed Platforms.Build.0 = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug FW 3.5|Win32.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug FW 3.5|x64.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug FW 3.5|x86.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Release|Win32.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Release|x64.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Release|x86.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Template|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Template|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Template|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Template|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Template|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Template|x64.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Template|x86.ActiveCfg = ReleaseMono|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug FW 3.5|Any CPU.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug FW 3.5|Any CPU.Build.0 = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug FW 3.5|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug FW 3.5|Mixed Platforms.Build.0 = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug FW 3.5|Win32.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug FW 3.5|x64.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug FW 3.5|x86.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.DebugMono|Any CPU.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.DebugMono|Any CPU.Build.0 = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.DebugMono|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.DebugMono|Mixed Platforms.Build.0 = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.DebugMono|Win32.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.DebugMono|x64.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.DebugMono|x86.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Release|Any CPU.Build.0 = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Release|Win32.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Release|x64.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Release|x86.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.ReleaseMono|Any CPU.Build.0 = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.ReleaseMono|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.ReleaseMono|Mixed Platforms.Build.0 = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.ReleaseMono|Win32.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.ReleaseMono|x64.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.ReleaseMono|x86.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Template|Any CPU.Build.0 = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Template|Win32.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Template|x64.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Template|x86.ActiveCfg = Release|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Release|Any CPU.Build.0 = Release|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Release|Win32.ActiveCfg = Release|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Release|x64.ActiveCfg = Release|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Release|x86.ActiveCfg = Release|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Template|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Template|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Template|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Template|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Template|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Template|x64.ActiveCfg = ReleaseMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Template|x86.ActiveCfg = ReleaseMono|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug FW 3.5|Any CPU.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug FW 3.5|Any CPU.Build.0 = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug FW 3.5|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug FW 3.5|Mixed Platforms.Build.0 = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug FW 3.5|Win32.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug FW 3.5|x64.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug FW 3.5|x86.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.DebugMono|Any CPU.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.DebugMono|Any CPU.Build.0 = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.DebugMono|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.DebugMono|Mixed Platforms.Build.0 = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.DebugMono|Win32.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.DebugMono|x64.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.DebugMono|x86.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Release|Any CPU.Build.0 = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Release|Win32.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Release|x64.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Release|x86.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.ReleaseMono|Any CPU.Build.0 = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.ReleaseMono|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.ReleaseMono|Mixed Platforms.Build.0 = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.ReleaseMono|Win32.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.ReleaseMono|x64.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.ReleaseMono|x86.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Template|Any CPU.Build.0 = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Template|Win32.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Template|x64.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Template|x86.ActiveCfg = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(NestedProjects) = preSolution
+		{D527524F-EC92-465E-9CAE-86278121675A} = {2CC0A340-512C-4F0D-A5E6-87C042EE13B9}
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B} = {2CC0A340-512C-4F0D-A5E6-87C042EE13B9}
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8} = {2CC0A340-512C-4F0D-A5E6-87C042EE13B9}
+		{4FDE7340-F60F-49BC-86CD-756CCD26C92A} = {2CC0A340-512C-4F0D-A5E6-87C042EE13B9}
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA} = {2CC0A340-512C-4F0D-A5E6-87C042EE13B9}
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF} = {2CC0A340-512C-4F0D-A5E6-87C042EE13B9}
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF} = {C0306556-68F4-4DD5-95F2-AAFEE8FACDFA}
+		{65FC918C-FF12-4C75-96F5-180B552989E5} = {C0306556-68F4-4DD5-95F2-AAFEE8FACDFA}
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC} = {C0306556-68F4-4DD5-95F2-AAFEE8FACDFA}
+		{86BF4F10-3606-4016-9919-84C3335813B6} = {E6CE0ECB-3373-4DC0-98CB-F4E9DC2293C4}
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68} = {E6CE0ECB-3373-4DC0-98CB-F4E9DC2293C4}
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104} = {E6CE0ECB-3373-4DC0-98CB-F4E9DC2293C4}
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD} = {E6CE0ECB-3373-4DC0-98CB-F4E9DC2293C4}
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D} = {E6CE0ECB-3373-4DC0-98CB-F4E9DC2293C4}
+		{5A556D57-0D68-433B-AD78-02849583582B} = {E6CE0ECB-3373-4DC0-98CB-F4E9DC2293C4}
+		{85E90F57-8DE1-4912-8414-28578F4D71CD} = {E6CE0ECB-3373-4DC0-98CB-F4E9DC2293C4}
+		{3E414663-B673-47A8-AB59-0E08FE43DA86} = {E6CE0ECB-3373-4DC0-98CB-F4E9DC2293C4}
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC} = {E6CE0ECB-3373-4DC0-98CB-F4E9DC2293C4}
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9} = {E6CE0ECB-3373-4DC0-98CB-F4E9DC2293C4}
+		{CB303F0B-0AA3-4589-850A-95E985A09492} = {E6CE0ECB-3373-4DC0-98CB-F4E9DC2293C4}
+		{83C0070F-E639-4D65-B392-34F621165A1C} = {B75C60BF-F5B7-472E-A0A8-8A12DDDDAA7D}
+		{0F3F166F-9927-4BC0-855F-ADB0D20218F1} = {B75C60BF-F5B7-472E-A0A8-8A12DDDDAA7D}
+		{35E61C2A-2B8C-4AF4-AD21-353936581EF5} = {B75C60BF-F5B7-472E-A0A8-8A12DDDDAA7D}
+		{9475B894-944A-47CF-855D-93A0C42136C9} = {B75C60BF-F5B7-472E-A0A8-8A12DDDDAA7D}
+		{FC77CB0E-4DBF-4CDF-A1AD-C6F830A849B0} = {B75C60BF-F5B7-472E-A0A8-8A12DDDDAA7D}
+		{2F6B63C4-295A-433C-91CB-CAE4CADE6B8B} = {B75C60BF-F5B7-472E-A0A8-8A12DDDDAA7D}
+		{28693777-369C-4C0D-B076-38F7C0E5D06C} = {83C0070F-E639-4D65-B392-34F621165A1C}
+		{E796EF23-D63D-4EBD-A34D-5F243834933B} = {83C0070F-E639-4D65-B392-34F621165A1C}
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7} = {0F3F166F-9927-4BC0-855F-ADB0D20218F1}
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F} = {0F3F166F-9927-4BC0-855F-ADB0D20218F1}
+		{854749E5-9264-42FF-A576-3B5784C7C14C} = {35E61C2A-2B8C-4AF4-AD21-353936581EF5}
+		{57CE5505-44CB-42E4-A346-3471F68A5B60} = {9475B894-944A-47CF-855D-93A0C42136C9}
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58} = {9475B894-944A-47CF-855D-93A0C42136C9}
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8} = {FC77CB0E-4DBF-4CDF-A1AD-C6F830A849B0}
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE} = {FC77CB0E-4DBF-4CDF-A1AD-C6F830A849B0}
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F} = {FC77CB0E-4DBF-4CDF-A1AD-C6F830A849B0}
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6} = {2F6B63C4-295A-433C-91CB-CAE4CADE6B8B}
+		{711A3803-4395-4E92-9B26-DC8DDDF80366} = {2F6B63C4-295A-433C-91CB-CAE4CADE6B8B}
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F} = {2F6B63C4-295A-433C-91CB-CAE4CADE6B8B}
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423} = {2F6B63C4-295A-433C-91CB-CAE4CADE6B8B}
+		{FF377109-1931-499F-9346-449D259977F2} = {8A7F38C5-EF9A-410B-8539-A58879F3AA22}
+		{34989C73-F82A-4905-9349-D0CF1419CD1C} = {8A7F38C5-EF9A-410B-8539-A58879F3AA22}
+		{308A4189-53AB-460D-B2B1-0EB4B9219654} = {8A7F38C5-EF9A-410B-8539-A58879F3AA22}
+		{8DA66999-005A-49AB-86A9-2C1F62905B50} = {8A7F38C5-EF9A-410B-8539-A58879F3AA22}
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0} = {218E3584-CDC7-4A77-AD1A-CF9FBE90F67F}
+	EndGlobalSection
+EndGlobal
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BLToolkit.2012.sln	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,2071 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.4", "Source\BLToolkit.4.csproj", "{0C325F5D-E50E-4340-8724-D29896CCC583}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UnitTests", "UnitTests", "{2CC0A340-512C-4F0D-A5E6-87C042EE13B9}"
+	ProjectSection(SolutionItems) = preProject
+		UnitTests\BLToolkit.Linq.nunit = UnitTests\BLToolkit.Linq.nunit
+		UnitTests\BLToolkit.nunit = UnitTests\BLToolkit.nunit
+	EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests.Linq.Interface", "UnitTests\Linq\UnitTests.Linq.Interface.csproj", "{D527524F-EC92-465E-9CAE-86278121675A}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "UnitTests.Linq.VisualBasic", "UnitTests\Linq\UnitTests.Linq.VisualBasic.vbproj", "{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests.Linq", "UnitTests\Linq\UnitTests.Linq.csproj", "{07997A18-86D3-47AC-A514-AB1B03E6AEC8}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{C0306556-68F4-4DD5-95F2-AAFEE8FACDFA}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Templates", "Tools\Templates\Templates.csproj", "{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DataProviders", "DataProviders", "{E6CE0ECB-3373-4DC0-98CB-F4E9DC2293C4}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.DB2.4", "DataProviders\DB2\BLToolkit.Data.DataProvider.DB2.4.csproj", "{86BF4F10-3606-4016-9919-84C3335813B6}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.Firebird.4", "DataProviders\Firebird\BLToolkit.Data.DataProvider.Firebird.4.csproj", "{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.Informix.4", "DataProviders\Informix\BLToolkit.Data.DataProvider.Informix.4.csproj", "{B1DEA25C-7667-471B-BBAD-64D017FDD104}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.MySql.4", "DataProviders\MySql\BLToolkit.Data.DataProvider.MySql.4.csproj", "{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.Oracle.4", "DataProviders\Oracle\BLToolkit.Data.DataProvider.Oracle.4.csproj", "{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.PostgreSQL.4", "DataProviders\PostgreSQL\BLToolkit.Data.DataProvider.PostgreSQL.4.csproj", "{5A556D57-0D68-433B-AD78-02849583582B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.SqlCe.4", "DataProviders\SqlCe\BLToolkit.Data.DataProvider.SqlCe.4.csproj", "{85E90F57-8DE1-4912-8414-28578F4D71CD}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.SQLite.4", "DataProviders\SQLite\BLToolkit.Data.DataProvider.SQLite.4.csproj", "{3E414663-B673-47A8-AB59-0E08FE43DA86}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.Sybase.4", "DataProviders\Sybase\BLToolkit.Data.DataProvider.Sybase.4.csproj", "{6CD8CC3D-643D-4D09-8660-A26085C44FBC}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.SL.4", "Source\BLToolkit.SL.4.csproj", "{663D4BFC-F565-41F7-9409-510B560CCEE8}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Demo", "Demo", "{B75C60BF-F5B7-472E-A0A8-8A12DDDDAA7D}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Silverlight", "Silverlight", "{83C0070F-E639-4D65-B392-34F621165A1C}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Client", "Demo\Silverlight\Client\Client.csproj", "{28693777-369C-4C0D-B076-38F7C0E5D06C}"
+	ProjectSection(ProjectDependencies) = postProject
+		{E796EF23-D63D-4EBD-A34D-5F243834933B} = {E796EF23-D63D-4EBD-A34D-5F243834933B}
+	EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Client.Web", "Demo\Silverlight\Client.Web\Client.Web.csproj", "{E796EF23-D63D-4EBD-A34D-5F243834933B}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Partial.Trust", "Partial.Trust", "{0F3F166F-9927-4BC0-855F-ADB0D20218F1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Partial.Trust.Components", "Demo\Partial.Trust\Components\Partial.Trust.Components.csproj", "{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Partial.Trust.Asp.Net", "Demo\Partial.Trust\Asp.Net\Partial.Trust.Asp.Net.csproj", "{16272F10-9E3D-4C24-8761-8A43E9FB525F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLTgen.2010", "Tools\BLTgen\BLTgen.2010.csproj", "{65FC918C-FF12-4C75-96F5-180B552989E5}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WinForms", "WinForms", "{35E61C2A-2B8C-4AF4-AD21-353936581EF5}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Demo", "Demo\WinForms\BLToolkit.Demo.csproj", "{854749E5-9264-42FF-A576-3B5784C7C14C}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Linq", "Linq", "{9475B894-944A-47CF-855D-93A0C42136C9}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Linq.Demo.2010", "Demo\Linq\Demo\Linq.Demo.2010.csproj", "{57CE5505-44CB-42E4-A346-3471F68A5B60}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Linq.OverWCF", "Demo\Linq\OverWCF\Linq.OverWCF.csproj", "{7ED3B518-7CEA-4991-98BD-9752E5F32F58}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Asp.Net", "Asp.Net", "{FC77CB0E-4DBF-4CDF-A1AD-C6F830A849B0}"
+	ProjectSection(SolutionItems) = preProject
+		Demo\Asp.Net\ReadMe.txt = Demo\Asp.Net\ReadMe.txt
+	EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PetShop.ObjectModel", "Demo\Asp.Net\ObjectModel\PetShop.ObjectModel.csproj", "{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PetShop.BusinessLogic", "Demo\Asp.Net\BusinessLogic\PetShop.BusinessLogic.csproj", "{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}"
+EndProject
+Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "Web", "Demo\Asp.Net\Web\", "{7DAA2EBB-A724-498F-93BB-68966E2B738F}"
+	ProjectSection(WebsiteProperties) = preProject
+		SccProjectName = ""
+		SccAuxPath = ""
+		SccLocalPath = ""
+		SccProvider = ""
+		TargetFrameworkMoniker = ".NETFramework,Version%3Dv4.0"
+		ProjectReferences = "{0C325F5D-E50E-4340-8724-D29896CCC583}|BLToolkit.4.dll;{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}|PetShop.BusinessLogic.dll;{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}|PetShop.ObjectModel.dll;"
+		Debug.AspNetCompiler.VirtualPath = "/Web"
+		Debug.AspNetCompiler.PhysicalPath = "Demo\Asp.Net\Web\"
+		Debug.AspNetCompiler.TargetPath = "PrecompiledWeb\Web\"
+		Debug.AspNetCompiler.Updateable = "true"
+		Debug.AspNetCompiler.ForceOverwrite = "true"
+		Debug.AspNetCompiler.FixedNames = "false"
+		Debug.AspNetCompiler.Debug = "True"
+		Release.AspNetCompiler.VirtualPath = "/Web"
+		Release.AspNetCompiler.PhysicalPath = "Demo\Asp.Net\Web\"
+		Release.AspNetCompiler.TargetPath = "PrecompiledWeb\Web\"
+		Release.AspNetCompiler.Updateable = "true"
+		Release.AspNetCompiler.ForceOverwrite = "true"
+		Release.AspNetCompiler.FixedNames = "false"
+		Release.AspNetCompiler.Debug = "False"
+		VWDPort = "51456"
+		VWDDynamicPort = "false"
+	EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebServices", "WebServices", "{2F6B63C4-295A-433C-91CB-CAE4CADE6B8B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjectModel", "Demo\WebServices\ObjectModel\ObjectModel.csproj", "{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Server", "Demo\WebServices\Server\Server.csproj", "{711A3803-4395-4E92-9B26-DC8DDDF80366}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Client", "Demo\WebServices\Client\Client.csproj", "{4EBBF9E9-53B2-493C-ABAB-E915C187558F}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Examples", "Examples", "{8A7F38C5-EF9A-410B-8539-A58879F3AA22}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Examples.CS", "Examples\CS\Examples.CS.csproj", "{34989C73-F82A-4905-9349-D0CF1419CD1C}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Examples.VB", "Examples\VB\Examples.VB.vbproj", "{308A4189-53AB-460D-B2B1-0EB4B9219654}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HowTo", "HowTo\HowTo.csproj", "{8DA66999-005A-49AB-86A9-2C1F62905B50}"
+EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Templates.VB", "Tools\Templates.VB\Templates.VB.vbproj", "{F2B014F7-3807-4938-8F02-3CF8247C47DC}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Create Scripts", "Create Scripts", "{4FDE7340-F60F-49BC-86CD-756CCD26C92A}"
+	ProjectSection(SolutionItems) = preProject
+		Data\Create Scripts\Access.sql = Data\Create Scripts\Access.sql
+		Data\Create Scripts\DB2.sql = Data\Create Scripts\DB2.sql
+		Data\Create Scripts\Firebird2.sql = Data\Create Scripts\Firebird2.sql
+		Data\Create Scripts\Informix.sql = Data\Create Scripts\Informix.sql
+		Data\Create Scripts\MsSql.sql = Data\Create Scripts\MsSql.sql
+		Data\Create Scripts\MySql.sql = Data\Create Scripts\MySql.sql
+		Data\Create Scripts\Oracle.sql = Data\Create Scripts\Oracle.sql
+		Data\Create Scripts\PostgreSQL.sql = Data\Create Scripts\PostgreSQL.sql
+		Data\Create Scripts\SqlCe.sql = Data\Create Scripts\SqlCe.sql
+		Data\Create Scripts\SQLite.sql = Data\Create Scripts\SQLite.sql
+		Data\Create Scripts\Sybase.sql = Data\Create Scripts\Sybase.sql
+	EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests.CS", "UnitTests\CS\UnitTests.CS.csproj", "{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests.All", "UnitTests\All\UnitTests.All.csproj", "{6AE74A35-B337-4B17-8092-E1B98DEF06AF}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.4.JointureAddOn", "Extensions\JointureAddOn\BLToolkit.4.JointureAddOn.csproj", "{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Extensions", "Extensions", "{218E3584-CDC7-4A77-AD1A-CF9FBE90F67F}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NuGet", "NuGet", "{4A9C0E31-8697-48BA-A46B-6A5EE78424D6}"
+	ProjectSection(SolutionItems) = preProject
+		NuGet\BLToolkit.DB2.nuspec = NuGet\BLToolkit.DB2.nuspec
+		NuGet\BLToolkit.DevartOraclePro.nuspec = NuGet\BLToolkit.DevartOraclePro.nuspec
+		NuGet\BLToolkit.Firebird.nuspec = NuGet\BLToolkit.Firebird.nuspec
+		NuGet\BLToolkit.Informix.nuspec = NuGet\BLToolkit.Informix.nuspec
+		NuGet\BLToolkit.MySql.nuspec = NuGet\BLToolkit.MySql.nuspec
+		NuGet\BLToolkit.nuspec = NuGet\BLToolkit.nuspec
+		NuGet\BLToolkit.Oracle.nuspec = NuGet\BLToolkit.Oracle.nuspec
+		NuGet\BLToolkit.PostgreSql.nuspec = NuGet\BLToolkit.PostgreSql.nuspec
+		NuGet\BLToolkit.SqlCe.nuspec = NuGet\BLToolkit.SqlCe.nuspec
+		NuGet\BLToolkit.SQLite.nuspec = NuGet\BLToolkit.SQLite.nuspec
+		NuGet\BLToolkit.Sybase.nuspec = NuGet\BLToolkit.Sybase.nuspec
+		NuGet\BLToolkit.symbols.nuspec = NuGet\BLToolkit.symbols.nuspec
+	EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.4", "Source\BLToolkit.Data.4.csproj", "{0C325F5D-E50E-4340-8724-D29896CCC584}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.CP.4", "Source\BLToolkit.CP.4.csproj", "{0C325F5D-E50E-4340-8724-D29896CCC585}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NorthwindDataService", "Demo\WebServices\NorthwindDataService\NorthwindDataService.csproj", "{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.OracleManaged.4", "DataProviders\Oracle\BLToolkit.Data.DataProvider.OracleManaged.4.csproj", "{785CE174-0A91-465F-9E41-65E6E05A0EC9}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.DevartOracle.4", "DataProviders\DevartOraclePro\BLToolkit.Data.DataProvider.DevartOracle.4.csproj", "{CB303F0B-0AA3-4589-850A-95E985A09492}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests.Fluent", "UnitTests\Fluent\UnitTests.Fluent.csproj", "{527300F8-9F04-434C-8239-4FE5E174FF6B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.Data.DataProvider.Generic.4", "DataProviders\Generic\BLToolkit.Data.DataProvider.Generic.4.csproj", "{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug FW 3.5|Any CPU = Debug FW 3.5|Any CPU
+		Debug FW 3.5|Mixed Platforms = Debug FW 3.5|Mixed Platforms
+		Debug FW 3.5|Win32 = Debug FW 3.5|Win32
+		Debug FW 3.5|x64 = Debug FW 3.5|x64
+		Debug FW 3.5|x86 = Debug FW 3.5|x86
+		Debug|Any CPU = Debug|Any CPU
+		Debug|Mixed Platforms = Debug|Mixed Platforms
+		Debug|Win32 = Debug|Win32
+		Debug|x64 = Debug|x64
+		Debug|x86 = Debug|x86
+		DebugMono|Any CPU = DebugMono|Any CPU
+		DebugMono|Mixed Platforms = DebugMono|Mixed Platforms
+		DebugMono|Win32 = DebugMono|Win32
+		DebugMono|x64 = DebugMono|x64
+		DebugMono|x86 = DebugMono|x86
+		Release|Any CPU = Release|Any CPU
+		Release|Mixed Platforms = Release|Mixed Platforms
+		Release|Win32 = Release|Win32
+		Release|x64 = Release|x64
+		Release|x86 = Release|x86
+		ReleaseMono|Any CPU = ReleaseMono|Any CPU
+		ReleaseMono|Mixed Platforms = ReleaseMono|Mixed Platforms
+		ReleaseMono|Win32 = ReleaseMono|Win32
+		ReleaseMono|x64 = ReleaseMono|x64
+		ReleaseMono|x86 = ReleaseMono|x86
+		Template|Any CPU = Template|Any CPU
+		Template|Mixed Platforms = Template|Mixed Platforms
+		Template|Win32 = Template|Win32
+		Template|x64 = Template|x64
+		Template|x86 = Template|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug FW 3.5|Any CPU.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug FW 3.5|Any CPU.Build.0 = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug FW 3.5|Mixed Platforms.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug FW 3.5|Mixed Platforms.Build.0 = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug FW 3.5|Win32.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug FW 3.5|x64.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug FW 3.5|x86.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|Win32.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|x64.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|x86.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Template|Any CPU.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Template|Any CPU.Build.0 = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Template|Mixed Platforms.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Template|Mixed Platforms.Build.0 = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Template|Win32.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Template|x64.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Template|x86.ActiveCfg = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug FW 3.5|Any CPU.ActiveCfg = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug FW 3.5|Any CPU.Build.0 = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug FW 3.5|Mixed Platforms.ActiveCfg = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug FW 3.5|Mixed Platforms.Build.0 = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug FW 3.5|Win32.ActiveCfg = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug FW 3.5|x64.ActiveCfg = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug FW 3.5|x86.ActiveCfg = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Release|Win32.ActiveCfg = Release|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Release|x64.ActiveCfg = Release|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Release|x86.ActiveCfg = Release|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Template|Any CPU.ActiveCfg = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Template|Any CPU.Build.0 = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Template|Mixed Platforms.ActiveCfg = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Template|Mixed Platforms.Build.0 = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Template|Win32.ActiveCfg = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Template|x64.ActiveCfg = Debug FW 3.5|Any CPU
+		{D527524F-EC92-465E-9CAE-86278121675A}.Template|x86.ActiveCfg = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug FW 3.5|Any CPU.ActiveCfg = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug FW 3.5|Any CPU.Build.0 = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug FW 3.5|Mixed Platforms.ActiveCfg = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug FW 3.5|Mixed Platforms.Build.0 = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug FW 3.5|Win32.ActiveCfg = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug FW 3.5|x64.ActiveCfg = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug FW 3.5|x86.ActiveCfg = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Release|Win32.ActiveCfg = Release|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Release|x64.ActiveCfg = Release|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Release|x86.ActiveCfg = Release|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Template|Any CPU.ActiveCfg = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Template|Any CPU.Build.0 = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Template|Mixed Platforms.ActiveCfg = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Template|Mixed Platforms.Build.0 = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Template|Win32.ActiveCfg = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Template|x64.ActiveCfg = Debug FW 3.5|Any CPU
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}.Template|x86.ActiveCfg = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug FW 3.5|Any CPU.ActiveCfg = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug FW 3.5|Any CPU.Build.0 = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug FW 3.5|Mixed Platforms.ActiveCfg = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug FW 3.5|Mixed Platforms.Build.0 = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug FW 3.5|Win32.ActiveCfg = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug FW 3.5|x64.ActiveCfg = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug FW 3.5|x86.ActiveCfg = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Release|Any CPU.Build.0 = Release|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Release|Win32.ActiveCfg = Release|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Release|x64.ActiveCfg = Release|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Release|x86.ActiveCfg = Release|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Template|Any CPU.ActiveCfg = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Template|Any CPU.Build.0 = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Template|Mixed Platforms.ActiveCfg = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Template|Mixed Platforms.Build.0 = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Template|Win32.ActiveCfg = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Template|x64.ActiveCfg = Debug FW 3.5|Any CPU
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8}.Template|x86.ActiveCfg = Debug FW 3.5|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Release|Win32.ActiveCfg = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Release|x64.ActiveCfg = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Release|x86.ActiveCfg = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Template|Any CPU.Build.0 = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Template|Win32.ActiveCfg = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Template|x64.ActiveCfg = Release|Any CPU
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}.Template|x86.ActiveCfg = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Release|Any CPU.Build.0 = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Release|Win32.ActiveCfg = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Release|x64.ActiveCfg = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Release|x86.ActiveCfg = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Template|Any CPU.Build.0 = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Template|Win32.ActiveCfg = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Template|x64.ActiveCfg = Release|Any CPU
+		{86BF4F10-3606-4016-9919-84C3335813B6}.Template|x86.ActiveCfg = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Release|Any CPU.Build.0 = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Release|Win32.ActiveCfg = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Release|x64.ActiveCfg = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Release|x86.ActiveCfg = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Template|Any CPU.Build.0 = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Template|Win32.ActiveCfg = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Template|x64.ActiveCfg = Release|Any CPU
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}.Template|x86.ActiveCfg = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Release|Win32.ActiveCfg = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Release|x64.ActiveCfg = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Release|x86.ActiveCfg = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Template|Any CPU.Build.0 = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Template|Win32.ActiveCfg = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Template|x64.ActiveCfg = Release|Any CPU
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104}.Template|x86.ActiveCfg = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Release|Win32.ActiveCfg = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Release|x64.ActiveCfg = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Release|x86.ActiveCfg = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Template|Any CPU.Build.0 = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Template|Win32.ActiveCfg = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Template|x64.ActiveCfg = Release|Any CPU
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}.Template|x86.ActiveCfg = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Release|Win32.ActiveCfg = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Release|x64.ActiveCfg = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Release|x86.ActiveCfg = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Template|Any CPU.Build.0 = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Template|Win32.ActiveCfg = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Template|x64.ActiveCfg = Release|Any CPU
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}.Template|x86.ActiveCfg = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Release|Win32.ActiveCfg = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Release|x64.ActiveCfg = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Release|x86.ActiveCfg = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Template|Any CPU.Build.0 = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Template|Win32.ActiveCfg = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Template|x64.ActiveCfg = Release|Any CPU
+		{5A556D57-0D68-433B-AD78-02849583582B}.Template|x86.ActiveCfg = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Release|Any CPU.Build.0 = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Release|Win32.ActiveCfg = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Release|x64.ActiveCfg = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Release|x86.ActiveCfg = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Template|Any CPU.Build.0 = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Template|Win32.ActiveCfg = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Template|x64.ActiveCfg = Release|Any CPU
+		{85E90F57-8DE1-4912-8414-28578F4D71CD}.Template|x86.ActiveCfg = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Release|Win32.ActiveCfg = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Release|x64.ActiveCfg = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Release|x86.ActiveCfg = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Template|Any CPU.Build.0 = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Template|Win32.ActiveCfg = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Template|x64.ActiveCfg = Release|Any CPU
+		{3E414663-B673-47A8-AB59-0E08FE43DA86}.Template|x86.ActiveCfg = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Release|Win32.ActiveCfg = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Release|x64.ActiveCfg = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Release|x86.ActiveCfg = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Template|Any CPU.Build.0 = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Template|Win32.ActiveCfg = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Template|x64.ActiveCfg = Release|Any CPU
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC}.Template|x86.ActiveCfg = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Release|Any CPU.Build.0 = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Release|Win32.ActiveCfg = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Release|x64.ActiveCfg = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Release|x86.ActiveCfg = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Template|Any CPU.Build.0 = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Template|Win32.ActiveCfg = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Template|x64.ActiveCfg = Release|Any CPU
+		{663D4BFC-F565-41F7-9409-510B560CCEE8}.Template|x86.ActiveCfg = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Release|Win32.ActiveCfg = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Release|x64.ActiveCfg = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Release|x86.ActiveCfg = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Template|Any CPU.Build.0 = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Template|Win32.ActiveCfg = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Template|x64.ActiveCfg = Release|Any CPU
+		{28693777-369C-4C0D-B076-38F7C0E5D06C}.Template|x86.ActiveCfg = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Release|Win32.ActiveCfg = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Release|x64.ActiveCfg = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Release|x86.ActiveCfg = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Template|Any CPU.Build.0 = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Template|Win32.ActiveCfg = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Template|x64.ActiveCfg = Release|Any CPU
+		{E796EF23-D63D-4EBD-A34D-5F243834933B}.Template|x86.ActiveCfg = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Release|Win32.ActiveCfg = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Release|x64.ActiveCfg = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Release|x86.ActiveCfg = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Template|Any CPU.Build.0 = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Template|Win32.ActiveCfg = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Template|x64.ActiveCfg = Release|Any CPU
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}.Template|x86.ActiveCfg = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Release|Win32.ActiveCfg = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Release|x64.ActiveCfg = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Release|x86.ActiveCfg = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Template|Any CPU.Build.0 = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Template|Win32.ActiveCfg = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Template|x64.ActiveCfg = Release|Any CPU
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F}.Template|x86.ActiveCfg = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Release|Any CPU.Build.0 = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Release|Win32.ActiveCfg = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Release|x64.ActiveCfg = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Release|x86.ActiveCfg = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Template|Any CPU.Build.0 = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Template|Win32.ActiveCfg = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Template|x64.ActiveCfg = Release|Any CPU
+		{65FC918C-FF12-4C75-96F5-180B552989E5}.Template|x86.ActiveCfg = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Release|Win32.ActiveCfg = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Release|x64.ActiveCfg = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Release|x86.ActiveCfg = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Template|Any CPU.Build.0 = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Template|Win32.ActiveCfg = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Template|x64.ActiveCfg = Release|Any CPU
+		{854749E5-9264-42FF-A576-3B5784C7C14C}.Template|x86.ActiveCfg = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Release|Any CPU.Build.0 = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Release|Win32.ActiveCfg = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Release|x64.ActiveCfg = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Release|x86.ActiveCfg = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Template|Any CPU.Build.0 = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Template|Win32.ActiveCfg = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Template|x64.ActiveCfg = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Template|x86.ActiveCfg = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Release|Any CPU.Build.0 = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Release|Win32.ActiveCfg = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Release|x64.ActiveCfg = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Release|x86.ActiveCfg = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Template|Any CPU.Build.0 = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Template|Win32.ActiveCfg = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Template|x64.ActiveCfg = Release|Any CPU
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58}.Template|x86.ActiveCfg = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Release|Any CPU.Build.0 = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Release|Win32.ActiveCfg = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Release|x64.ActiveCfg = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Release|x86.ActiveCfg = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Template|Any CPU.Build.0 = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Template|Win32.ActiveCfg = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Template|x64.ActiveCfg = Release|Any CPU
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}.Template|x86.ActiveCfg = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Release|Any CPU.Build.0 = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Release|Win32.ActiveCfg = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Release|x64.ActiveCfg = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Release|x86.ActiveCfg = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Template|Any CPU.Build.0 = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Template|Win32.ActiveCfg = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Template|x64.ActiveCfg = Release|Any CPU
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}.Template|x86.ActiveCfg = Release|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug FW 3.5|Any CPU.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug FW 3.5|Any CPU.Build.0 = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug FW 3.5|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug FW 3.5|Mixed Platforms.Build.0 = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug FW 3.5|Win32.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug FW 3.5|x64.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug FW 3.5|x86.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.DebugMono|Any CPU.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.DebugMono|Any CPU.Build.0 = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.DebugMono|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.DebugMono|Mixed Platforms.Build.0 = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.DebugMono|Win32.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.DebugMono|x64.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.DebugMono|x86.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Release|Any CPU.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Release|Any CPU.Build.0 = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Release|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Release|Mixed Platforms.Build.0 = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Release|Win32.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Release|x64.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Release|x86.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.ReleaseMono|Any CPU.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.ReleaseMono|Any CPU.Build.0 = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.ReleaseMono|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.ReleaseMono|Mixed Platforms.Build.0 = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.ReleaseMono|Win32.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.ReleaseMono|x64.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.ReleaseMono|x86.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Template|Any CPU.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Template|Any CPU.Build.0 = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Template|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Template|Mixed Platforms.Build.0 = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Template|Win32.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Template|x64.ActiveCfg = Debug|Any CPU
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F}.Template|x86.ActiveCfg = Debug|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Release|Any CPU.Build.0 = Release|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Release|Win32.ActiveCfg = Release|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Release|x64.ActiveCfg = Release|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Release|x86.ActiveCfg = Release|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Template|Any CPU.Build.0 = Release|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Template|Win32.ActiveCfg = Release|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Template|x64.ActiveCfg = Release|Any CPU
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}.Template|x86.ActiveCfg = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Release|Any CPU.Build.0 = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Release|Win32.ActiveCfg = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Release|x64.ActiveCfg = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Release|x86.ActiveCfg = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Template|Any CPU.Build.0 = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Template|Win32.ActiveCfg = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Template|x64.ActiveCfg = Release|Any CPU
+		{711A3803-4395-4E92-9B26-DC8DDDF80366}.Template|x86.ActiveCfg = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Release|Win32.ActiveCfg = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Release|x64.ActiveCfg = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Release|x86.ActiveCfg = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Template|Any CPU.Build.0 = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Template|Win32.ActiveCfg = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Template|x64.ActiveCfg = Release|Any CPU
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F}.Template|x86.ActiveCfg = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Release|Win32.ActiveCfg = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Release|x64.ActiveCfg = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Release|x86.ActiveCfg = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Template|Any CPU.Build.0 = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Template|Win32.ActiveCfg = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Template|x64.ActiveCfg = Release|Any CPU
+		{34989C73-F82A-4905-9349-D0CF1419CD1C}.Template|x86.ActiveCfg = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Release|Any CPU.Build.0 = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Release|Win32.ActiveCfg = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Release|x64.ActiveCfg = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Release|x86.ActiveCfg = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Template|Any CPU.Build.0 = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Template|Win32.ActiveCfg = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Template|x64.ActiveCfg = Release|Any CPU
+		{308A4189-53AB-460D-B2B1-0EB4B9219654}.Template|x86.ActiveCfg = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Release|Any CPU.Build.0 = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Release|Win32.ActiveCfg = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Release|x64.ActiveCfg = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Release|x86.ActiveCfg = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Template|Any CPU.Build.0 = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Template|Win32.ActiveCfg = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Template|x64.ActiveCfg = Release|Any CPU
+		{8DA66999-005A-49AB-86A9-2C1F62905B50}.Template|x86.ActiveCfg = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Release|Win32.ActiveCfg = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Release|x64.ActiveCfg = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Release|x86.ActiveCfg = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Template|Any CPU.Build.0 = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Template|Win32.ActiveCfg = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Template|x64.ActiveCfg = Release|Any CPU
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC}.Template|x86.ActiveCfg = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Release|Any CPU.Build.0 = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Release|Win32.ActiveCfg = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Release|x64.ActiveCfg = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Release|x86.ActiveCfg = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Template|Any CPU.Build.0 = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Template|Win32.ActiveCfg = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Template|x64.ActiveCfg = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Template|x86.ActiveCfg = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Release|Win32.ActiveCfg = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Release|x64.ActiveCfg = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Release|x86.ActiveCfg = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Template|Any CPU.Build.0 = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Template|Win32.ActiveCfg = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Template|x64.ActiveCfg = Release|Any CPU
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF}.Template|x86.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug FW 3.5|Any CPU.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug FW 3.5|Any CPU.Build.0 = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug FW 3.5|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug FW 3.5|Mixed Platforms.Build.0 = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug FW 3.5|Win32.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug FW 3.5|x64.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug FW 3.5|x86.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.DebugMono|Any CPU.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.DebugMono|Any CPU.Build.0 = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.DebugMono|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.DebugMono|Mixed Platforms.Build.0 = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.DebugMono|Win32.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.DebugMono|x64.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.DebugMono|x86.ActiveCfg = Debug|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Release|Any CPU.Build.0 = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Release|Win32.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Release|x64.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Release|x86.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.ReleaseMono|Any CPU.Build.0 = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.ReleaseMono|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.ReleaseMono|Mixed Platforms.Build.0 = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.ReleaseMono|Win32.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.ReleaseMono|x64.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.ReleaseMono|x86.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Template|Any CPU.Build.0 = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Template|Win32.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Template|x64.ActiveCfg = Release|Any CPU
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}.Template|x86.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug FW 3.5|Any CPU.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug FW 3.5|Any CPU.Build.0 = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug FW 3.5|Mixed Platforms.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug FW 3.5|Mixed Platforms.Build.0 = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug FW 3.5|Win32.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug FW 3.5|x64.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug FW 3.5|x86.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Release|Win32.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Release|x64.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Release|x86.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Template|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Template|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Template|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Template|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Template|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Template|x64.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC584}.Template|x86.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug FW 3.5|Any CPU.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug FW 3.5|Any CPU.Build.0 = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug FW 3.5|Mixed Platforms.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug FW 3.5|Mixed Platforms.Build.0 = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug FW 3.5|Win32.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug FW 3.5|x64.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug FW 3.5|x86.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Release|Win32.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Release|x64.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Release|x86.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Template|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Template|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Template|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Template|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Template|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Template|x64.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC585}.Template|x86.ActiveCfg = ReleaseMono|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug FW 3.5|Any CPU.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug FW 3.5|Any CPU.Build.0 = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug FW 3.5|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug FW 3.5|Mixed Platforms.Build.0 = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug FW 3.5|Win32.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug FW 3.5|x64.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug FW 3.5|x86.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.DebugMono|Any CPU.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.DebugMono|Any CPU.Build.0 = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.DebugMono|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.DebugMono|Mixed Platforms.Build.0 = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.DebugMono|Win32.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.DebugMono|x64.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.DebugMono|x86.ActiveCfg = Debug|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Release|Any CPU.Build.0 = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Release|Win32.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Release|x64.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Release|x86.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.ReleaseMono|Any CPU.Build.0 = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.ReleaseMono|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.ReleaseMono|Mixed Platforms.Build.0 = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.ReleaseMono|Win32.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.ReleaseMono|x64.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.ReleaseMono|x86.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Template|Any CPU.Build.0 = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Template|Win32.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Template|x64.ActiveCfg = Release|Any CPU
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}.Template|x86.ActiveCfg = Release|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug FW 3.5|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug FW 3.5|Any CPU.Build.0 = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug FW 3.5|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug FW 3.5|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug FW 3.5|Win32.ActiveCfg = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug FW 3.5|x64.ActiveCfg = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug FW 3.5|x86.ActiveCfg = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.DebugMono|Win32.ActiveCfg = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Release|Any CPU.Build.0 = Release|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Release|Win32.ActiveCfg = Release|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Release|x64.ActiveCfg = Release|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Release|x86.ActiveCfg = Release|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.ReleaseMono|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Template|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Template|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Template|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Template|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Template|Win32.ActiveCfg = ReleaseMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Template|x64.ActiveCfg = ReleaseMono|Any CPU
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9}.Template|x86.ActiveCfg = ReleaseMono|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug FW 3.5|Any CPU.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug FW 3.5|Any CPU.Build.0 = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug FW 3.5|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug FW 3.5|Mixed Platforms.Build.0 = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug FW 3.5|Win32.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug FW 3.5|x64.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug FW 3.5|x86.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.DebugMono|Any CPU.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.DebugMono|Any CPU.Build.0 = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.DebugMono|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.DebugMono|Mixed Platforms.Build.0 = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.DebugMono|Win32.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.DebugMono|x64.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.DebugMono|x86.ActiveCfg = Debug|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Release|Any CPU.Build.0 = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Release|Win32.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Release|x64.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Release|x86.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.ReleaseMono|Any CPU.Build.0 = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.ReleaseMono|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.ReleaseMono|Mixed Platforms.Build.0 = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.ReleaseMono|Win32.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.ReleaseMono|x64.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.ReleaseMono|x86.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Template|Any CPU.Build.0 = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Template|Win32.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Template|x64.ActiveCfg = Release|Any CPU
+		{CB303F0B-0AA3-4589-850A-95E985A09492}.Template|x86.ActiveCfg = Release|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Debug FW 3.5|Any CPU.ActiveCfg = Debug|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Debug FW 3.5|Any CPU.Build.0 = Debug|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Debug FW 3.5|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Debug FW 3.5|Mixed Platforms.Build.0 = Debug|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Debug FW 3.5|Win32.ActiveCfg = Debug|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Debug FW 3.5|x64.ActiveCfg = Debug|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Debug FW 3.5|x86.ActiveCfg = Debug|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.DebugMono|Any CPU.ActiveCfg = Debug|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.DebugMono|Any CPU.Build.0 = Debug|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.DebugMono|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.DebugMono|Mixed Platforms.Build.0 = Debug|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.DebugMono|Win32.ActiveCfg = Debug|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.DebugMono|x64.ActiveCfg = Debug|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.DebugMono|x86.ActiveCfg = Debug|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Release|Win32.ActiveCfg = Release|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Release|x64.ActiveCfg = Release|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Release|x86.ActiveCfg = Release|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.ReleaseMono|Any CPU.Build.0 = Release|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.ReleaseMono|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.ReleaseMono|Mixed Platforms.Build.0 = Release|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.ReleaseMono|Win32.ActiveCfg = Release|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.ReleaseMono|x64.ActiveCfg = Release|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.ReleaseMono|x86.ActiveCfg = Release|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Template|Any CPU.Build.0 = Release|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Template|Win32.ActiveCfg = Release|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Template|x64.ActiveCfg = Release|Any CPU
+		{527300F8-9F04-434C-8239-4FE5E174FF6B}.Template|x86.ActiveCfg = Release|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Debug FW 3.5|Any CPU.ActiveCfg = Debug|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Debug FW 3.5|Any CPU.Build.0 = Debug|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Debug FW 3.5|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Debug FW 3.5|Mixed Platforms.Build.0 = Debug|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Debug FW 3.5|Win32.ActiveCfg = Debug|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Debug FW 3.5|x64.ActiveCfg = Debug|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Debug FW 3.5|x86.ActiveCfg = Debug|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.DebugMono|Any CPU.ActiveCfg = Debug|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.DebugMono|Any CPU.Build.0 = Debug|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.DebugMono|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.DebugMono|Mixed Platforms.Build.0 = Debug|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.DebugMono|Win32.ActiveCfg = Debug|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.DebugMono|x64.ActiveCfg = Debug|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.DebugMono|x86.ActiveCfg = Debug|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Release|Win32.ActiveCfg = Release|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Release|x64.ActiveCfg = Release|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Release|x86.ActiveCfg = Release|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.ReleaseMono|Any CPU.Build.0 = Release|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.ReleaseMono|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.ReleaseMono|Mixed Platforms.Build.0 = Release|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.ReleaseMono|Win32.ActiveCfg = Release|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.ReleaseMono|x64.ActiveCfg = Release|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.ReleaseMono|x86.ActiveCfg = Release|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Template|Any CPU.ActiveCfg = Release|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Template|Any CPU.Build.0 = Release|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Template|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Template|Mixed Platforms.Build.0 = Release|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Template|Win32.ActiveCfg = Release|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Template|x64.ActiveCfg = Release|Any CPU
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}.Template|x86.ActiveCfg = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(NestedProjects) = preSolution
+		{D527524F-EC92-465E-9CAE-86278121675A} = {2CC0A340-512C-4F0D-A5E6-87C042EE13B9}
+		{D11617AB-9F88-4C74-8ABD-F8580DB4B01B} = {2CC0A340-512C-4F0D-A5E6-87C042EE13B9}
+		{07997A18-86D3-47AC-A514-AB1B03E6AEC8} = {2CC0A340-512C-4F0D-A5E6-87C042EE13B9}
+		{4FDE7340-F60F-49BC-86CD-756CCD26C92A} = {2CC0A340-512C-4F0D-A5E6-87C042EE13B9}
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA} = {2CC0A340-512C-4F0D-A5E6-87C042EE13B9}
+		{6AE74A35-B337-4B17-8092-E1B98DEF06AF} = {2CC0A340-512C-4F0D-A5E6-87C042EE13B9}
+		{527300F8-9F04-434C-8239-4FE5E174FF6B} = {2CC0A340-512C-4F0D-A5E6-87C042EE13B9}
+		{6E0C5565-F9A3-441C-9CB2-8B1878A800EF} = {C0306556-68F4-4DD5-95F2-AAFEE8FACDFA}
+		{65FC918C-FF12-4C75-96F5-180B552989E5} = {C0306556-68F4-4DD5-95F2-AAFEE8FACDFA}
+		{F2B014F7-3807-4938-8F02-3CF8247C47DC} = {C0306556-68F4-4DD5-95F2-AAFEE8FACDFA}
+		{86BF4F10-3606-4016-9919-84C3335813B6} = {E6CE0ECB-3373-4DC0-98CB-F4E9DC2293C4}
+		{C1F8C201-BBD9-44F4-884C-CFF8CC960B68} = {E6CE0ECB-3373-4DC0-98CB-F4E9DC2293C4}
+		{B1DEA25C-7667-471B-BBAD-64D017FDD104} = {E6CE0ECB-3373-4DC0-98CB-F4E9DC2293C4}
+		{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD} = {E6CE0ECB-3373-4DC0-98CB-F4E9DC2293C4}
+		{2B5287F2-A6AC-4D5A-B0A8-01C06144824D} = {E6CE0ECB-3373-4DC0-98CB-F4E9DC2293C4}
+		{5A556D57-0D68-433B-AD78-02849583582B} = {E6CE0ECB-3373-4DC0-98CB-F4E9DC2293C4}
+		{85E90F57-8DE1-4912-8414-28578F4D71CD} = {E6CE0ECB-3373-4DC0-98CB-F4E9DC2293C4}
+		{3E414663-B673-47A8-AB59-0E08FE43DA86} = {E6CE0ECB-3373-4DC0-98CB-F4E9DC2293C4}
+		{6CD8CC3D-643D-4D09-8660-A26085C44FBC} = {E6CE0ECB-3373-4DC0-98CB-F4E9DC2293C4}
+		{785CE174-0A91-465F-9E41-65E6E05A0EC9} = {E6CE0ECB-3373-4DC0-98CB-F4E9DC2293C4}
+		{CB303F0B-0AA3-4589-850A-95E985A09492} = {E6CE0ECB-3373-4DC0-98CB-F4E9DC2293C4}
+		{6E7FE7FC-551F-4273-ACEB-72DC0D01120E} = {E6CE0ECB-3373-4DC0-98CB-F4E9DC2293C4}
+		{83C0070F-E639-4D65-B392-34F621165A1C} = {B75C60BF-F5B7-472E-A0A8-8A12DDDDAA7D}
+		{0F3F166F-9927-4BC0-855F-ADB0D20218F1} = {B75C60BF-F5B7-472E-A0A8-8A12DDDDAA7D}
+		{35E61C2A-2B8C-4AF4-AD21-353936581EF5} = {B75C60BF-F5B7-472E-A0A8-8A12DDDDAA7D}
+		{9475B894-944A-47CF-855D-93A0C42136C9} = {B75C60BF-F5B7-472E-A0A8-8A12DDDDAA7D}
+		{FC77CB0E-4DBF-4CDF-A1AD-C6F830A849B0} = {B75C60BF-F5B7-472E-A0A8-8A12DDDDAA7D}
+		{2F6B63C4-295A-433C-91CB-CAE4CADE6B8B} = {B75C60BF-F5B7-472E-A0A8-8A12DDDDAA7D}
+		{28693777-369C-4C0D-B076-38F7C0E5D06C} = {83C0070F-E639-4D65-B392-34F621165A1C}
+		{E796EF23-D63D-4EBD-A34D-5F243834933B} = {83C0070F-E639-4D65-B392-34F621165A1C}
+		{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7} = {0F3F166F-9927-4BC0-855F-ADB0D20218F1}
+		{16272F10-9E3D-4C24-8761-8A43E9FB525F} = {0F3F166F-9927-4BC0-855F-ADB0D20218F1}
+		{854749E5-9264-42FF-A576-3B5784C7C14C} = {35E61C2A-2B8C-4AF4-AD21-353936581EF5}
+		{57CE5505-44CB-42E4-A346-3471F68A5B60} = {9475B894-944A-47CF-855D-93A0C42136C9}
+		{7ED3B518-7CEA-4991-98BD-9752E5F32F58} = {9475B894-944A-47CF-855D-93A0C42136C9}
+		{BF0811CA-4663-4778-8331-9BEEBCAAC8C8} = {FC77CB0E-4DBF-4CDF-A1AD-C6F830A849B0}
+		{01C318D0-1CB1-4CB4-A5ED-D311665C76EE} = {FC77CB0E-4DBF-4CDF-A1AD-C6F830A849B0}
+		{7DAA2EBB-A724-498F-93BB-68966E2B738F} = {FC77CB0E-4DBF-4CDF-A1AD-C6F830A849B0}
+		{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6} = {2F6B63C4-295A-433C-91CB-CAE4CADE6B8B}
+		{711A3803-4395-4E92-9B26-DC8DDDF80366} = {2F6B63C4-295A-433C-91CB-CAE4CADE6B8B}
+		{4EBBF9E9-53B2-493C-ABAB-E915C187558F} = {2F6B63C4-295A-433C-91CB-CAE4CADE6B8B}
+		{87FB4F28-5DCC-4F21-B83E-59C85E1A7423} = {2F6B63C4-295A-433C-91CB-CAE4CADE6B8B}
+		{34989C73-F82A-4905-9349-D0CF1419CD1C} = {8A7F38C5-EF9A-410B-8539-A58879F3AA22}
+		{308A4189-53AB-460D-B2B1-0EB4B9219654} = {8A7F38C5-EF9A-410B-8539-A58879F3AA22}
+		{8DA66999-005A-49AB-86A9-2C1F62905B50} = {8A7F38C5-EF9A-410B-8539-A58879F3AA22}
+		{9FD2722C-1E6C-4061-8AC0-32EE28808FC0} = {218E3584-CDC7-4A77-AD1A-CF9FBE90F67F}
+	EndGlobalSection
+EndGlobal
Binary file Data/BLToolkitData.mdb has changed
Binary file Data/BLToolkitData.sqlite has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Data/Create Scripts/Access.sql	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,281 @@
+DROP Procedure Person_SelectByKey
+GO
+DROP Procedure Person_SelectAll
+GO
+DROP Procedure Person_SelectByName
+GO
+DROP Procedure Person_SelectListByName
+GO
+DROP Procedure Person_Insert
+GO
+DROP Procedure Person_Update
+GO
+DROP Procedure Person_Delete
+GO
+DROP Procedure Patient_SelectAll
+GO
+DROP Procedure Patient_SelectByName
+GO
+DROP Procedure Scalar_DataReader
+GO
+DROP TABLE Dual
+GO
+DROP TABLE BinaryData
+GO
+DROP TABLE DataTypeTest
+GO
+DROP TABLE Doctor
+GO
+DROP TABLE Patient
+GO
+DROP TABLE Person
+GO
+
+CREATE TABLE Person (
+	PersonID                Int IDENTITY,
+	FirstName               Text(50) NOT NULL,
+	LastName                Text(50) NOT NULL,
+	MiddleName              Text(50),
+	Gender                  Text(1) NOT NULL,
+
+	CONSTRAINT PK_Peson PRIMARY KEY (PersonID)
+)
+GO
+
+CREATE TABLE Doctor (
+	PersonID                Int NOT NULL,
+	Taxonomy                Text(50) NOT NULL,
+
+	CONSTRAINT OK_Doctor PRIMARY KEY (PersonID)
+)
+GO
+
+CREATE TABLE Patient (
+	PersonID                Int NOT NULL,
+	Diagnosis               Text(255) NOT NULL,
+
+	CONSTRAINT PK_Patient PRIMARY KEY (PersonID)
+)
+GO
+
+ALTER TABLE Doctor
+	ADD CONSTRAINT PersonDoctor FOREIGN KEY (PersonID) REFERENCES Person ON UPDATE CASCADE ON DELETE CASCADE;
+GO
+
+ALTER TABLE Patient
+	ADD CONSTRAINT PersonPatient FOREIGN KEY (PersonID) REFERENCES Person ON UPDATE CASCADE ON DELETE CASCADE;
+GO
+
+CREATE TABLE BinaryData (
+	BinaryDataID            AutoIncrement,
+	Data                    Image NOT NULL,
+
+	CONSTRAINT PrimaryKey PRIMARY KEY (BinaryDataID)
+);
+GO
+
+CREATE TABLE DataTypeTest (
+	DataTypeID              AutoIncrement,
+	Binary_                 Image,
+	Boolean_                Long,
+	Byte_                   Byte DEFAULT 0,
+	Bytes_                  Image,
+	Char_                   Text(1),
+	DateTime_               DateTime,
+	Decimal_                Currency DEFAULT 0,
+	Double_                 Double DEFAULT 0,
+	Guid_                   Uniqueidentifier,
+	Int16_                  SmallInt DEFAULT 0,
+	Int32_                  Long DEFAULT 0,
+	Int64_                  Long DEFAULT 0,
+	Money_                  Currency DEFAULT 0,
+	SByte_                  Byte DEFAULT 0,
+	Single_                 Single DEFAULT 0,
+	Stream_                 Image,
+	String_                 Text(50) WITH COMP,
+	UInt16_                 SmallInt DEFAULT 0,
+	UInt32_                 Long DEFAULT 0,
+	UInt64_                 Long DEFAULT 0,    
+	Xml_                    Text WITH COMP,
+
+	CONSTRAINT PrimaryKey PRIMARY KEY (DataTypeID)
+);
+GO
+
+CREATE TABLE Dual (Dummy Text(10));
+GO
+
+INSERT INTO Person (FirstName, LastName, Gender) VALUES ("John",   "Pupkin",    "M")
+GO
+INSERT INTO Person (FirstName, LastName, Gender) VALUES ("Tester", "Testerson", "M")
+GO
+INSERT INTO Doctor (PersonID, Taxonomy)   VALUES (1, "Psychiatry")
+GO
+INSERT INTO Patient (PersonID, Diagnosis) VALUES (2, "Hallucination with Paranoid Bugs' Delirium of Persecution")
+GO
+
+INSERT INTO DataTypeTest
+	(Binary_, Boolean_,   Byte_,  Bytes_,  Char_,  DateTime_, Decimal_,
+	 Double_,    Guid_,  Int16_,  Int32_,  Int64_,    Money_,   SByte_,
+	 Single_,  Stream_, String_, UInt16_, UInt32_,   UInt64_,     Xml_)
+VALUES
+	(   NULL,     NULL,    NULL,    NULL,    NULL,      NULL,     NULL,
+	    NULL,     NULL,    NULL,    NULL,    NULL,      NULL,     NULL,
+	    NULL,     NULL,    NULL,    NULL,    NULL,      NULL,     NULL)
+GO
+
+INSERT INTO DataTypeTest
+	(Binary_, Boolean_,   Byte_,  Bytes_,  Char_,  DateTime_, Decimal_,
+	 Double_,    Guid_,  Int16_,  Int32_,  Int64_,    Money_,   SByte_,
+	 Single_,  Stream_, String_, UInt16_, UInt32_,   UInt64_,
+	 Xml_)
+VALUES
+	(1,        True,      255,  1,         "B",     Now(), 12345.67,
+	1234.567,     1,    32767,  32768, 1000000,   12.3456,      127,
+	1234.123,     "12345678", "string",  32767,   32768, 2000000000,
+	"<root><element strattr='strvalue' intattr='12345'/></root>")
+GO
+
+INSERT INTO  Dual (Dummy) VALUES ('X')
+GO
+
+CREATE Procedure Person_SelectByKey(
+	[@id] Long)
+AS
+SELECT * FROM Person WHERE PersonID = [@id];
+GO
+
+CREATE Procedure Person_SelectAll
+AS
+SELECT * FROM Person;
+GO
+
+CREATE Procedure Person_SelectByName(
+	[@firstName] Text(50),
+	[@lastName]  Text(50))
+AS
+SELECT
+	*
+FROM
+	Person
+WHERE
+	FirstName = [@firstName] AND LastName = [@lastName];
+GO
+
+CREATE Procedure Person_SelectListByName(
+	[@firstName] Text(50),
+	[@lastName]  Text(50))
+AS
+SELECT
+	*
+FROM
+	Person
+WHERE
+	FirstName like [@firstName] AND LastName like [@lastName];
+GO
+
+CREATE Procedure Person_Insert(
+	[@FirstName]  Text(50),
+	[@MiddleName] Text(50),
+	[@LastName]   Text(50),
+	[@Gender]     Text(1))
+AS
+INSERT INTO Person
+	(FirstName, MiddleName, LastName, Gender)
+VALUES
+	([@FirstName], [@MiddleName], [@LastName], [@Gender]);
+GO
+
+CREATE Procedure Person_Update(
+	[@id]         Long,
+	[@PersonID]   Long,
+	[@FirstName]  Text(50),
+	[@MiddleName] Text(50),
+	[@LastName]   Text(50),
+	[@Gender]     Text(1))
+AS
+UPDATE
+	Person
+SET
+	LastName   = [@LastName],
+	FirstName  = [@FirstName],
+	MiddleName = [@MiddleName],
+	Gender     = [@Gender]
+WHERE
+	PersonID = [@id];
+GO
+
+CREATE Procedure Person_Delete(
+	[@PersonID] Long)
+AS
+DELETE FROM Person WHERE PersonID = [@PersonID];
+GO
+
+CREATE Procedure Patient_SelectAll
+AS
+SELECT
+	Person.*, Patient.Diagnosis
+FROM
+	Patient, Person
+WHERE
+	Patient.PersonID = Person.PersonID;
+GO
+
+CREATE Procedure Patient_SelectByName(
+	[@firstName] Text(50),
+	[@lastName]  Text(50))
+AS
+SELECT
+	Person.*, Patient.Diagnosis
+FROM
+	Patient, Person
+WHERE
+	Patient.PersonID = Person.PersonID
+	AND FirstName = [@firstName] AND LastName = [@lastName];
+GO
+
+CREATE Procedure Scalar_DataReader
+AS
+SELECT 12345 AS intField, "54321" AS stringField;
+GO
+
+
+DROP TABLE Parent
+GO
+DROP TABLE Child
+GO
+DROP TABLE GrandChild
+GO
+
+CREATE TABLE Parent     (ParentID int, Value1 int NULL)
+GO
+CREATE TABLE Child      (ParentID int, ChildID int)
+GO
+CREATE TABLE GrandChild (ParentID int, ChildID int, GrandChildID int)
+GO
+DROP TABLE LinqDataTypes
+GO
+
+CREATE TABLE LinqDataTypes
+(
+	ID             int,
+	MoneyValue     decimal(10,4),
+	DateTimeValue  datetime,
+	DateTimeValue2 datetime,
+	BoolValue      bit,
+	GuidValue      uniqueidentifier,
+	BinaryValue    OleObject NULL,
+	SmallIntValue  smallint,
+	IntValue       int       NULL,
+	BigIntValue    long      NULL
+)
+GO
+
+DROP TABLE TestIdentity
+GO
+
+CREATE TABLE TestIdentity (
+	ID Int IDENTITY,
+	CONSTRAINT PK_TestIdentity PRIMARY KEY (ID)
+)
+GO
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Data/Create Scripts/DB2.sql	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,89 @@
+DROP TABLE "Doctor"
+GO
+
+DROP TABLE "Patient"
+GO
+
+DROP TABLE "Person"
+GO
+
+CREATE TABLE "Person"
+( 
+	"PersonID"   INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL,
+	"FirstName"  VARCHAR(50) NOT NULL,
+	"LastName"   VARCHAR(50) NOT NULL,
+	"MiddleName" VARCHAR(50),
+	"Gender"     CHAR(1)     NOT NULL
+)
+GO
+
+INSERT INTO "Person" ("FirstName", "LastName", "Gender") VALUES ('John',   'Pupkin',    'M')
+GO
+INSERT INTO "Person" ("FirstName", "LastName", "Gender") VALUES ('Tester', 'Testerson', 'M')
+GO
+
+-- Doctor Table Extension
+
+CREATE TABLE "Doctor"
+(
+	"PersonID" INTEGER     NOT NULL,
+	"Taxonomy" VARCHAR(50) NOT NULL
+)
+GO
+
+INSERT INTO "Doctor" ("PersonID", "Taxonomy") VALUES (1, 'Psychiatry')
+GO
+
+-- Patient Table Extension
+
+CREATE TABLE "Patient"
+(
+	"PersonID"  INTEGER      NOT NULL,
+	"Diagnosis" VARCHAR(256) NOT NULL
+)
+GO
+
+INSERT INTO "Patient" ("PersonID", "Diagnosis") VALUES (2, 'Hallucination with Paranoid Bugs'' Delirium of Persecution')
+GO
+
+
+DROP TABLE "Parent"
+GO
+DROP TABLE "Child"
+GO
+DROP TABLE "GrandChild"
+GO
+
+CREATE TABLE "Parent"      ("ParentID" int, "Value1" int)
+GO
+CREATE TABLE "Child"       ("ParentID" int, "ChildID" int)
+GO
+CREATE TABLE "GrandChild"  ("ParentID" int, "ChildID" int, "GrandChildID" int)
+GO
+
+
+DROP TABLE "LinqDataTypes"
+GO
+
+CREATE TABLE "LinqDataTypes"
+(
+	"ID"             int,
+	"MoneyValue"     decimal(10,4),
+	"DateTimeValue"  timestamp,
+	"DateTimeValue2" timestamp  NULL,
+	"BoolValue"      smallint,
+	"GuidValue"      char(16) for bit DATA,
+	"BinaryValue"    blob(5000) NULL,
+	"SmallIntValue"  smallint,
+	"IntValue"       int        NULL,
+	"BigIntValue"    bigint     NULL
+)
+GO
+
+DROP TABLE "TestIdentity"
+GO
+
+CREATE TABLE "TestIdentity" (
+	"ID"   INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY NOT NULL
+)
+GO
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Data/Create Scripts/Firebird2.sql	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,598 @@
+DROP PROCEDURE Person_SelectByKey;            COMMIT;
+DROP PROCEDURE Person_SelectAll;              COMMIT;
+DROP PROCEDURE Person_SelectByName;           COMMIT;
+DROP PROCEDURE Person_Insert;                 COMMIT;
+DROP PROCEDURE Person_Insert_OutputParameter; COMMIT;
+DROP PROCEDURE Person_Update;                 COMMIT;
+DROP PROCEDURE Person_Delete;                 COMMIT;
+DROP PROCEDURE Patient_SelectAll;             COMMIT;
+DROP PROCEDURE Patient_SelectByName;          COMMIT;
+DROP PROCEDURE OutRefTest;                    COMMIT;
+DROP PROCEDURE OutRefEnumTest;                COMMIT;
+DROP PROCEDURE Scalar_DataReader;             COMMIT;
+DROP PROCEDURE Scalar_OutputParameter;        COMMIT;
+DROP PROCEDURE Scalar_ReturnParameter;        COMMIT;
+
+DROP TRIGGER CREATE_BinaryDataID;             COMMIT;
+DROP TRIGGER CHANGE_BinaryData;               COMMIT;
+DROP TRIGGER CREATE_PersonID;                 COMMIT;
+DROP TRIGGER CREATE_DataTypeTest;             COMMIT;
+
+DROP GENERATOR DataTypeID;                    COMMIT;
+DROP GENERATOR PersonID;                      COMMIT;
+DROP GENERATOR TimestampGen;                  COMMIT;
+
+DROP VIEW PersonView;                         COMMIT;
+
+DROP TABLE Dual;                              COMMIT;
+DROP TABLE DataTypeTest;                      COMMIT;
+DROP TABLE BinaryData;                        COMMIT;
+DROP TABLE Doctor;                            COMMIT;
+DROP TABLE Patient;                           COMMIT;
+DROP TABLE Person;                            COMMIT;
+
+DROP EXTERNAL FUNCTION rtrim;                 COMMIT;
+DROP EXTERNAL FUNCTION ltrim;                 COMMIT;
+
+
+DECLARE EXTERNAL FUNCTION ltrim 
+	CSTRING(255) NULL
+	RETURNS CSTRING(255) FREE_IT
+	ENTRY_POINT 'IB_UDF_ltrim' MODULE_NAME 'ib_udf';
+COMMIT;
+
+DECLARE EXTERNAL FUNCTION rtrim 
+	CSTRING(255) NULL
+	RETURNS CSTRING(255) FREE_IT
+	ENTRY_POINT 'IB_UDF_rtrim' MODULE_NAME 'ib_udf';
+COMMIT;
+
+
+/*
+Dual table FOR supporting queryies LIKE:
+SELECT 1 AS id => SELECT 1 AS "id" *FROM Dual*
+*/
+CREATE TABLE Dual (Dummy  VARCHAR(10));
+COMMIT;
+INSERT INTO  Dual (Dummy) VALUES ('X');
+COMMIT;
+
+-- Person Table
+
+CREATE TABLE Person
+(
+	PersonID   INTEGER     NOT NULL  PRIMARY KEY,
+	FirstName  VARCHAR(50) CHARACTER SET UNICODE_FSS NOT NULL,
+	LastName   VARCHAR(50) CHARACTER SET UNICODE_FSS NOT NULL,
+	MiddleName VARCHAR(50),
+	Gender     CHAR(1)     NOT NULL CHECK (Gender in ('M', 'F', 'U', 'O'))
+); 
+COMMIT;
+
+CREATE GENERATOR PersonID;
+COMMIT;
+
+CREATE GENERATOR TimestampGen;
+COMMIT;
+
+CREATE TRIGGER CREATE_PersonID FOR Person
+BEFORE INSERT POSITION 0
+AS BEGIN
+	NEW.PersonID = GEN_ID(PersonID, 1);
+END
+COMMIT;
+
+INSERT INTO Person (FirstName, LastName, Gender) VALUES ('John',   'Pupkin',    'M');
+COMMIT;
+INSERT INTO Person (FirstName, LastName, Gender) VALUES ('Tester', 'Testerson', 'M');
+COMMIT;
+
+-- Doctor Table Extension
+
+CREATE TABLE Doctor
+(
+	PersonID INTEGER     NOT NULL,
+	Taxonomy VARCHAR(50) NOT NULL,
+		FOREIGN KEY (PersonID) REFERENCES Person (PersonID)
+			ON DELETE CASCADE
+)
+COMMIT;
+
+INSERT INTO Doctor (PersonID, Taxonomy) VALUES (1, 'Psychiatry');
+COMMIT;
+
+-- Patient Table Extension
+
+CREATE TABLE Patient
+(
+	PersonID  int           NOT NULL,
+	Diagnosis VARCHAR(256)  NOT NULL,
+	FOREIGN KEY (PersonID) REFERENCES Person (PersonID)
+			ON DELETE CASCADE
+);
+COMMIT;
+
+INSERT INTO Patient (PersonID, Diagnosis) VALUES (2, 'Hallucination with Paranoid Bugs'' Delirium of Persecution');
+COMMIT;
+
+-- Person_SelectByKey
+
+CREATE PROCEDURE Person_SelectByKey(id INTEGER)
+RETURNS (
+	PersonID   INTEGER,
+	FirstName  VARCHAR(50),
+	LastName   VARCHAR(50),
+	MiddleName VARCHAR(50),
+	Gender     CHAR(1)
+	)
+AS
+BEGIN
+	SELECT PersonID, FirstName, LastName, MiddleName, Gender FROM Person 
+	WHERE PersonID = :id
+	INTO
+		:PersonID,
+		:FirstName,
+		:LastName,
+		:MiddleName,
+		:Gender;
+	SUSPEND;
+END
+COMMIT;
+
+-- Person_SelectAll
+
+CREATE PROCEDURE Person_SelectAll
+RETURNS (
+	PersonID   INTEGER,
+	FirstName  VARCHAR(50),
+	LastName   VARCHAR(50),
+	MiddleName VARCHAR(50),
+	Gender     CHAR(1)
+	)
+AS
+BEGIN
+	FOR 
+		SELECT PersonID, FirstName, LastName, MiddleName, Gender FROM Person 
+		INTO
+			:PersonID,
+			:FirstName,
+			:LastName,
+			:MiddleName,
+			:Gender
+	DO SUSPEND;
+END
+COMMIT;
+
+-- Person_SelectByName
+
+CREATE PROCEDURE Person_SelectByName (
+	in_FirstName VARCHAR(50),
+	in_LastName  VARCHAR(50)
+	)
+RETURNS (
+	PersonID   int,
+	FirstName  VARCHAR(50),
+	LastName   VARCHAR(50),
+	MiddleName VARCHAR(50),
+	Gender     CHAR(1)
+	)
+AS
+BEGIN
+
+	FOR SELECT PersonID, FirstName, LastName, MiddleName, Gender FROM Person 
+		WHERE FirstName LIKE :in_FirstName and LastName LIKE :in_LastName
+	INTO
+		:PersonID,   
+		:FirstName,  
+		:LastName,   
+		:MiddleName, 
+		:Gender 
+	DO SUSPEND;
+END
+COMMIT;
+
+-- Person_Insert
+
+CREATE PROCEDURE Person_Insert(
+	FirstName  VARCHAR(50),
+	LastName   VARCHAR(50),
+	MiddleName VARCHAR(50),
+	Gender     CHAR(1)
+	)
+RETURNS (PersonID INTEGER)
+AS
+BEGIN
+	INSERT INTO Person
+		( LastName,  FirstName,  MiddleName,  Gender)
+	VALUES
+		(:LastName, :FirstName, :MiddleName, :Gender);
+
+	SELECT MAX(PersonID) FROM person
+		INTO :PersonID;
+	SUSPEND;
+END
+COMMIT;
+
+-- Person_Insert_OutputParameter
+
+CREATE PROCEDURE Person_Insert_OutputParameter(
+	FirstName  VARCHAR(50),
+	LastName   VARCHAR(50),
+	MiddleName VARCHAR(50),
+	Gender     CHAR(1)
+	)
+RETURNS (PersonID INTEGER)
+AS
+BEGIN
+	INSERT INTO Person
+		( LastName,  FirstName,  MiddleName,  Gender)
+	VALUES
+		(:LastName, :FirstName, :MiddleName, :Gender);
+
+	SELECT max(PersonID) FROM person
+	INTO :PersonID;
+	SUSPEND;
+END
+COMMIT;
+
+-- Person_Update
+
+CREATE PROCEDURE Person_Update(
+	PersonID   INTEGER,
+	FirstName  VARCHAR(50),
+	LastName   VARCHAR(50),
+	MiddleName VARCHAR(50),
+	Gender     CHAR(1)
+	)
+AS
+BEGIN
+	UPDATE
+		Person
+	SET
+		LastName   = :LastName,
+		FirstName  = :FirstName,
+		MiddleName = :MiddleName,
+		Gender     = :Gender
+	WHERE
+		PersonID = :PersonID;
+END
+COMMIT;
+
+-- Person_Delete
+
+CREATE PROCEDURE Person_Delete(
+	PersonID INTEGER
+	)
+AS
+BEGIN
+	DELETE FROM Person WHERE PersonID = :PersonID;
+END
+COMMIT;
+
+-- Patient_SelectAll
+
+CREATE PROCEDURE Patient_SelectAll
+RETURNS (
+	PersonID   int,
+	FirstName  VARCHAR(50),
+	LastName   VARCHAR(50),
+	MiddleName VARCHAR(50),
+	Gender     CHAR(1),
+	Diagnosis  VARCHAR(256)
+	)
+AS
+BEGIN
+	FOR 
+		SELECT
+			Person.PersonID,
+			FirstName,
+			LastName,
+			MiddleName,
+			Gender,
+			Patient.Diagnosis
+		FROM
+			Patient, Person
+		WHERE
+			Patient.PersonID = Person.PersonID
+		INTO
+			:PersonID,
+			:FirstName,
+			:LastName,
+			:MiddleName,
+			:Gender,
+			:Diagnosis
+	DO SUSPEND;
+END
+COMMIT;
+
+-- Patient_SelectByName
+
+CREATE PROCEDURE Patient_SelectByName(
+	FirstName VARCHAR(50),
+	LastName  VARCHAR(50)
+	)
+RETURNS (
+	PersonID   int,
+	MiddleName VARCHAR(50),
+	Gender     CHAR(1),
+	Diagnosis  VARCHAR(256)
+	)
+AS
+BEGIN
+	FOR 
+		SELECT
+			Person.PersonID, 
+			MiddleName,
+			Gender,
+			Patient.Diagnosis
+		FROM
+			Patient, Person
+		WHERE
+			Patient.PersonID = Person.PersonID
+			and FirstName = :FirstName and LastName = :LastName
+		INTO
+			:PersonID,   
+			:MiddleName, 
+			:Gender,
+			:Diagnosis
+	DO SUSPEND;
+END
+COMMIT;
+
+-- BinaryData Table
+
+CREATE TABLE BinaryData
+(
+	BinaryDataID INTEGER       NOT NULL PRIMARY KEY,
+	Stamp        INTEGER       NOT NULL,
+	Data         BLOB          NOT NULL
+);
+COMMIT;
+
+CREATE TRIGGER CREATE_BinaryDataID FOR BinaryData
+BEFORE INSERT POSITION 0
+AS BEGIN
+	NEW.BinaryDataID = GEN_ID(PersonID, 1); 
+	NEW.Stamp = GEN_ID(TimestampGen, 1);
+END
+COMMIT;
+
+CREATE TRIGGER CHANGE_BinaryData FOR BinaryData
+beFORe update 
+AS BEGIN
+	NEW.Stamp = GEN_ID(TimestampGen, 1);
+END
+COMMIT;
+
+-- OutRefTest
+
+/*
+Fake input parameters are used to "emulate" input/output parameters.
+Each inout parameter should be defined in RETURNS(...) section
+and allso have a "mirror" in input section, mirror name shoul be:
+FdpDataProvider.InOutInputParameterPrefix + [parameter name]
+ex:
+in_inputOutputID is input mirror FOR inout parameter inputOutputID
+*/
+CREATE PROCEDURE OutRefTest(
+	ID					INTEGER,
+	in_inputOutputID	INTEGER,
+	str					VARCHAR(50),
+	in_inputOutputStr	VARCHAR(50)
+	)
+RETURNS(
+	inputOutputID  INTEGER,
+	inputOutputStr VARCHAR(50),
+	outputID       INTEGER,
+	outputStr      VARCHAR(50)
+	)
+AS
+BEGIN
+	outputID       = ID;
+	inputOutputID  = ID + in_inputOutputID;
+	outputStr      = str;
+	inputOutputStr = str || in_inputOutputStr;
+	SUSPEND;
+END
+COMMIT;
+
+-- OutRefEnumTest
+
+CREATE PROCEDURE OutRefEnumTest(
+		str					VARCHAR(50),
+		in_inputOutputStr	VARCHAR(50)
+		)
+RETURNS (
+	inputOutputStr VARCHAR(50),
+	outputStr      VARCHAR(50)
+	)
+AS
+BEGIN
+	outputStr      = str;
+	inputOutputStr = str || in_inputOutputStr;
+	SUSPEND;
+END
+COMMIT;
+
+-- ExecuteScalarTest
+
+CREATE PROCEDURE Scalar_DataReader
+RETURNS(
+	intField	INTEGER,
+	stringField	VARCHAR(50)
+	)
+AS
+BEGIN
+	intField = 12345;
+	stringField = '54321';
+	SUSPEND;
+END
+COMMIT;
+
+CREATE PROCEDURE Scalar_OutputParameter
+RETURNS (
+	outputInt      INTEGER,
+	outputString   VARCHAR(50)
+	)
+AS
+BEGIN
+	outputInt = 12345;
+	outputString = '54321';
+	SUSPEND;
+END
+COMMIT;
+
+/*
+"Return_Value" is the name for ReturnValue "emulating"
+may be changed: FdpDataProvider.ReturnParameterName
+*/
+CREATE PROCEDURE Scalar_ReturnParameter
+RETURNS (Return_Value INTEGER)
+AS
+BEGIN
+	Return_Value = 12345;
+	SUSPEND;
+END
+COMMIT;
+
+-- Data Types test
+
+/*
+Data definitions according to:
+http://www.firebirdsql.org/manual/migration-mssql-data-types.html
+
+BUT! BLOB is ised for BINARY data! not CHAR
+*/
+
+CREATE TABLE DataTypeTest
+(
+	DataTypeID      INTEGER NOT NULL PRIMARY KEY,
+	Binary_         BLOB,
+	Boolean_        CHAR(1),
+	Byte_           SMALLINT,
+	Bytes_          BLOB,
+	CHAR_           CHAR(1),
+	DateTime_       TIMESTAMP,
+	Decimal_        DECIMAL(10, 2),
+	Double_         DOUBLE PRECISION,
+	Guid_           CHAR(38),
+	Int16_          SMALLINT,
+	Int32_          INTEGER,
+	Int64_          NUMERIC(11),
+	Money_          DECIMAL(18, 4),
+	SByte_          SMALLINT,
+	Single_         FLOAT,
+	Stream_         BLOB,
+	String_         VARCHAR(50) CHARACTER SET UNICODE_FSS,
+	UInt16_         SMALLINT,
+	UInt32_         INTEGER,
+	UInt64_         NUMERIC(11),
+	Xml_            CHAR(1000)
+)
+COMMIT;
+
+CREATE GENERATOR DataTypeID;
+COMMIT;
+
+CREATE TRIGGER CREATE_DataTypeTest FOR DataTypeTest
+BEFORE INSERT POSITION 0
+AS BEGIN
+	NEW.DataTypeID = GEN_ID(DataTypeID, 1); 
+END
+COMMIT;
+
+INSERT INTO DataTypeTest
+	(Binary_, Boolean_,   Byte_,  Bytes_,  CHAR_,  DateTime_, Decimal_,
+	 Double_,    Guid_,  Int16_,  Int32_,  Int64_,    Money_,   SByte_,
+	 Single_,  Stream_, String_, UInt16_, UInt32_,   UInt64_,     Xml_)
+VALUES
+	(   NULL,     NULL,    NULL,    NULL,    NULL,      NULL,     NULL,
+	    NULL,     NULL,    NULL,    NULL,    NULL,      NULL,     NULL,
+	    NULL,     NULL,    NULL,    NULL,    NULL,      NULL,     NULL);
+COMMIT;
+
+INSERT INTO DataTypeTest
+	(Binary_,	Boolean_,	Byte_,   Bytes_,  CHAR_,	DateTime_, Decimal_,
+	 Double_,	Guid_,		Int16_,  Int32_,  Int64_,    Money_,   SByte_,
+	 Single_,	Stream_,	String_, UInt16_, UInt32_,   UInt64_,
+	 Xml_)
+VALUES
+	('dddddddddddddddd', 1,  255,'dddddddddddddddd', 'B', 'NOW', 12345.67,
+	1234.567, 'dddddddddddddddddddddddddddddddd', 32767, 32768, 1000000, 12.3456, 127,
+	1234.123, 'dddddddddddddddd', 'string', 32767, 32768, 200000000,
+	'<root><element strattr="strvalue" intattr="12345"/></root>');
+COMMIT;
+
+
+
+DROP TABLE Parent     COMMIT;
+DROP TABLE Child      COMMIT;
+DROP TABLE GrandChild COMMIT;
+
+CREATE TABLE Parent     (ParentID int, Value1  int)                   COMMIT;
+CREATE TABLE Child      (ParentID int, ChildID int)                   COMMIT;
+CREATE TABLE GrandChild (ParentID int, ChildID int, GrandChildID int) COMMIT;
+
+
+DROP TABLE LinqDataTypes COMMIT;
+
+CREATE TABLE LinqDataTypes
+(
+	ID             int,
+	MoneyValue     decimal(10,4),
+	DateTimeValue  timestamp,
+	DateTimeValue2 timestamp,
+	BoolValue      char(1),
+	GuidValue      char(38),
+	BinaryValue    blob,
+	SmallIntValue  smallint,
+	IntValue       int,
+	BigIntValue    bigint
+)
+COMMIT;
+
+DROP GENERATOR SequenceTestSeq
+COMMIT;
+
+CREATE GENERATOR SequenceTestSeq
+COMMIT;
+
+DROP TABLE SequenceTest COMMIT;
+
+CREATE TABLE SequenceTest
+(
+	ID     int         NOT NULL PRIMARY KEY,
+	Value_ VARCHAR(50) NOT NULL
+)
+COMMIT;
+
+
+DROP TRIGGER CREATE_ID
+COMMIT;
+
+DROP GENERATOR TestIdentityID
+COMMIT;
+
+DROP TABLE TestIdentity
+COMMIT;
+
+CREATE TABLE TestIdentity (
+	ID INTEGER NOT NULL PRIMARY KEY
+)
+COMMIT;
+
+CREATE GENERATOR TestIdentityID;
+COMMIT;
+
+CREATE TRIGGER CREATE_ID FOR TestIdentity
+BEFORE INSERT POSITION 0
+AS BEGIN
+	NEW.ID = GEN_ID(TestIdentityID, 1);
+END
+COMMIT;
+
+
+CREATE VIEW PersonView
+AS
+    SELECT * FROM Person
+COMMIT;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Data/Create Scripts/Informix.sql	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,92 @@
+DROP TABLE Doctor
+GO
+
+DROP TABLE Patient
+GO
+
+DROP TABLE Person
+GO
+
+CREATE TABLE Person
+(
+	PersonID   SERIAL       NOT NULL,
+	FirstName  NVARCHAR(50) NOT NULL,
+	LastName   NVARCHAR(50) NOT NULL,
+	MiddleName NVARCHAR(50),
+	Gender     CHAR(1)      NOT NULL,
+
+	PRIMARY KEY(PersonID)
+)
+GO
+
+INSERT INTO Person (FirstName, LastName, Gender) VALUES ('John',   'Pupkin',    'M')
+GO
+INSERT INTO Person (FirstName, LastName, Gender) VALUES ('Tester', 'Testerson', 'M')
+GO
+
+-- Doctor Table Extension
+
+CREATE TABLE Doctor
+(
+	PersonID int          NOT NULL,
+	Taxonomy nvarchar(50) NOT NULL
+)
+GO
+
+INSERT INTO Doctor (PersonID, Taxonomy) VALUES (1, 'Psychiatry')
+GO
+
+-- Patient Table Extension
+
+CREATE TABLE Patient
+(
+	PersonID  int           NOT NULL,
+	Diagnosis nvarchar(100) NOT NULL
+)
+GO
+
+INSERT INTO Patient (PersonID, Diagnosis) VALUES (2, 'Hallucination with Paranoid Bugs'' Delirium of Persecution')
+GO
+
+
+DROP TABLE Parent
+GO
+DROP TABLE Child
+GO
+DROP TABLE GrandChild
+GO
+
+CREATE TABLE Parent      (ParentID int, Value1 int)
+GO
+CREATE TABLE Child       (ParentID int, ChildID int)
+GO
+CREATE TABLE GrandChild  (ParentID int, ChildID int, GrandChildID int)
+GO
+
+
+DROP TABLE LinqDataTypes
+GO
+
+CREATE TABLE LinqDataTypes
+(
+	ID             int,
+	MoneyValue     decimal(10,4),
+	DateTimeValue  datetime year to fraction(3),
+	DateTimeValue2 datetime year to fraction(3),
+	BoolValue      boolean,
+	GuidValue      char(36),
+	BinaryValue    byte,
+	SmallIntValue  smallint,
+	IntValue       int,
+	BigIntValue    bigint
+)
+GO
+
+DROP TABLE TestIdentity
+GO
+
+CREATE TABLE TestIdentity (
+	ID SERIAL NOT NULL,
+	PRIMARY KEY(ID)
+)
+GO
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Data/Create Scripts/MsSql.sql	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,555 @@
+--CREATE DATABASE BLToolkitData ON PRIMARY
+--(NAME=N'BLToolkitTest',     FILENAME=N'C:\Data\MSSQL.1\MSSQL\DATA\BLToolkitData.mdf',     SIZE=3072KB, FILEGROWTH=1024KB)
+--LOG ON 
+--(NAME=N'BLToolkitTest_log', FILENAME=N'C:\Data\MSSQL.1\MSSQL\DATA\BLToolkitData_log.ldf', SIZE=1024KB, FILEGROWTH=10%)
+--GO
+
+IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID('Doctor') AND type in (N'U'))
+BEGIN DROP TABLE Doctor END
+
+IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID('Patient') AND type in (N'U'))
+BEGIN DROP TABLE Patient END
+
+-- Person Table
+
+IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID('Person') AND type in (N'U'))
+BEGIN DROP TABLE Person END
+
+CREATE TABLE Person
+(
+	PersonID   int          NOT NULL IDENTITY(1,1) CONSTRAINT PK_Person PRIMARY KEY CLUSTERED,
+	FirstName  nvarchar(50) NOT NULL,
+	LastName   nvarchar(50) NOT NULL,
+	MiddleName nvarchar(50)     NULL,
+	Gender     char(1)      NOT NULL CONSTRAINT CK_Person_Gender CHECK (Gender in ('M', 'F', 'U', 'O'))
+)
+ON [PRIMARY]
+GO
+
+INSERT INTO Person (FirstName, LastName, Gender) VALUES ('John',   'Pupkin',    'M')
+GO
+INSERT INTO Person (FirstName, LastName, Gender) VALUES ('Tester', 'Testerson', 'M')
+GO
+
+-- Doctor Table Extension
+
+CREATE TABLE Doctor
+(
+	PersonID int          NOT NULL
+		CONSTRAINT PK_Doctor        PRIMARY KEY CLUSTERED
+		CONSTRAINT FK_Doctor_Person FOREIGN KEY
+			REFERENCES Person ([PersonID])
+			ON UPDATE CASCADE
+			ON DELETE CASCADE,
+	Taxonomy nvarchar(50) NOT NULL
+)
+ON [PRIMARY]
+GO
+
+INSERT INTO Doctor (PersonID, Taxonomy) VALUES (1, 'Psychiatry')
+GO
+
+-- Patient Table Extension
+
+CREATE TABLE Patient
+(
+	PersonID  int           NOT NULL
+		CONSTRAINT PK_Patient        PRIMARY KEY CLUSTERED
+		CONSTRAINT FK_Patient_Person FOREIGN KEY
+			REFERENCES Person ([PersonID])
+			ON UPDATE CASCADE
+			ON DELETE CASCADE,
+	Diagnosis nvarchar(256) NOT NULL
+)
+ON [PRIMARY]
+GO
+
+INSERT INTO Patient (PersonID, Diagnosis) VALUES (2, 'Hallucination with Paranoid Bugs'' Delirium of Persecution')
+GO
+
+-- Person_SelectByKey
+
+IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'Person_SelectByKey')
+BEGIN DROP Procedure Person_SelectByKey
+END
+GO
+
+CREATE Procedure Person_SelectByKey
+	@id int
+AS
+
+SELECT * FROM Person WHERE PersonID = @id
+
+GO
+
+GRANT EXEC ON Person_SelectByKey TO PUBLIC
+GO
+
+-- Person_SelectAll
+
+IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'Person_SelectAll')
+BEGIN DROP Procedure Person_SelectAll END
+GO
+
+CREATE Procedure Person_SelectAll
+AS
+
+SELECT * FROM Person
+
+GO
+
+GRANT EXEC ON Person_SelectAll TO PUBLIC
+GO
+
+-- Person_SelectByName
+
+IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'Person_SelectByName')
+BEGIN DROP Procedure Person_SelectByName END
+GO
+
+CREATE Procedure Person_SelectByName
+	@firstName nvarchar(50),
+	@lastName  nvarchar(50)
+AS
+
+SELECT
+	*
+FROM
+	Person
+WHERE
+	FirstName = @firstName AND LastName = @lastName
+
+GO
+
+GRANT EXEC ON Person_SelectByName TO PUBLIC
+GO
+
+-- Person_SelectListByName
+
+IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'Person_SelectListByName')
+BEGIN DROP Procedure Person_SelectListByName
+END
+GO
+
+CREATE Procedure Person_SelectListByName
+	@firstName nvarchar(50),
+	@lastName  nvarchar(50)
+AS
+
+SELECT
+	*
+FROM
+	Person
+WHERE
+	FirstName like @firstName AND LastName like @lastName
+
+GO
+
+GRANT EXEC ON Person_SelectByName TO PUBLIC
+GO
+
+-- Person_Insert
+
+IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'Person_Insert')
+BEGIN DROP Procedure Person_Insert END
+GO
+
+CREATE Procedure Person_Insert
+	@FirstName  nvarchar(50),
+	@LastName   nvarchar(50),
+	@MiddleName nvarchar(50),
+	@Gender     char(1)
+AS
+
+INSERT INTO Person
+	( LastName,  FirstName,  MiddleName,  Gender)
+VALUES
+	(@LastName, @FirstName, @MiddleName, @Gender)
+
+SELECT Cast(SCOPE_IDENTITY() as int) PersonID
+
+GO
+
+GRANT EXEC ON Person_Insert TO PUBLIC
+GO
+
+-- Person_Insert_OutputParameter
+
+IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'Person_Insert_OutputParameter')
+BEGIN DROP Procedure Person_Insert_OutputParameter END
+GO
+
+CREATE Procedure Person_Insert_OutputParameter
+	@FirstName  nvarchar(50),
+	@LastName   nvarchar(50),
+	@MiddleName nvarchar(50),
+	@Gender     char(1),
+	@PersonID   int output
+AS
+
+INSERT INTO Person
+	( LastName,  FirstName,  MiddleName,  Gender)
+VALUES
+	(@LastName, @FirstName, @MiddleName, @Gender)
+
+SET @PersonID = Cast(SCOPE_IDENTITY() as int)
+
+GO
+
+GRANT EXEC ON Person_Insert_OutputParameter TO PUBLIC
+GO
+
+-- Person_Update
+
+IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'Person_Update')
+BEGIN DROP Procedure Person_Update END
+GO
+
+CREATE Procedure Person_Update
+	@PersonID   int,
+	@FirstName  nvarchar(50),
+	@LastName   nvarchar(50),
+	@MiddleName nvarchar(50),
+	@Gender     char(1)
+AS
+
+UPDATE
+	Person
+SET
+	LastName   = @LastName,
+	FirstName  = @FirstName,
+	MiddleName = @MiddleName,
+	Gender     = @Gender
+WHERE
+	PersonID = @PersonID
+
+GO
+
+GRANT EXEC ON Person_Update TO PUBLIC
+GO
+
+-- Person_Delete
+
+IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'Person_Delete')
+BEGIN DROP Procedure Person_Delete END
+GO
+
+CREATE Procedure Person_Delete
+	@PersonID int
+AS
+
+DELETE FROM Person WHERE PersonID = @PersonID
+
+GO
+
+GRANT EXEC ON Person_Delete TO PUBLIC
+GO
+
+-- Patient_SelectAll
+
+IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'Patient_SelectAll')
+BEGIN DROP Procedure Patient_SelectAll END
+GO
+
+CREATE Procedure Patient_SelectAll
+AS
+
+SELECT
+	Person.*, Patient.Diagnosis
+FROM
+	Patient, Person
+WHERE
+	Patient.PersonID = Person.PersonID
+
+GO
+
+GRANT EXEC ON Patient_SelectAll TO PUBLIC
+GO
+
+-- Patient_SelectByName
+
+IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'Patient_SelectByName')
+BEGIN DROP Procedure Patient_SelectByName END
+GO
+
+CREATE Procedure Patient_SelectByName
+	@firstName nvarchar(50),
+	@lastName  nvarchar(50)
+AS
+
+SELECT
+	Person.*, Patient.Diagnosis
+FROM
+	Patient, Person
+WHERE
+	Patient.PersonID = Person.PersonID
+	AND FirstName = @firstName AND LastName = @lastName
+
+GO
+
+GRANT EXEC ON Person_SelectByName TO PUBLIC
+GO
+
+-- BinaryData Table
+
+IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID('BinaryData') AND type in (N'U'))
+BEGIN DROP TABLE BinaryData END
+
+CREATE TABLE BinaryData
+(
+	BinaryDataID int             NOT NULL IDENTITY(1,1) CONSTRAINT PK_BinaryData PRIMARY KEY CLUSTERED,
+	Stamp        timestamp       NOT NULL,
+	Data         varbinary(1024) NOT NULL)
+ON [PRIMARY]
+GO
+
+-- OutRefTest
+
+IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'OutRefTest')
+BEGIN DROP Procedure OutRefTest END
+GO
+
+CREATE Procedure OutRefTest
+	@ID             int,
+	@outputID       int output,
+	@inputOutputID  int output,
+	@str            varchar(50),
+	@outputStr      varchar(50) output,
+	@inputOutputStr varchar(50) output
+AS
+
+SET @outputID       = @ID
+SET @inputOutputID  = @ID + @inputOutputID
+SET @outputStr      = @str
+SET @inputOutputStr = @str + @inputOutputStr
+
+GO
+
+-- OutRefEnumTest
+
+IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'OutRefEnumTest')
+BEGIN DROP Procedure OutRefEnumTest END
+GO
+
+CREATE Procedure OutRefEnumTest
+	@str            varchar(50),
+	@outputStr      varchar(50) output,
+	@inputOutputStr varchar(50) output
+AS
+
+SET @outputStr      = @str
+SET @inputOutputStr = @str + @inputOutputStr
+
+GO
+
+-- ExecuteScalarTest
+
+IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'Scalar_DataReader')
+BEGIN DROP Procedure Scalar_DataReader END
+GO
+
+CREATE Procedure Scalar_DataReader
+AS
+SELECT Cast(12345 as int) AS intField, Cast('54321' as varchar(50)) AS stringField
+
+GO
+
+IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'Scalar_OutputParameter')
+BEGIN DROP Procedure Scalar_OutputParameter END
+GO
+
+CREATE Procedure Scalar_OutputParameter
+	@outputInt    int = 0 output,
+	@outputString varchar(50) = '' output
+AS
+BEGIN
+	SET @outputInt    = 12345
+	SET @outputString = '54321'
+END
+
+GO
+
+IF EXISTS (SELECT * FROM sys.objects WHERE type in (N'FN', N'IF', N'TF', N'FS', N'FT') AND name = 'Scalar_ReturnParameter')
+BEGIN DROP Function Scalar_ReturnParameter END
+GO
+
+CREATE Function Scalar_ReturnParameter()
+RETURNS int
+AS
+BEGIN
+	RETURN 12345
+END
+
+GO
+
+IF EXISTS (SELECT * FROM sys.objects WHERE type ='P' AND name = 'Scalar_ReturnParameterWithObject')
+BEGIN DROP Procedure Scalar_ReturnParameterWithObject END
+GO
+
+CREATE Procedure Scalar_ReturnParameterWithObject
+	@id int
+AS
+BEGIN
+	SELECT * FROM Person WHERE PersonID = @id
+	RETURN @id
+END
+
+GO
+
+-- Data Types test
+
+IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID('DataTypeTest') AND type in (N'U'))
+BEGIN DROP TABLE DataTypeTest END
+GO
+
+CREATE TABLE DataTypeTest
+(
+	DataTypeID      int          NOT NULL IDENTITY(1,1) CONSTRAINT PK_DataType PRIMARY KEY CLUSTERED,
+	Binary_         binary(50)       NULL,
+	Boolean_        bit              NULL,
+	Byte_           tinyint          NULL,
+	Bytes_          varbinary(50)    NULL,
+	Char_           char(1)          NULL,
+	DateTime_       datetime         NULL,
+	Decimal_        decimal(20,2)    NULL,
+	Double_         float            NULL,
+	Guid_           uniqueidentifier NULL,
+	Int16_          smallint         NULL,
+	Int32_          int              NULL,
+	Int64_          bigint           NULL,
+	Money_          money            NULL,
+	SByte_          tinyint          NULL,
+	Single_         real             NULL,
+	Stream_         varbinary(50)    NULL,
+	String_         nvarchar(50)     NULL,
+	UInt16_         smallint         NULL,
+	UInt32_         int              NULL,
+	UInt64_         bigint           NULL,
+	Xml_            xml              NULL
+) ON [PRIMARY]
+GO
+
+INSERT INTO DataTypeTest
+	(Binary_, Boolean_,   Byte_,  Bytes_,  Char_,  DateTime_, Decimal_,
+	 Double_,    Guid_,  Int16_,  Int32_,  Int64_,    Money_,   SByte_,
+	 Single_,  Stream_, String_, UInt16_, UInt32_,   UInt64_,     Xml_)
+VALUES
+	(   NULL,     NULL,    NULL,    NULL,    NULL,      NULL,     NULL,
+	    NULL,     NULL,    NULL,    NULL,    NULL,      NULL,     NULL,
+	    NULL,     NULL,    NULL,    NULL,    NULL,      NULL,     NULL)
+GO
+
+INSERT INTO DataTypeTest
+	(Binary_, Boolean_,   Byte_,  Bytes_,  Char_,  DateTime_, Decimal_,
+	 Double_,    Guid_,  Int16_,  Int32_,  Int64_,    Money_,   SByte_,
+	 Single_,  Stream_, String_, UInt16_, UInt32_,   UInt64_,
+	 Xml_)
+VALUES
+	(NewID(),        1,     255, NewID(),     'B', GetDate(), 12345.67,
+	1234.567,  NewID(),   32767,   32768, 1000000,   12.3456,      127,
+	1234.123,  NewID(), 'string',  32767,   32768, 200000000,
+	'<root><element strattr="strvalue" intattr="12345"/></root>')
+GO
+
+-- SKIP Sql2005 BEGIN
+--
+-- Arrays
+--
+IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'ArrayTest')
+BEGIN DROP PROCEDURE ArrayTest END
+GO
+
+--IF EXISTS (SELECT * FROM sys.objects WHERE type = 'T' AND name = 'IntArray')
+--BEGIN
+	DROP TYPE IntArray
+--END
+GO
+
+CREATE TYPE IntArray AS TABLE
+(
+	Num int NULL
+)
+GO
+
+CREATE PROCEDURE ArrayTest
+	@InputIntArray IntArray READONLY
+AS
+BEGIN
+	SELECT Num * 2 FROM @InputIntArray;
+END
+GO
+-- SKIP Sql2005 END
+
+DROP FUNCTION GetParentByID
+GO
+
+DROP TABLE Parent
+GO
+DROP TABLE Child
+GO
+DROP TABLE GrandChild
+GO
+
+CREATE TABLE Parent      (ParentID int, Value1 int)
+GO
+CREATE TABLE Child       (ParentID int, ChildID int)
+GO
+CREATE TABLE GrandChild  (ParentID int, ChildID int, GrandChildID int)
+GO
+
+CREATE FUNCTION GetParentByID(@id int)
+RETURNS TABLE
+AS
+RETURN 
+(
+	SELECT * FROM Parent WHERE ParentID = @id
+)
+GO
+
+IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID('LinqDataTypes') AND type in (N'U'))
+BEGIN DROP TABLE LinqDataTypes END
+GO
+
+-- SKIP Sql2005 BEGIN
+CREATE TABLE LinqDataTypes
+(
+	ID             int,
+	MoneyValue     decimal(10,4),
+	DateTimeValue  datetime,
+	DateTimeValue2 datetime2,
+	BoolValue      bit,
+	GuidValue      uniqueidentifier,
+	BinaryValue    varbinary(5000),
+	SmallIntValue  smallint,
+	IntValue       int NULL,
+	BigIntValue    bigint NULL
+)
+GO
+-- SKIP Sql2005 END
+
+-- SKIP Sql2008 BEGIN
+-- SKIP Sql2012 BEGIN
+CREATE TABLE LinqDataTypes
+(
+	ID             int,
+	MoneyValue     decimal(10,4),
+	DateTimeValue  datetime,
+	DateTimeValue2 datetime,
+	BoolValue      bit,
+	GuidValue      uniqueidentifier,
+	BinaryValue    varbinary(5000) NULL,
+	SmallIntValue  smallint,
+	IntValue       int NULL,
+	BigIntValue    bigint NULL
+)
+GO
+-- SKIP Sql2012 END
+-- SKIP Sql2008 END
+
+DROP TABLE TestIdentity
+GO
+
+CREATE TABLE TestIdentity (
+	ID int NOT NULL IDENTITY(1,1) CONSTRAINT PK_TestIdentity PRIMARY KEY CLUSTERED
+)
+GO
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Data/Create Scripts/MsSql2000.sql	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,472 @@
+DROP TABLE Doctor
+DROP TABLE Patient
+DROP TABLE Person
+
+CREATE TABLE Person
+(
+	PersonID   int          NOT NULL IDENTITY(1,1) CONSTRAINT PK_Person PRIMARY KEY CLUSTERED,
+	FirstName  nvarchar(50) NOT NULL,
+	LastName   nvarchar(50) NOT NULL,
+	MiddleName nvarchar(50)     NULL,
+	Gender     char(1)      NOT NULL CONSTRAINT CK_Person_Gender CHECK (Gender in ('M', 'F', 'U', 'O'))
+)
+ON [PRIMARY]
+GO
+
+INSERT INTO Person (FirstName, LastName, Gender) VALUES ('John',   'Pupkin',    'M')
+GO
+INSERT INTO Person (FirstName, LastName, Gender) VALUES ('Tester', 'Testerson', 'M')
+GO
+
+-- Doctor Table Extension
+
+CREATE TABLE Doctor
+(
+	PersonID int          NOT NULL
+		CONSTRAINT PK_Doctor        PRIMARY KEY CLUSTERED
+		CONSTRAINT FK_Doctor_Person FOREIGN KEY
+			REFERENCES Person ([PersonID])
+			ON UPDATE CASCADE
+			ON DELETE CASCADE,
+	Taxonomy nvarchar(50) NOT NULL
+)
+ON [PRIMARY]
+GO
+
+INSERT INTO Doctor (PersonID, Taxonomy) VALUES (1, 'Psychiatry')
+GO
+
+-- Patient Table Extension
+
+CREATE TABLE Patient
+(
+	PersonID  int           NOT NULL
+		CONSTRAINT PK_Patient        PRIMARY KEY CLUSTERED
+		CONSTRAINT FK_Patient_Person FOREIGN KEY
+			REFERENCES Person ([PersonID])
+			ON UPDATE CASCADE
+			ON DELETE CASCADE,
+	Diagnosis nvarchar(256) NOT NULL
+)
+ON [PRIMARY]
+GO
+
+INSERT INTO Patient (PersonID, Diagnosis) VALUES (2, 'Hallucination with Paranoid Bugs'' Delirium of Persecution')
+GO
+
+-- Person_SelectByKey
+
+DROP Procedure Person_SelectByKey
+GO
+
+CREATE Procedure Person_SelectByKey
+	@id int
+AS
+
+SELECT * FROM Person WHERE PersonID = @id
+
+GO
+
+GRANT EXEC ON Person_SelectByKey TO PUBLIC
+GO
+
+-- Person_SelectAll
+
+DROP Procedure Person_SelectAll
+GO
+
+CREATE Procedure Person_SelectAll
+AS
+
+SELECT * FROM Person
+
+GO
+
+GRANT EXEC ON Person_SelectAll TO PUBLIC
+GO
+
+-- Person_SelectByName
+
+DROP Procedure Person_SelectByName
+GO
+
+CREATE Procedure Person_SelectByName
+	@firstName nvarchar(50),
+	@lastName  nvarchar(50)
+AS
+
+SELECT
+	*
+FROM
+	Person
+WHERE
+	FirstName = @firstName AND LastName = @lastName
+
+GO
+
+GRANT EXEC ON Person_SelectByName TO PUBLIC
+GO
+
+-- Person_SelectListByName
+
+DROP Procedure Person_SelectListByName
+GO
+
+CREATE Procedure Person_SelectListByName
+	@firstName nvarchar(50),
+	@lastName  nvarchar(50)
+AS
+
+SELECT
+	*
+FROM
+	Person
+WHERE
+	FirstName like @firstName AND LastName like @lastName
+
+GO
+
+GRANT EXEC ON Person_SelectByName TO PUBLIC
+GO
+
+-- Person_Insert
+
+DROP Procedure Person_Insert
+GO
+
+CREATE Procedure Person_Insert
+	@FirstName  nvarchar(50),
+	@LastName   nvarchar(50),
+	@MiddleName nvarchar(50),
+	@Gender     char(1)
+AS
+
+INSERT INTO Person
+	( LastName,  FirstName,  MiddleName,  Gender)
+VALUES
+	(@LastName, @FirstName, @MiddleName, @Gender)
+
+SELECT Cast(SCOPE_IDENTITY() as int) PersonID
+
+GO
+
+GRANT EXEC ON Person_Insert TO PUBLIC
+GO
+
+-- Person_Insert_OutputParameter
+
+DROP Procedure Person_Insert_OutputParameter
+GO
+
+CREATE Procedure Person_Insert_OutputParameter
+	@FirstName  nvarchar(50),
+	@LastName   nvarchar(50),
+	@MiddleName nvarchar(50),
+	@Gender     char(1),
+	@PersonID   int output
+AS
+
+INSERT INTO Person
+	( LastName,  FirstName,  MiddleName,  Gender)
+VALUES
+	(@LastName, @FirstName, @MiddleName, @Gender)
+
+SET @PersonID = Cast(SCOPE_IDENTITY() as int)
+
+GO
+
+GRANT EXEC ON Person_Insert_OutputParameter TO PUBLIC
+GO
+
+-- Person_Update
+
+DROP Procedure Person_Update
+GO
+
+CREATE Procedure Person_Update
+	@PersonID   int,
+	@FirstName  nvarchar(50),
+	@LastName   nvarchar(50),
+	@MiddleName nvarchar(50),
+	@Gender     char(1)
+AS
+
+UPDATE
+	Person
+SET
+	LastName   = @LastName,
+	FirstName  = @FirstName,
+	MiddleName = @MiddleName,
+	Gender     = @Gender
+WHERE
+	PersonID = @PersonID
+
+GO
+
+GRANT EXEC ON Person_Update TO PUBLIC
+GO
+
+-- Person_Delete
+
+DROP Procedure Person_Delete
+GO
+
+CREATE Procedure Person_Delete
+	@PersonID int
+AS
+
+DELETE FROM Person WHERE PersonID = @PersonID
+
+GO
+
+GRANT EXEC ON Person_Delete TO PUBLIC
+GO
+
+-- Patient_SelectAll
+
+DROP Procedure Patient_SelectAll
+GO
+
+CREATE Procedure Patient_SelectAll
+AS
+
+SELECT
+	Person.*, Patient.Diagnosis
+FROM
+	Patient, Person
+WHERE
+	Patient.PersonID = Person.PersonID
+
+GO
+
+GRANT EXEC ON Patient_SelectAll TO PUBLIC
+GO
+
+-- Patient_SelectByName
+
+DROP Procedure Patient_SelectByName
+GO
+
+CREATE Procedure Patient_SelectByName
+	@firstName nvarchar(50),
+	@lastName  nvarchar(50)
+AS
+
+SELECT
+	Person.*, Patient.Diagnosis
+FROM
+	Patient, Person
+WHERE
+	Patient.PersonID = Person.PersonID
+	AND FirstName = @firstName AND LastName = @lastName
+
+GO
+
+GRANT EXEC ON Person_SelectByName TO PUBLIC
+GO
+
+-- BinaryData Table
+
+DROP TABLE BinaryData
+
+CREATE TABLE BinaryData
+(
+	BinaryDataID int             NOT NULL IDENTITY(1,1) CONSTRAINT PK_BinaryData PRIMARY KEY CLUSTERED,
+	Stamp        timestamp       NOT NULL,
+	Data         varbinary(1024) NOT NULL)
+ON [PRIMARY]
+GO
+
+-- OutRefTest
+
+DROP Procedure OutRefTest
+GO
+
+CREATE Procedure OutRefTest
+	@ID             int,
+	@outputID       int output,
+	@inputOutputID  int output,
+	@str            varchar(50),
+	@outputStr      varchar(50) output,
+	@inputOutputStr varchar(50) output
+AS
+
+SET @outputID       = @ID
+SET @inputOutputID  = @ID + @inputOutputID
+SET @outputStr      = @str
+SET @inputOutputStr = @str + @inputOutputStr
+
+GO
+
+-- OutRefEnumTest
+
+DROP Procedure OutRefEnumTest
+GO
+
+CREATE Procedure OutRefEnumTest
+	@str            varchar(50),
+	@outputStr      varchar(50) output,
+	@inputOutputStr varchar(50) output
+AS
+
+SET @outputStr      = @str
+SET @inputOutputStr = @str + @inputOutputStr
+
+GO
+
+-- ExecuteScalarTest
+
+DROP Procedure Scalar_DataReader
+GO
+
+CREATE Procedure Scalar_DataReader
+AS
+SELECT Cast(12345 as int) AS intField, Cast('54321' as varchar(50)) AS stringField
+
+GO
+
+DROP Procedure Scalar_OutputParameter
+GO
+
+CREATE Procedure Scalar_OutputParameter
+	@outputInt    int = 0 output,
+	@outputString varchar(50) = '' output
+AS
+BEGIN
+	SET @outputInt    = 12345
+	SET @outputString = '54321'
+END
+
+GO
+
+DROP Function Scalar_ReturnParameter
+GO
+
+CREATE Function Scalar_ReturnParameter()
+RETURNS int
+AS
+BEGIN
+	RETURN 12345
+END
+
+GO
+
+DROP Procedure Scalar_ReturnParameterWithObject
+GO
+
+CREATE Procedure Scalar_ReturnParameterWithObject
+	@id int
+AS
+BEGIN
+	SELECT * FROM Person WHERE PersonID = @id
+	RETURN @id
+END
+
+GO
+
+-- Data Types test
+
+DROP TABLE DataTypeTest
+GO
+
+CREATE TABLE DataTypeTest
+(
+	DataTypeID      int          NOT NULL IDENTITY(1,1) CONSTRAINT PK_DataType PRIMARY KEY CLUSTERED,
+	Binary_         binary(50)       NULL,
+	Boolean_        bit              NULL,
+	Byte_           tinyint          NULL,
+	Bytes_          varbinary(50)    NULL,
+	Char_           char(1)          NULL,
+	DateTime_       datetime         NULL,
+	Decimal_        decimal(20,2)    NULL,
+	Double_         float            NULL,
+	Guid_           uniqueidentifier NULL,
+	Int16_          smallint         NULL,
+	Int32_          int              NULL,
+	Int64_          bigint           NULL,
+	Money_          money            NULL,
+	SByte_          tinyint          NULL,
+	Single_         real             NULL,
+	Stream_         varbinary(50)    NULL,
+	String_         nvarchar(50)     NULL,
+	UInt16_         smallint         NULL,
+	UInt32_         int              NULL,
+	UInt64_         bigint           NULL,
+	Xml_            nvarchar(2000)   NULL
+) ON [PRIMARY]
+GO
+
+INSERT INTO DataTypeTest
+	(Binary_, Boolean_,   Byte_,  Bytes_,  Char_,  DateTime_, Decimal_,
+	 Double_,    Guid_,  Int16_,  Int32_,  Int64_,    Money_,   SByte_,
+	 Single_,  Stream_, String_, UInt16_, UInt32_,   UInt64_,     Xml_)
+VALUES
+	(   NULL,     NULL,    NULL,    NULL,    NULL,      NULL,     NULL,
+	    NULL,     NULL,    NULL,    NULL,    NULL,      NULL,     NULL,
+	    NULL,     NULL,    NULL,    NULL,    NULL,      NULL,     NULL)
+GO
+
+INSERT INTO DataTypeTest
+	(Binary_, Boolean_,   Byte_,  Bytes_,  Char_,  DateTime_, Decimal_,
+	 Double_,    Guid_,  Int16_,  Int32_,  Int64_,    Money_,   SByte_,
+	 Single_,  Stream_, String_, UInt16_, UInt32_,   UInt64_,
+	 Xml_)
+VALUES
+	(NewID(),        1,     255, NewID(),     'B', GetDate(), 12345.67,
+	1234.567,  NewID(),   32767,   32768, 1000000,   12.3456,      127,
+	1234.123,  NewID(), 'string',  32767,   32768, 200000000,
+	'<root><element strattr="strvalue" intattr="12345"/></root>')
+GO
+
+
+DROP FUNCTION GetParentByID
+GO
+
+DROP TABLE Parent
+GO
+DROP TABLE Child
+GO
+DROP TABLE GrandChild
+GO
+
+CREATE TABLE Parent      (ParentID int, Value1 int)
+GO
+CREATE TABLE Child       (ParentID int, ChildID int)
+GO
+CREATE TABLE GrandChild  (ParentID int, ChildID int, GrandChildID int)
+GO
+
+CREATE FUNCTION GetParentByID(@id int)
+RETURNS TABLE
+AS
+RETURN 
+(
+	SELECT * FROM Parent WHERE ParentID = @id
+)
+GO
+
+DROP TABLE LinqDataTypes
+GO
+
+CREATE TABLE LinqDataTypes
+(
+	ID             int,
+	MoneyValue     decimal(10,4),
+	DateTimeValue  datetime,
+	DateTimeValue2 datetime,
+	BoolValue      bit,
+	GuidValue      uniqueidentifier,
+	BinaryValue    varbinary(5000) NULL,
+	SmallIntValue  smallint,
+	IntValue       int NULL,
+	BigIntValue    bigint NULL
+)
+GO
+
+DROP TABLE TestIdentity
+GO
+
+CREATE TABLE TestIdentity (
+	ID int NOT NULL IDENTITY(1,1) CONSTRAINT PK_TestIdentity PRIMARY KEY CLUSTERED
+)
+GO
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Data/Create Scripts/MySql.sql	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,478 @@
+
+DROP TABLE Doctor
+GO
+DROP TABLE Patient
+GO
+
+-- Person Table
+
+DROP TABLE Person
+GO
+
+CREATE TABLE Person
+(
+	PersonID   int         AUTO_INCREMENT NOT NULL,
+	FirstName  varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
+	LastName   varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
+	MiddleName varchar(50)     NULL,
+	Gender     char(1)     NOT NULL,
+	CONSTRAINT PK_Person PRIMARY KEY CLUSTERED (PersonID)
+)
+GO
+
+INSERT INTO Person (FirstName, LastName, Gender) VALUES ('John',   'Pupkin',    'M')
+GO
+INSERT INTO Person (FirstName, LastName, Gender) VALUES ('Tester', 'Testerson', 'M')
+GO
+
+-- Doctor Table Extension
+
+CREATE TABLE Doctor
+(
+	PersonID int         NOT NULL,
+	Taxonomy varchar(50) NOT NULL,
+	CONSTRAINT PK_Doctor        PRIMARY KEY CLUSTERED (PersonID),
+	CONSTRAINT FK_Doctor_Person FOREIGN KEY (PersonID)
+		REFERENCES Person(PersonID)
+)
+GO
+
+INSERT INTO Doctor (PersonID, Taxonomy) VALUES (1, 'Psychiatry')
+GO
+
+-- Patient Table Extension
+
+CREATE TABLE Patient
+(
+	PersonID  int          NOT NULL,
+	Diagnosis varchar(256) NOT NULL,
+	CONSTRAINT PK_Patient        PRIMARY KEY CLUSTERED (PersonID),
+	CONSTRAINT FK_Patient_Person FOREIGN KEY (PersonID)
+		REFERENCES Person (PersonID)
+)
+GO
+
+INSERT INTO Patient (PersonID, Diagnosis) VALUES (2, 'Hallucination with Paranoid Bugs'' Delirium of Persecution')
+GO
+
+
+-- GetPersonById
+
+DROP Procedure GetPersonById
+GO
+
+CREATE Procedure GetPersonById(_ID INT)
+BEGIN
+
+	SELECT * FROM Person WHERE PersonID = _ID;
+
+END
+GO
+
+-- GetPersonByName
+
+DROP Procedure GetPersonByName
+GO
+
+CREATE Procedure GetPersonByName
+(
+	_firstName varchar(50),
+	_lastName  varchar(50)
+)
+BEGIN
+
+	SELECT * FROM Person WHERE FirstName = _firstName AND LastName = _lastName;
+
+END
+GO
+
+-- Person_SelectByKey
+
+DROP Procedure Person_SelectByKey
+GO
+
+CREATE Procedure Person_SelectByKey(id int)
+BEGIN
+
+	SELECT * FROM Person WHERE PersonID = id;
+
+END
+GO
+
+-- Person_SelectAll
+
+DROP Procedure Person_SelectAll
+GO
+
+CREATE Procedure Person_SelectAll()
+BEGIN
+
+	SELECT * FROM Person;
+
+END
+GO
+
+-- Person_SelectByName
+
+DROP Procedure Person_SelectByName
+GO
+
+CREATE Procedure Person_SelectByName
+(
+	firstName varchar(50),
+	lastName  varchar(50)
+)
+BEGIN
+
+	SELECT
+		*
+	FROM
+		Person
+	WHERE
+		FirstName = firstName AND LastName = lastName;
+
+END
+GO
+
+-- Person_SelectListByName
+
+DROP Procedure Person_SelectListByName
+GO
+
+CREATE Procedure Person_SelectListByName
+(
+	firstName varchar(50),
+	lastName  varchar(50)
+)
+BEGIN
+
+	SELECT
+		*
+	FROM
+		Person
+	WHERE
+		FirstName like firstName AND LastName like lastName;
+
+END
+GO
+
+-- Person_Insert
+
+DROP Procedure Person_Insert
+GO
+
+CREATE Procedure Person_Insert
+(
+	FirstName  varchar(50),
+	LastName   varchar(50),
+	MiddleName varchar(50),
+	Gender     char(1)
+)
+BEGIN
+
+	INSERT INTO Person
+		(LastName, FirstName, MiddleName, Gender)
+	VALUES
+		(LastName, FirstName, MiddleName, Gender);
+
+	SELECT LAST_INSERT_ID() AS PersonID;
+
+END
+GO
+
+-- Person_Insert_OutputParameter
+
+DROP Procedure Person_Insert_OutputParameter
+GO
+
+CREATE Procedure Person_Insert_OutputParameter
+(
+	FirstName  varchar(50),
+	LastName   varchar(50),
+	MiddleName varchar(50),
+	Gender     char(1),
+	OUT PersonID int
+)
+BEGIN
+
+	INSERT INTO Person
+		(LastName, FirstName, MiddleName, Gender)
+	VALUES
+		(LastName, FirstName, MiddleName, Gender);
+
+	SET PersonID = LAST_INSERT_ID();
+
+END
+GO
+
+-- Person_Update
+
+DROP Procedure Person_Update
+GO
+
+CREATE Procedure Person_Update
+(
+	PersonID   int,
+	FirstName  varchar(50),
+	LastName   varchar(50),
+	MiddleName varchar(50),
+	Gender     char(1)
+)
+BEGIN
+
+	UPDATE
+		Person
+	SET
+		LastName   = LastName,
+		FirstName  = FirstName,
+		MiddleName = MiddleName,
+		Gender     = Gender
+	WHERE
+		PersonID = PersonID;
+
+END
+GO
+
+-- Person_Delete
+
+DROP Procedure Person_Delete
+GO
+
+CREATE Procedure Person_Delete
+(
+	PersonID int
+)
+BEGIN
+
+	DELETE FROM Person WHERE PersonID = PersonID;
+
+END
+GO
+
+-- Patient_SelectAll
+
+DROP Procedure Patient_SelectAll
+GO
+
+CREATE Procedure Patient_SelectAll()
+BEGIN
+
+	SELECT
+		Person.*, Patient.Diagnosis
+	FROM
+		Patient, Person
+	WHERE
+		Patient.PersonID = Person.PersonID;
+
+END
+GO
+
+-- Patient_SelectByName
+
+DROP Procedure Patient_SelectByName
+GO
+
+CREATE Procedure Patient_SelectByName
+(
+	firstName varchar(50),
+	lastName  varchar(50)
+)
+BEGIN
+
+	SELECT
+		Person.*, Patient.Diagnosis
+	FROM
+		Patient, Person
+	WHERE
+		Patient.PersonID = Person.PersonID
+		AND FirstName = firstName AND LastName = lastName;
+
+END
+GO
+
+-- BinaryData Table
+
+DROP TABLE BinaryData
+GO
+
+CREATE TABLE BinaryData
+(
+	BinaryDataID int             AUTO_INCREMENT NOT NULL,
+	Stamp        timestamp       NOT NULL,
+	Data         varbinary(1024) NOT NULL,
+	CONSTRAINT PK_BinaryData PRIMARY KEY CLUSTERED (BinaryDataID)
+)
+GO
+
+-- OutRefTest
+
+DROP Procedure OutRefTest
+GO
+
+CREATE Procedure OutRefTest
+(
+		ID             int,
+	OUT outputID       int,
+	OUT inputOutputID  int,
+		str            varchar(50),
+	OUT outputStr      varchar(50),
+	OUT inputOutputStr varchar(50)
+)
+BEGIN
+
+	SET outputID       = ID;
+	SET inputOutputID  = ID + inputOutputID;
+	SET outputStr      = str;
+	SET inputOutputStr = str + inputOutputStr;
+
+END
+GO
+
+-- OutRefEnumTest
+
+DROP Procedure OutRefEnumTest
+GO
+
+CREATE Procedure OutRefEnumTest
+(
+		str            varchar(50),
+	OUT outputStr      varchar(50),
+	OUT inputOutputStr varchar(50)
+)
+BEGIN
+
+	SET outputStr      = str;
+	SET inputOutputStr = str + inputOutputStr;
+
+END
+GO
+
+-- ExecuteScalarTest
+
+DROP Procedure Scalar_DataReader
+GO
+
+CREATE Procedure Scalar_DataReader()
+BEGIN
+
+	SELECT
+		12345   AS intField,
+		'54321' AS stringField;
+
+END
+GO
+
+DROP Procedure Scalar_OutputParameter
+GO
+
+CREATE Procedure Scalar_OutputParameter
+(
+	OUT outputInt    int,
+	OUT outputString varchar(50)
+)
+BEGIN
+
+	SET outputInt    = 12345;
+	SET outputString = '54321';
+
+END
+GO
+
+-- Data Types test
+
+DROP TABLE DataTypeTest
+GO
+
+CREATE TABLE DataTypeTest
+(
+	DataTypeID      int              AUTO_INCREMENT NOT NULL,
+	Binary_         binary(50)       NULL,
+	Boolean_        bit              NOT NULL,
+	Byte_           tinyint          NULL,
+	Bytes_          varbinary(50)    NULL,
+	Char_           char(1)          NULL,
+	DateTime_       datetime         NULL,
+	Decimal_        decimal(20,2)    NULL,
+	Double_         float            NULL,
+	Guid_           varbinary(50)    NULL,
+	Int16_          smallint         NULL,
+	Int32_          int              NULL,
+	Int64_          bigint           NULL,
+	Money_          decimal(20,4)    NULL,
+	SByte_          tinyint          NULL,
+	Single_         real             NULL,
+	Stream_         varbinary(50)    NULL,
+	String_         varchar(50)      NULL,
+	UInt16_         smallint         NULL,
+	UInt32_         int              NULL,
+	UInt64_         bigint           NULL,
+	Xml_            varchar(1000)    NULL,
+	CONSTRAINT PK_DataType PRIMARY KEY CLUSTERED (DataTypeID)
+)
+GO
+
+INSERT INTO DataTypeTest
+	(Binary_, Boolean_,   Byte_,  Bytes_,  Char_,  DateTime_, Decimal_,
+	 Double_,    Guid_,  Int16_,  Int32_,  Int64_,    Money_,   SByte_,
+	 Single_,  Stream_, String_, UInt16_, UInt32_,   UInt64_,     Xml_)
+VALUES
+	(   NULL,        0,    NULL,    NULL,    NULL,      NULL,     NULL,
+		NULL,     NULL,    NULL,    NULL,    NULL,      NULL,     NULL,
+		NULL,     NULL,    NULL,    NULL,    NULL,      NULL,     NULL)
+GO
+
+INSERT INTO DataTypeTest
+	(Binary_, Boolean_,   Byte_,  Bytes_,  Char_,  DateTime_, Decimal_,
+	 Double_,    Guid_,  Int16_,  Int32_,  Int64_,    Money_,   SByte_,
+	 Single_,  Stream_, String_, UInt16_, UInt32_,   UInt64_,
+	 Xml_)
+VALUES
+	( UUID(),       1,     127,  UUID(),     'B', CurDate(), 12345.67,
+	1234.567,  UUID(),   32767,   32768, 1000000,   12.3456,      127,
+	1234.123,  UUID(), 'string',  32767,   32768, 200000000,
+	'<root><element strattr="strvalue" intattr="12345"/></root>')
+GO
+
+
+
+DROP TABLE Parent
+GO
+DROP TABLE Child
+GO
+DROP TABLE GrandChild
+GO
+
+CREATE TABLE Parent     (ParentID int, Value1 int)
+GO
+CREATE TABLE Child      (ParentID int, ChildID int)
+GO
+CREATE TABLE GrandChild (ParentID int, ChildID int, GrandChildID int)
+GO
+
+
+DROP TABLE LinqDataTypes
+GO
+
+CREATE TABLE LinqDataTypes
+(
+	ID             int,
+	MoneyValue     decimal(10,4),
+	DateTimeValue  datetime,
+	DateTimeValue2 datetime NULL,
+	BoolValue      boolean,
+	GuidValue      char(36),
+	BinaryValue    varbinary(5000) NULL,
+	SmallIntValue  smallint,
+	IntValue       int NULL,
+	BigIntValue    bigint NULL
+)
+GO
+
+DROP TABLE TestIdentity
+GO
+
+CREATE TABLE TestIdentity (
+	ID int AUTO_INCREMENT NOT NULL,
+	CONSTRAINT PK_TestIdentity PRIMARY KEY CLUSTERED (ID)
+)
+GO
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Data/Create Scripts/Oracle.sql	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,658 @@
+-- Person Table
+
+DROP SEQUENCE PersonSeq
+/
+DROP TABLE Doctor
+/
+DROP TABLE Patient
+/
+DROP TABLE Person
+/
+DROP SEQUENCE BinaryDataSeq
+/
+DROP TABLE BinaryData
+/
+DROP SEQUENCE DataTypeTestSeq
+/
+DROP TABLE DataTypeTest
+/
+DROP TABLE GrandChild
+/
+DROP TABLE Child
+/
+DROP TABLE Parent
+/
+DROP TABLE LinqDataTypes
+/
+DROP SEQUENCE SequenceTestSeq
+/
+DROP TABLE SequenceTest
+/
+DROP TABLE "STG_TRADE_INFORMATION"
+/
+DROP table t_test_user_contract
+/
+DROP table t_test_user
+/
+DROP sequence sq_test_user
+/
+DROP sequence sq_test_user_contract
+/
+
+
+CREATE SEQUENCE PersonSeq
+/
+
+CREATE TABLE Person
+	( PersonID   NUMBER       NOT NULL PRIMARY KEY
+	, Firstname  VARCHAR2(50) NOT NULL
+	, Lastname   VARCHAR2(50) NOT NULL
+	, Middlename VARCHAR2(50)
+	, Gender     CHAR(1)      NOT NULL
+	
+	, CONSTRAINT Ck_Person_Gender  CHECK (Gender IN ('M', 'F', 'U', 'O'))
+	)
+/
+
+-- Insert Trigger for Person
+
+CREATE OR REPLACE TRIGGER Person_Add
+BEFORE INSERT
+ON Person
+FOR EACH ROW
+BEGIN
+SELECT
+	PersonSeq.NEXTVAL
+INTO
+	:NEW.PersonID
+FROM
+	dual;
+END;
+/
+
+-- Doctor Table Extension
+
+CREATE TABLE Doctor
+	( PersonID                       NUMBER NOT NULL PRIMARY KEY
+	, Taxonomy                       NVARCHAR2(50) NOT NULL
+	
+	, CONSTRAINT Fk_Doctor_Person FOREIGN KEY (PersonID)
+		REFERENCES Person (PersonID) ON DELETE CASCADE
+	)
+/
+
+-- Patient Table Extension
+
+CREATE TABLE Patient
+	( PersonID                       NUMBER NOT NULL PRIMARY KEY
+	, Diagnosis                      NVARCHAR2(256) NOT NULL
+	
+	, CONSTRAINT Fk_Patient_Person FOREIGN KEY (PersonID)
+		REFERENCES Person (PersonID) ON DELETE CASCADE
+	)
+/
+
+-- Sample data for Person/Doctor/Patient
+
+INSERT INTO Person  (FirstName, LastName, Gender) VALUES ('John',   'Pupkin',    'M')
+/
+INSERT INTO Person  (FirstName, LastName, Gender) VALUES ('Tester', 'Testerson', 'M')
+/
+INSERT INTO Doctor  (PersonID,  Taxonomy)  VALUES (PersonSeq.CURRVAL, 'Psychiatry')
+/
+INSERT INTO Patient (PersonID,  Diagnosis) VALUES (PersonSeq.CURRVAL, 'Hallucination with Paranoid Bugs'' Delirium of Persecution')
+/
+
+-- Person_Delete
+
+CREATE OR REPLACE 
+PROCEDURE Person_Delete(pPersonID IN NUMBER) IS
+BEGIN
+DELETE FROM
+	Person
+WHERE
+	PersonID = pPersonID;
+END;
+/
+
+-- Person_Insert
+
+CREATE OR REPLACE 
+PROCEDURE Person_Insert_OutputParameter
+	( pFirstName  IN NVARCHAR2
+	, pLastName   IN NVARCHAR2
+	, pMiddleName IN NVARCHAR2
+	, pGender     IN CHAR
+	, pPersonID   OUT NUMBER
+	) IS
+BEGIN
+INSERT INTO Person
+	( LastName,  FirstName,  MiddleName,  Gender)
+VALUES
+	(pLastName, pFirstName, pMiddleName, pGender)
+RETURNING
+	PersonID
+INTO
+	pPersonID;
+END;
+/
+
+CREATE OR REPLACE 
+FUNCTION Person_Insert
+	( pFirstName  IN NVARCHAR2
+	, pLastName   IN NVARCHAR2
+	, pMiddleName IN NVARCHAR2
+	, pGender     IN CHAR
+	)
+RETURN SYS_REFCURSOR IS
+	retCursor SYS_REFCURSOR;
+	lPersonID NUMBER;
+BEGIN
+INSERT INTO Person
+	( LastName,  FirstName,  MiddleName,  Gender)
+VALUES
+	(pLastName, pFirstName, pMiddleName, pGender)
+RETURNING
+	PersonID
+INTO
+	lPersonID;
+
+OPEN retCursor FOR
+	SELECT
+		PersonID, Firstname, Lastname, Middlename, Gender     
+	FROM
+		Person
+	WHERE
+		PersonID = lPersonID;
+RETURN
+	retCursor;
+END;
+/
+
+-- Person_SelectAll
+
+CREATE OR REPLACE 
+FUNCTION Person_SelectAll
+RETURN SYS_REFCURSOR IS
+	retCursor SYS_REFCURSOR;
+BEGIN
+OPEN retCursor FOR
+	SELECT
+		PersonID, Firstname, Lastname, Middlename, Gender     
+	FROM
+		Person;
+RETURN
+	retCursor;
+END;
+/
+
+-- Person_SelectAllByGender
+
+CREATE OR REPLACE 
+FUNCTION Person_SelectAllByGender(pGender IN CHAR)
+RETURN SYS_REFCURSOR IS
+	retCursor SYS_REFCURSOR;
+BEGIN
+OPEN retCursor FOR
+	SELECT
+		PersonID, Firstname, Lastname, Middlename, Gender     
+	FROM
+		Person
+	WHERE
+		Gender = pGender;
+RETURN
+	retCursor;
+END;
+/
+
+-- Person_SelectByKey
+
+CREATE OR REPLACE 
+FUNCTION Person_SelectByKey(pID IN NUMBER)
+RETURN SYS_REFCURSOR IS
+	retCursor SYS_REFCURSOR;
+BEGIN
+OPEN retCursor FOR
+	SELECT
+		PersonID, Firstname, Lastname, Middlename, Gender     
+	FROM
+		Person
+	WHERE
+		PersonID = pID;
+RETURN
+	retCursor;
+END;
+/
+
+-- Person_SelectByName
+
+CREATE OR REPLACE 
+FUNCTION Person_SelectByName
+	( pFirstName IN NVARCHAR2
+	, pLastName  IN NVARCHAR2
+	)
+RETURN SYS_REFCURSOR IS
+	retCursor SYS_REFCURSOR;
+BEGIN
+OPEN retCursor FOR
+	SELECT
+		PersonID, Firstname, Lastname, Middlename, Gender     
+	FROM
+		Person
+	WHERE
+		FirstName = pFirstName AND LastName = pLastName;
+RETURN
+	retCursor;
+END;
+/
+
+-- Person_SelectListByName
+
+CREATE OR REPLACE 
+FUNCTION Person_SelectListByName
+	( pFirstName IN NVARCHAR2
+	, pLastName  IN NVARCHAR2
+	)
+RETURN SYS_REFCURSOR IS
+	retCursor SYS_REFCURSOR;
+BEGIN
+OPEN retCursor FOR
+	SELECT
+		PersonID, Firstname, Lastname, Middlename, Gender     
+	FROM
+		Person
+	WHERE
+		FirstName LIKE pFirstName AND LastName LIKE pLastName;
+RETURN
+	retCursor;
+END;
+/
+
+CREATE OR REPLACE 
+PROCEDURE Person_Update
+	( pPersonID   IN NUMBER
+	, pFirstName  IN NVARCHAR2
+	, pLastName   IN NVARCHAR2
+	, pMiddleName IN NVARCHAR2
+	, pGender     IN CHAR
+	) IS
+BEGIN
+UPDATE
+	Person
+SET
+	LastName   = pLastName,
+	FirstName  = pFirstName,
+	MiddleName = pMiddleName,
+	Gender     = pGender
+WHERE
+	PersonID   = pPersonID;
+END;
+/
+
+-- Patient_SelectAll
+
+CREATE OR REPLACE 
+FUNCTION Patient_SelectAll
+RETURN SYS_REFCURSOR IS
+	retCursor SYS_REFCURSOR;
+BEGIN
+OPEN retCursor FOR
+SELECT
+	Person.*, Patient.Diagnosis
+FROM
+	Patient, Person
+WHERE
+	Patient.PersonID = Person.PersonID;
+RETURN
+	retCursor;
+END;
+/
+
+
+-- Patient_SelectByName
+
+CREATE OR REPLACE 
+FUNCTION Patient_SelectByName
+	( pFirstName IN NVARCHAR2
+	, pLastName  IN NVARCHAR2
+	)
+RETURN SYS_REFCURSOR IS
+	retCursor SYS_REFCURSOR;
+BEGIN
+OPEN retCursor FOR
+SELECT
+	Person.*, Patient.Diagnosis
+FROM
+	Patient, Person
+WHERE
+	Patient.PersonID = Person.PersonID
+	AND FirstName = pFirstName AND LastName = pLastName;
+RETURN
+	retCursor;
+END;
+/
+
+-- BinaryData Table
+
+CREATE SEQUENCE BinaryDataSeq
+/
+
+CREATE TABLE BinaryData
+	( BinaryDataID                 NUMBER NOT NULL PRIMARY KEY
+	, Stamp                        TIMESTAMP DEFAULT SYSDATE NOT NULL
+	, Data                         BLOB NOT NULL
+	)
+/
+
+-- Insert Trigger for Binarydata
+
+CREATE OR REPLACE TRIGGER BinaryData_Add
+BEFORE INSERT
+ON BinaryData
+FOR EACH ROW
+BEGIN
+SELECT
+	BinaryDataSeq.NEXTVAL
+INTO
+	:NEW.BinaryDataID
+FROM
+	dual;
+END;
+/
+
+-- OutRefTest
+
+CREATE OR REPLACE 
+PROCEDURE OutRefTest
+	( pID             IN     NUMBER
+	, pOutputID       OUT    NUMBER
+	, pInputOutputID  IN OUT NUMBER
+	, pStr            IN     NVARCHAR2
+	, pOutputStr      OUT    NVARCHAR2
+	, pInputOutputStr IN OUT NVARCHAR2
+	) IS
+BEGIN
+	pOutputID       := pID;
+	pInputOutputID  := pID + pInputOutputID;
+	pOutputStr      := pStr;
+	pInputOutputStr := pStr || pInputOutputStr;
+END;
+/
+
+CREATE OR REPLACE 
+PROCEDURE OutRefEnumTest
+	( pStr            IN     NVARCHAR2
+	, pOutputStr      OUT    NVARCHAR2
+	, pInputOutputStr IN OUT NVARCHAR2
+	) IS
+BEGIN
+	pOutputStr      := pStr;
+	pInputOutputStr := pStr || pInputOutputStr;
+END;
+/
+
+-- ArrayTest
+
+CREATE OR REPLACE 
+PROCEDURE ArrayTest
+	( pIntArray            IN     DBMS_UTILITY.NUMBER_ARRAY
+	, pOutputIntArray      OUT    DBMS_UTILITY.NUMBER_ARRAY
+	, pInputOutputIntArray IN OUT DBMS_UTILITY.NUMBER_ARRAY
+	, pStrArray            IN     DBMS_UTILITY.NAME_ARRAY
+	, pOutputStrArray      OUT    DBMS_UTILITY.NAME_ARRAY
+	, pInputOutputStrArray IN OUT DBMS_UTILITY.NAME_ARRAY
+	) IS
+BEGIN
+pOutputIntArray := pIntArray;
+
+FOR i IN pIntArray.FIRST..pIntArray.LAST LOOP
+	pInputOutputIntArray(i) := pInputOutputIntArray(i) + pIntArray(i);
+END LOOP;
+
+pOutputStrArray := pStrArray;
+
+FOR i IN pStrArray.FIRST..pStrArray.LAST LOOP
+	pInputOutputStrArray(i) := pInputOutputStrArray(i) || pStrArray(i);
+END LOOP;
+END;
+/
+
+CREATE OR REPLACE 
+PROCEDURE ScalarArray
+	( pOutputIntArray      OUT    DBMS_UTILITY.NUMBER_ARRAY
+	) IS
+BEGIN
+FOR i IN 1..5 LOOP
+	pOutputIntArray(i) := i;
+END LOOP;
+END;
+/
+
+-- ResultSetTest
+
+CREATE OR REPLACE 
+PROCEDURE RESULTSETTEST
+	( mr OUT SYS_REFCURSOR
+	, sr OUT SYS_REFCURSOR
+	) IS
+BEGIN
+OPEN mr FOR
+	SELECT       1 as MasterID FROM dual
+	UNION SELECT 2 as MasterID FROM dual;
+OPEN sr FOR
+	SELECT       4 SlaveID, 1 as MasterID FROM dual
+	UNION SELECT 5 SlaveID, 2 as MasterID FROM dual
+	UNION SELECT 6 SlaveID, 2 as MasterID FROM dual
+	UNION SELECT 7 SlaveID, 1 as MasterID FROM dual;
+END;
+/
+
+-- ExecuteScalarTest
+
+CREATE OR REPLACE 
+FUNCTION Scalar_DataReader
+RETURN SYS_REFCURSOR
+IS
+	retCursor SYS_REFCURSOR;
+BEGIN
+OPEN retCursor FOR
+	SELECT
+		12345 intField, '54321' stringField 
+	FROM
+		DUAL;
+RETURN
+	retCursor;
+END;
+/
+
+CREATE OR REPLACE 
+PROCEDURE Scalar_OutputParameter
+	( pOutputInt    OUT BINARY_INTEGER
+	, pOutputString OUT NVARCHAR2
+	) IS
+BEGIN
+	pOutputInt := 12345;
+	pOutputString := '54321';
+END;
+/
+
+CREATE OR REPLACE 
+FUNCTION Scalar_ReturnParameter
+RETURN BINARY_INTEGER IS
+BEGIN
+RETURN
+	12345;
+END;
+/
+
+-- Data Types test
+
+CREATE SEQUENCE DataTypeTestSeq
+/
+
+CREATE TABLE DataTypeTest
+(
+	DataTypeID      INTEGER      NOT NULL PRIMARY KEY,
+	Binary_         RAW(50)          NULL,
+	Boolean_        NUMBER(1,0)      NULL,
+	Byte_           NUMBER(3,0)      NULL,
+	Bytes_          BLOB             NULL,
+	Char_           NCHAR            NULL,
+	DateTime_       DATE             NULL,
+	Decimal_        NUMBER(19,5)     NULL,
+	Double_         DOUBLE PRECISION NULL,
+	Guid_           RAW(16)          NULL,
+	Int16_          NUMBER(5,0)      NULL,
+	Int32_          NUMBER(10,0)     NULL,
+	Int64_          NUMBER(20,0)     NULL,
+	Money_          NUMBER           NULL,
+	SByte_          NUMBER(3,0)      NULL,
+	Single_         FLOAT            NULL,
+	Stream_         BLOB             NULL,
+	String_         NVARCHAR2(50)    NULL,
+	UInt16_         NUMBER(5,0)      NULL,
+	UInt32_         NUMBER(10,0)     NULL,
+	UInt64_         NUMBER(20,0)     NULL,
+	Xml_            XMLTYPE          NULL
+)
+/
+
+-- Insert Trigger for DataTypeTest
+
+CREATE OR REPLACE TRIGGER DataTypeTest_Add
+BEFORE INSERT
+ON DataTypeTest
+FOR EACH ROW
+BEGIN
+SELECT
+	DataTypeTestSeq.NEXTVAL
+INTO
+	:NEW.DataTypeID
+FROM
+	dual;
+END;
+/
+
+INSERT INTO DataTypeTest
+	(Binary_,      Boolean_,    Byte_,     Bytes_,   Char_, DateTime_, Decimal_,
+	 Double_,         Guid_,   Int16_,     Int32_,  Int64_,    Money_,   SByte_,
+	 Single_,       Stream_,  String_,    UInt16_, UInt32_,   UInt64_,     Xml_)
+VALUES
+	(   NULL,          NULL,     NULL,       NULL,    NULL,      NULL,     NULL,
+	    NULL,          NULL,     NULL,       NULL,    NULL,      NULL,     NULL,
+	    NULL,          NULL,     NULL,       NULL,    NULL,      NULL,     NULL)
+/
+
+INSERT INTO DataTypeTest
+	(Binary_,      Boolean_,    Byte_,     Bytes_,   Char_, DateTime_, Decimal_,
+	 Double_,         Guid_,   Int16_,     Int32_,  Int64_,    Money_,   SByte_,
+	 Single_,       Stream_,  String_,    UInt16_, UInt32_,   UInt64_,
+	 Xml_)
+VALUES
+	(SYS_GUID(),          1,      255, SYS_GUID(),     'B',   SYSDATE, 12345.67,
+	   1234.567, SYS_GUID(),    32767,      32768, 1000000,   12.3456,      127,
+	   1234.123, SYS_GUID(), 'string',      32767,   32768, 200000000,
+	XMLTYPE('<root><element strattr="strvalue" intattr="12345"/></root>'))
+/
+
+
+
+CREATE TABLE Parent      (ParentID int, Value1 int)
+/
+CREATE TABLE Child       (ParentID int, ChildID int)
+/
+CREATE TABLE GrandChild  (ParentID int, ChildID int, GrandChildID int)
+/
+
+
+CREATE TABLE LinqDataTypes
+(
+	ID             int,
+	MoneyValue     decimal(10,4),
+	DateTimeValue  timestamp,
+	DateTimeValue2 timestamp,
+	BoolValue      smallint,
+	GuidValue      raw(16),
+	BinaryValue    blob         NULL,
+	SmallIntValue  smallint,
+	IntValue       int          NULL,
+	BigIntValue    number(20,0) NULL
+)
+/
+
+CREATE SEQUENCE SequenceTestSeq
+	MINVALUE 1
+	START WITH 1
+	INCREMENT BY 1
+	CACHE 10
+/
+
+CREATE TABLE SequenceTest
+(
+	ID                 int NOT NULL PRIMARY KEY,
+	Value VARCHAR2(50) NOT NULL
+)
+/
+
+CREATE TABLE "STG_TRADE_INFORMATION"
+(
+	"STG_TRADE_ID"          NUMBER NOT NULL ENABLE,
+	"STG_TRADE_VERSION"     NUMBER NOT NULL ENABLE,
+	"INFORMATION_TYPE_ID"   NUMBER NOT NULL ENABLE,
+	"INFORMATION_TYPE_NAME" VARCHAR2(50 BYTE),
+	"VALUE"                 VARCHAR2(4000 BYTE),
+	"VALUE_AS_INTEGER"      NUMBER,
+	"VALUE_AS_DATE"         DATE
+)
+/
+
+
+create table t_test_user
+(
+	user_id  number primary key,
+	name     varchar2(255) not null unique
+)
+/
+
+create table t_test_user_contract
+(
+	user_contract_id number primary key,
+	user_id          number not null references t_test_user on delete cascade,
+	contract_no      number not null,
+	name             varchar2(255) not null,
+	unique           (user_id, contract_no)
+)
+/
+
+create sequence sq_test_user
+/
+create sequence sq_test_user_contract
+/
+
+
+DROP SEQUENCE TestIdentitySeq
+/
+DROP TABLE TestIdentity
+/
+
+CREATE TABLE TestIdentity (
+	ID NUMBER NOT NULL PRIMARY KEY
+)
+/
+
+CREATE SEQUENCE TestIdentitySeq
+/
+
+CREATE OR REPLACE TRIGGER TestIdentity_Add
+BEFORE INSERT
+ON TestIdentity
+FOR EACH ROW
+BEGIN
+SELECT
+	TestIdentitySeq.NEXTVAL
+INTO
+	:NEW.ID
+FROM
+	dual;
+END;
+/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Data/Create Scripts/PostgreSQL.sql	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,182 @@
+DROP TABLE "Doctor"
+GO
+
+DROP TABLE "Patient"
+GO
+
+DROP TABLE "Person"
+GO
+
+CREATE TABLE "Person"
+( 
+	--PersonID   INTEGER PRIMARY KEY DEFAULT NEXTVAL('Seq'),
+	"PersonID"   SERIAL PRIMARY KEY,
+	"FirstName"  VARCHAR(50) NOT NULL,
+	"LastName"   VARCHAR(50) NOT NULL,
+	"MiddleName" VARCHAR(50),
+	"Gender"     CHAR(1)     NOT NULL
+)
+GO
+
+INSERT INTO "Person" ("FirstName", "LastName", "Gender") VALUES ('John',   'Pupkin',    'M')
+GO
+INSERT INTO "Person" ("FirstName", "LastName", "Gender") VALUES ('Tester', 'Testerson', 'M')
+GO
+
+-- Doctor Table Extension
+
+CREATE TABLE "Doctor"
+(
+	"PersonID" INTEGER     NOT NULL,
+	"Taxonomy" VARCHAR(50) NOT NULL
+)
+GO
+
+INSERT INTO "Doctor" ("PersonID", "Taxonomy") VALUES (1, 'Psychiatry')
+GO
+
+-- Patient Table Extension
+
+CREATE TABLE "Patient"
+(
+	"PersonID"  INTEGER      NOT NULL,
+	"Diagnosis" VARCHAR(256) NOT NULL
+)
+GO
+
+INSERT INTO "Patient" ("PersonID", "Diagnosis") VALUES (2, 'Hallucination with Paranoid Bugs'' Delirium of Persecution')
+GO
+
+
+CREATE OR REPLACE FUNCTION reverse(text) RETURNS text
+	AS $_$
+DECLARE
+original alias for $1;
+	reverse_str text;
+	i int4;
+BEGIN
+	reverse_str := '';
+	FOR i IN REVERSE LENGTH(original)..1 LOOP
+		reverse_str := reverse_str || substr(original,i,1);
+	END LOOP;
+RETURN reverse_str;
+END;$_$
+	LANGUAGE plpgsql IMMUTABLE;
+GO
+
+
+DROP TABLE "Parent"
+GO
+DROP TABLE "Child"
+GO
+DROP TABLE "GrandChild"
+GO
+
+CREATE TABLE "Parent"      ("ParentID" int, "Value1" int)
+GO
+CREATE TABLE "Child"       ("ParentID" int, "ChildID" int)
+GO
+CREATE TABLE "GrandChild"  ("ParentID" int, "ChildID" int, "GrandChildID" int)
+GO
+
+
+DROP TABLE "LinqDataTypes"
+GO
+
+CREATE TABLE "LinqDataTypes"
+(
+	"ID"             int,
+	"MoneyValue"     decimal(10,4),
+	"DateTimeValue"  timestamp,
+	"DateTimeValue2" timestamp,
+	"BoolValue"      boolean,
+	"GuidValue"      uuid,
+	"BinaryValue"    bytea  NULL,
+	"SmallIntValue"  smallint,
+	"IntValue"       int    NULL,
+	"BigIntValue"    bigint NULL
+)
+GO
+
+
+DROP TABLE entity
+GO
+
+CREATE TABLE entity
+(
+	the_name character varying(255) NOT NULL,
+	CONSTRAINT entity_name_key UNIQUE (the_name)
+)
+GO
+
+CREATE OR REPLACE FUNCTION add_if_not_exists(p_name character varying)
+	RETURNS void AS
+$BODY$
+BEGIN
+	BEGIN
+		insert into entity(the_name) values(p_name);
+	EXCEPTION WHEN unique_violation THEN
+		-- is exists, do nothing
+	END;
+END;
+$BODY$
+	LANGUAGE plpgsql;
+GO
+
+
+DROP TABLE "SequenceTest1"
+GO
+
+DROP TABLE "SequenceTest2"
+GO
+
+DROP TABLE "SequenceTest3"
+GO
+
+DROP SEQUENCE SequenceTestSeq
+GO
+
+CREATE SEQUENCE SequenceTestSeq INCREMENT 1 START 1
+GO
+
+DROP SEQUENCE "SequenceTest2_ID_seq"
+GO
+
+CREATE SEQUENCE "SequenceTest2_ID_seq" INCREMENT 1 START 1
+GO
+
+CREATE TABLE "SequenceTest1"
+(
+	"ID"    INTEGER PRIMARY KEY,
+	"Value" VARCHAR(50)
+)
+GO
+
+CREATE TABLE "SequenceTest2"
+(
+	"ID"    INTEGER PRIMARY KEY DEFAULT NEXTVAL('"SequenceTest2_ID_seq"'),
+	"Value" VARCHAR(50)
+)
+GO
+
+CREATE TABLE "SequenceTest3"
+(
+	"ID"    INTEGER PRIMARY KEY DEFAULT NEXTVAL('SequenceTestSeq'),
+	"Value" VARCHAR(50)
+)
+GO
+
+
+DROP TABLE "TestIdentity"
+GO
+
+DROP SEQUENCE "TestIdentity_ID_seq"
+GO
+
+CREATE SEQUENCE "TestIdentity_ID_seq" INCREMENT 1 START 1
+GO
+
+CREATE TABLE "TestIdentity" (
+	"ID" INTEGER PRIMARY KEY DEFAULT NEXTVAL('"TestIdentity_ID_seq"')
+)
+GO
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Data/Create Scripts/SQLite.sql	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,138 @@
+--
+-- Helper table
+--
+DROP TABLE IF EXISTS Dual;
+CREATE TABLE Dual (Dummy  VARCHAR(10));
+INSERT INTO  Dual (Dummy) VALUES ('X');
+
+--
+-- Person Table
+--
+DROP TABLE IF EXISTS Person;
+CREATE TABLE Person
+(
+	PersonID   integer      NOT NULL CONSTRAINT PK_Person PRIMARY KEY AUTOINCREMENT,
+	FirstName  nvarchar(50) NOT NULL,
+	LastName   nvarchar(50) NOT NULL,
+	MiddleName nvarchar(50)     NULL,
+	Gender     char(1)      NOT NULL CONSTRAINT CK_Person_Gender CHECK (Gender in ('M', 'F', 'U', 'O'))
+);
+
+INSERT INTO Person (FirstName, LastName, Gender) VALUES ('John',   'Pupkin',    'M');
+INSERT INTO Person (FirstName, LastName, Gender) VALUES ('Tester', 'Testerson', 'M');
+
+--
+-- Doctor Table Extension
+--
+DROP TABLE IF EXISTS Doctor;
+CREATE TABLE Doctor
+(
+	PersonID integer      NOT NULL CONSTRAINT PK_Doctor        PRIMARY KEY,
+	Taxonomy nvarchar(50) NOT NULL
+);
+
+INSERT INTO Doctor (PersonID, Taxonomy) VALUES (1, 'Psychiatry');
+
+--
+-- Patient Table Extension
+--
+DROP TABLE IF EXISTS Patient;
+CREATE TABLE Patient
+(
+	PersonID  integer       NOT NULL CONSTRAINT PK_Patient        PRIMARY KEY,
+	Diagnosis nvarchar(256) NOT NULL
+);
+INSERT INTO Patient (PersonID, Diagnosis) VALUES (2, 'Hallucination with Paranoid Bugs'' Delirium of Persecution');
+
+--
+-- BinaryData Table
+--
+DROP TABLE IF EXISTS BinaryData;
+CREATE TABLE BinaryData
+(
+	BinaryDataID integer    NOT NULL CONSTRAINT PK_BinaryData PRIMARY KEY AUTOINCREMENT,
+	Stamp        timestamp  NOT NULL,
+	Data         blob(1024) NOT NULL
+);
+
+--
+-- Babylon test
+--
+DROP TABLE IF EXISTS DataTypeTest;
+CREATE TABLE DataTypeTest
+(
+	DataTypeID      integer      NOT NULL CONSTRAINT PK_DataType PRIMARY KEY AUTOINCREMENT,
+	Binary_         binary(50)       NULL,
+	Boolean_        bit              NULL,
+	Byte_           tinyint          NULL,
+	Bytes_          varbinary(50)    NULL,
+	Char_           char(1)          NULL,
+	DateTime_       datetime         NULL,
+	Decimal_        decimal(20,2)    NULL,
+	Double_         float            NULL,
+	Guid_           uniqueidentifier NULL,
+	Int16_          smallint         NULL,
+	Int32_          int              NULL,
+	Int64_          bigint           NULL,
+	Money_          money            NULL,
+	SByte_          tinyint          NULL,
+	Single_         real             NULL,
+	Stream_         varbinary(50)    NULL,
+	String_         nvarchar(50)     NULL,
+	UInt16_         smallint         NULL,
+	UInt32_         int              NULL,
+	UInt64_         bigint           NULL,
+	Xml_            text             NULL
+);
+
+INSERT INTO DataTypeTest
+	(Binary_, Boolean_,   Byte_,  Bytes_,  Char_,  DateTime_, Decimal_,
+	 Double_,    Guid_,  Int16_,  Int32_,  Int64_,    Money_,   SByte_,
+	 Single_,  Stream_, String_, UInt16_, UInt32_,   UInt64_,     Xml_)
+VALUES
+	(   NULL,     NULL,    NULL,    NULL,    NULL,      NULL,     NULL,
+	    NULL,     NULL,    NULL,    NULL,    NULL,      NULL,     NULL,
+	    NULL,     NULL,    NULL,    NULL,    NULL,      NULL,     NULL);
+
+INSERT INTO DataTypeTest
+	(Binary_, Boolean_,   Byte_,  Bytes_,  Char_,  DateTime_, Decimal_,
+	 Double_,    Guid_,  Int16_,  Int32_,  Int64_,    Money_,   SByte_,
+	 Single_,  Stream_, String_, UInt16_, UInt32_,   UInt64_,
+	 Xml_)
+VALUES
+	(randomblob(16),        1,     255, zeroblob(16),     'B', DATETIME('NOW'), 12345.67,
+	1234.567, '{64e145a3-0077-4335-b2c6-ea19c9f464f8}',   32767,   32768, 1000000,   12.3456,      127,
+	1234.123,  randomblob(64), 'string',  32767,   32768, 200000000,
+	'<root><element strattr="strvalue" intattr="12345"/></root>');
+
+
+DROP TABLE IF EXISTS Parent;
+DROP TABLE IF EXISTS Child;
+DROP TABLE IF EXISTS GrandChild;
+
+CREATE TABLE Parent      (ParentID int, Value1 int);
+CREATE TABLE Child       (ParentID int, ChildID int);
+CREATE TABLE GrandChild  (ParentID int, ChildID int, GrandChildID int);
+
+DROP TABLE IF EXISTS LinqDataTypes;
+CREATE TABLE LinqDataTypes
+(
+	ID             int,
+	MoneyValue     decimal(10,4),
+	DateTimeValue  datetime,
+	DateTimeValue2 datetime2,
+	BoolValue      boolean,
+	GuidValue      uniqueidentifier,
+	BinaryValue    binary(5000) NULL,
+	SmallIntValue  smallint,
+	IntValue       int          NULL,
+	BigIntValue    bigint       NULL
+);
+
+DROP TABLE TestIdentity
+GO
+
+CREATE TABLE TestIdentity (
+	ID integer NOT NULL CONSTRAINT PK_TestIdentity PRIMARY KEY AUTOINCREMENT
+)
+GO
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Data/Create Scripts/SqlCe.sql	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,162 @@
+DROP TABLE DataTypeTest
+GO
+DROP TABLE BinaryData
+GO
+DROP TABLE Patient
+GO
+DROP TABLE Doctor
+GO
+DROP TABLE Person
+GO
+
+-- Person Table
+
+CREATE TABLE Person
+(
+	PersonID   int          NOT NULL IDENTITY(1,1) CONSTRAINT PK_Person PRIMARY KEY,
+	FirstName  nvarchar(50) NOT NULL,
+	LastName   nvarchar(50) NOT NULL,
+	MiddleName nvarchar(50)     NULL,
+	Gender     nchar(1)     NOT NULL
+)
+GO
+
+INSERT INTO Person (FirstName, LastName, Gender) VALUES ('John',   'Pupkin',    'M')
+GO
+INSERT INTO Person (FirstName, LastName, Gender) VALUES ('Tester', 'Testerson', 'M')
+GO
+
+-- Doctor Table Extension
+
+CREATE TABLE Doctor
+(
+	PersonID int          NOT NULL
+		CONSTRAINT PK_Doctor        PRIMARY KEY
+		CONSTRAINT FK_Doctor_Person --FOREIGN KEY
+			REFERENCES Person ([PersonID])
+			ON UPDATE CASCADE
+			ON DELETE CASCADE,
+	Taxonomy nvarchar(50) NOT NULL
+)
+GO
+
+INSERT INTO Doctor (PersonID, Taxonomy) VALUES (1, 'Psychiatry')
+GO
+
+-- Patient Table Extension
+
+CREATE TABLE Patient
+(
+	PersonID  int           NOT NULL
+		CONSTRAINT PK_Patient        PRIMARY KEY
+		CONSTRAINT FK_Patient_Person --FOREIGN KEY
+			REFERENCES Person ([PersonID])
+			ON UPDATE CASCADE
+			ON DELETE CASCADE,
+	Diagnosis nvarchar(256) NOT NULL
+)
+GO
+
+INSERT INTO Patient (PersonID, Diagnosis) VALUES (2, 'Hallucination with Paranoid Bugs'' Delirium of Persecution')
+GO
+
+-- BinaryData Table
+
+CREATE TABLE BinaryData
+(
+	BinaryDataID int             NOT NULL IDENTITY(1,1) CONSTRAINT PK_BinaryData PRIMARY KEY,
+	Data         varbinary(1024) NOT NULL)
+GO
+
+CREATE TABLE DataTypeTest
+(
+	DataTypeID      int          NOT NULL IDENTITY(1,1) CONSTRAINT PK_DataType PRIMARY KEY,
+	Binary_         binary(50)       NULL,
+	Boolean_        bit              NULL,
+	Byte_           tinyint          NULL,
+	Bytes_          varbinary(50)    NULL,
+	Char_           nchar(1)         NULL,
+	DateTime_       datetime         NULL,
+	Decimal_        numeric(20,2)    NULL,
+	Double_         float            NULL,
+	Guid_           uniqueidentifier NULL,
+	Int16_          smallint         NULL,
+	Int32_          int              NULL,
+	Int64_          bigint           NULL,
+	Money_          money            NULL,
+	SByte_          tinyint          NULL,
+	Single_         real             NULL,
+	Stream_         varbinary(50)    NULL,
+	String_         nvarchar(50)     NULL,
+	UInt16_         smallint         NULL,
+	UInt32_         int              NULL,
+	UInt64_         bigint           NULL,
+	Xml_            ntext            NULL
+)
+GO
+
+INSERT INTO DataTypeTest
+	(Binary_, Boolean_,   Byte_,  Bytes_,  Char_,  DateTime_, Decimal_,
+	 Double_,    Guid_,  Int16_,  Int32_,  Int64_,    Money_,   SByte_,
+	 Single_,  Stream_, String_, UInt16_, UInt32_,   UInt64_,     Xml_)
+VALUES
+	(   NULL,     NULL,    NULL,    NULL,    NULL,      NULL,     NULL,
+	    NULL,     NULL,    NULL,    NULL,    NULL,      NULL,     NULL,
+	    NULL,     NULL,    NULL,    NULL,    NULL,      NULL,     NULL)
+GO
+
+INSERT INTO DataTypeTest
+	(Binary_, Boolean_,   Byte_,  Bytes_,  Char_,  DateTime_, Decimal_,
+	 Double_,    Guid_,  Int16_,  Int32_,  Int64_,    Money_,   SByte_,
+	 Single_,  Stream_, String_, UInt16_, UInt32_,   UInt64_,
+	 Xml_)
+VALUES
+	(NewID(),        1,     255, NewID(),     'B', GetDate(), 12345.67,
+	1234.567,  NewID(),   32767,   32768, 1000000,   12.3456,      127,
+	1234.123,  NewID(), 'string',  32767,   32768, 200000000,
+	'<root><element strattr="strvalue" intattr="12345"/></root>')
+GO
+
+
+
+DROP TABLE Parent
+GO
+DROP TABLE Child
+GO
+DROP TABLE GrandChild
+GO
+
+CREATE TABLE Parent      (ParentID int, Value1 int)
+GO
+CREATE TABLE Child       (ParentID int, ChildID int)
+GO
+CREATE TABLE GrandChild  (ParentID int, ChildID int, GrandChildID int)
+GO
+
+
+DROP TABLE LinqDataTypes
+GO
+
+CREATE TABLE LinqDataTypes
+(
+	ID             int,
+	MoneyValue     decimal(10,4),
+	DateTimeValue  datetime,
+	DateTimeValue2 datetime,
+	BoolValue      bit,
+	GuidValue      uniqueidentifier,
+	BinaryValue    varbinary(5000) NULL,
+	SmallIntValue  smallint,
+	IntValue       int             NULL,
+	BigIntValue    bigint          NULL
+)
+GO
+
+
+DROP TABLE TestIdentity
+GO
+
+CREATE TABLE TestIdentity (
+	ID int NOT NULL IDENTITY(1,1) CONSTRAINT PK_TestIdentity PRIMARY KEY
+)
+GO
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Data/Create Scripts/Sybase.sql	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,475 @@
+IF OBJECT_ID('dbo.Doctor') IS NOT NULL
+BEGIN DROP TABLE Doctor END
+GO
+
+IF OBJECT_ID('dbo.Patient') IS NOT NULL
+BEGIN DROP TABLE Patient END
+GO
+
+-- Person Table
+
+IF OBJECT_ID('dbo.Person') IS NOT NULL
+BEGIN DROP TABLE Person END
+GO
+
+CREATE TABLE Person
+(
+	PersonID   int          IDENTITY,
+	FirstName  nvarchar(50) NOT NULL,
+	LastName   nvarchar(50) NOT NULL,
+	MiddleName nvarchar(50)     NULL,
+	Gender     char(1)      NOT NULL,
+	CONSTRAINT PK_Person PRIMARY KEY CLUSTERED (PersonID)
+)
+GO
+
+INSERT INTO Person (FirstName, LastName, Gender) VALUES ('John',   'Pupkin',    'M')
+GO
+INSERT INTO Person (FirstName, LastName, Gender) VALUES ('Tester', 'Testerson', 'M')
+GO
+
+-- Doctor Table Extension
+
+CREATE TABLE Doctor
+(
+	PersonID int          NOT NULL,
+	Taxonomy nvarchar(50) NOT NULL,
+	CONSTRAINT PK_Doctor        PRIMARY KEY CLUSTERED (PersonID),
+	CONSTRAINT FK_Doctor_Person FOREIGN KEY (PersonID)
+		REFERENCES Person(PersonID)
+)
+GO
+
+INSERT INTO Doctor (PersonID, Taxonomy) VALUES (1, 'Psychiatry')
+GO
+
+-- Patient Table Extension
+
+CREATE TABLE Patient
+(
+	PersonID  int           NOT NULL,
+	Diagnosis nvarchar(256) NOT NULL,
+	CONSTRAINT PK_Patient        PRIMARY KEY CLUSTERED (PersonID),
+	CONSTRAINT FK_Patient_Person FOREIGN KEY (PersonID)
+		REFERENCES Person (PersonID)
+)
+GO
+
+INSERT INTO Patient (PersonID, Diagnosis) VALUES (2, 'Hallucination with Paranoid Bugs'' Delirium of Persecution')
+GO
+
+-- Person_SelectByKey
+
+IF OBJECT_ID('Person_SelectByKey') IS NOT NULL
+BEGIN DROP Procedure Person_SelectByKey END
+GO
+
+CREATE Procedure Person_SelectByKey
+	@id int
+AS
+
+SELECT * FROM Person WHERE PersonID = @id
+
+GO
+
+GRANT EXEC ON Person_SelectByKey TO PUBLIC
+GO
+
+-- Person_SelectAll
+
+IF OBJECT_ID('Person_SelectAll') IS NOT NULL
+BEGIN DROP Procedure Person_SelectAll END
+GO
+
+CREATE Procedure Person_SelectAll
+AS
+
+SELECT * FROM Person
+
+GO
+
+GRANT EXEC ON Person_SelectAll TO PUBLIC
+GO
+
+-- Person_SelectByName
+
+IF OBJECT_ID('Person_SelectByName') IS NOT NULL
+BEGIN DROP Procedure Person_SelectByName END
+GO
+
+CREATE Procedure Person_SelectByName
+	@firstName nvarchar(50),
+	@lastName  nvarchar(50)
+AS
+
+SELECT
+	*
+FROM
+	Person
+WHERE
+	FirstName = @firstName AND LastName = @lastName
+
+GO
+
+GRANT EXEC ON Person_SelectByName TO PUBLIC
+GO
+
+-- Person_SelectListByName
+
+IF OBJECT_ID('Person_SelectListByName') IS NOT NULL
+BEGIN DROP Procedure Person_SelectListByName END
+GO
+
+CREATE Procedure Person_SelectListByName
+	@firstName nvarchar(50),
+	@lastName  nvarchar(50)
+AS
+
+SELECT
+	*
+FROM
+	Person
+WHERE
+	FirstName like @firstName AND LastName like @lastName
+
+GO
+
+GRANT EXEC ON Person_SelectByName TO PUBLIC
+GO
+
+-- Person_Insert
+
+IF OBJECT_ID('Person_Insert') IS NOT NULL
+BEGIN DROP Procedure Person_Insert END
+GO
+
+CREATE Procedure Person_Insert
+	@FirstName  nvarchar(50),
+	@LastName   nvarchar(50),
+	@MiddleName nvarchar(50),
+	@Gender     char(1)
+AS
+
+INSERT INTO Person
+	( LastName,  FirstName,  MiddleName,  Gender)
+VALUES
+	(@LastName, @FirstName, @MiddleName, @Gender)
+
+SELECT Cast(@@IDENTITY as int) PersonID
+
+GO
+
+GRANT EXEC ON Person_Insert TO PUBLIC
+GO
+
+-- Person_Insert_OutputParameter
+
+IF OBJECT_ID('Person_Insert_OutputParameter') IS NOT NULL
+BEGIN DROP Procedure Person_Insert_OutputParameter END
+GO
+
+CREATE Procedure Person_Insert_OutputParameter
+	@FirstName  nvarchar(50),
+	@LastName   nvarchar(50),
+	@MiddleName nvarchar(50),
+	@Gender     char(1),
+	@PersonID   int output
+AS
+
+INSERT INTO Person
+	( LastName,  FirstName,  MiddleName,  Gender)
+VALUES
+	(@LastName, @FirstName, @MiddleName, @Gender)
+
+SET @PersonID = Cast(@@IDENTITY as int)
+
+GO
+
+GRANT EXEC ON Person_Insert_OutputParameter TO PUBLIC
+GO
+
+-- Person_Update
+
+IF OBJECT_ID('Person_Update') IS NOT NULL
+BEGIN DROP Procedure Person_Update END
+GO
+
+CREATE Procedure Person_Update
+	@PersonID   int,
+	@FirstName  nvarchar(50),
+	@LastName   nvarchar(50),
+	@MiddleName nvarchar(50),
+	@Gender     char(1)
+AS
+
+UPDATE
+	Person
+SET
+	LastName   = @LastName,
+	FirstName  = @FirstName,
+	MiddleName = @MiddleName,
+	Gender     = @Gender
+WHERE
+	PersonID = @PersonID
+
+GO
+
+GRANT EXEC ON Person_Update TO PUBLIC
+GO
+
+-- Person_Delete
+
+IF OBJECT_ID('Person_Delete') IS NOT NULL
+BEGIN DROP Procedure Person_Delete END
+GO
+
+CREATE Procedure Person_Delete
+	@PersonID int
+AS
+
+DELETE FROM Person WHERE PersonID = @PersonID
+
+GO
+
+GRANT EXEC ON Person_Delete TO PUBLIC
+GO
+
+-- Patient_SelectAll
+
+IF OBJECT_ID('Patient_SelectAll') IS NOT NULL
+BEGIN DROP Procedure Patient_SelectAll END
+GO
+
+CREATE Procedure Patient_SelectAll
+AS
+
+SELECT
+	Person.*, Patient.Diagnosis
+FROM
+	Patient, Person
+WHERE
+	Patient.PersonID = Person.PersonID
+
+GO
+
+GRANT EXEC ON Patient_SelectAll TO PUBLIC
+GO
+
+-- Patient_SelectByName
+
+IF OBJECT_ID('Patient_SelectByName') IS NOT NULL
+BEGIN DROP Procedure Patient_SelectByName END
+GO
+
+CREATE Procedure Patient_SelectByName
+	@firstName nvarchar(50),
+	@lastName  nvarchar(50)
+AS
+
+SELECT
+	Person.*, Patient.Diagnosis
+FROM
+	Patient, Person
+WHERE
+	Patient.PersonID = Person.PersonID
+	AND FirstName = @firstName AND LastName = @lastName
+
+GO
+
+GRANT EXEC ON Person_SelectByName TO PUBLIC
+GO
+
+-- BinaryData Table
+
+IF OBJECT_ID('BinaryData') IS NOT NULL
+BEGIN DROP TABLE BinaryData END
+GO
+
+CREATE TABLE BinaryData
+(
+	BinaryDataID int             IDENTITY,
+	Stamp        timestamp       NOT NULL,
+	Data         varbinary(1024) NOT NULL,
+	CONSTRAINT PK_BinaryData PRIMARY KEY CLUSTERED (BinaryDataID)
+)
+GO
+
+-- OutRefTest
+
+IF OBJECT_ID('OutRefTest') IS NOT NULL
+BEGIN DROP Procedure OutRefTest END
+GO
+
+CREATE Procedure OutRefTest
+	@ID             int,
+	@outputID       int output,
+	@inputOutputID  int output,
+	@str            varchar(50),
+	@outputStr      varchar(50) output,
+	@inputOutputStr varchar(50) output
+AS
+
+SET @outputID       = @ID
+SET @inputOutputID  = @ID + @inputOutputID
+SET @outputStr      = @str
+SET @inputOutputStr = @str + @inputOutputStr
+
+GO
+
+-- OutRefEnumTest
+
+IF OBJECT_ID('OutRefEnumTest') IS NOT NULL
+BEGIN DROP Procedure OutRefEnumTest END
+GO
+
+CREATE Procedure OutRefEnumTest
+	@str            varchar(50),
+	@outputStr      varchar(50) output,
+	@inputOutputStr varchar(50) output
+AS
+
+SET @outputStr      = @str
+SET @inputOutputStr = @str + @inputOutputStr
+
+GO
+
+-- ExecuteScalarTest
+
+IF OBJECT_ID('Scalar_DataReader') IS NOT NULL
+BEGIN DROP Procedure Scalar_DataReader END
+GO
+
+CREATE Procedure Scalar_DataReader
+AS
+SELECT Cast(12345 as int) AS intField, Cast('54321' as varchar(50)) AS stringField
+
+GO
+
+IF OBJECT_ID('Scalar_OutputParameter') IS NOT NULL
+BEGIN DROP Procedure Scalar_OutputParameter END
+GO
+
+CREATE Procedure Scalar_OutputParameter
+	@outputInt    int = 0 output,
+	@outputString varchar(50) = '' output
+AS
+BEGIN
+	SET @outputInt    = 12345
+	SET @outputString = '54321'
+END
+
+GO
+
+IF OBJECT_ID('Scalar_ReturnParameterWithObject') IS NOT NULL
+BEGIN DROP Procedure Scalar_ReturnParameterWithObject END
+GO
+
+CREATE Procedure Scalar_ReturnParameterWithObject
+	@id int
+AS
+BEGIN
+	SELECT * FROM Person WHERE PersonID = @id
+	RETURN @id
+END
+
+GO
+
+-- Data Types test
+
+IF OBJECT_ID('DataTypeTest') IS NOT NULL
+BEGIN DROP TABLE DataTypeTest END
+GO
+
+CREATE TABLE DataTypeTest
+(
+	DataTypeID      int              IDENTITY,
+	Binary_         binary(50)       NULL,
+	Boolean_        bit              NOT NULL,
+	Byte_           tinyint          NULL,
+	Bytes_          varbinary(50)    NULL,
+	Char_           char(1)          NULL,
+	DateTime_       datetime         NULL,
+	Decimal_        decimal(20,2)    NULL,
+	Double_         float            NULL,
+	Guid_           varbinary(16)    NULL,
+	Int16_          smallint         NULL,
+	Int32_          int              NULL,
+	Int64_          bigint           NULL,
+	Money_          money            NULL,
+	SByte_          tinyint          NULL,
+	Single_         real             NULL,
+	Stream_         varbinary(50)    NULL,
+	String_         nvarchar(50)     NULL,
+	UInt16_         smallint         NULL,
+	UInt32_         int              NULL,
+	UInt64_         bigint           NULL,
+	Xml_            nvarchar(1000)   NULL,
+	CONSTRAINT PK_DataType PRIMARY KEY CLUSTERED (DataTypeID)
+)
+GO
+
+INSERT INTO DataTypeTest
+	(Binary_, Boolean_,   Byte_,  Bytes_,  Char_,  DateTime_, Decimal_,
+	 Double_,    Guid_,  Int16_,  Int32_,  Int64_,    Money_,   SByte_,
+	 Single_,  Stream_, String_, UInt16_, UInt32_,   UInt64_,     Xml_)
+VALUES
+	(   NULL,        0,    NULL,    NULL,    NULL,      NULL,     NULL,
+		NULL,     NULL,    NULL,    NULL,    NULL,      NULL,     NULL,
+		NULL,     NULL,    NULL,    NULL,    NULL,      NULL,     NULL)
+GO
+
+INSERT INTO DataTypeTest
+	(Binary_, Boolean_,   Byte_,  Bytes_,  Char_,  DateTime_, Decimal_,
+	 Double_,    Guid_,  Int16_,  Int32_,  Int64_,    Money_,   SByte_,
+	 Single_,  Stream_, String_, UInt16_, UInt32_,   UInt64_,
+	 Xml_)
+VALUES
+	(NewID(),        1,     255, NewID(),     'B', GetDate(), 12345.67,
+	1234.567,  NewID(),   32767,   32768, 1000000,   12.3456,      127,
+	1234.123,  NewID(), 'string',  32767,   32768, 200000000,
+	'<root><element strattr="strvalue" intattr="12345"/></root>')
+GO
+
+
+
+DROP TABLE Parent
+GO
+DROP TABLE Child
+GO
+DROP TABLE GrandChild
+GO
+
+CREATE TABLE Parent      (ParentID int, Value1 int NULL)
+GO
+CREATE TABLE Child       (ParentID int, ChildID int)
+GO
+CREATE TABLE GrandChild  (ParentID int, ChildID int, GrandChildID int)
+GO
+
+
+DROP TABLE LinqDataTypes
+GO
+
+CREATE TABLE LinqDataTypes
+(
+	ID             int,
+	MoneyValue     decimal(10,4) NULL,
+	DateTimeValue  datetime      NULL,
+	DateTimeValue2 datetime      NULL,
+	BoolValue      bit           default(0),
+	GuidValue      char(36)      NULL,
+	BinaryValue    binary(500)   NULL,
+	SmallIntValue  smallint      NULL,
+	IntValue       int           NULL,
+	BigIntValue    bigint        NULL
+)
+GO
+
+DROP TABLE TestIdentity
+GO
+
+CREATE TABLE TestIdentity
+(
+	ID int IDENTITY CONSTRAINT PK_TestIdentity PRIMARY KEY CLUSTERED
+)
+GO
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Data/Data.dbp	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,29 @@
+# Microsoft Developer Studio Project File - Database Project
+Begin DataProject = "Data"
+   MSDTVersion = "80"
+   DefDBRef = "BLToolkitData.dbo"
+   Begin Folder = "Change Scripts"
+   End
+   Begin Folder = "Create Scripts"
+      Script = "Access.sql"
+      Script = "DB2.sql"
+      Script = "Firebird2.sql"
+      Script = "Informix.sql"
+      Script = "MsSql.sql"
+      Script = "MySql.sql"
+      Script = "Oracle.sql"
+      Script = "PostgreSQL.sql"
+      Script = "SqlCe.sql"
+      Script = "SQLite.sql"
+      Script = "Sybase.sql"
+   End
+   Begin DBRefFolder = "Database References"
+      Begin DBRefNode = "BLToolkitData.dbo"
+         ConnectStr = "Data Source=(local);Initial Catalog=BLToolkitData;Integrated Security=True"
+         Provider = "{91510608-8809-4020-8897-FBA057E22D54}"
+         Colorizer = 6
+      End
+   End
+   Begin Folder = "Queries"
+   End
+End
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Data/Queries/Person_SelectAll.sql	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,18 @@
+IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'Person_SelectAll')
+BEGIN
+	DROP  Procedure  Person_SelectAll
+END
+
+GO
+
+CREATE Procedure Person_SelectAll
+AS
+
+SELECT * FROM Person
+
+GO
+
+GRANT EXEC ON Person_SelectAll TO PUBLIC
+
+GO
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/Compile3.bat	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+%windir%\Microsoft.NET\Framework\v3.5\MSBuild.exe        DB2\BLToolkit.Data.DataProvider.DB2.3.csproj        /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v3.5\MSBuild.exe   Firebird\BLToolkit.Data.DataProvider.Firebird.3.csproj   /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v3.5\MSBuild.exe   Informix\BLToolkit.Data.DataProvider.Informix.3.csproj   /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v3.5\MSBuild.exe      MySql\BLToolkit.Data.DataProvider.MySql.3.csproj      /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v3.5\MSBuild.exe     Oracle\BLToolkit.Data.DataProvider.Oracle.3.csproj     /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v3.5\MSBuild.exe PostgreSQL\BLToolkit.Data.DataProvider.PostgreSQL.3.csproj /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v3.5\MSBuild.exe      SqlCe\BLToolkit.Data.DataProvider.SqlCe.3.csproj      /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v3.5\MSBuild.exe     SQLite\BLToolkit.Data.DataProvider.SQLite.3.csproj     /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v3.5\MSBuild.exe     Sybase\BLToolkit.Data.DataProvider.Sybase.3.csproj     /property:Configuration=Debug
+
+%windir%\Microsoft.NET\Framework\v3.5\MSBuild.exe        DB2\BLToolkit.Data.DataProvider.DB2.3.csproj        /property:Configuration=Release 
+%windir%\Microsoft.NET\Framework\v3.5\MSBuild.exe   Firebird\BLToolkit.Data.DataProvider.Firebird.3.csproj   /property:Configuration=Release 
+%windir%\Microsoft.NET\Framework\v3.5\MSBuild.exe   Informix\BLToolkit.Data.DataProvider.Informix.3.csproj   /property:Configuration=Release 
+%windir%\Microsoft.NET\Framework\v3.5\MSBuild.exe      MySql\BLToolkit.Data.DataProvider.MySql.3.csproj      /property:Configuration=Release 
+%windir%\Microsoft.NET\Framework\v3.5\MSBuild.exe     Oracle\BLToolkit.Data.DataProvider.Oracle.3.csproj     /property:Configuration=Release 
+%windir%\Microsoft.NET\Framework\v3.5\MSBuild.exe PostgreSQL\BLToolkit.Data.DataProvider.PostgreSQL.3.csproj /property:Configuration=Release 
+%windir%\Microsoft.NET\Framework\v3.5\MSBuild.exe      SqlCe\BLToolkit.Data.DataProvider.SqlCe.3.csproj      /property:Configuration=Release 
+%windir%\Microsoft.NET\Framework\v3.5\MSBuild.exe     SQLite\BLToolkit.Data.DataProvider.SQLite.3.csproj     /property:Configuration=Release 
+%windir%\Microsoft.NET\Framework\v3.5\MSBuild.exe     Sybase\BLToolkit.Data.DataProvider.Sybase.3.csproj     /property:Configuration=Release 
+pause
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/Compile4.bat	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,24 @@
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe             DB2\BLToolkit.Data.DataProvider.DB2.4.csproj           /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe        Firebird\BLToolkit.Data.DataProvider.Firebird.4.csproj      /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe        Informix\BLToolkit.Data.DataProvider.Informix.4.csproj      /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe           MySql\BLToolkit.Data.DataProvider.MySql.4.csproj         /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe          Oracle\BLToolkit.Data.DataProvider.Oracle.4.csproj        /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe          Oracle\BLToolkit.Data.DataProvider.OracleManaged.4.csproj /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe DevartOraclePro\BLToolkit.Data.DataProvider.DevartOracle.4.csproj  /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe      PostgreSQL\BLToolkit.Data.DataProvider.PostgreSQL.4.csproj    /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe           SqlCe\BLToolkit.Data.DataProvider.SqlCe.4.csproj         /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe          SQLite\BLToolkit.Data.DataProvider.SQLite.4.csproj        /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe          Sybase\BLToolkit.Data.DataProvider.Sybase.4.csproj        /property:Configuration=Debug
+
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe             DB2\BLToolkit.Data.DataProvider.DB2.4.csproj           /property:Configuration=Release 
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe        Firebird\BLToolkit.Data.DataProvider.Firebird.4.csproj      /property:Configuration=Release 
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe        Informix\BLToolkit.Data.DataProvider.Informix.4.csproj      /property:Configuration=Release 
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe           MySql\BLToolkit.Data.DataProvider.MySql.4.csproj         /property:Configuration=Release 
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe          Oracle\BLToolkit.Data.DataProvider.Oracle.4.csproj        /property:Configuration=Release 
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe          Oracle\BLToolkit.Data.DataProvider.OracleManaged.4.csproj /property:Configuration=Release 
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe DevartOraclePro\BLToolkit.Data.DataProvider.DevartOracle.4.csproj  /property:Configuration=Release
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe      PostgreSQL\BLToolkit.Data.DataProvider.PostgreSQL.4.csproj    /property:Configuration=Release 
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe           SqlCe\BLToolkit.Data.DataProvider.SqlCe.4.csproj         /property:Configuration=Release 
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe          SQLite\BLToolkit.Data.DataProvider.SQLite.4.csproj        /property:Configuration=Release 
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe          Sybase\BLToolkit.Data.DataProvider.Sybase.4.csproj        /property:Configuration=Release 
+pause
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/DB2/BLToolkit.Data.DataProvider.DB2.3.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{86BF4F10-3606-4016-9919-84C3335813B6}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit.Data.DataProvider.DB2</RootNamespace>
+    <AssemblyName>BLToolkit.Data.DataProvider.DB2.3</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="IBM.Data.DB2, Version=9.0.0.2, Culture=neutral, PublicKeyToken=7c307b91aa13d208, processorArchitecture=x86">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\Redist\IBM\IBM.Data.DB2.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\Source\Data\DataProvider\DB2DataProvider.cs">
+      <Link>DB2DataProvider.cs</Link>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.3.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/DB2/BLToolkit.Data.DataProvider.DB2.4.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{86BF4F10-3606-4016-9919-84C3335813B6}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit.Data.DataProvider.DB2</RootNamespace>
+    <AssemblyName>BLToolkit.Data.DataProvider.DB2.4</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <TargetFrameworkProfile />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\BLToolkit.Data.DataProvider.DB2.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\BLToolkit.Data.DataProvider.DB2.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="IBM.Data.DB2, Version=9.0.0.2, Culture=neutral, PublicKeyToken=7c307b91aa13d208, processorArchitecture=x86">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\Redist\IBM\IBM.Data.DB2.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\Source\Data\DataProvider\DB2DataProvider.cs">
+      <Link>DB2DataProvider.cs</Link>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/DB2/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+using System;
+using System.Reflection;
+using System.Resources;
+using System.Runtime.InteropServices;
+using System.Security;
+
+using BLToolkit;
+
+[assembly: AssemblyTitle           (BLToolkitConstants.ProductName        + " Data Provider")]
+[assembly: AssemblyDescription     (BLToolkitConstants.ProductDescription + " Data Provider")]
+[assembly: AssemblyProduct         (BLToolkitConstants.ProductName        + " Data Provider")]
+[assembly: AssemblyCopyright       (BLToolkitConstants.Copyright)]
+[assembly: AssemblyCulture         ("")]
+[assembly: ComVisible              (false)]
+[assembly: Guid                    ("6c3fb028-daf7-4134-8697-eedfe34d779e")]
+[assembly: AssemblyVersion         (BLToolkitConstants.FullVersionString)]
+[assembly: AssemblyFileVersion     (BLToolkitConstants.FullVersionString)]
+[assembly: CLSCompliant            (true)]
+[assembly: NeutralResourcesLanguage("en-US")]
+//[assembly: AllowPartiallyTrustedCallers]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/DevartOraclePro/BLToolkit.Data.DataProvider.DevartOracle.4.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{CB303F0B-0AA3-4589-850A-95E985A09492}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit.Data.DataProvider</RootNamespace>
+    <AssemblyName>BLToolkit.Data.DataProvider.DevartOracle.4</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Devart.Data, Version=5.0.828.0, Culture=neutral, PublicKeyToken=09af7300eec23701, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\dotConnect.Express.for.Oracle.8.1.36\lib\Devart.Data.dll</HintPath>
+    </Reference>
+    <Reference Include="Devart.Data.Oracle, Version=8.1.36.0, Culture=neutral, PublicKeyToken=09af7300eec23701, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\dotConnect.Express.for.Oracle.8.1.36\lib\Devart.Data.Oracle.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="DevartOracleDataProvider.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0c325f5d-e50e-4340-8724-d29896ccc583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config" />
+    <None Include="packages.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/DevartOraclePro/BLToolkit.Data.DataProvider.DevartOraclePro.4.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{CB303F0B-0AA3-4589-850A-95E985A09492}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit.Data.DataProvider</RootNamespace>
+    <AssemblyName>BLToolkit.Data.DataProvider.DevartOracle.4</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;DEVART_PRO</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE;DEVART_PRO</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Devart.Data, Version=5.0.449.0, Culture=neutral, PublicKeyToken=09af7300eec23701, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+    </Reference>
+    <Reference Include="Devart.Data.Oracle, Version=6.10.121.0, Culture=neutral, PublicKeyToken=09af7300eec23701, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="DevartOracleDataProvider.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0c325f5d-e50e-4340-8724-d29896ccc583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Properties\licenses.config" />
+    <EmbeddedResource Include="Properties\licenses.licx" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/DevartOraclePro/DevartOracleDataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,212 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.Common;
+using System.Text;
+
+using BLToolkit.Data.Sql.SqlProvider;
+using BLToolkit.Mapping;
+
+using Devart.Data.Oracle;
+
+namespace BLToolkit.Data.DataProvider
+{
+	public class DevartOracleDataProvider : DataProviderBase
+	{
+		/// <summary>
+		/// Data provider name string.
+		/// </summary>
+		public const string NameString = "DevartOracle";
+
+		public override Type ConnectionType
+		{
+			get { return typeof(OracleConnection); }
+		}
+
+		public override string Name
+		{
+			get { return NameString; }
+		}
+
+		/// <summary>
+		/// Gets or sets the database activity monitor.
+		/// </summary>
+		private static Devart.Common.DbMonitor DbMonitor { get; set; }
+
+		/// <summary>
+		/// Gets or sets value indicating whether the database activity monitor is enabled.
+		/// </summary>
+		/// <remarks>
+		/// This feature requires Standard or Pro edition of Devart dotConnect for Oracle provider.
+		/// </remarks>
+		public static bool DbMonitorActive
+		{
+			get { return DbMonitor == null ? false : DbMonitor.IsActive; }
+			set
+			{
+				// setting this property has no effect in Express edition
+#if DEVART_PRO
+				if (DbMonitorActive != value)
+				{
+					DbMonitor = DbMonitor ?? new OracleMonitor();
+					DbMonitor.IsActive = value;
+				}
+#endif
+			}
+		}
+
+		public override IDbConnection CreateConnectionObject()
+		{
+			return new OracleConnection();
+		}
+
+		public override DbDataAdapter CreateDataAdapterObject()
+		{
+			return new OracleDataAdapter();
+		}
+
+		public override bool DeriveParameters(IDbCommand command)
+		{
+			var oraCommand = command as OracleCommand;
+
+			if (null != oraCommand)
+			{
+			try
+			{
+				OracleCommandBuilder.DeriveParameters(oraCommand);
+			}
+			catch (Exception ex)
+			{
+				// Make Oracle less laconic.
+				//
+				throw new DataException(string.Format("{0}\nCommandText: {1}", ex.Message, oraCommand.CommandText), ex);
+			}
+
+			return true;
+			}
+
+			return false;
+		}
+
+		public override void AttachParameter(IDbCommand command, IDbDataParameter parameter)
+		{
+			var value = parameter.Value;
+
+			if (value is DateTime)
+			{
+				parameter.Value = new OracleTimeStamp((DateTime)value);
+			}
+			else if (value is Guid)
+			{
+				parameter.Value = ((Guid)value).ToByteArray();
+				parameter.DbType = DbType.Binary;
+				((OracleParameter)parameter).OracleDbType = OracleDbType.Raw;
+			}
+//			else if (value is string)
+//			{
+//				((OracleParameter)parameter).OracleDbType = OracleDbType.NVarChar;
+//			}
+
+			base.AttachParameter(command, parameter);
+		}
+
+		public override int ExecuteArray(IDbCommand command, int iterations)
+		{
+			var cmd = (OracleCommand)command;
+			return cmd.ExecuteArray(iterations);
+		}
+
+		public override ISqlProvider CreateSqlProvider()
+		{
+			return new OracleSqlProvider();
+		}
+
+
+		#region InsertBatch
+
+		public override int InsertBatch<T>(
+			DbManager      db,
+			string         insertText,
+			IEnumerable<T> collection,
+			MemberMapper[] members,
+			int            maxBatchSize,
+			DbManager.ParameterProvider<T> getParameters)
+		{
+			var sb  = new StringBuilder();
+			var sp  = new OracleSqlProvider();
+			var n   = 0;
+			var cnt = 0;
+			var str = "\t" + insertText
+				.Substring(0, insertText.IndexOf(") VALUES ("))
+				.Substring(7)
+				.Replace("\r", "")
+				.Replace("\n", "")
+				.Replace("\t", " ")
+				.Replace("( ", "(")
+				//.Replace("  ", " ")
+				+ ") VALUES (";
+
+			foreach (var item in collection)
+			{
+				if (sb.Length == 0)
+					sb.AppendLine("INSERT ALL");
+
+				sb.Append(str);
+
+				foreach (var member in members)
+				{
+					var value = member.GetValue(item);
+
+					if (value is Nullable<DateTime>)
+						value = ((DateTime?)value).Value;
+
+					if (value is DateTime)
+					{
+						var dt = (DateTime)value;
+						sb.Append(string.Format("to_timestamp('{0:dd.MM.yyyy HH:mm:ss.ffffff}', 'DD.MM.YYYY HH24:MI:SS.FF6')", dt));
+					}
+					else
+						sp.BuildValue(sb, value);
+
+					sb.Append(", ");
+				}
+
+				sb.Length -= 2;
+				sb.AppendLine(")");
+
+				n++;
+
+				if (n >= maxBatchSize)
+				{
+					sb.AppendLine("SELECT * FROM dual");
+
+					var sql = sb.ToString();
+
+					if (DbManager.TraceSwitch.TraceInfo)
+						DbManager.WriteTraceLine("\n" + sql.Replace("\r", ""), DbManager.TraceSwitch.DisplayName);
+
+					cnt += db.SetCommand(sql).ExecuteNonQuery();
+
+					n = 0;
+					sb.Length = 0;
+				}
+			}
+
+			if (n > 0)
+			{
+				sb.AppendLine("SELECT * FROM dual");
+
+				var sql = sb.ToString();
+
+				if (DbManager.TraceSwitch.TraceInfo)
+					DbManager.WriteTraceLine("\n" + sql.Replace("\r", ""), DbManager.TraceSwitch.DisplayName);
+
+				cnt += db.SetCommand(sql).ExecuteNonQuery();
+			}
+
+			return cnt;
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/DevartOraclePro/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,35 @@
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("BLToolkit.Data.DataProvider.DevartOracle.4")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("BLToolkit.Data.DataProvider.DevartOracle.4")]
+[assembly: AssemblyCopyright("Copyright ©  2013")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("3eccd100-83fa-4b39-af69-dffd7ba55edb")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/DevartOraclePro/Properties/licenses.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+mono.exe
+nunit-console.exe
+nunit-console-x86.exe
+nunit.exe
+nunit-x86.exe
+ProcessInvocation.exe
+ProcessInvocation86.exe
+SilverlightExecute.TestRunner.exe
+Demo.exe
+Test.exe
+Sample.exe
+Server.exe
+Demo.vshost.exe
+Test.vshost.exe
+Sample.vshost.exe
+Server.vshost.exe
+Demo.vshost32.exe
+Test.vshost32.exe
+Sample.vshost32.exe
+Server.vshost32.exe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/DevartOraclePro/Properties/licenses.licx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1 @@
+Devart.Data.Oracle.OracleConnection, Devart.Data.Oracle, Version=6.10.121.0, Culture=neutral, PublicKeyToken=09af7300eec23701
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/DevartOraclePro/app.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+  
+<system.data> 
+    <DbProviderFactories> 
+      <add name="dotConnect for Oracle" invariant="Devart.Data.Oracle" description="Devart dotConnect for Oracle" type="Devart.Data.Oracle.OracleProviderFactory, Devart.Data.Oracle, Version=8.1.36.0, Culture=neutral, PublicKeyToken=09af7300eec23701" />
+    </DbProviderFactories> 
+  </system.data></configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/DevartOraclePro/packages.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="dotConnect.Express.for.Oracle" version="8.1.36" targetFramework="net40" />
+</packages>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/Firebird/BLToolkit.Data.DataProvider.Firebird.3.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit.Data.DataProvider.Firebird</RootNamespace>
+    <AssemblyName>BLToolkit.Data.DataProvider.Firebird.3</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="FirebirdSql.Data.FirebirdClient, Version=2.5.2.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\Redist\Firebird\FirebirdSql.Data.FirebirdClient.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\Source\Data\DataProvider\FdpDataProvider.cs">
+      <Link>FdpDataProvider.cs</Link>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.3.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/Firebird/BLToolkit.Data.DataProvider.Firebird.4.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit.Data.DataProvider.Firebird</RootNamespace>
+    <AssemblyName>BLToolkit.Data.DataProvider.Firebird.4</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <TargetFrameworkProfile />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\BLToolkit.Data.DataProvider.Firebird.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\BLToolkit.Data.DataProvider.Firebird.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="FirebirdSql.Data.FirebirdClient, Version=4.0.0.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\FirebirdSql.Data.FirebirdClient.4.0.0.0\lib\net40-client\FirebirdSql.Data.FirebirdClient.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\Source\Data\DataProvider\FdpDataProvider.cs">
+      <Link>FdpDataProvider.cs</Link>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="packages.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/Firebird/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+using System;
+using System.Reflection;
+using System.Resources;
+using System.Runtime.InteropServices;
+using System.Security;
+
+using BLToolkit;
+
+[assembly: AssemblyTitle           (BLToolkitConstants.ProductName        + " Data Provider")]
+[assembly: AssemblyDescription     (BLToolkitConstants.ProductDescription + " Data Provider")]
+[assembly: AssemblyProduct         (BLToolkitConstants.ProductName        + " Data Provider")]
+[assembly: AssemblyCopyright       (BLToolkitConstants.Copyright)]
+[assembly: AssemblyCulture         ("")]
+[assembly: ComVisible              (false)]
+[assembly: Guid                    ("6c3fb028-daf7-4134-8697-eedfe34d779e")]
+[assembly: AssemblyVersion         (BLToolkitConstants.FullVersionString)]
+[assembly: AssemblyFileVersion     (BLToolkitConstants.FullVersionString)]
+[assembly: CLSCompliant            (true)]
+[assembly: NeutralResourcesLanguage("en-US")]
+//[assembly: AllowPartiallyTrustedCallers]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/Firebird/packages.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="FirebirdSql.Data.FirebirdClient" version="4.0.0.0" targetFramework="net40" />
+</packages>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/Generic/App.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+  <system.data>
+    <DbProviderFactories>
+      <remove invariant="System.Data.SQLite" />
+      <add name="SQLite Data Provider" invariant="System.Data.SQLite"
+           description=".Net Framework Data Provider for SQLite"
+           type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.77.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
+
+      <remove invariant="Oracle.DataAccess.Client" />
+      <add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client"
+           description="Oracle.DataAccess.Client"
+           type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=2.112.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
+    </DbProviderFactories>
+  </system.data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/Generic/BLToolkit.Data.DataProvider.Generic.4.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{6E7FE7FC-551F-4273-ACEB-72DC0D01120E}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit.Data.DataProvider.Generic</RootNamespace>
+    <AssemblyName>BLToolkit.Data.DataProvider.Generic.4</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Transactions" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\Source\Data\DataProvider\GenericDataProvider.cs">
+      <Link>GenericDataProvider.cs</Link>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/Generic/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+using System;
+using System.Reflection;
+using System.Resources;
+using System.Runtime.InteropServices;
+using System.Security;
+
+using BLToolkit;
+
+[assembly: AssemblyTitle           (BLToolkitConstants.ProductName        + " Data Provider")]
+[assembly: AssemblyDescription     (BLToolkitConstants.ProductDescription + " Data Provider")]
+[assembly: AssemblyProduct         (BLToolkitConstants.ProductName        + " Data Provider")]
+[assembly: AssemblyCopyright       (BLToolkitConstants.Copyright)]
+[assembly: AssemblyCulture         ("")]
+[assembly: ComVisible              (false)]
+[assembly: Guid                    ("6c3fb028-daf7-4134-8697-eedfe34d779e")]
+[assembly: AssemblyVersion         (BLToolkitConstants.FullVersionString)]
+[assembly: AssemblyFileVersion     (BLToolkitConstants.FullVersionString)]
+[assembly: CLSCompliant            (true)]
+[assembly: NeutralResourcesLanguage("en-US")]
+//[assembly: AllowPartiallyTrustedCallers]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/Informix/BLToolkit.Data.DataProvider.Informix.3.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{B1DEA25C-7667-471B-BBAD-64D017FDD104}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit.Data.DataProvider.Informix</RootNamespace>
+    <AssemblyName>BLToolkit.Data.DataProvider.Informix.3</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="IBM.Data.Informix, Version=3.0.0.2, Culture=neutral, PublicKeyToken=7c307b91aa13d208, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\Redist\IBM\IBM.Data.Informix.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\Source\Data\DataProvider\InformixDataProvider.cs">
+      <Link>InformixDataProvider.cs</Link>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.3.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/Informix/BLToolkit.Data.DataProvider.Informix.4.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{B1DEA25C-7667-471B-BBAD-64D017FDD104}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit.Data.DataProvider.Informix</RootNamespace>
+    <AssemblyName>BLToolkit.Data.DataProvider.Informix.4</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <TargetFrameworkProfile />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\BLToolkit.Data.DataProvider.Informix.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\BLToolkit.Data.DataProvider.Informix.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="IBM.Data.Informix, Version=3.0.0.2, Culture=neutral, PublicKeyToken=7c307b91aa13d208, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\Redist\IBM\IBM.Data.Informix.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\Source\Data\DataProvider\InformixDataProvider.cs">
+      <Link>InformixDataProvider.cs</Link>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/Informix/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+using System;
+using System.Reflection;
+using System.Resources;
+using System.Runtime.InteropServices;
+using System.Security;
+
+using BLToolkit;
+
+[assembly: AssemblyTitle           (BLToolkitConstants.ProductName        + " Data Provider")]
+[assembly: AssemblyDescription     (BLToolkitConstants.ProductDescription + " Data Provider")]
+[assembly: AssemblyProduct         (BLToolkitConstants.ProductName        + " Data Provider")]
+[assembly: AssemblyCopyright       (BLToolkitConstants.Copyright)]
+[assembly: AssemblyCulture         ("")]
+[assembly: ComVisible              (false)]
+[assembly: Guid                    ("6c3fb028-daf7-4134-8697-eedfe34d779e")]
+[assembly: AssemblyVersion         (BLToolkitConstants.FullVersionString)]
+[assembly: AssemblyFileVersion     (BLToolkitConstants.FullVersionString)]
+[assembly: CLSCompliant            (true)]
+[assembly: NeutralResourcesLanguage("en-US")]
+//[assembly: AllowPartiallyTrustedCallers]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/MySql/BLToolkit.Data.DataProvider.MySql.3.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit.Data.DataProvider.MySql</RootNamespace>
+    <AssemblyName>BLToolkit.Data.DataProvider.MySql.3</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="mysql.data, Version=6.4.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\MySql.Data.6.4.4\lib\net20\mysql.data.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\Source\Data\DataProvider\MySqlDataProvider.cs">
+      <Link>MySqlDataProvider.cs</Link>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.3.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/MySql/BLToolkit.Data.DataProvider.MySql.4.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit.Data.DataProvider.MySql</RootNamespace>
+    <AssemblyName>BLToolkit.Data.DataProvider.MySql.4</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\BLToolkit.Data.DataProvider.MySql.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+    <WarningLevel>4</WarningLevel>
+    <Optimize>false</Optimize>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\BLToolkit.Data.DataProvider.MySql.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="MySql.Data, Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\MySql.Data.6.8.3\lib\net40\MySql.Data.dll</HintPath>
+    </Reference>
+    <Reference Include="System">
+    </Reference>
+    <Reference Include="System.Core">
+    </Reference>
+    <Reference Include="System.Data.Linq">
+    </Reference>
+    <Reference Include="System.Data">
+    </Reference>
+    <Reference Include="System.Xml">
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\Source\Data\DataProvider\MySqlDataProvider.cs">
+      <Link>MySqlDataProvider.cs</Link>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="packages.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/MySql/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+using System;
+using System.Reflection;
+using System.Resources;
+using System.Runtime.InteropServices;
+using System.Security;
+
+using BLToolkit;
+
+[assembly: AssemblyTitle           (BLToolkitConstants.ProductName        + " Data Provider")]
+[assembly: AssemblyDescription     (BLToolkitConstants.ProductDescription + " Data Provider")]
+[assembly: AssemblyProduct         (BLToolkitConstants.ProductName        + " Data Provider")]
+[assembly: AssemblyCopyright       (BLToolkitConstants.Copyright)]
+[assembly: AssemblyCulture         ("")]
+[assembly: ComVisible              (false)]
+[assembly: Guid                    ("6c3fb028-daf7-4134-8697-eedfe34d779e")]
+[assembly: AssemblyVersion         (BLToolkitConstants.FullVersionString)]
+[assembly: AssemblyFileVersion     (BLToolkitConstants.FullVersionString)]
+[assembly: CLSCompliant            (true)]
+[assembly: NeutralResourcesLanguage("en-US")]
+//[assembly: AllowPartiallyTrustedCallers]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/MySql/packages.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="MySql.Data" version="6.8.3" targetFramework="net40" />
+</packages>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/Oracle/BLToolkit.Data.DataProvider.Oracle.3.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit.Data.DataProvider.Oracle</RootNamespace>
+    <AssemblyName>BLToolkit.Data.DataProvider.Oracle.3</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Oracle.DataAccess, Version=2.111.7.20, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\Redist\Oracle\Oracle.DataAccess.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\Source\Data\DataProvider\OdpDataProvider.cs">
+      <Link>OdpDataProvider.cs</Link>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.3.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/Oracle/BLToolkit.Data.DataProvider.Oracle.4.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit.Data.DataProvider.Oracle</RootNamespace>
+    <AssemblyName>BLToolkit.Data.DataProvider.Oracle.4</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <TargetFrameworkProfile />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\BLToolkit.Data.DataProvider.Oracle.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\BLToolkit.Data.DataProvider.Oracle.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86">
+      <HintPath>..\..\packages\odp.net.x86.112.3.20\lib\net40\Oracle.DataAccess.dll</HintPath>
+    </Reference>
+    <Reference Include="Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\odp.net.managed.121.1.1\lib\net40\Oracle.ManagedDataAccess.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\Source\Data\DataProvider\OdpDataProvider.cs">
+      <Link>OdpDataProvider.cs</Link>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="packages.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/Oracle/BLToolkit.Data.DataProvider.OracleManaged.4.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{785CE174-0A91-465F-9E41-65E6E05A0EC9}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit.Data.DataProvider.Oracle</RootNamespace>
+    <AssemblyName>BLToolkit.Data.DataProvider.OracleManaged.4</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <TargetFrameworkProfile />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>MANAGED;DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>MANAGED;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\BLToolkit.Data.DataProvider.OracleManaged.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\BLToolkit.Data.DataProvider.OracleManaged.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\odp.net.managed.121.1.0\lib\net40\Oracle.ManagedDataAccess.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\Source\Data\DataProvider\OdpDataProvider.cs">
+      <Link>OdpDataProvider.cs</Link>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/Oracle/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+using System;
+using System.Reflection;
+using System.Resources;
+using System.Runtime.InteropServices;
+using System.Security;
+
+using BLToolkit;
+
+[assembly: AssemblyTitle           (BLToolkitConstants.ProductName        + " Data Provider")]
+[assembly: AssemblyDescription     (BLToolkitConstants.ProductDescription + " Data Provider")]
+[assembly: AssemblyProduct         (BLToolkitConstants.ProductName        + " Data Provider")]
+[assembly: AssemblyCopyright       (BLToolkitConstants.Copyright)]
+[assembly: AssemblyCulture         ("")]
+[assembly: ComVisible              (false)]
+[assembly: Guid                    ("6c3fb028-daf7-4134-8697-eedfe34d779e")]
+[assembly: AssemblyVersion         (BLToolkitConstants.FullVersionString)]
+[assembly: AssemblyFileVersion     (BLToolkitConstants.FullVersionString)]
+[assembly: CLSCompliant            (true)]
+[assembly: NeutralResourcesLanguage("en-US")]
+//[assembly: AllowPartiallyTrustedCallers]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/Oracle/packages.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="odp.net.managed" version="121.1.1" targetFramework="net40" />
+  <package id="odp.net.x86" version="112.3.20" targetFramework="net40" />
+</packages>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/PostgreSQL/BLToolkit.Data.DataProvider.PostgreSQL.3.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{5A556D57-0D68-433B-AD78-02849583582B}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit.Data.DataProvider.PostgreSQL</RootNamespace>
+    <AssemblyName>BLToolkit.Data.DataProvider.PostgreSQL.3</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Mono.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\Npgsql.2.0.12.1\lib\net20\Mono.Security.dll</HintPath>
+    </Reference>
+    <Reference Include="Npgsql, Version=2.0.12.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\Npgsql.2.0.12.1\lib\net20\Npgsql.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.Linq" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\Source\Data\DataProvider\PostgreSQLDataProvider.cs">
+      <Link>PostgreSQLDataProvider.cs</Link>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.3.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <WCFMetadata Include="Service References\" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/PostgreSQL/BLToolkit.Data.DataProvider.PostgreSQL.4.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{5A556D57-0D68-433B-AD78-02849583582B}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit.Data.DataProvider.PostgreSQL</RootNamespace>
+    <AssemblyName>BLToolkit.Data.DataProvider.PostgreSQL.4</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <TargetFrameworkProfile />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\BLToolkit.Data.DataProvider.PostgreSQL.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\BLToolkit.Data.DataProvider.PostgreSQL.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Mono.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\Npgsql.2.0.14.3\lib\net40\Mono.Security.dll</HintPath>
+    </Reference>
+    <Reference Include="Npgsql, Version=2.0.14.3, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\Npgsql.2.0.14.3\lib\net40\Npgsql.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.Linq" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\Source\Data\DataProvider\PostgreSQLDataProvider.cs">
+      <Link>PostgreSQLDataProvider.cs</Link>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="packages.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/PostgreSQL/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+using System;
+using System.Reflection;
+using System.Resources;
+using System.Runtime.InteropServices;
+using System.Security;
+
+using BLToolkit;
+
+[assembly: AssemblyTitle           (BLToolkitConstants.ProductName        + " Data Provider")]
+[assembly: AssemblyDescription     (BLToolkitConstants.ProductDescription + " Data Provider")]
+[assembly: AssemblyProduct         (BLToolkitConstants.ProductName        + " Data Provider")]
+[assembly: AssemblyCopyright       (BLToolkitConstants.Copyright)]
+[assembly: AssemblyCulture         ("")]
+[assembly: ComVisible              (false)]
+[assembly: Guid                    ("6c3fb028-daf7-4134-8697-eedfe34d779e")]
+[assembly: AssemblyVersion         (BLToolkitConstants.FullVersionString)]
+[assembly: AssemblyFileVersion     (BLToolkitConstants.FullVersionString)]
+[assembly: CLSCompliant            (true)]
+[assembly: NeutralResourcesLanguage("en-US")]
+//[assembly: AllowPartiallyTrustedCallers]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/PostgreSQL/packages.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="Npgsql" version="2.0.14.3" targetFramework="net40" />
+</packages>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/SQLite/BLToolkit.Data.DataProvider.SQLite.3.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{3E414663-B673-47A8-AB59-0E08FE43DA86}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit.Data.DataProvider.SQLite</RootNamespace>
+    <AssemblyName>BLToolkit.Data.DataProvider.SQLite.3</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.SQLite, Version=1.0.60.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\Redist\SQLite\System.Data.SQLite.DLL</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\Source\Data\DataProvider\SQLiteDataProvider.cs">
+      <Link>SQLiteDataProvider.cs</Link>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.3.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/SQLite/BLToolkit.Data.DataProvider.SQLite.4.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{3E414663-B673-47A8-AB59-0E08FE43DA86}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit.Data.DataProvider.SQLite</RootNamespace>
+    <AssemblyName>BLToolkit.Data.DataProvider.SQLite.4</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <TargetFrameworkProfile />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\BLToolkit.Data.DataProvider.SQLite.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\BLToolkit.Data.DataProvider.SQLite.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Data.SQLite, Version=1.0.90.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\System.Data.SQLite.1.0.90.0\lib\net40\System.Data.SQLite.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Data.SQLite.Linq, Version=1.0.90.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\System.Data.SQLite.1.0.90.0\lib\net40\System.Data.SQLite.Linq.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\Source\Data\DataProvider\SQLiteDataProvider.cs">
+      <Link>SQLiteDataProvider.cs</Link>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="x64\SQLite.Interop.dll">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="x86\SQLite.Interop.dll">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="packages.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/SQLite/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+using System;
+using System.Reflection;
+using System.Resources;
+using System.Runtime.InteropServices;
+using System.Security;
+
+using BLToolkit;
+
+[assembly: AssemblyTitle           (BLToolkitConstants.ProductName        + " Data Provider")]
+[assembly: AssemblyDescription     (BLToolkitConstants.ProductDescription + " Data Provider")]
+[assembly: AssemblyProduct         (BLToolkitConstants.ProductName        + " Data Provider")]
+[assembly: AssemblyCopyright       (BLToolkitConstants.Copyright)]
+[assembly: AssemblyCulture         ("")]
+[assembly: ComVisible              (false)]
+[assembly: Guid                    ("6c3fb028-daf7-4134-8697-eedfe34d779e")]
+[assembly: AssemblyVersion         (BLToolkitConstants.FullVersionString)]
+[assembly: AssemblyFileVersion     (BLToolkitConstants.FullVersionString)]
+[assembly: CLSCompliant            (true)]
+[assembly: NeutralResourcesLanguage("en-US")]
+//[assembly: AllowPartiallyTrustedCallers]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/SQLite/packages.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="System.Data.SQLite" version="1.0.90.0" targetFramework="net40" />
+</packages>
\ No newline at end of file
Binary file DataProviders/SQLite/x64/SQLite.Interop.dll has changed
Binary file DataProviders/SQLite/x86/SQLite.Interop.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/SqlCe/BLToolkit.Data.DataProvider.SqlCe.3.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{85E90F57-8DE1-4912-8414-28578F4D71CD}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit.Data.DataProvider.SqlCe</RootNamespace>
+    <AssemblyName>BLToolkit.Data.DataProvider.SqlCe.3</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.SqlServerCe, Version=3.5.1.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\Redist\SqlCe\System.Data.SqlServerCe.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\Source\Data\DataProvider\SqlCeDataProvider.cs">
+      <Link>SqlCeDataProvider.cs</Link>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.3.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/SqlCe/BLToolkit.Data.DataProvider.SqlCe.4.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{85E90F57-8DE1-4912-8414-28578F4D71CD}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit.Data.DataProvider.SqlCe</RootNamespace>
+    <AssemblyName>BLToolkit.Data.DataProvider.SqlCe.4</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\BLToolkit.Data.DataProvider.SqlCe.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\BLToolkit.Data.DataProvider.SqlCe.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
+      <Private>True</Private>
+      <HintPath>..\..\packages\Microsoft.SqlServer.Compact.4.0.8876.1\lib\net40\System.Data.SqlServerCe.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\Source\Data\DataProvider\SqlCeDataProvider.cs">
+      <Link>SqlCeDataProvider.cs</Link>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="packages.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PostBuildEvent>if not exist "$(TargetDir)x86" md "$(TargetDir)x86"
+    xcopy /s /y "$(ProjectDir)...\..\packages\Microsoft.SqlServer.Compact.4.0.8876.1\NativeBinaries\x86\*.*" "$(TargetDir)x86"
+if not exist "$(TargetDir)amd64" md "$(TargetDir)amd64"
+    xcopy /s /y "$(ProjectDir)..\..\packages\Microsoft.SqlServer.Compact.4.0.8876.1\NativeBinaries\amd64\*.*" "$(TargetDir)amd64"
+    if not exist "$(TargetDir)x86" md "$(TargetDir)x86"
+    xcopy /s /y "$(SolutionDir)packages\Microsoft.SqlServer.Compact.4.0.8876.1\NativeBinaries\x86\*.*" "$(TargetDir)x86"
+    if not exist "$(TargetDir)amd64" md "$(TargetDir)amd64"
+    xcopy /s /y "$(SolutionDir)packages\Microsoft.SqlServer.Compact.4.0.8876.1\NativeBinaries\amd64\*.*" "$(TargetDir)amd64"</PostBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/SqlCe/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+using System;
+using System.Reflection;
+using System.Resources;
+using System.Runtime.InteropServices;
+using System.Security;
+
+using BLToolkit;
+
+[assembly: AssemblyTitle           (BLToolkitConstants.ProductName        + " Data Provider")]
+[assembly: AssemblyDescription     (BLToolkitConstants.ProductDescription + " Data Provider")]
+[assembly: AssemblyProduct         (BLToolkitConstants.ProductName        + " Data Provider")]
+[assembly: AssemblyCopyright       (BLToolkitConstants.Copyright)]
+[assembly: AssemblyCulture         ("")]
+[assembly: ComVisible              (false)]
+[assembly: Guid                    ("6c3fb028-daf7-4134-8697-eedfe34d779e")]
+[assembly: AssemblyVersion         (BLToolkitConstants.FullVersionString)]
+[assembly: AssemblyFileVersion     (BLToolkitConstants.FullVersionString)]
+[assembly: CLSCompliant            (true)]
+[assembly: NeutralResourcesLanguage("en-US")]
+//[assembly: AllowPartiallyTrustedCallers]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/SqlCe/packages.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="Microsoft.SqlServer.Compact" version="4.0.8876.1" targetFramework="net40" />
+</packages>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/Sybase/BLToolkit.Data.DataProvider.Sybase.3.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{6CD8CC3D-643D-4D09-8660-A26085C44FBC}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit.Data.DataProvider.Sybase</RootNamespace>
+    <AssemblyName>BLToolkit.Data.DataProvider.Sybase.3</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Sybase.AdoNet2.AseClient, Version=1.15.192.0, Culture=neutral, PublicKeyToken=95d94fac46c88e1e, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\Redist\Sybase\Sybase.AdoNet2.AseClient.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\Source\Data\DataProvider\SybaseDataProvider.cs">
+      <Link>SybaseDataProvider.cs</Link>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.3.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/Sybase/BLToolkit.Data.DataProvider.Sybase.4.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{6CD8CC3D-643D-4D09-8660-A26085C44FBC}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit.Data.DataProvider.Sybase</RootNamespace>
+    <AssemblyName>BLToolkit.Data.DataProvider.Sybase.4</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <TargetFrameworkProfile />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\BLToolkit.Data.DataProvider.Sybase.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\BLToolkit.Data.DataProvider.Sybase.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Sybase.AdoNet2.AseClient, Version=1.15.192.0, Culture=neutral, PublicKeyToken=95d94fac46c88e1e, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\Redist\Sybase\Sybase.AdoNet2.AseClient.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\Source\Data\DataProvider\SybaseDataProvider.cs">
+      <Link>SybaseDataProvider.cs</Link>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataProviders/Sybase/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+using System;
+using System.Reflection;
+using System.Resources;
+using System.Runtime.InteropServices;
+using System.Security;
+
+using BLToolkit;
+
+[assembly: AssemblyTitle           (BLToolkitConstants.ProductName        + " Data Provider")]
+[assembly: AssemblyDescription     (BLToolkitConstants.ProductDescription + " Data Provider")]
+[assembly: AssemblyProduct         (BLToolkitConstants.ProductName        + " Data Provider")]
+[assembly: AssemblyCopyright       (BLToolkitConstants.Copyright)]
+[assembly: AssemblyCulture         ("")]
+[assembly: ComVisible              (false)]
+[assembly: Guid                    ("6c3fb028-daf7-4134-8697-eedfe34d779e")]
+[assembly: AssemblyVersion         (BLToolkitConstants.FullVersionString)]
+[assembly: AssemblyFileVersion     (BLToolkitConstants.FullVersionString)]
+[assembly: CLSCompliant            (true)]
+[assembly: NeutralResourcesLanguage("en-US")]
+//[assembly: AllowPartiallyTrustedCallers]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/BusinessLogic/Cart.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,145 @@
+using System;
+using System.Collections.Generic;
+
+namespace PetShop.BusinessLogic
+{
+	using ObjectModel;
+
+	[Serializable]
+	public class Cart
+	{
+		/// <summary>
+		/// Calculate the total for all the cartItems in the Cart
+		/// </summary>
+		public decimal Total
+		{
+			get
+			{
+				decimal total = 0;
+
+				foreach (CartItem item in _items.Values)
+					total += item.Subtotal;
+
+				return total;
+			}
+		}
+
+		/// <summary>
+		/// Update the quantity for item that exists in the cart
+		/// </summary>
+		/// <param name="itemId">Item Id</param>
+		/// <param name="qty">Quantity</param>
+		public void SetQuantity(string itemId, int qty)
+		{
+			_items[itemId].Quantity = qty;
+		}
+
+		/// <summary>
+		/// Return the number of unique items in cart
+		/// </summary>
+		public int Count
+		{
+			get { return _items.Count; }
+		}
+
+		/// <summary>
+		/// Add an item to the cart.
+		/// When ItemId to be added has already existed, this method will update the quantity instead.
+		/// </summary>
+		/// <param name="itemId">Item Id of item to add</param>
+		public void Add(string itemId)
+		{
+			CartItem cartItem;
+
+			if (!_items.TryGetValue(itemId, out cartItem))
+			{
+				Item item = new ProductManager().GetItem(itemId);
+
+				if (item != null)
+				{
+					cartItem = new CartItem();
+
+					cartItem.ItemID     = itemId;
+					cartItem.Name       = item.ProductName;
+					cartItem.Price      = (decimal)item.Price;
+					cartItem.Type       = item.Name;
+					cartItem.CategoryID = item.CategoryID;
+					cartItem.ProductID  = item.ProductID;
+
+					_items.Add(itemId, cartItem);
+				}
+			}
+
+			cartItem.Quantity++;
+		}
+
+		/// <summary>
+		/// Add an item to the cart.
+		/// When ItemId to be added has already existed, this method will update the quantity instead.
+		/// </summary>
+		/// <param name="item">Item to add</param>
+		public void Add(CartItem item)
+		{
+			CartItem cartItem;
+
+			if (!_items.TryGetValue(item.ItemID, out cartItem))
+				_items.Add(item.ItemID, item);
+			else
+				cartItem.Quantity += item.Quantity;
+		}
+
+		/// <summary>
+		/// Remove item from the cart based on <paramref name="itemId"/>
+		/// </summary>
+		/// <param name="itemId">ItemId of item to remove</param>
+		public void Remove(string itemId)
+		{
+			_items.Remove(itemId);
+		}
+
+		// Internal storage for a cart	  
+		private Dictionary<string, CartItem> _items = new Dictionary<string, CartItem>();
+
+		/// <summary>
+		/// Returns all items in the cart. Useful for looping through the cart.
+		/// </summary>
+		/// <returns>Collection of CartItemInfo</returns>
+		public ICollection<CartItem> Items
+		{
+			get { return _items.Values; }
+		}
+
+		/// <summary>
+		/// Method to convert all cart items to order line items
+		/// </summary>
+		/// <returns>A new array of order line items</returns>
+		public OrderLineItem[] GetOrderLineItems()
+		{
+			OrderLineItem[] items = new OrderLineItem[_items.Count];
+
+			int lineNum = 0;
+
+			foreach (CartItem item in _items.Values)
+			{
+				OrderLineItem line = new OrderLineItem();
+
+				items[lineNum] = line;
+
+				line.ItemID   = item.ItemID;
+				line.Line     = ++lineNum;
+				line.Quantity = item.Quantity;
+				line.Price    = item.Price;
+			}
+
+			return items;
+		}
+
+		/// <summary>
+		/// Clear the cart
+		/// </summary>
+		public void Clear()
+		{
+			_items.Clear();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/BusinessLogic/DataAccess/AccessorBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,130 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Text;
+
+using BLToolkit.Aspects;
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+using BLToolkit.Reflection;
+
+namespace PetShop.BusinessLogic.DataAccess
+{
+	[Log, Counter]
+	public abstract class AccessorBase<D, A> : DataAccessor
+		where D : DbManager, new()
+		where A : AccessorBase<D, A>
+	{
+		#region Overrides
+
+		[NoInterception]
+		protected override DbManager CreateDbManager()
+		{
+			return new D();
+		}
+
+		#endregion
+
+		#region CreateInstance
+
+		public static A CreateInstance()
+		{
+			return TypeAccessor<A>.CreateInstance();
+		}
+
+		#endregion
+
+		#region Query
+
+		[Log, Counter]
+		public abstract class PetShopQuery : SqlQuery
+		{
+			[NoInterception]
+			protected override DbManager CreateDbManager()
+			{
+				return new D();
+			}
+
+			#region SelectByKeyWords
+
+			public virtual List<T> SelectByKeyWords<T>(string[] keyWords)
+			{
+				StringBuilder sql = new StringBuilder("SELECT * FROM ");
+
+				sql.Append(GetTableName(typeof(T)));
+				sql.Append(" WHERE ");
+
+				for (int i = 0; i < keyWords.Length; i++)
+				{
+					if (i > 0)
+						sql.Append(" OR ");
+
+					sql.AppendFormat("LOWER(Name) LIKE @kw{0} OR LOWER(CategoryId) LIKE @kw{0}", i);
+				}
+
+				using (DbManager db = GetDbManager())
+				{
+					IDbDataParameter[] parms = new IDbDataParameter[keyWords.Length];
+
+					for (int i = 0; i < keyWords.Length; i++)
+						parms[i] = db.Parameter("@kw" + i, "%" + keyWords[i].ToLower() + "%");
+
+					return db.SetCommand(sql.ToString(), parms).ExecuteList<T>();
+				}
+			}
+
+			#endregion
+
+			#region InsertAndGetIdentity
+
+			public virtual int InsertAndGetIdentity(DbManager db, object obj)
+			{
+				SqlQueryInfo query = GetSqlQueryInfo(db, obj.GetType(), "InsertAndGetIdentity");
+
+				return db
+					.SetCommand(query.QueryText, query.GetParameters(db, obj))
+					.ExecuteScalar<int>();
+			}
+
+			public virtual int InsertAndGetIdentity(object obj)
+			{
+				DbManager db = GetDbManager();
+
+				try
+				{
+					return InsertAndGetIdentity(db, obj);
+				}
+				finally
+				{
+					Dispose(db);
+				}
+			}
+
+			[NoInterception]
+			protected override SqlQueryInfo CreateSqlText(DbManager db, Type type, string actionName)
+			{
+				switch (actionName)
+				{
+					case "InsertAndGetIdentity":
+						SqlQueryInfo qi = CreateInsertSqlText(db, type, -1);
+
+						qi.QueryText += "\nSELECT Cast(SCOPE_IDENTITY() as int)";
+
+						return qi;
+
+					default :
+						return  base.CreateSqlText(db, type, actionName);
+				}
+			}
+
+			#endregion
+		}
+
+		public PetShopQuery Query
+		{
+			get { return TypeAccessor<PetShopQuery>.CreateInstance(); }
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/BusinessLogic/DataAccess/InventoryAccessor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,17 @@
+using System;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+
+namespace PetShop.BusinessLogic.DataAccess
+{
+	using ObjectModel;
+
+	public abstract class InventoryAccessor : AccessorBase<InventoryAccessor.DB, InventoryAccessor>
+	{
+		public class DB : DbManager { public DB() : base("InventoryDB") {} }
+
+		[SqlQuery(@"UPDATE Inventory SET Qty = Qty - @qty WHERE ItemId = @itemId")]
+		public abstract void TakeInventory(DbManager db, int @qty, string @itemId);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/BusinessLogic/DataAccess/OrderAccessor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+
+namespace PetShop.BusinessLogic.DataAccess
+{
+	using ObjectModel;
+
+	public abstract class OrderAccessor : AccessorBase<OrderAccessor.DB, OrderAccessor>
+	{
+		public class DB : DbManager { public DB() : base("OrderDB") {} }
+
+		[SqlQuery(@"INSERT INTO OrderStatus (OrderId, LineNum, Timestamp, Status) VALUES (@id, @id, GetDate(), 'P')")]
+		public abstract void InsertStatus(DbManager db, int @id);
+
+		[SqlQuery(@"
+			SELECT
+				o.*,
+				os.Status
+			FROM
+				Orders o
+					JOIN OrderStatus os ON os.OrderId = o.OrderId
+			ORDER BY
+				o.OrderId DESC")]
+		public abstract List<Order> GetAllOrderList();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/BusinessLogic/DataAccess/ProductAccessor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,67 @@
+using System;
+using System.Collections.Generic;
+
+using BLToolkit.Aspects;
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+
+namespace PetShop.BusinessLogic.DataAccess
+{
+	using ObjectModel;
+
+	public abstract class ProductAccessor : AccessorBase<ProductAccessor.DB, ProductAccessor>
+	{
+		public class DB : DbManager { public DB() : base("ProductDB") {} }
+
+		#region Item
+
+		const string _itemQuery = @"
+			SELECT
+				i.*,
+				n.Qty,
+				p.Name as ProductName,
+				p.CategoryId
+			FROM
+				Item i
+					JOIN Product   p ON p.ProductId = i.ProductId
+					JOIN Inventory n ON n.ItemId    = i.ItemId";
+
+		[SqlQuery(_itemQuery + @" WHERE i.ProductId = @id")]
+		public abstract IList<Item> GetItemListByProductID(string @id);
+
+		[SqlQuery(_itemQuery + @" WHERE i.ItemId = @itemID")]
+		public abstract Item GetItem(string @itemID);
+
+		[SqlQuery(_itemQuery + @" ORDER BY i.Name")]
+		public abstract List<Item> GetAllItemList();
+
+		#endregion
+
+		#region Product
+
+		[Cache(MaxMinutes = 60)]
+		[SqlQuery(@"SELECT * FROM Product WHERE CategoryId = @id")]
+		public abstract IList<Product> GetProductListByCategoryID(string @id);
+
+		#endregion
+
+		#region Categoty
+
+		// This method needs to be cached, so we can't call Query.SelectByKey directly from the manager class.
+		//
+		[Cache(MaxMinutes=60)]
+		public virtual Category GetCategory(string id)
+		{
+			return Query.SelectByKey<Category>(id);
+		}
+
+		#endregion
+
+		#region Inventory
+
+		[SqlQuery(@"SELECT Qty FROM Inventory WHERE ItemId = @itemId")]
+		public abstract int CurrentQtyInStock(string @itemId);
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/BusinessLogic/DataAccess/ProfileAccessor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,183 @@
+using System;
+using System.Collections.Generic;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+
+namespace PetShop.BusinessLogic.DataAccess
+{
+	using ObjectModel;
+
+	public abstract class ProfileAccessor : AccessorBase<ProfileAccessor.DB, ProfileAccessor>
+	{
+		public class DB : DbManager { public DB() : base("ProfileDB") {} }
+
+		[SqlQuery(@"
+			SELECT
+				UniqueID
+			FROM
+				Profiles
+			WHERE
+				Username = @userName AND ApplicationName = @appName")]
+		public abstract int? GetUniqueID(string @userName, string @appName);
+
+		[SqlQuery(@"
+			SELECT
+				UniqueID
+			FROM
+				Profiles
+			WHERE
+				Username = @userName AND ApplicationName = @appName AND IsAnonymous != @isAuthenticated")]
+		public abstract int? GetUniqueIDAuth(string @userName, string @appName, bool @isAuthenticated);
+
+		[SqlQuery(@"
+			INSERT INTO Profiles (
+				Username,  ApplicationName, LastActivityDate, LastUpdatedDate, IsAnonymous
+			) Values (
+				@userName, @appName, getdate(), getdate(), CASE WHEN @isAuthenticated = 1 THEN 0 ELSE 1 END
+			)
+
+			SELECT SCOPE_IDENTITY()")]
+		public abstract int CreateProfile(string @userName, string @appName, bool @isAuthenticated);
+
+		[SqlQuery(@"
+			SELECT
+				a.FirstName as ToFirstName,
+				a.LastName  as ToLastName,
+				a.Address1  as Addr1,
+				a.Address2  as Addr2,
+				a.City,
+				a.State,
+				a.Zip,
+				a.Country,
+				a.Email,
+				a.Phone
+			FROM
+				Account a
+					JOIN Profiles p ON p.UniqueID = a.UniqueID
+			WHERE
+				p.Username = @userName AND p.ApplicationName = @appName;")]
+		public abstract Address GetAccountInfo(string @userName, string @appName);
+
+		[SqlQuery(@"
+			SELECT
+				c.ItemId,
+				c.Name,
+				c.Type,
+				c.Price,
+				c.CategoryId,
+				c.ProductId,
+				c.Quantity
+			FROM
+				Profiles p
+					JOIN Cart c ON c.UniqueID = p.UniqueID
+			WHERE
+				p.Username        = @userName AND
+				p.ApplicationName = @appName AND
+				c.IsShoppingCart  = @isShoppingCart")]
+		public abstract IList<CartItem> GetCartItems(string @userName, string @appName, bool @isShoppingCart);
+
+		[SqlQuery(@"
+			DELETE FROM Account WHERE UniqueID = @uniqueID
+
+			INSERT INTO Account (
+				UniqueID, Email, FirstName, LastName, Address1, Address2, City, State, Zip, Country, Phone
+			) VALUES (
+				@uniqueID, @Email, @ToFirstName, @ToLastName, @Addr1, @Addr2, @City, @State, @Zip, @Country, @Phone
+			)")]
+		public abstract void SetAccountInfo(int @uniqueID, Address address);
+
+		// This method is not abstract as BLToolkit does not generate methods for the ExecuteForEach method.
+		// It's virtual as we want to get statistic info for this method.
+		// Counter and Log aspects wrap all abstract, virtual, and override members.
+		//
+		public virtual void SetCartItems(int uniqueID, ICollection<CartItem> cartItems, bool isShoppingCart)
+		{
+			using (DbManager db = GetDbManager())
+			{
+				db.BeginTransaction();
+
+				db
+					.SetCommand(@"
+						DELETE FROM
+							Cart
+						WHERE
+							UniqueID = @uniqueID AND IsShoppingCart = @isShoppingCart",
+						db.Parameter("@uniqueID",       uniqueID),
+						db.Parameter("@isShoppingCart", isShoppingCart))
+					.ExecuteNonQuery();
+
+				if (cartItems.Count > 0)
+				{
+					db
+						.SetCommand(@"
+							INSERT INTO Cart (
+								UniqueID, ItemId, Name, Type, Price, CategoryId, ProductId, IsShoppingCart, Quantity
+							) VALUES (
+								@uniqueID, @ItemId, @Name, @Type, @Price, @CategoryId, @ProductId, @isShoppingCart, @Quantity
+							)",
+							db.CreateParameters(typeof(CartItem),
+							db.Parameter("@uniqueID",       uniqueID),
+							db.Parameter("@isShoppingCart", isShoppingCart)))
+						.ExecuteForEach(cartItems);
+				}
+
+				db.CommitTransaction();
+			}
+		}
+
+		[SqlQuery(@"
+			UPDATE
+				Profiles
+			SET
+				LastActivityDate = getdate()
+			WHERE
+				Username = @userName AND ApplicationName = @appName")]
+		public abstract void UpdateActivityDate(string @userName, string @appName);
+
+		[SqlQuery(@"
+			UPDATE
+				Profiles
+			SET
+				LastActivityDate = getdate(),
+				LastUpdatedDate  = getdate()
+			WHERE
+				Username = @userName AND ApplicationName = @appName")]
+		public abstract void UpdateActivityAndUdpateDates(string @userName, string @appName);
+
+		[SqlQuery(@"DELETE FROM Profiles WHERE UniqueID = @uniqueID")]
+		[ScalarSource(ScalarSourceType.AffectedRows)]
+		public abstract int DeleteProfile(int @uniqueID);
+
+		[SqlQuery(@"
+			SELECT
+				Username
+			FROM
+				Profiles
+			WHERE ApplicationName = @appName AND LastActivityDate <= @userInactiveSinceDate")]
+		public abstract IList<string> GetInactiveProfiles(DateTime userInactiveSinceDate, string appName);
+
+		[SqlQuery(@"
+			SELECT
+				Username
+			FROM
+				Profiles
+			WHERE ApplicationName = @appName AND LastActivityDate <= @userInactiveSinceDate AND IsAnonymous = @isAnonymous")]
+		public abstract IList<string> GetInactiveProfiles(DateTime @userInactiveSinceDate, string @appName, bool @isAnonymous);
+
+		const string _profileQuery = @"
+			FROM
+				Profiles
+			WHERE
+				ApplicationName = @appName AND
+				(@isAnonymous           IS NULL OR IsAnonymous = @isAnonymous) AND
+				(@userName              IS NULL OR Username LIKE @userName)    AND
+				(@userInactiveSinceDate IS NULL OR LastActivityDate >= @userInactiveSinceDate)";
+
+		[SqlQuery(@"
+			SELECT @totalRecords = Count(*)" + _profileQuery + @"
+			SELECT *" + _profileQuery)]
+		public abstract IList<CustomProfile> GetProfile(
+			bool? @isAnonymous, string @userName, DateTime? @userInactiveSinceDate, string @appName, out int @totalRecords);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/BusinessLogic/OrderManager.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,71 @@
+using System;
+using System.Collections.Generic;
+using System.Transactions;
+
+using BLToolkit.Data;
+
+namespace PetShop.BusinessLogic
+{
+	using DataAccess;
+	using ObjectModel;
+
+	public class OrderManager
+	{
+		#region Order
+
+		/// <summary>
+		/// Inserts the order and updates the inventory stock within a transaction.
+		/// </summary>
+		/// <param name="order">All information about the order</param>
+		public void InsertOrder(Order order)
+		{
+			using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))
+			{
+				OrderAccessor accessor = Accessor;
+
+				using (DbManager db = accessor.GetDbManager())
+				{
+					order.Courier = "UPS";
+					order.Locale  = "US_en";
+					order.ID      = accessor.Query.InsertAndGetIdentity(db, order);
+
+					accessor.InsertStatus(db, order.ID);
+
+					for (int i = 0; i < order.Lines.Length; i++)
+					{
+						OrderLineItem line = order.Lines[i];
+
+						line.OrderID = order.ID;
+
+						accessor.Query.Insert(line);
+					}
+				}
+
+				InventoryAccessor inv = InventoryAccessor.CreateInstance();
+
+				using (DbManager db = inv.GetDbManager())
+					foreach (OrderLineItem line in order.Lines)
+						inv.TakeInventory(db, line.Quantity, line.ItemID);
+
+				ts.Complete();
+			}
+		}
+
+		public List<Order> GetAllOrderList()
+		{
+			return Accessor.GetAllOrderList();
+		}
+
+		#endregion
+
+		#region Accessor
+
+		OrderAccessor Accessor
+		{
+			[System.Diagnostics.DebuggerStepThrough]
+			get { return OrderAccessor.CreateInstance(); }
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/BusinessLogic/PetShop.BusinessLogic.2005.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,71 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.50727</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>PetShop.BusinessLogic</RootNamespace>
+    <AssemblyName>PetShop.BusinessLogic</AssemblyName>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.configuration" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Transactions" />
+    <Reference Include="System.Web" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Cart.cs" />
+    <Compile Include="DataAccess\ProductAccessor.cs" />
+    <Compile Include="DataAccess\AccessorBase.cs" />
+    <Compile Include="DataAccess\InventoryAccessor.cs" />
+    <Compile Include="DataAccess\OrderAccessor.cs" />
+    <Compile Include="DataAccess\ProfileAccessor.cs" />
+    <Compile Include="OrderManager.cs" />
+    <Compile Include="ProfileProvider.cs" />
+    <Compile Include="ProductManager.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\Source\BLToolkit.2.csproj">
+      <Project>{F4DF7358-8EE6-49FD-AB13-EA5145058D79}</Project>
+      <Name>BLToolkit.2</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\ObjectModel\PetShop.ObjectModel.2005.csproj">
+      <Project>{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}</Project>
+      <Name>PetShop.ObjectModel.2005</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/BusinessLogic/PetShop.BusinessLogic.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{01C318D0-1CB1-4CB4-A5ED-D311665C76EE}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>PetShop.BusinessLogic</RootNamespace>
+    <AssemblyName>PetShop.BusinessLogic</AssemblyName>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkProfile />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\PetShop.BusinessLogic.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\PetShop.BusinessLogic.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.configuration" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Transactions" />
+    <Reference Include="System.Web" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Cart.cs" />
+    <Compile Include="DataAccess\ProductAccessor.cs" />
+    <Compile Include="DataAccess\AccessorBase.cs" />
+    <Compile Include="DataAccess\InventoryAccessor.cs" />
+    <Compile Include="DataAccess\OrderAccessor.cs" />
+    <Compile Include="DataAccess\ProfileAccessor.cs" />
+    <Compile Include="OrderManager.cs" />
+    <Compile Include="ProfileProvider.cs" />
+    <Compile Include="ProductManager.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\ObjectModel\PetShop.ObjectModel.csproj">
+      <Project>{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}</Project>
+      <Name>PetShop.ObjectModel</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/BusinessLogic/ProductManager.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,79 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace PetShop.BusinessLogic
+{
+	using DataAccess;
+	using ObjectModel;
+
+	public class ProductManager
+	{
+		#region Product
+
+		public Product GetProduct(string id)
+		{
+			return Accessor.Query.SelectByKey<Product>(id) ?? new Product();
+		}
+
+		public IList<Product> GetProductListByCategoryID(string id)
+		{
+			return Accessor.GetProductListByCategoryID(id);
+		}
+
+		public IList<Product> SearchProducts(string[] keyWords)
+		{
+			return Accessor.Query.SelectByKeyWords<Product>(keyWords);
+		}
+
+		#endregion
+
+		#region Item
+
+		public IList<Item> GetItemListByProductID(string id)
+		{
+			return Accessor.GetItemListByProductID(id);
+		}
+
+		public Item GetItem(string itemId)
+		{
+			return Accessor.GetItem(itemId);
+		}
+
+		public List<Item> GetAllItemList()
+		{
+			return Accessor.GetAllItemList();
+		}
+
+		#endregion
+
+		#region Category
+
+		public IList<Category> GetCategoryList()
+		{
+			return Accessor.Query.SelectAll<Category>();
+		}
+
+		public Category GetCategory(string id)
+		{
+			return Accessor.GetCategory(id);
+		}
+
+		public List<Category> SearchCategories(string[] keyWords)
+		{
+			return Accessor.Query.SelectByKeyWords<Category>(keyWords);
+		}
+
+		#endregion
+
+		#region Accessor
+
+		ProductAccessor Accessor
+		{
+			[System.Diagnostics.DebuggerStepThrough]
+			get { return ProductAccessor.CreateInstance(); }
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/BusinessLogic/ProfileProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,419 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.Specialized;
+using System.Configuration;
+using System.Web.Profile;
+
+namespace PetShop.BusinessLogic
+{
+	using DataAccess;
+	using ObjectModel;
+
+	public sealed class ProfileProvider : System.Web.Profile.ProfileProvider
+	{
+		private static string _applicationName = ".NET Pet Shop 4.0";
+
+		/// <summary>
+		/// The name of the application using the custom profile provider.
+		/// </summary>
+		public override string ApplicationName
+		{
+			get { return _applicationName;  }
+			set { _applicationName = value; }
+		}
+
+		/// <summary>
+		/// Initializes the provider.
+		/// </summary>
+		/// <param name="name">The friendly name of the provider.</param>
+		/// <param name="config">A collection of the name/value pairs representing the provider-specific attributes specified in the configuration for this provider.</param>
+		public override void Initialize(string name, NameValueCollection config)
+		{
+			if (config == null)
+				throw new ArgumentNullException("config");
+
+			if (string.IsNullOrEmpty(config["description"]))
+			{
+				config.Remove("description");
+				config.Add("description", "Pet Shop Custom Profile Provider");
+			}
+
+			if (string.IsNullOrEmpty(name))
+				name = "PetShopProfileProvider";
+
+			if (config["applicationName"] != null && !string.IsNullOrEmpty(config["applicationName"].Trim()))
+				_applicationName = config["applicationName"];
+
+			base.Initialize(name, config);
+		}
+
+		private const string ERR_INVALID_PARAMETER = "Invalid Profile parameter:";
+		private const string PROFILE_SHOPPINGCART  = "ShoppingCart";
+		private const string PROFILE_WISHLIST      = "WishList";
+		private const string PROFILE_ACCOUNT       = "AccountInfo";
+
+		/// <summary>
+		/// Returns the collection of settings property values for the specified application instance and settings property group.
+		/// </summary>
+		/// <param name="context">A System.Configuration.SettingsContext describing the current application use.</param>
+		/// <param name="collection">A System.Configuration.SettingsPropertyCollection containing the settings property group whose values are to be retrieved.</param>
+		/// <returns>A System.Configuration.SettingsPropertyValueCollection containing the values for the specified settings property group.</returns>
+		public override SettingsPropertyValueCollection GetPropertyValues(
+			SettingsContext context, SettingsPropertyCollection collection)
+		{
+			string username        = (string)context["UserName"];
+			bool   isAuthenticated = (bool)  context["IsAuthenticated"];
+
+			SettingsPropertyValueCollection svc = new SettingsPropertyValueCollection();
+
+			foreach (SettingsProperty prop in collection)
+			{
+				SettingsPropertyValue pv = new SettingsPropertyValue(prop);
+
+				switch (pv.Property.Name)
+				{
+					case PROFILE_SHOPPINGCART: pv.PropertyValue = GetCartItems(username, true);  break;
+					case PROFILE_WISHLIST:     pv.PropertyValue = GetCartItems(username, false); break;
+					case PROFILE_ACCOUNT:
+						if (isAuthenticated)
+							pv.PropertyValue = GetAccountInfo(username);
+						break;
+
+					default:
+						throw new ApplicationException(ERR_INVALID_PARAMETER + " name.");
+				}
+
+				svc.Add(pv);
+			}
+
+			return svc;
+		}
+
+		/// <summary>
+		/// Sets the values of the specified group of property settings.
+		/// </summary>
+		/// <param name="context">A System.Configuration.SettingsContext describing the current application usage.</param>
+		/// <param name="collection">A System.Configuration.SettingsPropertyValueCollection representing the group of property settings to set.</param>
+		public override void SetPropertyValues(SettingsContext context, SettingsPropertyValueCollection collection)
+		{
+			string username = (string)context["UserName"];
+
+			CheckUserName(username);
+
+			bool isAuthenticated = (bool)context["IsAuthenticated"];
+			int  uniqueID        = GetUniqueID(username, isAuthenticated, false, ApplicationName);
+
+			foreach (SettingsPropertyValue pv in collection)
+			{
+				if (pv.PropertyValue != null)
+				{
+					switch (pv.Property.Name)
+					{
+						case PROFILE_SHOPPINGCART: SetCartItems(uniqueID, (Cart)pv.PropertyValue, true);  break;
+						case PROFILE_WISHLIST:     SetCartItems(uniqueID, (Cart)pv.PropertyValue, false); break;
+						case PROFILE_ACCOUNT:
+							if (isAuthenticated)
+								SetAccountInfo(uniqueID, (Address)pv.PropertyValue);
+							break;
+
+						default:
+							throw new ApplicationException(ERR_INVALID_PARAMETER + " name.");
+					}
+				}
+			}
+
+			UpdateActivityDates(username, false);
+		}
+
+		private int GetUniqueID(string userName, bool isAuthenticated, bool ignoreAuthenticationType, string appName)
+		{
+			int? uniqueID = ignoreAuthenticationType ?
+				Accessor.GetUniqueID    (userName, appName) :
+				Accessor.GetUniqueIDAuth(userName, appName, isAuthenticated);
+
+			return uniqueID ?? Accessor.CreateProfile(userName, appName, isAuthenticated);
+		}
+
+		private Address GetAccountInfo(string username)
+		{
+			return Accessor.GetAccountInfo(username, _applicationName);
+		}
+
+		private Cart GetCartItems(string username, bool isShoppingCart)
+		{
+			Cart cart = new Cart();
+
+			foreach (CartItem cartItem in Accessor.GetCartItems(username, _applicationName, isShoppingCart))
+				cart.Add(cartItem);
+
+			return cart;
+		}
+
+		private void SetAccountInfo(int uniqueID, Address address)
+		{
+			Accessor.SetAccountInfo(uniqueID, address);
+		}
+
+		private void SetCartItems(int uniqueID, Cart cart, bool isShoppingCart)
+		{
+			Accessor.SetCartItems(uniqueID, cart.Items, isShoppingCart);
+		}
+
+		// UpdateActivityDates
+		// Updates the LastActivityDate and LastUpdatedDate values 
+		// when profile properties are accessed by the
+		// GetPropertyValues and SetPropertyValues methods. 
+		// Passing true as the activityOnly parameter will update
+		// only the LastActivityDate.
+		private void UpdateActivityDates(string username, bool activityOnly)
+		{
+			if (activityOnly)
+				Accessor.UpdateActivityDate(username, _applicationName);
+			else
+				Accessor.UpdateActivityAndUdpateDates(username, _applicationName);
+		}
+
+		/// <summary>
+		/// Deletes profile properties and information for the supplied list of profiles.
+		/// </summary>
+		/// <param name="profiles">A System.Web.Profile.ProfileInfoCollection of information about profiles that are to be deleted.</param>
+		/// <returns>The number of profiles deleted from the data source.</returns>
+		public override int DeleteProfiles(ProfileInfoCollection profiles)
+		{
+			int deleteCount = 0;
+
+			foreach (ProfileInfo p in profiles)
+				if (DeleteProfile(p.UserName))
+					deleteCount++;
+
+			return deleteCount;
+		}
+
+		/// <summary>
+		/// Deletes profile properties and information for profiles that match the supplied list of user names.
+		/// </summary>
+		/// <param name="usernames">A string array of user names for profiles to be deleted.</param>
+		/// <returns>The number of profiles deleted from the data source.</returns>
+		public override int DeleteProfiles(string[] usernames)
+		{
+			int deleteCount = 0;
+
+			foreach (string user in usernames)
+				if (DeleteProfile(user))
+					deleteCount++;
+
+			return deleteCount;
+		}
+
+		// DeleteProfile
+		// Deletes profile data from the database for the specified user name.
+		private bool DeleteProfile(string username)
+		{
+			CheckUserName(username);
+
+			int? uniqueID = Accessor.GetUniqueID(username, _applicationName);
+
+			return uniqueID != null && Accessor.DeleteProfile(uniqueID.Value) > 0;
+		}
+
+		// Verifies user name for sise and comma
+		private static void CheckUserName(string userName)
+		{
+			if (string.IsNullOrEmpty(userName) || userName.Length > 256 || userName.IndexOf(",") > 0)
+				throw new ApplicationException(ERR_INVALID_PARAMETER + " user name.");
+		}
+
+		/// <summary>
+		/// Deletes all user-profile data for profiles in which the last activity date occurred before the specified date.
+		/// </summary>
+		/// <param name="authenticationOption">One of the System.Web.Profile.ProfileAuthenticationOption values, specifying whether anonymous, authenticated, or both types of profiles are deleted.</param>
+		/// <param name="userInactiveSinceDate">A System.DateTime that identifies which user profiles are considered inactive. If the System.Web.Profile.ProfileInfo.LastActivityDate value of a user profile occurs on or before this date and time, the profile is considered inactive.</param>
+		/// <returns>The number of profiles deleted from the data source.</returns>
+		public override int DeleteInactiveProfiles(ProfileAuthenticationOption authenticationOption, DateTime userInactiveSinceDate)
+		{
+			IList<string> list;
+
+			switch (authenticationOption)
+			{
+				case ProfileAuthenticationOption.Anonymous:
+					list = Accessor.GetInactiveProfiles(userInactiveSinceDate, ApplicationName, true);
+					break;
+
+				case ProfileAuthenticationOption.Authenticated:
+					list = Accessor.GetInactiveProfiles(userInactiveSinceDate, ApplicationName, false);
+					break;
+
+				default:
+					list = Accessor.GetInactiveProfiles(userInactiveSinceDate, ApplicationName);
+					break;
+			}
+
+			string[] userArray = new string[list.Count];
+
+			list.CopyTo(userArray, 0);
+
+			return DeleteProfiles(userArray);
+		}
+
+		/// <summary>
+		/// Retrieves profile information for profiles in which the user name matches the specified user names.
+		/// </summary>
+		/// <param name="authenticationOption">One of the System.Web.Profile.ProfileAuthenticationOption values, specifying whether anonymous, authenticated, or both types of profiles are returned.</param>
+		/// <param name="usernameToMatch">The user name to search for.</param>
+		/// <param name="pageIndex">The index of the page of results to return.</param>
+		/// <param name="pageSize">The size of the page of results to return.</param>
+		/// <param name="totalRecords">When this method returns, contains the total number of profiles.</param>
+		/// <returns>A System.Web.Profile.ProfileInfoCollection containing user-profile information
+		///     for profiles where the user name matches the supplied usernameToMatch parameter.</returns>
+		public override ProfileInfoCollection FindProfilesByUserName(
+			ProfileAuthenticationOption authenticationOption, string usernameToMatch,
+			int pageIndex, int pageSize, out int totalRecords)
+		{
+			CheckParameters(pageIndex, pageSize);
+
+			return GetProfileInfo(authenticationOption, usernameToMatch, null, pageIndex, pageSize, out totalRecords);
+		}
+
+		/// <summary>
+		/// Retrieves profile information for profiles in which the last activity date occurred on or before the specified date and the user name matches the specified user name.
+		/// </summary>
+		/// <param name="authenticationOption">One of the System.Web.Profile.ProfileAuthenticationOption values, specifying whether anonymous, authenticated, or both types of profiles are returned.</param>
+		/// <param name="usernameToMatch">The user name to search for.</param>
+		/// <param name="userInactiveSinceDate">A System.DateTime that identifies which user profiles are considered inactive. If the System.Web.Profile.ProfileInfo.LastActivityDate value of a user profile occurs on or before this date and time, the profile is considered inactive.</param>
+		/// <param name="pageIndex">The index of the page of results to return.</param>
+		/// <param name="pageSize">The size of the page of results to return.</param>
+		/// <param name="totalRecords">When this method returns, contains the total number of profiles.</param>
+		/// <returns>A System.Web.Profile.ProfileInfoCollection containing user profile information for inactive profiles where the user name matches the supplied usernameToMatch parameter.</returns>	
+		public override ProfileInfoCollection FindInactiveProfilesByUserName(
+			ProfileAuthenticationOption authenticationOption, string usernameToMatch, DateTime userInactiveSinceDate,
+			int pageIndex, int pageSize, out int totalRecords)
+		{
+			CheckParameters(pageIndex, pageSize);
+
+			return GetProfileInfo(authenticationOption, usernameToMatch, userInactiveSinceDate, pageIndex, pageSize, out totalRecords);
+		}
+
+		/// <summary>
+		/// Retrieves user profile data for all profiles in the data source.
+		/// </summary>
+		/// <param name="authenticationOption">One of the System.Web.Profile.ProfileAuthenticationOption values, specifying whether anonymous, authenticated, or both types of profiles are returned.</param>
+		/// <param name="pageIndex">The index of the page of results to return.</param>
+		/// <param name="pageSize">The size of the page of results to return.</param>
+		/// <param name="totalRecords">When this method returns, contains the total number of profiles.</param>
+		/// <returns>A System.Web.Profile.ProfileInfoCollection containing user-profile information for all profiles in the data source.</returns>		
+		public override ProfileInfoCollection GetAllProfiles(
+			ProfileAuthenticationOption authenticationOption, int pageIndex, int pageSize, out int totalRecords)
+		{
+			CheckParameters(pageIndex, pageSize);
+
+			return GetProfileInfo(authenticationOption, null, null, pageIndex, pageSize, out totalRecords);
+		}
+
+		/// <summary>
+		/// Retrieves user-profile data from the data source for profiles in which the last activity date occurred on or before the specified date.
+		/// </summary>
+		/// <param name="authenticationOption">One of the System.Web.Profile.ProfileAuthenticationOption values, specifying whether anonymous, authenticated, or both types of profiles are returned.</param>
+		/// <param name="userInactiveSinceDate">A System.DateTime that identifies which user profiles are considered inactive. If the System.Web.Profile.ProfileInfo.LastActivityDate of a user profile occurs on or before this date and time, the profile is considered inactive.</param>
+		/// <param name="pageIndex">The index of the page of results to return.</param>
+		/// <param name="pageSize">The size of the page of results to return.</param>
+		/// <param name="totalRecords">When this method returns, contains the total number of profiles.</param>
+		/// <returns>A System.Web.Profile.ProfileInfoCollection containing user-profile information about the inactive profiles.</returns>
+		public override ProfileInfoCollection GetAllInactiveProfiles(
+			ProfileAuthenticationOption authenticationOption, DateTime userInactiveSinceDate,
+			int pageIndex, int pageSize, out int totalRecords)
+		{
+			CheckParameters(pageIndex, pageSize);
+
+			return GetProfileInfo(authenticationOption, null, userInactiveSinceDate, pageIndex, pageSize, out totalRecords);
+		}
+
+		/// <summary>
+		/// Returns the number of profiles in which the last activity date occurred on or before the specified date.
+		/// </summary>
+		/// <param name="authenticationOption">One of the System.Web.Profile.ProfileAuthenticationOption values, specifying whether anonymous, authenticated, or both types of profiles are returned.</param>
+		/// <param name="userInactiveSinceDate">A System.DateTime that identifies which user profiles are considered inactive. If the System.Web.Profile.ProfileInfo.LastActivityDate of a user profile occurs on or before this date and time, the profile is considered inactive.</param>
+		/// <returns>The number of profiles in which the last activity date occurred on or before the specified date.</returns>
+		public override int GetNumberOfInactiveProfiles(
+			ProfileAuthenticationOption authenticationOption, DateTime userInactiveSinceDate)
+		{
+			int inactiveProfiles = 0;
+
+			ProfileInfoCollection profiles = GetProfileInfo(authenticationOption, null, userInactiveSinceDate, 0, 0, out inactiveProfiles);
+
+			return inactiveProfiles;
+		}
+
+		private static void CheckParameters(int pageIndex, int pageSize)
+		{
+			if (pageIndex < 1 || pageSize < 1)
+				throw new ApplicationException(ERR_INVALID_PARAMETER + " page index.");
+		}
+
+		// GetProfileInfo
+		// Retrieves a count of profiles and creates a 
+		// ProfileInfoCollection from the profile data in the 
+		// database. Called by GetAllProfiles, GetAllInactiveProfiles,
+		// FindProfilesByUserName, FindInactiveProfilesByUserName, 
+		// and GetNumberOfInactiveProfiles.
+		// Specifying a pageIndex of 0 retrieves a count of the results only.
+		private ProfileInfoCollection GetProfileInfo(
+			ProfileAuthenticationOption authenticationOption,
+			string    usernameToMatch,
+			DateTime? userInactiveSinceDate,
+			int       pageIndex,
+			int       pageSize,
+			out int   totalRecords)
+		{
+			totalRecords = 0;
+
+			ProfileInfoCollection profiles = new ProfileInfoCollection();
+
+			// Count profiles only.
+			if (pageSize == 0)
+				return profiles;
+
+			int counter    = 0;
+			int startIndex = pageSize * (pageIndex - 1);
+			int endIndex   = startIndex + pageSize - 1;
+
+			bool? isAnonymous = null;
+
+			if (authenticationOption == ProfileAuthenticationOption.Anonymous)
+				isAnonymous = true;
+			else if (authenticationOption == ProfileAuthenticationOption.Authenticated)
+				isAnonymous = false;
+
+			foreach (CustomProfile profile in Accessor.GetProfile(
+				isAnonymous, usernameToMatch, userInactiveSinceDate, _applicationName, out totalRecords))
+			{
+				if (counter >= startIndex)
+				{
+					ProfileInfo p = new ProfileInfo(
+						profile.UserName,
+						profile.IsAnonymous ?? true,
+						profile.LastActivityDate ?? DateTime.MinValue,
+						profile.LastUpdatedDate  ?? DateTime.MinValue, 0);
+
+					profiles.Add(p);
+				}
+
+				if (counter >= endIndex)
+					break;
+
+				counter++;
+			}
+
+			return profiles;
+		}
+
+		#region Accessor
+
+		ProfileAccessor Accessor
+		{
+			[System.Diagnostics.DebuggerStepThrough]
+			get { return ProfileAccessor.CreateInstance(); }
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/BusinessLogic/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,30 @@
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("PetShop.BusinessLogic")]
+[assembly: AssemblyProduct("PetShop.BusinessLogic")]
+[assembly: AssemblyCopyright("\xA9 2002-2012 www.bltoolkit.net")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("1b814eca-adcd-4780-bdaa-f335a66f5030")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion    ("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/ObjectModel/Address.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,23 @@
+using System;
+
+using BLToolkit.Common;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace PetShop.ObjectModel
+{
+	public class Address : EntityBase
+	{
+		[MapField("ToFirstName")] public string FirstName;
+		[MapField("ToLastName")]  public string LastName;
+		[MapField("Addr1")]       public string Line1;
+		[MapField("Addr2")]       public string Line2;
+		                          public string City;
+		                          public string State;
+		                          public string Zip;
+		                          public string Country;
+
+		[NonUpdatable]            public string Phone;
+		[NonUpdatable]            public string Email;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/ObjectModel/CartItem.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,21 @@
+using System;
+
+using BLToolkit.Common;
+using BLToolkit.Mapping;
+
+namespace PetShop.ObjectModel
+{
+	[Serializable]
+	public class CartItem : EntityBase
+	{
+		[MapField("ItemId")]     public string  ItemID;
+		                         public string  Name;
+		                         public int     Quantity;
+		                         public decimal Price;
+		                         public string  Type;
+		[MapField("CategoryId")] public string  CategoryID;
+		[MapField("ProductId")]  public string  ProductID;
+
+		[MapIgnore]              public decimal Subtotal { get { return Price * Quantity; } }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/ObjectModel/Category.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,16 @@
+using System;
+
+using BLToolkit.Common;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace PetShop.ObjectModel
+{
+	public class Category : EntityBase
+	{
+		[PrimaryKey]
+		[MapField("CategoryId")] public string ID;
+		                         public string Name;
+		[MapField("Descn")]      public string Description;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/ObjectModel/CreditCard.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,13 @@
+using System;
+
+using BLToolkit.Common;
+
+namespace PetShop.ObjectModel
+{
+	public class CreditCard : EntityBase
+	{
+		public string Type;
+		public string Number;
+		public string Expiration;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/ObjectModel/CustomProfile.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,18 @@
+using System;
+
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace PetShop.ObjectModel
+{
+	public class CustomProfile
+	{
+		[PrimaryKey]
+		[MapField("UniqueID")] public int       ID;
+		[MapField("Username")] public string    UserName;
+		                       public string    ApplicationName;
+		                       public bool?     IsAnonymous;
+		                       public DateTime? LastActivityDate;
+		                       public DateTime? LastUpdatedDate;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/ObjectModel/Item.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,26 @@
+using System;
+
+using BLToolkit.Common;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace PetShop.ObjectModel
+{
+	public class Item : EntityBase
+	{
+		[MapField("ItemId"), PrimaryKey]        public string     ID;
+
+		[MapField("ProductId")]                 public string     ProductID;
+		[MapField("Supplier")]                  public int?       SupplierID;
+
+		[MapField("ListPrice")]                 public decimal?   Price;
+		                                        public decimal?   UnitCost;
+		                                        public ItemStatus Status;
+		                                        public string     Name;
+		                                        public string     Image;
+
+		[MapField("ProductName"), NonUpdatable] public string     ProductName;
+		[MapField("Qty"),         NonUpdatable] public int        Quantity;
+		[MapField("CategoryId"),  NonUpdatable] public string     CategoryID;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/ObjectModel/ItemStatus.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+using System;
+
+using BLToolkit.Mapping;
+
+namespace PetShop.ObjectModel
+{
+	public enum ItemStatus
+	{
+		[NullValue]     Null,
+		[MapValue("P")] PStatus
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/ObjectModel/Order.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,30 @@
+using System;
+
+using BLToolkit.Common;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace PetShop.ObjectModel
+{
+	[TableName("Orders")]
+	public class Order : EntityBase
+	{
+		[PrimaryKey, NonUpdatable]
+		[MapField("OrderId")]        public int      ID;
+
+		[MapField("UserId")]         public string   UserID;
+		                             public DateTime OrderDate;
+		                             public string   Courier;
+		                             public decimal  TotalPrice;
+		                             public int      AuthorizationNumber;
+		                             public string   Locale;
+
+		[MapField(Format="Ship{0}")] public Address  ShippingAddress = new Address();
+		[MapField(Format="Bill{0}")] public Address  BillingAddress  = new Address();
+
+		[NonUpdatable]               public string   Status;
+
+		public OrderLineItem[] Lines;
+		public CreditCard      CreditCard;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/ObjectModel/OrderLineItem.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,22 @@
+using System;
+
+using BLToolkit.Common;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace PetShop.ObjectModel
+{
+	[Serializable]
+	[TableName("LineItem")]
+	public class OrderLineItem : EntityBase
+	{
+		[MapField("OrderId"), PrimaryKey(1)] public int     OrderID;
+		[MapField("LineNum"), PrimaryKey(2)] public int     Line;
+
+		[MapField("ItemId")]                 public string  ItemID;
+		                                     public int     Quantity;
+		[MapField("UnitPrice")]              public decimal Price;
+
+		[MapIgnore] public decimal Subtotal { get { return Quantity * Price; } }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/ObjectModel/PetShop.ObjectModel.2005.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,65 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.50727</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>PetShop.ObjectModel</RootNamespace>
+    <AssemblyName>PetShop.ObjectModel</AssemblyName>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Address.cs" />
+    <Compile Include="CartItem.cs" />
+    <Compile Include="Category.cs" />
+    <Compile Include="CreditCard.cs" />
+    <Compile Include="CustomProfile.cs" />
+    <Compile Include="Item.cs" />
+    <Compile Include="ItemStatus.cs" />
+    <Compile Include="Order.cs" />
+    <Compile Include="OrderLineItem.cs" />
+    <Compile Include="Product.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\Source\BLToolkit.2.csproj">
+      <Project>{F4DF7358-8EE6-49FD-AB13-EA5145058D79}</Project>
+      <Name>BLToolkit.2</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/ObjectModel/PetShop.ObjectModel.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{BF0811CA-4663-4778-8331-9BEEBCAAC8C8}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>PetShop.ObjectModel</RootNamespace>
+    <AssemblyName>PetShop.ObjectModel</AssemblyName>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkProfile />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\PetShop.ObjectModel.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\PetShop.ObjectModel.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Address.cs" />
+    <Compile Include="CartItem.cs" />
+    <Compile Include="Category.cs" />
+    <Compile Include="CreditCard.cs" />
+    <Compile Include="CustomProfile.cs" />
+    <Compile Include="Item.cs" />
+    <Compile Include="ItemStatus.cs" />
+    <Compile Include="Order.cs" />
+    <Compile Include="OrderLineItem.cs" />
+    <Compile Include="Product.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/ObjectModel/Product.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,19 @@
+using System;
+
+using BLToolkit.Common;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace PetShop.ObjectModel
+{
+	public class Product : EntityBase
+	{
+		[PrimaryKey]
+		[MapField("ProductId")]  public string ID;
+
+		[MapField("CategoryId")] public string CategoryID;
+		                         public string Name;
+		[MapField("Descn")]      public string Description;
+		                         public string Image;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/ObjectModel/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,31 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("PetShop.ObjectModel")]
+[assembly: AssemblyProduct("PetShop.ObjectModel")]
+[assembly: AssemblyCopyright("\xA9 2002-2012 www.bltoolkit.net")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("fadc05ac-5ae2-4342-a79d-bd39f666dc2a")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/ReadMe.txt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,14 @@
+This version of the PetShop application is simplified as much as possible and
+has the following limitations:
+
+- It does not provide database creation script.
+  You should download the original version of Microsoft .NET Pet Shop 4.0
+  from MSDN (http://msdn2.microsoft.com/en-us/library/aa479071.aspx)
+  and install it instead.
+- MSMQ order processing has been removed.
+- Support for Oracle has been removed.
+
+If you install the database on the different from local machine,
+please modify the web.config file accordingly.
+
+Try the "Off-Limits to Guests" link on the main page.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Admin/Counters.aspx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,53 @@
+<%@ Page Language="C#" MasterPageFile="~/Admin/MasterPage.master" AutoEventWireup="true" CodeFile="Counters.aspx.cs" Inherits="Admin_Counters" Title="Counters" %>
+<%@ Import Namespace="BLToolkit.Aspects" %>
+
+<asp:Content ID="Content" ContentPlaceHolderID="cph" Runat="Server">
+
+<table class="infoTable" cellspacing="0" cellpadding="0" border="0">
+<tr>
+<td style="text-align:left">GC.CollectionCount:</td><td><%= GC.CollectionCount(GC.MaxGeneration) %></td>
+<td style="text-align:left;padding-left:20;">Cache Cleanup Times:</td><td><%= CacheAspect.CleanupThread.WorkTimes %></td>
+<td style="text-align:left;padding-left:20;">Objects in Cache:</td><td><%= CacheAspect.CleanupThread.ObjectsInCache %></td>
+</tr>
+
+<tr>
+<td style="text-align:left">GC.TotalMemory:</td><td><%= GC.GetTotalMemory(false)/(1024*1024) %>M</td>
+<td style="text-align:left;padding-left:20;">Total Cleanup Time:</td><td><%= CacheAspect.CleanupThread.WorkTime %></td>
+<td style="text-align:left;padding-left:20;">Objects Expired:</td><td><%= CacheAspect.CleanupThread.ObjectsExpired %></td>
+</tr>
+</table>
+<br/>
+
+<asp:Repeater ID="counterRepeater" runat="server"  EnableViewState="false">
+<HeaderTemplate>
+<table class="grid" cellspacing="0" cellpadding="0"  rules="all" border="1" style="width:100%;border-collapse:collapse">
+<tr class="grid-header">
+<th rowspan="2">Type</th><th rowspan="2">Method</th><th colspan="2">Calls</th><th colspan="2">Cache</th><th colspan="4">Call Time</th>
+</tr>
+<tr class="grid-header">
+<th>Count</th><th>Ex</th><th>In</th><th>From</th><th>Min</th><th>Average</th><th>Max</th><th>Total</th>
+</tr>
+</HeaderTemplate>
+<ItemTemplate><tr>
+<td><%# GetName(((MethodCallCounter)Container.DataItem).MethodInfo.DeclaringType) %></td>
+<td><%# ((MethodCallCounter)Container.DataItem).MethodInfo.Name               %></td>
+<td align="right"><%# ((MethodCallCounter)Container.DataItem).TotalCount      %></td>
+<td><%# ((MethodCallCounter)Container.DataItem).ExceptionCount == 0? "": ((MethodCallCounter)Container.DataItem).ExceptionCount.ToString() %></td>
+<td align="right"><%# ((MethodCallCounter)Container.DataItem).CallMethodInfo.CacheAspect != null? ((MethodCallCounter)Container.DataItem).CallMethodInfo.CacheAspect.Cache.Count: 0 %></td>
+<td align="right"><%# ((MethodCallCounter)Container.DataItem).CachedCount     %></td>
+<td><%# GetTime(((MethodCallCounter)Container.DataItem).MinTime)              %></td>
+<td><%# GetTime(((MethodCallCounter)Container.DataItem).AverageTime)          %></td>
+<td><%# GetTime(((MethodCallCounter)Container.DataItem).MaxTime)              %></td>
+<td><%# GetTime(((MethodCallCounter)Container.DataItem).TotalTime)            %></td>
+</tr><%# GetCurrent((MethodCallCounter)Container.DataItem) %></ItemTemplate>
+<SeparatorTemplate>
+</SeparatorTemplate>
+<FooterTemplate></table></FooterTemplate>
+</asp:Repeater>
+
+<br/>
+<font size="1">
+<a href="Counters.aspx?cleanup=1">cache cleanup</a>
+</font>
+
+</asp:Content>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Admin/Counters.aspx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,133 @@
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Text;
+using System.Web.UI;
+
+using BLToolkit.Aspects;
+
+public partial class Admin_Counters : Page
+{
+	protected void Page_Load(object sender, EventArgs e)
+	{
+		if (Request["cleanup"] == "1")
+		{
+			CacheAspect.ClearCache();
+			Response.Redirect("Counters.aspx");
+		}
+
+		List<MethodCallCounter> counters = new List<MethodCallCounter>();
+
+		lock (CounterAspect.Counters.SyncRoot)
+			foreach (MethodCallCounter c in CounterAspect.Counters)
+				lock (c.CurrentCalls.SyncRoot)
+					if (c.TotalCount > 0 || c.CachedCount > 0 | c.CurrentCalls.Count > 0)
+						counters.Add(c);
+
+		counters.Sort(delegate(MethodCallCounter x, MethodCallCounter y)
+		{
+			int c = string.Compare(
+				x.MethodInfo.DeclaringType.Name,
+				y.MethodInfo.DeclaringType.Name);
+
+			if (c != 0)
+				return c;
+
+			return string.Compare(x.MethodInfo.Name, y.MethodInfo.Name);
+		});
+
+		counterRepeater.DataSource = counters;
+
+		DataBind();
+	}
+
+	protected string GetName(Type type)
+	{
+		string name = type.Name;
+
+		if (type.IsGenericType || type.Name.IndexOf('_') > 0 && type.BaseType.IsGenericType)
+		{
+			if (!type.IsGenericType)
+				type = type.BaseType;
+
+			name = type.Name.Split('`')[0] + "&lt;";
+
+			foreach (Type t in type.GetGenericArguments())
+				name += GetName(t) + ",";
+
+			name = name.TrimEnd(',') + "&gt;";
+		}
+
+		return name;
+	}
+
+	protected string GetTime(TimeSpan time)
+	{
+		if (time == TimeSpan.MinValue || time == TimeSpan.MaxValue)
+			return "";
+
+		string s = time.ToString();
+
+		if (s.Length > 12)
+			s = s.Substring(0, 12);
+
+		if (time.TotalSeconds <= 1)
+			s = string.Format("<font color=gray>{0}</font>", s);
+
+		return s;
+	}
+
+	protected string GetCurrent(MethodCallCounter counter)
+	{
+		List<InterceptCallInfo> info = new List<InterceptCallInfo>();
+
+		lock (counter.CurrentCalls.SyncRoot)
+		{
+			if (counter.CurrentCalls.Count == 0)
+				return "";
+
+			foreach (InterceptCallInfo c in counter.CurrentCalls)
+				info.Add(c);
+		}
+
+		StringBuilder sb = new StringBuilder();
+
+		sb.Append("<tr><td colspan=8 align=left><table class='grid' cellspacing=0 cellpadding=0 rules=all border=1 style='border-collapse:collapse'>");
+
+		sb.Append("<tr class='gridheader'>");
+		sb.Append("<td>Time</td>");
+		sb.Append("<td>Login</td>");
+
+		foreach (ParameterInfo pi in counter.MethodInfo.GetParameters())
+			sb.AppendFormat("<td>{0}</td>", pi.Name);
+
+		sb.Append("</tr>");
+
+		foreach (InterceptCallInfo c in counter.CurrentCalls)
+		{
+			sb.AppendFormat("<tr>");
+
+			sb.AppendFormat("<td>{0}</td>", DateTime.Now - c.BeginCallTime);
+			sb.AppendFormat("<td>{0}</td>", c.CurrentPrincipal.Identity.Name);
+
+			foreach (object value in c.ParameterValues)
+			{
+				sb.AppendFormat("<td>");
+
+				sb.Append(
+					value == null ? "<null>" :
+					value is string ? "\"" + value.ToString().Replace("\n", "<br>\n") + "\"" :
+					value is char ? "'" + value + "'" :
+					value.ToString());
+
+				sb.AppendFormat("</td>");
+			}
+
+			sb.AppendFormat("</tr>");
+		}
+
+		sb.Append("</td></tr></table>");
+
+		return sb.ToString();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Admin/Items.aspx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,23 @@
+<%@ Page Language="C#" MasterPageFile="~/Admin/MasterPage.master" AutoEventWireup="true" CodeFile="Items.aspx.cs" Inherits="Admin_Items" Title="Items" %>
+
+<asp:Content ID="Content" ContentPlaceHolderID="cph" Runat="Server">
+
+<asp:GridView ID="grid" runat="server"
+	AutoGenerateColumns = "False"
+	DataSourceID        = "binder"
+	CssClass            = "grid"
+	AllowSorting        = "True">
+<Columns>
+	<asp:BoundField DataField="ID"          HeaderText="Item ID"      SortExpression="ID" />
+	<asp:BoundField DataField="Name"        HeaderText="Name"         SortExpression="Name" />
+	<asp:BoundField DataField="Price"       HeaderText="Price"        SortExpression="Price"    ItemStyle-HorizontalAlign="Right" />
+	<asp:BoundField DataField="UnitCost"    HeaderText="Unit Cost"    SortExpression="UnitCost" ItemStyle-HorizontalAlign="Right" />
+	<asp:BoundField DataField="Quantity"    HeaderText="Quantity"     SortExpression="Quantity" ItemStyle-HorizontalAlign="Right" />
+	<asp:BoundField DataField="ProductName" HeaderText="Product Name" SortExpression="ProductName" />
+	<asp:BoundField DataField="CategoryID"  HeaderText="Category"     SortExpression="CategoryID" />
+</Columns>
+</asp:GridView>
+
+<blt:WebObjectBinder ID="binder" runat="server" TypeName="PetShop.ObjectModel.Item" />
+
+</asp:Content>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Admin/Items.aspx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,11 @@
+using System;
+
+using PetShop.BusinessLogic;
+
+public partial class Admin_Items : System.Web.UI.Page
+{
+	protected void Page_Load(object sender, EventArgs e)
+	{
+		binder.List = new ProductManager().GetAllItemList();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Admin/MasterPage.master	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,74 @@
+<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="Admin_MasterPage" %>
+<%@ Register Src="~/Controls/BreadCrumbControl.ascx" TagName="BreadCrumbControl" TagPrefix="PetShopControl" %>
+<%@ Register Src="~/Controls/NavigationControl.ascx" TagName="NavigationControl" TagPrefix="PetShopControl" %>
+
+<html xmlns="http://www.w3.org/1999/xhtml" >
+<head runat="server">
+	<title>The .NET Pet Shop Admin Interface</title>
+</head>
+<body>
+<form id="form1" runat="server">
+<table align="center" border="0" cellpadding="0" cellspacing="0" width="760">
+<tr>
+<td width="10">&nbsp;</td>
+<td width="410"><a href="../Default.aspx"><img border="0" src="../Comm_Images/Logo.gif" alt=".NET Pet Shop 4.0" width="287" height="78"/></a></td>
+<td width="340">&nbsp;</td>
+</tr> 
+</table>
+
+<table align="center" border="0" cellpadding="0" cellspacing="0" width="800">
+<tr><td colspan="3"><img src="../Comm_Images/spacer.gif" height="12" /></td></tr>
+
+<tr>
+<td>&nbsp;</td>
+<td width="100%">
+	<table width="100%" cellpadding="0" cellspacing="0">
+	<tr><td class="bgBreadcrumb"><span class="breadcrumb"><PetShopControl:BreadCrumbControl id="breadCrumb" runat="server" /></td></tr>
+	</table>
+</td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td>&nbsp;</td>
+<td class="pageHeader">
+<a href="Items.aspx">Items</a>&nbsp;&nbsp;&nbsp;
+<a href="Orders.aspx">Orders</a>&nbsp;&nbsp;&nbsp;
+<a href="Counters.aspx">Counters</a>
+</td>
+<td>&nbsp;</td>
+</tr>
+
+<tr>
+<td></td>
+<td class="dottedLine">&nbsp;</td>
+<td></td>
+</tr>
+
+<tr>
+<td valign="top"></td>
+<td bgcolor="#FFFFFF" valign="top" style="padding:10" class="adminContent">
+	<asp:ContentPlaceHolder ID="cph" runat="server"></asp:ContentPlaceHolder>
+</td>
+<td height="250"></td>
+</tr>
+
+<tr>
+<td></td>
+<td class="footer">
+	<table width="100%">
+	<tr>
+		<td>
+			Based on Pet Shop Version 4.0 - Powered by bltoolkit for .NET</td><td align="right" style="padding-right: 5px">
+			<a href="http://www.vertigosoftware.com" target="_blank"><img alt="Created by Vertigo Software, Inc." border="0" src="../Comm_Images/vertigo-icon.gif"/></a>
+		</td>
+	</tr>
+	</table>
+</td>
+<td></td>
+</tr>
+</table>
+
+</form>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Admin/MasterPage.master.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+using System;
+
+public partial class Admin_MasterPage : System.Web.UI.MasterPage
+{
+	protected void Page_Load(object sender, EventArgs e)
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Admin/Orders.aspx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,26 @@
+<%@ Page Language="C#" MasterPageFile="~/Admin/MasterPage.master" AutoEventWireup="true" CodeFile="Orders.aspx.cs" Inherits="Admin_Orders" Title="Orders" %>
+<%@ Import Namespace="PetShop.ObjectModel" %>
+
+<asp:Content ID="Content" ContentPlaceHolderID="cph" Runat="Server">
+
+<asp:GridView ID="grid" runat="server"
+	AutoGenerateColumns = "False"
+	DataSourceID        = "binder"
+	CssClass            = "grid"
+	AllowSorting        = "True">
+<Columns>
+	<asp:BoundField DataField="ID"         HeaderText="Order ID"   SortExpression="ID"         ItemStyle-HorizontalAlign="Right" />
+	<asp:BoundField DataField="UserID"     HeaderText="User ID"    SortExpression="UserID" />
+	<asp:TemplateField HeaderText="Ship To">
+		<ItemTemplate><%# FormatAddress(((Order)Container.DataItem).ShippingAddress) %></ItemTemplate>
+	</asp:TemplateField>
+	<asp:BoundField DataField="OrderDate"  HeaderText="Date"       SortExpression="OrderDate" DataFormatString="{0:MM/dd/yy hh:mm tt}" HtmlEncode="false" />
+	<asp:BoundField DataField="Courier"    HeaderText="Courier"    SortExpression="Courier" />
+	<asp:BoundField DataField="TotalPrice" HeaderText="TotalPrice" SortExpression="TotalPrice" ItemStyle-HorizontalAlign="Right" />
+	<asp:BoundField DataField="Status"     HeaderText="Status"     SortExpression="Status" />
+</Columns>
+</asp:GridView>
+
+<blt:WebObjectBinder ID="binder" runat="server" TypeName="PetShop.ObjectModel.Order" />
+
+</asp:Content>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Admin/Orders.aspx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,26 @@
+using System;
+
+using PetShop.BusinessLogic;
+using PetShop.ObjectModel;
+
+public partial class Admin_Orders : System.Web.UI.Page
+{
+	protected void Page_Load(object sender, EventArgs e)
+	{
+		binder.List = new OrderManager().GetAllOrderList();
+	}
+
+	protected static string FormatAddress(Address addr)
+	{
+		return string.Format(
+			"{0} {1}<br>{2} {3}<br>{4}, {5} {6}, {7}",
+			addr.FirstName,
+			addr.LastName,
+			addr.Line1,
+			addr.Line2,
+			addr.City,
+			addr.State,
+			addr.Zip,
+			addr.Country);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/App_Code/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,13 @@
+using System;
+using System.Reflection;
+
+[assembly: AssemblyVersion("4.0.4.50")]
+
+[assembly: AssemblyTitle(".NET Pet Shop Web")]
+[assembly: AssemblyDescription(".NET Pet Shop Web Components")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft Corporation")]
+[assembly: AssemblyProduct(".NET Pet Shop 4.0")]
+[assembly: AssemblyCopyright("Copyright \xA9 2005 Microsoft Corporation")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/App_Code/CustomGrid.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,139 @@
+using System;
+using System.Collections;
+using System.Text.RegularExpressions;
+using System.Web.UI;
+using System.Web.UI.WebControls;
+
+namespace PetShop.Web
+{
+	public class CustomGrid : Repeater
+	{
+		private static readonly Regex RX = new Regex(@"^&page=\d+", RegexOptions.Compiled);
+
+		protected string _emptyText;
+		private   IList  _dataSource;
+		private   int    _pageSize = 10;
+		private   int    _currentPageIndex;
+		private   int    _itemCount;
+
+		public override object DataSource
+		{
+			set
+			{
+				// This try catch block is to avoid issues with the VS.NET designer
+				// The designer will try and bind a datasource which does not derive from ILIST
+				try
+				{
+					_dataSource = (IList)value;
+					ItemCount = _dataSource.Count;
+				}
+				catch
+				{
+					_dataSource = null;
+					ItemCount = 0;
+				}
+			}
+		}
+
+		public            int PageSize         { get { return _pageSize;         } set { _pageSize         = value; } }
+		protected virtual int ItemCount        { get { return _itemCount;        } set { _itemCount        = value; } }
+		public    virtual int CurrentPageIndex { get { return _currentPageIndex; } set { _currentPageIndex = value; } }
+
+		protected int    PageCount { get { return (ItemCount - 1) / _pageSize; } }
+		public    string EmptyText {                 set { _emptyText = value; } }
+
+		public void SetPage(int index)
+		{
+			OnPageIndexChanged(new DataGridPageChangedEventArgs(null, index));
+		}
+
+		protected override void OnLoad(EventArgs e)
+		{
+			if (Visible)
+			{
+				string page  = Context.Request["page"];
+				int    index = page != null ? int.Parse(page) : 0;
+
+				SetPage(index);
+			}
+		}
+
+		/// <summary>
+		/// Overridden method to control how the page is rendered
+		/// </summary>
+		/// <param name="writer"></param>
+		protected override void Render(HtmlTextWriter writer)
+		{
+			// Check there is some data attached
+			//
+			if (ItemCount == 0)
+			{
+				writer.Write(_emptyText);
+				return;
+			}
+
+			// Mask the query
+			//
+			string query = Context.Request.Url.Query.Replace("?", "&");
+			query = RX.Replace(query, string.Empty);
+
+			// Write out the first part of the control, the table header
+			//
+			writer.Write("<table cellpadding=0 cellspacing=0><tr><td colspan=2>");
+
+			// Call the inherited method
+			//
+			base.Render(writer);
+
+			// Write out a table row closure
+			//
+			writer.Write("</td></tr><tr><td class=paging align=left>");
+
+			// Determin whether next and previous buttons are required Previous button?
+			//
+			if (_currentPageIndex > 0)
+				writer.Write(string.Format("<a href=?page={0}>&#060;&nbsp;Previous</a>", _currentPageIndex - 1 + query));
+
+			// Close the table data tag
+			//
+			writer.Write("</td><td align=right class=paging>");
+
+			// Next button?
+			//
+			if (_currentPageIndex < PageCount)
+				writer.Write(string.Format("<a href=?page={0}>More&nbsp;&#062;</a>", _currentPageIndex + 1 + query));
+
+			// Close the table
+			//
+			writer.Write("</td></tr></table>");
+		}
+
+		protected override void OnDataBinding(EventArgs e)
+		{
+			// Work out which items we want to render to the page
+			//
+			int start = CurrentPageIndex * _pageSize;
+			int size  = Math.Min(_pageSize, ItemCount - start);
+
+			IList page = new ArrayList();
+
+			// Add the relevant items from the datasource
+			//
+			for (int i = 0; i < size; i++)
+				page.Add(_dataSource[start + i]);
+
+			// Set the base objects datasource
+			//
+			base.DataSource = page;
+			base.OnDataBinding(e);
+		}
+
+		public event DataGridPageChangedEventHandler PageIndexChanged;
+
+		protected virtual void OnPageIndexChanged(DataGridPageChangedEventArgs e)
+		{
+			if (PageIndexChanged != null)
+				PageIndexChanged(this, e);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/App_Code/CustomList.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,140 @@
+using System;
+using System.Collections;
+using System.Text.RegularExpressions;
+using System.Web.UI;
+using System.Web.UI.WebControls;
+
+namespace PetShop.Web
+{
+	public class CustomList : DataList
+	{
+		private static readonly Regex RX = new Regex(@"^&page=\d+", RegexOptions.Compiled);
+
+		protected string _emptyText;
+		private   IList  _dataSource;
+		private   int    _pageSize = 10;
+		private   int    _currentPageIndex;
+		private   int    _itemCount;
+
+		public override object DataSource
+		{
+			set
+			{
+				//This try catch block is to avoid issues with the VS.NET designer
+				//The designer will try and bind a datasource which does not derive from ILIST
+				try
+				{
+					_dataSource = (IList)value;
+					ItemCount   = _dataSource.Count;
+				}
+				catch
+				{
+					_dataSource = null;
+					ItemCount   = 0;
+				}
+			}
+		}
+
+		public            int PageSize         { get { return _pageSize;         } set { _pageSize         = value; } }
+		protected virtual int ItemCount        { get { return _itemCount;        } set { _itemCount        = value; } }
+		public    virtual int CurrentPageIndex { get { return _currentPageIndex; } set { _currentPageIndex = value; } }
+
+		protected int    PageCount { get { return (ItemCount - 1) / _pageSize; } }
+		public    string EmptyText {                 set { _emptyText = value; } }
+
+		public void SetPage(int index)
+		{
+			OnPageIndexChanged(new DataGridPageChangedEventArgs(null, index));
+		}
+
+		protected override void OnLoad(EventArgs e)
+		{
+			if (Visible)
+			{
+				string page  = Context.Request["page"];
+				int    index = page != null ? int.Parse(page) : 0;
+
+				SetPage(index);
+			}
+		}
+
+		/// <summary>
+		/// Overridden method to control how the page is rendered
+		/// </summary>
+		/// <param name="writer"></param>
+		protected override void Render(HtmlTextWriter writer)
+		{
+			// Check there is some data attached
+			//
+			if (ItemCount == 0)
+			{
+				writer.Write(_emptyText);
+				return;
+			}
+
+			// Mask the query
+			//
+			string query = Context.Request.Url.Query.Replace("?", "&");
+
+			query = RX.Replace(query, string.Empty);
+
+			// Write out the first part of the control, the table header
+			//
+			writer.Write("<table cellpadding=0 cellspacing=0><tr><td colspan=2>");
+
+			// Call the inherited method
+			//
+			base.Render(writer);
+
+			// Write out a table row closure
+			//
+			writer.Write("</td></tr><tr><td class=paging align=left>");
+
+			// Determin whether next and previous buttons are required Previous button?
+			//
+			if (_currentPageIndex > 0)
+				writer.Write(string.Format("<a href=?page={0}>&#060;&nbsp;Previous</a>", _currentPageIndex - 1 + query));
+
+			// Close the table data tag
+			//
+			writer.Write("</td><td align=right class=paging>");
+
+			// Next button?
+			//
+			if (_currentPageIndex < PageCount)
+				writer.Write(string.Format("<a href=?page={0}>More&nbsp;&#062;</a>", _currentPageIndex + 1 + query));
+
+			// Close the table
+			//
+			writer.Write("</td></tr></table>");
+		}
+
+		protected override void OnDataBinding(EventArgs e)
+		{
+			// Work out which items we want to render to the page
+			//
+			int start = CurrentPageIndex * _pageSize;
+			int size  = Math.Min(_pageSize, ItemCount - start);
+
+			IList page = new ArrayList();
+
+			// Add the relevant items from the datasource
+			//
+			for (int i = 0; i < size; i++)
+				page.Add(_dataSource[start + i]);
+
+			// set the base objects datasource
+			//
+			base.DataSource = page;
+			base.OnDataBinding(e);
+		}
+
+		public event DataGridPageChangedEventHandler PageIndexChanged;
+
+		virtual protected void OnPageIndexChanged(DataGridPageChangedEventArgs e)
+		{
+			if (PageIndexChanged != null)
+				PageIndexChanged(this, e);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/App_Code/PageBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+using System;
+using System.Web.UI;
+
+namespace PetShop.Web
+{
+	public class PageBase : Page
+	{
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/App_Code/WebUtility.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,59 @@
+using System;
+using System.Text.RegularExpressions;
+using System.Web;
+using System.Web.Caching;
+using System.Configuration;
+
+using PetShop.BusinessLogic;
+
+namespace PetShop.Web
+{
+	/// <summary>
+	/// Collection of utility methods for web tier
+	/// </summary>
+	public static class WebUtility
+	{
+		/// <summary>
+		/// Method to make sure that user's inputs are not malicious
+		/// </summary>
+		/// <param name="text">User's Input</param>
+		/// <param name="maxLength">Maximum length of input</param>
+		/// <returns>The cleaned up version of the input</returns>
+		public static string InputText(string text, int maxLength)
+		{
+			text = text.Trim();
+
+			if (string.IsNullOrEmpty(text))
+				return string.Empty;
+
+			text = Regex.Replace(text, "[\\s]{2,}", " ");                             // two or more spaces
+			text = Regex.Replace(text, "(<[b|B][r|R]/*>)+|(<[p|P](.|\\n)*?>)", "\n"); // <br>
+			text = Regex.Replace(text, "(\\s*&[n|N][b|B][s|S][p|P];\\s*)+", " ");     // &nbsp;
+			text = Regex.Replace(text, "<(.|\\n)*?>", string.Empty);                  // any other tags
+			text = text.Replace("'", "''");
+
+			if (text.Length > maxLength)
+				text = text.Substring(0, maxLength);
+
+			return text;
+		}
+
+		/// <summary>
+		/// Method to check whether input has other characters than numbers
+		/// </summary>
+		public static string CleanNonWord(string text)
+		{
+			return Regex.Replace(text, "\\W", "");
+		}
+
+		/// <summary>
+		/// Method to redirect user to search page
+		/// </summary>
+		/// <param name="key">Search keyword</param> 
+		public static void SearchRedirect(string key)
+		{
+			HttpContext.Current.Response.Redirect(
+				string.Format("~/Search.aspx?keywords={0}", InputText(key, 255)));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/App_Themes/PetShop/SkinFile.skin	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,35 @@
+<asp:HyperLink SkinID="lnkCart" runat="server" CssClass="linkCart" Text="Add to Shopping Cart"></asp:HyperLink>
+<asp:HyperLink SkinID="lnkWishlist" runat="server" CssClass="linkWishlist" Text="Add to Wish List"></asp:HyperLink>
+
+<asp:Login SkinID="Login" CreateUserText="Not registered yet?" runat="server" TitleText="Please Sign In" BorderPadding="15" LoginButtonText="Sign In" CssClass="signInContent">
+	<CheckBoxStyle Height="50px"  />
+	<LoginButtonStyle ForeColor="White" CssClass="signinButton" />
+	<TitleTextStyle Font-Bold="True" CssClass="signinHeader" />
+	<TextBoxStyle CssClass="signinTextbox" Width="155px"/>
+	<LabelStyle CssClass="signinLabel" HorizontalAlign="Left"/>
+	<HyperLinkStyle CssClass="signinNewUser" /> 
+	<FailureTextStyle CssClass="asterisk" Font-Size="Small" Height="20px" HorizontalAlign="Left" />          
+</asp:Login>
+
+<asp:CreateUserWizard runat="server" SkinID="NewUser" CssClass="signInContent">
+	<CreateUserButtonStyle ForeColor="White" CssClass="signUpButton" />
+	<TextBoxStyle CssClass="signinTextbox" Width="155px" />
+	<ErrorMessageStyle CssClass="asterisk" Font-Size="Small" Height="20px" HorizontalAlign="Left" />
+	<LabelStyle HorizontalAlign="Left"/>        
+	<TitleTextStyle Height="40px" HorizontalAlign="Left" Font-Bold="True" CssClass="signinHeader"/>
+	<HeaderStyle />
+</asp:CreateUserWizard>
+    
+<asp:Wizard SkinID="wzdCheckOut" runat="server" FinishCompleteButtonText="Submit Order" FinishCompleteButtonType="Link" FinishPreviousButtonType="Link" StartNextButtonType="Link" StepNextButtonType="Link" StepPreviousButtonType="Link">
+    <%--Uncomment for using with default layout of wizard control
+    <NavigationStyle CssClass="checkoutButtonBg" />--%>
+                
+    <HeaderStyle CssClass="checkoutHeaders" />
+    <StepNextButtonStyle CssClass="continue" />
+    <StartNextButtonStyle CssClass="continue" />
+    <StepPreviousButtonStyle CssClass="back" />
+    <FinishCompleteButtonStyle CssClass="submit" />
+    <FinishPreviousButtonStyle CssClass="back" />
+</asp:Wizard>
+
+<asp:LoginName SkinID="LoginName" CssClass="welcomeName" runat="server" />
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/App_Themes/PetShop/StyleSheet.css	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,630 @@
+body {
+	background-color: #E3E5DC;
+	margin-left: 0px;
+	margin-top: 0px;
+	margin-right: 0px;
+	margin-bottom: 0px;
+	background-image: url(../../Comm_Images/bg-body.gif);
+	background-repeat: repeat-x;
+}
+a:visited {
+	color: #333;
+	text-decoration: none;
+}
+a:hover {
+	color: #1639A9;
+	text-decoration: underline;
+}
+a:link {
+	color: #333;
+	text-decoration: none;
+}
+.link {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.65em;
+	text-transform: uppercase;
+	color: #333333;
+	text-indent: 10px;
+}
+.disabledLink 
+{
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.65em;
+	text-transform: uppercase;
+	color: #999999;
+	text-indent: 10px;
+}
+.signIn {
+	background-color: #E9EED8;
+	background-image: url(../../Comm_Images/bg-sign-in.gif);
+	background-repeat: repeat-x;
+	height: 60px;
+	margin-top: 20px;
+}
+.checkOut {
+	background-color: #ABAF94;
+	/*cursor: hand;*/
+}
+.linkCheckOut {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.65em;
+	text-transform: uppercase;
+	color: #333333;
+	text-indent: 7px;
+}
+.welcomeName {
+	font-size: 0.7em;
+	font-weight: bold;
+	white-space: nowrap;	
+	text-indent: 37px;
+	color: #555;
+	font-family: Arial, Helvetica, sans-serif;
+}
+.textboxSearch {
+    font-size: 0.8em;
+	color: #000;
+	text-indent: 3px;
+	background-color: #FFF;
+	border-width: 1px;
+	border-style: solid;
+	border-top-color: #E9EED8;
+	border-right-color: #C6C3B3;
+	border-bottom-color: #ABAF94;
+	border-left-color: #C6C3B3;
+	height: 14px; 
+}
+.breadcrumb {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.7em;
+	text-transform: uppercase;
+	color: #333333;
+	font-weight: bold;
+}
+.bgBreadcrumb {
+	padding-top: 12px;
+	padding-bottom: 9px;
+}
+.mainNavigation {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.7em;
+	text-transform: uppercase;
+	padding-left: 2px;
+	color: #333333;
+	font-weight: bold;
+	line-height: 20px;
+	padding-right: 5px;
+	display:block;
+	height:100%;
+}
+.pageHeader {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.9em;
+	font-weight: bold;
+	text-transform: uppercase;
+	color: #FFFFFF;
+	background-color: #0A1B50;
+	text-indent:16px;
+}
+.dottedLine {
+	background-image: url(../../Comm_Images/dotten-line.gif);
+	background-repeat: repeat-x;
+	background-position: bottom;
+	height: 8px;
+}
+input {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.8em;
+	color: #333333;
+	padding-left: 3px;
+	padding-right: 3px;
+}
+.footer td {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.65em;
+	text-transform: uppercase;
+	color: #FFF;
+	background-color: #ABAF94;
+	padding-left: 18px;
+	line-height: 16px;
+}
+.homeBody {
+	background-color: #FFF;
+	margin-left: 0px;
+	margin-top: 0px;
+	margin-right: 0px;
+	margin-bottom: 0px;
+	background-image: url(../../Comm_Images/home-bg-body.gif);
+	background-repeat: repeat-x;
+}
+.homeBgSearch {
+	background-image: url(../../Comm_Images/bg-search.gif);
+	background-repeat: repeat-x;
+	background-position: top;
+	padding-top: 20px;
+}
+.fishPosition {
+	position: relative;
+	left: -60px;
+	top: 0px;
+	width: 241px; 
+	height: 300px; 
+}
+.footerHome {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.65em;
+	text-transform: uppercase;
+	color: #FFF;
+	background-color: #122E87;
+	padding-left: 18px;
+	line-height: 16px;
+}
+.homeLink {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.65em;
+	text-transform: uppercase;
+	color: #333;
+	vertical-align: middle;
+}
+.homeSearchBox {
+	font-size: 0.8em;
+	color: #404040;
+	text-indent: 3px;
+	background-color: #FFF;
+	border-width: 1px;
+	border-style: solid;
+	border-top-color: #E9EED8;
+	border-right-color: #C6C3B3;
+	border-bottom-color: #ABAF94;
+	border-left-color: #C6C3B3;
+	height: 14px;
+	padding-right: 5px;
+}
+.paddingSearchicon {
+	padding-top:3px; 
+	padding-left:5px;
+}
+.welcome {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.9em;
+	font-weight: bold;
+	color: #FFFFFF;
+	padding-left: 20px;
+	height: 27px;
+	text-transform: uppercase;
+	background-color: #ABAF94;
+	vertical-align: middle;
+}
+.intro {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.9em;
+	font-weight: bold;
+	color: #555555;
+	padding-top: 20px;
+	line-height: 18px;
+	padding-left: 20px;
+	padding-bottom: 20px;
+	display: block;
+	width: 300px;
+}
+.navigationLinks {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.9em;
+	text-transform: uppercase;
+	color: #333;
+	line-height: 1.8em;
+	font-weight: bold;
+	vertical-align:top;
+	background-image: url(../../Comm_Images/dotten-line.gif);
+	background-repeat: repeat-x;
+	background-position: bottom;
+	width:320px;
+}
+.navigationLabel {
+	color: #98A839;
+	font-size: 0.9em;
+	font-weight: bold;
+	line-height:25px;
+	font-family: Arial, Helvetica, sans-serif;
+	padding-left: 20px;
+}
+.bgControl {
+	background-color: #E3E5DC;
+}
+.productDescription {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.7em;
+	font-weight: normal;
+	color: #333333;
+}
+.productName {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 1em;
+	font-weight: bold;
+	color: #333333;
+	padding-bottom: 12px;
+}
+.paging {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.85em;
+	color:#98A839;
+	font-weight: bold;
+	text-decoration: none;
+	padding-top: 16px;
+	padding-bottom: 16px;
+	padding-left: 16px;
+	padding-right: 16px;
+}
+.productsPosition {
+	padding-top: 37px;
+	padding-bottom: 33px;
+}
+.productsLine {
+	padding-top: 16px;
+	padding-bottom: 3px;
+	border-bottom: solid 1px #E8EADD;	
+}
+.itemsPosition {	
+	padding-top: 5px;
+	padding-bottom: 33px;	
+}
+.itemText {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.7em;
+	font-weight: normal;
+	color: #333333;
+	padding-bottom: 5px;
+	text-indent: 3px;
+	line-height: 1.3em;
+}
+.itemName {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.7em;
+	font-weight: bold;
+	color: #333333;
+	padding-bottom: 5px;
+	text-indent: 3px;
+	line-height: 1.3em;
+}
+.linkCart {
+	text-transform: uppercase;
+	font-size: 1em;
+	font-weight: bold;
+	padding-top: 16px;
+	padding-bottom: 10px;
+	padding-left: 21px;
+	cursor: hand;
+	background-image: url(../../Comm_Images/button-cart.gif);
+	background-repeat: no-repeat;
+	background-position: 0px;
+	line-height:35px;
+}
+.linkWishlist {
+	text-transform: uppercase;
+	font-size: 1em;
+	font-weight: bold;
+	padding-top: 4px;
+	padding-left: 21px;
+	cursor: hand;
+	background-image: url(../../Comm_Images/button-wishlist.gif);
+	background-repeat: no-repeat;
+	}
+.cartPosition {	
+	padding-top: 50px;
+	padding-bottom: 33px;
+}
+.label {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.7em;
+	color: #333333;
+	margin-left: 20px;
+	margin-bottom: 10px;
+	text-align: left;
+}
+.cart {
+	background-color:#E8EADD;
+}
+.labelLists {
+	font-family: Tahoma, Arial, Helvetica, sans-serif;
+	font-size:  0.7em;
+	font-weight: bold;
+	color: #747C6D;
+	vertical-align: bottom;
+	background-image: url(../../Comm_Images/bg-labelLists.gif);
+	text-align:left;
+	line-height: 21px;
+	padding-left: 5px;
+	text-indent: 2px;
+	padding-right: 5px;
+	padding-top: 8px;
+	padding-bottom: 1px;
+	border-bottom-width: 1px;
+	border-bottom-color: #FFF;
+	border-bottom-style: solid;
+}
+.listItem {
+	font-family: Tahoma, Arial, Helvetica, sans-serif;
+	font-size:  0.7em;
+	color: #333333;
+	text-decoration: none;
+	line-height: 15px;
+	padding-left: 5px;
+	padding-right: 5px;
+	padding-bottom: 2px;
+	padding-top: 2px;
+	white-space: nowrap;
+	text-align: left;
+}
+.dottedLineCentered {
+	background-image: url(../../Comm_Images/dotten-line.gif);
+	background-repeat: repeat-x;
+	background-position: center;
+	height: 8px;
+}
+.total {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.7em;
+	font-weight: bold;
+	color: #000000;
+	padding-right: 2px;
+	line-height: 1.5em;
+}
+.signinButton { 
+    font-family : Tahoma, Arial, Helvetica, sans-serif;
+	background-color:#FB9D00;
+	font-size: 0.85em;
+	color: #FFF;
+	text-decoration: none;
+	font-weight: bold;
+	cursor: hand;
+	border: 1px solid;
+	border-bottom-color:#F07C00;
+	border-top-color: #FFCC00;
+	border-right-color:#F07C00;
+	border-left-color:#FFCC00;
+    padding-right: 5px; 
+    padding-left: 5px;
+    margin-bottom: 15px; 
+    margin-right: 10px;   
+}
+.signinHeader {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 1.1em;
+	font-weight: bold;
+	text-align: left;
+	white-space: nowrap;
+	color: #333333;
+	padding-top: 5px;
+	padding-bottom: 5px;
+	line-height:30px;
+
+}
+.signinTextbox {
+	font-size: 0.9em;
+	color: #000;
+	text-indent: 3px;
+	background-color: #EAE9E4;
+	border-width: 1px;
+	border-style: solid;
+	border-top-color: #C6C3B3;
+	border-right-color: #7C7D6A;
+	border-bottom-color: #000;
+	border-left-color: #7C7D6A;
+	height: 16px;
+	margin-right: 2px;
+}
+.signinLabel {
+	font-family: Arial, Helvetica, sans-serif;
+	font-weight:normal;
+	color: #333333;
+}
+.signinNewUser {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.8em;
+	text-transform: uppercase;
+	color: #333333;
+	text-indent: 3px;
+}
+.asterisk {
+	color: #333333;
+	vertical-align: top;
+}
+.signInContent {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.8em;
+	background-color: #FFFFFF;
+	white-space: nowrap;
+	color: #333333;
+	padding-top: 10px;
+	padding-bottom: 10px;
+}
+.checkoutPosition {
+	padding-top: 40px;
+	padding-bottom: 33px;
+}
+.checkoutContent {
+	font-family: Arial, Helvetica, sans-serif;
+	background-color: #FFFFFF;
+	white-space: nowrap;
+	color: #333333;
+	padding-left: 15px;
+}
+.checkoutHeaders{
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.9em;
+	font-weight: bold;
+	color: #333333;
+	text-transform: capitalize;
+	white-space: nowrap;
+	height: 30px;
+	padding-top: 3px;
+	padding-bottom: 5px;
+}
+.checkoutLabel {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.95em;
+	color: #333333;
+	margin-left: 20px;
+	margin-bottom: 10px;
+	text-align: left;
+}
+.checkoutTextbox {
+	font-size: 1em;
+	color: #000;
+	text-indent: 3px;
+	background-color: #EAE9E4;
+	border-width: 1px;
+	border-style: solid;
+	border-top-color: #C6C3B3;
+	border-right-color: #7C7D6A;
+	border-bottom-color: #000;
+	border-left-color: #7C7D6A;
+	height: 16px;
+	margin-top: 1px;
+}
+.checkoutDropdown {
+	font-size: 1em;
+	color: #000;
+	text-indent: 3px;
+	background-color: #EAE9E4;
+	border-width: 1px;
+	border-style: solid;
+	border-top-color: #C6C3B3;
+	border-right-color: #7C7D6A;
+	border-bottom-color: #000;
+	height: 16px;
+	margin-top: 2px;
+}
+.checkoutButtonBg {
+	background-image: url(../../Comm_Images/dotten-line.gif);
+	background-repeat: repeat-x;
+	background-position: top;
+}
+.back {
+	font-family: Tahoma, Arial, Helvetica, sans-serif;
+	font-size: 0.7em;
+	color: #000;
+	text-decoration: none;
+	font-weight: bold;
+	background-image: url(../../Comm_Images/button-back.gif);
+	background-repeat: no-repeat;
+	background-position: left 7px;
+	padding-left: 22px;
+	padding-top: 9px;
+	margin-left: 7px;
+	cursor: hand;
+	line-height: 40px;
+}
+.continue {
+	font-family: Tahoma, Arial, Helvetica, sans-serif;
+	font-size: 0.7em;
+	color: #000;
+	text-decoration: none;
+	font-weight: bold;
+	background-image: url(../../Comm_Images/button-continue.gif);
+	background-repeat: no-repeat;
+	background-position: right 7px;
+	padding-right: 22px;
+	padding-top: 9px;
+	margin-right: 7px;
+	cursor: hand;
+	line-height: 40px;
+}
+.submit {
+	font-family: Tahoma, Arial, Helvetica, sans-serif;
+	background-color:#FB9D00;
+	font-size: 0.7em;
+	color: #FFF;
+	text-decoration: none;
+	font-weight: bold;
+	cursor: hand;
+	line-height: 30px;
+	border: 1px solid;
+	border-bottom-color:#F07C00;
+	border-top-color: #FFCC00;
+	border-right-color:#F07C00;
+	border-left-color:#FFCC00;
+    padding-right: 10px; 
+    padding-left: 10px;
+    padding-top: 1px; 
+    padding-bottom: 1px;
+}
+.checkOutLabel {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.7em;
+	color: #333333;
+	margin-left: 3px;
+	margin-bottom: 10px;
+	text-align: left;
+}
+.info {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.7em;
+	color: #333333;
+	margin-bottom: 15px;
+	text-align: left;
+}
+.profilePosition {
+	padding-top: 50px;
+	padding-bottom: 33px;
+}
+.tableContent {
+	font-family: Arial, Helvetica, sans-serif;
+	background-color: #FFFFFF;
+	text-align: center;
+	font-weight:bold;
+	white-space: nowrap;
+	color: #333333;
+	padding-left: 25px;
+	padding-top: 12px;
+	padding-bottom: 3px;
+}
+.searchPosition {
+	font-family: Arial, Helvetica, sans-serif;
+	padding-top: 12px;
+	padding-bottom: 33px;
+}
+.linkNewUser {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.8em;
+	text-transform: uppercase;
+	color: #333333;
+	text-indent: 3px;
+}
+.cartHeader {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.9em;
+	font-weight: bold;
+	text-align: left;
+	white-space: nowrap;
+	color: #333333;
+	width: 387px;
+	padding-bottom: 16px;
+}
+.signinPosition {
+	padding-top: 22px;
+	padding-bottom: 33px;
+}
+.adminContent {
+	font-family: Verdana;
+	font-size: .8em;
+}
+.infoTable td {
+	padding: 4 5 0 0;
+	font-size: 0.7em;
+	text-align: right;
+}
+.grid th {
+	padding: 1 5 2 5;
+	font-size: .8em;
+}
+.grid td {
+	padding: 1 5 2 5;
+	font-size: .8em;
+}
+.pageHeader a:link, .pageHeader a:hover, .pageHeader a:visited {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 0.9em;
+	font-weight: bold;
+	color: #FFFFFF;
+	text-transform: uppercase;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/CheckOut.aspx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,206 @@
+<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="CheckOut.aspx.cs" Inherits="PetShop.Web.CheckOut" Title="Check Out" %>
+<%@ Register Src="Controls/CartList.ascx"       TagName="CartList"       TagPrefix="PetShopControl" %>
+<%@ Register Src="Controls/AddressConfirm.ascx" TagName="AddressConfirm" TagPrefix="PetShopControl" %>
+<%@ Register Src="Controls/AddressForm.ascx"    TagName="AddressForm"    TagPrefix="PetShopControl" %>
+
+<asp:Content ID="cntPage" ContentPlaceHolderID="cphPage" Runat="Server" EnableViewState="false">
+<div align="center" class="checkoutPosition">
+
+<script type="text/javascript" language="javascript">
+function ClientValidate(source, arguments)
+{
+	var dtNow  = new Date();
+	var tmp    = new String(arguments.Value);
+	var dtCard = new Date();
+
+	dtCard.setFullYear(tmp.split("/")[1]);
+	dtCard.setMonth   (tmp.split("/")[0]-1);
+	dtCard.setDate(30);
+	
+	arguments.IsValid = dtNow < dtCard;
+}
+</script>
+
+<table border="0" cellpadding="0" cellspacing="0" class="checkoutContent" width="100%">
+<tr>
+<td>
+<div class="label">
+	<asp:Label ID="lblMsg" runat="server" EnableViewState="false"></asp:Label>
+</div>
+<asp:Wizard ID="wzdCheckOut" runat="server"
+	DisplaySideBar      = "False"
+	OnActiveStepChanged = "wzdCheckOut_ActiveStepChanged"
+	OnFinishButtonClick = "wzdCheckOut_FinishButtonClick"
+	SkinID              = "wzdCheckOut">
+	<WizardSteps>
+		<asp:WizardStep ID="wzdStep1" runat="server" Title="Billing Address">
+			<asp:Panel ID="panFicusStep1" runat="server" DefaultButton="StartNextButton">
+				<PetShopControl:AddressForm ID="billingForm" runat="server" />
+				<table border="0" cellpadding="0" cellspacing="0" class="checkoutButtonBg" width="100%">
+				<tr>
+					<td></td>
+					<td align="right">
+						<asp:LinkButton ID="StartNextButton" runat="server"
+							CommandName = "MoveNext"
+							CssClass    = "continue"
+							Text        = "Next" />
+					</td>
+				</tr>
+				</table>
+			</asp:Panel>
+		</asp:WizardStep>
+		<asp:WizardStep ID="wzdStep2" runat="server" Title="Shipping Address">
+			<asp:Panel ID="panFicusStep2" runat="server" DefaultButton="StepNextButton">
+				<div class="checkOutLabel">
+					<asp:CheckBox ID="chkShipToBilling" runat="server"
+						AutoPostBack     = "True"
+						OnCheckedChanged = "chkShipToBilling_CheckedChanged"
+						Text             = "Ship to billing address" />
+				</div>
+				<PetShopControl:AddressForm ID="shippingForm" runat="server" />
+				<table border="0" cellpadding="0" cellspacing="0" class="checkoutButtonBg" width="100%">
+				<tr>
+					<td align="left">
+						<asp:LinkButton ID="StepPreviousButton" runat="server"
+							CausesValidation = "False"
+							CommandName      = "MovePrevious"
+							CssClass         = "back"
+							Text             = "Previous" />
+					</td>
+					<td align="right">
+						<asp:LinkButton ID="StepNextButton" runat="server"
+							CommandName = "MoveNext"
+							CssClass    = "continue"
+							Text        = "Next"/>
+					</td>
+				</tr>
+				</table>
+			</asp:Panel>
+		</asp:WizardStep>
+		<asp:WizardStep ID="wzdStep3" runat="server" Title="Payment Information">
+			<asp:Panel ID="panFicusStep3" runat="server" DefaultButton="StepNextButton2">
+				<table border="0" cellpadding="0" cellspacing="0">
+				<tr>
+					<td class="label">Credit Card Number<br />
+						<asp:TextBox ID="txtCCNumber" runat="server" CssClass="checkoutTextbox" Width="330px">4444123412341234</asp:TextBox><br />
+						<asp:RequiredFieldValidator ID="valCCNumber" runat="server"
+							ControlToValidate = "txtCCNumber"
+							Display           = "Dynamic"
+							ErrorMessage      = "Please enter card number." />
+						<asp:RegularExpressionValidator ID="valCCNumber1" runat="server"
+							ControlToValidate="txtCCNumber"
+							Display              = "Dynamic"
+							ErrorMessage         = "Card number invalid."
+							ValidationExpression = "^([0-9]{15,16})$" />&nbsp;</td>
+				</tr>
+				<tr>
+					<td class="label">Expiration Date (MM/YYYY)<br />
+						<asp:TextBox ID="txtExpDate" runat="server" CssClass="checkoutTextbox" Width="155px">12/2009</asp:TextBox><br />
+						<asp:RequiredFieldValidator ID="valExpDate" runat="server"
+							ControlToValidate="txtExpDate"
+							Display="Dynamic"
+							ErrorMessage="Please enter expiration date." />
+						<asp:RegularExpressionValidator ID="valExpDate1" runat="server"
+							ControlToValidate    = "txtExpDate"
+							ErrorMessage         = "Invalid date format."
+							ValidationExpression = "^((0[1-9])|(1[0-2]))\/(\d{4})$"
+							Display              = "Dynamic" />
+						<asp:CustomValidator ID="valExpDate2" runat="server"
+							ClientValidationFunction = "ClientValidate"
+							ControlToValidate        = "txtExpDate"
+							Display                  = "Dynamic"
+							ErrorMessage             = "Expiration date invalid."
+							OnServerValidate         = "ServerValidate" />&nbsp;
+					</td>
+				</tr>
+				<tr>
+					<td class="label">Credit card Type<br />
+						<asp:DropDownList ID="listCCType" runat="server" CssClass="checkoutDropdown">
+							<asp:ListItem>Visa</asp:ListItem>
+							<asp:ListItem>Master Card</asp:ListItem>
+							<asp:ListItem>American Express</asp:ListItem>
+							<asp:ListItem>Discovery</asp:ListItem>
+						</asp:DropDownList>
+					</td>
+					<td>&nbsp;</td>
+				</tr>
+				</table>
+				<p>&nbsp;</p>
+				<table border="0" cellpadding="0" cellspacing="0" class="checkoutButtonBg" width="100%">
+				<tr>
+					<td align="left">
+						<asp:LinkButton ID="LinkButton1" runat="server"
+							CausesValidation="False"
+							CommandName="MovePrevious"
+							CssClass="back" Text="Previous" />
+					</td>
+					<td align="right">
+						<asp:LinkButton ID="StepNextButton2" runat="server"
+							CommandName="MoveNext"
+							CssClass="continue" Text="Next" />
+					</td>
+				</tr>
+				</table>
+			</asp:Panel>
+		</asp:WizardStep>
+		<asp:WizardStep ID="wzdStep4" runat="server" StepType="Finish" Title="Confirmation">
+			<asp:Panel ID="panFicusStep4" runat="server" DefaultButton="FinishButton">
+				<div class="checkOutLabel">
+					Your order will not be processed until you select "Submit Order" below.<br /><br />
+					<strong>Billing address:<br /></strong>
+					<PetShopControl:AddressConfirm ID="billingConfirm" runat="server" /><br />
+					<strong>Shipping address:<br /></strong>
+					<PetShopControl:AddressConfirm ID="shippingConfirm" runat="server"/>
+				</div>
+				<div class="checkOutLabel">
+					A total of <span class="labelBold">
+					<asp:Literal ID="ltlTotal" runat="server"></asp:Literal></span> will be charged to your credit card, ending with <span class="labelBold">
+					<asp:Literal ID="ltlCreditCard" runat="server"></asp:Literal></span>.
+				</div>
+				<table border="0" cellpadding="0" cellspacing="0" class="checkoutButtonBg" width="100%">
+				<tr>
+					<td align="left">
+						<asp:LinkButton ID="FinishPreviousButton" runat="server"
+							CausesValidation = "False"
+							CommandName      = "MovePrevious"
+							CssClass         = "back"
+							Text             = "Previous" />
+					</td>
+					<td align="right">
+						<asp:LinkButton ID="FinishButton" runat="server"
+							CommandName = "MoveComplete"
+							CssClass    = "submit"
+							Text        = "Submit Order" />
+					</td>
+				</tr>
+				</table>
+			</asp:Panel>
+		</asp:WizardStep>
+		<asp:WizardStep ID="wzdStep5" runat="server" AllowReturn="False" StepType="Complete" Title="Receipt">
+			<div class="checkOutLabel">
+				Thank you for your order!<br /><br />
+				<PetShopControl:CartList ID="CartListOrdered" runat="server" />
+				<br />
+				<p>
+					A total of <strong><asp:Literal ID="ltlTotalComplete" runat="server" /></strong>
+					is being charged to your credit card, ending with
+					<strong><asp:Literal ID="ltlCreditCardComplete" runat="server"></asp:Literal></strong>.
+				</p>
+				<p>If you have any questions regarding this order, please contact our customer service at anytime.</p>
+				<p>The .NET Pet Shop Team</p>
+			</div>
+		</asp:WizardStep>
+	</WizardSteps>
+	<HeaderStyle HorizontalAlign="Left" />
+	<HeaderTemplate><%= wzdCheckOut.ActiveStep.Title %></HeaderTemplate>
+	<StartNavigationTemplate></StartNavigationTemplate>
+	<StepNavigationTemplate></StepNavigationTemplate>
+	<FinishNavigationTemplate></FinishNavigationTemplate>
+</asp:Wizard>
+</td>
+</tr>
+</table>
+
+</div>
+</asp:Content>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/CheckOut.aspx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,111 @@
+using System;
+using System.Web.UI.WebControls;
+
+using PetShop.BusinessLogic;
+using PetShop.ObjectModel;
+
+namespace PetShop.Web
+{
+	public partial class CheckOut : System.Web.UI.Page
+	{
+		protected void Page_Load(object sender, EventArgs e)
+		{
+			if (billingForm.Address == null)
+				billingForm.Address = Profile.AccountInfo;
+		}
+
+		/// <summary>
+		/// Process the order
+		/// </summary>
+		protected void wzdCheckOut_FinishButtonClick(object sender, WizardNavigationEventArgs e)
+		{
+			if (Profile.ShoppingCart.Items.Count > 0)
+			{
+				if (Profile.ShoppingCart.Count > 0)
+				{
+					// display ordered items
+					CartListOrdered.Bind(Profile.ShoppingCart.Items);
+
+					// display total and credit card information
+					ltlTotalComplete.Text = ltlTotal.Text;
+					ltlCreditCardComplete.Text = ltlCreditCard.Text;
+
+					// create order
+					Order order = new Order();
+
+					order.UserID          = User.Identity.Name;
+					order.OrderDate       = DateTime.Now;
+					order.TotalPrice      = Profile.ShoppingCart.Total;
+					order.ShippingAddress = shippingForm.Address;
+					order.BillingAddress  = billingForm.Address;
+					order.Lines           = Profile.ShoppingCart.GetOrderLineItems();
+					order.CreditCard      = GetCreditCardInfo();
+
+					new OrderManager().InsertOrder(order);
+
+					// destroy cart
+					Profile.ShoppingCart.Clear();
+					Profile.Save();
+				}
+			}
+			else
+			{
+				lblMsg.Text = "<p><br>Can not process the order. Your cart is empty.</p><p class=SignUpLabel><a class=linkNewUser href=Default.aspx>Continue shopping</a></p>";
+				wzdCheckOut.Visible = false;
+			}
+		}
+
+		/// <summary>
+		/// Create CreditCardInfo object from user input
+		/// </summary>
+		private CreditCard GetCreditCardInfo()
+		{
+			CreditCard cc = new CreditCard();
+
+			cc.Type       = WebUtility.InputText(listCCType.SelectedValue, 40);
+			cc.Expiration = WebUtility.InputText(txtExpDate.Text,           7);
+			cc.Number     = WebUtility.InputText(txtCCNumber.Text,         20);
+
+			return cc;
+		}
+
+		/// <summary>
+		/// Changing Wiszard steps
+		/// </summary>
+		protected void wzdCheckOut_ActiveStepChanged(object sender, EventArgs e)
+		{
+			if (wzdCheckOut.ActiveStepIndex == 3)
+			{
+				billingConfirm. Address = billingForm.Address;
+				shippingConfirm.Address = shippingForm.Address;
+				ltlTotal.Text           = Profile.ShoppingCart.Total.ToString("c");
+
+				if (txtCCNumber.Text.Length > 4)
+					ltlCreditCard.Text = txtCCNumber.Text.Substring(txtCCNumber.Text.Length - 4, 4);
+			}
+		}
+
+		/// <summary>
+		/// Handler for "Ship to Billing Addredd" checkbox.
+		/// Prefill/Clear shipping address form.
+		/// </summary>
+		protected void chkShipToBilling_CheckedChanged(object sender, EventArgs e)
+		{
+			if (chkShipToBilling.Checked)
+				shippingForm.Address = billingForm.Address;
+		}
+
+		/// <summary>
+		/// Custom validator to check CC expiration date
+		/// </summary>
+		protected void ServerValidate(object source, ServerValidateEventArgs value)
+		{
+			DateTime dt;
+
+			if (DateTime.TryParse(value.Value, out dt))
+				value.IsValid = dt > DateTime.Now;
+			else
+				value.IsValid = false;
+		}
+	}
+}
Binary file Demo/Asp.Net/Web/Comm_Images/Logo-home.gif has changed
Binary file Demo/Asp.Net/Web/Comm_Images/Logo.gif has changed
Binary file Demo/Asp.Net/Web/Comm_Images/bg-body.gif has changed
Binary file Demo/Asp.Net/Web/Comm_Images/bg-labelLists.gif has changed
Binary file Demo/Asp.Net/Web/Comm_Images/bg-search.gif has changed
Binary file Demo/Asp.Net/Web/Comm_Images/bg-sign-in.gif has changed
Binary file Demo/Asp.Net/Web/Comm_Images/button-back.gif has changed
Binary file Demo/Asp.Net/Web/Comm_Images/button-calculate.gif has changed
Binary file Demo/Asp.Net/Web/Comm_Images/button-cart-grey.gif has changed
Binary file Demo/Asp.Net/Web/Comm_Images/button-cart.gif has changed
Binary file Demo/Asp.Net/Web/Comm_Images/button-checkout.gif has changed
Binary file Demo/Asp.Net/Web/Comm_Images/button-continue.gif has changed
Binary file Demo/Asp.Net/Web/Comm_Images/button-delete.gif has changed
Binary file Demo/Asp.Net/Web/Comm_Images/button-home.gif has changed
Binary file Demo/Asp.Net/Web/Comm_Images/button-search.gif has changed
Binary file Demo/Asp.Net/Web/Comm_Images/button-wishlist-grey.gif has changed
Binary file Demo/Asp.Net/Web/Comm_Images/button-wishlist.gif has changed
Binary file Demo/Asp.Net/Web/Comm_Images/dotten-line.gif has changed
Binary file Demo/Asp.Net/Web/Comm_Images/home-bg-body.gif has changed
Binary file Demo/Asp.Net/Web/Comm_Images/home-fish.gif has changed
Binary file Demo/Asp.Net/Web/Comm_Images/seahorse.gif has changed
Binary file Demo/Asp.Net/Web/Comm_Images/spacer.gif has changed
Binary file Demo/Asp.Net/Web/Comm_Images/vertigo-icon.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Controls/AddressConfirm.ascx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+<%@ Control Language="C#" AutoEventWireup="true" CodeFile="AddressConfirm.ascx.cs" Inherits="PetShop.Web.AddressConfirm" %>
+<table border="0" cellpadding="0" cellspacing="0">
+<tr><td>
+	<asp:Literal ID="ltlFirstName" runat="server" />&nbsp;<asp:Literal ID="ltlLastName" runat="server" /><br/>
+	<asp:Literal ID="ltlAddress1"  runat="server" /><br/>
+	<asp:Literal ID="ltlAddress2"  runat="server" /><br/>
+	<asp:Literal ID="ltlCity"      runat="server" />,&nbsp;<asp:Literal ID="ltlState" runat="server" />&nbsp;<asp:Literal ID="ltlZip" runat="server" /><br/>
+	<asp:Literal ID="ltlCountry"   runat="server" /><br/>
+	<asp:Literal ID="ltlPhone"     runat="server" /><br/>
+	<asp:Literal ID="ltlEmail"     runat="server" />
+</td></tr>
+</table>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Controls/AddressConfirm.ascx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,32 @@
+using System;
+
+using PetShop.ObjectModel;
+
+namespace PetShop.Web
+{
+	public partial class AddressConfirm : System.Web.UI.UserControl
+	{
+		/// <summary>
+		///	Control property to set the address
+		/// </summary>
+		public Address Address
+		{
+			set
+			{
+				if (value != null)
+				{
+					ltlFirstName.Text = value.FirstName;
+					ltlLastName. Text = value.LastName;
+					ltlAddress1. Text = value.Line1;
+					ltlAddress2. Text = value.Line2;
+					ltlCity.     Text = value.City;
+					ltlZip.      Text = value.Zip;
+					ltlState.    Text = value.State;
+					ltlCountry.  Text = value.Country;
+					ltlPhone.    Text = value.Phone;
+					ltlEmail.    Text = value.Email;
+				}
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Controls/AddressForm.ascx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,77 @@
+<%@ Control Language="C#" AutoEventWireup="true" CodeFile="AddressForm.ascx.cs" Inherits="PetShop.Web.AddressForm" %>
+<table border="0" cellpadding="0" cellspacing="0">
+<tr>
+<td class="label" valign="top" width="50%">First Name<br />
+	<asp:TextBox ID="txtFirstName" runat="server" Columns="30" CssClass="checkoutTextbox"
+		MaxLength="80" Width="155px"></asp:TextBox><br />
+	<asp:RequiredFieldValidator ID="valFirstName" runat="server" ControlToValidate="txtFirstName"
+		CssClass="asterisk" ErrorMessage="Please enter first name."></asp:RequiredFieldValidator>&nbsp;&nbsp;
+</td><td class="label" colspan="2" valign="top">Last Name<br />
+	<asp:TextBox ID="txtLastName" runat="server" Columns="30" CssClass="checkoutTextbox"
+		MaxLength="80" Width="155px"></asp:TextBox><br />
+	<asp:RequiredFieldValidator ID="valLastName" runat="server" ControlToValidate="txtLastName"
+		CssClass="asterisk" ErrorMessage="Please enter last name."></asp:RequiredFieldValidator>&nbsp;&nbsp;
+</td>
+</tr>
+<tr>
+<td class="label" colspan="3" valign="top">Address<br />
+	<asp:TextBox ID="txtAddress1" runat="server" Columns="55" CssClass="checkoutTextbox"
+		MaxLength="80" Width="330px"></asp:TextBox><br />
+	<asp:RequiredFieldValidator ID="valAddress1" runat="server" ControlToValidate="txtAddress1"
+		CssClass="asterisk" ErrorMessage="Please enter street address."></asp:RequiredFieldValidator>&nbsp;
+	<br />
+	<asp:TextBox ID="txtAddress2" runat="server" Columns="55" CssClass="checkoutTextbox"
+		MaxLength="80" Width="330px"></asp:TextBox>
+</td>
+</tr>
+<tr>
+<td class="label" style="height: 19px" valign="top" width="50%">City<br />
+	<asp:TextBox ID="txtCity" runat="server" Columns="55" CssClass="checkoutTextbox"
+		MaxLength="80" Width="155px"></asp:TextBox><br />
+	<asp:RequiredFieldValidator ID="valCity" runat="server" ControlToValidate="txtCity"
+		CssClass="asterisk" ErrorMessage="Please enter city."></asp:RequiredFieldValidator>&nbsp;&nbsp;
+</td><td class="label" style="height: 19px" valign="top" width="20%">State<br />
+	<asp:DropDownList ID="listState" runat="server" CssClass="checkoutDropdown">
+		<asp:ListItem Value="CA">CA</asp:ListItem>
+		<asp:ListItem Value="NY">NY</asp:ListItem>
+		<asp:ListItem Value="TX">TX</asp:ListItem>
+	</asp:DropDownList><br />
+</td><td class="label" style="width: 100px; height: 19px;" valign="top">Postal Code<br />
+	<asp:TextBox ID="txtZip" runat="server" Columns="12" CssClass="checkoutTextbox" MaxLength="20"
+		Width="65px"></asp:TextBox><br />
+	<asp:RequiredFieldValidator ID="valZip" runat="server" ControlToValidate="txtZip"
+		CssClass="asterisk" Display="Dynamic" ErrorMessage="Please enter postal code."></asp:RequiredFieldValidator><asp:RegularExpressionValidator
+			ID="valZip1" runat="server" ControlToValidate="txtZip" CssClass="asterisk" Display="Dynamic"
+			ErrorMessage="Postal code invalid." ValidationExpression="\d{5}(-\d{4})?"></asp:RegularExpressionValidator>
+</td>
+</tr>
+<tr>
+<td class="label" style="height: 19px" valign="top" width="50%">Country<br />
+	<asp:DropDownList ID="listCountry" runat="server" CssClass="checkoutDropdown">
+		<asp:ListItem Value="USA">USA</asp:ListItem>
+		<asp:ListItem Value="Canada">Canada</asp:ListItem>
+		<asp:ListItem Value="Japan">Japan</asp:ListItem>
+	</asp:DropDownList><br />
+	&nbsp; </td><td class="label" style="height: 19px" valign="top" width="20%"></td>
+<td class="label" style="width: 100px; height: 19px;" valign="top"></td>
+</tr>
+<tr>
+<td class="label" colspan="3" valign="top">Phone Number<br />
+	<asp:TextBox ID="txtPhone" runat="server" Columns="20" CssClass="checkoutTextbox"
+		MaxLength="20" Width="155px"></asp:TextBox><br />
+	<asp:RequiredFieldValidator ID="valPhone" runat="server" ControlToValidate="txtPhone"
+		CssClass="asterisk" ErrorMessage="Please enter telephone number."></asp:RequiredFieldValidator><asp:RegularExpressionValidator
+			ID="valPhone1" runat="server" ControlToValidate="txtPhone" CssClass="asterisk"
+			Display="Dynamic" ErrorMessage="Phone number invalid." ValidationExpression="((\(?\d{3}\)? ?)|(\d{3}-?))?\d{3}-?\d{4}"></asp:RegularExpressionValidator>&nbsp;&nbsp;</td>
+</tr>
+<tr>
+<td class="label" colspan="3" style="height: 62px" valign="top">Email<br />
+	<asp:TextBox ID="txtEmail" runat="server" Columns="55" CssClass="checkoutTextbox"
+		MaxLength="80" Width="330px"></asp:TextBox><br />
+	<asp:RequiredFieldValidator ID="valEmail" runat="server" ControlToValidate="txtEmail"
+		CssClass="asterisk" Display="Dynamic" ErrorMessage="Please enter email."></asp:RequiredFieldValidator><asp:RegularExpressionValidator
+			ID="valEmail1" runat="server" ControlToValidate="txtEmail" CssClass="asterisk"
+			Display="Dynamic" ErrorMessage="Email invalid." ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"></asp:RegularExpressionValidator>&nbsp;&nbsp;
+</td>
+</tr>
+</table>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Controls/AddressForm.ascx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,75 @@
+using System;
+using System.Text.RegularExpressions;
+
+using PetShop.ObjectModel;
+
+namespace PetShop.Web
+{
+	public partial class AddressForm : System.Web.UI.UserControl
+	{
+		/// <summary>
+		/// Control property to set or get the address
+		/// </summary>
+		public Address Address
+		{
+			get
+			{
+				// Return null if control is empty.
+				//
+				if (string.IsNullOrEmpty(txtFirstName.Text) &&
+					string.IsNullOrEmpty(txtLastName. Text) &&
+					string.IsNullOrEmpty(txtAddress1. Text) &&
+					string.IsNullOrEmpty(txtAddress2. Text) &&
+					string.IsNullOrEmpty(txtCity.     Text) &&
+					string.IsNullOrEmpty(txtZip.      Text) &&
+					string.IsNullOrEmpty(txtEmail.    Text) &&
+					string.IsNullOrEmpty(txtPhone.    Text))
+					return null;
+
+				Address addr = new Address();
+
+				// Make sure we clean the input.
+				//
+				addr.FirstName = WebUtility.InputText(txtFirstName.Text, 50);
+				addr.LastName  = WebUtility.InputText(txtLastName. Text, 50);
+				addr.Line1     = WebUtility.InputText(txtAddress1. Text, 50);
+				addr.Line2     = WebUtility.InputText(txtAddress2. Text, 50);
+				addr.City      = WebUtility.InputText(txtCity.     Text, 50);
+				addr.Zip       = WebUtility.InputText(txtZip.      Text, 10);
+				addr.Phone     = WebUtility.InputText(WebUtility.CleanNonWord(txtPhone.Text), 10);
+				addr.Email     = WebUtility.InputText(txtEmail.Text, 80);
+				addr.State     = WebUtility.InputText(listState.  SelectedItem.Value,  2);
+				addr.Country   = WebUtility.InputText(listCountry.SelectedItem.Value, 50);
+
+				return addr;
+			}
+
+			set
+			{
+				if (value != null)
+				{
+					txtFirstName.Text = value.FirstName;
+					txtLastName. Text = value.LastName;
+					txtAddress1. Text = value.Line1;
+					txtAddress2. Text = value.Line2;
+					txtCity.     Text = value.City;
+					txtZip.      Text = value.Zip;
+					txtPhone.    Text = value.Phone;
+					txtEmail.    Text = value.Email;
+
+					if (!string.IsNullOrEmpty(value.State))
+					{
+						listState.ClearSelection();
+						listState.SelectedValue = value.State;
+					}
+
+					if (!string.IsNullOrEmpty(value.Country))
+					{
+						listCountry.ClearSelection();
+						listCountry.SelectedValue = value.Country;
+					}
+				}
+			} 
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Controls/BreadCrumbControl.ascx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,2 @@
+<%@ Control Language="C#" AutoEventWireup="true" CodeFile="BreadCrumbControl.ascx.cs" Inherits="PetShop.Web.BreadCrumbControl" %>
+<asp:PlaceHolder runat="server" ID="plhControl" />&nbsp;
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Controls/BreadCrumbControl.ascx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,86 @@
+using System;
+using System.Web.UI.WebControls;
+using System.Web.UI.HtmlControls;
+
+using PetShop.BusinessLogic;
+
+namespace PetShop.Web
+{
+	public partial class BreadCrumbControl : System.Web.UI.UserControl
+	{
+		protected void Page_Load(object sender, EventArgs e)
+		{
+			string categoryId = Request.QueryString["categoryId"];
+
+			if (!string.IsNullOrEmpty(categoryId))
+			{
+				ProcessHomePageLink();
+
+				// Process Product page link
+				//
+				HtmlAnchor lnkProducts = new HtmlAnchor();
+
+				lnkProducts.InnerText = new ProductManager().GetCategory(categoryId).Name;
+				lnkProducts.HRef      = string.Format("~/Products.aspx?page=0&categoryId={0}", categoryId);
+
+				plhControl.Controls.Add(lnkProducts);
+
+				string productId = Request.QueryString["productId"];
+
+				if (!string.IsNullOrEmpty(productId))
+				{
+					// Process Item page link
+					//
+					plhControl.Controls.Add(GetDivider());
+
+					HtmlAnchor lnkItemDetails = new HtmlAnchor();
+
+					lnkItemDetails.InnerText = new ProductManager().GetProduct(productId).Name;
+					lnkItemDetails.HRef      = string.Format("~/Items.aspx?categoryId={0}&productId={1}", categoryId, productId);
+
+					plhControl.Controls.Add(lnkItemDetails);
+				}
+			}
+			else
+			{
+				int len = Request.Url.Segments.Length;
+
+				if (len >= 2 && Request.Url.Segments[len-2].TrimEnd('/', '\\').ToLower() == "admin")
+				{
+					ProcessHomePageLink();
+
+					HtmlAnchor a = new HtmlAnchor();
+
+					a.InnerText = Request.Url.Segments[len - 1].Split('.')[0];
+					a.HRef      = Request.Url.PathAndQuery;
+
+					plhControl.Controls.Add(a);
+				}
+			}
+		}
+
+		private void ProcessHomePageLink()
+		{
+			HtmlAnchor lnkHome = new HtmlAnchor();
+
+			lnkHome.InnerText = "Home";
+			lnkHome.HRef      = "~/Default.aspx";
+
+			plhControl.Controls.Add(lnkHome);
+			plhControl.Controls.Add(GetDivider());
+		}
+
+		/// <summary>
+		/// Create a breadcrumb nodes divider
+		/// </summary>
+		/// <returns>Literal control containing formatted divider</returns>
+		private Literal GetDivider()
+		{
+			Literal ltlDivider = new Literal();
+
+			ltlDivider.Text = "&nbsp;&#062;&nbsp;";
+
+			return ltlDivider;
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Controls/CartList.ascx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+<%@ Control Language="C#" AutoEventWireup="true" CodeFile="CartList.ascx.cs" Inherits="PetShop.Web.CartList" %>
+<asp:Repeater ID="repOrdered" runat="server">
+<HeaderTemplate><table cellspacing="0" cellpadding="0" border="0" style="width:100%;border-collapse:collapse;">
+<tr align="left">
+	<th scope="col">Name</th><th scope="col">Qty</th>
+</tr></HeaderTemplate>
+<ItemTemplate><tr valign="top">
+	<td><%# Eval("Name") + " " + Eval("Type")%></td>
+	<td><%# Eval("Quantity") %></td>
+</tr></ItemTemplate>
+<FooterTemplate></table></FooterTemplate>
+</asp:Repeater>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Controls/CartList.ascx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Web.UI;
+
+using PetShop.ObjectModel;
+
+namespace PetShop.Web
+{
+	public partial class CartList : UserControl
+	{
+		public void Bind(ICollection<CartItem> cart)
+		{
+			if (cart != null)
+			{
+				repOrdered.DataSource = cart;
+				repOrdered.DataBind();
+			}
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Controls/CreditCardForm.ascx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,75 @@
+<%@ Control AutoEventWireup="true" CodeFile="CreditCardForm.ascx.cs" Inherits="PetShop.Web.CreditCardForm" Language="C#" %>
+
+<script language="javascript">
+function ClientValidate(source, arguments)
+ {
+	var dtNow   = new Date();
+	var tmp    = new String(arguments.Value);
+	var dtCard = new Date();
+	
+	dtCard.setFullYear(tmp.split("/")[1]);
+	dtCard.setMonth(tmp.split("/")[0]-1);
+	dtCard.setDate(30);
+
+	if (dtNow < dtCard) arguments.IsValid = true;
+	else                arguments.IsValid = false;
+}
+</script>
+
+<table border="0" cellpadding="0" cellspacing="0" class="track3" width="413">
+<tr><td>&nbsp;</td></tr>
+<tr><td>
+<div class="label">
+	Credit Card Type<br />
+	<asp:DropDownList ID="listCctype" runat="server"  Width="150px" CssClass="checkoutDropdown">
+		<asp:ListItem>Visa</asp:ListItem>
+		<asp:ListItem>Master Card</asp:ListItem>
+		<asp:ListItem>American Express</asp:ListItem>
+		<asp:ListItem>Discovery</asp:ListItem>
+	</asp:DropDownList>
+	<br/><br/>
+</div>
+</td></tr>
+<tr><td>
+<div class="label">
+	Card Number
+	<br />
+	<asp:TextBox ID="txtCcnumber" runat="server" Width="145px" CssClass="checkoutTextbox"></asp:TextBox>
+	<span class="asterisk">*</span><br />
+	<asp:RequiredFieldValidator ID="valRequiredFieldValidator1" runat="server"
+		ControlToValidate="txtCcnumber"
+		ErrorMessage="Please enter card number."
+		Display="Dynamic" />
+	<asp:RegularExpressionValidator ID="valRegularExpressionValidator1" runat="server" ControlToValidate="txtCcnumber"
+		ErrorMessage="Card number invalid."
+		ValidationExpression="^([0-9]{15,16})$"
+		Display="Dynamic" />&nbsp;
+	<br/>
+</div>
+</td></tr>
+<tr><td>
+<div class="label">
+	Expiration Date (MM/YYYY)
+	<br />
+	<asp:TextBox ID="txtExpdate" runat="server" Width="70px" CssClass="checkoutTextbox"></asp:TextBox>
+	<span class="asterisk">*</span><br />
+	<asp:RequiredFieldValidator ID="valRequiredFieldValidator2" runat="server"
+		ControlToValidate="txtExpdate"
+		ErrorMessage="Please enter expiration date."
+		Display="Dynamic" />
+	<asp:RegularExpressionValidator ID="valRegularExpressionValidator2" runat="server"
+		ControlToValidate="txtExpdate"
+		ErrorMessage="Invalid date format."
+		ValidationExpression="^((0[1-9])|(1[0-2]))\/(\d{4})$"
+		Display="Dynamic" />
+	<asp:CustomValidator ID="valCustomValidator" runat="server"
+		ClientValidationFunction="ClientValidate"
+		ControlToValidate="txtExpdate"
+		Display="Dynamic"
+		ErrorMessage="Expiration date invalid."
+		OnServerValidate="ServerValidate" />&nbsp;
+	<br/>
+</div>
+</td>
+</tr>
+</table>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Controls/CreditCardForm.ascx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,50 @@
+using System;
+using System.Web.UI.WebControls;
+
+using PetShop.ObjectModel;
+
+namespace PetShop.Web
+{
+	public partial class CreditCardForm : System.Web.UI.UserControl
+	{
+		/// <summary>
+		/// Custom validator to check the expiration date
+		/// </summary>
+		protected void ServerValidate(object source, ServerValidateEventArgs value)
+		{
+			DateTime dt;
+
+			if (DateTime.TryParse(value.Value, out dt))
+				value.IsValid = dt > DateTime.Now;
+			else
+				value.IsValid = false;
+		}
+
+		/// <summary>
+		/// Property to set/get credit card info
+		/// </summary>
+		public CreditCard CreditCard
+		{
+			get
+			{
+				CreditCard cc = new CreditCard();
+
+				cc.Type       = WebUtility.InputText(listCctype.SelectedValue, 40);
+				cc.Expiration = WebUtility.InputText(txtExpdate. Text,          7);
+				cc.Number     = WebUtility.InputText(txtCcnumber.Text,         20);
+
+				return cc;
+			}
+
+			set
+			{
+				if (value != null)
+				{
+					if (!string.IsNullOrEmpty(value.Number))     txtCcnumber.Text = value.Number;
+					if (!string.IsNullOrEmpty(value.Expiration)) txtExpdate. Text = value.Expiration;
+					if (!string.IsNullOrEmpty(value.Type))       listCctype.Items.FindByValue(value.Type).Selected = true;	  
+				}
+			}
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Controls/ItemsControl.ascx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,46 @@
+<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ItemsControl.ascx.cs" Inherits="PetShop.Web.ItemsControl" %>
+<%@ Register TagPrefix="PetShopControl" Namespace="PetShop.Web" %>
+
+<div class="paging"><a href='Products.aspx?categoryId=<%=Request.QueryString["categoryId"] %>&productId=<%=Request.QueryString["productId"] %>'>&#060;&nbsp;Back to list</a></div>
+<div class="itemsPosition" align="center">
+
+<PetShopControl:CustomGrid ID="itemsGrid" runat="server" EmptyText="No items found." OnPageIndexChanged="PageChanged" PageSize="2">
+<HeaderTemplate>
+	<table cellspacing="0" cellpadding="0" border="0" width="387">
+</HeaderTemplate>
+<ItemTemplate>
+<tr align="left" valign="top">
+<td valign="top" width="148">
+	<img id="imgItem" alt='<%# Eval("Name") %>' src='<%# Eval("Image") %>' style="border-width: 0px;" runat="server" /></td>
+<td width="33">&nbsp;</td>
+<td valign="top" width="206">
+<table cellspacing="0" cellpadding="0" border="0">
+	<tr>
+		<td class="itemText">Name:</td>
+		<td class="itemName"><%# string.Format("{0} {1}", Eval("ProductName"), Eval("Name")) %></td>
+	</tr>
+	<tr class="itemText">
+		<td>Quantity:</td>
+		<td><%# Eval("Quantity") %></td>
+	</tr>
+	<tr class="itemText">
+		<td>Price:</td>
+		<td><%# Eval("Price", "{0:c}") %></td>
+	</tr>
+	<tr class="itemText">
+		<td colspan="2"><asp:HyperLink ID="lnkCart" runat="server" NavigateUrl='<%# string.Format("~/ShoppingCart.aspx?addItem={0}", Eval("ID")) %>' SkinID="lnkCart"></asp:HyperLink></td>
+	</tr>
+	<tr class="itemText">
+		<td colspan="2"><asp:HyperLink ID="lnkWishList" runat="server" NavigateUrl='<%# string.Format("~/WishList.aspx?addItem={0}", Eval("ID")) %>' SkinID="lnkWishlist"></asp:HyperLink></td>
+	</tr>
+</table>
+</td>
+</tr>
+</ItemTemplate>
+<SeparatorTemplate>
+	<tr><td height="50" colspan="3">&nbsp;</td></tr>
+</SeparatorTemplate>
+<FooterTemplate></table></FooterTemplate>
+</PetShopControl:CustomGrid>
+
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Controls/ItemsControl.ascx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,21 @@
+using System;
+using System.Web.UI;
+using System.Web.UI.WebControls;
+
+using PetShop.BusinessLogic;
+
+namespace PetShop.Web
+{
+	public partial class ItemsControl : UserControl
+	{
+		protected void PageChanged(object sender, DataGridPageChangedEventArgs e)
+		{
+			itemsGrid.CurrentPageIndex = e.NewPageIndex;
+
+			string id = Request.QueryString["productId"];
+
+			itemsGrid.DataSource = new ProductManager().GetItemListByProductID(id);
+			itemsGrid.DataBind();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Controls/NavigationControl.ascx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,16 @@
+<%@ Control Language="C#" AutoEventWireup="true" CodeFile="NavigationControl.ascx.cs" Inherits="PetShop.Web.NavigationControl" %>
+<%@ OutputCache Duration="100000" VaryByParam="*" %>
+
+<asp:Repeater ID="repCategories" runat="server">
+<HeaderTemplate>
+<table cellspacing="0" border="0" style="border-collapse: collapse;">
+</HeaderTemplate>
+<ItemTemplate>
+<tr>
+<td class="<%= ControlStyle %>"><asp:HyperLink runat="server" ID="lnkCategory"  NavigateUrl='<%# string.Format("~/Products.aspx?page=0&categoryId={0}", Eval("Id")) %>' Text='<%# Eval("Name") %>' /><asp:HiddenField runat="server" ID="hidCategoryId" Value='<%# Eval("Id") %>' /></td>
+</tr>
+</ItemTemplate>
+<FooterTemplate>
+</table>
+</FooterTemplate>
+</asp:Repeater>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Controls/NavigationControl.ascx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,69 @@
+using System;
+using System.Web.UI;
+using System.Web.UI.WebControls;
+
+using PetShop.BusinessLogic;
+
+namespace PetShop.Web
+{
+	public partial class NavigationControl : UserControl
+	{
+		// Control layout property.
+		//
+		private   string _controlStyle;
+		protected string  ControlStyle
+		{
+			get { return _controlStyle; }
+		}
+
+		// Get properties based on control consumer.
+		//
+		protected void GetControlStyle()
+		{
+			if (Request.ServerVariables["SCRIPT_NAME"].ToLower().IndexOf("default.aspx") > 0)
+				_controlStyle = "navigationLinks";
+			else
+				_controlStyle = "mainNavigation";
+		}
+
+		protected void Page_Load(object sender, EventArgs e)
+		{
+			GetControlStyle();
+			BindCategories();
+
+			// Select current category.
+			//
+			string categoryId = Request.QueryString["categoryId"];
+
+			if (!string.IsNullOrEmpty(categoryId))
+				SelectCategory(categoryId);
+		}
+
+		// Select current category.
+		//
+		private void SelectCategory(string categoryId)
+		{
+			foreach (RepeaterItem item in repCategories.Items)
+			{
+				HiddenField hidCategoryId = (HiddenField)item.FindControl("hidCategoryId");
+
+				if (hidCategoryId.Value.ToLower() == categoryId.ToLower())
+				{
+					HyperLink lnkCategory = (HyperLink)item.FindControl("lnkCategory");
+
+					lnkCategory.ForeColor = System.Drawing.Color.FromArgb(199, 116, 3);
+
+					break;
+				}
+			}
+		}
+
+		// Bind categories.
+		//
+		private void BindCategories()
+		{
+			repCategories.DataSource = new ProductManager().GetCategoryList();
+			repCategories.DataBind();
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Controls/ProductsControl.ascx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,18 @@
+<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ProductsControl.ascx.cs" Inherits="PetShop.Web.ProductsControl" EnableViewState="false" %>
+<%@ Register TagPrefix="PetShopControl" Namespace="PetShop.Web" %>
+<%@ OutputCache Duration="100000" VaryByParam="page;categoryId" %>
+
+<div align="center" class="productsPosition">
+<PetShopControl:CustomList ID="productsList" runat="server" EmptyText="No products found." OnPageIndexChanged="PageChanged" PageSize="4" RepeatColumns="2" CellPadding="16" CellSpacing="0" Width="500px">        
+<ItemTemplate>
+<table cellpadding="0" cellspacing="0">
+<tr>
+	<td valign="top" width="91"><a href='Items.aspx?productId=<%# Eval("Id") %>&categoryId=<%# Eval("categoryId") %>'><img id="imgProduct" alt='<%# Eval("Name") %>' src='<%# Eval("Image") %>' style="border-width: 0px;" runat="server" /></a></td>
+	<td width="26">&nbsp;</td>
+	<td valign="top" width="120"><a href='Items.aspx?productId=<%# Eval("Id") %>&categoryId=<%# Eval("categoryId") %>'><div class="productName"><%# Eval("Name") %></div></a><div class="productDescription"><%# Eval("Description") %></div></td>
+</tr>
+</table>
+</ItemTemplate>
+<ItemStyle HorizontalAlign="Left" VerticalAlign="Top" />
+</PetShopControl:CustomList>
+ </div>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Controls/ProductsControl.ascx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,21 @@
+using System;
+using System.Web;
+using System.Web.UI.WebControls;
+
+using PetShop.BusinessLogic;
+
+namespace PetShop.Web
+{
+	public partial class ProductsControl : System.Web.UI.UserControl
+	{
+		protected void PageChanged(object sender, DataGridPageChangedEventArgs e)
+		{
+			productsList.CurrentPageIndex = e.NewPageIndex;
+
+			string id = Request.QueryString["categoryId"];
+
+			productsList.DataSource = new ProductManager().GetProductListByCategoryID(id);
+			productsList.DataBind();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Controls/SearchControl.ascx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,19 @@
+<%@ Control Language="C#" AutoEventWireup="true" CodeFile="SearchControl.ascx.cs" Inherits="PetShop.Web.SearchControl" %>
+<%@ OutputCache Duration="100000" VaryByParam="page;keywords" Shared="true" %>
+<%@ Register TagPrefix="PetShopControl" Namespace="PetShop.Web" %>
+
+<div align="center" class="searchPosition">
+<div class="label">Search results for <b><%= Request.QueryString["keywords"] %></b>:</div>
+<PetShopControl:CustomList ID="searchList" runat="server" EmptyText="No products found." OnPageIndexChanged="PageChanged" PageSize="4" RepeatColumns="2" CellPadding="16" CellSpacing="0" Width="500px">
+<ItemTemplate>
+<table cellpadding="0" cellspacing="0">
+<tr>
+	<td valign="top" width="91"><a href='Items.aspx?productId=<%# Eval("ID") %>&categoryId=<%# Eval("CategoryID") %>'><img id="imgProduct" alt='<%# Eval("Name") %>' src='<%# Eval("Image") %>' style="border-width: 0px;" runat="server" /></a></td>
+	<td width="26">&nbsp;</td>
+	<td valign="top" width="120"><a href='Items.aspx?productId=<%# Eval("ID") %>&categoryId=<%# Eval("CategoryID") %>'><div class="productName"><%# Eval("Name") %></div></a><div class="productDescription"><%# Eval("Description") %></div></td>
+</tr>
+</table>
+</ItemTemplate>
+<ItemStyle HorizontalAlign="Left" VerticalAlign="Top" />
+</PetShopControl:CustomList>
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Controls/SearchControl.ascx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,21 @@
+using System;
+using System.Web.UI;
+using System.Web.UI.WebControls;
+
+using PetShop.BusinessLogic;
+
+namespace PetShop.Web
+{
+	public partial class SearchControl : UserControl
+	{
+		protected void PageChanged(object sender, DataGridPageChangedEventArgs e)
+		{
+			searchList.CurrentPageIndex = e.NewPageIndex;
+
+			string keywordKey = Request.QueryString["keywords"];
+
+			searchList.DataSource = new ProductManager().SearchProducts(keywordKey.Split());
+			searchList.DataBind();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Controls/ShoppingCartControl.ascx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,55 @@
+<%@ Control AutoEventWireup="true" CodeFile="ShoppingCartControl.ascx.cs" Inherits="PetShop.Web.ShoppingCartControl" Language="C#" %>
+<asp:Panel ID="panFocus" runat="server" DefaultButton="btnTotal">
+
+<div align="left" class="cartHeader">Items in your Shopping Cart</div>
+<asp:Label runat="server" ID="lblMsg" EnableViewState="false"  CssClass="label" />
+
+<asp:Repeater ID="repShoppingCart" runat="server">
+<HeaderTemplate>
+<table cellspacing="0" cellpadding="3" rules="all" border="0" class="cart" align="center" width="387">
+<tr class="labelLists">
+	<th scope="col">&nbsp;</th>
+	<th scope="col">Name</th>
+	<th scope="col">Qty</th>
+	<th align="right" scope="col">Price</th>
+	<th scope="col">&nbsp;</th>
+</tr>
+</HeaderTemplate>
+<ItemTemplate>
+<tr class="listItem">
+	<td>
+		<asp:ImageButton ID="btnDelete" runat="server" BorderStyle="None" CausesValidation="false"
+			CommandArgument='<%# Eval("ItemId") %>' CommandName="Del" ImageUrl="~/Comm_Images/button-delete.gif"
+			OnCommand="CartItem_Command" ToolTip="Delete" />
+	</td>
+	<td style="width:100%;">
+		<a runat="server" href='<%# string.Format("~/Items.aspx?itemId={0}&productId={1}&categoryId={2}", Eval("ItemId"), Eval("ProductId"), Eval("CategoryId")) %>'><%# string.Format("{0} {1}", Eval("Name"), Eval("Type")) %></a>
+	</td>
+	<td>
+		<asp:TextBox ID="txtQuantity" runat="server" Columns="3" Text='<%# Eval("Quantity") %>' Width="20px"></asp:TextBox>
+	</td>
+	<td align="right"><%# Eval("Price", "{0:c}")%></td><td>
+		<asp:ImageButton ID="btnToWishList" runat="server" AlternateText="Move to wish list" CausesValidation="false" CommandArgument='<%# Eval("ItemId") %>' CommandName="Move" ImageUrl="~/Comm_Images/button-wishlist.gif" OnCommand="CartItem_Command" ToolTip="Move to wish list" />
+	</td>
+</tr>
+</ItemTemplate>
+<FooterTemplate>
+</table>
+</FooterTemplate>
+
+</asp:Repeater>
+<asp:PlaceHolder ID="plhTotal" runat="server" EnableViewState="false">
+<table border="0" cellpadding="0" cellspacing="0" width="387">
+<tr>
+	<td class="dottedLineCentered" colspan="4">&nbsp;</td>
+</tr>
+<tr>
+	<td class="total" width="30">Total </td><td>
+		<asp:ImageButton ID="btnTotal" runat="server" AlternateText="Calculate total" CausesValidation="false"
+			ImageUrl="~/Comm_Images/button-calculate.gif" OnClick="BtnTotal_Click" EnableViewState="false" /></td>
+	<td align="right" class="total">
+		<asp:Literal ID="ltlTotal" runat="server" EnableViewState="false"></asp:Literal></td><td width="30">&nbsp;</td>
+</tr>
+</table>
+</asp:PlaceHolder>
+</asp:Panel>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Controls/ShoppingCartControl.ascx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,98 @@
+using System;
+using System.Collections.Generic;
+using System.Web.UI.WebControls;
+
+using PetShop.ObjectModel;
+
+namespace PetShop.Web
+{
+	public partial class ShoppingCartControl : System.Web.UI.UserControl
+	{
+		protected void Page_PreRender(object sender, EventArgs e)
+		{
+			if (!IsPostBack)
+				BindCart();
+		}
+
+		/// <summary>
+		/// Bind repeater to Cart object in Profile
+		/// </summary>
+		private void BindCart()
+		{
+			ICollection<CartItem> cart = Profile.ShoppingCart.Items;
+
+			if (cart.Count > 0)
+			{
+				repShoppingCart.DataSource = cart;
+				repShoppingCart.DataBind();
+
+				PrintTotal();
+
+				plhTotal.Visible = true;
+			}
+			else
+			{
+				repShoppingCart.Visible = false;
+				plhTotal.       Visible = false;
+				lblMsg.         Text    = "Your cart is empty.";
+			}
+		}
+
+		/// <summary>
+		/// Recalculate the total
+		/// </summary>
+		private void PrintTotal()
+		{
+			if (Profile.ShoppingCart.Items.Count > 0)
+				ltlTotal.Text = Profile.ShoppingCart.Total.ToString("c");
+		}
+
+		/// <summary>
+		/// Calculate total
+		/// </summary>
+		protected void BtnTotal_Click(object sender, System.Web.UI.ImageClickEventArgs e)
+		{
+			TextBox     txtQuantity;
+			ImageButton btnDelete;
+			int         qty = 0;
+
+			foreach (RepeaterItem row in repShoppingCart.Items)
+			{
+				txtQuantity = (TextBox)    row.FindControl("txtQuantity");
+				btnDelete   = (ImageButton)row.FindControl("btnDelete");
+
+				if (int.TryParse(WebUtility.InputText(txtQuantity.Text, 10), out qty))
+				{
+					if (qty > 0)
+						Profile.ShoppingCart.SetQuantity(btnDelete.CommandArgument, qty);
+					else if (qty == 0)
+						Profile.ShoppingCart.Remove(btnDelete.CommandArgument);
+				}
+			}
+
+			Profile.Save();
+			BindCart();
+		}
+
+		/// <summary>
+		/// Handler for Delete/Move buttons
+		/// </summary>
+		protected void CartItem_Command(object sender, CommandEventArgs e)
+		{
+			switch (e.CommandName.ToString())
+			{
+				case "Del":
+					Profile.ShoppingCart.Remove(e.CommandArgument.ToString());
+					break;
+
+				case "Move":
+					Profile.ShoppingCart.Remove(e.CommandArgument.ToString());
+					Profile.WishList.Add(e.CommandArgument.ToString());
+					break;
+			}
+
+			Profile.Save();
+			BindCart();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Controls/WishListControl.ascx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,35 @@
+<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WishListControl.ascx.cs" Inherits="PetShop.Web.WishListControl"%>
+<div align="left" class="cartHeader">Items in your Wish List</div>
+<asp:Label runat="server" ID="lblMsg" EnableViewState="false"  CssClass="label" />
+
+<asp:Repeater ID="repWishList" runat="server">
+<HeaderTemplate>
+<table cellspacing="0" cellpadding="3" rules="all" border="0" class="cart" align="center" width="387">
+<tr class="labelLists">
+	<th scope="col">&nbsp;</th>
+	<th scope="col">Name</th>
+	<th align="right" scope="col">Price</th>
+	<th scope="col">&nbsp;</th>
+</tr>
+</HeaderTemplate>
+<ItemTemplate>
+<tr class="listItem">
+	<td>
+		<asp:ImageButton ID="btnDelete" runat="server" AlternateText="Delete" CausesValidation="false"
+			CommandArgument='<%# Eval("ItemId") %>' CommandName="Del" ImageUrl="~/Comm_Images/button-delete.gif"
+			OnCommand="CartItem_Command" ToolTip="Delete" />
+	</td>
+	<td style="width:100%;">
+		<a runat="server" href='<%# string.Format("~/Items.aspx?itemId={0}&productId={1}&categoryId={2}", Eval("ItemId"), Eval("ProductId"), Eval("CategoryId")) %>'><%# string.Format("{0} {1}", Eval("Name"), Eval("Type")) %></a>
+	</td>
+	<td align="right"><%# Eval("Price", "{0:c}")%></td><td>
+		<asp:ImageButton ID="btnToWishList" runat="server" AlternateText="Move to cart" CausesValidation="false"
+			CommandArgument='<%# Eval("ItemId") %>' CommandName="Move" ImageUrl="~/Comm_Images/button-cart.gif"
+			OnCommand="CartItem_Command" ToolTip="Move to cart" />
+	</td>
+</tr>
+</ItemTemplate>
+<FooterTemplate>
+</table>
+</FooterTemplate>
+</asp:Repeater>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Controls/WishListControl.ascx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,60 @@
+using System;
+using System.Collections.Generic;
+using System.Web.UI.WebControls;
+
+using PetShop.ObjectModel;
+
+namespace PetShop.Web
+{
+	public partial class WishListControl : System.Web.UI.UserControl
+	{
+		/// <summary>
+		/// Handle Page load event
+		/// </summary>
+		protected void Page_PreRender(object sender, EventArgs e)
+		{
+			if (!IsPostBack)
+				BindCart();
+		}
+
+		/// <summary>
+		/// Bind repeater to Cart object in Profile
+		/// </summary>
+		private void BindCart()
+		{
+			ICollection<CartItem> wishList = Profile.WishList.Items;
+
+			if (wishList.Count > 0)
+			{
+				repWishList.DataSource = wishList;
+				repWishList.DataBind();
+			}
+			else
+			{
+				repWishList.Visible = false;
+				lblMsg.Text = "Your wish list is empty.";
+			}
+		}
+
+		/// <summary>
+		/// Handler for Delete/Move buttons
+		/// </summary>
+		protected void CartItem_Command(object sender, CommandEventArgs e)
+		{
+			switch (e.CommandName.ToString())
+			{
+				case "Del":
+					Profile.WishList.Remove(e.CommandArgument.ToString());
+					break;
+
+				case "Move":
+					Profile.WishList.Remove(e.CommandArgument.ToString());
+					Profile.ShoppingCart.Add(e.CommandArgument.ToString());
+					break;
+			}
+
+			Profile.Save();
+			BindCart();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Default.aspx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,90 @@
+<%@ Page AutoEventWireup="true" CodeFile="~/Default.aspx.cs" EnableViewState="false" Inherits="PetShop.Web.Default" Language="C#" %>
+<%@ Register Src="Controls/NavigationControl.ascx" TagName="NavigationControl" TagPrefix="PetShopControl" %>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head runat="server">
+    <title>Welcome to .NET Pet Shop</title>
+</head>
+
+<body class="homeBody">
+
+<form runat="server">
+
+<asp:Panel ID="panFocus" runat="server" DefaultButton="btnSearch">
+<table align="center" border="0" cellpadding="0" cellspacing="0" width="780">
+<tr valign="top">
+	<td><img src="Comm_Images/Logo-home.gif" alt="home" /></td>
+	<td class="homeBgSearch" height="25" width="141">
+		<asp:TextBox ID="txtSearch" runat="server" CssClass="homeSearchBox" Width="130px"></asp:TextBox></td>
+	<td class="homeBgSearch" width="50">
+		<asp:ImageButton ID="btnSearch" runat="server" AlternateText="Search" CausesValidation="false"
+			CssClass="paddingSearchicon" ImageUrl="Comm_Images/button-search.gif" OnClick="btnSearch_Click" /></td>
+	<td class="homeBgSearch" width="50">
+		<asp:LoginStatus ID="lgnStatus" runat="server" CssClass="homeLink" LoginText="sign in"
+			LogoutAction="Redirect" LogoutPageUrl="~/Default.aspx" LogoutText="sign out" /></td>
+	<td width="66"></td>
+</tr>
+</table>
+</asp:Panel>
+
+<table align="center" border="0" cellpadding="0" cellspacing="0" width="780">
+<tr>
+	<td width="112"></td>
+	<td bgcolor="#FFFFFF" width="5"></td>
+	<td bgcolor="#FFFFFF" height="5" width="436"></td>
+	<td bgcolor="#FFFFFF" width="5"></td>
+	<td width="224"></td>
+</tr>
+<tr>
+	<td>&nbsp;</td>
+	<td bgcolor="#FFFFFF">&nbsp;</td>
+	<td class="welcome">Welcome to the world of animals</td>
+	<td bgcolor="#FFFFFF">&nbsp;</td>
+	<td>&nbsp;</td>
+</tr>
+<tr>
+	<td colspan="5" height="1"></td>
+</tr>
+<tr>
+	<td width="112"><img height="290" src="Comm_Images/seahorse.gif" width="112" alt="Sea Horse" /></td>
+	<td bgcolor="#FFFFFF" width="5">&nbsp;</td>
+	<td class="bgControl" valign="top" width="436">
+		<table border="0" cellpadding="0" cellspacing="0">
+			<tr>
+				<td class="intro">Explore our wide selection of what could be your future pet.</td>
+			</tr>
+			<tr>
+				<td class="navigationLabel">Our Categories are:</td>
+			</tr>
+			<tr>
+				<td style="padding-left: 20px">
+					<PetShopControl:NavigationControl ID="Categories" runat="server"></PetShopControl:NavigationControl>
+					<p>&nbsp;</p>
+					<br />
+				</td>
+			</tr>
+		</table>
+	</td>
+	<td bgcolor="#FFFFFF" valign="top">&nbsp;</td>
+	<td class="fishPosition" valign="top">
+		<img src="Comm_Images/home-fish.gif" alt="Created by Vertigo Software, Inc." usemap="#vertigosoftware" border="0" />
+	</td>
+</tr>
+<tr>
+	<td>&nbsp;</td>
+	<td>&nbsp;</td>
+	<td class="footerHome">Based on Pet Shop Version 4.0 - Powered by bltoolkit for .NET</td>
+	<td>&nbsp;</td>
+	<td align="center">	<a class="homeLink"  title="Admin entrance" href="Admin/Items.aspx">Off-Limits to Guests</a></td>
+</tr>
+</table>
+
+<map id="vertigosoftware" name="vertigosoftware">
+	<area shape="rect" coords="240,235,140,300" href="http://www.vertigosoftware.com" target="_blank" alt="Vertigo Software" />
+</map>
+</form>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Default.aspx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,16 @@
+using System;
+using System.Web.UI;
+
+namespace PetShop.Web
+{
+	public partial class Default : Page
+	{
+		/// <summary>
+		/// Redirect to Search page
+		/// </summary>
+		protected void btnSearch_Click(object sender, EventArgs e)
+		{
+			WebUtility.SearchRedirect(txtSearch.Text);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Error.aspx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,21 @@
+<%@ Page AutoEventWireup="true" Language="C#" MasterPageFile="~/MasterPage.master" Title="Error" %>
+
+<asp:Content ID="Content1" ContentPlaceHolderID="cphPage" Runat="Server" EnableViewState="false">
+<table border="0" cellpadding="0" cellspacing="0" width="387" align="center">
+<tr>
+	<td class="productName"><p>&nbsp;</p>An error occurred!</td>
+</tr>
+<tr>
+	<td>
+		<p>&nbsp;</p>
+		<p class="label">The system administrator will be checking the web server's event log for details.</p>
+		<p class="label">
+			If you have any concerns about a pending transactions please contact the Microsoft
+			.NET Pet Shop on (555) 555-1234.</p>
+		<p>&nbsp;</p>
+		<p>&nbsp;</p>
+	</td>
+</tr>
+</table>
+
+</asp:Content>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Global.asax	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,45 @@
+<%@ Application Language="C#" %>
+<%@ Import Namespace="System.Diagnostics" %>
+<%@ Import Namespace="System.Web" %>
+<%@ Import Namespace="PetShop.ObjectModel" %>
+
+<script RunAt="server">
+	
+// Carry over profile property values from an anonymous to an authenticated state.
+//
+void Profile_MigrateAnonymous(object sender, ProfileMigrateEventArgs e)
+{
+	ProfileCommon anonProfile = Profile.GetProfile(e.AnonymousID);
+
+	// Merge anonymous shopping cart items to the authenticated shopping cart items.
+	//
+	foreach (CartItem cartItem in anonProfile.ShoppingCart.Items)
+		Profile.ShoppingCart.Add(cartItem);
+
+	// Merge anonymous wishlist items to the authenticated wishlist items.
+	//
+	foreach (CartItem cartItem in anonProfile.WishList.Items)
+		Profile.WishList.Add(cartItem);
+
+	// Clean up anonymous profile.
+	//
+	ProfileManager.DeleteProfile(e.AnonymousID);
+	AnonymousIdentificationModule.ClearAnonymousIdentifier();
+    
+	// Save profile.
+	//
+	Profile.Save();
+}
+
+private static string LOG_SOURCE = ConfigurationManager.AppSettings["Event Log Source"];
+
+// If an exception is thrown in the application then log it to an event log.
+//
+protected void Application_Error(object sender, EventArgs e)
+{
+	Exception x = Server.GetLastError().GetBaseException();
+	
+	EventLog.WriteEntry(LOG_SOURCE, x.ToString(), EventLogEntryType.Error);
+}
+
+</script>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Items.aspx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,6 @@
+<%@ Page AutoEventWireup="true" CodeFile="Items.aspx.cs" Inherits="PetShop.Web.Items" Language="C#" MasterPageFile="~/MasterPage.master" Title="Items" %>
+<%@ Register Src="Controls/ItemsControl.ascx" TagName="ItemsControl" TagPrefix="PetShopControl" %>
+
+<asp:Content ID="cntPage" runat="Server" ContentPlaceHolderID="cphPage" EnableViewState="false">
+	<PetShopControl:ItemsControl runat="server" />
+</asp:Content>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Items.aspx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+using System;
+using System.Web.UI;
+
+using PetShop.BusinessLogic;
+
+namespace PetShop.Web
+{
+	public partial class Items : PageBase
+	{
+		protected void Page_Load(object sender, EventArgs e)
+		{
+			Page.Title = new ProductManager().GetProduct(Request.QueryString["productId"]).Name;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/MasterPage.master	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,133 @@
+<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="PetShop.Web.MasterPage" %>
+<%@ Register Src="Controls/BreadCrumbControl.ascx" TagName="BreadCrumbControl" TagPrefix="PetShopControl" %>
+<%@ Register Src="Controls/NavigationControl.ascx" TagName="NavigationControl" TagPrefix="PetShopControl" %>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" >
+<head runat="server">
+	<title>The .NET Pet Shop</title>
+</head>
+<body>
+
+<form id="form1" runat="server">
+<table align="center" border="0" cellpadding="0" cellspacing="0" width="760">
+<tr>
+<td width="10">&nbsp;</td>
+<td width="410"><a href="Default.aspx"><img border="0" src="Comm_Images/Logo.gif" alt=".NET Pet Shop 4.0" width="287" height="78"></a>
+</td>
+<td width="320">
+	<table width="100%" cellpadding="0" cellspacing="0">
+	<tr>
+		<td class="signIn" width="5"></td>
+		<td class="signIn">
+			<asp:Panel ID="panFocus" runat="server" DefaultButton="btnSearch">
+				<table border="0" cellpadding="0" cellspacing="0">
+				<tr>
+					<td><asp:TextBox ID="txtSearch" Width="115px" runat="server" CssClass="textboxSearch"></asp:TextBox></td>
+					<td align="right">
+						<asp:ImageButton ID="btnSearch" runat="server" AlternateText="Search" CausesValidation="false"
+						ImageUrl="Comm_Images/button-search.gif" OnClick="btnSearch_Click" />
+					</td>
+				</tr>
+				</table>
+			</asp:Panel>
+		</td>
+		<td align="right" class="signIn">
+			<table width="100%">
+			<tr>
+				<td>
+					<asp:LoginView ID="lgnView" runat="server">
+						<LoggedInTemplate><div class="link"><a href="UserProfile.aspx">Profile</a></div></LoggedInTemplate>
+						<AnonymousTemplate><div class="disabledLink">Profile</div></AnonymousTemplate>
+					</asp:LoginView>
+				</td>
+				<td align="right"><asp:LoginStatus ID="lgnStatus" runat="server" CssClass="link" LoginText="sign in" LogoutAction="Refresh" LogoutText="sign out" /></td>
+				<td><img src="Comm_Images/button-checkout.gif" /></td>
+			</tr>
+			</table>
+		</td>
+		<td class="signIn" width="5"></td>
+	</tr>
+	<tr>
+		<td class="checkOut" width="5"></td>
+		<td colspan="2" class="checkOut">
+			<table width="100%">
+			<tr>
+				<td nowrap="nowrap"><a href="ShoppingCart.aspx"><img border="0" src="Comm_Images/button-cart-grey.gif"></a></td>
+				<td nowrap="nowrap"><a class="linkCheckOut" href="ShoppingCart.aspx">check out</a></td>
+				<td nowrap="nowrap" class="CartInfo" width="100%" >&nbsp;</td>
+				<td nowrap="nowrap"><a href="WishList.aspx"><img border="0" src="Comm_Images/button-wishlist-grey.gif"></a></td>
+				<td nowrap="nowrap"><a class="linkCheckOut" href="WishList.aspx">wish list</a></td>
+			</tr>
+			</table>
+		</td>
+		<td class="checkOut" width="5"></td>
+	</tr>
+	</table>
+</td>
+<td width="20">&nbsp;</td>
+</tr> 
+</table>
+
+<table align="center" border="0" cellpadding="0" cellspacing="0" width="760">
+<tr>
+<td colspan="4"><img src="Comm_Images/spacer.gif" height="5" /></td>
+</tr>
+<tr>
+<td width="10">&nbsp;</td>
+<td width="105">&nbsp;</td>
+<td width="625">
+	<table width="100%" cellpadding="0" cellspacing="0">
+	<tr>
+		<td class="bgBreadcrumb"><span class="breadcrumb"><PetShopControl:BreadCrumbControl id="breadCrumb" runat="server" /></td>
+		<td align="right"><asp:LoginName ID="lgnName" runat="server" FormatString="Welcome {0}" SkinID="LoginName" /></td>
+	</tr>
+	</table>
+</td>
+<td width="20">&nbsp;</td>
+</tr>
+<tr>
+<td>&nbsp;</td>
+<td>&nbsp;</td>
+<td class="pageHeader"><asp:Literal ID="ltlHeader" runat="server"></asp:Literal></td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td></td>
+<td></td>
+<td class="dottedLine"></td>
+<td>&nbsp;</td>
+</tr>
+<tr>
+<td valign="top">&nbsp;</td>
+<td valign="top">
+	<PetShopControl:NavigationControl id="Categories" runat="server">
+	</PetShopControl:NavigationControl>
+</td>
+<td bgcolor="#FFFFFF" valign="top">
+	<asp:ContentPlaceHolder ID="cphPage" runat="server">
+	</asp:ContentPlaceHolder>
+</td>
+<td height="250">&nbsp;</td>
+</tr>
+<tr>
+<td>&nbsp;</td>
+<td>&nbsp;</td>
+<td class="footer">
+	<table width="100%">
+	<tr>
+		<td>
+			Based on Pet Shop Version 4.0 - Powered by bltoolkit for .NET</td><td align="right" style="padding-right: 5px">
+			<a href="http://www.vertigosoftware.com" target="_blank"><img alt="Created by Vertigo Software, Inc." border="0" src="Comm_Images/vertigo-icon.gif"/></a>
+		</td>
+	</tr>
+	</table>
+</td>
+<td>&nbsp;</td>
+</tr>
+</table>
+
+</form>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/MasterPage.master.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+using System;
+using System.Web;
+using System.Web.UI.WebControls;
+
+namespace PetShop.Web
+{
+	public partial class MasterPage : System.Web.UI.MasterPage
+	{
+		protected void Page_PreRender(object sender, EventArgs e)
+		{
+			ltlHeader.Text = Page.Header.Title;
+			Page.Header.Title = string.Format(".NET Pet Shop :: {0}", Page.Header.Title);
+		}
+
+		protected void btnSearch_Click(object sender, EventArgs e)
+		{
+			WebUtility.SearchRedirect(txtSearch.Text);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/NewUser.aspx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,91 @@
+<%@ Page AutoEventWireup="true" Language="C#" MasterPageFile="~/MasterPage.master" Title="New User" %>
+
+<asp:Content ID="cntPage" ContentPlaceHolderID="cphPage" Runat="Server" EnableViewState="false">
+<div align="center" class="signinPosition">
+<asp:CreateUserWizard ID="CreateUserWizard" runat="server"
+	CreateUserButtonText                  = "Sign Up"
+	InvalidPasswordErrorMessage           = "Please enter a more secure password."
+	PasswordRegularExpressionErrorMessage = "Please enter a more secure password."
+	RequireEmail                          = "False"
+	SkinID                                = "NewUser">
+
+<WizardSteps>
+	<asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server">
+		<CustomNavigationTemplate>
+		</CustomNavigationTemplate>
+
+		<ContentTemplate>
+		<asp:Panel ID="panFocus" runat="server" DefaultButton="StepNextButton">
+			<table border="0" width="387">
+				<tr><td align="left" class="signinHeader" colspan="2">Sign Up for Your New Account</td></tr>
+				<tr>
+					<td align="left">
+						<label for="UserName">
+							User Name:</label></td><td>
+								<asp:TextBox ID="UserName" runat="server" CssClass="signinTextbox" Width="155px"></asp:TextBox>
+								<asp:RequiredFieldValidator ID="UserNameRequired" runat="server" ControlToValidate="UserName"
+									ErrorMessage="User Name is required." ToolTip="User Name is required." ValidationGroup="CreateUserWizard">*</asp:RequiredFieldValidator>
+					</td>
+				</tr>
+				<tr>
+					<td align="left">
+						<label for="Password">
+							Password:</label></td><td>
+								<asp:TextBox ID="Password" runat="server" CssClass="signinTextbox" TextMode="Password"
+									Width="155px"></asp:TextBox>
+								<asp:RequiredFieldValidator ID="PasswordRequired" runat="server" ControlToValidate="Password"
+									ErrorMessage="Password is required." ToolTip="Password is required." ValidationGroup="CreateUserWizard">*</asp:RequiredFieldValidator>
+					</td>
+				</tr>
+				<tr>
+					<td align="left">
+						<label for="ConfirmPassword">
+							Confirm Password:</label></td><td>
+								<asp:TextBox ID="ConfirmPassword" runat="server" CssClass="signinTextbox" TextMode="Password"
+									Width="155px"></asp:TextBox>
+								<asp:RequiredFieldValidator ID="ConfirmPasswordRequired" runat="server" ControlToValidate="ConfirmPassword"
+									ErrorMessage="Confirm Password is required." ToolTip="Confirm Password is required."
+									ValidationGroup="CreateUserWizard">*</asp:RequiredFieldValidator>
+					</td>
+				</tr>
+
+				<tr>
+					<td align="center" colspan="2">
+						<asp:CompareValidator ID="PasswordCompare" runat="server" ControlToCompare="Password"
+							ControlToValidate="ConfirmPassword" Display="Dynamic" ErrorMessage="The Password and Confirmation Password must match."
+							ValidationGroup="CreateUserWizard"></asp:CompareValidator>
+					</td>
+				</tr>
+				<tr>
+					<td align="center" colspan="2" style="color: red">
+						<asp:Literal ID="ErrorMessage" runat="server" EnableViewState="False" />
+					</td>
+				</tr>
+			</table>
+			<table border="0" cellspacing="5" width="387">
+				<tr align="right">
+					<td align="right">
+						<asp:Button ID="StepNextButton" runat="server" CommandName="MoveNext" CssClass="signinButton"
+							Text="Sign Up" ValidationGroup="CreateUserWizard" />
+					</td>
+					<td>&nbsp;</td>
+				</tr>
+			</table>
+		</asp:Panel>
+		</ContentTemplate>
+	</asp:CreateUserWizardStep>
+	<asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server">
+		<ContentTemplate>
+			<p class="signinLabel"><br /><b>Thank you for signing up.</b></p>
+			<p class="signinLabel">Your account has been created. Now you can:</p>
+			<p class="signinLabel"><a class="signinNewUser" href="Default.aspx">Continue shopping</a></p>
+			<p class="signinLabel"><a class="signinNewUser" href="CheckOut.aspx">Check out</a></p>
+			<p class="signinLabel"><a class="signinNewUser" href="UserProfile.aspx">Update your profile</a></p>
+			<p>&nbsp;</p>
+		</ContentTemplate>
+	</asp:CompleteWizardStep>
+</WizardSteps>
+</asp:CreateUserWizard>
+</div>
+</asp:Content>
+
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/icon-cat.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/icon-crab.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/icon-goose.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/icon-raccoon.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/icon-sheep.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/icon-skunk.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/icon-zebra.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/item-cat-patterned.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/item-cat-transparent.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/item-cat-uncolored.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/item-crab-dotted.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/item-crab-orange.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/item-crab-red.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/item-goose-feathered.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/item-goose-plucked.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/item-raccoon-hairy-tongue.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/item-raccoon-long-tongue.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/item-raccoon-rough-tongue.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/item-sheep-fuzzy.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/item-sheep-ironed.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/item-skunk-bad-smell.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/item-skunk-really-bad-smell.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/item-skunk-worst-smell.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/item-zebra-large.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/item-zebra-medium.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/item-zebra-small.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Backyard/item-zebra-tiny.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Birds/icon-Duck.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Birds/icon-Owl.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Birds/icon-Pelican.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Birds/icon-Penguin.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Birds/icon-Pteranodon.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Birds/item-duck-domestic.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Birds/item-duck-wild.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Birds/item-owl-day.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Birds/item-owl-night.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Birds/item-pelican-flowerloving.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Birds/item-pelican-grassloving.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Birds/item-penguine-adventurous.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Birds/item-penguine-homey.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Birds/item-pteranodon-ancient.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Birds/item-pteranodon-old.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Bugs/icon-ant.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Bugs/icon-butterfly.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Bugs/icon-dragonfly.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Bugs/icon-frog.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Bugs/icon-slug.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Bugs/icon-spider.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Bugs/item-ant-queen.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Bugs/item-ant-soldier.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Bugs/item-ant-worker.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Bugs/item-butterfly-adult.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Bugs/item-butterfly-larva.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Bugs/item-butterfly-pupa.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Bugs/item-dragonfly-omnivore.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Bugs/item-dragonfly-vegan.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Bugs/item-dragonfly-vegetarian.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Bugs/item-frog-false.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Bugs/item-frog-true.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Bugs/item-slug-habitat.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Bugs/item-slug-naked.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Bugs/item-spider-Aranielladisplicata.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Bugs/item-spider-Dysderacrocata.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Endangered/icon-dino.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Endangered/icon-fish.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Endangered/icon-panda.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Endangered/icon-pet.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Endangered/icon-skeleton.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Endangered/item-dino-pointy.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Endangered/item-dino-shaved.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Endangered/item-dino-spiky.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Endangered/item-fish-caught.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Endangered/item-fish-drunk.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Endangered/item-fish-lost.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Endangered/item-panda-exclusive.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Endangered/item-pet-kitty.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Endangered/item-pet-rover.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Endangered/item-pet-thumper.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Endangered/item-skeleton-aphrodite.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Endangered/item-skeleton-female.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Endangered/item-skeleton-hermaphrodite.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Endangered/item-skeleton-male.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/icon-Ballonfish.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/icon-Blindfish.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/icon-crabfish.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/icon-eucalyptus.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/icon-meno.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/icon-misterno.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/icon-nosyfish.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/icon-toothferry.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/item-MisterNo-black.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/item-MisterNo-sable.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/item-MisterNo-sepia.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/item-balloon-extra-stretch.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/item-balloon-flammable.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/item-balloon-natural.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/item-blindfish-blind.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/item-blindfish-farsighted.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/item-blindfish-shortsighted.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/item-crabfish-ballet.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/item-crabfish-ballroom.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/item-crabfish-tabdance.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/item-eucalyptus-longarms.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/item-eucalyptus-shortarms.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/item-meno-camouflage.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/item-meno-happy.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/item-meno-worried.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/item-nosyfish-beastly.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/item-nosyfish-invidious.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/item-nosyfish-mean.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/item-nosyfish-sneaky.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/item-toothferry-toothless.gif has changed
Binary file Demo/Asp.Net/Web/Prod_Images/Fish/item-toothferry-withteeth.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Products.aspx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,6 @@
+<%@ Page AutoEventWireup="true" Language="C#" MasterPageFile="~/MasterPage.master" Title="Products" Inherits="PetShop.Web.Products" CodeFile="~/Products.aspx.cs" %>
+<%@ Register Src="Controls/ProductsControl.ascx" TagName="ProductsControl" TagPrefix="PetShopControl" %>
+
+<asp:Content ID="cntPage" ContentPlaceHolderID="cphPage" runat="Server" EnableViewState="false">
+	<PetShopControl:ProductsControl runat="server" />
+</asp:Content>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Products.aspx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+using System;
+using System.Web.UI;
+
+using PetShop.BusinessLogic;
+
+namespace PetShop.Web
+{
+	public partial class Products : Page
+	{
+		protected void Page_Load(object sender, EventArgs e)
+		{
+			Page.Title = new ProductManager().GetCategory(Request.QueryString["categoryId"]).Name;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Search.aspx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,7 @@
+<%@ Page AutoEventWireup="true" Language="C#" MasterPageFile="~/MasterPage.master" Title="Search" %>
+<%@ Register Src="Controls/SearchControl.ascx" TagName="SearchControl" TagPrefix="uc1" %>
+<%@ Register TagPrefix="PetShopControl" Namespace="PetShop.Web" %> 
+
+<asp:Content ID="cntPage" ContentPlaceHolderID="cphPage" runat="Server" EnableViewState="false">   
+	<uc1:SearchControl runat="server" />
+</asp:Content>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/ShoppingCart.aspx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,21 @@
+<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="ShoppingCart.aspx.cs" Inherits="ShoppingCart" Title="Shopping Cart" %>
+<%@ Register Src="Controls/ShoppingCartControl.ascx" TagName="ShoppingCartControl" TagPrefix="PetShopControl" %>
+
+<asp:Content ID="Content1" ContentPlaceHolderID="cphPage" Runat="Server">
+<div align="center" class="cartPosition">   
+<PetShopControl:shoppingcartcontrol id="ShoppingCartControl1" runat="server" />
+<table border="0" cellpadding="0" cellspacing="0" align="center" width="387">
+<tr><td class="linkCheckOut" colspan="2">&nbsp;</td></tr>
+<tr>
+	<td nowrap="nowrap" align="right" width="100%"><a href="javascript:history.back();"><img border="0" src="Comm_Images/button-home.gif"></a></td>
+	<td align="left" nowrap="nowrap"><a class="linkCheckOut" href="javascript:history.back();">Continue Shopping</a></td>
+</tr>
+<tr><td class="linkCheckOut" colspan="2">&nbsp;</td></tr>
+<tr>
+	<td align="right" nowrap="nowrap"><a href="CheckOut.aspx"><img border="0" src="Comm_Images/button-checkout.gif"></a></td>
+	<td nowrap="nowrap" align="left"><a class="linkCheckOut" href="CheckOut.aspx">Check Out</a></td>
+</tr>
+</table>
+</div>
+</asp:Content>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/ShoppingCart.aspx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,22 @@
+using System;
+
+public partial class ShoppingCart : System.Web.UI.Page
+{
+	protected void Page_PreInit(object sender, EventArgs e)
+	{
+		if (!IsPostBack)
+		{
+			string itemId = Request.QueryString["addItem"];
+
+			if (!string.IsNullOrEmpty(itemId))
+			{
+				Profile.ShoppingCart.Add(itemId);
+				Profile.Save();
+
+				// Redirect to prevent duplictations in the cart if user hits "Refresh"
+				//
+				Response.Redirect("~/ShoppingCart.aspx", true);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/SignIn.aspx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,61 @@
+<%@ Page AutoEventWireup="true" Language="C#" MasterPageFile="~/MasterPage.master" Title="Sign In" %>
+<asp:Content ID="cntPage" runat="Server" ContentPlaceHolderID="cphPage">
+<div align="center" class="signinPosition">
+<asp:Login ID="Login" runat="server" CreateUserUrl="~/NewUser.aspx" SkinID="Login" FailureText="Login failed. Please try again.">
+<LayoutTemplate>
+<table border="0" align="center" width="387">
+<tr>
+<td>
+<asp:Panel ID="panFocus" runat="server" DefaultButton="LoginButton">
+<table border="0" cellpadding="0">
+	<tr><td align="left" class="signinHeader" colspan="2">Please Sign In</td></tr>
+	<tr>
+		<td align="left" class="signinLabel">
+			<asp:Label ID="UserNameLabel" runat="server" AssociatedControlID="UserName">User Name:</asp:Label></td>
+		<td>
+			<asp:TextBox ID="UserName" runat="server" CssClass="signinTextbox" Width="155px"></asp:TextBox>
+			<asp:RequiredFieldValidator ID="UserNameRequired" runat="server" ControlToValidate="UserName"
+				ErrorMessage="User Name is required." ToolTip="User Name is required." ValidationGroup="Login">*</asp:RequiredFieldValidator>
+		</td>
+	</tr>
+	<tr>
+		<td align="left" class="signinLabel">
+			<asp:Label ID="PasswordLabel" runat="server" AssociatedControlID="Password">Password:</asp:Label></td>
+		<td>
+			<asp:TextBox ID="Password" runat="server" CssClass="signinTextbox" TextMode="Password"
+				Width="155px"></asp:TextBox>
+			<asp:RequiredFieldValidator ID="PasswordRequired" runat="server" ControlToValidate="Password"
+				ErrorMessage="Password is required." ToolTip="Password is required." ValidationGroup="Login">*</asp:RequiredFieldValidator>
+		</td>
+	</tr>
+	<tr>
+		<td align="left" colspan="2" style="color: red">
+			<asp:Literal ID="FailureText" runat="server" EnableViewState="False"></asp:Literal>&nbsp;
+		</td>
+	</tr>
+	<tr>
+		<td align="right" colspan="2">
+			<asp:Button ID="LoginButton" runat="server" CommandName="Login" CssClass="signinButton"
+				ForeColor="White" Text="Sign In" ValidationGroup="Login" />
+		</td>
+	</tr>
+	<tr>
+		<td align="left" colspan="2" style="height: 50px">
+			<asp:CheckBox ID="RememberMe" runat="server" Text="Remember me next time." />
+		</td>
+	</tr>
+	<tr>
+		<td align="left" class="linkNewUser" colspan="2">
+			<asp:HyperLink ID="CreateUserLink" runat="server" NavigateUrl="~/NewUser.aspx">Not registered yet?</asp:HyperLink>
+		</td>
+	</tr>
+</table>
+</asp:Panel>
+</td>
+</tr>
+</table>
+</LayoutTemplate>
+</asp:Login>
+</div>
+</asp:Content>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/UserProfile.aspx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,26 @@
+<%@ Page AutoEventWireup="true" CodeFile="UserProfile.aspx.cs" Inherits="PetShop.Web.UserProfile" Language="C#" MasterPageFile="~/MasterPage.master" Title="User Profile" %>
+<%@ Register Src="Controls/AddressForm.ascx" TagName="AddressForm" TagPrefix="PetShopControl" %>
+
+<asp:Content ID="cntPage" ContentPlaceHolderID="cphPage" Runat="Server" EnableViewState="false">
+<div align="center" class="profilePosition">
+<table border="0" cellpadding="0" cellspacing="0" class="formContent" width="380">
+<tr>
+<td>
+	<div class="checkoutHeaders" align="left">Billing Information</div>
+	<div class="info">
+		User Name:
+		<asp:LoginName ID="LoginName" runat="server" />
+		<br />
+	</div>
+	<asp:Panel ID="panFocus" runat="server" DefaultButton="btnSubmit">
+	<PetShopControl:AddressForm ID="AddressForm" runat="server" />
+	<asp:Label ID="lblMessage" runat="server" cssclass="label"></asp:Label>
+	<div align="right" class="checkoutButtonBg">
+		<asp:LinkButton ID="btnSubmit" runat="server" CssClass="submit" OnClick="btnSubmit_Click" Text="Update"></asp:LinkButton>
+	</div>
+	</asp:Panel>
+</td>
+</tr>
+</table>
+</div>
+</asp:Content>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/UserProfile.aspx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,26 @@
+using System;
+
+namespace PetShop.Web
+{
+	public partial class UserProfile : System.Web.UI.Page
+	{
+		protected void Page_Load(object sender, EventArgs e)
+		{
+			if (!IsPostBack)
+				BindUser();
+		}
+
+		protected void btnSubmit_Click(object sender, EventArgs e)
+		{
+			Profile.AccountInfo = AddressForm.Address;
+			Profile.Save();
+
+			lblMessage.Text = "Your profile information has been successfully updated.<br>&nbsp;";
+		}
+
+		private void BindUser()
+		{
+			AddressForm.Address = Profile.AccountInfo;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/Web.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,73 @@
+<?xml version="1.0"?>
+<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
+	<connectionStrings>
+		<add name="ProductDB"    connectionString="server=.;database=MSPetShop4;Integrated Security=True;"         providerName="System.Data.SqlClient"/>
+		<add name="OrderDB"      connectionString="server=.;database=MSPetShop4Orders;Integrated Security=True;"   providerName="System.Data.SqlClient"/>
+		<add name="InventoryDB"  connectionString="server=.;database=MSPetShop4;Integrated Security=True;"         providerName="System.Data.SqlClient"/>
+		<add name="ProfileDB"    connectionString="server=.;database=MSPetShop4Profile;Integrated Security=True;"  providerName="System.Data.SqlClient"/>
+		<add name="MembershipDB" connectionString="server=.;database=MSPetShop4Services;Integrated Security=True;" providerName="System.Data.SqlClient"/>
+	</connectionStrings>
+	<system.web>
+		<pages theme="PetShop" styleSheetTheme="PetShop" controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID">
+			<controls>
+				<add tagPrefix="blt" namespace="BLToolkit.Web.UI" assembly="BLToolkit.4"/>
+			</controls>
+		</pages>
+		<!--
+			Set compilation debug="true" to insert debugging 
+			symbols into the compiled page. Because this 
+			affects performance, set this value to true only 
+			during development.
+		-->
+		<compilation debug="true" targetFramework="4.0">
+			<assemblies>
+				<add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
+			</assemblies>
+		</compilation>
+		<!--
+			The <authentication> section enables configuration 
+			of the security authentication mode used by 
+			ASP.NET to identify an incoming user. 
+		 -->
+		<authentication mode="Forms">
+			<forms name="PetShopAuth" loginUrl="SignIn.aspx" protection="None" timeout="60"/>
+		</authentication>
+		<!--
+			The <customErrors> section enables configuration 
+			of what to do if/when an unhandled error occurs 
+			during the execution of a request. Specifically, 
+			it enables developers to configure html error pages 
+			to be displayed in place of a error stack trace.
+		-->
+		<customErrors defaultRedirect="Error.aspx" mode="RemoteOnly"/>
+		<sessionState mode="Off"/>
+		<anonymousIdentification enabled="true"/>
+		<profile automaticSaveEnabled="false" defaultProvider="ShoppingCartProvider">
+			<providers>
+				<add name="ShoppingCartProvider" connectionStringName="ProfileDB" type="PetShop.BusinessLogic.ProfileProvider" applicationName=".NET Pet Shop 4.0"/>
+				<add name="WishListProvider"     connectionStringName="ProfileDB" type="PetShop.BusinessLogic.ProfileProvider" applicationName=".NET Pet Shop 4.0"/>
+				<add name="AccountInfoProvider"  connectionStringName="ProfileDB" type="PetShop.BusinessLogic.ProfileProvider" applicationName=".NET Pet Shop 4.0"/>
+			</providers>
+			<properties>
+				<add name="ShoppingCart" type="PetShop.BusinessLogic.Cart"  allowAnonymous="true"  provider="ShoppingCartProvider"/>
+				<add name="WishList"     type="PetShop.BusinessLogic.Cart"  allowAnonymous="true"  provider="WishListProvider"/>
+				<add name="AccountInfo"  type="PetShop.ObjectModel.Address" allowAnonymous="false" provider="AccountInfoProvider"/>
+			</properties>
+		</profile>
+		<!-- Membership Provider for SqlServer -->
+		<membership defaultProvider="SQLMembershipProvider">
+			<providers>
+				<add name="SQLMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="MembershipDB" applicationName=".NET Pet Shop 4.0" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Hashed"/>
+			</providers>
+		</membership>
+		<caching>
+			<sqlCacheDependency enabled="true" pollTime="10000">
+				<databases>
+					<add name="MSPetShop4" connectionStringName="SQLConnString1" pollTime="10000"/>
+				</databases>
+			</sqlCacheDependency>
+		</caching>
+	</system.web>
+	<location path="UserProfile.aspx"><system.web><authorization><deny users="?"/></authorization></system.web></location>
+	<location path="CheckOut.aspx"><system.web><authorization><deny users="?"/></authorization></system.web></location>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/WishList.aspx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,21 @@
+<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="WishList.aspx.cs" Inherits="WishList" Title="Wish List" %>
+
+<%@ Register Src="Controls/WishListControl.ascx" TagName="WishListControl" TagPrefix="PetShopControl" %>
+<asp:Content ID="Content1" ContentPlaceHolderID="cphPage" Runat="Server">
+<div align="center" class="cartPosition">
+<PetShopControl:wishlistcontrol id="WishListControl1" runat="server"></PetShopControl:wishlistcontrol>
+<table border="0" cellpadding="0" cellspacing="0" align="center" width="387">
+	<tr><td class="linkCheckOut" colspan="2">&nbsp;</td></tr>
+	<tr>
+		<td nowrap="nowrap" align="right" width="100%"><a href="javascript:history.back();"><img border="0" src="Comm_Images/button-home.gif"></a></td>
+		<td align="left" nowrap="nowrap"><a class="linkCheckOut" href="javascript:history.back();">Continue Shopping</a></td>
+	</tr>
+	<tr><td class="linkCheckOut" colspan="2">&nbsp;</td></tr>
+	<tr>
+		<td align="right" nowrap="nowrap"><a href="CheckOut.aspx"><img border="0" src="Comm_Images/button-checkout.gif"></a></td>
+		<td nowrap="nowrap" align="left"><a class="linkCheckOut" href="CheckOut.aspx">Check Out</a></td>
+	</tr>
+</table>
+</div>
+</asp:Content>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Asp.Net/Web/WishList.aspx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,22 @@
+using System;
+
+public partial class WishList : System.Web.UI.Page
+{
+	protected void Page_PreInit(object sender, EventArgs e)
+	{
+		if (!IsPostBack)
+		{
+			string itemId = Request.QueryString["addItem"];
+
+			if (!string.IsNullOrEmpty(itemId))
+			{
+				Profile.WishList.Add(itemId);
+				Profile.Save();
+
+				// Redirect to prevent duplictations in the wish list if user hits "Refresh"
+				//
+				Response.Redirect("~/WishList.aspx", true);
+			}
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Linq/Demo/App.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<configuration>
+	<connectionStrings>
+		<add name="Northwind" connectionString="Data Source=.;Database=Northwind;Integrated Security=SSPI" providerName="System.Data.SqlClient"/>
+	</connectionStrings>
+	<startup>
+		<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
+	</startup>
+</configuration>
Binary file Demo/Linq/Demo/BLToolkit/BLToolkit.3.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Linq/Demo/DataModel/BLToolkit.ttinclude	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,495 @@
+<#@ assembly name="System.Core"      #>
+<#@ assembly name="System.Data"      #>
+<#@ import namespace="System.Collections.Generic" #>
+<#@ import namespace="System.Data"   #>
+<#@ import namespace="System.Linq"   #>
+<#
+	AppDomain.CurrentDomain.AssemblyResolve += (_,args) =>
+	{
+		if (DataProviderAssembly != null)
+			return System.Reflection.Assembly.LoadFile(DataProviderAssembly);
+		else
+			return null;
+	};
+#><#+
+
+static Action<GeneratedTextTransformation,string> WriteComment        = (tt,s) => tt.WriteLine("//{0}", s);
+static Action<GeneratedTextTransformation,string> WriteUsing          = (tt,s) => tt.WriteLine("using {0};", s);
+static Action<GeneratedTextTransformation,string> WriteBeginNamespace = (tt,s) => { tt.WriteLine("namespace {0}", s); tt.WriteLine("{"); };
+static Action<GeneratedTextTransformation>        WriteEndNamespace   =  tt    => tt.WriteLine("}");
+static Action<GeneratedTextTransformation,string,string> WriteBeginClass = (tt,cl,bc) =>
+{
+	tt.Write("public partial class {0}", cl);
+	if (!string.IsNullOrEmpty(bc))
+		tt.Write(" : {0}", bc);
+	tt.WriteLine("");
+	tt.WriteLine("{");
+};
+static Action<GeneratedTextTransformation>        WriteEndClass       =  tt   => tt.WriteLine("}");
+static Func<string,string,string>                 MakeGenericType     = (c,t) => string.Format("{0}<{1}>", c, t);
+static Func<string,string>                        MakeType            = t     => t;
+static Action<GeneratedTextTransformation,string,int> WriteTableProperty = (tt,name,maxlen) =>
+{
+	tt.WriteLine("public Table<{0}>{1} {0}{1} {{ get {{ return GetTable<{0}>();{1} }} }}", name, tt.LenDiff(maxlen, name));
+};
+static Action<GeneratedTextTransformation,string> WriteAttribute      = (tt,a) => tt.Write("[{0}]", a);
+static Action<GeneratedTextTransformation>        WriteAttributeLine  =  tt    => tt.WriteLine("");
+
+string ConnectionString;
+string ConnectionType;
+string DataProviderAssembly = null;
+
+string DatabaseName             = null;
+string DataContextName          = "DataContext";
+string Namespace                = "DataModel";
+string BaseDataContextClass     = "DbManager";
+string BaseEntityClass          = null;
+string OneToManyAssociationType = "IEnumerable<{0}>";
+
+bool   RenderField = false;
+
+bool   IsMetadataLoaded;
+
+int MaxColumnTypeLen;
+int MaxColumnMemberLen;
+
+static Action<GeneratedTextTransformation,Column,int[],string[]> RenderColumn = (tt,c,maxLens,attrs) =>
+{
+	if (maxLens.Sum() > 0)
+	{
+		if (attrs.Any(_ => _ != null))
+		{
+			tt.Write("[");
+
+			for (var i = 0; i < attrs.Length; i++)
+			{
+				if (attrs[i] != null)
+				{
+					tt.Write(attrs[i]);
+					tt.WriteSpace(maxLens[i] - attrs[i].Length);
+
+					if (attrs.Skip(i + 1).Any(_ => _ != null))
+						tt.Write(", ");
+					else if (maxLens.Skip(i + 1).Any(_ => _ > 0))
+						tt.WriteSpace(2);
+				}
+				else if (maxLens[i] > 0)
+				{
+					tt.WriteSpace(maxLens[i]);
+					
+					if (maxLens.Skip(i + 1).Any(_ => _ > 0))
+						tt.WriteSpace(2);
+				}
+			}
+
+			tt.Write("] ");
+		}
+		else
+		{
+			tt.WriteSpace(maxLens.Sum() + (maxLens.Where(_ => _ > 0).Count() - 1) * 2 + 3);
+		}
+	}
+
+	tt.Write("public {0}{1} {2}", c.Type, tt.LenDiff(tt.MaxColumnTypeLen, c.Type), c.MemberName);
+
+	if (tt.RenderField)
+		tt.WriteLine(";");
+	else
+		tt.WriteLine("{0} {{ get; set; }}", tt.LenDiff(tt.MaxColumnMemberLen, c.MemberName));
+};
+
+static Action<GeneratedTextTransformation,ForeignKey> RenderForeignKey = (tt,key) =>
+{
+	WriteComment(tt, " " + key.KeyName);
+	tt.WriteLine("[Association(ThisKey=\"{0}\", OtherKey=\"{1}\")]",
+		string.Join(", ", (from c in key.ThisColumns  select c.MemberName).ToArray()),
+		string.Join(", ", (from c in key.OtherColumns select c.MemberName).ToArray()));
+
+	tt.Write("public ");
+
+	if (key.AssociationType == AssociationType.OneToMany)
+		tt.Write(tt.OneToManyAssociationType, key.OtherTable.ClassName);
+	else
+		tt.Write(key.OtherTable.ClassName);
+
+	tt.Write(" ");
+	tt.Write(key.MemberName);
+
+	if (tt.RenderField)
+		tt.WriteLine(";");
+	else
+		tt.WriteLine(" { get; set; }");
+};
+
+static Action<GeneratedTextTransformation,Table> RenderTable = (tt,t) =>
+{
+	RenderTableAttributes(tt, t);
+
+	WriteBeginClass(tt, t.ClassName, t.BaseClassName);
+	
+	tt.PushIndent("\t");
+
+	tt.MaxColumnTypeLen   = t.Columns.Values.Max(_ => _.Type.Length);
+	tt.MaxColumnMemberLen = t.Columns.Values.Max(_ => _.MemberName.Length);
+
+	var maxLens = new int[]
+	{
+		t.Columns.Values.Max(_ => _.MemberName == _.ColumnName ? 0 : "MapField('')".Length + _.ColumnName.Length),
+		t.Columns.Values.Max(_ => _.IsNullable                 ? "Nullable".Length : _.IsIdentity ? "Identity".Length : 0),
+		t.Columns.Values.Max(_ => _.IsIdentity && _.IsNullable ? "Identity".Length : 0),
+		t.Columns.Values.Max(_ => _.IsPrimaryKey               ? string.Format("PrimaryKey({0})", _.PKIndex).Length : 0),
+		t.Columns.Values.Max(_ => _.Attributes.Count == 0      ? 0 : string.Join(", ", _.Attributes.Distinct().ToArray()).Length),
+	};
+
+	foreach (var c in from c in t.Columns.Values orderby c.ID select c)
+	{
+		var attrs = new string[]
+		{
+			c.MemberName == c.ColumnName ? null : string.Format("MapField(\"{0}\")", c.ColumnName),
+			c.IsNullable                 ? "Nullable" : c.IsIdentity ? "Identity" : null,
+			c.IsIdentity && c.IsNullable ? "Identity" : null,
+			c.IsPrimaryKey               ? string.Format("PrimaryKey({0})", c.PKIndex) : null,
+			c.Attributes.Count == 0      ? null : string.Join(", ", c.Attributes.Distinct().ToArray()),
+		};
+
+		RenderColumn(tt, c, maxLens, attrs);
+	}
+
+	if (t.ForeignKeys.Count > 0)
+	{
+		foreach (var key in t.ForeignKeys.Values)
+		{
+			tt.WriteLine("");
+			RenderForeignKey(tt, key);
+		}
+	}
+
+	tt.PopIndent();
+	WriteEndClass(tt);
+};
+
+static Action<GeneratedTextTransformation,Table> RenderTableAttributes = (tt,t) =>
+{
+	if (t.Attributes.Count > 0)
+	{
+		WriteAttribute(tt, string.Join(", ", t.Attributes.Distinct().ToArray()));
+		WriteAttributeLine(tt);
+	}
+
+	string tbl = "TableName(";
+
+	if (!string.IsNullOrEmpty(tt.DatabaseName))
+		tbl += string.Format("Database=\"{0}\", ", tt.DatabaseName);
+
+	if (!string.IsNullOrEmpty(t.Owner))
+		tbl += string.Format("Owner=\"{0}\", ", t.Owner);
+
+	tbl += string.Format("Name=\"{0}\")", t.TableName);
+
+	WriteAttribute(tt, tbl);
+	WriteAttributeLine(tt);
+};
+
+List<string> Usings = new List<string>()
+{
+	"System",
+	"BLToolkit.Data",
+	"BLToolkit.Data.Linq",
+	"BLToolkit.DataAccess",
+	"BLToolkit.Mapping",
+};
+
+static Action<GeneratedTextTransformation> RenderUsing = tt =>
+{
+	var q =
+		from ns in tt.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(tt, ns);
+
+		tt.WriteLine("");
+	}
+};
+
+Action<GeneratedTextTransformation> BeforeGenerateModel = _ => {};
+Action<GeneratedTextTransformation> AfterGenerateModel  = _ => {};
+
+void GenerateModel()
+{
+	BeforeGenerateModel(this);
+
+	if (ConnectionString != null) ConnectionString = ConnectionString.Trim();
+	if (DataContextName  != null) DataContextName  = DataContextName. Trim();
+
+	if (string.IsNullOrEmpty(ConnectionString)) { Error("ConnectionString cannot be empty."); return; }
+	if (string.IsNullOrEmpty(DataContextName))  { Error("DataContextName cannot be empty.");  return; }
+
+	LoadMetadata();
+
+	WriteComment(this, "---------------------------------------------------------------------------------------------------");
+	WriteComment(this, " <auto-generated>");
+	WriteComment(this, "    This code was generated by BLToolkit template for T4.");
+	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, "---------------------------------------------------------------------------------------------------");
+
+	RenderUsing(this);
+
+	WriteBeginNamespace(this, Namespace);
+	PushIndent("\t");
+
+	WriteBeginClass(this, DataContextName, BaseDataContextClass);
+
+	var tlist  = (from t in Tables.Values orderby t.TableName select t).ToList();
+	var maxlen = tlist.Max(_ => _.ClassName.Length);
+
+	PushIndent("\t");
+
+	foreach (var t in tlist)
+		WriteTableProperty(this, t.ClassName, maxlen);
+
+	PopIndent();
+
+	WriteEndClass(this);
+
+	foreach (var t in tlist)
+	{
+		WriteLine("");
+		RenderTable(this, t);
+	}
+
+	PopIndent();
+	WriteEndNamespace(this);
+
+	AfterGenerateModel(this);
+}
+
+string LenDiff(int max, string str)
+{
+	var s = "";
+
+	while (max-- > str.Length)
+		s += " ";
+
+	return s;
+}
+
+void WriteSpace(int len)
+{
+	while (len-- > 0)
+		Write(" ");
+}
+
+List<T> CreateList<T>(T item)
+{
+	return new List<T>();
+}
+
+System.Data.IDbConnection GetConnection()
+{
+	Type connType = null;
+
+	if (DataProviderAssembly != null)
+	{
+		try
+		{
+			var assembly = System.Reflection.Assembly.LoadFile(DataProviderAssembly);
+			connType = assembly.GetType(ConnectionType);
+		}
+		catch
+		{
+		}
+	}
+
+	if (connType == null)
+		connType = Type.GetType(ConnectionType);
+
+	var conn = (System.Data.IDbConnection)Activator.CreateInstance(connType);
+
+	conn.ConnectionString = ConnectionString;
+	conn.Open();
+
+	return conn;
+}
+
+void LoadMetadata()
+{
+	if (IsMetadataLoaded)
+		return;
+
+	IsMetadataLoaded = true;
+
+	BeforeLoadMetadata(this);
+	LoadServerMetadata();
+
+	foreach (var t in Tables.Values)
+	{
+		if (t.ClassName.Contains(" "))
+		{
+			var ss = t.ClassName.Split(' ').Where(_ => _.Trim().Length > 0).Select(_ => char.ToUpper(_[0]) + _.Substring(1));
+			t.ClassName = string.Join("", ss.ToArray());
+		}
+	}
+
+	foreach (var t in Tables.Values)
+		foreach (var key in t.ForeignKeys.Values.ToList())
+			if (!key.KeyName.EndsWith("_BackReference"))
+				key.OtherTable.ForeignKeys.Add(key.KeyName + "_BackReference", key.BackReference = new ForeignKey
+				{
+					KeyName         = key.KeyName    + "_BackReference",
+					MemberName      = key.MemberName + "_BackReference",
+					AssociationType = AssociationType.Auto,
+					OtherTable      = t,
+					ThisColumns     = key.OtherColumns,
+					OtherColumns    = key.ThisColumns
+				});
+
+	foreach (var t in Tables.Values)
+	{
+		foreach (var key in t.ForeignKeys.Values)
+		{
+			if (key.BackReference != null && key.AssociationType == AssociationType.Auto)
+			{
+				if (key.ThisColumns.All(_ => _.IsPrimaryKey))
+				{
+					if (t.Columns.Values.Count(_ => _.IsPrimaryKey) == key.ThisColumns.Count)
+						key.AssociationType = AssociationType.OneToOne;
+					else
+						key.AssociationType = AssociationType.ManyToOne;
+				}
+				else
+					key.AssociationType = AssociationType.ManyToOne;
+			}
+		}
+	}
+
+	foreach (var t in Tables.Values)
+	{
+		foreach (var key in t.ForeignKeys.Values)
+		{
+			var name = key.MemberName;
+
+			if (key.BackReference != null && key.ThisColumns.Count == 1 && key.ThisColumns[0].MemberName.ToLower().EndsWith("id"))
+			{
+				name = key.ThisColumns[0].MemberName;
+				name = name.Substring(0, name.Length - "id".Length);
+
+				if (!t.ForeignKeys.Values.Select(_ => _.MemberName).Concat(
+					 t.Columns.    Values.Select(_ => _.MemberName)).Concat(
+					 new[] { t.ClassName }).Any(_ => _ == name))
+				{
+					name = key.MemberName;;
+				}
+			}
+			
+			if (name == key.MemberName)
+			{
+				if (name.StartsWith("FK_"))
+					name = name.Substring(3);
+
+				if (name.EndsWith("_BackReference"))
+					name = name.Substring(0, name.Length - "_BackReference".Length);
+
+				name = string.Join("", name.Split('_').Where(_ => _.Length > 0 && _ != t.TableName).ToArray());
+
+				if (key.AssociationType == AssociationType.OneToMany)
+					name += "s";
+			}
+
+			if (name.Length != 0 &&
+				!t.ForeignKeys.Values.Select(_ => _.MemberName).Concat(
+				 t.Columns.    Values.Select(_ => _.MemberName)).Concat(
+				 new[] { t.ClassName }).Any(_ => _ == name))
+			{
+				key.MemberName = name;
+			}
+		}
+	}
+
+	if (Tables.Values.SelectMany(_ => _.ForeignKeys.Values).Any(_ => _.AssociationType == AssociationType.OneToMany))
+		Usings.Add("System.Collections.Generic");
+
+	AfterLoadMetadata(this);
+}
+
+Action<GeneratedTextTransformation> BeforeLoadMetadata = _ => {};
+Action<GeneratedTextTransformation> AfterLoadMetadata  = _ => {};
+
+Dictionary<string,Table> Tables = new Dictionary<string,Table>();
+
+partial class Table
+{
+	public string       Owner;
+	public string       TableName;
+	public string       ClassName;
+	public string       BaseClassName;
+	public bool         IsView;
+	public List<string> Attributes = new List<string>();
+
+	public Dictionary<string,Column>     Columns     = new Dictionary<string,Column>();
+	public Dictionary<string,ForeignKey> ForeignKeys = new Dictionary<string,ForeignKey>();
+}
+
+partial class Column
+{
+	public int          ID;
+	public string       ColumnName;
+	public string       MemberName;
+	public bool         IsNullable;
+	public bool         IsIdentity;
+	public string       Type;
+	public bool         IsClass;
+	public DbType       DbType;
+	public SqlDbType    SqlDbType;
+	public int          PKIndex = -1;
+	public List<string> Attributes = new List<string>();
+
+	public bool IsPrimaryKey { get { return PKIndex >= 0; } }
+}
+
+enum AssociationType
+{
+	Auto,
+	OneToOne,
+	OneToMany,
+	ManyToOne,
+}
+
+partial class ForeignKey
+{
+	public string          KeyName;
+	public string          MemberName;
+	public Table           OtherTable;
+	public List<Column>    ThisColumns  = new List<Column>();
+	public List<Column>    OtherColumns = new List<Column>();
+	public ForeignKey      BackReference;
+
+	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;
+				}
+			}
+		}
+	}
+}
+#>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Linq/Demo/DataModel/MSSQL.ttinclude	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,252 @@
+<#
+	ConnectionType = typeof(System.Data.SqlClient.SqlConnection).AssemblyQualifiedName;
+#><#+
+private void LoadServerMetadata()
+{
+	var tables  = CreateList(new { ID = "", Table  = new Table() });
+	var columns = CreateList(new { ID = "", Column = new Column() });
+
+	using (var conn = GetConnection())
+	using (var cmd  = conn.CreateCommand())
+	{
+		// Load tables & vies.
+		//
+		cmd.CommandText = @"
+			SELECT
+				TABLE_CATALOG + '.' + TABLE_SCHEMA + '.' + TABLE_NAME,
+				TABLE_SCHEMA,
+				TABLE_NAME,
+				TABLE_TYPE
+			FROM
+				INFORMATION_SCHEMA.TABLES s
+					LEFT JOIN sys.tables t ON OBJECT_ID(TABLE_CATALOG + '.' + TABLE_SCHEMA + '.' + TABLE_NAME) = t.object_id
+			WHERE
+				t.object_id IS NULL OR
+				t.is_ms_shipped <> 1 AND
+				(
+					SELECT 
+						major_id 
+					FROM 
+						sys.extended_properties 
+					WHERE
+						major_id = t.object_id and 
+						minor_id = 0           and 
+						class    = 1           and 
+						name     = N'microsoft_database_tools_support'
+				) IS NULL";
+
+		using (var rd = cmd.ExecuteReader())
+		{
+			while (rd.Read())
+			{
+				var t = new
+				{
+					ID    = Convert.ToString(rd[0]),
+					Table = new Table
+					{
+						Owner         = rd[1].ToString(),
+						TableName     = rd[2].ToString(),
+						ClassName     = rd[2].ToString(),
+						IsView        = rd[3].ToString() == "VIEW",
+						BaseClassName = BaseEntityClass,
+					}
+				};
+
+				tables.Add(t);
+			}
+		}
+
+		// Load columns.
+		//
+		cmd.CommandText = @"
+			SELECT
+				(TABLE_CATALOG + '.' + TABLE_SCHEMA + '.' + TABLE_NAME) as id,
+				CASE WHEN IS_NULLABLE = 'YES' THEN 1 ELSE 0 END         as isNullable,
+				ORDINAL_POSITION         as colid,
+				COLUMN_NAME              as name,
+				c.DATA_TYPE              as dataType,
+				CHARACTER_MAXIMUM_LENGTH as length, 
+				ISNULL(NUMERIC_PRECISION, DATETIME_PRECISION) AS prec,
+				NUMERIC_SCALE            as scale,
+				COLUMNPROPERTY(object_id('[' + TABLE_SCHEMA + '].[' + TABLE_NAME + ']'), COLUMN_NAME, 'IsIdentity') as isIdentity
+			FROM
+				INFORMATION_SCHEMA.COLUMNS c";
+
+		using (var rd = cmd.ExecuteReader())
+		{
+			while (rd.Read())
+			{
+				var col = new
+				{
+					ID     = Convert.ToString(rd["id"]),
+					Column = new Column
+					{
+						ID         = Convert.ToInt16  (rd["colid"]),
+						ColumnName = Convert.ToString (rd["name"]),
+						MemberName = Convert.ToString (rd["name"]),
+						IsNullable = Convert.ToBoolean(rd["isNullable"]),
+						IsIdentity = Convert.ToBoolean(rd["isIdentity"]),
+					}
+				};
+
+				var c = col.Column;
+
+				switch (Convert.ToString(rd["dataType"]))
+				{
+					case "image"            : c.Type = "byte[]";         c.DbType = DbType.Binary;         c.SqlDbType = SqlDbType.Image;            break;
+					case "text"             : c.Type = "string";         c.DbType = DbType.String;         c.SqlDbType = SqlDbType.Text;             break;
+					case "binary"           : c.Type = "byte[]";         c.DbType = DbType.Binary;         c.SqlDbType = SqlDbType.Binary;           break;
+					case "tinyint"          : c.Type = "byte";           c.DbType = DbType.Byte;           c.SqlDbType = SqlDbType.TinyInt;          break;
+					case "date"             : c.Type = "DateTime";       c.DbType = DbType.Date;           c.SqlDbType = SqlDbType.Date;             break;
+					case "time"             : c.Type = "DateTime";       c.DbType = DbType.Time;           c.SqlDbType = SqlDbType.Time;             break;
+					case "bit"              : c.Type = "bool";           c.DbType = DbType.Boolean;        c.SqlDbType = SqlDbType.Bit;              break;
+					case "smallint"         : c.Type = "short";          c.DbType = DbType.Int16;          c.SqlDbType = SqlDbType.SmallInt;         break;
+					case "decimal"          : c.Type = "decimal";        c.DbType = DbType.Decimal;        c.SqlDbType = SqlDbType.Decimal;          break;
+					case "int"              : c.Type = "int";            c.DbType = DbType.Int32;          c.SqlDbType = SqlDbType.Int;              break;
+					case "smalldatetime"    : c.Type = "DateTime";       c.DbType = DbType.DateTime;       c.SqlDbType = SqlDbType.SmallDateTime;    break;
+					case "real"             : c.Type = "float";          c.DbType = DbType.Single;         c.SqlDbType = SqlDbType.Real;             break;
+					case "money"            : c.Type = "decimal";        c.DbType = DbType.Currency;       c.SqlDbType = SqlDbType.Money;            break;
+					case "datetime"         : c.Type = "DateTime";       c.DbType = DbType.DateTime;       c.SqlDbType = SqlDbType.DateTime;         break;
+					case "float"            : c.Type = "double";         c.DbType = DbType.Double;         c.SqlDbType = SqlDbType.Float;            break;
+					case "numeric"          : c.Type = "decimal";        c.DbType = DbType.Decimal;        c.SqlDbType = SqlDbType.Decimal;          break;
+					case "smallmoney"       : c.Type = "decimal";        c.DbType = DbType.Currency;       c.SqlDbType = SqlDbType.SmallMoney;       break;
+					case "datetime2"        : c.Type = "DateTime";       c.DbType = DbType.DateTime2;      c.SqlDbType = SqlDbType.DateTime2;        break;
+					case "bigint"           : c.Type = "long";           c.DbType = DbType.Int64;          c.SqlDbType = SqlDbType.BigInt;           break;
+					case "varbinary"        : c.Type = "byte[]";         c.DbType = DbType.Binary;         c.SqlDbType = SqlDbType.VarBinary;        break;
+					case "timestamp"        : c.Type = "byte[]";         c.DbType = DbType.Binary;         c.SqlDbType = SqlDbType.Timestamp;        break;
+					case "sysname"          : c.Type = "string";         c.DbType = DbType.String;         c.SqlDbType = SqlDbType.NVarChar;         break;
+					case "nvarchar"         : c.Type = "string";         c.DbType = DbType.String;         c.SqlDbType = SqlDbType.NVarChar;         break;
+					case "varchar"          : c.Type = "string";         c.DbType = DbType.AnsiString;     c.SqlDbType = SqlDbType.VarChar;          break;
+					case "ntext"            : c.Type = "string";         c.DbType = DbType.String;         c.SqlDbType = SqlDbType.NText;            break;
+					case "uniqueidentifier" : c.Type = "Guid";           c.DbType = DbType.Binary;         c.SqlDbType = SqlDbType.UniqueIdentifier; break;
+					case "datetimeoffset"   : c.Type = "DateTimeOffset"; c.DbType = DbType.DateTimeOffset; c.SqlDbType = SqlDbType.DateTimeOffset;   break;
+					case "sql_variant"      : c.Type = "object";         c.DbType = DbType.Binary;         c.SqlDbType = SqlDbType.Variant;          break;
+					case "xml"              : c.Type = "string";         c.DbType = DbType.Xml;            c.SqlDbType = SqlDbType.Xml;              break;
+
+//hierarchyid
+//geometry
+//geography
+
+					case "char"          :
+						c.Type      = Convert.ToInt32 (rd["length"]) == 1 ? "char" : "string";
+						c.DbType    = DbType.AnsiStringFixedLength;
+						c.SqlDbType = SqlDbType.Char;
+						break;
+
+					case "nchar"         :
+						c.Type      = Convert.ToInt32 (rd["length"]) == 1 ? "char" : "string";
+						c.DbType    = DbType.StringFixedLength;
+						c.SqlDbType = SqlDbType.NChar;
+						break;
+				}
+
+				switch (c.Type)
+				{
+					case "string" :
+					case "byte[]" : c.IsClass = true; break;
+				}
+
+				if (c.IsNullable && !c.IsClass)
+					c.Type += "?";
+
+				columns.Add(col);
+			}
+		}
+
+		// Load PKs.
+		//
+		cmd.CommandText = @"
+			SELECT
+				(k.TABLE_CATALOG + '.' + k.TABLE_SCHEMA + '.' + k.TABLE_NAME) as id,
+				k.CONSTRAINT_NAME                                             as name,
+				k.COLUMN_NAME                                                 as colname,
+				k.ORDINAL_POSITION                                            as colid
+			FROM
+				INFORMATION_SCHEMA.KEY_COLUMN_USAGE k
+					JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS c ON k.CONSTRAINT_NAME = c.CONSTRAINT_NAME
+			WHERE
+				c.CONSTRAINT_TYPE='PRIMARY KEY'";
+
+		using (var rd = cmd.ExecuteReader())
+		{
+			while (rd.Read())
+			{
+				var id      = Convert.ToString(rd["id"]);
+				var colid   = Convert.ToInt32 (rd["colid"]);
+				var colname = Convert.ToString(rd["colname"]);
+
+				columns.Single(_ => _.ID == id && _.Column.ColumnName == colname).Column.PKIndex = colid;
+			}
+		}
+
+		// Load FKs.
+		//
+		cmd.CommandText = @"
+			SELECT
+				rc.CONSTRAINT_NAME  as Name, 
+				fk.TABLE_CATALOG + '.' + fk.TABLE_SCHEMA + '.' + fk.TABLE_NAME as ThisTable,
+				fk.COLUMN_NAME      as ThisColumn,
+				pk.TABLE_CATALOG + '.' + pk.TABLE_SCHEMA + '.' + pk.TABLE_NAME as OtherTable,
+				pk.COLUMN_NAME      as OtherColumn,
+				cu.ORDINAL_POSITION as Ordinal
+			FROM
+				INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
+					JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE fk
+					ON
+						rc.CONSTRAINT_CATALOG        = fk.CONSTRAINT_CATALOG AND
+						rc.CONSTRAINT_NAME           = fk.CONSTRAINT_NAME
+					JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE pk
+					ON
+						rc.UNIQUE_CONSTRAINT_CATALOG = pk.CONSTRAINT_CATALOG AND
+						rc.UNIQUE_CONSTRAINT_NAME    = pk.CONSTRAINT_NAME
+					JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE cu
+					ON
+						rc.CONSTRAINT_NAME = cu.CONSTRAINT_NAME
+			ORDER BY
+				ThisTable,
+				Ordinal";
+
+		using (var rd = cmd.ExecuteReader())
+		{
+			while (rd.Read())
+			{
+				var name            = Convert.ToString(rd["Name"]);
+				var thisTableID     = Convert.ToString(rd["ThisTable"]);
+				var otherTableID    = Convert.ToString(rd["OtherTable"]);
+				var thisColumnName  = Convert.ToString(rd["ThisColumn"]);
+				var otherColumnName = Convert.ToString(rd["OtherColumn"]);
+
+				var thisTable   = (from t in tables  where t.ID == thisTableID  select t.Table).Single();
+				var otherTable  = (from t in tables  where t.ID == otherTableID select t.Table).Single();
+				var thisColumn  = (from c in columns where c.ID == thisTableID  && c.Column.ColumnName == thisColumnName  select c.Column).Single();
+				var otherColumn = (from c in columns where c.ID == otherTableID && c.Column.ColumnName == otherColumnName select c.Column).Single();
+
+				if (thisTable.ForeignKeys.ContainsKey(name) == false)
+					thisTable.ForeignKeys.Add(name, new ForeignKey { KeyName = name, MemberName = name, OtherTable = otherTable });
+
+				var key = thisTable.ForeignKeys[name];
+
+				key.ThisColumns. Add(thisColumn);
+				key.OtherColumns.Add(otherColumn);
+			}
+		}
+	}
+
+	var qc =
+		from c in columns
+		group c by c.ID into gr
+		join t in tables on gr.Key equals t.ID
+		select new { t.Table, gr };
+
+	foreach (var c in qc)
+	{
+		foreach (var col in from col in c.gr orderby col.Column.ID select col.Column)
+			c.Table.Columns.Add(col.ColumnName, col);
+
+		if (c.Table.Owner == "dbo")
+			c.Table.Owner = null;
+
+		Tables.Add(c.Table.TableName, c.Table);
+	}
+}
+#>
\ No newline at end of file
Binary file Demo/Linq/Demo/DataModel/Northwind.sql has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Linq/Demo/DataModel/NorthwindDB.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,21 @@
+using System;
+using BLToolkit.Data.Linq;
+using BLToolkit.Mapping;
+
+namespace Linq.Demo.DataModel
+{
+	partial class NorthwindDB
+	{
+		public Table<DiscontinuedProduct> DiscontinuedProduct { get { return GetTable<DiscontinuedProduct>(); } }
+		public Table<ActiveProduct>       ActiveProduct       { get { return GetTable<ActiveProduct>();       } }
+	}
+
+	[InheritanceMapping(Code="True",  Type=typeof(DiscontinuedProduct))]
+	[InheritanceMapping(Code="False", Type=typeof(ActiveProduct))]
+	abstract partial class Product
+	{
+	}
+
+	public class ActiveProduct       : Product {}
+	public class DiscontinuedProduct : Product {}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Linq/Demo/DataModel/NorthwindDB.generated.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,488 @@
+//---------------------------------------------------------------------------------------------------
+// <auto-generated>
+//    This code was generated by BLToolkit template for T4.
+//    Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
+// </auto-generated>
+//---------------------------------------------------------------------------------------------------
+using System;
+using System.Collections.Generic;
+
+using BLToolkit.Data;
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace Linq.Demo.DataModel
+{
+	public partial class NorthwindDB : DbManager
+	{
+		public Table<AlphabeticalListOfProduct>  AlphabeticalListOfProduct  { get { return GetTable<AlphabeticalListOfProduct>();  } }
+		public Table<Category>                   Category                   { get { return GetTable<Category>();                   } }
+		public Table<CategorySalesFor1997>       CategorySalesFor1997       { get { return GetTable<CategorySalesFor1997>();       } }
+		public Table<CurrentProductList>         CurrentProductList         { get { return GetTable<CurrentProductList>();         } }
+		public Table<CustomerAndSuppliersByCity> CustomerAndSuppliersByCity { get { return GetTable<CustomerAndSuppliersByCity>(); } }
+		public Table<CustomerCustomerDemo>       CustomerCustomerDemo       { get { return GetTable<CustomerCustomerDemo>();       } }
+		public Table<CustomerDemographic>        CustomerDemographic        { get { return GetTable<CustomerDemographic>();        } }
+		public Table<Customer>                   Customer                   { get { return GetTable<Customer>();                   } }
+		public Table<Employee>                   Employee                   { get { return GetTable<Employee>();                   } }
+		public Table<EmployeeTerritory>          EmployeeTerritory          { get { return GetTable<EmployeeTerritory>();          } }
+		public Table<Invoice>                    Invoice                    { get { return GetTable<Invoice>();                    } }
+		public Table<OrderDetail>                OrderDetail                { get { return GetTable<OrderDetail>();                } }
+		public Table<OrderDetailsExtended>       OrderDetailsExtended       { get { return GetTable<OrderDetailsExtended>();       } }
+		public Table<OrderSubtotal>              OrderSubtotal              { get { return GetTable<OrderSubtotal>();              } }
+		public Table<Order>                      Order                      { get { return GetTable<Order>();                      } }
+		public Table<OrdersQry>                  OrdersQry                  { get { return GetTable<OrdersQry>();                  } }
+		public Table<ProductSalesFor1997>        ProductSalesFor1997        { get { return GetTable<ProductSalesFor1997>();        } }
+		public Table<Product>                    Product                    { get { return GetTable<Product>();                    } }
+		public Table<ProductsAboveAveragePrice>  ProductsAboveAveragePrice  { get { return GetTable<ProductsAboveAveragePrice>();  } }
+		public Table<ProductsByCategory>         ProductsByCategory         { get { return GetTable<ProductsByCategory>();         } }
+		public Table<QuarterlyOrder>             QuarterlyOrder             { get { return GetTable<QuarterlyOrder>();             } }
+		public Table<Region>                     Region                     { get { return GetTable<Region>();                     } }
+		public Table<SalesByCategory>            SalesByCategory            { get { return GetTable<SalesByCategory>();            } }
+		public Table<SalesTotalsByAmount>        SalesTotalsByAmount        { get { return GetTable<SalesTotalsByAmount>();        } }
+		public Table<Shipper>                    Shipper                    { get { return GetTable<Shipper>();                    } }
+		public Table<SummaryOfSalesByQuarter>    SummaryOfSalesByQuarter    { get { return GetTable<SummaryOfSalesByQuarter>();    } }
+		public Table<SummaryOfSalesByYear>       SummaryOfSalesByYear       { get { return GetTable<SummaryOfSalesByYear>();       } }
+		public Table<Supplier>                   Supplier                   { get { return GetTable<Supplier>();                   } }
+		public Table<Territory>                  Territory                  { get { return GetTable<Territory>();                  } }
+	}
+
+	[TableName(Name="Alphabetical list of products")]
+	public partial class AlphabeticalListOfProduct
+	{
+		           public int      ProductID       { get; set; }
+		           public string   ProductName     { get; set; }
+		[Nullable] public int?     SupplierID      { get; set; }
+		[Nullable] public int?     CategoryID      { get; set; }
+		[Nullable] public string   QuantityPerUnit { get; set; }
+		[Nullable] public decimal? UnitPrice       { get; set; }
+		[Nullable] public short?   UnitsInStock    { get; set; }
+		[Nullable] public short?   UnitsOnOrder    { get; set; }
+		[Nullable] public short?   ReorderLevel    { get; set; }
+		           public bool     Discontinued    { get; set; }
+		           public string   CategoryName    { get; set; }
+	}
+
+	[TableName(Name="Categories")]
+	public partial class Category
+	{
+		[Identity, PrimaryKey(1)] public int    CategoryID   { get; set; }
+		                          public string CategoryName { get; set; }
+		[Nullable               ] public string Description  { get; set; }
+		[Nullable               ] public byte[] Picture      { get; set; }
+
+		// FK_Products_Categories_BackReference
+		[Association(ThisKey="CategoryID", OtherKey="CategoryID")]
+		public List<Product> Products { get; set; }
+	}
+
+	[TableName(Name="Category Sales for 1997")]
+	public partial class CategorySalesFor1997
+	{
+		           public string   CategoryName  { get; set; }
+		[Nullable] public decimal? CategorySales { get; set; }
+	}
+
+	[TableName(Name="Current Product List")]
+	public partial class CurrentProductList
+	{
+		[Identity] public int    ProductID   { get; set; }
+		           public string ProductName { get; set; }
+	}
+
+	[TableName(Name="Customer and Suppliers by City")]
+	public partial class CustomerAndSuppliersByCity
+	{
+		[Nullable] public string City         { get; set; }
+		           public string CompanyName  { get; set; }
+		[Nullable] public string ContactName  { get; set; }
+		           public string Relationship { get; set; }
+	}
+
+	[TableName(Name="CustomerCustomerDemo")]
+	public partial class CustomerCustomerDemo
+	{
+		[PrimaryKey(1)] public string CustomerID     { get; set; }
+		[PrimaryKey(2)] public string CustomerTypeID { get; set; }
+
+		// FK_CustomerCustomerDemo
+		[Association(ThisKey="CustomerTypeID", OtherKey="CustomerTypeID")]
+		public CustomerDemographic FK_CustomerCustomerDemo { get; set; }
+
+		// FK_CustomerCustomerDemo_Customers
+		[Association(ThisKey="CustomerID", OtherKey="CustomerID")]
+		public Customer Customer { get; set; }
+	}
+
+	[TableName(Name="CustomerDemographics")]
+	public partial class CustomerDemographic
+	{
+		[          PrimaryKey(1)] public string CustomerTypeID { get; set; }
+		[Nullable               ] public string CustomerDesc   { get; set; }
+
+		// FK_CustomerCustomerDemo_BackReference
+		[Association(ThisKey="CustomerTypeID", OtherKey="CustomerTypeID")]
+		public List<CustomerCustomerDemo> CustomerCustomerDemo { get; set; }
+	}
+
+	[TableName(Name="Customers")]
+	public partial class Customer
+	{
+		[          PrimaryKey(1)] public string CustomerID   { get; set; }
+		                          public string CompanyName  { get; set; }
+		[Nullable               ] public string ContactName  { get; set; }
+		[Nullable               ] public string ContactTitle { get; set; }
+		[Nullable               ] public string Address      { get; set; }
+		[Nullable               ] public string City         { get; set; }
+		[Nullable               ] public string Region       { get; set; }
+		[Nullable               ] public string PostalCode   { get; set; }
+		[Nullable               ] public string Country      { get; set; }
+		[Nullable               ] public string Phone        { get; set; }
+		[Nullable               ] public string Fax          { get; set; }
+
+		// FK_Orders_Customers_BackReference
+		[Association(ThisKey="CustomerID", OtherKey="CustomerID")]
+		public List<Order> Orders { get; set; }
+
+		// FK_CustomerCustomerDemo_Customers_BackReference
+		[Association(ThisKey="CustomerID", OtherKey="CustomerID")]
+		public List<CustomerCustomerDemo> CustomerCustomerDemo { get; set; }
+	}
+
+	[TableName(Name="Employees")]
+	public partial class Employee
+	{
+		[Identity, PrimaryKey(1)] public int       EmployeeID      { get; set; }
+		                          public string    LastName        { get; set; }
+		                          public string    FirstName       { get; set; }
+		[Nullable               ] public string    Title           { get; set; }
+		[Nullable               ] public string    TitleOfCourtesy { get; set; }
+		[Nullable               ] public DateTime? BirthDate       { get; set; }
+		[Nullable               ] public DateTime? HireDate        { get; set; }
+		[Nullable               ] public string    Address         { get; set; }
+		[Nullable               ] public string    City            { get; set; }
+		[Nullable               ] public string    Region          { get; set; }
+		[Nullable               ] public string    PostalCode      { get; set; }
+		[Nullable               ] public string    Country         { get; set; }
+		[Nullable               ] public string    HomePhone       { get; set; }
+		[Nullable               ] public string    Extension       { get; set; }
+		[Nullable               ] public byte[]    Photo           { get; set; }
+		[Nullable               ] public string    Notes           { get; set; }
+		[Nullable               ] public int?      ReportsTo       { get; set; }
+		[Nullable               ] public string    PhotoPath       { get; set; }
+
+		// FK_Employees_Employees
+		[Association(ThisKey="ReportsTo", OtherKey="EmployeeID")]
+		public Employee ReportsToEmployee { get; set; }
+
+		// FK_Orders_Employees_BackReference
+		[Association(ThisKey="EmployeeID", OtherKey="EmployeeID")]
+		public List<Order> Orders { get; set; }
+
+		// FK_EmployeeTerritories_Employees_BackReference
+		[Association(ThisKey="EmployeeID", OtherKey="EmployeeID")]
+		public List<EmployeeTerritory> EmployeeTerritories { get; set; }
+
+		// FK_Employees_Employees_BackReference
+		[Association(ThisKey="EmployeeID", OtherKey="ReportsTo")]
+		public List<Employee> Reporters { get; set; }
+	}
+
+	[TableName(Name="EmployeeTerritories")]
+	public partial class EmployeeTerritory
+	{
+		[PrimaryKey(1)] public int    EmployeeID  { get; set; }
+		[PrimaryKey(2)] public string TerritoryID { get; set; }
+
+		// FK_EmployeeTerritories_Employees
+		[Association(ThisKey="EmployeeID", OtherKey="EmployeeID")]
+		public Employee Employee { get; set; }
+
+		// FK_EmployeeTerritories_Territories
+		[Association(ThisKey="TerritoryID", OtherKey="TerritoryID")]
+		public Territory Territory { get; set; }
+	}
+
+	[TableName(Name="Invoices")]
+	public partial class Invoice
+	{
+		[Nullable] public string    ShipName       { get; set; }
+		[Nullable] public string    ShipAddress    { get; set; }
+		[Nullable] public string    ShipCity       { get; set; }
+		[Nullable] public string    ShipRegion     { get; set; }
+		[Nullable] public string    ShipPostalCode { get; set; }
+		[Nullable] public string    ShipCountry    { get; set; }
+		[Nullable] public string    CustomerID     { get; set; }
+		           public string    CustomerName   { get; set; }
+		[Nullable] public string    Address        { get; set; }
+		[Nullable] public string    City           { get; set; }
+		[Nullable] public string    Region         { get; set; }
+		[Nullable] public string    PostalCode     { get; set; }
+		[Nullable] public string    Country        { get; set; }
+		           public string    Salesperson    { get; set; }
+		           public int       OrderID        { get; set; }
+		[Nullable] public DateTime? OrderDate      { get; set; }
+		[Nullable] public DateTime? RequiredDate   { get; set; }
+		[Nullable] public DateTime? ShippedDate    { get; set; }
+		           public string    ShipperName    { get; set; }
+		           public int       ProductID      { get; set; }
+		           public string    ProductName    { get; set; }
+		           public decimal   UnitPrice      { get; set; }
+		           public short     Quantity       { get; set; }
+		           public float     Discount       { get; set; }
+		[Nullable] public decimal?  ExtendedPrice  { get; set; }
+		[Nullable] public decimal?  Freight        { get; set; }
+	}
+
+	[TableName(Name="Order Details")]
+	public partial class OrderDetail
+	{
+		[PrimaryKey(1)] public int     OrderID   { get; set; }
+		[PrimaryKey(2)] public int     ProductID { get; set; }
+		                public decimal UnitPrice { get; set; }
+		                public short   Quantity  { get; set; }
+		                public float   Discount  { get; set; }
+
+		// FK_Order_Details_Orders
+		[Association(ThisKey="OrderID", OtherKey="OrderID")]
+		public Order Order { get; set; }
+
+		// FK_Order_Details_Products
+		[Association(ThisKey="ProductID", OtherKey="ProductID")]
+		public Product Product { get; set; }
+	}
+
+	[TableName(Name="Order Details Extended")]
+	public partial class OrderDetailsExtended
+	{
+		           public int      OrderID       { get; set; }
+		           public int      ProductID     { get; set; }
+		           public string   ProductName   { get; set; }
+		           public decimal  UnitPrice     { get; set; }
+		           public short    Quantity      { get; set; }
+		           public float    Discount      { get; set; }
+		[Nullable] public decimal? ExtendedPrice { get; set; }
+	}
+
+	[TableName(Name="Order Subtotals")]
+	public partial class OrderSubtotal
+	{
+		           public int      OrderID  { get; set; }
+		[Nullable] public decimal? Subtotal { get; set; }
+	}
+
+	[TableName(Name="Orders")]
+	public partial class Order
+	{
+		[Identity, PrimaryKey(1)] public int       OrderID        { get; set; }
+		[Nullable               ] public string    CustomerID     { get; set; }
+		[Nullable               ] public int?      EmployeeID     { get; set; }
+		[Nullable               ] public DateTime? OrderDate      { get; set; }
+		[Nullable               ] public DateTime? RequiredDate   { get; set; }
+		[Nullable               ] public DateTime? ShippedDate    { get; set; }
+		[Nullable               ] public int?      ShipVia        { get; set; }
+		[Nullable               ] public decimal?  Freight        { get; set; }
+		[Nullable               ] public string    ShipName       { get; set; }
+		[Nullable               ] public string    ShipAddress    { get; set; }
+		[Nullable               ] public string    ShipCity       { get; set; }
+		[Nullable               ] public string    ShipRegion     { get; set; }
+		[Nullable               ] public string    ShipPostalCode { get; set; }
+		[Nullable               ] public string    ShipCountry    { get; set; }
+
+		// FK_Orders_Customers
+		[Association(ThisKey="CustomerID", OtherKey="CustomerID")]
+		public Customer Customer { get; set; }
+
+		// FK_Orders_Employees
+		[Association(ThisKey="EmployeeID", OtherKey="EmployeeID")]
+		public Employee Employee { get; set; }
+
+		// FK_Orders_Shippers
+		[Association(ThisKey="ShipVia", OtherKey="ShipperID")]
+		public Shipper Shipper { get; set; }
+
+		// FK_Order_Details_Orders_BackReference
+		[Association(ThisKey="OrderID", OtherKey="OrderID")]
+		public List<OrderDetail> OrderDetails { get; set; }
+	}
+
+	[TableName(Name="Orders Qry")]
+	public partial class OrdersQry
+	{
+		           public int       OrderID        { get; set; }
+		[Nullable] public string    CustomerID     { get; set; }
+		[Nullable] public int?      EmployeeID     { get; set; }
+		[Nullable] public DateTime? OrderDate      { get; set; }
+		[Nullable] public DateTime? RequiredDate   { get; set; }
+		[Nullable] public DateTime? ShippedDate    { get; set; }
+		[Nullable] public int?      ShipVia        { get; set; }
+		[Nullable] public decimal?  Freight        { get; set; }
+		[Nullable] public string    ShipName       { get; set; }
+		[Nullable] public string    ShipAddress    { get; set; }
+		[Nullable] public string    ShipCity       { get; set; }
+		[Nullable] public string    ShipRegion     { get; set; }
+		[Nullable] public string    ShipPostalCode { get; set; }
+		[Nullable] public string    ShipCountry    { get; set; }
+		           public string    CompanyName    { get; set; }
+		[Nullable] public string    Address        { get; set; }
+		[Nullable] public string    City           { get; set; }
+		[Nullable] public string    Region         { get; set; }
+		[Nullable] public string    PostalCode     { get; set; }
+		[Nullable] public string    Country        { get; set; }
+	}
+
+	[TableName(Name="Product Sales for 1997")]
+	public partial class ProductSalesFor1997
+	{
+		           public string   CategoryName { get; set; }
+		           public string   ProductName  { get; set; }
+		[Nullable] public decimal? ProductSales { get; set; }
+	}
+
+	[TableName(Name="Products")]
+	public partial class Product
+	{
+		[Identity, PrimaryKey(1)                                           ] public int      ProductID       { get; set; }
+		                                                                     public string   ProductName     { get; set; }
+		[Nullable                                                          ] public int?     SupplierID      { get; set; }
+		[Nullable                                                          ] public int?     CategoryID      { get; set; }
+		[Nullable                                                          ] public string   QuantityPerUnit { get; set; }
+		[Nullable                                                          ] public decimal? UnitPrice       { get; set; }
+		[Nullable                                                          ] public short?   UnitsInStock    { get; set; }
+		[Nullable                                                          ] public short?   UnitsOnOrder    { get; set; }
+		[Nullable                                                          ] public short?   ReorderLevel    { get; set; }
+		[                         MapField(IsInheritanceDiscriminator=true)] public bool     Discontinued    { get; set; }
+
+		// FK_Products_Categories
+		[Association(ThisKey="CategoryID", OtherKey="CategoryID")]
+		public Category Category { get; set; }
+
+		// FK_Products_Suppliers
+		[Association(ThisKey="SupplierID", OtherKey="SupplierID")]
+		public Supplier Supplier { get; set; }
+
+		// FK_Order_Details_Products_BackReference
+		[Association(ThisKey="ProductID", OtherKey="ProductID")]
+		public List<OrderDetail> OrderDetails { get; set; }
+	}
+
+	[TableName(Name="Products Above Average Price")]
+	public partial class ProductsAboveAveragePrice
+	{
+		           public string   ProductName { get; set; }
+		[Nullable] public decimal? UnitPrice   { get; set; }
+	}
+
+	[TableName(Name="Products by Category")]
+	public partial class ProductsByCategory
+	{
+		           public string CategoryName    { get; set; }
+		           public string ProductName     { get; set; }
+		[Nullable] public string QuantityPerUnit { get; set; }
+		[Nullable] public short? UnitsInStock    { get; set; }
+		           public bool   Discontinued    { get; set; }
+	}
+
+	[TableName(Name="Quarterly Orders")]
+	public partial class QuarterlyOrder
+	{
+		[Nullable] public string CustomerID  { get; set; }
+		[Nullable] public string CompanyName { get; set; }
+		[Nullable] public string City        { get; set; }
+		[Nullable] public string Country     { get; set; }
+	}
+
+	[TableName(Name="Region")]
+	public partial class Region
+	{
+		[PrimaryKey(1)] public int    RegionID          { get; set; }
+		                public string RegionDescription { get; set; }
+
+		// FK_Territories_Region_BackReference
+		[Association(ThisKey="RegionID", OtherKey="RegionID")]
+		public List<Territory> Territories { get; set; }
+	}
+
+	[TableName(Name="Sales by Category")]
+	public partial class SalesByCategory
+	{
+		           public int      CategoryID   { get; set; }
+		           public string   CategoryName { get; set; }
+		           public string   ProductName  { get; set; }
+		[Nullable] public decimal? ProductSales { get; set; }
+	}
+
+	[TableName(Name="Sales Totals by Amount")]
+	public partial class SalesTotalsByAmount
+	{
+		[Nullable] public decimal?  SaleAmount  { get; set; }
+		           public int       OrderID     { get; set; }
+		           public string    CompanyName { get; set; }
+		[Nullable] public DateTime? ShippedDate { get; set; }
+	}
+
+	[TableName(Name="Shippers")]
+	public partial class Shipper
+	{
+		[Identity, PrimaryKey(1)] public int    ShipperID   { get; set; }
+		                          public string CompanyName { get; set; }
+		[Nullable               ] public string Phone       { get; set; }
+
+		// FK_Orders_Shippers_BackReference
+		[Association(ThisKey="ShipperID", OtherKey="ShipVia")]
+		public List<Order> Orders { get; set; }
+	}
+
+	[TableName(Name="Summary of Sales by Quarter")]
+	public partial class SummaryOfSalesByQuarter
+	{
+		[Nullable] public DateTime? ShippedDate { get; set; }
+		           public int       OrderID     { get; set; }
+		[Nullable] public decimal?  Subtotal    { get; set; }
+	}
+
+	[TableName(Name="Summary of Sales by Year")]
+	public partial class SummaryOfSalesByYear
+	{
+		[Nullable] public DateTime? ShippedDate { get; set; }
+		           public int       OrderID     { get; set; }
+		[Nullable] public decimal?  Subtotal    { get; set; }
+	}
+
+	[TableName(Name="Suppliers")]
+	public partial class Supplier
+	{
+		[Identity, PrimaryKey(1)] public int    SupplierID   { get; set; }
+		                          public string CompanyName  { get; set; }
+		[Nullable               ] public string ContactName  { get; set; }
+		[Nullable               ] public string ContactTitle { get; set; }
+		[Nullable               ] public string Address      { get; set; }
+		[Nullable               ] public string City         { get; set; }
+		[Nullable               ] public string Region       { get; set; }
+		[Nullable               ] public string PostalCode   { get; set; }
+		[Nullable               ] public string Country      { get; set; }
+		[Nullable               ] public string Phone        { get; set; }
+		[Nullable               ] public string Fax          { get; set; }
+		[Nullable               ] public string HomePage     { get; set; }
+
+		// FK_Products_Suppliers_BackReference
+		[Association(ThisKey="SupplierID", OtherKey="SupplierID")]
+		public List<Product> Products { get; set; }
+	}
+
+	[TableName(Name="Territories")]
+	public partial class Territory
+	{
+		[PrimaryKey(1)] public string TerritoryID          { get; set; }
+		                public string TerritoryDescription { get; set; }
+		                public int    RegionID             { get; set; }
+
+		// FK_Territories_Region
+		[Association(ThisKey="RegionID", OtherKey="RegionID")]
+		public Region Region { get; set; }
+
+		// FK_EmployeeTerritories_Territories_BackReference
+		[Association(ThisKey="TerritoryID", OtherKey="TerritoryID")]
+		public List<EmployeeTerritory> EmployeeTerritories { get; set; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Linq/Demo/DataModel/NorthwindDB.tt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,38 @@
+<#@ template language="C#v3.5" debug="True" #>
+<#@ output extension=".generated.cs"   #>
+<#@ include file="BLToolkit.ttinclude" #>
+<#@ include file="MSSQL.ttinclude"     #>
+<#
+	ConnectionString = "Data Source=.;Database=Northwind;Integrated Security=SSPI";
+	Namespace        = "Linq.Demo.DataModel";
+	DataContextName  = "NorthwindDB";
+
+	OneToManyAssociationType = "List<{0}>";
+
+	LoadMetadata();
+
+	foreach (var t in Tables.Values)
+	{
+		if (t.ClassName.EndsWith("ies"))
+			t.ClassName = t.ClassName.Substring(0, t.ClassName.Length - 3) + "y";
+		else if (t.ClassName.EndsWith("s"))
+			t.ClassName = t.ClassName.Substring(0, t.ClassName.Length - 1);
+
+		foreach (var a in t.ForeignKeys.Values)
+		{
+			if (a.MemberName.EndsWith("ies"))
+				a.MemberName = a.MemberName.Substring(0, a.MemberName.Length - 3) + "y";
+			else if (a.MemberName.EndsWith("s"))
+				a.MemberName = a.MemberName.Substring(0, a.MemberName.Length - 1);
+		}
+	}
+
+	Tables["Employees"].    ForeignKeys["FK_Employees_Employees"].              MemberName = "ReportsToEmployee";
+	Tables["Employees"].    ForeignKeys["FK_Employees_Employees_BackReference"].MemberName = "Reporters";
+	Tables["Order Details"].ForeignKeys["FK_Order_Details_Orders"].             MemberName = "Order";
+	Tables["Order Details"].ForeignKeys["FK_Order_Details_Products"].           MemberName = "Product";
+
+	Tables["Products"].Columns["Discontinued"].Attributes.Add("MapField(IsInheritanceDiscriminator=true)");
+
+	GenerateModel();
+#>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Linq/Demo/Linq.Demo.2008.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{57CE5505-44CB-42E4-A346-3471F68A5B60}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Linq.Demo</RootNamespace>
+    <AssemblyName>Linq.Demo</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="BLToolkit.3, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b1d3f6ab3aadaca3, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>BLToolkit\BLToolkit.3.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="DataModel\NorthwindDB.cs" />
+    <Compile Include="DataModel\NorthwindDB.generated.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>NorthwindDB.tt</DependentUpon>
+    </Compile>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+    <None Include="DataModel\BLToolkit.ttinclude" />
+    <None Include="DataModel\NorthwindDB.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>NorthwindDB.generated.cs</LastGenOutput>
+    </None>
+    <None Include="DataModel\MSSQL.ttinclude" />
+    <None Include="DataModel\Northwind.sql" />
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Linq/Demo/Linq.Demo.2008.sln	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Linq.Demo.2008", "Linq.Demo.2008.csproj", "{57CE5505-44CB-42E4-A346-3471F68A5B60}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Linq/Demo/Linq.Demo.2010.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{57CE5505-44CB-42E4-A346-3471F68A5B60}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Linq.Demo</RootNamespace>
+    <AssemblyName>Linq.Demo</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\Linq.Demo.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\Linq.Demo.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="DataModel\NorthwindDB.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="DataModel\NorthwindDB.generated.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>NorthwindDB.tt</DependentUpon>
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+    <None Include="DataModel\BLToolkit.ttinclude" />
+    <None Include="DataModel\MSSQL.ttinclude" />
+    <None Include="DataModel\NorthwindDB.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>NorthwindDB.generated.cs</LastGenOutput>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Linq/Demo/Linq.Demo.2010.sln	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,26 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Linq.Demo.2010", "Linq.Demo.2010.csproj", "{57CE5505-44CB-42E4-A346-3471F68A5B60}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.4", "..\..\..\Source\BLToolkit.4.csproj", "{0C325F5D-E50E-4340-8724-D29896CCC583}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{57CE5505-44CB-42E4-A346-3471F68A5B60}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Linq/Demo/Program.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,740 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Linq.Expressions;
+
+using BLToolkit.Data;
+using BLToolkit.Data.Linq;
+
+namespace Linq.Demo
+{
+	using DataModel;
+
+	static class Program
+	{
+		static void Main()
+		{
+			DbManager.TraceSwitch = new TraceSwitch("DbManager", "DbManager trace switch", "Info");
+
+			FirstTest();
+			CountTest();
+			SingleTableTest();
+			SelectManyTest();
+			InnerJoinTest();
+			LeftJoinTest();
+			AssociationInnerJoinTest();
+			AssociationCountTest();
+			AssociationObjectTest();
+			MultiLevelAssociationTest();
+			CompareAssociationTest();
+			GroupByAssociationTest();
+			InheritanceTest1();
+			InheritanceTest2();
+			StringLengthTest();
+			StringCompareTest();
+			MathRoundCompare1Test();
+			MathRoundCompare2Test();
+			MathRoundCompare3Test();
+			SimpleSelectTest();
+			InsertTest1();
+			InsertTest2();
+			MultipleInsertTest1();
+			MultipleInsertTest2();
+			InsertWithIdentityTest1();
+			InsertWithIdentityTest2();
+			UpdateTest1();
+			UpdateTest2();
+			UpdateTest3();
+			SelfUpdateTest();
+			DeleteTest1();
+			DeleteTest2();
+			SqlLengthTest();
+			SqlRoundCompare1Test();
+			SqlSelectLengthTest();
+			SqlSelectLengthAsSqlTest();
+			RoundToEvenTest();
+			MethodExpressionTest();
+			CompiledQueryTest();
+		}
+
+		static void FirstTest()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var query = db.Employee;
+
+				foreach (var employee in query)
+				{
+					Console.WriteLine("{0} {1}", employee.EmployeeID, employee.FirstName);
+				}
+			}
+		}
+
+		static void CountTest()
+		{
+			using (var db = new NorthwindDB())
+			{
+				int count = db.Employee.Count();
+
+				Console.WriteLine(count);
+			}
+		}
+
+		static void SingleTableTest()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var query =
+					from e in db.Employee
+					where e.EmployeeID > 5
+					orderby e.LastName, e.FirstName
+					select e;
+
+				foreach (var employee in query)
+				{
+					Console.WriteLine("{0} {1}, {2}", employee.EmployeeID, employee.LastName, employee.FirstName);
+				}
+			}
+		}
+
+		static void SelectManyTest()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var query =
+					from c in db.Category
+					from p in db.Product
+					where p.CategoryID == c.CategoryID
+					select new
+					{
+						c.CategoryName,
+						p.ProductName
+					};
+
+				foreach (var item in query)
+				{
+					Console.WriteLine(item);
+				}
+			}
+		}
+
+		static void InnerJoinTest()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var query =
+					from p in db.Product
+					join c in db.Category on p.CategoryID equals c.CategoryID
+					select new
+					{
+						c.CategoryName,
+						p.ProductName
+					};
+
+				foreach (var item in query)
+				{
+					Console.WriteLine(item);
+				}
+			}
+		}
+
+		static void LeftJoinTest()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var query =
+					from p in db.Product
+					join c in db.Category on p.CategoryID equals c.CategoryID into g
+					from c in g.DefaultIfEmpty()
+					select new
+					{
+						c.CategoryName,
+						p.ProductName
+					};
+
+				foreach (var item in query)
+				{
+					Console.WriteLine(item);
+				}
+			}
+		}
+
+		static void AssociationInnerJoinTest()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var query =
+					from p in db.Product
+					select new
+					{
+						p.Category.CategoryName,
+						p.ProductName
+					};
+
+				foreach (var item in query)
+				{
+					Console.WriteLine(item);
+				}
+			}
+		}
+
+		static void AssociationCountTest()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var query =
+					from p in db.Product
+					select new
+					{
+						p.OrderDetails.Count,
+						p.ProductName
+					};
+
+				foreach (var item in query)
+				{
+					Console.WriteLine(item);
+				}
+			}
+		}
+
+		static void AssociationObjectTest()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var query =
+					from o in db.Order
+					select new Order
+					{
+						OrderID  = o.OrderID,
+						Customer = o.Customer
+					};
+
+				foreach (var item in query)
+				{
+					Console.WriteLine(item);
+				}
+			}
+		}
+
+		static void MultiLevelAssociationTest()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var query =
+					from o in db.OrderDetail
+					select new
+					{
+						o.Product.ProductName,
+						o.Order.OrderID,
+						o.Order.Employee.ReportsToEmployee.Region
+					};
+
+				foreach (var item in query)
+				{
+					Console.WriteLine(item);
+				}
+			}
+		}
+
+		static void CompareAssociationTest()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var query =
+					from o in db.Order
+					from t in db.EmployeeTerritory
+					where o.Employee == t.Employee
+					select new
+					{
+						o.OrderID,
+						o.EmployeeID,
+						t.TerritoryID
+					};
+
+				foreach (var item in query)
+				{
+					Console.WriteLine(item);
+				}
+			}
+		}
+
+		static void GroupByAssociationTest()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var query =
+					from p in db.Product
+					group p by p.Category into g
+					where g.Count() == 12
+					select g.Key.CategoryName;
+
+				foreach (var item in query)
+				{
+					Console.WriteLine(item);
+				}
+			}
+		}
+
+		static void InheritanceTest1()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var query = from p in db.DiscontinuedProduct select p;
+
+				foreach (var item in query)
+				{
+					Console.WriteLine(item);
+				}
+			}
+		}
+
+		static void InheritanceTest2()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var query =
+					from p in db.Product
+					where p is DiscontinuedProduct
+					select p;
+
+				foreach (var item in query)
+				{
+					Console.WriteLine(item);
+				}
+			}
+		}
+
+		static void StringLengthTest()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var query =
+					from c in db.Customer
+					where c.ContactName.Length > 5
+					select c.ContactName;
+
+				foreach (var item in query)
+				{
+					Console.WriteLine(item);
+				}
+			}
+		}
+
+		static void StringCompareTest()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var query =
+					from c in db.Customer
+					where c.ContactName.CompareTo("John") > 0
+					select c.ContactName;
+
+				foreach (var item in query)
+				{
+					Console.WriteLine(item);
+				}
+			}
+		}
+
+		static void MathRoundCompare1Test()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var query =
+					from o in db.Order
+					where Math.Round(o.Freight.Value) >= 10
+					select o.Freight;
+
+				foreach (var item in query)
+				{
+					Console.WriteLine(item);
+				}
+			}
+		}
+
+		static void MathRoundCompare2Test()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var query =
+					from o in db.Order
+					where Math.Round(o.OrderDetails.Sum(d => d.Quantity * d.UnitPrice)) >= 10
+					select o.Freight;
+
+				foreach (var item in query)
+				{
+					Console.WriteLine(item);
+				}
+			}
+		}
+
+		static void MathRoundCompare3Test()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var query =
+					from o in db.Order
+					let sum = o.OrderDetails.Sum(d => d.Quantity * d.UnitPrice)
+					where Math.Round(sum) >= 10
+					select o.Freight;
+
+				foreach (var item in query)
+				{
+					Console.WriteLine(item);
+				}
+			}
+		}
+
+		static void SimpleSelectTest()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var value = db.Select(() => Sql.CurrentTimestamp);
+
+				Console.WriteLine(value);
+			}
+		}
+
+		static void InsertTest1()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var value = db.Employee.Insert(() => new Employee
+				{
+					FirstName = "John",
+					LastName  = "Shepard",
+					Title     = "Spectre",
+					HireDate  = Sql.CurrentTimestamp
+				});
+
+				Console.WriteLine(value);
+
+				db.Employee.Delete(e => e.LastName == "Shepard");
+			}
+		}
+
+		static void InsertTest2()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var value =
+					db
+						.Into(db.Employee)
+							.Value(e => e.FirstName, "John")
+							.Value(e => e.LastName,  "Shepard")
+							.Value(e => e.Title,     "Spectre")
+							.Value(e => e.HireDate,  () => Sql.CurrentTimestamp)
+						.Insert();
+
+				Console.WriteLine(value);
+
+				db.Employee.Delete(e => e.LastName == "Shepard");
+			}
+		}
+
+		static void MultipleInsertTest1()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var value =
+					db.Region
+						.Where(r => r.RegionID > 2)
+						.Insert(db.Region, r => new Region()
+						{
+							RegionID          = r.RegionID + 100,
+							RegionDescription = "Copy Of " + r.RegionDescription
+						});
+
+				Console.WriteLine(value);
+
+				db.Region.Delete(r => r.RegionDescription.StartsWith("Copy Of "));
+			}
+		}
+
+		static void MultipleInsertTest2()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var value =
+					db.Region
+						.Where(r => r.RegionID > 2)
+						.Into(db.Region)
+							.Value(r => r.RegionID,          r => r.RegionID + 100)
+							.Value(r => r.RegionDescription, r => "Copy Of " + r.RegionDescription)
+						.Insert();
+
+				Console.WriteLine(value);
+
+				db.Region.Delete(r => r.RegionDescription.StartsWith("Copy Of "));
+			}
+		}
+
+		static void InsertWithIdentityTest1()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var value = db.Employee.InsertWithIdentity(() => new Employee
+				{
+					FirstName = "John",
+					LastName  = "Shepard",
+					Title     = "Spectre",
+					HireDate  = Sql.CurrentTimestamp
+				});
+
+				Console.WriteLine(value);
+
+				db.Employee.Delete(e => e.EmployeeID == Convert.ToInt32(value));
+			}
+		}
+
+		static void InsertWithIdentityTest2()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var value =
+					db
+						.Into(db.Employee)
+							.Value(e => e.FirstName, "John")
+							.Value(e => e.LastName,  "Shepard")
+							.Value(e => e.Title,     () => "Spectre")
+							.Value(e => e.HireDate,  () => Sql.CurrentTimestamp)
+						.InsertWithIdentity();
+
+				Console.WriteLine(value);
+
+				db.Employee.Delete(e => e.EmployeeID == Convert.ToInt32(value));
+			}
+		}
+
+		static void UpdateTest1()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var value =
+					db.Employee
+						.Update(
+							e => e.Title == "Spectre",
+							e => new Employee
+							{
+								Title = "Commander"
+							});
+
+				Console.WriteLine(value);
+			}
+		}
+
+		static void UpdateTest2()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var value =
+					db.Employee
+						.Where(e => e.Title == "Spectre")
+						.Update(e => new Employee
+						{
+							Title = "Commander"
+						});
+
+				Console.WriteLine(value);
+			}
+		}
+
+		static void UpdateTest3()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var value =
+					db.Employee
+						.Where(e => e.Title == "Spectre")
+						.Set(e => e.Title, "Commander")
+						.Update();
+
+				Console.WriteLine(value);
+			}
+		}
+
+		static void SelfUpdateTest()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var value =
+					db.Employee
+						.Where(e => e.Title == "Spectre")
+						.Set(e => e.HireDate, e => e.HireDate.Value.AddDays(10))
+						.Update();
+
+				Console.WriteLine(value);
+			}
+		}
+
+		static void DeleteTest1()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var value = db.Employee.Delete(e => e.Title == "Spectre");
+
+				Console.WriteLine(value);
+			}
+		}
+
+		static void DeleteTest2()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var value =
+					db.Employee
+						.Where(e => e.Title == "Spectre")
+						.Delete();
+
+				Console.WriteLine(value);
+			}
+		}
+
+		static void SqlLengthTest()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var query =
+					from c in db.Customer
+					where Sql.Length(c.ContactName) > 5
+					select c.ContactName;
+
+				foreach (var item in query)
+				{
+					Console.WriteLine(item);
+				}
+			}
+		}
+
+		static void SqlRoundCompare1Test()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var query =
+					from o in db.Order
+					where Sql.Round(o.Freight) >= 10
+					select o.Freight;
+
+				foreach (var item in query)
+				{
+					Console.WriteLine(item);
+				}
+			}
+		}
+
+		static void SqlSelectLengthTest()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var query =
+					from c in db.Customer
+					select Sql.Length(c.ContactName);
+
+				foreach (var item in query)
+				{
+					Console.WriteLine(item);
+				}
+			}
+		}
+
+		static void SqlSelectLengthAsSqlTest()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var query =
+					from c in db.Customer
+					select Sql.AsSql(Sql.Length(c.ContactName));
+
+				foreach (var item in query)
+				{
+					Console.WriteLine(item);
+				}
+			}
+		}
+
+		static decimal? RoundToEven(decimal? value)
+		{
+			return
+				value - Sql.Floor(value) == 0.5m && Sql.Floor(value) % 2 == 0?
+					Sql.Floor(value) :
+					Sql.Round(value);
+		}
+
+		static void RoundToEvenTest()
+		{
+			Expressions.MapMember<decimal?,decimal?>(
+				value => RoundToEven(value),
+				value =>
+					value - Sql.Floor(value) == 0.5m && Sql.Floor(value) % 2 == 0?
+						Sql.Floor(value) :
+						Sql.Round(value));
+
+			using (var db = new NorthwindDB())
+			{
+				var query =
+					from o in db.Order
+					let sum = o.OrderDetails.Sum(d => d.Quantity * d.UnitPrice)
+					where RoundToEven(sum) >= 10
+					select o.Freight;
+
+				foreach (var item in query)
+				{
+					Console.WriteLine(item);
+				}
+			}
+		}
+
+		[MethodExpression("OrderCountExpression")]
+		static int OrderCount(Customer customer, string region)
+		{
+			throw new InvalidOperationException();
+		}
+
+		static Expression<Func<Customer,string,int>> OrderCountExpression()
+		{
+			return (customer, region) => customer.Orders.Count(o => o.ShipRegion == region);
+		}
+
+		static void MethodExpressionTest()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var query =
+					from c in db.Customer
+					select new
+					{
+						sum1 = OrderCount(c, "SP"),
+						sum2 = OrderCount(c, "NM")
+					};
+
+				foreach (var item in query)
+				{
+					Console.WriteLine(item);
+				}
+			}
+		}
+
+		static Func<NorthwindDB,int,IEnumerable<Employee>> _query =
+			CompiledQuery.Compile<NorthwindDB,int,IEnumerable<Employee>>((db, n) =>
+				from e in db.Employee
+				where e.EmployeeID > n
+				orderby e.LastName, e.FirstName
+				select e
+			);
+
+		static void CompiledQueryTest()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var query = _query(db, 5);
+
+				foreach (var item in query)
+				{
+					Console.WriteLine(item);
+				}
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Linq/Demo/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Linq.Demo")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("Linq.Demo")]
+[assembly: AssemblyCopyright("Copyright © Microsoft 2012")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("db69ad10-383d-486e-8c3d-bff41f384a1c")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Linq/OverWCF/App.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<configuration>
+	<system.diagnostics>
+		<sources>
+			<source name="System.ServiceModel.MessageLogging">
+				<listeners>
+					<add name="messages" type="System.Diagnostics.XmlWriterTraceListener" initializeData="messages.svclog"/>
+				</listeners>
+			</source>
+		</sources>
+	</system.diagnostics>
+
+	<system.serviceModel>
+		<diagnostics>
+			<messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="false" maxMessagesToLog="1000" maxSizeOfMessageToLog="100000"/>
+		</diagnostics>
+	</system.serviceModel>
+	
+	<connectionStrings>
+		<add name="Sql2008" connectionString="Server=.;Database=BLToolkitData;Integrated Security=SSPI" providerName="System.Data.SqlClient"/>
+	</connectionStrings>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Linq/OverWCF/Client.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.ServiceModel;
+
+namespace Linq.OverWCF
+{
+	class Client : ClientBase<IDemoService>, IDemoService
+	{
+		public Client() : base(
+			new NetTcpBinding(SecurityMode.None)
+			{
+				MaxReceivedMessageSize = 10000000,
+				MaxBufferPoolSize      = 10000000,
+				MaxBufferSize          = 10000000,
+			},
+			new EndpointAddress("net.tcp://localhost:1234/LinqOverWCF"))
+		{
+		}
+
+		public IEnumerable<string> DemoMethod(string str)
+		{
+			return Channel.DemoMethod(str);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Linq/OverWCF/DataModel.generated.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,261 @@
+//---------------------------------------------------------------------------------------------------
+// <auto-generated>
+//    This code was generated by BLToolkit template for T4.
+//    Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
+// </auto-generated>
+//---------------------------------------------------------------------------------------------------
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+using System.ServiceModel;
+using System.Text;
+
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using BLToolkit.Data.Sql;
+using BLToolkit.Data.Sql.SqlProvider;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+using BLToolkit.ServiceModel;
+
+namespace Linq.OverWCF
+{
+	public partial class DataModel : ServiceModelDataContext
+	{
+		public Table<BinaryData>    BinaryData    { get { return this.GetTable<BinaryData>();    } }
+		public Table<Child>         Child         { get { return this.GetTable<Child>();         } }
+		public Table<DataTypes>     DataTypes     { get { return this.GetTable<DataTypes>();     } }
+		public Table<DataTypeTest>  DataTypeTest  { get { return this.GetTable<DataTypeTest>();  } }
+		public Table<Doctor>        Doctor        { get { return this.GetTable<Doctor>();        } }
+		public Table<GrandChild>    GrandChild    { get { return this.GetTable<GrandChild>();    } }
+		public Table<LinqDataTypes> LinqDataTypes { get { return this.GetTable<LinqDataTypes>(); } }
+		public Table<Parent>        Parent        { get { return this.GetTable<Parent>();        } }
+		public Table<Patient>       Patient       { get { return this.GetTable<Patient>();       } }
+		public Table<Person>        Person        { get { return this.GetTable<Person>();        } }
+		
+		#region FreeTextTable
+		
+		public class FreeTextKey<T>
+		{
+			public T   Key;
+			public int Rank;
+		}
+		
+		class FreeTextTableExpressionAttribute : TableExpressionAttribute
+		{
+			public FreeTextTableExpressionAttribute()
+				: base("")
+			{
+			}
+		
+			public override void SetTable(SqlTable table, MemberInfo member, IEnumerable<Expression> expArgs, IEnumerable<ISqlExpression> sqlArgs)
+			{
+				var aargs  = sqlArgs.ToArray();
+				var arr    = ConvertArgs(member, aargs).ToList();
+				var method = (MethodInfo)member;
+				var sp     = new MsSql2008SqlProvider();
+		
+				{
+					var ttype  = method.GetGenericArguments()[0];
+					var tbl    = new SqlTable(ttype);
+		
+					var database     = tbl.Database     == null ? null : sp.Convert(tbl.Database,     ConvertType.NameToDatabase).  ToString();
+					var owner        = tbl.Owner        == null ? null : sp.Convert(tbl.Owner,        ConvertType.NameToOwner).     ToString();
+					var physicalName = tbl.PhysicalName == null ? null : sp.Convert(tbl.PhysicalName, ConvertType.NameToQueryTable).ToString();
+		
+					var name   = sp.BuildTableName(new StringBuilder(), database, owner, physicalName);
+		
+					arr.Add(new SqlExpression(name.ToString(), Precedence.Primary));
+				}
+		
+				{
+					var field = ((ConstantExpression)expArgs.First()).Value;
+		
+					if (field is string)
+					{
+						arr[0] = new SqlExpression(field.ToString(), Precedence.Primary);
+					}
+					else if (field is LambdaExpression)
+					{
+						var body = ((LambdaExpression)field).Body;
+		
+						if (body is MemberExpression)
+						{
+							var name = ((MemberExpression)body).Member.Name;
+		
+							name = sp.Convert(name, ConvertType.NameToQueryField).ToString();
+		
+							arr[0] = new SqlExpression(name, Precedence.Primary);
+						}
+					}
+				}
+		
+				table.SqlTableType   = SqlTableType.Expression;
+				table.Name           = "FREETEXTTABLE({6}, {2}, {3}) {1}";
+				table.TableArguments = arr.ToArray();
+			}
+		}
+		
+		[FreeTextTableExpressionAttribute]
+		public Table<FreeTextKey<TKey>> FreeTextTable<TTable,TKey>(string field, string text)
+		{
+			return this.GetTable<FreeTextKey<TKey>>(
+				this,
+				((MethodInfo)(MethodBase.GetCurrentMethod())).MakeGenericMethod(typeof(TTable), typeof(TKey)),
+				field,
+				text);
+		}
+		
+		[FreeTextTableExpressionAttribute]
+		public Table<FreeTextKey<TKey>> FreeTextTable<TTable,TKey>(Expression<Func<TTable,string>> fieldSelector, string text)
+		{
+			return this.GetTable<FreeTextKey<TKey>>(
+				this,
+				((MethodInfo)(MethodBase.GetCurrentMethod())).MakeGenericMethod(typeof(TTable), typeof(TKey)),
+				fieldSelector,
+				text);
+		}
+		
+		#endregion
+	}
+
+	[TableName(Name="BinaryData")]
+	public partial class BinaryData
+	{
+		[Identity, PrimaryKey(1)] public int    BinaryDataID { get; set; } // int(10)
+		                          public byte[] Stamp        { get; set; } // timestamp
+		                          public byte[] Data         { get; set; } // varbinary(1024)
+	}
+
+	[TableName(Name="Child")]
+	public partial class Child
+	{
+		[Nullable] public int? ParentID { get; set; } // int(10)
+		[Nullable] public int? ChildID  { get; set; } // int(10)
+	}
+
+	[TableName(Name="DataTypes")]
+	public partial class DataTypes
+	{
+		[Nullable] public int?     ID         { get; set; } // int(10)
+		[Nullable] public decimal? MoneyValue { get; set; } // decimal(10,4)
+	}
+
+	[TableName(Name="DataTypeTest")]
+	public partial class DataTypeTest
+	{
+		[Identity, PrimaryKey(1)] public int       DataTypeID { get; set; } // int(10)
+		[Nullable               ] public byte[]    Binary_    { get; set; } // binary(50)
+		[Nullable               ] public bool?     Boolean_   { get; set; } // bit
+		[Nullable               ] public byte?     Byte_      { get; set; } // tinyint(3)
+		[Nullable               ] public byte[]    Bytes_     { get; set; } // varbinary(50)
+		[Nullable               ] public char?     Char_      { get; set; } // char(1)
+		[Nullable               ] public DateTime? DateTime_  { get; set; } // datetime(3)
+		[Nullable               ] public decimal?  Decimal_   { get; set; } // decimal(20,2)
+		[Nullable               ] public double?   Double_    { get; set; } // float(53)
+		[Nullable               ] public Guid?     Guid_      { get; set; } // uniqueidentifier
+		[Nullable               ] public short?    Int16_     { get; set; } // smallint(5)
+		[Nullable               ] public int?      Int32_     { get; set; } // int(10)
+		[Nullable               ] public long?     Int64_     { get; set; } // bigint(19)
+		[Nullable               ] public decimal?  Money_     { get; set; } // money(19,4)
+		[Nullable               ] public byte?     SByte_     { get; set; } // tinyint(3)
+		[Nullable               ] public float?    Single_    { get; set; } // real(24)
+		[Nullable               ] public byte[]    Stream_    { get; set; } // varbinary(50)
+		[Nullable               ] public string    String_    { get; set; } // nvarchar(50)
+		[Nullable               ] public short?    UInt16_    { get; set; } // smallint(5)
+		[Nullable               ] public int?      UInt32_    { get; set; } // int(10)
+		[Nullable               ] public long?     UInt64_    { get; set; } // bigint(19)
+		[Nullable               ] public string    Xml_       { get; set; } // xml(-1)
+	}
+
+	[TableName(Name="Doctor")]
+	public partial class Doctor
+	{
+		[PrimaryKey(1)] public int    PersonID { get; set; } // int(10)
+		                public string Taxonomy { get; set; } // nvarchar(50)
+
+		// FK_Doctor_Person
+		[Association(ThisKey="PersonID", OtherKey="PersonID", CanBeNull=false)]
+		public Person Person { get; set; }
+	}
+
+	[TableName(Name="GrandChild")]
+	public partial class GrandChild
+	{
+		[Nullable] public int? ParentID     { get; set; } // int(10)
+		[Nullable] public int? ChildID      { get; set; } // int(10)
+		[Nullable] public int? GrandChildID { get; set; } // int(10)
+	}
+
+	[TableName(Name="LinqDataTypes")]
+	public partial class LinqDataTypes
+	{
+		[Nullable] public int?      ID            { get; set; } // int(10)
+		[Nullable] public decimal?  MoneyValue    { get; set; } // decimal(10,4)
+		[Nullable] public DateTime? DateTimeValue { get; set; } // datetime(3)
+		[Nullable] public bool?     BoolValue     { get; set; } // bit
+		[Nullable] public Guid?     GuidValue     { get; set; } // uniqueidentifier
+		[Nullable] public byte[]    BinaryValue   { get; set; } // varbinary(5000)
+		[Nullable] public short?    SmallIntValue { get; set; } // smallint(5)
+	}
+
+	[TableName(Name="Parent")]
+	public partial class Parent
+	{
+		[Nullable] public int? ParentID { get; set; } // int(10)
+		[Nullable] public int? Value1   { get; set; } // int(10)
+	}
+
+	[TableName(Name="Patient")]
+	public partial class Patient
+	{
+		[PrimaryKey(1)] public int    PersonID  { get; set; } // int(10)
+		                public string Diagnosis { get; set; } // nvarchar(256)
+
+		// FK_Patient_Person
+		[Association(ThisKey="PersonID", OtherKey="PersonID", CanBeNull=false)]
+		public Person Person { get; set; }
+	}
+
+	[TableName(Name="Person")]
+	public partial class Person
+	{
+		[Identity, PrimaryKey(1)] public int    PersonID   { get; set; } // int(10)
+		                          public string FirstName  { get; set; } // nvarchar(50)
+		                          public string LastName   { get; set; } // nvarchar(50)
+		[Nullable               ] public string MiddleName { get; set; } // nvarchar(50)
+		                          public char   Gender     { get; set; } // char(1)
+
+		// FK_Doctor_Person_BackReference
+		[Association(ThisKey="PersonID", OtherKey="PersonID", CanBeNull=true)]
+		public Doctor Doctor { get; set; }
+
+		// FK_Patient_Person_BackReference
+		[Association(ThisKey="PersonID", OtherKey="PersonID", CanBeNull=true)]
+		public Patient Patient { get; set; }
+	}
+}
+
+namespace Linq.OverWCF
+{
+	public partial class DataModel
+	{
+		public DataModel() : base(
+			new NetTcpBinding(SecurityMode.None)
+			{
+				MaxReceivedMessageSize = 10000000,
+				MaxBufferPoolSize      = 10000000,
+				MaxBufferSize          = 10000000,
+				CloseTimeout           = new TimeSpan(00, 01, 00),
+				OpenTimeout            = new TimeSpan(00, 01, 00),
+				ReceiveTimeout         = new TimeSpan(00, 10, 00),
+				SendTimeout            = new TimeSpan(00, 10, 00),
+			},
+			new EndpointAddress("net.tcp://localhost:1234/LinqOverWCF"))
+		{
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Linq/OverWCF/DataModel.tt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,36 @@
+<#@ template language="C#" debug="True" hostspecific="True" #>
+<#@ output extension=".generated.cs" #>
+<#@ include file="$(SolutionDir)\Source\Templates\BLToolkit.ttinclude"   #>
+<#@ include file="$(SolutionDir)\Source\Templates\BLT4Toolkit.ttinclude" #>
+<#@ include file="$(SolutionDir)\Source\Templates\MSSQL.ttinclude"       #>
+<#
+	ConnectionString = "Server=.;Database=BLToolkitData;Integrated Security=SSPI";
+
+	BaseDataContextClass = "ServiceModelDataContext";
+	
+	Usings.Add("BLToolkit.ServiceModel");
+	Usings.Add("System.ServiceModel");
+
+	GenerateModel();
+#>
+
+namespace Linq.OverWCF
+{
+	public partial class DataModel
+	{
+		public DataModel() : base(
+			new NetTcpBinding(SecurityMode.None)
+			{
+				MaxReceivedMessageSize = 10000000,
+				MaxBufferPoolSize      = 10000000,
+				MaxBufferSize          = 10000000,
+				CloseTimeout           = new TimeSpan(00, 01, 00),
+				OpenTimeout            = new TimeSpan(00, 01, 00),
+				ReceiveTimeout         = new TimeSpan(00, 10, 00),
+				SendTimeout            = new TimeSpan(00, 10, 00),
+			},
+			new EndpointAddress("net.tcp://localhost:1234/LinqOverWCF"))
+		{
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Linq/OverWCF/DemoService.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.ServiceModel;
+
+namespace Linq.OverWCF
+{
+	[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
+	public class DemoService : IDemoService
+	{
+		public IEnumerable<string> DemoMethod(string str)
+		{
+			foreach (var ch in str)
+			{
+				yield return ch.ToString();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Linq/OverWCF/IDemoService.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.ServiceModel;
+
+namespace Linq.OverWCF
+{
+	[ServiceContract]
+	public interface IDemoService
+	{
+		[OperationContract]
+		IEnumerable<string> DemoMethod(string str);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Linq/OverWCF/Linq.OverWCF.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{7ED3B518-7CEA-4991-98BD-9752E5F32F58}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Linq.OverWCF</RootNamespace>
+    <AssemblyName>Linq.OverWCF</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <TargetFrameworkProfile />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\Linq.OverWCF.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\Linq.OverWCF.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Runtime.Serialization">
+      <RequiredTargetFramework>3.0</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.ServiceModel">
+      <RequiredTargetFramework>3.0</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Client.cs" />
+    <Compile Include="DataModel.generated.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>DataModel.tt</DependentUpon>
+    </Compile>
+    <Compile Include="DemoService.cs" />
+    <Compile Include="IDemoService.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+    <None Include="DataModel.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>DataModel.generated.cs</LastGenOutput>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
+    <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Linq/OverWCF/Program.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,60 @@
+using System;
+using System.Linq;
+using System.ServiceModel;
+using System.ServiceModel.Description;
+
+using BLToolkit.Data;
+using BLToolkit.ServiceModel;
+
+namespace Linq.OverWCF
+{
+	class Program
+	{
+		static void Main()
+		{
+			DbManager.TurnTraceSwitchOn();
+
+			using (var host = new ServiceHost(new LinqService("Sql2008"), new Uri("net.tcp://localhost:1234")))
+			{
+				host.Description.Behaviors.Add(new ServiceMetadataBehavior());
+				host.Description.Behaviors.Find<ServiceDebugBehavior>().IncludeExceptionDetailInFaults = true;
+				host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex");
+				host.AddServiceEndpoint(
+					typeof(ILinqService),
+					new NetTcpBinding(SecurityMode.None)
+					{
+						MaxReceivedMessageSize = 10000000,
+						MaxBufferPoolSize      = 10000000,
+						MaxBufferSize          = 10000000,
+						CloseTimeout           = new TimeSpan(00, 01, 00),
+						OpenTimeout            = new TimeSpan(00, 01, 00),
+						ReceiveTimeout         = new TimeSpan(00, 10, 00),
+						SendTimeout            = new TimeSpan(00, 10, 00),
+					},
+					"LinqOverWCF");
+
+				host.Open();
+
+				var client = new DataModel();
+
+				var q =
+					from p in client.Person
+					select new
+					{
+						p.PersonID,
+						p.FirstName,
+						p.MiddleName,
+						p.LastName,
+						p.Gender
+					};
+
+				foreach (var p in q)
+					Console.WriteLine(p);
+
+				Console.ReadLine();
+
+				host.Close();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Linq/OverWCF/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Linq.OverWCF")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("Linq.OverWCF")]
+[assembly: AssemblyCopyright("Copyright © Microsoft 2012")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("e2dbeea8-fc86-40b1-b63d-0abad6ffafb4")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Partial.Trust/Asp.Net/Default.aspx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,81 @@
+<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Partial.Trust.Asp.Net._Default" %>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" >
+<head runat="server">
+	<title>Partial Trust Demo</title>
+</head>
+<body style="font-family: Verdana; font-size: small">
+<form id="form1" runat="server">
+
+<div style="padding: 10px">
+To use BLToolkit in Partial Trust Environment you should perform the following steps:
+
+	<div style="padding-left: 20px; padding-top: 10px;">
+	For all assemblies containing classes for which BLToolkit generates new types such as Partial.Trust.Components.dll in this demo:
+
+		<div style="padding-left: 20px; padding-top: 10px;">
+		<ul>
+		<li>
+			Sign the assembly.
+		</li>
+		<li style="padding-top: 10px">
+			Add the AllowPartiallyTrustedCallers attribute:
+			<pre style="font-size: small">[assembly: AllowPartiallyTrustedCallers]</pre>
+		</li>
+
+		<li>
+			Use BLTgen.exe to generate BLToolkit extensions at the post-build step. For example:<br/><br/>
+
+			$(ProjectDir)..\..\..\Tools\BLTgen\bin\$(ConfigurationName)\BLTgen.4.exe $(TargetPath) /O:$(ProjectDir)..\Asp.Net\bin /K:$(ProjectDir)Partial.Trust.snk /D<br/><br/>
+
+			Extension assembly must be signed as well (use /K flag).
+		</li>
+		</ul>
+		</div>
+
+	Turn the TypeFactory.LoadTypes flag on.
+
+		<div style="padding-left: 20px; padding-top: 10px;">
+		Add the following section in the Web.config file:
+
+<pre style="font-size: small; padding-left: 20px;">
+&lt;configSections&gt;
+	&lt;section name="bltoolkit" type="BLToolkit.Configuration.BLToolkitSection, BLToolkit.4" requirePermission="false"/&gt;
+&lt;/configSections&gt;
+&lt;bltoolkit&gt;
+	&lt;typeFactory loadTypes="true" /&gt;
+&lt;/bltoolkit&gt;
+</pre>
+
+			- or<br/><br/>
+
+			set 
+
+				<pre style="font-size: small; padding-left: 20px;">TypeFactory.LoadTypes = true;</pre>
+
+			somewhere before the first use of BLToolkit (Global.asax for Web applications).
+
+		</div>
+	</div>
+
+<br/>
+<br/>
+
+Sample output:
+<br/>
+<br/>
+
+<div style="padding-left: 20px;">
+<table>
+<tr><td>DataAccessor:</td>       <td><asp:Label ID="Label1" runat="server" ></asp:Label></td></tr>
+<tr><td>Linq query:</td>         <td><asp:Label ID="Label2" runat="server" ></asp:Label></td></tr>
+<tr><td>Compiled Linq query:</td><td><asp:Label ID="Label3" runat="server" ></asp:Label></td></tr>
+</table>
+</div>
+
+</div>
+</form>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Partial.Trust/Asp.Net/Default.aspx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,38 @@
+using System;
+using System.Linq;
+using System.Web.UI;
+
+using BLToolkit.Data;
+using BLToolkit.Data.Linq;
+
+namespace Partial.Trust.Asp.Net
+{
+	using Components;
+
+	public partial class _Default : Page
+	{
+		protected void Page_Load(object sender, EventArgs e)
+		{
+			var da   = PersonDataAccessor.CreateInstance();
+			var list = da.GetPersonList();
+
+			Label1.Text = list[0].ContactName;
+
+			var q =
+				from c in new Table<Customers>()
+				where c.CustomerID == list[0].CustomerID
+				select c.ContactName;
+
+			Label2.Text = q.First();
+
+			using (var db = new DbManager())
+				Label3.Text = _compiledQuery(db, list[0].CustomerID).ToList().First();
+		}
+
+		static readonly Func<DbManager,string,IQueryable<string>> _compiledQuery =
+			CompiledQuery.Compile((DbManager db, string id) => 
+				from c in db.GetTable<Customers>()
+				where c.CustomerID == id
+				select c.ContactName);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Partial.Trust/Asp.Net/Default.aspx.designer.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,51 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated. 
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Partial.Trust.Asp.Net {
+    
+    
+    public partial class _Default {
+        
+        /// <summary>
+        /// form1 control.
+        /// </summary>
+        /// <remarks>
+        /// Auto-generated field.
+        /// To modify move field declaration from designer file to code-behind file.
+        /// </remarks>
+        protected global::System.Web.UI.HtmlControls.HtmlForm form1;
+        
+        /// <summary>
+        /// Label1 control.
+        /// </summary>
+        /// <remarks>
+        /// Auto-generated field.
+        /// To modify move field declaration from designer file to code-behind file.
+        /// </remarks>
+        protected global::System.Web.UI.WebControls.Label Label1;
+        
+        /// <summary>
+        /// Label2 control.
+        /// </summary>
+        /// <remarks>
+        /// Auto-generated field.
+        /// To modify move field declaration from designer file to code-behind file.
+        /// </remarks>
+        protected global::System.Web.UI.WebControls.Label Label2;
+        
+        /// <summary>
+        /// Label3 control.
+        /// </summary>
+        /// <remarks>
+        /// Auto-generated field.
+        /// To modify move field declaration from designer file to code-behind file.
+        /// </remarks>
+        protected global::System.Web.UI.WebControls.Label Label3;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Partial.Trust/Asp.Net/Partial.Trust.Asp.Net.2008.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,110 @@
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{16272F10-9E3D-4C24-8761-8A43E9FB525F}</ProjectGuid>
+    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Partial.Trust.Asp.Net</RootNamespace>
+    <AssemblyName>Partial.Trust.Asp.Net</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Web.Extensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Web" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Configuration" />
+    <Reference Include="System.Web.Services" />
+    <Reference Include="System.EnterpriseServices" />
+    <Reference Include="System.Web.Mobile" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Default.aspx" />
+    <Content Include="Web.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Default.aspx.cs">
+      <SubType>ASPXCodeBehind</SubType>
+      <DependentUpon>Default.aspx</DependentUpon>
+    </Compile>
+    <Compile Include="Default.aspx.designer.cs">
+      <DependentUpon>Default.aspx</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\Source\BLToolkit.3.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\Components\Partial.Trust.Components.csproj">
+      <Project>{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}</Project>
+      <Name>Partial.Trust.Components.2008</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="App_Data\" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v9.0\WebApplications\Microsoft.WebApplication.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <ProjectExtensions>
+    <VisualStudio>
+      <FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
+        <WebProjectProperties>
+          <UseIIS>False</UseIIS>
+          <AutoAssignPort>True</AutoAssignPort>
+          <DevelopmentServerPort>61649</DevelopmentServerPort>
+          <DevelopmentServerVPath>/</DevelopmentServerVPath>
+          <IISUrl>
+          </IISUrl>
+          <NTLMAuthentication>False</NTLMAuthentication>
+          <UseCustomServer>False</UseCustomServer>
+          <CustomServerUrl>
+          </CustomServerUrl>
+          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
+        </WebProjectProperties>
+      </FlavorProperties>
+    </VisualStudio>
+  </ProjectExtensions>
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Partial.Trust/Asp.Net/Partial.Trust.Asp.Net.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{16272F10-9E3D-4C24-8761-8A43E9FB525F}</ProjectGuid>
+    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Partial.Trust.Asp.Net</RootNamespace>
+    <AssemblyName>Partial.Trust.Asp.Net</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>4.0</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <TargetFrameworkProfile />
+    <UseIISExpress>false</UseIISExpress>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Partial.Trust.Asp.Net.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Partial.Trust.Asp.Net.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Web.ApplicationServices" />
+    <Reference Include="System.Web.DynamicData" />
+    <Reference Include="System.Web.Entity" />
+    <Reference Include="System.Web.Extensions" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Web" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Configuration" />
+    <Reference Include="System.Web.Services" />
+    <Reference Include="System.EnterpriseServices" />
+    <Reference Include="System.Web.Mobile" />
+    <Reference Include="System.Xml.Linq" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Default.aspx" />
+    <Content Include="Web.config">
+      <SubType>Designer</SubType>
+    </Content>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Default.aspx.cs">
+      <SubType>ASPXCodeBehind</SubType>
+      <DependentUpon>Default.aspx</DependentUpon>
+    </Compile>
+    <Compile Include="Default.aspx.designer.cs">
+      <DependentUpon>Default.aspx</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="App_Data\" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\Components\Partial.Trust.Components.csproj">
+      <Project>{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}</Project>
+      <Name>Partial.Trust.Components</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <PropertyGroup>
+    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
+    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
+  </PropertyGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
+  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <ProjectExtensions>
+    <VisualStudio>
+      <FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
+        <WebProjectProperties>
+          <UseIIS>False</UseIIS>
+          <AutoAssignPort>True</AutoAssignPort>
+          <DevelopmentServerPort>59174</DevelopmentServerPort>
+          <DevelopmentServerVPath>/</DevelopmentServerVPath>
+          <IISUrl>
+          </IISUrl>
+          <NTLMAuthentication>False</NTLMAuthentication>
+          <UseCustomServer>False</UseCustomServer>
+          <CustomServerUrl>
+          </CustomServerUrl>
+          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
+        </WebProjectProperties>
+      </FlavorProperties>
+    </VisualStudio>
+  </ProjectExtensions>
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Partial.Trust/Asp.Net/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,30 @@
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Partial.Trust.Asp.Net")]
+[assembly: AssemblyProduct("Partial.Trust.Asp.Net")]
+[assembly: AssemblyCopyright("\xA9 2002-2012 www.bltoolkit.net")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("3d5900ae-111a-45be-96b3-d9e4606ca793")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Partial.Trust/Asp.Net/Web.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<configuration>
+	<configSections>
+		<section name="bltoolkit" type="BLToolkit.Configuration.BLToolkitSection, BLToolkit.4" requirePermission="false"/>
+	</configSections>
+	<bltoolkit>
+		<typeFactory loadTypes="true"/>
+	</bltoolkit>
+	<connectionStrings>
+		<add name="Northwind" connectionString="Data Source=.;initial catalog=Northwind;Integrated Security=SSPI"/>
+	</connectionStrings>
+	<system.web>
+		<trust level="Medium"/>
+		<compilation debug="true" targetFramework="4.0"/>
+		<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/>
+	</system.web>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Partial.Trust/Components/Customer.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,19 @@
+using System;
+
+namespace Partial.Trust.Components
+{
+	public class Customers
+	{
+		public string CustomerID;
+		public string CompanyName;
+		public string ContactName;
+		public string ContactTitle;
+		public string Address;
+		public string City;
+		public string Region;
+		public string PostalCode;
+		public string Country;
+		public string Phone;
+		public string Fax;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Partial.Trust/Components/Partial.Trust.Components.2008.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Partial.Trust.Components</RootNamespace>
+    <AssemblyName>Partial.Trust.Components</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>Partial.Trust.snk</AssemblyOriginatorKeyFile>
+    <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Customer.cs" />
+    <Compile Include="PersonDataAccessor.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\Source\BLToolkit.3.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Partial.Trust.snk" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PostBuildEvent>$(ProjectDir)..\..\..\Tools\BLTgen\bin\$(ConfigurationName)\BLTgen.exe $(TargetPath) /O:$(ProjectDir)..\Asp.Net\bin /K:$(ProjectDir)Partial.Trust.snk /D</PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Partial.Trust/Components/Partial.Trust.Components.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{3BCB17AC-9941-4460-858B-2B7BC3BEDDE7}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Partial.Trust.Components</RootNamespace>
+    <AssemblyName>Partial.Trust.Components</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>Partial.Trust.snk</AssemblyOriginatorKeyFile>
+    <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <TargetFrameworkProfile />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\Partial.Trust.Components.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\Partial.Trust.Components.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Customer.cs" />
+    <Compile Include="PersonDataAccessor.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Partial.Trust.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PostBuildEvent>$(ProjectDir)..\..\..\Tools\BLTgen\bin\$(ConfigurationName)\BLTgen.4.exe $(TargetPath) /O:$(ProjectDir)..\Asp.Net\bin /K:$(ProjectDir)Partial.Trust.snk /D</PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
Binary file Demo/Partial.Trust/Components/Partial.Trust.snk has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Partial.Trust/Components/PersonDataAccessor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+
+using BLToolkit.DataAccess;
+
+namespace Partial.Trust.Components
+{
+	public abstract class PersonDataAccessor : DataAccessor
+	{
+		[SqlQuery("SELECT * FROM Customers")]
+		public abstract List<Customers> GetPersonList();
+
+		public static PersonDataAccessor CreateInstance()
+		{
+			return CreateInstance<PersonDataAccessor>();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Partial.Trust/Components/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,35 @@
+using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Security;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Partial.Trust.Components")]
+[assembly: AssemblyProduct("Partial.Trust.Components")]
+[assembly: AssemblyCopyright("\xA9 2002-2012 www.bltoolkit.net")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("c9109767-494e-4994-ac1a-2458efc3765c")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+
+[assembly: AllowPartiallyTrustedCallers]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Partial.Trust/ReadMe.txt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,36 @@
+To use BLToolkit in Partial Trust Environment you should perform the following steps:
+
+	For all assemblies containing classes for which BLToolkit generates
+	new types such as Partial.Trust.Components.dll in this demo:
+
+		- Sign the assembly.
+
+		- Add the AllowPartiallyTrustedCallers attribute:
+
+			[assembly: AllowPartiallyTrustedCallers]
+
+		- Use BLTgen.exe to generate BLToolkit extensions at the post-build step.
+		  For example:
+
+			$(ProjectDir)..\..\..\Tools\BLTgen\bin\$(ConfigurationName)\BLTgen.exe $(TargetPath) /O:$(ProjectDir)..\Asp.Net\bin /K:$(ProjectDir)Partial.Trust.snk /D
+
+		  Extension assembly must be signed as well (use /K flag).
+
+	Turn the TypeFactory.LoadTypes flag on.
+
+		Add the following section in the Web.config file:
+
+			<configSections>
+				<section name="bltoolkit" type="BLToolkit.Configuration.BLToolkitSection, BLToolkit.3" requirePermission="false"/>
+			</configSections>
+			<bltoolkit>
+				<typeFactory loadTypes="true" />
+			</bltoolkit>
+
+			- or
+
+			set 
+
+				TypeFactory.LoadTypes = true;
+
+			somewhere before the first use of BLToolkit (Global.asax for Web applications).
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Silverlight/Client.Web/Client.Web.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>
+    </ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{E796EF23-D63D-4EBD-A34D-5F243834933B}</ProjectGuid>
+    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Client.Web</RootNamespace>
+    <AssemblyName>Client.Web</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <SilverlightApplicationList>{28693777-369C-4C0D-B076-38F7C0E5D06C}|..\Client\Client.csproj|ClientBin|False</SilverlightApplicationList>
+    <UseIISExpress>false</UseIISExpress>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>4.0</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <IISExpressSSLPort />
+    <IISExpressAnonymousAuthentication />
+    <IISExpressWindowsAuthentication />
+    <IISExpressUseClassicPipelineMode />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Client.Web.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Client.Web.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data.Entity" />
+    <Reference Include="System.Data.Services" />
+    <Reference Include="System.Data.Services.Client" />
+    <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.ServiceModel" />
+    <Reference Include="System.ServiceModel.Web" />
+    <Reference Include="System.Web.DynamicData" />
+    <Reference Include="System.Web.Entity" />
+    <Reference Include="System.Web.ApplicationServices" />
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Web.Extensions" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Web" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Configuration" />
+    <Reference Include="System.Web.Services" />
+    <Reference Include="System.EnterpriseServices" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="ClientBin\Client.xap" />
+    <Content Include="ClientTestPage.aspx" />
+    <Content Include="ClientTestPage.html" />
+    <Content Include="Silverlight.js" />
+    <Content Include="LinqWebService.asmx" />
+    <Content Include="Web.config" />
+    <Content Include="Web.Debug.config">
+      <DependentUpon>Web.config</DependentUpon>
+    </Content>
+    <Content Include="Web.Release.config">
+      <DependentUpon>Web.config</DependentUpon>
+    </Content>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="DataModel.generated.cs">
+      <DependentUpon>DataModel.tt</DependentUpon>
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="LinqWebService.asmx.cs">
+      <DependentUpon>LinqWebService.asmx</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="DataModel.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>DataModel.generated.cs</LastGenOutput>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
+  </ItemGroup>
+  <PropertyGroup>
+    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
+    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
+  </PropertyGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
+  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />
+  <ProjectExtensions>
+    <VisualStudio>
+      <FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
+        <WebProjectProperties>
+          <UseIIS>False</UseIIS>
+          <AutoAssignPort>False</AutoAssignPort>
+          <DevelopmentServerPort>31020</DevelopmentServerPort>
+          <DevelopmentServerVPath>/</DevelopmentServerVPath>
+          <IISUrl>
+          </IISUrl>
+          <NTLMAuthentication>False</NTLMAuthentication>
+          <UseCustomServer>False</UseCustomServer>
+          <CustomServerUrl>
+          </CustomServerUrl>
+          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
+        </WebProjectProperties>
+      </FlavorProperties>
+    </VisualStudio>
+  </ProjectExtensions>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Silverlight/Client.Web/ClientTestPage.aspx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,74 @@
+<%@ Page Language="C#" AutoEventWireup="true" %>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" >
+<head runat="server">
+    <title>Client</title>
+    <style type="text/css">
+    html, body {
+	    height: 100%;
+	    overflow: auto;
+    }
+    body {
+	    padding: 0;
+	    margin: 0;
+    }
+    #silverlightControlHost {
+	    height: 100%;
+	    text-align:center;
+    }
+    </style>
+    <script type="text/javascript" src="Silverlight.js"></script>
+    <script type="text/javascript">
+        function onSilverlightError(sender, args) {
+            var appSource = "";
+            if (sender != null && sender != 0) {
+              appSource = sender.getHost().Source;
+            }
+            
+            var errorType = args.ErrorType;
+            var iErrorCode = args.ErrorCode;
+
+            if (errorType == "ImageError" || errorType == "MediaError") {
+              return;
+            }
+
+            var errMsg = "Unhandled Error in Silverlight Application " +  appSource + "\n" ;
+
+            errMsg += "Code: "+ iErrorCode + "    \n";
+            errMsg += "Category: " + errorType + "       \n";
+            errMsg += "Message: " + args.ErrorMessage + "     \n";
+
+            if (errorType == "ParserError") {
+                errMsg += "File: " + args.xamlFile + "     \n";
+                errMsg += "Line: " + args.lineNumber + "     \n";
+                errMsg += "Position: " + args.charPosition + "     \n";
+            }
+            else if (errorType == "RuntimeError") {           
+                if (args.lineNumber != 0) {
+                    errMsg += "Line: " + args.lineNumber + "     \n";
+                    errMsg += "Position: " +  args.charPosition + "     \n";
+                }
+                errMsg += "MethodName: " + args.methodName + "     \n";
+            }
+
+            throw new Error(errMsg);
+        }
+    </script>
+</head>
+<body>
+    <form id="form1" runat="server" style="height:100%">
+    <div id="silverlightControlHost">
+        <object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
+		  <param name="source" value="ClientBin/Client.xap"/>
+		  <param name="onError" value="onSilverlightError" />
+		  <param name="background" value="white" />
+		  <param name="minRuntimeVersion" value="4.0.50401.0" />
+		  <param name="autoUpgrade" value="true" />
+		  <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50401.0" style="text-decoration:none">
+ 			  <img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight" style="border-style:none"/>
+		  </a>
+	    </object><iframe id="_sl_historyFrame" style="visibility:hidden;height:0px;width:0px;border:0px"></iframe></div>
+    </form>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Silverlight/Client.Web/ClientTestPage.html	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,73 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" >
+
+<head>
+    <title>Client</title>
+    <style type="text/css">
+    html, body {
+	    height: 100%;
+	    overflow: auto;
+    }
+    body {
+	    padding: 0;
+	    margin: 0;
+    }
+    #silverlightControlHost {
+	    height: 100%;
+	    text-align:center;
+    }
+    </style>
+    <script type="text/javascript" src="Silverlight.js"></script>
+    <script type="text/javascript">
+        function onSilverlightError(sender, args) {
+            var appSource = "";
+            if (sender != null && sender != 0) {
+              appSource = sender.getHost().Source;
+            }
+            
+            var errorType = args.ErrorType;
+            var iErrorCode = args.ErrorCode;
+
+            if (errorType == "ImageError" || errorType == "MediaError") {
+              return;
+            }
+
+            var errMsg = "Unhandled Error in Silverlight Application " +  appSource + "\n" ;
+
+            errMsg += "Code: "+ iErrorCode + "    \n";
+            errMsg += "Category: " + errorType + "       \n";
+            errMsg += "Message: " + args.ErrorMessage + "     \n";
+
+            if (errorType == "ParserError") {
+                errMsg += "File: " + args.xamlFile + "     \n";
+                errMsg += "Line: " + args.lineNumber + "     \n";
+                errMsg += "Position: " + args.charPosition + "     \n";
+            }
+            else if (errorType == "RuntimeError") {           
+                if (args.lineNumber != 0) {
+                    errMsg += "Line: " + args.lineNumber + "     \n";
+                    errMsg += "Position: " +  args.charPosition + "     \n";
+                }
+                errMsg += "MethodName: " + args.methodName + "     \n";
+            }
+
+            throw new Error(errMsg);
+        }
+    </script>
+</head>
+<body>
+    <form id="form1" runat="server" style="height:100%">
+    <div id="silverlightControlHost">
+        <object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
+		  <param name="source" value="ClientBin/Client.xap"/>
+		  <param name="onError" value="onSilverlightError" />
+		  <param name="background" value="white" />
+		  <param name="minRuntimeVersion" value="4.0.50401.0" />
+		  <param name="autoUpgrade" value="true" />
+		  <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50401.0" style="text-decoration:none">
+ 			  <img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight" style="border-style:none"/>
+		  </a>
+	    </object><iframe id="_sl_historyFrame" style="visibility:hidden;height:0px;width:0px;border:0px"></iframe></div>
+    </form>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Silverlight/Client.Web/DataModel.generated.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,619 @@
+//---------------------------------------------------------------------------------------------------
+// <auto-generated>
+//    This code was generated by BLToolkit template for T4.
+//    Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
+// </auto-generated>
+//---------------------------------------------------------------------------------------------------
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+using System.ServiceModel;
+using System.Text;
+
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using BLToolkit.Data.Sql;
+using BLToolkit.Data.Sql.SqlProvider;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+using BLToolkit.ServiceModel;
+
+namespace Client
+{
+	public partial class DataModel : DbManager
+	{
+		public Table<AlphabeticalListOfProducts> AlphabeticalListOfProducts { get { return this.GetTable<AlphabeticalListOfProducts>(); } }
+		/// <summary>
+		/// Description for Categories table.
+		/// </summary>
+		public Table<Categories>                 Categories                 { get { return this.GetTable<Categories>();                 } }
+		public Table<CategorySalesFor1997>       CategorySalesFor1997       { get { return this.GetTable<CategorySalesFor1997>();       } }
+		public Table<CurrentProductList>         CurrentProductList         { get { return this.GetTable<CurrentProductList>();         } }
+		public Table<CustomerAndSuppliersByCity> CustomerAndSuppliersByCity { get { return this.GetTable<CustomerAndSuppliersByCity>(); } }
+		public Table<CustomerCustomerDemo>       CustomerCustomerDemo       { get { return this.GetTable<CustomerCustomerDemo>();       } }
+		public Table<CustomerDemographics>       CustomerDemographics       { get { return this.GetTable<CustomerDemographics>();       } }
+		/// <summary>
+		/// Description of Customers table.
+		/// </summary>
+		public Table<Customers>                  Customers                  { get { return this.GetTable<Customers>();                  } }
+		public Table<Employees>                  Employees                  { get { return this.GetTable<Employees>();                  } }
+		public Table<EmployeeTerritories>        EmployeeTerritories        { get { return this.GetTable<EmployeeTerritories>();        } }
+		public Table<Invoices>                   Invoices                   { get { return this.GetTable<Invoices>();                   } }
+		public Table<OrderDetails>               OrderDetails               { get { return this.GetTable<OrderDetails>();               } }
+		public Table<OrderDetailsExtended>       OrderDetailsExtended       { get { return this.GetTable<OrderDetailsExtended>();       } }
+		public Table<OrderSubtotals>             OrderSubtotals             { get { return this.GetTable<OrderSubtotals>();             } }
+		public Table<Orders>                     Orders                     { get { return this.GetTable<Orders>();                     } }
+		public Table<OrdersQry>                  OrdersQry                  { get { return this.GetTable<OrdersQry>();                  } }
+		public Table<ProductSalesFor1997>        ProductSalesFor1997        { get { return this.GetTable<ProductSalesFor1997>();        } }
+		public Table<Products>                   Products                   { get { return this.GetTable<Products>();                   } }
+		public Table<ProductsAboveAveragePrice>  ProductsAboveAveragePrice  { get { return this.GetTable<ProductsAboveAveragePrice>();  } }
+		public Table<ProductsByCategory>         ProductsByCategory         { get { return this.GetTable<ProductsByCategory>();         } }
+		public Table<QuarterlyOrders>            QuarterlyOrders            { get { return this.GetTable<QuarterlyOrders>();            } }
+		public Table<Region>                     Region                     { get { return this.GetTable<Region>();                     } }
+		public Table<SalesByCategory>            SalesByCategory            { get { return this.GetTable<SalesByCategory>();            } }
+		public Table<SalesTotalsByAmount>        SalesTotalsByAmount        { get { return this.GetTable<SalesTotalsByAmount>();        } }
+		public Table<Shippers>                   Shippers                   { get { return this.GetTable<Shippers>();                   } }
+		public Table<SummaryOfSalesByQuarter>    SummaryOfSalesByQuarter    { get { return this.GetTable<SummaryOfSalesByQuarter>();    } }
+		public Table<SummaryOfSalesByYear>       SummaryOfSalesByYear       { get { return this.GetTable<SummaryOfSalesByYear>();       } }
+		public Table<Suppliers>                  Suppliers                  { get { return this.GetTable<Suppliers>();                  } }
+		public Table<Territories>                Territories                { get { return this.GetTable<Territories>();                } }
+		
+		#region FreeTextTable
+		
+		public class FreeTextKey<T>
+		{
+			public T   Key;
+			public int Rank;
+		}
+		
+		class FreeTextTableExpressionAttribute : TableExpressionAttribute
+		{
+			public FreeTextTableExpressionAttribute()
+				: base("")
+			{
+			}
+		
+			public override void SetTable(SqlTable table, MemberInfo member, IEnumerable<Expression> expArgs, IEnumerable<ISqlExpression> sqlArgs)
+			{
+				var aargs  = sqlArgs.ToArray();
+				var arr    = ConvertArgs(member, aargs).ToList();
+				var method = (MethodInfo)member;
+				var sp     = new MsSql2008SqlProvider();
+		
+				{
+					var ttype  = method.GetGenericArguments()[0];
+					var tbl    = new SqlTable(ttype);
+		
+					var database     = tbl.Database     == null ? null : sp.Convert(tbl.Database,     ConvertType.NameToDatabase).  ToString();
+					var owner        = tbl.Owner        == null ? null : sp.Convert(tbl.Owner,        ConvertType.NameToOwner).     ToString();
+					var physicalName = tbl.PhysicalName == null ? null : sp.Convert(tbl.PhysicalName, ConvertType.NameToQueryTable).ToString();
+		
+					var name   = sp.BuildTableName(new StringBuilder(), database, owner, physicalName);
+		
+					arr.Add(new SqlExpression(name.ToString(), Precedence.Primary));
+				}
+		
+				{
+					var field = ((ConstantExpression)expArgs.First()).Value;
+		
+					if (field is string)
+					{
+						arr[0] = new SqlExpression(field.ToString(), Precedence.Primary);
+					}
+					else if (field is LambdaExpression)
+					{
+						var body = ((LambdaExpression)field).Body;
+		
+						if (body is MemberExpression)
+						{
+							var name = ((MemberExpression)body).Member.Name;
+		
+							name = sp.Convert(name, ConvertType.NameToQueryField).ToString();
+		
+							arr[0] = new SqlExpression(name, Precedence.Primary);
+						}
+					}
+				}
+		
+				table.SqlTableType   = SqlTableType.Expression;
+				table.Name           = "FREETEXTTABLE({6}, {2}, {3}) {1}";
+				table.TableArguments = arr.ToArray();
+			}
+		}
+		
+		[FreeTextTableExpressionAttribute]
+		public Table<FreeTextKey<TKey>> FreeTextTable<TTable,TKey>(string field, string text)
+		{
+			return this.GetTable<FreeTextKey<TKey>>(
+				this,
+				((MethodInfo)(MethodBase.GetCurrentMethod())).MakeGenericMethod(typeof(TTable), typeof(TKey)),
+				field,
+				text);
+		}
+		
+		[FreeTextTableExpressionAttribute]
+		public Table<FreeTextKey<TKey>> FreeTextTable<TTable,TKey>(Expression<Func<TTable,string>> fieldSelector, string text)
+		{
+			return this.GetTable<FreeTextKey<TKey>>(
+				this,
+				((MethodInfo)(MethodBase.GetCurrentMethod())).MakeGenericMethod(typeof(TTable), typeof(TKey)),
+				fieldSelector,
+				text);
+		}
+		
+		#endregion
+	}
+
+	// View
+	[TableName(Name="Alphabetical list of products")]
+	public partial class AlphabeticalListOfProducts
+	{
+		           public int      ProductID       { get; set; } // int(10)
+		           public string   ProductName     { get; set; } // nvarchar(40)
+		[Nullable] public int?     SupplierID      { get; set; } // int(10)
+		[Nullable] public int?     CategoryID      { get; set; } // int(10)
+		[Nullable] public string   QuantityPerUnit { get; set; } // nvarchar(20)
+		[Nullable] public decimal? UnitPrice       { get; set; } // money(19,4)
+		[Nullable] public short?   UnitsInStock    { get; set; } // smallint(5)
+		[Nullable] public short?   UnitsOnOrder    { get; set; } // smallint(5)
+		[Nullable] public short?   ReorderLevel    { get; set; } // smallint(5)
+		           public bool     Discontinued    { get; set; } // bit
+		           public string   CategoryName    { get; set; } // nvarchar(15)
+	}
+
+	/// <summary>
+	/// Description for Categories table.
+	/// </summary>
+	[TableName(Name="Categories")]
+	public partial class Categories
+	{
+		/// <summary>
+		/// Description of Categories.CategoryID field.
+		/// </summary>
+		[Identity, PrimaryKey(1)] public int    CategoryID   { get; set; } // int(10)
+		                          public string CategoryName { get; set; } // nvarchar(15)
+		[Nullable               ] public string Description  { get; set; } // ntext(1073741823)
+		[Nullable               ] public byte[] Picture      { get; set; } // image(2147483647)
+
+		// FK_Products_Categories_BackReference
+		[Association(ThisKey="CategoryID", OtherKey="CategoryID", CanBeNull=true)]
+		public IEnumerable<Products> Productss { get; set; }
+	}
+
+	// View
+	[TableName(Name="Category Sales for 1997")]
+	public partial class CategorySalesFor1997
+	{
+		           public string   CategoryName  { get; set; } // nvarchar(15)
+		[Nullable] public decimal? CategorySales { get; set; } // money(19,4)
+	}
+
+	// View
+	[TableName(Name="Current Product List")]
+	public partial class CurrentProductList
+	{
+		[Identity] public int    ProductID   { get; set; } // int(10)
+		           public string ProductName { get; set; } // nvarchar(40)
+	}
+
+	// View
+	[TableName(Name="Customer and Suppliers by City")]
+	public partial class CustomerAndSuppliersByCity
+	{
+		[Nullable] public string City         { get; set; } // nvarchar(15)
+		           public string CompanyName  { get; set; } // nvarchar(40)
+		[Nullable] public string ContactName  { get; set; } // nvarchar(30)
+		           public string Relationship { get; set; } // varchar(9)
+	}
+
+	[TableName(Name="CustomerCustomerDemo")]
+	public partial class CustomerCustomerDemo
+	{
+		[PrimaryKey(1)] public string CustomerID     { get; set; } // nchar(5)
+		[PrimaryKey(2)] public string CustomerTypeID { get; set; } // nchar(10)
+
+		// FK_CustomerCustomerDemo
+		[Association(ThisKey="CustomerTypeID", OtherKey="CustomerTypeID", CanBeNull=false)]
+		public CustomerDemographics FK_CustomerCustomerDemo { get; set; }
+
+		// FK_CustomerCustomerDemo_Customers
+		[Association(ThisKey="CustomerID", OtherKey="CustomerID", CanBeNull=false)]
+		public Customers Customers { get; set; }
+	}
+
+	[TableName(Name="CustomerDemographics")]
+	public partial class CustomerDemographics
+	{
+		[          PrimaryKey(1)] public string CustomerTypeID { get; set; } // nchar(10)
+		[Nullable               ] public string CustomerDesc   { get; set; } // ntext(1073741823)
+
+		// FK_CustomerCustomerDemo_BackReference
+		[Association(ThisKey="CustomerTypeID", OtherKey="CustomerTypeID", CanBeNull=true)]
+		public IEnumerable<CustomerCustomerDemo> CustomerCustomerDemos { get; set; }
+	}
+
+	/// <summary>
+	/// Description of Customers table.
+	/// </summary>
+	[TableName(Name="Customers")]
+	public partial class Customers
+	{
+		/// <summary>
+		/// Just ID.
+		/// </summary>
+		[          PrimaryKey(1)] public string CustomerID   { get; set; } // nchar(5)
+		/// <summary>
+		/// Name of the Company.
+		/// </summary>
+		                          public string CompanyName  { get; set; } // nvarchar(40)
+		[Nullable               ] public string ContactName  { get; set; } // nvarchar(30)
+		[Nullable               ] public string ContactTitle { get; set; } // nvarchar(30)
+		[Nullable               ] public string Address      { get; set; } // nvarchar(60)
+		[Nullable               ] public string City         { get; set; } // nvarchar(15)
+		[Nullable               ] public string Region       { get; set; } // nvarchar(15)
+		[Nullable               ] public string PostalCode   { get; set; } // nvarchar(10)
+		[Nullable               ] public string Country      { get; set; } // nvarchar(15)
+		[Nullable               ] public string Phone        { get; set; } // nvarchar(24)
+		[Nullable               ] public string Fax          { get; set; } // nvarchar(24)
+
+		// FK_Orders_Customers_BackReference
+		[Association(ThisKey="CustomerID", OtherKey="CustomerID", CanBeNull=true)]
+		public IEnumerable<Orders> Orderss { get; set; }
+
+		// FK_CustomerCustomerDemo_Customers_BackReference
+		[Association(ThisKey="CustomerID", OtherKey="CustomerID", CanBeNull=true)]
+		public IEnumerable<CustomerCustomerDemo> CustomerCustomerDemos { get; set; }
+	}
+
+	[TableName(Name="Employees")]
+	public partial class Employees
+	{
+		[Identity, PrimaryKey(1)] public int       EmployeeID      { get; set; } // int(10)
+		                          public string    LastName        { get; set; } // nvarchar(20)
+		                          public string    FirstName       { get; set; } // nvarchar(10)
+		[Nullable               ] public string    Title           { get; set; } // nvarchar(30)
+		[Nullable               ] public string    TitleOfCourtesy { get; set; } // nvarchar(25)
+		[Nullable               ] public DateTime? BirthDate       { get; set; } // datetime(3)
+		[Nullable               ] public DateTime? HireDate        { get; set; } // datetime(3)
+		[Nullable               ] public string    Address         { get; set; } // nvarchar(60)
+		[Nullable               ] public string    City            { get; set; } // nvarchar(15)
+		[Nullable               ] public string    Region          { get; set; } // nvarchar(15)
+		[Nullable               ] public string    PostalCode      { get; set; } // nvarchar(10)
+		[Nullable               ] public string    Country         { get; set; } // nvarchar(15)
+		[Nullable               ] public string    HomePhone       { get; set; } // nvarchar(24)
+		[Nullable               ] public string    Extension       { get; set; } // nvarchar(4)
+		[Nullable               ] public byte[]    Photo           { get; set; } // image(2147483647)
+		[Nullable               ] public string    Notes           { get; set; } // ntext(1073741823)
+		[Nullable               ] public int?      ReportsTo       { get; set; } // int(10)
+		[Nullable               ] public string    PhotoPath       { get; set; } // nvarchar(255)
+
+		// FK_Employees_Employees
+		[Association(ThisKey="ReportsTo", OtherKey="EmployeeID", CanBeNull=true)]
+		public Employees FK_Employees_Employees { get; set; }
+
+		// FK_Orders_Employees_BackReference
+		[Association(ThisKey="EmployeeID", OtherKey="EmployeeID", CanBeNull=true)]
+		public IEnumerable<Orders> Orderss { get; set; }
+
+		// FK_EmployeeTerritories_Employees_BackReference
+		[Association(ThisKey="EmployeeID", OtherKey="EmployeeID", CanBeNull=true)]
+		public IEnumerable<EmployeeTerritories> EmployeeTerritoriess { get; set; }
+
+		// FK_Employees_Employees_BackReference
+		[Association(ThisKey="EmployeeID", OtherKey="ReportsTo", CanBeNull=true)]
+		public IEnumerable<Employees> FK_Employees_Employees_BackReference { get; set; }
+	}
+
+	[TableName(Name="EmployeeTerritories")]
+	public partial class EmployeeTerritories
+	{
+		[PrimaryKey(1)] public int    EmployeeID  { get; set; } // int(10)
+		[PrimaryKey(2)] public string TerritoryID { get; set; } // nvarchar(20)
+
+		// FK_EmployeeTerritories_Employees
+		[Association(ThisKey="EmployeeID", OtherKey="EmployeeID", CanBeNull=false)]
+		public Employees Employees { get; set; }
+
+		// FK_EmployeeTerritories_Territories
+		[Association(ThisKey="TerritoryID", OtherKey="TerritoryID", CanBeNull=false)]
+		public Territories Territories { get; set; }
+	}
+
+	// View
+	[TableName(Name="Invoices")]
+	public partial class Invoices
+	{
+		[Nullable] public string    ShipName       { get; set; } // nvarchar(40)
+		[Nullable] public string    ShipAddress    { get; set; } // nvarchar(60)
+		[Nullable] public string    ShipCity       { get; set; } // nvarchar(15)
+		[Nullable] public string    ShipRegion     { get; set; } // nvarchar(15)
+		[Nullable] public string    ShipPostalCode { get; set; } // nvarchar(10)
+		[Nullable] public string    ShipCountry    { get; set; } // nvarchar(15)
+		[Nullable] public string    CustomerID     { get; set; } // nchar(5)
+		           public string    CustomerName   { get; set; } // nvarchar(40)
+		[Nullable] public string    Address        { get; set; } // nvarchar(60)
+		[Nullable] public string    City           { get; set; } // nvarchar(15)
+		[Nullable] public string    Region         { get; set; } // nvarchar(15)
+		[Nullable] public string    PostalCode     { get; set; } // nvarchar(10)
+		[Nullable] public string    Country        { get; set; } // nvarchar(15)
+		           public string    Salesperson    { get; set; } // nvarchar(31)
+		           public int       OrderID        { get; set; } // int(10)
+		[Nullable] public DateTime? OrderDate      { get; set; } // datetime(3)
+		[Nullable] public DateTime? RequiredDate   { get; set; } // datetime(3)
+		[Nullable] public DateTime? ShippedDate    { get; set; } // datetime(3)
+		           public string    ShipperName    { get; set; } // nvarchar(40)
+		           public int       ProductID      { get; set; } // int(10)
+		           public string    ProductName    { get; set; } // nvarchar(40)
+		           public decimal   UnitPrice      { get; set; } // money(19,4)
+		           public short     Quantity       { get; set; } // smallint(5)
+		           public float     Discount       { get; set; } // real(24)
+		[Nullable] public decimal?  ExtendedPrice  { get; set; } // money(19,4)
+		[Nullable] public decimal?  Freight        { get; set; } // money(19,4)
+	}
+
+	[TableName(Name="Order Details")]
+	public partial class OrderDetails
+	{
+		[PrimaryKey(1)] public int     OrderID   { get; set; } // int(10)
+		[PrimaryKey(2)] public int     ProductID { get; set; } // int(10)
+		                public decimal UnitPrice { get; set; } // money(19,4)
+		                public short   Quantity  { get; set; } // smallint(5)
+		                public float   Discount  { get; set; } // real(24)
+
+		// FK_Order_Details_Orders
+		[Association(ThisKey="OrderID", OtherKey="OrderID", CanBeNull=false)]
+		public Orders OrderDetailsOrders { get; set; }
+
+		// FK_Order_Details_Products
+		[Association(ThisKey="ProductID", OtherKey="ProductID", CanBeNull=false)]
+		public Products OrderDetailsProducts { get; set; }
+	}
+
+	// View
+	[TableName(Name="Order Details Extended")]
+	public partial class OrderDetailsExtended
+	{
+		           public int      OrderID       { get; set; } // int(10)
+		           public int      ProductID     { get; set; } // int(10)
+		           public string   ProductName   { get; set; } // nvarchar(40)
+		           public decimal  UnitPrice     { get; set; } // money(19,4)
+		           public short    Quantity      { get; set; } // smallint(5)
+		           public float    Discount      { get; set; } // real(24)
+		[Nullable] public decimal? ExtendedPrice { get; set; } // money(19,4)
+	}
+
+	// View
+	[TableName(Name="Order Subtotals")]
+	public partial class OrderSubtotals
+	{
+		           public int      OrderID  { get; set; } // int(10)
+		[Nullable] public decimal? Subtotal { get; set; } // money(19,4)
+	}
+
+	[TableName(Name="Orders")]
+	public partial class Orders
+	{
+		[Identity, PrimaryKey(1)] public int       OrderID        { get; set; } // int(10)
+		[Nullable               ] public string    CustomerID     { get; set; } // nchar(5)
+		[Nullable               ] public int?      EmployeeID     { get; set; } // int(10)
+		[Nullable               ] public DateTime? OrderDate      { get; set; } // datetime(3)
+		[Nullable               ] public DateTime? RequiredDate   { get; set; } // datetime(3)
+		[Nullable               ] public DateTime? ShippedDate    { get; set; } // datetime(3)
+		[Nullable               ] public int?      ShipVia        { get; set; } // int(10)
+		[Nullable               ] public decimal?  Freight        { get; set; } // money(19,4)
+		[Nullable               ] public string    ShipName       { get; set; } // nvarchar(40)
+		[Nullable               ] public string    ShipAddress    { get; set; } // nvarchar(60)
+		[Nullable               ] public string    ShipCity       { get; set; } // nvarchar(15)
+		[Nullable               ] public string    ShipRegion     { get; set; } // nvarchar(15)
+		[Nullable               ] public string    ShipPostalCode { get; set; } // nvarchar(10)
+		[Nullable               ] public string    ShipCountry    { get; set; } // nvarchar(15)
+
+		// FK_Orders_Shippers
+		[Association(ThisKey="ShipVia", OtherKey="ShipperID", CanBeNull=true)]
+		public Shippers Shippers { get; set; }
+
+		// FK_Orders_Employees
+		[Association(ThisKey="EmployeeID", OtherKey="EmployeeID", CanBeNull=true)]
+		public Employees Employees { get; set; }
+
+		// FK_Orders_Customers
+		[Association(ThisKey="CustomerID", OtherKey="CustomerID", CanBeNull=true)]
+		public Customers Customers { get; set; }
+
+		// FK_Order_Details_Orders_BackReference
+		[Association(ThisKey="OrderID", OtherKey="OrderID", CanBeNull=true)]
+		public IEnumerable<OrderDetails> OrderDetailss { get; set; }
+	}
+
+	// View
+	[TableName(Name="Orders Qry")]
+	public partial class OrdersQry
+	{
+		           public int       OrderID        { get; set; } // int(10)
+		[Nullable] public string    CustomerID     { get; set; } // nchar(5)
+		[Nullable] public int?      EmployeeID     { get; set; } // int(10)
+		[Nullable] public DateTime? OrderDate      { get; set; } // datetime(3)
+		[Nullable] public DateTime? RequiredDate   { get; set; } // datetime(3)
+		[Nullable] public DateTime? ShippedDate    { get; set; } // datetime(3)
+		[Nullable] public int?      ShipVia        { get; set; } // int(10)
+		[Nullable] public decimal?  Freight        { get; set; } // money(19,4)
+		[Nullable] public string    ShipName       { get; set; } // nvarchar(40)
+		[Nullable] public string    ShipAddress    { get; set; } // nvarchar(60)
+		[Nullable] public string    ShipCity       { get; set; } // nvarchar(15)
+		[Nullable] public string    ShipRegion     { get; set; } // nvarchar(15)
+		[Nullable] public string    ShipPostalCode { get; set; } // nvarchar(10)
+		[Nullable] public string    ShipCountry    { get; set; } // nvarchar(15)
+		           public string    CompanyName    { get; set; } // nvarchar(40)
+		[Nullable] public string    Address        { get; set; } // nvarchar(60)
+		[Nullable] public string    City           { get; set; } // nvarchar(15)
+		[Nullable] public string    Region         { get; set; } // nvarchar(15)
+		[Nullable] public string    PostalCode     { get; set; } // nvarchar(10)
+		[Nullable] public string    Country        { get; set; } // nvarchar(15)
+	}
+
+	// View
+	[TableName(Name="Product Sales for 1997")]
+	public partial class ProductSalesFor1997
+	{
+		           public string   CategoryName { get; set; } // nvarchar(15)
+		           public string   ProductName  { get; set; } // nvarchar(40)
+		[Nullable] public decimal? ProductSales { get; set; } // money(19,4)
+	}
+
+	[TableName(Name="Products")]
+	public partial class Products
+	{
+		[Identity, PrimaryKey(1)] public int      ProductID       { get; set; } // int(10)
+		                          public string   ProductName     { get; set; } // nvarchar(40)
+		[Nullable               ] public int?     SupplierID      { get; set; } // int(10)
+		[Nullable               ] public int?     CategoryID      { get; set; } // int(10)
+		[Nullable               ] public string   QuantityPerUnit { get; set; } // nvarchar(20)
+		[Nullable               ] public decimal? UnitPrice       { get; set; } // money(19,4)
+		[Nullable               ] public short?   UnitsInStock    { get; set; } // smallint(5)
+		[Nullable               ] public short?   UnitsOnOrder    { get; set; } // smallint(5)
+		[Nullable               ] public short?   ReorderLevel    { get; set; } // smallint(5)
+		                          public bool     Discontinued    { get; set; } // bit
+
+		// FK_Products_Suppliers
+		[Association(ThisKey="SupplierID", OtherKey="SupplierID", CanBeNull=true)]
+		public Suppliers Suppliers { get; set; }
+
+		// FK_Products_Categories
+		[Association(ThisKey="CategoryID", OtherKey="CategoryID", CanBeNull=true)]
+		public Categories Categories { get; set; }
+
+		// FK_Order_Details_Products_BackReference
+		[Association(ThisKey="ProductID", OtherKey="ProductID", CanBeNull=true)]
+		public IEnumerable<OrderDetails> OrderDetailss { get; set; }
+	}
+
+	// View
+	[TableName(Name="Products Above Average Price")]
+	public partial class ProductsAboveAveragePrice
+	{
+		           public string   ProductName { get; set; } // nvarchar(40)
+		[Nullable] public decimal? UnitPrice   { get; set; } // money(19,4)
+	}
+
+	// View
+	[TableName(Name="Products by Category")]
+	public partial class ProductsByCategory
+	{
+		           public string CategoryName    { get; set; } // nvarchar(15)
+		           public string ProductName     { get; set; } // nvarchar(40)
+		[Nullable] public string QuantityPerUnit { get; set; } // nvarchar(20)
+		[Nullable] public short? UnitsInStock    { get; set; } // smallint(5)
+		           public bool   Discontinued    { get; set; } // bit
+	}
+
+	// View
+	[TableName(Name="Quarterly Orders")]
+	public partial class QuarterlyOrders
+	{
+		[Nullable] public string CustomerID  { get; set; } // nchar(5)
+		[Nullable] public string CompanyName { get; set; } // nvarchar(40)
+		[Nullable] public string City        { get; set; } // nvarchar(15)
+		[Nullable] public string Country     { get; set; } // nvarchar(15)
+	}
+
+	[TableName(Name="Region")]
+	public partial class Region
+	{
+		[PrimaryKey(1)] public int    RegionID          { get; set; } // int(10)
+		                public string RegionDescription { get; set; } // nchar(50)
+
+		// FK_Territories_Region_BackReference
+		[Association(ThisKey="RegionID", OtherKey="RegionID", CanBeNull=true)]
+		public IEnumerable<Territories> Territoriess { get; set; }
+	}
+
+	// View
+	[TableName(Name="Sales by Category")]
+	public partial class SalesByCategory
+	{
+		           public int      CategoryID   { get; set; } // int(10)
+		           public string   CategoryName { get; set; } // nvarchar(15)
+		           public string   ProductName  { get; set; } // nvarchar(40)
+		[Nullable] public decimal? ProductSales { get; set; } // money(19,4)
+	}
+
+	// View
+	[TableName(Name="Sales Totals by Amount")]
+	public partial class SalesTotalsByAmount
+	{
+		[Nullable] public decimal?  SaleAmount  { get; set; } // money(19,4)
+		           public int       OrderID     { get; set; } // int(10)
+		           public string    CompanyName { get; set; } // nvarchar(40)
+		[Nullable] public DateTime? ShippedDate { get; set; } // datetime(3)
+	}
+
+	[TableName(Name="Shippers")]
+	public partial class Shippers
+	{
+		[Identity, PrimaryKey(1)] public int    ShipperID   { get; set; } // int(10)
+		                          public string CompanyName { get; set; } // nvarchar(40)
+		[Nullable               ] public string Phone       { get; set; } // nvarchar(24)
+
+		// FK_Orders_Shippers_BackReference
+		[Association(ThisKey="ShipperID", OtherKey="ShipVia", CanBeNull=true)]
+		public IEnumerable<Orders> Orderss { get; set; }
+	}
+
+	// View
+	[TableName(Name="Summary of Sales by Quarter")]
+	public partial class SummaryOfSalesByQuarter
+	{
+		[Nullable] public DateTime? ShippedDate { get; set; } // datetime(3)
+		           public int       OrderID     { get; set; } // int(10)
+		[Nullable] public decimal?  Subtotal    { get; set; } // money(19,4)
+	}
+
+	// View
+	[TableName(Name="Summary of Sales by Year")]
+	public partial class SummaryOfSalesByYear
+	{
+		[Nullable] public DateTime? ShippedDate { get; set; } // datetime(3)
+		           public int       OrderID     { get; set; } // int(10)
+		[Nullable] public decimal?  Subtotal    { get; set; } // money(19,4)
+	}
+
+	[TableName(Name="Suppliers")]
+	public partial class Suppliers
+	{
+		[Identity, PrimaryKey(1)] public int    SupplierID   { get; set; } // int(10)
+		                          public string CompanyName  { get; set; } // nvarchar(40)
+		[Nullable               ] public string ContactName  { get; set; } // nvarchar(30)
+		[Nullable               ] public string ContactTitle { get; set; } // nvarchar(30)
+		[Nullable               ] public string Address      { get; set; } // nvarchar(60)
+		[Nullable               ] public string City         { get; set; } // nvarchar(15)
+		[Nullable               ] public string Region       { get; set; } // nvarchar(15)
+		[Nullable               ] public string PostalCode   { get; set; } // nvarchar(10)
+		[Nullable               ] public string Country      { get; set; } // nvarchar(15)
+		[Nullable               ] public string Phone        { get; set; } // nvarchar(24)
+		[Nullable               ] public string Fax          { get; set; } // nvarchar(24)
+		[Nullable               ] public string HomePage     { get; set; } // ntext(1073741823)
+
+		// FK_Products_Suppliers_BackReference
+		[Association(ThisKey="SupplierID", OtherKey="SupplierID", CanBeNull=true)]
+		public IEnumerable<Products> Productss { get; set; }
+	}
+
+	[TableName(Name="Territories")]
+	public partial class Territories
+	{
+		[PrimaryKey(1)] public string TerritoryID          { get; set; } // nvarchar(20)
+		                public string TerritoryDescription { get; set; } // nchar(50)
+		                public int    RegionID             { get; set; } // int(10)
+
+		// FK_Territories_Region
+		[Association(ThisKey="RegionID", OtherKey="RegionID", CanBeNull=false)]
+		public Region Region { get; set; }
+
+		// FK_EmployeeTerritories_Territories_BackReference
+		[Association(ThisKey="TerritoryID", OtherKey="TerritoryID", CanBeNull=true)]
+		public IEnumerable<EmployeeTerritories> EmployeeTerritoriess { get; set; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Silverlight/Client.Web/DataModel.tt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+<#@ template debug="True" hostspecific="True" #>
+<#@ output extension=".generated.cs" #>
+<#@ include file="$(SolutionDir)\Source\Templates\BLToolkit.ttinclude"   #>
+<#@ include file="$(SolutionDir)\Source\Templates\MSSQL.ttinclude"       #>
+<#
+	ConnectionString = "Server=.;Database=Northwind;Integrated Security=SSPI";
+
+	Namespace            = "Client";
+	DataContextName      = "DataModel";
+
+	Usings.Add("BLToolkit.ServiceModel");
+	Usings.Add("System.ServiceModel");
+
+	GenerateModel();
+#>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Silverlight/Client.Web/LinqWebService.asmx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1 @@
+<%@ WebService Language="C#" CodeBehind="LinqWebService.asmx.cs" Class="Client.Web.LinqWebService" %>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Silverlight/Client.Web/LinqWebService.asmx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,22 @@
+using System;
+using System.Web.Services;
+
+using BLToolkit.ServiceModel;
+
+namespace Client.Web
+{
+	[WebService(Namespace = "http://tempuri.org/")]
+	[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
+	public class LinqWebService : LinqService
+	{
+		public override BLToolkit.Data.Linq.IDataContext CreateDataContext()
+		{
+			return new DataModel();
+		}
+
+		protected override void ValidateQuery(LinqServiceQuery query)
+		{
+			//base.ValidateQuery(query);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Silverlight/Client.Web/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,35 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Client.Web")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("Client.Web")]
+[assembly: AssemblyCopyright("Copyright © Microsoft 2012")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("1f6edd10-7848-4e12-94bf-15b1fd341928")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Silverlight/Client.Web/Silverlight.js	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,2 @@
+//v2.0.30511.0
+if(!window.Silverlight)window.Silverlight={};Silverlight._silverlightCount=0;Silverlight.__onSilverlightInstalledCalled=false;Silverlight.fwlinkRoot="http://go2.microsoft.com/fwlink/?LinkID=";Silverlight.__installationEventFired=false;Silverlight.onGetSilverlight=null;Silverlight.onSilverlightInstalled=function(){window.location.reload(false)};Silverlight.isInstalled=function(b){if(b==undefined)b=null;var a=false,m=null;try{var i=null,j=false;if(window.ActiveXObject)try{i=new ActiveXObject("AgControl.AgControl");if(b===null)a=true;else if(i.IsVersionSupported(b))a=true;i=null}catch(l){j=true}else j=true;if(j){var k=navigator.plugins["Silverlight Plug-In"];if(k)if(b===null)a=true;else{var h=k.description;if(h==="1.0.30226.2")h="2.0.30226.2";var c=h.split(".");while(c.length>3)c.pop();while(c.length<4)c.push(0);var e=b.split(".");while(e.length>4)e.pop();var d,g,f=0;do{d=parseInt(e[f]);g=parseInt(c[f]);f++}while(f<e.length&&d===g);if(d<=g&&!isNaN(d))a=true}}}catch(l){a=false}return a};Silverlight.WaitForInstallCompletion=function(){if(!Silverlight.isBrowserRestartRequired&&Silverlight.onSilverlightInstalled){try{navigator.plugins.refresh()}catch(a){}if(Silverlight.isInstalled(null)&&!Silverlight.__onSilverlightInstalledCalled){Silverlight.onSilverlightInstalled();Silverlight.__onSilverlightInstalledCalled=true}else setTimeout(Silverlight.WaitForInstallCompletion,3e3)}};Silverlight.__startup=function(){navigator.plugins.refresh();Silverlight.isBrowserRestartRequired=Silverlight.isInstalled(null);if(!Silverlight.isBrowserRestartRequired){Silverlight.WaitForInstallCompletion();if(!Silverlight.__installationEventFired){Silverlight.onInstallRequired();Silverlight.__installationEventFired=true}}else if(window.navigator.mimeTypes){var b=navigator.mimeTypes["application/x-silverlight-2"],c=navigator.mimeTypes["application/x-silverlight-2-b2"],d=navigator.mimeTypes["application/x-silverlight-2-b1"],a=d;if(c)a=c;if(!b&&(d||c)){if(!Silverlight.__installationEventFired){Silverlight.onUpgradeRequired();Silverlight.__installationEventFired=true}}else if(b&&a)if(b.enabledPlugin&&a.enabledPlugin)if(b.enabledPlugin.description!=a.enabledPlugin.description)if(!Silverlight.__installationEventFired){Silverlight.onRestartRequired();Silverlight.__installationEventFired=true}}if(!Silverlight.disableAutoStartup)if(window.removeEventListener)window.removeEventListener("load",Silverlight.__startup,false);else window.detachEvent("onload",Silverlight.__startup)};if(!Silverlight.disableAutoStartup)if(window.addEventListener)window.addEventListener("load",Silverlight.__startup,false);else window.attachEvent("onload",Silverlight.__startup);Silverlight.createObject=function(m,f,e,k,l,h,j){var d={},a=k,c=l;d.version=a.version;a.source=m;d.alt=a.alt;if(h)a.initParams=h;if(a.isWindowless&&!a.windowless)a.windowless=a.isWindowless;if(a.framerate&&!a.maxFramerate)a.maxFramerate=a.framerate;if(e&&!a.id)a.id=e;delete a.ignoreBrowserVer;delete a.inplaceInstallPrompt;delete a.version;delete a.isWindowless;delete a.framerate;delete a.data;delete a.src;delete a.alt;if(Silverlight.isInstalled(d.version)){for(var b in c)if(c[b]){if(b=="onLoad"&&typeof c[b]=="function"&&c[b].length!=1){var i=c[b];c[b]=function(a){return i(document.getElementById(e),j,a)}}var g=Silverlight.__getHandlerName(c[b]);if(g!=null){a[b]=g;c[b]=null}else throw"typeof events."+b+" must be 'function' or 'string'";}slPluginHTML=Silverlight.buildHTML(a)}else slPluginHTML=Silverlight.buildPromptHTML(d);if(f)f.innerHTML=slPluginHTML;else return slPluginHTML};Silverlight.buildHTML=function(a){var b=[];b.push('<object type="application/x-silverlight" data="data:application/x-silverlight,"');if(a.id!=null)b.push(' id="'+Silverlight.HtmlAttributeEncode(a.id)+'"');if(a.width!=null)b.push(' width="'+a.width+'"');if(a.height!=null)b.push(' height="'+a.height+'"');b.push(" >");delete a.id;delete a.width;delete a.height;for(var c in a)if(a[c])b.push('<param name="'+Silverlight.HtmlAttributeEncode(c)+'" value="'+Silverlight.HtmlAttributeEncode(a[c])+'" />');b.push("</object>");return b.join("")};Silverlight.createObjectEx=function(b){var a=b,c=Silverlight.createObject(a.source,a.parentElement,a.id,a.properties,a.events,a.initParams,a.context);if(a.parentElement==null)return c};Silverlight.buildPromptHTML=function(b){var a="",d=Silverlight.fwlinkRoot,c=b.version;if(b.alt)a=b.alt;else{if(!c)c="";a="<a href='javascript:Silverlight.getSilverlight(\"{1}\");' style='text-decoration: none;'><img src='{2}' alt='Get Microsoft Silverlight' style='border-style: none'/></a>";a=a.replace("{1}",c);a=a.replace("{2}",d+"108181")}return a};Silverlight.getSilverlight=function(e){if(Silverlight.onGetSilverlight)Silverlight.onGetSilverlight();var b="",a=String(e).split(".");if(a.length>1){var c=parseInt(a[0]);if(isNaN(c)||c<2)b="1.0";else b=a[0]+"."+a[1]}var d="";if(b.match(/^\d+\056\d+$/))d="&v="+b;Silverlight.followFWLink("149156"+d)};Silverlight.followFWLink=function(a){top.location=Silverlight.fwlinkRoot+String(a)};Silverlight.HtmlAttributeEncode=function(c){var a,b="";if(c==null)return null;for(var d=0;d<c.length;d++){a=c.charCodeAt(d);if(a>96&&a<123||a>64&&a<91||a>43&&a<58&&a!=47||a==95)b=b+String.fromCharCode(a);else b=b+"&#"+a+";"}return b};Silverlight.default_error_handler=function(e,b){var d,c=b.ErrorType;d=b.ErrorCode;var a="\nSilverlight error message     \n";a+="ErrorCode: "+d+"\n";a+="ErrorType: "+c+"       \n";a+="Message: "+b.ErrorMessage+"     \n";if(c=="ParserError"){a+="XamlFile: "+b.xamlFile+"     \n";a+="Line: "+b.lineNumber+"     \n";a+="Position: "+b.charPosition+"     \n"}else if(c=="RuntimeError"){if(b.lineNumber!=0){a+="Line: "+b.lineNumber+"     \n";a+="Position: "+b.charPosition+"     \n"}a+="MethodName: "+b.methodName+"     \n"}alert(a)};Silverlight.__cleanup=function(){for(var a=Silverlight._silverlightCount-1;a>=0;a--)window["__slEvent"+a]=null;Silverlight._silverlightCount=0;if(window.removeEventListener)window.removeEventListener("unload",Silverlight.__cleanup,false);else window.detachEvent("onunload",Silverlight.__cleanup)};Silverlight.__getHandlerName=function(b){var a="";if(typeof b=="string")a=b;else if(typeof b=="function"){if(Silverlight._silverlightCount==0)if(window.addEventListener)window.addEventListener("onunload",Silverlight.__cleanup,false);else window.attachEvent("onunload",Silverlight.__cleanup);var c=Silverlight._silverlightCount++;a="__slEvent"+c;window[a]=b}else a=null;return a};Silverlight.onRequiredVersionAvailable=function(){};Silverlight.onRestartRequired=function(){};Silverlight.onUpgradeRequired=function(){};Silverlight.onInstallRequired=function(){};Silverlight.IsVersionAvailableOnError=function(d,a){var b=false;try{if(a.ErrorCode==8001&&!Silverlight.__installationEventFired){Silverlight.onUpgradeRequired();Silverlight.__installationEventFired=true}else if(a.ErrorCode==8002&&!Silverlight.__installationEventFired){Silverlight.onRestartRequired();Silverlight.__installationEventFired=true}else if(a.ErrorCode==5014||a.ErrorCode==2106){if(Silverlight.__verifySilverlight2UpgradeSuccess(a.getHost()))b=true}else b=true}catch(c){}return b};Silverlight.IsVersionAvailableOnLoad=function(b){var a=false;try{if(Silverlight.__verifySilverlight2UpgradeSuccess(b.getHost()))a=true}catch(c){}return a};Silverlight.__verifySilverlight2UpgradeSuccess=function(d){var c=false,b="2.0.31005",a=null;try{if(d.IsVersionSupported(b+".99")){a=Silverlight.onRequiredVersionAvailable;c=true}else if(d.IsVersionSupported(b+".0"))a=Silverlight.onRestartRequired;else a=Silverlight.onUpgradeRequired;if(a&&!Silverlight.__installationEventFired){a();Silverlight.__installationEventFired=true}}catch(e){}return c}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Silverlight/Client.Web/Web.Debug.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+
+<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->
+
+<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
+	<!--
+		In the example below, the "SetAttributes" transform will change the value of 
+		"connectionString" to use "ReleaseSQLServer" only when the "Match" locator 
+		finds an atrribute "name" that has a value of "MyDB".
+
+		<connectionStrings>
+		<add name="MyDB" 
+			connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" 
+			xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
+		</connectionStrings>
+	-->
+	<system.web>
+		<!--
+			In the example below, the "Replace" transform will replace the entire 
+			<customErrors> section of your web.config file.
+			Note that because there is only one customErrors section under the 
+			<system.web> node, there is no need to use the "xdt:Locator" attribute.
+
+			<customErrors defaultRedirect="GenericError.htm"
+				mode="RemoteOnly" xdt:Transform="Replace">
+				<error statusCode="500" redirect="InternalError.htm"/>
+			</customErrors>
+		-->
+	</system.web>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Silverlight/Client.Web/Web.Release.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+
+<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->
+
+<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
+	<!--
+		In the example below, the "SetAttributes" transform will change the value of 
+		"connectionString" to use "ReleaseSQLServer" only when the "Match" locator 
+		finds an atrribute "name" that has a value of "MyDB".
+
+		<connectionStrings>
+		<add name="MyDB" 
+			connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" 
+			xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
+		</connectionStrings>
+	-->
+	<system.web>
+		<compilation xdt:Transform="RemoveAttributes(debug)" />
+		<!--
+			In the example below, the "Replace" transform will replace the entire 
+			<customErrors> section of your web.config file.
+			Note that because there is only one customErrors section under the 
+			<system.web> node, there is no need to use the "xdt:Locator" attribute.
+
+			<customErrors defaultRedirect="GenericError.htm"
+				mode="RemoteOnly" xdt:Transform="Replace">
+				<error statusCode="500" redirect="InternalError.htm"/>
+			</customErrors>
+		-->
+	</system.web>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Silverlight/Client.Web/Web.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<configuration>
+	<system.web>
+		<compilation debug="true" targetFramework="4.0" />
+	</system.web>
+
+	<system.serviceModel>
+		<behaviors>
+			<serviceBehaviors>
+				<behavior name="">
+					<serviceMetadata httpGetEnabled="true" />
+					<serviceDebug includeExceptionDetailInFaults="true" />
+				</behavior>
+			</serviceBehaviors>
+		</behaviors>
+		<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
+	</system.serviceModel>
+
+	<connectionStrings>
+		<add name="Northwind" connectionString="Server=.;Database=Northwind;Integrated Security=SSPI" providerName="System.Data.SqlClient" />
+	</connectionStrings>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Silverlight/Client/App.xaml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
+             x:Class="Client.App"
+             >
+    <Application.Resources>
+        
+    </Application.Resources>
+</Application>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Silverlight/Client/App.xaml.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,68 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Animation;
+using System.Windows.Shapes;
+
+namespace Client
+{
+	public partial class App : Application
+	{
+
+		public App()
+		{
+			this.Startup += this.Application_Startup;
+			this.Exit += this.Application_Exit;
+			this.UnhandledException += this.Application_UnhandledException;
+
+			InitializeComponent();
+		}
+
+		private void Application_Startup(object sender, StartupEventArgs e)
+		{
+			this.RootVisual = new MainPage();
+		}
+
+		private void Application_Exit(object sender, EventArgs e)
+		{
+
+		}
+
+		private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
+		{
+			// If the app is running outside of the debugger then report the exception using
+			// the browser's exception mechanism. On IE this will display it a yellow alert 
+			// icon in the status bar and Firefox will display a script error.
+			if (!System.Diagnostics.Debugger.IsAttached)
+			{
+
+				// NOTE: This will allow the application to continue running after an exception has been thrown
+				// but not handled. 
+				// For production applications this error handling should be replaced with something that will 
+				// report the error to the website and stop the application.
+				e.Handled = true;
+				Deployment.Current.Dispatcher.BeginInvoke(delegate { ReportErrorToDOM(e); });
+			}
+		}
+
+		private void ReportErrorToDOM(ApplicationUnhandledExceptionEventArgs e)
+		{
+			try
+			{
+				string errorMsg = e.ExceptionObject.Message + e.ExceptionObject.StackTrace;
+				errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n");
+
+				System.Windows.Browser.HtmlPage.Window.Eval("throw new Error(\"Unhandled Error in Silverlight Application " + errorMsg + "\");");
+			}
+			catch (Exception)
+			{
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Silverlight/Client/Client.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.50727</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{28693777-369C-4C0D-B076-38F7C0E5D06C}</ProjectGuid>
+    <ProjectTypeGuids>{A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Client</RootNamespace>
+    <AssemblyName>Client</AssemblyName>
+    <TargetFrameworkIdentifier>Silverlight</TargetFrameworkIdentifier>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>
+    <SilverlightApplication>true</SilverlightApplication>
+    <SupportedCultures>
+    </SupportedCultures>
+    <XapOutputs>true</XapOutputs>
+    <GenerateSilverlightManifest>true</GenerateSilverlightManifest>
+    <XapFilename>Client.xap</XapFilename>
+    <SilverlightManifestTemplate>Properties\AppManifest.xml</SilverlightManifestTemplate>
+    <SilverlightAppEntry>Client.App</SilverlightAppEntry>
+    <TestPageFileName>ClientTestPage.html</TestPageFileName>
+    <CreateTestPage>true</CreateTestPage>
+    <ValidateXaml>true</ValidateXaml>
+    <EnableOutOfBrowser>false</EnableOutOfBrowser>
+    <OutOfBrowserSettingsFile>Properties\OutOfBrowserSettings.xml</OutOfBrowserSettingsFile>
+    <UsePlatformExtensions>false</UsePlatformExtensions>
+    <ThrowErrorsInValidation>true</ThrowErrorsInValidation>
+    <LinkedServerProject>
+    </LinkedServerProject>
+  </PropertyGroup>
+  <!-- This property group is only here to support building this project using the 
+       MSBuild 3.5 toolset. In order to work correctly with this older toolset, it needs 
+       to set the TargetFrameworkVersion to v3.5 -->
+  <PropertyGroup Condition="'$(MSBuildToolsVersion)' == '3.5'">
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>Bin\Debug</OutputPath>
+    <DefineConstants>DEBUG;TRACE;SILVERLIGHT</DefineConstants>
+    <NoStdLib>true</NoStdLib>
+    <NoConfig>true</NoConfig>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>Bin\Release</OutputPath>
+    <DefineConstants>TRACE;SILVERLIGHT</DefineConstants>
+    <NoStdLib>true</NoStdLib>
+    <NoConfig>true</NoConfig>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>DEBUG;TRACE;SILVERLIGHT</DefineConstants>
+    <NoStdLib>true</NoStdLib>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>Bin\Debug\Client.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+    <NoConfig>true</NoConfig>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE;SILVERLIGHT</DefineConstants>
+    <Optimize>true</Optimize>
+    <NoStdLib>true</NoStdLib>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>Bin\Release\Client.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+    <NoConfig>true</NoConfig>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="mscorlib" />
+    <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.ServiceModel" />
+    <Reference Include="System.ServiceModel.Extensions, Version=2.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
+    <Reference Include="System.Windows" />
+    <Reference Include="system" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Net" />
+    <Reference Include="System.Windows.Controls.Data.Input, Version=2.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Windows.Browser" />
+    <Reference Include="System.Xml.Serialization, Version=2.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="App.xaml.cs">
+      <DependentUpon>App.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="DataModel.generated.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>DataModel.tt</DependentUpon>
+    </Compile>
+    <Compile Include="MainPage.xaml.cs">
+      <DependentUpon>MainPage.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ApplicationDefinition Include="App.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </ApplicationDefinition>
+    <Page Include="MainPage.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="DataModel.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>DataModel.generated.cs</LastGenOutput>
+    </None>
+    <None Include="Properties\AppManifest.xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\Source\BLToolkit.SL.4.csproj">
+      <Project>{663D4BFC-F565-41F7-9409-510B560CCEE8}</Project>
+      <Name>BLToolkit.SL.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
+  </ItemGroup>
+  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Silverlight\$(SilverlightVersion)\Microsoft.Silverlight.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <ProjectExtensions>
+    <VisualStudio>
+      <FlavorProperties GUID="{A1591282-1198-4647-A2B1-27E5FF5F6F3B}">
+        <SilverlightProjectProperties />
+      </FlavorProperties>
+    </VisualStudio>
+  </ProjectExtensions>
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Silverlight/Client/DataModel.generated.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,640 @@
+//---------------------------------------------------------------------------------------------------
+// <auto-generated>
+//    This code was generated by BLToolkit template for T4.
+//    Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
+// </auto-generated>
+//---------------------------------------------------------------------------------------------------
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+using System.ServiceModel;
+using System.Text;
+
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using BLToolkit.Data.Sql;
+using BLToolkit.Data.Sql.SqlProvider;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+using BLToolkit.ServiceModel;
+
+namespace Client
+{
+	public partial class DataModel : SoapDataContext
+	{
+		public Table<AlphabeticalListOfProducts> AlphabeticalListOfProducts { get { return this.GetTable<AlphabeticalListOfProducts>(); } }
+		/// <summary>
+		/// Description for Categories table.
+		/// </summary>
+		public Table<Categories>                 Categories                 { get { return this.GetTable<Categories>();                 } }
+		public Table<CategorySalesFor1997>       CategorySalesFor1997       { get { return this.GetTable<CategorySalesFor1997>();       } }
+		public Table<CurrentProductList>         CurrentProductList         { get { return this.GetTable<CurrentProductList>();         } }
+		public Table<CustomerAndSuppliersByCity> CustomerAndSuppliersByCity { get { return this.GetTable<CustomerAndSuppliersByCity>(); } }
+		public Table<CustomerCustomerDemo>       CustomerCustomerDemo       { get { return this.GetTable<CustomerCustomerDemo>();       } }
+		public Table<CustomerDemographics>       CustomerDemographics       { get { return this.GetTable<CustomerDemographics>();       } }
+		/// <summary>
+		/// Description of Customers table.
+		/// </summary>
+		public Table<Customers>                  Customers                  { get { return this.GetTable<Customers>();                  } }
+		public Table<Employees>                  Employees                  { get { return this.GetTable<Employees>();                  } }
+		public Table<EmployeeTerritories>        EmployeeTerritories        { get { return this.GetTable<EmployeeTerritories>();        } }
+		public Table<Invoices>                   Invoices                   { get { return this.GetTable<Invoices>();                   } }
+		public Table<OrderDetails>               OrderDetails               { get { return this.GetTable<OrderDetails>();               } }
+		public Table<OrderDetailsExtended>       OrderDetailsExtended       { get { return this.GetTable<OrderDetailsExtended>();       } }
+		public Table<OrderSubtotals>             OrderSubtotals             { get { return this.GetTable<OrderSubtotals>();             } }
+		public Table<Orders>                     Orders                     { get { return this.GetTable<Orders>();                     } }
+		public Table<OrdersQry>                  OrdersQry                  { get { return this.GetTable<OrdersQry>();                  } }
+		public Table<ProductSalesFor1997>        ProductSalesFor1997        { get { return this.GetTable<ProductSalesFor1997>();        } }
+		public Table<Products>                   Products                   { get { return this.GetTable<Products>();                   } }
+		public Table<ProductsAboveAveragePrice>  ProductsAboveAveragePrice  { get { return this.GetTable<ProductsAboveAveragePrice>();  } }
+		public Table<ProductsByCategory>         ProductsByCategory         { get { return this.GetTable<ProductsByCategory>();         } }
+		public Table<QuarterlyOrders>            QuarterlyOrders            { get { return this.GetTable<QuarterlyOrders>();            } }
+		public Table<Region>                     Region                     { get { return this.GetTable<Region>();                     } }
+		public Table<SalesByCategory>            SalesByCategory            { get { return this.GetTable<SalesByCategory>();            } }
+		public Table<SalesTotalsByAmount>        SalesTotalsByAmount        { get { return this.GetTable<SalesTotalsByAmount>();        } }
+		public Table<Shippers>                   Shippers                   { get { return this.GetTable<Shippers>();                   } }
+		public Table<SummaryOfSalesByQuarter>    SummaryOfSalesByQuarter    { get { return this.GetTable<SummaryOfSalesByQuarter>();    } }
+		public Table<SummaryOfSalesByYear>       SummaryOfSalesByYear       { get { return this.GetTable<SummaryOfSalesByYear>();       } }
+		public Table<Suppliers>                  Suppliers                  { get { return this.GetTable<Suppliers>();                  } }
+		public Table<Territories>                Territories                { get { return this.GetTable<Territories>();                } }
+		
+		#region FreeTextTable
+		
+		public class FreeTextKey<T>
+		{
+			public T   Key;
+			public int Rank;
+		}
+		
+		class FreeTextTableExpressionAttribute : TableExpressionAttribute
+		{
+			public FreeTextTableExpressionAttribute()
+				: base("")
+			{
+			}
+		
+			public override void SetTable(SqlTable table, MemberInfo member, IEnumerable<Expression> expArgs, IEnumerable<ISqlExpression> sqlArgs)
+			{
+				var aargs  = sqlArgs.ToArray();
+				var arr    = ConvertArgs(member, aargs).ToList();
+				var method = (MethodInfo)member;
+				var sp     = new MsSql2008SqlProvider();
+		
+				{
+					var ttype  = method.GetGenericArguments()[0];
+					var tbl    = new SqlTable(ttype);
+		
+					var database     = tbl.Database     == null ? null : sp.Convert(tbl.Database,     ConvertType.NameToDatabase).  ToString();
+					var owner        = tbl.Owner        == null ? null : sp.Convert(tbl.Owner,        ConvertType.NameToOwner).     ToString();
+					var physicalName = tbl.PhysicalName == null ? null : sp.Convert(tbl.PhysicalName, ConvertType.NameToQueryTable).ToString();
+		
+					var name   = sp.BuildTableName(new StringBuilder(), database, owner, physicalName);
+		
+					arr.Add(new SqlExpression(name.ToString(), Precedence.Primary));
+				}
+		
+				{
+					var field = ((ConstantExpression)expArgs.First()).Value;
+		
+					if (field is string)
+					{
+						arr[0] = new SqlExpression(field.ToString(), Precedence.Primary);
+					}
+					else if (field is LambdaExpression)
+					{
+						var body = ((LambdaExpression)field).Body;
+		
+						if (body is MemberExpression)
+						{
+							var name = ((MemberExpression)body).Member.Name;
+		
+							name = sp.Convert(name, ConvertType.NameToQueryField).ToString();
+		
+							arr[0] = new SqlExpression(name, Precedence.Primary);
+						}
+					}
+				}
+		
+				table.SqlTableType   = SqlTableType.Expression;
+				table.Name           = "FREETEXTTABLE({6}, {2}, {3}) {1}";
+				table.TableArguments = arr.ToArray();
+			}
+		}
+		
+		[FreeTextTableExpressionAttribute]
+		public Table<FreeTextKey<TKey>> FreeTextTable<TTable,TKey>(string field, string text)
+		{
+			return this.GetTable<FreeTextKey<TKey>>(
+				this,
+				((MethodInfo)(MethodBase.GetCurrentMethod())).MakeGenericMethod(typeof(TTable), typeof(TKey)),
+				field,
+				text);
+		}
+		
+		[FreeTextTableExpressionAttribute]
+		public Table<FreeTextKey<TKey>> FreeTextTable<TTable,TKey>(Expression<Func<TTable,string>> fieldSelector, string text)
+		{
+			return this.GetTable<FreeTextKey<TKey>>(
+				this,
+				((MethodInfo)(MethodBase.GetCurrentMethod())).MakeGenericMethod(typeof(TTable), typeof(TKey)),
+				fieldSelector,
+				text);
+		}
+		
+		#endregion
+	}
+
+	// View
+	[TableName(Name="Alphabetical list of products")]
+	public partial class AlphabeticalListOfProducts
+	{
+		           public int      ProductID       { get; set; } // int(10)
+		           public string   ProductName     { get; set; } // nvarchar(40)
+		[Nullable] public int?     SupplierID      { get; set; } // int(10)
+		[Nullable] public int?     CategoryID      { get; set; } // int(10)
+		[Nullable] public string   QuantityPerUnit { get; set; } // nvarchar(20)
+		[Nullable] public decimal? UnitPrice       { get; set; } // money(19,4)
+		[Nullable] public short?   UnitsInStock    { get; set; } // smallint(5)
+		[Nullable] public short?   UnitsOnOrder    { get; set; } // smallint(5)
+		[Nullable] public short?   ReorderLevel    { get; set; } // smallint(5)
+		           public bool     Discontinued    { get; set; } // bit
+		           public string   CategoryName    { get; set; } // nvarchar(15)
+	}
+
+	/// <summary>
+	/// Description for Categories table.
+	/// </summary>
+	[TableName(Name="Categories")]
+	public partial class Categories
+	{
+		/// <summary>
+		/// Description of Categories.CategoryID field.
+		/// </summary>
+		[Identity, PrimaryKey(1)] public int    CategoryID   { get; set; } // int(10)
+		                          public string CategoryName { get; set; } // nvarchar(15)
+		[Nullable               ] public string Description  { get; set; } // ntext(1073741823)
+		[Nullable               ] public byte[] Picture      { get; set; } // image(2147483647)
+
+		// FK_Products_Categories_BackReference
+		[Association(ThisKey="CategoryID", OtherKey="CategoryID", CanBeNull=true)]
+		public IEnumerable<Products> Productss { get; set; }
+	}
+
+	// View
+	[TableName(Name="Category Sales for 1997")]
+	public partial class CategorySalesFor1997
+	{
+		           public string   CategoryName  { get; set; } // nvarchar(15)
+		[Nullable] public decimal? CategorySales { get; set; } // money(19,4)
+	}
+
+	// View
+	[TableName(Name="Current Product List")]
+	public partial class CurrentProductList
+	{
+		[Identity] public int    ProductID   { get; set; } // int(10)
+		           public string ProductName { get; set; } // nvarchar(40)
+	}
+
+	// View
+	[TableName(Name="Customer and Suppliers by City")]
+	public partial class CustomerAndSuppliersByCity
+	{
+		[Nullable] public string City         { get; set; } // nvarchar(15)
+		           public string CompanyName  { get; set; } // nvarchar(40)
+		[Nullable] public string ContactName  { get; set; } // nvarchar(30)
+		           public string Relationship { get; set; } // varchar(9)
+	}
+
+	[TableName(Name="CustomerCustomerDemo")]
+	public partial class CustomerCustomerDemo
+	{
+		[PrimaryKey(1)] public string CustomerID     { get; set; } // nchar(5)
+		[PrimaryKey(2)] public string CustomerTypeID { get; set; } // nchar(10)
+
+		// FK_CustomerCustomerDemo
+		[Association(ThisKey="CustomerTypeID", OtherKey="CustomerTypeID", CanBeNull=false)]
+		public CustomerDemographics FK_CustomerCustomerDemo { get; set; }
+
+		// FK_CustomerCustomerDemo_Customers
+		[Association(ThisKey="CustomerID", OtherKey="CustomerID", CanBeNull=false)]
+		public Customers Customers { get; set; }
+	}
+
+	[TableName(Name="CustomerDemographics")]
+	public partial class CustomerDemographics
+	{
+		[          PrimaryKey(1)] public string CustomerTypeID { get; set; } // nchar(10)
+		[Nullable               ] public string CustomerDesc   { get; set; } // ntext(1073741823)
+
+		// FK_CustomerCustomerDemo_BackReference
+		[Association(ThisKey="CustomerTypeID", OtherKey="CustomerTypeID", CanBeNull=true)]
+		public IEnumerable<CustomerCustomerDemo> CustomerCustomerDemos { get; set; }
+	}
+
+	/// <summary>
+	/// Description of Customers table.
+	/// </summary>
+	[TableName(Name="Customers")]
+	public partial class Customers
+	{
+		/// <summary>
+		/// Just ID.
+		/// </summary>
+		[          PrimaryKey(1)] public string CustomerID   { get; set; } // nchar(5)
+		/// <summary>
+		/// Name of the Company.
+		/// </summary>
+		                          public string CompanyName  { get; set; } // nvarchar(40)
+		[Nullable               ] public string ContactName  { get; set; } // nvarchar(30)
+		[Nullable               ] public string ContactTitle { get; set; } // nvarchar(30)
+		[Nullable               ] public string Address      { get; set; } // nvarchar(60)
+		[Nullable               ] public string City         { get; set; } // nvarchar(15)
+		[Nullable               ] public string Region       { get; set; } // nvarchar(15)
+		[Nullable               ] public string PostalCode   { get; set; } // nvarchar(10)
+		[Nullable               ] public string Country      { get; set; } // nvarchar(15)
+		[Nullable               ] public string Phone        { get; set; } // nvarchar(24)
+		[Nullable               ] public string Fax          { get; set; } // nvarchar(24)
+
+		// FK_Orders_Customers_BackReference
+		[Association(ThisKey="CustomerID", OtherKey="CustomerID", CanBeNull=true)]
+		public IEnumerable<Orders> Orderss { get; set; }
+
+		// FK_CustomerCustomerDemo_Customers_BackReference
+		[Association(ThisKey="CustomerID", OtherKey="CustomerID", CanBeNull=true)]
+		public IEnumerable<CustomerCustomerDemo> CustomerCustomerDemos { get; set; }
+	}
+
+	[TableName(Name="Employees")]
+	public partial class Employees
+	{
+		[Identity, PrimaryKey(1)] public int       EmployeeID      { get; set; } // int(10)
+		                          public string    LastName        { get; set; } // nvarchar(20)
+		                          public string    FirstName       { get; set; } // nvarchar(10)
+		[Nullable               ] public string    Title           { get; set; } // nvarchar(30)
+		[Nullable               ] public string    TitleOfCourtesy { get; set; } // nvarchar(25)
+		[Nullable               ] public DateTime? BirthDate       { get; set; } // datetime(3)
+		[Nullable               ] public DateTime? HireDate        { get; set; } // datetime(3)
+		[Nullable               ] public string    Address         { get; set; } // nvarchar(60)
+		[Nullable               ] public string    City            { get; set; } // nvarchar(15)
+		[Nullable               ] public string    Region          { get; set; } // nvarchar(15)
+		[Nullable               ] public string    PostalCode      { get; set; } // nvarchar(10)
+		[Nullable               ] public string    Country         { get; set; } // nvarchar(15)
+		[Nullable               ] public string    HomePhone       { get; set; } // nvarchar(24)
+		[Nullable               ] public string    Extension       { get; set; } // nvarchar(4)
+		[Nullable               ] public byte[]    Photo           { get; set; } // image(2147483647)
+		[Nullable               ] public string    Notes           { get; set; } // ntext(1073741823)
+		[Nullable               ] public int?      ReportsTo       { get; set; } // int(10)
+		[Nullable               ] public string    PhotoPath       { get; set; } // nvarchar(255)
+
+		// FK_Employees_Employees
+		[Association(ThisKey="ReportsTo", OtherKey="EmployeeID", CanBeNull=true)]
+		public Employees FK_Employees_Employees { get; set; }
+
+		// FK_Orders_Employees_BackReference
+		[Association(ThisKey="EmployeeID", OtherKey="EmployeeID", CanBeNull=true)]
+		public IEnumerable<Orders> Orderss { get; set; }
+
+		// FK_EmployeeTerritories_Employees_BackReference
+		[Association(ThisKey="EmployeeID", OtherKey="EmployeeID", CanBeNull=true)]
+		public IEnumerable<EmployeeTerritories> EmployeeTerritoriess { get; set; }
+
+		// FK_Employees_Employees_BackReference
+		[Association(ThisKey="EmployeeID", OtherKey="ReportsTo", CanBeNull=true)]
+		public IEnumerable<Employees> FK_Employees_Employees_BackReference { get; set; }
+	}
+
+	[TableName(Name="EmployeeTerritories")]
+	public partial class EmployeeTerritories
+	{
+		[PrimaryKey(1)] public int    EmployeeID  { get; set; } // int(10)
+		[PrimaryKey(2)] public string TerritoryID { get; set; } // nvarchar(20)
+
+		// FK_EmployeeTerritories_Employees
+		[Association(ThisKey="EmployeeID", OtherKey="EmployeeID", CanBeNull=false)]
+		public Employees Employees { get; set; }
+
+		// FK_EmployeeTerritories_Territories
+		[Association(ThisKey="TerritoryID", OtherKey="TerritoryID", CanBeNull=false)]
+		public Territories Territories { get; set; }
+	}
+
+	// View
+	[TableName(Name="Invoices")]
+	public partial class Invoices
+	{
+		[Nullable] public string    ShipName       { get; set; } // nvarchar(40)
+		[Nullable] public string    ShipAddress    { get; set; } // nvarchar(60)
+		[Nullable] public string    ShipCity       { get; set; } // nvarchar(15)
+		[Nullable] public string    ShipRegion     { get; set; } // nvarchar(15)
+		[Nullable] public string    ShipPostalCode { get; set; } // nvarchar(10)
+		[Nullable] public string    ShipCountry    { get; set; } // nvarchar(15)
+		[Nullable] public string    CustomerID     { get; set; } // nchar(5)
+		           public string    CustomerName   { get; set; } // nvarchar(40)
+		[Nullable] public string    Address        { get; set; } // nvarchar(60)
+		[Nullable] public string    City           { get; set; } // nvarchar(15)
+		[Nullable] public string    Region         { get; set; } // nvarchar(15)
+		[Nullable] public string    PostalCode     { get; set; } // nvarchar(10)
+		[Nullable] public string    Country        { get; set; } // nvarchar(15)
+		           public string    Salesperson    { get; set; } // nvarchar(31)
+		           public int       OrderID        { get; set; } // int(10)
+		[Nullable] public DateTime? OrderDate      { get; set; } // datetime(3)
+		[Nullable] public DateTime? RequiredDate   { get; set; } // datetime(3)
+		[Nullable] public DateTime? ShippedDate    { get; set; } // datetime(3)
+		           public string    ShipperName    { get; set; } // nvarchar(40)
+		           public int       ProductID      { get; set; } // int(10)
+		           public string    ProductName    { get; set; } // nvarchar(40)
+		           public decimal   UnitPrice      { get; set; } // money(19,4)
+		           public short     Quantity       { get; set; } // smallint(5)
+		           public float     Discount       { get; set; } // real(24)
+		[Nullable] public decimal?  ExtendedPrice  { get; set; } // money(19,4)
+		[Nullable] public decimal?  Freight        { get; set; } // money(19,4)
+	}
+
+	[TableName(Name="Order Details")]
+	public partial class OrderDetails
+	{
+		[PrimaryKey(1)] public int     OrderID   { get; set; } // int(10)
+		[PrimaryKey(2)] public int     ProductID { get; set; } // int(10)
+		                public decimal UnitPrice { get; set; } // money(19,4)
+		                public short   Quantity  { get; set; } // smallint(5)
+		                public float   Discount  { get; set; } // real(24)
+
+		// FK_Order_Details_Orders
+		[Association(ThisKey="OrderID", OtherKey="OrderID", CanBeNull=false)]
+		public Orders OrderDetailsOrders { get; set; }
+
+		// FK_Order_Details_Products
+		[Association(ThisKey="ProductID", OtherKey="ProductID", CanBeNull=false)]
+		public Products OrderDetailsProducts { get; set; }
+	}
+
+	// View
+	[TableName(Name="Order Details Extended")]
+	public partial class OrderDetailsExtended
+	{
+		           public int      OrderID       { get; set; } // int(10)
+		           public int      ProductID     { get; set; } // int(10)
+		           public string   ProductName   { get; set; } // nvarchar(40)
+		           public decimal  UnitPrice     { get; set; } // money(19,4)
+		           public short    Quantity      { get; set; } // smallint(5)
+		           public float    Discount      { get; set; } // real(24)
+		[Nullable] public decimal? ExtendedPrice { get; set; } // money(19,4)
+	}
+
+	// View
+	[TableName(Name="Order Subtotals")]
+	public partial class OrderSubtotals
+	{
+		           public int      OrderID  { get; set; } // int(10)
+		[Nullable] public decimal? Subtotal { get; set; } // money(19,4)
+	}
+
+	[TableName(Name="Orders")]
+	public partial class Orders
+	{
+		[Identity, PrimaryKey(1)] public int       OrderID        { get; set; } // int(10)
+		[Nullable               ] public string    CustomerID     { get; set; } // nchar(5)
+		[Nullable               ] public int?      EmployeeID     { get; set; } // int(10)
+		[Nullable               ] public DateTime? OrderDate      { get; set; } // datetime(3)
+		[Nullable               ] public DateTime? RequiredDate   { get; set; } // datetime(3)
+		[Nullable               ] public DateTime? ShippedDate    { get; set; } // datetime(3)
+		[Nullable               ] public int?      ShipVia        { get; set; } // int(10)
+		[Nullable               ] public decimal?  Freight        { get; set; } // money(19,4)
+		[Nullable               ] public string    ShipName       { get; set; } // nvarchar(40)
+		[Nullable               ] public string    ShipAddress    { get; set; } // nvarchar(60)
+		[Nullable               ] public string    ShipCity       { get; set; } // nvarchar(15)
+		[Nullable               ] public string    ShipRegion     { get; set; } // nvarchar(15)
+		[Nullable               ] public string    ShipPostalCode { get; set; } // nvarchar(10)
+		[Nullable               ] public string    ShipCountry    { get; set; } // nvarchar(15)
+
+		// FK_Orders_Shippers
+		[Association(ThisKey="ShipVia", OtherKey="ShipperID", CanBeNull=true)]
+		public Shippers Shippers { get; set; }
+
+		// FK_Orders_Employees
+		[Association(ThisKey="EmployeeID", OtherKey="EmployeeID", CanBeNull=true)]
+		public Employees Employees { get; set; }
+
+		// FK_Orders_Customers
+		[Association(ThisKey="CustomerID", OtherKey="CustomerID", CanBeNull=true)]
+		public Customers Customers { get; set; }
+
+		// FK_Order_Details_Orders_BackReference
+		[Association(ThisKey="OrderID", OtherKey="OrderID", CanBeNull=true)]
+		public IEnumerable<OrderDetails> OrderDetailss { get; set; }
+	}
+
+	// View
+	[TableName(Name="Orders Qry")]
+	public partial class OrdersQry
+	{
+		           public int       OrderID        { get; set; } // int(10)
+		[Nullable] public string    CustomerID     { get; set; } // nchar(5)
+		[Nullable] public int?      EmployeeID     { get; set; } // int(10)
+		[Nullable] public DateTime? OrderDate      { get; set; } // datetime(3)
+		[Nullable] public DateTime? RequiredDate   { get; set; } // datetime(3)
+		[Nullable] public DateTime? ShippedDate    { get; set; } // datetime(3)
+		[Nullable] public int?      ShipVia        { get; set; } // int(10)
+		[Nullable] public decimal?  Freight        { get; set; } // money(19,4)
+		[Nullable] public string    ShipName       { get; set; } // nvarchar(40)
+		[Nullable] public string    ShipAddress    { get; set; } // nvarchar(60)
+		[Nullable] public string    ShipCity       { get; set; } // nvarchar(15)
+		[Nullable] public string    ShipRegion     { get; set; } // nvarchar(15)
+		[Nullable] public string    ShipPostalCode { get; set; } // nvarchar(10)
+		[Nullable] public string    ShipCountry    { get; set; } // nvarchar(15)
+		           public string    CompanyName    { get; set; } // nvarchar(40)
+		[Nullable] public string    Address        { get; set; } // nvarchar(60)
+		[Nullable] public string    City           { get; set; } // nvarchar(15)
+		[Nullable] public string    Region         { get; set; } // nvarchar(15)
+		[Nullable] public string    PostalCode     { get; set; } // nvarchar(10)
+		[Nullable] public string    Country        { get; set; } // nvarchar(15)
+	}
+
+	// View
+	[TableName(Name="Product Sales for 1997")]
+	public partial class ProductSalesFor1997
+	{
+		           public string   CategoryName { get; set; } // nvarchar(15)
+		           public string   ProductName  { get; set; } // nvarchar(40)
+		[Nullable] public decimal? ProductSales { get; set; } // money(19,4)
+	}
+
+	[TableName(Name="Products")]
+	public partial class Products
+	{
+		[Identity, PrimaryKey(1)] public int      ProductID       { get; set; } // int(10)
+		                          public string   ProductName     { get; set; } // nvarchar(40)
+		[Nullable               ] public int?     SupplierID      { get; set; } // int(10)
+		[Nullable               ] public int?     CategoryID      { get; set; } // int(10)
+		[Nullable               ] public string   QuantityPerUnit { get; set; } // nvarchar(20)
+		[Nullable               ] public decimal? UnitPrice       { get; set; } // money(19,4)
+		[Nullable               ] public short?   UnitsInStock    { get; set; } // smallint(5)
+		[Nullable               ] public short?   UnitsOnOrder    { get; set; } // smallint(5)
+		[Nullable               ] public short?   ReorderLevel    { get; set; } // smallint(5)
+		                          public bool     Discontinued    { get; set; } // bit
+
+		// FK_Products_Suppliers
+		[Association(ThisKey="SupplierID", OtherKey="SupplierID", CanBeNull=true)]
+		public Suppliers Suppliers { get; set; }
+
+		// FK_Products_Categories
+		[Association(ThisKey="CategoryID", OtherKey="CategoryID", CanBeNull=true)]
+		public Categories Categories { get; set; }
+
+		// FK_Order_Details_Products_BackReference
+		[Association(ThisKey="ProductID", OtherKey="ProductID", CanBeNull=true)]
+		public IEnumerable<OrderDetails> OrderDetailss { get; set; }
+	}
+
+	// View
+	[TableName(Name="Products Above Average Price")]
+	public partial class ProductsAboveAveragePrice
+	{
+		           public string   ProductName { get; set; } // nvarchar(40)
+		[Nullable] public decimal? UnitPrice   { get; set; } // money(19,4)
+	}
+
+	// View
+	[TableName(Name="Products by Category")]
+	public partial class ProductsByCategory
+	{
+		           public string CategoryName    { get; set; } // nvarchar(15)
+		           public string ProductName     { get; set; } // nvarchar(40)
+		[Nullable] public string QuantityPerUnit { get; set; } // nvarchar(20)
+		[Nullable] public short? UnitsInStock    { get; set; } // smallint(5)
+		           public bool   Discontinued    { get; set; } // bit
+	}
+
+	// View
+	[TableName(Name="Quarterly Orders")]
+	public partial class QuarterlyOrders
+	{
+		[Nullable] public string CustomerID  { get; set; } // nchar(5)
+		[Nullable] public string CompanyName { get; set; } // nvarchar(40)
+		[Nullable] public string City        { get; set; } // nvarchar(15)
+		[Nullable] public string Country     { get; set; } // nvarchar(15)
+	}
+
+	[TableName(Name="Region")]
+	public partial class Region
+	{
+		[PrimaryKey(1)] public int    RegionID          { get; set; } // int(10)
+		                public string RegionDescription { get; set; } // nchar(50)
+
+		// FK_Territories_Region_BackReference
+		[Association(ThisKey="RegionID", OtherKey="RegionID", CanBeNull=true)]
+		public IEnumerable<Territories> Territoriess { get; set; }
+	}
+
+	// View
+	[TableName(Name="Sales by Category")]
+	public partial class SalesByCategory
+	{
+		           public int      CategoryID   { get; set; } // int(10)
+		           public string   CategoryName { get; set; } // nvarchar(15)
+		           public string   ProductName  { get; set; } // nvarchar(40)
+		[Nullable] public decimal? ProductSales { get; set; } // money(19,4)
+	}
+
+	// View
+	[TableName(Name="Sales Totals by Amount")]
+	public partial class SalesTotalsByAmount
+	{
+		[Nullable] public decimal?  SaleAmount  { get; set; } // money(19,4)
+		           public int       OrderID     { get; set; } // int(10)
+		           public string    CompanyName { get; set; } // nvarchar(40)
+		[Nullable] public DateTime? ShippedDate { get; set; } // datetime(3)
+	}
+
+	[TableName(Name="Shippers")]
+	public partial class Shippers
+	{
+		[Identity, PrimaryKey(1)] public int    ShipperID   { get; set; } // int(10)
+		                          public string CompanyName { get; set; } // nvarchar(40)
+		[Nullable               ] public string Phone       { get; set; } // nvarchar(24)
+
+		// FK_Orders_Shippers_BackReference
+		[Association(ThisKey="ShipperID", OtherKey="ShipVia", CanBeNull=true)]
+		public IEnumerable<Orders> Orderss { get; set; }
+	}
+
+	// View
+	[TableName(Name="Summary of Sales by Quarter")]
+	public partial class SummaryOfSalesByQuarter
+	{
+		[Nullable] public DateTime? ShippedDate { get; set; } // datetime(3)
+		           public int       OrderID     { get; set; } // int(10)
+		[Nullable] public decimal?  Subtotal    { get; set; } // money(19,4)
+	}
+
+	// View
+	[TableName(Name="Summary of Sales by Year")]
+	public partial class SummaryOfSalesByYear
+	{
+		[Nullable] public DateTime? ShippedDate { get; set; } // datetime(3)
+		           public int       OrderID     { get; set; } // int(10)
+		[Nullable] public decimal?  Subtotal    { get; set; } // money(19,4)
+	}
+
+	[TableName(Name="Suppliers")]
+	public partial class Suppliers
+	{
+		[Identity, PrimaryKey(1)] public int    SupplierID   { get; set; } // int(10)
+		                          public string CompanyName  { get; set; } // nvarchar(40)
+		[Nullable               ] public string ContactName  { get; set; } // nvarchar(30)
+		[Nullable               ] public string ContactTitle { get; set; } // nvarchar(30)
+		[Nullable               ] public string Address      { get; set; } // nvarchar(60)
+		[Nullable               ] public string City         { get; set; } // nvarchar(15)
+		[Nullable               ] public string Region       { get; set; } // nvarchar(15)
+		[Nullable               ] public string PostalCode   { get; set; } // nvarchar(10)
+		[Nullable               ] public string Country      { get; set; } // nvarchar(15)
+		[Nullable               ] public string Phone        { get; set; } // nvarchar(24)
+		[Nullable               ] public string Fax          { get; set; } // nvarchar(24)
+		[Nullable               ] public string HomePage     { get; set; } // ntext(1073741823)
+
+		// FK_Products_Suppliers_BackReference
+		[Association(ThisKey="SupplierID", OtherKey="SupplierID", CanBeNull=true)]
+		public IEnumerable<Products> Productss { get; set; }
+	}
+
+	[TableName(Name="Territories")]
+	public partial class Territories
+	{
+		[PrimaryKey(1)] public string TerritoryID          { get; set; } // nvarchar(20)
+		                public string TerritoryDescription { get; set; } // nchar(50)
+		                public int    RegionID             { get; set; } // int(10)
+
+		// FK_Territories_Region
+		[Association(ThisKey="RegionID", OtherKey="RegionID", CanBeNull=false)]
+		public Region Region { get; set; }
+
+		// FK_EmployeeTerritories_Territories_BackReference
+		[Association(ThisKey="TerritoryID", OtherKey="TerritoryID", CanBeNull=true)]
+		public IEnumerable<EmployeeTerritories> EmployeeTerritoriess { get; set; }
+	}
+}
+
+namespace Client
+{
+	public partial class DataModel
+	{
+		public DataModel() : base(
+			new BasicHttpBinding(BasicHttpSecurityMode.None)
+			{
+				MaxReceivedMessageSize = 10000000,
+				MaxBufferSize          = 10000000,
+				CloseTimeout           = new TimeSpan(00, 01, 00),
+				OpenTimeout            = new TimeSpan(00, 01, 00),
+				ReceiveTimeout         = new TimeSpan(00, 10, 00),
+				SendTimeout            = new TimeSpan(00, 10, 00),
+			},
+			new EndpointAddress("http://localhost:31020/LinqWebService.asmx"))
+			// base("TestLinqWebServiceSoap")
+		{
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Silverlight/Client/DataModel.tt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,37 @@
+<#@ template debug="True" hostspecific="True" #>
+<#@ output extension=".generated.cs" #>
+<#@ include file="$(SolutionDir)\Source\Templates\BLToolkit.ttinclude"   #>
+<#@ include file="$(SolutionDir)\Source\Templates\MSSQL.ttinclude"       #>
+<#
+	ConnectionString = "Server=.;Database=Northwind;Integrated Security=SSPI";
+
+	Namespace            = "Client";
+	DataContextName      = "DataModel";
+	BaseDataContextClass = "SoapDataContext";
+	
+	Usings.Add("BLToolkit.ServiceModel");
+	Usings.Add("System.ServiceModel");
+
+	GenerateModel();
+#>
+
+namespace Client
+{
+	public partial class DataModel
+	{
+		public DataModel() : base(
+			new BasicHttpBinding(BasicHttpSecurityMode.None)
+			{
+				MaxReceivedMessageSize = 10000000,
+				MaxBufferSize          = 10000000,
+				CloseTimeout           = new TimeSpan(00, 01, 00),
+				OpenTimeout            = new TimeSpan(00, 01, 00),
+				ReceiveTimeout         = new TimeSpan(00, 10, 00),
+				SendTimeout            = new TimeSpan(00, 10, 00),
+			},
+			new EndpointAddress("http://localhost:31020/LinqWebService.asmx"))
+			// base("TestLinqWebServiceSoap")
+		{
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Silverlight/Client/MainPage.xaml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,14 @@
+<UserControl x:Class="Client.MainPage"
+	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+	xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+	xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+	mc:Ignorable="d"
+	d:DesignHeight="300" d:DesignWidth="400" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">
+
+	<Grid x:Name="LayoutRoot" Background="White">
+		<StackPanel Orientation="Vertical">
+			<TextBlock x:Name="OutputText"></TextBlock>
+		</StackPanel>
+	</Grid>
+</UserControl>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Silverlight/Client/MainPage.xaml.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,62 @@
+using System;
+using System.Linq;
+using System.Threading;
+using System.Windows.Controls;
+using BLToolkit.Data.Linq;
+
+namespace Client
+{
+	public partial class MainPage : UserControl
+	{
+		public class Data
+		{
+			public string Name;
+			public int    Sum;
+		}
+
+		public MainPage()
+		{
+			InitializeComponent();
+
+			ThreadPool.QueueUserWorkItem(_ =>
+			{
+				try
+				{
+					using (var dm = new DataModel())
+					{
+						var q =
+							from c in dm.Categories
+							where  !c.CategoryName.StartsWith("Con")
+							orderby c.CategoryName
+							select  c.CategoryName;
+
+						(from t in dm.Categories
+						group t by t.CategoryName into g
+						select new Data
+						{
+							Name = g.Key,
+							Sum  = g.Sum(a => a.CategoryID)
+						}).ToList();
+
+						var text = string.Join("\n", q.ToArray());
+
+						Dispatcher.BeginInvoke(() => OutputText.Text = text);
+
+						dm.BeginBatch();
+
+						dm.Categories.Delete(c => c.CategoryID == -99999);
+						dm.Categories.Delete(c => c.CategoryID == -999999);
+
+						dm.CommitBatch();
+					}
+				}
+				catch (Exception ex)
+				{
+					Dispatcher.BeginInvoke(() => OutputText.Text = ex.Message);
+				}
+
+				//new ServiceReference1.TestLinqWebServiceSoap();
+			});
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Silverlight/Client/Properties/AppManifest.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,6 @@
+<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"
+        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+>
+    <Deployment.Parts>
+    </Deployment.Parts>
+</Deployment>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/Silverlight/Client/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,35 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Client")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("Client")]
+[assembly: AssemblyCopyright("Copyright © Microsoft 2012")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("c99402c7-fdba-44e6-a0ff-7635164f374e")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/Client/Client.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{4EBBF9E9-53B2-493C-ABAB-E915C187558F}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Demo.WebServices.Client</RootNamespace>
+    <AssemblyName>Demo.WebServices.Client</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <TargetFrameworkProfile />
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;FW4</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE;FW3</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;FW4</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\Demo.WebServices.Client.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE;FW3</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\Demo.WebServices.Client.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Web.Services" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="PersonClient.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="WebClient\AsyncCallState.cs" />
+    <Compile Include="WebClient\GenerateXmlIncludeAttribute.cs" />
+    <Compile Include="WebClient\UpToDateAttribute.cs" />
+    <Compile Include="WebClient\WebClientAttribute.cs" />
+    <Compile Include="WebClient\WebClientBase.cs" />
+    <Compile Include="WebClient\WebClientBaseT.cs" />
+    <Compile Include="WebClient\WebClientTypeBuilder.cs" />
+    <Compile Include="WebClient\WebOperationCancelledEventArgs.cs" />
+    <Compile Include="WebClient\WebOperationExceptionEventArgs.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\ObjectModel\ObjectModel.csproj">
+      <Project>{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}</Project>
+      <Name>ObjectModel</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/Client/Client.csproj.DotSettings	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,2 @@
+<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
+	<s:String x:Key="/Default/CodeEditing/Localization/Localizable/@EntryValue">No</s:String></wpf:ResourceDictionary>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/Client/Client.csproj.ReSharper	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,3 @@
+<Configuration>
+  <Localizable>No</Localizable>
+</Configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/Client/PersonClient.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Web.Services;
+
+namespace Demo.WebServices.Client
+{
+	using WebClient;
+	using ObjectModel;
+
+	[WebServiceBinding(Namespace = "http://tempuri.org/PersonService.asmx")]
+	[GenerateXmlInclude(typeof(Person))]
+	public abstract class PersonClient: WebClientBase<PersonClient>, IDataAccessor
+	{
+		public abstract List<Person>           SelectAll();
+		public abstract XmlMap<string, Person> SelectMap();
+		public abstract Person                 SelectByKey(int id);
+		public abstract void                   SelectByKey(int id, Action<Person> callback);
+
+		public abstract int  MethodWithOutParams(out string str, out Guid guid);
+		public abstract void MethodWithOutParams(Action<int, string, Guid> callback);
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/Client/Program.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,63 @@
+using System;
+using System.Threading;
+using System.Windows.Forms;
+
+namespace Demo.WebServices.Client
+{
+	using ObjectModel;
+	using WebClient;
+
+	class Program
+	{
+		static void Main(string[] args)
+		{
+			WebClientBase.BaseUrl = args.Length == 0? "localhost:59179": args[1];
+
+			foreach (var p in PersonClient.Instance.SelectAll())
+			{
+				PrintPerson(p);
+			}
+
+			var map = PersonClient.Instance.SelectMap();
+
+			foreach (var pair in map)
+			{
+				Console.WriteLine("{0}: {1} {2} ({3})",
+					pair.Key,
+					pair.Value.FirstName,
+					pair.Value.LastName,
+					pair.Value.Gender);
+			}
+
+			// Async call to server
+			//
+			PersonClient.Instance.SelectByKey(1, PrintPerson);
+
+			string strVal;
+			Guid   guidVal;
+			var    intVal = PersonClient.Instance.MethodWithOutParams(out strVal, out guidVal);
+
+			Console.WriteLine("int: {0}, str: {1}, guid: {2}", intVal, strVal, guidVal);
+
+			PersonClient.Instance.MethodWithOutParams(
+				(i,s,g) => Console.WriteLine("[Callback] int: {0}, str: {1}, guid: {2}", i, s, g));
+
+			Console.WriteLine();
+			Console.WriteLine("Press [Enter] key to continue");
+			Console.WriteLine();
+
+			while (!Console.KeyAvailable)
+			{
+				Application.DoEvents();
+				Thread.Sleep(200);
+			}
+
+			Console.ReadKey(true);
+		}
+
+		private static void PrintPerson(Person p)
+		{
+			Console.WriteLine("{0} {1} ({2})", p.FirstName, p.LastName, p.Gender);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/Client/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,28 @@
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("BLToolkit.Demo.Client")]
+[assembly: AssemblyProduct("BLToolkit.Demo")]
+[assembly: AssemblyCopyright("\xA9 2002-2012 www.bltoolkit.net")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("a30a5d13-4b1d-471b-af64-b354ffc91647")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/Client/WebClient/AsyncCallState.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,13 @@
+namespace Demo.WebServices.Client.WebClient
+{
+	/// <summary>
+	/// Async call handle holder class.
+	/// </summary>
+	public class AsyncCallState
+	{
+		/// <summary>
+		/// Async call handle if call is in progress, null otherwise.
+		/// </summary>
+		public object PendingCall;
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/Client/WebClient/Compatibility.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,80 @@
+namespace Demo.WebServices.Client.WebClient
+{
+#if !FW3
+
+	/// <summary>
+	/// Encapsulates a method that takes no parameters and does not return a value.
+	/// </summary>
+	public delegate void Action();
+
+	/// <summary>
+	/// Encapsulates a method that has two parameters and does not return a value.
+	/// </summary>
+	/// <param name="arg1">
+	/// The first parameter of the method that this delegate encapsulates.
+	/// </param>
+	/// <param name="arg2">
+	/// The second parameter of the method that this delegate encapsulates.
+	/// </param>
+	/// <typeparam name="T1">
+	/// The type of the first parameter of the method that this delegate encapsulates.
+	/// </typeparam>
+	/// <typeparam name="T2">
+	/// The type of the second parameter of the method that this delegate encapsulates.
+	/// </typeparam>
+	public delegate void Action<T1, T2>(T1 arg1, T2 arg2);
+
+	/// <summary>
+	/// Encapsulates a method that has three parameters and does not return a value.
+	/// </summary>
+	/// <param name="arg1">
+	/// The first parameter of the method that this delegate encapsulates.
+	/// </param>
+	/// <param name="arg2">
+	/// The second parameter of the method that this delegate encapsulates.
+	/// </param>
+	/// <param name="arg3">
+	/// The third parameter of the method that this delegate encapsulates.
+	/// </param>
+	/// <typeparam name="T1">
+	/// The type of the first parameter of the method that this delegate encapsulates.
+	/// </typeparam>
+	/// <typeparam name="T2">
+	/// The type of the second parameter of the method that this delegate encapsulates.
+	/// </typeparam>
+	/// <typeparam name="T3">
+	/// The type of the third parameter of the method that this delegate encapsulates.
+	/// </typeparam>
+	public delegate void Action<T1, T2, T3>(T1 arg1, T2 arg2, T3 arg3);
+
+	/// <summary>
+	/// Encapsulates a method that has four parameters and does not return a value.
+	/// </summary>
+	/// <param name="arg1">
+	/// The first parameter of the method that this delegate encapsulates.
+	/// </param>
+	/// <param name="arg2">
+	/// The second parameter of the method that this delegate encapsulates.
+	/// </param>
+	/// <param name="arg3">
+	/// The third parameter of the method that this delegate encapsulates.
+	/// </param>
+	/// <param name="arg4">
+	/// The fourth parameter of the method that this delegate encapsulates.
+	/// </param>
+	/// <typeparam name="T1">
+	/// The type of the first parameter of the method that this delegate encapsulates.
+	/// </typeparam>
+	/// <typeparam name="T2">
+	/// The type of the second parameter of the method that this delegate encapsulates.
+	/// </typeparam>
+	/// <typeparam name="T3">
+	/// The type of the third parameter of the method that this delegate encapsulates.
+	/// </typeparam>
+	/// <typeparam name="T4">
+	/// The type of the fourth parameter of the method that this delegate encapsulates.
+	/// </typeparam>
+	public delegate void Action<T1, T2, T3, T4>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
+
+#endif
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/Client/WebClient/GenerateXmlIncludeAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,25 @@
+using System;
+using System.Xml.Serialization;
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+
+namespace Demo.WebServices.Client.WebClient
+{
+	/// <summary>
+	/// Allows the <see cref="XmlSerializer"/> to recognize a type generated
+	/// by the BLToolkit when it serializes or deserializes an object.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)]
+	public class GenerateXmlIncludeAttribute : GenerateAttributeAttribute
+	{
+		/// <summary>
+		/// Initializes a new instance of the <see cref="GenerateXmlIncludeAttribute"/> class.
+		/// </summary>
+		/// <param name="type">The <see cref="Type"/> of an abstract class to
+		/// include its BLToolkit extensions.</param>
+		public GenerateXmlIncludeAttribute(Type type)
+			: base(typeof(XmlIncludeAbstractAttribute), type)
+		{
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/Client/WebClient/UpToDateAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+using System;
+
+namespace Demo.WebServices.Client.WebClient
+{
+	[AttributeUsage(AttributeTargets.Method)]
+	public class UpToDateAttribute : Attribute
+	{
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/Client/WebClient/WebClientAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,14 @@
+using System;
+using BLToolkit.TypeBuilder.Builders;
+
+namespace Demo.WebServices.Client.WebClient
+{
+	[AttributeUsage(AttributeTargets.Class)]
+	public class WebClientAttribute : AbstractTypeBuilderAttribute
+	{
+		public override IAbstractTypeBuilder TypeBuilder
+		{
+			get { return new WebClientTypeBuilder(); }
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/Client/WebClient/WebClientBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,465 @@
+using System;
+using System.Diagnostics;
+using System.Net;
+using System.Reflection;
+using System.Web.Services;
+using System.Web.Services.Protocols;
+
+using BLToolkit.Common;
+
+namespace Demo.WebServices.Client.WebClient
+{
+	[DebuggerStepThrough]
+	[System.ComponentModel.DesignerCategory("Code")]
+	[WebClient]
+	public abstract class WebClientBase: SoapHttpClientProtocol
+	{
+		/// <summary>
+		/// Initializes a new instance of the <see cref="WebClientBase"/> class.
+		/// </summary>
+		protected WebClientBase()
+		{
+			if (DefaultCredentials == null)
+				UseDefaultCredentials = true;
+			else
+				Credentials = DefaultCredentials;
+
+			// Use custom redirection since we need to repost some data.
+			//
+			AllowAutoRedirect     = false;
+
+			EnableDecompression   = true;
+			PreAuthenticate       = true;
+
+			// Setup appropriate user agent string.
+			//
+			var asm = Assembly.GetEntryAssembly();
+			if (asm != null)
+				UserAgent = asm.FullName;
+
+#if DEBUG
+			// By default the timeout value is about 2 minutes,
+			// wich is quite enought in a normal run,
+			// but not for debugging.
+			//
+			Timeout = Int32.MaxValue;
+#endif
+
+			if (string.IsNullOrEmpty(BaseUrl))
+				return;
+
+			var attr = (WebServiceBindingAttribute)Attribute.GetCustomAttribute(GetType(), typeof(WebServiceBindingAttribute));
+
+			if (attr == null)
+				throw new InvalidOperationException("Please specify relative url or mark the avatar with WebServiceBindingAttribute");
+
+			var ns = attr.Namespace;
+
+			if (string.IsNullOrEmpty(ns))
+				throw new InvalidOperationException("Please specify namespace in WebServiceBindingAttribute");
+
+			if (ns.EndsWith("/"))
+				ns = ns.Substring(0, ns.Length - 1);
+
+			var builder = new UriBuilder(BaseUrl) { Path = new UriBuilder(ns).Path };
+
+			Url = builder.Uri.AbsoluteUri;
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="WebClientBase"/> class.
+		/// </summary>
+		/// <param name="relativeUrl">Path to web service, relative to <see cref="BaseUrl"/>.</param>
+		protected WebClientBase(string relativeUrl) : this()
+		{
+			Debug.Assert(Url == BaseUrl + relativeUrl, string.Format("Expected url '{0}' got '{1}'", Url, BaseUrl + relativeUrl) );
+			Url = BaseUrl + relativeUrl;
+		}
+
+		public static ICredentials DefaultCredentials { get; set; }
+
+		/// <summary>
+		/// Customizable url path.
+		/// </summary>
+		public static string BaseUrl { get; set; }
+
+		/// <summary>
+		/// Returns <see langword="true"/>, program runs in offline mode.
+		/// </summary>
+		public static bool OffLine
+		{
+			get { return string.IsNullOrEmpty(BaseUrl); }
+		}
+
+		#region Invoke
+
+		private object[] InvokeInternal(string methodName, object[] parameters)
+		{
+			object[] ret = null;
+
+			for (;;)
+			{
+				try
+				{
+#if DEBUG
+					var sw = Stopwatch.StartNew();
+#endif
+					ret = base.Invoke(methodName, parameters);
+#if DEBUG
+					Debug.WriteLineIf(TS.TraceVerbose,
+						string.Format("Sync call {0}/{1} = {2} msec.",
+							Url, methodName, sw.ElapsedMilliseconds), TS.DisplayName);
+#endif
+				}
+				catch (Exception ex)
+				{
+					if (ex is WebException)
+					{
+						var webException = (WebException) ex;
+
+						if (webException.Status == WebExceptionStatus.RequestCanceled)
+						{
+							OnWebOperationCancelled(methodName, parameters);
+							break;
+						}
+
+						// Internal redirection
+						//
+						if (webException.Status == WebExceptionStatus.ReceiveFailure)
+							continue;
+					}
+
+					if (OnWebOperationException(methodName, parameters, ex))
+						continue;
+				}
+
+				break;
+			}
+
+			return AcceptChanges(ret);
+		}
+
+		/// <summary>
+		/// Invokes a web method synchronously.
+		/// </summary>
+		/// <param name="methodName">Web method name.</param>
+		/// <param name="parameters">Web method parameters.</param>
+		/// <returns>Web method return value or values on success,
+		/// a null reference otherwise.</returns>
+		public new object[] Invoke(string methodName, params object[] parameters)
+		{
+			return InvokeInternal(methodName, parameters) ?? new object[]{ null };
+		}
+
+		/// <summary>
+		/// Invokes a web method synchronously.
+		/// </summary>
+		/// <param name="methodName">Web method name.</param>
+		/// <param name="parameters">Web method parameters.</param>
+		/// <returns>Web method return value or default(T) if the call fails.</returns>
+		public T Invoke<T>(string methodName, params object[] parameters)
+		{
+			var ret = InvokeInternal(methodName, parameters);
+
+			return ret != null && ret.Length != 0? (T)ret[0]: default(T);
+		}
+
+		/// <summary>
+		/// Invokes a web method asynchronously.
+		/// </summary>
+		/// <param name="methodName">Web method name.</param>
+		/// <param name="asyncCallState">Call state handle.
+		/// Upon return, may be used to cancel the call</param>
+		/// <param name="parameters">Web method parameters.</param>
+		/// <param name="callback">Callback method to process the result.</param>
+		/// <param name="exceptionHandler">Fail handler.</param>
+		/// <seealso cref="CancelAsync(AsyncCallState)"/>
+		public void InvokeAsync(
+			string            methodName,
+			AsyncCallState    asyncCallState,
+			Action<Exception> exceptionHandler,
+			Delegate          callback,
+			params object[]   parameters)
+		{
+#if DEBUG
+			var sw = Stopwatch.StartNew();
+#endif
+
+			if (asyncCallState != null)
+			{
+#if DEBUG
+			Debug.WriteLineIf(TS.TraceVerbose && asyncCallState.PendingCall != null,
+				string.Format("Cancelling async call {0}/{1}",
+					Url, methodName), TS.DisplayName);
+#endif
+				CancelAsync(asyncCallState);
+			}
+
+			var exceptionCallback = exceptionHandler ?? delegate(Exception ex)
+			{
+				if (ex is WebException)
+				{
+					var webException = (WebException)ex;
+
+					// Request cancelled.
+					//
+					if (webException.Status == WebExceptionStatus.RequestCanceled)
+					{
+						OnWebOperationCancelled(methodName, parameters);
+						return;
+					}
+				}
+
+				// Check for retry.
+				//
+				if (OnWebOperationException(methodName, parameters, ex))
+				{
+					InvokeAsync(methodName, asyncCallState, exceptionHandler, callback, parameters);
+				}
+			};
+
+			System.Threading.SendOrPostCallback sendCallback = delegate(object obj)
+			{
+#if DEBUG
+				Debug.WriteLineIf(TS.TraceVerbose,
+					string.Format("Async call {0}/{1} = {2} msec.",
+						Url, methodName, sw.ElapsedMilliseconds), TS.DisplayName);
+#endif
+
+				var ea = (InvokeCompletedEventArgs)obj;
+
+				if (ea.Error != null)
+				{
+					// Internal redirection
+					//
+					if (ea.Error is WebException && ((WebException)ea.Error).Status == WebExceptionStatus.ReceiveFailure)
+					{
+						InvokeAsync(methodName, asyncCallState, exceptionHandler, callback, parameters);
+					}
+					else
+					{
+						exceptionCallback(ea.Error);
+					}
+				}
+				else if (ea.Cancelled || (asyncCallState != null && ea.UserState != asyncCallState.PendingCall))
+				{
+					exceptionCallback(new WebException(methodName, WebExceptionStatus.RequestCanceled));
+				}
+				else
+				{
+					callback.DynamicInvoke(AcceptChanges(ea.Results));
+				}
+
+				if (asyncCallState != null && ea.UserState == asyncCallState.PendingCall)
+					asyncCallState.PendingCall = null;
+			};
+
+			object cookie = new CompoundValue(methodName, parameters);
+
+			if (asyncCallState!= null)
+				asyncCallState.PendingCall = cookie;
+
+			InvokeAsync(methodName, parameters, sendCallback, cookie);
+		}
+
+		/// <summary>
+		/// Invokes a web method asynchronously.
+		/// </summary>
+		/// <param name="methodName">Web method name.</param>
+		/// <param name="asyncCallState">Call state handle.
+		/// Upon return, may be used to cancel the call</param>
+		/// <param name="parameters">Web method parameters.</param>
+		/// <param name="callback">Callback method to process the result.</param>
+		/// <seealso cref="CancelAsync(AsyncCallState)"/>
+		public void InvokeAsync(
+			string          methodName,
+			AsyncCallState  asyncCallState,
+			Delegate        callback,
+			params object[] parameters)
+		{
+			InvokeAsync(methodName, asyncCallState, null, callback, parameters);
+		}
+
+		private static void AcceptChanges(object obj)
+		{
+			if (obj == null || obj is IConvertible)
+			{
+				//
+				// Do nothing on bool, int, string, etc.
+				//
+			}
+			else if (obj is BLToolkit.EditableObjects.IEditable)
+				((BLToolkit.EditableObjects.IEditable)obj).AcceptChanges();
+			else if (obj is System.Collections.IDictionary)
+			{
+				foreach (System.Collections.DictionaryEntry pair in (System.Collections.IDictionary)obj)
+				{
+					AcceptChanges(pair.Key);
+					AcceptChanges(pair.Value);
+				}
+			}
+			else if (obj is System.Collections.IEnumerable)
+			{
+				foreach (var elm in (System.Collections.IEnumerable)obj)
+					AcceptChanges(elm);
+			}
+		}
+
+		private static object[] AcceptChanges(object[] array)
+		{
+			if (array != null)
+				Array.ForEach(array, AcceptChanges);
+
+			return array;
+		}
+
+		/// <summary>
+		///.Cancel an asynchronous call if it is not completed already.
+		/// </summary>
+		/// <param name="asyncCallState">Async call state.</param>
+		public void CancelAsync(AsyncCallState asyncCallState)
+		{
+			if (asyncCallState.PendingCall == null)
+				return;
+
+			CancelAsync(asyncCallState.PendingCall);
+			asyncCallState.PendingCall = null;
+		}
+
+		#endregion
+
+		#region Events
+
+		private static readonly object EventWebOperationCancelled = new object();
+		public event EventHandler<WebOperationCancelledEventArgs> WebOperationCancelled
+		{
+			add    { Events.AddHandler   (EventWebOperationCancelled, value); }
+			remove { Events.RemoveHandler(EventWebOperationCancelled, value); }
+		}
+
+		public static event EventHandler<WebOperationCancelledEventArgs> WebOperationCancelledDefaultHandler;
+
+		protected virtual void OnWebOperationCancelled(string methodName, params object[] parameters)
+		{
+			Debug.WriteLineIf(TS.TraceInfo, string.Format("OnWebOperationCancelled; op={0}/{1}", Url, methodName));
+			var handler = (EventHandler<WebOperationCancelledEventArgs>)Events[EventWebOperationCancelled] ?? WebOperationCancelledDefaultHandler;
+			if (handler != null)
+			{
+				var ea = new WebOperationCancelledEventArgs(Url, methodName, parameters);
+				handler(this, ea);
+			}
+		}
+
+		private static readonly object EventWebOperationException = new object();
+		public event EventHandler<WebOperationExceptionEventArgs> WebOperationException
+		{
+			add    { Events.AddHandler   (EventWebOperationException, value); }
+			remove { Events.RemoveHandler(EventWebOperationException, value); }
+		}
+		public static event EventHandler<WebOperationExceptionEventArgs> WebOperationExceptionDefaultHandler;
+
+		protected virtual bool OnWebOperationException(string methodName, object[] parameters, Exception ex)
+		{
+			Debug.WriteLineIf(TS.TraceError, string.Format("OnWebOperationException; op={0}/{1}; ex={2}", Url, methodName, ex));
+			var handler = (EventHandler<WebOperationExceptionEventArgs>)Events[EventWebOperationException] ?? WebOperationExceptionDefaultHandler;
+
+			if (handler != null)
+			{
+				var ea = new WebOperationExceptionEventArgs(Url, methodName, parameters, ex);
+				handler(this, ea);
+				return ea.Retry;
+			}
+
+			throw new TargetInvocationException(methodName, ex);
+		}
+
+		#endregion
+
+		#region Cookies
+
+		private string _cookie;
+
+		/// <summary>
+		/// Creates a <see cref="T:System.Net.WebRequest"/> for the specified uri.
+		/// </summary>
+		/// <returns> The <see cref="T:System.Net.WebRequest"/>. </returns>
+		/// <param name="uri">The <see cref="T:System.Uri"></see> to use when creating the <see cref="T:System.Net.WebRequest"></see>. </param>
+		/// <exception cref="T:System.InvalidOperationException">The uri parameter is null. </exception>
+		protected override WebRequest GetWebRequest(Uri uri)
+		{
+			var webRequest = base.GetWebRequest(uri);
+			PrepareRequest(webRequest);
+			return webRequest;
+		}
+
+		/// <summary>
+		/// Returns a response from a synchronous request to an XML Web service method.
+		/// </summary>
+		/// <returns> The <see cref="T:System.Net.WebResponse"/>. </returns>
+		/// <param name="request">The <see cref="T:System.Net.WebRequest"/>
+		/// from which to get the response. </param>
+		protected override WebResponse GetWebResponse(WebRequest request)
+		{
+			var response = (HttpWebResponse)base.GetWebResponse(request);
+			ProcessResponse(response);
+			return response;
+		}
+
+		/// <summary>
+		/// Returns a response from an asynchronous request to an XML Web service method.
+		/// </summary>
+		/// <returns> The <see cref="T:System.Net.WebResponse"/>.</returns>
+		/// <param name="result">The <see cref="T:System.IAsyncResult"/> to pass to
+		/// <see cref="M:System.Net.HttpWebRequest.EndGetResponse(System.IAsyncResult)"/> when the response has completed. </param>
+		/// <param name="request">The <see cref="T:System.Net.WebRequest"/> from which to get the response. </param>
+		protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result)
+		{
+			var response = (HttpWebResponse)base.GetWebResponse(request, result);
+			ProcessResponse(response);
+			return response;
+		}
+
+		private void ProcessResponse(HttpWebResponse response)
+		{
+			if (response.StatusCode == HttpStatusCode.MovedPermanently)
+			{
+				var redirectedLocation = response.Headers["Location"];
+				Url = new Uri(new Uri(Url), redirectedLocation).AbsoluteUri;
+				throw new WebException(redirectedLocation, WebExceptionStatus.ReceiveFailure);
+			}
+
+			var cookies = response.Headers.GetValues("Set-Cookie");
+
+			if (cookies == null)
+				return;
+
+			foreach (var cookie in cookies)
+			{
+				if (cookie.StartsWith("ASP.NET_SessionId=", StringComparison.Ordinal))
+				{
+					_cookie = cookie;
+					break;
+				}
+			}
+		}
+
+		private void PrepareRequest(WebRequest request)
+		{
+			if (!string.IsNullOrEmpty(_cookie))
+				request.Headers.Add("Cookie", _cookie);
+		}
+
+		#endregion
+
+		#region Debug
+
+		private  static TraceSwitch _ts;
+		internal static TraceSwitch  TS
+		{
+			get { return _ts ?? (_ts = new TraceSwitch("WebServiceClient", "Web service client trace switch")); }
+		}
+
+		#endregion
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/Client/WebClient/WebClientBaseT.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,39 @@
+using BLToolkit.TypeBuilder;
+
+namespace Demo.WebServices.Client.WebClient
+{
+	[System.Diagnostics.DebuggerStepThrough]
+	[System.ComponentModel.DesignerCategory("Code")]
+	public abstract class WebClientBase<T> : WebClientBase where T : WebClientBase /*<T> commented due to csc.exe bug */
+	{
+		/// <summary>
+		/// Initializes a new instance of the <see cref="WebClientBase"/> class
+		/// using the namespace from WebServiceBinding attribute as url.
+		/// </summary>
+		protected WebClientBase()
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="WebClientBase"/> class.
+		/// </summary>
+		/// <param name="relativeUrl">Path to web service, relative to <see cref="WebClientBase.BaseUrl"/>.</param>
+		protected WebClientBase(string relativeUrl) : base(relativeUrl)
+		{
+		}
+
+		/// <summary>
+		/// Cached client instance.
+		/// </summary>
+		private static T _instance;
+		public  static T  Instance
+		{
+			get { return _instance ?? (_instance = CreateInstance()); }
+		}
+
+		protected static T CreateInstance()
+		{
+			return TypeFactory.CreateInstance<T>();
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/Client/WebClient/WebClientTypeBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,261 @@
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Reflection.Emit;
+using System.Web.Services.Protocols;
+using BLToolkit.DataAccess;
+using BLToolkit.Reflection;
+using BLToolkit.Reflection.Emit;
+using BLToolkit.TypeBuilder.Builders;
+
+namespace Demo.WebServices.Client.WebClient
+{
+	public class WebClientTypeBuilder : AbstractTypeBuilderBase
+	{
+		private readonly CustomAttributeBuilder _soapDocumentAttributeBuilder
+			= new CustomAttributeBuilder(TypeHelper.GetDefaultConstructor(typeof(SoapDocumentMethodAttribute)), Type.EmptyTypes);
+
+		public override bool IsApplied(BuildContext context, AbstractTypeBuilderList builders)
+		{
+			return context.IsBuildStep && context.IsAbstractMethod;
+		}
+
+		protected override void BuildAbstractMethod()
+		{
+			EmitHelper          emit             = Context.MethodBuilder.Emitter;
+			List<ParameterInfo> parameters       = new List<ParameterInfo>();
+			ParameterInfo       callback         = null;
+			ParameterInfo       exceptionHandler = null;
+
+			foreach (ParameterInfo p in Context.CurrentMethod.GetParameters())
+			{
+				Type   parameterType = p.ParameterType;
+				string paramTypeName = parameterType.Name.Split('`')[0];
+
+				if (paramTypeName == "Action")
+				{
+					if (parameterType.IsGenericType && parameterType.GetGenericArguments()[0] == typeof(Exception))
+						exceptionHandler = p;
+					else
+						callback = p;
+				}
+				else
+					parameters.Add(p);
+			}
+
+			EmitMethodName(emit);
+
+			if (callback == null)
+			{
+				EmitSyncCall(parameters, emit);
+			}
+			else
+			{
+				EmitAsyncCall(parameters, emit, callback, exceptionHandler);
+			}
+		}
+
+		private void EmitSyncCall(List<ParameterInfo> parameters, EmitHelper emit)
+		{
+			Context.MethodBuilder.MethodBuilder.SetCustomAttribute(_soapDocumentAttributeBuilder);
+
+			bool withOutParameters = EmitParameters(emit, parameters);
+			bool callGeneric = !withOutParameters && Context.CurrentMethod.ReturnType != typeof(void);
+
+			// Use Invoke<T>() for methods with return value but
+			// Invoke() for methods with no return value or with out/ref parameters.
+			//
+			MethodInfo invoke = TypeHelper.GetMethod(
+				typeof(WebClientBase),
+				callGeneric,
+				"Invoke",
+				BindingFlags.Public | BindingFlags.Instance);
+
+			if (callGeneric)
+			{
+				emit
+					.call   (invoke.MakeGenericMethod(Context.CurrentMethod.ReturnType))
+					.stloc  (Context.ReturnValue)
+					;
+			}
+			else
+			{
+				if (withOutParameters)
+				{
+					LocalBuilder ret = emit.DeclareLocal(typeof(object[]));
+					Label       exit = emit.DefineLabel();
+
+					emit
+						.call       (invoke)
+						.dup
+						.stloc      (ret)
+						.brfalse_s  (exit)
+						;
+
+					int idx = 0;
+
+					if (Context.CurrentMethod.ReturnType != typeof(void))
+					{
+						emit
+							.ldloc          (ret)
+							.ldc_i4_0
+							.ldelem_ref
+							.CastFromObject (Context.CurrentMethod.ReturnType)
+							.stloc          (Context.ReturnValue)
+							;
+
+						++idx;
+					}
+
+					for (int i = 0; i < parameters.Count; ++i)
+					{
+						ParameterInfo pi = parameters[i];
+						Type        type = pi.ParameterType;
+
+						if (!type.IsByRef)
+							continue;
+
+						// Get ride of ref
+						//
+						type = type.GetElementType();
+
+						emit
+							.ldarg          (pi)
+							.ldloc          (ret)
+							.ldc_i4_        (idx)
+							.ldelem_ref
+							.CastFromObject (type)
+							.stind          (type)
+							;
+
+						++idx;
+					}
+
+					emit.MarkLabel(exit);
+				}
+				else
+				{
+					emit
+						.call  (invoke)
+						.pop
+						.end   ()
+						;
+				}
+			}
+		}
+
+		private void EmitAsyncCall(List<ParameterInfo> parameters, EmitHelper emit, ParameterInfo callback, ParameterInfo exceptionCallback)
+		{
+			if (Context.CurrentMethod.IsDefined(typeof(UpToDateAttribute), true))
+			{
+				EmitCookie(emit);
+			}
+			else
+			{
+				emit.ldnull.end();
+			}
+
+			if (exceptionCallback != null)
+			{
+				emit.ldarg(exceptionCallback);
+			}
+			else
+			{
+				emit.ldnull.end();
+			}
+
+			emit.ldarg(callback);
+
+			EmitParameters(emit, parameters);
+
+			emit
+				.call(typeof(WebClientBase), "InvokeAsync", typeof(string), typeof(AsyncCallState), typeof(Action<Exception>), typeof(Delegate), typeof(object[]))
+				;
+		}
+
+		private void EmitMethodName(EmitHelper emit)
+		{
+			object[] attrs = Context.CurrentMethod.GetCustomAttributes(typeof(ActionNameAttribute), true);
+
+			string methodName = attrs == null || attrs.Length == 0?
+				Context.CurrentMethod.Name: ((ActionNameAttribute)attrs[0]).Name;
+
+			emit
+				.ldarg_0
+				.ldstr     (methodName)
+				;
+		}
+
+		private void EmitCookie(EmitHelper emit)
+		{
+			string fieldName = "_cookie$" + Context.CurrentMethod.Name;
+
+			FieldBuilder field = Context.GetField(fieldName) ??
+				Context.CreateField(fieldName, typeof(AsyncCallState), FieldAttributes.Private);
+
+			Label checkCookie = emit.DefineLabel();
+
+			emit
+				.ldarg_0
+				.ldfld      (field)
+				.dup
+				.brtrue_s   (checkCookie)
+				.pop
+				.ldarg_0
+				.dup
+				.newobj     (typeof(AsyncCallState))
+				.stfld      (field)
+				.ldfld      (field)
+				.MarkLabel  (checkCookie)
+				;
+		}
+
+		private bool EmitParameters(EmitHelper emit, List<ParameterInfo> parameters)
+		{
+			bool hasOutRefParameters = false;
+
+			int count = parameters.Count;
+			for (int i = 0; i < count; i++)
+			{
+				if (parameters[i].IsOut)
+				{
+					count--;
+					hasOutRefParameters = true;
+				}
+			}
+
+			emit
+				.ldc_i4_(count)
+				.newarr(typeof(object))
+				;
+
+			int idx = 0;
+			for (int i = 0; i < parameters.Count; i++)
+			{
+				ParameterInfo pi = parameters[i];
+
+				if (pi.IsOut)
+				{
+					// Output-only parameter
+					//
+					continue;
+				}
+
+				if (pi.ParameterType.IsByRef)
+					hasOutRefParameters = true;
+
+				emit
+					.dup
+					.ldc_i4_    (idx)
+					.ldargEx    (pi, true)
+					.stelem_ref
+					.end()
+					;
+
+				++idx;
+			}
+
+			return hasOutRefParameters;
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/Client/WebClient/WebOperationCancelledEventArgs.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,92 @@
+using System;
+using System.Text;
+using System.Collections;
+
+namespace Demo.WebServices.Client.WebClient
+{
+	public class WebOperationCancelledEventArgs : EventArgs
+	{
+		private readonly string _url;
+		public           string  Url
+		{
+			get { return _url; }
+		}
+
+		private readonly string _methodName;
+		public           string  MethodName
+		{
+			get { return _methodName; }
+		}
+
+		private readonly object[] _parameters;
+		public           object[]  Parameters
+		{
+			get { return _parameters; }
+		}
+
+		public WebOperationCancelledEventArgs(string url, string methodName, object[] parameters)
+		{
+			_url        = url;
+			_methodName = methodName;
+			_parameters = parameters;
+		}
+
+		public string Format()
+		{
+			StringBuilder sb = new StringBuilder();
+			sb
+				.Append(Url)
+				.Append('/')
+				.Append(MethodName)
+				.Append('(')
+				;
+
+			if (Parameters != null)
+			{
+				bool first = true;
+
+				foreach (object parameter in Parameters)
+				{
+					if (first)
+						first = false;
+					else
+						sb.Append(", ");
+
+					try
+					{
+						FormatParameter(parameter, sb);
+					}
+					catch (Exception ex)
+					{
+						sb.Append(ex.ToString());
+					}
+				}
+			}
+
+			return sb.Append(')').ToString();
+		}
+
+		private static void FormatParameter(object parameter, StringBuilder sb)
+		{
+			if (parameter == null)
+				sb.Append("null");
+			else if (parameter is string)
+				sb.Append('"').Append((string)parameter).Append('"');
+			else if (parameter is char)
+				sb.Append('\'').Append((char)parameter).Append('\'');
+			else if (parameter is IEnumerable)
+			{
+				sb.Append('[');
+				bool first = true;
+				foreach (object item in (IEnumerable)parameter)
+				{
+					FormatParameter(item, first? sb: sb.Append(','));
+					first = false;
+				}
+				sb.Append(']');
+			}
+			else
+				sb.Append(parameter.ToString());
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/Client/WebClient/WebOperationExceptionEventArgs.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,26 @@
+using System;
+
+namespace Demo.WebServices.Client.WebClient
+{
+	public class WebOperationExceptionEventArgs : WebOperationCancelledEventArgs
+	{
+		private readonly Exception _exception;
+		public           Exception Exception
+		{
+			get { return _exception; }
+		}
+
+		private bool _retry;
+		public  bool  Retry
+		{
+			get { return _retry;  }
+			set { _retry = value; }
+		}
+
+		public WebOperationExceptionEventArgs(string url, string methodName, object[] parameters, Exception exception)
+			: base(url, methodName, parameters)
+		{
+			_exception = exception;
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/Client/app.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<configuration>
+	<startup>
+		<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
+	</startup>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/NorthwindDataService/DataContext.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,18 @@
+using System;
+using BLToolkit.Mapping;
+
+namespace NorthwindDataService
+{
+	partial class DataContext
+	{
+	}
+
+	[InheritanceMapping(Code=true,  Type=typeof(DiscontinuedProduct))]
+	[InheritanceMapping(Code=false, Type=typeof(ActiveProduct))]
+	partial class Product
+	{
+	}
+
+	public class ActiveProduct       : Product {}
+	public class DiscontinuedProduct : Product {}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/NorthwindDataService/DataContext.generated.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,617 @@
+//---------------------------------------------------------------------------------------------------
+// <auto-generated>
+//    This code was generated by BLToolkit template for T4.
+//    Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
+// </auto-generated>
+//---------------------------------------------------------------------------------------------------
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+using System.Text;
+
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using BLToolkit.Data.Sql;
+using BLToolkit.Data.Sql.SqlProvider;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace NorthwindDS
+{
+	public partial class DataContext : DbManager
+	{
+		public Table<AlphabeticalListOfProduct>  AlphabeticalListOfProducts   { get { return this.GetTable<AlphabeticalListOfProduct>();  } }
+		/// <summary>
+		/// Description for Categories table.
+		/// </summary>
+		public Table<Category>                   Categories                   { get { return this.GetTable<Category>();                   } }
+		public Table<CategorySalesFor1997>       CategorySalesFor1997         { get { return this.GetTable<CategorySalesFor1997>();       } }
+		public Table<CurrentProductList>         CurrentProductLists          { get { return this.GetTable<CurrentProductList>();         } }
+		public Table<CustomerAndSuppliersByCity> CustomerAndSuppliersByCities { get { return this.GetTable<CustomerAndSuppliersByCity>(); } }
+		public Table<CustomerCustomerDemo>       CustomerCustomerDemos        { get { return this.GetTable<CustomerCustomerDemo>();       } }
+		public Table<CustomerDemographic>        CustomerDemographics         { get { return this.GetTable<CustomerDemographic>();        } }
+		/// <summary>
+		/// Description of Customers table.
+		/// </summary>
+		public Table<Customer>                   Customers                    { get { return this.GetTable<Customer>();                   } }
+		public Table<Employee>                   Employees                    { get { return this.GetTable<Employee>();                   } }
+		public Table<EmployeeTerritory>          EmployeeTerritories          { get { return this.GetTable<EmployeeTerritory>();          } }
+		public Table<Invoice>                    Invoices                     { get { return this.GetTable<Invoice>();                    } }
+		public Table<OrderDetail>                OrderDetails                 { get { return this.GetTable<OrderDetail>();                } }
+		public Table<OrderDetailsExtended>       OrderDetailsExtendeds        { get { return this.GetTable<OrderDetailsExtended>();       } }
+		public Table<OrderSubtotal>              OrderSubtotals               { get { return this.GetTable<OrderSubtotal>();              } }
+		public Table<Order>                      Orders                       { get { return this.GetTable<Order>();                      } }
+		public Table<OrdersQry>                  OrdersQries                  { get { return this.GetTable<OrdersQry>();                  } }
+		public Table<ProductSalesFor1997>        ProductSalesFor1997          { get { return this.GetTable<ProductSalesFor1997>();        } }
+		public Table<Product>                    Products                     { get { return this.GetTable<Product>();                    } }
+		public Table<ProductsAboveAveragePrice>  ProductsAboveAveragePrices   { get { return this.GetTable<ProductsAboveAveragePrice>();  } }
+		public Table<ProductsByCategory>         ProductsByCategories         { get { return this.GetTable<ProductsByCategory>();         } }
+		public Table<QuarterlyOrder>             QuarterlyOrders              { get { return this.GetTable<QuarterlyOrder>();             } }
+		public Table<Region>                     Regions                      { get { return this.GetTable<Region>();                     } }
+		public Table<SalesByCategory>            SalesByCategories            { get { return this.GetTable<SalesByCategory>();            } }
+		public Table<SalesTotalsByAmount>        SalesTotalsByAmounts         { get { return this.GetTable<SalesTotalsByAmount>();        } }
+		public Table<Shipper>                    Shippers                     { get { return this.GetTable<Shipper>();                    } }
+		public Table<SummaryOfSalesByQuarter>    SummaryOfSalesByQuarters     { get { return this.GetTable<SummaryOfSalesByQuarter>();    } }
+		public Table<SummaryOfSalesByYear>       SummaryOfSalesByYears        { get { return this.GetTable<SummaryOfSalesByYear>();       } }
+		public Table<Supplier>                   Suppliers                    { get { return this.GetTable<Supplier>();                   } }
+		public Table<Territory>                  Territories                  { get { return this.GetTable<Territory>();                  } }
+		
+		#region FreeTextTable
+		
+		public class FreeTextKey<T>
+		{
+			public T   Key;
+			public int Rank;
+		}
+		
+		class FreeTextTableExpressionAttribute : TableExpressionAttribute
+		{
+			public FreeTextTableExpressionAttribute()
+				: base("")
+			{
+			}
+		
+			public override void SetTable(SqlTable table, MemberInfo member, IEnumerable<Expression> expArgs, IEnumerable<ISqlExpression> sqlArgs)
+			{
+				var aargs  = sqlArgs.ToArray();
+				var arr    = ConvertArgs(member, aargs).ToList();
+				var method = (MethodInfo)member;
+				var sp     = new MsSql2008SqlProvider();
+		
+				{
+					var ttype  = method.GetGenericArguments()[0];
+					var tbl    = new SqlTable(ttype);
+		
+					var database     = tbl.Database     == null ? null : sp.Convert(tbl.Database,     ConvertType.NameToDatabase).  ToString();
+					var owner        = tbl.Owner        == null ? null : sp.Convert(tbl.Owner,        ConvertType.NameToOwner).     ToString();
+					var physicalName = tbl.PhysicalName == null ? null : sp.Convert(tbl.PhysicalName, ConvertType.NameToQueryTable).ToString();
+		
+					var name   = sp.BuildTableName(new StringBuilder(), database, owner, physicalName);
+		
+					arr.Add(new SqlExpression(name.ToString(), Precedence.Primary));
+				}
+		
+				{
+					var field = ((ConstantExpression)expArgs.First()).Value;
+		
+					if (field is string)
+					{
+						arr[0] = new SqlExpression(field.ToString(), Precedence.Primary);
+					}
+					else if (field is LambdaExpression)
+					{
+						var body = ((LambdaExpression)field).Body;
+		
+						if (body is MemberExpression)
+						{
+							var name = ((MemberExpression)body).Member.Name;
+		
+							name = sp.Convert(name, ConvertType.NameToQueryField).ToString();
+		
+							arr[0] = new SqlExpression(name, Precedence.Primary);
+						}
+					}
+				}
+		
+				table.SqlTableType   = SqlTableType.Expression;
+				table.Name           = "FREETEXTTABLE({6}, {2}, {3}) {1}";
+				table.TableArguments = arr.ToArray();
+			}
+		}
+		
+		[FreeTextTableExpressionAttribute]
+		public Table<FreeTextKey<TKey>> FreeTextTable<TTable,TKey>(string field, string text)
+		{
+			return this.GetTable<FreeTextKey<TKey>>(
+				this,
+				((MethodInfo)(MethodBase.GetCurrentMethod())).MakeGenericMethod(typeof(TTable), typeof(TKey)),
+				field,
+				text);
+		}
+		
+		[FreeTextTableExpressionAttribute]
+		public Table<FreeTextKey<TKey>> FreeTextTable<TTable,TKey>(Expression<Func<TTable,string>> fieldSelector, string text)
+		{
+			return this.GetTable<FreeTextKey<TKey>>(
+				this,
+				((MethodInfo)(MethodBase.GetCurrentMethod())).MakeGenericMethod(typeof(TTable), typeof(TKey)),
+				fieldSelector,
+				text);
+		}
+		
+		#endregion
+	}
+
+	// View
+	[TableName(Name="Alphabetical list of products")]
+	public partial class AlphabeticalListOfProduct
+	{
+		           public int      ProductID       { get; set; } // int(10)
+		           public string   ProductName     { get; set; } // nvarchar(40)
+		[Nullable] public int?     SupplierID      { get; set; } // int(10)
+		[Nullable] public int?     CategoryID      { get; set; } // int(10)
+		[Nullable] public string   QuantityPerUnit { get; set; } // nvarchar(20)
+		[Nullable] public decimal? UnitPrice       { get; set; } // money(19,4)
+		[Nullable] public short?   UnitsInStock    { get; set; } // smallint(5)
+		[Nullable] public short?   UnitsOnOrder    { get; set; } // smallint(5)
+		[Nullable] public short?   ReorderLevel    { get; set; } // smallint(5)
+		           public bool     Discontinued    { get; set; } // bit
+		           public string   CategoryName    { get; set; } // nvarchar(15)
+	}
+
+	/// <summary>
+	/// Description for Categories table.
+	/// </summary>
+	[TableName(Name="Categories")]
+	public partial class Category
+	{
+		/// <summary>
+		/// Description of Categories.CategoryID field.
+		/// </summary>
+		[Identity, PrimaryKey(1)] public int    CategoryID   { get; set; } // int(10)
+		                          public string CategoryName { get; set; } // nvarchar(15)
+		[Nullable               ] public string Description  { get; set; } // ntext(1073741823)
+		[Nullable               ] public byte[] Picture      { get; set; } // image(2147483647)
+
+		// FK_Products_Categories_BackReference
+		[Association(ThisKey="CategoryID", OtherKey="CategoryID", CanBeNull=true)]
+		public IEnumerable<Product> Products { get; set; }
+	}
+
+	// View
+	[TableName(Name="Category Sales for 1997")]
+	public partial class CategorySalesFor1997
+	{
+		           public string   CategoryName  { get; set; } // nvarchar(15)
+		[Nullable] public decimal? CategorySales { get; set; } // money(19,4)
+	}
+
+	// View
+	[TableName(Name="Current Product List")]
+	public partial class CurrentProductList
+	{
+		[Identity] public int    ProductID   { get; set; } // int(10)
+		           public string ProductName { get; set; } // nvarchar(40)
+	}
+
+	// View
+	[TableName(Name="Customer and Suppliers by City")]
+	public partial class CustomerAndSuppliersByCity
+	{
+		[Nullable] public string City         { get; set; } // nvarchar(15)
+		           public string CompanyName  { get; set; } // nvarchar(40)
+		[Nullable] public string ContactName  { get; set; } // nvarchar(30)
+		           public string Relationship { get; set; } // varchar(9)
+	}
+
+	[TableName(Name="CustomerCustomerDemo")]
+	public partial class CustomerCustomerDemo
+	{
+		[PrimaryKey(1)] public string CustomerID     { get; set; } // nchar(5)
+		[PrimaryKey(2)] public string CustomerTypeID { get; set; } // nchar(10)
+
+		// FK_CustomerCustomerDemo
+		[Association(ThisKey="CustomerTypeID", OtherKey="CustomerTypeID", CanBeNull=false)]
+		public CustomerDemographic FK_CustomerCustomerDemo { get; set; }
+
+		// FK_CustomerCustomerDemo_Customers
+		[Association(ThisKey="CustomerID", OtherKey="CustomerID", CanBeNull=false)]
+		public Customer Customer { get; set; }
+	}
+
+	[TableName(Name="CustomerDemographics")]
+	public partial class CustomerDemographic
+	{
+		[          PrimaryKey(1)] public string CustomerTypeID { get; set; } // nchar(10)
+		[Nullable               ] public string CustomerDesc   { get; set; } // ntext(1073741823)
+
+		// FK_CustomerCustomerDemo_BackReference
+		[Association(ThisKey="CustomerTypeID", OtherKey="CustomerTypeID", CanBeNull=true)]
+		public IEnumerable<CustomerCustomerDemo> CustomerCustomerDemos { get; set; }
+	}
+
+	/// <summary>
+	/// Description of Customers table.
+	/// </summary>
+	[TableName(Name="Customers")]
+	public partial class Customer
+	{
+		/// <summary>
+		/// Just ID.
+		/// </summary>
+		[          PrimaryKey(1)] public string CustomerID   { get; set; } // nchar(5)
+		/// <summary>
+		/// Name of the Company.
+		/// </summary>
+		                          public string CompanyName  { get; set; } // nvarchar(40)
+		[Nullable               ] public string ContactName  { get; set; } // nvarchar(30)
+		[Nullable               ] public string ContactTitle { get; set; } // nvarchar(30)
+		[Nullable               ] public string Address      { get; set; } // nvarchar(60)
+		[Nullable               ] public string City         { get; set; } // nvarchar(15)
+		[Nullable               ] public string Region       { get; set; } // nvarchar(15)
+		[Nullable               ] public string PostalCode   { get; set; } // nvarchar(10)
+		[Nullable               ] public string Country      { get; set; } // nvarchar(15)
+		[Nullable               ] public string Phone        { get; set; } // nvarchar(24)
+		[Nullable               ] public string Fax          { get; set; } // nvarchar(24)
+
+		// FK_Orders_Customers_BackReference
+		[Association(ThisKey="CustomerID", OtherKey="CustomerID", CanBeNull=true)]
+		public IEnumerable<Order> Orders { get; set; }
+
+		// FK_CustomerCustomerDemo_Customers_BackReference
+		[Association(ThisKey="CustomerID", OtherKey="CustomerID", CanBeNull=true)]
+		public IEnumerable<CustomerCustomerDemo> CustomerCustomerDemos { get; set; }
+	}
+
+	[TableName(Name="Employees")]
+	public partial class Employee
+	{
+		[Identity, PrimaryKey(1)] public int       EmployeeID      { get; set; } // int(10)
+		                          public string    LastName        { get; set; } // nvarchar(20)
+		                          public string    FirstName       { get; set; } // nvarchar(10)
+		[Nullable               ] public string    Title           { get; set; } // nvarchar(30)
+		[Nullable               ] public string    TitleOfCourtesy { get; set; } // nvarchar(25)
+		[Nullable               ] public DateTime? BirthDate       { get; set; } // datetime(3)
+		[Nullable               ] public DateTime? HireDate        { get; set; } // datetime(3)
+		[Nullable               ] public string    Address         { get; set; } // nvarchar(60)
+		[Nullable               ] public string    City            { get; set; } // nvarchar(15)
+		[Nullable               ] public string    Region          { get; set; } // nvarchar(15)
+		[Nullable               ] public string    PostalCode      { get; set; } // nvarchar(10)
+		[Nullable               ] public string    Country         { get; set; } // nvarchar(15)
+		[Nullable               ] public string    HomePhone       { get; set; } // nvarchar(24)
+		[Nullable               ] public string    Extension       { get; set; } // nvarchar(4)
+		[Nullable               ] public byte[]    Photo           { get; set; } // image(2147483647)
+		[Nullable               ] public string    Notes           { get; set; } // ntext(1073741823)
+		[Nullable               ] public int?      ReportsTo       { get; set; } // int(10)
+		[Nullable               ] public string    PhotoPath       { get; set; } // nvarchar(255)
+
+		// FK_Employees_Employees
+		[Association(ThisKey="ReportsTo", OtherKey="EmployeeID", CanBeNull=true)]
+		public Employee FK_Employees_Employees { get; set; }
+
+		// FK_Orders_Employees_BackReference
+		[Association(ThisKey="EmployeeID", OtherKey="EmployeeID", CanBeNull=true)]
+		public IEnumerable<Order> Orders { get; set; }
+
+		// FK_EmployeeTerritories_Employees_BackReference
+		[Association(ThisKey="EmployeeID", OtherKey="EmployeeID", CanBeNull=true)]
+		public IEnumerable<EmployeeTerritory> EmployeeTerritories { get; set; }
+
+		// FK_Employees_Employees_BackReference
+		[Association(ThisKey="EmployeeID", OtherKey="ReportsTo", CanBeNull=true)]
+		public IEnumerable<Employee> FK_Employees_Employees_BackReference { get; set; }
+	}
+
+	[TableName(Name="EmployeeTerritories")]
+	public partial class EmployeeTerritory
+	{
+		[PrimaryKey(1)] public int    EmployeeID  { get; set; } // int(10)
+		[PrimaryKey(2)] public string TerritoryID { get; set; } // nvarchar(20)
+
+		// FK_EmployeeTerritories_Employees
+		[Association(ThisKey="EmployeeID", OtherKey="EmployeeID", CanBeNull=false)]
+		public Employee Employee { get; set; }
+
+		// FK_EmployeeTerritories_Territories
+		[Association(ThisKey="TerritoryID", OtherKey="TerritoryID", CanBeNull=false)]
+		public Territory Territory { get; set; }
+	}
+
+	// View
+	[TableName(Name="Invoices")]
+	public partial class Invoice
+	{
+		[Nullable] public string    ShipName       { get; set; } // nvarchar(40)
+		[Nullable] public string    ShipAddress    { get; set; } // nvarchar(60)
+		[Nullable] public string    ShipCity       { get; set; } // nvarchar(15)
+		[Nullable] public string    ShipRegion     { get; set; } // nvarchar(15)
+		[Nullable] public string    ShipPostalCode { get; set; } // nvarchar(10)
+		[Nullable] public string    ShipCountry    { get; set; } // nvarchar(15)
+		[Nullable] public string    CustomerID     { get; set; } // nchar(5)
+		           public string    CustomerName   { get; set; } // nvarchar(40)
+		[Nullable] public string    Address        { get; set; } // nvarchar(60)
+		[Nullable] public string    City           { get; set; } // nvarchar(15)
+		[Nullable] public string    Region         { get; set; } // nvarchar(15)
+		[Nullable] public string    PostalCode     { get; set; } // nvarchar(10)
+		[Nullable] public string    Country        { get; set; } // nvarchar(15)
+		           public string    Salesperson    { get; set; } // nvarchar(31)
+		           public int       OrderID        { get; set; } // int(10)
+		[Nullable] public DateTime? OrderDate      { get; set; } // datetime(3)
+		[Nullable] public DateTime? RequiredDate   { get; set; } // datetime(3)
+		[Nullable] public DateTime? ShippedDate    { get; set; } // datetime(3)
+		           public string    ShipperName    { get; set; } // nvarchar(40)
+		           public int       ProductID      { get; set; } // int(10)
+		           public string    ProductName    { get; set; } // nvarchar(40)
+		           public decimal   UnitPrice      { get; set; } // money(19,4)
+		           public short     Quantity       { get; set; } // smallint(5)
+		           public float     Discount       { get; set; } // real(24)
+		[Nullable] public decimal?  ExtendedPrice  { get; set; } // money(19,4)
+		[Nullable] public decimal?  Freight        { get; set; } // money(19,4)
+	}
+
+	[TableName(Name="Order Details")]
+	public partial class OrderDetail
+	{
+		[PrimaryKey(1)] public int     OrderID   { get; set; } // int(10)
+		[PrimaryKey(2)] public int     ProductID { get; set; } // int(10)
+		                public decimal UnitPrice { get; set; } // money(19,4)
+		                public short   Quantity  { get; set; } // smallint(5)
+		                public float   Discount  { get; set; } // real(24)
+
+		// FK_Order_Details_Orders
+		[Association(ThisKey="OrderID", OtherKey="OrderID", CanBeNull=false)]
+		public Order OrderDetailsOrder { get; set; }
+
+		// FK_Order_Details_Products
+		[Association(ThisKey="ProductID", OtherKey="ProductID", CanBeNull=false)]
+		public Product OrderDetailsProduct { get; set; }
+	}
+
+	// View
+	[TableName(Name="Order Details Extended")]
+	public partial class OrderDetailsExtended
+	{
+		           public int      OrderID       { get; set; } // int(10)
+		           public int      ProductID     { get; set; } // int(10)
+		           public string   ProductName   { get; set; } // nvarchar(40)
+		           public decimal  UnitPrice     { get; set; } // money(19,4)
+		           public short    Quantity      { get; set; } // smallint(5)
+		           public float    Discount      { get; set; } // real(24)
+		[Nullable] public decimal? ExtendedPrice { get; set; } // money(19,4)
+	}
+
+	// View
+	[TableName(Name="Order Subtotals")]
+	public partial class OrderSubtotal
+	{
+		           public int      OrderID  { get; set; } // int(10)
+		[Nullable] public decimal? Subtotal { get; set; } // money(19,4)
+	}
+
+	[TableName(Name="Orders")]
+	public partial class Order
+	{
+		[Identity, PrimaryKey(1)] public int       OrderID        { get; set; } // int(10)
+		[Nullable               ] public string    CustomerID     { get; set; } // nchar(5)
+		[Nullable               ] public int?      EmployeeID     { get; set; } // int(10)
+		[Nullable               ] public DateTime? OrderDate      { get; set; } // datetime(3)
+		[Nullable               ] public DateTime? RequiredDate   { get; set; } // datetime(3)
+		[Nullable               ] public DateTime? ShippedDate    { get; set; } // datetime(3)
+		[Nullable               ] public int?      ShipVia        { get; set; } // int(10)
+		[Nullable               ] public decimal?  Freight        { get; set; } // money(19,4)
+		[Nullable               ] public string    ShipName       { get; set; } // nvarchar(40)
+		[Nullable               ] public string    ShipAddress    { get; set; } // nvarchar(60)
+		[Nullable               ] public string    ShipCity       { get; set; } // nvarchar(15)
+		[Nullable               ] public string    ShipRegion     { get; set; } // nvarchar(15)
+		[Nullable               ] public string    ShipPostalCode { get; set; } // nvarchar(10)
+		[Nullable               ] public string    ShipCountry    { get; set; } // nvarchar(15)
+
+		// FK_Orders_Shippers
+		[Association(ThisKey="ShipVia", OtherKey="ShipperID", CanBeNull=true)]
+		public Shipper Shipper { get; set; }
+
+		// FK_Orders_Employees
+		[Association(ThisKey="EmployeeID", OtherKey="EmployeeID", CanBeNull=true)]
+		public Employee Employee { get; set; }
+
+		// FK_Orders_Customers
+		[Association(ThisKey="CustomerID", OtherKey="CustomerID", CanBeNull=true)]
+		public Customer Customer { get; set; }
+
+		// FK_Order_Details_Orders_BackReference
+		[Association(ThisKey="OrderID", OtherKey="OrderID", CanBeNull=true)]
+		public IEnumerable<OrderDetail> OrderDetails { get; set; }
+	}
+
+	// View
+	[TableName(Name="Orders Qry")]
+	public partial class OrdersQry
+	{
+		           public int       OrderID        { get; set; } // int(10)
+		[Nullable] public string    CustomerID     { get; set; } // nchar(5)
+		[Nullable] public int?      EmployeeID     { get; set; } // int(10)
+		[Nullable] public DateTime? OrderDate      { get; set; } // datetime(3)
+		[Nullable] public DateTime? RequiredDate   { get; set; } // datetime(3)
+		[Nullable] public DateTime? ShippedDate    { get; set; } // datetime(3)
+		[Nullable] public int?      ShipVia        { get; set; } // int(10)
+		[Nullable] public decimal?  Freight        { get; set; } // money(19,4)
+		[Nullable] public string    ShipName       { get; set; } // nvarchar(40)
+		[Nullable] public string    ShipAddress    { get; set; } // nvarchar(60)
+		[Nullable] public string    ShipCity       { get; set; } // nvarchar(15)
+		[Nullable] public string    ShipRegion     { get; set; } // nvarchar(15)
+		[Nullable] public string    ShipPostalCode { get; set; } // nvarchar(10)
+		[Nullable] public string    ShipCountry    { get; set; } // nvarchar(15)
+		           public string    CompanyName    { get; set; } // nvarchar(40)
+		[Nullable] public string    Address        { get; set; } // nvarchar(60)
+		[Nullable] public string    City           { get; set; } // nvarchar(15)
+		[Nullable] public string    Region         { get; set; } // nvarchar(15)
+		[Nullable] public string    PostalCode     { get; set; } // nvarchar(10)
+		[Nullable] public string    Country        { get; set; } // nvarchar(15)
+	}
+
+	// View
+	[TableName(Name="Product Sales for 1997")]
+	public partial class ProductSalesFor1997
+	{
+		           public string   CategoryName { get; set; } // nvarchar(15)
+		           public string   ProductName  { get; set; } // nvarchar(40)
+		[Nullable] public decimal? ProductSales { get; set; } // money(19,4)
+	}
+
+	[TableName(Name="Products")]
+	public partial class Product
+	{
+		[Identity, PrimaryKey(1)                                           ] public int      ProductID       { get; set; } // int(10)
+		                                                                     public string   ProductName     { get; set; } // nvarchar(40)
+		[Nullable                                                          ] public int?     SupplierID      { get; set; } // int(10)
+		[Nullable                                                          ] public int?     CategoryID      { get; set; } // int(10)
+		[Nullable                                                          ] public string   QuantityPerUnit { get; set; } // nvarchar(20)
+		[Nullable                                                          ] public decimal? UnitPrice       { get; set; } // money(19,4)
+		[Nullable                                                          ] public short?   UnitsInStock    { get; set; } // smallint(5)
+		[Nullable                                                          ] public short?   UnitsOnOrder    { get; set; } // smallint(5)
+		[Nullable                                                          ] public short?   ReorderLevel    { get; set; } // smallint(5)
+		[                         MapField(IsInheritanceDiscriminator=true)] public bool     Discontinued    { get; set; } // bit
+
+		// FK_Products_Suppliers
+		[Association(ThisKey="SupplierID", OtherKey="SupplierID", CanBeNull=true)]
+		public Supplier Supplier { get; set; }
+
+		// FK_Products_Categories
+		[Association(ThisKey="CategoryID", OtherKey="CategoryID", CanBeNull=true)]
+		public Category Category { get; set; }
+
+		// FK_Order_Details_Products_BackReference
+		[Association(ThisKey="ProductID", OtherKey="ProductID", CanBeNull=true)]
+		public IEnumerable<OrderDetail> OrderDetails { get; set; }
+	}
+
+	// View
+	[TableName(Name="Products Above Average Price")]
+	public partial class ProductsAboveAveragePrice
+	{
+		           public string   ProductName { get; set; } // nvarchar(40)
+		[Nullable] public decimal? UnitPrice   { get; set; } // money(19,4)
+	}
+
+	// View
+	[TableName(Name="Products by Category")]
+	public partial class ProductsByCategory
+	{
+		           public string CategoryName    { get; set; } // nvarchar(15)
+		           public string ProductName     { get; set; } // nvarchar(40)
+		[Nullable] public string QuantityPerUnit { get; set; } // nvarchar(20)
+		[Nullable] public short? UnitsInStock    { get; set; } // smallint(5)
+		           public bool   Discontinued    { get; set; } // bit
+	}
+
+	// View
+	[TableName(Name="Quarterly Orders")]
+	public partial class QuarterlyOrder
+	{
+		[Nullable] public string CustomerID  { get; set; } // nchar(5)
+		[Nullable] public string CompanyName { get; set; } // nvarchar(40)
+		[Nullable] public string City        { get; set; } // nvarchar(15)
+		[Nullable] public string Country     { get; set; } // nvarchar(15)
+	}
+
+	[TableName(Name="Region")]
+	public partial class Region
+	{
+		[PrimaryKey(1)] public int    RegionID          { get; set; } // int(10)
+		                public string RegionDescription { get; set; } // nchar(50)
+
+		// FK_Territories_Region_BackReference
+		[Association(ThisKey="RegionID", OtherKey="RegionID", CanBeNull=true)]
+		public IEnumerable<Territory> Territories { get; set; }
+	}
+
+	// View
+	[TableName(Name="Sales by Category")]
+	public partial class SalesByCategory
+	{
+		           public int      CategoryID   { get; set; } // int(10)
+		           public string   CategoryName { get; set; } // nvarchar(15)
+		           public string   ProductName  { get; set; } // nvarchar(40)
+		[Nullable] public decimal? ProductSales { get; set; } // money(19,4)
+	}
+
+	// View
+	[TableName(Name="Sales Totals by Amount")]
+	public partial class SalesTotalsByAmount
+	{
+		[Nullable] public decimal?  SaleAmount  { get; set; } // money(19,4)
+		           public int       OrderID     { get; set; } // int(10)
+		           public string    CompanyName { get; set; } // nvarchar(40)
+		[Nullable] public DateTime? ShippedDate { get; set; } // datetime(3)
+	}
+
+	[TableName(Name="Shippers")]
+	public partial class Shipper
+	{
+		[Identity, PrimaryKey(1)] public int    ShipperID   { get; set; } // int(10)
+		                          public string CompanyName { get; set; } // nvarchar(40)
+		[Nullable               ] public string Phone       { get; set; } // nvarchar(24)
+
+		// FK_Orders_Shippers_BackReference
+		[Association(ThisKey="ShipperID", OtherKey="ShipVia", CanBeNull=true)]
+		public IEnumerable<Order> Orders { get; set; }
+	}
+
+	// View
+	[TableName(Name="Summary of Sales by Quarter")]
+	public partial class SummaryOfSalesByQuarter
+	{
+		[Nullable] public DateTime? ShippedDate { get; set; } // datetime(3)
+		           public int       OrderID     { get; set; } // int(10)
+		[Nullable] public decimal?  Subtotal    { get; set; } // money(19,4)
+	}
+
+	// View
+	[TableName(Name="Summary of Sales by Year")]
+	public partial class SummaryOfSalesByYear
+	{
+		[Nullable] public DateTime? ShippedDate { get; set; } // datetime(3)
+		           public int       OrderID     { get; set; } // int(10)
+		[Nullable] public decimal?  Subtotal    { get; set; } // money(19,4)
+	}
+
+	[TableName(Name="Suppliers")]
+	public partial class Supplier
+	{
+		[Identity, PrimaryKey(1)] public int    SupplierID   { get; set; } // int(10)
+		                          public string CompanyName  { get; set; } // nvarchar(40)
+		[Nullable               ] public string ContactName  { get; set; } // nvarchar(30)
+		[Nullable               ] public string ContactTitle { get; set; } // nvarchar(30)
+		[Nullable               ] public string Address      { get; set; } // nvarchar(60)
+		[Nullable               ] public string City         { get; set; } // nvarchar(15)
+		[Nullable               ] public string Region       { get; set; } // nvarchar(15)
+		[Nullable               ] public string PostalCode   { get; set; } // nvarchar(10)
+		[Nullable               ] public string Country      { get; set; } // nvarchar(15)
+		[Nullable               ] public string Phone        { get; set; } // nvarchar(24)
+		[Nullable               ] public string Fax          { get; set; } // nvarchar(24)
+		[Nullable               ] public string HomePage     { get; set; } // ntext(1073741823)
+
+		// FK_Products_Suppliers_BackReference
+		[Association(ThisKey="SupplierID", OtherKey="SupplierID", CanBeNull=true)]
+		public IEnumerable<Product> Products { get; set; }
+	}
+
+	[TableName(Name="Territories")]
+	public partial class Territory
+	{
+		[PrimaryKey(1)] public string TerritoryID          { get; set; } // nvarchar(20)
+		                public string TerritoryDescription { get; set; } // nchar(50)
+		                public int    RegionID             { get; set; } // int(10)
+
+		// FK_Territories_Region
+		[Association(ThisKey="RegionID", OtherKey="RegionID", CanBeNull=false)]
+		public Region Region { get; set; }
+
+		// FK_EmployeeTerritories_Territories_BackReference
+		[Association(ThisKey="TerritoryID", OtherKey="TerritoryID", CanBeNull=true)]
+		public IEnumerable<EmployeeTerritory> EmployeeTerritories { get; set; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/NorthwindDataService/DataContext.tt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+<#@ template language="C#" debug="True" hostspecific="True" #>
+<#@ output extension=".generated.cs" #>
+<#@ include file="$(SolutionDir)\Source\Templates\BLToolkit.ttinclude"            #>
+<#@ include file="$(SolutionDir)\Source\Templates\MSSql.ttinclude"                #>
+<#@ include file="$(SolutionDir)\Source\Templates\PluralSingular.ttinclude"       #>
+<#
+	ConnectionString = "Server=.;Database=Northwind;Integrated Security=SSPI";
+	Namespace        = "NorthwindDS";
+
+	LoadMetadata();
+
+	Tables["Products"].Columns["Discontinued"].Attributes.Add("MapField(IsInheritanceDiscriminator=true)");
+	
+	GenerateModel();
+#>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/NorthwindDataService/DataService.svc	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,3 @@
+
+
+<%@ ServiceHost Language="C#" Factory="System.Data.Services.DataServiceHostFactory, System.Data.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Service="NorthwindDataService.DataService" %>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/NorthwindDataService/DataService.svc.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,19 @@
+using System;
+using System.Data.Services;
+using System.Data.Services.Common;
+
+namespace NorthwindDataService
+{
+	public class DataService : BLToolkit.ServiceModel.DataService<NorthwindDS.DataContext>
+	{
+		// This method is called only once to initialize service-wide policies.
+		public static void InitializeService(DataServiceConfiguration config)
+		{
+			// TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
+			// Examples:
+			config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
+			// config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All);
+			config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/NorthwindDataService/EFDataService.svc	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,3 @@
+
+
+<%@ ServiceHost Language="C#" Factory="System.Data.Services.DataServiceHostFactory, System.Data.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Service="NorthwindDataService.EFDataService" %>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/NorthwindDataService/EFDataService.svc.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,24 @@
+using System;
+using System.Data.Metadata.Edm;
+using System.Data.Objects;
+using System.Data.Services;
+using System.Data.Services.Common;
+
+namespace NorthwindDataService
+{
+	public class EFDataService : DataService<NorthwindEntities>
+	{
+		// This method is called only once to initialize service-wide policies.
+		public static void InitializeService(DataServiceConfiguration config)
+		{
+			var w = new MetadataWorkspace();
+			var m = new ObjectStateManager(w);
+
+			// TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
+			// Examples:
+			config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
+			// config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All);
+			config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/NorthwindDataService/NorthwindDataService.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>
+    </ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{87FB4F28-5DCC-4F21-B83E-59C85E1A7423}</ProjectGuid>
+    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>NorthwindDataService</RootNamespace>
+    <AssemblyName>NorthwindDataService</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <UseIISExpress>false</UseIISExpress>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>4.0</OldToolsVersion>
+    <UpgradeBackupLocation />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Data.Entity" />
+    <Reference Include="System.Data.Services" />
+    <Reference Include="System.Data.Services.Client" />
+    <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.Security" />
+    <Reference Include="System.ServiceModel" />
+    <Reference Include="System.ServiceModel.Web" />
+    <Reference Include="System.Web.Extensions" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Web" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Configuration" />
+    <Reference Include="System.Web.Services" />
+    <Reference Include="System.EnterpriseServices" />
+    <Reference Include="System.Web.DynamicData" />
+    <Reference Include="System.Web.Entity" />
+    <Reference Include="System.Web.ApplicationServices" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="DataService.svc" />
+    <Content Include="EFDataService.svc" />
+    <Content Include="Web.config" />
+    <Content Include="Web.Debug.config">
+      <DependentUpon>Web.config</DependentUpon>
+    </Content>
+    <Content Include="Web.Release.config">
+      <DependentUpon>Web.config</DependentUpon>
+    </Content>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="DataContext.cs" />
+    <Compile Include="DataService.svc.cs">
+      <DependentUpon>DataService.svc</DependentUpon>
+    </Compile>
+    <Compile Include="DataContext.generated.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>DataContext.tt</DependentUpon>
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="EFDataService.svc.cs">
+      <DependentUpon>EFDataService.svc</DependentUpon>
+    </Compile>
+    <Compile Include="NorthwindModel.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>NorthwindModel.edmx</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="DataContext.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>DataContext.generated.cs</LastGenOutput>
+    </None>
+    <EntityDeploy Include="NorthwindModel.edmx">
+      <Generator>EntityModelCodeGenerator</Generator>
+      <LastGenOutput>NorthwindModel.Designer.cs</LastGenOutput>
+    </EntityDeploy>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
+  </ItemGroup>
+  <PropertyGroup>
+    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
+    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
+  </PropertyGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
+  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />
+  <ProjectExtensions>
+    <VisualStudio>
+      <FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
+        <WebProjectProperties>
+          <UseIIS>False</UseIIS>
+          <AutoAssignPort>True</AutoAssignPort>
+          <DevelopmentServerPort>58025</DevelopmentServerPort>
+          <DevelopmentServerVPath>/</DevelopmentServerVPath>
+          <IISUrl>
+          </IISUrl>
+          <NTLMAuthentication>False</NTLMAuthentication>
+          <UseCustomServer>False</UseCustomServer>
+          <CustomServerUrl>
+          </CustomServerUrl>
+          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
+        </WebProjectProperties>
+      </FlavorProperties>
+    </VisualStudio>
+  </ProjectExtensions>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/NorthwindDataService/NorthwindModel.Designer.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,6960 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//    This code was generated from a template.
+//
+//    Manual changes to this file may cause unexpected behavior in your application.
+//    Manual changes to this file will be overwritten if the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+using System;
+using System.ComponentModel;
+using System.Data.EntityClient;
+using System.Data.Objects;
+using System.Data.Objects.DataClasses;
+using System.Linq;
+using System.Runtime.Serialization;
+using System.Xml.Serialization;
+
+[assembly: EdmSchemaAttribute()]
+#region EDM Relationship Metadata
+
+[assembly: EdmRelationshipAttribute("NorthwindModel", "FK_Products_Categories", "Categories", System.Data.Metadata.Edm.RelationshipMultiplicity.ZeroOrOne, typeof(NorthwindDataService.Category), "Products", System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(NorthwindDataService.Product), true)]
+[assembly: EdmRelationshipAttribute("NorthwindModel", "FK_Orders_Customers", "Customers", System.Data.Metadata.Edm.RelationshipMultiplicity.ZeroOrOne, typeof(NorthwindDataService.Customer), "Orders", System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(NorthwindDataService.Order), true)]
+[assembly: EdmRelationshipAttribute("NorthwindModel", "FK_Employees_Employees", "Employees", System.Data.Metadata.Edm.RelationshipMultiplicity.ZeroOrOne, typeof(NorthwindDataService.Employee), "Employees1", System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(NorthwindDataService.Employee), true)]
+[assembly: EdmRelationshipAttribute("NorthwindModel", "FK_Orders_Employees", "Employees", System.Data.Metadata.Edm.RelationshipMultiplicity.ZeroOrOne, typeof(NorthwindDataService.Employee), "Orders", System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(NorthwindDataService.Order), true)]
+[assembly: EdmRelationshipAttribute("NorthwindModel", "FK_Order_Details_Orders", "Orders", System.Data.Metadata.Edm.RelationshipMultiplicity.One, typeof(NorthwindDataService.Order), "Order_Details", System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(NorthwindDataService.Order_Detail), true)]
+[assembly: EdmRelationshipAttribute("NorthwindModel", "FK_Order_Details_Products", "Products", System.Data.Metadata.Edm.RelationshipMultiplicity.One, typeof(NorthwindDataService.Product), "Order_Details", System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(NorthwindDataService.Order_Detail), true)]
+[assembly: EdmRelationshipAttribute("NorthwindModel", "FK_Orders_Shippers", "Shippers", System.Data.Metadata.Edm.RelationshipMultiplicity.ZeroOrOne, typeof(NorthwindDataService.Shipper), "Orders", System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(NorthwindDataService.Order), true)]
+[assembly: EdmRelationshipAttribute("NorthwindModel", "FK_Products_Suppliers", "Suppliers", System.Data.Metadata.Edm.RelationshipMultiplicity.ZeroOrOne, typeof(NorthwindDataService.Supplier), "Products", System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(NorthwindDataService.Product), true)]
+[assembly: EdmRelationshipAttribute("NorthwindModel", "FK_Territories_Region", "Region", System.Data.Metadata.Edm.RelationshipMultiplicity.One, typeof(NorthwindDataService.Region), "Territories", System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(NorthwindDataService.Territory), true)]
+[assembly: EdmRelationshipAttribute("NorthwindModel", "CustomerCustomerDemo", "CustomerDemographics", System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(NorthwindDataService.CustomerDemographic), "Customers", System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(NorthwindDataService.Customer))]
+[assembly: EdmRelationshipAttribute("NorthwindModel", "EmployeeTerritories", "Employees", System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(NorthwindDataService.Employee), "Territories", System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(NorthwindDataService.Territory))]
+
+#endregion
+
+namespace NorthwindDataService
+{
+    #region Contexts
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    public partial class NorthwindEntities : ObjectContext
+    {
+        #region Constructors
+    
+        /// <summary>
+        /// Initializes a new NorthwindEntities object using the connection string found in the 'NorthwindEntities' section of the application configuration file.
+        /// </summary>
+        public NorthwindEntities() : base("name=NorthwindEntities", "NorthwindEntities")
+        {
+            this.ContextOptions.LazyLoadingEnabled = true;
+            OnContextCreated();
+        }
+    
+        /// <summary>
+        /// Initialize a new NorthwindEntities object.
+        /// </summary>
+        public NorthwindEntities(string connectionString) : base(connectionString, "NorthwindEntities")
+        {
+            this.ContextOptions.LazyLoadingEnabled = true;
+            OnContextCreated();
+        }
+    
+        /// <summary>
+        /// Initialize a new NorthwindEntities object.
+        /// </summary>
+        public NorthwindEntities(EntityConnection connection) : base(connection, "NorthwindEntities")
+        {
+            this.ContextOptions.LazyLoadingEnabled = true;
+            OnContextCreated();
+        }
+    
+        #endregion
+    
+        #region Partial Methods
+    
+        partial void OnContextCreated();
+    
+        #endregion
+    
+        #region ObjectSet Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<Category> Categories
+        {
+            get
+            {
+                if ((_Categories == null))
+                {
+                    _Categories = base.CreateObjectSet<Category>("Categories");
+                }
+                return _Categories;
+            }
+        }
+        private ObjectSet<Category> _Categories;
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<CustomerDemographic> CustomerDemographics
+        {
+            get
+            {
+                if ((_CustomerDemographics == null))
+                {
+                    _CustomerDemographics = base.CreateObjectSet<CustomerDemographic>("CustomerDemographics");
+                }
+                return _CustomerDemographics;
+            }
+        }
+        private ObjectSet<CustomerDemographic> _CustomerDemographics;
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<Customer> Customers
+        {
+            get
+            {
+                if ((_Customers == null))
+                {
+                    _Customers = base.CreateObjectSet<Customer>("Customers");
+                }
+                return _Customers;
+            }
+        }
+        private ObjectSet<Customer> _Customers;
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<Employee> Employees
+        {
+            get
+            {
+                if ((_Employees == null))
+                {
+                    _Employees = base.CreateObjectSet<Employee>("Employees");
+                }
+                return _Employees;
+            }
+        }
+        private ObjectSet<Employee> _Employees;
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<Order_Detail> Order_Details
+        {
+            get
+            {
+                if ((_Order_Details == null))
+                {
+                    _Order_Details = base.CreateObjectSet<Order_Detail>("Order_Details");
+                }
+                return _Order_Details;
+            }
+        }
+        private ObjectSet<Order_Detail> _Order_Details;
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<Order> Orders
+        {
+            get
+            {
+                if ((_Orders == null))
+                {
+                    _Orders = base.CreateObjectSet<Order>("Orders");
+                }
+                return _Orders;
+            }
+        }
+        private ObjectSet<Order> _Orders;
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<Product> Products
+        {
+            get
+            {
+                if ((_Products == null))
+                {
+                    _Products = base.CreateObjectSet<Product>("Products");
+                }
+                return _Products;
+            }
+        }
+        private ObjectSet<Product> _Products;
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<Region> Regions
+        {
+            get
+            {
+                if ((_Regions == null))
+                {
+                    _Regions = base.CreateObjectSet<Region>("Regions");
+                }
+                return _Regions;
+            }
+        }
+        private ObjectSet<Region> _Regions;
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<Shipper> Shippers
+        {
+            get
+            {
+                if ((_Shippers == null))
+                {
+                    _Shippers = base.CreateObjectSet<Shipper>("Shippers");
+                }
+                return _Shippers;
+            }
+        }
+        private ObjectSet<Shipper> _Shippers;
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<Supplier> Suppliers
+        {
+            get
+            {
+                if ((_Suppliers == null))
+                {
+                    _Suppliers = base.CreateObjectSet<Supplier>("Suppliers");
+                }
+                return _Suppliers;
+            }
+        }
+        private ObjectSet<Supplier> _Suppliers;
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<sysdiagram> sysdiagrams
+        {
+            get
+            {
+                if ((_sysdiagrams == null))
+                {
+                    _sysdiagrams = base.CreateObjectSet<sysdiagram>("sysdiagrams");
+                }
+                return _sysdiagrams;
+            }
+        }
+        private ObjectSet<sysdiagram> _sysdiagrams;
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<Territory> Territories
+        {
+            get
+            {
+                if ((_Territories == null))
+                {
+                    _Territories = base.CreateObjectSet<Territory>("Territories");
+                }
+                return _Territories;
+            }
+        }
+        private ObjectSet<Territory> _Territories;
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<Alphabetical_list_of_product> Alphabetical_list_of_products
+        {
+            get
+            {
+                if ((_Alphabetical_list_of_products == null))
+                {
+                    _Alphabetical_list_of_products = base.CreateObjectSet<Alphabetical_list_of_product>("Alphabetical_list_of_products");
+                }
+                return _Alphabetical_list_of_products;
+            }
+        }
+        private ObjectSet<Alphabetical_list_of_product> _Alphabetical_list_of_products;
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<Category_Sales_for_1997> Category_Sales_for_1997
+        {
+            get
+            {
+                if ((_Category_Sales_for_1997 == null))
+                {
+                    _Category_Sales_for_1997 = base.CreateObjectSet<Category_Sales_for_1997>("Category_Sales_for_1997");
+                }
+                return _Category_Sales_for_1997;
+            }
+        }
+        private ObjectSet<Category_Sales_for_1997> _Category_Sales_for_1997;
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<Current_Product_List> Current_Product_Lists
+        {
+            get
+            {
+                if ((_Current_Product_Lists == null))
+                {
+                    _Current_Product_Lists = base.CreateObjectSet<Current_Product_List>("Current_Product_Lists");
+                }
+                return _Current_Product_Lists;
+            }
+        }
+        private ObjectSet<Current_Product_List> _Current_Product_Lists;
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<Customer_and_Suppliers_by_City> Customer_and_Suppliers_by_Cities
+        {
+            get
+            {
+                if ((_Customer_and_Suppliers_by_Cities == null))
+                {
+                    _Customer_and_Suppliers_by_Cities = base.CreateObjectSet<Customer_and_Suppliers_by_City>("Customer_and_Suppliers_by_Cities");
+                }
+                return _Customer_and_Suppliers_by_Cities;
+            }
+        }
+        private ObjectSet<Customer_and_Suppliers_by_City> _Customer_and_Suppliers_by_Cities;
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<Invoice> Invoices
+        {
+            get
+            {
+                if ((_Invoices == null))
+                {
+                    _Invoices = base.CreateObjectSet<Invoice>("Invoices");
+                }
+                return _Invoices;
+            }
+        }
+        private ObjectSet<Invoice> _Invoices;
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<Order_Details_Extended> Order_Details_Extendeds
+        {
+            get
+            {
+                if ((_Order_Details_Extendeds == null))
+                {
+                    _Order_Details_Extendeds = base.CreateObjectSet<Order_Details_Extended>("Order_Details_Extendeds");
+                }
+                return _Order_Details_Extendeds;
+            }
+        }
+        private ObjectSet<Order_Details_Extended> _Order_Details_Extendeds;
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<Order_Subtotal> Order_Subtotals
+        {
+            get
+            {
+                if ((_Order_Subtotals == null))
+                {
+                    _Order_Subtotals = base.CreateObjectSet<Order_Subtotal>("Order_Subtotals");
+                }
+                return _Order_Subtotals;
+            }
+        }
+        private ObjectSet<Order_Subtotal> _Order_Subtotals;
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<Orders_Qry> Orders_Qries
+        {
+            get
+            {
+                if ((_Orders_Qries == null))
+                {
+                    _Orders_Qries = base.CreateObjectSet<Orders_Qry>("Orders_Qries");
+                }
+                return _Orders_Qries;
+            }
+        }
+        private ObjectSet<Orders_Qry> _Orders_Qries;
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<Product_Sales_for_1997> Product_Sales_for_1997
+        {
+            get
+            {
+                if ((_Product_Sales_for_1997 == null))
+                {
+                    _Product_Sales_for_1997 = base.CreateObjectSet<Product_Sales_for_1997>("Product_Sales_for_1997");
+                }
+                return _Product_Sales_for_1997;
+            }
+        }
+        private ObjectSet<Product_Sales_for_1997> _Product_Sales_for_1997;
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<Products_Above_Average_Price> Products_Above_Average_Prices
+        {
+            get
+            {
+                if ((_Products_Above_Average_Prices == null))
+                {
+                    _Products_Above_Average_Prices = base.CreateObjectSet<Products_Above_Average_Price>("Products_Above_Average_Prices");
+                }
+                return _Products_Above_Average_Prices;
+            }
+        }
+        private ObjectSet<Products_Above_Average_Price> _Products_Above_Average_Prices;
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<Products_by_Category> Products_by_Categories
+        {
+            get
+            {
+                if ((_Products_by_Categories == null))
+                {
+                    _Products_by_Categories = base.CreateObjectSet<Products_by_Category>("Products_by_Categories");
+                }
+                return _Products_by_Categories;
+            }
+        }
+        private ObjectSet<Products_by_Category> _Products_by_Categories;
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<Sales_by_Category> Sales_by_Categories
+        {
+            get
+            {
+                if ((_Sales_by_Categories == null))
+                {
+                    _Sales_by_Categories = base.CreateObjectSet<Sales_by_Category>("Sales_by_Categories");
+                }
+                return _Sales_by_Categories;
+            }
+        }
+        private ObjectSet<Sales_by_Category> _Sales_by_Categories;
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<Sales_Totals_by_Amount> Sales_Totals_by_Amounts
+        {
+            get
+            {
+                if ((_Sales_Totals_by_Amounts == null))
+                {
+                    _Sales_Totals_by_Amounts = base.CreateObjectSet<Sales_Totals_by_Amount>("Sales_Totals_by_Amounts");
+                }
+                return _Sales_Totals_by_Amounts;
+            }
+        }
+        private ObjectSet<Sales_Totals_by_Amount> _Sales_Totals_by_Amounts;
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<Summary_of_Sales_by_Quarter> Summary_of_Sales_by_Quarters
+        {
+            get
+            {
+                if ((_Summary_of_Sales_by_Quarters == null))
+                {
+                    _Summary_of_Sales_by_Quarters = base.CreateObjectSet<Summary_of_Sales_by_Quarter>("Summary_of_Sales_by_Quarters");
+                }
+                return _Summary_of_Sales_by_Quarters;
+            }
+        }
+        private ObjectSet<Summary_of_Sales_by_Quarter> _Summary_of_Sales_by_Quarters;
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        public ObjectSet<Summary_of_Sales_by_Year> Summary_of_Sales_by_Years
+        {
+            get
+            {
+                if ((_Summary_of_Sales_by_Years == null))
+                {
+                    _Summary_of_Sales_by_Years = base.CreateObjectSet<Summary_of_Sales_by_Year>("Summary_of_Sales_by_Years");
+                }
+                return _Summary_of_Sales_by_Years;
+            }
+        }
+        private ObjectSet<Summary_of_Sales_by_Year> _Summary_of_Sales_by_Years;
+
+        #endregion
+
+        #region AddTo Methods
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the Categories EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddToCategories(Category category)
+        {
+            base.AddObject("Categories", category);
+        }
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the CustomerDemographics EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddToCustomerDemographics(CustomerDemographic customerDemographic)
+        {
+            base.AddObject("CustomerDemographics", customerDemographic);
+        }
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the Customers EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddToCustomers(Customer customer)
+        {
+            base.AddObject("Customers", customer);
+        }
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the Employees EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddToEmployees(Employee employee)
+        {
+            base.AddObject("Employees", employee);
+        }
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the Order_Details EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddToOrder_Details(Order_Detail order_Detail)
+        {
+            base.AddObject("Order_Details", order_Detail);
+        }
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the Orders EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddToOrders(Order order)
+        {
+            base.AddObject("Orders", order);
+        }
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the Products EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddToProducts(Product product)
+        {
+            base.AddObject("Products", product);
+        }
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the Regions EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddToRegions(Region region)
+        {
+            base.AddObject("Regions", region);
+        }
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the Shippers EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddToShippers(Shipper shipper)
+        {
+            base.AddObject("Shippers", shipper);
+        }
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the Suppliers EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddToSuppliers(Supplier supplier)
+        {
+            base.AddObject("Suppliers", supplier);
+        }
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the sysdiagrams EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddTosysdiagrams(sysdiagram sysdiagram)
+        {
+            base.AddObject("sysdiagrams", sysdiagram);
+        }
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the Territories EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddToTerritories(Territory territory)
+        {
+            base.AddObject("Territories", territory);
+        }
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the Alphabetical_list_of_products EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddToAlphabetical_list_of_products(Alphabetical_list_of_product alphabetical_list_of_product)
+        {
+            base.AddObject("Alphabetical_list_of_products", alphabetical_list_of_product);
+        }
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the Category_Sales_for_1997 EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddToCategory_Sales_for_1997(Category_Sales_for_1997 category_Sales_for_1997)
+        {
+            base.AddObject("Category_Sales_for_1997", category_Sales_for_1997);
+        }
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the Current_Product_Lists EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddToCurrent_Product_Lists(Current_Product_List current_Product_List)
+        {
+            base.AddObject("Current_Product_Lists", current_Product_List);
+        }
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the Customer_and_Suppliers_by_Cities EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddToCustomer_and_Suppliers_by_Cities(Customer_and_Suppliers_by_City customer_and_Suppliers_by_City)
+        {
+            base.AddObject("Customer_and_Suppliers_by_Cities", customer_and_Suppliers_by_City);
+        }
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the Invoices EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddToInvoices(Invoice invoice)
+        {
+            base.AddObject("Invoices", invoice);
+        }
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the Order_Details_Extendeds EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddToOrder_Details_Extendeds(Order_Details_Extended order_Details_Extended)
+        {
+            base.AddObject("Order_Details_Extendeds", order_Details_Extended);
+        }
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the Order_Subtotals EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddToOrder_Subtotals(Order_Subtotal order_Subtotal)
+        {
+            base.AddObject("Order_Subtotals", order_Subtotal);
+        }
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the Orders_Qries EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddToOrders_Qries(Orders_Qry orders_Qry)
+        {
+            base.AddObject("Orders_Qries", orders_Qry);
+        }
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the Product_Sales_for_1997 EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddToProduct_Sales_for_1997(Product_Sales_for_1997 product_Sales_for_1997)
+        {
+            base.AddObject("Product_Sales_for_1997", product_Sales_for_1997);
+        }
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the Products_Above_Average_Prices EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddToProducts_Above_Average_Prices(Products_Above_Average_Price products_Above_Average_Price)
+        {
+            base.AddObject("Products_Above_Average_Prices", products_Above_Average_Price);
+        }
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the Products_by_Categories EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddToProducts_by_Categories(Products_by_Category products_by_Category)
+        {
+            base.AddObject("Products_by_Categories", products_by_Category);
+        }
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the Sales_by_Categories EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddToSales_by_Categories(Sales_by_Category sales_by_Category)
+        {
+            base.AddObject("Sales_by_Categories", sales_by_Category);
+        }
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the Sales_Totals_by_Amounts EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddToSales_Totals_by_Amounts(Sales_Totals_by_Amount sales_Totals_by_Amount)
+        {
+            base.AddObject("Sales_Totals_by_Amounts", sales_Totals_by_Amount);
+        }
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the Summary_of_Sales_by_Quarters EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddToSummary_of_Sales_by_Quarters(Summary_of_Sales_by_Quarter summary_of_Sales_by_Quarter)
+        {
+            base.AddObject("Summary_of_Sales_by_Quarters", summary_of_Sales_by_Quarter);
+        }
+    
+        /// <summary>
+        /// Deprecated Method for adding a new object to the Summary_of_Sales_by_Years EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
+        /// </summary>
+        public void AddToSummary_of_Sales_by_Years(Summary_of_Sales_by_Year summary_of_Sales_by_Year)
+        {
+            base.AddObject("Summary_of_Sales_by_Years", summary_of_Sales_by_Year);
+        }
+
+        #endregion
+
+    }
+
+    #endregion
+
+    #region Entities
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Alphabetical_list_of_product")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class Alphabetical_list_of_product : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new Alphabetical_list_of_product object.
+        /// </summary>
+        /// <param name="productID">Initial value of the ProductID property.</param>
+        /// <param name="productName">Initial value of the ProductName property.</param>
+        /// <param name="discontinued">Initial value of the Discontinued property.</param>
+        /// <param name="categoryName">Initial value of the CategoryName property.</param>
+        public static Alphabetical_list_of_product CreateAlphabetical_list_of_product(global::System.Int32 productID, global::System.String productName, global::System.Boolean discontinued, global::System.String categoryName)
+        {
+            Alphabetical_list_of_product alphabetical_list_of_product = new Alphabetical_list_of_product();
+            alphabetical_list_of_product.ProductID = productID;
+            alphabetical_list_of_product.ProductName = productName;
+            alphabetical_list_of_product.Discontinued = discontinued;
+            alphabetical_list_of_product.CategoryName = categoryName;
+            return alphabetical_list_of_product;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int32 ProductID
+        {
+            get
+            {
+                return _ProductID;
+            }
+            set
+            {
+                if (_ProductID != value)
+                {
+                    OnProductIDChanging(value);
+                    ReportPropertyChanging("ProductID");
+                    _ProductID = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("ProductID");
+                    OnProductIDChanged();
+                }
+            }
+        }
+        private global::System.Int32 _ProductID;
+        partial void OnProductIDChanging(global::System.Int32 value);
+        partial void OnProductIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String ProductName
+        {
+            get
+            {
+                return _ProductName;
+            }
+            set
+            {
+                if (_ProductName != value)
+                {
+                    OnProductNameChanging(value);
+                    ReportPropertyChanging("ProductName");
+                    _ProductName = StructuralObject.SetValidValue(value, false);
+                    ReportPropertyChanged("ProductName");
+                    OnProductNameChanged();
+                }
+            }
+        }
+        private global::System.String _ProductName;
+        partial void OnProductNameChanging(global::System.String value);
+        partial void OnProductNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Int32> SupplierID
+        {
+            get
+            {
+                return _SupplierID;
+            }
+            set
+            {
+                OnSupplierIDChanging(value);
+                ReportPropertyChanging("SupplierID");
+                _SupplierID = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("SupplierID");
+                OnSupplierIDChanged();
+            }
+        }
+        private Nullable<global::System.Int32> _SupplierID;
+        partial void OnSupplierIDChanging(Nullable<global::System.Int32> value);
+        partial void OnSupplierIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Int32> CategoryID
+        {
+            get
+            {
+                return _CategoryID;
+            }
+            set
+            {
+                OnCategoryIDChanging(value);
+                ReportPropertyChanging("CategoryID");
+                _CategoryID = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("CategoryID");
+                OnCategoryIDChanged();
+            }
+        }
+        private Nullable<global::System.Int32> _CategoryID;
+        partial void OnCategoryIDChanging(Nullable<global::System.Int32> value);
+        partial void OnCategoryIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String QuantityPerUnit
+        {
+            get
+            {
+                return _QuantityPerUnit;
+            }
+            set
+            {
+                OnQuantityPerUnitChanging(value);
+                ReportPropertyChanging("QuantityPerUnit");
+                _QuantityPerUnit = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("QuantityPerUnit");
+                OnQuantityPerUnitChanged();
+            }
+        }
+        private global::System.String _QuantityPerUnit;
+        partial void OnQuantityPerUnitChanging(global::System.String value);
+        partial void OnQuantityPerUnitChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Decimal> UnitPrice
+        {
+            get
+            {
+                return _UnitPrice;
+            }
+            set
+            {
+                OnUnitPriceChanging(value);
+                ReportPropertyChanging("UnitPrice");
+                _UnitPrice = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("UnitPrice");
+                OnUnitPriceChanged();
+            }
+        }
+        private Nullable<global::System.Decimal> _UnitPrice;
+        partial void OnUnitPriceChanging(Nullable<global::System.Decimal> value);
+        partial void OnUnitPriceChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Int16> UnitsInStock
+        {
+            get
+            {
+                return _UnitsInStock;
+            }
+            set
+            {
+                OnUnitsInStockChanging(value);
+                ReportPropertyChanging("UnitsInStock");
+                _UnitsInStock = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("UnitsInStock");
+                OnUnitsInStockChanged();
+            }
+        }
+        private Nullable<global::System.Int16> _UnitsInStock;
+        partial void OnUnitsInStockChanging(Nullable<global::System.Int16> value);
+        partial void OnUnitsInStockChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Int16> UnitsOnOrder
+        {
+            get
+            {
+                return _UnitsOnOrder;
+            }
+            set
+            {
+                OnUnitsOnOrderChanging(value);
+                ReportPropertyChanging("UnitsOnOrder");
+                _UnitsOnOrder = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("UnitsOnOrder");
+                OnUnitsOnOrderChanged();
+            }
+        }
+        private Nullable<global::System.Int16> _UnitsOnOrder;
+        partial void OnUnitsOnOrderChanging(Nullable<global::System.Int16> value);
+        partial void OnUnitsOnOrderChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Int16> ReorderLevel
+        {
+            get
+            {
+                return _ReorderLevel;
+            }
+            set
+            {
+                OnReorderLevelChanging(value);
+                ReportPropertyChanging("ReorderLevel");
+                _ReorderLevel = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("ReorderLevel");
+                OnReorderLevelChanged();
+            }
+        }
+        private Nullable<global::System.Int16> _ReorderLevel;
+        partial void OnReorderLevelChanging(Nullable<global::System.Int16> value);
+        partial void OnReorderLevelChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Boolean Discontinued
+        {
+            get
+            {
+                return _Discontinued;
+            }
+            set
+            {
+                if (_Discontinued != value)
+                {
+                    OnDiscontinuedChanging(value);
+                    ReportPropertyChanging("Discontinued");
+                    _Discontinued = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("Discontinued");
+                    OnDiscontinuedChanged();
+                }
+            }
+        }
+        private global::System.Boolean _Discontinued;
+        partial void OnDiscontinuedChanging(global::System.Boolean value);
+        partial void OnDiscontinuedChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String CategoryName
+        {
+            get
+            {
+                return _CategoryName;
+            }
+            set
+            {
+                if (_CategoryName != value)
+                {
+                    OnCategoryNameChanging(value);
+                    ReportPropertyChanging("CategoryName");
+                    _CategoryName = StructuralObject.SetValidValue(value, false);
+                    ReportPropertyChanged("CategoryName");
+                    OnCategoryNameChanged();
+                }
+            }
+        }
+        private global::System.String _CategoryName;
+        partial void OnCategoryNameChanging(global::System.String value);
+        partial void OnCategoryNameChanged();
+
+        #endregion
+
+    
+    }
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Category")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class Category : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new Category object.
+        /// </summary>
+        /// <param name="categoryID">Initial value of the CategoryID property.</param>
+        /// <param name="categoryName">Initial value of the CategoryName property.</param>
+        public static Category CreateCategory(global::System.Int32 categoryID, global::System.String categoryName)
+        {
+            Category category = new Category();
+            category.CategoryID = categoryID;
+            category.CategoryName = categoryName;
+            return category;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int32 CategoryID
+        {
+            get
+            {
+                return _CategoryID;
+            }
+            set
+            {
+                if (_CategoryID != value)
+                {
+                    OnCategoryIDChanging(value);
+                    ReportPropertyChanging("CategoryID");
+                    _CategoryID = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("CategoryID");
+                    OnCategoryIDChanged();
+                }
+            }
+        }
+        private global::System.Int32 _CategoryID;
+        partial void OnCategoryIDChanging(global::System.Int32 value);
+        partial void OnCategoryIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String CategoryName
+        {
+            get
+            {
+                return _CategoryName;
+            }
+            set
+            {
+                OnCategoryNameChanging(value);
+                ReportPropertyChanging("CategoryName");
+                _CategoryName = StructuralObject.SetValidValue(value, false);
+                ReportPropertyChanged("CategoryName");
+                OnCategoryNameChanged();
+            }
+        }
+        private global::System.String _CategoryName;
+        partial void OnCategoryNameChanging(global::System.String value);
+        partial void OnCategoryNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String Description
+        {
+            get
+            {
+                return _Description;
+            }
+            set
+            {
+                OnDescriptionChanging(value);
+                ReportPropertyChanging("Description");
+                _Description = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("Description");
+                OnDescriptionChanged();
+            }
+        }
+        private global::System.String _Description;
+        partial void OnDescriptionChanging(global::System.String value);
+        partial void OnDescriptionChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.Byte[] Picture
+        {
+            get
+            {
+                return StructuralObject.GetValidValue(_Picture);
+            }
+            set
+            {
+                OnPictureChanging(value);
+                ReportPropertyChanging("Picture");
+                _Picture = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("Picture");
+                OnPictureChanged();
+            }
+        }
+        private global::System.Byte[] _Picture;
+        partial void OnPictureChanging(global::System.Byte[] value);
+        partial void OnPictureChanged();
+
+        #endregion
+
+    
+        #region Navigation Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [XmlIgnoreAttribute()]
+        [SoapIgnoreAttribute()]
+        [DataMemberAttribute()]
+        [EdmRelationshipNavigationPropertyAttribute("NorthwindModel", "FK_Products_Categories", "Products")]
+        public EntityCollection<Product> Products
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<Product>("NorthwindModel.FK_Products_Categories", "Products");
+            }
+            set
+            {
+                if ((value != null))
+                {
+                    ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<Product>("NorthwindModel.FK_Products_Categories", "Products", value);
+                }
+            }
+        }
+
+        #endregion
+
+    }
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Category_Sales_for_1997")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class Category_Sales_for_1997 : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new Category_Sales_for_1997 object.
+        /// </summary>
+        /// <param name="categoryName">Initial value of the CategoryName property.</param>
+        public static Category_Sales_for_1997 CreateCategory_Sales_for_1997(global::System.String categoryName)
+        {
+            Category_Sales_for_1997 category_Sales_for_1997 = new Category_Sales_for_1997();
+            category_Sales_for_1997.CategoryName = categoryName;
+            return category_Sales_for_1997;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String CategoryName
+        {
+            get
+            {
+                return _CategoryName;
+            }
+            set
+            {
+                if (_CategoryName != value)
+                {
+                    OnCategoryNameChanging(value);
+                    ReportPropertyChanging("CategoryName");
+                    _CategoryName = StructuralObject.SetValidValue(value, false);
+                    ReportPropertyChanged("CategoryName");
+                    OnCategoryNameChanged();
+                }
+            }
+        }
+        private global::System.String _CategoryName;
+        partial void OnCategoryNameChanging(global::System.String value);
+        partial void OnCategoryNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Decimal> CategorySales
+        {
+            get
+            {
+                return _CategorySales;
+            }
+            set
+            {
+                OnCategorySalesChanging(value);
+                ReportPropertyChanging("CategorySales");
+                _CategorySales = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("CategorySales");
+                OnCategorySalesChanged();
+            }
+        }
+        private Nullable<global::System.Decimal> _CategorySales;
+        partial void OnCategorySalesChanging(Nullable<global::System.Decimal> value);
+        partial void OnCategorySalesChanged();
+
+        #endregion
+
+    
+    }
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Current_Product_List")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class Current_Product_List : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new Current_Product_List object.
+        /// </summary>
+        /// <param name="productID">Initial value of the ProductID property.</param>
+        /// <param name="productName">Initial value of the ProductName property.</param>
+        public static Current_Product_List CreateCurrent_Product_List(global::System.Int32 productID, global::System.String productName)
+        {
+            Current_Product_List current_Product_List = new Current_Product_List();
+            current_Product_List.ProductID = productID;
+            current_Product_List.ProductName = productName;
+            return current_Product_List;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int32 ProductID
+        {
+            get
+            {
+                return _ProductID;
+            }
+            set
+            {
+                if (_ProductID != value)
+                {
+                    OnProductIDChanging(value);
+                    ReportPropertyChanging("ProductID");
+                    _ProductID = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("ProductID");
+                    OnProductIDChanged();
+                }
+            }
+        }
+        private global::System.Int32 _ProductID;
+        partial void OnProductIDChanging(global::System.Int32 value);
+        partial void OnProductIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String ProductName
+        {
+            get
+            {
+                return _ProductName;
+            }
+            set
+            {
+                if (_ProductName != value)
+                {
+                    OnProductNameChanging(value);
+                    ReportPropertyChanging("ProductName");
+                    _ProductName = StructuralObject.SetValidValue(value, false);
+                    ReportPropertyChanged("ProductName");
+                    OnProductNameChanged();
+                }
+            }
+        }
+        private global::System.String _ProductName;
+        partial void OnProductNameChanging(global::System.String value);
+        partial void OnProductNameChanged();
+
+        #endregion
+
+    
+    }
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Customer")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class Customer : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new Customer object.
+        /// </summary>
+        /// <param name="customerID">Initial value of the CustomerID property.</param>
+        /// <param name="companyName">Initial value of the CompanyName property.</param>
+        public static Customer CreateCustomer(global::System.String customerID, global::System.String companyName)
+        {
+            Customer customer = new Customer();
+            customer.CustomerID = customerID;
+            customer.CompanyName = companyName;
+            return customer;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String CustomerID
+        {
+            get
+            {
+                return _CustomerID;
+            }
+            set
+            {
+                if (_CustomerID != value)
+                {
+                    OnCustomerIDChanging(value);
+                    ReportPropertyChanging("CustomerID");
+                    _CustomerID = StructuralObject.SetValidValue(value, false);
+                    ReportPropertyChanged("CustomerID");
+                    OnCustomerIDChanged();
+                }
+            }
+        }
+        private global::System.String _CustomerID;
+        partial void OnCustomerIDChanging(global::System.String value);
+        partial void OnCustomerIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String CompanyName
+        {
+            get
+            {
+                return _CompanyName;
+            }
+            set
+            {
+                OnCompanyNameChanging(value);
+                ReportPropertyChanging("CompanyName");
+                _CompanyName = StructuralObject.SetValidValue(value, false);
+                ReportPropertyChanged("CompanyName");
+                OnCompanyNameChanged();
+            }
+        }
+        private global::System.String _CompanyName;
+        partial void OnCompanyNameChanging(global::System.String value);
+        partial void OnCompanyNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String ContactName
+        {
+            get
+            {
+                return _ContactName;
+            }
+            set
+            {
+                OnContactNameChanging(value);
+                ReportPropertyChanging("ContactName");
+                _ContactName = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("ContactName");
+                OnContactNameChanged();
+            }
+        }
+        private global::System.String _ContactName;
+        partial void OnContactNameChanging(global::System.String value);
+        partial void OnContactNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String ContactTitle
+        {
+            get
+            {
+                return _ContactTitle;
+            }
+            set
+            {
+                OnContactTitleChanging(value);
+                ReportPropertyChanging("ContactTitle");
+                _ContactTitle = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("ContactTitle");
+                OnContactTitleChanged();
+            }
+        }
+        private global::System.String _ContactTitle;
+        partial void OnContactTitleChanging(global::System.String value);
+        partial void OnContactTitleChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String Address
+        {
+            get
+            {
+                return _Address;
+            }
+            set
+            {
+                OnAddressChanging(value);
+                ReportPropertyChanging("Address");
+                _Address = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("Address");
+                OnAddressChanged();
+            }
+        }
+        private global::System.String _Address;
+        partial void OnAddressChanging(global::System.String value);
+        partial void OnAddressChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String City
+        {
+            get
+            {
+                return _City;
+            }
+            set
+            {
+                OnCityChanging(value);
+                ReportPropertyChanging("City");
+                _City = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("City");
+                OnCityChanged();
+            }
+        }
+        private global::System.String _City;
+        partial void OnCityChanging(global::System.String value);
+        partial void OnCityChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String Region
+        {
+            get
+            {
+                return _Region;
+            }
+            set
+            {
+                OnRegionChanging(value);
+                ReportPropertyChanging("Region");
+                _Region = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("Region");
+                OnRegionChanged();
+            }
+        }
+        private global::System.String _Region;
+        partial void OnRegionChanging(global::System.String value);
+        partial void OnRegionChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String PostalCode
+        {
+            get
+            {
+                return _PostalCode;
+            }
+            set
+            {
+                OnPostalCodeChanging(value);
+                ReportPropertyChanging("PostalCode");
+                _PostalCode = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("PostalCode");
+                OnPostalCodeChanged();
+            }
+        }
+        private global::System.String _PostalCode;
+        partial void OnPostalCodeChanging(global::System.String value);
+        partial void OnPostalCodeChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String Country
+        {
+            get
+            {
+                return _Country;
+            }
+            set
+            {
+                OnCountryChanging(value);
+                ReportPropertyChanging("Country");
+                _Country = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("Country");
+                OnCountryChanged();
+            }
+        }
+        private global::System.String _Country;
+        partial void OnCountryChanging(global::System.String value);
+        partial void OnCountryChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String Phone
+        {
+            get
+            {
+                return _Phone;
+            }
+            set
+            {
+                OnPhoneChanging(value);
+                ReportPropertyChanging("Phone");
+                _Phone = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("Phone");
+                OnPhoneChanged();
+            }
+        }
+        private global::System.String _Phone;
+        partial void OnPhoneChanging(global::System.String value);
+        partial void OnPhoneChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String Fax
+        {
+            get
+            {
+                return _Fax;
+            }
+            set
+            {
+                OnFaxChanging(value);
+                ReportPropertyChanging("Fax");
+                _Fax = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("Fax");
+                OnFaxChanged();
+            }
+        }
+        private global::System.String _Fax;
+        partial void OnFaxChanging(global::System.String value);
+        partial void OnFaxChanged();
+
+        #endregion
+
+    
+        #region Navigation Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [XmlIgnoreAttribute()]
+        [SoapIgnoreAttribute()]
+        [DataMemberAttribute()]
+        [EdmRelationshipNavigationPropertyAttribute("NorthwindModel", "FK_Orders_Customers", "Orders")]
+        public EntityCollection<Order> Orders
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<Order>("NorthwindModel.FK_Orders_Customers", "Orders");
+            }
+            set
+            {
+                if ((value != null))
+                {
+                    ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<Order>("NorthwindModel.FK_Orders_Customers", "Orders", value);
+                }
+            }
+        }
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [XmlIgnoreAttribute()]
+        [SoapIgnoreAttribute()]
+        [DataMemberAttribute()]
+        [EdmRelationshipNavigationPropertyAttribute("NorthwindModel", "CustomerCustomerDemo", "CustomerDemographics")]
+        public EntityCollection<CustomerDemographic> CustomerDemographics
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<CustomerDemographic>("NorthwindModel.CustomerCustomerDemo", "CustomerDemographics");
+            }
+            set
+            {
+                if ((value != null))
+                {
+                    ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<CustomerDemographic>("NorthwindModel.CustomerCustomerDemo", "CustomerDemographics", value);
+                }
+            }
+        }
+
+        #endregion
+
+    }
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Customer_and_Suppliers_by_City")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class Customer_and_Suppliers_by_City : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new Customer_and_Suppliers_by_City object.
+        /// </summary>
+        /// <param name="companyName">Initial value of the CompanyName property.</param>
+        /// <param name="relationship">Initial value of the Relationship property.</param>
+        public static Customer_and_Suppliers_by_City CreateCustomer_and_Suppliers_by_City(global::System.String companyName, global::System.String relationship)
+        {
+            Customer_and_Suppliers_by_City customer_and_Suppliers_by_City = new Customer_and_Suppliers_by_City();
+            customer_and_Suppliers_by_City.CompanyName = companyName;
+            customer_and_Suppliers_by_City.Relationship = relationship;
+            return customer_and_Suppliers_by_City;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String City
+        {
+            get
+            {
+                return _City;
+            }
+            set
+            {
+                OnCityChanging(value);
+                ReportPropertyChanging("City");
+                _City = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("City");
+                OnCityChanged();
+            }
+        }
+        private global::System.String _City;
+        partial void OnCityChanging(global::System.String value);
+        partial void OnCityChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String CompanyName
+        {
+            get
+            {
+                return _CompanyName;
+            }
+            set
+            {
+                if (_CompanyName != value)
+                {
+                    OnCompanyNameChanging(value);
+                    ReportPropertyChanging("CompanyName");
+                    _CompanyName = StructuralObject.SetValidValue(value, false);
+                    ReportPropertyChanged("CompanyName");
+                    OnCompanyNameChanged();
+                }
+            }
+        }
+        private global::System.String _CompanyName;
+        partial void OnCompanyNameChanging(global::System.String value);
+        partial void OnCompanyNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String ContactName
+        {
+            get
+            {
+                return _ContactName;
+            }
+            set
+            {
+                OnContactNameChanging(value);
+                ReportPropertyChanging("ContactName");
+                _ContactName = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("ContactName");
+                OnContactNameChanged();
+            }
+        }
+        private global::System.String _ContactName;
+        partial void OnContactNameChanging(global::System.String value);
+        partial void OnContactNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String Relationship
+        {
+            get
+            {
+                return _Relationship;
+            }
+            set
+            {
+                if (_Relationship != value)
+                {
+                    OnRelationshipChanging(value);
+                    ReportPropertyChanging("Relationship");
+                    _Relationship = StructuralObject.SetValidValue(value, false);
+                    ReportPropertyChanged("Relationship");
+                    OnRelationshipChanged();
+                }
+            }
+        }
+        private global::System.String _Relationship;
+        partial void OnRelationshipChanging(global::System.String value);
+        partial void OnRelationshipChanged();
+
+        #endregion
+
+    
+    }
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="CustomerDemographic")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class CustomerDemographic : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new CustomerDemographic object.
+        /// </summary>
+        /// <param name="customerTypeID">Initial value of the CustomerTypeID property.</param>
+        public static CustomerDemographic CreateCustomerDemographic(global::System.String customerTypeID)
+        {
+            CustomerDemographic customerDemographic = new CustomerDemographic();
+            customerDemographic.CustomerTypeID = customerTypeID;
+            return customerDemographic;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String CustomerTypeID
+        {
+            get
+            {
+                return _CustomerTypeID;
+            }
+            set
+            {
+                if (_CustomerTypeID != value)
+                {
+                    OnCustomerTypeIDChanging(value);
+                    ReportPropertyChanging("CustomerTypeID");
+                    _CustomerTypeID = StructuralObject.SetValidValue(value, false);
+                    ReportPropertyChanged("CustomerTypeID");
+                    OnCustomerTypeIDChanged();
+                }
+            }
+        }
+        private global::System.String _CustomerTypeID;
+        partial void OnCustomerTypeIDChanging(global::System.String value);
+        partial void OnCustomerTypeIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String CustomerDesc
+        {
+            get
+            {
+                return _CustomerDesc;
+            }
+            set
+            {
+                OnCustomerDescChanging(value);
+                ReportPropertyChanging("CustomerDesc");
+                _CustomerDesc = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("CustomerDesc");
+                OnCustomerDescChanged();
+            }
+        }
+        private global::System.String _CustomerDesc;
+        partial void OnCustomerDescChanging(global::System.String value);
+        partial void OnCustomerDescChanged();
+
+        #endregion
+
+    
+        #region Navigation Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [XmlIgnoreAttribute()]
+        [SoapIgnoreAttribute()]
+        [DataMemberAttribute()]
+        [EdmRelationshipNavigationPropertyAttribute("NorthwindModel", "CustomerCustomerDemo", "Customers")]
+        public EntityCollection<Customer> Customers
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<Customer>("NorthwindModel.CustomerCustomerDemo", "Customers");
+            }
+            set
+            {
+                if ((value != null))
+                {
+                    ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<Customer>("NorthwindModel.CustomerCustomerDemo", "Customers", value);
+                }
+            }
+        }
+
+        #endregion
+
+    }
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Employee")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class Employee : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new Employee object.
+        /// </summary>
+        /// <param name="employeeID">Initial value of the EmployeeID property.</param>
+        /// <param name="lastName">Initial value of the LastName property.</param>
+        /// <param name="firstName">Initial value of the FirstName property.</param>
+        public static Employee CreateEmployee(global::System.Int32 employeeID, global::System.String lastName, global::System.String firstName)
+        {
+            Employee employee = new Employee();
+            employee.EmployeeID = employeeID;
+            employee.LastName = lastName;
+            employee.FirstName = firstName;
+            return employee;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int32 EmployeeID
+        {
+            get
+            {
+                return _EmployeeID;
+            }
+            set
+            {
+                if (_EmployeeID != value)
+                {
+                    OnEmployeeIDChanging(value);
+                    ReportPropertyChanging("EmployeeID");
+                    _EmployeeID = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("EmployeeID");
+                    OnEmployeeIDChanged();
+                }
+            }
+        }
+        private global::System.Int32 _EmployeeID;
+        partial void OnEmployeeIDChanging(global::System.Int32 value);
+        partial void OnEmployeeIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String LastName
+        {
+            get
+            {
+                return _LastName;
+            }
+            set
+            {
+                OnLastNameChanging(value);
+                ReportPropertyChanging("LastName");
+                _LastName = StructuralObject.SetValidValue(value, false);
+                ReportPropertyChanged("LastName");
+                OnLastNameChanged();
+            }
+        }
+        private global::System.String _LastName;
+        partial void OnLastNameChanging(global::System.String value);
+        partial void OnLastNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String FirstName
+        {
+            get
+            {
+                return _FirstName;
+            }
+            set
+            {
+                OnFirstNameChanging(value);
+                ReportPropertyChanging("FirstName");
+                _FirstName = StructuralObject.SetValidValue(value, false);
+                ReportPropertyChanged("FirstName");
+                OnFirstNameChanged();
+            }
+        }
+        private global::System.String _FirstName;
+        partial void OnFirstNameChanging(global::System.String value);
+        partial void OnFirstNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String Title
+        {
+            get
+            {
+                return _Title;
+            }
+            set
+            {
+                OnTitleChanging(value);
+                ReportPropertyChanging("Title");
+                _Title = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("Title");
+                OnTitleChanged();
+            }
+        }
+        private global::System.String _Title;
+        partial void OnTitleChanging(global::System.String value);
+        partial void OnTitleChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String TitleOfCourtesy
+        {
+            get
+            {
+                return _TitleOfCourtesy;
+            }
+            set
+            {
+                OnTitleOfCourtesyChanging(value);
+                ReportPropertyChanging("TitleOfCourtesy");
+                _TitleOfCourtesy = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("TitleOfCourtesy");
+                OnTitleOfCourtesyChanged();
+            }
+        }
+        private global::System.String _TitleOfCourtesy;
+        partial void OnTitleOfCourtesyChanging(global::System.String value);
+        partial void OnTitleOfCourtesyChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.DateTime> BirthDate
+        {
+            get
+            {
+                return _BirthDate;
+            }
+            set
+            {
+                OnBirthDateChanging(value);
+                ReportPropertyChanging("BirthDate");
+                _BirthDate = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("BirthDate");
+                OnBirthDateChanged();
+            }
+        }
+        private Nullable<global::System.DateTime> _BirthDate;
+        partial void OnBirthDateChanging(Nullable<global::System.DateTime> value);
+        partial void OnBirthDateChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.DateTime> HireDate
+        {
+            get
+            {
+                return _HireDate;
+            }
+            set
+            {
+                OnHireDateChanging(value);
+                ReportPropertyChanging("HireDate");
+                _HireDate = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("HireDate");
+                OnHireDateChanged();
+            }
+        }
+        private Nullable<global::System.DateTime> _HireDate;
+        partial void OnHireDateChanging(Nullable<global::System.DateTime> value);
+        partial void OnHireDateChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String Address
+        {
+            get
+            {
+                return _Address;
+            }
+            set
+            {
+                OnAddressChanging(value);
+                ReportPropertyChanging("Address");
+                _Address = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("Address");
+                OnAddressChanged();
+            }
+        }
+        private global::System.String _Address;
+        partial void OnAddressChanging(global::System.String value);
+        partial void OnAddressChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String City
+        {
+            get
+            {
+                return _City;
+            }
+            set
+            {
+                OnCityChanging(value);
+                ReportPropertyChanging("City");
+                _City = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("City");
+                OnCityChanged();
+            }
+        }
+        private global::System.String _City;
+        partial void OnCityChanging(global::System.String value);
+        partial void OnCityChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String Region
+        {
+            get
+            {
+                return _Region;
+            }
+            set
+            {
+                OnRegionChanging(value);
+                ReportPropertyChanging("Region");
+                _Region = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("Region");
+                OnRegionChanged();
+            }
+        }
+        private global::System.String _Region;
+        partial void OnRegionChanging(global::System.String value);
+        partial void OnRegionChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String PostalCode
+        {
+            get
+            {
+                return _PostalCode;
+            }
+            set
+            {
+                OnPostalCodeChanging(value);
+                ReportPropertyChanging("PostalCode");
+                _PostalCode = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("PostalCode");
+                OnPostalCodeChanged();
+            }
+        }
+        private global::System.String _PostalCode;
+        partial void OnPostalCodeChanging(global::System.String value);
+        partial void OnPostalCodeChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String Country
+        {
+            get
+            {
+                return _Country;
+            }
+            set
+            {
+                OnCountryChanging(value);
+                ReportPropertyChanging("Country");
+                _Country = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("Country");
+                OnCountryChanged();
+            }
+        }
+        private global::System.String _Country;
+        partial void OnCountryChanging(global::System.String value);
+        partial void OnCountryChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String HomePhone
+        {
+            get
+            {
+                return _HomePhone;
+            }
+            set
+            {
+                OnHomePhoneChanging(value);
+                ReportPropertyChanging("HomePhone");
+                _HomePhone = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("HomePhone");
+                OnHomePhoneChanged();
+            }
+        }
+        private global::System.String _HomePhone;
+        partial void OnHomePhoneChanging(global::System.String value);
+        partial void OnHomePhoneChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String Extension
+        {
+            get
+            {
+                return _Extension;
+            }
+            set
+            {
+                OnExtensionChanging(value);
+                ReportPropertyChanging("Extension");
+                _Extension = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("Extension");
+                OnExtensionChanged();
+            }
+        }
+        private global::System.String _Extension;
+        partial void OnExtensionChanging(global::System.String value);
+        partial void OnExtensionChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.Byte[] Photo
+        {
+            get
+            {
+                return StructuralObject.GetValidValue(_Photo);
+            }
+            set
+            {
+                OnPhotoChanging(value);
+                ReportPropertyChanging("Photo");
+                _Photo = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("Photo");
+                OnPhotoChanged();
+            }
+        }
+        private global::System.Byte[] _Photo;
+        partial void OnPhotoChanging(global::System.Byte[] value);
+        partial void OnPhotoChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String Notes
+        {
+            get
+            {
+                return _Notes;
+            }
+            set
+            {
+                OnNotesChanging(value);
+                ReportPropertyChanging("Notes");
+                _Notes = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("Notes");
+                OnNotesChanged();
+            }
+        }
+        private global::System.String _Notes;
+        partial void OnNotesChanging(global::System.String value);
+        partial void OnNotesChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Int32> ReportsTo
+        {
+            get
+            {
+                return _ReportsTo;
+            }
+            set
+            {
+                OnReportsToChanging(value);
+                ReportPropertyChanging("ReportsTo");
+                _ReportsTo = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("ReportsTo");
+                OnReportsToChanged();
+            }
+        }
+        private Nullable<global::System.Int32> _ReportsTo;
+        partial void OnReportsToChanging(Nullable<global::System.Int32> value);
+        partial void OnReportsToChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String PhotoPath
+        {
+            get
+            {
+                return _PhotoPath;
+            }
+            set
+            {
+                OnPhotoPathChanging(value);
+                ReportPropertyChanging("PhotoPath");
+                _PhotoPath = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("PhotoPath");
+                OnPhotoPathChanged();
+            }
+        }
+        private global::System.String _PhotoPath;
+        partial void OnPhotoPathChanging(global::System.String value);
+        partial void OnPhotoPathChanged();
+
+        #endregion
+
+    
+        #region Navigation Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [XmlIgnoreAttribute()]
+        [SoapIgnoreAttribute()]
+        [DataMemberAttribute()]
+        [EdmRelationshipNavigationPropertyAttribute("NorthwindModel", "FK_Employees_Employees", "Employees1")]
+        public EntityCollection<Employee> Employees1
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<Employee>("NorthwindModel.FK_Employees_Employees", "Employees1");
+            }
+            set
+            {
+                if ((value != null))
+                {
+                    ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<Employee>("NorthwindModel.FK_Employees_Employees", "Employees1", value);
+                }
+            }
+        }
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [XmlIgnoreAttribute()]
+        [SoapIgnoreAttribute()]
+        [DataMemberAttribute()]
+        [EdmRelationshipNavigationPropertyAttribute("NorthwindModel", "FK_Employees_Employees", "Employees")]
+        public Employee Employee1
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Employee>("NorthwindModel.FK_Employees_Employees", "Employees").Value;
+            }
+            set
+            {
+                ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Employee>("NorthwindModel.FK_Employees_Employees", "Employees").Value = value;
+            }
+        }
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [BrowsableAttribute(false)]
+        [DataMemberAttribute()]
+        public EntityReference<Employee> Employee1Reference
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Employee>("NorthwindModel.FK_Employees_Employees", "Employees");
+            }
+            set
+            {
+                if ((value != null))
+                {
+                    ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference<Employee>("NorthwindModel.FK_Employees_Employees", "Employees", value);
+                }
+            }
+        }
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [XmlIgnoreAttribute()]
+        [SoapIgnoreAttribute()]
+        [DataMemberAttribute()]
+        [EdmRelationshipNavigationPropertyAttribute("NorthwindModel", "FK_Orders_Employees", "Orders")]
+        public EntityCollection<Order> Orders
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<Order>("NorthwindModel.FK_Orders_Employees", "Orders");
+            }
+            set
+            {
+                if ((value != null))
+                {
+                    ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<Order>("NorthwindModel.FK_Orders_Employees", "Orders", value);
+                }
+            }
+        }
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [XmlIgnoreAttribute()]
+        [SoapIgnoreAttribute()]
+        [DataMemberAttribute()]
+        [EdmRelationshipNavigationPropertyAttribute("NorthwindModel", "EmployeeTerritories", "Territories")]
+        public EntityCollection<Territory> Territories
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<Territory>("NorthwindModel.EmployeeTerritories", "Territories");
+            }
+            set
+            {
+                if ((value != null))
+                {
+                    ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<Territory>("NorthwindModel.EmployeeTerritories", "Territories", value);
+                }
+            }
+        }
+
+        #endregion
+
+    }
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Invoice")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class Invoice : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new Invoice object.
+        /// </summary>
+        /// <param name="customerName">Initial value of the CustomerName property.</param>
+        /// <param name="salesperson">Initial value of the Salesperson property.</param>
+        /// <param name="orderID">Initial value of the OrderID property.</param>
+        /// <param name="shipperName">Initial value of the ShipperName property.</param>
+        /// <param name="productID">Initial value of the ProductID property.</param>
+        /// <param name="productName">Initial value of the ProductName property.</param>
+        /// <param name="unitPrice">Initial value of the UnitPrice property.</param>
+        /// <param name="quantity">Initial value of the Quantity property.</param>
+        /// <param name="discount">Initial value of the Discount property.</param>
+        public static Invoice CreateInvoice(global::System.String customerName, global::System.String salesperson, global::System.Int32 orderID, global::System.String shipperName, global::System.Int32 productID, global::System.String productName, global::System.Decimal unitPrice, global::System.Int16 quantity, global::System.Single discount)
+        {
+            Invoice invoice = new Invoice();
+            invoice.CustomerName = customerName;
+            invoice.Salesperson = salesperson;
+            invoice.OrderID = orderID;
+            invoice.ShipperName = shipperName;
+            invoice.ProductID = productID;
+            invoice.ProductName = productName;
+            invoice.UnitPrice = unitPrice;
+            invoice.Quantity = quantity;
+            invoice.Discount = discount;
+            return invoice;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String ShipName
+        {
+            get
+            {
+                return _ShipName;
+            }
+            set
+            {
+                OnShipNameChanging(value);
+                ReportPropertyChanging("ShipName");
+                _ShipName = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("ShipName");
+                OnShipNameChanged();
+            }
+        }
+        private global::System.String _ShipName;
+        partial void OnShipNameChanging(global::System.String value);
+        partial void OnShipNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String ShipAddress
+        {
+            get
+            {
+                return _ShipAddress;
+            }
+            set
+            {
+                OnShipAddressChanging(value);
+                ReportPropertyChanging("ShipAddress");
+                _ShipAddress = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("ShipAddress");
+                OnShipAddressChanged();
+            }
+        }
+        private global::System.String _ShipAddress;
+        partial void OnShipAddressChanging(global::System.String value);
+        partial void OnShipAddressChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String ShipCity
+        {
+            get
+            {
+                return _ShipCity;
+            }
+            set
+            {
+                OnShipCityChanging(value);
+                ReportPropertyChanging("ShipCity");
+                _ShipCity = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("ShipCity");
+                OnShipCityChanged();
+            }
+        }
+        private global::System.String _ShipCity;
+        partial void OnShipCityChanging(global::System.String value);
+        partial void OnShipCityChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String ShipRegion
+        {
+            get
+            {
+                return _ShipRegion;
+            }
+            set
+            {
+                OnShipRegionChanging(value);
+                ReportPropertyChanging("ShipRegion");
+                _ShipRegion = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("ShipRegion");
+                OnShipRegionChanged();
+            }
+        }
+        private global::System.String _ShipRegion;
+        partial void OnShipRegionChanging(global::System.String value);
+        partial void OnShipRegionChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String ShipPostalCode
+        {
+            get
+            {
+                return _ShipPostalCode;
+            }
+            set
+            {
+                OnShipPostalCodeChanging(value);
+                ReportPropertyChanging("ShipPostalCode");
+                _ShipPostalCode = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("ShipPostalCode");
+                OnShipPostalCodeChanged();
+            }
+        }
+        private global::System.String _ShipPostalCode;
+        partial void OnShipPostalCodeChanging(global::System.String value);
+        partial void OnShipPostalCodeChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String ShipCountry
+        {
+            get
+            {
+                return _ShipCountry;
+            }
+            set
+            {
+                OnShipCountryChanging(value);
+                ReportPropertyChanging("ShipCountry");
+                _ShipCountry = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("ShipCountry");
+                OnShipCountryChanged();
+            }
+        }
+        private global::System.String _ShipCountry;
+        partial void OnShipCountryChanging(global::System.String value);
+        partial void OnShipCountryChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String CustomerID
+        {
+            get
+            {
+                return _CustomerID;
+            }
+            set
+            {
+                OnCustomerIDChanging(value);
+                ReportPropertyChanging("CustomerID");
+                _CustomerID = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("CustomerID");
+                OnCustomerIDChanged();
+            }
+        }
+        private global::System.String _CustomerID;
+        partial void OnCustomerIDChanging(global::System.String value);
+        partial void OnCustomerIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String CustomerName
+        {
+            get
+            {
+                return _CustomerName;
+            }
+            set
+            {
+                if (_CustomerName != value)
+                {
+                    OnCustomerNameChanging(value);
+                    ReportPropertyChanging("CustomerName");
+                    _CustomerName = StructuralObject.SetValidValue(value, false);
+                    ReportPropertyChanged("CustomerName");
+                    OnCustomerNameChanged();
+                }
+            }
+        }
+        private global::System.String _CustomerName;
+        partial void OnCustomerNameChanging(global::System.String value);
+        partial void OnCustomerNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String Address
+        {
+            get
+            {
+                return _Address;
+            }
+            set
+            {
+                OnAddressChanging(value);
+                ReportPropertyChanging("Address");
+                _Address = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("Address");
+                OnAddressChanged();
+            }
+        }
+        private global::System.String _Address;
+        partial void OnAddressChanging(global::System.String value);
+        partial void OnAddressChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String City
+        {
+            get
+            {
+                return _City;
+            }
+            set
+            {
+                OnCityChanging(value);
+                ReportPropertyChanging("City");
+                _City = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("City");
+                OnCityChanged();
+            }
+        }
+        private global::System.String _City;
+        partial void OnCityChanging(global::System.String value);
+        partial void OnCityChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String Region
+        {
+            get
+            {
+                return _Region;
+            }
+            set
+            {
+                OnRegionChanging(value);
+                ReportPropertyChanging("Region");
+                _Region = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("Region");
+                OnRegionChanged();
+            }
+        }
+        private global::System.String _Region;
+        partial void OnRegionChanging(global::System.String value);
+        partial void OnRegionChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String PostalCode
+        {
+            get
+            {
+                return _PostalCode;
+            }
+            set
+            {
+                OnPostalCodeChanging(value);
+                ReportPropertyChanging("PostalCode");
+                _PostalCode = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("PostalCode");
+                OnPostalCodeChanged();
+            }
+        }
+        private global::System.String _PostalCode;
+        partial void OnPostalCodeChanging(global::System.String value);
+        partial void OnPostalCodeChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String Country
+        {
+            get
+            {
+                return _Country;
+            }
+            set
+            {
+                OnCountryChanging(value);
+                ReportPropertyChanging("Country");
+                _Country = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("Country");
+                OnCountryChanged();
+            }
+        }
+        private global::System.String _Country;
+        partial void OnCountryChanging(global::System.String value);
+        partial void OnCountryChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String Salesperson
+        {
+            get
+            {
+                return _Salesperson;
+            }
+            set
+            {
+                if (_Salesperson != value)
+                {
+                    OnSalespersonChanging(value);
+                    ReportPropertyChanging("Salesperson");
+                    _Salesperson = StructuralObject.SetValidValue(value, false);
+                    ReportPropertyChanged("Salesperson");
+                    OnSalespersonChanged();
+                }
+            }
+        }
+        private global::System.String _Salesperson;
+        partial void OnSalespersonChanging(global::System.String value);
+        partial void OnSalespersonChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int32 OrderID
+        {
+            get
+            {
+                return _OrderID;
+            }
+            set
+            {
+                if (_OrderID != value)
+                {
+                    OnOrderIDChanging(value);
+                    ReportPropertyChanging("OrderID");
+                    _OrderID = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("OrderID");
+                    OnOrderIDChanged();
+                }
+            }
+        }
+        private global::System.Int32 _OrderID;
+        partial void OnOrderIDChanging(global::System.Int32 value);
+        partial void OnOrderIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.DateTime> OrderDate
+        {
+            get
+            {
+                return _OrderDate;
+            }
+            set
+            {
+                OnOrderDateChanging(value);
+                ReportPropertyChanging("OrderDate");
+                _OrderDate = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("OrderDate");
+                OnOrderDateChanged();
+            }
+        }
+        private Nullable<global::System.DateTime> _OrderDate;
+        partial void OnOrderDateChanging(Nullable<global::System.DateTime> value);
+        partial void OnOrderDateChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.DateTime> RequiredDate
+        {
+            get
+            {
+                return _RequiredDate;
+            }
+            set
+            {
+                OnRequiredDateChanging(value);
+                ReportPropertyChanging("RequiredDate");
+                _RequiredDate = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("RequiredDate");
+                OnRequiredDateChanged();
+            }
+        }
+        private Nullable<global::System.DateTime> _RequiredDate;
+        partial void OnRequiredDateChanging(Nullable<global::System.DateTime> value);
+        partial void OnRequiredDateChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.DateTime> ShippedDate
+        {
+            get
+            {
+                return _ShippedDate;
+            }
+            set
+            {
+                OnShippedDateChanging(value);
+                ReportPropertyChanging("ShippedDate");
+                _ShippedDate = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("ShippedDate");
+                OnShippedDateChanged();
+            }
+        }
+        private Nullable<global::System.DateTime> _ShippedDate;
+        partial void OnShippedDateChanging(Nullable<global::System.DateTime> value);
+        partial void OnShippedDateChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String ShipperName
+        {
+            get
+            {
+                return _ShipperName;
+            }
+            set
+            {
+                if (_ShipperName != value)
+                {
+                    OnShipperNameChanging(value);
+                    ReportPropertyChanging("ShipperName");
+                    _ShipperName = StructuralObject.SetValidValue(value, false);
+                    ReportPropertyChanged("ShipperName");
+                    OnShipperNameChanged();
+                }
+            }
+        }
+        private global::System.String _ShipperName;
+        partial void OnShipperNameChanging(global::System.String value);
+        partial void OnShipperNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int32 ProductID
+        {
+            get
+            {
+                return _ProductID;
+            }
+            set
+            {
+                if (_ProductID != value)
+                {
+                    OnProductIDChanging(value);
+                    ReportPropertyChanging("ProductID");
+                    _ProductID = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("ProductID");
+                    OnProductIDChanged();
+                }
+            }
+        }
+        private global::System.Int32 _ProductID;
+        partial void OnProductIDChanging(global::System.Int32 value);
+        partial void OnProductIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String ProductName
+        {
+            get
+            {
+                return _ProductName;
+            }
+            set
+            {
+                if (_ProductName != value)
+                {
+                    OnProductNameChanging(value);
+                    ReportPropertyChanging("ProductName");
+                    _ProductName = StructuralObject.SetValidValue(value, false);
+                    ReportPropertyChanged("ProductName");
+                    OnProductNameChanged();
+                }
+            }
+        }
+        private global::System.String _ProductName;
+        partial void OnProductNameChanging(global::System.String value);
+        partial void OnProductNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Decimal UnitPrice
+        {
+            get
+            {
+                return _UnitPrice;
+            }
+            set
+            {
+                if (_UnitPrice != value)
+                {
+                    OnUnitPriceChanging(value);
+                    ReportPropertyChanging("UnitPrice");
+                    _UnitPrice = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("UnitPrice");
+                    OnUnitPriceChanged();
+                }
+            }
+        }
+        private global::System.Decimal _UnitPrice;
+        partial void OnUnitPriceChanging(global::System.Decimal value);
+        partial void OnUnitPriceChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int16 Quantity
+        {
+            get
+            {
+                return _Quantity;
+            }
+            set
+            {
+                if (_Quantity != value)
+                {
+                    OnQuantityChanging(value);
+                    ReportPropertyChanging("Quantity");
+                    _Quantity = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("Quantity");
+                    OnQuantityChanged();
+                }
+            }
+        }
+        private global::System.Int16 _Quantity;
+        partial void OnQuantityChanging(global::System.Int16 value);
+        partial void OnQuantityChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Single Discount
+        {
+            get
+            {
+                return _Discount;
+            }
+            set
+            {
+                if (_Discount != value)
+                {
+                    OnDiscountChanging(value);
+                    ReportPropertyChanging("Discount");
+                    _Discount = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("Discount");
+                    OnDiscountChanged();
+                }
+            }
+        }
+        private global::System.Single _Discount;
+        partial void OnDiscountChanging(global::System.Single value);
+        partial void OnDiscountChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Decimal> ExtendedPrice
+        {
+            get
+            {
+                return _ExtendedPrice;
+            }
+            set
+            {
+                OnExtendedPriceChanging(value);
+                ReportPropertyChanging("ExtendedPrice");
+                _ExtendedPrice = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("ExtendedPrice");
+                OnExtendedPriceChanged();
+            }
+        }
+        private Nullable<global::System.Decimal> _ExtendedPrice;
+        partial void OnExtendedPriceChanging(Nullable<global::System.Decimal> value);
+        partial void OnExtendedPriceChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Decimal> Freight
+        {
+            get
+            {
+                return _Freight;
+            }
+            set
+            {
+                OnFreightChanging(value);
+                ReportPropertyChanging("Freight");
+                _Freight = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("Freight");
+                OnFreightChanged();
+            }
+        }
+        private Nullable<global::System.Decimal> _Freight;
+        partial void OnFreightChanging(Nullable<global::System.Decimal> value);
+        partial void OnFreightChanged();
+
+        #endregion
+
+    
+    }
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Order")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class Order : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new Order object.
+        /// </summary>
+        /// <param name="orderID">Initial value of the OrderID property.</param>
+        public static Order CreateOrder(global::System.Int32 orderID)
+        {
+            Order order = new Order();
+            order.OrderID = orderID;
+            return order;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int32 OrderID
+        {
+            get
+            {
+                return _OrderID;
+            }
+            set
+            {
+                if (_OrderID != value)
+                {
+                    OnOrderIDChanging(value);
+                    ReportPropertyChanging("OrderID");
+                    _OrderID = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("OrderID");
+                    OnOrderIDChanged();
+                }
+            }
+        }
+        private global::System.Int32 _OrderID;
+        partial void OnOrderIDChanging(global::System.Int32 value);
+        partial void OnOrderIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String CustomerID
+        {
+            get
+            {
+                return _CustomerID;
+            }
+            set
+            {
+                OnCustomerIDChanging(value);
+                ReportPropertyChanging("CustomerID");
+                _CustomerID = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("CustomerID");
+                OnCustomerIDChanged();
+            }
+        }
+        private global::System.String _CustomerID;
+        partial void OnCustomerIDChanging(global::System.String value);
+        partial void OnCustomerIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Int32> EmployeeID
+        {
+            get
+            {
+                return _EmployeeID;
+            }
+            set
+            {
+                OnEmployeeIDChanging(value);
+                ReportPropertyChanging("EmployeeID");
+                _EmployeeID = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("EmployeeID");
+                OnEmployeeIDChanged();
+            }
+        }
+        private Nullable<global::System.Int32> _EmployeeID;
+        partial void OnEmployeeIDChanging(Nullable<global::System.Int32> value);
+        partial void OnEmployeeIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.DateTime> OrderDate
+        {
+            get
+            {
+                return _OrderDate;
+            }
+            set
+            {
+                OnOrderDateChanging(value);
+                ReportPropertyChanging("OrderDate");
+                _OrderDate = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("OrderDate");
+                OnOrderDateChanged();
+            }
+        }
+        private Nullable<global::System.DateTime> _OrderDate;
+        partial void OnOrderDateChanging(Nullable<global::System.DateTime> value);
+        partial void OnOrderDateChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.DateTime> RequiredDate
+        {
+            get
+            {
+                return _RequiredDate;
+            }
+            set
+            {
+                OnRequiredDateChanging(value);
+                ReportPropertyChanging("RequiredDate");
+                _RequiredDate = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("RequiredDate");
+                OnRequiredDateChanged();
+            }
+        }
+        private Nullable<global::System.DateTime> _RequiredDate;
+        partial void OnRequiredDateChanging(Nullable<global::System.DateTime> value);
+        partial void OnRequiredDateChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.DateTime> ShippedDate
+        {
+            get
+            {
+                return _ShippedDate;
+            }
+            set
+            {
+                OnShippedDateChanging(value);
+                ReportPropertyChanging("ShippedDate");
+                _ShippedDate = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("ShippedDate");
+                OnShippedDateChanged();
+            }
+        }
+        private Nullable<global::System.DateTime> _ShippedDate;
+        partial void OnShippedDateChanging(Nullable<global::System.DateTime> value);
+        partial void OnShippedDateChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Int32> ShipVia
+        {
+            get
+            {
+                return _ShipVia;
+            }
+            set
+            {
+                OnShipViaChanging(value);
+                ReportPropertyChanging("ShipVia");
+                _ShipVia = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("ShipVia");
+                OnShipViaChanged();
+            }
+        }
+        private Nullable<global::System.Int32> _ShipVia;
+        partial void OnShipViaChanging(Nullable<global::System.Int32> value);
+        partial void OnShipViaChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Decimal> Freight
+        {
+            get
+            {
+                return _Freight;
+            }
+            set
+            {
+                OnFreightChanging(value);
+                ReportPropertyChanging("Freight");
+                _Freight = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("Freight");
+                OnFreightChanged();
+            }
+        }
+        private Nullable<global::System.Decimal> _Freight;
+        partial void OnFreightChanging(Nullable<global::System.Decimal> value);
+        partial void OnFreightChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String ShipName
+        {
+            get
+            {
+                return _ShipName;
+            }
+            set
+            {
+                OnShipNameChanging(value);
+                ReportPropertyChanging("ShipName");
+                _ShipName = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("ShipName");
+                OnShipNameChanged();
+            }
+        }
+        private global::System.String _ShipName;
+        partial void OnShipNameChanging(global::System.String value);
+        partial void OnShipNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String ShipAddress
+        {
+            get
+            {
+                return _ShipAddress;
+            }
+            set
+            {
+                OnShipAddressChanging(value);
+                ReportPropertyChanging("ShipAddress");
+                _ShipAddress = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("ShipAddress");
+                OnShipAddressChanged();
+            }
+        }
+        private global::System.String _ShipAddress;
+        partial void OnShipAddressChanging(global::System.String value);
+        partial void OnShipAddressChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String ShipCity
+        {
+            get
+            {
+                return _ShipCity;
+            }
+            set
+            {
+                OnShipCityChanging(value);
+                ReportPropertyChanging("ShipCity");
+                _ShipCity = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("ShipCity");
+                OnShipCityChanged();
+            }
+        }
+        private global::System.String _ShipCity;
+        partial void OnShipCityChanging(global::System.String value);
+        partial void OnShipCityChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String ShipRegion
+        {
+            get
+            {
+                return _ShipRegion;
+            }
+            set
+            {
+                OnShipRegionChanging(value);
+                ReportPropertyChanging("ShipRegion");
+                _ShipRegion = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("ShipRegion");
+                OnShipRegionChanged();
+            }
+        }
+        private global::System.String _ShipRegion;
+        partial void OnShipRegionChanging(global::System.String value);
+        partial void OnShipRegionChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String ShipPostalCode
+        {
+            get
+            {
+                return _ShipPostalCode;
+            }
+            set
+            {
+                OnShipPostalCodeChanging(value);
+                ReportPropertyChanging("ShipPostalCode");
+                _ShipPostalCode = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("ShipPostalCode");
+                OnShipPostalCodeChanged();
+            }
+        }
+        private global::System.String _ShipPostalCode;
+        partial void OnShipPostalCodeChanging(global::System.String value);
+        partial void OnShipPostalCodeChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String ShipCountry
+        {
+            get
+            {
+                return _ShipCountry;
+            }
+            set
+            {
+                OnShipCountryChanging(value);
+                ReportPropertyChanging("ShipCountry");
+                _ShipCountry = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("ShipCountry");
+                OnShipCountryChanged();
+            }
+        }
+        private global::System.String _ShipCountry;
+        partial void OnShipCountryChanging(global::System.String value);
+        partial void OnShipCountryChanged();
+
+        #endregion
+
+    
+        #region Navigation Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [XmlIgnoreAttribute()]
+        [SoapIgnoreAttribute()]
+        [DataMemberAttribute()]
+        [EdmRelationshipNavigationPropertyAttribute("NorthwindModel", "FK_Orders_Customers", "Customers")]
+        public Customer Customer
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Customer>("NorthwindModel.FK_Orders_Customers", "Customers").Value;
+            }
+            set
+            {
+                ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Customer>("NorthwindModel.FK_Orders_Customers", "Customers").Value = value;
+            }
+        }
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [BrowsableAttribute(false)]
+        [DataMemberAttribute()]
+        public EntityReference<Customer> CustomerReference
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Customer>("NorthwindModel.FK_Orders_Customers", "Customers");
+            }
+            set
+            {
+                if ((value != null))
+                {
+                    ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference<Customer>("NorthwindModel.FK_Orders_Customers", "Customers", value);
+                }
+            }
+        }
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [XmlIgnoreAttribute()]
+        [SoapIgnoreAttribute()]
+        [DataMemberAttribute()]
+        [EdmRelationshipNavigationPropertyAttribute("NorthwindModel", "FK_Orders_Employees", "Employees")]
+        public Employee Employee
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Employee>("NorthwindModel.FK_Orders_Employees", "Employees").Value;
+            }
+            set
+            {
+                ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Employee>("NorthwindModel.FK_Orders_Employees", "Employees").Value = value;
+            }
+        }
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [BrowsableAttribute(false)]
+        [DataMemberAttribute()]
+        public EntityReference<Employee> EmployeeReference
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Employee>("NorthwindModel.FK_Orders_Employees", "Employees");
+            }
+            set
+            {
+                if ((value != null))
+                {
+                    ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference<Employee>("NorthwindModel.FK_Orders_Employees", "Employees", value);
+                }
+            }
+        }
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [XmlIgnoreAttribute()]
+        [SoapIgnoreAttribute()]
+        [DataMemberAttribute()]
+        [EdmRelationshipNavigationPropertyAttribute("NorthwindModel", "FK_Order_Details_Orders", "Order_Details")]
+        public EntityCollection<Order_Detail> Order_Details
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<Order_Detail>("NorthwindModel.FK_Order_Details_Orders", "Order_Details");
+            }
+            set
+            {
+                if ((value != null))
+                {
+                    ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<Order_Detail>("NorthwindModel.FK_Order_Details_Orders", "Order_Details", value);
+                }
+            }
+        }
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [XmlIgnoreAttribute()]
+        [SoapIgnoreAttribute()]
+        [DataMemberAttribute()]
+        [EdmRelationshipNavigationPropertyAttribute("NorthwindModel", "FK_Orders_Shippers", "Shippers")]
+        public Shipper Shipper
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Shipper>("NorthwindModel.FK_Orders_Shippers", "Shippers").Value;
+            }
+            set
+            {
+                ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Shipper>("NorthwindModel.FK_Orders_Shippers", "Shippers").Value = value;
+            }
+        }
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [BrowsableAttribute(false)]
+        [DataMemberAttribute()]
+        public EntityReference<Shipper> ShipperReference
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Shipper>("NorthwindModel.FK_Orders_Shippers", "Shippers");
+            }
+            set
+            {
+                if ((value != null))
+                {
+                    ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference<Shipper>("NorthwindModel.FK_Orders_Shippers", "Shippers", value);
+                }
+            }
+        }
+
+        #endregion
+
+    }
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Order_Detail")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class Order_Detail : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new Order_Detail object.
+        /// </summary>
+        /// <param name="orderID">Initial value of the OrderID property.</param>
+        /// <param name="productID">Initial value of the ProductID property.</param>
+        /// <param name="unitPrice">Initial value of the UnitPrice property.</param>
+        /// <param name="quantity">Initial value of the Quantity property.</param>
+        /// <param name="discount">Initial value of the Discount property.</param>
+        public static Order_Detail CreateOrder_Detail(global::System.Int32 orderID, global::System.Int32 productID, global::System.Decimal unitPrice, global::System.Int16 quantity, global::System.Single discount)
+        {
+            Order_Detail order_Detail = new Order_Detail();
+            order_Detail.OrderID = orderID;
+            order_Detail.ProductID = productID;
+            order_Detail.UnitPrice = unitPrice;
+            order_Detail.Quantity = quantity;
+            order_Detail.Discount = discount;
+            return order_Detail;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int32 OrderID
+        {
+            get
+            {
+                return _OrderID;
+            }
+            set
+            {
+                if (_OrderID != value)
+                {
+                    OnOrderIDChanging(value);
+                    ReportPropertyChanging("OrderID");
+                    _OrderID = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("OrderID");
+                    OnOrderIDChanged();
+                }
+            }
+        }
+        private global::System.Int32 _OrderID;
+        partial void OnOrderIDChanging(global::System.Int32 value);
+        partial void OnOrderIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int32 ProductID
+        {
+            get
+            {
+                return _ProductID;
+            }
+            set
+            {
+                if (_ProductID != value)
+                {
+                    OnProductIDChanging(value);
+                    ReportPropertyChanging("ProductID");
+                    _ProductID = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("ProductID");
+                    OnProductIDChanged();
+                }
+            }
+        }
+        private global::System.Int32 _ProductID;
+        partial void OnProductIDChanging(global::System.Int32 value);
+        partial void OnProductIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Decimal UnitPrice
+        {
+            get
+            {
+                return _UnitPrice;
+            }
+            set
+            {
+                OnUnitPriceChanging(value);
+                ReportPropertyChanging("UnitPrice");
+                _UnitPrice = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("UnitPrice");
+                OnUnitPriceChanged();
+            }
+        }
+        private global::System.Decimal _UnitPrice;
+        partial void OnUnitPriceChanging(global::System.Decimal value);
+        partial void OnUnitPriceChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int16 Quantity
+        {
+            get
+            {
+                return _Quantity;
+            }
+            set
+            {
+                OnQuantityChanging(value);
+                ReportPropertyChanging("Quantity");
+                _Quantity = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("Quantity");
+                OnQuantityChanged();
+            }
+        }
+        private global::System.Int16 _Quantity;
+        partial void OnQuantityChanging(global::System.Int16 value);
+        partial void OnQuantityChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Single Discount
+        {
+            get
+            {
+                return _Discount;
+            }
+            set
+            {
+                OnDiscountChanging(value);
+                ReportPropertyChanging("Discount");
+                _Discount = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("Discount");
+                OnDiscountChanged();
+            }
+        }
+        private global::System.Single _Discount;
+        partial void OnDiscountChanging(global::System.Single value);
+        partial void OnDiscountChanged();
+
+        #endregion
+
+    
+        #region Navigation Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [XmlIgnoreAttribute()]
+        [SoapIgnoreAttribute()]
+        [DataMemberAttribute()]
+        [EdmRelationshipNavigationPropertyAttribute("NorthwindModel", "FK_Order_Details_Orders", "Orders")]
+        public Order Order
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Order>("NorthwindModel.FK_Order_Details_Orders", "Orders").Value;
+            }
+            set
+            {
+                ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Order>("NorthwindModel.FK_Order_Details_Orders", "Orders").Value = value;
+            }
+        }
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [BrowsableAttribute(false)]
+        [DataMemberAttribute()]
+        public EntityReference<Order> OrderReference
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Order>("NorthwindModel.FK_Order_Details_Orders", "Orders");
+            }
+            set
+            {
+                if ((value != null))
+                {
+                    ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference<Order>("NorthwindModel.FK_Order_Details_Orders", "Orders", value);
+                }
+            }
+        }
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [XmlIgnoreAttribute()]
+        [SoapIgnoreAttribute()]
+        [DataMemberAttribute()]
+        [EdmRelationshipNavigationPropertyAttribute("NorthwindModel", "FK_Order_Details_Products", "Products")]
+        public Product Product
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Product>("NorthwindModel.FK_Order_Details_Products", "Products").Value;
+            }
+            set
+            {
+                ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Product>("NorthwindModel.FK_Order_Details_Products", "Products").Value = value;
+            }
+        }
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [BrowsableAttribute(false)]
+        [DataMemberAttribute()]
+        public EntityReference<Product> ProductReference
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Product>("NorthwindModel.FK_Order_Details_Products", "Products");
+            }
+            set
+            {
+                if ((value != null))
+                {
+                    ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference<Product>("NorthwindModel.FK_Order_Details_Products", "Products", value);
+                }
+            }
+        }
+
+        #endregion
+
+    }
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Order_Details_Extended")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class Order_Details_Extended : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new Order_Details_Extended object.
+        /// </summary>
+        /// <param name="orderID">Initial value of the OrderID property.</param>
+        /// <param name="productID">Initial value of the ProductID property.</param>
+        /// <param name="productName">Initial value of the ProductName property.</param>
+        /// <param name="unitPrice">Initial value of the UnitPrice property.</param>
+        /// <param name="quantity">Initial value of the Quantity property.</param>
+        /// <param name="discount">Initial value of the Discount property.</param>
+        public static Order_Details_Extended CreateOrder_Details_Extended(global::System.Int32 orderID, global::System.Int32 productID, global::System.String productName, global::System.Decimal unitPrice, global::System.Int16 quantity, global::System.Single discount)
+        {
+            Order_Details_Extended order_Details_Extended = new Order_Details_Extended();
+            order_Details_Extended.OrderID = orderID;
+            order_Details_Extended.ProductID = productID;
+            order_Details_Extended.ProductName = productName;
+            order_Details_Extended.UnitPrice = unitPrice;
+            order_Details_Extended.Quantity = quantity;
+            order_Details_Extended.Discount = discount;
+            return order_Details_Extended;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int32 OrderID
+        {
+            get
+            {
+                return _OrderID;
+            }
+            set
+            {
+                if (_OrderID != value)
+                {
+                    OnOrderIDChanging(value);
+                    ReportPropertyChanging("OrderID");
+                    _OrderID = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("OrderID");
+                    OnOrderIDChanged();
+                }
+            }
+        }
+        private global::System.Int32 _OrderID;
+        partial void OnOrderIDChanging(global::System.Int32 value);
+        partial void OnOrderIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int32 ProductID
+        {
+            get
+            {
+                return _ProductID;
+            }
+            set
+            {
+                if (_ProductID != value)
+                {
+                    OnProductIDChanging(value);
+                    ReportPropertyChanging("ProductID");
+                    _ProductID = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("ProductID");
+                    OnProductIDChanged();
+                }
+            }
+        }
+        private global::System.Int32 _ProductID;
+        partial void OnProductIDChanging(global::System.Int32 value);
+        partial void OnProductIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String ProductName
+        {
+            get
+            {
+                return _ProductName;
+            }
+            set
+            {
+                if (_ProductName != value)
+                {
+                    OnProductNameChanging(value);
+                    ReportPropertyChanging("ProductName");
+                    _ProductName = StructuralObject.SetValidValue(value, false);
+                    ReportPropertyChanged("ProductName");
+                    OnProductNameChanged();
+                }
+            }
+        }
+        private global::System.String _ProductName;
+        partial void OnProductNameChanging(global::System.String value);
+        partial void OnProductNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Decimal UnitPrice
+        {
+            get
+            {
+                return _UnitPrice;
+            }
+            set
+            {
+                if (_UnitPrice != value)
+                {
+                    OnUnitPriceChanging(value);
+                    ReportPropertyChanging("UnitPrice");
+                    _UnitPrice = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("UnitPrice");
+                    OnUnitPriceChanged();
+                }
+            }
+        }
+        private global::System.Decimal _UnitPrice;
+        partial void OnUnitPriceChanging(global::System.Decimal value);
+        partial void OnUnitPriceChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int16 Quantity
+        {
+            get
+            {
+                return _Quantity;
+            }
+            set
+            {
+                if (_Quantity != value)
+                {
+                    OnQuantityChanging(value);
+                    ReportPropertyChanging("Quantity");
+                    _Quantity = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("Quantity");
+                    OnQuantityChanged();
+                }
+            }
+        }
+        private global::System.Int16 _Quantity;
+        partial void OnQuantityChanging(global::System.Int16 value);
+        partial void OnQuantityChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Single Discount
+        {
+            get
+            {
+                return _Discount;
+            }
+            set
+            {
+                if (_Discount != value)
+                {
+                    OnDiscountChanging(value);
+                    ReportPropertyChanging("Discount");
+                    _Discount = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("Discount");
+                    OnDiscountChanged();
+                }
+            }
+        }
+        private global::System.Single _Discount;
+        partial void OnDiscountChanging(global::System.Single value);
+        partial void OnDiscountChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Decimal> ExtendedPrice
+        {
+            get
+            {
+                return _ExtendedPrice;
+            }
+            set
+            {
+                OnExtendedPriceChanging(value);
+                ReportPropertyChanging("ExtendedPrice");
+                _ExtendedPrice = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("ExtendedPrice");
+                OnExtendedPriceChanged();
+            }
+        }
+        private Nullable<global::System.Decimal> _ExtendedPrice;
+        partial void OnExtendedPriceChanging(Nullable<global::System.Decimal> value);
+        partial void OnExtendedPriceChanged();
+
+        #endregion
+
+    
+    }
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Order_Subtotal")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class Order_Subtotal : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new Order_Subtotal object.
+        /// </summary>
+        /// <param name="orderID">Initial value of the OrderID property.</param>
+        public static Order_Subtotal CreateOrder_Subtotal(global::System.Int32 orderID)
+        {
+            Order_Subtotal order_Subtotal = new Order_Subtotal();
+            order_Subtotal.OrderID = orderID;
+            return order_Subtotal;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int32 OrderID
+        {
+            get
+            {
+                return _OrderID;
+            }
+            set
+            {
+                if (_OrderID != value)
+                {
+                    OnOrderIDChanging(value);
+                    ReportPropertyChanging("OrderID");
+                    _OrderID = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("OrderID");
+                    OnOrderIDChanged();
+                }
+            }
+        }
+        private global::System.Int32 _OrderID;
+        partial void OnOrderIDChanging(global::System.Int32 value);
+        partial void OnOrderIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Decimal> Subtotal
+        {
+            get
+            {
+                return _Subtotal;
+            }
+            set
+            {
+                OnSubtotalChanging(value);
+                ReportPropertyChanging("Subtotal");
+                _Subtotal = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("Subtotal");
+                OnSubtotalChanged();
+            }
+        }
+        private Nullable<global::System.Decimal> _Subtotal;
+        partial void OnSubtotalChanging(Nullable<global::System.Decimal> value);
+        partial void OnSubtotalChanged();
+
+        #endregion
+
+    
+    }
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Orders_Qry")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class Orders_Qry : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new Orders_Qry object.
+        /// </summary>
+        /// <param name="orderID">Initial value of the OrderID property.</param>
+        /// <param name="companyName">Initial value of the CompanyName property.</param>
+        public static Orders_Qry CreateOrders_Qry(global::System.Int32 orderID, global::System.String companyName)
+        {
+            Orders_Qry orders_Qry = new Orders_Qry();
+            orders_Qry.OrderID = orderID;
+            orders_Qry.CompanyName = companyName;
+            return orders_Qry;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int32 OrderID
+        {
+            get
+            {
+                return _OrderID;
+            }
+            set
+            {
+                if (_OrderID != value)
+                {
+                    OnOrderIDChanging(value);
+                    ReportPropertyChanging("OrderID");
+                    _OrderID = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("OrderID");
+                    OnOrderIDChanged();
+                }
+            }
+        }
+        private global::System.Int32 _OrderID;
+        partial void OnOrderIDChanging(global::System.Int32 value);
+        partial void OnOrderIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String CustomerID
+        {
+            get
+            {
+                return _CustomerID;
+            }
+            set
+            {
+                OnCustomerIDChanging(value);
+                ReportPropertyChanging("CustomerID");
+                _CustomerID = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("CustomerID");
+                OnCustomerIDChanged();
+            }
+        }
+        private global::System.String _CustomerID;
+        partial void OnCustomerIDChanging(global::System.String value);
+        partial void OnCustomerIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Int32> EmployeeID
+        {
+            get
+            {
+                return _EmployeeID;
+            }
+            set
+            {
+                OnEmployeeIDChanging(value);
+                ReportPropertyChanging("EmployeeID");
+                _EmployeeID = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("EmployeeID");
+                OnEmployeeIDChanged();
+            }
+        }
+        private Nullable<global::System.Int32> _EmployeeID;
+        partial void OnEmployeeIDChanging(Nullable<global::System.Int32> value);
+        partial void OnEmployeeIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.DateTime> OrderDate
+        {
+            get
+            {
+                return _OrderDate;
+            }
+            set
+            {
+                OnOrderDateChanging(value);
+                ReportPropertyChanging("OrderDate");
+                _OrderDate = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("OrderDate");
+                OnOrderDateChanged();
+            }
+        }
+        private Nullable<global::System.DateTime> _OrderDate;
+        partial void OnOrderDateChanging(Nullable<global::System.DateTime> value);
+        partial void OnOrderDateChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.DateTime> RequiredDate
+        {
+            get
+            {
+                return _RequiredDate;
+            }
+            set
+            {
+                OnRequiredDateChanging(value);
+                ReportPropertyChanging("RequiredDate");
+                _RequiredDate = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("RequiredDate");
+                OnRequiredDateChanged();
+            }
+        }
+        private Nullable<global::System.DateTime> _RequiredDate;
+        partial void OnRequiredDateChanging(Nullable<global::System.DateTime> value);
+        partial void OnRequiredDateChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.DateTime> ShippedDate
+        {
+            get
+            {
+                return _ShippedDate;
+            }
+            set
+            {
+                OnShippedDateChanging(value);
+                ReportPropertyChanging("ShippedDate");
+                _ShippedDate = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("ShippedDate");
+                OnShippedDateChanged();
+            }
+        }
+        private Nullable<global::System.DateTime> _ShippedDate;
+        partial void OnShippedDateChanging(Nullable<global::System.DateTime> value);
+        partial void OnShippedDateChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Int32> ShipVia
+        {
+            get
+            {
+                return _ShipVia;
+            }
+            set
+            {
+                OnShipViaChanging(value);
+                ReportPropertyChanging("ShipVia");
+                _ShipVia = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("ShipVia");
+                OnShipViaChanged();
+            }
+        }
+        private Nullable<global::System.Int32> _ShipVia;
+        partial void OnShipViaChanging(Nullable<global::System.Int32> value);
+        partial void OnShipViaChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Decimal> Freight
+        {
+            get
+            {
+                return _Freight;
+            }
+            set
+            {
+                OnFreightChanging(value);
+                ReportPropertyChanging("Freight");
+                _Freight = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("Freight");
+                OnFreightChanged();
+            }
+        }
+        private Nullable<global::System.Decimal> _Freight;
+        partial void OnFreightChanging(Nullable<global::System.Decimal> value);
+        partial void OnFreightChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String ShipName
+        {
+            get
+            {
+                return _ShipName;
+            }
+            set
+            {
+                OnShipNameChanging(value);
+                ReportPropertyChanging("ShipName");
+                _ShipName = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("ShipName");
+                OnShipNameChanged();
+            }
+        }
+        private global::System.String _ShipName;
+        partial void OnShipNameChanging(global::System.String value);
+        partial void OnShipNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String ShipAddress
+        {
+            get
+            {
+                return _ShipAddress;
+            }
+            set
+            {
+                OnShipAddressChanging(value);
+                ReportPropertyChanging("ShipAddress");
+                _ShipAddress = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("ShipAddress");
+                OnShipAddressChanged();
+            }
+        }
+        private global::System.String _ShipAddress;
+        partial void OnShipAddressChanging(global::System.String value);
+        partial void OnShipAddressChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String ShipCity
+        {
+            get
+            {
+                return _ShipCity;
+            }
+            set
+            {
+                OnShipCityChanging(value);
+                ReportPropertyChanging("ShipCity");
+                _ShipCity = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("ShipCity");
+                OnShipCityChanged();
+            }
+        }
+        private global::System.String _ShipCity;
+        partial void OnShipCityChanging(global::System.String value);
+        partial void OnShipCityChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String ShipRegion
+        {
+            get
+            {
+                return _ShipRegion;
+            }
+            set
+            {
+                OnShipRegionChanging(value);
+                ReportPropertyChanging("ShipRegion");
+                _ShipRegion = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("ShipRegion");
+                OnShipRegionChanged();
+            }
+        }
+        private global::System.String _ShipRegion;
+        partial void OnShipRegionChanging(global::System.String value);
+        partial void OnShipRegionChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String ShipPostalCode
+        {
+            get
+            {
+                return _ShipPostalCode;
+            }
+            set
+            {
+                OnShipPostalCodeChanging(value);
+                ReportPropertyChanging("ShipPostalCode");
+                _ShipPostalCode = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("ShipPostalCode");
+                OnShipPostalCodeChanged();
+            }
+        }
+        private global::System.String _ShipPostalCode;
+        partial void OnShipPostalCodeChanging(global::System.String value);
+        partial void OnShipPostalCodeChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String ShipCountry
+        {
+            get
+            {
+                return _ShipCountry;
+            }
+            set
+            {
+                OnShipCountryChanging(value);
+                ReportPropertyChanging("ShipCountry");
+                _ShipCountry = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("ShipCountry");
+                OnShipCountryChanged();
+            }
+        }
+        private global::System.String _ShipCountry;
+        partial void OnShipCountryChanging(global::System.String value);
+        partial void OnShipCountryChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String CompanyName
+        {
+            get
+            {
+                return _CompanyName;
+            }
+            set
+            {
+                if (_CompanyName != value)
+                {
+                    OnCompanyNameChanging(value);
+                    ReportPropertyChanging("CompanyName");
+                    _CompanyName = StructuralObject.SetValidValue(value, false);
+                    ReportPropertyChanged("CompanyName");
+                    OnCompanyNameChanged();
+                }
+            }
+        }
+        private global::System.String _CompanyName;
+        partial void OnCompanyNameChanging(global::System.String value);
+        partial void OnCompanyNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String Address
+        {
+            get
+            {
+                return _Address;
+            }
+            set
+            {
+                OnAddressChanging(value);
+                ReportPropertyChanging("Address");
+                _Address = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("Address");
+                OnAddressChanged();
+            }
+        }
+        private global::System.String _Address;
+        partial void OnAddressChanging(global::System.String value);
+        partial void OnAddressChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String City
+        {
+            get
+            {
+                return _City;
+            }
+            set
+            {
+                OnCityChanging(value);
+                ReportPropertyChanging("City");
+                _City = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("City");
+                OnCityChanged();
+            }
+        }
+        private global::System.String _City;
+        partial void OnCityChanging(global::System.String value);
+        partial void OnCityChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String Region
+        {
+            get
+            {
+                return _Region;
+            }
+            set
+            {
+                OnRegionChanging(value);
+                ReportPropertyChanging("Region");
+                _Region = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("Region");
+                OnRegionChanged();
+            }
+        }
+        private global::System.String _Region;
+        partial void OnRegionChanging(global::System.String value);
+        partial void OnRegionChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String PostalCode
+        {
+            get
+            {
+                return _PostalCode;
+            }
+            set
+            {
+                OnPostalCodeChanging(value);
+                ReportPropertyChanging("PostalCode");
+                _PostalCode = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("PostalCode");
+                OnPostalCodeChanged();
+            }
+        }
+        private global::System.String _PostalCode;
+        partial void OnPostalCodeChanging(global::System.String value);
+        partial void OnPostalCodeChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String Country
+        {
+            get
+            {
+                return _Country;
+            }
+            set
+            {
+                OnCountryChanging(value);
+                ReportPropertyChanging("Country");
+                _Country = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("Country");
+                OnCountryChanged();
+            }
+        }
+        private global::System.String _Country;
+        partial void OnCountryChanging(global::System.String value);
+        partial void OnCountryChanged();
+
+        #endregion
+
+    
+    }
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Product")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class Product : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new Product object.
+        /// </summary>
+        /// <param name="productID">Initial value of the ProductID property.</param>
+        /// <param name="productName">Initial value of the ProductName property.</param>
+        /// <param name="discontinued">Initial value of the Discontinued property.</param>
+        public static Product CreateProduct(global::System.Int32 productID, global::System.String productName, global::System.Boolean discontinued)
+        {
+            Product product = new Product();
+            product.ProductID = productID;
+            product.ProductName = productName;
+            product.Discontinued = discontinued;
+            return product;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int32 ProductID
+        {
+            get
+            {
+                return _ProductID;
+            }
+            set
+            {
+                if (_ProductID != value)
+                {
+                    OnProductIDChanging(value);
+                    ReportPropertyChanging("ProductID");
+                    _ProductID = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("ProductID");
+                    OnProductIDChanged();
+                }
+            }
+        }
+        private global::System.Int32 _ProductID;
+        partial void OnProductIDChanging(global::System.Int32 value);
+        partial void OnProductIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String ProductName
+        {
+            get
+            {
+                return _ProductName;
+            }
+            set
+            {
+                OnProductNameChanging(value);
+                ReportPropertyChanging("ProductName");
+                _ProductName = StructuralObject.SetValidValue(value, false);
+                ReportPropertyChanged("ProductName");
+                OnProductNameChanged();
+            }
+        }
+        private global::System.String _ProductName;
+        partial void OnProductNameChanging(global::System.String value);
+        partial void OnProductNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Int32> SupplierID
+        {
+            get
+            {
+                return _SupplierID;
+            }
+            set
+            {
+                OnSupplierIDChanging(value);
+                ReportPropertyChanging("SupplierID");
+                _SupplierID = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("SupplierID");
+                OnSupplierIDChanged();
+            }
+        }
+        private Nullable<global::System.Int32> _SupplierID;
+        partial void OnSupplierIDChanging(Nullable<global::System.Int32> value);
+        partial void OnSupplierIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Int32> CategoryID
+        {
+            get
+            {
+                return _CategoryID;
+            }
+            set
+            {
+                OnCategoryIDChanging(value);
+                ReportPropertyChanging("CategoryID");
+                _CategoryID = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("CategoryID");
+                OnCategoryIDChanged();
+            }
+        }
+        private Nullable<global::System.Int32> _CategoryID;
+        partial void OnCategoryIDChanging(Nullable<global::System.Int32> value);
+        partial void OnCategoryIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String QuantityPerUnit
+        {
+            get
+            {
+                return _QuantityPerUnit;
+            }
+            set
+            {
+                OnQuantityPerUnitChanging(value);
+                ReportPropertyChanging("QuantityPerUnit");
+                _QuantityPerUnit = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("QuantityPerUnit");
+                OnQuantityPerUnitChanged();
+            }
+        }
+        private global::System.String _QuantityPerUnit;
+        partial void OnQuantityPerUnitChanging(global::System.String value);
+        partial void OnQuantityPerUnitChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Decimal> UnitPrice
+        {
+            get
+            {
+                return _UnitPrice;
+            }
+            set
+            {
+                OnUnitPriceChanging(value);
+                ReportPropertyChanging("UnitPrice");
+                _UnitPrice = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("UnitPrice");
+                OnUnitPriceChanged();
+            }
+        }
+        private Nullable<global::System.Decimal> _UnitPrice;
+        partial void OnUnitPriceChanging(Nullable<global::System.Decimal> value);
+        partial void OnUnitPriceChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Int16> UnitsInStock
+        {
+            get
+            {
+                return _UnitsInStock;
+            }
+            set
+            {
+                OnUnitsInStockChanging(value);
+                ReportPropertyChanging("UnitsInStock");
+                _UnitsInStock = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("UnitsInStock");
+                OnUnitsInStockChanged();
+            }
+        }
+        private Nullable<global::System.Int16> _UnitsInStock;
+        partial void OnUnitsInStockChanging(Nullable<global::System.Int16> value);
+        partial void OnUnitsInStockChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Int16> UnitsOnOrder
+        {
+            get
+            {
+                return _UnitsOnOrder;
+            }
+            set
+            {
+                OnUnitsOnOrderChanging(value);
+                ReportPropertyChanging("UnitsOnOrder");
+                _UnitsOnOrder = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("UnitsOnOrder");
+                OnUnitsOnOrderChanged();
+            }
+        }
+        private Nullable<global::System.Int16> _UnitsOnOrder;
+        partial void OnUnitsOnOrderChanging(Nullable<global::System.Int16> value);
+        partial void OnUnitsOnOrderChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Int16> ReorderLevel
+        {
+            get
+            {
+                return _ReorderLevel;
+            }
+            set
+            {
+                OnReorderLevelChanging(value);
+                ReportPropertyChanging("ReorderLevel");
+                _ReorderLevel = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("ReorderLevel");
+                OnReorderLevelChanged();
+            }
+        }
+        private Nullable<global::System.Int16> _ReorderLevel;
+        partial void OnReorderLevelChanging(Nullable<global::System.Int16> value);
+        partial void OnReorderLevelChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Boolean Discontinued
+        {
+            get
+            {
+                return _Discontinued;
+            }
+            set
+            {
+                OnDiscontinuedChanging(value);
+                ReportPropertyChanging("Discontinued");
+                _Discontinued = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("Discontinued");
+                OnDiscontinuedChanged();
+            }
+        }
+        private global::System.Boolean _Discontinued;
+        partial void OnDiscontinuedChanging(global::System.Boolean value);
+        partial void OnDiscontinuedChanged();
+
+        #endregion
+
+    
+        #region Navigation Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [XmlIgnoreAttribute()]
+        [SoapIgnoreAttribute()]
+        [DataMemberAttribute()]
+        [EdmRelationshipNavigationPropertyAttribute("NorthwindModel", "FK_Products_Categories", "Categories")]
+        public Category Category
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Category>("NorthwindModel.FK_Products_Categories", "Categories").Value;
+            }
+            set
+            {
+                ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Category>("NorthwindModel.FK_Products_Categories", "Categories").Value = value;
+            }
+        }
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [BrowsableAttribute(false)]
+        [DataMemberAttribute()]
+        public EntityReference<Category> CategoryReference
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Category>("NorthwindModel.FK_Products_Categories", "Categories");
+            }
+            set
+            {
+                if ((value != null))
+                {
+                    ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference<Category>("NorthwindModel.FK_Products_Categories", "Categories", value);
+                }
+            }
+        }
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [XmlIgnoreAttribute()]
+        [SoapIgnoreAttribute()]
+        [DataMemberAttribute()]
+        [EdmRelationshipNavigationPropertyAttribute("NorthwindModel", "FK_Order_Details_Products", "Order_Details")]
+        public EntityCollection<Order_Detail> Order_Details
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<Order_Detail>("NorthwindModel.FK_Order_Details_Products", "Order_Details");
+            }
+            set
+            {
+                if ((value != null))
+                {
+                    ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<Order_Detail>("NorthwindModel.FK_Order_Details_Products", "Order_Details", value);
+                }
+            }
+        }
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [XmlIgnoreAttribute()]
+        [SoapIgnoreAttribute()]
+        [DataMemberAttribute()]
+        [EdmRelationshipNavigationPropertyAttribute("NorthwindModel", "FK_Products_Suppliers", "Suppliers")]
+        public Supplier Supplier
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Supplier>("NorthwindModel.FK_Products_Suppliers", "Suppliers").Value;
+            }
+            set
+            {
+                ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Supplier>("NorthwindModel.FK_Products_Suppliers", "Suppliers").Value = value;
+            }
+        }
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [BrowsableAttribute(false)]
+        [DataMemberAttribute()]
+        public EntityReference<Supplier> SupplierReference
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Supplier>("NorthwindModel.FK_Products_Suppliers", "Suppliers");
+            }
+            set
+            {
+                if ((value != null))
+                {
+                    ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference<Supplier>("NorthwindModel.FK_Products_Suppliers", "Suppliers", value);
+                }
+            }
+        }
+
+        #endregion
+
+    }
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Product_Sales_for_1997")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class Product_Sales_for_1997 : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new Product_Sales_for_1997 object.
+        /// </summary>
+        /// <param name="categoryName">Initial value of the CategoryName property.</param>
+        /// <param name="productName">Initial value of the ProductName property.</param>
+        public static Product_Sales_for_1997 CreateProduct_Sales_for_1997(global::System.String categoryName, global::System.String productName)
+        {
+            Product_Sales_for_1997 product_Sales_for_1997 = new Product_Sales_for_1997();
+            product_Sales_for_1997.CategoryName = categoryName;
+            product_Sales_for_1997.ProductName = productName;
+            return product_Sales_for_1997;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String CategoryName
+        {
+            get
+            {
+                return _CategoryName;
+            }
+            set
+            {
+                if (_CategoryName != value)
+                {
+                    OnCategoryNameChanging(value);
+                    ReportPropertyChanging("CategoryName");
+                    _CategoryName = StructuralObject.SetValidValue(value, false);
+                    ReportPropertyChanged("CategoryName");
+                    OnCategoryNameChanged();
+                }
+            }
+        }
+        private global::System.String _CategoryName;
+        partial void OnCategoryNameChanging(global::System.String value);
+        partial void OnCategoryNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String ProductName
+        {
+            get
+            {
+                return _ProductName;
+            }
+            set
+            {
+                if (_ProductName != value)
+                {
+                    OnProductNameChanging(value);
+                    ReportPropertyChanging("ProductName");
+                    _ProductName = StructuralObject.SetValidValue(value, false);
+                    ReportPropertyChanged("ProductName");
+                    OnProductNameChanged();
+                }
+            }
+        }
+        private global::System.String _ProductName;
+        partial void OnProductNameChanging(global::System.String value);
+        partial void OnProductNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Decimal> ProductSales
+        {
+            get
+            {
+                return _ProductSales;
+            }
+            set
+            {
+                OnProductSalesChanging(value);
+                ReportPropertyChanging("ProductSales");
+                _ProductSales = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("ProductSales");
+                OnProductSalesChanged();
+            }
+        }
+        private Nullable<global::System.Decimal> _ProductSales;
+        partial void OnProductSalesChanging(Nullable<global::System.Decimal> value);
+        partial void OnProductSalesChanged();
+
+        #endregion
+
+    
+    }
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Products_Above_Average_Price")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class Products_Above_Average_Price : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new Products_Above_Average_Price object.
+        /// </summary>
+        /// <param name="productName">Initial value of the ProductName property.</param>
+        public static Products_Above_Average_Price CreateProducts_Above_Average_Price(global::System.String productName)
+        {
+            Products_Above_Average_Price products_Above_Average_Price = new Products_Above_Average_Price();
+            products_Above_Average_Price.ProductName = productName;
+            return products_Above_Average_Price;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String ProductName
+        {
+            get
+            {
+                return _ProductName;
+            }
+            set
+            {
+                if (_ProductName != value)
+                {
+                    OnProductNameChanging(value);
+                    ReportPropertyChanging("ProductName");
+                    _ProductName = StructuralObject.SetValidValue(value, false);
+                    ReportPropertyChanged("ProductName");
+                    OnProductNameChanged();
+                }
+            }
+        }
+        private global::System.String _ProductName;
+        partial void OnProductNameChanging(global::System.String value);
+        partial void OnProductNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Decimal> UnitPrice
+        {
+            get
+            {
+                return _UnitPrice;
+            }
+            set
+            {
+                OnUnitPriceChanging(value);
+                ReportPropertyChanging("UnitPrice");
+                _UnitPrice = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("UnitPrice");
+                OnUnitPriceChanged();
+            }
+        }
+        private Nullable<global::System.Decimal> _UnitPrice;
+        partial void OnUnitPriceChanging(Nullable<global::System.Decimal> value);
+        partial void OnUnitPriceChanged();
+
+        #endregion
+
+    
+    }
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Products_by_Category")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class Products_by_Category : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new Products_by_Category object.
+        /// </summary>
+        /// <param name="categoryName">Initial value of the CategoryName property.</param>
+        /// <param name="productName">Initial value of the ProductName property.</param>
+        /// <param name="discontinued">Initial value of the Discontinued property.</param>
+        public static Products_by_Category CreateProducts_by_Category(global::System.String categoryName, global::System.String productName, global::System.Boolean discontinued)
+        {
+            Products_by_Category products_by_Category = new Products_by_Category();
+            products_by_Category.CategoryName = categoryName;
+            products_by_Category.ProductName = productName;
+            products_by_Category.Discontinued = discontinued;
+            return products_by_Category;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String CategoryName
+        {
+            get
+            {
+                return _CategoryName;
+            }
+            set
+            {
+                if (_CategoryName != value)
+                {
+                    OnCategoryNameChanging(value);
+                    ReportPropertyChanging("CategoryName");
+                    _CategoryName = StructuralObject.SetValidValue(value, false);
+                    ReportPropertyChanged("CategoryName");
+                    OnCategoryNameChanged();
+                }
+            }
+        }
+        private global::System.String _CategoryName;
+        partial void OnCategoryNameChanging(global::System.String value);
+        partial void OnCategoryNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String ProductName
+        {
+            get
+            {
+                return _ProductName;
+            }
+            set
+            {
+                if (_ProductName != value)
+                {
+                    OnProductNameChanging(value);
+                    ReportPropertyChanging("ProductName");
+                    _ProductName = StructuralObject.SetValidValue(value, false);
+                    ReportPropertyChanged("ProductName");
+                    OnProductNameChanged();
+                }
+            }
+        }
+        private global::System.String _ProductName;
+        partial void OnProductNameChanging(global::System.String value);
+        partial void OnProductNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String QuantityPerUnit
+        {
+            get
+            {
+                return _QuantityPerUnit;
+            }
+            set
+            {
+                OnQuantityPerUnitChanging(value);
+                ReportPropertyChanging("QuantityPerUnit");
+                _QuantityPerUnit = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("QuantityPerUnit");
+                OnQuantityPerUnitChanged();
+            }
+        }
+        private global::System.String _QuantityPerUnit;
+        partial void OnQuantityPerUnitChanging(global::System.String value);
+        partial void OnQuantityPerUnitChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Int16> UnitsInStock
+        {
+            get
+            {
+                return _UnitsInStock;
+            }
+            set
+            {
+                OnUnitsInStockChanging(value);
+                ReportPropertyChanging("UnitsInStock");
+                _UnitsInStock = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("UnitsInStock");
+                OnUnitsInStockChanged();
+            }
+        }
+        private Nullable<global::System.Int16> _UnitsInStock;
+        partial void OnUnitsInStockChanging(Nullable<global::System.Int16> value);
+        partial void OnUnitsInStockChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Boolean Discontinued
+        {
+            get
+            {
+                return _Discontinued;
+            }
+            set
+            {
+                if (_Discontinued != value)
+                {
+                    OnDiscontinuedChanging(value);
+                    ReportPropertyChanging("Discontinued");
+                    _Discontinued = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("Discontinued");
+                    OnDiscontinuedChanged();
+                }
+            }
+        }
+        private global::System.Boolean _Discontinued;
+        partial void OnDiscontinuedChanging(global::System.Boolean value);
+        partial void OnDiscontinuedChanged();
+
+        #endregion
+
+    
+    }
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Region")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class Region : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new Region object.
+        /// </summary>
+        /// <param name="regionID">Initial value of the RegionID property.</param>
+        /// <param name="regionDescription">Initial value of the RegionDescription property.</param>
+        public static Region CreateRegion(global::System.Int32 regionID, global::System.String regionDescription)
+        {
+            Region region = new Region();
+            region.RegionID = regionID;
+            region.RegionDescription = regionDescription;
+            return region;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int32 RegionID
+        {
+            get
+            {
+                return _RegionID;
+            }
+            set
+            {
+                if (_RegionID != value)
+                {
+                    OnRegionIDChanging(value);
+                    ReportPropertyChanging("RegionID");
+                    _RegionID = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("RegionID");
+                    OnRegionIDChanged();
+                }
+            }
+        }
+        private global::System.Int32 _RegionID;
+        partial void OnRegionIDChanging(global::System.Int32 value);
+        partial void OnRegionIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String RegionDescription
+        {
+            get
+            {
+                return _RegionDescription;
+            }
+            set
+            {
+                OnRegionDescriptionChanging(value);
+                ReportPropertyChanging("RegionDescription");
+                _RegionDescription = StructuralObject.SetValidValue(value, false);
+                ReportPropertyChanged("RegionDescription");
+                OnRegionDescriptionChanged();
+            }
+        }
+        private global::System.String _RegionDescription;
+        partial void OnRegionDescriptionChanging(global::System.String value);
+        partial void OnRegionDescriptionChanged();
+
+        #endregion
+
+    
+        #region Navigation Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [XmlIgnoreAttribute()]
+        [SoapIgnoreAttribute()]
+        [DataMemberAttribute()]
+        [EdmRelationshipNavigationPropertyAttribute("NorthwindModel", "FK_Territories_Region", "Territories")]
+        public EntityCollection<Territory> Territories
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<Territory>("NorthwindModel.FK_Territories_Region", "Territories");
+            }
+            set
+            {
+                if ((value != null))
+                {
+                    ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<Territory>("NorthwindModel.FK_Territories_Region", "Territories", value);
+                }
+            }
+        }
+
+        #endregion
+
+    }
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Sales_by_Category")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class Sales_by_Category : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new Sales_by_Category object.
+        /// </summary>
+        /// <param name="categoryID">Initial value of the CategoryID property.</param>
+        /// <param name="categoryName">Initial value of the CategoryName property.</param>
+        /// <param name="productName">Initial value of the ProductName property.</param>
+        public static Sales_by_Category CreateSales_by_Category(global::System.Int32 categoryID, global::System.String categoryName, global::System.String productName)
+        {
+            Sales_by_Category sales_by_Category = new Sales_by_Category();
+            sales_by_Category.CategoryID = categoryID;
+            sales_by_Category.CategoryName = categoryName;
+            sales_by_Category.ProductName = productName;
+            return sales_by_Category;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int32 CategoryID
+        {
+            get
+            {
+                return _CategoryID;
+            }
+            set
+            {
+                if (_CategoryID != value)
+                {
+                    OnCategoryIDChanging(value);
+                    ReportPropertyChanging("CategoryID");
+                    _CategoryID = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("CategoryID");
+                    OnCategoryIDChanged();
+                }
+            }
+        }
+        private global::System.Int32 _CategoryID;
+        partial void OnCategoryIDChanging(global::System.Int32 value);
+        partial void OnCategoryIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String CategoryName
+        {
+            get
+            {
+                return _CategoryName;
+            }
+            set
+            {
+                if (_CategoryName != value)
+                {
+                    OnCategoryNameChanging(value);
+                    ReportPropertyChanging("CategoryName");
+                    _CategoryName = StructuralObject.SetValidValue(value, false);
+                    ReportPropertyChanged("CategoryName");
+                    OnCategoryNameChanged();
+                }
+            }
+        }
+        private global::System.String _CategoryName;
+        partial void OnCategoryNameChanging(global::System.String value);
+        partial void OnCategoryNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String ProductName
+        {
+            get
+            {
+                return _ProductName;
+            }
+            set
+            {
+                if (_ProductName != value)
+                {
+                    OnProductNameChanging(value);
+                    ReportPropertyChanging("ProductName");
+                    _ProductName = StructuralObject.SetValidValue(value, false);
+                    ReportPropertyChanged("ProductName");
+                    OnProductNameChanged();
+                }
+            }
+        }
+        private global::System.String _ProductName;
+        partial void OnProductNameChanging(global::System.String value);
+        partial void OnProductNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Decimal> ProductSales
+        {
+            get
+            {
+                return _ProductSales;
+            }
+            set
+            {
+                OnProductSalesChanging(value);
+                ReportPropertyChanging("ProductSales");
+                _ProductSales = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("ProductSales");
+                OnProductSalesChanged();
+            }
+        }
+        private Nullable<global::System.Decimal> _ProductSales;
+        partial void OnProductSalesChanging(Nullable<global::System.Decimal> value);
+        partial void OnProductSalesChanged();
+
+        #endregion
+
+    
+    }
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Sales_Totals_by_Amount")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class Sales_Totals_by_Amount : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new Sales_Totals_by_Amount object.
+        /// </summary>
+        /// <param name="orderID">Initial value of the OrderID property.</param>
+        /// <param name="companyName">Initial value of the CompanyName property.</param>
+        public static Sales_Totals_by_Amount CreateSales_Totals_by_Amount(global::System.Int32 orderID, global::System.String companyName)
+        {
+            Sales_Totals_by_Amount sales_Totals_by_Amount = new Sales_Totals_by_Amount();
+            sales_Totals_by_Amount.OrderID = orderID;
+            sales_Totals_by_Amount.CompanyName = companyName;
+            return sales_Totals_by_Amount;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Decimal> SaleAmount
+        {
+            get
+            {
+                return _SaleAmount;
+            }
+            set
+            {
+                OnSaleAmountChanging(value);
+                ReportPropertyChanging("SaleAmount");
+                _SaleAmount = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("SaleAmount");
+                OnSaleAmountChanged();
+            }
+        }
+        private Nullable<global::System.Decimal> _SaleAmount;
+        partial void OnSaleAmountChanging(Nullable<global::System.Decimal> value);
+        partial void OnSaleAmountChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int32 OrderID
+        {
+            get
+            {
+                return _OrderID;
+            }
+            set
+            {
+                if (_OrderID != value)
+                {
+                    OnOrderIDChanging(value);
+                    ReportPropertyChanging("OrderID");
+                    _OrderID = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("OrderID");
+                    OnOrderIDChanged();
+                }
+            }
+        }
+        private global::System.Int32 _OrderID;
+        partial void OnOrderIDChanging(global::System.Int32 value);
+        partial void OnOrderIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String CompanyName
+        {
+            get
+            {
+                return _CompanyName;
+            }
+            set
+            {
+                if (_CompanyName != value)
+                {
+                    OnCompanyNameChanging(value);
+                    ReportPropertyChanging("CompanyName");
+                    _CompanyName = StructuralObject.SetValidValue(value, false);
+                    ReportPropertyChanged("CompanyName");
+                    OnCompanyNameChanged();
+                }
+            }
+        }
+        private global::System.String _CompanyName;
+        partial void OnCompanyNameChanging(global::System.String value);
+        partial void OnCompanyNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.DateTime> ShippedDate
+        {
+            get
+            {
+                return _ShippedDate;
+            }
+            set
+            {
+                OnShippedDateChanging(value);
+                ReportPropertyChanging("ShippedDate");
+                _ShippedDate = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("ShippedDate");
+                OnShippedDateChanged();
+            }
+        }
+        private Nullable<global::System.DateTime> _ShippedDate;
+        partial void OnShippedDateChanging(Nullable<global::System.DateTime> value);
+        partial void OnShippedDateChanged();
+
+        #endregion
+
+    
+    }
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Shipper")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class Shipper : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new Shipper object.
+        /// </summary>
+        /// <param name="shipperID">Initial value of the ShipperID property.</param>
+        /// <param name="companyName">Initial value of the CompanyName property.</param>
+        public static Shipper CreateShipper(global::System.Int32 shipperID, global::System.String companyName)
+        {
+            Shipper shipper = new Shipper();
+            shipper.ShipperID = shipperID;
+            shipper.CompanyName = companyName;
+            return shipper;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int32 ShipperID
+        {
+            get
+            {
+                return _ShipperID;
+            }
+            set
+            {
+                if (_ShipperID != value)
+                {
+                    OnShipperIDChanging(value);
+                    ReportPropertyChanging("ShipperID");
+                    _ShipperID = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("ShipperID");
+                    OnShipperIDChanged();
+                }
+            }
+        }
+        private global::System.Int32 _ShipperID;
+        partial void OnShipperIDChanging(global::System.Int32 value);
+        partial void OnShipperIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String CompanyName
+        {
+            get
+            {
+                return _CompanyName;
+            }
+            set
+            {
+                OnCompanyNameChanging(value);
+                ReportPropertyChanging("CompanyName");
+                _CompanyName = StructuralObject.SetValidValue(value, false);
+                ReportPropertyChanged("CompanyName");
+                OnCompanyNameChanged();
+            }
+        }
+        private global::System.String _CompanyName;
+        partial void OnCompanyNameChanging(global::System.String value);
+        partial void OnCompanyNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String Phone
+        {
+            get
+            {
+                return _Phone;
+            }
+            set
+            {
+                OnPhoneChanging(value);
+                ReportPropertyChanging("Phone");
+                _Phone = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("Phone");
+                OnPhoneChanged();
+            }
+        }
+        private global::System.String _Phone;
+        partial void OnPhoneChanging(global::System.String value);
+        partial void OnPhoneChanged();
+
+        #endregion
+
+    
+        #region Navigation Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [XmlIgnoreAttribute()]
+        [SoapIgnoreAttribute()]
+        [DataMemberAttribute()]
+        [EdmRelationshipNavigationPropertyAttribute("NorthwindModel", "FK_Orders_Shippers", "Orders")]
+        public EntityCollection<Order> Orders
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<Order>("NorthwindModel.FK_Orders_Shippers", "Orders");
+            }
+            set
+            {
+                if ((value != null))
+                {
+                    ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<Order>("NorthwindModel.FK_Orders_Shippers", "Orders", value);
+                }
+            }
+        }
+
+        #endregion
+
+    }
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Summary_of_Sales_by_Quarter")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class Summary_of_Sales_by_Quarter : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new Summary_of_Sales_by_Quarter object.
+        /// </summary>
+        /// <param name="orderID">Initial value of the OrderID property.</param>
+        public static Summary_of_Sales_by_Quarter CreateSummary_of_Sales_by_Quarter(global::System.Int32 orderID)
+        {
+            Summary_of_Sales_by_Quarter summary_of_Sales_by_Quarter = new Summary_of_Sales_by_Quarter();
+            summary_of_Sales_by_Quarter.OrderID = orderID;
+            return summary_of_Sales_by_Quarter;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.DateTime> ShippedDate
+        {
+            get
+            {
+                return _ShippedDate;
+            }
+            set
+            {
+                OnShippedDateChanging(value);
+                ReportPropertyChanging("ShippedDate");
+                _ShippedDate = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("ShippedDate");
+                OnShippedDateChanged();
+            }
+        }
+        private Nullable<global::System.DateTime> _ShippedDate;
+        partial void OnShippedDateChanging(Nullable<global::System.DateTime> value);
+        partial void OnShippedDateChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int32 OrderID
+        {
+            get
+            {
+                return _OrderID;
+            }
+            set
+            {
+                if (_OrderID != value)
+                {
+                    OnOrderIDChanging(value);
+                    ReportPropertyChanging("OrderID");
+                    _OrderID = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("OrderID");
+                    OnOrderIDChanged();
+                }
+            }
+        }
+        private global::System.Int32 _OrderID;
+        partial void OnOrderIDChanging(global::System.Int32 value);
+        partial void OnOrderIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Decimal> Subtotal
+        {
+            get
+            {
+                return _Subtotal;
+            }
+            set
+            {
+                OnSubtotalChanging(value);
+                ReportPropertyChanging("Subtotal");
+                _Subtotal = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("Subtotal");
+                OnSubtotalChanged();
+            }
+        }
+        private Nullable<global::System.Decimal> _Subtotal;
+        partial void OnSubtotalChanging(Nullable<global::System.Decimal> value);
+        partial void OnSubtotalChanged();
+
+        #endregion
+
+    
+    }
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Summary_of_Sales_by_Year")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class Summary_of_Sales_by_Year : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new Summary_of_Sales_by_Year object.
+        /// </summary>
+        /// <param name="orderID">Initial value of the OrderID property.</param>
+        public static Summary_of_Sales_by_Year CreateSummary_of_Sales_by_Year(global::System.Int32 orderID)
+        {
+            Summary_of_Sales_by_Year summary_of_Sales_by_Year = new Summary_of_Sales_by_Year();
+            summary_of_Sales_by_Year.OrderID = orderID;
+            return summary_of_Sales_by_Year;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.DateTime> ShippedDate
+        {
+            get
+            {
+                return _ShippedDate;
+            }
+            set
+            {
+                OnShippedDateChanging(value);
+                ReportPropertyChanging("ShippedDate");
+                _ShippedDate = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("ShippedDate");
+                OnShippedDateChanged();
+            }
+        }
+        private Nullable<global::System.DateTime> _ShippedDate;
+        partial void OnShippedDateChanging(Nullable<global::System.DateTime> value);
+        partial void OnShippedDateChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int32 OrderID
+        {
+            get
+            {
+                return _OrderID;
+            }
+            set
+            {
+                if (_OrderID != value)
+                {
+                    OnOrderIDChanging(value);
+                    ReportPropertyChanging("OrderID");
+                    _OrderID = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("OrderID");
+                    OnOrderIDChanged();
+                }
+            }
+        }
+        private global::System.Int32 _OrderID;
+        partial void OnOrderIDChanging(global::System.Int32 value);
+        partial void OnOrderIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Decimal> Subtotal
+        {
+            get
+            {
+                return _Subtotal;
+            }
+            set
+            {
+                OnSubtotalChanging(value);
+                ReportPropertyChanging("Subtotal");
+                _Subtotal = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("Subtotal");
+                OnSubtotalChanged();
+            }
+        }
+        private Nullable<global::System.Decimal> _Subtotal;
+        partial void OnSubtotalChanging(Nullable<global::System.Decimal> value);
+        partial void OnSubtotalChanged();
+
+        #endregion
+
+    
+    }
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Supplier")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class Supplier : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new Supplier object.
+        /// </summary>
+        /// <param name="supplierID">Initial value of the SupplierID property.</param>
+        /// <param name="companyName">Initial value of the CompanyName property.</param>
+        public static Supplier CreateSupplier(global::System.Int32 supplierID, global::System.String companyName)
+        {
+            Supplier supplier = new Supplier();
+            supplier.SupplierID = supplierID;
+            supplier.CompanyName = companyName;
+            return supplier;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int32 SupplierID
+        {
+            get
+            {
+                return _SupplierID;
+            }
+            set
+            {
+                if (_SupplierID != value)
+                {
+                    OnSupplierIDChanging(value);
+                    ReportPropertyChanging("SupplierID");
+                    _SupplierID = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("SupplierID");
+                    OnSupplierIDChanged();
+                }
+            }
+        }
+        private global::System.Int32 _SupplierID;
+        partial void OnSupplierIDChanging(global::System.Int32 value);
+        partial void OnSupplierIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String CompanyName
+        {
+            get
+            {
+                return _CompanyName;
+            }
+            set
+            {
+                OnCompanyNameChanging(value);
+                ReportPropertyChanging("CompanyName");
+                _CompanyName = StructuralObject.SetValidValue(value, false);
+                ReportPropertyChanged("CompanyName");
+                OnCompanyNameChanged();
+            }
+        }
+        private global::System.String _CompanyName;
+        partial void OnCompanyNameChanging(global::System.String value);
+        partial void OnCompanyNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String ContactName
+        {
+            get
+            {
+                return _ContactName;
+            }
+            set
+            {
+                OnContactNameChanging(value);
+                ReportPropertyChanging("ContactName");
+                _ContactName = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("ContactName");
+                OnContactNameChanged();
+            }
+        }
+        private global::System.String _ContactName;
+        partial void OnContactNameChanging(global::System.String value);
+        partial void OnContactNameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String ContactTitle
+        {
+            get
+            {
+                return _ContactTitle;
+            }
+            set
+            {
+                OnContactTitleChanging(value);
+                ReportPropertyChanging("ContactTitle");
+                _ContactTitle = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("ContactTitle");
+                OnContactTitleChanged();
+            }
+        }
+        private global::System.String _ContactTitle;
+        partial void OnContactTitleChanging(global::System.String value);
+        partial void OnContactTitleChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String Address
+        {
+            get
+            {
+                return _Address;
+            }
+            set
+            {
+                OnAddressChanging(value);
+                ReportPropertyChanging("Address");
+                _Address = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("Address");
+                OnAddressChanged();
+            }
+        }
+        private global::System.String _Address;
+        partial void OnAddressChanging(global::System.String value);
+        partial void OnAddressChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String City
+        {
+            get
+            {
+                return _City;
+            }
+            set
+            {
+                OnCityChanging(value);
+                ReportPropertyChanging("City");
+                _City = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("City");
+                OnCityChanged();
+            }
+        }
+        private global::System.String _City;
+        partial void OnCityChanging(global::System.String value);
+        partial void OnCityChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String Region
+        {
+            get
+            {
+                return _Region;
+            }
+            set
+            {
+                OnRegionChanging(value);
+                ReportPropertyChanging("Region");
+                _Region = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("Region");
+                OnRegionChanged();
+            }
+        }
+        private global::System.String _Region;
+        partial void OnRegionChanging(global::System.String value);
+        partial void OnRegionChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String PostalCode
+        {
+            get
+            {
+                return _PostalCode;
+            }
+            set
+            {
+                OnPostalCodeChanging(value);
+                ReportPropertyChanging("PostalCode");
+                _PostalCode = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("PostalCode");
+                OnPostalCodeChanged();
+            }
+        }
+        private global::System.String _PostalCode;
+        partial void OnPostalCodeChanging(global::System.String value);
+        partial void OnPostalCodeChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String Country
+        {
+            get
+            {
+                return _Country;
+            }
+            set
+            {
+                OnCountryChanging(value);
+                ReportPropertyChanging("Country");
+                _Country = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("Country");
+                OnCountryChanged();
+            }
+        }
+        private global::System.String _Country;
+        partial void OnCountryChanging(global::System.String value);
+        partial void OnCountryChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String Phone
+        {
+            get
+            {
+                return _Phone;
+            }
+            set
+            {
+                OnPhoneChanging(value);
+                ReportPropertyChanging("Phone");
+                _Phone = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("Phone");
+                OnPhoneChanged();
+            }
+        }
+        private global::System.String _Phone;
+        partial void OnPhoneChanging(global::System.String value);
+        partial void OnPhoneChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String Fax
+        {
+            get
+            {
+                return _Fax;
+            }
+            set
+            {
+                OnFaxChanging(value);
+                ReportPropertyChanging("Fax");
+                _Fax = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("Fax");
+                OnFaxChanged();
+            }
+        }
+        private global::System.String _Fax;
+        partial void OnFaxChanging(global::System.String value);
+        partial void OnFaxChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.String HomePage
+        {
+            get
+            {
+                return _HomePage;
+            }
+            set
+            {
+                OnHomePageChanging(value);
+                ReportPropertyChanging("HomePage");
+                _HomePage = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("HomePage");
+                OnHomePageChanged();
+            }
+        }
+        private global::System.String _HomePage;
+        partial void OnHomePageChanging(global::System.String value);
+        partial void OnHomePageChanged();
+
+        #endregion
+
+    
+        #region Navigation Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [XmlIgnoreAttribute()]
+        [SoapIgnoreAttribute()]
+        [DataMemberAttribute()]
+        [EdmRelationshipNavigationPropertyAttribute("NorthwindModel", "FK_Products_Suppliers", "Products")]
+        public EntityCollection<Product> Products
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<Product>("NorthwindModel.FK_Products_Suppliers", "Products");
+            }
+            set
+            {
+                if ((value != null))
+                {
+                    ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<Product>("NorthwindModel.FK_Products_Suppliers", "Products", value);
+                }
+            }
+        }
+
+        #endregion
+
+    }
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="sysdiagram")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class sysdiagram : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new sysdiagram object.
+        /// </summary>
+        /// <param name="name">Initial value of the name property.</param>
+        /// <param name="principal_id">Initial value of the principal_id property.</param>
+        /// <param name="diagram_id">Initial value of the diagram_id property.</param>
+        public static sysdiagram Createsysdiagram(global::System.String name, global::System.Int32 principal_id, global::System.Int32 diagram_id)
+        {
+            sysdiagram sysdiagram = new sysdiagram();
+            sysdiagram.name = name;
+            sysdiagram.principal_id = principal_id;
+            sysdiagram.diagram_id = diagram_id;
+            return sysdiagram;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String name
+        {
+            get
+            {
+                return _name;
+            }
+            set
+            {
+                OnnameChanging(value);
+                ReportPropertyChanging("name");
+                _name = StructuralObject.SetValidValue(value, false);
+                ReportPropertyChanged("name");
+                OnnameChanged();
+            }
+        }
+        private global::System.String _name;
+        partial void OnnameChanging(global::System.String value);
+        partial void OnnameChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int32 principal_id
+        {
+            get
+            {
+                return _principal_id;
+            }
+            set
+            {
+                Onprincipal_idChanging(value);
+                ReportPropertyChanging("principal_id");
+                _principal_id = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("principal_id");
+                Onprincipal_idChanged();
+            }
+        }
+        private global::System.Int32 _principal_id;
+        partial void Onprincipal_idChanging(global::System.Int32 value);
+        partial void Onprincipal_idChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int32 diagram_id
+        {
+            get
+            {
+                return _diagram_id;
+            }
+            set
+            {
+                if (_diagram_id != value)
+                {
+                    Ondiagram_idChanging(value);
+                    ReportPropertyChanging("diagram_id");
+                    _diagram_id = StructuralObject.SetValidValue(value);
+                    ReportPropertyChanged("diagram_id");
+                    Ondiagram_idChanged();
+                }
+            }
+        }
+        private global::System.Int32 _diagram_id;
+        partial void Ondiagram_idChanging(global::System.Int32 value);
+        partial void Ondiagram_idChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public Nullable<global::System.Int32> version
+        {
+            get
+            {
+                return _version;
+            }
+            set
+            {
+                OnversionChanging(value);
+                ReportPropertyChanging("version");
+                _version = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("version");
+                OnversionChanged();
+            }
+        }
+        private Nullable<global::System.Int32> _version;
+        partial void OnversionChanging(Nullable<global::System.Int32> value);
+        partial void OnversionChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
+        [DataMemberAttribute()]
+        public global::System.Byte[] definition
+        {
+            get
+            {
+                return StructuralObject.GetValidValue(_definition);
+            }
+            set
+            {
+                OndefinitionChanging(value);
+                ReportPropertyChanging("definition");
+                _definition = StructuralObject.SetValidValue(value, true);
+                ReportPropertyChanged("definition");
+                OndefinitionChanged();
+            }
+        }
+        private global::System.Byte[] _definition;
+        partial void OndefinitionChanging(global::System.Byte[] value);
+        partial void OndefinitionChanged();
+
+        #endregion
+
+    
+    }
+    
+    /// <summary>
+    /// No Metadata Documentation available.
+    /// </summary>
+    [EdmEntityTypeAttribute(NamespaceName="NorthwindModel", Name="Territory")]
+    [Serializable()]
+    [DataContractAttribute(IsReference=true)]
+    public partial class Territory : EntityObject
+    {
+        #region Factory Method
+    
+        /// <summary>
+        /// Create a new Territory object.
+        /// </summary>
+        /// <param name="territoryID">Initial value of the TerritoryID property.</param>
+        /// <param name="territoryDescription">Initial value of the TerritoryDescription property.</param>
+        /// <param name="regionID">Initial value of the RegionID property.</param>
+        public static Territory CreateTerritory(global::System.String territoryID, global::System.String territoryDescription, global::System.Int32 regionID)
+        {
+            Territory territory = new Territory();
+            territory.TerritoryID = territoryID;
+            territory.TerritoryDescription = territoryDescription;
+            territory.RegionID = regionID;
+            return territory;
+        }
+
+        #endregion
+
+        #region Primitive Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String TerritoryID
+        {
+            get
+            {
+                return _TerritoryID;
+            }
+            set
+            {
+                if (_TerritoryID != value)
+                {
+                    OnTerritoryIDChanging(value);
+                    ReportPropertyChanging("TerritoryID");
+                    _TerritoryID = StructuralObject.SetValidValue(value, false);
+                    ReportPropertyChanged("TerritoryID");
+                    OnTerritoryIDChanged();
+                }
+            }
+        }
+        private global::System.String _TerritoryID;
+        partial void OnTerritoryIDChanging(global::System.String value);
+        partial void OnTerritoryIDChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.String TerritoryDescription
+        {
+            get
+            {
+                return _TerritoryDescription;
+            }
+            set
+            {
+                OnTerritoryDescriptionChanging(value);
+                ReportPropertyChanging("TerritoryDescription");
+                _TerritoryDescription = StructuralObject.SetValidValue(value, false);
+                ReportPropertyChanged("TerritoryDescription");
+                OnTerritoryDescriptionChanged();
+            }
+        }
+        private global::System.String _TerritoryDescription;
+        partial void OnTerritoryDescriptionChanging(global::System.String value);
+        partial void OnTerritoryDescriptionChanged();
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
+        [DataMemberAttribute()]
+        public global::System.Int32 RegionID
+        {
+            get
+            {
+                return _RegionID;
+            }
+            set
+            {
+                OnRegionIDChanging(value);
+                ReportPropertyChanging("RegionID");
+                _RegionID = StructuralObject.SetValidValue(value);
+                ReportPropertyChanged("RegionID");
+                OnRegionIDChanged();
+            }
+        }
+        private global::System.Int32 _RegionID;
+        partial void OnRegionIDChanging(global::System.Int32 value);
+        partial void OnRegionIDChanged();
+
+        #endregion
+
+    
+        #region Navigation Properties
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [XmlIgnoreAttribute()]
+        [SoapIgnoreAttribute()]
+        [DataMemberAttribute()]
+        [EdmRelationshipNavigationPropertyAttribute("NorthwindModel", "FK_Territories_Region", "Region")]
+        public Region Region
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Region>("NorthwindModel.FK_Territories_Region", "Region").Value;
+            }
+            set
+            {
+                ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Region>("NorthwindModel.FK_Territories_Region", "Region").Value = value;
+            }
+        }
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [BrowsableAttribute(false)]
+        [DataMemberAttribute()]
+        public EntityReference<Region> RegionReference
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<Region>("NorthwindModel.FK_Territories_Region", "Region");
+            }
+            set
+            {
+                if ((value != null))
+                {
+                    ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference<Region>("NorthwindModel.FK_Territories_Region", "Region", value);
+                }
+            }
+        }
+    
+        /// <summary>
+        /// No Metadata Documentation available.
+        /// </summary>
+        [XmlIgnoreAttribute()]
+        [SoapIgnoreAttribute()]
+        [DataMemberAttribute()]
+        [EdmRelationshipNavigationPropertyAttribute("NorthwindModel", "EmployeeTerritories", "Employees")]
+        public EntityCollection<Employee> Employees
+        {
+            get
+            {
+                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<Employee>("NorthwindModel.EmployeeTerritories", "Employees");
+            }
+            set
+            {
+                if ((value != null))
+                {
+                    ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<Employee>("NorthwindModel.EmployeeTerritories", "Employees", value);
+                }
+            }
+        }
+
+        #endregion
+
+    }
+
+    #endregion
+
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/NorthwindDataService/NorthwindModel.edmx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1800 @@
+<?xml version="1.0" encoding="utf-8"?>
+<edmx:Edmx Version="2.0" xmlns:edmx="http://schemas.microsoft.com/ado/2008/10/edmx">
+  <!-- EF Runtime content -->
+  <edmx:Runtime>
+    <!-- SSDL content -->
+    <edmx:StorageModels>
+      <Schema Namespace="NorthwindModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">
+        <EntityContainer Name="NorthwindModelStoreContainer">
+          <EntitySet Name="Categories" EntityType="NorthwindModel.Store.Categories" store:Type="Tables" Schema="dbo" />
+          <EntitySet Name="CustomerCustomerDemo" EntityType="NorthwindModel.Store.CustomerCustomerDemo" store:Type="Tables" Schema="dbo" />
+          <EntitySet Name="CustomerDemographics" EntityType="NorthwindModel.Store.CustomerDemographics" store:Type="Tables" Schema="dbo" />
+          <EntitySet Name="Customers" EntityType="NorthwindModel.Store.Customers" store:Type="Tables" Schema="dbo" />
+          <EntitySet Name="Employees" EntityType="NorthwindModel.Store.Employees" store:Type="Tables" Schema="dbo" />
+          <EntitySet Name="EmployeeTerritories" EntityType="NorthwindModel.Store.EmployeeTerritories" store:Type="Tables" Schema="dbo" />
+          <EntitySet Name="Order Details" EntityType="NorthwindModel.Store.Order Details" store:Type="Tables" Schema="dbo" />
+          <EntitySet Name="Orders" EntityType="NorthwindModel.Store.Orders" store:Type="Tables" Schema="dbo" />
+          <EntitySet Name="Products" EntityType="NorthwindModel.Store.Products" store:Type="Tables" Schema="dbo" />
+          <EntitySet Name="Region" EntityType="NorthwindModel.Store.Region" store:Type="Tables" Schema="dbo" />
+          <EntitySet Name="Shippers" EntityType="NorthwindModel.Store.Shippers" store:Type="Tables" Schema="dbo" />
+          <EntitySet Name="Suppliers" EntityType="NorthwindModel.Store.Suppliers" store:Type="Tables" Schema="dbo" />
+          <EntitySet Name="sysdiagrams" EntityType="NorthwindModel.Store.sysdiagrams" store:Type="Tables" Schema="dbo" />
+          <EntitySet Name="Territories" EntityType="NorthwindModel.Store.Territories" store:Type="Tables" Schema="dbo" />
+          <EntitySet Name="Alphabetical list of products" EntityType="NorthwindModel.Store.Alphabetical list of products" store:Type="Views" store:Schema="dbo" store:Name="Alphabetical list of products">
+            <DefiningQuery>SELECT 
+      [Alphabetical list of products].[ProductID] AS [ProductID], 
+      [Alphabetical list of products].[ProductName] AS [ProductName], 
+      [Alphabetical list of products].[SupplierID] AS [SupplierID], 
+      [Alphabetical list of products].[CategoryID] AS [CategoryID], 
+      [Alphabetical list of products].[QuantityPerUnit] AS [QuantityPerUnit], 
+      [Alphabetical list of products].[UnitPrice] AS [UnitPrice], 
+      [Alphabetical list of products].[UnitsInStock] AS [UnitsInStock], 
+      [Alphabetical list of products].[UnitsOnOrder] AS [UnitsOnOrder], 
+      [Alphabetical list of products].[ReorderLevel] AS [ReorderLevel], 
+      [Alphabetical list of products].[Discontinued] AS [Discontinued], 
+      [Alphabetical list of products].[CategoryName] AS [CategoryName]
+      FROM [dbo].[Alphabetical list of products] AS [Alphabetical list of products]</DefiningQuery>
+          </EntitySet>
+          <EntitySet Name="Category Sales for 1997" EntityType="NorthwindModel.Store.Category Sales for 1997" store:Type="Views" store:Schema="dbo" store:Name="Category Sales for 1997">
+            <DefiningQuery>SELECT 
+      [Category Sales for 1997].[CategoryName] AS [CategoryName], 
+      [Category Sales for 1997].[CategorySales] AS [CategorySales]
+      FROM [dbo].[Category Sales for 1997] AS [Category Sales for 1997]</DefiningQuery>
+          </EntitySet>
+          <EntitySet Name="Current Product List" EntityType="NorthwindModel.Store.Current Product List" store:Type="Views" store:Schema="dbo" store:Name="Current Product List">
+            <DefiningQuery>SELECT 
+      [Current Product List].[ProductID] AS [ProductID], 
+      [Current Product List].[ProductName] AS [ProductName]
+      FROM [dbo].[Current Product List] AS [Current Product List]</DefiningQuery>
+          </EntitySet>
+          <EntitySet Name="Customer and Suppliers by City" EntityType="NorthwindModel.Store.Customer and Suppliers by City" store:Type="Views" store:Schema="dbo" store:Name="Customer and Suppliers by City">
+            <DefiningQuery>SELECT 
+      [Customer and Suppliers by City].[City] AS [City], 
+      [Customer and Suppliers by City].[CompanyName] AS [CompanyName], 
+      [Customer and Suppliers by City].[ContactName] AS [ContactName], 
+      [Customer and Suppliers by City].[Relationship] AS [Relationship]
+      FROM [dbo].[Customer and Suppliers by City] AS [Customer and Suppliers by City]</DefiningQuery>
+          </EntitySet>
+          <EntitySet Name="Invoices" EntityType="NorthwindModel.Store.Invoices" store:Type="Views" store:Schema="dbo" store:Name="Invoices">
+            <DefiningQuery>SELECT 
+      [Invoices].[ShipName] AS [ShipName], 
+      [Invoices].[ShipAddress] AS [ShipAddress], 
+      [Invoices].[ShipCity] AS [ShipCity], 
+      [Invoices].[ShipRegion] AS [ShipRegion], 
+      [Invoices].[ShipPostalCode] AS [ShipPostalCode], 
+      [Invoices].[ShipCountry] AS [ShipCountry], 
+      [Invoices].[CustomerID] AS [CustomerID], 
+      [Invoices].[CustomerName] AS [CustomerName], 
+      [Invoices].[Address] AS [Address], 
+      [Invoices].[City] AS [City], 
+      [Invoices].[Region] AS [Region], 
+      [Invoices].[PostalCode] AS [PostalCode], 
+      [Invoices].[Country] AS [Country], 
+      [Invoices].[Salesperson] AS [Salesperson], 
+      [Invoices].[OrderID] AS [OrderID], 
+      [Invoices].[OrderDate] AS [OrderDate], 
+      [Invoices].[RequiredDate] AS [RequiredDate], 
+      [Invoices].[ShippedDate] AS [ShippedDate], 
+      [Invoices].[ShipperName] AS [ShipperName], 
+      [Invoices].[ProductID] AS [ProductID], 
+      [Invoices].[ProductName] AS [ProductName], 
+      [Invoices].[UnitPrice] AS [UnitPrice], 
+      [Invoices].[Quantity] AS [Quantity], 
+      [Invoices].[Discount] AS [Discount], 
+      [Invoices].[ExtendedPrice] AS [ExtendedPrice], 
+      [Invoices].[Freight] AS [Freight]
+      FROM [dbo].[Invoices] AS [Invoices]</DefiningQuery>
+          </EntitySet>
+          <EntitySet Name="Order Details Extended" EntityType="NorthwindModel.Store.Order Details Extended" store:Type="Views" store:Schema="dbo" store:Name="Order Details Extended">
+            <DefiningQuery>SELECT 
+      [Order Details Extended].[OrderID] AS [OrderID], 
+      [Order Details Extended].[ProductID] AS [ProductID], 
+      [Order Details Extended].[ProductName] AS [ProductName], 
+      [Order Details Extended].[UnitPrice] AS [UnitPrice], 
+      [Order Details Extended].[Quantity] AS [Quantity], 
+      [Order Details Extended].[Discount] AS [Discount], 
+      [Order Details Extended].[ExtendedPrice] AS [ExtendedPrice]
+      FROM [dbo].[Order Details Extended] AS [Order Details Extended]</DefiningQuery>
+          </EntitySet>
+          <EntitySet Name="Order Subtotals" EntityType="NorthwindModel.Store.Order Subtotals" store:Type="Views" store:Schema="dbo" store:Name="Order Subtotals">
+            <DefiningQuery>SELECT 
+      [Order Subtotals].[OrderID] AS [OrderID], 
+      [Order Subtotals].[Subtotal] AS [Subtotal]
+      FROM [dbo].[Order Subtotals] AS [Order Subtotals]</DefiningQuery>
+          </EntitySet>
+          <EntitySet Name="Orders Qry" EntityType="NorthwindModel.Store.Orders Qry" store:Type="Views" store:Schema="dbo" store:Name="Orders Qry">
+            <DefiningQuery>SELECT 
+      [Orders Qry].[OrderID] AS [OrderID], 
+      [Orders Qry].[CustomerID] AS [CustomerID], 
+      [Orders Qry].[EmployeeID] AS [EmployeeID], 
+      [Orders Qry].[OrderDate] AS [OrderDate], 
+      [Orders Qry].[RequiredDate] AS [RequiredDate], 
+      [Orders Qry].[ShippedDate] AS [ShippedDate], 
+      [Orders Qry].[ShipVia] AS [ShipVia], 
+      [Orders Qry].[Freight] AS [Freight], 
+      [Orders Qry].[ShipName] AS [ShipName], 
+      [Orders Qry].[ShipAddress] AS [ShipAddress], 
+      [Orders Qry].[ShipCity] AS [ShipCity], 
+      [Orders Qry].[ShipRegion] AS [ShipRegion], 
+      [Orders Qry].[ShipPostalCode] AS [ShipPostalCode], 
+      [Orders Qry].[ShipCountry] AS [ShipCountry], 
+      [Orders Qry].[CompanyName] AS [CompanyName], 
+      [Orders Qry].[Address] AS [Address], 
+      [Orders Qry].[City] AS [City], 
+      [Orders Qry].[Region] AS [Region], 
+      [Orders Qry].[PostalCode] AS [PostalCode], 
+      [Orders Qry].[Country] AS [Country]
+      FROM [dbo].[Orders Qry] AS [Orders Qry]</DefiningQuery>
+          </EntitySet>
+          <EntitySet Name="Product Sales for 1997" EntityType="NorthwindModel.Store.Product Sales for 1997" store:Type="Views" store:Schema="dbo" store:Name="Product Sales for 1997">
+            <DefiningQuery>SELECT 
+      [Product Sales for 1997].[CategoryName] AS [CategoryName], 
+      [Product Sales for 1997].[ProductName] AS [ProductName], 
+      [Product Sales for 1997].[ProductSales] AS [ProductSales]
+      FROM [dbo].[Product Sales for 1997] AS [Product Sales for 1997]</DefiningQuery>
+          </EntitySet>
+          <EntitySet Name="Products Above Average Price" EntityType="NorthwindModel.Store.Products Above Average Price" store:Type="Views" store:Schema="dbo" store:Name="Products Above Average Price">
+            <DefiningQuery>SELECT 
+      [Products Above Average Price].[ProductName] AS [ProductName], 
+      [Products Above Average Price].[UnitPrice] AS [UnitPrice]
+      FROM [dbo].[Products Above Average Price] AS [Products Above Average Price]</DefiningQuery>
+          </EntitySet>
+          <EntitySet Name="Products by Category" EntityType="NorthwindModel.Store.Products by Category" store:Type="Views" store:Schema="dbo" store:Name="Products by Category">
+            <DefiningQuery>SELECT 
+      [Products by Category].[CategoryName] AS [CategoryName], 
+      [Products by Category].[ProductName] AS [ProductName], 
+      [Products by Category].[QuantityPerUnit] AS [QuantityPerUnit], 
+      [Products by Category].[UnitsInStock] AS [UnitsInStock], 
+      [Products by Category].[Discontinued] AS [Discontinued]
+      FROM [dbo].[Products by Category] AS [Products by Category]</DefiningQuery>
+          </EntitySet>
+          <EntitySet Name="Sales by Category" EntityType="NorthwindModel.Store.Sales by Category" store:Type="Views" store:Schema="dbo" store:Name="Sales by Category">
+            <DefiningQuery>SELECT 
+      [Sales by Category].[CategoryID] AS [CategoryID], 
+      [Sales by Category].[CategoryName] AS [CategoryName], 
+      [Sales by Category].[ProductName] AS [ProductName], 
+      [Sales by Category].[ProductSales] AS [ProductSales]
+      FROM [dbo].[Sales by Category] AS [Sales by Category]</DefiningQuery>
+          </EntitySet>
+          <EntitySet Name="Sales Totals by Amount" EntityType="NorthwindModel.Store.Sales Totals by Amount" store:Type="Views" store:Schema="dbo" store:Name="Sales Totals by Amount">
+            <DefiningQuery>SELECT 
+      [Sales Totals by Amount].[SaleAmount] AS [SaleAmount], 
+      [Sales Totals by Amount].[OrderID] AS [OrderID], 
+      [Sales Totals by Amount].[CompanyName] AS [CompanyName], 
+      [Sales Totals by Amount].[ShippedDate] AS [ShippedDate]
+      FROM [dbo].[Sales Totals by Amount] AS [Sales Totals by Amount]</DefiningQuery>
+          </EntitySet>
+          <EntitySet Name="Summary of Sales by Quarter" EntityType="NorthwindModel.Store.Summary of Sales by Quarter" store:Type="Views" store:Schema="dbo" store:Name="Summary of Sales by Quarter">
+            <DefiningQuery>SELECT 
+      [Summary of Sales by Quarter].[ShippedDate] AS [ShippedDate], 
+      [Summary of Sales by Quarter].[OrderID] AS [OrderID], 
+      [Summary of Sales by Quarter].[Subtotal] AS [Subtotal]
+      FROM [dbo].[Summary of Sales by Quarter] AS [Summary of Sales by Quarter]</DefiningQuery>
+          </EntitySet>
+          <EntitySet Name="Summary of Sales by Year" EntityType="NorthwindModel.Store.Summary of Sales by Year" store:Type="Views" store:Schema="dbo" store:Name="Summary of Sales by Year">
+            <DefiningQuery>SELECT 
+      [Summary of Sales by Year].[ShippedDate] AS [ShippedDate], 
+      [Summary of Sales by Year].[OrderID] AS [OrderID], 
+      [Summary of Sales by Year].[Subtotal] AS [Subtotal]
+      FROM [dbo].[Summary of Sales by Year] AS [Summary of Sales by Year]</DefiningQuery>
+          </EntitySet>
+          <AssociationSet Name="FK_CustomerCustomerDemo" Association="NorthwindModel.Store.FK_CustomerCustomerDemo">
+            <End Role="CustomerDemographics" EntitySet="CustomerDemographics" />
+            <End Role="CustomerCustomerDemo" EntitySet="CustomerCustomerDemo" />
+          </AssociationSet>
+          <AssociationSet Name="FK_CustomerCustomerDemo_Customers" Association="NorthwindModel.Store.FK_CustomerCustomerDemo_Customers">
+            <End Role="Customers" EntitySet="Customers" />
+            <End Role="CustomerCustomerDemo" EntitySet="CustomerCustomerDemo" />
+          </AssociationSet>
+          <AssociationSet Name="FK_Employees_Employees" Association="NorthwindModel.Store.FK_Employees_Employees">
+            <End Role="Employees" EntitySet="Employees" />
+            <End Role="Employees1" EntitySet="Employees" />
+          </AssociationSet>
+          <AssociationSet Name="FK_EmployeeTerritories_Employees" Association="NorthwindModel.Store.FK_EmployeeTerritories_Employees">
+            <End Role="Employees" EntitySet="Employees" />
+            <End Role="EmployeeTerritories" EntitySet="EmployeeTerritories" />
+          </AssociationSet>
+          <AssociationSet Name="FK_EmployeeTerritories_Territories" Association="NorthwindModel.Store.FK_EmployeeTerritories_Territories">
+            <End Role="Territories" EntitySet="Territories" />
+            <End Role="EmployeeTerritories" EntitySet="EmployeeTerritories" />
+          </AssociationSet>
+          <AssociationSet Name="FK_Order_Details_Orders" Association="NorthwindModel.Store.FK_Order_Details_Orders">
+            <End Role="Orders" EntitySet="Orders" />
+            <End Role="Order Details" EntitySet="Order Details" />
+          </AssociationSet>
+          <AssociationSet Name="FK_Order_Details_Products" Association="NorthwindModel.Store.FK_Order_Details_Products">
+            <End Role="Products" EntitySet="Products" />
+            <End Role="Order Details" EntitySet="Order Details" />
+          </AssociationSet>
+          <AssociationSet Name="FK_Orders_Customers" Association="NorthwindModel.Store.FK_Orders_Customers">
+            <End Role="Customers" EntitySet="Customers" />
+            <End Role="Orders" EntitySet="Orders" />
+          </AssociationSet>
+          <AssociationSet Name="FK_Orders_Employees" Association="NorthwindModel.Store.FK_Orders_Employees">
+            <End Role="Employees" EntitySet="Employees" />
+            <End Role="Orders" EntitySet="Orders" />
+          </AssociationSet>
+          <AssociationSet Name="FK_Orders_Shippers" Association="NorthwindModel.Store.FK_Orders_Shippers">
+            <End Role="Shippers" EntitySet="Shippers" />
+            <End Role="Orders" EntitySet="Orders" />
+          </AssociationSet>
+          <AssociationSet Name="FK_Products_Categories" Association="NorthwindModel.Store.FK_Products_Categories">
+            <End Role="Categories" EntitySet="Categories" />
+            <End Role="Products" EntitySet="Products" />
+          </AssociationSet>
+          <AssociationSet Name="FK_Products_Suppliers" Association="NorthwindModel.Store.FK_Products_Suppliers">
+            <End Role="Suppliers" EntitySet="Suppliers" />
+            <End Role="Products" EntitySet="Products" />
+          </AssociationSet>
+          <AssociationSet Name="FK_Territories_Region" Association="NorthwindModel.Store.FK_Territories_Region">
+            <End Role="Region" EntitySet="Region" />
+            <End Role="Territories" EntitySet="Territories" />
+          </AssociationSet>
+        </EntityContainer>
+        <EntityType Name="Categories">
+          <Key>
+            <PropertyRef Name="CategoryID" />
+          </Key>
+          <Property Name="CategoryID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
+          <Property Name="CategoryName" Type="nvarchar" Nullable="false" MaxLength="15" />
+          <Property Name="Description" Type="ntext" />
+          <Property Name="Picture" Type="image" />
+        </EntityType>
+        <EntityType Name="CustomerCustomerDemo">
+          <Key>
+            <PropertyRef Name="CustomerID" />
+            <PropertyRef Name="CustomerTypeID" />
+          </Key>
+          <Property Name="CustomerID" Type="nchar" Nullable="false" MaxLength="5" />
+          <Property Name="CustomerTypeID" Type="nchar" Nullable="false" MaxLength="10" />
+        </EntityType>
+        <EntityType Name="CustomerDemographics">
+          <Key>
+            <PropertyRef Name="CustomerTypeID" />
+          </Key>
+          <Property Name="CustomerTypeID" Type="nchar" Nullable="false" MaxLength="10" />
+          <Property Name="CustomerDesc" Type="ntext" />
+        </EntityType>
+        <EntityType Name="Customers">
+          <Key>
+            <PropertyRef Name="CustomerID" />
+          </Key>
+          <Property Name="CustomerID" Type="nchar" Nullable="false" MaxLength="5" />
+          <Property Name="CompanyName" Type="nvarchar" Nullable="false" MaxLength="40" />
+          <Property Name="ContactName" Type="nvarchar" MaxLength="30" />
+          <Property Name="ContactTitle" Type="nvarchar" MaxLength="30" />
+          <Property Name="Address" Type="nvarchar" MaxLength="60" />
+          <Property Name="City" Type="nvarchar" MaxLength="15" />
+          <Property Name="Region" Type="nvarchar" MaxLength="15" />
+          <Property Name="PostalCode" Type="nvarchar" MaxLength="10" />
+          <Property Name="Country" Type="nvarchar" MaxLength="15" />
+          <Property Name="Phone" Type="nvarchar" MaxLength="24" />
+          <Property Name="Fax" Type="nvarchar" MaxLength="24" />
+        </EntityType>
+        <EntityType Name="Employees">
+          <Key>
+            <PropertyRef Name="EmployeeID" />
+          </Key>
+          <Property Name="EmployeeID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
+          <Property Name="LastName" Type="nvarchar" Nullable="false" MaxLength="20" />
+          <Property Name="FirstName" Type="nvarchar" Nullable="false" MaxLength="10" />
+          <Property Name="Title" Type="nvarchar" MaxLength="30" />
+          <Property Name="TitleOfCourtesy" Type="nvarchar" MaxLength="25" />
+          <Property Name="BirthDate" Type="datetime" />
+          <Property Name="HireDate" Type="datetime" />
+          <Property Name="Address" Type="nvarchar" MaxLength="60" />
+          <Property Name="City" Type="nvarchar" MaxLength="15" />
+          <Property Name="Region" Type="nvarchar" MaxLength="15" />
+          <Property Name="PostalCode" Type="nvarchar" MaxLength="10" />
+          <Property Name="Country" Type="nvarchar" MaxLength="15" />
+          <Property Name="HomePhone" Type="nvarchar" MaxLength="24" />
+          <Property Name="Extension" Type="nvarchar" MaxLength="4" />
+          <Property Name="Photo" Type="image" />
+          <Property Name="Notes" Type="ntext" />
+          <Property Name="ReportsTo" Type="int" />
+          <Property Name="PhotoPath" Type="nvarchar" MaxLength="255" />
+        </EntityType>
+        <EntityType Name="EmployeeTerritories">
+          <Key>
+            <PropertyRef Name="EmployeeID" />
+            <PropertyRef Name="TerritoryID" />
+          </Key>
+          <Property Name="EmployeeID" Type="int" Nullable="false" />
+          <Property Name="TerritoryID" Type="nvarchar" Nullable="false" MaxLength="20" />
+        </EntityType>
+        <EntityType Name="Order Details">
+          <Key>
+            <PropertyRef Name="OrderID" />
+            <PropertyRef Name="ProductID" />
+          </Key>
+          <Property Name="OrderID" Type="int" Nullable="false" />
+          <Property Name="ProductID" Type="int" Nullable="false" />
+          <Property Name="UnitPrice" Type="money" Nullable="false" />
+          <Property Name="Quantity" Type="smallint" Nullable="false" />
+          <Property Name="Discount" Type="real" Nullable="false" />
+        </EntityType>
+        <EntityType Name="Orders">
+          <Key>
+            <PropertyRef Name="OrderID" />
+          </Key>
+          <Property Name="OrderID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
+          <Property Name="CustomerID" Type="nchar" MaxLength="5" />
+          <Property Name="EmployeeID" Type="int" />
+          <Property Name="OrderDate" Type="datetime" />
+          <Property Name="RequiredDate" Type="datetime" />
+          <Property Name="ShippedDate" Type="datetime" />
+          <Property Name="ShipVia" Type="int" />
+          <Property Name="Freight" Type="money" />
+          <Property Name="ShipName" Type="nvarchar" MaxLength="40" />
+          <Property Name="ShipAddress" Type="nvarchar" MaxLength="60" />
+          <Property Name="ShipCity" Type="nvarchar" MaxLength="15" />
+          <Property Name="ShipRegion" Type="nvarchar" MaxLength="15" />
+          <Property Name="ShipPostalCode" Type="nvarchar" MaxLength="10" />
+          <Property Name="ShipCountry" Type="nvarchar" MaxLength="15" />
+        </EntityType>
+        <EntityType Name="Products">
+          <Key>
+            <PropertyRef Name="ProductID" />
+          </Key>
+          <Property Name="ProductID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
+          <Property Name="ProductName" Type="nvarchar" Nullable="false" MaxLength="40" />
+          <Property Name="SupplierID" Type="int" />
+          <Property Name="CategoryID" Type="int" />
+          <Property Name="QuantityPerUnit" Type="nvarchar" MaxLength="20" />
+          <Property Name="UnitPrice" Type="money" />
+          <Property Name="UnitsInStock" Type="smallint" />
+          <Property Name="UnitsOnOrder" Type="smallint" />
+          <Property Name="ReorderLevel" Type="smallint" />
+          <Property Name="Discontinued" Type="bit" Nullable="false" />
+        </EntityType>
+        <EntityType Name="Region">
+          <Key>
+            <PropertyRef Name="RegionID" />
+          </Key>
+          <Property Name="RegionID" Type="int" Nullable="false" />
+          <Property Name="RegionDescription" Type="nchar" Nullable="false" MaxLength="50" />
+        </EntityType>
+        <EntityType Name="Shippers">
+          <Key>
+            <PropertyRef Name="ShipperID" />
+          </Key>
+          <Property Name="ShipperID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
+          <Property Name="CompanyName" Type="nvarchar" Nullable="false" MaxLength="40" />
+          <Property Name="Phone" Type="nvarchar" MaxLength="24" />
+        </EntityType>
+        <EntityType Name="Suppliers">
+          <Key>
+            <PropertyRef Name="SupplierID" />
+          </Key>
+          <Property Name="SupplierID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
+          <Property Name="CompanyName" Type="nvarchar" Nullable="false" MaxLength="40" />
+          <Property Name="ContactName" Type="nvarchar" MaxLength="30" />
+          <Property Name="ContactTitle" Type="nvarchar" MaxLength="30" />
+          <Property Name="Address" Type="nvarchar" MaxLength="60" />
+          <Property Name="City" Type="nvarchar" MaxLength="15" />
+          <Property Name="Region" Type="nvarchar" MaxLength="15" />
+          <Property Name="PostalCode" Type="nvarchar" MaxLength="10" />
+          <Property Name="Country" Type="nvarchar" MaxLength="15" />
+          <Property Name="Phone" Type="nvarchar" MaxLength="24" />
+          <Property Name="Fax" Type="nvarchar" MaxLength="24" />
+          <Property Name="HomePage" Type="ntext" />
+        </EntityType>
+        <EntityType Name="sysdiagrams">
+          <Key>
+            <PropertyRef Name="diagram_id" />
+          </Key>
+          <Property Name="name" Type="nvarchar" Nullable="false" MaxLength="128" />
+          <Property Name="principal_id" Type="int" Nullable="false" />
+          <Property Name="diagram_id" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
+          <Property Name="version" Type="int" />
+          <Property Name="definition" Type="varbinary(max)" />
+        </EntityType>
+        <EntityType Name="Territories">
+          <Key>
+            <PropertyRef Name="TerritoryID" />
+          </Key>
+          <Property Name="TerritoryID" Type="nvarchar" Nullable="false" MaxLength="20" />
+          <Property Name="TerritoryDescription" Type="nchar" Nullable="false" MaxLength="50" />
+          <Property Name="RegionID" Type="int" Nullable="false" />
+        </EntityType>
+        <!--Errors Found During Generation:
+      warning 6002: The table/view 'Northwind.dbo.Alphabetical list of products' does not have a primary key defined. The key has been inferred and the definition was created as a read-only table/view.
+      -->
+        <EntityType Name="Alphabetical list of products">
+          <Key>
+            <PropertyRef Name="ProductID" />
+            <PropertyRef Name="ProductName" />
+            <PropertyRef Name="Discontinued" />
+            <PropertyRef Name="CategoryName" />
+          </Key>
+          <Property Name="ProductID" Type="int" Nullable="false" />
+          <Property Name="ProductName" Type="nvarchar" Nullable="false" MaxLength="40" />
+          <Property Name="SupplierID" Type="int" />
+          <Property Name="CategoryID" Type="int" />
+          <Property Name="QuantityPerUnit" Type="nvarchar" MaxLength="20" />
+          <Property Name="UnitPrice" Type="money" />
+          <Property Name="UnitsInStock" Type="smallint" />
+          <Property Name="UnitsOnOrder" Type="smallint" />
+          <Property Name="ReorderLevel" Type="smallint" />
+          <Property Name="Discontinued" Type="bit" Nullable="false" />
+          <Property Name="CategoryName" Type="nvarchar" Nullable="false" MaxLength="15" />
+        </EntityType>
+        <!--Errors Found During Generation:
+      warning 6002: The table/view 'Northwind.dbo.Category Sales for 1997' does not have a primary key defined. The key has been inferred and the definition was created as a read-only table/view.
+      -->
+        <EntityType Name="Category Sales for 1997">
+          <Key>
+            <PropertyRef Name="CategoryName" />
+          </Key>
+          <Property Name="CategoryName" Type="nvarchar" Nullable="false" MaxLength="15" />
+          <Property Name="CategorySales" Type="money" />
+        </EntityType>
+        <!--Errors Found During Generation:
+      warning 6002: The table/view 'Northwind.dbo.Current Product List' does not have a primary key defined. The key has been inferred and the definition was created as a read-only table/view.
+      -->
+        <EntityType Name="Current Product List">
+          <Key>
+            <PropertyRef Name="ProductID" />
+            <PropertyRef Name="ProductName" />
+          </Key>
+          <Property Name="ProductID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
+          <Property Name="ProductName" Type="nvarchar" Nullable="false" MaxLength="40" />
+        </EntityType>
+        <!--Errors Found During Generation:
+      warning 6002: The table/view 'Northwind.dbo.Customer and Suppliers by City' does not have a primary key defined. The key has been inferred and the definition was created as a read-only table/view.
+      -->
+        <EntityType Name="Customer and Suppliers by City">
+          <Key>
+            <PropertyRef Name="CompanyName" />
+            <PropertyRef Name="Relationship" />
+          </Key>
+          <Property Name="City" Type="nvarchar" MaxLength="15" />
+          <Property Name="CompanyName" Type="nvarchar" Nullable="false" MaxLength="40" />
+          <Property Name="ContactName" Type="nvarchar" MaxLength="30" />
+          <Property Name="Relationship" Type="varchar" Nullable="false" MaxLength="9" />
+        </EntityType>
+        <!--Errors Found During Generation:
+      warning 6002: The table/view 'Northwind.dbo.Invoices' does not have a primary key defined. The key has been inferred and the definition was created as a read-only table/view.
+      -->
+        <EntityType Name="Invoices">
+          <Key>
+            <PropertyRef Name="CustomerName" />
+            <PropertyRef Name="Salesperson" />
+            <PropertyRef Name="OrderID" />
+            <PropertyRef Name="ShipperName" />
+            <PropertyRef Name="ProductID" />
+            <PropertyRef Name="ProductName" />
+            <PropertyRef Name="UnitPrice" />
+            <PropertyRef Name="Quantity" />
+            <PropertyRef Name="Discount" />
+          </Key>
+          <Property Name="ShipName" Type="nvarchar" MaxLength="40" />
+          <Property Name="ShipAddress" Type="nvarchar" MaxLength="60" />
+          <Property Name="ShipCity" Type="nvarchar" MaxLength="15" />
+          <Property Name="ShipRegion" Type="nvarchar" MaxLength="15" />
+          <Property Name="ShipPostalCode" Type="nvarchar" MaxLength="10" />
+          <Property Name="ShipCountry" Type="nvarchar" MaxLength="15" />
+          <Property Name="CustomerID" Type="nchar" MaxLength="5" />
+          <Property Name="CustomerName" Type="nvarchar" Nullable="false" MaxLength="40" />
+          <Property Name="Address" Type="nvarchar" MaxLength="60" />
+          <Property Name="City" Type="nvarchar" MaxLength="15" />
+          <Property Name="Region" Type="nvarchar" MaxLength="15" />
+          <Property Name="PostalCode" Type="nvarchar" MaxLength="10" />
+          <Property Name="Country" Type="nvarchar" MaxLength="15" />
+          <Property Name="Salesperson" Type="nvarchar" Nullable="false" MaxLength="31" />
+          <Property Name="OrderID" Type="int" Nullable="false" />
+          <Property Name="OrderDate" Type="datetime" />
+          <Property Name="RequiredDate" Type="datetime" />
+          <Property Name="ShippedDate" Type="datetime" />
+          <Property Name="ShipperName" Type="nvarchar" Nullable="false" MaxLength="40" />
+          <Property Name="ProductID" Type="int" Nullable="false" />
+          <Property Name="ProductName" Type="nvarchar" Nullable="false" MaxLength="40" />
+          <Property Name="UnitPrice" Type="money" Nullable="false" />
+          <Property Name="Quantity" Type="smallint" Nullable="false" />
+          <Property Name="Discount" Type="real" Nullable="false" />
+          <Property Name="ExtendedPrice" Type="money" />
+          <Property Name="Freight" Type="money" />
+        </EntityType>
+        <!--Errors Found During Generation:
+      warning 6002: The table/view 'Northwind.dbo.Order Details Extended' does not have a primary key defined. The key has been inferred and the definition was created as a read-only table/view.
+      -->
+        <EntityType Name="Order Details Extended">
+          <Key>
+            <PropertyRef Name="OrderID" />
+            <PropertyRef Name="ProductID" />
+            <PropertyRef Name="ProductName" />
+            <PropertyRef Name="UnitPrice" />
+            <PropertyRef Name="Quantity" />
+            <PropertyRef Name="Discount" />
+          </Key>
+          <Property Name="OrderID" Type="int" Nullable="false" />
+          <Property Name="ProductID" Type="int" Nullable="false" />
+          <Property Name="ProductName" Type="nvarchar" Nullable="false" MaxLength="40" />
+          <Property Name="UnitPrice" Type="money" Nullable="false" />
+          <Property Name="Quantity" Type="smallint" Nullable="false" />
+          <Property Name="Discount" Type="real" Nullable="false" />
+          <Property Name="ExtendedPrice" Type="money" />
+        </EntityType>
+        <!--Errors Found During Generation:
+      warning 6002: The table/view 'Northwind.dbo.Order Subtotals' does not have a primary key defined. The key has been inferred and the definition was created as a read-only table/view.
+      -->
+        <EntityType Name="Order Subtotals">
+          <Key>
+            <PropertyRef Name="OrderID" />
+          </Key>
+          <Property Name="OrderID" Type="int" Nullable="false" />
+          <Property Name="Subtotal" Type="money" />
+        </EntityType>
+        <!--Errors Found During Generation:
+      warning 6002: The table/view 'Northwind.dbo.Orders Qry' does not have a primary key defined. The key has been inferred and the definition was created as a read-only table/view.
+      -->
+        <EntityType Name="Orders Qry">
+          <Key>
+            <PropertyRef Name="OrderID" />
+            <PropertyRef Name="CompanyName" />
+          </Key>
+          <Property Name="OrderID" Type="int" Nullable="false" />
+          <Property Name="CustomerID" Type="nchar" MaxLength="5" />
+          <Property Name="EmployeeID" Type="int" />
+          <Property Name="OrderDate" Type="datetime" />
+          <Property Name="RequiredDate" Type="datetime" />
+          <Property Name="ShippedDate" Type="datetime" />
+          <Property Name="ShipVia" Type="int" />
+          <Property Name="Freight" Type="money" />
+          <Property Name="ShipName" Type="nvarchar" MaxLength="40" />
+          <Property Name="ShipAddress" Type="nvarchar" MaxLength="60" />
+          <Property Name="ShipCity" Type="nvarchar" MaxLength="15" />
+          <Property Name="ShipRegion" Type="nvarchar" MaxLength="15" />
+          <Property Name="ShipPostalCode" Type="nvarchar" MaxLength="10" />
+          <Property Name="ShipCountry" Type="nvarchar" MaxLength="15" />
+          <Property Name="CompanyName" Type="nvarchar" Nullable="false" MaxLength="40" />
+          <Property Name="Address" Type="nvarchar" MaxLength="60" />
+          <Property Name="City" Type="nvarchar" MaxLength="15" />
+          <Property Name="Region" Type="nvarchar" MaxLength="15" />
+          <Property Name="PostalCode" Type="nvarchar" MaxLength="10" />
+          <Property Name="Country" Type="nvarchar" MaxLength="15" />
+        </EntityType>
+        <!--Errors Found During Generation:
+      warning 6002: The table/view 'Northwind.dbo.Product Sales for 1997' does not have a primary key defined. The key has been inferred and the definition was created as a read-only table/view.
+      -->
+        <EntityType Name="Product Sales for 1997">
+          <Key>
+            <PropertyRef Name="CategoryName" />
+            <PropertyRef Name="ProductName" />
+          </Key>
+          <Property Name="CategoryName" Type="nvarchar" Nullable="false" MaxLength="15" />
+          <Property Name="ProductName" Type="nvarchar" Nullable="false" MaxLength="40" />
+          <Property Name="ProductSales" Type="money" />
+        </EntityType>
+        <!--Errors Found During Generation:
+      warning 6002: The table/view 'Northwind.dbo.Products Above Average Price' does not have a primary key defined. The key has been inferred and the definition was created as a read-only table/view.
+      -->
+        <EntityType Name="Products Above Average Price">
+          <Key>
+            <PropertyRef Name="ProductName" />
+          </Key>
+          <Property Name="ProductName" Type="nvarchar" Nullable="false" MaxLength="40" />
+          <Property Name="UnitPrice" Type="money" />
+        </EntityType>
+        <!--Errors Found During Generation:
+      warning 6002: The table/view 'Northwind.dbo.Products by Category' does not have a primary key defined. The key has been inferred and the definition was created as a read-only table/view.
+      -->
+        <EntityType Name="Products by Category">
+          <Key>
+            <PropertyRef Name="CategoryName" />
+            <PropertyRef Name="ProductName" />
+            <PropertyRef Name="Discontinued" />
+          </Key>
+          <Property Name="CategoryName" Type="nvarchar" Nullable="false" MaxLength="15" />
+          <Property Name="ProductName" Type="nvarchar" Nullable="false" MaxLength="40" />
+          <Property Name="QuantityPerUnit" Type="nvarchar" MaxLength="20" />
+          <Property Name="UnitsInStock" Type="smallint" />
+          <Property Name="Discontinued" Type="bit" Nullable="false" />
+        </EntityType>
+        <!--Errors Found During Generation:
+      warning 6002: The table/view 'Northwind.dbo.Sales by Category' does not have a primary key defined. The key has been inferred and the definition was created as a read-only table/view.
+      -->
+        <EntityType Name="Sales by Category">
+          <Key>
+            <PropertyRef Name="CategoryID" />
+            <PropertyRef Name="CategoryName" />
+            <PropertyRef Name="ProductName" />
+          </Key>
+          <Property Name="CategoryID" Type="int" Nullable="false" />
+          <Property Name="CategoryName" Type="nvarchar" Nullable="false" MaxLength="15" />
+          <Property Name="ProductName" Type="nvarchar" Nullable="false" MaxLength="40" />
+          <Property Name="ProductSales" Type="money" />
+        </EntityType>
+        <!--Errors Found During Generation:
+      warning 6002: The table/view 'Northwind.dbo.Sales Totals by Amount' does not have a primary key defined. The key has been inferred and the definition was created as a read-only table/view.
+      -->
+        <EntityType Name="Sales Totals by Amount">
+          <Key>
+            <PropertyRef Name="OrderID" />
+            <PropertyRef Name="CompanyName" />
+          </Key>
+          <Property Name="SaleAmount" Type="money" />
+          <Property Name="OrderID" Type="int" Nullable="false" />
+          <Property Name="CompanyName" Type="nvarchar" Nullable="false" MaxLength="40" />
+          <Property Name="ShippedDate" Type="datetime" />
+        </EntityType>
+        <!--Errors Found During Generation:
+      warning 6002: The table/view 'Northwind.dbo.Summary of Sales by Quarter' does not have a primary key defined. The key has been inferred and the definition was created as a read-only table/view.
+      -->
+        <EntityType Name="Summary of Sales by Quarter">
+          <Key>
+            <PropertyRef Name="OrderID" />
+          </Key>
+          <Property Name="ShippedDate" Type="datetime" />
+          <Property Name="OrderID" Type="int" Nullable="false" />
+          <Property Name="Subtotal" Type="money" />
+        </EntityType>
+        <!--Errors Found During Generation:
+      warning 6002: The table/view 'Northwind.dbo.Summary of Sales by Year' does not have a primary key defined. The key has been inferred and the definition was created as a read-only table/view.
+      -->
+        <EntityType Name="Summary of Sales by Year">
+          <Key>
+            <PropertyRef Name="OrderID" />
+          </Key>
+          <Property Name="ShippedDate" Type="datetime" />
+          <Property Name="OrderID" Type="int" Nullable="false" />
+          <Property Name="Subtotal" Type="money" />
+        </EntityType>
+        <Association Name="FK_CustomerCustomerDemo">
+          <End Role="CustomerDemographics" Type="NorthwindModel.Store.CustomerDemographics" Multiplicity="1" />
+          <End Role="CustomerCustomerDemo" Type="NorthwindModel.Store.CustomerCustomerDemo" Multiplicity="*" />
+          <ReferentialConstraint>
+            <Principal Role="CustomerDemographics">
+              <PropertyRef Name="CustomerTypeID" />
+            </Principal>
+            <Dependent Role="CustomerCustomerDemo">
+              <PropertyRef Name="CustomerTypeID" />
+            </Dependent>
+          </ReferentialConstraint>
+        </Association>
+        <Association Name="FK_CustomerCustomerDemo_Customers">
+          <End Role="Customers" Type="NorthwindModel.Store.Customers" Multiplicity="1" />
+          <End Role="CustomerCustomerDemo" Type="NorthwindModel.Store.CustomerCustomerDemo" Multiplicity="*" />
+          <ReferentialConstraint>
+            <Principal Role="Customers">
+              <PropertyRef Name="CustomerID" />
+            </Principal>
+            <Dependent Role="CustomerCustomerDemo">
+              <PropertyRef Name="CustomerID" />
+            </Dependent>
+          </ReferentialConstraint>
+        </Association>
+        <Association Name="FK_Employees_Employees">
+          <End Role="Employees" Type="NorthwindModel.Store.Employees" Multiplicity="0..1" />
+          <End Role="Employees1" Type="NorthwindModel.Store.Employees" Multiplicity="*" />
+          <ReferentialConstraint>
+            <Principal Role="Employees">
+              <PropertyRef Name="EmployeeID" />
+            </Principal>
+            <Dependent Role="Employees1">
+              <PropertyRef Name="ReportsTo" />
+            </Dependent>
+          </ReferentialConstraint>
+        </Association>
+        <Association Name="FK_EmployeeTerritories_Employees">
+          <End Role="Employees" Type="NorthwindModel.Store.Employees" Multiplicity="1" />
+          <End Role="EmployeeTerritories" Type="NorthwindModel.Store.EmployeeTerritories" Multiplicity="*" />
+          <ReferentialConstraint>
+            <Principal Role="Employees">
+              <PropertyRef Name="EmployeeID" />
+            </Principal>
+            <Dependent Role="EmployeeTerritories">
+              <PropertyRef Name="EmployeeID" />
+            </Dependent>
+          </ReferentialConstraint>
+        </Association>
+        <Association Name="FK_EmployeeTerritories_Territories">
+          <End Role="Territories" Type="NorthwindModel.Store.Territories" Multiplicity="1" />
+          <End Role="EmployeeTerritories" Type="NorthwindModel.Store.EmployeeTerritories" Multiplicity="*" />
+          <ReferentialConstraint>
+            <Principal Role="Territories">
+              <PropertyRef Name="TerritoryID" />
+            </Principal>
+            <Dependent Role="EmployeeTerritories">
+              <PropertyRef Name="TerritoryID" />
+            </Dependent>
+          </ReferentialConstraint>
+        </Association>
+        <Association Name="FK_Order_Details_Orders">
+          <End Role="Orders" Type="NorthwindModel.Store.Orders" Multiplicity="1" />
+          <End Role="Order Details" Type="NorthwindModel.Store.Order Details" Multiplicity="*" />
+          <ReferentialConstraint>
+            <Principal Role="Orders">
+              <PropertyRef Name="OrderID" />
+            </Principal>
+            <Dependent Role="Order Details">
+              <PropertyRef Name="OrderID" />
+            </Dependent>
+          </ReferentialConstraint>
+        </Association>
+        <Association Name="FK_Order_Details_Products">
+          <End Role="Products" Type="NorthwindModel.Store.Products" Multiplicity="1" />
+          <End Role="Order Details" Type="NorthwindModel.Store.Order Details" Multiplicity="*" />
+          <ReferentialConstraint>
+            <Principal Role="Products">
+              <PropertyRef Name="ProductID" />
+            </Principal>
+            <Dependent Role="Order Details">
+              <PropertyRef Name="ProductID" />
+            </Dependent>
+          </ReferentialConstraint>
+        </Association>
+        <Association Name="FK_Orders_Customers">
+          <End Role="Customers" Type="NorthwindModel.Store.Customers" Multiplicity="0..1" />
+          <End Role="Orders" Type="NorthwindModel.Store.Orders" Multiplicity="*" />
+          <ReferentialConstraint>
+            <Principal Role="Customers">
+              <PropertyRef Name="CustomerID" />
+            </Principal>
+            <Dependent Role="Orders">
+              <PropertyRef Name="CustomerID" />
+            </Dependent>
+          </ReferentialConstraint>
+        </Association>
+        <Association Name="FK_Orders_Employees">
+          <End Role="Employees" Type="NorthwindModel.Store.Employees" Multiplicity="0..1" />
+          <End Role="Orders" Type="NorthwindModel.Store.Orders" Multiplicity="*" />
+          <ReferentialConstraint>
+            <Principal Role="Employees">
+              <PropertyRef Name="EmployeeID" />
+            </Principal>
+            <Dependent Role="Orders">
+              <PropertyRef Name="EmployeeID" />
+            </Dependent>
+          </ReferentialConstraint>
+        </Association>
+        <Association Name="FK_Orders_Shippers">
+          <End Role="Shippers" Type="NorthwindModel.Store.Shippers" Multiplicity="0..1" />
+          <End Role="Orders" Type="NorthwindModel.Store.Orders" Multiplicity="*" />
+          <ReferentialConstraint>
+            <Principal Role="Shippers">
+              <PropertyRef Name="ShipperID" />
+            </Principal>
+            <Dependent Role="Orders">
+              <PropertyRef Name="ShipVia" />
+            </Dependent>
+          </ReferentialConstraint>
+        </Association>
+        <Association Name="FK_Products_Categories">
+          <End Role="Categories" Type="NorthwindModel.Store.Categories" Multiplicity="0..1" />
+          <End Role="Products" Type="NorthwindModel.Store.Products" Multiplicity="*" />
+          <ReferentialConstraint>
+            <Principal Role="Categories">
+              <PropertyRef Name="CategoryID" />
+            </Principal>
+            <Dependent Role="Products">
+              <PropertyRef Name="CategoryID" />
+            </Dependent>
+          </ReferentialConstraint>
+        </Association>
+        <Association Name="FK_Products_Suppliers">
+          <End Role="Suppliers" Type="NorthwindModel.Store.Suppliers" Multiplicity="0..1" />
+          <End Role="Products" Type="NorthwindModel.Store.Products" Multiplicity="*" />
+          <ReferentialConstraint>
+            <Principal Role="Suppliers">
+              <PropertyRef Name="SupplierID" />
+            </Principal>
+            <Dependent Role="Products">
+              <PropertyRef Name="SupplierID" />
+            </Dependent>
+          </ReferentialConstraint>
+        </Association>
+        <Association Name="FK_Territories_Region">
+          <End Role="Region" Type="NorthwindModel.Store.Region" Multiplicity="1" />
+          <End Role="Territories" Type="NorthwindModel.Store.Territories" Multiplicity="*" />
+          <ReferentialConstraint>
+            <Principal Role="Region">
+              <PropertyRef Name="RegionID" />
+            </Principal>
+            <Dependent Role="Territories">
+              <PropertyRef Name="RegionID" />
+            </Dependent>
+          </ReferentialConstraint>
+        </Association>
+        <Function Name="CustOrderHist" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
+          <Parameter Name="CustomerID" Type="nchar" Mode="In" />
+        </Function>
+        <Function Name="CustOrdersDetail" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
+          <Parameter Name="OrderID" Type="int" Mode="In" />
+        </Function>
+        <Function Name="CustOrdersOrders" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
+          <Parameter Name="CustomerID" Type="nchar" Mode="In" />
+        </Function>
+        <Function Name="Employee_Sales_by_Country" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" StoreFunctionName="Employee Sales by Country" Schema="dbo">
+          <Parameter Name="Beginning_Date" Type="datetime" Mode="In" />
+          <Parameter Name="Ending_Date" Type="datetime" Mode="In" />
+        </Function>
+        <Function Name="fn_diagramobjects" ReturnType="int" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo" />
+        <Function Name="Sales_by_Year" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" StoreFunctionName="Sales by Year" Schema="dbo">
+          <Parameter Name="Beginning_Date" Type="datetime" Mode="In" />
+          <Parameter Name="Ending_Date" Type="datetime" Mode="In" />
+        </Function>
+        <Function Name="SalesByCategory" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
+          <Parameter Name="CategoryName" Type="nvarchar" Mode="In" />
+          <Parameter Name="OrdYear" Type="nvarchar" Mode="In" />
+        </Function>
+        <Function Name="sp_alterdiagram" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
+          <Parameter Name="diagramname" Type="nvarchar" Mode="In" />
+          <Parameter Name="owner_id" Type="int" Mode="In" />
+          <Parameter Name="version" Type="int" Mode="In" />
+          <Parameter Name="definition" Type="varbinary(max)" Mode="In" />
+        </Function>
+        <Function Name="sp_creatediagram" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
+          <Parameter Name="diagramname" Type="nvarchar" Mode="In" />
+          <Parameter Name="owner_id" Type="int" Mode="In" />
+          <Parameter Name="version" Type="int" Mode="In" />
+          <Parameter Name="definition" Type="varbinary(max)" Mode="In" />
+        </Function>
+        <Function Name="sp_dropdiagram" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
+          <Parameter Name="diagramname" Type="nvarchar" Mode="In" />
+          <Parameter Name="owner_id" Type="int" Mode="In" />
+        </Function>
+        <Function Name="sp_helpdiagramdefinition" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
+          <Parameter Name="diagramname" Type="nvarchar" Mode="In" />
+          <Parameter Name="owner_id" Type="int" Mode="In" />
+        </Function>
+        <Function Name="sp_helpdiagrams" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
+          <Parameter Name="diagramname" Type="nvarchar" Mode="In" />
+          <Parameter Name="owner_id" Type="int" Mode="In" />
+        </Function>
+        <Function Name="sp_renamediagram" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
+          <Parameter Name="diagramname" Type="nvarchar" Mode="In" />
+          <Parameter Name="owner_id" Type="int" Mode="In" />
+          <Parameter Name="new_diagramname" Type="nvarchar" Mode="In" />
+        </Function>
+        <Function Name="sp_upgraddiagrams" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo" />
+        <Function Name="Ten_Most_Expensive_Products" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" StoreFunctionName="Ten Most Expensive Products" Schema="dbo" />
+        <!--Errors Found During Generation:
+      warning 6013: The table/view 'Northwind.dbo.Quarterly Orders' does not have a primary key defined and no valid primary key could be inferred. This table/view has been excluded. To use the entity, you will need to review your schema, add the correct keys, and uncomment it.
+      
+      <EntityType Name="Quarterly Orders">
+        <Property Name="CustomerID" Type="nchar" MaxLength="5" />
+        <Property Name="CompanyName" Type="nvarchar" MaxLength="40" />
+        <Property Name="City" Type="nvarchar" MaxLength="15" />
+        <Property Name="Country" Type="nvarchar" MaxLength="15" />
+      </EntityType>-->
+      </Schema>
+    </edmx:StorageModels>
+    <!-- CSDL content -->
+    <edmx:ConceptualModels>
+      <Schema Namespace="NorthwindModel" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
+        <EntityContainer Name="NorthwindEntities" annotation:LazyLoadingEnabled="true">
+          <EntitySet Name="Categories" EntityType="NorthwindModel.Category" />
+          <EntitySet Name="CustomerDemographics" EntityType="NorthwindModel.CustomerDemographic" />
+          <EntitySet Name="Customers" EntityType="NorthwindModel.Customer" />
+          <EntitySet Name="Employees" EntityType="NorthwindModel.Employee" />
+          <EntitySet Name="Order_Details" EntityType="NorthwindModel.Order_Detail" />
+          <EntitySet Name="Orders" EntityType="NorthwindModel.Order" />
+          <EntitySet Name="Products" EntityType="NorthwindModel.Product" />
+          <EntitySet Name="Regions" EntityType="NorthwindModel.Region" />
+          <EntitySet Name="Shippers" EntityType="NorthwindModel.Shipper" />
+          <EntitySet Name="Suppliers" EntityType="NorthwindModel.Supplier" />
+          <EntitySet Name="sysdiagrams" EntityType="NorthwindModel.sysdiagram" />
+          <EntitySet Name="Territories" EntityType="NorthwindModel.Territory" />
+          <EntitySet Name="Alphabetical_list_of_products" EntityType="NorthwindModel.Alphabetical_list_of_product" />
+          <EntitySet Name="Category_Sales_for_1997" EntityType="NorthwindModel.Category_Sales_for_1997" />
+          <EntitySet Name="Current_Product_Lists" EntityType="NorthwindModel.Current_Product_List" />
+          <EntitySet Name="Customer_and_Suppliers_by_Cities" EntityType="NorthwindModel.Customer_and_Suppliers_by_City" />
+          <EntitySet Name="Invoices" EntityType="NorthwindModel.Invoice" />
+          <EntitySet Name="Order_Details_Extendeds" EntityType="NorthwindModel.Order_Details_Extended" />
+          <EntitySet Name="Order_Subtotals" EntityType="NorthwindModel.Order_Subtotal" />
+          <EntitySet Name="Orders_Qries" EntityType="NorthwindModel.Orders_Qry" />
+          <EntitySet Name="Product_Sales_for_1997" EntityType="NorthwindModel.Product_Sales_for_1997" />
+          <EntitySet Name="Products_Above_Average_Prices" EntityType="NorthwindModel.Products_Above_Average_Price" />
+          <EntitySet Name="Products_by_Categories" EntityType="NorthwindModel.Products_by_Category" />
+          <EntitySet Name="Sales_by_Categories" EntityType="NorthwindModel.Sales_by_Category" />
+          <EntitySet Name="Sales_Totals_by_Amounts" EntityType="NorthwindModel.Sales_Totals_by_Amount" />
+          <EntitySet Name="Summary_of_Sales_by_Quarters" EntityType="NorthwindModel.Summary_of_Sales_by_Quarter" />
+          <EntitySet Name="Summary_of_Sales_by_Years" EntityType="NorthwindModel.Summary_of_Sales_by_Year" />
+          <AssociationSet Name="FK_Products_Categories" Association="NorthwindModel.FK_Products_Categories">
+            <End Role="Categories" EntitySet="Categories" />
+            <End Role="Products" EntitySet="Products" />
+          </AssociationSet>
+          <AssociationSet Name="FK_Orders_Customers" Association="NorthwindModel.FK_Orders_Customers">
+            <End Role="Customers" EntitySet="Customers" />
+            <End Role="Orders" EntitySet="Orders" />
+          </AssociationSet>
+          <AssociationSet Name="FK_Employees_Employees" Association="NorthwindModel.FK_Employees_Employees">
+            <End Role="Employees" EntitySet="Employees" />
+            <End Role="Employees1" EntitySet="Employees" />
+          </AssociationSet>
+          <AssociationSet Name="FK_Orders_Employees" Association="NorthwindModel.FK_Orders_Employees">
+            <End Role="Employees" EntitySet="Employees" />
+            <End Role="Orders" EntitySet="Orders" />
+          </AssociationSet>
+          <AssociationSet Name="FK_Order_Details_Orders" Association="NorthwindModel.FK_Order_Details_Orders">
+            <End Role="Orders" EntitySet="Orders" />
+            <End Role="Order_Details" EntitySet="Order_Details" />
+          </AssociationSet>
+          <AssociationSet Name="FK_Order_Details_Products" Association="NorthwindModel.FK_Order_Details_Products">
+            <End Role="Products" EntitySet="Products" />
+            <End Role="Order_Details" EntitySet="Order_Details" />
+          </AssociationSet>
+          <AssociationSet Name="FK_Orders_Shippers" Association="NorthwindModel.FK_Orders_Shippers">
+            <End Role="Shippers" EntitySet="Shippers" />
+            <End Role="Orders" EntitySet="Orders" />
+          </AssociationSet>
+          <AssociationSet Name="FK_Products_Suppliers" Association="NorthwindModel.FK_Products_Suppliers">
+            <End Role="Suppliers" EntitySet="Suppliers" />
+            <End Role="Products" EntitySet="Products" />
+          </AssociationSet>
+          <AssociationSet Name="FK_Territories_Region" Association="NorthwindModel.FK_Territories_Region">
+            <End Role="Region" EntitySet="Regions" />
+            <End Role="Territories" EntitySet="Territories" />
+          </AssociationSet>
+          <AssociationSet Name="CustomerCustomerDemo" Association="NorthwindModel.CustomerCustomerDemo">
+            <End Role="CustomerDemographics" EntitySet="CustomerDemographics" />
+            <End Role="Customers" EntitySet="Customers" />
+          </AssociationSet>
+          <AssociationSet Name="EmployeeTerritories" Association="NorthwindModel.EmployeeTerritories">
+            <End Role="Employees" EntitySet="Employees" />
+            <End Role="Territories" EntitySet="Territories" />
+          </AssociationSet>
+        </EntityContainer>
+        <EntityType Name="Category">
+          <Key>
+            <PropertyRef Name="CategoryID" />
+          </Key>
+          <Property Name="CategoryID" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
+          <Property Name="CategoryName" Type="String" Nullable="false" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="Description" Type="String" MaxLength="Max" Unicode="true" FixedLength="false" />
+          <Property Name="Picture" Type="Binary" MaxLength="Max" FixedLength="false" />
+          <NavigationProperty Name="Products" Relationship="NorthwindModel.FK_Products_Categories" FromRole="Categories" ToRole="Products" />
+        </EntityType>
+        <EntityType Name="CustomerDemographic">
+          <Key>
+            <PropertyRef Name="CustomerTypeID" />
+          </Key>
+          <Property Name="CustomerTypeID" Type="String" Nullable="false" MaxLength="10" Unicode="true" FixedLength="true" />
+          <Property Name="CustomerDesc" Type="String" MaxLength="Max" Unicode="true" FixedLength="false" />
+          <NavigationProperty Name="Customers" Relationship="NorthwindModel.CustomerCustomerDemo" FromRole="CustomerDemographics" ToRole="Customers" />
+        </EntityType>
+        <EntityType Name="Customer">
+          <Key>
+            <PropertyRef Name="CustomerID" />
+          </Key>
+          <Property Name="CustomerID" Type="String" Nullable="false" MaxLength="5" Unicode="true" FixedLength="true" />
+          <Property Name="CompanyName" Type="String" Nullable="false" MaxLength="40" Unicode="true" FixedLength="false" />
+          <Property Name="ContactName" Type="String" MaxLength="30" Unicode="true" FixedLength="false" />
+          <Property Name="ContactTitle" Type="String" MaxLength="30" Unicode="true" FixedLength="false" />
+          <Property Name="Address" Type="String" MaxLength="60" Unicode="true" FixedLength="false" />
+          <Property Name="City" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="Region" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="PostalCode" Type="String" MaxLength="10" Unicode="true" FixedLength="false" />
+          <Property Name="Country" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="Phone" Type="String" MaxLength="24" Unicode="true" FixedLength="false" />
+          <Property Name="Fax" Type="String" MaxLength="24" Unicode="true" FixedLength="false" />
+          <NavigationProperty Name="Orders" Relationship="NorthwindModel.FK_Orders_Customers" FromRole="Customers" ToRole="Orders" />
+          <NavigationProperty Name="CustomerDemographics" Relationship="NorthwindModel.CustomerCustomerDemo" FromRole="Customers" ToRole="CustomerDemographics" />
+        </EntityType>
+        <EntityType Name="Employee">
+          <Key>
+            <PropertyRef Name="EmployeeID" />
+          </Key>
+          <Property Name="EmployeeID" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
+          <Property Name="LastName" Type="String" Nullable="false" MaxLength="20" Unicode="true" FixedLength="false" />
+          <Property Name="FirstName" Type="String" Nullable="false" MaxLength="10" Unicode="true" FixedLength="false" />
+          <Property Name="Title" Type="String" MaxLength="30" Unicode="true" FixedLength="false" />
+          <Property Name="TitleOfCourtesy" Type="String" MaxLength="25" Unicode="true" FixedLength="false" />
+          <Property Name="BirthDate" Type="DateTime" />
+          <Property Name="HireDate" Type="DateTime" />
+          <Property Name="Address" Type="String" MaxLength="60" Unicode="true" FixedLength="false" />
+          <Property Name="City" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="Region" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="PostalCode" Type="String" MaxLength="10" Unicode="true" FixedLength="false" />
+          <Property Name="Country" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="HomePhone" Type="String" MaxLength="24" Unicode="true" FixedLength="false" />
+          <Property Name="Extension" Type="String" MaxLength="4" Unicode="true" FixedLength="false" />
+          <Property Name="Photo" Type="Binary" MaxLength="Max" FixedLength="false" />
+          <Property Name="Notes" Type="String" MaxLength="Max" Unicode="true" FixedLength="false" />
+          <Property Name="ReportsTo" Type="Int32" />
+          <Property Name="PhotoPath" Type="String" MaxLength="255" Unicode="true" FixedLength="false" />
+          <NavigationProperty Name="Employees1" Relationship="NorthwindModel.FK_Employees_Employees" FromRole="Employees" ToRole="Employees1" />
+          <NavigationProperty Name="Employee1" Relationship="NorthwindModel.FK_Employees_Employees" FromRole="Employees1" ToRole="Employees" />
+          <NavigationProperty Name="Orders" Relationship="NorthwindModel.FK_Orders_Employees" FromRole="Employees" ToRole="Orders" />
+          <NavigationProperty Name="Territories" Relationship="NorthwindModel.EmployeeTerritories" FromRole="Employees" ToRole="Territories" />
+        </EntityType>
+        <EntityType Name="Order_Detail">
+          <Key>
+            <PropertyRef Name="OrderID" />
+            <PropertyRef Name="ProductID" />
+          </Key>
+          <Property Name="OrderID" Type="Int32" Nullable="false" />
+          <Property Name="ProductID" Type="Int32" Nullable="false" />
+          <Property Name="UnitPrice" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
+          <Property Name="Quantity" Type="Int16" Nullable="false" />
+          <Property Name="Discount" Type="Single" Nullable="false" />
+          <NavigationProperty Name="Order" Relationship="NorthwindModel.FK_Order_Details_Orders" FromRole="Order_Details" ToRole="Orders" />
+          <NavigationProperty Name="Product" Relationship="NorthwindModel.FK_Order_Details_Products" FromRole="Order_Details" ToRole="Products" />
+        </EntityType>
+        <EntityType Name="Order">
+          <Key>
+            <PropertyRef Name="OrderID" />
+          </Key>
+          <Property Name="OrderID" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
+          <Property Name="CustomerID" Type="String" MaxLength="5" Unicode="true" FixedLength="true" />
+          <Property Name="EmployeeID" Type="Int32" />
+          <Property Name="OrderDate" Type="DateTime" />
+          <Property Name="RequiredDate" Type="DateTime" />
+          <Property Name="ShippedDate" Type="DateTime" />
+          <Property Name="ShipVia" Type="Int32" />
+          <Property Name="Freight" Type="Decimal" Precision="19" Scale="4" />
+          <Property Name="ShipName" Type="String" MaxLength="40" Unicode="true" FixedLength="false" />
+          <Property Name="ShipAddress" Type="String" MaxLength="60" Unicode="true" FixedLength="false" />
+          <Property Name="ShipCity" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="ShipRegion" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="ShipPostalCode" Type="String" MaxLength="10" Unicode="true" FixedLength="false" />
+          <Property Name="ShipCountry" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
+          <NavigationProperty Name="Customer" Relationship="NorthwindModel.FK_Orders_Customers" FromRole="Orders" ToRole="Customers" />
+          <NavigationProperty Name="Employee" Relationship="NorthwindModel.FK_Orders_Employees" FromRole="Orders" ToRole="Employees" />
+          <NavigationProperty Name="Order_Details" Relationship="NorthwindModel.FK_Order_Details_Orders" FromRole="Orders" ToRole="Order_Details" />
+          <NavigationProperty Name="Shipper" Relationship="NorthwindModel.FK_Orders_Shippers" FromRole="Orders" ToRole="Shippers" />
+        </EntityType>
+        <EntityType Name="Product">
+          <Key>
+            <PropertyRef Name="ProductID" />
+          </Key>
+          <Property Name="ProductID" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
+          <Property Name="ProductName" Type="String" Nullable="false" MaxLength="40" Unicode="true" FixedLength="false" />
+          <Property Name="SupplierID" Type="Int32" />
+          <Property Name="CategoryID" Type="Int32" />
+          <Property Name="QuantityPerUnit" Type="String" MaxLength="20" Unicode="true" FixedLength="false" />
+          <Property Name="UnitPrice" Type="Decimal" Precision="19" Scale="4" />
+          <Property Name="UnitsInStock" Type="Int16" />
+          <Property Name="UnitsOnOrder" Type="Int16" />
+          <Property Name="ReorderLevel" Type="Int16" />
+          <Property Name="Discontinued" Type="Boolean" Nullable="false" />
+          <NavigationProperty Name="Category" Relationship="NorthwindModel.FK_Products_Categories" FromRole="Products" ToRole="Categories" />
+          <NavigationProperty Name="Order_Details" Relationship="NorthwindModel.FK_Order_Details_Products" FromRole="Products" ToRole="Order_Details" />
+          <NavigationProperty Name="Supplier" Relationship="NorthwindModel.FK_Products_Suppliers" FromRole="Products" ToRole="Suppliers" />
+        </EntityType>
+        <EntityType Name="Region">
+          <Key>
+            <PropertyRef Name="RegionID" />
+          </Key>
+          <Property Name="RegionID" Type="Int32" Nullable="false" />
+          <Property Name="RegionDescription" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="true" />
+          <NavigationProperty Name="Territories" Relationship="NorthwindModel.FK_Territories_Region" FromRole="Region" ToRole="Territories" />
+        </EntityType>
+        <EntityType Name="Shipper">
+          <Key>
+            <PropertyRef Name="ShipperID" />
+          </Key>
+          <Property Name="ShipperID" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
+          <Property Name="CompanyName" Type="String" Nullable="false" MaxLength="40" Unicode="true" FixedLength="false" />
+          <Property Name="Phone" Type="String" MaxLength="24" Unicode="true" FixedLength="false" />
+          <NavigationProperty Name="Orders" Relationship="NorthwindModel.FK_Orders_Shippers" FromRole="Shippers" ToRole="Orders" />
+        </EntityType>
+        <EntityType Name="Supplier">
+          <Key>
+            <PropertyRef Name="SupplierID" />
+          </Key>
+          <Property Name="SupplierID" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
+          <Property Name="CompanyName" Type="String" Nullable="false" MaxLength="40" Unicode="true" FixedLength="false" />
+          <Property Name="ContactName" Type="String" MaxLength="30" Unicode="true" FixedLength="false" />
+          <Property Name="ContactTitle" Type="String" MaxLength="30" Unicode="true" FixedLength="false" />
+          <Property Name="Address" Type="String" MaxLength="60" Unicode="true" FixedLength="false" />
+          <Property Name="City" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="Region" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="PostalCode" Type="String" MaxLength="10" Unicode="true" FixedLength="false" />
+          <Property Name="Country" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="Phone" Type="String" MaxLength="24" Unicode="true" FixedLength="false" />
+          <Property Name="Fax" Type="String" MaxLength="24" Unicode="true" FixedLength="false" />
+          <Property Name="HomePage" Type="String" MaxLength="Max" Unicode="true" FixedLength="false" />
+          <NavigationProperty Name="Products" Relationship="NorthwindModel.FK_Products_Suppliers" FromRole="Suppliers" ToRole="Products" />
+        </EntityType>
+        <EntityType Name="sysdiagram">
+          <Key>
+            <PropertyRef Name="diagram_id" />
+          </Key>
+          <Property Name="name" Type="String" Nullable="false" MaxLength="128" Unicode="true" FixedLength="false" />
+          <Property Name="principal_id" Type="Int32" Nullable="false" />
+          <Property Name="diagram_id" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
+          <Property Name="version" Type="Int32" />
+          <Property Name="definition" Type="Binary" MaxLength="Max" FixedLength="false" />
+        </EntityType>
+        <EntityType Name="Territory">
+          <Key>
+            <PropertyRef Name="TerritoryID" />
+          </Key>
+          <Property Name="TerritoryID" Type="String" Nullable="false" MaxLength="20" Unicode="true" FixedLength="false" />
+          <Property Name="TerritoryDescription" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="true" />
+          <Property Name="RegionID" Type="Int32" Nullable="false" />
+          <NavigationProperty Name="Region" Relationship="NorthwindModel.FK_Territories_Region" FromRole="Territories" ToRole="Region" />
+          <NavigationProperty Name="Employees" Relationship="NorthwindModel.EmployeeTerritories" FromRole="Territories" ToRole="Employees" />
+        </EntityType>
+        <EntityType Name="Alphabetical_list_of_product">
+          <Key>
+            <PropertyRef Name="ProductID" />
+            <PropertyRef Name="ProductName" />
+            <PropertyRef Name="Discontinued" />
+            <PropertyRef Name="CategoryName" />
+          </Key>
+          <Property Name="ProductID" Type="Int32" Nullable="false" />
+          <Property Name="ProductName" Type="String" Nullable="false" MaxLength="40" Unicode="true" FixedLength="false" />
+          <Property Name="SupplierID" Type="Int32" />
+          <Property Name="CategoryID" Type="Int32" />
+          <Property Name="QuantityPerUnit" Type="String" MaxLength="20" Unicode="true" FixedLength="false" />
+          <Property Name="UnitPrice" Type="Decimal" Precision="19" Scale="4" />
+          <Property Name="UnitsInStock" Type="Int16" />
+          <Property Name="UnitsOnOrder" Type="Int16" />
+          <Property Name="ReorderLevel" Type="Int16" />
+          <Property Name="Discontinued" Type="Boolean" Nullable="false" />
+          <Property Name="CategoryName" Type="String" Nullable="false" MaxLength="15" Unicode="true" FixedLength="false" />
+        </EntityType>
+        <EntityType Name="Category_Sales_for_1997">
+          <Key>
+            <PropertyRef Name="CategoryName" />
+          </Key>
+          <Property Name="CategoryName" Type="String" Nullable="false" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="CategorySales" Type="Decimal" Precision="19" Scale="4" />
+        </EntityType>
+        <EntityType Name="Current_Product_List">
+          <Key>
+            <PropertyRef Name="ProductID" />
+            <PropertyRef Name="ProductName" />
+          </Key>
+          <Property Name="ProductID" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
+          <Property Name="ProductName" Type="String" Nullable="false" MaxLength="40" Unicode="true" FixedLength="false" />
+        </EntityType>
+        <EntityType Name="Customer_and_Suppliers_by_City">
+          <Key>
+            <PropertyRef Name="CompanyName" />
+            <PropertyRef Name="Relationship" />
+          </Key>
+          <Property Name="City" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="CompanyName" Type="String" Nullable="false" MaxLength="40" Unicode="true" FixedLength="false" />
+          <Property Name="ContactName" Type="String" MaxLength="30" Unicode="true" FixedLength="false" />
+          <Property Name="Relationship" Type="String" Nullable="false" MaxLength="9" Unicode="false" FixedLength="false" />
+        </EntityType>
+        <EntityType Name="Invoice">
+          <Key>
+            <PropertyRef Name="CustomerName" />
+            <PropertyRef Name="Salesperson" />
+            <PropertyRef Name="OrderID" />
+            <PropertyRef Name="ShipperName" />
+            <PropertyRef Name="ProductID" />
+            <PropertyRef Name="ProductName" />
+            <PropertyRef Name="UnitPrice" />
+            <PropertyRef Name="Quantity" />
+            <PropertyRef Name="Discount" />
+          </Key>
+          <Property Name="ShipName" Type="String" MaxLength="40" Unicode="true" FixedLength="false" />
+          <Property Name="ShipAddress" Type="String" MaxLength="60" Unicode="true" FixedLength="false" />
+          <Property Name="ShipCity" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="ShipRegion" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="ShipPostalCode" Type="String" MaxLength="10" Unicode="true" FixedLength="false" />
+          <Property Name="ShipCountry" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="CustomerID" Type="String" MaxLength="5" Unicode="true" FixedLength="true" />
+          <Property Name="CustomerName" Type="String" Nullable="false" MaxLength="40" Unicode="true" FixedLength="false" />
+          <Property Name="Address" Type="String" MaxLength="60" Unicode="true" FixedLength="false" />
+          <Property Name="City" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="Region" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="PostalCode" Type="String" MaxLength="10" Unicode="true" FixedLength="false" />
+          <Property Name="Country" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="Salesperson" Type="String" Nullable="false" MaxLength="31" Unicode="true" FixedLength="false" />
+          <Property Name="OrderID" Type="Int32" Nullable="false" />
+          <Property Name="OrderDate" Type="DateTime" />
+          <Property Name="RequiredDate" Type="DateTime" />
+          <Property Name="ShippedDate" Type="DateTime" />
+          <Property Name="ShipperName" Type="String" Nullable="false" MaxLength="40" Unicode="true" FixedLength="false" />
+          <Property Name="ProductID" Type="Int32" Nullable="false" />
+          <Property Name="ProductName" Type="String" Nullable="false" MaxLength="40" Unicode="true" FixedLength="false" />
+          <Property Name="UnitPrice" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
+          <Property Name="Quantity" Type="Int16" Nullable="false" />
+          <Property Name="Discount" Type="Single" Nullable="false" />
+          <Property Name="ExtendedPrice" Type="Decimal" Precision="19" Scale="4" />
+          <Property Name="Freight" Type="Decimal" Precision="19" Scale="4" />
+        </EntityType>
+        <EntityType Name="Order_Details_Extended">
+          <Key>
+            <PropertyRef Name="OrderID" />
+            <PropertyRef Name="ProductID" />
+            <PropertyRef Name="ProductName" />
+            <PropertyRef Name="UnitPrice" />
+            <PropertyRef Name="Quantity" />
+            <PropertyRef Name="Discount" />
+          </Key>
+          <Property Name="OrderID" Type="Int32" Nullable="false" />
+          <Property Name="ProductID" Type="Int32" Nullable="false" />
+          <Property Name="ProductName" Type="String" Nullable="false" MaxLength="40" Unicode="true" FixedLength="false" />
+          <Property Name="UnitPrice" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
+          <Property Name="Quantity" Type="Int16" Nullable="false" />
+          <Property Name="Discount" Type="Single" Nullable="false" />
+          <Property Name="ExtendedPrice" Type="Decimal" Precision="19" Scale="4" />
+        </EntityType>
+        <EntityType Name="Order_Subtotal">
+          <Key>
+            <PropertyRef Name="OrderID" />
+          </Key>
+          <Property Name="OrderID" Type="Int32" Nullable="false" />
+          <Property Name="Subtotal" Type="Decimal" Precision="19" Scale="4" />
+        </EntityType>
+        <EntityType Name="Orders_Qry">
+          <Key>
+            <PropertyRef Name="OrderID" />
+            <PropertyRef Name="CompanyName" />
+          </Key>
+          <Property Name="OrderID" Type="Int32" Nullable="false" />
+          <Property Name="CustomerID" Type="String" MaxLength="5" Unicode="true" FixedLength="true" />
+          <Property Name="EmployeeID" Type="Int32" />
+          <Property Name="OrderDate" Type="DateTime" />
+          <Property Name="RequiredDate" Type="DateTime" />
+          <Property Name="ShippedDate" Type="DateTime" />
+          <Property Name="ShipVia" Type="Int32" />
+          <Property Name="Freight" Type="Decimal" Precision="19" Scale="4" />
+          <Property Name="ShipName" Type="String" MaxLength="40" Unicode="true" FixedLength="false" />
+          <Property Name="ShipAddress" Type="String" MaxLength="60" Unicode="true" FixedLength="false" />
+          <Property Name="ShipCity" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="ShipRegion" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="ShipPostalCode" Type="String" MaxLength="10" Unicode="true" FixedLength="false" />
+          <Property Name="ShipCountry" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="CompanyName" Type="String" Nullable="false" MaxLength="40" Unicode="true" FixedLength="false" />
+          <Property Name="Address" Type="String" MaxLength="60" Unicode="true" FixedLength="false" />
+          <Property Name="City" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="Region" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="PostalCode" Type="String" MaxLength="10" Unicode="true" FixedLength="false" />
+          <Property Name="Country" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
+        </EntityType>
+        <EntityType Name="Product_Sales_for_1997">
+          <Key>
+            <PropertyRef Name="CategoryName" />
+            <PropertyRef Name="ProductName" />
+          </Key>
+          <Property Name="CategoryName" Type="String" Nullable="false" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="ProductName" Type="String" Nullable="false" MaxLength="40" Unicode="true" FixedLength="false" />
+          <Property Name="ProductSales" Type="Decimal" Precision="19" Scale="4" />
+        </EntityType>
+        <EntityType Name="Products_Above_Average_Price">
+          <Key>
+            <PropertyRef Name="ProductName" />
+          </Key>
+          <Property Name="ProductName" Type="String" Nullable="false" MaxLength="40" Unicode="true" FixedLength="false" />
+          <Property Name="UnitPrice" Type="Decimal" Precision="19" Scale="4" />
+        </EntityType>
+        <EntityType Name="Products_by_Category">
+          <Key>
+            <PropertyRef Name="CategoryName" />
+            <PropertyRef Name="ProductName" />
+            <PropertyRef Name="Discontinued" />
+          </Key>
+          <Property Name="CategoryName" Type="String" Nullable="false" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="ProductName" Type="String" Nullable="false" MaxLength="40" Unicode="true" FixedLength="false" />
+          <Property Name="QuantityPerUnit" Type="String" MaxLength="20" Unicode="true" FixedLength="false" />
+          <Property Name="UnitsInStock" Type="Int16" />
+          <Property Name="Discontinued" Type="Boolean" Nullable="false" />
+        </EntityType>
+        <EntityType Name="Sales_by_Category">
+          <Key>
+            <PropertyRef Name="CategoryID" />
+            <PropertyRef Name="CategoryName" />
+            <PropertyRef Name="ProductName" />
+          </Key>
+          <Property Name="CategoryID" Type="Int32" Nullable="false" />
+          <Property Name="CategoryName" Type="String" Nullable="false" MaxLength="15" Unicode="true" FixedLength="false" />
+          <Property Name="ProductName" Type="String" Nullable="false" MaxLength="40" Unicode="true" FixedLength="false" />
+          <Property Name="ProductSales" Type="Decimal" Precision="19" Scale="4" />
+        </EntityType>
+        <EntityType Name="Sales_Totals_by_Amount">
+          <Key>
+            <PropertyRef Name="OrderID" />
+            <PropertyRef Name="CompanyName" />
+          </Key>
+          <Property Name="SaleAmount" Type="Decimal" Precision="19" Scale="4" />
+          <Property Name="OrderID" Type="Int32" Nullable="false" />
+          <Property Name="CompanyName" Type="String" Nullable="false" MaxLength="40" Unicode="true" FixedLength="false" />
+          <Property Name="ShippedDate" Type="DateTime" />
+        </EntityType>
+        <EntityType Name="Summary_of_Sales_by_Quarter">
+          <Key>
+            <PropertyRef Name="OrderID" />
+          </Key>
+          <Property Name="ShippedDate" Type="DateTime" />
+          <Property Name="OrderID" Type="Int32" Nullable="false" />
+          <Property Name="Subtotal" Type="Decimal" Precision="19" Scale="4" />
+        </EntityType>
+        <EntityType Name="Summary_of_Sales_by_Year">
+          <Key>
+            <PropertyRef Name="OrderID" />
+          </Key>
+          <Property Name="ShippedDate" Type="DateTime" />
+          <Property Name="OrderID" Type="Int32" Nullable="false" />
+          <Property Name="Subtotal" Type="Decimal" Precision="19" Scale="4" />
+        </EntityType>
+        <Association Name="FK_Products_Categories">
+          <End Role="Categories" Type="NorthwindModel.Category" Multiplicity="0..1" />
+          <End Role="Products" Type="NorthwindModel.Product" Multiplicity="*" />
+          <ReferentialConstraint>
+            <Principal Role="Categories">
+              <PropertyRef Name="CategoryID" />
+            </Principal>
+            <Dependent Role="Products">
+              <PropertyRef Name="CategoryID" />
+            </Dependent>
+          </ReferentialConstraint>
+        </Association>
+        <Association Name="FK_Orders_Customers">
+          <End Role="Customers" Type="NorthwindModel.Customer" Multiplicity="0..1" />
+          <End Role="Orders" Type="NorthwindModel.Order" Multiplicity="*" />
+          <ReferentialConstraint>
+            <Principal Role="Customers">
+              <PropertyRef Name="CustomerID" />
+            </Principal>
+            <Dependent Role="Orders">
+              <PropertyRef Name="CustomerID" />
+            </Dependent>
+          </ReferentialConstraint>
+        </Association>
+        <Association Name="FK_Employees_Employees">
+          <End Role="Employees" Type="NorthwindModel.Employee" Multiplicity="0..1" />
+          <End Role="Employees1" Type="NorthwindModel.Employee" Multiplicity="*" />
+          <ReferentialConstraint>
+            <Principal Role="Employees">
+              <PropertyRef Name="EmployeeID" />
+            </Principal>
+            <Dependent Role="Employees1">
+              <PropertyRef Name="ReportsTo" />
+            </Dependent>
+          </ReferentialConstraint>
+        </Association>
+        <Association Name="FK_Orders_Employees">
+          <End Role="Employees" Type="NorthwindModel.Employee" Multiplicity="0..1" />
+          <End Role="Orders" Type="NorthwindModel.Order" Multiplicity="*" />
+          <ReferentialConstraint>
+            <Principal Role="Employees">
+              <PropertyRef Name="EmployeeID" />
+            </Principal>
+            <Dependent Role="Orders">
+              <PropertyRef Name="EmployeeID" />
+            </Dependent>
+          </ReferentialConstraint>
+        </Association>
+        <Association Name="FK_Order_Details_Orders">
+          <End Role="Orders" Type="NorthwindModel.Order" Multiplicity="1" />
+          <End Role="Order_Details" Type="NorthwindModel.Order_Detail" Multiplicity="*" />
+          <ReferentialConstraint>
+            <Principal Role="Orders">
+              <PropertyRef Name="OrderID" />
+            </Principal>
+            <Dependent Role="Order_Details">
+              <PropertyRef Name="OrderID" />
+            </Dependent>
+          </ReferentialConstraint>
+        </Association>
+        <Association Name="FK_Order_Details_Products">
+          <End Role="Products" Type="NorthwindModel.Product" Multiplicity="1" />
+          <End Role="Order_Details" Type="NorthwindModel.Order_Detail" Multiplicity="*" />
+          <ReferentialConstraint>
+            <Principal Role="Products">
+              <PropertyRef Name="ProductID" />
+            </Principal>
+            <Dependent Role="Order_Details">
+              <PropertyRef Name="ProductID" />
+            </Dependent>
+          </ReferentialConstraint>
+        </Association>
+        <Association Name="FK_Orders_Shippers">
+          <End Role="Shippers" Type="NorthwindModel.Shipper" Multiplicity="0..1" />
+          <End Role="Orders" Type="NorthwindModel.Order" Multiplicity="*" />
+          <ReferentialConstraint>
+            <Principal Role="Shippers">
+              <PropertyRef Name="ShipperID" />
+            </Principal>
+            <Dependent Role="Orders">
+              <PropertyRef Name="ShipVia" />
+            </Dependent>
+          </ReferentialConstraint>
+        </Association>
+        <Association Name="FK_Products_Suppliers">
+          <End Role="Suppliers" Type="NorthwindModel.Supplier" Multiplicity="0..1" />
+          <End Role="Products" Type="NorthwindModel.Product" Multiplicity="*" />
+          <ReferentialConstraint>
+            <Principal Role="Suppliers">
+              <PropertyRef Name="SupplierID" />
+            </Principal>
+            <Dependent Role="Products">
+              <PropertyRef Name="SupplierID" />
+            </Dependent>
+          </ReferentialConstraint>
+        </Association>
+        <Association Name="FK_Territories_Region">
+          <End Role="Region" Type="NorthwindModel.Region" Multiplicity="1" />
+          <End Role="Territories" Type="NorthwindModel.Territory" Multiplicity="*" />
+          <ReferentialConstraint>
+            <Principal Role="Region">
+              <PropertyRef Name="RegionID" />
+            </Principal>
+            <Dependent Role="Territories">
+              <PropertyRef Name="RegionID" />
+            </Dependent>
+          </ReferentialConstraint>
+        </Association>
+        <Association Name="CustomerCustomerDemo">
+          <End Role="CustomerDemographics" Type="NorthwindModel.CustomerDemographic" Multiplicity="*" />
+          <End Role="Customers" Type="NorthwindModel.Customer" Multiplicity="*" />
+        </Association>
+        <Association Name="EmployeeTerritories">
+          <End Role="Employees" Type="NorthwindModel.Employee" Multiplicity="*" />
+          <End Role="Territories" Type="NorthwindModel.Territory" Multiplicity="*" />
+        </Association>
+      </Schema>
+    </edmx:ConceptualModels>
+    <!-- C-S mapping content -->
+    <edmx:Mappings>
+      <Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2008/09/mapping/cs">
+        <EntityContainerMapping StorageEntityContainer="NorthwindModelStoreContainer" CdmEntityContainer="NorthwindEntities">
+          <EntitySetMapping Name="Categories"><EntityTypeMapping TypeName="NorthwindModel.Category"><MappingFragment StoreEntitySet="Categories">
+            <ScalarProperty Name="CategoryID" ColumnName="CategoryID" />
+            <ScalarProperty Name="CategoryName" ColumnName="CategoryName" />
+            <ScalarProperty Name="Description" ColumnName="Description" />
+            <ScalarProperty Name="Picture" ColumnName="Picture" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <EntitySetMapping Name="CustomerDemographics"><EntityTypeMapping TypeName="NorthwindModel.CustomerDemographic"><MappingFragment StoreEntitySet="CustomerDemographics">
+            <ScalarProperty Name="CustomerTypeID" ColumnName="CustomerTypeID" />
+            <ScalarProperty Name="CustomerDesc" ColumnName="CustomerDesc" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <EntitySetMapping Name="Customers"><EntityTypeMapping TypeName="NorthwindModel.Customer"><MappingFragment StoreEntitySet="Customers">
+            <ScalarProperty Name="CustomerID" ColumnName="CustomerID" />
+            <ScalarProperty Name="CompanyName" ColumnName="CompanyName" />
+            <ScalarProperty Name="ContactName" ColumnName="ContactName" />
+            <ScalarProperty Name="ContactTitle" ColumnName="ContactTitle" />
+            <ScalarProperty Name="Address" ColumnName="Address" />
+            <ScalarProperty Name="City" ColumnName="City" />
+            <ScalarProperty Name="Region" ColumnName="Region" />
+            <ScalarProperty Name="PostalCode" ColumnName="PostalCode" />
+            <ScalarProperty Name="Country" ColumnName="Country" />
+            <ScalarProperty Name="Phone" ColumnName="Phone" />
+            <ScalarProperty Name="Fax" ColumnName="Fax" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <EntitySetMapping Name="Employees"><EntityTypeMapping TypeName="NorthwindModel.Employee"><MappingFragment StoreEntitySet="Employees">
+            <ScalarProperty Name="EmployeeID" ColumnName="EmployeeID" />
+            <ScalarProperty Name="LastName" ColumnName="LastName" />
+            <ScalarProperty Name="FirstName" ColumnName="FirstName" />
+            <ScalarProperty Name="Title" ColumnName="Title" />
+            <ScalarProperty Name="TitleOfCourtesy" ColumnName="TitleOfCourtesy" />
+            <ScalarProperty Name="BirthDate" ColumnName="BirthDate" />
+            <ScalarProperty Name="HireDate" ColumnName="HireDate" />
+            <ScalarProperty Name="Address" ColumnName="Address" />
+            <ScalarProperty Name="City" ColumnName="City" />
+            <ScalarProperty Name="Region" ColumnName="Region" />
+            <ScalarProperty Name="PostalCode" ColumnName="PostalCode" />
+            <ScalarProperty Name="Country" ColumnName="Country" />
+            <ScalarProperty Name="HomePhone" ColumnName="HomePhone" />
+            <ScalarProperty Name="Extension" ColumnName="Extension" />
+            <ScalarProperty Name="Photo" ColumnName="Photo" />
+            <ScalarProperty Name="Notes" ColumnName="Notes" />
+            <ScalarProperty Name="ReportsTo" ColumnName="ReportsTo" />
+            <ScalarProperty Name="PhotoPath" ColumnName="PhotoPath" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <EntitySetMapping Name="Order_Details"><EntityTypeMapping TypeName="NorthwindModel.Order_Detail"><MappingFragment StoreEntitySet="Order Details">
+            <ScalarProperty Name="OrderID" ColumnName="OrderID" />
+            <ScalarProperty Name="ProductID" ColumnName="ProductID" />
+            <ScalarProperty Name="UnitPrice" ColumnName="UnitPrice" />
+            <ScalarProperty Name="Quantity" ColumnName="Quantity" />
+            <ScalarProperty Name="Discount" ColumnName="Discount" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <EntitySetMapping Name="Orders"><EntityTypeMapping TypeName="NorthwindModel.Order"><MappingFragment StoreEntitySet="Orders">
+            <ScalarProperty Name="OrderID" ColumnName="OrderID" />
+            <ScalarProperty Name="CustomerID" ColumnName="CustomerID" />
+            <ScalarProperty Name="EmployeeID" ColumnName="EmployeeID" />
+            <ScalarProperty Name="OrderDate" ColumnName="OrderDate" />
+            <ScalarProperty Name="RequiredDate" ColumnName="RequiredDate" />
+            <ScalarProperty Name="ShippedDate" ColumnName="ShippedDate" />
+            <ScalarProperty Name="ShipVia" ColumnName="ShipVia" />
+            <ScalarProperty Name="Freight" ColumnName="Freight" />
+            <ScalarProperty Name="ShipName" ColumnName="ShipName" />
+            <ScalarProperty Name="ShipAddress" ColumnName="ShipAddress" />
+            <ScalarProperty Name="ShipCity" ColumnName="ShipCity" />
+            <ScalarProperty Name="ShipRegion" ColumnName="ShipRegion" />
+            <ScalarProperty Name="ShipPostalCode" ColumnName="ShipPostalCode" />
+            <ScalarProperty Name="ShipCountry" ColumnName="ShipCountry" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <EntitySetMapping Name="Products"><EntityTypeMapping TypeName="NorthwindModel.Product"><MappingFragment StoreEntitySet="Products">
+            <ScalarProperty Name="ProductID" ColumnName="ProductID" />
+            <ScalarProperty Name="ProductName" ColumnName="ProductName" />
+            <ScalarProperty Name="SupplierID" ColumnName="SupplierID" />
+            <ScalarProperty Name="CategoryID" ColumnName="CategoryID" />
+            <ScalarProperty Name="QuantityPerUnit" ColumnName="QuantityPerUnit" />
+            <ScalarProperty Name="UnitPrice" ColumnName="UnitPrice" />
+            <ScalarProperty Name="UnitsInStock" ColumnName="UnitsInStock" />
+            <ScalarProperty Name="UnitsOnOrder" ColumnName="UnitsOnOrder" />
+            <ScalarProperty Name="ReorderLevel" ColumnName="ReorderLevel" />
+            <ScalarProperty Name="Discontinued" ColumnName="Discontinued" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <EntitySetMapping Name="Regions"><EntityTypeMapping TypeName="NorthwindModel.Region"><MappingFragment StoreEntitySet="Region">
+            <ScalarProperty Name="RegionID" ColumnName="RegionID" />
+            <ScalarProperty Name="RegionDescription" ColumnName="RegionDescription" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <EntitySetMapping Name="Shippers"><EntityTypeMapping TypeName="NorthwindModel.Shipper"><MappingFragment StoreEntitySet="Shippers">
+            <ScalarProperty Name="ShipperID" ColumnName="ShipperID" />
+            <ScalarProperty Name="CompanyName" ColumnName="CompanyName" />
+            <ScalarProperty Name="Phone" ColumnName="Phone" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <EntitySetMapping Name="Suppliers"><EntityTypeMapping TypeName="NorthwindModel.Supplier"><MappingFragment StoreEntitySet="Suppliers">
+            <ScalarProperty Name="SupplierID" ColumnName="SupplierID" />
+            <ScalarProperty Name="CompanyName" ColumnName="CompanyName" />
+            <ScalarProperty Name="ContactName" ColumnName="ContactName" />
+            <ScalarProperty Name="ContactTitle" ColumnName="ContactTitle" />
+            <ScalarProperty Name="Address" ColumnName="Address" />
+            <ScalarProperty Name="City" ColumnName="City" />
+            <ScalarProperty Name="Region" ColumnName="Region" />
+            <ScalarProperty Name="PostalCode" ColumnName="PostalCode" />
+            <ScalarProperty Name="Country" ColumnName="Country" />
+            <ScalarProperty Name="Phone" ColumnName="Phone" />
+            <ScalarProperty Name="Fax" ColumnName="Fax" />
+            <ScalarProperty Name="HomePage" ColumnName="HomePage" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <EntitySetMapping Name="sysdiagrams"><EntityTypeMapping TypeName="NorthwindModel.sysdiagram"><MappingFragment StoreEntitySet="sysdiagrams">
+            <ScalarProperty Name="name" ColumnName="name" />
+            <ScalarProperty Name="principal_id" ColumnName="principal_id" />
+            <ScalarProperty Name="diagram_id" ColumnName="diagram_id" />
+            <ScalarProperty Name="version" ColumnName="version" />
+            <ScalarProperty Name="definition" ColumnName="definition" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <EntitySetMapping Name="Territories"><EntityTypeMapping TypeName="NorthwindModel.Territory"><MappingFragment StoreEntitySet="Territories">
+            <ScalarProperty Name="TerritoryID" ColumnName="TerritoryID" />
+            <ScalarProperty Name="TerritoryDescription" ColumnName="TerritoryDescription" />
+            <ScalarProperty Name="RegionID" ColumnName="RegionID" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <EntitySetMapping Name="Alphabetical_list_of_products"><EntityTypeMapping TypeName="NorthwindModel.Alphabetical_list_of_product"><MappingFragment StoreEntitySet="Alphabetical list of products">
+            <ScalarProperty Name="ProductID" ColumnName="ProductID" />
+            <ScalarProperty Name="ProductName" ColumnName="ProductName" />
+            <ScalarProperty Name="SupplierID" ColumnName="SupplierID" />
+            <ScalarProperty Name="CategoryID" ColumnName="CategoryID" />
+            <ScalarProperty Name="QuantityPerUnit" ColumnName="QuantityPerUnit" />
+            <ScalarProperty Name="UnitPrice" ColumnName="UnitPrice" />
+            <ScalarProperty Name="UnitsInStock" ColumnName="UnitsInStock" />
+            <ScalarProperty Name="UnitsOnOrder" ColumnName="UnitsOnOrder" />
+            <ScalarProperty Name="ReorderLevel" ColumnName="ReorderLevel" />
+            <ScalarProperty Name="Discontinued" ColumnName="Discontinued" />
+            <ScalarProperty Name="CategoryName" ColumnName="CategoryName" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <EntitySetMapping Name="Category_Sales_for_1997"><EntityTypeMapping TypeName="NorthwindModel.Category_Sales_for_1997"><MappingFragment StoreEntitySet="Category Sales for 1997">
+            <ScalarProperty Name="CategoryName" ColumnName="CategoryName" />
+            <ScalarProperty Name="CategorySales" ColumnName="CategorySales" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <EntitySetMapping Name="Current_Product_Lists"><EntityTypeMapping TypeName="NorthwindModel.Current_Product_List"><MappingFragment StoreEntitySet="Current Product List">
+            <ScalarProperty Name="ProductID" ColumnName="ProductID" />
+            <ScalarProperty Name="ProductName" ColumnName="ProductName" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <EntitySetMapping Name="Customer_and_Suppliers_by_Cities"><EntityTypeMapping TypeName="NorthwindModel.Customer_and_Suppliers_by_City"><MappingFragment StoreEntitySet="Customer and Suppliers by City">
+            <ScalarProperty Name="City" ColumnName="City" />
+            <ScalarProperty Name="CompanyName" ColumnName="CompanyName" />
+            <ScalarProperty Name="ContactName" ColumnName="ContactName" />
+            <ScalarProperty Name="Relationship" ColumnName="Relationship" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <EntitySetMapping Name="Invoices"><EntityTypeMapping TypeName="NorthwindModel.Invoice"><MappingFragment StoreEntitySet="Invoices">
+            <ScalarProperty Name="ShipName" ColumnName="ShipName" />
+            <ScalarProperty Name="ShipAddress" ColumnName="ShipAddress" />
+            <ScalarProperty Name="ShipCity" ColumnName="ShipCity" />
+            <ScalarProperty Name="ShipRegion" ColumnName="ShipRegion" />
+            <ScalarProperty Name="ShipPostalCode" ColumnName="ShipPostalCode" />
+            <ScalarProperty Name="ShipCountry" ColumnName="ShipCountry" />
+            <ScalarProperty Name="CustomerID" ColumnName="CustomerID" />
+            <ScalarProperty Name="CustomerName" ColumnName="CustomerName" />
+            <ScalarProperty Name="Address" ColumnName="Address" />
+            <ScalarProperty Name="City" ColumnName="City" />
+            <ScalarProperty Name="Region" ColumnName="Region" />
+            <ScalarProperty Name="PostalCode" ColumnName="PostalCode" />
+            <ScalarProperty Name="Country" ColumnName="Country" />
+            <ScalarProperty Name="Salesperson" ColumnName="Salesperson" />
+            <ScalarProperty Name="OrderID" ColumnName="OrderID" />
+            <ScalarProperty Name="OrderDate" ColumnName="OrderDate" />
+            <ScalarProperty Name="RequiredDate" ColumnName="RequiredDate" />
+            <ScalarProperty Name="ShippedDate" ColumnName="ShippedDate" />
+            <ScalarProperty Name="ShipperName" ColumnName="ShipperName" />
+            <ScalarProperty Name="ProductID" ColumnName="ProductID" />
+            <ScalarProperty Name="ProductName" ColumnName="ProductName" />
+            <ScalarProperty Name="UnitPrice" ColumnName="UnitPrice" />
+            <ScalarProperty Name="Quantity" ColumnName="Quantity" />
+            <ScalarProperty Name="Discount" ColumnName="Discount" />
+            <ScalarProperty Name="ExtendedPrice" ColumnName="ExtendedPrice" />
+            <ScalarProperty Name="Freight" ColumnName="Freight" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <EntitySetMapping Name="Order_Details_Extendeds"><EntityTypeMapping TypeName="NorthwindModel.Order_Details_Extended"><MappingFragment StoreEntitySet="Order Details Extended">
+            <ScalarProperty Name="OrderID" ColumnName="OrderID" />
+            <ScalarProperty Name="ProductID" ColumnName="ProductID" />
+            <ScalarProperty Name="ProductName" ColumnName="ProductName" />
+            <ScalarProperty Name="UnitPrice" ColumnName="UnitPrice" />
+            <ScalarProperty Name="Quantity" ColumnName="Quantity" />
+            <ScalarProperty Name="Discount" ColumnName="Discount" />
+            <ScalarProperty Name="ExtendedPrice" ColumnName="ExtendedPrice" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <EntitySetMapping Name="Order_Subtotals"><EntityTypeMapping TypeName="NorthwindModel.Order_Subtotal"><MappingFragment StoreEntitySet="Order Subtotals">
+            <ScalarProperty Name="OrderID" ColumnName="OrderID" />
+            <ScalarProperty Name="Subtotal" ColumnName="Subtotal" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <EntitySetMapping Name="Orders_Qries"><EntityTypeMapping TypeName="NorthwindModel.Orders_Qry"><MappingFragment StoreEntitySet="Orders Qry">
+            <ScalarProperty Name="OrderID" ColumnName="OrderID" />
+            <ScalarProperty Name="CustomerID" ColumnName="CustomerID" />
+            <ScalarProperty Name="EmployeeID" ColumnName="EmployeeID" />
+            <ScalarProperty Name="OrderDate" ColumnName="OrderDate" />
+            <ScalarProperty Name="RequiredDate" ColumnName="RequiredDate" />
+            <ScalarProperty Name="ShippedDate" ColumnName="ShippedDate" />
+            <ScalarProperty Name="ShipVia" ColumnName="ShipVia" />
+            <ScalarProperty Name="Freight" ColumnName="Freight" />
+            <ScalarProperty Name="ShipName" ColumnName="ShipName" />
+            <ScalarProperty Name="ShipAddress" ColumnName="ShipAddress" />
+            <ScalarProperty Name="ShipCity" ColumnName="ShipCity" />
+            <ScalarProperty Name="ShipRegion" ColumnName="ShipRegion" />
+            <ScalarProperty Name="ShipPostalCode" ColumnName="ShipPostalCode" />
+            <ScalarProperty Name="ShipCountry" ColumnName="ShipCountry" />
+            <ScalarProperty Name="CompanyName" ColumnName="CompanyName" />
+            <ScalarProperty Name="Address" ColumnName="Address" />
+            <ScalarProperty Name="City" ColumnName="City" />
+            <ScalarProperty Name="Region" ColumnName="Region" />
+            <ScalarProperty Name="PostalCode" ColumnName="PostalCode" />
+            <ScalarProperty Name="Country" ColumnName="Country" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <EntitySetMapping Name="Product_Sales_for_1997"><EntityTypeMapping TypeName="NorthwindModel.Product_Sales_for_1997"><MappingFragment StoreEntitySet="Product Sales for 1997">
+            <ScalarProperty Name="CategoryName" ColumnName="CategoryName" />
+            <ScalarProperty Name="ProductName" ColumnName="ProductName" />
+            <ScalarProperty Name="ProductSales" ColumnName="ProductSales" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <EntitySetMapping Name="Products_Above_Average_Prices"><EntityTypeMapping TypeName="NorthwindModel.Products_Above_Average_Price"><MappingFragment StoreEntitySet="Products Above Average Price">
+            <ScalarProperty Name="ProductName" ColumnName="ProductName" />
+            <ScalarProperty Name="UnitPrice" ColumnName="UnitPrice" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <EntitySetMapping Name="Products_by_Categories"><EntityTypeMapping TypeName="NorthwindModel.Products_by_Category"><MappingFragment StoreEntitySet="Products by Category">
+            <ScalarProperty Name="CategoryName" ColumnName="CategoryName" />
+            <ScalarProperty Name="ProductName" ColumnName="ProductName" />
+            <ScalarProperty Name="QuantityPerUnit" ColumnName="QuantityPerUnit" />
+            <ScalarProperty Name="UnitsInStock" ColumnName="UnitsInStock" />
+            <ScalarProperty Name="Discontinued" ColumnName="Discontinued" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <EntitySetMapping Name="Sales_by_Categories"><EntityTypeMapping TypeName="NorthwindModel.Sales_by_Category"><MappingFragment StoreEntitySet="Sales by Category">
+            <ScalarProperty Name="CategoryID" ColumnName="CategoryID" />
+            <ScalarProperty Name="CategoryName" ColumnName="CategoryName" />
+            <ScalarProperty Name="ProductName" ColumnName="ProductName" />
+            <ScalarProperty Name="ProductSales" ColumnName="ProductSales" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <EntitySetMapping Name="Sales_Totals_by_Amounts"><EntityTypeMapping TypeName="NorthwindModel.Sales_Totals_by_Amount"><MappingFragment StoreEntitySet="Sales Totals by Amount">
+            <ScalarProperty Name="SaleAmount" ColumnName="SaleAmount" />
+            <ScalarProperty Name="OrderID" ColumnName="OrderID" />
+            <ScalarProperty Name="CompanyName" ColumnName="CompanyName" />
+            <ScalarProperty Name="ShippedDate" ColumnName="ShippedDate" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <EntitySetMapping Name="Summary_of_Sales_by_Quarters"><EntityTypeMapping TypeName="NorthwindModel.Summary_of_Sales_by_Quarter"><MappingFragment StoreEntitySet="Summary of Sales by Quarter">
+            <ScalarProperty Name="ShippedDate" ColumnName="ShippedDate" />
+            <ScalarProperty Name="OrderID" ColumnName="OrderID" />
+            <ScalarProperty Name="Subtotal" ColumnName="Subtotal" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <EntitySetMapping Name="Summary_of_Sales_by_Years"><EntityTypeMapping TypeName="NorthwindModel.Summary_of_Sales_by_Year"><MappingFragment StoreEntitySet="Summary of Sales by Year">
+            <ScalarProperty Name="ShippedDate" ColumnName="ShippedDate" />
+            <ScalarProperty Name="OrderID" ColumnName="OrderID" />
+            <ScalarProperty Name="Subtotal" ColumnName="Subtotal" />
+          </MappingFragment></EntityTypeMapping></EntitySetMapping>
+          <AssociationSetMapping Name="CustomerCustomerDemo" TypeName="NorthwindModel.CustomerCustomerDemo" StoreEntitySet="CustomerCustomerDemo">
+            <EndProperty Name="CustomerDemographics">
+              <ScalarProperty Name="CustomerTypeID" ColumnName="CustomerTypeID" />
+            </EndProperty>
+            <EndProperty Name="Customers">
+              <ScalarProperty Name="CustomerID" ColumnName="CustomerID" />
+            </EndProperty>
+          </AssociationSetMapping>
+          <AssociationSetMapping Name="EmployeeTerritories" TypeName="NorthwindModel.EmployeeTerritories" StoreEntitySet="EmployeeTerritories">
+            <EndProperty Name="Employees">
+              <ScalarProperty Name="EmployeeID" ColumnName="EmployeeID" />
+            </EndProperty>
+            <EndProperty Name="Territories">
+              <ScalarProperty Name="TerritoryID" ColumnName="TerritoryID" />
+            </EndProperty>
+          </AssociationSetMapping>
+        </EntityContainerMapping>
+      </Mapping>
+    </edmx:Mappings>
+  </edmx:Runtime>
+  <!-- EF Designer content (DO NOT EDIT MANUALLY BELOW HERE) -->
+  <Designer xmlns="http://schemas.microsoft.com/ado/2008/10/edmx">
+    <Connection>
+      <DesignerInfoPropertySet>
+        <DesignerProperty Name="MetadataArtifactProcessing" Value="EmbedInOutputAssembly" />
+      </DesignerInfoPropertySet>
+    </Connection>
+    <Options>
+      <DesignerInfoPropertySet>
+        <DesignerProperty Name="ValidateOnBuild" Value="true" />
+        <DesignerProperty Name="EnablePluralization" Value="True" />
+        <DesignerProperty Name="IncludeForeignKeysInModel" Value="True" />
+      </DesignerInfoPropertySet>
+    </Options>
+    <!-- Diagram content (shape and connector positions) -->
+    <Diagrams>
+      <Diagram Name="NorthwindModel">
+        <EntityTypeShape EntityType="NorthwindModel.Category" Width="1.5" PointX="8.125" PointY="14.75" Height="1.9802864583333317" IsExpanded="true" />
+        <EntityTypeShape EntityType="NorthwindModel.CustomerDemographic" Width="1.5" PointX="0.75" PointY="2.5" Height="1.5956835937499996" IsExpanded="true" />
+        <EntityTypeShape EntityType="NorthwindModel.Customer" Width="1.5" PointX="3" PointY="1.5" Height="3.5186979166666656" IsExpanded="true" />
+        <EntityTypeShape EntityType="NorthwindModel.Employee" Width="1.5" PointX="3" PointY="9.25" Height="5.2494108072916674" IsExpanded="true" />
+        <EntityTypeShape EntityType="NorthwindModel.Order_Detail" Width="1.5" PointX="7.5" PointY="2.125" Height="2.3648893229166656" IsExpanded="true" />
+        <EntityTypeShape EntityType="NorthwindModel.Order" Width="1.5" PointX="5.25" PointY="1" Height="4.4802050781250031" IsExpanded="true" />
+        <EntityTypeShape EntityType="NorthwindModel.Product" Width="1.5" PointX="10.375" PointY="16.125" Height="3.5186979166666674" IsExpanded="true" />
+        <EntityTypeShape EntityType="NorthwindModel.Region" Width="1.5" PointX="5.75" PointY="7.125" Height="1.5956835937500005" IsExpanded="true" />
+        <EntityTypeShape EntityType="NorthwindModel.Shipper" Width="1.5" PointX="3" PointY="15.25" Height="1.7879850260416674" IsExpanded="true" />
+        <EntityTypeShape EntityType="NorthwindModel.Supplier" Width="1.5" PointX="8.125" PointY="17.5" Height="3.5186979166666674" IsExpanded="true" />
+        <EntityTypeShape EntityType="NorthwindModel.sysdiagram" Width="1.5" PointX="7.75" PointY="5.75" Height="1.9802864583333353" IsExpanded="true" />
+        <EntityTypeShape EntityType="NorthwindModel.Territory" Width="1.5" PointX="8" PointY="9.875" Height="1.9802864583333317" IsExpanded="true" />
+        <EntityTypeShape EntityType="NorthwindModel.Alphabetical_list_of_product" Width="1.5" PointX="9.75" PointY="0.75" Height="3.1340950520833388" IsExpanded="true" />
+        <EntityTypeShape EntityType="NorthwindModel.Category_Sales_for_1997" Width="1.5" PointX="0.75" PointY="6.75" Height="1.4033821614583388" IsExpanded="true" />
+        <EntityTypeShape EntityType="NorthwindModel.Current_Product_List" Width="1.5" PointX="2.75" PointY="6.75" Height="1.4033821614583388" IsExpanded="true" />
+        <EntityTypeShape EntityType="NorthwindModel.Customer_and_Suppliers_by_City" Width="1.5" PointX="9.75" PointY="4.75" Height="1.7879850260416674" IsExpanded="true" />
+        <EntityTypeShape EntityType="NorthwindModel.Invoice" Width="1.5" PointX="10.75" PointY="7.75" Height="6.0186165364583388" IsExpanded="true" />
+        <EntityTypeShape EntityType="NorthwindModel.Order_Details_Extended" Width="1.5" PointX="11.75" PointY="0.75" Height="2.3648893229166674" IsExpanded="true" />
+        <EntityTypeShape EntityType="NorthwindModel.Order_Subtotal" Width="1.5" PointX="11.75" PointY="4.75" Height="1.4033821614583388" IsExpanded="true" />
+        <EntityTypeShape EntityType="NorthwindModel.Orders_Qry" Width="1.5" PointX="5.75" PointY="12.75" Height="4.8648079427083317" IsExpanded="true" />
+        <EntityTypeShape EntityType="NorthwindModel.Product_Sales_for_1997" Width="1.5" PointX="12.75" PointY="7.75" Height="1.5956835937500031" IsExpanded="true" />
+        <EntityTypeShape EntityType="NorthwindModel.Products_Above_Average_Price" Width="1.5" PointX="7.75" PointY="12.75" Height="1.4033821614583282" IsExpanded="true" />
+        <EntityTypeShape EntityType="NorthwindModel.Products_by_Category" Width="1.5" PointX="12.75" PointY="10.75" Height="1.9802864583333246" IsExpanded="true" />
+        <EntityTypeShape EntityType="NorthwindModel.Sales_by_Category" Width="1.5" PointX="13.75" PointY="0.75" Height="1.7879850260416674" IsExpanded="true" />
+        <EntityTypeShape EntityType="NorthwindModel.Sales_Totals_by_Amount" Width="1.5" PointX="13.75" PointY="3.75" Height="1.7879850260416674" IsExpanded="true" />
+        <EntityTypeShape EntityType="NorthwindModel.Summary_of_Sales_by_Quarter" Width="1.5" PointX="12.75" PointY="13.75" Height="1.5956835937500102" IsExpanded="true" />
+        <EntityTypeShape EntityType="NorthwindModel.Summary_of_Sales_by_Year" Width="1.5" PointX="14.75" PointY="6.75" Height="1.5956835937500102" IsExpanded="true" />
+        <AssociationConnector Association="NorthwindModel.FK_Products_Categories" ManuallyRouted="false">
+          <ConnectorPoint PointX="9.625" PointY="16.427643229166666" />
+          <ConnectorPoint PointX="10.375" PointY="16.427643229166666" />
+        </AssociationConnector>
+        <AssociationConnector Association="NorthwindModel.FK_Orders_Customers" ManuallyRouted="false">
+          <ConnectorPoint PointX="4.5" PointY="3.2593489583333328" />
+          <ConnectorPoint PointX="4.791666666666667" PointY="3.2593489583333324" />
+          <ConnectorPoint PointX="4.958333333333333" PointY="3.2593489583333328" />
+          <ConnectorPoint PointX="5.25" PointY="3.2593489583333328" />
+        </AssociationConnector>
+        <AssociationConnector Association="NorthwindModel.FK_Employees_Employees" ManuallyRouted="false">
+          <ConnectorPoint PointX="3.5319230769230767" PointY="14.499410807291667" />
+          <ConnectorPoint PointX="3.5319230769230767" PointY="14.749410807291667" />
+          <ConnectorPoint PointX="3.9784615384615383" PointY="14.749410807291667" />
+          <ConnectorPoint PointX="3.9784615384615383" PointY="14.499410807291667" />
+        </AssociationConnector>
+        <AssociationConnector Association="NorthwindModel.FK_Orders_Employees" ManuallyRouted="false">
+          <ConnectorPoint PointX="4.5" PointY="10.96875" />
+          <ConnectorPoint PointX="4.791666666666667" PointY="10.96875" />
+          <ConnectorPoint PointX="4.958333333333333" PointY="10.96875" />
+          <ConnectorPoint PointX="5.46875" PointY="10.96875" />
+          <ConnectorPoint PointX="5.46875" PointY="5.4802050781250031" />
+        </AssociationConnector>
+        <AssociationConnector Association="NorthwindModel.FK_Order_Details_Orders" ManuallyRouted="false">
+          <ConnectorPoint PointX="6.75" PointY="3.3074446614583328" />
+          <ConnectorPoint PointX="7.5" PointY="3.3074446614583328" />
+        </AssociationConnector>
+        <AssociationConnector Association="NorthwindModel.FK_Order_Details_Products" ManuallyRouted="false">
+          <ConnectorPoint PointX="10.375" PointY="17.115143229166666" />
+          <ConnectorPoint PointX="7.59375" PointY="17.115143229166666" />
+          <ConnectorPoint PointX="7.59375" PointY="4.4898893229166656" />
+        </AssociationConnector>
+        <AssociationConnector Association="NorthwindModel.FK_Orders_Shippers" ManuallyRouted="false">
+          <ConnectorPoint PointX="4.5" PointY="15.251152846153847" />
+          <ConnectorPoint PointX="4.875" PointY="14.876152846153847" />
+          <ConnectorPoint PointX="4.875" PointY="2.0984224791666657" />
+          <ConnectorPoint PointX="5.25" PointY="2.0984224791666657" />
+        </AssociationConnector>
+        <AssociationConnector Association="NorthwindModel.FK_Products_Suppliers" ManuallyRouted="false">
+          <ConnectorPoint PointX="9.625" PointY="18.571848958333334" />
+          <ConnectorPoint PointX="10.375" PointY="18.571848958333334" />
+        </AssociationConnector>
+        <AssociationConnector Association="NorthwindModel.FK_Territories_Region" ManuallyRouted="false">
+          <ConnectorPoint PointX="6.5" PointY="8.72068359375" />
+          <ConnectorPoint PointX="6.5" PointY="10.865143229166666" />
+          <ConnectorPoint PointX="7.510416666666667" PointY="10.865143229166666" />
+          <ConnectorPoint PointX="7.677083333333333" PointY="10.865143229166666" />
+          <ConnectorPoint PointX="8" PointY="10.865143229166666" />
+        </AssociationConnector>
+        <AssociationConnector Association="NorthwindModel.CustomerCustomerDemo" ManuallyRouted="false">
+          <ConnectorPoint PointX="2.25" PointY="3.297841796875" />
+          <ConnectorPoint PointX="3" PointY="3.297841796875" />
+        </AssociationConnector>
+        <AssociationConnector Association="NorthwindModel.EmployeeTerritories" ManuallyRouted="false">
+          <ConnectorPoint PointX="4.5" PointY="11.327694740639076" />
+          <ConnectorPoint PointX="4.9375" PointY="11.327694740639076" />
+          <ConnectorPoint PointX="4.9375" PointY="11.318800799589202" />
+          <ConnectorPoint PointX="7.510416666666667" PointY="11.318800799589202" />
+          <ConnectorPoint PointX="7.677083333333333" PointY="11.318800799589202" />
+          <ConnectorPoint PointX="8" PointY="11.318800799589202" />
+        </AssociationConnector>
+      </Diagram>
+    </Diagrams>
+  </Designer>
+</edmx:Edmx>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/NorthwindDataService/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,35 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("NorthwindDataService")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("NorthwindDataService")]
+[assembly: AssemblyCopyright("Copyright © 2012")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("34ee2431-e447-42f9-8bfb-d8174d9d5090")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/NorthwindDataService/Web.Debug.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+
+<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->
+
+<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
+  <!--
+    In the example below, the "SetAttributes" transform will change the value of 
+    "connectionString" to use "ReleaseSQLServer" only when the "Match" locator 
+    finds an atrribute "name" that has a value of "MyDB".
+    
+    <connectionStrings>
+      <add name="MyDB" 
+        connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" 
+        xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
+    </connectionStrings>
+  -->
+  <system.web>
+    <!--
+      In the example below, the "Replace" transform will replace the entire 
+      <customErrors> section of your web.config file.
+      Note that because there is only one customErrors section under the 
+      <system.web> node, there is no need to use the "xdt:Locator" attribute.
+      
+      <customErrors defaultRedirect="GenericError.htm"
+        mode="RemoteOnly" xdt:Transform="Replace">
+        <error statusCode="500" redirect="InternalError.htm"/>
+      </customErrors>
+    -->
+  </system.web>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/NorthwindDataService/Web.Release.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+
+<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->
+
+<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
+  <!--
+    In the example below, the "SetAttributes" transform will change the value of 
+    "connectionString" to use "ReleaseSQLServer" only when the "Match" locator 
+    finds an atrribute "name" that has a value of "MyDB".
+    
+    <connectionStrings>
+      <add name="MyDB" 
+        connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" 
+        xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
+    </connectionStrings>
+  -->
+  <system.web>
+    <compilation xdt:Transform="RemoveAttributes(debug)" />
+    <!--
+      In the example below, the "Replace" transform will replace the entire 
+      <customErrors> section of your web.config file.
+      Note that because there is only one customErrors section under the 
+      <system.web> node, there is no need to use the "xdt:Locator" attribute.
+      
+      <customErrors defaultRedirect="GenericError.htm"
+        mode="RemoteOnly" xdt:Transform="Replace">
+        <error statusCode="500" redirect="InternalError.htm"/>
+      </customErrors>
+    -->
+  </system.web>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/NorthwindDataService/Web.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+	<connectionStrings>
+		<add name="Northwind"
+			connectionString = "Data Source=.;Database=Northwind;Integrated Security=SSPI"
+			providerName     = "System.Data.SqlClient" />
+		<add name="NorthwindEntities"
+			connectionString = "metadata=res://*/NorthwindModel.csdl|res://*/NorthwindModel.ssdl|res://*/NorthwindModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=DADDY;initial catalog=Northwind;integrated security=True;multipleactiveresultsets=True;App=EntityFramework&quot;"
+			providerName     = "System.Data.EntityClient" />
+	</connectionStrings>
+	
+	<system.web>
+		<compilation debug="true" targetFramework="4.0">
+			<assemblies>
+				<add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+			</assemblies>
+		</compilation>
+	</system.web>
+	
+	<system.webServer>
+		<modules runAllManagedModulesForAllRequests="true" />
+	</system.webServer>
+	<system.serviceModel>
+		<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
+	</system.serviceModel>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/ObjectModel/Gender.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+using BLToolkit.Mapping;
+
+namespace Demo.WebServices.ObjectModel
+{
+	public enum Gender
+	{
+		[MapValue("F")] Female,
+		[MapValue("M")] Male,
+		[MapValue("U")] Unknown,
+		[MapValue("O")] Other
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/ObjectModel/IDataAccessor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+
+namespace Demo.WebServices.ObjectModel
+{
+	public interface IDataAccessor
+	{
+		Person                 SelectByKey(int id);
+		List<Person>           SelectAll();
+		XmlMap<string, Person> SelectMap();
+
+		int MethodWithOutParams(out string str, out Guid guid);
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/ObjectModel/ObjectModel.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Demo.WebServices.ObjectModel</RootNamespace>
+    <AssemblyName>Demo.WebServices.ObjectModel</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <TargetFrameworkProfile />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;FW3</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE;FW3</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <LangVersion>ISO-2</LangVersion>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;FW3</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\Demo.WebServices.ObjectModel.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE;FW3</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\Demo.WebServices.ObjectModel.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <LangVersion>ISO-2</LangVersion>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Gender.cs" />
+    <Compile Include="IDataAccessor.cs" />
+    <Compile Include="Person.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="XmlMap.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/ObjectModel/Person.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+using System;
+using System.Xml.Serialization;
+
+using BLToolkit.DataAccess;
+using BLToolkit.EditableObjects;
+using BLToolkit.Mapping;
+using BLToolkit.Validation;
+
+namespace Demo.WebServices.ObjectModel
+{
+	[XmlType(AnonymousType = true)]
+	public abstract class Person: EditableObject<Person>
+	{
+		[PrimaryKey, MapField("PersonID")] public abstract int    Id         { get; set; }
+		[MaxLength(50), Required]          public abstract string LastName   { get; set; }
+		[MaxLength(50), Required]          public abstract string FirstName  { get; set; }
+		[MaxLength(50)]                    public abstract string MiddleName { get; set; }
+		                                   public abstract Gender Gender     { get; set; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/ObjectModel/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,28 @@
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("BLToolkit.Demo.ObjectModel")]
+[assembly: AssemblyProduct("BLToolkit.Demo")]
+[assembly: AssemblyCopyright("\xA9 2002-2012 www.bltoolkit.net")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("9ced2775-83ef-4122-916b-9217fd665c24")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/ObjectModel/XmlMap.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,77 @@
+using System;
+using System.Collections.Generic;
+using System.Xml;
+using System.Xml.Schema;
+using System.Xml.Serialization;
+
+using BLToolkit.TypeBuilder;
+
+namespace Demo.WebServices.ObjectModel
+{
+	[Serializable]
+	public class XmlMap<TKey, TValue>: Dictionary<TKey, TValue>, IXmlSerializable
+	{
+		private const string KEY_NAME     = "k";
+		private const string VALUE_NAME   = "v";
+
+		private static readonly XmlSerializer<TKey>   _keySerializer   = new XmlSerializer<TKey>(KEY_NAME);
+		private static readonly XmlSerializer<TValue> _valueSerializer = new XmlSerializer<TValue>(VALUE_NAME);
+
+		#region IXmlSerializable members
+
+		XmlSchema IXmlSerializable.GetSchema()
+		{
+			return null;
+		}
+
+		void IXmlSerializable.ReadXml(XmlReader reader)
+		{
+			if (!reader.ReadToDescendant(KEY_NAME))
+			{
+				reader.Skip();
+				return;
+			}
+
+			do
+			{
+				Add(_keySerializer.Deserialize(reader),
+				    _valueSerializer.Deserialize(reader));
+			}
+			while (reader.NodeType != XmlNodeType.EndElement);
+
+			reader.ReadEndElement();
+		}
+
+		void IXmlSerializable.WriteXml(XmlWriter writer)
+		{
+			foreach (KeyValuePair<TKey, TValue> pair in this)
+			{
+				_keySerializer  .Serialize(writer, pair.Key);
+				_valueSerializer.Serialize(writer, pair.Value);
+			}
+		}
+
+		#endregion
+
+		private class XmlSerializer<T>
+		{
+			private readonly XmlSerializer _instance;
+
+			public XmlSerializer(string elementName)
+			{
+				_instance = new XmlSerializer(
+					TypeFactory.GetType(typeof(T)), new XmlRootAttribute(elementName));
+			}
+
+			public void Serialize(XmlWriter writer, T value)
+			{
+				_instance.Serialize(writer, value);
+			}
+
+			public T Deserialize(XmlReader reader)
+			{
+				return (T)_instance.Deserialize(reader);
+			}
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/Server/PersonService.asmx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1 @@
+<%@ WebService Language="C#" Class="Demo.WebServices.Server.BLToolkitExtension.PersonService" %>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/Server/PersonService.asmx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Web.Services;
+
+using BLToolkit.DataAccess;
+
+namespace Demo.WebServices.Server
+{
+	using ObjectModel;
+	using WebServices;
+
+	[GenerateWebService("http://tempuri.org/PersonService.asmx")]
+	[GenerateXmlInclude(typeof(Person))]
+	public abstract class PersonService : DataAccessor<Person>, IDataAccessor
+	{
+		[GenerateWebMethod]
+		public abstract Person SelectByKey(int id);
+
+		[GenerateWebMethod(true)]
+		public abstract List<Person> SelectAll();
+
+		[GenerateWebMethod, ActionName("SelectAll")]
+		public abstract XmlMap<string,Person> SelectMap();
+
+		[WebMethod]
+		public int MethodWithOutParams(out string str, out Guid guid)
+		{
+			str  = "string";
+			guid = Guid.NewGuid();
+
+			return 123;
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/Server/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,28 @@
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("BLToolkit.Demo.Server")]
+[assembly: AssemblyProduct("BLToolkit.Demo")]
+[assembly: AssemblyCopyright("\xA9 2002-2012 www.bltoolkit.net")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("3d5900ae-111a-45be-96b3-d9e4606ca793")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/Server/Server.2005.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,94 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.50727</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{711A3803-4395-4E92-9B26-DC8DDDF80366}</ProjectGuid>
+    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Demo.WebServices.Server</RootNamespace>
+    <AssemblyName>Demo.WebServices.Server</AssemblyName>
+    <SignAssembly>false</SignAssembly>
+    <AssemblyOriginatorKeyFile>..\..\..\Source\BLToolkit.snk</AssemblyOriginatorKeyFile>
+    <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.EnterpriseServices" />
+    <Reference Include="System.Web" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Configuration" />
+    <Reference Include="System.Web.Services" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="PersonService.asmx" />
+    <Content Include="Web.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="PersonService.asmx.cs">
+      <DependentUpon>PersonService.asmx</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="WebServices\GenerateWebMethodAttribute.cs" />
+    <Compile Include="WebServices\GenerateWebServiceAttribute.cs" />
+    <Compile Include="WebServices\GenerateXmlIncludeAttribute.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\Source\BLToolkit.2.csproj">
+      <Project>{F4DF7358-8EE6-49FD-AB13-EA5145058D79}</Project>
+      <Name>BLToolkit.2</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\ObjectModel\ObjectModel.2005.csproj">
+      <Project>{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}</Project>
+      <Name>ObjectModel.2005</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v8.0\WebApplications\Microsoft.WebApplication.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <ProjectExtensions>
+    <VisualStudio>
+      <FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
+        <WebProjectProperties>
+          <UseIIS>False</UseIIS>
+          <AutoAssignPort>True</AutoAssignPort>
+          <DevelopmentServerPort>1636</DevelopmentServerPort>
+          <DevelopmentServerVPath>/</DevelopmentServerVPath>
+          <IISUrl>
+          </IISUrl>
+          <NTLMAuthentication>False</NTLMAuthentication>
+        </WebProjectProperties>
+      </FlavorProperties>
+    </VisualStudio>
+  </ProjectExtensions>
+  <PropertyGroup>
+    <PostBuildEvent>$(SolutionDir)Tools\BLTGen\bin\$(ConfigurationName)\BLTgen.exe $(TargetPath) -D -B:BLToolkit.DataAccess.DataAccessor</PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/Server/Server.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{711A3803-4395-4E92-9B26-DC8DDDF80366}</ProjectGuid>
+    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Demo.WebServices.Server</RootNamespace>
+    <AssemblyName>Demo.WebServices.Server</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <SignAssembly>false</SignAssembly>
+    <AssemblyOriginatorKeyFile>..\..\..\Source\BLToolkit.snk</AssemblyOriginatorKeyFile>
+    <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>4.0</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <TargetFrameworkProfile />
+    <UseIISExpress>false</UseIISExpress>
+    <IISExpressSSLPort />
+    <IISExpressAnonymousAuthentication />
+    <IISExpressWindowsAuthentication />
+    <IISExpressUseClassicPipelineMode />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;FW3</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\</OutputPath>
+    <DefineConstants>TRACE;FW3</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <LangVersion>ISO-2</LangVersion>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;FW3</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Demo.WebServices.Server.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\</OutputPath>
+    <DefineConstants>TRACE;FW3</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Demo.WebServices.Server.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <LangVersion>ISO-2</LangVersion>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.EnterpriseServices" />
+    <Reference Include="System.Web" />
+    <Reference Include="System.Web.ApplicationServices" />
+    <Reference Include="System.Web.DynamicData" />
+    <Reference Include="System.Web.Entity" />
+    <Reference Include="System.Web.Extensions" />
+    <Reference Include="System.Web.Extensions.Design" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Configuration" />
+    <Reference Include="System.Web.Services" />
+    <Reference Include="System.Xml.Linq" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="PersonService.asmx" />
+    <Content Include="Web.config">
+      <SubType>Designer</SubType>
+    </Content>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="PersonService.asmx.cs">
+      <DependentUpon>PersonService.asmx</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="WebServices\GenerateWebMethodAttribute.cs" />
+    <Compile Include="WebServices\GenerateWebServiceAttribute.cs" />
+    <Compile Include="WebServices\GenerateXmlIncludeAttribute.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\ObjectModel\ObjectModel.csproj">
+      <Project>{8F9F4193-9104-4AA6-8E04-91CD9FDEC2E6}</Project>
+      <Name>ObjectModel</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <PropertyGroup>
+    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
+    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
+  </PropertyGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
+  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <ProjectExtensions>
+    <VisualStudio>
+      <FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
+        <WebProjectProperties>
+          <UseIIS>False</UseIIS>
+          <AutoAssignPort>False</AutoAssignPort>
+          <DevelopmentServerPort>59179</DevelopmentServerPort>
+          <DevelopmentServerVPath>/</DevelopmentServerVPath>
+          <IISUrl>
+          </IISUrl>
+          <NTLMAuthentication>False</NTLMAuthentication>
+          <UseCustomServer>False</UseCustomServer>
+          <CustomServerUrl>
+          </CustomServerUrl>
+          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
+        </WebProjectProperties>
+      </FlavorProperties>
+    </VisualStudio>
+  </ProjectExtensions>
+  <PropertyGroup>
+    <PostBuildEvent>$(SolutionDir)Tools\BLTGen\bin\$(ConfigurationName)\BLTgen.4.exe $(TargetPath) -D -B:BLToolkit.DataAccess.DataAccessor</PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/Server/Web.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<configuration>
+	<appSettings/>
+	<connectionStrings>
+		<add name="Default" connectionString="Server=.;Database=BLToolkitData;Integrated Security=SSPI" providerName="System.Data.SqlClient"/>
+	</connectionStrings>
+	<system.web>
+		<compilation debug="true" targetFramework="4.0"/>
+		<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/></system.web>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/Server/WebServices/GenerateWebMethodAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,68 @@
+using System;
+using System.EnterpriseServices;
+using System.Web.Services;
+using BLToolkit.TypeBuilder;
+
+namespace Demo.WebServices.Server.WebServices
+{
+	[AttributeUsage(AttributeTargets.Method)]
+	public class GenerateWebMethodAttribute : GenerateAttributeAttribute
+	{
+		/// <summary>
+		/// Initializes a new instance of the <see cref="GenerateWebMethodAttribute"/> class.
+		/// </summary>
+		public GenerateWebMethodAttribute(): base(typeof(WebMethodAttribute))
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="GenerateWebMethodAttribute"/> class.
+		/// </summary>
+		/// <param name="enableSession">Initializes whether session state is enabled for the XML Web service method.</param>
+		public GenerateWebMethodAttribute(bool enableSession): base(typeof(WebMethodAttribute), enableSession)
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="GenerateWebMethodAttribute"/> class.
+		/// </summary>
+		/// <param name="enableSession">Initializes whether session state is enabled for the XML Web service method.</param>
+		/// <param name="transactionOption">Initializes the transaction support of an XML Web service method.</param>
+		public GenerateWebMethodAttribute(
+			bool              enableSession,
+			TransactionOption transactionOption)
+			: base(typeof(WebMethodAttribute), enableSession, transactionOption)
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="GenerateWebMethodAttribute"/> class.
+		/// </summary>
+		/// <param name="enableSession">Initializes whether session state is enabled for the XML Web service method.</param>
+		/// <param name="transactionOption">Initializes the transaction support of an XML Web service method.</param>
+		/// <param name="cacheDuration">Initializes the number of seconds the response is cached.</param>
+		public GenerateWebMethodAttribute(
+			bool              enableSession,
+			TransactionOption transactionOption,
+			int               cacheDuration)
+			: base(typeof(WebMethodAttribute), enableSession, transactionOption, cacheDuration)
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="GenerateWebMethodAttribute"/> class.
+		/// </summary>
+		/// <param name="enableSession">Initializes whether session state is enabled for the XML Web service method.</param>
+		/// <param name="transactionOption">Initializes the transaction support of an XML Web service method.</param>
+		/// <param name="cacheDuration">Initializes the number of seconds the response is cached.</param>
+		/// <param name="bufferResponse">Initializes whether the response for this request is buffered.</param>
+		public GenerateWebMethodAttribute(
+			bool              enableSession,
+			TransactionOption transactionOption,
+			int               cacheDuration,
+			bool              bufferResponse)
+			: base(typeof(WebMethodAttribute), enableSession, transactionOption, cacheDuration, bufferResponse)
+		{
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/Server/WebServices/GenerateWebServiceAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,19 @@
+using System;
+using BLToolkit.TypeBuilder;
+using System.Web.Services;
+
+namespace Demo.WebServices.Server.WebServices
+{
+	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
+	public class GenerateWebServiceAttribute : GenerateAttributeAttribute
+	{
+		/// <summary>
+		/// Initializes a new instance of the <see cref="GenerateWebServiceAttribute"/> class.
+		/// </summary>
+		/// <param name="namespace">The namespace of the web service.</param>
+		public GenerateWebServiceAttribute(string @namespace): base(typeof(WebServiceAttribute))
+		{
+			this["Namespace"] = @namespace;
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WebServices/Server/WebServices/GenerateXmlIncludeAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,26 @@
+using System;
+using System.Xml.Serialization;
+
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+
+namespace Demo.WebServices.Server.WebServices
+{
+	/// <summary>
+	/// Allows the <see cref="XmlSerializer"/> to recognize a type generated
+	/// by the BLToolkit when it serializes or deserializes an object.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)]
+	public class GenerateXmlIncludeAttribute : GenerateAttributeAttribute
+	{
+		/// <summary>
+		/// Initializes a new instance of the <see cref="GenerateXmlIncludeAttribute"/> class.
+		/// </summary>
+		/// <param name="type">The <see cref="Type"/> of an abstract class to
+		/// include its BLToolkit extensions.</param>
+		public GenerateXmlIncludeAttribute(Type type)
+			: base(typeof(XmlIncludeAbstractAttribute), type)
+		{
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/App.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<configuration>
+	<connectionStrings>
+		<add name="Default" connectionString="Server=.;Database=BLToolkitData;Integrated Security=SSPI" providerName="System.Data.SqlClient"/>
+	</connectionStrings>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/BLToolkit.Demo.2005.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,119 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.50727</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{854749E5-9264-42FF-A576-3B5784C7C14C}</ProjectGuid>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit.Demo</RootNamespace>
+    <AssemblyName>BLToolkit.Demo</AssemblyName>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="BusinessLogic\DataAccess\AccessorBase.cs" />
+    <Compile Include="BusinessLogic\ManagerBase.cs" />
+    <Compile Include="BusinessLogic\DataAccess\PersonAccessor.cs" />
+    <Compile Include="BusinessLogic\PersonManager.cs" />
+    <Compile Include="Controls\EnumSelector.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Controls\EnumSelector.Designer.cs">
+      <DependentUpon>EnumSelector.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Forms\BizEntityForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Forms\EditPersonForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Forms\EditPersonForm.Designer.cs">
+      <DependentUpon>EditPersonForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Forms\MainForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Forms\MainForm.Designer.cs">
+      <DependentUpon>MainForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Forms\ObjectViews\PersonView.cs" />
+    <Compile Include="ObjectModel\BizEntity.cs" />
+    <Compile Include="ObjectModel\Gender.cs" />
+    <Compile Include="ObjectModel\Person.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <EmbeddedResource Include="Forms\EditPersonForm.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>EditPersonForm.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Forms\MainForm.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>MainForm.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Resources.resx</DependentUpon>
+      <DesignTime>True</DesignTime>
+    </Compile>
+    <None Include="App.config" />
+    <None Include="Properties\DataSources\BLToolkit.Demo.Forms.ObjectViews.PersonView.datasource" />
+    <None Include="Properties\DataSources\BLToolkit.Demo.ObjectModel.Gender.datasource" />
+    <None Include="Properties\DataSources\BLToolkit.Demo.ObjectModel.Person.datasource" />
+    <None Include="Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.2.csproj">
+      <Project>{F4DF7358-8EE6-49FD-AB13-EA5145058D79}</Project>
+      <Name>BLToolkit.2</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/BLToolkit.Demo.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,205 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{854749E5-9264-42FF-A576-3B5784C7C14C}</ProjectGuid>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit.Demo</RootNamespace>
+    <AssemblyName>BLToolkit.Demo</AssemblyName>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkProfile />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\BLToolkit.Demo.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\BLToolkit.Demo.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="BusinessLogic\DataAccess\AccessorBase.cs" />
+    <Compile Include="BusinessLogic\ManagerBase.cs" />
+    <Compile Include="BusinessLogic\DataAccess\PersonAccessor.cs" />
+    <Compile Include="BusinessLogic\PersonManager.cs" />
+    <Compile Include="Controls\EnumSelector.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Controls\EnumSelector.Designer.cs">
+      <DependentUpon>EnumSelector.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Forms\BizEntityForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Forms\EditPersonForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Forms\EditPersonForm.Designer.cs">
+      <DependentUpon>EditPersonForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Forms\MainForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Forms\MainForm.Designer.cs">
+      <DependentUpon>MainForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Forms\ObjectViews\PersonView.cs" />
+    <Compile Include="ObjectModel\BizEntity.cs" />
+    <Compile Include="ObjectModel\Gender.cs" />
+    <Compile Include="ObjectModel\Person.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <EmbeddedResource Include="Forms\EditPersonForm.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>EditPersonForm.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Forms\MainForm.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>MainForm.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Resources.resx</DependentUpon>
+      <DesignTime>True</DesignTime>
+    </Compile>
+    <None Include="App.config" />
+    <None Include="Properties\DataSources\BLToolkit.Demo.Forms.ObjectViews.PersonView.datasource" />
+    <None Include="Properties\DataSources\BLToolkit.Demo.ObjectModel.Gender.datasource" />
+    <None Include="Properties\DataSources\BLToolkit.Demo.ObjectModel.Person.datasource" />
+    <None Include="Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/BusinessLogic/DataAccess/AccessorBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+using System;
+
+using BLToolkit.DataAccess;
+
+using BLToolkit.Demo.ObjectModel;
+
+namespace BLToolkit.Demo.BusinessLogic.DataAccess
+{
+	public abstract class AccessorBase<T,A> : DataAccessor<T,A>
+		where T : BizEntity
+		where A : DataAccessor<T,A>
+	{
+		public abstract int Insert(T obj);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/BusinessLogic/DataAccess/PersonAccessor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+using System;
+
+using BLToolkit.Demo.ObjectModel;
+
+namespace BLToolkit.Demo.BusinessLogic.DataAccess
+{
+	public abstract class PersonAccessor : AccessorBase<Person, PersonAccessor>
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/BusinessLogic/ManagerBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,79 @@
+using System;
+
+using BLToolkit.DataAccess;
+using BLToolkit.EditableObjects;
+
+using BLToolkit.Demo.ObjectModel;
+using BLToolkit.Demo.BusinessLogic.DataAccess;
+
+namespace BLToolkit.Demo.BusinessLogic
+{
+	public abstract class ManagerBase<T,A>
+		where T : BizEntity
+		where A : AccessorBase<T,A>
+	{
+		#region Insert, Update, Delete
+
+		public void Insert(T obj)
+		{
+			obj.Validate();
+
+			obj.ID = Accessor.Insert(obj);
+
+			obj.AcceptChanges();
+		}
+
+		public void Update(T obj)
+		{
+			obj.Validate();
+			
+			Query.Update(obj);
+
+			obj.AcceptChanges();
+		}
+
+		public void Delete(T obj)
+		{
+			Query.Delete(obj);
+		}
+
+		public void Delete(int id)
+		{
+			Query.DeleteByKey(id);
+		}
+
+		#endregion
+
+		#region Select
+
+		public EditableList<T> SelectAll()
+		{
+			EditableList<T> list = new EditableList<T>();
+
+			return Query.SelectAll(list);
+		}
+
+		#endregion
+
+		#region Protected Members
+
+		protected virtual A Accessor
+		{
+			get { return AccessorBase<T,A>.CreateInstance(); }
+		}
+
+		private            SqlQuery<T>   _query;
+		protected virtual  SqlQuery<T>    Query
+		{
+			get
+			{
+				if (null == _query)
+					_query = new SqlQuery<T>();
+
+				return _query;
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/BusinessLogic/PersonManager.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,11 @@
+using System;
+
+using BLToolkit.Demo.BusinessLogic.DataAccess;
+using BLToolkit.Demo.ObjectModel;
+
+namespace BLToolkit.Demo.BusinessLogic
+{
+	public class PersonManager : ManagerBase<Person, PersonAccessor>
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/Controls/EnumSelector.Designer.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,36 @@
+namespace BLToolkit.Demo.Controls
+{
+	partial class EnumSelector
+	{
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.IContainer components = null;
+
+		/// <summary> 
+		/// Clean up any resources being used.
+		/// </summary>
+		/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+		protected override void Dispose(bool disposing)
+		{
+			if (disposing && (components != null))
+			{
+				components.Dispose();
+			}
+			base.Dispose(disposing);
+		}
+
+		#region Component Designer generated code
+
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			components = new System.ComponentModel.Container();
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/Controls/EnumSelector.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,107 @@
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Windows.Forms;
+using System.Drawing.Design;
+
+using BLToolkit.ComponentModel;
+using System.Reflection;
+
+namespace BLToolkit.Demo.Controls
+{
+	public partial class EnumSelector : GroupBox
+	{
+		public EnumSelector()
+		{
+			InitializeComponent();
+		}
+
+		public EnumSelector(IContainer container)
+		{
+			container.Add(this);
+
+			InitializeComponent();
+		}
+
+		[RefreshProperties(RefreshProperties.Repaint)]
+		[Category("Data")]
+		[Bindable(true)]
+		public  object  Value
+		{
+			get
+			{
+				foreach (RadioButton r in _controls.Keys)
+					if (r.Checked)
+						return Enum.Parse(_valueType, (string)_controls[r]);
+
+
+				return -1;
+			}
+			set
+			{
+				if (value != null)
+				{
+					string s = value.ToString();
+
+					foreach (DictionaryEntry de in _controls)
+					{
+						RadioButton r = (RadioButton)de.Key;
+
+						if (r.Checked != (de.Value.ToString() == s))
+							r.Checked = !r.Checked;
+					}
+				}
+			}
+		}
+
+		const FieldAttributes EnumField = FieldAttributes.Public | FieldAttributes.Static | FieldAttributes.Literal;
+
+		private Hashtable _controls = new Hashtable();
+
+		private Type _valueType;
+		[RefreshProperties(RefreshProperties.Repaint)]
+		[DefaultValue(null)]
+		[Category("Data")]
+		[TypeConverter(typeof(TypeTypeConverter))]
+		[Editor(typeof(EnumEditor), typeof(UITypeEditor))]
+		public  Type  ValueType
+		{
+			get { return _valueType; }
+			set
+			{
+				_valueType = value;
+
+				foreach (Control c in _controls.Keys)
+					Controls.Remove(c);
+
+				FieldInfo[] fields = _valueType.GetFields();
+
+				foreach (FieldInfo fi in fields)
+				{
+					if ((fi.Attributes & EnumField) == EnumField)
+					{
+						RadioButton r = new RadioButton();
+
+						Controls.Add(r);
+						_controls.Add(r, fi.Name);
+
+						r.Text     = fi.Name;
+						r.Name     = fi.Name + "RadioButton";
+						r.TabIndex = _controls.Count;
+						r.AutoSize = true;
+						r.Location = new System.Drawing.Point(10, 23 * _controls.Count - 4);
+						r.UseVisualStyleBackColor = true;
+					}
+				}
+			}
+		}
+
+		class EnumEditor : ComponentModel.Design.TypeEditor
+		{
+			protected override bool FilterTypeList(Type type)
+			{
+				return type.IsPublic && type.IsEnum;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/Forms/BizEntityForm.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,404 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+using Microsoft.Win32;
+
+using BLToolkit.Validation;
+using BLToolkit.Reflection;
+
+using BLToolkit.Demo.ObjectModel;
+
+namespace BLToolkit.Demo.Forms
+{
+	public class BizEntityForm<F,T> : Form
+		where F : BizEntityForm<F,T>, new()
+		where T : BizEntity
+	{
+		#region Static Members
+
+		public static bool Edit(T entity, Action<T> saveAction)
+		{
+			T clone = (T)entity.Clone();
+			F form  = new F();
+
+			form.SetBizEntity(clone);
+			form.Init(clone, delegate
+			{
+				saveAction(clone);
+
+				clone.CopyTo(entity);
+				entity.AcceptChanges();
+			});
+
+			return form.ShowDialog() == DialogResult.OK;
+		}
+
+		public static T EditNew(Action<T> saveAction)
+		{
+			T entity = TypeAccessor<T>.CreateInstanceEx();
+			F form   = new F();
+
+			form.SetBizEntity(entity);
+			form.Init(entity, delegate
+			{
+				saveAction(entity);
+				entity.AcceptChanges();
+			});
+
+			return form.ShowDialog() == DialogResult.OK? entity: null;
+		}
+
+		private void Init(BizEntity entity, SaveHandler saveHandler)
+		{
+			if (AcceptButton is Button)
+				((Button)AcceptButton).Click += SaveEntity;
+
+			_entity      = entity;
+			_saveHandler = saveHandler;
+		}
+
+		#endregion
+
+		#region Abstracts
+
+		protected virtual void SetBizEntity(T entity)
+		{
+			throw new NotImplementedException();
+		}
+
+		#endregion
+
+		#region SaveEntity Handler
+
+		private delegate void SaveHandler();
+
+		private SaveHandler _saveHandler;
+		private BizEntity   _entity;
+
+		protected void SaveEntity(object sender, EventArgs e)
+		{
+			if (_entity.IsDirty)
+			{
+				try
+				{
+					_entity.Validate();
+
+					UseWaitCursor = true;
+					_saveHandler();
+					UseWaitCursor = false;
+
+					DialogResult = DialogResult.OK;
+					Close();
+				}
+				catch (Exception ex)
+				{
+					UseWaitCursor = false;
+					MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+					DialogResult = DialogResult.None;
+				}
+			}
+			else
+			{
+				DialogResult = DialogResult.Cancel;
+				Close();
+			}
+		}
+
+		#endregion
+
+		#region Scan Controls
+
+		private static void ForEach(Control control, Hashtable scanedControls, Predicate<Control> controlHandler)
+		{
+			if (control != null && !scanedControls.ContainsKey(control))
+			{
+				scanedControls.Add(control, control);
+
+				if (controlHandler(control))
+					foreach (Control c in control.Controls)
+						ForEach(c, scanedControls, controlHandler);
+			}
+		}
+
+		protected virtual void ScanControls(Predicate<Control> controlHandler)
+		{
+			ForEach(this, new Hashtable(), controlHandler);
+		}
+
+		protected virtual void ScanControls(Control control, Predicate<Control> controlHandler)
+		{
+			ForEach(control, new Hashtable(), controlHandler);
+		}
+
+		#endregion
+
+		#region OnLoad
+
+		protected override void OnLoad(EventArgs e)
+		{
+			base.OnLoad(e);
+
+			_toolTip.ToolTipIcon  = ToolTipIcon.Warning;
+			_toolTip.ToolTipTitle = "Validation";
+
+			try
+			{
+				_toolTip.IsBalloon = (int)Registry.GetValue(
+					@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced",
+					"EnableBalloonTips", 1) != 0;
+			}
+			catch
+			{
+			}
+
+			if (!DesignMode)
+			{
+				ScanControls(InitBindableControls);
+				ValidateForm();
+			}
+		}
+
+		#endregion
+
+		#region Binding
+
+		class ControlInfo
+		{
+			public ControlInfo(Control control, bool isValidatable, PropertyDescriptor pd)
+			{
+				Control            = control;
+				IsValidatable      = isValidatable;
+				PropertyDescriptor = pd;
+			}
+
+			public Control            Control;
+			public bool               IsValidatable;
+			public PropertyDescriptor PropertyDescriptor;
+		}
+
+		ToolTip _toolTip = new ToolTip();
+
+		Dictionary<string, ControlInfo> _keyToControl     = new Dictionary<string,ControlInfo>();
+		List<ControlInfo>               _bindableControls = new List<ControlInfo>();
+
+		private bool InitBindableControls(Control control)
+		{
+			foreach (Binding binding in control.DataBindings)
+			{
+				BizEntity item = binding.BindingManagerBase.Current as BizEntity;
+
+				if (item != null)
+				{
+					string key = GetBindingKey(item, binding, control);
+
+					if (_keyToControl.ContainsKey(key))
+						continue;
+
+					string[]           str = null;
+					PropertyDescriptor pd  = null;
+
+					ITypedList typedList = binding.DataSource as ITypedList;
+
+					if (typedList != null)
+					{
+						pd = typedList.GetItemProperties(null).Find(
+							binding.BindingMemberInfo.BindingField, false);
+
+						if (pd != null)
+							str = Validator.GetErrorMessages(item, pd);
+					}
+
+					if (str == null)
+						str = item.GetErrorMessages(binding.BindingMemberInfo.BindingField);
+
+					if (str.Length > 0)
+						Array.Sort(str);
+
+					ControlInfo ci = new ControlInfo(control, str.Length > 0, pd);
+
+					_bindableControls.Add(ci);
+					_keyToControl.Add(key, ci);
+
+					if (ci.IsValidatable)
+						_toolTip.SetToolTip(control, string.Join("\r\n", str));
+
+					control.LostFocus      += ValidateControl;
+					control.Validated      += ValidateControl;
+					control.EnabledChanged += ValidateControl;
+				}
+			}
+
+			return true;
+		}
+
+		private void ValidateControl(object sender, EventArgs e)
+		{
+			Validate((Control)sender, true);
+		}
+
+		private static string GetBindingKey(BizEntity entity, Binding binding, Control control)
+		{
+			return string.Format("{0}.{1}.{2}",
+				entity.GetHashCode(), binding.BindingMemberInfo.BindingField, control.Name);
+		}
+
+		protected bool Validate(Control control, bool validateCombines)
+		{
+			bool result = true;
+
+			foreach (Binding binding in control.DataBindings)
+			{
+				if (binding.BindingManagerBase == null || binding.BindingManagerBase.Count == 0)
+					continue;
+
+				BizEntity item = binding.BindingManagerBase.Current as BizEntity;
+
+				if (item != null)
+				{
+					string key = GetBindingKey(item, binding, control);
+
+					if (!_keyToControl.ContainsKey(key))
+						continue;
+
+					ControlInfo ci        = _keyToControl[key];
+					string      fieldName = binding.BindingMemberInfo.BindingField;
+
+					bool isValid = ci.IsValidatable?
+						ci.PropertyDescriptor != null?
+							Validator.IsValid(item, ci.PropertyDescriptor):
+							item.IsValid(fieldName):
+						true;
+
+					if (isValid)
+					{
+						if (item.IsDirtyMember(fieldName))
+							SetDirty(control);
+						else
+							ResetControl(control);
+					}
+					else
+					{
+						SetInvalid(control);
+
+						result = false;
+					}
+
+					/*
+					if (validateCombines)
+					{
+						PropertyInfo pi = 
+							item.GetType().GetProperty(binding.BindingMemberInfo.BindingField);
+
+						if (pi != null)
+						{
+							object[] attrs = pi.GetCustomAttributes(typeof(CombineAttribute), true);
+
+							foreach (CombineAttribute a in attrs)
+							{
+								string key = GetBindingKey(item, binding, control);
+								string key = item.GetHashCode() + "." + a.Name;
+
+								ControlInfo ci = (ControlInfo)nameToControl[key];
+
+								if (ci != null)
+									result = Validate(ci.Control, false) && result;
+							}
+						}
+					}
+					 */
+				}
+			}
+
+			return result;
+		}
+
+		Dictionary<Control, Control> _modifiedControls = new Dictionary<Control,Control>();
+		Dictionary<Control, Color>   _originalColors   = new Dictionary<Control,Color>();
+
+		protected virtual void SetInvalid(Control control)
+		{
+			if (control.Enabled == false)
+				return;
+
+			if (_modifiedControls.ContainsKey(control) == false)
+				_modifiedControls.Add(control, control);
+
+			if (_originalColors.ContainsKey(control) == false)
+				_originalColors.Add(control, control.BackColor);
+
+			Color color = Modify((Color)_originalColors[control], 45, 0, 0);
+
+			if (color != control.BackColor)
+				control.BackColor = color;
+		}
+
+		protected virtual void SetDirty(Control control)
+		{
+			if (control.Enabled == false)
+				return;
+
+			if (_modifiedControls.ContainsKey(control) == false)
+				_modifiedControls.Add(control, control);
+
+			if (_originalColors.ContainsKey(control) == false)
+				_originalColors.Add(control, control.BackColor);
+
+			Color color = Modify((Color)_originalColors[control], 50,  50, -15);
+
+			if (color != control.BackColor)
+				control.BackColor = color;
+		}
+
+		protected virtual void ResetControl(Control control)
+		{
+			if (_modifiedControls.ContainsKey(control))
+			{
+				_modifiedControls.Remove(control);
+
+				if (_originalColors.ContainsKey(control))
+				{
+					control.BackColor = control.Enabled?
+						(Color)_originalColors[control]:
+						Color.FromKnownColor(KnownColor.Control);
+				}
+			}
+		}
+
+		public virtual bool ValidateForm()
+		{
+			bool isValid = true;
+
+			foreach (ControlInfo ci in _bindableControls)
+				isValid = Validate(ci.Control, false) && isValid;
+
+			return isValid;
+		}
+
+		public static Color Modify(Color original, int dr, int dg, int db)
+		{
+			int r = original.R + dr;
+			int g = original.G + dg;
+			int b = original.B + db;
+
+			if (r > 255 || g > 255 || b > 255)
+			{
+				int d = Math.Max(r, Math.Max(g, b)) - 255;
+
+				r -= d;
+				g -= d;
+				b -= d;
+			}
+
+			if (r < 0) r = 0;
+			if (g < 0) g = 0;
+			if (b < 0) b = 0;
+
+			return Color.FromArgb(r, g, b);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/Forms/EditPersonForm.Designer.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,176 @@
+namespace BLToolkit.Demo.Forms
+{
+	partial class EditPersonForm
+	{
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.IContainer components = null;
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+		protected override void Dispose(bool disposing)
+		{
+			if (disposing && (components != null))
+			{
+				components.Dispose();
+			}
+			base.Dispose(disposing);
+		}
+
+		#region Windows Form Designer generated code
+
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.components = new System.ComponentModel.Container();
+			this.firstNameTextBox = new System.Windows.Forms.TextBox();
+			this.personBinder = new BLToolkit.ComponentModel.ObjectBinder(this.components);
+			this.firstNameLabel = new System.Windows.Forms.Label();
+			this.middleNameLabel = new System.Windows.Forms.Label();
+			this.middleNameTextBox = new System.Windows.Forms.TextBox();
+			this.lastNameLabel = new System.Windows.Forms.Label();
+			this.lastNameTextBox = new System.Windows.Forms.TextBox();
+			this.okButton = new System.Windows.Forms.Button();
+			this.cancelButton = new System.Windows.Forms.Button();
+			this.genderSelector = new BLToolkit.Demo.Controls.EnumSelector(this.components);
+			this.SuspendLayout();
+			// 
+			// firstNameTextBox
+			// 
+			this.firstNameTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.personBinder, "FirstName", true));
+			this.firstNameTextBox.Location = new System.Drawing.Point(90, 12);
+			this.firstNameTextBox.Name = "firstNameTextBox";
+			this.firstNameTextBox.Size = new System.Drawing.Size(160, 20);
+			this.firstNameTextBox.TabIndex = 2;
+			// 
+			// personBinder
+			// 
+			this.personBinder.IsNull = null;
+			this.personBinder.ItemType = typeof(BLToolkit.Demo.ObjectModel.Person);
+			this.personBinder.ObjectViewType = typeof(BLToolkit.Demo.Forms.ObjectViews.PersonView);
+			// 
+			// firstNameLabel
+			// 
+			this.firstNameLabel.AutoSize = true;
+			this.firstNameLabel.Location = new System.Drawing.Point(12, 15);
+			this.firstNameLabel.Name = "firstNameLabel";
+			this.firstNameLabel.Size = new System.Drawing.Size(60, 13);
+			this.firstNameLabel.TabIndex = 1;
+			this.firstNameLabel.Text = "First Name:";
+			// 
+			// middleNameLabel
+			// 
+			this.middleNameLabel.AutoSize = true;
+			this.middleNameLabel.Location = new System.Drawing.Point(12, 47);
+			this.middleNameLabel.Name = "middleNameLabel";
+			this.middleNameLabel.Size = new System.Drawing.Size(72, 13);
+			this.middleNameLabel.TabIndex = 3;
+			this.middleNameLabel.Text = "Middle Name:";
+			// 
+			// middleNameTextBox
+			// 
+			this.middleNameTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.personBinder, "MiddleName", true));
+			this.middleNameTextBox.Location = new System.Drawing.Point(90, 44);
+			this.middleNameTextBox.Name = "middleNameTextBox";
+			this.middleNameTextBox.Size = new System.Drawing.Size(160, 20);
+			this.middleNameTextBox.TabIndex = 4;
+			// 
+			// lastNameLabel
+			// 
+			this.lastNameLabel.AutoSize = true;
+			this.lastNameLabel.Location = new System.Drawing.Point(12, 80);
+			this.lastNameLabel.Name = "lastNameLabel";
+			this.lastNameLabel.Size = new System.Drawing.Size(61, 13);
+			this.lastNameLabel.TabIndex = 5;
+			this.lastNameLabel.Text = "Last Name:";
+			// 
+			// lastNameTextBox
+			// 
+			this.lastNameTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.personBinder, "LastName", true));
+			this.lastNameTextBox.Location = new System.Drawing.Point(90, 77);
+			this.lastNameTextBox.Name = "lastNameTextBox";
+			this.lastNameTextBox.Size = new System.Drawing.Size(160, 20);
+			this.lastNameTextBox.TabIndex = 6;
+			// 
+			// okButton
+			// 
+			this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
+			this.okButton.Location = new System.Drawing.Point(33, 235);
+			this.okButton.Name = "okButton";
+			this.okButton.Size = new System.Drawing.Size(75, 23);
+			this.okButton.TabIndex = 100;
+			this.okButton.Text = "Save";
+			this.okButton.UseVisualStyleBackColor = true;
+			// 
+			// cancelButton
+			// 
+			this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+			this.cancelButton.Location = new System.Drawing.Point(157, 235);
+			this.cancelButton.Name = "cancelButton";
+			this.cancelButton.Size = new System.Drawing.Size(75, 23);
+			this.cancelButton.TabIndex = 101;
+			this.cancelButton.Text = "Cancel";
+			this.cancelButton.UseVisualStyleBackColor = true;
+			// 
+			// genderSelector
+			// 
+			this.genderSelector.DataBindings.Add(new System.Windows.Forms.Binding("Value", this.personBinder, "Gender", true));
+			this.genderSelector.Location = new System.Drawing.Point(90, 103);
+			this.genderSelector.Name = "genderSelector";
+			this.genderSelector.Size = new System.Drawing.Size(102, 113);
+			this.genderSelector.TabIndex = 7;
+			this.genderSelector.TabStop = false;
+			this.genderSelector.Text = "Gender";
+			this.genderSelector.Value = -1;
+			this.genderSelector.ValueType = typeof(BLToolkit.Demo.ObjectModel.Gender);
+			// 
+			// EditPersonForm
+			// 
+			this.AcceptButton = this.okButton;
+			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+			this.CancelButton = this.cancelButton;
+			this.ClientSize = new System.Drawing.Size(269, 268);
+			this.Controls.Add(this.cancelButton);
+			this.Controls.Add(this.okButton);
+			this.Controls.Add(this.genderSelector);
+			this.Controls.Add(this.lastNameLabel);
+			this.Controls.Add(this.middleNameLabel);
+			this.Controls.Add(this.firstNameLabel);
+			this.Controls.Add(this.lastNameTextBox);
+			this.Controls.Add(this.middleNameTextBox);
+			this.Controls.Add(this.firstNameTextBox);
+			this.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.personBinder, "FormTitle", true));
+			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+			this.MaximizeBox = false;
+			this.MinimizeBox = false;
+			this.Name = "EditPersonForm";
+			this.ShowIcon = false;
+			this.ShowInTaskbar = false;
+			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+			this.Text = "Edit Person";
+			this.ResumeLayout(false);
+			this.PerformLayout();
+
+		}
+
+		#endregion
+
+		private BLToolkit.ComponentModel.ObjectBinder personBinder;
+		private System.Windows.Forms.TextBox firstNameTextBox;
+		private System.Windows.Forms.Label firstNameLabel;
+		private System.Windows.Forms.Label middleNameLabel;
+		private System.Windows.Forms.TextBox middleNameTextBox;
+		private System.Windows.Forms.Label lastNameLabel;
+		private System.Windows.Forms.TextBox lastNameTextBox;
+		private System.Windows.Forms.Button okButton;
+		private System.Windows.Forms.Button cancelButton;
+		private BLToolkit.Demo.Controls.EnumSelector genderSelector;
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/Forms/EditPersonForm.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,24 @@
+using System;
+
+using BLToolkit.Demo.ObjectModel;
+
+namespace BLToolkit.Demo.Forms
+{
+	public partial class EditPersonForm : EditPersonFormBase
+	{
+		public EditPersonForm()
+		{
+			InitializeComponent();
+		}
+
+		protected override void SetBizEntity(Person person)
+		{
+			personBinder.Object = person;
+		}
+	}
+
+	// This additional inheritance is required to avoid a WinForms bug,
+	// which does not allow using generic classes as base classes for forms and uer controls.
+	//
+	public class EditPersonFormBase : BizEntityForm<EditPersonForm, Person> {}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/Forms/EditPersonForm.resx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="personBinder.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="personBinder.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/Forms/MainForm.Designer.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,319 @@
+namespace BLToolkit.Demo.Forms
+{
+	partial class MainForm
+	{
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.IContainer components = null;
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+		protected override void Dispose(bool disposing)
+		{
+			if (disposing && (components != null))
+			{
+				components.Dispose();
+			}
+			base.Dispose(disposing);
+		}
+
+		#region Windows Form Designer generated code
+
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.components = new System.ComponentModel.Container();
+			System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
+			System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
+			this.personGridView = new System.Windows.Forms.DataGridView();
+			this.toolStripContainer = new System.Windows.Forms.ToolStripContainer();
+			this.menu = new System.Windows.Forms.MenuStrip();
+			this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+			this.exitMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+			this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+			this.newMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+			this.editMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+			this.deleteMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+			this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+			this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+			this.tool = new System.Windows.Forms.ToolStrip();
+			this.newToolStripButton = new System.Windows.Forms.ToolStripButton();
+			this.editToolStripButton = new System.Windows.Forms.ToolStripButton();
+			this.deleteToolStripButton = new System.Windows.Forms.ToolStripButton();
+			this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator();
+			this.helpToolStripButton = new System.Windows.Forms.ToolStripButton();
+			this.iDDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
+			this.fullNameDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
+			this.genderDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
+			this.personBinder = new BLToolkit.ComponentModel.ObjectBinder(this.components);
+			((System.ComponentModel.ISupportInitialize)(this.personGridView)).BeginInit();
+			this.toolStripContainer.ContentPanel.SuspendLayout();
+			this.toolStripContainer.TopToolStripPanel.SuspendLayout();
+			this.toolStripContainer.SuspendLayout();
+			this.menu.SuspendLayout();
+			this.tool.SuspendLayout();
+			this.SuspendLayout();
+			// 
+			// personGridView
+			// 
+			this.personGridView.AllowUserToOrderColumns = true;
+			this.personGridView.AutoGenerateColumns = false;
+			this.personGridView.BorderStyle = System.Windows.Forms.BorderStyle.None;
+			this.personGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+			this.personGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
+            this.iDDataGridViewTextBoxColumn,
+            this.fullNameDataGridViewTextBoxColumn,
+            this.genderDataGridViewTextBoxColumn});
+			this.personGridView.DataSource = this.personBinder;
+			this.personGridView.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.personGridView.Location = new System.Drawing.Point(0, 0);
+			this.personGridView.Name = "personGridView";
+			this.personGridView.Size = new System.Drawing.Size(615, 344);
+			this.personGridView.TabIndex = 0;
+			this.personGridView.CellDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.personGridView_CellDoubleClick);
+			// 
+			// toolStripContainer
+			// 
+			// 
+			// toolStripContainer.ContentPanel
+			// 
+			this.toolStripContainer.ContentPanel.Controls.Add(this.personGridView);
+			this.toolStripContainer.ContentPanel.Size = new System.Drawing.Size(615, 344);
+			this.toolStripContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.toolStripContainer.Location = new System.Drawing.Point(0, 0);
+			this.toolStripContainer.Name = "toolStripContainer";
+			this.toolStripContainer.Size = new System.Drawing.Size(615, 393);
+			this.toolStripContainer.TabIndex = 2;
+			this.toolStripContainer.Text = "toolStripContainer1";
+			// 
+			// toolStripContainer.TopToolStripPanel
+			// 
+			this.toolStripContainer.TopToolStripPanel.Controls.Add(this.menu);
+			this.toolStripContainer.TopToolStripPanel.Controls.Add(this.tool);
+			// 
+			// menu
+			// 
+			this.menu.Dock = System.Windows.Forms.DockStyle.None;
+			this.menu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.fileToolStripMenuItem,
+            this.editToolStripMenuItem,
+            this.helpToolStripMenuItem});
+			this.menu.Location = new System.Drawing.Point(0, 0);
+			this.menu.Name = "menu";
+			this.menu.Size = new System.Drawing.Size(615, 24);
+			this.menu.TabIndex = 0;
+			this.menu.Text = "menuStrip1";
+			// 
+			// fileToolStripMenuItem
+			// 
+			this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.exitMenuItem});
+			this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
+			this.fileToolStripMenuItem.Size = new System.Drawing.Size(40, 20);
+			this.fileToolStripMenuItem.Text = "&File";
+			// 
+			// exitMenuItem
+			// 
+			this.exitMenuItem.Name = "exitMenuItem";
+			this.exitMenuItem.Size = new System.Drawing.Size(109, 22);
+			this.exitMenuItem.Text = "E&xit";
+			this.exitMenuItem.Click += new System.EventHandler(this.exit_Click);
+			// 
+			// editToolStripMenuItem
+			// 
+			this.editToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.newMenuItem,
+            this.editMenuItem,
+            this.deleteMenuItem});
+			this.editToolStripMenuItem.Name = "editToolStripMenuItem";
+			this.editToolStripMenuItem.Size = new System.Drawing.Size(41, 20);
+			this.editToolStripMenuItem.Text = "&Edit";
+			// 
+			// newMenuItem
+			// 
+			this.newMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("newMenuItem.Image")));
+			this.newMenuItem.Name = "newMenuItem";
+			this.newMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N)));
+			this.newMenuItem.Size = new System.Drawing.Size(158, 22);
+			this.newMenuItem.Text = "&New";
+			this.newMenuItem.Click += new System.EventHandler(this.new_Click);
+			// 
+			// editMenuItem
+			// 
+			this.editMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("editMenuItem.Image")));
+			this.editMenuItem.Name = "editMenuItem";
+			this.editMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.E)));
+			this.editMenuItem.Size = new System.Drawing.Size(158, 22);
+			this.editMenuItem.Text = "&Edit";
+			this.editMenuItem.Click += new System.EventHandler(this.edit_Click);
+			// 
+			// deleteMenuItem
+			// 
+			this.deleteMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("deleteMenuItem.Image")));
+			this.deleteMenuItem.Name = "deleteMenuItem";
+			this.deleteMenuItem.ShortcutKeys = System.Windows.Forms.Keys.Delete;
+			this.deleteMenuItem.Size = new System.Drawing.Size(158, 22);
+			this.deleteMenuItem.Text = "&Delete";
+			this.deleteMenuItem.Click += new System.EventHandler(this.delete_Click);
+			// 
+			// helpToolStripMenuItem
+			// 
+			this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.aboutToolStripMenuItem});
+			this.helpToolStripMenuItem.Name = "helpToolStripMenuItem";
+			this.helpToolStripMenuItem.Size = new System.Drawing.Size(45, 20);
+			this.helpToolStripMenuItem.Text = "&Help";
+			// 
+			// aboutToolStripMenuItem
+			// 
+			this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
+			this.aboutToolStripMenuItem.Size = new System.Drawing.Size(134, 22);
+			this.aboutToolStripMenuItem.Text = "&About";
+			// 
+			// tool
+			// 
+			this.tool.Dock = System.Windows.Forms.DockStyle.None;
+			this.tool.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.newToolStripButton,
+            this.editToolStripButton,
+            this.deleteToolStripButton,
+            this.toolStripSeparator7,
+            this.helpToolStripButton});
+			this.tool.Location = new System.Drawing.Point(3, 24);
+			this.tool.Name = "tool";
+			this.tool.Size = new System.Drawing.Size(110, 25);
+			this.tool.TabIndex = 1;
+			this.tool.Text = "toolStrip1";
+			// 
+			// newToolStripButton
+			// 
+			this.newToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+			this.newToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("newToolStripButton.Image")));
+			this.newToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+			this.newToolStripButton.Name = "newToolStripButton";
+			this.newToolStripButton.Size = new System.Drawing.Size(23, 22);
+			this.newToolStripButton.Text = "&New";
+			this.newToolStripButton.Click += new System.EventHandler(this.new_Click);
+			// 
+			// editToolStripButton
+			// 
+			this.editToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+			this.editToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("editToolStripButton.Image")));
+			this.editToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+			this.editToolStripButton.Name = "editToolStripButton";
+			this.editToolStripButton.Size = new System.Drawing.Size(23, 22);
+			this.editToolStripButton.Text = "&Edit";
+			this.editToolStripButton.Click += new System.EventHandler(this.edit_Click);
+			// 
+			// deleteToolStripButton
+			// 
+			this.deleteToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+			this.deleteToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("deleteToolStripButton.Image")));
+			this.deleteToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+			this.deleteToolStripButton.Name = "deleteToolStripButton";
+			this.deleteToolStripButton.Size = new System.Drawing.Size(23, 22);
+			this.deleteToolStripButton.Text = "&Delete";
+			this.deleteToolStripButton.Click += new System.EventHandler(this.delete_Click);
+			// 
+			// toolStripSeparator7
+			// 
+			this.toolStripSeparator7.Name = "toolStripSeparator7";
+			this.toolStripSeparator7.Size = new System.Drawing.Size(6, 25);
+			// 
+			// helpToolStripButton
+			// 
+			this.helpToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+			this.helpToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("helpToolStripButton.Image")));
+			this.helpToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta;
+			this.helpToolStripButton.Name = "helpToolStripButton";
+			this.helpToolStripButton.Size = new System.Drawing.Size(23, 22);
+			this.helpToolStripButton.Text = "He&lp";
+			// 
+			// iDDataGridViewTextBoxColumn
+			// 
+			this.iDDataGridViewTextBoxColumn.DataPropertyName = "ID";
+			dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleRight;
+			dataGridViewCellStyle1.Padding = new System.Windows.Forms.Padding(0, 0, 5, 0);
+			this.iDDataGridViewTextBoxColumn.DefaultCellStyle = dataGridViewCellStyle1;
+			this.iDDataGridViewTextBoxColumn.HeaderText = "ID";
+			this.iDDataGridViewTextBoxColumn.MinimumWidth = 20;
+			this.iDDataGridViewTextBoxColumn.Name = "iDDataGridViewTextBoxColumn";
+			// 
+			// fullNameDataGridViewTextBoxColumn
+			// 
+			this.fullNameDataGridViewTextBoxColumn.DataPropertyName = "FullName";
+			this.fullNameDataGridViewTextBoxColumn.HeaderText = "Name";
+			this.fullNameDataGridViewTextBoxColumn.Name = "fullNameDataGridViewTextBoxColumn";
+			this.fullNameDataGridViewTextBoxColumn.ReadOnly = true;
+			this.fullNameDataGridViewTextBoxColumn.Width = 250;
+			// 
+			// genderDataGridViewTextBoxColumn
+			// 
+			this.genderDataGridViewTextBoxColumn.DataPropertyName = "Gender";
+			this.genderDataGridViewTextBoxColumn.FillWeight = 200F;
+			this.genderDataGridViewTextBoxColumn.HeaderText = "Gender";
+			this.genderDataGridViewTextBoxColumn.Name = "genderDataGridViewTextBoxColumn";
+			// 
+			// personBinder
+			// 
+			this.personBinder.AllowEdit = false;
+			this.personBinder.AllowNew = false;
+			this.personBinder.AllowRemove = false;
+			this.personBinder.IsNull = null;
+			this.personBinder.ItemType = typeof(BLToolkit.Demo.ObjectModel.Person);
+			// 
+			// MainForm
+			// 
+			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+			this.ClientSize = new System.Drawing.Size(615, 393);
+			this.Controls.Add(this.toolStripContainer);
+			this.MainMenuStrip = this.menu;
+			this.Name = "MainForm";
+			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+			this.Text = "Business Logic Toolkit Demo";
+			((System.ComponentModel.ISupportInitialize)(this.personGridView)).EndInit();
+			this.toolStripContainer.ContentPanel.ResumeLayout(false);
+			this.toolStripContainer.TopToolStripPanel.ResumeLayout(false);
+			this.toolStripContainer.TopToolStripPanel.PerformLayout();
+			this.toolStripContainer.ResumeLayout(false);
+			this.toolStripContainer.PerformLayout();
+			this.menu.ResumeLayout(false);
+			this.menu.PerformLayout();
+			this.tool.ResumeLayout(false);
+			this.tool.PerformLayout();
+			this.ResumeLayout(false);
+
+		}
+
+		#endregion
+
+		private BLToolkit.ComponentModel.ObjectBinder personBinder;
+		private System.Windows.Forms.DataGridView personGridView;
+		private System.Windows.Forms.ToolStripContainer toolStripContainer;
+		private System.Windows.Forms.MenuStrip menu;
+		private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem exitMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem;
+		private System.Windows.Forms.ToolStrip tool;
+		private System.Windows.Forms.ToolStripButton newToolStripButton;
+		private System.Windows.Forms.ToolStripButton editToolStripButton;
+		private System.Windows.Forms.ToolStripButton deleteToolStripButton;
+		private System.Windows.Forms.ToolStripSeparator toolStripSeparator7;
+		private System.Windows.Forms.ToolStripButton helpToolStripButton;
+		private System.Windows.Forms.ToolStripMenuItem deleteMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem editMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem newMenuItem;
+		private System.Windows.Forms.DataGridViewTextBoxColumn iDDataGridViewTextBoxColumn;
+		private System.Windows.Forms.DataGridViewTextBoxColumn fullNameDataGridViewTextBoxColumn;
+		private System.Windows.Forms.DataGridViewTextBoxColumn genderDataGridViewTextBoxColumn;
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/Forms/MainForm.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,77 @@
+using System;
+using System.Windows.Forms;
+
+using BLToolkit.Demo.ObjectModel;
+using BLToolkit.Demo.BusinessLogic;
+
+namespace BLToolkit.Demo.Forms
+{
+	public partial class MainForm : Form
+	{
+		public MainForm()
+		{
+			InitializeComponent();
+
+			personBinder.List = new PersonManager().SelectAll();
+		}
+
+		private void Edit(Person person)
+		{
+			EditPersonForm.Edit(person, delegate(Person p)
+			{
+				new PersonManager().Update(p);
+			});
+		}
+
+		private void personGridView_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
+		{
+			DataGridViewRow row = personGridView.Rows[e.RowIndex];
+
+			Edit((Person)row.DataBoundItem);
+		}
+
+		private void edit_Click(object sender, EventArgs e)
+		{
+			if (personGridView.CurrentRow != null)
+				Edit((Person)personGridView.CurrentRow.DataBoundItem);
+		}
+
+		private void new_Click(object sender, EventArgs e)
+		{
+			Person person = EditPersonForm.EditNew(delegate(Person p)
+			{
+				new PersonManager().Insert(p);
+			});
+
+			if (person != null)
+				personBinder.List.Add(person);
+		}
+
+		private void delete_Click(object sender, EventArgs e)
+		{
+			if (personGridView.CurrentRow != null)
+			{
+				Person person = (Person)personGridView.CurrentRow.DataBoundItem;
+
+				try
+				{
+					UseWaitCursor = true;
+					new PersonManager().Delete(person);
+					UseWaitCursor = false;
+
+					personBinder.List.Remove(person);
+				}
+				catch (Exception ex)
+				{
+					UseWaitCursor = false;
+					MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+				}
+			}
+		}
+
+		private void exit_Click(object sender, EventArgs e)
+		{
+			Close();
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/Forms/MainForm.resx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="personBinder.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="menu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>146, 17</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="newMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAeBJREFUOE+dk81L
+        G1EUxW/+s1IqFOzOXRciLrrR0FAohtSYaNEoxS9cWGpSUBcqoS2BiNGq0ahRtLqRGsIkY1sKJkRFMdZk
+        ZpLT+16MMU7TFi8c7puB+zvnvTdjIa7etyGIruuGaKSVu1Z6zms6pX4maPqd0yJf3C0B+FvZuqbQMRDA
+        wyfN0uifgGKxiAJLM4rI6wUIQPzHpYQ8qG8yQzyjc6YAAqIXKgABKcuUwD0UqAnIcYJs3sBpNo9vqTPY
+        XO8Ri8WqU7gHP0nAl71D7OweIrqtYiWqYmFdRXBVxYdlFX7W6S8D1nZvbYCILffP0XXev3AX55AzCrji
+        9QkDWtvHzADXQCnBykYCYdbSuoL5iIJgWMG+kgGNEGiY1U8Y94fNAEefXwLWNhVEWMsbCuJqBgeJTAkw
+        SBi+agT1ET7ObZkBds+MBIjh1aiCRU4QS/LgtSu9IfRfPAW95hSdLCfrdtnckxLweU3BAivE8b+yu4gs
+        nMVwz3EDXn1/DLtaB7JTdYrnrgkJmI0kr5XA7kEa5GGn7pKrGCYHr1+ybHcAz9rGJCCd1W6UutBwxDrP
+        GTJyW/IR6AXBN7Mk3au+hRa+GmuHj+WtyOlFK0ucetmVrDVuQZxHmfq//Y8/1X1e/gYma0jabNkatwAA
+        AABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="editMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAjBJREFUOE+dk99P
+        klEYx4E7b/obuuiqVVubF11UF6x10VUXWZvXzogi8go1ClotaLksc/FTWwkZK9eciBKrIYTNAketlODl
+        tRhjwEzLpOB9gW/nHHMOX9Zaz/bds3POns/5nuecI5eRMFunQbMoVmmSCZtZ2BhXBFHWoijJTPoOOZvY
+        HhTwt7h2dwJx/wwiyv0Y3tHCNmuI7YB6vY4akVCtoyLWMBfnwdv6AJ0SiWN70a+QN0JMlimJAQoRaxQi
+        4lHEzdZLA93gDu2EUSFDMBjcghhvjzcFUBdPV+/AXG2Da8YOXyCGPs15VtwI6H/GANH5JbyNLWH2DY+P
+        nwrwF8dg/tkOCzpwJqnEYVMrfC9mG4tpM4x/ANQ2Oz+xzpXf4erKCTiggo47jgPDu+DjpjB43ycFGG5t
+        OAhGOITneCxkUzBkTmEIaui/tOGgazcGXzmxVq7irN4hBfTeeMIA4dcpfFjMYTRugxWduL7cjqNj+3Dl
+        pQnRRBHFkkgAdimg2+RhgBABJNMFzAce4+REK45490Dr7cL71DJGAxzy6wRw0SYFXDCOMEAgnMJiuogu
+        jRb3bg7AHwsjupCHezoJt59D7ocAdW8TgNbwkAEmQ2kml2cS9gfj8IZS8JCd3c85jBBlvgtQ9VilDjp1
+        DgYorAtMfGEFiUwe2W+/kFsTkCWFn1crSH4t43SPRQqgndVcHiJybumSE+eI6BqVmjRPRc7f9BboW9h8
+        Xf+am/7K/5n8DcuiWeO3KOM2AAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="deleteMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAF1JREFUOE9jYBgs
+        4D/QITBMjJtAalEAsgEYkkgq8VpCyBCiXYjNO0RrhrkW3TX4vIUzzEgNWLyBSpILKAoDfM4mGJDE+Bmn
+        VwilAeQAwmoIMbYTTOKkhDQpavFbDABDWTnHlh+ydwAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <metadata name="tool.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>266, 17</value>
+  </metadata>
+  <data name="newToolStripButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAeBJREFUOE+dk81L
+        G1EUxW/+s1IqFOzOXRciLrrR0FAohtSYaNEoxS9cWGpSUBcqoS2BiNGq0ahRtLqRGsIkY1sKJkRFMdZk
+        ZpLT+16MMU7TFi8c7puB+zvnvTdjIa7etyGIruuGaKSVu1Z6zms6pX4maPqd0yJf3C0B+FvZuqbQMRDA
+        wyfN0uifgGKxiAJLM4rI6wUIQPzHpYQ8qG8yQzyjc6YAAqIXKgABKcuUwD0UqAnIcYJs3sBpNo9vqTPY
+        XO8Ri8WqU7gHP0nAl71D7OweIrqtYiWqYmFdRXBVxYdlFX7W6S8D1nZvbYCILffP0XXev3AX55AzCrji
+        9QkDWtvHzADXQCnBykYCYdbSuoL5iIJgWMG+kgGNEGiY1U8Y94fNAEefXwLWNhVEWMsbCuJqBgeJTAkw
+        SBi+agT1ET7ObZkBds+MBIjh1aiCRU4QS/LgtSu9IfRfPAW95hSdLCfrdtnckxLweU3BAivE8b+yu4gs
+        nMVwz3EDXn1/DLtaB7JTdYrnrgkJmI0kr5XA7kEa5GGn7pKrGCYHr1+ybHcAz9rGJCCd1W6UutBwxDrP
+        GTJyW/IR6AXBN7Mk3au+hRa+GmuHj+WtyOlFK0ucetmVrDVuQZxHmfq//Y8/1X1e/gYma0jabNkatwAA
+        AABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="editToolStripButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAjBJREFUOE+dk99P
+        klEYx4E7b/obuuiqVVubF11UF6x10VUXWZvXzogi8go1ClotaLksc/FTWwkZK9eciBKrIYTNAketlODl
+        tRhjwEzLpOB9gW/nHHMOX9Zaz/bds3POns/5nuecI5eRMFunQbMoVmmSCZtZ2BhXBFHWoijJTPoOOZvY
+        HhTwt7h2dwJx/wwiyv0Y3tHCNmuI7YB6vY4akVCtoyLWMBfnwdv6AJ0SiWN70a+QN0JMlimJAQoRaxQi
+        4lHEzdZLA93gDu2EUSFDMBjcghhvjzcFUBdPV+/AXG2Da8YOXyCGPs15VtwI6H/GANH5JbyNLWH2DY+P
+        nwrwF8dg/tkOCzpwJqnEYVMrfC9mG4tpM4x/ANQ2Oz+xzpXf4erKCTiggo47jgPDu+DjpjB43ycFGG5t
+        OAhGOITneCxkUzBkTmEIaui/tOGgazcGXzmxVq7irN4hBfTeeMIA4dcpfFjMYTRugxWduL7cjqNj+3Dl
+        pQnRRBHFkkgAdimg2+RhgBABJNMFzAce4+REK45490Dr7cL71DJGAxzy6wRw0SYFXDCOMEAgnMJiuogu
+        jRb3bg7AHwsjupCHezoJt59D7ocAdW8TgNbwkAEmQ2kml2cS9gfj8IZS8JCd3c85jBBlvgtQ9VilDjp1
+        DgYorAtMfGEFiUwe2W+/kFsTkCWFn1crSH4t43SPRQqgndVcHiJybumSE+eI6BqVmjRPRc7f9BboW9h8
+        Xf+am/7K/5n8DcuiWeO3KOM2AAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="deleteToolStripButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAF1JREFUOE9jYBgs
+        4D/QITBMjJtAalEAsgEYkkgq8VpCyBCiXYjNO0RrhrkW3TX4vIUzzEgNWLyBSpILKAoDfM4mGJDE+Bmn
+        VwilAeQAwmoIMbYTTOKkhDQpavFbDABDWTnHlh+ydwAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="helpToolStripButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAhhJREFUOE+1U09r
+        E0EU70fIR9iPUBQ8eMrR46IN5JhCDz2oBA8SBHEpCMFgG5GiwdJdq2Ijqe6ldo3Wrmhri0gXazW2YbMt
+        UdNmm45ulf7R/HwzU1hLIzn54LFvhvn9eW9nOjr+R0wvBLhTXEf6bgV9w0sYLJQx/uoz2mq9c7eRn2pA
+        L67Bq+/i29YeWLBL9Q6u5ktI6w6Kr1dbE3HwA3sT/o8mbAfQRgE1LZPXtsPgbjZxaXAG4y/Kh0m48sbP
+        JgwbiKYAwwLYNkR4DEje5HsMFSI5l3l2kGD6/RYezzeEMgfzwzzMWSCRlV9OFk0xqhl06wNy+Tchyb2n
+        dXxhv4TVaFLazppAJ9VKL0MySxYoVI0hkXaw5AbovjAWEmTur4qBqZoEdfbKVCgTBObqdolBUW0ocRs1
+        P8Cx2PWQ4PJtl6a9J+xLIB1OMHIilU2b1gSMqCZ9TdTq33FEHQgJcg8rWPF3qHcJVOKeyOyoJIioDqUk
+        UFM2SuUqus4YIcHEzFdYji8GxIGROAc41JJHc6E1B58wRRqWhzFrEVduTR78E5mRBSz7v0l1H0AgXgsH
+        +2DNcPBp3cep0/rhezA5V0Vfbg5ug+4CqaiaI/rmyWu+t1zdQIysDxdmW9/GiZcVnO+fgvHkI+YXV7BG
+        067VA9Ezt91Fyvq/wH8/lKHCW/RcfITj8Rs4evIaYmdHkBl63v4xtX1tLQ78AZ3a8qxOv4hDAAAAAElF
+        TkSuQmCC
+</value>
+  </data>
+</root>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/Forms/ObjectViews/PersonView.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,27 @@
+using System;
+
+using BLToolkit.ComponentModel;
+
+using BLToolkit.Demo.ObjectModel;
+
+namespace BLToolkit.Demo.Forms.ObjectViews
+{
+	public class PersonView : IObjectView
+	{
+		#region IObjectView Members
+
+		private Person _person;
+		object IObjectView.Object
+		{
+			get { return _person; }
+			set { _person = (Person)value; }
+		}
+
+		#endregion
+
+		public string FormTitle
+		{
+			get { return _person.ID > 0? _person.FullName: "New Person"; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/ObjectModel/BizEntity.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,32 @@
+using System;
+
+using BLToolkit.DataAccess;
+using BLToolkit.EditableObjects;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Demo.ObjectModel
+{
+	public abstract class BizEntity : EditableObject
+	{
+		[PrimaryKey(0), NonUpdatable]
+		public abstract int ID { get; protected internal set; }
+
+		public virtual BizEntity CopyTo(BizEntity obj)
+		{
+			Map.ObjectToObject(this, obj);
+
+			return obj;
+		}
+
+		public virtual BizEntity Clone()
+		{
+			BizEntity obj = (BizEntity)TypeAccessor.CreateInstanceEx(GetType());
+
+			CopyTo(obj);
+			obj.AcceptChanges();
+
+			return obj;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/ObjectModel/Gender.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,14 @@
+using System;
+
+using BLToolkit.Mapping;
+
+namespace BLToolkit.Demo.ObjectModel
+{
+	public enum Gender
+	{
+		[MapValue("F")] Female,
+		[MapValue("M")] Male,
+		[MapValue("U")] Unknown,
+		[MapValue("O")] Other
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/ObjectModel/Person.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,27 @@
+using System;
+
+using BLToolkit.Mapping;
+using BLToolkit.Validation;
+
+namespace BLToolkit.Demo.ObjectModel
+{
+	[MapField("PersonID", "ID")]
+	public abstract class Person : BizEntity
+	{
+		[MaxLength(50), Required] public abstract string LastName   { get; set; }
+		[MaxLength(50), Required] public abstract string FirstName  { get; set; }
+		[MaxLength(50)]           public abstract string MiddleName { get; set; }
+		                          public abstract Gender Gender     { get; set; }
+
+		[MapIgnore]
+		public string FullName
+		{
+			get
+			{
+				return string.Format(
+					string.IsNullOrEmpty(MiddleName)? "{2}, {0}": "{2}, {0} {1}.",
+					FirstName, MiddleName, LastName);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/Program.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,28 @@
+using System;
+using System.Windows.Forms;
+
+using BLToolkit.Demo.Forms;
+
+namespace BLToolkit.Demo
+{
+	static class Program
+	{
+		[STAThread]
+		static void Main()
+		{
+			Application.EnableVisualStyles();
+			Application.SetCompatibleTextRenderingDefault(false);
+
+			MainForm form = new MainForm();
+
+			ToolStripManager.LoadSettings(form, "BLToolkit.Demo");
+
+			form.FormClosing += delegate
+			{
+				ToolStripManager.SaveSettings(form, "BLToolkit.Demo");
+			};
+
+			Application.Run(form);
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,28 @@
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("BLToolkit.Demo")]
+[assembly: AssemblyProduct("BLToolkit.Demo")]
+[assembly: AssemblyCopyright("\xA9 2002-2012 www.bltoolkit.net")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("dd989791-7b52-4271-b3c1-e1a2d1eb85e9")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/Properties/DataSources/BLToolkit.Demo.Forms.ObjectViews.PersonView.datasource	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    This file is automatically generated by Visual Studio .Net. It is 
+    used to store generic object data source configuration information.  
+    Renaming the file extension or editing the content of this file may   
+    cause the file to be unrecognizable by the program.
+-->
+<GenericObjectDataSource DisplayName="PersonView" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+   <TypeInfo>BLToolkit.Demo.Forms.ObjectViews.PersonView, BLToolkit.Demo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
+</GenericObjectDataSource>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/Properties/DataSources/BLToolkit.Demo.ObjectModel.Gender.datasource	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    This file is automatically generated by Visual Studio .Net. It is 
+    used to store generic object data source configuration information.  
+    Renaming the file extension or editing the content of this file may   
+    cause the file to be unrecognizable by the program.
+-->
+<GenericObjectDataSource DisplayName="Gender" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+   <TypeInfo>BLToolkit.Demo.ObjectModel.Gender, BLToolkit.Demo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
+</GenericObjectDataSource>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/Properties/DataSources/BLToolkit.Demo.ObjectModel.Person.datasource	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    This file is automatically generated by Visual Studio .Net. It is 
+    used to store generic object data source configuration information.  
+    Renaming the file extension or editing the content of this file may   
+    cause the file to be unrecognizable by the program.
+-->
+<GenericObjectDataSource DisplayName="Person" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+   <TypeInfo>BLToolkit.Demo.ObjectModel.Person, BLToolkit.Demo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
+</GenericObjectDataSource>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/Properties/Resources.Designer.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,63 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.1
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace BLToolkit.Demo.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("BLToolkit.Demo.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/Properties/Resources.resx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+</root>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/Properties/Settings.Designer.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,26 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.1
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace BLToolkit.Demo.Properties {
+    
+    
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+        
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+        
+        public static Settings Default {
+            get {
+                return defaultInstance;
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Demo/WinForms/Properties/Settings.settings	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Documentation/BLToolkit.ndoc	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,55 @@
+<project SchemaVersion="1.3">
+    <assemblies>
+        <assembly location="..\Source\bin\Debug\BLToolkit.dll" documentation="..\Source\bin\Debug\BLToolkit.xml" />
+    </assemblies>
+    <namespaces>
+        <namespace name="BLToolkit.Reflection.Emit">The <b>BLToolkit.Reflection.Emit</b> namespace contains helpers and wrappers around System.Reflection.Emit namespace classes.</namespace>
+    </namespaces>
+    <documenters>
+        <documenter name="JavaDoc">
+            <property name="OutputDirectory" value=".\doc\" />
+        </documenter>
+        <documenter name="LaTeX">
+            <property name="OutputDirectory" value=".\doc\" />
+            <property name="TextFileFullName" value="Documentation.tex" />
+            <property name="TexFileBaseName" value="Documentation" />
+            <property name="LatexCompiler" value="latex" />
+            <property name="TexFileFullPath" value=".\doc\Documentation.tex" />
+        </documenter>
+        <documenter name="LinearHtml">
+            <property name="OutputDirectory" value=".\doc\" />
+            <property name="Title" value="An NDoc Documented Class Library" />
+        </documenter>
+        <documenter name="MSDN">
+            <property name="OutputDirectory" value=".\doc\" />
+            <property name="HtmlHelpName" value="BLToolkit" />
+            <property name="Title" value="Business Logic Toolkit" />
+            <property name="IncludeFavorites" value="True" />
+            <property name="RootPageContainsNamespaces" value="True" />
+            <property name="AdditionalContentResourceDirectory" value=".\Content\" />
+            <property name="ShowMissingSummaries" value="True" />
+            <property name="ShowMissingRemarks" value="True" />
+            <property name="ShowMissingParams" value="True" />
+            <property name="ShowMissingReturns" value="True" />
+            <property name="ShowMissingValues" value="True" />
+            <property name="CopyrightText" value="&amp;copy; 2002-2005 www.bltoolkit.net" />
+            <property name="CopyrightHref" value="http://www.bltoolkit.net" />
+            <property name="FeedbackEmailAddress" value="support@bltoolkit.net" />
+            <property name="UseNamespaceDocSummaries" value="True" />
+            <property name="IncludeDefaultThreadSafety" value="False" />
+            <property name="CleanIntermediates" value="True" />
+        </documenter>
+        <documenter name="MSDN 2003">
+            <property name="OutputDirectory" value=".\doc\" />
+            <property name="Title" value="An NDoc Documented Class Library" />
+        </documenter>
+        <documenter name="VS.NET 2003">
+            <property name="OutputDirectory" value=".\doc\" />
+            <property name="HtmlHelpName" value="Documentation" />
+            <property name="Title" value="An NDoc documented library" />
+        </documenter>
+        <documenter name="XML">
+            <property name="OutputFile" value=".\doc\doc.xml" />
+        </documenter>
+    </documenters>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/CS/Examples.CS.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{34989C73-F82A-4905-9349-D0CF1419CD1C}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Examples.CS</RootNamespace>
+    <AssemblyName>Examples.CS</AssemblyName>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkProfile />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\Examples.CS.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\Examples.CS.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework, Version=2.6.3.13283, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\NUnit.2.6.3\lib\nunit.framework.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Reflection.Emit\HelloWorld.cs" />
+    <Compile Include="Reflection.Emit\HelloWorldNormal.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="packages.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/CS/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,30 @@
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Examples.CS.2")]
+[assembly: AssemblyProduct("Examples.CS.2")]
+[assembly: AssemblyCopyright("\xA9 2002-2012 www.bltoolkit.net")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM componenets.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("da3e2397-3b38-42d4-b3ac-782ecef311c9")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion    ("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/CS/Reflection.Emit/HelloWorld.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,48 @@
+//@ example:
+//@ emit Emit
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Reflection;
+using BLToolkit.Reflection.Emit;
+
+namespace Examples.Reflection.Emit
+{
+	[TestFixture]
+	public class HelloWorld
+	{
+		public interface IHello
+		{
+			void SayHello(string toWhom);
+		}
+
+		[Test]
+		public void Test()
+		{
+			EmitHelper emit = new AssemblyBuilderHelper("HelloWorld.dll")
+				.DefineType  ("Hello", typeof(object), typeof(IHello))
+				.DefineMethod(typeof(IHello).GetMethod("SayHello"))
+				.Emitter;
+
+			/*[a]*/emit/*[/a]*/
+				// string.Format("Hello, {0}!", toWhom)
+				//
+				./*[a]*/ldstr/*[/a]*/   ("Hello, {0}!")
+				./*[a]*/ldarg_1/*[/a]*/
+				./*[a]*/call/*[/a]*/    (typeof(string), "Format", typeof(string), typeof(object))
+
+				// Console.WriteLine("Hello, World!");
+				//
+				./*[a]*/call/*[/a]*/    (typeof(Console), "WriteLine", typeof(string))
+				./*[a]*/ret/*[/a]*/()
+				;
+
+			Type type = emit.Method.Type.Create();
+
+			IHello hello = (IHello)TypeAccessor.CreateInstance(type);
+
+			hello.SayHello("World");
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/CS/Reflection.Emit/HelloWorldNormal.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,63 @@
+using System;
+using System.Reflection;
+using System.Reflection.Emit;
+using System.Threading;
+
+using NUnit.Framework;
+
+namespace Examples.Reflection.Emit
+{
+	[TestFixture]
+	public class HelloWorldNormal
+	{
+		public interface IHello
+		{
+			void SayHello(string toWhom);
+		}
+
+		[Test]
+		public void Test()
+		{
+			AssemblyName asmName = new AssemblyName();
+
+			asmName.Name = "HelloWorld";
+
+			AssemblyBuilder asmBuilder =
+				Thread.GetDomain().DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndSave);
+
+			ModuleBuilder   modBuilder  = asmBuilder.DefineDynamicModule("HelloWorld");
+
+			TypeBuilder     typeBuilder = modBuilder.DefineType(
+				"Hello",
+				TypeAttributes.Public,
+				typeof(object),
+				new Type[] { typeof(IHello) });
+
+			MethodBuilder   methodBuilder = typeBuilder.DefineMethod("SayHello", 
+									MethodAttributes.Private | MethodAttributes.Virtual,
+									typeof(void), 
+									new Type[] { typeof(string) });
+
+			typeBuilder.DefineMethodOverride(methodBuilder, typeof(IHello).GetMethod("SayHello"));
+
+			ILGenerator il = methodBuilder.GetILGenerator();
+
+			// string.Format("Hello, {0} World!", toWhom)
+			//
+			/*[a]*/il.Emit/*[/a]*/(OpCodes.Ldstr, "Hello, {0} World!");
+			/*[a]*/il.Emit/*[/a]*/(OpCodes.Ldarg_1);
+			/*[a]*/il.Emit/*[/a]*/(OpCodes.Call, typeof(string).GetMethod("Format", new Type[] { typeof(string), typeof(object) }));
+
+			// Console.WriteLine("Hello, World!");
+			//
+			/*[a]*/il.Emit/*[/a]*/(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
+			/*[a]*/il.Emit/*[/a]*/(OpCodes.Ret);
+
+			Type   type  = typeBuilder.CreateType();
+
+			IHello hello = (IHello)Activator.CreateInstance(type);
+
+			hello.SayHello("Emit");
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/CS/packages.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="NUnit" version="2.6.3" targetFramework="net40" />
+</packages>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/Cpp/AssemblyInfo.cpp	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,40 @@
+#include "stdafx.h"
+
+using namespace System;
+using namespace System::Reflection;
+using namespace System::Runtime::CompilerServices;
+using namespace System::Runtime::InteropServices;
+using namespace System::Security::Permissions;
+
+//
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+//
+[assembly:AssemblyTitleAttribute("ExamplesCpp")];
+[assembly:AssemblyDescriptionAttribute("")];
+[assembly:AssemblyConfigurationAttribute("")];
+[assembly:AssemblyCompanyAttribute("")];
+[assembly:AssemblyProductAttribute("ExamplesCpp")];
+[assembly:AssemblyCopyrightAttribute("Copyright (c)  2013")];
+[assembly:AssemblyTrademarkAttribute("")];
+[assembly:AssemblyCultureAttribute("")];
+
+//
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version
+//      Build Number
+//      Revision
+//
+// You can specify all the value or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+
+[assembly:AssemblyVersionAttribute("1.0.*")];
+
+[assembly:ComVisible(false)];
+
+[assembly:CLSCompliantAttribute(true)];
+
+[assembly:SecurityPermission(SecurityAction::RequestMinimum, UnmanagedCode = true)];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/Cpp/Examples.Cpp.cpp	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,6 @@
+// This is the main DLL file.
+
+#include "stdafx.h"
+
+#include "Examples.Cpp.h"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/Cpp/Examples.Cpp.h	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,13 @@
+// Examples.Cpp.h
+
+#pragma once
+
+using namespace System;
+
+namespace ExamplesCpp {
+
+	public ref class Class1
+	{
+		// TODO: Add your methods for this class here.
+	};
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/Cpp/Examples.Cpp.vcxproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{9D063CAA-4C44-4C5E-9C9E-74EFA4049FEC}</ProjectGuid>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <Keyword>ManagedCProj</Keyword>
+    <RootNamespace>ExamplesCpp</RootNamespace>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v110</PlatformToolset>
+    <CLRSupport>true</CLRSupport>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v110</PlatformToolset>
+    <CLRSupport>true</CLRSupport>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <LinkIncremental>true</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <LinkIncremental>false</LinkIncremental>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+    </ClCompile>
+    <Link>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies />
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <PreprocessorDefinitions>WIN32;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+    </ClCompile>
+    <Link>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies />
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework">
+      <HintPath>..\..\packages\NUnit.2.6.3\lib\nunit.framework.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="Examples.Cpp.h" />
+    <ClInclude Include="resource.h" />
+    <ClInclude Include="Stdafx.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="AssemblyInfo.cpp" />
+    <ClCompile Include="Examples.Cpp.cpp" />
+    <ClCompile Include="HelloWorld.cpp" />
+    <ClCompile Include="Stdafx.cpp">
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <Text Include="ReadMe.txt" />
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="app.rc" />
+  </ItemGroup>
+  <ItemGroup>
+    <Image Include="app.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0c325f5d-e50e-4340-8724-d29896ccc583}</Project>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/Cpp/Examples.Cpp.vcxproj.filters	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Source Files">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="Header Files">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+    </Filter>
+    <Filter Include="Resource Files">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="Examples.Cpp.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="Stdafx.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="resource.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="Examples.Cpp.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="AssemblyInfo.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="Stdafx.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="HelloWorld.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <Text Include="ReadMe.txt" />
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="app.rc">
+      <Filter>Resource Files</Filter>
+    </ResourceCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <Image Include="app.ico">
+      <Filter>Resource Files</Filter>
+    </Image>
+  </ItemGroup>
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/Cpp/HelloWorld.cpp	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,57 @@
+//@ example:
+//@ emit Emit
+#include "stdafx.h"
+
+using namespace System;
+
+using namespace NUnit::Framework;
+
+using namespace BLToolkit::Reflection;
+using namespace BLToolkit::Reflection::Emit;
+
+namespace Examples {
+namespace Reflection {
+namespace Emit
+{
+	[TestFixture]
+	public ref class HelloWorld
+	{
+	public:
+
+		interface class IHello
+		{
+			void SayHello(String ^toWhom);
+		};
+
+		[Test]
+		void Test()
+		{
+			AssemblyBuilderHelper ^assembly = gcnew AssemblyBuilderHelper("HelloWorld.dll");
+			
+			EmitHelper ^emit = assembly
+				->DefineType  ("Hello", Object::typeid, IHello::typeid)
+				->DefineMethod(IHello::typeid->GetMethod("SayHello"))
+				->Emitter;
+
+			emit
+				// string.Format("Hello, {0} World!", toWhom)
+				//
+				->ldstr   ("Hello, {0} World!")
+				->ldarg_1
+				->call    (String::typeid, "Format", String::typeid, Object::typeid)
+
+				// Console.WriteLine("Hello, World!");
+				//
+				->call    (Console::typeid, "WriteLine", String::typeid)
+				->ret()
+				;
+
+			Type ^type = emit->Method->Type->Create();
+
+			IHello ^hello = (IHello^)TypeAccessor::CreateInstance(type);
+
+			hello->SayHello("C++");
+		}
+	};
+}}}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/Cpp/ReadMe.txt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,38 @@
+========================================================================
+    DYNAMIC LINK LIBRARY : Examples.Cpp Project Overview
+========================================================================
+
+AppWizard has created this Examples.Cpp DLL for you.  
+
+This file contains a summary of what you will find in each of the files that
+make up your Examples.Cpp application.
+
+Examples.Cpp.vcxproj
+    This is the main project file for VC++ projects generated using an Application Wizard. 
+    It contains information about the version of Visual C++ that generated the file, and 
+    information about the platforms, configurations, and project features selected with the
+    Application Wizard.
+
+Examples.Cpp.vcxproj.filters
+    This is the filters file for VC++ projects generated using an Application Wizard. 
+    It contains information about the association between the files in your project 
+    and the filters. This association is used in the IDE to show grouping of files with
+    similar extensions under a specific node (for e.g. ".cpp" files are associated with the
+    "Source Files" filter).
+
+Examples.Cpp.cpp
+    This is the main DLL source file.
+
+Examples.Cpp.h
+    This file contains a class declaration.
+
+AssemblyInfo.cpp
+	Contains custom attributes for modifying assembly metadata.
+
+/////////////////////////////////////////////////////////////////////////////
+Other notes:
+
+AppWizard uses "TODO:" to indicate parts of the source code you
+should add to or customize.
+
+/////////////////////////////////////////////////////////////////////////////
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/Cpp/Stdafx.cpp	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,5 @@
+// stdafx.cpp : source file that includes just the standard includes
+// Examples.Cpp.pch will be the pre-compiled header
+// stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/Cpp/Stdafx.h	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,7 @@
+// stdafx.h : include file for standard system include files,
+// or project specific include files that are used frequently,
+// but are changed infrequently
+
+#pragma once
+
+
Binary file Examples/Cpp/app.ico has changed
Binary file Examples/Cpp/app.rc has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/Cpp/resource.h	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,3 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by app.rc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/Nemerle/Examples.Nemerle.2.nproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,68 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <NoStdLib>true</NoStdLib>
+    <Nemerle Condition=" '$(Nemerle)' == '' ">$(ProgramFiles)\Nemerle</Nemerle>
+  </PropertyGroup>
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <Name>"Examples.Nemerle.2"</Name>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{f8f33d46-a839-409b-9fcb-c41a514358f8}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <RootNamespace>Examples.Nemerle.2</RootNamespace>
+    <AssemblyName>Examples.Nemerle.2</AssemblyName>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="mscorlib" />
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+    <Reference Include="$(Nemerle)\Nemerle.dll" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Main.n" />
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="Properties\" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.2.csproj">
+      <Name>BLToolkit.2</Name>
+      <Project>{0c325f5d-e50e-4340-8724-d29896ccc583}</Project>
+      <Private>True</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="app.config">
+      <SubType>Content</SubType>
+    </Content>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <Import Project="$(Nemerle)\Nemerle.MSBuild.targets" />
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/Nemerle/Main.n	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,47 @@
+using System.Console;
+using BLToolkit.Data;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+
+namespace Test
+{
+  public enum Gender
+  {
+    [MapValue("F")] | Female
+    [MapValue("M")] | Male
+    [MapValue("U")] | Unknown
+    [MapValue("O")] | Other
+  }
+
+  [MapField("PersonID", "ID")]
+  public class Person
+  {
+    public mutable PersonID    : int;
+    public mutable FirstName   : string;
+    public mutable LastName    : string;
+    public mutable MiddleName  : string;
+    public mutable Gender      : Gender;
+  }
+
+  module Program
+  {
+    Main() : void
+    {
+      def p = Person();
+      p.FirstName = "John";
+      p.LastName  = "Pupkin";
+
+      using (db = DbManager())
+      {
+        def p = db
+          .SetSpCommand("Person_SelectByName", db.CreateParameters(p))
+          .ExecuteObject() : Person;
+
+        TypeAccessor.WriteConsole(p);
+      }
+
+        WriteLine("Press enter to continue...");
+        _ = ReadLine();
+    }
+  }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/Nemerle/app.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+	<appSettings>
+		<!-- Default configuration -->
+		<add
+			key   = "ConnectionString"
+			value = "Server=.;Database=BLToolkitData;Integrated Security=SSPI"/>
+		<!-- SQL Server Development configuration -->
+		<add
+			key   = "ConnectionString.Development"
+			value = "Server=.;Database=BLToolkitData;Integrated Security=SSPI"/>
+		<!-- SQL Server Production configuration -->
+		<add
+			key   = "ConnectionString.Production"
+			value = "Server=.;Database=BLToolkitData;Integrated Security=SSPI"/>
+		<!-- SQL Server configuration -->
+		<add
+			key   = "ConnectionString.Sql"
+			value = "Server=.;Database=BLToolkitData;Integrated Security=SSPI"/>
+		<!-- Oracle configuration -->
+		<add
+			key   = "ConnectionString.Oracle"
+			value = "User Id=/;Data Source=BLToolkitData"/>
+		<!-- OLEDB configuration -->
+		<add
+			key   = "ConnectionString.OleDb"
+			value = "Provider=SQLNCLI.1;Data Source=.;Integrated Security=SSPI;Initial Catalog=BLToolkitData"/>
+		<!-- OLEDB Development configuration -->
+		<add
+			key   = "ConnectionString.OleDb.Development"
+			value = "Provider=SQLNCLI.1;Data Source=.;Integrated Security=SSPI;Initial Catalog=BLToolkitData"/>
+		<!-- OLEDB Production configuration -->
+		<add
+			key   = "ConnectionString.OleDb.Production"
+			value = "Provider=SQLNCLI.1;Data Source=.;Integrated Security=SSPI;Initial Catalog=BLToolkitData"/>
+		<!-- Additional data providers -->
+		<add
+			key   = "BLToolkit.DataProviders"
+			value = "BLToolkit.Data.DataProvider.OracleDataProvider"/>
+
+		<!-- Samples
+		<add
+			key   = "BLToolkit.DataProviders"
+			value = "BLToolkit.Data.DataProvider.OracleDataProvider;SomeNamespace.SomeType, SomeAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1234567890ABCDEF"/>
+		<add
+			key   = "BLToolkit.DefaultConfiguration"
+			value = "Oracle"/>
+		-->
+	</appSettings>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/VB/AssemblyInfo.vb	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,32 @@
+Imports System
+Imports System.Reflection
+Imports System.Runtime.InteropServices
+
+' General Information about an assembly is controlled through the following 
+' set of attributes. Change these attribute values to modify the information
+' associated with an assembly.
+
+' Review the values of the assembly attributes
+
+<Assembly: AssemblyTitle("")> 
+<Assembly: AssemblyDescription("")> 
+<Assembly: AssemblyCompany("")> 
+<Assembly: AssemblyProduct("")> 
+<Assembly: AssemblyCopyright("")> 
+<Assembly: AssemblyTrademark("")> 
+<Assembly: CLSCompliant(True)> 
+
+'The following GUID is for the ID of the typelib if this project is exposed to COM
+<Assembly: Guid("77CEAFAA-FE6B-445B-A4BF-AA457A5F2D35")> 
+
+' Version information for an assembly consists of the following four values:
+'
+'      Major Version
+'      Minor Version 
+'      Build Number
+'      Revision
+'
+' You can specify all the values or you can default the Build and Revision Numbers 
+' by using the '*' as shown below:
+
+<Assembly: AssemblyVersion("1.0.*")> 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/VB/Examples.VB.vbproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,187 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{308A4189-53AB-460D-B2B1-0EB4B9219654}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <RootNamespace>
+    </RootNamespace>
+    <AssemblyName>Examples.VB</AssemblyName>
+    <MyType>Windows</MyType>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkProfile />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <DefineDebug>true</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DocumentationFile>Examples.VB.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022,42353,42354,42355</NoWarn>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <DefineDebug>false</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DocumentationFile>Examples.VB.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022,42353,42354,42355</NoWarn>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <DefineDebug>true</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DocumentationFile>Examples.VB.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022,42353,42354,42355</NoWarn>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\Examples.VB.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.vb</CodeAnalysisModuleSuppressionsFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <DefineTrace>true</DefineTrace>
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DocumentationFile>Examples.VB.xml</DocumentationFile>
+    <Optimize>true</Optimize>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022,42353,42354,42355</NoWarn>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\Examples.VB.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.vb</CodeAnalysisModuleSuppressionsFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework, Version=2.6.3.13283, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\NUnit.2.6.3\lib\nunit.framework.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Import Include="Microsoft.VisualBasic" />
+    <Import Include="System" />
+    <Import Include="System.Collections" />
+    <Import Include="System.Collections.Generic" />
+    <Import Include="System.Data" />
+    <Import Include="System.Diagnostics" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="OverloadWithDefValue.vb" />
+    <Compile Include="My Project\AssemblyInfo.vb" />
+    <Compile Include="My Project\Application.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Application.myapp</DependentUpon>
+    </Compile>
+    <Compile Include="My Project\Resources.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="My Project\Settings.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+    <Compile Include="Reflection.Emit\HelloWorld.vb" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="My Project\Resources.resx">
+      <Generator>VbMyResourcesResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.vb</LastGenOutput>
+      <CustomToolNamespace>My.Resources</CustomToolNamespace>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="My Project\Application.myapp">
+      <Generator>MyApplicationCodeGenerator</Generator>
+      <LastGenOutput>Application.Designer.vb</LastGenOutput>
+    </None>
+    <None Include="My Project\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.vb</LastGenOutput>
+    </None>
+    <None Include="packages.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.VisualBasic.targets" />
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/VB/My Project/Application.Designer.vb	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,13 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.1
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/VB/My Project/Application.myapp	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<MyApplicationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <MySubMain>false</MySubMain>
+  <SingleInstance>false</SingleInstance>
+  <ShutdownMode>0</ShutdownMode>
+  <EnableVisualStyles>true</EnableVisualStyles>
+  <AuthenticationMode>0</AuthenticationMode>
+  <ApplicationType>1</ApplicationType>
+  <SaveMySettingsOnExit>true</SaveMySettingsOnExit>
+</MyApplicationData>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/VB/My Project/AssemblyInfo.vb	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,37 @@
+Imports System
+Imports System.Reflection
+Imports System.Runtime.InteropServices
+
+' General Information about an assembly is controlled through the following 
+' set of attributes. Change these attribute values to modify the information
+' associated with an assembly.
+
+' Review the values of the assembly attributes
+
+<Assembly: AssemblyTitle("Examples.VB.2")> 
+<Assembly: AssemblyDescription("")> 
+<Assembly: AssemblyCompany("")> 
+<Assembly: AssemblyProduct("Examples.VB.2")> 
+<Assembly: AssemblyCopyright("Copyright   2005")> 
+<Assembly: AssemblyTrademark("")> 
+
+<Assembly: CLSCompliant(True)> 
+
+<Assembly: ComVisible(False)>
+
+'The following GUID is for the ID of the typelib if this project is exposed to COM
+<Assembly: Guid("e0af9647-1fd3-4514-9ab8-1ae39bb81fca")> 
+
+' Version information for an assembly consists of the following four values:
+'
+'      Major Version
+'      Minor Version 
+'      Build Number
+'      Revision
+'
+' You can specify all the values or you can default the Build and Revision Numbers 
+' by using the '*' as shown below:
+' <Assembly: AssemblyVersion("1.0.*")> 
+
+<Assembly: AssemblyVersion("1.0.0.0")> 
+<Assembly: AssemblyFileVersion("1.0.0.0")> 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/VB/My Project/Resources.Designer.vb	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,63 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.1
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+Imports System
+
+Namespace My.Resources
+    
+    'This class was auto-generated by the StronglyTypedResourceBuilder
+    'class via a tool like ResGen or Visual Studio.
+    'To add or remove a member, edit your .ResX file then rerun ResGen
+    'with the /str option, or rebuild your VS project.
+    '''<summary>
+    '''  A strongly-typed resource class, for looking up localized strings, etc.
+    '''</summary>
+    <Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0"),  _
+     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _
+     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(),  _
+     Global.Microsoft.VisualBasic.HideModuleNameAttribute()>  _
+    Friend Module Resources
+        
+        Private resourceMan As Global.System.Resources.ResourceManager
+        
+        Private resourceCulture As Global.System.Globalization.CultureInfo
+        
+        '''<summary>
+        '''  Returns the cached ResourceManager instance used by this class.
+        '''</summary>
+        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)>  _
+        Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
+            Get
+                If Object.ReferenceEquals(resourceMan, Nothing) Then
+                    Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("Resources", GetType(Resources).Assembly)
+                    resourceMan = temp
+                End If
+                Return resourceMan
+            End Get
+        End Property
+        
+        '''<summary>
+        '''  Overrides the current thread's CurrentUICulture property for all
+        '''  resource lookups using this strongly typed resource class.
+        '''</summary>
+        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)>  _
+        Friend Property Culture() As Global.System.Globalization.CultureInfo
+            Get
+                Return resourceCulture
+            End Get
+            Set
+                resourceCulture = value
+            End Set
+        End Property
+    End Module
+End Namespace
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/VB/My Project/Resources.resx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/VB/My Project/Settings.Designer.vb	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,71 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.1
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+
+
+<Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(),  _
+ Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0"),  _
+ Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)>  _
+Partial Friend NotInheritable Class Settings
+    Inherits Global.System.Configuration.ApplicationSettingsBase
+    
+    Private Shared defaultInstance As Settings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New Settings()),Settings)
+    
+#Region "My.Settings Auto-Save Functionality"
+#If _MyType = "WindowsForms" Then
+    Private Shared addedHandler As Boolean
+
+    Private Shared addedHandlerLockObject As New Object
+
+    <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+    Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs)
+        If My.Application.SaveMySettingsOnExit Then
+            My.Settings.Save()
+        End If
+    End Sub
+#End If
+#End Region
+    
+    Public Shared ReadOnly Property [Default]() As Settings
+        Get
+            
+#If _MyType = "WindowsForms" Then
+               If Not addedHandler Then
+                    SyncLock addedHandlerLockObject
+                        If Not addedHandler Then
+                            AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
+                            addedHandler = True
+                        End If
+                    End SyncLock
+                End If
+#End If
+            Return defaultInstance
+        End Get
+    End Property
+End Class
+
+Namespace My
+    
+    <Global.Microsoft.VisualBasic.HideModuleNameAttribute(),  _
+     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _
+     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute()>  _
+    Friend Module MySettingsProperty
+        
+        <Global.System.ComponentModel.Design.HelpKeywordAttribute("My.Settings")>  _
+        Friend ReadOnly Property Settings() As Global.Settings
+            Get
+                Return Global.Settings.Default
+            End Get
+        End Property
+    End Module
+End Namespace
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/VB/My Project/Settings.settings	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/VB/OverloadWithDefValue.vb	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,40 @@
+''@ example:
+''@ emit Emit
+Imports System
+Imports BLToolkit.Aspects
+Imports NUnit.Framework
+
+Imports BLToolkit.Reflection
+
+Namespace Examples
+
+	<TestFixture()> _
+	Public Class OverloadWithDefValue
+
+		Public MustInherit Class TestObject
+
+			Public Sub TestMethod( _
+			 ByVal passthrough As Integer, _
+			 Optional ByVal strVal As String = "str", _
+			 Optional ByVal intVal As Integer = 123)
+				Assert.AreEqual(321, passthrough)
+				Assert.AreEqual("str", strVal)
+				Assert.AreEqual(123, intVal)
+			End Sub
+
+			<Overload()> _
+			Public MustOverride Sub TestMethod( _
+			 ByVal passthrough As Integer, _
+			 ByVal dateVal As Date)
+
+		End Class
+
+		<Test()> _
+		Sub Test()
+			Dim o As TestObject = TypeAccessor(Of TestObject).CreateInstance
+			o.TestMethod(321, Today)
+		End Sub
+
+	End Class
+
+End Namespace
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/VB/Reflection.Emit/HelloWorld.vb	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,47 @@
+''@ example:
+''@ emit Emit
+Imports System
+Imports NUnit.Framework
+
+Imports BLToolkit.Reflection
+Imports BLToolkit.Reflection.Emit
+
+Namespace Examples.Reflection.Emit
+
+    <TestFixture()> _
+    Public Class HelloWorld
+
+        Public Interface IHello
+            Sub SayHello(ByVal toWhom As String)
+        End Interface
+
+        <Test()> _
+        Sub Test()
+            Dim assemblyHelper As AssemblyBuilderHelper = New AssemblyBuilderHelper("HelloWorld.dll")
+            Dim typeHelper As TypeBuilderHelper = assemblyHelper.DefineType("Hello", GetType(Object), GetType(IHello))
+            Dim methodHelper As MethodBuilderHelper = typeHelper.DefineMethod(GetType(IHello).GetMethod("SayHello"))
+            Dim emit As EmitHelper = methodHelper.Emitter
+
+            ' string.Format("Hello, {0} World!", toWhom)
+            '
+            emit _
+            .ldstr("Hello, {0} World!") _
+            .ldarg_1 _
+            .call(GetType(String), "Format", GetType(String), GetType(Object))
+
+            ' Console.WriteLine("Hello, World!");
+            '
+            emit _
+            .call(GetType(Console), "WriteLine", GetType(String)) _
+            .ret()
+
+            Dim type As Type = typeHelper.Create()
+
+            Dim hello As IHello = TypeAccessor.CreateInstance(type)
+
+            hello.SayHello("VB")
+        End Sub
+
+    End Class
+
+End Namespace
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/VB/packages.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="NUnit" version="2.6.3" targetFramework="net40" />
+</packages>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/BLToolkit.4.JointureAddOn.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit</RootNamespace>
+    <AssemblyName>BLToolkit.4.JointureAddOn</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;FW4;OVERRIDETOSTRING;</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Castle.Core, Version=3.2.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\Castle.Core.3.2.1\lib\net40-client\Castle.Core.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="DataAccess\FullSqlQuery.cs" />
+    <Compile Include="DataAccess\FullSqlQueryInfo.cs" />
+    <Compile Include="DataAccess\FullSqlQueryParameterInfo.cs" />
+    <Compile Include="DataAccess\FullSqlQueryT.cs" />
+    <Compile Include="Emit\DynamicCompilationSpike.cs" />
+    <Compile Include="Emit\FunctionFactory.cs" />
+    <Compile Include="Mapping\CollectionFullObjectMapper.cs" />
+    <Compile Include="Mapping\NotifyPropertyChangedInterceptor.cs" />
+    <Compile Include="Mapping\DataBindingMappingSchema.cs" />
+    <Compile Include="Mapping\DataBindingObjectMapper.cs" />
+    <Compile Include="Mapping\FactoryType.cs" />
+    <Compile Include="Mapping\FullMappingSchema.cs" />
+    <Compile Include="Mapping\FullObjectMapper.cs" />
+    <Compile Include="Mapping\ILazyMapper.cs" />
+    <Compile Include="Mapping\IMapper.cs" />
+    <Compile Include="Mapping\IObjectMapper.cs" />
+    <Compile Include="Mapping\IPropertiesMapping.cs" />
+    <Compile Include="Mapping\LazyValueLoadInterceptor.cs" />
+    <Compile Include="Mapping\OwnerDescription.cs" />
+    <Compile Include="Mapping\TableDescription.cs" />
+    <Compile Include="Mapping\TypeFactory.cs" />
+    <Compile Include="Mapping\ValueMapper.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="packages.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/DataAccess/FullSqlQuery.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,289 @@
+#region
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using BLToolkit.Aspects;
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Mapping;
+
+#endregion
+
+namespace BLToolkit.DataAccess
+{
+    public class FullSqlQuery : SqlQuery
+    {
+        private readonly bool _ignoreLazyLoad;
+
+        #region Constructors
+
+        public FullSqlQuery(DbManager dbManager, bool ignoreLazyLoad = false, FactoryType factoryType = FactoryType.LazyLoading)
+            : base(dbManager)
+        {
+            dbManager.MappingSchema = new FullMappingSchema(dbManager, ignoreLazyLoad, dbManager.MappingSchema, factoryType);
+
+            _ignoreLazyLoad = ignoreLazyLoad;
+        }
+
+        #endregion
+
+        #region Overrides
+
+        private readonly Hashtable _actionSqlQueryInfo = new Hashtable();
+
+        [NoInterception]
+        protected override SqlQueryInfo CreateSqlText(DbManager db, Type type, string actionName)
+        {
+            switch (actionName)
+            {
+                case "SelectByKey":
+                    return CreateSelectFullByKeySqlText(db, type);
+                case "SelectAll":
+                    return CreateSelectAllFullSqlText(db, type);
+                default:
+                    return base.CreateSqlText(db, type, actionName);
+            }
+        }
+
+        [NoInterception]
+        public override SqlQueryInfo GetSqlQueryInfo(DbManager db, Type type, string actionName)
+        {
+            var key = type.FullName + "$" + actionName + "$" + db.DataProvider.UniqueName + "$" + GetTableName(type);
+            var query = (SqlQueryInfo) _actionSqlQueryInfo[key];
+
+            if (query == null)
+            {
+                query = CreateSqlText(db, type, actionName);
+                _actionSqlQueryInfo[key] = query;
+            }
+
+            return query;
+        }
+
+        #endregion
+
+        #region Private methods
+
+        private SqlQueryInfo CreateSelectAllFullSqlText(DbManager db, Type type)
+        {
+            var sb = new StringBuilder();
+            var query = new FullSqlQueryInfo();
+
+            sb.Append("SELECT\n");
+
+            var mainMapper = (FullObjectMapper) db.MappingSchema.GetObjectMapper(type);
+
+            BuildSelectSql(mainMapper, sb, db);
+
+            sb.Remove(sb.Length - 2, 1);
+
+            sb.Append("FROM\n\t");
+
+            FullAppendTableName(sb, db, type);
+
+            AppendJoinTableName(mainMapper, sb, db, type);
+
+            query.QueryText = sb.ToString();
+
+            return query;
+        }
+
+        private SqlQueryInfo CreateSelectFullByKeySqlText(DbManager db, Type type)
+        {
+            var sb = new StringBuilder();
+            var query = new FullSqlQueryInfo();
+
+            sb.Append("SELECT\n");
+
+            var mainMapper = (FullObjectMapper) db.MappingSchema.GetObjectMapper(type);
+            BuildSelectSql(mainMapper, sb, db);
+
+            sb.Remove(sb.Length - 2, 1);
+
+            sb.Append("FROM\n\t");
+
+            FullAppendTableName(sb, db, type);
+
+            AppendJoinTableName(mainMapper, sb, db, type);
+
+            AddWherePK(db, query, sb, -1, mainMapper);
+
+            query.QueryText = sb.ToString();
+
+            return query;
+        }
+
+        private void FullAppendTableName(StringBuilder sb, DbManager db, Type type)
+        {
+            var database = GetDatabaseName(type);
+            var owner = GetOwnerName(type);
+            var name = base.GetTableName(type);
+
+            db.DataProvider.CreateSqlProvider().BuildTableName(sb,
+                                                               database == null ? null : db.DataProvider.Convert(database, ConvertType.NameToDatabase).ToString(),
+                                                               owner == null ? null : db.DataProvider.Convert(owner, ConvertType.NameToOwner).ToString(),
+                                                               name == null ? null : db.DataProvider.Convert(name, ConvertType.NameToQueryTable).ToString());
+
+            //TODO Override OracleSqlProvider in order to avoid this mess...
+            string alias = FullGetTableName(type);
+            sb.Append(" " + "T" /*alias*/);
+            sb.AppendLine();
+        }
+
+        private string FullGetTableName(Type type)
+        {
+            //bool isSet;
+            //return MappingSchema.MetadataProvider.GetTableName(type, Extensions, out isSet);
+
+            return type.Name;
+        }
+
+        private void BuildSelectSql(IObjectMapper mapper, StringBuilder sb, DbManager db, string tableName = "T")
+        {
+            int tableNr = 0;
+
+            foreach (IMapper mapField in mapper.PropertiesMapping)
+            {
+                if (mapField is ValueMapper)
+                    sb.AppendFormat("\t{0}.{1} {2},\n"
+                                    , tableName /* (mapper).PropertyType.Name */,
+                                    db.DataProvider.Convert(((ValueMapper) mapField).ColumnName, ConvertType.NameToQueryField),
+                                    ((ValueMapper) mapField).ColumnAlias
+                        );
+                else if (mapField is IPropertiesMapping)
+                {
+                    var propertiesMapping = (IPropertiesMapping) mapField;
+                    var cel = propertiesMapping.ParentMapping;
+                    while (cel != null)
+                    {
+                        // To avoid recursion dont take in account types already loaded.
+                        if (((IMapper) cel).PropertyType == mapField.PropertyType)
+                            continue;
+                        cel = cel.ParentMapping;
+                    }
+
+                    var objectMapper = (IObjectMapper) mapField;
+                    if (!objectMapper.IsLazy) 
+                        BuildSelectSql(objectMapper, sb, db, tableName + tableNr.ToString());
+
+                    tableNr++;
+                }
+                else
+                    throw new NotImplementedException(mapField.GetType() + " is not yet implemented.");
+            }
+        }
+
+        private void AppendJoinTableName(IPropertiesMapping mapper, StringBuilder sb, DbManager db, Type type, string tableName = "T")
+        {
+            string parentName = FullGetTableName(type);
+            Dictionary<string, ValueMapper> valueMappers = mapper.PropertiesMapping.Where(e => e is ValueMapper).Cast<ValueMapper>().ToDictionary(e => e.PropertyName, e => e);
+
+            int tableNr = 0;
+
+            foreach (IMapper mapField in mapper.PropertiesMapping)
+            {
+                var objectMapper = mapField as IObjectMapper;
+                if (objectMapper != null)
+                {
+                    if (!_ignoreLazyLoad)
+                    {
+                        if (objectMapper.IsLazy)
+                            continue;
+                    }
+
+                    string thisKey = objectMapper.Association.ThisKey[0];
+
+                    // TITLE
+                    string parentDbField = valueMappers.ContainsKey(thisKey) ? valueMappers[thisKey].ColumnName : thisKey;
+
+                    // ARTIST
+                    string childDbField = objectMapper.PropertiesMapping.Where(e => e is ValueMapper).Cast<ValueMapper>().First(
+                        e => e.PropertyName == objectMapper.Association.OtherKey[0]).ColumnName;
+
+                    string childDatabase = GetDatabaseName(mapField.PropertyType);
+                    string childOwner = base.GetOwnerName(mapField.PropertyType);
+                    string childName = base.GetTableName(mapField.PropertyType);
+                    string childAlias = FullGetTableName(mapField.PropertyType);
+
+                    StringBuilder childFullName = db.DataProvider.CreateSqlProvider().BuildTableName(
+                        new StringBuilder(),
+                        childDatabase == null
+                            ? null
+                            : db.DataProvider.Convert(childDatabase, ConvertType.NameToDatabase).ToString(),
+                        childOwner == null
+                            ? null
+                            : db.DataProvider.Convert(childOwner, ConvertType.NameToOwner).ToString(),
+                        childName == null
+                            ? null
+                            : db.DataProvider.Convert(childName, ConvertType.NameToQueryTable).ToString());
+
+                    sb.AppendFormat("\tFULL OUTER JOIN {0} {1} ON {2}.{3}={4}.{5}\n",
+                                    childFullName,
+                                    tableName + tableNr.ToString() /*childAlias*/,
+                                    tableName /*parentName*/,
+                                    parentDbField,
+                                    tableName + tableNr.ToString() /*childAlias*/,
+                                    childDbField
+                        );
+                    
+                    AppendJoinTableName((IPropertiesMapping)mapField, sb, db, mapField.PropertyType, tableName + tableNr.ToString());
+                    
+                    tableNr++;
+                }
+            }
+
+            sb.AppendLine();
+
+            //SELECT
+            //    ARTIST2.ID_ARTIST,
+            //    ARTIST2.ARTIST,
+            //    TRACK.ID_TRACK,
+            //    TRACK.TRACK,
+            //    TRACK.ID_ARTIST,
+            //    ARTIST.ID_ARTIST,
+            //    ARTIST.ARTIST
+            //FROM
+            //    PITAFR01.ARTIST ARTIST2
+            //    INNER JOIN PITAFR01.TRACK TRACK ON ARTIST2.ID_ARTIST=TRACK.ID_ARTIST
+            //    INNER JOIN PITAFR01.ARTIST ARTIST ON TRACK.ID_ARTIST=ARTIST.ID_ARTIST
+            //WHERE
+            //    ARTIST2.ID_ARTIST = 2566
+        }
+
+        private void AddWherePK(DbManager db, SqlQueryInfo query, StringBuilder sb, int nParameter, FullObjectMapper mapper)
+        {
+            sb.Append("WHERE\n");
+
+            foreach (IMapper mm in mapper.PropertiesMapping)
+            {
+                if (mm is ValueMapper && mm.DataReaderIndex == mapper.DataReaderIndex)
+                {
+                    var valueMapper = (ValueMapper) mm;
+
+                    string tableAlias = mapper.PropertyType.Name;
+
+                    //mm.Name = ID_TRACK
+                    SqlQueryParameterInfo p = query.AddParameter(
+                        db.DataProvider.Convert(valueMapper.ColumnName + "_W", ConvertType.NameToQueryParameter).
+                           ToString(),
+                        valueMapper.ColumnName);
+
+                    sb.AppendFormat("\t{0}.{1} = ", "T" /* tableAlias */,
+                                    db.DataProvider.Convert(p.FieldName, ConvertType.NameToQueryField));
+
+                    if (nParameter < 0)
+                        sb.AppendFormat("{0} AND\n", p.ParameterName);
+                    else
+                        sb.AppendFormat("{{{0}}} AND\n", nParameter++);
+                }
+            }
+
+            sb.Remove(sb.Length - 5, 5);
+        }
+
+        #endregion
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/DataAccess/FullSqlQueryBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,280 @@
+using System;
+using System.Collections;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using BLToolkit.Aspects;
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Mapping;
+using BLToolkit.TypeBuilder;
+
+namespace BLToolkit.DataAccess
+{
+    public abstract class FullSqlQueryBase : SqlQueryBase
+    {
+        private readonly bool _ignoreLazyLoad;
+
+        #region Constructors
+
+        protected FullSqlQueryBase(DbManager dbManager, bool ignoreLazyLoad = false, MappingOrder mappingOrder = MappingOrder.ByColumnIndex)
+            : base(dbManager)
+        {
+            dbManager.MappingSchema = new FullMappingSchema(dbManager, mappingOrder: mappingOrder);
+
+            _ignoreLazyLoad = ignoreLazyLoad;
+        }
+
+        #endregion
+
+        #region Overrides
+
+        [NoInterception]
+        protected override SqlQueryInfo CreateSqlText(DbManager db, Type type, string actionName)
+        {
+            switch (actionName)
+            {
+                case "SelectByKey":
+                    return CreateSelectFullByKeySqlText(db, type);
+                case "SelectAll":
+                    return CreateSelectAllFullSqlText(db, type);
+                default:
+                    return base.CreateSqlText(db, type, actionName);
+            }
+        }
+        
+        protected override void AppendTableName(StringBuilder sb, DbManager db, Type type)
+        {
+            var database = GetDatabaseName(type);
+            var owner = GetOwnerName(type);
+            var name = base.GetTableName(type);
+
+            db.DataProvider.CreateSqlProvider().BuildTableName(sb,
+                                                               database == null ? null : db.DataProvider.Convert(database, ConvertType.NameToDatabase).ToString(),
+                                                               owner == null ? null : db.DataProvider.Convert(owner, ConvertType.NameToOwner).ToString(),
+                                                               name == null ? null : db.DataProvider.Convert(name, ConvertType.NameToQueryTable).ToString());
+
+            //TODO Override OracleSqlProvider in order to avoid this mess...
+            string alias = GetTableName(type);
+            sb.Append(" " + alias);
+            sb.AppendLine();
+        }
+
+        protected override string GetTableName(Type type)
+        {
+            //bool isSet;
+            //return MappingSchema.MetadataProvider.GetTableName(type, Extensions, out isSet);
+
+            return type.Name;
+        }
+
+        #endregion
+
+        private SqlQueryInfo CreateSelectAllFullSqlText(DbManager db, Type type)
+        {
+            var sb = new StringBuilder();
+            var query = new FullSqlQueryInfo();
+
+            sb.Append("SELECT\n");
+
+            var mainMapper = (FullObjectMapper)db.MappingSchema.GetObjectMapper(type); ;
+            BuildSelectSQL(mainMapper, sb, db);
+
+            sb.Remove(sb.Length - 2, 1);
+
+            sb.Append("FROM\n\t");
+
+            AppendTableName(sb, db, type);
+
+            AppendJoinTableName(sb, db, type);
+
+            query.QueryText = sb.ToString();
+
+            return query;
+        }
+
+        private SqlQueryInfo CreateSelectFullByKeySqlText(DbManager db, Type type)
+        {
+            var sb = new StringBuilder();
+            var query = new FullSqlQueryInfo();
+
+            sb.Append("SELECT\n");
+
+            var mainMapper = (FullObjectMapper)db.MappingSchema.GetObjectMapper(type);
+
+            BuildSelectSQL(mainMapper, sb, db);
+
+            sb.Remove(sb.Length - 2, 1);
+
+            sb.Append("FROM\n\t");
+
+            AppendTableName(sb, db, type);
+
+            AppendJoinTableName(sb, db, type);
+
+            AddWherePK(db, query, sb, -1, mainMapper);
+
+            query.QueryText = sb.ToString();
+
+            return query;
+        }
+
+        private void BuildSelectSQL(IPropertiesMapping mapper, StringBuilder sb, DbManager db)
+        {
+            foreach (IMapper mapField in mapper.PropertiesMapping)
+            {
+                if (mapField is ValueMapper)
+                    sb.AppendFormat("\t{0}.{1},\n", ((IObjectMapper)mapper).PropertyType.Name,
+                                    db.DataProvider.Convert(((ValueMapper)mapField).ColumnName, ConvertType.NameToQueryField));
+                else if (mapField is IPropertiesMapping)
+                {
+                    var propertiesMapping = (IPropertiesMapping)mapField;
+                    var cel = propertiesMapping.ParentMapping;
+                    while (cel != null)
+                    {
+                        // To avoid recursion dont take in account types already loaded.
+                        if (((IMapper)cel).PropertyType == mapField.PropertyType)
+                            continue;
+                        cel = cel.ParentMapping;
+                    }
+                    var objectMapper = (IObjectMapper)mapField;
+                    if (!objectMapper.IsLazy)
+                        BuildSelectSQL(propertiesMapping, sb, db);
+                }
+                else
+                    throw new NotImplementedException(mapField.GetType() + " is not yet implemented.");
+            }
+        }
+
+        private void AppendJoinTableName(StringBuilder sb, DbManager db, Type type)
+        {
+            string parentName = GetTableName(type);
+
+            foreach (PropertyInfo prop in type.GetProperties())
+            {
+                bool isCollection = prop.PropertyType.GetInterfaces().ToList().Contains(typeof(IList));
+                Type listElementType = null;
+                if (isCollection)
+                {
+                    listElementType = FullMappingSchema.GetGenericType(prop.PropertyType);
+                }
+
+                if (!_ignoreLazyLoad)
+                {
+                    object[] lazy = prop.GetCustomAttributes(typeof(LazyInstanceAttribute), true);
+                    if (lazy.Length > 0)
+                    {
+                        if (((LazyInstanceAttribute)lazy[0]).IsLazy)
+                        {
+                            continue;
+                        }
+                    }
+                }
+
+                object[] attribs = prop.GetCustomAttributes(typeof(AssociationAttribute), true);
+                if (attribs.Length > 0)
+                {
+                    var assocAttrib = (AssociationAttribute)attribs[0];
+
+                    PropertyInfo parentField = type.GetProperty(assocAttrib.ThisKey);
+                    PropertyInfo childField = prop.PropertyType.GetProperty(assocAttrib.OtherKey);
+                    if (isCollection)
+                    {
+                        childField = listElementType.GetProperty(assocAttrib.OtherKey);
+                        //FullMappingSchema.GetColumnFromProperty(listElementType, associationAttribute.OtherKey);
+                    }
+
+                    object[] parentFieldAttributes = parentField.GetCustomAttributes(typeof(MapFieldAttribute), true);
+                    string parentDbField = parentFieldAttributes.Length > 0
+                                               ? ((MapFieldAttribute)parentFieldAttributes[0]).MapName
+                                               : assocAttrib.ThisKey;
+
+                    object[] childFieldAttributes = childField.GetCustomAttributes(typeof(MapFieldAttribute), true);
+                    string childDbField = childFieldAttributes.Length > 0
+                                              ? ((MapFieldAttribute)childFieldAttributes[0]).MapName
+                                              : assocAttrib.OtherKey;
+
+
+                    string childDatabase = isCollection
+                                               ? GetDatabaseName(listElementType)
+                                               : GetDatabaseName(prop.PropertyType);
+
+                    string childOwner = isCollection ? base.GetOwnerName(listElementType) : base.GetOwnerName(prop.PropertyType);
+                    string childName = isCollection ? base.GetTableName(listElementType) : base.GetTableName(prop.PropertyType);
+                    string childAlias = isCollection ? GetTableName(listElementType) : GetTableName(prop.PropertyType);
+
+                    StringBuilder childFullName = db.DataProvider.CreateSqlProvider().BuildTableName(
+                        new StringBuilder(),
+                        childDatabase == null
+                            ? null
+                            : db.DataProvider.Convert(childDatabase, ConvertType.NameToDatabase).ToString(),
+                        childOwner == null
+                            ? null
+                            : db.DataProvider.Convert(childOwner, ConvertType.NameToOwner).ToString(),
+                        childName == null
+                            ? null
+                            : db.DataProvider.Convert(childName, ConvertType.NameToQueryTable).ToString());
+
+                    sb.AppendFormat("\tINNER JOIN {0} {1} ON {2}.{3}={4}.{5}\n",
+                                    childFullName,
+                                    childAlias,
+                                    parentName,
+                                    parentDbField,
+                                    childAlias,
+                                    childDbField
+                        );
+
+                    AppendJoinTableName(sb, db, isCollection ? listElementType : prop.PropertyType);
+                }
+            }
+
+            sb.AppendLine();
+
+            //SELECT
+            //    ARTIST2.ID_ARTIST,
+            //    ARTIST2.ARTIST,
+            //    TRACK.ID_TRACK,
+            //    TRACK.TRACK,
+            //    TRACK.ID_ARTIST,
+            //    ARTIST.ID_ARTIST,
+            //    ARTIST.ARTIST
+            //FROM
+            //    PITAFR01.ARTIST ARTIST2
+            //    INNER JOIN PITAFR01.TRACK TRACK ON ARTIST2.ID_ARTIST=TRACK.ID_ARTIST
+            //    INNER JOIN PITAFR01.ARTIST ARTIST ON TRACK.ID_ARTIST=ARTIST.ID_ARTIST
+            //WHERE
+            //    ARTIST2.ID_ARTIST = 2566
+        }
+
+        private void AddWherePK(DbManager db, SqlQueryInfo query, StringBuilder sb, int nParameter,
+                                FullObjectMapper mapper)
+        {
+            sb.Append("WHERE\n");
+
+            foreach (IMapper mm in mapper.PropertiesMapping)
+            {
+                if (mm is ValueMapper && mm.DataReaderIndex == mapper.DataReaderIndex)
+                {
+                    var valueMapper = (ValueMapper)mm;
+
+                    string tableAlias = mapper.PropertyType.Name;
+
+                    //mm.Name = ID_TRACK
+                    SqlQueryParameterInfo p = query.AddParameter(
+                        db.DataProvider.Convert(valueMapper.ColumnName + "_W", ConvertType.NameToQueryParameter).
+                            ToString(),
+                        valueMapper.ColumnName);
+
+                    sb.AppendFormat("\t{0}.{1} = ", tableAlias, db.DataProvider.Convert(p.FieldName, ConvertType.NameToQueryField));
+
+                    if (nParameter < 0)
+                        sb.AppendFormat("{0} AND\n", p.ParameterName);
+                    else
+                        sb.AppendFormat("{{{0}}} AND\n", nParameter++);
+                }
+            }
+
+            sb.Remove(sb.Length - 5, 5);
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/DataAccess/FullSqlQueryInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,16 @@
+namespace BLToolkit.DataAccess
+{
+    public class FullSqlQueryInfo : SqlQueryInfo
+    {
+        public override SqlQueryParameterInfo AddParameter(string parameterName, string fieldName)
+        {
+            var parameter = new FullSqlQueryParameterInfo { ParameterName = parameterName, FieldName = fieldName };
+
+            parameter.SetMemberMapper(ObjectMapper);
+
+            Parameters.Add(parameter);
+
+            return parameter;
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/DataAccess/FullSqlQueryParameterInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+using BLToolkit.Mapping;
+
+namespace BLToolkit.DataAccess
+{
+    public class FullSqlQueryParameterInfo : SqlQueryParameterInfo
+    {
+        public override void SetMemberMapper(ObjectMapper objectMapper)
+        {
+
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/DataAccess/FullSqlQueryT.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,164 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using BLToolkit.Data;
+
+namespace BLToolkit.DataAccess
+{
+    public class FullSqlQueryT<T> : FullSqlQuery, ISqlQueryT<T>
+    {
+        #region Constructors
+
+        public FullSqlQueryT(DbManager dbManager, bool ignoreLazyLoad = false)
+            : base(dbManager, ignoreLazyLoad)
+        {
+        }
+
+        #endregion
+
+        #region Implementation of ISqlQueryT<T>
+
+        public T SelectByKey(DbManager db, params object[] keys)
+        {
+            return (T) base.SelectByKey(db, typeof(T), keys);
+        }
+
+        public T SelectByKey(params object[] keys)
+        {
+            return (T)base.SelectByKey(typeof(T), keys);
+        }
+
+        public List<T> SelectAll(DbManager db)
+        {
+            return base.SelectAll(db, typeof(T)).Cast<T>().ToList();
+        }
+
+        public TL SelectAll<TL>(DbManager db, TL list) where TL : IList<T>
+        {
+            return (TL)base.SelectAll(db, (IList)list, typeof(T));
+        }
+
+        public TL SelectAll<TL>(DbManager db) where TL : IList<T>, new()
+        {
+            return SelectAll(db, new TL());
+        }
+
+        public List<T> SelectAll()
+        {
+            return base.SelectAll(typeof(T)).Cast<T>().ToList();
+        }
+
+        public TL SelectAll<TL>(TL list) where TL : IList<T>
+        {
+            return SelectAll(DbManager, list);
+        }
+
+        public TL SelectAll<TL>() where TL : IList<T>, new()
+        {
+            return SelectAll<TL>(DbManager);
+        }
+
+        public int Insert(DbManager db, T obj)
+        {
+            return base.Insert(db, obj);
+        }
+
+        public int Insert(T obj)
+        {
+            return base.Insert(obj);
+        }
+
+        public int Insert(DbManager db, int maxBatchSize, IEnumerable<T> list)
+        {
+            throw new NotImplementedException();
+        }
+
+        public int Insert(int maxBatchSize, IEnumerable<T> list)
+        {
+            return Insert(DbManager, maxBatchSize, list);
+        }
+
+        public int Insert(DbManager db, IEnumerable<T> list)
+        {
+            return Insert(db, int.MaxValue, list);
+        }
+
+        public int Insert(IEnumerable<T> list)
+        {
+            return Insert(DbManager, list);
+        }
+
+        public int Update(DbManager db, T obj)
+        {
+            return base.Update(db, obj);
+        }
+
+        public int Update(T obj)
+        {
+            return base.Update(obj);
+        }
+
+        public int Update(DbManager db, int maxBatchSize, IEnumerable<T> list)
+        {
+            throw new NotImplementedException();
+        }
+
+        public int Update(int maxBatchSize, IEnumerable<T> list)
+        {
+            return Update(DbManager, maxBatchSize, list);
+        }
+
+        public int Update(DbManager db, IEnumerable<T> list)
+        {
+            return Update(db, int.MaxValue, list);
+        }
+
+        public int Update(IEnumerable<T> list)
+        {
+            return Update(DbManager, list);
+        }
+
+        public int DeleteByKey(DbManager db, params object[] key)
+        {
+            return base.DeleteByKey(db, typeof(T), key);
+        }
+
+        public int DeleteByKey(params object[] key)
+        {
+            return base.DeleteByKey(typeof(T), key);
+        }
+
+        public int Delete(DbManager db, T obj)
+        {
+            return base.Delete(db, obj);
+        }
+
+        public int Delete(T obj)
+        {
+            return base.Delete(obj);
+        }
+
+        public int Delete(DbManager db, int maxBatchSize, IEnumerable<T> list)
+        {
+            throw new NotImplementedException();
+        }
+
+        public int Delete(int maxBatchSize, IEnumerable<T> list)
+        {
+            return Delete(DbManager, maxBatchSize, list);
+        }
+
+        public int Delete(DbManager db, IEnumerable<T> list)
+        {
+            return Delete(int.MaxValue, list);
+        }
+
+        public int Delete(IEnumerable<T> list)
+        {
+            return Delete(DbManager, list);
+        }
+
+        #endregion
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/Emit/DynamicCompilationSpike.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,129 @@
+using System;
+using System.Reflection;
+using System.Reflection.Emit;
+
+namespace BLToolkit.Emit
+{
+    public delegate object GetHandler(object source);
+
+    public delegate void SetHandler(object source, object value);
+
+    public delegate object InstantiateObjectHandler();
+
+    public static class DynamicMethodCompiler
+    {
+        // DynamicMethodCompiler
+
+        // CreateInstantiateObjectDelegate
+        internal static InstantiateObjectHandler CreateInstantiateObjectHandler(Type type)
+        {
+            ConstructorInfo constructorInfo =
+                type.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null,
+                                    new Type[0], null);
+            if (constructorInfo == null)
+            {
+                throw new ApplicationException(
+                    string.Format(
+                        "The type {0} must declare an empty constructor (the constructor may be private, internal, protected, protected internal, or public).",
+                        type));
+            }
+
+            var dynamicMethod = new DynamicMethod("InstantiateObject", MethodAttributes.Static | MethodAttributes.Public,
+                                                  CallingConventions.Standard, typeof(object), null, type, true);
+            ILGenerator generator = dynamicMethod.GetILGenerator();
+            generator.Emit(OpCodes.Newobj, constructorInfo);
+            generator.Emit(OpCodes.Ret);
+            return (InstantiateObjectHandler)dynamicMethod.CreateDelegate(typeof(InstantiateObjectHandler));
+        }
+
+        // CreateGetDelegate
+        internal static GetHandler CreateGetHandler(Type type, PropertyInfo propertyInfo)
+        {
+            MethodInfo getMethodInfo = propertyInfo.GetGetMethod(true);
+            DynamicMethod dynamicGet = CreateGetDynamicMethod(type);
+            ILGenerator getGenerator = dynamicGet.GetILGenerator();
+
+            getGenerator.Emit(OpCodes.Ldarg_0);
+            getGenerator.Emit(OpCodes.Call, getMethodInfo);
+            BoxIfNeeded(getMethodInfo.ReturnType, getGenerator);
+            getGenerator.Emit(OpCodes.Ret);
+
+            return (GetHandler)dynamicGet.CreateDelegate(typeof(GetHandler));
+        }
+
+        // CreateGetDelegate
+        internal static GetHandler CreateGetHandler(Type type, FieldInfo fieldInfo)
+        {
+            DynamicMethod dynamicGet = CreateGetDynamicMethod(type);
+            ILGenerator getGenerator = dynamicGet.GetILGenerator();
+
+            getGenerator.Emit(OpCodes.Ldarg_0);
+            getGenerator.Emit(OpCodes.Ldfld, fieldInfo);
+            BoxIfNeeded(fieldInfo.FieldType, getGenerator);
+            getGenerator.Emit(OpCodes.Ret);
+
+            return (GetHandler)dynamicGet.CreateDelegate(typeof(GetHandler));
+        }
+
+        // CreateSetDelegate
+        internal static SetHandler CreateSetHandler(Type type, PropertyInfo propertyInfo)
+        {
+            MethodInfo setMethodInfo = propertyInfo.GetSetMethod(true);
+            DynamicMethod dynamicSet = CreateSetDynamicMethod(type);
+            ILGenerator setGenerator = dynamicSet.GetILGenerator();
+
+            setGenerator.Emit(OpCodes.Ldarg_0);
+            setGenerator.Emit(OpCodes.Ldarg_1);
+            UnboxIfNeeded(setMethodInfo.GetParameters()[0].ParameterType, setGenerator);
+            setGenerator.Emit(OpCodes.Call, setMethodInfo);
+            setGenerator.Emit(OpCodes.Ret);
+
+            return (SetHandler)dynamicSet.CreateDelegate(typeof(SetHandler));
+        }
+
+        // CreateSetDelegate
+        internal static SetHandler CreateSetHandler(Type type, FieldInfo fieldInfo)
+        {
+            DynamicMethod dynamicSet = CreateSetDynamicMethod(type);
+            ILGenerator setGenerator = dynamicSet.GetILGenerator();
+
+            setGenerator.Emit(OpCodes.Ldarg_0);
+            setGenerator.Emit(OpCodes.Ldarg_1);
+            UnboxIfNeeded(fieldInfo.FieldType, setGenerator);
+            setGenerator.Emit(OpCodes.Stfld, fieldInfo);
+            setGenerator.Emit(OpCodes.Ret);
+
+            return (SetHandler)dynamicSet.CreateDelegate(typeof(SetHandler));
+        }
+
+        // CreateGetDynamicMethod
+        private static DynamicMethod CreateGetDynamicMethod(Type type)
+        {
+            return new DynamicMethod("DynamicGet", typeof(object), new[] { typeof(object) }, type, true);
+        }
+
+        // CreateSetDynamicMethod
+        private static DynamicMethod CreateSetDynamicMethod(Type type)
+        {
+            return new DynamicMethod("DynamicSet", typeof(void), new[] { typeof(object), typeof(object) }, type, true);
+        }
+
+        // BoxIfNeeded
+        private static void BoxIfNeeded(Type type, ILGenerator generator)
+        {
+            if (type.IsValueType)
+            {
+                generator.Emit(OpCodes.Box, type);
+            }
+        }
+
+        // UnboxIfNeeded
+        private static void UnboxIfNeeded(Type type, ILGenerator generator)
+        {
+            if (type.IsValueType)
+            {
+                generator.Emit(OpCodes.Unbox_Any, type);
+            }
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/Emit/FunctionFactory.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,323 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+using System.Reflection.Emit;
+
+namespace BLToolkit.Emit
+{
+    /// <summary>
+    /// Creates and compiles types instances and methods using expressions, IL code generation
+    /// </summary>
+    /// <remarks>
+    /// Inspired from:
+    /// http://abhi.dcmembers.com/blog/2009/03/25/lambda-based-reflection-vs-normal-reflection-vs-direct-call-4/
+    /// </remarks>
+    public static class FunctionFactory
+    {
+        #region Delegates
+
+        public delegate object GenericGetter(object target);
+
+        public delegate void GenericSetter(object target, object value);
+
+        #endregion
+
+        #region Nested type: Il
+
+        public static class Il
+        {
+            public static object CreateInstance(Type type)
+            {
+                InstantiateObjectHandler instantiateObjectHandler =
+                    DynamicMethodCompiler.CreateInstantiateObjectHandler(type);
+
+                return instantiateObjectHandler();
+            }
+
+            public static T CreateInstance<T>()
+            {
+                return (T) CreateInstance(typeof (T));
+            }
+
+            public static SetHandler CreateSetHandler(Type type, string property)
+            {
+                PropertyInfo propertyInfo = type.GetProperty(property);
+                return CreateSetHandler(type, propertyInfo);
+            }
+
+            public static SetHandler CreateSetHandler(Type type, PropertyInfo propertyInfo)
+            {
+                SetHandler setHandler = DynamicMethodCompiler.CreateSetHandler(type, propertyInfo);
+                return setHandler;
+            }
+
+            public static SetHandler CreateSetHandler<T>(string property)
+            {
+                return CreateSetHandler(typeof (T), property);
+            }
+
+            public static GetHandler CreateGetHandler(Type type, PropertyInfo propertyInfo)
+            {
+                GetHandler getHandler = DynamicMethodCompiler.CreateGetHandler(type, propertyInfo);
+                return getHandler;
+            }
+
+            public static GetHandler CreateGetHandler<T>(PropertyInfo propertyInfo)
+            {
+                return CreateGetHandler(typeof (T), propertyInfo);
+            }
+
+            public static GetHandler CreateGetHandler<T>(string property)
+            {
+                PropertyInfo propertyInfo = typeof (T).GetProperty(property);
+                return CreateGetHandler<T>(propertyInfo);
+            }
+
+            ///
+            /// Creates a dynamic setter for the property
+            ///
+            public static GenericSetter CreateSetMethod(PropertyInfo propertyInfo)
+            {
+                /*
+                * If there's no setter return null
+                */
+                MethodInfo setMethod = propertyInfo.GetSetMethod();
+                if (setMethod == null)
+                    return null;
+
+                /*
+                * Create the dynamic method
+                */
+                var arguments = new Type[2];
+                arguments[0] = arguments[1] = typeof (object);
+
+                var setter = new DynamicMethod(
+                    String.Concat("_Set", propertyInfo.Name, "_"),
+                    typeof (void), arguments, propertyInfo.DeclaringType);
+                ILGenerator generator = setter.GetILGenerator();
+                generator.Emit(OpCodes.Ldarg_0);
+                generator.Emit(OpCodes.Castclass, propertyInfo.DeclaringType);
+                generator.Emit(OpCodes.Ldarg_1);
+
+                if (propertyInfo.PropertyType.IsClass)
+                    generator.Emit(OpCodes.Castclass, propertyInfo.PropertyType);
+                else
+                    generator.Emit(OpCodes.Unbox_Any, propertyInfo.PropertyType);
+
+                generator.EmitCall(OpCodes.Callvirt, setMethod, null);
+                generator.Emit(OpCodes.Ret);
+
+                /*
+                * Create the delegate and return it
+                */
+                return (GenericSetter) setter.CreateDelegate(typeof (GenericSetter));
+            }
+
+            ///
+            /// Creates a dynamic getter for the property
+            ///
+            public static GenericGetter CreateGetMethod(PropertyInfo propertyInfo)
+            {
+                /*
+                * If there's no getter return null
+                */
+                MethodInfo getMethod = propertyInfo.GetGetMethod();
+                if (getMethod == null)
+                    return null;
+
+                /*
+                * Create the dynamic method
+                */
+                var arguments = new Type[1];
+                arguments[0] = typeof (object);
+
+                var getter = new DynamicMethod(
+                    String.Concat("_Get", propertyInfo.Name, "_"),
+                    typeof (object), arguments, propertyInfo.DeclaringType);
+
+                ILGenerator generator = getter.GetILGenerator();
+                generator.DeclareLocal(typeof (object));
+                generator.Emit(OpCodes.Ldarg_0);
+                generator.Emit(OpCodes.Castclass, propertyInfo.DeclaringType);
+                generator.EmitCall(OpCodes.Callvirt, getMethod, null);
+
+                if (!propertyInfo.PropertyType.IsClass)
+                    generator.Emit(OpCodes.Box, propertyInfo.PropertyType);
+
+                generator.Emit(OpCodes.Ret);
+
+                /*
+                * Create the delegate and return it
+                */
+                return (GenericGetter) getter.CreateDelegate(typeof (GenericGetter));
+            }
+        }
+
+        #endregion
+
+        #region Nested type: Lambda
+
+        public static class Lambda
+        {
+            public static T CreateInstance<T>()
+            {
+                return InstanceCreator<T>.CreateInstance();
+            }
+
+            public static List<T> CreateListInstance<T>()
+            {
+                return InstanceCreator<T>.CreateListInstance();
+            }
+
+            public static Action<T, TValue> BuildSet<T, TValue>(string property)
+            {
+                string[] props = property.Split('.');
+                Type type = typeof (T);
+                ParameterExpression arg = Expression.Parameter(type, "x");
+                ParameterExpression valArg = Expression.Parameter(typeof (TValue), "val");
+                Expression expr = arg;
+                foreach (string prop in props.Take(props.Length - 1))
+                {
+                    // use reflection (not ComponentModel) to mirror LINQ 
+                    PropertyInfo pi = type.GetProperty(prop);
+                    expr = Expression.Property(expr, pi);
+                    type = pi.PropertyType;
+                }
+                // final property set...
+                PropertyInfo finalProp = type.GetProperty(props.Last());
+                MethodInfo setter = finalProp.GetSetMethod();
+                expr = Expression.Call(expr, setter, valArg);
+                return Expression.Lambda<Action<T, TValue>>(expr, arg, valArg).Compile();
+            }
+
+            public static Func<T, TValue> BuildGet<T, TValue>(string property)
+            {
+                string[] props = property.Split('.');
+                Type type = typeof (T);
+                ParameterExpression arg = Expression.Parameter(type, "x");
+                Expression expr = arg;
+                foreach (string prop in props)
+                {
+                    // use reflection (not ComponentModel) to mirror LINQ 
+                    PropertyInfo pi = type.GetProperty(prop);
+                    expr = Expression.Property(expr, pi);
+                    type = pi.PropertyType;
+                }
+                return Expression.Lambda<Func<T, TValue>>(expr, arg).Compile();
+            }
+
+            /// <summary>
+            /// Creates a compiled delegate function for the specified type and method name
+            /// </summary>
+            /// <typeparam name="TFunc">Delegate Func to create</typeparam>
+            /// <param name="obj">Constant to get method from</param>
+            /// <param name="methodName">Method to examine</param>
+            /// <returns>Delegate function of the specified methodname</returns>
+            public static TFunc CreateFunc<TFunc>(object obj, string methodName)
+            {
+                var args = new List<ParameterExpression>();
+
+                Type targetType = obj.GetType();
+                MethodInfo minfo = targetType.GetMethod(methodName,
+                                                        BindingFlags.Instance | BindingFlags.Public |
+                                                        BindingFlags.SetProperty);
+
+                if (minfo != null)
+                {
+                    ConstantExpression target = Expression.Constant(obj);
+                    foreach (ParameterInfo arg in minfo.GetParameters())
+                        args.Add(Expression.Parameter(arg.ParameterType, arg.Name));
+                    MethodCallExpression methodinvokeExpression = Expression.Call(target, minfo, args.ToArray());
+                    Expression<TFunc> lambda = Expression.Lambda<TFunc>(methodinvokeExpression, args.ToArray());
+
+                    //now the following Lambda is created:
+                    // (TArg1, TArg2) => obj.MethodName(TArg1, TArg2);
+
+                    return lambda.Compile();
+                }
+                return default(TFunc);
+            }
+
+            /// <summary>
+            /// Creates a compiled delegate function using expressions, 
+            /// the first Func{TObject,TReturn} parameter must be the constant to be passed in
+            /// </summary>
+            /// <typeparam name="TFunc">Delegate Func to create</typeparam>
+            /// <param name="targetType">Type of constant to pass in to the Func</param>
+            /// <param name="methodName">Method to examine</param>
+            /// <returns>Delegate function of the specified methodname</returns>
+            /// <example>
+            /// The function Func{TType,TArg1,TArg2} with a method name of "CallMe" would create the following
+            /// lambda:
+            /// <code>
+            /// (TType, TArg1, TArg2) => TType.CallMe(TArg1, TArg2);
+            /// </code>
+            /// </example>
+            public static TFunc CreateFunc<TFunc>(Type targetType, string methodName)
+            {
+                var args = new List<ParameterExpression>();
+                MethodInfo minfo = targetType.GetMethod(methodName,
+                                                        BindingFlags.Instance | BindingFlags.Public |
+                                                        BindingFlags.SetProperty);
+
+                if (minfo != null)
+                {
+                    Type objectType = typeof (TFunc).GetGenericArguments().First();
+                    ParameterExpression targetParam = Expression.Parameter(objectType, "a");
+
+                    if (!targetType.IsAssignableFrom(objectType))
+                        throw new InvalidCastException(string.Format("{0} cannot be cast to {1}", targetType.Name,
+                                                                     objectType.Name));
+
+                    UnaryExpression target = Expression.Convert(targetParam, targetType);
+                    foreach (ParameterInfo arg in minfo.GetParameters())
+                        args.Add(Expression.Parameter(arg.ParameterType, arg.Name));
+
+                    MethodCallExpression methodinvokeExpression = Expression.Call(target, minfo, args.ToArray());
+                    Expression<TFunc> lambda = Expression.Lambda<TFunc>(methodinvokeExpression,
+                                                                        new[] {targetParam}.Concat(args));
+
+                    //now the following Lambda is created:
+                    // (a, TArg1, TArg2) => a.MethodName(TArg1, TArg2);
+
+                    return lambda.Compile();
+                }
+                return default(TFunc);
+            }
+
+            #region Nested type: InstanceCreator
+
+            private static class InstanceCreator<T>
+            {
+                public static readonly Func<T> CreateInstance =
+                    Expression.Lambda<Func<T>>(Expression.New(typeof (T))).Compile();
+
+                public static readonly Func<List<T>> CreateListInstance =
+                Expression.Lambda<Func<List<T>>>(Expression.New(typeof(List<T>))).Compile();
+            }
+
+            #endregion
+        }
+
+        #endregion
+
+        #region Nested type: Remote
+
+        public static class Remote
+        {
+            public static T CreateInstance<T>()
+            {
+                return Activator.CreateInstance<T>();
+            }
+
+            public  static object CreateInstance(Type type)
+            {
+                return Activator.CreateInstance(type);
+            }
+        }
+
+        #endregion
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/Mapping/CollectionFullObjectMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,91 @@
+using System;
+using System.Collections.Generic;
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+using BLToolkit.Emit;
+
+namespace BLToolkit.Mapping
+{
+    public class CollectionFullObjectMapper : TableDescription, IObjectMapper
+    {
+        private readonly DbManager _db;
+        private readonly FactoryType _factoryType;
+
+        public CollectionFullObjectMapper(DbManager db, FactoryType factoryType)
+        {
+            _db = db;
+            _factoryType = factoryType;
+
+            PropertiesMapping = new List<IMapper>();
+            PrimaryKeyValueGetters = new List<GetHandler>();
+            PrimaryKeyNames = new List<string>();
+        }
+
+        public Type PropertyCollectionType { get; set; }
+
+        #region IMapper Members
+
+        public int DataReaderIndex { get; set; }
+        public SetHandler Setter { get; set; }
+        public Type PropertyType { get; set; }
+        public string PropertyName { get; set; }
+
+        #endregion
+
+        #region IObjectMapper
+
+        public bool IsLazy { get; set; }
+        public bool ContainsLazyChild { get; set; }
+        public GetHandler Getter { get; set; }
+
+        public List<GetHandler> PrimaryKeyValueGetters { get; set; }
+        public Association Association { get; set; }
+
+        public List<string> PrimaryKeyNames { get; set; }
+
+        #endregion
+
+        #region ILazyMapper
+
+        public GetHandler ParentKeyGetter { get; set; }
+
+        #endregion
+
+        public object CreateInstance()
+        {
+            object result = ContainsLazyChild
+                    ? (_factoryType == FactoryType.LazyLoading
+                           ? TypeFactory.LazyLoading.Create(PropertyType, this, LoadLazy)
+                           : TypeFactory.LazyLoadingWithDataBinding.Create(PropertyType, this, LoadLazy))
+                    : FunctionFactory.Remote.CreateInstance(PropertyType);
+
+            return result;
+        }
+
+        private object LoadLazy(IMapper mapper, object proxy, Type parentType)
+        {
+            var lazyMapper = (ILazyMapper) mapper;
+            object key = lazyMapper.ParentKeyGetter(proxy);
+
+            var fullSqlQuery = new FullSqlQuery(_db, true);
+            object parentLoadFull = fullSqlQuery.SelectByKey(parentType, key);
+            if (parentLoadFull == null)
+            {
+                object value = Activator.CreateInstance(mapper is CollectionFullObjectMapper
+                                                            ? (mapper as CollectionFullObjectMapper).PropertyCollectionType
+                                                            : mapper.PropertyType);
+                return value;
+            }
+
+            var objectMapper = (IObjectMapper) mapper;
+            return objectMapper.Getter(parentLoadFull);
+        }
+
+        #region IPropertiesMapping Members
+
+        public List<IMapper> PropertiesMapping { get; private set; }
+        public IPropertiesMapping ParentMapping { get; set; }
+
+        #endregion
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/Mapping/DataBindingFactory.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,69 @@
+using System;
+using System.ComponentModel;
+using Castle.DynamicProxy;
+
+namespace BLToolkit.Mapping
+{
+    public static class DataBindingFactory
+    {
+        private static readonly ProxyGenerator ProxyGenerator = new ProxyGenerator();
+
+        public static T Create<T>()
+        {
+            return (T) Create(typeof (T));
+        }
+
+        public static object Create(Type type)
+        {
+            return ProxyGenerator.CreateClassProxy(type, new[]
+                {
+                    typeof (INotifyPropertyChanged),
+                    typeof (IMarkerInterface)
+                }, new NotifyPropertyChangedInterceptor(type.FullName));
+        }
+
+        public interface IMarkerInterface
+        {
+            string TypeName { get; }
+        }
+
+        public class NotifyPropertyChangedInterceptor : IInterceptor
+        {
+            private readonly string typeName;
+            private PropertyChangedEventHandler subscribers = delegate { };
+
+            public NotifyPropertyChangedInterceptor(string typeName)
+            {
+                this.typeName = typeName;
+            }
+
+            public void Intercept(IInvocation invocation)
+            {
+                if (invocation.Method.DeclaringType == typeof (IMarkerInterface))
+                {
+                    invocation.ReturnValue = typeName;
+                    return;
+                }
+                if (invocation.Method.DeclaringType == typeof (INotifyPropertyChanged))
+                {
+                    var propertyChangedEventHandler = (PropertyChangedEventHandler) invocation.Arguments[0];
+                    if (invocation.Method.Name.StartsWith("add_"))
+                    {
+                        subscribers += propertyChangedEventHandler;
+                    }
+                    else
+                    {
+                        subscribers -= propertyChangedEventHandler;
+                    }
+                    return;
+                }
+                invocation.Proceed();
+                if (invocation.Method.Name.StartsWith("set_"))
+                {
+                    var propertyName = invocation.Method.Name.Substring(4);
+                    subscribers(invocation.InvocationTarget, new PropertyChangedEventArgs(propertyName));
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/Mapping/DataBindingMappingSchema.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,33 @@
+using System;
+using BLToolkit.Data;
+
+namespace BLToolkit.Mapping
+{
+    public class DataBindingMappingSchema : MappingSchema
+    {
+        protected override ObjectMapper CreateObjectMapperInstance(Type type)
+        {
+            var res = new DataBindingObjectMapper(type);
+
+            return res;
+        }
+    }
+
+    public class FullDataBindingMappingSchema : FullMappingSchema
+    {
+        private readonly DbManager _db;
+        private readonly bool _ignoreLazyLoad;
+
+        public FullDataBindingMappingSchema(DbManager db, bool ignoreLazyLoad = false, MappingSchema parentMappingSchema = null) 
+            : base(db, ignoreLazyLoad, parentMappingSchema, FactoryType.LazyLoadingWithDataBinding)
+        {
+            _db = db;
+            _ignoreLazyLoad = ignoreLazyLoad;
+        }
+
+        protected override ObjectMapper CreateObjectMapperInstance(Type type)
+        {
+            return new FullDataBindingObjectMapper(_db, _ignoreLazyLoad);
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/Mapping/DataBindingObjectMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,46 @@
+#region
+
+using System;
+using BLToolkit.Data;
+using BLToolkit.Reflection;
+
+#endregion
+
+namespace BLToolkit.Mapping
+{
+    public class DataBindingObjectMapper : ObjectMapper
+    {
+        private readonly Type _type;
+
+        public DataBindingObjectMapper(Type type)
+        {
+            _type = type;
+        }
+
+        public override object CreateInstance()
+        {
+            return TypeFactory.DataBindingFactory.Create(_type);
+        }
+
+        public override object CreateInstance(InitContext context)
+        {
+            return CreateInstance();
+        }
+    }
+
+    public class FullDataBindingObjectMapper : FullObjectMapper
+    {
+        public FullDataBindingObjectMapper(DbManager db, bool ignoreLazyLoading) : base(db, ignoreLazyLoading, FactoryType.LazyLoadingWithDataBinding)
+        {
+        }
+
+        public override object CreateInstance()
+        {
+            object result = ContainsLazyChild
+                                ? TypeFactory.LazyLoadingWithDataBinding.Create(PropertyType, this, LoadLazy)
+                                : base.CreateInstance();
+
+            return result;
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/Mapping/FactoryType.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+namespace BLToolkit.Mapping
+{
+    public enum FactoryType
+    {
+        LazyLoading,
+        LazyLoadingWithDataBinding,
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/Mapping/FullMappingSchema.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,306 @@
+#region
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using BLToolkit.Data;
+using BLToolkit.Reflection.Extension;
+
+#endregion
+
+namespace BLToolkit.Mapping
+{
+    public class FullMappingSchema : MappingSchema
+    {
+        #region Fields
+
+        private readonly DbManager _db;
+        private readonly bool _ignoreLazyLoad;
+        private DataTable _schema;
+        private List<string> _schemaColumns;
+        private readonly MappingSchema _parentMappingSchema;
+        private readonly FactoryType _factoryType;
+
+        private ExtensionList _extensions;
+
+        #endregion
+
+        public FullMappingSchema(DbManager db, bool ignoreLazyLoad = false, MappingSchema parentMappingSchema = null, 
+            FactoryType factoryType = FactoryType.LazyLoading)
+        {
+            _db = db;
+            _parentMappingSchema = parentMappingSchema;
+            _factoryType = factoryType;
+            _ignoreLazyLoad = ignoreLazyLoad;
+        }
+
+        #region Overrides
+
+        public override ExtensionList Extensions
+        {
+            get
+            {
+                if (_parentMappingSchema != null) 
+                    return this._parentMappingSchema.Extensions;
+                return _extensions;
+            }
+            set
+            {
+                if (_parentMappingSchema != null) 
+                    this._parentMappingSchema.Extensions = value;
+                _extensions = value;
+            }
+        }
+
+        protected override ObjectMapper CreateObjectMapperInstance(Type type)
+        {
+            return new FullObjectMapper(_db, _ignoreLazyLoad,_factoryType);
+        }
+
+        protected override void MapInternal(Reflection.InitContext initContext, IMapDataSource source, object sourceObject, IMapDataDestination dest, object destObject, params object[] parameters)
+        {
+            FullObjectMapper mapper = (FullObjectMapper)initContext.ObjectMapper;
+            IDataReader dataReader = (IDataReader)sourceObject;
+
+            //int[] index = GetIndex(source, dest);
+            //IValueMapper[] mappers = GetValueMappers(source, dest, index);
+
+            //foreach (var valueMapper in mappers)
+            //{
+                
+            //}
+
+            InitSchema(dataReader);
+
+            if (mapper.ColParent)
+            {
+                FillObject(mapper, dataReader, destObject);
+                while (dataReader.Read())
+                {
+                    destObject = FillObject(destObject, mapper, dataReader);
+                }
+            }
+            else
+                 FillObject(mapper, dataReader, destObject);
+        }
+
+        public override IList MapDataReaderToList(
+            IDataReader reader,
+            IList list,
+            Type destObjectType,
+            params object[] parameters)
+        {
+            return internalMapDataReaderToList(reader, list, destObjectType, parameters);
+        }
+
+        #endregion
+
+        #region Private methods
+
+        private object FillObject(object result, IObjectMapper mapper, IDataReader datareader)
+        {
+            foreach (IMapper map in mapper.PropertiesMapping)
+            {
+                if (map is IObjectMapper && (map as IObjectMapper).IsLazy)
+                    continue;
+                
+                if (map is CollectionFullObjectMapper)
+                {
+                    var collectionFullObjectMapper = (CollectionFullObjectMapper) map;
+                    object listInstance = collectionFullObjectMapper.Getter(result);
+                    if (listInstance == null)
+                    {
+                        listInstance = Activator.CreateInstance((map as CollectionFullObjectMapper).PropertyCollectionType);
+                        map.Setter(result, listInstance);
+                    }
+                    var list = (IList) listInstance;
+                    object fillObject = ((CollectionFullObjectMapper)map).CreateInstance();
+                    FillObject((CollectionFullObjectMapper) map, datareader, fillObject);
+
+                    if (list.Count > 0)
+                    {
+                        var curMapper = (FullObjectMapper)GetObjectMapper(fillObject.GetType());
+
+                        object lastElement = list[list.Count - 1];
+
+                        bool allPksEqual = true;
+
+                        //This is needed, because DBValue can be Null, but the Field can be Guid, wich then is filled with Guid.Empty and this is also a valid value!
+                        /*foreach (var pkIndex in pkIndexes)
+                        {
+                            var dbValue = reader.GetValue(pkIndex);
+                            if (dbValue == DBNull.Value)
+                            {
+                                pkIsNull = true;
+                                break;
+                            }
+                        }*/
+
+                        foreach (var pkGetter in curMapper.PrimaryKeyValueGetters)
+                        {
+                            object lastPk = pkGetter.Invoke(lastElement);
+                            object currentPk = pkGetter.Invoke(fillObject);
+
+                            if (!lastPk.Equals(currentPk))
+                            {
+                                allPksEqual = false;
+                                break;
+                            }
+                        }
+
+                        if (allPksEqual)
+                            continue;
+                    }
+
+                    ((IList) listInstance).Add(fillObject);
+                }
+            }
+
+            return result;
+        }
+
+        private void FillObject(IObjectMapper mapper, IDataReader datareader, object result)
+        {
+            foreach (IMapper map in mapper.PropertiesMapping)
+            {
+                if (map is IObjectMapper && (map as IObjectMapper).IsLazy)
+                    continue;
+
+                if  (map is ValueMapper)
+                {
+                    if (((ValueMapper)map).SetDataReaderIndex(_schemaColumns))
+                        continue;
+                }
+
+                if (datareader.IsDBNull(map.DataReaderIndex))
+                    continue;
+
+                if (map is ValueMapper)
+                {
+                    object value = datareader.GetValue(map.DataReaderIndex);
+
+                    try
+                    {
+                        map.Setter(result, value);
+                    }
+                    catch (Exception exception)
+                    {
+                        throw new Exception(
+                            string.Format("FillOject failed for field : {0} of class: {1}.\nColumn name : {2} Db type is: {3} and value : {4}",
+                                          map.PropertyName, mapper.PropertyType,
+                                          ((ValueMapper) map).ColumnName,
+                                          value == null ? "Null" : value.GetType().ToString(), value), exception);
+                    }
+                }
+
+                if (map is FullObjectMapper)
+                {
+                    object fillObject = ((FullObjectMapper) map).CreateInstance();
+                    FillObject((FullObjectMapper) map, datareader, fillObject);
+                    map.Setter(result, fillObject);
+                }
+
+                if (map is CollectionFullObjectMapper)
+                {
+                    var collectionFullObjectMapper = (CollectionFullObjectMapper) map;
+
+                    object listInstance = collectionFullObjectMapper.Getter(result);
+                    if (listInstance == null)
+                    {
+                        listInstance = Activator.CreateInstance((map as CollectionFullObjectMapper).PropertyCollectionType);
+                        map.Setter(result, listInstance);
+                    }
+
+                    object fillObject = ((CollectionFullObjectMapper)map).CreateInstance();
+                    FillObject((CollectionFullObjectMapper) map, datareader, fillObject);
+                    ((IList) listInstance).Add(fillObject);
+                }
+            }
+        }
+
+        private void InitSchema(IDataReader reader)
+        {
+            _schemaColumns = new List<string>();
+            _schema = reader.GetSchemaTable();
+            if (_schema != null)
+                _schema.Rows.Cast<DataRow>().ToList().ForEach(dr => _schemaColumns.Add((string)dr["ColumnName"]));
+        }
+
+        private IList internalMapDataReaderToList(
+            IDataReader reader,
+            IList list,
+            Type destObjectType,
+            params object[] parameters)
+        {
+            FullObjectMapper mapper = (FullObjectMapper)GetObjectMapper(destObjectType);
+
+            InitSchema(reader);
+
+            object currentItem = null;
+
+            List<int> pkIndexes = new List<int>();
+            foreach (var nm in mapper.PrimaryKeyNames)
+            {
+                pkIndexes.Add(mapper.PropertiesMapping.First(x => x.PropertyName == nm).DataReaderIndex);
+            }
+
+            while (reader.Read())
+            {
+                var result = mapper.CreateInstance();
+
+                FillObject(mapper, reader, result);
+                if (currentItem == null)
+                {
+                    currentItem = result;
+                    list.Add(result);
+                    continue;
+                }
+
+                bool pkIsNull = false;
+                bool allPksEqual = true;
+
+                //This is needed, because DBValue can be Null, but the Field can be Guid, wich then is filled with Guid.Empty and this is also a valid value!
+                foreach (var pkIndex in pkIndexes)
+                {
+                    var dbValue = reader.GetValue(pkIndex);
+                    if (dbValue == DBNull.Value)
+                    {
+                        pkIsNull = true;
+                        break;
+                    }
+                }
+
+                if (!pkIsNull)
+                    foreach (var pkGetter in mapper.PrimaryKeyValueGetters)
+                    {
+                        object resultPk = pkGetter.Invoke(result);
+                        object currentItemPk = pkGetter.Invoke(currentItem);
+
+                        if (!resultPk.Equals(currentItemPk))
+                        {
+                            allPksEqual = false;
+                            break;
+                        }
+                    }
+
+                if (!pkIsNull && !allPksEqual)
+                {
+                    currentItem = result;
+                    list.Add(result);
+                    //continue;
+                }
+
+                if (mapper.ColParent)
+                {
+                    FillObject(currentItem, mapper, reader);
+                }
+            }
+
+            return list;
+        }
+
+        #endregion
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/Mapping/FullObjectMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,354 @@
+#region
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+using BLToolkit.Emit;
+using BLToolkit.Reflection;
+using BLToolkit.Reflection.Extension;
+
+#endregion
+
+namespace BLToolkit.Mapping
+{
+    public class FullObjectMapper : ObjectMapper, IObjectMapper
+    {
+        #region Fields
+
+        private static readonly object SetterHandlersLock = new object();
+
+        private static readonly Dictionary<Type, Dictionary<string, SetHandler>> SettersHandlers =
+            new Dictionary<Type, Dictionary<string, SetHandler>>();
+
+        private static readonly Dictionary<Type, Dictionary<string, GetHandler>> GettersHandlers =
+            new Dictionary<Type, Dictionary<string, GetHandler>>();
+
+        private readonly DbManager _db;
+        private readonly FactoryType _factoryType;
+        private readonly bool _ignoreLazyLoad;
+
+        #endregion
+
+        public FullObjectMapper(DbManager db, bool ignoreLazyLoading, FactoryType factoryType)
+        {
+            _db = db;
+            _ignoreLazyLoad = ignoreLazyLoading;
+            _factoryType = factoryType;
+
+            PropertiesMapping = new List<IMapper>();
+            PrimaryKeyValueGetters = new List<GetHandler>();
+            PrimaryKeyNames = new List<string>();
+        }
+
+        #region IPropertiesMapping Members
+
+        public List<IMapper> PropertiesMapping { get; private set; }
+        public IPropertiesMapping ParentMapping { get; set; }
+
+        #endregion
+
+        public bool IsNullable { get; set; }
+        public bool ColParent { get; set; }
+
+        #region IMapper Members
+
+        public int DataReaderIndex { get; set; }
+        public SetHandler Setter { get; set; }
+        public Type PropertyType { get; set; }
+        public string PropertyName { get; set; }
+        public Association Association { get; set; }
+
+        #endregion
+
+        #region IObjectMapper
+
+        public bool IsLazy { get; set; }
+        public bool ContainsLazyChild { get; set; }
+        public GetHandler Getter { get; set; }
+
+        public List<string> PrimaryKeyNames { get; set; }
+
+        #endregion
+
+        #region ILazyMapper
+
+        public GetHandler ParentKeyGetter { get; set; }
+        public List<GetHandler> PrimaryKeyValueGetters { get; set; }
+
+        #endregion
+
+        #region Overrides
+
+        public override void Init(MappingSchema mappingSchema, Type type)
+        {
+            PropertyType = type;
+
+            // TODO implement this method
+            base.Init(mappingSchema, type);
+
+            int startIndex = 0;
+            GetObjectMapper(this, ref startIndex, _typeAccessor);
+        }
+
+        public override object CreateInstance()
+        {
+            object result = ContainsLazyChild
+                                ? (_factoryType == FactoryType.LazyLoading
+                                       ? TypeFactory.LazyLoading.Create(PropertyType, this, LoadLazy)
+                                       : TypeFactory.LazyLoadingWithDataBinding.Create(PropertyType, this, LoadLazy))
+                                : FunctionFactory.Remote.CreateInstance(PropertyType);
+
+            return result;
+        }
+
+        public override object CreateInstance(InitContext context)
+        {
+            return CreateInstance();
+        }
+
+        #endregion
+
+        #region Private methods
+
+        private TableDescription GetTableDescription(Type type)
+        {
+            var tableDescription = new TableDescription();
+            object[] tableAtt = type.GetCustomAttributes(typeof (TableNameAttribute), true);
+
+            if (tableAtt.Length > 0)
+            {
+                var tna = (TableNameAttribute) tableAtt[0];
+
+                tableDescription.Database = tna.Database;
+                tableDescription.Owner = tna.Owner;
+                tableDescription.TableName = tna.Name;
+            }
+
+            return tableDescription;
+        }
+
+        private IMapper GetObjectMapper(IObjectMapper mapper, ref int startIndex, TypeAccessor akTypeAccessor)
+        {
+            //Todo: Remove this Call!
+            _extension = TypeExtension.GetTypeExtension(mapper.PropertyType /*_typeAccessor.OriginalType*/, MappingSchema.Extensions);
+
+            Type mapperType = mapper.PropertyType;
+            var objectMappers = new List<IObjectMapper>();
+
+            TableDescription tableDescription = GetTableDescription(mapperType);
+
+            lock (SetterHandlersLock)
+            {
+                if (!SettersHandlers.ContainsKey(mapperType))
+                    SettersHandlers.Add(mapperType, new Dictionary<string, SetHandler>());
+
+                if (!GettersHandlers.ContainsKey(mapperType))
+                    GettersHandlers.Add(mapperType, new Dictionary<string, GetHandler>());
+            }
+
+            PropertyInfo[] properties = mapperType.GetProperties();
+
+            MemberAccessor primaryKeyMemberAccessor = null;
+            foreach (MemberAccessor ma in akTypeAccessor)
+            {
+                //  Setters
+                lock (SetterHandlersLock)
+                {
+                    if (!SettersHandlers[mapper.PropertyType].ContainsKey(ma.Name))
+                    {
+                        SettersHandlers[mapper.PropertyType].Add(ma.Name, ma.SetValue);
+                    }
+                }
+
+                if (GetPrimaryKey(ma) != null)
+                {
+                    primaryKeyMemberAccessor = ma;
+
+                    lock (SetterHandlersLock)
+                    {
+                        if (!GettersHandlers[mapperType].ContainsKey(ma.Name))
+                        {
+                            GettersHandlers[mapperType].Add(ma.Name, ma.GetValue);
+                        }
+                    }
+                    mapper.PrimaryKeyValueGetters.Add(GettersHandlers[mapperType][ma.Name]);
+                    mapper.PrimaryKeyNames.Add(ma.Name);
+
+                    if (mapper.Association != null && (mapper.Association.OtherKey == null || mapper.Association.OtherKey.Length == 0))
+                    {
+                        mapper.Association.OtherKey = new[] {ma.Name};
+                    }
+                }
+            }
+            if (primaryKeyMemberAccessor == null)
+                throw new Exception("PrimaryKey attribute not found on type: " + mapperType);
+
+            foreach (PropertyInfo prop in properties)
+            {
+                var ma = akTypeAccessor.First(x => x.Name == prop.Name);
+
+                // Check if the accessor is an association
+                var association = GetAssociation(ma);
+                if (association != null)
+                {
+                    //  Getters for IObjectMapper
+                    lock (SetterHandlersLock)
+                        if (!GettersHandlers[mapperType].ContainsKey(prop.Name))
+                        {
+                            GettersHandlers[mapperType].Add(prop.Name, ma.GetValue);
+                        }
+
+                    bool isCollection = prop.PropertyType.GetInterfaces().ToList().Contains(typeof (IList));
+                    IObjectMapper propertiesMapping;
+                    if (!isCollection)
+                    {
+                        // TODO Generate this instance using the CreateObjectMapperInstance method of fullMappingSchema
+                        // _db.MappingSchema.CreateObjectMapperInstance(prop.PropertyType)
+
+                        propertiesMapping = new FullObjectMapper(_db, _ignoreLazyLoad, _factoryType)
+                            {
+                                PropertyType = prop.PropertyType,
+                                IsNullable = association.CanBeNull,
+                                Getter = GettersHandlers[mapperType][prop.Name],
+                            };
+                    }
+                    else
+                    {
+                        Type listElementType = GetGenericType(prop.PropertyType);
+                        TableDescription colElementTableDescription = GetTableDescription(listElementType);
+
+                        // TODO Generate this instance using the CreateObjectMapperInstance method of fullMappingSchema
+                        propertiesMapping = new CollectionFullObjectMapper(_db, _factoryType)
+                            {
+                                PropertyType = listElementType,
+                                Getter = GettersHandlers[mapperType][prop.Name],
+                                TableName = colElementTableDescription.TableName,
+                                PropertyCollectionType = prop.PropertyType,
+                            };
+
+                        if (mapper is FullObjectMapper)
+                            ((FullObjectMapper) mapper).ColParent = true;
+                    }
+
+                    if (association.ThisKey == null || association.ThisKey.Length == 0)
+                        association.ThisKey = new[] {primaryKeyMemberAccessor.Name};
+
+                    bool isLazy = false;
+                    if (!_ignoreLazyLoad)
+                    {
+                        var lazy = GetLazyInstance(ma); // prop.GetCustomAttributes(typeof(LazyInstanceAttribute), true);
+                        if (lazy)
+                        {
+                            isLazy = true;
+                            mapper.ContainsLazyChild = true;
+
+                            //  Getters
+                            lock (SetterHandlersLock)
+                                if (!GettersHandlers[mapperType].ContainsKey(primaryKeyMemberAccessor.Name))
+                                {
+                                    GettersHandlers[mapperType].Add(primaryKeyMemberAccessor.Name, primaryKeyMemberAccessor.GetValue);
+                                }
+                        }
+                    }
+
+                    propertiesMapping.Association = association;
+                    propertiesMapping.PropertyName = prop.Name;
+                    propertiesMapping.IsLazy = isLazy;
+                    propertiesMapping.Setter = SettersHandlers[mapperType][prop.Name];
+
+                    if (propertiesMapping.IsLazy)
+                    {
+                        propertiesMapping.ParentKeyGetter = GettersHandlers[mapperType][primaryKeyMemberAccessor.Name];
+                    }
+                    objectMappers.Add(propertiesMapping);
+                }
+                else
+                {
+                    var mapIgnore = GetMapIgnore(ma);
+                    if (mapIgnore)
+                        continue;
+
+                    var mapField = GetMapField(ma);
+                    string columnName = mapField != null ? mapField.MapName : prop.Name;
+
+                    var map = new ValueMapper
+                        {
+                            PropertyName = prop.Name,
+                            PropertyType = prop.PropertyType,
+                            DataReaderIndex = startIndex,
+                            Setter = SettersHandlers[mapperType][prop.Name],
+                            TableName = tableDescription.TableName,
+                            ColumnName = columnName,
+                        };
+
+                    var mapColumnName = map.GetColumnName(columnName);
+                    map.ColumnAlias = columnName == mapColumnName ? null : mapColumnName;
+
+                    mapper.PropertiesMapping.Add(map);
+
+                    var pkField = GetPrimaryKey(ma);
+                    if (pkField != null)
+                        mapper.DataReaderIndex = startIndex;
+
+                    startIndex++;
+                }
+            }
+
+            foreach (IObjectMapper objMap in objectMappers)
+            {
+                #region Check mapping recursion
+
+                IObjectMapper cel = mapper;
+                while (cel != null)
+                {
+                    if (mapper.PropertyType == objMap.PropertyType)
+                        continue;
+
+                    cel = (IObjectMapper) cel.ParentMapping;
+                }
+
+                #endregion
+
+                objMap.ParentMapping = mapper;
+                mapper.PropertiesMapping.Add(GetObjectMapper(objMap, ref startIndex, MappingSchema.GetObjectMapper(objMap.PropertyType).TypeAccessor));
+            }
+
+            return mapper;
+        }
+
+        protected object LoadLazy(IMapper mapper, object proxy, Type parentType)
+        {
+            var lazyMapper = (ILazyMapper) mapper;
+            object key = lazyMapper.ParentKeyGetter(proxy);
+
+            var fullSqlQuery = new FullSqlQuery(_db, ignoreLazyLoad: true);
+            object parentLoadFull = fullSqlQuery.SelectByKey(parentType, key);
+            if (parentLoadFull == null)
+            {
+                object value = Activator.CreateInstance(mapper is CollectionFullObjectMapper
+                                                            ? (mapper as CollectionFullObjectMapper).PropertyCollectionType
+                                                            : mapper.PropertyType);
+                return value;
+            }
+
+            var objectMapper = (IObjectMapper) mapper;
+            return objectMapper.Getter(parentLoadFull);
+        }
+
+        private static Type GetGenericType(Type t)
+        {
+            if (t.IsGenericType)
+            {
+                Type[] at = t.GetGenericArguments();
+                return at.FirstOrDefault();
+            }
+            return null;
+        }
+
+        #endregion
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/Mapping/ILazyMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+using BLToolkit.Emit;
+
+namespace BLToolkit.Mapping
+{
+    public interface ILazyMapper
+    {
+        GetHandler ParentKeyGetter { get; set; }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/Mapping/IMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,13 @@
+using System;
+using BLToolkit.Emit;
+
+namespace BLToolkit.Mapping
+{
+    public interface IMapper
+    {
+        int DataReaderIndex { get; set; }
+        SetHandler Setter { get; set; }
+        Type PropertyType { get; set; }
+        string PropertyName { get; set; }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/Mapping/IObjectMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,23 @@
+
+using System.Collections.Generic;
+using BLToolkit.Emit;
+
+namespace BLToolkit.Mapping
+{
+    public interface IObjectMapper : IPropertiesMapping, IMapper, ILazyMapper
+    {
+        bool IsLazy { get; set; }
+
+        bool ContainsLazyChild { get; set; }
+
+        List<string> PrimaryKeyNames { get; set; }
+
+        /// <summary>
+        ///     Is set only for CollectionFullObjectMapper. TODO : Should refactor this?
+        /// </summary>
+        GetHandler Getter { get; set; }
+
+        List<GetHandler> PrimaryKeyValueGetters { get; set; }
+        Association Association { get; set; }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/Mapping/IPropertiesMapping.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+using System.Collections.Generic;
+
+namespace BLToolkit.Mapping
+{
+    public interface IPropertiesMapping
+    {
+        List<IMapper> PropertiesMapping { get; }
+        IPropertiesMapping ParentMapping { get; set; }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/Mapping/LazyValueLoadInterceptor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,47 @@
+using System;
+using Castle.DynamicProxy;
+using IInterceptor = Castle.DynamicProxy.IInterceptor;
+
+namespace BLToolkit.Mapping
+{
+    public class LazyValueLoadInterceptor : IInterceptor
+    {
+        #region Fields
+
+        private readonly IObjectMapper _mapper;
+        private readonly Func<IMapper, object, Type, object> _lazyLoader;
+        private bool _intercepted;
+
+        #endregion
+
+        public LazyValueLoadInterceptor(IObjectMapper mapper, Func<IMapper, object, Type, object> lazyLoader)
+        {
+            _mapper = mapper;
+            _lazyLoader = lazyLoader;
+        }
+
+        public void Intercept(IInvocation invocation)
+        {
+            if (invocation.Method.Name.StartsWith("get_"))
+            {
+                string propertyName = invocation.Method.Name.Substring(4);
+
+                foreach (IMapper map in _mapper.PropertiesMapping)
+                {
+                    if (map.PropertyName == propertyName)
+                    {
+                        if (!_intercepted)
+                        {
+                            _intercepted = true;
+                            map.Setter(invocation.Proxy, _lazyLoader(map, invocation.Proxy, invocation.TargetType));
+                        }
+                        break;
+                    }
+                }
+            }
+
+            // let the original call go through first, so we can notify *after*
+            invocation.Proceed();
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/Mapping/MappingOrder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+namespace BLToolkit.Mapping
+{
+    public enum MappingOrder
+    {
+        ByColumnName,
+        ByColumnIndex,
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/Mapping/NotifyPropertyChangedInterceptor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,48 @@
+#region
+
+using System.ComponentModel;
+using Castle.DynamicProxy;
+
+#endregion
+
+namespace BLToolkit.Mapping
+{
+    public class NotifyPropertyChangedInterceptor : IInterceptor
+    {
+        private readonly string _typeName;
+        private PropertyChangedEventHandler _subscribers = delegate { };
+
+        public NotifyPropertyChangedInterceptor(string typeName)
+        {
+            _typeName = typeName;
+        }
+
+        public void Intercept(IInvocation invocation)
+        {
+            if (invocation.Method.DeclaringType == typeof (TypeFactory.DataBindingFactory.IMarkerInterface))
+            {
+                invocation.ReturnValue = _typeName;
+                return;
+            }
+            if (invocation.Method.DeclaringType == typeof (INotifyPropertyChanged))
+            {
+                var propertyChangedEventHandler = (PropertyChangedEventHandler) invocation.Arguments[0];
+                if (invocation.Method.Name.StartsWith("add_"))
+                {
+                    _subscribers += propertyChangedEventHandler;
+                }
+                else
+                {
+                    _subscribers -= propertyChangedEventHandler;
+                }
+                return;
+            }
+            invocation.Proceed();
+            if (invocation.Method.Name.StartsWith("set_"))
+            {
+                var propertyName = invocation.Method.Name.Substring(4);
+                _subscribers(invocation.InvocationTarget, new PropertyChangedEventArgs(propertyName));
+            }
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/Mapping/OwnerDescription.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+namespace BLToolkit.Mapping
+{
+    public class OwnerDescription
+    {
+        public string Database { get; set; }
+        public string Owner { get; set; }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/Mapping/TableDescription.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,7 @@
+namespace BLToolkit.Mapping
+{
+    public class TableDescription : OwnerDescription
+    {
+        public string TableName { get; set; }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/Mapping/TypeFactory.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,48 @@
+using System;
+using System.ComponentModel;
+using Castle.DynamicProxy;
+
+namespace BLToolkit.Mapping
+{
+    public static class TypeFactory
+    {
+        private static readonly ProxyGenerator ProxyGenerator = new ProxyGenerator();
+
+        public static class LazyLoading
+        {
+            public static object Create(Type type, IObjectMapper mapper, Func<IMapper, object, Type, object> lazyLoader)
+            {
+                return ProxyGenerator.CreateClassProxy(type, new LazyValueLoadInterceptor(mapper, lazyLoader));
+            }
+        }
+
+        public static class LazyLoadingWithDataBinding
+        {
+            public static object Create(Type type, IObjectMapper mapper, Func<IMapper, object, Type, object> lazyLoader)
+            {
+                return ProxyGenerator.CreateClassProxy(type, new[]
+                    {
+                        typeof (INotifyPropertyChanged),
+                        typeof (DataBindingFactory.IMarkerInterface)
+                    }, new LazyValueLoadInterceptor(mapper, lazyLoader), new NotifyPropertyChangedInterceptor(type.FullName));
+            }
+        }
+
+        public static class DataBindingFactory
+        {
+            public static object Create(Type type)
+            {
+                return ProxyGenerator.CreateClassProxy(type, new[]
+                    {
+                        typeof (INotifyPropertyChanged),
+                        typeof (IMarkerInterface)
+                    }, new NotifyPropertyChangedInterceptor(type.FullName));
+            }
+
+            public interface IMarkerInterface
+            {
+                string TypeName { get; }
+            }
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/Mapping/ValueMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,109 @@
+using System;
+using System.Collections.Generic;
+using BLToolkit.Emit;
+
+namespace BLToolkit.Mapping
+{
+    public class ValueMapper : TableDescription, IMapper
+    {
+        private readonly Dictionary<string, List<string>> _columnVariations = new Dictionary<string, List<string>>();
+        private readonly Dictionary<string, int> _columnOccurences = new Dictionary<string, int>();
+
+        public string ColumnAlias { get; set; }
+        public string ColumnName { get; set; }
+
+        #region IMapper Members
+
+        public int DataReaderIndex { get; set; }
+        public SetHandler Setter { get; set; }
+        public Type PropertyType { get; set; }
+        public string PropertyName { get; set; }
+
+        #endregion
+
+        public string GetColumnName(string columnName)
+        {
+            int occurenceCount;
+            if (_columnOccurences.ContainsKey(columnName))
+            {
+                occurenceCount = _columnOccurences[columnName] + 1;
+                _columnOccurences[columnName] = occurenceCount;
+            }
+            else
+            {
+                _columnOccurences[columnName] = 1;
+                occurenceCount = 1;
+            }
+
+            string res = columnName + (occurenceCount > 1 ? string.Format("_{0}", occurenceCount - 1) : "");
+
+            var variations = new List<string>();
+            if (_columnVariations.ContainsKey(columnName))
+            {
+                variations = _columnVariations[columnName];
+            }
+
+            variations.Add(res);
+            _columnVariations[columnName] = variations;
+
+            return res;
+        }
+
+        public bool SetDataReaderIndex(List<string> schemaColumns)
+        {
+            string colName = ColumnName;
+            int index = -1;
+            if (!schemaColumns.Contains(colName))
+            {
+                bool found = false;
+                int order = 1;
+                foreach (string key in _columnVariations.Keys)
+                {
+                    List<string> variations = _columnVariations[key];
+                    if (variations.Contains(colName))
+                    {
+                        if (colName.Contains(key + "_"))
+                        {
+                            string orderString = colName.Replace(key + "_", "");
+                            order = int.Parse(orderString) + 1;
+                            colName = key;
+                            found = true;
+                            break;
+                        }
+                    }
+                }
+                if (found)
+                {
+                    int i = 0, occurenceCnt = 0;
+                    foreach (string column in schemaColumns)
+                    {
+                        if (column == colName)
+                        {
+                            occurenceCnt++;
+                            if (occurenceCnt == order)
+                            {
+                                index = i;
+                                break;
+                            }
+                        }
+                        i++;
+                    }
+                }
+                else
+                {
+                    // TODO Check this condition...
+                    //if (!_ignoreMissingColumns)
+                    //{
+                    //    throw new Exception(string.Format("Couldnt find db column {0} in the query result", colName));
+                    //}
+                    return true;
+                }
+            }
+            else
+                index = schemaColumns.IndexOf(colName);
+
+            DataReaderIndex = index;
+            return false;
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,33 @@
+using System.Reflection;
+using System.Runtime.InteropServices;
+using BLToolkit;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle(BLToolkitConstants.ProductName        + " JointureAddOn")]
+[assembly: AssemblyDescription(BLToolkitConstants.ProductDescription + " JointureAddOn")]
+[assembly: AssemblyProduct(BLToolkitConstants.ProductName + " JointureAddOn")]
+[assembly: AssemblyCopyright(BLToolkitConstants.Copyright)]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("0ec636e7-9d1d-458b-b899-2f1d101cf7b6")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion(BLToolkitConstants.FullVersionString)]
+[assembly: AssemblyFileVersion(BLToolkitConstants.FullVersionString)]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/Reflection/FullInitContext.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,38 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+
+using BLToolkit.Mapping;
+
+namespace BLToolkit.Reflection
+{
+    public class FullInitContext
+    {
+        public object[] MemberParameters { get; set; }
+        public object[] Parameters { get; set; }
+        public bool IsInternal { get; set; }
+        public bool IsLazyInstance { get; set; }
+        public object Parent { get; set; }
+        public object SourceObject { get; set; }
+        public FullObjectMapper ObjectMapper { get; set; }
+        public MappingSchema MappingSchema { get; set; }
+        public bool IsSource { get; set; }
+        public bool StopMapping { get; set; }
+        public IMapDataSource DataSource { get; set; }
+
+        private Dictionary<object, object> _items;
+        public Dictionary<object, object> Items
+        {
+            [DebuggerStepThrough]
+            get { return _items ?? (_items = new Dictionary<object, object>()); }
+        }
+
+        public bool IsDestination
+        {
+            [DebuggerStepThrough]
+            get { return !IsSource; }
+            [DebuggerStepThrough]
+            set { IsSource = !value; }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Extensions/JointureAddOn/packages.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="Castle.Core" version="3.2.1" targetFramework="net40" />
+</packages>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Aspects/AsyncAspect.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,83 @@
+using System;
+using System.Threading;
+
+using NUnit.Framework;
+
+using BLToolkit.Aspects;
+using BLToolkit.Reflection;
+
+namespace HowTo.Aspects
+{
+	public /*[a]*/abstract/*[/a]*/ class AsyncTestObject
+	{
+		// This is a member we will call asynchronously.
+		//
+		public /*[a]*/int/*[/a]*/ /*[a]*/Test/*[/a]*/(/*[a]*/int intVal, string strVal/*[/a]*/)
+		{
+			Thread.Sleep(200);
+			return intVal;
+		}
+
+		// Begin async method should take the same parameter list as the Test method and return IAsyncResult.
+		// Two additional parameters can be provided: AsyncCallback and state object.
+		// 'Begin' prefix is a part of the default naming convention.
+		//
+		[/*[a]*/Async/*[/a]*/] public abstract /*[a]*/IAsyncResult/*[/a]*/ /*[a]*/BeginTest/*[/a]*/(/*[a]*/int intVal, string strVal/*[/a]*/);
+		[/*[a]*/Async/*[/a]*/] public abstract /*[a]*/IAsyncResult/*[/a]*/ /*[a]*/BeginTest/*[/a]*/(/*[a]*/int intVal, string strVal/*[/a]*/, /*[a]*/AsyncCallback/*[/a]*/ callback);
+		[/*[a]*/Async/*[/a]*/] public abstract /*[a]*/IAsyncResult/*[/a]*/ /*[a]*/BeginTest/*[/a]*/(/*[a]*/int intVal, string strVal/*[/a]*/, /*[a]*/AsyncCallback/*[/a]*/ callback, /*[a]*/object/*[/a]*/ state);
+
+		// End async method should take IAsyncResult and return the same type as the Test method.
+		// 'End' prefix is a part of the default naming convention.
+		//
+		[/*[a]*/Async/*[/a]*/] public abstract /*[a]*/int/*[/a]*/          /*[a]*/EndTest/*[/a]*/  (/*[a]*/IAsyncResult/*[/a]*/ asyncResult);
+
+		// Begin/End naming convention is not required. You can use any name 
+		// if you provide the target method name as a parameter of the Async attribute.
+		//
+		[/*[a]*/Async/*[/a]*/("Test")]
+		public abstract /*[a]*/IAsyncResult/*[/a]*/ AnyName(/*[a]*/int intVal/*[/a]*/, /*[a]*/string strVal/*[/a]*/, /*[a]*/AsyncCallback/*[/a]*/ callback, /*[a]*/object/*[/a]*/ state);
+
+		// Here we provide the parameter list along with the method name.
+		//
+		[/*[a]*/Async/*[/a]*/("Test", typeof(int), typeof(string))]
+		public abstract /*[a]*/int/*[/a]*/         AnyName(/*[a]*/IAsyncResult/*[/a]*/ asyncResult);
+	}
+
+	[TestFixture]
+	public class AsyncAspectTest
+	{
+		[Test]
+		public void AsyncTest()
+		{
+			AsyncTestObject o = /*[a]*/TypeAccessor/*[/a]*/<AsyncTestObject>.CreateInstance();
+
+			IAsyncResult ar = o./*[a]*/BeginTest/*[/a]*/(1, "10");
+			Assert.AreEqual(1, o./*[a]*/EndTest/*[/a]*/(ar));
+		}
+
+		private static void /*[a]*/CallBack/*[/a]*/(IAsyncResult ar)
+		{
+			Console.WriteLine("Callback");
+
+			AsyncTestObject o = (AsyncTestObject)ar.AsyncState;
+			o.EndTest(ar);
+		}
+
+		[Test]
+		public void CallbackTest()
+		{
+			AsyncTestObject o = TypeAccessor<AsyncTestObject>.CreateInstance();
+
+			o.BeginTest(2, null, /*[a]*/CallBack/*[/a]*/, /*[a]*/o/*[/a]*/);
+		}
+
+		[Test]
+		public void AnyNameTest()
+		{
+			AsyncTestObject o = TypeAccessor<AsyncTestObject>.CreateInstance();
+
+			IAsyncResult ar = o./*[a]*/AnyName/*[/a]*/(2, null, null, null);
+			Assert.AreEqual(2, o./*[a]*/AnyName/*[/a]*/(ar));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Aspects/CacheAspect.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,87 @@
+using System;
+using System.Reflection;
+
+using NUnit.Framework;
+
+using BLToolkit.Aspects;
+using BLToolkit.Reflection;
+
+namespace HowTo.Aspects
+{
+	public /*[a]*/abstract/*[/a]*/ class TestClass
+	{
+		public static int Value;
+
+		// This is a method we will cache. Cached return value depends on input parameters.
+		// We will change the 'Value' field outside of the class and see how it affects the result.
+		//
+		[/*[a]*/Cache/*[/a]*/(MaxCacheTime=500, IsWeak=false)]
+		public /*[a]*/virtual/*[/a]*/ int CachedMethod(int p1, int p2)
+		{
+			return Value;
+		}
+
+		public static TestClass CreateInstance()
+		{
+			// Use TypeAccessor to create an instance of an abstract class.
+			//
+			return /*[a]*/TypeAccessor/*[/a]*/<TestClass>.CreateInstance();
+		}
+	}
+
+	[TestFixture]
+	public class CacheAspectTest
+	{
+		[Test]
+		public void Test1()
+		{
+			TestClass tc = TestClass.CreateInstance();
+
+			DateTime begin = DateTime.Now;
+
+			// Initial setup for the test static variable.
+			//
+			TestClass.Value = 777;
+
+			while (tc.CachedMethod(2, 2) == 777)
+			{
+				// This change will not affect the Test method return value for 500 ms.
+				//
+				TestClass.Value++;
+			}
+
+			double totalMilliseconds = (DateTime.Now - begin).TotalMilliseconds;
+
+			Assert.GreaterOrEqual(totalMilliseconds, 500);
+		}
+
+		[Test]
+		public void Test2()
+		{
+			TestClass tc = TestClass.CreateInstance();
+
+			// Return value depends on parameter values.
+			//
+			TestClass.Value = /*[a]*/1/*[/a]*/; Assert.AreEqual(/*[a]*/1/*[/a]*/, tc.CachedMethod(1, 1));
+			TestClass.Value = /*[a]*/2/*[/a]*/; Assert.AreEqual(/*[a]*/1/*[/a]*/, tc.CachedMethod(1, 1)); // no change
+			TestClass.Value = /*[a]*/3/*[/a]*/; Assert.AreEqual(/*[a]*/3/*[/a]*/, tc.CachedMethod(2, 1));
+
+			// However we can clear cache manually.
+			// For particular method:
+			//
+			CacheAspect.ClearCache(typeof(TestClass), "CachedMethod", typeof(int), typeof(int));
+			TestClass.Value = /*[a]*/4/*[/a]*/; Assert.AreEqual(/*[a]*/4/*[/a]*/, tc.CachedMethod(2, 1));
+
+			// By MethodInfo:
+			//
+			MethodInfo methodInfo = tc.GetType().GetMethod("CachedMethod", new Type[] { typeof(int), typeof(int) });
+			CacheAspect.ClearCache(methodInfo);
+			TestClass.Value = /*[a]*/5/*[/a]*/; Assert.AreEqual(/*[a]*/5/*[/a]*/, tc.CachedMethod(2, 1));
+
+			// For the all cached methods.
+			//
+			CacheAspect.ClearCache();
+			TestClass.Value = /*[a]*/6/*[/a]*/; Assert.AreEqual(/*[a]*/6/*[/a]*/, tc.CachedMethod(2, 1));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Aspects/ClearCacheAspect.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,83 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Aspects;
+using BLToolkit.Reflection;
+
+namespace HowTo.Aspects
+{
+	[TestFixture]
+	public class ClearCacheAspect
+	{
+		public /*[a]*/abstract/*[/a]*/ class TestClass
+		{
+			public static int Value;
+
+			// This is a method we will cache. Cached return value depends on input parameters.
+			// We will change the 'Value' field outside of the class and see how it affects the result.
+			//
+			[/*[a]*/Cache/*[/a]*/(MaxCacheTime=500, IsWeak=false)]
+			public /*[a]*/virtual/*[/a]*/ int CachedMethod(int p1, int p2)
+			{
+				return Value;
+			}
+
+			// This method clears the CachedMethod cache.
+			//
+			[/*[a]*/ClearCache/*[/a]*/(/*[a]*/"CachedMethod"/*[/a]*/)]
+			public abstract void ClearCache();
+
+			// The CachedMethod is specified by name and parameters.
+			// Also you can use declaring method type.
+			//
+			[/*[a]*/ClearCache/*[/a]*/(/*[a]*/"CachedMethod"/*[/a]*/, /*[a]*/typeof(int), typeof(int)/*[/a]*/)]
+			public abstract void ClearCache2();
+
+			// This method clears all caches for provided type.
+			//
+			[/*[a]*/ClearCache/*[/a]*/(/*[a]*/typeof(TestClass)/*[/a]*/)]
+			public abstract void ClearAll();
+
+			// This method clears all caches for current type.
+			//
+			[/*[a]*/ClearCache/*[/a]*/]
+			public abstract void ClearAll2();
+
+			public static TestClass CreateInstance()
+			{
+				// Use TypeAccessor to create an instance of an abstract class.
+				//
+				return /*[a]*/TypeAccessor/*[/a]*/<TestClass>.CreateInstance();
+			}
+		}
+
+		[Test]
+		public void Test()
+		{
+			TestClass tc = TypeAccessor<TestClass>.CreateInstance();
+
+			TestClass.Value = 1;
+
+			int value1 = tc.CachedMethod(1, 2);
+
+			TestClass.Value = 2;
+
+			int value2 = tc.CachedMethod(1, 2);
+
+			// The cached values are equal.
+			//
+			Assert.AreEqual(value1, value2);
+
+			tc.ClearCache();
+
+			TestClass.Value = 3;
+
+			// Previous and returned values are not equal.
+			//
+			Assert.AreNotEqual(value1, tc.CachedMethod(1, 2));
+
+			tc.ClearCache2();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Aspects/CounterAspect.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,62 @@
+using System;
+using System.Reflection;
+
+using NUnit.Framework;
+
+using BLToolkit.Aspects;
+using BLToolkit.Reflection;
+
+namespace HowTo.Aspects
+{
+	[TestFixture]
+	public class CounterAspectTest
+	{
+		public /*[a]*/abstract/*[/a]*/ class TestClass
+		{
+			// This is a method we collect statistic for.
+			// Actually the entire class or even a base class 
+			// can be decorated with the attribute.
+			//
+			[/*[a]*/Counter/*[/a]*/]
+			public /*[a]*/virtual/*[/a]*/ void TestMethod()
+			{
+			}
+		}
+
+		[Test]
+		public void Test()
+		{
+			TestClass t = TypeAccessor<TestClass>.CreateInstance();
+
+			for (int i = 0; i < 10; i++)
+				t.TestMethod();
+
+			MethodInfo     methodInfo = typeof(TestClass).GetMethod("TestMethod");
+			MethodCallCounter counter = CounterAspect.GetCounter(methodInfo);
+
+			Assert.AreEqual(10, counter.TotalCount);
+
+			Console.WriteLine(@"
+Method         : {0}.{1}
+TotalCount     : {2}
+ExceptionCount : {3}
+CachedCount    : {4}
+CurrentCalls   : {5}
+TotalTime      : {6}
+MinTime        : {7}
+MaxTime        : {8}
+AverageTime    : {9}
+",
+				counter.MethodInfo.DeclaringType.Name,
+				counter.MethodInfo.Name,
+				counter.TotalCount,              // total actual calls (no cached calls)
+				counter.ExceptionCount,          // calls with exceptions
+				counter.CachedCount,             // cached calls
+				counter.CurrentCalls.Count,      // current calls (make sense for multithreading)
+				counter.TotalTime,               // total work time
+				counter.MinTime,                 // min call time
+				counter.MaxTime,                 // max call time
+				counter.AverageTime);            // average call time
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Aspects/LoggingAspect.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,63 @@
+using System;
+using System.Threading;
+
+using NUnit.Framework;
+
+using BLToolkit.Aspects;
+using BLToolkit.Reflection;
+
+namespace HowTo.Aspects
+{
+	[TestFixture]
+	public class LoggingAspectTest
+	{
+		[/*[a]*/Log/*[/a]*/]
+		public /*[a]*/abstract/*[/a]*/ class TestClass
+		{
+			// Here we customize the logging settings.
+			// This call will be logged in spite of default settings.
+			//
+			[/*[a]*/Log/*[/a]*/(/*[a]*/MinCallTime=50/*[/a]*/)]
+			public /*[a]*/virtual/*[/a]*/ void Test1(int i)
+			{
+				Thread.Sleep(/*[a]*/100/*[/a]*/);
+			}
+
+			// This call is not going to be logged (see default settings below).
+			//
+			public /*[a]*/virtual/*[/a]*/ void Test2(DateTime dt)
+			{
+				Thread.Sleep(/*[a]*/100/*[/a]*/);
+			}
+
+			// By default exception calls are logged.
+			//
+			public /*[a]*/virtual/*[/a]*/ void Test3(string s)
+			{
+				throw new ApplicationException("Test exception.");
+			}
+		}
+
+		[Test]
+		public void Test()
+		{
+			// By setting MinCallTime to some value, we prevent logging any call
+			// which is shorter than the provided value.
+			//
+			LoggingAspect.MinCallTime = /*[a]*/1000/*[/a]*/;
+
+			TestClass t = /*[a]*/TypeAccessor/*[/a]*/<TestClass>.CreateInstance();
+
+			t.Test1(1);
+			t.Test2(DateTime.Now);
+
+			try
+			{
+				t.Test3("3");
+			}
+			catch
+			{
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Aspects/MixinAspect.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,68 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Aspects;
+using BLToolkit.Reflection;
+
+namespace HowTo.Aspects
+{
+	[TestFixture]
+	public class MixinAspectTest
+	{
+		public interface ITestInterface1
+		{
+			int TestMethod(int value);
+		}
+
+		public class TestInterface1Impl : ITestInterface1
+		{
+			public int TestMethod(int value) { return value; }
+		}
+
+		public interface ITestInterface2
+		{
+			int TestMethod1(int value);
+			int TestMethod2(int value);
+		}
+
+		public class TestInterface2Impl : ITestInterface2
+		{
+			public int TestMethod1(int value) { return value; }
+			public int TestMethod2(int value) { return value; }
+		}
+
+		[/*[a]*/Mixin/*[/a]*/(/*[a]*/typeof/*[/a]*/(/*[a]*/ITestInterface1/*[/a]*/), /*[a]*/"_testInterface1"/*[/a]*/)]
+		[/*[a]*/Mixin/*[/a]*/(/*[a]*/typeof/*[/a]*/(/*[a]*/ITestInterface2/*[/a]*/), /*[a]*/"TestInterface2"/*[/a]*/, "'{0}.{1}' is null.")]
+		public /*[a]*/abstract/*[/a]*/ class TestClass
+		{
+			public TestClass()
+			{
+				/*[a]*/_testInterface1/*[/a]*/ = new /*[a]*/TestInterface1Impl/*[/a]*/();
+			}
+
+			/*[a]*/protected/*[/a]*/ /*[a]*/object/*[/a]*/          /*[a]*/_testInterface1/*[/a]*/;
+
+			private   ITestInterface2 _testInterface2;
+			public    /*[a]*/ITestInterface2/*[/a]*/  /*[a]*/TestInterface2/*[/a]*/
+			{
+				get { return _testInterface2 ?? (_testInterface2 = new /*[a]*/TestInterface2Impl/*[/a]*/()); }
+			}
+
+			[/*[a]*/MixinOverride/*[/a]*/(typeof(/*[a]*/ITestInterface2/*[/a]*/))]
+			protected int TestMethod1(int value) { return /*[a]*/15/*[/a]*/; }
+		}
+
+		[Test]
+		public void Test()
+		{
+			TestClass       tc = /*[a]*/TypeAccessor/*[/a]*/<TestClass>.CreateInstance();
+			ITestInterface1 i1 = (ITestInterface1)tc;
+			ITestInterface2 i2 = (ITestInterface2)tc;
+
+			Assert.AreEqual(/*[a]*/10/*[/a]*/, i1.TestMethod (/*[a]*/10/*[/a]*/));
+			Assert.AreEqual(/*[a]*/15/*[/a]*/, i2.TestMethod1(/*[a]*/20/*[/a]*/));
+			Assert.AreEqual(/*[a]*/30/*[/a]*/, i2.TestMethod2(/*[a]*/30/*[/a]*/));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Aspects/NoCache.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,49 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Aspects;
+using BLToolkit.Reflection;
+
+namespace HowTo.Aspects
+{
+	[/*[a]*/Cache/*[/a]*/]
+	public /*[a]*/abstract/*[/a]*/ class NoCacheTestClass
+	{
+		public static int Value;
+
+		public /*[a]*/virtual/*[/a]*/ int CachedMethod(int p1, int p2)
+		{
+			return Value;
+		}
+
+		[/*[a]*/NoCache/*[/a]*/]
+		public /*[a]*/virtual/*[/a]*/ int NoCacheMethod(int p1, int p2)
+		{
+			return Value;
+		}
+
+		public static NoCacheTestClass CreateInstance()
+		{
+			// Use TypeAccessor to create an instance of an abstract class.
+			//
+			return /*[a]*/TypeAccessor/*[/a]*/<NoCacheTestClass>.CreateInstance();
+		}
+	}
+
+	[TestFixture]
+	public class NoCacheAttributeTest
+	{
+		[Test]
+		public void Test()
+		{
+			NoCacheTestClass t = TypeAccessor<NoCacheTestClass>.CreateInstance();
+
+			NoCacheTestClass.Value = 1; Assert.AreEqual(/*[a]*/1/*[/a]*/, t.CachedMethod(1, 1));
+			NoCacheTestClass.Value = 2; Assert.AreEqual(/*[a]*/1/*[/a]*/, t.CachedMethod(1, 1)); // no change
+
+			NoCacheTestClass.Value = 3; Assert.AreEqual(/*[a]*/3/*[/a]*/, t.NoCacheMethod(2, 1));
+			NoCacheTestClass.Value = 4; Assert.AreEqual(/*[a]*/4/*[/a]*/, t.NoCacheMethod(2, 1));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Aspects/NotNull.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,48 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Aspects;
+using BLToolkit.Reflection;
+
+namespace HowTo.Aspects
+{
+	[TestFixture]
+	public class NotNullTest
+	{
+		public /*[a]*/abstract/*[/a]*/ class TestObject
+		{
+			public /*[a]*/virtual/*[/a]*/ void Foo1(string str1, [/*[a]*/NotNull/*[/a]*/]              string str2, string str3) {}
+			public /*[a]*/virtual/*[/a]*/ void Foo2(string str1, [/*[a]*/NotNull/*[/a]*/(/*[a]*/"Null"/*[/a]*/)]      string str2, string str3) {}
+			public /*[a]*/virtual/*[/a]*/ void Foo3(string str1, [/*[a]*/NotNull/*[/a]*/(/*[a]*/"Null: {0}"/*[/a]*/)] string str2, string str3) {}
+
+			public static TestObject CreateInstance() { return /*[a]*/TypeAccessor/*[/a]*/<TestObject>.CreateInstance(); }
+		}
+
+		[Test, ExpectedException(typeof(ArgumentNullException))] // Error message is localized by framework.
+		public void Test1()
+		{
+			TestObject o = TestObject.CreateInstance();
+
+			o.Foo1("str1", /*[a]*/null/*[/a]*/, "str3");
+		}
+
+		[Test]
+		[ExpectedException(typeof(ArgumentNullException), ExpectedMessage="Null")]
+		public void Test2()
+		{
+			TestObject o = TestObject.CreateInstance();
+
+			o.Foo2("str1", /*[a]*/null/*[/a]*/, "str3");
+		}
+
+		[Test]
+		[ExpectedException(typeof(ArgumentNullException), ExpectedMessage="Null: str2")]
+		public void Test3()
+		{
+			TestObject o = TestObject.CreateInstance();
+
+			o.Foo3("str1", /*[a]*/null/*[/a]*/, "str3");
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Aspects/OverloadAspect.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,37 @@
+using NUnit.Framework;
+
+using BLToolkit.Aspects;
+using BLToolkit.Reflection;
+
+namespace HowTo.Aspects
+{
+	public /*[a]*/abstract/*[/a]*/ class OverloadTestObject
+	{
+		// This is a member we will overload.
+		//
+		public int /*[a]*/Test/*[/a]*/(/*[a]*/int intVal, string strVal/*[/a]*/)
+		{
+			return intVal;
+		}
+
+		// Overloaded methods simply calls a base method with same name
+		// and has a few parameters less or more.
+		//
+		[/*[a]*/Overload/*[/a]*/] public abstract int /*[a]*/Test/*[/a]*/(/*[a]*/int intVal/*[/a]*/);
+		[/*[a]*/Overload/*[/a]*/] public abstract int /*[a]*/Test/*[/a]*/(/*[a]*/string strVal/*[/a]*/);
+		[/*[a]*/Overload/*[/a]*/] public abstract int /*[a]*/Test/*[/a]*/(int intVal, string strVal, /*[a]*/bool boolVal/*[/a]*/);
+	}
+
+	[TestFixture]
+	public class OverloadAspectTest
+	{
+		[Test]
+		public void OverloadTest()
+		{
+			OverloadTestObject o = /*[a]*/TypeAccessor/*[/a]*/<OverloadTestObject>.CreateInstance();
+
+			Assert.AreEqual(1, o./*[a]*/Test/*[/a]*/(1));
+			Assert.AreEqual(0, o./*[a]*/Test/*[/a]*/("str"));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/AdoDemo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,108 @@
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Data.SqlClient;
+
+using NUnit.Framework;
+
+namespace HowTo.Data
+{
+	[TestFixture]
+	public class AdoDemo
+	{
+		// Typified definition of the Gender database field.
+		//
+		public enum Gender
+		{
+			Female,
+			Male,
+			Unknown,
+			Other
+		}
+
+		// Business object.
+		//
+		public class Person
+		{
+			public int    ID         { get; set; }
+			public string FirstName  { get; set; }
+			public string MiddleName { get; set; }
+			public string LastName   { get; set; }
+			public /*[a]*/Gender/*[/a]*/ Gender     { get; set; }
+		}
+
+		// ADO.NET data access method.
+		//
+		public List<Person> /*[a]*/GetList/*[/a]*/(Gender gender)
+		{
+			// Map the typified parameter value to its database representation.
+			//
+			string paramValue = "";
+
+			switch (gender)
+			{
+				case Gender.Female:  paramValue = "F"; break;
+				case Gender.Male:    paramValue = "M"; break;
+				case Gender.Unknown: paramValue = "U"; break;
+				case Gender.Other:   paramValue = "O"; break;
+			}
+
+			// Read a database configuration string.
+			//
+			string cs = ConfigurationManager.ConnectionStrings["DemoConnection"].ConnectionString;
+
+			// Create and open a database connection.
+			//
+			using (SqlConnection con = new SqlConnection(cs))
+			{
+				con.Open();
+
+				// Create and initialize a Command object.
+				//
+				using (SqlCommand cmd = con.CreateCommand())
+				{
+					cmd.CommandText = "SELECT * FROM Person WHERE Gender = @gender";
+					cmd.Parameters.AddWithValue("@gender", paramValue);
+
+					// Execute query.
+					//
+					using (SqlDataReader rd = cmd.ExecuteReader())
+					{
+						List<Person> list = new List<Person>();
+
+						while (rd.Read())
+						{
+							Person person = new Person();
+
+							// Map a data reader row to a business object.
+							//
+							person.ID         = Convert.ToInt32 (rd["PersonID"]);
+							person.FirstName  = Convert.ToString(rd["FirstName"]);
+							person.MiddleName = Convert.ToString(rd["MiddleName"]);
+							person.LastName   = Convert.ToString(rd["LastName"]);
+
+							switch (rd["Gender"].ToString())
+							{
+								case "F": person.Gender = Gender.Female;  break;
+								case "M": person.Gender = Gender.Male;    break;
+								case "U": person.Gender = Gender.Unknown; break;
+								case "O": person.Gender = Gender.Other;   break;
+							}
+
+							list.Add(person);
+						}
+
+						return list;
+					}
+				}
+			}
+		}
+
+		[Test]
+		public void Test()
+		{
+			List<Person> list = GetList(Gender.Male);
+			Assert.Greater(list.Count, 0);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/Close.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,37 @@
+using System;
+using NUnit.Framework;
+using BLToolkit.Data;
+
+namespace HowTo.Data
+{
+	[TestFixture]
+	public class Close
+	{
+		[Test]
+		public void Test1()
+		{
+			var db = new DbManager();
+
+			/*[a]*/try/*[/a]*/
+			{
+				// ...
+			}
+			/*[a]*/finally/*[/a]*/
+			{
+				if (db != null)
+					db./*[a]*/Close/*[/a]*/();
+			}
+		}
+
+		// Consider using the C# [b][i]using[/i][/b] statement instead.
+		//
+		[Test]
+		public void Test2()
+		{
+			/*[a]*/using (var db = new DbManager())/*[/a]*/
+			{
+				// ...
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/ComplexMapping.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,216 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Mapping;
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+using BLToolkit.Reflection.Extension;
+
+namespace HowTo.Data
+{
+	[TestFixture]
+	public class ComplexMapping
+	{
+		const string TestQuery = @"
+			-- Parent Data
+			SELECT       1 as ParentID
+			UNION SELECT 2 as ParentID
+
+			-- Child Data
+			SELECT       4 ChildID, 1 as ParentID
+			UNION SELECT 5 ChildID, 2 as ParentID
+			UNION SELECT 6 ChildID, 2 as ParentID
+			UNION SELECT 7 ChildID, 1 as ParentID
+
+			-- Grandchild Data
+			SELECT       1 GrandchildID, 4 as ChildID
+			UNION SELECT 2 GrandchildID, 4 as ChildID
+			UNION SELECT 3 GrandchildID, 5 as ChildID
+			UNION SELECT 4 GrandchildID, 5 as ChildID
+			UNION SELECT 5 GrandchildID, 6 as ChildID
+			UNION SELECT 6 GrandchildID, 6 as ChildID
+			UNION SELECT 7 GrandchildID, 7 as ChildID
+			UNION SELECT 8 GrandchildID, 7 as ChildID
+";
+
+		public class Parent
+		{
+			[MapField("ParentID"), /*[a]*/PrimaryKey/*[/a]*/]
+			public int ID;
+
+			/*[a]*/[Relation(typeof(Child))]/*[/a]*/
+			public List<Child> Children = new List<Child>();
+		}
+
+		[MapField("ParentID", "Parent.ID")]
+		public class Child
+		{
+			[MapField("ChildID"), /*[a]*/PrimaryKey/*[/a]*/]
+			public int ID;
+
+			/*[a]*/[Relation]/*[/a]*/
+			public Parent Parent = new Parent();
+
+			/*[a]*/[Relation(typeof(Grandchild))]/*[/a]*/
+			public List<Grandchild> Grandchildren = new List<Grandchild>();
+		}
+
+		[MapField("ChildID", "Child.ID")]
+		public class Grandchild
+		{
+			[MapField("GrandchildID"), /*[a]*/PrimaryKey/*[/a]*/]
+			public int ID;
+
+			/*[a]*/[Relation]/*[/a]*/
+			public Child Child = new Child();
+		}
+
+		[Test]
+		public void Test()
+		{
+			List<Parent>   parents = new List<Parent>();
+			/*[a]*/MapResultSet/*[/a]*/[] sets    = new MapResultSet[3];
+
+			sets[0] = new MapResultSet(typeof(Parent), parents);
+			sets[1] = new MapResultSet(typeof(Child));
+			sets[2] = new MapResultSet(typeof(Grandchild));
+
+			sets[0].AddRelation(sets[1], "ParentID", "ParentID", "Children");
+			sets[1].AddRelation(sets[0], "ParentID", "ParentID", "Parent");
+
+			sets[1].AddRelation(sets[2], "ChildID", "ChildID", "Grandchildren");
+			sets[2].AddRelation(sets[1], "ChildID", "ChildID", "Child");
+
+			using (DbManager db = new DbManager())
+			{
+				db
+					.SetCommand      (TestQuery)
+					./*[a]*/ExecuteResultSet/*[/a]*/(sets);
+			}
+
+			Assert.IsNotEmpty(parents);
+
+			foreach (Parent parent in parents)
+			{
+				Assert.IsNotNull(parent);
+				Assert.IsNotEmpty(parent.Children);
+
+				foreach (Child child in parent.Children)
+				{
+					Assert.AreEqual(parent, child.Parent);
+					Assert.IsNotEmpty(child.Grandchildren);
+
+					foreach (Grandchild grandchild in child.Grandchildren)
+					{
+						Assert.AreEqual(child,  grandchild.Child);
+						Assert.AreEqual(parent, grandchild.Child.Parent);
+					}
+				}
+			}
+		}
+		
+		[Test]
+		public void Test2()
+		{
+			List<Parent> parents = new List<Parent>();
+			/*[a]*/MapResultSet/*[/a]*/[] sets = new MapResultSet[3];
+
+			sets[0] = new MapResultSet(typeof(Parent), parents);
+			sets[1] = new MapResultSet(typeof(Child));
+			sets[2] = new MapResultSet(typeof(Grandchild));
+
+			using (DbManager db = new DbManager())
+			{
+				db
+					.SetCommand(TestQuery)
+					./*[a]*/ExecuteResultSet/*[/a]*/(sets);
+			}
+
+			Assert.IsNotEmpty(parents);
+
+			foreach (Parent parent in parents)
+			{
+				Assert.IsNotNull(parent);
+				Assert.IsNotEmpty(parent.Children);
+
+				foreach (Child child in parent.Children)
+				{
+					Assert.AreEqual(parent, child.Parent);
+					Assert.IsNotEmpty(child.Grandchildren);
+
+					foreach (Grandchild grandchild in child.Grandchildren)
+					{
+						Assert.AreEqual(child, grandchild.Child);
+						Assert.AreEqual(parent, grandchild.Child.Parent);
+					}
+				}
+			}
+		}
+
+		public class ParentEx
+		{
+			public int           ID;
+			public List<ChildEx> Children = new List<ChildEx>();
+		}
+
+		public class ChildEx
+		{
+			public int                ID;
+			public ParentEx           Parent        = new ParentEx();
+			public List<GrandchildEx> Grandchildren = new List<GrandchildEx>();
+		}
+
+		public class GrandchildEx
+		{
+			public int     ID;
+			public ChildEx Child = new ChildEx();
+		}
+
+		static readonly MappingSchema _mappingSchema = new MappingSchema
+		{
+			Extensions = TypeExtension.GetExtensions("RelationExtension.xml")
+		};
+
+		[Test]
+		public void Test3()
+		{
+			var parents = new List<ParentEx>();
+			var sets    = new /*[a]*/MapResultSet/*[/a]*/[3];
+
+			sets[0] = new MapResultSet(typeof(ParentEx), parents);
+			sets[1] = new MapResultSet(typeof(ChildEx));
+			sets[2] = new MapResultSet(typeof(GrandchildEx));
+
+			using (var db = new DbManager())
+			{
+				db.MappingSchema = _mappingSchema;
+
+				db
+					.SetCommand(TestQuery)
+					./*[a]*/ExecuteResultSet/*[/a]*/(sets);
+			}
+
+			Assert.IsNotEmpty(parents);
+
+			foreach (ParentEx parent in parents)
+			{
+				Assert.IsNotNull(parent);
+				Assert.IsNotEmpty(parent.Children);
+
+				foreach (ChildEx child in parent.Children)
+				{
+					Assert.AreEqual(parent, child.Parent);
+					Assert.IsNotEmpty(child.Grandchildren);
+
+					foreach (GrandchildEx grandchild in child.Grandchildren)
+					{
+						Assert.AreEqual(child, grandchild.Child);
+						Assert.AreEqual(parent, grandchild.Child.Parent);
+					}
+				}
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/DataProvider/AddDataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,36 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+
+namespace HowTo.Data.DataProvider
+{
+	[TestFixture]
+	public class AddDataProvider
+	{
+		const string connectionString = 
+			"Provider=ASEOLEDB;Data Source=server;Catalog=database;User Id=user;Password=pwd;";
+
+		[Test]
+		public void Test()
+		{
+			// 3rd party data provider registration.
+			//
+			DbManager./*[a]*/AddDataProvider/*[/a]*/(new /*[a]*/SybaseAdoDataProvider/*[/a]*/());
+
+			// It can be configured by App.config.
+			// We use this way for the demo purpose only.
+			//
+			DbManager.AddConnectionString(
+				"SybaseAdo",       // Provider name
+				"Default",         // Configuration
+				connectionString); // Connection string
+
+			using (DbManager db = new DbManager("SybaseAdo", "Default"))
+			{
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/DbManagerDemo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,60 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.Mapping;
+
+namespace HowTo.Data
+{
+	[TestFixture]
+	public class DbManagerDemo
+	{
+		// The MapValue attribute is used by BLToolkit.
+		//
+		public enum Gender
+		{
+			[MapValue("F")] Female,
+			[MapValue("M")] Male,
+			[MapValue("U")] Unknown,
+			[MapValue("O")] Other
+		}
+
+		// Business object. Here we use C# 3.0 automatic properties,
+		// however it can be public fields, regular or abstract properties.
+		// The MapField attribute is used by BLToolkit to associate a database field
+		// with a business object property if they have different names.
+		//
+		public class Person
+		{
+			[MapField("PersonID")]
+			public int    ID         { get; set; }
+			public string FirstName  { get; set; }
+			public string MiddleName { get; set; }
+			public string LastName   { get; set; }
+			public /*[a]*/Gender/*[/a]*/ Gender     { get; set; }
+		}
+
+		// BLToolkit data access method.
+		//
+		public List<Person> /*[a]*/GetList/*[/a]*/(Gender gender)
+		{
+			/*[a]*/using/*[/a]*/ (/*[a]*/DbManager/*[/a]*/ db = new DbManager(/*[a]*/"DemoConnection"/*[/a]*/))
+			{
+				return db
+					./*[a]*/SetCommand/*[/a]*/(
+						"SELECT * FROM Person WHERE Gender = @gender",
+						db./*[a]*/Parameter/*[/a]*/("@gender", /*[a]*/Map.EnumToValue/*[/a]*/(gender)))
+					./*[a]*/ExecuteList/*[/a]*/<Person>();
+			}
+		}
+
+		[Test]
+		public void Test()
+		{
+			List<Person> list = GetList(Gender.Male);
+			Assert.Greater(list.Count, 0);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/ExecuteDataSet.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,26 @@
+using System;
+using System.Data;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+
+namespace HowTo.Data
+{
+	[TestFixture]
+	public class ExecuteDataSet
+	{
+		[Test]
+		public void Test()
+		{
+			using (DbManager db = new DbManager())
+			{
+				DataSet ds = db
+					.SetCommand("SELECT * FROM Person")
+					./*[a]*/ExecuteDataSet/*[/a]*/();
+
+				Assert.AreNotEqual(0, ds.Tables[0].Rows.Count);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/ExecuteDataTable.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,26 @@
+using System;
+using System.Data;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+
+namespace HowTo.Data
+{
+	[TestFixture]
+	public class ExecuteDataTable
+	{
+		[Test]
+		public void Test()
+		{
+			using (DbManager db = new DbManager())
+			{
+				DataTable dt = db
+					.SetCommand("SELECT * FROM Person")
+					./*[a]*/ExecuteDataTable/*[/a]*/();
+
+				Assert.AreNotEqual(0, dt.Rows.Count);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/ExecuteDictionary.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,77 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Common;
+using BLToolkit.Data;
+using BLToolkit.Mapping;
+
+namespace HowTo.Data
+{
+	using DataAccess;
+
+	[TestFixture]
+	public class ExecuteDictionary
+	{
+		// The dictionary key is built from an object field/property.
+		//
+		Dictionary<int, Person> GetPersonDictionary1()
+		{
+			using (DbManager db = new DbManager())
+			{
+				return db
+					.SetCommand("SELECT * FROM Person")
+					./*[a]*/ExecuteDictionary/*[/a]*/<int, Person>(/*[a]*/"ID"/*[/a]*/);
+			}
+		}
+
+		[Test]
+		public void Test1()
+		{
+			Dictionary<int, Person> dic = GetPersonDictionary1();
+
+			Assert.AreNotEqual(0, dic.Count);
+		}
+
+		// The dictionary key is built from a recordset field value ('@' prefix).
+		//
+		Dictionary<int, Person> GetPersonDictionary2()
+		{
+			using (DbManager db = new DbManager())
+			{
+				return db
+					.SetCommand("SELECT * FROM Person")
+					./*[a]*/ExecuteDictionary/*[/a]*/<int, Person>(/*[a]*/"@PersonID"/*[/a]*/);
+			}
+		}
+
+		[Test]
+		public void Test2()
+		{
+			Dictionary<int, Person> dic = GetPersonDictionary2();
+
+			Assert.AreNotEqual(0, dic.Count);
+		}
+
+		// Complex dictionary key.
+		//
+		Dictionary</*[a]*/CompoundValue/*[/a]*/, Person> GetPersonDictionary3()
+		{
+			using (DbManager db = new DbManager())
+			{
+				return db
+					.SetCommand("SELECT * FROM Person")
+					./*[a]*/ExecuteDictionary/*[/a]*/<Person>(new /*[a]*/MapIndex("FirstName", "LastName")/*[/a]*/);
+			}
+		}
+
+		[Test]
+		public void Test3()
+		{
+			Dictionary</*[a]*/CompoundValue/*[/a]*/, Person> dic = GetPersonDictionary3();
+
+			Assert.AreNotEqual(0, dic.Count);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/ExecuteForEach.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+
+namespace HowTo.Data
+{
+	using DataAccess;
+
+	[TestFixture]
+	public class ExecuteForEach
+	{
+		[Test]
+		public void Test()
+		{
+			List<Person> list = new List<Person>
+			{
+				new Person { FirstName = "John", LastName = "Smith", Gender = Gender.Male   },
+				new Person { FirstName = "Jane", LastName = "Smith", Gender = Gender.Female }
+			};
+
+			using (DbManager db = new DbManager())
+			{
+				db.BeginTransaction();
+
+				// Execute.
+				//
+				db
+					.SetSpCommand("Person_Insert")
+					./*[a]*/ExecuteForEach/*[/a]*/<Person>(list);
+
+				// Check the result.
+				//
+				list = db
+					.SetCommand(
+						"SELECT * FROM Person WHERE LastName = @lastName",
+						db.Parameter("@lastName", "Smith"))
+					.ExecuteList<Person>();
+
+				Assert.GreaterOrEqual(2, list.Count);
+
+				// Cleanup.
+				//
+				db
+					.SetCommand(
+						"DELETE FROM Person WHERE LastName = @lastName",
+						db.Parameter("@lastName", "Smith"))
+					.ExecuteNonQuery();
+
+				db.CommitTransaction();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/ExecuteList.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,98 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+
+namespace HowTo.Data
+{
+	[TestFixture]
+	public class ExecuteList
+	{
+		[MapValue(Gender.Female,  "F")]
+		[MapValue(Gender.Male,    "M")]
+		[MapValue(Gender.Unknown, "U")]
+		[MapValue(Gender.Other,   "O")]
+		public enum Gender
+		{
+			Female,
+			Male,
+			Unknown,
+			Other
+		}
+
+		[MapField("PersonID", "ID")]
+		public class Person
+		{
+			public int    ID;
+
+			public string LastName;
+			public string FirstName;
+			public string MiddleName;
+			public Gender Gender;
+		}
+
+		IList<Person> GetPersonListSqlText()
+		{
+			using (DbManager db = new DbManager())
+			{
+				return db
+					.SetCommand("SELECT * FROM Person")
+					./*[a]*/ExecuteList<Person>()/*[/a]*/;
+			}
+		}
+
+		[Test]
+		public void SqlText()
+		{
+			IList<Person> list = GetPersonListSqlText();
+
+			foreach (Person p in list)
+				TypeAccessor.WriteDebug(p);
+		}
+
+		IList<Person> GetPersonListSproc()
+		{
+			using (DbManager db = new DbManager())
+			{
+				return db
+					.SetSpCommand("Person_SelectAll")
+					./*[a]*/ExecuteList<Person>()/*[/a]*/;
+			}
+		}
+
+		[Test]
+		public void Sproc()
+		{
+			IList<Person> list = GetPersonListSproc();
+
+			foreach (Person p in list)
+				TypeAccessor.WriteDebug(p);
+		}
+
+		void GetCustomPersonList(IList list)
+		{
+			using (DbManager db = new DbManager())
+			{
+				db
+					.SetSpCommand("Person_SelectAll")
+					./*[a]*/ExecuteList(list, typeof(Person))/*[/a]*/;
+			}
+		}
+
+		[Test]
+		public void CustomList()
+		{
+			ArrayList list = new ArrayList(10);
+
+			GetCustomPersonList(list);
+
+			foreach (Person p in list)
+				TypeAccessor.WriteDebug(p);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/ExecuteNonQuery.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,53 @@
+using System;
+using NUnit.Framework;
+using BLToolkit.Data;
+
+namespace HowTo.Data
+{
+	using DataAccess;
+
+	[TestFixture]
+	public class ExecuteNonQuery
+	{
+		[Test]
+		public void Test()
+		{
+			Person person = new Person();
+
+			person.FirstName = "John";
+			person.LastName  = "Smith";
+			person.Gender    = Gender.Male;
+
+			using (DbManager db = new DbManager())
+			{
+				db.BeginTransaction();
+
+				// Execute.
+				//
+				db
+					.SetSpCommand("Person_Insert", db.CreateParameters(person))
+					./*[a]*/ExecuteNonQuery/*[/a]*/();
+
+				// Check the result.
+				//
+				person = db
+					.SetCommand(
+						"SELECT * FROM Person WHERE LastName = @lastName",
+						db.Parameter("@lastName", "Smith"))
+					.ExecuteObject<Person>();
+
+				Assert.IsNotNull(person);
+
+				// Cleanup.
+				//
+				db
+					.SetCommand(
+						"DELETE FROM Person WHERE LastName = @lastName",
+						db.Parameter("@lastName", "Smith"))
+					./*[a]*/ExecuteNonQuery/*[/a]*/();
+
+				db.CommitTransaction();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/ExecuteObject.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,89 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+
+namespace HowTo.Data
+{
+	[TestFixture]
+	public class ExecuteObject
+	{
+		public enum Gender
+		{
+			[MapValue("F")] Female,
+			[MapValue("M")] Male,
+			[MapValue("U")] Unknown,
+			[MapValue("O")] Other
+		}
+
+		public abstract class Person
+		{
+			[MapField("PersonID")]
+			public abstract int    ID         { get; }
+
+			public abstract string LastName   { get; set; }
+			public abstract string FirstName  { get; set; }
+			public abstract string MiddleName { get; set; }
+			public abstract Gender Gender     { get; set; }
+		}
+
+		Person GetPersonSqlText(int id)
+		{
+			using (DbManager db = new DbManager())
+			{
+				return db
+					.SetCommand("SELECT * FROM Person WHERE PersonID = @id",
+						db.Parameter("@id", id))
+					./*[a]*/ExecuteObject<Person>()/*[/a]*/;
+			}
+		}
+
+		[Test]
+		public void SqlText()
+		{
+			Person person = GetPersonSqlText(1);
+
+			TypeAccessor.WriteConsole(person);
+		}
+
+		Person GetPersonSproc1(int id)
+		{
+			using (DbManager db = new DbManager())
+			{
+				return db
+					.SetSpCommand("Person_SelectByKey",
+						db.Parameter("@id", id))
+					./*[a]*/ExecuteObject<Person>()/*[/a]*/;
+			}
+		}
+
+		[Test]
+		public void Sproc1()
+		{
+			Person person = GetPersonSproc1(1);
+
+			TypeAccessor.WriteConsole(person);
+		}
+
+		Person GetPersonSproc2(int id)
+		{
+			using (DbManager db = new DbManager())
+			{
+				return db
+					.SetSpCommand("Person_SelectByKey", id)
+					./*[a]*/ExecuteObject<Person>()/*[/a]*/;
+			}
+		}
+
+		[Test]
+		public void Sproc2()
+		{
+			Person person = GetPersonSproc2(1);
+
+			TypeAccessor.WriteConsole(person);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/ExecuteReader.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,30 @@
+using System;
+using System.Data;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+
+namespace HowTo.Data
+{
+	[TestFixture]
+	public class ExecuteReader
+	{
+		[Test]
+		public void Test()
+		{
+			using (DbManager db = new DbManager())
+			{
+				db.SetCommand("SELECT * FROM Person");
+
+				using (IDataReader rd = db./*[a]*/ExecuteReader/*[/a]*/())
+				{
+					while (rd.Read())
+					{
+						// ...
+					}
+				}
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/ExecuteScalar.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,73 @@
+using System;
+using NUnit.Framework;
+using BLToolkit.Data;
+
+namespace HowTo.Data
+{
+	[TestFixture]
+	public class ExecuteScalar
+	{
+		string GetFirstName(int id)
+		{
+			using (DbManager db = new DbManager())
+			{
+				return db
+					.SetCommand("SELECT FirstName FROM Person WHERE PersonID = @id",
+						db.Parameter("@id", id))
+					./*[a]*/ExecuteScalar/*[/a]*/<string>();
+			}
+		}
+
+		[Test]
+		public void ReaderTest()
+		{
+			string firstName = GetFirstName(1);
+
+			Assert.IsNotNull(firstName);
+		}
+
+		[Test]
+		public void ReturnValueTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				/*
+				 * CREATE Function Scalar_ReturnParameter()
+				 * RETURNS int
+				 * AS
+				 * BEGIN
+				 *     RETURN 12345
+				 * END
+				 */
+				int n = db
+					.SetSpCommand("Scalar_ReturnParameter")
+					./*[a]*/ExecuteScalar/*[/a]*/<int>(/*[a]*/ScalarSourceType.ReturnValue/*[/a]*/);
+
+				Assert.AreEqual(12345, n);
+			}
+		}
+
+		[Test]
+		public void OutputParameterAsReturnValueTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				/*
+				 * CREATE Procedure Scalar_OutputParameter
+				 *     @outputInt    int         = 0  output,
+				 *     @outputString varchar(50) = '' output
+				 * AS
+				 * BEGIN
+				 *     SET @outputInt = 12345
+				 *     SET @outputString = '54321'
+				 * END
+				 */
+				string returnValue = db
+					.SetSpCommand("Scalar_OutputParameter")
+					./*[a]*/ExecuteScalar/*[/a]*/<string>(/*[a]*/ScalarSourceType.OutputParameter/*[/a]*/, /*[a]*/"outputString"/*[/a]*/);
+
+				Assert.AreEqual("54321", returnValue);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/ExecuteScalarDictionary.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+
+namespace HowTo.Data
+{
+	using DataAccess;
+
+	[TestFixture]
+	public class ExecuteScalarDictionary
+	{
+		Dictionary<int, string> GetNameDictionary()
+		{
+			using (DbManager db = new DbManager())
+			{
+				return db
+					.SetCommand("SELECT * FROM Person")
+					./*[a]*/ExecuteScalarDictionary/*[/a]*/<int, string>(/*[a]*/"PersonID"/*[/a]*/, /*[a]*/"FirstName"/*[/a]*/);
+			}
+		}
+
+		[Test]
+		public void Test()
+		{
+			Dictionary<int, string> dic = GetNameDictionary();
+
+			Assert.AreNotEqual(0, dic.Count);
+			Assert.IsNotNull(dic[1]);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/ExecuteScalarList.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,53 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+
+namespace HowTo.Data
+{
+	using DataAccess;
+
+	[TestFixture]
+	public class ExecuteScalarList
+	{
+		List<string> GetNameList1()
+		{
+			using (DbManager db = new DbManager())
+			{
+				return db
+					.SetCommand("SELECT FirstName FROM Person")
+					./*[a]*/ExecuteScalarList/*[/a]*/<string>();
+			}
+		}
+
+		[Test]
+		public void Test1()
+		{
+			List<string> list = GetNameList1();
+
+			Assert.AreNotEqual(0, list.Count);
+			Assert.IsNotNull(list[0]);
+		}
+
+		List<string> GetNameList2()
+		{
+			using (DbManager db = new DbManager())
+			{
+				return db
+					.SetCommand("SELECT * FROM Person")
+					./*[a]*/ExecuteScalarList/*[/a]*/<string>(/*[a]*/"FirstName"/*[/a]*/);
+			}
+		}
+
+		[Test]
+		public void Test2()
+		{
+			List<string> list = GetNameList2();
+
+			Assert.AreNotEqual(0, list.Count);
+			Assert.IsNotNull(list[0]);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/OpenConfig1.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,79 @@
+using System;
+using System.Data;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+
+namespace HowTo.Data
+{
+	[TestFixture]
+	public class OpenConfig1
+	{
+		[Test]
+		public void DefaultConfiguration()
+		{
+			// Default configuration and default data provider.
+			//
+			using (DbManager db = new DbManager/*[a]*/()/*[/a]*/)
+			{
+				Assert.AreEqual(ConnectionState.Open, db.Connection.State);
+			}
+		}
+
+		[Test]
+		public void DevelopmentConfiguration()
+		{
+			// Development configuration and default data provider.
+			//
+			using (DbManager db = new DbManager(/*[a]*/"Development"/*[/a]*/))
+			{
+				Assert.AreEqual(ConnectionState.Open, db.Connection.State);
+			}
+		}
+
+		[Test]
+		public void ProductionConfiguration()
+		{
+			// Production configuration and default data provider.
+			//
+			using (DbManager db = new DbManager(/*[a]*/"Production"/*[/a]*/))
+			{
+				Assert.AreEqual(ConnectionState.Open, db.Connection.State);
+			}
+		}
+
+		[Test]
+		public void OleDbDefaultConfiguration()
+		{
+			// Default configuration and OleDb data provider.
+			//
+			using (DbManager db = new DbManager(/*[a]*/"OleDb"/*[/a]*/))
+			{
+				Assert.AreEqual(ConnectionState.Open, db.Connection.State);
+			}
+		}
+
+		[Test]
+		public void OleDbDevelopmentConfiguration()
+		{
+			// Development configuration and OleDb data provider.
+			//
+			using (DbManager db = new DbManager(/*[a]*/"OleDb"/*[/a]*/, /*[a]*/"Development"/*[/a]*/))
+			{
+				Assert.AreEqual(ConnectionState.Open, db.Connection.State);
+			}
+		}
+
+		[Test]
+		public void OleDbProductionConfiguration()
+		{
+			// Production configuration and OleDb data provider.
+			//
+			using (DbManager db = new DbManager(/*[a]*/"OleDb"/*[/a]*/, /*[a]*/"Production"/*[/a]*/))
+			{
+				Assert.AreEqual(ConnectionState.Open, db.Connection.State);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/OpenConfig1FW2.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,24 @@
+using System;
+using System.Data;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+
+namespace HowTo.Data
+{
+	[TestFixture]
+	public class OpenConfig1FW2
+	{
+		[Test]
+		public void FW2Configuration()
+		{
+			// <connectionString> section configuration supported in FW 2.0+.
+			//
+			using (DbManager db = new DbManager(/*[a]*/"DemoConnection"/*[/a]*/))
+			{
+				Assert.AreEqual(ConnectionState.Open, db.Connection.State);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/OpenConfig2.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,68 @@
+using System;
+using System.Data;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+
+namespace HowTo.Data
+{
+	[TestFixture]
+	public class OpenConfig2
+	{
+		const string sqlConnectionString =
+			"Server=.;Database=BLToolkitData;Integrated Security=SSPI";
+		const string oleDbConnectionString =
+			"Provider=SQLOLEDB;Data Source=.;Integrated Security=SSPI;Initial Catalog=BLToolkitData";
+
+		[Test]
+		public void Test1()
+		{
+			string defaultConfiguration = DbManager.DefaultConfiguration;
+			DbManager.DefaultConfiguration = ""; //to reset possible previous changes
+
+			try
+			{
+				/*[a]*/DbManager.AddConnectionString/*[/a]*/(
+					sqlConnectionString);   // connection string
+
+				using (DbManager db = /*[a]*/new DbManager()/*[/a]*/)
+				{
+					Assert.AreEqual(ConnectionState.Open, db.Connection.State);
+				}
+			}
+			finally
+			{
+				DbManager.DefaultConfiguration = defaultConfiguration; // to restore previous settings
+			}
+
+		}
+
+		[Test]
+		public void Test2()
+		{
+			/*[a]*/DbManager.AddConnectionString/*[/a]*/(
+				"NewConfig",            // configuration string
+				sqlConnectionString);   // connection string
+
+			using (DbManager db = /*[a]*/new DbManager("NewConfig")/*[/a]*/)
+			{
+				Assert.AreEqual(ConnectionState.Open, db.Connection.State);
+			}
+		}
+
+		[Test]
+		public void Test3()
+		{
+			/*[a]*/DbManager.AddConnectionString/*[/a]*/(
+				"OleDb",                // provider name
+				"NewConfig",            // configuration string
+				oleDbConnectionString); // connection string
+
+			using (DbManager db = /*[a]*/new DbManager("OleDb", "NewConfig")/*[/a]*/)
+			{
+				Assert.AreEqual(ConnectionState.Open, db.Connection.State);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/OpenConfig3.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,61 @@
+using System;
+using System.Data;
+using System.Data.SqlClient;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+
+namespace HowTo.Data
+{
+	[TestFixture]
+	public class OpenConfig3
+	{
+		const string connectionString =
+			"Server=.;Database=BLToolkitData;Integrated Security=SSPI";
+
+		[Test]
+		public void DbConnectionConfiguration()
+		{
+			using (SqlConnection con = new SqlConnection(connectionString))
+			{
+				con.Open();
+
+				using (DbManager db = /*[a]*/new DbManager(con)/*[/a]*/)
+				{
+					Assert.AreEqual(ConnectionState.Open, db.Connection.State);
+				}
+			}
+		}
+
+		[Test]
+		public void DbTransactionConfiguration()
+		{
+			using (SqlConnection con = new SqlConnection(connectionString))
+			{
+				con.Open();
+
+				SqlTransaction tran = con.BeginTransaction();
+
+				using (DbManager db = /*[a]*/new DbManager(tran)/*[/a]*/)
+				{
+					Assert.AreEqual(ConnectionState.Open, db.Connection.State);
+				}
+
+				tran.Commit();
+			}
+		}
+
+		[Test]
+		public void DataProviderConfiguration()
+		{
+			SqlDataProvider dp = new SqlDataProvider();
+
+			using (DbManager db = /*[a]*/new DbManager(dp, connectionString)/*[/a]*/)
+			{
+				Assert.AreEqual(ConnectionState.Open, db.Connection.State);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/Parameter.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,162 @@
+using System;
+using System.Data;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+
+namespace HowTo.Data
+{
+	using DataAccess;
+
+	[TestFixture]
+	public class Parameter
+	{
+		[Test]
+		public void AssignParameterTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				int n = db
+					.SetCommand("SELECT @par1 + @par2",
+						db./*[a]*/Parameter/*[/a]*/("@par1", 2),
+						db./*[a]*/Parameter/*[/a]*/("@par2", 2))
+					.ExecuteScalar<int>();
+
+				Assert.AreEqual(4, n);
+			}
+		}
+
+		[Test]
+		public void SetValueTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				db.SetCommand("SELECT @par * 2",
+					db./*[a]*/Parameter/*[/a]*/("@par", DbType.Int32));
+
+				db./*[a]*/Parameter("@par").Value/*[/a]*/ = 2;
+
+				Assert.AreEqual(4, db.ExecuteScalar<int>());
+			}
+		}
+
+		[Test]
+		public void ReturnValueTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				/*
+				 * CREATE Function Scalar_ReturnParameter()
+				 * RETURNS int
+				 * AS
+				 * BEGIN
+				 *     RETURN 12345
+				 * END
+				 */
+				db
+					.SetSpCommand("Scalar_ReturnParameter")
+					.ExecuteNonQuery();
+
+				int n = (int)db./*[a]*/Parameter("@RETURN_VALUE").Value/*[/a]*/;
+
+				Assert.AreEqual(12345, n);
+			}
+		}
+
+		[Test]
+		public void ReturnValueTest2()
+		{
+			using (DbManager db = new DbManager())
+			{
+				int n = db
+					.SetSpCommand("Scalar_ReturnParameter")
+					.ExecuteScalar<int>(ScalarSourceType.ReturnValue);
+
+				Assert.AreEqual(12345, n);
+			}
+		}
+
+		[Test]
+		public void OutputParameterTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				/*
+				 * CREATE Procedure Scalar_OutputParameter
+				 *     @outputInt    int         = 0  output,
+				 *     @outputString varchar(50) = '' output
+				 * AS
+				 * BEGIN
+				 *     SET @outputInt = 12345
+				 *     SET @outputString = '54321'
+				 * END
+				 */
+
+				db
+					.SetSpCommand("Scalar_OutputParameter",
+						db./*[a]*/OutputParameter/*[/a]*/("@outputInt",    1),
+						db./*[a]*/OutputParameter/*[/a]*/("@outputString", "1"))
+					.ExecuteNonQuery();
+
+				Assert.AreEqual(12345,   (int)   db./*[a]*/Parameter("@outputInt").   Value/*[/a]*/);
+				Assert.AreEqual("54321", (string)db./*[a]*/Parameter("@outputString").Value/*[/a]*/);
+			}
+		}
+
+		[Test]
+		public void OutputParameterAsReturnValueTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				string returnValue = db
+					.SetSpCommand("Scalar_OutputParameter")
+					.ExecuteScalar<string>(/*[a]*/ScalarSourceType.OutputParameter/*[/a]*/, /*[a]*/"outputString"/*[/a]*/);
+
+				Assert.AreEqual("54321", returnValue);
+			}
+		}
+
+		[Test]
+		public void CreateParametersTest()
+		{
+			Person person = new Person();
+
+			person.FirstName = "John";
+			person.LastName  = "Smith";
+			person.Gender    = Gender.Male;
+
+			using (DbManager db = new DbManager())
+			{
+				db.BeginTransaction();
+
+				// Prepare command.
+				//
+				int id = db
+					.SetSpCommand("Person_Insert",
+						db./*[a]*/CreateParameters/*[/a]*/(person))
+					.ExecuteScalar<int>();
+
+				// Check the result.
+				//
+				person = db
+					.SetCommand(
+						"SELECT * FROM Person WHERE PersonID = @id",
+						db.Parameter("@id", id))
+					.ExecuteObject<Person>();
+
+				Assert.IsNotNull(person);
+
+				// Cleanup.
+				//
+				db
+					.SetCommand(
+						"DELETE FROM Person WHERE PersonID = @id",
+						db.Parameter("@id", id))
+					.ExecuteNonQuery();
+
+				db.CommitTransaction();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/Prepare.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,65 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+
+namespace HowTo.Data
+{
+	using DataAccess;
+
+	[TestFixture]
+	public class Prepare
+	{
+		[Test]
+		public void Test()
+		{
+			List<Person> list = new List<Person>
+			{
+				new Person { FirstName = "John", LastName = "Smith", Gender = Gender.Male   },
+				new Person { FirstName = "Jane", LastName = "Smith", Gender = Gender.Female }
+			};
+
+			using (DbManager db = new DbManager())
+			{
+				db.BeginTransaction();
+
+				// Prepare command.
+				//
+				db
+					.SetSpCommand("Person_Insert",
+						db.CreateParameters(list[0]))
+					./*[a]*/Prepare/*[/a]*/();
+
+				// Insert.
+				//
+				foreach (Person person in list)
+				{
+					db./*[a]*/AssignParameterValues/*[/a]*/(person);
+					db.ExecuteNonQuery();
+				}
+
+				// Check the result.
+				//
+				list = db
+					.SetCommand(
+						"SELECT * FROM Person WHERE LastName = @lastName",
+						db.Parameter("@lastName", "Smith"))
+					.ExecuteList<Person>();
+
+				Assert.GreaterOrEqual(2, list.Count);
+
+				// Cleanup.
+				//
+				db
+					.SetCommand(
+						"DELETE FROM Person WHERE LastName = @lastName",
+						db.Parameter("@lastName", "Smith"))
+					.ExecuteNonQuery();
+
+				db.CommitTransaction();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/RelationExtension.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<Types
+	xmlns   = "urn:schemas-bltoolkit-net:typeext"
+	xmlns:m = "urn:schemas-bltoolkit-net:mapping">
+
+	<Type Name="HowTo.Data.ComplexMapping+ParentEx">
+		<Member Name="ID" MapField="ParentID" PrimaryKey="1"/>
+		<Member Name="Children">
+			<Relation DestinationType = "HowTo.Data.ComplexMapping+ChildEx, HowTo">
+			</Relation>
+		</Member>
+	</Type>
+
+	<Type Name="HowTo.Data.ComplexMapping+ChildEx">
+		<Member Name ="ID" MapField="ChildID"/>
+		<Member Name ="Parent">
+			<Relation></Relation>
+		</Member>
+		<m:MapField OrigName="Parent.ID" MapName="ParentID"/>
+		<Member Name ="Grandchildren">
+			<Relation DestinationType="HowTo.Data.ComplexMapping+GrandchildEx">
+				<SlaveIndex Name="ChildID"/>
+				<MasterIndex Name="ChildID"/>
+			</Relation>
+		</Member>
+	</Type>
+
+	<Type Name="HowTo.Data.ComplexMapping+GrandchildEx">
+		<Member Name="ID" MapField="GrandchildId" PrimaryKey="1"/>
+		<m:MapField OrigName="Child.ID" MapName="ChildID"/>
+		<Member Name="Child">
+			<Relation>
+				<SlaveIndex  Name="ChildID"/>
+				<MasterIndex Name="ChildID"/>
+			</Relation>
+		</Member>
+	</Type>
+
+</Types>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/SetCommand.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,144 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.Mapping;
+
+namespace HowTo.Data
+{
+	using DataAccess;
+
+	[TestFixture]
+	public class SetCommand
+	{
+		// Select a person list.
+		//
+		public IList<Person> GetPersonList()
+		{
+			using (DbManager db = new DbManager())
+			{
+				return db
+					./*[a]*/SetCommand/*[/a]*/("SELECT * FROM Person")
+					.ExecuteList<Person>();
+			}
+		}
+
+		[Test]
+		public void Test1()
+		{
+			IList<Person> list = GetPersonList();
+
+			Assert.AreNotEqual(0, list.Count);
+		}
+
+		// Select a person.
+		//
+		public Person GetPersonByID(int id)
+		{
+			using (DbManager db = new DbManager())
+			{
+				return db
+					./*[a]*/SetCommand/*[/a]*/("SELECT * FROM Person WHERE PersonID = @id",
+						db./*[a]*/Parameter/*[/a]*/("@id", id))
+					.ExecuteObject<Person>();
+			}
+		}
+
+		[Test]
+		public void Test2()
+		{
+			Person person = GetPersonByID(1);
+
+			Assert.IsNotNull(person);
+		}
+
+		// Insert, Update, and Delete a person.
+		//
+		public Person GetPersonByID(DbManager db, int id)
+		{
+			return db
+				./*[a]*/SetCommand/*[/a]*/("SELECT * FROM Person WHERE PersonID = @id",
+					db./*[a]*/Parameter/*[/a]*/("@id", id))
+				.ExecuteObject<Person>();
+		}
+
+		public Person CreatePerson(DbManager db)
+		{
+			int id = db
+				./*[a]*/SetCommand/*[/a]*/(@"
+					INSERT INTO Person ( LastName,  FirstName,  Gender)
+					VALUES             (@LastName, @FirstName, @Gender)
+
+					SELECT Cast(SCOPE_IDENTITY() as int) PersonID",
+					db./*[a]*/Parameter/*[/a]*/("@LastName",  "Frog"),
+					db./*[a]*/Parameter/*[/a]*/("@FirstName", "Crazy"),
+					db./*[a]*/Parameter/*[/a]*/("@Gender",    Map.EnumToValue(Gender.Male)))
+				.ExecuteScalar<int>();
+
+			return GetPersonByID(db, id);
+		}
+
+		public Person UpdatePerson(DbManager db, Person person)
+		{
+			db
+				./*[a]*/SetCommand/*[/a]*/(@"
+					UPDATE
+						Person
+					SET
+						LastName   = @LastName,
+						FirstName  = @FirstName,
+						Gender     = @Gender
+					WHERE
+						PersonID = @PersonID",
+					db./*[a]*/CreateParameters/*[/a]*/(person))
+				.ExecuteNonQuery();
+
+			return GetPersonByID(db, person.ID);
+		}
+
+		public Person DeletePerson(DbManager db, Person person)
+		{
+			db
+				./*[a]*/SetCommand/*[/a]*/("DELETE FROM Person WHERE PersonID = @id",
+					db./*[a]*/Parameter/*[/a]*/("@id", person.ID))
+				.ExecuteNonQuery();
+
+			return GetPersonByID(db, person.ID);
+		}
+
+		[Test]
+		public void Test3()
+		{
+			using (DbManager db = new DbManager())
+			{
+				db.BeginTransaction();
+
+				// Insert.
+				//
+				Person person = CreatePerson(db);
+
+				Assert.IsNotNull(person);
+
+				// Update.
+				//
+				Assert.AreEqual(Gender.Male, person.Gender);
+
+				person.Gender = Gender.Female;
+
+				person = UpdatePerson(db, person);
+
+				Assert.AreEqual(Gender.Female, person.Gender);
+
+				// Delete.
+				//
+				person = DeletePerson(db, person);
+
+				Assert.IsNull(person);
+
+				db.CommitTransaction();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/SetSpCommand.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,146 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.Mapping;
+
+namespace HowTo.Data
+{
+	using DataAccess;
+
+	[TestFixture]
+	public class SetSpCommand
+	{
+		// Select a person list.
+		//
+		public IList<Person> GetPersonList()
+		{
+			using (DbManager db = new DbManager())
+			{
+				return db
+					./*[a]*/SetSpCommand/*[/a]*/("Person_SelectAll")
+					.ExecuteList<Person>();
+			}
+		}
+
+		[Test]
+		public void Test1()
+		{
+			IList<Person> list = GetPersonList();
+
+			Assert.AreNotEqual(0, list.Count);
+		}
+
+		// Select a person.
+		//
+		public Person GetPersonByID1(int id)
+		{
+			using (DbManager db = new DbManager())
+			{
+				// Pass a parameter using the [b]Parameter[/b] method.
+				//
+				return db
+					./*[a]*/SetSpCommand/*[/a]*/("Person_SelectByKey",
+						db./*[a]*/Parameter/*[/a]*/("@id", id))
+					.ExecuteObject<Person>();
+			}
+		}
+
+		public Person GetPersonByID2(int id)
+		{
+			using (DbManager db = new DbManager())
+			{
+				// Pass a parameter using the [b]params[/b] parameter of the SetSpCommand method.
+				//
+				return db
+					./*[a]*/SetSpCommand/*[/a]*/("Person_SelectByKey", /*[a]*/id/*[/a]*/)
+					.ExecuteObject<Person>();
+			}
+		}
+
+		[Test]
+		public void Test2()
+		{
+			Person person = GetPersonByID1(1);
+			Assert.IsNotNull(person);
+
+			person = GetPersonByID2(1);
+			Assert.IsNotNull(person);
+		}
+
+		// Insert, Update, and Delete a person.
+		//
+		public Person GetPersonByID(DbManager db, int id)
+		{
+			return db
+				./*[a]*/SetSpCommand/*[/a]*/("Person_SelectByKey", /*[a]*/id/*[/a]*/)
+				.ExecuteObject<Person>();
+		}
+
+		public Person CreatePerson(DbManager db)
+		{
+			int id = db
+				./*[a]*/SetSpCommand/*[/a]*/("Person_Insert",
+					db./*[a]*/Parameter/*[/a]*/("@LastName",   "Frog"),
+					db./*[a]*/Parameter/*[/a]*/("@MiddleName", null),
+					db./*[a]*/Parameter/*[/a]*/("@FirstName",  "Crazy"),
+					db./*[a]*/Parameter/*[/a]*/("@Gender",     Map.EnumToValue(Gender.Male)))
+				.ExecuteScalar<int>();
+
+			return GetPersonByID(db, id);
+		}
+
+		public Person UpdatePerson(DbManager db, Person person)
+		{
+			db
+				./*[a]*/SetSpCommand/*[/a]*/("Person_Update", db./*[a]*/CreateParameters/*[/a]*/(person))
+				.ExecuteNonQuery();
+
+			return GetPersonByID(db, person.ID);
+		}
+
+		public Person DeletePerson(DbManager db, Person person)
+		{
+			db
+				./*[a]*/SetSpCommand/*[/a]*/("Person_Delete", /*[a]*/person.ID/*[/a]*/)
+				.ExecuteNonQuery();
+
+			return GetPersonByID(db, person.ID);
+		}
+
+		[Test]
+		public void Test3()
+		{
+			using (DbManager db = new DbManager())
+			{
+				db.BeginTransaction();
+
+				// Insert.
+				//
+				Person person = CreatePerson(db);
+
+				Assert.IsNotNull(person);
+
+				// Update.
+				//
+				Assert.AreEqual(Gender.Male, person.Gender);
+
+				person.Gender = Gender.Female;
+
+				person = UpdatePerson(db, person);
+
+				Assert.AreEqual(Gender.Female, person.Gender);
+
+				// Delete.
+				//
+				person = DeletePerson(db, person);
+
+				Assert.IsNull(person);
+
+				db.CommitTransaction();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/Transaction.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,39 @@
+using System;
+using System.Data;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+
+namespace HowTo.Data
+{
+	[TestFixture]
+	public class Transaction
+	{
+		[Test]
+		public void Test1()
+		{
+			using (DbManager db = new DbManager())
+			{
+				db./*[a]*/BeginTransaction()/*[/a]*/;
+
+				// ...
+
+				db./*[a]*/CommitTransaction()/*[/a]*/;
+			}
+		}
+
+		[Test]
+		public void Test2()
+		{
+			using (DbManager db = new DbManager())
+			{
+				db.BeginTransaction(/*[a]*/IsolationLevel.ReadCommitted/*[/a]*/);
+
+				// ...
+
+				db.CommitTransaction();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Data/UpdateObject.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,132 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+
+namespace HowTo.Data
+{
+	[TestFixture]
+	public class UpdateObject
+	{
+		public enum Gender
+		{
+			[MapValue("F")] Female,
+			[MapValue("M")] Male,
+			[MapValue("U")] Unknown,
+			[MapValue("O")] Other
+		}
+
+		public abstract class Person
+		{
+			[MapField("PersonID")]
+			public abstract int    ID         { get; }
+
+			public abstract string LastName   { get; set; }
+			public abstract string FirstName  { get; set; }
+			public abstract string MiddleName { get; set; }
+			public abstract Gender Gender     { get; set; }
+		}
+
+		int InsertPerson(Person person)
+		{
+			using (DbManager db = new DbManager())
+			{
+				return db
+					.SetCommand(@"
+						INSERT INTO Person
+							( LastName,  FirstName,  MiddleName,  Gender)
+						VALUES
+							(@LastName, @FirstName, @MiddleName, @Gender)
+
+						SELECT Cast(SCOPE_IDENTITY() as int)",
+						db.CreateParameters(person))
+					.ExecuteScalar<int>();
+			}
+		}
+
+		Person GetPersonByID(int id)
+		{
+			using (DbManager db = new DbManager())
+			{
+				return db
+					.SetCommand("SELECT * FROM Person WHERE PersonID = @id",
+						db.Parameter("@id", id))
+					.ExecuteObject<Person>();
+			}
+		}
+
+		void UpdatePerson(Person person)
+		{
+			using (DbManager db = new DbManager())
+			{
+				db
+					.SetCommand(@"
+						UPDATE
+							Person
+						SET
+							LastName   = @LastName,
+							FirstName  = @FirstName,
+							MiddleName = @MiddleName,
+							Gender     = @Gender
+						WHERE
+							PersonID = @PersonID",
+						db.CreateParameters(person))
+					.ExecuteNonQuery();
+			}
+		}
+
+		void DeletePerson(int id)
+		{
+			using (DbManager db = new DbManager())
+			{
+				db
+					.SetCommand("DELETE FROM Person WHERE PersonID = @id",
+						db.Parameter("@id", id))
+					.ExecuteNonQuery();
+			}
+		}
+
+		[Test]
+		public void Test()
+		{
+			// Insert.
+			//
+			Person person = TypeAccessor<Person>.CreateInstanceEx();
+
+			person.FirstName = "Crazy";
+			person.LastName  = "Frog";
+			person.Gender    = Gender.Unknown;
+
+			int id = InsertPerson(person);
+
+			person = GetPersonByID(id);
+
+			TypeAccessor.WriteConsole(person);
+			Assert.IsNotNull(person);
+
+			// Update.
+			//
+			person.Gender = Gender.Other;
+
+			UpdatePerson(person);
+
+			person = GetPersonByID(id);
+
+			TypeAccessor.WriteConsole(person);
+			Assert.AreEqual(Gender.Other, person.Gender);
+
+			// Delete.
+			//
+			DeletePerson(id);
+
+			person = GetPersonByID(id);
+
+			Assert.IsNull(person);
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/AbstractAccessor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,77 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class AbstractAccessor
+	{
+		public /*[a]*/abstract/*[/a]*/ class /*[a]*/PersonAccessor : DataAccessor<Person>/*[/a]*/
+		{
+			public /*[a]*/abstract/*[/a]*/ Person  /*[a]*/SelectByName/*[/a]*/(Person person);
+			public /*[a]*/abstract/*[/a]*/ Person  /*[a]*/SelectByName/*[/a]*/(string firstName, string lastName);
+
+			public /*[a]*/abstract/*[/a]*/ int     /*[a]*/Insert/*[/a]*/      (Person person);
+
+			[/*[a]*/SqlQuery(/*[/a]*/"SELECT Top /*[a]*/{0}/*[/a]*/ * FROM Person ORDER BY PersonID"/*[a]*/)]/*[/a]*/
+			[/*[a]*/Index("ID")/*[/a]*/]
+			public /*[a]*/abstract/*[/a]*/ Dictionary<int,Person> /*[a]*/SelectTop/*[/a]*/([/*[a]*/Format(0)/*[/a]*/] int top);
+
+			private SprocQuery<Person> _query;
+			public  SprocQuery<Person>  Query
+			{
+				get
+				{
+					if (_query == null)
+						_query = new SprocQuery<Person>(DbManager);
+					return _query;
+				}
+			}
+		}
+
+		[Test]
+		public void Test()
+		{
+			using (DbManager db = new DbManager())
+			{
+				PersonAccessor pa = /*[a]*/DataAccessor.CreateInstance<PersonAccessor>(db)/*[/a]*/;
+
+				pa.BeginTransaction();
+
+				// Insert and get id.
+				//
+				Person person = new Person();
+
+				person.FirstName = "Crazy";
+				person.LastName  = "Frog";
+				person.Gender    = Gender.Unknown;
+
+				int id = pa./*[a]*/Insert(person)/*[/a]*/;
+
+				// SelectByName.
+				//
+				person = pa./*[a]*/SelectByName("Crazy", "Frog")/*[/a]*/;
+
+				Assert.IsNotNull(person);
+
+				// Select top.
+				//
+				Dictionary<int,Person> dic = pa./*[a]*/SelectTop(10)/*[/a]*/;
+
+				Assert.IsTrue(dic.Count <= 10);
+
+				// Delete.
+				//
+				pa.Query.Delete(person);
+
+				pa.CommitTransaction();
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/ActionName.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,38 @@
+using System;
+using NUnit.Framework;
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class ActionName
+	{
+		public abstract class PersonAccessor : DataAccessor<Person, PersonAccessor>
+		{
+			// Default action name is 'SelectByKey'.
+			// Stored procedure name is 'Person_SelectByKey'.
+			//
+			public abstract Person SelectByKey(int @id);
+
+			// Explicit action name is 'SelectByName'.
+			// Stored procedure name is 'Person_SelectByName'.
+			//
+			[/*[a]*/ActionName/*[/a]*/(/*[a]*/"SelectByName"/*[/a]*/)]
+			public abstract Person /*[a]*/AnyName/*[/a]*/    (string @firstName, string @lastName);
+		}
+
+		[Test]
+		public void Test()
+		{
+			PersonAccessor pa = /*[a]*/PersonAccessor.CreateInstance/*[/a]*/();
+
+			Person person1 = pa.SelectByKey(1);
+
+			Assert.IsNotNull(person1);
+
+			Person person2 = pa.AnyName(person1.FirstName, person1.LastName);
+
+			Assert.AreEqual(person1.ID, person2.ID);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/ActionSprocName.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,47 @@
+using System;
+using NUnit.Framework;
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class ActionSprocName
+	{
+		[/*[a]*/ActionSprocName/*[/a]*/("GetByName", "Person_SelectByName")]
+		public class Person
+		{
+			public int    PersonID;
+			public string LastName;
+			public string FirstName;
+			public string MiddleName;
+		}
+
+		public abstract class PersonAccessor : DataAccessor
+		{
+			// Default action name is 'SelectByKey'.
+			// Stored procedure name is 'Person_SelectByKey'.
+			//
+			public abstract Person SelectByKey(int @id);
+
+			// Default action name is 'GetByName'.
+			// Stored procedure name is 'Person_SelectByName'
+			// defined by the ActionSprocName attribute of the Person class.
+			//
+			public abstract Person GetByName(string @firstName, string @lastName);
+		}
+
+		[Test]
+		public void Test()
+		{
+			PersonAccessor pa = /*[a]*/DataAccessor/*[/a]*/./*[a]*/CreateInstance/*[/a]*/<PersonAccessor>();
+
+			Person person1 = pa.SelectByKey(1);
+
+			Assert.IsNotNull(person1);
+
+			Person person2 = pa.GetByName(person1.FirstName, person1.LastName);
+
+			Assert.AreEqual(person1.PersonID, person2.PersonID);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/ActualType.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,61 @@
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class ActualType
+	{
+		public interface IName
+		{
+			string Name { get; }
+		}
+
+		public class NameBase : IName
+		{
+			private string _name;
+			public  string  Name { get { return _name; } set { _name = value; } }
+		}
+
+		public class Name1 : NameBase {}
+		public class Name2 : NameBase {}
+
+		[/*[a]*/ActualType/*[/a]*/(typeof(IName), typeof(/*[a]*/Name1/*[/a]*/))]
+		public abstract class TestAccessor : DataAccessor
+		{
+			[SqlQuery("SELECT 'John' as Name")]
+			public abstract IName GetName1();
+
+			[SqlQuery("SELECT 'John' as Name"), /*[a]*/ObjectType/*[/a]*/(typeof(/*[a]*/Name2/*[/a]*/))]
+			public abstract IName GetName2();
+
+			[SqlQuery("SELECT 'John' as Name")]
+			public abstract IList<IName> GetName1List();
+
+			[SqlQuery("SELECT 'John' as Name"), /*[a]*/ObjectType/*[/a]*/(typeof(/*[a]*/Name2/*[/a]*/))]
+			public abstract IList<IName> GetName2List();
+
+			[SqlQuery("SELECT 1 as ID, 'John' as Name"), Index("@ID")]
+			public abstract IDictionary<int, IName> GetName1Dictionary();
+
+			[SqlQuery("SELECT 1 as ID, 'John' as Name"), Index("@ID"), /*[a]*/ObjectType/*[/a]*/(typeof(/*[a]*/Name2/*[/a]*/))]
+			public abstract IDictionary<int, IName> GetName2Dictionary();
+		}
+
+		[Test]
+		public void Test()
+		{
+			TestAccessor ta = DataAccessor.CreateInstance<TestAccessor>();
+
+			Assert.IsTrue(ta.GetName1()              is Name1);
+			Assert.IsTrue(ta.GetName2()              is Name2);
+			Assert.IsTrue(ta.GetName1List()[0]       is Name1);
+			Assert.IsTrue(ta.GetName2List()[0]       is Name2);
+			Assert.IsTrue(ta.GetName1Dictionary()[1] is Name1);
+			Assert.IsTrue(ta.GetName2Dictionary()[1] is Name2);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/CommandBehavior.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,34 @@
+using System.Data;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class CommandBehaviorDemo
+	{
+		public abstract class TestAccessor : DataAccessor
+		{
+			[SprocName("Person_SelectAll"), /*[a]*/CommandBehavior/*[/a]*/(CommandBehavior.SchemaOnly)]
+			public abstract IDataReader SelectAllIDataReaderSchemaOnly(DbManager db);
+		}
+
+		[Test]
+		public void Test()
+		{
+			TestAccessor ta = DataAccessor.CreateInstance<TestAccessor>();
+
+			using (DbManager   db = ta.GetDbManager())
+			using (IDataReader dr = ta.SelectAllIDataReaderSchemaOnly(db))
+			{
+				DataTable table = dr.GetSchemaTable();
+
+				Assert.AreEqual("PersonID",  table.Rows[0]["ColumnName"]);
+				Assert.AreEqual(typeof(int), table.Rows[0]["DataType"]);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/CustomSqlQuery1.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,106 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class CustomSqlQuery1
+	{
+		public class TestQueryAttribute : /*[a]*/SqlQueryAttribute/*[/a]*/
+		{
+			public TestQueryAttribute()
+			{
+				/*[a]*/IsDynamic = true/*[/a]*/;
+			}
+
+			public string OracleText { get; set; }
+			public string FbText     { get; set; }
+			public string SQLiteText { get; set; }
+
+			public /*[a]*/override/*[/a]*/ string /*[a]*/GetSqlText/*[/a]*/(DataAccessor accessor, DbManager dbManager)
+			{
+				switch (dbManager.DataProvider.Name)
+				{
+					case "Sql"   :
+					case "Access": return SqlText;
+					case "Oracle": return OracleText ?? SqlText;
+					case "Fdp"   : return FbText     ?? SqlText;
+					case "SQLite": return SQLiteText ?? SqlText;
+				}
+
+				throw new ApplicationException(string.Format("Unknown data provider '{0}'", dbManager.DataProvider.Name));
+			}
+		}
+
+		public abstract class PersonAccessor : DataAccessor
+		{
+			[TestQuery(
+				/*[a]*/SqlText/*[/a]*/    = "SELECT * FROM Person WHERE LastName = @lastName",
+				/*[a]*/OracleText/*[/a]*/ = "SELECT * FROM Person WHERE LastName = :lastName")]
+			public abstract List<Person> SelectByLastName(string lastName);
+
+			[TestQuery(
+				/*[a]*/SqlText/*[/a]*/    = "SELECT * FROM Person WHERE {0} = @value",
+				/*[a]*/OracleText/*[/a]*/ = "SELECT * FROM Person WHERE {0} = :value")]
+			public abstract List<Person> SelectBy([Format] string fieldName, string value);
+
+			[TestQuery(
+				/*[a]*/SqlText/*[/a]*/    = "SELECT TOP {0} * FROM Person WHERE LastName = @lastName",
+				/*[a]*/OracleText/*[/a]*/ = "SELECT * FROM Person WHERE LastName = :lastName AND rownum <= {0}",
+				/*[a]*/FbText/*[/a]*/     = "SELECT FIRST {0} * FROM Person WHERE LastName = @lastName",
+				/*[a]*/SQLiteText/*[/a]*/ = "SELECT * FROM Person WHERE LastName = @lastName LIMIT {0}")]
+			public abstract List<Person> SelectByLastName(string lastName, [Format(0)] int top);
+
+			[TestQuery(
+				/*[a]*/SqlText/*[/a]*/    = "SELECT @id as PersonID",
+				/*[a]*/OracleText/*[/a]*/ = "SELECT :id PersonID FROM Dual",
+				/*[a]*/FbText/*[/a]*/     = "SELECT CAST(@id AS INTEGER) PersonID FROM Dual")]
+			public abstract List<Person> SelectID(int @id);
+		}
+
+		[Test]
+		public void Test1()
+		{
+			PersonAccessor da = DataAccessor.CreateInstance<PersonAccessor>();
+
+			List<Person> list = da.SelectByLastName("Testerson");
+
+			Assert.AreNotEqual(0, list.Count);
+		}
+
+		[Test]
+		public void Test2()
+		{
+			PersonAccessor da = DataAccessor.CreateInstance<PersonAccessor>();
+
+			List<Person> list = da.SelectBy("FirstName", "John");
+
+			Assert.AreNotEqual(0, list.Count);
+		}
+
+		[Test]
+		public void Test3()
+		{
+			PersonAccessor da = DataAccessor.CreateInstance<PersonAccessor>();
+
+			List<Person> list = da.SelectByLastName("Testerson", 1);
+
+			Assert.AreNotEqual(0, list.Count);
+		}
+
+		[Test]
+		public void Test4()
+		{
+			PersonAccessor da = DataAccessor.CreateInstance<PersonAccessor>();
+
+			List<Person> list = da.SelectID(42);
+
+			Assert.AreEqual(42, list[0].ID);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/CustomSqlQuery2.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,132 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+using System.Xml;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class CustomSqlQuery2
+	{
+		public abstract class TestAccessorBase<T> : /*[a]*/DataAccessor/*[/a]*/
+			where T : TestAccessorBase<T>
+		{
+			const int Sql    = 0;
+			const int Access = 1;
+			const int Oracle = 2;
+			const int Fdp    = 3;
+			const int SQLite = 4;
+
+			Dictionary<int, string> _sql = new Dictionary<int,string>();
+
+			private string GetSql(string providerName, int provider, int queryID)
+			{
+				Stream stream = Assembly.GetCallingAssembly().GetManifestResourceStream(
+					"HowTo.DataAccess.Sql." + providerName + ".xml");
+
+				XmlDocument doc = new XmlDocument();
+
+				doc.Load(stream);
+
+				XmlNode node = doc.SelectSingleNode(string.Format("/sql/query[@id={0}]", queryID));
+
+				return node != null? node.InnerText: null;
+
+			}
+
+			protected /*[a]*/override/*[/a]*/ string /*[a]*/PrepareSqlQuery/*[/a]*/(DbManager db, int queryID, int uniqueID, string sqlQuery)
+			{
+				int    provider     = Sql;
+				string providerName = db.DataProvider.Name;
+
+				switch (providerName)
+				{
+					case "Sql"   : provider = Sql;    break;
+					case "Access": provider = Access; break;
+					case "Oracle": provider = Oracle; break;
+					case "Fdp"   : provider = Fdp;    break;
+					case "SQLite": provider = SQLite; break;
+					default:
+						throw new ApplicationException(
+							string.Format("Unknown data provider '{0}'", providerName));
+				}
+
+				string text;
+				int    key = provider * 1000000 + uniqueID;
+
+				if (_sql.TryGetValue(key, out text))
+					return text;
+
+				_sql[key] = text = GetSql(providerName, provider, queryID) ?? GetSql("Sql", Sql, queryID);
+
+				return text;
+			}
+
+			public static T CreateInstance()
+			{
+				return DataAccessor.CreateInstance<T>();
+			}
+		}
+
+		public abstract class PersonAccessor : TestAccessorBase<PersonAccessor>
+		{
+			[SqlQuery(/*[a]*/ID = 1/*[/a]*/)]
+			public abstract List<Person> SelectByLastName(string lastName);
+
+			[SqlQuery(/*[a]*/ID = 2/*[/a]*/)]
+			public abstract List<Person> SelectBy([Format] string fieldName, string value);
+
+			[SqlQuery(/*[a]*/ID = 3/*[/a]*/)]
+			public abstract List<Person> SelectByLastName(string lastName, [Format(0)] int top);
+
+			[SqlQuery(/*[a]*/ID = 4/*[/a]*/)]
+			public abstract List<Person> SelectID(int @id);
+		}
+
+		[Test]
+		public void Test1()
+		{
+			PersonAccessor da = PersonAccessor.CreateInstance();
+
+			List<Person> list = da.SelectByLastName("Testerson");
+
+			Assert.AreNotEqual(0, list.Count);
+		}
+
+		[Test]
+		public void Test2()
+		{
+			PersonAccessor da = PersonAccessor.CreateInstance();
+
+			List<Person> list = da.SelectBy("FirstName", "John");
+
+			Assert.AreNotEqual(0, list.Count);
+		}
+
+		[Test]
+		public void Test3()
+		{
+			PersonAccessor da = PersonAccessor.CreateInstance();
+
+			List<Person> list = da.SelectByLastName("Testerson", 1);
+
+			Assert.AreNotEqual(0, list.Count);
+		}
+
+		[Test]
+		public void Test4()
+		{
+			PersonAccessor da = PersonAccessor.CreateInstance();
+
+			List<Person> list = da.SelectID(42);
+
+			Assert.AreEqual(42, list[0].ID);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/DataSetTable.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,45 @@
+using System;
+using System.Data;
+
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class DataSetTable
+	{
+		public abstract class TestAccessor : DataAccessor
+		{
+			[SprocName("Person_SelectAll"), /*[a]*/DataSetTable/*[/a]*/("First")]
+			public abstract void SelectFirstTable  ([Destination] DataSet ds);
+
+			[SprocName("Person_SelectAll"), /*[a]*/DataSetTable/*[/a]*/("Second")]
+			public abstract void SelectSecondTable ([Destination] DataSet ds);
+
+			[SprocName("Person_SelectAll"), /*[a]*/DataSetTable/*[/a]*/(0)]
+			public abstract void SelectFirstTable2 ([Destination] DataSet ds);
+
+			[SprocName("Person_SelectAll"), /*[a]*/DataSetTable/*[/a]*/(1)]
+			public abstract void SelectSecondTable2([Destination] DataSet ds);
+		}
+
+		[Test]
+		public void Test()
+		{
+			TestAccessor ta = DataAccessor.CreateInstance<TestAccessor>();
+
+			DataSet ds = new DataSet();
+
+			ta.SelectFirstTable  (ds);
+			ta.SelectSecondTable (ds);
+			ta.SelectFirstTable2 (ds);
+			ta.SelectSecondTable2(ds);
+
+			Assert.IsTrue (ds.Tables.Contains("First"),  "Table 'First'  not found");
+			Assert.IsTrue (ds.Tables.Contains("Second"), "Table 'Second' not found");
+			Assert.IsFalse(ds.Tables.Contains("Table"),  "Table 'Table'  was found");
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/Delete.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,58 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class Delete
+	{
+		private int Insert()
+		{
+			using (DbManager db = new DbManager())
+			{
+				return db
+					.SetCommand(@"
+						INSERT INTO Person (
+							 FirstName,  LastName,  Gender
+						) VALUES (
+							@FirstName, @LastName, @Gender
+						)
+						SELECT Cast(SCOPE_IDENTITY() as int)",
+						db.Parameter("@FirstName", "Crazy"),
+						db.Parameter("@LastName",  "Frog"),
+						db.Parameter("@Gender",    "U"))
+					.ExecuteScalar<int>();
+			}
+		}
+
+		[Test]
+		public void Test1()
+		{
+			int id = Insert();
+
+			/*[a]*/SprocQuery<Person> query = new SprocQuery<Person>()/*[/a]*/;
+
+			query./*[a]*/DeleteByKey(id)/*[/a]*/;
+		}
+
+		[Test]
+		public void Test3()
+		{
+			int id = Insert();
+
+			using (DbManager db = new DbManager())
+			{
+				/*[a]*/SqlQuery<Person> query = new SqlQuery<Person>()/*[/a]*/;
+
+				Person person = query.SelectByKey(db, id);
+
+				query./*[a]*/Delete(db, person)/*[/a]*/;
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/DeleteSql.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,58 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class DeleteSql
+	{
+		private int Insert()
+		{
+			using (DbManager db = new DbManager())
+			{
+				return db
+					.SetCommand(@"
+						INSERT INTO Person (
+							 FirstName,  LastName,  Gender
+						) VALUES (
+							@FirstName, @LastName, @Gender
+						)
+						SELECT Cast(SCOPE_IDENTITY() as int)",
+						db.Parameter("@FirstName", "Crazy"),
+						db.Parameter("@LastName",  "Frog"),
+						db.Parameter("@Gender",    "U"))
+					.ExecuteScalar<int>();
+			}
+		}
+
+		[Test]
+		public void Test1()
+		{
+			int id = Insert();
+
+			/*[a]*/SqlQuery<Person> query = new SqlQuery<Person>()/*[/a]*/;
+
+			query./*[a]*/DeleteByKey(id)/*[/a]*/;
+		}
+
+		[Test]
+		public void Test2()
+		{
+			int id = Insert();
+
+			using (DbManager db = new DbManager())
+			{
+				/*[a]*/SqlQuery<Person> query = new SqlQuery<Person>()/*[/a]*/;
+
+				Person person = query.SelectByKey(db, id);
+
+				query./*[a]*/Delete(db, person)/*[/a]*/;
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/Destination.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class Destination
+	{
+		public abstract class PersonAccessor : DataAccessor
+		{
+			public abstract void SelectAll([/*[a]*/Destination/*[/a]*/] IList<Person> list);
+		}
+
+		[Test]
+		public void Test()
+		{
+			PersonAccessor pa = DataAccessor.CreateInstance<PersonAccessor>();
+
+			List<Person> list = new List<Person>();
+
+			pa.SelectAll(list);
+
+			Assert.AreNotEqual(0, list.Count);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/Direction.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,63 @@
+using System;
+using NUnit.Framework;
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class DirectionTest
+	{
+		public abstract class PersonAccessor : DataAccessor
+		{
+			[SprocName("Person_Insert_OutputParameter")]
+			public abstract void Insert_OutputParameter([/*[a]*/Direction.Output/*[/a]*/("PERSONID")] Person p);
+
+			[SprocName("Scalar_ReturnParameter")]
+			public abstract void Insert_ReturnParameter(
+				[/*[a]*/Direction.ReturnValue/*[/a]*/("@PersonID"),
+				 /*[a]*/Direction.Ignore/*[/a]*/("PersonID", "FirstName", "LastName", "MiddleName", "Gender")] Person p);
+
+			[SprocName("Scalar_ReturnParameter")]
+			public abstract void Insert_ReturnParameter2(
+				[/*[a]*/Direction.ReturnValue/*[/a]*/("ID"),
+				 /*[a]*/Direction.Ignore/*[/a]*/("PersonID", "FirstName", "LastName", "MiddleName", "Gender")] Person p);
+		}
+
+		PersonAccessor Accessor
+		{
+			get { return DataAccessor.CreateInstance<PersonAccessor>(); }
+		}
+
+		[Test]
+		public void TestOutputParameter()
+		{
+			Person p = new Person { FirstName = "Crazy", LastName = "Frog", Gender = Gender.Other };
+
+			Accessor.Insert_OutputParameter(p);
+
+			Assert.IsTrue(p.ID > 0);
+
+			new SprocQuery().Delete(p);
+		}
+
+		[Test]
+		public void TestReturnParameter()
+		{
+			Person p = new Person();
+
+			Accessor.Insert_ReturnParameter(p);
+
+			Assert.AreEqual(12345, p.ID);
+		}
+
+		[Test]
+		public void TestReturnParameter2()
+		{
+			Person p = new Person();
+
+			Accessor.Insert_ReturnParameter2(p);
+
+			Assert.AreEqual(12345, p.ID);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/DiscoverParameters.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,24 @@
+using NUnit.Framework;
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class DiscoverParameters
+	{
+		public abstract class PersonAccessor : DataAccessor
+		{
+			[/*[a]*/DiscoverParameters/*[/a]*/]
+			public abstract Person SelectByName(string anyParameterName, string otherParameterName);
+		}
+
+		[Test]
+		public void Test()
+		{
+			PersonAccessor pa = DataAccessor.CreateInstance<PersonAccessor>();
+			Person         p  = pa.SelectByName("Tester", "Testerson");
+
+			Assert.AreEqual(2, p.ID);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/ExecuteDictionary.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,133 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Common;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class ExecuteDictionary1
+	{
+		public class Person
+		{
+			[MapField("PersonID"), /*[a]*/PrimaryKey/*[/a]*/]
+			public int    /*[a]*/ID/*[/a]*/;
+
+			public string LastName;
+			public string FirstName;
+			public string MiddleName;
+		}
+
+		public abstract class /*[a]*/PersonAccessor/*[/a]*/ : /*[a]*/DataAccessor/*[/a]*/<Person>
+		{
+			// This method uses Person class primary key information.
+			//
+			[ActionName("SelectAll")]
+			public abstract /*[a]*/Dictionary<int,Person>/*[/a]*/ GetPersonDictionary1();
+
+			// Define index field explicitly. "ID" is a field name of the Person class.
+			//
+			[ActionName("SelectAll")]
+			[/*[a]*/Index("ID")/*[/a]*/]
+			public abstract /*[a]*/Dictionary<int,Person>/*[/a]*/ GetPersonDictionary2();
+
+			// Define index field explicitly. "@PersonID" is a recordset field.
+			// Note that the '@' symbol enforces the library to read index value
+			// from recordset (not from object).
+			//
+			[ActionName("SelectAll")]
+			[/*[a]*/Index("@PersonID")/*[/a]*/]
+			public abstract /*[a]*/Dictionary<int,Person>/*[/a]*/ GetPersonDictionary3();
+
+			// This method reads a dictionary containing scalar values.
+			//
+			[SqlQuery("SELECT PersonID, FirstName FROM Person")]
+			[/*[a]*/Index("PersonID")/*[/a]*/]
+			[/*[a]*/ScalarFieldName("FirstName")/*[/a]*/]
+			public abstract /*[a]*/Dictionary<int,string>/*[/a]*/ GetPersonNameDictionary();
+		}
+
+		[Test]
+		public void Test()
+		{
+			PersonAccessor pa = DataAccessor.CreateInstance<PersonAccessor>();
+
+			// ExecuteDictionary.
+			//
+			Dictionary<int,Person> dic;
+
+			dic = pa.GetPersonDictionary1();
+			dic = pa.GetPersonDictionary2();
+			dic = pa.GetPersonDictionary3();
+
+			foreach (int id in dic.Keys)
+				Console.WriteLine("{0}: {1} {2}", id, dic[id].FirstName, dic[id].LastName);
+
+			// ExecuteScalarDictionary.
+			//
+			Dictionary<int,string> sdic = pa.GetPersonNameDictionary();
+
+			foreach (int id in dic.Keys)
+				Console.WriteLine("{0}: {1}", id, sdic[id]);
+		}
+	}
+
+	[TestFixture]
+	public class ExecuteDictionary2
+	{
+		// This example demonstrates how to use a multiple field key.
+		//
+		public class Person
+		{
+			[/*[a]*/PrimaryKey(1)/*[/a]*/, MapField("PersonID")]
+			public int    ID;
+			[/*[a]*/PrimaryKey(2)/*[/a]*/]
+			public string LastName;
+
+			public string FirstName;
+			public string MiddleName;
+		}
+
+		public abstract class /*[a]*/PersonAccessor/*[/a]*/ : /*[a]*/DataAccessor/*[/a]*/<Person>
+		{
+			// This method uses Person class primary key information.
+			// Note that the key type of the dictionary must be of /*[a]*/IndexValue/*[/a]*/ type.
+			// It is required if the index consists of more than one element.
+			//
+			[ActionName("SelectAll")]
+			public abstract /*[a]*/Dictionary<CompoundValue,Person>/*[/a]*/ GetPersonDictionary();
+
+			// This method reads a dictionary containing scalar values.
+			//
+			[SqlQuery("SELECT PersonID, LastName, FirstName FROM Person")]
+			[/*[a]*/Index("PersonID", "LastName")/*[/a]*/]
+			[/*[a]*/ScalarFieldName("FirstName")/*[/a]*/]
+			public abstract /*[a]*/Dictionary<CompoundValue,string>/*[/a]*/ GetPersonNameDictionary();
+		}
+
+		[Test]
+		public void Test()
+		{
+			PersonAccessor pa = DataAccessor.CreateInstance<PersonAccessor>();
+
+			// ExecuteDictionary.
+			//
+			Dictionary<CompoundValue,Person> dic = pa.GetPersonDictionary();
+
+			foreach (CompoundValue idx in dic.Keys)
+				Console.WriteLine("{0}: {1} {2}", dic[idx].ID, dic[idx].FirstName, dic[idx].LastName);
+
+			// ExecuteScalarDictionary.
+			//
+			Dictionary<CompoundValue,string> sdic = pa.GetPersonNameDictionary();
+
+			string firstName = sdic[new CompoundValue(2, "Testerson")];
+
+			Assert.AreEqual("Tester", firstName);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/ExecuteList.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,60 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class ExecuteList
+	{
+		public abstract class /*[a]*/PersonAccessor/*[/a]*/ : /*[a]*/DataAccessor/*[/a]*/
+		{
+			// This method reads a list of Person objects.
+			//
+			[ActionName("SelectAll")]
+			public abstract /*[a]*/List<Person>/*[/a]*/ GetPersonList1();
+
+			// Here we help the method to get object type information.
+			// /*[a]*/ObjectTypeAttribute/*[/a]*/ can be applied to the class itself.
+			// In this case there is no need to specify object type for each method.
+			// Another way to specify object type is a generic parameter
+			// of the DataAccessor<T> class.
+			//
+			[SqlQuery("SELECT * FROM Person")]
+			[/*[a]*/ObjectType(typeof(Person))/*[/a]*/]
+			public abstract /*[a]*/ArrayList/*[/a]*/ GetPersonList2();
+
+			// This method reads a list of scalar values.
+			//
+			[SqlQuery("SELECT PersonID FROM Person")]
+			public abstract /*[a]*/List<int>/*[/a]*/ GetPersonIDList();
+		}
+
+		[Test]
+		public void Test()
+		{
+			PersonAccessor pa = DataAccessor.CreateInstance<PersonAccessor>();
+
+			// ExecuteList.
+			//
+			IList list;
+			
+			list = pa.GetPersonList1();
+			list = pa.GetPersonList2();
+
+			foreach (Person p in list)
+				Console.WriteLine("{0}: {1} {2}", p.ID, p.FirstName, p.LastName);
+
+			// ExecuteScalarList.
+			//
+			List<int> slist = pa.GetPersonIDList();
+
+			foreach (int id in slist)
+				Console.WriteLine("{0}", id);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/ExecuteObject.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,52 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class ExecuteObject
+	{
+		public abstract class /*[a]*/PersonAccessor/*[/a]*/ : /*[a]*/DataAccessor/*[/a]*/<Person>
+		{
+			// Here we explicitly specify a stored procedure name.
+			//
+			[SprocName("Person_SelectByKey")]
+			public abstract /*[a]*/Person/*[/a]*/ GetByID(int @id);
+
+			// SQL query text.
+			//
+			[SqlQuery("SELECT * FROM Person WHERE PersonID = @id")]
+			public abstract /*[a]*/Person/*[/a]*/ GetPersonByID(int @id);
+
+			// Specify action name.
+			// Stored procedure name is generated based on convention
+			// defined by DataAccessor.GetDefaultSpName method.
+			//
+			[ActionName("SelectByName")]
+			public abstract /*[a]*/Person/*[/a]*/ GetPersonByName(string @firstName, string @lastName);
+
+			// By default method name defines an action name
+			// which is converted to a stored procedure name.
+			// Default conversion rule is ObjectName_MethodName.
+			// This method calls the Person_SelectByName stored procedure.
+			//
+			public abstract /*[a]*/Person/*[/a]*/ SelectByName(string @firstName, string @lastName);
+		}
+
+		[Test]
+		public void Test()
+		{
+			PersonAccessor pa = DataAccessor.CreateInstance<PersonAccessor>();
+
+			// ExecuteObject.
+			//
+			Assert.IsNotNull(pa.GetByID        (1));
+			Assert.IsNotNull(pa.GetPersonByID  (2));
+			Assert.IsNotNull(pa.GetPersonByName("Tester", "Testerson"));
+			Assert.IsNotNull(pa.SelectByName   ("Tester", "Testerson"));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/ExecuteScalar.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,47 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class ExecuteScalar
+	{
+		public abstract class /*[a]*/PersonAccessor/*[/a]*/ : /*[a]*/DataAccessor/*[/a]*/<Person>
+		{
+			[SqlQuery("SELECT Count(*) FROM Person")]
+			public abstract int GetCount();
+
+			// The Person_Insert sproc returns an id of the created record.
+			//
+			[SprocName("Person_Insert")]
+			public abstract /*[a]*/int/*[/a]*/ Insert(Person person);
+		}
+
+		[Test]
+		public void Test()
+		{
+			PersonAccessor pa = DataAccessor.CreateInstance<PersonAccessor>();
+
+			// ExecuteScalar.
+			//
+			Assert.IsTrue(pa.GetCount() > 0);
+
+			// Insert and get id.
+			//
+			Person person = new Person();
+
+			person.FirstName = "Crazy";
+			person.LastName  = "Frog";
+			person.Gender    = Gender.Unknown;
+
+			int id = pa./*[a]*/Insert(person)/*[/a]*/;
+
+			Assert.IsFalse(id == 0);
+
+			new SprocQuery<Person>().DeleteByKey(id);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/Format.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class Format
+	{
+		public abstract class PersonAccessor : DataAccessor
+		{
+			[SqlQuery("SELECT TOP {0} * FROM Person")]
+			public abstract List<Person> GetPersonList([/*[a]*/Format/*[/a]*/] int top);
+		}
+
+		[Test]
+		public void Test()
+		{
+			PersonAccessor pa   = DataAccessor.CreateInstance<PersonAccessor>();
+			List<Person>   list = pa.GetPersonList(2);
+
+			Assert.That(list,       Is.Not.Null);
+			Assert.That(list.Count, Is.LessThanOrEqualTo(2));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/Gender.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,14 @@
+using System;
+
+using BLToolkit.Mapping;
+
+namespace HowTo.DataAccess
+{
+	public enum Gender
+	{
+		[MapValue("F")] Female,
+		[MapValue("M")] Male,
+		[MapValue("U")] Unknown,
+		[MapValue("O")] Other
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/Insert.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,45 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class Insert
+	{
+		[Test]
+		public void Test1()
+		{
+			/*[a]*/SprocQuery<Person> query = new SprocQuery<Person>()/*[/a]*/;
+
+			Person person = new Person();
+
+			person.FirstName = "Crazy";
+			person.LastName  = "Frog";
+			person.Gender    = Gender.Unknown;
+
+			query./*[a]*/Insert(person)/*[/a]*/;
+		}
+
+		[Test]
+		public void Test2()
+		{
+			using (DbManager db = new DbManager())
+			{
+				/*[a]*/SprocQuery<Person> query = new SprocQuery<Person>()/*[/a]*/;
+
+				Person person = new Person();
+
+				person.FirstName = "Crazy";
+				person.LastName  = "Frog";
+				person.Gender    = Gender.Other;
+
+				query./*[a]*/Insert(db, person)/*[/a]*/;
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/InsertSql.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,45 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class InsertSql
+	{
+		[Test]
+		public void Test1()
+		{
+			/*[a]*/SqlQuery<Person> query = new SqlQuery<Person>()/*[/a]*/;
+
+			Person person = new Person();
+
+			person.FirstName = "Crazy";
+			person.LastName  = "Frog";
+			person.Gender    = Gender.Unknown;
+
+			query./*[a]*/Insert(person)/*[/a]*/;
+		}
+
+		[Test]
+		public void Test2()
+		{
+			using (DbManager db = new DbManager())
+			{
+				/*[a]*/SqlQuery<Person> query = new SqlQuery<Person>()/*[/a]*/;
+
+				Person person = new Person();
+
+				person.FirstName = "Crazy";
+				person.LastName  = "Frog";
+				person.Gender    = Gender.Other;
+
+				query./*[a]*/Insert(db, person)/*[/a]*/;
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/MultiplePrimaryKey.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,39 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class MultiplePrimaryKey
+	{
+		[TableName("Person")]
+		public class Person
+		{
+			[MapField("PersonID"), NonUpdatable]
+			public int    ID;
+
+			// These fields are not real primary key of the table.
+			// They are made primary key for demonstration purpose only.
+			//
+			[/*[a]*/PrimaryKey(1)/*[/a]*/] public string FirstName;
+			[/*[a]*/PrimaryKey(2)/*[/a]*/] public string LastName;
+
+			public string MiddleName;
+		}
+
+		[Test]
+		public void Test()
+		{
+			SqlQuery<Person> query = new SqlQuery<Person>();
+
+			Person person = query./*[a]*/SelectByKey("Tester", "Testerson")/*[/a]*/;
+
+			Assert.IsNotNull(person);
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/NonUpdatable.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,46 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class NonUpdatable
+	{
+		public enum Gender
+		{
+			[MapValue("F")] Female,
+			[MapValue("M")] Male,
+			[MapValue("U")] Unknown,
+			[MapValue("O")] Other
+		}
+
+		public class Person
+		{
+			[MapField("PersonID"), PrimaryKey, /*[a]*/NonUpdatable/*[/a]*/]
+			public int    ID;
+
+			public string LastName;
+			public string FirstName;
+			public string MiddleName;
+			public Gender Gender;
+		}
+
+		[Test]
+		public void Test()
+		{
+			SqlQuery<Person> query = new SqlQuery<Person>();
+
+			Person person = new Person();
+
+			person.FirstName = "Crazy";
+			person.LastName  = "Frog";
+			person.Gender    = Gender.Other;
+
+			query./*[a]*/Insert(person)/*[/a]*/;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/OpenConfig.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,73 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class OpenConfig
+	{
+		public class Person
+		{
+			[MapField("PersonID"), PrimaryKey, NonUpdatable]
+			public int    ID;
+
+			public string LastName;
+			public string FirstName;
+			public string MiddleName;
+		}
+
+		public abstract class TestAccessor : DataAccessor
+		{
+			public abstract Person SelectByKey(int id);
+			public abstract Person SelectByKey(/*[a]*/DbManager/*[/a]*/ db, int id);
+		}
+
+		// /*[i]*/DbManager/*[/i]*/ is created by /*[i]*/DataAccessor/*[/i]*/.
+		//
+		[Test]
+		public void Test1()
+		{
+			TestAccessor ta = DataAccessor.CreateInstance<TestAccessor>/*[a]*/()/*[/a]*/;
+
+			Person person = ta.SelectByKey(1);
+
+			Assert.IsNotNull(person);
+		}
+
+		// /*[i]*/DataAccessor/*[/i]*/ takes /*[i]*/DbManager/*[/i]*/ as a parameter.
+		//
+		[Test]
+		public void Test2()
+		{
+			using (DbManager db = new DbManager())
+			{
+				TestAccessor ta = DataAccessor.CreateInstance<TestAccessor>/*[a]*/(db)/*[/a]*/;
+
+				Person person = ta.SelectByKey(1);
+
+				Assert.IsNotNull(person);
+			}
+		}
+
+		// /*[i]*/DataAccessor/*[/i]*/ method takes /*[i]*/DbManager/*[/i]*/ as a parameter.
+		//
+		[Test]
+		public void Test3()
+		{
+			using (DbManager db = new DbManager())
+			{
+				TestAccessor ta = DataAccessor.CreateInstance<TestAccessor>/*[a]*/()/*[/a]*/;
+
+				Person person = ta.SelectByKey(/*[a]*/db/*[/a]*/, 1);
+
+				Assert.IsNotNull(person);
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/OpenConfigQuery.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,67 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class OpenConfigQuery
+	{
+		public class Person
+		{
+			[MapField("PersonID"), PrimaryKey, NonUpdatable]
+			public int    ID;
+
+			public string LastName;
+			public string FirstName;
+			public string MiddleName;
+		}
+
+		// /*[i]*/DbManager/*[/i]*/ is created by /*[i]*/SqlQuery/*[/i]*/.
+		//
+		[Test]
+		public void Test1()
+		{
+			SqlQuery<Person> query = new SqlQuery<Person>/*[a]*/()/*[/a]*/;
+
+			Person person = query.SelectByKey(1);
+
+			Assert.IsNotNull(person);
+		}
+
+		// /*[i]*/SqlQuery/*[/i]*/ takes /*[i]*/DbManager/*[/i]*/ as a parameter.
+		//
+		[Test]
+		public void Test2()
+		{
+			using (DbManager db = new DbManager())
+			{
+				SqlQuery<Person> query = new SqlQuery<Person>/*[a]*/(db)/*[/a]*/;
+
+				Person person = query.SelectByKey(1);
+
+				Assert.IsNotNull(person);
+			}
+		}
+
+		// /*[i]*/SqlQuery/*[/i]*/ method takes /*[i]*/DbManager/*[/i]*/ as a parameter.
+		//
+		[Test]
+		public void Test3()
+		{
+			using (DbManager db = new DbManager())
+			{
+				SqlQuery<Person> query = new SqlQuery<Person>/*[a]*/()/*[/a]*/;
+
+				Person person = query.SelectByKey(/*[a]*/db/*[/a]*/, 1);
+
+				Assert.IsNotNull(person);
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/Param.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,38 @@
+using System;
+using System.Data;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class Param
+	{
+		public abstract class TestAccessor : DataAccessor
+		{
+			[SqlQuery("SELECT {0} = {1} FROM Person WHERE PersonID = 1")]
+			public abstract void SelectJohn(
+				[/*[a]*/ParamSize/*[/a]*/(50), /*[a]*/ParamDbType/*[/a]*/(DbType.String)] out string name,
+				[Format] string paramName,
+				[Format] string fieldName);
+		}
+
+		[Test]
+		public void AccessorTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				TestAccessor ta = DataAccessor.CreateInstance<TestAccessor>(db);
+
+				string actualName;
+
+				ta.SelectJohn(out actualName, "@name", "FirstName");
+
+				Assert.AreEqual("John", actualName);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/ParamName.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,26 @@
+using System;
+using NUnit.Framework;
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class ParamName
+	{
+		public abstract class TestAccessor : DataAccessor
+		{
+			public abstract Person SelectByName(
+				[ParamName("FirstName")] string name1,
+				[ParamName("@LastName")] string name2);
+		}
+
+		[Test]
+		public void Test()
+		{
+			TestAccessor ta = DataAccessor.CreateInstance<TestAccessor>();
+			Person       p  = ta.SelectByName("Tester", "Testerson");
+
+			Assert.AreEqual(2, p.ID);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/ParamNullValue.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,31 @@
+using System;
+using NUnit.Framework;
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class ParamNullValue
+	{
+		public abstract class TestAccessor : DataAccessor
+		{
+			public abstract Person SelectByKey([/*[a]*/ParamNullValue/*[/a]*/(1)] int id);
+		}
+
+		[Test]
+		public void Test()
+		{
+			TestAccessor ta = DataAccessor.CreateInstance<TestAccessor>();
+
+			// Parameter id == 1 will be replaced with NULL
+			//
+			Person p1 = ta.SelectByKey(1);
+			Assert.IsNull(p1);
+
+			// Parameter id == 2 will be send as is
+			//
+			Person p2 = ta.SelectByKey(2);
+			Assert.IsNotNull(p2);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/Person.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,18 @@
+using System;
+
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace HowTo.DataAccess
+{
+	public class Person
+	{
+		[MapField("PersonID"), PrimaryKey, NonUpdatable]
+		public int    ID;
+
+		public string LastName;
+		public string FirstName;
+		public string MiddleName;
+		public Gender Gender;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/PersonAccessor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,163 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class PersonAccessorTest
+	{
+		public enum Gender
+		{
+			[MapValue("F")] Female,
+			[MapValue("M")] Male,
+			[MapValue("U")] Unknown,
+			[MapValue("O")] Other
+		}
+
+		public abstract class Person
+		{
+			[MapField("PersonID"), PrimaryKey, NonUpdatable]
+			public abstract int    ID         { get; }
+
+			public abstract string LastName   { get; set; }
+			public abstract string FirstName  { get; set; }
+			public abstract string MiddleName { get; set; }
+			public abstract Gender Gender     { get; set; }
+
+			public static Person CreateInstance()
+			{
+				return TypeAccessor<Person>.CreateInstanceEx();
+			}
+		}
+
+		public abstract class PersonAccessor : DataAccessor<Person>
+		{
+			[SprocName("Person_SelectByKey")]
+			public abstract Person  SelectByID  (int id);
+
+			public abstract Person  SelectByName(Person person);
+			public abstract Person  SelectByName(string firstName, string lastName);
+
+			public abstract int     Insert      (Person person);
+
+			[ActionName("SelectByKey")]
+			public abstract Person  SelectByID  (DbManager db, int id);
+
+			public abstract Person  SelectByName(DbManager db, Person person);
+			public abstract Person  SelectByName(DbManager db, string firstName, string lastName);
+
+			public abstract int     Insert      (DbManager db, Person person);
+
+			public readonly SprocQuery<Person> Query = new SprocQuery<Person>();
+		}
+
+		[Test]
+		public void Test()
+		{
+			PersonAccessor pa = DataAccessor.CreateInstance<PersonAccessor>();
+
+			// Insert and get id.
+			//
+			Person person = Person.CreateInstance();
+
+			person.FirstName = "Crazy";
+			person.LastName  = "Frog";
+			person.Gender    = Gender.Unknown;
+
+			int id = pa.Insert(person);
+
+			person = pa.SelectByID(id);
+
+			TypeAccessor.WriteConsole(person);
+			Assert.IsNotNull(person);
+
+			// Update.
+			//
+			person.Gender = Gender.Other;
+
+			pa.Query.Update(person);
+
+			person = pa.SelectByID(person.ID);
+
+			TypeAccessor.WriteConsole(person);
+			Assert.AreEqual(Gender.Other, person.Gender);
+
+			// Delete.
+			//
+			pa.Query.Delete(person);
+
+			person = pa.SelectByID(person.ID);
+
+			Assert.IsNull(person);
+
+			// Get All.
+			//
+			List<Person> list = pa.Query.SelectAll();
+
+			foreach (Person p in list)
+				TypeAccessor.WriteConsole(p);
+		}
+
+		[Test]
+		public void TransactionTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				PersonAccessor pa = DataAccessor.CreateInstance<PersonAccessor>();
+
+				db.BeginTransaction();
+
+				// Insert and get id.
+				//
+				Person person = Person.CreateInstance();
+
+				person.FirstName = "Crazy";
+				person.LastName  = "Frog";
+				person.Gender    = Gender.Unknown;
+
+				int id = pa.Insert(db, person);
+
+				person = pa.SelectByID(db, id);
+
+				TypeAccessor.WriteConsole(person);
+				Assert.IsNotNull(person);
+
+				// Update.
+				//
+				person.Gender = Gender.Other;
+
+				pa.Query.Update(db, person);
+
+				person = pa.SelectByID(db, person.ID);
+
+				TypeAccessor.WriteConsole(person);
+				Assert.AreEqual(Gender.Other, person.Gender);
+
+				// Delete.
+				//
+				pa.Query.Delete(db, person);
+
+				person = pa.SelectByID(db, person.ID);
+
+				Assert.IsNull(person);
+
+				db.CommitTransaction();
+
+				// Get All.
+				//
+				List<Person> list = pa.Query.SelectAll(db);
+
+				foreach (Person p in list)
+					TypeAccessor.WriteConsole(p);
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/PrimaryKey.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,34 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class PrimaryKey
+	{
+		public class Person
+		{
+			[MapField("PersonID"), /*[a]*/PrimaryKey/*[/a]*/, NonUpdatable]
+			public int    ID;
+
+			public string LastName;
+			public string FirstName;
+			public string MiddleName;
+		}
+
+		[Test]
+		public void Test()
+		{
+			SqlQuery<Person> da = new SqlQuery<Person>();
+
+			Person person = da./*[a]*/SelectByKey(1)/*[/a]*/;
+
+			Assert.IsNotNull(person);
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/ScalarFieldName.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class ScalarFieldName
+	{
+		public abstract class TestAccessor : DataAccessor
+		{
+			[SqlQuery("SELECT PersonID, FirstName FROM Person")]
+			[Index("PersonID")]
+			[/*[a]*/ScalarFieldName("FirstName")/*[/a]*/]
+			public abstract Dictionary<int, string> GetPersonNameDictionary();
+		}
+
+		[Test]
+		public void Test()
+		{
+			TestAccessor pa = DataAccessor.CreateInstance<TestAccessor>();
+
+			IDictionary<int, string> dic = pa.GetPersonNameDictionary();
+
+			Assert.AreEqual("John", dic[1]);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/ScalarSource.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,138 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class ScalarSource
+	{
+		public abstract class TestAccessor : DataAccessor
+		{
+			[/*[a]*/ScalarSource/*[/a]*/(ScalarSourceType.DataReader)]
+			public abstract int Scalar_DataReader();
+
+			[ActionName("Scalar_DataReader")]
+			[/*[a]*/ScalarSource/*[/a]*/(ScalarSourceType.DataReader, 1)]
+			public abstract string Scalar_DataReader2();
+
+			[ActionName("Scalar_DataReader")]
+			[/*[a]*/ScalarSource/*[/a]*/(ScalarSourceType.DataReader, "stringField")]
+			public abstract string Scalar_DataReader3();
+
+			[/*[a]*/ScalarSource/*[/a]*/(ScalarSourceType.OutputParameter)]
+			public abstract int Scalar_OutputParameter();
+
+			[ActionName("Scalar_OutputParameter")]
+			[/*[a]*/ScalarSource/*[/a]*/(ScalarSourceType.OutputParameter, 1)]
+			public abstract string Scalar_OutputParameter2();
+
+			[ActionName("Scalar_OutputParameter")]
+			[/*[a]*/ScalarSource/*[/a]*/(ScalarSourceType.OutputParameter, "outputString")]
+			public abstract string Scalar_OutputParameter3();
+
+			[/*[a]*/ScalarSource/*[/a]*/(ScalarSourceType.ReturnValue)]
+			public abstract int Scalar_ReturnParameter();
+
+			[ActionName("Scalar_DataReader")]
+			[/*[a]*/ScalarSource/*[/a]*/(ScalarSourceType.AffectedRows)]
+			public abstract int Scalar_AffectedRows();
+
+			public static TestAccessor CreateInstance()
+			{
+				return (TestAccessor)CreateInstance(typeof(TestAccessor));
+			}
+		}
+
+		[Test]
+		public void DataReaderTest()
+		{
+			TestAccessor ta = TestAccessor.CreateInstance();
+
+			int expectedValue = 12345;
+			int actualValue   = ta.Scalar_DataReader();
+
+			Assert.AreEqual(expectedValue, actualValue);
+		}
+
+		[Test]
+		public void DataReader2Test()
+		{
+			TestAccessor ta = TestAccessor.CreateInstance();
+
+			string expectedValue = "54321";
+			string actualValue   = ta.Scalar_DataReader2();
+
+			Assert.AreEqual(expectedValue, actualValue);
+		}
+
+		[Test]
+		public void DataReader3Test()
+		{
+			TestAccessor ta = TestAccessor.CreateInstance();
+
+			string expectedValue = "54321";
+			string actualValue   = ta.Scalar_DataReader3();
+
+			Assert.AreEqual(expectedValue, actualValue);
+		}
+
+		[Test]
+		public void OutputParameterTest()
+		{
+			TestAccessor ta = TestAccessor.CreateInstance();
+
+			int expectedValue = 12345;
+			int actualValue   = ta.Scalar_OutputParameter();
+
+			Assert.AreEqual(expectedValue, actualValue);
+		}
+
+		[Test]
+		public void OutputParameter2Test()
+		{
+			TestAccessor ta = TestAccessor.CreateInstance();
+
+			string expectedValue = "54321";
+			string actualValue   = ta.Scalar_OutputParameter2();
+
+			Assert.AreEqual(expectedValue, actualValue);
+		}
+
+		[Test]
+		public void OutputParameter3Test()
+		{
+			TestAccessor ta = TestAccessor.CreateInstance();
+
+			string expectedValue = "54321";
+			string actualValue   = ta.Scalar_OutputParameter3();
+
+			Assert.AreEqual(expectedValue, actualValue);
+		}
+
+		[Test]
+		public void ReturnParameterTest()
+		{
+			TestAccessor ta = TestAccessor.CreateInstance();
+
+			int expectedValue = 12345;
+			int actualValue   = ta.Scalar_ReturnParameter();
+
+			Assert.AreEqual(expectedValue, actualValue);
+		}
+
+		[Test]
+		public void AffectedRowsTest()
+		{
+			TestAccessor ta = TestAccessor.CreateInstance();
+
+			int expectedValue = -1;
+			int actualValue   = ta.Scalar_AffectedRows();
+
+			Assert.AreEqual(expectedValue, actualValue);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/SelectAll.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class SelectAll
+	{
+		[Test]
+		public void Test1()
+		{
+			/*[a]*/SprocQuery<Person> query = new SprocQuery<Person>()/*[/a]*/;
+
+			List<Person> list = query./*[a]*/SelectAll()/*[/a]*/;
+		}
+
+		[Test]
+		public void Test2()
+		{
+			using (DbManager db = new DbManager())
+			{
+				/*[a]*/SprocQuery<Person> query = new SprocQuery<Person>()/*[/a]*/;
+
+				List<Person> list = query./*[a]*/SelectAll(db)/*[/a]*/;
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/SelectAllSql.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class SelectAllSql
+	{
+		[Test]
+		public void Test1()
+		{
+			/*[a]*/SqlQuery<Person> query = new SqlQuery<Person>()/*[/a]*/;
+
+			List<Person> list = query./*[a]*/SelectAll()/*[/a]*/;
+		}
+
+		[Test]
+		public void Test2()
+		{
+			using (DbManager db = new DbManager())
+			{
+				/*[a]*/SqlQuery<Person> query = new SqlQuery<Person>()/*[/a]*/;
+
+				List<Person> list = query./*[a]*/SelectAll(db)/*[/a]*/;
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/SelectByKey.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,37 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class SelectByKey
+	{
+		[Test]
+		public void Test1()
+		{
+			/*[a]*/SprocQuery<Person> query = new SprocQuery<Person>()/*[/a]*/;
+
+			Person person = query./*[a]*/SelectByKey(1)/*[/a]*/;
+
+			Assert.IsNotNull(person);
+		}
+
+		[Test]
+		public void Test2()
+		{
+			using (DbManager db = new DbManager())
+			{
+				/*[a]*/SprocQuery<Person> query = new SprocQuery<Person>()/*[/a]*/;
+
+				Person person = query./*[a]*/SelectByKey(db, 1)/*[/a]*/;
+
+				Assert.IsNotNull(person);
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/SelectByKeySql.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,37 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class SelectByKeySql
+	{
+		[Test]
+		public void Test1()
+		{
+			/*[a]*/SqlQuery<Person> query = new SqlQuery<Person>()/*[/a]*/;
+
+			Person person = query./*[a]*/SelectByKey(1)/*[/a]*/;
+
+			Assert.IsNotNull(person);
+		}
+
+		[Test]
+		public void Test2()
+		{
+			using (DbManager db = new DbManager())
+			{
+				/*[a]*/SqlQuery<Person> query = new SqlQuery<Person>()/*[/a]*/;
+
+				Person person = query./*[a]*/SelectByKey(db, 1)/*[/a]*/;
+
+				Assert.IsNotNull(person);
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/SprocName.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class SprocName
+	{
+		public abstract class TestAccessor : DataAccessor
+		{
+			[/*[a]*/SprocName/*[/a]*/("Person_SelectAll")]
+			public abstract List<Person> GetPersonList();
+		}
+
+		[Test]
+		public void Test()
+		{
+			TestAccessor ta = DataAccessor.CreateInstance<TestAccessor>();
+
+			List<Person> list = ta.GetPersonList();
+
+			Assert.AreNotEqual(0, list.Count);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/Sql/Access.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<sql>
+</sql>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/Sql/Fdp.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<sql>
+	<query id="3">SELECT FIRST {0} * FROM Person WHERE LastName = @lastName</query>
+	<query id="4">SELECT CAST(@id AS INTEGER) PersonID FROM Dual</query>
+</sql>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/Sql/Oracle.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<sql>
+	<query id="1">SELECT * FROM Person WHERE LastName = :lastName</query>
+	<query id="2">SELECT * FROM Person WHERE {0} = :value</query>
+	<query id="3">SELECT * FROM Person WHERE LastName = :lastName AND rownum &lt;= {0}</query>
+	<query id="4">SELECT :id PersonID FROM Dual</query>
+</sql>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/Sql/SQLite.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<sql>
+	<query id="3">SELECT * FROM Person WHERE LastName = @lastName LIMIT {0}</query>
+</sql>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/Sql/Sql.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<sql>
+	<query id="1">SELECT * FROM Person WHERE LastName = @lastName</query>
+	<query id="2">SELECT * FROM Person WHERE {0} = @value</query>
+	<query id="3">SELECT TOP {0} * FROM Person WHERE LastName = @lastName</query>
+	<query id="4">SELECT @id as PersonID</query>
+</sql>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/SqlQuery.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,36 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class SqlQuery
+	{
+		public abstract class TestAccessor : DataAccessor
+		{
+			[/*[a]*/SqlQuery/*[/a]*/(@"
+				SELECT
+					*
+				FROM
+					Person
+				WHERE
+					FirstName like @firstName AND
+					LastName  like @lastName")]
+			public abstract List<Person> GetPersonListByName(string @firstName, string @lastName);
+		}
+
+		[Test]
+		public void Test()
+		{
+			TestAccessor ta = DataAccessor.CreateInstance<TestAccessor>();
+
+			List<Person> list = ta.GetPersonListByName("John", "P%");
+
+			Assert.AreNotEqual(0, list.Count);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/TableName.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,45 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class TableName
+	{
+		/*[a]*/[TableName("Person")]/*[/a]*/
+		public class /*[a]*/MyPersonObject/*[/a]*/
+		{
+			[MapField("PersonID"), PrimaryKey, NonUpdatable]
+			public int    ID;
+
+			public string LastName;
+			public string FirstName;
+			public string MiddleName;
+		}
+
+		[Test]
+		public void Test1()
+		{
+			SqlQuery<MyPersonObject> query = new SqlQuery<MyPersonObject>();
+
+			MyPersonObject person = query./*[a]*/SelectByKey(1)/*[/a]*/;
+
+			Assert.IsNotNull(person);
+		}
+
+		[Test]
+		public void Test2()
+		{
+			SprocQuery<MyPersonObject> query = new SprocQuery<MyPersonObject>();
+
+			MyPersonObject person = query./*[a]*/SelectByKey(1)/*[/a]*/;
+
+			Assert.IsNotNull(person);
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/Transaction.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,70 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class Transaction
+	{
+		public abstract class TestAccessor : DataAccessor<Person>
+		{
+			public abstract int  Insert(Person person);
+			public abstract void Delete(int @PersonID);
+
+			public abstract Person SelectByKey(int id);
+			public abstract Person SelectByKey(/*[a]*/DbManager/*[/a]*/ db, int id);
+		}
+
+		// /*[i]*/DataAccessor/*[/i]*/ takes /*[i]*/DbManager/*[/i]*/ as a parameter.
+		//
+		[Test]
+		public void Test1()
+		{
+			using (DbManager db = new DbManager())
+			{
+				TestAccessor ta = DataAccessor.CreateInstance<TestAccessor>/*[a]*/(db)/*[/a]*/;
+
+				ta./*[a]*/BeginTransaction/*[/a]*/();
+
+				int id = ta.Insert(new Person { FirstName = "John", LastName = "Smith" });
+				Assert.AreNotEqual(0, id);
+
+				Person person = ta.SelectByKey(id);
+				Assert.IsNotNull(person);
+
+				ta.Delete(id);
+
+				ta./*[a]*/CommitTransaction/*[/a]*/();
+			}
+		}
+
+		// /*[i]*/DataAccessor/*[/i]*/ method takes /*[i]*/DbManager/*[/i]*/ as a parameter.
+		//
+		[Test]
+		public void Test2()
+		{
+			using (DbManager db = new DbManager())
+			{
+				db.BeginTransaction();
+
+				TestAccessor ta = DataAccessor.CreateInstance<TestAccessor>/*[a]*/()/*[/a]*/;
+
+				int id = ta.Insert(new Person { FirstName = "John", LastName = "Smith" });
+				Assert.AreNotEqual(0, id);
+
+				Person person = ta.SelectByKey(/*[a]*/db/*[/a]*/, id);
+				Assert.IsNotNull(person);
+
+				ta.Delete(id);
+
+				db.CommitTransaction();
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/Update.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,76 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class Update
+	{
+		int _id;
+
+		[TestFixtureSetUp]
+		public void Insert()
+		{
+			using (DbManager db = new DbManager())
+			{
+				_id = db
+					.SetCommand(@"
+						INSERT INTO Person (
+							 FirstName,  LastName,  Gender
+						) VALUES (
+							@FirstName, @LastName, @Gender
+						)
+						SELECT Cast(SCOPE_IDENTITY() as int)",
+						db.Parameter("@FirstName", "Crazy"),
+						db.Parameter("@LastName",  "Frog"),
+						db.Parameter("@Gender",    Map.EnumToValue(Gender.Unknown)))
+					.ExecuteScalar<int>();
+			}
+		}
+
+		[Test]
+		public void Test1()
+		{
+			/*[a]*/SprocQuery<Person> query = new SprocQuery<Person>()/*[/a]*/;
+
+			Person person = query.SelectByKey(_id);
+
+			person.Gender = Gender.Other;
+
+			query./*[a]*/Update(person)/*[/a]*/;
+		}
+
+		[Test]
+		public void Test2()
+		{
+			using (DbManager db = new DbManager())
+			{
+				/*[a]*/SprocQuery<Person> query = new SprocQuery<Person>()/*[/a]*/;
+
+				Person person = query.SelectByKey(db, _id);
+
+				person.Gender = Gender.Other;
+
+				query./*[a]*/Update(db, person)/*[/a]*/;
+			}
+		}
+
+		[TestFixtureTearDown]
+		public void Delete()
+		{
+			using (DbManager db = new DbManager())
+			{
+				db
+					.SetCommand("DELETE FROM Person WHERE PersonID = @id",
+						db.Parameter("@id", _id))
+					.ExecuteNonQuery();
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/UpdateSql.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,76 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class UpdateSql
+	{
+		int _id;
+
+		[TestFixtureSetUp]
+		public void Insert()
+		{
+			using (DbManager db = new DbManager())
+			{
+				_id = db
+					.SetCommand(@"
+						INSERT INTO Person (
+							 FirstName,  LastName,  Gender
+						) VALUES (
+							@FirstName, @LastName, @Gender
+						)
+						SELECT Cast(SCOPE_IDENTITY() as int)",
+						db.Parameter("@FirstName", "Crazy"),
+						db.Parameter("@LastName",  "Frog"),
+						db.Parameter("@Gender",    Map.EnumToValue(Gender.Unknown)))
+					.ExecuteScalar<int>();
+			}
+		}
+
+		[Test]
+		public void Test1()
+		{
+			/*[a]*/SqlQuery<Person> query = new SqlQuery<Person>()/*[/a]*/;
+
+			Person person = query.SelectByKey(_id);
+
+			person.Gender = Gender.Other;
+
+			query./*[a]*/Update(person)/*[/a]*/;
+		}
+
+		[Test]
+		public void Test2()
+		{
+			using (DbManager db = new DbManager())
+			{
+				/*[a]*/SqlQuery<Person> query = new SqlQuery<Person>()/*[/a]*/;
+
+				Person person = query.SelectByKey(db, _id);
+
+				person.Gender = Gender.Other;
+
+				query./*[a]*/Update(db, person)/*[/a]*/;
+			}
+		}
+
+		[TestFixtureTearDown]
+		public void Delete()
+		{
+			using (DbManager db = new DbManager())
+			{
+				db
+					.SetCommand("DELETE FROM Person WHERE PersonID = @id",
+						db.Parameter("@id", _id))
+					.ExecuteNonQuery();
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/XmlExtension.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,35 @@
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+/*[a]*/using BLToolkit.Reflection.Extension/*[/a]*/;
+
+namespace HowTo.DataAccess
+{
+	[TestFixture]
+	public class XmlExtension
+	{
+		public class MyPersonObject
+		{
+			[MapField("PersonID")]
+			public int    ID;
+
+			public string LastName;
+			public string FirstName;
+			public string MiddleName;
+		}
+
+		[Test]
+		public void Test()
+		{
+			SqlQuery<MyPersonObject> query = new SqlQuery<MyPersonObject>();
+
+			/*[a]*/query.Extensions = TypeExtension.GetExtensions("XmlExtension.xml")/*[/a]*/;
+
+			MyPersonObject person = query.SelectByKey(1);
+
+			Assert.IsNotNull(person);
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/DataAccess/XmlExtension.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<Types
+	xmlns    = "urn:schemas-bltoolkit-net:typeext"
+	xmlns:da = "urn:schemas-bltoolkit-net:dataaccess">
+
+	<Type Name="MyPersonObject" da:TableName="Person">
+		<Member Name="ID" da:PrimaryKey="1" da:NonUpdatable="1" />
+	</Type>
+</Types>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/EditableObjects/AcceptRejectChanges.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,47 @@
+using System;
+using NUnit.Framework;
+using BLToolkit.EditableObjects;
+
+namespace HowTo.EditableObjects
+{
+	[TestFixture]
+	public class AcceptRejectChanges
+	{
+		public /*[a]*/abstract/*[/a]*/ class TestObject : /*[a]*/EditableObject/*[/a]*/<TestObject>
+		{
+			public /*[a]*/abstract/*[/a]*/ string FirstName { get; set; }
+			public /*[a]*/abstract/*[/a]*/ string LastName  { get; set; }
+		}
+
+		[Test]
+		public void Test()
+		{
+			// Create an instance.
+			//
+			TestObject obj = TestObject./*[a]*/CreateInstance/*[/a]*/();
+
+			// Accept changes.
+			//
+			obj.FirstName = "Tester";
+			obj.LastName  = "Testerson";
+
+			Assert.IsTrue(obj.IsDirty);
+
+			obj./*[a]*/AcceptChanges/*[/a]*/();
+
+			Assert.AreEqual("Tester", obj.FirstName);
+			Assert.IsFalse(obj.IsDirty);
+
+			// Reject changes.
+			//
+			obj.FirstName = "Developer";
+
+			Assert.IsTrue(obj.IsDirty);
+
+			obj./*[a]*/RejectChanges/*[/a]*/();
+
+			Assert.AreEqual("Tester", obj.FirstName);
+			Assert.IsFalse(obj.IsDirty);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/EditableObjects/EditableObjectTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,40 @@
+using System;
+using NUnit.Framework;
+using BLToolkit.EditableObjects;
+
+namespace HowTo.EditableObjects
+{
+	[TestFixture]
+	public class EditableObjectTest
+	{
+		public /*[a]*/abstract/*[/a]*/ class TestObject : /*[a]*/EditableObject/*[/a]*/<TestObject>
+		{
+			// Any abstract property becomes editable.
+			//
+			public /*[a]*/abstract/*[/a]*/ string FirstName { get; set; }
+			public /*[a]*/abstract/*[/a]*/ string LastName  { get; set; }
+
+			// This field is not editable.
+			//
+			public string FullName
+			{
+				get { return string.Format("{0} {1}", FirstName, LastName); }
+			}
+		}
+
+		[Test]
+		public void Test()
+		{
+			TestObject obj = TestObject./*[a]*/CreateInstance/*[/a]*/();
+
+			obj.FirstName = "Tester";
+			obj.LastName  = "Testerson";
+
+			Assert.IsTrue(obj.IsDirty);
+
+			obj.AcceptChanges();
+
+			Assert.IsFalse(obj.IsDirty);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/EditableObjects/IsDirty.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,33 @@
+using System;
+using NUnit.Framework;
+using BLToolkit.EditableObjects;
+
+namespace HowTo.EditableObjects
+{
+	[TestFixture]
+	public class IsDirty
+	{
+		public /*[a]*/abstract/*[/a]*/ class TestObject : /*[a]*/EditableObject/*[/a]*/<TestObject>
+		{
+			public /*[a]*/abstract/*[/a]*/ string FirstName { get; set; }
+			public /*[a]*/abstract/*[/a]*/ string LastName  { get; set; }
+		}
+
+		[Test]
+		public void Test()
+		{
+			TestObject obj = TestObject./*[a]*/CreateInstance/*[/a]*/();
+
+			Assert./*[a]*/IsFalse/*[/a]*/(obj./*[a]*/IsDirty/*[/a]*/);
+
+			obj.FirstName = "Tester";
+			obj.LastName  = "Testerson";
+
+			Assert./*[a]*/IsTrue/*[/a]*/(obj./*[a]*/IsDirty/*[/a]*/);
+
+			obj.AcceptChanges();
+
+			Assert./*[a]*/IsFalse/*[/a]*/(obj./*[a]*/IsDirty/*[/a]*/);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/EditableObjects/PropertyChanged.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,36 @@
+using System;
+using NUnit.Framework;
+using BLToolkit.EditableObjects;
+
+namespace HowTo.EditableObjects
+{
+	[TestFixture]
+	public class PropertyChanged
+	{
+		public /*[a]*/abstract/*[/a]*/ class TestObject : /*[a]*/EditableObject/*[/a]*/<TestObject>
+		{
+			public /*[a]*/abstract/*[/a]*/ string FirstName { get; set; }
+			public /*[a]*/abstract/*[/a]*/ string LastName  { get; set; }
+		}
+
+		[Test]
+		public void Test()
+		{
+			TestObject obj = TestObject./*[a]*/CreateInstance/*[/a]*/();
+
+			bool proprtyName = null;
+
+			obj./*[a]*/PropertyChanged/*[/a]*/ += (s, e) => proprtyName = e.PropertyName;
+
+			Assert.IsNull(propertyName);
+
+			obj.FirstName = "Tester";
+
+			Assert.AreEqual(proprtyName, "FirstName");
+
+			bool proprtyName = null;
+
+			obj.AcceptChanges();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/HowTo.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,282 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{8DA66999-005A-49AB-86A9-2C1F62905B50}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HowTo</RootNamespace>
+    <AssemblyName>HowTo</AssemblyName>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkProfile />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\HowTo.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\HowTo.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework, Version=2.6.3.13283, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\packages\NUnit.2.6.3\lib\nunit.framework.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.configuration" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\Source\Data\DataProvider\SybaseAdoDataProvider.cs">
+      <Link>Data\DataProvider\SybaseAdoDataProvider.cs</Link>
+    </Compile>
+    <Compile Include="Aspects\AsyncAspect.cs" />
+    <Compile Include="Aspects\CacheAspect.cs" />
+    <Compile Include="Aspects\ClearCacheAspect.cs" />
+    <Compile Include="Aspects\CounterAspect.cs" />
+    <Compile Include="Aspects\LoggingAspect.cs" />
+    <Compile Include="Aspects\MixinAspect.cs" />
+    <Compile Include="Aspects\NoCache.cs" />
+    <Compile Include="Aspects\NotNull.cs" />
+    <Compile Include="Aspects\OverloadAspect.cs" />
+    <Compile Include="DataAccess\AbstractAccessor.cs" />
+    <Compile Include="DataAccess\ActionName.cs" />
+    <Compile Include="DataAccess\ActionSprocName.cs" />
+    <Compile Include="DataAccess\ActualType.cs" />
+    <Compile Include="DataAccess\CommandBehavior.cs" />
+    <Compile Include="DataAccess\CustomSqlQuery2.cs" />
+    <Compile Include="DataAccess\CustomSqlQuery1.cs" />
+    <Compile Include="DataAccess\Transaction.cs" />
+    <Compile Include="DataAccess\OpenConfigQuery.cs" />
+    <Compile Include="DataAccess\SqlQuery.cs" />
+    <Compile Include="DataAccess\SprocName.cs" />
+    <Compile Include="DataAccess\ScalarSource.cs" />
+    <Compile Include="DataAccess\ScalarFieldName.cs" />
+    <Compile Include="DataAccess\ParamNullValue.cs" />
+    <Compile Include="DataAccess\ParamName.cs" />
+    <Compile Include="DataAccess\Param.cs" />
+    <Compile Include="DataAccess\Format.cs" />
+    <Compile Include="DataAccess\DiscoverParameters.cs" />
+    <Compile Include="DataAccess\Direction.cs" />
+    <Compile Include="DataAccess\Destination.cs" />
+    <Compile Include="DataAccess\DataSetTable.cs" />
+    <Compile Include="DataAccess\ExecuteScalar.cs" />
+    <Compile Include="DataAccess\ExecuteObject.cs" />
+    <Compile Include="DataAccess\ExecuteList.cs" />
+    <Compile Include="DataAccess\ExecuteDictionary.cs" />
+    <Compile Include="DataAccess\TableName.cs" />
+    <Compile Include="DataAccess\NonUpdatable.cs" />
+    <Compile Include="DataAccess\MultiplePrimaryKey.cs" />
+    <Compile Include="DataAccess\PrimaryKey.cs" />
+    <Compile Include="DataAccess\Gender.cs" />
+    <Compile Include="DataAccess\Person.cs" />
+    <Compile Include="DataAccess\XmlExtension.cs" />
+    <Compile Include="DataAccess\Delete.cs" />
+    <Compile Include="DataAccess\Update.cs" />
+    <Compile Include="DataAccess\Insert.cs" />
+    <Compile Include="DataAccess\SelectAll.cs" />
+    <Compile Include="DataAccess\SelectByKey.cs" />
+    <Compile Include="DataAccess\DeleteSql.cs" />
+    <Compile Include="DataAccess\UpdateSql.cs" />
+    <Compile Include="DataAccess\InsertSql.cs" />
+    <Compile Include="DataAccess\SelectAllSql.cs" />
+    <Compile Include="DataAccess\OpenConfig.cs" />
+    <Compile Include="DataAccess\SelectByKeySql.cs" />
+    <Compile Include="DataAccess\PersonAccessor.cs" />
+    <Compile Include="Data\Close.cs" />
+    <Compile Include="Data\AdoDemo.cs" />
+    <Compile Include="Data\ComplexMapping.cs" />
+    <Compile Include="Data\ExecuteScalarDictionary.cs" />
+    <Compile Include="Data\ExecuteScalar.cs" />
+    <Compile Include="Data\ExecuteReader.cs" />
+    <Compile Include="Data\ExecuteDictionary.cs" />
+    <Compile Include="Data\ExecuteDataTable.cs" />
+    <Compile Include="Data\ExecuteDataSet.cs" />
+    <Compile Include="Data\ExecuteNonQuery.cs" />
+    <Compile Include="Data\ExecuteForEach.cs" />
+    <Compile Include="Data\ExecuteScalarList.cs" />
+    <Compile Include="Data\Prepare.cs" />
+    <Compile Include="Data\DataProvider\AddDataProvider.cs" />
+    <Compile Include="Data\OpenConfig1.cs" />
+    <Compile Include="Data\DbManagerDemo.cs" />
+    <Compile Include="Data\OpenConfig1FW2.cs" />
+    <Compile Include="Data\OpenConfig2.cs" />
+    <Compile Include="Data\ExecuteObject.cs" />
+    <Compile Include="Data\ExecuteList.cs" />
+    <Compile Include="Data\OpenConfig3.cs" />
+    <Compile Include="Data\Parameter.cs" />
+    <Compile Include="Data\SetCommand.cs" />
+    <Compile Include="Data\SetSpCommand.cs" />
+    <Compile Include="Data\Transaction.cs" />
+    <Compile Include="Data\UpdateObject.cs" />
+    <Compile Include="EditableObjects\AcceptRejectChanges.cs" />
+    <Compile Include="EditableObjects\IsDirty.cs" />
+    <Compile Include="EditableObjects\EditableObjectTest.cs" />
+    <Compile Include="Mapping\MapToJson.cs" />
+    <Compile Include="Mapping\MapFieldAttribute.cs" />
+    <Compile Include="Mapping\ObjectToObject.cs" />
+    <Compile Include="Mapping\MapValueAttribute2.cs" />
+    <Compile Include="Mapping\MapValueAttribute1.cs" />
+    <Compile Include="Mapping\ValueToEnum.cs" />
+    <Compile Include="Mapping\EnumToValue.cs" />
+    <Compile Include="Patterns\DuckTyping.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Reflection\ObjectFactory.cs" />
+    <Compile Include="TypeBuilder\InitialValues.cs" />
+    <Compile Include="TypeBuilder\XmlSerialization.cs" />
+    <Compile Include="TypeBuilder\InternalTypes.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="DataAccess\XmlExtension.xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\Data\BLToolkitData.sqlite">
+      <Link>BLToolkitData.sqlite</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="app.config" />
+    <None Include="packages.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="DataAccess\Sql\Sql.xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="DataAccess\Sql\Access.xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="DataAccess\Sql\Oracle.xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="DataAccess\Sql\Fdp.xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="DataAccess\Sql\SQLite.xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Data\RelationExtension.xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="..\Data\BLToolkitData.mdb">
+      <Link>BLToolkitData.mdb</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="..\Data\BLToolkitData.sdf">
+      <Link>BLToolkitData.sdf</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Mapping/EnumToValue.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,60 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Mapping;
+
+namespace HowTo.Mapping
+{
+	[TestFixture]
+	public class EnumToValue
+	{
+		public enum Gender1
+		{
+			[MapValue("F")] Female,
+			[MapValue("M")] Male,
+			[MapValue("U")] Unknown,
+			[MapValue("O")] Other
+		}
+
+		[Test]
+		public void Test1()
+		{
+			object value = Map./*[a]*/EnumToValue/*[/a]*/(Gender1.Male);
+
+			Assert.AreEqual("M", value);
+		}
+
+		public enum Gender2
+		{
+			[MapValue(1)] Female,
+			[MapValue(2)] Male,
+			[MapValue(3)] Unknown,
+			[MapValue(4)] Other
+		}
+
+		[Test]
+		public void Test2()
+		{
+			object value = Map./*[a]*/EnumToValue/*[/a]*/(Gender2.Male);
+
+			Assert.AreEqual(2, value);
+		}
+
+		public enum Gender3
+		{
+			Female  = 1,
+			Male    = 2,
+			Unknown = 3,
+			Other   = 4
+		}
+
+		[Test]
+		public void Test3()
+		{
+			object value = (int)Map./*[a]*/EnumToValue/*[/a]*/(Gender3.Male);
+
+			Assert.AreEqual(2, value);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Mapping/FluentMapping.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,38 @@
+using System;
+
+using BLToolkit.Mapping;
+using BLToolkit.Mapping.Fluent;
+using BLToolkit.Mapping.MemberMappers;
+
+namespace HowTo.Mapping
+{
+    public class Category
+    {
+        public int    CategoryID;
+        public string CategoryName;
+        public string Description;
+        public Binary Picture;
+        public TimeSpan RefreshTime;
+        public AdditionalInfo AdditionalInfo;
+        public List<Product> Products;
+    }
+    
+    public class CategoryMap : FluentMap<Category>
+    {
+        public CategoryMap()
+        {
+            TableName("Categories");
+            PrimaryKey(_ => _.CategoryID).Identity();
+            Nullable(_ => _.Description);
+            Nullable(_ => _.Picture);
+            MapField(_ => _.RefreshTime).MemberMapper(typeof(TimeSpanBigIntMapper)).DbType(System.Data.DbType.Int64);
+            MapField(_ => _.AdditionalInfo).MapIgnore(false).MemberMapper(typeof(BinarySerialisationMapper)).DbType(System.Data.DbType.Byte);
+            Association(_ => _.Products,_ => _.CategoryID).ToMany((Product _) => _.CategoryID);
+        }
+    }
+    
+    public static void Main()
+    {
+        FluentConfig.Configure(Map.DefaultSchema).MapingFromAssemblyOf<Category>();
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Mapping/MapFieldAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,88 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Mapping;
+
+namespace HowTo.Mapping
+{
+	[TestFixture]
+	public class MapField
+	{
+		public class SourceObject1
+		{
+			public string Street = "1 Main";
+			public string City   = "Bigtown";
+			public string State  = "XX";
+			public string Zip    = "00000";
+		}
+
+		public class Address
+		{
+			public string Street;
+			public string City;
+			public string State;
+			public string Zip;
+		}
+
+		/*[a]*/[MapField("Street", "Address.Street")]/*[/a]*/
+		/*[a]*/[MapField("City",   "Address.City")]/*[/a]*/
+		/*[a]*/[MapField("State",  "Address.State")]/*[/a]*/
+		/*[a]*/[MapField("Zip",    "Address.Zip")]/*[/a]*/
+		public class Order1
+		{
+			public Address Address = new Address();
+		}
+
+		[Test]
+		public void MapFieldTest1()
+		{
+			SourceObject1 source = new SourceObject1();
+			Order1        order  = Map.ObjectToObject<Order1>(source);
+
+			Assert.AreEqual("1 Main",  order.Address.Street);
+			Assert.AreEqual("Bigtown", order.Address.City);
+			Assert.AreEqual("XX",      order.Address.State);
+			Assert.AreEqual("00000",   order.Address.Zip);
+		}
+
+		public class SourceObject2
+		{
+			public string BillingStreet = "1 Main";
+			public string BillingCity   = "Bigtown";
+			public string BillingState  = "XX";
+			public string BillingZip    = "00000";
+
+			public string ShippingStreet = "2 Main";
+			public string ShippingCity   = "Bigtown";
+			public string ShippingState  = "XX";
+			public string ShippingZip    = "00000";
+		}
+
+		public class Order2
+		{
+			/*[a]*/[MapField(Format="Billing{0}")]/*[/a]*/
+			public Address BillingAddress = new Address();
+
+			/*[a]*/[MapField(Format="Shipping{0}")]/*[/a]*/
+			public Address ShippingAddress = new Address();
+		}
+
+		[Test]
+		public void MapFieldTest2()
+		{
+			SourceObject2 source = new SourceObject2();
+			Order2        order  = Map.ObjectToObject<Order2>(source);
+
+			Assert.AreEqual("1 Main",  order.BillingAddress.Street);
+			Assert.AreEqual("Bigtown", order.BillingAddress.City);
+			Assert.AreEqual("XX",      order.BillingAddress.State);
+			Assert.AreEqual("00000",   order.BillingAddress.Zip);
+
+			Assert.AreEqual("2 Main",  order.ShippingAddress.Street);
+			Assert.AreEqual("Bigtown", order.ShippingAddress.City);
+			Assert.AreEqual("XX",      order.ShippingAddress.State);
+			Assert.AreEqual("00000",   order.ShippingAddress.Zip);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Mapping/MapToJson.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,435 @@
+using System;
+using System.Globalization;
+using System.Text;
+using System.Xml;
+
+using NUnit.Framework;
+
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+
+namespace HowTo.Mapping
+{
+	public class JsonMapper : MapDataDestinationBase, IMapDataDestinationList, ISupportMapping
+	{
+		private static readonly long   InitialJavaScriptDateTicks = new DateTime(1970, 1, 1).Ticks;
+
+		private string[]               _fieldNames;
+		private readonly StringBuilder _sb;
+		private MappingSchema          _mappingSchema;
+		private bool                   _scalar;
+		private bool                   _first;
+		private bool                   _firstElement;
+		private int                    _indent;
+
+		public JsonMapper() : this(new StringBuilder(), 0)
+		{
+		}
+
+		public JsonMapper(StringBuilder sb) : this(sb, 0)
+		{
+		}
+
+		public JsonMapper(StringBuilder sb, int indent)
+		{
+			_sb     = sb;
+			_indent = indent;
+		}
+
+		public override Type GetFieldType(int index)
+		{
+			// Same as typeof(object)
+			//
+			return null;
+		}
+
+		public override int GetOrdinal(string name)
+		{
+			return Array.IndexOf(_fieldNames, name);
+		}
+
+		public override void SetValue(object o, int index, object value)
+		{
+			SetValue(o, _fieldNames[index], value);
+		}
+
+		public override void SetValue(object o, string name, object value)
+		{
+			if (!_scalar)
+			{
+				// Do not Json null values until it's an array
+				//
+				if (value == null || (value is XmlNode && IsEmptyNode((XmlNode)value)))
+					return;
+
+				if (_first)
+					_first = false;
+				else
+					_sb
+						.Append(',')
+						.AppendLine()
+						;
+
+				for (int i = 0; i < _indent; ++i)
+					_sb.Append(' ');
+
+				_sb
+					.Append('"')
+					.Append(name)
+					.Append("\":")
+					;
+			}
+
+			if (value == null)
+				_sb.Append("null");
+			else
+			{
+				switch (Type.GetTypeCode(value.GetType()))
+				{
+					case TypeCode.Empty:
+					case TypeCode.DBNull:
+						_sb.Append("null");
+						break;
+					case TypeCode.Boolean:
+						_sb.Append((bool)value? "true": "false");
+						break;
+					case TypeCode.Char:
+						_sb
+							.Append('\'')
+							.Append((char)value)
+							.Append('\'')
+							;
+						break;
+					case TypeCode.SByte:
+					case TypeCode.Int16:
+					case TypeCode.Int32:
+					case TypeCode.Int64:
+					case TypeCode.Byte:
+					case TypeCode.UInt16:
+					case TypeCode.UInt32:
+					case TypeCode.UInt64:
+					case TypeCode.Single:
+					case TypeCode.Double:
+					case TypeCode.Decimal:
+						_sb.Append(((IFormattable)value).ToString(null, CultureInfo.InvariantCulture));
+						break;
+					case TypeCode.DateTime:
+						_sb
+							.Append("new Date(")
+							.Append((((DateTime)value).Ticks - InitialJavaScriptDateTicks)/10000)
+							.Append(")");
+						break;
+					case TypeCode.String:
+						_sb
+							.Append('"')
+							.Append(encode((string)value))
+							.Append('"')
+							;
+						break;
+					default:
+						if (value is XmlNode)
+						{
+							if (IsEmptyNode((XmlNode) value))
+								_sb.Append("null");
+							else
+								WriteXmlJson((XmlNode)value);
+						}
+						else
+						{
+							JsonMapper inner = new JsonMapper(_sb, _indent + 1);
+
+							if (value.GetType().IsArray)
+								_mappingSchema.MapSourceListToDestinationList(
+									_mappingSchema.GetDataSourceList(value), inner);
+							else
+								_mappingSchema.MapSourceToDestination(
+									_mappingSchema.GetDataSource(value), value, inner, inner);
+						}
+						break;
+				}
+			}
+		}
+
+		private static string encode(string value)
+		{
+			return value.Replace("\r\n", "\\r")
+				.Replace("\n\r", "\\r")
+				.Replace("\n", "\\r")
+				.Replace("\r", "\\r")
+				.Replace("\"","\\\"");
+		}
+
+		private void WriteXmlJson(XmlNode node)
+		{
+			XmlNode textNode = GetTextNode(node);
+			if (textNode != null)
+			{
+				_sb
+					.Append("\"")
+					.Append(encode(textNode.Value))
+					.Append('\"')
+					;
+			}
+			else
+			{
+
+				bool first = true;
+
+				_sb.Append('{');
+
+				if (node.Attributes != null)
+				{
+					foreach (XmlAttribute attr in node.Attributes)
+					{
+						if (first)
+							first = false;
+						else
+							_sb.Append(',');
+
+						_sb
+							.Append("\"@")
+							.Append(attr.Name)
+							.Append("\":\"")
+							.Append(encode(attr.Value))
+							.Append('\"')
+							;
+					}
+				}
+
+				foreach (XmlNode child in node.ChildNodes)
+				{
+					if (IsWhitespace(child) || IsEmptyNode(child))
+						continue;
+
+					if (first)
+						first = false;
+					else
+						_sb.Append(',');
+
+					if (child is XmlText)
+						_sb
+							.Append("\"#text\":\"")
+							.Append(encode(child.Value))
+							.Append('\"')
+							;
+					else if (child is XmlElement)
+					{
+						_sb
+							.Append('"')
+							.Append(child.Name)
+							.Append("\":")
+							;
+						WriteXmlJson(child);
+					}
+					else
+						System.Diagnostics.Debug.Fail("Unexpected node type " + child.GetType().FullName);
+				}
+				_sb.Append('}');
+			}
+		}
+
+		private static bool IsWhitespace(XmlNode node)
+		{
+			switch (node.NodeType)
+			{
+				case XmlNodeType.Comment:
+				case XmlNodeType.Whitespace:
+				case XmlNodeType.SignificantWhitespace:
+					return true;
+			}
+			return false;
+		}
+
+		private static bool IsEmptyNode(XmlNode node)
+		{
+			if (node.Attributes != null && node.Attributes.Count > 0)
+				return false;
+
+			if (node.HasChildNodes)
+				foreach (XmlNode childNode in node.ChildNodes)
+				{
+					if (IsWhitespace(childNode) || IsEmptyNode(childNode))
+						continue;
+
+					// Not a whitespace, nor inner empty node.
+					//
+					return false;
+				}
+
+			return node.Value == null;
+		}
+
+		private static XmlNode GetTextNode(XmlNode node)
+		{
+			if (node.Attributes != null && node.Attributes.Count > 0)
+				return null;
+
+			XmlNode textNode = null;
+
+			foreach (XmlNode childNode in node.ChildNodes)
+			{
+				// Ignore all whitespace.
+				//
+				if (IsWhitespace(childNode))
+					continue;
+
+				if (childNode is XmlText)
+				{
+					// More then one text node.
+					//
+					if (textNode != null)
+						return null;
+
+					// First text node.
+					//
+					textNode = childNode;
+				}
+				else
+					// Not a text node - break;
+					//
+					return null;
+			}
+
+			return textNode;
+		}
+
+		#region ISupportMapping Members
+
+		void ISupportMapping.BeginMapping(InitContext initContext)
+		{
+			_first         = true;
+			_mappingSchema = initContext.MappingSchema;
+			_fieldNames    = new string[initContext.DataSource.Count];
+
+			for (int i = 0; i < _fieldNames.Length; ++i)
+				_fieldNames[i] = initContext.DataSource.GetName(i);
+
+			_scalar = _fieldNames.Length == 1 && string.IsNullOrEmpty(_fieldNames[0]);
+
+			if (_scalar)
+				return;
+
+			if (_fieldNames.Length <= 1)
+			{
+				// Reset the indent since output is a single line.
+				//
+				_indent = 0;
+				_sb.Append('{');
+			}
+			else
+			{
+				if (_indent > 0)
+					_sb.AppendLine();
+
+				for (int i = 0; i < _indent; ++i)
+					_sb.Append(' ');
+
+				_sb
+					.Append('{')
+					.AppendLine()
+					;
+			}
+		}
+
+		void ISupportMapping.EndMapping(InitContext initContext)
+		{
+			if (_scalar)
+				return;
+
+			if (_fieldNames.Length > 1)
+				_sb.AppendLine();
+
+			for (int i = 0; i < _indent; ++i)
+				_sb.Append(' ');
+			_sb.Append('}');
+		}
+
+		#endregion
+
+		#region IMapDataDestinationList Members
+
+		void IMapDataDestinationList.InitMapping(InitContext initContext)
+		{
+			_firstElement = true;
+			_sb.Append('[');
+		}
+
+		IMapDataDestination IMapDataDestinationList.GetDataDestination(InitContext initContext)
+		{
+			return this;
+		}
+
+		object IMapDataDestinationList.GetNextObject(InitContext initContext)
+		{
+			if (_firstElement)
+				_firstElement = false;
+			else
+				_sb.Append(',');
+
+			return this;
+		}
+
+		void IMapDataDestinationList.EndMapping(InitContext initContext)
+		{
+			_sb.Append(']');
+		}
+
+		#endregion
+
+		public override string ToString()
+		{
+			return _sb.ToString();
+		}
+	}
+
+	[TestFixture]
+	public class MapToJson
+	{
+		public class Inner
+		{
+			public string Name = "inner \"object \n name";
+		}
+
+		public class Inner2
+		{
+			public string Name;
+			public int    Value;
+		}
+
+		public class SourceObject
+		{
+			public string   Foo = "Foo";
+			public double   Bar  = 1.23;
+			public DateTime Baz  = DateTime.Today;
+			[MapIgnore(false)]
+			public Inner    Inner = new Inner();
+			[MapIgnore(false)]
+			public Inner2   Inner2 = new Inner2();
+			public string[] StrArray = {"One", "Two", "Three"};
+		}
+
+		[Test]
+		public void Test()
+		{
+			JsonMapper jm = new JsonMapper(new StringBuilder(256));
+
+			Map./*[a]*/MapSourceToDestination/*[/a]*/(Map.GetObjectMapper(typeof(SourceObject)), new SourceObject(), jm, jm);
+			Console.Write(jm.ToString());
+
+			// Expected output:
+			//
+			// {
+			// "Foo":"Foo",
+			// "Bar":1.23,
+			// "Baz":new Date(11823840000000000),
+			// "Inner":{ "Name":"inner \"object \r name"},
+			// "Inner2":
+			//  {
+			//  "Name":null,
+			//  "Value":0
+			//  },
+			//  "StrArray":["One","Two","Three"]
+			// }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Mapping/MapValueAttribute1.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,75 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Mapping;
+
+namespace HowTo.Mapping
+{
+	[TestFixture]
+	public class MapValue1
+	{
+		public class SourceObject
+		{
+			public string Value = "Y";
+		}
+
+		public class TestObject1
+		{
+			// The attribute is applied to a field/property.
+			//
+			[/*[a]*/MapValue(true,  "Y")/*[/a]*/]
+			[/*[a]*/MapValue(false, "N")/*[/a]*/]
+			public bool Value;
+		}
+
+		[Test]
+		public void Test1()
+		{
+			SourceObject so = new SourceObject();
+			TestObject1  to = Map.ObjectToObject<TestObject1>(so);
+
+			Assert.AreEqual(true, to.Value);
+		}
+
+		// The attribute is applied to a class.
+		//
+		[/*[a]*/MapValue(true,  "Y")/*[/a]*/]
+		[/*[a]*/MapValue(false, "N")/*[/a]*/]
+		public class TestObject2
+		{
+			public bool Value;
+		}
+
+		[Test]
+		public void Test2()
+		{
+			SourceObject so = new SourceObject();
+			TestObject2  to = Map.ObjectToObject<TestObject2>(so);
+
+			Assert.AreEqual(true, to.Value);
+		}
+
+		// The attribute is applied to a base class and affects all child classes.
+		//
+		[/*[a]*/MapValue(typeof(bool), true,  "Y")/*[/a]*/]
+		[/*[a]*/MapValue(typeof(bool), false, "N")/*[/a]*/]
+		public class ObjectBase
+		{
+		}
+
+		public class TestObject3 : /*[a]*/ObjectBase/*[/a]*/
+		{
+			public bool Value;
+		}
+
+		[Test]
+		public void Test3()
+		{
+			SourceObject so = new SourceObject();
+			TestObject3  to = Map.ObjectToObject<TestObject3>(so);
+
+			Assert.AreEqual(true, to.Value);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Mapping/MapValueAttribute2.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,48 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Mapping;
+
+namespace HowTo.Mapping
+{
+	[TestFixture]
+	public class MapValue2
+	{
+		public enum Gender1
+		{
+			[/*[a]*/MapValue("F")/*[/a]*/] Female,
+			[/*[a]*/MapValue("M")/*[/a]*/] Male,
+			[/*[a]*/MapValue("U")/*[/a]*/] Unknown,
+			[/*[a]*/MapValue("O")/*[/a]*/] Other
+		}
+
+		[Test]
+		public void Test1()
+		{
+			object value = Map.EnumToValue(Gender1.Male);
+
+			Assert.AreEqual("M", value);
+		}
+
+		[/*[a]*/MapValue(Gender2.Female,  1)/*[/a]*/]
+		[/*[a]*/MapValue(Gender2.Male,    2)/*[/a]*/]
+		[/*[a]*/MapValue(Gender2.Unknown, 3)/*[/a]*/]
+		[/*[a]*/MapValue(Gender2.Other,   4)/*[/a]*/]
+		public enum Gender2
+		{
+			Female,
+			Male,
+			Unknown,
+			Other
+		}
+
+		[Test]
+		public void Test2()
+		{
+			Gender2 g = Map.ToEnum<Gender2>(2);
+
+			Assert.AreEqual(Gender2.Male, g);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Mapping/ObjectToObject.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,41 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Mapping;
+
+namespace HowTo.Mapping
+{
+	[TestFixture]
+	public class ObjectToObject
+	{
+		public class SourceObject
+		{
+			public bool   Value1   = true;
+			public string Value2   = "10";
+			public string StrValue = "test";
+		}
+
+		public class DestObject
+		{
+			[MapField("Value1")] public bool   BoolValue;
+			[MapField("Value2")] public int    IntValue;
+
+			// If the source and destination field/property names are equal,
+			// there is no need for using the MapField attribute.
+			//
+			                     public string StrValue; 
+		}
+
+		[Test]
+		public void Test1()
+		{
+			SourceObject source = new SourceObject();
+			DestObject   dest   = Map./*[a]*/ObjectToObject/*[/a]*/<DestObject>(source);
+
+			Assert.AreEqual(true,   dest.BoolValue);
+			Assert.AreEqual(10,     dest.IntValue);
+			Assert.AreEqual("test", dest.StrValue);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Mapping/ValueToEnum.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,60 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Mapping;
+
+namespace HowTo.Mapping
+{
+	[TestFixture]
+	public class ValueToEnum
+	{
+		public enum Gender1
+		{
+			[MapValue("F")] Female,
+			[MapValue("M")] Male,
+			[MapValue("U")] Unknown,
+			[MapValue("O")] Other
+		}
+
+		[Test]
+		public void Test1()
+		{
+			Gender1 g = Map./*[a]*/ToEnum<Gender1>/*[/a]*/("M");
+
+			Assert.AreEqual(Gender1.Male, g);
+		}
+
+		public enum Gender2
+		{
+			[MapValue(1)] Female,
+			[MapValue(2)] Male,
+			[MapValue(3)] Unknown,
+			[MapValue(4)] Other
+		}
+
+		[Test]
+		public void Test2()
+		{
+			Gender2 g = Map./*[a]*/ToEnum<Gender2>/*[/a]*/(2);
+
+			Assert.AreEqual(Gender2.Male, g);
+		}
+
+		public enum Gender3
+		{
+			Female  = 1,
+			Male    = 2,
+			Unknown = 3,
+			Other   = 4
+		}
+
+		[Test]
+		public void Test3()
+		{
+			Gender3 g = Map./*[a]*/ToEnum<Gender3>/*[/a]*/(2);
+
+			Assert.AreEqual(Gender3.Male, g);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Patterns/DuckTyping.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,78 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Patterns;
+
+namespace HowTo.Patterns
+{
+	//[TestFixture]
+	public class DuckTyping
+	{
+		// By default, all interface methods are optional.
+		// 
+		public interface OptionalInterface
+		{
+			// If the source object does not implement the [b]Method1[/b], a NotImplementedException is thrown at [i]run time[/i].
+			//
+			void Method1();
+
+			// If the source object does not implement the [b]Method2[/b], a TypeBuilderException is thrown at [i]build time[/i].
+			//
+			/*[a]*/[MustImplement]/*[/a]*/
+			void Method2();
+
+			// If the source object does not implement the [b]Method3[/b], an empty stub is genegated.
+			// The return value and all output parameters will be set to default values.
+			//
+			/*[a]*/[MustImplement(false, false)]/*[/a]*/
+			int Method3();
+		}
+
+		// The MustImplement attribute also can control the entire interface.
+		//
+		/*[a]*/[MustImplement]/*[/a]*/
+		public interface RequiredInterface
+		{
+			// If the source object does not implement the [b]Method1[/b], a TypeBuilderException is thrown at [i]build time[/i].
+			//
+			void Method1();
+
+			// If the source object does not implement the [b]Method2[/b], a NotImplementedException is thrown at [i]run time[/i].
+			//
+			/*[a]*/[MustImplement(false)]/*[/a]*/
+			void Method2();
+
+			// If the source object does not implement the [b]Method3[/b], an empty stub is genegated.
+			// The return value and all output parameters will be set to default values.
+			//
+			/*[a]*/[MustImplement(false, false)]/*[/a]*/
+			int Method3();
+		}
+
+		public class TestClass
+		{
+			public int Method3()
+			{
+				return 3;
+			}
+		}
+
+		// Two or more interfaces can be mixed together.
+		//
+		public interface InterfaceMix : RequiredInterface, OptionalInterface
+		{
+		}
+
+		//[Test]
+		public void Test()
+		{
+			InterfaceMix      duck = /*[a]*/BLToolkit.Patterns.DuckTyping.Implement/*[/a]*/<InterfaceMix>(new TestClass());
+			RequiredInterface duck1 = duck;
+			OptionalInterface duck2 = duck;
+
+			duck1.Method1();
+			duck2.Method1();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,31 @@
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HowTo")]
+[assembly: AssemblyProduct("Business Logic Toolkit")]
+[assembly: AssemblyCopyright("\xA9 2002-2012 www.bltoolkit.net")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("fa9081a1-c63c-4b8e-b554-209dad7d8d37")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion    ("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/Reflection/ObjectFactory.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,90 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+
+namespace HowTo.Reflection
+{
+	[TestFixture]
+	public class ObjectFactoryTest
+	{
+		/*[a]*/[ObjectFactory(typeof(Person.ObjectFactory))]/*[/a]*/
+		public class Person
+		{
+			[MapField("PersonID")]
+			public int    ID;
+
+			public string LastName;
+			public string FirstName;
+			public string MiddleName;
+
+			/*[a]*/class ObjectFactory : IObjectFactory/*[/a]*/
+			{
+				public object /*[a]*/CreateInstance(TypeAccessor typeAccessor, InitContext context)/*[/a]*/
+				{
+					// Get the object type indicator field.
+					//
+					object objectType = context.DataSource.GetValue(context.SourceObject, "PersonType");
+
+					// Target ObjectMapper must be changed in order to provide correct mapping.
+					//
+					switch ((string)objectType)
+					{
+						case "D": /*[a]*/context.ObjectMapper = ObjectMapper<Doctor>. Instance;/*[/a]*/ break;
+						case "P": /*[a]*/context.ObjectMapper = ObjectMapper<Patient>.Instance;/*[/a]*/ break;
+					}
+
+					// Create an object instance.
+					// Do not call ObjectMapper.CreateInstance as it will lead to infinite recursion.
+					//
+					return context.ObjectMapper./*[a]*/TypeAccessor/*[/a]*/.CreateInstance(context);
+				}
+			}
+		}
+
+		public class /*[a]*/Doctor : Person/*[/a]*/
+		{
+			public string Taxonomy;
+		}
+
+		public class /*[a]*/Patient : Person/*[/a]*/
+		{
+			public string Diagnosis;
+		}
+
+		[Test]
+		public void Test()
+		{
+			using (DbManager db = new DbManager())
+			{
+				List<Person> list = db
+					.SetCommand(@"
+						SELECT
+							ps.*,
+							d.Taxonomy,
+							p.Diagnosis,
+							CASE
+								WHEN d.PersonID IS NOT NULL THEN 'D'
+								WHEN p.PersonID IS NOT NULL THEN 'P'
+							END as PersonType
+						FROM
+							Person ps
+								LEFT JOIN Doctor  d ON d.PersonID = ps.PersonID
+								LEFT JOIN Patient p ON p.PersonID = ps.PersonID
+						ORDER BY
+							ps.PersonID")
+					.ExecuteList<Person>();
+
+				Assert.AreEqual(list[0].GetType(), /*[a]*/typeof(Doctor)/*[/a]*/);
+				Assert.AreEqual(list[1].GetType(), /*[a]*/typeof(Patient)/*[/a]*/);
+
+				if (list.Count > 2)
+					Assert.AreEqual(list[2].GetType(), typeof(Person));
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/TypeBuilder/InitialValues.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,45 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+
+namespace HowTo.TypeBuilder
+{
+	[TestFixture]
+	public class InitialValueTest
+	{
+		[AttributeUsage(AttributeTargets.Property)]
+		public class NewGuidParameterAttribute : /*[a]*/ParameterAttribute/*[/a]*/
+		{
+			public NewGuidParameterAttribute() : base(/*[a]*/Guid.NewGuid().ToByteArray()/*[/a]*/)
+			{
+			}
+		}
+
+		public abstract class TestObject1
+		{
+			/*[a]*/[Parameter("t")]/*[/a]*/   public abstract string   Str         { get; set; }
+			/*[a]*/[Parameter(20)]/*[/a]*/    public abstract string   this[int i] { get; set; }
+			/*[a]*/[Parameter(54)]/*[/a]*/    public abstract int      Int         { get; set; }
+			/*[a]*/[Parameter(2,2,2)]/*[/a]*/ public abstract DateTime Date        { get; set; }
+			/*[a]*/[Parameter(222L)]/*[/a]*/  public abstract Decimal  Decimal1    { get; set; }
+			/*[a]*/[Parameter(-2.05)]/*[/a]*/ public abstract Decimal  Decimal2    { get; set; }
+			/*[a]*/[NewGuidParameter]/*[/a]*/ public abstract Guid     Guid        { get; set; }
+		}
+
+		[Test]
+		public void Test()
+		{
+			TestObject1 o = (TestObject1)TypeAccessor.CreateInstance(typeof(TestObject1));
+
+			Assert.That(o.Str,      Is.EqualTo("t"));
+			Assert.That(o.Int,      Is.EqualTo(54));
+			Assert.That(o.Date,     Is.EqualTo(new DateTime(2,2,2)));
+			Assert.That(o.Decimal1, Is.EqualTo(222m));
+			Assert.That(o.Decimal2, Is.EqualTo(-2.05m));
+			Assert.That(o.Guid,     Is.Not.EqualTo(Guid.Empty));
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/TypeBuilder/InternalTypes.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,30 @@
+using System;
+using System.Runtime.CompilerServices;
+using NUnit.Framework;
+
+using BLToolkit.Reflection;
+
+// typeof(TargetType).FullName + "." + TypeBuilderConsts.AssemblyNameSuffix
+//
+/*[a]*/[assembly: InternalsVisibleTo("HowTo.TypeBuilder.InternalTypesTest.TestObject.TypeBuilder")]/*[/a]*/
+/*[a]*/[assembly: InternalsVisibleTo("HowTo.TypeBuilder.InternalTypesTest.TestObject.TypeAccessor")]/*[/a]*/
+
+namespace HowTo.TypeBuilder
+{
+
+	[TestFixture]
+	public class InternalTypesTest
+	{
+		/*[a]*/internal/*[/a]*/ abstract class TestObject
+		{
+			public abstract string Value { get; set; }
+		}
+
+		[Test]
+		public void Test()
+		{
+			var o = TypeAccessor.CreateInstance<TestObject>();
+			Assert.IsNotNull(o);
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/TypeBuilder/XmlSerialization.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,66 @@
+using System.IO;
+using System.Xml.Serialization;
+
+using NUnit.Framework;
+
+using BLToolkit.Reflection;
+using BLToolkit.EditableObjects;
+using BLToolkit.TypeBuilder;
+
+namespace HowTo.TypeBuilder
+{
+	[TestFixture]
+	public class XmlSerializationTest
+	{
+		/*[a]*/[XmlType(AnonymousType = true)]/*[/a]*/
+		public abstract class MyClassA
+		{
+			public abstract string ValueA { get; set; }
+		}
+
+		[XmlType(AnonymousType = true)]
+		/*[a]*/[XmlIncludeAbstract(typeof(MyClassA))]/*[/a]*/
+		/*[a]*/[XmlIncludeAbstract(typeof(MyClassC))]/*[/a]*/
+		public abstract class MyClassB
+		{
+			public abstract string   ValueB        { get; set; }
+			public abstract MyClassA ValueMyClassA { get; set; }
+	
+			public abstract EditableList<MyClassA> MyList { get; set; }
+		}
+
+		/*[a]*/[XmlType("abs:MyClassC")]/*[/a]*/
+		public abstract class MyClassC : MyClassA { }
+
+		[Test]
+		public void Test()
+		{
+			MyClassB      original = TypeAccessor<MyClassB>.CreateInstance();
+			MyClassB      serialized;
+			XmlSerializer sr       = new XmlSerializer(/*[a]*/TypeAccessor<MyClassB>.Type/*[/a]*/);
+
+			original.ValueB               = "string value B";
+			original.ValueMyClassA.ValueA = "string value A";
+			original.MyList.Add(TypeAccessor<MyClassA>.CreateInstance());
+			original.MyList.Add(TypeAccessor<MyClassC>.CreateInstance());
+			
+			using (MemoryStream stm = new MemoryStream())
+			{
+				sr.Serialize(stm, original);
+				stm.Position = 0L;
+				serialized = (MyClassB)sr.Deserialize(stm);
+			}
+
+			Assert.That(serialized.ValueB,               Is.EqualTo(original.ValueB));
+			Assert.That(serialized.ValueMyClassA.ValueA, Is.EqualTo(original.ValueMyClassA.ValueA));
+			
+			Assert.AreEqual(original.MyList.Count, serialized.MyList.Count);
+			Assert.That(serialized.MyList[0] is MyClassA);
+			Assert.That(serialized.MyList[1] is MyClassA);
+			Assert.That(serialized.MyList[1] is MyClassC);
+			
+			Assert.AreEqual(serialized.MyList[0].GetType(), TypeFactory.GetType(typeof(MyClassA)));
+			Assert.AreEqual(serialized.MyList[1].GetType(), TypeFactory.GetType(typeof(MyClassC)));
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/app.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<configuration>
+	<connectionStrings>
+		<add name="DemoConnection" connectionString="Server=.;Database=BLToolkitData;Integrated Security=SSPI"/>
+	</connectionStrings>
+	<appSettings>
+		<!-- Default configuration -->
+		<add key="ConnectionString" value="Server=.;Database=BLToolkitData;Integrated Security=SSPI"/>
+		<!-- SQL Server Development configuration -->
+		<add key="ConnectionString.Development" value="Server=.;Database=BLToolkitData;Integrated Security=SSPI"/>
+		<!-- SQL Server Production configuration -->
+		<add key="ConnectionString.Production" value="Server=.;Database=BLToolkitData;Integrated Security=SSPI"/>
+		<!-- SQL Server configuration -->
+		<add key="ConnectionString.Sql" value="Server=.;Database=BLToolkitData;Integrated Security=SSPI"/>
+		<!-- Oracle configuration -->
+		<add key="ConnectionString.Oracle" value="User Id=/;Data Source=BLToolkitData"/>
+		<!-- OLEDB configuration -->
+		<add key="ConnectionString.OleDb" value="Provider=SQLOLEDB;Data Source=.;Integrated Security=SSPI;Initial Catalog=BLToolkitData"/>
+		<!-- OLEDB Development configuration -->
+		<add key="ConnectionString.OleDb.Development" value="Provider=SQLOLEDB;Data Source=.;Integrated Security=SSPI;Initial Catalog=BLToolkitData"/>
+		<!-- OLEDB Production configuration -->
+		<add key="ConnectionString.OleDb.Production" value="Provider=SQLOLEDB;Data Source=.;Integrated Security=SSPI;Initial Catalog=BLToolkitData"/>
+
+		<!-- Samples
+		<add
+			key   = "BLToolkit.DataProviders"
+			value = "BLToolkit.Data.DataProvider.OracleDataProvider;SomeNamespace.SomeType, SomeAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1234567890ABCDEF"/>
+		<add
+			key   = "BLToolkit.DefaultConfiguration"
+			value = "Oracle"/>
+		-->
+	</appSettings>
+	<startup>
+		<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
+	</startup>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HowTo/packages.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="NUnit" version="2.6.3" targetFramework="net40" />
+</packages>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Mono/Mono.sln	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,89 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test", "Test\Test.csproj", "{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.mono", "..\Source\BLToolkit.mono.csproj", "{0C325F5D-E50E-4340-8724-D29896CCC583}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug FW 3.5|Any CPU = Debug FW 3.5|Any CPU
+		Debug FW 3.5|Mixed Platforms = Debug FW 3.5|Mixed Platforms
+		Debug FW 3.5|x86 = Debug FW 3.5|x86
+		Debug|Any CPU = Debug|Any CPU
+		Debug|Mixed Platforms = Debug|Mixed Platforms
+		Debug|x86 = Debug|x86
+		DebugMono|Any CPU = DebugMono|Any CPU
+		DebugMono|Mixed Platforms = DebugMono|Mixed Platforms
+		DebugMono|x86 = DebugMono|x86
+		Release|Any CPU = Release|Any CPU
+		Release|Mixed Platforms = Release|Mixed Platforms
+		Release|x86 = Release|x86
+		ReleaseMono|Any CPU = ReleaseMono|Any CPU
+		ReleaseMono|Mixed Platforms = ReleaseMono|Mixed Platforms
+		ReleaseMono|x86 = ReleaseMono|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug FW 3.5|Any CPU.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug FW 3.5|Any CPU.Build.0 = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug FW 3.5|Mixed Platforms.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug FW 3.5|Mixed Platforms.Build.0 = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug FW 3.5|x86.ActiveCfg = Debug FW 3.5|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|x86.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.ReleaseMono|Any CPU.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.ReleaseMono|Any CPU.Build.0 = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.ReleaseMono|Mixed Platforms.ActiveCfg = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.ReleaseMono|Mixed Platforms.Build.0 = ReleaseMono|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.Debug FW 3.5|Any CPU.ActiveCfg = Debug|x86
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.Debug FW 3.5|Any CPU.Build.0 = Debug|x86
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.Debug FW 3.5|Mixed Platforms.ActiveCfg = Debug|x86
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.Debug FW 3.5|Mixed Platforms.Build.0 = Debug|x86
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.Debug FW 3.5|x86.ActiveCfg = Debug|x86
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.Debug FW 3.5|x86.Build.0 = Debug|x86
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.Debug|x86.ActiveCfg = Debug|x86
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.Debug|x86.Build.0 = Debug|x86
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.DebugMono|Any CPU.ActiveCfg = DebugMono|Any CPU
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.DebugMono|Any CPU.Build.0 = DebugMono|Any CPU
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.DebugMono|Mixed Platforms.ActiveCfg = DebugMono|Any CPU
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.DebugMono|Mixed Platforms.Build.0 = DebugMono|Any CPU
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.DebugMono|x86.ActiveCfg = DebugMono|x86
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.DebugMono|x86.Build.0 = DebugMono|x86
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.Release|x86.ActiveCfg = Release|x86
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.Release|x86.Build.0 = Release|x86
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.ReleaseMono|Any CPU.ActiveCfg = Debug|x86
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.ReleaseMono|Any CPU.Build.0 = Debug|x86
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.ReleaseMono|Mixed Platforms.ActiveCfg = Debug|x86
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.ReleaseMono|Mixed Platforms.Build.0 = Debug|x86
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.ReleaseMono|x86.ActiveCfg = Debug|x86
+		{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}.ReleaseMono|x86.Build.0 = Debug|x86
+	EndGlobalSection
+	GlobalSection(MonoDevelopProperties) = preSolution
+		StartupItem = Test\Test.csproj
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
Binary file Mono/Mono.sln.docstates has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Mono/Test/App.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<configuration>
+<!--	
+	<configSections>
+		<section name="bltoolkit" type="BLToolkit.Configuration.BLToolkitSection, BLToolkit.4"/>
+	</configSections>
+	<bltoolkit>
+		<dataProviders>
+			<add type="BLToolkit.Data.DataProvider.MySqlDataProvider, BLToolkit.Data.DataProvider.MySql.4"/>
+		</dataProviders>
+	</bltoolkit>
+-->
+	<connectionStrings>
+		<add name="MySql" connectionString="Server=DBHost;Port=3306;Database=bltoolkitdata;Uid=bltoolkit;Pwd=TestPassword;" providerName="MySql.Data.MySqlClient"/>
+	</connectionStrings>
+	<startup>
+		<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
+	</startup>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Mono/Test/Program.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,177 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using Data.Linq;
+
+namespace Test
+{
+	class Program
+	{
+		static void Main()
+		{
+			BLToolkit.Data.DbManager.AddDataProvider(typeof(BLToolkit.Data.DataProvider.MySqlDataProvider));
+			
+			using (var db = new TestDbManager("MySql"))
+			{
+				var list = new GenericConcatQuery(db, new object[] { "A", 1 }).Query().ToList();
+				
+				foreach (var i in list)
+					Console.WriteLine(i.ToString());
+			}
+		}
+	}
+	
+	public abstract class GenericQueryBase
+	{
+		private readonly IdlPatientSource m_ds;
+
+		protected GenericQueryBase(ITestDataContext ds)
+		{
+			m_ds = new IdlPatientSource(ds);
+		}
+
+		#region Object sources
+
+		protected IQueryable<IdlPerson> AllPersons
+		{
+			get { return m_ds.Persons(); }
+		}
+
+		protected IQueryable<IdlPatient> AllPatients
+		{
+			get { return m_ds.Patients(); }
+		}
+
+		protected IQueryable<IdlGrandChild> AllGrandChilds
+		{
+			get { return m_ds.GrandChilds(); }
+		}
+
+		#endregion
+
+		public abstract IEnumerable<object> Query();
+	}
+
+	public class GenericConcatQuery : GenericQueryBase
+	{
+		private System.String @p1;
+		private System.Int32 @p2;
+
+		public GenericConcatQuery(ITestDataContext ds, object[] args)
+			: base(ds)
+		{
+			@p1 = (System.String)args[0];
+			@p2 = (System.Int32)args[1];
+		}
+
+		public override IEnumerable<object> Query()
+		{
+			return (from y in AllPersons
+					select y.Name)
+						.Concat(
+							from x in AllPersons
+							from z in AllPatients
+							where (x.Name == @p1 || z.Id == new ObjectId { Value = @p2 })
+							select x.Name
+						);
+		}
+	}
+	
+	public struct ObjectId
+	{
+		public ObjectId(int value)
+		{
+			m_value = value;
+		}
+
+		private int m_value;
+
+		public int Value
+		{
+			get { return m_value; }
+			set { m_value = value; }
+		}
+
+		public static implicit operator int(ObjectId val)
+		{
+			return val.m_value;
+		}
+	}
+
+	public struct NullableObjectId
+	{
+		public NullableObjectId(int? value)
+		{
+			m_value = value;
+		}
+
+		private int? m_value;
+
+		public int? Value
+		{
+			get { return m_value; }
+			set { m_value = value; }
+		}
+
+		public static implicit operator int?(NullableObjectId val)
+		{
+			return val.m_value;
+		}
+	}
+
+	public class IdlPatient
+	{
+		public ObjectId Id { get; set; }
+	}
+
+	public class IdlPerson
+	{
+		public ObjectId Id { get; set; }
+		public string Name { get; set; }
+	}
+
+	public class IdlGrandChild
+	{
+		public ObjectId ParentID { get; set; }
+		public ObjectId ChildID { get; set; }
+		public ObjectId GrandChildID { get; set; }
+	}
+
+	public class IdlPatientEx : IdlPatient
+	{
+		public IdlPerson Person { get; set; }
+	}
+
+	public class IdlPatientSource
+	{
+		private readonly ITestDataContext m_dc;
+
+		public IdlPatientSource(ITestDataContext dc)
+		{
+			m_dc = dc;
+		}
+
+		public IQueryable<IdlGrandChild> GrandChilds()
+		{
+				return m_dc.GrandChild.Select(x => new IdlGrandChild
+					{
+						ChildID = new ObjectId {Value = x.ChildID.Value},
+						GrandChildID = new ObjectId { Value = x.GrandChildID.Value },
+						ParentID = new ObjectId { Value = x.ParentID.Value }
+					});
+		}
+
+		public IQueryable<IdlPatient> Patients()
+		{
+			return m_dc.Patient.Select(x => new IdlPatient { Id = new ObjectId { Value = x.PersonID }, });
+		}
+
+		public IQueryable<IdlPerson> Persons()
+		{
+			return
+				m_dc.Person.Select(
+					x => new IdlPerson { Id = new ObjectId { Value = x.ID }, Name = x.FirstName, });
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Mono/Test/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Test")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("Test")]
+[assembly: AssemblyCopyright("Copyright © Microsoft 2011")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("2881eed8-06e3-420a-abdd-f478f9e7bba8")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Mono/Test/Test.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{6FC8A4D7-CB01-40B7-AB10-6241C7B7BDE5}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Test</RootNamespace>
+    <AssemblyName>Test</AssemblyName>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <PlatformTarget>x86</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\Test.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <WarningLevel>4</WarningLevel>
+    <Optimize>false</Optimize>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\Test.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;MONO</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\Test.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <WarningLevel>4</WarningLevel>
+    <Optimize>false</Optimize>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'DebugMono|x86' ">
+    <DebugType>none</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\DebugMono</OutputPath>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+    <Reference Include="MySql.Data">
+      <HintPath>..\..\packages\MySql.Data.6.4.4\lib\net40\mysql.data.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Data.Linq" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\UnitTests\Linq\ITestDataContext.cs">
+      <Link>ITestDataContext.cs</Link>
+    </Compile>
+    <Compile Include="..\..\UnitTests\Linq\Model\Doctor.cs">
+      <Link>Doctor.cs</Link>
+    </Compile>
+    <Compile Include="..\..\UnitTests\Linq\Model\Gender.cs">
+      <Link>Gender.cs</Link>
+    </Compile>
+    <Compile Include="..\..\UnitTests\Linq\Model\LinqDataTypes.cs">
+      <Link>LinqDataTypes.cs</Link>
+    </Compile>
+    <Compile Include="..\..\UnitTests\Linq\Model\ParentChild.cs">
+      <Link>ParentChild.cs</Link>
+    </Compile>
+    <Compile Include="..\..\UnitTests\Linq\Model\Patient.cs">
+      <Link>Patient.cs</Link>
+    </Compile>
+    <Compile Include="..\..\UnitTests\Linq\Model\Person.cs">
+      <Link>Person.cs</Link>
+    </Compile>
+    <Compile Include="..\..\UnitTests\Linq\Model\TypeValue.cs">
+      <Link>TypeValue.cs</Link>
+    </Compile>
+    <Compile Include="..\..\UnitTests\Linq\TestDbManager.cs">
+      <Link>TestDbManager.cs</Link>
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config">
+      <SubType>Designer</SubType>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.mono.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.mono</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NuGet/BLToolkit.DB2.nuspec	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
+	<metadata>
+		<id>BLToolkit.DB2</id>
+		<version>4.1.21</version>
+		<title>BLToolkit DB2 Data Provider</title>
+		<authors>Igor Tkachev</authors>
+		<owners />
+		<licenseUrl>http://bltoolkit.net/License.ashx</licenseUrl>
+		<projectUrl>http://bltoolkit.net/</projectUrl>
+		<requireLicenseAcceptance>false</requireLicenseAcceptance>
+		<description>Business Logic Toolkit DB2 Data Provider for .NET</description>
+		<summary />
+		<tags>DB2 bltoolkit Linq ORM DAL database DB</tags>
+		<dependencies>
+			<dependency id="BLToolkit" />
+		</dependencies>
+	</metadata>
+	<files>
+		<file src="..\DataProviders\DB2\bin\Release\BLToolkit.Data.DataProvider.DB2.3.dll" target="lib\net35" />
+		<file src="..\DataProviders\DB2\bin\Release\BLToolkit.Data.DataProvider.DB2.4.dll" target="lib\net40" />
+	</files>
+</package>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NuGet/BLToolkit.DevartOraclePro.nuspec	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
+	<metadata>
+		<id>BLToolkit.Oracle</id>
+		<version>4.1.21</version>
+		<title>BLToolkit dotConnect for Oracle Pro Data Provider</title>
+		<authors>Igor Tkachev</authors>
+		<owners />
+		<licenseUrl>http://bltoolkit.net/License.ashx</licenseUrl>
+		<projectUrl>http://bltoolkit.net/</projectUrl>
+		<requireLicenseAcceptance>false</requireLicenseAcceptance>
+		<description>Business Logic Toolkit dotConnect for Oracle Pro Data Provider for .NET</description>
+		<summary />
+		<tags>Devart dotConnect Oracle bltoolkit Linq ORM DAL database DB</tags>
+		<dependencies>
+			<dependency id="BLToolkit" />
+		</dependencies>
+	</metadata>
+	<files>
+		<file src="..\DataProviders\DevartOraclePro\bin\Release\BLToolkit.Data.DataProvider.DevartOraclePro.3.dll" target="lib\net35" />
+		<file src="..\DataProviders\DevartOraclePro\bin\Release\BLToolkit.Data.DataProvider.DevartOraclePro.4.dll" target="lib\net40" />
+	</files>
+</package>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NuGet/BLToolkit.Firebird.nuspec	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
+	<metadata>
+		<id>BLToolkit.Firebird</id>
+		<version>4.1.21</version>
+		<title>BLToolkit Firebird Data Provider</title>
+		<authors>Igor Tkachev</authors>
+		<owners />
+		<licenseUrl>http://bltoolkit.net/License.ashx</licenseUrl>
+		<projectUrl>http://bltoolkit.net/</projectUrl>
+		<requireLicenseAcceptance>false</requireLicenseAcceptance>
+		<description>Business Logic Toolkit Firebird Data Provider for .NET</description>
+		<summary />
+		<tags>Firebird bltoolkit Linq ORM DAL database DB</tags>
+		<dependencies>
+			<dependency id="FirebirdSql.Data.FirebirdClient" />
+			<dependency id="BLToolkit"                       />
+		</dependencies>
+	</metadata>
+	<files>
+		<file src="..\DataProviders\Firebird\bin\Release\BLToolkit.Data.DataProvider.Firebird.3.dll" target="lib\net35" />
+		<file src="..\DataProviders\Firebird\bin\Release\BLToolkit.Data.DataProvider.Firebird.4.dll" target="lib\net40" />
+	</files>
+</package>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NuGet/BLToolkit.Informix.nuspec	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
+	<metadata>
+		<id>BLToolkit.Informix</id>
+		<version>4.1.21</version>
+		<title>BLToolkit Informix Data Provider</title>
+		<authors>Igor Tkachev</authors>
+		<owners />
+		<licenseUrl>http://bltoolkit.net/License.ashx</licenseUrl>
+		<projectUrl>http://bltoolkit.net/</projectUrl>
+		<requireLicenseAcceptance>false</requireLicenseAcceptance>
+		<description>Business Logic Toolkit Informix Data Provider for .NET</description>
+		<summary />
+		<tags>Informix bltoolkit Linq ORM DAL database DB</tags>
+		<dependencies>
+			<dependency id="BLToolkit" />
+		</dependencies>
+	</metadata>
+	<files>
+		<file src="..\DataProviders\Informix\bin\Release\BLToolkit.Data.DataProvider.Informix.3.dll" target="lib\net35" />
+		<file src="..\DataProviders\Informix\bin\Release\BLToolkit.Data.DataProvider.Informix.4.dll" target="lib\net40" />
+	</files>
+</package>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NuGet/BLToolkit.MySql.nuspec	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
+	<metadata>
+		<id>BLToolkit.MySql</id>
+		<version>4.1.21</version>
+		<title>BLToolkit MySql Data Provider</title>
+		<authors>Igor Tkachev</authors>
+		<owners />
+		<licenseUrl>http://bltoolkit.net/License.ashx</licenseUrl>
+		<projectUrl>http://bltoolkit.net/</projectUrl>
+		<requireLicenseAcceptance>false</requireLicenseAcceptance>
+		<description>Business Logic Toolkit MySql Data Provider for .NET</description>
+		<summary />
+		<tags>MySql bltoolkit Linq ORM DAL database DB</tags>
+		<dependencies>
+			<dependency id="MySql.Data" />
+			<dependency id="BLToolkit"  />
+		</dependencies>
+	</metadata>
+	<files>
+		<file src="..\DataProviders\MySql\bin\Release\BLToolkit.Data.DataProvider.MySql.3.dll" target="lib\net35" />
+		<file src="..\DataProviders\MySql\bin\Release\BLToolkit.Data.DataProvider.MySql.4.dll" target="lib\net40" />
+	</files>
+</package>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NuGet/BLToolkit.Oracle.nuspec	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
+	<metadata>
+		<id>BLToolkit.Oracle</id>
+		<version>4.1.21</version>
+		<title>BLToolkit Oracle Data Provider</title>
+		<authors>Igor Tkachev</authors>
+		<owners />
+		<licenseUrl>http://bltoolkit.net/License.ashx</licenseUrl>
+		<projectUrl>http://bltoolkit.net/</projectUrl>
+		<requireLicenseAcceptance>false</requireLicenseAcceptance>
+		<description>Business Logic Toolkit Oracle Data Provider for .NET</description>
+		<summary />
+		<tags>Oracle Odp bltoolkit Linq ORM DAL database DB</tags>
+		<dependencies>
+			<dependency id="BLToolkit" />
+		</dependencies>
+	</metadata>
+	<files>
+		<file src="..\DataProviders\Oracle\bin\Release\BLToolkit.Data.DataProvider.Oracle.3.dll" target="lib\net35" />
+		<file src="..\DataProviders\Oracle\bin\Release\BLToolkit.Data.DataProvider.Oracle.4.dll" target="lib\net40" />
+	</files>
+</package>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NuGet/BLToolkit.PostgreSql.nuspec	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
+	<metadata>
+		<id>BLToolkit.PostgreSql</id>
+		<version>4.1.21</version>
+		<title>BLToolkit PostgreSql Data Provider</title>
+		<authors>Igor Tkachev</authors>
+		<owners />
+		<licenseUrl>http://bltoolkit.net/License.ashx</licenseUrl>
+		<projectUrl>http://bltoolkit.net/</projectUrl>
+		<requireLicenseAcceptance>false</requireLicenseAcceptance>
+		<description>Business Logic Toolkit PostgreSql Data Provider for .NET</description>
+		<summary />
+		<tags>PostgreSql Npgsql bltoolkit Linq ORM DAL database DB</tags>
+		<dependencies>
+			<dependency id="Npgsql"    />
+			<dependency id="BLToolkit" />
+		</dependencies>
+	</metadata>
+	<files>
+		<file src="..\DataProviders\PostgreSQL\bin\Release\BLToolkit.Data.DataProvider.PostgreSQL.3.dll" target="lib\net35" />
+		<file src="..\DataProviders\PostgreSQL\bin\Release\BLToolkit.Data.DataProvider.PostgreSQL.4.dll" target="lib\net40" />
+	</files>
+</package>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NuGet/BLToolkit.SQLite.nuspec	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
+	<metadata>
+		<id>BLToolkit.SQLite</id>
+		<version>4.1.21</version>
+		<title>BLToolkit SQLite Data Provider</title>
+		<authors>Igor Tkachev</authors>
+		<owners />
+		<licenseUrl>http://bltoolkit.net/License.ashx</licenseUrl>
+		<projectUrl>http://bltoolkit.net/</projectUrl>
+		<requireLicenseAcceptance>false</requireLicenseAcceptance>
+		<description>Business Logic Toolkit SQLite Data Provider for .NET</description>
+		<summary />
+		<tags>SQLite bltoolkit Linq ORM DAL database DB</tags>
+		<dependencies>
+			<dependency id="System.Data.SQLite" />
+			<dependency id="BLToolkit"  />
+		</dependencies>
+	</metadata>
+	<files>
+		<file src="..\DataProviders\SQLite\bin\Release\BLToolkit.Data.DataProvider.SQLite.3.dll" target="lib\net35" />
+		<file src="..\DataProviders\SQLite\bin\Release\BLToolkit.Data.DataProvider.SQLite.4.dll" target="lib\net40" />
+	</files>
+</package>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NuGet/BLToolkit.SqlCe.nuspec	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
+	<metadata>
+		<id>BLToolkit.SqlCe</id>
+		<version>4.1.21</version>
+		<title>BLToolkit SqlCe Data Provider</title>
+		<authors>Igor Tkachev</authors>
+		<owners />
+		<licenseUrl>http://bltoolkit.net/License.ashx</licenseUrl>
+		<projectUrl>http://bltoolkit.net/</projectUrl>
+		<requireLicenseAcceptance>false</requireLicenseAcceptance>
+		<description>Business Logic Toolkit SqlCe Data Provider for .NET</description>
+		<summary />
+		<tags>SqlCe bltoolkit Linq ORM DAL database DB</tags>
+		<dependencies>
+			<dependency id="BLToolkit" />
+		</dependencies>
+	</metadata>
+	<files>
+		<file src="..\DataProviders\SqlCe\bin\Release\BLToolkit.Data.DataProvider.SqlCe.3.dll" target="lib\net35" />
+		<file src="..\DataProviders\SqlCe\bin\Release\BLToolkit.Data.DataProvider.SqlCe.4.dll" target="lib\net40" />
+	</files>
+</package>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NuGet/BLToolkit.Sybase.nuspec	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
+	<metadata>
+		<id>BLToolkit.Sybase</id>
+		<version>4.1.21</version>
+		<title>BLToolkit Sybase Data Provider</title>
+		<authors>Igor Tkachev</authors>
+		<owners />
+		<licenseUrl>http://bltoolkit.net/License.ashx</licenseUrl>
+		<projectUrl>http://bltoolkit.net/</projectUrl>
+		<requireLicenseAcceptance>false</requireLicenseAcceptance>
+		<description>Business Logic Toolkit Sybase Data Provider for .NET</description>
+		<summary />
+		<tags>Sybase bltoolkit Linq ORM DAL database DB</tags>
+		<dependencies>
+			<dependency id="BLToolkit" />
+		</dependencies>
+	</metadata>
+	<files>
+		<file src="..\DataProviders\Sybase\bin\Release\BLToolkit.Data.DataProvider.Sybase.3.dll" target="lib\net35" />
+		<file src="..\DataProviders\Sybase\bin\Release\BLToolkit.Data.DataProvider.Sybase.4.dll" target="lib\net40" />
+	</files>
+</package>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NuGet/BLToolkit.nuspec	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
+	<metadata>
+		<id>BLToolkit</id>
+		<version>4.1.21</version>
+		<title>Business Logic Toolkit for .NET</title>
+		<authors>Igor Tkachev</authors>
+		<owners />
+		<licenseUrl>http://bltoolkit.net/License.ashx</licenseUrl>
+		<projectUrl>http://bltoolkit.net/</projectUrl>
+		<requireLicenseAcceptance>false</requireLicenseAcceptance>
+		<description>Business Logic Toolkit is a set of components to simplify .NET application development.</description>
+		<summary />
+		<tags>bltoolkit Linq ORM DAL database DB</tags>
+	</metadata>
+	<files>
+		<file src="..\Source\bin\Release\BLToolkit.3.dll"    target="lib\net35"        />
+		<file src="..\Source\bin\Release\BLToolkit.4.dll"    target="lib\net40-full"   />
+		<file src="..\Source\bin\Release\BLToolkit.CP.4.dll" target="lib\net40-client" />
+		<file src="..\Source\bin\Release\BLToolkit.SL.4.dll" target="lib\sl40"         />
+	</files>
+</package>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NuGet/BLToolkit.symbols.nuspec	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
+	<metadata>
+		<id>BLToolkit</id>
+		<version>4.1.21</version>
+		<title>Business Logic Toolkit for .NET</title>
+		<authors>Igor Tkachev</authors>
+		<owners />
+		<licenseUrl>http://bltoolkit.net/License.ashx</licenseUrl>
+		<projectUrl>http://bltoolkit.net/</projectUrl>
+		<requireLicenseAcceptance>false</requireLicenseAcceptance>
+		<description>Business Logic Toolkit is a set of components to simplify .NET application development.</description>
+		<summary />
+		<tags>bltoolkit Linq ORM DAL database DB</tags>
+		<frameworkAssemblies>
+			<frameworkAssembly assemblyName="BLToolkit.4.dll" targetFramework=".NETFramework4.0" />
+			<frameworkAssembly assemblyName="BLToolkit.3.dll" targetFramework=".NETFramework3.5" />
+			<frameworkAssembly assemblyName="BLToolkit.SL.4"  targetFramework="Silverlight4.0"   />
+		</frameworkAssemblies>
+	</metadata>
+	<files>
+		<file src="..\Source\bin\Release\BLToolkit.3.dll"    target="lib\net35" />
+		<file src="..\Source\bin\Release\BLToolkit.3.pdb"    target="lib\net35" />
+		<file src="..\Source\bin\Release\BLToolkit.4.dll"    target="lib\net40" />
+		<file src="..\Source\bin\Release\BLToolkit.4.pdb"    target="lib\net40" />
+		<file src="..\Source\bin\Release\BLToolkit.SL.4.dll" target="lib\sl40"  />
+		<file src="..\Source\bin\Release\BLToolkit.SL.4.pdb" target="lib\sl40"  />
+		<file src="..\Source\**\*.cs"                        target="src" />
+	</files>
+</package>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NuGet/Pack.bat	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,44 @@
+cd ..\Source
+call Compile3.bat
+call Compile4.bat
+
+cd ..\DataProviders
+call Compile3.bat
+call Compile4.bat
+
+cd ..\NuGet
+
+del *.nupkg
+
+NuGet Pack BLToolkit.nuspec
+rename BLToolkit.4.*.nupkg BLToolkit.nupkg
+
+NuGet Pack BLToolkit.symbols.nuspec -Symbols
+rename BLToolkit.4.*.nupkg BLToolkit.symbol.nupkg
+
+NuGet Pack BLToolkit.DB2.nuspec
+rename BLToolkit.DB2.*.nupkg BLToolkit.DB2.nupkg
+
+NuGet Pack BLToolkit.Firebird.nuspec
+rename BLToolkit.Firebird.*.nupkg BLToolkit.Firebird.nupkg
+
+NuGet Pack BLToolkit.Informix.nuspec
+rename BLToolkit.Informix.*.nupkg BLToolkit.Informix.nupkg
+
+NuGet Pack BLToolkit.MySql.nuspec
+rename BLToolkit.MySql.*.nupkg BLToolkit.MySql.nupkg
+
+NuGet Pack BLToolkit.Oracle.nuspec
+rename BLToolkit.Oracle.*.nupkg BLToolkit.Oracle.nupkg
+
+NuGet Pack BLToolkit.PostgreSql.nuspec 
+rename BLToolkit.PostgreSql.*.nupkg BLToolkit.PostgreSql.nupkg
+
+NuGet Pack BLToolkit.SqlCe.nuspec 
+rename BLToolkit.SqlCe.*.nupkg BLToolkit.SqlCe.nupkg
+
+NuGet Pack BLToolkit.SQLite.nuspec 
+rename BLToolkit.SQLite.*.nupkg BLToolkit.SQLite.nupkg
+
+NuGet Pack BLToolkit.Sybase.nuspec 
+rename BLToolkit.Sybase.*.nupkg BLToolkit.Sybase.nupkg
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NuGet/Push.bat	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+NuGet Push BLToolkit.nupkg
+NuGet Push BLToolkit.DB2.nupkg
+NuGet Push BLToolkit.Firebird.nupkg
+NuGet Push BLToolkit.Informix.nupkg
+NuGet Push BLToolkit.MySql.nupkg
+NuGet Push BLToolkit.Oracle.nupkg
+NuGet Push BLToolkit.PostgreSql.nupkg
+NuGet Push BLToolkit.SqlCe.nupkg
+NuGet Push BLToolkit.SQLite.nupkg
+NuGet Push BLToolkit.Sybase.nupkg
+
+del *.nupkg
Binary file Redist/Castle/Castle.Core.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Redist/Castle/Castle.Core.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4927 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>Castle.Core</name>
+    </assembly>
+    <members>
+        <member name="T:Castle.Components.DictionaryAdapter.DictionaryBehaviorAttribute">
+            <summary>
+            Assignes a specific dictionary key.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryBehavior">
+            <summary>
+            Defines the contract for customizing dictionary access.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.IDictionaryBehavior.ExecutionOrder">
+            <summary>
+            Determines relative order to apply related behaviors.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.DictionaryBehaviorAttribute.ExecutionOrder">
+            <summary>
+            Determines relative order to apply related behaviors.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryPropertySetter">
+            <summary>
+            Defines the contract for updating dictionary values.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryPropertySetter.SetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object@,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Sets the stored dictionary value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="value">The stored value.</param>
+            <param name="property">The property.</param>
+            <returns>true if the property should be stored.</returns>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryBehaviorBuilder">
+            <summary>
+            Defines the contract for building <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryBehavior"/>s.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryBehaviorBuilder.BuildBehaviors">
+            <summary>
+            Builds the dictionary behaviors.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter">
+            <summary>
+            Abstract adapter for the <see cref="T:System.Collections.IDictionary"/> support
+            needed by the <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory"/>
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Add(System.Object,System.Object)">
+            <summary>
+            Adds an element with the provided key and value to the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <param name="key">The <see cref="T:System.Object"></see> to use as the key of the element to add.</param>
+            <param name="value">The <see cref="T:System.Object"></see> to use as the value of the element to add.</param>
+            <exception cref="T:System.ArgumentException">An element with the same key already exists in the <see cref="T:System.Collections.IDictionary"></see> object. </exception>
+            <exception cref="T:System.ArgumentNullException">key is null. </exception>
+            <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.IDictionary"></see> is read-only.-or- The <see cref="T:System.Collections.IDictionary"></see> has a fixed size. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Clear">
+            <summary>
+            Removes all elements from the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.IDictionary"></see> object is read-only. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Contains(System.Object)">
+            <summary>
+            Determines whether the <see cref="T:System.Collections.IDictionary"></see> object contains an element with the specified key.
+            </summary>
+            <param name="key">The key to locate in the <see cref="T:System.Collections.IDictionary"></see> object.</param>
+            <returns>
+            true if the <see cref="T:System.Collections.IDictionary"></see> contains an element with the key; otherwise, false.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">key is null. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.GetEnumerator">
+            <summary>
+            Returns an <see cref="T:System.Collections.IDictionaryEnumerator"></see> object for the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <returns>
+            An <see cref="T:System.Collections.IDictionaryEnumerator"></see> object for the <see cref="T:System.Collections.IDictionary"></see> object.
+            </returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Remove(System.Object)">
+            <summary>
+            Removes the element with the specified key from the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <param name="key">The key of the element to remove.</param>
+            <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.IDictionary"></see> object is read-only.-or- The <see cref="T:System.Collections.IDictionary"></see> has a fixed size. </exception>
+            <exception cref="T:System.ArgumentNullException">key is null. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.CopyTo(System.Array,System.Int32)">
+            <summary>
+            Copies the elements of the <see cref="T:System.Collections.ICollection"></see> to an <see cref="T:System.Array"></see>, starting at a particular <see cref="T:System.Array"></see> index.
+            </summary>
+            <param name="array">The one-dimensional <see cref="T:System.Array"></see> that is the destination of the elements copied from <see cref="T:System.Collections.ICollection"></see>. The <see cref="T:System.Array"></see> must have zero-based indexing.</param>
+            <param name="index">The zero-based index in array at which copying begins.</param>
+            <exception cref="T:System.ArgumentNullException">array is null. </exception>
+            <exception cref="T:System.ArgumentException">The type of the source <see cref="T:System.Collections.ICollection"></see> cannot be cast automatically to the type of the destination array. </exception>
+            <exception cref="T:System.ArgumentOutOfRangeException">index is less than zero. </exception>
+            <exception cref="T:System.ArgumentException">array is multidimensional.-or- index is equal to or greater than the length of array.-or- The number of elements in the source <see cref="T:System.Collections.ICollection"></see> is greater than the available space from index to the end of the destination array. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.System#Collections#IEnumerable#GetEnumerator">
+            <summary>
+            Returns an enumerator that iterates through a collection.
+            </summary>
+            <returns>
+            An <see cref="T:System.Collections.IEnumerator"></see> object that can be used to iterate through the collection.
+            </returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.IsFixedSize">
+            <summary>
+            Gets a value indicating whether the <see cref="T:System.Collections.IDictionary"></see> object has a fixed size.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref="T:System.Collections.IDictionary"></see> object has a fixed size; otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.IsReadOnly">
+            <summary>
+            Gets a value indicating whether the <see cref="T:System.Collections.IDictionary"></see> object is read-only.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref="T:System.Collections.IDictionary"></see> object is read-only; otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Keys">
+            <summary>
+            Gets an <see cref="T:System.Collections.ICollection"></see> object containing the keys of the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <value></value>
+            <returns>An <see cref="T:System.Collections.ICollection"></see> object containing the keys of the <see cref="T:System.Collections.IDictionary"></see> object.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Values">
+            <summary>
+            Gets an <see cref="T:System.Collections.ICollection"></see> object containing the values in the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <value></value>
+            <returns>An <see cref="T:System.Collections.ICollection"></see> object containing the values in the <see cref="T:System.Collections.IDictionary"></see> object.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Item(System.Object)">
+            <summary>
+            Gets or sets the <see cref="T:System.Object"/> with the specified key.
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Count">
+            <summary>
+            Gets the number of elements contained in the <see cref="T:System.Collections.ICollection"></see>.
+            </summary>
+            <value></value>
+            <returns>The number of elements contained in the <see cref="T:System.Collections.ICollection"></see>.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.IsSynchronized">
+            <summary>
+            Gets a value indicating whether access to the <see cref="T:System.Collections.ICollection"></see> is synchronized (thread safe).
+            </summary>
+            <value></value>
+            <returns>true if access to the <see cref="T:System.Collections.ICollection"></see> is synchronized (thread safe); otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.SyncRoot">
+            <summary>
+            Gets an object that can be used to synchronize access to the <see cref="T:System.Collections.ICollection"></see>.
+            </summary>
+            <value></value>
+            <returns>An object that can be used to synchronize access to the <see cref="T:System.Collections.ICollection"></see>.</returns>
+        </member>
+        <member name="F:Castle.Core.Internal.InternalsVisible.ToCastleCore">
+            <summary>
+              Constant to use when making assembly internals visible to Castle.Core 
+              <c>[assembly: InternalsVisibleTo(CoreInternalsVisible.ToCastleCore)]</c>
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Internal.InternalsVisible.ToDynamicProxyGenAssembly2">
+            <summary>
+              Constant to use when making assembly internals visible to proxy types generated by DynamicProxy. Required when proxying internal types.
+              <c>[assembly: InternalsVisibleTo(CoreInternalsVisible.ToDynamicProxyGenAssembly2)]</c>
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapterVisitor">
+            <summary>
+            Abstract implementation of <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapterVisitor"/>.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryAdapterVisitor">
+            <summary>
+            Conract for traversing a <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/>.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.ComponentAttribute">
+            <summary>
+            Identifies a property should be represented as a nested component.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryKeyBuilder">
+            <summary>
+            Defines the contract for building typed dictionary keys.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryKeyBuilder.GetKey(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Builds the specified key.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The current key.</param>
+            <param name="property">The property.</param>
+            <returns>The updated key</returns>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryPropertyGetter">
+            <summary>
+            Defines the contract for retrieving dictionary values.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryPropertyGetter.GetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object,Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Boolean)">
+            <summary>
+            Gets the effective dictionary value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="storedValue">The stored value.</param>
+            <param name="property">The property.</param>
+            <param name="ifExists">true if return only existing.</param>
+            <returns>The effective property value.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.ComponentAttribute.NoPrefix">
+            <summary>
+            Applies no prefix.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.ComponentAttribute.Prefix">
+            <summary>
+            Gets or sets the prefix.
+            </summary>
+            <value>The prefix.</value>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.DictionaryAdapterAttribute">
+            <summary>
+            Identifies the dictionary adapter types.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.FetchAttribute">
+            <summary>
+            Identifies an interface or property to be pre-feteched.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.FetchAttribute.#ctor">
+            <summary>
+            Instructs fetching to occur.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.FetchAttribute.#ctor(System.Boolean)">
+            <summary>
+            Instructs fetching according to <paramref name="fetch"/>
+            </summary>
+            <param name="fetch"></param>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.FetchAttribute.Fetch">
+            <summary>
+            Gets whether or not fetching should occur.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.GroupAttribute">
+            <summary>
+            Assigns a property to a group.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.GroupAttribute.#ctor(System.Object)">
+            <summary>
+            Constructs a group assignment.
+            </summary>
+            <param name="group">The group name.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.GroupAttribute.#ctor(System.Object[])">
+            <summary>
+            Constructs a group assignment.
+            </summary>
+            <param name="group">The group name.</param>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.GroupAttribute.Group">
+            <summary>
+            Gets the group the property is assigned to.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.KeyAttribute">
+            <summary>
+            Assigns a specific dictionary key.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeyAttribute.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeyAttribute"/> class.
+            </summary>
+            <param name="key">The key.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeyAttribute.#ctor(System.String[])">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeyAttribute"/> class.
+            </summary>
+            <param name="keys">The compound key.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.KeyPrefixAttribute">
+            <summary>
+            Assigns a prefix to the keyed properties of an interface.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeyPrefixAttribute.#ctor">
+            <summary>
+            Initializes a default instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeyPrefixAttribute"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeyPrefixAttribute.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeyPrefixAttribute"/> class.
+            </summary>
+            <param name="keyPrefix">The prefix for the keyed properties of the interface.</param>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.KeyPrefixAttribute.KeyPrefix">
+            <summary>
+            Gets the prefix key added to the properties of the interface.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.KeySubstitutionAttribute">
+            <summary>
+            Substitutes part of key with another string.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeySubstitutionAttribute.#ctor(System.String,System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeySubstitutionAttribute"/> class.
+            </summary>
+            <param name="oldValue">The old value.</param>
+            <param name="newValue">The new value.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.MultiLevelEditAttribute">
+            <summary>
+            Requests support for multi-level editing.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryInitializer">
+            <summary>
+             Contract for dictionary initialization.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryInitializer.Initialize(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.Object[])">
+            <summary>
+            Performs any initialization of the <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/>
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="behaviors">The dictionary behaviors.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.NewGuidAttribute">
+            <summary>
+            Generates a new GUID on demand.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.OnDemandAttribute">
+            <summary>
+            Support for on-demand value resolution.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.PropagateNotificationsAttribute">
+            <summary>
+            Suppress property change notifications.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.StringFormatAttribute">
+            <summary>
+            Provides simple string formatting from existing properties.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.StringFormatAttribute.Format">
+            <summary>
+            Gets the string format.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.StringFormatAttribute.Properties">
+            <summary>
+            Gets the format properties.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.StringListAttribute">
+            <summary>
+            Identifies a property should be represented as a delimited string value.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.StringListAttribute.Separator">
+            <summary>
+            Gets the separator.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.StringValuesAttribute">
+            <summary>
+            Converts all properties to strings.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.StringValuesAttribute.Format">
+            <summary>
+            Gets or sets the format.
+            </summary>
+            <value>The format.</value>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.SuppressNotificationsAttribute">
+            <summary>
+            Suppress property change notifications.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IPropertyDescriptorInitializer">
+            <summary>
+             Contract for property descriptor initialization.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IPropertyDescriptorInitializer.Initialize(Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Object[])">
+            <summary>
+            Performs any initialization of the <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <param name="propertyDescriptor">The property descriptor.</param>
+            <param name="behaviors">The property behaviors.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.TypeKeyPrefixAttribute">
+            <summary>
+            Assigns a prefix to the keyed properties using the interface name.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.DefaultPropertyGetter">
+            <summary>
+            Manages conversion between property values.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DefaultPropertyGetter.#ctor(System.ComponentModel.TypeConverter)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.DefaultPropertyGetter"/> class.
+            </summary>
+            <param name="converter">The converter.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DefaultPropertyGetter.GetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object,Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Boolean)">
+            <summary>
+            Gets the effective dictionary value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="storedValue">The stored value.</param>
+            <param name="property">The property.</param>
+            <param name="ifExists">true if return only existing.</param>
+            <returns>The effective property value.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.DefaultPropertyGetter.ExecutionOrder">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryCreate">
+            <summary>
+            Contract for creating additional Dictionary adapters.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter">
+            <summary>
+            Contract for manipulating the Dictionary adapter.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryEdit">
+            <summary>
+            Contract for editing the Dictionary adapter.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryNotify">
+            <summary>
+            Contract for managing Dictionary adapter notifications.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryValidate">
+            <summary>
+            Contract for validating Dictionary adapter.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory">
+            <summary>
+            Uses Reflection.Emit to expose the properties of a dictionary
+            through a dynamic implementation of a typed interface.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory">
+            <summary>
+            Defines the contract for building typed dictionary adapters.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter``1(System.Collections.IDictionary)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Collections.IDictionary"/>.
+            </summary>
+            <typeparam name="T">The typed interface.</typeparam>
+            <param name="dictionary">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the dictionary.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.IDictionary)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Collections.IDictionary"/>.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="dictionary">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the dictionary.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.IDictionary,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Collections.IDictionary"/>.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="dictionary">The underlying source of properties.</param>
+            <param name="descriptor">The property descriptor.</param>
+            <returns>An implementation of the typed interface bound to the dictionary.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter``1(System.Collections.Specialized.NameValueCollection)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Collections.Specialized.NameValueCollection"/>.
+            </summary>
+            <typeparam name="T">The typed interface.</typeparam>
+            <param name="nameValues">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the namedValues.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.Specialized.NameValueCollection)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Collections.Specialized.NameValueCollection"/>.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="nameValues">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the namedValues.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter``1(System.Xml.XPath.IXPathNavigable)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Xml.XPath.IXPathNavigable"/>.
+            </summary>
+            <typeparam name="T">The typed interface.</typeparam>
+            <param name="xpathNavigable">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the xpath navigable.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter(System.Type,System.Xml.XPath.IXPathNavigable)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Xml.XPath.IXPathNavigable"/>.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="xpathNavigable">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the xpath navigable.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapterMeta(System.Type)">
+            <summary>
+            Gets the <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> associated with the type.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <returns>The adapter meta-data.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapterMeta(System.Type,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Gets the <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> associated with the type.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="descriptor">The property descriptor.</param>
+            <returns>The adapter meta-data.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter``1(System.Collections.IDictionary)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.IDictionary)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.IDictionary,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter``2(System.Collections.Generic.IDictionary{System.String,``1})">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter``1(System.Type,System.Collections.Generic.IDictionary{System.String,``0})">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter``1(System.Collections.Specialized.NameValueCollection)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.Specialized.NameValueCollection)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter``1(System.Xml.XPath.IXPathNavigable)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter(System.Type,System.Xml.XPath.IXPathNavigable)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapterMeta(System.Type)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapterMeta(System.Type,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <inheritdoc />
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.PropertyDescriptor">
+            <summary>
+            Describes a dictionary property.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.#ctor">
+            <summary>
+            Initializes an empty <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.#ctor(System.Reflection.PropertyInfo,System.Object[])">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/> class.
+            </summary>
+            <param name="property">The property.</param>
+            <param name="behaviors">The property behaviors.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.#ctor(Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Boolean)">
+            <summary>
+             Copies an existinginstance of the <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/> class.
+            </summary>
+            <param name="source"></param>
+            <param name="copyBehaviors"></param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.GetKey(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Gets the key.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="descriptor">The descriptor.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.AddKeyBuilder(Castle.Components.DictionaryAdapter.IDictionaryKeyBuilder[])">
+            <summary>
+            Adds the key builder.
+            </summary>
+            <param name="builders">The builder.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.AddKeyBuilders(System.Collections.Generic.IEnumerable{Castle.Components.DictionaryAdapter.IDictionaryKeyBuilder})">
+            <summary>
+            Adds the key builders.
+            </summary>
+            <param name="builders">The builders.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.CopyKeyBuilders(Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Copies the key builders to the other <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <param name="other"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.CopyKeyBuilders(Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Func{Castle.Components.DictionaryAdapter.IDictionaryKeyBuilder,System.Boolean})">
+            <summary>
+            Copies the selected key builders to the other <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <param name="other"></param>
+            <param name="selector"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.GetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object,Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Boolean)">
+            <summary>
+            Gets the property value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="storedValue">The stored value.</param>
+            <param name="descriptor">The descriptor.</param>
+            <param name="ifExists">true if return only existing.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.AddGetter(Castle.Components.DictionaryAdapter.IDictionaryPropertyGetter[])">
+            <summary>
+            Adds the dictionary getter.
+            </summary>
+            <param name="getters">The getter.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.AddGetters(System.Collections.Generic.IEnumerable{Castle.Components.DictionaryAdapter.IDictionaryPropertyGetter})">
+            <summary>
+            Adds the dictionary getters.
+            </summary>
+            <param name="gets">The getters.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.CopyGetters(Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Copies the property getters to the other <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <param name="other"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.CopyGetters(Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Func{Castle.Components.DictionaryAdapter.IDictionaryPropertyGetter,System.Boolean})">
+            <summary>
+            Copies the selected property getters to the other <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <param name="other"></param>
+            <param name="selector"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.SetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object@,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Sets the property value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="value">The value.</param>
+            <param name="descriptor">The descriptor.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.AddSetter(Castle.Components.DictionaryAdapter.IDictionaryPropertySetter[])">
+            <summary>
+            Adds the dictionary setter.
+            </summary>
+            <param name="setters">The setter.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.AddSetters(System.Collections.Generic.IEnumerable{Castle.Components.DictionaryAdapter.IDictionaryPropertySetter})">
+            <summary>
+            Adds the dictionary setters.
+            </summary>
+            <param name="sets">The setters.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.CopySetters(Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Copies the property setters to the other <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <param name="other"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.CopySetters(Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Func{Castle.Components.DictionaryAdapter.IDictionaryPropertySetter,System.Boolean})">
+            <summary>
+            Copies the selected property setters to the other <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <param name="other"></param>
+            <param name="selector"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.AddBehavior(Castle.Components.DictionaryAdapter.IDictionaryBehavior[])">
+            <summary>
+            Adds the behaviors.
+            </summary>
+            <param name="behaviors"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.AddBehaviors(System.Collections.Generic.IEnumerable{Castle.Components.DictionaryAdapter.IDictionaryBehavior})">
+            <summary>
+            Adds the behaviors.
+            </summary>
+            <param name="behaviors"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.AddBehaviors(Castle.Components.DictionaryAdapter.IDictionaryBehaviorBuilder[])">
+            <summary>
+            Adds the behaviors from the builders.
+            </summary>
+            <param name="builders"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.CopyBehaviors(Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Copies the behaviors to the other <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <param name="other"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.CopyBehaviors(Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Func{Castle.Components.DictionaryAdapter.IDictionaryBehavior,System.Boolean})">
+            <summary>
+            Copies the behaviors to the other <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <param name="other"></param>
+            <param name="selector"></param>
+            <returns></returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.ExecutionOrder">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.PropertyName">
+            <summary>
+            Gets the property name.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.PropertyType">
+            <summary>
+            Gets the property type.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Property">
+            <summary>
+            Gets the property.
+            </summary>
+            <value>The property.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.IsDynamicProperty">
+            <summary>
+            Returns true if the property is dynamic.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.State">
+            <summary>
+            Gets additional state.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Fetch">
+            <summary>
+            Determines if property should be fetched.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.SuppressNotifications">
+            <summary>
+            Determines if notifications should occur.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Behaviors">
+            <summary>
+            Gets the property behaviors.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.TypeConverter">
+            <summary>
+            Gets the type converter.
+            </summary>
+            <value>The type converter.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.KeyBuilders">
+            <summary>
+            Gets the key builders.
+            </summary>
+            <value>The key builders.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Setters">
+            <summary>
+            Gets the setter.
+            </summary>
+            <value>The setter.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Getters">
+            <summary>
+            Gets the getter.
+            </summary>
+            <value>The getter.</value>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryDescriptor.AddInitializer(Castle.Components.DictionaryAdapter.IDictionaryInitializer[])">
+            <summary>
+            Adds the dictionary initializers.
+            </summary>
+            <param name="inits">The initializers.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryDescriptor.AddInitializers(System.Collections.Generic.IEnumerable{Castle.Components.DictionaryAdapter.IDictionaryInitializer})">
+            <summary>
+            Adds the dictionary initializers.
+            </summary>
+            <param name="inits">The initializers.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryDescriptor.CopyInitializers(Castle.Components.DictionaryAdapter.DictionaryDescriptor)">
+            <summary>
+            Copies the initializers to the other <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <param name="other"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryDescriptor.CopyInitializers(Castle.Components.DictionaryAdapter.DictionaryDescriptor,System.Func{Castle.Components.DictionaryAdapter.IDictionaryInitializer,System.Boolean})">
+            <summary>
+            Copies the filtered initializers to the other <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <param name="other"></param>
+            <param name="selector"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryDescriptor.AddMetaInitializer(Castle.Components.DictionaryAdapter.IDictionaryMetaInitializer[])">
+            <summary>
+            Adds the dictionary meta-data initializers.
+            </summary>
+            <param name="inits">The meta-data initializers.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryDescriptor.AddMetaInitializers(System.Collections.Generic.IEnumerable{Castle.Components.DictionaryAdapter.IDictionaryMetaInitializer})">
+            <summary>
+            Adds the dictionary meta-data initializers.
+            </summary>
+            <param name="inits">The meta-data initializers.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryDescriptor.CopyMetaInitializers(Castle.Components.DictionaryAdapter.DictionaryDescriptor)">
+            <summary>
+            Copies the meta-initializers to the other <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <param name="other"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryDescriptor.CopyMetaInitializers(Castle.Components.DictionaryAdapter.DictionaryDescriptor,System.Func{Castle.Components.DictionaryAdapter.IDictionaryMetaInitializer,System.Boolean})">
+            <summary>
+            Copies the filtered meta-initializers to the other <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <param name="other"></param>
+            <param name="selector"></param>
+            <returns></returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.DictionaryDescriptor.Initializers">
+            <summary>
+            Gets the initializers.
+            </summary>
+            <value>The initializers.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.DictionaryDescriptor.MetaInitializers">
+            <summary>
+            Gets the meta-data initializers.
+            </summary>
+            <value>The meta-data initializers.</value>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryMetaInitializer">
+            <summary>
+             Contract for dictionary meta-data initialization.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryMetaInitializer.Initialize(Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory,Castle.Components.DictionaryAdapter.DictionaryAdapterMeta)">
+            <summary>
+            Performs any initialization of the dictionary adapter meta-data.
+            </summary>
+            <param name="factory">The dictionary adapter factory.</param>
+            <param name="dictionaryMeta">The dictionary adapter meta.</param>
+            
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryValidator">
+            <summary>
+            Contract for dictionary validation.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryValidator.IsValid(Castle.Components.DictionaryAdapter.IDictionaryAdapter)">
+            <summary>
+            Determines if <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/> is valid.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <returns>true if valid.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryValidator.Validate(Castle.Components.DictionaryAdapter.IDictionaryAdapter)">
+            <summary>
+            Validates the <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/>.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <returns>The error summary information.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryValidator.Validate(Castle.Components.DictionaryAdapter.IDictionaryAdapter,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Validates the <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/> for a property.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="property">The property to validate.</param>
+            <returns>The property summary information.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryValidator.Invalidate(Castle.Components.DictionaryAdapter.IDictionaryAdapter)">
+            <summary>
+            Invalidates any results cached by the validator.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter.#ctor(System.Collections.Specialized.NameValueCollection)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter"/> class.
+            </summary>
+            <param name="nameValues">The name values.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter.Contains(System.Object)">
+            <summary>
+            Determines whether the <see cref="T:System.Collections.IDictionary"></see> object contains an element with the specified key.
+            </summary>
+            <param name="key">The key to locate in the <see cref="T:System.Collections.IDictionary"></see> object.</param>
+            <returns>
+            true if the <see cref="T:System.Collections.IDictionary"></see> contains an element with the key; otherwise, false.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">key is null. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter.Adapt(System.Collections.Specialized.NameValueCollection)">
+            <summary>
+            Adapts the specified name values.
+            </summary>
+            <param name="nameValues">The name values.</param>
+            <returns></returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter.IsReadOnly">
+            <summary>
+            Gets a value indicating whether the <see cref="T:System.Collections.IDictionary"></see> object is read-only.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref="T:System.Collections.IDictionary"></see> object is read-only; otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter.Item(System.Object)">
+            <summary>
+            Gets or sets the <see cref="T:System.Object"/> with the specified key.
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Castle.Core.Internal.AttributesUtil">
+            <summary>
+              Helper class for retrieving attributes.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetAttribute``1(System.Reflection.ICustomAttributeProvider)">
+            <summary>
+              Gets the attribute.
+            </summary>
+            <param name = "member">The member.</param>
+            <returns>The member attribute.</returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetAttributes``1(System.Reflection.ICustomAttributeProvider)">
+            <summary>
+              Gets the attributes. Does not consider inherited attributes!
+            </summary>
+            <param name = "member">The member.</param>
+            <returns>The member attributes.</returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetTypeAttribute``1(System.Type)">
+            <summary>
+              Gets the type attribute.
+            </summary>
+            <param name = "type">The type.</param>
+            <returns>The type attribute.</returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetTypeAttributes``1(System.Type)">
+            <summary>
+              Gets the type attributes.
+            </summary>
+            <param name = "type">The type.</param>
+            <returns>The type attributes.</returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetTypeConverter(System.Reflection.MemberInfo)">
+            <summary>
+              Gets the type converter.
+            </summary>
+            <param name = "member">The member.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.HasAttribute``1(System.Reflection.ICustomAttributeProvider)">
+            <summary>
+              Gets the attribute.
+            </summary>
+            <param name = "member">The member.</param>
+            <returns>The member attribute.</returns>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDynamicValue`1">
+            <summary>
+            Contract for typed dynamic value resolution.
+            </summary>
+            <typeparam name="T"></typeparam>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDynamicValue">
+            <summary>
+            Contract for dynamic value resolution.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.IInvocation">
+            <summary>
+            Encapsulates an invocation of a proxied method.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.SetArgumentValue(System.Int32,System.Object)">
+            <summary>
+            Overrides the value of an argument at the given <paramref name="index"/> with the
+            new <paramref name="value"/> provided.
+            </summary>
+            <remarks>
+            This method accepts an <see cref="T:System.Object"/>, however the value provided must be compatible
+            with the type of the argument defined on the method, otherwise an exception will be thrown.
+            </remarks>
+            <param name="index">The index of the argument to override.</param>
+            <param name="value">The new value for the argument.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.GetArgumentValue(System.Int32)">
+            <summary>
+            Gets the value of the argument at the specified <paramref name="index"/>.
+            </summary>
+            <param name="index">The index.</param>
+            <returns>The value of the argument at the specified <paramref name="index"/>.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.GetConcreteMethod">
+            <summary>
+            Returns the concrete instantiation of the <see cref="P:Castle.DynamicProxy.IInvocation.Method"/> on the proxy, with any generic
+            parameters bound to real types.
+            </summary>
+            <returns>
+            The concrete instantiation of the <see cref="P:Castle.DynamicProxy.IInvocation.Method"/> on the proxy, or the <see cref="P:Castle.DynamicProxy.IInvocation.Method"/> if
+            not a generic method.
+            </returns>
+            <remarks>Can be slower than calling <see cref="P:Castle.DynamicProxy.IInvocation.Method"/>.</remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.GetConcreteMethodInvocationTarget">
+            <summary>
+            Returns the concrete instantiation of <see cref="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget"/>, with any
+            generic parameters bound to real types.
+            For interface proxies, this will point to the <see cref="T:System.Reflection.MethodInfo"/> on the target class.
+            </summary>
+            <returns>The concrete instantiation of <see cref="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget"/>, or
+            <see cref="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget"/> if not a generic method.</returns>
+            <remarks>In debug builds this can be slower than calling <see cref="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget"/>.</remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.Proceed">
+            <summary>
+            Proceeds the call to the next interceptor in line, and ultimately to the target method.
+            </summary>
+            <remarks>
+            Since interface proxies without a target don't have the target implementation to proceed to,
+            it is important, that the last interceptor does not call this method, otherwise a
+            <see cref="T:System.NotImplementedException"/> will be thrown.
+            </remarks>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.Proxy">
+            <summary>
+            Gets the proxy object on which the intercepted method is invoked.
+            </summary>
+            <value>Proxy object on which the intercepted method is invoked.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.InvocationTarget">
+            <summary>
+            Gets the object on which the invocation is performed. This is different from proxy object
+            because most of the time this will be the proxy target object.
+            </summary>
+            <seealso cref="T:Castle.DynamicProxy.IChangeProxyTarget"/>
+            <value>The invocation target.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.TargetType">
+            <summary>
+            Gets the type of the target object for the intercepted method.
+            </summary>
+            <value>The type of the target object.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.Arguments">
+            <summary>
+            Gets the arguments that the <see cref="P:Castle.DynamicProxy.IInvocation.Method"/> has been invoked with.
+            </summary>
+            <value>The arguments the method was invoked with.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.GenericArguments">
+            <summary>
+            Gets the generic arguments of the method.
+            </summary>
+            <value>The generic arguments, or null if not a generic method.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.Method">
+            <summary>
+            Gets the <see cref="T:System.Reflection.MethodInfo"/> representing the method being invoked on the proxy.
+            </summary>
+            <value>The <see cref="T:System.Reflection.MethodInfo"/> representing the method being invoked.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget">
+            <summary>
+            For interface proxies, this will point to the <see cref="T:System.Reflection.MethodInfo"/> on the target class.
+            </summary>
+            <value>The method invocation target.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.ReturnValue">
+            <summary>
+            Gets or sets the return value of the method.
+            </summary>
+            <value>The return value of the method.</value>
+        </member>
+        <member name="T:Castle.DynamicProxy.IProxyGenerationHook">
+            <summary>
+            Used during the target type inspection process. Implementors have a chance to customize the
+            proxy generation process.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyGenerationHook.ShouldInterceptMethod(System.Type,System.Reflection.MethodInfo)">
+            <summary>
+            Invoked by the generation process to determine if the specified method should be proxied.
+            </summary>
+            <param name="type">The type which declares the given method.</param>
+            <param name="methodInfo">The method to inspect.</param>
+            <returns>True if the given method should be proxied; false otherwise.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyGenerationHook.NonProxyableMemberNotification(System.Type,System.Reflection.MemberInfo)">
+            <summary>
+            Invoked by the generation process to notify that a member was not marked as virtual.
+            </summary>
+            <param name="type">The type which declares the non-virtual member.</param>
+            <param name="memberInfo">The non-virtual member.</param>
+            <remarks>
+            This method gives an opportunity to inspect any non-proxyable member of a type that has 
+            been requested to be proxied, and if appropriate - throw an exception to notify the caller.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyGenerationHook.MethodsInspected">
+            <summary>
+            Invoked by the generation process to notify that the whole process has completed.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Contributors.ITypeContributor">
+            <summary>
+            Interface describing elements composing generated type
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Contributors.MembersCollector.IsAccessible(System.Reflection.MethodBase)">
+            <summary>
+            Checks if the method is public or protected.
+            </summary>
+            <param name="method"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.Contributors.MembersCollector.AcceptMethod(System.Reflection.MethodInfo,System.Boolean,Castle.DynamicProxy.IProxyGenerationHook)">
+            <summary>
+            Performs some basic screening and invokes the <see cref="T:Castle.DynamicProxy.IProxyGenerationHook"/>
+            to select methods.
+            </summary>
+            <param name="method"></param>
+            <param name="onlyVirtuals"></param>
+            <param name="hook"></param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.DynamicProxy.IAttributeDisassembler">
+            <summary>
+            Provides functionality for disassembling instances of attributes to CustomAttributeBuilder form, during the process of emiting new types by Dynamic Proxy.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IAttributeDisassembler.Disassemble(System.Attribute)">
+            <summary>
+            Disassembles given attribute instance back to corresponding CustomAttributeBuilder.
+            </summary>
+            <param name="attribute">An instance of attribute to disassemble</param>
+            <returns><see cref="T:System.Reflection.Emit.CustomAttributeBuilder"/> corresponding 1 to 1 to given attribute instance, or null reference.</returns>
+            <remarks>
+            Implementers should return <see cref="T:System.Reflection.Emit.CustomAttributeBuilder"/> that corresponds to given attribute instance 1 to 1,
+            that is after calling specified constructor with specified arguments, and setting specified properties and fields with values specified
+            we should be able to get an attribute instance identical to the one passed in <paramref name="attribute"/>. Implementer can return null
+            if it wishes to opt out of replicating the attribute. Notice however, that for some cases, like attributes passed explicitly by the user
+            it is illegal to return null, and doing so will result in exception.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.AttributeDisassembler.HandleError(System.Type,System.Exception)">
+            <summary>
+            Handles error during disassembly process
+            </summary>
+            <param name="attributeType">Type of the attribute being disassembled</param>
+            <param name="exception">Exception thrown during the process</param>
+            <returns>usually null, or (re)throws the exception</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.AttributeDisassembler.InitializeConstructorArgs(System.Type,System.Attribute,System.Object[],System.Reflection.ParameterInfo[])">
+            <summary>
+            Here we try to match a constructor argument to its value.
+            Since we can't get the values from the assembly, we use some heuristics to get it.
+            a/ we first try to match all the properties on the attributes by name (case insensitive) to the argument
+            b/ if we fail we try to match them by property type, with some smarts about convertions (i,e: can use Guid for string).
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.AttributeDisassembler.ReplaceIfBetterMatch(System.Reflection.ParameterInfo,System.Reflection.PropertyInfo,System.Reflection.PropertyInfo)">
+            <summary>
+            We have the following rules here.
+            Try to find a matching type, failing that, if the parameter is string, get the first property (under the assumption that
+            we can convert it.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.AttributeDisassembler.ConvertValue(System.Object,System.Type)">
+            <summary>
+            Attributes can only accept simple types, so we return null for null,
+            if the value is passed as string we call to string (should help with converting), 
+            otherwise, we use the value as is (enums, integer, etc).
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.CacheMappingsAttribute">
+            <summary>
+            Applied to the assemblies saved by <see cref="T:Castle.DynamicProxy.ModuleScope"/> in order to persist the cache data included in the persisted assembly.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.BaseProxyGenerator">
+            <summary>
+              Base class that exposes the common functionalities
+              to proxy generation.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.BaseProxyGenerator.GenerateParameterlessConstructor(Castle.DynamicProxy.Generators.Emitters.ClassEmitter,System.Type,Castle.DynamicProxy.Generators.Emitters.SimpleAST.FieldReference)">
+            <summary>
+              Generates a parameters constructor that initializes the proxy
+              state with <see cref="T:Castle.DynamicProxy.StandardInterceptor"/> just to make it non-null.
+              <para>
+                This constructor is important to allow proxies to be XML serializable
+              </para>
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.BaseProxyGenerator.AddMappingNoCheck(System.Type,Castle.DynamicProxy.Contributors.ITypeContributor,System.Collections.Generic.IDictionary{System.Type,Castle.DynamicProxy.Contributors.ITypeContributor})">
+            <summary>
+              It is safe to add mapping (no mapping for the interface exists)
+            </summary>
+            <param name = "implementer"></param>
+            <param name = "interface"></param>
+            <param name = "mapping"></param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.InvocationTypeGenerator.GetBaseCtorArguments(System.Type,Castle.DynamicProxy.ProxyGenerationOptions,System.Reflection.ConstructorInfo@)">
+            <summary>
+            Generates the constructor for the class that extends
+            <see cref="T:Castle.DynamicProxy.AbstractInvocation"/>
+            </summary>
+            <param name="targetFieldType"></param>
+            <param name="proxyGenerationOptions"></param>
+            <param name="baseConstructor"></param>
+        </member>
+        <member name="T:Castle.DynamicProxy.DefaultProxyBuilder">
+            <summary>
+              Default implementation of <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> interface producing in-memory proxy assemblies.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.IProxyBuilder">
+            <summary>
+            Abstracts the implementation of proxy type construction.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyBuilder.CreateClassProxy(System.Type,Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+            Creates a proxy type for given <paramref name="classToProxy"/>, using <paramref name="options"/> provided.
+            </summary>
+            <param name="classToProxy">The class type to proxy.</param>
+            <param name="options">The proxy generation options.</param>
+            <returns>The generated proxy type.</returns>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="classToProxy"/> is not public.
+            Note that to avoid this exception, you can mark offending type internal, and define <see cref="T:System.Runtime.CompilerServices.InternalsVisibleToAttribute"/> 
+            pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate.</exception>
+            <seealso cref="T:Castle.DynamicProxy.Generators.ClassProxyGenerator"/>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyBuilder.CreateClassProxy(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+            Creates a proxy type for given <paramref name="classToProxy"/>, implementing <paramref name="additionalInterfacesToProxy"/>, using <paramref name="options"/> provided.
+            </summary>
+            <param name="classToProxy">The class type to proxy.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types to proxy.</param>
+            <param name="options">The proxy generation options.</param>
+            <returns>The generated proxy type.</returns>
+            <remarks>
+            Implementers should return a proxy type for the specified class and interfaces.
+            Additional interfaces should be only 'mark' interfaces, that is, they should work like interface proxy without target. (See <see cref="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)"/> method.)
+            </remarks>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is not public.
+            Note that to avoid this exception, you can mark offending type internal, and define <see cref="T:System.Runtime.CompilerServices.InternalsVisibleToAttribute"/> 
+            pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate.</exception>
+            <seealso cref="T:Castle.DynamicProxy.Generators.ClassProxyGenerator"/>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyBuilder.CreateClassProxyType(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+            Creates a proxy type for given <paramref name="classToProxy"/>, implementing <paramref name="additionalInterfacesToProxy"/>, using <paramref name="options"/> provided.
+            </summary>
+            <param name="classToProxy">The class type to proxy.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types to proxy.</param>
+            <param name="options">The proxy generation options.</param>
+            <returns>The generated proxy type.</returns>
+            <remarks>
+            Implementers should return a proxy type for the specified class and interfaces.
+            Additional interfaces should be only 'mark' interfaces, that is, they should work like interface proxy without target. (See <see cref="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)"/> method.)
+            </remarks>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is not public.
+            Note that to avoid this exception, you can mark offending type internal, and define <see cref="T:System.Runtime.CompilerServices.InternalsVisibleToAttribute"/> 
+            pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate.</exception>
+            <seealso cref="T:Castle.DynamicProxy.Generators.ClassProxyGenerator"/>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithTarget(System.Type,System.Type[],System.Type,Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+            Creates a proxy type that proxies calls to <paramref name="interfaceToProxy"/> members on <paramref name="targetType"/>, implementing <paramref name="additionalInterfacesToProxy"/>, using <paramref name="options"/> provided.
+            </summary>
+            <param name="interfaceToProxy">The interface type to proxy.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types to proxy.</param>
+            <param name="targetType">Type implementing <paramref name="interfaceToProxy"/> on which calls to the interface members should be intercepted.</param>
+            <param name="options">The proxy generation options.</param>
+            <returns>The generated proxy type.</returns>
+            <remarks>
+            Implementers should return a proxy type for the specified interface that 'proceeds' executions to the specified target.
+            Additional interfaces should be only 'mark' interfaces, that is, they should work like interface proxy without target. (See <see cref="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)"/> method.)
+            </remarks>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is not public.
+            Note that to avoid this exception, you can mark offending type internal, and define <see cref="T:System.Runtime.CompilerServices.InternalsVisibleToAttribute"/> 
+            pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate.</exception>
+            <seealso cref="T:Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator"/>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+            Creates a proxy type for given <paramref name="interfaceToProxy"/> that delegates all calls to the provided interceptors.
+            </summary>
+            <param name="interfaceToProxy">The interface type to proxy.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types to proxy.</param>
+            <param name="options">The proxy generation options.</param>
+            <returns>The generated proxy type.</returns>
+            <remarks>
+            Implementers should return a proxy type for the specified interface and additional interfaces that delegate all executions to the specified interceptors.
+            </remarks>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is not public.
+            Note that to avoid this exception, you can mark offending type internal, and define <see cref="T:System.Runtime.CompilerServices.InternalsVisibleToAttribute"/> 
+            pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate.</exception>
+            <seealso cref="T:Castle.DynamicProxy.Generators.InterfaceProxyWithoutTargetGenerator"/>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithTargetInterface(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+            Creates a proxy type for given <paramref name="interfaceToProxy"/> and <parmaref name="additionalInterfacesToProxy"/> that delegates all calls to the provided interceptors and allows interceptors to switch the actual target of invocation.
+            </summary>
+            <param name="interfaceToProxy">The interface type to proxy.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types to proxy.</param>
+            <param name="options">The proxy generation options.</param>
+            <returns>The generated proxy type.</returns>
+            <remarks>
+            Implementers should return a proxy type for the specified interface(s) that delegate all executions to the specified interceptors
+            and uses an instance of the interface as their targets (i.e. <see cref="P:Castle.DynamicProxy.IInvocation.InvocationTarget"/>), rather than a class. All <see cref="T:Castle.DynamicProxy.IInvocation"/> classes should then implement <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface,
+            to allow interceptors to switch invocation target with instance of another type implementing called interface.
+            </remarks>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is not public.
+            Note that to avoid this exception, you can mark offending type internal, and define <see cref="T:System.Runtime.CompilerServices.InternalsVisibleToAttribute"/> 
+            pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate.</exception>
+            <seealso cref="T:Castle.DynamicProxy.Generators.InterfaceProxyWithTargetInterfaceGenerator"/>
+        </member>
+        <member name="P:Castle.DynamicProxy.IProxyBuilder.Logger">
+            <summary>
+            Gets or sets the <see cref="T:Castle.Core.Logging.ILogger"/> that this <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> logs to.
+            </summary>
+        </member>
+        <member name="P:Castle.DynamicProxy.IProxyBuilder.ModuleScope">
+            <summary>
+            Gets the <see cref="P:Castle.DynamicProxy.IProxyBuilder.ModuleScope"/> associated with this builder.
+            </summary>
+            <value>The module scope associated with this builder.</value>
+        </member>
+        <member name="M:Castle.DynamicProxy.DefaultProxyBuilder.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.DefaultProxyBuilder"/> class with new <see cref="T:Castle.DynamicProxy.ModuleScope"/>.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.DefaultProxyBuilder.#ctor(Castle.DynamicProxy.ModuleScope)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.DefaultProxyBuilder"/> class.
+            </summary>
+            <param name="scope">The module scope for generated proxy types.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.AttributeUtil.AddDisassembler``1(Castle.DynamicProxy.IAttributeDisassembler)">
+            <summary>
+            Registers custom disassembler to handle disassembly of specified type of attributes.
+            </summary>
+            <typeparam name="TAttribute">Type of attributes to handle</typeparam>
+            <param name="disassembler">Disassembler converting existing instances of Attributes to CustomAttributeBuilders</param>
+            <remarks>
+            When disassembling an attribute Dynamic Proxy will first check if an custom disassembler has been registered to handle attributes of that type, 
+            and if none is found, it'll use the <see cref="P:Castle.DynamicProxy.AttributeUtil.FallbackDisassembler"/>.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.AttributeUtil.ShouldSkipAttributeReplication(System.Type)">
+            <summary>
+            Attributes should be replicated if they are non-inheritable,
+            but there are some special cases where the attributes means
+            something to the CLR, where they should be skipped.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.CacheKey.#ctor(System.Reflection.MemberInfo,System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.DynamicProxy.Generators.CacheKey"/> class.
+            </summary>
+            <param name="target">Target element. This is either target type or target method for invocation types.</param>
+            <param name="type">The type of the proxy. This is base type for invocation types.</param>
+            <param name="interfaces">The interfaces.</param>
+            <param name="options">The options.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.CacheKey.#ctor(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.DynamicProxy.Generators.CacheKey"/> class.
+            </summary>
+            <param name="target">Type of the target.</param>
+            <param name="interfaces">The interfaces.</param>
+            <param name="options">The options.</param>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.LdcOpCodesDictionary">
+            <summary>s
+            Provides appropriate Ldc.X opcode for the type of primitive value to be loaded.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.LdindOpCodesDictionary">
+            <summary>
+            Provides appropriate Ldind.X opcode for 
+            the type of primitive value to be loaded indirectly.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.Emitters.OpCodeUtil.EmitLoadOpCodeForConstantValue(System.Reflection.Emit.ILGenerator,System.Object)">
+            <summary>
+            Emits a load opcode of the appropriate kind for a constant string or
+            primitive value.
+            </summary>
+            <param name="gen"></param>
+            <param name="value"></param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.Emitters.OpCodeUtil.EmitLoadOpCodeForDefaultValueOfType(System.Reflection.Emit.ILGenerator,System.Type)">
+            <summary>
+            Emits a load opcode of the appropriate kind for the constant default value of a
+            type, such as 0 for value types and null for reference types.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.Emitters.OpCodeUtil.EmitLoadIndirectOpCodeForType(System.Reflection.Emit.ILGenerator,System.Type)">
+            <summary>
+            Emits a load indirect opcode of the appropriate type for a value or object reference.
+            Pops a pointer off the evaluation stack, dereferences it and loads
+            a value of the specified type.
+            </summary>
+            <param name="gen"></param>
+            <param name="type"></param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.Emitters.OpCodeUtil.EmitStoreIndirectOpCodeForType(System.Reflection.Emit.ILGenerator,System.Type)">
+            <summary>
+            Emits a store indirectopcode of the appropriate type for a value or object reference.
+            Pops a value of the specified type and a pointer off the evaluation stack, and
+            stores the value.
+            </summary>
+            <param name="gen"></param>
+            <param name="type"></param>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.PropertiesCollection">
+            <summary>
+            Summary description for PropertiesCollection.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.SimpleAST.IndirectReference">
+            <summary>
+            Wraps a reference that is passed 
+            ByRef and provides indirect load/store support.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.SimpleAST.NewArrayExpression">
+            <summary>
+            Summary description for NewArrayExpression.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.SimpleAST.ReferencesToObjectArrayExpression">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.StindOpCodesDictionary">
+            <summary>
+            Provides appropriate Stind.X opcode 
+            for the type of primitive value to be stored indirectly.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.Emitters.TypeUtil.GetAllInterfaces(System.Type[])">
+            <summary>
+              Returns list of all unique interfaces implemented given types, including their base interfaces.
+            </summary>
+            <param name = "types"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.MetaEvent.#ctor(System.String,System.Type,System.Type,Castle.DynamicProxy.Generators.MetaMethod,Castle.DynamicProxy.Generators.MetaMethod,System.Reflection.EventAttributes)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.DynamicProxy.Generators.MetaEvent"/> class.
+            </summary>
+            <param name="name">The name.</param>
+            <param name="declaringType">Type declaring the original event being overriten, or null.</param>
+            <param name="eventDelegateType"></param>
+            <param name="adder">The add method.</param>
+            <param name="remover">The remove method.</param>
+            <param name="attributes">The attributes.</param>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.INamingScope">
+            <summary>
+            Represents the scope of uniquenes of names for types and their members
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.INamingScope.GetUniqueName(System.String)">
+            <summary>
+            Gets a unique name based on <paramref name="suggestedName"/>
+            </summary>
+            <param name="suggestedName">Name suggested by the caller</param>
+            <returns>Unique name based on <paramref name="suggestedName"/>.</returns>
+            <remarks>
+            Implementers should provide name as closely resembling <paramref name="suggestedName"/> as possible.
+            Generally if no collision occurs it is suggested to return suggested name, otherwise append sequential suffix.
+            Implementers must return deterministic names, that is when <see cref="M:Castle.DynamicProxy.Generators.INamingScope.GetUniqueName(System.String)"/> is called twice 
+            with the same suggested name, the same returned name should be provided each time. Non-deterministic return
+            values, like appending random suffices will break serialization of proxies.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.INamingScope.SafeSubScope">
+            <summary>
+            Returns new, disposable naming scope. It is responsibilty of the caller to make sure that no naming collision
+            with enclosing scope, or other subscopes is possible.
+            </summary>
+            <returns>New naming scope.</returns>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.MethodFinder">
+            <summary>
+            Returns the methods implemented by a type. Use this instead of Type.GetMethods() to work around a CLR issue
+            where duplicate MethodInfos are returned by Type.GetMethods() after a token of a generic type's method was loaded.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.InternalsHelper.IsInternalToDynamicProxy(System.Reflection.Assembly)">
+            <summary>
+            Determines whether this assembly has internals visible to dynamic proxy.
+            </summary>
+            <param name="asm">The assembly to inspect.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.InternalsHelper.IsInternal(System.Reflection.MethodInfo)">
+            <summary>
+            Determines whether the specified method is internal.
+            </summary>
+            <param name="method">The method.</param>
+            <returns>
+            	<c>true</c> if the specified method is internal; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.MixinData.#ctor(System.Collections.Generic.IEnumerable{System.Object})">
+            <summary>
+            Because we need to cache the types based on the mixed in mixins, we do the following here:
+             - Get all the mixin interfaces
+             - Sort them by full name
+             - Return them by position
+            
+            The idea is to have reproducable behavior for the case that mixins are registered in different orders.
+            This method is here because it is required 
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.ModuleScope">
+            <summary>
+            Summary description for ModuleScope.
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.ModuleScope.DEFAULT_FILE_NAME">
+            <summary>
+            The default file name used when the assembly is saved using <see cref="F:Castle.DynamicProxy.ModuleScope.DEFAULT_FILE_NAME"/>.
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.ModuleScope.DEFAULT_ASSEMBLY_NAME">
+            <summary>
+            The default assembly (simple) name used for the assemblies generated by a <see cref="T:Castle.DynamicProxy.ModuleScope"/> instance.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class; assemblies created by this instance will not be saved.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor(System.Boolean)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class, allowing to specify whether the assemblies generated by this instance
+            should be saved.
+            </summary>
+            <param name="savePhysicalAssembly">If set to <c>true</c> saves the generated module.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor(System.Boolean,System.Boolean)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class, allowing to specify whether the assemblies generated by this instance
+            should be saved.
+            </summary>
+            <param name="savePhysicalAssembly">If set to <c>true</c> saves the generated module.</param>
+            <param name="disableSignedModule">If set to <c>true</c> disables ability to generate signed module. This should be used in cases where ran under constrained permissions.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor(System.Boolean,System.Boolean,System.String,System.String,System.String,System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class, allowing to specify whether the assemblies generated by this instance
+            should be saved and what simple names are to be assigned to them.
+            </summary>
+            <param name="savePhysicalAssembly">If set to <c>true</c> saves the generated module.</param>
+            <param name="disableSignedModule">If set to <c>true</c> disables ability to generate signed module. This should be used in cases where ran under constrained permissions.</param>
+            <param name="strongAssemblyName">The simple name of the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="strongModulePath">The path and file name of the manifest module of the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="weakAssemblyName">The simple name of the weak-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="weakModulePath">The path and file name of the manifest module of the weak-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor(System.Boolean,System.Boolean,Castle.DynamicProxy.Generators.INamingScope,System.String,System.String,System.String,System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class, allowing to specify whether the assemblies generated by this instance
+            should be saved and what simple names are to be assigned to them.
+            </summary>
+            <param name="savePhysicalAssembly">If set to <c>true</c> saves the generated module.</param>
+            <param name="disableSignedModule">If set to <c>true</c> disables ability to generate signed module. This should be used in cases where ran under constrained permissions.</param>
+            <param name="namingScope">Naming scope used to provide unique names to generated types and their members (usually via sub-scopes).</param>
+            <param name="strongAssemblyName">The simple name of the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="strongModulePath">The path and file name of the manifest module of the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="weakAssemblyName">The simple name of the weak-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="weakModulePath">The path and file name of the manifest module of the weak-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.GetFromCache(Castle.DynamicProxy.Generators.CacheKey)">
+            <summary>
+            Returns a type from this scope's type cache, or null if the key cannot be found.
+            </summary>
+            <param name="key">The key to be looked up in the cache.</param>
+            <returns>The type from this scope's type cache matching the key, or null if the key cannot be found</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.RegisterInCache(Castle.DynamicProxy.Generators.CacheKey,System.Type)">
+            <summary>
+            Registers a type in this scope's type cache.
+            </summary>
+            <param name="key">The key to be associated with the type.</param>
+            <param name="type">The type to be stored in the cache.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.GetKeyPair">
+            <summary>
+            Gets the key pair used to sign the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.ObtainDynamicModule(System.Boolean)">
+            <summary>
+            Gets the specified module generated by this scope, creating a new one if none has yet been generated.
+            </summary>
+            <param name="isStrongNamed">If set to true, a strong-named module is returned; otherwise, a weak-named module is returned.</param>
+            <returns>A strong-named or weak-named module generated by this scope, as specified by the <paramref name="isStrongNamed"/> parameter.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.ObtainDynamicModuleWithStrongName">
+            <summary>
+            Gets the strong-named module generated by this scope, creating a new one if none has yet been generated.
+            </summary>
+            <returns>A strong-named module generated by this scope.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.ObtainDynamicModuleWithWeakName">
+            <summary>
+            Gets the weak-named module generated by this scope, creating a new one if none has yet been generated.
+            </summary>
+            <returns>A weak-named module generated by this scope.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.SaveAssembly">
+            <summary>
+            Saves the generated assembly with the name and directory information given when this <see cref="T:Castle.DynamicProxy.ModuleScope"/> instance was created (or with
+            the <see cref="F:Castle.DynamicProxy.ModuleScope.DEFAULT_FILE_NAME"/> and current directory if none was given).
+            </summary>
+            <remarks>
+            <para>
+            This method stores the generated assembly in the directory passed as part of the module information specified when this instance was
+            constructed (if any, else the current directory is used). If both a strong-named and a weak-named assembly
+            have been generated, it will throw an exception; in this case, use the <see cref="M:Castle.DynamicProxy.ModuleScope.SaveAssembly(System.Boolean)"/> overload.
+            </para>
+            <para>
+            If this <see cref="T:Castle.DynamicProxy.ModuleScope"/> was created without indicating that the assembly should be saved, this method does nothing.
+            </para></remarks>
+            <exception cref="T:System.InvalidOperationException">Both a strong-named and a weak-named assembly have been generated.</exception>
+            <returns>The path of the generated assembly file, or null if no file has been generated.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.SaveAssembly(System.Boolean)">
+            <summary>
+            Saves the specified generated assembly with the name and directory information given when this <see cref="T:Castle.DynamicProxy.ModuleScope"/> instance was created
+            (or with the <see cref="F:Castle.DynamicProxy.ModuleScope.DEFAULT_FILE_NAME"/> and current directory if none was given).
+            </summary>
+            <param name="strongNamed">True if the generated assembly with a strong name should be saved (see <see cref="P:Castle.DynamicProxy.ModuleScope.StrongNamedModule"/>);
+              false if the generated assembly without a strong name should be saved (see <see cref="P:Castle.DynamicProxy.ModuleScope.WeakNamedModule"/>.</param>
+            <remarks>
+            <para>
+            This method stores the specified generated assembly in the directory passed as part of the module information specified when this instance was
+            constructed (if any, else the current directory is used).
+            </para>
+            <para>
+            If this <see cref="T:Castle.DynamicProxy.ModuleScope"/> was created without indicating that the assembly should be saved, this method does nothing.
+            </para>
+            </remarks>
+            <exception cref="T:System.InvalidOperationException">No assembly has been generated that matches the <paramref name="strongNamed"/> parameter.
+            </exception>
+            <returns>The path of the generated assembly file, or null if no file has been generated.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.LoadAssemblyIntoCache(System.Reflection.Assembly)">
+            <summary>
+            Loads the generated types from the given assembly into this <see cref="T:Castle.DynamicProxy.ModuleScope"/>'s cache.
+            </summary>
+            <param name="assembly">The assembly to load types from. This assembly must have been saved via <see cref="M:Castle.DynamicProxy.ModuleScope.SaveAssembly(System.Boolean)"/> or
+            <see cref="M:Castle.DynamicProxy.ModuleScope.SaveAssembly"/>, or it must have the <see cref="T:Castle.DynamicProxy.CacheMappingsAttribute"/> manually applied.</param>
+            <remarks>
+            This method can be used to load previously generated and persisted proxy types from disk into this scope's type cache, eg. in order
+            to avoid the performance hit associated with proxy generation.
+            </remarks>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.Lock">
+            <summary>
+            Users of this <see cref="T:Castle.DynamicProxy.ModuleScope"/> should use this lock when accessing the cache.
+            </summary>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.StrongNamedModule">
+            <summary>
+            Gets the strong-named module generated by this scope, or <see langword="null"/> if none has yet been generated.
+            </summary>
+            <value>The strong-named module generated by this scope, or <see langword="null"/> if none has yet been generated.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.StrongNamedModuleName">
+            <summary>
+            Gets the file name of the strongly named module generated by this scope.
+            </summary>
+            <value>The file name of the strongly named module generated by this scope.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.StrongNamedModuleDirectory">
+            <summary>
+            Gets the directory where the strongly named module generated by this scope will be saved, or <see langword="null"/> if the current directory
+            is used.
+            </summary>
+            <value>The directory where the strongly named module generated by this scope will be saved when <see cref="M:Castle.DynamicProxy.ModuleScope.SaveAssembly"/> is called
+            (if this scope was created to save modules).</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.WeakNamedModule">
+            <summary>
+            Gets the weak-named module generated by this scope, or <see langword="null"/> if none has yet been generated.
+            </summary>
+            <value>The weak-named module generated by this scope, or <see langword="null"/> if none has yet been generated.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.WeakNamedModuleName">
+            <summary>
+            Gets the file name of the weakly named module generated by this scope.
+            </summary>
+            <value>The file name of the weakly named module generated by this scope.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.WeakNamedModuleDirectory">
+            <summary>
+            Gets the directory where the weakly named module generated by this scope will be saved, or <see langword="null"/> if the current directory
+            is used.
+            </summary>
+            <value>The directory where the weakly named module generated by this scope will be saved when <see cref="M:Castle.DynamicProxy.ModuleScope.SaveAssembly"/> is called
+            (if this scope was created to save modules).</value>
+        </member>
+        <member name="T:Castle.DynamicProxy.PersistentProxyBuilder">
+            <summary>
+            ProxyBuilder that persists the generated type.
+            </summary>
+            <remarks>
+            The saved assembly contains just the last generated type.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.PersistentProxyBuilder.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.DynamicProxy.PersistentProxyBuilder"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.PersistentProxyBuilder.SaveAssembly">
+            <summary>
+            Saves the generated assembly to a physical file. Note that this renders the <see cref="T:Castle.DynamicProxy.PersistentProxyBuilder"/> unusable.
+            </summary>
+            <returns>The path of the generated assembly file, or null if no assembly has been generated.</returns>
+            <remarks>This method does not support saving multiple files. If both a signed and an unsigned module have been generated, use the 
+            respective methods of the <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerationOptions.#ctor(Castle.DynamicProxy.IProxyGenerationHook)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerationOptions"/> class.
+            </summary>
+            <param name="hook">The hook.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerationOptions.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerationOptions"/> class.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.ProxyGenerator">
+            <summary>
+              Provides proxy objects for classes and interfaces.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.#ctor(Castle.DynamicProxy.IProxyBuilder)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> class.
+            </summary>
+            <param name="builder">Proxy types builder.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget``1(``0,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface implemented by <paramref name="target"/> which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>Object proxying calls to members of <typeparamref name="TInterface"/> on <paramref name="target"/> object.</returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/>is not an interface type.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface``1(``0,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget``1(``0,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface implemented by <paramref name="target"/> which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/>is not an interface type.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface``1(``0,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Object,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types  on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Type[],System.Object,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface``1(``0,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface implemented by <paramref name="target"/> which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> type on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface``1(``0,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface implemented by <paramref name="target"/> which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> type on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Type[],System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget``1(Castle.DynamicProxy.IInterceptor)">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on target object generated at runtime with given <paramref name="interceptor"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface which will be proxied.</typeparam>
+            <param name="interceptor">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptor"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              As a result of that also at least one <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementation must be provided.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget``1(Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface which will be proxied.</typeparam>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              As a result of that also at least one <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementation must be provided.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget``1(Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface which will be proxied.</typeparam>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              As a result of that also at least one <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementation must be provided.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,Castle.DynamicProxy.IInterceptor)">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptor"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="interceptor">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptor"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/>  is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of <paramref name="additionalInterfacesToProxy"/> to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget``1(``0,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <typeparamref name="TClass"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TClass">Type of class which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <typeparamref name="TClass"/> proxying calls to virtual members of <typeparamref name="TClass"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TClass"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <typeparamref name="TClass"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <typeparamref name="TClass"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget``1(``0,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <typeparamref name="TClass"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TClass">Type of class which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <typeparamref name="TClass"/> proxying calls to virtual members of <typeparamref name="TClass"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TClass"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <typeparamref name="TClass"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <typeparamref name="TClass"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Object,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no parameterless constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy``1(Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <typeparamref name="TClass"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TClass">Type of class which will be proxied.</typeparam>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <typeparamref name="TClass"/> proxying calls to virtual members of <typeparamref name="TClass"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TClass"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <typeparamref name="TClass"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <typeparamref name="TClass"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy``1(Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <typeparamref name="TClass"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TClass">Type of class which will be proxied.</typeparam>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <typeparamref name="TClass"/> proxying calls to virtual members of <typeparamref name="TClass"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TClass"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <typeparamref name="TClass"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <typeparamref name="TClass"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,System.Type[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,Castle.DynamicProxy.ProxyGenerationOptions,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no parameterless constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyType(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates the proxy type for class proxy with given <paramref name="classToProxy"/> class, implementing given <paramref name="additionalInterfacesToProxy"/> and using provided <paramref name="options"/>.
+            </summary>
+            <param name="classToProxy">The base class for proxy type.</param>
+            <param name="additionalInterfacesToProxy">The interfaces that proxy type should implement.</param>
+            <param name="options">The options for proxy generation process.</param>
+            <returns><see cref="T:System.Type"/> of proxy.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyTypeWithTarget(System.Type,System.Type[],System.Type,Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates the proxy type for interface proxy with target for given <paramref name="interfaceToProxy"/> interface, implementing given <paramref name="additionalInterfacesToProxy"/> on given <paramref name="targetType"/> and using provided <paramref name="options"/>.
+            </summary>
+            <param name="interfaceToProxy">The interface proxy type should implement.</param>
+            <param name="additionalInterfacesToProxy">The additional interfaces proxy type should implement.</param>
+            <param name="targetType">Actual type that the proxy type will encompass.</param>
+            <param name="options">The options for proxy generation process.</param>
+            <returns><see cref="T:System.Type"/> of proxy.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyTypeWithTargetInterface(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates the proxy type for interface proxy with target interface for given <paramref name="interfaceToProxy"/> interface, implementing given <paramref name="additionalInterfacesToProxy"/> on given <paramref name="interfaceToProxy"/> and using provided <paramref name="options"/>.
+            </summary>
+            <param name="interfaceToProxy">The interface proxy type should implement.</param>
+            <param name="additionalInterfacesToProxy">The additional interfaces proxy type should implement.</param>
+            <param name="options">The options for proxy generation process.</param>
+            <returns><see cref="T:System.Type"/> of proxy.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyTypeWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates the proxy type for interface proxy without target for given <paramref name="interfaceToProxy"/> interface, implementing given <paramref name="additionalInterfacesToProxy"/> and using provided <paramref name="options"/>.
+            </summary>
+            <param name="interfaceToProxy">The interface proxy type should implement.</param>
+            <param name="additionalInterfacesToProxy">The additional interfaces proxy type should implement.</param>
+            <param name="options">The options for proxy generation process.</param>
+            <returns><see cref="T:System.Type"/> of proxy.</returns>
+        </member>
+        <member name="P:Castle.DynamicProxy.ProxyGenerator.Logger">
+            <summary>
+              Gets or sets the <see cref="T:Castle.Core.Logging.ILogger"/> that this <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> log to.
+            </summary>
+        </member>
+        <member name="P:Castle.DynamicProxy.ProxyGenerator.ProxyBuilder">
+            <summary>
+              Gets the proxy builder instance used to generate proxy types.
+            </summary>
+            <value>The proxy builder.</value>
+        </member>
+        <member name="M:Castle.DynamicProxy.RemotableInvocation.Proceed">
+            <summary>
+            
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="P:Castle.DynamicProxy.RemotableInvocation.Method">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="P:Castle.DynamicProxy.RemotableInvocation.MethodInvocationTarget">
+            <summary>
+            For interface proxies, this will point to the
+            <see cref="T:System.Reflection.MethodInfo"/> on the target class
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Serialization.ProxyObjectReference">
+            <summary>
+            Handles the deserialization of proxies.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Serialization.ProxyObjectReference.ResetScope">
+            <summary>
+            Resets the <see cref="P:Castle.DynamicProxy.Serialization.ProxyObjectReference.ModuleScope"/> used for deserialization to a new scope.
+            </summary>
+            <remarks>This is useful for test cases.</remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.Serialization.ProxyObjectReference.SetScope(Castle.DynamicProxy.ModuleScope)">
+            <summary>
+            Resets the <see cref="P:Castle.DynamicProxy.Serialization.ProxyObjectReference.ModuleScope"/> used for deserialization to a given <paramref name="scope"/>.
+            </summary>
+            <param name="scope">The scope to be used for deserialization.</param>
+            <remarks>By default, the deserialization process uses a different scope than the rest of the application, which can lead to multiple proxies
+            being generated for the same type. By explicitly setting the deserialization scope to the application's scope, this can be avoided.</remarks>
+        </member>
+        <member name="P:Castle.DynamicProxy.Serialization.ProxyObjectReference.ModuleScope">
+            <summary>
+            Gets the <see cref="T:Castle.DynamicProxy.ModuleScope"/> used for deserialization.
+            </summary>
+            <value>As <see cref="T:Castle.DynamicProxy.Serialization.ProxyObjectReference"/> has no way of automatically determining the scope used by the application (and the application
+            might use more than one scope at the same time), <see cref="T:Castle.DynamicProxy.Serialization.ProxyObjectReference"/> uses a dedicated scope instance for deserializing proxy
+            types. This instance can be reset and set to a specific value via <see cref="M:Castle.DynamicProxy.Serialization.ProxyObjectReference.ResetScope"/> and <see cref="M:Castle.DynamicProxy.Serialization.ProxyObjectReference.SetScope(Castle.DynamicProxy.ModuleScope)"/>.</value>
+        </member>
+        <member name="T:Castle.DynamicProxy.Tokens.InvocationMethods">
+            <summary>
+            Holds <see cref="T:System.Reflection.MethodInfo"/> objects representing methods of <see cref="T:Castle.DynamicProxy.AbstractInvocation"/> class.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Tokens.SerializationInfoMethods">
+            <summary>
+            Holds <see cref="T:System.Reflection.MethodInfo"/> objects representing methods of <see cref="T:System.Runtime.Serialization.SerializationInfo"/> class.
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.Tokens.SerializationInfoMethods.AddValue_Bool">
+            <summary>
+            <see cref="M:System.Runtime.Serialization.SerializationInfo.AddValue(System.String,System.Boolean)"/>
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.Tokens.SerializationInfoMethods.AddValue_Int32">
+            <summary>
+            <see cref="M:System.Runtime.Serialization.SerializationInfo.AddValue(System.String,System.Int32)"/>
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.Tokens.SerializationInfoMethods.AddValue_Object">
+            <summary>
+            <see cref="M:System.Runtime.Serialization.SerializationInfo.AddValue(System.String,System.Object)"/>
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.Tokens.SerializationInfoMethods.GetValue">
+            <summary>
+            <see cref="M:System.Runtime.Serialization.SerializationInfo.GetValue(System.String,System.Type)"/>
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.Tokens.SerializationInfoMethods.SetType">
+            <summary>
+            <see cref="M:System.Runtime.Serialization.SerializationInfo.SetType(System.Type)"/>
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.IInterceptorSelector">
+            <summary>
+            Provides an extension point that allows proxies to choose specific interceptors on
+            a per method basis.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInterceptorSelector.SelectInterceptors(System.Type,System.Reflection.MethodInfo,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+            Selects the interceptors that should intercept calls to the given <paramref name="method"/>.
+            </summary>
+            <param name="type">The type declaring the method to intercept.</param>
+            <param name="method">The method that will be intercepted.</param>
+            <param name="interceptors">All interceptors registered with the proxy.</param>
+            <returns>An array of interceptors to invoke upon calling the <paramref name="method"/>.</returns>
+            <remarks>
+            This method is called only once per proxy instance, upon the first call to the
+            <paramref name="method"/>. Either an empty array or null are valid return values to indicate
+            that no interceptor should intercept calls to the method. Although it is not advised, it is
+            legal to return other <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations than these provided in
+            <paramref name="interceptors"/>.
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.Internal.Lock.Create">
+            <summary>
+            Creates a new lock.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.IServiceProviderExAccessor">
+            <summary>
+            This interface should be implemented by classes
+            that are available in a bigger context, exposing
+            the container to different areas in the same application.
+            <para>
+            For example, in Web application, the (global) HttpApplication
+            subclasses should implement this interface to expose 
+            the configured container
+            </para>
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.IChangeProxyTarget">
+            <summary>
+            Exposes means to change target objects of proxies and invocations
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IChangeProxyTarget.ChangeInvocationTarget(System.Object)">
+            <summary>
+            Changes the target object (<see cref="P:Castle.DynamicProxy.IInvocation.InvocationTarget"/>) of current <see cref="T:Castle.DynamicProxy.IInvocation"/>.
+            </summary>
+            <param name="target">The new value of target of invocation.</param>
+            <remarks>
+            Although the method takes <see cref="T:System.Object"/> the actual instance must be of type assignable to <see cref="P:Castle.DynamicProxy.IInvocation.TargetType"/>, otherwise an <see cref="T:System.InvalidCastException"/> will be thrown.
+            Also while it's technically legal to pass null reference (Nothing in Visual Basic) as <paramref name="target"/>, for obvious reasons Dynamic Proxy will not be able to call the intercepted method on such target.
+            In this case last interceptor in the pipeline mustn't call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/> or a <see cref="T:System.NotImplementedException"/> will be throws.
+            Also while it's technically legal to pass proxy itself as <paramref name="target"/>, this would create stack overflow.
+            In this case last interceptor in the pipeline mustn't call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/> or a <see cref="T:System.InvalidOperationException"/> will be throws.
+            </remarks>
+            <exception cref="T:System.InvalidCastException">Thrown when <paramref name="target"/> is not assignable to the proxied type.</exception>
+        </member>
+        <member name="M:Castle.DynamicProxy.IChangeProxyTarget.ChangeProxyTarget(System.Object)">
+            <summary>
+            Permanently changes the target object of the proxy. This does not affect target of the current invocation.
+            </summary>
+            <param name="target">The new value of target of the proxy.</param>
+            <remarks>
+            Although the method takes <see cref="T:System.Object"/> the actual instance must be of type assignable to proxy's target type, otherwise an <see cref="T:System.InvalidCastException"/> will be thrown.
+            Also while it's technically legal to pass null reference (Nothing in Visual Basic) as <paramref name="target"/>, for obvious reasons Dynamic Proxy will not be able to call the intercepted method on such target.
+            In this case last interceptor in the pipeline mustn't call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/> or a <see cref="T:System.NotImplementedException"/> will be throws.
+            Also while it's technically legal to pass proxy itself as <paramref name="target"/>, this would create stack overflow.
+            In this case last interceptor in the pipeline mustn't call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/> or a <see cref="T:System.InvalidOperationException"/> will be throws.
+            </remarks>
+            <exception cref="T:System.InvalidCastException">Thrown when <paramref name="target"/> is not assignable to the proxied type.</exception>
+        </member>
+        <member name="T:Castle.DynamicProxy.IInterceptor">
+            <summary>
+            New interface that is going to be used by DynamicProxy 2
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyTargetAccessor.DynProxyGetTarget">
+            <summary>
+            Get the proxy target (note that null is a valid target!)
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyTargetAccessor.GetInterceptors">
+            <summary>
+            Gets the interceptors for the proxy
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.IServiceEnabledComponent">
+            <summary>
+            Defines that the implementation wants a 
+            <see cref="T:System.IServiceProvider"/> in order to 
+            access other components. The creator must be aware
+            that the component might (or might not) implement 
+            the interface.
+            </summary>
+            <remarks>
+            Used by Castle Project components to, for example, 
+            gather logging factories
+            </remarks>
+        </member>
+        <member name="T:Castle.Core.IServiceProviderEx">
+            <summary>
+            Increments <c>IServiceProvider</c> with a generic service resolution operation.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.IExtendedLoggerFactory">
+            <summary>
+            Provides a factory that can produce either <see cref="T:Castle.Core.Logging.ILogger"/> or
+            <see cref="T:Castle.Core.Logging.IExtendedLogger"/> classes.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.ILoggerFactory">
+            <summary>
+            Manages the instantiation of <see cref="T:Castle.Core.Logging.ILogger"/>s.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ILoggerFactory.Create(System.Type)">
+            <summary>
+            Creates a new logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ILoggerFactory.Create(System.String)">
+            <summary>
+            Creates a new logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ILoggerFactory.Create(System.Type,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+            Creates a new logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ILoggerFactory.Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+            Creates a new logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.IExtendedLoggerFactory.Create(System.Type)">
+            <summary>
+            Creates a new extended logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.IExtendedLoggerFactory.Create(System.String)">
+            <summary>
+            Creates a new extended logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.IExtendedLoggerFactory.Create(System.Type,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+            Creates a new extended logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.IExtendedLoggerFactory.Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+            Creates a new extended logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Create(System.Type)">
+            <summary>
+            Creates a new extended logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Create(System.String)">
+            <summary>
+            Creates a new extended logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Create(System.Type,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+            Creates a new extended logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+            Creates a new extended logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Castle#Core#Logging#ILoggerFactory#Create(System.Type)">
+            <summary>
+            Creates a new logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Castle#Core#Logging#ILoggerFactory#Create(System.String)">
+            <summary>
+            Creates a new logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Castle#Core#Logging#ILoggerFactory#Create(System.Type,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+            Creates a new logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Castle#Core#Logging#ILoggerFactory#Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+            Creates a new logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.GetConfigFile(System.String)">
+            <summary>
+            Gets the configuration file.
+            </summary>
+            <param name="fileName">i.e. log4net.config</param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.Logging.TraceLoggerFactory">
+            <summary>
+            Used to create the TraceLogger implementation of ILogger interface. See <see cref="T:Castle.Core.Logging.TraceLogger"/>. 
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractLoggerFactory.GetConfigFile(System.String)">
+            <summary>
+            Gets the configuration file.
+            </summary>
+            <param name="fileName">i.e. log4net.config</param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.Logging.IContextProperties">
+            <summary>
+            Interface for Context Properties implementations
+            </summary>
+            <remarks>
+            <para>
+            This interface defines a basic property get set accessor.
+            </para>
+            <para>
+            Based on the ContextPropertiesBase of log4net, by Nicko Cadell.
+            </para>
+            </remarks>
+        </member>
+        <member name="P:Castle.Core.Logging.IContextProperties.Item(System.String)">
+            <summary>
+            Gets or sets the value of a property
+            </summary>
+            <value>
+            The value for the property with the specified key
+            </value>
+            <remarks>
+            <para>
+            Gets or sets the value of a property
+            </para>
+            </remarks>
+        </member>
+        <member name="T:Castle.Core.Logging.NullLogFactory">
+            <summary>
+            NullLogFactory used when logging is turned off.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogFactory.Create(System.String)">
+            <summary>
+            Creates an instance of ILogger with the specified name.
+            </summary>
+            <param name="name">Name.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogFactory.Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+            Creates an instance of ILogger with the specified name and LoggerLevel.
+            </summary>
+            <param name="name">Name.</param>
+            <param name="level">Level.</param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.Logging.StreamLoggerFactory">
+            <summary>
+            Creates <see cref="T:Castle.Core.Logging.StreamLogger"/> outputing 
+            to files. The name of the file is derived from the log name
+            plus the 'log' extension.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.IExtendedLogger">
+            <summary>
+            Provides an interface that supports <see cref="T:Castle.Core.Logging.ILogger"/> and
+            allows the storage and retrieval of Contexts. These are supported in
+            both log4net and NLog.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.ILogger">
+            <summary>
+            Manages logging.
+            </summary>
+            <remarks>
+            This is a facade for the different logging subsystems.
+            It offers a simplified interface that follows IOC patterns
+            and a simplified priority/level/severity abstraction. 
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Debug(System.String)">
+            <summary>
+            Logs a debug message.
+            </summary>
+            <param name="message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Debug(System.String,System.Exception)">
+            <summary>
+            Logs a debug message. 
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Debug(System.String,System.Object[])">
+            <summary>
+            Logs a debug message.
+            </summary>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.DebugFormat(System.String,System.Object[])">
+            <summary>
+            Logs a debug message.
+            </summary>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.DebugFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+            Logs a debug message.
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.DebugFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs a debug message.
+            </summary>
+            <param name="formatProvider">The format provider to use</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.DebugFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs a debug message.
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="formatProvider">The format provider to use</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Info(System.String)">
+            <summary>
+            Logs an info message.
+            </summary>
+            <param name="message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Info(System.String,System.Exception)">
+            <summary>
+            Logs an info message. 
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Info(System.String,System.Object[])">
+            <summary>
+            Logs an info message.
+            </summary>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.InfoFormat(System.String,System.Object[])">
+            <summary>
+            Logs an info message.
+            </summary>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.InfoFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+            Logs an info message.
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.InfoFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs an info message.
+            </summary>
+            <param name="formatProvider">The format provider to use</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.InfoFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs an info message.
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="formatProvider">The format provider to use</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Warn(System.String)">
+            <summary>
+            Logs a warn message.
+            </summary>
+            <param name="message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Warn(System.String,System.Exception)">
+            <summary>
+            Logs a warn message. 
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Warn(System.String,System.Object[])">
+            <summary>
+            Logs a warn message.
+            </summary>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.WarnFormat(System.String,System.Object[])">
+            <summary>
+            Logs a warn message.
+            </summary>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.WarnFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+            Logs a warn message.
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.WarnFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs a warn message.
+            </summary>
+            <param name="formatProvider">The format provider to use</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.WarnFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs a warn message.
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="formatProvider">The format provider to use</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Error(System.String)">
+            <summary>
+            Logs an error message.
+            </summary>
+            <param name="message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Error(System.String,System.Exception)">
+            <summary>
+            Logs an error message. 
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Error(System.String,System.Object[])">
+            <summary>
+            Logs an error message.
+            </summary>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.ErrorFormat(System.String,System.Object[])">
+            <summary>
+            Logs an error message.
+            </summary>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.ErrorFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+            Logs an error message.
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.ErrorFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs an error message.
+            </summary>
+            <param name="formatProvider">The format provider to use</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.ErrorFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs an error message.
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="formatProvider">The format provider to use</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Fatal(System.String)">
+            <summary>
+            Logs a fatal message.
+            </summary>
+            <param name="message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Fatal(System.String,System.Exception)">
+            <summary>
+            Logs a fatal message. 
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Fatal(System.String,System.Object[])">
+            <summary>
+            Logs a fatal message.
+            </summary>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalFormat(System.String,System.Object[])">
+            <summary>
+            Logs a fatal message.
+            </summary>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+            Logs a fatal message.
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs a fatal message.
+            </summary>
+            <param name="formatProvider">The format provider to use</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs a fatal message.
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="formatProvider">The format provider to use</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalError(System.String)">
+            <summary>
+            Logs a fatal error message.
+            </summary>
+            <param name="message">The Message</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalError(System.String,System.Exception)">
+            <summary>
+            Logs a fatal error message.
+            </summary>
+            <param name="message">The Message</param>
+            <param name="exception">The Exception</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalError(System.String,System.Object[])">
+            <summary>
+            Logs a fatal error message.
+            </summary>
+            <param name="format">Message format</param>
+            <param name="args">Array of objects to write using format</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.CreateChildLogger(System.String)">
+            <summary>
+            Create a new child logger.
+            The name of the child logger is [current-loggers-name].[passed-in-name]
+            </summary>
+            <param name="loggerName">The Subname of this logger.</param>
+            <returns>The New ILogger instance.</returns> 
+            <exception cref="T:System.ArgumentException">If the name has an empty element name.</exception>
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsDebugEnabled">
+            <summary>
+            Determines if messages of priority "debug" will be logged.
+            </summary>
+            <value>True if "debug" messages will be logged.</value> 
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsInfoEnabled">
+            <summary>
+            Determines if messages of priority "info" will be logged.
+            </summary>
+            <value>True if "info" messages will be logged.</value> 
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsWarnEnabled">
+            <summary>
+            Determines if messages of priority "warn" will be logged.
+            </summary>
+            <value>True if "warn" messages will be logged.</value> 
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsErrorEnabled">
+            <summary>
+            Determines if messages of priority "error" will be logged.
+            </summary>
+            <value>True if "error" messages will be logged.</value> 
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsFatalEnabled">
+            <summary>
+            Determines if messages of priority "fatal" will be logged.
+            </summary>
+            <value>True if "fatal" messages will be logged.</value> 
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsFatalErrorEnabled">
+            <summary>
+            Determines if messages of priority "fatalError" will be logged.
+            </summary>
+            <value>True if "fatalError" messages will be logged.</value>
+        </member>
+        <member name="P:Castle.Core.Logging.IExtendedLogger.GlobalProperties">
+            <summary>
+            Exposes the Global Context of the extended logger. 
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.IExtendedLogger.ThreadProperties">
+            <summary>
+            Exposes the Thread Context of the extended logger.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.IExtendedLogger.ThreadStacks">
+            <summary>
+            Exposes the Thread Stack of the extended logger.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.LoggerLevel">
+            <summary>
+            Supporting Logger levels.
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Off">
+            <summary>
+            Logging will be off
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Fatal">
+            <summary>
+            Fatal logging level
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Error">
+            <summary>
+            Error logging level
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Warn">
+            <summary>
+            Warn logging level
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Info">
+            <summary>
+            Info logging level
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Debug">
+            <summary>
+            Debug logging level
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.ConsoleLogger">
+            <summary>
+            The Logger sending everything to the standard output streams.
+            This is mainly for the cases when you have a utility that
+            does not have a logger to supply.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.LevelFilteredLogger">
+            <summary>
+            The Level Filtered Logger class.  This is a base clase which
+            provides a LogLevel attribute and reroutes all functions into
+            one Log method.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.#ctor">
+            <summary>
+            Creates a new <c>LevelFilteredLogger</c>.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InitializeLifetimeService">
+            <summary>
+            Keep the instance alive in a remoting scenario
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Debug(System.String)">
+            <summary>
+            Logs a debug message.
+            </summary>
+            <param name="message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Debug(System.String,System.Exception)">
+            <summary>
+            Logs a debug message. 
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.DebugFormat(System.String,System.Object[])">
+            <summary>
+            Logs a debug message.
+            </summary>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.DebugFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+            Logs a debug message.
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.DebugFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs a debug message.
+            </summary>
+            <param name="formatProvider">The format provider to use</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.DebugFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs a debug message.
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="formatProvider">The format provider to use</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Debug(System.String,System.Object[])">
+            <summary>
+            Logs a debug message.
+            </summary>
+            <param name="format">Message format</param>
+            <param name="args">Array of objects to write using format</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Info(System.String)">
+            <summary>
+            Logs an info message.
+            </summary>
+            <param name="message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Info(System.String,System.Exception)">
+            <summary>
+            Logs an info message. 
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InfoFormat(System.String,System.Object[])">
+            <summary>
+            Logs an info message.
+            </summary>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InfoFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+            Logs an info message.
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InfoFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs an info message.
+            </summary>
+            <param name="formatProvider">The format provider to use</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InfoFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs an info message.
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="formatProvider">The format provider to use</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Info(System.String,System.Object[])">
+            <summary>
+            Logs an info message.
+            </summary>
+            <param name="format">Message format</param>
+            <param name="args">Array of objects to write using format</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Warn(System.String)">
+            <summary>
+            Logs a warn message.
+            </summary>
+            <param name="message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Warn(System.String,System.Exception)">
+            <summary>
+            Logs a warn message. 
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.WarnFormat(System.String,System.Object[])">
+            <summary>
+            Logs a warn message.
+            </summary>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.WarnFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+            Logs a warn message.
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.WarnFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs a warn message.
+            </summary>
+            <param name="formatProvider">The format provider to use</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.WarnFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs a warn message.
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="formatProvider">The format provider to use</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Warn(System.String,System.Object[])">
+            <summary>
+            Logs a warn message.
+            </summary>
+            <param name="format">Message format</param>
+            <param name="args">Array of objects to write using format</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Error(System.String)">
+            <summary>
+            Logs an error message.
+            </summary>
+            <param name="message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Error(System.String,System.Exception)">
+            <summary>
+            Logs an error message. 
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.ErrorFormat(System.String,System.Object[])">
+            <summary>
+            Logs an error message.
+            </summary>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.ErrorFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+            Logs an error message.
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.ErrorFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs an error message.
+            </summary>
+            <param name="formatProvider">The format provider to use</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.ErrorFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs an error message.
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="formatProvider">The format provider to use</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Error(System.String,System.Object[])">
+            <summary>
+            Logs an error message.
+            </summary>
+            <param name="format">Message format</param>
+            <param name="args">Array of objects to write using format</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Fatal(System.String)">
+            <summary>
+            Logs a fatal message.
+            </summary>
+            <param name="message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Fatal(System.String,System.Exception)">
+            <summary>
+            Logs a fatal message. 
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalFormat(System.String,System.Object[])">
+            <summary>
+            Logs a fatal message.
+            </summary>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+            Logs a fatal message.
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs a fatal message.
+            </summary>
+            <param name="formatProvider">The format provider to use</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            Logs a fatal message.
+            </summary>
+            <param name="exception">The exception to log</param>
+            <param name="formatProvider">The format provider to use</param>
+            <param name="format">Format string for the message to log</param>
+            <param name="args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Fatal(System.String,System.Object[])">
+            <summary>
+            Logs a fatal message.
+            </summary>
+            <param name="format">Message format</param>
+            <param name="args">Array of objects to write using format</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalError(System.String)">
+            <summary>
+            Logs a fatal error message.
+            </summary>
+            <param name="message">The Message</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalError(System.String,System.Exception)">
+            <summary>
+            Logs a fatal error message.
+            </summary>
+            <param name="message">The Message</param>
+            <param name="exception">The Exception</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalError(System.String,System.Object[])">
+            <summary>
+            Logs a fatal error message.
+            </summary>
+            <param name="format">Message format</param>
+            <param name="args">Array of objects to write using format</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Log(Castle.Core.Logging.LoggerLevel,System.String,System.String,System.Exception)">
+            <summary>
+            Implementors output the log content by implementing this method only.
+            Note that exception can be null
+            </summary>
+            <param name="loggerLevel"></param>
+            <param name="loggerName"></param>
+            <param name="message"></param>
+            <param name="exception"></param>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.Level">
+            <value>
+            The <c>LoggerLevel</c> that this logger
+            will be using. Defaults to <c>LoggerLevel.Off</c>
+            </value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.Name">
+            <value>
+            The name that this logger will be using. 
+            Defaults to <c>String.Empty</c>
+            </value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsDebugEnabled">
+            <summary>
+            Determines if messages of priority "debug" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Debug"/> bit</value> 
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsInfoEnabled">
+            <summary>
+            Determines if messages of priority "info" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Info"/> bit</value> 
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsWarnEnabled">
+            <summary>
+            Determines if messages of priority "warn" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Warn"/> bit</value> 
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsErrorEnabled">
+            <summary>
+            Determines if messages of priority "error" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Error"/> bit</value> 
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsFatalEnabled">
+            <summary>
+            Determines if messages of priority "fatal" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Fatal"/> bit</value> 
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsFatalErrorEnabled">
+            <summary>
+            Determines if messages of priority "fatal" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Fatal"/> bit</value> 
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.#ctor">
+            <summary>
+            Creates a new ConsoleLogger with the <c>Level</c>
+            set to <c>LoggerLevel.Debug</c> and the <c>Name</c>
+            set to <c>String.Empty</c>.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.#ctor(Castle.Core.Logging.LoggerLevel)">
+            <summary>
+            Creates a new ConsoleLogger with the <c>Name</c>
+            set to <c>String.Empty</c>.
+            </summary>
+            <param name="logLevel">The logs Level.</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.#ctor(System.String)">
+            <summary>
+            Creates a new ConsoleLogger with the <c>Level</c>
+            set to <c>LoggerLevel.Debug</c>.
+            </summary>
+            <param name="name">The logs Name.</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.#ctor(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+            Creates a new ConsoleLogger.
+            </summary>
+            <param name="name">The logs Name.</param>
+            <param name="logLevel">The logs Level.</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.Log(Castle.Core.Logging.LoggerLevel,System.String,System.String,System.Exception)">
+            <summary>
+            A Common method to log.
+            </summary>
+            <param name="loggerLevel">The level of logging</param>
+            <param name="loggerName">The name of the logger</param>
+            <param name="message">The Message</param>
+            <param name="exception">The Exception</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.CreateChildLogger(System.String)">
+            <summary>
+            Returns a new <c>ConsoleLogger</c> with the name
+            added after this loggers name, with a dot in between.
+            </summary>
+            <param name="loggerName">The added hierarchical name.</param>
+            <returns>A new <c>ConsoleLogger</c>.</returns> 
+        </member>
+        <member name="T:Castle.Core.Logging.DiagnosticsLogger">
+            <summary>
+            The Logger using standart Diagnostics namespace.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.DiagnosticsLogger.#ctor(System.String)">
+            <summary>
+            Creates a logger based on <see cref="T:System.Diagnostics.EventLog"/>.
+            </summary>
+            <param name="logName"><see cref="P:System.Diagnostics.EventLog.Log"/></param>
+        </member>
+        <member name="M:Castle.Core.Logging.DiagnosticsLogger.#ctor(System.String,System.String)">
+            <summary>
+            Creates a logger based on <see cref="T:System.Diagnostics.EventLog"/>.
+            </summary>
+            <param name="logName"><see cref="P:System.Diagnostics.EventLog.Log"/></param>
+            <param name="source"><see cref="P:System.Diagnostics.EventLog.Source"/></param>
+        </member>
+        <member name="M:Castle.Core.Logging.DiagnosticsLogger.#ctor(System.String,System.String,System.String)">
+            <summary>
+            Creates a logger based on <see cref="T:System.Diagnostics.EventLog"/>.
+            </summary>
+            <param name="logName"><see cref="P:System.Diagnostics.EventLog.Log"/></param>
+            <param name="machineName"><see cref="P:System.Diagnostics.EventLog.MachineName"/></param>
+            <param name="source"><see cref="P:System.Diagnostics.EventLog.Source"/></param>
+        </member>
+        <member name="T:Castle.Core.Logging.NullLogger">
+            <summary>
+            The Null Logger class.  This is useful for implementations where you need
+            to provide a logger to a utility class, but do not want any output from it.
+            It also helps when you have a utility that does not have a logger to supply.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.#ctor">
+            <summary>
+            Creates a new <c>NullLogger</c>.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Debug(System.String)">
+            <summary>
+            No-op.
+            </summary>
+            <param name="message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Debug(System.String,System.Exception)">
+            <summary>
+            No-op. 
+            </summary>
+            <param name="exception">Ignored</param>
+            <param name="message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Debug(System.String,System.Object[])">
+            <summary>
+            No-op.
+            </summary>
+            <param name="format">Ignored</param>
+            <param name="args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.DebugFormat(System.String,System.Object[])">
+            <summary>
+            No-op.
+            </summary>
+            <param name="format">Ignored</param>
+            <param name="args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.DebugFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+            No-op.
+            </summary>
+            <param name="exception">Ignored</param>
+            <param name="format">Ignored</param>
+            <param name="args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.DebugFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            No-op.
+            </summary>
+            <param name="formatProvider">Ignored</param>
+            <param name="format">Ignored</param>
+            <param name="args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.DebugFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            No-op.
+            </summary>
+            <param name="exception">Ignored</param>
+            <param name="formatProvider">Ignored</param>
+            <param name="format">Ignored</param>
+            <param name="args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Info(System.String)">
+            <summary>
+            No-op.
+            </summary>
+            <param name="message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Info(System.String,System.Exception)">
+            <summary>
+            No-op. 
+            </summary>
+            <param name="exception">Ignored</param>
+            <param name="message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Info(System.String,System.Object[])">
+            <summary>
+            No-op.
+            </summary>
+            <param name="format">Ignored</param>
+            <param name="args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.InfoFormat(System.String,System.Object[])">
+            <summary>
+            No-op.
+            </summary>
+            <param name="format">Ignored</param>
+            <param name="args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.InfoFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+            No-op.
+            </summary>
+            <param name="exception">Ignored</param>
+            <param name="format">Ignored</param>
+            <param name="args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.InfoFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            No-op.
+            </summary>
+            <param name="formatProvider">Ignored</param>
+            <param name="format">Ignored</param>
+            <param name="args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.InfoFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            No-op.
+            </summary>
+            <param name="exception">Ignored</param>
+            <param name="formatProvider">Ignored</param>
+            <param name="format">Ignored</param>
+            <param name="args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Warn(System.String)">
+            <summary>
+            No-op.
+            </summary>
+            <param name="message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Warn(System.String,System.Exception)">
+            <summary>
+            No-op. 
+            </summary>
+            <param name="exception">Ignored</param>
+            <param name="message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Warn(System.String,System.Object[])">
+            <summary>
+            No-op.
+            </summary>
+            <param name="format">Ignored</param>
+            <param name="args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.WarnFormat(System.String,System.Object[])">
+            <summary>
+            No-op.
+            </summary>
+            <param name="format">Ignored</param>
+            <param name="args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.WarnFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+            No-op.
+            </summary>
+            <param name="exception">Ignored</param>
+            <param name="format">Ignored</param>
+            <param name="args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.WarnFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            No-op.
+            </summary>
+            <param name="formatProvider">Ignored</param>
+            <param name="format">Ignored</param>
+            <param name="args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.WarnFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            No-op.
+            </summary>
+            <param name="exception">Ignored</param>
+            <param name="formatProvider">Ignored</param>
+            <param name="format">Ignored</param>
+            <param name="args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Error(System.String)">
+            <summary>
+            No-op.
+            </summary>
+            <param name="message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Error(System.String,System.Exception)">
+            <summary>
+            No-op. 
+            </summary>
+            <param name="exception">Ignored</param>
+            <param name="message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Error(System.String,System.Object[])">
+            <summary>
+            No-op.
+            </summary>
+            <param name="format">Ignored</param>
+            <param name="args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.ErrorFormat(System.String,System.Object[])">
+            <summary>
+            No-op.
+            </summary>
+            <param name="format">Ignored</param>
+            <param name="args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.ErrorFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+            No-op.
+            </summary>
+            <param name="exception">Ignored</param>
+            <param name="format">Ignored</param>
+            <param name="args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.ErrorFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            No-op.
+            </summary>
+            <param name="formatProvider">Ignored</param>
+            <param name="format">Ignored</param>
+            <param name="args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.ErrorFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            No-op.
+            </summary>
+            <param name="exception">Ignored</param>
+            <param name="formatProvider">Ignored</param>
+            <param name="format">Ignored</param>
+            <param name="args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Fatal(System.String)">
+            <summary>
+            No-op.
+            </summary>
+            <param name="message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Fatal(System.String,System.Exception)">
+            <summary>
+            No-op.
+            </summary>
+            <param name="exception">Ignored</param>
+            <param name="message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Fatal(System.String,System.Object[])">
+            <summary>
+            No-op.
+            </summary>
+            <param name="format">Ignored</param>
+            <param name="args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalFormat(System.String,System.Object[])">
+            <summary>
+            No-op.
+            </summary>
+            <param name="format">Ignored</param>
+            <param name="args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+            No-op.
+            </summary>
+            <param name="exception">Ignored</param>
+            <param name="format">Ignored</param>
+            <param name="args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            No-op.
+            </summary>
+            <param name="formatProvider">Ignored</param>
+            <param name="format">Ignored</param>
+            <param name="args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+            No-op.
+            </summary>
+            <param name="exception">Ignored</param>
+            <param name="formatProvider">Ignored</param>
+            <param name="format">Ignored</param>
+            <param name="args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalError(System.String)">
+            <summary>
+            No-op.
+            </summary>
+            <param name="message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalError(System.String,System.Exception)">
+            <summary>
+            No-op.
+            </summary>
+            <param name="message">Ignored</param>
+            <param name="exception">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalError(System.String,System.Object[])">
+            <summary>
+            No-op.
+            </summary>
+            <param name="format">Ignored</param>
+            <param name="args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.CreateChildLogger(System.String)">
+            <summary>
+            Returns this <c>NullLogger</c>.
+            </summary>
+            <param name="loggerName">Ignored</param>
+            <returns>This ILogger instance.</returns> 
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsDebugEnabled">
+            <summary>
+            No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsInfoEnabled">
+            <summary>
+            No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsWarnEnabled">
+            <summary>
+            No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsErrorEnabled">
+            <summary>
+            No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsFatalEnabled">
+            <summary>
+            No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsFatalErrorEnabled">
+            <summary>
+            No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.GlobalProperties">
+            <summary>
+            Returns empty context properties.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.ThreadProperties">
+            <summary>
+            Returns empty context properties.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.ThreadStacks">
+            <summary>
+            Returns empty context stacks.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.StreamLogger">
+            <summary>
+            The Stream Logger class.  This class can stream log information
+            to any stream, it is suitable for storing a log file to disk,
+            or to a <c>MemoryStream</c> for testing your components.
+            </summary>
+            <remarks>
+            This logger is not thread safe.
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.Logging.StreamLogger.#ctor(System.String,System.IO.Stream)">
+            <summary>
+            Creates a new <c>StreamLogger</c> with default encoding 
+            and buffer size. Initial Level is set to Debug.
+            </summary>
+            <param name="name">
+            The name of the log.
+            </param>
+            <param name="stream">
+            The stream that will be used for logging,
+            seeking while the logger is alive 
+            </param>
+        </member>
+        <member name="M:Castle.Core.Logging.StreamLogger.#ctor(System.String,System.IO.Stream,System.Text.Encoding)">
+            <summary>
+            Creates a new <c>StreamLogger</c> with default buffer size.
+            Initial Level is set to Debug.
+            </summary>
+            <param name="name">
+            The name of the log.
+            </param>
+            <param name="stream">
+            The stream that will be used for logging,
+            seeking while the logger is alive 
+            </param>
+            <param name="encoding">
+            The encoding that will be used for this stream.
+            <see cref="T:System.IO.StreamWriter"/>
+            </param>
+        </member>
+        <member name="M:Castle.Core.Logging.StreamLogger.#ctor(System.String,System.IO.Stream,System.Text.Encoding,System.Int32)">
+            <summary>
+            Creates a new <c>StreamLogger</c>. 
+            Initial Level is set to Debug.
+            </summary>
+            <param name="name">
+            The name of the log.
+            </param>
+            <param name="stream">
+            The stream that will be used for logging,
+            seeking while the logger is alive 
+            </param>
+            <param name="encoding">
+            The encoding that will be used for this stream.
+            <see cref="T:System.IO.StreamWriter"/>
+            </param>
+            <param name="bufferSize">
+            The buffer size that will be used for this stream.
+            <see cref="T:System.IO.StreamWriter"/>
+            </param>
+        </member>
+        <member name="M:Castle.Core.Logging.StreamLogger.#ctor(System.String,System.IO.StreamWriter)">
+            <summary>
+            Creates a new <c>StreamLogger</c> with 
+            Debug as default Level.
+            </summary>
+            <param name="name">The name of the log.</param>
+            <param name="writer">The <c>StreamWriter</c> the log will write to.</param>
+        </member>
+        <member name="T:Castle.Core.Logging.TraceLogger">
+            <summary>
+            The TraceLogger sends all logging to the System.Diagnostics.TraceSource
+            built into the .net framework. 
+            </summary>
+            <remarks>
+            Logging can be configured in the system.diagnostics configuration 
+            section. 
+            
+            If logger doesn't find a source name with a full match it will
+            use source names which match the namespace partially. For example you can
+            configure from all castle components by adding a source name with the
+            name "Castle". 
+            
+            If no portion of the namespace matches the source named "Default" will
+            be used.
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.Logging.TraceLogger.#ctor(System.String)">
+            <summary>
+            Build a new trace logger based on the named TraceSource
+            </summary>
+            <param name="name">The name used to locate the best TraceSource. In most cases comes from the using type's fullname.</param>
+        </member>
+        <member name="M:Castle.Core.Logging.TraceLogger.#ctor(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+            Build a new trace logger based on the named TraceSource
+            </summary>
+            <param name="name">The name used to locate the best TraceSource. In most cases comes from the using type's fullname.</param>
+            <param name="level">The default logging level at which this source should write messages. In almost all cases this
+            default value will be overridden in the config file. </param>
+        </member>
+        <member name="M:Castle.Core.Logging.TraceLogger.CreateChildLogger(System.String)">
+            <summary>
+            Create a new child logger.
+            The name of the child logger is [current-loggers-name].[passed-in-name]
+            </summary>
+            <param name="loggerName">The Subname of this logger.</param>
+            <returns>The New ILogger instance.</returns> 
+        </member>
+        <member name="T:Castle.Core.Configuration.AbstractConfiguration">
+            <summary>
+            This is an abstract <see cref="T:Castle.Core.Configuration.IConfiguration"/> implementation
+            that deals with methods that can be abstracted away
+            from underlying implementations.
+            </summary>
+            <remarks>
+            <para><b>AbstractConfiguration</b> makes easier to implementers 
+            to create a new version of <see cref="T:Castle.Core.Configuration.IConfiguration"/></para>
+            </remarks>
+        </member>
+        <member name="T:Castle.Core.Configuration.IConfiguration">
+            <summary>
+            <see cref="T:Castle.Core.Configuration.IConfiguration"/> is a interface encapsulating a configuration node
+            used to retrieve configuration values.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.IConfiguration.GetValue(System.Type,System.Object)">
+            <summary>
+            Gets the value of the node and converts it 
+            into specified <see cref="T:System.Type"/>.
+            </summary>
+            <param name="type">The <see cref="T:System.Type"/></param>
+            <param name="defaultValue">
+            The Default value returned if the conversion fails.
+            </param>
+            <returns>The Value converted into the specified type.</returns>
+        </member>
+        <member name="P:Castle.Core.Configuration.IConfiguration.Name">
+            <summary>
+            Gets the name of the node.
+            </summary>
+            <value>
+            The Name of the node.
+            </value> 
+        </member>
+        <member name="P:Castle.Core.Configuration.IConfiguration.Value">
+            <summary>
+            Gets the value of the node.
+            </summary>
+            <value>
+            The Value of the node.
+            </value> 
+        </member>
+        <member name="P:Castle.Core.Configuration.IConfiguration.Children">
+            <summary>
+            Gets an <see cref="T:Castle.Core.Configuration.ConfigurationCollection"/> of <see cref="T:Castle.Core.Configuration.IConfiguration"/>
+            elements containing all node children.
+            </summary>
+            <value>The Collection of child nodes.</value>
+        </member>
+        <member name="P:Castle.Core.Configuration.IConfiguration.Attributes">
+            <summary>
+            Gets an <see cref="T:System.Collections.IDictionary"/> of the configuration attributes.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.AbstractConfiguration.GetValue(System.Type,System.Object)">
+            <summary>
+            Gets the value of the node and converts it
+            into specified <see cref="T:System.Type"/>.
+            </summary>
+            <param name="type">The <see cref="T:System.Type"/></param>
+            <param name="defaultValue">
+            The Default value returned if the convertion fails.
+            </param>
+            <returns>The Value converted into the specified type.</returns>
+        </member>
+        <member name="P:Castle.Core.Configuration.AbstractConfiguration.Name">
+            <summary>
+            Gets the name of the <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </summary>
+            <value>
+            The Name of the <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </value>
+        </member>
+        <member name="P:Castle.Core.Configuration.AbstractConfiguration.Value">
+            <summary>
+            Gets the value of <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </summary>
+            <value>
+            The Value of the <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </value>
+        </member>
+        <member name="P:Castle.Core.Configuration.AbstractConfiguration.Children">
+            <summary>
+            Gets all child nodes.
+            </summary>
+            <value>The <see cref="T:Castle.Core.Configuration.ConfigurationCollection"/> of child nodes.</value>
+        </member>
+        <member name="P:Castle.Core.Configuration.AbstractConfiguration.Attributes">
+            <summary>
+            Gets node attributes.
+            </summary>
+            <value>
+            All attributes of the node.
+            </value>
+        </member>
+        <member name="T:Castle.Core.Configuration.ConfigurationCollection">
+            <summary>
+            A collection of <see cref="T:Castle.Core.Configuration.IConfiguration"/> objects.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.ConfigurationCollection.#ctor">
+            <summary>
+            Creates a new instance of <c>ConfigurationCollection</c>.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.ConfigurationCollection.#ctor(System.Collections.Generic.IEnumerable{Castle.Core.Configuration.IConfiguration})">
+            <summary>
+            Creates a new instance of <c>ConfigurationCollection</c>.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Configuration.MutableConfiguration">
+            <summary>
+            Summary description for MutableConfiguration.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.MutableConfiguration.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Core.Configuration.MutableConfiguration"/> class.
+            </summary>
+            <param name="name">The name.</param>
+        </member>
+        <member name="P:Castle.Core.Configuration.MutableConfiguration.Value">
+            <summary>
+            Gets the value of <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </summary>
+            <value>
+            The Value of the <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </value>
+        </member>
+        <member name="T:Castle.Core.Configuration.Xml.XmlConfigurationDeserializer">
+            <summary>
+            Pendent
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.Xml.XmlConfigurationDeserializer.Deserialize(System.Xml.XmlNode)">
+            <summary>
+            Deserializes the specified node into an abstract representation of configuration.
+            </summary>
+            <param name="node">The node.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Configuration.Xml.XmlConfigurationDeserializer.GetConfigValue(System.String)">
+            <summary>
+            If a config value is an empty string we return null, this is to keep
+            backward compability with old code
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Pair`2">
+            <summary>
+            General purpose class to represent a standard pair of values. 
+            </summary>
+            <typeparam name="TFirst">Type of the first value</typeparam>
+            <typeparam name="TSecond">Type of the second value</typeparam>
+        </member>
+        <member name="M:Castle.Core.Pair`2.#ctor(`0,`1)">
+            <summary>
+            Constructs a pair with its values
+            </summary>
+            <param name="first"></param>
+            <param name="second"></param>
+        </member>
+        <member name="T:Castle.Core.ProxyServices">
+            <summary>
+            List of utility methods related to dynamic proxy operations
+            </summary>
+        </member>
+        <member name="M:Castle.Core.ProxyServices.IsDynamicProxy(System.Type)">
+            <summary>
+            Determines whether the specified type is a proxy generated by
+            DynamicProxy (1 or 2).
+            </summary>
+            <param name="type">The type.</param>
+            <returns>
+            	<c>true</c> if it is a proxy; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="T:Castle.Core.ReflectionBasedDictionaryAdapter">
+            <summary>
+            Pendent
+            </summary>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.#ctor(System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Core.ReflectionBasedDictionaryAdapter"/> class.
+            </summary>
+            <param name="target">The target.</param>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Contains(System.Object)">
+            <summary>
+            Determines whether the <see cref="T:System.Collections.IDictionary"/> object contains an element with the specified key.
+            </summary>
+            <param name="key">The key to locate in the <see cref="T:System.Collections.IDictionary"/> object.</param>
+            <returns>
+            true if the <see cref="T:System.Collections.IDictionary"/> contains an element with the key; otherwise, false.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">
+            	<paramref name="key"/> is null. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Add(System.Object,System.Object)">
+            <summary>
+            Adds an element with the provided key and value to the <see cref="T:System.Collections.IDictionary"/> object.
+            </summary>
+            <param name="key">The <see cref="T:System.Object"/> to use as the key of the element to add.</param>
+            <param name="value">The <see cref="T:System.Object"/> to use as the value of the element to add.</param>
+            <exception cref="T:System.ArgumentNullException">
+            	<paramref name="key"/> is null. </exception>
+            <exception cref="T:System.ArgumentException">An element with the same key already exists in the <see cref="T:System.Collections.IDictionary"/> object. </exception>
+            <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.IDictionary"/> is read-only.-or- The <see cref="T:System.Collections.IDictionary"/> has a fixed size. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Clear">
+            <summary>
+            Removes all elements from the <see cref="T:System.Collections.IDictionary"/> object.
+            </summary>
+            <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.IDictionary"/> object is read-only. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.System#Collections#IDictionary#GetEnumerator">
+            <summary>
+            Returns an <see cref="T:System.Collections.IDictionaryEnumerator"/> object for the <see cref="T:System.Collections.IDictionary"/> object.
+            </summary>
+            <returns>
+            An <see cref="T:System.Collections.IDictionaryEnumerator"/> object for the <see cref="T:System.Collections.IDictionary"/> object.
+            </returns>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Remove(System.Object)">
+            <summary>
+            Removes the element with the specified key from the <see cref="T:System.Collections.IDictionary"/> object.
+            </summary>
+            <param name="key">The key of the element to remove.</param>
+            <exception cref="T:System.ArgumentNullException">
+            	<paramref name="key"/> is null. </exception>
+            <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.IDictionary"/> object is read-only.-or- The <see cref="T:System.Collections.IDictionary"/> has a fixed size. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.System#Collections#ICollection#CopyTo(System.Array,System.Int32)">
+            <summary>
+            Copies the elements of the <see cref="T:System.Collections.ICollection"/> to an <see cref="T:System.Array"/>, starting at a particular <see cref="T:System.Array"/> index.
+            </summary>
+            <param name="array">The one-dimensional <see cref="T:System.Array"/> that is the destination of the elements copied from <see cref="T:System.Collections.ICollection"/>. The <see cref="T:System.Array"/> must have zero-based indexing.</param>
+            <param name="index">The zero-based index in <paramref name="array"/> at which copying begins.</param>
+            <exception cref="T:System.ArgumentNullException">
+            	<paramref name="array"/> is null. </exception>
+            <exception cref="T:System.ArgumentOutOfRangeException">
+            	<paramref name="index"/> is less than zero. </exception>
+            <exception cref="T:System.ArgumentException">
+            	<paramref name="array"/> is multidimensional.-or- <paramref name="index"/> is equal to or greater than the length of <paramref name="array"/>.-or- The number of elements in the source <see cref="T:System.Collections.ICollection"/> is greater than the available space from <paramref name="index"/> to the end of the destination <paramref name="array"/>. </exception>
+            <exception cref="T:System.ArgumentException">The type of the source <see cref="T:System.Collections.ICollection"/> cannot be cast automatically to the type of the destination <paramref name="array"/>. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.GetEnumerator">
+            <summary>
+            Returns an enumerator that iterates through a collection.
+            </summary>
+            <returns>
+            An <see cref="T:System.Collections.IEnumerator"/> object that can be used to iterate through the collection.
+            </returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.Item(System.Object)">
+            <summary>
+            Gets or sets the <see cref="T:System.Object"/> with the specified key.
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.Keys">
+            <summary>
+            Gets an <see cref="T:System.Collections.ICollection"/> object containing the keys of the <see cref="T:System.Collections.IDictionary"/> object.
+            </summary>
+            <value></value>
+            <returns>An <see cref="T:System.Collections.ICollection"/> object containing the keys of the <see cref="T:System.Collections.IDictionary"/> object.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.Values">
+            <summary>
+            Gets an <see cref="T:System.Collections.ICollection"/> object containing the values in the <see cref="T:System.Collections.IDictionary"/> object.
+            </summary>
+            <value></value>
+            <returns>An <see cref="T:System.Collections.ICollection"/> object containing the values in the <see cref="T:System.Collections.IDictionary"/> object.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.IsReadOnly">
+            <summary>
+            Gets a value indicating whether the <see cref="T:System.Collections.IDictionary"/> object is read-only.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref="T:System.Collections.IDictionary"/> object is read-only; otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.System#Collections#IDictionary#IsFixedSize">
+            <summary>
+            Gets a value indicating whether the <see cref="T:System.Collections.IDictionary"/> object has a fixed size.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref="T:System.Collections.IDictionary"/> object has a fixed size; otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.Count">
+            <summary>
+            Gets the number of elements contained in the <see cref="T:System.Collections.ICollection"/>.
+            </summary>
+            <value></value>
+            <returns>The number of elements contained in the <see cref="T:System.Collections.ICollection"/>.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.SyncRoot">
+            <summary>
+            Gets an object that can be used to synchronize access to the <see cref="T:System.Collections.ICollection"/>.
+            </summary>
+            <value></value>
+            <returns>An object that can be used to synchronize access to the <see cref="T:System.Collections.ICollection"/>.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.IsSynchronized">
+            <summary>
+            Gets a value indicating whether access to the <see cref="T:System.Collections.ICollection"/> is synchronized (thread safe).
+            </summary>
+            <value></value>
+            <returns>true if access to the <see cref="T:System.Collections.ICollection"/> is synchronized (thread safe); otherwise, false.</returns>
+        </member>
+        <member name="T:Castle.Core.Resource.IResource">
+            <summary>
+            Represents a 'streamable' resource. Can
+            be a file, a resource in an assembly.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Resource.IResource.GetStreamReader">
+            <summary>
+            Returns a reader for the stream
+            </summary>
+            <remarks>
+            It's up to the caller to dispose the reader.
+            </remarks>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Resource.IResource.GetStreamReader(System.Text.Encoding)">
+            <summary>
+            Returns a reader for the stream
+            </summary>
+            <remarks>
+            It's up to the caller to dispose the reader.
+            </remarks>
+            <param name="encoding"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Resource.IResource.CreateRelative(System.String)">
+            <summary>
+            Returns an instance of <see cref="T:Castle.Core.Resource.IResource"/>
+            created according to the <c>relativePath</c>
+            using itself as the root.
+            </summary>
+            <param name="relativePath"></param>
+            <returns></returns>
+        </member>
+        <member name="P:Castle.Core.Resource.IResource.FileBasePath">
+            <summary>
+            
+            </summary>
+            <remarks>
+            Only valid for resources that
+            can be obtained through relative paths
+            </remarks>
+        </member>
+        <member name="T:Castle.Core.Resource.AbstractStreamResource">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Resource.AbstractStreamResource.createStream">
+            <summary>
+            This returns a new stream instance each time it is called.
+            It is the responsability of the caller to dispose of this stream
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Resource.IResourceFactory">
+            <summary>
+            Depicts the contract for resource factories.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Resource.IResourceFactory.Accept(Castle.Core.Resource.CustomUri)">
+            <summary>
+            Used to check whether the resource factory
+            is able to deal with the given resource
+            identifier.
+            </summary>
+            <remarks>
+            Implementors should return <c>true</c>
+            only if the given identifier is supported
+            by the resource factory
+            </remarks>
+            <param name="uri"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Resource.IResourceFactory.Create(Castle.Core.Resource.CustomUri)">
+            <summary>
+            Creates an <see cref="T:Castle.Core.Resource.IResource"/> instance
+            for the given resource identifier
+            </summary>
+            <param name="uri"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Resource.IResourceFactory.Create(Castle.Core.Resource.CustomUri,System.String)">
+            <summary>
+            Creates an <see cref="T:Castle.Core.Resource.IResource"/> instance
+            for the given resource identifier
+            </summary>
+            <param name="uri"></param>
+            <param name="basePath"></param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.Resource.FileResource">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Resource.FileResourceFactory">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Resource.StaticContentResource">
+            <summary>
+            Adapts a static string content as an <see cref="T:Castle.Core.Resource.IResource"/>
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Resource.UncResource">
+            <summary>
+            Enable access to files on network shares
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Smtp.IEmailSender">
+            <summary>
+            Email sender abstraction.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Smtp.IEmailSender.Send(System.String,System.String,System.String,System.String)">
+            <summary>
+            Sends a mail message.
+            </summary>
+            <param name="from">From field</param>
+            <param name="to">To field</param>
+            <param name="subject">E-mail's subject</param>
+            <param name="messageText">message's body</param>
+        </member>
+        <member name="M:Castle.Core.Smtp.IEmailSender.Send(System.Net.Mail.MailMessage)">
+            <summary>
+            Sends a <see cref="T:System.Net.Mail.MailMessage">message</see>. 
+            </summary>
+            <param name="message"><see cref="T:System.Net.Mail.MailMessage">Message</see> instance</param>
+        </member>
+        <member name="M:Castle.Core.Smtp.IEmailSender.Send(System.Collections.Generic.IEnumerable{System.Net.Mail.MailMessage})">
+            <summary>
+            Sends multiple <see cref="T:System.Net.Mail.MailMessage">messages</see>. 
+            </summary>
+            <param name="messages">List of <see cref="T:System.Net.Mail.MailMessage">messages</see></param>
+        </member>
+        <member name="T:Castle.Core.Smtp.DefaultSmtpSender">
+            <summary>
+            Default <see cref="T:Castle.Core.Smtp.IEmailSender"/> implementation.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Smtp.DefaultSmtpSender.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Core.Smtp.DefaultSmtpSender"/> class based on the <see cref="T:System.Net.Mail.SmtpClient"/> configuration provided in the application configuration file.
+            </summary>
+            <remarks>
+            This constructor is based on the default <see cref="T:System.Net.Mail.SmtpClient"/> configuration in the application configuration file.
+            </remarks> 
+        </member>
+        <member name="M:Castle.Core.Smtp.DefaultSmtpSender.#ctor(System.String)">
+            <summary>
+            This service implementation
+            requires a host name in order to work
+            </summary>
+            <param name="hostname">The smtp server name</param>
+        </member>
+        <member name="M:Castle.Core.Smtp.DefaultSmtpSender.Send(System.String,System.String,System.String,System.String)">
+            <summary>
+            Sends a message. 
+            </summary>
+            <exception cref="T:System.ArgumentNullException">If any of the parameters is null</exception>
+            <param name="from">From field</param>
+            <param name="to">To field</param>
+            <param name="subject">e-mail's subject</param>
+            <param name="messageText">message's body</param>
+        </member>
+        <member name="M:Castle.Core.Smtp.DefaultSmtpSender.Send(System.Net.Mail.MailMessage)">
+            <summary>
+            Sends a message. 
+            </summary>
+            <exception cref="T:System.ArgumentNullException">If the message is null</exception>
+            <param name="message">Message instance</param>
+        </member>
+        <member name="M:Castle.Core.Smtp.DefaultSmtpSender.Configure(System.Net.Mail.SmtpClient)">
+            <summary>
+            Configures the sender
+            with port information and eventual credential
+            informed
+            </summary>
+            <param name="smtpClient">Message instance</param>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.Port">
+            <summary>
+            Gets or sets the port used to 
+            access the SMTP server
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.Hostname">
+            <summary>
+            Gets the hostname.
+            </summary>
+            <value>The hostname.</value>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.AsyncSend">
+            <summary>
+            Gets or sets a value which is used to 
+            configure if emails are going to be sent asyncrhonously or not.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.Timeout">
+            <summary>
+            Gets or sets a value that specifies 
+            the amount of time after which a synchronous Send call times out.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.UseSsl">
+            <summary>
+            Gets or sets a value indicating whether the email should be sent using 
+            a secure communication channel.
+            </summary>
+            <value><c>true</c> if should use SSL; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.Domain">
+            <summary>
+            Gets or sets the domain.
+            </summary>
+            <value>The domain.</value>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.UserName">
+            <summary>
+            Gets or sets the name of the user.
+            </summary>
+            <value>The name of the user.</value>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.Password">
+            <summary>
+            Gets or sets the password.
+            </summary>
+            <value>The password.</value>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.HasCredentials">
+            <summary>
+            Gets a value indicating whether credentials were informed.
+            </summary>
+            <value>
+            <see langword="true"/> if this instance has credentials; otherwise, <see langword="false"/>.
+            </value>
+        </member>
+    </members>
+</doc>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Redist/Castle/Castle.Windsor.XML	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,7741 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>Castle.Windsor</name>
+    </assembly>
+    <members>
+        <member name="T:Castle.MicroKernel.ComponentActivator.WebUserControlComponentActivator">
+            <summary>
+            Attempts to dynamically load a UserControl by invoking Page.LoadControl.  
+            There are two uses of this class.  
+            <para>
+            1) Add a component to the Kernel and add a VirtualPath attribute specifying 
+            the relative path of the .ascx file for the associated UserControl. (easy)
+            </para>
+            <example>
+              <code>
+                &lt;component id="BasketView" 
+                  service="Castle.ShoppingCart.IBasketView, Castle.ShoppingCart"
+                  type="Castle.ShoppingCart.BasketView, Castle.ShoppingCart" 
+                  lifestyle="transient"
+                  virtualPath="~/Views/BasketView.ascx"
+                /&gt;
+              </code>
+            </example>
+            <para>
+            2) Precompile a UserControl and add the pre-compiled class to the Kernel. (hard)  
+            Has not been tested with proxies.
+            </para>
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.ComponentActivator.DefaultComponentActivator">
+            <summary>
+            Standard implementation of <see cref="T:Castle.MicroKernel.IComponentActivator"/>.
+            Handles the selection of the best constructor, fills the
+            writable properties the component exposes, run the commission 
+            and decommission lifecycles, etc.
+            </summary>
+            <remarks>
+            Custom implementors can just override the <c>CreateInstance</c> method.
+            Please note however that the activator is responsible for the proxy creation
+            when needed.
+            </remarks>
+        </member>
+        <member name="T:Castle.MicroKernel.ComponentActivator.AbstractComponentActivator">
+            <summary>
+            Abstract implementation of <see cref="T:Castle.MicroKernel.IComponentActivator"/>.
+            The implementors must only override the InternalCreate and 
+            InternalDestroy methods in order to perform their creation and
+            destruction logic.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.IComponentActivator">
+            <summary>
+            Implements the instance creation logic. The default
+            implementation should rely on an ordinary call to 
+            Activator.CreateInstance(). 
+            </summary>
+            <remarks>
+            This interface is provided in order to allow custom components
+            to be created using a different logic, such as using a specific factory
+            or builder.
+            <para>
+            The constructor for implementation has the following signature:
+            </para>
+            <code>
+            ComponentModel model, IKernel kernel, 
+            ComponentInstanceDelegate onCreation, 
+            ComponentInstanceDelegate onDestruction
+            </code>
+            <para>
+            The Activator should raise the events onCreation and onDestruction
+            in order to correctly implement the contract. Usually the best
+            way of creating a custom activator is by extending the existing ones.
+            </para>
+            <seealso cref="T:Castle.MicroKernel.ComponentActivator.AbstractComponentActivator"/>
+            <seealso cref="T:Castle.MicroKernel.ComponentActivator.DefaultComponentActivator"/>
+            </remarks>
+        </member>
+        <member name="M:Castle.MicroKernel.IComponentActivator.Create(Castle.MicroKernel.Context.CreationContext)">
+            <summary>
+            Should return a new component instance.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IComponentActivator.Destroy(System.Object)">
+            <summary>
+            Should perform all necessary work to dispose the instance
+            and/or any resource related to it.
+            </summary>
+            <param name="instance"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.ComponentActivator.AbstractComponentActivator.#ctor(Castle.Core.ComponentModel,Castle.MicroKernel.IKernel,Castle.MicroKernel.ComponentInstanceDelegate,Castle.MicroKernel.ComponentInstanceDelegate)">
+            <summary>
+            Constructs an AbstractComponentActivator
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.#ctor(Castle.Core.ComponentModel,Castle.MicroKernel.IKernel,Castle.MicroKernel.ComponentInstanceDelegate,Castle.MicroKernel.ComponentInstanceDelegate)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.MicroKernel.ComponentActivator.DefaultComponentActivator"/> class.
+            </summary>
+            <param name="model"></param>
+            <param name="kernel"></param>
+            <param name="onCreation"></param>
+            <param name="onDestruction"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.ComponentActivator.WebUserControlComponentActivator.#ctor(Castle.Core.ComponentModel,Castle.MicroKernel.IKernel,Castle.MicroKernel.ComponentInstanceDelegate,Castle.MicroKernel.ComponentInstanceDelegate)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.ComponentActivator.WebUserControlComponentActivator"/> class.
+            </summary>
+            <param name="model">The model.</param>
+            <param name="kernel">The kernel.</param>
+            <param name="onCreation">The on creation.</param>
+            <param name="onDestruction">The on destruction.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.ComponentActivator.WebUserControlComponentActivator.CreateInstance(Castle.MicroKernel.Context.CreationContext,System.Object[],System.Type[])">
+            <summary>
+            Creates the instance.
+            </summary>
+            <param name="context">The context.</param>
+            <param name="arguments">The arguments.</param>
+            <param name="signature">The signature.</param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleManager">
+            <summary>
+            Implements a Lifestyle Manager for Web Apps that
+            create at most one object per web request.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Lifestyle.AbstractLifestyleManager">
+            <summary>
+            Summary description for AbstractLifestyleManager.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.ILifestyleManager">
+            <summary>
+            The <c>ILifestyleManager</c> implements 
+            a strategy for a given lifestyle, like singleton, per-thread
+            and transient.
+            </summary>
+            <remarks>
+            The responsibility of <c>ILifestyleManager</c>
+            is only the management of lifestyle. It should rely on
+            <see cref="T:Castle.MicroKernel.IComponentActivator"/> to obtain a new component instance
+            </remarks>
+        </member>
+        <member name="M:Castle.MicroKernel.ILifestyleManager.Init(Castle.MicroKernel.IComponentActivator,Castle.MicroKernel.IKernel,Castle.Core.ComponentModel)">
+            <summary>
+            Initializes the <c>ILifestyleManager</c> with the 
+            <see cref="T:Castle.MicroKernel.IComponentActivator"/>
+            </summary>
+            <param name="componentActivator"></param>
+            <param name="kernel"></param>
+            <param name="model"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.ILifestyleManager.Resolve(Castle.MicroKernel.Context.CreationContext)">
+            <summary>
+            Implementors should return the component instance based 
+            on the lifestyle semantic.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.ILifestyleManager.Release(System.Object)">
+            <summary>
+            Implementors should release the component instance based
+            on the lifestyle semantic, for example, singleton components
+            should not be released on a call for release, instead they should
+            release them when disposed is invoked.
+            </summary>
+            <param name="instance"></param>
+        </member>
+        <member name="T:Castle.Core.CastleComponentAttribute">
+            <summary>
+            This attribute is useful only when you want to register all components
+            on an assembly as a batch process. 
+            By doing so, the batch register will look 
+            for this attribute to distinguish components from other classes.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.LifestyleAttribute">
+            <summary>
+            Base for Attributes that want to express lifestyle
+            chosen by the component.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.LifestyleAttribute.#ctor(Castle.Core.LifestyleType)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Core.LifestyleAttribute"/> class.
+            </summary>
+            <param name="type">The type.</param>
+        </member>
+        <member name="P:Castle.Core.LifestyleAttribute.Lifestyle">
+            <summary>
+            Gets or sets the lifestyle.
+            </summary>
+            <value>The lifestyle.</value>
+        </member>
+        <member name="T:Castle.Core.ComponentActivatorAttribute">
+            <summary>
+            Associates a custom component with a component
+            </summary>
+        </member>
+        <member name="M:Castle.Core.ComponentActivatorAttribute.#ctor(System.Type)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Core.ComponentActivatorAttribute"/> class.
+            </summary>
+            <param name="componentActivatorType">Type of the component activator.</param>
+        </member>
+        <member name="P:Castle.Core.ComponentActivatorAttribute.ComponentActivatorType">
+            <summary>
+            Gets the type of the component activator.
+            </summary>
+            <value>The type of the component activator.</value>
+        </member>
+        <member name="T:Castle.Core.ComponentProxyBehaviorAttribute">
+            <summary>
+            Specifies the proxying behavior for a component.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.ComponentProxyBehaviorAttribute.UseMarshalByRefProxy">
+            <summary>
+            Gets or sets a value indicating whether the generated 
+            interface proxy should inherit from <see cref="T:System.MarshalByRefObject"/>.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.ComponentProxyBehaviorAttribute.UseSingleInterfaceProxy">
+            <summary>
+            Determines if the component requires a single interface proxy.
+            </summary>
+            <value><c>true</c> if the component requires a single interface proxy.</value>
+        </member>
+        <member name="P:Castle.Core.ComponentProxyBehaviorAttribute.AdditionalInterfaces">
+            <summary>
+             Gets or sets the additional interfaces used during proxy generation.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.DoNotWireAttribute">
+            <summary>
+            Marks as property to be skipped and not be wired
+            by the IoC container
+            </summary>
+        </member>
+        <member name="T:Castle.Core.ILifecycleConcern">
+            <summary>
+            Represents a concern that will be applied to a component instance
+            during commission or decommission phase. 
+            </summary>
+        </member>
+        <member name="M:Castle.Core.ILifecycleConcern.Apply(Castle.Core.ComponentModel,System.Object)">
+            <summary>
+            Implementors should act on the instance in response to 
+            a decommission or commission phase. 
+            </summary>
+            <param name="model">The model.</param>
+            <param name="component">The component.</param>
+        </member>
+        <member name="T:Castle.Core.IInitializable">
+            <summary>
+            Lifecycle interface. If implemented by a component,
+            the method Initialized will be invoked by the container
+            before making the component available to the external world.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.IInitializable.Initialize">
+            <summary>
+            Implementors should perform any initialization logic.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.InterceptorAttribute">
+            <summary>
+              Used to declare that a component wants interceptors acting on it.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.InterceptorAttribute.#ctor(System.String)">
+            <summary>
+              Constructs the InterceptorAttribute pointing to
+              a key to a interceptor
+            </summary>
+            <param name = "componentKey"></param>
+        </member>
+        <member name="M:Castle.Core.InterceptorAttribute.#ctor(System.Type)">
+            <summary>
+              Constructs the InterceptorAttribute pointing to
+              a service
+            </summary>
+            <param name = "interceptorType"></param>
+        </member>
+        <member name="T:Castle.Core.Internal.LateBoundComponent">
+            <summary>
+            Marker class used to denote components that have late bound type
+            That is the actual type is not known exactly at the time when <see cref="T:Castle.Core.ComponentModel"/>
+            is created. Those are for example components instantiated via abstract factory.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Internal.ReflectionUtil.GetCompatibleArrayItemType(System.Type)">
+            <summary>
+            If the extended type is a Foo[] or IEnumerable{Foo} which is assignable from Foo[] this method will return typeof(Foo)
+            otherwise <c>null</c>.
+            </summary>
+            <param name="type"></param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.SingletonAttribute">
+            <summary>
+            Indicates that the target components wants a
+            singleton lifestyle.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.SingletonAttribute.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Core.SingletonAttribute"/> class.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.TransientAttribute">
+            <summary>
+            Indicates that the target components wants a
+            transient lifestyle.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.TransientAttribute.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Core.TransientAttribute"/> class.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.PerThreadAttribute">
+            <summary>
+            Indicates that the target components wants a
+            per thread lifestyle.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.PerThreadAttribute.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Core.PerThreadAttribute"/> class.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.PerWebRequestAttribute">
+            <summary>
+            Indicates that the target components wants a
+            per web request lifestyle.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.PooledAttribute">
+            <summary>
+            Indicates that the target components wants a
+            pooled lifestyle.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.PooledAttribute.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Core.PooledAttribute"/> class
+            using the default initial pool size (5) and the max pool size (15).
+            </summary>
+        </member>
+        <member name="M:Castle.Core.PooledAttribute.#ctor(System.Int32,System.Int32)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Core.PooledAttribute"/> class.
+            </summary>
+            <param name="initialPoolSize">Initial size of the pool.</param>
+            <param name="maxPoolSize">Max pool size.</param>
+        </member>
+        <member name="P:Castle.Core.PooledAttribute.InitialPoolSize">
+            <summary>
+            Gets the initial size of the pool.
+            </summary>
+            <value>The initial size of the pool.</value>
+        </member>
+        <member name="P:Castle.Core.PooledAttribute.MaxPoolSize">
+            <summary>
+            Gets the maximum pool size.
+            </summary>
+            <value>The size of the max pool.</value>
+        </member>
+        <member name="T:Castle.Core.CustomLifestyleAttribute">
+            <summary>
+            Indicates that the target components wants a
+            custom lifestyle.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.CustomLifestyleAttribute.#ctor(System.Type)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Core.CustomLifestyleAttribute"/> class.
+            </summary>
+            <param name="lifestyleHandlerType">The lifestyle handler.</param>
+        </member>
+        <member name="P:Castle.Core.CustomLifestyleAttribute.LifestyleHandlerType">
+            <summary>
+            Gets the type of the lifestyle handler.
+            </summary>
+            <value>The type of the lifestyle handler.</value>
+        </member>
+        <member name="T:Castle.Core.LifestyleType">
+            <summary>
+            Enumeration used to mark the component's lifestyle.
+            </summary>
+        </member>
+        <member name="F:Castle.Core.LifestyleType.Undefined">
+            <summary>
+            No lifestyle specified.
+            </summary>
+        </member>
+        <member name="F:Castle.Core.LifestyleType.Singleton">
+            <summary>
+            Singleton components are instantiated once, and shared
+            between all clients.
+            </summary>
+        </member>
+        <member name="F:Castle.Core.LifestyleType.Thread">
+            <summary>
+            Thread components have a unique instance per thread.
+            </summary>
+        </member>
+        <member name="F:Castle.Core.LifestyleType.Transient">
+            <summary>
+            Transient components are created on demand.
+            </summary>
+        </member>
+        <member name="F:Castle.Core.LifestyleType.Pooled">
+            <summary>
+            Optimization of transient components that keeps
+            instance in a pool instead of always creating them.
+            </summary>
+        </member>
+        <member name="F:Castle.Core.LifestyleType.PerWebRequest">
+            <summary>
+            PerWebRequest components are created once per Http Request
+            </summary>
+        </member>
+        <member name="F:Castle.Core.LifestyleType.Custom">
+            <summary>
+            Any other logic to create/release components.
+            </summary>
+        </member>
+        <member name="T:Castle.Facilities.EventWiring.EventSubscribers">
+            <summary>
+            Collects information about subscribers for given event
+            </summary>
+        </member>
+        <member name="T:Castle.Facilities.EventWiring.NaiveMethodNameExtractor">
+            <summary>
+            Extracts MethodInfo of metho invoked in delegate. Based on ILReader class from http://www.gocosmos.org project
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.ModelBuilder.IContributeComponentModelConstruction">
+            <summary>
+            Implementors must inspect the component for 
+            a given information or parameter.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.ModelBuilder.IContributeComponentModelConstruction.ProcessModel(Castle.MicroKernel.IKernel,Castle.Core.ComponentModel)">
+            <summary>
+            Usually the implementation will look in the configuration property 
+            of the model or the service interface, or the implementation looking for
+            something.
+            </summary>
+            <param name="kernel">The kernel instance</param>
+            <param name="model">The component model</param>
+        </member>
+        <member name="M:Castle.Facilities.TypedFactory.ITypedFactoryComponentSelector.SelectComponent(System.Reflection.MethodInfo,System.Type,System.Object[])">
+            <summary>
+            Selects one or both of component name and type, for given method 
+            called on given typed factory type.
+            When component should be requested by type only,
+            componentName should be null.
+            When component should be requested by name only,
+            componentType should be null.
+            </summary>
+            <param name="method"></param>
+            <param name="type"></param>
+            <param name="arguments"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Facilities.TypedFactory.DefaultTypedFactoryComponentSelector.BuildFactoryComponent(System.Reflection.MethodInfo,System.String,System.Type,System.Collections.IDictionary)">
+            <summary>
+              Builds <see cref="T:Castle.Facilities.TypedFactory.TypedFactoryComponent"/> for given call.
+              By default if <paramref name="componentType"/> is a collection
+              returns <see cref="T:Castle.Facilities.TypedFactory.TypedFactoryComponentCollection"/> for the collection's item type,
+              otherwise standard <see cref="T:Castle.Facilities.TypedFactory.TypedFactoryComponent"/>.
+            </summary>
+            <param name="method"></param>
+            <param name="componentName"></param>
+            <param name="componentType"></param>
+            <param name="additionalArguments"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Facilities.TypedFactory.DefaultTypedFactoryComponentSelector.GetArguments(System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+              Selects arguments to be passed to resolution pipeline.
+              By default passes all given <paramref name = "arguments" /> 
+              keyed by names of their corresponding <paramref name = "method" /> parameters.
+            </summary>
+            <param name = "method"></param>
+            <param name = "arguments"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Facilities.TypedFactory.DefaultTypedFactoryComponentSelector.GetComponentName(System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+              Selects name of the component to resolve.
+              If <paramref name = "method" /> Name is GetFoo returns "Foo", otherwise <c>null</c>.
+            </summary>
+            <param name = "method"></param>
+            <param name = "arguments"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Facilities.TypedFactory.DefaultTypedFactoryComponentSelector.GetComponentType(System.Reflection.MethodInfo,System.Object[])">
+            <summary>
+              Selects type of the component to resolve. Uses <paramref name = "method" /> return type.
+            </summary>
+            <param name = "method"></param>
+            <param name = "arguments"></param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.MicroKernel.Resolvers.ILazyComponentLoader">
+            <summary>
+            Provides lazy registration capabilities to the container.
+            </summary>
+            <remarks>
+            When a component is requested from a container and it was not registered, 
+            container loads up all registered implementers of this interface and asks 
+            them in turn whether they can provide that component, until it finds one that will.
+            </remarks>
+        </member>
+        <member name="M:Castle.MicroKernel.Resolvers.ILazyComponentLoader.Load(System.String,System.Type,System.Collections.IDictionary)">
+            <summary>
+            Used by container to allow the loader to register component for given <paramref name="key"/> and <paramref name="service"/> to the container at the time when it is requested
+            </summary>
+            <param name="key">Key of the requested component or null</param>
+            <param name="service">Type of requested service or null</param>
+            <param name="arguments">User supplied arguments or null</param>
+            <returns>Registration that registers component for given key and/or service or null.</returns>
+            <remarks>
+            While either key or service can be null reference it is guaranteed that at least one of them will not be null.
+            When implementer opts in to provide the requested component (by returning not-null registration) it is required
+            to register component for requested key/service combination (when one of the elements is null, it should be ignored as well).
+            When implementer does not want to register the requested component it must return null.
+            </remarks>
+        </member>
+        <member name="T:Castle.MicroKernel.ComponentActivator.ComponentActivatorException">
+            <summary>
+            Summary description for ComponentActivatorException.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Burden">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Arguments">
+            <summary>
+            Represents collection of arguments used when resolving a component.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.ComponentActivator.NoResolvableConstructorFoundException">
+            <summary>
+            Exception thrown when component has no resolvable constructor that can be used to create an instance.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Context.FallbackArgumentsStore">
+            <summary>
+            Default arguments store used to store items where no specialized store exists
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Context.DependencyTrackingScope.DependencyModelExtended">
+            <summary>
+            Extends <see cref="T:Castle.Core.DependencyModel"/> adding <see cref="T:System.Reflection.MemberInfo"/> and <see cref="T:Castle.Core.ComponentModel"/>
+            information. The MemberInfo is only useful to provide detailed information 
+            on exceptions. 
+            The ComponentModel is required so we can get resolve an object that takes as a parameter itself, but
+            with difference model. (See IoC 51 for the details)
+            </summary>
+        </member>
+        <member name="T:Castle.Core.DependencyModel">
+            <summary>
+              Represents a dependency (other component or a 
+              fixed value available through external configuration).
+            </summary>
+        </member>
+        <member name="M:Castle.Core.DependencyModel.#ctor(Castle.Core.DependencyType,System.String,System.Type,System.Boolean)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.Core.DependencyModel"/> class.
+            </summary>
+            <param name="dependencyType">The type.</param>
+            <param name="dependencyKey">The dependency key.</param>
+            <param name="targetType">Type of the target.</param>
+            <param name="isOptional">if set to <c>true</c> [is optional].</param>
+        </member>
+        <member name="M:Castle.Core.DependencyModel.ToString">
+            <summary>
+              Returns a <see cref = "T:System.String" /> that represents the current <see cref = "T:System.Object" />.
+            </summary>
+            <returns>
+              A <see cref = "T:System.String" /> that represents the current <see cref = "T:System.Object" />.
+            </returns>
+        </member>
+        <member name="P:Castle.Core.DependencyModel.DependencyKey">
+            <summary>
+              Gets or sets the dependency key.
+            </summary>
+            <value>The dependency key.</value>
+        </member>
+        <member name="P:Castle.Core.DependencyModel.DependencyType">
+            <summary>
+              Gets or sets the type of the dependency.
+            </summary>
+            <value>The type of the dependency.</value>
+        </member>
+        <member name="P:Castle.Core.DependencyModel.IsOptional">
+            <summary>
+              Gets or sets whether this dependency is optional.
+            </summary>
+            <value>
+              <c>true</c> if this dependency is optional; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="P:Castle.Core.DependencyModel.TargetItemType">
+            <summary>
+              Gets the service type of the dependency.
+              This is the same type as <see cref="P:Castle.Core.DependencyModel.TargetType"/> or if <see cref="P:Castle.Core.DependencyModel.TargetType"/> is by ref,
+              then it's the element type of the reference. (in other words if dependency 
+              is <c>out IFoo foo</c> this will be <c>IFoo</c>, while <see cref="P:Castle.Core.DependencyModel.TargetType"/> will be <c>&amp;IFoo</c>);
+            </summary>
+        </member>
+        <member name="P:Castle.Core.DependencyModel.TargetType">
+            <summary>
+              Gets the type of the target.
+            </summary>
+            <value>The type of the target.</value>
+        </member>
+        <member name="T:Castle.MicroKernel.Handlers.DefaultHandler">
+            <summary>
+            Summary description for DefaultHandler.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Handlers.AbstractHandler">
+            <summary>
+              Implements the basis of
+              <see cref="T:Castle.MicroKernel.IHandler"/>
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.IHandler">
+            <summary>
+            Contract for the IHandler, which manages an
+            component state and coordinates its creation 
+            and destruction (dispatching to activators, lifestyle managers)
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.ISubDependencyResolver">
+            <summary>
+            Implementors should use a strategy to obtain 
+            valid references to properties and/or services 
+            requested in the dependency model.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.ISubDependencyResolver.Resolve(Castle.MicroKernel.Context.CreationContext,Castle.MicroKernel.ISubDependencyResolver,Castle.Core.ComponentModel,Castle.Core.DependencyModel)">
+            <summary>
+            Should return an instance of a service or property values as
+            specified by the dependency model instance. 
+            It is also the responsibility of <see cref="T:Castle.MicroKernel.IDependencyResolver"/>
+            to throw an exception in the case a non-optional dependency 
+            could not be resolved.
+            </summary>
+            <param name="context">Creation context, which is a resolver itself</param>
+            <param name="contextHandlerResolver">Parent resolver - normally the IHandler implementation</param>
+            <param name="model">Model of the component that is requesting the dependency</param>
+            <param name="dependency">The dependency model</param>
+            <returns>The dependency resolved value or null</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.ISubDependencyResolver.CanResolve(Castle.MicroKernel.Context.CreationContext,Castle.MicroKernel.ISubDependencyResolver,Castle.Core.ComponentModel,Castle.Core.DependencyModel)">
+            <summary>
+            Returns true if the resolver is able to satisfy this dependency.
+            </summary>
+            <param name="context">Creation context, which is a resolver itself</param>
+            <param name="contextHandlerResolver">Parent resolver - normally the IHandler implementation</param>
+            <param name="model">Model of the component that is requesting the dependency</param>
+            <param name="dependency">The dependency model</param>
+            <returns><c>true</c> if the dependency can be satisfied</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IHandler.Init(Castle.MicroKernel.IKernel)">
+            <summary>
+            Initializes the handler with a reference to the
+            kernel.
+            </summary>
+            <param name="kernel"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.IHandler.Resolve(Castle.MicroKernel.Context.CreationContext)">
+            <summary>
+            Implementors should return a valid instance 
+            for the component the handler is responsible.
+            It should throw an exception in the case the component
+            can't be created for some reason
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IHandler.TryResolve(Castle.MicroKernel.Context.CreationContext)">
+            <summary>
+            Implementors should return a valid instance 
+            for the component the handler is responsible.
+            It should return null in the case the component
+            can't be created for some reason
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IHandler.Release(System.Object)">
+            <summary>
+            Implementors should dispose the component instance
+            </summary>
+            <param name="instance"></param>
+            <returns>true if destroyed.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IHandler.AddCustomDependencyValue(System.Object,System.Object)">
+            <summary>
+            Dictionary of String/object used to 
+            associate data with a component dependency.
+            For example, if you component SmtpServer depends on 
+            host and port, you can add those to this
+            dictionary and the handler will be able to use them.
+            </summary>
+            <remarks>
+            TODO: Document this
+            </remarks>
+        </member>
+        <member name="M:Castle.MicroKernel.IHandler.RemoveCustomDependencyValue(System.Object)">
+            <summary>
+            TODO: Document this
+            </summary>
+            <param name="key"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.IHandler.HasCustomParameter(System.Object)">
+            <summary>
+            TODO: Document this
+            </summary>
+            <param name="key"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IHandler.IsBeingResolvedInContext(Castle.MicroKernel.Context.CreationContext)">
+            <summary>
+            Tests whether the handler is already being resolved in given context.
+            </summary>
+        </member>
+        <member name="P:Castle.MicroKernel.IHandler.CurrentState">
+            <summary>
+            Gets the state of the handler
+            </summary>
+        </member>
+        <member name="P:Castle.MicroKernel.IHandler.ComponentModel">
+            <summary>
+            Gets the model of the component being 
+            managed by this handler.
+            </summary>
+        </member>
+        <member name="P:Castle.MicroKernel.IHandler.Service">
+            <summary>
+            The service that this handler handles
+            </summary>
+        </member>
+        <member name="E:Castle.MicroKernel.IHandler.OnHandlerStateChanged">
+            <summary>
+            Allow to track state changes of a handler that is modified directly.
+            This can happen if the client calls AddCustomDependencyValue or 
+            RemoveCustomDependencyValue
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Handlers.IExposeDependencyInfo">
+            <summary>
+            Might be implemented by a handler 
+            so it can expose access to dependency information 
+            which is used to construct meaningful error messages
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Handlers.IExposeDependencyInfo.ObtainDependencyDetails(System.Collections.IList)">
+            <summary>
+            Returns human readable list of dependencies 
+            this handler is waiting for.
+            <param name="dependenciesChecked">list of the dependencies that was already checked, used to avoid cycles.</param>
+            </summary>
+        </member>
+        <member name="F:Castle.MicroKernel.Handlers.AbstractHandler.lifestyleManager">
+            <summary>
+              Lifestyle manager instance
+            </summary>
+        </member>
+        <member name="F:Castle.MicroKernel.Handlers.AbstractHandler.customParameters">
+            <summary>
+              Custom dependencies values associated with the handler
+            </summary>
+        </member>
+        <member name="F:Castle.MicroKernel.Handlers.AbstractHandler.dependenciesByKey">
+            <summary>
+              Dictionary of key (string) to
+              <see cref="T:Castle.Core.DependencyModel"/>
+            </summary>
+        </member>
+        <member name="F:Castle.MicroKernel.Handlers.AbstractHandler.dependenciesByService">
+            <summary>
+              Dictionary of Type to a list of
+              <see cref="T:Castle.Core.DependencyModel"/>
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Handlers.AbstractHandler.#ctor(Castle.Core.ComponentModel)">
+            <summary>
+              Constructs and initializes the handler
+            </summary>
+            <param name = "model"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.Handlers.AbstractHandler.ReleaseCore(System.Object)">
+            <summary>
+              Should be implemented by derived classes: 
+              disposes the component instance (or recycle it)
+            </summary>
+            <param name = "instance"></param>
+            <returns>true if destroyed.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Handlers.AbstractHandler.ResolveCore(Castle.MicroKernel.Context.CreationContext,System.Boolean,System.Boolean)">
+            <summary>
+              Should be implemented by derived classes: 
+              returns an instance of the component this handler
+              is responsible for
+            </summary>
+            <param name = "context"></param>
+            <param name = "requiresDecommission"></param>
+            <param name = "instanceRequired">When <c>false</c>, handler can not create valid instance and return <c>null</c> instead.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Handlers.AbstractHandler.ObtainDependencyDetails(System.Collections.IList)">
+            <summary>
+              Returns human readable list of dependencies 
+              this handler is waiting for.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Handlers.AbstractHandler.Init(Castle.MicroKernel.IKernel)">
+            <summary>
+              Saves the kernel instance, subscribes to
+              <see cref="E:Castle.MicroKernel.IKernelEvents.AddedAsChildKernel"/>
+              event,
+              creates the lifestyle manager instance and computes
+              the handler state.
+            </summary>
+            <param name="kernel"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.Handlers.AbstractHandler.Release(System.Object)">
+            <summary>
+              disposes the component instance (or recycle it).
+            </summary>
+            <param name = "instance"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Handlers.AbstractHandler.Resolve(Castle.MicroKernel.Context.CreationContext)">
+            <summary>
+              Returns an instance of the component this handler
+              is responsible for
+            </summary>
+            <param name = "context"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Handlers.AbstractHandler.AddDependency(Castle.Core.DependencyModel)">
+            <summary>
+              Invoked by
+              <see cref="M:Castle.MicroKernel.Handlers.AbstractHandler.EnsureDependenciesCanBeSatisfied(Castle.MicroKernel.ComponentActivator.IDependencyAwareActivator)"/>
+              in order to check if a dependency can be satisfied.
+              If not, the handler is set to a 'waiting dependency' state.
+            </summary>
+            <remarks>
+              This method registers the dependencies within the correct collection 
+              or dictionary and changes the handler state to
+              <see cref="F:Castle.MicroKernel.HandlerState.WaitingDependency"/>
+            </remarks>
+            <param name="dependency"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.Handlers.AbstractHandler.CreateLifestyleManager(Castle.MicroKernel.IComponentActivator)">
+            <summary>
+              Creates an implementation of
+              <see cref="T:Castle.MicroKernel.ILifestyleManager"/>
+              based
+              on
+              <see cref="T:Castle.Core.LifestyleType"/>
+              and invokes
+              <see cref="M:Castle.MicroKernel.ILifestyleManager.Init(Castle.MicroKernel.IComponentActivator,Castle.MicroKernel.IKernel,Castle.Core.ComponentModel)"/>
+              to initialize the newly created manager.
+            </summary>
+            <param name="activator"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Handlers.AbstractHandler.DependencySatisfied(System.Boolean@)">
+            <summary>
+              Invoked by the kernel
+              when one of registered dependencies were satisfied by 
+              new components registered.
+            </summary>
+            <remarks>
+              Handler for the event
+              <see cref="E:Castle.MicroKernel.IKernelEvents.HandlerRegistered"/>
+            </remarks>
+            <param name="stateChanged"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.Handlers.AbstractHandler.EnsureDependenciesCanBeSatisfied(Castle.MicroKernel.ComponentActivator.IDependencyAwareActivator)">
+            <summary>
+              Checks if the handler is able to, at very least, satisfy
+              the dependencies for the constructor with less parameters
+            </summary>
+            <remarks>
+              For each non*optional dependency, the implementation will invoke
+              <see cref="M:Castle.MicroKernel.Handlers.AbstractHandler.AddDependency(Castle.Core.DependencyModel)"/>
+            </remarks>
+        </member>
+        <member name="M:Castle.MicroKernel.Handlers.AbstractHandler.OnAddedAsChildKernel(System.Object,System.EventArgs)">
+            <summary>
+              Invoked when the container receives a parent container reference.
+            </summary>
+            <remarks>
+              This method implementation checks whether the parent container
+              is able to supply the dependencies for this handler.
+            </remarks>
+            <param name = "sender"></param>
+            <param name = "e"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.Handlers.AbstractHandler.Resolve(Castle.MicroKernel.Context.CreationContext,System.Boolean)">
+            <summary>
+              Returns an instance of the component this handler
+              is responsible for
+            </summary>
+            <param name = "context"></param>
+            <param name = "instanceRequired">when <c>false</c>, handler can not create valid instance and return <c>null</c> instead </param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Handlers.AbstractHandler.HandlerStateChanged(System.Object,System.EventArgs)">
+            <summary>
+              Handler for the event
+              <see cref="E:Castle.MicroKernel.Handlers.AbstractHandler.OnHandlerStateChanged"/>
+            </summary>
+            <param name="source"></param>
+            <param name="args"></param>
+        </member>
+        <member name="P:Castle.MicroKernel.Handlers.AbstractHandler.ComponentModel">
+            <summary>
+              Gets the component model.
+            </summary>
+        </member>
+        <member name="P:Castle.MicroKernel.Handlers.AbstractHandler.CurrentState">
+            <summary>
+              Gets the handler state.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Handlers.DefaultHandler.#ctor(Castle.Core.ComponentModel)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.Handlers.DefaultHandler"/> class.
+            </summary>
+            <param name="model"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.Handlers.DefaultHandler.ResolveCore(Castle.MicroKernel.Context.CreationContext,System.Boolean,System.Boolean)">
+            <summary>
+            Returns an instance of the component this handler
+            is responsible for
+            </summary>
+            <param name="context"></param>
+            <param name="requiresDecommission"></param>
+            <param name="instanceRequired"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Handlers.DefaultHandler.ReleaseCore(System.Object)">
+            <summary>
+            disposes the component instance (or recycle it)
+            </summary>
+            <param name="instance"></param>
+            <returns>true if destroyed</returns>
+        </member>
+        <member name="T:Castle.MicroKernel.Context.CreationContext">
+            <summary>
+              Used during a component request, passed along to the whole process.
+              This allow some data to be passed along the process, which is used 
+              to detected cycled dependency graphs and now it's also being used
+              to provide arguments to components.
+            </summary>
+        </member>
+        <member name="F:Castle.MicroKernel.Context.CreationContext.dependencies">
+            <summary>
+              Holds the scoped dependencies being resolved. 
+              If a dependency appears twice on the same scope, we'd have a cycle.
+            </summary>
+        </member>
+        <member name="F:Castle.MicroKernel.Context.CreationContext.handlerStack">
+            <summary>
+              The list of handlers that are used to resolve
+              the component.
+              We track that in order to try to avoid attempts to resolve a service
+              with itself.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Context.CreationContext.#ctor(System.Type,Castle.MicroKernel.Context.CreationContext,System.Boolean)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.MicroKernel.Context.CreationContext"/> class.
+            </summary>
+            <param name="typeToExtractGenericArguments">The type to extract generic arguments.</param>
+            <param name="parentContext">The parent context.</param>
+            <param name="propagateInlineDependencies">When set to <c>true</c> will clone <paramref name="parentContext"/> <see cref="P:Castle.MicroKernel.Context.CreationContext.AdditionalParameters"/>.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.Context.CreationContext.#ctor(Castle.MicroKernel.IHandler,Castle.MicroKernel.IReleasePolicy,System.Type,System.Collections.IDictionary,Castle.MicroKernel.SubSystems.Conversion.ITypeConverter,Castle.MicroKernel.Context.CreationContext)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.MicroKernel.Context.CreationContext"/> class.
+            </summary>
+            <param name="handler">The handler.</param>
+            <param name="releasePolicy">The release policy.</param>
+            <param name="typeToExtractGenericArguments">The type to extract generic arguments.</param>
+            <param name="additionalArguments">The additional arguments.</param>
+            <param name="conversionManager">The conversion manager.</param>
+            <param name="parent">Parent context</param>
+        </member>
+        <member name="M:Castle.MicroKernel.Context.CreationContext.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.MicroKernel.Context.CreationContext"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Context.CreationContext.IsInResolutionContext(Castle.MicroKernel.IHandler)">
+            <summary>
+              Method used by handlers to test whether they are being resolved in the context.
+            </summary>
+            <param name="handler"></param>
+            <returns></returns>
+            <remarks>
+              This method is provided as part of double dispatch mechanism for use by handlers.
+              Outside of handlers, call <see cref="M:Castle.MicroKernel.IHandler.IsBeingResolvedInContext(Castle.MicroKernel.Context.CreationContext)"/> instead.
+            </remarks>
+        </member>
+        <member name="P:Castle.MicroKernel.Context.CreationContext.Empty">
+            <summary>
+              Creates a new, empty <see cref="T:Castle.MicroKernel.Context.CreationContext"/> instance.
+            </summary>
+            <remarks>
+              A new CreationContext should be created every time, as the contexts keeps some state related to dependency resolution.
+            </remarks>
+        </member>
+        <member name="T:Castle.MicroKernel.DefaultKernel">
+            <summary>
+              Default implementation of <see cref="T:Castle.MicroKernel.IKernel"/>. 
+              This implementation is complete and also support a kernel 
+              hierarchy (sub containers).
+            </summary>
+            <summary>
+              Default implementation of <see cref="T:Castle.MicroKernel.IKernel"/>. 
+              This implementation is complete and also support a kernel 
+              hierarchy (sub containers).
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.IKernel">
+            <summary>
+            The <c>IKernel</c> interface exposes all the functionality
+            the MicroKernel implements.
+            </summary>
+            <remarks>
+            It allows you to register components and
+            request them by the key or the service they implemented.
+            It also allow you to register facilities and subsystem, thus 
+            augmenting the functionality exposed by the kernel alone to fits 
+            your needs.
+            <seealso cref="T:Castle.MicroKernel.IFacility"/>
+            <seealso cref="T:Castle.MicroKernel.ISubSystem"/>
+            </remarks>
+        </member>
+        <member name="T:Castle.MicroKernel.IKernelEvents">
+            <summary>
+            Summary description for IKernelEvents.
+            </summary>
+        </member>
+        <member name="E:Castle.MicroKernel.IKernelEvents.ComponentRegistered">
+            <summary>
+            Event fired when a new component is registered 
+            on the kernel.
+            </summary>
+        </member>
+        <member name="E:Castle.MicroKernel.IKernelEvents.ComponentUnregistered">
+            <summary>
+            Event fired when a component is removed from the kernel.
+            </summary>
+        </member>
+        <member name="E:Castle.MicroKernel.IKernelEvents.ComponentModelCreated">
+            <summary>
+            Event fired after the ComponentModel is created.
+            Allows customizations that may affect the handler.
+            </summary>
+        </member>
+        <member name="E:Castle.MicroKernel.IKernelEvents.AddedAsChildKernel">
+            <summary>
+            Event fired when the kernel was added as child of
+            another kernel.
+            </summary>
+        </member>
+        <member name="E:Castle.MicroKernel.IKernelEvents.RemovedAsChildKernel">
+            <summary>
+            Event fired when the kernel was removed from being a child
+            of another kernel.
+            </summary>
+        </member>
+        <member name="E:Castle.MicroKernel.IKernelEvents.ComponentCreated">
+            <summary>
+            Event fired before the component is created.
+            </summary>
+        </member>
+        <member name="E:Castle.MicroKernel.IKernelEvents.ComponentDestroyed">
+            <summary>
+            Event fired when a component instance destroyed.
+            </summary>
+        </member>
+        <member name="E:Castle.MicroKernel.IKernelEvents.HandlerRegistered">
+            <summary>
+            Event fired when a new handler is registered 
+            (it might be in a valid or waiting dependency state)
+            </summary>
+        </member>
+        <member name="E:Castle.MicroKernel.IKernelEvents.HandlersChanged">
+            <summary>
+            Event fired when a new handler is registered 
+            (it might be in a valid or waiting dependency state)
+            </summary>
+        </member>
+        <member name="E:Castle.MicroKernel.IKernelEvents.DependencyResolving">
+            <summary>
+            Event fired when a dependency is being resolved,
+            it allows the dependency to be changed,
+            but the client ComponentModel must not be changed.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.Register(Castle.MicroKernel.Registration.IRegistration[])">
+            <summary>
+            Registers the components provided by the <see cref="T:Castle.MicroKernel.Registration.IRegistration"/>s
+            with the <see cref="T:Castle.MicroKernel.IKernel"/>.
+            <para/>
+            Create a new registration using <see cref="T:Castle.MicroKernel.Registration.Component"/>.For() or <see cref="T:Castle.MicroKernel.Registration.AllTypes"/>.
+            </summary>
+            <example>
+            <code>
+            kernel.Register(Component.For&lt;IService&gt;().ImplementedBy&lt;DefaultService&gt;());
+            </code>
+            </example>
+            <param name="registrations">The component registrations.</param>
+            <returns>The kernel.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.RemoveComponent(System.String)">
+            <summary>
+            Returns true if the specified component was 
+            found and could be removed (i.e. no other component depends on it)
+            </summary>
+            <param name="key">The component's key</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.HasComponent(System.String)">
+            <summary>
+            Returns true if the specified key was registered
+            </summary>
+            <param name="key"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.HasComponent(System.Type)">
+            <summary>
+            Returns true if the specified service was registered
+            </summary>
+            <param name="service"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.RegisterCustomDependencies(System.Type,System.Collections.IDictionary)">
+            <summary>
+            Associates objects with a component handler,
+            allowing it to use the specified dictionary
+            when resolving dependencies
+            </summary>
+            <param name="service"></param>
+            <param name="dependencies"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.RegisterCustomDependencies(System.Type,System.Object)">
+            <summary>
+            Associates objects with a component handler,
+            allowing it to use the specified dictionary
+            when resolving dependencies
+            </summary>
+            <param name="service"></param>
+            <param name="dependenciesAsAnonymousType"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.RegisterCustomDependencies(System.String,System.Collections.IDictionary)">
+            <summary>
+            Associates objects with a component handler,
+            allowing it to use the specified dictionary
+            when resolving dependencies
+            </summary>
+            <param name="key"></param>
+            <param name="dependencies"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.RegisterCustomDependencies(System.String,System.Object)">
+            <summary>
+            Associates objects with a component handler,
+            allowing it to use the specified dictionary
+            when resolving dependencies
+            </summary>
+            <param name="key"></param>
+            <param name="dependenciesAsAnonymousType"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.ReleaseComponent(System.Object)">
+            <summary>
+            Releases a component instance. This allows
+            the kernel to execute the proper decommission 
+            lifecycles on the component instance.
+            </summary>
+            <param name="instance"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.GetHandler(System.String)">
+            <summary>
+            Returns the <see cref="T:Castle.MicroKernel.IHandler"/>
+            for the specified component key.
+            </summary>
+            <param name="key"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.GetHandler(System.Type)">
+            <summary>
+            Returns the <see cref="T:Castle.MicroKernel.IHandler"/>
+            for the specified service.
+            </summary>
+            <param name="service"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.GetHandlers(System.Type)">
+            <summary>
+            Return handlers for components that 
+            implements the specified service.
+            </summary>
+            <param name="service"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.GetAssignableHandlers(System.Type)">
+            <summary>
+            Return handlers for components that 
+            implements the specified service. 
+            The check is made using IsAssignableFrom
+            </summary>
+            <param name="service"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.AddFacility(System.String,Castle.MicroKernel.IFacility)">
+            <summary>
+            Adds a <see cref="T:Castle.MicroKernel.IFacility"/> to the kernel.
+            </summary>
+            <param name="key"></param>
+            <param name="facility"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.AddFacility``1(System.String)">
+            <summary>
+            Creates and adds an <see cref="T:Castle.MicroKernel.IFacility"/> facility to the kernel.
+            </summary>
+            <typeparam name="T">The facility type.</typeparam>
+            <param name="key"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.AddFacility``1(System.String,System.Action{``0})">
+            <summary>
+            Creates and adds an <see cref="T:Castle.MicroKernel.IFacility"/> facility to the kernel.
+            </summary>
+            <typeparam name="T">The facility type.</typeparam>
+            <param name="key"></param>
+            <param name="onCreate">The callback for creation.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.AddFacility``1(System.String,System.Func{``0,System.Object})">
+            <summary>
+            Creates and adds an <see cref="T:Castle.MicroKernel.IFacility"/> facility to the kernel.
+            </summary>
+            <typeparam name="T">The facility type.</typeparam>
+            <param name="key"></param>
+            <param name="onCreate">The callback for creation.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.AddFacility``1">
+            <summary>
+            Creates and adds an <see cref="T:Castle.MicroKernel.IFacility"/> facility to the kernel.
+            </summary>
+            <typeparam name="T">The facility type.</typeparam>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.AddFacility``1(System.Action{``0})">
+            <summary>
+            Creates and adds an <see cref="T:Castle.MicroKernel.IFacility"/> facility to the kernel.
+            </summary>
+            <typeparam name="T">The facility type.</typeparam>
+            <param name="onCreate">The callback for creation.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.AddFacility``1(System.Func{``0,System.Object})">
+            <summary>
+            Creates and adds an <see cref="T:Castle.MicroKernel.IFacility"/> facility to the kernel.
+            </summary>
+            <typeparam name="T">The facility type.</typeparam>
+            <param name="onCreate">The callback for creation.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.GetFacilities">
+            <summary>
+            Returns the facilities registered on the kernel.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.AddSubSystem(System.String,Castle.MicroKernel.ISubSystem)">
+            <summary>
+            Adds (or replaces) an <see cref="T:Castle.MicroKernel.ISubSystem"/>
+            </summary>
+            <param name="key"></param>
+            <param name="subsystem"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.GetSubSystem(System.String)">
+            <summary>
+            Returns an implementation of <see cref="T:Castle.MicroKernel.ISubSystem"/>
+            for the specified key. 
+            <seealso cref="T:Castle.MicroKernel.SubSystemConstants"/>
+            </summary>
+            <param name="key"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.AddChildKernel(Castle.MicroKernel.IKernel)">
+            <summary>
+            Support for kernel hierarchy
+            </summary>
+            <param name="kernel"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.RemoveChildKernel(Castle.MicroKernel.IKernel)">
+            <summary>
+            Remove child kernel
+            </summary>
+            <param name="kernel"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.AddHandlerSelector(Castle.MicroKernel.IHandlerSelector)">
+            <summary>
+            Register a new component resolver that can take part in the decision
+            making about which handler to resolve
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.Resolve(System.Type)">
+            <summary>
+            Returns the component instance by the service type
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.ResolveAll(System.Type)">
+            <summary>
+            Returns all the valid component instances by
+            the service type
+            </summary>
+            <param name="service">The service type</param>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.ResolveAll(System.Type,System.Collections.IDictionary)">
+            <summary>
+            Returns all the valid component instances by
+            the service type
+            </summary>
+            <param name="service">The service type</param>
+            <param name="arguments">Arguments to resolve the services</param>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.ResolveAll(System.Type,System.Object)">
+            <summary>
+            Returns all the valid component instances by
+            the service type
+            </summary>
+            <param name="service">The service type</param>
+            <param name="argumentsAsAnonymousType">Arguments to resolve the services</param>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.Resolve(System.Type,System.Collections.IDictionary)">
+            <summary>
+            Returns the component instance by the service type
+            using dynamic arguments
+            </summary>
+            <param name="service"></param>
+            <param name="arguments"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.Resolve(System.String,System.Collections.IDictionary)">
+            <summary>
+            Returns the component instance by the component key
+            using dynamic arguments
+            </summary>
+            <param name="key"></param>
+            <param name="arguments"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.Resolve(System.Type,System.Object)">
+            <summary>
+            Returns the component instance by the service type
+            using dynamic arguments
+            </summary>
+            <param name="service">Service to resolve</param>
+            <param name="argumentsAsAnonymousType">Arguments to resolve the services</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.Resolve(System.String,System.Object)">
+            <summary>
+            Returns the component instance by the component key
+            using dynamic arguments
+            </summary>
+            <param name="key">Key to resolve</param>
+            <param name="argumentsAsAnonymousType">Arguments to resolve the services</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.Resolve(System.String,System.Type)">
+            <summary>
+            Returns a component instance by the key
+            </summary>
+            <param name="key"></param>
+            <param name="service"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.Resolve``1(System.Collections.IDictionary)">
+            <summary>
+            Returns the component instance by the service type
+            using dynamic arguments
+            </summary>
+            <param name="arguments"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.Resolve``1(System.Object)">
+            <summary>
+            Returns the component instance by the service type
+            using dynamic arguments
+            </summary>
+            <param name="argumentsAsAnonymousType">Arguments to resolve the services</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.Resolve``1">
+            <summary>
+            Returns the component instance by the component key
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.Resolve``1(System.String)">
+            <summary>
+            Returns a component instance by the key
+            </summary>
+            <param name="key">Component's key</param>
+            <typeparam name="T">Service type</typeparam>
+            <returns>The Component instance</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.Resolve``1(System.String,System.Collections.IDictionary)">
+            <summary>
+            Returns a component instance by the key
+            </summary>
+            <typeparam name="T">Service type</typeparam>
+            <param name="key">Component's key</param>
+            <param name="arguments"></param>
+            <returns>The Component instance</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.ResolveAll``1">
+            <summary>
+            Returns component instances that implement TService
+            </summary>
+            <typeparam name="TService"></typeparam>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.ResolveAll``1(System.Collections.IDictionary)">
+            <summary>
+            Returns component instances that implement TService
+            </summary>
+            <typeparam name="TService"></typeparam>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.ResolveAll``1(System.Object)">
+            <summary>
+            Returns component instances that implement TService
+            </summary>
+            <typeparam name="TService"></typeparam>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernel.Resolve(System.String,System.Type,System.Collections.IDictionary)">
+            <summary>
+            Returns a component instance by the key
+            </summary>
+            <param name="key"></param>
+            <param name="service"></param>
+            <param name="arguments"></param>
+            <returns></returns>
+        </member>
+        <member name="P:Castle.MicroKernel.IKernel.ComponentModelBuilder">
+            <summary>
+            Returns the implementation of <see cref="T:Castle.MicroKernel.IComponentModelBuilder"/>
+            </summary>
+        </member>
+        <member name="P:Castle.MicroKernel.IKernel.HandlerFactory">
+            <summary>
+            Returns the implementation of <see cref="T:Castle.MicroKernel.IHandlerFactory"/>
+            </summary>
+        </member>
+        <member name="P:Castle.MicroKernel.IKernel.ConfigurationStore">
+            <summary>
+            Gets or sets the implementation of <see cref="T:Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore"/>
+            </summary>
+        </member>
+        <member name="P:Castle.MicroKernel.IKernel.ReleasePolicy">
+            <summary>
+            Gets or sets the implementation for <see cref="T:Castle.MicroKernel.IReleasePolicy"/>
+            </summary>
+        </member>
+        <member name="P:Castle.MicroKernel.IKernel.Resolver">
+            <summary>
+            Returns the implementation for <see cref="T:Castle.MicroKernel.IDependencyResolver"/>
+            </summary>
+        </member>
+        <member name="P:Castle.MicroKernel.IKernel.ProxyFactory">
+            <summary>
+            Gets or sets the implementation of <see cref="T:Castle.MicroKernel.IProxyFactory"/>
+            allowing different strategies for proxy creation.
+            </summary>
+        </member>
+        <member name="P:Castle.MicroKernel.IKernel.Parent">
+            <summary>
+            Returns the parent kernel
+            </summary>
+        </member>
+        <member name="P:Castle.MicroKernel.IKernel.GraphNodes">
+            <summary>
+            Graph of components and interactions.
+            </summary>
+        </member>
+        <member name="P:Castle.MicroKernel.IKernel.Item(System.String)">
+            <summary>
+            Returns the component instance by the key
+            </summary>
+        </member>
+        <member name="P:Castle.MicroKernel.IKernel.Item(System.Type)">
+            <summary>
+            Returns the component instance by the service type
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.IKernelInternal">
+            <summary>
+            Extended contract of kernel, used internally.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernelInternal.CreateComponentActivator(Castle.Core.ComponentModel)">
+            <summary>
+            Constructs an implementation of <see cref="T:Castle.MicroKernel.IComponentActivator"/>
+            for the given <see cref="T:Castle.Core.ComponentModel"/>
+            </summary>
+            <param name="model"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernelInternal.RaiseHandlerRegistered(Castle.MicroKernel.IHandler)">
+            <summary>
+            Raise the handler registered event, required so
+            dependant handlers will be notified about their dependant moving
+            to valid state.
+            </summary>
+            <param name="handler"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernelInternal.RegisterHandlerForwarding(System.Type,System.String)">
+            <summary>
+            Registers the <paramref name="forwardedType"/> to be forwarded 
+            to the component registered with <paramref name="name"/>.
+            </summary>
+            <param name="forwardedType">The service type that gets forwarded.</param>
+            <param name="name">The name of the component to forward to.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.IKernelInternal.AddCustomComponent(Castle.Core.ComponentModel)">
+            <summary>
+            Adds a custom made <see cref="T:Castle.Core.ComponentModel"/>.
+            Used by facilities.
+            </summary>
+            <param name="model"></param>
+        </member>
+        <member name="F:Castle.MicroKernel.DefaultKernel.childKernels">
+            <summary>
+              List of sub containers.
+            </summary>
+        </member>
+        <member name="F:Castle.MicroKernel.DefaultKernel.facilities">
+            <summary>
+              List of <see cref="T:Castle.MicroKernel.IFacility"/> registered.
+            </summary>
+        </member>
+        <member name="F:Castle.MicroKernel.DefaultKernel.handlerFactory">
+            <summary>
+              The implementation of <see cref="T:Castle.MicroKernel.IHandlerFactory"/>
+            </summary>
+        </member>
+        <member name="F:Castle.MicroKernel.DefaultKernel.resolver">
+            <summary>
+              The dependency resolver.
+            </summary>
+        </member>
+        <member name="F:Castle.MicroKernel.DefaultKernel.subsystems">
+            <summary>
+              Map of subsystems registered.
+            </summary>
+        </member>
+        <member name="F:Castle.MicroKernel.DefaultKernel.parentKernel">
+            <summary>
+              The parent kernel, if exists.
+            </summary>
+        </member>
+        <member name="F:Castle.MicroKernel.DefaultKernel.proxyFactory">
+            <summary>
+              Holds the implementation of <see cref="T:Castle.MicroKernel.IProxyFactory"/>
+            </summary>
+        </member>
+        <member name="F:Castle.MicroKernel.DefaultKernel.releasePolicy">
+            <summary>
+              Implements a policy to control component's
+              disposal that the user forgot.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.#ctor">
+            <summary>
+              Constructs a DefaultKernel with no component
+              proxy support.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.#ctor(Castle.MicroKernel.IDependencyResolver,Castle.MicroKernel.IProxyFactory)">
+            <summary>
+              Constructs a DefaultKernel with the specified
+              implementation of <see cref="T:Castle.MicroKernel.IProxyFactory"/> and <see cref="T:Castle.MicroKernel.IDependencyResolver"/>
+            </summary>
+            <param name="resolver"></param>
+            <param name="proxyFactory"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.#ctor(Castle.MicroKernel.IProxyFactory)">
+            <summary>
+              Constructs a DefaultKernel with the specified
+              implementation of <see cref="T:Castle.MicroKernel.IProxyFactory"/>
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.Dispose">
+            <summary>
+              Starts the process of component disposal.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.GetAssignableHandlers(System.Type)">
+            <summary>
+              Return handlers for components that 
+              implements the specified service. 
+              The check is made using IsAssignableFrom
+            </summary>
+            <param name = "service"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.GetFacilities">
+            <summary>
+              Returns the facilities registered on the kernel.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.GetHandlers(System.Type)">
+            <summary>
+              Return handlers for components that 
+              implements the specified service.
+            </summary>
+            <param name = "service"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.Register(Castle.MicroKernel.Registration.IRegistration[])">
+            <summary>
+              Registers the components described by the <see cref="T:Castle.MicroKernel.Registration.ComponentRegistration`1"/>s
+              with the <see cref="T:Castle.MicroKernel.IKernel"/>.
+              <param name="registrations">The component registrations.</param>
+              <returns>The kernel.</returns>
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.RegisterCustomDependencies(System.Type,System.Collections.IDictionary)">
+            <summary>
+              Associates objects with a component handler,
+              allowing it to use the specified dictionary
+              when resolving dependencies
+            </summary>
+            <param name = "service"></param>
+            <param name = "dependencies"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.RegisterCustomDependencies(System.Type,System.Object)">
+            <summary>
+              Associates objects with a component handler,
+              allowing it to use the specified dictionary
+              when resolving dependencies
+            </summary>
+            <param name = "service"></param>
+            <param name = "dependenciesAsAnonymousType"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.RegisterCustomDependencies(System.String,System.Collections.IDictionary)">
+            <summary>
+              Associates objects with a component handler,
+              allowing it to use the specified dictionary
+              when resolving dependencies
+            </summary>
+            <param name = "key"></param>
+            <param name = "dependencies"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.RegisterCustomDependencies(System.String,System.Object)">
+            <summary>
+              Associates objects with a component handler,
+              allowing it to use the specified dictionary
+              when resolving dependencies
+            </summary>
+            <param name = "key"></param>
+            <param name = "dependenciesAsAnonymousType"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.ReleaseComponent(System.Object)">
+            <summary>
+              Releases a component instance. This allows
+              the kernel to execute the proper decommission
+              lifecycles on the component instance.
+            </summary>
+            <param name = "instance"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.RemoveComponent(System.String)">
+            <summary>
+              Returns true if the specified component was
+              found and could be removed (i.e. no other component depends on it)
+            </summary>
+            <param name = "key">The component's key</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.GetService(System.Type)">
+            <summary>
+              Gets the service object of the specified type.
+            </summary>
+            <returns>
+              A service object of type serviceType.
+            </returns>
+            <param name = "serviceType">An object that specifies the type of service object to get. </param>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.GetService``1">
+            <summary>
+              Gets the service object of the specified type.
+            </summary>
+            <returns>
+              A service object of type serviceType.
+            </returns>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.Resolve(System.String,System.Type)">
+            <summary>
+              Returns a component instance by the key
+            </summary>
+            <param name="key"></param>
+            <param name="service"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.Resolve(System.String,System.Type,System.Collections.IDictionary)">
+            <summary>
+              Returns a component instance by the key
+            </summary>
+            <param name="key"></param>
+            <param name="service"></param>
+            <param name="arguments"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.Resolve``1(System.Collections.IDictionary)">
+            <summary>
+              Returns the component instance by the service type
+              using dynamic arguments
+            </summary>
+            <param name="arguments"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.Resolve``1(System.Object)">
+            <summary>
+              Returns the component instance by the service type
+              using dynamic arguments
+            </summary>
+            <param name="argumentsAsAnonymousType"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.Resolve``1">
+            <summary>
+              Returns the component instance by the component key
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.Resolve``1(System.String)">
+            <summary>
+              Returns a component instance by the key
+            </summary>
+            <param name="key">Component's key</param>
+            <typeparam name="T">Service type</typeparam>
+            <returns>
+              The Component instance
+            </returns>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.Resolve``1(System.String,System.Collections.IDictionary)">
+            <summary>
+              Returns a component instance by the key
+            </summary>
+            <typeparam name="T">Service type</typeparam>
+            <param name="key">Component's key</param>
+            <param name="arguments"></param>
+            <returns>
+              The Component instance
+            </returns>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.Resolve(System.Type)">
+            <summary>
+              Returns the component instance by the service type
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.Resolve(System.Type,System.Collections.IDictionary)">
+            <summary>
+              Returns the component instance by the service type
+              using dynamic arguments
+            </summary>
+            <param name="service"></param>
+            <param name="arguments"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.Resolve(System.Type,System.Object)">
+            <summary>
+              Returns the component instance by the service type
+              using dynamic arguments
+            </summary>
+            <param name="service"></param>
+            <param name="argumentsAsAnonymousType"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.Resolve(System.String,System.Collections.IDictionary)">
+            <summary>
+              Returns the component instance by the component key
+              using dynamic arguments
+            </summary>
+            <param name="key"></param>
+            <param name="arguments"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.Resolve(System.String,System.Object)">
+            <summary>
+              Returns the component instance by the component key
+              using dynamic arguments
+            </summary>
+            <param name="key"></param>
+            <param name="argumentsAsAnonymousType"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.ResolveAll(System.Type)">
+            <summary>
+              Returns all the valid component instances by
+              the service type
+            </summary>
+            <param name="service">The service type</param>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.ResolveAll(System.Type,System.Collections.IDictionary)">
+            <summary>
+              Returns all the valid component instances by
+              the service type
+            </summary>
+            <param name="service">The service type</param>
+            <param name="arguments">
+              Arguments to resolve the services
+            </param>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.ResolveAll(System.Type,System.Object)">
+            <summary>
+              Returns all the valid component instances by
+              the service type
+            </summary>
+            <param name="service">The service type</param>
+            <param name="argumentsAsAnonymousType">
+              Arguments to resolve the services
+            </param>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.ResolveAll``1(System.Object)">
+            <summary>
+              Returns component instances that implement TService
+            </summary>
+            <typeparam name="TService"></typeparam>
+            <param name="argumentsAsAnonymousType"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.ResolveAll``1(System.Collections.IDictionary)">
+            <summary>
+              Returns component instances that implement TService
+            </summary>
+            <typeparam name="TService"></typeparam>
+            <param name="arguments"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.DefaultKernel.ResolveAll``1">
+            <summary>
+              Returns component instances that implement TService
+            </summary>
+            <typeparam name="TService"></typeparam>
+            <returns></returns>
+        </member>
+        <member name="P:Castle.MicroKernel.DefaultKernel.GraphNodes">
+            <summary>
+              Graph of components and interactions.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.CircularDependencyException">
+            <summary>
+            Exception throw when a circular dependency is detected
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.CircularDependencyException.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.CircularDependencyException"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.CircularDependencyException.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.CircularDependencyException"/> class.
+            </summary>
+            <param name="message">The message.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.CircularDependencyException.#ctor(System.String,System.Exception)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.CircularDependencyException"/> class.
+            </summary>
+            <param name="message">The message.</param>
+            <param name="innerException">The inner exception.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.CircularDependencyException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.CircularDependencyException"/> class.
+            </summary>
+            <param name="info">The <see cref="T:System.Runtime.Serialization.SerializationInfo"/> that holds the serialized object data about the exception being thrown.</param>
+            <param name="context">The <see cref="T:System.Runtime.Serialization.StreamingContext"/> that contains contextual information about the source or destination.</param>
+            <exception cref="T:System.ArgumentNullException">The <paramref name="info"/> parameter is <see langword="null"/>.</exception>
+            <exception cref="T:System.Runtime.Serialization.SerializationException">The class name is <see langword="null"/> or <see cref="P:System.Exception.HResult"/> is zero (0).</exception>
+        </member>
+        <member name="T:Castle.MicroKernel.ComponentNotFoundException">
+            <summary>
+            Exception threw when a request for a component
+            cannot be satisfied because the component does not
+            exist in the container
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.ComponentNotFoundException.#ctor(System.String)">
+            <summary>
+              Initializes a new instance of the
+              <see cref="T:Castle.MicroKernel.ComponentNotFoundException"/>
+              class.
+            </summary>
+            <param name="name">The name.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.ComponentNotFoundException.#ctor(System.String,System.String)">
+            <summary>
+              Initializes a new instance of the
+              <see cref="T:Castle.MicroKernel.ComponentNotFoundException"/>
+              class.
+            </summary>
+            <param name="name">The name.</param>
+            <param name="message">Exception message.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.ComponentNotFoundException.#ctor(System.Type,System.String)">
+            <summary>
+              Initializes a new instance of the
+              <see cref="T:Castle.MicroKernel.ComponentNotFoundException"/>
+              class.
+            </summary>
+            <param name="service">The service.</param>
+            <param name="message">Exception message.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.ComponentNotFoundException.#ctor(System.Type)">
+            <summary>
+              Initializes a new instance of the
+              <see cref="T:Castle.MicroKernel.ComponentNotFoundException"/>
+              class.
+            </summary>
+            <param name="service">The service.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.ComponentNotFoundException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+              Initializes a new instance of the
+              <see cref="T:Castle.MicroKernel.ComponentNotFoundException"/>
+              class.
+            </summary>
+            <param name="info">The object that holds the serialized object data.</param>
+            <param name="context">The contextual information about the source or destination.</param>
+        </member>
+        <member name="T:Castle.MicroKernel.ComponentRegistrationException">
+            <summary>
+            Exception threw when there is a problem
+            registering a component
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.ComponentRegistrationException.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.ComponentRegistrationException"/> class.
+            </summary>
+            <param name="message">The message.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.ComponentRegistrationException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.ComponentRegistrationException"/> class.
+            </summary>
+            <param name="info">The object that holds the serialized object data.</param>
+            <param name="context">The contextual information about the source or destination.</param>
+        </member>
+        <member name="T:Castle.MicroKernel.KernelException">
+            <summary>
+            Exception threw by Kernel operations that failed
+            for some reason.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.KernelException.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.KernelException"/> class.
+            </summary>
+            <param name="message">The message.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.KernelException.#ctor(System.String,System.Exception)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.KernelException"/> class.
+            </summary>
+            <param name="message">The message.</param>
+            <param name="innerException">The inner exception.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.KernelException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.KernelException"/> class.
+            </summary>
+            <param name="info">The object that holds the serialized object data.</param>
+            <param name="context">The contextual information about the source or destination.</param>
+        </member>
+        <member name="T:Castle.MicroKernel.Facilities.AbstractFacility">
+            <summary>
+              Base class for facilities.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.IFacility">
+            <summary>
+            Unit of extension. A facility should use 
+            the extension points offered by the kernel
+            to augment its functionality.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.IFacility.Init(Castle.MicroKernel.IKernel,Castle.Core.Configuration.IConfiguration)">
+            <summary>
+            
+            </summary>
+            <param name="kernel"></param>
+            <param name="facilityConfig"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.IFacility.Terminate">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Facilities.AbstractFacility.Init">
+            <summary>
+              The custom initialization for the Facility.
+            </summary>
+            <remarks>
+              It must be overridden.
+            </remarks>
+        </member>
+        <member name="M:Castle.MicroKernel.Facilities.AbstractFacility.Dispose">
+            <summary>
+              Performs the tasks associated with freeing, releasing, or resetting 
+              the facility resources.
+            </summary>
+            <remarks>
+              It can be overriden.
+            </remarks>
+        </member>
+        <member name="M:Castle.MicroKernel.Facilities.AbstractFacility.Castle#MicroKernel#IFacility#Init(Castle.MicroKernel.IKernel,Castle.Core.Configuration.IConfiguration)">
+            <summary>
+              Initializes the facility. First it performs the initialization common for all 
+              facilities, setting the <see cref="P:Castle.MicroKernel.Facilities.AbstractFacility.Kernel"/> and the 
+              <see cref="P:Castle.MicroKernel.Facilities.AbstractFacility.FacilityConfig"/>. After it, the <c>Init</c> method is invoked
+              and the custom initilization is perfomed.
+            </summary>
+            <param name="kernel"></param>
+            <param name="facilityConfig"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.Facilities.AbstractFacility.Castle#MicroKernel#IFacility#Terminate">
+            <summary>
+              Terminates the Facility, invokes the <see cref="M:Castle.MicroKernel.Facilities.AbstractFacility.Dispose"/> method and sets 
+              the Kernel to a null reference.
+            </summary>
+        </member>
+        <member name="P:Castle.MicroKernel.Facilities.AbstractFacility.FacilityConfig">
+            <summary>
+              Gets the facility configuration.
+            </summary>
+            <value>The <see cref="T:Castle.Core.Configuration.IConfiguration"/> representing 
+              the facility configuration.</value>
+        </member>
+        <member name="P:Castle.MicroKernel.Facilities.AbstractFacility.Kernel">
+            <summary>
+              Gets the <see cref="T:Castle.MicroKernel.IKernel"/> where the facility is registered.
+            </summary>
+            <value>The <see cref="T:Castle.MicroKernel.IKernel"/>.</value>
+        </member>
+        <member name="T:Castle.Facilities.EventWiring.EventWiringException">
+            <summary>
+            Exception that is thrown when a error occurs during the Event Wiring process
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Facilities.FacilityException">
+            <summary>
+            Base exception to be used by facilities.
+            </summary>
+        </member>
+        <member name="M:Castle.Facilities.EventWiring.EventWiringException.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Facilities.EventWiring.EventWiringException"/> class.
+            </summary>
+            <param name="message">The message.</param>
+        </member>
+        <member name="M:Castle.Facilities.EventWiring.EventWiringException.#ctor(System.String,System.Exception)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Facilities.EventWiring.EventWiringException"/> class.
+            </summary>
+            <param name="message">The message.</param>
+            <param name="innerException">The inner exception.</param>
+        </member>
+        <member name="M:Castle.Facilities.EventWiring.EventWiringException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Facilities.EventWiring.EventWiringException"/> class.
+            </summary>
+            <param name="info">The object that holds the serialized object data.</param>
+            <param name="context">The contextual information about the source or destination.</param>
+        </member>
+        <member name="T:Castle.Facilities.EventWiring.EventWiringFacility">
+             <summary>
+             Facility to allow components to dynamically subscribe to events offered by 
+             other components. We call the component that offers events publishers and 
+             the components that uses them, subscribers.
+             </summary>
+             <remarks>
+             A component that wish to subscribe to an event must use the external configuration
+             adding a node <c>subscribers</c> on the publisher. This node can have multiple entries using the 
+             <c>subscriber</c> node.
+             </remarks>
+             <example>
+             <para>This example shows two simple components: one is the event publisher and the other is the 
+             subscriber. The subscription will be done by the facility, using the publisher associated configuration.</para>
+             <para>The Publisher class:</para>
+             <code>
+             public class SimplePublisher
+            	{
+            		public event PublishEventHandler Event;
+            
+            		public void Trigger()
+            		{
+            			if (Event != null)
+            			{
+            				Event(this, new EventArgs()); 
+            			}
+            		}
+             }
+             </code>
+             <para>The Subscriber class:</para>
+             <code>
+             public class SimpleListener
+             {
+             	private bool _listened;
+             	private object _sender;
+             
+             	public void OnPublish(object sender, EventArgs e)
+             	{
+             		_sender = sender; 
+             		_listened = sender != null;
+             	}
+             
+             	public bool Listened
+             	{
+             		get { return _listened;	}
+             	}
+             
+             	public object Sender
+             	{
+             		get { return _sender; }
+             	}
+             }
+             </code>
+             <para>The configuration file:</para>
+             <code>
+             <![CDATA[
+             <?xml version="1.0" encoding="utf-8" ?>
+             <configuration>
+             	<facilities>
+             		<facility 
+             			id="event.wiring"
+             			type="Castle.Facilities.EventWiring.EventWiringFacility, Castle.Windsor" />
+             	</facilities>
+             
+             	<components>
+             		<component 
+             			id="SimpleListener" 
+             			type="Castle.Facilities.EventWiring.Tests.Model.SimpleListener, Castle.Facilities.EventWiring.Tests" />
+             
+             		<component 
+             			id="SimplePublisher" 
+             			type="Castle.Facilities.EventWiring.Tests.Model.SimplePublisher, Castle.Facilities.EventWiring.Tests" >
+             			<subscribers>
+             				<subscriber id="SimpleListener" event="Event" handler="OnPublish"/>
+             			</subscribers>
+             		</component>
+             	</components>
+             </configuration>
+             ]]>
+             </code>
+             </example>
+        </member>
+        <member name="M:Castle.Facilities.EventWiring.EventWiringFacility.Init">
+            <summary>
+            Overridden. Initializes the facility, subscribing to the <see cref="E:Castle.MicroKernel.IKernelEvents.ComponentModelCreated"/>,
+            <see cref="E:Castle.MicroKernel.IKernelEvents.ComponentCreated"/>, <see cref="E:Castle.MicroKernel.IKernelEvents.ComponentDestroyed"/> Kernel events.
+            </summary>
+        </member>
+        <member name="M:Castle.Facilities.EventWiring.EventWiringFacility.OnComponentModelCreated(Castle.Core.ComponentModel)">
+            <summary>
+            Checks if the component we're dealing is a publisher. If it is, 
+            parses the configuration (the subscribers node) getting the event wiring info.
+            </summary>
+            <param name="model">The component model.</param>
+            <exception cref="T:Castle.Facilities.EventWiring.EventWiringException">Invalid and/or a error in the configuration</exception>
+        </member>
+        <member name="M:Castle.Facilities.EventWiring.EventWiringFacility.OnComponentCreated(Castle.Core.ComponentModel,System.Object)">
+            <summary>
+            Checks if the component we're dealing is a publisher. If it is, 
+            iterates the subscribers starting them and wiring the events.
+            </summary>
+            <param name="model">The component model.</param>
+            <param name="instance">The instance representing the component.</param>
+            <exception cref="T:Castle.Facilities.EventWiring.EventWiringException">When the subscriber is not found
+            <br/> or <br/>
+            The handler method isn't found
+            <br/> or <br/>
+            The event isn't found
+            </exception>
+        </member>
+        <member name="T:Castle.Facilities.EventWiring.WireInfo">
+            <summary>
+            Represents the information about an event.
+            </summary>
+        </member>
+        <member name="M:Castle.Facilities.EventWiring.WireInfo.#ctor(System.String,System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Facilities.EventWiring.WireInfo"/> class.
+            </summary>
+            <param name="eventName">Name of the event.</param>
+            <param name="handler">The name of the handler method.</param>
+        </member>
+        <member name="M:Castle.Facilities.EventWiring.WireInfo.GetHashCode">
+            <summary>
+            Serves as a hash function for a particular type.
+            </summary>
+            <returns>
+            A hash code for the current <see cref="T:System.Object"></see>.
+            </returns>
+        </member>
+        <member name="M:Castle.Facilities.EventWiring.WireInfo.Equals(System.Object)">
+            <summary>
+            Determines whether the specified <see cref="T:System.Object"></see> is equal to the current <see cref="T:System.Object"></see>.
+            </summary>
+            <param name="obj">The <see cref="T:System.Object"></see> to compare with the current <see cref="T:System.Object"></see>.</param>
+            <returns>
+            true if the specified <see cref="T:System.Object"></see> is equal to the current <see cref="T:System.Object"></see>; otherwise, false.
+            </returns>
+        </member>
+        <member name="P:Castle.Facilities.EventWiring.WireInfo.EventName">
+            <summary>
+            Gets the name of the event.
+            </summary>
+            <value>The name of the event.</value>
+        </member>
+        <member name="P:Castle.Facilities.EventWiring.WireInfo.Handler">
+            <summary>
+            Gets the handler method name.
+            </summary>
+            <value>The handler.</value>
+        </member>
+        <member name="T:Castle.Facilities.FactorySupport.FactoryActivator">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="T:Castle.Facilities.Remoting.CustomActivators.RemoteActivator">
+            <summary>
+            Activates a object connecting to the remote server.
+            </summary>
+        </member>
+        <member name="M:Castle.Facilities.Remoting.CustomActivators.RemoteActivator.#ctor(Castle.Core.ComponentModel,Castle.MicroKernel.IKernel,Castle.MicroKernel.ComponentInstanceDelegate,Castle.MicroKernel.ComponentInstanceDelegate)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Facilities.Remoting.CustomActivators.RemoteActivator"/> class.
+            </summary>
+            <param name="model">The model.</param>
+            <param name="kernel">The kernel.</param>
+            <param name="onCreation">The oncreation event handler.</param>
+            <param name="onDestruction">The ondestruction event handler.</param>
+        </member>
+        <member name="T:Castle.Facilities.Remoting.CustomActivators.RemoteActivatorThroughConnector">
+            <summary>
+            Activates a client connecting to the remote server, enforcing the uri and the server activation.
+            </summary>
+        </member>
+        <member name="M:Castle.Facilities.Remoting.CustomActivators.RemoteActivatorThroughConnector.#ctor(Castle.Core.ComponentModel,Castle.MicroKernel.IKernel,Castle.MicroKernel.ComponentInstanceDelegate,Castle.MicroKernel.ComponentInstanceDelegate)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Facilities.Remoting.CustomActivators.RemoteActivatorThroughConnector"/> class.
+            </summary>
+            <param name="model">The model.</param>
+            <param name="kernel">The kernel.</param>
+            <param name="onCreation">The oncreation event handler.</param>
+            <param name="onDestruction">The ondestruction event handler.</param>
+        </member>
+        <member name="T:Castle.Facilities.Remoting.CustomActivators.RemoteActivatorThroughRegistry">
+            <summary>
+            Activates a client connecting to the remote server through the <see cref="T:Castle.Facilities.Remoting.RemotingRegistry"/>.
+            </summary>
+        </member>
+        <member name="M:Castle.Facilities.Remoting.CustomActivators.RemoteActivatorThroughRegistry.#ctor(Castle.Core.ComponentModel,Castle.MicroKernel.IKernel,Castle.MicroKernel.ComponentInstanceDelegate,Castle.MicroKernel.ComponentInstanceDelegate)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Facilities.Remoting.CustomActivators.RemoteActivatorThroughRegistry"/> class.
+            </summary>
+            <param name="model">The model.</param>
+            <param name="kernel">The kernel.</param>
+            <param name="onCreation">The oncreation event handler.</param>
+            <param name="onDestruction">The ondestruction event handler.</param>
+        </member>
+        <member name="T:Castle.Facilities.Remoting.CustomActivators.RemoteClientActivatedActivator">
+            <summary>
+            Activates a client activated object.
+            </summary>
+        </member>
+        <member name="M:Castle.Facilities.Remoting.CustomActivators.RemoteClientActivatedActivator.#ctor(Castle.Core.ComponentModel,Castle.MicroKernel.IKernel,Castle.MicroKernel.ComponentInstanceDelegate,Castle.MicroKernel.ComponentInstanceDelegate)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Facilities.Remoting.CustomActivators.RemoteClientActivatedActivator"/> class.
+            </summary>
+            <param name="model">The model.</param>
+            <param name="kernel">The kernel.</param>
+            <param name="onCreation">The oncreation event handler.</param>
+            <param name="onDestruction">The ondestruction event handler.</param>
+        </member>
+        <member name="T:Castle.Facilities.Remoting.CustomActivators.RemoteMarshallerActivator">
+            <summary>
+            Activates and publishes a server object.
+            </summary>
+        </member>
+        <member name="M:Castle.Facilities.Remoting.CustomActivators.RemoteMarshallerActivator.#ctor(Castle.Core.ComponentModel,Castle.MicroKernel.IKernel,Castle.MicroKernel.ComponentInstanceDelegate,Castle.MicroKernel.ComponentInstanceDelegate)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Facilities.Remoting.CustomActivators.RemoteMarshallerActivator"/> class.
+            </summary>
+            <param name="model">The model.</param>
+            <param name="kernel">The kernel.</param>
+            <param name="onCreation">The oncreation event handler.</param>
+            <param name="onDestruction">The ondestruction event handler.</param>
+        </member>
+        <member name="T:Castle.Facilities.Remoting.RemotingFacility">
+            <summary>
+              Facility to allow the communication with remote kernel, using the .NET Remoting infrastructure.
+            </summary>
+            <remarks>
+              TODO
+            </remarks>
+            <example>
+              TODO
+            </example>
+        </member>
+        <member name="F:Castle.Facilities.Remoting.RemotingFacility.baseUri">
+            <summary>
+              Used for client side (Expand explanation)
+            </summary>
+        </member>
+        <member name="F:Castle.Facilities.Remoting.RemotingFacility.localRegistry">
+            <summary>
+              Used for server side. 
+              Holds the local registry
+            </summary>
+        </member>
+        <member name="F:Castle.Facilities.Remoting.RemotingFacility.remoteRegistry">
+            <summary>
+              Used for client side. 
+              Holds a remote proxy to the server registry
+            </summary>
+        </member>
+        <member name="M:Castle.Facilities.Remoting.RemotingFacility.Dispose">
+            <summary>
+              Performs the tasks associated with freeing, releasing, or resetting
+              the facility resources.
+            </summary>
+            <remarks>
+              It can be overridden.
+            </remarks>
+        </member>
+        <member name="T:Castle.Facilities.Remoting.RemotingInspector">
+            <summary>
+            Inspects the model looking for remote component configuration. If found, 
+            do the component Remoting configuration.
+            </summary>
+        </member>
+        <member name="M:Castle.Facilities.Remoting.RemotingInspector.#ctor(Castle.MicroKernel.SubSystems.Conversion.ITypeConverter,System.Boolean,System.Boolean,System.String,Castle.Facilities.Remoting.RemotingRegistry,Castle.Facilities.Remoting.RemotingRegistry)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Facilities.Remoting.RemotingInspector"/> class.
+            </summary>
+            <param name="converter">The converter.</param>
+            <param name="isServer">if set to <c>true</c> is a server.</param>
+            <param name="isClient">if set to <c>true</c> is a client.</param>
+            <param name="baseUri">The base URI.</param>
+            <param name="remoteRegistry">The remote registry.</param>
+            <param name="localRegistry">The local registry.</param>
+        </member>
+        <member name="M:Castle.Facilities.Remoting.RemotingInspector.ResetDependencies(Castle.Core.ComponentModel)">
+            <summary>
+            Client components are not created by the container
+            so there's no point collecting constructor dependencies
+            </summary>
+            <param name="model"></param>
+        </member>
+        <member name="M:Castle.Facilities.Remoting.RemotingRegistry.GetModel(System.Type)">
+            <summary>
+            Used in case of generics:
+            </summary>
+            <param name="serviceType"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Facilities.Startable.StartableFacility.DeferredStart">
+            <summary>
+              This method changes behavior of the facility. Deferred mode should be used when you
+              have single call to <see cref="M:Castle.Windsor.IWindsorContainer.Install(Castle.MicroKernel.Registration.IWindsorInstaller[])"/> and register all your components there.
+              Enabling this mode will optimize the behavior of the facility so that it will wait 'till the end of
+              installation and only after all <see cref="T:Castle.MicroKernel.Registration.IWindsorInstaller"/>s were ran it will instantiate and
+              start all the startable components. An exception will be thrown if a startable component can't be 
+              instantiated and started. This will help you fail fast and diagnose issues quickly. If you don't want
+              the exception to be thrown and you prefer the component to fail silently, use <see cref="M:Castle.Facilities.Startable.StartableFacility.DeferredTryStart"/> method instead.
+            </summary>
+            <remarks>
+              It is recommended to use this method over <see cref="M:Castle.Facilities.Startable.StartableFacility.DeferredTryStart"/> method.
+            </remarks>
+        </member>
+        <member name="M:Castle.Facilities.Startable.StartableFacility.DeferredTryStart">
+            <summary>
+              This method changes behavior of the facility. Deferred mode should be used when you
+              have single call to <see cref="M:Castle.Windsor.IWindsorContainer.Install(Castle.MicroKernel.Registration.IWindsorInstaller[])"/> and register all your components there.
+              Enabling this mode will optimize the behavior of the facility so that it will wait 'till the end of
+              installation and only after all <see cref="T:Castle.MicroKernel.Registration.IWindsorInstaller"/>s were ran it will instantiate and
+              start all the startable components. No exception will be thrown if a startable component can't be 
+              instantiated and started. If you'd rather fail fast and diagnose issues quickly, use <see cref="M:Castle.Facilities.Startable.StartableFacility.DeferredStart"/> method instead.
+            </summary>
+            <remarks>
+              It is recommended to use <see cref="M:Castle.Facilities.Startable.StartableFacility.DeferredStart"/> method over this method.
+            </remarks>
+        </member>
+        <member name="M:Castle.Facilities.Startable.StartableFacility.CheckWaitingList">
+            <summary>
+              For each new component registered,
+              some components in the WaitingDependency
+              state may have became valid, so we check them
+            </summary>
+        </member>
+        <member name="M:Castle.Facilities.Startable.StartableFacility.TryStart(Castle.MicroKernel.IHandler)">
+            <summary>
+              Request the component instance
+            </summary>
+            <param name = "handler"></param>
+        </member>
+        <member name="M:Castle.Facilities.Startable.StartableFacilityRegistrationExtensions.StartUsingMethod``1(Castle.MicroKernel.Registration.ComponentRegistration{``0},System.String)">
+            <summary>
+            Assigns the start method for the startable.
+            </summary>
+            <param name="registration"></param>
+            <param name="startMethod">The start method.</param>
+            <returns></returns>
+            <remarks>Be sure that you first added the <see cref="T:Castle.Facilities.Startable.StartableFacility"/> 
+            to the kernel, before registering this component.</remarks>
+        </member>
+        <member name="M:Castle.Facilities.Startable.StartableFacilityRegistrationExtensions.StartUsingMethod``1(Castle.MicroKernel.Registration.ComponentRegistration{``0},System.Linq.Expressions.Expression{System.Func{``0,System.Action}})">
+            <summary>
+            Assigns the start method for the startable.
+            </summary>
+            <param name="registration"></param>
+            <param name="methodToUse">Method to use. something like: StartUsingMethod(s =&gt; s.Start)</param>
+            <returns></returns>
+            <remarks>Be sure that you first added the <see cref="T:Castle.Facilities.Startable.StartableFacility"/> 
+            to the kernel, before registering this component.</remarks>
+        </member>
+        <member name="M:Castle.Facilities.Startable.StartableFacilityRegistrationExtensions.StopUsingMethod``1(Castle.MicroKernel.Registration.ComponentRegistration{``0},System.String)">
+            <summary>
+            Assigns the stop method for the startable.
+            </summary>
+            <param name="registration"></param>
+            <param name="stopMethod">The stop method.</param>
+            <returns></returns>
+            <remarks>Be sure that you first added the <see cref="T:Castle.Facilities.Startable.StartableFacility"/> 
+            to the kernel, before registering this component.</remarks>
+        </member>
+        <member name="M:Castle.Facilities.Startable.StartableFacilityRegistrationExtensions.StopUsingMethod``1(Castle.MicroKernel.Registration.ComponentRegistration{``0},System.Linq.Expressions.Expression{System.Func{``0,System.Action}})">
+            <summary>
+            Assigns the stop method for the startable.
+            </summary>
+            <param name="registration"></param>
+            <param name="methodToUse">Method to use. something like: StartUsingMethod(s =&gt; s.Start)</param>
+            <returns></returns>
+            <remarks>Be sure that you first added the <see cref="T:Castle.Facilities.Startable.StartableFacility"/> 
+            to the kernel, before registering this component.</remarks>
+        </member>
+        <member name="T:Castle.Facilities.TypedFactory.FactoryEntry">
+            <summary>
+            Legacy class from old impl. of the facility. Do not use it.
+            </summary>
+        </member>
+        <member name="T:Castle.Facilities.TypedFactory.Internal.FactoryInterceptor">
+            <summary>
+            Legacy interceptor for old impl. of the facility.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Interceptor.IOnBehalfAware">
+            <summary>
+            Interceptors might implement this to receive the
+            ComponentModel on behalf of the component where the
+            interceptor is acting.
+            </summary>
+        </member>
+        <member name="T:Castle.Facilities.TypedFactory.TypedFactoryComponent">
+            <summary>
+              Represents a single component to be resolved via Typed Factory
+            </summary>
+        </member>
+        <member name="M:Castle.Facilities.TypedFactory.TypedFactoryComponent.Resolve(Castle.MicroKernel.IKernel)">
+            <summary>
+              Resolves the component(s) from given kernel.
+            </summary>
+            <param name = "kernel"></param>
+            <returns>Resolved component(s).</returns>
+        </member>
+        <member name="T:Castle.Facilities.TypedFactory.TypedFactoryComponentCollection">
+            <summary>
+              Represents a set of components to be resolved via Typed Factory. Uses <see cref="M:Castle.MicroKernel.IKernel.ResolveAll(System.Type,System.Collections.IDictionary)"/> to resolve the components.
+            </summary>
+        </member>
+        <member name="M:Castle.Facilities.TypedFactory.TypedFactoryComponentCollection.#ctor(System.Type,System.Collections.IDictionary)">
+            <summary>
+              Creates new instance of <see cref="T:Castle.Facilities.TypedFactory.TypedFactoryComponentCollection"/>.
+            </summary>
+            <param name="componentCollectionType">Collection type to resolve. Must be an array (SomeComponent[]) or IEnumerable{SomeComponent}. Type of the element of the collection will be used as first argument to <see cref="M:Castle.MicroKernel.IKernel.ResolveAll(System.Type,System.Collections.IDictionary)"/></param>
+            <param name="additionalArguments">Additional arguents that will be passed as second argument to <see cref="M:Castle.MicroKernel.IKernel.ResolveAll(System.Type,System.Collections.IDictionary)"/></param>
+        </member>
+        <member name="T:Castle.Facilities.TypedFactory.TypedFactoryFacility">
+            <summary>
+              Provides automatically generated factories on top of interfaces or delegates that
+              you can use to pull components out of the container without ever referencing it 
+              explicitly.
+            </summary>
+        </member>
+        <member name="M:Castle.Facilities.TypedFactory.TypedFactoryRegistrationExtensions.AsFactory``1(Castle.MicroKernel.Registration.ComponentRegistration{``0})">
+            <summary>
+              Marks the component as typed factory.
+            </summary>
+            <typeparam name="TFactoryInterface"></typeparam>
+            <param name="registration"></param>
+            <returns></returns>
+            <remarks>
+              Only interfaces are legal to use as typed factories. Methods with out parameters are not allowed.
+              When registering component as typed factory no implementation should be provided (in case there is any it will be ignored).
+              Typed factories rely on <see cref="T:Castle.DynamicProxy.IInterceptorSelector"/> set internally, so users should not set interceptor selectors explicitly;
+              otherwise the factory will not function correctly.
+            </remarks>
+        </member>
+        <member name="M:Castle.Facilities.TypedFactory.TypedFactoryRegistrationExtensions.AsFactory``1(Castle.MicroKernel.Registration.ComponentRegistration{``0},System.Action{Castle.Facilities.TypedFactory.TypedFactoryConfiguration})">
+            <summary>
+              Marks the component as typed factory.
+            </summary>
+            <typeparam name="TFactoryInterface"></typeparam>
+            <param name="registration"></param>
+            <param name="configuration"></param>
+            <returns></returns>
+            <remarks>
+              Only interfaces are legal to use as typed factories. Methods with out parameters are not allowed.
+              When registering component as typed factory no implementation should be provided (in case there is any it will be ignored).
+              Typed factories rely on <see cref="T:Castle.DynamicProxy.IInterceptorSelector"/> set internally, so users should not set interceptor selectors explicitly;
+              otherwise the factory will not function correctly.
+            </remarks>
+        </member>
+        <member name="T:Castle.MicroKernel.Handlers.ParentHandlerWithChildResolver">
+            <summary>
+              Redirects resolution to the main resolver, and if not found uses
+              the parent handler.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Handlers.ParentHandlerWithChildResolver.#ctor(Castle.MicroKernel.IHandler,Castle.MicroKernel.ISubDependencyResolver)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.MicroKernel.Handlers.ParentHandlerWithChildResolver"/> class.
+            </summary>
+            <param name="parentHandler">The parent handler.</param>
+            <param name="childResolver">The child resolver.</param>
+        </member>
+        <member name="T:Castle.MicroKernel.Handlers.DefaultGenericHandler">
+            <summary>
+            Summary description for DefaultGenericHandler.
+            </summary>
+            <remarks>
+            TODO: Consider refactoring AbstractHandler moving lifestylemanager
+            creation to DefaultHandler
+            </remarks>
+        </member>
+        <member name="M:Castle.MicroKernel.Handlers.DefaultGenericHandler.#ctor(Castle.Core.ComponentModel)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.Handlers.DefaultGenericHandler"/> class.
+            </summary>
+            <param name="model"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.Handlers.DefaultGenericHandler.CloneParentProperties(Castle.Core.ComponentModel)">
+            <summary>
+            Clone some of the parent componentmodel properties to the generic subhandler.
+            </summary>
+            <remarks>
+            The following properties are copied:
+            <list type="bullet">
+            <item>
+            	<description>The <see cref="T:Castle.Core.LifestyleType"/></description>
+            </item>
+            <item>
+            	<description>The <see cref="P:Castle.Core.ComponentModel.Interceptors"/></description>
+            </item>
+            </list>
+            </remarks>
+            <param name="newModel">the subhandler</param>
+        </member>
+        <member name="T:Castle.MicroKernel.Handlers.DefaultHandlerFactory">
+            <summary>
+            Summary description for DefaultHandlerFactory.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.IHandlerFactory">
+            <summary>
+            Extension point to allow the developer
+            to use his implementation of <see cref="T:Castle.MicroKernel.IHandler"/>
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Handlers.HandlerException">
+            <summary>
+            Summary description for HandlerException.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Handlers.HandlerException.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.Handlers.HandlerException"/> class.
+            </summary>
+            <param name="message">The message.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.Handlers.HandlerException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.Handlers.HandlerException"/> class.
+            </summary>
+            <param name="info">The object that holds the serialized object data.</param>
+            <param name="context">The contextual information about the source or destination.</param>
+        </member>
+        <member name="T:Castle.MicroKernel.HandlerState">
+            <summary>
+            Possible states for a IHandler instance
+            </summary>
+        </member>
+        <member name="F:Castle.MicroKernel.HandlerState.Valid">
+            <summary>
+            The component can be requested
+            </summary>
+        </member>
+        <member name="F:Castle.MicroKernel.HandlerState.WaitingDependency">
+            <summary>
+            The component can not be requested 
+            as it still depending on a external 
+            dependency not yet available
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.HandlerStateDelegate">
+            <summary>
+            
+            </summary>
+            <param name="source"></param>
+            <param name="args"></param>
+        </member>
+        <member name="T:Castle.MicroKernel.ComponentDataDelegate">
+            <summary>
+            Represents a delegate which holds basic information about a component.
+            </summary>
+            <param name="key">Key which identifies the component</param>
+            <param name="handler">handler that holds this component and is capable of 
+            creating an instance of it.
+            </param>
+        </member>
+        <member name="T:Castle.MicroKernel.ComponentInstanceDelegate">
+            <summary>
+            Represents a delegate which holds basic information about a component
+            and its instance.
+            </summary>
+            <param name="model">Component meta information</param>
+            <param name="instance">Component instance</param>
+        </member>
+        <member name="T:Castle.MicroKernel.ComponentModelDelegate">
+            <summary>
+            Represents a delegate which holds the information about the 
+            component
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.HandlerDelegate">
+            <summary>
+            Represents a delegate which holds a handler
+            </summary>
+            <param name="handler">handler that holds a component and is capable of 
+            creating an instance of it.
+            </param>
+            <param name="stateChanged"></param>
+        </member>
+        <member name="T:Castle.MicroKernel.DependencyDelegate">
+            <summary>
+            Represents a delegate which holds dependency
+            resolving information.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Internal.IVertex">
+            <summary>
+            Abstract representation of a vertex.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Internal.GraphNode.Dependers">
+            <summary>
+            The nodes that depends on this node
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Internal.GraphNode.Dependents">
+            <summary>
+            The nodes that this node depends
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Internal.VertexColor.White">
+            <summary>
+            The node has not been visited yet
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Internal.VertexColor.Gray">
+            <summary>
+            This node is in the process of being visited
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Internal.VertexColor.Black">
+            <summary>
+            This now was visited
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Internal.ColorsSet">
+            <summary>
+            Represents a collection of objects
+            which are guaranteed to be unique 
+            and holds a color for them
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Internal.TimestampSet">
+            <summary>
+            Holds a timestamp (integer) 
+            for a given item
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.LifecycleConcerns.DisposalConcern">
+            <summary>
+            Summary description for DisposalConcern.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.LifecycleConcerns.InitializationConcern">
+            <summary>
+            Summary description for InitializationConcern.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.LifecycleConcerns.LateBoundConcerns">
+            <summary>
+            Lifetime concern that works for components that don't have their actual type determined upfront
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.LifecycleConcerns.SupportInitializeConcern">
+            <summary>
+            Summary description for SupportInitializeConcern.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.IRecyclable">
+            <summary>
+            Only called for components that 
+            belongs to a pool when the component
+            comes back to the pool.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.IRecyclable.Recycle">
+            <summary>
+            Implementors should perform any 
+            initialization/clean up.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.IStartable">
+            <summary>
+            Interface for components that wish to be started by the container
+            </summary>
+        </member>
+        <member name="M:Castle.Core.IStartable.Start">
+            <summary>
+            Starts this instance.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.IStartable.Stop">
+            <summary>
+            Stops this instance.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Lifestyle.PerThreadLifestyleManager">
+            <summary>
+            Summary description for PerThreadLifestyleManager.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Lifestyle.PerThreadLifestyleManager.Dispose">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Lifestyle.PoolableLifestyleManager">
+            <summary>
+            Implements a Poolable Lifestyle Manager. 
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Lifestyle.Pool.IPool">
+            <summary>
+            Pool implementation contract. 
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Lifestyle.Pool.IPool.Request(Castle.MicroKernel.Context.CreationContext)">
+            <summary>
+            Implementors should return a component instance.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Lifestyle.Pool.IPool.Release(System.Object)">
+            <summary>
+            Implementors should release the instance or put it
+            on the pool
+            </summary>
+            <param name="instance"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.Lifestyle.Pool.DefaultPool.InitPool">
+            <summary>
+            Initializes the pool to a initial size by requesting
+            n components and then releasing them.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Lifestyle.SingletonLifestyleManager">
+            <summary>
+            Summary description for SingletonLifestyleManager.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Lifestyle.TransientLifestyleManager">
+            <summary>
+            Summary description for TransientLifestyleManager.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.ModelBuilder.DefaultComponentModelBuilder">
+            <summary>
+            Summary description for DefaultComponentModelBuilder.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.IComponentModelBuilder">
+            <summary>
+            Implementors must construct a populated
+            instance of ComponentModel by inspecting the component
+            and|or the configuration.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.IComponentModelBuilder.BuildModel(System.String,System.Type,System.Type,System.Collections.IDictionary)">
+            <summary>
+            Constructs a new ComponentModel by invoking
+            the registered contributors.
+            </summary>
+            <param name="key"></param>
+            <param name="service"></param>
+            <param name="classType"></param>
+            <param name="extendedProperties"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IComponentModelBuilder.AddContributor(Castle.MicroKernel.ModelBuilder.IContributeComponentModelConstruction)">
+            <summary>
+            "To give or supply in common with others; give to a 
+            common fund or for a common purpose". The contributor
+            should inspect the component, or even the configuration
+            associated with the component, to add or change information
+            in the model that can be used later.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.IComponentModelBuilder.RemoveContributor(Castle.MicroKernel.ModelBuilder.IContributeComponentModelConstruction)">
+            <summary>
+            Removes the specified contributor
+            </summary>
+            <param name="contributor"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.ModelBuilder.DefaultComponentModelBuilder.#ctor(Castle.MicroKernel.IKernel)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.ModelBuilder.DefaultComponentModelBuilder"/> class.
+            </summary>
+            <param name="kernel">The kernel.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.ModelBuilder.DefaultComponentModelBuilder.BuildModel(System.String,System.Type,System.Type,System.Collections.IDictionary)">
+            <summary>
+            Constructs a new ComponentModel by invoking
+            the registered contributors.
+            </summary>
+            <param name="key"></param>
+            <param name="service"></param>
+            <param name="classType"></param>
+            <param name="extendedProperties"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.ModelBuilder.DefaultComponentModelBuilder.AddContributor(Castle.MicroKernel.ModelBuilder.IContributeComponentModelConstruction)">
+            <summary>
+            "To give or supply in common with others; give to a
+            common fund or for a common purpose". The contributor
+            should inspect the component, or even the configuration
+            associated with the component, to add or change information
+            in the model that can be used later.
+            </summary>
+            <param name="contributor"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.ModelBuilder.DefaultComponentModelBuilder.RemoveContributor(Castle.MicroKernel.ModelBuilder.IContributeComponentModelConstruction)">
+            <summary>
+            Removes the specified contributor
+            </summary>
+            <param name="contributor"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.ModelBuilder.DefaultComponentModelBuilder.InitializeContributors">
+            <summary>
+            Initializes the default contributors.
+            </summary>
+        </member>
+        <member name="P:Castle.MicroKernel.ModelBuilder.DefaultComponentModelBuilder.Contributors">
+            <summary>
+            Gets the contributors.
+            </summary>
+            <value>The contributors.</value>
+        </member>
+        <member name="T:Castle.MicroKernel.ModelBuilder.Inspectors.ComponentActivatorInspector">
+            <summary>
+            Inspects the component configuration and the type looking for a
+            definition of component activator type. The configuration preceeds whatever
+            is defined in the component.
+            </summary>
+            <remarks>
+            This inspector is not guarantee to always set up an component activator type. 
+            If nothing could be found it wont touch the model. In this case is up to
+            the kernel to establish a default component activator for components.
+            </remarks>
+        </member>
+        <member name="M:Castle.MicroKernel.ModelBuilder.Inspectors.ComponentActivatorInspector.ProcessModel(Castle.MicroKernel.IKernel,Castle.Core.ComponentModel)">
+            <summary>
+            Searches for the component activator in the configuration and, if unsuccessful
+            look for the component activator attribute in the implementation type.
+            </summary>
+            <param name="kernel">The kernel instance</param>
+            <param name="model">The model instance</param>
+        </member>
+        <member name="M:Castle.MicroKernel.ModelBuilder.Inspectors.ComponentActivatorInspector.ReadComponentActivatorFromConfiguration(Castle.Core.ComponentModel)">
+            <summary>
+            Reads the attribute "componentActivatorType" associated with the 
+            component configuration and verifies it implements the <see cref="T:Castle.MicroKernel.IComponentActivator"/> 
+            interface. 
+            </summary>
+            <exception cref="T:System.Exception">
+            If the type does not implement the proper interface
+            </exception>
+            <param name="model"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.ModelBuilder.Inspectors.ComponentActivatorInspector.ReadComponentActivatorFromType(Castle.Core.ComponentModel)">
+            <summary>
+            Check if the type expose one of the component activator attributes
+            defined in Castle.Core namespace.
+            </summary>
+            <param name="model"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.ModelBuilder.Inspectors.ComponentActivatorInspector.ValidateComponentActivator(System.Type)">
+            <summary>
+            Validates that the provide type implements IComponentActivator
+            </summary>
+            <param name="customComponentActivator">The custom component activator.</param>
+        </member>
+        <member name="T:Castle.MicroKernel.ModelBuilder.Inspectors.ComponentProxyInspector">
+            <summary>
+            Inspects the component configuration and type looking for information
+            that can influence the generation of a proxy for that component.
+            <para>
+            We specifically look for <c>useSingleInterfaceProxy</c> and <c>marshalByRefProxy</c> 
+            on the component configuration or the <see cref="T:Castle.Core.ComponentProxyBehaviorAttribute"/> 
+            attribute.
+            </para>
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.ModelBuilder.Inspectors.ComponentProxyInspector.ProcessModel(Castle.MicroKernel.IKernel,Castle.Core.ComponentModel)">
+            <summary>
+            Searches for proxy behavior in the configuration and, if unsuccessful
+            look for the <see cref="T:Castle.Core.ComponentProxyBehaviorAttribute"/> attribute in 
+            the implementation type.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.ModelBuilder.Inspectors.ComponentProxyInspector.ReadProxyBehavior(Castle.MicroKernel.IKernel,Castle.Core.ComponentModel)">
+            <summary>
+            Reads the proxy behavior associated with the 
+            component configuration/type and applies it to the model.
+            </summary>
+            <exception cref="T:System.Exception">
+            If the conversion fails
+            </exception>
+            <param name="kernel"></param>
+            <param name="model"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.ModelBuilder.Inspectors.ComponentProxyInspector.GetProxyBehaviorFromType(System.Type)">
+            <summary>
+            Returns a <see cref="T:Castle.Core.ComponentProxyBehaviorAttribute"/> instance if the type
+            uses the attribute. Otherwise returns null.
+            </summary>
+            <param name="implementation"></param>
+        </member>
+        <member name="T:Castle.MicroKernel.ModelBuilder.Inspectors.ConfigurationModelInspector">
+            <summary>
+            Uses the ConfigurationStore registered in the kernel to obtain
+            an <see cref="T:Castle.Core.Configuration.IConfiguration"/> associated with the component.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.ModelBuilder.Inspectors.ConfigurationModelInspector.ProcessModel(Castle.MicroKernel.IKernel,Castle.Core.ComponentModel)">
+            <summary>
+            Queries the kernel's ConfigurationStore for a configuration
+            associated with the component name.
+            </summary>
+            <param name="kernel"></param>
+            <param name="model"></param>
+        </member>
+        <member name="T:Castle.MicroKernel.ModelBuilder.Inspectors.ConfigurationParametersInspector">
+            <summary>
+            Check for a node 'parameters' within the component 
+            configuration. For each child it, a ParameterModel is created
+            and added to ComponentModel's Parameters collection
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.ModelBuilder.Inspectors.ConfigurationParametersInspector.ProcessModel(Castle.MicroKernel.IKernel,Castle.Core.ComponentModel)">
+            <summary>
+            Inspect the configuration associated with the component
+            and populates the parameter model collection accordingly
+            </summary>
+            <param name="kernel"></param>
+            <param name="model"></param>
+        </member>
+        <member name="T:Castle.MicroKernel.ModelBuilder.Inspectors.ConstructorDependenciesModelInspector">
+            <summary>
+            This implementation of <see cref="T:Castle.MicroKernel.ModelBuilder.IContributeComponentModelConstruction"/>
+            collects all available constructors and populates them in the model
+            as candidates. The Kernel will pick up one of the candidates
+            according to a heuristic.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.ModelBuilder.Inspectors.ExtendedPropertiesConstants">
+            <summary>
+            Only to hold internal constants and get rid of 
+            magic numbers and hardcode names.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.ModelBuilder.Inspectors.InterceptorInspector">
+            <summary>
+            Inspect the component for <c>InterceptorAttribute</c> and
+            the configuration for the interceptors node
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.ModelBuilder.Inspectors.LifecycleModelInspector">
+            <summary>
+            Inspects the type looking for interfaces that constitutes
+            lifecycle interfaces, defined in the Castle.Model namespace.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.ModelBuilder.Inspectors.LifecycleModelInspector.ProcessModel(Castle.MicroKernel.IKernel,Castle.Core.ComponentModel)">
+            <summary>
+            Checks if the type implements <see cref="T:Castle.Core.IInitializable"/> and or
+            <see cref="T:System.IDisposable"/> interfaces.
+            </summary>
+            <param name="kernel"></param>
+            <param name="model"></param>
+        </member>
+        <member name="T:Castle.MicroKernel.ModelBuilder.Inspectors.LifestyleModelInspector">
+            <summary>
+            Inspects the component configuration and the type looking for a
+            definition of lifestyle type. The configuration preceeds whatever
+            is defined in the component.
+            </summary>
+            <remarks>
+            This inspector is not guarantee to always set up an lifestyle type. 
+            If nothing could be found it wont touch the model. In this case is up to
+            the kernel to establish a default lifestyle for components.
+            </remarks>
+        </member>
+        <member name="M:Castle.MicroKernel.ModelBuilder.Inspectors.LifestyleModelInspector.ProcessModel(Castle.MicroKernel.IKernel,Castle.Core.ComponentModel)">
+            <summary>
+            Searches for the lifestyle in the configuration and, if unsuccessful
+            look for the lifestyle attribute in the implementation type.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.ModelBuilder.Inspectors.LifestyleModelInspector.ReadLifestyleFromConfiguration(Castle.Core.ComponentModel)">
+            <summary>
+            Reads the attribute "lifestyle" associated with the 
+            component configuration and tries to convert to <see cref="T:Castle.Core.LifestyleType"/>  
+            enum type. 
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.ModelBuilder.Inspectors.LifestyleModelInspector.ReadLifestyleFromType(Castle.Core.ComponentModel)">
+            <summary>
+            Check if the type expose one of the lifestyle attributes
+            defined in Castle.Model namespace.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.ModelBuilder.Inspectors.MethodMetaInspector">
+            <summary>
+            Base for inspectors that want configuration associated with methods.
+            For each child a <see cref="T:Castle.Core.MethodMetaModel"/> is created
+            and added to ComponentModel's methods collection
+            </summary>
+            <remarks>
+            Implementors should override the <see cref="M:Castle.MicroKernel.ModelBuilder.Inspectors.MethodMetaInspector.ObtainNodeName"/> return
+            the name of the node to be inspected. For example:
+            <code>
+            <![CDATA[
+              <transactions>
+                <method name="Save" transaction="requires" />
+              </transactions>
+            ]]>
+            </code>
+            </remarks>
+        </member>
+        <member name="T:Castle.MicroKernel.ModelBuilder.Inspectors.PropertiesDependenciesModelInspector">
+            <summary>
+            This implementation of <see cref="T:Castle.MicroKernel.ModelBuilder.IContributeComponentModelConstruction"/>
+            collects all potential writable public properties exposed by the component 
+            implementation and populates the model with them.
+            The Kernel might be able to set some of these properties when the component 
+            is requested.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.ModelBuilder.Inspectors.PropertiesDependenciesModelInspector.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.ModelBuilder.Inspectors.PropertiesDependenciesModelInspector"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.ModelBuilder.Inspectors.PropertiesDependenciesModelInspector.ProcessModel(Castle.MicroKernel.IKernel,Castle.Core.ComponentModel)">
+            <summary>
+            Adds the properties as optional dependencies of this component.
+            </summary>
+            <param name="kernel"></param>
+            <param name="model"></param>
+        </member>
+        <member name="T:Castle.Core.ComponentModel">
+            <summary>
+            Represents the collection of information and
+            meta information collected about a component.
+            </summary>
+        </member>
+        <member name="F:Castle.Core.ComponentModel.extended">
+            <summary>Extended properties</summary>
+        </member>
+        <member name="F:Castle.Core.ComponentModel.dependencies">
+            <summary>Dependencies the kernel must resolve</summary>
+        </member>
+        <member name="F:Castle.Core.ComponentModel.constructors">
+            <summary>All available constructors</summary>
+        </member>
+        <member name="F:Castle.Core.ComponentModel.properties">
+            <summary>All potential properties that can be setted by the kernel</summary>
+        </member>
+        <member name="F:Castle.Core.ComponentModel.lifecycle">
+            <summary>Steps of lifecycle</summary>
+        </member>
+        <member name="F:Castle.Core.ComponentModel.parameters">
+            <summary>External parameters</summary>
+        </member>
+        <member name="F:Castle.Core.ComponentModel.interceptors">
+            <summary>Interceptors associated</summary>
+        </member>
+        <member name="F:Castle.Core.ComponentModel.customDependencies">
+            <summary>/// Custom dependencies/// </summary>
+        </member>
+        <member name="M:Castle.Core.ComponentModel.#ctor(System.String,System.Type,System.Type)">
+            <summary>
+            Constructs a ComponentModel
+            </summary>
+        </member>
+        <member name="M:Castle.Core.ComponentModel.Requires(System.Predicate{Castle.Core.PropertySet}[])">
+            <summary>
+            Requires the selected property dependencies.
+            </summary>
+            <param name="selectors">The property selector.</param>
+        </member>
+        <member name="M:Castle.Core.ComponentModel.Requires``1">
+            <summary>
+            Requires the property dependencies of type <typeparamref name="D"/>.
+            </summary>
+            <typeparam name="D">The dependency type.</typeparam>
+        </member>
+        <member name="P:Castle.Core.ComponentModel.Name">
+            <summary>
+            Sets or returns the component key
+            </summary>
+        </member>
+        <member name="P:Castle.Core.ComponentModel.Service">
+            <summary>
+            Gets or sets the service exposed.
+            </summary>
+            <value>The service.</value>
+        </member>
+        <member name="P:Castle.Core.ComponentModel.Implementation">
+            <summary>
+            Gets or sets the component implementation.
+            </summary>
+            <value>The implementation.</value>
+        </member>
+        <member name="P:Castle.Core.ComponentModel.RequiresGenericArguments">
+            <summary>
+            Gets or sets a value indicating whether the component requires generic arguments.
+            </summary>
+            <value>
+            <c>true</c> if generic arguments are required; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="P:Castle.Core.ComponentModel.ExtendedProperties">
+            <summary>
+            Gets or sets the extended properties.
+            </summary>
+            <value>The extended properties.</value>
+        </member>
+        <member name="P:Castle.Core.ComponentModel.Constructors">
+            <summary>
+            Gets the constructors candidates.
+            </summary>
+            <value>The constructors.</value>
+        </member>
+        <member name="P:Castle.Core.ComponentModel.Properties">
+            <summary>
+            Gets the properties set.
+            </summary>
+            <value>The properties.</value>
+        </member>
+        <member name="P:Castle.Core.ComponentModel.Configuration">
+            <summary>
+            Gets or sets the configuration.
+            </summary>
+            <value>The configuration.</value>
+        </member>
+        <member name="P:Castle.Core.ComponentModel.Lifecycle">
+            <summary>
+            Gets the lifecycle steps.
+            </summary>
+            <value>The lifecycle steps.</value>
+        </member>
+        <member name="P:Castle.Core.ComponentModel.LifestyleType">
+            <summary>
+            Gets or sets the lifestyle type.
+            </summary>
+            <value>The type of the lifestyle.</value>
+        </member>
+        <member name="P:Castle.Core.ComponentModel.InspectionBehavior">
+            <summary>
+            Gets or sets the strategy for
+            inspecting public properties 
+            on the components
+            </summary>
+        </member>
+        <member name="P:Castle.Core.ComponentModel.CustomLifestyle">
+            <summary>
+            Gets or sets the custom lifestyle.
+            </summary>
+            <value>The custom lifestyle.</value>
+        </member>
+        <member name="P:Castle.Core.ComponentModel.CustomComponentActivator">
+            <summary>
+            Gets or sets the custom component activator.
+            </summary>
+            <value>The custom component activator.</value>
+        </member>
+        <member name="P:Castle.Core.ComponentModel.Interceptors">
+            <summary>
+            Gets the interceptors.
+            </summary>
+            <value>The interceptors.</value>
+        </member>
+        <member name="P:Castle.Core.ComponentModel.Parameters">
+            <summary>
+            Gets the parameter collection.
+            </summary>
+            <value>The parameters.</value>
+        </member>
+        <member name="P:Castle.Core.ComponentModel.Dependencies">
+            <summary>
+            Dependencies are kept within constructors and
+            properties. Others dependencies must be 
+            registered here, so the kernel (as a matter 
+            of fact the handler) can check them
+            </summary>
+        </member>
+        <member name="P:Castle.Core.ComponentModel.CustomDependencies">
+            <summary>
+            Gets the custom dependencies.
+            </summary>
+            <value>The custom dependencies.</value>
+        </member>
+        <member name="T:Castle.Core.ConstructorCandidate">
+            <summary>
+            Represents a constructor of the component 
+            that the container can use to initialize it properly.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.ConstructorCandidate.#ctor(System.Reflection.ConstructorInfo,Castle.Core.DependencyModel[])">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Core.ConstructorCandidate"/> class.
+            </summary>
+            <param name="constructorInfo">The constructor info.</param>
+            <param name="dependencies">The dependencies.</param>
+        </member>
+        <member name="P:Castle.Core.ConstructorCandidate.Constructor">
+            <summary>
+            Gets the ConstructorInfo (from reflection).
+            </summary>
+            <value>The constructor.</value>
+        </member>
+        <member name="P:Castle.Core.ConstructorCandidate.Dependencies">
+            <summary>
+            Gets the dependencies this constructor candidate exposes.
+            </summary>
+            <value>The dependencies.</value>
+        </member>
+        <member name="T:Castle.Core.ConstructorCandidateCollection">
+            <summary>
+            Collection of <see cref="T:Castle.Core.ConstructorCandidate"/>
+            </summary>
+        </member>
+        <member name="P:Castle.Core.ConstructorCandidateCollection.FewerArgumentsCandidate">
+            <summary>
+            Gets the fewer arguments candidate.
+            </summary>
+            <value>The fewer arguments candidate.</value>
+        </member>
+        <member name="T:Castle.Core.DependencyModelCollection">
+            <summary>
+              Collection of <see cref="T:Castle.Core.DependencyModel"/>.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.InterceptorReference">
+            <summary>
+              Represents an reference to a Interceptor component.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.IReference`1">
+            <summary>
+            Represents obtained just in time object.
+            </summary>
+            <typeparam name="T"></typeparam>
+        </member>
+        <member name="M:Castle.MicroKernel.IReference`1.Resolve(Castle.MicroKernel.IKernel,Castle.MicroKernel.Context.CreationContext)">
+            <summary>
+            Resolves object referenced by this reference, optionally using provided <paramref name="kernel"/>.
+            If object is resolved from the kernel, the <paramref name="context"/> should be used to guard
+            against against cyclic dependencies.
+            </summary>
+            <param name="kernel"></param>
+            <param name="context"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IReference`1.Attach(Castle.Core.DependencyModelCollection)">
+            <summary>
+            If the reference introduces dependency on a component, should return <see cref="T:Castle.Core.DependencyModel"/> for that dependency, otherwise <c>null</c>.
+            </summary>
+            <param name="dependencies"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.InterceptorReference.#ctor(System.String)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.Core.InterceptorReference"/> class.
+            </summary>
+            <param name="componentKey">The component key.</param>
+        </member>
+        <member name="M:Castle.Core.InterceptorReference.#ctor(System.Type)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.Core.InterceptorReference"/> class.
+            </summary>
+            <param name="serviceType">Type of the service.</param>
+        </member>
+        <member name="M:Castle.Core.InterceptorReference.ForKey(System.String)">
+            <summary>
+              Gets an <see cref="T:Castle.Core.InterceptorReference"/> for the component key.
+            </summary>
+            <param name="key">The component key.</param>
+            <returns>The <see cref="T:Castle.Core.InterceptorReference"/></returns>
+        </member>
+        <member name="M:Castle.Core.InterceptorReference.ForType(System.Type)">
+            <summary>
+              Gets an <see cref="T:Castle.Core.InterceptorReference"/> for the service.
+            </summary>
+            <param name="service">The service.</param>
+            <returns>The <see cref="T:Castle.Core.InterceptorReference"/></returns>
+        </member>
+        <member name="M:Castle.Core.InterceptorReference.ForType``1">
+            <summary>
+              Gets an <see cref="T:Castle.Core.InterceptorReference"/> for the service.
+            </summary>
+            <typeparam name="T">The service type.</typeparam>
+            <returns>The <see cref="T:Castle.Core.InterceptorReference"/></returns>
+        </member>
+        <member name="T:Castle.Core.InterceptorReferenceCollection">
+            <summary>
+              Collection of <see cref="T:Castle.Core.InterceptorReference"/>
+            </summary>
+        </member>
+        <member name="M:Castle.Core.InterceptorReferenceCollection.AddFirst(Castle.Core.InterceptorReference)">
+            <summary>
+              Adds the specified interceptor as the first.
+            </summary>
+            <param name = "item">The interceptor.</param>
+        </member>
+        <member name="M:Castle.Core.InterceptorReferenceCollection.AddIfNotInCollection(Castle.Core.InterceptorReference)">
+            <summary>
+              Adds the interceptor to the end of the interceptors list if it does not exist already.
+            </summary>
+            <param name = "interceptorReference">The interceptor reference.</param>
+        </member>
+        <member name="M:Castle.Core.InterceptorReferenceCollection.AddLast(Castle.Core.InterceptorReference)">
+            <summary>
+              Adds the specified interceptor as the last.
+            </summary>
+            <param name = "item">The interceptor.</param>
+        </member>
+        <member name="M:Castle.Core.InterceptorReferenceCollection.Insert(System.Int32,Castle.Core.InterceptorReference)">
+            <summary>
+              Inserts the specified interceptor at the specified index.
+            </summary>
+            <param name = "index">The index.</param>
+            <param name = "item">The interceptor.</param>
+        </member>
+        <member name="M:Castle.Core.InterceptorReferenceCollection.Add(Castle.Core.InterceptorReference)">
+            <summary>
+              Adds the specified item.
+            </summary>
+            <param name = "item">The interceptor.</param>
+        </member>
+        <member name="M:Castle.Core.InterceptorReferenceCollection.GetEnumerator">
+            <summary>
+              Returns an enumerator that can iterate through a collection.
+            </summary>
+            <returns>
+              An <see cref = "T:System.Collections.IEnumerator" />
+              that can be used to iterate through the collection.
+            </returns>
+        </member>
+        <member name="P:Castle.Core.InterceptorReferenceCollection.HasInterceptors">
+            <summary>
+              Gets a value indicating whether this instance has interceptors.
+            </summary>
+            <value>
+              <c>true</c> if this instance has interceptors; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="P:Castle.Core.InterceptorReferenceCollection.Count">
+            <summary>
+              Gets the number of
+              elements contained in the <see cref = "T:System.Collections.ICollection" />.
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Castle.Core.LifecycleConcernsCollection">
+            <summary>
+            Represents a collection of ordered lifecycle concerns.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.LifecycleConcernsCollection.CommissionConcerns">
+            <summary>
+            Returns all concerns for the commission phase
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Castle.Core.LifecycleConcernsCollection.DecommissionConcerns">
+            <summary>
+            Returns all concerns for the decommission phase
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Castle.Core.LifecycleConcernsCollection.HasCommissionConcerns">
+            <summary>
+            Gets a value indicating whether this instance has commission steps.
+            </summary>
+            <value>
+            	<c>true</c> if this instance has commission steps; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="P:Castle.Core.LifecycleConcernsCollection.HasDecommissionConcerns">
+            <summary>
+            Gets a value indicating whether this instance has decommission steps.
+            </summary>
+            <value>
+            	<c>true</c> if this instance has decommission steps; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="T:Castle.Core.MethodMetaModel">
+            <summary>
+            Represents meta information associated with a method
+            (not yet defined)
+            </summary>
+        </member>
+        <member name="M:Castle.Core.MethodMetaModel.#ctor(Castle.Core.Configuration.IConfiguration)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Core.MethodMetaModel"/> class.
+            </summary>
+            <param name="configNode">The config node.</param>
+        </member>
+        <member name="P:Castle.Core.MethodMetaModel.ConfigNode">
+            <summary>
+            Gets the config node.
+            </summary>
+            <value>The config node.</value>
+        </member>
+        <member name="T:Castle.Core.MethodMetaModelCollection">
+            <summary>
+            Collection of <see cref="T:Castle.Core.MethodMetaModel"/>
+            </summary>
+        </member>
+        <member name="P:Castle.Core.MethodMetaModelCollection.MethodInfo2Model">
+            <summary>
+            Gets the method info2 model.
+            </summary>
+            <value>The method info2 model.</value>
+        </member>
+        <member name="T:Castle.Core.ParameterModel">
+            <summary>
+            Represents a parameter. Usually the parameter
+            comes from the external world, ie, an external configuration.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.ParameterModel.#ctor(System.String,System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Core.ParameterModel"/> class.
+            </summary>
+            <param name="name">The name.</param>
+            <param name="value">The value.</param>
+        </member>
+        <member name="M:Castle.Core.ParameterModel.#ctor(System.String,Castle.Core.Configuration.IConfiguration)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Core.ParameterModel"/> class.
+            </summary>
+            <param name="name">The name.</param>
+            <param name="value">The value.</param>
+        </member>
+        <member name="P:Castle.Core.ParameterModel.Name">
+            <summary>
+            Gets the name.
+            </summary>
+            <value>The name.</value>
+        </member>
+        <member name="P:Castle.Core.ParameterModel.Value">
+            <summary>
+            Gets the value.
+            </summary>
+            <value>The value.</value>
+        </member>
+        <member name="P:Castle.Core.ParameterModel.ConfigValue">
+            <summary>
+            Gets the config value.
+            </summary>
+            <value>The config value.</value>
+        </member>
+        <member name="T:Castle.Core.ParameterModelCollection">
+            <summary>
+            Collection of <see cref="T:Castle.Core.ParameterModel"/>
+            </summary>
+        </member>
+        <member name="M:Castle.Core.ParameterModelCollection.Add(System.String,System.String)">
+            <summary>
+            Adds the specified name.
+            </summary>
+            <param name="name">The name.</param>
+            <param name="value">The value.</param>
+        </member>
+        <member name="M:Castle.Core.ParameterModelCollection.Add(System.String,Castle.Core.Configuration.IConfiguration)">
+            <summary>
+            Adds the specified name.
+            </summary>
+            <param name="name">The name.</param>
+            <param name="configNode">The config node.</param>
+        </member>
+        <member name="M:Castle.Core.ParameterModelCollection.Contains(System.Object)">
+            <summary>
+            Determines whether this collection contains the specified key.
+            </summary>
+            <param name="key">The key.</param>
+            <returns>
+            <c>true</c> if yes; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="M:Castle.Core.ParameterModelCollection.Add(System.Object,System.Object)">
+            <summary>
+            Adds the specified key.
+            </summary>
+            <remarks>
+            Not implemented
+            </remarks>
+            <param name="key">The key.</param>
+            <param name="value">The value.</param>
+        </member>
+        <member name="M:Castle.Core.ParameterModelCollection.Clear">
+            <summary>
+            Clears this instance.
+            </summary>
+            <remarks>
+            Not implemented
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.ParameterModelCollection.Remove(System.Object)">
+            <summary>
+            Removes the specified key.
+            </summary>
+            <param name="key">The key.</param>
+            <remarks>
+            Not implemented
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.ParameterModelCollection.CopyTo(System.Array,System.Int32)">
+            <summary>
+            Copy the content to the specified array
+            </summary>
+            <param name="array">target array</param>
+            <param name="index">target index</param>
+            <remarks>
+            Not implemented
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.ParameterModelCollection.GetEnumerator">
+            <summary>
+            Returns an enumerator that can iterate through a collection.
+            </summary>
+            <returns>
+            An <see cref="T:System.Collections.IEnumerator"/>
+            that can be used to iterate through the collection.
+            </returns>
+        </member>
+        <member name="P:Castle.Core.ParameterModelCollection.Keys">
+            <summary>
+            Gets the keys.
+            </summary>
+            <value>The keys.</value>
+            <remarks>
+            Not implemented
+            </remarks>
+        </member>
+        <member name="P:Castle.Core.ParameterModelCollection.Values">
+            <summary>
+            Gets the values.
+            </summary>
+            <value>The values.</value>
+            <remarks>
+            Not implemented
+            </remarks>
+        </member>
+        <member name="P:Castle.Core.ParameterModelCollection.IsReadOnly">
+            <summary>
+            Gets a value indicating whether this instance is read only.
+            </summary>
+            <value>
+            	<c>true</c> if this instance is read only; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="P:Castle.Core.ParameterModelCollection.IsFixedSize">
+            <summary>
+            Gets a value indicating whether this instance is fixed size.
+            </summary>
+            <value>
+            	<c>true</c> if this instance is fixed size; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="P:Castle.Core.ParameterModelCollection.Item(System.Object)">
+            <summary>
+            Gets the <see cref="T:Castle.Core.ParameterModel"/> with the specified key.
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Castle.Core.ParameterModelCollection.Count">
+            <summary>
+            Gets the count.
+            </summary>
+            <value>The count.</value>
+        </member>
+        <member name="P:Castle.Core.ParameterModelCollection.SyncRoot">
+            <summary>
+            Gets the sync root.
+            </summary>
+            <value>The sync root.</value>
+        </member>
+        <member name="P:Castle.Core.ParameterModelCollection.IsSynchronized">
+            <summary>
+            Gets a value indicating whether this instance is synchronized.
+            </summary>
+            <value>
+            	<c>true</c> if this instance is synchronized; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="T:Castle.Core.PropertySet">
+            <summary>
+            Represents a property and the respective dependency.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.PropertySet.#ctor(System.Reflection.PropertyInfo,Castle.Core.DependencyModel)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Core.PropertySet"/> class.
+            </summary>
+            <param name="propertyInfo">The property info.</param>
+            <param name="dependency">The dependency.</param>
+        </member>
+        <member name="P:Castle.Core.PropertySet.Property">
+            <summary>
+            Gets the property.
+            </summary>
+            <value>The property.</value>
+        </member>
+        <member name="P:Castle.Core.PropertySet.Dependency">
+            <summary>
+            Gets the dependency.
+            </summary>
+            <value>The dependency.</value>
+        </member>
+        <member name="T:Castle.Core.PropertySetCollection">
+            <summary>
+            Collection of <see cref="T:Castle.Core.PropertySet"/>
+            </summary>
+        </member>
+        <member name="M:Castle.Core.PropertySetCollection.FindByPropertyInfo(System.Reflection.PropertyInfo)">
+            <summary>
+            Finds a PropertySet the by PropertyInfo.
+            </summary>
+            <param name="info">The info.</param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.MicroKernel.ComponentReference`1">
+            <summary>
+            Reference to component obtained from a container.
+            </summary>
+            <typeparam name="T"></typeparam>
+        </member>
+        <member name="T:Castle.MicroKernel.Proxy.IModelInterceptorsSelector">
+            <summary>
+            Select the appropriate interceptors based on the application specific
+            business logic
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Proxy.IModelInterceptorsSelector.HasInterceptors(Castle.Core.ComponentModel)">
+            <summary>
+            Determine whatever the specified has interceptors.
+            The selector should only return true from this method if it has determined that is
+            a model that it would likely add interceptors to.
+            </summary>
+            <param name="model">The model</param>
+            <returns>Whatever this selector is likely to add interceptors to the specified model</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Proxy.IModelInterceptorsSelector.SelectInterceptors(Castle.Core.ComponentModel,Castle.Core.InterceptorReference[])">
+            <summary>
+            Select the appropriate interceptor references.
+            The interceptor references aren't necessarily registered in the model.Intereceptors
+            </summary>
+            <param name="model">The model to select the interceptors for</param>
+            <param name="interceptors">The interceptors selected by previous selectors in the pipeline or <see cref="P:Castle.Core.ComponentModel.Interceptors"/> if this is the first interceptor in the pipeline.</param>
+            <returns>The interceptor for this model (in the current context) or a null reference</returns>
+            <remarks>
+            If the selector is not interested in modifying the interceptors for this model, it 
+            should return <paramref name="interceptors"/> and the next selector in line would be executed.
+            If the selector wants no interceptors to be used it can either return <c>null</c> or empty array.
+            However next interceptor in line is free to override this choice.
+            </remarks>
+        </member>
+        <member name="T:Castle.MicroKernel.InstanceReference`1">
+            <summary>
+            Represents a reference to an existing object.
+            </summary>
+            <typeparam name="T"></typeparam>
+        </member>
+        <member name="T:Castle.MicroKernel.IProxyFactory">
+            <summary>
+            Defines the contract used by the kernel 
+            to obtain proxies for components. The implementor
+            must return a proxied instance that dispatch 
+            the invocation to the registered interceptors in the model
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.IProxyFactory.Create(Castle.MicroKernel.IKernel,System.Object,Castle.Core.ComponentModel,Castle.MicroKernel.Context.CreationContext,System.Object[])">
+            <summary>
+            Implementors must create a proxy based on 
+            the information exposed by ComponentModel
+            </summary>
+            <param name="kernel">The kernel instance</param>
+            <param name="model">The component model</param>
+            <param name="instance">The component instance to be proxy (only required in some cases)</param>
+            <param name="constructorArguments">array of parameters to the constructor (if any)</param>
+            <param name="context">The creation context</param>
+            <returns>proxy instance</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IProxyFactory.RequiresTargetInstance(Castle.MicroKernel.IKernel,Castle.Core.ComponentModel)">
+            <summary>
+            Implementor should check the component model
+            and determine if the caller must pass on the component 
+            instance to the proxy
+            </summary>
+            <param name="kernel">The kernel instance</param>
+            <param name="model">The component model</param>
+            <returns><c>true</c> if an instance must be passed to <see cref="M:Castle.MicroKernel.IProxyFactory.Create(Castle.MicroKernel.IKernel,System.Object,Castle.Core.ComponentModel,Castle.MicroKernel.Context.CreationContext,System.Object[])"/></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.IProxyFactory.AddInterceptorSelector(Castle.MicroKernel.Proxy.IModelInterceptorsSelector)">
+            <summary>
+            Add the selector to the list of selectors that can affect interceptor's decisions
+            in the container.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.IProxyFactory.ShouldCreateProxy(Castle.Core.ComponentModel)">
+            <summary>
+            Determines whatever we need to create a proxy for this model
+            </summary>
+            <param name="model"></param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.MicroKernel.Proxy.NotSupportedProxyFactory">
+            <summary>
+            This is a placeholder implementation of <see cref="T:Castle.MicroKernel.IProxyFactory"/>.
+            </summary>
+            <remarks>
+            The decision to supply no implementation for <see cref="T:Castle.MicroKernel.IProxyFactory"/>
+            is supported by the fact that the MicroKernel should be a thin
+            assembly with the minimal set of features, although extensible.
+            Providing the support for this interface would obligate 
+            the user to import another assembly, even if the large majority of
+            simple cases, no use use of interceptors will take place.
+            If you want to use however, see the Windsor container.
+            </remarks>
+        </member>
+        <member name="T:Castle.MicroKernel.Proxy.ProxyConstants">
+            <summary>
+            Holds the keys used by the proxy factories.
+            </summary>
+        </member>
+        <member name="F:Castle.MicroKernel.Proxy.ProxyConstants.ProxyOptionsKey">
+            <summary>
+            Key used to supply custom proxy options.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Proxy.ProxyOptions">
+            <summary>
+              Represents options to configure proxies.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Proxy.ProxyOptions.#ctor(Castle.Core.DependencyModelCollection)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.MicroKernel.Proxy.ProxyOptions"/> class.
+            </summary>
+            <param name="dependencies"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.Proxy.ProxyOptions.AddAdditionalInterfaces(System.Type[])">
+            <summary>
+              Adds the additional interfaces to proxy.
+            </summary>
+            <param name = "interfaces">The interfaces.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.Proxy.ProxyOptions.AddMixIns(System.Object[])">
+            <summary>
+              Adds the additional mix ins to integrate.
+            </summary>
+            <param name = "mixIns">The mix ins.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.Proxy.ProxyOptions.AddMixinReference(Castle.MicroKernel.IReference{System.Object})">
+            <summary>
+              Adds the additional mix in to integrate.
+            </summary>
+            <param name = "mixIn">The mix in.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.Proxy.ProxyOptions.Equals(System.Object)">
+            <summary>
+            Equals the specified obj.
+            </summary>
+            <param name = "obj">The obj.</param>
+            <returns>true if equal.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Proxy.ProxyOptions.GetHashCode">
+            <summary>
+              Gets the hash code.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="P:Castle.MicroKernel.Proxy.ProxyOptions.AdditionalInterfaces">
+            <summary>
+              Gets the additional interfaces to proxy.
+            </summary>
+            <value>The interfaces.</value>
+        </member>
+        <member name="P:Castle.MicroKernel.Proxy.ProxyOptions.AllowChangeTarget">
+            <summary>
+              Determines if the proxied component can change targets.
+            </summary>
+        </member>
+        <member name="P:Castle.MicroKernel.Proxy.ProxyOptions.UseMarshalByRefAsBaseClass">
+            <summary>
+              Determines if the interface proxied component should inherit 
+              from <see cref="T:System.MarshalByRefObject"/>
+            </summary>
+        </member>
+        <member name="P:Castle.MicroKernel.Proxy.ProxyOptions.Hook">
+            <summary>
+              Gets or sets the proxy hook.
+            </summary>
+        </member>
+        <member name="P:Castle.MicroKernel.Proxy.ProxyOptions.MixIns">
+            <summary>
+              Gets the mix ins to integrate.
+            </summary>
+            <value>The interfaces.</value>
+        </member>
+        <member name="P:Castle.MicroKernel.Proxy.ProxyOptions.OmitTarget">
+            <summary>
+              Determines if the proxied component uses a target.
+            </summary>
+        </member>
+        <member name="P:Castle.MicroKernel.Proxy.ProxyOptions.Selector">
+            <summary>
+              Gets or sets the interceptor selector.
+            </summary>
+        </member>
+        <member name="P:Castle.MicroKernel.Proxy.ProxyOptions.UseSingleInterfaceProxy">
+            <summary>
+              Determines if the proxied component should only include
+              the service interface.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Proxy.ProxyUtil">
+            <summary>
+            Helper support for proxy configuration.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Proxy.ProxyUtil.ObtainProxyOptions(Castle.Core.ComponentModel,System.Boolean)">
+            <summary>
+            Obtains the <see cref="T:Castle.MicroKernel.Proxy.ProxyOptions"/> associated with the <see cref="T:Castle.Core.ComponentModel"/>.
+            </summary>
+            <param name="model">The component model.</param>
+            <param name="createOnDemand">true if the options should be created if not present.</param>
+            <returns>The associated proxy options for the component model.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.AttributeDescriptor`1.#ctor(System.String,System.String)">
+            <summary>
+            Constructs the <see cref="T:Castle.MicroKernel.Registration.AttributeDescriptor`1"/> descriptor with name and value.
+            </summary>
+            <param name="name">The attribute name.</param>
+            <param name="value">The attribute value.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.AttributeKeyDescriptor`1.#ctor(Castle.MicroKernel.Registration.ComponentRegistration{`0},System.String)">
+            <summary>
+            Constructs the <see cref="T:Castle.MicroKernel.Registration.AttributeKeyDescriptor`1"/> descriptor with name.
+            </summary>
+            <param name="component">The component.</param>
+            <param name="name">The attribute name.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.AttributeKeyDescriptor`1.Eq(System.Object)">
+            <summary>
+            Builds the <see cref="T:Castle.MicroKernel.Registration.AttributeKeyDescriptor`1"/> with value.
+            </summary>
+            <param name="value">The attribute value.</param>
+            <returns>The <see cref="T:Castle.MicroKernel.Registration.ComponentRegistration`1"/></returns>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.Component">
+            <summary>
+            Factory for creating <see cref="T:Castle.MicroKernel.Registration.ComponentRegistration"/> objects.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Component.For(System.Type)">
+            <summary>
+            Creates a component registration for the <paramref name="serviceType"/>
+            </summary>
+            <param name="serviceType">Type of the service.</param>
+            <returns>The component registration.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Component.For(System.Type[])">
+            <summary>
+            Creates a component registration for the <paramref name="serviceTypes"/>
+            </summary>
+            <param name="serviceTypes">Types of the service.</param>
+            <returns>The component registration.</returns>B
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Component.For(System.Collections.Generic.IEnumerable{System.Type})">
+            <summary>
+            Creates a component registration for the <paramref name="serviceTypes"/>
+            </summary>
+            <param name="serviceTypes">Types of the service.</param>
+            <returns>The component registration.</returns>B
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Component.For``1">
+            <summary>
+            Creates a component registration for the service type.
+            </summary>
+            <typeparam name="S">The service type.</typeparam>
+            <returns>The component registration.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Component.For(Castle.Core.ComponentModel)">
+            <summary>
+            Create a component registration for an existing <see cref="T:Castle.Core.ComponentModel"/>
+            </summary>
+            <param name="model">The component model.</param>
+            <returns>The component registration.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Component.IsCastleComponent(System.Type)">
+            <summary>
+            Determines if the component is a Castle component, that is - if it has a <see cref="T:Castle.Core.CastleComponentAttribute"/>.
+            </summary>
+            <returns>true if the service is a Castle Component.</returns>
+            <remarks>
+            This method is usually used as argument for <see cref="M:Castle.MicroKernel.Registration.ComponentRegistration`1.If(Castle.MicroKernel.Registration.ComponentFilter)"/> method.
+            </remarks>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Component.IsInNamespace(System.String)">
+            <summary>
+            Creates a predicate to check if a component is in a namespace.
+            </summary>
+            <param name="namespace">The namespace.</param>
+            <returns>true if the component type is in the namespace.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Component.IsInNamespace(System.String,System.Boolean)">
+            <summary>
+            Creates a predicate to check if a component is in a namespace.
+            </summary>
+            <param name="namespace">The namespace.</param>
+            <param name="includeSubnamespaces">If set to true, will also include types from subnamespaces.</param>
+            <returns>true if the component type is in the namespace.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Component.IsInSameNamespaceAs(System.Type)">
+            <summary>
+            Creates a predicate to check if a component shares a namespace with another.
+            </summary>
+            <param name="type">The component type to test namespace against.</param>
+            <returns>true if the component is in the same namespace.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Component.IsInSameNamespaceAs(System.Type,System.Boolean)">
+            <summary>
+            Creates a predicate to check if a component shares a namespace with another.
+            </summary>
+            <param name="type">The component type to test namespace against.</param>
+            <param name="includeSubnamespaces">If set to true, will also include types from subnamespaces.</param>
+            <returns>true if the component is in the same namespace.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Component.IsInSameNamespaceAs``1">
+            <summary>
+            Creates a predicate to check if a component shares a namespace with another.
+            </summary>
+            <typeparam name="T">The component type to test namespace against.</typeparam>
+            <returns>true if the component is in the same namespace.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Component.IsInSameNamespaceAs``1(System.Boolean)">
+            <summary>
+            Creates a predicate to check if a component shares a namespace with another.
+            </summary>
+            <typeparam name="T">The component type to test namespace against.</typeparam>
+            <param name="includeSubnamespaces">If set to true, will also include types from subnamespaces.</param>
+            <returns>true if the component is in the same namespace.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Component.ServiceAlreadyRegistered(Castle.MicroKernel.IKernel,Castle.Core.ComponentModel)">
+            <summary>
+            Determines if the component service is already registered.
+            </summary>
+            <param name="kernel">The kernel.</param>
+            <param name="model">The component model.</param>
+            <returns>true if the service is already registered.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Component.For``2">
+            <summary>
+            Creates a component registration for the service types.
+            </summary>
+            <typeparam name="S">The primary service type.</typeparam>
+            <typeparam name="F">The forwarded type.</typeparam>
+            <returns>The component registration.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Component.For``3">
+            <summary>
+            Creates a component registration for the service types.
+            </summary>
+            <typeparam name="S">The primary service type.</typeparam>
+            <typeparam name="F1">The first forwarded type.</typeparam>
+            <typeparam name="F2">The second forwarded type.</typeparam>
+            <returns>The component registration.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Component.For``4">
+            <summary>
+            Creates a component registration for the service types.
+            </summary>
+            <typeparam name="S">The primary service type.</typeparam>
+            <typeparam name="F1">The first forwarded type.</typeparam>
+            <typeparam name="F2">The second forwarded type.</typeparam>
+            <typeparam name="F3">The third forwarded type.</typeparam>
+            <returns>The component registration.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Component.For``5">
+            <summary>
+            Creates a component registration for the service types.
+            </summary>
+            <typeparam name="S">The primary service type.</typeparam>
+            <typeparam name="F1">The first forwarded type.</typeparam>
+            <typeparam name="F2">The second forwarded type.</typeparam>
+            <typeparam name="F3">The third forwarded type.</typeparam>
+            <typeparam name="F4">The fourth forwarded type.</typeparam>
+            <returns>The component registration.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentDependencyRegistrationExtensions.Insert(System.Collections.IDictionary,System.String,System.Object)">
+            <summary>
+            Inserts a new named argument with given key. If an argument for this name already exists, it will be overwritten.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentDependencyRegistrationExtensions.Insert(System.Collections.IDictionary,System.Type,System.Object)">
+            <summary>
+            Inserts a new typed argument with given type. If an argument for this type already exists, it will be overwritten.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentDependencyRegistrationExtensions.Insert``1(System.Collections.IDictionary,``0)">
+            <summary>
+            Inserts a new typed argument with given type. If an argument for this type already exists, it will be overwritten.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentDependencyRegistrationExtensions.Insert(System.Collections.IDictionary,System.Object)">
+            <summary>
+            Inserts a set of typed arguments. Property names of the anonymous type will be used as key.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentDependencyRegistrationExtensions.Insert(System.Collections.IDictionary,System.Object[])">
+            <summary>
+            Inserts a set of typed arguments. Actual type of the arguments will be used as key.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.ComponentFilter">
+            <summary>
+            Delegate to filter component registration.
+            </summary>
+            <param name="kernel">The kernel.</param>
+            <param name="model">The component model.</param>
+            <returns>true if accepted.</returns>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.ComponentRegistration`1">
+            <summary>
+            Registration for a single type as a component with the kernel.
+            <para/>
+            You can create a new registration with the <see cref="T:Castle.MicroKernel.Registration.Component"/> factory.
+            </summary>
+            <typeparam name="TService">The service type</typeparam>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.IRegistration">
+            <summary>
+            The contract for all registrations with the kernel.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.IRegistration.Register(Castle.MicroKernel.IKernel)">
+            <summary>
+            Performs the registration in the <see cref="T:Castle.MicroKernel.IKernel"/>.
+            </summary>
+            <param name="kernel">The kernel.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.Registration.ComponentRegistration`1"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.#ctor(Castle.Core.ComponentModel)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.Registration.ComponentRegistration`1"/> class
+            with an existing <see cref="T:Castle.Core.ComponentModel"/>.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.ActAs(System.Object[])">
+            <summary>
+            Marks the components with one or more actors.
+            </summary>
+            <param name="actors">The component actors.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.Activator``1">
+            <summary>
+            Set a custom <see cref="T:Castle.MicroKernel.IComponentActivator"/> which creates and destroys the component.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.AddAttributeDescriptor(System.String,System.String)">
+            <summary>
+            Adds the attribute descriptor.
+            </summary>
+            <param name="key">The key.</param>
+            <param name="value">The value.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.AddDescriptor(Castle.MicroKernel.Registration.ComponentDescriptor{`0})">
+            <summary>
+            Adds the descriptor.
+            </summary>
+            <param name="descriptor">The descriptor.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.Attribute(System.String)">
+            <summary>
+            Creates an attribute descriptor.
+            </summary>
+            <param name="key">The attribute key.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.Configuration(Castle.MicroKernel.Registration.Node[])">
+            <summary>
+            Apply more complex configuration to this component registration.
+            </summary>
+            <param name="configNodes">The config nodes.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.Configuration(Castle.Core.Configuration.IConfiguration)">
+            <summary>
+            Apply more complex configuration to this component registration.
+            </summary>
+            <param name="configuration">The configuration <see cref="T:Castle.Core.Configuration.MutableConfiguration"/>.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.CustomDependencies(Castle.MicroKernel.Registration.Property[])">
+            <summary>
+            Obsolete, use <see cref="M:Castle.MicroKernel.Registration.ComponentRegistration`1.DependsOn(Castle.MicroKernel.Registration.Property[])"/> instead.
+            </summary>
+            <param name="dependencies">The dependencies.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.CustomDependencies(System.Collections.IDictionary)">
+            <summary>
+            Obsolete, use <see cref="M:Castle.MicroKernel.Registration.ComponentRegistration`1.DependsOn(System.Collections.IDictionary)"/> instead.
+            </summary>
+            <param name="dependencies">The dependencies.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.CustomDependencies(System.Object)">
+            <summary>
+            Obsolete, use <see cref="M:Castle.MicroKernel.Registration.ComponentRegistration`1.DependsOn(System.Object)"/> instead.
+            </summary>
+            <param name="dependencies">The dependencies.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.DependsOn(Castle.MicroKernel.Registration.Property[])">
+            <summary>
+            Specify custom dependencies using <see cref="M:Castle.MicroKernel.Registration.Property.ForKey(System.String)"/> or <see cref="M:Castle.MicroKernel.Registration.Property.ForKey(System.Type)"/>.
+            <para/>
+            You can pass <see cref="T:Castle.MicroKernel.Registration.ServiceOverride"/>s to specify the components
+            this component should be resolved with.
+            </summary>
+            <param name="dependencies">The dependencies.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.DependsOn(System.Collections.IDictionary)">
+            <summary>
+            Uses a dictionary of key/value pairs, to specify custom dependencies.
+            <para/>
+            Use <see cref="M:Castle.MicroKernel.Registration.ComponentRegistration`1.ServiceOverrides(System.Collections.IDictionary)"/> to specify the components
+            this component should be resolved with.
+            </summary>
+            <param name="dependencies">The dependencies.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.DependsOn(System.Object)">
+            <summary>
+            Uses an (anonymous) object as a dictionary, to specify custom dependencies.
+            <para/>
+            Use <see cref="M:Castle.MicroKernel.Registration.ComponentRegistration`1.ServiceOverrides(System.Object)"/> to specify the components
+            this component should be resolved with.
+            </summary>
+            <param name="anonymous">The dependencies.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.DynamicParameters(Castle.MicroKernel.Registration.DynamicParametersDelegate)">
+            <summary>
+            Allows custom dependencies to by defined dyncamically.
+            </summary>
+            <param name="resolve">The delegate used for providing dynamic parameters.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.DynamicParameters(Castle.MicroKernel.Registration.DynamicParametersResolveDelegate)">
+            <summary>
+            Allows custom dependencies to by defined dynamically with releasing capability.
+            </summary>
+            <param name="resolve">The delegate used for providing dynamic parameters.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.DynamicParameters(Castle.MicroKernel.Registration.DynamicParametersWithContextResolveDelegate)">
+            <summary>
+            Allows custom dependencies to by defined dynamically with releasing capability.
+            </summary>
+            <param name="resolve">The delegate used for providing dynamic parameters.</param>
+            <returns></returns>
+            <remarks>
+            Use <see cref="T:Castle.MicroKernel.Context.CreationContext"/> when resolving components from <see cref="T:Castle.MicroKernel.IKernel"/> in order to detect cycles.
+            </remarks>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.ExtendedProperties(Castle.MicroKernel.Registration.Property[])">
+            <summary>
+            Sets <see cref="P:Castle.Core.ComponentModel.ExtendedProperties"/> for this component.
+            </summary>
+            <param name="properties">The extended properties.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.ExtendedProperties(System.Object)">
+            <summary>
+            Sets <see cref="P:Castle.Core.ComponentModel.ExtendedProperties"/> for this component.
+            </summary>
+            <param name="anonymous">The extendend properties as key/value pairs.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.Forward(System.Type[])">
+            <summary>
+            Registers the service types on behalf of this component.
+            </summary>
+            <param name="types">The types to forward.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.Forward``1">
+            <summary>
+            Registers the service types on behalf of this component.
+            </summary>
+            <typeparam name="TSecondService">The forwarded type.</typeparam>
+            <returns>The component registration.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.Forward``2">
+            <summary>
+            Registers the service types on behalf of this component.
+            </summary>
+            <typeparam name="TSecondService">The first forwarded type.</typeparam>
+            <typeparam name="TThirdService">The second forwarded type.</typeparam>
+            <returns>The component registration.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.Forward``3">
+            <summary>
+            Registers the service types on behalf of this component.
+            </summary>
+            <typeparam name="TSecondService">The first forwarded type.</typeparam>
+            <typeparam name="TThirdService">The second forwarded type.</typeparam>
+            <typeparam name="TFourthService">The third forwarded type.</typeparam>
+            <returns>The component registration.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.Forward``4">
+            <summary>
+            Registers the service types on behalf of this component.
+            </summary>
+            <typeparam name="TSecondService">The first forwarded type.</typeparam>
+            <typeparam name="TThirdService">The second forwarded type.</typeparam>
+            <typeparam name="TFourthService">The third forwarded type.</typeparam>
+            <typeparam name="TFifthService">The fourth forwarded type.</typeparam>
+            <returns>The component registration.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.Forward(System.Collections.Generic.IEnumerable{System.Type})">
+            <summary>
+            Registers the service types on behalf of this component.
+            </summary>
+            <param name="types">The types to forward.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.If(Castle.MicroKernel.Registration.ComponentFilter)">
+            <summary>
+            Assigns a conditional predication which must be satisfied.
+            <para />
+            The component will only be registered into the kernel 
+            if this predicate is satisfied (or not assigned at all).
+            </summary>
+            <param name="ifFilter">The predicate to satisfy.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.ImplementedBy``1">
+            <summary>
+            Sets the concrete type that implements the service to <typeparamref name="TImpl"/>.
+            <para/>
+            If not set, the <see cref="P:Castle.MicroKernel.Registration.ComponentRegistration`1.ServiceType"/> will be used as the implementation for this component.
+            </summary>
+            <typeparam name="TImpl">The type that is the implementation for the service.</typeparam>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.ImplementedBy(System.Type)">
+            <summary>
+            Sets the concrete type that implements the service to <paramref name="type"/>.
+            <para/>
+            If not set, the <see cref="P:Castle.MicroKernel.Registration.ComponentRegistration`1.ServiceType"/> will be used as the implementation for this component.
+            </summary>
+            <param name="type">The type that is the implementation for the service.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.Instance(`0)">
+            <summary>
+            Assigns an existing instance as the component for this registration.
+            </summary>
+            <param name="instance">The component instance.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.Interceptors(Castle.Core.InterceptorReference[])">
+            <summary>
+            Set the interceptors for this component.
+            </summary>
+            <param name="interceptors">The interceptors.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.Interceptors(System.Type[])">
+            <summary>
+            Set the interceptors for this component.
+            </summary>
+            <param name="interceptors">The interceptors.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.Interceptors``1">
+            <summary>
+            Set the interceptor for this component.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.Interceptors``2">
+            <summary>
+            Set the interceptor for this component.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.Interceptors(System.String[])">
+            <summary>
+            Set the interceptor for this component.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.Named(System.String)">
+            <summary>
+            Change the name of this registration. 
+            This will be the key for the component in the kernel.
+            <para/>
+            If not set, the <see cref="P:System.Type.FullName"/> of the <see cref="P:Castle.MicroKernel.Registration.ComponentRegistration`1.Implementation"/>
+            will be used as the key to register the component.
+            </summary>
+            <param name="name">The name of this registration.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.OnCreate(Castle.MicroKernel.LifecycleConcerns.OnCreateActionDelegate{`0}[])">
+            <summary>
+            Stores a set of <see cref="T:Castle.MicroKernel.LifecycleConcerns.OnCreateActionDelegate`1"/> which will be invoked when the component
+            is created and before it's returned from the container.
+            </summary>
+            <param name="actions">A set of actions to be executed right after the component is created and before it's returned from the container.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.OverWrite">
+            <summary>
+            With the overwrite.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.Parameters(Castle.MicroKernel.Registration.Parameter[])">
+            <summary>
+            Set configuration parameters with string or <see cref="T:Castle.Core.Configuration.IConfiguration"/> values.
+            </summary>
+            <param name="parameters">The parameters.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.SelectInterceptorsWith(Castle.DynamicProxy.IInterceptorSelector)">
+            <summary>
+            Sets the interceptor selector for this component.
+            </summary>
+            <param name="selector"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.SelectInterceptorsWith(System.Action{Castle.MicroKernel.Registration.Proxy.ItemRegistration{Castle.DynamicProxy.IInterceptorSelector}})">
+            <summary>
+            Sets the interceptor selector for this component.
+            </summary>
+            <param name="selector"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.ServiceOverrides(Castle.MicroKernel.Registration.ServiceOverride[])">
+            <summary>
+            Override (some of) the services that this component needs.
+            Use <see cref="M:Castle.MicroKernel.Registration.ServiceOverride.ForKey(System.String)"/> to create an override.
+            <para/>
+            Each key represents the service dependency of this component, for example the name of a constructor argument or a property.
+            The corresponding value is the key of an other component registered to the kernel, and is used to resolve the dependency.
+            <para/>
+            To specify dependencies which are not services, use <see cref="M:Castle.MicroKernel.Registration.ComponentRegistration`1.DependsOn(Castle.MicroKernel.Registration.Property[])"/>
+            </summary>
+            <param name="overrides">The service overrides.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.ServiceOverrides(System.Collections.IDictionary)">
+            <summary>
+            Override (some of) the services that this component needs, using a dictionary.
+            <para/>
+            Each key represents the service dependency of this component, for example the name of a constructor argument or a property.
+            The corresponding value is the key of an other component registered to the kernel, and is used to resolve the dependency.
+            <para/>
+            To specify dependencies which are not services, use <see cref="M:Castle.MicroKernel.Registration.ComponentRegistration`1.DependsOn(System.Collections.IDictionary)"/>
+            </summary>
+            <param name="overrides">The service overrides.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.ServiceOverrides(System.Object)">
+            <summary>
+            Override (some of) the services that this component needs, using an (anonymous) object as a dictionary.
+            <para/>
+            Each key represents the service dependency of this component, for example the name of a constructor argument or a property.
+            The corresponding value is the key of an other component registered to the kernel, and is used to resolve the dependency.
+            <para/>
+            To specify dependencies which are not services, use <see cref="M:Castle.MicroKernel.Registration.ComponentRegistration`1.DependsOn(System.Object)"/>
+            </summary>
+            <param name="anonymous">The service overrides.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.Unless(Castle.MicroKernel.Registration.ComponentFilter)">
+            <summary>
+            Assigns a conditional predication which must not be satisfied. 
+            <para />
+            The component will only be registered into the kernel 
+            if this predicate is not satisfied (or not assigned at all).
+            </summary>
+            <param name="unlessFilter">The predicate not to satisfy.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.UsingFactory``2(System.Converter{``0,``1})">
+            <summary>
+            Uses a factory to instantiate the component
+            </summary>
+            <typeparam name="U">Factory type. This factory has to be registered in the kernel.</typeparam>
+            <typeparam name="V">Implementation type.</typeparam>
+            <param name="factory">Factory invocation</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.UsingFactoryMethod``1(System.Func{``0})">
+            <summary>
+            Uses a factory method to instantiate the component.
+            </summary>
+            <typeparam name="TImpl">Implementation type</typeparam>
+            <param name="factoryMethod">Factory method</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.UsingFactoryMethod``1(System.Converter{Castle.MicroKernel.IKernel,``0})">
+            <summary>
+            Uses a factory method to instantiate the component.
+            </summary>
+            <typeparam name="TImpl">Implementation type</typeparam>
+            <param name="factoryMethod">Factory method</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.UsingFactoryMethod``1(System.Func{Castle.MicroKernel.IKernel,Castle.Core.ComponentModel,Castle.MicroKernel.Context.CreationContext,``0})">
+            <summary>
+            Uses a factory method to instantiate the component.
+            </summary>
+            <typeparam name="TImpl">Implementation type</typeparam>
+            <param name="factoryMethod">Factory method</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.UsingFactoryMethod``1(System.Func{Castle.MicroKernel.IKernel,Castle.MicroKernel.Context.CreationContext,``0})">
+            <summary>
+            Uses a factory method to instantiate the component.
+            </summary>
+            <typeparam name="TImpl">Implementation type</typeparam>
+            <param name="factoryMethod">Factory method</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComponentRegistration`1.Castle#MicroKernel#Registration#IRegistration#Register(Castle.MicroKernel.IKernel)">
+            <summary>
+            Registers this component with the <see cref="T:Castle.MicroKernel.IKernel"/>.
+            </summary>
+            <param name="kernel">The kernel.</param>
+        </member>
+        <member name="P:Castle.MicroKernel.Registration.ComponentRegistration`1.ForwardedTypes">
+            <summary>
+            Gets the forwarded service types on behalf of this component.
+            <para/>
+            Add more types to forward using <see cref="M:Castle.MicroKernel.Registration.ComponentRegistration`1.Forward(System.Type[])"/>.
+            </summary>
+            <value>The types of the forwarded services.</value>
+        </member>
+        <member name="P:Castle.MicroKernel.Registration.ComponentRegistration`1.Implementation">
+            <summary>
+            The concrete type that implements the service.
+            <para/>
+            To set the implementation, use <see cref="M:Castle.MicroKernel.Registration.ComponentRegistration`1.ImplementedBy(System.Type)"/>.
+            </summary>
+            <value>The implementation of the service.</value>
+        </member>
+        <member name="P:Castle.MicroKernel.Registration.ComponentRegistration`1.LifeStyle">
+            <summary>
+            Set the lifestyle of this component.
+            For example singleton and transient (also known as 'factory').
+            </summary>
+            <value>The with lifestyle.</value>
+        </member>
+        <member name="P:Castle.MicroKernel.Registration.ComponentRegistration`1.Name">
+            <summary>
+            The name of the component. Will become the key for the component in the kernel.
+            <para/>
+            To set the name, use <see cref="M:Castle.MicroKernel.Registration.ComponentRegistration`1.Named(System.String)"/>.
+            <para/>
+            If not set, the <see cref="P:System.Type.FullName"/> of the <see cref="P:Castle.MicroKernel.Registration.ComponentRegistration`1.Implementation"/>
+            will be used as the key to register the component.
+            </summary>
+            <value>The name.</value>
+        </member>
+        <member name="P:Castle.MicroKernel.Registration.ComponentRegistration`1.Proxy">
+            <summary>
+            Set proxy for this component.
+            </summary>
+            <value>The proxy.</value>
+        </member>
+        <member name="P:Castle.MicroKernel.Registration.ComponentRegistration`1.ServiceType">
+            <summary>
+            The type of the service, the same as <typeparamref name="TService"/>.
+            <para/>
+            This is the first type passed to <see cref="M:Castle.MicroKernel.Registration.Component.For(System.Type)"/>.
+            </summary>
+            <value>The type of the service.</value>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.ComponentRegistration">
+            <summary>
+            A non-generic <see cref="T:Castle.MicroKernel.Registration.ComponentRegistration`1"/>.
+            <para/>
+            You can create a new registration with the <see cref="T:Castle.MicroKernel.Registration.Component"/> factory.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.Node">
+            <summary>
+            Represents a configuration child.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Node.ApplyTo(Castle.Core.Configuration.IConfiguration)">
+            <summary>
+            Applies the configuration node.
+            </summary>
+            <param name="configuration">The configuration.</param>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.Attrib">
+            <summary>
+            Represents a configuration attribute.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Attrib.ApplyTo(Castle.Core.Configuration.IConfiguration)">
+            <summary>
+            Applies the configuration node.
+            </summary>
+            <param name="configuration">The configuration.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Attrib.ForName(System.String)">
+            <summary>
+            Create a <see cref="T:Castle.MicroKernel.Registration.NamedAttribute"/> with name.
+            </summary>
+            <param name="name">The attribute name.</param>
+            <returns>The new <see cref="T:Castle.MicroKernel.Registration.NamedAttribute"/></returns>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.NamedAttribute">
+            <summary>
+            Represents a named attribute.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.NamedAttribute.Eq(System.String)">
+            <summary>
+            Builds the <see cref="T:System.Attribute"/> with name/value.
+            </summary>
+            <param name="value">The attribute value.</param>
+            <returns>The new <see cref="T:Castle.MicroKernel.Registration.SimpleChild"/></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.NamedAttribute.Eq(System.Object)">
+            <summary>
+            Builds the <see cref="T:System.Attribute"/> with name/value.
+            </summary>
+            <param name="value">The attribute value.</param>
+            <returns>The new <see cref="T:Castle.MicroKernel.Registration.SimpleChild"/></returns>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.Child">
+            <summary>
+            Represents a configuration child.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Child.ForName(System.String)">
+            <summary>
+            Create a <see cref="T:Castle.MicroKernel.Registration.NamedChild"/> with name.
+            </summary>
+            <param name="name">The child name.</param>
+            <returns>The new <see cref="T:Castle.MicroKernel.Registration.NamedChild"/></returns>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.NamedChild">
+            <summary>
+            Represents a named child.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.NamedChild.Eq(System.String)">
+            <summary>
+            Builds the <see cref="T:Castle.MicroKernel.Registration.SimpleChild"/> with name/value.
+            </summary>
+            <param name="value">The child value.</param>
+            <returns>The new <see cref="T:Castle.MicroKernel.Registration.SimpleChild"/></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.NamedChild.Eq(System.Object)">
+            <summary>
+            Builds the <see cref="T:Castle.MicroKernel.Registration.SimpleChild"/> with name/value.
+            </summary>
+            <param name="value">The child value.</param>
+            <returns>The new <see cref="T:Castle.MicroKernel.Registration.SimpleChild"/></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.NamedChild.Eq(Castle.Core.Configuration.IConfiguration)">
+            <summary>
+            Builds the <see cref="T:Castle.MicroKernel.Registration.ComplexChild"/> with name/config.
+            </summary>
+            <param name="configNode">The child configuration.</param>
+            <returns>The new <see cref="T:Castle.MicroKernel.Registration.ComplexChild"/></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.NamedChild.Eq(Castle.MicroKernel.Registration.Node[])">
+            <summary>
+            Builds the <see cref="T:Castle.MicroKernel.Registration.Child"/> with name/config.
+            </summary>
+            <param name="childNodes">The child nodes.</param>
+            <returns>The new <see cref="T:Castle.MicroKernel.Registration.CompoundChild"/></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.NamedChild.ApplyTo(Castle.Core.Configuration.IConfiguration)">
+            <summary>
+            Applies the configuration node.
+            </summary>
+            <param name="configuration">The configuration.</param>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.SimpleChild">
+            <summary>
+            Represents a simple child node.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.SimpleChild.ApplyTo(Castle.Core.Configuration.IConfiguration)">
+            <summary>
+            Applies the configuration node.
+            </summary>
+            <param name="configuration">The configuration.</param>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.ComplexChild">
+            <summary>
+            Represents a complex child node.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ComplexChild.ApplyTo(Castle.Core.Configuration.IConfiguration)">
+            <summary>
+            Applies the configuration node.
+            </summary>
+            <param name="configuration">The configuration.</param>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.CompoundChild">
+            <summary>
+            Represents a compound child node.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.CompoundChild.ApplyTo(Castle.Core.Configuration.IConfiguration)">
+            <summary>
+            Applies the configuration node.
+            </summary>
+            <param name="configuration">The configuration.</param>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.IWindsorInstaller">
+            <summary>
+            The contract to install components in the container.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.IWindsorInstaller.Install(Castle.Windsor.IWindsorContainer,Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore)">
+            <summary>
+            Performs the installation in the <see cref="T:Castle.Windsor.IWindsorContainer"/>.
+            </summary>
+            <param name="container">The container.</param>
+            <param name="store">The configuration store.</param>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.OnCreateComponentDescriptor`1">
+            <summary>
+            Adds the actions to ExtendedProperties.
+            </summary>
+            <typeparam name="S"></typeparam>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Lifestyle.LifestyleGroup`1.Is(Castle.Core.LifestyleType)">
+            <summary>
+            Sets the lifestyle to the specified <paramref name="type"/>.
+            </summary>
+            <param name="type">The type.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Lifestyle.LifestyleGroup`1.Custom(System.Type)">
+            <summary>
+            Assign a custom lifestyle type, that implements <see cref="T:Castle.MicroKernel.ILifestyleManager"/>.
+            </summary>
+            <param name="customLifestyleType">Type of the custom lifestyle.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Lifestyle.LifestyleGroup`1.Custom``1">
+            <summary>
+            Assign a custom lifestyle type, that implements <see cref="T:Castle.MicroKernel.ILifestyleManager"/>.
+            </summary>
+            <typeparam name="L">The type of the custom lifestyle</typeparam>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.Parameter">
+            <summary>
+            Represents a configuration parameter.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Parameter.ForKey(System.String)">
+            <summary>
+            Create a <see cref="T:Castle.MicroKernel.Registration.ParameterKey"/> with key.
+            </summary>
+            <param name="key">The parameter key.</param>
+            <returns>The new <see cref="T:Castle.MicroKernel.Registration.ParameterKey"/></returns>
+        </member>
+        <member name="P:Castle.MicroKernel.Registration.Parameter.Key">
+            <summary>
+            Gets the parameter key.
+            </summary>
+        </member>
+        <member name="P:Castle.MicroKernel.Registration.Parameter.Value">
+            <summary>
+            Gets the parameter value.
+            </summary>
+        </member>
+        <member name="P:Castle.MicroKernel.Registration.Parameter.ConfigNode">
+            <summary>
+            Gets the parameter configuration.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.ParameterKey">
+            <summary>
+            Represents a parameter key.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ParameterKey.Eq(System.String)">
+            <summary>
+            Builds the <see cref="T:Castle.MicroKernel.Registration.Parameter"/> with key/value.
+            </summary>
+            <param name="value">The parameter value.</param>
+            <returns>The new <see cref="T:Castle.MicroKernel.Registration.Parameter"/></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ParameterKey.Eq(Castle.Core.Configuration.IConfiguration)">
+            <summary>
+            Builds the <see cref="T:Castle.MicroKernel.Registration.Parameter"/> with key/config.
+            </summary>
+            <param name="configNode">The parameter configuration.</param>
+            <returns>The new <see cref="T:Castle.MicroKernel.Registration.Parameter"/></returns>
+        </member>
+        <member name="P:Castle.MicroKernel.Registration.ParameterKey.Name">
+            <summary>
+            The parameter key name.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.Property">
+            <summary>
+            Represents a key/value pair.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Property.ForKey(System.String)">
+            <summary>
+            Create a <see cref="T:Castle.MicroKernel.Registration.PropertyKey"/> with key.
+            </summary>
+            <param key="key">The property key.</param>
+            <returns>The new <see cref="T:Castle.MicroKernel.Registration.PropertyKey"/></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Property.ForKey(System.Type)">
+            <summary>
+            Create a <see cref="T:Castle.MicroKernel.Registration.PropertyKey"/> with key.
+            </summary>
+            <param key="key">The property key.</param>
+            <returns>The new <see cref="T:Castle.MicroKernel.Registration.PropertyKey"/></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.Property.ForKey``1">
+            <summary>
+            Create a <see cref="T:Castle.MicroKernel.Registration.PropertyKey"/> with key.
+            </summary>
+            <param key="key">The property key.</param>
+            <returns>The new <see cref="T:Castle.MicroKernel.Registration.PropertyKey"/></returns>
+        </member>
+        <member name="P:Castle.MicroKernel.Registration.Property.Key">
+            <summary>
+            Gets the property key.
+            </summary>
+        </member>
+        <member name="P:Castle.MicroKernel.Registration.Property.Value">
+            <summary>
+            Gets the property value.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.PropertyKey">
+            <summary>
+            Represents a property key.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.PropertyKey.Eq(System.Object)">
+            <summary>
+            Builds the <see cref="T:Castle.MicroKernel.Registration.Property"/> with key/value.
+            </summary>
+            <param key="value">The property value.</param>
+            <returns>The new <see cref="T:Castle.MicroKernel.Registration.Property"/></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.PropertyKey.Is(System.String)">
+            <summary>
+            Builds a service override using other component registered with given <paramref name="componentName"/> as value for dependency with given <see cref="P:Castle.MicroKernel.Registration.PropertyKey.Key"/>.
+            </summary>
+            <param name="componentName"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.PropertyKey.Is(System.Type)">
+            <summary>
+            Builds a service override using other component registered with given <paramref name="componentImplementation"/> and no explicit name, as value for dependency with given <see cref="P:Castle.MicroKernel.Registration.PropertyKey.Key"/>.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.PropertyKey.Is``1">
+            <summary>
+            Builds a service override using other component registered with given <typeparam name="TComponentImplementation"/> and no explicit name, as value for dependency with given <see cref="P:Castle.MicroKernel.Registration.PropertyKey.Key"/>.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="P:Castle.MicroKernel.Registration.PropertyKey.Key">
+            <summary>
+            The property key key.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.ServiceOverride">
+            <summary>
+            Represents a service override.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ServiceOverride.ForKey(System.String)">
+            <summary>
+            Creates a <see cref="T:Castle.MicroKernel.Registration.ServiceOverrideKey"/> with key.
+            </summary>
+            <param name="key">The service override key.</param>
+            <returns>The new <see cref="T:Castle.MicroKernel.Registration.ServiceOverrideKey"/></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ServiceOverride.ForKey(System.Type)">
+            <summary>
+            Creates a <see cref="T:Castle.MicroKernel.Registration.ServiceOverrideKey"/> with key.
+            </summary>
+            <param name="key">The service override key.</param>
+            <returns>The new <see cref="T:Castle.MicroKernel.Registration.ServiceOverrideKey"/></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ServiceOverride.ForKey``1">
+            <summary>
+            Creates a <see cref="T:Castle.MicroKernel.Registration.ServiceOverrideKey"/> with key.
+            </summary>
+            <typeparam name="TKey">The service override key.</typeparam>
+            <returns>The new <see cref="T:Castle.MicroKernel.Registration.ServiceOverrideKey"/></returns>
+        </member>
+        <member name="P:Castle.MicroKernel.Registration.ServiceOverride.Type">
+            <summary>
+            Gets the optional value type specifier.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.ServiceOverrideKey">
+            <summary>
+            Represents a service override key.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ServiceOverrideKey.Eq(System.String)">
+            <summary>
+            Builds the <see cref="T:Castle.MicroKernel.Registration.ServiceOverride"/> with key/value.
+            </summary>
+            <param name="value">The service override value.</param>
+            <returns>The new <see cref="T:Castle.MicroKernel.Registration.ServiceOverride"/></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ServiceOverrideKey.Eq(System.String[])">
+            <summary>
+            Builds the <see cref="T:Castle.MicroKernel.Registration.ServiceOverride"/> with key/values.
+            </summary>
+            <param name="value">The service override values.</param>
+            <returns>The new <see cref="T:Castle.MicroKernel.Registration.ServiceOverride"/></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ServiceOverrideKey.Eq``1(System.String[])">
+            <summary>
+            Builds the <see cref="T:Castle.MicroKernel.Registration.ServiceOverride"/> with key/values.
+            </summary>
+            <param name="value">The service override values.</param>
+            <returns>The new <see cref="T:Castle.MicroKernel.Registration.ServiceOverride"/></returns>
+            <typeparam name="V">The value type.</typeparam>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ServiceOverrideKey.Eq(System.Collections.Generic.IEnumerable{System.String})">
+            <summary>
+            Builds the <see cref="T:Castle.MicroKernel.Registration.ServiceOverride"/> with key/values.
+            </summary>
+            <param name="value">The service override values.</param>
+            <returns>The new <see cref="T:Castle.MicroKernel.Registration.ServiceOverride"/></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ServiceOverrideKey.Eq``1(System.Collections.Generic.IEnumerable{System.String})">
+            <summary>
+            Builds the <see cref="T:Castle.MicroKernel.Registration.ServiceOverride"/> with key/values.
+            </summary>
+            <param name="value">The service override values.</param>
+            <returns>The new <see cref="T:Castle.MicroKernel.Registration.ServiceOverride"/></returns>
+            <typeparam name="V">The value type.</typeparam>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.AllTypes">
+            <summary>
+            Describes a set of components to register in the kernel.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.AllTypes.Of(System.Type)">
+            <summary>
+            Describes all the types based on <c>basedOn</c>.
+            </summary>
+            <param name="basedOn">The base type.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.AllTypes.Of``1">
+            <summary>
+            Describes all the types based on type T.
+            </summary>
+            <typeparam name="T">The base type.</typeparam>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.AllTypes.Pick">
+            <summary>
+            Describes any types that are supplied.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.AllTypes.FromAssemblyNamed(System.String)">
+            <summary>
+            Prepares to register types from an assembly.
+            </summary>
+            <param name="assemblyName">The assembly name.</param>
+            <returns>The corresponding <see cref="T:Castle.MicroKernel.Registration.FromDescriptor"/></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.AllTypes.FromAssembly(System.Reflection.Assembly)">
+            <summary>
+            Prepares to register types from an assembly.
+            </summary>
+            <param name="assembly">The assembly.</param>
+            <returns>The corresponding <see cref="T:Castle.MicroKernel.Registration.FromDescriptor"/></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.AllTypes.FromAssemblyContaining(System.Type)">
+            <summary>
+            Prepares to register types from an assembly containing the type.
+            </summary>
+            <param name="type">The type belonging to the assembly.</param>
+            <returns>The corresponding <see cref="T:Castle.MicroKernel.Registration.FromDescriptor"/></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.AllTypes.FromAssemblyContaining``1">
+            <summary>
+            Prepares to register types from an assembly containing the type.
+            </summary>
+            <typeparam name="T">The type belonging to the assembly.</typeparam>
+            <returns>The corresponding <see cref="T:Castle.MicroKernel.Registration.FromDescriptor"/></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.AllTypes.FromThisAssembly">
+            <summary>
+            Prepares to register types from the assembly containing the code invoking this method.
+            </summary>
+            <returns>The corresponding <see cref="T:Castle.MicroKernel.Registration.FromDescriptor"/></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.AllTypes.FromAssemblyInDirectory(Castle.MicroKernel.Registration.AssemblyFilter)">
+            <summary>
+            Prepares to register types from assemblies found in a given directory that meet additional optional restrictions.
+            </summary>
+            <param name="filter"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.AllTypes.From(System.Collections.Generic.IEnumerable{System.Type})">
+            <summary>
+            Prepares to register types from a list of types.
+            </summary>
+            <param name="types">The list of types.</param>
+            <returns>The corresponding <see cref="T:Castle.MicroKernel.Registration.FromDescriptor"/></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.AllTypes.Pick(System.Collections.Generic.IEnumerable{System.Type})">
+            <summary>
+            Prepares to register types from a list of types.
+            </summary>
+            <param name="types">The list of types.</param>
+            <returns>The corresponding <see cref="T:Castle.MicroKernel.Registration.FromDescriptor"/></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.AllTypes.From(System.Type[])">
+            <summary>
+            Prepares to register types from a list of types.
+            </summary>
+            <param name="types">The list of types.</param>
+            <returns>The corresponding <see cref="T:Castle.MicroKernel.Registration.FromDescriptor"/></returns>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.AllTypesOf">
+            <summary>
+            Describes a related group of components to register in the kernel.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.AllTypesOf.FromAssemblyNamed(System.String)">
+            <summary>
+            Prepares to register types from an assembly.
+            </summary>
+            <param name="assemblyName">The assembly name.</param>
+            <returns>The corresponding <see cref="T:Castle.MicroKernel.Registration.BasedOnDescriptor"/></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.AllTypesOf.FromAssembly(System.Reflection.Assembly)">
+            <summary>
+            Prepares to register types from an assembly.
+            </summary>
+            <param name="assembly">The assembly.</param>
+            <returns>The corresponding <see cref="T:Castle.MicroKernel.Registration.BasedOnDescriptor"/></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.AllTypesOf.From(System.Collections.Generic.IEnumerable{System.Type})">
+            <summary>
+            Prepares to register types from a list of types.
+            </summary>
+            <param name="types">The list of types.</param>
+            <returns>The corresponding <see cref="T:Castle.MicroKernel.Registration.BasedOnDescriptor"/></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.AllTypesOf.Pick(System.Collections.Generic.IEnumerable{System.Type})">
+            <summary>
+            Prepares to register types from a list of types.
+            </summary>
+            <param name="types">The list of types.</param>
+            <returns>The corresponding <see cref="T:Castle.MicroKernel.Registration.BasedOnDescriptor"/></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.AllTypesOf.From(System.Type[])">
+            <summary>
+            Prepares to register types from a list of types.
+            </summary>
+            <param name="types">The list of types.</param>
+            <returns>The corresponding <see cref="T:Castle.MicroKernel.Registration.BasedOnDescriptor"/></returns>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.ConfigureDescriptor">
+            <summary>
+            Describes a configuration.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ConfigureDescriptor.#ctor(Castle.MicroKernel.Registration.BasedOnDescriptor,System.Action{Castle.MicroKernel.Registration.ComponentRegistration})">
+            <summary>
+             Initializes a new instance of the ConfigureDescriptor.
+            </summary>
+            <param name="basedOn">The <see cref="T:Castle.MicroKernel.Registration.BasedOnDescriptor"/></param>
+            <param name="configurer">The configuration action.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ConfigureDescriptor.#ctor(Castle.MicroKernel.Registration.BasedOnDescriptor,System.Type,System.Action{Castle.MicroKernel.Registration.ComponentRegistration})">
+            <summary>
+             Initializes a new instance of the ConfigureDescriptor.
+            </summary>
+            <param name="basedOn">The <see cref="T:Castle.MicroKernel.Registration.BasedOnDescriptor"/></param>
+            <param name="baseType">The base type to match.</param>
+            <param name="configurer">The configuration action.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ConfigureDescriptor.Configure(System.Action{Castle.MicroKernel.Registration.ComponentRegistration})">
+            <summary>
+            Allows customized configurations of each matching type.
+            </summary>
+            <param name="configurer">The configuration action.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ConfigureDescriptor.Configure(Castle.MicroKernel.Registration.ConfigureDelegate)">
+            <summary>
+            Allows customized configurations of each matching type.
+            </summary>
+            <param name="configurer">The configuration action.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ConfigureDescriptor.ConfigureFor``1(System.Action{Castle.MicroKernel.Registration.ComponentRegistration})">
+            <summary>
+            Allows customized configurations of each matching type that is 
+            assignable to <typeparamref name="T"/>.
+            </summary>
+            <typeparam name="T">The type assignable from.</typeparam>
+            <param name="configurer">The configuration action.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ConfigureDescriptor.ConfigureFor``1(Castle.MicroKernel.Registration.ConfigureDelegate)">
+            <summary>
+            Allows customized configurations of each matching type that is 
+            assignable to <typeparamref name="T"/>.
+            </summary>
+            <typeparam name="T">The type assignable from.</typeparam>
+            <param name="configurer">The configuration action.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ConfigureDescriptor.Apply(Castle.MicroKernel.Registration.ComponentRegistration)">
+            <summary>
+            Performs the component configuration.
+            </summary>
+            <param name="registration">The component registration.</param>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.FromAssemblyDescriptor">
+            <summary>
+            Selects a set of types from an assembly.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.FromDescriptor">
+            <summary>
+            Describes the source of types to register.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.FromDescriptor.AllowMultipleMatches">
+            <summary>
+            Allows a type to be registered multiple times.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.FromDescriptor.BasedOn``1">
+            <summary>
+            Returns the descriptor for accepting a type.
+            </summary>
+            <typeparam name="T">The base type.</typeparam>
+            <returns>The descriptor for the type.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.FromDescriptor.BasedOn(System.Type)">
+            <summary>
+            Returns the descriptor for accepting a type.
+            </summary>
+            <param name="basedOn">The base type.</param>
+            <returns>The descriptor for the type.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.FromDescriptor.Pick">
+            <summary>
+            Returns the descriptor for accepting any type from given solutions.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.FromDescriptor.Where(System.Predicate{System.Type})">
+            <summary>
+            Returns the descriptor for accepting a type based on a condition.
+            </summary>
+            <param name="accepted">The accepting condition.</param>
+            <returns>The descriptor for the type.</returns>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.FromTypesDescriptor">
+            <summary>
+            Selects an existing set of types to register.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.ServiceDescriptor">
+            <summary>
+            Describes how to select a types service.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ServiceDescriptor.Base">
+            <summary>
+            Uses the base type matched on.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ServiceDescriptor.Self">
+            <summary>
+            Uses the type itself.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ServiceDescriptor.AllInterfaces">
+            <summary>
+            Uses all interfaces implemented by the type (or its base types) as well as their base interfaces.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ServiceDescriptor.DefaultInterface">
+            <summary>
+            Uses all interfaces that have names matched by implementation type name.
+            Matches Foo to IFoo, SuperFooExtended to IFoo and IFooExtended etc
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ServiceDescriptor.FirstInterface">
+            <summary>
+            Uses the first interface of a type. This method has non-deterministic behavior when type implements more than one interface!
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ServiceDescriptor.FromInterface(System.Type)">
+            <summary>
+            Uses <paramref name="implements"/> to lookup the sub interface.
+            For example: if you have IService and 
+            IProductService : ISomeInterface, IService, ISomeOtherInterface.
+            When you call FromInterface(typeof(IService)) then IProductService
+            will be used. Useful when you want to register _all_ your services
+            and but not want to specify all of them.
+            </summary>
+            <param name="implements"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ServiceDescriptor.FromInterface">
+            <summary>
+            Uses base type to lookup the sub interface.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ServiceDescriptor.Select(Castle.MicroKernel.Registration.ServiceDescriptor.ServiceSelector)">
+            <summary>
+            Assigns a custom service selection strategy.
+            </summary>
+            <param name="selector"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ServiceDescriptor.Select(System.Collections.Generic.IEnumerable{System.Type})">
+            <summary>
+            Assigns the supplied service types.
+            </summary>
+            <param name="types"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.ServiceDescriptor.WorkaroundCLRBug(System.Type)">
+            <summary>
+            This is a workaround for a CLR bug in
+            which GetInterfaces() returns interfaces
+            with no implementations.
+            </summary>
+            <param name="serviceType">Type of the service.</param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.ConfigureDelegate">
+            <summary>
+              Delegate for custom registration configuration.
+            </summary>
+            <param name = "registration">The component registration.</param>
+            <returns>Not used.</returns>
+        </member>
+        <member name="T:Castle.MicroKernel.Registration.BasedOnDescriptor">
+            <summary>
+              Describes how to register a group of related types.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.BasedOnDescriptor.#ctor(System.Type,Castle.MicroKernel.Registration.FromDescriptor)">
+            <summary>
+              Initializes a new instance of the BasedOnDescriptor.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.BasedOnDescriptor.AllowMultipleMatches">
+            <summary>
+              Allows a type to be registered multiple times.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.BasedOnDescriptor.BasedOn``1">
+            <summary>
+              Returns the descriptor for accepting a new type.
+            </summary>
+            <typeparam name = "T">The base type.</typeparam>
+            <returns>The descriptor for the type.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.BasedOnDescriptor.BasedOn(System.Type)">
+            <summary>
+              Returns the descriptor for accepting a new type.
+            </summary>
+            <param name = "basedOn">The base type.</param>
+            <returns>The descriptor for the type.</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.BasedOnDescriptor.Configure(System.Action{Castle.MicroKernel.Registration.ComponentRegistration})">
+            <summary>
+              Allows customized configurations of each matching type.
+            </summary>
+            <param name = "configurer">The configuration action.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.BasedOnDescriptor.Configure(Castle.MicroKernel.Registration.ConfigureDelegate)">
+            <summary>
+              Allows customized configurations of each matching type.
+            </summary>
+            <param name = "configurer">The configuration action.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.BasedOnDescriptor.ConfigureFor``1(System.Action{Castle.MicroKernel.Registration.ComponentRegistration})">
+            <summary>
+              Allows customized configurations of each matching type that is 
+              assignable to
+              <typeparamref name = "T" />
+              .
+            </summary>
+            <typeparam name = "T">The type assignable from.</typeparam>
+            <param name = "configurer">The configuration action.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.BasedOnDescriptor.ConfigureFor``1(Castle.MicroKernel.Registration.ConfigureDelegate)">
+            <summary>
+              Allows customized configurations of each matching type that is 
+              assignable to
+              <typeparamref name = "T" />
+              .
+            </summary>
+            <typeparam name = "T">The type assignable from.</typeparam>
+            <param name = "configurer">The configuration action.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.BasedOnDescriptor.If(System.Predicate{System.Type})">
+            <summary>
+              Assigns a conditional predication which must be satisfied.
+            </summary>
+            <param name = "ifFilter">The predicate to satisfy.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.BasedOnDescriptor.Unless(System.Predicate{System.Type})">
+            <summary>
+              Assigns a conditional predication which must not be satisfied.
+            </summary>
+            <param name = "unlessFilter">The predicate not to satisify.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Registration.BasedOnDescriptor.Where(System.Predicate{System.Type})">
+            <summary>
+              Returns the descriptor for accepting a type based on a condition.
+            </summary>
+            <param name = "accepted">The accepting condition.</param>
+            <returns>The descriptor for the type.</returns>
+        </member>
+        <member name="P:Castle.MicroKernel.Registration.BasedOnDescriptor.InternalBasedOn">
+            <summary>
+              Gets the type all types must be based on.
+            </summary>
+        </member>
+        <member name="P:Castle.MicroKernel.Registration.BasedOnDescriptor.WithService">
+            <summary>
+              Gets the service descriptor.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.IReleasePolicy">
+            <summary>
+            Policy managing lifetime of components, and in particular their release process.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Releasers.LifecycledComponentsReleasePolicy">
+            <summary>
+            Only tracks components that have decommission steps
+            registered or have pooled lifestyle.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Releasers.NoTrackingReleasePolicy">
+            <summary>
+            No tracking of component instances are made.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Resolvers.DefaultDependencyResolver">
+            <summary>
+            Default implementation for <see cref="T:Castle.MicroKernel.IDependencyResolver"/>.
+            This implementation is quite simple, but still should be useful
+            for 99% of situations. 
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.IDependencyResolver">
+            <summary>
+            Implementors should use a strategy to obtain 
+            valid references to properties and/or services 
+            requested in the dependency model.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.IDependencyResolver.Initialize(Castle.MicroKernel.IKernel,Castle.MicroKernel.DependencyDelegate)">
+            <summary>
+            This method is called with a delegate for firing the
+            IKernelEvents.DependencyResolving event.
+            </summary>
+            <param name="kernel">kernel</param>
+            <param name="resolving">The delegate used to fire the event</param>
+        </member>
+        <member name="M:Castle.MicroKernel.IDependencyResolver.AddSubResolver(Castle.MicroKernel.ISubDependencyResolver)">
+            <summary>
+            Registers a sub resolver instance
+            </summary>
+            <param name="subResolver">The subresolver instance</param>
+        </member>
+        <member name="M:Castle.MicroKernel.IDependencyResolver.RemoveSubResolver(Castle.MicroKernel.ISubDependencyResolver)">
+            <summary>
+            Unregisters a sub resolver instance previously registered
+            </summary>
+            <param name="subResolver">The subresolver instance</param>
+        </member>
+        <member name="M:Castle.MicroKernel.Resolvers.DefaultDependencyResolver.Initialize(Castle.MicroKernel.IKernel,Castle.MicroKernel.DependencyDelegate)">
+            <summary>
+              Initializes this instance with the specified dependency delegate.
+            </summary>
+            <param name="kernel">kernel</param>
+            <param name = "dependencyDelegate">The dependency delegate.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.Resolvers.DefaultDependencyResolver.AddSubResolver(Castle.MicroKernel.ISubDependencyResolver)">
+            <summary>
+              Registers a sub resolver instance
+            </summary>
+            <param name = "subResolver">The subresolver instance</param>
+        </member>
+        <member name="M:Castle.MicroKernel.Resolvers.DefaultDependencyResolver.RemoveSubResolver(Castle.MicroKernel.ISubDependencyResolver)">
+            <summary>
+              Unregisters a sub resolver instance previously registered
+            </summary>
+            <param name = "subResolver">The subresolver instance</param>
+        </member>
+        <member name="M:Castle.MicroKernel.Resolvers.DefaultDependencyResolver.CanResolve(Castle.MicroKernel.Context.CreationContext,Castle.MicroKernel.ISubDependencyResolver,Castle.Core.ComponentModel,Castle.Core.DependencyModel)">
+            <summary>
+              Returns true if the resolver is able to satisfy the specified dependency.
+            </summary>
+            <param name = "context">Creation context, which is a resolver itself</param>
+            <param name = "contextHandlerResolver">Parent resolver</param>
+            <param name = "model">Model of the component that is requesting the dependency</param>
+            <param name = "dependency">The dependency model</param>
+            <returns>
+              <c>true</c>
+              if the dependency can be satisfied</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Resolvers.DefaultDependencyResolver.Resolve(Castle.MicroKernel.Context.CreationContext,Castle.MicroKernel.ISubDependencyResolver,Castle.Core.ComponentModel,Castle.Core.DependencyModel)">
+            <summary>
+              Try to resolve the dependency by checking the parameters in 
+              the model or checking the Kernel for the requested service.
+            </summary>
+            <remarks>
+              The dependency resolver has the following precedence order:
+              <list type="bullet">
+                <item>
+                  <description>The dependency is checked within the
+                    <see cref="T:Castle.MicroKernel.Context.CreationContext"/>
+                  </description>
+                </item>
+                <item>
+                  <description>The dependency is checked within the
+                    <see cref="T:Castle.MicroKernel.IHandler"/>
+                    instance for the component</description>
+                </item>
+                <item>
+                  <description>The dependency is checked within the registered
+                    <see cref="T:Castle.MicroKernel.ISubDependencyResolver"/>
+                    s</description>
+                </item>
+                <item>
+                  <description>Finally the resolver tries the normal flow 
+                    which is using the configuration
+                    or other component to satisfy the dependency</description>
+                </item>
+              </list>
+            </remarks>
+            <param name="context">Creation context, which is a resolver itself</param>
+            <param name="contextHandlerResolver">Parent resolver</param>
+            <param name="model">Model of the component that is requesting the dependency</param>
+            <param name="dependency">The dependency model</param>
+            <returns>The dependency resolved value or null</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Resolvers.DefaultDependencyResolver.ExtractComponentKey(System.String,System.String)">
+            <summary>
+              Extracts the component name from the a ref strings which is
+              ${something}
+            </summary>
+            <param name = "name"></param>
+            <param name = "keyValue"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.Resolvers.DefaultDependencyResolver.RebuildContextForParameter(Castle.MicroKernel.Context.CreationContext,System.Type)">
+            <summary>
+              This method rebuild the context for the parameter type.
+              Naive implementation.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Resolvers.DependencyResolverException">
+            <summary>
+            Summary description for DependencyResolverException.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.Resolvers.DependencyResolverException.#ctor(System.String,System.Exception)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.Resolvers.DependencyResolverException"/> class.
+            </summary>
+            <param name="message">The message.</param>
+            <param name="innerException">The inner exception.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.Resolvers.DependencyResolverException.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.Resolvers.DependencyResolverException"/> class.
+            </summary>
+            <param name="message">The message.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.Resolvers.DependencyResolverException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.Resolvers.DependencyResolverException"/> class.
+            </summary>
+            <param name="info">The object that holds the serialized object data.</param>
+            <param name="context">The contextual information about the source or destination.</param>
+        </member>
+        <member name="T:Castle.MicroKernel.Resolvers.SpecializedResolvers.ArrayResolver">
+            <summary>
+              Handle dependencies of services in the format of typed arrays.
+            </summary>
+            <remarks>
+              This is a complimentary <see cref="T:Castle.MicroKernel.ISubDependencyResolver"/> implementation 
+              that is capable of satisfying dependencies of services as typed arrays.
+              <para>
+                Note that it will take precedence over service override for arrays defined 
+                on the configuration.
+              </para>
+            </remarks>
+            <example>
+              In order to install the resolver:
+              <code>
+                var kernel = new DefaultKernel();
+                kernel.Resolver.AddSubResolver(new ArrayResolver(kernel));
+              </code>
+            
+              <para>
+                To use it, assuming that IService is on the container:
+              </para>
+            
+              <code>
+                public class Component
+                {
+                public Component(IService[] services)
+                {
+                }
+                }
+              </code>
+            </example>
+        </member>
+        <member name="T:Castle.MicroKernel.Resolvers.SpecializedResolvers.CollectionResolver">
+            <summary>
+            More generic alternative to <see cref="T:Castle.MicroKernel.Resolvers.SpecializedResolvers.ArrayResolver"/> and <see cref="T:Castle.MicroKernel.Resolvers.SpecializedResolvers.ListResolver"/>.
+            It supports arrays as well as any generic interface type assignable from arrays.
+            </summary>
+            <remarks>
+            The collection instance that is provided is read only, even for interfaces like <see cref="T:System.Collections.Generic.IList`1"/>
+            </remarks>
+        </member>
+        <member name="T:Castle.MicroKernel.Resolvers.SpecializedResolvers.ListResolver">
+            <summary>
+            Handle dependencies of services in the format of generic IList.
+            </summary>
+            <remarks>
+            This is a complimentary <see cref="T:Castle.MicroKernel.ISubDependencyResolver"/> implementation 
+            that is capable of satisfying dependencies of services generic IList.
+            <para>
+            Note that it will take precedence over service override for lists defined 
+            on the configuration.
+            </para>
+            </remarks>
+            <example>
+            In order to install the resolver:
+            <code>
+            var kernel = new DefaultKernel();
+            kernel.Resolver.AddSubResolver(new ListResolver(kernel));
+            </code>
+            
+            <para>
+            To use it, assuming that IService is on the container:
+            </para>
+            
+            <code>
+            public class Component
+            {
+                public Component(IList&lt;IService&gt; services)
+                {
+                }
+            }
+            </code>
+            </example>
+        </member>
+        <member name="T:Castle.MicroKernel.ISubSystem">
+            <summary>
+            A subsystem is used by the MicroKernel to deal 
+            with a specific concern.  
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.ISubSystem.Init(Castle.MicroKernel.IKernel)">
+            <summary>
+            Initializes the subsystem
+            </summary>
+            <param name="kernel"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.ISubSystem.Terminate">
+            <summary>
+            Should perform the termination
+            of the subsystem instance.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.SubSystems.Configuration.DefaultConfigurationStore">
+            <summary>
+            This implementation of <see cref="T:Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore"/>
+            does not try to obtain an external configuration by any means.
+            Its only purpose is to serve as a base class for subclasses
+            that might obtain the configuration node from anywhere.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore">
+            <summary>
+            The contract used by the kernel to obtain
+            external configuration for the components and
+            facilities.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore.AddFacilityConfiguration(System.String,Castle.Core.Configuration.IConfiguration)">
+            <summary>
+            Associates a configuration node with a facility key
+            </summary>
+            <param name="key">item key</param>
+            <param name="config">Configuration node</param>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore.AddComponentConfiguration(System.String,Castle.Core.Configuration.IConfiguration)">
+            <summary>
+            Associates a configuration node with a component key
+            </summary>
+            <param name="key">item key</param>
+            <param name="config">Configuration node</param>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore.AddBootstrapComponentConfiguration(System.String,Castle.Core.Configuration.IConfiguration)">
+            <summary>
+            Associates a  configuration node with a bootstrap component key
+            </summary>
+            <param name="key">item key</param>
+            <param name="config">Configuration node</param>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore.AddChildContainerConfiguration(System.String,Castle.Core.Configuration.IConfiguration)">
+            <summary>
+            Adds the child container configuration.
+            </summary>
+            <param name="name">The container's name.</param>
+            <param name="config">The config.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore.GetChildContainerConfiguration(System.String)">
+            <summary>
+            Returns the configuration node associated with 
+            the specified child container key. Should return null
+            if no association exists.
+            </summary>
+            <param name="key">item key</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore.GetFacilityConfiguration(System.String)">
+            <summary>
+            Returns the configuration node associated with 
+            the specified facility key. Should return null
+            if no association exists.
+            </summary>
+            <param name="key">item key</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore.GetComponentConfiguration(System.String)">
+            <summary>
+            Returns the configuration node associated with 
+            the specified component key. Should return null
+            if no association exists.
+            </summary>
+            <param name="key">item key</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore.GetBootstrapComponentConfiguration(System.String)">
+            <summary>
+            Returns the configuration node associated with 
+            the specified component key. Should return null
+            if no association exists.
+            </summary>
+            <param name="key">item key</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore.GetFacilities">
+            <summary>
+            Returns all configuration nodes for facilities
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore.GetComponents">
+            <summary>
+            Returns all configuration nodes for components
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore.GetInstallers">
+            <summary>
+            Returns all configuration nodes for installers
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore.GetBootstrapComponents">
+            <summary>
+            Returns all configuration nodes for bootstrap components
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore.GetConfigurationForChildContainers">
+            <summary>
+            Gets the child containers configuration nodes.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore.GetResource(System.String,Castle.Core.Resource.IResource)">
+            <summary>
+            
+            </summary>
+            <param name="resourceUri"></param>
+            <param name="resource"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.DefaultConfigurationStore.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.SubSystems.Configuration.DefaultConfigurationStore"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.DefaultConfigurationStore.AddFacilityConfiguration(System.String,Castle.Core.Configuration.IConfiguration)">
+            <summary>
+            Associates a configuration node with a facility key
+            </summary>
+            <param name="key">item key</param>
+            <param name="config">Configuration node</param>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.DefaultConfigurationStore.AddComponentConfiguration(System.String,Castle.Core.Configuration.IConfiguration)">
+            <summary>
+            Associates a configuration node with a component key
+            </summary>
+            <param name="key">item key</param>
+            <param name="config">Configuration node</param>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.DefaultConfigurationStore.AddBootstrapComponentConfiguration(System.String,Castle.Core.Configuration.IConfiguration)">
+            <summary>
+            Associates a configuration node with a bootstrap component key
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.DefaultConfigurationStore.AddChildContainerConfiguration(System.String,Castle.Core.Configuration.IConfiguration)">
+            <summary>
+            Adds the child container configuration.
+            </summary>
+            <param name="key">The key.</param>
+            <param name="config">The config.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.DefaultConfigurationStore.GetFacilityConfiguration(System.String)">
+            <summary>
+            Returns the configuration node associated with
+            the specified facility key. Should return null
+            if no association exists.
+            </summary>
+            <param name="key">item key</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.DefaultConfigurationStore.GetChildContainerConfiguration(System.String)">
+            <summary>
+            Returns the configuration node associated with
+            the specified child container key. Should return null
+            if no association exists.
+            </summary>
+            <param name="key">item key</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.DefaultConfigurationStore.GetComponentConfiguration(System.String)">
+            <summary>
+            Returns the configuration node associated with
+            the specified component key. Should return null
+            if no association exists.
+            </summary>
+            <param name="key">item key</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.DefaultConfigurationStore.GetBootstrapComponentConfiguration(System.String)">
+            <summary>
+            Returns the configuration node associated with 
+            the specified component key. Should return null
+            if no association exists.
+            </summary>
+            <param name="key"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.DefaultConfigurationStore.GetFacilities">
+            <summary>
+            Returns all configuration nodes for facilities
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.DefaultConfigurationStore.GetBootstrapComponents">
+            <summary>
+            Returns all configuration nodes for bootstrap components
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.DefaultConfigurationStore.GetConfigurationForChildContainers">
+            <summary>
+            Returns all configuration nodes for child containers
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Configuration.DefaultConfigurationStore.GetComponents">
+            <summary>
+            Returns all configuration nodes for components
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.MicroKernel.SubSystems.Conversion.AbstractTypeConverter">
+            <summary>
+            Base implementation of <see cref="T:Castle.MicroKernel.SubSystems.Conversion.ITypeConverter"/>
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.SubSystems.Conversion.ITypeConverter">
+            <summary>
+            Implements a conversion logic to a type of a
+            set of types. 
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Conversion.ITypeConverter.CanHandleType(System.Type)">
+            <summary>
+            Returns true if this instance of <c>ITypeConverter</c>
+            is able to handle the specified type.
+            </summary>
+            <param name="type"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Conversion.ITypeConverter.CanHandleType(System.Type,Castle.Core.Configuration.IConfiguration)">
+            <summary>
+            Returns true if this instance of <c>ITypeConverter</c>
+            is able to handle the specified type with the specified 
+            configuration
+            </summary>
+            <param name="type"></param>
+            <param name="configuration"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Conversion.ITypeConverter.PerformConversion(System.String,System.Type)">
+            <summary>
+            Should perform the conversion from the
+            string representation specified to the type
+            specified.
+            </summary>
+            <param name="value"></param>
+            <param name="targetType"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Conversion.ITypeConverter.PerformConversion(Castle.Core.Configuration.IConfiguration,System.Type)">
+            <summary>
+            Should perform the conversion from the
+            configuration node specified to the type
+            specified.
+            </summary>
+            <param name="configuration"></param>
+            <param name="targetType"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Conversion.AbstractTypeConverter.CanHandleType(System.Type,Castle.Core.Configuration.IConfiguration)">
+            <summary>
+            Returns true if this instance of <c>ITypeConverter</c>
+            is able to handle the specified type with the specified
+            configuration
+            </summary>
+            <param name="type"></param>
+            <param name="configuration"></param>
+            <returns></returns>
+            <remarks>
+            The default behavior is to just pass it to the normal CanHadnleType
+            peeking into the configuration is used for some advanced functionality
+            </remarks>
+        </member>
+        <member name="T:Castle.MicroKernel.SubSystems.Conversion.ConverterException">
+            <summary>
+            Summary description for ConverterException.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Conversion.ConverterException.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.SubSystems.Conversion.ConverterException"/> class.
+            </summary>
+            <param name="message">The message.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Conversion.ConverterException.#ctor(System.String,System.Exception)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.SubSystems.Conversion.ConverterException"/> class.
+            </summary>
+            <param name="message">The message.</param>
+            <param name="innerException">The inner exception.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Conversion.ConverterException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.SubSystems.Conversion.ConverterException"/> class.
+            </summary>
+            <param name="info">The object that holds the serialized object data.</param>
+            <param name="context">The contextual information about the source or destination.</param>
+        </member>
+        <member name="T:Castle.MicroKernel.SubSystems.Conversion.AttributeAwareConverter">
+            <summary>
+            Looks for a <see cref="T:Castle.MicroKernel.SubSystems.Conversion.ConvertibleAttribute"/> on the type to be converted. 
+            If found, the TypeConverter defined by the attribute is used to perform the conversion.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.SubSystems.Conversion.IKernelDependentConverter">
+            <summary>
+            Marker interface that signals that a converter
+            depends on IKernel to be able to perform 
+            the conversion.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.SubSystems.Conversion.ComponentModelConverter">
+            <summary>
+            Attempts to utilize an existing <see cref="T:System.ComponentModel.TypeConverter"/> for conversion
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Conversion.DefaultComplexConverter.CreateInstance(System.Type,Castle.Core.Configuration.IConfiguration)">
+            <summary>
+            Creates the target type instance.
+            </summary>
+            <param name="type">The type.</param>
+            <param name="configuration">The configuration.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Conversion.DefaultComplexConverter.ChooseConstructor(System.Type)">
+            <summary>
+            Chooses the first non default constructor. Throws an exception if more than 
+            one non default constructor is found
+            </summary>
+            <param name="type"></param>
+            <returns>The chosen constructor, or <c>null</c> if none was found</returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Conversion.DefaultComplexConverter.ConvertConstructorParameters(System.Reflection.ConstructorInfo,Castle.Core.Configuration.IConfiguration)">
+            <summary>
+            Converts the constructor parameters.
+            </summary>
+            <param name="constructor">The constructor.</param>
+            <param name="configuration">The configuration.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Conversion.DefaultComplexConverter.ConvertPropertyValues(System.Object,System.Type,Castle.Core.Configuration.IConfiguration)">
+            <summary>
+            Converts the property values.
+            </summary>
+            <param name="instance">The instance.</param>
+            <param name="type">The type.</param>
+            <param name="configuration">The configuration.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Conversion.DefaultComplexConverter.FindChildIgnoreCase(Castle.Core.Configuration.IConfiguration,System.String)">
+            <summary>
+            Finds the child (case insensitive).
+            </summary>
+            <param name="config">The config.</param>
+            <param name="name">The name.</param>
+            <returns></returns>
+        </member>
+        <member name="P:Castle.MicroKernel.SubSystems.Conversion.DefaultComplexConverter.ConversionManager">
+            <summary>
+            Gets the conversion manager.
+            </summary>
+            <value>The conversion manager.</value>
+        </member>
+        <member name="T:Castle.MicroKernel.SubSystems.Conversion.EnumConverter">
+            <summary>
+            Converts a string representation to an enum value
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Conversion.GenericDictionaryConverter.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.SubSystems.Conversion.GenericDictionaryConverter"/> class.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.SubSystems.Conversion.IGenericCollectionConverterHelper">
+            <summary>
+            This interface is needed because we want to isolate ourself from
+            the generic parameters, so we can work type safe inside the implementations,
+            and still call from non generic types outside.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.SubSystems.Conversion.PrimitiveConverter">
+            <summary>
+            Implements all standard conversions.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.SubSystems.Conversion.TypeNameConverter">
+            <summary>
+            Convert a type name to a Type instance.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.SubSystems.Conversion.ConvertibleAttribute">
+            <summary>
+            Declares a type as being convertible by a <see cref="T:Castle.MicroKernel.SubSystems.Conversion.ITypeConverter"/> and optionally defines the converter to be used
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Conversion.ConvertibleAttribute.#ctor">
+            <summary>
+            Defines the <see cref="T:Castle.MicroKernel.SubSystems.Conversion.DefaultComplexConverter"/> to be used to convert the type
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Conversion.ConvertibleAttribute.#ctor(System.Type)">
+            <summary>
+            Defines the <see cref="T:Castle.MicroKernel.SubSystems.Conversion.ITypeConverter"/> to be used to convert the type
+            </summary>
+            <param name="converterType"></param>
+        </member>
+        <member name="T:Castle.MicroKernel.SubSystems.Conversion.DefaultConversionManager">
+            <summary>
+            Composition of all available conversion managers
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.SubSystems.Conversion.IConversionManager">
+            <summary>
+            Establish a composition interface and a subsystem.
+            Implementors should delegate the conversion to 
+            a instance of a type converter.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Conversion.IConversionManager.Add(Castle.MicroKernel.SubSystems.Conversion.ITypeConverter)">
+            <summary>
+            Register a type converter instance.
+            </summary>
+            <param name="converter"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.BinaryTreeComponentName.FindSuccessor(Castle.MicroKernel.SubSystems.Naming.TreeNode)">
+            <summary>
+            Method finds the next biggest node
+            It assumes Add puts lesser nodes on the right
+            </summary>
+        </member>
+        <member name="F:Castle.MicroKernel.SubSystems.Naming.TreeNode.left">
+            <summary>Node's left</summary>
+        </member>
+        <member name="F:Castle.MicroKernel.SubSystems.Naming.TreeNode.right">
+            <summary>Node's right</summary>
+        </member>
+        <member name="F:Castle.MicroKernel.SubSystems.Naming.TreeNode.parent">
+            <summary>Node's parent</summary>
+        </member>
+        <member name="F:Castle.MicroKernel.SubSystems.Naming.TreeNode.nextSibling">
+            <summary>DA Linked List</summary>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.ComponentName.#ctor(System.String)">
+            <summary>
+            Creates a ComponentName using a name pattern like
+            "service:key=value,key2=value2"
+            </summary>
+            <param name="name">Complete name</param>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.ComponentName.#ctor(System.String,System.String)">
+            <summary>
+            Creates a ComponentName with specified service and 
+            properties.
+            </summary>
+            <param name="service">Service name</param>
+            <param name="properties">Property list.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.ComponentName.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Serialization constructor.
+            </summary>
+            <param name="info"></param>
+            <param name="context"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.ComponentName.Setup(System.String)">
+            <summary>
+            Parses the full name extracting the service and properties.
+            </summary>
+            <param name="name">Full name.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.ComponentName.SetupService(System.String)">
+            <summary>
+            Sets up the service. Can be empty but can't be null.
+            </summary>
+            <param name="service"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.ComponentName.SetupProperties(System.String)">
+            <summary>
+            Parses and validate a properties list string like 
+            "key=value,key2=value2" and so on.
+            </summary>
+            <param name="properties">Property list.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.ComponentName.SetupProperties(System.Collections.Generic.IDictionary{System.String,System.String})">
+            <summary>
+            Validates a properties IDictionary.
+            </summary>
+            <param name="properties">Property list.</param>
+        </member>
+        <member name="T:Castle.MicroKernel.SubSystems.Naming.DefaultNamingSubSystem">
+            <summary>
+            Default <see cref="T:Castle.MicroKernel.SubSystems.Naming.INamingSubSystem"/> implementation.
+            Keeps services map as a simple hash table.
+            Keeps key map as a list dictionary to maintain order.
+            Does not support a query string.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.SubSystems.Naming.INamingSubSystem">
+            <summary>
+            Contract for SubSystem that wishes to keep and coordinate
+            component registration.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.INamingSubSystem.AddHandlerSelector(Castle.MicroKernel.IHandlerSelector)">
+            <summary>
+            Register a new component resolver that can take part in the decision
+            making about which handler to resolve
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.INamingSubSystem.Contains(System.String)">
+            <summary>
+            Returns true if there is a component registered 
+            for the specified key
+            </summary>
+            <param name="key"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.INamingSubSystem.Contains(System.Type)">
+            <summary>
+            Returns true if there is a component registered 
+            for the specified service
+            </summary>
+            <param name="service"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.INamingSubSystem.GetAssignableHandlers(System.Type)">
+            <summary>
+            Return <see cref="T:Castle.MicroKernel.IHandler"/>s where components are compatible
+            with the specified service.
+            </summary>
+            <param name="service"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.INamingSubSystem.GetHandler(System.String)">
+            <summary>
+            Returns the <see cref="T:Castle.MicroKernel.IHandler"/> associated with
+            the specified key.
+            </summary>
+            <param name="key"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.INamingSubSystem.GetHandler(System.Type)">
+            <summary>
+            Returns the <see cref="T:Castle.MicroKernel.IHandler"/> associated with
+            the specified service.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.INamingSubSystem.GetHandler(System.String,System.Type)">
+            <summary>
+            Returns the <see cref="T:Castle.MicroKernel.IHandler"/> associated with
+            the specified key with the service type.
+            <remarks>
+            It is expected that this will be used mainly to resolve a generic service
+            by its key.
+            </remarks>
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.INamingSubSystem.GetHandlers(System.String)">
+            <summary>
+            Returns an array of <see cref="T:Castle.MicroKernel.IHandler"/> that
+            satisfies the specified query.
+            </summary>
+            <param name="query"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.INamingSubSystem.GetHandlers(System.Type)">
+            <summary>
+            Returns an array of <see cref="T:Castle.MicroKernel.IHandler"/> associated with
+            the specified service.
+            </summary>
+            <param name="service"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.INamingSubSystem.GetHandlers">
+            <summary>
+            Returns all <see cref="T:Castle.MicroKernel.IHandler"/> registered.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.INamingSubSystem.GetKey2Handler">
+            <summary>
+            List of handler by key
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.INamingSubSystem.GetService2Handler">
+            <summary>
+            List of handler by service
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.INamingSubSystem.Register(System.String,Castle.MicroKernel.IHandler)">
+            <summary>
+            Implementors should register the key and service pointing 
+            to the specified handler
+            </summary>
+            <param name="key"></param>
+            <param name="handler"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.INamingSubSystem.UnRegister(System.String)">
+            <summary>
+            Unregister the handler by the given key
+            </summary>
+            <param name="key"></param>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.INamingSubSystem.UnRegister(System.Type)">
+            <summary>
+            Unregister the handler by the given service
+            </summary>
+            <param name="service"></param>
+        </member>
+        <member name="P:Castle.MicroKernel.SubSystems.Naming.INamingSubSystem.ComponentCount">
+            <summary>
+            Returns the number of components registered.
+            </summary>
+        </member>
+        <member name="P:Castle.MicroKernel.SubSystems.Naming.INamingSubSystem.Item(System.Type)">
+            <summary>
+            Associates a <see cref="T:Castle.MicroKernel.IHandler"/> with 
+            the specified service
+            </summary>
+        </member>
+        <member name="P:Castle.MicroKernel.SubSystems.Naming.INamingSubSystem.Item(System.String)">
+            <summary>
+            Associates a <see cref="T:Castle.MicroKernel.IHandler"/> with
+            the specified key
+            </summary>
+        </member>
+        <member name="F:Castle.MicroKernel.SubSystems.Naming.DefaultNamingSubSystem.key2Handler">
+            <summary>
+            Map(String, IHandler) to map component keys
+            to <see cref="T:Castle.MicroKernel.IHandler"/>
+            Items in this dictionary are sorted in insertion order.
+            </summary>
+        </member>
+        <member name="F:Castle.MicroKernel.SubSystems.Naming.DefaultNamingSubSystem.service2Handler">
+            <summary>
+            Map(Type, IHandler) to map a service
+            to <see cref="T:Castle.MicroKernel.IHandler"/>.
+            If there is more than a single service of the type, only the first
+            registered services is stored in this dictionary.
+            It serve as a fast lookup for the common case of having a single handler for 
+            a type.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.DefaultNamingSubSystem.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.SubSystems.Naming.DefaultNamingSubSystem"/> class.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.IHandlerSelector">
+            <summary>
+            Implementors of this interface allow to extend the way the container perform
+            component resolution based on some application specific business logic.
+            </summary>
+            <remarks>
+            This is the sibling interface to <seealso cref="T:Castle.MicroKernel.ISubDependencyResolver"/>.
+            This is dealing strictly with root components, while the <seealso cref="T:Castle.MicroKernel.ISubDependencyResolver"/> is dealing with
+            dependent components.
+            </remarks>
+        </member>
+        <member name="M:Castle.MicroKernel.IHandlerSelector.HasOpinionAbout(System.String,System.Type)">
+            <summary>
+            Whatever the selector has an opinion about resolving a component with the 
+            specified service and key.
+            </summary>
+            <param name="key">The service key - can be null</param>
+            <param name="service">The service interface that we want to resolve</param>
+        </member>
+        <member name="M:Castle.MicroKernel.IHandlerSelector.SelectHandler(System.String,System.Type,Castle.MicroKernel.IHandler[])">
+            <summary>
+            Select the appropriate handler from the list of defined handlers.
+            The returned handler should be a member from the <paramref name="handlers"/> array.
+            </summary>
+            <param name="key">The service key - can be null</param>
+            <param name="service">The service interface that we want to resolve</param>
+            <param name="handlers">The defined handlers</param>
+            <returns>The selected handler, or null</returns>
+        </member>
+        <member name="T:Castle.MicroKernel.SubSystems.Naming.KeySearchNamingSubSystem">
+            <summary>
+            When requesting a component by service, KeySearchNamingSubSystem first 
+            determines if more than one component has been registered for that service.  
+            If not, Default resolution occurs.  If so, all of the registered keys for 
+            that service are processed through the provided Predicate to determine which 
+            key to use for service resolution.  If no Predicate matches, the default 
+            resolution occurs.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.KeySearchNamingSubSystem.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.SubSystems.Naming.KeySearchNamingSubSystem"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.KeySearchNamingSubSystem.#ctor(System.Predicate{System.String})">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.MicroKernel.SubSystems.Naming.KeySearchNamingSubSystem"/> class.
+            </summary>
+            <param name="keyPredicate">The key predicate.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.KeySearchNamingSubSystem.Register(System.String,Castle.MicroKernel.IHandler)">
+            <summary>
+            Registers the given handler with the give key.
+            </summary>
+            <param name="key">The key.</param>
+            <param name="handler">The handler.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.KeySearchNamingSubSystem.UnRegister(System.String)">
+            <summary>
+            Unregisters the handler associated with the given key
+            </summary>
+            <param name="key">The key.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.KeySearchNamingSubSystem.UnRegister(System.Type)">
+            <summary>
+            Unregisters the handler associated with the given service
+            </summary>
+            <param name="service">The service.</param>
+        </member>
+        <member name="M:Castle.MicroKernel.SubSystems.Naming.KeySearchNamingSubSystem.GetHandler(System.Type)">
+            <summary>
+            Executes the Predicate against all keys for the registered service to 
+            determine which component to return.
+            </summary>
+            <param name="service">The service.</param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.MicroKernel.SubSystems.Naming.NamingPartsSubSystem">
+            <summary>
+            Alternative <see cref="T:Castle.MicroKernel.SubSystems.Naming.INamingSubSystem"/> implementation.
+            Extends the default implementation replacing the 
+            key support with a more complete ComponentName. Supports
+            queries.
+            </summary>
+            <example>
+            The user must register components using the following construction
+            <code>
+              service:properties
+            </code>
+            Where properties is a list of key value pairs (comma separated). Example:
+            <code>
+              protocol:secure=true,version=1.2
+            </code>
+            The user can then query for components using the same construction:
+            <code>
+              protocol:secure=true
+            </code>
+            Or to return all:
+            <code>
+              protocol:*
+            </code>
+            </example>
+        </member>
+        <member name="T:Castle.MicroKernel.SubSystems.Resource.DefaultResourceSubSystem">
+            <summary>
+            Pendent
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.SubSystems.Resource.IResourceSubSystem">
+            <summary>
+            An implementation of <c>a</c> should 
+            be able to return instances of <see cref="T:Castle.Core.Resource.IResource"/>
+            for a given resource identifier.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.SubSystemConstants">
+            <summary>
+            Holds the keys used by Kernel to register/request 
+            a subsystem.
+            </summary>
+        </member>
+        <member name="F:Castle.MicroKernel.SubSystemConstants.ConfigurationStoreKey">
+            <summary>
+            Key used for the configuration store subsystem
+            </summary>
+        </member>
+        <member name="F:Castle.MicroKernel.SubSystemConstants.ConversionManagerKey">
+            <summary>
+            Key used for the conversion manager
+            </summary>
+        </member>
+        <member name="F:Castle.MicroKernel.SubSystemConstants.NamingKey">
+            <summary>
+            Key used for the naming subsystem
+            </summary>
+        </member>
+        <member name="F:Castle.MicroKernel.SubSystemConstants.ResourceKey">
+            <summary>
+            Key used for the resource subsystem
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Util.ReferenceComparer">
+            <summary>
+            Compares if the reference of two objects are equals.
+            </summary>
+        </member>
+        <member name="T:Castle.MicroKernel.Util.ReferenceExpressionUtil">
+            <summary>
+            Summary description for ReferenceExpressionUtil.
+            </summary>
+        </member>
+        <member name="T:Castle.Windsor.Adapters.ComponentModel.IContainerAdapter">
+            <summary>
+            Integrates the <see cref="T:Castle.Windsor.WindsorContainer"/> to the System.ComponentModel
+            and System.ComponentMode.Design infrastructure.
+            </summary>
+            <seealso cref="T:System.ComponentModel.IComponent"/>
+            <seealso cref="T:System.ComponentModel.IContainer"/>
+            <seealso cref="T:System.ComponentModel.Design.IServiceContainer"/>
+        </member>
+        <member name="T:Castle.Windsor.IContainerAccessor">
+            <summary>
+            This interface should be implemented by classes
+            that are available in a bigger context, exposing
+            the container to different areas in the same application.
+            <para>
+            For example, in Web application, the (global) HttpApplication
+            subclasses should implement this interface to expose 
+            the configured container
+            </para>
+            </summary>
+        </member>
+        <member name="T:Castle.Windsor.Adapters.ComponentModel.ServiceCreatorCallbackActivator">
+            <summary>
+            Custom activator to create the instance on demand.
+            </summary>
+        </member>
+        <member name="T:Castle.Windsor.Configuration.AppDomain.CastleSectionHandler">
+            <summary>
+            Implementation of <see cref="T:System.Configuration.IConfigurationSectionHandler"/>.
+            Do not support configuration inheritance.
+            </summary>
+        </member>
+        <member name="T:Castle.Windsor.Configuration.IConfigurationInterpreter">
+            <summary>
+            Interpreter of a specific language to describe 
+            configuration nodes in a hierarchical manner.
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.Configuration.IConfigurationInterpreter.ProcessResource(Castle.Core.Resource.IResource,Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore)">
+            <summary>
+            Should obtain the contents from the resource,
+            interpret it and populate the <see cref="T:Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore"/>
+            accordingly.
+            </summary>
+            <param name="resource"></param>
+            <param name="store"></param>
+        </member>
+        <member name="P:Castle.Windsor.Configuration.IConfigurationInterpreter.EnvironmentName">
+            <summary>
+            Gets or sets the name of the environment.
+            </summary>
+            <value>The name of the environment.</value>
+        </member>
+        <member name="P:Castle.Windsor.Configuration.IConfigurationInterpreter.Source">
+            <summary>
+            Exposes the reference to <see cref="T:Castle.Core.Resource.IResource"/>
+            which the interpreter is likely to hold
+            </summary>
+        </member>
+        <member name="T:Castle.Windsor.Configuration.Interpreters.AbstractInterpreter">
+            <summary>
+            Provides common methods for those who wants 
+            to implement <see cref="T:Castle.Windsor.Configuration.IConfigurationInterpreter"/>
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.Configuration.Interpreters.AbstractInterpreter.ProcessResource(Castle.Core.Resource.IResource,Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore)">
+            <summary>
+            Should obtain the contents from the resource,
+            interpret it and populate the <see cref="T:Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore"/>
+            accordingly.
+            </summary>
+            <param name="resource"></param>
+            <param name="store"></param>
+        </member>
+        <member name="P:Castle.Windsor.Configuration.Interpreters.AbstractInterpreter.Source">
+            <summary>
+            Exposes the reference to <see cref="T:Castle.Core.Resource.IResource"/>
+            which the interpreter is likely to hold
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Castle.Windsor.Configuration.Interpreters.AbstractInterpreter.EnvironmentName">
+            <summary>
+            Gets or sets the name of the environment.
+            </summary>
+            <value>The name of the environment.</value>
+        </member>
+        <member name="T:Castle.Windsor.Configuration.Interpreters.XmlInterpreter">
+            <summary>
+            Reads the configuration from a XmlFile. Sample structure:
+            <code>
+            &lt;configuration&gt;
+              &lt;facilities&gt;
+                &lt;facility id="myfacility"&gt;
+                
+                &lt;/facility&gt;
+              &lt;/facilities&gt;
+              
+              &lt;components&gt;
+                &lt;component id="component1"&gt;
+                
+                &lt;/component&gt;
+              &lt;/components&gt;
+            &lt;/configuration&gt;
+            </code>
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.Configuration.Interpreters.XmlInterpreter.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Windsor.Configuration.Interpreters.XmlInterpreter"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.Configuration.Interpreters.XmlInterpreter.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Windsor.Configuration.Interpreters.XmlInterpreter"/> class.
+            </summary>
+            <param name="filename">The filename.</param>
+        </member>
+        <member name="M:Castle.Windsor.Configuration.Interpreters.XmlInterpreter.#ctor(Castle.Core.Resource.IResource)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Windsor.Configuration.Interpreters.XmlInterpreter"/> class.
+            </summary>
+            <param name="source">The source.</param>
+        </member>
+        <member name="P:Castle.Windsor.Configuration.Interpreters.XmlInterpreter.Kernel">
+            <summary>
+            Gets or sets the kernel.
+            </summary>
+            <value>The kernel.</value>
+        </member>
+        <member name="M:Castle.Windsor.Configuration.Interpreters.XmlProcessor.DefaultXmlProcessorEngine.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Windsor.Configuration.Interpreters.XmlProcessor.DefaultXmlProcessorEngine"/> class.
+            </summary>
+            <param name="environmentName">Name of the environment.</param>
+        </member>
+        <member name="M:Castle.Windsor.Configuration.Interpreters.XmlProcessor.DefaultXmlProcessorEngine.#ctor(System.String,Castle.MicroKernel.SubSystems.Resource.IResourceSubSystem)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Windsor.Configuration.Interpreters.XmlProcessor.DefaultXmlProcessorEngine"/> class.
+            </summary>
+            <param name="environmentName">Name of the environment.</param>
+            <param name="resourceSubSystem">The resource sub system.</param>
+        </member>
+        <member name="M:Castle.Windsor.Configuration.Interpreters.XmlProcessor.DefaultXmlProcessorEngine.DispatchProcessAll(Castle.Windsor.Configuration.Interpreters.XmlProcessor.IXmlProcessorNodeList)">
+            <summary>
+            Processes the element.
+            </summary>
+            <param name="nodeList">The element.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.Configuration.Interpreters.XmlProcessor.DefaultXmlProcessorEngine.DispatchProcessCurrent(Castle.Windsor.Configuration.Interpreters.XmlProcessor.IXmlProcessorNodeList)">
+            <summary>
+            Processes the element.
+            </summary>
+            <param name="nodeList">The element.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.Configuration.Interpreters.XmlProcessor.DefaultXmlProcessorNodeList.CloneNodeList(System.Xml.XmlNodeList)">
+            <summary>
+            Make a shallow copy of the nodeList.
+            </summary>
+            <param name="nodeList">The nodeList to be copied.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.Configuration.Interpreters.XmlProcessor.ElementProcessors.AbstractXmlNodeProcessor.Accept(System.Xml.XmlNode)">
+            <summary>
+            Accepts the specified node.
+            Check if node has the same name as the processor and the node.NodeType
+            is in the AcceptNodeTypes List
+            </summary>
+            <param name="node">The node.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.Configuration.Interpreters.XmlProcessor.ElementProcessors.AbstractXmlNodeProcessor.GetNodeAsElement(System.Xml.XmlElement,System.Xml.XmlNode)">
+            <summary>
+            Convert and return child parameter into an XmlElement
+            An exception will be throw in case the child node cannot be converted
+            </summary>
+            <param name="element">Parent node</param>
+            <param name="child">Node to be converted</param>
+            <returns>child node as XmlElement</returns>
+        </member>
+        <member name="M:Castle.Windsor.Configuration.Interpreters.XmlProcessor.ElementProcessors.AttributesElementProcessor.Process(Castle.Windsor.Configuration.Interpreters.XmlProcessor.IXmlProcessorNodeList,Castle.Windsor.Configuration.Interpreters.XmlProcessor.IXmlProcessorEngine)">
+            <summary>
+            
+            </summary>
+            <param name="nodeList"></param>
+            <param name="engine"></param>
+            <example>
+            <code>
+            	<properties>
+            		<attributes>
+            			<myAttribute>attributeValue</myAttribute>
+            		</attributes>
+            		<myProperty>propertyValue</myProperty>
+            	</properties>
+            </code>
+            </example>
+        </member>
+        <member name="M:Castle.Windsor.Configuration.Interpreters.XmlProcessor.ElementProcessors.DefaultElementProcessor.Process(Castle.Windsor.Configuration.Interpreters.XmlProcessor.IXmlProcessorNodeList,Castle.Windsor.Configuration.Interpreters.XmlProcessor.IXmlProcessorEngine)">
+            <summary>
+            Processes the specified node list.
+            </summary>
+            <param name="nodeList">The node list.</param>
+            <param name="engine">The engine.</param>
+        </member>
+        <member name="M:Castle.Windsor.Configuration.Interpreters.XmlProcessor.ElementProcessors.DefaultElementProcessor.ProcessAttributes(System.Xml.XmlElement,Castle.Windsor.Configuration.Interpreters.XmlProcessor.IXmlProcessorEngine)">
+            <summary>
+            Processes element attributes.
+            if the attribute is include will append to the element
+            all contents from the file.
+            if the attribute has a property reference the reference will be
+            expanded
+            </summary>
+            <param name="element">The element.</param>
+            <param name="engine"></param>
+        </member>
+        <member name="F:Castle.Windsor.Configuration.Interpreters.XmlProcessor.ElementProcessors.DefaultTextNodeProcessor.PropertyValidationRegExp">
+            <summary>
+            Properties names can contain a-zA-Z0-9_. 
+            i.e. #!{ my_node_name } || #{ my.node.name }
+            spaces are trimmed
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.Configuration.Interpreters.XmlProcessor.ElementProcessors.DefaultTextNodeProcessor.ProcessString(System.Xml.XmlNode,System.String,Castle.Windsor.Configuration.Interpreters.XmlProcessor.IXmlProcessorEngine)">
+            <summary>
+            Processes the string.
+            </summary>
+            <param name="node">The node.</param>
+            <param name="value">The value.</param>
+            <param name="engine">The context.</param>
+        </member>
+        <member name="M:Castle.Windsor.Configuration.Interpreters.XmlProcessor.ElementProcessors.IncludeElementProcessor.Accept(System.Xml.XmlNode)">
+            <summary>
+            Accepts the specified node.
+            Check if node has the same name as the processor and the node.NodeType
+            is in the AcceptNodeTypes List
+            NOTE: since the BatchRegistrationFacility already uses an include
+            element we will distinguish between both by looking for the presence of an uri attribute
+            we should revisit this later by using xml-namespaces
+            </summary>
+            <param name="node">The node.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.Configuration.Interpreters.XmlProcessor.ElementProcessors.PropertiesElementProcessor.Process(Castle.Windsor.Configuration.Interpreters.XmlProcessor.IXmlProcessorNodeList,Castle.Windsor.Configuration.Interpreters.XmlProcessor.IXmlProcessorEngine)">
+            <summary>
+            
+            </summary>
+            <param name="nodeList"></param>
+            <param name="engine"></param>
+            <example>
+            <code>
+            	<properties>
+            		<attributes>
+            			<myAttribute>attributeValue</myAttribute>
+            		</attributes>
+            		<myProperty>propertyValue</myProperty>
+            	</properties>
+            </code>
+            </example>
+        </member>
+        <member name="T:Castle.Windsor.Configuration.Interpreters.XmlProcessor.XmlProcessor">
+            <summary>
+            Pendent
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.Configuration.Interpreters.XmlProcessor.XmlProcessor.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Windsor.Configuration.Interpreters.XmlProcessor.XmlProcessor"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.Configuration.Interpreters.XmlProcessor.XmlProcessor.#ctor(System.String,Castle.MicroKernel.SubSystems.Resource.IResourceSubSystem)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Windsor.Configuration.Interpreters.XmlProcessor.XmlProcessor"/> class.
+            </summary>
+            <param name="environmentName">Name of the environment.</param>
+            <param name="resourceSubSystem">The resource sub system.</param>
+        </member>
+        <member name="M:Castle.Windsor.Configuration.Interpreters.XmlProcessor.XmlProcessor.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Windsor.Configuration.Interpreters.XmlProcessor.XmlProcessor"/> class.
+            </summary>
+        </member>
+        <member name="T:Castle.Windsor.IEnvironmentInfo">
+            <summary>
+            Gets the environment information (name). Implementors should 
+            use to define their environments and how those affect the configuration.
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.IEnvironmentInfo.GetEnvironmentName">
+            <summary>
+            Gets the name of the environment.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.Installer.Configuration.FromAppConfig">
+            <summary>
+            Installs all the components from the App.Config file.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.Installer.Configuration.FromXmlFile(System.String)">
+            <summary>
+            Installs all the component from the xml configuration file.
+            </summary>
+            <param name="file">The xml configuration file.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.Installer.Configuration.FromXml(Castle.Core.Resource.IResource)">
+            <summary>
+            Installs all the component from the xml configuration.
+            </summary>
+            <param name="resource">The xml configuration resource.</param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Windsor.Installer.EnvironmentDelegate">
+            <summary>
+            Delegate to provide environment name.
+            </summary>
+            <returns>The environment name.</returns>
+        </member>
+        <member name="M:Castle.Windsor.Installer.ConfigurationInstaller.#ctor(Castle.Windsor.Configuration.IConfigurationInterpreter)">
+            <summary>
+            Initializes a new instance of the ConfigurationInstaller class.
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.Installer.ConfigurationInstaller.Environment(System.String)">
+            <summary>
+            Sets the configuration environment name.
+            </summary>
+            <param name="environmentName">The environment name.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.Installer.ConfigurationInstaller.Environment(Castle.Windsor.Installer.EnvironmentDelegate)">
+            <summary>
+            Set the configuration environment strategy.
+            </summary>
+            <param name="environment">The environment strategy.</param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Windsor.Installer.DefaultComponentInstaller">
+            <summary>
+            Default <see cref="T:Castle.Windsor.IComponentsInstaller"/> implementation.
+            </summary>
+        </member>
+        <member name="T:Castle.Windsor.IComponentsInstaller">
+            <summary>
+            Installs the components and facilities based on the
+            information on the configuration store.
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.IComponentsInstaller.SetUp(Castle.Windsor.IWindsorContainer,Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore)">
+            <summary>
+            Perform installation.
+            </summary>
+            <param name="container">Target container</param>
+            <param name="store">Configuration store</param>
+        </member>
+        <member name="M:Castle.Windsor.Installer.DefaultComponentInstaller.SetUp(Castle.Windsor.IWindsorContainer,Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore)">
+            <summary>
+            Perform installation.
+            </summary>
+            <param name="container">Target container</param>
+            <param name="store">Configuration store</param>
+        </member>
+        <member name="M:Castle.Windsor.Installer.FromAssembly.Containing(System.Type)">
+            <summary>
+            Scans the assembly containing specified type for types implementing <see cref="T:Castle.MicroKernel.Registration.IWindsorInstaller"/>, instantiates them and returns so that <see cref="M:Castle.Windsor.IWindsorContainer.Install(Castle.MicroKernel.Registration.IWindsorInstaller[])"/> can install them.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.Installer.FromAssembly.Containing(System.Type,Castle.Windsor.Installer.InstallerFactory)">
+            <summary>
+            Scans the assembly containing specified type for types implementing <see cref="T:Castle.MicroKernel.Registration.IWindsorInstaller"/>, instantiates using given <see cref="T:Castle.Windsor.Installer.InstallerFactory"/> and returns so that <see cref="M:Castle.Windsor.IWindsorContainer.Install(Castle.MicroKernel.Registration.IWindsorInstaller[])"/> can install them.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.Installer.FromAssembly.Containing``1">
+            <summary>
+            Scans the assembly containing specified type for types implementing <see cref="T:Castle.MicroKernel.Registration.IWindsorInstaller"/>, instantiates them and returns so that <see cref="M:Castle.Windsor.IWindsorContainer.Install(Castle.MicroKernel.Registration.IWindsorInstaller[])"/> can install them.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.Installer.FromAssembly.Containing``1(Castle.Windsor.Installer.InstallerFactory)">
+            <summary>
+            Scans the assembly containing specified type for types implementing <see cref="T:Castle.MicroKernel.Registration.IWindsorInstaller"/>, instantiates using given <see cref="T:Castle.Windsor.Installer.InstallerFactory"/> and returns so that <see cref="M:Castle.Windsor.IWindsorContainer.Install(Castle.MicroKernel.Registration.IWindsorInstaller[])"/> can install them.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.Installer.FromAssembly.Instance(System.Reflection.Assembly)">
+            <summary>
+            Scans the specified assembly with specified name for types implementing <see cref="T:Castle.MicroKernel.Registration.IWindsorInstaller"/>, instantiates them and returns so that <see cref="M:Castle.Windsor.IWindsorContainer.Install(Castle.MicroKernel.Registration.IWindsorInstaller[])"/> can install them.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.Installer.FromAssembly.Instance(System.Reflection.Assembly,Castle.Windsor.Installer.InstallerFactory)">
+            <summary>
+            Scans the specified assembly with specified name for types implementing <see cref="T:Castle.MicroKernel.Registration.IWindsorInstaller"/>, instantiates using given <see cref="T:Castle.Windsor.Installer.InstallerFactory"/> and returns so that <see cref="M:Castle.Windsor.IWindsorContainer.Install(Castle.MicroKernel.Registration.IWindsorInstaller[])"/> can install them.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.Installer.FromAssembly.Named(System.String)">
+            <summary>
+            Scans the assembly with specified name for types implementing <see cref="T:Castle.MicroKernel.Registration.IWindsorInstaller"/>, instantiates them and returns so that <see cref="M:Castle.Windsor.IWindsorContainer.Install(Castle.MicroKernel.Registration.IWindsorInstaller[])"/> can install them.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.Installer.FromAssembly.Named(System.String,Castle.Windsor.Installer.InstallerFactory)">
+            <summary>
+            Scans the assembly with specified name for types implementing <see cref="T:Castle.MicroKernel.Registration.IWindsorInstaller"/>, instantiates using given <see cref="T:Castle.Windsor.Installer.InstallerFactory"/> and returns so that <see cref="M:Castle.Windsor.IWindsorContainer.Install(Castle.MicroKernel.Registration.IWindsorInstaller[])"/> can install them.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.Installer.FromAssembly.This">
+            <summary>
+            Scans assembly that contains code calling this method for types implementing <see cref="T:Castle.MicroKernel.Registration.IWindsorInstaller"/>, 
+            instantiates them and returns so that <see cref="M:Castle.Windsor.IWindsorContainer.Install(Castle.MicroKernel.Registration.IWindsorInstaller[])"/> can install them.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.Installer.FromAssembly.This(Castle.Windsor.Installer.InstallerFactory)">
+            <summary>
+            Scans assembly that contains code calling this method for types implementing <see cref="T:Castle.MicroKernel.Registration.IWindsorInstaller"/>, instantiates using given <see cref="T:Castle.Windsor.Installer.InstallerFactory"/> and returns so that <see cref="M:Castle.Windsor.IWindsorContainer.Install(Castle.MicroKernel.Registration.IWindsorInstaller[])"/> can install them.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.Installer.FromAssembly.InDirectory(Castle.MicroKernel.Registration.AssemblyFilter)">
+            <summary>
+            Scans assemblies in directory specified by <paramref name="filter"/> for types implementing <see cref="T:Castle.MicroKernel.Registration.IWindsorInstaller"/>, instantiates and returns so that <see cref="M:Castle.Windsor.IWindsorContainer.Install(Castle.MicroKernel.Registration.IWindsorInstaller[])"/> can install them.
+            </summary>
+            <param name="filter"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.Installer.FromAssembly.InDirectory(Castle.MicroKernel.Registration.AssemblyFilter,Castle.Windsor.Installer.InstallerFactory)">
+            <summary>
+            Scans assemblies in directory specified by <paramref name="filter"/> for types implementing <see cref="T:Castle.MicroKernel.Registration.IWindsorInstaller"/>, instantiates using given <see cref="T:Castle.Windsor.Installer.InstallerFactory"/> and returns so that <see cref="M:Castle.Windsor.IWindsorContainer.Install(Castle.MicroKernel.Registration.IWindsorInstaller[])"/> can install them.
+            </summary>
+            <param name="filter"></param>
+            <param name="installerFactory"></param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Windsor.Installer.InstallerFactory">
+            <summary>
+            Helper class used by <see cref="T:Castle.Windsor.Installer.FromAssembly"/> to filter/order and instantiate <see cref="T:Castle.MicroKernel.Registration.IWindsorInstaller"/> implementations
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.Installer.InstallerFactory.CreateInstance(System.Type)">
+            <summary>
+            Performs custom instantiation of given <param name="installerType"/>
+            </summary>
+            <remarks>
+            Default implementation uses public parameterless constructor to create the instance.
+            </remarks>
+        </member>
+        <member name="M:Castle.Windsor.Installer.InstallerFactory.Select(System.Collections.Generic.IEnumerable{System.Type})">
+            <summary>
+            Performs custom filtering/ordering of given set of types.
+            </summary>
+            <param name="installerTypes">Set of concrete class types implementing <see cref="T:Castle.MicroKernel.Registration.IWindsorInstaller"/> interface.</param>
+            <returns>Transformed <paramref name="installerTypes"/>.</returns>
+            <remarks>Default implementation simply returns types passed into it.</remarks>
+        </member>
+        <member name="T:Castle.Windsor.IWindsorContainer">
+            <summary>
+              The <c>IWindsorContainer</c> interface exposes all the 
+              functionality the Windsor implements.
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.AddChildContainer(Castle.Windsor.IWindsorContainer)">
+            <summary>
+              Registers a subcontainer. The components exposed
+              by this container will be accessible from subcontainers.
+            </summary>
+            <param name = "childContainer"></param>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.AddFacility(System.String,Castle.MicroKernel.IFacility)">
+            <summary>
+              Registers a facility within the container.
+            </summary>
+            <param name="key">The key by which the <see cref="T:Castle.MicroKernel.IFacility"/> gets indexed.</param>
+            <param name="facility">The <see cref="T:Castle.MicroKernel.IFacility"/> to add to the container.</param>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.AddFacility``1(System.String)">
+            <summary>
+              Creates and adds an <see cref="T:Castle.MicroKernel.IFacility"/> facility to the container.
+            </summary>
+            <typeparam name="T">The facility type.</typeparam>
+            <param name="key"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.AddFacility``1(System.String,System.Action{``0})">
+            <summary>
+              Creates and adds an <see cref="T:Castle.MicroKernel.IFacility"/> facility to the container.
+            </summary>
+            <typeparam name="T">The facility type.</typeparam>
+            <param name="key"></param>
+            <param name="onCreate">The callback for creation.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.AddFacility``1(System.String,System.Func{``0,System.Object})">
+            <summary>
+              Creates and adds an <see cref="T:Castle.MicroKernel.IFacility"/> facility to the container.
+            </summary>
+            <typeparam name="T">The facility type.</typeparam>
+            <param name="key"></param>
+            <param name="onCreate">The callback for creation.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.AddFacility``1">
+            <summary>
+              Creates and adds an <see cref="T:Castle.MicroKernel.IFacility"/> facility to the container.
+            </summary>
+            <typeparam name="T">The facility type.</typeparam>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.AddFacility``1(System.Action{``0})">
+            <summary>
+              Creates and adds an <see cref="T:Castle.MicroKernel.IFacility"/> facility to the container.
+            </summary>
+            <typeparam name="T">The facility type.</typeparam>
+            <param name="onCreate">The callback for creation.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.AddFacility``1(System.Func{``0,System.Object})">
+            <summary>
+              Creates and adds an <see cref="T:Castle.MicroKernel.IFacility"/> facility to the container.
+            </summary>
+            <typeparam name="T">The facility type.</typeparam>
+            <param name="onCreate">The callback for creation.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.GetChildContainer(System.String)">
+            <summary>
+              Gets a child container instance by name.
+            </summary>
+            <param name = "name">The container's name.</param>
+            <returns>The child container instance or null</returns>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.Install(Castle.MicroKernel.Registration.IWindsorInstaller[])">
+            <summary>
+              Installs the components provided by the <see cref="T:Castle.MicroKernel.Registration.IWindsorInstaller"/>s
+              with the <see cref="T:Castle.Windsor.IWindsorContainer"/>.
+              <param name="installers">The component installers.</param>
+              <returns>The container.</returns>
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.Register(Castle.MicroKernel.Registration.IRegistration[])">
+            <summary>
+              Registers the components provided by the <see cref="T:Castle.MicroKernel.Registration.IRegistration"/>s
+              with the <see cref="T:Castle.Windsor.IWindsorContainer"/>.
+              <para/>
+              Create a new registration using <see cref="T:Castle.MicroKernel.Registration.Component"/>.For() or <see cref="T:Castle.MicroKernel.Registration.AllTypes"/>.
+            </summary>
+            <example>
+              <code>
+                container.Register(Component.For&lt;IService&gt;().ImplementedBy&lt;DefaultService&gt;());
+              </code>
+            </example>
+            <param name="registrations">The component registrations.</param>
+            <returns>The container.</returns>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.Release(System.Object)">
+            <summary>
+              Releases a component instance
+            </summary>
+            <param name = "instance"></param>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.RemoveChildContainer(Castle.Windsor.IWindsorContainer)">
+            <summary>
+              Remove a child container
+            </summary>
+            <param name = "childContainer"></param>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.Resolve(System.String,System.Collections.IDictionary)">
+            <summary>
+              Returns a component instance by the key
+            </summary>
+            <param name = "key"></param>
+            <param name = "arguments"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.Resolve(System.String,System.Object)">
+            <summary>
+              Returns a component instance by the key
+            </summary>
+            <param name = "key"></param>
+            <param name = "argumentsAsAnonymousType"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.Resolve(System.String,System.Type)">
+            <summary>
+              Returns a component instance by the key
+            </summary>
+            <param name = "key"></param>
+            <param name = "service"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.Resolve(System.Type)">
+            <summary>
+              Returns a component instance by the service
+            </summary>
+            <param name = "service"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.Resolve(System.Type,System.Collections.IDictionary)">
+            <summary>
+              Returns a component instance by the service
+            </summary>
+            <param name = "service"></param>
+            <param name = "arguments"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.Resolve(System.Type,System.Object)">
+            <summary>
+              Returns a component instance by the service
+            </summary>
+            <param name = "service"></param>
+            <param name = "argumentsAsAnonymousType"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.Resolve``1">
+            <summary>
+              Returns a component instance by the service
+            </summary>
+            <typeparam name = "T">Service type</typeparam>
+            <returns>The component instance</returns>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.Resolve``1(System.Collections.IDictionary)">
+            <summary>
+              Returns a component instance by the service
+            </summary>
+            <typeparam name = "T">Service type</typeparam>
+            <param name = "arguments"></param>
+            <returns>The component instance</returns>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.Resolve``1(System.Object)">
+            <summary>
+              Returns a component instance by the service
+            </summary>
+            <typeparam name = "T">Service type</typeparam>
+            <param name = "argumentsAsAnonymousType"></param>
+            <returns>The component instance</returns>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.Resolve``1(System.String)">
+            <summary>
+              Returns a component instance by the key
+            </summary>
+            <param name = "key">Component's key</param>
+            <typeparam name = "T">Service type</typeparam>
+            <returns>The Component instance</returns>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.Resolve``1(System.String,System.Collections.IDictionary)">
+            <summary>
+              Returns a component instance by the key
+            </summary>
+            <typeparam name = "T">Service type</typeparam>
+            <param name = "key">Component's key</param>
+            <param name = "arguments"></param>
+            <returns>The Component instance</returns>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.Resolve``1(System.String,System.Object)">
+            <summary>
+              Returns a component instance by the key
+            </summary>
+            <typeparam name = "T">Service type</typeparam>
+            <param name = "key">Component's key</param>
+            <param name = "argumentsAsAnonymousType"></param>
+            <returns>The Component instance</returns>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.Resolve(System.String,System.Type,System.Collections.IDictionary)">
+            <summary>
+              Returns a component instance by the key
+            </summary>
+            <param name = "key"></param>
+            <param name = "service"></param>
+            <param name = "arguments"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.Resolve(System.String,System.Type,System.Object)">
+            <summary>
+              Returns a component instance by the key
+            </summary>
+            <param name = "key"></param>
+            <param name = "service"></param>
+            <param name = "argumentsAsAnonymousType"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.ResolveAll``1">
+            <summary>
+              Resolve all valid components that match this type.
+            </summary>
+            <typeparam name = "T">The service type</typeparam>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.ResolveAll(System.Type)">
+            <summary>
+              Resolve all valid components that match this service
+              <param name = "service">the service to match</param>
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.ResolveAll(System.Type,System.Collections.IDictionary)">
+            <summary>
+              Resolve all valid components that match this service
+              <param name = "service">the service to match</param>
+              <param name = "arguments">Arguments to resolve the service</param>
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.ResolveAll(System.Type,System.Object)">
+            <summary>
+              Resolve all valid components that match this service
+              <param name = "service">the service to match</param>
+              <param name = "argumentsAsAnonymousType">Arguments to resolve the service</param>
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.ResolveAll``1(System.Collections.IDictionary)">
+            <summary>
+              Resolve all valid components that match this type.
+              <typeparam name = "T">The service type</typeparam>
+              <param name = "arguments">Arguments to resolve the service</param>
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.IWindsorContainer.ResolveAll``1(System.Object)">
+            <summary>
+              Resolve all valid components that match this type.
+              <typeparam name = "T">The service type</typeparam>
+              <param name = "argumentsAsAnonymousType">Arguments to resolve the service</param>
+            </summary>
+        </member>
+        <member name="P:Castle.Windsor.IWindsorContainer.Kernel">
+            <summary>
+              Returns the inner instance of the MicroKernel
+            </summary>
+        </member>
+        <member name="P:Castle.Windsor.IWindsorContainer.Name">
+            <summary>
+              Gets the container's name
+            </summary>
+            <remarks>
+              Only useful when child containers are being used
+            </remarks>
+            <value>The container's name.</value>
+        </member>
+        <member name="P:Castle.Windsor.IWindsorContainer.Parent">
+            <summary>
+              Gets or sets the parent container if this instance
+              is a sub container.
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.Proxy.AbstractProxyFactory.ObtainInterceptors(Castle.MicroKernel.IKernel,Castle.Core.ComponentModel,Castle.MicroKernel.Context.CreationContext)">
+            <summary>
+            Obtains the interceptors associated with the component.
+            </summary>
+            <param name="kernel">The kernel instance</param>
+            <param name="model">The component model</param>
+            <param name="context">The creation context</param>
+            <returns>interceptors array</returns>
+        </member>
+        <member name="T:Castle.Windsor.Proxy.DefaultProxyFactory">
+            <summary>
+            This implementation of <see cref="T:Castle.MicroKernel.IProxyFactory"/> relies 
+            on DynamicProxy to expose proxy capabilities.
+            </summary>
+            <remarks>
+            Note that only virtual methods can be intercepted in a 
+            concrete class. However, if the component 
+            was registered with a service interface, we proxy
+            the interface and the methods don't need to be virtual,
+            </remarks>
+        </member>
+        <member name="M:Castle.Windsor.Proxy.DefaultProxyFactory.#ctor">
+            <summary>
+            Constructs a DefaultProxyFactory
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.Proxy.DefaultProxyFactory.Create(Castle.MicroKernel.IKernel,System.Object,Castle.Core.ComponentModel,Castle.MicroKernel.Context.CreationContext,System.Object[])">
+            <summary>
+            Creates the proxy for the supplied component.
+            </summary>
+            <param name="kernel">The kernel.</param>
+            <param name="target">The target.</param>
+            <param name="model">The model.</param>
+            <param name="constructorArguments">The constructor arguments.</param>
+            <param name="context">The creation context</param>
+            <returns>The component proxy.</returns>
+        </member>
+        <member name="M:Castle.Windsor.Proxy.DefaultProxyFactory.RequiresTargetInstance(Castle.MicroKernel.IKernel,Castle.Core.ComponentModel)">
+            <summary>
+            Determines if the component requires a target instance for proxying.
+            </summary>
+            <param name="kernel">The kernel.</param>
+            <param name="model">The model.</param>
+            <returns>true if an instance is required.</returns>
+        </member>
+        <member name="T:Castle.Windsor.WindsorContainer">
+            <summary>
+              Implementation of <see cref="T:Castle.Windsor.IWindsorContainer"/>
+              which delegates to <see cref="T:Castle.MicroKernel.IKernel"/> implementation.
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.#ctor">
+            <summary>
+              Constructs a container without any external 
+              configuration reference
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.#ctor(Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore)">
+            <summary>
+              Constructs a container using the specified 
+              <see cref="T:Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore"/> implementation.
+            </summary>
+            <param name="store">The instance of an <see cref="T:Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore"/> implementation.</param>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.#ctor(Castle.Windsor.Configuration.IConfigurationInterpreter)">
+            <summary>
+              Constructs a container using the specified 
+              <see cref="T:Castle.Windsor.Configuration.IConfigurationInterpreter"/> implementation.
+            </summary>
+            <param name="interpreter">The instance of an <see cref="T:Castle.Windsor.Configuration.IConfigurationInterpreter"/> implementation.</param>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.#ctor(Castle.Windsor.Configuration.IConfigurationInterpreter,Castle.Windsor.IEnvironmentInfo)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.Windsor.WindsorContainer"/> class.
+            </summary>
+            <param name="interpreter">The interpreter.</param>
+            <param name="environmentInfo">The environment info.</param>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.#ctor(System.String)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.Windsor.WindsorContainer"/> class using a
+              xml file to configure it.
+              <para>
+                Equivalent to the use of <c>new WindsorContainer(new XmlInterpreter(xmlFile))</c>
+              </para>
+            </summary>
+            <param name="xmlFile">The XML file.</param>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.#ctor(Castle.MicroKernel.IKernel,Castle.Windsor.IComponentsInstaller)">
+            <summary>
+              Constructs a container using the specified <see cref="T:Castle.MicroKernel.IKernel"/>
+              implementation. Rarely used.
+            </summary>
+            <remarks>
+              This constructs sets the Kernel.ProxyFactory property to
+              <c>Proxy.DefaultProxyFactory</c>
+            </remarks>
+            <param name="kernel">Kernel instance</param>
+            <param name="installer">Installer instance</param>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.#ctor(System.String,Castle.MicroKernel.IKernel,Castle.Windsor.IComponentsInstaller)">
+            <summary>
+              Constructs a container using the specified <see cref="T:Castle.MicroKernel.IKernel"/>
+              implementation. Rarely used.
+            </summary>
+            <remarks>
+              This constructs sets the Kernel.ProxyFactory property to
+              <c>Proxy.DefaultProxyFactory</c>
+            </remarks>
+            <param name="name">Container's name</param>
+            <param name="kernel">Kernel instance</param>
+            <param name="installer">Installer instance</param>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.#ctor(Castle.MicroKernel.IProxyFactory)">
+            <summary>
+              Constructs with a given <see cref="T:Castle.MicroKernel.IProxyFactory"/>.
+            </summary>
+            <param name="proxyFactory">A instance of an <see cref="T:Castle.MicroKernel.IProxyFactory"/>.</param>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.#ctor(Castle.Windsor.IWindsorContainer,Castle.Windsor.Configuration.IConfigurationInterpreter)">
+            <summary>
+              Constructs a container assigning a parent container 
+              before starting the dependency resolution.
+            </summary>
+            <param name="parent">The instance of an <see cref="T:Castle.Windsor.IWindsorContainer"/></param>
+            <param name="interpreter">The instance of an <see cref="T:Castle.Windsor.Configuration.IConfigurationInterpreter"/> implementation</param>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.#ctor(System.String,Castle.Windsor.IWindsorContainer,Castle.Windsor.Configuration.IConfigurationInterpreter)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.Windsor.WindsorContainer"/> class.
+            </summary>
+            <param name="name">The container's name.</param>
+            <param name="parent">The parent.</param>
+            <param name="interpreter">The interpreter.</param>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.Dispose">
+            <summary>
+              Executes Dispose on underlying <see cref="T:Castle.MicroKernel.IKernel"/>
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.GetService(System.Type)">
+            <summary>
+              Gets the service object of the specified type.
+            </summary>
+            <returns>
+              A service object of type serviceType.
+            </returns>
+            <param name = "serviceType">An object that specifies the type of service object to get. </param>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.GetService``1">
+            <summary>
+              Gets the service object of the specified type.
+            </summary>
+            <returns>
+              A service object of type serviceType.
+            </returns>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.AddChildContainer(Castle.Windsor.IWindsorContainer)">
+            <summary>
+              Registers a subcontainer. The components exposed
+              by this container will be accessible from subcontainers.
+            </summary>
+            <param name = "childContainer"></param>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.AddFacility(System.String,Castle.MicroKernel.IFacility)">
+            <summary>
+              Registers a facility within the kernel.
+            </summary>
+            <param name = "key"></param>
+            <param name = "facility"></param>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.AddFacility``1(System.String)">
+            <summary>
+              Creates and adds an <see cref="T:Castle.MicroKernel.IFacility"/> facility to the container.
+            </summary>
+            <typeparam name="T">The facility type.</typeparam>
+            <param name="key"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.AddFacility``1(System.String,System.Action{``0})">
+            <summary>
+              Creates and adds an <see cref="T:Castle.MicroKernel.IFacility"/> facility to the container.
+            </summary>
+            <typeparam name="T">The facility type.</typeparam>
+            <param name="key"></param>
+            <param name="onCreate">The callback for creation.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.AddFacility``1(System.String,System.Func{``0,System.Object})">
+            <summary>
+              Creates and adds an <see cref="T:Castle.MicroKernel.IFacility"/> facility to the container.
+            </summary>
+            <typeparam name="T">The facility type.</typeparam>
+            <param name="key"></param>
+            <param name="onCreate">The callback for creation.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.AddFacility``1">
+            <summary>
+              Creates and adds an <see cref="T:Castle.MicroKernel.IFacility"/> facility to the container.
+            </summary>
+            <typeparam name="T">The facility type.</typeparam>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.AddFacility``1(System.Action{``0})">
+            <summary>
+              Creates and adds an <see cref="T:Castle.MicroKernel.IFacility"/> facility to the container.
+            </summary>
+            <typeparam name="T">The facility type.</typeparam>
+            <param name="onCreate">The callback for creation.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.AddFacility``1(System.Func{``0,System.Object})">
+            <summary>
+              Creates and adds an <see cref="T:Castle.MicroKernel.IFacility"/> facility to the container.
+            </summary>
+            <typeparam name="T">The facility type.</typeparam>
+            <param name="onCreate">The callback for creation.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.GetChildContainer(System.String)">
+            <summary>
+              Gets a child container instance by name.
+            </summary>
+            <param name = "name">The container's name.</param>
+            <returns>The child container instance or null</returns>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.Install(Castle.MicroKernel.Registration.IWindsorInstaller[])">
+            <summary>
+              Installs the components provided by the <see cref="T:Castle.MicroKernel.Registration.IWindsorInstaller"/>s
+              with the <see cref="T:Castle.Windsor.IWindsorContainer"/>.
+              <param name="installers">The component installers.</param>
+              <returns>The container.</returns>
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.Register(Castle.MicroKernel.Registration.IRegistration[])">
+            <summary>
+              Registers the components described by the <see cref="T:Castle.MicroKernel.Registration.ComponentRegistration`1"/>s
+              with the <see cref="T:Castle.Windsor.IWindsorContainer"/>.
+              <param name="registrations">The component registrations.</param>
+              <returns>The container.</returns>
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.Release(System.Object)">
+            <summary>
+              Releases a component instance
+            </summary>
+            <param name = "instance"></param>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.RemoveChildContainer(Castle.Windsor.IWindsorContainer)">
+            <summary>
+              Removes (unregisters) a subcontainer.  The components exposed by this container
+              will no longer be accessible to the child container.
+            </summary>
+            <param name = "childContainer"></param>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.Resolve(System.Type,System.Collections.IDictionary)">
+            <summary>
+              Returns a component instance by the service
+            </summary>
+            <param name = "service"></param>
+            <param name = "arguments"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.Resolve(System.Type,System.Object)">
+            <summary>
+              Returns a component instance by the service
+            </summary>
+            <param name = "service"></param>
+            <param name = "argumentsAsAnonymousType"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.Resolve(System.String,System.Collections.IDictionary)">
+            <summary>
+              Returns a component instance by the key
+            </summary>
+            <param name = "key"></param>
+            <param name = "arguments"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.Resolve(System.String,System.Object)">
+            <summary>
+              Returns a component instance by the key
+            </summary>
+            <param name = "key"></param>
+            <param name = "argumentsAsAnonymousType"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.Resolve(System.Type)">
+            <summary>
+              Returns a component instance by the service
+            </summary>
+            <param name = "service"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.Resolve(System.String,System.Type)">
+            <summary>
+              Returns a component instance by the key
+            </summary>
+            <param name = "key"></param>
+            <param name = "service"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.Resolve(System.String,System.Type,System.Collections.IDictionary)">
+            <summary>
+              Returns a component instance by the key
+            </summary>
+            <param name = "key"></param>
+            <param name = "service"></param>
+            <param name = "arguments"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.Resolve(System.String,System.Type,System.Object)">
+            <summary>
+              Returns a component instance by the key
+            </summary>
+            <param name = "key"></param>
+            <param name = "service"></param>
+            <param name = "argumentsAsAnonymousType"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.Resolve``1(System.Collections.IDictionary)">
+            <summary>
+              Returns a component instance by the service
+            </summary>
+            <typeparam name = "T"></typeparam>
+            <param name = "arguments"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.Resolve``1(System.Object)">
+            <summary>
+              Returns a component instance by the service
+            </summary>
+            <typeparam name = "T"></typeparam>
+            <param name = "argumentsAsAnonymousType"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.Resolve``1(System.String,System.Collections.IDictionary)">
+            <summary>
+              Returns a component instance by the key
+            </summary>
+            <param name = "key"></param>
+            <param name = "arguments"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.Resolve``1(System.String,System.Object)">
+            <summary>
+              Returns a component instance by the key
+            </summary>
+            <param name = "key"></param>
+            <param name = "argumentsAsAnonymousType"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.Resolve``1">
+            <summary>
+              Returns a component instance by the service
+            </summary>
+            <typeparam name = "T"></typeparam>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.Resolve``1(System.String)">
+            <summary>
+              Returns a component instance by the key
+            </summary>
+            <param name = "key"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.ResolveAll``1">
+            <summary>
+              Resolve all valid components that match this type.
+            </summary>
+            <typeparam name = "T">The service type</typeparam>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.ResolveAll``1(System.Collections.IDictionary)">
+            <summary>
+              Resolve all valid components that match this type.
+              <typeparam name = "T">The service type</typeparam>
+              <param name = "arguments">Arguments to resolve the service</param>
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.WindsorContainer.ResolveAll``1(System.Object)">
+            <summary>
+              Resolve all valid components that match this type.
+              <typeparam name = "T">The service type</typeparam>
+              <param name = "argumentsAsAnonymousType">Arguments to resolve the service</param>
+            </summary>
+        </member>
+        <member name="P:Castle.Windsor.WindsorContainer.Kernel">
+            <summary>
+              Returns the inner instance of the MicroKernel
+            </summary>
+        </member>
+        <member name="P:Castle.Windsor.WindsorContainer.Name">
+            <summary>
+              Gets the container's name
+            </summary>
+            <remarks>
+              Only useful when child containers are being used
+            </remarks>
+            <value>The container's name.</value>
+        </member>
+        <member name="P:Castle.Windsor.WindsorContainer.Parent">
+            <summary>
+              Gets or sets the parent container if this instance
+              is a sub container.
+            </summary>
+        </member>
+        <member name="T:Castle.Windsor.Adapters.ComponentModel.ContainerAdapter">
+            <summary>
+            Implementation of <see cref="T:Castle.Windsor.Adapters.ComponentModel.IContainerAdapter"/> that assumes ownership of the
+            wrapped <see cref="T:Castle.Windsor.IWindsorContainer"/>.  If this adapter is disposed, the underlying
+            <see cref="T:Castle.Windsor.IWindsorContainer"/> is diposed as well.
+            </summary>
+        </member>
+        <member name="T:Castle.Windsor.Adapters.ComponentModel.ContainerWrapper">
+            <summary>
+            Implementation of <see cref="T:Castle.Windsor.Adapters.ComponentModel.IContainerAdapter"/> that does not assume ownership of the
+            wrapped <see cref="T:Castle.Windsor.IWindsorContainer"/>. 
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.Adapters.ComponentModel.ContainerWrapper.#ctor(Castle.Windsor.IWindsorContainer)">
+            <summary>
+            Constructs an initial ContainerWrapper.
+            </summary>
+            <param name="container">The <see cref="T:Castle.Windsor.IWindsorContainer"/> to adapt.</param>
+        </member>
+        <member name="M:Castle.Windsor.Adapters.ComponentModel.ContainerWrapper.#ctor(Castle.Windsor.IWindsorContainer,System.IServiceProvider)">
+            <summary>
+            Constructs an initial ContainerWrapper.
+            </summary>
+            <param name="container">The <see cref="T:Castle.Windsor.IWindsorContainer"/> to adapt.</param>
+            <param name="parentProvider">The parent <see cref="T:System.IServiceProvider"/>.</param>
+        </member>
+        <member name="M:Castle.Windsor.Adapters.ComponentModel.ContainerWrapper.Add(System.ComponentModel.IComponent)">
+            <summary>
+            Adds the specified <see cref="T:System.ComponentModel.IComponent"/> to the <see cref="T:System.ComponentModel.IContainer"/> at the end of the list.
+            </summary>
+            <param name="component">The <see cref="T:System.ComponentModel.IComponent"/> to add.</param>
+        </member>
+        <member name="M:Castle.Windsor.Adapters.ComponentModel.ContainerWrapper.Add(System.ComponentModel.IComponent,System.String)">
+            <summary>
+            Adds the specified <see cref="T:System.ComponentModel.IComponent"/> to the <see cref="T:System.ComponentModel.IContainer"/> at the end of the list,
+            and assigns a name to the component.
+            </summary>
+            <param name="component">The <see cref="T:System.ComponentModel.IComponent"/> to add.</param>
+            <param name="name">The unique, case-insensitive name to assign to the component, or null.</param>
+        </member>
+        <member name="M:Castle.Windsor.Adapters.ComponentModel.ContainerWrapper.Remove(System.ComponentModel.IComponent)">
+            <summary>
+            Removes a component from the <see cref="T:System.ComponentModel.IContainer"/>.
+            </summary>
+            <param name="component">The <see cref="T:System.ComponentModel.IComponent"/> to remove</param>
+        </member>
+        <member name="M:Castle.Windsor.Adapters.ComponentModel.ContainerWrapper.GetService(System.Type)">
+            <summary>
+            Gets the service object of the specified type.
+            </summary>
+            <param name="serviceType">The type of service.</param>
+            <returns>An object implementing service, or null.</returns>
+        </member>
+        <member name="M:Castle.Windsor.Adapters.ComponentModel.ContainerWrapper.AddService(System.Type,System.Object)">
+            <summary>
+            Adds the specified service to the service container.
+            </summary>
+            <param name="serviceType">The type of service to add.</param>
+            <param name="serviceInstance">The instance of the service to add.</param>
+        </member>
+        <member name="M:Castle.Windsor.Adapters.ComponentModel.ContainerWrapper.AddService(System.Type,System.ComponentModel.Design.ServiceCreatorCallback)">
+            <summary>
+            Adds the specified service to the service container.
+            </summary>
+            <param name="serviceType">The type of service to add.</param>
+            <param name="callback">A callback object that is used to create the service.</param>
+        </member>
+        <member name="M:Castle.Windsor.Adapters.ComponentModel.ContainerWrapper.AddService(System.Type,System.Object,System.Boolean)">
+            <summary>
+            Adds the specified service to the service container, and optionally
+            promotes the service to any parent service containers.
+            </summary>
+            <param name="serviceType">The type of service to add.</param>
+            <param name="serviceInstance">The instance of the service to add.</param>
+            <param name="promote">true to promote this request to any parent service containers.</param>
+        </member>
+        <member name="M:Castle.Windsor.Adapters.ComponentModel.ContainerWrapper.AddService(System.Type,System.ComponentModel.Design.ServiceCreatorCallback,System.Boolean)">
+            <summary>
+            Adds the specified service to the service container, and optionally 
+            promotes the service to parent service containers.
+            </summary>
+            <param name="serviceType">The type of service to add.</param>
+            <param name="callback">A callback object that is used to create the service.</param>
+            <param name="promote">true to promote this request to any parent service containers.</param>
+        </member>
+        <member name="M:Castle.Windsor.Adapters.ComponentModel.ContainerWrapper.RemoveService(System.Type)">
+            <summary>
+            Removes the specified service type from the service container.
+            </summary>
+            <param name="serviceType">The type of service to remove.</param>
+        </member>
+        <member name="M:Castle.Windsor.Adapters.ComponentModel.ContainerWrapper.RemoveService(System.Type,System.Boolean)">
+            <summary>
+            Removes the specified service type from the service container, 
+            and optionally promotes the service to parent service containers.
+            </summary>
+            <param name="serviceType">The type of service to remove.</param>
+            <param name="promote">true to promote this request to any parent service containers.</param>
+        </member>
+        <member name="M:Castle.Windsor.Adapters.ComponentModel.ContainerWrapper.IsIntrinsicService(System.Type)">
+            <summary>
+            Determines if the service type represents an intrinsic service.
+            </summary>
+            <param name="serviceType">The type of service to remove.</param>
+            <returns>true if the service type is an intrinsic service.</returns>
+        </member>
+        <member name="M:Castle.Windsor.Adapters.ComponentModel.ContainerWrapper.HasService(System.Type)">
+            <summary>
+            Determines if the specified service type exists in the service container.
+            </summary>
+            <param name="serviceType">The type of service to remove.</param>
+            <returns>true if the service type exists.</returns>
+        </member>
+        <member name="M:Castle.Windsor.Adapters.ComponentModel.ContainerWrapper.Dispose">
+            <summary>
+            Releases the resources used by the component.
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.Adapters.ComponentModel.ContainerWrapper.Dispose(System.Boolean)">
+            <summary>
+            Releases the resources used by the component.
+            </summary>
+            <param name="disposing">true if disposing.</param>
+        </member>
+        <member name="P:Castle.Windsor.Adapters.ComponentModel.ContainerWrapper.Site">
+            <summary>
+            Gets or sets the <see cref="T:System.ComponentModel.ISite"/> associated with the <see cref="T:System.ComponentModel.IComponent"/>.
+            </summary>
+        </member>
+        <member name="E:Castle.Windsor.Adapters.ComponentModel.ContainerWrapper.Disposed">
+            <summary>
+            Event that notifies the disposal of the <see cref="T:System.ComponentModel.IComponent"/>.
+            </summary>
+        </member>
+        <member name="P:Castle.Windsor.Adapters.ComponentModel.ContainerWrapper.Components">
+            <summary>
+            Gets all the components in the <see cref="T:System.ComponentModel.IContainer"/>.
+            </summary>
+        </member>
+        <member name="P:Castle.Windsor.Adapters.ComponentModel.ContainerWrapper.Container">
+            <summary>
+            Gets the adapted <see cref="T:Castle.Windsor.IWindsorContainer"/>
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.Adapters.ComponentModel.ContainerAdapter.#ctor">
+            <summary>
+            Constructs a default ContainerAdapter.
+            </summary>
+        </member>
+        <member name="M:Castle.Windsor.Adapters.ComponentModel.ContainerAdapter.#ctor(System.IServiceProvider)">
+            <summary>
+            Constructs a chained ContainerAdapter.
+            </summary>
+            <param name="parentProvider">The parent <see cref="T:System.IServiceProvider"/>.</param>
+        </member>
+        <member name="M:Castle.Windsor.Adapters.ComponentModel.ContainerAdapter.#ctor(Castle.Windsor.IWindsorContainer)">
+            <summary>
+            Constructs an initial ContainerAdapter.
+            </summary>
+            <param name="container">The <see cref="T:Castle.Windsor.IWindsorContainer"/> to adapt.</param>
+        </member>
+        <member name="M:Castle.Windsor.Adapters.ComponentModel.ContainerAdapter.#ctor(Castle.Windsor.IWindsorContainer,System.IServiceProvider)">
+            <summary>
+            Constructs an initial ContainerAdapter.
+            </summary>
+            <param name="container">The <see cref="T:Castle.Windsor.IWindsorContainer"/> to adapt.</param>
+            <param name="parentProvider">The parent <see cref="T:System.IServiceProvider"/>.</param>
+        </member>
+    </members>
+</doc>
Binary file Redist/Castle/Castle.Windsor.dll has changed
Binary file Redist/IBM/IBM.Data.DB2.dll has changed
Binary file Redist/IBM/IBM.Data.Informix.dll has changed
Binary file Redist/Sybase/Sybase.AdoNet2.AseClient.dll has changed
Binary file Redist/Sybase/sybdrvado20.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Snapshot.cmd	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1 @@
+powershell -File Snapshot.ps1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Snapshot.ps1	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,125 @@
+git archive --format=zip -o C:\Temp\BLToolkitSnapshot\bltoolkit_dev.zip master
+
+$revision = 0
+
+git rev-list master |
+Foreach-Object {
+	$revision = $revision + 1
+}
+
+Write-Host "BLToolkit revision: $revision"
+Write-Host ""
+
+c:
+
+if (!([System.IO.DirectoryInfo]"c:\temp\").Exists)                   { md c:\temp }
+if (!([System.IO.DirectoryInfo]"c:\temp\BLToolkitSnapshot\").Exists) { md c:\temp\BLToolkitSnapshot }
+
+cd c:\temp\BLToolkitSnapshot\
+
+if (([System.IO.DirectoryInfo]"c:\temp\BLToolkitSnapshot\bl-toolkit\").Exists) {
+	rd bl-toolkit\* -recurse
+} else {
+	md bl-toolkit
+}
+
+cd bl-toolkit
+
+$rar = '"' + ${env:ProgramFiles(x86)} + '\WinRAR\WinRar.exe" x ..\bltoolkit_dev.zip'
+cmd /c $rar
+
+del ..\*.zip
+
+$rev_file = '// Autogenerated. Do not modify!
+
+namespace BLToolkit
+{
+	partial class BLToolkitConstants
+	{
+		// <summary>
+		// Revision component of version.
+		// <summary>
+		public const string Revision = "' + $revision + '";
+	}
+}'
+
+del Source\Properties\Revision.generated.cs
+$rev_file >> Source\Properties\Revision.generated.cs
+
+$rar = '"' + ${env:ProgramFiles(x86)} + '\WinRAR\WinRar.exe" a -m5 -md1024 -s -r -rr -AFzip -x*\_svn\* c:\temp\BLToolkitSnapshot\bltoolkit_dev *.*'
+cmd /c $rar
+
+$rar = '"' + ${env:ProgramFiles(x86)} + '\WinRAR\WinRar.exe" a -m5 -md1024 -s -r -rr -AFzip -x*\_svn\* c:\temp\BLToolkitSnapshot\bltoolkit Source\*.*'
+cmd /c $rar
+
+cd Source
+
+$comp = "$env:windir\Microsoft.NET\Framework\v3.5\MSBuild.exe BLToolkit.3.csproj /property:Configuration=Release"
+cmd /c $comp
+$comp = "$env:windir\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe BLToolkit.4.csproj /property:Configuration=Release"
+cmd /c $comp
+$comp = "$env:windir\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe BLToolkit.Data.4.csproj /property:Configuration=Release"
+cmd /c $comp
+$comp = "$env:windir\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe BLToolkit.SL.4.csproj /property:Configuration=Release"
+cmd /c $comp
+
+copy bin\Release\*.dll .
+md DataProviders
+
+cd ..\Tools\BLTgen
+
+$comp = "$env:windir\Microsoft.NET\Framework\v3.5\MSBuild.exe BLTgen.2008.csproj /property:Configuration=Release"
+cmd /c $comp
+$comp = "$env:windir\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe BLTgen.2010.csproj /property:Configuration=Release"
+cmd /c $comp
+
+copy bin\Release\*.exe ..\..\Source
+
+cd ..\..\DataProviders
+
+$comp = "$env:windir\Microsoft.NET\Framework\v3.5\MSBuild.exe BLToolkit.Data.DataProvider.DB2.3.csproj        /property:Configuration=Release"
+cmd /c $comp
+$comp = "$env:windir\Microsoft.NET\Framework\v3.5\MSBuild.exe BLToolkit.Data.DataProvider.Firebird.3.csproj   /property:Configuration=Release"
+cmd /c $comp
+$comp = "$env:windir\Microsoft.NET\Framework\v3.5\MSBuild.exe BLToolkit.Data.DataProvider.Informix.3.csproj   /property:Configuration=Release"
+cmd /c $comp
+$comp = "$env:windir\Microsoft.NET\Framework\v3.5\MSBuild.exe BLToolkit.Data.DataProvider.MySql.3.csproj      /property:Configuration=Release"
+cmd /c $comp
+$comp = "$env:windir\Microsoft.NET\Framework\v3.5\MSBuild.exe BLToolkit.Data.DataProvider.Oracle.3.csproj     /property:Configuration=Release"
+cmd /c $comp
+$comp = "$env:windir\Microsoft.NET\Framework\v3.5\MSBuild.exe BLToolkit.Data.DataProvider.PostgreSQL.3.csproj /property:Configuration=Release"
+cmd /c $comp
+$comp = "$env:windir\Microsoft.NET\Framework\v3.5\MSBuild.exe BLToolkit.Data.DataProvider.SqlCe.3.csproj      /property:Configuration=Release"
+cmd /c $comp
+$comp = "$env:windir\Microsoft.NET\Framework\v3.5\MSBuild.exe BLToolkit.Data.DataProvider.SQLite.3.csproj     /property:Configuration=Release"
+cmd /c $comp
+$comp = "$env:windir\Microsoft.NET\Framework\v3.5\MSBuild.exe BLToolkit.Data.DataProvider.Sybase.3.csproj     /property:Configuration=Release"
+cmd /c $comp
+
+$comp = "$env:windir\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe BLToolkit.Data.DataProvider.DB2.4.csproj        /property:Configuration=Release"
+cmd /c $comp
+$comp = "$env:windir\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe BLToolkit.Data.DataProvider.Firebird.4.csproj   /property:Configuration=Release"
+cmd /c $comp
+$comp = "$env:windir\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe BLToolkit.Data.DataProvider.Informix.4.csproj   /property:Configuration=Release"
+cmd /c $comp
+$comp = "$env:windir\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe BLToolkit.Data.DataProvider.MySql.4.csproj      /property:Configuration=Release"
+cmd /c $comp
+$comp = "$env:windir\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe BLToolkit.Data.DataProvider.Oracle.4.csproj     /property:Configuration=Release"
+cmd /c $comp
+$comp = "$env:windir\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe BLToolkit.Data.DataProvider.PostgreSQL.4.csproj /property:Configuration=Release"
+cmd /c $comp
+$comp = "$env:windir\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe BLToolkit.Data.DataProvider.SqlCe.4.csproj      /property:Configuration=Release"
+cmd /c $comp
+$comp = "$env:windir\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe BLToolkit.Data.DataProvider.SQLite.4.csproj     /property:Configuration=Release"
+cmd /c $comp
+$comp = "$env:windir\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe BLToolkit.Data.DataProvider.Sybase.4.csproj     /property:Configuration=Release"
+cmd /c $comp
+
+copy bin\Release\BLToolkit.Data.*.dll ..\Source\DataProviders
+
+cd ..\Source
+
+$rar = '"' + ${env:ProgramFiles(x86)} + '\WinRAR\WinRar.exe" a -m5 -md1024 -s -r -rr -AFzip -x*\_svn\* -x*\bin\* -x*\obj\* c:\temp\BLToolkitSnapshot\bltoolkit_bin *.exe *.dll DataProvider\ Data\DataProvider\'
+cmd /c $rar
+
+ftp -s:e:\documents\copybltsnapshot.txt ftp.bltoolkit.net
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/AsyncAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,39 @@
+using System;
+
+using BLToolkit.TypeBuilder.Builders;
+
+namespace BLToolkit.Aspects
+{
+	/// <summary>
+	/// http://www.bltoolkit.net/Doc/Aspects/index.htm
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Method)]
+	public sealed class AsyncAttribute : AbstractTypeBuilderAttribute
+	{
+		private readonly string _targetMethodName;
+		private readonly Type[] _parameterTypes;
+
+		public AsyncAttribute()
+		{
+		}
+
+		public AsyncAttribute(string targetMethodName): this(targetMethodName, null)
+		{
+		}
+
+		public AsyncAttribute(params Type[] parameterTypes): this(null, parameterTypes)
+		{
+		}
+
+		public AsyncAttribute(string targetMethodName, params Type[] parameterTypes)
+		{
+			_targetMethodName = targetMethodName;
+			_parameterTypes   = parameterTypes;
+		}
+
+		public override IAbstractTypeBuilder TypeBuilder
+		{
+			get { return new Builders.AsyncAspectBuilder(_targetMethodName, _parameterTypes); }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/Builders/AsyncAspectBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,274 @@
+using System;
+using System.Reflection;
+using System.Threading;
+
+namespace BLToolkit.Aspects.Builders
+{
+	using Properties;
+	using TypeBuilder;
+	using TypeBuilder.Builders;
+
+	/// <summary>
+	/// This aspect simplifies asynchronous operations.
+	/// </summary>
+	public class AsyncAspectBuilder : AbstractTypeBuilderBase
+	{
+		private readonly string _targetMethodName;
+		private readonly Type[] _parameterTypes;
+
+		public AsyncAspectBuilder(string targetMethodName, Type[] parameterTypes)
+		{
+			_targetMethodName = targetMethodName;
+			_parameterTypes   = parameterTypes;
+		}
+
+		public override int GetPriority(BuildContext context)
+		{
+			return TypeBuilderConsts.Priority.AsyncAspect;
+		}
+
+		public override bool IsCompatible(BuildContext context, IAbstractTypeBuilder typeBuilder)
+		{
+			if (context.IsBuildStep)
+				return false;
+
+			var list = new AbstractTypeBuilderList(2) { this, typeBuilder };
+			var step = context.Step;
+
+			try
+			{
+				context.Step = BuildStep.Build;
+
+				return typeBuilder.IsApplied(context, list);
+			}
+			finally
+			{
+				context.Step = step;
+			}
+		}
+
+		public override bool IsApplied(BuildContext context, AbstractTypeBuilderList builders)
+		{
+			if (context == null) throw new ArgumentNullException("context");
+
+			return context.IsBuildStep && context.BuildElement == BuildElement.AbstractMethod;
+		}
+
+		protected override void BuildAbstractMethod()
+		{
+			var mi = Context.CurrentMethod;
+
+			if (mi.ReturnType == typeof(IAsyncResult))
+				BuildBeginMethod();
+			else
+			{
+				var parameters = mi.GetParameters();
+
+				if (parameters.Length == 1 && parameters[0].ParameterType == typeof(IAsyncResult))
+					BuildEndMethod();
+				else
+					throw new TypeBuilderException(string.Format("Method '{0}.{1}' is not a 'Begin' nor an 'End' method.", mi.DeclaringType.FullName, mi.Name));
+			}
+		}
+
+		private void BuildBeginMethod()
+		{
+			var mi           = Context.CurrentMethod;
+			var method       = GetTargetMethod(Context, "Begin");
+			var delegateType = EnsureDelegateType(Context, method);
+			var emit         = Context.MethodBuilder.Emitter;
+			var type         = typeof(InternalAsyncResult);
+			var arLocal      = emit.DeclareLocal(type);
+			var dLocal       = emit.DeclareLocal(delegateType);
+
+			emit
+				.newobj (type)
+				.dup
+				.dup
+				.dup
+				.stloc  (arLocal)
+				.ldarg_0
+				.ldftn  (method)
+				.newobj (delegateType, typeof(object), typeof(IntPtr))
+				.stloc  (dLocal)
+				.ldloc  (dLocal)
+				.stfld  (type.GetField("Delegate"))
+				.ldloc  (dLocal)
+				;
+
+			var callbackIndex = -1;
+			var parameters    = mi.GetParameters();
+
+			for (var i = 0; i < parameters.Length; ++i)
+			{
+				if (parameters[i].ParameterType == typeof(AsyncCallback))
+				{
+					callbackIndex = i;
+					emit
+						.ldloc  (arLocal)
+						.dup
+						.ldarg  (parameters[i])
+						.stfld  (type.GetField("AsyncCallback"))
+						.ldftn  (type.GetMethod("CallBack"))
+						.newobj (typeof(AsyncCallback), typeof(object), typeof(IntPtr))
+						;
+				}
+				else
+					emit.ldarg(parameters[i]);
+			}
+
+			if (callbackIndex < 0)
+			{
+				// Callback omitted
+				//
+				emit
+					.ldnull
+					.ldnull
+					.end();
+			}
+			else if (callbackIndex == parameters.Length - 1)
+			{
+				// State omitted
+				//
+				emit
+					.ldnull
+					.end();
+			}
+
+			emit
+				.callvirt (delegateType.GetMethod("BeginInvoke"))
+				.stfld    (type.GetField("InnerResult"))
+				.stloc    (Context.ReturnValue)
+				;
+		}
+
+		private void BuildEndMethod()
+		{
+			var method       = GetTargetMethod(Context, "End");
+			var delegateType = EnsureDelegateType(Context, method);
+			var emit         = Context.MethodBuilder.Emitter;
+			var type         = typeof(InternalAsyncResult);
+			var arLocal      = emit.DeclareLocal(type);
+
+			emit
+				.ldarg_1
+				.castclass (type)
+				.dup
+				.stloc     (arLocal)
+				.ldfld     (type.GetField("Delegate"))
+				.castclass (delegateType)
+				.ldloc     (arLocal)
+				.ldfld     (type.GetField("InnerResult"))
+				.callvirt  (delegateType, "EndInvoke", typeof(IAsyncResult));
+
+			if (Context.ReturnValue != null)
+				emit.stloc(Context.ReturnValue);
+		}
+
+		private MethodInfo GetTargetMethod(BuildContext context, string prefix)
+		{
+			var targetMethodName = _targetMethodName;
+
+			if (targetMethodName == null)
+			{
+				var mi   = context.CurrentMethod;
+				var name = mi.Name;
+
+				if (name.StartsWith(prefix))
+					targetMethodName = name.Substring(prefix.Length);
+				else
+					throw new TypeBuilderException(string.Format(
+						Resources.AsyncAspectBuilder_NoTargetMethod,
+							mi.DeclaringType.FullName, mi.Name));
+			}
+
+			return _parameterTypes == null?
+				context.Type.GetMethod(targetMethodName):
+				context.Type.GetMethod(targetMethodName, _parameterTypes);
+		}
+
+		private static Type EnsureDelegateType(BuildContext context, MethodInfo method)
+		{
+			// The delegate should be defined as inner type of context.TypeBuilder.
+			// It's possible, but we can not define and use newly defined type as Emit target in its owner type.
+			// To solve this problem, we should create a top level delegate and make sure its name is unique.
+			//
+			var delegateName = context.TypeBuilder.TypeBuilder.FullName + "$" + method.Name + "$Delegate";
+			var delegateType = context.GetItem<Type>(delegateName);
+
+			if (delegateType == null)
+			{
+				var pi         = method.GetParameters();
+				var parameters = new Type[pi.Length];
+
+				for (var i = 0; i < pi.Length; i++)
+					parameters[i] = pi[i].ParameterType;
+
+				const MethodImplAttributes mia = MethodImplAttributes.Runtime | MethodImplAttributes.Managed;
+				const MethodAttributes     ma  = MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.Virtual;
+
+				var delegateBuilder = context.AssemblyBuilder.DefineType(delegateName,
+					TypeAttributes.Class | TypeAttributes.NotPublic | TypeAttributes.Sealed | TypeAttributes.AnsiClass | TypeAttributes.AutoClass,
+					typeof(MulticastDelegate));
+
+				// Create constructor
+				//
+				var ctorBuilder = delegateBuilder.DefineConstructor(
+					MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.RTSpecialName, CallingConventions.Standard,
+					typeof(object), typeof(IntPtr));
+				ctorBuilder.ConstructorBuilder.SetImplementationFlags(mia);
+
+				// Define the BeginInvoke method for the delegate
+				//
+				var beginParameters = new Type[parameters.Length + 2];
+
+				Array.Copy(parameters, 0, beginParameters, 0, parameters.Length);
+				beginParameters[parameters.Length]   = typeof(AsyncCallback);
+				beginParameters[parameters.Length+1] = typeof(object);
+
+				var methodBuilder = delegateBuilder.DefineMethod("BeginInvoke", ma, typeof(IAsyncResult), beginParameters);
+
+				methodBuilder.MethodBuilder.SetImplementationFlags(mia);
+
+				// Define the EndInvoke method for the delegate
+				//
+				methodBuilder = delegateBuilder.DefineMethod("EndInvoke", ma, method.ReturnType, typeof(IAsyncResult));
+				methodBuilder.MethodBuilder.SetImplementationFlags(mia);
+
+				// Define the Invoke method for the delegate
+				//
+				methodBuilder = delegateBuilder.DefineMethod("Invoke", ma, method.ReturnType, parameters);
+				methodBuilder.MethodBuilder.SetImplementationFlags(mia);
+
+				context.Items.Add(delegateName, delegateType = delegateBuilder.Create());
+			}
+
+			return delegateType;
+		}
+
+		#region Helper
+
+		/// <summary>
+		/// Reserved for internal BLToolkit use.
+		/// </summary>
+		public class InternalAsyncResult : IAsyncResult
+		{
+			public IAsyncResult  InnerResult;
+			public Delegate      Delegate;
+			public AsyncCallback AsyncCallback;
+
+			public void CallBack(IAsyncResult ar)
+			{
+				if (AsyncCallback != null)
+					AsyncCallback(this);
+			}
+
+			public bool       IsCompleted            { get { return InnerResult.IsCompleted; } }
+			public WaitHandle AsyncWaitHandle        { get { return InnerResult.AsyncWaitHandle; } }
+			public object     AsyncState             { get { return InnerResult.AsyncState; } }
+			public bool       CompletedSynchronously { get { return InnerResult.CompletedSynchronously; } }
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/Builders/ClearCacheAspectBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,133 @@
+using System;
+using System.Reflection;
+using System.Reflection.Emit;
+
+using BLToolkit.Reflection.Emit;
+using BLToolkit.TypeBuilder.Builders;
+
+namespace BLToolkit.Aspects.Builders
+{
+	public class ClearCacheAspectBuilder : AbstractTypeBuilderBase
+	{
+		#region Init
+
+		public ClearCacheAspectBuilder(Type declaringType, string methodName, Type[] parameterTypes)
+		{
+			_declaringType  = declaringType;
+			_methodName     = methodName;
+			_parameterTypes = parameterTypes;
+		}
+
+		private readonly Type   _declaringType;
+		private readonly string _methodName;
+		private readonly Type[] _parameterTypes;
+
+		#endregion
+
+		#region Overrides
+
+		public override int GetPriority(BuildContext context)
+		{
+			return TypeBuilderConsts.Priority.ClearCacheAspect;
+		}
+
+		public override bool IsCompatible(BuildContext context, IAbstractTypeBuilder typeBuilder)
+		{
+			return true;
+		}
+
+		public override bool IsApplied(BuildContext context, AbstractTypeBuilderList builders)
+		{
+			if (context == null) throw new ArgumentNullException("context");
+
+			return context.IsFinallyStep && context.IsMethodOrProperty;
+		}
+
+		#endregion
+
+		#region Build
+
+		private static int _methodCounter;
+
+		public override void Build(BuildContext context)
+		{
+			Context = context;
+
+			if (string.IsNullOrEmpty(_methodName))
+			{
+				FieldBuilder type = Context.CreatePrivateStaticField(
+					"_type$ClearCacheAspect$" + ++_methodCounter, typeof(Type));
+
+				EmitHelper emit = Context.MethodBuilder.Emitter;
+				Label checkType = emit.DefineLabel();
+
+				emit
+					.ldsfld    (type)
+					.brtrue_s  (checkType)
+					.ldarg_0
+					.LoadType  (_declaringType)
+					.call      (typeof(ClearCacheAspect), "GetType", typeof(object), typeof(Type))
+					.stsfld    (type)
+					.MarkLabel (checkType)
+					.ldsfld    (type)
+					.call      (typeof(CacheAspect), "ClearCache", typeof(Type))
+					;
+			}
+			else
+			{
+				FieldBuilder methodInfo = Context.CreatePrivateStaticField(
+					"_methodInfo$ClearCacheAspect$" + ++_methodCounter, typeof(MethodInfo));
+
+				EmitHelper emit = Context.MethodBuilder.Emitter;
+
+				Label checkMethodInfo = emit.DefineLabel();
+
+				emit
+					.ldsfld   (methodInfo)
+					.brtrue_s (checkMethodInfo)
+					.ldarg_0
+					.LoadType (_declaringType)
+					.ldstrEx  (_methodName)
+					;
+
+				if (_parameterTypes == null || _parameterTypes.Length == 0)
+				{
+					emit.ldnull.end();
+				}
+				else
+				{
+					LocalBuilder field = emit.DeclareLocal(typeof(Type[]));
+
+					emit
+						.ldc_i4_ (_parameterTypes.Length)
+						.newarr  (typeof(Type))
+						.stloc   (field)
+						;
+
+					for (int i = 0; i < _parameterTypes.Length; i++)
+					{
+						emit
+							.ldloc      (field)
+							.ldc_i4     (i)
+							.LoadType   (_parameterTypes[i])
+							.stelem_ref
+							.end()
+							;
+					}
+
+					emit.ldloc(field);
+				}
+
+				emit
+					.call      (typeof(ClearCacheAspect), "GetMethodInfo", typeof(object), typeof(Type), typeof(string), typeof(Type[]))
+					.stsfld    (methodInfo)
+					.MarkLabel (checkMethodInfo)
+					.ldsfld    (methodInfo)
+					.call      (typeof(CacheAspect), "ClearCache", typeof(MethodInfo))
+					;
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/Builders/InterceptorAspectBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,341 @@
+using System;
+using System.Reflection;
+using System.Reflection.Emit;
+
+namespace BLToolkit.Aspects.Builders
+{
+	using Reflection;
+	using TypeBuilder.Builders;
+
+	public class InterceptorAspectBuilder : AbstractTypeBuilderBase
+	{
+		public InterceptorAspectBuilder(
+			Type interceptorType, InterceptType interceptType, string configString, int priority, bool localInterceptor)
+		{
+			_interceptorType  = interceptorType;
+			_interceptType    = interceptType;
+			_configString     = configString;
+			_priority         = priority;
+			_localInterceptor = localInterceptor;
+		}
+
+		private readonly Type          _interceptorType;
+		private readonly InterceptType _interceptType;
+		private readonly string        _configString;
+		private readonly int           _priority;
+		private readonly bool          _localInterceptor;
+
+		private          FieldBuilder  _interceptorField;
+		private          LocalBuilder  _infoField;
+
+		public override int GetPriority(BuildContext context)
+		{
+			return _priority;
+		}
+
+		public override bool IsApplied(BuildContext context, AbstractTypeBuilderList builders)
+		{
+			if (_interceptorType == null && _interceptType == 0)
+				return false;
+
+			foreach (var builder in builders)
+			{
+				var interceptor = builder as InterceptorAspectBuilder;
+
+				if (interceptor != null)
+				{
+					if (interceptor._interceptorType == null && interceptor._interceptType == 0)
+						return false;
+
+					if (builder == this)
+						break;
+				}
+			}
+
+			if (context.IsMethodOrProperty) switch (context.Step)
+			{
+				case BuildStep.Begin:   return true;
+				case BuildStep.Before:  return (_interceptType & InterceptType.BeforeCall) != 0;
+				case BuildStep.After:   return (_interceptType & InterceptType.AfterCall)  != 0;
+				case BuildStep.Catch:   return (_interceptType & InterceptType.OnCatch)    != 0;
+				case BuildStep.Finally: return (_interceptType & InterceptType.OnFinally)  != 0;
+				case BuildStep.End:     return true;
+			}
+
+			return false;
+		}
+
+		public override bool IsCompatible(BuildContext context, IAbstractTypeBuilder typeBuilder)
+		{
+			var builder = typeBuilder as InterceptorAspectBuilder;
+
+			return builder == null || _interceptorType != builder._interceptorType;
+		}
+
+		public override void Build(BuildContext context)
+		{
+			if (context.Step == BuildStep.Begin || context.Step == BuildStep.End)
+			{
+				base.Build(context);
+				return;
+			}
+
+			Context = context;
+
+			var emit = Context.MethodBuilder.Emitter;
+
+			// Push ref & out parameters.
+			//
+			var parameters = Context.CurrentMethod.GetParameters();
+
+			for (var i = 0; i < parameters.Length; i++)
+			{
+				var p = parameters[i];
+
+				if (!p.ParameterType.IsByRef)
+					continue;
+
+				emit
+					.ldloc      (_infoField)
+					.callvirt   (typeof(InterceptCallInfo).GetProperty("ParameterValues").GetGetMethod())
+					.ldc_i4     (i)
+					.ldargEx    (p, true)
+					.stelem_ref
+					.end()
+					;
+			}
+
+			// Push return value.
+			//
+			if (Context.ReturnValue != null)
+			{
+				emit
+					.ldloc          (_infoField)
+					.ldloc          (Context.ReturnValue)
+					.boxIfValueType (Context.CurrentMethod.ReturnType)
+					.callvirt       (typeof(InterceptCallInfo).GetProperty("ReturnValue").GetSetMethod())
+					;
+			}
+
+			// Set Exception.
+			//
+			if (Context.Step == BuildStep.Catch)
+			{
+				emit
+					.ldloc(_infoField)
+					.ldloc(Context.Exception)
+					.callvirt(typeof(InterceptCallInfo).GetProperty("Exception").GetSetMethod())
+					;
+			}
+
+			// Set intercept result.
+			//
+			emit
+				.ldloc    (_infoField)
+				.ldc_i4   ((int)InterceptResult.Continue)
+				.callvirt (typeof(InterceptCallInfo).GetProperty("InterceptResult").GetSetMethod())
+				;
+
+			// Set intercept type.
+			//
+			InterceptType interceptType;
+
+			switch (Context.Step)
+			{
+				case BuildStep.Before:  interceptType = InterceptType.BeforeCall; break;
+				case BuildStep.After:   interceptType = InterceptType.AfterCall;  break;
+				case BuildStep.Catch:   interceptType = InterceptType.OnCatch;    break;
+				case BuildStep.Finally: interceptType = InterceptType.OnFinally;  break;
+				default:
+					throw new InvalidOperationException();
+			}
+
+			emit
+				.ldloc    (_infoField)
+				.ldc_i4   ((int)interceptType)
+				.callvirt (typeof(InterceptCallInfo).GetProperty("InterceptType").GetSetMethod())
+
+			// Call interceptor.
+			//
+				.LoadField(_interceptorField)
+				.ldloc    (_infoField)
+				.callvirt (typeof(IInterceptor), "Intercept", typeof(InterceptCallInfo))
+				;
+
+			// Pop return value.
+			//
+			if (Context.ReturnValue != null)
+			{
+				emit
+					.ldloc          (_infoField)
+					.callvirt       (typeof(InterceptCallInfo).GetProperty("ReturnValue").GetGetMethod())
+					.CastFromObject (Context.CurrentMethod.ReturnType)
+					.stloc          (Context.ReturnValue)
+					;
+			}
+
+			// Pop ref & out parameters.
+			//
+			for (var i = 0; i < parameters.Length; i++)
+			{
+				var p = parameters[i];
+
+				if (!p.ParameterType.IsByRef)
+					continue;
+
+				var type = p.ParameterType.GetElementType();
+
+				emit
+					.ldarg          (p)
+					.ldloc          (_infoField)
+					.callvirt       (typeof(InterceptCallInfo).GetProperty("ParameterValues").GetGetMethod())
+					.ldc_i4         (i)
+					.ldelem_ref
+					.CastFromObject (type)
+					.stind          (type)
+					;
+			}
+
+			// Check InterceptResult
+			emit
+				.ldloc    (_infoField)
+				.callvirt (typeof(InterceptCallInfo).GetProperty("InterceptResult").GetGetMethod())
+				.ldc_i4   ((int)InterceptResult.Return)
+				.beq      (Context.ReturnLabel)
+				;
+		}
+
+		private static int _methodCounter;
+
+		private LocalBuilder GetInfoField()
+		{
+			var field = Context.GetItem<LocalBuilder>("$BLToolkit.InfoField");
+
+			if (field == null)
+			{
+				_methodCounter++;
+
+				// Create MethodInfo field.
+				//
+				var methodInfo = Context.CreatePrivateStaticField(
+					"_methodInfo$" + Context.CurrentMethod.Name + _methodCounter, typeof(CallMethodInfo));
+
+				var emit = Context.MethodBuilder.Emitter;
+
+				var checkMethodInfo = emit.DefineLabel();
+
+				emit
+					.LoadField (methodInfo)
+					.brtrue_s  (checkMethodInfo)
+					.call      (typeof(MethodBase), "GetCurrentMethod")
+					.castclass (typeof(MethodInfo))
+					.newobj    (TypeHelper.GetConstructor(typeof(CallMethodInfo), typeof(MethodInfo)))
+					.stsfld    (methodInfo)
+					.MarkLabel (checkMethodInfo)
+					;
+
+				// Create & initialize the field.
+				//
+				field = emit.DeclareLocal(typeof(InterceptCallInfo));
+
+				emit
+					.newobj   (TypeHelper.GetDefaultConstructor(typeof(InterceptCallInfo)))
+					.dup
+					.ldarg_0
+					.callvirt (typeof(InterceptCallInfo).GetProperty("Object").GetSetMethod())
+
+					.dup
+					.LoadField(methodInfo)
+					.callvirt (typeof(InterceptCallInfo).GetProperty("CallMethodInfo").GetSetMethod())
+					;
+
+				var parameters = Context.CurrentMethod.GetParameters();
+
+				for (var i = 0; i < parameters.Length; i++)
+				{
+					var p = parameters[i];
+
+					if (p.ParameterType.IsByRef)
+						continue;
+
+					emit
+						.dup
+						.callvirt   (typeof(InterceptCallInfo).GetProperty("ParameterValues").GetGetMethod())
+						.ldc_i4     (i)
+						.ldargEx    (p, true)
+						.stelem_ref
+						.end()
+						;
+				}
+
+				emit.stloc(field);
+
+				Context.Items.Add("$BLToolkit.MethodInfo", methodInfo);
+				Context.Items.Add("$BLToolkit.InfoField",  field);
+			}
+
+			return field;
+		}
+
+		private FieldBuilder GetInterceptorField()
+		{
+			var fieldName = "_interceptor$" + _interceptorType.FullName + "$_" + Context.CurrentMethod.Name + _methodCounter;
+			var field     = Context.GetField(fieldName);
+
+			if (field == null)
+			{
+				// Create MethodInfo field.
+				//
+				field = _localInterceptor? 
+					Context.CreatePrivateField      (fieldName, typeof(IInterceptor)):
+					Context.CreatePrivateStaticField(fieldName, typeof(IInterceptor));
+
+				var emit = Context.MethodBuilder.Emitter;
+
+				var checkInterceptor = emit.DefineLabel();
+				var methodInfo       = Context.GetItem<FieldBuilder>("$BLToolkit.MethodInfo");
+
+				emit
+					.LoadField (field)
+					.brtrue_s  (checkInterceptor)
+					;
+
+					if (!field.IsStatic)
+						emit.ldarg_0.end();
+
+				emit
+					.newobj    (TypeHelper.GetDefaultConstructor(_interceptorType))
+					.castclass (typeof(IInterceptor))
+					;
+
+				if (field.IsStatic)
+					emit.stsfld(field);
+				else
+					emit.stfld(field);
+
+				emit
+					.LoadField (field)
+					.LoadField (methodInfo)
+					.ldstrEx   (_configString ?? "")
+					.callvirt  (typeof(IInterceptor), "Init", typeof(CallMethodInfo), typeof(string))
+
+					.MarkLabel (checkInterceptor)
+					;
+			}
+
+			return field;
+		}
+
+		protected override void BeginMethodBuild()
+		{
+			_infoField        = GetInfoField();
+			_interceptorField = GetInterceptorField();
+		}
+
+		protected override void EndMethodBuild()
+		{
+			Context.Items.Remove("$BLToolkit.MethodInfo");
+			Context.Items.Remove("$BLToolkit.InfoField");
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/Builders/MixinAspectBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,210 @@
+using System;
+using System.Reflection;
+using System.Reflection.Emit;
+
+using BLToolkit.TypeBuilder.Builders;
+using BLToolkit.Reflection.Emit;
+using BLToolkit.TypeBuilder;
+
+namespace BLToolkit.Aspects.Builders
+{
+	public class MixinAspectBuilder : AbstractTypeBuilderBase
+	{
+		public MixinAspectBuilder(
+			Type targetInterface, string memberName, bool throwExceptionIfNull, string exceptionMessage)
+		{
+			_targetInterface      = targetInterface;
+			_memberName           = memberName;
+			_throwExceptionIfNull = throwExceptionIfNull;
+			_exceptionMessage     = exceptionMessage;
+		}
+
+		private readonly Type   _targetInterface;
+		private readonly string _memberName;
+		private readonly bool   _throwExceptionIfNull;
+		private readonly string _exceptionMessage;
+
+		public override bool IsApplied(BuildContext context, AbstractTypeBuilderList builders)
+		{
+			return context.BuildElement == BuildElement.InterfaceMethod;
+		}
+
+		public override Type[] GetInterfaces()
+		{
+			return new Type[] { _targetInterface };
+		}
+
+		public override void Build(BuildContext context)
+		{
+			Context = context;
+
+			if (CheckOverrideAttribute())
+				return;
+
+			EmitHelper      emit   = Context.MethodBuilder.Emitter;
+			MethodInfo      method = Context.MethodBuilder.OverriddenMethod;
+			ParameterInfo[] ps     = method.GetParameters();
+			Type            memberType;
+
+			FieldInfo field = Context.Type.GetField(_memberName);
+
+			if (field != null)
+			{
+				if (field.IsPrivate)
+					throw new TypeBuilderException(string.Format(
+						"Field '{0}.{1}' must be protected or public.",
+						Context.Type.Name, _memberName));
+
+				memberType = field.FieldType;
+
+				emit
+					.ldarg_0
+					.ldfld   (field)
+					;
+
+				CheckNull(emit);
+
+				emit
+					.ldarg_0
+					.ldfld   (field)
+					;
+			}
+			else
+			{
+				PropertyInfo prop = Context.Type.GetProperty(_memberName);
+
+				if (prop != null)
+				{
+					MethodInfo mi = prop.GetGetMethod(true);
+
+					if (mi == null)
+						throw new TypeBuilderException(string.Format(
+							"Property '{0}.{1}' getter not found.",
+							Context.Type.Name, _memberName));
+
+					memberType = prop.PropertyType;
+
+					if (mi.IsPrivate)
+						throw new TypeBuilderException(string.Format(
+							"Property '{0}.{1}' getter must be protected or public.",
+							Context.Type.Name, _memberName));
+
+					emit
+						.ldarg_0
+						.callvirt (mi)
+						;
+
+					CheckNull(emit);
+
+					emit
+						.ldarg_0
+						.callvirt (mi)
+						;
+				}
+				else
+				{
+					throw new TypeBuilderException(string.Format(
+						"Member '{0}.{1}' not found.",
+						Context.Type.Name, _memberName));
+				}
+			}
+
+			emit.CastIfNecessary(_targetInterface, memberType);
+
+			for (int i = 0; i < ps.Length; i++)
+				emit.ldarg(i + 1);
+
+			emit.callvirt(method);
+
+			if (Context.ReturnValue != null)
+				emit.stloc(Context.ReturnValue);
+		}
+
+		private void CheckNull(EmitHelper emit)
+		{
+			if (_throwExceptionIfNull == false && string.IsNullOrEmpty(_exceptionMessage))
+			{
+				emit
+					.brfalse (Context.ReturnLabel)
+					;
+			}
+			else
+			{
+				string message = string.Format(
+					string.IsNullOrEmpty(_exceptionMessage)?
+						"'{0}.{1}' is not initialized." : _exceptionMessage,
+					_targetInterface.Name, _memberName, _targetInterface.FullName);
+
+				Label label = emit.DefineLabel();
+
+				emit
+					.brtrue    (label)
+					.ldstr     (message)
+					.newobj    (typeof(InvalidOperationException), typeof(string))
+					.@throw
+					.MarkLabel (label)
+					;
+			}
+		}
+
+		private bool CheckOverrideAttribute()
+		{
+			MethodInfo      method = Context.MethodBuilder.OverriddenMethod;
+			ParameterInfo[] ps     = method.GetParameters();
+
+			MethodInfo[] methods = Context.Type.GetMethods(
+				BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
+
+			foreach (MethodInfo mi in methods)
+			{
+				if (mi.IsPrivate)
+					continue;
+
+				object[] attrs = mi.GetCustomAttributes(typeof(MixinOverrideAttribute), true);
+
+				if (attrs == null || attrs.Length == 0)
+					continue;
+
+				foreach (MixinOverrideAttribute attr in attrs)
+				{
+					if (attr.TargetInterface != null &&
+						attr.TargetInterface != Context.CurrentInterface.Type)
+						continue;
+
+					string name = string.IsNullOrEmpty(attr.MethodName)?
+						mi.Name: attr.MethodName;
+
+					if (name != method.Name || mi.ReturnType != method.ReturnType)
+						continue;
+
+					ParameterInfo[] mips = mi.GetParameters();
+
+					if (mips.Length != ps.Length)
+						continue;
+
+					bool equal = true;
+
+					for (int i = 0; equal && i < ps.Length; i++)
+						equal = ps[i].ParameterType == mips[i].ParameterType;
+
+					if (equal)
+					{
+						EmitHelper emit = Context.MethodBuilder.Emitter;
+
+						for (int i = -1; i < ps.Length; i++)
+							emit.ldarg(i + 1);
+
+						emit.callvirt(mi);
+
+						if (Context.ReturnValue != null)
+							emit.stloc(Context.ReturnValue);
+
+						return true;
+					}
+				}
+			}
+
+			return false;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/Builders/NotNullAspectBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,72 @@
+using System;
+using System.Reflection;
+using System.Reflection.Emit;
+
+using BLToolkit.Reflection.Emit;
+using BLToolkit.TypeBuilder.Builders;
+
+namespace BLToolkit.Aspects.Builders
+{
+	public class NotNullAspectBuilder : AbstractTypeBuilderBase
+	{
+		public NotNullAspectBuilder(string message)
+		{
+			_message = message;
+		}
+
+		private readonly string _message;
+
+		public override int GetPriority(BuildContext context)
+		{
+			return TypeBuilderConsts.Priority.NotNullAspect;
+		}
+
+		public override bool IsApplied(BuildContext context, AbstractTypeBuilderList builders)
+		{
+			if (context == null) throw new ArgumentNullException("context");
+
+			return context.IsBeforeStep && context.BuildElement != BuildElement.Type;
+		}
+
+		public override void Build(BuildContext context)
+		{
+			if (context == null) throw new ArgumentNullException("context");
+
+			ParameterInfo pi = (ParameterInfo)TargetElement;
+
+			if (pi.ParameterType.IsValueType == false)
+			{
+				EmitHelper emit  = context.MethodBuilder.Emitter;
+				Label      label = emit.DefineLabel();
+
+				string message = _message != null? string.Format(_message, pi.Name): string.Empty;
+
+				emit
+					.ldarg    (pi)
+					.brtrue_s (label)
+					;
+
+				if (string.IsNullOrEmpty(message))
+				{
+					emit
+						.ldstr  (pi.Name)
+						.newobj (typeof(ArgumentNullException), typeof(string))
+						;
+				}
+				else
+				{
+					emit
+						.ldnull
+						.ldstr  (message)
+						.newobj (typeof(ArgumentNullException), typeof(string), typeof(string))
+						;
+				}
+
+				emit
+					.@throw
+					.MarkLabel (label)
+					;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/Builders/OverloadAspectBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,219 @@
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Reflection.Emit;
+
+using BLToolkit.Properties;
+using BLToolkit.Reflection;
+using BLToolkit.Reflection.Emit;
+using BLToolkit.TypeBuilder;
+using BLToolkit.TypeBuilder.Builders;
+
+namespace BLToolkit.Aspects.Builders
+{
+	public class OverloadAspectBuilder: AbstractTypeBuilderBase
+	{
+		private readonly string _overloadedMethodName;
+		private readonly Type[] _parameterTypes;
+
+		public OverloadAspectBuilder(string overloadedMethodName, Type[] parameterTypes)
+		{
+			_overloadedMethodName = overloadedMethodName;
+			_parameterTypes       = parameterTypes;
+		}
+
+		public override int GetPriority(BuildContext context)
+		{
+			return TypeBuilderConsts.Priority.OverloadAspect;
+		}
+
+		public override bool IsCompatible(BuildContext context, IAbstractTypeBuilder typeBuilder)
+		{
+			if (context.IsBuildStep)
+				return false;
+
+			AbstractTypeBuilderList list = new AbstractTypeBuilderList(2);
+
+			list.Add(this);
+			list.Add(typeBuilder);
+
+			BuildStep step = context.Step;
+
+			try
+			{
+				context.Step = BuildStep.Build;
+
+				return typeBuilder.IsApplied(context, list);
+			}
+			finally
+			{
+				context.Step = step;
+			}
+		}
+
+		public override bool IsApplied(BuildContext context, AbstractTypeBuilderList builders)
+		{
+			if (context == null) throw new ArgumentNullException("context");
+
+			return context.IsBuildStep && context.BuildElement == BuildElement.AbstractMethod;
+		}
+
+		protected override void BuildAbstractMethod()
+		{
+			MethodInfo    currentMethod = Context.CurrentMethod;
+			string           methodName = _overloadedMethodName ?? currentMethod.Name;
+			MethodInfo overloadedMethod = GetOverloadedMethod(methodName);
+
+			if (overloadedMethod == null)
+			{
+				throw new TypeBuilderException(string.Format(
+					Resources.OverloadAspectBuilder_NoOverloadedMethod,
+						Context.Type.FullName, methodName));
+			}
+
+			EmitHelper                emit = Context.MethodBuilder.Emitter;
+			List<ParameterInfo> parameters = new List<ParameterInfo>(currentMethod.GetParameters());
+
+			if (!overloadedMethod.IsStatic)
+				emit.ldarg_0.end();
+
+			foreach (ParameterInfo param in overloadedMethod.GetParameters())
+			{
+				ParameterInfo currentMethodParameter = null;
+				foreach (ParameterInfo p in parameters)
+				{
+					if (p.Name != param.Name)
+						continue;
+
+					currentMethodParameter = p;
+					parameters.Remove(p);
+					break;
+				}
+
+				if (currentMethodParameter != null)
+				{
+					emit.ldarg(currentMethodParameter);
+				}
+				else
+				{
+					Type type  = param.ParameterType;
+					bool isRef = false;
+
+					if (type.IsByRef)
+					{
+						type  = type.GetElementType();
+						isRef = true;
+					}
+
+					if (type.IsValueType && !type.IsPrimitive)
+					{
+						LocalBuilder localBuilder = emit.DeclareLocal(type);
+
+						emit
+							.ldloca      (localBuilder)
+							.initobj     (type)
+							;
+
+						if (isRef)
+							emit.ldloca  (localBuilder);
+						else
+							emit.ldloc   (localBuilder);
+
+					}
+					else
+					{
+						if ((param.Attributes & ParameterAttributes.HasDefault) == 0 ||
+							!emit.LoadWellKnownValue(param.DefaultValue))
+						{
+							emit.LoadInitValue(type);
+						}
+
+						if (isRef)
+						{
+							LocalBuilder localBuilder = emit.DeclareLocal(type);
+
+							emit
+								.stloc   (localBuilder)
+								.ldloca  (localBuilder)
+								;
+						}
+					}
+				}
+			}
+
+			// Finally, call the method we override.
+			//
+			if (overloadedMethod.IsStatic || overloadedMethod.IsFinal)
+				emit.call      (overloadedMethod);
+			else
+				emit.callvirt  (overloadedMethod);
+
+			if (currentMethod.ReturnType != typeof(void))
+				emit.stloc(Context.ReturnValue);
+		}
+
+		private MethodInfo GetOverloadedMethod(string methodName)
+		{
+			MethodInfo      currentMethod            = Context.CurrentMethod;
+			MethodInfo      bestMatch                = null;
+			int             bestMatchParametersCount = -1;
+			ParameterInfo[] currentMethodParameters  = currentMethod.GetParameters();
+
+			if (_parameterTypes != null)
+			{
+				bestMatch = Context.Type.GetMethod(methodName, _parameterTypes);
+				return bestMatch != null && MatchParameters(currentMethodParameters, bestMatch.GetParameters()) >= 0? bestMatch: null;
+			}
+
+			const BindingFlags bindingFlags = BindingFlags.Static | BindingFlags.Instance| BindingFlags.Public | BindingFlags.NonPublic;
+
+			foreach (MethodInfo m in Context.Type.GetMethods(bindingFlags))
+			{
+				if (m.IsPrivate || m.Name != methodName || m.IsGenericMethod != currentMethod.IsGenericMethod)
+					continue;
+
+				if (!TypeHelper.CompareParameterTypes(m.ReturnType, currentMethod.ReturnType))
+					continue;
+
+				if (m.IsDefined(typeof(OverloadAttribute), true))
+					continue;
+
+				ParameterInfo[] overloadedMethodParameters = m.GetParameters();
+				if (overloadedMethodParameters.Length <= bestMatchParametersCount)
+					continue;
+
+				int matchedParameters = MatchParameters(overloadedMethodParameters, currentMethodParameters);
+				if (matchedParameters <= bestMatchParametersCount)
+					continue;
+
+				bestMatchParametersCount = matchedParameters;
+				bestMatch                = m;
+			}
+
+			return bestMatch;
+		}
+
+		private static int MatchParameters(ParameterInfo[] parametersToMatch, ParameterInfo[] existingParameters)
+		{
+			int matchedParameters = 0;
+			List<ParameterInfo> existingParametersList = new List<ParameterInfo>(existingParameters);
+			foreach (ParameterInfo param in parametersToMatch)
+			{
+				foreach (ParameterInfo existing in existingParametersList)
+				{
+					if (existing.Name != param.Name)
+						continue;
+
+					if (!TypeHelper.CompareParameterTypes(param.ParameterType, existing.ParameterType))
+						return -1;
+
+					++matchedParameters;
+					existingParametersList.Remove(existing);
+					break;
+				}
+			}
+
+			return matchedParameters;
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/CacheAspect.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,535 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Threading;
+
+namespace BLToolkit.Aspects
+{
+	using Common;
+
+	public delegate bool IsCacheableParameterType(Type parameterType);
+
+	/// <summary>
+	/// http://www.bltoolkit.net/Doc/Aspects/index.htm
+	/// </summary>
+	[System.Diagnostics.DebuggerStepThrough]
+	public class CacheAspect : Interceptor
+	{
+		#region Init
+
+		static CacheAspect()
+		{
+			MaxCacheTime = int.MaxValue;
+			IsEnabled    = true;
+
+			CleanupThread.Init();
+		}
+
+		public CacheAspect()
+		{
+			_registeredAspects.Add(this);
+		}
+
+		private MethodInfo _methodInfo;
+		private int?       _instanceMaxCacheTime;
+		private bool?      _instanceIsWeak;
+
+		public override void Init(CallMethodInfo info, string configString)
+		{
+ 			base.Init(info, configString);
+
+			info.CacheAspect = this;
+
+			_methodInfo = info.MethodInfo;
+
+			var ps = configString.Split(';');
+
+			foreach (var p in ps)
+			{
+				var vs = p.Split('=');
+
+				if (vs.Length == 2)
+				{
+					switch (vs[0].ToLower().Trim())
+					{
+						case "maxcachetime": _instanceMaxCacheTime = int. Parse(vs[1].Trim()); break;
+						case "isweak":       _instanceIsWeak       = bool.Parse(vs[1].Trim()); break;
+					}
+				}
+			}
+		}
+
+		private static readonly IList _registeredAspects = ArrayList.Synchronized(new ArrayList());
+		protected static          IList  RegisteredAspects
+		{
+			get { return _registeredAspects; }
+		}
+
+		public static CacheAspect GetAspect(MethodInfo methodInfo)
+		{
+			lock (RegisteredAspects.SyncRoot)
+				foreach (CacheAspect aspect in RegisteredAspects)
+					if (aspect._methodInfo == methodInfo)
+						return aspect;
+
+			return null;
+		}
+
+		#endregion
+
+		#region Overrides
+
+		protected override void BeforeCall(InterceptCallInfo info)
+		{
+			if (!IsEnabled)
+				return;
+
+			var cache = Cache;
+
+			lock (cache.SyncRoot)
+			{
+				var key  = GetKey(info);
+				var item = GetItem(cache, key);
+
+				if (item != null && !item.IsExpired)
+				{
+					info.InterceptResult = InterceptResult.Return;
+					info.ReturnValue     = item.ReturnValue;
+
+					if (item.RefValues != null)
+					{
+						var pis = info.CallMethodInfo.Parameters;
+						var n   = 0;
+
+						for (var i = 0; i < pis.Length; i++)
+							if (pis[i].ParameterType.IsByRef)
+								info.ParameterValues[i] = item.RefValues[n++];
+					}
+
+					info.Cached = true;
+				}
+				else 
+				{
+					info.Items["CacheKey"] = key;
+				}
+			}
+		}
+
+		protected override void AfterCall(InterceptCallInfo info)
+		{
+			if (!IsEnabled)
+				return;
+
+			var cache = Cache;
+
+			lock (cache.SyncRoot)
+			{
+				var key = (CompoundValue)info.Items["CacheKey"];
+
+				if (key == null)
+					return;
+
+				var maxCacheTime = _instanceMaxCacheTime ?? MaxCacheTime;
+				var isWeak       = _instanceIsWeak       ?? IsWeak;
+
+				var item = new CacheAspectItem
+				{
+					ReturnValue = info.ReturnValue,
+					MaxCacheTime = maxCacheTime == int.MaxValue || maxCacheTime < 0 ?
+						DateTime.MaxValue :
+						DateTime.Now.AddMilliseconds(maxCacheTime),
+				};
+
+				var pis = info.CallMethodInfo.Parameters;
+				var n   = 0;
+
+				foreach (var pi in pis)
+					if (pi.ParameterType.IsByRef)
+						n++;
+
+				if (n > 0)
+				{
+					item.RefValues = new object[n];
+
+					n = 0;
+
+					for (var i = 0; i < pis.Length; i++)
+						if (pis[i].ParameterType.IsByRef)
+							item.RefValues[n++] = info.ParameterValues[i];
+				}
+
+				cache[key] = isWeak? (object)new WeakReference(item): item;
+			}
+		}
+
+		#endregion
+
+		#region Global Parameters
+
+		public static bool IsEnabled    { get; set; }
+		public static int  MaxCacheTime { get; set; }
+		public static bool IsWeak       { get; set; }
+
+		#endregion
+
+		#region IsCacheableParameterType
+
+		private static IsCacheableParameterType _isCacheableParameterType =
+			IsCacheableParameterTypeInternal;
+
+		public  static IsCacheableParameterType  IsCacheableParameterType
+		{
+			get { return _isCacheableParameterType; }
+			set { _isCacheableParameterType = value ?? IsCacheableParameterTypeInternal; }
+		}
+
+		private static bool IsCacheableParameterTypeInternal(Type parameterType)
+		{
+			return parameterType.IsValueType || parameterType == typeof(string);
+		}
+
+		#endregion
+
+		#region Cache
+
+		private IDictionary _cache;
+		public  IDictionary  Cache
+		{
+			get { return _cache ?? (_cache = CreateCache()); }
+		}
+
+		protected virtual CacheAspectItem CreateCacheItem(InterceptCallInfo info)
+		{
+			return new CacheAspectItem();
+		}
+
+		protected virtual IDictionary CreateCache()
+		{
+			return Hashtable.Synchronized(new Hashtable());
+		}
+
+		protected static CompoundValue GetKey(InterceptCallInfo info)
+		{
+			var parInfo     = info.CallMethodInfo.Parameters;
+			var parValues   = info.ParameterValues;
+			var keyValues   = new object[parValues.Length];
+			var cacheParams = info.CallMethodInfo.CacheableParameters;
+
+			if (cacheParams == null)
+			{
+				info.CallMethodInfo.CacheableParameters = cacheParams = new bool[parInfo.Length];
+
+				for (var i = 0; i < parInfo.Length; i++)
+					cacheParams[i] = IsCacheableParameterType(parInfo[i].ParameterType);
+			}
+
+			for (var i = 0; i < parValues.Length; i++)
+				keyValues[i] = cacheParams[i] ? parValues[i] : null;
+
+			return new CompoundValue(keyValues);
+		}
+
+		protected static CacheAspectItem GetItem(IDictionary cache, CompoundValue key)
+		{
+			var obj = cache[key];
+
+			if (obj == null)
+				return null;
+
+			var wr = obj as WeakReference;
+
+			if (wr == null)
+				return (CacheAspectItem)obj;
+
+			obj = wr.Target;
+
+			if (obj != null)
+				return (CacheAspectItem)obj;
+
+			cache.Remove(key);
+
+			return null;
+		}
+
+		/// <summary>
+		/// Clear a method call cache.
+		/// </summary>
+		/// <param name="methodInfo">The <see cref="MethodInfo"/> representing cached method.</param>
+		public static void ClearCache(MethodInfo methodInfo)
+		{
+			if (methodInfo == null)
+				throw new ArgumentNullException("methodInfo");
+
+			var aspect = GetAspect(methodInfo);
+
+			if (aspect != null)
+				CleanupThread.ClearCache(aspect.Cache);
+		}
+
+		/// <summary>
+		/// Clear a method call cache.
+		/// </summary>
+		/// <param name="declaringType">The method declaring type.</param>
+		/// <param name="methodName">The method name.</param>
+		/// <param name="types">An array of <see cref="System.Type"/> objects representing
+		/// the number, order, and type of the parameters for the method to get.-or-
+		/// An empty array of the type <see cref="System.Type"/> (for example, <see cref="System.Type.EmptyTypes"/>)
+		/// to get a method that takes no parameters.</param>
+		public static void ClearCache(Type declaringType, string methodName, params Type[] types)
+		{
+			ClearCache(GetMethodInfo(declaringType, methodName, types));
+		}
+
+		/// <summary>
+		/// Clear a method call cache.
+		/// </summary>
+		/// <param name="declaringType">The method declaring type.</param>
+		/// <param name="methodName">The method name.</param>
+		/// <param name="types">An array of <see cref="System.Type"/> objects representing
+		/// the number, order, and type of the parameters for the method to get.-or-
+		/// An empty array of the type <see cref="System.Type"/> (for example, <see cref="System.Type.EmptyTypes"/>)
+		/// to get a method that takes no parameters.</param>
+		/// <param name="values">An array of values of the parameters for the method to get</param>
+		public static void ClearCache(Type declaringType, string methodName, Type[] types, object[] values)
+		{
+			var methodInfo = GetMethodInfo(declaringType, methodName, types);
+
+			if (methodInfo == null)
+				throw new ArgumentNullException("methodInfo");
+
+			var aspect = GetAspect(methodInfo);
+
+			if (aspect != null)
+				CleanupThread.ClearCache(aspect.Cache, new CompoundValue(values));
+		}
+
+		public static void ClearCache(Type declaringType)
+		{
+			if (declaringType == null)
+				throw new ArgumentNullException("declaringType");
+
+			if (declaringType.IsAbstract)
+				declaringType = TypeBuilder.TypeFactory.GetType(declaringType);
+
+			lock (RegisteredAspects.SyncRoot)
+				foreach (CacheAspect aspect in RegisteredAspects)
+					if (aspect._methodInfo.DeclaringType == declaringType)
+						CleanupThread.ClearCache(aspect.Cache);
+		}
+
+		public static MethodInfo GetMethodInfo(Type declaringType, string methodName, params Type[] parameterTypes)
+		{
+			if (declaringType == null)
+				throw new ArgumentNullException("declaringType");
+
+			if (declaringType.IsAbstract)
+				declaringType = TypeBuilder.TypeFactory.GetType(declaringType);
+
+			if (parameterTypes == null)
+				parameterTypes = Type.EmptyTypes;
+
+			var methodInfo = declaringType.GetMethod(
+				methodName,
+				BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
+				null,
+				parameterTypes,
+				null);
+
+			if (methodInfo == null)
+			{
+				methodInfo = declaringType.GetMethod(
+					methodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
+
+				if (methodInfo == null)
+					throw new ArgumentException(string.Format("Method '{0}.{1}' not found.",
+						declaringType.FullName, methodName));
+			}
+
+			return methodInfo;
+		}
+
+		/// <summary>
+		/// Clear all cached method calls.
+		/// </summary>
+		public static void ClearCache()
+		{
+			CleanupThread.ClearCache();
+		}
+
+		#endregion
+
+		#region Cleanup Thread
+
+		public class CleanupThread
+		{
+			private CleanupThread() {}
+
+			internal static void Init()
+			{
+				AppDomain.CurrentDomain.DomainUnload += CurrentDomain_DomainUnload;
+				Start();
+			}
+
+			static void CurrentDomain_DomainUnload(object sender, EventArgs e)
+			{
+				Stop();
+			}
+
+			static volatile Timer  _timer;
+			static readonly object _syncTimer = new object();
+
+			private static void Start()
+			{
+				if (_timer == null)
+					lock (_syncTimer)
+						if (_timer == null)
+						{
+							var interval = TimeSpan.FromSeconds(10);
+							_timer = new Timer(Cleanup, null, interval, interval);
+						}
+			}
+
+			private static void Stop()
+			{
+				if (_timer != null)
+					lock (_syncTimer)
+						if (_timer != null)
+						{
+							_timer.Dispose();
+							_timer = null;
+						}
+			}
+
+			private static void Cleanup(object state)
+			{
+				if (!Monitor.TryEnter(RegisteredAspects.SyncRoot, 10))
+				{
+					// The Cache is busy, skip this turn.
+					//
+					return;
+				}
+
+				var start          = DateTime.Now;
+				var objectsInCache = 0;
+
+				try
+				{
+					_workTimes++;
+
+					var list = new List<DictionaryEntry>();
+
+					foreach (CacheAspect aspect in RegisteredAspects)
+					{
+						var cache = aspect.Cache;
+
+						lock (cache.SyncRoot)
+						{
+							foreach (DictionaryEntry de in cache)
+							{
+								var wr = de.Value as WeakReference;
+
+								bool isExpired;
+
+								if (wr != null)
+								{
+									var ca = wr.Target as CacheAspectItem;
+
+									isExpired = ca == null || ca.IsExpired;
+								}
+								else
+								{
+									isExpired = ((CacheAspectItem)de.Value).IsExpired;
+								}
+
+								if (isExpired)
+									list.Add(de);
+							}
+
+							foreach (var de in list)
+							{
+								cache.Remove(de.Key);
+								_objectsExpired++;
+							}
+
+							list.Clear();
+
+							objectsInCache += cache.Count;
+						}
+					}
+
+					_objectsInCache = objectsInCache;
+				}
+				finally
+				{
+					_workTime += DateTime.Now - start;
+
+					Monitor.Exit(RegisteredAspects.SyncRoot);
+				}
+			}
+
+			private static int _workTimes;
+			public  static int  WorkTimes
+			{
+				get { return _workTimes; }
+			}
+
+			private static TimeSpan _workTime;
+			public  static TimeSpan  WorkTime
+			{
+				get { return _workTime; }
+			}
+
+			private static int _objectsExpired;
+			public  static int  ObjectsExpired
+			{
+				get { return _objectsExpired; }
+			}
+
+			private static int _objectsInCache;
+			public  static int  ObjectsInCache
+			{
+				get { return _objectsInCache; }
+			}
+
+			public static void UnregisterCache(IDictionary cache)
+			{
+				lock (RegisteredAspects.SyncRoot)
+					RegisteredAspects.Remove(cache);
+			}
+
+			public static void ClearCache(IDictionary cache)
+			{
+				lock (RegisteredAspects.SyncRoot) lock (cache.SyncRoot)
+				{
+					_objectsExpired += cache.Count;
+					cache.Clear();
+				}
+			}
+
+			public static void ClearCache(IDictionary cache, CompoundValue key)
+			{
+				lock (RegisteredAspects.SyncRoot)
+					lock (cache.SyncRoot)
+					{
+						_objectsExpired += 1;
+						cache.Remove(key);
+					}
+			}
+
+			public static void ClearCache()
+			{
+				lock (RegisteredAspects.SyncRoot)
+				{
+					foreach (CacheAspect aspect in RegisteredAspects)
+					{
+						_objectsExpired += aspect.Cache.Count;
+						aspect.Cache.Clear();
+					}
+				}
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/CacheAspectItem.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,33 @@
+using System;
+
+namespace BLToolkit.Aspects
+{
+	public class CacheAspectItem
+	{
+		private        DateTime _maxCacheTime;
+		public virtual DateTime  MaxCacheTime
+		{
+			get { return _maxCacheTime;  }
+			set { _maxCacheTime = value; }
+		}
+
+		private object _returnValue;
+		public  object  ReturnValue
+		{
+			get { return _returnValue;  }
+			set { _returnValue = value; }
+		}
+
+		private object[] _refValues;
+		public  object[]  RefValues
+		{
+			get { return _refValues;  }
+			set { _refValues = value; }
+		}
+
+		public virtual bool IsExpired
+		{
+			get { return _maxCacheTime <= DateTime.Now; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/CacheAspectT.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+using System;
+
+namespace BLToolkit.Aspects
+{
+	/// <summary>
+	/// http://www.bltoolkit.net/Doc/Aspects/index.htm
+	/// </summary>
+	[Obsolete]
+	public class CacheAspect<T> : CacheAspect
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/CacheAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,131 @@
+using System;
+using BLToolkit.Properties;
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder.Builders;
+
+namespace BLToolkit.Aspects
+{
+	/// <summary>
+	/// http://www.bltoolkit.net/Doc/Aspects/index.htm
+	/// </summary>
+	[AttributeUsage(
+		AttributeTargets.Class |
+		AttributeTargets.Interface |
+		AttributeTargets.Property |
+		AttributeTargets.Method,
+		AllowMultiple=true)]
+	public class CacheAttribute : InterceptorAttribute
+	{
+		#region Constructors
+
+		public CacheAttribute()
+			: this(typeof(CacheAspect), null)
+		{
+		}
+
+		public CacheAttribute(Type cacheAspectType, string configString)
+			: base(
+				cacheAspectType,
+				InterceptType.BeforeCall | InterceptType.AfterCall,
+				configString,
+				TypeBuilderConsts.Priority.CacheAspect)
+		{
+			if (!TypeHelper.IsSameOrParent(typeof(CacheAspect), cacheAspectType))
+				throw new ArgumentException(Resources.CacheAttribute_ParentTypeConstraintViolated);
+		}
+
+		public CacheAttribute(Type interceptorType)
+			: this(interceptorType, null)
+		{
+		}
+
+		public CacheAttribute(Type interceptorType, int maxCacheTime)
+			: this(interceptorType, null)
+		{
+			MaxCacheTime = maxCacheTime;
+		}
+
+		public CacheAttribute(Type interceptorType, bool isWeak)
+			: this(interceptorType, null)
+		{
+			IsWeak = isWeak;
+		}
+
+		public CacheAttribute(Type interceptorType, int maxCacheTime, bool isWeak)
+			: this(interceptorType, null)
+		{
+			MaxCacheTime = maxCacheTime;
+			IsWeak       = isWeak;
+		}
+
+		public CacheAttribute(string configString)
+			: this(typeof(CacheAspect), configString)
+		{
+		}
+
+		public CacheAttribute(int maxCacheTime)
+			: this(typeof(CacheAspect), maxCacheTime)
+		{
+		}
+
+		public CacheAttribute(bool isWeak)
+			: this(typeof(CacheAspect), isWeak)
+		{
+		}
+
+		public CacheAttribute(int maxCacheTime, bool isWeak)
+			: this(typeof(CacheAspect), maxCacheTime, isWeak)
+		{
+		}
+
+		#endregion
+
+		#region Properties
+
+		private bool _hasMaxCacheTime;
+		private int  _maxCacheTime;
+		public  int   MaxCacheTime
+		{
+			get { return _maxCacheTime; }
+			set { _maxCacheTime = value; _hasMaxCacheTime = true; }
+		}
+
+		public  int   MaxSeconds
+		{
+			get { return MaxCacheTime / 1000;  }
+			set { MaxCacheTime = value * 1000; }
+		}
+
+		public  int   MaxMinutes
+		{
+			get { return MaxCacheTime / 60 / 1000;  }
+			set { MaxCacheTime = value * 60 * 1000; }
+		}
+
+		private bool _hasIsWeak;
+		private bool _isWeak;
+		public  bool  IsWeak
+		{
+			get { return _isWeak; }
+			set { _isWeak = value; _hasIsWeak = true; }
+		}
+
+		public override string ConfigString
+		{
+			get
+			{
+				string s = base.ConfigString;
+
+				if (_hasMaxCacheTime) s += ";MaxCacheTime=" + MaxCacheTime;
+				if (_hasIsWeak)       s += ";IsWeak="       + IsWeak;
+
+				if (!string.IsNullOrEmpty(s) && s[0] == ';')
+					s = s.Substring(1);
+
+				return s;
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/CallMethodInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,74 @@
+using System;
+using System.Collections;
+using System.Reflection;
+
+namespace BLToolkit.Aspects
+{
+	[System.Diagnostics.DebuggerStepThrough]
+	public class CallMethodInfo
+	{
+		#region Init
+
+		readonly object _sync = new object();
+
+		#endregion
+
+		#region Public Members
+
+		public CallMethodInfo(MethodInfo methodInfo)
+		{
+			_methodInfo = methodInfo;
+			_parameters = methodInfo.GetParameters();
+		}
+
+		private readonly MethodInfo _methodInfo;
+		public           MethodInfo  MethodInfo
+		{
+			get { return _methodInfo; }
+		}
+
+		private readonly ParameterInfo[] _parameters;
+		public           ParameterInfo[]  Parameters
+		{
+			get { return _parameters; }
+		}
+
+		volatile Hashtable  _items;
+		public   IDictionary Items
+		{
+			get
+			{
+				if (_items == null) lock (_sync) if (_items == null)
+					_items = Hashtable.Synchronized(new Hashtable());
+
+				return _items;
+			}
+		}
+
+		private CacheAspect _cacheAspect;
+		public  CacheAspect  CacheAspect
+		{
+			         get { return _cacheAspect;  }
+			internal set { _cacheAspect = value; }
+		}
+
+		[Obsolete("Use CacheAspect.Cache instead")]
+		public  IDictionary  MethodCallCache
+		{
+			get { return _cacheAspect != null? _cacheAspect.Cache: new Hashtable(); }
+		}
+
+		#endregion
+
+		#region Proptected Members
+
+		private  bool[] _cacheableParameters;
+		internal bool[]  CacheableParameters
+		{
+			get { return _cacheableParameters;  }
+			set { _cacheableParameters = value; }
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/ClearCacheAspect.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,28 @@
+using System;
+using System.Reflection;
+
+namespace BLToolkit.Aspects
+{
+	public class ClearCacheAspect
+	{
+		public static MethodInfo GetMethodInfo(
+			object caller, Type declaringType, string methodName, Type[] parameterTypes)
+		{
+			if (declaringType == null)
+				declaringType = caller.GetType();
+
+			return CacheAspect.GetMethodInfo(declaringType, methodName, parameterTypes);
+		}
+
+		public static Type GetType(object caller, Type declaringType)
+		{
+			if (declaringType == null)
+				declaringType = caller.GetType();
+
+			if (declaringType.IsAbstract)
+				declaringType = TypeBuilder.TypeFactory.GetType(declaringType);
+
+			return declaringType;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/ClearCacheAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,53 @@
+using System;
+
+using BLToolkit.TypeBuilder.Builders;
+
+namespace BLToolkit.Aspects
+{
+	/// <summary>
+	/// http://www.bltoolkit.net/Doc/Aspects/index.htm
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Method, AllowMultiple=true)]
+	public class ClearCacheAttribute : AbstractTypeBuilderAttribute
+	{
+		#region Constructors
+
+		public ClearCacheAttribute()
+		{
+		}
+
+		public ClearCacheAttribute(string methodName)
+		{
+			_methodName = methodName;
+		}
+
+		public ClearCacheAttribute(string methodName, params Type[] parameterTypes)
+		{
+			_methodName     = methodName;
+			_parameterTypes = parameterTypes;
+		}
+
+		public ClearCacheAttribute(Type declaringType, string methodName, params Type[] parameterTypes)
+		{
+			_declaringType  = declaringType;
+			_methodName     = methodName;
+			_parameterTypes = parameterTypes;
+		}
+
+		public ClearCacheAttribute(Type declaringType)
+		{
+			_declaringType = declaringType;
+		}
+
+		readonly Type   _declaringType;
+		readonly string _methodName;
+		readonly Type[] _parameterTypes;
+
+		#endregion
+
+		public override IAbstractTypeBuilder TypeBuilder
+		{
+			get { return new Builders.ClearCacheAspectBuilder(_declaringType, _methodName, _parameterTypes); }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/CounterAspect.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,118 @@
+using System;
+using System.Collections;
+using System.Reflection;
+using System.Threading;
+
+namespace BLToolkit.Aspects
+{
+	public delegate MethodCallCounter CreateCounter(CallMethodInfo methodInfo);
+
+	/// <summary>
+	/// http://www.bltoolkit.net/Doc/Aspects/index.htm
+	/// </summary>
+	[System.Diagnostics.DebuggerStepThrough]
+	public class CounterAspect : Interceptor
+	{
+		public override void Init(CallMethodInfo info, string configString)
+		{
+			base.Init(info, configString);
+
+			 _counters.Add(_counter = CreateCounter(info) ?? CreateCounterInternal(info));
+		}
+
+		private MethodCallCounter _counter;
+
+		static readonly LocalDataStoreSlot _counterSlot = Thread.AllocateDataSlot();
+
+		protected override void BeforeCall(InterceptCallInfo info)
+		{
+			if (!IsEnabled || Thread.GetData(_counterSlot) != null)
+				return;
+
+			_counter.RegisterCall(info);
+
+			Thread.SetData(_counterSlot, _counter);
+		}
+
+		protected override void OnFinally(InterceptCallInfo info)
+		{
+			if (!IsEnabled)
+				return;
+
+			MethodCallCounter prev = (MethodCallCounter)Thread.GetData(_counterSlot);
+
+			if (_counter == prev)
+			{
+				_counter.UnregisterCall(info);
+
+				Thread.SetData(_counterSlot, null);
+			}
+		}
+
+		#region Parameters
+
+		private static bool _isEnabled = true;
+		public  static bool  IsEnabled
+		{
+			get { return _isEnabled;  }
+			set { _isEnabled = value; }
+		}
+
+		#endregion
+
+		#region Counter
+
+		private static readonly ArrayList _counters = ArrayList.Synchronized(new ArrayList());
+		public  static          ArrayList  Counters
+		{
+			get { return _counters; }
+		}
+
+		public static MethodCallCounter GetCounter(MethodInfo methodInfo)
+		{
+			lock (_counters.SyncRoot)
+			foreach (MethodCallCounter c in _counters)
+			{
+				if ((methodInfo.DeclaringType == c.MethodInfo.DeclaringType ||
+					 methodInfo.DeclaringType == c.MethodInfo.DeclaringType.BaseType) &&
+					 methodInfo.Name          == c.MethodInfo.Name)
+				{
+					ParameterInfo[] ps1 = c.MethodInfo.GetParameters();
+					ParameterInfo[] ps2 =   methodInfo.GetParameters();
+
+					if (ps1.Length == ps2.Length)
+					{
+						bool isMatched = true;
+
+						for (int i = 0; isMatched && i < ps1.Length; i++)
+							isMatched = ps1[i].ParameterType == ps2[i].ParameterType;
+
+						if (isMatched)
+							return c;
+					}
+				}
+			}
+
+			return null;
+		}
+
+		#region CreateCounter
+
+		private static CreateCounter _createCounter = CreateCounterInternal;
+
+		public static CreateCounter CreateCounter
+		{
+			get { return _createCounter; }
+			set { _createCounter = value ?? new CreateCounter(CreateCounterInternal); }
+		}
+
+		private static MethodCallCounter CreateCounterInternal(CallMethodInfo methodInfo)
+		{
+			return new MethodCallCounter(methodInfo);
+		}
+
+		#endregion
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/CounterAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,37 @@
+using System;
+
+using BLToolkit.TypeBuilder.Builders;
+
+namespace BLToolkit.Aspects
+{
+	/// <summary>
+	/// http://www.bltoolkit.net/Doc/Aspects/index.htm
+	/// </summary>
+	[AttributeUsage(
+		AttributeTargets.Class |
+		AttributeTargets.Interface |
+		AttributeTargets.Property |
+		AttributeTargets.Method,
+		AllowMultiple=true)]
+	public class CounterAttribute : InterceptorAttribute
+	{
+		public CounterAttribute()
+			: this(typeof(CounterAspect), null)
+		{
+		}
+
+		public CounterAttribute(string configString)
+			: this(typeof(CounterAspect), configString)
+		{
+		}
+
+		protected CounterAttribute(Type interceptorType, string configString)
+			: base(
+				interceptorType,
+				InterceptType.BeforeCall | InterceptType.OnCatch | InterceptType.OnFinally,
+				configString,
+				TypeBuilderConsts.Priority.Normal)
+		{
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/IInterceptor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+namespace BLToolkit.Aspects
+{
+	public interface IInterceptor
+	{
+		void Init     (CallMethodInfo    info, string configString);
+		void Intercept(InterceptCallInfo info);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/InstanceCacheAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,79 @@
+using System;
+
+namespace BLToolkit.Aspects
+{
+	/// <summary>
+	/// http://www.bltoolkit.net/Doc/Aspects/index.htm
+	/// </summary>
+	[AttributeUsage(
+		AttributeTargets.Class |
+		AttributeTargets.Interface |
+		AttributeTargets.Property |
+		AttributeTargets.Method,
+		AllowMultiple=true)]
+	public class InstanceCacheAttribute : CacheAttribute
+	{
+		#region Constructors
+
+		public InstanceCacheAttribute()
+			: this(typeof(CacheAspect), null)
+		{
+		}
+
+		public InstanceCacheAttribute(Type cacheAspectType, string configString)
+			: base(cacheAspectType, configString)
+		{
+		}
+
+		public InstanceCacheAttribute(Type interceptorType)
+			: this(interceptorType, null)
+		{
+		}
+
+		public InstanceCacheAttribute(Type interceptorType, int maxCacheTime)
+			: this(interceptorType, null)
+		{
+			MaxCacheTime = maxCacheTime;
+		}
+
+		public InstanceCacheAttribute(Type interceptorType, bool isWeak)
+			: this(interceptorType, null)
+		{
+			IsWeak = isWeak;
+		}
+
+		public InstanceCacheAttribute(Type interceptorType, int maxCacheTime, bool isWeak)
+			: this(interceptorType, null)
+		{
+			MaxCacheTime = maxCacheTime;
+			IsWeak       = isWeak;
+		}
+
+		public InstanceCacheAttribute(string configString)
+			: this(typeof(CacheAspect), configString)
+		{
+		}
+
+		public InstanceCacheAttribute(int maxCacheTime)
+			: this(typeof(CacheAspect), maxCacheTime)
+		{
+		}
+
+		public InstanceCacheAttribute(bool isWeak)
+			: this(typeof(CacheAspect), isWeak)
+		{
+		}
+
+		public InstanceCacheAttribute(int maxCacheTime, bool isWeak)
+			: this(typeof(CacheAspect), maxCacheTime, isWeak)
+		{
+		}
+
+		#endregion
+
+		public override bool LocalInterceptor
+		{
+			get { return true; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/InterceptCallInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,124 @@
+using System;
+using System.Collections;
+using System.Diagnostics;
+using System.Security.Principal;
+using System.Threading;
+using BLToolkit.Properties;
+
+namespace BLToolkit.Aspects
+{
+	[DebuggerStepThrough] 
+	public sealed class InterceptCallInfo
+	{
+		public InterceptCallInfo()
+		{
+			_currentPrincipal = Thread.CurrentPrincipal;
+			_currentThread    = Thread.CurrentThread;
+		}
+
+		private CallMethodInfo _callMethodInfo;
+		public  CallMethodInfo  CallMethodInfo
+		{
+			get { return _callMethodInfo;  }
+			set
+			{
+				if (_callMethodInfo == value)
+				{
+					// A race condition.
+					//
+					return;
+				}
+
+				if (_callMethodInfo != null)
+					throw new InvalidOperationException(Resources.InterceptCallInfo_CallMethodInfoIsNotMutable);
+
+				_callMethodInfo = value;
+
+				int len = value.MethodInfo.GetParameters().Length;
+
+				_parameterValues = len == 0? _emptyValues: new object[len];
+			}
+		}
+
+		private readonly object[] _emptyValues = new object[0];
+
+		private object[] _parameterValues;
+		public  object[]  ParameterValues
+		{
+			get { return _parameterValues;  }
+			set { _parameterValues = value; }
+		}
+
+		private object _returnValue;
+		public  object  ReturnValue
+		{
+			get { return _returnValue;  }
+			set { _returnValue = value; }
+		}
+
+		private InterceptResult _interceptResult = InterceptResult.Continue;
+		public  InterceptResult  InterceptResult
+		{
+			get { return _interceptResult;  }
+			set { _interceptResult = value; }
+		}
+
+		private InterceptType _interceptType;
+		public  InterceptType  InterceptType
+		{
+			get { return _interceptType;  }
+			set { _interceptType = value; }
+		}
+
+		private Exception _exception;
+		public  Exception  Exception
+		{
+			get { return _exception;  }
+			set { _exception = value; }
+		}
+
+		private Hashtable  _items;
+		public  IDictionary Items
+		{
+			get
+			{
+				if (_items == null)
+					_items = new Hashtable();
+
+				return _items;
+			}
+		}
+
+		private readonly DateTime _beginCallTime = DateTime.Now;
+		public           DateTime  BeginCallTime
+		{
+			get { return _beginCallTime; }
+		}
+
+		private readonly IPrincipal _currentPrincipal;
+		public           IPrincipal  CurrentPrincipal
+		{
+			get { return _currentPrincipal; }
+		}
+
+		private readonly Thread _currentThread;
+		public           Thread  CurrentThread
+		{
+			get { return _currentThread; }
+		}
+
+		private bool _cached;
+		public  bool  Cached
+		{
+			get { return _cached;  }
+			set { _cached = value; }
+		}
+
+		private object _object;
+		public  object  Object
+		{
+			get { return _object;  }
+			set { _object = value; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/InterceptResult.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+namespace BLToolkit.Aspects
+{
+	public enum InterceptResult
+	{
+		Continue,
+		Return
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/InterceptType.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,13 @@
+using System;
+
+namespace BLToolkit.Aspects
+{
+	[Flags]
+	public enum InterceptType
+	{
+		BeforeCall = 0x01,
+		AfterCall  = 0x02,
+		OnCatch    = 0x04,
+		OnFinally  = 0x08
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/Interceptor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,26 @@
+namespace BLToolkit.Aspects
+{
+	[System.Diagnostics.DebuggerStepThrough]
+	public abstract class Interceptor : IInterceptor
+	{
+		public virtual void Init(CallMethodInfo info, string configString)
+		{
+		}
+
+		public virtual void Intercept(InterceptCallInfo info)
+		{
+			switch (info.InterceptType)
+			{
+				case InterceptType.BeforeCall: BeforeCall(info); break;
+				case InterceptType.AfterCall:  AfterCall (info); break;
+				case InterceptType.OnCatch:    OnCatch   (info); break;
+				case InterceptType.OnFinally:  OnFinally (info); break;
+			}
+		}
+
+		protected virtual void BeforeCall(InterceptCallInfo info) {}
+		protected virtual void AfterCall (InterceptCallInfo info) {}
+		protected virtual void OnCatch   (InterceptCallInfo info) {}
+		protected virtual void OnFinally (InterceptCallInfo info) {}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/InterceptorAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,88 @@
+using System;
+
+using BLToolkit.TypeBuilder.Builders;
+
+namespace BLToolkit.Aspects
+{
+	[AttributeUsage(
+		AttributeTargets.Class |
+		AttributeTargets.Interface |
+		AttributeTargets.Property |
+		AttributeTargets.Method,
+		AllowMultiple=true)]
+	public class InterceptorAttribute : AbstractTypeBuilderAttribute
+	{
+		public InterceptorAttribute(Type interceptorType, InterceptType interceptType)
+			: this(interceptorType, interceptType, null, TypeBuilderConsts.Priority.Normal)
+		{
+		}
+
+		public InterceptorAttribute(Type interceptorType, InterceptType interceptType, int priority)
+			: this(interceptorType, interceptType, null, priority)
+		{
+		}
+
+		public InterceptorAttribute(Type interceptorType, InterceptType interceptType, string parameters)
+			: this(interceptorType, interceptType, parameters, TypeBuilderConsts.Priority.Normal)
+		{
+		}
+
+		public InterceptorAttribute(
+			Type interceptorType, InterceptType interceptType, string configString, int priority)
+			: this(interceptorType, interceptType, configString, priority, false)
+		{
+		}
+
+		public InterceptorAttribute(
+			Type interceptorType, InterceptType interceptType, string configString, int priority, bool localInterceptor)
+		{
+			if (interceptorType == null && interceptType != 0)
+				throw new ArgumentNullException("interceptorType");
+
+			_interceptorType  = interceptorType;
+			_interceptType    = interceptType;
+			_configString     = configString;
+			_priority         = priority;
+			_localInterceptor = localInterceptor;
+		}
+
+		private readonly Type _interceptorType;
+		public  virtual  Type  InterceptorType
+		{
+			get { return _interceptorType; }
+		}
+
+		private readonly InterceptType _interceptType;
+		public  virtual  InterceptType  InterceptType
+		{
+			get { return _interceptType; }
+		}
+
+		private readonly int _priority;
+		public  virtual  int  Priority
+		{
+			get { return _priority; }
+		}
+
+		private readonly string _configString;
+		public  virtual  string  ConfigString
+		{
+			get { return _configString; }
+		}
+
+		private readonly bool _localInterceptor;
+		public  virtual  bool  LocalInterceptor
+		{
+			get { return _localInterceptor; }
+		}
+
+		public override IAbstractTypeBuilder TypeBuilder
+		{
+			get
+			{
+				 return new Builders.InterceptorAspectBuilder(
+					 InterceptorType, InterceptType, ConfigString, Priority, LocalInterceptor);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/LogAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,87 @@
+using System;
+
+using BLToolkit.TypeBuilder.Builders;
+
+namespace BLToolkit.Aspects
+{
+	/// <summary>
+	/// http://www.bltoolkit.net/Doc/Aspects/index.htm
+	/// </summary>
+	[AttributeUsage(
+		AttributeTargets.Class |
+		AttributeTargets.Interface |
+		AttributeTargets.Property |
+		AttributeTargets.Method,
+		AllowMultiple=true)]
+	public class LogAttribute : InterceptorAttribute
+	{
+		public LogAttribute()
+			: this(typeof(LoggingAspect), null)
+		{
+		}
+
+		public LogAttribute(string parameters)
+			: this(typeof(LoggingAspect), parameters)
+		{
+		}
+
+		protected LogAttribute(Type interceptorType, string parameters)
+			: base(
+				interceptorType,
+				InterceptType.OnCatch | InterceptType.OnFinally,
+				parameters,
+				TypeBuilderConsts.Priority.LoggingAspect)
+		{
+		}
+
+		private bool _hasFileName;
+		private string  _fileName;
+		public  string   FileName
+		{
+			get { return _fileName; }
+			set { _fileName = value; _hasFileName = true; }
+		}
+
+		private bool _hasMinCallTime;
+		private int     _minCallTime;
+		public  int      MinCallTime
+		{
+			get { return _minCallTime; }
+			set { _minCallTime = value; _hasMinCallTime = true; }
+		}
+
+		private bool _hasLogExceptions;
+		private bool    _logExceptions;
+		public  bool     LogExceptions
+		{
+			get { return _logExceptions; }
+			set { _logExceptions = value; _hasLogExceptions = true;}
+		}
+
+		private bool _hasLogParameters;
+		private bool    _logParameters;
+		public  bool     LogParameters
+		{
+			get { return _logParameters; }
+			set { _logParameters = value; _hasLogParameters = true;}
+		}
+
+		public override string ConfigString
+		{
+			get
+			{
+				string s = base.ConfigString;
+
+				if (_hasFileName)      s += ";FileName="      + FileName;
+				if (_hasMinCallTime)   s += ";MinCallTime="   + MinCallTime;
+				if (_hasLogExceptions) s += ";LogExceptions=" + LogExceptions;
+				if (_hasLogParameters) s += ";LogParameters=" + LogParameters;
+
+				if (!string.IsNullOrEmpty(s) && s[0] == ';')
+					s = s.Substring(1);
+
+				return s;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/LoggingAspect.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,212 @@
+using System;
+using System.Diagnostics;
+using System.Globalization;
+using System.IO;
+using System.Collections;
+using System.Text;
+
+namespace BLToolkit.Aspects
+{
+	public delegate void LogOperation(InterceptCallInfo interceptCallInfo, LoggingAspect.Parameters parameters);
+	public delegate void LogOutput   (string logText, string fileName);
+
+	/// <summary>
+	/// http://www.bltoolkit.net/Doc/Aspects/index.htm
+	/// </summary>
+	public class LoggingAspect : Interceptor
+	{
+		public class Parameters
+		{
+			public string FileName;
+			public int    MinCallTime;
+			public bool   LogExceptions;
+			public bool   LogParameters;
+		}
+
+		private string              _instanceFileName;
+		private int?                _instanceMinCallTime;
+		private bool?               _instanceLogExceptions;
+		private bool?               _instanceLogParameters;
+		private readonly Parameters _parameters = new Parameters();
+
+		public override void Init(CallMethodInfo info, string configString)
+		{
+			base.Init(info, configString);
+
+			string[] ps = configString.Split(';');
+
+			foreach (string p in ps)
+			{
+				string[] vs = p.Split('=');
+
+				if (vs.Length == 2)
+				{
+					switch (vs[0].ToLower().Trim())
+					{
+						case "filename":      _instanceFileName      =            vs[1].Trim();  break;
+						case "mincalltime":   _instanceMinCallTime   = int. Parse(vs[1].Trim()); break;
+						case "logexceptions": _instanceLogExceptions = bool.Parse(vs[1].Trim()); break;
+						case "logparameters": _instanceLogParameters = bool.Parse(vs[1].Trim()); break;
+					}
+				}
+			}
+		}
+
+		protected override void OnFinally(InterceptCallInfo info)
+		{
+			if (IsEnabled)
+			{
+				_parameters.FileName      = _instanceFileName      ?? FileName;
+				_parameters.MinCallTime   = _instanceMinCallTime   ?? MinCallTime;
+				_parameters.LogExceptions = _instanceLogExceptions ?? LogExceptions;
+				_parameters.LogParameters = _instanceLogParameters ?? LogParameters;
+
+				LogOperation(info, _parameters);
+			}
+		}
+
+		#region Parameters
+
+		private static bool _logParameters = true;
+		public  static bool  LogParameters
+		{
+			get { return _logParameters;  }
+			set { _logParameters = value; }
+		}
+
+		private static bool _logExceptions = true;
+		public  static bool  LogExceptions
+		{
+			get { return _logExceptions;  }
+			set { _logExceptions = value; }
+		}
+
+		private static int _minCallTime;
+		public  static int  MinCallTime
+		{
+			get { return _minCallTime;  }
+			set { _minCallTime = value; }
+		}
+
+		private static string _fileName;
+		public  static string  FileName
+		{
+			get { return _fileName;  }
+			set { _fileName = value; }
+		}
+
+		private static bool _isEnabled = true;
+		public  static bool  IsEnabled
+		{
+			get { return _isEnabled;  }
+			set { _isEnabled = value; }
+		}
+
+		#endregion
+
+		#region LogOperation
+
+		private static LogOperation _logOperation = LogOperationInternal;
+		public  static LogOperation  LogOperation
+		{
+			get { return _logOperation; }
+			set { _logOperation = value ?? LogOperationInternal; }
+		}
+
+		private static void LogOperationInternal(InterceptCallInfo info, Parameters parameters)
+		{
+			DateTime end  = DateTime.Now;
+			int      time = (int)((end - info.BeginCallTime).TotalMilliseconds);
+
+			if (info.Exception != null && parameters.LogExceptions ||
+				info.Exception == null && time >= parameters.MinCallTime)
+			{
+				string callParameters = null;
+				int    plen           = info.ParameterValues.Length;
+
+				if (parameters.LogParameters && plen > 0)
+				{
+					StringBuilder sb = new StringBuilder();
+					object[] values = info.ParameterValues;
+
+					FormatParameter(values[0], sb);
+					for (int i = 1; i < plen; i++)
+					{
+						FormatParameter(values[i], sb.Append(", "));
+					}
+
+					callParameters = sb.ToString();
+				}
+
+				string exText = null;
+
+				if (info.Exception != null)
+					exText = string.Format(
+						" with exception '{0}' - \"{1}\"",
+						info.Exception.GetType().FullName,
+						info.Exception.Message);
+
+				LogOutput(
+					string.Format("{0}: {1}.{2}({3}) - {4} ms{5}{6}.",
+						end,
+						info.CallMethodInfo.MethodInfo.DeclaringType.FullName,
+						info.CallMethodInfo.MethodInfo.Name,
+						callParameters,
+						time,
+						info.Cached? " from cache": null,
+						exText),
+					parameters.FileName);
+			}
+		}
+
+		private static void FormatParameter(object parameter, StringBuilder sb)
+		{
+			if (parameter == null)
+				sb.Append("<null>");
+			else if (parameter is string)
+				sb.Append('"').Append((string)parameter).Append('"');
+			else if (parameter is char)
+				sb.Append('\'').Append((char)parameter).Append('\'');
+			else if (parameter is IEnumerable)
+			{
+				sb.Append('[');
+				bool first = true;
+				foreach (object item in (IEnumerable)parameter)
+				{
+					FormatParameter(item, first? sb: sb.Append(','));
+					first = false;
+				}
+				sb.Append(']');
+			}
+			else if (parameter is IFormattable)
+			{
+				IFormattable formattable = (IFormattable)parameter;
+				sb.Append(formattable.ToString(null, CultureInfo.InvariantCulture));
+			}
+			else
+				sb.Append(parameter.ToString());
+		}
+
+		#endregion
+
+		#region LogOuput
+
+		private static LogOutput _logOutput = LogOutputInternal;
+		public  static LogOutput  LogOutput
+		{
+			get { return _logOutput; }
+			set { _logOutput = value ?? LogOutputInternal; }
+		}
+
+		private static void LogOutputInternal(string logText, string fileName)
+		{
+			if (string.IsNullOrEmpty(fileName))
+				Debug.WriteLine(logText);
+			else
+				using (StreamWriter sw = new StreamWriter(fileName, true)) 
+					sw.WriteLine(logText);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/MethodCallCounter.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,129 @@
+using System;
+using System.Collections;
+using System.Reflection;
+
+namespace BLToolkit.Aspects
+{
+	[System.Diagnostics.DebuggerStepThrough]
+	public class MethodCallCounter
+	{
+		public MethodCallCounter(CallMethodInfo methodInfo)
+		{
+			_callMethodInfo = methodInfo;
+			_methodInfo     = methodInfo.MethodInfo;
+		}
+
+		#region Public Members
+
+		private MethodInfo _methodInfo;
+		public  MethodInfo  MethodInfo
+		{
+			get { return _methodInfo;  }
+			set { _methodInfo = value; }
+		}
+
+		private CallMethodInfo _callMethodInfo;
+		public  CallMethodInfo  CallMethodInfo
+		{
+			get { return _callMethodInfo;  }
+			set { _callMethodInfo = value; }
+		}
+
+		private int _totalCount;
+		public  int  TotalCount
+		{
+			get { return _totalCount;  }
+			set { _totalCount = value; }
+		}
+
+		private int _exceptionCount;
+		public  int  ExceptionCount
+		{
+			get { return _exceptionCount;  }
+			set { _exceptionCount = value; }
+		}
+
+		private int _cachedCount;
+		public  int  CachedCount
+		{
+			get { return _cachedCount;  }
+			set { _cachedCount = value; }
+		}
+
+		private TimeSpan _totalTime;
+		public  TimeSpan  TotalTime
+		{
+			get { return _totalTime;  }
+			set { _totalTime = value; }
+		}
+
+		private TimeSpan _minTime = TimeSpan.MaxValue;
+		public  TimeSpan  MinTime
+		{
+			get { return _minTime;  }
+			set { _minTime = value; }
+		}
+
+		private TimeSpan _maxTime;
+		public  TimeSpan  MaxTime
+		{
+			get { return _maxTime;  }
+			set { _maxTime = value; }
+		}
+
+		private readonly ArrayList _currentCalls = ArrayList.Synchronized(new ArrayList());
+		public           ArrayList  CurrentCalls
+		{
+			get { return _currentCalls; }
+		}
+
+		public TimeSpan AverageTime
+		{
+			get
+			{
+				if (_totalCount == 0)
+					return TimeSpan.MinValue;
+
+				return new TimeSpan(TotalTime.Ticks / TotalCount);
+			}
+		}
+
+		#endregion
+
+		#region Protected Members
+
+		public virtual void RegisterCall(InterceptCallInfo info)
+		{
+			lock (_currentCalls.SyncRoot)
+				_currentCalls.Add(info);
+		}
+
+		public virtual void UnregisterCall(InterceptCallInfo info)
+		{
+			AddCall(DateTime.Now - info.BeginCallTime, info.Exception != null, info.Cached);
+
+			lock (_currentCalls.SyncRoot)
+				_currentCalls.Remove(info);
+		}
+
+		protected void AddCall(TimeSpan time, bool withException, bool cached)
+		{
+			if (cached)
+			{
+				_cachedCount++;
+			}
+			else
+			{
+				_totalTime += time;
+				_totalCount++;
+
+				if (_minTime > time) _minTime = time;
+				if (_maxTime < time) _maxTime = time;
+			}
+
+			if (withException) _exceptionCount++;
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/MixinAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,72 @@
+using System;
+
+using BLToolkit.TypeBuilder.Builders;
+
+namespace BLToolkit.Aspects
+{
+	/// <summary>
+	/// http://www.bltoolkit.net/Doc/Aspects/index.htm
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Class, AllowMultiple=true)]
+	public sealed class MixinAttribute : AbstractTypeBuilderAttribute
+	{
+		public MixinAttribute(
+			Type targetInterface, string memberName, bool throwExceptionIfNull, string exceptionMessage)
+		{
+			_targetInterface      = targetInterface;
+			_memberName           = memberName;
+			_throwExceptionIfNull = throwExceptionIfNull;
+			_exceptionMessage     = exceptionMessage;
+		}
+
+		public MixinAttribute(Type targetInterface, string memberName, bool throwExceptionIfNull)
+			: this(targetInterface, memberName, throwExceptionIfNull, null)
+		{
+		}
+
+		public MixinAttribute(Type targetInterface, string memberName, string exceptionMessage)
+			: this(targetInterface, memberName, true, exceptionMessage)
+		{
+		}
+
+		public MixinAttribute(Type targetInterface, string memberName)
+			: this(targetInterface, memberName, true, null)
+		{
+		}
+
+		private readonly Type _targetInterface;
+		public           Type  TargetInterface
+		{
+			get { return _targetInterface;  }
+		}
+
+		private readonly string _memberName;
+		public           string  MemberName
+		{
+			get { return _memberName;  }
+		}
+
+		private bool _throwExceptionIfNull;
+		public  bool  ThrowExceptionIfNull
+		{
+			get { return _throwExceptionIfNull;  }
+			set { _throwExceptionIfNull = value; }
+		}
+
+		private string _exceptionMessage;
+		public  string  ExceptionMessage
+		{
+			get { return _exceptionMessage;  }
+			set { _exceptionMessage = value; }
+		}
+
+		public override IAbstractTypeBuilder TypeBuilder
+		{
+			get
+			{
+				return new Builders.MixinAspectBuilder(
+					_targetInterface, _memberName, _throwExceptionIfNull, _exceptionMessage);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/MixinOverrideAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,45 @@
+using System;
+
+namespace BLToolkit.Aspects
+{
+	/// <summary>
+	/// http://www.bltoolkit.net/Doc/Aspects/index.htm
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Method, AllowMultiple=true)]
+	public class MixinOverrideAttribute : Attribute
+	{
+		public MixinOverrideAttribute(Type targetInterface, string methodName)
+		{
+			_targetInterface = targetInterface;
+			_methodName      = methodName;
+		}
+
+		public MixinOverrideAttribute(Type targetInterface)
+			: this(targetInterface, null)
+		{
+		}
+
+		public MixinOverrideAttribute(string methodName)
+			: this(null, methodName)
+		{
+		}
+
+		public MixinOverrideAttribute()
+		{
+		}
+
+		private Type _targetInterface;
+		public  Type  TargetInterface
+		{
+			get { return _targetInterface; }
+			set { _targetInterface = value; }
+		}
+
+		private string _methodName;
+		public  string  MethodName
+		{
+			get { return _methodName; }
+			set { _methodName = value; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/NoCacheAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,21 @@
+using System;
+
+namespace BLToolkit.Aspects
+{
+	/// <summary>
+	/// http://www.bltoolkit.net/Doc/Aspects/index.htm
+	/// </summary>
+	[AttributeUsage(
+		AttributeTargets.Class |
+		AttributeTargets.Interface |
+		AttributeTargets.Property |
+		AttributeTargets.Method,
+		AllowMultiple=true)]
+	public class NoCacheAttribute : NoInterceptionAttribute
+	{
+		public NoCacheAttribute()
+			: base(typeof(CacheAspect), InterceptType.BeforeCall | InterceptType.AfterCall)
+		{
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/NoCounterAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,21 @@
+using System;
+
+namespace BLToolkit.Aspects
+{
+	/// <summary>
+	/// http://www.bltoolkit.net/Doc/Aspects/index.htm
+	/// </summary>
+	[AttributeUsage(
+		AttributeTargets.Class |
+		AttributeTargets.Interface |
+		AttributeTargets.Property |
+		AttributeTargets.Method,
+		AllowMultiple=true)]
+	public class NoCounterAttribute : NoInterceptionAttribute
+	{
+		public NoCounterAttribute()
+			: base(typeof(CounterAspect), InterceptType.BeforeCall | InterceptType.OnFinally)
+		{
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/NoInterceptionAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,44 @@
+using System;
+
+using BLToolkit.TypeBuilder.Builders;
+
+namespace BLToolkit.Aspects
+{
+	[AttributeUsage(
+		AttributeTargets.Class |
+		AttributeTargets.Interface |
+		AttributeTargets.Property |
+		AttributeTargets.Method,
+		AllowMultiple=true)]
+	public class NoInterceptionAttribute : InterceptorAttribute
+	{
+		public NoInterceptionAttribute()
+			: base(null, 0)
+		{
+		}
+
+		public NoInterceptionAttribute(Type interceptorType, InterceptType interceptType)
+			: base(interceptorType, interceptType)
+		{
+		}
+
+		public override IAbstractTypeBuilder TypeBuilder
+		{
+			get { return new NoInterceptionAspectBuilder(InterceptorType, InterceptType); }
+		}
+
+		private class NoInterceptionAspectBuilder : Builders.InterceptorAspectBuilder
+		{
+			public NoInterceptionAspectBuilder(Type interceptorType, InterceptType interceptType)
+				: base(interceptorType, interceptType, null, TypeBuilderConsts.Priority.Normal, false)
+			{
+			}
+
+			public override void Build(BuildContext context)
+			{
+				if (context.Step == BuildStep.Begin || context.Step == BuildStep.End)
+					base.Build(context);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/NoLogAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,21 @@
+using System;
+
+namespace BLToolkit.Aspects
+{
+	/// <summary>
+	/// http://www.bltoolkit.net/Doc/Aspects/index.htm
+	/// </summary>
+	[AttributeUsage(
+		AttributeTargets.Class |
+		AttributeTargets.Interface |
+		AttributeTargets.Property |
+		AttributeTargets.Method,
+		AllowMultiple=true)]
+	public class NoLogAttribute : NoInterceptionAttribute
+	{
+		public NoLogAttribute()
+			: base(typeof(LoggingAspect), InterceptType.OnCatch | InterceptType.OnFinally)
+		{
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/NotNullAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,34 @@
+using System;
+
+using BLToolkit.TypeBuilder.Builders;
+
+namespace BLToolkit.Aspects
+{
+	/// <summary>
+	/// http://www.bltoolkit.net/Doc/Aspects/index.htm
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Parameter)]
+	public sealed class NotNullAttribute : AbstractTypeBuilderAttribute
+	{
+		public NotNullAttribute()
+		{
+		}
+
+		public NotNullAttribute(string message)
+		{
+			_message = message;
+		}
+
+		private string _message;
+		public  string  Message
+		{
+			get { return _message;  }
+			set { _message = value; }
+		}
+
+		public override IAbstractTypeBuilder TypeBuilder
+		{
+			get { return new Builders.NotNullAspectBuilder(_message); }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Aspects/OverloadAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,38 @@
+using System;
+using BLToolkit.TypeBuilder.Builders;
+
+namespace BLToolkit.Aspects
+{
+	/// <summary>
+	/// http://www.bltoolkit.net/Doc/Aspects/index.htm
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Method)]
+	public sealed class OverloadAttribute : AbstractTypeBuilderAttribute
+	{
+		private readonly string _overloadedMethodName;
+		private readonly Type[] _parameterTypes;
+
+		public OverloadAttribute()
+		{
+		}
+
+		public OverloadAttribute(string overloadedMethodName): this(overloadedMethodName, null)
+		{
+		}
+
+		public OverloadAttribute(params Type[] parameterTypes): this(null, parameterTypes)
+		{
+		}
+
+		public OverloadAttribute(string overloadedMethodName, params Type[] parameterTypes)
+		{
+			_overloadedMethodName = overloadedMethodName;
+			_parameterTypes       = parameterTypes;
+		}
+
+		public override IAbstractTypeBuilder TypeBuilder
+		{
+			get { return new Builders.OverloadAspectBuilder(_overloadedMethodName, _parameterTypes); }
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/BLToolkit.3.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,734 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{0C325F5D-E50E-4340-8724-D29896CCC583}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit</RootNamespace>
+    <AssemblyName>BLToolkit.3</AssemblyName>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>BLToolkit.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;OVERRIDETOSTRING;FW3;</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRules>-Microsoft.Globalization#CA1303;-Microsoft.Design#CA1020;-Microsoft.Design#CA1019;-Microsoft.Design#CA1000;-Microsoft.Design#CA1002;-Microsoft.Design#CA1004;-Microsoft.Design#CA1035;-Microsoft.Design#CA1039;-Microsoft.Design#CA1024;-Microsoft.Globalization#CA1304;-Microsoft.Globalization#CA1305;-Microsoft.Maintainability#CA1502;-Microsoft.Naming#CA1709;-Microsoft.Naming#CA1704;-Microsoft.Naming#CA1710;-Microsoft.Naming#CA1720;-Microsoft.Naming#CA1707;-Microsoft.Performance#CA1800;-Microsoft.Performance#CA1819;-Microsoft.Usage#CA2223;-Microsoft.Usage#CA2225</CodeAnalysisRules>
+    <NoWarn>
+    </NoWarn>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE;FW3;OVERRIDETOSTRING</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRules>-Microsoft.Design#CA1019;-Microsoft.Design#CA1000;-Microsoft.Design#CA1004;-Microsoft.Design#CA1035;-Microsoft.Design#CA1033;-Microsoft.Design#CA1039;-Microsoft.Design#CA1024;-Microsoft.Globalization#CA1303;-Microsoft.Globalization#CA1304;-Microsoft.Globalization#CA1305;-Microsoft.Naming#CA1720;-Microsoft.Naming#CA1709;-Microsoft.Naming#CA1710;-Microsoft.Naming#CA1707;-Microsoft.Naming#CA1706;-Microsoft.Performance#CA1819;-Microsoft.Usage#CA2223;-Microsoft.Usage#CA2225</CodeAnalysisRules>
+    <NoWarn>
+    </NoWarn>
+    <DocumentationFile>
+    </DocumentationFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.configuration" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Data.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.OracleClient" />
+    <Reference Include="System.Design" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Runtime.Serialization">
+      <RequiredTargetFramework>3.0</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.ServiceModel">
+      <RequiredTargetFramework>3.0</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Web" />
+    <Reference Include="System.Web.Services" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="WindowsBase">
+      <RequiredTargetFramework>3.0</RequiredTargetFramework>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Data\DataProvider\FdpDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\MySqlDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\OdpDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\SqlCeDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\SQLiteDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\SybaseDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\SybaseAdoDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\DB2DataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\InformixDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\PostgreSQLDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <Compile Include="Aspects\Builders\AsyncAspectBuilder.cs" />
+    <Compile Include="Aspects\Builders\InterceptorAspectBuilder.cs" />
+    <Compile Include="Aspects\Builders\MixinAspectBuilder.cs" />
+    <Compile Include="Aspects\Builders\NotNullAspectBuilder.cs" />
+    <Compile Include="Aspects\Builders\OverloadAspectBuilder.cs" />
+    <Compile Include="Aspects\ClearCacheAspect.cs" />
+    <Compile Include="Aspects\Builders\ClearCacheAspectBuilder.cs" />
+    <Compile Include="Aspects\ClearCacheAttribute.cs" />
+    <Compile Include="Aspects\InstanceCacheAttribute.cs" />
+    <Compile Include="Aspects\OverloadAttribute.cs" />
+    <Compile Include="Common\Convert.generated.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Convert.tt</DependentUpon>
+    </Compile>
+    <Compile Include="DataAccess\ScalarAttribute.cs" />
+    <Compile Include="DataAccess\SequenceKeyGenerator.cs" />
+    <Compile Include="Data\DataExceptionType.cs" />
+    <Compile Include="Data\DataProvider\FirebirdMappingSchema.cs" />
+    <Compile Include="Data\DataProvider\Sql2000DataProvider.cs" />
+    <Compile Include="Data\DataProvider\Sql2005DataProvider.cs" />
+    <Compile Include="Data\DataProvider\Sql2012DataProvider.cs" />
+    <Compile Include="Data\Linq\Builder\AggregationBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\AllAnyBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\BuildInfo.cs" />
+    <Compile Include="Data\Linq\Builder\CastBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ChangeTypeExpression.cs" />
+    <Compile Include="Data\Linq\Builder\ConcatUnionBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ContainsBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ConvertFlags.cs" />
+    <Compile Include="Data\Linq\Builder\CountBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\DefaultIfEmptyBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\DeleteBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\DistinctBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionBuilder.QueryBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionBuilder.SqlBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionContext.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionHoder.cs" />
+    <Compile Include="Data\Linq\Builder\FirstSingleBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\GroupByBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\IBuildContext.cs" />
+    <Compile Include="Data\Linq\Builder\InsertBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\InsertOrUpdateBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\IntersectBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ISequenceBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\IsExpressionResult.cs" />
+    <Compile Include="Data\Linq\Builder\JoinBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\MethodCallBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\OfTypeBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\OrderByBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\PassThroughBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\PassThroughContext.cs" />
+    <Compile Include="Data\Linq\Builder\RequestFor.cs" />
+    <Compile Include="Data\Linq\Builder\ScalarSelectBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\SelectBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\SelectContext.cs" />
+    <Compile Include="Data\Linq\Builder\SelectManyBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\SequenceContextBase.cs" />
+    <Compile Include="Data\Linq\Builder\SequenceConvertInfo.cs" />
+    <Compile Include="Data\Linq\Builder\SequenceConvertPath.cs" />
+    <Compile Include="Data\Linq\Builder\SqlInfo.cs" />
+    <Compile Include="Data\Linq\Builder\SubQueryContext.cs" />
+    <Compile Include="Data\Linq\Builder\TableAttributeBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\TableBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\TakeSkipBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\UpdateBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\WhereBuilder.cs" />
+    <Compile Include="Data\Linq\ExpressionQueryImpl.cs" />
+    <Compile Include="Data\Linq\IExpressionQuery.cs" />
+    <Compile Include="Data\Linq\ITable.cs" />
+    <Compile Include="Data\Linq\MemberInfoComparer.cs" />
+    <Compile Include="Data\Linq\QueryableAccessor.cs" />
+    <Compile Include="Data\Linq\TableExpressionAttribute.cs" />
+    <Compile Include="Data\Linq\TableFunctionAttribute.cs" />
+    <Compile Include="Data\Linq\DataContext.cs" />
+    <Compile Include="Data\Linq\DataContextInfo.cs" />
+    <Compile Include="Data\Linq\DataContextTransaction.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Data\Linq\DefaultDataContextInfo.cs" />
+    <Compile Include="Data\Linq\Extensions.cs" />
+    <Compile Include="Data\Linq\IDataContextInfo.cs" />
+    <Compile Include="Data\Linq\LinqExtensions.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MsSql2000SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MsSql2012SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlTableType.cs" />
+    <Compile Include="Data\Sql\SqlValueBase.cs" />
+    <Compile Include="Linq\ExpressionHelper.cs" />
+    <Compile Include="Mapping\ExpressionMapIgnoreAttribute.cs" />
+    <Compile Include="Mapping\IMappingSchemaProvider.cs" />
+    <Compile Include="Mapping\MemberMapper.generated.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>MemberMapper.tt</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\BLToolkitConstants.cs" />
+    <Compile Include="Common\ArrayT.cs" />
+    <Compile Include="Common\Compatibility4.cs" />
+    <Compile Include="Common\Tuple.cs" />
+    <Compile Include="Configuration\ElementBase.cs" />
+    <Compile Include="Configuration\ElementCollectionBase.cs" />
+    <Compile Include="Configuration\DataProviderElement.cs" />
+    <Compile Include="Configuration\DataProviderElementCollection.cs" />
+    <Compile Include="Configuration\BLToolkitSection.cs" />
+    <Compile Include="Configuration\TypeFactoryElement.cs" />
+    <Compile Include="DataAccess\ActualTypeAttribute.cs" />
+    <Compile Include="DataAccess\IdentityAttribute.cs" />
+    <Compile Include="DataAccess\DataAccessorBase.cs" />
+    <Compile Include="DataAccess\DbTypeAttribute.cs" />
+    <Compile Include="DataAccess\ParamTypeNameAttribute.cs" />
+    <Compile Include="DataAccess\SqlIgnoreAttribute.cs" />
+    <Compile Include="Data\DataProvider\Sql2008DataProvider.cs" />
+    <Compile Include="Data\DataProvider\SqlDataProvider.cs" />
+    <Compile Include="Data\DataProvider\ProviderName.cs" />
+    <Compile Include="Data\IDataReaderEx.cs" />
+    <Compile Include="Data\Linq\CompiledQuery.cs" />
+    <Compile Include="Data\Linq\CompiledTableT.cs" />
+    <Compile Include="Data\Linq\IgnoreIEnumerableAttribute.cs" />
+    <Compile Include="Data\Linq\IQueryContext.cs" />
+    <Compile Include="Data\Linq\ISelectInsertable.cs" />
+    <Compile Include="Data\Linq\Expressions.cs" />
+    <Compile Include="Data\Linq\IValueInsertable.cs" />
+    <Compile Include="Data\Linq\Settings.cs" />
+    <Compile Include="Data\Linq\SqlEnumAttribute.cs" />
+    <Compile Include="Data\Linq\IUpdateable.cs" />
+    <Compile Include="Data\Linq\MethodExpressionAttribute.cs" />
+    <Compile Include="Data\Linq\SqlExpressionAttribute.cs" />
+    <Compile Include="Data\Linq\IDataContext.cs" />
+    <Compile Include="Data\Linq\ExpressionQuery.cs" />
+    <Compile Include="Data\Linq\QueryContext.cs" />
+    <Compile Include="Data\Linq\SqlPropertyAttribute.cs" />
+    <Compile Include="Data\Linq\LinqException.cs" />
+    <Compile Include="Data\Linq\Query.cs" />
+    <Compile Include="Data\Linq\ReflectionHelper.cs" />
+    <Compile Include="Data\Linq\Sql.cs" />
+    <Compile Include="Data\Linq\SqlFunctionAttribute.cs" />
+    <Compile Include="Data\Linq\TableT.cs" />
+    <Compile Include="Data\Sql\ChildContainer.cs" />
+    <Compile Include="Data\Sql\ICloneableElement.cs" />
+    <Compile Include="Data\Sql\ISqlExpressionWalkable.cs" />
+    <Compile Include="Data\Sql\IValueContainer.cs" />
+    <Compile Include="Data\Sql\QueryElementType.cs" />
+    <Compile Include="Data\Sql\QueryType.cs" />
+    <Compile Include="Data\Sql\QueryVisitor.cs" />
+    <Compile Include="Data\Sql\SqlDataType.cs" />
+    <Compile Include="Data\Sql\ISqlPredicate.cs" />
+    <Compile Include="Data\Sql\Precedence.cs" />
+    <Compile Include="Data\Sql\SqlBinaryExpression.cs" />
+    <Compile Include="Data\Sql\SqlException.cs" />
+    <Compile Include="Data\Sql\Extensions.cs" />
+    <Compile Include="Data\Sql\IChild.cs" />
+    <Compile Include="Data\Sql\IQueryElement.cs" />
+    <Compile Include="Data\Sql\ISqlExpression.cs" />
+    <Compile Include="Data\Sql\ISqlTableSource.cs" />
+    <Compile Include="Data\Sql\SqlExpression.cs" />
+    <Compile Include="Data\Sql\SqlField.cs" />
+    <Compile Include="Data\Sql\SqlFunction.cs" />
+    <Compile Include="Data\Sql\Join.cs" />
+    <Compile Include="Data\Sql\JoinOn.cs" />
+    <Compile Include="Data\Sql\SqlParameter.cs" />
+    <Compile Include="Data\Sql\SqlProvider\BasicSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\AccessSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MsSql2005SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MsSql2008SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\SequenceNameAttribute.cs" />
+    <Compile Include="Data\Sql\SqlProvider\SybaseSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MsSqlSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MySqlSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\SqlCeSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\SQLiteSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\FirebirdSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\PostgreSQLSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\OracleSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\DB2SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\InformixSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\ISqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlQuery.cs" />
+    <Compile Include="Data\Sql\SqlTable.cs" />
+    <Compile Include="Data\Sql\SqlTableT.cs" />
+    <Compile Include="Data\Sql\SqlValue.cs" />
+    <Compile Include="Linq\Extensions.cs" />
+    <Compile Include="Mapping\AssociationAttribute.cs" />
+    <Compile Include="Mapping\Association.cs" />
+    <Compile Include="Mapping\ExpressionMapper.cs" />
+    <Compile Include="Mapping\InheritanceMappingAttribute.cs" />
+    <Compile Include="Mapping\MapRelationBase.cs" />
+    <Compile Include="Mapping\NotNullAttribute.cs" />
+    <Compile Include="Mapping\RelationAttribute.cs" />
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="Aspects\CacheAspect.cs" />
+    <Compile Include="Aspects\CacheAspectItem.cs" />
+    <Compile Include="Aspects\CacheAspectT.cs" />
+    <Compile Include="Aspects\CacheAttribute.cs" />
+    <Compile Include="Aspects\CallMethodInfo.cs" />
+    <Compile Include="Aspects\AsyncAttribute.cs" />
+    <Compile Include="Aspects\MethodCallCounter.cs" />
+    <Compile Include="Aspects\CounterAspect.cs" />
+    <Compile Include="Aspects\CounterAttribute.cs" />
+    <Compile Include="Aspects\NoCacheAttribute.cs" />
+    <Compile Include="Aspects\IInterceptor.cs" />
+    <Compile Include="Aspects\Interceptor.cs" />
+    <Compile Include="Aspects\InterceptCallInfo.cs" />
+    <Compile Include="Aspects\InterceptorAttribute.cs" />
+    <Compile Include="Aspects\InterceptResult.cs" />
+    <Compile Include="Aspects\InterceptType.cs" />
+    <Compile Include="Aspects\LogAttribute.cs" />
+    <Compile Include="Aspects\LoggingAspect.cs" />
+    <Compile Include="Aspects\MixinAttribute.cs" />
+    <Compile Include="Aspects\MixinOverrideAttribute.cs" />
+    <Compile Include="Aspects\NoCounterAttribute.cs" />
+    <Compile Include="Aspects\NoInterceptionAttribute.cs" />
+    <Compile Include="Aspects\NoLogAttribute.cs" />
+    <Compile Include="Aspects\NotNullAttribute.cs" />
+    <Compile Include="Common\CompoundValue.cs" />
+    <Compile Include="Common\Configuration.cs" />
+    <Compile Include="Common\Convert.cs" />
+    <Compile Include="Common\ConvertT.cs" />
+    <Compile Include="Common\EntityBase.cs" />
+    <Compile Include="Common\EntityBaseT.cs" />
+    <Compile Include="Common\IOperable.cs" />
+    <Compile Include="Common\Operator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="ComponentModel\BindingListImpl.cs" />
+    <Compile Include="ComponentModel\CustomTypeDescriptorImpl.cs" />
+    <Compile Include="ComponentModel\Design\ObjectViewTypeEditor.cs" />
+    <Compile Include="ComponentModel\Design\GetTypeDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ComponentModel\Design\GetTypeDialog.Designer.cs">
+      <DependentUpon>GetTypeDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ComponentModel\Design\TypeNameEditor.cs" />
+    <Compile Include="ComponentModel\Design\TypePicker.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ComponentModel\Design\TypePicker.Designer.cs">
+      <DependentUpon>TypePicker.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ComponentModel\Design\ObjectViewTypeNameEditor.cs" />
+    <Compile Include="ComponentModel\ISortable.cs" />
+    <Compile Include="ComponentModel\IObjectView.cs" />
+    <Compile Include="ComponentModel\ITypeDescriptionProvider.cs" />
+    <Compile Include="ComponentModel\ObjectHolder.cs" />
+    <Compile Include="ComponentModel\TypeDescriptorExtender.cs" />
+    <Compile Include="ComponentModel\TypeDescriptorExtenderT.cs" />
+    <Compile Include="ComponentModel\TypedListImpl.cs" />
+    <Compile Include="ComponentModel\Design\TypeEditor.cs" />
+    <Compile Include="ComponentModel\TypeTypeConverter.cs" />
+    <Compile Include="DataAccess\ActionNameAttribute.cs" />
+    <Compile Include="DataAccess\ActionSprocNameAttribute.cs" />
+    <Compile Include="DataAccess\CommandBehaviorAttribute.cs" />
+    <Compile Include="DataAccess\ParamDbTypeAttribute.cs" />
+    <Compile Include="DataAccess\ParamSizeAttribute.cs" />
+    <Compile Include="DataAccess\DataSetTableAttribute.cs" />
+    <Compile Include="DataAccess\ParamNullValue.cs" />
+    <Compile Include="DataAccess\DataAccessorTA.cs" />
+    <Compile Include="DataAccess\Direction.cs" />
+    <Compile Include="DataAccess\DestinationAttribute.cs" />
+    <Compile Include="DataAccess\NoMapAttribute.cs" />
+    <Compile Include="DataAccess\ScalarSourceAttribute.cs" />
+    <Compile Include="DataAccess\FormatAttribute.cs" />
+    <Compile Include="DataAccess\DataAccessorAttribute.cs" />
+    <Compile Include="DataAccess\DataAccessor.cs" />
+    <Compile Include="DataAccess\DataAccessorBuilder.cs" />
+    <Compile Include="DataAccess\DataAccessorT.cs" />
+    <Compile Include="DataAccess\DiscoverParametersAttribute.cs" />
+    <Compile Include="DataAccess\IndexAttribute.cs" />
+    <Compile Include="DataAccess\NonUpdatableAttribute.cs" />
+    <Compile Include="DataAccess\ObjectTypeAttribute.cs" />
+    <Compile Include="DataAccess\ParamNameAttribute.cs" />
+    <Compile Include="DataAccess\PrimaryKeyAttribute.cs" />
+    <Compile Include="DataAccess\DataAccessException.cs" />
+    <Compile Include="DataAccess\ScalarFieldNameAttribute.cs" />
+    <Compile Include="DataAccess\SprocNameAttribute.cs" />
+    <Compile Include="DataAccess\SprocQuery.cs" />
+    <Compile Include="DataAccess\SprocQueryT.cs" />
+    <Compile Include="DataAccess\SqlQuery.cs" />
+    <Compile Include="DataAccess\SqlQueryAttribute.cs" />
+    <Compile Include="DataAccess\SqlQueryBase.cs" />
+    <Compile Include="DataAccess\SqlQueryInfo.cs" />
+    <Compile Include="DataAccess\SqlQueryParameterInfo.cs" />
+    <Compile Include="DataAccess\SqlQueryT.cs" />
+    <Compile Include="DataAccess\TableNameAttribute.cs" />
+    <Compile Include="Common\NameOrIndexParameter.cs" />
+    <Compile Include="Data\InitCommandEventArgs.cs" />
+    <Compile Include="Data\OperationExceptionEventArgs.cs" />
+    <Compile Include="Data\DataProvider\OracleDataProvider.cs" />
+    <Compile Include="Data\OperationTypeEventArgs.cs" />
+    <Compile Include="Data\ScalarSourceType.cs" />
+    <Compile Include="Data\DataException.cs" />
+    <Compile Include="Data\DataProvider\AccessDataProvider.cs" />
+    <Compile Include="Data\DataProvider\ConvertType.cs" />
+    <Compile Include="Data\DataProvider\DataProviderBase.cs" />
+    <Compile Include="Data\DataProvider\OdbcDataProvider.cs" />
+    <Compile Include="Data\DataProvider\OleDbDataProvider.cs" />
+    <Compile Include="Data\DataProvider\SqlDataProviderBase.cs" />
+    <Compile Include="Data\DbManager.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Data\DbManager.Config.cs">
+      <DependentUpon>DbManager.cs</DependentUpon>
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Data\DbManager.Linq.cs">
+      <DependentUpon>DbManager.cs</DependentUpon>
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Data\OperationType.cs" />
+    <Compile Include="EditableObjects\EditableXmlDocument.cs" />
+    <Compile Include="EditableObjects\EditableList.cs" />
+    <Compile Include="EditableObjects\EditableListChangedEventArgs.cs" />
+    <Compile Include="ComponentModel\MemberPropertyDescriptor.cs" />
+    <Compile Include="ComponentModel\PropertyDescriptorWrapper.cs" />
+    <Compile Include="EditableObjects\EditableArrayList.cs" />
+    <Compile Include="EditableObjects\EditableObject.cs" />
+    <Compile Include="EditableObjects\EditableObjectHolder.cs" />
+    <Compile Include="EditableObjects\EditableObjectT.cs" />
+    <Compile Include="EditableObjects\EditableValue.cs" />
+    <Compile Include="EditableObjects\IEditable.cs" />
+    <Compile Include="Mapping\SimpleSourceListMapper.cs" />
+    <Compile Include="Mapping\MapImplicitAttribute.cs" />
+    <Compile Include="Mapping\MapSetDataT.cs" />
+    <Compile Include="Mapping\ValueMapping.cs" />
+    <Compile Include="Mapping\MapDataDestinationBase.cs" />
+    <Compile Include="Mapping\MapDataSourceBase.cs" />
+    <Compile Include="Mapping\ScalarDataReaderMapper.cs" />
+    <Compile Include="Mapping\SimpleDestinationListMapper.cs" />
+    <Compile Include="Mapping\ScalarListMapper.cs" />
+    <Compile Include="Mapping\ScalarListMapperT.cs" />
+    <Compile Include="Mapping\TextDataListMapper.cs" />
+    <Compile Include="Mapping\TextDataMapper.cs" />
+    <Compile Include="Mapping\TextDataReader.cs" />
+    <Compile Include="Mapping\TextDataWriter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Mapping\MapGetDataT.cs" />
+    <Compile Include="Mapping\MapDataSourceDestinationBase.cs" />
+    <Compile Include="Mapping\DefaultMappingSchema.cs" />
+    <Compile Include="Mapping\IValueMapper.cs" />
+    <Compile Include="Mapping\NullDateTimeAttribute.cs" />
+    <Compile Include="Mapping\NullDecimalAttribute.cs" />
+    <Compile Include="Mapping\NullGuidAttribute.cs" />
+    <Compile Include="Patterns\DuckTyping.cs" />
+    <Compile Include="Patterns\DuckType.cs" />
+    <Compile Include="Patterns\MustImplementAttribute.cs" />
+    <Compile Include="Properties\JetBrains.Annotations.cs" />
+    <Compile Include="Properties\Revision.generated.cs" />
+    <Compile Include="Reflection\ExprMemberAccessor.cs" />
+    <Compile Include="Reflection\ExprTypeAccessor.cs" />
+    <Compile Include="Reflection\GenericBinder.cs" />
+    <Compile Include="Reflection\MetadataProvider\AttributeMetadataProvider.cs" />
+    <Compile Include="Reflection\MetadataProvider\ExtensionMetadataProvider.cs" />
+    <Compile Include="Reflection\MetadataProvider\LinqMetadataProvider.cs" />
+    <Compile Include="Reflection\MetadataProvider\MetadataProviderBase.cs" />
+    <Compile Include="Reflection\MetadataProvider\MetadataProviderList.cs" />
+    <Compile Include="Reflection\XmlIncludeAbstractAttribute.cs" />
+    <Compile Include="ServiceModel\ILinqService.cs" />
+    <Compile Include="ServiceModel\LinqService.cs" />
+    <Compile Include="ServiceModel\LinqServiceClient.cs" />
+    <Compile Include="ServiceModel\LinqServiceQuery.cs" />
+    <Compile Include="ServiceModel\LinqServiceResult.cs" />
+    <Compile Include="ServiceModel\LinqServiceSerializer.cs" />
+    <Compile Include="ServiceModel\RemoteDataContextBase.cs" />
+    <Compile Include="ServiceModel\ServiceModelDataContext.cs" />
+    <Compile Include="ServiceModel\ServiceModelDataReader.cs" />
+    <Compile Include="TypeBuilder\AutoImplementInterfaceAttribute.cs" />
+    <Compile Include="TypeBuilder\Builders\GeneratedAttributeBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\DuckTypeBuilder.cs" />
+    <Compile Include="TypeBuilder\GenerateAttributeAttribute.cs" />
+    <Compile Include="TypeBuilder\ISetParent.cs" />
+    <Compile Include="EditableObjects\IMemberwiseEditable.cs" />
+    <Compile Include="ComponentModel\INotifyObjectEdit.cs" />
+    <Compile Include="EditableObjects\IPrintDebugState.cs" />
+    <Compile Include="ComponentModel\ObjectBinder.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="ComponentModel\ObjectEditEventArgs.cs" />
+    <Compile Include="ComponentModel\ObjectEditType.cs" />
+    <Compile Include="Mapping\DictionaryIndexListMapperT.cs" />
+    <Compile Include="Mapping\DictionaryListMapperT.cs" />
+    <Compile Include="Mapping\DictionaryIndexListMapper.cs" />
+    <Compile Include="Mapping\DictionaryListMapper.cs" />
+    <Compile Include="Mapping\DictionaryMapper.cs" />
+    <Compile Include="Mapping\EnumeratorMapper.cs" />
+    <Compile Include="Mapping\DataReaderListMapper.cs" />
+    <Compile Include="Mapping\DataReaderMapper.cs" />
+    <Compile Include="Mapping\DataTableMapper.cs" />
+    <Compile Include="Mapping\DataRowMapper.cs" />
+    <Compile Include="Mapping\DefaultMemberMapper.cs" />
+    <Compile Include="Mapping\DefaultValueAttribute.cs" />
+    <Compile Include="Mapping\IMapDataDestination.cs" />
+    <Compile Include="Mapping\IMapDataDestinationList.cs" />
+    <Compile Include="Mapping\IMapDataSource.cs" />
+    <Compile Include="Mapping\IMapDataSourceList.cs" />
+    <Compile Include="Mapping\ISupportMapping.cs" />
+    <Compile Include="Mapping\Map.cs" />
+    <Compile Include="Mapping\MapFieldAttribute.cs" />
+    <Compile Include="Mapping\MapIgnoreAttribute.cs" />
+    <Compile Include="Mapping\MapIndex.cs" />
+    <Compile Include="Mapping\MapMemberInfo.cs" />
+    <Compile Include="Mapping\MapNextResult.cs" />
+    <Compile Include="Mapping\MappingException.cs" />
+    <Compile Include="Mapping\MappingSchema.cs" />
+    <Compile Include="Mapping\MapRelation.cs" />
+    <Compile Include="Mapping\MapResultSet.cs" />
+    <Compile Include="Mapping\MapValue.cs" />
+    <Compile Include="Mapping\MapValueAttribute.cs" />
+    <Compile Include="Reflection\Extension\AttributeNameCollection.cs" />
+    <Compile Include="Reflection\Extension\TypeExtensionException.cs" />
+    <Compile Include="Reflection\Extension\TypeExtensionAttribute.cs" />
+    <Compile Include="Mapping\MemberMapperAttribute.cs" />
+    <Compile Include="Mapping\NullableAttribute.cs" />
+    <Compile Include="Mapping\NullValueAttribute.cs" />
+    <Compile Include="Mapping\ObjectListMapper.cs" />
+    <Compile Include="Mapping\ObjectMapperT.cs" />
+    <Compile Include="Mapping\MemberMapper.cs" />
+    <Compile Include="Mapping\ObjectMapper.cs" />
+    <Compile Include="Mapping\ObjectMapperAttribute.cs" />
+    <Compile Include="Mapping\TrimmableAttribute.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Reflection\Emit\AssemblyBuilderHelper.cs" />
+    <Compile Include="Reflection\Emit\ConstructorBuilderHelper.cs" />
+    <Compile Include="Reflection\Emit\EmitHelper.cs" />
+    <Compile Include="Reflection\Emit\MethodBuilderBase.cs" />
+    <Compile Include="Reflection\Emit\MethodBuilderHelper.cs" />
+    <Compile Include="Reflection\Emit\TypeBuilderHelper.cs" />
+    <Compile Include="Reflection\IObjectFactory.cs" />
+    <Compile Include="Reflection\MemberAccessor.cs" />
+    <Compile Include="Reflection\ObjectFactoryAttribute.cs" />
+    <Compile Include="Reflection\TypeAccessorT.cs" />
+    <Compile Include="Reflection\TypeHelper.cs" />
+    <Compile Include="TypeBuilder\Builders\AbstractClassBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\AbstractTypeBuilderBase.cs" />
+    <Compile Include="TypeBuilder\BLToolkitGeneratedAttribute.cs" />
+    <Compile Include="TypeBuilder\Builders\AbstractTypeBuilderList.cs" />
+    <Compile Include="TypeBuilder\Builders\BuildContext.cs" />
+    <Compile Include="TypeBuilder\Builders\BuildElement.cs" />
+    <Compile Include="TypeBuilder\Builders\BuildStep.cs" />
+    <Compile Include="TypeBuilder\Builders\DefaultTypeBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\FakeGetter.cs" />
+    <Compile Include="TypeBuilder\Builders\FakeMethodInfo.cs" />
+    <Compile Include="TypeBuilder\Builders\FakeParameterInfo.cs" />
+    <Compile Include="TypeBuilder\Builders\FakeSetter.cs" />
+    <Compile Include="TypeBuilder\Builders\ImplementInterfaceBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\PropertyChangedBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\TypeAccessorBuilder.cs" />
+    <Compile Include="TypeBuilder\GlobalInstanceTypeAttribute.cs" />
+    <Compile Include="TypeBuilder\Builders\IAbstractTypeBuilder.cs" />
+    <Compile Include="Reflection\InitContext.cs" />
+    <Compile Include="TypeBuilder\Builders\InstanceTypeBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\TypeBuilderConsts.cs" />
+    <Compile Include="TypeBuilder\DefaultInstanceTypeAttribute.cs" />
+    <Compile Include="TypeBuilder\GetValueAttribute.cs" />
+    <Compile Include="TypeBuilder\ImplementInterfaceAttribute.cs" />
+    <Compile Include="TypeBuilder\InstanceTypeAttribute.cs" />
+    <Compile Include="TypeBuilder\IPropertyChanged.cs" />
+    <Compile Include="TypeBuilder\LazyInstanceAttribute.cs" />
+    <Compile Include="TypeBuilder\LazyInstancesAttribute.cs" />
+    <Compile Include="TypeBuilder\NoInstanceAttribute.cs" />
+    <Compile Include="TypeBuilder\ParameterAttribute.cs" />
+    <Compile Include="TypeBuilder\ParentAttribute.cs" />
+    <Compile Include="TypeBuilder\PropertyChangedAttribute.cs" />
+    <Compile Include="TypeBuilder\PropertyInfoAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfFalseAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfNonZeroAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfNotNullAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfNullAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfTrueAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfZeroAttribute.cs" />
+    <Compile Include="TypeBuilder\SetValueAttribute.cs" />
+    <Compile Include="TypeBuilder\TypeBuilderException.cs" />
+    <Compile Include="TypeBuilder\Builders\ITypeBuilder.cs" />
+    <Compile Include="Reflection\TypeAccessor.cs" />
+    <Compile Include="TypeBuilder\Builders\TypeBuilderAttribute.cs" />
+    <Compile Include="TypeBuilder\TypeFactory.cs" />
+    <Compile Include="Reflection\Extension\AttributeExtensionCollection.cs" />
+    <Compile Include="Reflection\Extension\ValueCollection.cs" />
+    <Compile Include="Reflection\Extension\MemberExtensionCollection.cs" />
+    <Compile Include="Reflection\Extension\TypeExtension.cs" />
+    <Compile Include="Reflection\Extension\ExtensionList.cs" />
+    <Compile Include="Reflection\Extension\AttributeExtension.cs" />
+    <Compile Include="Reflection\Extension\MemberExtension.cs" />
+    <Compile Include="Validation\FriendlyNameAttribute.cs" />
+    <Compile Include="Validation\IValidatable.cs" />
+    <Compile Include="Validation\MaxDateValueAttribute.cs" />
+    <Compile Include="Validation\MaxLengthAttribute.cs" />
+    <Compile Include="Validation\MaxValueAttribute.cs" />
+    <Compile Include="Validation\MinDateValueAttribute.cs" />
+    <Compile Include="Validation\MinLengthAttribute.cs" />
+    <Compile Include="Validation\MinValueAttribute.cs" />
+    <Compile Include="Validation\RegExAttribute.cs" />
+    <Compile Include="Validation\RequiredAttribute.cs" />
+    <Compile Include="Validation\ValidationException.cs" />
+    <Compile Include="Validation\ValidatableObjectBase.cs" />
+    <Compile Include="Validation\ValidationContext.cs" />
+    <Compile Include="Validation\Validator.cs" />
+    <Compile Include="Validation\ValidatorBaseAttribute.cs" />
+    <Compile Include="Net\HttpReader.cs" />
+    <Compile Include="Web\UI\Design\WebObjectBinderDesigner.cs" />
+    <Compile Include="Web\UI\WebObjectBinder.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="ComponentModel\Design\GetTypeDialog.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>GetTypeDialog.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ComponentModel\Design\TypePicker.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>TypePicker.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="ComponentModel\Design\Object.bmp" />
+    <EmbeddedResource Include="ComponentModel\ObjectBinder.resx">
+      <DependentUpon>ObjectBinder.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="ComponentModel\ObjectBinder.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Mapping\Mapping.xsd">
+      <SubType>
+      </SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DataAccess\DataAccess.xsd">
+      <SubType>
+      </SubType>
+    </EmbeddedResource>
+    <None Include="BLToolkit.snk" />
+    <None Include="Common\Convert.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>Convert.generated.cs</LastGenOutput>
+    </None>
+    <None Include="DataAccess\DataAccess.xsx">
+      <DependentUpon>DataAccess.xsd</DependentUpon>
+    </None>
+    <None Include="Doc\BLToolkit.chm" />
+    <None Include="Doc\Development rules and regulations.doc" />
+    <None Include="Mapping\Mapping.xsx">
+      <DependentUpon>Mapping.xsd</DependentUpon>
+    </None>
+    <EmbeddedResource Include="Reflection\Extension\TypeExtension.xsd">
+      <SubType>
+      </SubType>
+    </EmbeddedResource>
+    <None Include="Mapping\MemberMapper.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>MemberMapper.generated.cs</LastGenOutput>
+    </None>
+    <None Include="Reflection\Extension\TypeExtension.xsx">
+      <DependentUpon>TypeExtension.xsd</DependentUpon>
+    </None>
+    <None Include="Properties\Revision.tt">
+    </None>
+    <None Include="Templates\BLT4Toolkit.ttinclude" />
+    <None Include="Templates\BLToolkit.ttinclude" />
+    <None Include="Templates\ValidationAttributes.ttinclude" />
+    <None Include="Templates\MySql.ttinclude" />
+    <None Include="Templates\PluralSingular.ttinclude" />
+    <None Include="Templates\MSSQL.ttinclude" />
+    <None Include="Templates\BLToolkitConstants.Revision.cs.template" />
+    <None Include="Templates\PostgreSQL.ttinclude" />
+    <None Include="Templates\Sybase.ttinclude" />
+    <None Include="Templates\VB.ttinclude" />
+    <None Include="Templates\WCFAttributes.ttinclude" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="ComponentModel\ObjectBinder.bmp" />
+    <EmbeddedResource Include="Data\Sql\ReservedWords.txt" />
+    <Content Include="Doc\ChangeLog.txt" />
+    <Content Include="Doc\License.txt" />
+    <Content Include="Doc\OnlineDoc.txt" />
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <SubType>Designer</SubType>
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Web\UI\WebObjectBinder.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/BLToolkit.4.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,817 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{0C325F5D-E50E-4340-8724-D29896CCC583}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit</RootNamespace>
+    <AssemblyName>BLToolkit.4</AssemblyName>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>BLToolkit.snk</AssemblyOriginatorKeyFile>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;FW4;OVERRIDETOSTRING;</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRules>
+    </CodeAnalysisRules>
+    <CodeAnalysisRuleSet>Migrated rules for BLToolkit.4.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE;FW4;OVERRIDETOSTRING;NEW_PARSER</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRules>
+    </CodeAnalysisRules>
+    <CodeAnalysisRuleSet>Migrated rules for BLToolkit.4 (2).ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug FW 3.5|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\Debug FW 3.5\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;FW3;TRACE_PARSING1;OVERRIDETOSTRING1</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\BLToolkit.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>Migrated rules for BLToolkit.4.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <WarningLevel>4</WarningLevel>
+    <Optimize>false</Optimize>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;FW4;MONO;OVERRIDETOSTRING;NEW_PARSER</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\BLToolkit.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>Migrated rules for BLToolkit.4.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+    <WarningLevel>4</WarningLevel>
+    <Optimize>false</Optimize>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE;FW4;MONO;OVERRIDETOSTRING</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\BLToolkit.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>Migrated rules for BLToolkit.4 (2).ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+    </Reference>
+    <Reference Include="System.Core">
+    </Reference>
+    <Reference Include="System.Data">
+    </Reference>
+    <Reference Include="System.Data.Linq">
+    </Reference>
+    <Reference Include="System.Data.Services" />
+    <Reference Include="System.Design">
+    </Reference>
+    <Reference Include="System.Drawing">
+    </Reference>
+    <Reference Include="System.Runtime.Serialization">
+    </Reference>
+    <Reference Include="System.ServiceModel">
+    </Reference>
+    <Reference Include="System.Web">
+    </Reference>
+    <Reference Include="System.Web.Services" />
+    <Reference Include="System.Windows.Forms">
+    </Reference>
+    <Reference Include="System.Xml">
+    </Reference>
+    <Reference Include="System.Configuration">
+    </Reference>
+    <Reference Include="System.Xml.Linq" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Common\Convert.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>Convert.generated.cs</LastGenOutput>
+    </None>
+    <None Include="Data\DataProvider\FdpDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\MySqlDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\OdpDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\SqlCeDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\SQLiteDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\SybaseDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\SybaseAdoDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\DB2DataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\InformixDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\PostgreSQLDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <Compile Include="Aspects\Builders\AsyncAspectBuilder.cs" />
+    <Compile Include="Aspects\Builders\InterceptorAspectBuilder.cs" />
+    <Compile Include="Aspects\Builders\MixinAspectBuilder.cs" />
+    <Compile Include="Aspects\Builders\NotNullAspectBuilder.cs" />
+    <Compile Include="Aspects\Builders\OverloadAspectBuilder.cs" />
+    <Compile Include="Aspects\ClearCacheAspect.cs" />
+    <Compile Include="Aspects\Builders\ClearCacheAspectBuilder.cs" />
+    <Compile Include="Aspects\ClearCacheAttribute.cs" />
+    <Compile Include="Aspects\InstanceCacheAttribute.cs" />
+    <Compile Include="Aspects\OverloadAttribute.cs" />
+    <Compile Include="Common\ArrayT.cs" />
+    <Compile Include="Common\Convert.generated.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Convert.tt</DependentUpon>
+    </Compile>
+    <Compile Include="Common\Tuple.cs" />
+    <Compile Include="Configuration\ElementBase.cs" />
+    <Compile Include="Configuration\ElementCollectionBase.cs" />
+    <Compile Include="Configuration\DataProviderElement.cs" />
+    <Compile Include="Configuration\DataProviderElementCollection.cs" />
+    <Compile Include="Configuration\BLToolkitSection.cs" />
+    <Compile Include="Configuration\TypeFactoryElement.cs" />
+    <Compile Include="DataAccess\ActualTypeAttribute.cs" />
+    <Compile Include="DataAccess\IdentityAttribute.cs" />
+    <Compile Include="DataAccess\DataAccessorBase.cs" />
+    <Compile Include="DataAccess\DbTypeAttribute.cs" />
+    <Compile Include="DataAccess\ISqlQueryT.cs" />
+    <Compile Include="DataAccess\ParamTypeNameAttribute.cs" />
+    <Compile Include="DataAccess\PrimaryKeyGeneratorType.cs" />
+    <Compile Include="DataAccess\SequenceKeyGenerator.cs" />
+    <Compile Include="DataAccess\SqlIgnoreAttribute.cs" />
+    <Compile Include="DataAccess\ScalarAttribute.cs" />
+    <Compile Include="Data\DataExceptionType.cs" />
+    <Compile Include="Data\DataProvider\Sql2005DataProvider.cs" />
+    <Compile Include="Data\DataProvider\DataProviderInterpreterBase.cs" />
+    <Compile Include="Data\DataProvider\Interpreters\OracleDataProviderInterpreter.cs" />
+    <Compile Include="Data\DataProvider\Interpreters\SqliteDataProviderInterpreter.cs" />
+    <Compile Include="Data\DataProvider\OracleHelper.cs" />
+    <Compile Include="Data\DataProvider\Sql2000DataProvider.cs" />
+    <Compile Include="Data\DataProvider\FirebirdMappingSchema.cs" />
+    <Compile Include="Data\DataProvider\Sql2008DataProvider.cs" />
+    <Compile Include="Data\DataProvider\Sql2012DataProvider.cs" />
+    <Compile Include="Data\DataProvider\SqlDataProvider.cs" />
+    <Compile Include="Data\DataProvider\ProviderName.cs" />
+    <Compile Include="Data\DbConnectionFactory.cs" />
+    <Compile Include="Data\IDataReaderEx.cs" />
+    <Compile Include="Data\IDbConnectionFactory.cs" />
+    <Compile Include="Data\Linq\Builder\AsUpdatableBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ConcatUnionBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ContainsBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\AllAnyBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\CastBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\InsertOrUpdateBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionHoder.cs" />
+    <Compile Include="Data\Linq\Builder\IsExpressionResult.cs" />
+    <Compile Include="Data\Linq\Builder\OfTypeBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\IntersectBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\PassThroughContext.cs" />
+    <Compile Include="Data\Linq\Builder\SequenceConvertInfo.cs" />
+    <Compile Include="Data\Linq\Builder\SequenceConvertPath.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionTestGenerator.cs" />
+    <Compile Include="Data\Linq\Builder\UpdateBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\DeleteBuilder.cs" />
+    <Compile Include="Data\Linq\CompiledQuery.cs" />
+    <Compile Include="Data\Linq\CompiledTableT.cs" />
+    <Compile Include="Data\Linq\ITable.cs" />
+    <Compile Include="Data\Linq\DataContext.cs" />
+    <Compile Include="Data\Linq\DataContextInfo.cs" />
+    <Compile Include="Data\Linq\DataContextTransaction.cs" />
+    <Compile Include="Data\Linq\DefaultDataContextInfo.cs" />
+    <Compile Include="Data\Linq\Builder\PassThroughBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ChangeTypeExpression.cs" />
+    <Compile Include="Data\Linq\Builder\DefaultIfEmptyBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\InsertBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\BuildInfo.cs" />
+    <Compile Include="Data\Linq\Builder\SelectManyBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\SqlInfo.cs" />
+    <Compile Include="Data\Linq\Builder\TableAttributeBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\TakeSkipBuilder.cs" />
+    <Compile Include="Data\Linq\IExpressionQuery.cs" />
+    <Compile Include="Data\Linq\MemberInfoComparer.cs" />
+    <Compile Include="Data\Linq\QueryableAccessor.cs" />
+    <Compile Include="Data\Linq\TableT.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MsSql2000SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MsSql2012SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlValueBase.cs" />
+    <Compile Include="Linq\ExpressionHelper.cs" />
+    <Compile Include="Data\Linq\ExpressionQueryImpl.cs" />
+    <Compile Include="Data\Linq\IDataContextInfo.cs" />
+    <Compile Include="Data\Linq\IgnoreIEnumerableAttribute.cs" />
+    <Compile Include="Data\Linq\IQueryContext.cs" />
+    <Compile Include="Data\Linq\ISelectInsertable.cs" />
+    <Compile Include="Data\Linq\Expressions.cs" />
+    <Compile Include="Data\Linq\IValueInsertable.cs" />
+    <Compile Include="Data\Linq\LinqExtensions.cs" />
+    <Compile Include="Data\Linq\Builder\AggregationBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ConvertFlags.cs" />
+    <Compile Include="Data\Linq\Builder\CountBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\DistinctBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionBuilder.SqlBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionBuilder.QueryBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\FirstSingleBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\GroupByBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\IBuildContext.cs" />
+    <Compile Include="Data\Linq\Builder\ISequenceBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\JoinBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\MethodCallBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\OrderByBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionContext.cs" />
+    <Compile Include="Data\Linq\Builder\RequestFor.cs" />
+    <Compile Include="Data\Linq\Builder\ScalarSelectBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\SelectContext.cs" />
+    <Compile Include="Data\Linq\Builder\SelectBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\SequenceContextBase.cs" />
+    <Compile Include="Data\Linq\Builder\SubQueryContext.cs" />
+    <Compile Include="Data\Linq\Builder\TableBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\WhereBuilder.cs" />
+    <Compile Include="Data\Linq\Query.cs" />
+    <Compile Include="Data\Linq\Settings.cs" />
+    <Compile Include="Data\Linq\SqlEnumAttribute.cs" />
+    <Compile Include="Data\Linq\Extensions.cs" />
+    <Compile Include="Data\Linq\IUpdatable.cs" />
+    <Compile Include="Data\Linq\MethodExpressionAttribute.cs" />
+    <Compile Include="Data\Linq\SqlExpressionAttribute.cs" />
+    <Compile Include="Data\Linq\IDataContext.cs" />
+    <Compile Include="Data\Linq\QueryContext.cs" />
+    <Compile Include="Data\Linq\SqlPropertyAttribute.cs" />
+    <Compile Include="Data\Linq\LinqException.cs" />
+    <Compile Include="Data\Linq\ReflectionHelper.cs" />
+    <Compile Include="Data\Linq\Sql.cs" />
+    <Compile Include="Data\Linq\SqlFunctionAttribute.cs" />
+    <Compile Include="Data\Linq\TableExpressionAttribute.cs" />
+    <Compile Include="Data\Linq\TableFunctionAttribute.cs" />
+    <Compile Include="Data\Linq\ExpressionQuery.cs" />
+    <Compile Include="Data\Sql\ChildContainer.cs" />
+    <Compile Include="Data\Sql\ICloneableElement.cs" />
+    <Compile Include="Data\Sql\ISqlExpressionWalkable.cs" />
+    <Compile Include="Data\Sql\IValueContainer.cs" />
+    <Compile Include="Data\Sql\QueryElementType.cs" />
+    <Compile Include="Data\Sql\QueryType.cs" />
+    <Compile Include="Data\Sql\QueryVisitor.cs" />
+    <Compile Include="Data\Sql\SqlDataType.cs" />
+    <Compile Include="Data\Sql\ISqlPredicate.cs" />
+    <Compile Include="Data\Sql\Precedence.cs" />
+    <Compile Include="Data\Sql\SqlBinaryExpression.cs" />
+    <Compile Include="Data\Sql\SqlException.cs" />
+    <Compile Include="Data\Sql\Extensions.cs" />
+    <Compile Include="Data\Sql\IChild.cs" />
+    <Compile Include="Data\Sql\IQueryElement.cs" />
+    <Compile Include="Data\Sql\ISqlExpression.cs" />
+    <Compile Include="Data\Sql\ISqlTableSource.cs" />
+    <Compile Include="Data\Sql\SqlExpression.cs" />
+    <Compile Include="Data\Sql\SqlField.cs" />
+    <Compile Include="Data\Sql\SqlFunction.cs" />
+    <Compile Include="Data\Sql\Join.cs" />
+    <Compile Include="Data\Sql\JoinOn.cs" />
+    <Compile Include="Data\Sql\SqlParameter.cs" />
+    <Compile Include="Data\Sql\SqlProvider\BasicSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\AccessSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MsSql2005SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MsSql2008SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\SequenceNameAttribute.cs" />
+    <Compile Include="Data\Sql\SqlProvider\SybaseSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MsSqlSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MySqlSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\SqlCeSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\SQLiteSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\FirebirdSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\PostgreSQLSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\OracleSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\DB2SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\InformixSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\ISqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlQuery.cs" />
+    <Compile Include="Data\Sql\SqlTable.cs" />
+    <Compile Include="Data\Sql\SqlTableT.cs" />
+    <Compile Include="Data\Sql\SqlTableType.cs" />
+    <Compile Include="Data\Sql\SqlValue.cs" />
+    <Compile Include="Mapping\AssociationAttribute.cs" />
+    <Compile Include="Mapping\Association.cs" />
+    <Compile Include="Mapping\ExpressionMapIgnoreAttribute.cs" />
+    <Compile Include="Mapping\ExpressionMapper.cs" />
+    <Compile Include="Mapping\Fluent\AssociationMap.cs" />
+    <Compile Include="Mapping\Fluent\Attributes.cs" />
+    <Compile Include="Mapping\Fluent\FluentConfig.cs" />
+    <Compile Include="Mapping\Fluent\FluentMap.cs" />
+    <Compile Include="Mapping\Fluent\FluentMap.Interface.cs" />
+    <Compile Include="Mapping\Fluent\FluentMapHelper.cs" />
+    <Compile Include="Mapping\Fluent\IFluentMap.cs" />
+    <Compile Include="Mapping\Fluent\MapFieldMap.cs" />
+    <Compile Include="Mapping\Fluent\MappedProperty.cs" />
+    <Compile Include="Mapping\IMappingSchemaProvider.cs" />
+    <Compile Include="Mapping\InheritanceMappingAttribute.cs" />
+    <Compile Include="Mapping\MapRelationBase.cs" />
+    <Compile Include="Mapping\MemberMapper.generated.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>MemberMapper.tt</DependentUpon>
+    </Compile>
+    <Compile Include="Mapping\MemberMappers\BinarySerialisationMapper.cs" />
+    <Compile Include="Mapping\MemberMappers\BinarySerialisationToBase64StringMapper.cs" />
+    <Compile Include="Mapping\MemberMappers\TimeSpanBigIntMapper.cs" />
+    <Compile Include="Mapping\MemberMappers\JSONSerialisationMapper.cs" />
+    <Compile Include="Mapping\MemberMappers\XMLSerialisationMapper.cs" />
+    <Compile Include="Mapping\NotNullAttribute.cs" />
+    <Compile Include="Mapping\RelationAttribute.cs" />
+    <Compile Include="Properties\BLToolkitConstants.cs" />
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="Aspects\CacheAspect.cs" />
+    <Compile Include="Aspects\CacheAspectItem.cs" />
+    <Compile Include="Aspects\CacheAspectT.cs" />
+    <Compile Include="Aspects\CacheAttribute.cs" />
+    <Compile Include="Aspects\CallMethodInfo.cs" />
+    <Compile Include="Aspects\AsyncAttribute.cs" />
+    <Compile Include="Aspects\MethodCallCounter.cs" />
+    <Compile Include="Aspects\CounterAspect.cs" />
+    <Compile Include="Aspects\CounterAttribute.cs" />
+    <Compile Include="Aspects\NoCacheAttribute.cs" />
+    <Compile Include="Aspects\IInterceptor.cs" />
+    <Compile Include="Aspects\Interceptor.cs" />
+    <Compile Include="Aspects\InterceptCallInfo.cs" />
+    <Compile Include="Aspects\InterceptorAttribute.cs" />
+    <Compile Include="Aspects\InterceptResult.cs" />
+    <Compile Include="Aspects\InterceptType.cs" />
+    <Compile Include="Aspects\LogAttribute.cs" />
+    <Compile Include="Aspects\LoggingAspect.cs" />
+    <Compile Include="Aspects\MixinAttribute.cs" />
+    <Compile Include="Aspects\MixinOverrideAttribute.cs" />
+    <Compile Include="Aspects\NoCounterAttribute.cs" />
+    <Compile Include="Aspects\NoInterceptionAttribute.cs" />
+    <Compile Include="Aspects\NoLogAttribute.cs" />
+    <Compile Include="Aspects\NotNullAttribute.cs" />
+    <Compile Include="Common\CompoundValue.cs" />
+    <Compile Include="Common\Configuration.cs" />
+    <Compile Include="Common\Convert.cs" />
+    <Compile Include="Common\ConvertT.cs" />
+    <Compile Include="Common\EntityBase.cs" />
+    <Compile Include="Common\EntityBaseT.cs" />
+    <Compile Include="Common\IOperable.cs" />
+    <Compile Include="Common\Operator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="ComponentModel\BindingListImpl.cs" />
+    <Compile Include="ComponentModel\CustomTypeDescriptorImpl.cs" />
+    <Compile Include="ComponentModel\Design\ObjectViewTypeEditor.cs" />
+    <Compile Include="ComponentModel\Design\GetTypeDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ComponentModel\Design\GetTypeDialog.Designer.cs">
+      <DependentUpon>GetTypeDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ComponentModel\Design\TypeNameEditor.cs" />
+    <Compile Include="ComponentModel\Design\TypePicker.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ComponentModel\Design\TypePicker.Designer.cs">
+      <DependentUpon>TypePicker.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ComponentModel\Design\ObjectViewTypeNameEditor.cs" />
+    <Compile Include="ComponentModel\ISortable.cs" />
+    <Compile Include="ComponentModel\IObjectView.cs" />
+    <Compile Include="ComponentModel\ITypeDescriptionProvider.cs" />
+    <Compile Include="ComponentModel\ObjectHolder.cs" />
+    <Compile Include="ComponentModel\TypeDescriptorExtender.cs" />
+    <Compile Include="ComponentModel\TypeDescriptorExtenderT.cs" />
+    <Compile Include="ComponentModel\TypedListImpl.cs" />
+    <Compile Include="ComponentModel\Design\TypeEditor.cs" />
+    <Compile Include="ComponentModel\TypeTypeConverter.cs" />
+    <Compile Include="DataAccess\ActionNameAttribute.cs" />
+    <Compile Include="DataAccess\ActionSprocNameAttribute.cs" />
+    <Compile Include="DataAccess\CommandBehaviorAttribute.cs" />
+    <Compile Include="DataAccess\ParamDbTypeAttribute.cs" />
+    <Compile Include="DataAccess\ParamSizeAttribute.cs" />
+    <Compile Include="DataAccess\DataSetTableAttribute.cs" />
+    <Compile Include="DataAccess\ParamNullValue.cs" />
+    <Compile Include="DataAccess\DataAccessorTA.cs" />
+    <Compile Include="DataAccess\Direction.cs" />
+    <Compile Include="DataAccess\DestinationAttribute.cs" />
+    <Compile Include="DataAccess\NoMapAttribute.cs" />
+    <Compile Include="DataAccess\ScalarSourceAttribute.cs" />
+    <Compile Include="DataAccess\FormatAttribute.cs" />
+    <Compile Include="DataAccess\DataAccessorAttribute.cs" />
+    <Compile Include="DataAccess\DataAccessor.cs" />
+    <Compile Include="DataAccess\DataAccessorBuilder.cs" />
+    <Compile Include="DataAccess\DataAccessorT.cs" />
+    <Compile Include="DataAccess\DiscoverParametersAttribute.cs" />
+    <Compile Include="DataAccess\IndexAttribute.cs" />
+    <Compile Include="DataAccess\NonUpdatableAttribute.cs" />
+    <Compile Include="DataAccess\ObjectTypeAttribute.cs" />
+    <Compile Include="DataAccess\ParamNameAttribute.cs" />
+    <Compile Include="DataAccess\PrimaryKeyAttribute.cs" />
+    <Compile Include="DataAccess\DataAccessException.cs" />
+    <Compile Include="DataAccess\ScalarFieldNameAttribute.cs" />
+    <Compile Include="DataAccess\SprocNameAttribute.cs" />
+    <Compile Include="DataAccess\SprocQuery.cs" />
+    <Compile Include="DataAccess\SprocQueryT.cs" />
+    <Compile Include="DataAccess\SqlQuery.cs" />
+    <Compile Include="DataAccess\SqlQueryAttribute.cs" />
+    <Compile Include="DataAccess\SqlQueryBase.cs" />
+    <Compile Include="DataAccess\SqlQueryInfo.cs" />
+    <Compile Include="DataAccess\SqlQueryParameterInfo.cs" />
+    <Compile Include="DataAccess\SqlQueryT.cs" />
+    <Compile Include="DataAccess\TableNameAttribute.cs" />
+    <Compile Include="Common\NameOrIndexParameter.cs" />
+    <Compile Include="Data\InitCommandEventArgs.cs" />
+    <Compile Include="Data\OperationExceptionEventArgs.cs" />
+    <Compile Include="Data\OperationTypeEventArgs.cs" />
+    <Compile Include="Data\ScalarSourceType.cs" />
+    <Compile Include="Data\DataException.cs" />
+    <Compile Include="Data\DataProvider\AccessDataProvider.cs" />
+    <Compile Include="Data\DataProvider\ConvertType.cs" />
+    <Compile Include="Data\DataProvider\DataProviderBase.cs" />
+    <Compile Include="Data\DataProvider\OdbcDataProvider.cs" />
+    <Compile Include="Data\DataProvider\OleDbDataProvider.cs" />
+    <Compile Include="Data\DataProvider\SqlDataProviderBase.cs" />
+    <Compile Include="Data\DbManager.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Data\DbManager.Config.cs">
+      <DependentUpon>DbManager.cs</DependentUpon>
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Data\DbManager.Linq.cs">
+      <DependentUpon>DbManager.cs</DependentUpon>
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Data\OperationType.cs" />
+    <Compile Include="EditableObjects\EditableXmlDocument.cs" />
+    <Compile Include="EditableObjects\EditableList.cs" />
+    <Compile Include="EditableObjects\EditableListChangedEventArgs.cs" />
+    <Compile Include="ComponentModel\MemberPropertyDescriptor.cs" />
+    <Compile Include="ComponentModel\PropertyDescriptorWrapper.cs" />
+    <Compile Include="EditableObjects\EditableArrayList.cs" />
+    <Compile Include="EditableObjects\EditableObject.cs" />
+    <Compile Include="EditableObjects\EditableObjectHolder.cs" />
+    <Compile Include="EditableObjects\EditableObjectT.cs" />
+    <Compile Include="EditableObjects\EditableValue.cs" />
+    <Compile Include="EditableObjects\IEditable.cs" />
+    <Compile Include="Mapping\SimpleSourceListMapper.cs" />
+    <Compile Include="Mapping\MapImplicitAttribute.cs" />
+    <Compile Include="Mapping\MapSetDataT.cs" />
+    <Compile Include="Mapping\ValueMapping.cs" />
+    <Compile Include="Mapping\MapDataDestinationBase.cs" />
+    <Compile Include="Mapping\MapDataSourceBase.cs" />
+    <Compile Include="Mapping\ScalarDataReaderMapper.cs" />
+    <Compile Include="Mapping\SimpleDestinationListMapper.cs" />
+    <Compile Include="Mapping\ScalarListMapper.cs" />
+    <Compile Include="Mapping\ScalarListMapperT.cs" />
+    <Compile Include="Mapping\TextDataListMapper.cs" />
+    <Compile Include="Mapping\TextDataMapper.cs" />
+    <Compile Include="Mapping\TextDataReader.cs" />
+    <Compile Include="Mapping\TextDataWriter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Mapping\MapGetDataT.cs" />
+    <Compile Include="Mapping\MapDataSourceDestinationBase.cs" />
+    <Compile Include="Mapping\DefaultMappingSchema.cs" />
+    <Compile Include="Mapping\IValueMapper.cs" />
+    <Compile Include="Mapping\NullDateTimeAttribute.cs" />
+    <Compile Include="Mapping\NullDecimalAttribute.cs" />
+    <Compile Include="Mapping\NullGuidAttribute.cs" />
+    <Compile Include="Patterns\DuckTyping.cs" />
+    <Compile Include="Patterns\DuckType.cs" />
+    <Compile Include="Patterns\MustImplementAttribute.cs" />
+    <Compile Include="Properties\JetBrains.Annotations.cs" />
+    <Compile Include="Properties\Revision.generated.cs" />
+    <Compile Include="Reflection\ExprMemberAccessor.cs" />
+    <Compile Include="Reflection\ExprTypeAccessor.cs" />
+    <Compile Include="Reflection\GenericBinder.cs" />
+    <Compile Include="Reflection\MetadataProvider\AttributeMetadataProvider.cs" />
+    <Compile Include="Reflection\MetadataProvider\ExtensionMetadataProvider.cs" />
+    <Compile Include="Reflection\MetadataProvider\LinqMetadataProvider.cs" />
+    <Compile Include="Reflection\MetadataProvider\MetadataProviderBase.cs" />
+    <Compile Include="Reflection\MetadataProvider\MetadataProviderList.cs" />
+    <Compile Include="Reflection\XmlIncludeAbstractAttribute.cs" />
+    <Compile Include="ServiceModel\DataService.cs" />
+    <Compile Include="ServiceModel\ILinqSoapService.cs" />
+    <Compile Include="ServiceModel\LinqSoapServiceClient.cs" />
+    <Compile Include="ServiceModel\ILinqService.cs" />
+    <Compile Include="ServiceModel\LinqService.cs" />
+    <Compile Include="ServiceModel\LinqServiceClient.cs" />
+    <Compile Include="ServiceModel\LinqServiceQuery.cs" />
+    <Compile Include="ServiceModel\LinqServiceResult.cs" />
+    <Compile Include="ServiceModel\LinqServiceSerializer.cs" />
+    <Compile Include="ServiceModel\RemoteDataContextBase.cs" />
+    <Compile Include="ServiceModel\ServiceModelDataContext.cs" />
+    <Compile Include="ServiceModel\ServiceModelDataReader.cs" />
+    <Compile Include="ServiceModel\SoapDataContext.cs" />
+    <Compile Include="TypeBuilder\AutoImplementInterfaceAttribute.cs" />
+    <Compile Include="TypeBuilder\Builders\GeneratedAttributeBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\DuckTypeBuilder.cs" />
+    <Compile Include="TypeBuilder\GenerateAttributeAttribute.cs" />
+    <Compile Include="TypeBuilder\ISetParent.cs" />
+    <Compile Include="EditableObjects\IMemberwiseEditable.cs" />
+    <Compile Include="ComponentModel\INotifyObjectEdit.cs" />
+    <Compile Include="EditableObjects\IPrintDebugState.cs" />
+    <Compile Include="ComponentModel\ObjectBinder.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="ComponentModel\ObjectEditEventArgs.cs" />
+    <Compile Include="ComponentModel\ObjectEditType.cs" />
+    <Compile Include="Mapping\DictionaryIndexListMapperT.cs" />
+    <Compile Include="Mapping\DictionaryListMapperT.cs" />
+    <Compile Include="Mapping\DictionaryIndexListMapper.cs" />
+    <Compile Include="Mapping\DictionaryListMapper.cs" />
+    <Compile Include="Mapping\DictionaryMapper.cs" />
+    <Compile Include="Mapping\EnumeratorMapper.cs" />
+    <Compile Include="Mapping\DataReaderListMapper.cs" />
+    <Compile Include="Mapping\DataReaderMapper.cs" />
+    <Compile Include="Mapping\DataTableMapper.cs" />
+    <Compile Include="Mapping\DataRowMapper.cs" />
+    <Compile Include="Mapping\DefaultMemberMapper.cs" />
+    <Compile Include="Mapping\DefaultValueAttribute.cs" />
+    <Compile Include="Mapping\IMapDataDestination.cs" />
+    <Compile Include="Mapping\IMapDataDestinationList.cs" />
+    <Compile Include="Mapping\IMapDataSource.cs" />
+    <Compile Include="Mapping\IMapDataSourceList.cs" />
+    <Compile Include="Mapping\ISupportMapping.cs" />
+    <Compile Include="Mapping\Map.cs" />
+    <Compile Include="Mapping\MapFieldAttribute.cs" />
+    <Compile Include="Mapping\MapIgnoreAttribute.cs" />
+    <Compile Include="Mapping\MapIndex.cs" />
+    <Compile Include="Mapping\MapMemberInfo.cs" />
+    <Compile Include="Mapping\MapNextResult.cs" />
+    <Compile Include="Mapping\MappingException.cs" />
+    <Compile Include="Mapping\MappingSchema.cs" />
+    <Compile Include="Mapping\MapRelation.cs" />
+    <Compile Include="Mapping\MapResultSet.cs" />
+    <Compile Include="Mapping\MapValue.cs" />
+    <Compile Include="Mapping\MapValueAttribute.cs" />
+    <Compile Include="Reflection\Extension\AttributeNameCollection.cs" />
+    <Compile Include="Reflection\Extension\TypeExtensionException.cs" />
+    <Compile Include="Reflection\Extension\TypeExtensionAttribute.cs" />
+    <Compile Include="Mapping\MemberMapperAttribute.cs" />
+    <Compile Include="Mapping\NullableAttribute.cs" />
+    <Compile Include="Mapping\NullValueAttribute.cs" />
+    <Compile Include="Mapping\ObjectListMapper.cs" />
+    <Compile Include="Mapping\ObjectMapperT.cs" />
+    <Compile Include="Mapping\MemberMapper.cs" />
+    <Compile Include="Mapping\ObjectMapper.cs" />
+    <Compile Include="Mapping\ObjectMapperAttribute.cs" />
+    <Compile Include="Mapping\TrimmableAttribute.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Reflection\Emit\AssemblyBuilderHelper.cs" />
+    <Compile Include="Reflection\Emit\ConstructorBuilderHelper.cs" />
+    <Compile Include="Reflection\Emit\EmitHelper.cs" />
+    <Compile Include="Reflection\Emit\MethodBuilderBase.cs" />
+    <Compile Include="Reflection\Emit\MethodBuilderHelper.cs" />
+    <Compile Include="Reflection\Emit\TypeBuilderHelper.cs" />
+    <Compile Include="Reflection\IObjectFactory.cs" />
+    <Compile Include="Reflection\MemberAccessor.cs" />
+    <Compile Include="Reflection\ObjectFactoryAttribute.cs" />
+    <Compile Include="Reflection\TypeAccessorT.cs" />
+    <Compile Include="Reflection\TypeHelper.cs" />
+    <Compile Include="TypeBuilder\Builders\AbstractClassBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\AbstractTypeBuilderBase.cs" />
+    <Compile Include="TypeBuilder\BLToolkitGeneratedAttribute.cs" />
+    <Compile Include="TypeBuilder\Builders\AbstractTypeBuilderList.cs" />
+    <Compile Include="TypeBuilder\Builders\BuildContext.cs" />
+    <Compile Include="TypeBuilder\Builders\BuildElement.cs" />
+    <Compile Include="TypeBuilder\Builders\BuildStep.cs" />
+    <Compile Include="TypeBuilder\Builders\DefaultTypeBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\FakeGetter.cs" />
+    <Compile Include="TypeBuilder\Builders\FakeMethodInfo.cs" />
+    <Compile Include="TypeBuilder\Builders\FakeParameterInfo.cs" />
+    <Compile Include="TypeBuilder\Builders\FakeSetter.cs" />
+    <Compile Include="TypeBuilder\Builders\ImplementInterfaceBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\PropertyChangedBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\TypeAccessorBuilder.cs" />
+    <Compile Include="TypeBuilder\GlobalInstanceTypeAttribute.cs" />
+    <Compile Include="TypeBuilder\Builders\IAbstractTypeBuilder.cs" />
+    <Compile Include="Reflection\InitContext.cs" />
+    <Compile Include="TypeBuilder\Builders\InstanceTypeBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\TypeBuilderConsts.cs" />
+    <Compile Include="TypeBuilder\DefaultInstanceTypeAttribute.cs" />
+    <Compile Include="TypeBuilder\GetValueAttribute.cs" />
+    <Compile Include="TypeBuilder\ImplementInterfaceAttribute.cs" />
+    <Compile Include="TypeBuilder\InstanceTypeAttribute.cs" />
+    <Compile Include="TypeBuilder\IPropertyChanged.cs" />
+    <Compile Include="TypeBuilder\LazyInstanceAttribute.cs" />
+    <Compile Include="TypeBuilder\LazyInstancesAttribute.cs" />
+    <Compile Include="TypeBuilder\NoInstanceAttribute.cs" />
+    <Compile Include="TypeBuilder\ParameterAttribute.cs" />
+    <Compile Include="TypeBuilder\ParentAttribute.cs" />
+    <Compile Include="TypeBuilder\PropertyChangedAttribute.cs" />
+    <Compile Include="TypeBuilder\PropertyInfoAttribute.cs" />
+    <Compile Include="TypeBuilder\RefCursorAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfFalseAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfNonZeroAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfNotNullAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfNullAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfTrueAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfZeroAttribute.cs" />
+    <Compile Include="TypeBuilder\SetValueAttribute.cs" />
+    <Compile Include="TypeBuilder\TypeBuilderException.cs" />
+    <Compile Include="TypeBuilder\Builders\ITypeBuilder.cs" />
+    <Compile Include="Reflection\TypeAccessor.cs" />
+    <Compile Include="TypeBuilder\Builders\TypeBuilderAttribute.cs" />
+    <Compile Include="TypeBuilder\TypeFactory.cs" />
+    <Compile Include="Reflection\Extension\AttributeExtensionCollection.cs" />
+    <Compile Include="Reflection\Extension\ValueCollection.cs" />
+    <Compile Include="Reflection\Extension\MemberExtensionCollection.cs" />
+    <Compile Include="Reflection\Extension\TypeExtension.cs" />
+    <Compile Include="Reflection\Extension\ExtensionList.cs" />
+    <Compile Include="Reflection\Extension\AttributeExtension.cs" />
+    <Compile Include="Reflection\Extension\MemberExtension.cs" />
+    <Compile Include="Validation\FriendlyNameAttribute.cs" />
+    <Compile Include="Validation\IValidatable.cs" />
+    <Compile Include="Validation\MaxDateValueAttribute.cs" />
+    <Compile Include="Validation\MaxLengthAttribute.cs" />
+    <Compile Include="Validation\MaxValueAttribute.cs" />
+    <Compile Include="Validation\MinDateValueAttribute.cs" />
+    <Compile Include="Validation\MinLengthAttribute.cs" />
+    <Compile Include="Validation\MinValueAttribute.cs" />
+    <Compile Include="Validation\RegExAttribute.cs" />
+    <Compile Include="Validation\RequiredAttribute.cs" />
+    <Compile Include="Validation\ValidationException.cs" />
+    <Compile Include="Validation\ValidatableObjectBase.cs" />
+    <Compile Include="Validation\ValidationContext.cs" />
+    <Compile Include="Validation\Validator.cs" />
+    <Compile Include="Validation\ValidatorBaseAttribute.cs" />
+    <Compile Include="Net\HttpReader.cs" />
+    <Compile Include="Web\UI\WebObjectBinder.cs" />
+    <None Include="Mapping\MemberMapper.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>MemberMapper.generated.cs</LastGenOutput>
+    </None>
+    <None Include="Properties\Revision.tt">
+      <LastGenOutput>Revision1.generated.cs</LastGenOutput>
+    </None>
+    <None Include="Templates\BLT4Toolkit.ttinclude" />
+    <None Include="Templates\BLToolkit.ttinclude" />
+    <None Include="Templates\BLToolkitConstants.Revision.cs.template" />
+    <None Include="Templates\MySql.ttinclude" />
+    <None Include="Templates\MSSQL.ttinclude" />
+    <None Include="Templates\PluralSingular.ttinclude" />
+    <None Include="Templates\PostgreSQL.ttinclude" />
+    <None Include="Templates\Sybase.ttinclude" />
+    <None Include="Templates\VB.ttinclude" />
+    <None Include="Templates\WCFAttributes.ttinclude" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="ComponentModel\Design\GetTypeDialog.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>GetTypeDialog.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ComponentModel\Design\TypePicker.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>TypePicker.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="ComponentModel\Design\Object.bmp" />
+    <EmbeddedResource Include="ComponentModel\ObjectBinder.resx">
+      <DependentUpon>ObjectBinder.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="ComponentModel\ObjectBinder.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Mapping\Mapping.xsd">
+      <SubType>
+      </SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DataAccess\DataAccess.xsd">
+      <SubType>
+      </SubType>
+    </EmbeddedResource>
+    <None Include="BLToolkit.snk" />
+    <None Include="DataAccess\DataAccess.xsx">
+      <DependentUpon>DataAccess.xsd</DependentUpon>
+    </None>
+    <None Include="Doc\BLToolkit.chm" />
+    <None Include="Doc\Development rules and regulations.doc" />
+    <None Include="Mapping\Mapping.xsx">
+      <DependentUpon>Mapping.xsd</DependentUpon>
+    </None>
+    <EmbeddedResource Include="Reflection\Extension\TypeExtension.xsd">
+      <SubType>
+      </SubType>
+    </EmbeddedResource>
+    <None Include="Reflection\Extension\TypeExtension.xsx">
+      <DependentUpon>TypeExtension.xsd</DependentUpon>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="ComponentModel\ObjectBinder.bmp" />
+    <EmbeddedResource Include="Data\Sql\ReservedWords.txt" />
+    <Content Include="Doc\ChangeLog.txt" />
+    <Content Include="Doc\License.txt" />
+    <Content Include="Doc\OnlineDoc.txt" />
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <SubType>Designer</SubType>
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Web\UI\WebObjectBinder.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup />
+  <ItemGroup>
+    <Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/BLToolkit.4.csproj.DotSettings	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,2 @@
+<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
+	<s:String x:Key="/Default/CodeEditing/Localization/Localizable/@EntryValue">No</s:String></wpf:ResourceDictionary>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/BLToolkit.4.csproj.ReSharper	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,3 @@
+<Configuration>
+  <Localizable>No</Localizable>
+</Configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/BLToolkit.CP.4.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,769 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{0C325F5D-E50E-4340-8724-D29896CCC585}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit</RootNamespace>
+    <AssemblyName>BLToolkit.CP.4</AssemblyName>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>BLToolkit.snk</AssemblyOriginatorKeyFile>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile>Client</TargetFrameworkProfile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;FW4;OVERRIDETOSTRING;CLIENTPROFILE;</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRules>
+    </CodeAnalysisRules>
+    <CodeAnalysisRuleSet>Migrated rules for BLToolkit.4.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE;FW4;OVERRIDETOSTRING;CLIENTPROFILE;</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRules>
+    </CodeAnalysisRules>
+    <CodeAnalysisRuleSet>Migrated rules for BLToolkit.4 (2).ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug FW 3.5|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\Debug FW 3.5\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;FW3;TRACE_PARSING1;OVERRIDETOSTRING1;CLIENTPROFILE;</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\BLToolkit.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>Migrated rules for BLToolkit.4.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <WarningLevel>4</WarningLevel>
+    <Optimize>false</Optimize>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;FW4;MONO;OVERRIDETOSTRING;CLIENTPROFILE;</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\BLToolkit.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>Migrated rules for BLToolkit.4.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+    <WarningLevel>4</WarningLevel>
+    <Optimize>false</Optimize>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE;FW4;MONO;OVERRIDETOSTRING;CLIENTPROFILE;</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\BLToolkit.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>Migrated rules for BLToolkit.4 (2).ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+    </Reference>
+    <Reference Include="System.Core">
+    </Reference>
+    <Reference Include="System.Data">
+    </Reference>
+    <Reference Include="System.Data.Linq">
+    </Reference>
+    <Reference Include="System.Drawing">
+    </Reference>
+    <Reference Include="System.Runtime.Serialization">
+    </Reference>
+    <Reference Include="System.ServiceModel">
+    </Reference>
+    <Reference Include="System.Web.Services" />
+    <Reference Include="System.Windows.Forms">
+    </Reference>
+    <Reference Include="System.Xml">
+    </Reference>
+    <Reference Include="System.Configuration">
+    </Reference>
+    <Reference Include="System.Xml.Linq" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Common\Convert.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>Convert.generated.cs</LastGenOutput>
+    </None>
+    <None Include="Data\DataProvider\FdpDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\MySqlDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\OdpDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\SqlCeDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\SQLiteDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\SybaseDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\SybaseAdoDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\DB2DataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\InformixDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\PostgreSQLDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <Compile Include="Aspects\Builders\AsyncAspectBuilder.cs" />
+    <Compile Include="Aspects\Builders\InterceptorAspectBuilder.cs" />
+    <Compile Include="Aspects\Builders\MixinAspectBuilder.cs" />
+    <Compile Include="Aspects\Builders\NotNullAspectBuilder.cs" />
+    <Compile Include="Aspects\Builders\OverloadAspectBuilder.cs" />
+    <Compile Include="Aspects\ClearCacheAspect.cs" />
+    <Compile Include="Aspects\Builders\ClearCacheAspectBuilder.cs" />
+    <Compile Include="Aspects\ClearCacheAttribute.cs" />
+    <Compile Include="Aspects\InstanceCacheAttribute.cs" />
+    <Compile Include="Aspects\OverloadAttribute.cs" />
+    <Compile Include="Common\ArrayT.cs" />
+    <Compile Include="Common\Convert.generated.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Convert.tt</DependentUpon>
+    </Compile>
+    <Compile Include="Common\Tuple.cs" />
+    <Compile Include="Configuration\ElementBase.cs" />
+    <Compile Include="Configuration\ElementCollectionBase.cs" />
+    <Compile Include="Configuration\DataProviderElement.cs" />
+    <Compile Include="Configuration\DataProviderElementCollection.cs" />
+    <Compile Include="Configuration\BLToolkitSection.cs" />
+    <Compile Include="Configuration\TypeFactoryElement.cs" />
+    <Compile Include="DataAccess\ActualTypeAttribute.cs" />
+    <Compile Include="DataAccess\IdentityAttribute.cs" />
+    <Compile Include="DataAccess\DataAccessorBase.cs" />
+    <Compile Include="DataAccess\DbTypeAttribute.cs" />
+    <Compile Include="DataAccess\ISqlQueryT.cs" />
+    <Compile Include="DataAccess\ParamTypeNameAttribute.cs" />
+    <Compile Include="DataAccess\PrimaryKeyGeneratorType.cs" />
+    <Compile Include="DataAccess\ScalarAttribute.cs" />
+    <Compile Include="DataAccess\SequenceKeyGenerator.cs" />
+    <Compile Include="DataAccess\SqlIgnoreAttribute.cs" />
+    <Compile Include="Data\DataExceptionType.cs" />
+    <Compile Include="Data\DataProvider\DataProviderInterpreterBase.cs" />
+    <Compile Include="Data\DataProvider\FirebirdMappingSchema.cs" />
+    <Compile Include="Data\DataProvider\Interpreters\OracleDataProviderInterpreter.cs" />
+    <Compile Include="Data\DataProvider\Interpreters\SqliteDataProviderInterpreter.cs" />
+    <Compile Include="Data\DataProvider\OracleHelper.cs" />
+    <Compile Include="Data\DataProvider\Sql2000DataProvider.cs" />
+    <Compile Include="Data\DataProvider\Sql2005DataProvider.cs" />
+    <Compile Include="Data\DataProvider\Sql2008DataProvider.cs" />
+    <Compile Include="Data\DataProvider\Sql2012DataProvider.cs" />
+    <Compile Include="Data\DataProvider\SqlDataProvider.cs" />
+    <Compile Include="Data\DataProvider\ProviderName.cs" />
+    <Compile Include="Data\DbConnectionFactory.cs" />
+    <Compile Include="Data\IDataReaderEx.cs" />
+    <Compile Include="Data\IDbConnectionFactory.cs" />
+    <Compile Include="Data\Linq\Builder\AsUpdatableBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ConcatUnionBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ContainsBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\AllAnyBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\CastBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionTestGenerator.cs" />
+    <Compile Include="Data\Linq\Builder\InsertOrUpdateBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionHoder.cs" />
+    <Compile Include="Data\Linq\Builder\IsExpressionResult.cs" />
+    <Compile Include="Data\Linq\Builder\OfTypeBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\IntersectBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\PassThroughContext.cs" />
+    <Compile Include="Data\Linq\Builder\SequenceConvertInfo.cs" />
+    <Compile Include="Data\Linq\Builder\SequenceConvertPath.cs" />
+    <Compile Include="Data\Linq\Builder\UpdateBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\DeleteBuilder.cs" />
+    <Compile Include="Data\Linq\CompiledQuery.cs" />
+    <Compile Include="Data\Linq\CompiledTableT.cs" />
+    <Compile Include="Data\Linq\DataContext.cs" />
+    <Compile Include="Data\Linq\DataContextInfo.cs" />
+    <Compile Include="Data\Linq\DataContextTransaction.cs" />
+    <Compile Include="Data\Linq\DefaultDataContextInfo.cs" />
+    <Compile Include="Data\Linq\Builder\PassThroughBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ChangeTypeExpression.cs" />
+    <Compile Include="Data\Linq\Builder\DefaultIfEmptyBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\InsertBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\BuildInfo.cs" />
+    <Compile Include="Data\Linq\Builder\SelectManyBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\SqlInfo.cs" />
+    <Compile Include="Data\Linq\Builder\TableAttributeBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\TakeSkipBuilder.cs" />
+    <Compile Include="Data\Linq\ExpressionQueryImpl.cs" />
+    <Compile Include="Data\Linq\IExpressionQuery.cs" />
+    <Compile Include="Data\Linq\ITable.cs" />
+    <Compile Include="Data\Linq\IUpdatable.cs" />
+    <Compile Include="Data\Linq\MemberInfoComparer.cs" />
+    <Compile Include="Data\Linq\QueryableAccessor.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MsSql2000SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MsSql2012SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlValueBase.cs" />
+    <Compile Include="Linq\ExpressionHelper.cs" />
+    <Compile Include="Data\Linq\ExpressionQuery.cs" />
+    <Compile Include="Data\Linq\IDataContextInfo.cs" />
+    <Compile Include="Data\Linq\IgnoreIEnumerableAttribute.cs" />
+    <Compile Include="Data\Linq\IQueryContext.cs" />
+    <Compile Include="Data\Linq\ISelectInsertable.cs" />
+    <Compile Include="Data\Linq\Expressions.cs" />
+    <Compile Include="Data\Linq\IValueInsertable.cs" />
+    <Compile Include="Data\Linq\LinqExtensions.cs" />
+    <Compile Include="Data\Linq\Builder\AggregationBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ConvertFlags.cs" />
+    <Compile Include="Data\Linq\Builder\CountBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\DistinctBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionBuilder.SqlBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionBuilder.QueryBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\FirstSingleBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\GroupByBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\IBuildContext.cs" />
+    <Compile Include="Data\Linq\Builder\ISequenceBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\JoinBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\MethodCallBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\OrderByBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionContext.cs" />
+    <Compile Include="Data\Linq\Builder\RequestFor.cs" />
+    <Compile Include="Data\Linq\Builder\ScalarSelectBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\SelectContext.cs" />
+    <Compile Include="Data\Linq\Builder\SelectBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\SequenceContextBase.cs" />
+    <Compile Include="Data\Linq\Builder\SubQueryContext.cs" />
+    <Compile Include="Data\Linq\Builder\TableBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\WhereBuilder.cs" />
+    <Compile Include="Data\Linq\Query.cs" />
+    <Compile Include="Data\Linq\Settings.cs" />
+    <Compile Include="Data\Linq\SqlEnumAttribute.cs" />
+    <Compile Include="Data\Linq\Extensions.cs" />
+    <Compile Include="Data\Linq\MethodExpressionAttribute.cs" />
+    <Compile Include="Data\Linq\SqlExpressionAttribute.cs" />
+    <Compile Include="Data\Linq\IDataContext.cs" />
+    <Compile Include="Data\Linq\QueryContext.cs" />
+    <Compile Include="Data\Linq\SqlPropertyAttribute.cs" />
+    <Compile Include="Data\Linq\LinqException.cs" />
+    <Compile Include="Data\Linq\ReflectionHelper.cs" />
+    <Compile Include="Data\Linq\Sql.cs" />
+    <Compile Include="Data\Linq\SqlFunctionAttribute.cs" />
+    <Compile Include="Data\Linq\TableExpressionAttribute.cs" />
+    <Compile Include="Data\Linq\TableFunctionAttribute.cs" />
+    <Compile Include="Data\Linq\TableT.cs" />
+    <Compile Include="Data\Sql\ChildContainer.cs" />
+    <Compile Include="Data\Sql\ICloneableElement.cs" />
+    <Compile Include="Data\Sql\ISqlExpressionWalkable.cs" />
+    <Compile Include="Data\Sql\IValueContainer.cs" />
+    <Compile Include="Data\Sql\QueryElementType.cs" />
+    <Compile Include="Data\Sql\QueryType.cs" />
+    <Compile Include="Data\Sql\QueryVisitor.cs" />
+    <Compile Include="Data\Sql\SqlDataType.cs" />
+    <Compile Include="Data\Sql\ISqlPredicate.cs" />
+    <Compile Include="Data\Sql\Precedence.cs" />
+    <Compile Include="Data\Sql\SqlBinaryExpression.cs" />
+    <Compile Include="Data\Sql\SqlException.cs" />
+    <Compile Include="Data\Sql\Extensions.cs" />
+    <Compile Include="Data\Sql\IChild.cs" />
+    <Compile Include="Data\Sql\IQueryElement.cs" />
+    <Compile Include="Data\Sql\ISqlExpression.cs" />
+    <Compile Include="Data\Sql\ISqlTableSource.cs" />
+    <Compile Include="Data\Sql\SqlExpression.cs" />
+    <Compile Include="Data\Sql\SqlField.cs" />
+    <Compile Include="Data\Sql\SqlFunction.cs" />
+    <Compile Include="Data\Sql\Join.cs" />
+    <Compile Include="Data\Sql\JoinOn.cs" />
+    <Compile Include="Data\Sql\SqlParameter.cs" />
+    <Compile Include="Data\Sql\SqlProvider\BasicSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\AccessSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MsSql2005SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MsSql2008SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\SequenceNameAttribute.cs" />
+    <Compile Include="Data\Sql\SqlProvider\SybaseSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MsSqlSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MySqlSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\SqlCeSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\SQLiteSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\FirebirdSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\PostgreSQLSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\OracleSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\DB2SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\InformixSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\ISqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlQuery.cs" />
+    <Compile Include="Data\Sql\SqlTable.cs" />
+    <Compile Include="Data\Sql\SqlTableT.cs" />
+    <Compile Include="Data\Sql\SqlTableType.cs" />
+    <Compile Include="Data\Sql\SqlValue.cs" />
+    <Compile Include="Mapping\AssociationAttribute.cs" />
+    <Compile Include="Mapping\Association.cs" />
+    <Compile Include="Mapping\ExpressionMapIgnoreAttribute.cs" />
+    <Compile Include="Mapping\ExpressionMapper.cs" />
+    <Compile Include="Mapping\IMappingSchemaProvider.cs" />
+    <Compile Include="Mapping\InheritanceMappingAttribute.cs" />
+    <Compile Include="Mapping\MapRelationBase.cs" />
+    <Compile Include="Mapping\MemberMapper.generated.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>MemberMapper.tt</DependentUpon>
+    </Compile>
+    <Compile Include="Mapping\NotNullAttribute.cs" />
+    <Compile Include="Mapping\RelationAttribute.cs" />
+    <Compile Include="Properties\BLToolkitConstants.cs" />
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="Aspects\CacheAspect.cs" />
+    <Compile Include="Aspects\CacheAspectItem.cs" />
+    <Compile Include="Aspects\CacheAspectT.cs" />
+    <Compile Include="Aspects\CacheAttribute.cs" />
+    <Compile Include="Aspects\CallMethodInfo.cs" />
+    <Compile Include="Aspects\AsyncAttribute.cs" />
+    <Compile Include="Aspects\MethodCallCounter.cs" />
+    <Compile Include="Aspects\CounterAspect.cs" />
+    <Compile Include="Aspects\CounterAttribute.cs" />
+    <Compile Include="Aspects\NoCacheAttribute.cs" />
+    <Compile Include="Aspects\IInterceptor.cs" />
+    <Compile Include="Aspects\Interceptor.cs" />
+    <Compile Include="Aspects\InterceptCallInfo.cs" />
+    <Compile Include="Aspects\InterceptorAttribute.cs" />
+    <Compile Include="Aspects\InterceptResult.cs" />
+    <Compile Include="Aspects\InterceptType.cs" />
+    <Compile Include="Aspects\LogAttribute.cs" />
+    <Compile Include="Aspects\LoggingAspect.cs" />
+    <Compile Include="Aspects\MixinAttribute.cs" />
+    <Compile Include="Aspects\MixinOverrideAttribute.cs" />
+    <Compile Include="Aspects\NoCounterAttribute.cs" />
+    <Compile Include="Aspects\NoInterceptionAttribute.cs" />
+    <Compile Include="Aspects\NoLogAttribute.cs" />
+    <Compile Include="Aspects\NotNullAttribute.cs" />
+    <Compile Include="Common\CompoundValue.cs" />
+    <Compile Include="Common\Configuration.cs" />
+    <Compile Include="Common\Convert.cs" />
+    <Compile Include="Common\ConvertT.cs" />
+    <Compile Include="Common\EntityBase.cs" />
+    <Compile Include="Common\EntityBaseT.cs" />
+    <Compile Include="Common\IOperable.cs" />
+    <Compile Include="Common\Operator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="ComponentModel\BindingListImpl.cs" />
+    <Compile Include="ComponentModel\CustomTypeDescriptorImpl.cs" />
+    <Compile Include="ComponentModel\ISortable.cs" />
+    <Compile Include="ComponentModel\IObjectView.cs" />
+    <Compile Include="ComponentModel\ITypeDescriptionProvider.cs" />
+    <Compile Include="ComponentModel\ObjectHolder.cs" />
+    <Compile Include="ComponentModel\TypeDescriptorExtender.cs" />
+    <Compile Include="ComponentModel\TypeDescriptorExtenderT.cs" />
+    <Compile Include="ComponentModel\TypedListImpl.cs" />
+    <Compile Include="ComponentModel\TypeTypeConverter.cs" />
+    <Compile Include="DataAccess\ActionNameAttribute.cs" />
+    <Compile Include="DataAccess\ActionSprocNameAttribute.cs" />
+    <Compile Include="DataAccess\CommandBehaviorAttribute.cs" />
+    <Compile Include="DataAccess\ParamDbTypeAttribute.cs" />
+    <Compile Include="DataAccess\ParamSizeAttribute.cs" />
+    <Compile Include="DataAccess\DataSetTableAttribute.cs" />
+    <Compile Include="DataAccess\ParamNullValue.cs" />
+    <Compile Include="DataAccess\DataAccessorTA.cs" />
+    <Compile Include="DataAccess\Direction.cs" />
+    <Compile Include="DataAccess\DestinationAttribute.cs" />
+    <Compile Include="DataAccess\NoMapAttribute.cs" />
+    <Compile Include="DataAccess\ScalarSourceAttribute.cs" />
+    <Compile Include="DataAccess\FormatAttribute.cs" />
+    <Compile Include="DataAccess\DataAccessorAttribute.cs" />
+    <Compile Include="DataAccess\DataAccessor.cs" />
+    <Compile Include="DataAccess\DataAccessorBuilder.cs" />
+    <Compile Include="DataAccess\DataAccessorT.cs" />
+    <Compile Include="DataAccess\DiscoverParametersAttribute.cs" />
+    <Compile Include="DataAccess\IndexAttribute.cs" />
+    <Compile Include="DataAccess\NonUpdatableAttribute.cs" />
+    <Compile Include="DataAccess\ObjectTypeAttribute.cs" />
+    <Compile Include="DataAccess\ParamNameAttribute.cs" />
+    <Compile Include="DataAccess\PrimaryKeyAttribute.cs" />
+    <Compile Include="DataAccess\DataAccessException.cs" />
+    <Compile Include="DataAccess\ScalarFieldNameAttribute.cs" />
+    <Compile Include="DataAccess\SprocNameAttribute.cs" />
+    <Compile Include="DataAccess\SprocQuery.cs" />
+    <Compile Include="DataAccess\SprocQueryT.cs" />
+    <Compile Include="DataAccess\SqlQuery.cs" />
+    <Compile Include="DataAccess\SqlQueryAttribute.cs" />
+    <Compile Include="DataAccess\SqlQueryBase.cs" />
+    <Compile Include="DataAccess\SqlQueryInfo.cs" />
+    <Compile Include="DataAccess\SqlQueryParameterInfo.cs" />
+    <Compile Include="DataAccess\SqlQueryT.cs" />
+    <Compile Include="DataAccess\TableNameAttribute.cs" />
+    <Compile Include="Common\NameOrIndexParameter.cs" />
+    <Compile Include="Data\InitCommandEventArgs.cs" />
+    <Compile Include="Data\OperationExceptionEventArgs.cs" />
+    <Compile Include="Data\OperationTypeEventArgs.cs" />
+    <Compile Include="Data\ScalarSourceType.cs" />
+    <Compile Include="Data\DataException.cs" />
+    <Compile Include="Data\DataProvider\AccessDataProvider.cs" />
+    <Compile Include="Data\DataProvider\ConvertType.cs" />
+    <Compile Include="Data\DataProvider\DataProviderBase.cs" />
+    <Compile Include="Data\DataProvider\OdbcDataProvider.cs" />
+    <Compile Include="Data\DataProvider\OleDbDataProvider.cs" />
+    <Compile Include="Data\DataProvider\SqlDataProviderBase.cs" />
+    <Compile Include="Data\DbManager.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Data\DbManager.Config.cs">
+      <DependentUpon>DbManager.cs</DependentUpon>
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Data\DbManager.Linq.cs">
+      <DependentUpon>DbManager.cs</DependentUpon>
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Data\OperationType.cs" />
+    <Compile Include="EditableObjects\EditableXmlDocument.cs" />
+    <Compile Include="EditableObjects\EditableList.cs" />
+    <Compile Include="EditableObjects\EditableListChangedEventArgs.cs" />
+    <Compile Include="ComponentModel\MemberPropertyDescriptor.cs" />
+    <Compile Include="ComponentModel\PropertyDescriptorWrapper.cs" />
+    <Compile Include="EditableObjects\EditableArrayList.cs" />
+    <Compile Include="EditableObjects\EditableObject.cs" />
+    <Compile Include="EditableObjects\EditableObjectHolder.cs" />
+    <Compile Include="EditableObjects\EditableObjectT.cs" />
+    <Compile Include="EditableObjects\EditableValue.cs" />
+    <Compile Include="EditableObjects\IEditable.cs" />
+    <Compile Include="Mapping\SimpleSourceListMapper.cs" />
+    <Compile Include="Mapping\MapImplicitAttribute.cs" />
+    <Compile Include="Mapping\MapSetDataT.cs" />
+    <Compile Include="Mapping\ValueMapping.cs" />
+    <Compile Include="Mapping\MapDataDestinationBase.cs" />
+    <Compile Include="Mapping\MapDataSourceBase.cs" />
+    <Compile Include="Mapping\ScalarDataReaderMapper.cs" />
+    <Compile Include="Mapping\SimpleDestinationListMapper.cs" />
+    <Compile Include="Mapping\ScalarListMapper.cs" />
+    <Compile Include="Mapping\ScalarListMapperT.cs" />
+    <Compile Include="Mapping\TextDataListMapper.cs" />
+    <Compile Include="Mapping\TextDataMapper.cs" />
+    <Compile Include="Mapping\TextDataReader.cs" />
+    <Compile Include="Mapping\TextDataWriter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Mapping\MapGetDataT.cs" />
+    <Compile Include="Mapping\MapDataSourceDestinationBase.cs" />
+    <Compile Include="Mapping\DefaultMappingSchema.cs" />
+    <Compile Include="Mapping\IValueMapper.cs" />
+    <Compile Include="Mapping\NullDateTimeAttribute.cs" />
+    <Compile Include="Mapping\NullDecimalAttribute.cs" />
+    <Compile Include="Mapping\NullGuidAttribute.cs" />
+    <Compile Include="Patterns\DuckTyping.cs" />
+    <Compile Include="Patterns\DuckType.cs" />
+    <Compile Include="Patterns\MustImplementAttribute.cs" />
+    <Compile Include="Properties\JetBrains.Annotations.cs" />
+    <Compile Include="Properties\Revision.generated.cs" />
+    <Compile Include="Reflection\ExprMemberAccessor.cs" />
+    <Compile Include="Reflection\ExprTypeAccessor.cs" />
+    <Compile Include="Reflection\GenericBinder.cs" />
+    <Compile Include="Reflection\MetadataProvider\AttributeMetadataProvider.cs" />
+    <Compile Include="Reflection\MetadataProvider\ExtensionMetadataProvider.cs" />
+    <Compile Include="Reflection\MetadataProvider\LinqMetadataProvider.cs" />
+    <Compile Include="Reflection\MetadataProvider\MetadataProviderBase.cs" />
+    <Compile Include="Reflection\MetadataProvider\MetadataProviderList.cs" />
+    <Compile Include="Reflection\XmlIncludeAbstractAttribute.cs" />
+    <Compile Include="ServiceModel\ILinqSoapService.cs" />
+    <Compile Include="ServiceModel\LinqSoapServiceClient.cs" />
+    <Compile Include="ServiceModel\ILinqService.cs" />
+    <Compile Include="ServiceModel\LinqService.cs" />
+    <Compile Include="ServiceModel\LinqServiceClient.cs" />
+    <Compile Include="ServiceModel\LinqServiceQuery.cs" />
+    <Compile Include="ServiceModel\LinqServiceResult.cs" />
+    <Compile Include="ServiceModel\LinqServiceSerializer.cs" />
+    <Compile Include="ServiceModel\RemoteDataContextBase.cs" />
+    <Compile Include="ServiceModel\ServiceModelDataContext.cs" />
+    <Compile Include="ServiceModel\ServiceModelDataReader.cs" />
+    <Compile Include="ServiceModel\SoapDataContext.cs" />
+    <Compile Include="TypeBuilder\AutoImplementInterfaceAttribute.cs" />
+    <Compile Include="TypeBuilder\Builders\GeneratedAttributeBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\DuckTypeBuilder.cs" />
+    <Compile Include="TypeBuilder\GenerateAttributeAttribute.cs" />
+    <Compile Include="TypeBuilder\ISetParent.cs" />
+    <Compile Include="EditableObjects\IMemberwiseEditable.cs" />
+    <Compile Include="ComponentModel\INotifyObjectEdit.cs" />
+    <Compile Include="EditableObjects\IPrintDebugState.cs" />
+    <Compile Include="ComponentModel\ObjectBinder.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="ComponentModel\ObjectEditEventArgs.cs" />
+    <Compile Include="ComponentModel\ObjectEditType.cs" />
+    <Compile Include="Mapping\DictionaryIndexListMapperT.cs" />
+    <Compile Include="Mapping\DictionaryListMapperT.cs" />
+    <Compile Include="Mapping\DictionaryIndexListMapper.cs" />
+    <Compile Include="Mapping\DictionaryListMapper.cs" />
+    <Compile Include="Mapping\DictionaryMapper.cs" />
+    <Compile Include="Mapping\EnumeratorMapper.cs" />
+    <Compile Include="Mapping\DataReaderListMapper.cs" />
+    <Compile Include="Mapping\DataReaderMapper.cs" />
+    <Compile Include="Mapping\DataTableMapper.cs" />
+    <Compile Include="Mapping\DataRowMapper.cs" />
+    <Compile Include="Mapping\DefaultMemberMapper.cs" />
+    <Compile Include="Mapping\DefaultValueAttribute.cs" />
+    <Compile Include="Mapping\IMapDataDestination.cs" />
+    <Compile Include="Mapping\IMapDataDestinationList.cs" />
+    <Compile Include="Mapping\IMapDataSource.cs" />
+    <Compile Include="Mapping\IMapDataSourceList.cs" />
+    <Compile Include="Mapping\ISupportMapping.cs" />
+    <Compile Include="Mapping\Map.cs" />
+    <Compile Include="Mapping\MapFieldAttribute.cs" />
+    <Compile Include="Mapping\MapIgnoreAttribute.cs" />
+    <Compile Include="Mapping\MapIndex.cs" />
+    <Compile Include="Mapping\MapMemberInfo.cs" />
+    <Compile Include="Mapping\MapNextResult.cs" />
+    <Compile Include="Mapping\MappingException.cs" />
+    <Compile Include="Mapping\MappingSchema.cs" />
+    <Compile Include="Mapping\MapRelation.cs" />
+    <Compile Include="Mapping\MapResultSet.cs" />
+    <Compile Include="Mapping\MapValue.cs" />
+    <Compile Include="Mapping\MapValueAttribute.cs" />
+    <Compile Include="Reflection\Extension\AttributeNameCollection.cs" />
+    <Compile Include="Reflection\Extension\TypeExtensionException.cs" />
+    <Compile Include="Reflection\Extension\TypeExtensionAttribute.cs" />
+    <Compile Include="Mapping\MemberMapperAttribute.cs" />
+    <Compile Include="Mapping\NullableAttribute.cs" />
+    <Compile Include="Mapping\NullValueAttribute.cs" />
+    <Compile Include="Mapping\ObjectListMapper.cs" />
+    <Compile Include="Mapping\ObjectMapperT.cs" />
+    <Compile Include="Mapping\MemberMapper.cs" />
+    <Compile Include="Mapping\ObjectMapper.cs" />
+    <Compile Include="Mapping\ObjectMapperAttribute.cs" />
+    <Compile Include="Mapping\TrimmableAttribute.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Reflection\Emit\AssemblyBuilderHelper.cs" />
+    <Compile Include="Reflection\Emit\ConstructorBuilderHelper.cs" />
+    <Compile Include="Reflection\Emit\EmitHelper.cs" />
+    <Compile Include="Reflection\Emit\MethodBuilderBase.cs" />
+    <Compile Include="Reflection\Emit\MethodBuilderHelper.cs" />
+    <Compile Include="Reflection\Emit\TypeBuilderHelper.cs" />
+    <Compile Include="Reflection\IObjectFactory.cs" />
+    <Compile Include="Reflection\MemberAccessor.cs" />
+    <Compile Include="Reflection\ObjectFactoryAttribute.cs" />
+    <Compile Include="Reflection\TypeAccessorT.cs" />
+    <Compile Include="Reflection\TypeHelper.cs" />
+    <Compile Include="TypeBuilder\Builders\AbstractClassBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\AbstractTypeBuilderBase.cs" />
+    <Compile Include="TypeBuilder\BLToolkitGeneratedAttribute.cs" />
+    <Compile Include="TypeBuilder\Builders\AbstractTypeBuilderList.cs" />
+    <Compile Include="TypeBuilder\Builders\BuildContext.cs" />
+    <Compile Include="TypeBuilder\Builders\BuildElement.cs" />
+    <Compile Include="TypeBuilder\Builders\BuildStep.cs" />
+    <Compile Include="TypeBuilder\Builders\DefaultTypeBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\FakeGetter.cs" />
+    <Compile Include="TypeBuilder\Builders\FakeMethodInfo.cs" />
+    <Compile Include="TypeBuilder\Builders\FakeParameterInfo.cs" />
+    <Compile Include="TypeBuilder\Builders\FakeSetter.cs" />
+    <Compile Include="TypeBuilder\Builders\ImplementInterfaceBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\PropertyChangedBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\TypeAccessorBuilder.cs" />
+    <Compile Include="TypeBuilder\GlobalInstanceTypeAttribute.cs" />
+    <Compile Include="TypeBuilder\Builders\IAbstractTypeBuilder.cs" />
+    <Compile Include="Reflection\InitContext.cs" />
+    <Compile Include="TypeBuilder\Builders\InstanceTypeBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\TypeBuilderConsts.cs" />
+    <Compile Include="TypeBuilder\DefaultInstanceTypeAttribute.cs" />
+    <Compile Include="TypeBuilder\GetValueAttribute.cs" />
+    <Compile Include="TypeBuilder\ImplementInterfaceAttribute.cs" />
+    <Compile Include="TypeBuilder\InstanceTypeAttribute.cs" />
+    <Compile Include="TypeBuilder\IPropertyChanged.cs" />
+    <Compile Include="TypeBuilder\LazyInstanceAttribute.cs" />
+    <Compile Include="TypeBuilder\LazyInstancesAttribute.cs" />
+    <Compile Include="TypeBuilder\NoInstanceAttribute.cs" />
+    <Compile Include="TypeBuilder\ParameterAttribute.cs" />
+    <Compile Include="TypeBuilder\ParentAttribute.cs" />
+    <Compile Include="TypeBuilder\PropertyChangedAttribute.cs" />
+    <Compile Include="TypeBuilder\PropertyInfoAttribute.cs" />
+    <Compile Include="TypeBuilder\RefCursorAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfFalseAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfNonZeroAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfNotNullAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfNullAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfTrueAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfZeroAttribute.cs" />
+    <Compile Include="TypeBuilder\SetValueAttribute.cs" />
+    <Compile Include="TypeBuilder\TypeBuilderException.cs" />
+    <Compile Include="TypeBuilder\Builders\ITypeBuilder.cs" />
+    <Compile Include="Reflection\TypeAccessor.cs" />
+    <Compile Include="TypeBuilder\Builders\TypeBuilderAttribute.cs" />
+    <Compile Include="TypeBuilder\TypeFactory.cs" />
+    <Compile Include="Reflection\Extension\AttributeExtensionCollection.cs" />
+    <Compile Include="Reflection\Extension\ValueCollection.cs" />
+    <Compile Include="Reflection\Extension\MemberExtensionCollection.cs" />
+    <Compile Include="Reflection\Extension\TypeExtension.cs" />
+    <Compile Include="Reflection\Extension\ExtensionList.cs" />
+    <Compile Include="Reflection\Extension\AttributeExtension.cs" />
+    <Compile Include="Reflection\Extension\MemberExtension.cs" />
+    <Compile Include="Validation\FriendlyNameAttribute.cs" />
+    <Compile Include="Validation\IValidatable.cs" />
+    <Compile Include="Validation\MaxDateValueAttribute.cs" />
+    <Compile Include="Validation\MaxLengthAttribute.cs" />
+    <Compile Include="Validation\MaxValueAttribute.cs" />
+    <Compile Include="Validation\MinDateValueAttribute.cs" />
+    <Compile Include="Validation\MinLengthAttribute.cs" />
+    <Compile Include="Validation\MinValueAttribute.cs" />
+    <Compile Include="Validation\RegExAttribute.cs" />
+    <Compile Include="Validation\RequiredAttribute.cs" />
+    <Compile Include="Validation\ValidationException.cs" />
+    <Compile Include="Validation\ValidatableObjectBase.cs" />
+    <Compile Include="Validation\ValidationContext.cs" />
+    <Compile Include="Validation\Validator.cs" />
+    <Compile Include="Validation\ValidatorBaseAttribute.cs" />
+    <Compile Include="Net\HttpReader.cs" />
+    <None Include="Mapping\MemberMapper.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>MemberMapper.generated.cs</LastGenOutput>
+    </None>
+    <None Include="Properties\Revision.tt">
+      <LastGenOutput>Revision1.generated.cs</LastGenOutput>
+    </None>
+    <None Include="Templates\BLT4Toolkit.ttinclude" />
+    <None Include="Templates\BLToolkit.ttinclude" />
+    <None Include="Templates\BLToolkitConstants.Revision.cs.template" />
+    <None Include="Templates\MySql.ttinclude" />
+    <None Include="Templates\MSSQL.ttinclude" />
+    <None Include="Templates\PluralSingular.ttinclude" />
+    <None Include="Templates\PostgreSQL.ttinclude" />
+    <None Include="Templates\Sybase.ttinclude" />
+    <None Include="Templates\VB.ttinclude" />
+    <None Include="Templates\WCFAttributes.ttinclude" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="ComponentModel\ObjectBinder.resx">
+      <DependentUpon>ObjectBinder.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="ComponentModel\ObjectBinder.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Mapping\Mapping.xsd">
+      <SubType>
+      </SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DataAccess\DataAccess.xsd">
+      <SubType>
+      </SubType>
+    </EmbeddedResource>
+    <None Include="BLToolkit.snk" />
+    <None Include="DataAccess\DataAccess.xsx">
+      <DependentUpon>DataAccess.xsd</DependentUpon>
+    </None>
+    <None Include="Doc\BLToolkit.chm" />
+    <None Include="Doc\Development rules and regulations.doc" />
+    <None Include="Mapping\Mapping.xsx">
+      <DependentUpon>Mapping.xsd</DependentUpon>
+    </None>
+    <EmbeddedResource Include="Reflection\Extension\TypeExtension.xsd">
+      <SubType>
+      </SubType>
+    </EmbeddedResource>
+    <None Include="Reflection\Extension\TypeExtension.xsx">
+      <DependentUpon>TypeExtension.xsd</DependentUpon>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="ComponentModel\ObjectBinder.bmp" />
+    <EmbeddedResource Include="Data\Sql\ReservedWords.txt" />
+    <Content Include="Doc\ChangeLog.txt" />
+    <Content Include="Doc\License.txt" />
+    <Content Include="Doc\OnlineDoc.txt" />
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <SubType>Designer</SubType>
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup />
+  <ItemGroup>
+    <Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/BLToolkit.Data.4.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,743 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{0C325F5D-E50E-4340-8724-D29896CCC584}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit</RootNamespace>
+    <AssemblyName>BLToolkit.Data.4</AssemblyName>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>BLToolkit.snk</AssemblyOriginatorKeyFile>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;FW4;DATA;OVERRIDETOSTRING;</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE;FW4;DATA;OVERRIDETOSTRING</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug FW 3.5|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\Debug FW 3.5\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;FW3;DATA;TRACE_PARSING1;OVERRIDETOSTRING1</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Optimize>false</Optimize>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;FW4;DATA;MONO;OVERRIDETOSTRING;NEW_PARSER</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Optimize>false</Optimize>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE;FW4;DATA;MONO;OVERRIDETOSTRING</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+    </Reference>
+    <Reference Include="System.Core">
+    </Reference>
+    <Reference Include="System.Data">
+    </Reference>
+    <Reference Include="System.Data.Linq">
+    </Reference>
+    <Reference Include="System.Data.Services" />
+    <Reference Include="System.Runtime.Serialization">
+    </Reference>
+    <Reference Include="System.ServiceModel" />
+    <Reference Include="System.Web.Services" />
+    <Reference Include="System.Xml">
+    </Reference>
+    <Reference Include="System.Configuration">
+    </Reference>
+    <Reference Include="System.Xml.Linq" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Common\Convert.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>Convert.generated.cs</LastGenOutput>
+    </None>
+    <None Include="Data\DataProvider\FdpDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\MySqlDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\OdpDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\SqlCeDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\SQLiteDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\SybaseDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\SybaseAdoDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\DB2DataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\InformixDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <None Include="Data\DataProvider\PostgreSQLDataProvider.cs">
+      <DependentUpon>DataProviderBase.cs</DependentUpon>
+    </None>
+    <Compile Include="Aspects\AsyncAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\Builders\AsyncAspectBuilder.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\Builders\ClearCacheAspectBuilder.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\Builders\InterceptorAspectBuilder.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\Builders\MixinAspectBuilder.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\Builders\NotNullAspectBuilder.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\Builders\OverloadAspectBuilder.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\CacheAspect.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\CacheAspectItem.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\CacheAspectT.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\CacheAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\CallMethodInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\ClearCacheAspect.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\ClearCacheAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\CounterAspect.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\CounterAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\IInterceptor.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\InstanceCacheAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\InterceptCallInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\Interceptor.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\InterceptorAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\InterceptResult.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\InterceptType.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\LogAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\LoggingAspect.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\MethodCallCounter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\MixinAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\MixinOverrideAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\NoCacheAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\NoCounterAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\NoInterceptionAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\NoLogAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\NotNullAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Aspects\OverloadAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Common\ArrayT.cs" />
+    <Compile Include="Common\Convert.generated.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Convert.tt</DependentUpon>
+    </Compile>
+    <Compile Include="Common\Tuple.cs" />
+    <Compile Include="Configuration\ElementBase.cs" />
+    <Compile Include="Configuration\ElementCollectionBase.cs" />
+    <Compile Include="Configuration\DataProviderElement.cs" />
+    <Compile Include="Configuration\DataProviderElementCollection.cs" />
+    <Compile Include="Configuration\BLToolkitSection.cs" />
+    <Compile Include="Configuration\TypeFactoryElement.cs" />
+    <Compile Include="DataAccess\ActualTypeAttribute.cs" />
+    <Compile Include="DataAccess\IdentityAttribute.cs" />
+    <Compile Include="DataAccess\DataAccessorBase.cs" />
+    <Compile Include="DataAccess\DbTypeAttribute.cs" />
+    <Compile Include="DataAccess\ISqlQueryT.cs" />
+    <Compile Include="DataAccess\ParamTypeNameAttribute.cs" />
+    <Compile Include="DataAccess\PrimaryKeyGeneratorType.cs" />
+    <Compile Include="DataAccess\ScalarAttribute.cs" />
+    <Compile Include="DataAccess\SequenceKeyGenerator.cs" />
+    <Compile Include="DataAccess\SqlIgnoreAttribute.cs" />
+    <Compile Include="Data\DataExceptionType.cs" />
+    <Compile Include="Data\DataProvider\Sql2005DataProvider.cs" />
+    <Compile Include="Data\DataProvider\Sql2012DataProvider.cs" />
+    <Compile Include="Data\DataProvider\DataProviderInterpreterBase.cs" />
+    <Compile Include="Data\DataProvider\FirebirdMappingSchema.cs" />
+    <Compile Include="Data\DataProvider\Interpreters\OracleDataProviderInterpreter.cs" />
+    <Compile Include="Data\DataProvider\Interpreters\SqliteDataProviderInterpreter.cs" />
+    <Compile Include="Data\DataProvider\OracleHelper.cs" />
+    <Compile Include="Data\DataProvider\Sql2000DataProvider.cs" />
+    <Compile Include="Data\DataProvider\Sql2008DataProvider.cs" />
+    <Compile Include="Data\DataProvider\SqlDataProvider.cs" />
+    <Compile Include="Data\DataProvider\ProviderName.cs" />
+    <Compile Include="Data\DbConnectionFactory.cs" />
+    <Compile Include="Data\IDataReaderEx.cs" />
+    <Compile Include="Data\IDbConnectionFactory.cs" />
+    <Compile Include="Data\Linq\Builder\AsUpdatableBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ConcatUnionBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ContainsBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\AllAnyBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\CastBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionTestGenerator.cs" />
+    <Compile Include="Data\Linq\Builder\InsertOrUpdateBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionHoder.cs" />
+    <Compile Include="Data\Linq\Builder\IsExpressionResult.cs" />
+    <Compile Include="Data\Linq\Builder\OfTypeBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\IntersectBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\PassThroughContext.cs" />
+    <Compile Include="Data\Linq\Builder\SequenceConvertInfo.cs" />
+    <Compile Include="Data\Linq\Builder\SequenceConvertPath.cs" />
+    <Compile Include="Data\Linq\Builder\UpdateBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\DeleteBuilder.cs" />
+    <Compile Include="Data\Linq\CompiledQuery.cs" />
+    <Compile Include="Data\Linq\CompiledTableT.cs" />
+    <Compile Include="Data\Linq\DataContext.cs" />
+    <Compile Include="Data\Linq\DataContextInfo.cs" />
+    <Compile Include="Data\Linq\DataContextTransaction.cs" />
+    <Compile Include="Data\Linq\DefaultDataContextInfo.cs" />
+    <Compile Include="Data\Linq\Builder\PassThroughBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ChangeTypeExpression.cs" />
+    <Compile Include="Data\Linq\Builder\DefaultIfEmptyBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\InsertBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\BuildInfo.cs" />
+    <Compile Include="Data\Linq\Builder\SelectManyBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\SqlInfo.cs" />
+    <Compile Include="Data\Linq\Builder\TableAttributeBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\TakeSkipBuilder.cs" />
+    <Compile Include="Data\Linq\ExpressionQueryImpl.cs" />
+    <Compile Include="Data\Linq\IExpressionQuery.cs" />
+    <Compile Include="Data\Linq\ITable.cs" />
+    <Compile Include="Data\Linq\IUpdatable.cs" />
+    <Compile Include="Data\Linq\MemberInfoComparer.cs" />
+    <Compile Include="Data\Linq\QueryableAccessor.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MsSql2012SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MsSql2000SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlValueBase.cs" />
+    <Compile Include="Linq\ExpressionHelper.cs" />
+    <Compile Include="Data\Linq\ExpressionQuery.cs" />
+    <Compile Include="Data\Linq\IDataContextInfo.cs" />
+    <Compile Include="Data\Linq\IgnoreIEnumerableAttribute.cs" />
+    <Compile Include="Data\Linq\IQueryContext.cs" />
+    <Compile Include="Data\Linq\ISelectInsertable.cs" />
+    <Compile Include="Data\Linq\Expressions.cs" />
+    <Compile Include="Data\Linq\IValueInsertable.cs" />
+    <Compile Include="Data\Linq\LinqExtensions.cs" />
+    <Compile Include="Data\Linq\Builder\AggregationBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ConvertFlags.cs" />
+    <Compile Include="Data\Linq\Builder\CountBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\DistinctBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionBuilder.SqlBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionBuilder.QueryBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\FirstSingleBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\GroupByBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\IBuildContext.cs" />
+    <Compile Include="Data\Linq\Builder\ISequenceBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\JoinBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\MethodCallBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\OrderByBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionContext.cs" />
+    <Compile Include="Data\Linq\Builder\RequestFor.cs" />
+    <Compile Include="Data\Linq\Builder\ScalarSelectBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\SelectContext.cs" />
+    <Compile Include="Data\Linq\Builder\SelectBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\SequenceContextBase.cs" />
+    <Compile Include="Data\Linq\Builder\SubQueryContext.cs" />
+    <Compile Include="Data\Linq\Builder\TableBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\WhereBuilder.cs" />
+    <Compile Include="Data\Linq\Query.cs" />
+    <Compile Include="Data\Linq\Settings.cs" />
+    <Compile Include="Data\Linq\SqlEnumAttribute.cs" />
+    <Compile Include="Data\Linq\Extensions.cs" />
+    <Compile Include="Data\Linq\MethodExpressionAttribute.cs" />
+    <Compile Include="Data\Linq\SqlExpressionAttribute.cs" />
+    <Compile Include="Data\Linq\IDataContext.cs" />
+    <Compile Include="Data\Linq\QueryContext.cs" />
+    <Compile Include="Data\Linq\SqlPropertyAttribute.cs" />
+    <Compile Include="Data\Linq\LinqException.cs" />
+    <Compile Include="Data\Linq\ReflectionHelper.cs" />
+    <Compile Include="Data\Linq\Sql.cs" />
+    <Compile Include="Data\Linq\SqlFunctionAttribute.cs" />
+    <Compile Include="Data\Linq\TableExpressionAttribute.cs" />
+    <Compile Include="Data\Linq\TableFunctionAttribute.cs" />
+    <Compile Include="Data\Linq\TableT.cs" />
+    <Compile Include="Data\Sql\ChildContainer.cs" />
+    <Compile Include="Data\Sql\ICloneableElement.cs" />
+    <Compile Include="Data\Sql\ISqlExpressionWalkable.cs" />
+    <Compile Include="Data\Sql\IValueContainer.cs" />
+    <Compile Include="Data\Sql\QueryElementType.cs" />
+    <Compile Include="Data\Sql\QueryType.cs" />
+    <Compile Include="Data\Sql\QueryVisitor.cs" />
+    <Compile Include="Data\Sql\SqlDataType.cs" />
+    <Compile Include="Data\Sql\ISqlPredicate.cs" />
+    <Compile Include="Data\Sql\Precedence.cs" />
+    <Compile Include="Data\Sql\SqlBinaryExpression.cs" />
+    <Compile Include="Data\Sql\SqlException.cs" />
+    <Compile Include="Data\Sql\Extensions.cs" />
+    <Compile Include="Data\Sql\IChild.cs" />
+    <Compile Include="Data\Sql\IQueryElement.cs" />
+    <Compile Include="Data\Sql\ISqlExpression.cs" />
+    <Compile Include="Data\Sql\ISqlTableSource.cs" />
+    <Compile Include="Data\Sql\SqlExpression.cs" />
+    <Compile Include="Data\Sql\SqlField.cs" />
+    <Compile Include="Data\Sql\SqlFunction.cs" />
+    <Compile Include="Data\Sql\Join.cs" />
+    <Compile Include="Data\Sql\JoinOn.cs" />
+    <Compile Include="Data\Sql\SqlParameter.cs" />
+    <Compile Include="Data\Sql\SqlProvider\BasicSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\AccessSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MsSql2005SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MsSql2008SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\SequenceNameAttribute.cs" />
+    <Compile Include="Data\Sql\SqlProvider\SybaseSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MsSqlSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MySqlSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\SqlCeSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\SQLiteSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\FirebirdSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\PostgreSQLSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\OracleSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\DB2SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\InformixSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\ISqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlQuery.cs" />
+    <Compile Include="Data\Sql\SqlTable.cs" />
+    <Compile Include="Data\Sql\SqlTableT.cs" />
+    <Compile Include="Data\Sql\SqlTableType.cs" />
+    <Compile Include="Data\Sql\SqlValue.cs" />
+    <Compile Include="Mapping\AssociationAttribute.cs" />
+    <Compile Include="Mapping\Association.cs" />
+    <Compile Include="Mapping\ExpressionMapIgnoreAttribute.cs" />
+    <Compile Include="Mapping\ExpressionMapper.cs" />
+    <Compile Include="Mapping\IMappingSchemaProvider.cs" />
+    <Compile Include="Mapping\InheritanceMappingAttribute.cs" />
+    <Compile Include="Mapping\MapRelationBase.cs" />
+    <Compile Include="Mapping\MemberMapper.generated.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>MemberMapper.tt</DependentUpon>
+    </Compile>
+    <Compile Include="Mapping\NotNullAttribute.cs" />
+    <Compile Include="Mapping\RelationAttribute.cs" />
+    <Compile Include="Patterns\DuckType.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Patterns\DuckTyping.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Patterns\MustImplementAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\BLToolkitConstants.cs" />
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="Common\CompoundValue.cs" />
+    <Compile Include="Common\Configuration.cs" />
+    <Compile Include="Common\Convert.cs" />
+    <Compile Include="Common\ConvertT.cs" />
+    <Compile Include="Common\IOperable.cs" />
+    <Compile Include="Common\Operator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="DataAccess\ActionNameAttribute.cs" />
+    <Compile Include="DataAccess\ActionSprocNameAttribute.cs" />
+    <Compile Include="DataAccess\CommandBehaviorAttribute.cs" />
+    <Compile Include="DataAccess\ParamDbTypeAttribute.cs" />
+    <Compile Include="DataAccess\ParamSizeAttribute.cs" />
+    <Compile Include="DataAccess\DataSetTableAttribute.cs" />
+    <Compile Include="DataAccess\ParamNullValue.cs" />
+    <Compile Include="DataAccess\DataAccessorTA.cs" />
+    <Compile Include="DataAccess\Direction.cs" />
+    <Compile Include="DataAccess\DestinationAttribute.cs" />
+    <Compile Include="DataAccess\NoMapAttribute.cs" />
+    <Compile Include="DataAccess\ScalarSourceAttribute.cs" />
+    <Compile Include="DataAccess\FormatAttribute.cs" />
+    <Compile Include="DataAccess\DataAccessorAttribute.cs" />
+    <Compile Include="DataAccess\DataAccessor.cs" />
+    <Compile Include="DataAccess\DataAccessorBuilder.cs" />
+    <Compile Include="DataAccess\DataAccessorT.cs" />
+    <Compile Include="DataAccess\DiscoverParametersAttribute.cs" />
+    <Compile Include="DataAccess\IndexAttribute.cs" />
+    <Compile Include="DataAccess\NonUpdatableAttribute.cs" />
+    <Compile Include="DataAccess\ObjectTypeAttribute.cs" />
+    <Compile Include="DataAccess\ParamNameAttribute.cs" />
+    <Compile Include="DataAccess\PrimaryKeyAttribute.cs" />
+    <Compile Include="DataAccess\DataAccessException.cs" />
+    <Compile Include="DataAccess\ScalarFieldNameAttribute.cs" />
+    <Compile Include="DataAccess\SprocNameAttribute.cs" />
+    <Compile Include="DataAccess\SprocQuery.cs" />
+    <Compile Include="DataAccess\SprocQueryT.cs" />
+    <Compile Include="DataAccess\SqlQuery.cs" />
+    <Compile Include="DataAccess\SqlQueryAttribute.cs" />
+    <Compile Include="DataAccess\SqlQueryBase.cs" />
+    <Compile Include="DataAccess\SqlQueryInfo.cs" />
+    <Compile Include="DataAccess\SqlQueryParameterInfo.cs" />
+    <Compile Include="DataAccess\SqlQueryT.cs" />
+    <Compile Include="DataAccess\TableNameAttribute.cs" />
+    <Compile Include="Common\NameOrIndexParameter.cs" />
+    <Compile Include="Data\InitCommandEventArgs.cs" />
+    <Compile Include="Data\OperationExceptionEventArgs.cs" />
+    <Compile Include="Data\OperationTypeEventArgs.cs" />
+    <Compile Include="Data\ScalarSourceType.cs" />
+    <Compile Include="Data\DataException.cs" />
+    <Compile Include="Data\DataProvider\AccessDataProvider.cs" />
+    <Compile Include="Data\DataProvider\ConvertType.cs" />
+    <Compile Include="Data\DataProvider\DataProviderBase.cs" />
+    <Compile Include="Data\DataProvider\OdbcDataProvider.cs" />
+    <Compile Include="Data\DataProvider\OleDbDataProvider.cs" />
+    <Compile Include="Data\DataProvider\SqlDataProviderBase.cs" />
+    <Compile Include="Data\DbManager.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Data\DbManager.Config.cs">
+      <DependentUpon>DbManager.cs</DependentUpon>
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Data\DbManager.Linq.cs">
+      <DependentUpon>DbManager.cs</DependentUpon>
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Data\OperationType.cs" />
+    <Compile Include="Mapping\SimpleSourceListMapper.cs" />
+    <Compile Include="Mapping\MapImplicitAttribute.cs" />
+    <Compile Include="Mapping\MapSetDataT.cs" />
+    <Compile Include="Mapping\ValueMapping.cs" />
+    <Compile Include="Mapping\MapDataDestinationBase.cs" />
+    <Compile Include="Mapping\MapDataSourceBase.cs" />
+    <Compile Include="Mapping\ScalarDataReaderMapper.cs" />
+    <Compile Include="Mapping\SimpleDestinationListMapper.cs" />
+    <Compile Include="Mapping\ScalarListMapper.cs" />
+    <Compile Include="Mapping\ScalarListMapperT.cs" />
+    <Compile Include="Mapping\TextDataListMapper.cs" />
+    <Compile Include="Mapping\TextDataMapper.cs" />
+    <Compile Include="Mapping\TextDataReader.cs" />
+    <Compile Include="Mapping\TextDataWriter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Mapping\MapGetDataT.cs" />
+    <Compile Include="Mapping\MapDataSourceDestinationBase.cs" />
+    <Compile Include="Mapping\DefaultMappingSchema.cs" />
+    <Compile Include="Mapping\IValueMapper.cs" />
+    <Compile Include="Mapping\NullDateTimeAttribute.cs" />
+    <Compile Include="Mapping\NullDecimalAttribute.cs" />
+    <Compile Include="Mapping\NullGuidAttribute.cs" />
+    <Compile Include="Properties\JetBrains.Annotations.cs" />
+    <Compile Include="Properties\Revision.generated.cs" />
+    <Compile Include="Reflection\ExprMemberAccessor.cs" />
+    <Compile Include="Reflection\ExprTypeAccessor.cs" />
+    <Compile Include="Reflection\GenericBinder.cs" />
+    <Compile Include="Reflection\MetadataProvider\AttributeMetadataProvider.cs" />
+    <Compile Include="Reflection\MetadataProvider\ExtensionMetadataProvider.cs" />
+    <Compile Include="Reflection\MetadataProvider\LinqMetadataProvider.cs" />
+    <Compile Include="Reflection\MetadataProvider\MetadataProviderBase.cs" />
+    <Compile Include="Reflection\MetadataProvider\MetadataProviderList.cs" />
+    <Compile Include="Reflection\XmlIncludeAbstractAttribute.cs" />
+    <Compile Include="ServiceModel\DataService.cs" />
+    <Compile Include="ServiceModel\ILinqService.cs" />
+    <Compile Include="ServiceModel\ILinqSoapService.cs" />
+    <Compile Include="ServiceModel\LinqService.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="ServiceModel\LinqServiceClient.cs" />
+    <Compile Include="ServiceModel\LinqServiceQuery.cs" />
+    <Compile Include="ServiceModel\LinqServiceResult.cs" />
+    <Compile Include="ServiceModel\LinqServiceSerializer.cs" />
+    <Compile Include="ServiceModel\LinqSoapServiceClient.cs" />
+    <Compile Include="ServiceModel\RemoteDataContextBase.cs" />
+    <Compile Include="ServiceModel\ServiceModelDataContext.cs" />
+    <Compile Include="ServiceModel\ServiceModelDataReader.cs" />
+    <Compile Include="ServiceModel\SoapDataContext.cs" />
+    <Compile Include="TypeBuilder\AutoImplementInterfaceAttribute.cs" />
+    <Compile Include="TypeBuilder\Builders\GeneratedAttributeBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\DuckTypeBuilder.cs" />
+    <Compile Include="TypeBuilder\GenerateAttributeAttribute.cs" />
+    <Compile Include="TypeBuilder\ISetParent.cs" />
+    <Compile Include="Mapping\DictionaryIndexListMapperT.cs" />
+    <Compile Include="Mapping\DictionaryListMapperT.cs" />
+    <Compile Include="Mapping\DictionaryIndexListMapper.cs" />
+    <Compile Include="Mapping\DictionaryListMapper.cs" />
+    <Compile Include="Mapping\DictionaryMapper.cs" />
+    <Compile Include="Mapping\EnumeratorMapper.cs" />
+    <Compile Include="Mapping\DataReaderListMapper.cs" />
+    <Compile Include="Mapping\DataReaderMapper.cs" />
+    <Compile Include="Mapping\DataTableMapper.cs" />
+    <Compile Include="Mapping\DataRowMapper.cs" />
+    <Compile Include="Mapping\DefaultMemberMapper.cs" />
+    <Compile Include="Mapping\DefaultValueAttribute.cs" />
+    <Compile Include="Mapping\IMapDataDestination.cs" />
+    <Compile Include="Mapping\IMapDataDestinationList.cs" />
+    <Compile Include="Mapping\IMapDataSource.cs" />
+    <Compile Include="Mapping\IMapDataSourceList.cs" />
+    <Compile Include="Mapping\ISupportMapping.cs" />
+    <Compile Include="Mapping\Map.cs" />
+    <Compile Include="Mapping\MapFieldAttribute.cs" />
+    <Compile Include="Mapping\MapIgnoreAttribute.cs" />
+    <Compile Include="Mapping\MapIndex.cs" />
+    <Compile Include="Mapping\MapMemberInfo.cs" />
+    <Compile Include="Mapping\MapNextResult.cs" />
+    <Compile Include="Mapping\MappingException.cs" />
+    <Compile Include="Mapping\MappingSchema.cs" />
+    <Compile Include="Mapping\MapRelation.cs" />
+    <Compile Include="Mapping\MapResultSet.cs" />
+    <Compile Include="Mapping\MapValue.cs" />
+    <Compile Include="Mapping\MapValueAttribute.cs" />
+    <Compile Include="Reflection\Extension\AttributeNameCollection.cs" />
+    <Compile Include="Reflection\Extension\TypeExtensionException.cs" />
+    <Compile Include="Reflection\Extension\TypeExtensionAttribute.cs" />
+    <Compile Include="Mapping\MemberMapperAttribute.cs" />
+    <Compile Include="Mapping\NullableAttribute.cs" />
+    <Compile Include="Mapping\NullValueAttribute.cs" />
+    <Compile Include="Mapping\ObjectListMapper.cs" />
+    <Compile Include="Mapping\ObjectMapperT.cs" />
+    <Compile Include="Mapping\MemberMapper.cs" />
+    <Compile Include="Mapping\ObjectMapper.cs" />
+    <Compile Include="Mapping\ObjectMapperAttribute.cs" />
+    <Compile Include="Mapping\TrimmableAttribute.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Reflection\Emit\AssemblyBuilderHelper.cs" />
+    <Compile Include="Reflection\Emit\ConstructorBuilderHelper.cs" />
+    <Compile Include="Reflection\Emit\EmitHelper.cs" />
+    <Compile Include="Reflection\Emit\MethodBuilderBase.cs" />
+    <Compile Include="Reflection\Emit\MethodBuilderHelper.cs" />
+    <Compile Include="Reflection\Emit\TypeBuilderHelper.cs" />
+    <Compile Include="Reflection\IObjectFactory.cs" />
+    <Compile Include="Reflection\MemberAccessor.cs" />
+    <Compile Include="Reflection\ObjectFactoryAttribute.cs" />
+    <Compile Include="Reflection\TypeAccessorT.cs" />
+    <Compile Include="Reflection\TypeHelper.cs" />
+    <Compile Include="TypeBuilder\Builders\AbstractClassBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\AbstractTypeBuilderBase.cs" />
+    <Compile Include="TypeBuilder\BLToolkitGeneratedAttribute.cs" />
+    <Compile Include="TypeBuilder\Builders\AbstractTypeBuilderList.cs" />
+    <Compile Include="TypeBuilder\Builders\BuildContext.cs" />
+    <Compile Include="TypeBuilder\Builders\BuildElement.cs" />
+    <Compile Include="TypeBuilder\Builders\BuildStep.cs" />
+    <Compile Include="TypeBuilder\Builders\DefaultTypeBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\FakeGetter.cs" />
+    <Compile Include="TypeBuilder\Builders\FakeMethodInfo.cs" />
+    <Compile Include="TypeBuilder\Builders\FakeParameterInfo.cs" />
+    <Compile Include="TypeBuilder\Builders\FakeSetter.cs" />
+    <Compile Include="TypeBuilder\Builders\ImplementInterfaceBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\PropertyChangedBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\TypeAccessorBuilder.cs" />
+    <Compile Include="TypeBuilder\GlobalInstanceTypeAttribute.cs" />
+    <Compile Include="TypeBuilder\Builders\IAbstractTypeBuilder.cs" />
+    <Compile Include="Reflection\InitContext.cs" />
+    <Compile Include="TypeBuilder\Builders\InstanceTypeBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\TypeBuilderConsts.cs" />
+    <Compile Include="TypeBuilder\DefaultInstanceTypeAttribute.cs" />
+    <Compile Include="TypeBuilder\GetValueAttribute.cs" />
+    <Compile Include="TypeBuilder\ImplementInterfaceAttribute.cs" />
+    <Compile Include="TypeBuilder\InstanceTypeAttribute.cs" />
+    <Compile Include="TypeBuilder\IPropertyChanged.cs" />
+    <Compile Include="TypeBuilder\LazyInstanceAttribute.cs" />
+    <Compile Include="TypeBuilder\LazyInstancesAttribute.cs" />
+    <Compile Include="TypeBuilder\NoInstanceAttribute.cs" />
+    <Compile Include="TypeBuilder\ParameterAttribute.cs" />
+    <Compile Include="TypeBuilder\ParentAttribute.cs" />
+    <Compile Include="TypeBuilder\PropertyChangedAttribute.cs" />
+    <Compile Include="TypeBuilder\PropertyInfoAttribute.cs" />
+    <Compile Include="TypeBuilder\RefCursorAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfFalseAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfNonZeroAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfNotNullAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfNullAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfTrueAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfZeroAttribute.cs" />
+    <Compile Include="TypeBuilder\SetValueAttribute.cs" />
+    <Compile Include="TypeBuilder\TypeBuilderException.cs" />
+    <Compile Include="TypeBuilder\Builders\ITypeBuilder.cs" />
+    <Compile Include="Reflection\TypeAccessor.cs" />
+    <Compile Include="TypeBuilder\Builders\TypeBuilderAttribute.cs" />
+    <Compile Include="TypeBuilder\TypeFactory.cs" />
+    <Compile Include="Reflection\Extension\AttributeExtensionCollection.cs" />
+    <Compile Include="Reflection\Extension\ValueCollection.cs" />
+    <Compile Include="Reflection\Extension\MemberExtensionCollection.cs" />
+    <Compile Include="Reflection\Extension\TypeExtension.cs" />
+    <Compile Include="Reflection\Extension\ExtensionList.cs" />
+    <Compile Include="Reflection\Extension\AttributeExtension.cs" />
+    <Compile Include="Reflection\Extension\MemberExtension.cs" />
+    <None Include="Mapping\MemberMapper.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>MemberMapper.generated.cs</LastGenOutput>
+    </None>
+    <None Include="Properties\Revision.tt">
+      <LastGenOutput>Revision1.generated.cs</LastGenOutput>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Mapping\Mapping.xsd">
+      <SubType>
+      </SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DataAccess\DataAccess.xsd">
+      <SubType>
+      </SubType>
+    </EmbeddedResource>
+    <None Include="BLToolkit.snk" />
+    <None Include="DataAccess\DataAccess.xsx">
+      <DependentUpon>DataAccess.xsd</DependentUpon>
+    </None>
+    <None Include="Mapping\Mapping.xsx">
+      <DependentUpon>Mapping.xsd</DependentUpon>
+    </None>
+    <EmbeddedResource Include="Reflection\Extension\TypeExtension.xsd">
+      <SubType>
+      </SubType>
+    </EmbeddedResource>
+    <None Include="Reflection\Extension\TypeExtension.xsx">
+      <DependentUpon>TypeExtension.xsd</DependentUpon>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Data\Sql\ReservedWords.txt" />
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <SubType>Designer</SubType>
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup />
+  <ItemGroup>
+    <Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/BLToolkit.SL.4.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,473 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.50727</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{663D4BFC-F565-41F7-9409-510B560CCEE8}</ProjectGuid>
+    <ProjectTypeGuids>{A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit</RootNamespace>
+    <AssemblyName>BLToolkit.SL.4</AssemblyName>
+    <TargetFrameworkIdentifier>Silverlight</TargetFrameworkIdentifier>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>
+    <SilverlightApplication>false</SilverlightApplication>
+    <ValidateXaml>true</ValidateXaml>
+    <ThrowErrorsInValidation>true</ThrowErrorsInValidation>
+  </PropertyGroup>
+  <!-- This property group is only here to support building this project using the 
+       MSBuild 3.5 toolset. In order to work correctly with this older toolset, it needs 
+       to set the TargetFrameworkVersion to v3.5 -->
+  <PropertyGroup Condition="'$(MSBuildToolsVersion)' == '3.5'">
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>Bin\Debug</OutputPath>
+    <DefineConstants>DEBUG;TRACE;SILVERLIGHT</DefineConstants>
+    <NoStdLib>true</NoStdLib>
+    <NoConfig>true</NoConfig>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>Bin\Release</OutputPath>
+    <DefineConstants>TRACE;SILVERLIGHT</DefineConstants>
+    <NoStdLib>true</NoStdLib>
+    <NoConfig>true</NoConfig>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>DEBUG;TRACE;SILVERLIGHT</DefineConstants>
+    <NoStdLib>true</NoStdLib>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>Bin\Debug\BLToolkit.SL.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <NoConfig>true</NoConfig>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE;SILVERLIGHT</DefineConstants>
+    <Optimize>true</Optimize>
+    <NoStdLib>true</NoStdLib>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>Bin\Release\BLToolkit.SL.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <NoConfig>true</NoConfig>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="mscorlib" />
+    <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.ServiceModel" />
+    <Reference Include="System.Windows" />
+    <Reference Include="system" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Net" />
+    <Reference Include="System.Windows.Browser" />
+    <Reference Include="System.Xml.Linq, Version=2.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <Private>False</Private>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Common\ArrayT.cs" />
+    <Compile Include="Common\CompatibilitySL.cs" />
+    <Compile Include="Common\CompoundValue.cs" />
+    <Compile Include="Common\Configuration.cs" />
+    <Compile Include="Common\Convert.cs" />
+    <Compile Include="Common\Convert.generated.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Convert.tt</DependentUpon>
+    </Compile>
+    <Compile Include="Common\ConvertT.cs" />
+    <Compile Include="Common\NameOrIndexParameter.cs" />
+    <Compile Include="DataAccess\DbTypeAttribute.cs" />
+    <Compile Include="DataAccess\IdentityAttribute.cs" />
+    <Compile Include="DataAccess\NonUpdatableAttribute.cs" />
+    <Compile Include="DataAccess\PrimaryKeyAttribute.cs" />
+    <Compile Include="DataAccess\PrimaryKeyGeneratorType.cs" />
+    <Compile Include="DataAccess\ScalarAttribute.cs" />
+    <Compile Include="DataAccess\SequenceKeyGenerator.cs" />
+    <Compile Include="DataAccess\SqlIgnoreAttribute.cs" />
+    <Compile Include="DataAccess\TableNameAttribute.cs" />
+    <Compile Include="Data\DataProvider\ConvertType.cs" />
+    <Compile Include="Data\DataProvider\FirebirdMappingSchema.cs" />
+    <Compile Include="Data\IDataReaderEx.cs" />
+    <Compile Include="Data\Linq\Builder\AggregationBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\AllAnyBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\AsUpdatableBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\BuildInfo.cs" />
+    <Compile Include="Data\Linq\Builder\CastBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ChangeTypeExpression.cs" />
+    <Compile Include="Data\Linq\Builder\ConcatUnionBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ContainsBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ConvertFlags.cs" />
+    <Compile Include="Data\Linq\Builder\CountBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\DefaultIfEmptyBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\DeleteBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\DistinctBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionBuilder.QueryBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionBuilder.SqlBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionContext.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionHoder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionTestGenerator.cs" />
+    <Compile Include="Data\Linq\Builder\FirstSingleBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\GroupByBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\IBuildContext.cs" />
+    <Compile Include="Data\Linq\Builder\InsertBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\InsertOrUpdateBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\IntersectBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ISequenceBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\IsExpressionResult.cs" />
+    <Compile Include="Data\Linq\Builder\JoinBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\MethodCallBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\OfTypeBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\OrderByBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\PassThroughBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\PassThroughContext.cs" />
+    <Compile Include="Data\Linq\Builder\RequestFor.cs" />
+    <Compile Include="Data\Linq\Builder\ScalarSelectBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\SelectBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\SelectContext.cs" />
+    <Compile Include="Data\Linq\Builder\SelectManyBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\SequenceContextBase.cs" />
+    <Compile Include="Data\Linq\Builder\SequenceConvertInfo.cs" />
+    <Compile Include="Data\Linq\Builder\SequenceConvertPath.cs" />
+    <Compile Include="Data\Linq\Builder\SqlInfo.cs" />
+    <Compile Include="Data\Linq\Builder\SubQueryContext.cs" />
+    <Compile Include="Data\Linq\Builder\TableAttributeBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\TableBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\TakeSkipBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\UpdateBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\WhereBuilder.cs" />
+    <Compile Include="Data\Linq\CompiledQuery.cs" />
+    <Compile Include="Data\Linq\CompiledTableT.cs" />
+    <Compile Include="Data\Linq\DataContextInfo.cs" />
+    <Compile Include="Data\Linq\ExpressionQuery.cs" />
+    <Compile Include="Data\Linq\ExpressionQueryImpl.cs" />
+    <Compile Include="Data\Linq\Expressions.cs" />
+    <Compile Include="Data\Linq\Extensions.cs" />
+    <Compile Include="Data\Linq\IDataContext.cs" />
+    <Compile Include="Data\Linq\IDataContextInfo.cs" />
+    <Compile Include="Data\Linq\IExpressionQuery.cs" />
+    <Compile Include="Data\Linq\IgnoreIEnumerableAttribute.cs" />
+    <Compile Include="Data\Linq\IQueryContext.cs" />
+    <Compile Include="Data\Linq\ISelectInsertable.cs" />
+    <Compile Include="Data\Linq\ITable.cs" />
+    <Compile Include="Data\Linq\IUpdatable.cs" />
+    <Compile Include="Data\Linq\IValueInsertable.cs" />
+    <Compile Include="Data\Linq\LinqException.cs" />
+    <Compile Include="Data\Linq\LinqExtensions.cs" />
+    <Compile Include="Data\Linq\MemberInfoComparer.cs" />
+    <Compile Include="Data\Linq\MethodExpressionAttribute.cs" />
+    <Compile Include="Data\Linq\Query.cs" />
+    <Compile Include="Data\Linq\QueryableAccessor.cs" />
+    <Compile Include="Data\Linq\QueryContext.cs" />
+    <Compile Include="Data\Linq\ReflectionHelper.cs" />
+    <Compile Include="Data\Linq\Settings.cs" />
+    <Compile Include="Data\Linq\Sql.cs" />
+    <Compile Include="Data\Linq\SqlEnumAttribute.cs" />
+    <Compile Include="Data\Linq\SqlExpressionAttribute.cs" />
+    <Compile Include="Data\Linq\SqlFunctionAttribute.cs" />
+    <Compile Include="Data\Linq\SqlPropertyAttribute.cs" />
+    <Compile Include="Data\Linq\TableExpressionAttribute.cs" />
+    <Compile Include="Data\Linq\TableFunctionAttribute.cs" />
+    <Compile Include="Data\Linq\TableT.cs" />
+    <Compile Include="Data\Sql\ChildContainer.cs" />
+    <Compile Include="Data\Sql\Extensions.cs" />
+    <Compile Include="Data\Sql\IChild.cs" />
+    <Compile Include="Data\Sql\ICloneableElement.cs" />
+    <Compile Include="Data\Sql\IQueryElement.cs" />
+    <Compile Include="Data\Sql\ISqlExpression.cs" />
+    <Compile Include="Data\Sql\ISqlExpressionWalkable.cs" />
+    <Compile Include="Data\Sql\ISqlPredicate.cs" />
+    <Compile Include="Data\Sql\ISqlTableSource.cs" />
+    <Compile Include="Data\Sql\IValueContainer.cs" />
+    <Compile Include="Data\Sql\Join.cs" />
+    <Compile Include="Data\Sql\JoinOn.cs" />
+    <Compile Include="Data\Sql\Precedence.cs" />
+    <Compile Include="Data\Sql\QueryElementType.cs" />
+    <Compile Include="Data\Sql\QueryType.cs" />
+    <Compile Include="Data\Sql\QueryVisitor.cs" />
+    <Compile Include="Data\Sql\SqlBinaryExpression.cs" />
+    <Compile Include="Data\Sql\SqlDataType.cs" />
+    <Compile Include="Data\Sql\SqlException.cs" />
+    <Compile Include="Data\Sql\SqlExpression.cs" />
+    <Compile Include="Data\Sql\SqlField.cs" />
+    <Compile Include="Data\Sql\SqlFunction.cs" />
+    <Compile Include="Data\Sql\SqlParameter.cs" />
+    <Compile Include="Data\Sql\SqlProvider\AccessSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\BasicSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\DB2SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\FirebirdSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\InformixSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\ISqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MsSql2005SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MsSql2008SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MsSql2012SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MSSqlSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MySqlSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\OracleSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\PostgreSQLSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\SequenceNameAttribute.cs" />
+    <Compile Include="Data\Sql\SqlProvider\SqlCeSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\SQLiteSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\SybaseSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlQuery.cs" />
+    <Compile Include="Data\Sql\SqlTable.cs" />
+    <Compile Include="Data\Sql\SqlTableT.cs" />
+    <Compile Include="Data\Sql\SqlTableType.cs" />
+    <Compile Include="Data\Sql\SqlValue.cs" />
+    <Compile Include="Data\Sql\SqlValueBase.cs" />
+    <Compile Include="Linq\ExpressionHelper.cs" />
+    <Compile Include="Mapping\Association.cs" />
+    <Compile Include="Mapping\AssociationAttribute.cs" />
+    <Compile Include="Mapping\DataReaderListMapper.cs" />
+    <Compile Include="Mapping\DataReaderMapper.cs" />
+    <Compile Include="Mapping\DefaultMappingSchema.cs" />
+    <Compile Include="Mapping\DefaultMemberMapper.cs" />
+    <Compile Include="Mapping\DefaultValueAttribute.cs" />
+    <Compile Include="Mapping\DictionaryIndexListMapper.cs" />
+    <Compile Include="Mapping\DictionaryIndexListMapperT.cs" />
+    <Compile Include="Mapping\DictionaryListMapper.cs" />
+    <Compile Include="Mapping\DictionaryListMapperT.cs" />
+    <Compile Include="Mapping\DictionaryMapper.cs" />
+    <Compile Include="Mapping\EnumeratorMapper.cs" />
+    <Compile Include="Mapping\ExpressionMapIgnoreAttribute.cs" />
+    <Compile Include="Mapping\ExpressionMapper.cs" />
+    <Compile Include="Mapping\IMapDataDestination.cs" />
+    <Compile Include="Mapping\IMapDataDestinationList.cs" />
+    <Compile Include="Mapping\IMapDataSource.cs" />
+    <Compile Include="Mapping\IMapDataSourceList.cs" />
+    <Compile Include="Mapping\IMappingSchemaProvider.cs" />
+    <Compile Include="Mapping\InheritanceMappingAttribute.cs" />
+    <Compile Include="Mapping\ISupportMapping.cs" />
+    <Compile Include="Mapping\IValueMapper.cs" />
+    <Compile Include="Mapping\Map.cs" />
+    <Compile Include="Mapping\MapDataDestinationBase.cs" />
+    <Compile Include="Mapping\MapDataSourceBase.cs" />
+    <Compile Include="Mapping\MapDataSourceDestinationBase.cs" />
+    <Compile Include="Mapping\MapFieldAttribute.cs" />
+    <Compile Include="Mapping\MapGetDataT.cs" />
+    <Compile Include="Mapping\MapIgnoreAttribute.cs" />
+    <Compile Include="Mapping\MapImplicitAttribute.cs" />
+    <Compile Include="Mapping\MapIndex.cs" />
+    <Compile Include="Mapping\MapMemberInfo.cs" />
+    <Compile Include="Mapping\MapNextResult.cs" />
+    <Compile Include="Mapping\MappingException.cs" />
+    <Compile Include="Mapping\MappingSchema.cs" />
+    <Compile Include="Mapping\MapRelation.cs" />
+    <Compile Include="Mapping\MapRelationBase.cs" />
+    <Compile Include="Mapping\MapResultSet.cs" />
+    <Compile Include="Mapping\MapSetDataT.cs" />
+    <Compile Include="Mapping\MapValue.cs" />
+    <Compile Include="Mapping\MapValueAttribute.cs" />
+    <Compile Include="Mapping\MemberMapper.cs" />
+    <Compile Include="Mapping\MemberMapper.generated.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>MemberMapper.tt</DependentUpon>
+    </Compile>
+    <Compile Include="Mapping\MemberMapperAttribute.cs" />
+    <Compile Include="Mapping\NotNullAttribute.cs" />
+    <Compile Include="Mapping\NullableAttribute.cs" />
+    <Compile Include="Mapping\NullDateTimeAttribute.cs" />
+    <Compile Include="Mapping\NullDecimalAttribute.cs" />
+    <Compile Include="Mapping\NullGuidAttribute.cs" />
+    <Compile Include="Mapping\NullValueAttribute.cs" />
+    <Compile Include="Mapping\ObjectListMapper.cs" />
+    <Compile Include="Mapping\ObjectMapper.cs" />
+    <Compile Include="Mapping\ObjectMapperAttribute.cs" />
+    <Compile Include="Mapping\ObjectMapperT.cs" />
+    <Compile Include="Mapping\RelationAttribute.cs" />
+    <Compile Include="Mapping\ScalarDataReaderMapper.cs" />
+    <Compile Include="Mapping\ScalarListMapper.cs" />
+    <Compile Include="Mapping\ScalarListMapperT.cs" />
+    <Compile Include="Mapping\SimpleDestinationListMapper.cs" />
+    <Compile Include="Mapping\SimpleSourceListMapper.cs" />
+    <Compile Include="Mapping\TextDataListMapper.cs" />
+    <Compile Include="Mapping\TextDataMapper.cs" />
+    <Compile Include="Mapping\TextDataReader.cs" />
+    <Compile Include="Mapping\TextDataWriter.cs" />
+    <Compile Include="Mapping\TrimmableAttribute.cs" />
+    <Compile Include="Mapping\ValueMapping.cs" />
+    <Compile Include="Patterns\DuckType.cs" />
+    <Compile Include="Patterns\DuckTyping.cs" />
+    <Compile Include="Patterns\MustImplementAttribute.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Properties\BLToolkitConstants.cs" />
+    <Compile Include="Properties\JetBrains.Annotations.cs" />
+    <Compile Include="Properties\Resources.Designer.cs" />
+    <Compile Include="Properties\Revision.generated.cs" />
+    <Compile Include="Reflection\Emit\AssemblyBuilderHelper.cs" />
+    <Compile Include="Reflection\Emit\ConstructorBuilderHelper.cs" />
+    <Compile Include="Reflection\Emit\EmitHelper.cs" />
+    <Compile Include="Reflection\Emit\MethodBuilderBase.cs" />
+    <Compile Include="Reflection\Emit\MethodBuilderHelper.cs" />
+    <Compile Include="Reflection\Emit\TypeBuilderHelper.cs" />
+    <Compile Include="Reflection\ExprMemberAccessor.cs" />
+    <Compile Include="Reflection\ExprTypeAccessor.cs" />
+    <Compile Include="Reflection\Extension\AttributeExtension.cs" />
+    <Compile Include="Reflection\Extension\AttributeExtensionCollection.cs" />
+    <Compile Include="Reflection\Extension\AttributeNameCollection.cs" />
+    <Compile Include="Reflection\Extension\ExtensionList.cs" />
+    <Compile Include="Reflection\Extension\MemberExtension.cs" />
+    <Compile Include="Reflection\Extension\MemberExtensionCollection.cs" />
+    <Compile Include="Reflection\Extension\TypeExtension.cs">
+      <DependentUpon>TypeExtension.xsd</DependentUpon>
+    </Compile>
+    <Compile Include="Reflection\Extension\TypeExtensionAttribute.cs" />
+    <Compile Include="Reflection\Extension\TypeExtensionException.cs" />
+    <Compile Include="Reflection\Extension\ValueCollection.cs" />
+    <Compile Include="Reflection\GenericBinder.cs" />
+    <Compile Include="Reflection\InitContext.cs" />
+    <Compile Include="Reflection\IObjectFactory.cs" />
+    <Compile Include="Reflection\MemberAccessor.cs" />
+    <Compile Include="Reflection\MetadataProvider\AttributeMetadataProvider.cs" />
+    <Compile Include="Reflection\MetadataProvider\ExtensionMetadataProvider.cs" />
+    <Compile Include="Reflection\MetadataProvider\MetadataProviderBase.cs" />
+    <Compile Include="Reflection\MetadataProvider\MetadataProviderList.cs" />
+    <Compile Include="Reflection\ObjectFactoryAttribute.cs" />
+    <Compile Include="Reflection\TypeAccessor.cs" />
+    <Compile Include="Reflection\TypeAccessorT.cs" />
+    <Compile Include="Reflection\TypeHelper.cs" />
+    <Compile Include="ServiceModel\Async\ILinqSoapService.cs" />
+    <Compile Include="ServiceModel\Async\ILinqService.cs" />
+    <Compile Include="ServiceModel\SoapDataContext.cs" />
+    <Compile Include="ServiceModel\LinqSoapServiceClient.Silverlight.cs" />
+    <Compile Include="ServiceModel\RemoteDataContextBase.cs" />
+    <Compile Include="ServiceModel\LinqServiceClient.Silverlight.cs" />
+    <Compile Include="ServiceModel\ILinqService.cs" />
+    <Compile Include="ServiceModel\LinqServiceQuery.cs" />
+    <Compile Include="ServiceModel\LinqServiceResult.cs" />
+    <Compile Include="ServiceModel\LinqServiceSerializer.cs" />
+    <Compile Include="ServiceModel\ServiceModelDataContext.cs" />
+    <Compile Include="ServiceModel\ServiceModelDataReader.cs" />
+    <Compile Include="TypeBuilder\AutoImplementInterfaceAttribute.cs" />
+    <Compile Include="TypeBuilder\BLToolkitGeneratedAttribute.cs" />
+    <Compile Include="TypeBuilder\Builders\AbstractClassBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\AbstractTypeBuilderBase.cs" />
+    <Compile Include="TypeBuilder\Builders\AbstractTypeBuilderList.cs" />
+    <Compile Include="TypeBuilder\Builders\BuildContext.cs" />
+    <Compile Include="TypeBuilder\Builders\BuildElement.cs" />
+    <Compile Include="TypeBuilder\Builders\BuildStep.cs" />
+    <Compile Include="TypeBuilder\Builders\DefaultTypeBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\DuckTypeBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\GeneratedAttributeBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\IAbstractTypeBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\ImplementInterfaceBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\InstanceTypeBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\ITypeBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\PropertyChangedBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\TypeAccessorBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\TypeBuilderAttribute.cs" />
+    <Compile Include="TypeBuilder\Builders\TypeBuilderConsts.cs" />
+    <Compile Include="TypeBuilder\DefaultInstanceTypeAttribute.cs" />
+    <Compile Include="TypeBuilder\GenerateAttributeAttribute.cs" />
+    <Compile Include="TypeBuilder\GetValueAttribute.cs" />
+    <Compile Include="TypeBuilder\GlobalInstanceTypeAttribute.cs" />
+    <Compile Include="TypeBuilder\ImplementInterfaceAttribute.cs" />
+    <Compile Include="TypeBuilder\InstanceTypeAttribute.cs" />
+    <Compile Include="TypeBuilder\IPropertyChanged.cs" />
+    <Compile Include="TypeBuilder\ISetParent.cs" />
+    <Compile Include="TypeBuilder\LazyInstanceAttribute.cs" />
+    <Compile Include="TypeBuilder\LazyInstancesAttribute.cs" />
+    <Compile Include="TypeBuilder\NoInstanceAttribute.cs" />
+    <Compile Include="TypeBuilder\ParameterAttribute.cs" />
+    <Compile Include="TypeBuilder\ParentAttribute.cs" />
+    <Compile Include="TypeBuilder\PropertyChangedAttribute.cs" />
+    <Compile Include="TypeBuilder\PropertyInfoAttribute.cs" />
+    <Compile Include="TypeBuilder\RefCursorAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfFalseAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfNonZeroAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfNotNullAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfNullAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfTrueAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfZeroAttribute.cs" />
+    <Compile Include="TypeBuilder\SetValueAttribute.cs" />
+    <Compile Include="TypeBuilder\TypeBuilderException.cs" />
+    <Compile Include="TypeBuilder\TypeFactory.cs" />
+    <Compile Include="Validation\FriendlyNameAttribute.cs" />
+    <Compile Include="Validation\IValidatable.cs" />
+    <Compile Include="Validation\MaxDateValueAttribute.cs" />
+    <Compile Include="Validation\MaxLengthAttribute.cs" />
+    <Compile Include="Validation\MaxValueAttribute.cs" />
+    <Compile Include="Validation\MinDateValueAttribute.cs" />
+    <Compile Include="Validation\MinLengthAttribute.cs" />
+    <Compile Include="Validation\MinValueAttribute.cs" />
+    <Compile Include="Validation\RegExAttribute.cs" />
+    <Compile Include="Validation\RequiredAttribute.cs" />
+    <Compile Include="Validation\ValidatableObjectBase.cs" />
+    <Compile Include="Validation\ValidationContext.cs" />
+    <Compile Include="Validation\ValidationException.cs" />
+    <Compile Include="Validation\Validator.cs" />
+    <Compile Include="Validation\ValidatorBaseAttribute.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Properties\Resources.resx" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Common\Convert.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>Convert.generated.cs</LastGenOutput>
+    </None>
+    <None Include="Mapping\MemberMapper.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>MemberMapper.generated.cs</LastGenOutput>
+    </None>
+    <None Include="Reflection\Extension\TypeExtension.xsd">
+      <SubType>Designer</SubType>
+    </None>
+    <None Include="Reflection\Extension\TypeExtension.xsx">
+      <DependentUpon>TypeExtension.xsd</DependentUpon>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Data\Sql\ReservedWords.txt" />
+  </ItemGroup>
+  <ItemGroup />
+  <ItemGroup>
+    <Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
+  </ItemGroup>
+  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Silverlight\$(SilverlightVersion)\Microsoft.Silverlight.CSharp.targets" />
+  <ProjectExtensions>
+    <VisualStudio>
+      <FlavorProperties GUID="{A1591282-1198-4647-A2B1-27E5FF5F6F3B}">
+        <SilverlightProjectProperties />
+      </FlavorProperties>
+    </VisualStudio>
+  </ProjectExtensions>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/BLToolkit.mono.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,729 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{0C325F5D-E50E-4340-8724-D29896CCC583}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit</RootNamespace>
+    <AssemblyName>BLToolkit.4</AssemblyName>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>BLToolkit.snk</AssemblyOriginatorKeyFile>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;FW4;OVERRIDETOSTRING;</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRules>
+    </CodeAnalysisRules>
+    <CodeAnalysisRuleSet>Migrated rules for BLToolkit.4.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE;FW4;OVERRIDETOSTRING;NEW_PARSER</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRules>
+    </CodeAnalysisRules>
+    <CodeAnalysisRuleSet>Migrated rules for BLToolkit.4 (2).ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug FW 3.5|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\Debug FW 3.5\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;FW3;TRACE_PARSING1;OVERRIDETOSTRING1</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\BLToolkit.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>Migrated rules for BLToolkit.4.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <WarningLevel>4</WarningLevel>
+    <Optimize>false</Optimize>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;FW4;MONO;OVERRIDETOSTRING</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\BLToolkit.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>Migrated rules for BLToolkit.4.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+    <WarningLevel>4</WarningLevel>
+    <Optimize>false</Optimize>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE;FW4;MONO;OVERRIDETOSTRING</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\BLToolkit.4.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>Migrated rules for BLToolkit.4 (2).ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Data.Linq" />
+    <Reference Include="System.Data.Services" />
+    <Reference Include="System.Design" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.ServiceModel" />
+    <Reference Include="System.Web" />
+    <Reference Include="System.Web.Services" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Configuration" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="MySql.Data">
+      <HintPath>..\packages\MySql.Data.6.4.4\lib\net40\mysql.data.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Common\Convert.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>Convert.generated.cs</LastGenOutput>
+    </None>
+    <Compile Include="Aspects\Builders\AsyncAspectBuilder.cs" />
+    <Compile Include="Aspects\Builders\InterceptorAspectBuilder.cs" />
+    <Compile Include="Aspects\Builders\MixinAspectBuilder.cs" />
+    <Compile Include="Aspects\Builders\NotNullAspectBuilder.cs" />
+    <Compile Include="Aspects\Builders\OverloadAspectBuilder.cs" />
+    <Compile Include="Aspects\ClearCacheAspect.cs" />
+    <Compile Include="Aspects\Builders\ClearCacheAspectBuilder.cs" />
+    <Compile Include="Aspects\ClearCacheAttribute.cs" />
+    <Compile Include="Aspects\InstanceCacheAttribute.cs" />
+    <Compile Include="Aspects\OverloadAttribute.cs" />
+    <Compile Include="Common\ArrayT.cs" />
+    <Compile Include="Common\Convert.generated.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Convert.tt</DependentUpon>
+    </Compile>
+    <Compile Include="Common\Tuple.cs" />
+    <Compile Include="Configuration\ElementBase.cs" />
+    <Compile Include="Configuration\ElementCollectionBase.cs" />
+    <Compile Include="Configuration\DataProviderElement.cs" />
+    <Compile Include="Configuration\DataProviderElementCollection.cs" />
+    <Compile Include="Configuration\BLToolkitSection.cs" />
+    <Compile Include="Configuration\TypeFactoryElement.cs" />
+    <Compile Include="DataAccess\ActualTypeAttribute.cs" />
+    <Compile Include="DataAccess\IdentityAttribute.cs" />
+    <Compile Include="DataAccess\DataAccessorBase.cs" />
+    <Compile Include="DataAccess\DbTypeAttribute.cs" />
+    <Compile Include="DataAccess\ParamTypeNameAttribute.cs" />
+    <Compile Include="DataAccess\SqlIgnoreAttribute.cs" />
+    <Compile Include="Data\DataProvider\FirebirdMappingSchema.cs" />
+    <Compile Include="Data\DataProvider\Sql2008DataProvider.cs" />
+    <Compile Include="Data\DataProvider\SqlDataProvider.cs" />
+    <Compile Include="Data\DataProvider\ProviderName.cs" />
+    <Compile Include="Data\IDataReaderEx.cs" />
+    <Compile Include="Data\Linq\Builder\ConcatUnionBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ContainsBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\AllAnyBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\CastBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\InsertOrUpdateBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionHoder.cs" />
+    <Compile Include="Data\Linq\Builder\IsExpressionResult.cs" />
+    <Compile Include="Data\Linq\Builder\OfTypeBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\IntersectBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\PassThroughContext.cs" />
+    <Compile Include="Data\Linq\Builder\SequenceConvertInfo.cs" />
+    <Compile Include="Data\Linq\Builder\SequenceConvertPath.cs" />
+    <Compile Include="Data\Linq\Builder\UpdateBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\DeleteBuilder.cs" />
+    <Compile Include="Data\Linq\CompiledQuery.cs" />
+    <Compile Include="Data\Linq\CompiledTableT.cs" />
+    <Compile Include="Data\Linq\DataContext.cs" />
+    <Compile Include="Data\Linq\DataContextInfo.cs" />
+    <Compile Include="Data\Linq\DataContextTransaction.cs" />
+    <Compile Include="Data\Linq\DefaultDataContextInfo.cs" />
+    <Compile Include="Data\Linq\Builder\PassThroughBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ChangeTypeExpression.cs" />
+    <Compile Include="Data\Linq\Builder\DefaultIfEmptyBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\InsertBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\BuildInfo.cs" />
+    <Compile Include="Data\Linq\Builder\SelectManyBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\SqlInfo.cs" />
+    <Compile Include="Data\Linq\Builder\TableAttributeBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\TakeSkipBuilder.cs" />
+    <Compile Include="Data\Linq\ExpressionQueryImpl.cs" />
+    <Compile Include="Data\Linq\IExpressionQuery.cs" />
+    <Compile Include="Data\Linq\ITable.cs" />
+    <Compile Include="Data\Linq\MemberInfoComparer.cs" />
+    <Compile Include="Linq\ExpressionHelper.cs" />
+    <Compile Include="Data\Linq\ExpressionQuery.cs" />
+    <Compile Include="Data\Linq\IDataContextInfo.cs" />
+    <Compile Include="Data\Linq\IgnoreIEnumerableAttribute.cs" />
+    <Compile Include="Data\Linq\IQueryContext.cs" />
+    <Compile Include="Data\Linq\ISelectInsertable.cs" />
+    <Compile Include="Data\Linq\Expressions.cs" />
+    <Compile Include="Data\Linq\IValueInsertable.cs" />
+    <Compile Include="Data\Linq\LinqExtensions.cs" />
+    <Compile Include="Data\Linq\Builder\AggregationBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ConvertFlags.cs" />
+    <Compile Include="Data\Linq\Builder\CountBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\DistinctBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionBuilder.SqlBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionBuilder.QueryBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\FirstSingleBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\GroupByBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\IBuildContext.cs" />
+    <Compile Include="Data\Linq\Builder\ISequenceBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\JoinBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\MethodCallBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\OrderByBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\ExpressionContext.cs" />
+    <Compile Include="Data\Linq\Builder\RequestFor.cs" />
+    <Compile Include="Data\Linq\Builder\ScalarSelectBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\SelectContext.cs" />
+    <Compile Include="Data\Linq\Builder\SelectBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\SequenceContextBase.cs" />
+    <Compile Include="Data\Linq\Builder\SubQueryContext.cs" />
+    <Compile Include="Data\Linq\Builder\TableBuilder.cs" />
+    <Compile Include="Data\Linq\Builder\WhereBuilder.cs" />
+    <Compile Include="Data\Linq\Query.cs" />
+    <Compile Include="Data\Linq\Settings.cs" />
+    <Compile Include="Data\Linq\SqlEnumAttribute.cs" />
+    <Compile Include="Data\Linq\Extensions.cs" />
+    <Compile Include="Data\Linq\IUpdateable.cs" />
+    <Compile Include="Data\Linq\MethodExpressionAttribute.cs" />
+    <Compile Include="Data\Linq\SqlExpressionAttribute.cs" />
+    <Compile Include="Data\Linq\IDataContext.cs" />
+    <Compile Include="Data\Linq\QueryContext.cs" />
+    <Compile Include="Data\Linq\SqlPropertyAttribute.cs" />
+    <Compile Include="Data\Linq\LinqException.cs" />
+    <Compile Include="Data\Linq\ReflectionHelper.cs" />
+    <Compile Include="Data\Linq\Sql.cs" />
+    <Compile Include="Data\Linq\SqlFunctionAttribute.cs" />
+    <Compile Include="Data\Linq\TableExpressionAttribute.cs" />
+    <Compile Include="Data\Linq\TableFunctionAttribute.cs" />
+    <Compile Include="Data\Linq\TableT.cs" />
+    <Compile Include="Data\Sql\ChildContainer.cs" />
+    <Compile Include="Data\Sql\ICloneableElement.cs" />
+    <Compile Include="Data\Sql\ISqlExpressionWalkable.cs" />
+    <Compile Include="Data\Sql\IValueContainer.cs" />
+    <Compile Include="Data\Sql\QueryElementType.cs" />
+    <Compile Include="Data\Sql\QueryType.cs" />
+    <Compile Include="Data\Sql\QueryVisitor.cs" />
+    <Compile Include="Data\Sql\SqlDataType.cs" />
+    <Compile Include="Data\Sql\ISqlPredicate.cs" />
+    <Compile Include="Data\Sql\Precedence.cs" />
+    <Compile Include="Data\Sql\SqlBinaryExpression.cs" />
+    <Compile Include="Data\Sql\SqlException.cs" />
+    <Compile Include="Data\Sql\Extensions.cs" />
+    <Compile Include="Data\Sql\IChild.cs" />
+    <Compile Include="Data\Sql\IQueryElement.cs" />
+    <Compile Include="Data\Sql\ISqlExpression.cs" />
+    <Compile Include="Data\Sql\ISqlTableSource.cs" />
+    <Compile Include="Data\Sql\SqlExpression.cs" />
+    <Compile Include="Data\Sql\SqlField.cs" />
+    <Compile Include="Data\Sql\SqlFunction.cs" />
+    <Compile Include="Data\Sql\Join.cs" />
+    <Compile Include="Data\Sql\JoinOn.cs" />
+    <Compile Include="Data\Sql\SqlParameter.cs" />
+    <Compile Include="Data\Sql\SqlProvider\BasicSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\AccessSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MsSql2005SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MsSql2008SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\SequenceNameAttribute.cs" />
+    <Compile Include="Data\Sql\SqlProvider\SybaseSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MsSqlSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\MySqlSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\SqlCeSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\SQLiteSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\FirebirdSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\PostgreSQLSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\OracleSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\DB2SqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\InformixSqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlProvider\ISqlProvider.cs" />
+    <Compile Include="Data\Sql\SqlQuery.cs" />
+    <Compile Include="Data\Sql\SqlTable.cs" />
+    <Compile Include="Data\Sql\SqlTableT.cs" />
+    <Compile Include="Data\Sql\SqlTableType.cs" />
+    <Compile Include="Data\Sql\SqlValue.cs" />
+    <Compile Include="Mapping\AssociationAttribute.cs" />
+    <Compile Include="Mapping\Association.cs" />
+    <Compile Include="Mapping\ExpressionMapper.cs" />
+    <Compile Include="Mapping\IMappingSchemaProvider.cs" />
+    <Compile Include="Mapping\InheritanceMappingAttribute.cs" />
+    <Compile Include="Mapping\MapRelationBase.cs" />
+    <Compile Include="Mapping\MemberMapper.generated.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>MemberMapper.tt</DependentUpon>
+    </Compile>
+    <Compile Include="Mapping\NotNullAttribute.cs" />
+    <Compile Include="Mapping\RelationAttribute.cs" />
+    <Compile Include="Properties\BLToolkitConstants.cs" />
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="Aspects\CacheAspect.cs" />
+    <Compile Include="Aspects\CacheAspectItem.cs" />
+    <Compile Include="Aspects\CacheAspectT.cs" />
+    <Compile Include="Aspects\CacheAttribute.cs" />
+    <Compile Include="Aspects\CallMethodInfo.cs" />
+    <Compile Include="Aspects\AsyncAttribute.cs" />
+    <Compile Include="Aspects\MethodCallCounter.cs" />
+    <Compile Include="Aspects\CounterAspect.cs" />
+    <Compile Include="Aspects\CounterAttribute.cs" />
+    <Compile Include="Aspects\NoCacheAttribute.cs" />
+    <Compile Include="Aspects\IInterceptor.cs" />
+    <Compile Include="Aspects\Interceptor.cs" />
+    <Compile Include="Aspects\InterceptCallInfo.cs" />
+    <Compile Include="Aspects\InterceptorAttribute.cs" />
+    <Compile Include="Aspects\InterceptResult.cs" />
+    <Compile Include="Aspects\InterceptType.cs" />
+    <Compile Include="Aspects\LogAttribute.cs" />
+    <Compile Include="Aspects\LoggingAspect.cs" />
+    <Compile Include="Aspects\MixinAttribute.cs" />
+    <Compile Include="Aspects\MixinOverrideAttribute.cs" />
+    <Compile Include="Aspects\NoCounterAttribute.cs" />
+    <Compile Include="Aspects\NoInterceptionAttribute.cs" />
+    <Compile Include="Aspects\NoLogAttribute.cs" />
+    <Compile Include="Aspects\NotNullAttribute.cs" />
+    <Compile Include="Common\CompoundValue.cs" />
+    <Compile Include="Common\Configuration.cs" />
+    <Compile Include="Common\Convert.cs" />
+    <Compile Include="Common\ConvertT.cs" />
+    <Compile Include="Common\EntityBase.cs" />
+    <Compile Include="Common\EntityBaseT.cs" />
+    <Compile Include="Common\IOperable.cs" />
+    <Compile Include="Common\Operator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="ComponentModel\BindingListImpl.cs" />
+    <Compile Include="ComponentModel\CustomTypeDescriptorImpl.cs" />
+    <Compile Include="ComponentModel\Design\ObjectViewTypeEditor.cs" />
+    <Compile Include="ComponentModel\Design\GetTypeDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ComponentModel\Design\GetTypeDialog.Designer.cs">
+      <DependentUpon>GetTypeDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ComponentModel\Design\TypeNameEditor.cs" />
+    <Compile Include="ComponentModel\Design\TypePicker.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ComponentModel\Design\TypePicker.Designer.cs">
+      <DependentUpon>TypePicker.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ComponentModel\Design\ObjectViewTypeNameEditor.cs" />
+    <Compile Include="ComponentModel\ISortable.cs" />
+    <Compile Include="ComponentModel\IObjectView.cs" />
+    <Compile Include="ComponentModel\ITypeDescriptionProvider.cs" />
+    <Compile Include="ComponentModel\ObjectHolder.cs" />
+    <Compile Include="ComponentModel\TypeDescriptorExtender.cs" />
+    <Compile Include="ComponentModel\TypeDescriptorExtenderT.cs" />
+    <Compile Include="ComponentModel\TypedListImpl.cs" />
+    <Compile Include="ComponentModel\Design\TypeEditor.cs" />
+    <Compile Include="ComponentModel\TypeTypeConverter.cs" />
+    <Compile Include="DataAccess\ActionNameAttribute.cs" />
+    <Compile Include="DataAccess\ActionSprocNameAttribute.cs" />
+    <Compile Include="DataAccess\CommandBehaviorAttribute.cs" />
+    <Compile Include="DataAccess\ParamDbTypeAttribute.cs" />
+    <Compile Include="DataAccess\ParamSizeAttribute.cs" />
+    <Compile Include="DataAccess\DataSetTableAttribute.cs" />
+    <Compile Include="DataAccess\ParamNullValue.cs" />
+    <Compile Include="DataAccess\DataAccessorTA.cs" />
+    <Compile Include="DataAccess\Direction.cs" />
+    <Compile Include="DataAccess\DestinationAttribute.cs" />
+    <Compile Include="DataAccess\NoMapAttribute.cs" />
+    <Compile Include="DataAccess\ScalarSourceAttribute.cs" />
+    <Compile Include="DataAccess\FormatAttribute.cs" />
+    <Compile Include="DataAccess\DataAccessorAttribute.cs" />
+    <Compile Include="DataAccess\DataAccessor.cs" />
+    <Compile Include="DataAccess\DataAccessorBuilder.cs" />
+    <Compile Include="DataAccess\DataAccessorT.cs" />
+    <Compile Include="DataAccess\DiscoverParametersAttribute.cs" />
+    <Compile Include="DataAccess\IndexAttribute.cs" />
+    <Compile Include="DataAccess\NonUpdatableAttribute.cs" />
+    <Compile Include="DataAccess\ObjectTypeAttribute.cs" />
+    <Compile Include="DataAccess\ParamNameAttribute.cs" />
+    <Compile Include="DataAccess\PrimaryKeyAttribute.cs" />
+    <Compile Include="DataAccess\DataAccessException.cs" />
+    <Compile Include="DataAccess\ScalarFieldNameAttribute.cs" />
+    <Compile Include="DataAccess\SprocNameAttribute.cs" />
+    <Compile Include="DataAccess\SprocQuery.cs" />
+    <Compile Include="DataAccess\SprocQueryT.cs" />
+    <Compile Include="DataAccess\SqlQuery.cs" />
+    <Compile Include="DataAccess\SqlQueryAttribute.cs" />
+    <Compile Include="DataAccess\SqlQueryBase.cs" />
+    <Compile Include="DataAccess\SqlQueryInfo.cs" />
+    <Compile Include="DataAccess\SqlQueryParameterInfo.cs" />
+    <Compile Include="DataAccess\SqlQueryT.cs" />
+    <Compile Include="DataAccess\TableNameAttribute.cs" />
+    <Compile Include="Common\NameOrIndexParameter.cs" />
+    <Compile Include="Data\InitCommandEventArgs.cs" />
+    <Compile Include="Data\OperationExceptionEventArgs.cs" />
+    <Compile Include="Data\OperationTypeEventArgs.cs" />
+    <Compile Include="Data\ScalarSourceType.cs" />
+    <Compile Include="Data\DataException.cs" />
+    <Compile Include="Data\DataProvider\AccessDataProvider.cs" />
+    <Compile Include="Data\DataProvider\ConvertType.cs" />
+    <Compile Include="Data\DataProvider\DataProviderBase.cs" />
+    <Compile Include="Data\DataProvider\OdbcDataProvider.cs" />
+    <Compile Include="Data\DataProvider\OleDbDataProvider.cs" />
+    <Compile Include="Data\DataProvider\SqlDataProviderBase.cs" />
+    <Compile Include="Data\DbManager.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Data\DbManager.Config.cs">
+      <DependentUpon>DbManager.cs</DependentUpon>
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Data\DbManager.Linq.cs">
+      <DependentUpon>DbManager.cs</DependentUpon>
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Data\OperationType.cs" />
+    <Compile Include="EditableObjects\EditableXmlDocument.cs" />
+    <Compile Include="EditableObjects\EditableList.cs" />
+    <Compile Include="EditableObjects\EditableListChangedEventArgs.cs" />
+    <Compile Include="ComponentModel\MemberPropertyDescriptor.cs" />
+    <Compile Include="ComponentModel\PropertyDescriptorWrapper.cs" />
+    <Compile Include="EditableObjects\EditableArrayList.cs" />
+    <Compile Include="EditableObjects\EditableObject.cs" />
+    <Compile Include="EditableObjects\EditableObjectHolder.cs" />
+    <Compile Include="EditableObjects\EditableObjectT.cs" />
+    <Compile Include="EditableObjects\EditableValue.cs" />
+    <Compile Include="EditableObjects\IEditable.cs" />
+    <Compile Include="Mapping\SimpleSourceListMapper.cs" />
+    <Compile Include="Mapping\MapImplicitAttribute.cs" />
+    <Compile Include="Mapping\MapSetDataT.cs" />
+    <Compile Include="Mapping\ValueMapping.cs" />
+    <Compile Include="Mapping\MapDataDestinationBase.cs" />
+    <Compile Include="Mapping\MapDataSourceBase.cs" />
+    <Compile Include="Mapping\ScalarDataReaderMapper.cs" />
+    <Compile Include="Mapping\SimpleDestinationListMapper.cs" />
+    <Compile Include="Mapping\ScalarListMapper.cs" />
+    <Compile Include="Mapping\ScalarListMapperT.cs" />
+    <Compile Include="Mapping\TextDataListMapper.cs" />
+    <Compile Include="Mapping\TextDataMapper.cs" />
+    <Compile Include="Mapping\TextDataReader.cs" />
+    <Compile Include="Mapping\TextDataWriter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Mapping\MapGetDataT.cs" />
+    <Compile Include="Mapping\MapDataSourceDestinationBase.cs" />
+    <Compile Include="Mapping\DefaultMappingSchema.cs" />
+    <Compile Include="Mapping\IValueMapper.cs" />
+    <Compile Include="Mapping\NullDateTimeAttribute.cs" />
+    <Compile Include="Mapping\NullDecimalAttribute.cs" />
+    <Compile Include="Mapping\NullGuidAttribute.cs" />
+    <Compile Include="Patterns\DuckTyping.cs" />
+    <Compile Include="Patterns\DuckType.cs" />
+    <Compile Include="Patterns\MustImplementAttribute.cs" />
+    <Compile Include="Properties\JetBrains.Annotations.cs" />
+    <Compile Include="Properties\Revision.generated.cs" />
+    <Compile Include="Reflection\ExprMemberAccessor.cs" />
+    <Compile Include="Reflection\ExprTypeAccessor.cs" />
+    <Compile Include="Reflection\GenericBinder.cs" />
+    <Compile Include="Reflection\MetadataProvider\AttributeMetadataProvider.cs" />
+    <Compile Include="Reflection\MetadataProvider\ExtensionMetadataProvider.cs" />
+    <Compile Include="Reflection\MetadataProvider\LinqMetadataProvider.cs" />
+    <Compile Include="Reflection\MetadataProvider\MetadataProviderBase.cs" />
+    <Compile Include="Reflection\MetadataProvider\MetadataProviderList.cs" />
+    <Compile Include="Reflection\XmlIncludeAbstractAttribute.cs" />
+    <Compile Include="TypeBuilder\AutoImplementInterfaceAttribute.cs" />
+    <Compile Include="TypeBuilder\Builders\GeneratedAttributeBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\DuckTypeBuilder.cs" />
+    <Compile Include="TypeBuilder\GenerateAttributeAttribute.cs" />
+    <Compile Include="TypeBuilder\ISetParent.cs" />
+    <Compile Include="EditableObjects\IMemberwiseEditable.cs" />
+    <Compile Include="ComponentModel\INotifyObjectEdit.cs" />
+    <Compile Include="EditableObjects\IPrintDebugState.cs" />
+    <Compile Include="ComponentModel\ObjectBinder.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="ComponentModel\ObjectEditEventArgs.cs" />
+    <Compile Include="ComponentModel\ObjectEditType.cs" />
+    <Compile Include="Mapping\DictionaryIndexListMapperT.cs" />
+    <Compile Include="Mapping\DictionaryListMapperT.cs" />
+    <Compile Include="Mapping\DictionaryIndexListMapper.cs" />
+    <Compile Include="Mapping\DictionaryListMapper.cs" />
+    <Compile Include="Mapping\DictionaryMapper.cs" />
+    <Compile Include="Mapping\EnumeratorMapper.cs" />
+    <Compile Include="Mapping\DataReaderListMapper.cs" />
+    <Compile Include="Mapping\DataReaderMapper.cs" />
+    <Compile Include="Mapping\DataTableMapper.cs" />
+    <Compile Include="Mapping\DataRowMapper.cs" />
+    <Compile Include="Mapping\DefaultMemberMapper.cs" />
+    <Compile Include="Mapping\DefaultValueAttribute.cs" />
+    <Compile Include="Mapping\IMapDataDestination.cs" />
+    <Compile Include="Mapping\IMapDataDestinationList.cs" />
+    <Compile Include="Mapping\IMapDataSource.cs" />
+    <Compile Include="Mapping\IMapDataSourceList.cs" />
+    <Compile Include="Mapping\ISupportMapping.cs" />
+    <Compile Include="Mapping\Map.cs" />
+    <Compile Include="Mapping\MapFieldAttribute.cs" />
+    <Compile Include="Mapping\MapIgnoreAttribute.cs" />
+    <Compile Include="Mapping\MapIndex.cs" />
+    <Compile Include="Mapping\MapMemberInfo.cs" />
+    <Compile Include="Mapping\MapNextResult.cs" />
+    <Compile Include="Mapping\MappingException.cs" />
+    <Compile Include="Mapping\MappingSchema.cs" />
+    <Compile Include="Mapping\MapRelation.cs" />
+    <Compile Include="Mapping\MapResultSet.cs" />
+    <Compile Include="Mapping\MapValue.cs" />
+    <Compile Include="Mapping\MapValueAttribute.cs" />
+    <Compile Include="Reflection\Extension\AttributeNameCollection.cs" />
+    <Compile Include="Reflection\Extension\TypeExtensionException.cs" />
+    <Compile Include="Reflection\Extension\TypeExtensionAttribute.cs" />
+    <Compile Include="Mapping\MemberMapperAttribute.cs" />
+    <Compile Include="Mapping\NullableAttribute.cs" />
+    <Compile Include="Mapping\NullValueAttribute.cs" />
+    <Compile Include="Mapping\ObjectListMapper.cs" />
+    <Compile Include="Mapping\ObjectMapperT.cs" />
+    <Compile Include="Mapping\MemberMapper.cs" />
+    <Compile Include="Mapping\ObjectMapper.cs" />
+    <Compile Include="Mapping\ObjectMapperAttribute.cs" />
+    <Compile Include="Mapping\TrimmableAttribute.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Reflection\Emit\AssemblyBuilderHelper.cs" />
+    <Compile Include="Reflection\Emit\ConstructorBuilderHelper.cs" />
+    <Compile Include="Reflection\Emit\EmitHelper.cs" />
+    <Compile Include="Reflection\Emit\MethodBuilderBase.cs" />
+    <Compile Include="Reflection\Emit\MethodBuilderHelper.cs" />
+    <Compile Include="Reflection\Emit\TypeBuilderHelper.cs" />
+    <Compile Include="Reflection\IObjectFactory.cs" />
+    <Compile Include="Reflection\MemberAccessor.cs" />
+    <Compile Include="Reflection\ObjectFactoryAttribute.cs" />
+    <Compile Include="Reflection\TypeAccessorT.cs" />
+    <Compile Include="Reflection\TypeHelper.cs" />
+    <Compile Include="TypeBuilder\Builders\AbstractClassBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\AbstractTypeBuilderBase.cs" />
+    <Compile Include="TypeBuilder\BLToolkitGeneratedAttribute.cs" />
+    <Compile Include="TypeBuilder\Builders\AbstractTypeBuilderList.cs" />
+    <Compile Include="TypeBuilder\Builders\BuildContext.cs" />
+    <Compile Include="TypeBuilder\Builders\BuildElement.cs" />
+    <Compile Include="TypeBuilder\Builders\BuildStep.cs" />
+    <Compile Include="TypeBuilder\Builders\DefaultTypeBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\FakeGetter.cs" />
+    <Compile Include="TypeBuilder\Builders\FakeMethodInfo.cs" />
+    <Compile Include="TypeBuilder\Builders\FakeParameterInfo.cs" />
+    <Compile Include="TypeBuilder\Builders\FakeSetter.cs" />
+    <Compile Include="TypeBuilder\Builders\ImplementInterfaceBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\PropertyChangedBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\TypeAccessorBuilder.cs" />
+    <Compile Include="TypeBuilder\GlobalInstanceTypeAttribute.cs" />
+    <Compile Include="TypeBuilder\Builders\IAbstractTypeBuilder.cs" />
+    <Compile Include="Reflection\InitContext.cs" />
+    <Compile Include="TypeBuilder\Builders\InstanceTypeBuilder.cs" />
+    <Compile Include="TypeBuilder\Builders\TypeBuilderConsts.cs" />
+    <Compile Include="TypeBuilder\DefaultInstanceTypeAttribute.cs" />
+    <Compile Include="TypeBuilder\GetValueAttribute.cs" />
+    <Compile Include="TypeBuilder\ImplementInterfaceAttribute.cs" />
+    <Compile Include="TypeBuilder\InstanceTypeAttribute.cs" />
+    <Compile Include="TypeBuilder\IPropertyChanged.cs" />
+    <Compile Include="TypeBuilder\LazyInstanceAttribute.cs" />
+    <Compile Include="TypeBuilder\LazyInstancesAttribute.cs" />
+    <Compile Include="TypeBuilder\NoInstanceAttribute.cs" />
+    <Compile Include="TypeBuilder\ParameterAttribute.cs" />
+    <Compile Include="TypeBuilder\ParentAttribute.cs" />
+    <Compile Include="TypeBuilder\PropertyChangedAttribute.cs" />
+    <Compile Include="TypeBuilder\PropertyInfoAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfFalseAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfNonZeroAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfNotNullAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfNullAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfTrueAttribute.cs" />
+    <Compile Include="TypeBuilder\ReturnIfZeroAttribute.cs" />
+    <Compile Include="TypeBuilder\SetValueAttribute.cs" />
+    <Compile Include="TypeBuilder\TypeBuilderException.cs" />
+    <Compile Include="TypeBuilder\Builders\ITypeBuilder.cs" />
+    <Compile Include="Reflection\TypeAccessor.cs" />
+    <Compile Include="TypeBuilder\Builders\TypeBuilderAttribute.cs" />
+    <Compile Include="TypeBuilder\TypeFactory.cs" />
+    <Compile Include="Reflection\Extension\AttributeExtensionCollection.cs" />
+    <Compile Include="Reflection\Extension\ValueCollection.cs" />
+    <Compile Include="Reflection\Extension\MemberExtensionCollection.cs" />
+    <Compile Include="Reflection\Extension\TypeExtension.cs" />
+    <Compile Include="Reflection\Extension\ExtensionList.cs" />
+    <Compile Include="Reflection\Extension\AttributeExtension.cs" />
+    <Compile Include="Reflection\Extension\MemberExtension.cs" />
+    <Compile Include="Validation\FriendlyNameAttribute.cs" />
+    <Compile Include="Validation\IValidatable.cs" />
+    <Compile Include="Validation\MaxDateValueAttribute.cs" />
+    <Compile Include="Validation\MaxLengthAttribute.cs" />
+    <Compile Include="Validation\MaxValueAttribute.cs" />
+    <Compile Include="Validation\MinDateValueAttribute.cs" />
+    <Compile Include="Validation\MinLengthAttribute.cs" />
+    <Compile Include="Validation\MinValueAttribute.cs" />
+    <Compile Include="Validation\RegExAttribute.cs" />
+    <Compile Include="Validation\RequiredAttribute.cs" />
+    <Compile Include="Validation\ValidationException.cs" />
+    <Compile Include="Validation\ValidatableObjectBase.cs" />
+    <Compile Include="Validation\ValidationContext.cs" />
+    <Compile Include="Validation\Validator.cs" />
+    <Compile Include="Validation\ValidatorBaseAttribute.cs" />
+    <Compile Include="Net\HttpReader.cs" />
+    <Compile Include="Web\UI\WebObjectBinder.cs" />
+    <None Include="Mapping\MemberMapper.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>MemberMapper.generated.cs</LastGenOutput>
+    </None>
+    <None Include="Properties\Revision.tt">
+      <LastGenOutput>Revision1.generated.cs</LastGenOutput>
+    </None>
+    <None Include="Templates\BLT4Toolkit.ttinclude" />
+    <None Include="Templates\BLToolkit.ttinclude" />
+    <None Include="Templates\BLToolkitConstants.Revision.cs.template" />
+    <None Include="Templates\MySql.ttinclude" />
+    <None Include="Templates\MSSQL.ttinclude" />
+    <None Include="Templates\PluralSingular.ttinclude" />
+    <None Include="Templates\PostgreSQL.ttinclude" />
+    <None Include="Templates\Sybase.ttinclude" />
+    <None Include="Templates\VB.ttinclude" />
+    <None Include="Templates\WCFAttributes.ttinclude" />
+    <Compile Include="Data\DataProvider\MySqlDataProvider.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="ComponentModel\Design\GetTypeDialog.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>GetTypeDialog.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ComponentModel\Design\TypePicker.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>TypePicker.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="ComponentModel\Design\Object.bmp" />
+    <EmbeddedResource Include="ComponentModel\ObjectBinder.resx">
+      <DependentUpon>ObjectBinder.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="ComponentModel\ObjectBinder.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Mapping\Mapping.xsd">
+      <SubType>
+      </SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DataAccess\DataAccess.xsd">
+      <SubType>
+      </SubType>
+    </EmbeddedResource>
+    <None Include="BLToolkit.snk" />
+    <None Include="DataAccess\DataAccess.xsx">
+      <DependentUpon>DataAccess.xsd</DependentUpon>
+    </None>
+    <None Include="Doc\BLToolkit.chm" />
+    <None Include="Doc\Development rules and regulations.doc" />
+    <None Include="Mapping\Mapping.xsx">
+      <DependentUpon>Mapping.xsd</DependentUpon>
+    </None>
+    <EmbeddedResource Include="Reflection\Extension\TypeExtension.xsd">
+      <SubType>
+      </SubType>
+    </EmbeddedResource>
+    <None Include="Reflection\Extension\TypeExtension.xsx">
+      <DependentUpon>TypeExtension.xsd</DependentUpon>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="ComponentModel\ObjectBinder.bmp" />
+    <EmbeddedResource Include="Data\Sql\ReservedWords.txt" />
+    <Content Include="Doc\ChangeLog.txt" />
+    <Content Include="Doc\License.txt" />
+    <Content Include="Doc\OnlineDoc.txt" />
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <SubType>Designer</SubType>
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Web\UI\WebObjectBinder.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup />
+  <ItemGroup>
+    <Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
Binary file Source/BLToolkit.snk has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Common/ArrayT.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+using System;
+
+using JetBrains.Annotations;
+
+namespace BLToolkit.Common
+{
+	public static class Array<T>
+	{
+		[NotNull]
+		public static readonly T[] Empty = new T[0];
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Common/Compatibility3.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,294 @@
+#if FW2
+
+namespace System
+{
+	public delegate void Action();
+
+	public delegate void Action<T1, T2>(T1 arg1, T2 arg2);
+
+	public delegate void Action<T1, T2, T3>(T1 arg1, T2 arg2, T3 arg3);
+
+	public delegate void Action<T1, T2, T3, T4>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
+
+	public delegate TResult Func<TResult>();
+
+	public delegate TResult Func<T1, TResult>(T1 arg1);
+
+	public delegate TResult Func<T1, T2, TResult>(T1 arg1, T2 arg2);
+
+	public delegate TResult Func<T1, T2, T3, TResult>(T1 arg1, T2 arg2, T3 arg3);
+
+	public delegate TResult Func<T1, T2, T3, T4, TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
+}
+
+namespace System.Collections.Specialized
+{
+	public interface INotifyCollectionChanged
+	{
+		event NotifyCollectionChangedEventHandler CollectionChanged;
+	}
+
+	/// <summary>
+	/// This enum describes the action that caused a CollectionChanged event.
+	/// </summary>
+	public enum NotifyCollectionChangedAction
+	{
+		/// <summary> One or more items were added to the collection. </summary> 
+		Add,
+		/// <summary> One or more items were removed from the collection. </summary>
+		Remove,
+		/// <summary> One or more items were replaced in the collection. </summary>
+		Replace,
+		/// <summary> One or more items were moved within the collection. </summary>
+		Move,
+		/// <summary> The contents of the collection changed dramatically. </summary>
+		Reset,
+	}
+
+	/// <summary> 
+	/// Arguments for the CollectionChanged event. A collection that supports
+	/// INotifyCollectionChangedThis raises this event whenever an item is added or
+	/// removed, or when the contents of the collection changes dramatically. 
+	/// </summary>
+	public class NotifyCollectionChangedEventArgs : EventArgs
+	{
+		#region .ctors
+
+		/// <summary>
+		/// Construct a NotifyCollectionChangedEventArgs that describes a reset change. 
+		/// </summary> 
+		/// <param name="action">The action that caused the event (must be Reset).</param>
+		public NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction action)
+			: this(action, null, -1)
+		{
+		}
+
+		/// <summary>
+		/// Construct a NotifyCollectionChangedEventArgs that describes a one-item change. 
+		/// </summary>
+		/// <param name="action">The action that caused the event; can only be Reset, Add or Remove action.</param>
+		/// <param name="changedItem">The item affected by the change.</param>
+		public NotifyCollectionChangedEventArgs(
+			NotifyCollectionChangedAction action,
+			object                        changedItem)
+			: this(action, changedItem, -1)
+		{
+		}
+
+		/// <summary>
+		/// Construct a NotifyCollectionChangedEventArgs that describes a one-item change. 
+		/// </summary> 
+		/// <param name="action">The action that caused the event.</param>
+		/// <param name="changedItem">The item affected by the change.</param> 
+		/// <param name="index">The index where the change occurred.</param>
+		public NotifyCollectionChangedEventArgs(
+			NotifyCollectionChangedAction action,
+			object                        changedItem,
+			int                           index)
+			: this(action, changedItem == null? null: new[]{ changedItem }, index)
+		{
+		}
+
+		/// <summary>
+		/// Construct a NotifyCollectionChangedEventArgs that describes a multi-item change. 
+		/// </summary> 
+		/// <param name="action">The action that caused the event.</param>
+		/// <param name="changedItems">The items affected by the change.</param> 
+		public NotifyCollectionChangedEventArgs(
+			NotifyCollectionChangedAction action,
+			IList                         changedItems)
+			: this(action, changedItems, -1)
+		{
+		}
+
+		/// <summary>
+		/// Construct a NotifyCollectionChangedEventArgs that describes a multi-item change (or a reset). 
+		/// </summary> 
+		/// <param name="action">The action that caused the event.</param>
+		/// <param name="changedItems">The items affected by the change.</param> 
+		/// <param name="startingIndex">The index where the change occurred.</param>
+		public NotifyCollectionChangedEventArgs(
+			NotifyCollectionChangedAction action,
+			IList                         changedItems,
+			int                           startingIndex)
+		{
+			_action = action;
+
+			if (action == NotifyCollectionChangedAction.Add)
+			{
+				_newItems = changedItems;
+				_newStartingIndex = startingIndex;
+			}
+			else if (action == NotifyCollectionChangedAction.Remove)
+			{
+				_oldItems = changedItems;
+				_oldStartingIndex = startingIndex;
+			}
+		}
+
+		/// <summary>
+		/// Construct a NotifyCollectionChangedEventArgs that describes a one-item Replace event.
+		/// </summary>
+		/// <param name="action">Can only be a Replace action.</param> 
+		/// <param name="newItem">The new item replacing the original item.</param>
+		/// <param name="oldItem">The original item that is replaced.</param> 
+		public NotifyCollectionChangedEventArgs(
+			NotifyCollectionChangedAction action,
+			object                        newItem,
+			object                        oldItem)
+			: this(action, new[] { newItem }, new[] { oldItem }, -1)
+		{
+		}
+
+		/// <summary> 
+		/// Construct a NotifyCollectionChangedEventArgs that describes a one-item Replace event. 
+		/// </summary>
+		/// <param name="action">Can only be a Replace action.</param> 
+		/// <param name="newItem">The new item replacing the original item.</param>
+		/// <param name="oldItem">The original item that is replaced.</param>
+		/// <param name="index">The index of the item being replaced.</param>
+		public NotifyCollectionChangedEventArgs(
+			NotifyCollectionChangedAction action,
+			object                        newItem,
+			object                        oldItem,
+			int                           index)
+			: this(action, new[] { newItem }, new[] { oldItem }, index)
+		{
+		}
+
+		/// <summary>
+		/// Construct a NotifyCollectionChangedEventArgs that describes a multi-item Replace event. 
+		/// </summary>
+		/// <param name="action">Can only be a Replace action.</param> 
+		/// <param name="newItems">The new items replacing the original items.</param> 
+		/// <param name="oldItems">The original items that are replaced.</param>
+		public NotifyCollectionChangedEventArgs(
+			NotifyCollectionChangedAction action,
+			IList                         newItems,
+			IList                         oldItems)
+			: this(action, newItems, oldItems, -1)
+		{
+		}
+
+		/// <summary>
+		/// Construct a NotifyCollectionChangedEventArgs that describes a multi-item Replace event. 
+		/// </summary>
+		/// <param name="action">Can only be a Replace action.</param> 
+		/// <param name="newItems">The new items replacing the original items.</param> 
+		/// <param name="oldItems">The original items that are replaced.</param>
+		/// <param name="startingIndex">The starting index of the items being replaced.</param> 
+		public NotifyCollectionChangedEventArgs(
+			NotifyCollectionChangedAction action,
+			IList                         newItems,
+			IList                         oldItems,
+			int                           startingIndex)
+		{
+			_action = action;
+
+			_newItems = newItems;
+			_newStartingIndex = startingIndex;
+			_oldItems = oldItems;
+			_oldStartingIndex = startingIndex;
+		}
+
+		/// <summary> 
+		/// Construct a NotifyCollectionChangedEventArgs that describes a one-item Move event.
+		/// </summary> 
+		/// <param name="action">Can only be a Move action.</param> 
+		/// <param name="changedItem">The item affected by the change.</param>
+		/// <param name="index">The new index for the changed item.</param> 
+		/// <param name="oldIndex">The old index for the changed item.</param>
+		public NotifyCollectionChangedEventArgs(
+			NotifyCollectionChangedAction action,
+			object                        changedItem,
+			int                           index,
+			int                           oldIndex)
+			: this(action, new[]{changedItem}, index, oldIndex)
+		{
+		}
+
+		/// <summary> 
+		/// Construct a NotifyCollectionChangedEventArgs that describes a multi-item Move event.
+		/// </summary> 
+		/// <param name="action">The action that caused the event.</param> 
+		/// <param name="changedItems">The items affected by the change.</param>
+		/// <param name="index">The new index for the changed items.</param> 
+		/// <param name="oldIndex">The old index for the changed items.</param>
+		public NotifyCollectionChangedEventArgs(
+			NotifyCollectionChangedAction action,
+			IList                         changedItems,
+			int                           index,
+			int                           oldIndex)
+		{
+			_action = action;
+
+			_newItems = changedItems;
+			_newStartingIndex = index;
+			_oldItems = changedItems;
+			_oldStartingIndex = oldIndex;
+		}
+
+		#endregion
+
+		#region Properties
+
+		private readonly NotifyCollectionChangedAction _action;
+		/// <summary>
+		/// The action that caused the event. 
+		/// </summary>
+		public NotifyCollectionChangedAction Action
+		{
+			get { return _action; }
+		}
+
+		private readonly IList _newItems;
+		/// <summary>
+		/// The items affected by the change.
+		/// </summary> 
+		public IList NewItems
+		{
+			get { return _newItems; }
+		}
+
+		private readonly IList _oldItems;
+		/// <summary>
+		/// The old items affected by the change (for Replace events).
+		/// </summary>
+		public IList OldItems
+		{
+			get { return _oldItems; }
+		}
+
+		private readonly int _newStartingIndex = -1;
+		/// <summary> 
+		/// The index where the change occurred.
+		/// </summary>
+		public int NewStartingIndex
+		{
+			get { return _newStartingIndex; }
+		}
+
+		private readonly int _oldStartingIndex = -1;
+		/// <summary>
+		/// The old index where the change occurred (for Move events). 
+		/// </summary>
+		public int OldStartingIndex
+		{
+			get { return _oldStartingIndex; }
+		}
+
+		#endregion
+	}
+
+	/// <summary>
+	/// The delegate to use for handlers that receive the CollectionChanged event.
+	/// </summary>
+	public delegate void NotifyCollectionChangedEventHandler(object sender, NotifyCollectionChangedEventArgs e);
+}
+
+namespace System.Runtime.CompilerServices
+{
+	internal class ExtensionAttribute : Attribute {}
+}
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Common/Compatibility4.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,987 @@
+namespace System
+{
+	using Collections;
+	using Collections.Generic;
+	using Text;
+
+	public delegate void Action<T1,T2,T3,T4,T5>                                                 (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5);
+	public delegate void Action<T1,T2,T3,T4,T5,T6>                                              (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6);
+	public delegate void Action<T1,T2,T3,T4,T5,T6,T7>                                           (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7);
+	public delegate void Action<T1,T2,T3,T4,T5,T6,T7,T8>                                        (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8);
+	public delegate void Action<T1,T2,T3,T4,T5,T6,T7,T8,T9>                                     (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9);
+	public delegate void Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>                                 (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10);
+	public delegate void Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>                             (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11);
+	public delegate void Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>                         (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12);
+	public delegate void Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13>                     (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13);
+	public delegate void Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14>                 (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14);
+	public delegate void Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15>             (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15);
+	public delegate void Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16>         (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16);
+
+	public delegate TResult Func<T1,T2,T3,T4,T5,TResult>                                        (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5);
+	public delegate TResult Func<T1,T2,T3,T4,T5,T6,TResult>                                     (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6);
+	public delegate TResult Func<T1,T2,T3,T4,T5,T6,T7,TResult>                                  (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7);
+	public delegate TResult Func<T1,T2,T3,T4,T5,T6,T7,T8,TResult>                               (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8);
+	public delegate TResult Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,TResult>                            (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9);
+	public delegate TResult Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,TResult>                        (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10);
+	public delegate TResult Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,TResult>                    (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11);
+	public delegate TResult Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,TResult>                (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12);
+	public delegate TResult Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,TResult>            (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13);
+	public delegate TResult Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,TResult>        (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14);
+	public delegate TResult Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,TResult>    (T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15);
+	public delegate TResult Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16);
+
+	#region Tuple
+
+	interface ITuple
+	{
+		int    GetHashCode(IEqualityComparer comparer);
+		string ToString   (StringBuilder sb);
+
+		int Size { get; }
+	}
+
+	public static class Tuple
+	{
+		internal static int CombineHashCodes(int h1, int h2)                                                 { return (((h1 << 5) + h1) ^ h2);                                                              }
+		internal static int CombineHashCodes(int h1, int h2, int h3)                                         { return CombineHashCodes(CombineHashCodes(h1, h2), h3);                                       }
+		internal static int CombineHashCodes(int h1, int h2, int h3, int h4)                                 { return CombineHashCodes(CombineHashCodes(h1, h2), CombineHashCodes(h3, h4));                 }
+		internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5)                         { return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), h5);                               }
+		internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5, int h6)                 { return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), CombineHashCodes(h5, h6));         }
+		internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5, int h6, int h7)         { return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), CombineHashCodes(h5, h6, h7));     }
+		internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5, int h6, int h7, int h8) { return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), CombineHashCodes(h5, h6, h7, h8)); }
+
+		public static Tuple<T1>       Create<T1>      (T1 item1)                     { return new Tuple<T1>      (item1);               }
+		public static Tuple<T1,T2>    Create<T1,T2>   (T1 item1, T2 item2)           { return new Tuple<T1,T2>   (item1, item2);        }
+		public static Tuple<T1,T2,T3> Create<T1,T2,T3>(T1 item1, T2 item2, T3 item3) { return new Tuple<T1,T2,T3>(item1, item2, item3); }
+
+		public static Tuple<T1,T2,T3,T4> Create<T1,T2,T3,T4>(T1 item1, T2 item2, T3 item3, T4 item4)
+		{
+			return new Tuple<T1,T2,T3,T4>(item1, item2, item3, item4);
+		}
+
+		public static Tuple<T1,T2,T3,T4,T5> Create<T1,T2,T3,T4,T5>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5)
+		{
+			return new Tuple<T1,T2,T3,T4,T5>(item1, item2, item3, item4, item5);
+		}
+
+		public static Tuple<T1,T2,T3,T4,T5,T6> Create<T1,T2,T3,T4,T5,T6>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6)
+		{
+			return new Tuple<T1,T2,T3,T4,T5,T6>(item1, item2, item3, item4, item5, item6);
+		}
+
+		public static Tuple<T1,T2,T3,T4,T5,T6,T7> Create<T1,T2,T3,T4,T5,T6,T7>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7)
+		{
+			return new Tuple<T1,T2,T3,T4,T5,T6,T7>(item1, item2, item3, item4, item5, item6, item7);
+		}
+
+		public static Tuple<T1,T2,T3,T4,T5,T6,T7,Tuple<T8>> Create<T1,T2,T3,T4,T5,T6,T7,T8>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8)
+		{
+			return new Tuple<T1,T2,T3,T4,T5,T6,T7,Tuple<T8>>(item1, item2, item3, item4, item5, item6, item7, new Tuple<T8>(item8));
+		}
+	}
+
+	[Serializable]
+	public class Tuple<T1> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple
+	{
+		readonly T1 _item1;
+
+		public Tuple(T1 item1)
+		{
+			_item1 = item1;
+		}
+
+		public override bool Equals(object obj)
+		{
+			return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default);
+		}
+
+		public override int GetHashCode()
+		{
+			return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
+		}
+
+		int IStructuralComparable.CompareTo(object other, IComparer comparer)
+		{
+			if (other == null)
+				return 1;
+
+			var tuple = other as Tuple<T1>;
+
+			if (tuple == null)
+				throw new ArgumentException(string.Format("Type '{0}' is not a tuple", other.GetType()), "other");
+
+			return comparer.Compare(_item1, tuple._item1);
+		}
+
+		bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
+		{
+			if (other == null)
+				return false;
+
+			var tuple = other as Tuple<T1>;
+
+			if (tuple == null)
+				return false;
+
+			return comparer.Equals(_item1, tuple._item1);
+		}
+
+		int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
+		{
+			return comparer.GetHashCode(_item1);
+		}
+
+		int IComparable.CompareTo(object obj)
+		{
+			return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
+		}
+
+		int ITuple.GetHashCode(IEqualityComparer comparer)
+		{
+			return ((IStructuralEquatable)this).GetHashCode(comparer);
+		}
+
+		string ITuple.ToString(StringBuilder sb)
+		{
+			sb.Append(_item1).Append(")");
+			return sb.ToString();
+		}
+
+		public override string ToString()
+		{
+			var sb = new StringBuilder();
+			sb.Append("(");
+			return ((ITuple) this).ToString(sb);
+		}
+
+		public T1 Item1 { get { return _item1; } }
+
+		int ITuple.Size { get { return 2; } }
+	}
+
+	[Serializable]
+	public class Tuple<T1,T2> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple
+	{
+		readonly T1 _item1;
+		readonly T2 _item2;
+
+		public Tuple(T1 item1, T2 item2)
+		{
+			_item1 = item1;
+			_item2 = item2;
+		}
+
+		public override bool Equals(object obj)
+		{
+			return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default);
+		}
+
+		public override int GetHashCode()
+		{
+			return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
+		}
+
+		int IStructuralComparable.CompareTo(object other, IComparer comparer)
+		{
+			if (other == null)
+				return 1;
+
+			var tuple = other as Tuple<T1,T2>;
+
+			if (tuple == null)
+				throw new ArgumentException(string.Format("Type '{0}' is not a tuple", other.GetType()), "other");
+
+			var num = comparer.Compare(_item1, tuple._item1);
+			if (num == 0)
+				return num;
+			return comparer.Compare(_item2, tuple._item2);
+		}
+
+		bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
+		{
+			if (other == null)
+				return false;
+
+			var tuple = other as Tuple<T1,T2>;
+
+			if (tuple == null)
+				return false;
+
+			return
+				comparer.Equals(_item1, tuple._item1) &&
+				comparer.Equals(_item2, tuple._item2);
+		}
+
+		int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
+		{
+			return Tuple.CombineHashCodes(comparer.GetHashCode(_item1), comparer.GetHashCode(_item2));
+		}
+
+		int IComparable.CompareTo(object obj)
+		{
+			return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
+		}
+
+		int ITuple.GetHashCode(IEqualityComparer comparer)
+		{
+			return ((IStructuralEquatable)this).GetHashCode(comparer);
+		}
+
+		string ITuple.ToString(StringBuilder sb)
+		{
+			sb
+				.Append(_item1).Append(", ")
+				.Append(_item2).Append(")");
+
+			return sb.ToString();
+		}
+
+		public override string ToString()
+		{
+			var sb = new StringBuilder();
+			sb.Append("(");
+			return ((ITuple) this).ToString(sb);
+		}
+
+		public T1 Item1 { get { return _item1; } }
+		public T2 Item2 { get { return _item2; } }
+
+		int ITuple.Size { get { return 2; } }
+	}
+
+	[Serializable]
+	public class Tuple<T1,T2,T3> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple
+	{
+		readonly T1 _item1;
+		readonly T2 _item2;
+		readonly T3 _item3;
+
+		public Tuple(T1 item1, T2 item2, T3 item3)
+		{
+			_item1 = item1;
+			_item2 = item2;
+			_item3 = item3;
+		}
+
+		public override bool Equals(object obj)
+		{
+			return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default);
+		}
+
+		public override int GetHashCode()
+		{
+			return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
+		}
+
+		int IStructuralComparable.CompareTo(object other, IComparer comparer)
+		{
+			if (other == null)
+				return 1;
+
+			var tuple = other as Tuple<T1,T2,T3>;
+
+			if (tuple == null)
+				throw new ArgumentException(string.Format("Type '{0}' is not a tuple", other.GetType()), "other");
+
+			int num;
+
+			num = comparer.Compare(_item1, tuple._item1); if (num == 0) return num;
+			num = comparer.Compare(_item2, tuple._item2); if (num != 0) return num;
+
+			return comparer.Compare(_item3, tuple._item3);
+		}
+
+		bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
+		{
+			if (other == null)
+				return false;
+
+			var tuple = other as Tuple<T1,T2,T3>;
+
+			if (tuple == null)
+				return false;
+
+			return
+				comparer.Equals(_item1, tuple._item1) &&
+				comparer.Equals(_item2, tuple._item2) &&
+				comparer.Equals(_item3, tuple._item3);
+		}
+
+		int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
+		{
+			return
+				Tuple.CombineHashCodes(
+					comparer.GetHashCode(_item1),
+					comparer.GetHashCode(_item2),
+					comparer.GetHashCode(_item3));
+		}
+
+		int IComparable.CompareTo(object obj)
+		{
+			return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
+		}
+
+		int ITuple.GetHashCode(IEqualityComparer comparer)
+		{
+			return ((IStructuralEquatable)this).GetHashCode(comparer);
+		}
+
+		string ITuple.ToString(StringBuilder sb)
+		{
+			sb
+				.Append(_item1).Append(", ")
+				.Append(_item2).Append(", ")
+				.Append(_item3).Append(")");
+
+			return sb.ToString();
+		}
+
+		public override string ToString()
+		{
+			var sb = new StringBuilder();
+			sb.Append("(");
+			return ((ITuple) this).ToString(sb);
+		}
+
+		public T1 Item1 { get { return _item1; } }
+		public T2 Item2 { get { return _item2; } }
+		public T3 Item3 { get { return _item3; } }
+
+		int ITuple.Size { get { return 3; } }
+	}
+
+	[Serializable]
+	public class Tuple<T1,T2,T3,T4> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple
+	{
+		readonly T1 _item1;
+		readonly T2 _item2;
+		readonly T3 _item3;
+		readonly T4 _item4;
+
+		public Tuple(T1 item1, T2 item2, T3 item3, T4 item4)
+		{
+			_item1 = item1;
+			_item2 = item2;
+			_item3 = item3;
+			_item4 = item4;
+		}
+
+		public override bool Equals(object obj)
+		{
+			return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default);
+		}
+
+		public override int GetHashCode()
+		{
+			return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
+		}
+
+		int IStructuralComparable.CompareTo(object other, IComparer comparer)
+		{
+			if (other == null)
+				return 1;
+
+			var tuple = other as Tuple<T1,T2,T3,T4>;
+
+			if (tuple == null)
+				throw new ArgumentException(string.Format("Type '{0}' is not a tuple", other.GetType()), "other");
+
+			int num;
+
+			num = comparer.Compare(_item1, tuple._item1); if (num == 0) return num;
+			num = comparer.Compare(_item2, tuple._item2); if (num != 0) return num;
+			num = comparer.Compare(_item3, tuple._item3); if (num != 0) return num;
+
+			return comparer.Compare(_item4, tuple._item4);
+		}
+
+		bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
+		{
+			if (other == null)
+				return false;
+
+			var tuple = other as Tuple<T1,T2,T3,T4>;
+
+			if (tuple == null)
+				return false;
+
+			return
+				comparer.Equals(_item1, tuple._item1) &&
+				comparer.Equals(_item2, tuple._item2) &&
+				comparer.Equals(_item3, tuple._item3) &&
+				comparer.Equals(_item4, tuple._item4);
+		}
+
+		int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
+		{
+			return
+				Tuple.CombineHashCodes(
+					comparer.GetHashCode(_item1),
+					comparer.GetHashCode(_item2),
+					comparer.GetHashCode(_item3),
+					comparer.GetHashCode(_item4));
+		}
+
+		int IComparable.CompareTo(object obj)
+		{
+			return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
+		}
+
+		int ITuple.GetHashCode(IEqualityComparer comparer)
+		{
+			return ((IStructuralEquatable)this).GetHashCode(comparer);
+		}
+
+		string ITuple.ToString(StringBuilder sb)
+		{
+			sb
+				.Append(_item1).Append(", ")
+				.Append(_item2).Append(", ")
+				.Append(_item3).Append(", ")
+				.Append(_item4).Append(")");
+
+			return sb.ToString();
+		}
+
+		public override string ToString()
+		{
+			var sb = new StringBuilder();
+			sb.Append("(");
+			return ((ITuple) this).ToString(sb);
+		}
+
+		public T1 Item1 { get { return _item1; } }
+		public T2 Item2 { get { return _item2; } }
+		public T3 Item3 { get { return _item3; } }
+		public T4 Item4 { get { return _item4; } }
+
+		int ITuple.Size { get { return 4; } }
+	}
+
+	[Serializable]
+	public class Tuple<T1,T2,T3,T4,T5> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple
+	{
+		readonly T1 _item1;
+		readonly T2 _item2;
+		readonly T3 _item3;
+		readonly T4 _item4;
+		readonly T5 _item5;
+
+		public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5)
+		{
+			_item1 = item1;
+			_item2 = item2;
+			_item3 = item3;
+			_item4 = item4;
+			_item5 = item5;
+		}
+
+		public override bool Equals(object obj)
+		{
+			return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default);
+		}
+
+		public override int GetHashCode()
+		{
+			return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
+		}
+
+		int IStructuralComparable.CompareTo(object other, IComparer comparer)
+		{
+			if (other == null)
+				return 1;
+
+			var tuple = other as Tuple<T1,T2,T3,T4,T5>;
+
+			if (tuple == null)
+				throw new ArgumentException(string.Format("Type '{0}' is not a tuple", other.GetType()), "other");
+
+			int num;
+
+			num = comparer.Compare(_item1, tuple._item1); if (num == 0) return num;
+			num = comparer.Compare(_item2, tuple._item2); if (num != 0) return num;
+			num = comparer.Compare(_item3, tuple._item3); if (num != 0) return num;
+			num = comparer.Compare(_item4, tuple._item4); if (num != 0) return num;
+
+			return comparer.Compare(_item5, tuple._item5);
+		}
+
+		bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
+		{
+			if (other == null)
+				return false;
+
+			var tuple = other as Tuple<T1,T2,T3,T4,T5>;
+
+			if (tuple == null)
+				return false;
+
+			return
+				comparer.Equals(_item1, tuple._item1) &&
+				comparer.Equals(_item2, tuple._item2) &&
+				comparer.Equals(_item3, tuple._item3) &&
+				comparer.Equals(_item4, tuple._item4) &&
+				comparer.Equals(_item5, tuple._item5);
+		}
+
+		int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
+		{
+			return
+				Tuple.CombineHashCodes(
+					comparer.GetHashCode(_item1),
+					comparer.GetHashCode(_item2),
+					comparer.GetHashCode(_item3),
+					comparer.GetHashCode(_item4),
+					comparer.GetHashCode(_item5));
+		}
+
+		int IComparable.CompareTo(object obj)
+		{
+			return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
+		}
+
+		int ITuple.GetHashCode(IEqualityComparer comparer)
+		{
+			return ((IStructuralEquatable)this).GetHashCode(comparer);
+		}
+
+		string ITuple.ToString(StringBuilder sb)
+		{
+			sb
+				.Append(_item1).Append(", ")
+				.Append(_item2).Append(", ")
+				.Append(_item3).Append(", ")
+				.Append(_item4).Append(", ")
+				.Append(_item5).Append(")");
+
+			return sb.ToString();
+		}
+
+		public override string ToString()
+		{
+			var sb = new StringBuilder();
+			sb.Append("(");
+			return ((ITuple) this).ToString(sb);
+		}
+
+		public T1 Item1 { get { return _item1; } }
+		public T2 Item2 { get { return _item2; } }
+		public T3 Item3 { get { return _item3; } }
+		public T4 Item4 { get { return _item4; } }
+		public T5 Item5 { get { return _item5; } }
+
+		int ITuple.Size { get { return 5; } }
+	}
+
+	[Serializable]
+	public class Tuple<T1,T2,T3,T4,T5,T6> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple
+	{
+		readonly T1 _item1;
+		readonly T2 _item2;
+		readonly T3 _item3;
+		readonly T4 _item4;
+		readonly T5 _item5;
+		readonly T6 _item6;
+
+		public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6)
+		{
+			_item1 = item1;
+			_item2 = item2;
+			_item3 = item3;
+			_item4 = item4;
+			_item5 = item5;
+			_item6 = item6;
+		}
+
+		public override bool Equals(object obj)
+		{
+			return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default);
+		}
+
+		public override int GetHashCode()
+		{
+			return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
+		}
+
+		int IStructuralComparable.CompareTo(object other, IComparer comparer)
+		{
+			if (other == null)
+				return 1;
+
+			var tuple = other as Tuple<T1,T2,T3,T4,T5,T6>;
+
+			if (tuple == null)
+				throw new ArgumentException(string.Format("Type '{0}' is not a tuple", other.GetType()), "other");
+
+			int num;
+
+			num = comparer.Compare(_item1, tuple._item1); if (num == 0) return num;
+			num = comparer.Compare(_item2, tuple._item2); if (num != 0) return num;
+			num = comparer.Compare(_item3, tuple._item3); if (num != 0) return num;
+			num = comparer.Compare(_item4, tuple._item4); if (num != 0) return num;
+			num = comparer.Compare(_item5, tuple._item5); if (num != 0) return num;
+
+			return comparer.Compare(_item6, tuple._item6);
+		}
+
+		bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
+		{
+			if (other == null)
+				return false;
+
+			var tuple = other as Tuple<T1,T2,T3,T4,T5,T6>;
+
+			if (tuple == null)
+				return false;
+
+			return
+				comparer.Equals(_item1, tuple._item1) &&
+				comparer.Equals(_item2, tuple._item2) &&
+				comparer.Equals(_item3, tuple._item3) &&
+				comparer.Equals(_item4, tuple._item4) &&
+				comparer.Equals(_item5, tuple._item5) &&
+				comparer.Equals(_item6, tuple._item6);
+		}
+
+		int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
+		{
+			return
+				Tuple.CombineHashCodes(
+					comparer.GetHashCode(_item1),
+					comparer.GetHashCode(_item2),
+					comparer.GetHashCode(_item3),
+					comparer.GetHashCode(_item4),
+					comparer.GetHashCode(_item5),
+					comparer.GetHashCode(_item6));
+		}
+
+		int IComparable.CompareTo(object obj)
+		{
+			return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
+		}
+
+		int ITuple.GetHashCode(IEqualityComparer comparer)
+		{
+			return ((IStructuralEquatable)this).GetHashCode(comparer);
+		}
+
+		string ITuple.ToString(StringBuilder sb)
+		{
+			sb
+				.Append(_item1).Append(", ")
+				.Append(_item2).Append(", ")
+				.Append(_item3).Append(", ")
+				.Append(_item4).Append(", ")
+				.Append(_item5).Append(", ")
+				.Append(_item6).Append(")");
+
+			return sb.ToString();
+		}
+
+		public override string ToString()
+		{
+			var sb = new StringBuilder();
+			sb.Append("(");
+			return ((ITuple) this).ToString(sb);
+		}
+
+		public T1 Item1 { get { return _item1; } }
+		public T2 Item2 { get { return _item2; } }
+		public T3 Item3 { get { return _item3; } }
+		public T4 Item4 { get { return _item4; } }
+		public T5 Item5 { get { return _item5; } }
+		public T6 Item6 { get { return _item6; } }
+
+		int ITuple.Size { get { return 6; } }
+	}
+
+	[Serializable]
+	public class Tuple<T1,T2,T3,T4,T5,T6,T7> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple
+	{
+		readonly T1 _item1;
+		readonly T2 _item2;
+		readonly T3 _item3;
+		readonly T4 _item4;
+		readonly T5 _item5;
+		readonly T6 _item6;
+		readonly T7 _item7;
+
+		public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7)
+		{
+			_item1 = item1;
+			_item2 = item2;
+			_item3 = item3;
+			_item4 = item4;
+			_item5 = item5;
+			_item6 = item6;
+			_item7 = item7;
+		}
+
+		public override bool Equals(object obj)
+		{
+			return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default);
+		}
+
+		public override int GetHashCode()
+		{
+			return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
+		}
+
+		int IStructuralComparable.CompareTo(object other, IComparer comparer)
+		{
+			if (other == null)
+				return 1;
+
+			var tuple = other as Tuple<T1,T2,T3,T4,T5,T6,T7>;
+
+			if (tuple == null)
+				throw new ArgumentException(string.Format("Type '{0}' is not a tuple", other.GetType()), "other");
+
+			int num;
+
+			num = comparer.Compare(_item1, tuple._item1); if (num == 0) return num;
+			num = comparer.Compare(_item2, tuple._item2); if (num != 0) return num;
+			num = comparer.Compare(_item3, tuple._item3); if (num != 0) return num;
+			num = comparer.Compare(_item4, tuple._item4); if (num != 0) return num;
+			num = comparer.Compare(_item5, tuple._item5); if (num != 0) return num;
+			num = comparer.Compare(_item6, tuple._item6); if (num != 0) return num;
+
+			return comparer.Compare(_item7, tuple._item7);
+		}
+
+		bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
+		{
+			if (other == null)
+				return false;
+
+			var tuple = other as Tuple<T1,T2,T3,T4,T5,T6,T7>;
+
+			if (tuple == null)
+				return false;
+
+			return
+				comparer.Equals(_item1, tuple._item1) &&
+				comparer.Equals(_item2, tuple._item2) &&
+				comparer.Equals(_item3, tuple._item3) &&
+				comparer.Equals(_item4, tuple._item4) &&
+				comparer.Equals(_item5, tuple._item5) &&
+				comparer.Equals(_item6, tuple._item6) &&
+				comparer.Equals(_item7, tuple._item7);
+		}
+
+		int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
+		{
+			return
+				Tuple.CombineHashCodes(
+					comparer.GetHashCode(_item1),
+					comparer.GetHashCode(_item2),
+					comparer.GetHashCode(_item3),
+					comparer.GetHashCode(_item4),
+					comparer.GetHashCode(_item5),
+					comparer.GetHashCode(_item6),
+					comparer.GetHashCode(_item7));
+		}
+
+		int IComparable.CompareTo(object obj)
+		{
+			return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
+		}
+
+		int ITuple.GetHashCode(IEqualityComparer comparer)
+		{
+			return ((IStructuralEquatable)this).GetHashCode(comparer);
+		}
+
+		string ITuple.ToString(StringBuilder sb)
+		{
+			sb
+				.Append(_item1).Append(", ")
+				.Append(_item2).Append(", ")
+				.Append(_item3).Append(", ")
+				.Append(_item4).Append(", ")
+				.Append(_item5).Append(", ")
+				.Append(_item6).Append(", ")
+				.Append(_item7).Append(")");
+
+			return sb.ToString();
+		}
+
+		public override string ToString()
+		{
+			var sb = new StringBuilder();
+			sb.Append("(");
+			return ((ITuple) this).ToString(sb);
+		}
+
+		public T1 Item1 { get { return _item1; } }
+		public T2 Item2 { get { return _item2; } }
+		public T3 Item3 { get { return _item3; } }
+		public T4 Item4 { get { return _item4; } }
+		public T5 Item5 { get { return _item5; } }
+		public T6 Item6 { get { return _item6; } }
+		public T7 Item7 { get { return _item7; } }
+
+		int ITuple.Size { get { return 7; } }
+	}
+
+	[Serializable]
+	public class Tuple<T1,T2,T3,T4,T5,T6,T7,TRest> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple
+	{
+		readonly T1    _item1;
+		readonly T2    _item2;
+		readonly T3    _item3;
+		readonly T4    _item4;
+		readonly T5    _item5;
+		readonly T6    _item6;
+		readonly T7    _item7;
+		readonly TRest _rest;
+
+		public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, TRest rest)
+		{
+			if (!(rest is ITuple))
+				throw new ArgumentException("Argument 'rest' is not a tuple", "rest");
+
+			_item1 = item1;
+			_item2 = item2;
+			_item3 = item3;
+			_item4 = item4;
+			_item5 = item5;
+			_item6 = item6;
+			_item7 = item7;
+			_rest  = rest;
+		}
+
+		public override bool Equals(object obj)
+		{
+			return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default);
+		}
+
+		public override int GetHashCode()
+		{
+			return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
+		}
+
+		int IStructuralComparable.CompareTo(object other, IComparer comparer)
+		{
+			if (other == null)
+				return 1;
+
+			var tuple = other as Tuple<T1,T2,T3,T4,T5,T6,T7,TRest>;
+
+			if (tuple == null)
+				throw new ArgumentException(string.Format("Type '{0}' is not a tuple", other.GetType()), "other");
+
+			int num;
+
+			num = comparer.Compare(_item1, tuple._item1); if (num == 0) return num;
+			num = comparer.Compare(_item2, tuple._item2); if (num != 0) return num;
+			num = comparer.Compare(_item3, tuple._item3); if (num != 0) return num;
+			num = comparer.Compare(_item4, tuple._item4); if (num != 0) return num;
+			num = comparer.Compare(_item5, tuple._item5); if (num != 0) return num;
+			num = comparer.Compare(_item6, tuple._item6); if (num != 0) return num;
+			num = comparer.Compare(_item7, tuple._item7); if (num != 0) return num;
+
+			return comparer.Compare(_rest, tuple._rest);
+		}
+
+		bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
+		{
+			if (other == null)
+				return false;
+
+			var tuple = other as Tuple<T1,T2,T3,T4,T5,T6,T7,TRest>;
+
+			if (tuple == null)
+				return false;
+
+			return
+				comparer.Equals(_item1, tuple._item1) &&
+				comparer.Equals(_item2, tuple._item2) &&
+				comparer.Equals(_item3, tuple._item3) &&
+				comparer.Equals(_item4, tuple._item4) &&
+				comparer.Equals(_item5, tuple._item5) &&
+				comparer.Equals(_item6, tuple._item6) &&
+				comparer.Equals(_item7, tuple._item7) &&
+				comparer.Equals(_rest,  tuple._rest);
+		}
+
+		int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
+		{
+			var rest = (ITuple)_rest;
+
+			if (rest.Size >= 8)
+				return rest.GetHashCode(comparer);
+
+			switch (8 - rest.Size)
+			{
+				case 1: return Tuple.CombineHashCodes(comparer.GetHashCode(_item7), rest.GetHashCode(comparer));
+				case 2: return Tuple.CombineHashCodes(comparer.GetHashCode(_item6), comparer.GetHashCode(_item7), rest.GetHashCode(comparer));
+				case 3: return Tuple.CombineHashCodes(comparer.GetHashCode(_item5), comparer.GetHashCode(_item6), comparer.GetHashCode(_item7), rest.GetHashCode(comparer));
+				case 4: return Tuple.CombineHashCodes(comparer.GetHashCode(_item4), comparer.GetHashCode(_item5), comparer.GetHashCode(_item6), comparer.GetHashCode(_item7), rest.GetHashCode(comparer));
+				case 5: return Tuple.CombineHashCodes(comparer.GetHashCode(_item3), comparer.GetHashCode(_item4), comparer.GetHashCode(_item5), comparer.GetHashCode(_item6), comparer.GetHashCode(_item7), rest.GetHashCode(comparer));
+				case 6: return Tuple.CombineHashCodes(comparer.GetHashCode(_item2), comparer.GetHashCode(_item3), comparer.GetHashCode(_item4), comparer.GetHashCode(_item5), comparer.GetHashCode(_item6), comparer.GetHashCode(_item7), rest.GetHashCode(comparer));
+				case 7: return Tuple.CombineHashCodes(comparer.GetHashCode(_item1), comparer.GetHashCode(_item2), comparer.GetHashCode(_item3), comparer.GetHashCode(_item4), comparer.GetHashCode(_item5), comparer.GetHashCode(_item6), comparer.GetHashCode(_item7), rest.GetHashCode(comparer));
+			}
+
+			return -1;
+		}
+
+		int IComparable.CompareTo(object obj)
+		{
+			return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
+		}
+
+		int ITuple.GetHashCode(IEqualityComparer comparer)
+		{
+			return ((IStructuralEquatable)this).GetHashCode(comparer);
+		}
+
+		string ITuple.ToString(StringBuilder sb)
+		{
+			sb
+				.Append(_item1).Append(", ")
+				.Append(_item2).Append(", ")
+				.Append(_item3).Append(", ")
+				.Append(_item4).Append(", ")
+				.Append(_item5).Append(", ")
+				.Append(_item6).Append(", ")
+				.Append(_item7).Append(", ");
+
+			return ((ITuple)_rest).ToString(sb);
+		}
+
+		public override string ToString()
+		{
+			var sb = new StringBuilder();
+			sb.Append("(");
+			return ((ITuple)this).ToString(sb);
+		}
+
+		public T1    Item1 { get { return _item1; } }
+		public T2    Item2 { get { return _item2; } }
+		public T3    Item3 { get { return _item3; } }
+		public T4    Item4 { get { return _item4; } }
+		public T5    Item5 { get { return _item5; } }
+		public T6    Item6 { get { return _item6; } }
+		public T7    Item7 { get { return _item7; } }
+		public TRest Rest  { get { return _rest;  } }
+
+		int ITuple.Size { get { return 7 + ((ITuple)_rest).Size; } }
+	}
+
+	#endregion
+
+	namespace Collections
+	{
+		public interface IStructuralEquatable
+		{
+			bool Equals     (object other, IEqualityComparer comparer);
+			int  GetHashCode(IEqualityComparer comparer);
+		}
+
+		public interface IStructuralComparable
+		{
+			int CompareTo(object other, IComparer comparer);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Common/CompatibilitySL.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,335 @@
+using System;
+using System.Globalization;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Runtime.Serialization;
+using System.Text;
+using JetBrains.Annotations;
+
+namespace System
+{
+	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Delegate, Inherited = false)]
+	class SerializableAttribute : Attribute
+	{
+	}
+
+	[ComVisible(true)]
+	interface ICloneable
+	{
+		object Clone();
+	}
+
+	namespace Collections
+	{
+		public class Comparer : IComparer
+		{
+			readonly CompareInfo _compareInfo; 
+
+			public static readonly Comparer Default          = new Comparer(CultureInfo.CurrentCulture);
+			public static readonly Comparer DefaultInvariant = new Comparer(CultureInfo.InvariantCulture); 
+
+			private const String CompareInfoName = "CompareInfo";
+
+			public Comparer([NotNull] CultureInfo culture)
+			{
+				if (culture == null) throw new ArgumentNullException("culture");
+				_compareInfo = culture.CompareInfo;
+			}
+
+			public int Compare(object a, object b)
+			{
+				if (a == b)    return  0;
+				if (a == null) return -1;
+				if (b == null) return  1;
+
+				if (_compareInfo != null) {
+					var sa = a as String;
+					var sb = b as String;
+
+					if (sa != null && sb != null)
+						return _compareInfo.Compare(sa, sb);
+				} 
+
+				var ia = a as IComparable;
+
+				if (ia != null)
+					return ia.CompareTo(b);
+
+				throw new ArgumentException("Object should implement IComparable interface.");
+			}
+		}
+
+		namespace Generic
+		{
+			public static class Extensions
+			{
+				public static List<TOutput> ConvertAll<T,TOutput>(this List<T> input,  Converter<T,TOutput> converter)
+				{
+					var list = new List<TOutput>(input.Count);
+
+					list.AddRange(from T t in input select converter(t));
+
+					return list;
+				}
+
+				public static bool Exists<T>(this List<T> list, Predicate<T> match)
+				{
+					return list.Any(item => match(item));
+				}
+			}
+		}
+	}
+
+	namespace ComponentModel
+	{
+		[AttributeUsage(AttributeTargets.Property | AttributeTargets.Event | AttributeTargets.Class | AttributeTargets.Method)]
+		public class DisplayNameAttribute : Attribute
+		{
+			public static readonly DisplayNameAttribute Default = new DisplayNameAttribute();
+
+			public DisplayNameAttribute()
+			{
+				DisplayName = string.Empty;
+			}
+ 
+			public DisplayNameAttribute(string displayName)
+			{
+				DisplayName = displayName;
+			}
+
+			public string DisplayName{ get; set; }
+		}
+	}
+
+	namespace Data
+	{
+		public interface IDataRecord
+		{
+			int         FieldCount        { get; }
+			object      this[int i]       { get; }
+			object      this[string name] { get; }
+
+			string      GetName        (int i);
+			string      GetDataTypeName(int i);
+			Type        GetFieldType   (int i);
+			object      GetValue       (int i);
+			int         GetValues      (object[] values);
+			int         GetOrdinal     (string name);
+			bool        GetBoolean     (int i);
+			byte        GetByte        (int i);
+			long        GetBytes       (int i, long fieldOffset, byte[] buffer, int bufferoffset, int length);
+			char        GetChar        (int i);
+			long        GetChars       (int i, long fieldoffset, char[] buffer, int bufferoffset, int length);
+			Guid        GetGuid        (int i);
+			short       GetInt16       (int i);
+			int         GetInt32       (int i);
+			long        GetInt64       (int i);
+			float       GetFloat       (int i);
+			double      GetDouble      (int i);
+			string      GetString      (int i);
+			decimal     GetDecimal     (int i);
+			DateTime    GetDateTime    (int i);
+			IDataReader GetData        (int i);
+			bool        IsDBNull       (int i);
+		}
+
+		public interface IDataReader : IDisposable, IDataRecord
+		{
+			int       Depth { get; }
+			bool      IsClosed { get; }
+			int       RecordsAffected { get; }
+			void      Close();
+			//DataTable GetSchemaTable();
+			bool      NextResult();
+			bool      Read();
+		}
+
+		public enum SqlDbType
+		{
+			BigInt           = 0,
+			Binary           = 1,
+			Bit              = 2,
+			Char             = 3,
+			DateTime         = 4,
+			Decimal          = 5,
+			Float            = 6,
+			Image            = 7,
+			Int              = 8,
+			Money            = 9,
+			NChar            = 10,
+			NText            = 11,
+			NVarChar         = 12,
+			Real             = 13,
+			UniqueIdentifier = 14,
+			SmallDateTime    = 15,
+			SmallInt         = 16,
+			SmallMoney       = 17,
+			Text             = 18,
+			Timestamp        = 19,
+			TinyInt          = 20,
+			VarBinary        = 21,
+			VarChar          = 22,
+			Variant          = 23,
+			Xml              = 25,
+			Udt              = 29,
+			Structured       = 30,
+			Date             = 31,
+			Time             = 32,
+			DateTime2        = 33,
+			DateTimeOffset   = 34,
+		}
+
+		public enum DbType
+		{
+			AnsiString            = 0,
+			Binary                = 1,
+			Byte                  = 2,
+			Boolean               = 3,
+			Currency              = 4,
+			Date                  = 5,
+			DateTime              = 6,
+			Decimal               = 7,
+			Double                = 8,
+			Guid                  = 9,
+			Int16                 = 10,
+			Int32                 = 11,
+			Int64                 = 12,
+			Object                = 13,
+			SByte                 = 14,
+			Single                = 15,
+			String                = 16,
+			Time                  = 17,
+			UInt16                = 18,
+			UInt32                = 19,
+			UInt64                = 20,
+			VarNumeric            = 21,
+			AnsiStringFixedLength = 22,
+			StringFixedLength     = 23,
+			Xml                   = 25,
+			DateTime2             = 26,
+			DateTimeOffset        = 27,
+		}
+
+		namespace Linq
+		{
+			[DataContract]
+			[Serializable]
+			public sealed class Binary : IEquatable<Binary>
+			{
+				[DataMember(Name="Bytes")] byte[] _bytes;
+
+				int? _hashCode;
+
+				public Binary(byte[] value)
+				{
+					if (value == null) 
+						throw new ArgumentNullException("value");
+
+					_bytes = new byte[value.Length];
+					Array.Copy(value, _bytes, value.Length);
+					ComputeHash();
+				} 
+
+				public byte[] ToArray()
+				{
+					var copy = new byte[this._bytes.Length];
+					Array.Copy(_bytes, copy, copy.Length);
+					return copy;
+				} 
+ 
+				public int Length
+				{
+					get { return _bytes.Length; }
+				}
+
+				public static implicit operator Binary(byte[] value)
+				{
+					return new Binary(value);
+				}
+ 
+				public bool Equals(Binary other)
+				{
+					return EqualsTo(other);
+				}
+
+				public static bool operator == (Binary binary1, Binary binary2)
+				{
+					if ((object)binary1 == (object)binary2)                 return true;
+					if ((object)binary1 == null && (object)binary2 == null) return true;
+					if ((object)binary1 == null || (object)binary2 == null) return false;
+
+					return binary1.EqualsTo(binary2);
+				}
+
+				public static bool operator !=(Binary binary1, Binary binary2)
+				{
+					if ((object)binary1 == (object)binary2)                 return false;
+					if ((object)binary1 == null && (object)binary2 == null) return false;
+					if ((object)binary1 == null || (object)binary2 == null) return true;
+
+					return !binary1.EqualsTo(binary2);
+				}
+
+				public override bool Equals(object obj)
+				{
+					return EqualsTo(obj as Binary);
+				}
+ 
+				public override int GetHashCode()
+				{
+					if (!_hashCode.HasValue)
+						ComputeHash();
+
+					return _hashCode.Value;
+				}
+
+				public override string ToString()
+				{
+					var sb = new StringBuilder();
+
+					sb.Append("\"");
+					sb.Append(Convert.ToBase64String(_bytes, 0, _bytes.Length));
+					sb.Append("\""); 
+
+					return sb.ToString();
+				} 
+ 
+				private bool EqualsTo(Binary binary)
+				{
+					if ((object)this   == (object)binary)       return true;
+					if ((object)binary == null)                 return false;
+					if (_bytes.Length  != binary._bytes.Length) return false;
+					if (_hashCode      != binary._hashCode)     return false;
+
+					for (int i = 0; i < _bytes.Length; i++)
+						if (_bytes[i] != binary._bytes[i])
+							return false;
+
+					return true;
+				} 
+
+				private void ComputeHash()
+				{
+					var s = 314;
+					const int t = 159;
+
+					_hashCode = 0;
+
+					for (var i = 0; i < _bytes.Length; i++)
+					{
+						_hashCode = _hashCode * s + _bytes[i];
+						s = s * t;
+					}
+				}
+			}
+		}
+
+		namespace SqlTypes
+		{
+			public interface INullable
+			{
+				bool IsNull { get; }
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Common/CompoundValue.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,122 @@
+using System;
+using System.Collections;
+
+namespace BLToolkit.Common
+{
+	public class CompoundValue : IComparable, IEquatable<CompoundValue>
+	{
+		public CompoundValue(params object[] values)
+		{
+			if (values == null)
+				throw new ArgumentNullException("values");
+
+			// Note that the compound hash is precalculated.
+			// This means that CompoundValue can be used only with immutable values.
+			// Otherwise the behaviour is undefined.
+			//
+			_hash   = CalcHashCode(values);
+			_values = values;
+		}
+
+		private readonly object[] _values;
+		private readonly int      _hash;
+
+		public int Count
+		{
+			get { return _values == null ? 0 : _values.Length; }
+		}
+
+		public object this[int index]
+		{
+			get { return _values == null ? null : _values[index]; }
+		}
+
+		private static int CalcHashCode(object[] values)
+		{
+			if (values.Length == 0)
+				return 0;
+
+			object o = values[0];
+			int hash = o == null ? 0 : o.GetHashCode();
+
+			for (int i = 1; i < values.Length; i++)
+			{
+				o = values[i];
+				hash = ((hash << 5) + hash) ^ (o == null ? 0 : o.GetHashCode());
+			}
+
+			return hash;
+		}
+
+		#region IComparable Members
+
+		public int CompareTo(object obj)
+		{
+			var objValues = ((CompoundValue)obj)._values;
+
+			if (_values.Length != objValues.Length)
+				return _values.Length - objValues.Length;
+
+			for (var i = 0; i < _values.Length; i++)
+			{
+				var n = Comparer.Default.Compare(_values[i], objValues[i]);
+
+				if (n != 0)
+					return n;
+			}
+
+			return 0;
+		}
+
+		#endregion
+
+		#region Object Overrides
+
+		public override int GetHashCode()
+		{
+			return _hash;
+		}
+
+		public override bool Equals(object obj)
+		{
+			if (!(obj is CompoundValue))
+				return false;
+
+			return Equals((CompoundValue)obj);
+		}
+
+		#endregion
+
+		#region IEquatable<CompoundValue> Members
+
+		public bool Equals(CompoundValue other)
+		{
+			if (_hash != other._hash)
+				return false;
+
+			object[] values = other._values;
+
+			if (_values.Length != values.Length)
+				return false;
+
+			for (int i = 0; i < _values.Length; i++)
+			{
+				object x = _values[i];
+				object y =  values[i];
+
+				if (x == null && y == null)
+					continue;
+
+				if (x == null || y == null)
+					return false;
+
+				if (x.Equals(y) == false)
+					return false;
+			}
+
+			return true;
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Common/Configuration.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,106 @@
+using System;
+
+namespace BLToolkit.Common
+{
+	using Mapping;
+
+	public static class Configuration
+	{
+		static Configuration()
+		{
+			NotifyOnEqualSet                      = true;
+			TrimDictionaryKey                     = true;
+			CheckNullReturnIfNull                 = NullEquivalent.DBNull;
+			OpenNewConnectionToDiscoverParameters = true;
+		}
+
+		public enum NullEquivalent { DBNull, Null, Value }
+
+		/// <summary>
+		/// Specifies what value should be returned by <c>TypeAccessor.CheckNull</c>
+		/// if <see cref="BLToolkit.Reflection.IsNullHandler"/> was specified and interpreted current property 
+		/// value as null. Default is: <see cref="DBNull"/>.
+		/// </summary>
+		public static NullEquivalent CheckNullReturnIfNull { get; set; }
+
+		/// <summary>
+		/// Controls global trimming behaviour of mapper. Specifies whether trailing spaces
+		/// should be trimmed when mapping from one entity to another. Default is: false. 
+		/// To specify trimming behaviour other than global, please user <see cref="TrimmableAttribute"/>.
+		/// </summary>
+		public static bool TrimOnMapping { get; set; }
+
+		/// <summary>
+		/// Controls global trimming behaviour of mapper for dictionary keys. Specifies whether trailing spaces
+		/// should be trimmed when adding keys to dictionaries. Default is: true. 
+		/// </summary>
+		public static bool TrimDictionaryKey { get; set; }
+
+		/// <summary>
+		/// Specifies default behavior for PropertyChange generation. If set to true, <see cref="BLToolkit.EditableObjects.EditableObject.OnPropertyChanged"/>
+		/// is invoked even when current value is same as new one. If set to false,  <see cref="BLToolkit.EditableObjects.EditableObject.OnPropertyChanged"/> 
+		/// is invoked only when new value is being assigned. To specify notification behaviour other than default, please see 
+		/// <see cref="BLToolkit.TypeBuilder.PropertyChangedAttribute"/>
+		/// </summary>
+		public static bool NotifyOnEqualSet { get; set; }
+
+		/// <summary>
+		/// Controls whether attributes specified on base types should be always added to list of attributes
+		/// when scanning hierarchy tree or they should be compared to attributes found on derived classes
+		/// and added only when not present already. Default value: false;
+		/// WARNING: setting this flag to "true" can significantly affect initial object generation/access performance
+		/// use only when side effects are noticed with attribute being present on derived and base classes. 
+		/// For builder attributes use provided attribute compatibility mechanism.
+		/// </summary>
+		public static bool FilterOutBaseEqualAttributes { get; set; }
+
+		/// <summary>
+		/// Controls whether attributes specified on base types should be always added to list of attributes
+		/// when scanning hierarchy tree or they should be compared to attributes found on derived classes
+		/// and added only when not present already. Default value: false;
+		/// WARNING: setting this flag to "true" can significantly affect initial object generation/access performance
+		/// use only when side effects are noticed with attribute being present on derived and base classes. 
+		/// For builder attributes use provided attribute compatibility mechanism.
+		/// </summary>
+		public static bool OpenNewConnectionToDiscoverParameters { get; set; }
+
+		public static class ExpressionMapper
+		{
+			public static bool IncludeComplexMapping { get; set; }
+		}
+
+		public static class Linq
+		{
+			public static bool PreloadGroups          { get; set; }
+			public static bool IgnoreEmptyUpdate      { get; set; }
+			public static bool AllowMultipleQuery     { get; set; }
+			public static bool GenerateExpressionTest { get; set; }
+		}
+
+		public static class NullableValues
+		{
+			public static Int32          Int32          = 0;
+			public static Double         Double         = 0;
+			public static Int16          Int16          = 0;
+			public static Boolean        Boolean        = false;
+			[CLSCompliant(false)]
+			public static SByte          SByte          = 0;
+			public static Int64          Int64          = 0;
+			public static Byte           Byte           = 0;
+			[CLSCompliant(false)]
+			public static UInt16         UInt16         = 0;
+			[CLSCompliant(false)]
+			public static UInt32         UInt32         = 0;
+			[CLSCompliant(false)]
+			public static UInt64         UInt64         = 0;
+			public static Single         Single         = 0;
+			public static Char           Char           = '\x0';
+			public static DateTime       DateTime       = DateTime.MinValue;
+			public static TimeSpan       TimeSpan       = TimeSpan.MinValue;
+			public static DateTimeOffset DateTimeOffset = DateTimeOffset.MinValue;
+			public static Decimal        Decimal        = 0m;
+			public static Guid           Guid           = Guid.Empty;
+			public static String         String         = string.Empty;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Common/Convert.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,968 @@
+using System;
+using System.Data.Linq;
+using System.Data.SqlTypes;
+using System.IO;
+using System.Threading;
+using System.Xml;
+#if !SILVERLIGHT
+using System.Xml.Linq;
+#endif
+
+namespace BLToolkit.Common
+{
+	using Properties;
+
+	/// <summary>Converts a base data type to another base data type.</summary>
+	public static partial class Convert
+	{
+		#region Boolean
+
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(Char p)
+		{
+			switch (p)
+			{
+				case '\x0' : // Allow int <=> Char <=> Boolean
+				case   '0' :
+				case   'n' :
+				case   'N' :
+				case   'f' :
+				case   'F' : return false;
+
+				case '\x1' : // Allow int <=> Char <=> Boolean
+				case   '1' :
+				case   'y' :
+				case   'Y' :
+				case   't' :
+				case   'T' : return true;
+			}
+
+			throw CreateInvalidCastException(typeof(Char), typeof(Boolean));
+		}
+
+		#endregion
+
+		#region Byte[]
+
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(Decimal p)
+		{
+			var bits  = Decimal.GetBits(p);
+			var bytes = new Byte[Buffer.ByteLength(bits)];
+
+			Buffer.BlockCopy(bits, 0, bytes, 0, bytes.Length);
+			return bytes;
+		}
+
+		/// <summary>Converts the value from <c>Stream</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(Stream p)
+		{
+			if (p == null || p == Stream.Null) return null;
+			if (p is MemoryStream)             return ((MemoryStream)p).ToArray();
+
+			var position = p.Seek(0, SeekOrigin.Begin);
+			var bytes    = new Byte[p.Length];
+
+			p.Read(bytes, 0, bytes.Length);
+			p.Position = position;
+
+			return bytes;
+		}
+
+		/// <summary>Converts the value from <c>Char[]</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(Char[] p)
+		{
+			var bytes = new Byte[Buffer.ByteLength(p)];
+
+			Buffer.BlockCopy(p, 0, bytes, 0, bytes.Length);
+			return bytes;
+		}
+
+		#endregion
+
+		#region Decimal
+
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(Byte[] p)
+		{
+			if (p == null || p.Length == 0) return 0.0m;
+
+			var bits = new int[p.Length / sizeof(int)];
+
+			Buffer.BlockCopy(p, 0, bits, 0, p.Length);
+			return new Decimal(bits);
+		}
+
+		public static Decimal ToDecimal(Binary p)
+		{
+			if (p == null || p.Length == 0) return 0.0m;
+
+			var bits = new int[p.Length / sizeof(int)];
+
+			Buffer.BlockCopy(p.ToArray(), 0, bits, 0, p.Length);
+			return new Decimal(bits);
+		}
+
+		#endregion
+
+		#region SqlTypes
+
+#if !SILVERLIGHT
+
+		#region SqlChars
+
+		// Scalar Types.
+		// 
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(String p)          { return p == null? SqlChars.Null: new SqlChars(p.ToCharArray()); }
+		/// <summary>Converts the value from <c>Char[]</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(Char[] p)          { return p == null? SqlChars.Null: new SqlChars(p); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(Byte[] p)          { return p == null? SqlChars.Null: new SqlChars(ToCharArray(p)); }
+		public static SqlChars ToSqlChars(Binary p)          { return p == null? SqlChars.Null: new SqlChars(ToCharArray(p.ToArray())); }
+
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>SqlChars</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlChars ToSqlChars(SByte p)           { return new SqlChars(ToString(p).ToCharArray()); }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(Int16 p)           { return new SqlChars(ToString(p).ToCharArray()); }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(Int32 p)           { return new SqlChars(ToString(p).ToCharArray()); }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(Int64 p)           { return new SqlChars(ToString(p).ToCharArray()); }
+
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(Byte p)            { return new SqlChars(ToString(p).ToCharArray()); }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>SqlChars</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlChars ToSqlChars(UInt16 p)          { return new SqlChars(ToString(p).ToCharArray()); }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>SqlChars</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlChars ToSqlChars(UInt32 p)          { return new SqlChars(ToString(p).ToCharArray()); }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>SqlChars</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlChars ToSqlChars(UInt64 p)          { return new SqlChars(ToString(p).ToCharArray()); }
+
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(Single p)          { return new SqlChars(ToString(p).ToCharArray()); }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(Double p)          { return new SqlChars(ToString(p).ToCharArray()); }
+
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(Boolean p)         { return new SqlChars(ToString(p).ToCharArray()); }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(Decimal p)         { return new SqlChars(ToString(p).ToCharArray()); }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(Char p)            { return new SqlChars(ToString(p).ToCharArray()); }
+		/// <summary>Converts the value from <c>TimeSpan</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(TimeSpan p)        { return new SqlChars(ToString(p).ToCharArray()); }
+		/// <summary>Converts the value from <c>DateTime</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(DateTime p)        { return new SqlChars(ToString(p).ToCharArray()); }
+		/// <summary>Converts the value from <c>DateTimeOffset</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(DateTimeOffset p)  { return new SqlChars(ToString(p).ToCharArray()); }
+		/// <summary>Converts the value from <c>Guid</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(Guid p)            { return new SqlChars(ToString(p).ToCharArray()); }
+
+		// Nullable Types.
+		// 
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>SqlChars</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlChars ToSqlChars(SByte? p)          { return p.HasValue? new SqlChars(p.ToString().ToCharArray()): SqlChars.Null; }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(Int16? p)          { return p.HasValue? new SqlChars(p.ToString().ToCharArray()): SqlChars.Null; }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(Int32? p)          { return p.HasValue? new SqlChars(p.ToString().ToCharArray()): SqlChars.Null; }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(Int64? p)          { return p.HasValue? new SqlChars(p.ToString().ToCharArray()): SqlChars.Null; }
+
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(Byte? p)           { return p.HasValue? new SqlChars(p.ToString().ToCharArray()): SqlChars.Null; }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>SqlChars</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlChars ToSqlChars(UInt16? p)         { return p.HasValue? new SqlChars(p.ToString().ToCharArray()): SqlChars.Null; }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>SqlChars</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlChars ToSqlChars(UInt32? p)         { return p.HasValue? new SqlChars(p.ToString().ToCharArray()): SqlChars.Null; }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>SqlChars</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlChars ToSqlChars(UInt64? p)         { return p.HasValue? new SqlChars(p.ToString().ToCharArray()): SqlChars.Null; }
+
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(Single? p)         { return p.HasValue? new SqlChars(p.ToString().ToCharArray()): SqlChars.Null; }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(Double? p)         { return p.HasValue? new SqlChars(p.ToString().ToCharArray()): SqlChars.Null; }
+
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(Boolean? p)        { return p.HasValue? new SqlChars(p.ToString().ToCharArray()): SqlChars.Null; }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(Decimal? p)        { return p.HasValue? new SqlChars(p.ToString().ToCharArray()): SqlChars.Null; }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(Char? p)           { return p.HasValue? new SqlChars(new Char[]{p.Value})       : SqlChars.Null; }
+		/// <summary>Converts the value from <c>TimeSpan?</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(TimeSpan? p)       { return p.HasValue? new SqlChars(p.ToString().ToCharArray()): SqlChars.Null; }
+		/// <summary>Converts the value from <c>DateTime?</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(DateTime? p)       { return p.HasValue? new SqlChars(p.ToString().ToCharArray()): SqlChars.Null; }
+		/// <summary>Converts the value from <c>DateTimeOffset?</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(DateTimeOffset? p) { return p.HasValue? new SqlChars(p.ToString().ToCharArray()): SqlChars.Null; }
+		/// <summary>Converts the value from <c>Guid?</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(Guid? p)           { return p.HasValue? new SqlChars(p.ToString().ToCharArray()): SqlChars.Null; }
+
+		// SqlTypes
+		// 
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(SqlString p)       { return (SqlChars)p; }
+
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(SqlByte p)         { return (SqlChars)p.ToSqlString(); }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(SqlInt16 p)        { return (SqlChars)p.ToSqlString(); }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(SqlInt32 p)        { return (SqlChars)p.ToSqlString(); }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(SqlInt64 p)        { return (SqlChars)p.ToSqlString(); }
+
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(SqlSingle p)       { return (SqlChars)p.ToSqlString(); }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(SqlDouble p)       { return (SqlChars)p.ToSqlString(); }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(SqlDecimal p)      { return (SqlChars)p.ToSqlString(); }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(SqlMoney p)        { return (SqlChars)p.ToSqlString(); }
+
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(SqlBoolean p)      { return (SqlChars)p.ToSqlString(); }
+		/// <summary>Converts the value from <c>SqlGuid</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(SqlGuid p)         { return (SqlChars)p.ToSqlString(); }
+		/// <summary>Converts the value from <c>SqlDateTime</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(SqlDateTime p)     { return (SqlChars)p.ToSqlString(); }
+		/// <summary>Converts the value from <c>SqlBinary</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(SqlBinary p)       { return p.IsNull? SqlChars.Null: new SqlChars(p.ToString().ToCharArray()); }
+
+		/// <summary>Converts the value from <c>Type</c> to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(Type p)            { return p == null? SqlChars.Null: new SqlChars(p.FullName.ToCharArray()); }
+		/// <summary>Converts the value of a specified object to an equivalent <c>SqlChars</c> value.</summary>
+		public static SqlChars ToSqlChars(object p)         
+		{
+			if (p == null || p is DBNull) return SqlChars.Null;
+
+			if (p is SqlChars) return (SqlChars)p;
+
+			// Scalar Types.
+			//
+			if (p is String)          return ToSqlChars((String)p);
+			if (p is Char[])          return ToSqlChars((Char[])p);
+			if (p is Byte[])          return ToSqlChars((Byte[])p);
+			if (p is Binary)          return ToSqlChars(((Binary)p).ToArray());
+
+			if (p is SByte)           return ToSqlChars((SByte)p);
+			if (p is Int16)           return ToSqlChars((Int16)p);
+			if (p is Int32)           return ToSqlChars((Int32)p);
+			if (p is Int64)           return ToSqlChars((Int64)p);
+
+			if (p is Byte)            return ToSqlChars((Byte)p);
+			if (p is UInt16)          return ToSqlChars((UInt16)p);
+			if (p is UInt32)          return ToSqlChars((UInt32)p);
+			if (p is UInt64)          return ToSqlChars((UInt64)p);
+
+			if (p is Single)          return ToSqlChars((Single)p);
+			if (p is Double)          return ToSqlChars((Double)p);
+
+			if (p is Boolean)         return ToSqlChars((Boolean)p);
+			if (p is Decimal)         return ToSqlChars((Decimal)p);
+
+			// SqlTypes
+			//
+			if (p is SqlString)       return ToSqlChars((SqlString)p);
+
+			if (p is SqlByte)         return ToSqlChars((SqlByte)p);
+			if (p is SqlInt16)        return ToSqlChars((SqlInt16)p);
+			if (p is SqlInt32)        return ToSqlChars((SqlInt32)p);
+			if (p is SqlInt64)        return ToSqlChars((SqlInt64)p);
+
+			if (p is SqlSingle)       return ToSqlChars((SqlSingle)p);
+			if (p is SqlDouble)       return ToSqlChars((SqlDouble)p);
+			if (p is SqlDecimal)      return ToSqlChars((SqlDecimal)p);
+			if (p is SqlMoney)        return ToSqlChars((SqlMoney)p);
+
+			if (p is SqlBoolean)      return ToSqlChars((SqlBoolean)p);
+			if (p is SqlBinary)       return ToSqlChars((SqlBinary)p);
+			if (p is Type)            return ToSqlChars((Type)p);
+
+			return new SqlChars(ToString(p).ToCharArray());
+		}
+
+		#endregion
+
+#endif
+
+		#endregion
+
+		#region Other Types
+
+		#region Binary
+
+		// Scalar Types.
+		// 
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(String p)          { return p == null? null: new Binary(System.Text.Encoding.UTF8.GetBytes(p)); }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(Byte p)            { return new Binary(new byte[]{p}); }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>Byte[]</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Binary ToLinqBinary(SByte p)           { return new Binary(new byte[]{checked((Byte)p)}); }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(Decimal p)        
+		{
+			var bits  = Decimal.GetBits(p);
+			var bytes = new Byte[Buffer.ByteLength(bits)];
+
+			Buffer.BlockCopy(bits, 0, bytes, 0, bytes.Length);
+			return new Binary(bytes);
+		}
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(Int16 p)           { return new Binary(BitConverter.GetBytes(p)); }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(Int32 p)           { return new Binary(BitConverter.GetBytes(p)); }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(Int64 p)           { return new Binary(BitConverter.GetBytes(p)); }
+
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>Byte[]</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Binary ToLinqBinary(UInt16 p)          { return new Binary(BitConverter.GetBytes(p)); }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>Byte[]</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Binary ToLinqBinary(UInt32 p)          { return new Binary(BitConverter.GetBytes(p)); }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>Byte[]</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Binary ToLinqBinary(UInt64 p)          { return new Binary(BitConverter.GetBytes(p)); }
+
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(Single p)          { return new Binary(BitConverter.GetBytes(p)); }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(Double p)          { return new Binary(BitConverter.GetBytes(p)); }
+
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(Boolean p)         { return new Binary(BitConverter.GetBytes(p)); }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(Char p)            { return new Binary(BitConverter.GetBytes(p)); }
+#if !SILVERLIGHT
+		/// <summary>Converts the value from <c>DateTime</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(DateTime p)        { return new Binary(ToByteArray(p.ToBinary())); }
+		/// <summary>Converts the value from <c>DateTimeOffset</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(DateTimeOffset p)  { return new Binary(ToByteArray(p.LocalDateTime.ToBinary())); }
+#endif
+		public static Binary ToLinqBinary(Byte[]         p)  { return new Binary(p); }
+		/// <summary>Converts the value from <c>TimeSpan</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(TimeSpan p)        { return new Binary(ToByteArray(p.Ticks)); }
+		/// <summary>Converts the value from <c>Stream</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(Stream p)         
+		{
+			if (p == null)         return null;
+			if (p is MemoryStream) return ((MemoryStream)p).ToArray();
+
+			var position = p.Seek(0, SeekOrigin.Begin);
+			var bytes = new Byte[p.Length];
+			p.Read(bytes, 0, bytes.Length);
+			p.Position = position;
+
+			return new Binary(bytes);
+		}
+		/// <summary>Converts the value from <c>Char[]</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(Char[] p)
+		{
+			var bytes = new Byte[Buffer.ByteLength(p)];
+
+			Buffer.BlockCopy(p, 0, bytes, 0, bytes.Length);
+			return new Binary(bytes);
+		}
+		/// <summary>Converts the value from <c>Guid</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(Guid p)            { return p == Guid.Empty? null: new Binary(p.ToByteArray()); }
+
+		// Nullable Types.
+		// 
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Binary ToLinqBinary(SByte? p)          { return p.HasValue? new Binary(ToByteArray(p.Value)): null; }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(Int16? p)          { return p.HasValue? new Binary(ToByteArray(p.Value)): null; }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(Int32? p)          { return p.HasValue? new Binary(ToByteArray(p.Value)): null; }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(Int64? p)          { return p.HasValue? new Binary(ToByteArray(p.Value)): null; }
+
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(Byte? p)           { return p.HasValue? new Binary(ToByteArray(p.Value)): null; }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Binary ToLinqBinary(UInt16? p)         { return p.HasValue? new Binary(ToByteArray(p.Value)): null; }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Binary ToLinqBinary(UInt32? p)         { return p.HasValue? new Binary(ToByteArray(p.Value)): null; }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Binary ToLinqBinary(UInt64? p)         { return p.HasValue? new Binary(ToByteArray(p.Value)): null; }
+
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(Single? p)         { return p.HasValue? new Binary(ToByteArray(p.Value)): null; }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(Double? p)         { return p.HasValue? new Binary(ToByteArray(p.Value)): null; }
+
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(Boolean? p)        { return p.HasValue? new Binary(ToByteArray(p.Value)): null; }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(Decimal? p)        { return p.HasValue? new Binary(ToByteArray(p.Value)): null; }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(Char? p)           { return p.HasValue? new Binary(ToByteArray(p.Value)): null; }
+		/// <summary>Converts the value from <c>DateTime?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(DateTime? p)       { return p.HasValue? new Binary(ToByteArray(p.Value)): null; }
+		/// <summary>Converts the value from <c>DateTimeOffset?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(DateTimeOffset? p) { return p.HasValue? new Binary(ToByteArray(p.Value)): null; }
+		/// <summary>Converts the value from <c>TimeSpan?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(TimeSpan? p)       { return p.HasValue? new Binary(ToByteArray(p.Value)): null; }
+		/// <summary>Converts the value from <c>Guid?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(Guid? p)           { return p.HasValue? new Binary(ToByteArray(p.Value)): null; }
+
+#if !SILVERLIGHT
+
+		// SqlTypes
+		// 
+		/// <summary>Converts the value from <c>SqlBinary</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(SqlBinary p)       { return p.IsNull? null: new Binary(p.Value); }
+		/// <summary>Converts the value from <c>SqlBytes</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(SqlBytes p)        { return p.IsNull? null: new Binary(p.Value); }
+		/// <summary>Converts the value from <c>SqlGuid</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(SqlGuid p)         { return p.IsNull? null: new Binary(p.ToByteArray()); }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(SqlString p)       { return p.IsNull? null: new Binary(ToByteArray(p.Value)); }
+
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(SqlByte p)         { return p.IsNull? null: new Binary(ToByteArray(p.Value)); }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(SqlInt16 p)        { return p.IsNull? null: new Binary(ToByteArray(p.Value)); }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(SqlInt32 p)        { return p.IsNull? null: new Binary(ToByteArray(p.Value)); }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(SqlInt64 p)        { return p.IsNull? null: new Binary(ToByteArray(p.Value)); }
+
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(SqlSingle p)       { return p.IsNull? null: new Binary(ToByteArray(p.Value)); }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(SqlDouble p)       { return p.IsNull? null: new Binary(ToByteArray(p.Value)); }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(SqlDecimal p)      { return p.IsNull? null: new Binary(ToByteArray(p.Value)); }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(SqlMoney p)        { return p.IsNull? null: new Binary(ToByteArray(p.Value)); }
+
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(SqlBoolean p)      { return p.IsNull? null: new Binary(ToByteArray(p.Value)); }
+
+#endif
+
+		/// <summary>Converts the value of a specified object to an equivalent <c>Byte[]</c> value.</summary>
+		public static Binary ToLinqBinary(object p)
+		{
+			if (p == null || p is DBNull) return null;
+
+			if (p is Byte[]) return new Binary((Byte[])p);
+			if (p is Binary) return (Binary)p;
+
+			// Scalar Types.
+			//
+			if (p is String)          return ToLinqBinary((String)p);
+			if (p is Byte)            return ToLinqBinary((Byte)p);
+			if (p is SByte)           return ToLinqBinary((SByte)p);
+			if (p is Decimal)         return ToLinqBinary((Decimal)p);
+			if (p is Int16)           return ToLinqBinary((Int16)p);
+			if (p is Int32)           return ToLinqBinary((Int32)p);
+			if (p is Int64)           return ToLinqBinary((Int64)p);
+
+			if (p is UInt16)          return ToLinqBinary((UInt16)p);
+			if (p is UInt32)          return ToLinqBinary((UInt32)p);
+			if (p is UInt64)          return ToLinqBinary((UInt64)p);
+
+			if (p is Single)          return ToLinqBinary((Single)p);
+			if (p is Double)          return ToLinqBinary((Double)p);
+
+			if (p is Boolean)         return ToLinqBinary((Boolean)p);
+			if (p is DateTime)        return ToLinqBinary((DateTime)p);
+			if (p is DateTimeOffset)  return ToLinqBinary((DateTimeOffset)p);
+			if (p is TimeSpan)        return ToLinqBinary((TimeSpan)p);
+			if (p is Stream)          return ToLinqBinary((Stream)p);
+			if (p is Char[])          return ToLinqBinary((Char[])p);
+			if (p is Guid)            return ToLinqBinary((Guid)p);
+
+#if !SILVERLIGHT
+
+			// SqlTypes
+			//
+			if (p is SqlBinary)       return ToLinqBinary((SqlBinary)p);
+			if (p is SqlBytes)        return ToLinqBinary((SqlBytes)p);
+			if (p is SqlGuid)         return ToLinqBinary((SqlGuid)p);
+			if (p is SqlString)       return ToLinqBinary((SqlString)p);
+
+			if (p is SqlByte)         return ToLinqBinary((SqlByte)p);
+			if (p is SqlInt16)        return ToLinqBinary((SqlInt16)p);
+			if (p is SqlInt32)        return ToLinqBinary((SqlInt32)p);
+			if (p is SqlInt64)        return ToLinqBinary((SqlInt64)p);
+
+			if (p is SqlSingle)       return ToLinqBinary((SqlSingle)p);
+			if (p is SqlDouble)       return ToLinqBinary((SqlDouble)p);
+			if (p is SqlDecimal)      return ToLinqBinary((SqlDecimal)p);
+			if (p is SqlMoney)        return ToLinqBinary((SqlMoney)p);
+
+			if (p is SqlBoolean)      return ToLinqBinary((SqlBoolean)p);
+
+#endif
+
+			throw CreateInvalidCastException(p.GetType(), typeof(Byte[]));
+		}
+
+		#endregion
+
+		#region Char[]
+
+		// Scalar Types.
+		// 
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>Char[]</c> value.</summary>
+		public static Char[] ToCharArray(String p)          { return p == null? null: p.ToCharArray(); }
+
+#if !SILVERLIGHT
+
+		// SqlTypes
+		// 
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>Char[]</c> value.</summary>
+		public static Char[] ToCharArray(SqlString p)       { return p.IsNull? null: p.Value.ToCharArray(); }
+		/// <summary>Converts the value from <c>SqlChars</c> to an equivalent <c>Char[]</c> value.</summary>
+		public static Char[] ToCharArray(SqlChars p)        { return p.IsNull? null: p.Value; }
+
+#endif
+
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>Char[]</c> value.</summary>
+		public static Char[] ToCharArray(Byte[] p)
+		{
+			if (p == null) return null;
+
+			var chars = new Char[p.Length / sizeof(Char)];
+
+			Buffer.BlockCopy(p, 0, chars, 0, p.Length);
+			return chars;
+		}
+
+		public static Char[] ToCharArray(Binary p)
+		{
+			if (p == null) return null;
+
+			var chars = new Char[p.Length / sizeof(Char)];
+
+			Buffer.BlockCopy(p.ToArray(), 0, chars, 0, p.Length);
+			return chars;
+		}
+
+		/// <summary>Converts the value of a specified object to an equivalent <c>Char[]</c> value.</summary>
+		public static Char[] ToCharArray(object p)
+		{
+			if (p == null || p is DBNull) return null;
+
+			if (p is Char[]) return (Char[])p;
+
+			// Scalar Types.
+			//
+			if (p is String)          return ToCharArray((String)p);
+
+#if !SILVERLIGHT
+
+			// SqlTypes
+			//
+			if (p is SqlString)       return ToCharArray((SqlString)p);
+			if (p is SqlChars)        return ToCharArray((SqlChars)p);
+
+#endif
+			if (p is Byte[])          return ToCharArray((Byte[])p);
+			if (p is Binary)          return ToCharArray(((Binary)p).ToArray());
+
+			return ToString(p).ToCharArray();
+		}
+
+		#endregion
+
+		#region XmlReader
+
+#if !SILVERLIGHT
+
+		// Scalar Types.
+		// 
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>XmlReader</c> value.</summary>
+		public static XmlReader ToXmlReader(String p)          { return p == null? null: new XmlTextReader(new StringReader(p)); }
+
+		// SqlTypes
+		// 
+		/// <summary>Converts the value from <c>SqlXml</c> to an equivalent <c>XmlReader</c> value.</summary>
+		public static XmlReader ToXmlReader(SqlXml p)          { return p.IsNull? null: p.CreateReader(); }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>XmlReader</c> value.</summary>
+		public static XmlReader ToXmlReader(SqlString p)       { return p.IsNull? null: new XmlTextReader(new StringReader(p.Value)); }
+		/// <summary>Converts the value from <c>SqlChars</c> to an equivalent <c>XmlReader</c> value.</summary>
+		public static XmlReader ToXmlReader(SqlChars p)        { return p.IsNull? null: new XmlTextReader(new StringReader(p.ToSqlString().Value)); }
+		/// <summary>Converts the value from <c>SqlBinary</c> to an equivalent <c>XmlReader</c> value.</summary>
+		public static XmlReader ToXmlReader(SqlBinary p)       { return p.IsNull? null: new XmlTextReader(new MemoryStream(p.Value)); }
+
+		// Other Types.
+		// 
+		/// <summary>Converts the value from <c>Stream</c> to an equivalent <c>XmlReader</c> value.</summary>
+		public static XmlReader ToXmlReader(Stream p)          { return p == null? null: new XmlTextReader(p); }
+		/// <summary>Converts the value from <c>TextReader</c> to an equivalent <c>XmlReader</c> value.</summary>
+		public static XmlReader ToXmlReader(TextReader p)      { return p == null? null: new XmlTextReader(p); }
+		/// <summary>Converts the value from <c>XmlDocument</c> to an equivalent <c>XmlReader</c> value.</summary>
+		public static XmlReader ToXmlReader(XmlDocument p)     { return p == null? null: new XmlTextReader(new StringReader(p.InnerXml)); }
+
+		/// <summary>Converts the value from <c>Char[]</c> to an equivalent <c>XmlReader</c> value.</summary>
+		public static XmlReader ToXmlReader(Char[] p)          { return p == null? null: new XmlTextReader(new StringReader(new string(p))); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>XmlReader</c> value.</summary>
+		public static XmlReader ToXmlReader(Byte[] p)          { return p == null? null: new XmlTextReader(new MemoryStream(p)); }
+		public static XmlReader ToXmlReader(Binary p)          { return p == null? null: new XmlTextReader(new MemoryStream(p.ToArray())); }
+
+		/// <summary>Converts the value of a specified object to an equivalent <c>XmlReader</c> value.</summary>
+		public static XmlReader ToXmlReader(object p)         
+		{
+			if (p == null || p is DBNull) return null;
+
+			if (p is XmlReader) return (XmlReader)p;
+
+			// Scalar Types.
+			//
+			if (p is String)          return ToXmlReader((String)p);
+
+			// SqlTypes
+			//
+			if (p is SqlXml)          return ToXmlReader((SqlXml)p);
+			if (p is SqlString)       return ToXmlReader((SqlString)p);
+			if (p is SqlChars)        return ToXmlReader((SqlChars)p);
+			if (p is SqlBinary)       return ToXmlReader((SqlBinary)p);
+
+			// Other Types.
+			//
+			if (p is XmlDocument)     return ToXmlReader((XmlDocument)p);
+
+			if (p is Char[])          return ToXmlReader((Char[])p);
+			if (p is Byte[])          return ToXmlReader((Byte[])p);
+			if (p is Binary)          return ToXmlReader(((Binary)p).ToArray());
+
+			throw CreateInvalidCastException(p.GetType(), typeof(XmlReader));
+		}
+
+#endif
+
+		#endregion
+
+		#region XmlDocument
+
+#if !SILVERLIGHT
+
+		// Scalar Types.
+		// 
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>XmlDocument</c> value.</summary>
+		public static XmlDocument ToXmlDocument(String p)
+		{
+			if (string.IsNullOrEmpty(p)) return null;
+
+			var doc = new XmlDocument();
+
+			doc.LoadXml(p);
+
+			return doc;
+		}
+
+		// SqlTypes
+		// 
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>XmlDocument</c> value.</summary>
+		public static XmlDocument ToXmlDocument(SqlString p)       { return p.IsNull? null: ToXmlDocument(p.Value); }
+		/// <summary>Converts the value from <c>SqlXml</c> to an equivalent <c>XmlDocument</c> value.</summary>
+		public static XmlDocument ToXmlDocument(SqlXml p)          { return p.IsNull? null: ToXmlDocument(p.Value); }
+		/// <summary>Converts the value from <c>SqlChars</c> to an equivalent <c>XmlDocument</c> value.</summary>
+		public static XmlDocument ToXmlDocument(SqlChars p)        { return p.IsNull? null: ToXmlDocument(p.ToSqlString().Value); }
+		/// <summary>Converts the value from <c>SqlBinary</c> to an equivalent <c>XmlDocument</c> value.</summary>
+		public static XmlDocument ToXmlDocument(SqlBinary p)       { return p.IsNull? null: ToXmlDocument(new MemoryStream(p.Value)); }
+
+		// Other Types.
+		// 
+		/// <summary>Converts the value from <c>Stream</c> to an equivalent <c>XmlDocument</c> value.</summary>
+		public static XmlDocument ToXmlDocument(Stream p)
+		{
+			if (p == null) return null;
+
+			var doc = new XmlDocument();
+
+			doc.Load(p);
+
+			return doc;
+		}
+
+		/// <summary>Converts the value from <c>TextReader</c> to an equivalent <c>XmlDocument</c> value.</summary>
+		public static XmlDocument ToXmlDocument(TextReader p)
+		{
+			if (p == null) return null;
+
+			var doc = new XmlDocument();
+
+			doc.Load(p);
+
+			return doc;
+		}
+
+		/// <summary>Converts the value from <c>XmlReader</c> to an equivalent <c>XmlDocument</c> value.</summary>
+		public static XmlDocument ToXmlDocument(XmlReader p)
+		{
+			if (p == null) return null;
+
+			var doc = new XmlDocument();
+
+			doc.Load(p);
+
+			return doc;
+		}
+
+		/// <summary>Converts the value from <c>Char[]</c> to an equivalent <c>XmlDocument</c> value.</summary>
+		public static XmlDocument ToXmlDocument(Char[] p)          { return p == null || p.Length == 0? null: ToXmlDocument(new string(p)); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>XmlDocument</c> value.</summary>
+		public static XmlDocument ToXmlDocument(Byte[] p)          { return p == null || p.Length == 0? null: ToXmlDocument(new MemoryStream(p)); }
+		public static XmlDocument ToXmlDocument(Binary p)          { return p == null || p.Length == 0? null: ToXmlDocument(new MemoryStream(p.ToArray())); }
+
+		/// <summary>Converts the value of a specified object to an equivalent <c>XmlDocument</c> value.</summary>
+		public static XmlDocument ToXmlDocument(object p)         
+		{
+			if (p == null || p is DBNull) return null;
+
+			if (p is XmlDocument) return (XmlDocument)p;
+
+			// Scalar Types.
+			//
+			if (p is String)          return ToXmlDocument((String)p);
+
+			// SqlTypes
+			//
+			if (p is SqlChars)        return ToXmlDocument((SqlChars)p);
+			if (p is SqlBinary)       return ToXmlDocument((SqlBinary)p);
+
+			// Other Types.
+			//
+
+			if (p is Char[])          return ToXmlDocument((Char[])p);
+			if (p is Byte[])          return ToXmlDocument((Byte[])p);
+			if (p is Binary)          return ToXmlDocument(((Binary)p).ToArray());
+
+			throw CreateInvalidCastException(p.GetType(), typeof(XmlDocument));
+		}
+
+#endif
+
+		#endregion
+
+		#region XElement
+
+#if !SILVERLIGHT
+
+		// Scalar Types.
+		// 
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>XElement</c> value.</summary>
+		public static XElement ToXElement(String p)
+		{
+			if (string.IsNullOrEmpty(p)) return null;
+
+			var doc = XElement.Parse(p);
+
+			return doc;
+		}
+
+		// SqlTypes
+		// 
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>XElement</c> value.</summary>
+		public static XElement ToXElement(SqlString p) { return p.IsNull ? null : ToXElement(p.Value); }
+		/// <summary>Converts the value from <c>SqlXml</c> to an equivalent <c>XElement</c> value.</summary>
+		public static XElement ToXElement(SqlXml p) { return p.IsNull ? null : ToXElement(p.Value); }
+		/// <summary>Converts the value from <c>SqlChars</c> to an equivalent <c>XElement</c> value.</summary>
+		public static XElement ToXElement(SqlChars p) { return p.IsNull ? null : ToXElement(p.ToSqlString().Value); }
+		/// <summary>Converts the value from <c>SqlBinary</c> to an equivalent <c>XElement</c> value.</summary>
+		public static XElement ToXElement(SqlBinary p) { return p.IsNull ? null : ToXElement(new MemoryStream(p.Value)); }
+
+		// Other Types.
+		// 
+		/// <summary>Converts the value from <c>Stream</c> to an equivalent <c>XElement</c> value.</summary>
+		public static XElement ToXElement(Stream p)
+		{
+			if (p == null) return null;
+
+			using (XmlReader r = XmlReader.Create(p))
+				return XElement.Load(r); 
+		}
+
+		/// <summary>Converts the value from <c>TextReader</c> to an equivalent <c>XElement</c> value.</summary>
+		public static XElement ToXElement(TextReader p)
+		{
+			if (p == null) return null;
+
+			var doc = XElement.Load(p);
+
+			return doc;
+		}
+
+		/// <summary>Converts the value from <c>XmlReader</c> to an equivalent <c>XElement</c> value.</summary>
+		public static XElement ToXElement(XmlReader p)
+		{
+			if (p == null) return null;
+
+			var doc = XElement.Load(p);
+
+			return doc;
+		}
+
+		/// <summary>Converts the value from <c>Char[]</c> to an equivalent <c>XElement</c> value.</summary>
+		public static XElement ToXElement(Char[] p) { return p == null || p.Length == 0 ? null : ToXElement(new string(p)); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>XElement</c> value.</summary>
+		public static XElement ToXElement(Byte[] p) { return p == null || p.Length == 0 ? null : ToXElement(new MemoryStream(p)); }
+		public static XElement ToXElement(Binary p) { return p == null || p.Length == 0 ? null : ToXElement(new MemoryStream(p.ToArray())); }
+
+		/// <summary>Converts the value of a specified object to an equivalent <c>XElement</c> value.</summary>
+		public static XElement ToXElement(object p)
+		{
+			if (p == null || p is DBNull) return null;
+
+			if (p is XElement) return (XElement)p;
+
+			// Scalar Types.
+			//
+			if (p is String) return ToXElement((String)p);
+
+			// SqlTypes
+			//
+			if (p is SqlChars) return ToXElement((SqlChars)p);
+			if (p is SqlBinary) return ToXElement((SqlBinary)p);
+
+			// Other Types.
+			//
+
+			if (p is Char[]) return ToXElement((Char[])p);
+			if (p is Byte[]) return ToXElement((Byte[])p);
+			if (p is Binary) return ToXElement(((Binary)p).ToArray());
+
+			throw CreateInvalidCastException(p.GetType(), typeof(XElement));
+		}
+
+#endif
+
+		#endregion
+
+		#endregion
+
+		#region ChangeTypeFromString
+
+		public static object ChangeTypeFromString(string str, Type type)
+		{
+			if (str == null)
+				return null;
+
+			if (type == typeof(string))
+				return str;
+
+			var underlyingType = type;
+			var isNullable     = false;
+
+			if (underlyingType.IsGenericType && underlyingType.GetGenericTypeDefinition() == typeof(Nullable<>))
+			{
+				isNullable     = true;
+				underlyingType = underlyingType.GetGenericArguments()[0];
+			}
+
+			if (underlyingType.IsEnum)
+				return Enum.Parse(type, str, false);
+
+			if (isNullable)
+			{
+				switch (Type.GetTypeCode(underlyingType))
+				{
+					case TypeCode.Boolean  : return ToNullableBoolean (str);
+					case TypeCode.Char     : return ToNullableChar    (str);
+					case TypeCode.SByte    : return ToNullableSByte   (str);
+					case TypeCode.Byte     : return ToNullableByte    (str);
+					case TypeCode.Int16    : return ToNullableInt16   (str);
+					case TypeCode.UInt16   : return ToNullableUInt16  (str);
+					case TypeCode.Int32    : return ToNullableInt32   (str);
+					case TypeCode.UInt32   : return ToNullableUInt32  (str);
+					case TypeCode.Int64    : return ToNullableInt64   (str);
+					case TypeCode.UInt64   : return ToNullableUInt64  (str);
+					case TypeCode.Single   : return ToNullableSingle  (str);
+					case TypeCode.Double   : return ToNullableDouble  (str);
+					case TypeCode.Decimal  : return ToNullableDecimal (str);
+					case TypeCode.DateTime : return ToNullableDateTime(str);
+					case TypeCode.Object   :
+						if (type == typeof(Guid))           return ToNullableGuid          (str);
+						if (type == typeof(DateTimeOffset)) return ToNullableDateTimeOffset(str);
+						if (type == typeof(TimeSpan))       return ToNullableTimeSpan      (str);
+						break;
+					default                : break;
+				}
+			}
+			else
+			{
+				switch (Type.GetTypeCode(underlyingType))
+				{
+					case TypeCode.Boolean  : return ToBoolean(str);
+					case TypeCode.Char     : return ToChar    (str);
+					case TypeCode.SByte    : return ToSByte   (str);
+					case TypeCode.Byte     : return ToByte    (str);
+					case TypeCode.Int16    : return ToInt16   (str);
+					case TypeCode.UInt16   : return ToUInt16  (str);
+					case TypeCode.Int32    : return ToInt32   (str);
+					case TypeCode.UInt32   : return ToUInt32  (str);
+					case TypeCode.Int64    : return ToInt64   (str);
+					case TypeCode.UInt64   : return ToUInt64  (str);
+					case TypeCode.Single   : return ToSingle  (str);
+					case TypeCode.Double   : return ToDouble  (str);
+					case TypeCode.Decimal  : return ToDecimal (str);
+					case TypeCode.DateTime : return ToDateTime(str);
+					default                : break;
+				}
+
+				if (type.IsArray)
+				{
+					if (type == typeof(byte[])) return ToByteArray(str);
+				}
+
+				if (type.IsClass)
+				{
+					if (type == typeof(Binary)) return ToLinqBinary    (str);
+				}
+			}
+
+			if (type == typeof(Guid))           return ToGuid          (str);
+			if (type == typeof(DateTimeOffset)) return ToDateTimeOffset(str);
+			if (type == typeof(TimeSpan))       return ToTimeSpan      (str);
+
+#if !SILVERLIGHT
+
+			if (type == typeof(SqlByte))        return ToSqlByte    (str);
+			if (type == typeof(SqlInt16))       return ToSqlInt16   (str);
+			if (type == typeof(SqlInt32))       return ToSqlInt32   (str);
+			if (type == typeof(SqlInt64))       return ToSqlInt64   (str);
+			if (type == typeof(SqlSingle))      return ToSqlSingle  (str);
+			if (type == typeof(SqlBoolean))     return ToSqlBoolean (str);
+			if (type == typeof(SqlDouble))      return ToSqlDouble  (str);
+			if (type == typeof(SqlDateTime))    return ToSqlDateTime(str);
+			if (type == typeof(SqlDecimal))     return ToSqlDecimal (str);
+			if (type == typeof(SqlMoney))       return ToSqlMoney   (str);
+			if (type == typeof(SqlString))      return ToSqlString  (str);
+			if (type == typeof(SqlGuid))        return ToSqlGuid    (str);
+
+#endif
+
+			return System.Convert.ChangeType(str, type, Thread.CurrentThread.CurrentCulture);
+		}
+
+
+		#endregion
+
+		static Exception CreateInvalidCastException(Type originalType, Type conversionType)
+		{
+			return new InvalidCastException(string.Format(Resources.Convert_InvalidCast, originalType.FullName, conversionType.FullName));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Common/Convert.generated.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9031 @@
+//---------------------------------------------------------------------------------------------------
+// <auto-generated>
+//    This code was generated by BLToolkit template for T4.
+//    Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
+// </auto-generated>
+//---------------------------------------------------------------------------------------------------
+using System;
+using System.Data.Linq;
+using System.Data.SqlTypes;
+using System.Globalization;
+using System.IO;
+using System.Xml;
+#if !SILVERLIGHT
+using System.Xml.Linq;
+#endif
+
+namespace BLToolkit.Common
+{
+	using Properties;
+
+	public partial class Convert
+	{ 
+		#region Simple Types
+
+		#region Boolean
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(Byte       p) { return p != 0;                                                                                                     }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(Decimal    p) { return p != 0;                                                                                                     }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(Double     p) { return p != 0;                                                                                                     }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(Int16      p) { return p != 0;                                                                                                     }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(Int32      p) { return p != 0;                                                                                                     }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(Int64      p) { return p != 0;                                                                                                     }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>Boolean</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Boolean ToBoolean(SByte      p) { return p != 0;                                                                                                     }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(Single     p) { return p != 0;                                                                                                     }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(String     p) { return p == null? Configuration.NullableValues.Boolean : p.Length == 1 ? ToBoolean(p[0]) : Boolean.Parse(p);       }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>Boolean</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Boolean ToBoolean(UInt16     p) { return p != 0;                                                                                                     }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>Boolean</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Boolean ToBoolean(UInt32     p) { return p != 0;                                                                                                     }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>Boolean</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Boolean ToBoolean(UInt64     p) { return p != 0;                                                                                                     }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(Boolean?   p) { return p.HasValue && p.Value;                                                                                      }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(Byte?      p) { return p.HasValue && p.Value != 0;                                                                                 }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(Char?      p) { return p.HasValue && ToBoolean(p.Value);                                                                           }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(Decimal?   p) { return p.HasValue && p.Value != 0;                                                                                 }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(Double?    p) { return p.HasValue && p.Value != 0;                                                                                 }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(Int16?     p) { return p.HasValue && p.Value != 0;                                                                                 }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(Int32?     p) { return p.HasValue && p.Value != 0;                                                                                 }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(Int64?     p) { return p.HasValue && p.Value != 0;                                                                                 }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>Boolean</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Boolean ToBoolean(SByte?     p) { return p.HasValue && p.Value != 0;                                                                                 }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(Single?    p) { return p.HasValue && p.Value != 0;                                                                                 }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>Boolean</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Boolean ToBoolean(UInt16?    p) { return p.HasValue && p.Value != 0;                                                                                 }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>Boolean</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Boolean ToBoolean(UInt32?    p) { return p.HasValue && p.Value != 0;                                                                                 }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>Boolean</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Boolean ToBoolean(UInt64?    p) { return p.HasValue && p.Value != 0;                                                                                 }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(Binary     p) { return p == null || p.Length == 0 ? Configuration.NullableValues.Boolean : BitConverter.ToBoolean(p.ToArray(), 0); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(Byte[]     p) { return p == null || p.Length == 0 ? Configuration.NullableValues.Boolean : BitConverter.ToBoolean(p, 0);           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(SqlBoolean p) { return !p.IsNull && p.Value;                                                                                       }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(SqlByte    p) { return !p.IsNull && ToBoolean(p.Value);                                                                            }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(SqlDecimal p) { return !p.IsNull && ToBoolean(p.Value);                                                                            }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(SqlDouble  p) { return !p.IsNull && ToBoolean(p.Value);                                                                            }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(SqlInt16   p) { return !p.IsNull && ToBoolean(p.Value);                                                                            }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(SqlInt32   p) { return !p.IsNull && ToBoolean(p.Value);                                                                            }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(SqlInt64   p) { return !p.IsNull && ToBoolean(p.Value);                                                                            }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(SqlMoney   p) { return !p.IsNull && ToBoolean(p.Value);                                                                            }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(SqlSingle  p) { return !p.IsNull && ToBoolean(p.Value);                                                                            }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(SqlString  p) { return !p.IsNull && ToBoolean(p.Value);                                                                            }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>Boolean</c> value.</summary>
+		public static Boolean ToBoolean(object p)
+		{
+			if (p == null) return Configuration.NullableValues.Boolean;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull  : return Configuration.NullableValues.Boolean;
+				case TypeCode.Boolean : return (Boolean)p;
+				case TypeCode.Char    : return ToBoolean((Char)   p);
+				case TypeCode.String  : return ToBoolean((String) p);
+				case TypeCode.SByte   : return ToBoolean((SByte)  p);
+				case TypeCode.Int16   : return ToBoolean((Int16)  p);
+				case TypeCode.Int32   : return ToBoolean((Int32)  p);
+				case TypeCode.Int64   : return ToBoolean((Int64)  p);
+				case TypeCode.Byte    : return ToBoolean((Byte)   p);
+				case TypeCode.UInt16  : return ToBoolean((UInt16) p);
+				case TypeCode.UInt32  : return ToBoolean((UInt32) p);
+				case TypeCode.UInt64  : return ToBoolean((UInt64) p);
+				case TypeCode.Single  : return ToBoolean((Single) p);
+				case TypeCode.Double  : return ToBoolean((Double) p);
+				case TypeCode.Decimal : return ToBoolean((Decimal)p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToBoolean((Boolean?)  p);
+				if (p is Byte?)      return ToBoolean((Byte?)     p);
+				if (p is Char?)      return ToBoolean((Char?)     p);
+				if (p is Decimal?)   return ToBoolean((Decimal?)  p);
+				if (p is Double?)    return ToBoolean((Double?)   p);
+				if (p is Int16?)     return ToBoolean((Int16?)    p);
+				if (p is Int32?)     return ToBoolean((Int32?)    p);
+				if (p is Int64?)     return ToBoolean((Int64?)    p);
+				if (p is SByte?)     return ToBoolean((SByte?)    p);
+				if (p is Single?)    return ToBoolean((Single?)   p);
+				if (p is UInt16?)    return ToBoolean((UInt16?)   p);
+				if (p is UInt32?)    return ToBoolean((UInt32?)   p);
+				if (p is UInt64?)    return ToBoolean((UInt64?)   p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToBoolean((Binary)    p);
+			if (p is Byte[])     return ToBoolean((Byte[])    p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToBoolean((SqlBoolean)p);
+				if (p is SqlByte)    return ToBoolean((SqlByte)   p);
+				if (p is SqlDecimal) return ToBoolean((SqlDecimal)p);
+				if (p is SqlDouble)  return ToBoolean((SqlDouble) p);
+				if (p is SqlInt16)   return ToBoolean((SqlInt16)  p);
+				if (p is SqlInt32)   return ToBoolean((SqlInt32)  p);
+				if (p is SqlInt64)   return ToBoolean((SqlInt64)  p);
+				if (p is SqlMoney)   return ToBoolean((SqlMoney)  p);
+				if (p is SqlSingle)  return ToBoolean((SqlSingle) p);
+				if (p is SqlString)  return ToBoolean((SqlString) p);
+			}
+
+#endif
+
+			if (p is IConvertible) return ((IConvertible)p).ToBoolean(null);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(Boolean));
+		}
+
+		#endregion
+
+		#region Byte
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(Boolean    p) { return p ? (Byte)1 : (Byte)0;                                                           }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(Char       p) { return checked((Byte)p);                                                                }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(Decimal    p) { return checked((Byte)p);                                                                }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(Double     p) { return checked((Byte)p);                                                                }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(Int16      p) { return checked((Byte)p);                                                                }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(Int32      p) { return checked((Byte)p);                                                                }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(Int64      p) { return checked((Byte)p);                                                                }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>Byte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Byte ToByte(SByte      p) { return checked((Byte)p);                                                                }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(Single     p) { return checked((Byte)p);                                                                }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(String     p) { return p == null? Configuration.NullableValues.Byte : Byte.Parse(p);                    }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>Byte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Byte ToByte(UInt16     p) { return checked((Byte)p);                                                                }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>Byte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Byte ToByte(UInt32     p) { return checked((Byte)p);                                                                }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>Byte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Byte ToByte(UInt64     p) { return checked((Byte)p);                                                                }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(Boolean?   p) { return p.HasValue && p.Value ? (Byte)1: (Byte)0;                                        }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(Byte?      p) { return p.HasValue ? p.Value : Configuration.NullableValues.Byte;                        }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(Char?      p) { return p.HasValue ? checked((Byte)p.Value) : Configuration.NullableValues.Byte;         }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(Decimal?   p) { return p.HasValue ? checked((Byte)p.Value) : Configuration.NullableValues.Byte;         }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(Double?    p) { return p.HasValue ? checked((Byte)p.Value) : Configuration.NullableValues.Byte;         }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(Int16?     p) { return p.HasValue ? checked((Byte)p.Value) : Configuration.NullableValues.Byte;         }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(Int32?     p) { return p.HasValue ? checked((Byte)p.Value) : Configuration.NullableValues.Byte;         }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(Int64?     p) { return p.HasValue ? checked((Byte)p.Value) : Configuration.NullableValues.Byte;         }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>Byte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Byte ToByte(SByte?     p) { return p.HasValue ? checked((Byte)p.Value) : Configuration.NullableValues.Byte;         }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(Single?    p) { return p.HasValue ? checked((Byte)p.Value) : Configuration.NullableValues.Byte;         }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>Byte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Byte ToByte(UInt16?    p) { return p.HasValue ? checked((Byte)p.Value) : Configuration.NullableValues.Byte;         }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>Byte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Byte ToByte(UInt32?    p) { return p.HasValue ? checked((Byte)p.Value) : Configuration.NullableValues.Byte;         }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>Byte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Byte ToByte(UInt64?    p) { return p.HasValue ? checked((Byte)p.Value) : Configuration.NullableValues.Byte;         }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(Binary     p) { return p == null || p.Length == 0 ? Configuration.NullableValues.Byte : p.ToArray()[0]; }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(Byte[]     p) { return p == null || p.Length == 0 ? Configuration.NullableValues.Byte : p[0];           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(SqlBoolean p) { return p.IsNull ? Configuration.NullableValues.Byte : ToByte(p.Value);                  }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(SqlByte    p) { return p.IsNull ? Configuration.NullableValues.Byte : p.Value;                          }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(SqlDecimal p) { return p.IsNull ? Configuration.NullableValues.Byte : ToByte(p.Value);                  }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(SqlDouble  p) { return p.IsNull ? Configuration.NullableValues.Byte : ToByte(p.Value);                  }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(SqlInt16   p) { return p.IsNull ? Configuration.NullableValues.Byte : ToByte(p.Value);                  }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(SqlInt32   p) { return p.IsNull ? Configuration.NullableValues.Byte : ToByte(p.Value);                  }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(SqlInt64   p) { return p.IsNull ? Configuration.NullableValues.Byte : ToByte(p.Value);                  }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(SqlMoney   p) { return p.IsNull ? Configuration.NullableValues.Byte : ToByte(p.Value);                  }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(SqlSingle  p) { return p.IsNull ? Configuration.NullableValues.Byte : ToByte(p.Value);                  }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(SqlString  p) { return p.IsNull ? Configuration.NullableValues.Byte : ToByte(p.Value);                  }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>Byte</c> value.</summary>
+		public static Byte ToByte(object p)
+		{
+			if (p == null) return Configuration.NullableValues.Byte;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull  : return Configuration.NullableValues.Byte;
+				case TypeCode.Byte    : return (Byte)p;
+				case TypeCode.SByte   : return ToByte((SByte)  p);
+				case TypeCode.Int16   : return ToByte((Int16)  p);
+				case TypeCode.Int32   : return ToByte((Int32)  p);
+				case TypeCode.Int64   : return ToByte((Int64)  p);
+				case TypeCode.UInt16  : return ToByte((UInt16) p);
+				case TypeCode.UInt32  : return ToByte((UInt32) p);
+				case TypeCode.UInt64  : return ToByte((UInt64) p);
+				case TypeCode.Single  : return ToByte((Single) p);
+				case TypeCode.Double  : return ToByte((Double) p);
+				case TypeCode.Decimal : return ToByte((Decimal)p);
+				case TypeCode.Char    : return ToByte((Char)   p);
+				case TypeCode.String  : return ToByte((String) p);
+				case TypeCode.Boolean : return ToByte((Boolean)p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToByte((Boolean?)  p);
+				if (p is Byte?)      return ToByte((Byte?)     p);
+				if (p is Char?)      return ToByte((Char?)     p);
+				if (p is Decimal?)   return ToByte((Decimal?)  p);
+				if (p is Double?)    return ToByte((Double?)   p);
+				if (p is Int16?)     return ToByte((Int16?)    p);
+				if (p is Int32?)     return ToByte((Int32?)    p);
+				if (p is Int64?)     return ToByte((Int64?)    p);
+				if (p is SByte?)     return ToByte((SByte?)    p);
+				if (p is Single?)    return ToByte((Single?)   p);
+				if (p is UInt16?)    return ToByte((UInt16?)   p);
+				if (p is UInt32?)    return ToByte((UInt32?)   p);
+				if (p is UInt64?)    return ToByte((UInt64?)   p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToByte((Binary)    p);
+			if (p is Byte[])     return ToByte((Byte[])    p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToByte((SqlBoolean)p);
+				if (p is SqlByte)    return ToByte((SqlByte)   p);
+				if (p is SqlDecimal) return ToByte((SqlDecimal)p);
+				if (p is SqlDouble)  return ToByte((SqlDouble) p);
+				if (p is SqlInt16)   return ToByte((SqlInt16)  p);
+				if (p is SqlInt32)   return ToByte((SqlInt32)  p);
+				if (p is SqlInt64)   return ToByte((SqlInt64)  p);
+				if (p is SqlMoney)   return ToByte((SqlMoney)  p);
+				if (p is SqlSingle)  return ToByte((SqlSingle) p);
+				if (p is SqlString)  return ToByte((SqlString) p);
+			}
+
+#endif
+
+			if (p is IConvertible) return ((IConvertible)p).ToByte(null);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(Byte));
+		}
+
+		#endregion
+
+		#region Char
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(Boolean    p) { return p ? (Char)1 : (Char)0;                                                                                }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(Byte       p) { return checked((Char)p);                                                                                     }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(Decimal    p) { return checked((Char)p);                                                                                     }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(Double     p) { return checked((Char)p);                                                                                     }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(Int16      p) { return checked((Char)p);                                                                                     }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(Int32      p) { return checked((Char)p);                                                                                     }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(Int64      p) { return checked((Char)p);                                                                                     }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>Char</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Char ToChar(SByte      p) { return checked((Char)p);                                                                                     }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(Single     p) { return checked((Char)p);                                                                                     }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(String     p) { return string.IsNullOrEmpty(p)? (Char)0 : p[0];                                                              }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>Char</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Char ToChar(UInt16     p) { return checked((Char)p);                                                                                     }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>Char</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Char ToChar(UInt32     p) { return checked((Char)p);                                                                                     }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>Char</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Char ToChar(UInt64     p) { return checked((Char)p);                                                                                     }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(Boolean?   p) { return p.HasValue && p.Value ? (Char)1: (Char)0;                                                             }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(Byte?      p) { return p.HasValue ? checked((Char)p.Value) : Configuration.NullableValues.Char;                              }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(Char?      p) { return p.HasValue ? p.Value : Configuration.NullableValues.Char;                                             }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(Decimal?   p) { return p.HasValue ? checked((Char)p.Value) : Configuration.NullableValues.Char;                              }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(Double?    p) { return p.HasValue ? checked((Char)p.Value) : Configuration.NullableValues.Char;                              }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(Int16?     p) { return p.HasValue ? checked((Char)p.Value) : Configuration.NullableValues.Char;                              }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(Int32?     p) { return p.HasValue ? checked((Char)p.Value) : Configuration.NullableValues.Char;                              }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(Int64?     p) { return p.HasValue ? checked((Char)p.Value) : Configuration.NullableValues.Char;                              }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>Char</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Char ToChar(SByte?     p) { return p.HasValue ? checked((Char)p.Value) : Configuration.NullableValues.Char;                              }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(Single?    p) { return p.HasValue ? checked((Char)p.Value) : Configuration.NullableValues.Char;                              }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>Char</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Char ToChar(UInt16?    p) { return p.HasValue ? checked((Char)p.Value) : Configuration.NullableValues.Char;                              }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>Char</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Char ToChar(UInt32?    p) { return p.HasValue ? checked((Char)p.Value) : Configuration.NullableValues.Char;                              }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>Char</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Char ToChar(UInt64?    p) { return p.HasValue ? checked((Char)p.Value) : Configuration.NullableValues.Char;                              }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(Binary     p) { return p == null || p.Length == 0 ? Configuration.NullableValues.Char : BitConverter.ToChar(p.ToArray(), 0); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(Byte[]     p) { return p == null || p.Length == 0 ? Configuration.NullableValues.Char : BitConverter.ToChar(p, 0);           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(SqlBoolean p) { return p.IsNull ? Configuration.NullableValues.Char : ToChar(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(SqlByte    p) { return p.IsNull ? Configuration.NullableValues.Char : ToChar(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(SqlDecimal p) { return p.IsNull ? Configuration.NullableValues.Char : ToChar(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(SqlDouble  p) { return p.IsNull ? Configuration.NullableValues.Char : ToChar(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(SqlInt16   p) { return p.IsNull ? Configuration.NullableValues.Char : ToChar(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(SqlInt32   p) { return p.IsNull ? Configuration.NullableValues.Char : ToChar(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(SqlInt64   p) { return p.IsNull ? Configuration.NullableValues.Char : ToChar(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(SqlMoney   p) { return p.IsNull ? Configuration.NullableValues.Char : ToChar(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(SqlSingle  p) { return p.IsNull ? Configuration.NullableValues.Char : ToChar(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(SqlString  p) { return p.IsNull ? Configuration.NullableValues.Char : ToChar(p.Value);                                       }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>Char</c> value.</summary>
+		public static Char ToChar(object p)
+		{
+			if (p == null) return Configuration.NullableValues.Char;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull  : return Configuration.NullableValues.Char;
+				case TypeCode.Char    : return (Char)p;
+				case TypeCode.SByte   : return ToChar((SByte)  p);
+				case TypeCode.Int16   : return ToChar((Int16)  p);
+				case TypeCode.Int32   : return ToChar((Int32)  p);
+				case TypeCode.Int64   : return ToChar((Int64)  p);
+				case TypeCode.Byte    : return ToChar((Byte)   p);
+				case TypeCode.UInt16  : return ToChar((UInt16) p);
+				case TypeCode.UInt32  : return ToChar((UInt32) p);
+				case TypeCode.UInt64  : return ToChar((UInt64) p);
+				case TypeCode.Single  : return ToChar((Single) p);
+				case TypeCode.Double  : return ToChar((Double) p);
+				case TypeCode.Decimal : return ToChar((Decimal)p);
+				case TypeCode.String  : return ToChar((String) p);
+				case TypeCode.Boolean : return ToChar((Boolean)p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToChar((Boolean?)  p);
+				if (p is Byte?)      return ToChar((Byte?)     p);
+				if (p is Char?)      return ToChar((Char?)     p);
+				if (p is Decimal?)   return ToChar((Decimal?)  p);
+				if (p is Double?)    return ToChar((Double?)   p);
+				if (p is Int16?)     return ToChar((Int16?)    p);
+				if (p is Int32?)     return ToChar((Int32?)    p);
+				if (p is Int64?)     return ToChar((Int64?)    p);
+				if (p is SByte?)     return ToChar((SByte?)    p);
+				if (p is Single?)    return ToChar((Single?)   p);
+				if (p is UInt16?)    return ToChar((UInt16?)   p);
+				if (p is UInt32?)    return ToChar((UInt32?)   p);
+				if (p is UInt64?)    return ToChar((UInt64?)   p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToChar((Binary)    p);
+			if (p is Byte[])     return ToChar((Byte[])    p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToChar((SqlBoolean)p);
+				if (p is SqlByte)    return ToChar((SqlByte)   p);
+				if (p is SqlDecimal) return ToChar((SqlDecimal)p);
+				if (p is SqlDouble)  return ToChar((SqlDouble) p);
+				if (p is SqlInt16)   return ToChar((SqlInt16)  p);
+				if (p is SqlInt32)   return ToChar((SqlInt32)  p);
+				if (p is SqlInt64)   return ToChar((SqlInt64)  p);
+				if (p is SqlMoney)   return ToChar((SqlMoney)  p);
+				if (p is SqlSingle)  return ToChar((SqlSingle) p);
+				if (p is SqlString)  return ToChar((SqlString) p);
+			}
+
+#endif
+
+			if (p is IConvertible) return ((IConvertible)p).ToChar(null);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(Char));
+		}
+
+		#endregion
+
+		#region DateTime
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>DateTimeOffset</c> to an equivalent <c>DateTime</c> value.</summary>
+		public static DateTime ToDateTime(DateTimeOffset  p) { return p.LocalDateTime;                                                                                                  }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>DateTime</c> value.</summary>
+		public static DateTime ToDateTime(Double          p) { return DateTime.MinValue + TimeSpan.FromDays (p);                                                                        }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>DateTime</c> value.</summary>
+		public static DateTime ToDateTime(Int64           p) { return DateTime.MinValue + TimeSpan.FromTicks(p);                                                                        }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>DateTime</c> value.</summary>
+		public static DateTime ToDateTime(String          p) { return p == null ? Configuration.NullableValues.DateTime : DateTime.Parse(p, null, DateTimeStyles.NoCurrentDateDefault); }
+		/// <summary>Converts the value from <c>TimeSpan</c> to an equivalent <c>DateTime</c> value.</summary>
+		public static DateTime ToDateTime(TimeSpan        p) { return DateTime.MinValue + p;                                                                                            }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>DateTime?</c> to an equivalent <c>DateTime</c> value.</summary>
+		public static DateTime ToDateTime(DateTime?       p) { return p.HasValue ? p.Value : Configuration.NullableValues.DateTime;                                                     }
+		/// <summary>Converts the value from <c>DateTimeOffset?</c> to an equivalent <c>DateTime</c> value.</summary>
+		public static DateTime ToDateTime(DateTimeOffset? p) { return p.HasValue ?                     p.Value.LocalDateTime : Configuration.NullableValues.DateTime;                   }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>DateTime</c> value.</summary>
+		public static DateTime ToDateTime(Double?         p) { return p.HasValue ? DateTime.MinValue + TimeSpan.FromDays (p.Value): Configuration.NullableValues.DateTime;              }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>DateTime</c> value.</summary>
+		public static DateTime ToDateTime(Int64?          p) { return p.HasValue ? DateTime.MinValue + TimeSpan.FromTicks(p.Value): Configuration.NullableValues.DateTime;              }
+		/// <summary>Converts the value from <c>TimeSpan?</c> to an equivalent <c>DateTime</c> value.</summary>
+		public static DateTime ToDateTime(TimeSpan?       p) { return p.HasValue ? DateTime.MinValue +                    p.Value : Configuration.NullableValues.DateTime;              }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>DateTime</c> value.</summary>
+		public static DateTime ToDateTime(Binary          p) { return p == null || p.Length == 0 ? Configuration.NullableValues.DateTime : DateTime.FromBinary(ToInt64(p.ToArray()));   }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>DateTime</c> value.</summary>
+		public static DateTime ToDateTime(Byte[]          p) { return p == null || p.Length == 0 ? Configuration.NullableValues.DateTime : DateTime.FromBinary(ToInt64(p));             }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlDateTime</c> to an equivalent <c>DateTime</c> value.</summary>
+		public static DateTime ToDateTime(SqlDateTime     p) { return p.IsNull ? Configuration.NullableValues.DateTime : p.Value;                                                       }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>DateTime</c> value.</summary>
+		public static DateTime ToDateTime(SqlDouble       p) { return p.IsNull   ? Configuration.NullableValues.DateTime : DateTime.MinValue + TimeSpan.FromDays (p.Value);             }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>DateTime</c> value.</summary>
+		public static DateTime ToDateTime(SqlInt64        p) { return p.IsNull   ? Configuration.NullableValues.DateTime : DateTime.MinValue + TimeSpan.FromTicks(p.Value);             }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>DateTime</c> value.</summary>
+		public static DateTime ToDateTime(SqlString       p) { return p.IsNull   ? Configuration.NullableValues.DateTime :                             ToDateTime(p.Value);             }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>DateTime</c> value.</summary>
+		public static DateTime ToDateTime(object p)
+		{
+			if (p == null) return Configuration.NullableValues.DateTime;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull   : return Configuration.NullableValues.DateTime;
+				case TypeCode.DateTime : return (DateTime)p;
+				case TypeCode.String   : return ToDateTime((String)  p);
+				case TypeCode.Int64    : return ToDateTime((Int64)   p);
+				case TypeCode.Double   : return ToDateTime((Double)  p);
+			}
+
+			// Simple Types
+			//
+			if (p is DateTimeOffset)  return ToDateTime((DateTimeOffset) p);
+			if (p is TimeSpan)        return ToDateTime((TimeSpan)       p);
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is DateTime?)       return ToDateTime((DateTime?)      p);
+				if (p is DateTimeOffset?) return ToDateTime((DateTimeOffset?)p);
+				if (p is Double?)         return ToDateTime((Double?)        p);
+				if (p is Int64?)          return ToDateTime((Int64?)         p);
+				if (p is TimeSpan?)       return ToDateTime((TimeSpan?)      p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)          return ToDateTime((Binary)         p);
+			if (p is Byte[])          return ToDateTime((Byte[])         p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlDateTime)     return ToDateTime((SqlDateTime)    p);
+				if (p is SqlDouble)       return ToDateTime((SqlDouble)      p);
+				if (p is SqlInt64)        return ToDateTime((SqlInt64)       p);
+				if (p is SqlString)       return ToDateTime((SqlString)      p);
+			}
+
+#endif
+
+			if (p is IConvertible) return ((IConvertible)p).ToDateTime(null);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(DateTime));
+		}
+
+		#endregion
+
+		#region DateTimeOffset
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>DateTime</c> to an equivalent <c>DateTimeOffset</c> value.</summary>
+		public static DateTimeOffset ToDateTimeOffset(DateTime        p) { return p;                                                                                                  }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>DateTimeOffset</c> value.</summary>
+		public static DateTimeOffset ToDateTimeOffset(Double          p) { return DateTimeOffset.MinValue + TimeSpan.FromDays (p);                                                    }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>DateTimeOffset</c> value.</summary>
+		public static DateTimeOffset ToDateTimeOffset(Int64           p) { return DateTimeOffset.MinValue + TimeSpan.FromTicks(p);                                                    }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>DateTimeOffset</c> value.</summary>
+		public static DateTimeOffset ToDateTimeOffset(String          p) { return p == null? DateTimeOffset.MinValue : DateTimeOffset.Parse(p);                                       }
+		/// <summary>Converts the value from <c>TimeSpan</c> to an equivalent <c>DateTimeOffset</c> value.</summary>
+		public static DateTimeOffset ToDateTimeOffset(TimeSpan        p) { return DateTimeOffset.MinValue + p;                                                                        }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>DateTime?</c> to an equivalent <c>DateTimeOffset</c> value.</summary>
+		public static DateTimeOffset ToDateTimeOffset(DateTime?       p) { return p.HasValue ?                                   p.Value : DateTimeOffset.MinValue;                   }
+		/// <summary>Converts the value from <c>DateTimeOffset?</c> to an equivalent <c>DateTimeOffset</c> value.</summary>
+		public static DateTimeOffset ToDateTimeOffset(DateTimeOffset? p) { return p.HasValue ? p.Value : DateTimeOffset.MinValue;                                                     }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>DateTimeOffset</c> value.</summary>
+		public static DateTimeOffset ToDateTimeOffset(Double?         p) { return p.HasValue ? DateTimeOffset.MinValue + TimeSpan.FromDays (p.Value): DateTimeOffset.MinValue;        }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>DateTimeOffset</c> value.</summary>
+		public static DateTimeOffset ToDateTimeOffset(Int64?          p) { return p.HasValue ? DateTimeOffset.MinValue + TimeSpan.FromTicks(p.Value): DateTimeOffset.MinValue;        }
+		/// <summary>Converts the value from <c>TimeSpan?</c> to an equivalent <c>DateTimeOffset</c> value.</summary>
+		public static DateTimeOffset ToDateTimeOffset(TimeSpan?       p) { return p.HasValue ? DateTimeOffset.MinValue +                    p.Value : DateTimeOffset.MinValue;        }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>DateTimeOffset</c> value.</summary>
+		public static DateTimeOffset ToDateTimeOffset(Binary          p) { return p == null || p.Length == 0 ? DateTimeOffset.MinValue : new DateTimeOffset(ToDateTime(p.ToArray())); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>DateTimeOffset</c> value.</summary>
+		public static DateTimeOffset ToDateTimeOffset(Byte[]          p) { return p == null || p.Length == 0 ? DateTimeOffset.MinValue : new DateTimeOffset(ToDateTime(p));           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlDateTime</c> to an equivalent <c>DateTimeOffset</c> value.</summary>
+		public static DateTimeOffset ToDateTimeOffset(SqlDateTime     p) { return p.IsNull   ? DateTimeOffset.MinValue :                                   p.Value;                   }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>DateTimeOffset</c> value.</summary>
+		public static DateTimeOffset ToDateTimeOffset(SqlDouble       p) { return p.IsNull   ? DateTimeOffset.MinValue : DateTimeOffset.MinValue + TimeSpan.FromDays (p.Value);       }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>DateTimeOffset</c> value.</summary>
+		public static DateTimeOffset ToDateTimeOffset(SqlInt64        p) { return p.IsNull   ? DateTimeOffset.MinValue : DateTimeOffset.MinValue + TimeSpan.FromTicks(p.Value);       }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>DateTimeOffset</c> value.</summary>
+		public static DateTimeOffset ToDateTimeOffset(SqlString       p) { return p.IsNull   ? DateTimeOffset.MinValue :                  ToDateTimeOffset(p.Value);                  }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>DateTimeOffset</c> value.</summary>
+		public static DateTimeOffset ToDateTimeOffset(object p)
+		{
+			if (p == null) return DateTimeOffset.MinValue;
+
+			if (p is DateTimeOffset) return (DateTimeOffset)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull         : return DateTimeOffset.MinValue;
+				case TypeCode.Int64          : return ToDateTimeOffset((Int64)         p);
+				case TypeCode.Double         : return ToDateTimeOffset((Double)        p);
+				case TypeCode.DateTime       : return ToDateTimeOffset((DateTime)      p);
+				case TypeCode.String         : return ToDateTimeOffset((String)        p);
+			}
+
+			// Simple Types
+			//
+			if (p is TimeSpan)        return ToDateTimeOffset((TimeSpan)       p);
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is DateTime?)       return ToDateTimeOffset((DateTime?)      p);
+				if (p is DateTimeOffset?) return ToDateTimeOffset((DateTimeOffset?)p);
+				if (p is Double?)         return ToDateTimeOffset((Double?)        p);
+				if (p is Int64?)          return ToDateTimeOffset((Int64?)         p);
+				if (p is TimeSpan?)       return ToDateTimeOffset((TimeSpan?)      p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)          return ToDateTimeOffset((Binary)         p);
+			if (p is Byte[])          return ToDateTimeOffset((Byte[])         p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlDateTime)     return ToDateTimeOffset((SqlDateTime)    p);
+				if (p is SqlDouble)       return ToDateTimeOffset((SqlDouble)      p);
+				if (p is SqlInt64)        return ToDateTimeOffset((SqlInt64)       p);
+				if (p is SqlString)       return ToDateTimeOffset((SqlString)      p);
+			}
+
+#endif
+
+			throw CreateInvalidCastException(p.GetType(), typeof(DateTimeOffset));
+		}
+
+		#endregion
+
+		#region Decimal
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(Boolean    p) { return p ? (Decimal)1 : (Decimal)0;                                                   }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(Byte       p) { return p;                                                                             }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(Char       p) { return p;                                                                             }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(Double     p) { return checked((Decimal)p);                                                           }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(Int16      p) { return p;                                                                             }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(Int32      p) { return p;                                                                             }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(Int64      p) { return p;                                                                             }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>Decimal</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Decimal ToDecimal(SByte      p) { return p;                                                                             }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(Single     p) { return checked((Decimal)p);                                                           }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(String     p) { return p == null? Configuration.NullableValues.Decimal : Decimal.Parse(p);            }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>Decimal</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Decimal ToDecimal(UInt16     p) { return p;                                                                             }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>Decimal</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Decimal ToDecimal(UInt32     p) { return p;                                                                             }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>Decimal</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Decimal ToDecimal(UInt64     p) { return p;                                                                             }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(Boolean?   p) { return p.HasValue && p.Value ? (Decimal)1: (Decimal)0;                                }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(Byte?      p) { return p.HasValue ? p.Value : Configuration.NullableValues.Decimal;                   }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(Char?      p) { return p.HasValue ? p.Value : Configuration.NullableValues.Decimal;                   }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(Decimal?   p) { return p.HasValue ? p.Value : Configuration.NullableValues.Decimal;                   }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(Double?    p) { return p.HasValue ? checked((Decimal)p.Value) : Configuration.NullableValues.Decimal; }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(Int16?     p) { return p.HasValue ? p.Value : Configuration.NullableValues.Decimal;                   }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(Int32?     p) { return p.HasValue ? p.Value : Configuration.NullableValues.Decimal;                   }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(Int64?     p) { return p.HasValue ? p.Value : Configuration.NullableValues.Decimal;                   }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>Decimal</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Decimal ToDecimal(SByte?     p) { return p.HasValue ? p.Value : Configuration.NullableValues.Decimal;                   }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(Single?    p) { return p.HasValue ? checked((Decimal)p.Value) : Configuration.NullableValues.Decimal; }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>Decimal</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Decimal ToDecimal(UInt16?    p) { return p.HasValue ? p.Value : Configuration.NullableValues.Decimal;                   }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>Decimal</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Decimal ToDecimal(UInt32?    p) { return p.HasValue ? p.Value : Configuration.NullableValues.Decimal;                   }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>Decimal</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Decimal ToDecimal(UInt64?    p) { return p.HasValue ? p.Value : Configuration.NullableValues.Decimal;                   }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(SqlBoolean p) { return p.IsNull ? Configuration.NullableValues.Decimal : ToDecimal(p.Value);          }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(SqlByte    p) { return p.IsNull ? Configuration.NullableValues.Decimal : p.Value;                     }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(SqlDecimal p) { return p.IsNull ? Configuration.NullableValues.Decimal : p.Value;                     }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(SqlDouble  p) { return p.IsNull ? Configuration.NullableValues.Decimal : ToDecimal(p.Value);          }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(SqlInt16   p) { return p.IsNull ? Configuration.NullableValues.Decimal : p.Value;                     }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(SqlInt32   p) { return p.IsNull ? Configuration.NullableValues.Decimal : p.Value;                     }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(SqlInt64   p) { return p.IsNull ? Configuration.NullableValues.Decimal : p.Value;                     }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(SqlMoney   p) { return p.IsNull ? Configuration.NullableValues.Decimal : p.Value;                     }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(SqlSingle  p) { return p.IsNull ? Configuration.NullableValues.Decimal : ToDecimal(p.Value);          }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(SqlString  p) { return p.IsNull ? Configuration.NullableValues.Decimal : ToDecimal(p.Value);          }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>Decimal</c> value.</summary>
+		public static Decimal ToDecimal(object p)
+		{
+			if (p == null) return Configuration.NullableValues.Decimal;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull  : return Configuration.NullableValues.Decimal;
+				case TypeCode.Decimal : return (Decimal)p;
+				case TypeCode.SByte   : return ToDecimal((SByte)  p);
+				case TypeCode.Int16   : return ToDecimal((Int16)  p);
+				case TypeCode.Int32   : return ToDecimal((Int32)  p);
+				case TypeCode.Int64   : return ToDecimal((Int64)  p);
+				case TypeCode.Byte    : return ToDecimal((Byte)   p);
+				case TypeCode.UInt16  : return ToDecimal((UInt16) p);
+				case TypeCode.UInt32  : return ToDecimal((UInt32) p);
+				case TypeCode.Char    : return ToDecimal((Char)   p);
+				case TypeCode.UInt64  : return ToDecimal((UInt64) p);
+				case TypeCode.Single  : return ToDecimal((Single) p);
+				case TypeCode.Double  : return ToDecimal((Double) p);
+				case TypeCode.String  : return ToDecimal((String) p);
+				case TypeCode.Boolean : return ToDecimal((Boolean)p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToDecimal((Boolean?)  p);
+				if (p is Byte?)      return ToDecimal((Byte?)     p);
+				if (p is Char?)      return ToDecimal((Char?)     p);
+				if (p is Decimal?)   return ToDecimal((Decimal?)  p);
+				if (p is Double?)    return ToDecimal((Double?)   p);
+				if (p is Int16?)     return ToDecimal((Int16?)    p);
+				if (p is Int32?)     return ToDecimal((Int32?)    p);
+				if (p is Int64?)     return ToDecimal((Int64?)    p);
+				if (p is SByte?)     return ToDecimal((SByte?)    p);
+				if (p is Single?)    return ToDecimal((Single?)   p);
+				if (p is UInt16?)    return ToDecimal((UInt16?)   p);
+				if (p is UInt32?)    return ToDecimal((UInt32?)   p);
+				if (p is UInt64?)    return ToDecimal((UInt64?)   p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToDecimal((Binary)    p);
+			if (p is Byte[])     return ToDecimal((Byte[])    p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToDecimal((SqlBoolean)p);
+				if (p is SqlByte)    return ToDecimal((SqlByte)   p);
+				if (p is SqlDecimal) return ToDecimal((SqlDecimal)p);
+				if (p is SqlDouble)  return ToDecimal((SqlDouble) p);
+				if (p is SqlInt16)   return ToDecimal((SqlInt16)  p);
+				if (p is SqlInt32)   return ToDecimal((SqlInt32)  p);
+				if (p is SqlInt64)   return ToDecimal((SqlInt64)  p);
+				if (p is SqlMoney)   return ToDecimal((SqlMoney)  p);
+				if (p is SqlSingle)  return ToDecimal((SqlSingle) p);
+				if (p is SqlString)  return ToDecimal((SqlString) p);
+			}
+
+#endif
+
+			if (p is IConvertible) return ((IConvertible)p).ToDecimal(null);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(Decimal));
+		}
+
+		#endregion
+
+		#region Double
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(Boolean         p) { return p ? (Double)1 : (Double)0;                                                                                }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(Byte            p) { return p;                                                                                                        }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(Char            p) { return p;                                                                                                        }
+		/// <summary>Converts the value from <c>DateTime</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(DateTime        p) { return (p - DateTime.MinValue).TotalDays;                                                                        }
+		/// <summary>Converts the value from <c>DateTimeOffset</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(DateTimeOffset  p) { return (p - DateTimeOffset.MinValue).TotalDays;                                                                  }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(Decimal         p) { return checked((Double)p);                                                                                       }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(Int16           p) { return p;                                                                                                        }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(Int32           p) { return p;                                                                                                        }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(Int64           p) { return p;                                                                                                        }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>Double</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Double ToDouble(SByte           p) { return p;                                                                                                        }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(Single          p) { return p;                                                                                                        }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(String          p) { return p == null? Configuration.NullableValues.Double : Double.Parse(p);                                         }
+		/// <summary>Converts the value from <c>TimeSpan</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(TimeSpan        p) { return p.TotalDays;                                                                                              }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>Double</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Double ToDouble(UInt16          p) { return p;                                                                                                        }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>Double</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Double ToDouble(UInt32          p) { return p;                                                                                                        }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>Double</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Double ToDouble(UInt64          p) { return p;                                                                                                        }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(Boolean?        p) { return p.HasValue && p.Value ? (Double)1: (Double)0;                                                             }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(Byte?           p) { return p.HasValue ? p.Value : Configuration.NullableValues.Double;                                               }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(Char?           p) { return p.HasValue ? p.Value : Configuration.NullableValues.Double;                                               }
+		/// <summary>Converts the value from <c>DateTime?</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(DateTime?       p) { return p.HasValue ? (p.Value - DateTime.MinValue).TotalDays : Configuration.NullableValues.Double;               }
+		/// <summary>Converts the value from <c>DateTimeOffset?</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(DateTimeOffset? p) { return p.HasValue ? (p.Value - DateTimeOffset.MinValue).TotalDays : Configuration.NullableValues.Double;         }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(Decimal?        p) { return p.HasValue ? checked((Double)p.Value) : Configuration.NullableValues.Double;                              }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(Double?         p) { return p.HasValue ? p.Value : Configuration.NullableValues.Double;                                               }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(Int16?          p) { return p.HasValue ? p.Value : Configuration.NullableValues.Double;                                               }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(Int32?          p) { return p.HasValue ? p.Value : Configuration.NullableValues.Double;                                               }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(Int64?          p) { return p.HasValue ? p.Value : Configuration.NullableValues.Double;                                               }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>Double</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Double ToDouble(SByte?          p) { return p.HasValue ? p.Value : Configuration.NullableValues.Double;                                               }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(Single?         p) { return p.HasValue ? p.Value : Configuration.NullableValues.Double;                                               }
+		/// <summary>Converts the value from <c>TimeSpan?</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(TimeSpan?       p) { return p.HasValue ? p.Value.TotalDays : Configuration.NullableValues.Double;                                     }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>Double</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Double ToDouble(UInt16?         p) { return p.HasValue ? p.Value : Configuration.NullableValues.Double;                                               }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>Double</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Double ToDouble(UInt32?         p) { return p.HasValue ? p.Value : Configuration.NullableValues.Double;                                               }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>Double</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Double ToDouble(UInt64?         p) { return p.HasValue ? p.Value : Configuration.NullableValues.Double;                                               }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(Binary          p) { return p == null || p.Length == 0 ? Configuration.NullableValues.Double : BitConverter.ToDouble(p.ToArray(), 0); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(Byte[]          p) { return p == null || p.Length == 0 ? Configuration.NullableValues.Double : BitConverter.ToDouble(p, 0);           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(SqlBoolean      p) { return p.IsNull ? Configuration.NullableValues.Double : ToDouble(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(SqlByte         p) { return p.IsNull ? Configuration.NullableValues.Double : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlDateTime</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(SqlDateTime     p) { return p.IsNull ? Configuration.NullableValues.Double : ToDouble(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(SqlDecimal      p) { return p.IsNull ? Configuration.NullableValues.Double : ToDouble(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(SqlDouble       p) { return p.IsNull ? Configuration.NullableValues.Double : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(SqlInt16        p) { return p.IsNull ? Configuration.NullableValues.Double : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(SqlInt32        p) { return p.IsNull ? Configuration.NullableValues.Double : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(SqlInt64        p) { return p.IsNull ? Configuration.NullableValues.Double : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(SqlMoney        p) { return p.IsNull ? Configuration.NullableValues.Double : ToDouble(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(SqlSingle       p) { return p.IsNull ? Configuration.NullableValues.Double : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(SqlString       p) { return p.IsNull ? Configuration.NullableValues.Double : ToDouble(p.Value);                                       }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>Double</c> value.</summary>
+		public static Double ToDouble(object p)
+		{
+			if (p == null) return Configuration.NullableValues.Double;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull   : return Configuration.NullableValues.Double;
+				case TypeCode.Double   : return (Double)p;
+				case TypeCode.DateTime : return ToDouble((DateTime)p);
+				case TypeCode.SByte    : return ToDouble((SByte)   p);
+				case TypeCode.Int16    : return ToDouble((Int16)   p);
+				case TypeCode.Int32    : return ToDouble((Int32)   p);
+				case TypeCode.Int64    : return ToDouble((Int64)   p);
+				case TypeCode.Byte     : return ToDouble((Byte)    p);
+				case TypeCode.UInt16   : return ToDouble((UInt16)  p);
+				case TypeCode.UInt32   : return ToDouble((UInt32)  p);
+				case TypeCode.Char     : return ToDouble((Char)    p);
+				case TypeCode.UInt64   : return ToDouble((UInt64)  p);
+				case TypeCode.Single   : return ToDouble((Single)  p);
+				case TypeCode.Decimal  : return ToDouble((Decimal) p);
+				case TypeCode.String   : return ToDouble((String)  p);
+				case TypeCode.Boolean  : return ToDouble((Boolean) p);
+			}
+
+			// Simple Types
+			//
+			if (p is DateTimeOffset)  return ToDouble((DateTimeOffset) p);
+			if (p is TimeSpan)        return ToDouble((TimeSpan)       p);
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)        return ToDouble((Boolean?)       p);
+				if (p is Byte?)           return ToDouble((Byte?)          p);
+				if (p is Char?)           return ToDouble((Char?)          p);
+				if (p is DateTime?)       return ToDouble((DateTime?)      p);
+				if (p is DateTimeOffset?) return ToDouble((DateTimeOffset?)p);
+				if (p is Decimal?)        return ToDouble((Decimal?)       p);
+				if (p is Double?)         return ToDouble((Double?)        p);
+				if (p is Int16?)          return ToDouble((Int16?)         p);
+				if (p is Int32?)          return ToDouble((Int32?)         p);
+				if (p is Int64?)          return ToDouble((Int64?)         p);
+				if (p is SByte?)          return ToDouble((SByte?)         p);
+				if (p is Single?)         return ToDouble((Single?)        p);
+				if (p is TimeSpan?)       return ToDouble((TimeSpan?)      p);
+				if (p is UInt16?)         return ToDouble((UInt16?)        p);
+				if (p is UInt32?)         return ToDouble((UInt32?)        p);
+				if (p is UInt64?)         return ToDouble((UInt64?)        p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)          return ToDouble((Binary)         p);
+			if (p is Byte[])          return ToDouble((Byte[])         p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean)      return ToDouble((SqlBoolean)     p);
+				if (p is SqlByte)         return ToDouble((SqlByte)        p);
+				if (p is SqlDateTime)     return ToDouble((SqlDateTime)    p);
+				if (p is SqlDecimal)      return ToDouble((SqlDecimal)     p);
+				if (p is SqlDouble)       return ToDouble((SqlDouble)      p);
+				if (p is SqlInt16)        return ToDouble((SqlInt16)       p);
+				if (p is SqlInt32)        return ToDouble((SqlInt32)       p);
+				if (p is SqlInt64)        return ToDouble((SqlInt64)       p);
+				if (p is SqlMoney)        return ToDouble((SqlMoney)       p);
+				if (p is SqlSingle)       return ToDouble((SqlSingle)      p);
+				if (p is SqlString)       return ToDouble((SqlString)      p);
+			}
+
+#endif
+
+			if (p is IConvertible) return ((IConvertible)p).ToDouble(null);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(Double));
+		}
+
+		#endregion
+
+		#region Guid
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>Guid</c> value.</summary>
+		public static Guid ToGuid(String    p) { return p == null ? Configuration.NullableValues.Guid : new Guid(p);           }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Guid?</c> to an equivalent <c>Guid</c> value.</summary>
+		public static Guid ToGuid(Guid?     p) { return p.HasValue ? p.Value : Configuration.NullableValues.Guid;              }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>Guid</c> value.</summary>
+		public static Guid ToGuid(Binary    p) { return p == null ? Configuration.NullableValues.Guid : new Guid(p.ToArray()); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>Guid</c> value.</summary>
+		public static Guid ToGuid(Byte[]    p) { return p == null ? Configuration.NullableValues.Guid : new Guid(p);           }
+		/// <summary>Converts the value from <c>Type</c> to an equivalent <c>Guid</c> value.</summary>
+		public static Guid ToGuid(Type      p) { return p == null ? Configuration.NullableValues.Guid : p.GUID;                }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBinary</c> to an equivalent <c>Guid</c> value.</summary>
+		public static Guid ToGuid(SqlBinary p) { return p.IsNull  ? Configuration.NullableValues.Guid : p.ToSqlGuid().Value;   }
+		/// <summary>Converts the value from <c>SqlGuid</c> to an equivalent <c>Guid</c> value.</summary>
+		public static Guid ToGuid(SqlGuid   p) { return p.IsNull ? Configuration.NullableValues.Guid : p.Value;                }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>Guid</c> value.</summary>
+		public static Guid ToGuid(SqlString p) { return p.IsNull  ? Configuration.NullableValues.Guid : new Guid(p.Value);     }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>Guid</c> value.</summary>
+		public static Guid ToGuid(object p)
+		{
+			if (p == null) return Configuration.NullableValues.Guid;
+
+			if (p is Guid) return (Guid)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull : return Configuration.NullableValues.Guid;
+				case TypeCode.String : return ToGuid((String)p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Guid?)     return ToGuid((Guid?)    p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)    return ToGuid((Binary)   p);
+			if (p is Byte[])    return ToGuid((Byte[])   p);
+			if (p is Type)      return ToGuid((Type)     p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBinary) return ToGuid((SqlBinary)p);
+				if (p is SqlGuid)   return ToGuid((SqlGuid)  p);
+				if (p is SqlString) return ToGuid((SqlString)p);
+			}
+
+#endif
+
+			throw CreateInvalidCastException(p.GetType(), typeof(Guid));
+		}
+
+		#endregion
+
+		#region Int16
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(Boolean    p) { return p ? (Int16)1 : (Int16)0;                                                                                }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(Byte       p) { return p;                                                                                                      }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(Char       p) { return checked((Int16)p);                                                                                      }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(Decimal    p) { return checked((Int16)p);                                                                                      }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(Double     p) { return checked((Int16)p);                                                                                      }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(Int32      p) { return checked((Int16)p);                                                                                      }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(Int64      p) { return checked((Int16)p);                                                                                      }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>Int16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int16 ToInt16(SByte      p) { return p;                                                                                                      }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(Single     p) { return checked((Int16)p);                                                                                      }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(String     p) { return p == null? Configuration.NullableValues.Int16 : Int16.Parse(p);                                         }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>Int16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int16 ToInt16(UInt16     p) { return checked((Int16)p);                                                                                      }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>Int16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int16 ToInt16(UInt32     p) { return checked((Int16)p);                                                                                      }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>Int16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int16 ToInt16(UInt64     p) { return checked((Int16)p);                                                                                      }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(Boolean?   p) { return p.HasValue && p.Value ? (Int16)1: (Int16)0;                                                             }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(Byte?      p) { return p.HasValue ? p.Value : Configuration.NullableValues.Int16;                                              }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(Char?      p) { return p.HasValue ? checked((Int16)p.Value) : Configuration.NullableValues.Int16;                              }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(Decimal?   p) { return p.HasValue ? checked((Int16)p.Value) : Configuration.NullableValues.Int16;                              }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(Double?    p) { return p.HasValue ? checked((Int16)p.Value) : Configuration.NullableValues.Int16;                              }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(Int16?     p) { return p.HasValue ? p.Value : Configuration.NullableValues.Int16;                                              }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(Int32?     p) { return p.HasValue ? checked((Int16)p.Value) : Configuration.NullableValues.Int16;                              }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(Int64?     p) { return p.HasValue ? checked((Int16)p.Value) : Configuration.NullableValues.Int16;                              }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>Int16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int16 ToInt16(SByte?     p) { return p.HasValue ? p.Value : Configuration.NullableValues.Int16;                                              }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(Single?    p) { return p.HasValue ? checked((Int16)p.Value) : Configuration.NullableValues.Int16;                              }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>Int16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int16 ToInt16(UInt16?    p) { return p.HasValue ? checked((Int16)p.Value) : Configuration.NullableValues.Int16;                              }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>Int16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int16 ToInt16(UInt32?    p) { return p.HasValue ? checked((Int16)p.Value) : Configuration.NullableValues.Int16;                              }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>Int16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int16 ToInt16(UInt64?    p) { return p.HasValue ? checked((Int16)p.Value) : Configuration.NullableValues.Int16;                              }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(Binary     p) { return p == null || p.Length == 0 ? Configuration.NullableValues.Int16 : BitConverter.ToInt16(p.ToArray(), 0); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(Byte[]     p) { return p == null || p.Length == 0 ? Configuration.NullableValues.Int16 : BitConverter.ToInt16(p, 0);           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(SqlBoolean p) { return p.IsNull ? Configuration.NullableValues.Int16 : ToInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(SqlByte    p) { return p.IsNull ? Configuration.NullableValues.Int16 : p.Value;                                                }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(SqlDecimal p) { return p.IsNull ? Configuration.NullableValues.Int16 : ToInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(SqlDouble  p) { return p.IsNull ? Configuration.NullableValues.Int16 : ToInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(SqlInt16   p) { return p.IsNull ? Configuration.NullableValues.Int16 : p.Value;                                                }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(SqlInt32   p) { return p.IsNull ? Configuration.NullableValues.Int16 : ToInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(SqlInt64   p) { return p.IsNull ? Configuration.NullableValues.Int16 : ToInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(SqlMoney   p) { return p.IsNull ? Configuration.NullableValues.Int16 : ToInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(SqlSingle  p) { return p.IsNull ? Configuration.NullableValues.Int16 : ToInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(SqlString  p) { return p.IsNull ? Configuration.NullableValues.Int16 : ToInt16(p.Value);                                       }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>Int16</c> value.</summary>
+		public static Int16 ToInt16(object p)
+		{
+			if (p == null) return Configuration.NullableValues.Int16;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull  : return Configuration.NullableValues.Int16;
+				case TypeCode.Int16   : return (Int16)p;
+				case TypeCode.SByte   : return ToInt16((SByte)  p);
+				case TypeCode.Byte    : return ToInt16((Byte)   p);
+				case TypeCode.Int32   : return ToInt16((Int32)  p);
+				case TypeCode.Int64   : return ToInt16((Int64)  p);
+				case TypeCode.UInt16  : return ToInt16((UInt16) p);
+				case TypeCode.UInt32  : return ToInt16((UInt32) p);
+				case TypeCode.UInt64  : return ToInt16((UInt64) p);
+				case TypeCode.Single  : return ToInt16((Single) p);
+				case TypeCode.Double  : return ToInt16((Double) p);
+				case TypeCode.Decimal : return ToInt16((Decimal)p);
+				case TypeCode.Char    : return ToInt16((Char)   p);
+				case TypeCode.String  : return ToInt16((String) p);
+				case TypeCode.Boolean : return ToInt16((Boolean)p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToInt16((Boolean?)  p);
+				if (p is Byte?)      return ToInt16((Byte?)     p);
+				if (p is Char?)      return ToInt16((Char?)     p);
+				if (p is Decimal?)   return ToInt16((Decimal?)  p);
+				if (p is Double?)    return ToInt16((Double?)   p);
+				if (p is Int16?)     return ToInt16((Int16?)    p);
+				if (p is Int32?)     return ToInt16((Int32?)    p);
+				if (p is Int64?)     return ToInt16((Int64?)    p);
+				if (p is SByte?)     return ToInt16((SByte?)    p);
+				if (p is Single?)    return ToInt16((Single?)   p);
+				if (p is UInt16?)    return ToInt16((UInt16?)   p);
+				if (p is UInt32?)    return ToInt16((UInt32?)   p);
+				if (p is UInt64?)    return ToInt16((UInt64?)   p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToInt16((Binary)    p);
+			if (p is Byte[])     return ToInt16((Byte[])    p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToInt16((SqlBoolean)p);
+				if (p is SqlByte)    return ToInt16((SqlByte)   p);
+				if (p is SqlDecimal) return ToInt16((SqlDecimal)p);
+				if (p is SqlDouble)  return ToInt16((SqlDouble) p);
+				if (p is SqlInt16)   return ToInt16((SqlInt16)  p);
+				if (p is SqlInt32)   return ToInt16((SqlInt32)  p);
+				if (p is SqlInt64)   return ToInt16((SqlInt64)  p);
+				if (p is SqlMoney)   return ToInt16((SqlMoney)  p);
+				if (p is SqlSingle)  return ToInt16((SqlSingle) p);
+				if (p is SqlString)  return ToInt16((SqlString) p);
+			}
+
+#endif
+
+			if (p is IConvertible) return ((IConvertible)p).ToInt16(null);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(Int16));
+		}
+
+		#endregion
+
+		#region Int32
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(Boolean    p) { return p ? (Int32)1 : (Int32)0;                                                                                }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(Byte       p) { return p;                                                                                                      }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(Char       p) { return p;                                                                                                      }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(Decimal    p) { return checked((Int32)p);                                                                                      }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(Double     p) { return checked((Int32)p);                                                                                      }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(Int16      p) { return p;                                                                                                      }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(Int64      p) { return checked((Int32)p);                                                                                      }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>Int32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int32 ToInt32(SByte      p) { return p;                                                                                                      }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(Single     p) { return checked((Int32)p);                                                                                      }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(String     p) { return p == null? Configuration.NullableValues.Int32 : Int32.Parse(p);                                         }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>Int32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int32 ToInt32(UInt16     p) { return p;                                                                                                      }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>Int32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int32 ToInt32(UInt32     p) { return checked((Int32)p);                                                                                      }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>Int32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int32 ToInt32(UInt64     p) { return checked((Int32)p);                                                                                      }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(Boolean?   p) { return p.HasValue && p.Value ? (Int32)1: (Int32)0;                                                             }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(Byte?      p) { return p.HasValue ? p.Value : Configuration.NullableValues.Int32;                                              }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(Char?      p) { return p.HasValue ? p.Value : Configuration.NullableValues.Int32;                                              }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(Decimal?   p) { return p.HasValue ? checked((Int32)p.Value) : Configuration.NullableValues.Int32;                              }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(Double?    p) { return p.HasValue ? checked((Int32)p.Value) : Configuration.NullableValues.Int32;                              }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(Int16?     p) { return p.HasValue ? p.Value : Configuration.NullableValues.Int32;                                              }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(Int32?     p) { return p.HasValue ? p.Value : Configuration.NullableValues.Int32;                                              }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(Int64?     p) { return p.HasValue ? checked((Int32)p.Value) : Configuration.NullableValues.Int32;                              }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>Int32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int32 ToInt32(SByte?     p) { return p.HasValue ? p.Value : Configuration.NullableValues.Int32;                                              }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(Single?    p) { return p.HasValue ? checked((Int32)p.Value) : Configuration.NullableValues.Int32;                              }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>Int32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int32 ToInt32(UInt16?    p) { return p.HasValue ? p.Value : Configuration.NullableValues.Int32;                                              }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>Int32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int32 ToInt32(UInt32?    p) { return p.HasValue ? checked((Int32)p.Value) : Configuration.NullableValues.Int32;                              }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>Int32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int32 ToInt32(UInt64?    p) { return p.HasValue ? checked((Int32)p.Value) : Configuration.NullableValues.Int32;                              }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(Binary     p) { return p == null || p.Length == 0 ? Configuration.NullableValues.Int32 : BitConverter.ToInt32(p.ToArray(), 0); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(Byte[]     p) { return p == null || p.Length == 0 ? Configuration.NullableValues.Int32 : BitConverter.ToInt32(p, 0);           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(SqlBoolean p) { return p.IsNull ? Configuration.NullableValues.Int32 : ToInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(SqlByte    p) { return p.IsNull ? Configuration.NullableValues.Int32 : p.Value;                                                }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(SqlDecimal p) { return p.IsNull ? Configuration.NullableValues.Int32 : ToInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(SqlDouble  p) { return p.IsNull ? Configuration.NullableValues.Int32 : ToInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(SqlInt16   p) { return p.IsNull ? Configuration.NullableValues.Int32 : p.Value;                                                }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(SqlInt32   p) { return p.IsNull ? Configuration.NullableValues.Int32 : p.Value;                                                }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(SqlInt64   p) { return p.IsNull ? Configuration.NullableValues.Int32 : ToInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(SqlMoney   p) { return p.IsNull ? Configuration.NullableValues.Int32 : ToInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(SqlSingle  p) { return p.IsNull ? Configuration.NullableValues.Int32 : ToInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(SqlString  p) { return p.IsNull ? Configuration.NullableValues.Int32 : ToInt32(p.Value);                                       }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>Int32</c> value.</summary>
+		public static Int32 ToInt32(object p)
+		{
+			if (p == null) return Configuration.NullableValues.Int32;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull  : return Configuration.NullableValues.Int32;
+				case TypeCode.Int32   : return (Int32)p;
+				case TypeCode.SByte   : return ToInt32((SByte)  p);
+				case TypeCode.Int16   : return ToInt32((Int16)  p);
+				case TypeCode.Byte    : return ToInt32((Byte)   p);
+				case TypeCode.UInt16  : return ToInt32((UInt16) p);
+				case TypeCode.Char    : return ToInt32((Char)   p);
+				case TypeCode.Int64   : return ToInt32((Int64)  p);
+				case TypeCode.UInt32  : return ToInt32((UInt32) p);
+				case TypeCode.UInt64  : return ToInt32((UInt64) p);
+				case TypeCode.Single  : return ToInt32((Single) p);
+				case TypeCode.Double  : return ToInt32((Double) p);
+				case TypeCode.Decimal : return ToInt32((Decimal)p);
+				case TypeCode.String  : return ToInt32((String) p);
+				case TypeCode.Boolean : return ToInt32((Boolean)p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToInt32((Boolean?)  p);
+				if (p is Byte?)      return ToInt32((Byte?)     p);
+				if (p is Char?)      return ToInt32((Char?)     p);
+				if (p is Decimal?)   return ToInt32((Decimal?)  p);
+				if (p is Double?)    return ToInt32((Double?)   p);
+				if (p is Int16?)     return ToInt32((Int16?)    p);
+				if (p is Int32?)     return ToInt32((Int32?)    p);
+				if (p is Int64?)     return ToInt32((Int64?)    p);
+				if (p is SByte?)     return ToInt32((SByte?)    p);
+				if (p is Single?)    return ToInt32((Single?)   p);
+				if (p is UInt16?)    return ToInt32((UInt16?)   p);
+				if (p is UInt32?)    return ToInt32((UInt32?)   p);
+				if (p is UInt64?)    return ToInt32((UInt64?)   p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToInt32((Binary)    p);
+			if (p is Byte[])     return ToInt32((Byte[])    p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToInt32((SqlBoolean)p);
+				if (p is SqlByte)    return ToInt32((SqlByte)   p);
+				if (p is SqlDecimal) return ToInt32((SqlDecimal)p);
+				if (p is SqlDouble)  return ToInt32((SqlDouble) p);
+				if (p is SqlInt16)   return ToInt32((SqlInt16)  p);
+				if (p is SqlInt32)   return ToInt32((SqlInt32)  p);
+				if (p is SqlInt64)   return ToInt32((SqlInt64)  p);
+				if (p is SqlMoney)   return ToInt32((SqlMoney)  p);
+				if (p is SqlSingle)  return ToInt32((SqlSingle) p);
+				if (p is SqlString)  return ToInt32((SqlString) p);
+			}
+
+#endif
+
+			if (p is IConvertible) return ((IConvertible)p).ToInt32(null);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(Int32));
+		}
+
+		#endregion
+
+		#region Int64
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(Boolean         p) { return p ? (Int64)1 : (Int64)0;                                                                                }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(Byte            p) { return p;                                                                                                      }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(Char            p) { return p;                                                                                                      }
+		/// <summary>Converts the value from <c>DateTime</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(DateTime        p) { return (p - DateTime.MinValue).Ticks;                                                                          }
+		/// <summary>Converts the value from <c>DateTimeOffset</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(DateTimeOffset  p) { return (p - DateTime.MinValue).Ticks;                                                                          }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(Decimal         p) { return checked((Int64)p);                                                                                      }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(Double          p) { return checked((Int64)p);                                                                                      }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(Int16           p) { return p;                                                                                                      }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(Int32           p) { return p;                                                                                                      }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>Int64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int64 ToInt64(SByte           p) { return p;                                                                                                      }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(Single          p) { return checked((Int64)p);                                                                                      }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(String          p) { return p == null? Configuration.NullableValues.Int64 : Int64.Parse(p);                                         }
+		/// <summary>Converts the value from <c>TimeSpan</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(TimeSpan        p) { return p.Ticks;                                                                                                }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>Int64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int64 ToInt64(UInt16          p) { return p;                                                                                                      }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>Int64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int64 ToInt64(UInt32          p) { return p;                                                                                                      }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>Int64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int64 ToInt64(UInt64          p) { return checked((Int64)p);                                                                                      }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(Boolean?        p) { return p.HasValue && p.Value ? (Int64)1: (Int64)0;                                                             }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(Byte?           p) { return p.HasValue ? p.Value : Configuration.NullableValues.Int64;                                              }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(Char?           p) { return p.HasValue ? p.Value : Configuration.NullableValues.Int64;                                              }
+		/// <summary>Converts the value from <c>DateTime?</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(DateTime?       p) { return   p.HasValue ? (p.Value - DateTime.MinValue).Ticks : 0;                                                 }
+		/// <summary>Converts the value from <c>DateTimeOffset?</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(DateTimeOffset? p) { return   p.HasValue ? (p.Value - DateTime.MinValue).Ticks : 0;                                                 }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(Decimal?        p) { return p.HasValue ? checked((Int64)p.Value) : Configuration.NullableValues.Int64;                              }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(Double?         p) { return p.HasValue ? checked((Int64)p.Value) : Configuration.NullableValues.Int64;                              }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(Int16?          p) { return p.HasValue ? p.Value : Configuration.NullableValues.Int64;                                              }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(Int32?          p) { return p.HasValue ? p.Value : Configuration.NullableValues.Int64;                                              }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(Int64?          p) { return p.HasValue ? p.Value : Configuration.NullableValues.Int64;                                              }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>Int64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int64 ToInt64(SByte?          p) { return p.HasValue ? p.Value : Configuration.NullableValues.Int64;                                              }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(Single?         p) { return p.HasValue ? checked((Int64)p.Value) : Configuration.NullableValues.Int64;                              }
+		/// <summary>Converts the value from <c>TimeSpan?</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(TimeSpan?       p) { return p.HasValue ? p.Value.Ticks : 0;                                                                         }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>Int64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int64 ToInt64(UInt16?         p) { return p.HasValue ? p.Value : Configuration.NullableValues.Int64;                                              }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>Int64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int64 ToInt64(UInt32?         p) { return p.HasValue ? p.Value : Configuration.NullableValues.Int64;                                              }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>Int64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int64 ToInt64(UInt64?         p) { return p.HasValue ? checked((Int64)p.Value) : Configuration.NullableValues.Int64;                              }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(Binary          p) { return p == null || p.Length == 0 ? Configuration.NullableValues.Int64 : BitConverter.ToInt64(p.ToArray(), 0); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(Byte[]          p) { return p == null || p.Length == 0 ? Configuration.NullableValues.Int64 : BitConverter.ToInt64(p, 0);           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(SqlBoolean      p) { return p.IsNull ? Configuration.NullableValues.Int64 : ToInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(SqlByte         p) { return p.IsNull ? Configuration.NullableValues.Int64 : p.Value;                                                }
+		/// <summary>Converts the value from <c>SqlDateTime</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(SqlDateTime     p) { return p.IsNull ? Configuration.NullableValues.Int64 : ToInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(SqlDecimal      p) { return p.IsNull ? Configuration.NullableValues.Int64 : ToInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(SqlDouble       p) { return p.IsNull ? Configuration.NullableValues.Int64 : ToInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(SqlInt16        p) { return p.IsNull ? Configuration.NullableValues.Int64 : p.Value;                                                }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(SqlInt32        p) { return p.IsNull ? Configuration.NullableValues.Int64 : p.Value;                                                }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(SqlInt64        p) { return p.IsNull ? Configuration.NullableValues.Int64 : p.Value;                                                }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(SqlMoney        p) { return p.IsNull ? Configuration.NullableValues.Int64 : ToInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(SqlSingle       p) { return p.IsNull ? Configuration.NullableValues.Int64 : ToInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(SqlString       p) { return p.IsNull ? Configuration.NullableValues.Int64 : ToInt64(p.Value);                                       }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>Int64</c> value.</summary>
+		public static Int64 ToInt64(object p)
+		{
+			if (p == null) return Configuration.NullableValues.Int64;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull   : return Configuration.NullableValues.Int64;
+				case TypeCode.Int64    : return (Int64)p;
+				case TypeCode.DateTime : return ToInt64((DateTime)p);
+				case TypeCode.SByte    : return ToInt64((SByte)   p);
+				case TypeCode.Int16    : return ToInt64((Int16)   p);
+				case TypeCode.Int32    : return ToInt64((Int32)   p);
+				case TypeCode.Byte     : return ToInt64((Byte)    p);
+				case TypeCode.UInt16   : return ToInt64((UInt16)  p);
+				case TypeCode.UInt32   : return ToInt64((UInt32)  p);
+				case TypeCode.Char     : return ToInt64((Char)    p);
+				case TypeCode.UInt64   : return ToInt64((UInt64)  p);
+				case TypeCode.Single   : return ToInt64((Single)  p);
+				case TypeCode.Double   : return ToInt64((Double)  p);
+				case TypeCode.Decimal  : return ToInt64((Decimal) p);
+				case TypeCode.String   : return ToInt64((String)  p);
+				case TypeCode.Boolean  : return ToInt64((Boolean) p);
+			}
+
+			// Simple Types
+			//
+			if (p is DateTimeOffset)  return ToInt64((DateTimeOffset) p);
+			if (p is TimeSpan)        return ToInt64((TimeSpan)       p);
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)        return ToInt64((Boolean?)       p);
+				if (p is Byte?)           return ToInt64((Byte?)          p);
+				if (p is Char?)           return ToInt64((Char?)          p);
+				if (p is DateTime?)       return ToInt64((DateTime?)      p);
+				if (p is DateTimeOffset?) return ToInt64((DateTimeOffset?)p);
+				if (p is Decimal?)        return ToInt64((Decimal?)       p);
+				if (p is Double?)         return ToInt64((Double?)        p);
+				if (p is Int16?)          return ToInt64((Int16?)         p);
+				if (p is Int32?)          return ToInt64((Int32?)         p);
+				if (p is Int64?)          return ToInt64((Int64?)         p);
+				if (p is SByte?)          return ToInt64((SByte?)         p);
+				if (p is Single?)         return ToInt64((Single?)        p);
+				if (p is TimeSpan?)       return ToInt64((TimeSpan?)      p);
+				if (p is UInt16?)         return ToInt64((UInt16?)        p);
+				if (p is UInt32?)         return ToInt64((UInt32?)        p);
+				if (p is UInt64?)         return ToInt64((UInt64?)        p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)          return ToInt64((Binary)         p);
+			if (p is Byte[])          return ToInt64((Byte[])         p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean)      return ToInt64((SqlBoolean)     p);
+				if (p is SqlByte)         return ToInt64((SqlByte)        p);
+				if (p is SqlDateTime)     return ToInt64((SqlDateTime)    p);
+				if (p is SqlDecimal)      return ToInt64((SqlDecimal)     p);
+				if (p is SqlDouble)       return ToInt64((SqlDouble)      p);
+				if (p is SqlInt16)        return ToInt64((SqlInt16)       p);
+				if (p is SqlInt32)        return ToInt64((SqlInt32)       p);
+				if (p is SqlInt64)        return ToInt64((SqlInt64)       p);
+				if (p is SqlMoney)        return ToInt64((SqlMoney)       p);
+				if (p is SqlSingle)       return ToInt64((SqlSingle)      p);
+				if (p is SqlString)       return ToInt64((SqlString)      p);
+			}
+
+#endif
+
+			if (p is IConvertible) return ((IConvertible)p).ToInt64(null);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(Int64));
+		}
+
+		#endregion
+
+		#region SByte
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(Boolean    p) { return p ? (SByte)1 : (SByte)0;                                                                          }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(Byte       p) { return checked((SByte)p);                                                                                }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(Char       p) { return checked((SByte)p);                                                                                }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(Decimal    p) { return checked((SByte)p);                                                                                }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(Double     p) { return checked((SByte)p);                                                                                }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(Int16      p) { return checked((SByte)p);                                                                                }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(Int32      p) { return checked((SByte)p);                                                                                }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(Int64      p) { return checked((SByte)p);                                                                                }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(Single     p) { return checked((SByte)p);                                                                                }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(String     p) { return p == null? Configuration.NullableValues.SByte : SByte.Parse(p);                                   }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(UInt16     p) { return checked((SByte)p);                                                                                }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(UInt32     p) { return checked((SByte)p);                                                                                }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(UInt64     p) { return checked((SByte)p);                                                                                }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(Boolean?   p) { return p.HasValue && p.Value ? (SByte)1: (SByte)0;                                                       }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(Byte?      p) { return p.HasValue ? checked((SByte)p.Value) : Configuration.NullableValues.SByte;                        }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(Char?      p) { return p.HasValue ? checked((SByte)p.Value) : Configuration.NullableValues.SByte;                        }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(Decimal?   p) { return p.HasValue ? checked((SByte)p.Value) : Configuration.NullableValues.SByte;                        }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(Double?    p) { return p.HasValue ? checked((SByte)p.Value) : Configuration.NullableValues.SByte;                        }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(Int16?     p) { return p.HasValue ? checked((SByte)p.Value) : Configuration.NullableValues.SByte;                        }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(Int32?     p) { return p.HasValue ? checked((SByte)p.Value) : Configuration.NullableValues.SByte;                        }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(Int64?     p) { return p.HasValue ? checked((SByte)p.Value) : Configuration.NullableValues.SByte;                        }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(SByte?     p) { return p.HasValue ? p.Value : Configuration.NullableValues.SByte;                                        }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(Single?    p) { return p.HasValue ? checked((SByte)p.Value) : Configuration.NullableValues.SByte;                        }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(UInt16?    p) { return p.HasValue ? checked((SByte)p.Value) : Configuration.NullableValues.SByte;                        }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(UInt32?    p) { return p.HasValue ? checked((SByte)p.Value) : Configuration.NullableValues.SByte;                        }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(UInt64?    p) { return p.HasValue ? checked((SByte)p.Value) : Configuration.NullableValues.SByte;                        }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(Binary     p) { return p == null || p.Length == 0 ? Configuration.NullableValues.SByte : checked((SByte)p.ToArray()[0]); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(Byte[]     p) { return p == null || p.Length == 0 ? Configuration.NullableValues.SByte : checked((SByte)p[0]);           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(SqlBoolean p) { return p.IsNull ? Configuration.NullableValues.SByte : ToSByte(p.Value);                                 }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(SqlByte    p) { return p.IsNull ? Configuration.NullableValues.SByte : ToSByte(p.Value);                                 }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(SqlDecimal p) { return p.IsNull ? Configuration.NullableValues.SByte : ToSByte(p.Value);                                 }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(SqlDouble  p) { return p.IsNull ? Configuration.NullableValues.SByte : ToSByte(p.Value);                                 }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(SqlInt16   p) { return p.IsNull ? Configuration.NullableValues.SByte : ToSByte(p.Value);                                 }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(SqlInt32   p) { return p.IsNull ? Configuration.NullableValues.SByte : ToSByte(p.Value);                                 }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(SqlInt64   p) { return p.IsNull ? Configuration.NullableValues.SByte : ToSByte(p.Value);                                 }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(SqlMoney   p) { return p.IsNull ? Configuration.NullableValues.SByte : ToSByte(p.Value);                                 }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(SqlSingle  p) { return p.IsNull ? Configuration.NullableValues.SByte : ToSByte(p.Value);                                 }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(SqlString  p) { return p.IsNull ? Configuration.NullableValues.SByte : ToSByte(p.Value);                                 }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>SByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte ToSByte(object p)
+		{
+			if (p == null) return Configuration.NullableValues.SByte;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull  : return Configuration.NullableValues.SByte;
+				case TypeCode.SByte   : return (SByte)p;
+				case TypeCode.Int16   : return ToSByte((Int16)  p);
+				case TypeCode.Int32   : return ToSByte((Int32)  p);
+				case TypeCode.Int64   : return ToSByte((Int64)  p);
+				case TypeCode.Byte    : return ToSByte((Byte)   p);
+				case TypeCode.UInt16  : return ToSByte((UInt16) p);
+				case TypeCode.UInt32  : return ToSByte((UInt32) p);
+				case TypeCode.UInt64  : return ToSByte((UInt64) p);
+				case TypeCode.Single  : return ToSByte((Single) p);
+				case TypeCode.Double  : return ToSByte((Double) p);
+				case TypeCode.Decimal : return ToSByte((Decimal)p);
+				case TypeCode.Char    : return ToSByte((Char)   p);
+				case TypeCode.String  : return ToSByte((String) p);
+				case TypeCode.Boolean : return ToSByte((Boolean)p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToSByte((Boolean?)  p);
+				if (p is Byte?)      return ToSByte((Byte?)     p);
+				if (p is Char?)      return ToSByte((Char?)     p);
+				if (p is Decimal?)   return ToSByte((Decimal?)  p);
+				if (p is Double?)    return ToSByte((Double?)   p);
+				if (p is Int16?)     return ToSByte((Int16?)    p);
+				if (p is Int32?)     return ToSByte((Int32?)    p);
+				if (p is Int64?)     return ToSByte((Int64?)    p);
+				if (p is SByte?)     return ToSByte((SByte?)    p);
+				if (p is Single?)    return ToSByte((Single?)   p);
+				if (p is UInt16?)    return ToSByte((UInt16?)   p);
+				if (p is UInt32?)    return ToSByte((UInt32?)   p);
+				if (p is UInt64?)    return ToSByte((UInt64?)   p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToSByte((Binary)    p);
+			if (p is Byte[])     return ToSByte((Byte[])    p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToSByte((SqlBoolean)p);
+				if (p is SqlByte)    return ToSByte((SqlByte)   p);
+				if (p is SqlDecimal) return ToSByte((SqlDecimal)p);
+				if (p is SqlDouble)  return ToSByte((SqlDouble) p);
+				if (p is SqlInt16)   return ToSByte((SqlInt16)  p);
+				if (p is SqlInt32)   return ToSByte((SqlInt32)  p);
+				if (p is SqlInt64)   return ToSByte((SqlInt64)  p);
+				if (p is SqlMoney)   return ToSByte((SqlMoney)  p);
+				if (p is SqlSingle)  return ToSByte((SqlSingle) p);
+				if (p is SqlString)  return ToSByte((SqlString) p);
+			}
+
+#endif
+
+			if (p is IConvertible) return ((IConvertible)p).ToSByte(null);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(SByte));
+		}
+
+		#endregion
+
+		#region Single
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(Boolean    p) { return p ? (Single)1 : (Single)0;                                                                                }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(Byte       p) { return p;                                                                                                        }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(Char       p) { return p;                                                                                                        }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(Decimal    p) { return checked((Single)p);                                                                                       }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(Double     p) { return checked((Single)p);                                                                                       }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(Int16      p) { return p;                                                                                                        }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(Int32      p) { return p;                                                                                                        }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(Int64      p) { return p;                                                                                                        }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>Single</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Single ToSingle(SByte      p) { return p;                                                                                                        }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(String     p) { return p == null? Configuration.NullableValues.Single : Single.Parse(p);                                         }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>Single</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Single ToSingle(UInt16     p) { return p;                                                                                                        }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>Single</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Single ToSingle(UInt32     p) { return p;                                                                                                        }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>Single</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Single ToSingle(UInt64     p) { return p;                                                                                                        }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(Boolean?   p) { return p.HasValue && p.Value ? (Single)1: (Single)0;                                                             }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(Byte?      p) { return p.HasValue ? p.Value : Configuration.NullableValues.Single;                                               }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(Char?      p) { return p.HasValue ? p.Value : Configuration.NullableValues.Single;                                               }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(Decimal?   p) { return p.HasValue ? checked((Single)p.Value) : Configuration.NullableValues.Single;                              }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(Double?    p) { return p.HasValue ? checked((Single)p.Value) : Configuration.NullableValues.Single;                              }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(Int16?     p) { return p.HasValue ? p.Value : Configuration.NullableValues.Single;                                               }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(Int32?     p) { return p.HasValue ? p.Value : Configuration.NullableValues.Single;                                               }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(Int64?     p) { return p.HasValue ? p.Value : Configuration.NullableValues.Single;                                               }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>Single</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Single ToSingle(SByte?     p) { return p.HasValue ? p.Value : Configuration.NullableValues.Single;                                               }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(Single?    p) { return p.HasValue ? p.Value : Configuration.NullableValues.Single;                                               }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>Single</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Single ToSingle(UInt16?    p) { return p.HasValue ? p.Value : Configuration.NullableValues.Single;                                               }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>Single</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Single ToSingle(UInt32?    p) { return p.HasValue ? p.Value : Configuration.NullableValues.Single;                                               }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>Single</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Single ToSingle(UInt64?    p) { return p.HasValue ? p.Value : Configuration.NullableValues.Single;                                               }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(Binary     p) { return p == null || p.Length == 0 ? Configuration.NullableValues.Single : BitConverter.ToSingle(p.ToArray(), 0); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(Byte[]     p) { return p == null || p.Length == 0 ? Configuration.NullableValues.Single : BitConverter.ToSingle(p, 0);           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(SqlBoolean p) { return p.IsNull ? Configuration.NullableValues.Single : ToSingle(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(SqlByte    p) { return p.IsNull ? Configuration.NullableValues.Single : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(SqlDecimal p) { return p.IsNull ? Configuration.NullableValues.Single : ToSingle(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(SqlDouble  p) { return p.IsNull ? Configuration.NullableValues.Single : ToSingle(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(SqlInt16   p) { return p.IsNull ? Configuration.NullableValues.Single : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(SqlInt32   p) { return p.IsNull ? Configuration.NullableValues.Single : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(SqlInt64   p) { return p.IsNull ? Configuration.NullableValues.Single : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(SqlMoney   p) { return p.IsNull ? Configuration.NullableValues.Single : ToSingle(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(SqlSingle  p) { return p.IsNull ? Configuration.NullableValues.Single : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(SqlString  p) { return p.IsNull ? Configuration.NullableValues.Single : ToSingle(p.Value);                                       }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>Single</c> value.</summary>
+		public static Single ToSingle(object p)
+		{
+			if (p == null) return Configuration.NullableValues.Single;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull  : return Configuration.NullableValues.Single;
+				case TypeCode.Single  : return (Single)p;
+				case TypeCode.SByte   : return ToSingle((SByte)  p);
+				case TypeCode.Int16   : return ToSingle((Int16)  p);
+				case TypeCode.Int32   : return ToSingle((Int32)  p);
+				case TypeCode.Int64   : return ToSingle((Int64)  p);
+				case TypeCode.Byte    : return ToSingle((Byte)   p);
+				case TypeCode.UInt16  : return ToSingle((UInt16) p);
+				case TypeCode.UInt32  : return ToSingle((UInt32) p);
+				case TypeCode.Char    : return ToSingle((Char)   p);
+				case TypeCode.UInt64  : return ToSingle((UInt64) p);
+				case TypeCode.Double  : return ToSingle((Double) p);
+				case TypeCode.Decimal : return ToSingle((Decimal)p);
+				case TypeCode.String  : return ToSingle((String) p);
+				case TypeCode.Boolean : return ToSingle((Boolean)p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToSingle((Boolean?)  p);
+				if (p is Byte?)      return ToSingle((Byte?)     p);
+				if (p is Char?)      return ToSingle((Char?)     p);
+				if (p is Decimal?)   return ToSingle((Decimal?)  p);
+				if (p is Double?)    return ToSingle((Double?)   p);
+				if (p is Int16?)     return ToSingle((Int16?)    p);
+				if (p is Int32?)     return ToSingle((Int32?)    p);
+				if (p is Int64?)     return ToSingle((Int64?)    p);
+				if (p is SByte?)     return ToSingle((SByte?)    p);
+				if (p is Single?)    return ToSingle((Single?)   p);
+				if (p is UInt16?)    return ToSingle((UInt16?)   p);
+				if (p is UInt32?)    return ToSingle((UInt32?)   p);
+				if (p is UInt64?)    return ToSingle((UInt64?)   p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToSingle((Binary)    p);
+			if (p is Byte[])     return ToSingle((Byte[])    p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToSingle((SqlBoolean)p);
+				if (p is SqlByte)    return ToSingle((SqlByte)   p);
+				if (p is SqlDecimal) return ToSingle((SqlDecimal)p);
+				if (p is SqlDouble)  return ToSingle((SqlDouble) p);
+				if (p is SqlInt16)   return ToSingle((SqlInt16)  p);
+				if (p is SqlInt32)   return ToSingle((SqlInt32)  p);
+				if (p is SqlInt64)   return ToSingle((SqlInt64)  p);
+				if (p is SqlMoney)   return ToSingle((SqlMoney)  p);
+				if (p is SqlSingle)  return ToSingle((SqlSingle) p);
+				if (p is SqlString)  return ToSingle((SqlString) p);
+			}
+
+#endif
+
+			if (p is IConvertible) return ((IConvertible)p).ToSingle(null);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(Single));
+		}
+
+		#endregion
+
+		#region String
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(Boolean         p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(Byte            p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(Char            p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>DateTime</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(DateTime        p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>DateTimeOffset</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(DateTimeOffset  p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(Decimal         p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(Double          p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>Guid</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(Guid            p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(Int16           p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(Int32           p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(Int64           p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>String</c> value.</summary>
+		[CLSCompliant(false)]
+		public static String ToString(SByte           p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(Single          p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>TimeSpan</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(TimeSpan        p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>String</c> value.</summary>
+		[CLSCompliant(false)]
+		public static String ToString(UInt16          p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>String</c> value.</summary>
+		[CLSCompliant(false)]
+		public static String ToString(UInt32          p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>String</c> value.</summary>
+		[CLSCompliant(false)]
+		public static String ToString(UInt64          p) { return p.ToString();                                                                                          }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(Boolean?        p) { return p.HasValue ? p.Value.ToString() : Configuration.NullableValues.String;                                 }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(Byte?           p) { return p.HasValue ? p.Value.ToString() : Configuration.NullableValues.String;                                 }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(Char?           p) { return p.HasValue ? p.Value.ToString() : Configuration.NullableValues.String;                                 }
+		/// <summary>Converts the value from <c>DateTime?</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(DateTime?       p) { return p.HasValue ? p.Value.ToString() : Configuration.NullableValues.String;                                 }
+		/// <summary>Converts the value from <c>DateTimeOffset?</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(DateTimeOffset? p) { return p.HasValue ? p.Value.ToString() : Configuration.NullableValues.String;                                 }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(Decimal?        p) { return p.HasValue ? p.Value.ToString() : Configuration.NullableValues.String;                                 }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(Double?         p) { return p.HasValue ? p.Value.ToString() : Configuration.NullableValues.String;                                 }
+		/// <summary>Converts the value from <c>Guid?</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(Guid?           p) { return p.HasValue ? p.Value.ToString() : Configuration.NullableValues.String;                                 }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(Int16?          p) { return p.HasValue ? p.Value.ToString() : Configuration.NullableValues.String;                                 }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(Int32?          p) { return p.HasValue ? p.Value.ToString() : Configuration.NullableValues.String;                                 }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(Int64?          p) { return p.HasValue ? p.Value.ToString() : Configuration.NullableValues.String;                                 }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>String</c> value.</summary>
+		[CLSCompliant(false)]
+		public static String ToString(SByte?          p) { return p.HasValue ? p.Value.ToString() : Configuration.NullableValues.String;                                 }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(Single?         p) { return p.HasValue ? p.Value.ToString() : Configuration.NullableValues.String;                                 }
+		/// <summary>Converts the value from <c>TimeSpan?</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(TimeSpan?       p) { return p.HasValue ? p.Value.ToString() : Configuration.NullableValues.String;                                 }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>String</c> value.</summary>
+		[CLSCompliant(false)]
+		public static String ToString(UInt16?         p) { return p.HasValue ? p.Value.ToString() : Configuration.NullableValues.String;                                 }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>String</c> value.</summary>
+		[CLSCompliant(false)]
+		public static String ToString(UInt32?         p) { return p.HasValue ? p.Value.ToString() : Configuration.NullableValues.String;                                 }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>String</c> value.</summary>
+		[CLSCompliant(false)]
+		public static String ToString(UInt64?         p) { return p.HasValue ? p.Value.ToString() : Configuration.NullableValues.String;                                 }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(Binary          p) { return ToString(p.ToArray());                                                                                 }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(Byte[]          p) { return p == null ? Configuration.NullableValues.String : System.Text.Encoding.UTF8.GetString(p, 0, p.Length); }
+		/// <summary>Converts the value from <c>Type</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(Type            p) { return p == null ? Configuration.NullableValues.String : p.FullName;                                          }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(SqlBoolean      p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(SqlByte         p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>SqlChars</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(SqlChars        p) { return p.IsNull ? Configuration.NullableValues.String : p.ToSqlString().Value;                                }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(SqlDecimal      p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(SqlDouble       p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>SqlGuid</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(SqlGuid         p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(SqlInt16        p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(SqlInt32        p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(SqlInt64        p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(SqlMoney        p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(SqlSingle       p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(SqlString       p) { return p.ToString();                                                                                          }
+		/// <summary>Converts the value from <c>SqlXml</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(SqlXml          p) { return p.IsNull ? Configuration.NullableValues.String : p.Value;                                              }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>XElement</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(XElement        p) { return p == null ? Configuration.NullableValues.String : p.ToString();                                        }
+		/// <summary>Converts the value from <c>XmlDocument</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(XmlDocument     p) { return p == null ? Configuration.NullableValues.String : p.InnerXml;                                          }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>String</c> value.</summary>
+		public static String ToString(object p)
+		{
+			if (p == null) return Configuration.NullableValues.String;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull   : return Configuration.NullableValues.String;
+				case TypeCode.String   : return (String)p;
+				case TypeCode.SByte    : return ToString((SByte)   p);
+				case TypeCode.Int16    : return ToString((Int16)   p);
+				case TypeCode.Int32    : return ToString((Int32)   p);
+				case TypeCode.Int64    : return ToString((Int64)   p);
+				case TypeCode.Byte     : return ToString((Byte)    p);
+				case TypeCode.UInt16   : return ToString((UInt16)  p);
+				case TypeCode.UInt32   : return ToString((UInt32)  p);
+				case TypeCode.UInt64   : return ToString((UInt64)  p);
+				case TypeCode.Single   : return ToString((Single)  p);
+				case TypeCode.Double   : return ToString((Double)  p);
+				case TypeCode.Boolean  : return ToString((Boolean) p);
+				case TypeCode.Decimal  : return ToString((Decimal) p);
+				case TypeCode.Char     : return ToString((Char)    p);
+				case TypeCode.DateTime : return ToString((DateTime)p);
+			}
+
+			// Simple Types
+			//
+			if (p is DateTimeOffset)  return ToString((DateTimeOffset) p);
+			if (p is Guid)            return ToString((Guid)           p);
+			if (p is TimeSpan)        return ToString((TimeSpan)       p);
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)        return ToString((Boolean?)       p);
+				if (p is Byte?)           return ToString((Byte?)          p);
+				if (p is Char?)           return ToString((Char?)          p);
+				if (p is DateTime?)       return ToString((DateTime?)      p);
+				if (p is DateTimeOffset?) return ToString((DateTimeOffset?)p);
+				if (p is Decimal?)        return ToString((Decimal?)       p);
+				if (p is Double?)         return ToString((Double?)        p);
+				if (p is Guid?)           return ToString((Guid?)          p);
+				if (p is Int16?)          return ToString((Int16?)         p);
+				if (p is Int32?)          return ToString((Int32?)         p);
+				if (p is Int64?)          return ToString((Int64?)         p);
+				if (p is SByte?)          return ToString((SByte?)         p);
+				if (p is Single?)         return ToString((Single?)        p);
+				if (p is TimeSpan?)       return ToString((TimeSpan?)      p);
+				if (p is UInt16?)         return ToString((UInt16?)        p);
+				if (p is UInt32?)         return ToString((UInt32?)        p);
+				if (p is UInt64?)         return ToString((UInt64?)        p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)          return ToString((Binary)         p);
+			if (p is Byte[])          return ToString((Byte[])         p);
+			if (p is Type)            return ToString((Type)           p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean)      return ToString((SqlBoolean)     p);
+				if (p is SqlByte)         return ToString((SqlByte)        p);
+				if (p is SqlChars)        return ToString((SqlChars)       p);
+				if (p is SqlDecimal)      return ToString((SqlDecimal)     p);
+				if (p is SqlDouble)       return ToString((SqlDouble)      p);
+				if (p is SqlGuid)         return ToString((SqlGuid)        p);
+				if (p is SqlInt16)        return ToString((SqlInt16)       p);
+				if (p is SqlInt32)        return ToString((SqlInt32)       p);
+				if (p is SqlInt64)        return ToString((SqlInt64)       p);
+				if (p is SqlMoney)        return ToString((SqlMoney)       p);
+				if (p is SqlSingle)       return ToString((SqlSingle)      p);
+				if (p is SqlString)       return ToString((SqlString)      p);
+				if (p is SqlXml)          return ToString((SqlXml)         p);
+			}
+
+			// Other Types
+			//
+			if (p is XElement)        return ToString((XElement)       p);
+			if (p is XmlDocument)     return ToString((XmlDocument)    p);
+
+#endif
+
+			if (p is IConvertible) return ((IConvertible)p).ToString(null);
+
+			return p.ToString();
+		}
+
+		#endregion
+
+		#region TimeSpan
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>DateTime</c> to an equivalent <c>TimeSpan</c> value.</summary>
+		public static TimeSpan ToTimeSpan(DateTime        p) { return p - DateTime.MinValue;                                                                                        }
+		/// <summary>Converts the value from <c>DateTimeOffset</c> to an equivalent <c>TimeSpan</c> value.</summary>
+		public static TimeSpan ToTimeSpan(DateTimeOffset  p) { return p - DateTimeOffset.MinValue;                                                                                  }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>TimeSpan</c> value.</summary>
+		public static TimeSpan ToTimeSpan(Double          p) { return TimeSpan.FromDays (p);                                                                                        }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>TimeSpan</c> value.</summary>
+		public static TimeSpan ToTimeSpan(Int64           p) { return TimeSpan.FromTicks(p);                                                                                        }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>TimeSpan</c> value.</summary>
+		public static TimeSpan ToTimeSpan(String          p) { return p == null? Configuration.NullableValues.TimeSpan : TimeSpan.Parse(p);                                         }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>DateTime?</c> to an equivalent <c>TimeSpan</c> value.</summary>
+		public static TimeSpan ToTimeSpan(DateTime?       p) { return p.HasValue ? p.Value - DateTime.MinValue       : Configuration.NullableValues.TimeSpan;                       }
+		/// <summary>Converts the value from <c>DateTimeOffset?</c> to an equivalent <c>TimeSpan</c> value.</summary>
+		public static TimeSpan ToTimeSpan(DateTimeOffset? p) { return p.HasValue ? p.Value - DateTimeOffset.MinValue : Configuration.NullableValues.TimeSpan;                       }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>TimeSpan</c> value.</summary>
+		public static TimeSpan ToTimeSpan(Double?         p) { return p.HasValue ? TimeSpan.FromDays (p.Value)            : Configuration.NullableValues.TimeSpan;                  }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>TimeSpan</c> value.</summary>
+		public static TimeSpan ToTimeSpan(Int64?          p) { return p.HasValue ? TimeSpan.FromTicks(p.Value)            : Configuration.NullableValues.TimeSpan;                  }
+		/// <summary>Converts the value from <c>TimeSpan?</c> to an equivalent <c>TimeSpan</c> value.</summary>
+		public static TimeSpan ToTimeSpan(TimeSpan?       p) { return p.HasValue ? p.Value : Configuration.NullableValues.TimeSpan;                                                 }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>TimeSpan</c> value.</summary>
+		public static TimeSpan ToTimeSpan(Binary          p) { return p == null || p.Length == 0? Configuration.NullableValues.TimeSpan : TimeSpan.FromTicks(ToInt64(p.ToArray())); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>TimeSpan</c> value.</summary>
+		public static TimeSpan ToTimeSpan(Byte[]          p) { return p == null || p.Length == 0? Configuration.NullableValues.TimeSpan : TimeSpan.FromTicks(ToInt64(p));           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlDateTime</c> to an equivalent <c>TimeSpan</c> value.</summary>
+		public static TimeSpan ToTimeSpan(SqlDateTime     p) { return p.IsNull   ? Configuration.NullableValues.TimeSpan : p.Value - DateTime.MinValue;                             }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>TimeSpan</c> value.</summary>
+		public static TimeSpan ToTimeSpan(SqlDouble       p) { return p.IsNull   ? Configuration.NullableValues.TimeSpan : TimeSpan.FromDays(p.Value);                              }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>TimeSpan</c> value.</summary>
+		public static TimeSpan ToTimeSpan(SqlInt64        p) { return p.IsNull   ? Configuration.NullableValues.TimeSpan : TimeSpan.FromTicks(p.Value);                             }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>TimeSpan</c> value.</summary>
+		public static TimeSpan ToTimeSpan(SqlString       p) { return p.IsNull   ? Configuration.NullableValues.TimeSpan : TimeSpan.Parse(p.Value);                                 }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>TimeSpan</c> value.</summary>
+		public static TimeSpan ToTimeSpan(object p)
+		{
+			if (p == null) return Configuration.NullableValues.TimeSpan;
+
+			if (p is TimeSpan) return (TimeSpan)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull   : return Configuration.NullableValues.TimeSpan;
+				case TypeCode.DateTime : return ToTimeSpan((DateTime)p);
+				case TypeCode.Int64    : return ToTimeSpan((Int64)   p);
+				case TypeCode.Double   : return ToTimeSpan((Double)  p);
+				case TypeCode.String   : return ToTimeSpan((String)  p);
+			}
+
+			// Simple Types
+			//
+			if (p is DateTimeOffset)  return ToTimeSpan((DateTimeOffset) p);
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is DateTime?)       return ToTimeSpan((DateTime?)      p);
+				if (p is DateTimeOffset?) return ToTimeSpan((DateTimeOffset?)p);
+				if (p is Double?)         return ToTimeSpan((Double?)        p);
+				if (p is Int64?)          return ToTimeSpan((Int64?)         p);
+				if (p is TimeSpan?)       return ToTimeSpan((TimeSpan?)      p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)          return ToTimeSpan((Binary)         p);
+			if (p is Byte[])          return ToTimeSpan((Byte[])         p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlDateTime)     return ToTimeSpan((SqlDateTime)    p);
+				if (p is SqlDouble)       return ToTimeSpan((SqlDouble)      p);
+				if (p is SqlInt64)        return ToTimeSpan((SqlInt64)       p);
+				if (p is SqlString)       return ToTimeSpan((SqlString)      p);
+			}
+
+#endif
+
+			throw CreateInvalidCastException(p.GetType(), typeof(TimeSpan));
+		}
+
+		#endregion
+
+		#region UInt16
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(Boolean    p) { return p ? (UInt16)1 : (UInt16)0;                                                                                }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(Byte       p) { return p;                                                                                                        }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(Char       p) { return checked((UInt16)p);                                                                                       }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(Decimal    p) { return checked((UInt16)p);                                                                                       }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(Double     p) { return checked((UInt16)p);                                                                                       }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(Int16      p) { return checked((UInt16)p);                                                                                       }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(Int32      p) { return checked((UInt16)p);                                                                                       }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(Int64      p) { return checked((UInt16)p);                                                                                       }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(SByte      p) { return checked((UInt16)p);                                                                                       }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(Single     p) { return checked((UInt16)p);                                                                                       }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(String     p) { return p == null? Configuration.NullableValues.UInt16 : UInt16.Parse(p);                                         }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(UInt32     p) { return checked((UInt16)p);                                                                                       }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(UInt64     p) { return checked((UInt16)p);                                                                                       }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(Boolean?   p) { return p.HasValue && p.Value ? (UInt16)1: (UInt16)0;                                                             }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(Byte?      p) { return p.HasValue ? p.Value : Configuration.NullableValues.UInt16;                                               }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(Char?      p) { return p.HasValue ? checked((UInt16)p.Value) : Configuration.NullableValues.UInt16;                              }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(Decimal?   p) { return p.HasValue ? checked((UInt16)p.Value) : Configuration.NullableValues.UInt16;                              }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(Double?    p) { return p.HasValue ? checked((UInt16)p.Value) : Configuration.NullableValues.UInt16;                              }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(Int16?     p) { return p.HasValue ? checked((UInt16)p.Value) : Configuration.NullableValues.UInt16;                              }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(Int32?     p) { return p.HasValue ? checked((UInt16)p.Value) : Configuration.NullableValues.UInt16;                              }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(Int64?     p) { return p.HasValue ? checked((UInt16)p.Value) : Configuration.NullableValues.UInt16;                              }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(SByte?     p) { return p.HasValue ? checked((UInt16)p.Value) : Configuration.NullableValues.UInt16;                              }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(Single?    p) { return p.HasValue ? checked((UInt16)p.Value) : Configuration.NullableValues.UInt16;                              }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(UInt16?    p) { return p.HasValue ? p.Value : Configuration.NullableValues.UInt16;                                               }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(UInt32?    p) { return p.HasValue ? checked((UInt16)p.Value) : Configuration.NullableValues.UInt16;                              }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(UInt64?    p) { return p.HasValue ? checked((UInt16)p.Value) : Configuration.NullableValues.UInt16;                              }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(Binary     p) { return p == null || p.Length == 0 ? Configuration.NullableValues.UInt16 : BitConverter.ToUInt16(p.ToArray(), 0); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(Byte[]     p) { return p == null || p.Length == 0 ? Configuration.NullableValues.UInt16 : BitConverter.ToUInt16(p, 0);           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(SqlBoolean p) { return p.IsNull ? Configuration.NullableValues.UInt16 : ToUInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(SqlByte    p) { return p.IsNull ? Configuration.NullableValues.UInt16 : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(SqlDecimal p) { return p.IsNull ? Configuration.NullableValues.UInt16 : ToUInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(SqlDouble  p) { return p.IsNull ? Configuration.NullableValues.UInt16 : ToUInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(SqlInt16   p) { return p.IsNull ? Configuration.NullableValues.UInt16 : ToUInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(SqlInt32   p) { return p.IsNull ? Configuration.NullableValues.UInt16 : ToUInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(SqlInt64   p) { return p.IsNull ? Configuration.NullableValues.UInt16 : ToUInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(SqlMoney   p) { return p.IsNull ? Configuration.NullableValues.UInt16 : ToUInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(SqlSingle  p) { return p.IsNull ? Configuration.NullableValues.UInt16 : ToUInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(SqlString  p) { return p.IsNull ? Configuration.NullableValues.UInt16 : ToUInt16(p.Value);                                       }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>UInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16 ToUInt16(object p)
+		{
+			if (p == null) return Configuration.NullableValues.UInt16;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull  : return Configuration.NullableValues.UInt16;
+				case TypeCode.UInt16  : return (UInt16)p;
+				case TypeCode.Byte    : return ToUInt16((Byte)   p);
+				case TypeCode.SByte   : return ToUInt16((SByte)  p);
+				case TypeCode.Int16   : return ToUInt16((Int16)  p);
+				case TypeCode.Int32   : return ToUInt16((Int32)  p);
+				case TypeCode.Int64   : return ToUInt16((Int64)  p);
+				case TypeCode.UInt32  : return ToUInt16((UInt32) p);
+				case TypeCode.UInt64  : return ToUInt16((UInt64) p);
+				case TypeCode.Single  : return ToUInt16((Single) p);
+				case TypeCode.Double  : return ToUInt16((Double) p);
+				case TypeCode.Decimal : return ToUInt16((Decimal)p);
+				case TypeCode.Char    : return ToUInt16((Char)   p);
+				case TypeCode.String  : return ToUInt16((String) p);
+				case TypeCode.Boolean : return ToUInt16((Boolean)p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToUInt16((Boolean?)  p);
+				if (p is Byte?)      return ToUInt16((Byte?)     p);
+				if (p is Char?)      return ToUInt16((Char?)     p);
+				if (p is Decimal?)   return ToUInt16((Decimal?)  p);
+				if (p is Double?)    return ToUInt16((Double?)   p);
+				if (p is Int16?)     return ToUInt16((Int16?)    p);
+				if (p is Int32?)     return ToUInt16((Int32?)    p);
+				if (p is Int64?)     return ToUInt16((Int64?)    p);
+				if (p is SByte?)     return ToUInt16((SByte?)    p);
+				if (p is Single?)    return ToUInt16((Single?)   p);
+				if (p is UInt16?)    return ToUInt16((UInt16?)   p);
+				if (p is UInt32?)    return ToUInt16((UInt32?)   p);
+				if (p is UInt64?)    return ToUInt16((UInt64?)   p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToUInt16((Binary)    p);
+			if (p is Byte[])     return ToUInt16((Byte[])    p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToUInt16((SqlBoolean)p);
+				if (p is SqlByte)    return ToUInt16((SqlByte)   p);
+				if (p is SqlDecimal) return ToUInt16((SqlDecimal)p);
+				if (p is SqlDouble)  return ToUInt16((SqlDouble) p);
+				if (p is SqlInt16)   return ToUInt16((SqlInt16)  p);
+				if (p is SqlInt32)   return ToUInt16((SqlInt32)  p);
+				if (p is SqlInt64)   return ToUInt16((SqlInt64)  p);
+				if (p is SqlMoney)   return ToUInt16((SqlMoney)  p);
+				if (p is SqlSingle)  return ToUInt16((SqlSingle) p);
+				if (p is SqlString)  return ToUInt16((SqlString) p);
+			}
+
+#endif
+
+			if (p is IConvertible) return ((IConvertible)p).ToUInt16(null);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(UInt16));
+		}
+
+		#endregion
+
+		#region UInt32
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(Boolean    p) { return p ? (UInt32)1 : (UInt32)0;                                                                                }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(Byte       p) { return p;                                                                                                        }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(Char       p) { return checked((UInt32)p);                                                                                       }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(Decimal    p) { return checked((UInt32)p);                                                                                       }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(Double     p) { return checked((UInt32)p);                                                                                       }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(Int16      p) { return checked((UInt32)p);                                                                                       }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(Int32      p) { return checked((UInt32)p);                                                                                       }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(Int64      p) { return checked((UInt32)p);                                                                                       }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(SByte      p) { return checked((UInt32)p);                                                                                       }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(Single     p) { return checked((UInt32)p);                                                                                       }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(String     p) { return p == null? Configuration.NullableValues.UInt32 : UInt32.Parse(p);                                         }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(UInt16     p) { return p;                                                                                                        }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(UInt64     p) { return checked((UInt32)p);                                                                                       }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(Boolean?   p) { return p.HasValue && p.Value ? (UInt32)1: (UInt32)0;                                                             }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(Byte?      p) { return p.HasValue ? p.Value : Configuration.NullableValues.UInt32;                                               }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(Char?      p) { return p.HasValue ? checked((UInt32)p.Value) : Configuration.NullableValues.UInt32;                              }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(Decimal?   p) { return p.HasValue ? checked((UInt32)p.Value) : Configuration.NullableValues.UInt32;                              }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(Double?    p) { return p.HasValue ? checked((UInt32)p.Value) : Configuration.NullableValues.UInt32;                              }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(Int16?     p) { return p.HasValue ? checked((UInt32)p.Value) : Configuration.NullableValues.UInt32;                              }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(Int32?     p) { return p.HasValue ? checked((UInt32)p.Value) : Configuration.NullableValues.UInt32;                              }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(Int64?     p) { return p.HasValue ? checked((UInt32)p.Value) : Configuration.NullableValues.UInt32;                              }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(SByte?     p) { return p.HasValue ? checked((UInt32)p.Value) : Configuration.NullableValues.UInt32;                              }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(Single?    p) { return p.HasValue ? checked((UInt32)p.Value) : Configuration.NullableValues.UInt32;                              }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(UInt16?    p) { return p.HasValue ? p.Value : Configuration.NullableValues.UInt32;                                               }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(UInt32?    p) { return p.HasValue ? p.Value : Configuration.NullableValues.UInt32;                                               }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(UInt64?    p) { return p.HasValue ? checked((UInt32)p.Value) : Configuration.NullableValues.UInt32;                              }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(Binary     p) { return p == null || p.Length == 0 ? Configuration.NullableValues.UInt32 : BitConverter.ToUInt32(p.ToArray(), 0); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(Byte[]     p) { return p == null || p.Length == 0 ? Configuration.NullableValues.UInt32 : BitConverter.ToUInt32(p, 0);           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(SqlBoolean p) { return p.IsNull ? Configuration.NullableValues.UInt32 : ToUInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(SqlByte    p) { return p.IsNull ? Configuration.NullableValues.UInt32 : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(SqlDecimal p) { return p.IsNull ? Configuration.NullableValues.UInt32 : ToUInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(SqlDouble  p) { return p.IsNull ? Configuration.NullableValues.UInt32 : ToUInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(SqlInt16   p) { return p.IsNull ? Configuration.NullableValues.UInt32 : ToUInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(SqlInt32   p) { return p.IsNull ? Configuration.NullableValues.UInt32 : ToUInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(SqlInt64   p) { return p.IsNull ? Configuration.NullableValues.UInt32 : ToUInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(SqlMoney   p) { return p.IsNull ? Configuration.NullableValues.UInt32 : ToUInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(SqlSingle  p) { return p.IsNull ? Configuration.NullableValues.UInt32 : ToUInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(SqlString  p) { return p.IsNull ? Configuration.NullableValues.UInt32 : ToUInt32(p.Value);                                       }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>UInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32 ToUInt32(object p)
+		{
+			if (p == null) return Configuration.NullableValues.UInt32;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull  : return Configuration.NullableValues.UInt32;
+				case TypeCode.UInt32  : return (UInt32)p;
+				case TypeCode.Byte    : return ToUInt32((Byte)   p);
+				case TypeCode.UInt16  : return ToUInt32((UInt16) p);
+				case TypeCode.SByte   : return ToUInt32((SByte)  p);
+				case TypeCode.Int16   : return ToUInt32((Int16)  p);
+				case TypeCode.Int32   : return ToUInt32((Int32)  p);
+				case TypeCode.Int64   : return ToUInt32((Int64)  p);
+				case TypeCode.UInt64  : return ToUInt32((UInt64) p);
+				case TypeCode.Single  : return ToUInt32((Single) p);
+				case TypeCode.Double  : return ToUInt32((Double) p);
+				case TypeCode.Decimal : return ToUInt32((Decimal)p);
+				case TypeCode.Char    : return ToUInt32((Char)   p);
+				case TypeCode.String  : return ToUInt32((String) p);
+				case TypeCode.Boolean : return ToUInt32((Boolean)p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToUInt32((Boolean?)  p);
+				if (p is Byte?)      return ToUInt32((Byte?)     p);
+				if (p is Char?)      return ToUInt32((Char?)     p);
+				if (p is Decimal?)   return ToUInt32((Decimal?)  p);
+				if (p is Double?)    return ToUInt32((Double?)   p);
+				if (p is Int16?)     return ToUInt32((Int16?)    p);
+				if (p is Int32?)     return ToUInt32((Int32?)    p);
+				if (p is Int64?)     return ToUInt32((Int64?)    p);
+				if (p is SByte?)     return ToUInt32((SByte?)    p);
+				if (p is Single?)    return ToUInt32((Single?)   p);
+				if (p is UInt16?)    return ToUInt32((UInt16?)   p);
+				if (p is UInt32?)    return ToUInt32((UInt32?)   p);
+				if (p is UInt64?)    return ToUInt32((UInt64?)   p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToUInt32((Binary)    p);
+			if (p is Byte[])     return ToUInt32((Byte[])    p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToUInt32((SqlBoolean)p);
+				if (p is SqlByte)    return ToUInt32((SqlByte)   p);
+				if (p is SqlDecimal) return ToUInt32((SqlDecimal)p);
+				if (p is SqlDouble)  return ToUInt32((SqlDouble) p);
+				if (p is SqlInt16)   return ToUInt32((SqlInt16)  p);
+				if (p is SqlInt32)   return ToUInt32((SqlInt32)  p);
+				if (p is SqlInt64)   return ToUInt32((SqlInt64)  p);
+				if (p is SqlMoney)   return ToUInt32((SqlMoney)  p);
+				if (p is SqlSingle)  return ToUInt32((SqlSingle) p);
+				if (p is SqlString)  return ToUInt32((SqlString) p);
+			}
+
+#endif
+
+			if (p is IConvertible) return ((IConvertible)p).ToUInt32(null);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(UInt32));
+		}
+
+		#endregion
+
+		#region UInt64
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(Boolean    p) { return p ? (UInt64)1 : (UInt64)0;                                                                                }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(Byte       p) { return p;                                                                                                        }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(Char       p) { return checked((UInt64)p);                                                                                       }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(Decimal    p) { return checked((UInt64)p);                                                                                       }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(Double     p) { return checked((UInt64)p);                                                                                       }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(Int16      p) { return checked((UInt64)p);                                                                                       }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(Int32      p) { return checked((UInt64)p);                                                                                       }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(Int64      p) { return checked((UInt64)p);                                                                                       }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(SByte      p) { return checked((UInt64)p);                                                                                       }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(Single     p) { return checked((UInt64)p);                                                                                       }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(String     p) { return p == null? Configuration.NullableValues.UInt64 : UInt64.Parse(p);                                         }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(UInt16     p) { return p;                                                                                                        }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(UInt32     p) { return p;                                                                                                        }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(Boolean?   p) { return p.HasValue && p.Value ? (UInt64)1: (UInt64)0;                                                             }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(Byte?      p) { return p.HasValue ? p.Value : Configuration.NullableValues.UInt64;                                               }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(Char?      p) { return p.HasValue ? checked((UInt64)p.Value) : Configuration.NullableValues.UInt64;                              }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(Decimal?   p) { return p.HasValue ? checked((UInt64)p.Value) : Configuration.NullableValues.UInt64;                              }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(Double?    p) { return p.HasValue ? checked((UInt64)p.Value) : Configuration.NullableValues.UInt64;                              }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(Int16?     p) { return p.HasValue ? checked((UInt64)p.Value) : Configuration.NullableValues.UInt64;                              }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(Int32?     p) { return p.HasValue ? checked((UInt64)p.Value) : Configuration.NullableValues.UInt64;                              }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(Int64?     p) { return p.HasValue ? checked((UInt64)p.Value) : Configuration.NullableValues.UInt64;                              }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(SByte?     p) { return p.HasValue ? checked((UInt64)p.Value) : Configuration.NullableValues.UInt64;                              }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(Single?    p) { return p.HasValue ? checked((UInt64)p.Value) : Configuration.NullableValues.UInt64;                              }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(UInt16?    p) { return p.HasValue ? p.Value : Configuration.NullableValues.UInt64;                                               }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(UInt32?    p) { return p.HasValue ? p.Value : Configuration.NullableValues.UInt64;                                               }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(UInt64?    p) { return p.HasValue ? p.Value : Configuration.NullableValues.UInt64;                                               }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(Binary     p) { return p == null || p.Length == 0 ? Configuration.NullableValues.UInt64 : BitConverter.ToUInt64(p.ToArray(), 0); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(Byte[]     p) { return p == null || p.Length == 0 ? Configuration.NullableValues.UInt64 : BitConverter.ToUInt64(p, 0);           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(SqlBoolean p) { return p.IsNull ? Configuration.NullableValues.UInt64 : ToUInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(SqlByte    p) { return p.IsNull ? Configuration.NullableValues.UInt64 : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(SqlDecimal p) { return p.IsNull ? Configuration.NullableValues.UInt64 : ToUInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(SqlDouble  p) { return p.IsNull ? Configuration.NullableValues.UInt64 : ToUInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(SqlInt16   p) { return p.IsNull ? Configuration.NullableValues.UInt64 : ToUInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(SqlInt32   p) { return p.IsNull ? Configuration.NullableValues.UInt64 : ToUInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(SqlInt64   p) { return p.IsNull ? Configuration.NullableValues.UInt64 : ToUInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(SqlMoney   p) { return p.IsNull ? Configuration.NullableValues.UInt64 : ToUInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(SqlSingle  p) { return p.IsNull ? Configuration.NullableValues.UInt64 : ToUInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(SqlString  p) { return p.IsNull ? Configuration.NullableValues.UInt64 : ToUInt64(p.Value);                                       }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>UInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64 ToUInt64(object p)
+		{
+			if (p == null) return Configuration.NullableValues.UInt64;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull  : return Configuration.NullableValues.UInt64;
+				case TypeCode.UInt64  : return (UInt64)p;
+				case TypeCode.Byte    : return ToUInt64((Byte)   p);
+				case TypeCode.UInt16  : return ToUInt64((UInt16) p);
+				case TypeCode.UInt32  : return ToUInt64((UInt32) p);
+				case TypeCode.SByte   : return ToUInt64((SByte)  p);
+				case TypeCode.Int16   : return ToUInt64((Int16)  p);
+				case TypeCode.Int32   : return ToUInt64((Int32)  p);
+				case TypeCode.Int64   : return ToUInt64((Int64)  p);
+				case TypeCode.Single  : return ToUInt64((Single) p);
+				case TypeCode.Double  : return ToUInt64((Double) p);
+				case TypeCode.Decimal : return ToUInt64((Decimal)p);
+				case TypeCode.Char    : return ToUInt64((Char)   p);
+				case TypeCode.String  : return ToUInt64((String) p);
+				case TypeCode.Boolean : return ToUInt64((Boolean)p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToUInt64((Boolean?)  p);
+				if (p is Byte?)      return ToUInt64((Byte?)     p);
+				if (p is Char?)      return ToUInt64((Char?)     p);
+				if (p is Decimal?)   return ToUInt64((Decimal?)  p);
+				if (p is Double?)    return ToUInt64((Double?)   p);
+				if (p is Int16?)     return ToUInt64((Int16?)    p);
+				if (p is Int32?)     return ToUInt64((Int32?)    p);
+				if (p is Int64?)     return ToUInt64((Int64?)    p);
+				if (p is SByte?)     return ToUInt64((SByte?)    p);
+				if (p is Single?)    return ToUInt64((Single?)   p);
+				if (p is UInt16?)    return ToUInt64((UInt16?)   p);
+				if (p is UInt32?)    return ToUInt64((UInt32?)   p);
+				if (p is UInt64?)    return ToUInt64((UInt64?)   p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToUInt64((Binary)    p);
+			if (p is Byte[])     return ToUInt64((Byte[])    p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToUInt64((SqlBoolean)p);
+				if (p is SqlByte)    return ToUInt64((SqlByte)   p);
+				if (p is SqlDecimal) return ToUInt64((SqlDecimal)p);
+				if (p is SqlDouble)  return ToUInt64((SqlDouble) p);
+				if (p is SqlInt16)   return ToUInt64((SqlInt16)  p);
+				if (p is SqlInt32)   return ToUInt64((SqlInt32)  p);
+				if (p is SqlInt64)   return ToUInt64((SqlInt64)  p);
+				if (p is SqlMoney)   return ToUInt64((SqlMoney)  p);
+				if (p is SqlSingle)  return ToUInt64((SqlSingle) p);
+				if (p is SqlString)  return ToUInt64((SqlString) p);
+			}
+
+#endif
+
+			if (p is IConvertible) return ((IConvertible)p).ToUInt64(null);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(UInt64));
+		}
+
+		#endregion
+
+		#endregion
+
+		#region Nullable Types
+
+		#region Boolean?
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(Boolean    p) { return p;                                                                                    }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(Byte       p) { return p != 0;                                                                               }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(Char       p) { return ToBoolean(p);                                                                         }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(Decimal    p) { return p != 0;                                                                               }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(Double     p) { return p != 0;                                                                               }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(Int16      p) { return p != 0;                                                                               }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(Int32      p) { return p != 0;                                                                               }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(Int64      p) { return p != 0;                                                                               }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>Boolean?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Boolean? ToNullableBoolean(SByte      p) { return p != 0;                                                                               }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(Single     p) { return p != 0;                                                                               }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(String     p) { return p == null? (Boolean?)null : p.Length == 1 ? ToBoolean(p[0]) : Boolean.Parse(p);       }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>Boolean?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Boolean? ToNullableBoolean(UInt16     p) { return p != 0;                                                                               }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>Boolean?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Boolean? ToNullableBoolean(UInt32     p) { return p != 0;                                                                               }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>Boolean?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Boolean? ToNullableBoolean(UInt64     p) { return p != 0;                                                                               }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(Byte?      p) { return p.HasValue ? p.Value != 0 : (Boolean?)null;                                           }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(Char?      p) { return p.HasValue && ToBoolean(p.Value);                                                     }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(Decimal?   p) { return p.HasValue ? p.Value != 0 : (Boolean?)null;                                           }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(Double?    p) { return p.HasValue ? p.Value != 0 : (Boolean?)null;                                           }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(Int16?     p) { return p.HasValue ? p.Value != 0 : (Boolean?)null;                                           }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(Int32?     p) { return p.HasValue ? p.Value != 0 : (Boolean?)null;                                           }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(Int64?     p) { return p.HasValue ? p.Value != 0 : (Boolean?)null;                                           }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>Boolean?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Boolean? ToNullableBoolean(SByte?     p) { return p.HasValue ? p.Value != 0 : (Boolean?)null;                                           }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(Single?    p) { return p.HasValue ? p.Value != 0 : (Boolean?)null;                                           }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>Boolean?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Boolean? ToNullableBoolean(UInt16?    p) { return p.HasValue ? p.Value != 0 : (Boolean?)null;                                           }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>Boolean?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Boolean? ToNullableBoolean(UInt32?    p) { return p.HasValue ? p.Value != 0 : (Boolean?)null;                                           }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>Boolean?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Boolean? ToNullableBoolean(UInt64?    p) { return p.HasValue ? p.Value != 0 : (Boolean?)null;                                           }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(Binary     p) { return p == null || p.Length == 0 ? (Boolean?)null : BitConverter.ToBoolean(p.ToArray(), 0); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(Byte[]     p) { return p == null || p.Length == 0 ? (Boolean?)null : BitConverter.ToBoolean(p, 0);           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(SqlBoolean p) { return p.IsNull ? (Boolean?)null : p.Value;                                                  }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(SqlByte    p) { return p.IsNull ? (Boolean?)null : ToBoolean(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(SqlDecimal p) { return p.IsNull ? (Boolean?)null : ToBoolean(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(SqlDouble  p) { return p.IsNull ? (Boolean?)null : ToBoolean(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(SqlInt16   p) { return p.IsNull ? (Boolean?)null : ToBoolean(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(SqlInt32   p) { return p.IsNull ? (Boolean?)null : ToBoolean(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(SqlInt64   p) { return p.IsNull ? (Boolean?)null : ToBoolean(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(SqlMoney   p) { return p.IsNull ? (Boolean?)null : ToBoolean(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(SqlSingle  p) { return p.IsNull ? (Boolean?)null : ToBoolean(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(SqlString  p) { return p.IsNull ? (Boolean?)null : ToBoolean(p.Value);                                       }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>Boolean?</c> value.</summary>
+		public static Boolean? ToNullableBoolean(object p)
+		{
+			if (p == null) return null;
+
+			if (p is Boolean?) return (Boolean?)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull   : return null;
+				case TypeCode.String   : return ToNullableBoolean((String)  p);
+				case TypeCode.Boolean  : return ToNullableBoolean((Boolean) p);
+				case TypeCode.Char     : return ToNullableBoolean((Char)    p);
+				case TypeCode.SByte    : return ToNullableBoolean((SByte)   p);
+				case TypeCode.Int16    : return ToNullableBoolean((Int16)   p);
+				case TypeCode.Int32    : return ToNullableBoolean((Int32)   p);
+				case TypeCode.Int64    : return ToNullableBoolean((Int64)   p);
+				case TypeCode.Byte     : return ToNullableBoolean((Byte)    p);
+				case TypeCode.UInt16   : return ToNullableBoolean((UInt16)  p);
+				case TypeCode.UInt32   : return ToNullableBoolean((UInt32)  p);
+				case TypeCode.UInt64   : return ToNullableBoolean((UInt64)  p);
+				case TypeCode.Single   : return ToNullableBoolean((Single)  p);
+				case TypeCode.Double   : return ToNullableBoolean((Double)  p);
+				case TypeCode.Decimal  : return ToNullableBoolean((Decimal) p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Byte?)      return ToNullableBoolean((Byte?)     p);
+				if (p is Char?)      return ToNullableBoolean((Char?)     p);
+				if (p is Decimal?)   return ToNullableBoolean((Decimal?)  p);
+				if (p is Double?)    return ToNullableBoolean((Double?)   p);
+				if (p is Int16?)     return ToNullableBoolean((Int16?)    p);
+				if (p is Int32?)     return ToNullableBoolean((Int32?)    p);
+				if (p is Int64?)     return ToNullableBoolean((Int64?)    p);
+				if (p is SByte?)     return ToNullableBoolean((SByte?)    p);
+				if (p is Single?)    return ToNullableBoolean((Single?)   p);
+				if (p is UInt16?)    return ToNullableBoolean((UInt16?)   p);
+				if (p is UInt32?)    return ToNullableBoolean((UInt32?)   p);
+				if (p is UInt64?)    return ToNullableBoolean((UInt64?)   p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToNullableBoolean((Binary)    p);
+			if (p is Byte[])     return ToNullableBoolean((Byte[])    p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToNullableBoolean((SqlBoolean)p);
+				if (p is SqlByte)    return ToNullableBoolean((SqlByte)   p);
+				if (p is SqlDecimal) return ToNullableBoolean((SqlDecimal)p);
+				if (p is SqlDouble)  return ToNullableBoolean((SqlDouble) p);
+				if (p is SqlInt16)   return ToNullableBoolean((SqlInt16)  p);
+				if (p is SqlInt32)   return ToNullableBoolean((SqlInt32)  p);
+				if (p is SqlInt64)   return ToNullableBoolean((SqlInt64)  p);
+				if (p is SqlMoney)   return ToNullableBoolean((SqlMoney)  p);
+				if (p is SqlSingle)  return ToNullableBoolean((SqlSingle) p);
+				if (p is SqlString)  return ToNullableBoolean((SqlString) p);
+			}
+
+#endif
+
+			throw CreateInvalidCastException(p.GetType(), typeof(Boolean?));
+		}
+
+		#endregion
+
+		#region Byte?
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(Boolean    p) { return p ? (Byte?)1 : (Byte?)0;                                   }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(Byte       p) { return p;                                                         }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(Char       p) { return checked((Byte?)p);                                         }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(Decimal    p) { return checked((Byte?)p);                                         }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(Double     p) { return checked((Byte?)p);                                         }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(Int16      p) { return checked((Byte?)p);                                         }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(Int32      p) { return checked((Byte?)p);                                         }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(Int64      p) { return checked((Byte?)p);                                         }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>Byte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Byte? ToNullableByte(SByte      p) { return checked((Byte?)p);                                         }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(Single     p) { return checked((Byte?)p);                                         }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(String     p) { return p == null? (Byte?)null : Byte.Parse(p);                    }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>Byte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Byte? ToNullableByte(UInt16     p) { return checked((Byte?)p);                                         }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>Byte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Byte? ToNullableByte(UInt32     p) { return checked((Byte?)p);                                         }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>Byte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Byte? ToNullableByte(UInt64     p) { return checked((Byte?)p);                                         }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(Boolean?   p) { return p.HasValue && p.Value ? (Byte?)1: (Byte?)0;                }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(Char?      p) { return p.HasValue ? checked((Byte?)p.Value) : (Byte?)null;        }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(Decimal?   p) { return p.HasValue ? checked((Byte?)p.Value) : (Byte?)null;        }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(Double?    p) { return p.HasValue ? checked((Byte?)p.Value) : (Byte?)null;        }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(Int16?     p) { return p.HasValue ? checked((Byte?)p.Value) : (Byte?)null;        }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(Int32?     p) { return p.HasValue ? checked((Byte?)p.Value) : (Byte?)null;        }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(Int64?     p) { return p.HasValue ? checked((Byte?)p.Value) : (Byte?)null;        }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>Byte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Byte? ToNullableByte(SByte?     p) { return p.HasValue ? checked((Byte?)p.Value) : (Byte?)null;        }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(Single?    p) { return p.HasValue ? checked((Byte?)p.Value) : (Byte?)null;        }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>Byte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Byte? ToNullableByte(UInt16?    p) { return p.HasValue ? checked((Byte?)p.Value) : (Byte?)null;        }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>Byte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Byte? ToNullableByte(UInt32?    p) { return p.HasValue ? checked((Byte?)p.Value) : (Byte?)null;        }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>Byte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Byte? ToNullableByte(UInt64?    p) { return p.HasValue ? checked((Byte?)p.Value) : (Byte?)null;        }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(Binary     p) { return p == null || p.Length == 0 ? (Byte?)null : p.ToArray()[0]; }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(Byte[]     p) { return p == null || p.Length == 0 ? (Byte?)null : p[0];           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(SqlBoolean p) { return p.IsNull ? (Byte?)null : ToByte(p.Value);                  }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(SqlByte    p) { return p.IsNull ? (Byte?)null : p.Value;                          }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(SqlDecimal p) { return p.IsNull ? (Byte?)null : ToByte(p.Value);                  }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(SqlDouble  p) { return p.IsNull ? (Byte?)null : ToByte(p.Value);                  }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(SqlInt16   p) { return p.IsNull ? (Byte?)null : ToByte(p.Value);                  }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(SqlInt32   p) { return p.IsNull ? (Byte?)null : ToByte(p.Value);                  }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(SqlInt64   p) { return p.IsNull ? (Byte?)null : ToByte(p.Value);                  }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(SqlMoney   p) { return p.IsNull ? (Byte?)null : ToByte(p.Value);                  }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(SqlSingle  p) { return p.IsNull ? (Byte?)null : ToByte(p.Value);                  }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(SqlString  p) { return p.IsNull ? (Byte?)null : ToByte(p.Value);                  }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>Byte?</c> value.</summary>
+		public static Byte? ToNullableByte(object p)
+		{
+			if (p == null) return null;
+
+			if (p is Byte?) return (Byte?)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull  : return null;
+				case TypeCode.Byte    : return ToNullableByte((Byte)   p);
+				case TypeCode.SByte   : return ToNullableByte((SByte)  p);
+				case TypeCode.Int16   : return ToNullableByte((Int16)  p);
+				case TypeCode.Int32   : return ToNullableByte((Int32)  p);
+				case TypeCode.Int64   : return ToNullableByte((Int64)  p);
+				case TypeCode.UInt16  : return ToNullableByte((UInt16) p);
+				case TypeCode.UInt32  : return ToNullableByte((UInt32) p);
+				case TypeCode.UInt64  : return ToNullableByte((UInt64) p);
+				case TypeCode.Single  : return ToNullableByte((Single) p);
+				case TypeCode.Double  : return ToNullableByte((Double) p);
+				case TypeCode.Decimal : return ToNullableByte((Decimal)p);
+				case TypeCode.Char    : return ToNullableByte((Char)   p);
+				case TypeCode.String  : return ToNullableByte((String) p);
+				case TypeCode.Boolean : return ToNullableByte((Boolean)p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToNullableByte((Boolean?)  p);
+				if (p is Char?)      return ToNullableByte((Char?)     p);
+				if (p is Decimal?)   return ToNullableByte((Decimal?)  p);
+				if (p is Double?)    return ToNullableByte((Double?)   p);
+				if (p is Int16?)     return ToNullableByte((Int16?)    p);
+				if (p is Int32?)     return ToNullableByte((Int32?)    p);
+				if (p is Int64?)     return ToNullableByte((Int64?)    p);
+				if (p is SByte?)     return ToNullableByte((SByte?)    p);
+				if (p is Single?)    return ToNullableByte((Single?)   p);
+				if (p is UInt16?)    return ToNullableByte((UInt16?)   p);
+				if (p is UInt32?)    return ToNullableByte((UInt32?)   p);
+				if (p is UInt64?)    return ToNullableByte((UInt64?)   p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToNullableByte((Binary)    p);
+			if (p is Byte[])     return ToNullableByte((Byte[])    p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToNullableByte((SqlBoolean)p);
+				if (p is SqlByte)    return ToNullableByte((SqlByte)   p);
+				if (p is SqlDecimal) return ToNullableByte((SqlDecimal)p);
+				if (p is SqlDouble)  return ToNullableByte((SqlDouble) p);
+				if (p is SqlInt16)   return ToNullableByte((SqlInt16)  p);
+				if (p is SqlInt32)   return ToNullableByte((SqlInt32)  p);
+				if (p is SqlInt64)   return ToNullableByte((SqlInt64)  p);
+				if (p is SqlMoney)   return ToNullableByte((SqlMoney)  p);
+				if (p is SqlSingle)  return ToNullableByte((SqlSingle) p);
+				if (p is SqlString)  return ToNullableByte((SqlString) p);
+			}
+
+#endif
+
+			throw CreateInvalidCastException(p.GetType(), typeof(Byte?));
+		}
+
+		#endregion
+
+		#region Char?
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(Boolean    p) { return p ? (Char?)1 : (Char?)0;                                                        }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(Byte       p) { return checked((Char?)p);                                                              }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(Char       p) { return p;                                                                              }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(Decimal    p) { return checked((Char?)p);                                                              }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(Double     p) { return checked((Char?)p);                                                              }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(Int16      p) { return checked((Char?)p);                                                              }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(Int32      p) { return checked((Char?)p);                                                              }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(Int64      p) { return checked((Char?)p);                                                              }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>Char?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Char? ToNullableChar(SByte      p) { return checked((Char?)p);                                                              }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(Single     p) { return checked((Char?)p);                                                              }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(String     p) { return string.IsNullOrEmpty(p)? (Char?)0 : p[0];                                       }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>Char?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Char? ToNullableChar(UInt16     p) { return checked((Char?)p);                                                              }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>Char?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Char? ToNullableChar(UInt32     p) { return checked((Char?)p);                                                              }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>Char?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Char? ToNullableChar(UInt64     p) { return checked((Char?)p);                                                              }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(Boolean?   p) { return p.HasValue && p.Value ? (Char?)1: (Char?)0;                                     }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(Byte?      p) { return p.HasValue ? checked((Char?)p.Value) : (Char?)null;                             }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(Decimal?   p) { return p.HasValue ? checked((Char?)p.Value) : (Char?)null;                             }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(Double?    p) { return p.HasValue ? checked((Char?)p.Value) : (Char?)null;                             }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(Int16?     p) { return p.HasValue ? checked((Char?)p.Value) : (Char?)null;                             }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(Int32?     p) { return p.HasValue ? checked((Char?)p.Value) : (Char?)null;                             }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(Int64?     p) { return p.HasValue ? checked((Char?)p.Value) : (Char?)null;                             }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>Char?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Char? ToNullableChar(SByte?     p) { return p.HasValue ? checked((Char?)p.Value) : (Char?)null;                             }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(Single?    p) { return p.HasValue ? checked((Char?)p.Value) : (Char?)null;                             }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>Char?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Char? ToNullableChar(UInt16?    p) { return p.HasValue ? checked((Char?)p.Value) : (Char?)null;                             }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>Char?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Char? ToNullableChar(UInt32?    p) { return p.HasValue ? checked((Char?)p.Value) : (Char?)null;                             }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>Char?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Char? ToNullableChar(UInt64?    p) { return p.HasValue ? checked((Char?)p.Value) : (Char?)null;                             }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(Binary     p) { return p == null || p.Length == 0 ? (Char?)null : BitConverter.ToChar(p.ToArray(), 0); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(Byte[]     p) { return p == null || p.Length == 0 ? (Char?)null : BitConverter.ToChar(p, 0);           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(SqlBoolean p) { return p.IsNull ? (Char?)null : ToChar(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(SqlByte    p) { return p.IsNull ? (Char?)null : ToChar(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(SqlDecimal p) { return p.IsNull ? (Char?)null : ToChar(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(SqlDouble  p) { return p.IsNull ? (Char?)null : ToChar(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(SqlInt16   p) { return p.IsNull ? (Char?)null : ToChar(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(SqlInt32   p) { return p.IsNull ? (Char?)null : ToChar(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(SqlInt64   p) { return p.IsNull ? (Char?)null : ToChar(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(SqlMoney   p) { return p.IsNull ? (Char?)null : ToChar(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(SqlSingle  p) { return p.IsNull ? (Char?)null : ToChar(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(SqlString  p) { return p.IsNull ? (Char?)null : ToChar(p.Value);                                       }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>Char?</c> value.</summary>
+		public static Char? ToNullableChar(object p)
+		{
+			if (p == null) return null;
+
+			if (p is Char?) return (Char?)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull  : return null;
+				case TypeCode.Char    : return ToNullableChar((Char)   p);
+				case TypeCode.SByte   : return ToNullableChar((SByte)  p);
+				case TypeCode.Int16   : return ToNullableChar((Int16)  p);
+				case TypeCode.Int32   : return ToNullableChar((Int32)  p);
+				case TypeCode.Int64   : return ToNullableChar((Int64)  p);
+				case TypeCode.Byte    : return ToNullableChar((Byte)   p);
+				case TypeCode.UInt16  : return ToNullableChar((UInt16) p);
+				case TypeCode.UInt32  : return ToNullableChar((UInt32) p);
+				case TypeCode.UInt64  : return ToNullableChar((UInt64) p);
+				case TypeCode.Single  : return ToNullableChar((Single) p);
+				case TypeCode.Double  : return ToNullableChar((Double) p);
+				case TypeCode.Decimal : return ToNullableChar((Decimal)p);
+				case TypeCode.String  : return ToNullableChar((String) p);
+				case TypeCode.Boolean : return ToNullableChar((Boolean)p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToNullableChar((Boolean?)  p);
+				if (p is Byte?)      return ToNullableChar((Byte?)     p);
+				if (p is Decimal?)   return ToNullableChar((Decimal?)  p);
+				if (p is Double?)    return ToNullableChar((Double?)   p);
+				if (p is Int16?)     return ToNullableChar((Int16?)    p);
+				if (p is Int32?)     return ToNullableChar((Int32?)    p);
+				if (p is Int64?)     return ToNullableChar((Int64?)    p);
+				if (p is SByte?)     return ToNullableChar((SByte?)    p);
+				if (p is Single?)    return ToNullableChar((Single?)   p);
+				if (p is UInt16?)    return ToNullableChar((UInt16?)   p);
+				if (p is UInt32?)    return ToNullableChar((UInt32?)   p);
+				if (p is UInt64?)    return ToNullableChar((UInt64?)   p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToNullableChar((Binary)    p);
+			if (p is Byte[])     return ToNullableChar((Byte[])    p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToNullableChar((SqlBoolean)p);
+				if (p is SqlByte)    return ToNullableChar((SqlByte)   p);
+				if (p is SqlDecimal) return ToNullableChar((SqlDecimal)p);
+				if (p is SqlDouble)  return ToNullableChar((SqlDouble) p);
+				if (p is SqlInt16)   return ToNullableChar((SqlInt16)  p);
+				if (p is SqlInt32)   return ToNullableChar((SqlInt32)  p);
+				if (p is SqlInt64)   return ToNullableChar((SqlInt64)  p);
+				if (p is SqlMoney)   return ToNullableChar((SqlMoney)  p);
+				if (p is SqlSingle)  return ToNullableChar((SqlSingle) p);
+				if (p is SqlString)  return ToNullableChar((SqlString) p);
+			}
+
+#endif
+
+			throw CreateInvalidCastException(p.GetType(), typeof(Char?));
+		}
+
+		#endregion
+
+		#region DateTime?
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>DateTime</c> to an equivalent <c>DateTime?</c> value.</summary>
+		public static DateTime? ToNullableDateTime(DateTime        p) { return p;                                                                                          }
+		/// <summary>Converts the value from <c>DateTimeOffset</c> to an equivalent <c>DateTime?</c> value.</summary>
+		public static DateTime? ToNullableDateTime(DateTimeOffset  p) { return p.LocalDateTime;                                                                            }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>DateTime?</c> value.</summary>
+		public static DateTime? ToNullableDateTime(Double          p) { return DateTime.MinValue + TimeSpan.FromDays (p);                                                  }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>DateTime?</c> value.</summary>
+		public static DateTime? ToNullableDateTime(Int64           p) { return DateTime.MinValue + TimeSpan.FromTicks(p);                                                  }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>DateTime?</c> value.</summary>
+		public static DateTime? ToNullableDateTime(String          p) { return p == null ? (DateTime?)null : DateTime.Parse(p, null, DateTimeStyles.NoCurrentDateDefault); }
+		/// <summary>Converts the value from <c>TimeSpan</c> to an equivalent <c>DateTime?</c> value.</summary>
+		public static DateTime? ToNullableDateTime(TimeSpan        p) { return DateTime.MinValue + p;                                                                      }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>DateTimeOffset?</c> to an equivalent <c>DateTime?</c> value.</summary>
+		public static DateTime? ToNullableDateTime(DateTimeOffset? p) { return p.HasValue ?                     p.Value.LocalDateTime : (DateTime?)null;                   }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>DateTime?</c> value.</summary>
+		public static DateTime? ToNullableDateTime(Double?         p) { return p.HasValue ? DateTime.MinValue + TimeSpan.FromDays (p.Value): (DateTime?)null;              }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>DateTime?</c> value.</summary>
+		public static DateTime? ToNullableDateTime(Int64?          p) { return p.HasValue ? DateTime.MinValue + TimeSpan.FromTicks(p.Value): (DateTime?)null;              }
+		/// <summary>Converts the value from <c>TimeSpan?</c> to an equivalent <c>DateTime?</c> value.</summary>
+		public static DateTime? ToNullableDateTime(TimeSpan?       p) { return p.HasValue ? DateTime.MinValue +                    p.Value : (DateTime?)null;              }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>DateTime?</c> value.</summary>
+		public static DateTime? ToNullableDateTime(Binary          p) { return p == null || p.Length == 0 ? (DateTime?)null : DateTime.FromBinary(ToInt64(p.ToArray()));   }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>DateTime?</c> value.</summary>
+		public static DateTime? ToNullableDateTime(Byte[]          p) { return p == null || p.Length == 0 ? (DateTime?)null : DateTime.FromBinary(ToInt64(p));             }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlDateTime</c> to an equivalent <c>DateTime?</c> value.</summary>
+		public static DateTime? ToNullableDateTime(SqlDateTime     p) { return p.IsNull ? (DateTime?)null : p.Value;                                                       }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>DateTime?</c> value.</summary>
+		public static DateTime? ToNullableDateTime(SqlDouble       p) { return p.IsNull   ? (DateTime?)null : DateTime.MinValue + TimeSpan.FromDays (p.Value);             }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>DateTime?</c> value.</summary>
+		public static DateTime? ToNullableDateTime(SqlInt64        p) { return p.IsNull   ? (DateTime?)null : DateTime.MinValue + TimeSpan.FromTicks(p.Value);             }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>DateTime?</c> value.</summary>
+		public static DateTime? ToNullableDateTime(SqlString       p) { return p.IsNull   ? (DateTime?)null :                             ToDateTime(p.Value);             }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>DateTime?</c> value.</summary>
+		public static DateTime? ToNullableDateTime(object p)
+		{
+			if (p == null) return null;
+
+			if (p is DateTime?) return (DateTime?)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull    : return null;
+				case TypeCode.DateTime  : return ToNullableDateTime((DateTime) p);
+				case TypeCode.String    : return ToNullableDateTime((String)   p);
+				case TypeCode.Int64     : return ToNullableDateTime((Int64)    p);
+				case TypeCode.Double    : return ToNullableDateTime((Double)   p);
+			}
+
+			// Simple Types
+			//
+			if (p is DateTimeOffset)  return ToNullableDateTime((DateTimeOffset) p);
+			if (p is TimeSpan)        return ToNullableDateTime((TimeSpan)       p);
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is DateTimeOffset?) return ToNullableDateTime((DateTimeOffset?)p);
+				if (p is Double?)         return ToNullableDateTime((Double?)        p);
+				if (p is Int64?)          return ToNullableDateTime((Int64?)         p);
+				if (p is TimeSpan?)       return ToNullableDateTime((TimeSpan?)      p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)          return ToNullableDateTime((Binary)         p);
+			if (p is Byte[])          return ToNullableDateTime((Byte[])         p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlDateTime)     return ToNullableDateTime((SqlDateTime)    p);
+				if (p is SqlDouble)       return ToNullableDateTime((SqlDouble)      p);
+				if (p is SqlInt64)        return ToNullableDateTime((SqlInt64)       p);
+				if (p is SqlString)       return ToNullableDateTime((SqlString)      p);
+			}
+
+#endif
+
+			throw CreateInvalidCastException(p.GetType(), typeof(DateTime?));
+		}
+
+		#endregion
+
+		#region DateTimeOffset?
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>DateTime</c> to an equivalent <c>DateTimeOffset?</c> value.</summary>
+		public static DateTimeOffset? ToNullableDateTimeOffset(DateTime       p) { return p;                                                                                                 }
+		/// <summary>Converts the value from <c>DateTimeOffset</c> to an equivalent <c>DateTimeOffset?</c> value.</summary>
+		public static DateTimeOffset? ToNullableDateTimeOffset(DateTimeOffset p) { return p;                                                                                                 }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>DateTimeOffset?</c> value.</summary>
+		public static DateTimeOffset? ToNullableDateTimeOffset(Double         p) { return DateTimeOffset.MinValue + TimeSpan.FromDays (p);                                                   }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>DateTimeOffset?</c> value.</summary>
+		public static DateTimeOffset? ToNullableDateTimeOffset(Int64          p) { return DateTimeOffset.MinValue + TimeSpan.FromTicks(p);                                                   }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>DateTimeOffset?</c> value.</summary>
+		public static DateTimeOffset? ToNullableDateTimeOffset(String         p) { return p == null? (DateTimeOffset?)null : DateTimeOffset.Parse(p);                                        }
+		/// <summary>Converts the value from <c>TimeSpan</c> to an equivalent <c>DateTimeOffset?</c> value.</summary>
+		public static DateTimeOffset? ToNullableDateTimeOffset(TimeSpan       p) { return DateTimeOffset.MinValue + p;                                                                       }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>DateTime?</c> to an equivalent <c>DateTimeOffset?</c> value.</summary>
+		public static DateTimeOffset? ToNullableDateTimeOffset(DateTime?      p) { return p.HasValue ?                                   p.Value : (DateTimeOffset?)null;                    }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>DateTimeOffset?</c> value.</summary>
+		public static DateTimeOffset? ToNullableDateTimeOffset(Double?        p) { return p.HasValue ? DateTimeOffset.MinValue + TimeSpan.FromDays (p.Value): (DateTimeOffset?)null;         }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>DateTimeOffset?</c> value.</summary>
+		public static DateTimeOffset? ToNullableDateTimeOffset(Int64?         p) { return p.HasValue ? DateTimeOffset.MinValue + TimeSpan.FromTicks(p.Value): (DateTimeOffset?)null;         }
+		/// <summary>Converts the value from <c>TimeSpan?</c> to an equivalent <c>DateTimeOffset?</c> value.</summary>
+		public static DateTimeOffset? ToNullableDateTimeOffset(TimeSpan?      p) { return p.HasValue ? DateTimeOffset.MinValue +                    p.Value : (DateTimeOffset?)null;         }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>DateTimeOffset?</c> value.</summary>
+		public static DateTimeOffset? ToNullableDateTimeOffset(Binary         p) { return p == null || p.Length == 0 ? (DateTimeOffset?)null : new DateTimeOffset?(ToDateTime(p.ToArray())); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>DateTimeOffset?</c> value.</summary>
+		public static DateTimeOffset? ToNullableDateTimeOffset(Byte[]         p) { return p == null || p.Length == 0 ? (DateTimeOffset?)null : new DateTimeOffset?(ToDateTime(p));           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlDateTime</c> to an equivalent <c>DateTimeOffset?</c> value.</summary>
+		public static DateTimeOffset? ToNullableDateTimeOffset(SqlDateTime    p) { return p.IsNull   ? (DateTimeOffset?)null :                                   p.Value;                    }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>DateTimeOffset?</c> value.</summary>
+		public static DateTimeOffset? ToNullableDateTimeOffset(SqlDouble      p) { return p.IsNull   ? (DateTimeOffset?)null : DateTimeOffset.MinValue + TimeSpan.FromDays (p.Value);        }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>DateTimeOffset?</c> value.</summary>
+		public static DateTimeOffset? ToNullableDateTimeOffset(SqlInt64       p) { return p.IsNull   ? (DateTimeOffset?)null : DateTimeOffset.MinValue + TimeSpan.FromTicks(p.Value);        }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>DateTimeOffset?</c> value.</summary>
+		public static DateTimeOffset? ToNullableDateTimeOffset(SqlString      p) { return p.IsNull   ? (DateTimeOffset?)null :                  ToDateTimeOffset(p.Value);                   }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>DateTimeOffset?</c> value.</summary>
+		public static DateTimeOffset? ToNullableDateTimeOffset(object p)
+		{
+			if (p == null) return null;
+
+			if (p is DateTimeOffset?) return (DateTimeOffset?)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull          : return null;
+				case TypeCode.Int64           : return ToNullableDateTimeOffset((Int64)          p);
+				case TypeCode.Double          : return ToNullableDateTimeOffset((Double)         p);
+				case TypeCode.DateTime        : return ToNullableDateTimeOffset((DateTime)       p);
+				case TypeCode.String          : return ToNullableDateTimeOffset((String)         p);
+			}
+
+			// Simple Types
+			//
+			if (p is DateTimeOffset) return ToNullableDateTimeOffset((DateTimeOffset)p);
+			if (p is TimeSpan)       return ToNullableDateTimeOffset((TimeSpan)      p);
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is DateTime?)      return ToNullableDateTimeOffset((DateTime?)     p);
+				if (p is Double?)        return ToNullableDateTimeOffset((Double?)       p);
+				if (p is Int64?)         return ToNullableDateTimeOffset((Int64?)        p);
+				if (p is TimeSpan?)      return ToNullableDateTimeOffset((TimeSpan?)     p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)         return ToNullableDateTimeOffset((Binary)        p);
+			if (p is Byte[])         return ToNullableDateTimeOffset((Byte[])        p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlDateTime)    return ToNullableDateTimeOffset((SqlDateTime)   p);
+				if (p is SqlDouble)      return ToNullableDateTimeOffset((SqlDouble)     p);
+				if (p is SqlInt64)       return ToNullableDateTimeOffset((SqlInt64)      p);
+				if (p is SqlString)      return ToNullableDateTimeOffset((SqlString)     p);
+			}
+
+#endif
+
+			throw CreateInvalidCastException(p.GetType(), typeof(DateTimeOffset?));
+		}
+
+		#endregion
+
+		#region Decimal?
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(Boolean    p) { return p ? (Decimal?)1 : (Decimal?)0;                              }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(Byte       p) { return p;                                                          }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(Char       p) { return p;                                                          }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(Decimal    p) { return p;                                                          }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(Double     p) { return checked((Decimal?)p);                                       }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(Int16      p) { return p;                                                          }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(Int32      p) { return p;                                                          }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(Int64      p) { return p;                                                          }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>Decimal?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Decimal? ToNullableDecimal(SByte      p) { return p;                                                          }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(Single     p) { return checked((Decimal?)p);                                       }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(String     p) { return p == null? (Decimal?)null : Decimal.Parse(p);               }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>Decimal?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Decimal? ToNullableDecimal(UInt16     p) { return p;                                                          }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>Decimal?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Decimal? ToNullableDecimal(UInt32     p) { return p;                                                          }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>Decimal?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Decimal? ToNullableDecimal(UInt64     p) { return p;                                                          }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(Boolean?   p) { return p.HasValue && p.Value ? (Decimal?)1: (Decimal?)0;           }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(Byte?      p) { return p.HasValue ? p.Value : (Decimal?)null;                      }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(Char?      p) { return p.HasValue ? p.Value : (Decimal?)null;                      }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(Double?    p) { return p.HasValue ? checked((Decimal?)p.Value) : (Decimal?)null;   }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(Int16?     p) { return p.HasValue ? p.Value : (Decimal?)null;                      }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(Int32?     p) { return p.HasValue ? p.Value : (Decimal?)null;                      }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(Int64?     p) { return p.HasValue ? p.Value : (Decimal?)null;                      }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>Decimal?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Decimal? ToNullableDecimal(SByte?     p) { return p.HasValue ? p.Value : (Decimal?)null;                      }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(Single?    p) { return p.HasValue ? checked((Decimal?)p.Value) : (Decimal?)null;   }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>Decimal?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Decimal? ToNullableDecimal(UInt16?    p) { return p.HasValue ? p.Value : (Decimal?)null;                      }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>Decimal?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Decimal? ToNullableDecimal(UInt32?    p) { return p.HasValue ? p.Value : (Decimal?)null;                      }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>Decimal?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Decimal? ToNullableDecimal(UInt64?    p) { return p.HasValue ? p.Value : (Decimal?)null;                      }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(Binary     p) { return p == null || p.Length == 0 ? (Decimal?)null : ToDecimal(p); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(Byte[]     p) { return p == null || p.Length == 0 ? (Decimal?)null : ToDecimal(p); }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(SqlBoolean p) { return p.IsNull ? (Decimal?)null : ToDecimal(p.Value);             }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(SqlByte    p) { return p.IsNull ? (Decimal?)null : p.Value;                        }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(SqlDecimal p) { return p.IsNull ? (Decimal?)null : p.Value;                        }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(SqlDouble  p) { return p.IsNull ? (Decimal?)null : ToDecimal(p.Value);             }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(SqlInt16   p) { return p.IsNull ? (Decimal?)null : p.Value;                        }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(SqlInt32   p) { return p.IsNull ? (Decimal?)null : p.Value;                        }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(SqlInt64   p) { return p.IsNull ? (Decimal?)null : p.Value;                        }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(SqlMoney   p) { return p.IsNull ? (Decimal?)null : p.Value;                        }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(SqlSingle  p) { return p.IsNull ? (Decimal?)null : ToDecimal(p.Value);             }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(SqlString  p) { return p.IsNull ? (Decimal?)null : ToDecimal(p.Value);             }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>Decimal?</c> value.</summary>
+		public static Decimal? ToNullableDecimal(object p)
+		{
+			if (p == null) return null;
+
+			if (p is Decimal?) return (Decimal?)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull   : return null;
+				case TypeCode.SByte    : return ToNullableDecimal((SByte)   p);
+				case TypeCode.Int16    : return ToNullableDecimal((Int16)   p);
+				case TypeCode.Int32    : return ToNullableDecimal((Int32)   p);
+				case TypeCode.Int64    : return ToNullableDecimal((Int64)   p);
+				case TypeCode.Byte     : return ToNullableDecimal((Byte)    p);
+				case TypeCode.UInt16   : return ToNullableDecimal((UInt16)  p);
+				case TypeCode.UInt32   : return ToNullableDecimal((UInt32)  p);
+				case TypeCode.Char     : return ToNullableDecimal((Char)    p);
+				case TypeCode.UInt64   : return ToNullableDecimal((UInt64)  p);
+				case TypeCode.Decimal  : return ToNullableDecimal((Decimal) p);
+				case TypeCode.Single   : return ToNullableDecimal((Single)  p);
+				case TypeCode.Double   : return ToNullableDecimal((Double)  p);
+				case TypeCode.String   : return ToNullableDecimal((String)  p);
+				case TypeCode.Boolean  : return ToNullableDecimal((Boolean) p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToNullableDecimal((Boolean?)  p);
+				if (p is Byte?)      return ToNullableDecimal((Byte?)     p);
+				if (p is Char?)      return ToNullableDecimal((Char?)     p);
+				if (p is Double?)    return ToNullableDecimal((Double?)   p);
+				if (p is Int16?)     return ToNullableDecimal((Int16?)    p);
+				if (p is Int32?)     return ToNullableDecimal((Int32?)    p);
+				if (p is Int64?)     return ToNullableDecimal((Int64?)    p);
+				if (p is SByte?)     return ToNullableDecimal((SByte?)    p);
+				if (p is Single?)    return ToNullableDecimal((Single?)   p);
+				if (p is UInt16?)    return ToNullableDecimal((UInt16?)   p);
+				if (p is UInt32?)    return ToNullableDecimal((UInt32?)   p);
+				if (p is UInt64?)    return ToNullableDecimal((UInt64?)   p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToNullableDecimal((Binary)    p);
+			if (p is Byte[])     return ToNullableDecimal((Byte[])    p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToNullableDecimal((SqlBoolean)p);
+				if (p is SqlByte)    return ToNullableDecimal((SqlByte)   p);
+				if (p is SqlDecimal) return ToNullableDecimal((SqlDecimal)p);
+				if (p is SqlDouble)  return ToNullableDecimal((SqlDouble) p);
+				if (p is SqlInt16)   return ToNullableDecimal((SqlInt16)  p);
+				if (p is SqlInt32)   return ToNullableDecimal((SqlInt32)  p);
+				if (p is SqlInt64)   return ToNullableDecimal((SqlInt64)  p);
+				if (p is SqlMoney)   return ToNullableDecimal((SqlMoney)  p);
+				if (p is SqlSingle)  return ToNullableDecimal((SqlSingle) p);
+				if (p is SqlString)  return ToNullableDecimal((SqlString) p);
+			}
+
+#endif
+
+			throw CreateInvalidCastException(p.GetType(), typeof(Decimal?));
+		}
+
+		#endregion
+
+		#region Double?
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(Boolean         p) { return p ? (Double?)1 : (Double?)0;                                                        }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(Byte            p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(Char            p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>DateTime</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(DateTime        p) { return (p - DateTime.MinValue).TotalDays;                                                  }
+		/// <summary>Converts the value from <c>DateTimeOffset</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(DateTimeOffset  p) { return (p - DateTimeOffset.MinValue).TotalDays;                                            }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(Decimal         p) { return checked((Double?)p);                                                                }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(Double          p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(Int16           p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(Int32           p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(Int64           p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>Double?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Double? ToNullableDouble(SByte           p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(Single          p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(String          p) { return p == null? (Double?)null : Double.Parse(p);                                         }
+		/// <summary>Converts the value from <c>TimeSpan</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(TimeSpan        p) { return p.TotalDays;                                                                        }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>Double?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Double? ToNullableDouble(UInt16          p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>Double?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Double? ToNullableDouble(UInt32          p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>Double?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Double? ToNullableDouble(UInt64          p) { return p;                                                                                  }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(Boolean?        p) { return p.HasValue && p.Value ? (Double?)1: (Double?)0;                                     }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(Byte?           p) { return p.HasValue ? p.Value : (Double?)null;                                               }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(Char?           p) { return p.HasValue ? p.Value : (Double?)null;                                               }
+		/// <summary>Converts the value from <c>DateTime?</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(DateTime?       p) { return p.HasValue ? (p.Value - DateTime.MinValue).TotalDays : (Double?)null;               }
+		/// <summary>Converts the value from <c>DateTimeOffset?</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(DateTimeOffset? p) { return p.HasValue ? (p.Value - DateTimeOffset.MinValue).TotalDays : (Double?)null;         }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(Decimal?        p) { return p.HasValue ? checked((Double?)p.Value) : (Double?)null;                             }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(Int16?          p) { return p.HasValue ? p.Value : (Double?)null;                                               }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(Int32?          p) { return p.HasValue ? p.Value : (Double?)null;                                               }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(Int64?          p) { return p.HasValue ? p.Value : (Double?)null;                                               }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>Double?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Double? ToNullableDouble(SByte?          p) { return p.HasValue ? p.Value : (Double?)null;                                               }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(Single?         p) { return p.HasValue ? p.Value : (Double?)null;                                               }
+		/// <summary>Converts the value from <c>TimeSpan?</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(TimeSpan?       p) { return p.HasValue ? p.Value.TotalDays : (Double?)null;                                     }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>Double?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Double? ToNullableDouble(UInt16?         p) { return p.HasValue ? p.Value : (Double?)null;                                               }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>Double?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Double? ToNullableDouble(UInt32?         p) { return p.HasValue ? p.Value : (Double?)null;                                               }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>Double?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Double? ToNullableDouble(UInt64?         p) { return p.HasValue ? p.Value : (Double?)null;                                               }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(Binary          p) { return p == null || p.Length == 0 ? (Double?)null : BitConverter.ToDouble(p.ToArray(), 0); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(Byte[]          p) { return p == null || p.Length == 0 ? (Double?)null : BitConverter.ToDouble(p, 0);           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(SqlBoolean      p) { return p.IsNull ? (Double?)null : ToDouble(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(SqlByte         p) { return p.IsNull ? (Double?)null : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlDateTime</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(SqlDateTime     p) { return p.IsNull ? (Double?)null : ToDouble(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(SqlDecimal      p) { return p.IsNull ? (Double?)null : ToDouble(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(SqlDouble       p) { return p.IsNull ? (Double?)null : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(SqlInt16        p) { return p.IsNull ? (Double?)null : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(SqlInt32        p) { return p.IsNull ? (Double?)null : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(SqlInt64        p) { return p.IsNull ? (Double?)null : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(SqlMoney        p) { return p.IsNull ? (Double?)null : ToDouble(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(SqlSingle       p) { return p.IsNull ? (Double?)null : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(SqlString       p) { return p.IsNull ? (Double?)null : ToDouble(p.Value);                                       }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>Double?</c> value.</summary>
+		public static Double? ToNullableDouble(object p)
+		{
+			if (p == null) return null;
+
+			if (p is Double?) return (Double?)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull   : return null;
+				case TypeCode.DateTime : return ToNullableDouble((DateTime)p);
+				case TypeCode.SByte    : return ToNullableDouble((SByte)   p);
+				case TypeCode.Int16    : return ToNullableDouble((Int16)   p);
+				case TypeCode.Int32    : return ToNullableDouble((Int32)   p);
+				case TypeCode.Int64    : return ToNullableDouble((Int64)   p);
+				case TypeCode.Byte     : return ToNullableDouble((Byte)    p);
+				case TypeCode.UInt16   : return ToNullableDouble((UInt16)  p);
+				case TypeCode.UInt32   : return ToNullableDouble((UInt32)  p);
+				case TypeCode.Char     : return ToNullableDouble((Char)    p);
+				case TypeCode.UInt64   : return ToNullableDouble((UInt64)  p);
+				case TypeCode.Single   : return ToNullableDouble((Single)  p);
+				case TypeCode.Double   : return ToNullableDouble((Double)  p);
+				case TypeCode.Decimal  : return ToNullableDouble((Decimal) p);
+				case TypeCode.String   : return ToNullableDouble((String)  p);
+				case TypeCode.Boolean  : return ToNullableDouble((Boolean) p);
+			}
+
+			// Simple Types
+			//
+			if (p is DateTimeOffset)  return ToNullableDouble((DateTimeOffset) p);
+			if (p is TimeSpan)        return ToNullableDouble((TimeSpan)       p);
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)        return ToNullableDouble((Boolean?)       p);
+				if (p is Byte?)           return ToNullableDouble((Byte?)          p);
+				if (p is Char?)           return ToNullableDouble((Char?)          p);
+				if (p is DateTime?)       return ToNullableDouble((DateTime?)      p);
+				if (p is DateTimeOffset?) return ToNullableDouble((DateTimeOffset?)p);
+				if (p is Decimal?)        return ToNullableDouble((Decimal?)       p);
+				if (p is Int16?)          return ToNullableDouble((Int16?)         p);
+				if (p is Int32?)          return ToNullableDouble((Int32?)         p);
+				if (p is Int64?)          return ToNullableDouble((Int64?)         p);
+				if (p is SByte?)          return ToNullableDouble((SByte?)         p);
+				if (p is Single?)         return ToNullableDouble((Single?)        p);
+				if (p is TimeSpan?)       return ToNullableDouble((TimeSpan?)      p);
+				if (p is UInt16?)         return ToNullableDouble((UInt16?)        p);
+				if (p is UInt32?)         return ToNullableDouble((UInt32?)        p);
+				if (p is UInt64?)         return ToNullableDouble((UInt64?)        p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)          return ToNullableDouble((Binary)         p);
+			if (p is Byte[])          return ToNullableDouble((Byte[])         p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean)      return ToNullableDouble((SqlBoolean)     p);
+				if (p is SqlByte)         return ToNullableDouble((SqlByte)        p);
+				if (p is SqlDateTime)     return ToNullableDouble((SqlDateTime)    p);
+				if (p is SqlDecimal)      return ToNullableDouble((SqlDecimal)     p);
+				if (p is SqlDouble)       return ToNullableDouble((SqlDouble)      p);
+				if (p is SqlInt16)        return ToNullableDouble((SqlInt16)       p);
+				if (p is SqlInt32)        return ToNullableDouble((SqlInt32)       p);
+				if (p is SqlInt64)        return ToNullableDouble((SqlInt64)       p);
+				if (p is SqlMoney)        return ToNullableDouble((SqlMoney)       p);
+				if (p is SqlSingle)       return ToNullableDouble((SqlSingle)      p);
+				if (p is SqlString)       return ToNullableDouble((SqlString)      p);
+			}
+
+#endif
+
+			throw CreateInvalidCastException(p.GetType(), typeof(Double?));
+		}
+
+		#endregion
+
+		#region Guid?
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Guid</c> to an equivalent <c>Guid?</c> value.</summary>
+		public static Guid? ToNullableGuid(Guid      p) { return p;                                               }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>Guid?</c> value.</summary>
+		public static Guid? ToNullableGuid(String    p) { return p == null ? (Guid?)null : new Guid(p);           }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>Guid?</c> value.</summary>
+		public static Guid? ToNullableGuid(Binary    p) { return p == null ? (Guid?)null : new Guid(p.ToArray()); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>Guid?</c> value.</summary>
+		public static Guid? ToNullableGuid(Byte[]    p) { return p == null ? (Guid?)null : new Guid(p);           }
+		/// <summary>Converts the value from <c>Type</c> to an equivalent <c>Guid?</c> value.</summary>
+		public static Guid? ToNullableGuid(Type      p) { return p == null ? (Guid?)null : p.GUID;                }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBinary</c> to an equivalent <c>Guid?</c> value.</summary>
+		public static Guid? ToNullableGuid(SqlBinary p) { return p.IsNull  ? (Guid?)null : p.ToSqlGuid().Value;   }
+		/// <summary>Converts the value from <c>SqlGuid</c> to an equivalent <c>Guid?</c> value.</summary>
+		public static Guid? ToNullableGuid(SqlGuid   p) { return p.IsNull ? (Guid?)null : p.Value;                }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>Guid?</c> value.</summary>
+		public static Guid? ToNullableGuid(SqlString p) { return p.IsNull  ? (Guid?)null : new Guid(p.Value);     }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>Guid?</c> value.</summary>
+		public static Guid? ToNullableGuid(object p)
+		{
+			if (p == null) return null;
+
+			if (p is Guid?) return (Guid?)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull : return null;
+				case TypeCode.String : return ToNullableGuid((String)p);
+			}
+
+			// Simple Types
+			//
+			if (p is Guid)      return ToNullableGuid((Guid)     p);
+
+			// Other Types
+			//
+			if (p is Binary)    return ToNullableGuid((Binary)   p);
+			if (p is Byte[])    return ToNullableGuid((Byte[])   p);
+			if (p is Type)      return ToNullableGuid((Type)     p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBinary) return ToNullableGuid((SqlBinary)p);
+				if (p is SqlGuid)   return ToNullableGuid((SqlGuid)  p);
+				if (p is SqlString) return ToNullableGuid((SqlString)p);
+			}
+
+#endif
+
+			throw CreateInvalidCastException(p.GetType(), typeof(Guid?));
+		}
+
+		#endregion
+
+		#region Int16?
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(Boolean    p) { return p ? (Int16?)1 : (Int16?)0;                                                        }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(Byte       p) { return p;                                                                                }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(Char       p) { return checked((Int16?)p);                                                               }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(Decimal    p) { return checked((Int16?)p);                                                               }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(Double     p) { return checked((Int16?)p);                                                               }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(Int16      p) { return p;                                                                                }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(Int32      p) { return checked((Int16?)p);                                                               }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(Int64      p) { return checked((Int16?)p);                                                               }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>Int16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int16? ToNullableInt16(SByte      p) { return p;                                                                                }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(Single     p) { return checked((Int16?)p);                                                               }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(String     p) { return p == null? (Int16?)null : Int16.Parse(p);                                         }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>Int16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int16? ToNullableInt16(UInt16     p) { return checked((Int16?)p);                                                               }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>Int16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int16? ToNullableInt16(UInt32     p) { return checked((Int16?)p);                                                               }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>Int16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int16? ToNullableInt16(UInt64     p) { return checked((Int16?)p);                                                               }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(Boolean?   p) { return p.HasValue && p.Value ? (Int16?)1: (Int16?)0;                                     }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(Byte?      p) { return p.HasValue ? p.Value : (Int16?)null;                                              }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(Char?      p) { return p.HasValue ? checked((Int16?)p.Value) : (Int16?)null;                             }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(Decimal?   p) { return p.HasValue ? checked((Int16?)p.Value) : (Int16?)null;                             }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(Double?    p) { return p.HasValue ? checked((Int16?)p.Value) : (Int16?)null;                             }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(Int32?     p) { return p.HasValue ? checked((Int16?)p.Value) : (Int16?)null;                             }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(Int64?     p) { return p.HasValue ? checked((Int16?)p.Value) : (Int16?)null;                             }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>Int16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int16? ToNullableInt16(SByte?     p) { return p.HasValue ? p.Value : (Int16?)null;                                              }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(Single?    p) { return p.HasValue ? checked((Int16?)p.Value) : (Int16?)null;                             }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>Int16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int16? ToNullableInt16(UInt16?    p) { return p.HasValue ? checked((Int16?)p.Value) : (Int16?)null;                             }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>Int16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int16? ToNullableInt16(UInt32?    p) { return p.HasValue ? checked((Int16?)p.Value) : (Int16?)null;                             }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>Int16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int16? ToNullableInt16(UInt64?    p) { return p.HasValue ? checked((Int16?)p.Value) : (Int16?)null;                             }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(Binary     p) { return p == null || p.Length == 0 ? (Int16?)null : BitConverter.ToInt16(p.ToArray(), 0); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(Byte[]     p) { return p == null || p.Length == 0 ? (Int16?)null : BitConverter.ToInt16(p, 0);           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(SqlBoolean p) { return p.IsNull ? (Int16?)null : ToInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(SqlByte    p) { return p.IsNull ? (Int16?)null : p.Value;                                                }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(SqlDecimal p) { return p.IsNull ? (Int16?)null : ToInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(SqlDouble  p) { return p.IsNull ? (Int16?)null : ToInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(SqlInt16   p) { return p.IsNull ? (Int16?)null : p.Value;                                                }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(SqlInt32   p) { return p.IsNull ? (Int16?)null : ToInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(SqlInt64   p) { return p.IsNull ? (Int16?)null : ToInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(SqlMoney   p) { return p.IsNull ? (Int16?)null : ToInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(SqlSingle  p) { return p.IsNull ? (Int16?)null : ToInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(SqlString  p) { return p.IsNull ? (Int16?)null : ToInt16(p.Value);                                       }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>Int16?</c> value.</summary>
+		public static Int16? ToNullableInt16(object p)
+		{
+			if (p == null) return null;
+
+			if (p is Int16?) return (Int16?)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull  : return null;
+				case TypeCode.SByte   : return ToNullableInt16((SByte)  p);
+				case TypeCode.Int16   : return ToNullableInt16((Int16)  p);
+				case TypeCode.Byte    : return ToNullableInt16((Byte)   p);
+				case TypeCode.Int32   : return ToNullableInt16((Int32)  p);
+				case TypeCode.Int64   : return ToNullableInt16((Int64)  p);
+				case TypeCode.UInt16  : return ToNullableInt16((UInt16) p);
+				case TypeCode.UInt32  : return ToNullableInt16((UInt32) p);
+				case TypeCode.UInt64  : return ToNullableInt16((UInt64) p);
+				case TypeCode.Single  : return ToNullableInt16((Single) p);
+				case TypeCode.Double  : return ToNullableInt16((Double) p);
+				case TypeCode.Decimal : return ToNullableInt16((Decimal)p);
+				case TypeCode.Char    : return ToNullableInt16((Char)   p);
+				case TypeCode.String  : return ToNullableInt16((String) p);
+				case TypeCode.Boolean : return ToNullableInt16((Boolean)p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToNullableInt16((Boolean?)  p);
+				if (p is Byte?)      return ToNullableInt16((Byte?)     p);
+				if (p is Char?)      return ToNullableInt16((Char?)     p);
+				if (p is Decimal?)   return ToNullableInt16((Decimal?)  p);
+				if (p is Double?)    return ToNullableInt16((Double?)   p);
+				if (p is Int32?)     return ToNullableInt16((Int32?)    p);
+				if (p is Int64?)     return ToNullableInt16((Int64?)    p);
+				if (p is SByte?)     return ToNullableInt16((SByte?)    p);
+				if (p is Single?)    return ToNullableInt16((Single?)   p);
+				if (p is UInt16?)    return ToNullableInt16((UInt16?)   p);
+				if (p is UInt32?)    return ToNullableInt16((UInt32?)   p);
+				if (p is UInt64?)    return ToNullableInt16((UInt64?)   p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToNullableInt16((Binary)    p);
+			if (p is Byte[])     return ToNullableInt16((Byte[])    p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToNullableInt16((SqlBoolean)p);
+				if (p is SqlByte)    return ToNullableInt16((SqlByte)   p);
+				if (p is SqlDecimal) return ToNullableInt16((SqlDecimal)p);
+				if (p is SqlDouble)  return ToNullableInt16((SqlDouble) p);
+				if (p is SqlInt16)   return ToNullableInt16((SqlInt16)  p);
+				if (p is SqlInt32)   return ToNullableInt16((SqlInt32)  p);
+				if (p is SqlInt64)   return ToNullableInt16((SqlInt64)  p);
+				if (p is SqlMoney)   return ToNullableInt16((SqlMoney)  p);
+				if (p is SqlSingle)  return ToNullableInt16((SqlSingle) p);
+				if (p is SqlString)  return ToNullableInt16((SqlString) p);
+			}
+
+#endif
+
+			throw CreateInvalidCastException(p.GetType(), typeof(Int16?));
+		}
+
+		#endregion
+
+		#region Int32?
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(Boolean    p) { return p ? (Int32?)1 : (Int32?)0;                                                        }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(Byte       p) { return p;                                                                                }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(Char       p) { return p;                                                                                }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(Decimal    p) { return checked((Int32?)p);                                                               }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(Double     p) { return checked((Int32?)p);                                                               }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(Int16      p) { return p;                                                                                }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(Int32      p) { return p;                                                                                }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(Int64      p) { return checked((Int32?)p);                                                               }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>Int32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int32? ToNullableInt32(SByte      p) { return p;                                                                                }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(Single     p) { return checked((Int32?)p);                                                               }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(String     p) { return p == null? (Int32?)null : Int32.Parse(p);                                         }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>Int32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int32? ToNullableInt32(UInt16     p) { return p;                                                                                }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>Int32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int32? ToNullableInt32(UInt32     p) { return checked((Int32?)p);                                                               }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>Int32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int32? ToNullableInt32(UInt64     p) { return checked((Int32?)p);                                                               }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(Boolean?   p) { return p.HasValue && p.Value ? (Int32?)1: (Int32?)0;                                     }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(Byte?      p) { return p.HasValue ? p.Value : (Int32?)null;                                              }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(Char?      p) { return p.HasValue ? p.Value : (Int32?)null;                                              }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(Decimal?   p) { return p.HasValue ? checked((Int32?)p.Value) : (Int32?)null;                             }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(Double?    p) { return p.HasValue ? checked((Int32?)p.Value) : (Int32?)null;                             }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(Int16?     p) { return p.HasValue ? p.Value : (Int32?)null;                                              }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(Int64?     p) { return p.HasValue ? checked((Int32?)p.Value) : (Int32?)null;                             }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>Int32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int32? ToNullableInt32(SByte?     p) { return p.HasValue ? p.Value : (Int32?)null;                                              }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(Single?    p) { return p.HasValue ? checked((Int32?)p.Value) : (Int32?)null;                             }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>Int32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int32? ToNullableInt32(UInt16?    p) { return p.HasValue ? p.Value : (Int32?)null;                                              }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>Int32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int32? ToNullableInt32(UInt32?    p) { return p.HasValue ? checked((Int32?)p.Value) : (Int32?)null;                             }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>Int32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int32? ToNullableInt32(UInt64?    p) { return p.HasValue ? checked((Int32?)p.Value) : (Int32?)null;                             }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(Binary     p) { return p == null || p.Length == 0 ? (Int32?)null : BitConverter.ToInt32(p.ToArray(), 0); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(Byte[]     p) { return p == null || p.Length == 0 ? (Int32?)null : BitConverter.ToInt32(p, 0);           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(SqlBoolean p) { return p.IsNull ? (Int32?)null : ToInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(SqlByte    p) { return p.IsNull ? (Int32?)null : p.Value;                                                }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(SqlDecimal p) { return p.IsNull ? (Int32?)null : ToInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(SqlDouble  p) { return p.IsNull ? (Int32?)null : ToInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(SqlInt16   p) { return p.IsNull ? (Int32?)null : p.Value;                                                }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(SqlInt32   p) { return p.IsNull ? (Int32?)null : p.Value;                                                }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(SqlInt64   p) { return p.IsNull ? (Int32?)null : ToInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(SqlMoney   p) { return p.IsNull ? (Int32?)null : ToInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(SqlSingle  p) { return p.IsNull ? (Int32?)null : ToInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(SqlString  p) { return p.IsNull ? (Int32?)null : ToInt32(p.Value);                                       }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>Int32?</c> value.</summary>
+		public static Int32? ToNullableInt32(object p)
+		{
+			if (p == null) return null;
+
+			if (p is Int32?) return (Int32?)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull  : return null;
+				case TypeCode.SByte   : return ToNullableInt32((SByte)  p);
+				case TypeCode.Int16   : return ToNullableInt32((Int16)  p);
+				case TypeCode.Int32   : return ToNullableInt32((Int32)  p);
+				case TypeCode.Byte    : return ToNullableInt32((Byte)   p);
+				case TypeCode.UInt16  : return ToNullableInt32((UInt16) p);
+				case TypeCode.Char    : return ToNullableInt32((Char)   p);
+				case TypeCode.Int64   : return ToNullableInt32((Int64)  p);
+				case TypeCode.UInt32  : return ToNullableInt32((UInt32) p);
+				case TypeCode.UInt64  : return ToNullableInt32((UInt64) p);
+				case TypeCode.Single  : return ToNullableInt32((Single) p);
+				case TypeCode.Double  : return ToNullableInt32((Double) p);
+				case TypeCode.Decimal : return ToNullableInt32((Decimal)p);
+				case TypeCode.String  : return ToNullableInt32((String) p);
+				case TypeCode.Boolean : return ToNullableInt32((Boolean)p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToNullableInt32((Boolean?)  p);
+				if (p is Byte?)      return ToNullableInt32((Byte?)     p);
+				if (p is Char?)      return ToNullableInt32((Char?)     p);
+				if (p is Decimal?)   return ToNullableInt32((Decimal?)  p);
+				if (p is Double?)    return ToNullableInt32((Double?)   p);
+				if (p is Int16?)     return ToNullableInt32((Int16?)    p);
+				if (p is Int64?)     return ToNullableInt32((Int64?)    p);
+				if (p is SByte?)     return ToNullableInt32((SByte?)    p);
+				if (p is Single?)    return ToNullableInt32((Single?)   p);
+				if (p is UInt16?)    return ToNullableInt32((UInt16?)   p);
+				if (p is UInt32?)    return ToNullableInt32((UInt32?)   p);
+				if (p is UInt64?)    return ToNullableInt32((UInt64?)   p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToNullableInt32((Binary)    p);
+			if (p is Byte[])     return ToNullableInt32((Byte[])    p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToNullableInt32((SqlBoolean)p);
+				if (p is SqlByte)    return ToNullableInt32((SqlByte)   p);
+				if (p is SqlDecimal) return ToNullableInt32((SqlDecimal)p);
+				if (p is SqlDouble)  return ToNullableInt32((SqlDouble) p);
+				if (p is SqlInt16)   return ToNullableInt32((SqlInt16)  p);
+				if (p is SqlInt32)   return ToNullableInt32((SqlInt32)  p);
+				if (p is SqlInt64)   return ToNullableInt32((SqlInt64)  p);
+				if (p is SqlMoney)   return ToNullableInt32((SqlMoney)  p);
+				if (p is SqlSingle)  return ToNullableInt32((SqlSingle) p);
+				if (p is SqlString)  return ToNullableInt32((SqlString) p);
+			}
+
+#endif
+
+			throw CreateInvalidCastException(p.GetType(), typeof(Int32?));
+		}
+
+		#endregion
+
+		#region Int64?
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(Boolean         p) { return p ? (Int64?)1 : (Int64?)0;                                                        }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(Byte            p) { return p;                                                                                }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(Char            p) { return p;                                                                                }
+		/// <summary>Converts the value from <c>DateTime</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(DateTime        p) { return (p - DateTime.MinValue).Ticks;                                                    }
+		/// <summary>Converts the value from <c>DateTimeOffset</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(DateTimeOffset  p) { return (p - DateTime.MinValue).Ticks;                                                    }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(Decimal         p) { return checked((Int64?)p);                                                               }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(Double          p) { return checked((Int64?)p);                                                               }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(Int16           p) { return p;                                                                                }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(Int32           p) { return p;                                                                                }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(Int64           p) { return p;                                                                                }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>Int64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int64? ToNullableInt64(SByte           p) { return p;                                                                                }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(Single          p) { return checked((Int64?)p);                                                               }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(String          p) { return p == null? (Int64?)null : Int64.Parse(p);                                         }
+		/// <summary>Converts the value from <c>TimeSpan</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(TimeSpan        p) { return p.Ticks;                                                                          }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>Int64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int64? ToNullableInt64(UInt16          p) { return p;                                                                                }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>Int64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int64? ToNullableInt64(UInt32          p) { return p;                                                                                }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>Int64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int64? ToNullableInt64(UInt64          p) { return checked((Int64?)p);                                                               }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(Boolean?        p) { return p.HasValue && p.Value ? (Int64?)1: (Int64?)0;                                     }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(Byte?           p) { return p.HasValue ? p.Value : (Int64?)null;                                              }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(Char?           p) { return p.HasValue ? p.Value : (Int64?)null;                                              }
+		/// <summary>Converts the value from <c>DateTime?</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(DateTime?       p) { return p.HasValue ? (p.Value - DateTime.MinValue).Ticks : 0;                             }
+		/// <summary>Converts the value from <c>DateTimeOffset?</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(DateTimeOffset? p) { return p.HasValue ? (p.Value - DateTime.MinValue).Ticks : 0;                             }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(Decimal?        p) { return p.HasValue ? checked((Int64?)p.Value) : (Int64?)null;                             }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(Double?         p) { return p.HasValue ? checked((Int64?)p.Value) : (Int64?)null;                             }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(Int16?          p) { return p.HasValue ? p.Value : (Int64?)null;                                              }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(Int32?          p) { return p.HasValue ? p.Value : (Int64?)null;                                              }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>Int64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int64? ToNullableInt64(SByte?          p) { return p.HasValue ? p.Value : (Int64?)null;                                              }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(Single?         p) { return p.HasValue ? checked((Int64?)p.Value) : (Int64?)null;                             }
+		/// <summary>Converts the value from <c>TimeSpan?</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(TimeSpan?       p) { return p.HasValue ? p.Value.Ticks : 0;                                                   }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>Int64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int64? ToNullableInt64(UInt16?         p) { return p.HasValue ? p.Value : (Int64?)null;                                              }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>Int64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int64? ToNullableInt64(UInt32?         p) { return p.HasValue ? p.Value : (Int64?)null;                                              }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>Int64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Int64? ToNullableInt64(UInt64?         p) { return p.HasValue ? checked((Int64?)p.Value) : (Int64?)null;                             }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(Binary          p) { return p == null || p.Length == 0 ? (Int64?)null : BitConverter.ToInt64(p.ToArray(), 0); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(Byte[]          p) { return p == null || p.Length == 0 ? (Int64?)null : BitConverter.ToInt64(p, 0);           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(SqlBoolean      p) { return p.IsNull ? (Int64?)null : ToInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(SqlByte         p) { return p.IsNull ? (Int64?)null : p.Value;                                                }
+		/// <summary>Converts the value from <c>SqlDateTime</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(SqlDateTime     p) { return p.IsNull ? (Int64?)null : ToInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(SqlDecimal      p) { return p.IsNull ? (Int64?)null : ToInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(SqlDouble       p) { return p.IsNull ? (Int64?)null : ToInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(SqlInt16        p) { return p.IsNull ? (Int64?)null : p.Value;                                                }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(SqlInt32        p) { return p.IsNull ? (Int64?)null : p.Value;                                                }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(SqlInt64        p) { return p.IsNull ? (Int64?)null : p.Value;                                                }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(SqlMoney        p) { return p.IsNull ? (Int64?)null : ToInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(SqlSingle       p) { return p.IsNull ? (Int64?)null : ToInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(SqlString       p) { return p.IsNull ? (Int64?)null : ToInt64(p.Value);                                       }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>Int64?</c> value.</summary>
+		public static Int64? ToNullableInt64(object p)
+		{
+			if (p == null) return null;
+
+			if (p is Int64?) return (Int64?)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull   : return null;
+				case TypeCode.DateTime : return ToNullableInt64((DateTime)p);
+				case TypeCode.SByte    : return ToNullableInt64((SByte)   p);
+				case TypeCode.Int16    : return ToNullableInt64((Int16)   p);
+				case TypeCode.Int32    : return ToNullableInt64((Int32)   p);
+				case TypeCode.Int64    : return ToNullableInt64((Int64)   p);
+				case TypeCode.Byte     : return ToNullableInt64((Byte)    p);
+				case TypeCode.UInt16   : return ToNullableInt64((UInt16)  p);
+				case TypeCode.UInt32   : return ToNullableInt64((UInt32)  p);
+				case TypeCode.Char     : return ToNullableInt64((Char)    p);
+				case TypeCode.UInt64   : return ToNullableInt64((UInt64)  p);
+				case TypeCode.Single   : return ToNullableInt64((Single)  p);
+				case TypeCode.Double   : return ToNullableInt64((Double)  p);
+				case TypeCode.Decimal  : return ToNullableInt64((Decimal) p);
+				case TypeCode.String   : return ToNullableInt64((String)  p);
+				case TypeCode.Boolean  : return ToNullableInt64((Boolean) p);
+			}
+
+			// Simple Types
+			//
+			if (p is DateTimeOffset)  return ToNullableInt64((DateTimeOffset) p);
+			if (p is TimeSpan)        return ToNullableInt64((TimeSpan)       p);
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)        return ToNullableInt64((Boolean?)       p);
+				if (p is Byte?)           return ToNullableInt64((Byte?)          p);
+				if (p is Char?)           return ToNullableInt64((Char?)          p);
+				if (p is DateTime?)       return ToNullableInt64((DateTime?)      p);
+				if (p is DateTimeOffset?) return ToNullableInt64((DateTimeOffset?)p);
+				if (p is Decimal?)        return ToNullableInt64((Decimal?)       p);
+				if (p is Double?)         return ToNullableInt64((Double?)        p);
+				if (p is Int16?)          return ToNullableInt64((Int16?)         p);
+				if (p is Int32?)          return ToNullableInt64((Int32?)         p);
+				if (p is SByte?)          return ToNullableInt64((SByte?)         p);
+				if (p is Single?)         return ToNullableInt64((Single?)        p);
+				if (p is TimeSpan?)       return ToNullableInt64((TimeSpan?)      p);
+				if (p is UInt16?)         return ToNullableInt64((UInt16?)        p);
+				if (p is UInt32?)         return ToNullableInt64((UInt32?)        p);
+				if (p is UInt64?)         return ToNullableInt64((UInt64?)        p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)          return ToNullableInt64((Binary)         p);
+			if (p is Byte[])          return ToNullableInt64((Byte[])         p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean)      return ToNullableInt64((SqlBoolean)     p);
+				if (p is SqlByte)         return ToNullableInt64((SqlByte)        p);
+				if (p is SqlDateTime)     return ToNullableInt64((SqlDateTime)    p);
+				if (p is SqlDecimal)      return ToNullableInt64((SqlDecimal)     p);
+				if (p is SqlDouble)       return ToNullableInt64((SqlDouble)      p);
+				if (p is SqlInt16)        return ToNullableInt64((SqlInt16)       p);
+				if (p is SqlInt32)        return ToNullableInt64((SqlInt32)       p);
+				if (p is SqlInt64)        return ToNullableInt64((SqlInt64)       p);
+				if (p is SqlMoney)        return ToNullableInt64((SqlMoney)       p);
+				if (p is SqlSingle)       return ToNullableInt64((SqlSingle)      p);
+				if (p is SqlString)       return ToNullableInt64((SqlString)      p);
+			}
+
+#endif
+
+			throw CreateInvalidCastException(p.GetType(), typeof(Int64?));
+		}
+
+		#endregion
+
+		#region SByte?
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(Boolean    p) { return p ? (SByte?)1 : (SByte?)0;                                                   }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(Byte       p) { return checked((SByte?)p);                                                          }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(Char       p) { return checked((SByte?)p);                                                          }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(Decimal    p) { return checked((SByte?)p);                                                          }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(Double     p) { return checked((SByte?)p);                                                          }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(Int16      p) { return checked((SByte?)p);                                                          }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(Int32      p) { return checked((SByte?)p);                                                          }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(Int64      p) { return checked((SByte?)p);                                                          }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(SByte      p) { return p;                                                                           }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(Single     p) { return checked((SByte?)p);                                                          }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(String     p) { return p == null? (SByte?)null : SByte.Parse(p);                                    }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(UInt16     p) { return checked((SByte?)p);                                                          }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(UInt32     p) { return checked((SByte?)p);                                                          }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(UInt64     p) { return checked((SByte?)p);                                                          }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(Boolean?   p) { return p.HasValue && p.Value ? (SByte?)1: (SByte?)0;                                }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(Byte?      p) { return p.HasValue ? checked((SByte?)p.Value) : (SByte?)null;                        }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(Char?      p) { return p.HasValue ? checked((SByte?)p.Value) : (SByte?)null;                        }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(Decimal?   p) { return p.HasValue ? checked((SByte?)p.Value) : (SByte?)null;                        }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(Double?    p) { return p.HasValue ? checked((SByte?)p.Value) : (SByte?)null;                        }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(Int16?     p) { return p.HasValue ? checked((SByte?)p.Value) : (SByte?)null;                        }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(Int32?     p) { return p.HasValue ? checked((SByte?)p.Value) : (SByte?)null;                        }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(Int64?     p) { return p.HasValue ? checked((SByte?)p.Value) : (SByte?)null;                        }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(Single?    p) { return p.HasValue ? checked((SByte?)p.Value) : (SByte?)null;                        }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(UInt16?    p) { return p.HasValue ? checked((SByte?)p.Value) : (SByte?)null;                        }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(UInt32?    p) { return p.HasValue ? checked((SByte?)p.Value) : (SByte?)null;                        }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(UInt64?    p) { return p.HasValue ? checked((SByte?)p.Value) : (SByte?)null;                        }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(Binary     p) { return p == null || p.Length == 0 ? (SByte?)null : checked((SByte?)p.ToArray()[0]); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(Byte[]     p) { return p == null || p.Length == 0 ? (SByte?)null : checked((SByte?)p[0]);           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(SqlBoolean p) { return p.IsNull ? (SByte?)null : ToSByte(p.Value);                                  }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(SqlByte    p) { return p.IsNull ? (SByte?)null : ToSByte(p.Value);                                  }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(SqlDecimal p) { return p.IsNull ? (SByte?)null : ToSByte(p.Value);                                  }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(SqlDouble  p) { return p.IsNull ? (SByte?)null : ToSByte(p.Value);                                  }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(SqlInt16   p) { return p.IsNull ? (SByte?)null : ToSByte(p.Value);                                  }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(SqlInt32   p) { return p.IsNull ? (SByte?)null : ToSByte(p.Value);                                  }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(SqlInt64   p) { return p.IsNull ? (SByte?)null : ToSByte(p.Value);                                  }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(SqlMoney   p) { return p.IsNull ? (SByte?)null : ToSByte(p.Value);                                  }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(SqlSingle  p) { return p.IsNull ? (SByte?)null : ToSByte(p.Value);                                  }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(SqlString  p) { return p.IsNull ? (SByte?)null : ToSByte(p.Value);                                  }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>SByte?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SByte? ToNullableSByte(object p)
+		{
+			if (p == null) return null;
+
+			if (p is SByte?) return (SByte?)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull  : return null;
+				case TypeCode.SByte   : return ToNullableSByte((SByte)  p);
+				case TypeCode.Int16   : return ToNullableSByte((Int16)  p);
+				case TypeCode.Int32   : return ToNullableSByte((Int32)  p);
+				case TypeCode.Int64   : return ToNullableSByte((Int64)  p);
+				case TypeCode.Byte    : return ToNullableSByte((Byte)   p);
+				case TypeCode.UInt16  : return ToNullableSByte((UInt16) p);
+				case TypeCode.UInt32  : return ToNullableSByte((UInt32) p);
+				case TypeCode.UInt64  : return ToNullableSByte((UInt64) p);
+				case TypeCode.Single  : return ToNullableSByte((Single) p);
+				case TypeCode.Double  : return ToNullableSByte((Double) p);
+				case TypeCode.Decimal : return ToNullableSByte((Decimal)p);
+				case TypeCode.Char    : return ToNullableSByte((Char)   p);
+				case TypeCode.String  : return ToNullableSByte((String) p);
+				case TypeCode.Boolean : return ToNullableSByte((Boolean)p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToNullableSByte((Boolean?)  p);
+				if (p is Byte?)      return ToNullableSByte((Byte?)     p);
+				if (p is Char?)      return ToNullableSByte((Char?)     p);
+				if (p is Decimal?)   return ToNullableSByte((Decimal?)  p);
+				if (p is Double?)    return ToNullableSByte((Double?)   p);
+				if (p is Int16?)     return ToNullableSByte((Int16?)    p);
+				if (p is Int32?)     return ToNullableSByte((Int32?)    p);
+				if (p is Int64?)     return ToNullableSByte((Int64?)    p);
+				if (p is Single?)    return ToNullableSByte((Single?)   p);
+				if (p is UInt16?)    return ToNullableSByte((UInt16?)   p);
+				if (p is UInt32?)    return ToNullableSByte((UInt32?)   p);
+				if (p is UInt64?)    return ToNullableSByte((UInt64?)   p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToNullableSByte((Binary)    p);
+			if (p is Byte[])     return ToNullableSByte((Byte[])    p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToNullableSByte((SqlBoolean)p);
+				if (p is SqlByte)    return ToNullableSByte((SqlByte)   p);
+				if (p is SqlDecimal) return ToNullableSByte((SqlDecimal)p);
+				if (p is SqlDouble)  return ToNullableSByte((SqlDouble) p);
+				if (p is SqlInt16)   return ToNullableSByte((SqlInt16)  p);
+				if (p is SqlInt32)   return ToNullableSByte((SqlInt32)  p);
+				if (p is SqlInt64)   return ToNullableSByte((SqlInt64)  p);
+				if (p is SqlMoney)   return ToNullableSByte((SqlMoney)  p);
+				if (p is SqlSingle)  return ToNullableSByte((SqlSingle) p);
+				if (p is SqlString)  return ToNullableSByte((SqlString) p);
+			}
+
+#endif
+
+			throw CreateInvalidCastException(p.GetType(), typeof(SByte?));
+		}
+
+		#endregion
+
+		#region Single?
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(Boolean    p) { return p ? (Single?)1 : (Single?)0;                                                        }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(Byte       p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(Char       p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(Decimal    p) { return checked((Single?)p);                                                                }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(Double     p) { return checked((Single?)p);                                                                }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(Int16      p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(Int32      p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(Int64      p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>Single?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Single? ToNullableSingle(SByte      p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(Single     p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(String     p) { return p == null? (Single?)null : Single.Parse(p);                                         }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>Single?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Single? ToNullableSingle(UInt16     p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>Single?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Single? ToNullableSingle(UInt32     p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>Single?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Single? ToNullableSingle(UInt64     p) { return p;                                                                                  }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(Boolean?   p) { return p.HasValue && p.Value ? (Single?)1: (Single?)0;                                     }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(Byte?      p) { return p.HasValue ? p.Value : (Single?)null;                                               }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(Char?      p) { return p.HasValue ? p.Value : (Single?)null;                                               }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(Decimal?   p) { return p.HasValue ? checked((Single?)p.Value) : (Single?)null;                             }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(Double?    p) { return p.HasValue ? checked((Single?)p.Value) : (Single?)null;                             }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(Int16?     p) { return p.HasValue ? p.Value : (Single?)null;                                               }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(Int32?     p) { return p.HasValue ? p.Value : (Single?)null;                                               }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(Int64?     p) { return p.HasValue ? p.Value : (Single?)null;                                               }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>Single?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Single? ToNullableSingle(SByte?     p) { return p.HasValue ? p.Value : (Single?)null;                                               }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>Single?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Single? ToNullableSingle(UInt16?    p) { return p.HasValue ? p.Value : (Single?)null;                                               }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>Single?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Single? ToNullableSingle(UInt32?    p) { return p.HasValue ? p.Value : (Single?)null;                                               }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>Single?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Single? ToNullableSingle(UInt64?    p) { return p.HasValue ? p.Value : (Single?)null;                                               }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(Binary     p) { return p == null || p.Length == 0 ? (Single?)null : BitConverter.ToSingle(p.ToArray(), 0); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(Byte[]     p) { return p == null || p.Length == 0 ? (Single?)null : BitConverter.ToSingle(p, 0);           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(SqlBoolean p) { return p.IsNull ? (Single?)null : ToSingle(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(SqlByte    p) { return p.IsNull ? (Single?)null : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(SqlDecimal p) { return p.IsNull ? (Single?)null : ToSingle(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(SqlDouble  p) { return p.IsNull ? (Single?)null : ToSingle(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(SqlInt16   p) { return p.IsNull ? (Single?)null : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(SqlInt32   p) { return p.IsNull ? (Single?)null : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(SqlInt64   p) { return p.IsNull ? (Single?)null : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(SqlMoney   p) { return p.IsNull ? (Single?)null : ToSingle(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(SqlSingle  p) { return p.IsNull ? (Single?)null : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(SqlString  p) { return p.IsNull ? (Single?)null : ToSingle(p.Value);                                       }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>Single?</c> value.</summary>
+		public static Single? ToNullableSingle(object p)
+		{
+			if (p == null) return null;
+
+			if (p is Single?) return (Single?)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull  : return null;
+				case TypeCode.SByte   : return ToNullableSingle((SByte)  p);
+				case TypeCode.Int16   : return ToNullableSingle((Int16)  p);
+				case TypeCode.Int32   : return ToNullableSingle((Int32)  p);
+				case TypeCode.Int64   : return ToNullableSingle((Int64)  p);
+				case TypeCode.Byte    : return ToNullableSingle((Byte)   p);
+				case TypeCode.UInt16  : return ToNullableSingle((UInt16) p);
+				case TypeCode.UInt32  : return ToNullableSingle((UInt32) p);
+				case TypeCode.Char    : return ToNullableSingle((Char)   p);
+				case TypeCode.UInt64  : return ToNullableSingle((UInt64) p);
+				case TypeCode.Single  : return ToNullableSingle((Single) p);
+				case TypeCode.Double  : return ToNullableSingle((Double) p);
+				case TypeCode.Decimal : return ToNullableSingle((Decimal)p);
+				case TypeCode.String  : return ToNullableSingle((String) p);
+				case TypeCode.Boolean : return ToNullableSingle((Boolean)p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToNullableSingle((Boolean?)  p);
+				if (p is Byte?)      return ToNullableSingle((Byte?)     p);
+				if (p is Char?)      return ToNullableSingle((Char?)     p);
+				if (p is Decimal?)   return ToNullableSingle((Decimal?)  p);
+				if (p is Double?)    return ToNullableSingle((Double?)   p);
+				if (p is Int16?)     return ToNullableSingle((Int16?)    p);
+				if (p is Int32?)     return ToNullableSingle((Int32?)    p);
+				if (p is Int64?)     return ToNullableSingle((Int64?)    p);
+				if (p is SByte?)     return ToNullableSingle((SByte?)    p);
+				if (p is UInt16?)    return ToNullableSingle((UInt16?)   p);
+				if (p is UInt32?)    return ToNullableSingle((UInt32?)   p);
+				if (p is UInt64?)    return ToNullableSingle((UInt64?)   p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToNullableSingle((Binary)    p);
+			if (p is Byte[])     return ToNullableSingle((Byte[])    p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToNullableSingle((SqlBoolean)p);
+				if (p is SqlByte)    return ToNullableSingle((SqlByte)   p);
+				if (p is SqlDecimal) return ToNullableSingle((SqlDecimal)p);
+				if (p is SqlDouble)  return ToNullableSingle((SqlDouble) p);
+				if (p is SqlInt16)   return ToNullableSingle((SqlInt16)  p);
+				if (p is SqlInt32)   return ToNullableSingle((SqlInt32)  p);
+				if (p is SqlInt64)   return ToNullableSingle((SqlInt64)  p);
+				if (p is SqlMoney)   return ToNullableSingle((SqlMoney)  p);
+				if (p is SqlSingle)  return ToNullableSingle((SqlSingle) p);
+				if (p is SqlString)  return ToNullableSingle((SqlString) p);
+			}
+
+#endif
+
+			throw CreateInvalidCastException(p.GetType(), typeof(Single?));
+		}
+
+		#endregion
+
+		#region TimeSpan?
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>DateTime</c> to an equivalent <c>TimeSpan?</c> value.</summary>
+		public static TimeSpan? ToNullableTimeSpan(DateTime        p) { return p - DateTime.MinValue;                                                                  }
+		/// <summary>Converts the value from <c>DateTimeOffset</c> to an equivalent <c>TimeSpan?</c> value.</summary>
+		public static TimeSpan? ToNullableTimeSpan(DateTimeOffset  p) { return p - DateTimeOffset.MinValue;                                                            }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>TimeSpan?</c> value.</summary>
+		public static TimeSpan? ToNullableTimeSpan(Double          p) { return TimeSpan.FromDays (p);                                                                  }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>TimeSpan?</c> value.</summary>
+		public static TimeSpan? ToNullableTimeSpan(Int64           p) { return TimeSpan.FromTicks(p);                                                                  }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>TimeSpan?</c> value.</summary>
+		public static TimeSpan? ToNullableTimeSpan(String          p) { return p == null? (TimeSpan?)null : TimeSpan.Parse(p);                                         }
+		/// <summary>Converts the value from <c>TimeSpan</c> to an equivalent <c>TimeSpan?</c> value.</summary>
+		public static TimeSpan? ToNullableTimeSpan(TimeSpan        p) { return p;                                                                                      }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>DateTime?</c> to an equivalent <c>TimeSpan?</c> value.</summary>
+		public static TimeSpan? ToNullableTimeSpan(DateTime?       p) { return p.HasValue ? p.Value - DateTime.MinValue       : (TimeSpan?)null;                       }
+		/// <summary>Converts the value from <c>DateTimeOffset?</c> to an equivalent <c>TimeSpan?</c> value.</summary>
+		public static TimeSpan? ToNullableTimeSpan(DateTimeOffset? p) { return p.HasValue ? p.Value - DateTimeOffset.MinValue : (TimeSpan?)null;                       }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>TimeSpan?</c> value.</summary>
+		public static TimeSpan? ToNullableTimeSpan(Double?         p) { return p.HasValue ? TimeSpan.FromDays (p.Value)            : (TimeSpan?)null;                  }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>TimeSpan?</c> value.</summary>
+		public static TimeSpan? ToNullableTimeSpan(Int64?          p) { return p.HasValue ? TimeSpan.FromTicks(p.Value)            : (TimeSpan?)null;                  }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>TimeSpan?</c> value.</summary>
+		public static TimeSpan? ToNullableTimeSpan(Binary          p) { return p == null || p.Length == 0? (TimeSpan?)null : TimeSpan.FromTicks(ToInt64(p.ToArray())); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>TimeSpan?</c> value.</summary>
+		public static TimeSpan? ToNullableTimeSpan(Byte[]          p) { return p == null || p.Length == 0? (TimeSpan?)null : TimeSpan.FromTicks(ToInt64(p));           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlDateTime</c> to an equivalent <c>TimeSpan?</c> value.</summary>
+		public static TimeSpan? ToNullableTimeSpan(SqlDateTime     p) { return p.IsNull   ? (TimeSpan?)null : p.Value - DateTime.MinValue;                             }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>TimeSpan?</c> value.</summary>
+		public static TimeSpan? ToNullableTimeSpan(SqlDouble       p) { return p.IsNull   ? (TimeSpan?)null : TimeSpan.FromDays(p.Value);                              }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>TimeSpan?</c> value.</summary>
+		public static TimeSpan? ToNullableTimeSpan(SqlInt64        p) { return p.IsNull   ? (TimeSpan?)null : TimeSpan.FromTicks(p.Value);                             }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>TimeSpan?</c> value.</summary>
+		public static TimeSpan? ToNullableTimeSpan(SqlString       p) { return p.IsNull   ? (TimeSpan?)null : TimeSpan.Parse(p.Value);                                 }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>TimeSpan?</c> value.</summary>
+		public static TimeSpan? ToNullableTimeSpan(object p)
+		{
+			if (p == null) return null;
+
+			if (p is TimeSpan?) return (TimeSpan?)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull    : return null;
+				case TypeCode.DateTime  : return ToNullableTimeSpan((DateTime) p);
+				case TypeCode.Int64     : return ToNullableTimeSpan((Int64)    p);
+				case TypeCode.Double    : return ToNullableTimeSpan((Double)   p);
+				case TypeCode.String    : return ToNullableTimeSpan((String)   p);
+			}
+
+			// Simple Types
+			//
+			if (p is DateTimeOffset)  return ToNullableTimeSpan((DateTimeOffset) p);
+			if (p is TimeSpan)        return ToNullableTimeSpan((TimeSpan)       p);
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is DateTime?)       return ToNullableTimeSpan((DateTime?)      p);
+				if (p is DateTimeOffset?) return ToNullableTimeSpan((DateTimeOffset?)p);
+				if (p is Double?)         return ToNullableTimeSpan((Double?)        p);
+				if (p is Int64?)          return ToNullableTimeSpan((Int64?)         p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)          return ToNullableTimeSpan((Binary)         p);
+			if (p is Byte[])          return ToNullableTimeSpan((Byte[])         p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlDateTime)     return ToNullableTimeSpan((SqlDateTime)    p);
+				if (p is SqlDouble)       return ToNullableTimeSpan((SqlDouble)      p);
+				if (p is SqlInt64)        return ToNullableTimeSpan((SqlInt64)       p);
+				if (p is SqlString)       return ToNullableTimeSpan((SqlString)      p);
+			}
+
+#endif
+
+			throw CreateInvalidCastException(p.GetType(), typeof(TimeSpan?));
+		}
+
+		#endregion
+
+		#region UInt16?
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(Boolean    p) { return p ? (UInt16?)1 : (UInt16?)0;                                                        }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(Byte       p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(Char       p) { return checked((UInt16?)p);                                                                }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(Decimal    p) { return checked((UInt16?)p);                                                                }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(Double     p) { return checked((UInt16?)p);                                                                }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(Int16      p) { return checked((UInt16?)p);                                                                }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(Int32      p) { return checked((UInt16?)p);                                                                }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(Int64      p) { return checked((UInt16?)p);                                                                }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(SByte      p) { return checked((UInt16?)p);                                                                }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(Single     p) { return checked((UInt16?)p);                                                                }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(String     p) { return p == null? (UInt16?)null : UInt16.Parse(p);                                         }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(UInt16     p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(UInt32     p) { return checked((UInt16?)p);                                                                }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(UInt64     p) { return checked((UInt16?)p);                                                                }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(Boolean?   p) { return p.HasValue && p.Value ? (UInt16?)1: (UInt16?)0;                                     }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(Byte?      p) { return p.HasValue ? p.Value : (UInt16?)null;                                               }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(Char?      p) { return p.HasValue ? checked((UInt16?)p.Value) : (UInt16?)null;                             }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(Decimal?   p) { return p.HasValue ? checked((UInt16?)p.Value) : (UInt16?)null;                             }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(Double?    p) { return p.HasValue ? checked((UInt16?)p.Value) : (UInt16?)null;                             }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(Int16?     p) { return p.HasValue ? checked((UInt16?)p.Value) : (UInt16?)null;                             }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(Int32?     p) { return p.HasValue ? checked((UInt16?)p.Value) : (UInt16?)null;                             }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(Int64?     p) { return p.HasValue ? checked((UInt16?)p.Value) : (UInt16?)null;                             }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(SByte?     p) { return p.HasValue ? checked((UInt16?)p.Value) : (UInt16?)null;                             }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(Single?    p) { return p.HasValue ? checked((UInt16?)p.Value) : (UInt16?)null;                             }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(UInt32?    p) { return p.HasValue ? checked((UInt16?)p.Value) : (UInt16?)null;                             }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(UInt64?    p) { return p.HasValue ? checked((UInt16?)p.Value) : (UInt16?)null;                             }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(Binary     p) { return p == null || p.Length == 0 ? (UInt16?)null : BitConverter.ToUInt16(p.ToArray(), 0); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(Byte[]     p) { return p == null || p.Length == 0 ? (UInt16?)null : BitConverter.ToUInt16(p, 0);           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(SqlBoolean p) { return p.IsNull ? (UInt16?)null : ToUInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(SqlByte    p) { return p.IsNull ? (UInt16?)null : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(SqlDecimal p) { return p.IsNull ? (UInt16?)null : ToUInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(SqlDouble  p) { return p.IsNull ? (UInt16?)null : ToUInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(SqlInt16   p) { return p.IsNull ? (UInt16?)null : ToUInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(SqlInt32   p) { return p.IsNull ? (UInt16?)null : ToUInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(SqlInt64   p) { return p.IsNull ? (UInt16?)null : ToUInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(SqlMoney   p) { return p.IsNull ? (UInt16?)null : ToUInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(SqlSingle  p) { return p.IsNull ? (UInt16?)null : ToUInt16(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(SqlString  p) { return p.IsNull ? (UInt16?)null : ToUInt16(p.Value);                                       }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>UInt16?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt16? ToNullableUInt16(object p)
+		{
+			if (p == null) return null;
+
+			if (p is UInt16?) return (UInt16?)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull  : return null;
+				case TypeCode.UInt16  : return ToNullableUInt16((UInt16) p);
+				case TypeCode.Byte    : return ToNullableUInt16((Byte)   p);
+				case TypeCode.SByte   : return ToNullableUInt16((SByte)  p);
+				case TypeCode.Int16   : return ToNullableUInt16((Int16)  p);
+				case TypeCode.Int32   : return ToNullableUInt16((Int32)  p);
+				case TypeCode.Int64   : return ToNullableUInt16((Int64)  p);
+				case TypeCode.UInt32  : return ToNullableUInt16((UInt32) p);
+				case TypeCode.UInt64  : return ToNullableUInt16((UInt64) p);
+				case TypeCode.Single  : return ToNullableUInt16((Single) p);
+				case TypeCode.Double  : return ToNullableUInt16((Double) p);
+				case TypeCode.Decimal : return ToNullableUInt16((Decimal)p);
+				case TypeCode.Char    : return ToNullableUInt16((Char)   p);
+				case TypeCode.String  : return ToNullableUInt16((String) p);
+				case TypeCode.Boolean : return ToNullableUInt16((Boolean)p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToNullableUInt16((Boolean?)  p);
+				if (p is Byte?)      return ToNullableUInt16((Byte?)     p);
+				if (p is Char?)      return ToNullableUInt16((Char?)     p);
+				if (p is Decimal?)   return ToNullableUInt16((Decimal?)  p);
+				if (p is Double?)    return ToNullableUInt16((Double?)   p);
+				if (p is Int16?)     return ToNullableUInt16((Int16?)    p);
+				if (p is Int32?)     return ToNullableUInt16((Int32?)    p);
+				if (p is Int64?)     return ToNullableUInt16((Int64?)    p);
+				if (p is SByte?)     return ToNullableUInt16((SByte?)    p);
+				if (p is Single?)    return ToNullableUInt16((Single?)   p);
+				if (p is UInt32?)    return ToNullableUInt16((UInt32?)   p);
+				if (p is UInt64?)    return ToNullableUInt16((UInt64?)   p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToNullableUInt16((Binary)    p);
+			if (p is Byte[])     return ToNullableUInt16((Byte[])    p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToNullableUInt16((SqlBoolean)p);
+				if (p is SqlByte)    return ToNullableUInt16((SqlByte)   p);
+				if (p is SqlDecimal) return ToNullableUInt16((SqlDecimal)p);
+				if (p is SqlDouble)  return ToNullableUInt16((SqlDouble) p);
+				if (p is SqlInt16)   return ToNullableUInt16((SqlInt16)  p);
+				if (p is SqlInt32)   return ToNullableUInt16((SqlInt32)  p);
+				if (p is SqlInt64)   return ToNullableUInt16((SqlInt64)  p);
+				if (p is SqlMoney)   return ToNullableUInt16((SqlMoney)  p);
+				if (p is SqlSingle)  return ToNullableUInt16((SqlSingle) p);
+				if (p is SqlString)  return ToNullableUInt16((SqlString) p);
+			}
+
+#endif
+
+			throw CreateInvalidCastException(p.GetType(), typeof(UInt16?));
+		}
+
+		#endregion
+
+		#region UInt32?
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(Boolean    p) { return p ? (UInt32?)1 : (UInt32?)0;                                                        }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(Byte       p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(Char       p) { return checked((UInt32?)p);                                                                }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(Decimal    p) { return checked((UInt32?)p);                                                                }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(Double     p) { return checked((UInt32?)p);                                                                }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(Int16      p) { return checked((UInt32?)p);                                                                }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(Int32      p) { return checked((UInt32?)p);                                                                }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(Int64      p) { return checked((UInt32?)p);                                                                }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(SByte      p) { return checked((UInt32?)p);                                                                }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(Single     p) { return checked((UInt32?)p);                                                                }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(String     p) { return p == null? (UInt32?)null : UInt32.Parse(p);                                         }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(UInt16     p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(UInt32     p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(UInt64     p) { return checked((UInt32?)p);                                                                }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(Boolean?   p) { return p.HasValue && p.Value ? (UInt32?)1: (UInt32?)0;                                     }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(Byte?      p) { return p.HasValue ? p.Value : (UInt32?)null;                                               }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(Char?      p) { return p.HasValue ? checked((UInt32?)p.Value) : (UInt32?)null;                             }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(Decimal?   p) { return p.HasValue ? checked((UInt32?)p.Value) : (UInt32?)null;                             }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(Double?    p) { return p.HasValue ? checked((UInt32?)p.Value) : (UInt32?)null;                             }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(Int16?     p) { return p.HasValue ? checked((UInt32?)p.Value) : (UInt32?)null;                             }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(Int32?     p) { return p.HasValue ? checked((UInt32?)p.Value) : (UInt32?)null;                             }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(Int64?     p) { return p.HasValue ? checked((UInt32?)p.Value) : (UInt32?)null;                             }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(SByte?     p) { return p.HasValue ? checked((UInt32?)p.Value) : (UInt32?)null;                             }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(Single?    p) { return p.HasValue ? checked((UInt32?)p.Value) : (UInt32?)null;                             }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(UInt16?    p) { return p.HasValue ? p.Value : (UInt32?)null;                                               }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(UInt64?    p) { return p.HasValue ? checked((UInt32?)p.Value) : (UInt32?)null;                             }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(Binary     p) { return p == null || p.Length == 0 ? (UInt32?)null : BitConverter.ToUInt32(p.ToArray(), 0); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(Byte[]     p) { return p == null || p.Length == 0 ? (UInt32?)null : BitConverter.ToUInt32(p, 0);           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(SqlBoolean p) { return p.IsNull ? (UInt32?)null : ToUInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(SqlByte    p) { return p.IsNull ? (UInt32?)null : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(SqlDecimal p) { return p.IsNull ? (UInt32?)null : ToUInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(SqlDouble  p) { return p.IsNull ? (UInt32?)null : ToUInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(SqlInt16   p) { return p.IsNull ? (UInt32?)null : ToUInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(SqlInt32   p) { return p.IsNull ? (UInt32?)null : ToUInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(SqlInt64   p) { return p.IsNull ? (UInt32?)null : ToUInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(SqlMoney   p) { return p.IsNull ? (UInt32?)null : ToUInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(SqlSingle  p) { return p.IsNull ? (UInt32?)null : ToUInt32(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(SqlString  p) { return p.IsNull ? (UInt32?)null : ToUInt32(p.Value);                                       }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>UInt32?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt32? ToNullableUInt32(object p)
+		{
+			if (p == null) return null;
+
+			if (p is UInt32?) return (UInt32?)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull  : return null;
+				case TypeCode.Byte    : return ToNullableUInt32((Byte)   p);
+				case TypeCode.UInt16  : return ToNullableUInt32((UInt16) p);
+				case TypeCode.UInt32  : return ToNullableUInt32((UInt32) p);
+				case TypeCode.SByte   : return ToNullableUInt32((SByte)  p);
+				case TypeCode.Int16   : return ToNullableUInt32((Int16)  p);
+				case TypeCode.Int32   : return ToNullableUInt32((Int32)  p);
+				case TypeCode.Int64   : return ToNullableUInt32((Int64)  p);
+				case TypeCode.UInt64  : return ToNullableUInt32((UInt64) p);
+				case TypeCode.Single  : return ToNullableUInt32((Single) p);
+				case TypeCode.Double  : return ToNullableUInt32((Double) p);
+				case TypeCode.Decimal : return ToNullableUInt32((Decimal)p);
+				case TypeCode.Char    : return ToNullableUInt32((Char)   p);
+				case TypeCode.String  : return ToNullableUInt32((String) p);
+				case TypeCode.Boolean : return ToNullableUInt32((Boolean)p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToNullableUInt32((Boolean?)  p);
+				if (p is Byte?)      return ToNullableUInt32((Byte?)     p);
+				if (p is Char?)      return ToNullableUInt32((Char?)     p);
+				if (p is Decimal?)   return ToNullableUInt32((Decimal?)  p);
+				if (p is Double?)    return ToNullableUInt32((Double?)   p);
+				if (p is Int16?)     return ToNullableUInt32((Int16?)    p);
+				if (p is Int32?)     return ToNullableUInt32((Int32?)    p);
+				if (p is Int64?)     return ToNullableUInt32((Int64?)    p);
+				if (p is SByte?)     return ToNullableUInt32((SByte?)    p);
+				if (p is Single?)    return ToNullableUInt32((Single?)   p);
+				if (p is UInt16?)    return ToNullableUInt32((UInt16?)   p);
+				if (p is UInt64?)    return ToNullableUInt32((UInt64?)   p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToNullableUInt32((Binary)    p);
+			if (p is Byte[])     return ToNullableUInt32((Byte[])    p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToNullableUInt32((SqlBoolean)p);
+				if (p is SqlByte)    return ToNullableUInt32((SqlByte)   p);
+				if (p is SqlDecimal) return ToNullableUInt32((SqlDecimal)p);
+				if (p is SqlDouble)  return ToNullableUInt32((SqlDouble) p);
+				if (p is SqlInt16)   return ToNullableUInt32((SqlInt16)  p);
+				if (p is SqlInt32)   return ToNullableUInt32((SqlInt32)  p);
+				if (p is SqlInt64)   return ToNullableUInt32((SqlInt64)  p);
+				if (p is SqlMoney)   return ToNullableUInt32((SqlMoney)  p);
+				if (p is SqlSingle)  return ToNullableUInt32((SqlSingle) p);
+				if (p is SqlString)  return ToNullableUInt32((SqlString) p);
+			}
+
+#endif
+
+			throw CreateInvalidCastException(p.GetType(), typeof(UInt32?));
+		}
+
+		#endregion
+
+		#region UInt64?
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(Boolean    p) { return p ? (UInt64?)1 : (UInt64?)0;                                                        }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(Byte       p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(Char       p) { return checked((UInt64?)p);                                                                }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(Decimal    p) { return checked((UInt64?)p);                                                                }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(Double     p) { return checked((UInt64?)p);                                                                }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(Int16      p) { return checked((UInt64?)p);                                                                }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(Int32      p) { return checked((UInt64?)p);                                                                }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(Int64      p) { return checked((UInt64?)p);                                                                }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(SByte      p) { return checked((UInt64?)p);                                                                }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(Single     p) { return checked((UInt64?)p);                                                                }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(String     p) { return p == null? (UInt64?)null : UInt64.Parse(p);                                         }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(UInt16     p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(UInt32     p) { return p;                                                                                  }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(UInt64     p) { return p;                                                                                  }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(Boolean?   p) { return p.HasValue && p.Value ? (UInt64?)1: (UInt64?)0;                                     }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(Byte?      p) { return p.HasValue ? p.Value : (UInt64?)null;                                               }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(Char?      p) { return p.HasValue ? checked((UInt64?)p.Value) : (UInt64?)null;                             }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(Decimal?   p) { return p.HasValue ? checked((UInt64?)p.Value) : (UInt64?)null;                             }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(Double?    p) { return p.HasValue ? checked((UInt64?)p.Value) : (UInt64?)null;                             }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(Int16?     p) { return p.HasValue ? checked((UInt64?)p.Value) : (UInt64?)null;                             }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(Int32?     p) { return p.HasValue ? checked((UInt64?)p.Value) : (UInt64?)null;                             }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(Int64?     p) { return p.HasValue ? checked((UInt64?)p.Value) : (UInt64?)null;                             }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(SByte?     p) { return p.HasValue ? checked((UInt64?)p.Value) : (UInt64?)null;                             }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(Single?    p) { return p.HasValue ? checked((UInt64?)p.Value) : (UInt64?)null;                             }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(UInt16?    p) { return p.HasValue ? p.Value : (UInt64?)null;                                               }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(UInt32?    p) { return p.HasValue ? p.Value : (UInt64?)null;                                               }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(Binary     p) { return p == null || p.Length == 0 ? (UInt64?)null : BitConverter.ToUInt64(p.ToArray(), 0); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(Byte[]     p) { return p == null || p.Length == 0 ? (UInt64?)null : BitConverter.ToUInt64(p, 0);           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(SqlBoolean p) { return p.IsNull ? (UInt64?)null : ToUInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(SqlByte    p) { return p.IsNull ? (UInt64?)null : p.Value;                                                 }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(SqlDecimal p) { return p.IsNull ? (UInt64?)null : ToUInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(SqlDouble  p) { return p.IsNull ? (UInt64?)null : ToUInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(SqlInt16   p) { return p.IsNull ? (UInt64?)null : ToUInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(SqlInt32   p) { return p.IsNull ? (UInt64?)null : ToUInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(SqlInt64   p) { return p.IsNull ? (UInt64?)null : ToUInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(SqlMoney   p) { return p.IsNull ? (UInt64?)null : ToUInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(SqlSingle  p) { return p.IsNull ? (UInt64?)null : ToUInt64(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(SqlString  p) { return p.IsNull ? (UInt64?)null : ToUInt64(p.Value);                                       }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>UInt64?</c> value.</summary>
+		[CLSCompliant(false)]
+		public static UInt64? ToNullableUInt64(object p)
+		{
+			if (p == null) return null;
+
+			if (p is UInt64?) return (UInt64?)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull  : return null;
+				case TypeCode.Byte    : return ToNullableUInt64((Byte)   p);
+				case TypeCode.UInt16  : return ToNullableUInt64((UInt16) p);
+				case TypeCode.UInt32  : return ToNullableUInt64((UInt32) p);
+				case TypeCode.UInt64  : return ToNullableUInt64((UInt64) p);
+				case TypeCode.SByte   : return ToNullableUInt64((SByte)  p);
+				case TypeCode.Int16   : return ToNullableUInt64((Int16)  p);
+				case TypeCode.Int32   : return ToNullableUInt64((Int32)  p);
+				case TypeCode.Int64   : return ToNullableUInt64((Int64)  p);
+				case TypeCode.Single  : return ToNullableUInt64((Single) p);
+				case TypeCode.Double  : return ToNullableUInt64((Double) p);
+				case TypeCode.Decimal : return ToNullableUInt64((Decimal)p);
+				case TypeCode.Char    : return ToNullableUInt64((Char)   p);
+				case TypeCode.String  : return ToNullableUInt64((String) p);
+				case TypeCode.Boolean : return ToNullableUInt64((Boolean)p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToNullableUInt64((Boolean?)  p);
+				if (p is Byte?)      return ToNullableUInt64((Byte?)     p);
+				if (p is Char?)      return ToNullableUInt64((Char?)     p);
+				if (p is Decimal?)   return ToNullableUInt64((Decimal?)  p);
+				if (p is Double?)    return ToNullableUInt64((Double?)   p);
+				if (p is Int16?)     return ToNullableUInt64((Int16?)    p);
+				if (p is Int32?)     return ToNullableUInt64((Int32?)    p);
+				if (p is Int64?)     return ToNullableUInt64((Int64?)    p);
+				if (p is SByte?)     return ToNullableUInt64((SByte?)    p);
+				if (p is Single?)    return ToNullableUInt64((Single?)   p);
+				if (p is UInt16?)    return ToNullableUInt64((UInt16?)   p);
+				if (p is UInt32?)    return ToNullableUInt64((UInt32?)   p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToNullableUInt64((Binary)    p);
+			if (p is Byte[])     return ToNullableUInt64((Byte[])    p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToNullableUInt64((SqlBoolean)p);
+				if (p is SqlByte)    return ToNullableUInt64((SqlByte)   p);
+				if (p is SqlDecimal) return ToNullableUInt64((SqlDecimal)p);
+				if (p is SqlDouble)  return ToNullableUInt64((SqlDouble) p);
+				if (p is SqlInt16)   return ToNullableUInt64((SqlInt16)  p);
+				if (p is SqlInt32)   return ToNullableUInt64((SqlInt32)  p);
+				if (p is SqlInt64)   return ToNullableUInt64((SqlInt64)  p);
+				if (p is SqlMoney)   return ToNullableUInt64((SqlMoney)  p);
+				if (p is SqlSingle)  return ToNullableUInt64((SqlSingle) p);
+				if (p is SqlString)  return ToNullableUInt64((SqlString) p);
+			}
+
+#endif
+
+			throw CreateInvalidCastException(p.GetType(), typeof(UInt64?));
+		}
+
+		#endregion
+
+		#endregion
+
+		#region Sql Types
+
+		#region SqlBinary
+
+#if !SILVERLIGHT
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Guid</c> to an equivalent <c>SqlBinary</c> value.</summary>
+		public static SqlBinary ToSqlBinary(Guid     p) { return p == Guid.Empty? SqlBinary.Null : new SqlGuid(p).ToSqlBinary();  }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Guid?</c> to an equivalent <c>SqlBinary</c> value.</summary>
+		public static SqlBinary ToSqlBinary(Guid?    p) { return p.HasValue ? new SqlGuid(p.Value).ToSqlBinary(): SqlBinary.Null; }
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBytes</c> to an equivalent <c>SqlBinary</c> value.</summary>
+		public static SqlBinary ToSqlBinary(SqlBytes p) { return p.ToSqlBinary();                                                 }
+		/// <summary>Converts the value from <c>SqlGuid</c> to an equivalent <c>SqlBinary</c> value.</summary>
+		public static SqlBinary ToSqlBinary(SqlGuid  p) { return p.ToSqlBinary();                                                 }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>SqlBinary</c> value.</summary>
+		public static SqlBinary ToSqlBinary(Binary   p) { return p == null ?      SqlBinary.Null : p.ToArray();                   }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>SqlBinary</c> value.</summary>
+		public static SqlBinary ToSqlBinary(Byte[]   p) { return p;                                                               }
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>SqlBinary</c> value.</summary>
+		public static SqlBinary ToSqlBinary(object p)
+		{
+			if (p == null || p is DBNull) return SqlBinary.Null;
+
+			if (p is SqlBinary) return (SqlBinary)p;
+
+			// Simple Types
+			//
+			if (p is Guid)     return ToSqlBinary((Guid)    p);
+
+			// Nullable Types
+			//
+			var type = p.GetType();
+
+			if (type.IsGenericType)
+			{
+				if (p is Guid?)    return ToSqlBinary((Guid?)   p);
+			}
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBytes) return ToSqlBinary((SqlBytes)p);
+				if (p is SqlGuid)  return ToSqlBinary((SqlGuid) p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)   return ToSqlBinary((Binary)  p);
+			if (p is Byte[])   return ToSqlBinary((Byte[])  p);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(SqlBinary));
+		}
+
+#endif
+
+		#endregion
+
+		#region SqlBoolean
+
+#if !SILVERLIGHT
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(Boolean    p) { return p;                                                                                     }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(Byte       p) { return p != 0;                                                                                }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(Char       p) { return ToBoolean(p);                                                                          }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(Decimal    p) { return p != 0;                                                                                }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(Double     p) { return p != 0;                                                                                }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(Int16      p) { return p != 0;                                                                                }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(Int32      p) { return p != 0;                                                                                }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(Int64      p) { return p != 0;                                                                                }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlBoolean ToSqlBoolean(SByte      p) { return p != 0;                                                                                }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(Single     p) { return p != 0;                                                                                }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(String     p) { return p == null? SqlBoolean.Null : p.Length == 1 ? ToBoolean(p[0]) : Boolean.Parse(p);       }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlBoolean ToSqlBoolean(UInt16     p) { return p != 0;                                                                                }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlBoolean ToSqlBoolean(UInt32     p) { return p != 0;                                                                                }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlBoolean ToSqlBoolean(UInt64     p) { return p != 0;                                                                                }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(Boolean?   p) { return p.HasValue ? p.Value : SqlBoolean.Null;                                                }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(Byte?      p) { return p.HasValue ? p.Value != 0 : SqlBoolean.Null;                                           }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(Char?      p) { return p.HasValue && ToBoolean(p.Value);                                                      }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(Decimal?   p) { return p.HasValue ? p.Value != 0 : SqlBoolean.Null;                                           }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(Double?    p) { return p.HasValue ? p.Value != 0 : SqlBoolean.Null;                                           }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(Int16?     p) { return p.HasValue ? p.Value != 0 : SqlBoolean.Null;                                           }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(Int32?     p) { return p.HasValue ? p.Value != 0 : SqlBoolean.Null;                                           }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(Int64?     p) { return p.HasValue ? p.Value != 0 : SqlBoolean.Null;                                           }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlBoolean ToSqlBoolean(SByte?     p) { return p.HasValue ? p.Value != 0 : SqlBoolean.Null;                                           }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(Single?    p) { return p.HasValue ? p.Value != 0 : SqlBoolean.Null;                                           }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlBoolean ToSqlBoolean(UInt16?    p) { return p.HasValue ? p.Value != 0 : SqlBoolean.Null;                                           }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlBoolean ToSqlBoolean(UInt32?    p) { return p.HasValue ? p.Value != 0 : SqlBoolean.Null;                                           }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlBoolean ToSqlBoolean(UInt64?    p) { return p.HasValue ? p.Value != 0 : SqlBoolean.Null;                                           }
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(SqlByte    p) { return p.IsNull ? SqlBoolean.Null : ToBoolean(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(SqlDecimal p) { return p.IsNull ? SqlBoolean.Null : ToBoolean(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(SqlDouble  p) { return p.IsNull ? SqlBoolean.Null : ToBoolean(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(SqlInt16   p) { return p.IsNull ? SqlBoolean.Null : ToBoolean(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(SqlInt32   p) { return p.IsNull ? SqlBoolean.Null : ToBoolean(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(SqlInt64   p) { return p.IsNull ? SqlBoolean.Null : ToBoolean(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(SqlMoney   p) { return p.IsNull ? SqlBoolean.Null : ToBoolean(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(SqlSingle  p) { return p.IsNull ? SqlBoolean.Null : ToBoolean(p.Value);                                       }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(SqlString  p) { return p.IsNull ? SqlBoolean.Null : ToBoolean(p.Value);                                       }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(Binary     p) { return p == null || p.Length == 0 ? SqlBoolean.Null : BitConverter.ToBoolean(p.ToArray(), 0); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(Byte[]     p) { return p == null || p.Length == 0 ? SqlBoolean.Null : BitConverter.ToBoolean(p, 0);           }
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>SqlBoolean</c> value.</summary>
+		public static SqlBoolean ToSqlBoolean(object p)
+		{
+			if (p == null) return SqlBoolean.Null;
+
+			if (p is SqlBoolean) return (SqlBoolean)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull     : return SqlBoolean.Null;
+				case TypeCode.String     : return ToSqlBoolean((String)    p);
+				case TypeCode.Boolean    : return ToSqlBoolean((Boolean)   p);
+				case TypeCode.Char       : return ToSqlBoolean((Char)      p);
+				case TypeCode.SByte      : return ToSqlBoolean((SByte)     p);
+				case TypeCode.Int16      : return ToSqlBoolean((Int16)     p);
+				case TypeCode.Int32      : return ToSqlBoolean((Int32)     p);
+				case TypeCode.Int64      : return ToSqlBoolean((Int64)     p);
+				case TypeCode.Byte       : return ToSqlBoolean((Byte)      p);
+				case TypeCode.UInt16     : return ToSqlBoolean((UInt16)    p);
+				case TypeCode.UInt32     : return ToSqlBoolean((UInt32)    p);
+				case TypeCode.UInt64     : return ToSqlBoolean((UInt64)    p);
+				case TypeCode.Single     : return ToSqlBoolean((Single)    p);
+				case TypeCode.Double     : return ToSqlBoolean((Double)    p);
+				case TypeCode.Decimal    : return ToSqlBoolean((Decimal)   p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToSqlBoolean((Boolean?)  p);
+				if (p is Byte?)      return ToSqlBoolean((Byte?)     p);
+				if (p is Char?)      return ToSqlBoolean((Char?)     p);
+				if (p is Decimal?)   return ToSqlBoolean((Decimal?)  p);
+				if (p is Double?)    return ToSqlBoolean((Double?)   p);
+				if (p is Int16?)     return ToSqlBoolean((Int16?)    p);
+				if (p is Int32?)     return ToSqlBoolean((Int32?)    p);
+				if (p is Int64?)     return ToSqlBoolean((Int64?)    p);
+				if (p is SByte?)     return ToSqlBoolean((SByte?)    p);
+				if (p is Single?)    return ToSqlBoolean((Single?)   p);
+				if (p is UInt16?)    return ToSqlBoolean((UInt16?)   p);
+				if (p is UInt32?)    return ToSqlBoolean((UInt32?)   p);
+				if (p is UInt64?)    return ToSqlBoolean((UInt64?)   p);
+			}
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlByte)    return ToSqlBoolean((SqlByte)   p);
+				if (p is SqlDecimal) return ToSqlBoolean((SqlDecimal)p);
+				if (p is SqlDouble)  return ToSqlBoolean((SqlDouble) p);
+				if (p is SqlInt16)   return ToSqlBoolean((SqlInt16)  p);
+				if (p is SqlInt32)   return ToSqlBoolean((SqlInt32)  p);
+				if (p is SqlInt64)   return ToSqlBoolean((SqlInt64)  p);
+				if (p is SqlMoney)   return ToSqlBoolean((SqlMoney)  p);
+				if (p is SqlSingle)  return ToSqlBoolean((SqlSingle) p);
+				if (p is SqlString)  return ToSqlBoolean((SqlString) p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToSqlBoolean((Binary)    p);
+			if (p is Byte[])     return ToSqlBoolean((Byte[])    p);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(SqlBoolean));
+		}
+
+#endif
+
+		#endregion
+
+		#region SqlByte
+
+#if !SILVERLIGHT
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(Boolean    p) { return p ? (SqlByte)1 : (SqlByte)0;                                }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(Byte       p) { return p;                                                          }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(Char       p) { return checked((Byte)p);                                           }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(Decimal    p) { return checked((Byte)p);                                           }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(Double     p) { return checked((Byte)p);                                           }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(Int16      p) { return checked((Byte)p);                                           }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(Int32      p) { return checked((Byte)p);                                           }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(Int64      p) { return checked((Byte)p);                                           }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>SqlByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlByte ToSqlByte(SByte      p) { return checked((Byte)p);                                           }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(Single     p) { return checked((Byte)p);                                           }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(String     p) { return p == null? SqlByte.Null : Byte.Parse(p);                    }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>SqlByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlByte ToSqlByte(UInt16     p) { return checked((Byte)p);                                           }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>SqlByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlByte ToSqlByte(UInt32     p) { return checked((Byte)p);                                           }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>SqlByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlByte ToSqlByte(UInt64     p) { return checked((Byte)p);                                           }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(Boolean?   p) { return p.HasValue && p.Value ? (SqlByte)1: (SqlByte)0;             }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(Byte?      p) { return p.HasValue ? p.Value : SqlByte.Null;                        }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(Char?      p) { return p.HasValue ? checked((Byte)p.Value) : SqlByte.Null;         }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(Decimal?   p) { return p.HasValue ? checked((Byte)p.Value) : SqlByte.Null;         }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(Double?    p) { return p.HasValue ? checked((Byte)p.Value) : SqlByte.Null;         }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(Int16?     p) { return p.HasValue ? checked((Byte)p.Value) : SqlByte.Null;         }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(Int32?     p) { return p.HasValue ? checked((Byte)p.Value) : SqlByte.Null;         }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(Int64?     p) { return p.HasValue ? checked((Byte)p.Value) : SqlByte.Null;         }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>SqlByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlByte ToSqlByte(SByte?     p) { return p.HasValue ? checked((Byte)p.Value) : SqlByte.Null;         }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(Single?    p) { return p.HasValue ? checked((Byte)p.Value) : SqlByte.Null;         }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>SqlByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlByte ToSqlByte(UInt16?    p) { return p.HasValue ? checked((Byte)p.Value) : SqlByte.Null;         }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>SqlByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlByte ToSqlByte(UInt32?    p) { return p.HasValue ? checked((Byte)p.Value) : SqlByte.Null;         }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>SqlByte</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlByte ToSqlByte(UInt64?    p) { return p.HasValue ? checked((Byte)p.Value) : SqlByte.Null;         }
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(SqlBoolean p) { return p.ToSqlByte();                                              }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(SqlDecimal p) { return p.ToSqlByte();                                              }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(SqlDouble  p) { return p.ToSqlByte();                                              }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(SqlInt16   p) { return p.ToSqlByte();                                              }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(SqlInt32   p) { return p.ToSqlByte();                                              }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(SqlInt64   p) { return p.ToSqlByte();                                              }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(SqlMoney   p) { return p.ToSqlByte();                                              }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(SqlSingle  p) { return p.ToSqlByte();                                              }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(SqlString  p) { return p.ToSqlByte();                                              }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(Binary     p) { return p == null || p.Length == 0 ? SqlByte.Null : p.ToArray()[0]; }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(Byte[]     p) { return p == null || p.Length == 0 ? SqlByte.Null : p[0];           }
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>SqlByte</c> value.</summary>
+		public static SqlByte ToSqlByte(object p)
+		{
+			if (p == null) return SqlByte.Null;
+
+			if (p is SqlByte) return (SqlByte)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull  : return SqlByte.Null;
+				case TypeCode.Byte    : return ToSqlByte((Byte)   p);
+				case TypeCode.SByte   : return ToSqlByte((SByte)  p);
+				case TypeCode.Int16   : return ToSqlByte((Int16)  p);
+				case TypeCode.Int32   : return ToSqlByte((Int32)  p);
+				case TypeCode.Int64   : return ToSqlByte((Int64)  p);
+				case TypeCode.UInt16  : return ToSqlByte((UInt16) p);
+				case TypeCode.UInt32  : return ToSqlByte((UInt32) p);
+				case TypeCode.UInt64  : return ToSqlByte((UInt64) p);
+				case TypeCode.Single  : return ToSqlByte((Single) p);
+				case TypeCode.Double  : return ToSqlByte((Double) p);
+				case TypeCode.Decimal : return ToSqlByte((Decimal)p);
+				case TypeCode.Char    : return ToSqlByte((Char)   p);
+				case TypeCode.String  : return ToSqlByte((String) p);
+				case TypeCode.Boolean : return ToSqlByte((Boolean)p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToSqlByte((Boolean?)  p);
+				if (p is Byte?)      return ToSqlByte((Byte?)     p);
+				if (p is Char?)      return ToSqlByte((Char?)     p);
+				if (p is Decimal?)   return ToSqlByte((Decimal?)  p);
+				if (p is Double?)    return ToSqlByte((Double?)   p);
+				if (p is Int16?)     return ToSqlByte((Int16?)    p);
+				if (p is Int32?)     return ToSqlByte((Int32?)    p);
+				if (p is Int64?)     return ToSqlByte((Int64?)    p);
+				if (p is SByte?)     return ToSqlByte((SByte?)    p);
+				if (p is Single?)    return ToSqlByte((Single?)   p);
+				if (p is UInt16?)    return ToSqlByte((UInt16?)   p);
+				if (p is UInt32?)    return ToSqlByte((UInt32?)   p);
+				if (p is UInt64?)    return ToSqlByte((UInt64?)   p);
+			}
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToSqlByte((SqlBoolean)p);
+				if (p is SqlDecimal) return ToSqlByte((SqlDecimal)p);
+				if (p is SqlDouble)  return ToSqlByte((SqlDouble) p);
+				if (p is SqlInt16)   return ToSqlByte((SqlInt16)  p);
+				if (p is SqlInt32)   return ToSqlByte((SqlInt32)  p);
+				if (p is SqlInt64)   return ToSqlByte((SqlInt64)  p);
+				if (p is SqlMoney)   return ToSqlByte((SqlMoney)  p);
+				if (p is SqlSingle)  return ToSqlByte((SqlSingle) p);
+				if (p is SqlString)  return ToSqlByte((SqlString) p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToSqlByte((Binary)    p);
+			if (p is Byte[])     return ToSqlByte((Byte[])    p);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(SqlByte));
+		}
+
+#endif
+
+		#endregion
+
+		#region SqlBytes
+
+#if !SILVERLIGHT
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(Boolean         p) { return new SqlBytes(ToByteArray(p));                                     }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(Byte            p) { return new SqlBytes(ToByteArray(p));                                     }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(Char            p) { return new SqlBytes(ToByteArray(p));                                     }
+		/// <summary>Converts the value from <c>DateTime</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(DateTime        p) { return new SqlBytes(ToByteArray(p));                                     }
+		/// <summary>Converts the value from <c>DateTimeOffset</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(DateTimeOffset  p) { return new SqlBytes(ToByteArray(p));                                     }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(Double          p) { return new SqlBytes(ToByteArray(p));                                     }
+		/// <summary>Converts the value from <c>Guid</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(Guid            p) { return p == Guid.Empty ? SqlBytes.Null: new SqlBytes(p.ToByteArray());   }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(Int16           p) { return new SqlBytes(ToByteArray(p));                                     }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(Int32           p) { return new SqlBytes(ToByteArray(p));                                     }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(Int64           p) { return new SqlBytes(ToByteArray(p));                                     }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlBytes ToSqlBytes(SByte           p) { return new SqlBytes(ToByteArray(p));                                     }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(Single          p) { return new SqlBytes(ToByteArray(p));                                     }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(String          p) { return p == null ? SqlBytes.Null : new SqlBytes(ToByteArray(p));         }
+		/// <summary>Converts the value from <c>TimeSpan</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(TimeSpan        p) { return new SqlBytes(ToByteArray(p));                                     }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlBytes ToSqlBytes(UInt16          p) { return new SqlBytes(ToByteArray(p));                                     }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlBytes ToSqlBytes(UInt32          p) { return new SqlBytes(ToByteArray(p));                                     }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlBytes ToSqlBytes(UInt64          p) { return new SqlBytes(ToByteArray(p));                                     }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(Boolean?        p) { return p.HasValue ? ToSqlBytes(p.Value) : SqlBytes.Null;                 }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(Byte?           p) { return p.HasValue ? ToSqlBytes(p.Value) : SqlBytes.Null;                 }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(Char?           p) { return p.HasValue ? ToSqlBytes(p.Value) : SqlBytes.Null;                 }
+		/// <summary>Converts the value from <c>DateTime?</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(DateTime?       p) { return p.HasValue ? ToSqlBytes(p.Value) : SqlBytes.Null;                 }
+		/// <summary>Converts the value from <c>DateTimeOffset?</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(DateTimeOffset? p) { return p.HasValue ? ToSqlBytes(p.Value) : SqlBytes.Null;                 }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(Decimal?        p) { return p.HasValue ? ToSqlBytes(p.Value) : SqlBytes.Null;                 }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(Double?         p) { return p.HasValue ? ToSqlBytes(p.Value) : SqlBytes.Null;                 }
+		/// <summary>Converts the value from <c>Guid?</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(Guid?           p) { return p.HasValue ? new SqlBytes(p.Value.ToByteArray()) : SqlBytes.Null; }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(Int16?          p) { return p.HasValue ? ToSqlBytes(p.Value) : SqlBytes.Null;                 }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(Int32?          p) { return p.HasValue ? ToSqlBytes(p.Value) : SqlBytes.Null;                 }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(Int64?          p) { return p.HasValue ? ToSqlBytes(p.Value) : SqlBytes.Null;                 }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlBytes ToSqlBytes(SByte?          p) { return p.HasValue ? ToSqlBytes(p.Value) : SqlBytes.Null;                 }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(Single?         p) { return p.HasValue ? ToSqlBytes(p.Value) : SqlBytes.Null;                 }
+		/// <summary>Converts the value from <c>TimeSpan?</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(TimeSpan?       p) { return p.HasValue ? ToSqlBytes(p.Value) : SqlBytes.Null;                 }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlBytes ToSqlBytes(UInt16?         p) { return p.HasValue ? ToSqlBytes(p.Value) : SqlBytes.Null;                 }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlBytes ToSqlBytes(UInt32?         p) { return p.HasValue ? ToSqlBytes(p.Value) : SqlBytes.Null;                 }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlBytes ToSqlBytes(UInt64?         p) { return p.HasValue ? ToSqlBytes(p.Value) : SqlBytes.Null;                 }
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBinary</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(SqlBinary       p) { return p.IsNull ? SqlBytes.Null : new SqlBytes(p);                       }
+		/// <summary>Converts the value from <c>SqlGuid</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(SqlGuid         p) { return p.IsNull ? SqlBytes.Null : new SqlBytes(p.ToByteArray());         }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(Binary          p) { return p == null ? SqlBytes.Null : new SqlBytes(p.ToArray());            }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(Byte[]          p) { return p == null ? SqlBytes.Null : new SqlBytes(p);                      }
+		/// <summary>Converts the value from <c>Stream</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(Stream          p) { return p == null ? SqlBytes.Null : new SqlBytes(p);                      }
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>SqlBytes</c> value.</summary>
+		public static SqlBytes ToSqlBytes(object p)
+		{
+			if (p == null) return SqlBytes.Null;
+
+			if (p is SqlBytes) return (SqlBytes)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull   : return SqlBytes.Null;
+				case TypeCode.String   : return ToSqlBytes((String)  p);
+				case TypeCode.Byte     : return ToSqlBytes((Byte)    p);
+				case TypeCode.SByte    : return ToSqlBytes((SByte)   p);
+				case TypeCode.DateTime : return ToSqlBytes((DateTime)p);
+				case TypeCode.Int16    : return ToSqlBytes((Int16)   p);
+				case TypeCode.Int32    : return ToSqlBytes((Int32)   p);
+				case TypeCode.Int64    : return ToSqlBytes((Int64)   p);
+				case TypeCode.UInt16   : return ToSqlBytes((UInt16)  p);
+				case TypeCode.UInt32   : return ToSqlBytes((UInt32)  p);
+				case TypeCode.UInt64   : return ToSqlBytes((UInt64)  p);
+				case TypeCode.Single   : return ToSqlBytes((Single)  p);
+				case TypeCode.Double   : return ToSqlBytes((Double)  p);
+				case TypeCode.Boolean  : return ToSqlBytes((Boolean) p);
+				case TypeCode.Char     : return ToSqlBytes((Char)    p);
+			}
+
+			// Simple Types
+			//
+			if (p is DateTimeOffset)  return ToSqlBytes((DateTimeOffset) p);
+			if (p is Guid)            return ToSqlBytes((Guid)           p);
+			if (p is TimeSpan)        return ToSqlBytes((TimeSpan)       p);
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)        return ToSqlBytes((Boolean?)       p);
+				if (p is Byte?)           return ToSqlBytes((Byte?)          p);
+				if (p is Char?)           return ToSqlBytes((Char?)          p);
+				if (p is DateTime?)       return ToSqlBytes((DateTime?)      p);
+				if (p is DateTimeOffset?) return ToSqlBytes((DateTimeOffset?)p);
+				if (p is Decimal?)        return ToSqlBytes((Decimal?)       p);
+				if (p is Double?)         return ToSqlBytes((Double?)        p);
+				if (p is Guid?)           return ToSqlBytes((Guid?)          p);
+				if (p is Int16?)          return ToSqlBytes((Int16?)         p);
+				if (p is Int32?)          return ToSqlBytes((Int32?)         p);
+				if (p is Int64?)          return ToSqlBytes((Int64?)         p);
+				if (p is SByte?)          return ToSqlBytes((SByte?)         p);
+				if (p is Single?)         return ToSqlBytes((Single?)        p);
+				if (p is TimeSpan?)       return ToSqlBytes((TimeSpan?)      p);
+				if (p is UInt16?)         return ToSqlBytes((UInt16?)        p);
+				if (p is UInt32?)         return ToSqlBytes((UInt32?)        p);
+				if (p is UInt64?)         return ToSqlBytes((UInt64?)        p);
+			}
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBinary)       return ToSqlBytes((SqlBinary)      p);
+				if (p is SqlGuid)         return ToSqlBytes((SqlGuid)        p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)          return ToSqlBytes((Binary)         p);
+			if (p is Byte[])          return ToSqlBytes((Byte[])         p);
+			if (p is Stream)          return ToSqlBytes((Stream)         p);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(SqlBytes));
+		}
+
+#endif
+
+		#endregion
+
+		#region SqlChars
+
+#if !SILVERLIGHT
+
+#endif
+
+		#endregion
+
+		#region SqlDateTime
+
+#if !SILVERLIGHT
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>DateTime</c> to an equivalent <c>SqlDateTime</c> value.</summary>
+		public static SqlDateTime ToSqlDateTime(DateTime        p) { return p;                                                                                           }
+		/// <summary>Converts the value from <c>DateTimeOffset</c> to an equivalent <c>SqlDateTime</c> value.</summary>
+		public static SqlDateTime ToSqlDateTime(DateTimeOffset  p) { return p.LocalDateTime;                                                                             }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>SqlDateTime</c> value.</summary>
+		public static SqlDateTime ToSqlDateTime(Double          p) { return DateTime.MinValue + TimeSpan.FromDays (p);                                                   }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>SqlDateTime</c> value.</summary>
+		public static SqlDateTime ToSqlDateTime(Int64           p) { return DateTime.MinValue + TimeSpan.FromTicks(p);                                                   }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>SqlDateTime</c> value.</summary>
+		public static SqlDateTime ToSqlDateTime(String          p) { return p == null ? SqlDateTime.Null : DateTime.Parse(p, null, DateTimeStyles.NoCurrentDateDefault); }
+		/// <summary>Converts the value from <c>TimeSpan</c> to an equivalent <c>SqlDateTime</c> value.</summary>
+		public static SqlDateTime ToSqlDateTime(TimeSpan        p) { return DateTime.MinValue + p;                                                                       }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>DateTime?</c> to an equivalent <c>SqlDateTime</c> value.</summary>
+		public static SqlDateTime ToSqlDateTime(DateTime?       p) { return p.HasValue ? p.Value : SqlDateTime.Null;                                                     }
+		/// <summary>Converts the value from <c>DateTimeOffset?</c> to an equivalent <c>SqlDateTime</c> value.</summary>
+		public static SqlDateTime ToSqlDateTime(DateTimeOffset? p) { return p.HasValue ?                     p.Value.LocalDateTime : SqlDateTime.Null;                   }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>SqlDateTime</c> value.</summary>
+		public static SqlDateTime ToSqlDateTime(Double?         p) { return p.HasValue ? DateTime.MinValue + TimeSpan.FromDays (p.Value): SqlDateTime.Null;              }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>SqlDateTime</c> value.</summary>
+		public static SqlDateTime ToSqlDateTime(Int64?          p) { return p.HasValue ? DateTime.MinValue + TimeSpan.FromTicks(p.Value): SqlDateTime.Null;              }
+		/// <summary>Converts the value from <c>TimeSpan?</c> to an equivalent <c>SqlDateTime</c> value.</summary>
+		public static SqlDateTime ToSqlDateTime(TimeSpan?       p) { return p.HasValue ? DateTime.MinValue +                    p.Value : SqlDateTime.Null;              }
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>SqlDateTime</c> value.</summary>
+		public static SqlDateTime ToSqlDateTime(SqlDouble       p) { return p.IsNull   ? SqlDateTime.Null : DateTime.MinValue + TimeSpan.FromDays (p.Value);             }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>SqlDateTime</c> value.</summary>
+		public static SqlDateTime ToSqlDateTime(SqlInt64        p) { return p.IsNull   ? SqlDateTime.Null : DateTime.MinValue + TimeSpan.FromTicks(p.Value);             }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>SqlDateTime</c> value.</summary>
+		public static SqlDateTime ToSqlDateTime(SqlString       p) { return p.IsNull   ? SqlDateTime.Null :                             ToDateTime(p.Value);             }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>SqlDateTime</c> value.</summary>
+		public static SqlDateTime ToSqlDateTime(Binary          p) { return p == null || p.Length == 0 ? SqlDateTime.Null : DateTime.FromBinary(ToInt64(p.ToArray()));   }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>SqlDateTime</c> value.</summary>
+		public static SqlDateTime ToSqlDateTime(Byte[]          p) { return p == null || p.Length == 0 ? SqlDateTime.Null : DateTime.FromBinary(ToInt64(p));             }
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>SqlDateTime</c> value.</summary>
+		public static SqlDateTime ToSqlDateTime(object p)
+		{
+			if (p == null) return SqlDateTime.Null;
+
+			if (p is SqlDateTime) return (SqlDateTime)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull      : return SqlDateTime.Null;
+				case TypeCode.DateTime    : return ToSqlDateTime((DateTime)   p);
+				case TypeCode.String      : return ToSqlDateTime((String)     p);
+				case TypeCode.Int64       : return ToSqlDateTime((Int64)      p);
+				case TypeCode.Double      : return ToSqlDateTime((Double)     p);
+			}
+
+			// Simple Types
+			//
+			if (p is DateTimeOffset)  return ToSqlDateTime((DateTimeOffset) p);
+			if (p is TimeSpan)        return ToSqlDateTime((TimeSpan)       p);
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is DateTime?)       return ToSqlDateTime((DateTime?)      p);
+				if (p is DateTimeOffset?) return ToSqlDateTime((DateTimeOffset?)p);
+				if (p is Double?)         return ToSqlDateTime((Double?)        p);
+				if (p is Int64?)          return ToSqlDateTime((Int64?)         p);
+				if (p is TimeSpan?)       return ToSqlDateTime((TimeSpan?)      p);
+			}
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlDouble)       return ToSqlDateTime((SqlDouble)      p);
+				if (p is SqlInt64)        return ToSqlDateTime((SqlInt64)       p);
+				if (p is SqlString)       return ToSqlDateTime((SqlString)      p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)          return ToSqlDateTime((Binary)         p);
+			if (p is Byte[])          return ToSqlDateTime((Byte[])         p);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(SqlDateTime));
+		}
+
+#endif
+
+		#endregion
+
+		#region SqlDecimal
+
+#if !SILVERLIGHT
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(Boolean    p) { return p ? (SqlDecimal)1 : (SqlDecimal)0;                           }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(Byte       p) { return p;                                                           }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(Char       p) { return p;                                                           }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(Decimal    p) { return p;                                                           }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(Double     p) { return checked((Decimal)p);                                         }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(Int16      p) { return p;                                                           }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(Int32      p) { return p;                                                           }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(Int64      p) { return p;                                                           }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlDecimal ToSqlDecimal(SByte      p) { return p;                                                           }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(Single     p) { return checked((Decimal)p);                                         }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(String     p) { return p == null? SqlDecimal.Null : Decimal.Parse(p);               }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlDecimal ToSqlDecimal(UInt16     p) { return p;                                                           }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlDecimal ToSqlDecimal(UInt32     p) { return p;                                                           }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlDecimal ToSqlDecimal(UInt64     p) { return p;                                                           }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(Boolean?   p) { return p.HasValue && p.Value ? (SqlDecimal)1: (SqlDecimal)0;        }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(Byte?      p) { return p.HasValue ? p.Value : SqlDecimal.Null;                      }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(Char?      p) { return p.HasValue ? p.Value : SqlDecimal.Null;                      }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(Decimal?   p) { return p.HasValue ? p.Value : SqlDecimal.Null;                      }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(Double?    p) { return p.HasValue ? checked((Decimal)p.Value) : SqlDecimal.Null;    }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(Int16?     p) { return p.HasValue ? p.Value : SqlDecimal.Null;                      }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(Int32?     p) { return p.HasValue ? p.Value : SqlDecimal.Null;                      }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(Int64?     p) { return p.HasValue ? p.Value : SqlDecimal.Null;                      }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlDecimal ToSqlDecimal(SByte?     p) { return p.HasValue ? p.Value : SqlDecimal.Null;                      }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(Single?    p) { return p.HasValue ? checked((Decimal)p.Value) : SqlDecimal.Null;    }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlDecimal ToSqlDecimal(UInt16?    p) { return p.HasValue ? p.Value : SqlDecimal.Null;                      }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlDecimal ToSqlDecimal(UInt32?    p) { return p.HasValue ? p.Value : SqlDecimal.Null;                      }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlDecimal ToSqlDecimal(UInt64?    p) { return p.HasValue ? p.Value : SqlDecimal.Null;                      }
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(SqlBoolean p) { return p.ToSqlDecimal();                                            }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(SqlByte    p) { return p.ToSqlDecimal();                                            }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(SqlDouble  p) { return p.ToSqlDecimal();                                            }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(SqlInt16   p) { return p.ToSqlDecimal();                                            }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(SqlInt32   p) { return p.ToSqlDecimal();                                            }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(SqlInt64   p) { return p.ToSqlDecimal();                                            }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(SqlMoney   p) { return p.ToSqlDecimal();                                            }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(SqlSingle  p) { return p.ToSqlDecimal();                                            }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(SqlString  p) { return p.ToSqlDecimal();                                            }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(Binary     p) { return p == null || p.Length == 0 ? SqlDecimal.Null : ToDecimal(p); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(Byte[]     p) { return p == null || p.Length == 0 ? SqlDecimal.Null : ToDecimal(p); }
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>SqlDecimal</c> value.</summary>
+		public static SqlDecimal ToSqlDecimal(object p)
+		{
+			if (p == null) return SqlDecimal.Null;
+
+			if (p is SqlDecimal) return (SqlDecimal)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull     : return SqlDecimal.Null;
+				case TypeCode.SByte      : return ToSqlDecimal((SByte)     p);
+				case TypeCode.Int16      : return ToSqlDecimal((Int16)     p);
+				case TypeCode.Int32      : return ToSqlDecimal((Int32)     p);
+				case TypeCode.Int64      : return ToSqlDecimal((Int64)     p);
+				case TypeCode.Byte       : return ToSqlDecimal((Byte)      p);
+				case TypeCode.UInt16     : return ToSqlDecimal((UInt16)    p);
+				case TypeCode.UInt32     : return ToSqlDecimal((UInt32)    p);
+				case TypeCode.Char       : return ToSqlDecimal((Char)      p);
+				case TypeCode.UInt64     : return ToSqlDecimal((UInt64)    p);
+				case TypeCode.Decimal    : return ToSqlDecimal((Decimal)   p);
+				case TypeCode.Single     : return ToSqlDecimal((Single)    p);
+				case TypeCode.Double     : return ToSqlDecimal((Double)    p);
+				case TypeCode.String     : return ToSqlDecimal((String)    p);
+				case TypeCode.Boolean    : return ToSqlDecimal((Boolean)   p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToSqlDecimal((Boolean?)  p);
+				if (p is Byte?)      return ToSqlDecimal((Byte?)     p);
+				if (p is Char?)      return ToSqlDecimal((Char?)     p);
+				if (p is Decimal?)   return ToSqlDecimal((Decimal?)  p);
+				if (p is Double?)    return ToSqlDecimal((Double?)   p);
+				if (p is Int16?)     return ToSqlDecimal((Int16?)    p);
+				if (p is Int32?)     return ToSqlDecimal((Int32?)    p);
+				if (p is Int64?)     return ToSqlDecimal((Int64?)    p);
+				if (p is SByte?)     return ToSqlDecimal((SByte?)    p);
+				if (p is Single?)    return ToSqlDecimal((Single?)   p);
+				if (p is UInt16?)    return ToSqlDecimal((UInt16?)   p);
+				if (p is UInt32?)    return ToSqlDecimal((UInt32?)   p);
+				if (p is UInt64?)    return ToSqlDecimal((UInt64?)   p);
+			}
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToSqlDecimal((SqlBoolean)p);
+				if (p is SqlByte)    return ToSqlDecimal((SqlByte)   p);
+				if (p is SqlDouble)  return ToSqlDecimal((SqlDouble) p);
+				if (p is SqlInt16)   return ToSqlDecimal((SqlInt16)  p);
+				if (p is SqlInt32)   return ToSqlDecimal((SqlInt32)  p);
+				if (p is SqlInt64)   return ToSqlDecimal((SqlInt64)  p);
+				if (p is SqlMoney)   return ToSqlDecimal((SqlMoney)  p);
+				if (p is SqlSingle)  return ToSqlDecimal((SqlSingle) p);
+				if (p is SqlString)  return ToSqlDecimal((SqlString) p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToSqlDecimal((Binary)    p);
+			if (p is Byte[])     return ToSqlDecimal((Byte[])    p);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(SqlDecimal));
+		}
+
+#endif
+
+		#endregion
+
+		#region SqlDouble
+
+#if !SILVERLIGHT
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(Boolean         p) { return p ? (SqlDouble)1 : (SqlDouble)0;                                                     }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(Byte            p) { return p;                                                                                   }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(Char            p) { return p;                                                                                   }
+		/// <summary>Converts the value from <c>DateTime</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(DateTime        p) { return (p - DateTime.MinValue).TotalDays;                                                   }
+		/// <summary>Converts the value from <c>DateTimeOffset</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(DateTimeOffset  p) { return (p - DateTimeOffset.MinValue).TotalDays;                                             }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(Decimal         p) { return checked((Double)p);                                                                  }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(Double          p) { return p;                                                                                   }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(Int16           p) { return p;                                                                                   }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(Int32           p) { return p;                                                                                   }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(Int64           p) { return p;                                                                                   }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlDouble ToSqlDouble(SByte           p) { return p;                                                                                   }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(Single          p) { return p;                                                                                   }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(String          p) { return p == null? SqlDouble.Null : Double.Parse(p);                                         }
+		/// <summary>Converts the value from <c>TimeSpan</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(TimeSpan        p) { return p.TotalDays;                                                                         }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlDouble ToSqlDouble(UInt16          p) { return p;                                                                                   }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlDouble ToSqlDouble(UInt32          p) { return p;                                                                                   }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlDouble ToSqlDouble(UInt64          p) { return p;                                                                                   }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(Boolean?        p) { return p.HasValue && p.Value ? (SqlDouble)1: (SqlDouble)0;                                  }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(Byte?           p) { return p.HasValue ? p.Value : SqlDouble.Null;                                               }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(Char?           p) { return p.HasValue ? p.Value : SqlDouble.Null;                                               }
+		/// <summary>Converts the value from <c>DateTime?</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(DateTime?       p) { return p.HasValue ? (p.Value - DateTime.MinValue).TotalDays : SqlDouble.Null;               }
+		/// <summary>Converts the value from <c>DateTimeOffset?</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(DateTimeOffset? p) { return p.HasValue ? (p.Value - DateTimeOffset.MinValue).TotalDays : SqlDouble.Null;         }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(Decimal?        p) { return p.HasValue ? checked((Double)p.Value) : SqlDouble.Null;                              }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(Double?         p) { return p.HasValue ? p.Value : SqlDouble.Null;                                               }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(Int16?          p) { return p.HasValue ? p.Value : SqlDouble.Null;                                               }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(Int32?          p) { return p.HasValue ? p.Value : SqlDouble.Null;                                               }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(Int64?          p) { return p.HasValue ? p.Value : SqlDouble.Null;                                               }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlDouble ToSqlDouble(SByte?          p) { return p.HasValue ? p.Value : SqlDouble.Null;                                               }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(Single?         p) { return p.HasValue ? p.Value : SqlDouble.Null;                                               }
+		/// <summary>Converts the value from <c>TimeSpan?</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(TimeSpan?       p) { return p.HasValue ? p.Value.TotalDays : SqlDouble.Null;                                     }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlDouble ToSqlDouble(UInt16?         p) { return p.HasValue ? p.Value : SqlDouble.Null;                                               }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlDouble ToSqlDouble(UInt32?         p) { return p.HasValue ? p.Value : SqlDouble.Null;                                               }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlDouble ToSqlDouble(UInt64?         p) { return p.HasValue ? p.Value : SqlDouble.Null;                                               }
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(SqlBoolean      p) { return p.ToSqlDouble();                                                                     }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(SqlByte         p) { return p.ToSqlDouble();                                                                     }
+		/// <summary>Converts the value from <c>SqlDateTime</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(SqlDateTime     p) { return p.IsNull? SqlDouble.Null: ToDouble(p.Value);                                         }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(SqlDecimal      p) { return p.ToSqlDouble();                                                                     }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(SqlInt16        p) { return p.ToSqlDouble();                                                                     }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(SqlInt32        p) { return p.ToSqlDouble();                                                                     }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(SqlInt64        p) { return p.ToSqlDouble();                                                                     }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(SqlMoney        p) { return p.ToSqlDouble();                                                                     }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(SqlSingle       p) { return p.ToSqlDouble();                                                                     }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(SqlString       p) { return p.ToSqlDouble();                                                                     }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(Binary          p) { return p == null || p.Length == 0 ? SqlDouble.Null : BitConverter.ToDouble(p.ToArray(), 0); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(Byte[]          p) { return p == null || p.Length == 0 ? SqlDouble.Null : BitConverter.ToDouble(p, 0);           }
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>SqlDouble</c> value.</summary>
+		public static SqlDouble ToSqlDouble(object p)
+		{
+			if (p == null) return SqlDouble.Null;
+
+			if (p is SqlDouble) return (SqlDouble)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull    : return SqlDouble.Null;
+				case TypeCode.DateTime  : return ToSqlDouble((DateTime) p);
+				case TypeCode.SByte     : return ToSqlDouble((SByte)    p);
+				case TypeCode.Int16     : return ToSqlDouble((Int16)    p);
+				case TypeCode.Int32     : return ToSqlDouble((Int32)    p);
+				case TypeCode.Int64     : return ToSqlDouble((Int64)    p);
+				case TypeCode.Byte      : return ToSqlDouble((Byte)     p);
+				case TypeCode.UInt16    : return ToSqlDouble((UInt16)   p);
+				case TypeCode.UInt32    : return ToSqlDouble((UInt32)   p);
+				case TypeCode.Char      : return ToSqlDouble((Char)     p);
+				case TypeCode.UInt64    : return ToSqlDouble((UInt64)   p);
+				case TypeCode.Single    : return ToSqlDouble((Single)   p);
+				case TypeCode.Double    : return ToSqlDouble((Double)   p);
+				case TypeCode.Decimal   : return ToSqlDouble((Decimal)  p);
+				case TypeCode.String    : return ToSqlDouble((String)   p);
+				case TypeCode.Boolean   : return ToSqlDouble((Boolean)  p);
+			}
+
+			// Simple Types
+			//
+			if (p is DateTimeOffset)  return ToSqlDouble((DateTimeOffset) p);
+			if (p is TimeSpan)        return ToSqlDouble((TimeSpan)       p);
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)        return ToSqlDouble((Boolean?)       p);
+				if (p is Byte?)           return ToSqlDouble((Byte?)          p);
+				if (p is Char?)           return ToSqlDouble((Char?)          p);
+				if (p is DateTime?)       return ToSqlDouble((DateTime?)      p);
+				if (p is DateTimeOffset?) return ToSqlDouble((DateTimeOffset?)p);
+				if (p is Decimal?)        return ToSqlDouble((Decimal?)       p);
+				if (p is Double?)         return ToSqlDouble((Double?)        p);
+				if (p is Int16?)          return ToSqlDouble((Int16?)         p);
+				if (p is Int32?)          return ToSqlDouble((Int32?)         p);
+				if (p is Int64?)          return ToSqlDouble((Int64?)         p);
+				if (p is SByte?)          return ToSqlDouble((SByte?)         p);
+				if (p is Single?)         return ToSqlDouble((Single?)        p);
+				if (p is TimeSpan?)       return ToSqlDouble((TimeSpan?)      p);
+				if (p is UInt16?)         return ToSqlDouble((UInt16?)        p);
+				if (p is UInt32?)         return ToSqlDouble((UInt32?)        p);
+				if (p is UInt64?)         return ToSqlDouble((UInt64?)        p);
+			}
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean)      return ToSqlDouble((SqlBoolean)     p);
+				if (p is SqlByte)         return ToSqlDouble((SqlByte)        p);
+				if (p is SqlDateTime)     return ToSqlDouble((SqlDateTime)    p);
+				if (p is SqlDecimal)      return ToSqlDouble((SqlDecimal)     p);
+				if (p is SqlInt16)        return ToSqlDouble((SqlInt16)       p);
+				if (p is SqlInt32)        return ToSqlDouble((SqlInt32)       p);
+				if (p is SqlInt64)        return ToSqlDouble((SqlInt64)       p);
+				if (p is SqlMoney)        return ToSqlDouble((SqlMoney)       p);
+				if (p is SqlSingle)       return ToSqlDouble((SqlSingle)      p);
+				if (p is SqlString)       return ToSqlDouble((SqlString)      p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)          return ToSqlDouble((Binary)         p);
+			if (p is Byte[])          return ToSqlDouble((Byte[])         p);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(SqlDouble));
+		}
+
+#endif
+
+		#endregion
+
+		#region SqlGuid
+
+#if !SILVERLIGHT
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Guid</c> to an equivalent <c>SqlGuid</c> value.</summary>
+		public static SqlGuid ToSqlGuid(Guid      p) { return p;                                                }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>SqlGuid</c> value.</summary>
+		public static SqlGuid ToSqlGuid(String    p) { return p == null ? SqlGuid.Null : new Guid(p);           }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Guid?</c> to an equivalent <c>SqlGuid</c> value.</summary>
+		public static SqlGuid ToSqlGuid(Guid?     p) { return p.HasValue ? p.Value : SqlGuid.Null;              }
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBinary</c> to an equivalent <c>SqlGuid</c> value.</summary>
+		public static SqlGuid ToSqlGuid(SqlBinary p) { return p.IsNull  ? SqlGuid.Null : p.ToSqlGuid().Value;   }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>SqlGuid</c> value.</summary>
+		public static SqlGuid ToSqlGuid(SqlString p) { return p.IsNull  ? SqlGuid.Null : new Guid(p.Value);     }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>SqlGuid</c> value.</summary>
+		public static SqlGuid ToSqlGuid(Binary    p) { return p == null ? SqlGuid.Null : new Guid(p.ToArray()); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>SqlGuid</c> value.</summary>
+		public static SqlGuid ToSqlGuid(Byte[]    p) { return p == null ? SqlGuid.Null : new Guid(p);           }
+		/// <summary>Converts the value from <c>Type</c> to an equivalent <c>SqlGuid</c> value.</summary>
+		public static SqlGuid ToSqlGuid(Type      p) { return p == null ? SqlGuid.Null : p.GUID;                }
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>SqlGuid</c> value.</summary>
+		public static SqlGuid ToSqlGuid(object p)
+		{
+			if (p == null) return SqlGuid.Null;
+
+			if (p is SqlGuid) return (SqlGuid)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull  : return SqlGuid.Null;
+				case TypeCode.String  : return ToSqlGuid((String) p);
+			}
+
+			// Simple Types
+			//
+			if (p is Guid)      return ToSqlGuid((Guid)     p);
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Guid?)     return ToSqlGuid((Guid?)    p);
+			}
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBinary) return ToSqlGuid((SqlBinary)p);
+				if (p is SqlString) return ToSqlGuid((SqlString)p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)    return ToSqlGuid((Binary)   p);
+			if (p is Byte[])    return ToSqlGuid((Byte[])   p);
+			if (p is Type)      return ToSqlGuid((Type)     p);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(SqlGuid));
+		}
+
+#endif
+
+		#endregion
+
+		#region SqlInt16
+
+#if !SILVERLIGHT
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(Boolean    p) { return p ? (SqlInt16)1 : (SqlInt16)0;                                                     }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(Byte       p) { return p;                                                                                 }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(Char       p) { return checked((Int16)p);                                                                 }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(Decimal    p) { return checked((Int16)p);                                                                 }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(Double     p) { return checked((Int16)p);                                                                 }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(Int16      p) { return p;                                                                                 }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(Int32      p) { return checked((Int16)p);                                                                 }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(Int64      p) { return checked((Int16)p);                                                                 }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlInt16 ToSqlInt16(SByte      p) { return p;                                                                                 }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(Single     p) { return checked((Int16)p);                                                                 }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(String     p) { return p == null? SqlInt16.Null : Int16.Parse(p);                                         }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlInt16 ToSqlInt16(UInt16     p) { return checked((Int16)p);                                                                 }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlInt16 ToSqlInt16(UInt32     p) { return checked((Int16)p);                                                                 }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlInt16 ToSqlInt16(UInt64     p) { return checked((Int16)p);                                                                 }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(Boolean?   p) { return p.HasValue && p.Value ? (SqlInt16)1: (SqlInt16)0;                                  }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(Byte?      p) { return p.HasValue ? p.Value : SqlInt16.Null;                                              }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(Char?      p) { return p.HasValue ? checked((Int16)p.Value) : SqlInt16.Null;                              }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(Decimal?   p) { return p.HasValue ? checked((Int16)p.Value) : SqlInt16.Null;                              }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(Double?    p) { return p.HasValue ? checked((Int16)p.Value) : SqlInt16.Null;                              }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(Int16?     p) { return p.HasValue ? p.Value : SqlInt16.Null;                                              }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(Int32?     p) { return p.HasValue ? checked((Int16)p.Value) : SqlInt16.Null;                              }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(Int64?     p) { return p.HasValue ? checked((Int16)p.Value) : SqlInt16.Null;                              }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlInt16 ToSqlInt16(SByte?     p) { return p.HasValue ? p.Value : SqlInt16.Null;                                              }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(Single?    p) { return p.HasValue ? checked((Int16)p.Value) : SqlInt16.Null;                              }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlInt16 ToSqlInt16(UInt16?    p) { return p.HasValue ? checked((Int16)p.Value) : SqlInt16.Null;                              }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlInt16 ToSqlInt16(UInt32?    p) { return p.HasValue ? checked((Int16)p.Value) : SqlInt16.Null;                              }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlInt16 ToSqlInt16(UInt64?    p) { return p.HasValue ? checked((Int16)p.Value) : SqlInt16.Null;                              }
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(SqlBoolean p) { return p.ToSqlInt16();                                                                    }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(SqlByte    p) { return p.ToSqlInt16();                                                                    }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(SqlDecimal p) { return p.ToSqlInt16();                                                                    }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(SqlDouble  p) { return p.ToSqlInt16();                                                                    }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(SqlInt32   p) { return p.ToSqlInt16();                                                                    }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(SqlInt64   p) { return p.ToSqlInt16();                                                                    }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(SqlMoney   p) { return p.ToSqlInt16();                                                                    }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(SqlSingle  p) { return p.ToSqlInt16();                                                                    }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(SqlString  p) { return p.ToSqlInt16();                                                                    }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(Binary     p) { return p == null || p.Length == 0 ? SqlInt16.Null : BitConverter.ToInt16(p.ToArray(), 0); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(Byte[]     p) { return p == null || p.Length == 0 ? SqlInt16.Null : BitConverter.ToInt16(p, 0);           }
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>SqlInt16</c> value.</summary>
+		public static SqlInt16 ToSqlInt16(object p)
+		{
+			if (p == null) return SqlInt16.Null;
+
+			if (p is SqlInt16) return (SqlInt16)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull   : return SqlInt16.Null;
+				case TypeCode.SByte    : return ToSqlInt16((SByte)   p);
+				case TypeCode.Int16    : return ToSqlInt16((Int16)   p);
+				case TypeCode.Byte     : return ToSqlInt16((Byte)    p);
+				case TypeCode.Int32    : return ToSqlInt16((Int32)   p);
+				case TypeCode.Int64    : return ToSqlInt16((Int64)   p);
+				case TypeCode.UInt16   : return ToSqlInt16((UInt16)  p);
+				case TypeCode.UInt32   : return ToSqlInt16((UInt32)  p);
+				case TypeCode.UInt64   : return ToSqlInt16((UInt64)  p);
+				case TypeCode.Single   : return ToSqlInt16((Single)  p);
+				case TypeCode.Double   : return ToSqlInt16((Double)  p);
+				case TypeCode.Decimal  : return ToSqlInt16((Decimal) p);
+				case TypeCode.Char     : return ToSqlInt16((Char)    p);
+				case TypeCode.String   : return ToSqlInt16((String)  p);
+				case TypeCode.Boolean  : return ToSqlInt16((Boolean) p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToSqlInt16((Boolean?)  p);
+				if (p is Byte?)      return ToSqlInt16((Byte?)     p);
+				if (p is Char?)      return ToSqlInt16((Char?)     p);
+				if (p is Decimal?)   return ToSqlInt16((Decimal?)  p);
+				if (p is Double?)    return ToSqlInt16((Double?)   p);
+				if (p is Int16?)     return ToSqlInt16((Int16?)    p);
+				if (p is Int32?)     return ToSqlInt16((Int32?)    p);
+				if (p is Int64?)     return ToSqlInt16((Int64?)    p);
+				if (p is SByte?)     return ToSqlInt16((SByte?)    p);
+				if (p is Single?)    return ToSqlInt16((Single?)   p);
+				if (p is UInt16?)    return ToSqlInt16((UInt16?)   p);
+				if (p is UInt32?)    return ToSqlInt16((UInt32?)   p);
+				if (p is UInt64?)    return ToSqlInt16((UInt64?)   p);
+			}
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToSqlInt16((SqlBoolean)p);
+				if (p is SqlByte)    return ToSqlInt16((SqlByte)   p);
+				if (p is SqlDecimal) return ToSqlInt16((SqlDecimal)p);
+				if (p is SqlDouble)  return ToSqlInt16((SqlDouble) p);
+				if (p is SqlInt32)   return ToSqlInt16((SqlInt32)  p);
+				if (p is SqlInt64)   return ToSqlInt16((SqlInt64)  p);
+				if (p is SqlMoney)   return ToSqlInt16((SqlMoney)  p);
+				if (p is SqlSingle)  return ToSqlInt16((SqlSingle) p);
+				if (p is SqlString)  return ToSqlInt16((SqlString) p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToSqlInt16((Binary)    p);
+			if (p is Byte[])     return ToSqlInt16((Byte[])    p);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(SqlInt16));
+		}
+
+#endif
+
+		#endregion
+
+		#region SqlInt32
+
+#if !SILVERLIGHT
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(Boolean    p) { return p ? (SqlInt32)1 : (SqlInt32)0;                                                     }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(Byte       p) { return p;                                                                                 }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(Char       p) { return p;                                                                                 }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(Decimal    p) { return checked((Int32)p);                                                                 }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(Double     p) { return checked((Int32)p);                                                                 }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(Int16      p) { return p;                                                                                 }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(Int32      p) { return p;                                                                                 }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(Int64      p) { return checked((Int32)p);                                                                 }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlInt32 ToSqlInt32(SByte      p) { return p;                                                                                 }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(Single     p) { return checked((Int32)p);                                                                 }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(String     p) { return p == null? SqlInt32.Null : Int32.Parse(p);                                         }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlInt32 ToSqlInt32(UInt16     p) { return p;                                                                                 }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlInt32 ToSqlInt32(UInt32     p) { return checked((Int32)p);                                                                 }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlInt32 ToSqlInt32(UInt64     p) { return checked((Int32)p);                                                                 }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(Boolean?   p) { return p.HasValue && p.Value ? (SqlInt32)1: (SqlInt32)0;                                  }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(Byte?      p) { return p.HasValue ? p.Value : SqlInt32.Null;                                              }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(Char?      p) { return p.HasValue ? p.Value : SqlInt32.Null;                                              }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(Decimal?   p) { return p.HasValue ? checked((Int32)p.Value) : SqlInt32.Null;                              }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(Double?    p) { return p.HasValue ? checked((Int32)p.Value) : SqlInt32.Null;                              }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(Int16?     p) { return p.HasValue ? p.Value : SqlInt32.Null;                                              }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(Int32?     p) { return p.HasValue ? p.Value : SqlInt32.Null;                                              }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(Int64?     p) { return p.HasValue ? checked((Int32)p.Value) : SqlInt32.Null;                              }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlInt32 ToSqlInt32(SByte?     p) { return p.HasValue ? p.Value : SqlInt32.Null;                                              }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(Single?    p) { return p.HasValue ? checked((Int32)p.Value) : SqlInt32.Null;                              }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlInt32 ToSqlInt32(UInt16?    p) { return p.HasValue ? p.Value : SqlInt32.Null;                                              }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlInt32 ToSqlInt32(UInt32?    p) { return p.HasValue ? checked((Int32)p.Value) : SqlInt32.Null;                              }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlInt32 ToSqlInt32(UInt64?    p) { return p.HasValue ? checked((Int32)p.Value) : SqlInt32.Null;                              }
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(SqlBoolean p) { return p.ToSqlInt32();                                                                    }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(SqlByte    p) { return p.ToSqlInt32();                                                                    }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(SqlDecimal p) { return p.ToSqlInt32();                                                                    }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(SqlDouble  p) { return p.ToSqlInt32();                                                                    }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(SqlInt16   p) { return p.ToSqlInt32();                                                                    }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(SqlInt64   p) { return p.ToSqlInt32();                                                                    }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(SqlMoney   p) { return p.ToSqlInt32();                                                                    }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(SqlSingle  p) { return p.ToSqlInt32();                                                                    }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(SqlString  p) { return p.ToSqlInt32();                                                                    }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(Binary     p) { return p == null || p.Length == 0 ? SqlInt32.Null : BitConverter.ToInt32(p.ToArray(), 0); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(Byte[]     p) { return p == null || p.Length == 0 ? SqlInt32.Null : BitConverter.ToInt32(p, 0);           }
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>SqlInt32</c> value.</summary>
+		public static SqlInt32 ToSqlInt32(object p)
+		{
+			if (p == null) return SqlInt32.Null;
+
+			if (p is SqlInt32) return (SqlInt32)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull   : return SqlInt32.Null;
+				case TypeCode.SByte    : return ToSqlInt32((SByte)   p);
+				case TypeCode.Int16    : return ToSqlInt32((Int16)   p);
+				case TypeCode.Int32    : return ToSqlInt32((Int32)   p);
+				case TypeCode.Byte     : return ToSqlInt32((Byte)    p);
+				case TypeCode.UInt16   : return ToSqlInt32((UInt16)  p);
+				case TypeCode.Char     : return ToSqlInt32((Char)    p);
+				case TypeCode.Int64    : return ToSqlInt32((Int64)   p);
+				case TypeCode.UInt32   : return ToSqlInt32((UInt32)  p);
+				case TypeCode.UInt64   : return ToSqlInt32((UInt64)  p);
+				case TypeCode.Single   : return ToSqlInt32((Single)  p);
+				case TypeCode.Double   : return ToSqlInt32((Double)  p);
+				case TypeCode.Decimal  : return ToSqlInt32((Decimal) p);
+				case TypeCode.String   : return ToSqlInt32((String)  p);
+				case TypeCode.Boolean  : return ToSqlInt32((Boolean) p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToSqlInt32((Boolean?)  p);
+				if (p is Byte?)      return ToSqlInt32((Byte?)     p);
+				if (p is Char?)      return ToSqlInt32((Char?)     p);
+				if (p is Decimal?)   return ToSqlInt32((Decimal?)  p);
+				if (p is Double?)    return ToSqlInt32((Double?)   p);
+				if (p is Int16?)     return ToSqlInt32((Int16?)    p);
+				if (p is Int32?)     return ToSqlInt32((Int32?)    p);
+				if (p is Int64?)     return ToSqlInt32((Int64?)    p);
+				if (p is SByte?)     return ToSqlInt32((SByte?)    p);
+				if (p is Single?)    return ToSqlInt32((Single?)   p);
+				if (p is UInt16?)    return ToSqlInt32((UInt16?)   p);
+				if (p is UInt32?)    return ToSqlInt32((UInt32?)   p);
+				if (p is UInt64?)    return ToSqlInt32((UInt64?)   p);
+			}
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToSqlInt32((SqlBoolean)p);
+				if (p is SqlByte)    return ToSqlInt32((SqlByte)   p);
+				if (p is SqlDecimal) return ToSqlInt32((SqlDecimal)p);
+				if (p is SqlDouble)  return ToSqlInt32((SqlDouble) p);
+				if (p is SqlInt16)   return ToSqlInt32((SqlInt16)  p);
+				if (p is SqlInt64)   return ToSqlInt32((SqlInt64)  p);
+				if (p is SqlMoney)   return ToSqlInt32((SqlMoney)  p);
+				if (p is SqlSingle)  return ToSqlInt32((SqlSingle) p);
+				if (p is SqlString)  return ToSqlInt32((SqlString) p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToSqlInt32((Binary)    p);
+			if (p is Byte[])     return ToSqlInt32((Byte[])    p);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(SqlInt32));
+		}
+
+#endif
+
+		#endregion
+
+		#region SqlInt64
+
+#if !SILVERLIGHT
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(Boolean         p) { return p ? (SqlInt64)1 : (SqlInt64)0;                                                     }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(Byte            p) { return p;                                                                                 }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(Char            p) { return p;                                                                                 }
+		/// <summary>Converts the value from <c>DateTime</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(DateTime        p) { return (p - DateTime.MinValue).Ticks;                                                     }
+		/// <summary>Converts the value from <c>DateTimeOffset</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(DateTimeOffset  p) { return (p - DateTime.MinValue).Ticks;                                                     }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(Decimal         p) { return checked((Int64)p);                                                                 }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(Double          p) { return checked((Int64)p);                                                                 }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(Int16           p) { return p;                                                                                 }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(Int32           p) { return p;                                                                                 }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(Int64           p) { return p;                                                                                 }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlInt64 ToSqlInt64(SByte           p) { return p;                                                                                 }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(Single          p) { return checked((Int64)p);                                                                 }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(String          p) { return p == null? SqlInt64.Null : Int64.Parse(p);                                         }
+		/// <summary>Converts the value from <c>TimeSpan</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(TimeSpan        p) { return p.Ticks;                                                                           }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlInt64 ToSqlInt64(UInt16          p) { return p;                                                                                 }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlInt64 ToSqlInt64(UInt32          p) { return p;                                                                                 }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlInt64 ToSqlInt64(UInt64          p) { return checked((Int64)p);                                                                 }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(Boolean?        p) { return p.HasValue && p.Value ? (SqlInt64)1: (SqlInt64)0;                                  }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(Byte?           p) { return p.HasValue ? p.Value : SqlInt64.Null;                                              }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(Char?           p) { return p.HasValue ? p.Value : SqlInt64.Null;                                              }
+		/// <summary>Converts the value from <c>DateTime?</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(DateTime?       p) { return p.HasValue ? (p.Value - DateTime.MinValue).Ticks : 0;                              }
+		/// <summary>Converts the value from <c>DateTimeOffset?</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(DateTimeOffset? p) { return p.HasValue ? (p.Value - DateTime.MinValue).Ticks : 0;                              }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(Decimal?        p) { return p.HasValue ? checked((Int64)p.Value) : SqlInt64.Null;                              }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(Double?         p) { return p.HasValue ? checked((Int64)p.Value) : SqlInt64.Null;                              }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(Int16?          p) { return p.HasValue ? p.Value : SqlInt64.Null;                                              }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(Int32?          p) { return p.HasValue ? p.Value : SqlInt64.Null;                                              }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(Int64?          p) { return p.HasValue ? p.Value : SqlInt64.Null;                                              }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlInt64 ToSqlInt64(SByte?          p) { return p.HasValue ? p.Value : SqlInt64.Null;                                              }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(Single?         p) { return p.HasValue ? checked((Int64)p.Value) : SqlInt64.Null;                              }
+		/// <summary>Converts the value from <c>TimeSpan?</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(TimeSpan?       p) { return p.HasValue ? p.Value.Ticks : 0;                                                    }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlInt64 ToSqlInt64(UInt16?         p) { return p.HasValue ? p.Value : SqlInt64.Null;                                              }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlInt64 ToSqlInt64(UInt32?         p) { return p.HasValue ? p.Value : SqlInt64.Null;                                              }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlInt64 ToSqlInt64(UInt64?         p) { return p.HasValue ? checked((Int64)p.Value) : SqlInt64.Null;                              }
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(SqlBoolean      p) { return p.ToSqlInt64();                                                                    }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(SqlByte         p) { return p.ToSqlInt64();                                                                    }
+		/// <summary>Converts the value from <c>SqlDateTime</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(SqlDateTime     p) { return p.IsNull? SqlInt64.Null: ToInt64(p.Value);                                         }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(SqlDecimal      p) { return p.ToSqlInt64();                                                                    }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(SqlDouble       p) { return p.ToSqlInt64();                                                                    }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(SqlInt16        p) { return p.ToSqlInt64();                                                                    }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(SqlInt32        p) { return p.ToSqlInt64();                                                                    }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(SqlMoney        p) { return p.ToSqlInt64();                                                                    }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(SqlSingle       p) { return p.ToSqlInt64();                                                                    }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(SqlString       p) { return p.ToSqlInt64();                                                                    }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(Binary          p) { return p == null || p.Length == 0 ? SqlInt64.Null : BitConverter.ToInt64(p.ToArray(), 0); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(Byte[]          p) { return p == null || p.Length == 0 ? SqlInt64.Null : BitConverter.ToInt64(p, 0);           }
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>SqlInt64</c> value.</summary>
+		public static SqlInt64 ToSqlInt64(object p)
+		{
+			if (p == null) return SqlInt64.Null;
+
+			if (p is SqlInt64) return (SqlInt64)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull   : return SqlInt64.Null;
+				case TypeCode.DateTime : return ToSqlInt64((DateTime)p);
+				case TypeCode.SByte    : return ToSqlInt64((SByte)   p);
+				case TypeCode.Int16    : return ToSqlInt64((Int16)   p);
+				case TypeCode.Int32    : return ToSqlInt64((Int32)   p);
+				case TypeCode.Int64    : return ToSqlInt64((Int64)   p);
+				case TypeCode.Byte     : return ToSqlInt64((Byte)    p);
+				case TypeCode.UInt16   : return ToSqlInt64((UInt16)  p);
+				case TypeCode.UInt32   : return ToSqlInt64((UInt32)  p);
+				case TypeCode.Char     : return ToSqlInt64((Char)    p);
+				case TypeCode.UInt64   : return ToSqlInt64((UInt64)  p);
+				case TypeCode.Single   : return ToSqlInt64((Single)  p);
+				case TypeCode.Double   : return ToSqlInt64((Double)  p);
+				case TypeCode.Decimal  : return ToSqlInt64((Decimal) p);
+				case TypeCode.String   : return ToSqlInt64((String)  p);
+				case TypeCode.Boolean  : return ToSqlInt64((Boolean) p);
+			}
+
+			// Simple Types
+			//
+			if (p is DateTimeOffset)  return ToSqlInt64((DateTimeOffset) p);
+			if (p is TimeSpan)        return ToSqlInt64((TimeSpan)       p);
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)        return ToSqlInt64((Boolean?)       p);
+				if (p is Byte?)           return ToSqlInt64((Byte?)          p);
+				if (p is Char?)           return ToSqlInt64((Char?)          p);
+				if (p is DateTime?)       return ToSqlInt64((DateTime?)      p);
+				if (p is DateTimeOffset?) return ToSqlInt64((DateTimeOffset?)p);
+				if (p is Decimal?)        return ToSqlInt64((Decimal?)       p);
+				if (p is Double?)         return ToSqlInt64((Double?)        p);
+				if (p is Int16?)          return ToSqlInt64((Int16?)         p);
+				if (p is Int32?)          return ToSqlInt64((Int32?)         p);
+				if (p is Int64?)          return ToSqlInt64((Int64?)         p);
+				if (p is SByte?)          return ToSqlInt64((SByte?)         p);
+				if (p is Single?)         return ToSqlInt64((Single?)        p);
+				if (p is TimeSpan?)       return ToSqlInt64((TimeSpan?)      p);
+				if (p is UInt16?)         return ToSqlInt64((UInt16?)        p);
+				if (p is UInt32?)         return ToSqlInt64((UInt32?)        p);
+				if (p is UInt64?)         return ToSqlInt64((UInt64?)        p);
+			}
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean)      return ToSqlInt64((SqlBoolean)     p);
+				if (p is SqlByte)         return ToSqlInt64((SqlByte)        p);
+				if (p is SqlDateTime)     return ToSqlInt64((SqlDateTime)    p);
+				if (p is SqlDecimal)      return ToSqlInt64((SqlDecimal)     p);
+				if (p is SqlDouble)       return ToSqlInt64((SqlDouble)      p);
+				if (p is SqlInt16)        return ToSqlInt64((SqlInt16)       p);
+				if (p is SqlInt32)        return ToSqlInt64((SqlInt32)       p);
+				if (p is SqlMoney)        return ToSqlInt64((SqlMoney)       p);
+				if (p is SqlSingle)       return ToSqlInt64((SqlSingle)      p);
+				if (p is SqlString)       return ToSqlInt64((SqlString)      p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)          return ToSqlInt64((Binary)         p);
+			if (p is Byte[])          return ToSqlInt64((Byte[])         p);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(SqlInt64));
+		}
+
+#endif
+
+		#endregion
+
+		#region SqlMoney
+
+#if !SILVERLIGHT
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(Boolean    p) { return p ? (SqlMoney)1 : (SqlMoney)0;                             }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(Byte       p) { return p;                                                         }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(Char       p) { return p;                                                         }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(Decimal    p) { return p;                                                         }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(Double     p) { return checked((Decimal)p);                                       }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(Int16      p) { return p;                                                         }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(Int32      p) { return p;                                                         }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(Int64      p) { return p;                                                         }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlMoney ToSqlMoney(SByte      p) { return p;                                                         }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(Single     p) { return checked((Decimal)p);                                       }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(String     p) { return p == null? SqlMoney.Null : Decimal.Parse(p);               }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlMoney ToSqlMoney(UInt16     p) { return p;                                                         }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlMoney ToSqlMoney(UInt32     p) { return p;                                                         }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlMoney ToSqlMoney(UInt64     p) { return p;                                                         }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(Boolean?   p) { return p.HasValue && p.Value ? (SqlMoney)1: (SqlMoney)0;          }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(Byte?      p) { return p.HasValue ? p.Value : SqlMoney.Null;                      }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(Char?      p) { return p.HasValue ? p.Value : SqlMoney.Null;                      }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(Decimal?   p) { return p.HasValue ? p.Value : SqlMoney.Null;                      }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(Double?    p) { return p.HasValue ? checked((Decimal)p.Value) : SqlMoney.Null;    }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(Int16?     p) { return p.HasValue ? p.Value : SqlMoney.Null;                      }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(Int32?     p) { return p.HasValue ? p.Value : SqlMoney.Null;                      }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(Int64?     p) { return p.HasValue ? p.Value : SqlMoney.Null;                      }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlMoney ToSqlMoney(SByte?     p) { return p.HasValue ? p.Value : SqlMoney.Null;                      }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(Single?    p) { return p.HasValue ? checked((Decimal)p.Value) : SqlMoney.Null;    }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlMoney ToSqlMoney(UInt16?    p) { return p.HasValue ? p.Value : SqlMoney.Null;                      }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlMoney ToSqlMoney(UInt32?    p) { return p.HasValue ? p.Value : SqlMoney.Null;                      }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlMoney ToSqlMoney(UInt64?    p) { return p.HasValue ? p.Value : SqlMoney.Null;                      }
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(SqlBoolean p) { return p.ToSqlMoney();                                            }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(SqlByte    p) { return p.ToSqlMoney();                                            }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(SqlDecimal p) { return p.ToSqlMoney();                                            }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(SqlDouble  p) { return p.ToSqlMoney();                                            }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(SqlInt16   p) { return p.ToSqlMoney();                                            }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(SqlInt32   p) { return p.ToSqlMoney();                                            }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(SqlInt64   p) { return p.ToSqlMoney();                                            }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(SqlSingle  p) { return p.ToSqlMoney();                                            }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(SqlString  p) { return p.ToSqlMoney();                                            }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(Binary     p) { return p == null || p.Length == 0 ? SqlMoney.Null : ToDecimal(p); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(Byte[]     p) { return p == null || p.Length == 0 ? SqlMoney.Null : ToDecimal(p); }
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>SqlMoney</c> value.</summary>
+		public static SqlMoney ToSqlMoney(object p)
+		{
+			if (p == null) return SqlMoney.Null;
+
+			if (p is SqlMoney) return (SqlMoney)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull   : return SqlMoney.Null;
+				case TypeCode.SByte    : return ToSqlMoney((SByte)   p);
+				case TypeCode.Int16    : return ToSqlMoney((Int16)   p);
+				case TypeCode.Int32    : return ToSqlMoney((Int32)   p);
+				case TypeCode.Int64    : return ToSqlMoney((Int64)   p);
+				case TypeCode.Byte     : return ToSqlMoney((Byte)    p);
+				case TypeCode.UInt16   : return ToSqlMoney((UInt16)  p);
+				case TypeCode.UInt32   : return ToSqlMoney((UInt32)  p);
+				case TypeCode.Char     : return ToSqlMoney((Char)    p);
+				case TypeCode.UInt64   : return ToSqlMoney((UInt64)  p);
+				case TypeCode.Decimal  : return ToSqlMoney((Decimal) p);
+				case TypeCode.Single   : return ToSqlMoney((Single)  p);
+				case TypeCode.Double   : return ToSqlMoney((Double)  p);
+				case TypeCode.String   : return ToSqlMoney((String)  p);
+				case TypeCode.Boolean  : return ToSqlMoney((Boolean) p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToSqlMoney((Boolean?)  p);
+				if (p is Byte?)      return ToSqlMoney((Byte?)     p);
+				if (p is Char?)      return ToSqlMoney((Char?)     p);
+				if (p is Decimal?)   return ToSqlMoney((Decimal?)  p);
+				if (p is Double?)    return ToSqlMoney((Double?)   p);
+				if (p is Int16?)     return ToSqlMoney((Int16?)    p);
+				if (p is Int32?)     return ToSqlMoney((Int32?)    p);
+				if (p is Int64?)     return ToSqlMoney((Int64?)    p);
+				if (p is SByte?)     return ToSqlMoney((SByte?)    p);
+				if (p is Single?)    return ToSqlMoney((Single?)   p);
+				if (p is UInt16?)    return ToSqlMoney((UInt16?)   p);
+				if (p is UInt32?)    return ToSqlMoney((UInt32?)   p);
+				if (p is UInt64?)    return ToSqlMoney((UInt64?)   p);
+			}
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToSqlMoney((SqlBoolean)p);
+				if (p is SqlByte)    return ToSqlMoney((SqlByte)   p);
+				if (p is SqlDecimal) return ToSqlMoney((SqlDecimal)p);
+				if (p is SqlDouble)  return ToSqlMoney((SqlDouble) p);
+				if (p is SqlInt16)   return ToSqlMoney((SqlInt16)  p);
+				if (p is SqlInt32)   return ToSqlMoney((SqlInt32)  p);
+				if (p is SqlInt64)   return ToSqlMoney((SqlInt64)  p);
+				if (p is SqlSingle)  return ToSqlMoney((SqlSingle) p);
+				if (p is SqlString)  return ToSqlMoney((SqlString) p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToSqlMoney((Binary)    p);
+			if (p is Byte[])     return ToSqlMoney((Byte[])    p);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(SqlMoney));
+		}
+
+#endif
+
+		#endregion
+
+		#region SqlSingle
+
+#if !SILVERLIGHT
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(Boolean    p) { return p ? (SqlSingle)1 : (SqlSingle)0;                                                     }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(Byte       p) { return p;                                                                                   }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(Char       p) { return p;                                                                                   }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(Decimal    p) { return checked((Single)p);                                                                  }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(Double     p) { return checked((Single)p);                                                                  }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(Int16      p) { return p;                                                                                   }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(Int32      p) { return p;                                                                                   }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(Int64      p) { return p;                                                                                   }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlSingle ToSqlSingle(SByte      p) { return p;                                                                                   }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(Single     p) { return p;                                                                                   }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(String     p) { return p == null? SqlSingle.Null : Single.Parse(p);                                         }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlSingle ToSqlSingle(UInt16     p) { return p;                                                                                   }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlSingle ToSqlSingle(UInt32     p) { return p;                                                                                   }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlSingle ToSqlSingle(UInt64     p) { return p;                                                                                   }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(Boolean?   p) { return p.HasValue && p.Value ? (SqlSingle)1: (SqlSingle)0;                                  }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(Byte?      p) { return p.HasValue ? p.Value : SqlSingle.Null;                                               }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(Char?      p) { return p.HasValue ? p.Value : SqlSingle.Null;                                               }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(Decimal?   p) { return p.HasValue ? checked((Single)p.Value) : SqlSingle.Null;                              }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(Double?    p) { return p.HasValue ? checked((Single)p.Value) : SqlSingle.Null;                              }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(Int16?     p) { return p.HasValue ? p.Value : SqlSingle.Null;                                               }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(Int32?     p) { return p.HasValue ? p.Value : SqlSingle.Null;                                               }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(Int64?     p) { return p.HasValue ? p.Value : SqlSingle.Null;                                               }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlSingle ToSqlSingle(SByte?     p) { return p.HasValue ? p.Value : SqlSingle.Null;                                               }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(Single?    p) { return p.HasValue ? p.Value : SqlSingle.Null;                                               }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlSingle ToSqlSingle(UInt16?    p) { return p.HasValue ? p.Value : SqlSingle.Null;                                               }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlSingle ToSqlSingle(UInt32?    p) { return p.HasValue ? p.Value : SqlSingle.Null;                                               }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlSingle ToSqlSingle(UInt64?    p) { return p.HasValue ? p.Value : SqlSingle.Null;                                               }
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(SqlBoolean p) { return p.ToSqlSingle();                                                                     }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(SqlByte    p) { return p.ToSqlSingle();                                                                     }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(SqlDecimal p) { return p.ToSqlSingle();                                                                     }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(SqlDouble  p) { return p.ToSqlSingle();                                                                     }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(SqlInt16   p) { return p.ToSqlSingle();                                                                     }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(SqlInt32   p) { return p.ToSqlSingle();                                                                     }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(SqlInt64   p) { return p.ToSqlSingle();                                                                     }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(SqlMoney   p) { return p.ToSqlSingle();                                                                     }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(SqlString  p) { return p.ToSqlSingle();                                                                     }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(Binary     p) { return p == null || p.Length == 0 ? SqlSingle.Null : BitConverter.ToSingle(p.ToArray(), 0); }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(Byte[]     p) { return p == null || p.Length == 0 ? SqlSingle.Null : BitConverter.ToSingle(p, 0);           }
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>SqlSingle</c> value.</summary>
+		public static SqlSingle ToSqlSingle(object p)
+		{
+			if (p == null) return SqlSingle.Null;
+
+			if (p is SqlSingle) return (SqlSingle)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull    : return SqlSingle.Null;
+				case TypeCode.SByte     : return ToSqlSingle((SByte)    p);
+				case TypeCode.Int16     : return ToSqlSingle((Int16)    p);
+				case TypeCode.Int32     : return ToSqlSingle((Int32)    p);
+				case TypeCode.Int64     : return ToSqlSingle((Int64)    p);
+				case TypeCode.Byte      : return ToSqlSingle((Byte)     p);
+				case TypeCode.UInt16    : return ToSqlSingle((UInt16)   p);
+				case TypeCode.UInt32    : return ToSqlSingle((UInt32)   p);
+				case TypeCode.Char      : return ToSqlSingle((Char)     p);
+				case TypeCode.UInt64    : return ToSqlSingle((UInt64)   p);
+				case TypeCode.Single    : return ToSqlSingle((Single)   p);
+				case TypeCode.Double    : return ToSqlSingle((Double)   p);
+				case TypeCode.Decimal   : return ToSqlSingle((Decimal)  p);
+				case TypeCode.String    : return ToSqlSingle((String)   p);
+				case TypeCode.Boolean   : return ToSqlSingle((Boolean)  p);
+			}
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)   return ToSqlSingle((Boolean?)  p);
+				if (p is Byte?)      return ToSqlSingle((Byte?)     p);
+				if (p is Char?)      return ToSqlSingle((Char?)     p);
+				if (p is Decimal?)   return ToSqlSingle((Decimal?)  p);
+				if (p is Double?)    return ToSqlSingle((Double?)   p);
+				if (p is Int16?)     return ToSqlSingle((Int16?)    p);
+				if (p is Int32?)     return ToSqlSingle((Int32?)    p);
+				if (p is Int64?)     return ToSqlSingle((Int64?)    p);
+				if (p is SByte?)     return ToSqlSingle((SByte?)    p);
+				if (p is Single?)    return ToSqlSingle((Single?)   p);
+				if (p is UInt16?)    return ToSqlSingle((UInt16?)   p);
+				if (p is UInt32?)    return ToSqlSingle((UInt32?)   p);
+				if (p is UInt64?)    return ToSqlSingle((UInt64?)   p);
+			}
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean) return ToSqlSingle((SqlBoolean)p);
+				if (p is SqlByte)    return ToSqlSingle((SqlByte)   p);
+				if (p is SqlDecimal) return ToSqlSingle((SqlDecimal)p);
+				if (p is SqlDouble)  return ToSqlSingle((SqlDouble) p);
+				if (p is SqlInt16)   return ToSqlSingle((SqlInt16)  p);
+				if (p is SqlInt32)   return ToSqlSingle((SqlInt32)  p);
+				if (p is SqlInt64)   return ToSqlSingle((SqlInt64)  p);
+				if (p is SqlMoney)   return ToSqlSingle((SqlMoney)  p);
+				if (p is SqlString)  return ToSqlSingle((SqlString) p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)     return ToSqlSingle((Binary)    p);
+			if (p is Byte[])     return ToSqlSingle((Byte[])    p);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(SqlSingle));
+		}
+
+#endif
+
+		#endregion
+
+		#region SqlString
+
+#if !SILVERLIGHT
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(Boolean         p) { return p.ToString();                                                                     }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(Byte            p) { return p.ToString();                                                                     }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(Char            p) { return p.ToString();                                                                     }
+		/// <summary>Converts the value from <c>DateTime</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(DateTime        p) { return p.ToString();                                                                     }
+		/// <summary>Converts the value from <c>DateTimeOffset</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(DateTimeOffset  p) { return p.ToString();                                                                     }
+		/// <summary>Converts the value from <c>Decimal</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(Decimal         p) { return p.ToString();                                                                     }
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(Double          p) { return p.ToString();                                                                     }
+		/// <summary>Converts the value from <c>Guid</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(Guid            p) { return p.ToString();                                                                     }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(Int16           p) { return p.ToString();                                                                     }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(Int32           p) { return p.ToString();                                                                     }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(Int64           p) { return p.ToString();                                                                     }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>SqlString</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlString ToSqlString(SByte           p) { return p.ToString();                                                                     }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(Single          p) { return p.ToString();                                                                     }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(String          p) { return p ?? SqlString.Null;                                                              }
+		/// <summary>Converts the value from <c>TimeSpan</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(TimeSpan        p) { return p.ToString();                                                                     }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>SqlString</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlString ToSqlString(UInt16          p) { return p.ToString();                                                                     }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>SqlString</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlString ToSqlString(UInt32          p) { return p.ToString();                                                                     }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>SqlString</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlString ToSqlString(UInt64          p) { return p.ToString();                                                                     }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(Boolean?        p) { return p.HasValue ? p.Value.ToString() : SqlString.Null;                                 }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(Byte?           p) { return p.HasValue ? p.Value.ToString() : SqlString.Null;                                 }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(Char?           p) { return p.HasValue ? p.Value.ToString() : SqlString.Null;                                 }
+		/// <summary>Converts the value from <c>DateTime?</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(DateTime?       p) { return p.HasValue ? p.Value.ToString() : SqlString.Null;                                 }
+		/// <summary>Converts the value from <c>DateTimeOffset?</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(DateTimeOffset? p) { return p.HasValue ? p.Value.ToString() : SqlString.Null;                                 }
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(Decimal?        p) { return p.HasValue ? p.Value.ToString() : SqlString.Null;                                 }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(Double?         p) { return p.HasValue ? p.Value.ToString() : SqlString.Null;                                 }
+		/// <summary>Converts the value from <c>Guid?</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(Guid?           p) { return p.HasValue ? p.Value.ToString() : SqlString.Null;                                 }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(Int16?          p) { return p.HasValue ? p.Value.ToString() : SqlString.Null;                                 }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(Int32?          p) { return p.HasValue ? p.Value.ToString() : SqlString.Null;                                 }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(Int64?          p) { return p.HasValue ? p.Value.ToString() : SqlString.Null;                                 }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>SqlString</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlString ToSqlString(SByte?          p) { return p.HasValue ? p.Value.ToString() : SqlString.Null;                                 }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(Single?         p) { return p.HasValue ? p.Value.ToString() : SqlString.Null;                                 }
+		/// <summary>Converts the value from <c>TimeSpan?</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(TimeSpan?       p) { return p.HasValue ? p.Value.ToString() : SqlString.Null;                                 }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>SqlString</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlString ToSqlString(UInt16?         p) { return p.HasValue ? p.Value.ToString() : SqlString.Null;                                 }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>SqlString</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlString ToSqlString(UInt32?         p) { return p.HasValue ? p.Value.ToString() : SqlString.Null;                                 }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>SqlString</c> value.</summary>
+		[CLSCompliant(false)]
+		public static SqlString ToSqlString(UInt64?         p) { return p.HasValue ? p.Value.ToString() : SqlString.Null;                                 }
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(SqlBoolean      p) { return p.ToSqlString();                                                                  }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(SqlByte         p) { return p.ToSqlString();                                                                  }
+		/// <summary>Converts the value from <c>SqlChars</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(SqlChars        p) { return p.ToSqlString();                                                                  }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(SqlDecimal      p) { return p.ToSqlString();                                                                  }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(SqlDouble       p) { return p.ToSqlString();                                                                  }
+		/// <summary>Converts the value from <c>SqlGuid</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(SqlGuid         p) { return p.ToSqlString();                                                                  }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(SqlInt16        p) { return p.ToSqlString();                                                                  }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(SqlInt32        p) { return p.ToSqlString();                                                                  }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(SqlInt64        p) { return p.ToSqlString();                                                                  }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(SqlMoney        p) { return p.ToSqlString();                                                                  }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(SqlSingle       p) { return p.ToSqlString();                                                                  }
+		/// <summary>Converts the value from <c>SqlXml</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(SqlXml          p) { return p.IsNull ? SqlString.Null : p.Value;                                              }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(Binary          p) { return ToSqlString(p.ToArray());                                                         }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(Byte[]          p) { return p == null ? SqlString.Null : System.Text.Encoding.UTF8.GetString(p, 0, p.Length); }
+		/// <summary>Converts the value from <c>Type</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(Type            p) { return p == null ? SqlString.Null : p.FullName;                                          }
+		/// <summary>Converts the value from <c>XElement</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(XElement        p) { return p == null ? SqlString.Null : p.ToString();                                        }
+		/// <summary>Converts the value from <c>XmlDocument</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(XmlDocument     p) { return p == null ? SqlString.Null : p.InnerXml;                                          }
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>SqlString</c> value.</summary>
+		public static SqlString ToSqlString(object p)
+		{
+			if (p == null) return SqlString.Null;
+
+			if (p is SqlString) return (SqlString)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull    : return SqlString.Null;
+				case TypeCode.SByte     : return ToSqlString((SByte)    p);
+				case TypeCode.Int16     : return ToSqlString((Int16)    p);
+				case TypeCode.Int32     : return ToSqlString((Int32)    p);
+				case TypeCode.Int64     : return ToSqlString((Int64)    p);
+				case TypeCode.Byte      : return ToSqlString((Byte)     p);
+				case TypeCode.UInt16    : return ToSqlString((UInt16)   p);
+				case TypeCode.UInt32    : return ToSqlString((UInt32)   p);
+				case TypeCode.UInt64    : return ToSqlString((UInt64)   p);
+				case TypeCode.Single    : return ToSqlString((Single)   p);
+				case TypeCode.Double    : return ToSqlString((Double)   p);
+				case TypeCode.Boolean   : return ToSqlString((Boolean)  p);
+				case TypeCode.Decimal   : return ToSqlString((Decimal)  p);
+				case TypeCode.Char      : return ToSqlString((Char)     p);
+				case TypeCode.DateTime  : return ToSqlString((DateTime) p);
+				case TypeCode.String    : return ToSqlString((String)   p);
+			}
+
+			// Simple Types
+			//
+			if (p is DateTimeOffset)  return ToSqlString((DateTimeOffset) p);
+			if (p is Guid)            return ToSqlString((Guid)           p);
+			if (p is TimeSpan)        return ToSqlString((TimeSpan)       p);
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)        return ToSqlString((Boolean?)       p);
+				if (p is Byte?)           return ToSqlString((Byte?)          p);
+				if (p is Char?)           return ToSqlString((Char?)          p);
+				if (p is DateTime?)       return ToSqlString((DateTime?)      p);
+				if (p is DateTimeOffset?) return ToSqlString((DateTimeOffset?)p);
+				if (p is Decimal?)        return ToSqlString((Decimal?)       p);
+				if (p is Double?)         return ToSqlString((Double?)        p);
+				if (p is Guid?)           return ToSqlString((Guid?)          p);
+				if (p is Int16?)          return ToSqlString((Int16?)         p);
+				if (p is Int32?)          return ToSqlString((Int32?)         p);
+				if (p is Int64?)          return ToSqlString((Int64?)         p);
+				if (p is SByte?)          return ToSqlString((SByte?)         p);
+				if (p is Single?)         return ToSqlString((Single?)        p);
+				if (p is TimeSpan?)       return ToSqlString((TimeSpan?)      p);
+				if (p is UInt16?)         return ToSqlString((UInt16?)        p);
+				if (p is UInt32?)         return ToSqlString((UInt32?)        p);
+				if (p is UInt64?)         return ToSqlString((UInt64?)        p);
+			}
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBoolean)      return ToSqlString((SqlBoolean)     p);
+				if (p is SqlByte)         return ToSqlString((SqlByte)        p);
+				if (p is SqlChars)        return ToSqlString((SqlChars)       p);
+				if (p is SqlDecimal)      return ToSqlString((SqlDecimal)     p);
+				if (p is SqlDouble)       return ToSqlString((SqlDouble)      p);
+				if (p is SqlGuid)         return ToSqlString((SqlGuid)        p);
+				if (p is SqlInt16)        return ToSqlString((SqlInt16)       p);
+				if (p is SqlInt32)        return ToSqlString((SqlInt32)       p);
+				if (p is SqlInt64)        return ToSqlString((SqlInt64)       p);
+				if (p is SqlMoney)        return ToSqlString((SqlMoney)       p);
+				if (p is SqlSingle)       return ToSqlString((SqlSingle)      p);
+				if (p is SqlXml)          return ToSqlString((SqlXml)         p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)          return ToSqlString((Binary)         p);
+			if (p is Byte[])          return ToSqlString((Byte[])         p);
+			if (p is Type)            return ToSqlString((Type)           p);
+			if (p is XElement)        return ToSqlString((XElement)       p);
+			if (p is XmlDocument)     return ToSqlString((XmlDocument)    p);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(SqlString));
+		}
+
+#endif
+
+		#endregion
+
+		#region SqlXml
+
+#if !SILVERLIGHT
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>SqlXml</c> value.</summary>
+		public static SqlXml ToSqlXml(String      p) { return p == null ? SqlXml.Null : new SqlXml(new XmlTextReader(new StringReader(p)));                    }
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBinary</c> to an equivalent <c>SqlXml</c> value.</summary>
+		public static SqlXml ToSqlXml(SqlBinary   p) { return p.IsNull ? SqlXml.Null : new SqlXml(new MemoryStream(p.Value));                                  }
+		/// <summary>Converts the value from <c>SqlBytes</c> to an equivalent <c>SqlXml</c> value.</summary>
+		public static SqlXml ToSqlXml(SqlBytes    p) { return p.IsNull ? SqlXml.Null : new SqlXml(p.Stream);                                                   }
+		/// <summary>Converts the value from <c>SqlChars</c> to an equivalent <c>SqlXml</c> value.</summary>
+		public static SqlXml ToSqlXml(SqlChars    p) { return p.IsNull ? SqlXml.Null : new SqlXml(new XmlTextReader(new StringReader(p.ToSqlString().Value))); }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>SqlXml</c> value.</summary>
+		public static SqlXml ToSqlXml(SqlString   p) { return p.IsNull ? SqlXml.Null : new SqlXml(new XmlTextReader(new StringReader(p.Value)));               }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>SqlXml</c> value.</summary>
+		public static SqlXml ToSqlXml(Binary      p) { return p == null ? SqlXml.Null : new SqlXml(new MemoryStream(p.ToArray()));                             }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>SqlXml</c> value.</summary>
+		public static SqlXml ToSqlXml(Byte[]      p) { return p == null ? SqlXml.Null : new SqlXml(new MemoryStream(p));                                       }
+		/// <summary>Converts the value from <c>Char[]</c> to an equivalent <c>SqlXml</c> value.</summary>
+		public static SqlXml ToSqlXml(Char[]      p) { return p == null ? SqlXml.Null : new SqlXml(new XmlTextReader(new StringReader(new string(p))));        }
+		/// <summary>Converts the value from <c>Stream</c> to an equivalent <c>SqlXml</c> value.</summary>
+		public static SqlXml ToSqlXml(Stream      p) { return p == null ? SqlXml.Null : new SqlXml(p);                                                         }
+		/// <summary>Converts the value from <c>XElement</c> to an equivalent <c>SqlXml</c> value.</summary>
+		public static SqlXml ToSqlXml(XElement    p) { return p == null ? SqlXml.Null : new SqlXml(new XmlTextReader(new StringReader(p.ToString())));         }
+		/// <summary>Converts the value from <c>XmlDocument</c> to an equivalent <c>SqlXml</c> value.</summary>
+		public static SqlXml ToSqlXml(XmlDocument p) { return p == null ? SqlXml.Null : new SqlXml(new XmlTextReader(new StringReader(p.InnerXml)));           }
+		/// <summary>Converts the value from <c>XmlReader</c> to an equivalent <c>SqlXml</c> value.</summary>
+		public static SqlXml ToSqlXml(XmlReader   p) { return p == null ? SqlXml.Null : new SqlXml(p);                                                         }
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>SqlXml</c> value.</summary>
+		public static SqlXml ToSqlXml(object p)
+		{
+			if (p == null) return SqlXml.Null;
+
+			if (p is SqlXml) return (SqlXml)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull : return SqlXml.Null;
+				case TypeCode.String : return ToSqlXml((String)p);
+			}
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBinary)   return ToSqlXml((SqlBinary)  p);
+				if (p is SqlBytes)    return ToSqlXml((SqlBytes)   p);
+				if (p is SqlChars)    return ToSqlXml((SqlChars)   p);
+				if (p is SqlString)   return ToSqlXml((SqlString)  p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)      return ToSqlXml((Binary)     p);
+			if (p is Byte[])      return ToSqlXml((Byte[])     p);
+			if (p is Char[])      return ToSqlXml((Char[])     p);
+			if (p is Stream)      return ToSqlXml((Stream)     p);
+			if (p is XElement)    return ToSqlXml((XElement)   p);
+			if (p is XmlDocument) return ToSqlXml((XmlDocument)p);
+			if (p is XmlReader)   return ToSqlXml((XmlReader)  p);
+
+			throw CreateInvalidCastException(p.GetType(), typeof(SqlXml));
+		}
+
+#endif
+
+		#endregion
+
+		#endregion
+
+		#region Other Types
+
+		#region Binary
+
+		#endregion
+
+		#region Byte[]
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Boolean</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(Boolean         p) { return BitConverter.GetBytes(p);                                         }
+		/// <summary>Converts the value from <c>Byte</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(Byte            p) { return new[] { p };                                                      }
+		/// <summary>Converts the value from <c>Char</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(Char            p) { return BitConverter.GetBytes(p);                                         }
+#if !SILVERLIGHT
+		/// <summary>Converts the value from <c>DateTime</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(DateTime        p) { return ToByteArray(p.ToBinary());                                        }
+#endif
+#if !SILVERLIGHT
+		/// <summary>Converts the value from <c>DateTimeOffset</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(DateTimeOffset  p) { return ToByteArray(p.LocalDateTime.ToBinary());                          }
+#endif
+		/// <summary>Converts the value from <c>Double</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(Double          p) { return BitConverter.GetBytes(p);                                         }
+		/// <summary>Converts the value from <c>Guid</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(Guid            p) { return p == Guid.Empty ? (Byte[])null : p.ToByteArray();                 }
+		/// <summary>Converts the value from <c>Int16</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(Int16           p) { return BitConverter.GetBytes(p);                                         }
+		/// <summary>Converts the value from <c>Int32</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(Int32           p) { return BitConverter.GetBytes(p);                                         }
+		/// <summary>Converts the value from <c>Int64</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(Int64           p) { return BitConverter.GetBytes(p);                                         }
+		/// <summary>Converts the value from <c>SByte</c> to an equivalent <c>Byte[]</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Byte[] ToByteArray(SByte           p) { return new[] { checked((Byte)p) };                                       }
+		/// <summary>Converts the value from <c>Single</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(Single          p) { return BitConverter.GetBytes(p);                                         }
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(String          p) { return p == null ? (Byte[])null : System.Text.Encoding.UTF8.GetBytes(p); }
+		/// <summary>Converts the value from <c>TimeSpan</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(TimeSpan        p) { return ToByteArray(p.Ticks);                                             }
+		/// <summary>Converts the value from <c>UInt16</c> to an equivalent <c>Byte[]</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Byte[] ToByteArray(UInt16          p) { return BitConverter.GetBytes(p);                                         }
+		/// <summary>Converts the value from <c>UInt32</c> to an equivalent <c>Byte[]</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Byte[] ToByteArray(UInt32          p) { return BitConverter.GetBytes(p);                                         }
+		/// <summary>Converts the value from <c>UInt64</c> to an equivalent <c>Byte[]</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Byte[] ToByteArray(UInt64          p) { return BitConverter.GetBytes(p);                                         }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Boolean?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(Boolean?        p) { return p.HasValue ? ToByteArray(p.Value) : (Byte[])null;                 }
+		/// <summary>Converts the value from <c>Byte?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(Byte?           p) { return p.HasValue ? ToByteArray(p.Value) : (Byte[])null;                 }
+		/// <summary>Converts the value from <c>Char?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(Char?           p) { return p.HasValue ? ToByteArray(p.Value) : (Byte[])null;                 }
+#if !SILVERLIGHT
+		/// <summary>Converts the value from <c>DateTime?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(DateTime?       p) { return p.HasValue ? ToByteArray(p.Value) : (Byte[])null;                 }
+#endif
+#if !SILVERLIGHT
+		/// <summary>Converts the value from <c>DateTimeOffset?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(DateTimeOffset? p) { return p.HasValue ? ToByteArray(p.Value) : (Byte[])null;                 }
+#endif
+		/// <summary>Converts the value from <c>Decimal?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(Decimal?        p) { return p.HasValue ? ToByteArray(p.Value) : (Byte[])null;                 }
+		/// <summary>Converts the value from <c>Double?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(Double?         p) { return p.HasValue ? ToByteArray(p.Value) : (Byte[])null;                 }
+		/// <summary>Converts the value from <c>Guid?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(Guid?           p) { return p.HasValue ? ToByteArray(p.Value) : (Byte[])null;                 }
+		/// <summary>Converts the value from <c>Int16?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(Int16?          p) { return p.HasValue ? ToByteArray(p.Value) : (Byte[])null;                 }
+		/// <summary>Converts the value from <c>Int32?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(Int32?          p) { return p.HasValue ? ToByteArray(p.Value) : (Byte[])null;                 }
+		/// <summary>Converts the value from <c>Int64?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(Int64?          p) { return p.HasValue ? ToByteArray(p.Value) : (Byte[])null;                 }
+		/// <summary>Converts the value from <c>SByte?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Byte[] ToByteArray(SByte?          p) { return p.HasValue ? ToByteArray(p.Value) : (Byte[])null;                 }
+		/// <summary>Converts the value from <c>Single?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(Single?         p) { return p.HasValue ? ToByteArray(p.Value) : (Byte[])null;                 }
+		/// <summary>Converts the value from <c>TimeSpan?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(TimeSpan?       p) { return p.HasValue ? ToByteArray(p.Value) : (Byte[])null;                 }
+		/// <summary>Converts the value from <c>UInt16?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Byte[] ToByteArray(UInt16?         p) { return p.HasValue ? ToByteArray(p.Value) : (Byte[])null;                 }
+		/// <summary>Converts the value from <c>UInt32?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Byte[] ToByteArray(UInt32?         p) { return p.HasValue ? ToByteArray(p.Value) : (Byte[])null;                 }
+		/// <summary>Converts the value from <c>UInt64?</c> to an equivalent <c>Byte[]</c> value.</summary>
+		[CLSCompliant(false)]
+		public static Byte[] ToByteArray(UInt64?         p) { return p.HasValue ? ToByteArray(p.Value) : (Byte[])null;                 }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(Binary          p) { return p == null ? (Byte[])null : p.ToArray();                           }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBinary</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(SqlBinary       p) { return p.IsNull ? (Byte[])null : p.Value;                                }
+		/// <summary>Converts the value from <c>SqlBoolean</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(SqlBoolean      p) { return p.IsNull ? (Byte[])null : ToByteArray(p.Value);                   }
+		/// <summary>Converts the value from <c>SqlByte</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(SqlByte         p) { return p.IsNull ? (Byte[])null : ToByteArray(p.Value);                   }
+		/// <summary>Converts the value from <c>SqlBytes</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(SqlBytes        p) { return p.IsNull ? (Byte[])null : p.Value;                                }
+		/// <summary>Converts the value from <c>SqlDecimal</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(SqlDecimal      p) { return p.IsNull ? (Byte[])null : ToByteArray(p.Value);                   }
+		/// <summary>Converts the value from <c>SqlDouble</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(SqlDouble       p) { return p.IsNull ? (Byte[])null : ToByteArray(p.Value);                   }
+		/// <summary>Converts the value from <c>SqlGuid</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(SqlGuid         p) { return p.IsNull ? (Byte[])null : p.ToByteArray();                        }
+		/// <summary>Converts the value from <c>SqlInt16</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(SqlInt16        p) { return p.IsNull ? (Byte[])null : ToByteArray(p.Value);                   }
+		/// <summary>Converts the value from <c>SqlInt32</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(SqlInt32        p) { return p.IsNull ? (Byte[])null : ToByteArray(p.Value);                   }
+		/// <summary>Converts the value from <c>SqlInt64</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(SqlInt64        p) { return p.IsNull ? (Byte[])null : ToByteArray(p.Value);                   }
+		/// <summary>Converts the value from <c>SqlMoney</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(SqlMoney        p) { return p.IsNull ? (Byte[])null : ToByteArray(p.Value);                   }
+		/// <summary>Converts the value from <c>SqlSingle</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(SqlSingle       p) { return p.IsNull ? (Byte[])null : ToByteArray(p.Value);                   }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(SqlString       p) { return p.IsNull ? (Byte[])null : ToByteArray(p.Value);                   }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>Byte[]</c> value.</summary>
+		public static Byte[] ToByteArray(object p)
+		{
+			if (p == null) return null;
+
+			if (p is Byte[]) return (Byte[])p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull   : return null;
+				case TypeCode.Decimal  : return ToByteArray((Decimal) p);
+				case TypeCode.String   : return ToByteArray((String)  p);
+				case TypeCode.Byte     : return ToByteArray((Byte)    p);
+				case TypeCode.SByte    : return ToByteArray((SByte)   p);
+#if !SILVERLIGHT
+				case TypeCode.DateTime : return ToByteArray((DateTime)p);
+#endif
+				case TypeCode.Int16    : return ToByteArray((Int16)   p);
+				case TypeCode.Int32    : return ToByteArray((Int32)   p);
+				case TypeCode.Int64    : return ToByteArray((Int64)   p);
+				case TypeCode.UInt16   : return ToByteArray((UInt16)  p);
+				case TypeCode.UInt32   : return ToByteArray((UInt32)  p);
+				case TypeCode.UInt64   : return ToByteArray((UInt64)  p);
+				case TypeCode.Single   : return ToByteArray((Single)  p);
+				case TypeCode.Double   : return ToByteArray((Double)  p);
+				case TypeCode.Boolean  : return ToByteArray((Boolean) p);
+				case TypeCode.Char     : return ToByteArray((Char)    p);
+			}
+
+			// Simple Types
+			//
+#if !SILVERLIGHT
+			if (p is DateTimeOffset)  return ToByteArray((DateTimeOffset) p);
+#endif
+			if (p is Guid)            return ToByteArray((Guid)           p);
+			if (p is TimeSpan)        return ToByteArray((TimeSpan)       p);
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+				if (p is Boolean?)        return ToByteArray((Boolean?)       p);
+				if (p is Byte?)           return ToByteArray((Byte?)          p);
+				if (p is Char?)           return ToByteArray((Char?)          p);
+#if !SILVERLIGHT
+				if (p is DateTime?)       return ToByteArray((DateTime?)      p);
+#endif
+#if !SILVERLIGHT
+				if (p is DateTimeOffset?) return ToByteArray((DateTimeOffset?)p);
+#endif
+				if (p is Decimal?)        return ToByteArray((Decimal?)       p);
+				if (p is Double?)         return ToByteArray((Double?)        p);
+				if (p is Guid?)           return ToByteArray((Guid?)          p);
+				if (p is Int16?)          return ToByteArray((Int16?)         p);
+				if (p is Int32?)          return ToByteArray((Int32?)         p);
+				if (p is Int64?)          return ToByteArray((Int64?)         p);
+				if (p is SByte?)          return ToByteArray((SByte?)         p);
+				if (p is Single?)         return ToByteArray((Single?)        p);
+				if (p is TimeSpan?)       return ToByteArray((TimeSpan?)      p);
+				if (p is UInt16?)         return ToByteArray((UInt16?)        p);
+				if (p is UInt32?)         return ToByteArray((UInt32?)        p);
+				if (p is UInt64?)         return ToByteArray((UInt64?)        p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)          return ToByteArray((Binary)         p);
+			if (p is Char[])          return ToByteArray((Char[])         p);
+			if (p is Stream)          return ToByteArray((Stream)         p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBinary)       return ToByteArray((SqlBinary)      p);
+				if (p is SqlBoolean)      return ToByteArray((SqlBoolean)     p);
+				if (p is SqlByte)         return ToByteArray((SqlByte)        p);
+				if (p is SqlBytes)        return ToByteArray((SqlBytes)       p);
+				if (p is SqlDecimal)      return ToByteArray((SqlDecimal)     p);
+				if (p is SqlDouble)       return ToByteArray((SqlDouble)      p);
+				if (p is SqlGuid)         return ToByteArray((SqlGuid)        p);
+				if (p is SqlInt16)        return ToByteArray((SqlInt16)       p);
+				if (p is SqlInt32)        return ToByteArray((SqlInt32)       p);
+				if (p is SqlInt64)        return ToByteArray((SqlInt64)       p);
+				if (p is SqlMoney)        return ToByteArray((SqlMoney)       p);
+				if (p is SqlSingle)       return ToByteArray((SqlSingle)      p);
+				if (p is SqlString)       return ToByteArray((SqlString)      p);
+			}
+
+#endif
+
+			throw CreateInvalidCastException(p.GetType(), typeof(Byte[]));
+		}
+
+		#endregion
+
+		#region Char[]
+
+		#endregion
+
+		#region Stream
+
+		// Simple Types
+		//
+		/// <summary>Converts the value from <c>Guid</c> to an equivalent <c>Stream</c> value.</summary>
+		public static Stream ToStream(Guid      p) { return p == Guid.Empty ? Stream.Null : new MemoryStream(p.ToByteArray());  }
+
+		// Nullable Types
+		//
+		/// <summary>Converts the value from <c>Guid?</c> to an equivalent <c>Stream</c> value.</summary>
+		public static Stream ToStream(Guid?     p) { return p.HasValue ? new MemoryStream(p.Value.ToByteArray()) : Stream.Null; }
+
+		// Other Types
+		//
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>Stream</c> value.</summary>
+		public static Stream ToStream(Binary    p) { return p == null ? Stream.Null : new MemoryStream(p.ToArray());            }
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>Stream</c> value.</summary>
+		public static Stream ToStream(Byte[]    p) { return p == null ? Stream.Null : new MemoryStream(p);                      }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlBinary</c> to an equivalent <c>Stream</c> value.</summary>
+		public static Stream ToStream(SqlBinary p) { return p.IsNull ? Stream.Null : new MemoryStream(p.Value);                 }
+		/// <summary>Converts the value from <c>SqlBytes</c> to an equivalent <c>Stream</c> value.</summary>
+		public static Stream ToStream(SqlBytes  p) { return p.IsNull ? Stream.Null : p.Stream;                                  }
+		/// <summary>Converts the value from <c>SqlGuid</c> to an equivalent <c>Stream</c> value.</summary>
+		public static Stream ToStream(SqlGuid   p) { return p.IsNull ? Stream.Null : new MemoryStream(p.Value.ToByteArray());   }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>Stream</c> value.</summary>
+		public static Stream ToStream(object p)
+		{
+			if (p == null || p is DBNull) return Stream.Null;
+
+			if (p is Stream) return (Stream)p;
+
+			// Simple Types
+			//
+			if (p is Guid)      return ToStream((Guid)     p);
+
+			// Nullable Types
+			//
+			var type = p.GetType();
+
+			if (type.IsGenericType)
+			{
+				if (p is Guid?)     return ToStream((Guid?)    p);
+			}
+
+			// Other Types
+			//
+			if (p is Binary)    return ToStream((Binary)   p);
+			if (p is Byte[])    return ToStream((Byte[])   p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlBinary) return ToStream((SqlBinary)p);
+				if (p is SqlBytes)  return ToStream((SqlBytes) p);
+				if (p is SqlGuid)   return ToStream((SqlGuid)  p);
+			}
+
+#endif
+
+			throw CreateInvalidCastException(p.GetType(), typeof(Stream));
+		}
+
+		#endregion
+
+		#region Type
+
+		// Simple Types
+		//
+#if !SILVERLIGHT
+		/// <summary>Converts the value from <c>Guid</c> to an equivalent <c>Type</c> value.</summary>
+		public static Type ToType(Guid      p) { return p == Guid.Empty ? (Type)null : Type.GetTypeFromCLSID(p);             }
+#endif
+		/// <summary>Converts the value from <c>String</c> to an equivalent <c>Type</c> value.</summary>
+		public static Type ToType(String    p) { return p == null ? (Type)null : Type.GetType(p);                            }
+
+		// Nullable Types
+		//
+#if !SILVERLIGHT
+		/// <summary>Converts the value from <c>Guid?</c> to an equivalent <c>Type</c> value.</summary>
+		public static Type ToType(Guid?     p) { return p.HasValue ? Type.GetTypeFromCLSID(p.Value) : (Type)null;            }
+#endif
+
+		// Other Types
+		//
+#if !SILVERLIGHT
+		/// <summary>Converts the value from <c>Binary</c> to an equivalent <c>Type</c> value.</summary>
+		public static Type ToType(Binary    p) { return p == null ? (Type)null : Type.GetTypeFromCLSID(ToGuid(p.ToArray())); }
+#endif
+#if !SILVERLIGHT
+		/// <summary>Converts the value from <c>Byte[]</c> to an equivalent <c>Type</c> value.</summary>
+		public static Type ToType(Byte[]    p) { return p == null ? (Type)null : Type.GetTypeFromCLSID(ToGuid(p));           }
+#endif
+		/// <summary>Converts the value from <c>Char[]</c> to an equivalent <c>Type</c> value.</summary>
+		public static Type ToType(Char[]    p) { return p == null ? (Type)null : Type.GetType(new string(p));                }
+
+#if !SILVERLIGHT
+
+		// Sql Types
+		//
+		/// <summary>Converts the value from <c>SqlChars</c> to an equivalent <c>Type</c> value.</summary>
+		public static Type ToType(SqlChars  p) { return p.IsNull ? (Type)null : Type.GetType(new string(p.Value));           }
+		/// <summary>Converts the value from <c>SqlGuid</c> to an equivalent <c>Type</c> value.</summary>
+		public static Type ToType(SqlGuid   p) { return p.IsNull ? (Type)null : Type.GetTypeFromCLSID(p.Value);              }
+		/// <summary>Converts the value from <c>SqlString</c> to an equivalent <c>Type</c> value.</summary>
+		public static Type ToType(SqlString p) { return p.IsNull ? (Type)null : Type.GetType(p.Value);                       }
+
+#endif
+
+		// From Object
+		//
+		/// <summary>Converts the value from <c>Object</c> to an equivalent <c>Type</c> value.</summary>
+		public static Type ToType(object p)
+		{
+			if (p == null) return null;
+
+			if (p is Type) return (Type)p;
+
+			var type = p.GetType();
+
+			// Primitive types
+			//
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.DBNull : return null;
+				case TypeCode.String : return ToType((String)p);
+			}
+
+			// Simple Types
+			//
+#if !SILVERLIGHT
+			if (p is Guid)      return ToType((Guid)     p);
+#endif
+
+			// Nullable Types
+			//
+			if (type.IsGenericType)
+			{
+#if !SILVERLIGHT
+				if (p is Guid?)     return ToType((Guid?)    p);
+#endif
+			}
+
+			// Other Types
+			//
+#if !SILVERLIGHT
+			if (p is Binary)    return ToType((Binary)   p);
+#endif
+#if !SILVERLIGHT
+			if (p is Byte[])    return ToType((Byte[])   p);
+#endif
+			if (p is Char[])    return ToType((Char[])   p);
+
+#if !SILVERLIGHT
+
+			// Sql Types
+			//
+			if (p is INullable)
+			{
+				if (p is SqlChars)  return ToType((SqlChars) p);
+				if (p is SqlGuid)   return ToType((SqlGuid)  p);
+				if (p is SqlString) return ToType((SqlString)p);
+			}
+
+#endif
+
+			throw CreateInvalidCastException(p.GetType(), typeof(Type));
+		}
+
+		#endregion
+
+		#region XmlDocument
+
+#if !SILVERLIGHT
+
+#endif
+
+		#endregion
+
+		#region XmlReader
+
+#if !SILVERLIGHT
+
+#endif
+
+		#endregion
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Common/Convert.tt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,978 @@
+<#@ template language="C#v3.5" debug="True"       #>
+<#@ output extension="generated.cs"               #>
+<#@ assembly name="System.Core"                   #>
+<#@ import namespace="System.Collections.Generic" #>
+<#@ import namespace="System.Linq" #>
+//---------------------------------------------------------------------------------------------------
+// <auto-generated>
+//    This code was generated by BLToolkit template for T4.
+//    Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
+// </auto-generated>
+//---------------------------------------------------------------------------------------------------
+using System;
+using System.Data.Linq;
+using System.Data.SqlTypes;
+using System.Globalization;
+using System.IO;
+using System.Xml;
+#if !SILVERLIGHT
+using System.Xml.Linq;
+#endif
+
+namespace BLToolkit.Common
+{
+	using Properties;
+
+	public partial class Convert
+	{ 
+<#
+		GenerationEnvironment.Remove(GenerationEnvironment.Length - 2, 2);
+
+		_types =
+			Set(_ => { _.Group = "Simple"; _.Method = "To" + _.Name; }, new[]
+				{
+					new ToType { Name = "Boolean",        NullValue = "Configuration.NullableValues.Boolean", Froms = { { "Char", null } } },
+					new ToType { Name = "Byte",           NullValue = "Configuration.NullableValues.Byte"     },
+					new ToType { Name = "Char",           NullValue = "Configuration.NullableValues.Char"     },
+					new ToType { Name = "DateTime",       NullValue = "Configuration.NullableValues.DateTime" },
+					new ToType { Name = "DateTimeOffset", NullValue = "DateTimeOffset.MinValue"               },
+					new ToType { Name = "Decimal",        NullValue = "Configuration.NullableValues.Decimal", Froms = { { "Byte[]", null }, { "Binary", null } } },
+					new ToType { Name = "Double",         NullValue = "Configuration.NullableValues.Double"   },
+					new ToType { Name = "Guid",           NullValue = "Configuration.NullableValues.Guid"     },
+					new ToType { Name = "Int16",          NullValue = "Configuration.NullableValues.Int16"    },
+					new ToType { Name = "Int32",          NullValue = "Configuration.NullableValues.Int32"    },
+					new ToType { Name = "Int64",          NullValue = "Configuration.NullableValues.Int64"    },
+					new ToType { Name = "Single",         NullValue = "Configuration.NullableValues.Single"   },
+					new ToType { Name = "String",         NullValue = "Configuration.NullableValues.String",  FromObjectReturn = "return p.ToString();" },
+					new ToType { Name = "TimeSpan",       NullValue = "Configuration.NullableValues.TimeSpan" },
+				}.Concat(Set(_ => _.NonCompliant = true, new[]
+				{
+					new ToType { Name = "SByte",          NullValue = "Configuration.NullableValues.SByte"    },
+					new ToType { Name = "UInt16",         NullValue = "Configuration.NullableValues.UInt16"   },
+					new ToType { Name = "UInt32",         NullValue = "Configuration.NullableValues.UInt32"   },
+					new ToType { Name = "UInt64",         NullValue = "Configuration.NullableValues.UInt64"   },
+				})))
+			.Concat(Set(_ => { _.Group = "Nullable"; _.Method = "ToNullable" + _.Name; _.Name += "?"; }, new[]
+				{
+					new ToType { Name = "Boolean"        },
+					new ToType { Name = "Byte"           },
+					new ToType { Name = "Char"           },
+					new ToType { Name = "DateTime"       },
+					new ToType { Name = "DateTimeOffset" },
+					new ToType { Name = "Decimal"        },
+					new ToType { Name = "Double"         },
+					new ToType { Name = "Guid"           },
+					new ToType { Name = "Int16"          },
+					new ToType { Name = "Int32"          },
+					new ToType { Name = "Int64"          },
+					new ToType { Name = "Single"         },
+					new ToType { Name = "TimeSpan"       },
+				}.Concat(Set(_ => _.NonCompliant = true, new[]
+				{
+					new ToType { Name = "SByte"  },
+					new ToType { Name = "UInt16" },
+					new ToType { Name = "UInt32" },
+					new ToType { Name = "UInt64" },
+				}))))
+			.Concat(Set(_ => { _.Group = "Sql"; _.Method = "To" + _.Name; _.NonSilverlightable = true; _.NullValue = _.Name + ".Null"; }, new[]
+				{
+					new ToType { Name = "SqlString"   },
+					new ToType { Name = "SqlByte"     },
+					new ToType { Name = "SqlInt16"    },
+					new ToType { Name = "SqlInt32"    },
+					new ToType { Name = "SqlInt64"    },
+					new ToType { Name = "SqlSingle"   },
+					new ToType { Name = "SqlDouble"   },
+					new ToType { Name = "SqlBoolean"  },
+					new ToType { Name = "SqlDecimal"  },
+					new ToType { Name = "SqlMoney"    },
+					new ToType { Name = "SqlDateTime" },
+					new ToType { Name = "SqlGuid"     },
+					new ToType { Name = "SqlBinary"   },
+					new ToType { Name = "SqlBytes"    },
+					new ToType { Name = "SqlChars"    },
+					new ToType { Name = "SqlXml"      },
+				}))
+			.Concat(Set(_ => { _.Group = "Other"; }, new[]
+				{
+					new ToType { Name = "Type",        Method = "ToType",        NonSLMethods = { "Guid", "Guid?", "Binary", "Byte[]" } },
+					new ToType { Name = "Stream",      Method = "ToStream",      NullValue = "Stream.Null" },
+					new ToType { Name = "Byte[]",      Method = "ToByteArray",   NonSLMethods = { "DateTime", "DateTime?", "DateTimeOffset", "DateTimeOffset?" }, Froms = { { "Decimal", null }, { "Stream", null }, { "Char[]", null } } },
+					new ToType { Name = "Char[]",      Method = "ToCharArray",                             },
+					new ToType { Name = "Binary",      Method = "ToLinqBinary",                            },
+					new ToType { Name = "XmlReader",   Method = "ToXmlReader",   NonSilverlightable = true },
+					new ToType { Name = "XmlDocument", Method = "ToXmlDocument", NonSilverlightable = true },
+					new ToType { Name = "XElement",    Method = "ToXElement",    NonSilverlightable = true },
+				}))
+			.ToDictionary(_ => _.Name);
+
+
+		// To Boolean
+		//
+		ConvertFrom("String", "p == null? {2} : p.Length == 1 ? ToBoolean(p[0]) : Boolean.Parse(p)",       "Boolean", "Boolean?", "SqlBoolean");
+		ConvertFrom("Byte[]", "p == null || p.Length == 0 ? {2} : BitConverter.ToBoolean(p, 0)",           "Boolean", "Boolean?", "SqlBoolean");
+		ConvertFrom("Binary", "p == null || p.Length == 0 ? {2} : BitConverter.ToBoolean(p.ToArray(), 0)", "Boolean", "Boolean?", "SqlBoolean");
+
+		ConvertTo    ("Boolean", "p.HasValue && p.Value",                "Boolean?");
+		ConvertToNull("Boolean", "p != 0", "p.HasValue && p.Value != 0", "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "UInt64", "Single", "Double", "Decimal");
+		ConvertTo    ("Boolean", "p.HasValue && ToBoolean(p.Value)",     "Char?");
+		ConvertTo    ("Boolean", "!p.IsNull && p.Value",                 "SqlBoolean");
+		ConvertTo    ("Boolean", "!p.IsNull && ToBoolean(p.Value)",      Sql("String", "Byte", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money"));
+
+		ConvertFrom("Boolean", "p",                                "Boolean?", "SqlBoolean");
+		ConvertFrom("Char",    "ToBoolean(p)",                     "Boolean?", "SqlBoolean");
+		ConvertFrom("Char?",   "p.HasValue && ToBoolean(p.Value)", "Boolean?", "SqlBoolean");
+
+		// To Boolean?
+		//		
+		ConvertToNull("Boolean?", "p != 0", "p.HasValue ? p.Value != 0 : {2}", "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "UInt64", "Single", "Double", "Decimal");
+		ConvertTo    ("Boolean?", "p.IsNull ? {2} : p.Value",                  "SqlBoolean");
+		ConvertTo    ("Boolean?", "p.IsNull ? {2} : ToBoolean(p.Value)",       Sql("String", "Byte", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money"));
+
+		// SqlBoolean
+		//
+		ConvertTo    ("SqlBoolean", "p.HasValue ? p.Value : {2}",                "Boolean?");
+		ConvertToNull("SqlBoolean", "p != 0", "p.HasValue ? p.Value != 0 : {2}", "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "UInt64", "Single", "Double", "Decimal");
+		ConvertTo    ("SqlBoolean", "p.IsNull ? {2} : ToBoolean(p.Value)",       Sql("String", "Byte", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money"));
+
+		// To Byte
+		//
+		ConvertNumber("Byte",
+			new string[] { "Byte" },
+			new string[] { "SByte", "Int16", "Int32", "Int64", "UInt16", "UInt32", "UInt64", "Single", "Double", "Decimal", "Char" },
+			new string[] { "Byte" },
+			new string[] { "String", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money", "Boolean" });
+
+		ConvertFrom("Byte[]", "p == null || p.Length == 0 ? {2} : p[0]",           "Byte", "Byte?", "SqlByte");
+		ConvertFrom("Binary", "p == null || p.Length == 0 ? {2} : p.ToArray()[0]", "Byte", "Byte?", "SqlByte");
+
+		// To Char
+		//
+		ConvertNumber("Char",
+			new string[] { "Char" },
+			new string[] { "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "UInt64", "Single", "Double", "Decimal" },
+			new string[] { },
+			new string[] { "String", "Byte", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money", "Boolean" });
+
+		ConvertFrom("String", "string.IsNullOrEmpty(p)? ({0})0 : p[0]", "Char", "Char?");
+
+		// To DateTime
+		//
+		ConvertTo(new[] { "DateTime",  "SqlDateTime" }, "p.HasValue ? p.Value : {2}", "DateTime?");
+		ConvertTo(new[] { "DateTime?", "SqlDateTime" }, "p",                          "DateTime");
+		ConvertTo(new[] { "DateTime",  "DateTime?"   }, "p.IsNull ? {2} : p.Value",   "SqlDateTime");
+		
+		ConvertFrom("String",          "p == null ? {2} : {3}.Parse(p, null, DateTimeStyles.NoCurrentDateDefault)", "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("TimeSpan",        "{3}.MinValue + p",                                                          "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("Int64",           "{3}.MinValue + TimeSpan.FromTicks(p)",                                      "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("Double",          "{3}.MinValue + TimeSpan.FromDays (p)",                                      "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("DateTimeOffset",  "p.LocalDateTime",                                                           "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("DateTimeOffset?", "p.HasValue ?                     p.Value.LocalDateTime : {2}",              "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("TimeSpan?",       "p.HasValue ? {3}.MinValue +                    p.Value : {2}",              "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("Int64?",          "p.HasValue ? {3}.MinValue + TimeSpan.FromTicks(p.Value): {2}",              "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("Double?",         "p.HasValue ? {3}.MinValue + TimeSpan.FromDays (p.Value): {2}",              "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("SqlDateTime",     "p.IsNull   ? {2} :                                   p.Value",              "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("SqlString",       "p.IsNull   ? {2} :                             To{3}(p.Value)",             "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("SqlInt64",        "p.IsNull   ? {2} : {3}.MinValue + TimeSpan.FromTicks(p.Value)",             "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("SqlDouble",       "p.IsNull   ? {2} : {3}.MinValue + TimeSpan.FromDays (p.Value)",             "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("Byte[]",          "p == null || p.Length == 0 ? {2} : {3}.FromBinary(ToInt64(p))",             "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("Binary",          "p == null || p.Length == 0 ? {2} : {3}.FromBinary(ToInt64(p.ToArray()))",   "DateTime", "DateTime?", "SqlDateTime");
+
+		// To DateTimeOffset
+		//
+		ConvertTo("DateTimeOffset",  "p.HasValue ? p.Value : {2}", "DateTimeOffset?");
+		ConvertTo("DateTimeOffset?", "p",                          "DateTimeOffset");
+
+		ConvertFrom("TimeSpan",    "{3}.MinValue + p",                                                    "DateTimeOffset", "DateTimeOffset?");
+		ConvertFrom("Int64",       "{3}.MinValue + TimeSpan.FromTicks(p)",                                "DateTimeOffset", "DateTimeOffset?");
+		ConvertFrom("Double",      "{3}.MinValue + TimeSpan.FromDays (p)",                                "DateTimeOffset", "DateTimeOffset?");
+		ConvertFrom("DateTime",    "p",                                                                   "DateTimeOffset", "DateTimeOffset?");
+		ConvertFrom("DateTime?",   "p.HasValue ?                                   p.Value : {2}",        "DateTimeOffset", "DateTimeOffset?");
+		ConvertFrom("TimeSpan?",   "p.HasValue ? {3}.MinValue +                    p.Value : {2}",        "DateTimeOffset", "DateTimeOffset?");
+		ConvertFrom("Int64?",      "p.HasValue ? {3}.MinValue + TimeSpan.FromTicks(p.Value): {2}",        "DateTimeOffset", "DateTimeOffset?");
+		ConvertFrom("Double?",     "p.HasValue ? {3}.MinValue + TimeSpan.FromDays (p.Value): {2}",        "DateTimeOffset", "DateTimeOffset?");
+		ConvertFrom("SqlDateTime", "p.IsNull   ? {2} :                                   p.Value",        "DateTimeOffset", "DateTimeOffset?");
+		ConvertFrom("SqlString",   "p.IsNull   ? {2} :                  ToDateTimeOffset(p.Value)",       "DateTimeOffset", "DateTimeOffset?");
+		ConvertFrom("SqlInt64",    "p.IsNull   ? {2} : {3}.MinValue + TimeSpan.FromTicks(p.Value)",       "DateTimeOffset", "DateTimeOffset?");
+		ConvertFrom("SqlDouble",   "p.IsNull   ? {2} : {3}.MinValue + TimeSpan.FromDays (p.Value)",       "DateTimeOffset", "DateTimeOffset?");
+		ConvertFrom("Byte[]",      "p == null || p.Length == 0 ? {2} : new {0}(ToDateTime(p))",           "DateTimeOffset", "DateTimeOffset?");
+		ConvertFrom("Binary",      "p == null || p.Length == 0 ? {2} : new {0}(ToDateTime(p.ToArray()))", "DateTimeOffset", "DateTimeOffset?");
+
+		// To Decimal
+		//
+		ConvertNumber("Decimal",
+			new string[] { "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "Char", "UInt64", "Decimal" },
+			new string[] { "Single", "Double" },
+			new string[] { "Byte", "Int16", "Int32", "Int64", "Decimal", "Money" },
+			new string[] { "String", "Single", "Double", "Boolean" });
+
+		ConvertNumber("Money",
+			new string[] { "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "Char", "UInt64", "Decimal" },
+			new string[] { "Single", "Double" },
+			new string[] { "Byte", "Int16", "Int32", "Int64", "Decimal", "Money" },
+			new string[] { "String", "Single", "Double", "Boolean" });
+
+		ConvertTo(new[] { "Decimal?", "SqlDecimal", "SqlMoney" }, "p == null || p.Length == 0 ? {2} : ToDecimal(p)", "Byte[]", "Binary");
+
+		// To Double
+		//
+		ConvertTo(new[] { "Double", "Double?", "SqlDouble" }, "(p - {1}.MinValue).TotalDays",          "DateTime", "DateTimeOffset");
+		ConvertTo("SqlDouble",                                "p.IsNull? {0}.Null: ToDouble(p.Value)", "SqlDateTime");
+
+		ConvertNumber("Double",
+			new string[] { "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "Char", "UInt64", "Single", "Double" },
+			new string[] { "Decimal" },
+			new string[] { "Byte", "Int16", "Int32", "Int64", "Single", "Double" },
+			new string[] { "String", "Decimal", "Money", "Boolean", "DateTime" });
+
+		ConvertTo(new[] { "Double", "Double?", "SqlDouble" }, "p.HasValue ? (p.Value - {4}.MinValue).TotalDays : {2}", "DateTime?", "DateTimeOffset?");
+
+		ConvertFrom("TimeSpan",  "p.TotalDays",                          "Double", "Double?", "SqlDouble");
+		ConvertFrom("TimeSpan?", "p.HasValue ? p.Value.TotalDays : {2}", "Double", "Double?", "SqlDouble");
+
+		// To Guid
+		//
+		ConvertTo(new[] { "Guid",  "SqlGuid" }, "p.HasValue ? p.Value : {2}", "Guid?");
+		ConvertTo(new[] { "Guid?", "SqlGuid" }, "p",                          "Guid");
+		ConvertTo(new[] { "Guid",  "Guid?"   }, "p.IsNull ? {2} : p.Value",   "SqlGuid");
+
+		ConvertTo(new[] { "Guid", "Guid?", "SqlGuid" },  "p == null ? {2} : new Guid(p)", "String", "Byte[]");
+		
+		ConvertFrom("SqlGuid",   "p.IsNull  ? {2} : p.Value",               "Guid", "Guid?", "SqlGuid");
+		ConvertFrom("SqlString", "p.IsNull  ? {2} : new Guid(p.Value)",     "Guid", "Guid?", "SqlGuid");
+		ConvertFrom("SqlBinary", "p.IsNull  ? {2} : p.ToSqlGuid().Value",   "Guid", "Guid?", "SqlGuid");
+		ConvertFrom("Binary",    "p == null ? {2} : new Guid(p.ToArray())", "Guid", "Guid?", "SqlGuid");
+		ConvertFrom("Type",      "p == null ? {2} : p.GUID",                "Guid", "Guid?", "SqlGuid");
+
+		// To Int16
+		//
+		ConvertNumber("Int16",
+			new string[] { "SByte", "Int16", "Byte" },
+			new string[] { "Int32", "Int64", "UInt16", "UInt32", "UInt64", "Single", "Double", "Decimal", "Char" },
+			new string[] { "Byte", "Int16" },
+			new string[] { "String", "Int32", "Int64", "Single", "Double", "Decimal", "Money", "Boolean" });
+
+		// To Int32
+		//
+		ConvertNumber("Int32",
+			new string[] { "SByte", "Int16", "Int32", "Byte", "UInt16", "Char" },
+			new string[] { "Int64", "UInt32", "UInt64", "Single", "Double", "Decimal" },
+			new string[] { "Byte", "Int16", "Int32" },
+			new string[] { "String", "Int64", "Single", "Double", "Decimal", "Money", "Boolean" });
+
+		// To Int64
+		//
+		ConvertTo("Int64",    "(p - DateTime.MinValue).Ticks", "DateTime", "DateTimeOffset");
+		ConvertTo("Int64?",   "(p - DateTime.MinValue).Ticks", "DateTime", "DateTimeOffset");
+		ConvertTo("SqlInt64", "(p - DateTime.MinValue).Ticks", "DateTime", "DateTimeOffset");
+		ConvertTo("SqlInt64", "p.IsNull? {0}.Null: ToInt64(p.Value)",      "SqlDateTime");
+
+		ConvertNumber("Int64",
+			new string[] { "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "Char" },
+			new string[] { "UInt64", "Single", "Double", "Decimal" },
+			new string[] { "Byte", "Int16", "Int32", "Int64" },
+			new string[] { "String", "Single", "Double", "Decimal", "Money", "Boolean", "DateTime" });
+
+		ConvertTo("Int64",  "  p.HasValue ? (p.Value - DateTime.MinValue).Ticks : 0", "DateTime?", "DateTimeOffset?");
+		ConvertTo("Int64?",   "p.HasValue ? (p.Value - DateTime.MinValue).Ticks : 0", "DateTime?", "DateTimeOffset?");
+		ConvertTo("SqlInt64", "p.HasValue ? (p.Value - DateTime.MinValue).Ticks : 0", "DateTime?", "DateTimeOffset?");
+
+		ConvertFrom("TimeSpan",  "p.Ticks",                        "Int64", "Int64?", "SqlInt64");
+		ConvertFrom("TimeSpan?", "p.HasValue ? p.Value.Ticks : 0", "Int64", "Int64?", "SqlInt64");
+
+		// To SByte
+		//
+		ConvertNumber("SByte",
+			new string[] { "SByte" },
+			new string[] { "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "UInt64", "Single", "Double", "Decimal", "Char" },
+			new string[] { },
+			new string[] { "String", "Byte", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money", "Boolean" });
+
+		ConvertFrom("Byte[]", "p == null || p.Length == 0 ? {2} : checked(({0})p[0])",           "SByte", "SByte?");
+		ConvertFrom("Binary", "p == null || p.Length == 0 ? {2} : checked(({0})p.ToArray()[0])", "SByte", "SByte?");
+
+		// To Single
+		//
+		ConvertNumber("Single",
+			new string[] { "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "Char", "UInt64", "Single" },
+			new string[] { "Double", "Decimal" },
+			new string[] { "Byte", "Int16", "Int32", "Int64", "Single" },
+			new string[] { "String", "Double", "Decimal", "Money", "Boolean" });
+
+		// To String
+		//
+		ConvertToNull(new[] { "String", "SqlString" },
+			"p.To{3}()",
+			"p.HasValue ? p.Value.To{3}() : {2}",
+				"SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "UInt64",
+				"Single", "Double", "Boolean", "Decimal", "Char", "TimeSpan", "DateTime", "DateTimeOffset", "Guid");
+
+		ConvertTo(new[] { "String", "SqlString" }, "p == null ? {2} : p.FullName",                                          "Type");
+		ConvertTo(new[] { "String", "SqlString" }, "p == null ? {2} : System.Text.Encoding.UTF8.GetString(p, 0, p.Length)", "Byte[]");
+		ConvertTo(new[] { "String", "SqlString" }, "To{0}(p.ToArray())",                                                    "Binary");
+
+		ConvertTo(new[] { "String", "SqlString" }, "p.To{0}()",
+			Sql("String", "Byte", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money", "Boolean", "Guid"));
+
+		ConvertTo(        "String",                "p.IsNull ? {2} : p.ToSqlString().Value", "SqlChars");
+		ConvertTo(new[] { "String", "SqlString" }, "p.IsNull ? {2} : p.Value",               "SqlXml");
+		ConvertTo(new[] { "String", "SqlString" }, "p == null ? {2} : p.InnerXml",           "XmlDocument");
+		ConvertTo(new[] { "String", "SqlString" }, "p == null ? {2} : p.ToString()",         "XElement");
+
+		ConvertTo("SqlString", "p ?? {2}",  "String");
+		ConvertTo("SqlString", "p.To{0}()", "SqlChars");
+
+		// To TimeSpan
+		// 
+		ConvertTo("TimeSpan",  "p.HasValue ? p.Value : {2}", "TimeSpan?");
+		ConvertTo("TimeSpan?", "p",                          "TimeSpan");
+
+		ConvertFrom("DateTime",        "p - DateTime.MinValue",                                                 "TimeSpan", "TimeSpan?");
+		ConvertFrom("DateTimeOffset",  "p - DateTimeOffset.MinValue",                                           "TimeSpan", "TimeSpan?");
+		ConvertFrom("Int64",           "TimeSpan.FromTicks(p)",                                                 "TimeSpan", "TimeSpan?");
+		ConvertFrom("Double",          "TimeSpan.FromDays (p)",                                                 "TimeSpan", "TimeSpan?");
+		ConvertFrom("DateTime?",       "p.HasValue ? p.Value - DateTime.MinValue       : {2}",                  "TimeSpan", "TimeSpan?");
+		ConvertFrom("DateTimeOffset?", "p.HasValue ? p.Value - DateTimeOffset.MinValue : {2}",                  "TimeSpan", "TimeSpan?");
+		ConvertFrom("Int64?",          "p.HasValue ? {3}.FromTicks(p.Value)            : {2}",                  "TimeSpan", "TimeSpan?");
+		ConvertFrom("Double?",         "p.HasValue ? {3}.FromDays (p.Value)            : {2}",                  "TimeSpan", "TimeSpan?");
+		ConvertFrom("SqlString",       "p.IsNull   ? {2} : {3}.Parse(p.Value)",                                 "TimeSpan", "TimeSpan?");
+		ConvertFrom("SqlDateTime",     "p.IsNull   ? {2} : p.Value - DateTime.MinValue",                        "TimeSpan", "TimeSpan?");
+		ConvertFrom("SqlInt64",        "p.IsNull   ? {2} : {3}.FromTicks(p.Value)",                             "TimeSpan", "TimeSpan?");
+		ConvertFrom("SqlDouble",       "p.IsNull   ? {2} : {3}.FromDays(p.Value)",                              "TimeSpan", "TimeSpan?");
+		ConvertFrom("Byte[]",          "p == null || p.Length == 0? {2} : {3}.FromTicks(ToInt64(p))",           "TimeSpan", "TimeSpan?");
+		ConvertFrom("Binary",          "p == null || p.Length == 0? {2} : {3}.FromTicks(ToInt64(p.ToArray()))", "TimeSpan", "TimeSpan?");
+
+		// To UInt16
+		//
+		ConvertNumber("UInt16",
+			new string[] { "UInt16", "Byte" },
+			new string[] { "SByte", "Int16", "Int32", "Int64", "UInt32", "UInt64", "Single", "Double", "Decimal", "Char" },
+			new string[] { "Byte" },
+			new string[] { "String", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money", "Boolean" });
+
+		// To UInt32
+		//
+		ConvertNumber("UInt32",
+			new string[] { "Byte", "UInt16", "UInt32" },
+			new string[] { "SByte", "Int16", "Int32", "Int64", "UInt64", "Single", "Double", "Decimal", "Char" },
+			new string[] { "Byte" },
+			new string[] { "String", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money", "Boolean" });
+
+		// To UInt64
+		//
+		ConvertNumber("UInt64",
+			new string[] { "Byte", "UInt16", "UInt32", "UInt64" },
+			new string[] { "SByte", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Char" },
+			new string[] { "Byte" },
+			new string[] { "String", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money", "Boolean" });
+
+		// To SqlBinary
+		//
+		ConvertTo("SqlBinary", "p", "Byte[]");
+		ConvertTo("SqlBinary", "p == null ?      {2} : p.ToArray()",                   "Binary");
+		ConvertTo("SqlBinary", "p == Guid.Empty? {2} : new SqlGuid(p).To{0}()",        "Guid");
+		ConvertTo("SqlBinary", "p.HasValue ? new SqlGuid(p.Value).ToSqlBinary(): {2}", "Guid?");
+		ConvertTo("SqlBinary", "p.To{0}()",                                            "SqlBytes" , "SqlGuid");
+
+		// To SqlXml
+		//
+		ConvertTo("SqlXml", "p == null ? {2} : new {0}(new XmlTextReader(new StringReader(p)))",                    "String");
+		ConvertTo("SqlXml", "p == null ? {2} : new {0}(p)",                                                         "Stream", "XmlReader");
+		ConvertTo("SqlXml", "p == null ? {2} : new {0}(new XmlTextReader(new StringReader(p.InnerXml)))",           "XmlDocument");
+		ConvertTo("SqlXml", "p == null ? {2} : new {0}(new XmlTextReader(new StringReader(p.ToString())))",         "XElement");
+		ConvertTo("SqlXml", "p == null ? {2} : new {0}(new XmlTextReader(new StringReader(new string(p))))",        "Char[]");
+		ConvertTo("SqlXml", "p == null ? {2} : new {0}(new MemoryStream(p))",                                       "Byte[]");
+		ConvertTo("SqlXml", "p == null ? {2} : new {0}(new MemoryStream(p.ToArray()))",                             "Binary");
+		ConvertTo("SqlXml", "p.IsNull ? {2} : new {0}(new XmlTextReader(new StringReader(p.Value)))",               "SqlString");
+		ConvertTo("SqlXml", "p.IsNull ? {2} : new {0}(new XmlTextReader(new StringReader(p.ToSqlString().Value)))", "SqlChars");
+		ConvertTo("SqlXml", "p.IsNull ? {2} : new {0}(new MemoryStream(p.Value))",                                  "SqlBinary");
+		ConvertTo("SqlXml", "p.IsNull ? {2} : new {0}(p.Stream)",                                                   "SqlBytes");
+
+		// To Stream
+		// 
+		ConvertTo("Stream", "p == Guid.Empty ? {2} : new MemoryStream(p.ToByteArray())",  "Guid");
+		ConvertTo("Stream", "p == null ? {2} : new MemoryStream(p)",                      "Byte[]");
+		ConvertTo("Stream", "p == null ? {2} : new MemoryStream(p.ToArray())",            "Binary");
+		ConvertTo("Stream", "p.HasValue ? new MemoryStream(p.Value.ToByteArray()) : {2}", "Guid?");
+		ConvertTo("Stream", "p.IsNull ? {2} : p.Stream",                                  "SqlBytes");
+		ConvertTo("Stream", "p.IsNull ? {2} : new MemoryStream(p.Value)",                 "SqlBinary");
+		ConvertTo("Stream", "p.IsNull ? {2} : new MemoryStream(p.Value.ToByteArray())",   "SqlGuid");
+
+		// To Type
+		//
+		ConvertTo("Type", "p == null ? {2} : Type.GetType(p)",                            "String");
+		ConvertTo("Type", "p == null ? {2} : Type.GetType(new string(p))",                "Char[]");
+		ConvertTo("Type", "p == null ? {2} : Type.GetTypeFromCLSID(ToGuid(p))",           "Byte[]");
+		ConvertTo("Type", "p == null ? {2} : Type.GetTypeFromCLSID(ToGuid(p.ToArray()))", "Binary");
+		ConvertTo("Type", "p == Guid.Empty ? {2} : Type.GetTypeFromCLSID(p)",             "Guid");
+		ConvertTo("Type", "p.HasValue ? Type.GetTypeFromCLSID(p.Value) : {2}",            "Guid?");
+		ConvertTo("Type", "p.IsNull ? {2} : Type.GetType(p.Value)",                       "SqlString");
+		ConvertTo("Type", "p.IsNull ? {2} : Type.GetType(new string(p.Value))",           "SqlChars");
+		ConvertTo("Type", "p.IsNull ? {2} : Type.GetTypeFromCLSID(p.Value)",              "SqlGuid");
+
+		// To Byte[]
+		//
+		ConvertTo("Byte[]", "p == null ? {2} : System.Text.Encoding.UTF8.GetBytes(p)", "String");
+		ConvertTo("Byte[]", "new[] {{ p }}",                                           "Byte");
+		ConvertTo("Byte[]", "new[] {{ checked((Byte)p) }}",                            "SByte");
+		ConvertTo("Byte[]", "ToByteArray(p.ToBinary())",                               "DateTime");
+		ConvertTo("Byte[]", "ToByteArray(p.LocalDateTime.ToBinary())",                 "DateTimeOffset");
+		ConvertTo("Byte[]", "p == null ? {2} : p.ToArray()",                           "Binary");
+		ConvertTo("Byte[]", "ToByteArray(p.Ticks)",                                    "TimeSpan");
+		ConvertTo("Byte[]", "p == Guid.Empty ? {2} : p.ToByteArray()",                 "Guid");
+
+		ConvertTo("Byte[]", "BitConverter.GetBytes(p)",
+			"Int16", "Int32", "Int64", "UInt16", "UInt32", "UInt64", "Single", "Double", "Boolean", "Char");
+		ConvertTo("Byte[]", "p.HasValue ? ToByteArray(p.Value) : {2}",
+			"SByte?", "Int16?", "Int32?", "Int64?", "Byte?", "UInt16?", "UInt32?", "UInt64?", "Single?", "Double?", "Boolean?", "Decimal?", "Char?", "DateTime?", "DateTimeOffset?", "TimeSpan?", "Guid?");
+
+		ConvertTo("Byte[]", "p.IsNull ? {2} : p.Value",         "SqlBinary", "SqlBytes");
+		ConvertTo("Byte[]", "p.IsNull ? {2} : p.ToByteArray()", "SqlGuid");
+		ConvertTo("Byte[]", "p.IsNull ? {2} : ToByteArray(p.Value)",
+			"SqlString", "SqlByte", "SqlInt16", "SqlInt32", "SqlInt64", "SqlSingle", "SqlDouble", "SqlDecimal", "SqlMoney", "SqlBoolean");
+
+		// To SqlBytes
+		//
+		ConvertTo("SqlBytes", "p == null ? {2} : new {0}(p)",                      "Byte[]", "Stream");
+		ConvertTo("SqlBytes", "p == null ? {2} : new {0}(p.ToArray())",            "Binary");
+		ConvertTo("SqlBytes", "p == Guid.Empty ? {2}: new {0}(p.ToByteArray())",   "Guid");
+		ConvertTo("SqlBytes", "p.HasValue ? new {0}(p.Value.ToByteArray()) : {2}", "Guid?");
+		ConvertTo("SqlBytes", "p.IsNull ? {2} : new {0}(p)",                       "SqlBinary");
+		ConvertTo("SqlBytes", "p.IsNull ? {2} : new {0}(p.ToByteArray())",         "SqlGuid");
+
+		ConvertTo("SqlBytes", "p == null ? {2} : new {0}(ToByteArray(p))",         "String");
+		
+		ConvertTo("SqlBytes", "new {0}(ToByteArray(p))",
+			"Byte", "SByte", "DateTime", "DateTimeOffset", "TimeSpan", "Int16", "Int32", "Int64", "UInt16", "UInt32", "UInt64", "Single", "Double", "Boolean", "Char");
+		ConvertTo("SqlBytes", "p.HasValue ? ToSqlBytes(p.Value) : {2}",
+			"SByte?", "Int16?", "Int32?", "Int64?", "Byte?", "UInt16?", "UInt32?", "UInt64?", "Single?", "Double?", "Boolean?", "Decimal?", "Char?", "DateTime?", "DateTimeOffset?", "TimeSpan?", "Guid?");
+
+		ConvertTo("Byte[]", "p.IsNull ? {2} : ToSqlBytes(p.Value)",
+			"SqlString", "SqlByte", "SqlInt16", "SqlInt32", "SqlInt64", "SqlSingle", "SqlDouble", "SqlDecimal", "SqlMoney", "SqlBoolean");
+
+
+
+		string[] numberTypes1  = new string[] { "Int16", "Int32", "Int64", "UInt16", "UInt32", "UInt64", "Char", "Single", "Double", "SqlByte", "SqlInt16", "SqlInt32", "SqlInt64", "SqlSingle", "SqlDouble", "SqlDecimal", "SqlMoney" };
+		string[] numberTypes2  = Add(numberTypes1, "SByte", "Byte");
+		string[] numberTypes1n = numberTypes1.Where(_ => !_.StartsWith("Sql")).Select(_ => _ + "?").ToArray();
+		string[] numberTypes2n = numberTypes2.Where(_ => !_.StartsWith("Sql")).Select(_ => _ + "?").ToArray();
+
+		// From String
+		//
+		ConvertFrom("String", "p == null? {2} : {3}.Parse(p)",
+			Add(Add(numberTypes2, numberTypes2n), "Decimal", "DateTimeOffset", "TimeSpan", "Decimal?", "DateTimeOffset?", "TimeSpan?"));
+
+		// From Boolean
+		//
+		ConvertFrom("Boolean", "p ? ({0})1 : ({0})0",                     Add(Add(numberTypes2, numberTypes2n), "Decimal", "Decimal?"));
+
+		// From Boolean?
+		//
+		ConvertFrom("Boolean?", "p.HasValue && p.Value ? ({0})1: ({0})0", Add(Add(numberTypes2, numberTypes2n), "Decimal", "Decimal?"));
+
+		// From Byte[]
+		//
+		ConvertFrom("Byte[]", "p == null || p.Length == 0 ? {2} : BitConverter.To{3}(p, 0)",           Add(numberTypes1, numberTypes1n));
+
+		// From Binary
+		//
+		ConvertFrom("Binary", "p == null || p.Length == 0 ? {2} : BitConverter.To{3}(p.ToArray(), 0)", Add(numberTypes1, numberTypes1n));
+
+		Generate();
+#>
+	}
+}
+<#+
+class ToType
+{
+	public string Group;
+	public string Name;
+	public string Method;
+	public bool   NonCompliant;
+	public bool   NonSilverlightable; // :)
+	public string NullValue;
+	public string FromObjectReturn;
+
+	public Dictionary<string,string> Froms        = new Dictionary<string,string>();
+	public HashSet<string>           NonSLMethods = new HashSet<string>();
+}
+
+Dictionary<string,ToType> _types;
+
+void ConvertTo(string toType, string convertText, params string[] fromTypes)
+{
+	foreach (string fromType in fromTypes)
+	{
+		if (toType == fromType)
+			continue;
+
+		if (!_types.ContainsKey(fromType))
+			throw new InvalidOperationException(fromType);
+
+		if (!_types[toType].Froms.ContainsKey(fromType))
+			_types[toType].Froms.Add(fromType, string.Format(
+				convertText,
+				toType,
+				fromType,
+				_types[toType].NullValue ?? "(" + toType + ")null",
+				toType.  TrimEnd('?').Replace("Sql", "").Replace("Money", "Decimal"),
+				fromType.TrimEnd('?').Replace("Sql", "").Replace("Money", "Decimal")));
+	}
+}
+
+void ConvertTo(string[] toTypes, string convertText, params string[] fromTypes)
+{
+	foreach (var t in toTypes)
+		ConvertTo(t, convertText, fromTypes);
+}
+
+void ConvertFrom(string fromType, string convertText, params string[] toTypes)
+{
+	foreach (string toType in toTypes)
+		ConvertTo(toType, convertText, fromType);
+}
+
+void ConvertToNull(string toType, string convertText, string convertTextNull, params string[] fromTypes)
+{
+	ConvertTo(toType, convertText,     fromTypes);
+	ConvertTo(toType, convertTextNull, fromTypes.Select(_ => _ + "?").ToArray());
+}
+
+void ConvertToNull(string[] toTypes, string convertText, string convertTextNull, params string[] fromTypes)
+{
+	foreach (var t in toTypes)
+		ConvertToNull(t, convertText, convertTextNull, fromTypes);
+}
+
+void ConvertNumber(string toType, string[] types1, string[] types2, string[] types3, string[] types4)
+{
+	if (toType != "Money")
+	{
+		ConvertToNull(toType,
+			"p",
+			"p.HasValue ? p.Value : {2}",
+			types1);
+		ConvertToNull(toType,
+			"checked(({0})p)",
+			"p.HasValue ? checked(({0})p.Value) : {2}",
+			types2);
+		ConvertTo(toType, "p.IsNull ? {2} : p.Value",        Sql(types3));
+		ConvertTo(toType, "p.IsNull ? {2} : To{0}(p.Value)", Sql(types4));
+
+		ConvertToNull(toType + "?",
+			"p",
+			"p.HasValue ? p.Value : {2}",
+			types1);
+		ConvertToNull(toType + "?",
+			"checked(({0})p)",
+			"p.HasValue ? checked(({0})p.Value) : {2}",
+			types2);
+		ConvertTo(toType + "?", "p.IsNull ? {2} : p.Value",        Sql(types3));
+		ConvertTo(toType + "?", "p.IsNull ? {2} : To{3}(p.Value)", Sql(types4));
+	}
+
+	if (_types.ContainsKey("Sql" + toType))
+	{
+		ConvertToNull("Sql" + toType,
+			"p",
+			"p.HasValue ? p.Value : {2}",
+			types1);
+		ConvertToNull("Sql" + toType,
+			"checked(({3})p)",
+			"p.HasValue ? checked(({3})p.Value) : {2}",
+			types2);
+		ConvertTo("Sql" + toType, "p.To{0}()", Sql(types3));
+		ConvertTo("Sql" + toType, "p.To{0}()", Sql(types4));
+	}
+}
+
+string[] Sql(params string[] types)
+{
+	return types.Select(_ => "Sql" + _).ToArray();
+}
+
+string[] Add(string[] str1, params string[] str2)
+{
+	return str1.Concat(str2).ToArray();
+}
+
+IEnumerable<ToType> Set(Action<ToType> action, IEnumerable<ToType> types)
+{
+	foreach (var t in types)
+	{
+		action(t);
+		yield return t;
+	}
+}
+
+string LenDiff(int max, string str)
+{
+	var s = "";
+
+	while (max-- > str.Length)
+		s += " ";
+
+	return s;
+}
+
+Dictionary<string,int> _groupOrder = new Dictionary<string,int>
+{
+	{ "Simple",   1 },
+	{ "Nullable", 2 },
+	{ "Sql",      3 },
+	{ "Other",    4 },
+};
+
+HashSet<string> _codedTypes = new HashSet<string>
+{
+	"Boolean", "Char", "SByte", "Byte", "Int16", "UInt16", "Int32", "UInt32", "Int64", "UInt64", "Single", "Double", "Decimal", "DateTime", "String",
+};
+
+void Generate()
+{
+	PushIndent("\t\t");
+
+	foreach (var gr in _types.Values.Select(_ => _.Group).Distinct())
+	{
+		WriteLine("");
+		WriteLine("#region {0} Types", gr);
+
+		foreach (var to in
+			from t in _types.Values
+			where t.Group == gr
+			orderby t.Name
+			select t)
+		{
+			WriteLine("");
+			WriteLine("#region {0}", to.Name);
+			
+			var froms = from f in to.Froms.Keys select f;
+
+			if (to.NonSilverlightable)
+			{
+				ClearIndent();
+				WriteLine("");
+				WriteLine("#if !SILVERLIGHT");
+				PushIndent("\t\t");
+
+				froms =
+					from f in froms
+					orderby _groupOrder[_types[f].Group], _types[f].Name
+					select f;
+			}
+			else
+			{
+				froms =
+					from f in froms
+					orderby _types[f].NonSilverlightable, _groupOrder[_types[f].Group], _types[f].Name
+					select f;
+			}
+
+			var group = "";
+			var sl    = false;
+			var len   = froms.Concat(new[] { "" }).Select(_ => _.Length).Max();
+			var lcode = to.Froms.Values.Concat(new[] { "" }).Select(_ => (_ ?? "").Length).Max();
+
+			foreach (var f in froms)
+			{
+				var code = to.Froms[f];
+
+				if (code == null)
+					continue;
+
+				var fr = _types[f];
+
+				if (!to.NonSilverlightable && sl != fr.NonSilverlightable)
+				{
+					sl = fr.NonSilverlightable;
+
+					ClearIndent();
+					WriteLine("");
+					WriteLine("#if !SILVERLIGHT");
+					PushIndent("\t\t");
+				}
+
+				if (fr.Group != group)
+				{
+					group = fr.Group;
+
+					WriteLine("");
+					WriteLine("// {0} Types", group);
+					WriteLine("//");
+				}
+
+				if (to.NonSLMethods.Contains(fr.Name))
+				{
+					ClearIndent();
+					WriteLine("#if !SILVERLIGHT");
+					PushIndent("\t\t");
+				}
+
+				WriteLine("/// <summary>Converts the value from <c>{0}</c> to an equivalent <c>{1}</c> value.</summary>", fr.Name, to.Name);
+
+				if (to.NonCompliant || fr.NonCompliant)
+					WriteLine("[CLSCompliant(false)]");
+
+				WriteLine("public static {0} {1}({2}{3} p) {{ return {4};{5} }}",
+					to.Name, to.Method, fr.Name, LenDiff(len, fr.Name), code, LenDiff(lcode, code));
+
+				if (to.NonSLMethods.Contains(fr.Name))
+				{
+					ClearIndent();
+					WriteLine("#endif");
+					PushIndent("\t\t");
+				}
+			}
+
+			if (sl)
+			{
+				ClearIndent();
+				WriteLine("");
+				WriteLine("#endif");
+				PushIndent("\t\t");
+			}
+
+			// From Object
+			//
+			if (to.Froms.Count > 0)
+			{
+				WriteLine("");
+				WriteLine("// From Object");
+				WriteLine("//");
+
+				WriteLine("/// <summary>Converts the value from <c>Object</c> to an equivalent <c>{0}</c> value.</summary>", to.Name);
+
+				if (to.NonCompliant)
+					WriteLine("[CLSCompliant(false)]");
+
+				WriteLine("public static {0} {1}(object p)", to.Name, to.Method);
+				WriteLine("{");
+
+				PushIndent("\t");
+
+				var defType = false;
+
+				var tc =
+					from f in to.Froms.Keys
+					where _codedTypes.Contains(f)
+					select f;
+
+				if (tc.Any())
+				{
+					WriteLine("if (p == null) return {0};", to.NullValue ?? "null");
+					WriteLine("");
+
+					if (!_codedTypes.Contains(to.Name))
+					{
+						WriteLine("if (p is {0}) return ({0})p;", to.Name);
+						WriteLine("");
+					}
+
+					defType = true;
+
+					WriteLine("var type = p.GetType();");
+					WriteLine("");
+					WriteLine("// Primitive types");
+					WriteLine("//");
+					WriteLine("switch (Type.GetTypeCode(type))");
+					WriteLine("{");
+					PushIndent("\t");
+
+					len = new[] { to.Name, "DBNull" }.Concat(tc).Select(_ => _.Length).Max();
+
+					WriteLine("case TypeCode.DBNull{0} : return {1};", LenDiff(len, "DBNull"), to.NullValue ?? "null");
+
+					if (_codedTypes.Contains(to.Name))
+						WriteLine("case TypeCode.{0}{1} : return ({0})p;", to.Name, LenDiff(len, to.Name));
+
+					foreach (var t in tc)
+					{
+						if (to.NonSLMethods.Contains(t))
+						{
+							ClearIndent();
+							WriteLine("#if !SILVERLIGHT");
+							PushIndent("\t\t");
+							PushIndent("\t");
+							PushIndent("\t");
+						}
+
+						WriteLine("case TypeCode.{0}{1} : return {2}(({0}){1}p);", t, LenDiff(len, t), to.Method);
+
+						if (to.NonSLMethods.Contains(t))
+						{
+							ClearIndent();
+							WriteLine("#endif");
+							PushIndent("\t\t");
+							PushIndent("\t");
+							PushIndent("\t");
+						}
+					}
+
+					PopIndent();
+					WriteLine("}");
+				}
+				else
+				{
+					WriteLine("if (p == null || p is DBNull) return {0};", to.NullValue ?? "null");
+					WriteLine("");
+					WriteLine("if (p is {0}) return ({0})p;", to.Name);
+				}
+
+				tc =
+					from f in to.Froms.Keys
+					where !_codedTypes.Contains(f)
+					select f;
+
+				if (to.NonSilverlightable)
+				{
+					tc =
+						from f in tc
+						orderby _groupOrder[_types[f].Group], _types[f].Name
+						select f;
+				}
+				else
+				{
+					tc =
+						from f in tc
+						orderby _types[f].NonSilverlightable, _groupOrder[_types[f].Group], _types[f].Name
+						select f;
+				}
+
+				var openGroupBlock = false;
+
+				group = "";
+				sl    = false;
+				len   = new[] { "" }.Concat(tc).Select(_ => _.Length).Max();
+
+				foreach (var f in tc)
+				{
+					var fr = _types[f];
+
+					if (!to.NonSilverlightable && sl != fr.NonSilverlightable)
+					{
+						sl = fr.NonSilverlightable;
+
+						ClearIndent();
+						WriteLine("");
+						WriteLine("#if !SILVERLIGHT");
+						PushIndent("\t\t");
+						PushIndent("\t");
+					}
+
+					if (fr.Group != group)
+					{
+						group = fr.Group;
+
+						if (openGroupBlock)
+						{
+							openGroupBlock = false;
+							PopIndent();
+							WriteLine("}");
+						}
+
+						WriteLine("");
+						WriteLine("// {0} Types", group);
+						WriteLine("//");
+
+						if (group == "Nullable")
+						{
+							openGroupBlock = true;
+
+							if (!defType)
+							{
+								defType = true;
+								WriteLine("var type = p.GetType();");
+								WriteLine("");
+							}
+
+							WriteLine("if (type.IsGenericType)");
+							WriteLine("{");
+							
+							PushIndent("\t");
+						}
+						else if (group == "Sql")
+						{
+							openGroupBlock = true;
+
+							WriteLine("if (p is INullable)");
+							WriteLine("{");
+							
+							PushIndent("\t");
+						}
+					}
+
+					if (to.NonSLMethods.Contains(fr.Name))
+					{
+						ClearIndent();
+						WriteLine("#if !SILVERLIGHT");
+						PushIndent("\t\t");
+						PushIndent("\t");
+						if (openGroupBlock)
+							PushIndent("\t");
+					}
+
+					WriteLine("if (p is {0}){1} return {2}(({0}){1}p);", fr.Name, LenDiff(len, fr.Name), to.Method);
+
+					if (to.NonSLMethods.Contains(fr.Name))
+					{
+						ClearIndent();
+						WriteLine("#endif");
+						PushIndent("\t\t");
+						PushIndent("\t");
+						if (openGroupBlock)
+							PushIndent("\t");
+					}
+				}
+
+				if (openGroupBlock)
+				{
+					PopIndent();
+					WriteLine("}");
+				}
+
+				if (sl)
+				{
+					ClearIndent();
+					WriteLine("");
+					WriteLine("#endif");
+					PushIndent("\t\t");
+					PushIndent("\t");
+				}
+
+				if (_codedTypes.Contains(to.Name))
+				{
+					WriteLine("");
+					WriteLine("if (p is IConvertible) return ((IConvertible)p).To{0}(null);", to.Name);
+				}
+
+				WriteLine("");
+
+				if (to.FromObjectReturn != null)
+					WriteLine(to.FromObjectReturn);
+				else
+					WriteLine("throw CreateInvalidCastException(p.GetType(), typeof({0}));", to.Name);
+
+				PopIndent();
+
+				WriteLine("}");
+			}
+
+			if (to.NonSilverlightable)
+			{
+				ClearIndent();
+				WriteLine("");
+				WriteLine("#endif");
+				PushIndent("\t\t");
+			}
+
+			WriteLine("");
+			WriteLine("#endregion");
+		}
+
+		WriteLine("");
+		WriteLine("#endregion");
+	}
+
+	ClearIndent();
+}
+#>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Common/ConvertT.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,151 @@
+using System;
+using System.Reflection;
+using System.Threading;
+
+namespace BLToolkit.Common
+{
+	using Reflection;
+
+	/// <summary>
+	/// Converts a base data type to another base data type.
+	/// </summary>
+	/// <typeparam name="T">Destination data type.</typeparam>
+	/// <typeparam name="P">Source data type.</typeparam>
+	public static class Convert<T,P>
+	{
+		/// <summary>
+		/// Represents a method that converts an object from one type to another type.
+		/// </summary>
+		/// <param name="p">A value to convert to the target type.</param>
+		/// <returns>The <typeparamref name="T"/> that represents the converted <paramref name="p"/>.</returns>
+		public delegate T ConvertMethod(P p);
+
+		/// <summary>Converts an array of one type to an array of another type.</summary>
+		/// <returns>An array of the target type containing the converted elements from the source array.</returns>
+		/// <param name="src">The one-dimensional, zero-based <see cref="T:System.Array"></see> to convert to a target type.</param>
+		/// <exception cref="T:System.ArgumentNullException">array is null.-or-converter is null.</exception>
+		public static T[] FromArray(P[] src)
+		{
+			var arr = new T[src.Length];
+
+			for (var i = 0; i < arr.Length; i++)
+				arr[i] = From(src[i]);
+
+			return arr;
+		}
+
+		///<summary>
+		/// Converter instance.
+		///</summary>
+		public static ConvertMethod From = GetConverter();
+
+		///<summary>
+		/// Initializes converter instance.
+		///</summary>
+		///<returns>Converter instance.</returns>
+		public static ConvertMethod GetConverter()
+		{
+			var from = typeof(P);
+			var to   = typeof(T);
+
+			// Convert to the same type.
+			//
+			if (to == from)
+				return (ConvertMethod)(object)(Convert<P,P>.ConvertMethod)SameType;
+
+			if (from.IsEnum)
+				from = Enum.GetUnderlyingType(from);
+
+			if (to.IsEnum)
+				to = Enum.GetUnderlyingType(to);
+
+			if (TypeHelper.IsSameOrParent(to, from))
+				return Assignable;
+
+			string methodName;
+
+			if (TypeHelper.IsNullable(to))
+				methodName = "ToNullable" + to.GetGenericArguments()[0].Name;
+			else if (to.IsArray)
+				methodName = "To" + to.GetElementType().Name + "Array";
+			else if (to.Name == "Binary")
+				methodName = "ToLinq" + to.Name;
+			else
+				methodName = "To" + to.Name;
+
+			var mi = typeof(Convert).GetMethod(methodName,
+				BindingFlags.Public | BindingFlags.Static | BindingFlags.ExactBinding,
+				null, new[] { from }, null) ?? FindTypeCastOperator(to) ?? FindTypeCastOperator(from);
+
+			if (mi == null && TypeHelper.IsNullable(to))
+			{
+				// To-nullable conversion.
+				// We have to use reflection to enforce some constraints.
+				//
+				var toType   = to.GetGenericArguments()[0];
+				var fromType = TypeHelper.IsNullable(from)? from.GetGenericArguments()[0]: from;
+
+				methodName = TypeHelper.IsNullable(from) ? "FromNullable" : "From";
+
+				mi = typeof(NullableConvert<,>)
+					.MakeGenericType(toType, fromType)
+					.GetMethod(methodName, BindingFlags.Public | BindingFlags.Static);
+			}
+
+			if (mi != null)
+				return (ConvertMethod)Delegate.CreateDelegate(typeof(ConvertMethod), mi);
+
+			return Default;
+		}
+
+		private static MethodInfo FindTypeCastOperator(Type t)
+		{
+			foreach (var mi in t.GetMethods(BindingFlags.Public | BindingFlags.Static))
+			{
+				if (mi.IsSpecialName && mi.ReturnType == typeof(T) && (mi.Name == "op_Implicit" || mi.Name == "op_Explicit"))
+				{
+					var parameters = mi.GetParameters();
+
+					if (1 == parameters.Length && parameters[0].ParameterType == typeof(P))
+						return mi;
+				}
+			}
+
+			return null;
+		}
+
+		private static P SameType  (P p) { return p; }
+		private static T Assignable(P p) { return (T)(object)p; }
+		private static T Default   (P p) { return (T)System.Convert.ChangeType(p, typeof(T), Thread.CurrentThread.CurrentCulture); }
+	}
+
+	/// <summary>
+	/// Converts a base data type to another base data type.
+	/// </summary>
+	/// <typeparam name="T">Destination data type.</typeparam>
+	public static class ConvertTo<T>
+	{
+		/// <summary>Returns an <typeparamref name="T"/> whose value is equivalent to the specified value.</summary>
+		/// <returns>The <typeparamref name="T"/> that represents the converted <paramref name="p"/>.</returns>
+		/// <param name="p">A value to convert to the target type.</param>
+		public static T From<P>(P p)
+		{
+			return Convert<T,P>.From(p);
+		}
+	}
+
+	internal static class NullableConvert<T,P>
+		where T: struct
+		where P: struct
+	{
+		public static T? FromNullable(P? p)
+		{
+			return p.HasValue? From(p.Value): null;
+		}
+
+		public static T? From(P p)
+		{
+			return Convert<T,P>.From(p);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Common/EntityBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,131 @@
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Runtime.InteropServices;
+
+using BLToolkit.ComponentModel;
+using BLToolkit.Mapping;
+using BLToolkit.Validation;
+
+namespace BLToolkit.Common
+{
+	[Serializable, Trimmable, ComVisible(true), JetBrains.Annotations.UsedImplicitly]
+	public abstract class EntityBase : ICustomTypeDescriptor
+	{
+		#region Protected members
+
+		protected virtual ICustomTypeDescriptor CreateTypeDescriptor()
+		{
+			return new CustomTypeDescriptorImpl(GetType());
+		}
+
+		#endregion
+
+		#region ICustomTypeDescriptor Members
+
+		private static readonly Hashtable _hashDescriptors = new Hashtable();
+
+		[NonSerialized]
+		private ICustomTypeDescriptor _typeDescriptor;
+		private ICustomTypeDescriptor  TypeDescriptor
+		{
+			get
+			{
+				if (_typeDescriptor == null)
+				{
+					Type key = GetType();
+
+					_typeDescriptor = (ICustomTypeDescriptor)_hashDescriptors[key];
+
+					if (_typeDescriptor == null)
+						_hashDescriptors[key] = _typeDescriptor = CreateTypeDescriptor();
+				}
+
+				return _typeDescriptor;
+			}
+		}
+
+		AttributeCollection ICustomTypeDescriptor.GetAttributes()
+		{
+			return TypeDescriptor.GetAttributes();
+		}
+
+		string ICustomTypeDescriptor.GetClassName()
+		{
+			return TypeDescriptor.GetClassName();
+		}
+
+		string ICustomTypeDescriptor.GetComponentName()
+		{
+			return TypeDescriptor.GetComponentName();
+		}
+
+		TypeConverter ICustomTypeDescriptor.GetConverter()
+		{
+			return TypeDescriptor.GetConverter();
+		}
+
+		EventDescriptor ICustomTypeDescriptor.GetDefaultEvent()
+		{
+			return TypeDescriptor.GetDefaultEvent();
+		}
+
+		PropertyDescriptor ICustomTypeDescriptor.GetDefaultProperty()
+		{
+			return TypeDescriptor.GetDefaultProperty();
+		}
+
+		object ICustomTypeDescriptor.GetEditor(Type editorBaseType)
+		{
+			return TypeDescriptor.GetEditor(editorBaseType);
+		}
+
+		EventDescriptorCollection ICustomTypeDescriptor.GetEvents(Attribute[] attributes)
+		{
+			return TypeDescriptor.GetEvents(attributes);
+		}
+
+		EventDescriptorCollection ICustomTypeDescriptor.GetEvents()
+		{
+			return TypeDescriptor.GetEvents();
+		}
+
+		PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes)
+		{
+			return TypeDescriptor.GetProperties(attributes);
+		}
+
+		PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties()
+		{
+			return TypeDescriptor.GetProperties();
+		}
+
+		object ICustomTypeDescriptor.GetPropertyOwner(PropertyDescriptor pd)
+		{
+			// Do not relay this call to TypeDescriptor. We are the owner.
+			//
+			return this;
+		}
+
+		#endregion
+
+		#region Validation
+
+		public virtual void Validate()
+		{
+			Validator.Validate(this);
+		}
+
+		public virtual bool IsValid(string fieldName)
+		{
+			return Validator.IsValid(this, fieldName);
+		}
+
+		public virtual string[] GetErrorMessages(string fieldName)
+		{
+			return Validator.GetErrorMessages(this, fieldName);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Common/EntityBaseT.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,29 @@
+using System;
+
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Common
+{
+	[Serializable]
+	public abstract class EntityBase<T> : EntityBase
+		where T : EntityBase<T>
+	{
+		#region CreateInstance
+
+		public static T CreateInstance()
+		{
+			return TypeAccessor.CreateInstanceEx<T>();
+		}
+
+		#endregion
+
+		#region Clone
+
+		public virtual T Clone()
+		{
+			return (T)TypeAccessor.Copy(this);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Common/IOperable.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,28 @@
+using System;
+
+namespace BLToolkit.Common
+{
+	public interface IOperable<T>
+	{
+		T Addition             (T op1, T op2);
+		T Subtraction          (T op1, T op2);
+		T Multiply             (T op1, T op2);
+		T Division             (T op1, T op2);
+		T Modulus              (T op1, T op2);
+
+		T BitwiseAnd           (T op1, T op2);
+		T BitwiseOr            (T op1, T op2);
+		T ExclusiveOr          (T op1, T op2);
+
+		T UnaryNegation        (T op);
+		T OnesComplement       (T op);
+		
+		bool Equality          (T op1, T op2);
+		bool Inequality        (T op1, T op2);
+		bool GreaterThan       (T op1, T op2);
+		bool GreaterThanOrEqual(T op1, T op2);
+		bool LessThan          (T op1, T op2);
+		bool LessThanOrEqual   (T op1, T op2);
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Common/NameOrIndexParameter.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,139 @@
+using System;
+using System.Linq;
+using BLToolkit.Properties;
+
+namespace BLToolkit.Common
+{
+	/// <summary>
+	/// This argument adapter class allows either names (strings) or
+	/// indices (ints) to be passed to a function.
+	/// </summary>
+	[System.Diagnostics.DebuggerStepThrough]
+	public struct NameOrIndexParameter
+	{
+		public NameOrIndexParameter(string name)
+		{
+			if (null == name)
+				throw new ArgumentNullException("name");
+
+			if (name.Length == 0)
+				throw new ArgumentException(Resources.NameOrIndexParameter_BadName, "name");
+
+			_name  = name;
+			_index = 0;
+		}
+
+		public NameOrIndexParameter(int index)
+		{
+			if (index < 0)
+				throw new ArgumentException(Resources.NameOrIndexParameter_BadIndex, "index");
+
+			_name  = null;
+			_index = index;
+		}
+
+		public static implicit operator NameOrIndexParameter(string name)
+		{
+			return new NameOrIndexParameter(name);
+		}
+
+		public static implicit operator NameOrIndexParameter(int index)
+		{
+			return new NameOrIndexParameter(index);
+		}
+
+		#region Public properties
+		
+		public bool ByName
+		{
+			get { return null != _name; }
+		}
+
+		private readonly string _name;
+		public           string  Name
+		{
+			get
+			{
+				if (null == _name)
+					throw new InvalidOperationException(
+						"This instance was initialized by index");
+				
+				 return _name;
+			}
+		}
+
+		private readonly int _index;
+		public           int  Index
+		{
+			get
+			{
+				if (null != _name)
+					throw new InvalidOperationException(
+						"This instance was initialized by name");
+
+				return _index;
+			}
+		}
+
+		#endregion
+
+		#region Static methods
+
+		public static NameOrIndexParameter[] FromStringArray(string[] names)
+		{
+			return names.Select(name => new NameOrIndexParameter(name)).ToArray();
+		}
+
+		public static NameOrIndexParameter[] FromIndexArray(int[] indices)
+		{
+			return indices.Select(index => new NameOrIndexParameter(index)).ToArray();
+		}
+
+		#endregion
+		
+		#region System.Object members
+
+		public override bool Equals(object obj)
+		{
+			if (obj is NameOrIndexParameter)
+			{
+				var nip = (NameOrIndexParameter)obj;
+
+				if (null != _name && null != nip._name && _name == nip._name)
+					return true; // Same name
+				
+				if (null == _name && null == nip._name && _index == nip._index)
+					return true; // Same index
+
+				return false;
+			}
+
+			if (obj is string)
+			{
+				var name = (string)obj;
+				return (null != _name && _name == name);
+			}
+
+			if (obj is int)
+			{
+				var index = (int)obj;
+				return (null == _name && _index == index);
+			}
+
+			return false;
+		}
+
+		public override int GetHashCode()
+		{
+			return (null != _name) ? _name.GetHashCode() : _index.GetHashCode();
+		}
+		
+		public override string ToString()
+		{
+			return _name ?? "#" + _index;
+		}
+
+		#endregion
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Common/Operator.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1405 @@
+using System;
+using System.Data.SqlTypes;
+
+namespace BLToolkit.Common
+{
+	public static class Operator<T>
+	{
+		public  static IOperable<T> Op = GetOperable();
+		private static IOperable<T> GetOperable()
+		{
+			Type t = typeof(T);
+
+			// Scalar types.
+			//
+			if (t == typeof(String))      return (IOperable<T>)new S();
+
+			if (t == typeof(SByte))       return (IOperable<T>)new S8();
+			if (t == typeof(Int16))       return (IOperable<T>)new S16();
+			if (t == typeof(Int32))       return (IOperable<T>)new S32();
+			if (t == typeof(Int64))       return (IOperable<T>)new S64();
+
+			if (t == typeof(Byte))        return (IOperable<T>)new U8();
+			if (t == typeof(UInt16))      return (IOperable<T>)new U16();
+			if (t == typeof(UInt32))      return (IOperable<T>)new U32();
+			if (t == typeof(UInt64))      return (IOperable<T>)new U64();
+
+			if (t == typeof(bool))        return (IOperable<T>)new B();
+			if (t == typeof(Char))        return (IOperable<T>)new C();
+			if (t == typeof(Single))      return (IOperable<T>)new R4();
+			if (t == typeof(Double))      return (IOperable<T>)new R8();
+
+			if (t == typeof(Decimal))     return (IOperable<T>)new D();
+			if (t == typeof(DateTime))    return (IOperable<T>)new DT();
+			if (t == typeof(TimeSpan))    return (IOperable<T>)new TS();
+			if (t == typeof(Guid))        return (IOperable<T>)new G();
+
+			// Nullable types.
+			//
+			if (t == typeof(SByte?))      return (IOperable<T>)new NS8();
+			if (t == typeof(Int16?))      return (IOperable<T>)new NS16();
+			if (t == typeof(Int32?))      return (IOperable<T>)new NS32();
+			if (t == typeof(Int64?))      return (IOperable<T>)new NS64();
+
+			if (t == typeof(Byte?))       return (IOperable<T>)new NU8();
+			if (t == typeof(UInt16?))     return (IOperable<T>)new NU16();
+			if (t == typeof(UInt32?))     return (IOperable<T>)new NU32();
+			if (t == typeof(UInt64?))     return (IOperable<T>)new NU64();
+
+			if (t == typeof(bool?))       return (IOperable<T>)new NB();
+			if (t == typeof(Char?))       return (IOperable<T>)new NC();
+			if (t == typeof(Single?))     return (IOperable<T>)new NR4();
+			if (t == typeof(Double?))     return (IOperable<T>)new NR8();
+
+			if (t == typeof(Decimal?))    return (IOperable<T>)new ND();
+			if (t == typeof(DateTime?))   return (IOperable<T>)new NDT();
+			if (t == typeof(TimeSpan?))   return (IOperable<T>)new NTS();
+			if (t == typeof(Guid?))       return (IOperable<T>)new NG();
+
+			// Sql types.
+			//
+			if (t == typeof(SqlString))   return (IOperable<T>)new DBS();
+
+			if (t == typeof(SqlByte))     return (IOperable<T>)new DBU8();
+			if (t == typeof(SqlInt16))    return (IOperable<T>)new DBS16();
+			if (t == typeof(SqlInt32))    return (IOperable<T>)new DBS32();
+			if (t == typeof(SqlInt64))    return (IOperable<T>)new DBS64();
+
+			if (t == typeof(SqlSingle))   return (IOperable<T>)new DBR4();
+			if (t == typeof(SqlDouble))   return (IOperable<T>)new DBR8();
+			if (t == typeof(SqlDecimal))  return (IOperable<T>)new DBD();
+			if (t == typeof(SqlMoney))    return (IOperable<T>)new DBM();
+
+			if (t == typeof(SqlBoolean))  return (IOperable<T>)new DBB();
+			if (t == typeof(SqlBinary))   return (IOperable<T>)new DBBin();
+			if (t == typeof(SqlDateTime)) return (IOperable<T>)new DBDT();
+			if (t == typeof(SqlGuid))     return (IOperable<T>)new DBG();
+
+			return new Default<T>();
+		}
+
+		public static T Addition             (T op1, T op2) { return Op.Addition          (op1, op2); }
+		public static T Subtraction          (T op1, T op2) { return Op.Subtraction       (op1, op2); }
+		public static T Multiply             (T op1, T op2) { return Op.Multiply          (op1, op2); }
+		public static T Division             (T op1, T op2) { return Op.Division          (op1, op2); }
+		public static T Modulus              (T op1, T op2) { return Op.Modulus           (op1, op2); }
+
+		public static T BitwiseAnd           (T op1, T op2) { return Op.BitwiseAnd        (op1, op2); }
+		public static T BitwiseOr            (T op1, T op2) { return Op.BitwiseOr         (op1, op2); }
+		public static T ExclusiveOr          (T op1, T op2) { return Op.ExclusiveOr       (op1, op2); }
+
+		public static T UnaryNegation        (T op)         { return Op.UnaryNegation     (op);       }
+		public static T OnesComplement       (T op)         { return Op.OnesComplement    (op);       }
+	
+		public static bool Equality          (T op1, T op2) { return Op.Equality          (op1, op2); }
+		public static bool Inequality        (T op1, T op2) { return Op.Inequality        (op1, op2); }
+		public static bool GreaterThan       (T op1, T op2) { return Op.GreaterThan       (op1, op2); }
+		public static bool GreaterThanOrEqual(T op1, T op2) { return Op.GreaterThanOrEqual(op1, op2); }
+		public static bool LessThan          (T op1, T op2) { return Op.LessThan          (op1, op2); }
+		public static bool LessThanOrEqual   (T op1, T op2) { return Op.LessThanOrEqual   (op1, op2); }
+
+		#region Default
+
+		private class Default<Q> : IOperable<Q>
+		{
+			public Q Addition             (Q op1, Q op2) { throw new InvalidOperationException(); }
+			public Q Subtraction          (Q op1, Q op2) { throw new InvalidOperationException(); }
+			public Q Multiply             (Q op1, Q op2) { throw new InvalidOperationException(); }
+			public Q Division             (Q op1, Q op2) { throw new InvalidOperationException(); }
+			public Q Modulus              (Q op1, Q op2) { throw new InvalidOperationException(); }
+
+			public Q BitwiseAnd           (Q op1, Q op2) { throw new InvalidOperationException(); }
+			public Q BitwiseOr            (Q op1, Q op2) { throw new InvalidOperationException(); }
+			public Q ExclusiveOr          (Q op1, Q op2) { throw new InvalidOperationException(); }
+
+			public Q UnaryNegation        (Q op)         { throw new InvalidOperationException(); }
+			public Q OnesComplement       (Q op)         { throw new InvalidOperationException(); }
+
+			public bool Equality          (Q op1, Q op2) { throw new InvalidOperationException(); }
+			public bool Inequality        (Q op1, Q op2) { throw new InvalidOperationException(); }
+			public bool GreaterThan       (Q op1, Q op2) { throw new InvalidOperationException(); }
+			public bool GreaterThanOrEqual(Q op1, Q op2) { throw new InvalidOperationException(); }
+			public bool LessThan          (Q op1, Q op2) { throw new InvalidOperationException(); }
+			public bool LessThanOrEqual   (Q op1, Q op2) { throw new InvalidOperationException(); }
+		}
+
+		#endregion
+
+		#region Scalar Types.
+
+		#region String
+
+		private class S : IOperable<String>
+		{
+			public String Addition        (String op1, String op2) { return (op1 + op2); }
+			public String Subtraction     (String op1, String op2) { throw new InvalidOperationException(); }
+			public String Multiply        (String op1, String op2) { throw new InvalidOperationException(); }
+			public String Division        (String op1, String op2) { throw new InvalidOperationException(); }
+			public String Modulus         (String op1, String op2) { throw new InvalidOperationException(); }
+
+			public String BitwiseAnd      (String op1, String op2) { throw new InvalidOperationException(); }
+			public String BitwiseOr       (String op1, String op2) { throw new InvalidOperationException(); }
+			public String ExclusiveOr     (String op1, String op2) { throw new InvalidOperationException(); }
+
+			public String UnaryNegation   (String op)              { throw new InvalidOperationException(); }
+			public String OnesComplement  (String op)              { throw new InvalidOperationException(); }
+
+			public bool Equality          (String op1, String op2) { return op1 == op2; }
+			public bool Inequality        (String op1, String op2) { return op1 != op2; }
+			public bool GreaterThan       (String op1, String op2) { throw new InvalidOperationException(); }
+			public bool GreaterThanOrEqual(String op1, String op2) { throw new InvalidOperationException(); }
+			public bool LessThan          (String op1, String op2) { throw new InvalidOperationException(); }
+			public bool LessThanOrEqual   (String op1, String op2) { throw new InvalidOperationException(); }
+		}
+
+		#endregion
+
+		#region SByte
+
+		private class S8 : IOperable<SByte>
+		{
+			public SByte Addition         (SByte op1, SByte op2) { return (SByte)(op1 + op2); }
+			public SByte Subtraction      (SByte op1, SByte op2) { return (SByte)(op1 - op2); }
+			public SByte Multiply         (SByte op1, SByte op2) { return (SByte)(op1 * op2); }
+			public SByte Division         (SByte op1, SByte op2) { return (SByte)(op1 / op2); }
+			public SByte Modulus          (SByte op1, SByte op2) { return (SByte)(op1 % op2); }
+
+			public SByte BitwiseAnd       (SByte op1, SByte op2) { return (SByte)(op1 & op2); }
+			public SByte BitwiseOr        (SByte op1, SByte op2) { return (SByte)(op1 | op2); }
+			public SByte ExclusiveOr      (SByte op1, SByte op2) { return (SByte)(op1 ^ op2); }
+
+			public SByte UnaryNegation    (SByte op)             { return (SByte)(-op); }
+			public SByte OnesComplement   (SByte op)             { return (SByte)(~op); }
+
+			public bool Equality          (SByte op1, SByte op2) { return op1 == op2; }
+			public bool Inequality        (SByte op1, SByte op2) { return op1 != op2; }
+			public bool GreaterThan       (SByte op1, SByte op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(SByte op1, SByte op2) { return op1 >= op2; }
+			public bool LessThan          (SByte op1, SByte op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (SByte op1, SByte op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region Int16
+
+		private class S16 : IOperable<Int16>
+		{
+			public Int16 Addition         (Int16 op1, Int16 op2) { return (Int16)(op1 + op2); }
+			public Int16 Subtraction      (Int16 op1, Int16 op2) { return (Int16)(op1 - op2); }
+			public Int16 Multiply         (Int16 op1, Int16 op2) { return (Int16)(op1 * op2); }
+			public Int16 Division         (Int16 op1, Int16 op2) { return (Int16)(op1 / op2); }
+			public Int16 Modulus          (Int16 op1, Int16 op2) { return (Int16)(op1 % op2); }
+
+			public Int16 BitwiseAnd       (Int16 op1, Int16 op2) { return (Int16)(op1 & op2); }
+			public Int16 BitwiseOr        (Int16 op1, Int16 op2) { return (Int16)(op1 | op2); }
+			public Int16 ExclusiveOr      (Int16 op1, Int16 op2) { return (Int16)(op1 ^ op2); }
+
+			public Int16 UnaryNegation    (Int16 op)             { return (Int16)(-op); }
+			public Int16 OnesComplement   (Int16 op)             { return (Int16)(~op); }
+
+			public bool Equality          (Int16 op1, Int16 op2) { return op1 == op2; }
+			public bool Inequality        (Int16 op1, Int16 op2) { return op1 != op2; }
+			public bool GreaterThan       (Int16 op1, Int16 op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(Int16 op1, Int16 op2) { return op1 >= op2; }
+			public bool LessThan          (Int16 op1, Int16 op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (Int16 op1, Int16 op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region Int32
+
+		private class S32 : IOperable<Int32>
+		{
+			public Int32 Addition         (Int32 op1, Int32 op2) { return (op1 + op2); }
+			public Int32 Subtraction      (Int32 op1, Int32 op2) { return (op1 - op2); }
+			public Int32 Multiply         (Int32 op1, Int32 op2) { return (op1 * op2); }
+			public Int32 Division         (Int32 op1, Int32 op2) { return (op1 / op2); }
+			public Int32 Modulus          (Int32 op1, Int32 op2) { return (op1 % op2); }
+
+			public Int32 BitwiseAnd       (Int32 op1, Int32 op2) { return (op1 & op2); }
+			public Int32 BitwiseOr        (Int32 op1, Int32 op2) { return (op1 | op2); }
+			public Int32 ExclusiveOr      (Int32 op1, Int32 op2) { return (op1 ^ op2); }
+
+			public Int32 UnaryNegation    (Int32 op)             { return (-op); }
+			public Int32 OnesComplement   (Int32 op)             { return (~op); }
+
+			public bool Equality          (Int32 op1, Int32 op2) { return op1 == op2; }
+			public bool Inequality        (Int32 op1, Int32 op2) { return op1 != op2; }
+			public bool GreaterThan       (Int32 op1, Int32 op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(Int32 op1, Int32 op2) { return op1 >= op2; }
+			public bool LessThan          (Int32 op1, Int32 op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (Int32 op1, Int32 op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region Int64
+
+		private class S64 : IOperable<Int64>
+		{
+			public Int64 Addition         (Int64 op1, Int64 op2) { return (op1 + op2); }
+			public Int64 Subtraction      (Int64 op1, Int64 op2) { return (op1 - op2); }
+			public Int64 Multiply         (Int64 op1, Int64 op2) { return (op1 * op2); }
+			public Int64 Division         (Int64 op1, Int64 op2) { return (op1 / op2); }
+			public Int64 Modulus          (Int64 op1, Int64 op2) { return (op1 % op2); }
+
+			public Int64 BitwiseAnd       (Int64 op1, Int64 op2) { return (op1 & op2); }
+			public Int64 BitwiseOr        (Int64 op1, Int64 op2) { return (op1 | op2); }
+			public Int64 ExclusiveOr      (Int64 op1, Int64 op2) { return (op1 ^ op2); }
+
+			public Int64 UnaryNegation    (Int64 op)             { return (-op); }
+			public Int64 OnesComplement   (Int64 op)             { return (~op); }
+
+			public bool Equality          (Int64 op1, Int64 op2) { return op1 == op2; }
+			public bool Inequality        (Int64 op1, Int64 op2) { return op1 != op2; }
+			public bool GreaterThan       (Int64 op1, Int64 op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(Int64 op1, Int64 op2) { return op1 >= op2; }
+			public bool LessThan          (Int64 op1, Int64 op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (Int64 op1, Int64 op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region Byte
+
+		private class U8 : IOperable<Byte>
+		{
+			public Byte Addition          (Byte op1, Byte op2) { return (Byte)(op1 + op2); }
+			public Byte Subtraction       (Byte op1, Byte op2) { return (Byte)(op1 - op2); }
+			public Byte Multiply          (Byte op1, Byte op2) { return (Byte)(op1 * op2); }
+			public Byte Division          (Byte op1, Byte op2) { return (Byte)(op1 / op2); }
+			public Byte Modulus           (Byte op1, Byte op2) { return (Byte)(op1 % op2); }
+
+			public Byte BitwiseAnd        (Byte op1, Byte op2) { return (Byte)(op1 & op2); }
+			public Byte BitwiseOr         (Byte op1, Byte op2) { return (Byte)(op1 | op2); }
+			public Byte ExclusiveOr       (Byte op1, Byte op2) { return (Byte)(op1 ^ op2); }
+
+			public Byte UnaryNegation     (Byte op)            { throw new InvalidOperationException(); }
+			public Byte OnesComplement    (Byte op)            { return (Byte)(~op); }
+
+			public bool Equality          (Byte op1, Byte op2) { return op1 == op2; }
+			public bool Inequality        (Byte op1, Byte op2) { return op1 != op2; }
+			public bool GreaterThan       (Byte op1, Byte op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(Byte op1, Byte op2) { return op1 >= op2; }
+			public bool LessThan          (Byte op1, Byte op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (Byte op1, Byte op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region UInt16
+
+		private class U16 : IOperable<UInt16>
+		{
+			public UInt16 Addition        (UInt16 op1, UInt16 op2) { return (UInt16)(op1 + op2); }
+			public UInt16 Subtraction     (UInt16 op1, UInt16 op2) { return (UInt16)(op1 - op2); }
+			public UInt16 Multiply        (UInt16 op1, UInt16 op2) { return (UInt16)(op1 * op2); }
+			public UInt16 Division        (UInt16 op1, UInt16 op2) { return (UInt16)(op1 / op2); }
+			public UInt16 Modulus         (UInt16 op1, UInt16 op2) { return (UInt16)(op1 % op2); }
+
+			public UInt16 BitwiseAnd      (UInt16 op1, UInt16 op2) { return (UInt16)(op1 & op2); }
+			public UInt16 BitwiseOr       (UInt16 op1, UInt16 op2) { return (UInt16)(op1 | op2); }
+			public UInt16 ExclusiveOr     (UInt16 op1, UInt16 op2) { return (UInt16)(op1 ^ op2); }
+
+			public UInt16 UnaryNegation   (UInt16 op)              { throw new InvalidOperationException(); }
+			public UInt16 OnesComplement  (UInt16 op)              { return (UInt16)(~op); }
+
+			public bool Equality          (UInt16 op1, UInt16 op2) { return op1 == op2; }
+			public bool Inequality        (UInt16 op1, UInt16 op2) { return op1 != op2; }
+			public bool GreaterThan       (UInt16 op1, UInt16 op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(UInt16 op1, UInt16 op2) { return op1 >= op2; }
+			public bool LessThan          (UInt16 op1, UInt16 op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (UInt16 op1, UInt16 op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region UInt32
+
+		private class U32 : IOperable<UInt32>
+		{
+			public UInt32 Addition        (UInt32 op1, UInt32 op2) { return (op1 + op2); }
+			public UInt32 Subtraction     (UInt32 op1, UInt32 op2) { return (op1 - op2); }
+			public UInt32 Multiply        (UInt32 op1, UInt32 op2) { return (op1 * op2); }
+			public UInt32 Division        (UInt32 op1, UInt32 op2) { return (op1 / op2); }
+			public UInt32 Modulus         (UInt32 op1, UInt32 op2) { return (op1 % op2); }
+
+			public UInt32 BitwiseAnd      (UInt32 op1, UInt32 op2) { return (op1 & op2); }
+			public UInt32 BitwiseOr       (UInt32 op1, UInt32 op2) { return (op1 | op2); }
+			public UInt32 ExclusiveOr     (UInt32 op1, UInt32 op2) { return (op1 ^ op2); }
+			 
+			public UInt32 UnaryNegation   (UInt32 op)              { throw new InvalidOperationException(); }
+			public UInt32 OnesComplement  (UInt32 op)              { return (~op); }
+
+			public bool Equality          (UInt32 op1, UInt32 op2) { return op1 == op2; }
+			public bool Inequality        (UInt32 op1, UInt32 op2) { return op1 != op2; }
+			public bool GreaterThan       (UInt32 op1, UInt32 op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(UInt32 op1, UInt32 op2) { return op1 >= op2; }
+			public bool LessThan          (UInt32 op1, UInt32 op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (UInt32 op1, UInt32 op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region UInt64
+
+		private class U64 : IOperable<UInt64>
+		{
+			public UInt64 Addition        (UInt64 op1, UInt64 op2) { return (op1 + op2); }
+			public UInt64 Subtraction     (UInt64 op1, UInt64 op2) { return (op1 - op2); }
+			public UInt64 Multiply        (UInt64 op1, UInt64 op2) { return (op1 * op2); }
+			public UInt64 Division        (UInt64 op1, UInt64 op2) { return (op1 / op2); }
+			public UInt64 Modulus         (UInt64 op1, UInt64 op2) { return (op1 % op2); }
+
+			public UInt64 BitwiseAnd      (UInt64 op1, UInt64 op2) { return (op1 & op2); }
+			public UInt64 BitwiseOr       (UInt64 op1, UInt64 op2) { return (op1 | op2); }
+			public UInt64 ExclusiveOr     (UInt64 op1, UInt64 op2) { return (op1 ^ op2); }
+
+			public UInt64 UnaryNegation   (UInt64 op)              { throw new InvalidOperationException(); }
+			public UInt64 OnesComplement  (UInt64 op)              { return (~op); }
+
+			public bool Equality          (UInt64 op1, UInt64 op2) { return op1 == op2; }
+			public bool Inequality        (UInt64 op1, UInt64 op2) { return op1 != op2; }
+			public bool GreaterThan       (UInt64 op1, UInt64 op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(UInt64 op1, UInt64 op2) { return op1 >= op2; }
+			public bool LessThan          (UInt64 op1, UInt64 op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (UInt64 op1, UInt64 op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region Boolean
+
+		private class B : IOperable<Boolean>
+		{
+			public Boolean Addition       (Boolean op1, Boolean op2) { throw new InvalidOperationException(); }
+			public Boolean Subtraction    (Boolean op1, Boolean op2) { throw new InvalidOperationException(); }
+			public Boolean Multiply       (Boolean op1, Boolean op2) { throw new InvalidOperationException(); }
+			public Boolean Division       (Boolean op1, Boolean op2) { throw new InvalidOperationException(); }
+			public Boolean Modulus        (Boolean op1, Boolean op2) { throw new InvalidOperationException(); }
+
+			public Boolean BitwiseAnd     (Boolean op1, Boolean op2) { return (op1 & op2); }
+			public Boolean BitwiseOr      (Boolean op1, Boolean op2) { return (op1 | op2); }
+			public Boolean ExclusiveOr    (Boolean op1, Boolean op2) { return (op1 ^ op2); }
+
+			public Boolean UnaryNegation  (Boolean op)               { throw new InvalidOperationException(); }
+			public Boolean OnesComplement (Boolean op)               { return !op; }
+
+			public bool Equality          (Boolean op1, Boolean op2) { return op1 ==  op2; }
+			public bool Inequality        (Boolean op1, Boolean op2) { return op1 !=  op2; }
+			public bool GreaterThan       (Boolean op1, Boolean op2) { throw new InvalidOperationException(); }
+			public bool GreaterThanOrEqual(Boolean op1, Boolean op2) { throw new InvalidOperationException(); }
+			public bool LessThan          (Boolean op1, Boolean op2) { throw new InvalidOperationException(); }
+			public bool LessThanOrEqual   (Boolean op1, Boolean op2) { throw new InvalidOperationException(); }
+		}
+
+		#endregion
+
+		#region Char
+
+		private class C : IOperable<Char>
+		{
+			public Char Addition          (Char op1, Char op2) { return (Char)(op1 + op2); }
+			public Char Subtraction       (Char op1, Char op2) { return (Char)(op1 - op2); }
+			public Char Multiply          (Char op1, Char op2) { return (Char)(op1 * op2); }
+			public Char Division          (Char op1, Char op2) { return (Char)(op1 / op2); }
+			public Char Modulus           (Char op1, Char op2) { return (Char)(op1 % op2); }
+
+			public Char BitwiseAnd        (Char op1, Char op2) { return (Char)(op1 & op2); }
+			public Char BitwiseOr         (Char op1, Char op2) { return (Char)(op1 | op2); }
+			public Char ExclusiveOr       (Char op1, Char op2) { return (Char)(op1 ^ op2); }
+
+			public Char UnaryNegation     (Char op)            { return (Char)(-op); }
+			public Char OnesComplement    (Char op)            { return (Char)(~op); }
+
+			public bool Equality          (Char op1, Char op2) { return op1 == op2; }
+			public bool Inequality        (Char op1, Char op2) { return op1 != op2; }
+			public bool GreaterThan       (Char op1, Char op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(Char op1, Char op2) { return op1 >= op2; }
+			public bool LessThan          (Char op1, Char op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (Char op1, Char op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region Single
+
+		private class R4 : IOperable<Single>
+		{
+			public Single Addition        (Single op1, Single op2) { return (op1 + op2); }
+			public Single Subtraction     (Single op1, Single op2) { return (op1 - op2); }
+			public Single Multiply        (Single op1, Single op2) { return (op1 * op2); }
+			public Single Division        (Single op1, Single op2) { return (op1 / op2); }
+			public Single Modulus         (Single op1, Single op2) { return (op1 % op2); }
+
+			public Single BitwiseAnd      (Single op1, Single op2) { throw new InvalidOperationException(); }
+			public Single BitwiseOr       (Single op1, Single op2) { throw new InvalidOperationException(); }
+			public Single ExclusiveOr     (Single op1, Single op2) { throw new InvalidOperationException(); }
+
+			public Single UnaryNegation   (Single op)              { return (-op); }
+			public Single OnesComplement  (Single op)              { throw new InvalidOperationException(); }
+
+			public bool Equality          (Single op1, Single op2) { return op1 == op2; }
+			public bool Inequality        (Single op1, Single op2) { return op1 != op2; }
+			public bool GreaterThan       (Single op1, Single op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(Single op1, Single op2) { return op1 >= op2; }
+			public bool LessThan          (Single op1, Single op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (Single op1, Single op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region Double
+
+		private class R8 : IOperable<Double>
+		{
+			public Double Addition        (Double op1, Double op2) { return (op1 + op2); }
+			public Double Subtraction     (Double op1, Double op2) { return (op1 - op2); }
+			public Double Multiply        (Double op1, Double op2) { return (op1 * op2); }
+			public Double Division        (Double op1, Double op2) { return (op1 / op2); }
+			public Double Modulus         (Double op1, Double op2) { return (op1 % op2); }
+
+			public Double BitwiseAnd      (Double op1, Double op2) { throw new InvalidOperationException(); }
+			public Double BitwiseOr       (Double op1, Double op2) { throw new InvalidOperationException(); }
+			public Double ExclusiveOr     (Double op1, Double op2) { throw new InvalidOperationException(); }
+
+			public Double UnaryNegation   (Double op)              { return (-op); }
+			public Double OnesComplement  (Double op)              { throw new InvalidOperationException(); }
+
+			public bool Equality          (Double op1, Double op2) { return op1 == op2; }
+			public bool Inequality        (Double op1, Double op2) { return op1 != op2; }
+			public bool GreaterThan       (Double op1, Double op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(Double op1, Double op2) { return op1 >= op2; }
+			public bool LessThan          (Double op1, Double op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (Double op1, Double op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region Decimal
+
+		private class D : IOperable<Decimal>
+		{
+			public Decimal Addition       (Decimal op1, Decimal op2) { return (op1 + op2); }
+			public Decimal Subtraction    (Decimal op1, Decimal op2) { return (op1 - op2); }
+			public Decimal Multiply       (Decimal op1, Decimal op2) { return (op1 * op2); }
+			public Decimal Division       (Decimal op1, Decimal op2) { return (op1 / op2); }
+			public Decimal Modulus        (Decimal op1, Decimal op2) { return (op1 % op2); }
+
+			public Decimal BitwiseAnd     (Decimal op1, Decimal op2) { throw new InvalidOperationException(); }
+			public Decimal BitwiseOr      (Decimal op1, Decimal op2) { throw new InvalidOperationException(); }
+			public Decimal ExclusiveOr    (Decimal op1, Decimal op2) { throw new InvalidOperationException(); }
+
+			public Decimal UnaryNegation  (Decimal op)               { return (-op); }
+			public Decimal OnesComplement (Decimal op)               { throw new InvalidOperationException(); }
+
+			public bool Equality          (Decimal op1, Decimal op2) { return op1 == op2; }
+			public bool Inequality        (Decimal op1, Decimal op2) { return op1 != op2; }
+			public bool GreaterThan       (Decimal op1, Decimal op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(Decimal op1, Decimal op2) { return op1 >= op2; }
+			public bool LessThan          (Decimal op1, Decimal op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (Decimal op1, Decimal op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region DateTime
+
+		private class DT : IOperable<DateTime>
+		{
+			public DateTime Addition      (DateTime op1, DateTime op2) { throw new InvalidOperationException(); }
+			public DateTime Subtraction   (DateTime op1, DateTime op2) { throw new InvalidOperationException(); }
+			public DateTime Multiply      (DateTime op1, DateTime op2) { throw new InvalidOperationException(); }
+			public DateTime Division      (DateTime op1, DateTime op2) { throw new InvalidOperationException(); }
+			public DateTime Modulus       (DateTime op1, DateTime op2) { throw new InvalidOperationException(); }
+
+			public DateTime BitwiseAnd    (DateTime op1, DateTime op2) { throw new InvalidOperationException(); }
+			public DateTime BitwiseOr     (DateTime op1, DateTime op2) { throw new InvalidOperationException(); }
+			public DateTime ExclusiveOr   (DateTime op1, DateTime op2) { throw new InvalidOperationException(); }
+
+			public DateTime UnaryNegation (DateTime op)                { throw new InvalidOperationException(); }
+			public DateTime OnesComplement(DateTime op)                { throw new InvalidOperationException(); }
+
+			public bool Equality          (DateTime op1, DateTime op2) { return op1 == op2; }
+			public bool Inequality        (DateTime op1, DateTime op2) { return op1 != op2; }
+			public bool GreaterThan       (DateTime op1, DateTime op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(DateTime op1, DateTime op2) { return op1 >= op2; }
+			public bool LessThan          (DateTime op1, DateTime op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (DateTime op1, DateTime op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region TimeSpan
+
+		private class TS : IOperable<TimeSpan>
+		{
+			public TimeSpan Addition      (TimeSpan op1, TimeSpan op2) { return (op1 + op2); }
+			public TimeSpan Subtraction   (TimeSpan op1, TimeSpan op2) { return (op1 - op2); }
+			public TimeSpan Multiply      (TimeSpan op1, TimeSpan op2) { throw new InvalidOperationException(); }
+			public TimeSpan Division      (TimeSpan op1, TimeSpan op2) { throw new InvalidOperationException(); }
+			public TimeSpan Modulus       (TimeSpan op1, TimeSpan op2) { throw new InvalidOperationException(); }
+
+			public TimeSpan BitwiseAnd    (TimeSpan op1, TimeSpan op2) { throw new InvalidOperationException(); }
+			public TimeSpan BitwiseOr     (TimeSpan op1, TimeSpan op2) { throw new InvalidOperationException(); }
+			public TimeSpan ExclusiveOr   (TimeSpan op1, TimeSpan op2) { throw new InvalidOperationException(); }
+
+			public TimeSpan UnaryNegation (TimeSpan op)                { return (-op); }
+			public TimeSpan OnesComplement(TimeSpan op)                { throw new InvalidOperationException(); }
+
+			public bool Equality          (TimeSpan op1, TimeSpan op2) { return op1 == op2; }
+			public bool Inequality        (TimeSpan op1, TimeSpan op2) { return op1 != op2; }
+			public bool GreaterThan       (TimeSpan op1, TimeSpan op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(TimeSpan op1, TimeSpan op2) { return op1 >= op2; }
+			public bool LessThan          (TimeSpan op1, TimeSpan op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (TimeSpan op1, TimeSpan op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region Guid
+
+		private class G : IOperable<Guid>
+		{
+			public Guid Addition          (Guid op1, Guid op2) { throw new InvalidOperationException(); }
+			public Guid Subtraction        (Guid op1, Guid op2) { throw new InvalidOperationException(); }
+			public Guid Multiply          (Guid op1, Guid op2) { throw new InvalidOperationException(); }
+			public Guid Division          (Guid op1, Guid op2) { throw new InvalidOperationException(); }
+			public Guid Modulus           (Guid op1, Guid op2) { throw new InvalidOperationException(); }
+
+			public Guid BitwiseAnd        (Guid op1, Guid op2) { throw new InvalidOperationException(); }
+			public Guid BitwiseOr         (Guid op1, Guid op2) { throw new InvalidOperationException(); }
+			public Guid ExclusiveOr       (Guid op1, Guid op2) { throw new InvalidOperationException(); }
+
+			public Guid UnaryNegation     (Guid op)            { throw new InvalidOperationException(); }
+			public Guid OnesComplement    (Guid op)            { throw new InvalidOperationException(); }
+
+			public bool Equality          (Guid op1, Guid op2) { return op1 == op2; }
+			public bool Inequality        (Guid op1, Guid op2) { return op1 != op2; }
+			public bool GreaterThan       (Guid op1, Guid op2) { throw new InvalidOperationException(); }
+			public bool GreaterThanOrEqual(Guid op1, Guid op2) { throw new InvalidOperationException(); }
+			public bool LessThan          (Guid op1, Guid op2) { throw new InvalidOperationException(); }
+			public bool LessThanOrEqual   (Guid op1, Guid op2) { throw new InvalidOperationException(); }
+		}
+
+		#endregion
+
+		#endregion
+
+		#region Nullable Types.
+
+		#region SByte
+
+		private class NS8 : IOperable<SByte?>
+		{
+			public SByte? Addition        (SByte? op1, SByte? op2) { return (SByte?)(op1 + op2); }
+			public SByte? Subtraction     (SByte? op1, SByte? op2) { return (SByte?)(op1 - op2); }
+			public SByte? Multiply        (SByte? op1, SByte? op2) { return (SByte?)(op1 * op2); }
+			public SByte? Division        (SByte? op1, SByte? op2) { return (SByte?)(op1 / op2); }
+			public SByte? Modulus         (SByte? op1, SByte? op2) { return (SByte?)(op1 % op2); }
+
+			public SByte? BitwiseAnd      (SByte? op1, SByte? op2) { return (SByte?)(op1 & op2); }
+			public SByte? BitwiseOr       (SByte? op1, SByte? op2) { return (SByte?)(op1 | op2); }
+			public SByte? ExclusiveOr     (SByte? op1, SByte? op2) { return (SByte?)(op1 ^ op2); }
+
+			public SByte? UnaryNegation   (SByte? op)              { return (SByte)(- op); }
+			public SByte? OnesComplement  (SByte? op)              { return (SByte)(~op); }
+
+			public bool Equality          (SByte? op1, SByte? op2) { return op1 == op2; }
+			public bool Inequality        (SByte? op1, SByte? op2) { return op1 != op2; }
+			public bool GreaterThan       (SByte? op1, SByte? op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(SByte? op1, SByte? op2) { return op1 >= op2; }
+			public bool LessThan          (SByte? op1, SByte? op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (SByte? op1, SByte? op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region Int16
+
+		private class NS16 : IOperable<Int16?>
+		{
+			public Int16? Addition        (Int16? op1, Int16? op2) { return (Int16?)(op1 + op2); }
+			public Int16? Subtraction     (Int16? op1, Int16? op2) { return (Int16?)(op1 - op2); }
+			public Int16? Multiply        (Int16? op1, Int16? op2) { return (Int16?)(op1 * op2); }
+			public Int16? Division        (Int16? op1, Int16? op2) { return (Int16?)(op1 / op2); }
+			public Int16? Modulus         (Int16? op1, Int16? op2) { return (Int16?)(op1 % op2); }
+
+			public Int16? BitwiseAnd      (Int16? op1, Int16? op2) { return (Int16?)(op1 & op2); }
+			public Int16? BitwiseOr       (Int16? op1, Int16? op2) { return (Int16?)(op1 | op2); }
+			public Int16? ExclusiveOr     (Int16? op1, Int16? op2) { return (Int16?)(op1 ^ op2); }
+
+			public Int16? UnaryNegation   (Int16? op)              { return (Int16)(- op); }
+			public Int16? OnesComplement  (Int16? op)              { return (Int16)(~op); }
+
+			public bool Equality          (Int16? op1, Int16? op2) { return op1 == op2; }
+			public bool Inequality        (Int16? op1, Int16? op2) { return op1 != op2; }
+			public bool GreaterThan       (Int16? op1, Int16? op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(Int16? op1, Int16? op2) { return op1 >= op2; }
+			public bool LessThan          (Int16? op1, Int16? op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (Int16? op1, Int16? op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region Int32
+
+		private class NS32 : IOperable<Int32?>
+		{
+			public Int32? Addition        (Int32? op1, Int32? op2) { return (op1 + op2); }
+			public Int32? Subtraction     (Int32? op1, Int32? op2) { return (op1 - op2); }
+			public Int32? Multiply        (Int32? op1, Int32? op2) { return (op1 * op2); }
+			public Int32? Division        (Int32? op1, Int32? op2) { return (op1 / op2); }
+			public Int32? Modulus         (Int32? op1, Int32? op2) { return (op1 % op2); }
+
+			public Int32? BitwiseAnd      (Int32? op1, Int32? op2) { return (op1 & op2); }
+			public Int32? BitwiseOr       (Int32? op1, Int32? op2) { return (op1 | op2); }
+			public Int32? ExclusiveOr     (Int32? op1, Int32? op2) { return (op1 ^ op2); }
+
+			public Int32? UnaryNegation   (Int32? op)              { return (- op); }
+			public Int32? OnesComplement  (Int32? op)              { return (~op); }
+
+			public bool Equality          (Int32? op1, Int32? op2) { return op1 == op2; }
+			public bool Inequality        (Int32? op1, Int32? op2) { return op1 != op2; }
+			public bool GreaterThan       (Int32? op1, Int32? op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(Int32? op1, Int32? op2) { return op1 >= op2; }
+			public bool LessThan          (Int32? op1, Int32? op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (Int32? op1, Int32? op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region Int64
+
+		private class NS64 : IOperable<Int64?>
+		{
+			public Int64? Addition        (Int64? op1, Int64? op2) { return (op1 + op2); }
+			public Int64? Subtraction     (Int64? op1, Int64? op2) { return (op1 - op2); }
+			public Int64? Multiply        (Int64? op1, Int64? op2) { return (op1 * op2); }
+			public Int64? Division        (Int64? op1, Int64? op2) { return (op1 / op2); }
+			public Int64? Modulus         (Int64? op1, Int64? op2) { return (op1 % op2); }
+
+			public Int64? BitwiseAnd      (Int64? op1, Int64? op2) { return (op1 & op2); }
+			public Int64? BitwiseOr       (Int64? op1, Int64? op2) { return (op1 | op2); }
+			public Int64? ExclusiveOr     (Int64? op1, Int64? op2) { return (op1 ^ op2); }
+
+			public Int64? UnaryNegation   (Int64? op)              { return (- op); }
+			public Int64? OnesComplement  (Int64? op)              { return (~op); }
+
+			public bool Equality          (Int64? op1, Int64? op2) { return op1 == op2; }
+			public bool Inequality        (Int64? op1, Int64? op2) { return op1 != op2; }
+			public bool GreaterThan       (Int64? op1, Int64? op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(Int64? op1, Int64? op2) { return op1 >= op2; }
+			public bool LessThan          (Int64? op1, Int64? op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (Int64? op1, Int64? op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region Byte
+
+		private class NU8 : IOperable<Byte?>
+		{
+			public Byte? Addition         (Byte? op1, Byte? op2) { return (Byte?)(op1 + op2); }
+			public Byte? Subtraction      (Byte? op1, Byte? op2) { return (Byte?)(op1 - op2); }
+			public Byte? Multiply         (Byte? op1, Byte? op2) { return (Byte?)(op1 * op2); }
+			public Byte? Division         (Byte? op1, Byte? op2) { return (Byte?)(op1 / op2); }
+			public Byte? Modulus          (Byte? op1, Byte? op2) { return (Byte?)(op1 % op2); }
+
+			public Byte? BitwiseAnd       (Byte? op1, Byte? op2) { return (Byte?)(op1 & op2); }
+			public Byte? BitwiseOr        (Byte? op1, Byte? op2) { return (Byte?)(op1 | op2); }
+			public Byte? ExclusiveOr      (Byte? op1, Byte? op2) { return (Byte?)(op1 ^ op2); }
+
+			public Byte? UnaryNegation    (Byte? op)             { throw new InvalidOperationException(); }
+			public Byte? OnesComplement   (Byte? op)             { return (Byte?)(~op); }
+
+			public bool Equality          (Byte? op1, Byte? op2) { return op1 == op2; }
+			public bool Inequality        (Byte? op1, Byte? op2) { return op1 != op2; }
+			public bool GreaterThan       (Byte? op1, Byte? op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(Byte? op1, Byte? op2) { return op1 >= op2; }
+			public bool LessThan          (Byte? op1, Byte? op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (Byte? op1, Byte? op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region UInt16
+
+		private class NU16 : IOperable<UInt16?>
+		{
+			public UInt16? Addition       (UInt16? op1, UInt16? op2) { return (UInt16?)(op1 + op2); }
+			public UInt16? Subtraction    (UInt16? op1, UInt16? op2) { return (UInt16?)(op1 - op2); }
+			public UInt16? Multiply       (UInt16? op1, UInt16? op2) { return (UInt16?)(op1 * op2); }
+			public UInt16? Division       (UInt16? op1, UInt16? op2) { return (UInt16?)(op1 / op2); }
+			public UInt16? Modulus        (UInt16? op1, UInt16? op2) { return (UInt16?)(op1 % op2); }
+
+			public UInt16? BitwiseAnd     (UInt16? op1, UInt16? op2) { return (UInt16?)(op1 & op2); }
+			public UInt16? BitwiseOr      (UInt16? op1, UInt16? op2) { return (UInt16?)(op1 | op2); }
+			public UInt16? ExclusiveOr    (UInt16? op1, UInt16? op2) { return (UInt16?)(op1 ^ op2); }
+
+			public UInt16? UnaryNegation  (UInt16? op)               { throw new InvalidOperationException(); }
+			public UInt16? OnesComplement (UInt16? op)               { return (UInt16?)(~op); }
+
+			public bool Equality          (UInt16? op1, UInt16? op2) { return op1 == op2; }
+			public bool Inequality        (UInt16? op1, UInt16? op2) { return op1 != op2; }
+			public bool GreaterThan       (UInt16? op1, UInt16? op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(UInt16? op1, UInt16? op2) { return op1 >= op2; }
+			public bool LessThan          (UInt16? op1, UInt16? op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (UInt16? op1, UInt16? op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region UInt32
+
+		private class NU32 : IOperable<UInt32?>
+		{
+			public UInt32? Addition       (UInt32? op1, UInt32? op2) { return (op1 + op2); }
+			public UInt32? Subtraction    (UInt32? op1, UInt32? op2) { return (op1 - op2); }
+			public UInt32? Multiply       (UInt32? op1, UInt32? op2) { return (op1 * op2); }
+			public UInt32? Division       (UInt32? op1, UInt32? op2) { return (op1 / op2); }
+			public UInt32? Modulus        (UInt32? op1, UInt32? op2) { return (op1 % op2); }
+
+			public UInt32? BitwiseAnd     (UInt32? op1, UInt32? op2) { return (op1 & op2); }
+			public UInt32? BitwiseOr      (UInt32? op1, UInt32? op2) { return (op1 | op2); }
+			public UInt32? ExclusiveOr    (UInt32? op1, UInt32? op2) { return (op1 ^ op2); }
+			 
+			public UInt32? UnaryNegation  (UInt32? op)               { throw new InvalidOperationException(); }
+			public UInt32? OnesComplement (UInt32? op)               { return (~op); }
+
+			public bool Equality          (UInt32? op1, UInt32? op2) { return op1 == op2; }
+			public bool Inequality        (UInt32? op1, UInt32? op2) { return op1 != op2; }
+			public bool GreaterThan       (UInt32? op1, UInt32? op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(UInt32? op1, UInt32? op2) { return op1 >= op2; }
+			public bool LessThan          (UInt32? op1, UInt32? op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (UInt32? op1, UInt32? op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region UInt64
+
+		private class NU64 : IOperable<UInt64?>
+		{
+			public UInt64? Addition       (UInt64? op1, UInt64? op2) { return (op1 + op2); }
+			public UInt64? Subtraction    (UInt64? op1, UInt64? op2) { return (op1 - op2); }
+			public UInt64? Multiply       (UInt64? op1, UInt64? op2) { return (op1 * op2); }
+			public UInt64? Division       (UInt64? op1, UInt64? op2) { return (op1 / op2); }
+			public UInt64? Modulus        (UInt64? op1, UInt64? op2) { return (op1 % op2); }
+
+			public UInt64? BitwiseAnd     (UInt64? op1, UInt64? op2) { return (op1 & op2); }
+			public UInt64? BitwiseOr      (UInt64? op1, UInt64? op2) { return (op1 | op2); }
+			public UInt64? ExclusiveOr    (UInt64? op1, UInt64? op2) { return (op1 ^ op2); }
+
+			public UInt64? UnaryNegation  (UInt64? op)               { throw new InvalidOperationException(); }
+			public UInt64? OnesComplement (UInt64? op)               { return (~op); }
+
+			public bool Equality          (UInt64? op1, UInt64? op2) { return op1 == op2; }
+			public bool Inequality        (UInt64? op1, UInt64? op2) { return op1 != op2; }
+			public bool GreaterThan       (UInt64? op1, UInt64? op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(UInt64? op1, UInt64? op2) { return op1 >= op2; }
+			public bool LessThan          (UInt64? op1, UInt64? op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (UInt64? op1, UInt64? op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region Boolean
+
+		private class NB : IOperable<Boolean?>
+		{
+			public Boolean? Addition      (Boolean? op1, Boolean? op2) { throw new InvalidOperationException(); }
+			public Boolean? Subtraction   (Boolean? op1, Boolean? op2) { throw new InvalidOperationException(); }
+			public Boolean? Multiply      (Boolean? op1, Boolean? op2) { throw new InvalidOperationException(); }
+			public Boolean? Division      (Boolean? op1, Boolean? op2) { throw new InvalidOperationException(); }
+			public Boolean? Modulus       (Boolean? op1, Boolean? op2) { throw new InvalidOperationException(); }
+
+			public Boolean? BitwiseAnd    (Boolean? op1, Boolean? op2) { return (op1 & op2); }
+			public Boolean? BitwiseOr     (Boolean? op1, Boolean? op2) { return (op1 | op2); }
+			public Boolean? ExclusiveOr   (Boolean? op1, Boolean? op2) { return (op1 ^ op2); }
+
+			public Boolean? UnaryNegation (Boolean? op)                { throw new InvalidOperationException(); }
+			public Boolean? OnesComplement(Boolean? op)                { return !op; }
+
+			public bool Equality          (Boolean? op1, Boolean? op2) { return op1 == op2; }
+			public bool Inequality        (Boolean? op1, Boolean? op2) { return op1 != op2; }
+			public bool GreaterThan       (Boolean? op1, Boolean? op2) { throw new InvalidOperationException(); }
+			public bool GreaterThanOrEqual(Boolean? op1, Boolean? op2) { throw new InvalidOperationException(); }
+			public bool LessThan          (Boolean? op1, Boolean? op2) { throw new InvalidOperationException(); }
+			public bool LessThanOrEqual   (Boolean? op1, Boolean? op2) { throw new InvalidOperationException(); }
+		}
+
+		#endregion
+
+		#region Char
+
+		private class NC : IOperable<Char?>
+		{
+			public Char? Addition         (Char? op1, Char? op2) { return (Char?)(op1 + op2); }
+			public Char? Subtraction      (Char? op1, Char? op2) { return (Char?)(op1 - op2); }
+			public Char? Multiply         (Char? op1, Char? op2) { return (Char?)(op1 * op2); }
+			public Char? Division         (Char? op1, Char? op2) { return (Char?)(op1 / op2); }
+			public Char? Modulus          (Char? op1, Char? op2) { return (Char?)(op1 % op2); }
+
+			public Char? BitwiseAnd       (Char? op1, Char? op2) { return (Char?)(op1 & op2); }
+			public Char? BitwiseOr        (Char? op1, Char? op2) { return (Char?)(op1 | op2); }
+			public Char? ExclusiveOr      (Char? op1, Char? op2) { return (Char?)(op1 ^ op2); }
+
+			public Char? UnaryNegation    (Char? op)             { return (Char?)(-op); }
+			public Char? OnesComplement   (Char? op)             { return (Char?)(~op); }
+
+			public bool Equality          (Char? op1, Char? op2) { return op1 == op2; }
+			public bool Inequality        (Char? op1, Char? op2) { return op1 != op2; }
+			public bool GreaterThan       (Char? op1, Char? op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(Char? op1, Char? op2) { return op1 >= op2; }
+			public bool LessThan          (Char? op1, Char? op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (Char? op1, Char? op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region Single
+
+		private class NR4 : IOperable<Single?>
+		{
+			public Single? Addition       (Single? op1, Single? op2) { return (op1 + op2); }
+			public Single? Subtraction    (Single? op1, Single? op2) { return (op1 - op2); }
+			public Single? Multiply       (Single? op1, Single? op2) { return (op1 * op2); }
+			public Single? Division       (Single? op1, Single? op2) { return (op1 / op2); }
+			public Single? Modulus        (Single? op1, Single? op2) { return (op1 % op2); }
+
+			public Single? BitwiseAnd     (Single? op1, Single? op2) { throw new InvalidOperationException(); }
+			public Single? BitwiseOr      (Single? op1, Single? op2) { throw new InvalidOperationException(); }
+			public Single? ExclusiveOr    (Single? op1, Single? op2) { throw new InvalidOperationException(); }
+
+			public Single? UnaryNegation  (Single? op)               { return (- op); }
+			public Single? OnesComplement (Single? op)               { throw new InvalidOperationException(); }
+
+			public bool Equality          (Single? op1, Single? op2) { return op1 == op2; }
+			public bool Inequality        (Single? op1, Single? op2) { return op1 != op2; }
+			public bool GreaterThan       (Single? op1, Single? op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(Single? op1, Single? op2) { return op1 >= op2; }
+			public bool LessThan          (Single? op1, Single? op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (Single? op1, Single? op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region Double
+
+		private class NR8 : IOperable<Double?>
+		{
+			public Double? Addition       (Double? op1, Double? op2) { return (op1 + op2); }
+			public Double? Subtraction    (Double? op1, Double? op2) { return (op1 - op2); }
+			public Double? Multiply       (Double? op1, Double? op2) { return (op1 * op2); }
+			public Double? Division       (Double? op1, Double? op2) { return (op1 / op2); }
+			public Double? Modulus        (Double? op1, Double? op2) { return (op1 % op2); }
+
+			public Double? BitwiseAnd     (Double? op1, Double? op2) { throw new InvalidOperationException(); }
+			public Double? BitwiseOr      (Double? op1, Double? op2) { throw new InvalidOperationException(); }
+			public Double? ExclusiveOr    (Double? op1, Double? op2) { throw new InvalidOperationException(); }
+
+			public Double? UnaryNegation  (Double? op)               { return (- op); }
+			public Double? OnesComplement (Double? op)               { throw new InvalidOperationException(); }
+
+			public bool Equality          (Double? op1, Double? op2) { return op1 == op2; }
+			public bool Inequality        (Double? op1, Double? op2) { return op1 != op2; }
+			public bool GreaterThan       (Double? op1, Double? op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(Double? op1, Double? op2) { return op1 >= op2; }
+			public bool LessThan          (Double? op1, Double? op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (Double? op1, Double? op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region Decimal
+
+		private class ND : IOperable<Decimal?>
+		{
+			public Decimal? Addition      (Decimal? op1, Decimal? op2) { return (op1 + op2); }
+			public Decimal? Subtraction   (Decimal? op1, Decimal? op2) { return (op1 - op2); }
+			public Decimal? Multiply      (Decimal? op1, Decimal? op2) { return (op1 * op2); }
+			public Decimal? Division      (Decimal? op1, Decimal? op2) { return (op1 / op2); }
+			public Decimal? Modulus       (Decimal? op1, Decimal? op2) { return (op1 % op2); }
+
+			public Decimal? BitwiseAnd    (Decimal? op1, Decimal? op2) { throw new InvalidOperationException(); }
+			public Decimal? BitwiseOr     (Decimal? op1, Decimal? op2) { throw new InvalidOperationException(); }
+			public Decimal? ExclusiveOr   (Decimal? op1, Decimal? op2) { throw new InvalidOperationException(); }
+
+			public Decimal? UnaryNegation (Decimal? op)                { return (- op); }
+			public Decimal? OnesComplement(Decimal? op)                { throw new InvalidOperationException(); }
+
+			public bool Equality          (Decimal? op1, Decimal? op2) { return op1 == op2; }
+			public bool Inequality        (Decimal? op1, Decimal? op2) { return op1 != op2; }
+			public bool GreaterThan       (Decimal? op1, Decimal? op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(Decimal? op1, Decimal? op2) { return op1 >= op2; }
+			public bool LessThan          (Decimal? op1, Decimal? op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (Decimal? op1, Decimal? op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region DateTime
+
+		private class NDT : IOperable<DateTime?>
+		{
+			public DateTime? Addition      (DateTime? op1, DateTime? op2) { throw new InvalidOperationException(); }
+			public DateTime? Subtraction   (DateTime? op1, DateTime? op2) { throw new InvalidOperationException(); }
+			public DateTime? Multiply      (DateTime? op1, DateTime? op2) { throw new InvalidOperationException(); }
+			public DateTime? Division      (DateTime? op1, DateTime? op2) { throw new InvalidOperationException(); }
+			public DateTime? Modulus       (DateTime? op1, DateTime? op2) { throw new InvalidOperationException(); }
+
+			public DateTime? BitwiseAnd    (DateTime? op1, DateTime? op2) { throw new InvalidOperationException(); }
+			public DateTime? BitwiseOr     (DateTime? op1, DateTime? op2) { throw new InvalidOperationException(); }
+			public DateTime? ExclusiveOr   (DateTime? op1, DateTime? op2) { throw new InvalidOperationException(); }
+
+			public DateTime? UnaryNegation (DateTime? op)                 { throw new InvalidOperationException(); }
+			public DateTime? OnesComplement(DateTime? op)                 { throw new InvalidOperationException(); }
+
+			public bool Equality           (DateTime? op1, DateTime? op2) { return op1 == op2; }
+			public bool Inequality         (DateTime? op1, DateTime? op2) { return op1 != op2; }
+			public bool GreaterThan        (DateTime? op1, DateTime? op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual (DateTime? op1, DateTime? op2) { return op1 >= op2; }
+			public bool LessThan           (DateTime? op1, DateTime? op2) { return op1 <  op2; }
+			public bool LessThanOrEqual    (DateTime? op1, DateTime? op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region TimeSpan
+
+		private class NTS : IOperable<TimeSpan?>
+		{
+			public TimeSpan? Addition      (TimeSpan? op1, TimeSpan? op2) { return (op1 + op2); }
+			public TimeSpan? Subtraction   (TimeSpan? op1, TimeSpan? op2) { return (op1 - op2); }
+			public TimeSpan? Multiply      (TimeSpan? op1, TimeSpan? op2) { throw new InvalidOperationException(); }
+			public TimeSpan? Division      (TimeSpan? op1, TimeSpan? op2) { throw new InvalidOperationException(); }
+			public TimeSpan? Modulus       (TimeSpan? op1, TimeSpan? op2) { throw new InvalidOperationException(); }
+
+			public TimeSpan? BitwiseAnd    (TimeSpan? op1, TimeSpan? op2) { throw new InvalidOperationException(); }
+			public TimeSpan? BitwiseOr     (TimeSpan? op1, TimeSpan? op2) { throw new InvalidOperationException(); }
+			public TimeSpan? ExclusiveOr   (TimeSpan? op1, TimeSpan? op2) { throw new InvalidOperationException(); }
+
+			public TimeSpan? UnaryNegation (TimeSpan? op)                 { return (- op); }
+			public TimeSpan? OnesComplement(TimeSpan? op)                 { throw new InvalidOperationException(); }
+
+			public bool Equality           (TimeSpan? op1, TimeSpan? op2) { return op1 == op2; }
+			public bool Inequality         (TimeSpan? op1, TimeSpan? op2) { return op1 != op2; }
+			public bool GreaterThan        (TimeSpan? op1, TimeSpan? op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual (TimeSpan? op1, TimeSpan? op2) { return op1 >= op2; }
+			public bool LessThan           (TimeSpan? op1, TimeSpan? op2) { return op1 <  op2; }
+			public bool LessThanOrEqual    (TimeSpan? op1, TimeSpan? op2) { return op1 <= op2; }
+		}
+
+		#endregion
+
+		#region Guid?
+
+		private class NG : IOperable<Guid?>
+		{
+			public Guid? Addition         (Guid? op1, Guid? op2) { throw new InvalidOperationException(); }
+			public Guid? Subtraction      (Guid? op1, Guid? op2) { throw new InvalidOperationException(); }
+			public Guid? Multiply         (Guid? op1, Guid? op2) { throw new InvalidOperationException(); }
+			public Guid? Division         (Guid? op1, Guid? op2) { throw new InvalidOperationException(); }
+			public Guid? Modulus          (Guid? op1, Guid? op2) { throw new InvalidOperationException(); }
+
+			public Guid? BitwiseAnd       (Guid? op1, Guid? op2) { throw new InvalidOperationException(); }
+			public Guid? BitwiseOr        (Guid? op1, Guid? op2) { throw new InvalidOperationException(); }
+			public Guid? ExclusiveOr      (Guid? op1, Guid? op2) { throw new InvalidOperationException(); }
+
+			public Guid? UnaryNegation    (Guid? op)             { throw new InvalidOperationException(); }
+			public Guid? OnesComplement   (Guid? op)             { throw new InvalidOperationException(); }
+
+			public bool Equality          (Guid? op1, Guid? op2) { return op1 == op2; }
+			public bool Inequality        (Guid? op1, Guid? op2) { return op1 != op2; }
+			public bool GreaterThan       (Guid? op1, Guid? op2) { throw new InvalidOperationException(); }
+			public bool GreaterThanOrEqual(Guid? op1, Guid? op2) { throw new InvalidOperationException(); }
+			public bool LessThan          (Guid? op1, Guid? op2) { throw new InvalidOperationException(); }
+			public bool LessThanOrEqual   (Guid? op1, Guid? op2) { throw new InvalidOperationException(); }
+		}
+
+		#endregion
+
+		#endregion
+
+		#region Sql types.
+
+		#region SqlString
+
+		private class DBS : IOperable<SqlString>
+		{
+			public SqlString Addition      (SqlString op1, SqlString op2) { return (op1 + op2); }
+			public SqlString Subtraction   (SqlString op1, SqlString op2) { throw new InvalidOperationException(); }
+			public SqlString Multiply      (SqlString op1, SqlString op2) { throw new InvalidOperationException(); }
+			public SqlString Division      (SqlString op1, SqlString op2) { throw new InvalidOperationException(); }
+			public SqlString Modulus       (SqlString op1, SqlString op2) { throw new InvalidOperationException(); }
+
+			public SqlString BitwiseAnd    (SqlString op1, SqlString op2) { throw new InvalidOperationException(); }
+			public SqlString BitwiseOr     (SqlString op1, SqlString op2) { throw new InvalidOperationException(); }
+			public SqlString ExclusiveOr   (SqlString op1, SqlString op2) { throw new InvalidOperationException(); }
+
+			public SqlString UnaryNegation (SqlString op)                 { throw new InvalidOperationException(); }
+			public SqlString OnesComplement(SqlString op)                 { throw new InvalidOperationException(); }
+
+			public bool Equality           (SqlString op1, SqlString op2) { return (op1 == op2).IsTrue; }
+			public bool Inequality         (SqlString op1, SqlString op2) { return (op1 != op2).IsTrue; }
+			public bool GreaterThan        (SqlString op1, SqlString op2) { throw new InvalidOperationException(); }
+			public bool GreaterThanOrEqual (SqlString op1, SqlString op2) { throw new InvalidOperationException(); }
+			public bool LessThan           (SqlString op1, SqlString op2) { throw new InvalidOperationException(); }
+			public bool LessThanOrEqual    (SqlString op1, SqlString op2) { throw new InvalidOperationException(); }
+		}
+
+		#endregion
+
+		#region SqlByte
+
+		private class DBU8 : IOperable<SqlByte>
+		{
+			public SqlByte Addition       (SqlByte op1, SqlByte op2) { return (op1 + op2); }
+			public SqlByte Subtraction    (SqlByte op1, SqlByte op2) { return (op1 - op2); }
+			public SqlByte Multiply       (SqlByte op1, SqlByte op2) { return (op1 * op2); }
+			public SqlByte Division       (SqlByte op1, SqlByte op2) { return (op1 / op2); }
+			public SqlByte Modulus        (SqlByte op1, SqlByte op2) { return (op1 % op2); }
+
+			public SqlByte BitwiseAnd     (SqlByte op1, SqlByte op2) { return (op1 & op2); }
+			public SqlByte BitwiseOr      (SqlByte op1, SqlByte op2) { return (op1 | op2); }
+			public SqlByte ExclusiveOr    (SqlByte op1, SqlByte op2) { return (op1 ^ op2); }
+
+			public SqlByte UnaryNegation  (SqlByte op)               { throw new InvalidOperationException(); }
+			public SqlByte OnesComplement (SqlByte op)               { return (~op); }
+
+			public bool Equality          (SqlByte op1, SqlByte op2) { return (op1 == op2).IsTrue; }
+			public bool Inequality        (SqlByte op1, SqlByte op2) { return (op1 != op2).IsTrue; }
+			public bool GreaterThan       (SqlByte op1, SqlByte op2) { return (op1 >  op2).IsTrue; }
+			public bool GreaterThanOrEqual(SqlByte op1, SqlByte op2) { return (op1 >= op2).IsTrue; }
+			public bool LessThan          (SqlByte op1, SqlByte op2) { return (op1 <  op2).IsTrue; }
+			public bool LessThanOrEqual   (SqlByte op1, SqlByte op2) { return (op1 <= op2).IsTrue; }
+		}
+
+		#endregion
+
+		#region Int16
+
+		private class DBS16 : IOperable<SqlInt16>
+		{
+			public SqlInt16 Addition      (SqlInt16 op1, SqlInt16 op2) { return (op1 + op2); }
+			public SqlInt16 Subtraction   (SqlInt16 op1, SqlInt16 op2) { return (op1 - op2); }
+			public SqlInt16 Multiply      (SqlInt16 op1, SqlInt16 op2) { return (op1 * op2); }
+			public SqlInt16 Division      (SqlInt16 op1, SqlInt16 op2) { return (op1 / op2); }
+			public SqlInt16 Modulus       (SqlInt16 op1, SqlInt16 op2) { return (op1 % op2); }
+
+			public SqlInt16 BitwiseAnd    (SqlInt16 op1, SqlInt16 op2) { return (op1 & op2); }
+			public SqlInt16 BitwiseOr     (SqlInt16 op1, SqlInt16 op2) { return (op1 | op2); }
+			public SqlInt16 ExclusiveOr   (SqlInt16 op1, SqlInt16 op2) { return (op1 ^ op2); }
+
+			public SqlInt16 UnaryNegation (SqlInt16 op)                { return (-op); }
+			public SqlInt16 OnesComplement(SqlInt16 op)                { return (~op); }
+
+			public bool Equality          (SqlInt16 op1, SqlInt16 op2) { return (op1 == op2).IsTrue; }
+			public bool Inequality        (SqlInt16 op1, SqlInt16 op2) { return (op1 != op2).IsTrue; }
+			public bool GreaterThan       (SqlInt16 op1, SqlInt16 op2) { return (op1 >  op2).IsTrue; }
+			public bool GreaterThanOrEqual(SqlInt16 op1, SqlInt16 op2) { return (op1 >= op2).IsTrue; }
+			public bool LessThan          (SqlInt16 op1, SqlInt16 op2) { return (op1 <  op2).IsTrue; }
+			public bool LessThanOrEqual   (SqlInt16 op1, SqlInt16 op2) { return (op1 <= op2).IsTrue; }
+		}
+
+		#endregion
+
+		#region SqlInt32
+
+		private class DBS32 : IOperable<SqlInt32>
+		{
+			public SqlInt32 Addition      (SqlInt32 op1, SqlInt32 op2) { return (op1 + op2); }
+			public SqlInt32 Subtraction   (SqlInt32 op1, SqlInt32 op2) { return (op1 - op2); }
+			public SqlInt32 Multiply      (SqlInt32 op1, SqlInt32 op2) { return (op1 * op2); }
+			public SqlInt32 Division      (SqlInt32 op1, SqlInt32 op2) { return (op1 / op2); }
+			public SqlInt32 Modulus       (SqlInt32 op1, SqlInt32 op2) { return (op1 % op2); }
+
+			public SqlInt32 BitwiseAnd    (SqlInt32 op1, SqlInt32 op2) { return (op1 & op2); }
+			public SqlInt32 BitwiseOr     (SqlInt32 op1, SqlInt32 op2) { return (op1 | op2); }
+			public SqlInt32 ExclusiveOr   (SqlInt32 op1, SqlInt32 op2) { return (op1 ^ op2); }
+
+			public SqlInt32 UnaryNegation (SqlInt32 op)                { return (-op); }
+			public SqlInt32 OnesComplement(SqlInt32 op)                { return (~op); }
+
+			public bool Equality          (SqlInt32 op1, SqlInt32 op2) { return (op1 == op2).IsTrue; }
+			public bool Inequality        (SqlInt32 op1, SqlInt32 op2) { return (op1 != op2).IsTrue; }
+			public bool GreaterThan       (SqlInt32 op1, SqlInt32 op2) { return (op1 >  op2).IsTrue; }
+			public bool GreaterThanOrEqual(SqlInt32 op1, SqlInt32 op2) { return (op1 >= op2).IsTrue; }
+			public bool LessThan          (SqlInt32 op1, SqlInt32 op2) { return (op1 <  op2).IsTrue; }
+			public bool LessThanOrEqual   (SqlInt32 op1, SqlInt32 op2) { return (op1 <= op2).IsTrue; }
+		}
+
+		#endregion
+
+		#region SqlInt64
+
+		private class DBS64 : IOperable<SqlInt64>
+		{
+			public SqlInt64 Addition      (SqlInt64 op1, SqlInt64 op2) { return (op1 + op2); }
+			public SqlInt64 Subtraction   (SqlInt64 op1, SqlInt64 op2) { return (op1 - op2); }
+			public SqlInt64 Multiply      (SqlInt64 op1, SqlInt64 op2) { return (op1 * op2); }
+			public SqlInt64 Division      (SqlInt64 op1, SqlInt64 op2) { return (op1 / op2); }
+			public SqlInt64 Modulus       (SqlInt64 op1, SqlInt64 op2) { return (op1 % op2); }
+
+			public SqlInt64 BitwiseAnd    (SqlInt64 op1, SqlInt64 op2) { return (op1 & op2); }
+			public SqlInt64 BitwiseOr     (SqlInt64 op1, SqlInt64 op2) { return (op1 | op2); }
+			public SqlInt64 ExclusiveOr   (SqlInt64 op1, SqlInt64 op2) { return (op1 ^ op2); }
+
+			public SqlInt64 UnaryNegation (SqlInt64 op)                { return (-op); }
+			public SqlInt64 OnesComplement(SqlInt64 op)                { return (~op); }
+
+			public bool Equality          (SqlInt64 op1, SqlInt64 op2) { return (op1 == op2).IsTrue; }
+			public bool Inequality        (SqlInt64 op1, SqlInt64 op2) { return (op1 != op2).IsTrue; }
+			public bool GreaterThan       (SqlInt64 op1, SqlInt64 op2) { return (op1 >  op2).IsTrue; }
+			public bool GreaterThanOrEqual(SqlInt64 op1, SqlInt64 op2) { return (op1 >= op2).IsTrue; }
+			public bool LessThan          (SqlInt64 op1, SqlInt64 op2) { return (op1 <  op2).IsTrue; }
+			public bool LessThanOrEqual   (SqlInt64 op1, SqlInt64 op2) { return (op1 <= op2).IsTrue; }
+		}
+
+		#endregion
+
+		#region SqlBoolean
+
+		private class DBB : IOperable<SqlBoolean>
+		{
+			public SqlBoolean Addition      (SqlBoolean op1, SqlBoolean op2) { throw new InvalidOperationException(); }
+			public SqlBoolean Subtraction   (SqlBoolean op1, SqlBoolean op2) { throw new InvalidOperationException(); }
+			public SqlBoolean Multiply      (SqlBoolean op1, SqlBoolean op2) { throw new InvalidOperationException(); }
+			public SqlBoolean Division      (SqlBoolean op1, SqlBoolean op2) { throw new InvalidOperationException(); }
+			public SqlBoolean Modulus       (SqlBoolean op1, SqlBoolean op2) { throw new InvalidOperationException(); }
+
+			public SqlBoolean BitwiseAnd    (SqlBoolean op1, SqlBoolean op2) { return (op1 & op2); }
+			public SqlBoolean BitwiseOr     (SqlBoolean op1, SqlBoolean op2) { return (op1 | op2); }
+			public SqlBoolean ExclusiveOr   (SqlBoolean op1, SqlBoolean op2) { return (op1 ^ op2); }
+
+			public SqlBoolean UnaryNegation (SqlBoolean op)                  { throw new InvalidOperationException(); }
+			public SqlBoolean OnesComplement(SqlBoolean op)                  { return !op; }
+
+			public bool Equality            (SqlBoolean op1, SqlBoolean op2) { return (op1 == op2).IsTrue; }
+			public bool Inequality          (SqlBoolean op1, SqlBoolean op2) { return (op1 != op2).IsTrue; }
+			public bool GreaterThan         (SqlBoolean op1, SqlBoolean op2) { throw new InvalidOperationException(); }
+			public bool GreaterThanOrEqual  (SqlBoolean op1, SqlBoolean op2) { throw new InvalidOperationException(); }
+			public bool LessThan            (SqlBoolean op1, SqlBoolean op2) { throw new InvalidOperationException(); }
+			public bool LessThanOrEqual     (SqlBoolean op1, SqlBoolean op2) { throw new InvalidOperationException(); }
+		}
+
+		#endregion
+
+		#region SqlSingle
+
+		private class DBR4 : IOperable<SqlSingle>
+		{
+			public SqlSingle Addition      (SqlSingle op1, SqlSingle op2) { return (op1 + op2); }
+			public SqlSingle Subtraction   (SqlSingle op1, SqlSingle op2) { return (op1 - op2); }
+			public SqlSingle Multiply      (SqlSingle op1, SqlSingle op2) { return (op1 * op2); }
+			public SqlSingle Division      (SqlSingle op1, SqlSingle op2) { return (op1 / op2); }
+			public SqlSingle Modulus       (SqlSingle op1, SqlSingle op2) { throw new InvalidOperationException(); }
+
+			public SqlSingle BitwiseAnd    (SqlSingle op1, SqlSingle op2) { throw new InvalidOperationException(); }
+			public SqlSingle BitwiseOr     (SqlSingle op1, SqlSingle op2) { throw new InvalidOperationException(); }
+			public SqlSingle ExclusiveOr   (SqlSingle op1, SqlSingle op2) { throw new InvalidOperationException(); }
+
+			public SqlSingle UnaryNegation (SqlSingle op)                 { return (-op); }
+			public SqlSingle OnesComplement(SqlSingle op)                 { throw new InvalidOperationException(); }
+
+			public bool Equality           (SqlSingle op1, SqlSingle op2) { return (op1 == op2).IsTrue; }
+			public bool Inequality         (SqlSingle op1, SqlSingle op2) { return (op1 != op2).IsTrue; }
+			public bool GreaterThan        (SqlSingle op1, SqlSingle op2) { return (op1 >  op2).IsTrue; }
+			public bool GreaterThanOrEqual (SqlSingle op1, SqlSingle op2) { return (op1 >= op2).IsTrue; }
+			public bool LessThan           (SqlSingle op1, SqlSingle op2) { return (op1 <  op2).IsTrue; }
+			public bool LessThanOrEqual    (SqlSingle op1, SqlSingle op2) { return (op1 <= op2).IsTrue; }
+		}
+
+		#endregion
+
+		#region SqlDouble
+
+		private class DBR8 : IOperable<SqlDouble>
+		{
+			public SqlDouble Addition      (SqlDouble op1, SqlDouble op2) { return (op1 + op2); }
+			public SqlDouble Subtraction   (SqlDouble op1, SqlDouble op2) { return (op1 - op2); }
+			public SqlDouble Multiply      (SqlDouble op1, SqlDouble op2) { return (op1 * op2); }
+			public SqlDouble Division      (SqlDouble op1, SqlDouble op2) { return (op1 / op2); }
+			public SqlDouble Modulus       (SqlDouble op1, SqlDouble op2) { throw new InvalidOperationException(); }
+
+			public SqlDouble BitwiseAnd    (SqlDouble op1, SqlDouble op2) { throw new InvalidOperationException(); }
+			public SqlDouble BitwiseOr     (SqlDouble op1, SqlDouble op2) { throw new InvalidOperationException(); }
+			public SqlDouble ExclusiveOr   (SqlDouble op1, SqlDouble op2) { throw new InvalidOperationException(); }
+
+			public SqlDouble UnaryNegation (SqlDouble op)                 { return (-op); }
+			public SqlDouble OnesComplement(SqlDouble op)                 { throw new InvalidOperationException(); }
+
+			public bool Equality           (SqlDouble op1, SqlDouble op2) { return (op1 == op2).IsTrue; }
+			public bool Inequality         (SqlDouble op1, SqlDouble op2) { return (op1 != op2).IsTrue; }
+			public bool GreaterThan        (SqlDouble op1, SqlDouble op2) { return (op1 >  op2).IsTrue; }
+			public bool GreaterThanOrEqual (SqlDouble op1, SqlDouble op2) { return (op1 >= op2).IsTrue; }
+			public bool LessThan           (SqlDouble op1, SqlDouble op2) { return (op1 <  op2).IsTrue; }
+			public bool LessThanOrEqual    (SqlDouble op1, SqlDouble op2) { return (op1 <= op2).IsTrue; }
+		}
+
+		#endregion
+
+		#region SqlDecimal
+
+		private class DBD : IOperable<SqlDecimal>
+		{
+			public SqlDecimal Addition      (SqlDecimal op1, SqlDecimal op2) { return (op1 + op2); }
+			public SqlDecimal Subtraction   (SqlDecimal op1, SqlDecimal op2) { return (op1 - op2); }
+			public SqlDecimal Multiply      (SqlDecimal op1, SqlDecimal op2) { return (op1 * op2); }
+			public SqlDecimal Division      (SqlDecimal op1, SqlDecimal op2) { return (op1 / op2); }
+			public SqlDecimal Modulus       (SqlDecimal op1, SqlDecimal op2) { throw new InvalidOperationException(); }
+
+			public SqlDecimal BitwiseAnd    (SqlDecimal op1, SqlDecimal op2) { throw new InvalidOperationException(); }
+			public SqlDecimal BitwiseOr     (SqlDecimal op1, SqlDecimal op2) { throw new InvalidOperationException(); }
+			public SqlDecimal ExclusiveOr   (SqlDecimal op1, SqlDecimal op2) { throw new InvalidOperationException(); }
+
+			public SqlDecimal UnaryNegation (SqlDecimal op)                  { return (-op); }
+			public SqlDecimal OnesComplement(SqlDecimal op)                  { throw new InvalidOperationException(); }
+
+			public bool Equality            (SqlDecimal op1, SqlDecimal op2) { return (op1 == op2).IsTrue; }
+			public bool Inequality          (SqlDecimal op1, SqlDecimal op2) { return (op1 != op2).IsTrue; }
+			public bool GreaterThan         (SqlDecimal op1, SqlDecimal op2) { return (op1 >  op2).IsTrue; }
+			public bool GreaterThanOrEqual  (SqlDecimal op1, SqlDecimal op2) { return (op1 >= op2).IsTrue; }
+			public bool LessThan            (SqlDecimal op1, SqlDecimal op2) { return (op1 <  op2).IsTrue; }
+			public bool LessThanOrEqual     (SqlDecimal op1, SqlDecimal op2) { return (op1 <= op2).IsTrue; }
+		}
+
+		#endregion
+
+		#region SqlMoney
+
+		private class DBM : IOperable<SqlMoney>
+		{
+			public SqlMoney Addition      (SqlMoney op1, SqlMoney op2) { return (op1 + op2); }
+			public SqlMoney Subtraction   (SqlMoney op1, SqlMoney op2) { return (op1 - op2); }
+			public SqlMoney Multiply      (SqlMoney op1, SqlMoney op2) { return (op1 * op2); }
+			public SqlMoney Division      (SqlMoney op1, SqlMoney op2) { return (op1 / op2); }
+			public SqlMoney Modulus       (SqlMoney op1, SqlMoney op2) { throw new InvalidOperationException(); }
+
+			public SqlMoney BitwiseAnd    (SqlMoney op1, SqlMoney op2) { throw new InvalidOperationException(); }
+			public SqlMoney BitwiseOr     (SqlMoney op1, SqlMoney op2) { throw new InvalidOperationException(); }
+			public SqlMoney ExclusiveOr   (SqlMoney op1, SqlMoney op2) { throw new InvalidOperationException(); }
+
+			public SqlMoney UnaryNegation (SqlMoney op)                { return (-op); }
+			public SqlMoney OnesComplement(SqlMoney op)                { throw new InvalidOperationException(); }
+
+			public bool Equality          (SqlMoney op1, SqlMoney op2) { return (op1 == op2).IsTrue; }
+			public bool Inequality        (SqlMoney op1, SqlMoney op2) { return (op1 != op2).IsTrue; }
+			public bool GreaterThan       (SqlMoney op1, SqlMoney op2) { return (op1 >  op2).IsTrue; }
+			public bool GreaterThanOrEqual(SqlMoney op1, SqlMoney op2) { return (op1 >= op2).IsTrue; }
+			public bool LessThan          (SqlMoney op1, SqlMoney op2) { return (op1 <  op2).IsTrue; }
+			public bool LessThanOrEqual   (SqlMoney op1, SqlMoney op2) { return (op1 <= op2).IsTrue; }
+		}
+
+		#endregion
+
+		#region SqlDateTime
+
+		private class DBDT : IOperable<SqlDateTime>
+		{
+			public SqlDateTime Addition      (SqlDateTime op1, SqlDateTime op2) { throw new InvalidOperationException(); }
+			public SqlDateTime Subtraction   (SqlDateTime op1, SqlDateTime op2) { throw new InvalidOperationException(); }
+			public SqlDateTime Multiply      (SqlDateTime op1, SqlDateTime op2) { throw new InvalidOperationException(); }
+			public SqlDateTime Division      (SqlDateTime op1, SqlDateTime op2) { throw new InvalidOperationException(); }
+			public SqlDateTime Modulus       (SqlDateTime op1, SqlDateTime op2) { throw new InvalidOperationException(); }
+
+			public SqlDateTime BitwiseAnd    (SqlDateTime op1, SqlDateTime op2) { throw new InvalidOperationException(); }
+			public SqlDateTime BitwiseOr     (SqlDateTime op1, SqlDateTime op2) { throw new InvalidOperationException(); }
+			public SqlDateTime ExclusiveOr   (SqlDateTime op1, SqlDateTime op2) { throw new InvalidOperationException(); }
+
+			public SqlDateTime UnaryNegation (SqlDateTime op)                   { throw new InvalidOperationException(); }
+			public SqlDateTime OnesComplement(SqlDateTime op)                   { throw new InvalidOperationException(); }
+
+			public bool Equality             (SqlDateTime op1, SqlDateTime op2) { return (op1 == op2).IsTrue; }
+			public bool Inequality           (SqlDateTime op1, SqlDateTime op2) { return (op1 != op2).IsTrue; }
+			public bool GreaterThan          (SqlDateTime op1, SqlDateTime op2) { return (op1 >  op2).IsTrue; }
+			public bool GreaterThanOrEqual   (SqlDateTime op1, SqlDateTime op2) { return (op1 >= op2).IsTrue; }
+			public bool LessThan             (SqlDateTime op1, SqlDateTime op2) { return (op1 <  op2).IsTrue; }
+			public bool LessThanOrEqual      (SqlDateTime op1, SqlDateTime op2) { return (op1 <= op2).IsTrue; }
+		}
+
+		#endregion
+
+		#region SqlBinary
+
+		private class DBBin : IOperable<SqlBinary>
+		{
+			public SqlBinary Addition      (SqlBinary op1, SqlBinary op2) { return (op1 + op2); }
+			public SqlBinary Subtraction   (SqlBinary op1, SqlBinary op2) { throw new InvalidOperationException(); }
+			public SqlBinary Multiply      (SqlBinary op1, SqlBinary op2) { throw new InvalidOperationException(); }
+			public SqlBinary Division      (SqlBinary op1, SqlBinary op2) { throw new InvalidOperationException(); }
+			public SqlBinary Modulus       (SqlBinary op1, SqlBinary op2) { throw new InvalidOperationException(); }
+
+			public SqlBinary BitwiseAnd    (SqlBinary op1, SqlBinary op2) { throw new InvalidOperationException(); }
+			public SqlBinary BitwiseOr     (SqlBinary op1, SqlBinary op2) { throw new InvalidOperationException(); }
+			public SqlBinary ExclusiveOr   (SqlBinary op1, SqlBinary op2) { throw new InvalidOperationException(); }
+
+			public SqlBinary UnaryNegation (SqlBinary op)                 { throw new InvalidOperationException(); }
+			public SqlBinary OnesComplement(SqlBinary op)                 { throw new InvalidOperationException(); }
+
+			public bool Equality           (SqlBinary op1, SqlBinary op2) { return (op1 == op2).IsTrue; }
+			public bool Inequality         (SqlBinary op1, SqlBinary op2) { return (op1 != op2).IsTrue; }
+			public bool GreaterThan        (SqlBinary op1, SqlBinary op2) { return (op1 >  op2).IsTrue; }
+			public bool GreaterThanOrEqual (SqlBinary op1, SqlBinary op2) { return (op1 >= op2).IsTrue; }
+			public bool LessThan           (SqlBinary op1, SqlBinary op2) { return (op1 <  op2).IsTrue; }
+			public bool LessThanOrEqual    (SqlBinary op1, SqlBinary op2) { return (op1 <= op2).IsTrue; }
+		}
+
+		#endregion
+
+		#region SqlGuid
+
+		private class DBG : IOperable<SqlGuid>
+		{
+			public SqlGuid Addition       (SqlGuid op1, SqlGuid op2) { throw new InvalidOperationException(); }
+			public SqlGuid Subtraction    (SqlGuid op1, SqlGuid op2) { throw new InvalidOperationException(); }
+			public SqlGuid Multiply       (SqlGuid op1, SqlGuid op2) { throw new InvalidOperationException(); }
+			public SqlGuid Division       (SqlGuid op1, SqlGuid op2) { throw new InvalidOperationException(); }
+			public SqlGuid Modulus        (SqlGuid op1, SqlGuid op2) { throw new InvalidOperationException(); }
+
+			public SqlGuid BitwiseAnd     (SqlGuid op1, SqlGuid op2) { throw new InvalidOperationException(); }
+			public SqlGuid BitwiseOr      (SqlGuid op1, SqlGuid op2) { throw new InvalidOperationException(); }
+			public SqlGuid ExclusiveOr    (SqlGuid op1, SqlGuid op2) { throw new InvalidOperationException(); }
+
+			public SqlGuid UnaryNegation  (SqlGuid op)               { throw new InvalidOperationException(); }
+			public SqlGuid OnesComplement (SqlGuid op)               { throw new InvalidOperationException(); }
+
+			public bool Equality          (SqlGuid op1, SqlGuid op2) { return (op1 == op2).IsTrue; }
+			public bool Inequality        (SqlGuid op1, SqlGuid op2) { return (op1 != op2).IsTrue; }
+			public bool GreaterThan       (SqlGuid op1, SqlGuid op2) { return (op1 >  op2).IsTrue; }
+			public bool GreaterThanOrEqual(SqlGuid op1, SqlGuid op2) { return (op1 >= op2).IsTrue; }
+			public bool LessThan          (SqlGuid op1, SqlGuid op2) { return (op1 <  op2).IsTrue; }
+			public bool LessThanOrEqual   (SqlGuid op1, SqlGuid op2) { return (op1 <= op2).IsTrue; }
+		}
+
+		#endregion
+
+		#endregion
+	}
+
+	public static class Operator
+	{
+		public static T    Addition          <T>(T a, T b) { return Operator<T>.Op.Addition          (a, b); }
+		public static T    Subtraction       <T>(T a, T b) { return Operator<T>.Op.Subtraction       (a, b); }
+		public static T    Multiply          <T>(T a, T b) { return Operator<T>.Op.Multiply          (a, b); }
+		public static T    Division          <T>(T a, T b) { return Operator<T>.Op.Division          (a, b); }
+		public static T    Modulus           <T>(T a, T b) { return Operator<T>.Op.Modulus           (a, b); }
+
+		public static T    BitwiseAnd        <T>(T a, T b) { return Operator<T>.Op.BitwiseAnd        (a, b); }
+		public static T    BitwiseOr         <T>(T a, T b) { return Operator<T>.Op.BitwiseOr         (a, b); }
+		public static T    ExclusiveOr       <T>(T a, T b) { return Operator<T>.Op.ExclusiveOr       (a, b); }
+
+		public static T    UnaryNegation     <T>(T a)      { return Operator<T>.Op.UnaryNegation     (a);    }
+		public static T    OnesComplement    <T>(T a)      { return Operator<T>.Op.OnesComplement    (a);    }
+
+		public static bool Equality          <T>(T a, T b) { return Operator<T>.Op.Equality          (a, b); }
+		public static bool Inequality        <T>(T a, T b) { return Operator<T>.Op.Inequality        (a, b); }
+		public static bool GreaterThan       <T>(T a, T b) { return Operator<T>.Op.GreaterThan       (a, b); }
+		public static bool GreaterThanOrEqual<T>(T a, T b) { return Operator<T>.Op.GreaterThanOrEqual(a, b); }
+		public static bool LessThan          <T>(T a, T b) { return Operator<T>.Op.LessThan          (a, b); }
+		public static bool LessThanOrEqual   <T>(T a, T b) { return Operator<T>.Op.LessThanOrEqual   (a, b); }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Common/Tuple.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,127 @@
+using System;
+
+namespace BLToolkit.Common
+{
+	[Obsolete("Use System.Tuple")]
+	public struct Tuple<T1,T2>
+	{
+		public Tuple(T1 field1, T2 field2)
+		{
+			Field1 = field1;
+			Field2 = field2;
+		}
+
+		public readonly T1 Field1;
+		public readonly T2 Field2;
+
+		public override int GetHashCode()
+		{
+			int hash1 = Field1 == null ? 0 : Field1.GetHashCode();
+			int hash2 = Field2 == null ? 0 : Field2.GetHashCode();
+
+			return ((hash1 << 5) + hash1) ^ hash2;
+		}
+
+		public override bool Equals(object obj)
+		{
+			if (obj is Tuple<T1,T2>)
+			{
+				Tuple<T1,T2> t = (Tuple<T1,T2>)obj;
+
+				return
+					(Field1 == null ? t.Field1 == null : Field1.Equals(t.Field1)) &&
+					(Field2 == null ? t.Field2 == null : Field2.Equals(t.Field2));
+			}
+
+			return false;
+		}
+	}
+
+	[Obsolete("Use System.Tuple")]
+	public struct Tuple<T1,T2,T3>
+	{
+		public Tuple(T1 field1, T2 field2, T3 field3)
+		{
+			Field1 = field1;
+			Field2 = field2;
+			Field3 = field3;
+		}
+
+		public readonly T1 Field1;
+		public readonly T2 Field2;
+		public readonly T3 Field3;
+
+		public override int GetHashCode()
+		{
+			int hash1 = Field1 == null ? 0 : Field1.GetHashCode();
+			int hash2 = Field2 == null ? 0 : Field2.GetHashCode();
+
+			hash1 = ((hash1 << 5) + hash1) ^ hash2;
+			hash2 = Field3 == null ? 0 : Field3.GetHashCode();
+
+			return ((hash1 << 5) + hash1) ^ hash2;
+		}
+
+		public override bool Equals(object obj)
+		{
+			if (obj is Tuple<T1,T2,T3>)
+			{
+				Tuple<T1,T2,T3> t = (Tuple<T1,T2,T3>)obj;
+
+				return
+					(Field1 == null ? t.Field1 == null : Field1.Equals(t.Field1)) &&
+					(Field2 == null ? t.Field2 == null : Field2.Equals(t.Field2)) &&
+					(Field3 == null ? t.Field3 == null : Field3.Equals(t.Field3));
+			}
+
+			return false;
+		}
+	}
+
+	[Obsolete("Use System.Tuple")]
+	public struct Tuple<T1,T2,T3,T4>
+	{
+		public Tuple(T1 field1, T2 field2, T3 field3, T4 field4)
+		{
+			Field1 = field1;
+			Field2 = field2;
+			Field3 = field3;
+			Field4 = field4;
+		}
+
+		public readonly T1 Field1;
+		public readonly T2 Field2;
+		public readonly T3 Field3;
+		public readonly T4 Field4;
+
+		public override int GetHashCode()
+		{
+			int hash1 = Field1 == null ? 0 : Field1.GetHashCode();
+			int hash2 = Field2 == null ? 0 : Field2.GetHashCode();
+
+			hash1 = ((hash1 << 5) + hash1) ^ hash2;
+			hash2 = Field3 == null ? 0 : Field3.GetHashCode();
+
+			hash1 = ((hash1 << 5) + hash1) ^ hash2;
+			hash2 = Field4 == null ? 0 : Field4.GetHashCode();
+
+			return ((hash1 << 5) + hash1) ^ hash2;
+		}
+
+		public override bool Equals(object obj)
+		{
+			if (obj is Tuple<T1,T2,T3,T4>)
+			{
+				Tuple<T1,T2,T3,T4> t = (Tuple<T1,T2,T3,T4>)obj;
+
+				return
+					(Field1 == null ? t.Field1 == null : Field1.Equals(t.Field1)) &&
+					(Field2 == null ? t.Field2 == null : Field2.Equals(t.Field2)) &&
+					(Field3 == null ? t.Field3 == null : Field3.Equals(t.Field3)) &&
+					(Field4 == null ? t.Field4 == null : Field4.Equals(t.Field4));
+			}
+
+			return false;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Compile3.bat	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,7 @@
+..\Tools\SvnRevision\SvnRevision.exe .. Templates\BLToolkitConstants.Revision.cs.template Properties\Revision.generated.cs
+
+%windir%\Microsoft.NET\Framework\v3.5\MSBuild.exe /target:Clean BLToolkit.3.csproj /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v3.5\MSBuild.exe /target:Clean BLToolkit.3.csproj /property:Configuration=Release
+%windir%\Microsoft.NET\Framework\v3.5\MSBuild.exe BLToolkit.3.csproj /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v3.5\MSBuild.exe BLToolkit.3.csproj /property:Configuration=Release
+pause
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Compile4.bat	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,21 @@
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /target:Clean BLToolkit.4.csproj /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /target:Clean BLToolkit.4.csproj /property:Configuration=Release
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe BLToolkit.4.csproj /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe BLToolkit.4.csproj /property:Configuration=Release
+
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /target:Clean BLToolkit.Data.4.csproj /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /target:Clean BLToolkit.Data.4.csproj /property:Configuration=Release
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe BLToolkit.Data.4.csproj /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe BLToolkit.Data.4.csproj /property:Configuration=Release
+
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /target:Clean BLToolkit.CP.4.csproj /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /target:Clean BLToolkit.CP.4.csproj /property:Configuration=Release
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe BLToolkit.CP.4.csproj /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe BLToolkit.CP.4.csproj /property:Configuration=Release
+
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /target:Clean BLToolkit.SL.4.csproj /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /target:Clean BLToolkit.SL.4.csproj /property:Configuration=Release
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe BLToolkit.SL.4.csproj /property:Configuration=Debug
+%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe BLToolkit.SL.4.csproj /property:Configuration=Release
+
+pause
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/BindingListImpl.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,876 @@
+using System;
+
+using System.Collections;
+using System.Collections.Specialized;
+using System.ComponentModel;
+using System.Diagnostics;
+
+using BLToolkit.EditableObjects;
+using BLToolkit.Reflection;
+
+namespace BLToolkit.ComponentModel
+{
+	public class BindingListImpl: IBindingListView, ICancelAddNew, INotifyCollectionChanged
+	{
+		#region Init
+
+		public BindingListImpl(IList list, Type itemType)
+		{
+			if (list     == null) throw new ArgumentNullException("list");
+			if (itemType == null) throw new ArgumentNullException("itemType");
+
+			_list     = list;
+			_itemType = itemType;
+
+			AddInternal(_list);
+		}
+
+		#endregion
+
+		#region Protected Members
+
+		private readonly IList _list;
+		private readonly Type  _itemType;
+
+		private void ApplySort(IComparer comparer)
+		{
+			if (_list is ISortable)
+				((ISortable)_list).Sort(0, _list.Count, comparer);
+			else if (_list is ArrayList)
+				((ArrayList)_list).Sort(0, _list.Count, comparer);
+			else if (_list is Array)
+				Array.Sort((Array)_list, comparer);
+			else
+			{
+				object[] items = new object[_list.Count];
+
+				_list.CopyTo(items, 0);
+				Array.Sort(items, comparer);
+
+				for (int i = 0; i < _list.Count; i++)
+					_list[i] = items[i];
+			}
+
+			_isSorted = true;
+		}
+
+		#endregion
+
+		#region IBindingList Members
+
+			#region Command
+
+		private int               _newItemIndex = -1;
+		private INotifyObjectEdit _newObject;
+
+		public object AddNew()
+		{
+			if (AllowNew == false)
+				throw new NotSupportedException();
+
+			EndNew();
+
+			object   o = TypeAccessor.CreateInstanceEx(_itemType);
+			_newObject = o as INotifyObjectEdit;
+
+			if (_newObject != null)
+				_newObject.ObjectEdit += NewObject_ObjectEdit;
+
+			_newItemIndex = _list.Add(o);
+			OnAddItem(o, _newItemIndex);
+
+			Debug.WriteLine(string.Format("AddNew - ({0})", o.GetType().Name));
+
+			return o;
+		}
+
+		void NewObject_ObjectEdit(object sender, ObjectEditEventArgs args)
+		{
+			if (sender == _newObject)
+			{
+				switch (args.EditType)
+				{
+					case ObjectEditType.End:    EndNew();                 break;
+					case ObjectEditType.Cancel: CancelNew(_newItemIndex); break;
+					default:                    return;
+				}
+			}
+		}
+
+		public bool AllowNew
+		{
+			get { return !_list.IsFixedSize; }
+		}
+
+		public bool AllowEdit
+		{
+			get { return !_list.IsReadOnly; }
+		}
+
+		public bool AllowRemove
+		{
+			get { return !_list.IsFixedSize; }
+		}
+
+			#endregion
+
+			#region Change Notification
+
+		private bool _notifyChanges = true;
+		public  bool  NotifyChanges
+		{
+			get { return _notifyChanges; }
+			set { _notifyChanges = value; }
+		}
+
+		public bool SupportsChangeNotification
+		{
+			get { return true; }
+		}
+
+		public event ListChangedEventHandler ListChanged;
+
+		private void FireListChangedEvent(object sender, ListChangedEventArgs e)
+		{
+			if (_notifyChanges && ListChanged != null)
+				ListChanged(sender, e);
+		}
+
+		protected virtual void OnListChanged(EditableListChangedEventArgs e)
+		{
+			FireListChangedEvent(this, e);
+		}
+
+		protected void OnListChanged(ListChangedType listChangedType, int index)
+		{
+			OnListChanged(new EditableListChangedEventArgs(listChangedType, index));
+		}
+
+		private void ItemPropertyChanged(object sender, PropertyChangedEventArgs e)
+		{
+			if (_notifyChanges && sender != null)
+			{
+				int indexOfSender = _list.IndexOf(sender);
+
+				if (indexOfSender >= 0)
+				{
+					MemberAccessor ma = TypeAccessor.GetAccessor(sender.GetType())[e.PropertyName];
+
+					if (ma != null)
+						OnListChanged(new EditableListChangedEventArgs(indexOfSender, ma.PropertyDescriptor));
+					else
+						OnListChanged(new EditableListChangedEventArgs(ListChangedType.ItemChanged, indexOfSender));
+
+					// Do not fire an event for OnCollectionChanged here.
+
+					if (_isSorted && _list.Count > 1)
+					{
+						int newIndex = GetItemSortedPosition(indexOfSender, sender);
+
+						if (newIndex != indexOfSender)
+						{
+							_list.RemoveAt(indexOfSender);
+							_list.Insert(newIndex, sender);
+
+							OnMoveItem(sender, indexOfSender, newIndex);
+						}
+					}
+				}
+			}
+		}
+
+		#endregion
+
+			#region Sorting
+
+		public bool SupportsSorting
+		{
+			get { return true; }
+		}
+
+		[NonSerialized]
+		private bool _isSorted;
+		public  bool  IsSorted
+		{
+			get { return _isSorted; }
+		}
+
+		[NonSerialized]
+		private PropertyDescriptor _sortProperty;
+		public  PropertyDescriptor  SortProperty
+		{
+			get { return _sortProperty; }
+		}
+
+		[NonSerialized]
+		private ListSortDirection _sortDirection;
+		public  ListSortDirection  SortDirection
+		{
+			get { return _sortDirection; }
+		}
+
+		public void ApplySort(PropertyDescriptor property, ListSortDirection direction)
+		{
+			Debug.WriteLine(string.Format("Begin ApplySort(\"{0}\", {1})", property.Name, direction));
+
+			_sortProperty  = property;
+			_sortDirection = direction;
+			_sortDescriptions = null;
+
+			ApplySort(GetSortComparer(_sortProperty, _sortDirection));
+
+			if (_list.Count > 0)
+				OnReset();
+
+			Debug.WriteLine(string.Format("End   ApplySort(\"{0}\", {1})", property.Name, direction));
+		}
+
+		public void RemoveSort()
+		{
+			_isSorted     = false;
+			_sortProperty = null;
+			_sortDescriptions = null;
+
+			OnReset();
+		}
+
+			#endregion
+
+			#region Searching
+
+		public bool SupportsSearching
+		{
+			get { return true; }
+		}
+
+		public int Find(PropertyDescriptor property, object key)
+		{
+			if (property == null) throw new ArgumentException("property");
+
+			if (key != null)
+				for (int i = 0; i < _list.Count; i++)
+					if (key.Equals(property.GetValue(_list[i])))
+						return i;
+
+			return -1;
+		}
+
+			#endregion
+
+			#region Indexes
+
+		public void AddIndex(PropertyDescriptor property)
+		{
+		}
+
+		public void RemoveIndex(PropertyDescriptor property)
+		{
+		}
+
+			#endregion
+
+		#endregion
+
+		#region ICancelAddNew Members
+
+		public void CancelNew(int itemIndex)
+		{
+			if (itemIndex >= 0 && itemIndex == _newItemIndex)
+			{
+				_list.RemoveAt(itemIndex);
+				OnRemoveItem(_newObject, itemIndex);
+				EndNew();
+			}
+		}
+
+		public void EndNew(int itemIndex)
+		{
+			if (itemIndex == _newItemIndex)
+				EndNew();
+		}
+
+		public void EndNew()
+		{
+			_newItemIndex = -1;
+
+			if (_newObject != null)
+				_newObject.ObjectEdit -= NewObject_ObjectEdit;
+
+			_newObject = null;
+		}
+
+		#endregion
+
+		#region IList Members
+
+		public int Add(object value)
+		{
+			int index;
+			
+			if (!_isSorted)
+				index = _list.Add(value);
+			else
+			{
+				index = GetSortedInsertIndex(value);
+				_list.Insert(index, value);
+			}
+
+			AddInternal(value);
+			OnAddItem(value, index);
+
+			return index;
+		}
+
+		public void Clear()
+		{
+			if (_list.Count > 0)
+			{
+				RemoveInternal(_list);
+
+				_list.Clear();
+				OnReset();
+			}
+		}
+
+		public bool Contains(object value)
+		{
+			return _list.Contains(value);
+		}
+
+		public int IndexOf(object value)
+		{
+			return _list.IndexOf(value);
+		}
+
+		public void Insert(int index, object value)
+		{
+			if (_isSorted)
+				index = GetSortedInsertIndex(value);
+			
+			_list.Insert(index, value);
+			AddInternal(value);
+
+			OnAddItem(value, index);
+		}
+
+		public bool IsFixedSize
+		{
+			get { return _list.IsFixedSize; }
+		}
+
+		public bool IsReadOnly
+		{
+			get { return _list.IsReadOnly; }
+		}
+
+		public void Remove(object value)
+		{
+			int index = IndexOf(value);
+			
+			if (index >= 0)
+				RemoveInternal(value);
+
+			_list.Remove(value);
+
+			if (index >= 0)
+				OnRemoveItem(value, index);
+		}
+
+		public void RemoveAt(int index)
+		{
+			object value = this[index];
+
+			RemoveInternal(value);
+
+			_list.RemoveAt(index);
+
+			OnRemoveItem(value, index);
+		}
+
+		public object this[int index]
+		{
+			get { return _list[index]; }
+			set 
+			{
+				object o = _list[index];
+
+				if (o != value)
+				{
+					RemoveInternal(o);
+					
+					_list[index] = value;
+
+					AddInternal(value);
+
+					OnChangeItem(o, value, index);
+
+					if (_isSorted)
+					{
+						int newIndex = GetItemSortedPosition(index, value);
+						
+						if (newIndex != index)
+						{
+							_list.RemoveAt(index);
+							_list.Insert(newIndex, value);
+						}
+
+						OnMoveItem(value, index, newIndex);
+					}
+				}
+			}
+		}
+
+		#endregion
+
+		#region ICollection Members
+
+		public void CopyTo(Array array, int index)
+		{
+			_list.CopyTo(array, index);
+		}
+
+		public int Count
+		{
+			get { return _list.Count; }
+		}
+
+		public bool IsSynchronized
+		{
+			get { return _list.IsSynchronized; }
+		}
+
+		public object SyncRoot
+		{
+			get { return _list.SyncRoot; }
+		}
+
+		#endregion
+
+		#region IEnumerable Members
+
+		public IEnumerator GetEnumerator()
+		{
+			return _list.GetEnumerator();
+		}
+
+		#endregion
+
+		#region SortPropertyComparer
+
+		class SortPropertyComparer : IComparer
+		{
+			readonly PropertyDescriptor _property;
+			readonly ListSortDirection  _direction;
+
+			public SortPropertyComparer(PropertyDescriptor property, ListSortDirection direction)
+			{
+				_property  = property;
+				_direction = direction;
+			}
+
+			public int Compare(object x, object y)
+			{
+				object a = _property.GetValue(x);
+				object b = _property.GetValue(y);
+
+				int n = Comparer.Default.Compare(a, b);
+
+				return _direction == ListSortDirection.Ascending? n: -n;
+			}
+		}
+
+		#endregion
+
+		#region IComparer Accessor
+		
+		public IComparer GetSortComparer()
+		{
+			if (_isSorted)
+			{
+				if (_sortDescriptions != null)
+					return GetSortComparer(_sortDescriptions);
+
+				return GetSortComparer(_sortProperty, _sortDirection);
+			}
+
+			return null;
+		}
+		
+		private IComparer GetSortComparer(PropertyDescriptor sortProperty, ListSortDirection sortDirection)
+		{
+			if (_sortSubstitutions.ContainsKey(sortProperty.Name))
+				sortProperty = ((SortSubstitutionPair)_sortSubstitutions[sortProperty.Name]).Substitute;
+
+			return new SortPropertyComparer(sortProperty, sortDirection);
+		}
+
+		private IComparer GetSortComparer(ListSortDescriptionCollection sortDescriptions)
+		{
+			bool needSubstitution = false;
+
+			if (_sortSubstitutions.Count > 0)
+			{
+				foreach (ListSortDescription sortDescription in sortDescriptions)
+				{
+					if (_sortSubstitutions.ContainsKey(sortDescription.PropertyDescriptor.Name))
+					{
+						needSubstitution = true;
+						break;
+					}
+				}
+
+				if (needSubstitution)
+				{
+					ListSortDescription[] sorts = new ListSortDescription[sortDescriptions.Count];
+					sortDescriptions.CopyTo(sorts, 0);
+
+					for (int i = 0; i < sorts.Length; i++)
+						if (_sortSubstitutions.ContainsKey(sorts[i].PropertyDescriptor.Name))
+							sorts[i] = new ListSortDescription(((SortSubstitutionPair)_sortSubstitutions[sorts[i].PropertyDescriptor.Name]).Substitute, 
+								                               sorts[i].SortDirection);
+
+					sortDescriptions = new ListSortDescriptionCollection(sorts);
+				}
+			}
+
+			return new SortListPropertyComparer(sortDescriptions);
+		}
+		
+		#endregion
+
+		#region IBindingListView Members
+
+		public bool SupportsAdvancedSorting
+		{
+			get { return true; }
+		}
+
+		public void ApplySort(ListSortDescriptionCollection sorts)
+		{
+			_sortDescriptions = sorts;
+
+			_isSorted = true;
+			_sortProperty = null;
+			
+			ApplySort(GetSortComparer(sorts));
+
+			if (_list.Count > 0)
+				OnReset();
+		}
+
+		[NonSerialized]
+		private ListSortDescriptionCollection _sortDescriptions;
+		public  ListSortDescriptionCollection  SortDescriptions
+		{
+			get { return _sortDescriptions; }
+		}
+
+		public bool SupportsFiltering
+		{
+			get { return false; }
+		}
+
+		public string Filter
+		{
+			get { throw new NotImplementedException("The method 'BindingListImpl.get_Filter' is not implemented."); }
+			set { throw new NotImplementedException("The method 'BindingListImpl.set_Filter' is not implemented."); }
+		}
+
+		public void RemoveFilter()
+		{
+			throw new NotImplementedException("The method 'BindingListImpl.RemoveFilter()' is not implemented.");
+		}
+
+		#endregion
+
+		#region SortListPropertyComparer
+
+		class SortListPropertyComparer : IComparer
+		{
+			readonly ListSortDescriptionCollection _sorts;
+
+			public SortListPropertyComparer(ListSortDescriptionCollection sorts)
+			{
+				_sorts = sorts;
+			}
+
+			public int Compare(object x, object y)
+			{
+				for (int i = 0; i < _sorts.Count; i++)
+				{
+					PropertyDescriptor property = _sorts[i].PropertyDescriptor;
+
+					object a = property.GetValue(x);
+					object b = property.GetValue(y);
+
+					int n = Comparer.Default.Compare(a, b);
+
+					if (n != 0)
+						return _sorts[i].SortDirection == ListSortDirection.Ascending? n: -n;
+				}
+
+				return 0;
+			}
+		}
+
+		#endregion
+
+		#region Sorting enhancement
+
+		private readonly Hashtable _sortSubstitutions = new Hashtable();
+
+		private class SortSubstitutionPair
+		{
+			public SortSubstitutionPair(PropertyDescriptor original, PropertyDescriptor substitute)
+			{
+				Original   = original;
+				Substitute = substitute;
+			}
+
+			public readonly PropertyDescriptor Original;
+			public readonly PropertyDescriptor Substitute;
+		}
+
+		public void CreateSortSubstitution(string originalProperty, string substituteProperty)
+		{
+			TypeAccessor typeAccessor = TypeAccessor.GetAccessor(_itemType);
+
+			PropertyDescriptor originalDescriptor = typeAccessor.PropertyDescriptors[originalProperty];
+			PropertyDescriptor substituteDescriptor = typeAccessor.PropertyDescriptors[substituteProperty];
+
+			if (originalDescriptor == null)   throw new InvalidOperationException("Can not retrieve PropertyDescriptor for original property: " + originalProperty);
+			if (substituteDescriptor == null) throw new InvalidOperationException("Can not retrieve PropertyDescriptor for substitute property: " + substituteProperty);
+
+			_sortSubstitutions[originalProperty] = new SortSubstitutionPair(originalDescriptor, substituteDescriptor);
+		}
+
+		public void RemoveSortSubstitution(string originalProperty)
+		{
+			_sortSubstitutions.Remove(originalProperty);
+		}
+
+		#endregion
+
+		#region Sort enforcement
+
+		public int GetItemSortedPosition(int index, object sender)
+		{
+			IComparer comparer = GetSortComparer();
+
+			if (comparer == null)
+				return index;
+
+			if ((index > 0 && comparer.Compare(_list[index - 1], sender) > 0) ||
+				(index < _list.Count - 1 && comparer.Compare(_list[index + 1], sender) < 0))
+			{
+				for (int i = 0; i < _list.Count; i++)
+				{
+					if (i != index && comparer.Compare(_list[i], sender) > 0)
+					{
+						if (i > index)
+							return i - 1;
+
+						return i;
+					}
+				}
+
+				return _list.Count - 1;
+			}
+
+			return index;
+		}
+
+		public int GetSortedInsertIndex(object value)
+		{
+			IComparer comparer = GetSortComparer();
+
+			if (comparer == null)
+				return -1;
+
+			for (int i = 0; i < _list.Count; i++)
+				if (comparer.Compare(_list[i], value) > 0)
+					return i;
+
+			return _list.Count;
+		}
+
+		#endregion
+
+		#region Misc/Range Operations
+		
+		public void Move(int newIndex, int oldIndex)
+		{
+			if (oldIndex != newIndex)
+			{
+				EndNew();
+
+				object o = _list[oldIndex];
+
+				_list.RemoveAt(oldIndex);
+				if (!_isSorted)
+					_list.Insert(newIndex, o);
+				else
+					_list.Insert(newIndex = GetSortedInsertIndex(o), o);
+
+				OnMoveItem(o, oldIndex, newIndex);
+			}
+		}
+		
+		public void AddRange(ICollection c)
+		{
+			foreach (object o in c)
+			{
+				if (!_isSorted)
+					_list.Add(o);
+				else
+					_list.Insert(GetSortedInsertIndex(o), o);
+			}
+
+			AddInternal(c);
+
+			OnReset();
+		}
+		
+		public void InsertRange(int index, ICollection c)
+		{
+			if (c.Count == 0)
+				return;
+			
+			foreach (object o in c)
+			{
+				if (!_isSorted)
+					_list.Insert(index++, o);
+				else
+					_list.Insert(GetSortedInsertIndex(o), o);
+			}
+
+			AddInternal(c);
+
+			OnReset();
+		}
+		
+		public void RemoveRange(int index, int count)
+		{
+			object[] toRemove = new object[count];
+
+			for (int i = index; i < _list.Count && i < index + count; i++)
+				toRemove[i - index] = _list[i];
+			
+			RemoveInternal(toRemove);
+
+			foreach (object o in toRemove)
+				_list.Remove(o);
+
+			OnReset();
+		}
+		
+		public void SetRange(int index, ICollection c)
+		{
+			int cCount = c.Count;
+			
+			if (index < 0 || index >= _list.Count - cCount)
+				throw new ArgumentOutOfRangeException("index");
+
+			bool oldNotifyChanges = _notifyChanges;
+			_notifyChanges = false;
+
+			int i = index;
+			foreach (object newObject in c)
+			{
+				RemoveInternal(_list[i + index]);
+				_list[i + index] = newObject;
+			}
+			
+			AddInternal(c);
+			
+			if (_isSorted)
+				ApplySort(GetSortComparer());
+
+			_notifyChanges = oldNotifyChanges;
+			OnReset();
+		}
+
+		#endregion
+
+		#region Add/Remove Internal
+
+		private void AddInternal(object value)
+		{
+			EndNew();
+
+			if (value is INotifyPropertyChanged)
+				((INotifyPropertyChanged)value).PropertyChanged += 
+					ItemPropertyChanged;
+		}
+
+		private void RemoveInternal(object value)
+		{
+			EndNew();
+
+			if (value is INotifyPropertyChanged)
+				((INotifyPropertyChanged)value).PropertyChanged -=
+					ItemPropertyChanged;
+		}
+
+		private void AddInternal(IEnumerable e)
+		{
+			foreach (object o in e)
+				AddInternal(o);
+		}
+
+		private void RemoveInternal(IEnumerable e)
+		{
+			foreach (object o in e)
+				RemoveInternal(o);
+		}
+
+		private void OnAddItem(object item, int index)
+		{
+			OnListChanged(new EditableListChangedEventArgs(ListChangedType.ItemAdded, index));
+			OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, index));
+		}
+
+		private void OnRemoveItem(object item, int index)
+		{
+			OnListChanged(new EditableListChangedEventArgs(ListChangedType.ItemDeleted, index));
+			OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, item, index));
+		}
+
+		private void OnMoveItem(object item, int oldIndex, int newIndex)
+		{
+			OnListChanged(new EditableListChangedEventArgs(newIndex, oldIndex));
+			OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Move, item, newIndex, oldIndex));
+		}
+
+		private void OnChangeItem(object oldValue, object newValue, int index)
+		{
+			OnListChanged(new EditableListChangedEventArgs(ListChangedType.ItemChanged, index));
+			OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, oldValue, newValue, index));
+		}
+
+		private void OnReset()
+		{
+			OnListChanged(new EditableListChangedEventArgs(ListChangedType.Reset));
+			OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
+		}
+
+		#endregion
+
+		#region INotifyCollectionChanged Members
+
+		public event NotifyCollectionChangedEventHandler CollectionChanged;
+
+		private void FireCollectionChangedEvent(object sender, NotifyCollectionChangedEventArgs ea)
+		{
+			if (_notifyChanges && CollectionChanged != null)
+				CollectionChanged(sender, ea);
+		}
+
+		protected virtual void OnCollectionChanged(NotifyCollectionChangedEventArgs ea)
+		{
+			FireCollectionChangedEvent(this, ea);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/CustomTypeDescriptorImpl.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,229 @@
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Reflection;
+
+using BLToolkit.Reflection;
+
+namespace BLToolkit.ComponentModel
+{
+	public class CustomTypeDescriptorImpl : ICustomTypeDescriptor
+	{
+		#region Constructors
+
+		public CustomTypeDescriptorImpl()
+		{
+			_typeDescriptionProvider = CreateTypeDescriptionProvider(GetType());
+		}
+
+		public CustomTypeDescriptorImpl(Type type)
+		{
+			_typeDescriptionProvider = CreateTypeDescriptionProvider(type);
+		}
+
+		public CustomTypeDescriptorImpl(ITypeDescriptionProvider typeDescriptionProvider)
+		{
+			_typeDescriptionProvider = typeDescriptionProvider;
+		}
+
+		private readonly ITypeDescriptionProvider _typeDescriptionProvider;
+
+		protected virtual ITypeDescriptionProvider CreateTypeDescriptionProvider(Type type)
+		{
+			return TypeAccessor.GetAccessor(type);
+		}
+
+		#endregion
+
+		#region ICustomTypeDescriptor Members
+
+		AttributeCollection                      _attributes;
+		AttributeCollection ICustomTypeDescriptor.GetAttributes()
+		{
+			if (_attributes == null)
+				_attributes = _typeDescriptionProvider.GetAttributes();
+
+			return _attributes;
+		}
+
+		string ICustomTypeDescriptor.GetClassName()
+		{
+			return _typeDescriptionProvider.ClassName;
+		}
+
+		string ICustomTypeDescriptor.GetComponentName()
+		{
+			return _typeDescriptionProvider.ComponentName;
+		}
+
+		TypeConverter                         _converter;
+		TypeConverter ICustomTypeDescriptor.GetConverter()
+		{
+			if (_converter == null)
+			{
+				TypeConverterAttribute attr =
+					_td.GetAttributes()[typeof(TypeConverterAttribute)] as TypeConverterAttribute;
+
+				if (attr != null && !string.IsNullOrEmpty(attr.ConverterTypeName))
+				{
+					Type type = GetTypeByName(attr.ConverterTypeName);
+
+					if (type != null && typeof(TypeConverter).IsAssignableFrom(type))
+						_converter = (TypeConverter)CreateInstance(type);
+				}
+
+				if (_converter == null)
+					_converter = new TypeConverter();
+			}
+
+			return _converter;
+		}
+
+		bool                                _readDefaultEvent;
+		EventDescriptor                         _defaultEvent;
+		EventDescriptor ICustomTypeDescriptor.GetDefaultEvent()
+		{
+			if (_readDefaultEvent == false)
+			{
+				_readDefaultEvent = true;
+
+				DefaultEventAttribute attr =
+					_td.GetAttributes()[typeof(DefaultEventAttribute)] as DefaultEventAttribute;
+
+				if (attr != null && !string.IsNullOrEmpty(attr.Name))
+					_defaultEvent = _typeDescriptionProvider.GetEvent(attr.Name);
+			}
+
+			return _defaultEvent;
+		}
+
+		bool                                   _readDefaultProperty;
+		PropertyDescriptor                         _defaultProperty;
+		PropertyDescriptor ICustomTypeDescriptor.GetDefaultProperty()
+		{
+			if (_readDefaultProperty == false)
+			{
+				_readDefaultProperty = true;
+
+				DefaultPropertyAttribute attr =
+					_td.GetAttributes()[typeof(DefaultPropertyAttribute)] as DefaultPropertyAttribute;
+
+				if (attr != null && !string.IsNullOrEmpty(attr.Name))
+					_defaultProperty = _typeDescriptionProvider.GetProperty(attr.Name);
+			}
+
+			return _defaultProperty;
+		}
+
+		Hashtable _editors;
+		object ICustomTypeDescriptor.GetEditor(Type editorBaseType)
+		{
+			if (_editors == null)
+				_editors = new Hashtable();
+
+			object editor = _editors[editorBaseType];
+
+			if (editor == null)
+			{
+				if (_editors.Contains(editorBaseType))
+					return null;
+
+				foreach (Attribute attr in _td.GetAttributes())
+				{
+					if (attr is EditorAttribute)
+					{
+						EditorAttribute ea = (EditorAttribute)attr;
+
+						if (ea.EditorBaseTypeName != null &&
+							ea.EditorTypeName     != null &&
+							editorBaseType == GetTypeByName(ea.EditorBaseTypeName))
+						{
+							Type type = GetTypeByName(ea.EditorTypeName);
+
+							if (type != null)
+							{
+								editor = CreateInstance(type);
+								break;
+							}
+						}
+					}
+				}
+
+				_editors[editorBaseType] = editor;
+			}
+
+			return editor;
+		}
+
+		EventDescriptorCollection                         _events;
+		EventDescriptorCollection ICustomTypeDescriptor.GetEvents(Attribute[] attributes)
+		{
+			if (_events == null)
+				_events = _typeDescriptionProvider.GetEvents();
+
+			return _events;
+		}
+
+		EventDescriptorCollection ICustomTypeDescriptor.GetEvents()
+		{
+			return _td.GetEvents(null);
+		}
+
+		PropertyDescriptorCollection                         _properties;
+		PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes)
+		{
+			if (_properties == null)
+				_properties = _typeDescriptionProvider.GetProperties();
+
+			return _properties;
+		}
+
+		PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties()
+		{
+			return _td.GetProperties(null);
+		}
+
+		object ICustomTypeDescriptor.GetPropertyOwner(PropertyDescriptor pd)
+		{
+			return this;
+		}
+
+		#endregion
+
+		#region Protected Members
+
+		private Type GetTypeByName(string typeName)
+		{
+			if (string.IsNullOrEmpty(typeName))
+				return null;
+
+			Type type = Type.GetType(typeName);
+
+			if (type != null)
+				return type;
+
+			int idx = typeName.IndexOf(',');
+
+			if (idx != -1)
+				typeName = typeName.Substring(0, idx);
+
+			return _typeDescriptionProvider.OriginalType.Assembly.GetType(typeName);
+		}
+
+		private object CreateInstance(Type type)
+		{
+			ConstructorInfo ci = type.GetConstructor(new Type[]{ typeof(Type) });
+
+			return ci != null?
+				Activator.CreateInstance(type, new object[] { _typeDescriptionProvider.OriginalType }):
+				Activator.CreateInstance(type);
+		}
+
+		private ICustomTypeDescriptor _td
+		{
+			get { return this; }
+		}
+
+		#endregion
+	}
+}
Binary file Source/ComponentModel/Design/Assembly.bmp has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/Design/GetTypeDialog.Designer.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,148 @@
+namespace BLToolkit.ComponentModel.Design
+{
+	partial class GetTypeDialog
+	{
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.IContainer components = null;
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+		protected override void Dispose(bool disposing)
+		{
+			if (disposing && (components != null))
+			{
+				components.Dispose();
+			}
+			base.Dispose(disposing);
+		}
+
+		#region Windows Form Designer generated code
+
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.components = new System.ComponentModel.Container();
+			System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GetTypeDialog));
+			System.Windows.Forms.Label labelRebuild;
+			this._treeView = new System.Windows.Forms.TreeView();
+			this.imageList = new System.Windows.Forms.ImageList(this.components);
+			this._systemCheckBox = new System.Windows.Forms.CheckBox();
+			this._okButton = new System.Windows.Forms.Button();
+			this._cancelButton = new System.Windows.Forms.Button();
+			labelRebuild = new System.Windows.Forms.Label();
+			this.SuspendLayout();
+			// 
+			// _treeView
+			// 
+			this._treeView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+						| System.Windows.Forms.AnchorStyles.Left)
+						| System.Windows.Forms.AnchorStyles.Right)));
+			this._treeView.ImageIndex = 0;
+			this._treeView.ImageList = this.imageList;
+			this._treeView.Location = new System.Drawing.Point(14, 48);
+			this._treeView.Name = "_treeView";
+			this._treeView.SelectedImageIndex = 0;
+			this._treeView.Size = new System.Drawing.Size(523, 345);
+			this._treeView.TabIndex = 0;
+			this._treeView.DoubleClick += new System.EventHandler(this.treeView_DoubleClick);
+			this._treeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView_AfterSelect);
+			// 
+			// imageList
+			// 
+			this.imageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList.ImageStream")));
+			this.imageList.TransparentColor = System.Drawing.Color.Magenta;
+			this.imageList.Images.SetKeyName(0, "None.bmp");
+			this.imageList.Images.SetKeyName(1, "Assembly.bmp");
+			this.imageList.Images.SetKeyName(2, "Namespace.bmp");
+			this.imageList.Images.SetKeyName(3, "Object.bmp");
+			// 
+			// _systemCheckBox
+			// 
+			this._systemCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+			this._systemCheckBox.AutoSize = true;
+			this._systemCheckBox.Checked = true;
+			this._systemCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+			this._systemCheckBox.Location = new System.Drawing.Point(14, 409);
+			this._systemCheckBox.Name = "_systemCheckBox";
+			this._systemCheckBox.Size = new System.Drawing.Size(330, 20);
+			this._systemCheckBox.TabIndex = 1;
+			this._systemCheckBox.Text = "Hide assemblies that begin with Microsoft or System.";
+			this._systemCheckBox.UseVisualStyleBackColor = true;
+			this._systemCheckBox.CheckedChanged += new System.EventHandler(this.systemCheckBox_CheckedChanged);
+			// 
+			// labelRebuild
+			// 
+			labelRebuild.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+						| System.Windows.Forms.AnchorStyles.Right)));
+			labelRebuild.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+			labelRebuild.Location = new System.Drawing.Point(11, 9);
+			labelRebuild.Name = "labelRebuild";
+			labelRebuild.Size = new System.Drawing.Size(525, 32);
+			labelRebuild.TabIndex = 5;
+			labelRebuild.Text = "If your object type does not appear, close the dialog and rebuild the project tha" +
+				"t contains your object.\r\n\r\n";
+			// 
+			// _okButton
+			// 
+			this._okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+			this._okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
+			this._okButton.Location = new System.Drawing.Point(350, 404);
+			this._okButton.Name = "_okButton";
+			this._okButton.Size = new System.Drawing.Size(87, 29);
+			this._okButton.TabIndex = 3;
+			this._okButton.Text = "OK";
+			this._okButton.UseVisualStyleBackColor = true;
+			// 
+			// _cancelButton
+			// 
+			this._cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+			this._cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+			this._cancelButton.Location = new System.Drawing.Point(450, 404);
+			this._cancelButton.Name = "_cancelButton";
+			this._cancelButton.Size = new System.Drawing.Size(87, 29);
+			this._cancelButton.TabIndex = 4;
+			this._cancelButton.Text = "Cancel";
+			this._cancelButton.UseVisualStyleBackColor = true;
+			// 
+			// GetTypeDialog
+			// 
+			this.AcceptButton = this._okButton;
+			this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 16F);
+			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+			this.CancelButton = this._cancelButton;
+			this.ClientSize = new System.Drawing.Size(547, 442);
+			this.Controls.Add(labelRebuild);
+			this.Controls.Add(this._systemCheckBox);
+			this.Controls.Add(this._cancelButton);
+			this.Controls.Add(this._okButton);
+			this.Controls.Add(this._treeView);
+			this.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+			this.MaximizeBox = false;
+			this.MinimizeBox = false;
+			this.MinimumSize = new System.Drawing.Size(555, 275);
+			this.Name = "GetTypeDialog";
+			this.ShowIcon = false;
+			this.ShowInTaskbar = false;
+			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+			this.Text = "Select the Type";
+			this.ResumeLayout(false);
+			this.PerformLayout();
+
+		}
+
+		#endregion
+
+		private System.Windows.Forms.Button _okButton;
+		private System.Windows.Forms.Button _cancelButton;
+		private System.Windows.Forms.ImageList imageList;
+		private System.Windows.Forms.TreeView _treeView;
+		private System.Windows.Forms.CheckBox _systemCheckBox;
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/Design/GetTypeDialog.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,141 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel.Design;
+using System.Diagnostics;
+using System.Reflection;
+using System.Windows.Forms;
+
+namespace BLToolkit.ComponentModel.Design
+{
+	public partial class GetTypeDialog : Form
+	{
+		public GetTypeDialog(IServiceProvider serviceProvider, Type baseType, Predicate<Type> filter)
+		{
+			_serviceProvider = serviceProvider;
+			_baseType        = baseType;
+			_filter          = filter;
+
+			InitializeComponent();
+
+			LoadTypes();
+		}
+
+		private readonly IServiceProvider _serviceProvider;
+		private readonly Type             _baseType;
+		private readonly Predicate<Type>  _filter;
+
+		private Type _resultType;
+		public  Type  ResultType
+		{
+			get { return _resultType; }
+		}
+
+		delegate TypePicker.TypeNode GetTypeNode(Type t);
+
+		private void LoadTypes()
+		{
+			Cursor = Cursors.WaitCursor;
+
+			try
+			{
+				_treeView.Nodes.Clear();
+
+				var assemblyNodes  = new Dictionary<Assembly, TreeNode>();
+				var namespaceNodes = new Dictionary<string, TreeNode>();
+				var typeNodes      = new Dictionary<Type, TypePicker.TypeNode>();
+				var service        = (ITypeDiscoveryService)_serviceProvider.GetService(typeof(ITypeDiscoveryService));
+				var cTypes         = service.GetTypes(_baseType, _systemCheckBox.Checked);
+				var types          = new List<Type>(cTypes.Count);
+
+				foreach (Type type in cTypes)
+					types.Add(type);
+
+				types.Sort((a, b) =>
+					a.Assembly == b.Assembly ?
+						string.Compare(a.FullName, b.FullName) :
+						string.Compare(a.Assembly.FullName, b.Assembly.FullName));
+
+				foreach (var type in types)
+				{
+					if (_filter != null && _filter(type) == false)
+						continue;
+
+					var assembly = type.Assembly;
+
+					TreeNode assemblyNode;
+
+					if (!assemblyNodes.TryGetValue(assembly, out assemblyNode))
+					{
+						assemblyNodes[assembly] = assemblyNode =
+							_treeView.Nodes.Add(assembly.FullName, assembly.GetName().Name, 1, 1);
+					}
+
+					var @namespace    = type.Namespace ?? string.Empty;
+					var namespaceKey = assembly.FullName + ", " + @namespace;
+
+					TreeNode namespaceNode;
+
+					if (!namespaceNodes.TryGetValue(namespaceKey, out namespaceNode))
+					{
+						namespaceNodes[namespaceKey] = namespaceNode =
+							assemblyNode.Nodes.Add(namespaceKey, @namespace, 2, 2);
+					}
+
+					GetTypeNode getTypeNode = null; getTypeNode = t =>
+					{
+						TypePicker.TypeNode node;
+						
+						if (typeNodes.TryGetValue(t, out node))
+							return node;
+
+						if (t.DeclaringType == null)
+						{
+							namespaceNode.Nodes.Add(node = new TypePicker.TypeNode(t.Name, t, false));
+						}
+						else
+						{
+							TreeNode parent = getTypeNode(t.DeclaringType);
+
+							parent.Nodes.Add(node = new TypePicker.TypeNode(t.Name, t, false));
+						}
+
+						typeNodes.Add(t, node);
+
+						return node;
+					};
+
+					getTypeNode(type).IsSelectable = true;
+				}
+			}
+			catch (Exception ex)
+			{
+				Debug.WriteLine(ex.Message);
+			}
+			finally
+			{
+				Cursor = Cursors.Default;
+			}
+		}
+
+		private void systemCheckBox_CheckedChanged(object sender, EventArgs e)
+		{
+			LoadTypes();
+		}
+
+		private void treeView_AfterSelect(object sender, TreeViewEventArgs e)
+		{
+			var node = e.Node as TypePicker.TypeNode;
+
+			_resultType = node != null && node.IsSelectable? node.Type: null;
+
+			_okButton.Enabled = _resultType != null;
+		}
+
+		private void treeView_DoubleClick(object sender, EventArgs e)
+		{
+			_okButton.PerformClick();
+		}
+
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/Design/GetTypeDialog.resx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,182 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="imageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <data name="imageList.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
+        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABE
+        CwAAAk1TRnQBSQFMAgEBBAEAAQkBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
+        AwABIAMAAQEBAAEgBgABIP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAPAAHzAeABzAH/
+        +AAB8wHgAcwB/wGZATsBCAH/AfMB4AHMAf8gAAHIAskB/wOiAf8DhQH/A4EB/wOaAf8BwAK/Af+4AAHz
+        AeABzAH/AbUBawE9Af8B2AGbAWMB/wGZATsBCAH/AfMB4AHMAf8UAAPmAf8CsQGwAf8DnwH/A5YB/wOB
+        Af8DgQH/A40B/wOPAf8BmwGcAZsB/wPeAf9gAAOIAf8DOwH/DAADOwH/A4gB/ywAAZcBgQF3Af8BlwGB
+        AXcB/wHYAZsBYwL/Ac0BmQH/AekBtAGBAf8B2AGbAWMB/wGZATsBCAH/AfMB4AHMAf8QAAO3Af8DpwH/
+        A6AB/wHLAsoB/wPuAf8D7gH/A90B/wOcAf8BkAKRAf8BmwKcAf8kAAF8AWMBTwH/AXUBXAFIAf8BdAFZ
+        AUUB/wFuAVMBPgH/AW0BUAE7Af8BagFPATsB/wFpAVABPAH/AWgBUAE6Af8BaQFRATkB/xQAA4gB/wMS
+        Af8UAAMSAf8DiAH/KAABlwGBAXcB/wQAAfMB4AHMAf8B2AGbAWMC/wHNAZkB/wHpAbQBgQH/AdgBmwFj
+        Af8BmQE7AQgB/wwAA9YB/wOuAf8DpwH/A+cB/wwAA58B/wODAf8DnAH/A48B/wPAAf8cAAGDAXQBZAH/
+        Ae0B5wHiAf8BvwGnAZsB/wG4AZ4BkAH/AbIBlwGJAf8BrAGPAYEB/wGlAYgBgQH/AZ0BgwF7Af8BnAGB
+        AXUB/wGXAYEBbwH/AWsBTgE/Af8QAANVAf8DEgH/FAADEgH/A1UB/ygAAZcBgQF3Af8IAAHzAeABzAH/
+        AdgBmwFjAv8BzQGZAf8ByQF7AUsB/wHzAeABzAH/DAADvwH/Aa0CrgH/A9MB/wwAA6gB/wGMAY0BjAH/
+        A58B/wPdAf8DjQH/A5oB/wgAAc0BvAGvAf8BtgGcAY4B/wGoAYsBgQH/CAABjgF9AW0B/wH0Ae4B6QH/
+        Ae0B5gHjAf8B6QHgAdwB/wHkAdoB0wH/Ad4B0gHMAf8B2gHKAcMB/wHYAcUBvQH/AdQBvgGyAf8BlwGB
+        AXYB/wFqAVABOAH/EAADVQH/AxIB/xQAAxIB/wNVAf8YAAG3Ad8B7gH/DAABlwGBAXcB/wwAAfEBxwHO
+        Af8B2AGbAWMB/wHzAeABzAH/EAADswH/AaMBpAGjAf8D8gH/CAACqQGoAf8DlgH/A6gB/wQAA+4B/wOB
+        Af8DgQH/CAAB3QHNAcYB/wHGAbABpQH/AbcBnAGOAf8BxgGwAaQB/wGpAY8BgQH/AZYBgQF3Af8B9gHy
+        AfEB/wHxAewB6QH/Ae8B5gHiAf8B6QHgAd0B/wHkAdkB1QH/AeEB0QHKAf8B2QHLAcUB/wHWAcUBvAH/
+        AZwBgwF3Af8BbQFQATsB/xAAAxIB/wO/Af8UAAO/Af8DEgH/FAABtwHfAe4B/wEWAYABngH/AbcB3wHu
+        Af8IAAGXAYEBdwH/CAAB/AHcAfsB/wGNATUBjAH/AfEBxwHOAf8UAAO3Af8DqQH/A/MB/wQAA7sB/wOh
+        Af8DsQH/CAAD7gH/A4EB/wOFAf8IAAHuAegB4QH/AdoBzAHGAf8ByAG6Aa4B/wgAAaABigGAAf8B+QL3
+        Af8B9gHxAfIB/wHzAe0B6AH/AewB6AHjAf8B5gHgAdsB/wHlAdkB0wH/Ad4B0gHMAf8B3AHLAcIB/wGh
+        AYgBfAH/AWsBUAE8Af8MAAMSAf8DbAH/HAADbAH/AxIB/wwAAbcB3wHuAf8BFgGAAZ4B/wEkAbYB7gH/
+        ARYBgAGeAf8BtwHfAe4B/wQAAZcBgQF3Af8EAAH8AdwB+wH/AbMBRAGyAf8B3AF4AdsB/wGNATUBjAH/
+        AfwB3AH7Af8QAAPLAf8DuwH/A+MB/wPFAf8DrAH/A7sB/wwAAcoBywHKAf8DlgH/AaIBowGiAf8cAAGp
+        AZUBhAH/Af0B+gH8Af8B+QL3Af8B9wH0AfAB/wHyAe0B6gH/Ae0B5wHiAf8B6wHhAdoB/wHjAdgB1AH/
+        AeIB0gHLAf8BogGLAYEB/wFsAVIBOgH/EAADOwH/A7oB/xQAA7oB/wM7Af8MAAG3Ad8B7gH/ARYBgAGe
+        Af8BVwHLAfEB/wE8AcAB7wH/ATcBvgHvAf8BFAFqAYEB/wGXAYEBdwH/AZcBgQF3Af8BlwGBAXcB/wHZ
+        AXQB2AH/AfoBrQH6Af8B+wGYAfoB/wHcAXgB2wH/AY0BNQGMAf8B/AHcAfsB/wwAA+IB/wPDAf8DvAH/
+        AbICsQH/A8UB/wwAA+cB/wOgAf8DnwH/AskByAH/HAABsQGcAY0F/wH6AvwB/wH6AvgB/wH2AfEB8gH/
+        AfIB7QHsAf8B8AHnAeMB/wHoAd8B2wH/AeIB2QHVAf8B4QHSAckB/wF0AVYBRQH/EAADVQH/AzsB/xQA
+        AzsB/wNVAf8MAAEcAaoB4QH/AYUB4QH1Af8BcwHXAfQB/wFYAcsB8QH/ATwBwAHwAf8BJQG1Ae4B/wEU
+        AWoBgQH/AbcB3wHuAf8EAAH8AdwB+wH/AdMBbQHSAf8B+gGtAfoB/wH7AZgB+gH/AdwBeAHbAf8BjQE1
+        AYwB/xAAA9EB/wO3Af8DvAH/A+AB/wPzAf8D8gH/AdMB0gHTAf8DpwH/A6cB/wKxAbAB/yQAAbQBoQGS
+        Af8BrQGbAYoB/wGnAZABgQH/AaABiQGBAf8BmAGBAXcB/wGPAX8BawH/AYcBdwFjAf8BgQFvAV0B/wGA
+        AWcBUwH/FAADVQH/AzsB/xQAAzsB/wNVAf8MAAG3Ad8B7gH/ARwBqgHhAf8BhgHhAfUB/wF0AdYB8wH/
+        AVgBywHyAf8BPQHAAfAB/wEkAbUB7QH/ARQBagGBAf8BtwHfAe4B/wQAAfwB3AH7Af8B0wFtAdIB/wH6
+        Aa0B+gH/AdMBbQHSAf8B/AHcAfsB/xAAA/EB/wPRAf8DwwH/ArsBugH/A6kB/wGkAaMBpAH/A64B/wOu
+        Af8DtwH/A+YB/1wAA4gB/wM7Af8UAAM7Af8DiAH/EAABtwHfAe4B/wEcAaoB4QH/AYUB4AH1Af8BdAHW
+        AfMB/wFYAcsB8gH/ATwBwAHvAf8BJQG1Ae0B/wEUAWoBgQH/AbcB3wHuAf8EAAH8AdwB+wH/AdMBbQHS
+        Af8B/AHcAfsB/xwAA+IB/wPLAf8DtwH/A7MB/wO/Af8D1gH/aAADiAH/AzsB/wwAAzsB/wOIAf8YAAG3
+        Ad8B7gH/ARwBqgHhAf8BhgHhAfQB/wFzAdYB9AH/AVgBywHxAf8BHwGYAcgB/wG3Ad8B7gH/DAAB/AHc
+        AfsB/9gAAbcB3wHuAf8BHAGqAeEB/wGFAeEB9QH/AR8BmAHIAf8BtwHfAe4B//AAAbcB3wHuAf8BHAGq
+        AeEB/wG3Ad8B7gH/JAABQgFNAT4HAAE+AwABKAMAAUADAAEgAwABAQEAAQEGAAEBFgAD/4EAB/8B7wf/
+        AccB+AEfBf8BgwHgAQcC/wH5Ac8B/gEBAeABBwH8AQEB8wHnAf4BgQHDAYMB+AEAAfMB5wH+AcEBxwED
+        ARgBAAHzAecB7gHjAcYBIwIAAfMB5wHGAccBxAFjARgBAAHnAfMBggGDAcAB4wH4AQAB8wHnAQABAQHB
+        AcMB+AEAAfMB5wEAAYEB4AEHAfwBAQHzAecBAAFBAeABBwL/AfMB5wGAASMB+AEfAv8B+QHPAcABdwb/
+        AeAH/wHxAf8L
+</value>
+  </data>
+  <metadata name="labelRebuild.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+</root>
\ No newline at end of file
Binary file Source/ComponentModel/Design/Namespace.bmp has changed
Binary file Source/ComponentModel/Design/None.bmp has changed
Binary file Source/ComponentModel/Design/Object.bmp has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/Design/ObjectViewTypeEditor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,18 @@
+using System;
+
+using BLToolkit.Reflection;
+
+namespace BLToolkit.ComponentModel.Design
+{
+	public class ObjectViewTypeEditor : TypeEditor
+	{
+		protected override bool FilterTypeList(Type type)
+		{
+			return
+				type.IsPublic     &&
+				!type.IsInterface &&
+				!type.ContainsGenericParameters &&
+				TypeHelper.IsSameOrParent(typeof(IObjectView), type);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/Design/ObjectViewTypeNameEditor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+using System;
+using System.Globalization;
+using System.ComponentModel;
+
+namespace BLToolkit.ComponentModel.Design
+{
+	public class ObjectViewTypeNameEditor : ObjectViewTypeEditor
+	{
+		public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
+		{
+			TypeTypeConverter converter = new TypeTypeConverter();
+
+			value = converter.ConvertFrom(context, CultureInfo.CurrentCulture, value);
+			value = base.EditValue(context, provider, value);
+			value = converter.ConvertTo  (context, CultureInfo.CurrentCulture, value, typeof(string));
+
+			return value;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/Design/TypeEditor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,74 @@
+using System;
+using System.Drawing.Design;
+using System.ComponentModel;
+using System.ComponentModel.Design.Data;
+using System.Data;
+using System.Collections;
+using System.Windows.Forms;
+using System.Windows.Forms.Design;
+
+namespace BLToolkit.ComponentModel.Design
+{
+	public class TypeEditor : UITypeEditor
+	{
+		public override object EditValue(
+			ITypeDescriptorContext context, IServiceProvider provider, object value)
+		{
+			DataSourceProviderService dspService =
+				(DataSourceProviderService)provider.GetService(typeof(DataSourceProviderService));
+
+			if (dspService == null || !dspService.SupportsAddNewDataSource)
+			{
+				using (GetTypeDialog dlg = new GetTypeDialog(provider, typeof (object), FilterTypeList))
+				{
+					IWin32Window dialogOwnerWindow = null;
+					IUIService   uiService         = (IUIService)provider.GetService(typeof(IUIService));
+
+					if (uiService != null)
+						dialogOwnerWindow = uiService.GetDialogOwnerWindow();
+
+					DialogResult result = dlg.ShowDialog(dialogOwnerWindow);
+
+					return result == DialogResult.OK && dlg.ResultType != null? dlg.ResultType: value;
+				}
+			}
+
+			return new TypePicker().PickType(provider, value as Type, FilterTypeList);
+		}
+
+		protected virtual bool FilterTypeList(Type type)
+		{
+			return
+				type.IsPublic     &&
+				type.IsClass      &&
+				//!type.IsInterface &&
+				!type.ContainsGenericParameters &&
+				!typeof(ICollection).IsAssignableFrom(type) &&
+				!typeof(Attribute).  IsAssignableFrom(type) &&
+				!typeof(Exception).  IsAssignableFrom(type) &&
+				!typeof(EventArgs).  IsAssignableFrom(type) &&
+				!typeof(Control).    IsAssignableFrom(type) &&
+				!typeof(DataTable).  IsAssignableFrom(type) &&
+				!typeof(DataView).   IsAssignableFrom(type) &&
+				!typeof(DataRow).    IsAssignableFrom(type) &&
+				!typeof(DataRowView).IsAssignableFrom(type) &&
+				!typeof(DataSet).    IsAssignableFrom(type);
+		}
+
+		public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
+		{
+			if (context == null)
+				return UITypeEditorEditStyle.DropDown;
+
+			var dspService = (DataSourceProviderService)context.GetService(typeof(DataSourceProviderService));
+
+			return dspService == null || !dspService.SupportsAddNewDataSource?
+				UITypeEditorEditStyle.Modal: UITypeEditorEditStyle.DropDown;
+		}
+
+		public override bool IsDropDownResizable
+		{
+			get { return true; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/Design/TypeNameEditor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+using System;
+using System.Globalization;
+using System.ComponentModel;
+
+namespace BLToolkit.ComponentModel.Design
+{
+	public class TypeNameEditor : TypeEditor
+	{
+		public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
+		{
+			TypeTypeConverter converter = new TypeTypeConverter();
+
+			value = converter.ConvertFrom(context, CultureInfo.CurrentCulture, value);
+			value = base.EditValue(context, provider, value);
+			value = converter.ConvertTo  (context, CultureInfo.CurrentCulture, value, typeof(string));
+
+			return value;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/Design/TypePicker.Designer.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,122 @@
+namespace BLToolkit.ComponentModel.Design
+{
+	partial class TypePicker
+	{
+		/// <summary> 
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.IContainer components = null;
+
+		/// <summary> 
+		/// Clean up any resources being used.
+		/// </summary>
+		/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+		protected override void Dispose(bool disposing)
+		{
+			if (disposing && (components != null))
+			{
+				components.Dispose();
+			}
+			base.Dispose(disposing);
+		}
+
+		#region Component Designer generated code
+
+		/// <summary> 
+		/// Required method for Designer support - do not modify 
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.components = new System.ComponentModel.Container();
+			System.Windows.Forms.ImageList imageList;
+			System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TypePicker));
+			this.treeView = new System.Windows.Forms.TreeView();
+			this.addNewLinkLabel = new BLToolkit.ComponentModel.Design.TypePicker.NewLink();
+			this.addNewPanel = new System.Windows.Forms.Panel();
+			this.addNewSplitPanel = new System.Windows.Forms.Panel();
+			imageList = new System.Windows.Forms.ImageList(this.components);
+			this.addNewPanel.SuspendLayout();
+			this.SuspendLayout();
+			// 
+			// treeView
+			// 
+			this.treeView.BorderStyle = System.Windows.Forms.BorderStyle.None;
+			this.treeView.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.treeView.HotTracking = true;
+			this.treeView.ImageIndex = 0;
+			this.treeView.ImageList = imageList;
+			this.treeView.Location = new System.Drawing.Point(0, 0);
+			this.treeView.Name = "treeView";
+			this.treeView.SelectedImageIndex = 0;
+			this.treeView.Size = new System.Drawing.Size(251, 243);
+			this.treeView.TabIndex = 0;
+			this.treeView.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView_NodeMouseClick);
+			// 
+			// imageList
+			// 
+			imageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList.ImageStream")));
+			imageList.TransparentColor = System.Drawing.Color.Magenta;
+			imageList.Images.SetKeyName(0, "None.bmp");
+			imageList.Images.SetKeyName(1, "Assembly.bmp");
+			imageList.Images.SetKeyName(2, "Namespace.bmp");
+			imageList.Images.SetKeyName(3, "Object.bmp");
+			// 
+			// addNewLinkLabel
+			// 
+			this.addNewLinkLabel.AutoSize = true;
+			this.addNewLinkLabel.ForeColor = System.Drawing.SystemColors.WindowText;
+			this.addNewLinkLabel.ImageList = imageList;
+			this.addNewLinkLabel.LinkBehavior = System.Windows.Forms.LinkBehavior.HoverUnderline;
+			this.addNewLinkLabel.Location = new System.Drawing.Point(0, 3);
+			this.addNewLinkLabel.Name = "addNewLinkLabel";
+			this.addNewLinkLabel.Padding = new System.Windows.Forms.Padding(5, 0, 0, 0);
+			this.addNewLinkLabel.Size = new System.Drawing.Size(100, 13);
+			this.addNewLinkLabel.TabIndex = 1;
+			this.addNewLinkLabel.TabStop = true;
+			this.addNewLinkLabel.Text = "Add Project Type...";
+			this.addNewLinkLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+			this.addNewLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.addNewLinkLabel_LinkClicked);
+			// 
+			// addNewPanel
+			// 
+			this.addNewPanel.BackColor = System.Drawing.SystemColors.Window;
+			this.addNewPanel.Controls.Add(this.addNewLinkLabel);
+			this.addNewPanel.Controls.Add(this.addNewSplitPanel);
+			this.addNewPanel.Dock = System.Windows.Forms.DockStyle.Bottom;
+			this.addNewPanel.Location = new System.Drawing.Point(0, 243);
+			this.addNewPanel.Name = "addNewPanel";
+			this.addNewPanel.Size = new System.Drawing.Size(251, 20);
+			this.addNewPanel.TabIndex = 2;
+			// 
+			// addNewSplitPanel
+			// 
+			this.addNewSplitPanel.BackColor = System.Drawing.SystemColors.ControlDark;
+			this.addNewSplitPanel.Dock = System.Windows.Forms.DockStyle.Top;
+			this.addNewSplitPanel.Location = new System.Drawing.Point(0, 0);
+			this.addNewSplitPanel.Name = "addNewSplitPanel";
+			this.addNewSplitPanel.Size = new System.Drawing.Size(251, 1);
+			this.addNewSplitPanel.TabIndex = 2;
+			// 
+			// TypePicker
+			// 
+			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
+			this.Controls.Add(this.treeView);
+			this.Controls.Add(this.addNewPanel);
+			this.Name = "TypePicker";
+			this.Size = new System.Drawing.Size(251, 263);
+			this.Resize += new System.EventHandler(this.TypePicker_Resize);
+			this.addNewPanel.ResumeLayout(false);
+			this.addNewPanel.PerformLayout();
+			this.ResumeLayout(false);
+
+		}
+
+		#endregion
+
+		private System.Windows.Forms.TreeView treeView;
+		private NewLink addNewLinkLabel;
+		private System.Windows.Forms.Panel addNewPanel;
+		private System.Windows.Forms.Panel addNewSplitPanel;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/Design/TypePicker.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,282 @@
+using System;
+using System.ComponentModel;
+using System.ComponentModel.Design;
+using System.ComponentModel.Design.Data;
+using System.Drawing;
+using System.Reflection;
+using System.Windows.Forms;
+using System.Windows.Forms.Design;
+
+namespace BLToolkit.ComponentModel.Design
+{
+	[DesignTimeVisible(false)]
+	[ToolboxItem(false)]
+	public partial class TypePicker : UserControl
+	{
+		public TypePicker()
+		{
+			InitializeComponent();
+
+			if (!_size.IsEmpty)
+				Size = _size;
+		}
+
+		ITypeResolutionService     _typeResolutionService;
+		IWindowsFormsEditorService _windowsFormsEditorService;
+		IServiceProvider           _serviceProvider;
+
+		Type                       _resultType;
+		Predicate<Type>            _filter;
+
+		static Size _size;
+
+		private T GetService<T>()
+		{
+			return (T)_serviceProvider.GetService(typeof(T));
+		}
+
+		public Type PickType(IServiceProvider serviceProvider, Type type, Predicate<Type> filter)
+		{
+			_resultType = type;
+			_filter     = filter;
+
+			_serviceProvider           = serviceProvider;
+			_typeResolutionService     = GetService<ITypeResolutionService>();
+			_windowsFormsEditorService = GetService<IWindowsFormsEditorService>();
+
+			InitUI  ();
+			AddTypes();
+
+			if (_windowsFormsEditorService != null)
+				_windowsFormsEditorService.DropDownControl(this);
+
+			return _resultType;
+		}
+
+		private void InitUI()
+		{
+			IUIService uiService = GetService<IUIService>();
+
+			if (uiService != null)
+			{
+				object color = uiService.Styles["VsColorPanelHyperLink"];
+
+				if (color is Color)
+					addNewLinkLabel.LinkColor = (Color)color;
+
+				color = uiService.Styles["VsColorPanelHyperLinkPressed"];
+
+				if (color is Color)
+					addNewLinkLabel.ActiveLinkColor = (Color)color;
+			}
+
+			// Add None node.
+			//
+			TreeNode node = new TypeNode("None");
+
+			treeView.Nodes.Add(node);
+			treeView.SelectedNode = node;
+		}
+
+		private TypeNode GetTypeNode(DataSourceDescriptor ds)
+		{
+			Type type = null;
+
+			if (_typeResolutionService != null)
+				type = _typeResolutionService.GetType(ds.TypeName);
+
+			try
+			{
+				if (type == null)
+					type = Type.GetType(ds.TypeName, true);
+			}
+			catch
+			{
+				return null;
+			}
+
+			if (_filter != null && _filter(type) == false)
+				return null;
+
+			return new TypeNode(ds.Name, type);
+		}
+
+		private void AddGroup(DataSourceGroup group)
+		{
+			TreeNode groupNode = null;
+
+			foreach (DataSourceDescriptor d in group.DataSources)
+			{
+				if (d == null)
+					continue;
+
+				TypeNode node = GetTypeNode(d);
+
+				if (node == null)
+					continue;
+
+				if (group.IsDefault)
+				{
+					treeView.Nodes.Add(node);
+				}
+				else
+				{
+					if (groupNode == null)
+						treeView.Nodes.Add(groupNode = new TreeNode(group.Name, 2, 2));
+
+					groupNode.Nodes.Add(node);
+				}
+
+				if (_resultType == node.Type)
+					treeView.SelectedNode = node;
+			}
+		}
+
+		private void AddTypes()
+		{
+			DataSourceProviderService dspService = GetService<DataSourceProviderService>();
+
+			if (dspService == null || !dspService.SupportsAddNewDataSource)
+				return;
+
+			DataSourceGroupCollection dataSources = null;
+
+			try
+			{
+				dataSources = dspService.GetDataSources();
+			}
+			catch (Exception ex)
+			{
+				IUIService ui = GetService<IUIService>();
+
+				string message = 
+					"Cant retrieve Data Source Collection: " + ex.Message +
+					"\nCheck the 'Properties\\DataSources' folder of your project.";
+
+				if (ui != null)
+					ui.ShowError(ex, message);
+				else
+					MessageBox.Show(this, message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+			}
+
+			if (dataSources == null)
+				return;
+
+			foreach (DataSourceGroup group in dataSources)
+				if (group != null)
+					AddGroup(group);
+		}
+
+		private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
+		{
+			if (e.Node is TypeNode)
+			{
+				_resultType = ((TypeNode)e.Node).Type;
+				_windowsFormsEditorService.CloseDropDown();
+			}
+		}
+
+		private void addNewLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
+		{
+			using (GetTypeDialog dlg = new GetTypeDialog(_serviceProvider, typeof (object), _filter))
+			{
+				IUIService   uiService = GetService<IUIService>();
+				IWin32Window owner     = uiService == null? null: uiService.GetDialogOwnerWindow();
+				DialogResult result    = dlg.ShowDialog(owner);
+
+				if (result == DialogResult.OK && dlg.ResultType != null)
+				{
+					_resultType = dlg.ResultType;
+
+					SaveType(_resultType);
+
+					_windowsFormsEditorService.CloseDropDown();
+				}
+			}
+		}
+
+		private void TypePicker_Resize(object sender, EventArgs e)
+		{
+			_size = Size;
+		}
+
+		private void SaveType(Type type)
+		{
+			DataSourceProviderService dspService = GetService<DataSourceProviderService>();
+
+			if (dspService == null || !dspService.SupportsAddNewDataSource)
+				return;
+
+			try
+			{
+				const string vs9TypeName = "Microsoft.VSDesigner.VSDesignerPackage.IGenericObjectDataSourcesService, Microsoft.VSDesigner, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a";
+				const string vs8TypeName = "Microsoft.VSDesigner.VSDesignerPackage.IGenericObjectDataSourcesService, Microsoft.VSDesigner, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a";
+
+				Type   serviceType = Type.GetType(vs9TypeName) ?? Type.GetType(vs8TypeName);
+
+				if (serviceType == null)
+					return;
+
+				object service = _serviceProvider.GetService(serviceType);
+
+				if (service == null)
+					return;
+
+				MethodInfo mi = serviceType.GetMethod("AddGenericObjectDataSource");
+
+				mi.Invoke(service, new object[] { _serviceProvider, null, type });
+			}
+			catch (Exception ex)
+			{
+				IUIService ui = GetService<IUIService>();
+
+				if (ui != null)
+					ui.ShowError(ex);
+				else
+					MessageBox.Show(this, ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+			}
+		}
+
+		internal class TypeNode : TreeNode
+		{
+			public TypeNode(string name)
+				: base(name, 0, 0)
+			{
+				_isSelectable = true;
+			}
+
+			public TypeNode(string name, Type type)
+				: this(name, type, true)
+			{
+			}
+
+			public TypeNode(string name, Type type, bool isSelectable)
+				: base(name, 3, 3)
+			{
+				_type         = type;
+				_isSelectable = isSelectable;
+			}
+
+			private bool _isSelectable;
+			public  bool  IsSelectable
+			{
+				get { return _isSelectable;  }
+				set { _isSelectable = value; }
+			}
+
+			private readonly Type _type;
+			public           Type  Type
+			{
+				get { return _type; }
+			}
+		}
+
+		class NewLink : LinkLabel
+		{
+			protected override bool IsInputKey(Keys key)
+			{
+				return key == Keys.Return? true: base.IsInputKey(key);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/Design/TypePicker.resx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,182 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="imageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="imageList.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+  <data name="imageList.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
+        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABE
+        CwAAAk1TRnQBSQFMAgEBBAEAAQkBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
+        AwABIAMAAQEBAAEgBgABIP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAPAAHzAeABzAH/
+        +AAB8wHgAcwB/wGZATcBBAH/AfMB4AHMAf8gAAHIAskB/wOiAf8DhQH/A4EB/wOaAf8BwAK/Af+4AAHz
+        AeABzAH/AbUBZwE5Af8B2AGbAV8B/wGZATcBBAH/AfMB4AHMAf8UAAPmAf8CsQGwAf8DnwH/A5YB/wOB
+        Af8DgAH/A40B/wOPAf8BmwGcAZsB/wPeAf9gAAOIAf8DNwH/DAADNwH/A4gB/ywAAZcBgQFzAf8BlwGB
+        AXMB/wHYAZsBXwL/Ac0BmQH/AekBtAGAAf8B2AGbAV8B/wGZATcBBAH/AfMB4AHMAf8QAAO3Af8DpwH/
+        A6AB/wHLAsoB/wPuAf8D7gH/A90B/wOcAf8BkAKRAf8BmwKcAf8kAAF4AV8BSwH/AXEBWAFEAf8BcAFV
+        AUEB/wFqAU8BOgH/AWkBTAE3Af8BZgFLATcB/wFlAUwBOAH/AWQBTAE2Af8BZQFNATUB/xQAA4gB/wMO
+        Af8UAAMOAf8DiAH/KAABlwGBAXMB/wQAAfMB4AHMAf8B2AGbAV8C/wHNAZkB/wHpAbQBgAH/AdgBmwFf
+        Af8BmQE3AQQB/wwAA9YB/wOuAf8DpwH/A+cB/wwAA58B/wODAf8DnAH/A48B/wPAAf8cAAGDAXABYAH/
+        Ae0B5wHiAf8BvwGnAZsB/wG4AZ4BkAH/AbIBlwGJAf8BrAGPAYEB/wGlAYgBfQH/AZ0BgwF3Af8BnAGB
+        AXEB/wGXAYABawH/AWcBSgE7Af8QAANRAf8DDgH/FAADDgH/A1EB/ygAAZcBgQFzAf8IAAHzAeABzAH/
+        AdgBmwFfAv8BzQGZAf8ByQF3AUcB/wHzAeABzAH/DAADvwH/Aa0CrgH/A9MB/wwAA6gB/wGMAY0BjAH/
+        A58B/wPdAf8DjQH/A5oB/wgAAc0BvAGvAf8BtgGcAY4B/wGoAYsBgQH/CAABjgF5AWkB/wH0Ae4B6QH/
+        Ae0B5gHjAf8B6QHgAdwB/wHkAdoB0wH/Ad4B0gHMAf8B2gHKAcMB/wHYAcUBvQH/AdQBvgGyAf8BlwGB
+        AXIB/wFmAUwBNAH/EAADUQH/Aw4B/xQAAw4B/wNRAf8YAAG3Ad8B7gH/DAABlwGBAXMB/wwAAfEBxwHO
+        Af8B2AGbAV8B/wHzAeABzAH/EAADswH/AaMBpAGjAf8D8gH/CAACqQGoAf8DlgH/A6gB/wQAA+4B/wOA
+        Af8DgQH/CAAB3QHNAcYB/wHGAbABpQH/AbcBnAGOAf8BxgGwAaQB/wGpAY8BgQH/AZYBgQFzAf8B9gHy
+        AfEB/wHxAewB6QH/Ae8B5gHiAf8B6QHgAd0B/wHkAdkB1QH/AeEB0QHKAf8B2QHLAcUB/wHWAcUBvAH/
+        AZwBgwFzAf8BaQFMATcB/xAAAw4B/wO/Af8UAAO/Af8DDgH/FAABtwHfAe4B/wESAXwBngH/AbcB3wHu
+        Af8IAAGXAYEBcwH/CAAB/AHcAfsB/wGNATEBjAH/AfEBxwHOAf8UAAO3Af8DqQH/A/MB/wQAA7sB/wOh
+        Af8DsQH/CAAD7gH/A4EB/wOFAf8IAAHuAegB4QH/AdoBzAHGAf8ByAG6Aa4B/wgAAaABigF8Af8B+QL3
+        Af8B9gHxAfIB/wHzAe0B6AH/AewB6AHjAf8B5gHgAdsB/wHlAdkB0wH/Ad4B0gHMAf8B3AHLAcIB/wGh
+        AYgBeAH/AWcBTAE4Af8MAAMOAf8DaAH/HAADaAH/Aw4B/wwAAbcB3wHuAf8BEgF8AZ4B/wEgAbYB7gH/
+        ARIBfAGeAf8BtwHfAe4B/wQAAZcBgQFzAf8EAAH8AdwB+wH/AbMBQAGyAf8B3AF0AdsB/wGNATEBjAH/
+        AfwB3AH7Af8QAAPLAf8DuwH/A+MB/wPFAf8DrAH/A7sB/wwAAcoBywHKAf8DlgH/AaIBowGiAf8cAAGp
+        AZUBhAH/Af0B+gH8Af8B+QL3Af8B9wH0AfAB/wHyAe0B6gH/Ae0B5wHiAf8B6wHhAdoB/wHjAdgB1AH/
+        AeIB0gHLAf8BogGLAX8B/wFoAU4BNgH/EAADNwH/A7oB/xQAA7oB/wM3Af8MAAG3Ad8B7gH/ARIBfAGe
+        Af8BUwHLAfEB/wE4AcAB7wH/ATMBvgHvAf8BEAFmAYEB/wGXAYEBcwH/AZcBgQFzAf8BlwGBAXMB/wHZ
+        AXAB2AH/AfoBrQH6Af8B+wGYAfoB/wHcAXQB2wH/AY0BMQGMAf8B/AHcAfsB/wwAA+IB/wPDAf8DvAH/
+        AbICsQH/A8UB/wwAA+cB/wOgAf8DnwH/AskByAH/HAABsQGcAY0F/wH6AvwB/wH6AvgB/wH2AfEB8gH/
+        AfIB7QHsAf8B8AHnAeMB/wHoAd8B2wH/AeIB2QHVAf8B4QHSAckB/wFwAVIBQQH/EAADUQH/AzcB/xQA
+        AzcB/wNRAf8MAAEYAaoB4QH/AYUB4QH1Af8BbwHXAfQB/wFUAcsB8QH/ATgBwAHwAf8BIQG1Ae4B/wEQ
+        AWYBgQH/AbcB3wHuAf8EAAH8AdwB+wH/AdMBaQHSAf8B+gGtAfoB/wH7AZgB+gH/AdwBdAHbAf8BjQEx
+        AYwB/xAAA9EB/wO3Af8DvAH/A+AB/wPzAf8D8gH/AdMB0gHTAf8DpwH/A6cB/wKxAbAB/yQAAbQBoQGS
+        Af8BrQGbAYoB/wGnAZABgQH/AaABiQF9Af8BmAGBAXMB/wGPAXsBZwH/AYcBcwFfAf8BgQFrAVkB/wF8
+        AWMBTwH/FAADUQH/AzcB/xQAAzcB/wNRAf8MAAG3Ad8B7gH/ARgBqgHhAf8BhgHhAfUB/wFwAdYB8wH/
+        AVQBywHyAf8BOQHAAfAB/wEgAbUB7QH/ARABZgGBAf8BtwHfAe4B/wQAAfwB3AH7Af8B0wFpAdIB/wH6
+        Aa0B+gH/AdMBaQHSAf8B/AHcAfsB/xAAA/EB/wPRAf8DwwH/ArsBugH/A6kB/wGkAaMBpAH/A64B/wOu
+        Af8DtwH/A+YB/1wAA4gB/wM3Af8UAAM3Af8DiAH/EAABtwHfAe4B/wEYAaoB4QH/AYUB4AH1Af8BcAHW
+        AfMB/wFUAcsB8gH/ATgBwAHvAf8BIQG1Ae0B/wEQAWYBgQH/AbcB3wHuAf8EAAH8AdwB+wH/AdMBaQHS
+        Af8B/AHcAfsB/xwAA+IB/wPLAf8DtwH/A7MB/wO/Af8D1gH/aAADiAH/AzcB/wwAAzcB/wOIAf8YAAG3
+        Ad8B7gH/ARgBqgHhAf8BhgHhAfQB/wFvAdYB9AH/AVQBywHxAf8BGwGYAcgB/wG3Ad8B7gH/DAAB/AHc
+        AfsB/9gAAbcB3wHuAf8BGAGqAeEB/wGFAeEB9QH/ARsBmAHIAf8BtwHfAe4B//AAAbcB3wHuAf8BGAGq
+        AeEB/wG3Ad8B7gH/JAABQgFNAT4HAAE+AwABKAMAAUADAAEgAwABAQEAAQEGAAEBFgAD/4EAB/8B7wf/
+        AccB+AEfBf8BgwHgAQcC/wH5Ac8B/gEBAeABBwH8AQEB8wHnAf4BgQHDAYMB+AEAAfMB5wH+AcEBxwED
+        ARgBAAHzAecB7gHjAcYBIwIAAfMB5wHGAccBxAFjARgBAAHnAfMBggGDAcAB4wH4AQAB8wHnAQABAQHB
+        AcMB+AEAAfMB5wEAAYEB4AEHAfwBAQHzAecBAAFBAeABBwL/AfMB5wGAASMB+AEfAv8B+QHPAcABdwb/
+        AeAH/wHxAf8L
+</value>
+  </data>
+</root>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/INotifyObjectEdit.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,11 @@
+using System;
+
+namespace BLToolkit.ComponentModel
+{
+	public delegate void ObjectEditEventHandler(object sender, ObjectEditEventArgs args);
+
+	public interface INotifyObjectEdit
+	{
+		event ObjectEditEventHandler ObjectEdit;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/IObjectView.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+using System;
+
+namespace BLToolkit.ComponentModel
+{
+	public interface IObjectView
+	{
+		object Object { get; set; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/ISortable.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+using System;
+using System.Collections;
+
+namespace BLToolkit.ComponentModel
+{
+	public interface ISortable
+	{
+		void Sort(int index, int count, IComparer comparer);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/ITypeDescriptionProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,19 @@
+using System;
+using System.ComponentModel;
+
+namespace BLToolkit.ComponentModel
+{
+	public interface ITypeDescriptionProvider
+	{
+		Type                         OriginalType  { get; }
+		string                       ClassName     { get; }
+		string                       ComponentName { get; }
+
+		EventDescriptor              GetEvent      (string name);
+		PropertyDescriptor           GetProperty   (string name);
+
+		AttributeCollection          GetAttributes ();
+		EventDescriptorCollection    GetEvents     ();
+		PropertyDescriptorCollection GetProperties ();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/MemberPropertyDescriptor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,87 @@
+using System;
+using System.ComponentModel;
+
+using BLToolkit.Reflection;
+
+namespace BLToolkit.ComponentModel
+{
+	public class MemberPropertyDescriptor : PropertyDescriptor
+	{
+		public MemberPropertyDescriptor(Type componentType, string memberName)
+			: base(memberName, null)
+		{
+			_componentType  = componentType;
+			_memberAccessor = TypeAccessor.GetAccessor(componentType)[memberName];
+		}
+
+		private readonly Type _componentType;
+		public  override Type  ComponentType
+		{
+			get { return _componentType; }
+		}
+
+		public override Type PropertyType
+		{
+			get { return _memberAccessor.Type; }
+		}
+
+		private readonly MemberAccessor _memberAccessor;
+		public           MemberAccessor  MemberAccessor
+		{
+			get { return _memberAccessor; }
+		}
+
+		public override bool CanResetValue(object component)
+		{
+			if (PropertyType.IsValueType)
+				return TypeAccessor.GetNullValue(PropertyType) != null;
+			return PropertyType == typeof(string);
+		}
+
+		public override void ResetValue(object component)
+		{
+			SetValue(component, TypeAccessor.GetNullValue(PropertyType));
+		}
+
+		public override object GetValue(object component)
+		{
+			return component != null? _memberAccessor.GetValue(component): null;
+		}
+
+		public override void SetValue(object component, object value)
+		{
+			if (component != null)
+				_memberAccessor.SetValue(component, value);
+		}
+
+		public override bool IsReadOnly
+		{
+			get { return !_memberAccessor.HasSetter; }
+		}
+
+		public override bool ShouldSerializeValue(object component)
+		{
+			return false;
+		}
+
+		private         AttributeCollection _attributes;
+		public override AttributeCollection  Attributes
+		{
+			get
+			{
+				if (_attributes == null)
+				{
+					object[]    memberAttrs = _memberAccessor.GetAttributes();
+					Attribute[] attrs       = new Attribute[memberAttrs == null? 0: memberAttrs.Length];
+
+					if (memberAttrs != null)
+						memberAttrs.CopyTo(attrs, 0);
+
+					_attributes = new AttributeCollection(attrs);
+				}
+
+				return _attributes;
+			}
+		}
+	}
+}
Binary file Source/ComponentModel/ObjectBinder.bmp has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/ObjectBinder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,547 @@
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Drawing.Design;
+using System.Drawing;
+using System.Windows.Forms;
+
+using BLToolkit.EditableObjects;
+using BLToolkit.Reflection;
+
+namespace BLToolkit.ComponentModel
+{
+	/// <summary>
+	/// http://www.bltoolkit.net/Doc/ComponentModel/ObjectBinder.htm
+	/// </summary>
+	//[ComplexBindingProperties("DataSource", "DataMember")]
+	[ComplexBindingProperties("DataSource")]
+	[DefaultProperty("ItemType")]
+	[ToolboxItem(true)]
+	[ToolboxBitmap(typeof(ObjectBinder))]
+	public class ObjectBinder : Component, ITypedList, IBindingListView, ICancelAddNew
+	{
+		#region Constructors
+
+		static readonly EditableArrayList _empty = new EditableArrayList(typeof(object));
+
+		public ObjectBinder()
+		{
+		}
+
+		public ObjectBinder(IContainer container)
+			: this()
+		{
+			if (container != null)
+				container.Add(this);
+		}
+
+		#endregion
+
+		#region Public members
+
+		private object _dataSource;
+
+		[AttributeProvider(typeof(IListSource))]
+		[RefreshProperties(RefreshProperties.Repaint)]
+		[DefaultValue(null)]
+		[Category("Data")]
+		public  object  DataSource
+		{
+			get { return _dataSource; }
+			set
+			{
+				_dataSource = value;
+
+				if      (value is Type)          ItemType   = (Type)value;
+				else if (value is BindingSource) DataSource = ((BindingSource)value).DataSource;
+				else if (value is IList)         List       = (IList)value;
+				else if (value is IListSource)   List       = ((IListSource)value).GetList();
+				else                             Object     = value;
+			}
+		}
+
+		private Type _itemType;
+		[RefreshProperties(RefreshProperties.Repaint)]
+		[DefaultValue(null)]
+		[Category("Data")]
+		[TypeConverter(typeof(TypeTypeConverter))]
+#if !CLIENTPROFILE
+		[Editor(typeof(Design.TypeEditor), typeof(UITypeEditor))]
+#endif
+		public  Type  ItemType
+		{
+			get { return _itemType; }
+			set
+			{
+				_itemType = value;
+
+				List = null;
+
+				OnListChanged(ListChangedType.PropertyDescriptorChanged, -1);
+			}
+		}
+
+		private Type _objectViewType;
+		[RefreshProperties(RefreshProperties.Repaint)]
+		[DefaultValue(null)]
+		[Category("Data")]
+		[TypeConverter(typeof(TypeTypeConverter))]
+#if !CLIENTPROFILE
+		[Editor(typeof(Design.ObjectViewTypeEditor), typeof(UITypeEditor))]
+#endif
+		public  Type  ObjectViewType
+		{
+			get { return _objectViewType; }
+			set
+			{
+				_objectViewType = value;
+
+				List = null;
+
+				OnListChanged(ListChangedType.PropertyDescriptorChanged, -1);
+			}
+		}
+
+		private object _object;
+		[Browsable(false)]
+		[RefreshProperties(RefreshProperties.Repaint)]
+		[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+		public object Object
+		{
+			get { return _object; }
+			set
+			{
+				if (value == null)
+				{
+					List = null;
+				}
+				else
+				{
+					EditableArrayList list = new EditableArrayList(value.GetType(), 1);
+
+					list.Add(value, false);
+
+					List = list;
+					_object = value;
+				}
+			}
+		}
+
+		private bool              _isListCreatedInternally;
+		private EditableArrayList _list = _empty;
+		[Browsable(false)]
+		[RefreshProperties(RefreshProperties.Repaint)]
+		[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+		public IList List
+		{
+			get { return _list; }
+			set
+			{
+				if (value == null)
+				{
+					if (_list != _empty)
+						_list.ListChanged -= ListChangedHandler;
+
+					_list = _itemType == null? _empty: new EditableArrayList(_itemType);
+					_isListCreatedInternally = true;
+				}
+				else
+				{
+					EditableArrayList list;
+
+					if (value is EditableArrayList)
+					{
+						list = (EditableArrayList)value;
+
+						_isListCreatedInternally = false;
+					}
+					else
+					{
+						if (value.Count != 0 && _itemType == null)
+							list = EditableArrayList.Adapter(value);
+						else
+							list = EditableArrayList.Adapter(_itemType, value);
+
+						_isListCreatedInternally = true;
+					}
+
+					if (_itemType == null)
+					{
+						_itemType = list.ItemType;
+					}
+					else
+					{
+						if (list.ItemType != _itemType && !list.ItemType.IsSubclassOf(_itemType))
+							throw new ArgumentException(string.Format(
+								"Item type {0} of the new list must be a subclass of {1}.",
+								list.ItemType,
+								_itemType));
+					}
+
+					if (_list != _empty)
+					{
+						_list.ListChanged -= ListChangedHandler;
+						
+						if (_disposeList || (_isListCreatedInternally && _disposeCreatedList))
+							_list.Dispose();
+					}
+
+					_list = list;
+				}
+
+				if (_list != _empty)
+					_list.ListChanged += ListChangedHandler;
+
+				OnListChanged(ListChangedType.Reset, -1);
+			}
+		}
+
+		private bool _disposeList;
+		[DefaultValue(false)]
+		[Category("Behavior")]
+		[Description("Determines whether ObjectBinder will invoke underlying List's dispose when being itself disposed.")]
+		public bool DisposeList
+		{
+			get { return _disposeList;  }
+			set { _disposeList = value; }
+		}
+
+		private bool _disposeCreatedList = true;
+		[DefaultValue(true)]
+		[Category("Behavior")]
+		[Description("Determines whether ObjectBinder will invoke underlying internally created List's dispose when being itself disposed")]
+		public bool DisposeCreatedList
+		{
+			get { return _disposeCreatedList;  }
+			set { _disposeCreatedList = value; }
+		}
+
+		private bool _allowNew = true;
+		[DefaultValue(true)]
+		[Category("Behavior")]
+		[Description("Determines whether new items can be added to the list.")]
+		public  bool  AllowNew
+		{
+			get { return _allowNew && _list.AllowNew;  }
+			set { _allowNew = value; }
+		}
+
+		private bool _allowEdit = true;
+		[DefaultValue(true)]
+		[Category("Behavior")]
+		[Description("Determines whether items in the list can be edited.")]
+		public  bool  AllowEdit
+		{
+			get { return _allowEdit && _list.AllowEdit; }
+			set { _allowEdit = value; }
+		}
+
+		private bool _allowRemove = true;
+		[DefaultValue(true)]
+		[Category("Behavior")]
+		[Description("Determines whether items can be removed from the list.")]
+		public bool AllowRemove
+		{
+			get { return _allowRemove && _list.AllowRemove;  }
+			set { _allowRemove = value; }
+		}
+
+		private IsNullHandler _isNull;
+		[Browsable(false)]
+		[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+		public  IsNullHandler  IsNull
+		{
+			get { return _isNull;  }
+			set { _isNull = value; }
+		}
+
+		bool IBindingList.AllowNew    { get { return AllowNew;    } }
+		bool IBindingList.AllowEdit   { get { return AllowEdit;   } }
+		bool IBindingList.AllowRemove { get { return AllowRemove; } }
+
+		#endregion
+
+		#region Protected Members
+
+		protected virtual void OnListChanged(ListChangedEventArgs e)
+		{
+			ListChangedEventHandler handler = (ListChangedEventHandler)Events[ListChangedEvent];
+			if (handler != null)
+				handler(this, e);
+		}
+
+		protected void OnListChanged(ListChangedType listChangedType, int newIndex)
+		{
+			OnListChanged(new ListChangedEventArgs(listChangedType, newIndex));
+		}
+
+		private void ListChangedHandler(object sender, ListChangedEventArgs e)
+		{
+			OnListChanged(e);
+		}
+
+		protected override void Dispose(bool disposing)
+		{
+			if (_list != _empty)
+			{
+				_list.ListChanged -= ListChangedHandler;
+
+				if (_disposeList || (_isListCreatedInternally && _disposeCreatedList))
+					_list.Dispose();
+			}
+
+			_list = _empty;
+			
+			base.Dispose(disposing);
+		}
+
+		#endregion
+
+		#region ITypedList Members
+
+		private static readonly Hashtable _descriptors = new Hashtable();
+
+		PropertyDescriptorCollection ITypedList.GetItemProperties(PropertyDescriptor[] listAccessors)
+		{
+			if (_itemType == null)
+				return new PropertyDescriptorCollection(new PropertyDescriptor[0]);
+
+			string key =
+				_itemType + "." +
+				(_objectViewType == null? string.Empty: _objectViewType.ToString()) + "." +
+				(_isNull == null? "0": "1");
+
+			if (listAccessors != null)
+				foreach (PropertyDescriptor pd in listAccessors)
+					key += "." + pd.Name;
+
+			PropertyDescriptorCollection pdc = (PropertyDescriptorCollection)_descriptors[key];
+
+			if (pdc == null)
+			{
+				pdc = _list.GetItemProperties(listAccessors, _objectViewType, _isNull, !DesignMode);
+
+				if (!DesignMode)
+					_descriptors[key] = pdc;
+			}
+
+			return pdc;
+		}
+
+		string ITypedList.GetListName(PropertyDescriptor[] listAccessors)
+		{
+			return _list.GetListName(listAccessors);
+		}
+
+		#endregion
+
+		#region IBindingListView Members
+
+		bool IBindingListView.SupportsAdvancedSorting
+		{
+			get { return _list.SupportsAdvancedSorting; }
+		}
+
+		ListSortDescriptionCollection IBindingListView.SortDescriptions
+		{
+			get { return _list.SortDescriptions; }
+		}
+
+		void IBindingListView.ApplySort(ListSortDescriptionCollection sorts)
+		{
+			_list.ApplySort(sorts);
+		}
+
+		bool IBindingListView.SupportsFiltering
+		{
+			get { return _list.SupportsFiltering; }
+		}
+
+		string IBindingListView.Filter
+		{
+			get { return _list.Filter;  }
+			set { _list.Filter = value; }
+		}
+
+		void IBindingListView.RemoveFilter()
+		{
+			_list.RemoveFilter();
+		}
+
+		#endregion
+
+		#region ICancelAddNew Members
+
+		void ICancelAddNew.CancelNew(int itemIndex)
+		{
+			_list.CancelNew(itemIndex);
+		}
+
+		void ICancelAddNew.EndNew(int itemIndex)
+		{
+			_list.EndNew(itemIndex);
+		}
+
+		#endregion
+
+		#region IBindingList Members
+
+		void IBindingList.AddIndex(PropertyDescriptor property)
+		{
+			_list.AddIndex(property);
+		}
+
+		object IBindingList.AddNew()
+		{
+			return _list.AddNew();
+		}
+
+		void IBindingList.ApplySort(PropertyDescriptor property, ListSortDirection direction)
+		{
+			_list.ApplySort(property, direction);
+		}
+
+		int IBindingList.Find(PropertyDescriptor property, object key)
+		{
+			return _list.Find(property, key);
+		}
+
+		bool IBindingList.IsSorted
+		{
+			get { return _list.IsSorted; }
+		}
+
+		private static readonly object ListChangedEvent = new object();
+
+		public event ListChangedEventHandler ListChanged
+		{
+			add    { Events.AddHandler   (ListChangedEvent, value); }
+			remove { Events.RemoveHandler(ListChangedEvent, value); }
+		}
+
+		void IBindingList.RemoveIndex(PropertyDescriptor property)
+		{
+			_list.RemoveIndex(property);
+		}
+
+		void IBindingList.RemoveSort()
+		{
+			_list.RemoveSort();
+		}
+
+		ListSortDirection IBindingList.SortDirection
+		{
+			get { return _list.SortDirection; }
+		}
+
+		PropertyDescriptor IBindingList.SortProperty
+		{
+			get { return _list.SortProperty; }
+		}
+
+		bool IBindingList.SupportsChangeNotification
+		{
+			get { return _list.SupportsChangeNotification; }
+		}
+
+		bool IBindingList.SupportsSearching
+		{
+			get { return _list.SupportsSearching; }
+		}
+
+		bool IBindingList.SupportsSorting
+		{
+			get { return _list.SupportsSorting; }
+		}
+
+		#endregion
+
+		#region IList Members
+
+		int IList.Add(object value)
+		{
+			return _list.Add(value);
+		}
+
+		void IList.Clear()
+		{
+			_list.Clear();
+		}
+
+		bool IList.Contains(object value)
+		{
+			return _list.Contains(value);
+		}
+
+		int IList.IndexOf(object value)
+		{
+			return _list.IndexOf(value);
+		}
+
+		void IList.Insert(int index, object value)
+		{
+			_list.Insert(index, value);
+		}
+
+		bool IList.IsFixedSize
+		{
+			get { return _list.IsFixedSize; }
+		}
+
+		bool IList.IsReadOnly
+		{
+			get { return _list.IsReadOnly; }
+		}
+
+		void IList.Remove(object value)
+		{
+			_list.Remove(value);
+		}
+
+		void IList.RemoveAt(int index)
+		{
+			_list.RemoveAt(index);
+		}
+
+		object IList.this[int index]
+		{
+			get { return index == -1? null: _list[index];  }
+			set { _list[index] = value; }
+		}
+
+		#endregion
+
+		#region ICollection Members
+
+		void ICollection.CopyTo(Array array, int index)
+		{
+			_list.CopyTo(array, index);
+		}
+
+		int ICollection.Count
+		{
+			get { return _list.Count; }
+		}
+
+		bool ICollection.IsSynchronized
+		{
+			get { return _list.IsSynchronized; }
+		}
+
+		object ICollection.SyncRoot
+		{
+			get { return _list.SyncRoot; }
+		}
+
+		#endregion
+
+		#region IEnumerable Members
+
+		IEnumerator IEnumerable.GetEnumerator()
+		{
+			return _list.GetEnumerator();
+		}
+
+		#endregion
+	}
+}
Binary file Source/ComponentModel/ObjectBinder.ico has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/ObjectBinder.resx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<root>
+	<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+		<xsd:element name="root" msdata:IsDataSet="true">
+			<xsd:complexType>
+				<xsd:choice maxOccurs="unbounded">
+					<xsd:element name="data">
+						<xsd:complexType>
+							<xsd:sequence>
+								<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+								<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+							</xsd:sequence>
+							<xsd:attribute name="name" type="xsd:string" />
+							<xsd:attribute name="type" type="xsd:string" />
+							<xsd:attribute name="mimetype" type="xsd:string" />
+						</xsd:complexType>
+					</xsd:element>
+					<xsd:element name="resheader">
+						<xsd:complexType>
+							<xsd:sequence>
+								<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+							</xsd:sequence>
+							<xsd:attribute name="name" type="xsd:string" use="required" />
+						</xsd:complexType>
+					</xsd:element>
+				</xsd:choice>
+			</xsd:complexType>
+		</xsd:element>
+	</xsd:schema>
+	<resheader name="ResMimeType">
+		<value>text/microsoft-resx</value>
+	</resheader>
+	<resheader name="Version">
+		<value>1.0.0.0</value>
+	</resheader>
+	<resheader name="Reader">
+		<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+	</resheader>
+	<resheader name="Writer">
+		<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+	</resheader>
+</root>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/ObjectEditEventArgs.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,19 @@
+using System;
+
+namespace BLToolkit.ComponentModel
+{
+	public class ObjectEditEventArgs
+	{
+		public ObjectEditEventArgs(ObjectEditType editType)
+		{
+			_editType = editType;
+		}
+
+		private ObjectEditType _editType;
+		public  ObjectEditType  EditType
+		{
+			get { return _editType;  }
+			set { _editType = value; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/ObjectEditType.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,11 @@
+using System;
+
+namespace BLToolkit.ComponentModel
+{
+	public enum ObjectEditType
+	{
+		Begin,
+		End,
+		Cancel
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/ObjectHolder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,139 @@
+using System;
+using System.ComponentModel;
+
+using BLToolkit.Reflection;
+
+namespace BLToolkit.ComponentModel
+{
+	public class ObjectHolder : ICustomTypeDescriptor
+	{
+		public ObjectHolder(object obj, ObjectBinder objectBinder)
+		{
+			_object             = obj;
+			_originalProperties = ((ITypedList)objectBinder).GetItemProperties(null);
+		}
+
+		private readonly PropertyDescriptorCollection _originalProperties;
+		private          PropertyDescriptorCollection _customProperties;
+
+		private readonly object _object;
+		public           object  Object
+		{
+			get { return _object; }
+		}
+
+		private ICustomTypeDescriptor _customTypeDescriptor;
+		private ICustomTypeDescriptor  CustomTypeDescriptor
+		{
+			get
+			{
+				if (_customTypeDescriptor == null)
+				{
+					_customTypeDescriptor = _object is ICustomTypeDescriptor?
+						(ICustomTypeDescriptor)_object:
+						TypeAccessor.GetCustomTypeDescriptor(_object.GetType());
+				}
+
+				return _customTypeDescriptor;
+			}
+		}
+
+		#region ICustomTypeDescriptor Members
+
+		AttributeCollection ICustomTypeDescriptor.GetAttributes()
+		{
+			return CustomTypeDescriptor.GetAttributes();
+		}
+
+		string ICustomTypeDescriptor.GetClassName()
+		{
+			return CustomTypeDescriptor.GetClassName();
+		}
+
+		string ICustomTypeDescriptor.GetComponentName()
+		{
+			return CustomTypeDescriptor.GetComponentName();
+		}
+
+		TypeConverter ICustomTypeDescriptor.GetConverter()
+		{
+			return CustomTypeDescriptor.GetConverter();
+		}
+
+		EventDescriptor ICustomTypeDescriptor.GetDefaultEvent()
+		{
+			return CustomTypeDescriptor.GetDefaultEvent();
+		}
+
+		PropertyDescriptor ICustomTypeDescriptor.GetDefaultProperty()
+		{
+			return CustomTypeDescriptor.GetDefaultProperty();
+		}
+
+		object ICustomTypeDescriptor.GetEditor(Type editorBaseType)
+		{
+			return CustomTypeDescriptor.GetEditor(editorBaseType);
+		}
+
+		EventDescriptorCollection ICustomTypeDescriptor.GetEvents(Attribute[] attributes)
+		{
+			return CustomTypeDescriptor.GetEvents(attributes);
+		}
+
+		EventDescriptorCollection ICustomTypeDescriptor.GetEvents()
+		{
+			return CustomTypeDescriptor.GetEvents();
+		}
+
+		PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes)
+		{
+			if (_customProperties == null)
+			{
+				PropertyDescriptor[] properties = new PropertyDescriptor[_originalProperties.Count];
+
+				for (int i = 0; i < properties.Length; i++)
+				{
+					properties[i] = new ObjectPropertyDescriptor(_originalProperties[i]);
+				}
+
+				_customProperties = new PropertyDescriptorCollection(properties);
+			}
+
+			return _customProperties;
+		}
+
+		PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties()
+		{
+			return ((ICustomTypeDescriptor)this).GetProperties(null);
+		}
+
+		object ICustomTypeDescriptor.GetPropertyOwner(PropertyDescriptor pd)
+		{
+			return CustomTypeDescriptor.GetPropertyOwner(pd);
+		}
+
+		#endregion
+
+		#region ObjectPropertyDescriptor
+
+		class ObjectPropertyDescriptor : PropertyDescriptorWrapper
+		{
+			public ObjectPropertyDescriptor(PropertyDescriptor pd)
+				: base(pd)
+			{
+			}
+
+			public override object GetValue(object component)
+			{
+				return base.GetValue(((ObjectHolder)component).Object);
+			}
+
+			public override void SetValue(object component, object value)
+			{
+				base.SetValue(((ObjectHolder)component).Object, value);
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/PropertyDescriptorWrapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,62 @@
+using System;
+using System.ComponentModel;
+
+namespace BLToolkit.ComponentModel
+{
+	[System.Diagnostics.DebuggerStepThrough]
+	public abstract class PropertyDescriptorWrapper : PropertyDescriptor
+	{
+		protected PropertyDescriptorWrapper(PropertyDescriptor propertyDescriptor)
+			: base(propertyDescriptor)
+		{
+			if (propertyDescriptor == null) throw new ArgumentNullException("propertyDescriptor");
+
+			_pd = propertyDescriptor;
+		}
+
+		private readonly PropertyDescriptor _pd;
+
+		public override AttributeCollection Attributes      { get { return _pd.Attributes;     } }
+		public override string              Category        { get { return _pd.Category;       } }
+		public override Type                ComponentType   { get { return _pd.ComponentType;  } }
+		public override TypeConverter       Converter       { get { return _pd.Converter;      } }
+		public override string              Description     { get { return _pd.Description;    } }
+		public override bool                DesignTimeOnly  { get { return _pd.DesignTimeOnly; } }
+		public override string              DisplayName     { get { return _pd.DisplayName;    } }
+		public override bool                IsBrowsable     { get { return _pd.IsBrowsable;    } }
+		public override bool                IsLocalizable   { get { return _pd.IsLocalizable;  } }
+		public override bool                IsReadOnly      { get { return _pd.IsReadOnly;     } }
+		public override string              Name            { get { return _pd.Name;           } }
+		public override Type                PropertyType    { get { return _pd.PropertyType;   } }
+
+		public override bool   Equals       (object obj)          { return _pd.Equals(obj);                }
+		public override object GetEditor    (Type editorBaseType) { return _pd.GetEditor(editorBaseType);  }
+		public override int    GetHashCode  ()                    { return _pd.GetHashCode();              }
+		public override object GetValue     (object component)    { return _pd.GetValue(component);        }
+		public override string ToString     ()                    { return _pd.ToString();                 }
+		public override bool   CanResetValue(object component)    { return _pd.CanResetValue(component);   }
+
+		public override void ResetValue(object component)                { _pd.ResetValue(component);      }
+		public override void SetValue  (object component, object value)  { _pd.SetValue(component, value); }
+
+		public override void AddValueChanged(object component, EventHandler handler)
+		{
+			_pd.AddValueChanged(component, handler);
+		}
+
+		public override PropertyDescriptorCollection GetChildProperties(object instance, Attribute[] filter)
+		{
+			return _pd.GetChildProperties(instance, filter);
+		}
+
+		public override bool ShouldSerializeValue(object component)
+		{
+			return _pd.ShouldSerializeValue(component);
+		}
+
+		public override void RemoveValueChanged(object component, EventHandler handler)
+		{
+			_pd.RemoveValueChanged(component, handler);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/TypeDescriptorExtender.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,232 @@
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Reflection;
+
+using BLToolkit.Reflection;
+
+namespace BLToolkit.ComponentModel
+{
+	public abstract class TypeDescriptorExtender : ICustomTypeDescriptor, ITypeDescriptionProvider
+	{
+		#region Constructors
+
+		protected TypeDescriptorExtender(Type baseType)
+		{
+			if (baseType == null)
+				throw new ArgumentNullException("baseType");
+
+			_baseObject = TypeAccessor.CreateInstanceEx(baseType);
+		}
+
+		protected TypeDescriptorExtender(object baseObject)
+		{
+			if (baseObject == null)
+				throw new ArgumentNullException("baseObject");
+
+			_baseObject = baseObject;
+		}
+
+		#endregion
+
+		#region Public Members
+
+		private readonly object _baseObject;
+		public           object  BaseObject
+		{
+			get { return _baseObject; }
+		}
+
+		#endregion
+
+		#region Protected Members
+
+		private static readonly Hashtable _hashDescriptors = new Hashtable();
+
+		[NonSerialized]
+		private ICustomTypeDescriptor _typeDescriptor;
+		private ICustomTypeDescriptor  TypeDescriptor
+		{
+			get
+			{
+				if (_typeDescriptor == null)
+				{
+					Type key1 = GetType();
+					Type key2 = _baseObject.GetType();
+
+					Hashtable tbl = (Hashtable)_hashDescriptors[key1];
+
+					if (tbl == null)
+						_hashDescriptors[key1] = tbl = new Hashtable();
+
+					_typeDescriptor = (ICustomTypeDescriptor)tbl[key2];
+
+					if (_typeDescriptor == null)
+						tbl[key2] = _typeDescriptor = CreateTypeDescriptor();
+				}
+
+				return _typeDescriptor;
+			}
+		}
+
+		private ICustomTypeDescriptor CreateTypeDescriptor()
+		{
+			return new CustomTypeDescriptorImpl(this);
+		}
+
+		#endregion
+
+		#region ICustomTypeDescriptor Members
+
+		AttributeCollection ICustomTypeDescriptor.GetAttributes()
+		{
+			return TypeDescriptor.GetAttributes();
+		}
+
+		string ICustomTypeDescriptor.GetClassName()
+		{
+			return TypeDescriptor.GetClassName();
+		}
+
+		string ICustomTypeDescriptor.GetComponentName()
+		{
+			return TypeDescriptor.GetComponentName();
+		}
+
+		TypeConverter ICustomTypeDescriptor.GetConverter()
+		{
+			return TypeDescriptor.GetConverter();
+		}
+
+		EventDescriptor ICustomTypeDescriptor.GetDefaultEvent()
+		{
+			return TypeDescriptor.GetDefaultEvent();
+		}
+
+		PropertyDescriptor ICustomTypeDescriptor.GetDefaultProperty()
+		{
+			return TypeDescriptor.GetDefaultProperty();
+		}
+
+		object ICustomTypeDescriptor.GetEditor(Type editorBaseType)
+		{
+			return TypeDescriptor.GetEditor(editorBaseType);
+		}
+
+		EventDescriptorCollection ICustomTypeDescriptor.GetEvents(Attribute[] attributes)
+		{
+			return TypeDescriptor.GetEvents(attributes);
+		}
+
+		EventDescriptorCollection ICustomTypeDescriptor.GetEvents()
+		{
+			return TypeDescriptor.GetEvents();
+		}
+
+		PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes)
+		{
+			return TypeDescriptor.GetProperties(attributes);
+		}
+
+		PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties()
+		{
+			return TypeDescriptor.GetProperties();
+		}
+
+		object ICustomTypeDescriptor.GetPropertyOwner(PropertyDescriptor pd)
+		{
+			return TypeDescriptor.GetPropertyOwner(pd);
+		}
+
+		#endregion
+
+		#region ITypeDescriptionProvider Members
+
+		[NonSerialized]
+		private ICustomTypeDescriptor _baseTypeDescriptor;
+		private ICustomTypeDescriptor  BaseTypeDescriptor
+		{
+			get
+			{
+				if (_baseTypeDescriptor == null)
+				{
+					_baseTypeDescriptor = _baseObject as ICustomTypeDescriptor ??
+						new CustomTypeDescriptorImpl(_baseObject.GetType());
+				}
+
+				return _baseTypeDescriptor;
+			}
+		}
+
+		[NonSerialized]
+		private ITypeDescriptionProvider _provider;
+		private ITypeDescriptionProvider  Provider
+		{
+			get
+			{
+				if (_provider == null)
+					_provider = TypeAccessor.GetAccessor(GetType());
+
+				return _provider;
+			}
+		}
+
+		Type   ITypeDescriptionProvider.OriginalType  { get { return GetType();      } }
+		string ITypeDescriptionProvider.ClassName     { get { return GetType().Name; } }
+		string ITypeDescriptionProvider.ComponentName { get { return GetType().Name; } }
+
+		EventDescriptor ITypeDescriptionProvider.GetEvent(string name)
+		{
+			EventInfo ei = GetType().GetEvent(name);
+
+			return ei != null ? Provider.GetEvent(name) : BaseTypeDescriptor.GetEvents()[name];
+		}
+
+		PropertyDescriptor ITypeDescriptionProvider.GetProperty(string name)
+		{
+			PropertyDescriptor pd = Provider.GetProperty(name);
+
+			return pd ?? BaseTypeDescriptor.GetProperties()[name];
+		}
+
+		AttributeCollection ITypeDescriptionProvider.GetAttributes()
+		{
+			AttributeCollection col1 = Provider.GetAttributes();
+			AttributeCollection col2 = BaseTypeDescriptor.GetAttributes();
+
+			Attribute[] attrs = new Attribute[col1.Count + col2.Count];
+
+			for (int i = 0; i < col1.Count; i++)
+				attrs[i] = col1[i];
+
+			for (int i = 0; i < col2.Count; i++)
+				attrs[col1.Count + i] = col2[i];
+
+			return new AttributeCollection(attrs);
+		}
+
+		EventDescriptorCollection ITypeDescriptionProvider.GetEvents()
+		{
+			EventDescriptorCollection col1 = Provider.GetEvents();
+			EventDescriptorCollection col2 = BaseTypeDescriptor.GetEvents();
+
+			EventDescriptorCollection col  = new EventDescriptorCollection(new EventDescriptor[0]);
+
+			foreach (EventDescriptor ed in col1)
+				col.Add(ed);
+
+			foreach (EventDescriptor ed in col2)
+				if (col.Find(ed.Name, false) == null)
+					col.Add(ed);
+
+			return col;
+		}
+
+		PropertyDescriptorCollection ITypeDescriptionProvider.GetProperties()
+		{
+			throw new Exception("The method or operation is not implemented.");
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/TypeDescriptorExtenderT.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,22 @@
+using System;
+
+namespace BLToolkit.ComponentModel
+{
+	public abstract class TypeDescriptorExtender<T> : TypeDescriptorExtender
+	{
+		protected TypeDescriptorExtender()
+			: base(typeof(T))
+		{
+		}
+
+		protected TypeDescriptorExtender(T t)
+			: base(t)
+		{
+		}
+
+		public new T BaseObject
+		{
+			get { return (T)base.BaseObject; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/TypeTypeConverter.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,139 @@
+using System;
+using System.ComponentModel;
+using System.Globalization;
+using System.ComponentModel.Design;
+
+namespace BLToolkit.ComponentModel
+{
+	/// <summary>
+	/// Converts the value of an object into a <see cref="System.Type"/>.
+	/// </summary>
+	public class TypeTypeConverter: TypeConverter
+	{
+		// Human readable text for 'nothing selected'.
+		//
+		private const string NoType = "(none)";
+
+		/// <summary>
+		/// Returns whether this converter can convert an object of the given type to
+		/// a <see cref="System.Type"/>, using the specified context.
+		/// </summary>
+		/// <param name="context">An <see cref="System.ComponentModel.ITypeDescriptorContext"/>
+		/// that provides a format context. </param>
+		/// <param name="sourceType">A <see cref="System.Type"/> that represents the type
+		/// you want to convert from. </param>
+		/// <returns>
+		/// <see langword="true"/> if this converter can perform the conversion;
+		/// otherwise, <see langword="false"/>.
+		/// </returns>
+		public override bool CanConvertFrom(
+			ITypeDescriptorContext context,
+			Type                   sourceType)
+		{
+			return sourceType == typeof(string) ||
+				base.CanConvertFrom(context, sourceType);
+		}
+
+		/// <summary>
+		/// Converts the given object to the corresponding <see cref="System.Type"/>,
+		/// using the specified context and culture information.
+		/// </summary>
+		/// <param name="culture">The <see cref="System.Globalization.CultureInfo"/> to
+		/// use as the current culture. </param>
+		/// <param name="context">An 
+		/// <see cref="System.ComponentModel.ITypeDescriptorContext"/> that provides a
+		/// format context. </param>
+		/// <param name="value">The <see cref="System.Object"/> to convert. </param>
+		/// <returns>
+		/// An <see cref="System.Object"/> that represents the converted value.
+		/// </returns>
+		/// <exception cref="System.NotSupportedException">The conversion cannot be
+		/// performed. </exception>
+		public override object ConvertFrom(
+			ITypeDescriptorContext context,
+			CultureInfo            culture,
+			object                 value)
+		{
+			if (value == null)
+				return null;
+
+			if (!(value is string))
+				return base.ConvertFrom(context, culture, value);
+
+			string str = (string)value;
+
+			if (str.Length == 0 || str == NoType)
+				return null;
+
+			// Try VisualStudio own service first.
+			//
+			ITypeResolutionService typeResolver =
+				(ITypeResolutionService)context.GetService(typeof(ITypeResolutionService));
+
+			if (typeResolver != null)
+			{
+				Type type = typeResolver.GetType(str);
+
+				if (type != null)
+					return type;
+			}
+
+			return Type.GetType(str);
+		}
+
+		/// <summary>
+		/// Returns whether this converter can convert the object to the specified type,
+		/// using the specified context.
+		/// </summary>
+		/// <param name="context">An 
+		/// <see cref="System.ComponentModel.ITypeDescriptorContext"/> that provides
+		/// a format context. </param>
+		/// <param name="destinationType">A <see cref="System.Type"/> that represents
+		/// the type you want to convert to. </param>
+		/// <returns>
+		/// <see langword="true"/> if this converter can perform the conversion;
+		/// otherwise, <see langword="false"/>.
+		/// </returns>
+		public override bool CanConvertTo(
+			ITypeDescriptorContext context,
+			Type                   destinationType)
+		{
+			return destinationType == typeof(string) ||
+				base.CanConvertTo(context, destinationType);
+		}
+
+		/// <summary>
+		/// Converts the given value object to the specified type, using the specified
+		/// context and culture information.
+		/// </summary>
+		/// <param name="culture">A <see cref="System.Globalization.CultureInfo"/>.
+		/// If null is passed, the current culture is assumed. </param>
+		/// <param name="context">An 
+		/// <see cref="System.ComponentModel.ITypeDescriptorContext"/> that provides
+		/// a format context. </param>
+		/// <param name="destinationType">The <see cref="System.Type"/> to convert
+		/// the value parameter to. </param>
+		/// <param name="value">The <see cref="System.Object"/> to convert. </param>
+		/// <returns>
+		/// An <see cref="System.Object"/> that represents the converted value.
+		/// </returns>
+		/// <exception cref="System.NotSupportedException">The conversion cannot be
+		/// performed. </exception>
+		/// <exception cref="System.ArgumentNullException">
+		/// The <paramref name="destinationType"/> parameter is null. </exception>
+		public override object ConvertTo(
+			ITypeDescriptorContext context,
+			CultureInfo            culture,
+			object                 value,
+			Type                   destinationType)
+		{
+			if (destinationType != typeof(string))
+				return base.ConvertTo(context, culture, value, destinationType);
+
+			if (value == null || value.ToString().Length == 0)
+				return NoType;
+
+			return value.ToString();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ComponentModel/TypedListImpl.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,143 @@
+using System;
+using System.ComponentModel;
+
+using BLToolkit.Reflection;
+
+namespace BLToolkit.ComponentModel
+{
+	public class TypedListImpl : ITypedList
+	{
+		public TypedListImpl(Type itemType)
+		{
+			if (itemType == null) throw new ArgumentNullException("itemType");
+
+			_itemType     = itemType;
+			_typeAccessor = TypeAccessor.GetAccessor(itemType);
+		}
+
+		private readonly Type         _itemType;
+		private readonly TypeAccessor _typeAccessor;
+
+		private NullValueProvider _getNullValue;
+		public  NullValueProvider  GetNullValue
+		{
+			get
+			{
+				if (_getNullValue == null)
+					_getNullValue = TypeAccessor.GetNullValue;
+
+				return _getNullValue;
+			}
+
+			set { _getNullValue = value; }
+		}
+
+		#region ITypedList Members
+
+		private PropertyDescriptorCollection _pdc;
+
+		public PropertyDescriptorCollection GetItemProperties(PropertyDescriptor[] listAccessors)
+		{
+			return GetItemProperties(listAccessors, null, null, true);
+		}
+
+		public PropertyDescriptorCollection GetItemProperties(
+			PropertyDescriptor[] listAccessors,
+			Type                 objectViewType,
+			IsNullHandler        isNull,
+			bool                 cache)
+		{
+			PropertyDescriptorCollection pdc = null;
+
+			if (listAccessors == null || listAccessors.Length == 0)
+			{
+				if (_pdc == null)
+				{
+					_pdc = _typeAccessor != null?
+						_typeAccessor.CreateExtendedPropertyDescriptors(objectViewType, isNull):
+						new PropertyDescriptorCollection(null);
+				}
+
+				pdc = _pdc;
+
+				if (!cache)
+					_pdc = null;
+			}
+			else
+			{
+				try
+				{
+					// Lets try to pick out the item type from the list type.
+					//
+					Type itemType = TypeHelper.GetListItemType(
+						listAccessors[listAccessors.Length - 1].PropertyType);
+
+					if (itemType == typeof(object))
+					{
+						TypeAccessor parentAccessor = _typeAccessor;
+
+						foreach (PropertyDescriptor pd in listAccessors)
+						{
+							// We have to create an instance of the list to determine its item type
+							//
+
+							// Create an instance of the parent.
+							//
+							object parentObject = parentAccessor.CreateInstanceEx();
+
+							// Create an instance of the list.
+							//
+							object listObject   = pd.GetValue(parentObject);
+
+							if (listObject == null)
+							{
+								// We failed. Item type can not be determined.
+								//
+								itemType = null;
+
+								break;
+							}
+
+							itemType = TypeHelper.GetListItemType(listObject);
+
+							// Still bad.
+							//
+							if (itemType == typeof(object))
+								break;
+
+							parentAccessor = TypeAccessor.GetAccessor(itemType);
+						}
+					}
+
+					if (itemType != null && itemType != typeof(object))
+					{
+						TypeAccessor ta = TypeAccessor.GetAccessor(itemType);
+
+						pdc = ta.CreateExtendedPropertyDescriptors(null, isNull);
+					}
+				}
+				catch
+				{
+				}
+
+				if (pdc == null)
+					pdc = new PropertyDescriptorCollection(null);
+			}
+
+			return pdc;
+		}
+
+		public string GetListName(PropertyDescriptor[] listAccessors)
+		{
+			string name = _itemType.Name;
+
+			if (listAccessors != null)
+				foreach (PropertyDescriptor pd in listAccessors)
+					name += "_" + pd.Name;
+
+			return name;
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Configuration/BLToolkitSection.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,68 @@
+using System;
+using System.Configuration;
+using System.Security;
+
+namespace BLToolkit.Configuration
+{
+	/// <summary>
+	/// Implementation of custom configuration section.
+	/// </summary>
+	internal class BLToolkitSection : ConfigurationSection
+	{
+		private const string SectionName = "bltoolkit";
+		private static readonly ConfigurationPropertyCollection _properties =
+			new ConfigurationPropertyCollection();
+
+		private static readonly ConfigurationProperty           _propDataProviders = 
+			new ConfigurationProperty("dataProviders",           typeof(DataProviderElementCollection),
+			new DataProviderElementCollection(),                 ConfigurationPropertyOptions.None);
+		private static readonly ConfigurationProperty           _propDefaultConfiguration =
+			new ConfigurationProperty("defaultConfiguration",    typeof(string),
+			null,                                                ConfigurationPropertyOptions.None);
+		private static readonly ConfigurationProperty           _propTypeFactory =
+			new ConfigurationProperty("typeFactory",             typeof(TypeFactoryElement),
+			null,                                                ConfigurationPropertyOptions.None);
+
+		static BLToolkitSection()
+		{
+			_properties.Add(_propDataProviders);
+			_properties.Add(_propDefaultConfiguration);
+			_properties.Add(_propTypeFactory);
+		}
+
+		public static BLToolkitSection Instance
+		{
+			get
+			{
+				try
+				{
+					return (BLToolkitSection)ConfigurationManager.GetSection(SectionName);
+				}
+				catch (SecurityException)
+				{
+					return null;
+				}
+			}
+		}
+
+		protected override ConfigurationPropertyCollection Properties
+		{
+			get { return _properties; }
+		}
+
+		public DataProviderElementCollection DataProviders
+		{
+			get { return (DataProviderElementCollection) base[_propDataProviders]; }
+		}
+
+		public string DefaultConfiguration
+		{
+			get { return (string)base[_propDefaultConfiguration]; }
+		}
+
+		public TypeFactoryElement TypeFactory
+		{
+			get { return (TypeFactoryElement)base[_propTypeFactory]; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Configuration/DataProviderElement.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,46 @@
+using System;
+using System.Configuration;
+
+using BLToolkit.Data.DataProvider;
+
+namespace BLToolkit.Configuration
+{
+	internal class DataProviderElement : ElementBase
+	{
+		protected static readonly ConfigurationProperty _propTypeName   = new ConfigurationProperty("type",    typeof(string), string.Empty, ConfigurationPropertyOptions.IsRequired);
+		protected static readonly ConfigurationProperty _propName       = new ConfigurationProperty("name",    typeof(string), string.Empty, ConfigurationPropertyOptions.None);
+		protected static readonly ConfigurationProperty _propDefault    = new ConfigurationProperty("default", typeof(bool),   false,        ConfigurationPropertyOptions.None);
+
+		public DataProviderElement()
+		{
+			_properties.Add(_propTypeName);
+			_properties.Add(_propName);
+			_properties.Add(_propDefault);
+		}
+
+		/// <summary>
+		/// Gets or sets an assembly qualified type name of this data provider.
+		/// </summary>
+		public string TypeName
+		{
+			get { return (string)base[_propTypeName]; }
+		}
+
+		/// <summary>
+		/// Gets or sets a name of this data provider.
+		/// If not set, <see cref="DataProviderBase.Name"/> is used.
+		/// </summary>
+		public string Name
+		{
+			get { return (string)base[_propName]; }
+		}
+
+		/// <summary>
+		/// Gets a value indicating whether the provider is default.
+		/// </summary>
+		public bool Default
+		{
+			get { return (bool)base[_propDefault]; }
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Configuration/DataProviderElementCollection.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,17 @@
+using System;
+using System.Configuration;
+
+namespace BLToolkit.Configuration
+{
+	[ConfigurationCollection(typeof(DataProviderElement))]
+	internal class DataProviderElementCollection : ElementCollectionBase<DataProviderElement>
+	{
+		protected override object GetElementKey(DataProviderElement element)
+		{
+			// element.Name is optional and may be omitted.
+			// element.TypeName is required, but is not unique.
+			//
+			return string.Concat(element.Name, "/", element.TypeName);
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Configuration/ElementBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Specialized;
+using System.Configuration;
+
+namespace BLToolkit.Configuration
+{
+	internal abstract class ElementBase : ConfigurationElement
+	{
+		protected ConfigurationPropertyCollection _properties = new ConfigurationPropertyCollection();
+
+		protected override ConfigurationPropertyCollection Properties
+		{
+			get { return _properties; }
+		}
+
+		/// <summary>
+		/// Gets a value indicating whether an unknown attribute is encountered during deserialization.
+		/// </summary>
+		/// <returns>
+		/// True when an unknown attribute is encountered while deserializing.
+		/// </returns>
+		/// <param name="name">The name of the unrecognized attribute.</param>
+		/// <param name="value">The value of the unrecognized attribute.</param>
+		protected override bool OnDeserializeUnrecognizedAttribute(string name, string value)
+		{
+			ConfigurationProperty property = new ConfigurationProperty(name, typeof(string), value);
+			_properties.Add(property);
+			base[property] = value;
+			Attributes.Add(name, value);
+			return true;
+		}
+
+		private NameValueCollection _attributes;
+		public  NameValueCollection  Attributes
+		{
+			get { return _attributes ?? (_attributes = new NameValueCollection(StringComparer.OrdinalIgnoreCase));}
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Configuration/ElementCollectionBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,31 @@
+using System;
+using System.Configuration;
+
+namespace BLToolkit.Configuration
+{
+	internal abstract class ElementCollectionBase<T>: ConfigurationElementCollection
+		where T : ConfigurationElement, new()
+	{
+		protected override ConfigurationElement CreateNewElement()
+		{
+			return new T();
+		}
+
+		protected abstract object GetElementKey(T element);
+
+		protected override sealed object GetElementKey(ConfigurationElement element)
+		{
+			return GetElementKey((T)element);
+		}
+
+		public new T this[string name]
+		{
+			get { return (T)BaseGet(name); }
+		}
+
+		public  T this[int index]
+		{
+			get { return (T)BaseGet(index); }
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Configuration/TypeFactoryElement.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,93 @@
+using System;
+using System.Configuration;
+
+using BLToolkit.TypeBuilder;
+
+namespace BLToolkit.Configuration
+{
+	internal class TypeFactoryElement : ElementBase
+	{
+		protected static readonly ConfigurationProperty _propSaveTypes =
+			new ConfigurationProperty("saveTypes",    typeof(bool),    false, ConfigurationPropertyOptions.None);
+		protected static readonly ConfigurationProperty _propSealTypes =
+			new ConfigurationProperty("sealTypes",    typeof(bool),    true,  ConfigurationPropertyOptions.None);
+		protected static readonly ConfigurationProperty _propLoadTypes =
+			new ConfigurationProperty("loadTypes",    typeof(bool),    false, ConfigurationPropertyOptions.None);
+		protected static readonly ConfigurationProperty _propAssemblyPath =
+			new ConfigurationProperty("assemblyPath", typeof(string),  null,  ConfigurationPropertyOptions.None);
+		protected static readonly ConfigurationProperty _propVersion =
+			new ConfigurationProperty("version",      typeof(string),  null,  ConfigurationPropertyOptions.None);
+		protected static readonly ConfigurationProperty _propKeyFile =
+			new ConfigurationProperty("keyFile",      typeof(string),  null,  ConfigurationPropertyOptions.None);
+
+		public TypeFactoryElement()
+		{
+			_properties.Add(_propSaveTypes);
+			_properties.Add(_propSealTypes);
+			_properties.Add(_propLoadTypes);
+			_properties.Add(_propAssemblyPath);
+			_properties.Add(_propVersion);
+			_properties.Add(_propKeyFile);
+		}
+
+		/// <summary>
+		/// Gets a value indicating whether the <see cref="TypeFactory"/>
+		/// will save generated assemblies to the disk. Default is <see langword="false"/>.
+		/// </summary>
+		public bool SaveTypes
+		{
+			get { return (bool) base[_propSaveTypes]; }
+		}
+
+		/// <summary>
+		/// Gets a value indicating whether the <see cref="TypeFactory"/>
+		/// will seal generated types. Default is <see langword="true"/>.
+		/// </summary>
+		public bool SealTypes
+		{
+			get { return (bool) base[_propSealTypes]; }
+		}
+
+		/// <summary>
+		/// Gets a value indicating whether the <see cref="TypeFactory"/>
+		/// will load types generated by BLTGen tool. Default is <see langword="false"/>.
+		/// </summary>
+		public bool LoadTypes
+		{
+			get { return (bool) base[_propLoadTypes]; }
+		}
+
+		/// <summary>
+		/// Gets a path to the global assembly. Default is <see langword="null"/>.
+		/// </summary>
+		/// <seealso cref="TypeFactory.SetGlobalAssembly(string)"/>
+		public string AssemblyPath
+		{
+			get { return (string) base[_propAssemblyPath]; }
+		}
+
+		/// <summary>
+		/// Gets the version of global assembly. Default is <see langword="null"/>.
+		/// </summary>
+		/// <seealso cref="TypeFactory.SetGlobalAssembly(string,System.Version,string)"/>
+		public Version Version
+		{
+			get
+			{
+				string strVersion = (string)base[_propVersion];
+
+				return string.IsNullOrEmpty(strVersion)? null:
+					new Version(strVersion);
+			}
+		}
+
+		/// <summary>
+		/// Gets a path to the key file to sign global assembly. Default is <see langword="null"/>.
+		/// </summary>
+		/// <seealso cref="TypeFactory.SetGlobalAssembly(string,System.Version,string)"/>
+		public string KeyFile
+		{
+			get { return (string) base[_propKeyFile]; }
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataException.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,135 @@
+using System;
+using System.Runtime.Serialization;
+
+using BLToolkit.Data.DataProvider;
+
+namespace BLToolkit.Data
+{
+	/// <summary>
+	/// Defines the base class for the namespace exceptions.
+	/// </summary>
+	/// <remarks>
+	/// This class is the base class for exceptions that may occur during
+	/// execution of the namespace members.
+	/// </remarks>
+	[Serializable] 
+	public class DataException : System.Data.DataException
+	{
+		/// <summary>
+		/// Initializes a new instance of the <see cref="DataException"/> class.
+		/// </summary>
+		/// <remarks>
+		/// This constructor initializes the <see cref="Exception.Message"/>
+		/// property of the new instance
+		/// to a system-supplied message that describes the error,
+		/// such as "BLToolkit Data error has occurred."
+		/// </remarks>
+		public DataException()
+			: base("A BLToolkit Data error has occurred.")
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="DataException"/> class
+		/// with the specified error message.
+		/// </summary>
+		/// <param name="message">The message to display to the client when the
+		/// exception is thrown.</param>
+		/// <seealso cref="Exception.Message"/>
+		public DataException(string message)
+			: base(message) 
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="DataException"/> class
+		/// with the specified error message and InnerException property.
+		/// </summary>
+		/// <param name="message">The message to display to the client when the
+		/// exception is thrown.</param>
+		/// <param name="innerException">The InnerException, if any, that threw
+		/// the current exception.</param>
+		/// <seealso cref="Exception.Message"/>
+		/// <seealso cref="Exception.InnerException"/>
+		public DataException(string message, Exception innerException)
+			: base(message, innerException)
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="DataException"/> class
+		/// with the InnerException property.
+		/// </summary>
+		/// <param name="innerException">The InnerException, if any, that threw
+		/// the current exception.</param>
+		/// <seealso cref="Exception.InnerException"/>
+		public DataException(Exception innerException)
+			: base(innerException.Message, innerException)
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="DataException"/> class
+		/// with serialized data.
+		/// </summary>
+		/// <param name="info">The object that holds the serialized object data.</param>
+		/// <param name="context">The contextual information about the source or
+		/// destination.</param>
+		/// <remarks>This constructor is called during deserialization to
+		/// reconstitute the exception object transmitted over a stream.</remarks>
+		protected DataException(SerializationInfo info, StreamingContext context)
+			: base(info, context)
+		{
+		}
+
+		#region Internal
+
+		private readonly DbManager _dbManager;
+
+		static string GetMessage(DbManager dbManager, Exception innerException)
+		{
+			var obj = dbManager.DataProvider.Convert(
+				innerException, ConvertType.ExceptionToErrorMessage);
+
+			return obj is Exception ? ((Exception)obj).Message : obj.ToString();
+		}
+
+		internal DataException(DbManager dbManager, Exception innerException)
+			: this(GetMessage(dbManager, innerException), innerException)
+		{
+			_dbManager = dbManager;
+		}
+
+		#endregion
+
+		#region Public Properties
+
+		/// <summary>
+		/// Gets a number that identifies the type of error.
+		/// </summary>
+		public int? Number
+		{
+			get
+			{
+				var innerException = InnerException as DataException;
+				if (innerException != null)
+					return innerException.Number;
+				if (_dbManager == null) return null;
+				return _dbManager.DataProvider.Convert(InnerException, ConvertType.ExceptionToErrorNumber) as int?;
+			}
+		}
+
+		public DataExceptionType DataExceptionType
+		{
+			get
+			{
+				if (_dbManager == null || Number == null) 
+					return DataExceptionType.Undefined;
+				return _dbManager.DataProvider.ConvertErrorNumberToDataExceptionType(Number.Value);
+			}
+		}
+
+		#endregion
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataExceptionType.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,14 @@
+using System;
+
+namespace BLToolkit.Data
+{
+	public enum DataExceptionType
+	{
+		Undefined,
+		Deadlock,
+		Timeout,
+		ForeignKeyViolation,
+		UniqueIndexViolation,
+		ConstraintViolation,
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/AccessDataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,298 @@
+using System;
+using System.Data;
+using System.Data.OleDb;
+using System.Text.RegularExpressions;
+
+namespace BLToolkit.Data.DataProvider
+{
+	using Mapping;
+	using Sql.SqlProvider;
+
+	public class AccessDataProvider : OleDbDataProvider
+	{
+		private static Regex _paramsExp;
+
+		// Based on idea from http://qapi.blogspot.com/2006/12/deriveparameters-oledbprovider-ii.html
+		//
+		public override bool DeriveParameters(IDbCommand command)
+		{
+			if (command == null)
+				throw new ArgumentNullException("command");
+
+			if (command.CommandType != CommandType.StoredProcedure)
+				throw new InvalidOperationException("command.CommandType must be CommandType.StoredProcedure");
+
+			var conn = command.Connection as OleDbConnection;
+
+			if (conn == null || conn.State != ConnectionState.Open)
+				throw new InvalidOperationException("Invalid connection state.");
+
+			command.Parameters.Clear();
+
+			var dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Procedures, new object[]{null, null, command.CommandText});
+
+			if (dt.Rows.Count == 0)
+			{
+				// Jet does convert parameretless procedures to views.
+				//
+				dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Views, new object[]{null, null, command.CommandText});
+
+				if (dt.Rows.Count == 0)
+					throw new DataException(string.Format("Stored procedure '{0}' not found", command.CommandText));
+
+				// Do nothing. There is no parameters.
+				//
+			}
+			else
+			{
+				var col = dt.Columns["PROCEDURE_DEFINITION"];
+
+				if (col == null)
+				{
+					// Not really possible
+					//
+					return false;
+				}
+
+				if (_paramsExp == null)
+					_paramsExp = new Regex(@"PARAMETERS ((\[(?<name>[^\]]+)\]|(?<name>[^\s]+))\s(?<type>[^,;\s]+(\s\([^\)]+\))?)[,;]\s)*", RegexOptions.Compiled | RegexOptions.ExplicitCapture);
+
+				var match = _paramsExp.Match((string)dt.Rows[0][col.Ordinal]);
+				var names = match.Groups["name"].Captures;
+				var types = match.Groups["type"].Captures;
+
+				if (names.Count != types.Count)
+				{
+					// Not really possible
+					//
+					return false;
+				}
+
+				var separators = new[] {' ', '(', ',', ')'};
+
+				for (var i = 0; i < names.Count; ++i)
+				{
+					var paramName = names[i].Value;
+					var rawType   = types[i].Value.Split(separators, StringSplitOptions.RemoveEmptyEntries);
+					var p         = new OleDbParameter(paramName, GetOleDbType(rawType[0]));
+
+					if (rawType.Length > 2)
+					{
+						p.Precision = Common.Convert.ToByte(rawType[1]);
+						p.Scale     = Common.Convert.ToByte(rawType[2]);
+					}
+					else if (rawType.Length > 1)
+					{
+						p.Size      = Common.Convert.ToInt32(rawType[1]);
+					}
+
+					command.Parameters.Add(p);
+				}
+			}
+
+			return true;
+		}
+
+		private static OleDbType GetOleDbType(string jetType)
+		{
+			switch (jetType.ToLower())
+			{
+				case "byte":
+				case "tinyint":
+				case "integer1":
+					return OleDbType.TinyInt;
+
+				case "short":
+				case "smallint":
+				case "integer2":
+					return OleDbType.SmallInt;
+
+				case "int":
+				case "integer":
+				case "long":
+				case "integer4":
+				case "counter":
+				case "identity":
+				case "autoincrement":
+					return OleDbType.Integer;
+
+				case "single":
+				case "real":
+				case "float4":
+				case "ieeesingle":
+					return OleDbType.Single;
+
+
+				case "double":
+				case "number":
+				case "double precision":
+				case "float":
+				case "float8":
+				case "ieeedouble":
+					return OleDbType.Double;
+
+				case "currency":
+				case "money":
+					return OleDbType.Currency;
+
+				case "dec":
+				case "decimal":
+				case "numeric":
+					return OleDbType.Decimal;
+
+				case "bit":
+				case "yesno":
+				case "logical":
+				case "logical1":
+					return OleDbType.Boolean;
+
+				case "datetime":
+				case "date":
+				case "time":
+					return OleDbType.Date;
+
+				case "alphanumeric":
+				case "char":
+				case "character":
+				case "character varying":
+				case "national char":
+				case "national char varying":
+				case "national character":
+				case "national character varying":
+				case "nchar":
+				case "string":
+				case "text":
+				case "varchar":
+					return OleDbType.VarWChar;
+
+				case "longchar":
+				case "longtext":
+				case "memo":
+				case "note":
+				case "ntext":
+					return OleDbType.LongVarWChar;
+
+				case "binary":
+				case "varbinary":
+				case "binary varying":
+				case "bit varying":
+					return OleDbType.VarBinary;
+
+				case "longbinary":
+				case "image":
+				case "general":
+				case "oleobject":
+					return OleDbType.LongVarBinary;
+
+				case "guid":
+				case "uniqueidentifier":
+					return OleDbType.Guid;
+
+				default:
+					// Each release of Jet brings many new aliases to existing types.
+					// This list may be outdated, please send a report to us.
+					//
+					throw new NotSupportedException("Unknown DB type '" + jetType + "'");
+			}
+		}
+
+		public override void AttachParameter(IDbCommand command, IDbDataParameter parameter)
+		{
+			// Do some magic to workaround 'Data type mismatch in criteria expression' error
+			// in JET for some european locales.
+			//
+			if (parameter.Value is DateTime)
+			{
+				// OleDbType.DBTimeStamp is locale aware, OleDbType.Date is locale neutral.
+				//
+				((OleDbParameter)parameter).OleDbType = OleDbType.Date;
+			}
+			else if (parameter.Value is decimal)
+			{
+				// OleDbType.Decimal is locale aware, OleDbType.Currency is locale neutral.
+				//
+				((OleDbParameter)parameter).OleDbType = OleDbType.Currency;
+			}
+
+			base.AttachParameter(command, parameter);
+		}
+
+		public new const string NameString = DataProvider.ProviderName.Access;
+
+		public override string Name
+		{
+			get { return NameString; }
+		}
+
+		public override int MaxBatchSize
+		{
+			get { return 0; }
+		}
+
+		public override ISqlProvider CreateSqlProvider()
+		{
+			return new AccessSqlProvider();
+		}
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			switch (convertType)
+			{
+				case ConvertType.ExceptionToErrorNumber:
+					if (value is OleDbException)
+					{
+						var ex = (OleDbException)value;
+						if (ex.Errors.Count > 0)
+							return ex.Errors[0].NativeError;
+					}
+
+					break;
+			}
+
+			return SqlProvider.Convert(value, convertType);
+		}
+
+		#region DataReaderEx
+
+		public override IDataReader GetDataReader(MappingSchema schema, IDataReader dataReader)
+		{
+			return dataReader is OleDbDataReader?
+				new DataReaderEx((OleDbDataReader)dataReader):
+				base.GetDataReader(schema, dataReader);
+		}
+
+		class DataReaderEx : DataReaderBase<OleDbDataReader>, IDataReader
+		{
+			public DataReaderEx(OleDbDataReader rd): base(rd)
+			{
+			}
+
+			public new object GetValue(int i)
+			{
+				var value = DataReader.GetValue(i);
+
+				if (value is DateTime)
+				{
+					var dt = (DateTime)value;
+
+					if (dt.Year == 1899 && dt.Month == 12 && dt.Day == 30)
+						return new DateTime(1, 1, 1, dt.Hour, dt.Minute, dt.Second, dt.Millisecond);
+				}
+
+				return value;
+			}
+
+			public new DateTime GetDateTime(int i)
+			{
+				var dt = DataReader.GetDateTime(i);
+
+				if (dt.Year == 1899 && dt.Month == 12 && dt.Day == 30)
+					return new DateTime(1, 1, 1, dt.Hour, dt.Minute, dt.Second, dt.Millisecond);
+
+				return dt;
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/ConvertType.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,129 @@
+using System;
+
+namespace BLToolkit.Data.DataProvider
+{
+	public enum ConvertType
+	{
+		/// <summary>
+		/// Provided name should be converted to query parameter name.
+		/// For example:
+		///     firstName -> @firstName
+		/// for the following query:
+		///     SELECT * FROM Person WHERE FirstName = @firstName
+		///                                            ^ here
+		/// </summary>
+		NameToQueryParameter,
+
+		/// <summary>
+		/// Provided name should be converted to command parameter name.
+		/// For example:
+		///     firstName -> @firstName
+		/// for the following query:
+		///     db.Parameter("@firstName") = "John";
+		///                   ^ here
+		/// </summary>
+		NameToCommandParameter,
+
+		[Obsolete("Use NameToCommandParameter or NameToSprocParameter instead.")]
+		NameToParameter = NameToCommandParameter,
+
+		/// <summary>
+		/// Provided name should be converted to stored procedure parameter name.
+		/// For example:
+		///     firstName -> @firstName
+		/// for the following query:
+		///     db.Parameter("@firstName") = "John";
+		///                   ^ here
+		/// </summary>
+		NameToSprocParameter,
+
+		/// <summary>
+		/// Provided name should be converted to query field name.
+		/// For example:
+		///     FirstName -> [FirstName]
+		/// for the following query:
+		///     SELECT [FirstName] FROM Person WHERE ID = 1
+		///            ^   and   ^
+		/// </summary>
+		NameToQueryField,
+
+		/// <summary>
+		/// Provided name should be converted to query field alias.
+		/// For example:
+		///     ID -> "ID"
+		/// for the following query:
+		///     SELECT "ID" as "ID" FROM Person WHERE "ID" = 1
+		///                    ^  ^ here
+		/// </summary>
+		NameToQueryFieldAlias,
+
+		/// <summary>
+		/// Provided name should be converted to query database.
+		/// For example:
+		///     MyDatabase -> [MyDatabase]
+		/// for the following query:
+		///     SELECT * FROM [MyDatabase]..[Person]
+		///                   ^ and      ^
+		/// </summary>
+		NameToDatabase,
+
+		/// <summary>
+		/// Provided name should be converted to query database.
+		/// For example:
+		///     dbo -> [dbo]
+		/// for the following query:
+		///     SELECT * FROM [ dbo ].[Person]
+		///                   ^ and ^
+		/// </summary>
+		NameToOwner,
+
+		/// <summary>
+		/// Provided name should be converted to query table name.
+		/// For example:
+		///     Person -> [Person]
+		/// for the following query:
+		///     SELECT * FROM [Person]
+		///                   ^ and  ^
+		/// </summary>
+		NameToQueryTable,
+
+		/// <summary>
+		/// Provided name should be converted to query table alias.
+		/// For example:
+		///     table1 -> [table1]
+		/// for the following query:
+		///     SELECT * FROM [Person] [table1]
+		///                            ^ and  ^
+		/// </summary>
+		NameToQueryTableAlias,
+
+		/// <summary>
+		/// Provided stored procedure parameter name should be converted to name.
+		/// For example:
+		///     @firstName -> firstName
+		/// for the following query:
+		///     db.Parameter("@firstName") = "John";
+		///                   ^ '@' has to be removed
+		/// </summary>
+		SprocParameterToName,
+
+		[Obsolete("Use SprocParameterToName instead.")]
+		ParameterToName = SprocParameterToName,
+
+		/// <summary>
+		/// Gets error number from a native exception.
+		/// For example:
+		///     SqlException -> SqlException.Number,
+		///   OleDbException -> OleDbException.Errors[0].NativeError
+		/// </summary>
+		ExceptionToErrorNumber,
+
+		/// <summary>
+		/// Gets error message from a native exception.
+		/// For example:
+		///     SqlException -> SqlException.Message,
+		///   OleDbException -> OleDbException.Errors[0].Message
+		/// </summary>
+		ExceptionToErrorMessage,
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/DB2DataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,86 @@
+using System;
+using System.Data;
+using System.Data.Common;
+
+using IBM.Data.DB2;
+
+namespace BLToolkit.Data.DataProvider
+{
+	using Sql.SqlProvider;
+
+	public class DB2DataProvider :  DataProviderBase
+	{
+		public override IDbConnection CreateConnectionObject () { return new DB2Connection (); }
+		public override DbDataAdapter CreateDataAdapterObject() { return new DB2DataAdapter(); }
+		public override ISqlProvider  CreateSqlProvider      () { return new DB2SqlProvider(); }
+
+		public override Type   ConnectionType { get { return typeof(DB2Connection);         } }
+		public override string Name           { get { return DataProvider.ProviderName.DB2; } }
+
+		public override bool DeriveParameters(IDbCommand command)
+		{
+			if (command is DB2Command)
+			{
+				DB2CommandBuilder.DeriveParameters((DB2Command)command);
+				return true;
+			}
+
+			return false;
+		}
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			switch (convertType)
+			{
+				case ConvertType.ExceptionToErrorNumber:
+					if (value is DB2Exception)
+					{
+						var ex = (DB2Exception)value;
+
+						foreach (DB2Error error in ex.Errors)
+							return error.RowNumber;
+
+						return 0;
+					}
+
+					break;
+				 
+			}
+
+			return SqlProvider.Convert(value, convertType);
+		}
+
+		public override void PrepareCommand(ref CommandType commandType, ref string commandText, ref IDbDataParameter[] commandParameters)
+		{
+			base.PrepareCommand(ref commandType, ref commandText, ref commandParameters);
+
+			if (commandParameters != null) foreach (var p in commandParameters)
+			{
+				if (p.Value is bool)
+					p.Value = (bool)p.Value ? 1 : 0;
+				else if (p.Value is Guid)
+				{
+					p.Value  = ((Guid)p.Value).ToByteArray();
+					p.DbType = DbType.Binary;
+					p.Size   = 16;
+				}
+			}
+		}
+
+		/*
+		public override int ExecuteArray(IDbCommand command, int iterations)
+		{
+			var cmd = (DB2Command)command;
+			try
+			{
+				cmd.ArrayBindCount = iterations;
+				return cmd.ExecuteNonQuery();
+			}
+			finally
+			{
+				cmd.ArrayBindCount = 0;
+			}
+		}
+		*/
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/DataProviderBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,513 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.Common;
+using System.Data.Linq;
+using System.Linq;
+
+namespace BLToolkit.Data.DataProvider
+{
+	using Common;
+	using Mapping;
+	using Sql.SqlProvider;
+
+	/// <summary>
+	/// The <b>DataProviderBase</b> is a class that provides specific data provider information
+	/// for the <see cref="DbManager"/> class. 
+	/// </summary>
+	/// <remarks>
+	/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+	/// </remarks>
+	/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+	public abstract partial class DataProviderBase : IMappingSchemaProvider
+	{
+		#region Abstract Properties
+
+		/// <summary>
+		/// Returns an actual type of the connection object used by this instance of the <see cref="DbManager"/>.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <value>An instance of the <see cref="Type"/> class.</value>
+		public abstract Type ConnectionType { get; }
+
+		/// <summary>
+		/// Returns the data manager name.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <value>The data manager name.</value>
+		public abstract string Name { get; }
+
+		private  string _uniqueName;
+		/// <summary>
+		/// Same as <see cref="Name"/>, but may be overridden to add two or more providers of same type.
+		/// </summary>
+		public string  UniqueName
+		{
+			get { return _uniqueName ?? Name; }
+			internal set { _uniqueName = value; }
+		}
+
+		#endregion
+
+		#region Abstract Methods
+
+		/// <summary>
+		/// Creates a new instance of the <see cref="IDbConnection"/>.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <returns>The <see cref="IDbConnection"/> object.</returns>
+		public abstract IDbConnection CreateConnectionObject();
+
+		/// <summary>
+		/// Creates a new connection object with same connection string.
+		/// </summary>
+		/// <param name="connection">A connection object used as prototype.</param>
+		/// <returns>New connection instance.</returns>
+		public virtual IDbConnection CloneConnection(IDbConnection connection)
+		{
+			if (connection == null)
+				throw new ArgumentNullException("connection");
+
+			var cloneable = connection as ICloneable;
+
+			if (cloneable != null)
+				return (IDbConnection)cloneable.Clone();
+
+			var newConnection = CreateConnectionObject();
+
+			// This is definitelly not enought when PersistSecurityInfo set to false.
+			//
+			newConnection.ConnectionString = connection.ConnectionString;
+
+			return newConnection;
+		}
+
+		/// <summary>
+		/// Creates an instance of the <see cref="DbDataAdapter"/>.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <returns>The <see cref="DbDataAdapter"/> object.</returns>
+		public abstract DbDataAdapter CreateDataAdapterObject();
+
+		/// <summary>
+		/// Populates the specified <see cref="IDbCommand"/> object's Parameters collection with 
+		/// parameter information for the stored procedure specified in the <see cref="IDbCommand"/>.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <param name="command">The <see cref="IDbCommand"/> referencing the stored procedure 
+		/// for which the parameter information is to be derived.
+		/// The derived parameters will be populated into the Parameters of this command.</param>
+		/// <returns>true - parameters can be derive.</returns>
+		public abstract bool DeriveParameters(IDbCommand command);
+
+		#endregion
+
+		#region Factory methods
+
+		public virtual IDbCommand CreateCommandObject(IDbConnection connection)
+		{
+			return connection.CreateCommand();
+		}
+
+		public virtual IDbDataParameter CreateParameterObject(IDbCommand command)
+		{
+			return command.CreateParameter();
+		}
+
+		#endregion
+
+		#region IDbDataParameter methods
+
+		public virtual IDbDataParameter GetParameter(
+			IDbCommand           command,
+			NameOrIndexParameter nameOrIndex)
+		{
+			return (IDbDataParameter)(nameOrIndex.ByName ?
+				command.Parameters[nameOrIndex.Name] : command.Parameters[nameOrIndex.Index]);
+		}
+
+		public virtual void AttachParameter(
+			IDbCommand       command,
+			IDbDataParameter parameter)
+		{
+			command.Parameters.Add(parameter);
+		}
+
+		public virtual void SetUserDefinedType(IDbDataParameter parameter, string typeName)
+		{
+			throw new NotSupportedException(Name + " data provider does not support UDT.");
+		}
+
+		public virtual bool IsValueParameter(IDbDataParameter parameter)
+		{
+			return parameter.Direction != ParameterDirection.ReturnValue;
+		}
+
+		public virtual IDbDataParameter CloneParameter(IDbDataParameter parameter)
+		{
+			return (IDbDataParameter)((ICloneable)parameter).Clone();
+		}
+
+		public virtual bool InitParameter(IDbDataParameter parameter)
+		{
+			return false;
+		}
+
+		#endregion
+
+		#region Virtual Members
+
+		/// <summary>
+		/// Open an <see cref="IDataReader"/> into the given RefCursor object
+		/// </summary>
+		/// <param name="refCursor">The refcursor to open an <see cref="IDataReader"/> to</param>
+		/// <returns>The <see cref="IDataReader"/> into the refcursor</returns>
+		public virtual IDataReader GetRefCursorDataReader(object refCursor)
+		{
+			throw new NotSupportedException("Operation not supported on this DataProvider");
+		}
+
+		public virtual object Convert(object value, ConvertType convertType)
+		{
+			return SqlProvider.Convert(value, convertType);
+		}
+
+		public virtual DataExceptionType ConvertErrorNumberToDataExceptionType(int number)
+		{
+			return DataExceptionType.Undefined;
+		}
+
+		public virtual void InitDbManager(DbManager dbManager)
+		{
+			var schema = MappingSchema;
+
+			if (schema != null)
+				dbManager.MappingSchema = schema;
+		}
+
+		/// <summary>
+		/// One time initialization from a configuration file.
+		/// </summary>
+		/// <param name="attributes">Provider specific attributes.</param>
+		public virtual void Configure(System.Collections.Specialized.NameValueCollection attributes)
+		{
+		}
+
+		public virtual MappingSchema MappingSchema { get; set; }
+
+		public virtual void PrepareCommand(ref CommandType commandType, ref string commandText, ref IDbDataParameter[] commandParameters)
+		{
+			/*
+			if (commandParameters != null) foreach (var p in commandParameters)
+			{
+				if (p.Value is System.Data.Linq.Binary)
+				{
+					var arr = ((System.Data.Linq.Binary)p.Value).ToArray();
+
+					p.Value  = arr;
+					p.DbType = DbType.Binary;
+					p.Size   = arr.Length;
+				}
+			}
+			*/
+		}
+
+		public virtual bool CanReuseCommand(IDbCommand command, CommandType newCommandType)
+		{
+			return true;
+		}
+
+		public virtual int ExecuteArray(IDbCommand command, int iterations)
+		{
+			// save parameter values
+			var parameters = command.Parameters
+				.OfType<IDbDataParameter>()
+				.Select(param => new
+				{
+					Parameter = param,
+					Value = param.Value as Array
+				})
+				.ToArray();
+
+			var outParameters = parameters
+				.Where(p =>
+					p.Parameter.Direction == ParameterDirection.InputOutput ||
+					p.Parameter.Direction == ParameterDirection.Output)
+				.ToArray();
+
+			// validate parameter values
+			foreach (var p in parameters)
+			{
+				if (p.Value == null)
+				{
+					throw new InvalidOperationException("ExecuteArray requires that all " +
+						"parameter values are arrays. Parameter name: " + p.Parameter.ParameterName);
+				}
+
+				if (p.Value.GetLength(0) != iterations)
+				{
+					throw new InvalidOperationException("ExecuteArray requires that array sizes are " +
+						"equal to the number of iterations. Parameter name: " + p.Parameter.ParameterName);
+				}
+			}
+
+			try
+			{
+				// run iterations
+				int rowsAffected = 0;
+				for (int iteration = 0; iteration < iterations; iteration++)
+				{
+					// copy input parameter values
+					foreach (var param in parameters)
+					{
+						SetParameterValue(param.Parameter, param.Value.GetValue(iteration));
+					}
+
+					rowsAffected += command.ExecuteNonQuery();
+
+					// return output parameter values
+					foreach (var param in outParameters)
+					{
+						var outputValue = param.Parameter.Value;
+						param.Value.SetValue(outputValue, iteration);
+					}
+				}
+
+				return rowsAffected;
+			}
+			finally
+			{
+				// restore parameter values
+				foreach (var param in parameters)
+				{
+					param.Parameter.Value = param.Value;
+				}
+			}
+		}
+
+        public virtual string GetSequenceQuery(string sequenceName)
+        {
+            return null;
+        }
+
+        public virtual string NextSequenceQuery(string sequenceName)
+        {
+            return null;
+        }
+
+        public virtual string GetReturningInto(string columnName)
+        {
+            return null;
+        }
+
+		public virtual void SetParameterValue(IDbDataParameter parameter, object value)
+		{
+			if (value is System.Data.Linq.Binary)
+			{
+				var arr = ((System.Data.Linq.Binary)value).ToArray();
+
+				parameter.Value  = arr;
+				parameter.DbType = DbType.Binary;
+				parameter.Size   = arr.Length;
+			}
+			else
+				parameter.Value = value;
+		}
+
+		public abstract ISqlProvider CreateSqlProvider();
+
+		private   ISqlProvider _sqlProvider;
+		protected ISqlProvider  SqlProvider
+		{
+			get { return _sqlProvider ?? (_sqlProvider = CreateSqlProvider()); }
+		}
+
+		public virtual IDataReader GetDataReader(MappingSchema schema, IDataReader dataReader)
+		{
+			return dataReader;
+		}
+
+        public virtual IDataReader GetDataReader(IDbCommand command, CommandBehavior commandBehavior)
+        {
+            return command.ExecuteReader(commandBehavior);
+        }
+
+		public virtual bool ParameterNamesEqual(string paramName1, string paramName2)
+		{
+			// default implementation is case-insensitive, because if we make it 
+			// case-sensitive and don't overload it in all existing providers - client code may break
+			return string.Equals(paramName1, paramName2, StringComparison.OrdinalIgnoreCase);
+		}
+
+		public virtual DbType GetDbType(Type systemType)
+		{
+			if (systemType == typeof(Binary) || systemType == typeof(byte[]))
+				return DbType.Binary;
+
+			return DbType.Object;
+		}
+
+		public virtual bool IsMarsEnabled(IDbConnection conn)
+		{
+			return false;
+		}
+
+		public virtual string ProviderName  { get { return ConnectionType.Namespace; } }
+		public virtual int    MaxParameters { get { return 100;   } }
+		public virtual int    MaxBatchSize  { get { return 65536; } }
+		public virtual string EndOfSql      { get { return ";";   } }
+
+		#endregion
+
+		#region DataReaderEx
+
+		protected class DataReaderBase<T> : IDataReader
+			where T: IDataReader
+		{
+			public readonly T DataReader;
+
+			protected DataReaderBase(T rd)
+			{
+				DataReader = rd;
+			}
+
+			#region Implementation of IDisposable
+
+			public void Dispose()
+			{
+				DataReader.Dispose();
+			}
+
+			#endregion
+
+			#region Implementation of IDataRecord
+
+			public string              GetName        (int i)           { return DataReader.GetName        (i); }
+			public string              GetDataTypeName(int i)           { return DataReader.GetDataTypeName(i); }
+			public Type                GetFieldType   (int i)           { return DataReader.GetFieldType   (i); }
+            // GetValue method is virtual since it can be overridden by some data provider 
+            // (For instance, OdbDataProvider uses special methodes for clob data fetching)
+			public virtual object      GetValue       (int i)           { return DataReader.GetValue       (i); }
+			public int                 GetValues      (object[] values) { return DataReader.GetValues      (values); }
+			public int                 GetOrdinal     (string   name)   { return DataReader.GetOrdinal     (name);   }
+			public bool                GetBoolean     (int i)           { return DataReader.GetBoolean     (i); }
+			public byte                GetByte        (int i)           { return DataReader.GetByte        (i); }
+			public char                GetChar        (int i)           { return DataReader.GetChar        (i); }
+			public Guid                GetGuid        (int i)           { return DataReader.GetGuid        (i); }
+			public short               GetInt16       (int i)           { return DataReader.GetInt16       (i); }
+			public int                 GetInt32       (int i)           { return DataReader.GetInt32       (i); }
+			public long                GetInt64       (int i)           { return DataReader.GetInt64       (i); }
+			public float               GetFloat       (int i)           { return DataReader.GetFloat       (i); }
+			public double              GetDouble      (int i)           { return DataReader.GetDouble      (i); }
+			public string              GetString      (int i)           { return DataReader.GetString      (i); }
+			public decimal             GetDecimal     (int i)           { return DataReader.GetDecimal     (i); }
+			public DateTime            GetDateTime    (int i)           { return DataReader.GetDateTime    (i); }
+			public IDataReader         GetData        (int i)           { return DataReader.GetData        (i); }
+			public bool                IsDBNull       (int i)           { return DataReader.IsDBNull       (i); }
+
+			public int FieldCount { get { return DataReader.FieldCount; } }
+
+			object IDataRecord.this[int i]       { get { return DataReader[i];    } }
+			object IDataRecord.this[string name] { get { return DataReader[name]; } }
+
+			public long GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length)
+			{
+				return DataReader.GetBytes(i, fieldOffset, buffer, bufferoffset, length);
+			}
+
+			public long GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length)
+			{
+				return DataReader.GetChars(i, fieldoffset, buffer, bufferoffset, length);
+			}
+
+			#endregion
+
+			#region Implementation of IDataReader
+
+			public void      Close         () {        DataReader.Close         (); }
+			public DataTable GetSchemaTable() { return DataReader.GetSchemaTable(); }
+			public bool      NextResult    () { return DataReader.NextResult    (); }
+			public bool      Read          () { return DataReader.Read          (); }
+			public int       Depth           { get { return DataReader.Depth;           } }
+			public bool      IsClosed        { get { return DataReader.IsClosed;        } }
+			public int       RecordsAffected { get { return DataReader.RecordsAffected; } }
+
+			#endregion
+		}
+
+		protected abstract class DataReaderEx<T> : DataReaderBase<T>, IDataReaderEx
+			where T: IDataReader
+		{
+			protected DataReaderEx(T rd) : base(rd)
+			{
+			}
+
+			#region Implementation of IDataReaderEx
+
+			public abstract DateTimeOffset GetDateTimeOffset(int i);
+
+			#endregion
+		}
+
+		#endregion
+
+		#region InsertBatch
+
+		public virtual int InsertBatchWithIdentity<T>(
+			DbManager db,
+			string insertText,
+			IEnumerable<T> collection,
+			MemberMapper[] members,
+			int maxBatchSize,
+			DbManager.ParameterProvider<T> getParameters)
+		{
+			throw new NotImplementedException("Insert batch with identity is not implemented!");
+		}
+
+		public virtual int InsertBatch<T>(
+			DbManager      db,
+			string         insertText,
+			IEnumerable<T> collection,
+			MemberMapper[] members,
+			int            maxBatchSize,
+			DbManager.ParameterProvider<T> getParameters)
+		{
+			db.SetCommand(insertText);
+			return db.ExecuteForEach(collection, members, maxBatchSize, getParameters);
+		}
+
+		#endregion
+
+		protected int ExecuteSqlList(DbManager db, IEnumerable<string> sqlList)
+		{
+			var cnt = 0;
+
+			foreach (string sql in sqlList)
+			{
+				cnt += db.SetCommand(sql).ExecuteNonQuery();
+			}
+
+			return cnt;
+		}
+
+		public virtual DbType GetParameterDbType(DbType dbType)
+		{
+			return dbType;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/DataProviderInterpreterBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,51 @@
+using System.Collections.Generic;
+using System.Data;
+using BLToolkit.Mapping;
+
+namespace BLToolkit.Data.DataProvider
+{
+    /// <summary>
+    /// BasicSqlProvider equivalent for the non-linq DAL
+    /// </summary>
+    public abstract class DataProviderInterpreterBase
+    {
+        public virtual void SetParameterValue(IDbDataParameter parameter, object value)
+        {
+            if (value is System.Data.Linq.Binary)
+            {
+                var arr = ((System.Data.Linq.Binary)value).ToArray();
+
+                parameter.Value = arr;
+                parameter.DbType = DbType.Binary;
+                parameter.Size = arr.Length;
+            }
+            else
+                parameter.Value = value;
+        }
+
+        public virtual List<string> GetInsertBatchSqlList<T>(
+            string              insertText, 
+            IEnumerable<T>      collection, 
+            MemberMapper[]      members, 
+            int                 maxBatchSize, 
+            bool                withIdentity)
+        {
+            return new List<string>();
+        }
+
+        public virtual string GetSequenceQuery(string sequenceName)
+        {
+            return null;
+        }
+
+        public virtual string NextSequenceQuery(string sequenceName)
+        {
+            return null;
+        }
+
+        public virtual string GetReturningInto(string columnName)
+        {
+            return null;
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/FdpDataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,326 @@
+/***
+
+ * FdpDataProvider
+needed FirebirdClient http://sourceforge.net/project/showfiles.php?group_id=9028&package_id=62107
+tested with FirebirdClient 2.1.0 Beta 3
+
+Known troubles:
+1) Some tests fails due to Fb SQL-syntax specific
+2) ResultSet mapping doesn't work - not supported by client
+3) UnitTests.CS.DataAccess.OutRefTest tests: Test2 && TestNullable2 doesnt work:
+	parameters directions should be provided correctly to functions run, that's why
+	output parameterd would be mapped to Entity e, so asserts should be same a in Test1.
+
+"Features"
+1) Type conversation due to http://www.firebirdsql.org/manual/migration-mssql-data-types.html
+	BUT! for Binary types BLOB is used! not CHAR!
+2) InOut parameters faking: InOut parameters are not suppotred by Fb, but they could be
+	emulated: each InOut parameter should be defined in RETURNS() section, and allso has a mirror 
+	in parameter section with name [prefix][inOutParameterName], see OutRefTest SP. Faking settings:
+	FdpDataProvider.InOutInputParameterPrefix = "in_";
+	FdpDataProvider.IsInOutParameterEmulation = true;
+3) Returned values faking. Each parameter with "magic name" woul be treated as ReturnValue.
+	see Scalar_ReturnParameter SP. Faking settings:
+	FdpDataProvider.ReturnParameterName = "RETURN_VALUE";
+	FdpDataProvider.IsReturnValueEmulation = true;
+
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Collections.Specialized;
+using System.Data;
+using System.Data.Common;
+using System.Linq;
+
+using BLToolkit.Data.Sql.SqlProvider;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+
+using FirebirdSql.Data.FirebirdClient;
+
+namespace BLToolkit.Data.DataProvider
+{
+	public class FdpDataProvider : DataProviderBase
+	{
+		public FdpDataProvider()
+		{
+			MappingSchema = new FbMappingSchema();
+		}
+
+		#region InOut & ReturnValue emulation
+		public static string InOutInputParameterPrefix = "in_";
+		public static string ReturnParameterName = "RETURN_VALUE";
+
+		public static bool IsReturnValueEmulation = true;
+		public static bool IsInOutParameterEmulation = true;
+
+		public static bool QuoteIdentifiers
+		{
+			get { return FirebirdSqlProvider.QuoteIdentifiers; }
+			set { FirebirdSqlProvider.QuoteIdentifiers = value; }
+		}
+		#endregion
+
+		#region Overloads
+		public override Type ConnectionType
+		{
+			get { return typeof (FbConnection); }
+		}
+
+		public override string Name
+		{
+			get { return DataProvider.ProviderName.Firebird; }
+		}
+
+		public override int MaxBatchSize
+		{
+			get { return 0; }
+		}
+
+		public override IDbConnection CreateConnectionObject()
+		{
+			return new FbConnection();
+		}
+
+		public override DbDataAdapter CreateDataAdapterObject()
+		{
+			return new FbDataAdapter();
+		}
+
+		public override bool DeriveParameters(IDbCommand command)
+		{
+			if (command is FbCommand)
+			{
+				FbCommandBuilder.DeriveParameters((FbCommand) command);
+
+				if (IsReturnValueEmulation)
+					foreach (IDbDataParameter par in command.Parameters)
+						if (IsReturnValue(par))
+							par.Direction = ParameterDirection.ReturnValue;
+
+				return true;
+			}
+
+			return false;
+		}
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			switch (convertType)
+			{
+				case ConvertType.ExceptionToErrorNumber:
+					if (value is FbException)
+					{
+						var ex = (FbException) value;
+						if (ex.Errors.Count > 0)
+							foreach (FbError error in ex.Errors)
+								return error.Number;
+					}
+
+					break;
+			}
+
+			return SqlProvider.Convert(value, convertType);
+		}
+
+		public override ISqlProvider CreateSqlProvider()
+		{
+			return new FirebirdSqlProvider();
+		}
+
+		public override bool IsValueParameter(IDbDataParameter parameter)
+		{
+			return parameter.Direction != ParameterDirection.ReturnValue
+			       && parameter.Direction != ParameterDirection.Output;
+		}
+
+		private string GetInputParameterName(string ioParameterName)
+		{
+			return (string) Convert(
+				InOutInputParameterPrefix + (string) Convert(ioParameterName, ConvertType.SprocParameterToName),
+				ConvertType.NameToSprocParameter);
+		}
+
+		private static IDbDataParameter GetParameter(string parameterName, IEnumerable<IDbDataParameter> commandParameters)
+		{
+			return commandParameters.FirstOrDefault(par => string.Compare(parameterName, par.ParameterName, true) == 0);
+		}
+
+		private bool IsReturnValue(IDbDataParameter parameter)
+		{
+			if (string.Compare(parameter.ParameterName,
+			                   (string) Convert(ReturnParameterName, ConvertType.NameToSprocParameter), true) == 0
+				)
+				return true;
+
+			return false;
+		}
+
+		public override void PrepareCommand(ref CommandType commandType, ref string commandText,
+		                                    ref IDbDataParameter[] commandParameters)
+		{
+			if (commandParameters != null)
+				foreach (var par in commandParameters)
+				{
+					if (par.Value is bool)
+					{
+						var value = (bool) par.Value ? "1" : "0";
+
+						par.DbType = DbType.AnsiString;
+						par.Value = value;
+						par.Size = value.Length;
+					}
+					else if (par.Value is Guid)
+					{
+						var value = par.Value.ToString();
+
+						par.DbType = DbType.AnsiStringFixedLength;
+						par.Value = value;
+						par.Size = value.Length;
+					}
+
+					#region "smart" input-output parameter detection
+					if (commandType == CommandType.StoredProcedure && IsInOutParameterEmulation)
+					{
+						var iParameterName = GetInputParameterName(par.ParameterName);
+						var fakeIOParameter = GetParameter(iParameterName, commandParameters);
+
+						if (fakeIOParameter != null)
+						{
+							fakeIOParameter.Value = par.Value;
+
+							// direction should be output, or parameter mistmath for procedure exception
+							// would be thrown
+							par.Direction = ParameterDirection.Output;
+
+							// direction should be Input
+							fakeIOParameter.Direction = ParameterDirection.Input;
+						}
+					}
+					#endregion
+				}
+
+			base.PrepareCommand(ref commandType, ref commandText, ref commandParameters);
+		}
+
+		public override bool InitParameter(IDbDataParameter parameter)
+		{
+			if (parameter.Value is bool)
+			{
+				var value = (bool) parameter.Value ? "1" : "0";
+
+				parameter.DbType = DbType.AnsiString;
+				parameter.Value = value;
+				parameter.Size = value.Length;
+			}
+			else if (parameter.Value is Guid)
+			{
+				var value = parameter.Value.ToString();
+
+				parameter.DbType = DbType.AnsiStringFixedLength;
+				parameter.Value = value;
+				parameter.Size = value.Length;
+			}
+
+			return base.InitParameter(parameter);
+		}
+
+		public override void Configure(NameValueCollection attributes)
+		{
+			var inOutInputParameterPrefix = attributes["InOutInputParameterPrefix"];
+			if (inOutInputParameterPrefix != null)
+				InOutInputParameterPrefix = inOutInputParameterPrefix;
+
+			var returnParameterName = attributes["ReturnParameterName"];
+			if (returnParameterName != null)
+				ReturnParameterName = returnParameterName;
+
+			var isReturnValueEmulation = attributes["IsReturnValueEmulation"];
+			if (isReturnValueEmulation != null)
+				IsReturnValueEmulation = Common.Convert.ToBoolean(isReturnValueEmulation);
+
+			var isInOutParameterEmulation = attributes["IsInOutParameterEmulation"];
+			if (isInOutParameterEmulation != null)
+				IsInOutParameterEmulation = Common.Convert.ToBoolean(isInOutParameterEmulation);
+
+			var quoteIdentifiers = attributes["QuoteIdentifiers"];
+			if (quoteIdentifiers != null)
+				QuoteIdentifiers = Common.Convert.ToBoolean(quoteIdentifiers);
+
+			base.Configure(attributes);
+		}
+		#endregion
+
+		#region FbDataReaderEx
+		public override IDataReader GetDataReader(MappingSchema schema, IDataReader dataReader)
+		{
+			return
+				dataReader is FbDataReader
+					? new FbDataReaderEx((FbDataReader) dataReader)
+					: base.GetDataReader(schema, dataReader);
+		}
+
+		private class FbDataReaderEx : DataReaderBase<FbDataReader>, IDataReader
+		{
+			public FbDataReaderEx(FbDataReader rd) : base(rd)
+			{
+			}
+
+			#region IDataReader Members
+			public new object GetValue(int i)
+			{
+				var value = DataReader.GetValue(i);
+
+				if (value is DateTime)
+				{
+					var dt = (DateTime) value;
+
+					if (dt.Year == 1970 && dt.Month == 1 && dt.Day == 1)
+						return new DateTime(1, 1, 1, dt.Hour, dt.Minute, dt.Second, dt.Millisecond);
+				}
+
+				return value;
+			}
+
+			public new DateTime GetDateTime(int i)
+			{
+				var dt = DataReader.GetDateTime(i);
+
+				if (dt.Year == 1970 && dt.Month == 1 && dt.Day == 1)
+					return new DateTime(1, 1, 1, dt.Hour, dt.Minute, dt.Second, dt.Millisecond);
+
+				return dt;
+			}
+			#endregion
+		}
+		#endregion
+
+		#region FbMappingSchema
+		public class FbMappingSchema : FirebirdMappingSchema
+		{
+			protected override object MapInternal(InitContext initContext)
+			{
+				var dr = initContext.SourceObject as FbDataReader;
+
+				// Fb's SP returns single row with nulls if selected object doesn't exists
+				// so for all DBNull's (null) should be returned, instead of object instance
+				//
+				if (dr != null)
+				{
+					var i = dr.FieldCount;
+					while (--i >= 0)
+						if (!dr.IsDBNull(i))
+							break;
+
+					// All field are DBNull.
+					//
+					if (i < 0)
+						return null;
+				}
+				return base.MapInternal(initContext);
+			}
+		}
+		#endregion
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/FirebirdMappingSchema.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,98 @@
+using System;
+
+namespace BLToolkit.Data.DataProvider
+{
+	using Mapping;
+
+	public class FirebirdMappingSchema : MappingSchema
+	{
+		public byte[] ConvertToByteArray(string value)
+		{
+			return System.Text.Encoding.UTF8.GetBytes(value);
+		}
+
+		public override byte[] ConvertToByteArray(object value)
+		{
+			if (value is string)
+				return ConvertToByteArray((string)value);
+
+			return base.ConvertToByteArray(value);
+		}
+
+		public bool ConvertToBoolean(string value)
+		{
+			if (value.Length == 1)
+				switch (value[0])
+				{
+					case '1': case 'T' :case 'Y' : case 't': case 'y': return true;
+					case '0': case 'F' :case 'N' : case 'f': case 'n': return false;
+				}
+
+			return Common.Convert.ToBoolean(value);
+		}
+
+		public override bool ConvertToBoolean(object value)
+		{
+			if (value is string)
+				return ConvertToBoolean((string)value);
+
+			return base.ConvertToBoolean(value);
+		}
+
+		public System.IO.Stream ConvertToStream(string value)
+		{
+			return new System.IO.MemoryStream(ConvertToByteArray(value));
+		}
+
+		public override System.IO.Stream ConvertToStream(object value)
+		{
+			if (value is string)
+				return ConvertToStream((string)value);
+
+			return base.ConvertToStream(value);
+		}
+
+#if !SILVERLIGHT
+
+		public System.Data.SqlTypes.SqlBinary ConvertToSqlBinary(string value)
+		{
+			return Common.Convert.ToSqlBinary(ConvertToByteArray(value));
+		}
+
+		public override System.Data.SqlTypes.SqlBinary ConvertToSqlBinary(object value)
+		{
+			if (value is string)
+				return ConvertToSqlBinary((string)value);
+			return base.ConvertToSqlBinary(value);
+		}
+
+		public System.Data.SqlTypes.SqlBytes ConvertToSqlBytes(string value)
+		{
+			return Common.Convert.ToSqlBytes(ConvertToByteArray(value));
+		}
+
+		public override System.Data.SqlTypes.SqlBytes ConvertToSqlBytes(object value)
+		{
+			if (value is string)
+				return ConvertToSqlBytes((string)value);
+
+			return base.ConvertToSqlBytes(value);
+		}
+
+		public override System.Data.SqlTypes.SqlGuid ConvertToSqlGuid(object value)
+		{
+			if (value is string)
+				return new System.Data.SqlTypes.SqlGuid(new Guid((string)value));
+			return base.ConvertToSqlGuid(value);
+		}
+
+#endif
+
+		public override bool? ConvertToNullableBoolean(object value)
+		{
+			if (value is string)
+				return ConvertToBoolean((string)value);
+			return base.ConvertToNullableBoolean(value);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/GenericDataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,179 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.Common;
+using System.Transactions;
+using BLToolkit.Data.DataProvider.Interpreters;
+using BLToolkit.Data.Sql.SqlProvider;
+
+namespace BLToolkit.Data.DataProvider
+{
+    /// <summary>
+    /// Creates an instance of a db provider for a specified provider name.
+    /// </summary>
+    public sealed class GenericDataProvider : DataProviderBase
+	{
+        private readonly string _providerName;
+        private readonly DbProviderFactory _factory;
+        private readonly DataProviderInterpreterBase _dataProviderInterpreter;
+
+        public GenericDataProvider(string providerName)
+        {
+            _providerName = providerName;
+            using (new TransactionScope())
+            {
+                _factory = DbProviderFactories.GetFactory(providerName);
+            }
+            
+            switch (Name)
+            {
+                case ProviderFullName.Oracle:
+                case ProviderFullName.OracleNet:
+                    _dataProviderInterpreter = new OracleDataProviderInterpreter();
+                    break;
+                case ProviderFullName.SQLite:
+                    _dataProviderInterpreter = new SqliteDataProviderInterpreter();
+                    break;                    
+                default:
+                    throw new Exception(string.Format("The sql provider {0} isnt supported in the DataProviderInterpreterBase", Name));
+            }
+        }
+
+        #region Overrides of DataProviderBase
+
+        public override Type ConnectionType
+        {
+            get
+            {
+                var dbConnection = _factory.CreateConnection();
+                if (dbConnection != null) 
+                    return dbConnection.GetType();
+                return null;
+            }
+        }
+
+        public override string Name
+        {
+            get { return _providerName; }
+        }
+
+        public override IDbConnection CreateConnectionObject()
+        {
+            return _factory.CreateConnection();
+        }
+
+        public override DbDataAdapter CreateDataAdapterObject()
+        {
+            return _factory.CreateDataAdapter();
+        }
+
+        /// <summary>
+        /// Populates the specified IDbCommand object's Parameters collection with 
+        /// parameter information for the stored procedure specified in the IDbCommand.
+        /// </summary>
+        public override bool DeriveParameters(IDbCommand command)
+        {
+            return false;
+        }
+
+        public override ISqlProvider CreateSqlProvider()
+        {
+            switch (Name)
+            {
+                case ProviderFullName.OracleNet:
+                    return new OracleSqlProvider();
+                case ProviderFullName.SQLite:
+                    return new SQLiteSqlProvider();
+                case ProviderFullName.Oracle:
+                    return new OracleSqlProvider();
+                default:
+                    throw new Exception(string.Format("The sql provider {0} isnt supported in the GenericDataProvider", Name));
+            }
+        }
+
+        public override void SetParameterValue(IDbDataParameter parameter, object value)
+        {
+            _dataProviderInterpreter.SetParameterValue(parameter, value);
+        }
+
+        public override string GetSequenceQuery(string sequenceName)
+        {
+            return _dataProviderInterpreter.GetSequenceQuery(sequenceName);
+        }
+
+        public override string NextSequenceQuery(string sequenceName)
+        {
+            return _dataProviderInterpreter.NextSequenceQuery(sequenceName);
+        }
+
+        public override string GetReturningInto(string columnName)
+        {
+            return _dataProviderInterpreter.GetReturningInto(columnName);
+        }
+
+        public override object Convert(object value, ConvertType convertType)
+        {
+            if (Name == ProviderFullName.Oracle)
+            {
+                switch (convertType)
+                {
+                    case ConvertType.NameToQueryParameter:
+                        var qname = (string) value;
+
+                        //
+                        // Avoid "ORA-00972: identifier is too long" error
+                        // Cause error : You tried to reference a table, cluster, view, index, synonym, tablespace, or username with a value that was longer than 30 characters.
+                        // Resolution : Names for tables, clusters, views, indexes, synonyms, tablespaces, and usernames must be 30 characters or less. 
+                        // You must shorten the name to no more than 30 characters for these objects.
+                        //
+                        if (qname.Length > 30)
+                        {
+                            qname = qname.Substring(0, 30);
+                            return SqlProvider.Convert(qname, convertType);
+                        }
+                        return SqlProvider.Convert(value, convertType);
+                }
+            }
+
+            return base.Convert(value, convertType);
+        }
+
+        public override int InsertBatchWithIdentity<T>(
+            DbManager                       db, 
+            string                          insertText, 
+            IEnumerable<T>                  collection, 
+            Mapping.MemberMapper[]          members, 
+            int                             maxBatchSize, 
+            DbManager.ParameterProvider<T>  getParameters)
+        {
+            if (db.UseQueryText && Name == ProviderFullName.Oracle)
+            {
+                List<string> sqlList = _dataProviderInterpreter.GetInsertBatchSqlList(insertText, collection, members, maxBatchSize, true);
+                return ExecuteSqlList(db, sqlList);
+            }
+            return base.InsertBatchWithIdentity(db, insertText, collection, members, maxBatchSize, getParameters);
+        }
+
+        public override int InsertBatch<T>(
+            DbManager                       db, 
+            string                          insertText, 
+            IEnumerable<T>                  collection, 
+            Mapping.MemberMapper[]          members, 
+            int                             maxBatchSize, 
+            DbManager.ParameterProvider<T>  getParameters)
+        {
+            if (Name == ProviderFullName.Oracle)
+            {
+                if (db.UseQueryText)
+                {
+                    List<string> sqlList = _dataProviderInterpreter.GetInsertBatchSqlList(insertText, collection, members, maxBatchSize, false);
+                    return ExecuteSqlList(db, sqlList);
+                }
+                throw new NotSupportedException("Set UseQueryText = true on the current generic data provider!");                
+            }
+            return base.InsertBatch(db, insertText, collection, members, maxBatchSize, getParameters);
+        }
+
+        #endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/InformixDataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,159 @@
+using System;
+using System.Data;
+using System.Data.Common;
+using System.Globalization;
+using System.Threading;
+
+using IBM.Data.Informix;
+
+namespace BLToolkit.Data.DataProvider
+{
+	using Sql.SqlProvider;
+
+	public class InformixDataProvider :  DataProviderBase
+	{
+		public override IDbConnection CreateConnectionObject () { return new IfxConnection      (); }
+		public override DbDataAdapter CreateDataAdapterObject() { return new IfxDataAdapter     (); }
+		public override ISqlProvider  CreateSqlProvider      () { return new InformixSqlProvider(); }
+
+		public override Type   ConnectionType { get { return typeof(IfxConnection);              } }
+		public override string Name           { get { return DataProvider.ProviderName.Informix; } }
+
+		public override bool DeriveParameters(IDbCommand command)
+		{
+			if (command is IfxCommand)
+			{
+				IfxCommandBuilder.DeriveParameters((IfxCommand)command);
+				return true;
+			}
+
+			return false;
+		}
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			switch (convertType)
+			{
+				case ConvertType.ExceptionToErrorNumber:
+					if (value is IfxException)
+					{
+						var ex = (IfxException)value;
+
+						foreach (IfxError error in ex.Errors)
+							return error.NativeError;
+
+						return 0;
+					}
+
+					break;
+			}
+
+			return SqlProvider.Convert(value, convertType);
+		}
+
+		public override void PrepareCommand(ref CommandType commandType, ref string commandText, ref IDbDataParameter[] commandParameters)
+		{
+			base.PrepareCommand(ref commandType, ref commandText, ref commandParameters);
+
+			if (commandParameters != null) foreach (var p in commandParameters)
+			{
+				if (p.Value is Guid)
+				{
+					var value = p.Value.ToString();
+					p.DbType = DbType.AnsiStringFixedLength;
+					p.Value  = value;
+					p.Size   = value.Length;
+				}
+				else if (p.Value is bool)
+				{
+					p.Value = ((InformixSqlProvider)SqlProvider).ConvertBooleanValue((bool)p.Value);
+				}
+				//else if (p.DbType == DbType.Binary)
+				//{
+				//	var ip = (IfxParameter)p;
+
+				//	ip.IfxType = IfxType.Blob;
+				//}
+			}
+		}
+
+		/*
+		public override int ExecuteArray(IDbCommand command, int iterations)
+		{
+			var cmd = (IfxCommand)command;
+			try
+			{
+				cmd.ArrayBindCount = iterations;
+				return cmd.ExecuteNonQuery();
+			}
+			finally
+			{
+				cmd.ArrayBindCount = 0;
+			}
+		}
+		*/
+
+		#region GetDataReader
+
+		public override IDataReader GetDataReader(Mapping.MappingSchema schema, IDataReader dataReader)
+		{
+			return dataReader is IfxDataReader?
+				new InformixDataReaderEx((IfxDataReader)dataReader):
+				base.GetDataReader(schema, dataReader);
+		}
+
+		class InformixDataReaderEx : DataReaderBase<IfxDataReader>, IDataReader
+		{
+			public InformixDataReaderEx(IfxDataReader rd): base(rd)
+			{
+			}
+
+			public new float GetFloat(int i)
+			{
+				var current = Thread.CurrentThread.CurrentCulture;
+
+				if (Thread.CurrentThread.CurrentCulture != CultureInfo.InvariantCulture)
+					Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
+
+				var value = DataReader.GetFloat(i);
+
+				if (current != CultureInfo.InvariantCulture)
+					Thread.CurrentThread.CurrentCulture = current;
+
+				return value;
+			}
+
+			public new double GetDouble(int i)
+			{
+				var current = Thread.CurrentThread.CurrentCulture;
+
+				if (Thread.CurrentThread.CurrentCulture != CultureInfo.InvariantCulture)
+					Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
+
+				var value = DataReader.GetDouble(i);
+
+				if (current != CultureInfo.InvariantCulture)
+					Thread.CurrentThread.CurrentCulture = current;
+
+				return value;
+			}
+
+			public new decimal GetDecimal(int i)
+			{
+				var current = Thread.CurrentThread.CurrentCulture;
+
+				if (Thread.CurrentThread.CurrentCulture != CultureInfo.InvariantCulture)
+					Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
+
+				var value = DataReader.GetDecimal     (i);
+
+				if (current != CultureInfo.InvariantCulture)
+					Thread.CurrentThread.CurrentCulture = current;
+
+				return value;
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/Interpreters/OracleDataProviderInterpreter.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,203 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.Text;
+using BLToolkit.Data.Sql.SqlProvider;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace BLToolkit.Data.DataProvider.Interpreters
+{
+    public class OracleDataProviderInterpreter : DataProviderInterpreterBase
+    {
+        public override void SetParameterValue(IDbDataParameter parameter, object value)
+        {
+            if (value is TimeSpan)
+            {
+                parameter.Value = ((TimeSpan)value).ToString();
+            }
+            else
+                base.SetParameterValue(parameter, value);
+        }
+
+        public override List<string> GetInsertBatchSqlList<T>(
+            string          insertText,
+            IEnumerable<T>  collection,
+            MemberMapper[]  members,
+            int             maxBatchSize,
+            bool            withIdentity)
+        {
+            //return GetInsertBatchSqlListWithInsertAll(insertText, collection, members, maxBatchSize);
+            return GetInsertBatchSqlListUnionAll(insertText, collection, members, maxBatchSize, withIdentity);
+        }
+
+        private List<string> GetInsertBatchSqlListUnionAll<T>(
+            string              insertText,
+            IEnumerable<T>      collection,
+            MemberMapper[]      members,
+            int                 maxBatchSize,
+            bool                withIdentity)
+        {
+            var sp = new OracleSqlProvider();
+            var n = 0;
+            var sqlList = new List<string>();
+
+            var indexValuesWord = insertText.IndexOf(" VALUES (", StringComparison.Ordinal);
+            var initQuery = insertText.Substring(0, indexValuesWord) + Environment.NewLine;
+            var valuesQuery = insertText.Substring(indexValuesWord + 9);
+            var indexEndValuesQuery = valuesQuery.IndexOf(")");
+            valuesQuery = valuesQuery.Substring(0, indexEndValuesQuery)
+                            .Replace("\r", "")
+                            .Replace("\n", "")
+                            .Replace("\t", "");
+
+            // 1 = Number of primary keys generated by sequence
+            var valuesWihtoutSequence = withIdentity ? valuesQuery.Substring(valuesQuery.IndexOf(",") + 1) : valuesQuery;
+
+            var sb = new StringBuilder(initQuery);
+            sb.Append(" SELECT ");
+            sb.AppendFormat(valuesQuery, members.Select(m => m.Name).ToArray());
+            sb.AppendLine(" FROM (");
+
+            initQuery = sb.ToString();
+
+            sb = new StringBuilder(initQuery);
+            bool isFirstValues = true;
+
+            foreach (var item in collection)
+            {
+                if (!isFirstValues)
+                    sb.AppendLine(" UNION ALL ");
+
+                sb.Append("SELECT ");
+
+                var values = new List<object>();
+                foreach (var member in members)
+                {
+                    var sbItem = new StringBuilder();
+
+                    var value = member.GetValue(item);
+
+                    if (value is DateTime?)
+                        value = ((DateTime?)value).Value;
+
+                    sp.BuildValue(sbItem, value);
+
+                    values.Add(sbItem + " " + member.Name);
+                }
+
+                sb.AppendFormat(valuesWihtoutSequence, values.ToArray());
+                sb.Append(" FROM DUAL");
+
+                isFirstValues = false;
+
+                n++;
+                if (n > maxBatchSize)
+                {
+                    sb.Append(")");
+                    sqlList.Add(sb.ToString());
+                    sb = new StringBuilder(initQuery);
+                    isFirstValues = true;
+                    n = 0;
+                }
+            }
+
+            if (n > 0)
+            {
+                sb.Append(")");
+                sqlList.Add(sb.ToString());
+            }
+            return sqlList;
+        }
+
+        private List<string> GetInsertBatchSqlListWithInsertAll<T>(
+            string          insertText,
+            IEnumerable<T>  collection,
+            MemberMapper[]  members,
+            int             maxBatchSize)
+        {
+            var sb = new StringBuilder();
+            var sp = new OracleSqlProvider();
+            var n = 0;
+            var sqlList = new List<string>();
+
+            foreach (var item in collection)
+            {
+                if (sb.Length == 0)
+                    sb.AppendLine("INSERT ALL");
+
+                string strItem = "\t" + insertText
+                                            .Replace("INSERT INTO", "INTO")
+                                            .Replace("\r", "")
+                                            .Replace("\n", "")
+                                            .Replace("\t", " ")
+                                            .Replace("( ", "(");
+
+                var values = new List<object>();
+                foreach (var member in members)
+                {
+                    var sbItem = new StringBuilder();
+
+                    var keyGenerator = member.MapMemberInfo.KeyGenerator as SequenceKeyGenerator;
+                    if (keyGenerator != null)
+                    {
+                        values.Add(NextSequenceQuery(keyGenerator.Sequence));
+                    }
+                    else
+                    {
+                        var value = member.GetValue(item);
+
+                        if (value is DateTime?)
+                            value = ((DateTime?)value).Value;
+
+                        sp.BuildValue(sbItem, value);
+
+                        values.Add(sbItem.ToString());
+                    }
+                }
+
+                sb.AppendFormat(strItem, values.ToArray());
+                sb.AppendLine();
+
+                n++;
+
+                if (n >= maxBatchSize)
+                {
+                    sb.AppendLine("SELECT * FROM dual");
+
+                    var sql = sb.ToString();
+                    sqlList.Add(sql);
+
+                    n = 0;
+                    sb.Length = 0;
+                }
+            }
+
+            if (n > 0)
+            {
+                sb.AppendLine("SELECT * FROM dual");
+
+                var sql = sb.ToString();
+                sqlList.Add(sql);
+            }
+
+            return sqlList;
+        }
+
+        public override string GetSequenceQuery(string sequenceName)
+        {
+            return string.Format("SELECT {0}.NEXTVAL FROM DUAL", sequenceName);
+        }
+
+        public override string NextSequenceQuery(string sequenceName)
+        {
+            return string.Format("{0}.NEXTVAL", sequenceName);
+        }
+
+        public override string GetReturningInto(string columnName)
+        {
+            return string.Format("returning {0} into :IDENTITY_PARAMETER", columnName);
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/Interpreters/SqliteDataProviderInterpreter.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+using System.Data;
+
+namespace BLToolkit.Data.DataProvider.Interpreters
+{
+    public class SqliteDataProviderInterpreter : DataProviderInterpreterBase
+    {
+        public override void SetParameterValue(IDbDataParameter parameter, object value)
+        {
+            if (parameter.DbType == DbType.DateTime2)
+                parameter.DbType = DbType.DateTime;
+
+            base.SetParameterValue(parameter, value);
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/MonoSqliteDataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,169 @@
+using System;
+using System.Data;
+using System.Data.Common;
+using System.Diagnostics;
+using System.Text;
+using System.Xml;
+
+// System.Data.SQLite.dll must be referenced.
+// http://sqlite.phxsoftware.com/
+//
+using Mono.Data.Sqlite;
+
+namespace BLToolkit.Data.DataProvider
+{
+	/// <summary>
+	/// Implements access to the Data Provider for SQLite.
+	/// </summary>
+	/// <remarks>
+	/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+	/// </remarks>
+	/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+	public sealed class SQLiteDataProvider: DataProviderBase
+	{
+		/// <summary>
+		/// Creates the database connection object.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <returns>The database connection object.</returns>
+		public override IDbConnection CreateConnectionObject()
+		{
+			return new SqliteConnection();
+		}
+
+		/// <summary>
+		/// Creates the data adapter object.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <returns>A data adapter object.</returns>
+		public override DbDataAdapter CreateDataAdapterObject()
+		{
+			return new SqliteDataAdapter();
+		}
+
+		/// <summary>
+		/// Populates the specified IDbCommand object's Parameters collection with 
+		/// parameter information for the stored procedure specified in the IDbCommand.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <param name="command">The IDbCommand referencing the stored procedure for which the parameter information is to be derived. The derived parameters will be populated into the Parameters of this command.</param>
+		public override bool DeriveParameters(IDbCommand command)
+		{
+			// SQLiteCommandBuilder does not implement DeriveParameters.
+			// This is not surprising, since SQLite has no support for stored procs.
+			//
+			return false;
+		}
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			switch (convertType)
+			{
+				case ConvertType.NameToQueryParameter:
+				case ConvertType.NameToParameter:
+					return "@" + value;
+
+				case ConvertType.NameToQueryField:
+				case ConvertType.NameToQueryTable:
+				{
+					string name = (string)value;
+
+					if (name.Length > 0 && name[0] == '[')
+						return value;
+
+					if (name.IndexOf('.') > 0)
+						value = string.Join("].[", name.Split('.'));
+
+					return "[" + value + "]";
+				}
+
+				case ConvertType.ParameterToName:
+				{
+					string name = (string)value;
+					return name.Length > 0 && name[0] == '@'? name.Substring(1): name;
+				}
+
+				case ConvertType.ExceptionToErrorNumber:
+				{
+					if (value is SqliteException)
+						return ((SqliteException)value).ErrorCode;
+					break;
+				}
+			}
+
+			return value;
+		}
+
+		public override void AttachParameter(IDbCommand command, IDbDataParameter parameter)
+		{
+			if (parameter.Direction == ParameterDirection.Input || parameter.Direction == ParameterDirection.InputOutput)
+			{
+				if (parameter.Value is XmlDocument)
+				{
+					parameter.Value = Encoding.UTF8.GetBytes(((XmlDocument) parameter.Value).InnerXml);
+					parameter.DbType = DbType.Binary;
+				}
+			}
+
+			base.AttachParameter(command, parameter);
+		}
+
+		/// <summary>
+		/// Returns connection type.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <value>An instance of the <see cref="Type"/> class.</value>
+		public override Type ConnectionType
+		{
+			get { return typeof(SqliteConnection); }
+		}
+
+		/// <summary>
+		/// Returns the data provider name.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataProvider Method</seealso>
+		/// <value>Data provider name.</value>
+		public override string Name
+		{
+			get { return "SQLite"; }
+		}
+
+		public class SQLiteMappingSchema : Mapping.MappingSchema
+		{
+			#region Convert
+
+			public override XmlReader ConvertToXmlReader(object value)
+			{
+				if (value is byte[])
+					value = Encoding.UTF8.GetString((byte[])value);
+
+				return base.ConvertToXmlReader(value);
+			}
+
+			public override XmlDocument ConvertToXmlDocument(object value)
+			{
+				if (value is byte[])
+					value = Encoding.UTF8.GetString((byte[])value);
+
+				return base.ConvertToXmlDocument(value);
+			}
+
+			#endregion
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/MySqlDataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,226 @@
+// MySql Connector/Net
+// http://dev.mysql.com/downloads/connector/net/
+//
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.Common;
+
+using MySql.Data.MySqlClient;
+
+namespace BLToolkit.Data.DataProvider
+{
+	using Sql.SqlProvider;
+	using Common;
+
+	public class MySqlDataProvider :  DataProviderBase
+	{
+		#region Static configuration
+
+		public static char ParameterSymbol
+		{
+			get { return MySqlSqlProvider.ParameterSymbol;  }
+			set { MySqlSqlProvider.ParameterSymbol = value; }
+		}
+
+		public static bool TryConvertParameterSymbol
+		{
+			get { return MySqlSqlProvider.TryConvertParameterSymbol;  }
+			set { MySqlSqlProvider.TryConvertParameterSymbol = value; }
+		}
+
+		public  static string  CommandParameterPrefix
+		{
+			get { return MySqlSqlProvider.CommandParameterPrefix;  }
+			set { MySqlSqlProvider.CommandParameterPrefix = value; }
+		}
+
+		public  static string  SprocParameterPrefix
+		{
+			get { return MySqlSqlProvider.SprocParameterPrefix;  }
+			set { MySqlSqlProvider.SprocParameterPrefix = value; }
+		}
+
+		public  static List<char>  ConvertParameterSymbols
+		{
+			get { return MySqlSqlProvider.ConvertParameterSymbols;  }
+			set { MySqlSqlProvider.ConvertParameterSymbols = value; }
+		}
+
+		[Obsolete("Use CommandParameterPrefix or SprocParameterPrefix instead.")]
+		public  static string  ParameterPrefix
+		{
+			get { return MySqlSqlProvider.SprocParameterPrefix; }
+			set { SprocParameterPrefix = CommandParameterPrefix = string.IsNullOrEmpty(value) ? string.Empty : value; }
+		}
+
+		public static void ConfigureOldStyle()
+		{
+			ParameterSymbol           = '?';
+			ConvertParameterSymbols   = new List<char>(new[] { '@' });
+			TryConvertParameterSymbol = true;
+		}
+
+		public static void ConfigureNewStyle()
+		{
+			ParameterSymbol           = '@';
+			ConvertParameterSymbols   = null;
+			TryConvertParameterSymbol = false;
+		}
+
+		static MySqlDataProvider()
+		{
+			ConfigureOldStyle();
+		}
+		
+		#endregion
+
+		public override IDbConnection CreateConnectionObject()
+		{
+			return new MySqlConnection();
+		}
+
+		public override DbDataAdapter CreateDataAdapterObject()
+		{
+			return new MySqlDataAdapter();
+		}
+
+		private void ConvertParameterNames(IDbCommand command)
+		{
+			foreach (IDataParameter p in command.Parameters)
+			{
+				if (p.ParameterName[0] != ParameterSymbol)
+					p.ParameterName =
+						Convert(
+							Convert(p.ParameterName, ConvertType.SprocParameterToName),
+							command.CommandType == CommandType.StoredProcedure ? ConvertType.NameToSprocParameter : ConvertType.NameToCommandParameter).ToString();
+			}
+		}
+
+		public override bool DeriveParameters(IDbCommand command)
+		{
+			if (command is MySqlCommand)
+			{
+				MySqlCommandBuilder.DeriveParameters((MySqlCommand)command);
+
+				if (TryConvertParameterSymbol && ConvertParameterSymbols.Count > 0)
+					ConvertParameterNames(command);
+
+				return true;
+			}
+
+			return false;
+		}
+
+		public override IDbDataParameter GetParameter(
+			IDbCommand command,
+			NameOrIndexParameter nameOrIndex)
+		{
+			if (nameOrIndex.ByName)
+			{
+				// if we have a stored procedure, then maybe command paramaters were formatted
+				// (SprocParameterPrefix added). In this case we need to format given parameter name first
+				// and only then try to take parameter by formatted parameter name
+				var parameterName = command.CommandType == CommandType.StoredProcedure
+					? Convert(nameOrIndex.Name, ConvertType.NameToSprocParameter).ToString()
+					: nameOrIndex.Name;
+
+				return (IDbDataParameter)(command.Parameters[parameterName]);
+			}
+			return (IDbDataParameter)(command.Parameters[nameOrIndex.Index]);
+		}
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			if (value == null)
+				throw new ArgumentNullException("value");
+
+			switch (convertType)
+			{
+				case ConvertType.ExceptionToErrorNumber:
+					if (value is MySqlException)
+						return ((MySqlException)value).Number;
+					break;
+
+				case ConvertType.ExceptionToErrorMessage:
+					if (value is MySqlException)
+						return ((MySqlException)value).Message;
+					break;
+			}
+
+			return SqlProvider.Convert(value, convertType);
+		}
+
+		public override DataExceptionType ConvertErrorNumberToDataExceptionType(int number)
+		{
+			switch (number)
+			{
+				case 1213: return DataExceptionType.Deadlock;
+				case 1205: return DataExceptionType.Timeout;
+				case 1216:
+				case 1217: return DataExceptionType.ForeignKeyViolation;
+				case 1169: return DataExceptionType.UniqueIndexViolation;
+			}
+
+			return DataExceptionType.Undefined;
+		}
+
+		public override Type ConnectionType
+		{
+			get { return typeof(MySqlConnection); }
+		}
+
+		public override string Name
+		{
+			get { return DataProvider.ProviderName.MySql; }
+		}
+
+		public override ISqlProvider CreateSqlProvider()
+		{
+			return new MySqlSqlProvider();
+		}
+
+		public override void Configure(System.Collections.Specialized.NameValueCollection attributes)
+		{
+			var paremeterPrefix = attributes["ParameterPrefix"];
+			if (paremeterPrefix != null)
+				CommandParameterPrefix = SprocParameterPrefix = paremeterPrefix;
+
+			paremeterPrefix = attributes["CommandParameterPrefix"];
+			if (paremeterPrefix != null)
+				CommandParameterPrefix = paremeterPrefix;
+
+			paremeterPrefix = attributes["SprocParameterPrefix"];
+			if (paremeterPrefix != null)
+				SprocParameterPrefix = paremeterPrefix;
+
+			var configName = attributes["ParameterSymbolConfig"];
+			if (configName != null)
+			{
+				switch (configName)
+				{
+					case "OldStyle":
+						ConfigureOldStyle();
+						break;
+					case "NewStyle":
+						ConfigureNewStyle();
+						break;
+				}
+			}
+
+			var parameterSymbol = attributes["ParameterSymbol"];
+			if (parameterSymbol != null && parameterSymbol.Length == 1)
+				ParameterSymbol = parameterSymbol[0];
+
+			var convertParameterSymbols = attributes["ConvertParameterSymbols"];
+			if (convertParameterSymbols != null)
+				ConvertParameterSymbols = new List<char>(convertParameterSymbols.ToCharArray());
+
+			var tryConvertParameterSymbol = attributes["TryConvertParameterSymbol"];
+			if (tryConvertParameterSymbol != null)
+				TryConvertParameterSymbol = BLToolkit.Common.Convert.ToBoolean(tryConvertParameterSymbol);
+
+			base.Configure(attributes);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/OdbcDataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,112 @@
+using System;
+using System.Data;
+using System.Data.Common;
+using System.Data.Odbc;
+
+namespace BLToolkit.Data.DataProvider
+{
+	using Sql.SqlProvider;
+
+	/// <summary>
+	/// Implements access to the Data Provider for ODBC.
+	/// </summary>
+	/// <remarks>
+	/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+	/// </remarks>
+	/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+	public class OdbcDataProvider : DataProviderBase
+	{
+		/// <summary>
+		/// Creates the database connection object.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <returns>The database connection object.</returns>
+		public override IDbConnection CreateConnectionObject()
+		{
+			return new OdbcConnection();
+		}
+
+		/// <summary>
+		/// Creates the data adapter object.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <returns>A data adapter object.</returns>
+		public override DbDataAdapter CreateDataAdapterObject()
+		{
+			return new OdbcDataAdapter();
+		}
+
+		/// <summary>
+		/// Populates the specified <see cref="IDbCommand"/> object's Parameters collection with 
+		/// parameter information for the stored procedure specified in the <see cref="IDbCommand"/>.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <param name="command">The <see cref="IDbCommand"/> referencing the stored procedure for which the parameter
+		/// information is to be derived. The derived parameters will be populated into 
+		/// the Parameters of this command.</param>
+		public override bool DeriveParameters(IDbCommand command)
+		{
+			OdbcCommandBuilder.DeriveParameters((OdbcCommand)command);
+			return true;
+		}
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			switch (convertType)
+			{
+				case ConvertType.ExceptionToErrorNumber:
+					if (value is OdbcException)
+					{
+						var ex = (OdbcException)value;
+						if (ex.Errors.Count > 0)
+							return ex.Errors[0].NativeError;
+					}
+					break;
+			}
+
+			return base.Convert(value, convertType);
+		}
+
+		public override ISqlProvider CreateSqlProvider()
+		{
+			throw new NotSupportedException();
+		}
+
+		/// <summary>
+		/// Returns connection type.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <value>An instance of the <see cref="Type"/> class.</value>
+		public override Type ConnectionType
+		{
+			get { return typeof(OdbcConnection); }
+		}
+
+		public const string NameString = DataProvider.ProviderName.Odbc;
+
+		/// <summary>
+		/// Returns the data provider name.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataProvider Method</seealso>
+		/// <value>Data provider name.</value>
+		public override string Name
+		{
+			get { return NameString; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/OdpDataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1708 @@
+// Odp.Net Data Provider.
+// http://www.oracle.com/technology/tech/windows/odpnet/index.html
+//
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.Common;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Xml;
+
+using BLToolkit.Aspects;
+using BLToolkit.Common;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+
+#if MANAGED
+using Oracle.ManagedDataAccess.Client;
+using Oracle.ManagedDataAccess.Types;
+#else
+using Oracle.DataAccess.Client;
+using Oracle.DataAccess.Types;
+#endif
+
+namespace BLToolkit.Data.DataProvider
+{
+	using Sql.SqlProvider;
+	using BLToolkit.Data.Sql;
+
+	/// <summary>
+	/// Implements access to the Data Provider for Oracle.
+	/// </summary>
+	/// <remarks>
+	/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+	/// </remarks>
+	/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+#if !MANAGED
+	public class OdpDataProvider : DataProviderBase
+	{
+		public OdpDataProvider()
+		{
+			MappingSchema = new OdpMappingSchema();
+		}
+
+		public const string NameString = DataProvider.ProviderName.Oracle;
+
+		private const string DbTypeTableName = "Oracle.DataAccess.Client.OraDb_DbTypeTable";
+
+		static OdpDataProvider()
+		{
+#else
+	public class OdpManagedDataProvider : DataProviderBase
+	{
+		public OdpManagedDataProvider()
+		{
+			MappingSchema = new OdpMappingSchema();
+		}
+
+		public const string NameString = DataProvider.ProviderName.OracleManaged;
+
+		private const string DbTypeTableName = "Oracle.ManagedDataAccess.Client.OraDb_DbTypeTable";
+
+		static OdpManagedDataProvider()
+		{
+#endif
+			// Fix Oracle.Net bug #1: Array types are not handled.
+			//
+			var oraDbDbTypeTableType = typeof(OracleParameter).Assembly.GetType(DbTypeTableName);
+
+			if (null != oraDbDbTypeTableType)
+			{
+				var typeTable = (Hashtable)oraDbDbTypeTableType.InvokeMember(
+					"s_table", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.GetField,
+					null, null, Type.EmptyTypes);
+
+				if (null != typeTable)
+				{
+					typeTable[typeof(DateTime[])]          = OracleDbType.TimeStamp;
+					typeTable[typeof(Int16[])]             = OracleDbType.Int16;
+					typeTable[typeof(Int32[])]             = OracleDbType.Int32;
+					typeTable[typeof(Int64[])]             = OracleDbType.Int64;
+					typeTable[typeof(Single[])]            = OracleDbType.Single;
+					typeTable[typeof(Double[])]            = OracleDbType.Double;
+					typeTable[typeof(Decimal[])]           = OracleDbType.Decimal;
+					typeTable[typeof(TimeSpan[])]          = OracleDbType.IntervalDS;
+					typeTable[typeof(String[])]            = OracleDbType.Varchar2;
+					typeTable[typeof(OracleBFile[])]       = OracleDbType.BFile;
+					typeTable[typeof(OracleBinary[])]      = OracleDbType.Raw;
+					typeTable[typeof(OracleBlob[])]        = OracleDbType.Blob;
+					typeTable[typeof(OracleClob[])]        = OracleDbType.Clob;
+					typeTable[typeof(OracleDate[])]        = OracleDbType.Date;
+					typeTable[typeof(OracleDecimal[])]     = OracleDbType.Decimal;
+					typeTable[typeof(OracleIntervalDS[])]  = OracleDbType.IntervalDS;
+					typeTable[typeof(OracleIntervalYM[])]  = OracleDbType.IntervalYM;
+					typeTable[typeof(OracleRefCursor[])]   = OracleDbType.RefCursor;
+					typeTable[typeof(OracleString[])]      = OracleDbType.Varchar2;
+					typeTable[typeof(OracleTimeStamp[])]   = OracleDbType.TimeStamp;
+					typeTable[typeof(OracleTimeStampLTZ[])]= OracleDbType.TimeStampLTZ;
+					typeTable[typeof(OracleTimeStampTZ[])] = OracleDbType.TimeStampTZ;
+#if !MANAGED
+					typeTable[typeof(OracleXmlType[])]     = OracleDbType.XmlType;
+#endif
+
+					typeTable[typeof(Boolean)]             = OracleDbType.Byte;
+					typeTable[typeof(Guid)]                = OracleDbType.Raw;
+					typeTable[typeof(SByte)]               = OracleDbType.Decimal;
+					typeTable[typeof(UInt16)]              = OracleDbType.Decimal;
+					typeTable[typeof(UInt32)]              = OracleDbType.Decimal;
+					typeTable[typeof(UInt64)]              = OracleDbType.Decimal;
+
+					typeTable[typeof(Boolean[])]           = OracleDbType.Byte;
+					typeTable[typeof(Guid[])]              = OracleDbType.Raw;
+					typeTable[typeof(SByte[])]             = OracleDbType.Decimal;
+					typeTable[typeof(UInt16[])]            = OracleDbType.Decimal;
+					typeTable[typeof(UInt32[])]            = OracleDbType.Decimal;
+					typeTable[typeof(UInt64[])]            = OracleDbType.Decimal;
+
+					typeTable[typeof(Boolean?)]            = OracleDbType.Byte;
+					typeTable[typeof(Guid?)]               = OracleDbType.Raw;
+					typeTable[typeof(SByte?)]              = OracleDbType.Decimal;
+					typeTable[typeof(UInt16?)]             = OracleDbType.Decimal;
+					typeTable[typeof(UInt32?)]             = OracleDbType.Decimal;
+					typeTable[typeof(UInt64?)]             = OracleDbType.Decimal;
+					typeTable[typeof(DateTime?[])]         = OracleDbType.TimeStamp;
+					typeTable[typeof(Int16?[])]            = OracleDbType.Int16;
+					typeTable[typeof(Int32?[])]            = OracleDbType.Int32;
+					typeTable[typeof(Int64?[])]            = OracleDbType.Int64;
+					typeTable[typeof(Single?[])]           = OracleDbType.Single;
+					typeTable[typeof(Double?[])]           = OracleDbType.Double;
+					typeTable[typeof(Decimal?[])]          = OracleDbType.Decimal;
+					typeTable[typeof(TimeSpan?[])]         = OracleDbType.IntervalDS;
+					typeTable[typeof(Boolean?[])]          = OracleDbType.Byte;
+					typeTable[typeof(Guid?[])]             = OracleDbType.Raw;
+					typeTable[typeof(SByte?[])]            = OracleDbType.Decimal;
+					typeTable[typeof(UInt16?[])]           = OracleDbType.Decimal;
+					typeTable[typeof(UInt32?[])]           = OracleDbType.Decimal;
+					typeTable[typeof(UInt64?[])]           = OracleDbType.Decimal;
+
+					typeTable[typeof(XmlReader)]           = OracleDbType.XmlType;
+					typeTable[typeof(XmlDocument)]         = OracleDbType.XmlType;
+					typeTable[typeof(MemoryStream)]        = OracleDbType.Blob;
+					typeTable[typeof(XmlReader[])]         = OracleDbType.XmlType;
+					typeTable[typeof(XmlDocument[])]       = OracleDbType.XmlType;
+					typeTable[typeof(MemoryStream[])]      = OracleDbType.Blob;
+				}
+			}
+		}
+
+		/// <summary>
+		/// Creates the database connection object.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <returns>The database connection object.</returns>
+		public override IDbConnection CreateConnectionObject()
+		{
+			return new OracleConnection();
+		}
+
+		public override IDbCommand CreateCommandObject(IDbConnection connection)
+		{
+			var oraConnection = connection as OracleConnection;
+
+			if (null != oraConnection)
+			{
+				var oraCommand = oraConnection.CreateCommand();
+
+				// Fix Oracle.Net bug #2: Empty arrays can not be sent to the server.
+				//
+				oraCommand.BindByName = true;
+
+				return oraCommand;
+			}
+
+			return base.CreateCommandObject(connection);
+		}
+
+		public override void SetParameterValue(IDbDataParameter parameter, object value)
+		{
+			base.SetParameterValue(parameter, value);
+
+			// strings and byte arrays larger than 4000 bytes may be handled improperly
+			if (parameter is OracleParameterWrap)
+			{
+				const int ThresholdSize = 4000;
+				if (value is string && Encoding.UTF8.GetBytes((string)value).Length > ThresholdSize)
+				{
+					((OracleParameterWrap)parameter).OracleParameter.OracleDbType = OracleDbType.Clob;
+				}
+				else if (value is byte[] && ((byte[])value).Length > ThresholdSize)
+				{
+					((OracleParameterWrap)parameter).OracleParameter.OracleDbType = OracleDbType.Blob;
+				}
+			}
+		}
+
+		public override IDbDataParameter CloneParameter(IDbDataParameter parameter)
+		{
+			var oraParameter = (parameter is OracleParameterWrap)?
+				(parameter as OracleParameterWrap).OracleParameter: parameter as OracleParameter;
+
+			if (null != oraParameter)
+			{
+				var oraParameterClone = (OracleParameter)oraParameter.Clone();
+
+				// Fix Oracle.Net bug #3: CollectionType property is not cloned.
+				//
+				oraParameterClone.CollectionType = oraParameter.CollectionType;
+
+				// Fix Oracle.Net bug #8423178
+				// See http://forums.oracle.com/forums/thread.jspa?threadID=975902&tstart=0
+				//
+				if (oraParameterClone.OracleDbType == OracleDbType.RefCursor)
+				{
+					// Set OracleDbType to itself to reset m_bSetDbType and m_bOracleDbTypeExSet
+					//
+					oraParameterClone.OracleDbType = OracleDbType.RefCursor;
+				}
+
+				return OracleParameterWrap.CreateInstance(oraParameterClone);
+			}
+
+			return base.CloneParameter(parameter);
+		}
+
+		public override void SetUserDefinedType(IDbDataParameter parameter, string typeName)
+		{
+			var oraParameter = (parameter is OracleParameterWrap) ?
+				(parameter as OracleParameterWrap).OracleParameter : parameter as OracleParameter;
+
+			if (oraParameter == null)
+				throw new ArgumentException("OracleParameter expected.", "parameter");
+
+			oraParameter.UdtTypeName = typeName;
+		}
+
+		/// <summary>
+		/// Creates the data adapter object.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <returns>A data adapter object.</returns>
+		public override DbDataAdapter CreateDataAdapterObject()
+		{
+			return new OracleDataAdapter();
+		}
+
+		/// <summary>
+		/// Populates the specified IDbCommand object's Parameters collection with 
+		/// parameter information for the stored procedure specified in the IDbCommand.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <param name="command">The IDbCommand referencing the stored procedure for which the parameter
+		/// information is to be derived. The derived parameters will be populated into
+		/// the Parameters of this command.</param>
+		public override bool DeriveParameters(IDbCommand command)
+		{
+			var oraCommand = command as OracleCommand;
+
+			if (null != oraCommand)
+			{
+				try
+				{
+					OracleCommandBuilder.DeriveParameters(oraCommand);
+				}
+				catch (Exception ex)
+				{
+					// Make Oracle less laconic.
+					//
+					throw new DataException(string.Format("{0}\nCommandText: {1}", ex.Message, oraCommand.CommandText), ex);
+				}
+
+				return true;
+			}
+
+			return false;
+		}
+
+		/// <summary>
+		/// Open an <see cref="IDataReader"/> into the given <see cref="OracleRefCursor"/> object
+		/// </summary>
+		/// <param name="refCursor">an <see cref="OracleRefCursor"/> to perform GetDataReader() on</param>
+		/// <returns>The <see cref="IDataReader"/> into the returned by GetDataReader()</returns>
+		public override IDataReader GetRefCursorDataReader(object refCursor)
+		{
+			var oracleRefCursor = refCursor as OracleRefCursor;
+
+			if (oracleRefCursor == null)
+				throw new ArgumentException("Argument must be of type 'OracleRefCursor'", "refCursor");
+
+			return oracleRefCursor.GetDataReader();
+		}
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			switch (convertType)
+			{
+				case ConvertType.NameToCommandParameter:
+				case ConvertType.NameToSprocParameter:
+					return ParameterPrefix == null? value: ParameterPrefix + value;
+
+				case ConvertType.SprocParameterToName:
+					var name = (string)value;
+
+					if (name.Length > 0)
+					{
+						if (name[0] == ':')
+							return name.Substring(1);
+
+						if (ParameterPrefix != null &&
+							name.ToUpper(CultureInfo.InvariantCulture).StartsWith(ParameterPrefix))
+						{
+							return name.Substring(ParameterPrefix.Length);
+						}
+					}
+
+					break;
+
+				case ConvertType.ExceptionToErrorNumber:
+					if (value is OracleException)
+						return ((OracleException)value).Number;
+					break;
+			}
+
+			return SqlProvider.Convert(value, convertType);
+		}
+
+		public override void PrepareCommand(ref CommandType commandType, ref string commandText, ref IDbDataParameter[] commandParameters)
+		{
+			base.PrepareCommand(ref commandType, ref commandText, ref commandParameters);
+
+			if (commandType == CommandType.Text)
+			{
+				// Fix Oracle bug #11 '\r' is not a valid character!
+				//
+				commandText = commandText.Replace('\r', ' ');
+			}
+		}
+
+		public override void AttachParameter(IDbCommand command, IDbDataParameter parameter)
+		{
+			var oraParameter = (parameter is OracleParameterWrap)?
+				(parameter as OracleParameterWrap).OracleParameter: parameter as OracleParameter;
+
+			if (null != oraParameter)
+			{
+				if (oraParameter.CollectionType == OracleCollectionType.PLSQLAssociativeArray)
+				{
+					if (oraParameter.Direction == ParameterDirection.Input
+						|| oraParameter.Direction == ParameterDirection.InputOutput)
+					{
+						var ar = oraParameter.Value as Array;
+
+						if (null != ar && !(ar is byte[] || ar is char[]))
+						{
+							oraParameter.Size = ar.Length;
+
+							if (oraParameter.DbType == DbType.String
+								&& oraParameter.Direction == ParameterDirection.InputOutput)
+							{
+								var arrayBindSize = new int[oraParameter.Size];
+
+								for (var i = 0; i < oraParameter.Size; ++i)
+								{
+									arrayBindSize[i] = 1024;
+								}
+								
+								oraParameter.ArrayBindSize = arrayBindSize;
+							}
+						}
+
+						if (oraParameter.Size == 0)
+						{
+							// Skip this parameter.
+							// Fix Oracle.Net bug #2: Empty arrays can not be sent to the server.
+							//
+							return;
+						}
+
+						if (oraParameter.Value is Stream[])
+						{
+							var streams = (Stream[]) oraParameter.Value;
+
+							for (var i = 0; i < oraParameter.Size; ++i)
+							{
+								if (streams[i] is OracleBFile || streams[i] is OracleBlob || streams[i] is OracleClob 
+#if !MANAGED
+									|| streams[i] is OracleXmlStream
+#endif
+									)
+								{
+									// Known Oracle type.
+									//
+									continue;
+								}
+
+								streams[i] = CopyStream(streams[i], (OracleCommand)command);
+							}
+						}
+						else if (oraParameter.Value is XmlDocument[])
+						{
+							var xmlDocuments = (XmlDocument[]) oraParameter.Value;
+							var values       = new object[oraParameter.Size];
+
+							switch (oraParameter.OracleDbType)
+							{
+								case OracleDbType.XmlType:
+#if !MANAGED
+									for (var i = 0; i < oraParameter.Size; ++i)
+									{
+										values[i] = xmlDocuments[i].DocumentElement == null?
+											(object) DBNull.Value:
+											new OracleXmlType((OracleConnection)command.Connection, xmlDocuments[i]);
+									}
+
+									oraParameter.Value = values;
+									break;
+#else
+									throw new NotSupportedException();
+#endif
+								// Fix Oracle.Net bug #9: XmlDocument.ToString() returns System.Xml.XmlDocument,
+								// so m_value.ToString() is not enought.
+								//
+								case OracleDbType.Clob:
+								case OracleDbType.NClob:
+								case OracleDbType.Varchar2:
+								case OracleDbType.NVarchar2:
+								case OracleDbType.Char:
+								case OracleDbType.NChar:
+									for (var i = 0; i < oraParameter.Size; ++i)
+									{
+										values[i] = xmlDocuments[i].DocumentElement == null?
+											(object) DBNull.Value:
+											xmlDocuments[i].InnerXml;
+									}
+
+									oraParameter.Value = values;
+
+									break;
+
+								// Or convert to bytes if need.
+								//
+								case OracleDbType.Blob:
+								case OracleDbType.BFile:
+								case OracleDbType.Raw:
+								case OracleDbType.Long:
+								case OracleDbType.LongRaw:
+									for (var i = 0; i < oraParameter.Size; ++i)
+									{
+										if (xmlDocuments[i].DocumentElement == null)
+											values[i] = DBNull.Value;
+										else
+											using (var s = new MemoryStream())
+											{
+												xmlDocuments[i].Save(s);
+												values[i] = s.GetBuffer();
+											}
+									}
+
+									oraParameter.Value = values;
+
+									break;
+							}
+						}
+					}
+					else if (oraParameter.Direction == ParameterDirection.Output)
+					{
+						// Fix Oracle.Net bug #4: ArrayBindSize must be explicitly specified.
+						//
+						if (oraParameter.DbType == DbType.String)
+						{
+							oraParameter.Size = 1024;
+							var arrayBindSize = new int[oraParameter.Size];
+							for (var i = 0; i < oraParameter.Size; ++i)
+							{
+								arrayBindSize[i] = 1024;
+							}
+							
+							oraParameter.ArrayBindSize = arrayBindSize;
+						}
+						else
+						{
+							oraParameter.Size = 32767;
+						}
+					}
+				}
+				else if (oraParameter.Value is Stream)
+				{
+					var stream = (Stream) oraParameter.Value;
+
+					if (!(stream is OracleBFile) && !(stream is OracleBlob) &&
+						!(stream is OracleClob)
+#if !MANAGED 
+						&& !(stream is OracleXmlStream)
+#endif
+						)
+					{
+						oraParameter.Value = CopyStream(stream, (OracleCommand)command);
+					}
+				}
+				else if (oraParameter.Value is Byte[])
+				{
+					var bytes = (Byte[]) oraParameter.Value;
+
+					if (bytes.Length > 32000)
+					{
+						oraParameter.Value = CopyStream(bytes, (OracleCommand)command);
+					}
+				}
+				else if (oraParameter.Value is XmlDocument)
+				{
+					var xmlDocument = (XmlDocument)oraParameter.Value;
+					if (xmlDocument.DocumentElement == null)
+						oraParameter.Value = DBNull.Value;
+					else
+					{
+
+						switch (oraParameter.OracleDbType)
+						{
+							case OracleDbType.XmlType:
+#if !MANAGED
+								oraParameter.Value = new OracleXmlType((OracleConnection)command.Connection, xmlDocument);
+								break;
+#else
+								throw new NotSupportedException();
+#endif
+
+							// Fix Oracle.Net bug #9: XmlDocument.ToString() returns System.Xml.XmlDocument,
+							// so m_value.ToString() is not enought.
+							//
+							case OracleDbType.Clob:
+							case OracleDbType.NClob:
+							case OracleDbType.Varchar2:
+							case OracleDbType.NVarchar2:
+							case OracleDbType.Char:
+							case OracleDbType.NChar:
+								using (TextWriter w = new StringWriter())
+								{
+									xmlDocument.Save(w);
+									oraParameter.Value = w.ToString();
+								}
+								break;
+
+							// Or convert to bytes if need.
+							//
+							case OracleDbType.Blob:
+							case OracleDbType.BFile:
+							case OracleDbType.Raw:
+							case OracleDbType.Long:
+							case OracleDbType.LongRaw:
+								using (var s = new MemoryStream())
+								{
+									xmlDocument.Save(s);
+									oraParameter.Value = s.GetBuffer();
+								}
+								break;
+						}
+					}
+				}
+
+				parameter = oraParameter;
+			}
+			
+			base.AttachParameter(command, parameter);
+		}
+
+		private static Stream CopyStream(Stream stream, OracleCommand cmd)
+		{
+			return CopyStream(Common.Convert.ToByteArray(stream), cmd);
+		}
+
+		private static Stream CopyStream(Byte[] bytes, OracleCommand cmd)
+		{
+			var ret = new OracleBlob(cmd.Connection);
+			ret.Write(bytes, 0, bytes.Length);
+			return ret;
+		}
+
+		public override bool IsValueParameter(IDbDataParameter parameter)
+		{
+			var oraParameter = (parameter is OracleParameterWrap)?
+				(parameter as OracleParameterWrap).OracleParameter: parameter as OracleParameter;
+
+			if (null != oraParameter)
+			{
+				if (oraParameter.OracleDbType == OracleDbType.RefCursor
+					&& oraParameter.Direction == ParameterDirection.Output)
+				{
+					// Ignore out ref cursors, while out parameters of other types are o.k.
+					return false;
+				}
+			}
+
+			return base.IsValueParameter(parameter);
+		}
+
+		public override IDbDataParameter CreateParameterObject(IDbCommand command)
+		{
+			var parameter = base.CreateParameterObject(command);
+
+			if (parameter is OracleParameter)
+				parameter = OracleParameterWrap.CreateInstance(parameter as OracleParameter);
+
+			return parameter;
+		}
+
+		public override IDbDataParameter GetParameter(IDbCommand command, NameOrIndexParameter nameOrIndex)
+		{
+			var parameter = base.GetParameter(command, nameOrIndex);
+
+			if (parameter is OracleParameter)
+				parameter = OracleParameterWrap.CreateInstance(parameter as OracleParameter);
+
+			return parameter;
+		}
+
+		/// <summary>
+		/// Returns connection type.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <value>An instance of the <see cref="Type"/> class.</value>
+		public override Type ConnectionType
+		{
+			get { return typeof(OracleConnection); }
+		}
+
+		/// <summary>
+		/// Returns the data provider name.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataProvider Method</seealso>
+		/// <value>Data provider name.</value>
+		public override string Name
+		{
+			get { return NameString; }
+		}
+
+		public override int MaxBatchSize
+		{
+			get { return 0; }
+		}
+
+		public override int ExecuteArray(IDbCommand command, int iterations)
+		{
+			var cmd = (OracleCommand)command;
+			var oracleParameters = cmd.Parameters.OfType<OracleParameter>().ToArray();
+			var oldCollectionTypes = oracleParameters.Select(p => p.CollectionType).ToArray();
+
+			try
+			{
+				foreach (var p in oracleParameters)
+				{
+					p.CollectionType = OracleCollectionType.None;
+				}
+
+				cmd.ArrayBindCount = iterations;
+				return cmd.ExecuteNonQuery();
+			}
+			finally
+			{
+				foreach (var p in oracleParameters.Zip(oldCollectionTypes, (p, t) => new { Param = p, CollectionType = t }))
+				{
+					p.Param.CollectionType = p.CollectionType;
+				}
+
+				cmd.ArrayBindCount = 0;
+			}
+		}
+
+		public override ISqlProvider CreateSqlProvider()
+		{
+			return new OracleSqlProvider();
+		}
+
+		public override IDataReader GetDataReader(MappingSchema schema, IDataReader dataReader)
+		{
+			return dataReader is OracleDataReader ?
+				new OracleDataReaderEx((OracleDataReader)dataReader) :
+				base.GetDataReader(schema, dataReader);
+		}
+
+		class OracleDataReaderEx: DataReaderEx<OracleDataReader>
+		{
+			public OracleDataReaderEx(OracleDataReader rd)
+				: base(rd)
+			{
+			}
+
+			public override DateTimeOffset GetDateTimeOffset(int i)
+			{
+				var ts = DataReader.GetOracleTimeStampTZ(i);
+				return new DateTimeOffset(ts.Value, ts.GetTimeZoneOffset());
+			}
+		}
+
+		private string _parameterPrefix = "P";
+		public  string  ParameterPrefix
+		{
+			get { return _parameterPrefix;  }
+			set
+			{
+				_parameterPrefix = string.IsNullOrEmpty(value)? null:
+					value.ToUpper(CultureInfo.InvariantCulture);
+			}
+		}
+
+		/// <summary>
+		/// One time initialization from a configuration file.
+		/// </summary>
+		/// <param name="attributes">Provider specific attributes.</param>
+		public override void Configure(System.Collections.Specialized.NameValueCollection attributes)
+		{
+			var val = attributes["ParameterPrefix"];
+			if (val != null)
+				ParameterPrefix = val;
+
+			base.Configure(attributes);
+		}
+
+		#region Inner types
+
+		public class OdpMappingSchema : MappingSchema
+		{
+			public override DataReaderMapper CreateDataReaderMapper(IDataReader dataReader)
+			{
+				return new OracleDataReaderMapper(this, dataReader);
+			}
+
+			public override DataReaderMapper CreateDataReaderMapper(
+				IDataReader          dataReader,
+				NameOrIndexParameter nip)
+			{
+				return new OracleScalarDataReaderMapper(this, dataReader, nip);
+			}
+
+			public override Reflection.Extension.ExtensionList Extensions
+			{
+				get { return Map.DefaultSchema.Extensions;  }
+				set { Map.DefaultSchema.Extensions = value; }
+			}
+
+			#region Convert
+
+			#region Primitive Types
+
+			[CLSCompliant(false)]
+			public override SByte ConvertToSByte(object value)
+			{
+				if (value is OracleDecimal)
+				{
+					var oraDecimal = (OracleDecimal)value;
+					return oraDecimal.IsNull? DefaultSByteNullValue: (SByte)oraDecimal.Value;
+				}
+
+				return base.ConvertToSByte(value);
+			}
+
+			public override Int16 ConvertToInt16(object value)
+			{
+				if (value is OracleDecimal)
+				{
+					var oraDecimal = (OracleDecimal)value;
+					return oraDecimal.IsNull? DefaultInt16NullValue: oraDecimal.ToInt16();
+				}
+
+				return base.ConvertToInt16(value);
+			}
+
+			public override Int32 ConvertToInt32(object value)
+			{
+				if (value is OracleDecimal)
+				{
+					var oraDecimal = (OracleDecimal)value;
+					return oraDecimal.IsNull? DefaultInt32NullValue: oraDecimal.ToInt32();
+				}
+
+				return base.ConvertToInt32(value);
+			}
+
+			public override Int64 ConvertToInt64(object value)
+			{
+				if (value is OracleDecimal)
+				{
+					var oraDecimal = (OracleDecimal)value;
+					return oraDecimal.IsNull? DefaultInt64NullValue: oraDecimal.ToInt64();
+				}
+
+				return base.ConvertToInt64(value);
+			}
+
+			public override Byte ConvertToByte(object value)
+			{
+				if (value is OracleDecimal)
+				{
+					var oraDecimal = (OracleDecimal)value;
+					return oraDecimal.IsNull? DefaultByteNullValue: oraDecimal.ToByte();
+				}
+
+				return base.ConvertToByte(value);
+			}
+
+			[CLSCompliant(false)]
+			public override UInt16 ConvertToUInt16(object value)
+			{
+				if (value is OracleDecimal)
+				{
+					var oraDecimal = (OracleDecimal)value;
+					return oraDecimal.IsNull? DefaultUInt16NullValue: (UInt16)oraDecimal.Value;
+				}
+
+				return base.ConvertToUInt16(value);
+			}
+
+			[CLSCompliant(false)]
+			public override UInt32 ConvertToUInt32(object value)
+			{
+				if (value is OracleDecimal)
+				{
+					var oraDecimal = (OracleDecimal)value;
+					return oraDecimal.IsNull? DefaultUInt32NullValue: (UInt32)oraDecimal.Value;
+				}
+
+				return base.ConvertToUInt32(value);
+			}
+
+			[CLSCompliant(false)]
+			public override UInt64 ConvertToUInt64(object value)
+			{
+				if (value is OracleDecimal)
+				{
+					var oraDecimal = (OracleDecimal)value;
+					return oraDecimal.IsNull? DefaultUInt64NullValue: (UInt64)oraDecimal.Value;
+				}
+
+				return base.ConvertToUInt64(value);
+			}
+
+			public override Single ConvertToSingle(object value)
+			{
+				if (value is OracleDecimal)
+				{
+					var oraDecimal = (OracleDecimal)value;
+					return oraDecimal.IsNull? DefaultSingleNullValue: oraDecimal.ToSingle();
+				}
+
+				return base.ConvertToSingle(value);
+			}
+
+			public override Double ConvertToDouble(object value)
+			{
+				if (value is OracleDecimal)
+				{
+					var oraDecimal = (OracleDecimal)value;
+					return oraDecimal.IsNull? DefaultDoubleNullValue: oraDecimal.ToDouble();
+				}
+
+				return base.ConvertToDouble(value);
+			}
+
+			public override Boolean ConvertToBoolean(object value)
+			{
+				if (value is OracleDecimal)
+				{
+					var oraDecimal = (OracleDecimal)value;
+					return oraDecimal.IsNull? DefaultBooleanNullValue: (oraDecimal.Value != 0);
+				}
+
+				return base.ConvertToBoolean(value);
+			}
+
+			public override DateTime ConvertToDateTime(object value)
+			{
+				if (value is OracleDate)
+				{
+					var oraDate = (OracleDate)value;
+					return oraDate.IsNull? DefaultDateTimeNullValue: oraDate.Value;
+				}
+
+				return base.ConvertToDateTime(value);
+			}
+
+			public override Decimal ConvertToDecimal(object value)
+			{
+				if (value is OracleDecimal)
+				{
+					var oraDecimal = (OracleDecimal)value;
+					return oraDecimal.IsNull? DefaultDecimalNullValue: oraDecimal.Value;
+				}
+
+				return base.ConvertToDecimal(value);
+			}
+
+			public override Guid ConvertToGuid(object value)
+			{
+				if (value is OracleString)
+				{
+					var oraString = (OracleString)value;
+					return oraString.IsNull? DefaultGuidNullValue: new Guid(oraString.Value);
+				}
+
+				if (value is OracleBlob)
+				{
+					using (var oraBlob = (OracleBlob)value)
+						return oraBlob.IsNull? DefaultGuidNullValue: new Guid(oraBlob.Value);
+				}
+
+				return base.ConvertToGuid(value);
+			}
+
+			public override String ConvertToString(object value)
+			{
+				if (value is OracleString)
+				{
+					var oraString = (OracleString)value;
+					return oraString.IsNull? DefaultStringNullValue: oraString.Value;
+				}
+#if !MANAGED
+				if (value is OracleXmlType)
+				{
+					var oraXmlType = (OracleXmlType)value;
+					return oraXmlType.IsNull ? DefaultStringNullValue : oraXmlType.Value;
+				}
+#endif
+				if (value is OracleClob)
+				{
+					using (var oraClob = (OracleClob)value)
+						return oraClob.IsNull? DefaultStringNullValue: oraClob.Value;
+				}
+
+				return base.ConvertToString(value);
+			}
+
+#if !MANAGED
+			public override Stream ConvertToStream(object value)
+			{
+				if (value is OracleXmlType)
+				{
+					var oraXml = (OracleXmlType)value;
+					return oraXml.IsNull? DefaultStreamNullValue: oraXml.GetStream();
+				}
+
+				return base.ConvertToStream(value);
+			}
+
+			public override XmlReader ConvertToXmlReader(object value)
+			{
+				if (value is OracleXmlType)
+				{
+					var oraXml = (OracleXmlType)value;
+					return oraXml.IsNull? DefaultXmlReaderNullValue: oraXml.GetXmlReader();
+				}
+
+				return base.ConvertToXmlReader(value);
+			}
+
+			public override XmlDocument ConvertToXmlDocument(object value)
+			{
+				if (value is OracleXmlType)
+				{
+					var oraXml = (OracleXmlType)value;
+					return oraXml.IsNull? DefaultXmlDocumentNullValue: oraXml.GetXmlDocument();
+				}
+
+				return base.ConvertToXmlDocument(value);
+			}
+#endif
+
+			public override Byte[] ConvertToByteArray(object value)
+			{
+				if (value is OracleBlob)
+				{
+					using (var oraBlob = (OracleBlob)value)
+						return oraBlob.IsNull? null: oraBlob.Value;
+				}
+
+				if (value is OracleBinary)
+				{
+					var oraBinary = (OracleBinary)value;
+					return oraBinary.IsNull? null: oraBinary.Value;
+				}
+				
+				if (value is OracleBFile)
+				{
+					var oraBFile = (OracleBFile)value;
+					return oraBFile.IsNull? null: oraBFile.Value;
+				}
+
+				return base.ConvertToByteArray(value);
+			}
+
+			public override Char[] ConvertToCharArray(object value)
+			{
+				if (value is OracleString)
+				{
+					var oraString = (OracleString)value;
+					return oraString.IsNull? null: oraString.Value.ToCharArray();
+				}
+
+				if (value is OracleClob)
+				{
+					using (var oraClob = (OracleClob)value)
+						return oraClob.IsNull? null: oraClob.Value.ToCharArray();
+				}
+
+				return base.ConvertToCharArray(value);
+			}
+
+			#endregion
+
+			#region Nullable Types
+
+			[CLSCompliant(false)]
+			public override SByte? ConvertToNullableSByte(object value)
+			{
+				if (value is OracleDecimal)
+				{
+					var oraDecimal = (OracleDecimal)value;
+					return oraDecimal.IsNull? null: (SByte?)oraDecimal.Value;
+				}
+
+				return base.ConvertToNullableSByte(value);
+			}
+
+			public override Int16? ConvertToNullableInt16(object value)
+			{
+				if (value is OracleDecimal)
+				{
+					var oraDecimal = (OracleDecimal)value;
+					return oraDecimal.IsNull? null: (Int16?)oraDecimal.ToInt16();
+				}
+
+				return base.ConvertToNullableInt16(value);
+			}
+
+			public override Int32? ConvertToNullableInt32(object value)
+			{
+				if (value is OracleDecimal)
+				{
+					var oraDecimal = (OracleDecimal)value;
+					return oraDecimal.IsNull? null: (Int32?)oraDecimal.ToInt32();
+				}
+
+				return base.ConvertToNullableInt32(value);
+			}
+
+			public override Int64? ConvertToNullableInt64(object value)
+			{
+				if (value is OracleDecimal)
+				{
+					var oraDecimal = (OracleDecimal)value;
+					return oraDecimal.IsNull? null: (Int64?)oraDecimal.ToInt64();
+				}
+
+				return base.ConvertToNullableInt64(value);
+			}
+
+			public override Byte? ConvertToNullableByte(object value)
+			{
+				if (value is OracleDecimal)
+				{
+					var oraDecimal = (OracleDecimal)value;
+					return oraDecimal.IsNull? null: (Byte?)oraDecimal.ToByte();
+				}
+
+				return base.ConvertToNullableByte(value);
+			}
+
+			[CLSCompliant(false)]
+			public override UInt16? ConvertToNullableUInt16(object value)
+			{
+				if (value is OracleDecimal)
+				{
+					var oraDecimal = (OracleDecimal)value;
+					return oraDecimal.IsNull? null: (UInt16?)oraDecimal.Value;
+				}
+
+				return base.ConvertToNullableUInt16(value);
+			}
+
+			[CLSCompliant(false)]
+			public override UInt32? ConvertToNullableUInt32(object value)
+			{
+				if (value is OracleDecimal)
+				{
+					var oraDecimal = (OracleDecimal)value;
+					return oraDecimal.IsNull? null: (UInt32?)oraDecimal.Value;
+				}
+
+				return base.ConvertToNullableUInt32(value);
+			}
+
+			[CLSCompliant(false)]
+			public override UInt64? ConvertToNullableUInt64(object value)
+			{
+				if (value is OracleDecimal)
+				{
+					var oraDecimal = (OracleDecimal)value;
+					return oraDecimal.IsNull? null: (UInt64?)oraDecimal.Value;
+				}
+
+				return base.ConvertToNullableUInt64(value);
+			}
+
+			public override Single? ConvertToNullableSingle(object value)
+			{
+				if (value is OracleDecimal)
+				{
+					var oraDecimal = (OracleDecimal)value;
+					return oraDecimal.IsNull? null: (Single?)oraDecimal.ToSingle();
+				}
+
+				return base.ConvertToNullableSingle(value);
+			}
+
+			public override Double? ConvertToNullableDouble(object value)
+			{
+				if (value is OracleDecimal)
+				{
+					var oraDecimal = (OracleDecimal)value;
+					return oraDecimal.IsNull? null: (Double?)oraDecimal.ToDouble();
+				}
+
+				return base.ConvertToNullableDouble(value);
+			}
+
+			public override Boolean? ConvertToNullableBoolean(object value)
+			{
+				if (value is OracleDecimal)
+				{
+					var oraDecimal = (OracleDecimal)value;
+					return oraDecimal.IsNull? null: (Boolean?)(oraDecimal.Value != 0);
+				}
+
+				return base.ConvertToNullableBoolean(value);
+			}
+
+			public override DateTime? ConvertToNullableDateTime(object value)
+			{
+				if (value is OracleDate)
+				{
+					var oraDate = (OracleDate)value;
+					return oraDate.IsNull? null: (DateTime?)oraDate.Value;
+				}
+
+				return base.ConvertToNullableDateTime(value);
+			}
+
+			public override Decimal? ConvertToNullableDecimal(object value)
+			{
+				if (value is OracleDecimal)
+				{
+					var oraDecimal = (OracleDecimal)value;
+					return oraDecimal.IsNull? null: (Decimal?)oraDecimal.Value;
+				}
+
+				return base.ConvertToNullableDecimal(value);
+			}
+
+			public override Guid? ConvertToNullableGuid(object value)
+			{
+				if (value is OracleString)
+				{
+					var oraString = (OracleString)value;
+					return oraString.IsNull? null: (Guid?)new Guid(oraString.Value);
+				}
+
+				if (value is OracleBlob)
+				{
+					using (var oraBlob = (OracleBlob)value)
+						return oraBlob.IsNull? null: (Guid?)new Guid(oraBlob.Value);
+				}
+
+				return base.ConvertToNullableGuid(value);
+			}
+
+			#endregion
+
+			#endregion
+
+			public override object MapValueToEnum(object value, Type type)
+			{
+				if (value is OracleString)
+				{
+					var oracleValue = (OracleString)value;
+					value = oracleValue.IsNull? null: oracleValue.Value;
+				}
+				else if (value is OracleDecimal)
+				{
+					var oracleValue = (OracleDecimal)value;
+					if (oracleValue.IsNull)
+						value = null;
+					else 
+						value = oracleValue.Value;
+				}
+
+				return base.MapValueToEnum(value, type);
+			}
+
+			public override object MapValueToEnum(object value, MemberAccessor ma)
+			{
+				if (value is OracleString)
+				{
+					var oracleValue = (OracleString)value;
+					value = oracleValue.IsNull ? null : oracleValue.Value;
+				}
+				else if (value is OracleDecimal)
+				{
+					var oracleValue = (OracleDecimal)value;
+					if (oracleValue.IsNull)
+						value = null;
+					else
+						value = oracleValue.Value;
+				}
+
+				return base.MapValueToEnum(value, ma);
+			}
+
+			public override object ConvertChangeType(object value, Type conversionType)
+			{
+				// Handle OracleDecimal with IsNull == true case
+				//
+				return base.ConvertChangeType(IsNull(value)? null: value, conversionType);
+			}
+
+			public override bool IsNull(object value)
+			{
+				// ODP 10 does not expose this interface to public.
+				//
+				// return value is INullable && ((INullable)value).IsNull;
+
+				return
+					value is OracleDecimal?      ((OracleDecimal)     value).IsNull:
+					value is OracleString?       ((OracleString)      value).IsNull:
+					value is OracleDate?         ((OracleDate)        value).IsNull:
+					value is OracleTimeStamp?    ((OracleTimeStamp)   value).IsNull:
+					value is OracleTimeStampTZ?  ((OracleTimeStampTZ) value).IsNull:
+					value is OracleTimeStampLTZ? ((OracleTimeStampLTZ)value).IsNull:
+#if !MANAGED
+					value is OracleXmlType?      ((OracleXmlType)     value).IsNull:
+#endif
+					value is OracleBlob?         ((OracleBlob)        value).IsNull:
+					value is OracleClob?         ((OracleClob)        value).IsNull:
+					value is OracleBFile?        ((OracleBFile)       value).IsNull:
+					value is OracleBinary?       ((OracleBinary)      value).IsNull:
+					value is OracleIntervalDS?   ((OracleIntervalDS)  value).IsNull:
+					value is OracleIntervalYM?   ((OracleIntervalYM)  value).IsNull:
+						base.IsNull(value);
+			}
+		}
+
+		// TODO: implement via IDataReaderEx / DataReaderEx
+		//
+		public class OracleDataReaderMapper : DataReaderMapper
+		{
+			public OracleDataReaderMapper(MappingSchema mappingSchema, IDataReader dataReader)
+				: base(mappingSchema, dataReader)
+			{
+				_dataReader = dataReader is OracleDataReaderEx?
+					((OracleDataReaderEx)dataReader).DataReader:
+					(OracleDataReader)dataReader;
+			}
+
+			private readonly OracleDataReader _dataReader;
+
+			public override Type GetFieldType(int index)
+			{
+				var fieldType = _dataReader.GetProviderSpecificFieldType(index);
+
+				if (fieldType != typeof(OracleBlob)
+#if !MANAGED
+					&& fieldType != typeof(OracleXmlType)
+#endif
+					)
+					fieldType = _dataReader.GetFieldType(index);
+
+				return fieldType;
+			}
+
+			public override object GetValue(object o, int index)
+			{
+				var fieldType = _dataReader.GetProviderSpecificFieldType(index);
+
+#if !MANAGED
+				if (fieldType == typeof(OracleXmlType))
+				{
+					var xml = _dataReader.GetOracleXmlType(index);
+					return MappingSchema.ConvertToXmlDocument(xml);
+				}
+#endif
+				if (fieldType == typeof(OracleBlob))
+				{
+					var blob = _dataReader.GetOracleBlob(index);
+					return MappingSchema.ConvertToStream(blob);
+				}
+
+				return _dataReader.IsDBNull(index)? null:
+					_dataReader.GetValue(index);
+			}
+
+			public override Boolean  GetBoolean(object o, int index) { return MappingSchema.ConvertToBoolean(GetValue(o, index)); }
+			public override Char     GetChar   (object o, int index) { return MappingSchema.ConvertToChar   (GetValue(o, index)); }
+			public override Guid     GetGuid   (object o, int index) { return MappingSchema.ConvertToGuid   (GetValue(o, index)); }
+
+			[CLSCompliant(false)]
+			public override SByte    GetSByte  (object o, int index) { return  (SByte)_dataReader.GetDecimal(index); }
+			[CLSCompliant(false)]
+			public override UInt16   GetUInt16 (object o, int index) { return (UInt16)_dataReader.GetDecimal(index); }
+			[CLSCompliant(false)]
+			public override UInt32   GetUInt32 (object o, int index) { return (UInt32)_dataReader.GetDecimal(index); }
+			[CLSCompliant(false)]
+			public override UInt64   GetUInt64 (object o, int index) { return (UInt64)_dataReader.GetDecimal(index); }
+
+			public override Decimal  GetDecimal(object o, int index) { return OracleDecimal.SetPrecision(_dataReader.GetOracleDecimal(index), 28).Value; }
+
+			public override Boolean? GetNullableBoolean(object o, int index) { return MappingSchema.ConvertToNullableBoolean(GetValue(o, index)); }
+			public override Char?    GetNullableChar   (object o, int index) { return MappingSchema.ConvertToNullableChar   (GetValue(o, index)); }
+			public override Guid?    GetNullableGuid   (object o, int index) { return MappingSchema.ConvertToNullableGuid   (GetValue(o, index)); }
+
+			[CLSCompliant(false)]
+			public override SByte?   GetNullableSByte  (object o, int index) { return _dataReader.IsDBNull(index)? null:  (SByte?)_dataReader.GetDecimal(index); }
+			[CLSCompliant(false)]
+			public override UInt16?  GetNullableUInt16 (object o, int index) { return _dataReader.IsDBNull(index)? null: (UInt16?)_dataReader.GetDecimal(index); }
+			[CLSCompliant(false)]
+			public override UInt32?  GetNullableUInt32 (object o, int index) { return _dataReader.IsDBNull(index)? null: (UInt32?)_dataReader.GetDecimal(index); }
+			[CLSCompliant(false)]
+			public override UInt64?  GetNullableUInt64 (object o, int index) { return _dataReader.IsDBNull(index)? null: (UInt64?)_dataReader.GetDecimal(index); }
+
+			public override Decimal? GetNullableDecimal(object o, int index) { return _dataReader.IsDBNull(index)? (decimal?)null: OracleDecimal.SetPrecision(_dataReader.GetOracleDecimal(index), 28).Value; }
+		}
+
+		public class OracleScalarDataReaderMapper : ScalarDataReaderMapper
+		{
+			private readonly OracleDataReader _dataReader;
+
+			public OracleScalarDataReaderMapper(
+				MappingSchema        mappingSchema,
+				IDataReader          dataReader,
+				NameOrIndexParameter nameOrIndex)
+				: base(mappingSchema, dataReader, nameOrIndex)
+			{
+				_dataReader = dataReader is OracleDataReaderEx?
+					((OracleDataReaderEx)dataReader).DataReader:
+					(OracleDataReader)dataReader;
+
+				_fieldType = _dataReader.GetProviderSpecificFieldType(Index);
+
+				if (_fieldType != typeof(OracleBlob)
+#if !MANAGED
+					&& _fieldType != typeof(OracleXmlType)
+#endif
+					)
+					_fieldType = _dataReader.GetFieldType(Index);
+			}
+
+			private readonly Type _fieldType;
+
+			public override Type GetFieldType(int index)
+			{
+				return _fieldType;
+			}
+
+			public override object GetValue(object o, int index)
+			{
+#if !MANAGED
+				if (_fieldType == typeof(OracleXmlType))
+				{
+					var xml = _dataReader.GetOracleXmlType(Index);
+					return MappingSchema.ConvertToXmlDocument(xml);
+				}
+#endif
+				if (_fieldType == typeof(OracleBlob))
+				{
+					var blob = _dataReader.GetOracleBlob(Index);
+					return MappingSchema.ConvertToStream(blob);
+				}
+
+				return _dataReader.IsDBNull(index)? null:
+					_dataReader.GetValue(Index);
+			}
+
+			public override Boolean  GetBoolean(object o, int index) { return MappingSchema.ConvertToBoolean(GetValue(o, Index)); }
+			public override Char     GetChar   (object o, int index) { return MappingSchema.ConvertToChar   (GetValue(o, Index)); }
+			public override Guid     GetGuid   (object o, int index) { return MappingSchema.ConvertToGuid   (GetValue(o, Index)); }
+
+			[CLSCompliant(false)]
+			public override SByte    GetSByte  (object o, int index) { return  (SByte)_dataReader.GetDecimal(Index); }
+			[CLSCompliant(false)]
+			public override UInt16   GetUInt16 (object o, int index) { return (UInt16)_dataReader.GetDecimal(Index); }
+			[CLSCompliant(false)]
+			public override UInt32   GetUInt32 (object o, int index) { return (UInt32)_dataReader.GetDecimal(Index); }
+			[CLSCompliant(false)]
+			public override UInt64   GetUInt64 (object o, int index) { return (UInt64)_dataReader.GetDecimal(Index); }
+
+			public override Decimal  GetDecimal(object o, int index) { return OracleDecimal.SetPrecision(_dataReader.GetOracleDecimal(Index), 28).Value; }
+
+			public override Boolean? GetNullableBoolean(object o, int index) { return MappingSchema.ConvertToNullableBoolean(GetValue(o, Index)); }
+			public override Char?    GetNullableChar   (object o, int index) { return MappingSchema.ConvertToNullableChar   (GetValue(o, Index)); }
+			public override Guid?    GetNullableGuid   (object o, int index) { return MappingSchema.ConvertToNullableGuid   (GetValue(o, Index)); }
+
+			[CLSCompliant(false)]
+			public override SByte?   GetNullableSByte  (object o, int index) { return _dataReader.IsDBNull(index)? null:  (SByte?)_dataReader.GetDecimal(Index); }
+			[CLSCompliant(false)]
+			public override UInt16?  GetNullableUInt16 (object o, int index) { return _dataReader.IsDBNull(index)? null: (UInt16?)_dataReader.GetDecimal(Index); }
+			[CLSCompliant(false)]
+			public override UInt32?  GetNullableUInt32 (object o, int index) { return _dataReader.IsDBNull(index)? null: (UInt32?)_dataReader.GetDecimal(Index); }
+			[CLSCompliant(false)]
+			public override UInt64?  GetNullableUInt64 (object o, int index) { return _dataReader.IsDBNull(index)? null: (UInt64?)_dataReader.GetDecimal(Index); }
+
+			public override Decimal? GetNullableDecimal(object o, int index) { return _dataReader.IsDBNull(index)? (decimal?)null: OracleDecimal.SetPrecision(_dataReader.GetOracleDecimal(Index), 28).Value; }
+		}
+
+		[Mixin(typeof(IDbDataParameter), "_oracleParameter")]
+		[Mixin(typeof(IDataParameter),   "_oracleParameter")]
+		[Mixin(typeof(IDisposable),      "_oracleParameter")]
+		[Mixin(typeof(ICloneable),       "_oracleParameter")]
+		[CLSCompliant(false)]
+		public abstract class OracleParameterWrap
+		{
+			protected OracleParameter _oracleParameter;
+			public    OracleParameter  OracleParameter
+			{
+				get { return _oracleParameter; }
+			}
+
+			public static IDbDataParameter CreateInstance(OracleParameter oraParameter)
+			{
+				var wrap = TypeAccessor<OracleParameterWrap>.CreateInstanceEx();
+
+				wrap._oracleParameter = oraParameter;
+
+				return (IDbDataParameter)wrap;
+			}
+
+			public override string ToString()
+			{
+				return _oracleParameter.ToString();
+			}
+
+			///<summary>
+			///Gets or sets the value of the parameter.
+			///</summary>
+			///<returns>
+			///An <see cref="T:System.Object"/> that is the value of the parameter.
+			///The default value is null.
+			///</returns>
+			protected object Value
+			{
+#if CONVERTORACLETYPES
+				[MixinOverride]
+				get
+				{
+					object value = _oracleParameter.Value;
+					if (value is OracleBinary)
+					{
+						OracleBinary oracleValue = (OracleBinary)value;
+						return oracleValue.IsNull? null: oracleValue.Value;
+					}
+					if (value is OracleDate)
+					{
+						OracleDate oracleValue = (OracleDate)value;
+						if (oracleValue.IsNull)
+							return null;
+						return oracleValue.Value;
+					}
+					if (value is OracleDecimal)
+					{
+						OracleDecimal oracleValue = (OracleDecimal)value;
+						if (oracleValue.IsNull)
+							return null;
+						return oracleValue.Value;
+					}
+					if (value is OracleIntervalDS)
+					{
+						OracleIntervalDS oracleValue = (OracleIntervalDS)value;
+						if (oracleValue.IsNull)
+							return null;
+						return oracleValue.Value;
+					}
+					if (value is OracleIntervalYM)
+					{
+						OracleIntervalYM oracleValue = (OracleIntervalYM)value;
+						if (oracleValue.IsNull)
+							return null;
+						return oracleValue.Value;
+					}
+					if (value is OracleString)
+					{
+						OracleString oracleValue = (OracleString)value;
+						return oracleValue.IsNull? null: oracleValue.Value;
+					}
+					if (value is OracleTimeStamp)
+					{
+						OracleTimeStamp oracleValue = (OracleTimeStamp)value;
+						if (oracleValue.IsNull)
+							return null;
+						return oracleValue.Value;
+					}
+					if (value is OracleTimeStampLTZ)
+					{
+						OracleTimeStampLTZ oracleValue = (OracleTimeStampLTZ)value;
+						if (oracleValue.IsNull)
+							return null;
+						return oracleValue.Value;
+					}
+					if (value is OracleTimeStampTZ)
+					{
+						OracleTimeStampTZ oracleValue = (OracleTimeStampTZ)value;
+						if (oracleValue.IsNull)
+							return null;
+						return oracleValue.Value;
+					}
+					if (value is OracleXmlType)
+					{
+						OracleXmlType oracleValue = (OracleXmlType)value;
+						return oracleValue.IsNull? null: oracleValue.Value;
+					}
+
+					return value;
+				}
+#endif
+				[MixinOverride]
+				set
+				{
+					if (null != value)
+					{
+						if (value is Guid)
+						{
+							// Fix Oracle.Net bug #6: guid type is not handled
+							//
+							value = ((Guid)value).ToByteArray();
+						}
+						else if (value is Array && !(value is byte[] || value is char[]))
+						{
+							_oracleParameter.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
+						}
+						else if (value is IConvertible)
+						{
+							var convertible = (IConvertible)value;
+							var typeCode   = convertible.GetTypeCode();
+
+							switch (typeCode)
+							{
+								case TypeCode.Boolean:
+									// Fix Oracle.Net bug #7: bool type is handled wrong
+									//
+									value = convertible.ToByte(null);
+									break;
+
+								case TypeCode.SByte:
+								case TypeCode.UInt16:
+								case TypeCode.UInt32:
+								case TypeCode.UInt64:
+									// Fix Oracle.Net bug #8: some integer types are handled wrong
+									//
+									value = convertible.ToDecimal(null);
+									break;
+
+									// Fix Oracle.Net bug #10: zero-length string can not be converted to
+									// ORAXML type, but null value can be.
+									//
+								case TypeCode.String:
+									if (((string)value).Length == 0)
+										value = null;
+									break;
+
+								default:
+									// Fix Oracle.Net bug #5: Enum type is not handled
+									//
+									if (value is Enum)
+									{
+										// Convert a Enum value to it's underlying type.
+										//
+										value = System.Convert.ChangeType(value, typeCode);
+									}
+									break;
+							}
+						}
+					}
+
+					_oracleParameter.Value = value;
+				}
+			}
+		}
+
+		#endregion
+
+		#region InsertBatch
+
+		public override int InsertBatch<T>(
+			DbManager      db,
+			string         insertText,
+			IEnumerable<T> collection,
+			MemberMapper[] members,
+			int            maxBatchSize,
+			DbManager.ParameterProvider<T> getParameters)
+		{
+			var sb  = new StringBuilder();
+			var sp  = new OracleSqlProvider();
+			var pn  = 0;
+			var n   = 0;
+			var cnt = 0;
+			var str = "\t" + insertText
+				.Substring(0, insertText.IndexOf(") VALUES ("))
+				.Substring(7)
+				.Replace("\r", "")
+				.Replace("\n", "")
+				.Replace("\t", " ")
+				.Replace("( ", "(")
+				//.Replace("  ", " ")
+				+ ") VALUES (";
+
+			var parameters = new List<IDbDataParameter>();
+
+			foreach (var item in collection)
+			{
+				if (sb.Length == 0)
+					sb.AppendLine("INSERT ALL");
+
+				sb.Append(str);
+
+				foreach (var member in members)
+				{
+					var value = member.GetValue(item);
+
+					if (value != null && value.GetType().IsEnum)
+						value = MappingSchema.MapEnumToValue(value, true);
+
+					if (value is Nullable<DateTime>)
+						value = ((DateTime?)value).Value;
+
+					if (value is DateTime)
+					{
+						var dt = (DateTime)value;
+						sb.Append(string.Format("to_timestamp('{0:dd.MM.yyyy HH:mm:ss.ffffff}', 'DD.MM.YYYY HH24:MI:SS.FF6')", dt));
+					}
+					else if (value is string && ((string)value).Length >= 2000)
+					{
+						var par = db.Parameter("p" + ++pn, value);
+						parameters.Add(par);
+						sb.Append(":" + par.ParameterName);
+					}
+					else
+						sp.BuildValue(sb, value);
+
+					sb.Append(", ");
+				}
+
+				sb.Length -= 2;
+				sb.AppendLine(")");
+
+				n++;
+
+				if (n >= maxBatchSize)
+				{
+					sb.AppendLine("SELECT * FROM dual");
+
+					var sql = sb.ToString();
+
+					if (DbManager.TraceSwitch.TraceInfo)
+						DbManager.WriteTraceLine("\n" + sql.Replace("\r", ""), DbManager.TraceSwitch.DisplayName);
+
+					cnt += db
+						.SetCommand(sql, parameters.Count > 0 ? parameters.ToArray() : null)
+						.ExecuteNonQuery();
+
+					parameters.Clear();
+					pn = 0;
+					n  = 0;
+					sb.Length = 0;
+				}
+			}
+
+			if (n > 0)
+			{
+				sb.AppendLine("SELECT * FROM dual");
+
+				var sql = sb.ToString();
+
+				if (DbManager.TraceSwitch.TraceInfo)
+					DbManager.WriteTraceLine("\n" + sql.Replace("\r", ""), DbManager.TraceSwitch.DisplayName);
+
+				cnt += db
+					.SetCommand(sql, parameters.Count > 0 ? parameters.ToArray() : null)
+					.ExecuteNonQuery();
+			}
+
+			return cnt;
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/OleDbDataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,154 @@
+using System;
+using System.Data;
+using System.Data.Common;
+using System.Data.OleDb;
+
+namespace BLToolkit.Data.DataProvider
+{
+	using Sql.SqlProvider;
+
+	/// <summary>
+	/// Implements access to the Data Provider for OLE DB.
+	/// </summary>
+	/// <remarks>
+	/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+	/// </remarks>
+	/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+	public class OleDbDataProvider : DataProviderBase
+	{
+		/// <summary>
+		/// Creates the database connection object.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <returns>The database connection object.</returns>
+		public override IDbConnection CreateConnectionObject()
+		{
+			return new OleDbConnection();
+		}
+
+		/// <summary>
+		/// Creates the data adapter object.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <returns>A data adapter object.</returns>
+		public override DbDataAdapter CreateDataAdapterObject()
+		{
+			return new OleDbDataAdapter();
+		}
+
+		/// <summary>
+		/// Populates the specified <see cref="IDbCommand"/> object's Parameters collection with 
+		/// parameter information for the stored procedure specified in the <see cref="IDbCommand"/>.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <param name="command">The <see cref="IDbCommand"/> referencing the stored procedure for which 
+		/// the parameter information is to be derived. The derived parameters will be 
+		/// populated into the Parameters of this command.</param>
+		public override bool DeriveParameters(IDbCommand command)
+		{
+			OleDbCommandBuilder.DeriveParameters((OleDbCommand)command);
+			return true;
+		}
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			switch (convertType)
+			{
+				case ConvertType.NameToQueryParameter:
+				case ConvertType.NameToCommandParameter:
+				case ConvertType.NameToSprocParameter:
+					return "@" + value;
+
+				case ConvertType.NameToQueryField:
+				case ConvertType.NameToQueryFieldAlias:
+				case ConvertType.NameToQueryTableAlias:
+					{
+						var name = value.ToString();
+
+						if (name.Length > 0 && name[0] == '[')
+							return value;
+					}
+
+					return "[" + value + "]";
+
+				case ConvertType.NameToDatabase:
+				case ConvertType.NameToOwner:
+				case ConvertType.NameToQueryTable:
+					{
+						var name = value.ToString();
+
+						if (name.Length > 0 && name[0] == '[')
+							return value;
+
+						if (name.IndexOf('.') > 0)
+							value = string.Join("].[", name.Split('.'));
+					}
+
+					return "[" + value + "]";
+
+				case ConvertType.SprocParameterToName:
+					if (value != null)
+					{
+						var str = value.ToString();
+						return str.Length > 0 && str[0] == '@'? str.Substring(1): str;
+					}
+
+					break;
+
+				case ConvertType.ExceptionToErrorNumber:
+					if (value is OleDbException)
+					{
+						var ex = (OleDbException)value;
+						if (ex.Errors.Count > 0)
+							return ex.Errors[0].NativeError;
+					}
+
+					break;
+			}
+
+			return value;
+		}
+
+		public override ISqlProvider CreateSqlProvider()
+		{
+			throw new NotSupportedException();
+		}
+
+		/// <summary>
+		/// Returns connection type.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <value>An instance of the <see cref="Type"/> class.</value>
+		public override Type ConnectionType
+		{
+			get { return typeof(OleDbConnection); }
+		}
+
+		public const string NameString = DataProvider.ProviderName.OleDb;
+
+		/// <summary>
+		/// Returns the data provider name.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataProvider Method</seealso>
+		/// <value>Data provider name.</value>
+		public override string Name
+		{
+			get { return NameString; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/OracleDataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,147 @@
+using System;
+using System.Data;
+using System.Data.Common;
+using System.Data.OracleClient;
+using System.Globalization;
+
+namespace BLToolkit.Data.DataProvider
+{
+	using Sql.SqlProvider;
+
+#if FW4
+	[Obsolete("OracleDataProvider has been deprecated. http://go.microsoft.com/fwlink/?LinkID=144260")]
+#pragma warning disable 0618
+#endif
+	/// <summary>
+	/// Implements access to the Data Provider for Oracle.
+	/// </summary>
+	/// <remarks>
+	/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+	/// </remarks>
+	/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+	public sealed class OracleDataProvider : DataProviderBase
+	{
+		private string _parameterPrefix = "P";
+		public  string  ParameterPrefix
+		{
+			get { return _parameterPrefix; }
+			set
+			{
+				_parameterPrefix = string.IsNullOrEmpty(value)? null:
+					value.ToUpper(CultureInfo.InvariantCulture);
+			}
+		}
+
+		/// <summary>
+		/// Creates the database connection object.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <returns>The database connection object.</returns>
+		public override IDbConnection CreateConnectionObject()
+		{
+			return new OracleConnection();
+		}
+
+		/// <summary>
+		/// Creates the data adapter object.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <returns>A data adapter object.</returns>
+		public override DbDataAdapter CreateDataAdapterObject()
+		{
+			return new OracleDataAdapter();
+		}
+
+		/// <summary>
+		/// Populates the specified <see cref="IDbCommand"/> object's Parameters collection with 
+		/// parameter information for the stored procedure specified in the <see cref="IDbCommand"/>.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <param name="command">The <see cref="IDbCommand"/> referencing the stored procedure for which the parameter information is to be derived. The derived parameters will be populated into the Parameters of this command.</param>
+		public override bool DeriveParameters(IDbCommand command)
+		{
+			OracleCommandBuilder.DeriveParameters((OracleCommand)command);
+			return true;
+		}
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			switch (convertType)
+			{
+				case ConvertType.NameToCommandParameter:
+				case ConvertType.NameToSprocParameter:
+					return ParameterPrefix == null? value: ParameterPrefix + value;
+
+				case ConvertType.SprocParameterToName:
+					var name = (string)value;
+
+					if (name.Length > 0)
+					{
+						if (name[0] == ':')
+							return name.Substring(1);
+
+						if (ParameterPrefix != null &&
+							name.ToUpper(CultureInfo.InvariantCulture).StartsWith(ParameterPrefix))
+						{
+							return name.Substring(ParameterPrefix.Length);
+						}
+					}
+
+					break;
+
+				case ConvertType.ExceptionToErrorNumber:
+					if (value is OracleException)
+						return ((OracleException)value).Code;
+					break;
+			}
+
+			return SqlProvider.Convert(value, convertType);
+		}
+
+		/// <summary>
+		/// Returns connection type.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <value>An instance of the <see cref="Type"/> class.</value>
+		public override Type ConnectionType
+		{
+			get { return typeof(OracleConnection); }
+		}
+
+		public const string NameString = "Oracle";
+
+		/// <summary>
+		/// Returns the data provider name.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataProvider Method</seealso>
+		/// <value>Data provider name.</value>
+		public override string Name
+		{
+			get { return NameString; }
+		}
+
+		public override ISqlProvider CreateSqlProvider()
+		{
+			return new OracleSqlProvider();
+		}
+	}
+
+#if FW4
+#pragma warning restore 0618
+#endif
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/OracleHelper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,250 @@
+using System;
+using System.Data;
+using System.Diagnostics;
+using System.Globalization;
+using System.Text.RegularExpressions;
+
+namespace BLToolkit.Data.DataProvider
+{
+    public static class OracleHelper
+    {
+        #region Text
+
+        /// <summary>
+        /// If value is null or empty, return NULL or the value converted for Oracle SQL query
+        /// </summary>
+        /// <param name="value">Text</param>
+        /// <returns>Text converted for oracle query</returns>
+        public static string SqlConvertString(string value)
+        {
+            if (!string.IsNullOrEmpty(value))
+            {
+                value = value.Replace("'", "''");
+                value = value.Replace("&", "' || '&' || '");
+
+                return "'" + value + "'";
+            }
+
+            return string.IsNullOrWhiteSpace(value) ? "NULL" : value;
+        }
+
+        #endregion
+
+        #region Date & Time
+
+        /// <summary>
+        /// Convert DateTime to TO_DATE('value','YYYYMMDD')
+        /// </summary>
+        /// <param name="value">Date</param>
+        /// <returns>Date converted for oracle query</returns>
+        public static string SqlConvertDate(DateTime value)
+        {
+            return string.Format("TO_DATE('{0}','YYYYMMDD')", value.ToString("yyyyMMdd"));
+        }
+
+        /// <summary>
+        /// Convert DateTime to TO_DATE('value','YYYYMMDDHH24MISS')
+        /// </summary>
+        /// <param name="value">DateTime</param>
+        /// <returns>DateTime converted for oracle query</returns>
+        public static string SqlConvertDateTime(DateTime value)
+        {
+            return string.Format("TO_DATE('{0}','YYYYMMDDHH24MISS')", value.ToString("yyyyMMddHHmmss"));
+        }
+
+        /// <summary>
+        /// Convert DateTime to TO_TIMESTAMP('value','YYYYMMDDHH24MISSFF3')
+        /// </summary>
+        /// <param name="value">DateTime</param>
+        /// <returns>DateTime converted for oracle query</returns>
+        public static string SqlConvertTimeStamp(DateTime value)
+        {
+            return string.Format("TO_TIMESTAMP('{0}','YYYYMMDDHH24MISSFF3')", value.ToString("yyyyMMddHHmmssfff"));
+        }
+
+        /// <summary>
+        /// Convert DateTime to TO_CHAR(TO_DATE('value','YYYYMMDD')))
+        /// </summary>
+        /// <param name="value">DateTime</param>
+        /// <returns>DateTime converted for oracle query</returns>
+        public static string SqlConvertDateToChar(DateTime value)
+        {
+            return string.Format("TO_CHAR(TO_DATE('{0}','YYYYMMDD'))", value.ToString("yyyyMMdd"));
+        }
+
+        #endregion
+
+        #region Connection string
+
+        /// <summary>
+        /// Generate the minimum connection string. The connection string looks like
+        /// Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = server)(PORT = port)))(CONNECT_DATA = (SID = sid)));User Id=username;Password=password;
+        /// </summary>
+        /// <param name="userName">Username</param>
+        /// <param name="password">Password</param>
+        /// <param name="server">Server name</param>
+        /// <param name="sid">Database SID</param>
+        /// <param name="port">Port of the server. Default value is 1521</param>
+        /// <returns>Default connection string</returns>
+        public static string GetFullConnectionString(string userName, string password, string server, string sid, int port = 1521)
+        {
+            return
+                string.Format(
+                    "Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = {0})(PORT = {1})))(CONNECT_DATA = (SID = {2})));User Id={3};Password={4};",
+                    server, port, sid, userName, password);
+        }
+        
+                /// <summary>
+        /// Generate the minimum connection string. The connection string looks like
+        /// Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = server)(PORT = port)))(CONNECT_DATA = (SID = sid)));User Id=username;Password=password;Pooling=False;
+        /// </summary>
+        /// <param name="userName">Username</param>
+        /// <param name="password">Password</param>
+        /// <param name="server">Server name</param>
+        /// <param name="sid">Database SID</param>
+        /// <param name="port">Port of the server. Default value is 1521</param>
+        /// <returns>Default connection string</returns>
+        public static string GetFullConnectionStringWithoutPooling(string userName, string password, string server, string sid, int port = 1521)
+        {
+            return
+                string.Format(
+                    "Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = {0})(PORT = {1})))(CONNECT_DATA = (SID = {2})));User Id={3};Password={4};Pooling=False;",
+                    server, port, sid, userName, password);
+        }
+
+        /// <summary>
+        /// Generate the minimum connection string. The connection string looks like
+        /// Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = server)(PORT = port)))(CONNECT_DATA = (SID = sid)));User Id=username;Password=password;Connection Timeout=timeout;
+        /// </summary>
+        /// <param name="userName">Username</param>
+        /// <param name="password">Password</param>
+        /// <param name="server">Server name</param>
+        /// <param name="sid">Database SID</param>
+        /// <param name="port">Port of the server. Default value is 1521</param>
+        /// <returns>Default connection string</returns>
+        public static string GetFullConnectionString(string userName, string password, string server, string sid,
+                                                     TimeSpan timeOut, int port = 1521)
+        {
+            return
+                string.Format(
+                    "Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = {0})(PORT = {1})))(CONNECT_DATA = (SID = {2})));User Id={3};Password={4};Connection Timeout={5};",
+                    server, port, sid, userName, password, (int)timeOut.TotalSeconds);
+        }
+        
+                /// <summary>
+        /// Generate the minimum connection string. The connection string looks like
+        /// Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = server)(PORT = port)))(CONNECT_DATA = (SID = sid)));User Id=username;Password=password;Connection Timeout=timeout;Pooling=False;
+        /// </summary>
+        /// <param name="userName">Username</param>
+        /// <param name="password">Password</param>
+        /// <param name="server">Server name</param>
+        /// <param name="sid">Database SID</param>
+        /// <param name="port">Port of the server. Default value is 1521</param>
+        /// <returns>Default connection string</returns>
+        public static string GetFullConnectionStringWithoutPooling(string userName, string password, string server, string sid,
+                                                     TimeSpan timeOut, int port = 1521)
+        {
+            return
+                string.Format(
+                    "Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = {0})(PORT = {1})))(CONNECT_DATA = (SID = {2})));User Id={3};Password={4};Connection Timeout={5};Pooling=False;",
+                    server, port, sid, userName, password, (int)timeOut.TotalSeconds);
+        }
+
+        /// <summary>
+        /// Generate the minimum connection string. The connection string looks like
+        /// Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = server)(PORT = port)))(CONNECT_DATA = (SID = sid)));User Id=username;Password=password;Connection Timeout=timeout;
+        /// </summary>
+        /// <param name="userName">Username</param>
+        /// <param name="password">Password</param>
+        /// <param name="server">Server name</param>
+        /// <param name="sid">Database SID</param>
+        /// <param name="port">Port of the server. Default value is 1521</param>
+        /// <returns>Default connection string</returns>
+        public static string GetFullConnectionString(string userName, string password, string server, string sid, int timeOutInSecond, int port = 1521)
+        {
+            return GetFullConnectionString(userName, password, server, sid, TimeSpan.FromSeconds(timeOutInSecond), port);
+        }
+
+        #endregion
+
+        public static string Interpret(IDbCommand poCommand)
+        {
+            if (poCommand.Parameters.Count == 0)
+                return poCommand.CommandText;
+
+            var oRegex = new Regex(@"(?<string>'[^']+')|(?<Parameters>:[a-zA-Z0-9_]+)");
+            MatchCollection oMatchCollection = oRegex.Matches(poCommand.CommandText);
+
+            string strQuery = poCommand.CommandText + " ";
+            int matchCount = 0;
+
+            for (int i = 0; i < oMatchCollection.Count; i++)
+            {
+                if (oMatchCollection[i].Groups["string"].Success)
+                    continue;
+
+                string strParameter = oMatchCollection[i].Groups["Parameters"].Captures[0].Value;
+
+                var param = (IDbDataParameter)poCommand.Parameters[matchCount];
+                if (param.Value is DateTime)
+                {
+                    var dt = (DateTime)param.Value;
+
+                    strQuery = strQuery.Replace(strParameter + " ",
+                                                dt.Date == dt
+                                                    ? SqlConvertDate(dt) + " "
+                                                    : SqlConvertDateTime(dt) + " ");
+                }
+                else if (param.Value is string)
+                    strQuery = strQuery.Replace(strParameter, SqlConvertString(param.Value.ToString()) + " ");
+                else if (param.Value is Int16)
+                    strQuery = strQuery.Replace(strParameter, ((Int16)param.Value).ToString(CultureInfo.InvariantCulture) + " ");
+                else if (param.Value is Int32)
+                    strQuery = strQuery.Replace(strParameter, ((Int32)param.Value).ToString(CultureInfo.InvariantCulture) + " ");
+                else if (param.Value is Int64)
+                    strQuery = strQuery.Replace(strParameter, ((Int64)param.Value).ToString(CultureInfo.InvariantCulture) + " ");
+                else if (param.Value is decimal)
+                    strQuery = strQuery.Replace(strParameter, ((decimal)param.Value).ToString(CultureInfo.InvariantCulture) + " ");
+                else if (param.Value is float)
+                    strQuery = strQuery.Replace(strParameter, ((float)param.Value).ToString(CultureInfo.InvariantCulture) + " ");
+                else if (param.Value is double)
+                    strQuery = strQuery.Replace(strParameter, ((double)param.Value).ToString(CultureInfo.InvariantCulture) + " ");
+                else if (param.Value is TimeSpan)
+                    strQuery = strQuery.Replace(strParameter, "'" + ((TimeSpan)param.Value).ToString() + "' ");
+                else
+                    throw new NotImplementedException(param.Value.GetType() + " is not implemented yet.");
+
+                matchCount++;
+            }
+
+            if (matchCount != poCommand.Parameters.Count)
+            {
+                // ReSharper disable InvocationIsSkipped
+                Debug.WriteLine(
+                    "Number of parameters in query is not equals to number of parameters set in the command object " +
+                    poCommand.CommandText);
+                // ReSharper restore InvocationIsSkipped
+                var msg =
+                    "Number of parameters in query is not equals to number of parameters set in the command object : " + poCommand.CommandText + "\r\n" +
+                    "Query params :\r\n";
+
+                foreach (Match match in oMatchCollection)
+                {
+                    msg += "\t" + match.Value + "\r\n";
+                }
+
+                msg += "\nCommand params :\r\n";
+
+                foreach (IDataParameter param in poCommand.Parameters)
+                {
+                    msg += "\t" + param.ParameterName + " = " + Convert.ToString(param) + "\r\n";
+                }
+
+                throw new Exception(msg);
+            }
+
+            return strQuery;
+        }
+
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/PostgreSQLDataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,333 @@
+using System;
+using System.Data;
+using System.Data.Common;
+
+using Npgsql;
+
+namespace BLToolkit.Data.DataProvider
+{
+	using Sql.SqlProvider;
+	using BLToolkit.Mapping;
+
+	public class PostgreSQLDataProvider : DataProviderBase
+	{
+		#region Configurable
+
+		public enum CaseConvert
+		{
+			None,
+			Lower,
+			Upper
+		}
+
+		public static CaseConvert QueryCaseConvert = CaseConvert.None;
+
+		public static bool QuoteIdentifiers
+		{
+			get { return PostgreSQLSqlProvider.QuoteIdentifiers; }
+			set { PostgreSQLSqlProvider.QuoteIdentifiers = value; }
+		}
+
+		public override void Configure(System.Collections.Specialized.NameValueCollection attributes)
+		{
+			var quoteIdentifiers = attributes["QuoteIdentifiers"];
+
+			if (quoteIdentifiers != null)
+				QuoteIdentifiers = Common.Convert.ToBoolean(quoteIdentifiers);
+
+			var queryCaseConcert = attributes["QueryCaseConvert"];
+			if (queryCaseConcert != null)
+			{
+				try
+				{
+					QueryCaseConvert = (CaseConvert)Enum.Parse(typeof(CaseConvert), queryCaseConcert, true);
+				}
+				catch { }
+			}
+
+			base.Configure(attributes);
+		}
+
+		#endregion
+
+		public override IDbConnection CreateConnectionObject()
+		{
+			return new NpgsqlConnection();
+		}
+
+		public override DbDataAdapter CreateDataAdapterObject()
+		{
+			return new NpgsqlDataAdapter();
+		}
+
+		public override bool DeriveParameters(IDbCommand command)
+		{
+			NpgsqlCommandBuilder.DeriveParameters((NpgsqlCommand)command);
+			return true;
+		}
+
+		public override void SetParameterValue(IDbDataParameter parameter, object value)
+		{
+			if(value is Enum)
+			{
+				var type = Enum.GetUnderlyingType(value.GetType());
+				value = (MappingSchema ?? Map.DefaultSchema).ConvertChangeType(value, type);
+
+			}
+			base.SetParameterValue(parameter, value);
+		}
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			switch (convertType)
+			{
+				case ConvertType.ExceptionToErrorNumber:
+					if (value is NpgsqlException)
+					{
+						var ex = (NpgsqlException)value;
+
+						foreach (NpgsqlError error in ex.Errors)
+							return error.Code;
+
+						return 0;
+					}
+
+					break;
+			}
+
+			return SqlProvider.Convert(value, convertType);
+		}
+
+		public override Type ConnectionType
+		{
+			get { return typeof(NpgsqlConnection); }
+		}
+
+		public override string Name
+		{
+			get { return DataProvider.ProviderName.PostgreSQL; }
+		}
+
+		public override int MaxBatchSize
+		{
+			get { return 0; }
+		}
+
+		public override ISqlProvider CreateSqlProvider()
+		{
+			return new PostgreSQLSqlProvider();
+		}
+
+		public override void PrepareCommand(ref CommandType commandType, ref string commandText, ref IDbDataParameter[] commandParameters)
+		{
+			if (QueryCaseConvert == CaseConvert.Lower)
+				commandText = commandText.ToLower();
+			else if (QueryCaseConvert == CaseConvert.Upper)
+				commandText = commandText.ToUpper();
+
+			base.PrepareCommand(ref commandType, ref commandText, ref commandParameters);
+		}
+
+		public override bool CanReuseCommand(IDbCommand command, CommandType newCommandType)
+		{
+			return command.CommandType == newCommandType;
+		}
+
+		public override IDataReader GetDataReader(MappingSchema schema, IDataReader dataReader)
+		{
+			return
+				dataReader is NpgsqlDataReader
+					? new NpgsqlDataReaderEx(schema, (NpgsqlDataReader)dataReader)
+					: base.GetDataReader(schema, dataReader);
+		}
+
+		class NpgsqlDataReaderEx : IDataReader
+		{
+			private readonly NpgsqlDataReader _reader;
+			private readonly MappingSchema _schema;
+
+			public NpgsqlDataReaderEx(MappingSchema schema, NpgsqlDataReader reader)
+			{
+				_reader = reader;
+				_schema = schema;
+			}
+
+			#region IDataReader Members
+
+			public void Close()
+			{
+				_reader.Close();
+			}
+
+			public int Depth
+			{
+				get { return _reader.Depth; }
+			}
+
+			public DataTable GetSchemaTable()
+			{
+				return _reader.GetSchemaTable();
+			}
+
+			public bool IsClosed
+			{
+				get { return _reader.IsClosed; }
+			}
+
+			public bool NextResult()
+			{
+				return _reader.NextResult();
+			}
+
+			public bool Read()
+			{
+				return _reader.Read();
+			}
+
+			public int RecordsAffected
+			{
+				get { return _reader.RecordsAffected; }
+			}
+
+			#endregion
+
+			#region IDisposable Members
+
+			public void Dispose()
+			{
+				_reader.Dispose();
+			}
+
+			#endregion
+
+			#region IDataRecord Members
+
+			public int FieldCount
+			{
+				get { return _reader.FieldCount; }
+			}
+
+			public bool GetBoolean(int i)
+			{
+				return _reader.GetBoolean(i);
+			}
+
+			public byte GetByte(int i)
+			{
+				return _schema.ConvertToByte(_reader.GetValue(i));
+			}
+
+			public long GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length)
+			{
+				return _reader.GetBytes(i, fieldOffset, buffer, bufferoffset, length);
+			}
+
+			public char GetChar(int i)
+			{
+				return _reader.GetChar(i);
+			}
+
+			public long GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length)
+			{
+				return _reader.GetChars(i, fieldoffset, buffer, bufferoffset, length);
+			}
+
+			public IDataReader GetData(int i)
+			{
+				return _reader.GetData(i);
+			}
+
+			public string GetDataTypeName(int i)
+			{
+				return _reader.GetDataTypeName(i);
+			}
+
+			public DateTime GetDateTime(int i)
+			{
+				return _reader.GetDateTime(i);
+			}
+
+			public decimal GetDecimal(int i)
+			{
+				return _reader.GetDecimal(i);
+			}
+
+			public double GetDouble(int i)
+			{
+				return _reader.GetDouble(i);
+			}
+
+			public Type GetFieldType(int i)
+			{
+				return _reader.GetFieldType(i);
+			}
+
+			public float GetFloat(int i)
+			{
+				return _reader.GetFloat(i);
+			}
+
+			public Guid GetGuid(int i)
+			{
+				return _reader.GetGuid(i);
+			}
+
+			public short GetInt16(int i)
+			{
+				return _reader.GetInt16(i);
+			}
+
+			public int GetInt32(int i)
+			{
+				return _reader.GetInt32(i);
+			}
+
+			public long GetInt64(int i)
+			{
+				return _reader.GetInt64(i);
+			}
+
+			public string GetName(int i)
+			{
+				return _reader.GetName(i);
+			}
+
+			public int GetOrdinal(string name)
+			{
+				return _reader.GetOrdinal(name);
+			}
+
+			public string GetString(int i)
+			{
+				return _reader.GetString(i);
+			}
+
+			public object GetValue(int i)
+			{
+				return _reader.GetValue(i);
+			}
+
+			public int GetValues(object[] values)
+			{
+				return _reader.GetValues(values);
+			}
+
+			public bool IsDBNull(int i)
+			{
+				return _reader.IsDBNull(i);
+			}
+
+			public object this[string name]
+			{
+				get { return _reader[name]; }
+			}
+
+			public object this[int i]
+			{
+				get { return _reader[i]; }
+			}
+
+			#endregion
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/ProviderName.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,41 @@
+namespace BLToolkit.Data.DataProvider
+{
+	public static class ProviderName
+	{
+		public const string Access        = "Access";
+		public const string DB2           = "DB2";
+		public const string Firebird      = "Fdp";
+		public const string Informix      = "Informix";
+		public const string MsSql         = "Sql";
+		public const string MsSql2000     = "MsSql2000";
+		public const string MsSql2005     = "MsSql2005";
+		public const string MsSql2008     = "MsSql2008";
+		public const string MsSql2012     = "MsSql2012";
+		public const string MySql         = "MySql";
+		public const string Odbc          = "Odbc";
+		public const string OleDb         = "OleDb";
+		public const string Oracle        = "Odp";
+		public const string OracleManaged = "OdpManaged";
+		public const string PostgreSQL    = "PostgreSQL";
+		public const string SqlCe         = "SqlCe";
+		public const string SQLite        = "SQLite";
+		public const string Sybase        = "Sybase";
+	}
+
+	public static class ProviderFullName
+	{
+		public const string DB2        = "IBM.Data.DB2";
+		public const string Firebird   = "FirebirdSql.Data.FirebirdClient";
+		public const string Informix   = "IBM.Data.Informix.Client";
+		public const string MsSql      = "System.Data.SqlClient";
+		public const string MySql      = "MySql.Data.MySqlClient";
+		public const string Odbc       = "System.Data.Odbc";
+		public const string OleDb      = "System.Data.OleDb";
+		public const string OracleNet  = "System.Data.OracleClient";
+		public const string Oracle     = "Oracle.DataAccess.Client";       
+		public const string PostgreSQL = "Npgsql";
+		public const string SqlCe      = "System.Data.SqlServerCe";
+		public const string SQLite     = "System.Data.SQLite";
+		public const string Sybase     = "Sybase.Data.AseClient";		
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/SQLiteDataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,215 @@
+using System;
+using System.Data;
+using System.Data.Common;
+using System.Data.SQLite;
+using System.Diagnostics;
+using System.Text;
+using System.Xml;
+
+using BLToolkit.Data.Sql.SqlProvider;
+using BLToolkit.Mapping;
+// System.Data.SQLite.dll must be referenced.
+// http://sqlite.phxsoftware.com/
+//
+
+namespace BLToolkit.Data.DataProvider
+{
+	/// <summary>
+	/// Implements access to the Data Provider for SQLite.
+	/// </summary>
+	/// <remarks>
+	/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+	/// </remarks>
+	/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+	public sealed class SQLiteDataProvider : DataProviderBase
+	{
+		/// <summary>
+		/// Returns connection type.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <value>An instance of the <see cref="Type"/> class.</value>
+		public override Type ConnectionType
+		{
+			get { return typeof (SQLiteConnection); }
+		}
+
+		/// <summary>
+		/// Returns the data provider name.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataProvider Method</seealso>
+		/// <value>Data provider name.</value>
+		public override string Name
+		{
+			get { return DataProvider.ProviderName.SQLite; }
+		}
+
+		/// <summary>
+		/// Creates the database connection object.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <returns>The database connection object.</returns>
+		public override IDbConnection CreateConnectionObject()
+		{
+			return new SQLiteConnection();
+		}
+
+		/// <summary>
+		/// Creates the data adapter object.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <returns>A data adapter object.</returns>
+		public override DbDataAdapter CreateDataAdapterObject()
+		{
+			return new SQLiteDataAdapter();
+		}
+
+		/// <summary>
+		/// Populates the specified IDbCommand object's Parameters collection with 
+		/// parameter information for the stored procedure specified in the IDbCommand.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <param name="command">The IDbCommand referencing the stored procedure for which the parameter information is to be derived. The derived parameters will be populated into the Parameters of this command.</param>
+		public override bool DeriveParameters(IDbCommand command)
+		{
+			// SQLiteCommandBuilder does not implement DeriveParameters.
+			// This is not surprising, since SQLite has no support for stored procs.
+			//
+			return false;
+		}
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			switch (convertType)
+			{
+				case ConvertType.ExceptionToErrorNumber:
+					{
+						if (value is SQLiteException)
+							return ((SQLiteException) value).ErrorCode;
+						break;
+					}
+			}
+
+			return SqlProvider.Convert(value, convertType);
+		}
+
+		public override DataExceptionType ConvertErrorNumberToDataExceptionType(int number)
+		{
+			switch (number)
+			{
+				case 19: return DataExceptionType.ConstraintViolation;
+			}
+			return DataExceptionType.Undefined;
+		}
+
+		public override void AttachParameter(IDbCommand command, IDbDataParameter parameter)
+		{
+			if (parameter.Direction == ParameterDirection.Input || parameter.Direction == ParameterDirection.InputOutput)
+			{
+				if (parameter.Value is XmlDocument)
+				{
+					parameter.Value  = Encoding.UTF8.GetBytes(((XmlDocument) parameter.Value).InnerXml);
+					parameter.DbType = DbType.Binary;
+				}
+			}
+
+			base.AttachParameter(command, parameter);
+		}
+
+		public override void SetParameterValue(IDbDataParameter parameter, object value)
+		{
+			if (parameter.DbType == DbType.DateTime2)
+				parameter.DbType = DbType.DateTime;
+
+			base.SetParameterValue(parameter, value);
+		}
+
+		public override ISqlProvider CreateSqlProvider()
+		{
+			return new SQLiteSqlProvider();
+		}
+
+		#region Nested type: LoverFunction
+		/// <summary>
+		/// SQLite built-in text processor is ANSI-only  Just override it.
+		/// </summary>
+		[SQLiteFunction(Name = "lower", Arguments = 1, FuncType = FunctionType.Scalar)]
+		internal class LoverFunction : SQLiteFunction
+		{
+			public override object Invoke(object[] args)
+			{
+				Debug.Assert(args != null && args.Length == 1);
+				var arg = args[0];
+
+				Debug.Assert(arg is string || arg is DBNull || arg is byte[]);
+				return
+					arg is string
+						? ((string) arg).ToLower()
+						: arg is byte[]
+						  	? Encoding.UTF8.GetString((byte[]) arg).ToLower()
+						  	: arg;
+			}
+		}
+		#endregion
+
+		#region Nested type: SQLiteMappingSchema
+		public class SQLiteMappingSchema : MappingSchema
+		{
+			#region Convert
+			public override XmlReader ConvertToXmlReader(object value)
+			{
+				if (value is byte[])
+					value = Encoding.UTF8.GetString((byte[]) value);
+
+				return base.ConvertToXmlReader(value);
+			}
+
+			public override XmlDocument ConvertToXmlDocument(object value)
+			{
+				if (value is byte[])
+					value = Encoding.UTF8.GetString((byte[]) value);
+
+				return base.ConvertToXmlDocument(value);
+			}
+			#endregion
+		}
+		#endregion
+
+		#region Nested type: UpperFunction
+		/// <summary>
+		/// SQLite built-in text processor is ANSI-only  Just override it.
+		/// </summary>
+		[SQLiteFunction(Name = "upper", Arguments = 1, FuncType = FunctionType.Scalar)]
+		internal class UpperFunction : SQLiteFunction
+		{
+			public override object Invoke(object[] args)
+			{
+				Debug.Assert(args != null && args.Length == 1);
+				var arg = args[0];
+
+				Debug.Assert(arg is string || arg is DBNull || arg is byte[]);
+				return
+					arg is string
+						? ((string) arg).ToUpper()
+						: arg is byte[]
+						  	? Encoding.UTF8.GetString((byte[]) arg).ToUpper()
+						  	: arg;
+			}
+		}
+		#endregion
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/Sql2000DataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,28 @@
+using System;
+using System.Data;
+
+namespace BLToolkit.Data.DataProvider
+{
+	using Sql.SqlProvider;
+
+	public sealed class Sql2000DataProvider : SqlDataProviderBase
+	{
+		public override string Name
+		{
+			get { return DataProvider.ProviderName.MsSql2000; }
+		}
+
+		public override ISqlProvider CreateSqlProvider()
+		{
+			return new MsSql2000SqlProvider();
+		}
+
+		public override void AttachParameter(IDbCommand command, IDbDataParameter parameter)
+		{
+			if (parameter.DbType == DbType.DateTime2)
+				parameter.DbType = DbType.DateTime;
+
+			base.AttachParameter(command, parameter);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/Sql2005DataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,28 @@
+using System;
+using System.Data;
+
+namespace BLToolkit.Data.DataProvider
+{
+	using Sql.SqlProvider;
+
+	public sealed class Sql2005DataProvider : SqlDataProviderBase
+	{
+		public override string Name
+		{
+			get { return DataProvider.ProviderName.MsSql2005; }
+		}
+
+		public override ISqlProvider CreateSqlProvider()
+		{
+			return new MsSql2005SqlProvider();
+		}
+
+		public override void AttachParameter(IDbCommand command, IDbDataParameter parameter)
+		{
+			if (parameter.DbType == DbType.DateTime2)
+				parameter.DbType = DbType.DateTime;
+
+			base.AttachParameter(command, parameter);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/Sql2008DataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,54 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+
+namespace BLToolkit.Data.DataProvider
+{
+	using Sql.SqlProvider;
+
+	public sealed class Sql2008DataProvider : SqlDataProviderBase
+	{
+		static readonly List<Func<Type,string>> _udtTypeNameResolvers = new List<Func<Type,string>>();
+
+		static Sql2008DataProvider()
+		{
+			AddUdtTypeNameResolver(ResolveStandartUdt);
+		}
+
+		public static void AddUdtTypeNameResolver(Func<Type, string> resolver)
+		{
+			_udtTypeNameResolvers.Add(resolver);
+		}
+
+		static string ResolveStandartUdt(Type type)
+		{
+			return type.Namespace == "Microsoft.SqlServer.Types" ? type.Name.Replace("Sql", "") : null;
+		}
+
+		public override string Name
+		{
+			get { return DataProvider.ProviderName.MsSql2008; }
+		}
+
+		public override ISqlProvider CreateSqlProvider()
+		{
+			return new MsSql2008SqlProvider();
+		}
+
+		public override void SetParameterValue(IDbDataParameter parameter, object value)
+		{
+			base.SetParameterValue(parameter, value);
+			SetUdtTypeName(parameter, value);
+		}
+
+		static void SetUdtTypeName(IDbDataParameter parameter, object value)
+		{
+			var sqlParameter = parameter as System.Data.SqlClient.SqlParameter;
+			var valueType    = value.GetType();
+
+			if (sqlParameter != null)
+				sqlParameter.UdtTypeName = _udtTypeNameResolvers.Select(_=>_(valueType)).FirstOrDefault(_=>!string.IsNullOrEmpty(_));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/Sql2012DataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,54 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+
+namespace BLToolkit.Data.DataProvider
+{
+	using Sql.SqlProvider;
+
+	public sealed class Sql2012DataProvider : SqlDataProviderBase
+	{
+		static readonly List<Func<Type,string>> _udtTypeNameResolvers = new List<Func<Type,string>>();
+
+		static Sql2012DataProvider()
+		{
+			AddUdtTypeNameResolver(ResolveStandartUdt);
+		}
+
+		public static void AddUdtTypeNameResolver(Func<Type, string> resolver)
+		{
+			_udtTypeNameResolvers.Add(resolver);
+		}
+
+		static string ResolveStandartUdt(Type type)
+		{
+			return type.Namespace == "Microsoft.SqlServer.Types" ? type.Name.Replace("Sql", "") : null;
+		}
+
+		public override string Name
+		{
+			get { return DataProvider.ProviderName.MsSql2012; }
+		}
+
+		public override ISqlProvider CreateSqlProvider()
+		{
+			return new MsSql2012SqlProvider();
+		}
+
+		public override void SetParameterValue(IDbDataParameter parameter, object value)
+		{
+			base.SetParameterValue(parameter, value);
+			SetUdtTypeName(parameter, value);
+		}
+
+		static void SetUdtTypeName(IDbDataParameter parameter, object value)
+		{
+			var sqlParameter = parameter as System.Data.SqlClient.SqlParameter;
+			var valueType    = value.GetType();
+
+			if (sqlParameter != null)
+				sqlParameter.UdtTypeName = _udtTypeNameResolvers.Select(_=>_(valueType)).FirstOrDefault(_=>!string.IsNullOrEmpty(_));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/SqlCeDataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,120 @@
+using System;
+using System.Data;
+using System.Data.Common;
+
+// System.Data.SqlServerCe.dll must be referenced.
+// http://www.microsoft.com/sql/editions/compact/default.mspx
+//
+using System.Data.SqlServerCe;
+
+namespace BLToolkit.Data.DataProvider
+{
+	using Sql.SqlProvider;
+
+	/// <summary>
+	/// Implements access to the Data Provider for Microsoft SQL Server 2005 Everywhere Edition
+	/// </summary>
+	/// <remarks>
+	/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+	/// </remarks>
+	/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+	public sealed class SqlCeDataProvider: DataProviderBase
+	{
+		/// <summary>
+		/// Creates the database connection object.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <returns>The database connection object.</returns>
+		public override IDbConnection CreateConnectionObject()
+		{
+			return new SqlCeConnection();
+		}
+
+		/// <summary>
+		/// Creates the data adapter object.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <returns>A data adapter object.</returns>
+		public override DbDataAdapter CreateDataAdapterObject()
+		{
+			return new SqlCeDataAdapter();
+		}
+
+		/// <summary>
+		/// Populates the specified IDbCommand object's Parameters collection with 
+		/// parameter information for the stored procedure specified in the IDbCommand.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <param name="command">The IDbCommand referencing the stored procedure for which the parameter information is to be derived. The derived parameters will be populated into the Parameters of this command.</param>
+		public override bool DeriveParameters(IDbCommand command)
+		{
+			// SqlCeCommandBuilder does not implement DeriveParameters.
+			// This is not surprising, since SQL/e has no support for stored procs.
+			//
+			return false;
+		}
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			switch (convertType)
+			{
+				case ConvertType.ExceptionToErrorNumber:
+					if (value is SqlCeException)
+						return ((SqlCeException)value).NativeError;
+					break;
+			}
+
+			return SqlProvider.Convert(value, convertType);
+		}
+
+		/// <summary>
+		/// Returns connection type.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <value>An instance of the <see cref="Type"/> class.</value>
+		public override Type ConnectionType
+		{
+			get { return typeof(SqlCeConnection); }
+		}
+
+		/// <summary>
+		/// Returns the data provider name.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataProvider Method</seealso>
+		/// <value>Data provider name.</value>
+		public override string Name
+		{
+			get { return DataProvider.ProviderName.SqlCe; }
+		}
+
+		public override int MaxBatchSize
+		{
+			get { return 0; }
+		}
+
+		public override ISqlProvider CreateSqlProvider()
+		{
+			return new SqlCeSqlProvider();
+		}
+
+		public override DbType GetParameterDbType(DbType dbType)
+		{
+			return dbType == DbType.DateTime2 ? DbType.DateTime : dbType;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/SqlDataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+using System;
+
+namespace BLToolkit.Data.DataProvider
+{
+	public sealed class SqlDataProvider : SqlDataProviderBase
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/SqlDataProviderBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,430 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.Common;
+using System.Data.SqlClient;
+using System.Linq;
+
+using SqlException = System.Data.SqlClient.SqlException;
+using SqlParameter = System.Data.SqlClient.SqlParameter;
+
+namespace BLToolkit.Data.DataProvider
+{
+	using Mapping;
+	using Sql.SqlProvider;
+
+	/// <summary>
+	/// Implements access to the Data Provider for SQL Server.
+	/// </summary>
+	/// <remarks>
+	/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+	/// </remarks>
+	/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+	public abstract class SqlDataProviderBase : DataProviderBase
+	{
+		/// <summary>
+		/// Creates the database connection object.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <returns>The database connection object.</returns>
+		public override IDbConnection CreateConnectionObject()
+		{
+			return new SqlConnection();
+		}
+
+		/// <summary>
+		/// Creates the data adapter object.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <returns>A data adapter object.</returns>
+		public override DbDataAdapter CreateDataAdapterObject()
+		{
+			return new SqlDataAdapter();
+		}
+
+		/// <summary>
+		/// Populates the specified <see cref="IDbCommand"/> object's Parameters collection with 
+		/// parameter information for the stored procedure specified in the <see cref="IDbCommand"/>.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <param name="command">The <see cref="IDbCommand"/> referencing the stored procedure for which the parameter
+		/// information is to be derived. The derived parameters will be populated into the 
+		/// Parameters of this command.</param>
+		public override bool DeriveParameters(IDbCommand command)
+		{
+			SqlCommandBuilder.DeriveParameters((SqlCommand)command);
+			
+#if !MONO
+			foreach (SqlParameter p in command.Parameters)
+			{
+				// We have to clear UDT type names.
+				// Otherwise it will fail with error
+				// "Database name is not allowed with a table-valued parameter"
+				// but this is exactly the way how they are discovered.
+				//
+				if (p.SqlDbType == SqlDbType.Structured)
+				{
+					var firstDot = p.TypeName.IndexOf('.');
+					if (firstDot >= 0)
+						p.TypeName = p.TypeName.Substring(firstDot + 1);
+				}
+			}
+#endif
+
+			return true;
+		}
+
+		public override void PrepareCommand(ref CommandType commandType, ref string commandText, ref IDbDataParameter[] commandParameters)
+		{
+			base.PrepareCommand(ref commandType, ref commandText, ref commandParameters);
+
+			if (commandParameters == null)
+				return;
+
+			foreach (var p in commandParameters)
+			{
+				var val = p.Value;
+
+				if (val == null || !val.GetType().IsArray || val is byte[] || val is char[])
+					continue;
+
+				var dt = new DataTable();
+
+				dt.Columns.Add("column_value", val.GetType().GetElementType());
+
+				dt.BeginLoadData();
+
+				foreach (object o in (Array)val)
+				{
+					var row = dt.NewRow();
+					row[0] = o;
+					dt.Rows.Add(row);
+				}
+
+				dt.EndLoadData();
+
+				p.Value = dt;
+			}
+		}
+
+		public override void SetUserDefinedType(IDbDataParameter parameter, string typeName)
+		{
+#if !MONO
+			if (!(parameter is SqlParameter))
+				throw new ArgumentException("SqlParameter expected.", "parameter");
+
+			((SqlParameter)parameter).TypeName = typeName;
+#else
+			throw new NotSupportedException();
+#endif
+		}
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			switch (convertType)
+			{
+				case ConvertType.ExceptionToErrorNumber:
+					if (value is SqlException)
+						return ((SqlException)value).Number;
+					break;
+			}
+
+			return SqlProvider.Convert(value, convertType);
+		}
+
+		public override DataExceptionType ConvertErrorNumberToDataExceptionType(int number)
+		{
+			switch (number)
+			{
+				case 1205: return DataExceptionType.Deadlock;
+				case   -2: return DataExceptionType.Timeout;
+				case  547: return DataExceptionType.ForeignKeyViolation;
+				case 2601: return DataExceptionType.UniqueIndexViolation;
+				case 2627: return DataExceptionType.ConstraintViolation;
+			}
+
+			return DataExceptionType.Undefined;
+		}
+
+		/// <summary>
+		/// Returns connection type.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataManager Method</seealso>
+		/// <value>An instance of the <see cref="Type"/> class.</value>
+		public override Type ConnectionType
+		{
+			get { return typeof(SqlConnection); }
+		}
+
+		public const string NameString = DataProvider.ProviderName.MsSql;
+
+		/// <summary>
+		/// Returns the data provider name.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="DbManager.AddDataProvider(DataProviderBase)"/> method to find an example.
+		/// </remarks>
+		/// <seealso cref="DbManager.AddDataProvider(DataProviderBase)">AddDataProvider Method</seealso>
+		/// <value>Data provider name.</value>
+		public override string Name
+		{
+			get { return NameString; }
+		}
+
+		public override ISqlProvider CreateSqlProvider()
+		{
+			return new MsSql2005SqlProvider();
+		}
+
+		public override int MaxParameters
+		{
+			get { return 2100 - 20; }
+		}
+
+		public override int MaxBatchSize
+		{
+			get { return 65536; }
+		}
+
+		public override bool IsMarsEnabled(IDbConnection conn)
+		{
+			if (conn.ConnectionString != null)
+			{
+				return conn.ConnectionString.Split(';')
+					.Select(s => s.Split('='))
+					.Where (s => s.Length == 2 && s[0].Trim().ToLower() == "multipleactiveresultsets")
+					.Select(s => s[1].Trim().ToLower())
+					.Any   (s => s == "true" || s == "1" || s == "yes");
+			}
+
+			return false;
+		}
+
+		#region GetDataReader
+
+		public override IDataReader GetDataReader(MappingSchema schema, IDataReader dataReader)
+		{
+			return dataReader is SqlDataReader?
+				new SqlDataReaderEx((SqlDataReader)dataReader):
+				base.GetDataReader(schema, dataReader);
+		}
+
+		class SqlDataReaderEx : DataReaderEx<SqlDataReader>
+		{
+			public SqlDataReaderEx(SqlDataReader rd): base(rd)
+			{
+			}
+
+			public override DateTimeOffset GetDateTimeOffset(int i)
+			{
+#if !MONO
+				return DataReader.GetDateTimeOffset(i);
+#else
+				throw new NotSupportedException();
+#endif
+			}
+		}
+
+		#endregion
+
+		public override int InsertBatch<T>(
+			DbManager                      db,
+			string                         insertText,
+			IEnumerable<T>                 collection,
+			MemberMapper[]                 members,
+			int                            maxBatchSize,
+			DbManager.ParameterProvider<T> getParameters)
+		{
+			if (db.Transaction != null)
+				return base.InsertBatch(db, insertText, collection, members, maxBatchSize, getParameters);
+
+			var idx = insertText.IndexOf('\n');
+			var tbl = insertText.Substring(0, idx).Substring("INSERT INTO ".Length).TrimEnd('\r');
+			var rd  = new BulkCopyReader(members, collection);
+			var bc  = new SqlBulkCopy((SqlConnection)db.Connection)
+			{
+				BatchSize            = maxBatchSize,
+				DestinationTableName = tbl,
+			};
+
+			foreach (var memberMapper in members)
+				bc.ColumnMappings.Add(new SqlBulkCopyColumnMapping(memberMapper.Ordinal, memberMapper.Name));
+
+			bc.WriteToServer(rd);
+
+			return rd.Count;
+		}
+
+		class BulkCopyReader : IDataReader
+		{
+			readonly MemberMapper[] _members;
+			readonly IEnumerable    _collection;
+			readonly IEnumerator    _enumerator;
+
+			public int Count;
+
+			public BulkCopyReader(MemberMapper[] members, IEnumerable collection)
+			{
+				_members    = members;
+				_collection = collection;
+				_enumerator = _collection.GetEnumerator();
+			}
+
+			#region Implementation of IDisposable
+
+			public void Dispose()
+			{
+			}
+
+			#endregion
+
+			#region Implementation of IDataRecord
+
+			public string GetName(int i)
+			{
+				return _members[i].Name;
+			}
+
+			public Type GetFieldType(int i)
+			{
+				return _members[i].Type;
+			}
+
+			public object GetValue(int i)
+			{
+				return _members[i].GetValue(_enumerator.Current);
+			}
+
+			public int FieldCount
+			{
+				get { return _members.Length; }
+			}
+
+			public long GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length)
+			{
+				throw new NotImplementedException();
+			}
+
+			public long GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length)
+			{
+				throw new NotImplementedException();
+			}
+
+			public string      GetDataTypeName(int i)           { throw new NotImplementedException(); }
+			public int         GetValues      (object[] values) { throw new NotImplementedException(); }
+			public int         GetOrdinal     (string name)     { throw new NotImplementedException(); }
+			public bool        GetBoolean     (int i)           { throw new NotImplementedException(); }
+			public byte        GetByte        (int i)           { throw new NotImplementedException(); }
+			public char        GetChar        (int i)           { throw new NotImplementedException(); }
+			public Guid        GetGuid        (int i)           { throw new NotImplementedException(); }
+			public short       GetInt16       (int i)           { throw new NotImplementedException(); }
+			public int         GetInt32       (int i)           { throw new NotImplementedException(); }
+			public long        GetInt64       (int i)           { throw new NotImplementedException(); }
+			public float       GetFloat       (int i)           { throw new NotImplementedException(); }
+			public double      GetDouble      (int i)           { throw new NotImplementedException(); }
+			public string      GetString      (int i)           { throw new NotImplementedException(); }
+			public decimal     GetDecimal     (int i)           { throw new NotImplementedException(); }
+			public DateTime    GetDateTime    (int i)           { throw new NotImplementedException(); }
+			public IDataReader GetData        (int i)           { throw new NotImplementedException(); }
+			public bool        IsDBNull       (int i)           { throw new NotImplementedException(); }
+
+			object IDataRecord.this[int i]
+			{
+				get { throw new NotImplementedException(); }
+			}
+
+			object IDataRecord.this[string name]
+			{
+				get { throw new NotImplementedException(); }
+			}
+
+			#endregion
+
+			#region Implementation of IDataReader
+
+			public void Close()
+			{
+				throw new NotImplementedException();
+			}
+
+			public DataTable GetSchemaTable()
+			{
+				throw new NotImplementedException();
+			}
+
+			public bool NextResult()
+			{
+				throw new NotImplementedException();
+			}
+
+			public bool Read()
+			{
+				var b = _enumerator.MoveNext();
+
+				if (b)
+					Count++;
+
+				return b;
+			}
+
+			public int Depth
+			{
+				get { throw new NotImplementedException(); }
+			}
+
+			public bool IsClosed
+			{
+				get { throw new NotImplementedException(); }
+			}
+
+			public int RecordsAffected
+			{
+				get { throw new NotImplementedException(); }
+			}
+
+			#endregion
+		}
+
+		public override void SetParameterValue(IDbDataParameter parameter, object value)
+		{
+			if (value is sbyte)
+			{
+				parameter.Value = (byte)(sbyte)value;
+			}
+			else if (value is ushort)
+			{
+				parameter.Value = (short)(ushort)value;
+			}
+			else if (value is uint)
+			{
+				parameter.Value = (int)(uint)value;
+			}
+			else if (value is ulong)
+			{
+				parameter.Value = (long)(ulong)value;
+			}
+			else if (value is string)
+			{
+				parameter.Value = value;
+				if (parameter.DbType == DbType.String && ((string)value).Length == 0) parameter.Size = 1;
+			}
+			else
+			{
+				base.SetParameterValue(parameter, value);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/SybaseAdoDataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,45 @@
+using System;
+using System.Data;
+using System.Data.OleDb;
+
+namespace BLToolkit.Data.DataProvider
+{
+	// Data Provider for DataDirect Sybase ADO Provider 4.2
+	//
+	public sealed class SybaseAdoDataProvider : OleDbDataProvider
+	{
+		public override bool DeriveParameters(IDbCommand command)
+		{
+			OleDbCommandBuilder.DeriveParameters((OleDbCommand)command);
+			return true;
+		}
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			switch (convertType)
+			{
+				case ConvertType.NameToQueryParameter:
+					return "?";
+
+				case ConvertType.NameToCommandParameter:
+				case ConvertType.NameToSprocParameter:
+					return value;
+			}
+
+			return base.Convert(value, convertType);
+		}
+
+		public override void AttachParameter(IDbCommand command, IDbDataParameter parameter)
+		{
+			if (parameter.Value is string && parameter.DbType == DbType.Guid)
+				parameter.DbType = DbType.AnsiString;
+
+			base.AttachParameter(command, parameter);
+		}
+
+		public override string Name
+		{
+			get { return "SybaseAdo"; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DataProvider/SybaseDataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,221 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.Common;
+using System.Text;
+
+using BLToolkit.Mapping;
+
+using Sybase.Data.AseClient;
+
+namespace BLToolkit.Data.DataProvider
+{
+	using Sql.SqlProvider;
+
+	public class SybaseDataProvider : DataProviderBase
+	{
+		public override IDbConnection CreateConnectionObject()
+		{
+			return new AseConnection();
+		}
+
+		public override DbDataAdapter CreateDataAdapterObject()
+		{
+			return new AseDataAdapter();
+		}
+
+		public override bool DeriveParameters(IDbCommand command)
+		{
+			AseCommandBuilder.DeriveParameters((AseCommand)command);
+			return true;
+		}
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			switch (convertType)
+			{
+				case ConvertType.ExceptionToErrorNumber:
+					if (value is AseException)
+					{
+						var ex = (AseException)value;
+
+						foreach (AseError error in ex.Errors)
+							if (error.IsError)
+								return error.MessageNumber;
+
+						foreach (AseError error in ex.Errors)
+							if (error.MessageNumber != 0)
+								return error.MessageNumber;
+
+						return 0;
+					}
+
+					break;
+
+				case ConvertType.ExceptionToErrorMessage:
+					if (value is AseException)
+					{
+						try
+						{
+							var ex = (AseException)value;
+							var sb = new StringBuilder();
+
+							foreach (AseError error in ex.Errors)
+								if (error.IsError)
+									sb.AppendFormat("{0} Ln: {1}{2}",
+										error.Message.TrimEnd('\n', '\r'), error.LineNum, Environment.NewLine);
+
+							foreach (AseError error in ex.Errors)
+								if (!error.IsError)
+									sb.AppendFormat("* {0}{1}", error.Message, Environment.NewLine);
+
+							return sb.Length == 0 ? ex.Message : sb.ToString();
+						}
+						catch
+						{
+						}
+					}
+
+					break;
+			}
+
+			return SqlProvider.Convert(value, convertType);
+		}
+
+		public override void AttachParameter(IDbCommand command, IDbDataParameter parameter)
+		{
+			if (parameter.Value is string && parameter.DbType == DbType.Guid)
+				parameter.DbType = DbType.AnsiString;
+
+			base.AttachParameter(command, parameter);
+			
+			var p = (AseParameter)parameter;
+
+			if (p.AseDbType == AseDbType.Unsupported && p.Value is DBNull)
+				parameter.DbType = DbType.AnsiString;
+		}
+
+		public override Type ConnectionType
+		{
+			get { return typeof(AseConnection); }
+		}
+
+		public override string Name
+		{
+			get { return DataProvider.ProviderName.Sybase; }
+		}
+
+		public override ISqlProvider CreateSqlProvider()
+		{
+			return new SybaseSqlProvider();
+		}
+
+		public override bool InitParameter(IDbDataParameter parameter)
+		{
+			if (parameter.Value is Guid)
+			{
+				parameter.Value  = parameter.Value.ToString();
+				parameter.DbType = DbType.StringFixedLength;
+				parameter.Size   = 36;
+
+				return true;
+			}
+
+			return false;
+		}
+
+		public override void PrepareCommand(ref CommandType commandType, ref string commandText, ref IDbDataParameter[] commandParameters)
+		{
+			base.PrepareCommand(ref commandType, ref commandText, ref commandParameters);
+
+			List<IDbDataParameter> list = null;
+
+			if (commandParameters != null) for (var i = 0; i < commandParameters.Length; i++)
+			{
+				var p = commandParameters[i];
+
+				if (p.Value is Guid)
+				{
+					p.Value  = p.Value.ToString();
+					p.DbType = DbType.StringFixedLength;
+					p.Size   = 36;
+				}
+
+				if (commandType == CommandType.Text)
+				{
+					if (commandText.IndexOf(p.ParameterName) < 0)
+					{
+						if (list == null)
+						{
+							list = new List<IDbDataParameter>(commandParameters.Length);
+
+							for (var j = 0; j < i; j++)
+								list.Add(commandParameters[j]);
+						}
+					}
+					else
+					{
+						if (list != null)
+							list.Add(p);
+					}
+				}
+			}
+
+			if (list != null)
+				commandParameters = list.ToArray();
+		}
+
+		public override string EndOfSql { get { return ""; } }
+
+		public override DbType GetDbType(Type systemType)
+		{
+			if (systemType == typeof(byte[]))
+				return DbType.Object;
+
+			return base.GetDbType(systemType);
+		}
+
+		#region DataReaderEx
+
+		public override IDataReader GetDataReader(MappingSchema schema, IDataReader dataReader)
+		{
+			return dataReader is AseDataReader?
+				new DataReaderEx((AseDataReader)dataReader):
+				base.GetDataReader(schema, dataReader);
+		}
+
+		class DataReaderEx : DataReaderBase<AseDataReader>, IDataReader
+		{
+			public DataReaderEx(AseDataReader rd): base(rd)
+			{
+			}
+
+			public new object GetValue(int i)
+			{
+				var value = DataReader.GetValue(i);
+
+				if (value is DateTime)
+				{
+					var dt = (DateTime)value;
+
+					if (dt.Year == 1900 && dt.Month == 1 && dt.Day == 1)
+						return new DateTime(1, 1, 1, dt.Hour, dt.Minute, dt.Second, dt.Millisecond);
+				}
+
+				return value;
+			}
+
+			public new DateTime GetDateTime(int i)
+			{
+				var dt = DataReader.GetDateTime(i);
+
+				if (dt.Year == 1900 && dt.Month == 1 && dt.Day == 1)
+					return new DateTime(1, 1, 1, dt.Hour, dt.Minute, dt.Second, dt.Millisecond);
+
+				return dt;
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DbConnectionFactory.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,24 @@
+using BLToolkit.Data.DataProvider;
+
+namespace BLToolkit.Data
+{
+    public abstract class DbConnectionFactory : IDbConnectionFactory
+    {
+        public DataProviderBase Provider;
+        public string ConnectionString { get; set; }
+
+        #region IDbConnectionFactory Members
+
+        public DbManager CreateDbManager()
+        {
+            return CreateDbManager(Provider, ConnectionString);
+        }
+
+        public virtual DbManager CreateDbManager(DataProviderBase provider, string connectionString)
+        {
+            return new DbManager(provider, connectionString);
+        }
+
+        #endregion
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DbManager.Config.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,782 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Data;
+using System.Data.SqlClient;
+using System.Diagnostics;
+using System.Linq;
+
+namespace BLToolkit.Data
+{
+	using Configuration;
+	using DataProvider;
+	using Properties;
+
+	public partial class DbManager
+	{
+		#region Constructors
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="DbManager"/> class 
+		/// and opens a database connection.
+		/// </summary>
+		/// <remarks>
+		/// <para>
+		/// This constructor uses a configuration, which has been used first in your application. 
+		/// If there has been no connection used before, an empty string is applied as a default configuration.
+		/// </para>
+		/// <para>
+		/// See the <see cref="ConfigurationString"/> property 
+		/// for an explanation and use of the default configuration.
+		/// </para>
+		/// </remarks>
+		/// <include file="Examples.xml" path='examples/db[@name="ctor"]/*' />
+		/// <seealso cref="AddConnectionString(string)"/>
+		/// <returns>An instance of the database manager class.</returns>
+		[DebuggerStepThrough]
+		public DbManager() : this(DefaultConfiguration)
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="DbManager"/> class 
+		/// and opens a database connection for the provided configuration.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="ConfigurationString"/> property 
+		/// for an explanation and use of the configuration string.
+		/// </remarks>
+		/// <include file="Examples.xml" path='examples/db[@name="ctor(string)"]/*' />
+		/// <param name="configurationString">Configuration string.</param>
+		/// <returns>An instance of the <see cref="DbManager"/> class.</returns>
+		[DebuggerStepThrough]
+		public DbManager(string configurationString)
+			: this(
+				GetDataProvider    (configurationString),
+				GetConnectionString(configurationString))
+		{
+			_configurationString = configurationString;
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="DbManager"/> class 
+		/// and opens a database connection for the provided configuration.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="ConfigurationString"/> property 
+		/// for an explanation and use of the configuration string.
+		/// </remarks>
+		/// <param name="configuration">Configuration string not containing provider name.</param>
+		/// <param name="providerName">Provider configuration name.</param>
+		/// <returns>An instance of the <see cref="DbManager"/> class.</returns>
+		[DebuggerStepThrough]
+		public DbManager(string providerName, string configuration)
+			: this(
+				GetDataProvider    (providerName + ProviderNameDivider + configuration),
+				GetConnectionString(providerName + ProviderNameDivider + configuration))
+		{
+			_configurationString = providerName + ProviderNameDivider + configuration;
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="DbManager"/> class for the provided connection.
+		/// </summary>
+		/// <remarks>
+		/// This constructor tries to open the connection if the connection state equals 
+		/// <see cref="System.Data.ConnectionState">ConnectionState.Closed</see>. 
+		/// In this case the <see cref="IDbConnection.ConnectionString"/> property of the connection 
+		/// must be set before colling the constructor.
+		/// Otherwise, it neither opens nor closes the connection. 
+		/// </remarks>
+		/// <exception cref="DataException">
+		/// Type of the connection could not be recognized.
+		/// </exception>
+		/// <include file="Examples.xml" path='examples/db[@name="ctor(IDbConnection)"]/*' />
+		/// <param name="connection">An instance of the <see cref="IDbConnection"/> class.</param>
+		/// <returns>An instance of the <see cref="DbManager"/> class.</returns>
+		[DebuggerStepThrough]
+		public DbManager(IDbConnection connection)
+			: this(GetDataProvider(connection), connection)
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="DbManager"/> class for the provided transaction.
+		/// </summary>
+		/// <include file="Examples.xml" path='examples/db[@name="ctor(IDbTransaction)"]/*' />
+		/// <param name="transaction"></param>
+		[DebuggerStepThrough]
+		public DbManager(IDbTransaction transaction)
+			: this(GetDataProvider(transaction.Connection), transaction)
+		{
+		}
+
+		/*
+		/// <summary>
+		/// Initializes a new instance of the <see cref="DbManager"/> class 
+		/// and opens a database connection for the provided configuration and database connection.
+		/// </summary>
+		/// <remarks>
+		/// <para>
+		/// This constructor opens the connection only if the connection state equals 
+		/// <see cref="System.Data.ConnectionState">ConnectionState.Closed</see>. 
+		/// Otherwise, it neither opens nor closes the connection.
+		/// </para>
+		/// <para>
+		/// See the <see cref="ConfigurationString"/> property 
+		/// for an explanation and use of the configuration string.
+		/// </para>
+		/// </remarks>
+		/// <include file="Examples.xml" path='examples/db[@name="ctor(IDbConnection,string)"]/*' />
+		/// <param name="connection">An instance of the <see cref="IDbConnection"/>.</param>
+		/// <param name="configurationString">The configuration string.</param>
+		/// <returns>An instance of the <see cref="DbManager"/> class.</returns>
+		[DebuggerStepThrough]
+		public DbManager(
+			IDbConnection connection,
+			string        configurationString)
+		{
+			if (connection == null)
+			{
+				Init(configurationString);
+
+				if (configurationString != null)
+					OpenConnection(configurationString);
+			}
+			else
+			{
+				Init(connection);
+
+				_configurationString = configurationString;
+				_connection.ConnectionString = GetConnectionString(configurationString);
+
+				if (_connection.State == ConnectionState.Closed)
+					OpenConnection();
+			}
+		}
+		*/
+
+		#endregion
+
+		#region Public Properties
+
+		private string _configurationString;
+		/// <summary>
+		/// Gets the string used to open a database.
+		/// </summary>
+		/// <value>
+		/// A string containing configuration settings.
+		/// </value>
+		/// <remarks>
+		/// <para>
+		/// An actual database connection string is read from the <i>appSettings</i> section 
+		/// of application configuration file (App.config, Web.config, or Machine.config) 
+		/// according to the follow rule:
+		/// </para>
+		/// <code>
+		/// &lt;appSettings&gt;
+		///     &lt;add 
+		///         key   = "ConnectionString.<b>configurationString</b>" 
+		///         va<i></i>lue = "Server=(local);Database=Northwind;Integrated Security=SSPI" /&gt;
+		/// &lt;/appSettings&gt;
+		/// </code>
+		/// <para>
+		/// If the configuration string is empty, the following rule is applied:
+		/// </para>
+		/// <code>
+		/// &lt;appSettings&gt;
+		///     &lt;add 
+		///         key   = "ConnectionString" 
+		///         va<i></i>lue = "Server=(local);Database=Northwind;Integrated Security=SSPI" /&gt;
+		/// &lt;/appSettings&gt;
+		/// </code>
+		/// <para>
+		/// If you don't want to use a configuration file, you can add a database connection string 
+		/// using the <see cref="AddConnectionString(string)"/> method.
+		/// </para>
+		/// <para>
+		/// The configuration string may have a prefix used to define a data provider. The following table
+		/// contains prefixes for all supported data providers:
+		/// <list type="table">
+		/// <listheader><term>Prefix</term><description>Provider</description></listheader>
+		/// <item><term>Sql</term><description>Data Provider for SQL Server</description></item>
+		/// <item><term>OleDb</term><description>Data Provider for OLE DB</description></item>
+		/// <item><term>Odbc</term><description>Data Provider for ODBC</description></item>
+		/// <item><term>Oracle</term><description>Data Provider for Oracle</description></item>
+		/// </list>
+		/// </para>
+		/// </remarks>
+		/// <seealso cref="AddConnectionString(string)"/>
+		public string ConfigurationString
+		{
+			[DebuggerStepThrough]
+			get { return _configurationString; }
+		}
+
+		#endregion
+
+		#region Config Overrides
+
+		protected virtual void InitDataProvider(IDbConnection connection)
+		{
+			DataProvider = GetDataProvider(connection);
+		}
+
+		protected virtual IDbConnection CloneConnection()
+		{
+			if (Connection is ICloneable || ConfigurationString == null)
+				return _dataProvider.CloneConnection(_connection);
+
+			var con = DataProvider.CreateConnectionObject();
+
+			con.ConnectionString = GetConnectionString(ConfigurationString);
+
+			return con;
+		}
+
+		protected virtual string GetConnectionHash()
+		{
+			return ConfigurationString ?? Connection.ConnectionString.GetHashCode().ToString();
+		}
+
+		#endregion
+
+		#region Protected Static Members
+
+		static DbManager()
+		{
+			AddDataProvider(new Sql2012DataProvider());
+			AddDataProvider(new Sql2008DataProvider());
+			AddDataProvider(new Sql2005DataProvider());
+			AddDataProvider(new SqlDataProvider());
+			AddDataProvider(new Sql2000DataProvider());
+			AddDataProvider(new AccessDataProvider());
+			AddDataProvider(new OleDbDataProvider());
+			AddDataProvider(new OdbcDataProvider());
+
+			var section = BLToolkitSection.Instance;
+
+			if (section != null)
+			{
+				_defaultConfiguration = section.DefaultConfiguration;
+
+				foreach (DataProviderElement provider in section.DataProviders)
+				{
+					var dataProviderType = Type.GetType(provider.TypeName, true);
+					var providerInstance = (DataProviderBase)Activator.CreateInstance(dataProviderType);
+
+					if (!string.IsNullOrEmpty(provider.Name))
+						providerInstance.UniqueName = provider.Name;
+
+					providerInstance.Configure(provider.Attributes);
+
+					AddDataProvider(providerInstance);
+
+					if (!provider.Default)
+						continue;
+
+					if (_defaultDataProviderName != null)
+					{
+						throw new ConfigurationErrorsException(string.Format(
+							Resources.DbManager_MoreThenOneDefaultProvider, _defaultDataProviderName, providerInstance.UniqueName),
+							provider.ElementInformation.Source, provider.ElementInformation.LineNumber);
+					}
+
+					_defaultDataProviderName = providerInstance.UniqueName;
+				}
+			}
+
+			var dataProviders = ConfigurationManager.AppSettings.Get("BLToolkit.DataProviders");
+
+			if (dataProviders != null)
+			{
+				if (TraceSwitch.TraceWarning)
+					WriteTraceLine("Using appSettings\\BLToolkit.DataProviders is obsolete. Consider using bltoolkit configuration section instead.", TraceSwitch.DisplayName);
+
+				foreach (var dataProviderTypeName in dataProviders.Split(';'))
+					AddDataProvider(Type.GetType(dataProviderTypeName, true));
+			}
+
+			if (string.IsNullOrEmpty(_defaultConfiguration))
+				_defaultConfiguration = ConfigurationManager.AppSettings.Get("BLToolkit.DefaultConfiguration");
+
+			if (string.IsNullOrEmpty(_defaultDataProviderName))
+				_defaultDataProviderName = SqlDataProviderBase.NameString;
+		}
+
+		volatile static string             _firstConfiguration;
+		private  static DataProviderBase   _firstProvider;
+		private  static readonly Hashtable _configurationList = Hashtable.Synchronized(new Hashtable());
+		private  static readonly Hashtable _anyProviderConfigurationList = Hashtable.Synchronized(new Hashtable());
+
+		private static DataProviderBase GetDataProvider(IDbConnection connection)
+		{
+			if (connection == null) throw new ArgumentNullException("connection");
+
+			var dp = _dataProviderTypeList[connection.GetType()];
+
+			if (dp == null)
+				throw new DataException(string.Format(
+					Resources.DbManager_UnknownConnectionType, connection.GetType().FullName));
+
+			return dp;
+		}
+
+		public static DataProviderBase GetDataProvider(string configurationString)
+		{
+			if (configurationString == null) throw new ArgumentNullException("configurationString");
+
+			if (configurationString.StartsWith(AnyProvider))
+				return FindFirstSuitableProvider(configurationString);
+
+			if (configurationString == _firstConfiguration)
+				return _firstProvider;
+
+			var dp = (DataProviderBase)_configurationList[configurationString];
+
+			if (dp == null)
+			{
+				var css = ConfigurationManager.ConnectionStrings[configurationString];
+
+				if (css != null && !string.IsNullOrEmpty(css.ProviderName))
+				{
+					string provider = null;
+
+					if (css.ProviderName == "System.Data.SqlClient")
+					{
+						try
+						{
+							using (SqlConnection sqlConnection = new SqlConnection(css.ConnectionString))
+							{
+								sqlConnection.Open();
+
+								string serverVersion = sqlConnection.ServerVersion;
+								string[] serverVersionDetails = serverVersion.Split(new string[] {"."},
+																					StringSplitOptions.None);
+
+								int versionNumber = int.Parse(serverVersionDetails[0]);
+
+								switch (versionNumber)
+								{
+									case  8: provider = "MSSQL2000"; break;
+									case  9: provider = "MSSQL2005"; break; //MSSQL 2005 -> Can the same as 2008
+									case 10: provider = "MSSQL2008"; break;
+									case 11: provider = "MSSQL2012"; break;
+									default: provider = "MSSQL2008"; break;
+								}
+							}
+						}
+						catch (Exception)
+						{}
+					}
+
+					if (provider == null)
+					{
+						// This hack should be redone.
+						//
+						provider = css.ProviderName == "System.Data.SqlClient" ?
+							configurationString.IndexOf("2012") >= 0 ? "MSSQL2012" :
+							configurationString.IndexOf("2008") >= 0 ? "MSSQL2008" :
+							configurationString.IndexOf("2000") >= 0 ? "MSSQL2000" :
+								css.ProviderName :
+								css.ProviderName;
+					}
+
+					dp = _dataProviderNameList[provider];
+				}
+				else
+				{
+					// configurationString can be:
+					// ''        : default provider,   default configuration;
+					// '.'       : default provider,   default configuration;
+					// 'foo.bar' :   'foo' provider,     'bar' configuration;
+					// 'foo.'    :   'foo' provider,   default configuration;
+					// 'foo'     : default provider,     'foo' configuration or
+					//             foo     provider,   default configuration;
+					// '.foo'    : default provider,     'foo' configuration;
+					// '.foo.bar': default provider, 'foo.bar' configuration;
+					//
+					// Default provider is SqlDataProvider
+					//
+					var cs  = configurationString.ToUpper();
+					var key = _defaultDataProviderName;
+
+					if (cs.Length > 0)
+					{
+						cs += ProviderNameDivider;
+
+						foreach (var k in _dataProviderNameList.Keys)
+						{
+							if (cs.StartsWith(k + ProviderNameDivider))
+							{
+								key = k;
+								break;
+							}
+						}
+					}
+
+					dp = _dataProviderNameList[key];
+				}
+
+				if (dp == null)
+					throw new DataException(string.Format(
+						Resources.DbManager_UnknownDataProvider, configurationString));
+
+				_configurationList[configurationString] = dp;
+			}
+
+			if (_firstConfiguration == null)
+			{
+				lock (_configurationList.SyncRoot)
+				{
+					if (_firstConfiguration == null)
+					{
+						_firstConfiguration = configurationString;
+						_firstProvider      = dp;
+					}
+				}
+			}
+
+			return dp;
+		}
+
+		private static bool IsMatchedConfigurationString(string configurationString, string csWithoutProvider)
+		{
+			int dividerPos;
+
+			return
+				!configurationString.StartsWith(AnyProvider) &&
+				(dividerPos = configurationString.IndexOf(ProviderNameDivider)) >= 0 &&
+				0 == StringComparer.OrdinalIgnoreCase.Compare
+					(configurationString.Substring(dividerPos + ProviderNameDivider.Length), csWithoutProvider);
+		}
+
+		private static DataProviderBase FindFirstSuitableProvider(string configurationString)
+		{
+			var cs = (string)_anyProviderConfigurationList[configurationString];
+			var searchRequired = (cs == null);
+
+			if (searchRequired)
+			{
+				var csWithoutProvider = configurationString.Substring(AnyProvider.Length);
+
+				if (configurationString.Length == 0) throw new ArgumentNullException("configurationString");
+
+				foreach (var str in _connectionStringList.Keys)
+				{
+					if (IsMatchedConfigurationString(str, csWithoutProvider))
+					{
+						cs = str;
+						break;
+					}
+				}
+
+				if (cs == null)
+				{
+					foreach (ConnectionStringSettings css in ConfigurationManager.ConnectionStrings)
+					{
+						if (IsMatchedConfigurationString(css.Name, csWithoutProvider))
+						{
+							cs = css.Name;
+							break;
+						}
+					}
+				}
+
+				if (cs == null)
+				{
+					foreach (var name in ConfigurationManager.AppSettings.AllKeys)
+					{
+						if (name.StartsWith("ConnectionString" + ProviderNameDivider))
+						{
+							var str = name.Substring(name.IndexOf(ProviderNameDivider) + ProviderNameDivider.Length);
+
+							if (IsMatchedConfigurationString(str, csWithoutProvider))
+							{
+								cs = str;
+								break;
+							}
+						}
+					}
+				}
+
+				if (cs == null)
+					cs = csWithoutProvider;
+			}
+
+			var dp = GetDataProvider(cs);
+
+			if (searchRequired)
+				_anyProviderConfigurationList[configurationString] = cs;
+			return dp;
+		}
+
+		private static readonly Dictionary<string,string> _connectionStringList = new Dictionary<string,string>(4);
+
+		public static string GetConnectionString(string configurationString)
+		{
+			// Use default configuration.
+			//
+			if (configurationString == null) 
+				configurationString = DefaultConfiguration;
+
+			if (_anyProviderConfigurationList.Contains(configurationString))
+				configurationString = (string)_anyProviderConfigurationList[configurationString];
+
+			string str;
+
+			// Check cached strings first.
+			//
+			if (!_connectionStringList.TryGetValue(configurationString, out str))
+			{
+				lock (_dataProviderListLock)
+				{
+					// Connection string is not in the cache.
+					//
+					var key = string.Format("ConnectionString{0}{1}",
+						configurationString.Length == 0? String.Empty: ProviderNameDivider, configurationString);
+
+					var css = ConfigurationManager.ConnectionStrings[configurationString];
+
+					str = css != null? css.ConnectionString: ConfigurationManager.AppSettings.Get(key);
+
+					if (string.IsNullOrEmpty(str))
+					{
+						throw new DataException(string.Format(
+							Resources.DbManager_UnknownConfiguration, key));
+					}
+
+					// Store the result in cache.
+					//
+					_connectionStringList[configurationString] = str;
+				}
+			}
+
+			return str;
+		}
+
+		/*
+		private void OpenConnection(string configurationString)
+		{
+			// If connection is already opened, we close it and open again.
+			//
+			if (_connection != null)
+			{
+				Dispose();
+				GC.ReRegisterForFinalize(this);
+			}
+
+			// Store the configuration string.
+			//
+			_configurationString = configurationString;
+
+			// Create and open the connection object.
+			//
+			_connection = _dataProvider.CreateConnectionObject();
+			_connection.ConnectionString = GetConnectionString(ConfigurationString);
+
+			OpenConnection();
+		}
+		 */
+
+		#endregion
+
+		#region AddDataProvider
+
+		static readonly Dictionary<string, DataProviderBase> _dataProviderNameList = new Dictionary<string, DataProviderBase>(8, StringComparer.OrdinalIgnoreCase);
+		static readonly Dictionary<Type,   DataProviderBase> _dataProviderTypeList = new Dictionary<Type,   DataProviderBase>(4);
+		static readonly object                               _dataProviderListLock = new object();
+
+		/// <summary>
+		/// Adds a new data provider.
+		/// </summary>
+		/// <remarks>
+		/// The method can be used to register a new data provider for further use.
+		/// </remarks>
+		/// <include file="Examples1.xml" path='examples/db[@name="AddDataProvider(DataProvider.IDataProvider)"]/*' />
+		/// <seealso cref="AddConnectionString(string)"/>
+		/// <seealso cref="BLToolkit.Data.DataProvider.DataProviderBase.Name"/>
+		/// <param name="dataProvider">An instance of the <see cref="BLToolkit.Data.DataProvider.DataProviderBase"/> interface.</param>
+		public static void AddDataProvider(DataProviderBase dataProvider)
+		{
+			if (null == dataProvider)
+				throw new ArgumentNullException("dataProvider");
+
+			if (string.IsNullOrEmpty(dataProvider.UniqueName))
+				throw new ArgumentException(Resources.DbManager_InvalidDataProviderName, "dataProvider");
+
+			if (string.IsNullOrEmpty(dataProvider.ProviderName))
+				throw new ArgumentException(Resources.DbManager_InvalidDataProviderProviderName, "dataProvider");
+
+			if (dataProvider.ConnectionType == null || !typeof(IDbConnection).IsAssignableFrom(dataProvider.ConnectionType))
+				throw new ArgumentException(Resources.DbManager_InvalidDataProviderConnectionType, "dataProvider");
+
+			lock (_dataProviderListLock)
+			{
+				_dataProviderNameList[dataProvider.UniqueName.ToUpper()] = dataProvider;
+				_dataProviderNameList[dataProvider.ProviderName]   = dataProvider;
+				_dataProviderTypeList[dataProvider.ConnectionType] = dataProvider;
+			}
+		}
+
+		/// <summary>
+		/// Adds a new data provider witch a specified name.
+		/// </summary>
+		/// <remarks>
+		/// The method can be used to register a new data provider for further use.
+		/// </remarks>
+		/// <include file="Examples1.xml" path='examples/db[@name="AddDataProvider(DataProvider.IDataProvider)"]/*' />
+		/// <seealso cref="AddConnectionString(string)"/>
+		/// <seealso cref="BLToolkit.Data.DataProvider.DataProviderBase.Name"/>
+		/// <param name="providerName">The data provider name.</param>
+		/// <param name="dataProvider">An instance of the <see cref="BLToolkit.Data.DataProvider.DataProviderBase"/> interface.</param>
+		public static void AddDataProvider(string providerName, DataProviderBase dataProvider)
+		{
+			if (dataProvider == null)
+				throw new ArgumentNullException("dataProvider");
+
+			if (string.IsNullOrEmpty(providerName))
+				throw new ArgumentException(Resources.DbManager_InvalidDataProviderName, "providerName");
+
+			dataProvider.UniqueName = providerName;
+			AddDataProvider(dataProvider);
+		}
+
+		/// <summary>
+		/// Adds a new data provider.
+		/// </summary>
+		/// <remarks>
+		/// The method can be used to register a new data provider for further use.
+		/// </remarks>
+		/// <seealso cref="AddConnectionString(string)"/>
+		/// <seealso cref="BLToolkit.Data.DataProvider.DataProviderBase.Name"/>
+		/// <param name="dataProviderType">A data provider type.</param>
+		public static void AddDataProvider(Type dataProviderType)
+		{
+			AddDataProvider((DataProviderBase)Activator.CreateInstance(dataProviderType));
+		}
+
+		/// <summary>
+		/// Adds a new data provider witch a specified name.
+		/// </summary>
+		/// <remarks>
+		/// The method can be used to register a new data provider for further use.
+		/// </remarks>
+		/// <seealso cref="AddConnectionString(string)"/>
+		/// <seealso cref="BLToolkit.Data.DataProvider.DataProviderBase.Name"/>
+		/// <param name="providerName">The data provider name.</param>
+		/// <param name="dataProviderType">A data provider type.</param>
+		public static void AddDataProvider(string providerName, Type dataProviderType)
+		{
+			AddDataProvider(providerName, (DataProviderBase)Activator.CreateInstance(dataProviderType));
+		}
+
+		#endregion
+
+		#region AddConnectionString
+
+		/// <summary>
+		/// Adds a new connection string or replaces existing one.
+		/// </summary>
+		/// <remarks>
+		/// Use this method when you use only one configuration and 
+		/// you don't want to use a configuration file.
+		/// </remarks>
+		/// <include file="Examples.xml" path='examples/db[@name="AddConnectionString(string)"]/*' />
+		/// <param name="connectionString">A valid database connection string.</param>
+		public static void AddConnectionString(string connectionString)
+		{
+			AddConnectionString(string.Empty, connectionString);
+		}
+
+		/// <summary>
+		/// Adds a new connection string or replaces existing one.
+		/// </summary>
+		/// <remarks>
+		/// Use this method when you use multiple configurations and 
+		/// you don't want to use a configuration file.
+		/// </remarks>
+		/// <include file="Examples.xml" path='examples/db[@name="AddConnectionString(string,string)"]/*' />
+		/// <param name="configurationString">The configuration string.</param>
+		/// <param name="connectionString">A valid database connection string.</param>
+		public static void AddConnectionString(string configurationString, string connectionString)
+		{
+			_connectionStringList[configurationString] = connectionString;
+		}
+
+		/// <summary>
+		/// Adds a new connection string or replaces existing one.
+		/// </summary>
+		/// <remarks>
+		/// Use this method when you use multiple configurations and 
+		/// you don't want to use a configuration file.
+		/// </remarks>
+		/// <include file="Examples.xml" path='examples/db[@name="AddConnectionString(string,string)"]/*' />
+		/// <param name="providerName">The data provider name.</param>
+		/// <param name="configurationString">The configuration string.</param>
+		/// <param name="connectionString">A valid database connection string.</param>
+		public static void AddConnectionString(
+			string providerName, string configurationString, string connectionString)
+		{
+			AddConnectionString(providerName + ProviderNameDivider + configurationString, connectionString);
+		}
+
+		#endregion
+
+		#region Public Static Properties
+
+		public const string ProviderNameDivider = ".";
+		public const string AnyProvider = "*" + ProviderNameDivider;
+
+		private static readonly string _defaultDataProviderName;
+		private static          string _defaultConfiguration;
+
+		/// <summary>
+		/// Gets and sets the default configuration string.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="ConfigurationString"/> property 
+		/// for an explanation and use of the default configuration.
+		/// </remarks>
+		/// <value>
+		/// A string containing default configuration settings.
+		/// </value>
+		/// <seealso cref="ConfigurationString"/>
+		public static string DefaultConfiguration
+		{
+			get
+			{
+				if (_defaultConfiguration == null)
+				{
+					// Grab first registered configuration.
+					//
+					var defaultConfiguration = _connectionStringList.Select(de => de.Key).FirstOrDefault();
+
+					if (defaultConfiguration == null)
+					{
+						defaultConfiguration = string.Empty;
+
+						foreach (ConnectionStringSettings css in ConfigurationManager.ConnectionStrings)
+						{
+							if (css.ElementInformation.Source != null &&
+								!css.ElementInformation.Source.EndsWith("machine.config", StringComparison.OrdinalIgnoreCase))
+							{
+								defaultConfiguration = css.Name;
+								break;
+							}
+						}
+					}
+
+					_defaultConfiguration = defaultConfiguration;
+				}
+
+				return _defaultConfiguration;
+			}
+
+			set { _defaultConfiguration = value; }
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DbManager.Linq.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,366 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+
+using BLToolkit.Aspects;
+
+namespace BLToolkit.Data
+{
+	using DataProvider;
+	using Linq;
+	using Sql;
+	using Sql.SqlProvider;
+
+	public partial class DbManager : IDataContext
+	{
+		public Table<T> GetTable<T>()
+			where T : class
+		{
+			return new Table<T>(this);
+		}
+
+		public Table<T> GetTable<T>(bool dispose)
+			where T : class
+		{
+			return new Table<T>(new DataContextInfo(this, dispose));
+		}
+
+		public Table<T> GetTable<T>(object instance, [NotNull]MethodInfo methodInfo, [NotNull] params object[] parameters)
+			where T : class
+		{
+			return Linq.Extensions.GetTable<T>(this, instance, methodInfo, parameters);
+		}
+
+		class PreparedQuery
+		{
+			public string[]           Commands;
+			public List<SqlParameter> SqlParameters;
+			public IDbDataParameter[] Parameters;
+			public SqlQuery           SqlQuery;
+			public ISqlProvider       SqlProvider;
+		}
+
+		#region SetQuery
+
+		object IDataContext.SetQuery(IQueryContext queryContext)
+		{
+			var query = GetCommand(queryContext);
+
+			GetParameters(queryContext, query);
+
+			if (TraceSwitch.TraceInfo)
+				WriteTraceLine(((IDataContext)this).GetSqlText(query).Replace("\r", ""), TraceSwitch.DisplayName);
+
+			return query;
+		}
+
+		PreparedQuery GetCommand(IQueryContext query)
+		{
+			if (query.Context != null)
+			{
+				return new PreparedQuery
+				{
+					Commands      = (string[])query.Context,
+					SqlParameters = query.SqlQuery.Parameters,
+					SqlQuery      = query.SqlQuery
+				 };
+			}
+
+			var sql = query.SqlQuery.ProcessParameters();
+
+			var newSql = ProcessQuery(sql);
+
+			if (sql != newSql)
+			{
+				sql = newSql;
+				sql.IsParameterDependent = true;
+			}
+
+			var sqlProvider = DataProvider.CreateSqlProvider();
+
+			var cc = sqlProvider.CommandCount(sql);
+			var sb = new StringBuilder();
+
+			var commands = new string[cc];
+
+			for (var i = 0; i < cc; i++)
+			{
+				sb.Length = 0;
+
+				sqlProvider.BuildSql(i, sql, sb, 0, 0, false);
+				commands[i] = sb.ToString();
+			}
+
+			if (!query.SqlQuery.IsParameterDependent)
+				query.Context = commands;
+
+			return new PreparedQuery
+			{
+				Commands      = commands,
+				SqlParameters = sql.Parameters,
+				SqlQuery      = sql,
+				SqlProvider   = sqlProvider
+			};
+		}
+
+		protected virtual SqlQuery ProcessQuery(SqlQuery sqlQuery)
+		{
+			return sqlQuery;
+		}
+
+		void GetParameters(IQueryContext query, PreparedQuery pq)
+		{
+			var parameters = query.GetParameters();
+
+			if (parameters.Length == 0 && pq.SqlParameters.Count == 0)
+				return;
+
+			var x = DataProvider.Convert("x", ConvertType.NameToQueryParameter).ToString();
+			var y = DataProvider.Convert("y", ConvertType.NameToQueryParameter).ToString();
+
+			var parms = new List<IDbDataParameter>(x == y ? pq.SqlParameters.Count : parameters.Length);
+
+			if (x == y)
+			{
+				for (var i = 0; i < pq.SqlParameters.Count; i++)
+				{
+					var sqlp = pq.SqlParameters[i];
+
+					if (sqlp.IsQueryParameter)
+					{
+						var parm = parameters.Length > i && parameters[i] == sqlp ? parameters[i] : parameters.First(p => p == sqlp);
+						AddParameter(parms, x, parm);
+					}
+				}
+			}
+			else
+			{
+				foreach (var parm in parameters)
+				{
+					if (parm.IsQueryParameter && pq.SqlParameters.Contains(parm))
+					{
+						var name = DataProvider.Convert(parm.Name, ConvertType.NameToQueryParameter).ToString();
+						AddParameter(parms, name, parm);
+					}
+				}
+			}
+
+			pq.Parameters = parms.ToArray();
+		}
+
+		void AddParameter(ICollection<IDbDataParameter> parms, string name, SqlParameter parm)
+		{
+			var value = MappingSchema.ConvertParameterValue(parm.Value, parm.SystemType);
+
+			if (value != null)
+			{
+				if (parm.DbType == DbType.Object)
+					parms.Add(Parameter(name, value));
+				else if (parm.DbSize == 0)
+					parms.Add(Parameter(name, value, parm.DbType));
+				else
+					parms.Add(Parameter(name, value, parm.DbType, parm.DbSize));
+			}
+			else
+			{
+                var dataType = DataProvider.GetDbType(parm.SystemType);
+			    if (parm.DbType != DbType.Object)
+			        dataType = parm.DbType;
+				parms.Add(dataType == DbType.Object ? Parameter(name, value) : Parameter(name, null, dataType));
+			}
+		}
+
+		#endregion
+
+		#region ExecuteXXX
+
+		int IDataContext.ExecuteNonQuery(object query)
+		{
+			var pq = (PreparedQuery)query;
+
+			SetCommand(pq.Commands[0], pq.Parameters);
+
+			var now = default(DateTime);
+
+			if (TraceSwitch.TraceInfo)
+				now = DateTime.Now;
+
+			var n = ExecuteNonQuery();
+
+			if (TraceSwitch.TraceInfo)
+				WriteTraceLine(string.Format("Execution time: {0}. Records affected: {1}.\r\n", DateTime.Now - now, n), TraceSwitch.DisplayName);
+
+			return n;
+		}
+
+		object IDataContext.ExecuteScalar(object query)
+		{
+			var now = default(DateTime);
+
+			if (TraceSwitch.TraceInfo)
+				now = DateTime.Now;
+
+			var ret = ExecuteScalarInternal(query);
+
+			if (TraceSwitch.TraceInfo)
+				WriteTraceLine(string.Format("Execution time: {0}\r\n", DateTime.Now - now), TraceSwitch.DisplayName);
+
+			return ret;
+		}
+
+		object ExecuteScalarInternal(object query)
+		{
+			var pq = (PreparedQuery)query;
+
+			SetCommand(pq.Commands[0], pq.Parameters);
+
+			IDbDataParameter idparam = null;
+
+			if ((pq.SqlProvider ?? DataProvider.CreateSqlProvider()).IsIdentityParameterRequired)
+			{
+				var sql = pq.SqlQuery;
+
+				if (sql.IsInsert && sql.Insert.WithIdentity)
+				{
+					var pname = DataProvider.Convert("IDENTITY_PARAMETER", ConvertType.NameToQueryParameter).ToString();
+					idparam = OutputParameter(pname, DbType.Decimal);
+					DataProvider.AttachParameter(Command, idparam);
+				}
+			}
+
+			if (pq.Commands.Length == 1)
+			{
+				if (idparam != null)
+				{
+					ExecuteNonQuery(); // так сделано потому, что фаерберд провайдер не возвращает никаких параметров через ExecuteReader
+					                   // остальные провайдеры должны поддерживать такой режим
+					return idparam.Value;
+				}
+
+				return ExecuteScalar();
+			}
+
+			ExecuteNonQuery();
+
+			return SetCommand(pq.Commands[1]).ExecuteScalar();
+		}
+
+		IDataReader IDataContext.ExecuteReader(object query)
+		{
+			var pq = (PreparedQuery)query;
+
+			SetCommand(pq.Commands[0], pq.Parameters);
+
+			var now = default(DateTime);
+
+			if (TraceSwitch.TraceInfo)
+				now = DateTime.Now;
+
+			var ret = ExecuteReader();
+
+			if (TraceSwitch.TraceInfo)
+				WriteTraceLine(string.Format("Execution time: {0}\r\n", DateTime.Now - now), TraceSwitch.DisplayName);
+
+			return ret;
+		}
+
+		void IDataContext.ReleaseQuery(object query)
+		{
+		}
+
+		#endregion
+
+		#region GetSqlText
+
+		string IDataContext.GetSqlText(object query)
+		{
+			var pq = (PreparedQuery)query;
+
+			var sqlProvider = pq.SqlProvider ?? DataProvider.CreateSqlProvider();
+
+			var sb = new StringBuilder();
+
+			sb.Append("-- ").Append(ConfigurationString);
+
+			if (ConfigurationString != DataProvider.Name)
+				sb.Append(' ').Append(DataProvider.Name);
+
+			if (DataProvider.Name != sqlProvider.Name)
+				sb.Append(' ').Append(sqlProvider.Name);
+
+			sb.AppendLine();
+
+			if (pq.Parameters != null && pq.Parameters.Length > 0)
+			{
+				foreach (var p in pq.Parameters)
+					sb
+						.Append("-- DECLARE ")
+						.Append(p.ParameterName)
+						.Append(' ')
+						.Append(p.Value == null ? p.DbType.ToString() : p.Value.GetType().Name)
+						.AppendLine();
+
+				sb.AppendLine();
+
+				foreach (var p in pq.Parameters)
+				{
+					var value = p.Value;
+
+					if (value is string || value is char)
+						value = "'" + value.ToString().Replace("'", "''") + "'";
+
+					sb
+						.Append("-- SET ")
+						.Append(p.ParameterName)
+						.Append(" = ")
+						.Append(value)
+						.AppendLine();
+				}
+
+				sb.AppendLine();
+			}
+
+			foreach (var command in pq.Commands)
+				sb.AppendLine(command);
+
+			while (sb[sb.Length - 1] == '\n' || sb[sb.Length - 1] == '\r')
+				sb.Length--;
+
+			sb.AppendLine();
+
+			return sb.ToString();
+		}
+
+		#endregion
+
+		#region IDataContext Members
+
+		IDataContext IDataContext.Clone(bool forNestedQuery)
+		{
+			if (forNestedQuery && _connection != null && IsMarsEnabled)
+				return new DbManager(_dataProvider, _connection) { _mappingSchema = _mappingSchema, _transaction = _transaction };
+
+			return Clone();
+		}
+
+		string IDataContext.ContextID
+		{
+			get { return DataProvider.Name; }
+		}
+
+		static Func<ISqlProvider> GetCreateSqlProvider(DataProviderBase dp)
+		{
+			return dp.CreateSqlProvider;
+		}
+
+		Func<ISqlProvider> IDataContext.CreateSqlProvider
+		{
+			get { return GetCreateSqlProvider(DataProvider); }
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/DbManager.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4485 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Data.Common;
+using System.Data.SqlTypes;
+using System.Diagnostics;
+using System.Text;
+
+#region ReSharper disable
+// ReSharper disable UnusedParameter.Local
+#pragma warning disable 1589
+#endregion
+
+namespace BLToolkit.Data
+{
+	using Common;
+	using DataProvider;
+	using Mapping;
+	using Properties;
+	using Reflection;
+	using Sql;
+
+	/// <summary>
+	/// The <b>DbManager</b> is a primary class of the <see cref="BLToolkit.Data"/> namespace
+	/// that can be used to execute commands of different database providers.
+	/// </summary>
+	/// <remarks>
+	/// When the <b>DbManager</b> goes out of scope, it does not close the internal connection object.
+	/// Therefore, you must explicitly close the connection by calling <see cref="Close"/> or 
+	/// <see cref="Dispose(bool)"/>. Also, you can use the C# <b>using</b> statement.
+	/// </remarks>
+	/// <include file="Examples.xml" path='examples/db[@name="DbManager"]/*' />
+	[DesignerCategory(@"Code")]
+	public partial class DbManager: Component
+	{
+		#region Init
+
+		public DbManager(DataProviderBase dataProvider, string connectionString)
+		{
+			if (dataProvider     == null) throw new ArgumentNullException("dataProvider");
+			if (connectionString == null) throw new ArgumentNullException("connectionString");
+
+			_dataProvider = dataProvider;
+			_connection   = dataProvider.CreateConnectionObject();
+
+			_connection.ConnectionString = connectionString;
+
+			_dataProvider.InitDbManager(this);
+		}
+
+		public DbManager(DataProviderBase dataProvider, IDbConnection connection)
+		{
+			if (dataProvider == null) throw new ArgumentNullException("dataProvider");
+			if (connection   == null) throw new ArgumentNullException("connection");
+
+			_dataProvider = dataProvider;
+			_connection   = connection;
+
+			_dataProvider.InitDbManager(this);
+		}
+
+		public DbManager(DataProviderBase dataProvider, IDbTransaction transaction)
+		{
+			if (dataProvider == null) throw new ArgumentNullException("dataProvider");
+			if (transaction  == null) throw new ArgumentNullException("transaction");
+
+			_dataProvider     = dataProvider;
+			_connection       = transaction.Connection;
+			_transaction      = transaction;
+			_closeTransaction = false;
+
+			_dataProvider.InitDbManager(this);
+		}
+
+		DbManager(int n)
+		{
+		}
+
+		public virtual DbManager Clone()
+		{
+			var clone =
+				new DbManager(0)
+				{
+					_configurationString = _configurationString,
+					_dataProvider        = _dataProvider,
+					_mappingSchema       = _mappingSchema
+				};
+
+			if (_connection != null)
+				clone._connection = CloneConnection();
+
+			return clone;
+		}
+
+		public string LastQuery;
+
+		#endregion
+
+		#region Public Properties
+
+		private MappingSchema _mappingSchema = Map.DefaultSchema;
+		/// <summary>
+		/// Gets the <see cref="BLToolkit.Mapping.MappingSchema"/> 
+		/// used by this instance of the <see cref="DbManager"/>.
+		/// </summary>
+		/// <value>
+		/// A mapping schema.
+		/// </value>
+		public MappingSchema MappingSchema
+		{
+			[DebuggerStepThrough]
+			get { return _mappingSchema; }
+			set { _mappingSchema = value ?? Map.DefaultSchema; }
+		}
+
+		private DataProviderBase _dataProvider;
+		/// <summary>
+		/// Gets the <see cref="BLToolkit.Data.DataProvider.DataProviderBase"/> 
+		/// used by this instance of the <see cref="DbManager"/>.
+		/// </summary>
+		/// <value>
+		/// A data provider.
+		/// </value>
+		/// <include file="Examples.xml" path='examples/db[@name="DataProvider"]/*' />
+		public DataProviderBase DataProvider
+		{
+			[DebuggerStepThrough]
+			get           { return _dataProvider;  }
+			protected set { _dataProvider = value; }
+		}
+
+		private static TraceSwitch _traceSwitch;
+		public  static TraceSwitch  TraceSwitch
+		{
+			get { return _traceSwitch ?? (_traceSwitch = new TraceSwitch("DbManager", "DbManager trace switch",
+#if DEBUG
+				"Warning"
+#else
+				"Off"
+#endif
+				)); }
+			set { _traceSwitch = value; }
+		}
+
+		public static void TurnTraceSwitchOn()
+		{
+			TraceSwitch = new TraceSwitch("DbManager", "DbManager trace switch", "Info");
+		}
+
+		public static Action<string,string> WriteTraceLine = (message, displayName) => Debug.WriteLine(message, displayName);
+
+		private    bool _canRaiseEvents = true;
+		public new bool  CanRaiseEvents
+		{
+			get { return _canRaiseEvents && base.CanRaiseEvents; }
+			set { _canRaiseEvents = value; }
+		}
+
+        /// <summary>
+        /// Use plain text query instead of using command parameters
+        /// </summary>
+        public bool UseQueryText { get; set; }
+
+		#endregion
+
+		#region Connection
+
+		private bool          _closeConnection;
+		private IDbConnection _connection;
+		/// <summary>
+		/// Gets or sets the <see cref="IDbConnection"/> used by this instance of the <see cref="DbManager"/>.
+		/// </summary>
+		/// <value>
+		/// The connection to the data source.
+		/// </value>
+		/// <remarks>
+		/// Then you set a connection object, it has to match the data source type.
+		/// </remarks>
+		/// <exception cref="DataException">
+		/// A connection does not match the data source type.
+		/// </exception>
+		/// <include file="Examples.xml" path='examples/db[@name="Connection"]/*' />
+		public IDbConnection Connection
+		{
+			[DebuggerStepThrough]
+			get
+			{
+				if (_connection.State == ConnectionState.Closed)
+					OpenConnection();
+				return _connection;
+			}
+
+			set
+			{
+				if (value == null)
+					throw new ArgumentNullException("value");
+
+				if (value.GetType() != _dataProvider.ConnectionType)
+					InitDataProvider(value);
+
+				_connection      = value;
+				_closeConnection = false;
+			}
+		}
+
+		[Obsolete]
+		protected virtual string GetConnectionString(IDbConnection connection)
+		{
+			return connection.ConnectionString;
+		}
+
+		private void OpenConnection()
+		{
+			ExecuteOperation(OperationType.OpenConnection, _connection.Open);
+			_closeConnection = true;
+		}
+
+		/// <summary>
+		/// Closes the connection to the database.
+		/// </summary>
+		/// <remarks>
+		/// The <b>Close</b> method rolls back any pending transactions
+		/// and then closes the connection.
+		/// </remarks>
+		/// <include file="Examples.xml" path='examples/db[@name="Close()"]/*' />
+		/// <seealso cref="Dispose(bool)"/>
+		public void Close()
+		{
+			if (OnClosing != null)
+				OnClosing(this, EventArgs.Empty);
+
+			if (_selectCommand != null) { _selectCommand.Dispose(); _selectCommand = null; }
+			if (_insertCommand != null) { _insertCommand.Dispose(); _insertCommand = null; }
+			if (_updateCommand != null) { _updateCommand.Dispose(); _updateCommand = null; }
+			if (_deleteCommand != null) { _deleteCommand.Dispose(); _deleteCommand = null; }
+
+			if (_transaction != null && _closeTransaction)
+			{
+				ExecuteOperation(OperationType.DisposeTransaction, _transaction.Dispose);
+				_transaction = null;
+			}
+
+			if (_connection != null && _closeConnection)
+			{
+				ExecuteOperation(OperationType.CloseConnection, _connection.Dispose);
+				_connection = null;
+			}
+
+			if (OnClosed != null)
+				OnClosed(this, EventArgs.Empty);
+		}
+
+		private bool? _isMarsEnabled;
+		public  bool   IsMarsEnabled
+		{
+			get
+			{
+				if (_isMarsEnabled == null)
+					_isMarsEnabled = DataProvider.IsMarsEnabled(Connection);
+
+				return _isMarsEnabled.Value;
+			}
+			set { _isMarsEnabled = value; }
+		}
+
+		#endregion
+
+		#region Transactions
+
+		private bool           _closeTransaction = true;
+		private IDbTransaction _transaction;
+		/// <summary>
+		/// Gets the <see cref="IDbTransaction"/> used by this instance of the <see cref="DbManager"/>.
+		/// </summary>
+		/// <value>
+		/// The <see cref="IDbTransaction"/>. The default value is a null reference.
+		/// </value>
+		/// <remarks>
+		/// You have to call the <see cref="BeginTransaction()"/> method to begin a transaction.
+		/// </remarks>
+		/// <include file="Examples.xml" path='examples/db[@name="Transaction"]/*' />
+		/// <seealso cref="BeginTransaction()"/>
+		public IDbTransaction Transaction
+		{
+			[DebuggerStepThrough]
+			get { return _transaction; }
+		}
+
+		/// <summary>
+		/// Begins a database transaction.
+		/// </summary>
+		/// <remarks>
+		/// Once the transaction has completed, you must explicitly commit or roll back the transaction
+		/// by using the <see cref="System.Data.IDbTransaction.Commit"/>> or 
+		/// <see cref="System.Data.IDbTransaction.Rollback"/> methods.
+		/// </remarks>
+		/// <include file="Examples.xml" path='examples/db[@name="BeginTransaction()"]/*' />
+		/// <returns>This instance of the <see cref="DbManager"/>.</returns>
+		/// <seealso cref="Transaction"/>
+		public virtual DbManager BeginTransaction()
+		{
+			return BeginTransaction(IsolationLevel.ReadCommitted);
+		}
+
+		/// <summary>
+		/// Begins a database transaction with the specified <see cref="IsolationLevel"/> value.
+		/// </summary>
+		/// <remarks>
+		/// Once the transaction has completed, you must explicitly commit or roll back the transaction
+		/// by using the <see cref="System.Data.IDbTransaction.Commit"/> or 
+		/// <see cref="System.Data.IDbTransaction.Rollback"/> methods.
+		/// </remarks>
+		/// <include file="Examples.xml" path='examples/db[@name="BeginTransaction(IsolationLevel)"]/*' />
+		/// <param name="il">One of the <see cref="IsolationLevel"/> values.</param>
+		/// <returns>This instance of the <see cref="DbManager"/>.</returns>
+		public virtual DbManager BeginTransaction(IsolationLevel il)
+		{
+			// If transaction is open, we dispose it, it will rollback all changes.
+			//
+			if (_transaction != null)
+			{
+				ExecuteOperation(OperationType.DisposeTransaction, _transaction.Dispose);
+			}
+
+			// Create new transaction object.
+			//
+			_transaction = ExecuteOperation(
+				OperationType.BeginTransaction,
+				() => Connection.BeginTransaction(il));
+
+			_closeTransaction = true;
+
+			// If the active command exists.
+			//
+			if (_selectCommand != null) _selectCommand.Transaction = _transaction;
+			if (_insertCommand != null) _insertCommand.Transaction = _transaction;
+			if (_updateCommand != null) _updateCommand.Transaction = _transaction;
+			if (_deleteCommand != null) _deleteCommand.Transaction = _transaction;
+
+			return this;
+		}
+
+		/// <summary>
+		/// Commits the database transaction.
+		/// </summary>
+		/// <returns>This instance of the <see cref="DbManager"/>.</returns>
+		public virtual DbManager CommitTransaction()
+		{
+			if (_transaction != null)
+			{
+				ExecuteOperation(OperationType.CommitTransaction, _transaction.Commit);
+
+				if (_closeTransaction)
+				{
+					ExecuteOperation(OperationType.DisposeTransaction, _transaction.Dispose);
+					_transaction = null;
+				}
+			}
+
+			return this;
+		}
+
+		/// <summary>
+		/// Rolls back a transaction from a pending state.
+		/// </summary>
+		/// <returns>This instance of the <see cref="DbManager"/>.</returns>
+		public virtual DbManager RollbackTransaction()
+		{
+			if (_transaction != null)
+			{
+				ExecuteOperation(OperationType.RollbackTransaction, _transaction.Rollback);
+
+				if (_closeTransaction)
+				{
+					ExecuteOperation(OperationType.DisposeTransaction, _transaction.Dispose);
+					_transaction = null;
+				}
+			}
+
+			return this;
+		}
+
+		#endregion
+
+		#region Commands
+
+		private IDbCommand _selectCommand;
+		/// <summary>
+		/// Gets the <see cref="IDbCommand"/> used by this instance of the <see cref="DbManager"/>.
+		/// </summary>
+		/// <value>
+		/// A <see cref="IDbCommand"/> used during executing query.
+		/// </value>
+		/// <remarks>
+		/// The <b>Command</b> can be used to access command parameters.
+		/// </remarks>
+		/// <include file="Examples.xml" path='examples/db[@name="Command"]/*' />
+		public IDbCommand Command
+		{
+			[DebuggerStepThrough]
+			get { return SelectCommand; }
+		}
+
+		/// <summary>
+		/// Gets the select <see cref="IDbCommand"/> used by this instance of the <see cref="DbManager"/>.
+		/// </summary>
+		/// <value>
+		/// A <see cref="IDbCommand"/> used during executing query.
+		/// </value>
+		/// <remarks>
+		/// The <b>SelectCommand</b> can be used to access select command parameters.
+		/// </remarks>
+		/// <include file="Examples.xml" path='examples/db[@name="Command"]/*' />
+		public IDbCommand SelectCommand
+		{
+			[DebuggerStepThrough]
+			get { return _selectCommand = OnInitCommand(_selectCommand); }
+		}
+
+		private IDbCommand _insertCommand;
+		/// <summary>
+		/// Gets the insert <see cref="IDbCommand"/> used by this instance of the <see cref="DbManager"/>.
+		/// </summary>
+		/// <value>
+		/// A <see cref="IDbCommand"/> used during executing query.
+		/// </value>
+		/// <remarks>
+		/// The <b>InsertCommand</b> can be used to access insert command parameters.
+		/// </remarks>
+		/// <include file="Examples.xml" path='examples/db[@name="Command"]/*' />
+		public IDbCommand InsertCommand
+		{
+			[DebuggerStepThrough]
+			get { return _insertCommand = OnInitCommand(_insertCommand); }
+		}
+
+		private IDbCommand _updateCommand;
+		/// <summary>
+		/// Gets the update <see cref="IDbCommand"/> used by this instance of the <see cref="DbManager"/>.
+		/// </summary>
+		/// <value>
+		/// A <see cref="IDbCommand"/> used during executing query.
+		/// </value>
+		/// <remarks>
+		/// The <b>UpdateCommand</b> can be used to access update command parameters.
+		/// </remarks>
+		/// <include file="Examples.xml" path='examples/db[@name="Command"]/*' />
+		public IDbCommand UpdateCommand
+		{
+			[DebuggerStepThrough]
+			get { return _updateCommand = OnInitCommand(_updateCommand); }
+		}
+
+		private IDbCommand _deleteCommand;
+		/// <summary>
+		/// Gets the delete <see cref="IDbCommand"/> used by this instance of the <see cref="DbManager"/>.
+		/// </summary>
+		/// <value>
+		/// A <see cref="IDbCommand"/> used during executing query.
+		/// </value>
+		/// <remarks>
+		/// The <b>DeleteCommand</b> can be used to access delete command parameters.
+		/// </remarks>
+		/// <include file="Examples.xml" path='examples/db[@name="Command"]/*' />
+		public IDbCommand DeleteCommand
+		{
+			[DebuggerStepThrough]
+			get { return _deleteCommand = OnInitCommand(_deleteCommand); }
+		}
+
+		/// <summary>
+		/// Initializes a command and raises the <see cref="InitCommand"/> event.
+		/// </summary>
+		protected virtual IDbCommand OnInitCommand(IDbCommand command)
+		{
+			if (command == null)
+			{
+				// Create a command object.
+				//
+				command = _dataProvider.CreateCommandObject(Connection);
+
+				// If an active transaction exists.
+				//
+				if (Transaction != null)
+				{
+					command.Transaction = Transaction;
+				}
+			}
+
+			if (CanRaiseEvents)
+			{
+				var handler = (InitCommandEventHandler)Events[_eventInitCommand];
+
+				if (handler != null)
+					handler(this, new InitCommandEventArgs(command));
+			}
+
+			return command;
+		}
+
+		/// <summary>
+		/// Helper function. Creates the command object and sets command type and command text.
+		/// </summary>
+		/// <param name="commandAction">Command action.</param>
+		/// <param name="commandType">The <see cref="System.Data.CommandType"/>
+		/// (stored procedure, text, etc.)</param>
+		/// <param name="sql">The SQL statement.</param>
+		/// <returns>The command object.</returns>
+		private IDbCommand GetCommand(CommandAction commandAction, CommandType commandType, string sql)
+		{
+			var command = GetCommand(commandAction, commandType);
+
+			command.Parameters.Clear();
+			command.CommandType = commandType;
+			command.CommandText = sql;
+
+			return command;
+		}
+
+		#endregion
+
+		#region Events
+
+		public event EventHandler OnClosing;
+		public event EventHandler OnClosed;
+
+		private static readonly object _eventBeforeOperation = new object();
+		/// <summary>
+		/// Occurs when a server-side operation is about to start.
+		/// </summary>
+		public event OperationTypeEventHandler BeforeOperation
+		{
+			add    { Events.AddHandler   (_eventBeforeOperation, value); }
+			remove { Events.RemoveHandler(_eventBeforeOperation, value); }
+		}
+
+		private static readonly object _eventAfterOperation = new object();
+		/// <summary>
+		/// Occurs when a server-side operation is complete.
+		/// </summary>
+		public event OperationTypeEventHandler AfterOperation
+		{
+			add    { Events.AddHandler   (_eventAfterOperation, value); }
+			remove { Events.RemoveHandler(_eventAfterOperation, value); }
+		}
+
+		private static readonly object _eventOperationException = new object();
+		/// <summary>
+		/// Occurs when a server-side operation is failed to execute.
+		/// </summary>
+		public event OperationExceptionEventHandler OperationException
+		{
+			add    { Events.AddHandler   (_eventOperationException, value); }
+			remove { Events.RemoveHandler(_eventOperationException, value); }
+		}
+
+		private static readonly object _eventInitCommand = new object();
+		/// <summary>
+		/// Occurs when the <see cref="Command"/> is initializing.
+		/// </summary>
+		public event InitCommandEventHandler InitCommand
+		{
+			add    { Events.AddHandler   (_eventInitCommand, value); }
+			remove { Events.RemoveHandler(_eventInitCommand, value); }
+		}
+
+		/// <summary>
+		/// Raises the <see cref="BeforeOperation"/> event.
+		/// </summary>
+		/// <param name="op">The <see cref="OperationType"/>.</param>
+		protected virtual void OnBeforeOperation(OperationType op)
+		{
+			if (CanRaiseEvents)
+			{
+				var handler = (OperationTypeEventHandler)Events[_eventBeforeOperation];
+				if (handler != null)
+					handler(this, new OperationTypeEventArgs(op));
+			}
+		}
+
+		/// <summary>
+		/// Raises the <see cref="AfterOperation"/> event.
+		/// </summary>
+		/// <param name="op">The <see cref="OperationType"/>.</param>
+		protected virtual void OnAfterOperation(OperationType op)
+		{
+			if (CanRaiseEvents)
+			{
+				var handler = (OperationTypeEventHandler)Events[_eventAfterOperation];
+				if (handler != null)
+					handler(this, new OperationTypeEventArgs(op));
+			}
+		}
+
+		/// <summary>
+		/// Raises the <see cref="OperationException"/> event.
+		/// </summary>
+		/// <param name="op">The <see cref="OperationType"/>.</param>
+		/// <param name="ex">The <see cref="Exception"/> occurred.</param>
+		protected virtual void OnOperationException(OperationType op, DataException ex)
+		{
+			if (CanRaiseEvents)
+			{
+				var handler = (OperationExceptionEventHandler)Events[_eventOperationException];
+				if (handler != null)
+					handler(this, new OperationExceptionEventArgs(op, ex));
+			}
+
+			throw ex;
+		}
+
+		#endregion
+
+		#region Protected Methods
+
+		private IDataReader ExecuteReaderInternal()
+		{
+			return ExecuteReader(CommandBehavior.Default);
+		}
+
+		private IDataReader ExecuteReaderInternal(CommandBehavior commandBehavior)
+		{
+			return ExecuteOperation(
+				OperationType.ExecuteReader,
+				() =>
+					_dataProvider.GetDataReader(_mappingSchema, SelectCommand.ExecuteReader(commandBehavior)));
+		}
+
+		private int ExecuteNonQueryInternal()
+		{
+			return ExecuteOperation<int>(OperationType.ExecuteNonQuery, SelectCommand.ExecuteNonQuery);
+		}
+
+		#endregion
+
+		#region Parameters
+
+		private IDbDataParameter[] CreateSpParameters(string spName, object[] parameterValues, bool openNewConnectionToDiscoverParameters)
+		{
+			// Pull the parameters for this stored procedure from 
+			// the parameter cache (or discover them & populate the cache)
+			//
+			var spParameters = GetSpParameters(spName, true, openNewConnectionToDiscoverParameters);
+
+			// DbParameters are bound by name, plain parameters by order
+			//
+			var dbParameters = false;
+
+			if (parameterValues == null || parameterValues.Length == 0 ||
+				parameterValues[0] is IDbDataParameter || parameterValues[0] is IDbDataParameter[])
+			{
+				// The PrepareParameters method may add some additional parameters.
+				//
+				parameterValues = PrepareParameters(parameterValues);
+
+				if (parameterValues == null || parameterValues.Length == 0)
+					return spParameters;
+
+				dbParameters = true;
+			}
+
+			if (spParameters == null/* || commandParameters.Length == 0*/)
+			{
+				spParameters = new IDbDataParameter[parameterValues.Length];
+
+				if (dbParameters)
+					parameterValues.CopyTo(spParameters, 0);
+				else
+					for (var i = 0; i < parameterValues.Length; i++)
+						spParameters[i] = Parameter("?", parameterValues[i]);
+
+				return spParameters;
+			}
+
+			if (dbParameters)
+			{
+				// If we receive an array of IDbDataParameter, 
+				// we need to copy parameters to the IDbDataParameter[].
+				//
+				foreach (var spParam in spParameters)
+				{
+					var spParamName = spParam.ParameterName;
+					var found = false;
+
+					foreach (IDbDataParameter paramWithValue in parameterValues)
+					{
+						var parameterNamesEqual = _dataProvider.ParameterNamesEqual(spParamName, paramWithValue.ParameterName);
+						if (!parameterNamesEqual)
+						{
+							var convertedParameterName =
+								_dataProvider.Convert(paramWithValue.ParameterName, ConvertType.NameToSprocParameter).ToString();
+
+							parameterNamesEqual = _dataProvider.ParameterNamesEqual(spParamName, convertedParameterName);
+						}
+
+						if (!parameterNamesEqual) continue;
+
+						if (spParam.Direction != paramWithValue.Direction)
+						{
+							if (TraceSwitch.TraceWarning)
+								WriteTraceLine(
+									string.Format(
+										"Stored Procedure '{0}'. Parameter '{1}' has different direction '{2}'. Should be '{3}'.",
+										spName, spParamName, spParam.Direction, paramWithValue.Direction),
+									TraceSwitch.DisplayName);
+
+							spParam.Direction = paramWithValue.Direction;
+						}
+
+						if (spParam.Direction != ParameterDirection.Output)
+							spParam.Value = paramWithValue.Value;
+
+						paramWithValue.ParameterName = spParamName;
+						found = true;
+						break;
+					}
+
+					if (found == false && (
+					                       spParam.Direction == ParameterDirection.Input || 
+					                       spParam.Direction == ParameterDirection.InputOutput))
+					{
+						if (TraceSwitch.TraceWarning)
+							WriteTraceLine(
+								string.Format("Stored Procedure '{0}'. Parameter '{1}' not assigned.", spName, spParamName),
+								TraceSwitch.DisplayName);
+
+						spParam.SourceColumn = _dataProvider.Convert(spParamName, ConvertType.SprocParameterToName).ToString();
+					}
+				}
+			}
+			else
+			{
+				// Assign the provided values to the parameters based on parameter order.
+				//
+				AssignParameterValues(spName, spParameters, parameterValues);
+			}
+
+			return spParameters;
+		}
+
+		///<summary>
+		/// Creates an one-dimension array of <see cref="IDbDataParameter"/>
+		/// from any combination on IDbDataParameter, IDbDataParameter[] or null references.
+		/// Null references are stripped, arrays and single parameters are combined
+		/// into a new array.
+		///</summary>
+		/// <remarks>When two or more parameters has the same name,
+		/// the first parameter is used, all the rest are ignored.</remarks>
+		///<param name="parameters">Array of IDbDataParameter, IDbDataParameter[] or null references.</param>
+		///<returns>An normalized array of <see cref="IDbDataParameter"/> without null references.</returns>
+		///<exception cref="ArgumentException">The parameter <paramref name="parameters"/>
+		/// contains anything except IDbDataParameter, IDbDataParameter[] or null reference.</exception>
+		public virtual IDbDataParameter[] PrepareParameters(object[] parameters)
+		{
+			if (parameters == null || parameters.Length == 0)
+				return null;
+
+			// Little optimization.
+			// Check if we have only one single ref parameter.
+			//
+			object refParam = null;
+
+			foreach (var p in parameters)
+				if (p != null)
+				{
+					if (refParam != null)
+					{
+						refParam = null;
+						break;
+					}
+
+					refParam = p;
+				}
+
+			if (refParam is IDbDataParameter[])
+			{
+				return (IDbDataParameter[])refParam;
+			}
+
+			if (refParam is IDbDataParameter)
+			{
+				var oneParameterArray = new IDbDataParameter[1];
+				oneParameterArray[0] = (IDbDataParameter)refParam;
+				return oneParameterArray;
+			}
+
+			var list = new List<IDbDataParameter>(parameters.Length);
+			var hash = new Dictionary<string, IDbDataParameter>(parameters.Length);
+
+			foreach (var o in parameters)
+				if (o is IDbDataParameter)
+				{
+					var p = (IDbDataParameter) o;
+
+					if (!hash.ContainsKey(p.ParameterName))
+					{
+						list.Add(p);
+						hash.Add(p.ParameterName, p);
+					}
+				}
+				else if (o is IDbDataParameter[])
+				{
+					foreach (var p in (IDbDataParameter[]) o)
+						if (!hash.ContainsKey(p.ParameterName))
+						{
+							list.Add(p);
+							hash.Add(p.ParameterName, p);
+						}
+				}
+				else if (o != null && o != DBNull.Value)
+					throw new ArgumentException(
+						Resources.DbManager_NotDbDataParameter, "parameters");
+
+			return list.ToArray();
+		}
+
+		/// <summary>
+		/// This method is used to attach array of <see cref="IDbDataParameter"/> to a <see cref="IDbCommand"/>.
+		/// </summary>
+		/// <param name="command">The command to which the parameters will be added</param>
+		/// <param name="commandParameters">An array of IDbDataParameters tho be added to command</param>
+		private void AttachParameters(IDbCommand command, IEnumerable<IDbDataParameter> commandParameters)
+		{
+			command.Parameters.Clear();
+
+			foreach (var p in commandParameters)
+				_dataProvider.AttachParameter(command, p);
+		}
+
+		private static readonly Dictionary<string, IDbDataParameter[]> _paramCache =
+			new Dictionary<string, IDbDataParameter[]>();
+		private static readonly object _paramCacheLock = new object();
+
+		/// <summary>
+		/// Resolve at run time the appropriate set of parameters for a stored procedure.
+		/// </summary>
+		/// <param name="spName">The name of the stored procedure.</param>
+		/// <param name="includeReturnValueParameter">Whether or not to include their return value parameter.</param>
+		/// <param name="openNewConnection"></param>
+		/// <returns></returns>
+		protected virtual IDbDataParameter[] DiscoverSpParameters(string spName, bool includeReturnValueParameter, bool openNewConnection)
+		{
+			var con = openNewConnection ? CloneConnection() : _connection;
+
+			try
+			{
+				if (con.State == ConnectionState.Closed)
+				{
+					ExecuteOperation(OperationType.OpenConnection, con.Open);
+					if (!openNewConnection)
+						_closeConnection = true;
+				}
+
+				using (var cmd = con.CreateCommand())
+				{
+					cmd.CommandType = CommandType.StoredProcedure;
+					cmd.CommandText = spName;
+
+					var res = ExecuteOperation(OperationType.DeriveParameters, () => _dataProvider.DeriveParameters(cmd));
+
+					if (openNewConnection)
+						ExecuteOperation(OperationType.CloseConnection, con.Close);
+
+					if (res == false)
+						return null;
+
+					if (includeReturnValueParameter == false)
+					{
+						// All known data providers always treat
+						// the return value as first parameter.
+						//
+						cmd.Parameters.RemoveAt(0);
+					}
+
+					var discoveredParameters = new IDbDataParameter[cmd.Parameters.Count];
+
+					for (var i = 0; i < cmd.Parameters.Count; i++)
+						discoveredParameters[i] = (IDbDataParameter)cmd.Parameters[i];
+
+					return discoveredParameters;
+				}
+			}
+			finally
+			{
+				if (con != null && openNewConnection)
+					con.Dispose();
+			}
+		}
+
+		/// <summary>
+		/// Copies cached parameter array.
+		/// </summary>
+		/// <param name="originalParameters">The original parameter array.</param>
+		/// <returns>The result array.</returns>
+		private IDbDataParameter[] CloneParameters(IDbDataParameter[] originalParameters)
+		{
+			if (originalParameters == null)
+				return null;
+
+			var clonedParameters = new IDbDataParameter[originalParameters.Length];
+
+			for (var i = 0; i < originalParameters.Length; i++)
+				clonedParameters[i] = _dataProvider.CloneParameter(originalParameters[i]);
+
+			return clonedParameters;
+		}
+
+		/// <summary>
+		/// Retrieves the set of parameters appropriate for the stored procedure.
+		/// </summary>
+		/// <remarks>
+		/// This method will query the database for this information, 
+		/// and then store it in a cache for future requests.
+		/// </remarks>
+		/// <param name="spName">The name of the stored procedure.</param>
+		/// <param name="includeReturnValueParameter">A boolean value indicating
+		/// whether the return value parameter should be included in the results.</param>
+		/// <param name="openNewConnectionToDiscoverParameters"></param>
+		/// <returns>An array of the <see cref="IDbDataParameter"/>.</returns>
+		public IDbDataParameter[] GetSpParameters(string spName, bool includeReturnValueParameter, bool openNewConnectionToDiscoverParameters)
+		{
+			var key = string.Format("{0}:{1}:{2}", GetConnectionHash(), spName, includeReturnValueParameter);
+
+			IDbDataParameter[] cachedParameters;
+
+			// It is thread safe enought to check for a key and get its value without a lock.
+			//
+			if (!_paramCache.TryGetValue(key, out cachedParameters))
+			{
+				lock (_paramCacheLock)
+				{
+					// There is a possible race condition since the operation may take a time.
+					//
+					if (!_paramCache.TryGetValue(key, out cachedParameters))
+					{
+						cachedParameters = DiscoverSpParameters(spName, includeReturnValueParameter, openNewConnectionToDiscoverParameters);
+						_paramCache.Add(key, cachedParameters);
+					}
+				}
+			}
+		
+			return CloneParameters(cachedParameters);
+		}
+
+		/// <summary>
+		/// This method assigns an array of values to an array of parameters.
+		/// </summary>
+		/// <param name="spName"></param>
+		/// <param name="commandParameters">array of IDbDataParameters to be assigned values</param>
+		/// <param name="parameterValues">array of objects holding the values to be assigned</param>
+		private void AssignParameterValues(string spName, IDbDataParameter[] commandParameters, object[] parameterValues)
+		{
+			if (commandParameters == null || parameterValues == null)
+			{
+				// Do nothing if we get no data.
+				//
+				return;
+			}
+
+			var nValues = 0;
+
+			// Iterate through the parameters, assigning the values from 
+			// the corresponding position in the value array.
+			//
+			for (var index = 0; index < commandParameters.Length; index++)
+			{
+				var parameter = commandParameters[index];
+
+				if (_dataProvider.IsValueParameter(parameter))
+				{
+					if (nValues >= parameterValues.Length)
+						throw new ArgumentException(string.Format("Parsing for {0} failed: {1}", spName, GetMissedColumnNames(index, commandParameters)));
+
+					var value = parameterValues[nValues++];
+
+					_dataProvider.SetParameterValue(parameter, value ?? DBNull.Value);
+				}
+			}
+
+			// We must have the same number of values as we pave parameters to put them in.
+			//
+			if (nValues != parameterValues.Length)
+				throw new ArgumentException(string.Format("Parsing for {0} failed: {1}", spName, GetExceedParameters(nValues, parameterValues)));
+		}
+
+		string GetMissedColumnNames(int startIndex, IDbDataParameter[] commandParameters)
+		{
+			var columnNames = new List<string>();
+
+			for (var index = startIndex; index < commandParameters.Length; index++)
+			{
+				var parameter = commandParameters[index];
+
+				if (_dataProvider.IsValueParameter(parameter))
+				{
+					columnNames.Add(string.Format("{0} {{{1}}}", parameter.ParameterName, parameter.DbType));
+				}
+			}
+
+#if FW4
+			return "Missed columns: " + string.Join(", ", columnNames);
+#else
+			return "Missed columns: " + string.Join(", ", columnNames.ToArray());
+#endif
+		}
+
+		static string GetExceedParameters(int startIndex, object[] parameterValues)
+		{
+			var columnNames = new List<string>();
+
+			for (var index = startIndex; index < parameterValues.Length; index++)
+			{
+				var parameter = parameterValues[index];
+				columnNames.Add(
+					parameter == null
+						? "<null>"
+						: string.Format("{0} {{{1}}}", parameter, parameter.GetType().Name));
+			}
+
+#if FW4
+			return "Exceed parameters: " + string.Join(", ", columnNames);
+#else
+			return "Exceed parameters: " + string.Join(", ", columnNames.ToArray());
+#endif
+		}
+
+		/// <overloads>
+		/// Assigns a business object to command parameters.
+		/// </overloads>
+		/// <summary>
+		/// Assigns the <see cref="DataRow"/> to command parameters.
+		/// </summary>
+		/// <include file="Examples1.xml" path='examples/db[@name="AssignParameterValues(DataRow)"]/*' />
+		/// <remarks>
+		/// The method is used in addition to the <see cref="CreateParameters(object,IDbDataParameter[])"/> method.
+		/// </remarks>
+		/// <param name="dataRow">The <see cref="DataRow"/> to assign.</param>
+		/// <returns>This instance of the <see cref="DbManager"/>.</returns>
+		public DbManager AssignParameterValues(DataRow dataRow)
+		{
+			if (dataRow == null)
+				throw new ArgumentNullException("dataRow");
+
+			foreach (DataColumn c in dataRow.Table.Columns)
+				if (c.AutoIncrement == false && c.ReadOnly == false)
+				{
+					var o = dataRow[c.ColumnName];
+					var name = _dataProvider.Convert(c.ColumnName, GetConvertTypeToParameter()).ToString();
+
+					Parameter(name).Value =
+						c.AllowDBNull && _mappingSchema.IsNull(o) ? DBNull.Value : o;
+				}
+
+			if (_prepared)
+				InitParameters(CommandAction.Select);
+
+			return this;
+		}
+
+		/// <summary>
+		/// Assigns a business object to command parameters.
+		/// </summary>
+		/// <remarks>
+		/// The method is used in addition to the <see cref="CreateParameters(object,IDbDataParameter[])"/> method.
+		/// </remarks>
+		/// <include file="Examples1.xml" path='examples/db[@name="AssignParameterValues(object)"]/*' />
+		/// <param name="obj">An object to assign.</param>
+		/// <returns>This instance of the <see cref="DbManager"/>.</returns>
+		public DbManager AssignParameterValues(object obj)
+		{
+			if (obj == null)
+				throw new ArgumentNullException("obj");
+
+			var om = _mappingSchema.GetObjectMapper(obj.GetType());
+
+			foreach (MemberMapper mm in om)
+			{
+				var name = _dataProvider.Convert(mm.Name, GetConvertTypeToParameter()).ToString();
+
+				if (Command.Parameters.Contains(name))
+				{
+					var value = mm.GetValue(obj);
+
+					_dataProvider.SetParameterValue(
+						Parameter(name),
+						value == null || mm.MapMemberInfo.Nullable && _mappingSchema.IsNull(value)?
+							DBNull.Value: value);
+				}
+			}
+
+			if (_prepared)
+				InitParameters(CommandAction.Select);
+
+			return this;
+		}
+
+		private static Array SortArray(Array array, IComparer comparer)
+		{
+			if (array == null)
+				return null;
+
+			var arrayClone = (Array)array.Clone();
+
+			Array.Sort(arrayClone, comparer);
+
+			return arrayClone;
+		}
+
+		/// <summary>
+		/// Creates an array of parameters from the <see cref="DataRow"/> object.
+		/// </summary>
+		/// <remarks>
+		/// The method can take an additional parameter list, 
+		/// which can be created by using the same method.
+		/// </remarks>
+		/// <include file="Examples.xml" path='examples/db[@name="CreateParameters(DataRow,IDbDataParameter[])"]/*' />
+		/// <param name="dataRow">The <see cref="DataRow"/> to create parameters.</param>
+		/// <param name="commandParameters">An array of parameters to be added to the result array.</param>
+		/// <returns>An array of parameters.</returns>
+		public IDbDataParameter[] CreateParameters(
+			DataRow dataRow, params IDbDataParameter[] commandParameters)
+		{
+			return CreateParameters(dataRow, null, null, null, commandParameters);
+		}
+
+		/// <summary>
+		/// Creates an array of parameters from the <see cref="DataRow"/> object.
+		/// </summary>
+		/// <remarks>
+		/// The method can take an additional parameter list, 
+		/// which can be created by using the same method.
+		/// </remarks>
+		/// <include file="Examples.xml" path='examples/db[@name="CreateParameters(DataRow,IDbDataParameter[])"]/*' />
+		/// <param name="dataRow">The <see cref="DataRow"/> to create parameters.</param>
+		/// <param name="outputParameters">Output parameters names.</param>
+		/// <param name="inputOutputParameters">InputOutput parameters names.</param>
+		/// <param name="ignoreParameters">Parameters names to skip.</param>
+		/// <param name="commandParameters">An array of parameters to be added to the result array.</param>
+		/// <returns>An array of parameters.</returns>
+		public IDbDataParameter[] CreateParameters(
+			DataRow                   dataRow,
+			string[]                  outputParameters,
+			string[]                  inputOutputParameters,
+			string[]                  ignoreParameters,
+			params IDbDataParameter[] commandParameters)
+		{
+			if (dataRow == null)
+				throw new ArgumentNullException("dataRow");
+
+			var paramList = new ArrayList();
+			IComparer comparer  = CaseInsensitiveComparer.Default;
+
+			outputParameters      = (string[])SortArray(outputParameters,      comparer);
+			inputOutputParameters = (string[])SortArray(inputOutputParameters, comparer);
+			ignoreParameters      = (string[])SortArray(ignoreParameters,      comparer);
+
+			foreach (DataColumn c in dataRow.Table.Columns)
+			{
+				if (ignoreParameters != null && Array.BinarySearch(ignoreParameters, c.ColumnName, comparer) >= 0)
+					continue;
+
+				if (c.AutoIncrement || c.ReadOnly)
+					continue;
+
+				var name = _dataProvider.Convert(c.ColumnName, GetConvertTypeToParameter()).ToString();
+				var parameter =
+					c.AllowDBNull
+						? NullParameter(name, dataRow[c.ColumnName])
+						: Parameter    (name, dataRow[c.ColumnName]);
+
+				if (outputParameters != null && Array.BinarySearch(outputParameters, c.ColumnName, comparer) >= 0)
+					parameter.Direction = ParameterDirection.Output;
+				else if (inputOutputParameters != null && Array.BinarySearch(inputOutputParameters, c.ColumnName, comparer) >= 0)
+					parameter.Direction = ParameterDirection.InputOutput;
+
+				paramList.Add(parameter);
+			}
+
+			if (commandParameters != null)
+				paramList.AddRange(commandParameters);
+
+			return (IDbDataParameter[])paramList.ToArray(typeof(IDbDataParameter));
+		}
+
+		/// <summary>
+		/// Creates an array of parameters from a business object.
+		/// </summary>
+		/// <remarks>
+		/// The method can take an additional parameter list, 
+		/// which can be created by using the same method.
+		/// </remarks>
+		/// <include file="Examples.xml" path='examples/db[@name="CreateParameters(object,IDbDataParameter[])"]/*' />
+		/// <param name="obj">An object.</param>
+		/// <param name="commandParameters">An array of parameters to be added to the result array.</param>
+		/// <returns>An array of parameters.</returns>
+		public IDbDataParameter[] CreateParameters(
+			object                    obj,
+			params IDbDataParameter[] commandParameters)
+		{
+			return CreateParameters(obj, null, null, null, commandParameters);
+		}
+
+		/// <summary>
+		/// Creates an array of parameters from a business object.
+		/// </summary>
+		/// <remarks>
+		/// The method can take an additional parameter list, 
+		/// which can be created by using the same method.
+		/// </remarks>
+		/// <include file="Examples.xml" path='examples/db[@name="CreateParameters(object,IDbDataParameter[])"]/*' />
+		/// <param name="obj">An object.</param>
+		/// <param name="outputParameters">Output parameters names.</param>
+		/// <param name="inputOutputParameters">InputOutput parameters names.</param>
+		/// <param name="ignoreParameters">Parameters names to skip.</param>
+		/// <param name="commandParameters">An array of parameters to be added to the result array.</param>
+		/// <returns>An array of parameters.</returns>
+		public IDbDataParameter[] CreateParameters(
+			object                    obj,
+			string[]                  outputParameters,
+			string[]                  inputOutputParameters,
+			string[]                  ignoreParameters,
+			params IDbDataParameter[] commandParameters)
+		{
+			if (obj == null)
+				throw new ArgumentNullException("obj");
+
+			var isType    = obj is Type;
+			var type      = isType? (Type)obj: obj.GetType();
+			var om        = _mappingSchema.GetObjectMapper(type);
+			var paramList = new ArrayList();
+			var comparer  = CaseInsensitiveComparer.Default;
+
+			outputParameters       = (string[])SortArray(outputParameters,      comparer);
+			inputOutputParameters  = (string[])SortArray(inputOutputParameters, comparer);
+			ignoreParameters       = (string[])SortArray(ignoreParameters,      comparer);
+
+			foreach (MemberMapper mm in om)
+			{
+				if (ignoreParameters != null && Array.BinarySearch(ignoreParameters, mm.Name, comparer) >= 0)
+					continue;
+				
+				var value = isType? null: mm.GetValue(obj);
+				var name  = _dataProvider.Convert(mm.Name, GetConvertTypeToParameter()).ToString();
+
+				var parameter =
+					value == null ?
+						NullParameter(name, value, mm.MapMemberInfo.NullValue) :
+						(mm.DbType != DbType.Object) ?
+							Parameter(name, value, mm.DbType):
+							Parameter(name, value);
+
+				if (outputParameters != null && Array.BinarySearch(outputParameters, mm.Name, comparer) >= 0)
+					parameter.Direction = ParameterDirection.Output;
+				else if (inputOutputParameters != null && Array.BinarySearch(inputOutputParameters, mm.Name, comparer) >= 0)
+					parameter.Direction = ParameterDirection.InputOutput;
+
+				paramList.Add(parameter);
+			}
+
+			if (commandParameters != null)
+				paramList.AddRange(commandParameters);
+
+			return (IDbDataParameter[])paramList.ToArray(typeof(IDbDataParameter));
+		}
+
+		/// <summary>
+		/// Maps all parameters returned from the server to all given objects.
+		/// </summary>
+		/// <param name="returnValueMember">Name of a <see cref="MemberMapper"/> to map return value.</param>
+		/// <param name="obj">An <see cref="System.Object"/> to map from command parameters.</param>
+		public void MapOutputParameters(
+			string returnValueMember,
+			object obj)
+		{
+			var dest = _mappingSchema.GetDataDestination(obj);
+
+			foreach (IDbDataParameter parameter in Command.Parameters)
+			{
+				var ordinal = -1;
+
+				switch (parameter.Direction)
+				{
+					case ParameterDirection.InputOutput:
+					case ParameterDirection.Output:
+						ordinal = dest.GetOrdinal(
+							_dataProvider.Convert(parameter.ParameterName, ConvertType.SprocParameterToName).ToString());
+						break;
+
+					case ParameterDirection.ReturnValue:
+
+						if (returnValueMember != null)
+						{
+							if (!returnValueMember.StartsWith("@") && dest is ObjectMapper)
+							{
+								var om = (ObjectMapper) dest;
+								var ma = om.TypeAccessor[returnValueMember];
+
+								if (ma != null)
+								{
+									ma.SetValue(obj, _mappingSchema.ConvertChangeType(parameter.Value, ma.Type));
+									continue;
+								}
+							}
+							else
+								returnValueMember = returnValueMember.Substring(1);
+
+							ordinal = dest.GetOrdinal(returnValueMember);
+						}
+
+						break;
+				}
+
+				if (ordinal >= 0)
+					dest.SetValue(obj, ordinal, _mappingSchema.ConvertChangeType(parameter.Value, dest.GetFieldType(ordinal)));
+			}
+		}
+
+		/// <summary>
+		/// Maps all parameters returned from the server to an object.
+		/// </summary>
+		/// <param name="obj">An <see cref="System.Object"/> to map from command parameters.</param>
+		public void MapOutputParameters(object obj)
+		{
+			MapOutputParameters(null, obj);
+		}
+
+		/// <summary>
+		/// Maps all parameters returned from the server to all given objects.
+		/// </summary>
+		/// <param name="returnValueMember">Name of the member used to map the
+		/// return value. Can be null.</param>
+		/// <param name="objects">An array of <see cref="System.Object"/> to map
+		/// from command parameters.</param>
+		public void MapOutputParameters(string returnValueMember, params object[] objects)
+		{
+			if (objects == null)
+				return;
+
+			foreach (var obj in objects)
+				MapOutputParameters(returnValueMember, obj);
+		}
+
+		/// <summary>
+		/// Maps all parameters returned from the server to an object.
+		/// </summary>
+		/// <param name="objects">An array of <see cref="System.Object"/> to map
+		/// from command parameters.</param>
+		public void MapOutputParameters(params object[] objects)
+		{
+			MapOutputParameters(null, objects);
+		}
+
+		/// <overloads>
+		/// Adds a parameter to the <see cref="Command"/> or returns existing one.
+		/// </overloads>
+		/// <summary>
+		/// Returns an existing parameter.
+		/// </summary>
+		/// <remarks>
+		/// The method can be used to retrieve return and output parameters.
+		/// </remarks>
+		/// <include file="Examples1.xml" path='examples/db[@name="Parameter(string)"]/*' />
+		/// <param name="parameterName">The name of the parameter.</param>
+		/// <returns>The <see cref="IDbDataParameter"/> object.</returns>
+		public IDbDataParameter Parameter(string parameterName)
+		{
+			return _dataProvider.GetParameter(Command, parameterName);
+		}
+
+		/// <summary>
+		/// Adds an input parameter to the <see cref="Command"/>.
+		/// </summary>
+		/// <remarks>
+		/// The method creates a parameter with the
+		/// <see cref="System.Data.ParameterDirection">ParameterDirection.Input</see> type.
+		/// </remarks>
+		/// <include file="Examples1.xml" path='examples/db[@name="Parameter(string,object)"]/*' />
+		/// <param name="parameterName">The name of the parameter.</param>
+		/// <param name="value">The <see cref="System.Object"/>
+		/// that is the value of the parameter.</param>
+		/// <returns>The <see cref="IDbDataParameter"/> object.</returns>
+		public IDbDataParameter Parameter(string parameterName, object value)
+		{
+			return Parameter(ParameterDirection.Input, parameterName, value);
+		}
+
+		/// <summary>
+		/// Adds an input parameter to the <see cref="Command"/>.
+		/// </summary>
+		/// <remarks>
+		/// The method creates a parameter with the
+		/// <see cref="System.Data.ParameterDirection">ParameterDirection.Input</see> type.
+		/// </remarks>
+		/// <param name="parameterName">The name of the parameter.</param>
+		/// <param name="dbType">One of the <see cref="DbType"/> values.</param>
+		/// <returns>The <see cref="IDbDataParameter"/> object.</returns>
+		public IDbDataParameter Parameter(string parameterName, DbType dbType)
+		{
+			return Parameter(ParameterDirection.Input, parameterName, dbType);
+		}
+
+		/// <summary>
+		/// Adds an input parameter to the <see cref="Command"/>.
+		/// </summary>
+		/// <remarks>
+		/// The method creates a parameter with the
+		/// <see cref="System.Data.ParameterDirection">ParameterDirection.Input</see> type.
+		/// </remarks>
+		/// <param name="parameterName">The name of the parameter.</param>
+		/// <param name="dbType">One of the <see cref="DbType"/> values.</param>
+		/// <param name="size">Size of the parameter.</param>
+		/// <returns>The <see cref="IDbDataParameter"/> object.</returns>
+		public IDbDataParameter Parameter(string parameterName, DbType dbType, int size)
+		{
+			return Parameter(ParameterDirection.Input, parameterName, dbType, size);
+		}
+
+		/// <summary>
+		/// Adds an input parameter to the <see cref="Command"/>.
+		/// </summary>
+		/// <remarks>
+		/// The method creates a parameter with the
+		/// <see cref="System.Data.ParameterDirection">ParameterDirection.Input</see> type.
+		/// If the parameter is null, it's converted to <see cref="DBNull"/>.<see cref="DBNull.Value"/>.
+		/// </remarks>
+		/// <include file="Examples1.xml" path='examples/db[@name="NullParameter(string,object)"]/*' />
+		/// <param name="parameterName">The name of the parameter.</param>
+		/// <param name="value">The <see cref="System.Object"/>
+		/// that is the value of the parameter.</param>
+		/// <returns>The <see cref="IDbDataParameter"/> object.</returns>
+		public IDbDataParameter NullParameter(string parameterName, object value)
+		{
+			if (_mappingSchema.IsNull(value))
+				@value = DBNull.Value;
+
+			return Parameter(ParameterDirection.Input, parameterName, value);
+		}
+
+		/// <summary>
+		/// Adds an input parameter to the <see cref="Command"/>.
+		/// </summary>
+		/// <remarks>
+		/// The method creates a parameter with the
+		/// <see cref="System.Data.ParameterDirection">ParameterDirection.Input</see> type.
+		/// </remarks>
+		/// <param name="parameterName">The name of the parameter.</param>
+		/// <param name="value">The <see cref="System.Object"/>
+		/// that is the value of the parameter.</param>
+		/// <param name="nullValue">The null equivalent to compare with the value.</param>
+		/// <returns>The <see cref="IDbDataParameter"/> object.</returns>
+		public IDbDataParameter NullParameter(string parameterName, object value, object nullValue)
+		{
+			if (value == null || value.Equals(nullValue))
+				@value = DBNull.Value;
+
+			return Parameter(ParameterDirection.Input, parameterName, value);
+		}
+
+		/// <summary>
+		/// Adds an input parameter to the <see cref="Command"/>.
+		/// </summary>
+		/// <remarks>
+		/// The method creates a parameter with the
+		/// <see cref="System.Data.ParameterDirection">ParameterDirection.Input</see> type.
+		/// </remarks>
+		/// <param name="parameterName">The name of the parameter.</param>
+		/// <param name="value">The <see cref="System.Object"/>
+		/// that is the value of the parameter.</param>
+		/// <returns>The <see cref="IDbDataParameter"/> object.</returns>
+		public IDbDataParameter InputParameter(string parameterName, object value)
+		{
+			return Parameter(ParameterDirection.Input, parameterName, value);
+		}
+
+		/// <summary>
+		/// Adds an output parameter to the <see cref="Command"/>.
+		/// </summary>
+		/// <remarks>
+		/// The method creates a parameter with the
+		/// <see cref="System.Data.ParameterDirection">ParameterDirection.Output</see> type.
+		/// </remarks>
+		/// <param name="parameterName">The name of the parameter.</param>
+		/// <param name="value">The <see cref="System.Object"/>
+		/// that is the value of the parameter.</param>
+		/// <returns>The <see cref="IDbDataParameter"/> object.</returns>
+		public IDbDataParameter OutputParameter(string parameterName, object value)
+		{
+			return Parameter(ParameterDirection.Output, parameterName, value);
+		}
+
+		/// <summary>
+		/// Adds an output parameter to the <see cref="Command"/>.
+		/// </summary>
+		/// <remarks>
+		/// The method creates a parameter with the
+		/// <see cref="System.Data.ParameterDirection">ParameterDirection.Output</see> type.
+		/// </remarks>
+		/// <param name="parameterName">The name of the parameter.</param>
+		/// <param name="dbType">One of the <see cref="DbType"/> values.</param>
+		/// <returns>The <see cref="IDbDataParameter"/> object.</returns>
+		public IDbDataParameter OutputParameter(string parameterName, DbType dbType)
+		{
+			return Parameter(ParameterDirection.Output, parameterName, dbType);
+		}
+
+		/// <summary>
+		/// Adds an output parameter to the <see cref="Command"/>.
+		/// </summary>
+		/// <remarks>
+		/// The method creates a parameter with the
+		/// <see cref="System.Data.ParameterDirection">ParameterDirection.Output</see> type.
+		/// </remarks>
+		/// <param name="parameterName">The name of the parameter.</param>
+		/// <param name="dbType">One of the <see cref="DbType"/> values.</param>
+		/// <param name="size">Size of the parameter.</param>
+		/// <returns>The <see cref="IDbDataParameter"/> object.</returns>
+		public IDbDataParameter OutputParameter(string parameterName, DbType dbType, int size)
+		{
+			return Parameter(ParameterDirection.Output, parameterName, dbType, size);
+		}
+
+		/// <summary>
+		/// Adds an input-output parameter to the <see cref="Command"/>.
+		/// </summary>
+		/// <remarks>
+		/// The method creates a parameter with the
+		/// <see cref="System.Data.ParameterDirection">ParameterDirection.InputOutput</see> type.
+		/// </remarks>
+		/// <param name="parameterName">The name of the parameter.</param>
+		/// <param name="value">The <see cref="System.Object"/>
+		/// that is the value of the parameter.</param>
+		/// <returns>The <see cref="IDbDataParameter"/> object.</returns>
+		public IDbDataParameter InputOutputParameter(string parameterName, object value)
+		{
+			return Parameter(ParameterDirection.InputOutput,parameterName, value);
+		}
+
+		/// <summary>
+		/// Adds a return value parameter to the <see cref="Command"/>.
+		/// </summary>
+		/// <remarks>
+		/// The method creates a parameter with the
+		/// <see cref="System.Data.ParameterDirection">ParameterDirection.ReturnValue</see> type.
+		/// </remarks>
+		/// <param name="parameterName">The name of the parameter.</param>
+		/// <returns>The <see cref="IDbDataParameter"/> object.</returns>
+		public IDbDataParameter ReturnValue(string parameterName)
+		{
+			return Parameter(ParameterDirection.ReturnValue, parameterName, null);
+		}
+
+		/// <summary>
+		/// Adds a parameter to the <see cref="Command"/>.
+		/// </summary>
+		/// <remarks>
+		/// The method creates a parameter with the specified
+		/// <see cref="System.Data.ParameterDirection"/> type.
+		/// </remarks>
+		/// <param name="parameterDirection">One of the <see cref="System.Data.ParameterDirection"/> values.</param>
+		/// <param name="parameterName">The name of the parameter.</param>
+		/// <param name="value">The <see cref="System.Object"/>
+		/// that is the value of the parameter.</param>
+		/// <returns>The <see cref="IDbDataParameter"/> object.</returns>
+		public IDbDataParameter Parameter(
+			ParameterDirection parameterDirection,
+			string             parameterName,
+			object             value)
+		{
+			var parameter = _dataProvider.CreateParameterObject(Command);
+
+			parameter.ParameterName = parameterName;
+			parameter.Direction     = parameterDirection;
+
+			_dataProvider.SetParameterValue(parameter, value ?? DBNull.Value);
+
+			return parameter;
+		}
+
+		/// <summary>
+		/// Adds a parameter to the <see cref="Command"/>.
+		/// </summary>
+		/// <remarks>
+		/// The method creates a parameter with the specified
+		/// <see cref="System.Data.ParameterDirection"/> type.
+		/// </remarks>
+		/// <param name="parameterDirection">One of the <see cref="System.Data.ParameterDirection"/> values.</param>
+		/// <param name="parameterName">The name of the parameter.</param>
+		/// <param name="value">The <see cref="System.Object"/>
+		/// that is the value of the parameter.</param>
+		/// <param name="dbType">One of the <seealso cref="DbType"/> values.</param>
+		/// <returns>The <see cref="IDbDataParameter"/> object.</returns>
+		public IDbDataParameter Parameter(
+			ParameterDirection parameterDirection,
+			string             parameterName,
+			object             value,
+			DbType             dbType)
+		{
+			var parameter = _dataProvider.CreateParameterObject(Command);
+
+			parameter.ParameterName = parameterName;
+			parameter.Direction     = parameterDirection;
+			parameter.DbType        = _dataProvider.GetParameterDbType(dbType);
+
+			_dataProvider.SetParameterValue(parameter, value ?? DBNull.Value);
+
+			return parameter;
+		}
+
+		/// <summary>
+		/// Adds an input parameter to the <see cref="Command"/>.
+		/// </summary>
+		/// <param name="parameterName">The name of the parameter.</param>
+		/// <param name="value">The <see cref="System.Object"/>
+		/// that is the value of the parameter.</param>
+		/// <param name="dbType">One of the <seealso cref="DbType"/> values.</param>
+		/// <returns>The <see cref="IDbDataParameter"/> object.</returns>
+		public IDbDataParameter Parameter(
+			string parameterName,
+			object value,
+			DbType dbType)
+		{
+			return Parameter(ParameterDirection.Input, parameterName, value, dbType);
+		}
+
+		/// <summary>
+		/// Adds a parameter to the <see cref="Command"/>.
+		/// </summary>
+		/// <remarks>
+		/// The method creates a parameter with the specified
+		/// <see cref="System.Data.ParameterDirection"/> type.
+		/// </remarks>
+		/// <param name="parameterDirection">One of the <see cref="System.Data.ParameterDirection"/> values.</param>
+		/// <param name="parameterName">The name of the parameter.</param>
+		/// <param name="value">The <see cref="System.Object"/>
+		/// that is the value of the parameter.</param>
+		/// <param name="dbType">One of the <seealso cref="DbType"/> values.</param>
+		/// <param name="size">Size of the parameter.</param>
+		/// <returns>The <see cref="IDbDataParameter"/> object.</returns>
+		public IDbDataParameter Parameter(
+			ParameterDirection parameterDirection,
+			string             parameterName,
+			object             value,
+			DbType             dbType,
+			int                size)
+		{
+			var parameter = _dataProvider.CreateParameterObject(Command);
+
+			parameter.ParameterName = parameterName;
+			parameter.Direction     = parameterDirection;
+			parameter.DbType        = dbType;
+			parameter.Size          = size;
+
+			_dataProvider.SetParameterValue(parameter, value);
+
+			return parameter;
+		}
+
+		/// <summary>
+		/// Adds a parameter to the <see cref="Command"/>.
+		/// </summary>
+		/// <remarks>
+		/// The method creates a parameter with the specified
+		/// <see cref="System.Data.ParameterDirection"/> type.
+		/// </remarks>
+		/// <param name="parameterDirection">One of the <see cref="System.Data.ParameterDirection"/> values.</param>
+		/// <param name="parameterName">The name of the parameter.</param>
+		/// <param name="value">The <see cref="System.Object"/>
+		/// that is the value of the parameter.</param>
+		/// <param name="typeName">User defined type name for a table-valued parameter.</param>
+		/// <returns>The <see cref="IDbDataParameter"/> object.</returns>
+		public IDbDataParameter Parameter(
+			ParameterDirection parameterDirection,
+			string             parameterName,
+			object             value,
+			string             typeName)
+		{
+			var parameter = _dataProvider.CreateParameterObject(Command);
+
+			parameter.ParameterName = parameterName;
+			parameter.Direction     = parameterDirection;
+			_dataProvider.SetUserDefinedType(parameter, typeName);
+			_dataProvider.SetParameterValue (parameter, value);
+
+			return parameter;
+		}
+
+		/// <summary>
+		/// Adds an input parameter to the <see cref="Command"/>.
+		/// </summary>
+		/// <param name="parameterName">The name of the parameter.</param>
+		/// <param name="value">The <see cref="System.Object"/>
+		/// that is the value of the parameter.</param>
+		/// <param name="dbType">One of the <seealso cref="DbType"/> values.</param>
+		/// <param name="size">Size of the parameter.</param>
+		/// <returns>The <see cref="IDbDataParameter"/> object.</returns>
+		public IDbDataParameter Parameter(
+			string parameterName,
+			object value,
+			DbType dbType,
+			int    size)
+		{
+			return Parameter(ParameterDirection.Input, parameterName, value, dbType, size);
+		}
+
+		/// <summary>
+		/// Adds a parameter to the <see cref="Command"/>.
+		/// </summary>
+		/// <remarks>
+		/// The method creates a parameter with the specified
+		/// <see cref="System.Data.ParameterDirection"/> type.
+		/// </remarks>
+		/// <param name="parameterDirection">One of the <see cref="System.Data.ParameterDirection"/> values.</param>
+		/// <param name="parameterName">The name of the parameter.</param>
+		/// <param name="dbType">One of the <seealso cref="DbType"/> values.</param>
+		/// <returns>The <see cref="IDbDataParameter"/> object.</returns>
+		public IDbDataParameter Parameter(
+			ParameterDirection parameterDirection,
+			string             parameterName,
+			DbType             dbType)
+		{
+			var parameter = _dataProvider.CreateParameterObject(Command);
+
+			parameter.ParameterName = parameterName;
+			parameter.Direction     = parameterDirection;
+			parameter.DbType        = dbType;
+
+			return parameter;
+		}
+
+		/// <summary>
+		/// Adds a parameter to the <see cref="Command"/>.
+		/// </summary>
+		/// <remarks>
+		/// The method creates a parameter with the specified
+		/// <see cref="System.Data.ParameterDirection"/> type.
+		/// </remarks>
+		/// <param name="parameterDirection">One of the <see cref="System.Data.ParameterDirection"/> values.</param>
+		/// <param name="parameterName">The name of the parameter.</param>
+		/// <param name="dbType">One of the <seealso cref="DbType"/> values.</param>
+		/// <param name="size">Size of the parameter.</param>
+		/// <returns>The <see cref="IDbDataParameter"/> object.</returns>
+		public IDbDataParameter Parameter(
+			ParameterDirection parameterDirection,
+			string parameterName,
+			DbType dbType,
+			int    size)
+		{
+			var parameter = _dataProvider.CreateParameterObject(Command);
+
+			parameter.ParameterName = parameterName;
+			parameter.Direction     = parameterDirection;
+			parameter.DbType        = dbType;
+			parameter.Size          = size;
+
+			return parameter;
+		}
+
+		/// <summary>
+		/// Creates an input parameter to the <see cref="Command"/>.
+		/// </summary>
+		/// <remarks>
+		/// The method creates a parameter with the
+		/// <see cref="System.Data.ParameterDirection">ParameterDirection.Input</see> type
+		/// and <see cref="System.Data.DataRowVersion">DataRowVersion.Current</see> type.
+		/// </remarks>
+		/// <param name="parameterName">The name of the parameter.</param>
+		/// <param name="dbType">One of the <see cref="DbType"/> values.</param>
+		/// <param name="size">Size of the parameter.</param>
+		/// <param name="sourceColumn">Source column for a parameter in the <see cref="DataTable"/>.</param>
+		/// <returns>The <see cref="IDbDataParameter"/> object.</returns>
+		public IDbDataParameter Parameter(
+			string parameterName,
+			DbType dbType,
+			int    size,
+			string sourceColumn)
+		{
+			var param = Parameter(ParameterDirection.Input, parameterName, dbType, size);
+
+			param.SourceColumn  = sourceColumn;
+			param.SourceVersion = DataRowVersion.Current;
+
+			return param;
+		}
+
+		/// <summary>
+		/// Creates an input parameter to the <see cref="Command"/>.
+		/// </summary>
+		/// <remarks>
+		/// The method creates a parameter with the
+		/// <see cref="System.Data.ParameterDirection">ParameterDirection.Input</see> type
+		/// and <see cref="System.Data.DataRowVersion">DataRowVersion.Current</see> type.
+		/// </remarks>
+		/// <param name="parameterName">The name of the parameter.</param>
+		/// <param name="dbType">One of the <see cref="DbType"/> values.</param>
+		/// <param name="sourceColumn">Source column for a parameter in the <see cref="DataTable"/>.</param>
+		/// <returns>The <see cref="IDbDataParameter"/> object.</returns>
+		public IDbDataParameter Parameter(
+			string parameterName,
+			DbType dbType,
+			string sourceColumn)
+		{
+			var param = Parameter(ParameterDirection.Input, parameterName, dbType);
+
+			param.SourceColumn  = sourceColumn;
+			param.SourceVersion = DataRowVersion.Current;
+
+			return param;
+		}
+
+		/// <summary>
+		/// Creates an input parameter to the <see cref="Command"/>.
+		/// </summary>
+		/// <remarks>
+		/// The method creates a parameter with the
+		/// <see cref="System.Data.ParameterDirection">ParameterDirection.Input</see> type
+		/// and <see cref="System.Data.DataRowVersion">DataRowVersion.Current</see> type.
+		/// </remarks>
+		/// <param name="parameterName">The name of the parameter.</param>
+		/// <param name="dbType">One of the <see cref="DbType"/> values.</param>
+		/// <param name="size">Size of the parameter.</param>
+		/// <param name="sourceColumn">Source column for a parameter in the <see cref="DataTable"/>.</param>
+		/// <param name="dataRowVersion">Version of data to use for a parameter in the <see cref="DataTable"/>.</param>
+		/// <returns>The <see cref="IDbDataParameter"/> object.</returns>
+		public IDbDataParameter Parameter(
+			string parameterName,
+			DbType dbType,
+			int    size,
+			string sourceColumn,
+			DataRowVersion dataRowVersion)
+		{
+			var param = Parameter(ParameterDirection.Input, parameterName, dbType, size);
+
+			param.SourceColumn  = sourceColumn;
+			param.SourceVersion = dataRowVersion;
+
+			return param;
+		}
+
+		/// <summary>
+		/// Creates an input parameter to the <see cref="Command"/>.
+		/// </summary>
+		/// <remarks>
+		/// The method creates a parameter with the
+		/// <see cref="System.Data.ParameterDirection">ParameterDirection.Input</see> type
+		/// and <see cref="System.Data.DataRowVersion">DataRowVersion.Current</see> type.
+		/// </remarks>
+		/// <param name="parameterName">The name of the parameter.</param>
+		/// <param name="dbType">One of the <see cref="DbType"/> values.</param>
+		/// <param name="sourceColumn">Source column for a parameter in the <see cref="DataTable"/>.</param>
+		/// <param name="dataRowVersion">Version of data to use for a parameter in the <see cref="DataTable"/>.</param>
+		/// <returns>The <see cref="IDbDataParameter"/> object.</returns>
+		public IDbDataParameter Parameter(
+			string parameterName,
+			DbType dbType,
+			string sourceColumn,
+			DataRowVersion dataRowVersion)
+		{
+			var param = Parameter(ParameterDirection.Input, parameterName, dbType);
+
+			param.SourceColumn  = sourceColumn;
+			param.SourceVersion = dataRowVersion;
+
+			return param;
+		}
+
+		public ConvertType GetConvertTypeToParameter()
+		{
+			return Command.CommandType == CommandType.StoredProcedure ?
+				ConvertType.NameToSprocParameter:
+				ConvertType.NameToCommandParameter;
+		}
+
+		#endregion
+
+		#region SetCommand
+
+		/// <summary>
+		/// Specifies the action that command is supposed to perform, i.e. Select, Insert, Update, Delete.
+		/// It is used in Execute methods of the <see cref="DbManager"/> class to identify command instance 
+		/// to be used.
+		/// </summary>
+		enum CommandAction
+		{
+			Select,
+			Insert,
+			Update,
+			Delete
+		}
+
+		private bool _executed;
+		private bool _prepared;
+
+		private IDbDataParameter[] _selectCommandParameters;
+		private IDbDataParameter[] _insertCommandParameters;
+		private IDbDataParameter[] _updateCommandParameters;
+		private IDbDataParameter[] _deleteCommandParameters;
+
+		private void SetCommand(CommandAction commandAction, IDbCommand command)
+		{
+			switch (commandAction)
+			{
+				case CommandAction.Select: _selectCommand = command; break;
+				case CommandAction.Insert: _insertCommand = command; break;
+				case CommandAction.Update: _updateCommand = command; break;
+				case CommandAction.Delete: _deleteCommand = command; break;
+			}
+		}
+
+		private IDbCommand GetCommand(CommandAction commandAction)
+		{
+			switch (commandAction)
+			{
+				default:
+				//case CommandAction.Select:
+					return SelectCommand;
+				case CommandAction.Insert: return InsertCommand;
+				case CommandAction.Update: return UpdateCommand;
+				case CommandAction.Delete: return DeleteCommand;
+			}
+		}
+
+		private IDbCommand GetCommand(CommandAction commandAction, CommandType commandType)
+		{
+			IDbCommand command;
+
+			switch (commandAction)
+			{
+				default                   : command = _selectCommand; break;
+				case CommandAction.Insert : command = _insertCommand; break;
+				case CommandAction.Update : command = _updateCommand; break;
+				case CommandAction.Delete : command = _deleteCommand; break;
+			}
+
+			if (command != null && !DataProvider.CanReuseCommand(command, commandType))
+			{
+				command.Dispose();
+
+				switch (commandAction)
+				{
+					default                   : _selectCommand = null; break;
+					case CommandAction.Insert : _insertCommand = null; break;
+					case CommandAction.Update : _updateCommand = null; break;
+					case CommandAction.Delete : _deleteCommand = null; break;
+				}
+			}
+
+			return GetCommand(commandAction);
+		}
+
+		private void SetCommandParameters(CommandAction commandAction, IDbDataParameter[] commandParameters)
+		{
+			switch (commandAction)
+			{
+				case CommandAction.Select: _selectCommandParameters = commandParameters; break;
+				case CommandAction.Insert: _insertCommandParameters = commandParameters; break;
+				case CommandAction.Update: _updateCommandParameters = commandParameters; break;
+				case CommandAction.Delete: _deleteCommandParameters = commandParameters; break;
+			}
+		}
+
+		private IDbDataParameter[] GetCommandParameters(CommandAction commandAction)
+		{
+			switch (commandAction)
+			{
+				default:
+				//case CommandAction.Select:
+					return _selectCommandParameters;
+				case CommandAction.Insert: return _insertCommandParameters;
+				case CommandAction.Update: return _updateCommandParameters;
+				case CommandAction.Delete: return _deleteCommandParameters;
+			}
+		}
+
+		private DbManager SetCommand(
+			CommandAction commandAction,
+			CommandType   commandType,
+			string        commandText,
+			params        IDbDataParameter[] commandParameters)
+		{
+			if (_executed)
+			{
+				_executed = false;
+				_prepared = false;
+			}
+
+			PrepareCommand(commandAction, commandType, commandText, commandParameters);
+			
+			return this;
+		}
+
+		private DbManager SetSpCommand(
+			CommandAction   commandAction,
+			string          spName,
+			bool            openNewConnectionToDiscoverParameters,
+			params object[] parameterValues)
+		{
+			return SetCommand(
+				commandAction,
+				CommandType.StoredProcedure,
+				spName,
+				CreateSpParameters(spName, parameterValues, openNewConnectionToDiscoverParameters));
+		}
+
+		private DbManager SetSpCommand(
+			CommandAction   commandAction,
+			string          spName,
+			params object[] parameterValues)
+		{
+			return SetCommand(
+				commandAction,
+				CommandType.StoredProcedure,
+				spName,
+				CreateSpParameters(spName, parameterValues, Configuration.OpenNewConnectionToDiscoverParameters));
+		}
+
+		#region Select
+
+		/// <summary>
+		/// Creates a SQL statement.
+		/// </summary>
+		/// <param name="commandText">The command text to execute.</param>
+		/// <returns>Current instance.</returns>
+		public DbManager SetCommand(
+			string commandText)
+		{
+			return SetCommand(CommandAction.Select, CommandType.Text, commandText, null);
+		}
+
+		/// <summary>
+		/// Creates a SQL statement.
+		/// </summary>
+		/// <param name="commandType">The <see cref="System.Data.CommandType"/> (stored procedure, text, etc.)</param>
+		/// <param name="commandText">The command text to execute.</param>
+		/// <returns>Current instance.</returns>
+		public DbManager SetCommand(
+			CommandType commandType,
+			string      commandText)
+		{
+			return SetCommand(CommandAction.Select, commandType, commandText, null);
+		}
+
+		/// <summary>
+		/// Creates a SQL statement.
+		/// </summary>
+		/// <remarks>
+		/// The method can be used to create the <i>INSERT</i>, <i>UPDATE</i>, and <i>DELETE</i> SQL statements.
+		/// </remarks>
+		/// <param name="commandText">The command text to execute.</param>
+		/// <param name="commandParameters">An array of parameters used to executes the command.</param>
+		/// <returns>Current instance.</returns>
+		public DbManager SetCommand(
+			string commandText,
+			params IDbDataParameter[] commandParameters)
+		{
+			return SetCommand(CommandAction.Select, CommandType.Text, commandText, commandParameters);
+		}
+
+		/// <summary>
+		/// Creates a SQL statement.
+		/// </summary>
+		/// <param name="commandType">The <see cref="System.Data.CommandType"/> (stored procedure, text, etc.)</param>
+		/// <param name="commandText">The command text to execute.</param>
+		/// <param name="commandParameters">An array of parameters used to executes the command.</param>
+		/// <returns>Current instance.</returns>
+		public DbManager SetCommand(
+			CommandType commandType,
+			string      commandText,
+			params      IDbDataParameter[] commandParameters)
+		{
+			return SetCommand(CommandAction.Select, commandType, commandText, commandParameters);
+		}
+
+		/// <summary>
+		/// Creates a command to be executed as a stored procedure using the provided parameter values.
+		/// </summary>
+		/// <remarks>
+		/// The method queries the database to discover the parameters for the stored procedure 
+		/// (the first time each stored procedure is called), 
+		/// and assign the values based on parameter order.
+		/// </remarks>
+		/// <param name="spName">The name of the stored procedure</param>
+		/// <param name="parameterValues">An array of objects to be assigned as the input values of the stored procedure</param>
+		/// <returns>Current instance.</returns>
+		public DbManager SetSpCommand(
+			string spName,
+			params object[] parameterValues)
+		{
+			return SetSpCommand(CommandAction.Select, spName, parameterValues);
+		}
+
+		public DbManager SetSpCommand(
+			string spName,
+			bool   openNewConnectionToDiscoverParameters,
+			params object[] parameterValues)
+		{
+			return SetSpCommand(CommandAction.Select, spName, openNewConnectionToDiscoverParameters, parameterValues);
+		}
+
+		public DbManager SetCommand(SqlQuery sql, params IDbDataParameter[] commandParameters)
+		{
+			var sb = new StringBuilder();
+
+			DataProvider.CreateSqlProvider().BuildSql(0, sql, sb, 0, 0, false);
+
+			var command = sb.ToString();
+
+			if (TraceSwitch.TraceInfo)
+			{
+				var info = string.Format("{0} {1}\n{2}", DataProvider.Name, ConfigurationString, command);
+
+				if (commandParameters != null && commandParameters.Length > 0)
+					foreach (var p in commandParameters)
+						info += string.Format("\n{0}\t{1}", p.ParameterName, p.Value);
+
+				WriteTraceLine(info, TraceSwitch.DisplayName);
+			}
+
+			return SetCommand(command, commandParameters);
+		}
+
+		#endregion
+
+		#region Insert
+
+		/// <summary>
+		/// Creates an Insert SQL statement.
+		/// </summary>
+		/// <remarks>
+		/// The method can be used to create the <i>INSERT</i>, <i>UPDATE</i>, and <i>DELETE</i> SQL statements.
+		/// </remarks>
+		/// <param name="commandText">The command text to execute.</param>
+		/// <param name="commandParameters">An array of parameters used to executes the command.</param>
+		/// <returns>Current instance.</returns>
+		public DbManager SetInsertCommand(
+			string commandText,
+			params IDbDataParameter[] commandParameters)
+		{
+			return SetCommand(
+				CommandAction.Insert, CommandType.Text, commandText, commandParameters);
+		}
+
+		/// <summary>
+		/// Creates an Insert SQL statement.
+		/// </summary>
+		/// <param name="commandType">The <see cref="System.Data.CommandType"/> (stored procedure, text, etc.)</param>
+		/// <param name="commandText">The command text to execute.</param>
+		/// <param name="commandParameters">An array of parameters used to executes the command.</param>
+		/// <returns>Current instance.</returns>
+		public DbManager SetInsertCommand(
+			CommandType commandType,
+			string      commandText,
+			params      IDbDataParameter[] commandParameters)
+		{
+			return SetCommand(
+				CommandAction.Insert, commandType, commandText, commandParameters);
+		}
+
+		/// <summary>
+		/// Creates an Insert command to be executed as a stored procedure using the provided parameter values.
+		/// </summary>
+		/// <remarks>
+		/// The method queries the database to discover the parameters for the stored procedure 
+		/// (the first time each stored procedure is called), 
+		/// and assign the values based on parameter order.
+		/// </remarks>
+		/// <param name="spName">The name of the stored procedure</param>
+		/// <param name="parameterValues">An array of objects to be assigned as the input values of the stored procedure</param>
+		/// <returns>Current instance.</returns>
+		public DbManager SetInsertSpCommand(
+			string spName,
+			params object[] parameterValues)
+		{
+			return SetSpCommand(CommandAction.Insert, spName, parameterValues);
+		}
+
+		#endregion
+
+		#region Update
+
+		/// <summary>
+		/// Creates an Update SQL statement.
+		/// </summary>
+		/// <remarks>
+		/// The method can be used to create the <i>INSERT</i>, <i>UPDATE</i>, and <i>DELETE</i> SQL statements.
+		/// </remarks>
+		/// <param name="commandText">The command text to execute.</param>
+		/// <param name="commandParameters">An array of parameters used to executes the command.</param>
+		/// <returns>Current instance.</returns>
+		public DbManager SetUpdateCommand(
+			string commandText,
+			params IDbDataParameter[] commandParameters)
+		{
+			return SetCommand(
+				CommandAction.Update, CommandType.Text, commandText, commandParameters);
+		}
+
+		/// <summary>
+		/// Creates an Update SQL statement.
+		/// </summary>
+		/// <param name="commandType">The <see cref="System.Data.CommandType"/> (stored procedure, text, etc.)</param>
+		/// <param name="commandText">The command text to execute.</param>
+		/// <param name="commandParameters">An array of parameters used to executes the command.</param>
+		/// <returns>Current instance.</returns>
+		public DbManager SetUpdateCommand(
+			CommandType commandType,
+			string      commandText,
+			params      IDbDataParameter[] commandParameters)
+		{
+			return SetCommand(
+				CommandAction.Update, commandType, commandText, commandParameters);
+		}
+
+		/// <summary>
+		/// Creates an Update command to be executed as a stored procedure using the provided parameter values.
+		/// </summary>
+		/// <remarks>
+		/// The method queries the database to discover the parameters for the stored procedure 
+		/// (the first time each stored procedure is called), 
+		/// and assign the values based on parameter order.
+		/// </remarks>
+		/// <param name="spName">The name of the stored procedure</param>
+		/// <param name="parameterValues">An array of objects to be assigned as the input values of the stored procedure</param>
+		/// <returns>Current instance.</returns>
+		public DbManager SetUpdateSpCommand(
+			string spName,
+			params object[] parameterValues)
+		{
+			return SetSpCommand(CommandAction.Update, spName, parameterValues);
+		}
+
+		#endregion
+
+		#region Delete
+
+		/// <summary>
+		/// Creates a Delete SQL statement.
+		/// </summary>
+		/// <remarks>
+		/// The method can be used to create the <i>INSERT</i>, <i>UPDATE</i>, and <i>DELETE</i> SQL statements.
+		/// </remarks>
+		/// <param name="commandText">The command text to execute.</param>
+		/// <param name="commandParameters">An array of parameters used to executes the command.</param>
+		/// <returns>Current instance.</returns>
+		public DbManager SetDeleteCommand(
+			string commandText,
+			params IDbDataParameter[] commandParameters)
+		{
+			return SetCommand(
+				CommandAction.Delete, CommandType.Text, commandText, commandParameters);
+		}
+
+		/// <summary>
+		/// Creates a Delete SQL statement.
+		/// </summary>
+		/// <param name="commandType">The <see cref="System.Data.CommandType"/> (stored procedure, text, etc.)</param>
+		/// <param name="commandText">The command text to execute.</param>
+		/// <param name="commandParameters">An array of parameters used to executes the command.</param>
+		/// <returns>Current instance.</returns>
+		public DbManager SetDeleteCommand(
+			CommandType commandType,
+			string      commandText,
+			params      IDbDataParameter[] commandParameters)
+		{
+			return SetCommand(
+				CommandAction.Delete, commandType, commandText, commandParameters);
+		}
+
+		/// <summary>
+		/// Creates a Delete command to be executed as a stored procedure using the provided parameter values.
+		/// </summary>
+		/// <remarks>
+		/// The method queries the database to discover the parameters for the stored procedure 
+		/// (the first time each stored procedure is called), 
+		/// and assign the values based on parameter order.
+		/// </remarks>
+		/// <param name="spName">The name of the stored procedure</param>
+		/// <param name="parameterValues">An array of objects to be assigned as the input values of the stored procedure</param>
+		/// <returns>Current instance.</returns>
+		public DbManager SetDeleteSpCommand(
+			string spName,
+			params object[] parameterValues)
+		{
+			return SetSpCommand(CommandAction.Delete, spName, parameterValues);
+		}
+
+		#endregion
+
+		#endregion
+
+		#region Prepare
+
+		private void PrepareCommand(
+			CommandAction      commandAction,
+			CommandType        commandType,
+			string             commandText,
+			IDbDataParameter[] commandParameters)
+		{
+			DataProvider.PrepareCommand(ref commandType, ref commandText, ref commandParameters);
+
+			LastQuery = commandText;
+
+			var command = GetCommand(commandAction, commandType, commandText);
+
+			SetCommand          (commandAction, command);
+			SetCommandParameters(commandAction, commandParameters);
+
+			if (commandParameters != null)
+			{
+				AttachParameters(command, commandParameters);
+			}
+		}
+
+		/// <summary>
+		/// Prepares a command for execution.
+		/// </summary>
+		/// <returns>Current instance.</returns>
+		public DbManager Prepare()
+		{
+			var command = GetCommand(CommandAction.Select);
+
+			if (InitParameters(CommandAction.Select) == false)
+				ExecuteOperation(OperationType.PrepareCommand, command.Prepare);
+
+			_prepared = true;
+
+			return this;
+		}
+
+		bool InitParameters(CommandAction commandAction)
+		{
+			var prepare = false;
+
+			var commandParameters = GetCommandParameters(commandAction);
+
+			if (commandParameters != null)
+			{
+				foreach (var p in commandParameters)
+				{
+					if (_dataProvider.InitParameter(p))
+						continue;
+
+					// It forces parameter's filed 'MetaType' to be set.
+					// Same for p.Size = p.Size below.
+					//
+					p.DbType = p.DbType;
+
+					if (p.Value is string)
+					{
+						var len = ((string)p.Value).Length;
+
+						if (p.Size < len)
+						{
+							p.Size  = len;
+							prepare = true;
+						}
+						else
+							p.Size = p.Size;
+					}
+					else if (p.Value is DBNull)
+					{
+						p.Size = 1;
+					}
+					else if (p.Value is byte[])
+					{
+						var len = ((byte[])p.Value).Length;
+
+						if (p.Size < len)
+						{
+							p.Size  = len;
+							prepare = true;
+						}
+						else
+							p.Size  = p.Size;
+					}
+					else if (p.Value is char[])
+					{
+						var len = ((char[])p.Value).Length;
+
+						if (p.Size < len)
+						{
+							p.Size  = len;
+							prepare = true;
+						}
+						else
+							p.Size  = p.Size;
+					}
+					else if (p.Value is decimal)
+					{
+						SqlDecimal d = (decimal)p.Value;
+
+						if (p.Precision < d.Precision)
+						{
+							p.Precision = d.Precision;
+							prepare = true;
+						}
+						else
+							p.Precision = p.Precision;
+
+						if (p.Scale < d.Scale)
+						{
+							p.Scale = d.Scale;
+							prepare = true;
+						}
+						else
+							p.Scale = p.Scale;
+					}
+				}
+
+				// Re-prepare command to avoid truncation.
+				//
+				if (prepare)
+				{
+					var command = GetCommand(commandAction);
+
+					AttachParameters(command, commandParameters);
+					command.Prepare();
+				}
+			}
+
+			return prepare;
+		}
+
+		#endregion
+
+		#region ExecuteForEach
+
+		/// <summary>
+		/// Executes a SQL statement for a given collection of objects and 
+		/// returns the number of rows affected.
+		/// </summary>
+		/// <remarks>
+		/// The method prepares the <see cref="Command"/> object 
+		/// and calls the <see cref="ExecuteNonQuery()"/> method for each item of the list.
+		/// </remarks>
+		/// <include file="Examples1.xml" path='examples/db[@name="Execute(CommandType,string,IList)"]/*' />
+		/// <param name="collection">The list of objects used to execute the command.</param>
+		/// <returns>The number of rows affected by the command.</returns>
+		public int ExecuteForEach(ICollection collection)
+		{
+			var rowsTotal = 0;
+
+			if (collection != null && collection.Count != 0)
+			{
+				var initParameters = true;
+
+				foreach (var o in collection)
+				{
+					if (initParameters)
+					{
+						initParameters = false;
+
+						var parameters = GetCommandParameters(CommandAction.Select);
+
+						if (parameters == null || parameters.Length == 0)
+						{
+							parameters = CreateParameters(o);
+
+							SetCommandParameters(CommandAction.Select, parameters);
+							AttachParameters(SelectCommand, parameters);
+							Prepare();
+						}
+					}
+
+					AssignParameterValues(o);
+					rowsTotal += ExecuteNonQueryInternal();
+					MapOutputParameters(o);
+				}
+			}
+		
+			return rowsTotal;
+		}
+
+		/// <summary>
+		/// Executes a SQL statement for a given collection of objects and 
+		/// returns the number of rows affected.
+		/// </summary>
+		/// <remarks>
+		/// The method prepares the <see cref="Command"/> object 
+		/// and calls the <see cref="ExecuteNonQuery()"/> method for each item of the list.
+		/// </remarks>
+		/// <include file="Examples1.xml" path='examples/db[@name="Execute(CommandType,string,IList)"]/*' />
+		/// <param name="collection">The list of objects used to execute the command.</param>
+		/// <returns>The number of rows affected by the command.</returns>
+		public int ExecuteForEach<T>(ICollection<T> collection)
+		{
+			var rowsTotal = 0;
+
+			if (collection != null && collection.Count != 0)
+			{
+				var initParameters = true;
+
+				foreach (var o in collection)
+				{
+					if (initParameters)
+					{
+						initParameters = false;
+
+						var parameters = GetCommandParameters(CommandAction.Select);
+
+						if (parameters == null || parameters.Length == 0)
+						{
+							parameters = CreateParameters(o);
+
+							SetCommandParameters(CommandAction.Select, parameters);
+							AttachParameters(SelectCommand, parameters);
+							Prepare();
+						}
+					}
+
+					AssignParameterValues(o);
+					rowsTotal += ExecuteNonQueryInternal();
+					MapOutputParameters(o);
+				}
+			}
+
+			return rowsTotal;
+		}
+
+		public int ExecuteForEach<T>(int maxBatchSize, IEnumerable<T> collection)
+		{
+			var om  = _mappingSchema.GetObjectMapper(typeof(T));
+			var mms = new List<MemberMapper>();
+
+			foreach (MemberMapper mm in om)
+			{
+				var name = _dataProvider.Convert(mm.Name, GetConvertTypeToParameter()).ToString();
+
+				if (Command.Parameters.Contains(name))
+					mms.Add(mm);
+			}
+
+			return
+				ExecuteForEach(
+					collection,
+					mms.ToArray(),
+					maxBatchSize,
+					obj => CreateParameters(obj));
+		}
+
+		public delegate IDbDataParameter[] ParameterProvider<T>(T obj);
+
+		internal int ExecuteForEach<T>(IEnumerable<T> collection, MemberMapper[] members, int maxBatchSize, ParameterProvider<T> getParameters)
+		{
+			if (collection == null)
+				return 0;
+
+			var maxRows =
+				Math.Max(
+					Math.Min(
+						Math.Max(
+							members.Length == 0? 1000 : _dataProvider.MaxParameters / members.Length,
+							members.Length),
+						maxBatchSize),
+					1);
+			var baseSql          = SelectCommand.CommandText;
+			var paramName        = _dataProvider.Convert(".", ConvertType.NameToQueryParameter).ToString();
+			var rowsTotal        = 0;
+			var nRows            = 0;
+			var initParameters   = true;
+			var saveCanRaseEvent = _canRaiseEvents;
+
+			_canRaiseEvents = false;
+
+			var                sb             = new StringBuilder();
+			var                rowSql         = new List<int>(maxRows);
+			IDbDataParameter[] baseParameters = null;
+			var                parameters     = new List<IDbDataParameter>();
+			var                hasValue       = new List<bool>();
+
+			var  isPrepared = false;
+
+			foreach (var obj in collection)
+			{
+				if (initParameters)
+				{
+					initParameters = false;
+					baseParameters = getParameters(obj);
+
+					if (maxRows != 1)
+					{
+						var n = 0;
+
+						foreach (var p in baseParameters)
+							n += p.ParameterName.Length + 3 - "{0}".Length + _dataProvider.EndOfSql.Length;
+
+						maxRows = Math.Max(1, Math.Min(maxRows, _dataProvider.MaxBatchSize / (baseSql.Length + n)));
+					}
+
+					if (maxRows != 1)
+						baseSql += _dataProvider.EndOfSql;
+				}
+
+				if (rowSql.Count < maxRows)
+				{
+// ReSharper disable AccessToModifiedClosure
+					Converter<IDbDataParameter,string> c1 = p => p.ParameterName + nRows;
+// ReSharper restore AccessToModifiedClosure
+					Converter<IDbDataParameter,string> c2 = p => p.ParameterName;
+
+					sb
+						.Append("\n")
+						.AppendFormat(
+							baseSql,
+							Array.ConvertAll(
+								baseParameters,
+								baseParameters.Length > 0 && baseParameters[0].ParameterName != paramName? c1 : c2));
+
+					rowSql.Add(sb.Length);
+
+					for (var i = 0; i < members.Length; i++)
+					{
+						var value  = members[i].GetValue(obj);
+						var type   = members[i].MemberAccessor.Type;
+						var dbType = members[i].GetDbType();
+
+						IDbDataParameter p;
+
+						if ((value == null || value == DBNull.Value) && (dbType == DbType.Binary || type == typeof(byte[])) ||
+							type == typeof(System.Data.Linq.Binary))
+						{
+							p = Parameter(baseParameters[i].ParameterName + nRows, DBNull.Value, DbType.Binary);
+						}
+						else
+						{
+							if (value != null && value.GetType().IsEnum)
+								value = MappingSchema.MapEnumToValue(value, true);
+
+							p = value != null
+								? Parameter(baseParameters[i].ParameterName + nRows, value)
+								: Parameter(baseParameters[i].ParameterName + nRows, DBNull.Value, members[i].GetDbType());
+						}
+
+						parameters.Add(p);
+						hasValue.Add(value != null);
+					}
+				}
+				else
+				{
+					var n = nRows * members.Length;
+
+					for (var i = 0; i < members.Length; i++)
+					{
+						var value = members[i].GetValue(obj);
+
+						if (!hasValue[n + i] && value != null)
+						{
+							isPrepared = false;
+
+							var type   = members[i].MemberAccessor.Type;
+							var dbType = members[i].GetDbType();
+
+							if (value.GetType().IsEnum)
+								value = MappingSchema.MapEnumToValue(value, true);
+
+							IDbDataParameter p;
+							if (dbType != DbType.Object)
+								p = Parameter(baseParameters[i].ParameterName + nRows, value ?? DBNull.Value, dbType);
+							else
+								p = Parameter(baseParameters[i].ParameterName + nRows, value ?? DBNull.Value/*, dbType*/);
+
+							parameters[n + i] = p;
+							hasValue  [n + i] = true;
+						}
+						else
+						{
+							if (value != null && value.GetType().IsEnum)
+								value = MappingSchema.MapEnumToValue(value, true);
+
+							_dataProvider.SetParameterValue(
+								parameters[n + i],
+								value ?? DBNull.Value);
+								//value == null || members[i].MapMemberInfo.Nullable && _mappingSchema.IsNull(value)
+								//	? DBNull.Value
+								//	: value);
+						}
+
+					}
+				}
+
+				nRows++;
+
+				if (nRows >= maxRows)
+				{
+					if (!isPrepared)
+					{
+						SetCommand(sb.ToString(), parameters.ToArray());
+						Prepare();
+						isPrepared = true;
+					}
+					else
+					{
+						InitParameters(CommandAction.Select);
+					}
+
+					var n = ExecuteNonQueryInternal();
+					if (n > 0)
+						rowsTotal += n;
+
+					nRows = 0;
+				}
+			}
+
+			if (nRows > 0)
+			{
+				if (rowSql.Count >= maxRows)
+				{
+					var nps = nRows * members.Length;
+					parameters.RemoveRange(nps, parameters.Count - nps);
+
+					sb.Length = rowSql[nRows - 1];
+				}
+
+				SetCommand(sb.ToString(), parameters.ToArray());
+				Prepare();
+
+				var n = ExecuteNonQueryInternal();
+				if (n > 0)
+					rowsTotal += n;
+			}
+
+			_canRaiseEvents = saveCanRaseEvent;
+
+			return rowsTotal;
+		}
+
+		/// <summary>
+		/// Executes a SQL statement for the <see cref="DataTable"/> and 
+		/// returns the number of rows affected.
+		/// </summary>
+		/// <remarks>
+		/// The method prepares the <see cref="Command"/> object 
+		/// and calls the <see cref="ExecuteNonQuery()"/> method for each item 
+		/// of the <see cref="DataTable"/>.
+		/// </remarks>
+		/// <include file="Examples1.xml" path='examples/db[@name="Execute(CommandType,string,DataTable)"]/*' />
+		/// <param name="table">An instance of the <see cref="DataTable"/> class to execute the command.</param>
+		/// <returns>The number of rows affected by the command.</returns>
+		public int ExecuteForEach(DataTable table)
+		{
+			var rowsTotal = 0;
+
+			if (table != null && table.Rows.Count != 0)
+			{
+				var parameters = GetCommandParameters(CommandAction.Select);
+
+				if (parameters == null || parameters.Length == 0)
+				{
+					parameters = CreateParameters(table.Rows[0]);
+
+					SetCommandParameters(CommandAction.Select, parameters);
+					AttachParameters(SelectCommand, parameters);
+					Prepare();
+				}
+
+				foreach (DataRow dr in table.Rows)
+				{
+					AssignParameterValues(dr);
+					rowsTotal += ExecuteNonQueryInternal();
+				}
+			}
+		
+			return rowsTotal;
+		}
+
+		/// <summary>
+		/// Executes a SQL statement for the first table of the <see cref="DataSet"/> 
+		/// and returns the number of rows affected.
+		/// </summary>
+		/// <remarks>
+		/// The method prepares the <see cref="Command"/> object
+		/// and calls the <see cref="ExecuteNonQuery()"/> method for each item of the first table.
+		/// </remarks>
+		/// <include file="Examples1.xml" path='examples/db[@name="Execute(CommandType,string,DataSet)"]/*' />
+		/// <param name="dataSet">An instance of the <see cref="DataSet"/> class to execute the command.</param>
+		/// <returns>The number of rows affected by the command.</returns>
+		public int ExecuteForEach(DataSet dataSet)
+		{
+			return ExecuteForEach(dataSet.Tables[0]);
+		}
+
+		/// <summary>
+		/// Executes a SQL statement for the specified table of the <see cref="DataSet"/> 
+		/// and returns the number of rows affected.
+		/// </summary>
+		/// <remarks>
+		/// The method prepares the <see cref="Command"/> object
+		/// and calls the <see cref="ExecuteNonQuery()"/> method for each item of the first table.
+		/// </remarks>
+		/// <include file="Examples1.xml" path='examples/db[@name="Execute(CommandType,string,DataSet,string)"]/*' />
+		/// <param name="dataSet">An instance of the <see cref="DataSet"/> class to execute the command.</param>
+		/// <param name="nameOrIndex">The table name or index.
+		/// name/index.</param>
+		/// <returns>The number of rows affected by the command.</returns>
+		public int ExecuteForEach(DataSet dataSet, NameOrIndexParameter nameOrIndex)
+		{
+			return nameOrIndex.ByName ? ExecuteForEach(dataSet.Tables[nameOrIndex.Name])
+				: ExecuteForEach(dataSet.Tables[nameOrIndex.Index]);
+		}
+
+		#endregion
+
+		#region ExecuteNonQuery
+
+		/// <summary>
+		/// Executes a SQL statement and returns the number of rows affected.
+		/// </summary>
+		/// <remarks>
+		/// The method can be used to execute the <i>INSERT</i>, <i>UPDATE</i>, and <i>DELETE</i> SQL statements.
+		/// </remarks>
+		/// <include file="Examples1.xml" path='examples/db[@name="ExecuteNonQuery()"]/*' />
+		/// <returns>The number of rows affected by the command.</returns>
+		public int ExecuteNonQuery()
+		{
+			if (_prepared)
+				InitParameters(CommandAction.Select);
+
+			return ExecuteNonQueryInternal();
+		}
+
+		/// <summary>
+		/// Executes a SQL statement and returns the number of rows affected.
+		/// </summary>
+		/// <remarks>
+		/// The method can be used to execute the <i>INSERT</i>, <i>UPDATE</i>, and <i>DELETE</i> SQL statements.
+		/// </remarks>
+		/// <param name="returnValueMember">Name of a <see cref="MemberMapper"/> to map return value.</param>
+		/// <param name="obj">An <see cref="System.Object"/> to map from command parameters.</param>
+		/// <returns>The number of rows affected by the command.</returns>
+		public int ExecuteNonQuery(
+			string returnValueMember,
+			object obj)
+		{
+			var rowsAffected = ExecuteNonQuery();
+
+			MapOutputParameters(returnValueMember, obj);
+
+			return rowsAffected;
+		}
+
+		/// <summary>
+		/// Executes a SQL statement and returns the number of rows affected.
+		/// </summary>
+		/// <remarks>
+		/// The method can be used to execute the <i>INSERT</i>, <i>UPDATE</i>, and <i>DELETE</i> SQL statements.
+		/// </remarks>
+		/// <param name="obj">An <see cref="System.Object"/> to map from command parameters.</param>
+		/// <returns>The number of rows affected by the command.</returns>
+		public int ExecuteNonQuery(object obj)
+		{
+			var rowsAffected = ExecuteNonQuery();
+
+			MapOutputParameters(null, obj);
+
+			return rowsAffected;
+		}
+
+		/// <summary>
+		/// Executes a SQL statement and returns the number of rows affected.
+		/// </summary>
+		/// <remarks>
+		/// The method can be used to execute the <i>INSERT</i>, <i>UPDATE</i>, and <i>DELETE</i> SQL statements.
+		/// </remarks>
+		/// <param name="returnValueMember">Name of a <see cref="MemberMapper"/> to map return value.</param>
+		/// <param name="objects">An array of <see cref="System.Object"/> to map
+		/// from command parameters.</param>
+		/// <returns>The number of rows affected by the command.</returns>
+		public int ExecuteNonQuery(
+			string          returnValueMember,
+			params object[] objects)
+		{
+			var rowsAffected = ExecuteNonQuery();
+
+			MapOutputParameters(returnValueMember, objects);
+
+			return rowsAffected;
+		}
+
+		/// <summary>
+		/// Executes a SQL statement and returns the number of rows affected.
+		/// </summary>
+		/// <remarks>
+		/// The method can be used to execute the <i>INSERT</i>, <i>UPDATE</i>, and <i>DELETE</i> SQL statements.
+		/// </remarks>
+		/// <param name="objects">An array of <see cref="System.Object"/> to map
+		/// from command parameters.</param>
+		/// <returns>The number of rows affected by the command.</returns>
+		public int ExecuteNonQuery(params object[] objects)
+		{
+			var rowsAffected = ExecuteNonQuery();
+
+			MapOutputParameters(null, objects);
+
+			return rowsAffected;
+		}
+
+		/// <summary>
+		/// Executes several SQL statements at a time using single roundtrip to the server (if supported by data provider).
+		/// </summary>
+		/// <remarks>
+		/// All parameters of the query must be arrays of type corresponding to the type of the parameter. 
+		/// The value of the <paramref name="iterations"/> parameter must be equal to the number of elements of each array.
+		/// </remarks>
+		/// <param name="iterations">The number of iterations.</param>
+		/// <returns>The number of rows affected by the command.</returns>
+		public int ExecuteArray(int iterations)
+		{
+			return ExecuteOperation<int>(OperationType.ExecuteNonQuery, () => DataProvider.ExecuteArray(SelectCommand, iterations));
+		}
+
+		#endregion
+
+		#region ExecuteScalar
+
+		/// <summary>
+		/// Executes the query, and returns the first column of the first row
+		/// in the resultset returned by the query. Extra columns or rows are
+		/// ignored.
+		/// </summary>
+		/// <returns>The first column of the first row in the resultset.</returns>
+		/// <seealso cref="ExecuteScalar(ScalarSourceType, NameOrIndexParameter)"/>
+		public object ExecuteScalar()
+		{
+			if (_prepared)
+				InitParameters(CommandAction.Select);
+
+			using (var rd = ExecuteReaderInternal(CommandBehavior.Default))
+				return rd.Read() && rd.FieldCount > 0 ? rd.GetValue(0) : null;
+		}
+
+		/// <summary>
+		/// Executes the query, and returns the value with specified scalar
+		/// source type.
+		/// </summary>
+		/// <param name="sourceType">The method used to return the scalar
+		/// value.</param>
+		/// <returns><list type="table">
+		/// <listheader>
+		///  <term>ScalarSourceType</term>
+		///  <description>Return value</description>
+		/// </listheader>
+		/// <item>
+		///  <term>DataReader</term>
+		///  <description>The first column of the first row in the resultset.
+		///  </description>
+		/// </item>
+		/// <item>
+		///  <term>OutputParameter</term>
+		///  <description>The value of the first output or input/output
+		///  parameter returned.</description>
+		/// </item>
+		/// <item>
+		///  <term>ReturnValue</term>
+		///  <description>The value of the "return value" parameter returned.
+		///  </description>
+		/// </item>
+		/// <item>
+		///  <term>AffectedRows</term>
+		///  <description>The number of rows affected.</description>
+		/// </item>
+		/// </list>
+		/// </returns>
+		/// <seealso cref="ExecuteScalar(ScalarSourceType, NameOrIndexParameter)"/>
+		public object ExecuteScalar(ScalarSourceType sourceType)
+		{
+			return ExecuteScalar(sourceType, new NameOrIndexParameter());
+		}
+
+		/// <summary>
+		/// Executes the query, and returns the value with specified scalar
+		/// source type.
+		/// </summary>
+		/// <param name="sourceType">The method used to return the scalar value.</param>
+		/// <param name="nameOrIndex">The column name/index or output parameter name/index.</param>
+		/// <returns><list type="table">
+		/// <listheader>
+		///  <term>ScalarSourceType</term>
+		///  <description>Return value</description>
+		/// </listheader>
+		/// <item>
+		///  <term>DataReader</term>
+		///  <description>The column with specified name or at specified index
+		///  of the first row in the resultset.</description>
+		/// </item>
+		/// <item>
+		///  <term>OutputParameter</term>
+		///  <description>The value of the output or input/output parameter
+		///  returned with specified name or at specified index.</description>
+		/// </item>
+		/// <item>
+		///  <term>ReturnValue</term>
+		///  <description>The value of the "return value" parameter returned.
+		///  The index parameter is ignored.</description>
+		/// </item>
+		/// <item>
+		///  <term>AffectedRows</term>
+		///  <description>The number of rows affected. The index parameter is
+		///  ignored.</description>
+		/// </item>
+		/// </list>
+		/// </returns>
+		public object ExecuteScalar(ScalarSourceType sourceType, NameOrIndexParameter nameOrIndex)
+		{
+			if (_prepared)
+				InitParameters(CommandAction.Select);
+
+			switch (sourceType)
+			{
+				case ScalarSourceType.DataReader:
+					using (var reader = ExecuteReaderInternal())
+						if (reader.Read())
+							return reader.GetValue(nameOrIndex.ByName ? reader.GetOrdinal(nameOrIndex.Name) : nameOrIndex.Index);
+
+					break;
+
+				case ScalarSourceType.OutputParameter:
+					ExecuteNonQueryInternal();
+
+					if (nameOrIndex.ByName)
+					{
+						var name = (string)_dataProvider.Convert(nameOrIndex.Name, GetConvertTypeToParameter());
+						return Parameter(name).Value;
+					}
+
+					var index = nameOrIndex.Index;
+					foreach (IDataParameter p in SelectCommand.Parameters)
+					{
+						// Skip the return value parameter.
+						//
+						if (p.Direction == ParameterDirection.ReturnValue)
+							continue;
+
+						if (0 == index)
+							return p.Value;
+
+						--index;
+					}
+					break;
+
+				case ScalarSourceType.ReturnValue:
+					ExecuteNonQueryInternal();
+
+					foreach (IDataParameter p in SelectCommand.Parameters)
+						if (p.Direction == ParameterDirection.ReturnValue)
+							return p.Value;
+
+					break;
+
+				case ScalarSourceType.AffectedRows:
+					return ExecuteNonQueryInternal();
+
+				default:
+					throw new InvalidEnumArgumentException("sourceType",
+						(int)sourceType, typeof(ScalarSourceType));
+			}
+
+			return null;
+		}
+
+		/// <summary>
+		/// Executes the query, and returns the first column of the first row
+		/// in the resultset returned by the query. Extra columns or rows are
+		/// ignored.
+		/// </summary>
+		/// <returns>
+		/// The first column of the first row in the resultset.</returns>
+		/// <seealso cref="ExecuteScalar{T}(ScalarSourceType, NameOrIndexParameter)"/>
+		public T ExecuteScalar<T>()
+		{
+			var value = _mappingSchema.ConvertChangeType(ExecuteScalar(), typeof(T));
+			return value == null && typeof(T).IsEnum ? default(T) : (T)value;
+		}
+
+		/// <summary>
+		/// Executes the query, and returns the value with specified scalar
+		/// source type.
+		/// </summary>
+		/// <param name="sourceType">The method used to return the scalar
+		/// value.</param>
+		/// <returns><list type="table">
+		/// <listheader>
+		///  <term>ScalarSourceType</term>
+		///  <description>Return value</description>
+		/// </listheader>
+		/// <item>
+		///  <term>DataReader</term>
+		///  <description>The first column of the first row in the resultset.
+		///  </description>
+		/// </item>
+		/// <item>
+		///  <term>OutputParameter</term>
+		///  <description>The value of the first output or input/output
+		///  parameter returned.</description>
+		/// </item>
+		/// <item>
+		///  <term>ReturnValue</term>
+		///  <description>The value of the "return value" parameter returned.
+		///  </description>
+		/// </item>
+		/// <item>
+		///  <term>AffectedRows</term>
+		///  <description>The number of rows affected.</description>
+		/// </item>
+		/// </list>
+		/// </returns>
+		/// <seealso cref="ExecuteScalar{T}(ScalarSourceType, NameOrIndexParameter)"/>
+		public T ExecuteScalar<T>(ScalarSourceType sourceType)
+		{
+			return ExecuteScalar<T>(sourceType, new NameOrIndexParameter());
+		}
+
+		/// <summary>
+		/// Executes the query, and returns the value with specified scalar
+		/// source type.
+		/// </summary>
+		/// <param name="sourceType">The method used to return the scalar value.</param>
+		/// <param name="nameOrIndex">The column name/index or output parameter name/index.</param>
+		/// <returns><list type="table">
+		/// <listheader>
+		///  <term>ScalarSourceType</term>
+		///  <description>Return value</description>
+		/// </listheader>
+		/// <item>
+		///  <term>DataReader</term>
+		///  <description>The column with specified name or at specified index
+		///  of the first row in the resultset.</description>
+		/// </item>
+		/// <item>
+		///  <term>OutputParameter</term>
+		///  <description>The value of the output or input/output parameter
+		///  returned with specified name or at specified index.</description>
+		/// </item>
+		/// <item>
+		///  <term>ReturnValue</term>
+		///  <description>The value of the "return value" parameter returned.
+		///  The index parameter is ignored.</description>
+		/// </item>
+		/// <item>
+		///  <term>AffectedRows</term>
+		///  <description>The number of rows affected. The index parameter is
+		///  ignored.</description>
+		/// </item>
+		/// </list>
+		/// </returns>
+		public T ExecuteScalar<T>(ScalarSourceType sourceType, NameOrIndexParameter nameOrIndex)
+		{
+			return (T)_mappingSchema.ConvertChangeType(ExecuteScalar(sourceType, nameOrIndex), typeof(T));
+		}
+
+		#endregion
+
+		#region ExecuteScalarList
+
+		/// <summary>
+		/// Executes the query, and returns the array list of values of the
+		/// specified column of  the every row in the resultset returned by the
+		/// query. Other columns are ignored.
+		/// </summary>
+		/// <param name="list">The array to fill in.</param>
+		/// <param name="nameOrIndex">The column name/index or output parameter name/index.</param>
+		/// <param name="type">The type of the each element.</param>
+		/// <returns>Array list of values of the specified column of the every
+		/// row in the resultset.</returns>
+		public IList ExecuteScalarList(
+			IList                list,
+			Type                 type,
+			NameOrIndexParameter nameOrIndex)
+		{
+			if (list == null)
+				list = new ArrayList();
+
+			if (_prepared)
+				InitParameters(CommandAction.Select);
+
+			using (var dr = ExecuteReaderInternal())
+				return _mappingSchema.MapDataReaderToScalarList(dr, nameOrIndex, list, type);
+		}
+
+		/// <summary>
+		/// Executes the query, and returns the array list of values of first
+		/// column of the every row in the resultset returned by the query.
+		/// Other columns are ignored.
+		/// </summary>
+		/// <param name="list">The array to fill in.</param>
+		/// <param name="type">The type of the each element.</param>
+		/// <returns>Array list of values of first column of the every row in
+		/// the resultset.</returns>
+		public IList ExecuteScalarList(IList list, Type type)
+		{
+			if (list == null)
+				list = new ArrayList();
+
+			return ExecuteScalarList(list, type, 0);
+		}
+
+		/// <summary>
+		/// Executes the query, and returns the array list of values of the
+		/// specified column of  the every row in the resultset returned by the
+		/// query. Other columns are ignored.
+		/// </summary>
+		/// <param name="nameOrIndex">The column name/index.</param>
+		/// <param name="type">The type of the each element.</param>
+		/// <returns>Array list of values of the specified column of the every
+		/// row in the resultset.</returns>
+		public ArrayList ExecuteScalarList(Type type, NameOrIndexParameter nameOrIndex)
+		{
+			var list = new ArrayList();
+
+			ExecuteScalarList(list, type, nameOrIndex);
+
+			return list;
+		}
+
+		/// <summary>
+		/// Executes the query, and returns the array list of values of first
+		/// column of the every row in the resultset returned by the query.
+		/// Other columns are ignored.
+		/// </summary>
+		/// <param name="type">The type of the each element.</param>
+		/// <returns>Array list of values of first column of the every row in
+		/// the resultset.</returns>
+		public ArrayList ExecuteScalarList(Type type)
+		{
+			var list = new ArrayList();
+
+			ExecuteScalarList(list, type, 0);
+
+			return list;
+		}
+
+		/// <summary>
+		/// Executes the query, and returns the array list of values of the
+		/// specified column of  the every row in the resultset returned by the
+		/// query. Other columns are ignored.
+		/// </summary>
+		/// <param name="list">The array to fill in.</param>
+		/// <param name="nameOrIndex">The column name/index or output parameter
+		/// name/index.</param>
+		/// <typeparam name="T">The type of the each element.</typeparam>
+		/// <returns>Array list of values of the specified column of the every
+		/// row in the resultset.</returns>
+		public IList<T> ExecuteScalarList<T>(
+			IList<T>             list,
+			NameOrIndexParameter nameOrIndex)
+		{
+			if (list == null)
+				list = new List<T>();
+
+			if (_prepared)
+				InitParameters(CommandAction.Select);
+
+			using (var dr = ExecuteReaderInternal())
+				return _mappingSchema.MapDataReaderToScalarList(dr, nameOrIndex, list);
+		}
+
+		/// <summary>
+		/// Executes the query, and returns the array list of values of first
+		/// column of the every row in the resultset returned by the query.
+		/// Other columns are ignored.
+		/// </summary>
+		/// <param name="list">The array to fill in.</param>
+		/// <typeparam name="T">The type of the each element.</typeparam>
+		/// <returns>Array list of values of first column of the every row in
+		/// the resultset.</returns>
+		public IList<T> ExecuteScalarList<T>(IList<T> list)
+		{
+			return ExecuteScalarList(list, 0);
+		}
+
+		/// <summary>
+		/// Executes the query, and returns the array list of values of the
+		/// specified column of the every row in the resultset returned by the
+		/// query. Other columns are ignored.
+		/// </summary>
+		/// <param name="nameOrIndex">The column name/index or output parameter name/index.</param>
+		/// <typeparam name="T">The type of the each element.</typeparam>
+		/// <returns>Array list of values of the specified column of the every
+		/// row in the resultset.</returns>
+		public List<T> ExecuteScalarList<T>(NameOrIndexParameter nameOrIndex)
+		{
+			var list = new List<T>();
+
+			ExecuteScalarList(list, nameOrIndex);
+
+			return list;
+		}
+
+		/// <summary>
+		/// Executes the query, and returns the list of values of first
+		/// column of the every row in the resultset returned by the query.
+		/// Other columns are ignored.
+		/// </summary>
+		/// <typeparam name="T">The type of the each element.</typeparam>
+		/// <returns>Array list of values of first column of the every row in
+		/// the resultset.</returns>
+		public List<T> ExecuteScalarList<T>()
+		{
+			var list = new List<T>();
+
+			ExecuteScalarList(list, 0);
+
+			return list;
+		}
+
+		#endregion
+
+		#region ExecuteScalarDictionary
+
+		///<summary>
+		/// Executes the query, and returns the dictionary.
+		/// The keys are loaded from a column specified by <paramref name="keyField"/> and
+		/// values are loaded from a column specified by <paramref name="valueField"/>.
+		/// Other columns are ignored.
+		///</summary>
+		///<param name="dic">The dictionary to add values.</param>
+		///<param name="keyField">The column name/index to load keys.</param>
+		///<param name="keyFieldType">The key type.</param>
+		///<param name="valueField">The column name/index to load values.</param>
+		///<param name="valueFieldType">The value type.</param>
+		///<returns>The loaded dictionary.</returns>
+		public IDictionary ExecuteScalarDictionary(
+			IDictionary dic,
+			NameOrIndexParameter keyField,   Type keyFieldType,
+			NameOrIndexParameter valueField, Type valueFieldType)
+		{
+			if (dic == null)
+				dic = new Hashtable();
+
+			if (_prepared)
+				InitParameters(CommandAction.Select);
+
+			//object nullValue = _mappingSchema.GetNullValue(type);
+
+			if (keyField.ByName && keyField.Name.Length > 0 && keyField.Name[0] == '@')
+				keyField = keyField.Name.Substring(1);
+
+			using (var dr = ExecuteReaderInternal())
+			{
+				if (dr.Read())
+				{
+					var keyIndex   = keyField.ByName   ? dr.GetOrdinal(keyField.Name)   : keyField.Index;
+					var valueIndex = valueField.ByName ? dr.GetOrdinal(valueField.Name) : valueField.Index;
+
+					do
+					{
+						var value = dr[valueIndex];
+						var key   = dr[keyIndex];
+
+						if (key == null || key.GetType() != keyFieldType)
+							key = key is DBNull ? null : _mappingSchema.ConvertChangeType(key, keyFieldType);
+
+						if (value == null || value.GetType() != valueFieldType)
+							value = value is DBNull ? null : _mappingSchema.ConvertChangeType(value, valueFieldType);
+
+						dic.Add(key, value);
+					}
+					while (dr.Read());
+				}
+			}
+
+			return dic;
+		}
+
+		///<summary>
+		/// Executes the query, and returns the dictionary.
+		/// The keys are loaded from a column specified by <paramref name="keyField"/> and
+		/// values are loaded from a column specified by <paramref name="valueField"/>.
+		/// Other columns are ignored.
+		///</summary>
+		///<param name="keyField">The column name/index to load keys.</param>
+		///<param name="keyFieldType">The key type.</param>
+		///<param name="valueField">The column name/index to load values.</param>
+		///<param name="valueFieldType">The value type.</param>
+		///<returns>The loaded dictionary.</returns>
+		public Hashtable ExecuteScalarDictionary(
+			NameOrIndexParameter keyField,   Type keyFieldType,
+			NameOrIndexParameter valueField, Type valueFieldType)
+		{
+			var table = new Hashtable();
+
+			ExecuteScalarDictionary(table, keyField, keyFieldType, valueField, valueFieldType);
+
+			return table;
+		}
+
+		///<summary>
+		/// Executes the query, and returns the dictionary.
+		/// The keys are loaded from a column specified by <paramref name="keyField"/> and
+		/// values are loaded from a column specified by <paramref name="valueField"/>.
+		/// Other columns are ignored.
+		///</summary>
+		///<typeparam name="TKey">The key type.</typeparam>
+		///<typeparam name="T">The value type.</typeparam>
+		///<param name="dic">The dictionary to add values.</param>
+		///<param name="keyField">The column name/index to load keys.</param>
+		///<param name="valueField">The column name/index to load values.</param>
+		///<returns>The loaded dictionary.</returns>
+		public IDictionary<TKey,T> ExecuteScalarDictionary<TKey,T>(
+			IDictionary<TKey,T>  dic,
+			NameOrIndexParameter keyField,
+			NameOrIndexParameter valueField)
+		{
+			if (dic == null)
+				dic = new Dictionary<TKey,T>();
+
+			if (_prepared)
+				InitParameters(CommandAction.Select);
+
+			//object nullValue = _mappingSchema.GetNullValue(type);
+
+			var keyFieldType   = typeof(TKey);
+			var valueFieldType = typeof(T);
+
+			using (var dr = ExecuteReaderInternal())
+				if (dr.Read())
+				{
+					var keyIndex = keyField.ByName ? dr.GetOrdinal(keyField.Name) : keyField.Index;
+					var valueIndex = valueField.ByName ? dr.GetOrdinal(valueField.Name) : valueField.Index;
+
+					do
+					{
+						var value = dr[valueIndex];
+						var key = dr[keyIndex];
+
+						if (key == null || key.GetType() != keyFieldType)
+							key = key is DBNull ? null : _mappingSchema.ConvertChangeType(key, keyFieldType);
+
+						if (value == null || value.GetType() != valueFieldType)
+							value = value is DBNull ? null : _mappingSchema.ConvertChangeType(value, valueFieldType);
+
+						dic.Add((TKey) key, (T) value);
+					} while (dr.Read());
+				}
+
+			return dic;
+		}
+
+		///<summary>
+		/// Executes the query, and returns the dictionary.
+		/// The keys are loaded from a column specified by <paramref name="keyField"/> and
+		/// values are loaded from a column specified by <paramref name="valueField"/>.
+		/// Other columns are ignored.
+		///</summary>
+		///<typeparam name="TKey">The key type.</typeparam>
+		///<typeparam name="T">The value type.</typeparam>
+		///<param name="keyField">The column name/index to load keys.</param>
+		///<param name="valueField">The column name/index to load values.</param>
+		///<returns>The loaded dictionary.</returns>
+		public Dictionary<TKey,T> ExecuteScalarDictionary<TKey,T>(
+			NameOrIndexParameter keyField,
+			NameOrIndexParameter valueField)
+		{
+			var dic = new Dictionary<TKey,T>();
+
+			ExecuteScalarDictionary(dic, keyField, valueField);
+
+			return dic;
+		}
+
+		#endregion
+
+		#region ExecuteScalarDictionary (Index)
+
+		///<summary>
+		/// Executes the query, and returns the dictionary.
+		/// The keys are loaded from columns specified by <paramref name="index"/> and
+		/// values are loaded from a column specified by <paramref name="valueField"/>.
+		/// Other columns are ignored.
+		///</summary>
+		///<param name="dic">The dictionary to add values.</param>
+		///<param name="index">The <see cref="MapIndex"/> of the key columns.</param>
+		///<param name="valueField">The column name/index to load values.</param>
+		///<param name="valueFieldType">The value type.</param>
+		///<returns>The loaded dictionary.</returns>
+		public IDictionary ExecuteScalarDictionary(
+			IDictionary          dic,
+			MapIndex             index,
+			NameOrIndexParameter valueField,
+			Type                 valueFieldType)
+		{
+			if (dic == null)
+				dic = new Hashtable();
+
+			if (_prepared)
+				InitParameters(CommandAction.Select);
+
+			//object nullValue = _mappingSchema.GetNullValue(type);
+
+			using (var dr = ExecuteReaderInternal())
+				if (dr.Read())
+				{
+					var valueIndex = valueField.ByName ? dr.GetOrdinal(valueField.Name) : valueField.Index;
+					var keyIndex = new int[index.Fields.Length];
+
+					for (var i = 0; i < keyIndex.Length; i++)
+						keyIndex[i] =
+							index.Fields[i].ByName
+								? dr.GetOrdinal(index.Fields[i].Name)
+								: index.Fields[i].Index;
+
+					do
+					{
+						var value = dr[valueIndex];
+
+						if (value == null || value.GetType() != valueFieldType)
+							value = value is DBNull ? null : _mappingSchema.ConvertChangeType(value, valueFieldType);
+
+						var key = new object[keyIndex.Length];
+
+						for (var i = 0; i < keyIndex.Length; i++)
+							key[i] = dr[keyIndex[i]];
+
+						dic.Add(new CompoundValue(key), value);
+					} while (dr.Read());
+				}
+
+			return dic;
+		}
+
+		///<summary>
+		/// Executes the query, and returns the dictionary.
+		/// The keys are loaded from columns specified by <paramref name="index"/> and
+		/// values are loaded from a column specified by <paramref name="valueField"/>.
+		/// Other columns are ignored.
+		///</summary>
+		///<param name="index">The <see cref="MapIndex"/> of the key columns.</param>
+		///<param name="valueField">The column name/index to load values.</param>
+		///<param name="valueFieldType">The value type.</param>
+		///<returns>The loaded dictionary.</returns>
+		public Hashtable ExecuteScalarDictionary(
+			MapIndex index, NameOrIndexParameter valueField, Type valueFieldType)
+		{
+			var table = new Hashtable();
+
+			ExecuteScalarDictionary(table, index, valueField, valueFieldType);
+
+			return table;
+		}
+
+		///<summary>
+		/// Executes the query, and returns the dictionary.
+		/// The keys are loaded from columns specified by <paramref name="index"/> and
+		/// values are loaded from a column specified by <paramref name="valueField"/>.
+		/// Other columns are ignored.
+		///</summary>
+		///<typeparam name="T">The value type.</typeparam>
+		///<param name="dic">The dictionary to add values.</param>
+		///<param name="index">The <see cref="MapIndex"/> of the key columns.</param>
+		///<param name="valueField">The column name/index to load values.</param>
+		///<returns>The loaded dictionary.</returns>
+		public IDictionary<CompoundValue,T> ExecuteScalarDictionary<T>(
+			IDictionary<CompoundValue, T> dic, MapIndex index, NameOrIndexParameter valueField)
+		{
+			if (dic == null)
+				dic = new Dictionary<CompoundValue, T>();
+
+			if (_prepared)
+				InitParameters(CommandAction.Select);
+
+			//object nullValue = _mappingSchema.GetNullValue(type);
+
+			var valueFieldType = typeof(T);
+
+			using (var dr = ExecuteReaderInternal())
+				if (dr.Read())
+				{
+					var valueIndex = valueField.ByName ? dr.GetOrdinal(valueField.Name) : valueField.Index;
+					var keyIndex = new int[index.Fields.Length];
+
+					for (var i = 0; i < keyIndex.Length; i++)
+						keyIndex[i] = index.Fields[i].ByName
+						              	? dr.GetOrdinal(index.Fields[i].Name)
+						              	: index.Fields[i].Index;
+
+					do
+					{
+						var value = dr[valueIndex];
+
+						if (value == null || value.GetType() != valueFieldType)
+							value = value is DBNull ? null : _mappingSchema.ConvertChangeType(value, valueFieldType);
+
+						var key = new object[keyIndex.Length];
+
+						for (var i = 0; i < keyIndex.Length; i++)
+							key[i] = dr[keyIndex[i]];
+
+						dic.Add(new CompoundValue(key), (T) value);
+					} while (dr.Read());
+				}
+
+			return dic;
+		}
+
+		///<summary>
+		/// Executes the query, and returns the dictionary.
+		/// The keys are loaded from columns specified by <paramref name="index"/> and
+		/// values are loaded from a column specified by <paramref name="valueField"/>.
+		/// Other columns are ignored.
+		///</summary>
+		///<typeparam name="T">The value type.</typeparam>
+		///<param name="index">The <see cref="MapIndex"/> of the key columns.</param>
+		///<param name="valueField">The column name/index to load values.</param>
+		///<returns>The loaded dictionary.</returns>
+		public Dictionary<CompoundValue,T> ExecuteScalarDictionary<T>(
+			MapIndex index, NameOrIndexParameter valueField)
+		{
+			var dic = new Dictionary<CompoundValue,T>();
+
+			ExecuteScalarDictionary(dic, index, valueField);
+
+			return dic;
+		}
+
+		#endregion
+
+		#region ExecuteReader
+
+		/// <summary>
+		/// Executes the command and builds an <see cref="IDataReader"/>.
+		/// </summary>
+		/// <returns>An instance of the <see cref="IDataReader"/> class.</returns>
+		public IDataReader ExecuteReader()
+		{
+			if (_prepared)
+				InitParameters(CommandAction.Select);
+
+			return ExecuteReaderInternal();
+		}
+
+		/// <summary>
+		/// Executes the command and builds an <see cref="IDataReader"/>.
+		/// </summary>
+		/// <param name="commandBehavior">One of the <see cref="CommandBehavior"/> values.</param>
+		/// <returns>An instance of the <see cref="IDataReader"/> class.</returns>
+		public IDataReader ExecuteReader(CommandBehavior commandBehavior)
+		{
+			if (_prepared)
+				InitParameters(CommandAction.Select);
+
+			return ExecuteReaderInternal(commandBehavior);
+		}
+
+		#endregion
+
+		#region ExecuteDataSet
+
+		/// <summary>
+		/// Executes a SQL statement using the provided parameters.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="ExecuteDataSet(NameOrIndexParameter)"/> method
+		/// to find an example.
+		/// </remarks>
+		/// <returns>The <see cref="DataSet"/>.</returns>
+		public DataSet ExecuteDataSet()
+		{
+			return ExecuteDataSet(null, 0, 0, "Table");
+		}
+
+		/// <summary>
+		/// Executes a SQL statement using the provided parameters.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="ExecuteDataSet(NameOrIndexParameter)"/> method
+		/// to find an example.
+		/// </remarks>
+		/// <param name="dataSet">The input <see cref="DataSet"/> object.</param>
+		/// <returns>The <see cref="DataSet"/>.</returns>
+		public DataSet ExecuteDataSet(
+			DataSet dataSet)
+		{
+			return ExecuteDataSet(dataSet, 0, 0, "Table");
+		}
+
+		/// <summary>
+		/// Executes a SQL statement using the provided parameters.
+		/// </summary>
+		/// <remarks>
+		/// See the <see cref="ExecuteDataSet(NameOrIndexParameter)"/> method
+		/// to find an example.
+		/// </remarks>
+		/// <param name="table">The name or index of the populating table.</param>
+		/// <returns>The <see cref="DataSet"/>.</returns>
+		public DataSet ExecuteDataSet(
+			NameOrIndexParameter table)
+		{
+			return ExecuteDataSet(null, 0, 0, table);
+		}
+
+		/// <summary>
+		/// Executes a SQL statement using the provided parameters.
+		/// </summary>
+		/// <param name="dataSet">The <see cref="DataSet"/> object to populate.</param>
+		/// <param name="table">The name or index of the populating table.</param>
+		/// <returns>The <see cref="DataSet"/>.</returns>
+		public DataSet ExecuteDataSet(
+			DataSet              dataSet,
+			NameOrIndexParameter table)
+		{
+			return ExecuteDataSet(dataSet, 0, 0, table);
+		}
+
+		/// <summary>
+		/// Executes a SQL statement using the provided parameters.
+		/// </summary>
+		/// <param name="dataSet">The <see cref="DataSet"/> object to populate.</param>
+		/// <param name="table">The name or index of the populating table.</param>
+		/// <param name="startRecord">The zero-based record number to start with.</param>
+		/// <param name="maxRecords">The maximum number of records to retrieve.</param>
+		/// <returns>The <see cref="DataSet"/>.</returns>
+		public DataSet ExecuteDataSet(
+			DataSet              dataSet,
+			int                  startRecord,
+			int                  maxRecords,
+			NameOrIndexParameter table)
+		{
+			if (_prepared)
+				InitParameters(CommandAction.Select);
+
+			if (dataSet == null)
+				dataSet = new DataSet();
+
+			var da = _dataProvider.CreateDataAdapterObject();
+
+			((IDbDataAdapter)da).SelectCommand = SelectCommand;
+
+			ExecuteOperation(OperationType.Fill, delegate
+			{
+				if (table.ByName)
+					da.Fill(dataSet, startRecord, maxRecords, table.Name);
+				else
+					da.Fill(startRecord, maxRecords, dataSet.Tables[table.Index]);
+			});
+
+			return dataSet;
+		}
+
+		#endregion
+
+		#region ExecuteDataTable
+
+		/// <summary>
+		/// Executes a SQL statement using the provided parameters.
+		/// </summary>
+		/// <returns>The <see cref="DataTable"/>.</returns>
+		public DataTable ExecuteDataTable()
+		{
+			return ExecuteDataTable(null);
+		}
+
+		/// <summary>
+		/// Executes a SQL statement using the provided parameters.
+		/// </summary>
+		/// <param name="dataTable">The <see cref="DataTable"/> object to populate.</param>
+		/// <returns>The <see cref="DataTable"/>.</returns>
+		public DataTable ExecuteDataTable(DataTable dataTable)
+		{
+			if (_prepared)
+				InitParameters(CommandAction.Select);
+
+			if (dataTable == null)
+				dataTable = new DataTable();
+
+			var da = _dataProvider.CreateDataAdapterObject();
+			((IDbDataAdapter)da).SelectCommand = SelectCommand;
+
+			ExecuteOperation(OperationType.Fill, delegate { da.Fill(dataTable); });
+			return dataTable;
+		}
+
+		/// <summary>Adds or refreshes rows in a <see cref="System.Data.DataTable"/>
+		/// to match those in the data source starting at the specified record
+		/// and retrieving up to the specified maximum number of records.
+		/// </summary>
+		/// <param name="startRecord">The zero-based record number to start with.</param>
+		/// <param name="maxRecords">The maximum number of records to retrieve.</param>
+		/// <param name="tableList">The <see cref="System.Data.DataTable"/> objects
+		/// to fill from the data source.</param>
+		public void ExecuteDataTables(
+			int                startRecord,
+			int                maxRecords,
+			params DataTable[] tableList)
+		{
+			if (tableList == null || tableList.Length == 0)
+				return;
+
+			if (_prepared)
+				InitParameters(CommandAction.Select);
+
+			var da = _dataProvider.CreateDataAdapterObject();
+			((IDbDataAdapter)da).SelectCommand = SelectCommand;
+
+			ExecuteOperation(OperationType.Fill, delegate { da.Fill(startRecord, maxRecords, tableList); });
+		}
+
+		/// <summary>Adds or refreshes rows in a <see cref="System.Data.DataTable"/>
+		/// to match those in the data source starting at the specified record
+		/// and retrieving up to the specified maximum number of records.
+		/// </summary>
+		/// <param name="tableList">The <see cref="System.Data.DataTable"/> objects
+		/// to fill from the data source.</param>
+		public void ExecuteDataTables(params DataTable[] tableList)
+		{
+			ExecuteDataTables(0, 0, tableList);
+		}
+
+		#endregion
+
+		#region ExecuteObject
+
+		/// <summary>
+		/// Executes a SQL statement and maps resultset to an object.
+		/// </summary>
+		/// <param name="entity">An object to populate.</param>
+		/// <param name="type">The System.Type of the object.</param>
+		/// <param name="parameters">Additional parameters passed to object constructor through <see cref="InitContext"/>.</param>
+		/// <returns>A business object.</returns>
+		private object ExecuteObjectInternal(object entity, Type type, object[] parameters)
+		{
+			if (_prepared)
+				InitParameters(CommandAction.Select);
+
+			using (var dr = ExecuteReaderInternal(/*CommandBehavior.SingleRow*/)) // Sybase provider does not support this flag.
+				return ExecuteOperation(OperationType.Read, () =>
+				{
+					while (dr.Read())
+						return
+							entity == null
+								? _mappingSchema.MapDataReaderToObject(dr, type, parameters)
+								: _mappingSchema.MapDataReaderToObject(dr, entity, parameters);
+
+					return null;
+				});
+		}
+
+		/// <summary>
+		/// Executes a SQL statement and maps resultset to an object.
+		/// </summary>
+		/// <param name="entity">An object to populate.</param>
+		/// <returns>A business object.</returns>
+		public object ExecuteObject(object entity)
+		{
+			if (null == entity)
+				throw new ArgumentNullException("entity");
+
+			return ExecuteObjectInternal(entity, entity.GetType(), null);
+		}
+
+		/// <summary>
+		/// Executes a SQL statement and maps resultset to an object.
+		/// </summary>
+		/// <param name="entity">An object to populate.</param>
+		/// <param name="parameters">Additional parameters passed to object constructor through <see cref="InitContext"/>.</param>
+		/// <returns>A business object.</returns>
+		public object ExecuteObject(object entity, params object[] parameters)
+		{
+			if (null == entity)
+				throw new ArgumentNullException("entity");
+
+			return ExecuteObjectInternal(entity, entity.GetType(), parameters);
+		}
+
+		/// <summary>
+		/// Executes a SQL statement and maps resultset to an object.
+		/// </summary>
+		/// <param name="type">Type of an object.</param>
+		/// <returns>A business object.</returns>
+		public object ExecuteObject(Type type)
+		{
+			return ExecuteObjectInternal(null, type, null);
+		}
+
+		/// <summary>
+		/// Executes a SQL statement and maps resultset to an object.
+		/// </summary>
+		/// <param name="type">Type of an object.</param>
+		/// <param name="parameters">Additional parameters passed to object constructor through <see cref="InitContext"/>.</param>
+		/// <returns>A business object.</returns>
+		public object ExecuteObject(Type type, params object[] parameters)
+		{
+			return ExecuteObjectInternal(null, type, parameters);
+		}
+
+		/// <summary>
+		/// Executes a SQL statement and maps resultset to an object.
+		/// </summary>
+		/// <typeparam name="T">Type of an object.</typeparam>
+		/// <returns>A business object.</returns>
+		public T ExecuteObject<T>()
+		{
+			return (T)ExecuteObjectInternal(null, typeof(T), null);
+		}
+
+		/// <summary>
+		/// Executes a SQL statement and maps resultset to an object.
+		/// </summary>
+		/// <typeparam name="T">Type of an object.</typeparam>
+		/// <param name="parameters">Additional parameters passed to object constructor through <see cref="InitContext"/>.</param>
+		/// <returns>A business object.</returns>
+		public T ExecuteObject<T>(params object[] parameters)
+		{
+			return (T)ExecuteObjectInternal(null, typeof(T), parameters);
+		}
+
+		#endregion
+
+		#region ExecuteList
+
+		private IList ExecuteListInternal(IList list, Type type, params object[] parameters)
+		{
+			if (list == null)
+				list = new ArrayList();
+
+			if (_prepared)
+				InitParameters(CommandAction.Select);
+
+			using (var dr = ExecuteReaderInternal())
+				//wrap this too, because of PostgreSQL lazy query execution
+				return ExecuteOperation(OperationType.Fill, () => _mappingSchema.MapDataReaderToList(dr, list, type, parameters));
+		}
+
+		private void ExecuteListInternal<T>(IList<T> list, params object[] parameters)
+		{
+			if (list == null)
+				list = new List<T>();
+
+			if (_prepared)
+				InitParameters(CommandAction.Select);
+
+			using (var dr = ExecuteReaderInternal())
+				ExecuteOperation(OperationType.Fill, () => _mappingSchema.MapDataReaderToList(dr, list, parameters));
+		}
+
+		/// <summary>
+		/// Executes the query, and returns an array of business entities using the provided parameters.
+		/// </summary>
+		/// <param name="type">Type of the business object.</param>
+		/// <returns>An array of business objects.</returns>
+		public ArrayList ExecuteList(Type type)
+		{
+			var arrayList = new ArrayList();
+
+			ExecuteListInternal(arrayList, type, null);
+
+			return arrayList;
+		}
+
+		/// <summary>
+		/// Executes the query, and returns an array of business entities.
+		/// </summary>
+		/// <typeparam name="T">Type of an object.</typeparam>
+		/// <returns>Populated list of mapped business objects.</returns>
+		public List<T> ExecuteList<T>()
+		{
+			var list = new List<T>();
+
+			ExecuteListInternal<T>(list, null);
+
+			return list;
+		}
+
+		/// <summary>
+		/// Executes the query, and returns an array of business entities using the provided parameters.
+		/// </summary>
+		/// <param name="type">Type of the business object.</param>
+		/// <param name="parameters">Additional parameters passed to object constructor through <see cref="InitContext"/>.</param>
+		/// <returns>An array of business objects.</returns>
+		public ArrayList ExecuteList(Type type, params object[] parameters)
+		{
+			var arrayList = new ArrayList();
+
+			ExecuteListInternal(arrayList, type, parameters);
+
+			return arrayList;
+		}
+
+		/// <summary>
+		/// Executes the query, and returns an array of business entities.
+		/// </summary>
+		/// <typeparam name="T">Type of an object.</typeparam>
+		/// <param name="parameters">Additional parameters passed to object constructor through <see cref="InitContext"/>.</param>
+		/// <returns>Populated list of mapped business objects.</returns>
+		public List<T> ExecuteList<T>(params object[] parameters)
+		{
+			var list = new List<T>();
+
+			ExecuteListInternal(list, parameters);
+
+			return list;
+		}
+
+		/// <summary>
+		/// Executes the query, and returns an array of business entities.
+		/// </summary>
+		/// <param name="list">The list of mapped business objects to populate.</param>
+		/// <param name="type">Type of an object.</param>
+		/// <returns>Populated list of mapped business objects.</returns>
+		public IList ExecuteList(IList list, Type type)
+		{
+			return ExecuteListInternal(list, type, null);
+		}
+
+		/// <summary>
+		/// Executes the query, and returns an array of business entities.
+		/// </summary>
+		/// <typeparam name="T">Type of an object.</typeparam>
+		/// <param name="list">The list of mapped business objects to populate.</param>
+		/// <returns>Populated list of mapped business objects.</returns>
+		public IList<T> ExecuteList<T>(IList<T> list) 
+		{
+			ExecuteListInternal(list, null);
+
+			return list;
+		}
+
+		/// <summary>
+		/// Executes the query, and returns an array of business entities.
+		/// </summary>
+		/// <param name="list">The list of mapped business objects to populate.</param>
+		/// <param name="type">Type of an object.</param>
+		/// <param name="parameters">Additional parameters passed to object constructor through <see cref="InitContext"/>.</param>
+		/// <returns>Populated list of mapped business objects.</returns>
+		public IList ExecuteList(IList list, Type type, params object[] parameters)
+		{
+			return ExecuteListInternal(list, type, parameters);
+		}
+
+		/// <summary>
+		/// Executes the query, and returns an array of business entities.
+		/// </summary>
+		/// <typeparam name="T">Type of an object.</typeparam>
+		/// <param name="list">The list of mapped business objects to populate.</param>
+		/// <param name="parameters">Additional parameters passed to object constructor through <see cref="InitContext"/>.</param>
+		/// <returns>Populated list of mapped business objects.</returns>
+		public IList<T> ExecuteList<T>(IList<T> list, params object[] parameters)
+		{
+			ExecuteListInternal(list, parameters);
+
+			return list;
+		}
+
+		/// <summary>
+		/// Executes the query, and returns an array of business entities.
+		/// </summary>
+		/// <typeparam name="TList">Type of a list.</typeparam>
+		/// <typeparam name="T">Type of an object.</typeparam>
+		/// <param name="list">The list of mapped business objects to populate.</param>
+		/// <param name="parameters">Additional parameters passed to object constructor through <see cref="InitContext"/>.</param>
+		/// <returns>Populated list of mapped business objects.</returns>
+		public TList ExecuteList<TList,T>(TList list, params object[] parameters)
+			where TList : IList<T>
+		{
+			ExecuteListInternal(list, typeof(T), parameters);
+
+			return list;
+		}
+
+		/// <summary>
+		/// Executes the query, and returns an array of business entities.
+		/// </summary>
+		/// <typeparam name="TList">Type of a list.</typeparam>
+		/// <typeparam name="T">Type of an object.</typeparam>
+		/// <param name="parameters">Additional parameters passed to object constructor through <see cref="InitContext"/>.</param>
+		/// <returns>Populated list of mapped business objects.</returns>
+		public TList ExecuteList<TList,T>(params object[] parameters)
+			where TList : IList<T>, new()
+		{
+			var list = new TList();
+
+			ExecuteListInternal(list, typeof(T), parameters);
+
+			return list;
+		}
+
+		#endregion
+
+		#region ExecuteDictionary
+
+		/// <summary>
+		/// Executes the query, and returns the <see cref="Hashtable"/> of business entities 
+		/// using the provided parameters.
+		/// </summary>
+		/// <include file="Examples.xml" path='examples/db[@name="ExecuteDictionary(string,Type)"]/*' />
+		/// <param name="keyField">The field name or index that is used as a key to populate <see cref="Hashtable"/>.</param>
+		/// <param name="keyFieldType">Business object type.</param>
+		/// <param name="parameters">Any additional parameters passed to the constructor with <see cref="InitContext"/> parameter.</param>
+		/// <returns>An instance of the <see cref="Hashtable"/> class.</returns>
+		public Hashtable ExecuteDictionary(
+			NameOrIndexParameter keyField,
+			Type                 keyFieldType,
+			params object[]      parameters)
+		{
+			var hash = new Hashtable();
+
+			ExecuteDictionary(hash, keyField, keyFieldType, parameters);
+
+			return hash;
+		}
+
+		/// <summary>
+		/// Executes the query, and returns the <see cref="Hashtable"/> of business entities.
+		/// </summary>
+		/// <include file="Examples.xml" path='examples/db[@name="ExecuteDictionary(Hashtable,string,Type)"]/*' />
+		/// <param name="dictionary">A dictionary of mapped business objects to populate.</param>
+		/// <param name="keyField">The field name or index that is used as a key to populate <see cref="IDictionary"/>.</param>
+		/// <param name="type">Business object type.</param>
+		/// <param name="parameters">Any additional parameters passed to the constructor with <see cref="InitContext"/> parameter.</param>
+		/// <returns>An instance of the <see cref="IDictionary"/>.</returns>
+		public IDictionary ExecuteDictionary(
+			IDictionary          dictionary,
+			NameOrIndexParameter keyField,
+			Type                 type,
+			params object[]      parameters)
+		{
+			if (dictionary == null)
+				dictionary = new Hashtable();
+
+			if (_prepared)
+				InitParameters(CommandAction.Select);
+
+			using (var dr = ExecuteReaderInternal())
+				return _mappingSchema.MapDataReaderToDictionary(dr, dictionary, keyField, type, parameters);
+		}
+
+		/// <summary>
+		/// Executes the query, and returns a dictionary of business entities.
+		/// </summary>
+		/// <typeparam name="TKey">Key's type.</typeparam>
+		/// <typeparam name="TValue">Value's type.</typeparam>
+		/// <param name="keyField">The field name or index that is used as a key to populate the dictionary.</param>
+		/// <param name="parameters">Any additional parameters passed to the constructor with <see cref="InitContext"/> parameter.</param>
+		/// <returns>An instance of the dictionary.</returns>
+		public Dictionary<TKey, TValue> ExecuteDictionary<TKey, TValue>(
+			NameOrIndexParameter keyField,
+			params object[]      parameters)
+		{
+			var dictionary = new Dictionary<TKey, TValue>();
+
+			ExecuteDictionary<TKey, TValue>(dictionary, keyField, typeof(TValue), parameters);
+
+			return dictionary;
+		}
+
+		/// <summary>
+		/// Executes the query, and returns the <see cref="Hashtable"/> of business entities.
+		/// </summary>
+		/// <param name="dictionary">A dictionary of mapped business objects to populate.</param>
+		/// <param name="keyField">The field name or index that is used as a key to populate <see cref="IDictionary"/>.</param>
+		/// <param name="parameters">Any additional parameters passed to the constructor with <see cref="InitContext"/> parameter.</param>
+		/// <returns>An instance of the <see cref="IDictionary"/>.</returns>
+		public IDictionary<TKey, TValue> ExecuteDictionary<TKey, TValue>(
+			IDictionary<TKey, TValue> dictionary,
+			NameOrIndexParameter      keyField,
+			params object[]           parameters)
+		{
+			return ExecuteDictionary(dictionary, keyField, typeof(TValue), parameters);
+		}
+
+		/// <summary>
+		/// Executes the query, and returns the <see cref="Hashtable"/> of business entities.
+		/// </summary>
+		/// <param name="dictionary">A dictionary of mapped business objects to populate.</param>
+		/// <param name="keyField">The field name or index that is used as a key to populate <see cref="IDictionary"/>.</param>
+		/// <param name="destObjectType">Business object type.</param>
+		/// <param name="parameters">Any additional parameters passed to the constructor with <see cref="InitContext"/> parameter.</param>
+		/// <returns>An instance of the <see cref="IDictionary"/>.</returns>
+		public IDictionary<TKey, TValue> ExecuteDictionary<TKey, TValue>(
+			IDictionary<TKey, TValue> dictionary,
+			NameOrIndexParameter      keyField,
+			Type                      destObjectType,
+			params object[]           parameters)
+		{
+			if (dictionary == null)
+				dictionary = new Dictionary<TKey, TValue>();
+
+			if (_prepared)
+				InitParameters(CommandAction.Select);
+
+			using (var dr = ExecuteReaderInternal())
+				return _mappingSchema.MapDataReaderToDictionary(
+					dr, dictionary, keyField, destObjectType, parameters);
+		}
+
+		#endregion
+
+		#region ExecuteDictionary (Index)
+
+		/// <summary>
+		/// Executes the query, and returns the <see cref="Hashtable"/> of business entities 
+		/// using the provided parameters.
+		/// </summary>
+		/// <include file="Examples.xml" path='examples/db[@name="ExecuteDictionary(string,Type)"]/*' />
+		/// <param name="index">Dictionary key fields.</param>
+		/// <param name="type">Business object type.</param>
+		/// <param name="parameters">Any additional parameters passed to the constructor with <see cref="InitContext"/> parameter.</param>
+		/// <returns>An instance of the <see cref="Hashtable"/> class.</returns>
+		public Hashtable ExecuteDictionary(
+			MapIndex        index,
+			Type            type,
+			params object[] parameters)
+		{
+			var hash = new Hashtable();
+
+			ExecuteDictionary(hash, index, type, parameters);
+
+			return hash;
+		}
+
+		/// <summary>
+		/// Executes the query, and returns the <see cref="Hashtable"/> of business entities.
+		/// </summary>
+		/// <include file="Examples.xml" path='examples/db[@name="ExecuteDictionary(Hashtable,string,Type)"]/*' />
+		/// <param name="dictionary">A dictionary of mapped business objects to populate.</param>
+		/// <param name="index">Dictionary key fields.</param>
+		/// <param name="type">Business object type.</param>
+		/// <param name="parameters">Any additional parameters passed to the constructor with <see cref="InitContext"/> parameter.</param>
+		/// <returns>An instance of the <see cref="IDictionary"/>.</returns>
+		public IDictionary ExecuteDictionary(
+			IDictionary     dictionary,
+			MapIndex        index,
+			Type            type,
+			params object[] parameters)
+		{
+			if (dictionary == null)
+				dictionary = new Hashtable();
+
+			if (_prepared)
+				InitParameters(CommandAction.Select);
+
+			using (var dr = ExecuteReaderInternal())
+				return _mappingSchema.MapDataReaderToDictionary(dr, dictionary, index, type, parameters);
+		}
+
+		/// <summary>
+		/// Executes the query, and returns a dictionary of business entities.
+		/// </summary>
+		/// <typeparam name="TValue">Value's type.</typeparam>
+		/// <param name="index">Dictionary key fields.</param>
+		/// <param name="parameters">Any additional parameters passed to the constructor with <see cref="InitContext"/> parameter.</param>
+		/// <returns>An instance of the dictionary.</returns>
+		public Dictionary<CompoundValue, TValue> ExecuteDictionary<TValue>(
+			MapIndex        index,
+			params object[] parameters)
+		{
+			var dictionary = new Dictionary<CompoundValue, TValue>();
+
+			ExecuteDictionary<TValue>(dictionary, index, typeof(TValue), parameters);
+
+			return dictionary;
+		}
+
+		/// <summary>
+		/// Executes the query, and returns a dictionary of business entities.
+		/// </summary>
+		/// <typeparam name="TValue">Value's type.</typeparam>
+		/// <param name="dictionary">A dictionary of mapped business objects to populate.</param>
+		/// <param name="index">Dictionary key fields.</param>
+		/// <param name="parameters">Any additional parameters passed to the constructor with <see cref="InitContext"/> parameter.</param>
+		/// <returns>An instance of the dictionary.</returns>
+		public IDictionary<CompoundValue, TValue> ExecuteDictionary<TValue>(
+			IDictionary<CompoundValue, TValue> dictionary,
+			MapIndex                           index,
+			params object[]                    parameters)
+		{
+			return ExecuteDictionary(dictionary, index, typeof(TValue), parameters);
+		}
+
+		/// <summary>
+		/// Executes the query, and returns a dictionary of business entities.
+		/// </summary>
+		/// <typeparam name="TValue">Value's type.</typeparam>
+		/// <param name="dictionary">A dictionary of mapped business objects to populate.</param>
+		/// <param name="index">Dictionary key fields.</param>
+		/// <param name="destObjectType">Business object type.</param>
+		/// <param name="parameters">Any additional parameters passed to the constructor with <see cref="InitContext"/> parameter.</param>
+		/// <returns>An instance of the dictionary.</returns>
+		public IDictionary<CompoundValue, TValue> ExecuteDictionary<TValue>(
+			IDictionary<CompoundValue, TValue> dictionary,
+			MapIndex                           index,
+			Type                               destObjectType,
+			params object[]                    parameters)
+		{
+			if (dictionary == null)
+				dictionary = new Dictionary<CompoundValue, TValue>();
+
+			if (_prepared)
+				InitParameters(CommandAction.Select);
+
+			using (var dr = ExecuteReaderInternal())
+				return _mappingSchema.MapDataReaderToDictionary(
+					dr, dictionary, index, destObjectType, parameters);
+		}
+
+		#endregion
+
+		#region ExecuteResultSet
+
+		/// <summary>
+		/// Executes the query, and returns multiple results.
+		/// </summary>
+		/// <param name="resultSets">Array of <see cref="MapResultSet"/> to populate.</param>
+		/// <returns>The populated <see cref="MapResultSet"/>.</returns>
+		public MapResultSet[] ExecuteResultSet(params MapResultSet[] resultSets)
+		{
+			if (_prepared)
+				InitParameters(CommandAction.Select);
+
+			using (var dr = ExecuteReaderInternal())
+				_mappingSchema.MapDataReaderToResultSet(dr, resultSets);
+
+			return resultSets;
+		}
+
+		/// <summary>
+		/// Executes the query, and returns multiple results.
+		/// </summary>
+		/// <param name="masterType">The type of the master business object.</param>
+		/// <param name="nextResults">Array of <see cref="MapNextResult"/> to populate.</param>
+		/// <returns>The populated <see cref="MapResultSet"/>.</returns>
+		public MapResultSet[] ExecuteResultSet(
+			Type masterType, params MapNextResult[] nextResults)
+		{
+			return ExecuteResultSet(_mappingSchema.ConvertToResultSet(masterType, nextResults));
+		}
+
+		/// <summary>
+		/// Executes the query, and returns multiple results.
+		/// </summary>
+		/// <typeparam name="T">The type of the master business object.</typeparam>
+		/// <param name="nextResults">Array of <see cref="MapNextResult"/> to populate.</param>
+		/// <returns>The populated <see cref="MapResultSet"/>.</returns>
+		public MapResultSet[] ExecuteResultSet<T>(params MapNextResult[] nextResults)
+		{
+			return ExecuteResultSet(_mappingSchema.ConvertToResultSet(typeof(T), nextResults));
+		}
+
+		#endregion
+
+		#region Update
+
+		private DbDataAdapter CreateDataAdapter()
+		{
+			var da = _dataProvider.CreateDataAdapterObject();
+
+			if (_insertCommand != null) ((IDbDataAdapter)da).InsertCommand = InsertCommand;
+			if (_updateCommand != null) ((IDbDataAdapter)da).UpdateCommand = UpdateCommand;
+			if (_deleteCommand != null) ((IDbDataAdapter)da).DeleteCommand = DeleteCommand;
+
+			return da;
+		}
+
+		/// <summary>
+		/// Calls the corresponding INSERT, UPDATE, or DELETE statements for each inserted, updated, or 
+		/// deleted row in the specified <see cref="DataSet"/>.
+		/// </summary>
+		/// <param name="dataSet">The <see cref="DataSet"/> used to update the data source.</param>
+		/// <returns>The number of rows successfully updated from the <see cref="DataSet"/>.</returns>
+		public int Update(DataSet dataSet)
+		{
+			return Update(dataSet, "Table");
+		}
+
+		/// <summary>
+		/// Calls the corresponding INSERT, UPDATE, or DELETE statements for each inserted, updated, or 
+		/// deleted row in the <see cref="DataSet"/> with the specified <see cref="DataTable"/> name.
+		/// </summary>
+		/// <param name="dataSet">The <see cref="DataSet"/> used to update the data source.</param>
+		/// <param name="table">The name or index of the source table to use for table mapping.</param>
+		/// <returns>The number of rows successfully updated from the <see cref="DataSet"/>.</returns>
+		public int Update(
+			DataSet              dataSet,
+			NameOrIndexParameter table)
+		{
+			if (dataSet == null)
+				throw new ArgumentNullException(
+					"dataSet", Resources.DbManager_CannotUpdateNullDataset);
+
+			var da = CreateDataAdapter();
+
+			return
+				ExecuteOperation(
+					OperationType.Update,
+					() =>
+						(table.ByName)
+							? da.Update(dataSet, table.Name)
+							: da.Update(dataSet.Tables[table.Index]));
+		}
+
+		/// <summary>
+		/// Calls the corresponding INSERT, UPDATE, or DELETE statements for
+		/// each inserted, updated, or deleted row in the specified
+		/// <see cref="DataTable"/>.
+		/// </summary>
+		/// <param name="dataTable">The name or index of the source table to
+		/// use for table mapping.</param>
+		/// <returns>The number of rows successfully updated from the
+		/// <see cref="DataTable"/>.</returns>
+		public int Update(DataTable dataTable)
+		{
+			if (dataTable == null)
+				throw new ArgumentNullException(
+					"dataTable", Resources.DbManager_CannotUpdateNullDataTable);
+
+			return
+				ExecuteOperation(
+					OperationType.Update,
+					() => CreateDataAdapter().Update(dataTable));
+		}
+
+		#endregion
+
+		#region ExecuteOperation
+
+		private void ExecuteOperation(OperationType operationType, Action operation)
+		{
+			try
+			{
+				OnBeforeOperation(operationType);
+				operation();
+				OnAfterOperation (operationType);
+			}
+			catch (Exception ex)
+			{
+				HandleOperationException(operationType, ex);
+				throw;
+			}
+		}
+
+		private T ExecuteOperation<T>(OperationType operationType, Func<T> operation)
+		{
+			var res = default(T);
+
+			try
+			{
+				OnBeforeOperation(operationType);
+				res = operation();
+				OnAfterOperation (operationType);
+			}
+			catch (Exception ex)
+			{
+				if (res is IDisposable)
+					((IDisposable)res).Dispose();
+
+				HandleOperationException(operationType, ex);
+				throw;
+			}
+
+			return res;
+		}
+
+		private void HandleOperationException(OperationType op, Exception ex)
+		{
+			var dex = new DataException(this, ex);
+
+			if (TraceSwitch.TraceError)
+				WriteTraceLine(string.Format("Operation '{0}' throws exception '{1}'", op, dex), TraceSwitch.DisplayName);
+
+			OnOperationException(op, dex);
+		}
+
+		#endregion
+
+		#region IDisposable interface
+
+		/// <summary>
+		/// Releases the unmanaged resources used by the <see cref="DbManager"/> and 
+		/// optionally releases the managed resources.
+		/// </summary>
+		/// <remarks>
+		/// This method is called by the public <see cref="IDisposable.Dispose()"/> method 
+		/// and the Finalize method.
+		/// </remarks>
+		/// <param name="disposing"><b>true</b> to release both managed and unmanaged resources; <b>false</b> to release only unmanaged resources.</param>
+		protected override void Dispose(bool disposing)
+		{
+			if (disposing)
+				Close();
+
+			base.Dispose(disposing);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/IDataReaderEx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+using System;
+
+namespace BLToolkit.Data
+{
+	public interface IDataReaderEx
+	{
+		DateTimeOffset GetDateTimeOffset(int i);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/IDbConnectionFactory.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,7 @@
+namespace BLToolkit.Data
+{
+    public interface IDbConnectionFactory
+    {
+        DbManager CreateDbManager();
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/InitCommandEventArgs.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,21 @@
+using System;
+using System.Data;
+
+namespace BLToolkit.Data
+{
+	public delegate void InitCommandEventHandler(object sender, InitCommandEventArgs ea);
+
+	public class InitCommandEventArgs : EventArgs
+	{
+		private readonly IDbCommand _command;
+		public           IDbCommand  Command
+		{
+			get { return _command; }
+		}
+
+		public InitCommandEventArgs(IDbCommand command)
+		{
+			_command = command;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/AggregationBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,168 @@
+using System;
+using System.Linq;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+	using Data.Sql;
+	using Reflection;
+
+	class AggregationBuilder : MethodCallBuilder
+	{
+		public static string[] MethodNames = new[] { "Average", "Min", "Max", "Sum" };
+
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			return methodCall.IsQueryable(MethodNames);
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
+
+			if (sequence.SqlQuery.Select.IsDistinct        ||
+			    sequence.SqlQuery.Select.TakeValue != null ||
+			    sequence.SqlQuery.Select.SkipValue != null ||
+			   !sequence.SqlQuery.GroupBy.IsEmpty)
+			{
+				sequence = new SubQueryContext(sequence);
+			}
+
+			if (!sequence.SqlQuery.OrderBy.IsEmpty)
+			{
+				if (sequence.SqlQuery.Select.TakeValue == null && sequence.SqlQuery.Select.SkipValue == null)
+					sequence.SqlQuery.OrderBy.Items.Clear();
+				else
+					sequence = new SubQueryContext(sequence);
+			}
+
+			var context = new AggregationContext(buildInfo.Parent, sequence, methodCall);
+			var sql     = sequence.ConvertToSql(null, 0, ConvertFlags.Field).Select(_ => _.Sql).ToArray();
+
+			if (sql.Length == 1 && sql[0] is SqlQuery)
+			{
+				var query = (SqlQuery)sql[0];
+
+				if (query.Select.Columns.Count == 1)
+				{
+					var join = SqlQuery.OuterApply(query);
+					context.SqlQuery.From.Tables[0].Joins.Add(join.JoinedTable);
+					sql[0] = query.Select.Columns[0];
+				}
+			}
+
+			context.Sql        = context.SqlQuery;
+			context.FieldIndex = context.SqlQuery.Select.Add(
+				new SqlFunction(methodCall.Type, methodCall.Method.Name, sql));
+
+			return context;
+		}
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			return null;
+		}
+
+		class AggregationContext : SequenceContextBase
+		{
+			public AggregationContext(IBuildContext parent, IBuildContext sequence, MethodCallExpression methodCall)
+				: base(parent, sequence, null)
+			{
+				_returnType = methodCall.Method.ReturnType;
+				_methodName = methodCall.Method.Name;
+			}
+
+			readonly string _methodName;
+			readonly Type   _returnType;
+			private  SqlInfo[] _index;
+
+			public int            FieldIndex;
+			public ISqlExpression Sql;
+
+			static object CheckNullValue(object value, object context)
+			{
+				if (value == null || value is DBNull)
+					throw new InvalidOperationException(string.Format("Function {0} returns non-nullable value, but result is NULL. Use nullable version of the function instead.", context));
+
+				return value;
+			}
+
+			public override void BuildQuery<T>(Query<T> query, ParameterExpression queryParameter)
+			{
+				var expr   = BuildExpression(FieldIndex);
+				var mapper = Builder.BuildMapper<object>(expr);
+
+				query.SetElementQuery(mapper.Compile());
+			}
+
+			public override Expression BuildExpression(Expression expression, int level)
+			{
+				return BuildExpression(ConvertToIndex(expression, level, ConvertFlags.Field)[0].Index);
+			}
+
+			Expression BuildExpression(int fieldIndex)
+			{
+				Expression expr;
+
+				if (_returnType.IsClass || _methodName == "Sum" || TypeHelper.IsNullableType(_returnType))
+				{
+					expr = Builder.BuildSql(_returnType, fieldIndex);
+				}
+				else
+				{
+					expr = Builder.BuildSql(
+						_returnType,
+						fieldIndex, 
+						ReflectionHelper.Expressor<object>.MethodExpressor(o => CheckNullValue(o, o)),
+						Expression.Constant(_methodName));
+				}
+
+				return expr;
+			}
+
+			public override SqlInfo[] ConvertToSql(Expression expression, int level, ConvertFlags flags)
+			{
+				switch (flags)
+				{
+					case ConvertFlags.All   :
+					case ConvertFlags.Key   :
+					case ConvertFlags.Field : return Sequence.ConvertToSql(expression, level + 1, flags);
+				}
+
+				throw new InvalidOperationException();
+			}
+
+			public override SqlInfo[] ConvertToIndex(Expression expression, int level, ConvertFlags flags)
+			{
+				switch (flags)
+				{
+					case ConvertFlags.Field :
+						return _index ?? (_index = new[]
+						{
+							new SqlInfo { Query = Parent.SqlQuery, Index = Parent.SqlQuery.Select.Add(Sql), Sql = Sql, }
+						});
+				}
+
+				throw new InvalidOperationException();
+			}
+
+			public override IsExpressionResult IsExpression(Expression expression, int level, RequestFor requestFlag)
+			{
+				switch (requestFlag)
+				{
+					case RequestFor.Root       : return new IsExpressionResult(Lambda != null && expression == Lambda.Parameters[0]);
+					case RequestFor.Expression : return IsExpressionResult.True;
+				}
+
+				return IsExpressionResult.False;
+			}
+
+			public override IBuildContext GetContext(Expression expression, int level, BuildInfo buildInfo)
+			{
+				throw new InvalidOperationException();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/AllAnyBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,161 @@
+using System;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+	using Data.Sql;
+
+	class AllAnyBuilder : MethodCallBuilder
+	{
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			return methodCall.IsQueryable("All", "Any");
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]) { CopyTable = true });
+
+			if (methodCall.Arguments.Count == 2)
+			{
+				var condition = (LambdaExpression)methodCall.Arguments[1].Unwrap();
+
+				if (methodCall.Method.Name == "All")
+#if FW4 || SILVERLIGHT
+					condition = Expression.Lambda(Expression.Not(condition.Body), condition.Name, condition.Parameters);
+#else
+					condition = Expression.Lambda(Expression.Not(condition.Body), condition.Parameters.ToArray());
+#endif
+
+				sequence = builder.BuildWhere(buildInfo.Parent, sequence, condition, true);
+				sequence.SetAlias(condition.Parameters[0].Name);
+			}
+
+			return new AllAnyContext(buildInfo.Parent, methodCall, sequence);
+		}
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			if (methodCall.Arguments.Count == 2)
+			{
+				var predicate = (LambdaExpression)methodCall.Arguments[1].Unwrap();
+				var info      = builder.ConvertSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]), predicate.Parameters[0]);
+
+				if (info != null)
+				{
+					info.Expression = methodCall.Convert(ex => ConvertMethod(methodCall, 0, info, predicate.Parameters[0], ex));
+					info.Parameter  = param;
+
+					return info;
+				}
+			}
+			else
+			{
+				var info = builder.ConvertSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]), null);
+
+				if (info != null)
+				{
+					info.Expression = methodCall.Convert(ex => ConvertMethod(methodCall, 0, info, null, ex));
+					info.Parameter  = param;
+
+					return info;
+				}
+			}
+
+			return null;
+		}
+
+		class AllAnyContext : SequenceContextBase
+		{
+			readonly MethodCallExpression _methodCall;
+
+			public AllAnyContext(IBuildContext parent, MethodCallExpression methodCall, IBuildContext sequence)
+				: base(parent, sequence, null)
+			{
+				_methodCall = methodCall;
+			}
+
+			public override void BuildQuery<T>(Query<T> query, ParameterExpression queryParameter)
+			{
+				var sql = GetSubQuery(null);
+
+				query.Queries[0].SqlQuery = new SqlQuery();
+				query.Queries[0].SqlQuery.Select.Add(sql);
+
+				var expr   = Builder.BuildSql(typeof(bool), 0);
+				var mapper = Builder.BuildMapper<object>(expr);
+
+				query.SetElementQuery(mapper.Compile());
+			}
+
+			public override Expression BuildExpression(Expression expression, int level)
+			{
+				var idx = ConvertToIndex(expression, level, ConvertFlags.Field);
+				return Builder.BuildSql(typeof(bool), idx[0].Index);
+			}
+
+			public override SqlInfo[] ConvertToSql(Expression expression, int level, ConvertFlags flags)
+			{
+				if (expression == null)
+				{
+					var sql   = GetSubQuery(null);
+					var query = SqlQuery;
+
+					if (Parent != null)
+						query = Parent.SqlQuery;
+
+					return new[] { new SqlInfo { Query = query, Sql = sql } };
+				}
+
+				throw new InvalidOperationException();
+			}
+
+			public override SqlInfo[] ConvertToIndex(Expression expression, int level, ConvertFlags flags)
+			{
+				var sql = ConvertToSql(expression, level, flags);
+
+				if (sql[0].Index < 0)
+					sql[0].Index = sql[0].Query.Select.Add(sql[0].Sql);
+
+				return sql;
+			}
+
+			public override IsExpressionResult IsExpression(Expression expression, int level, RequestFor requestFlag)
+			{
+				if (expression == null)
+				{
+					switch (requestFlag)
+					{
+						case RequestFor.Expression :
+						case RequestFor.Field      : return IsExpressionResult.False;
+					}
+				}
+
+				throw new InvalidOperationException();
+			}
+
+			public override IBuildContext GetContext(Expression expression, int level, BuildInfo buildInfo)
+			{
+				throw new InvalidOperationException();
+			}
+
+			ISqlExpression _subQuerySql;
+
+			public override ISqlExpression GetSubQuery(IBuildContext context)
+			{
+				if (_subQuerySql == null)
+				{
+					var cond = new SqlQuery.Condition(
+						_methodCall.Method.Name == "All",
+						new SqlQuery.Predicate.FuncLike(SqlFunction.CreateExists(SqlQuery)));
+
+					_subQuerySql = new SqlQuery.SearchCondition(cond);
+				}
+
+				return _subQuerySql;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/AsUpdatableBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,26 @@
+using System;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+
+	class AsUpdatableBuilder : MethodCallBuilder
+	{
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			return methodCall.IsQueryable("AsUpdatable");
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			return builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
+		}
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			return null;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/BuildInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,50 @@
+using System;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using Data.Sql;
+
+	public class BuildInfo
+	{
+		public BuildInfo(IBuildContext parent, Expression expression, SqlQuery sqlQuery)
+		{
+			Parent     = parent;
+			Expression = expression;
+			SqlQuery   = sqlQuery;
+		}
+
+		public BuildInfo(BuildInfo buildInfo, Expression expression)
+			: this(buildInfo.Parent, expression, buildInfo.SqlQuery)
+		{
+			SequenceInfo = buildInfo;
+		}
+
+		public BuildInfo(BuildInfo buildInfo, Expression expression, SqlQuery sqlQuery)
+			: this(buildInfo.Parent, expression, sqlQuery)
+		{
+			SequenceInfo = buildInfo;
+		}
+
+		public BuildInfo     SequenceInfo { get; set; }
+		public IBuildContext Parent       { get; set; }
+		public Expression    Expression   { get; set; }
+		public SqlQuery      SqlQuery     { get; set; }
+		public bool          CopyTable    { get; set; }
+
+		public bool          IsSubQuery   { get { return Parent != null; } }
+
+		private bool _isAssociationBuilt;
+		public  bool  IsAssociationBuilt
+		{
+			get { return _isAssociationBuilt; }
+			set
+			{
+				_isAssociationBuilt = value;
+
+				if (SequenceInfo != null)
+					SequenceInfo.IsAssociationBuilt = value;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/CastBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,59 @@
+using System;
+using System.Data;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+
+	class CastBuilder : MethodCallBuilder
+	{
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			return methodCall.IsQueryable("Cast");
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
+
+			return new CastContext(sequence, methodCall);
+		}
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			return null;
+		}
+
+		class CastContext : PassThroughContext
+		{
+			public CastContext(IBuildContext context, MethodCallExpression methodCall)
+				: base(context)
+			{
+				_methodCall = methodCall;
+			}
+
+			private readonly MethodCallExpression _methodCall;
+
+			public override void BuildQuery<T>(Query<T> query, ParameterExpression queryParameter)
+			{
+				var expr   = BuildExpression(null, 0);
+				var mapper = Builder.BuildMapper<T>(expr);
+
+				query.SetQuery(mapper.Compile());
+			}
+
+			public override Expression BuildExpression(Expression expression, int level)
+			{
+				var expr = base.BuildExpression(expression, level);
+				var type = _methodCall.Method.GetGenericArguments()[0];
+
+				if (expr.Type != type)
+					expr = Expression.Convert(expr, type);
+
+				return expr;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/ChangeTypeExpression.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,40 @@
+using System;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	class ChangeTypeExpression : Expression
+	{
+		public const int ChangeTypeType = 1000;
+
+#if FW4 || SILVERLIGHT
+
+		public ChangeTypeExpression(Expression expression, Type type)
+		{
+			Expression = expression;
+			_type       = type;
+		}
+
+		readonly Type _type;
+
+		public override   Type           Type     { get { return _type;                          } }
+		public override   ExpressionType NodeType { get { return (ExpressionType)ChangeTypeType; } }
+
+#else
+
+		public ChangeTypeExpression(Expression expression, Type type)
+			: base((ExpressionType)ChangeTypeType, type)
+		{
+			Expression = expression;
+		}
+
+#endif
+
+		public Expression Expression { get; private set; }
+
+		public override string ToString()
+		{
+			return "(" + Type + ")" + Expression;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/ConcatUnionBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,340 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+	using Data.Sql;
+	using Reflection;
+
+	class ConcatUnionBuilder : MethodCallBuilder
+	{
+		#region Builder
+
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			return methodCall.Arguments.Count == 2 && methodCall.IsQueryable("Concat", "Union");
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			var sequence1 = new SubQueryContext(builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0])));
+			var sequence2 = new SubQueryContext(builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[1], new SqlQuery())));
+			var union     = new SqlQuery.Union(sequence2.SqlQuery, methodCall.Method.Name == "Concat");
+
+			sequence1.SqlQuery.Unions.Add(union);
+
+			return new UnionContext(sequence1, sequence2, methodCall);
+		}
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			return null;
+		}
+
+		#endregion
+
+		#region Context
+
+		sealed class UnionContext : SubQueryContext
+		{
+			public UnionContext(SubQueryContext sequence1, SubQueryContext sequence2, MethodCallExpression methodCall)
+				: base(sequence1)
+			{
+				_methodCall = methodCall;
+
+				_isObject =
+					sequence1.IsExpression(null, 0, RequestFor.Object).Result ||
+					sequence2.IsExpression(null, 0, RequestFor.Object).Result;
+
+				if (_isObject)
+				{
+					var type = _methodCall.Method.GetGenericArguments()[0];
+					_unionParameter = Expression.Parameter(type, "t");
+				}
+
+				Init(sequence1, sequence2);
+			}
+
+			readonly bool                          _isObject;
+			readonly MethodCallExpression          _methodCall;
+			readonly ParameterExpression           _unionParameter;
+			readonly Dictionary<MemberInfo,Member> _members = new Dictionary<MemberInfo,Member>(new MemberInfoComparer());
+
+			class Member
+			{
+				public SqlInfo          SequenceInfo;
+				public SqlInfo          SqlQueryInfo;
+				public MemberExpression MemberExpression;
+			}
+
+			class UnionMember
+			{
+				public Member  Member;
+				public SqlInfo Info1;
+				public SqlInfo Info2;
+			}
+
+			void Init(SubQueryContext sequence1, SubQueryContext sequence2)
+			{
+				var info1 = sequence1.ConvertToIndex(null, 0, ConvertFlags.All).ToList();
+				var info2 = sequence2.ConvertToIndex(null, 0, ConvertFlags.All).ToList();
+
+				if (!_isObject)
+					return;
+
+				var members = new List<UnionMember>();
+
+				foreach (var info in info1)
+				{
+					if (info.Members.Count == 0)
+						throw new InvalidOperationException();
+
+					var member = new Member
+					{
+						SequenceInfo     = info,
+						MemberExpression = Expression.MakeMemberAccess(_unionParameter, info.Members[0])
+					};
+
+					members.Add(new UnionMember { Member = member, Info1 = info });
+				}
+
+				foreach (var info in info2)
+				{
+					if (info.Members.Count == 0)
+						throw new InvalidOperationException();
+
+					var em = members.FirstOrDefault(m =>
+						m.Member.SequenceInfo != null &&
+						m.Member.SequenceInfo.CompareLastMember(info));
+
+					if (em == null)
+					{
+						var member = new Member { MemberExpression = Expression.MakeMemberAccess(_unionParameter, info.Members[0]) };
+
+						if (sequence2.IsExpression(member.MemberExpression, 1, RequestFor.Object).Result)
+							throw new LinqException("Types in {0} are constructed incompatibly.", _methodCall.Method.Name);
+
+						members.Add(new UnionMember { Member = member, Info2 = info });
+					}
+					else
+					{
+						em.Info2 = info;
+					}
+				}
+
+				sequence1.SqlQuery.Select.Columns.Clear();
+				sequence2.SqlQuery.Select.Columns.Clear();
+
+				for (var i = 0; i < members.Count; i++)
+				{
+					var member = members[i];
+
+					if (member.Info1 == null)
+					{
+						member.Info1 = new SqlInfo(member.Info2.Members)
+						{
+							Sql   = new SqlValue(null),
+							Query = sequence1.SqlQuery,
+						};
+
+						member.Member.SequenceInfo = member.Info1;
+					}
+
+					if (member.Info2 == null)
+					{
+						member.Info2 = new SqlInfo(member.Info1.Members)
+						{
+							Sql   = new SqlValue(null),
+							Query = sequence2.SqlQuery,
+						};
+					}
+
+					sequence1.SqlQuery.Select.Columns.Add(new SqlQuery.Column(sequence1.SqlQuery, member.Info1.Sql));
+					sequence2.SqlQuery.Select.Columns.Add(new SqlQuery.Column(sequence2.SqlQuery, member.Info2.Sql));
+
+					member.Member.SequenceInfo.Index = i;
+
+					_members[member.Member.MemberExpression.Member] = member.Member;
+				}
+
+				foreach (var key in sequence1.ColumnIndexes.Keys.ToList())
+					sequence1.ColumnIndexes[key] = sequence1.SqlQuery.Select.Add(key);
+
+				foreach (var key in sequence2.ColumnIndexes.Keys.ToList())
+					sequence2.ColumnIndexes[key] = sequence2.SqlQuery.Select.Add(key);
+			}
+
+			public override void BuildQuery<T>(Query<T> query, ParameterExpression queryParameter)
+			{
+				var expr   = BuildExpression(null, 0);
+				var mapper = Builder.BuildMapper<T>(expr);
+
+				query.SetQuery(mapper.Compile());
+			}
+
+			public override Expression BuildExpression(Expression expression, int level)
+			{
+				if (_isObject)
+				{
+					if (expression == null)
+					{
+						var type  = _methodCall.Method.GetGenericArguments()[0];
+						var nctor = (NewExpression)Expression.Find(e =>
+						{
+							if (e.NodeType == ExpressionType.New && e.Type == type)
+							{
+								var ne = (NewExpression)e;
+								return ne.Arguments != null && ne.Arguments.Count > 0;
+							}
+
+							return false;
+						});
+
+						Expression expr;
+
+						if (nctor != null)
+						{
+							var members = nctor.Members
+								.Select(m => m is MethodInfo ? TypeHelper.GetPropertyByMethod((MethodInfo)m) : m)
+								.ToList();
+
+							expr = Expression.New(
+								nctor.Constructor,
+								members
+									.Select(m => Expression.PropertyOrField(_unionParameter, m.Name))
+									.Cast<Expression>(),
+								members);
+						}
+						else
+						{
+							var ta = TypeAccessor.GetAccessor(type);
+
+							expr = Expression.MemberInit(
+								Expression.New(ta.Type),
+								_members
+									.Select(m => Expression.Bind(m.Value.MemberExpression.Member, m.Value.MemberExpression))
+									.Cast<MemberBinding>());
+						}
+
+						var ex = Builder.BuildExpression(this, expr);
+
+						return ex;
+					}
+
+					if (level == 0 || level == 1)
+					{
+						var levelExpression = expression.GetLevelExpression(1);
+
+						if (expression == levelExpression && !IsExpression(expression, 1, RequestFor.Object).Result)
+						{
+							var idx = ConvertToIndex(expression, level, ConvertFlags.Field);
+							var n   = idx[0].Index;
+
+							if (Parent != null)
+								n = Parent.ConvertToParentIndex(n, this);
+
+							return Builder.BuildSql(expression.Type, n);
+						}
+					}
+				}
+
+				return base.BuildExpression(expression, level);
+			}
+
+			public override IsExpressionResult IsExpression(Expression expression, int level, RequestFor testFlag)
+			{
+				if (testFlag == RequestFor.Root && expression == _unionParameter)
+					return IsExpressionResult.True;
+
+				return base.IsExpression(expression, level, testFlag);
+			}
+
+			public override SqlInfo[] ConvertToIndex(Expression expression, int level, ConvertFlags flags)
+			{
+				if (_isObject)
+				{
+					return ConvertToSql(expression, level, flags)
+						.Select(idx =>
+						{
+							if (idx.Index < 0)
+							{
+								if (idx.Index == -2)
+								{
+									SqlQuery.Select.Columns.Add(new SqlQuery.Column(SqlQuery, idx.Sql));
+									idx.Index = SqlQuery.Select.Columns.Count - 1;
+								}
+								else
+								{
+									idx.Index = SqlQuery.Select.Add(idx.Sql);
+								}
+							}
+
+							return idx;
+						})
+						.ToArray();
+				}
+
+				return base.ConvertToIndex(expression, level, flags);
+			}
+
+			public override SqlInfo[] ConvertToSql(Expression expression, int level, ConvertFlags flags)
+			{
+				if (_isObject)
+				{
+					switch (flags)
+					{
+						case ConvertFlags.All   :
+						case ConvertFlags.Key   :
+
+							if (expression == null)
+							{
+								return _members.Values
+									.Select(m => ConvertToSql(m.MemberExpression, 0, ConvertFlags.Field)[0])
+									.ToArray();
+							}
+
+							break;
+
+						case ConvertFlags.Field :
+
+							if (expression != null && (level == 0 || level == 1) && expression.NodeType == ExpressionType.MemberAccess)
+							{
+								var levelExpression = expression.GetLevelExpression(1);
+
+								if (expression == levelExpression)
+								{
+									var ma     = (MemberExpression)expression;
+									var member = _members[ma.Member];
+
+									if (member.SqlQueryInfo == null)
+									{
+										member.SqlQueryInfo = new SqlInfo(member.MemberExpression.Member)
+										{
+											Index = -2,
+											Sql   = SubQuery.SqlQuery.Select.Columns[member.SequenceInfo.Index],
+											Query = SqlQuery,
+										};
+									}
+
+									return new[] { member.SqlQueryInfo };
+								}
+							}
+
+							break;
+					}
+
+					throw new InvalidOperationException();
+				}
+
+				return base.ConvertToSql(expression, level, flags);
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/ContainsBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,142 @@
+using System;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+	using Data.Sql;
+
+	class ContainsBuilder : MethodCallBuilder
+	{
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			return methodCall.IsQueryable("Contains") && methodCall.Arguments.Count == 2;
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
+			return new ContainsContext(buildInfo.Parent, methodCall, sequence);
+		}
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			return null;
+		}
+
+		class ContainsContext : SequenceContextBase
+		{
+			readonly MethodCallExpression _methodCall;
+
+			public ContainsContext(IBuildContext parent, MethodCallExpression methodCall, IBuildContext sequence)
+				: base(parent, sequence, null)
+			{
+				_methodCall = methodCall;
+			}
+
+			public override void BuildQuery<T>(Query<T> query, ParameterExpression queryParameter)
+			{
+				var sql = GetSubQuery(null);
+
+				query.Queries[0].SqlQuery = new SqlQuery();
+				query.Queries[0].SqlQuery.Select.Add(sql);
+
+				var expr   = Builder.BuildSql(typeof(bool), 0);
+				var mapper = Builder.BuildMapper<object>(expr);
+
+				query.SetElementQuery(mapper.Compile());
+			}
+
+			public override Expression BuildExpression(Expression expression, int level)
+			{
+				var idx = ConvertToIndex(expression, level, ConvertFlags.Field);
+				return Builder.BuildSql(typeof(bool), idx[0].Index);
+			}
+
+			public override SqlInfo[] ConvertToSql(Expression expression, int level, ConvertFlags flags)
+			{
+				if (expression == null)
+				{
+					var sql   = GetSubQuery(null);
+					var query = SqlQuery;
+
+					if (Parent != null)
+						query = Parent.SqlQuery;
+
+					return new[] { new SqlInfo { Query = query, Sql = sql } };
+				}
+
+				throw new InvalidOperationException();
+			}
+
+			public override SqlInfo[] ConvertToIndex(Expression expression, int level, ConvertFlags flags)
+			{
+				var sql = ConvertToSql(expression, level, flags);
+
+				if (sql[0].Index < 0)
+					sql[0].Index = sql[0].Query.Select.Add(sql[0].Sql);
+
+				return sql;
+			}
+
+			public override IsExpressionResult IsExpression(Expression expression, int level, RequestFor requestFlag)
+			{
+				if (expression == null)
+				{
+					switch (requestFlag)
+					{
+						case RequestFor.Expression :
+						case RequestFor.Field      : return IsExpressionResult.False;
+					}
+				}
+
+				throw new InvalidOperationException();
+			}
+
+			public override IBuildContext GetContext(Expression expression, int level, BuildInfo buildInfo)
+			{
+				throw new InvalidOperationException();
+			}
+
+			ISqlExpression _subQuerySql;
+
+			public override ISqlExpression GetSubQuery(IBuildContext context)
+			{
+				if (_subQuerySql == null)
+				{
+					var args      = _methodCall.Method.GetGenericArguments();
+					var param     = Expression.Parameter(args[0], "param");
+					var expr      = _methodCall.Arguments[1];
+					var condition = Expression.Lambda(Expression.Equal(param, expr), param);
+
+					IBuildContext ctx = new ExpressionContext(Parent, Sequence, condition);
+
+					ctx = Builder.GetContext(ctx, expr) ?? ctx;
+
+					Builder.ReplaceParent(ctx, this);
+
+					SqlQuery.Condition cond;
+
+					if (Sequence.SqlQuery != SqlQuery &&
+						(ctx.IsExpression(expr, 0, RequestFor.Field).     Result ||
+						 ctx.IsExpression(expr, 0, RequestFor.Expression).Result))
+					{
+						Sequence.ConvertToIndex(null, 0, ConvertFlags.All);
+						var ex = Builder.ConvertToSql(ctx, _methodCall.Arguments[1], false);
+						cond = new SqlQuery.Condition(false, new SqlQuery.Predicate.InSubQuery(ex, false, SqlQuery));
+					}
+					else
+					{
+						var sequence = Builder.BuildWhere(Parent, Sequence, condition, true);
+						cond = new SqlQuery.Condition(false, new SqlQuery.Predicate.FuncLike(SqlFunction.CreateExists(sequence.SqlQuery)));
+					}
+
+					_subQuerySql = new SqlQuery.SearchCondition(cond);
+				}
+
+				return _subQuerySql;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/ConvertFlags.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,11 @@
+using System;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	public enum ConvertFlags
+	{
+		Field,
+		Key,
+		All,
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/CountBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,162 @@
+using System;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+	using Data.Sql;
+
+	class CountBuilder : MethodCallBuilder
+	{
+		public static string[] MethodNames = new[] { "Count", "LongCount" };
+
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			return methodCall.IsQueryable(MethodNames);
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			var returnType = methodCall.Method.ReturnType;
+			var sequence   = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
+
+			if (sequence.SqlQuery != buildInfo.SqlQuery)
+			{
+				if (sequence is JoinBuilder.GroupJoinSubQueryContext)
+				{
+					var ctx = new CountContext(buildInfo.Parent, sequence, returnType)
+					{
+						SqlQuery = ((JoinBuilder.GroupJoinSubQueryContext)sequence).GetCounter(methodCall)
+					};
+
+					ctx.Sql        = ctx.SqlQuery;
+					ctx.FieldIndex = ctx.SqlQuery.Select.Add(SqlFunction.CreateCount(returnType, ctx.SqlQuery), "cnt");
+
+					return ctx;
+				}
+
+				if (sequence is GroupByBuilder.GroupByContext)
+				{
+					return new CountContext(buildInfo.Parent, sequence, returnType)
+					{
+						Sql        = SqlFunction.CreateCount(returnType, sequence.SqlQuery),
+						FieldIndex = -1
+					};
+				}
+			}
+
+			if (sequence.SqlQuery.Select.IsDistinct        ||
+			    sequence.SqlQuery.Select.TakeValue != null ||
+			    sequence.SqlQuery.Select.SkipValue != null ||
+			   !sequence.SqlQuery.GroupBy.IsEmpty)
+			{
+				sequence.ConvertToIndex(null, 0, ConvertFlags.Key);
+				sequence = new SubQueryContext(sequence);
+			}
+
+			if (sequence.SqlQuery.OrderBy.Items.Count > 0)
+			{
+				if (sequence.SqlQuery.Select.TakeValue == null && sequence.SqlQuery.Select.SkipValue == null)
+					sequence.SqlQuery.OrderBy.Items.Clear();
+				else
+					sequence = new SubQueryContext(sequence);
+			}
+
+			var context = new CountContext(buildInfo.Parent, sequence, returnType);
+
+			context.Sql        = context.SqlQuery;
+			context.FieldIndex = context.SqlQuery.Select.Add(SqlFunction.CreateCount(returnType, context.SqlQuery), "cnt");
+
+			return context;
+		}
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			return null;
+		}
+
+		internal class CountContext : SequenceContextBase
+		{
+			public CountContext(IBuildContext parent, IBuildContext sequence, Type returnType)
+				: base(parent, sequence, null)
+			{
+				_returnType = returnType;
+			}
+
+			readonly Type      _returnType;
+			private  SqlInfo[] _index;
+
+			public int            FieldIndex;
+			public ISqlExpression Sql;
+
+			public override void BuildQuery<T>(Query<T> query, ParameterExpression queryParameter)
+			{
+				var expr   = Builder.BuildSql(_returnType, FieldIndex);
+				var mapper = Builder.BuildMapper<object>(expr);
+
+				query.SetElementQuery(mapper.Compile());
+			}
+
+			public override Expression BuildExpression(Expression expression, int level)
+			{
+				return Builder.BuildSql(_returnType, ConvertToIndex(expression, level, ConvertFlags.Field)[0].Index);
+			}
+
+			public override SqlInfo[] ConvertToSql(Expression expression, int level, ConvertFlags flags)
+			{
+				switch (flags)
+				{
+					case ConvertFlags.Field : return new[] { new SqlInfo { Query = Parent.SqlQuery, Sql = Sql } };
+				}
+
+				throw new InvalidOperationException();
+			}
+
+			public override SqlInfo[] ConvertToIndex(Expression expression, int level, ConvertFlags flags)
+			{
+				switch (flags)
+				{
+					case ConvertFlags.Field :
+						return _index ?? (_index = new[]
+						{
+							new SqlInfo { Query = Parent.SqlQuery, Index = Parent.SqlQuery.Select.Add(Sql), Sql = Sql, }
+						});
+				}
+
+				throw new InvalidOperationException();
+			}
+
+			public override IsExpressionResult IsExpression(Expression expression, int level, RequestFor requestFlag)
+			{
+				switch (requestFlag)
+				{
+					case RequestFor.Expression : return IsExpressionResult.True;
+				}
+
+				return IsExpressionResult.False;
+			}
+
+			public override IBuildContext GetContext(Expression expression, int level, BuildInfo buildInfo)
+			{
+				return Sequence.GetContext(expression, level, buildInfo);
+			}
+
+			public override ISqlExpression GetSubQuery(IBuildContext context)
+			{
+				var query = context.SqlQuery;
+
+				if (query == SqlQuery)
+				{
+					var col = query.Select.Columns[query.Select.Columns.Count - 1];
+
+					query.Select.Columns.RemoveAt(query.Select.Columns.Count - 1);
+
+					return col.Expression;
+				}
+
+				return null;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/DefaultIfEmptyBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,135 @@
+using System;
+using System.Linq;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+	using Data.Sql;
+
+	class DefaultIfEmptyBuilder : MethodCallBuilder
+	{
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			return methodCall.IsQueryable("DefaultIfEmpty");
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			var sequence     = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
+			var defaultValue = methodCall.Arguments.Count == 1 ? null : methodCall.Arguments[1].Unwrap();
+
+			if (buildInfo.Parent is SelectManyBuilder.SelectManyContext)
+			{
+				var groupJoin = ((SelectManyBuilder.SelectManyContext)buildInfo.Parent).Sequence[0] as JoinBuilder.GroupJoinContext;
+
+				if (groupJoin != null)
+				{
+					groupJoin.SqlQuery.From.Tables[0].Joins[0].JoinType = SqlQuery.JoinType.Left;
+					groupJoin.SqlQuery.From.Tables[0].Joins[0].IsWeak   = false;
+				}
+			}
+
+			return new DefaultIfEmptyContext(buildInfo.Parent, sequence, defaultValue);
+		}
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			return null;
+		}
+
+		public class DefaultIfEmptyContext : SequenceContextBase
+		{
+			public DefaultIfEmptyContext(IBuildContext parent, IBuildContext sequence, Expression defaultValue) 
+				: base(parent, sequence, null)
+			{
+				_defaultValue = defaultValue;
+			}
+
+			private readonly Expression _defaultValue;
+
+			public override Expression BuildExpression(Expression expression, int level)
+			{
+				var expr = Sequence.BuildExpression(expression, level);
+
+				if (expression == null)
+				{
+					var q =
+						from col in SqlQuery.Select.Columns
+						where !col.CanBeNull()
+						select SqlQuery.Select.Columns.IndexOf(col);
+
+					var idx = q.DefaultIfEmpty(-1).First();
+
+					if (idx == -1)
+						idx = SqlQuery.Select.Add(new SqlValue((int?) 1));
+
+					var n = ConvertToParentIndex(idx, this);
+
+					var e = Expression.Call(
+						ExpressionBuilder.DataReaderParam,
+						ReflectionHelper.DataReader.IsDBNull,
+						Expression.Constant(n)) as Expression;
+
+					var defaultValue = _defaultValue ?? Expression.Constant(null, expr.Type);
+
+#if FW4 || SILVERLIGHT
+
+					if (expr.NodeType == ExpressionType.Parameter)
+					{
+						var par  = (ParameterExpression)expr;
+						var pidx = Builder.BlockVariables.IndexOf(par);
+
+						if (pidx >= 0)
+						{
+							var ex = Builder.BlockExpressions[pidx];
+
+							if (ex.NodeType == ExpressionType.Assign)
+							{
+								var bex = (BinaryExpression)ex;
+
+								if (bex.Left == expr)
+								{
+									if (bex.Right.NodeType != ExpressionType.Conditional)
+									{
+										Builder.BlockExpressions[pidx] =
+											Expression.Assign(
+											bex.Left,
+											Expression.Condition(e, defaultValue, bex.Right));
+									}
+								}
+							}
+						}
+					}
+
+#endif
+
+					expr = Expression.Condition(e, defaultValue, expr);
+				}
+
+				return expr;
+			}
+
+			public override SqlInfo[] ConvertToSql(Expression expression, int level, ConvertFlags flags)
+			{
+				return Sequence.ConvertToSql(expression, level, flags);
+			}
+
+			public override SqlInfo[] ConvertToIndex(Expression expression, int level, ConvertFlags flags)
+			{
+				return Sequence.ConvertToIndex(expression, level, flags);
+			}
+
+			public override IsExpressionResult IsExpression(Expression expression, int level, RequestFor requestFlag)
+			{
+				return Sequence.IsExpression(expression, level, requestFlag);
+			}
+
+			public override IBuildContext GetContext(Expression expression, int level, BuildInfo buildInfo)
+			{
+				return Sequence.GetContext(expression, level, buildInfo);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/DeleteBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,99 @@
+using System;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+	using Data.Sql;
+
+	class DeleteBuilder : MethodCallBuilder
+	{
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			return methodCall.IsQueryable("Delete");
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
+
+			if (methodCall.Arguments.Count == 2)
+				sequence = builder.BuildWhere(buildInfo.Parent, sequence, (LambdaExpression)methodCall.Arguments[1].Unwrap(), false);
+
+			sequence.SqlQuery.QueryType = QueryType.Delete;
+
+			// Check association.
+			//
+			var ctx = sequence as SelectContext;
+
+			if (ctx != null && ctx.IsScalar)
+			{
+				var res = ctx.IsExpression(null, 0, RequestFor.Association);
+
+				if (res.Result && res.Context is TableBuilder.AssociatedTableContext)
+				{
+					var atc = (TableBuilder.AssociatedTableContext)res.Context;
+					sequence.SqlQuery.Delete.Table = atc.SqlTable;
+				}
+				else
+				{
+					res = ctx.IsExpression(null, 0, RequestFor.Table);
+
+					if (res.Result && res.Context is TableBuilder.TableContext)
+					{
+						var tc = (TableBuilder.TableContext)res.Context;
+
+						if (sequence.SqlQuery.From.Tables.Count == 0 || sequence.SqlQuery.From.Tables[0].Source != tc.SqlQuery)
+							sequence.SqlQuery.Delete.Table = tc.SqlTable;
+					}
+				}
+			}
+
+			return new DeleteContext(buildInfo.Parent, sequence);
+		}
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			return null;
+		}
+
+		class DeleteContext : SequenceContextBase
+		{
+			public DeleteContext(IBuildContext parent, IBuildContext sequence)
+				: base(parent, sequence, null)
+			{
+			}
+
+			public override void BuildQuery<T>(Query<T> query, ParameterExpression queryParameter)
+			{
+				query.SetNonQueryQuery();
+			}
+
+			public override Expression BuildExpression(Expression expression, int level)
+			{
+				throw new InvalidOperationException();
+			}
+
+			public override SqlInfo[] ConvertToSql(Expression expression, int level, ConvertFlags flags)
+			{
+				throw new InvalidOperationException();
+			}
+
+			public override SqlInfo[] ConvertToIndex(Expression expression, int level, ConvertFlags flags)
+			{
+				throw new InvalidOperationException();
+			}
+
+			public override IsExpressionResult IsExpression(Expression expression, int level, RequestFor requestFlag)
+			{
+				throw new InvalidOperationException();
+			}
+
+			public override IBuildContext GetContext(Expression expression, int level, BuildInfo buildInfo)
+			{
+				throw new InvalidOperationException();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/DistinctBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,35 @@
+using System;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+
+	class DistinctBuilder : MethodCallBuilder
+	{
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			return methodCall.IsQueryable("Distinct");
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
+			var sql      = sequence.SqlQuery;
+
+			if (sql.Select.TakeValue != null || sql.Select.SkipValue != null)
+				sequence = new SubQueryContext(sequence);
+
+			sequence.SqlQuery.Select.IsDistinct = true;
+			sequence.ConvertToIndex(null, 0, ConvertFlags.All);
+
+			return sequence;
+		}
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			return null;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/ExpressionBuilder.QueryBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,543 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+	using Reflection;
+
+	partial class ExpressionBuilder
+	{
+		#region BuildExpression
+
+		readonly HashSet<Expression> _skippedExpressions = new HashSet<Expression>();
+
+		public Expression BuildExpression(IBuildContext context, Expression expression)
+		{
+			var newExpr = expression.Convert2(expr =>
+			{
+				if (_skippedExpressions.Contains(expr))
+					return new ExpressionHelper.ConvertInfo(expr, true);
+
+				if (expr.Find(IsNoneSqlMember) != null)
+					return new ExpressionHelper.ConvertInfo(expr);
+
+				switch (expr.NodeType)
+				{
+					case ExpressionType.MemberAccess:
+						{
+							if (IsServerSideOnly(expr) || PreferServerSide(expr))
+								return new ExpressionHelper.ConvertInfo(BuildSql(context, expr));
+
+							var ma = (MemberExpression)expr;
+
+							if (SqlProvider.ConvertMember(ma.Member) != null)
+								break;
+
+							var ctx = GetContext(context, expr);
+
+							if (ctx != null)
+								return new ExpressionHelper.ConvertInfo(ctx.BuildExpression(expr, 0));
+
+							var ex = ma.Expression;
+
+							if (ex != null && ex.NodeType == ExpressionType.Constant)
+							{
+								// field = localVariable
+								//
+								var c = _expressionAccessors[ex];
+								return new ExpressionHelper.ConvertInfo(
+									Expression.MakeMemberAccess(Expression.Convert(c, ex.Type), ma.Member));
+							}
+
+							break;
+						}
+
+					case ExpressionType.Parameter:
+						{
+							if (expr == ParametersParam)
+								break;
+
+							var ctx = GetContext(context, expr);
+
+							if (ctx != null)
+								return new ExpressionHelper.ConvertInfo(ctx.BuildExpression(expr, 0));
+
+							break;
+						}
+
+					case ExpressionType.Constant:
+						{
+							if (ExpressionHelper.IsConstant(expr.Type))
+								break;
+
+							if (_expressionAccessors.ContainsKey(expr))
+								return new ExpressionHelper.ConvertInfo(Expression.Convert(_expressionAccessors[expr], expr.Type));
+
+							break;
+						}
+
+					case ExpressionType.Coalesce:
+
+						if (expr.Type == typeof(string) && MappingSchema.GetDefaultNullValue<string>() != null)
+							return new ExpressionHelper.ConvertInfo(BuildSql(context, expr));
+
+						if (CanBeTranslatedToSql(context, ConvertExpression(expr), true))
+							return new ExpressionHelper.ConvertInfo(BuildSql(context, expr));
+
+						break;
+
+					case ExpressionType.Conditional:
+
+						if (CanBeTranslatedToSql(context, ConvertExpression(expr), true))
+							return new ExpressionHelper.ConvertInfo(BuildSql(context, expr));
+						break;
+
+					case ExpressionType.Call:
+						{
+							var ce = (MethodCallExpression)expr;
+
+							if (IsGroupJoinSource(context, ce))
+							{
+								foreach (var arg in ce.Arguments.Skip(1))
+									if (!_skippedExpressions.Contains(arg))
+										_skippedExpressions.Add(arg);
+
+								break;
+							}
+
+							if (IsSubQuery(context, ce))
+							{
+								if (TypeHelper.IsSameOrParent(typeof(IEnumerable), expr.Type) && expr.Type != typeof(string) && !expr.Type.IsArray)
+									return new ExpressionHelper.ConvertInfo(BuildMultipleQuery(context, expr));
+
+								return new ExpressionHelper.ConvertInfo(GetSubQuery(context, ce).BuildExpression(null, 0));
+							}
+
+							if (IsServerSideOnly(expr) || PreferServerSide(expr))
+								return new ExpressionHelper.ConvertInfo(BuildSql(context, expr));
+						}
+
+						break;
+				}
+
+				if (EnforceServerSide(context))
+				{
+					switch (expr.NodeType)
+					{
+						case ExpressionType.MemberInit :
+						case ExpressionType.New        :
+						case ExpressionType.Convert    :
+							break;
+
+						default                        :
+							if (CanBeCompiled(expr))
+								break;
+							return new ExpressionHelper.ConvertInfo(BuildSql(context, expr));
+					}
+				}
+
+				return new ExpressionHelper.ConvertInfo(expr);
+			});
+
+			return newExpr;
+		}
+
+		static bool EnforceServerSide(IBuildContext context)
+		{
+			return context.SqlQuery.Select.IsDistinct;
+		}
+
+		#endregion
+
+		#region BuildSql
+
+		Expression BuildSql(IBuildContext context, Expression expression)
+		{
+			var sqlex = ConvertToSqlExpression(context, expression, true);
+			var idx   = context.SqlQuery.Select.Add(sqlex);
+
+			idx = context.ConvertToParentIndex(idx, context);
+
+			var field = BuildSql(expression.Type, idx);
+
+			return field;
+		}
+
+		public Expression BuildSql(MemberAccessor ma, int idx, MethodInfo checkNullFunction, Expression context)
+		{
+			var expr = Expression.Call(DataReaderParam, ReflectionHelper.DataReader.GetValue, Expression.Constant(idx));
+
+			if (checkNullFunction != null)
+				expr = Expression.Call(null, checkNullFunction, expr, context);
+
+			Expression mapper;
+
+			if (TypeHelper.IsEnumOrNullableEnum(ma.Type))
+			{
+				var type = TypeHelper.ToNullable(ma.Type);
+				mapper =
+					Expression.Convert(
+						Expression.Call(
+							Expression.Constant(MappingSchema),
+							ReflectionHelper.MapSchema.MapValueToEnumWithMemberAccessor,
+								expr,
+								Expression.Constant(ma)),
+						type);
+			}
+			else
+			{
+				MethodInfo mi;
+
+				if (!ReflectionHelper.MapSchema.Converters.TryGetValue(ma.Type, out mi))
+				{
+					mapper =
+						Expression.Convert(
+							Expression.Call(
+								Expression.Constant(MappingSchema),
+								ReflectionHelper.MapSchema.ChangeType,
+									expr,
+									Expression.Constant(ma.Type)),
+							ma.Type);
+				}
+				else
+				{
+					mapper = Expression.Call(Expression.Constant(MappingSchema), mi, expr);
+				}
+			}
+
+			return mapper;
+		}
+
+		public Expression BuildSql(Type type, int idx, MethodInfo checkNullFunction, Expression context)
+		{
+			var expr = Expression.Call(DataReaderParam, ReflectionHelper.DataReader.GetValue, Expression.Constant(idx));
+
+			if (checkNullFunction != null)
+				expr = Expression.Call(null, checkNullFunction, expr, context);
+
+			Expression mapper;
+
+			if (type.IsEnum)
+			{
+				mapper =
+					Expression.Convert(
+						Expression.Call(
+							Expression.Constant(MappingSchema),
+							ReflectionHelper.MapSchema.MapValueToEnum,
+								expr,
+								Expression.Constant(type)),
+						type);
+			}
+			else
+			{
+				MethodInfo mi;
+
+				if (!ReflectionHelper.MapSchema.Converters.TryGetValue(type, out mi))
+				{
+					mapper =
+						Expression.Convert(
+							Expression.Call(
+								Expression.Constant(MappingSchema),
+								ReflectionHelper.MapSchema.ChangeType,
+									expr,
+									Expression.Constant(type)),
+							type);
+				}
+				else
+				{
+					mapper = Expression.Call(Expression.Constant(MappingSchema), mi, expr);
+				}
+			}
+
+			return mapper;
+		}
+
+		public Expression BuildSql(Type type, int idx)
+		{
+			return BuildSql(type, idx, null, null);
+		}
+
+		public Expression BuildSql(MemberAccessor ma, int idx)
+		{
+			return BuildSql(ma, idx, null, null);
+		}
+
+		#endregion
+
+		#region IsNonSqlMember
+
+		bool IsNoneSqlMember(Expression expr)
+		{
+			switch (expr.NodeType)
+			{
+				case ExpressionType.MemberAccess:
+					{
+						var me = (MemberExpression)expr;
+
+						var om = (
+							from c in Contexts.OfType<TableBuilder.TableContext>()
+							where c.ObjectType == me.Member.DeclaringType
+							select c.ObjectMapper
+						).FirstOrDefault();
+
+						return om != null && om.Associations.All(a => !TypeHelper.Equals(a.MemberAccessor.MemberInfo, me.Member)) && om[me.Member.Name, true] == null;
+					}
+			}
+
+			return false;
+		}
+
+		#endregion
+
+		#region PreferServerSide
+
+		bool PreferServerSide(Expression expr)
+		{
+			switch (expr.NodeType)
+			{
+				case ExpressionType.MemberAccess:
+					{
+						var pi = (MemberExpression)expr;
+						var l  = SqlProvider.ConvertMember(pi.Member);
+
+						if (l != null)
+						{
+							var info = l.Body.Unwrap();
+
+							if (l.Parameters.Count == 1 && pi.Expression != null)
+								info = info.Convert(wpi => wpi == l.Parameters[0] ? pi.Expression : wpi);
+
+							return info.Find(PreferServerSide) != null;
+						}
+
+						var attr = GetFunctionAttribute(pi.Member);
+						return attr != null && attr.PreferServerSide && !CanBeCompiled(expr);
+					}
+
+				case ExpressionType.Call:
+					{
+						var pi = (MethodCallExpression)expr;
+						var e  = pi;
+						var l  = SqlProvider.ConvertMember(e.Method);
+
+						if (l != null)
+							return l.Body.Unwrap().Find(PreferServerSide) != null;
+
+						var attr = GetFunctionAttribute(e.Method);
+						return attr != null && attr.PreferServerSide && !CanBeCompiled(expr);
+					}
+			}
+
+			return false;
+		}
+
+		#endregion
+
+		#region Build Mapper
+
+		public Expression BuildBlock(Expression expression)
+		{
+#if FW4 || SILVERLIGHT
+
+			if (IsBlockDisable || BlockExpressions.Count == 0)
+				return expression;
+
+			BlockExpressions.Add(expression);
+
+			expression = Expression.Block(BlockVariables, BlockExpressions);
+
+			BlockVariables.  Clear();
+			BlockExpressions.Clear();
+
+#endif
+
+			return expression;
+		}
+
+		public Expression<Func<QueryContext,IDataContext,IDataReader,Expression,object[],T>> BuildMapper<T>(Expression expr)
+		{
+			var type = typeof(T);
+
+			if (expr.Type != type)
+				expr = Expression.Convert(expr, type);
+
+			var mapper = Expression.Lambda<Func<QueryContext,IDataContext,IDataReader,Expression,object[],T>>(
+				BuildBlock(expr), new []
+				{
+					ContextParam,
+					DataContextParam,
+					DataReaderParam,
+					ExpressionParam,
+					ParametersParam,
+				});
+
+			return mapper;
+		}
+
+		#endregion
+
+		#region BuildMultipleQuery
+
+		interface IMultipleQueryHelper
+		{
+			Expression GetSubquery(
+				ExpressionBuilder       builder,
+				Expression              expression,
+				ParameterExpression     paramArray,
+				IEnumerable<Expression> parameters);
+		}
+
+		class MultipleQueryHelper<TRet> : IMultipleQueryHelper
+		{
+			public Expression GetSubquery(
+				ExpressionBuilder       builder,
+				Expression              expression,
+				ParameterExpression     paramArray,
+				IEnumerable<Expression> parameters)
+			{
+				var lambda      = Expression.Lambda<Func<IDataContext,object[],TRet>>(
+					expression,
+					Expression.Parameter(typeof(IDataContext), "ctx"),
+					paramArray);
+				var queryReader = CompiledQuery.Compile(lambda);
+
+				return Expression.Call(
+					null,
+					ReflectionHelper.Expressor<object>.MethodExpressor(_ => ExecuteSubQuery(null, null, null)),
+						ContextParam,
+						Expression.NewArrayInit(typeof(object), parameters),
+						Expression.Constant(queryReader)
+					);
+			}
+
+			static TRet ExecuteSubQuery(
+				QueryContext                     queryContext,
+				object[]                         parameters,
+				Func<IDataContext,object[],TRet> queryReader)
+			{
+				var db = queryContext.GetDataContext();
+
+				try
+				{
+					return queryReader(db.DataContextInfo.DataContext, parameters);
+				}
+				finally
+				{
+					queryContext.ReleaseDataContext(db);
+				}
+			}
+		}
+
+		public Expression BuildMultipleQuery(IBuildContext context, Expression expression)
+		{
+			if (!Common.Configuration.Linq.AllowMultipleQuery)
+				throw new LinqException("Multiple queries are not allowed. Set the 'BLToolkit.Common.Configuration.Linq.AllowMultipleQuery' flag to 'true' to allow multiple queries.");
+
+			var parameters = new HashSet<ParameterExpression>();
+
+			expression.Visit(e =>
+			{
+				if (e.NodeType == ExpressionType.Lambda)
+					foreach (var p in ((LambdaExpression)e).Parameters)
+						parameters.Add(p);
+			});
+
+			// Convert associations.
+			//
+			expression = expression.Convert(e =>
+			{
+				switch (e.NodeType)
+				{
+					case ExpressionType.MemberAccess :
+						{
+							var root = e.GetRootObject();
+
+							if (root != null &&
+								root.NodeType == ExpressionType.Parameter &&
+								!parameters.Contains((ParameterExpression)root))
+							{
+								var res = context.IsExpression(e, 0, RequestFor.Association);
+
+								if (res.Result)
+								{
+									var table = (TableBuilder.AssociatedTableContext)res.Context;
+
+									if (table.IsList)
+									{
+										var ttype  = typeof(Table<>).MakeGenericType(table.ObjectType);
+										var tbl    = Activator.CreateInstance(ttype);
+										var method = typeof(LinqExtensions)
+											.GetMethod("Where", BindingFlags.NonPublic | BindingFlags.Static)
+											.MakeGenericMethod(e.Type, table.ObjectType, ttype);
+
+										var me = (MemberExpression)e;
+										var op = Expression.Parameter(table.ObjectType, "t");
+
+										parameters.Add(op);
+
+										Expression ex = null;
+
+										for (var i = 0; i < table.Association.ThisKey.Length; i++)
+										{
+											var field1 = table.ParentAssociation.SqlTable.Fields[table.Association.ThisKey [i]];
+											var field2 = table.                  SqlTable.Fields[table.Association.OtherKey[i]];
+
+											var ee = Expression.Equal(
+												Expression.MakeMemberAccess(op,            field2.MemberMapper.MemberAccessor.MemberInfo),
+												Expression.MakeMemberAccess(me.Expression, field1.MemberMapper.MemberAccessor.MemberInfo));
+
+											ex = ex == null ? ee : Expression.AndAlso(ex, ee);
+										}
+
+										return Expression.Call(null, method, Expression.Constant(tbl), Expression.Lambda(ex, op));
+									}
+								}
+							}
+
+							break;
+						}
+				}
+
+				return e;
+			});
+
+			var paramex = Expression.Parameter(typeof(object[]), "ps");
+			var parms   = new List<Expression>();
+
+			// Convert parameters.
+			//
+			expression = expression.Convert(e =>
+			{
+				var root = e.GetRootObject();
+
+				if (root != null &&
+					root.NodeType == ExpressionType.Parameter &&
+					!parameters.Contains((ParameterExpression)root))
+				{
+					var ex = Expression.Convert(BuildExpression(context, e), typeof(object));
+
+					parms.Add(ex);
+
+					return Expression.Convert(
+						Expression.ArrayIndex(paramex, Expression.Constant(parms.Count - 1)),
+						e.Type);
+				}
+
+				return e;
+			});
+
+			var sqtype = typeof(MultipleQueryHelper<>).MakeGenericType(expression.Type);
+			var helper = (IMultipleQueryHelper)Activator.CreateInstance(sqtype);
+
+			return helper.GetSubquery(this, expression, paramex, parms);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/ExpressionBuilder.SqlBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,2509 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+using System.Text;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+	using Common;
+	using Data.Sql;
+	using Mapping;
+	using Reflection;
+
+	partial class ExpressionBuilder
+	{
+		#region Build Where
+
+		public IBuildContext BuildWhere(IBuildContext parent, IBuildContext sequence, LambdaExpression condition, bool checkForSubQuery)
+		{
+			var makeHaving = false;
+			var prevParent = sequence.Parent;
+
+			var ctx  = new ExpressionContext(parent, sequence, condition);
+			var expr = ConvertExpression(condition.Body.Unwrap());
+
+			if (checkForSubQuery && CheckSubQueryForWhere(ctx, expr, out makeHaving))
+			{
+				ReplaceParent(ctx, prevParent);
+
+				sequence = new SubQueryContext(sequence);
+				prevParent = sequence.Parent;
+
+				ctx = new ExpressionContext(parent, sequence, condition);
+			}
+
+			BuildSearchCondition(
+				ctx,
+				expr,
+				makeHaving ?
+					ctx.SqlQuery.Having.SearchCondition.Conditions :
+					ctx.SqlQuery.Where. SearchCondition.Conditions);
+
+			ReplaceParent(ctx, prevParent);
+
+			return sequence;
+		}
+
+		bool CheckSubQueryForWhere(IBuildContext context, Expression expression, out bool makeHaving)
+		{
+			var makeSubQuery = false;
+			var isHaving     = false;
+			var isWhere      = false;
+
+			expression.Visit(expr =>
+			{
+				if (_subQueryExpressions != null && _subQueryExpressions.Contains(expr))
+				{
+					makeSubQuery = true;
+					isWhere      = true;
+					return false;
+				}
+
+				var stopWalking = false;
+
+				switch (expr.NodeType)
+				{
+					case ExpressionType.MemberAccess:
+						{
+							var ma = (MemberExpression)expr;
+
+							if (TypeHelper.IsNullableValueMember(ma.Member) ||
+							    TypeHelper.IsNullableHasValueMember(ma.Member))
+								break;
+
+							if (SqlProvider.ConvertMember(ma.Member) == null)
+							{
+								var ctx = GetContext(context, expr);
+
+								if (ctx != null)
+								{
+									if (ctx.IsExpression(expr, 0, RequestFor.Expression).Result)
+										makeSubQuery = true;
+									stopWalking = true;
+								}
+							}
+
+							isWhere = true;
+
+							break;
+						}
+
+					case ExpressionType.Call:
+						{
+							var e = (MethodCallExpression)expr;
+
+							if (e.Method.DeclaringType == typeof(Enumerable) && e.Method.Name != "Contains")
+								return isHaving = true;
+
+							isWhere = true;
+
+							break;
+						}
+
+					case ExpressionType.Parameter:
+						{
+							var ctx = GetContext(context, expr);
+
+							if (ctx != null)
+							{
+								if (ctx.IsExpression(expr, 0, RequestFor.Expression).Result)
+									makeSubQuery = true;
+								stopWalking = true;
+							}
+
+							isWhere = true;
+
+							break;
+						}
+				}
+
+				return !stopWalking;
+			});
+
+			makeHaving = isHaving && !isWhere;
+			return makeSubQuery || isHaving && isWhere;
+		}
+
+		#endregion
+
+		#region BuildTake
+
+		public void BuildTake(IBuildContext context, ISqlExpression expr)
+		{
+			var sql = context.SqlQuery;
+
+			sql.Select.Take(expr);
+
+			SqlProvider.SqlQuery = sql;
+
+			if (sql.Select.SkipValue != null && SqlProvider.IsTakeSupported && !SqlProvider.IsSkipSupported)
+			{
+				if (context.SqlQuery.Select.SkipValue is SqlParameter && sql.Select.TakeValue is SqlValue)
+				{
+					var skip = (SqlParameter)sql.Select.SkipValue;
+					var parm = (SqlParameter)sql.Select.SkipValue.Clone(new Dictionary<ICloneableElement,ICloneableElement>(), _ => true);
+
+					parm.SetTakeConverter((int)((SqlValue)sql.Select.TakeValue).Value);
+
+					sql.Select.Take(parm);
+
+					var ep = (from pm in CurrentSqlParameters where pm.SqlParameter == skip select pm).First();
+
+					ep = new ParameterAccessor
+					{
+						Expression   = ep.Expression,
+						Accessor     = ep.Accessor,
+						SqlParameter = parm
+					};
+
+					CurrentSqlParameters.Add(ep);
+				}
+				else
+					sql.Select.Take(Convert(
+						context,
+						new SqlBinaryExpression(typeof(int), sql.Select.SkipValue, "+", sql.Select.TakeValue, Precedence.Additive)));
+			}
+
+			if (!SqlProvider.TakeAcceptsParameter)
+			{
+				var p = sql.Select.TakeValue as SqlParameter;
+
+				if (p != null)
+					p.IsQueryParameter = false;
+			}
+		}
+
+		#endregion
+
+		#region SubQueryToSql
+
+		public IBuildContext GetSubQuery(IBuildContext context, MethodCallExpression expr)
+		{
+			var info = new BuildInfo(context, expr, new SqlQuery { ParentSql = context.SqlQuery });
+			var ctx  = BuildSequence(info);
+
+			if (ctx.SqlQuery.Select.Columns.Count == 0 &&
+				(ctx.IsExpression(null, 0, RequestFor.Expression).Result ||
+				 ctx.IsExpression(null, 0, RequestFor.Field).     Result))
+			{
+				ctx.ConvertToIndex(null, 0, ConvertFlags.Field);
+			}
+
+			return ctx;
+		}
+
+		internal ISqlExpression SubQueryToSql(IBuildContext context, MethodCallExpression expression)
+		{
+			var sequence = GetSubQuery(context, expression);
+			var subSql   = sequence.GetSubQuery(context);
+
+			if (subSql != null)
+				return subSql;
+
+			var query    = context.SqlQuery;
+			var subQuery = sequence.SqlQuery;
+
+			// This code should be moved to context.
+			//
+			if (!query.GroupBy.IsEmpty && !subQuery.Where.IsEmpty)
+			{
+				var fromGroupBy = sequence.SqlQuery.Properties
+					.OfType<System.Tuple<string,SqlQuery>>()
+					.Where(p => p.Item1 == "from_group_by" && p.Item2 == context.SqlQuery)
+					.Any();
+
+				if (fromGroupBy)
+				{
+					if (subQuery.Select.Columns.Count == 1 &&
+					    subQuery.Select.Columns[0].Expression.ElementType == QueryElementType.SqlFunction &&
+					    subQuery.GroupBy.IsEmpty && !subQuery.Select.HasModifier && !subQuery.HasUnion &&
+					    subQuery.Where.SearchCondition.Conditions.Count == 1)
+					{
+						var cond = subQuery.Where.SearchCondition.Conditions[0];
+
+						if (cond.Predicate.ElementType == QueryElementType.ExprExprPredicate && query.GroupBy.Items.Count == 1 ||
+						    cond.Predicate.ElementType == QueryElementType.SearchCondition &&
+						    query.GroupBy.Items.Count == ((SqlQuery.SearchCondition)cond.Predicate).Conditions.Count)
+						{
+							var func = (SqlFunction)subQuery.Select.Columns[0].Expression;
+
+							if (CountBuilder.MethodNames.Contains(func.Name))
+								return SqlFunction.CreateCount(func.SystemType, query);
+						}
+					}
+				}
+			}
+
+			return sequence.SqlQuery;
+		}
+
+		#endregion
+
+		#region IsSubQuery
+
+		bool IsSubQuery(IBuildContext context, MethodCallExpression call)
+		{
+			if (call.IsQueryable())
+			{
+				var info = new BuildInfo(context, call, new SqlQuery { ParentSql = context.SqlQuery });
+
+				if (!IsSequence(info))
+					return false;
+
+				var arg = call.Arguments[0];
+
+				if (AggregationBuilder.MethodNames.Contains(call.Method.Name))
+					while (arg.NodeType == ExpressionType.Call && ((MethodCallExpression) arg).Method.Name == "Select")
+						arg = ((MethodCallExpression)arg).Arguments[0];
+
+				var mc = arg as MethodCallExpression;
+
+				while (mc != null)
+				{
+					if (!mc.IsQueryable())
+						return GetTableFunctionAttribute(mc.Method) != null;
+
+					mc = mc.Arguments[0] as MethodCallExpression;
+				}
+
+				return arg.NodeType == ExpressionType.Call || IsSubQuerySource(context, arg);
+			}
+
+			return false;
+		}
+
+		bool IsSubQuerySource(IBuildContext context, Expression expr)
+		{
+			if (expr == null)
+				return false;
+
+			var ctx = GetContext(context, expr);
+
+			if (ctx != null && ctx.IsExpression(expr, 0, RequestFor.Object).Result)
+				return true;
+
+			while (expr != null && expr.NodeType == ExpressionType.MemberAccess)
+				expr = ((MemberExpression)expr).Expression;
+
+			return expr != null && expr.NodeType == ExpressionType.Constant;
+		}
+
+		bool IsGroupJoinSource(IBuildContext context, MethodCallExpression call)
+		{
+			if (!call.IsQueryable() || CountBuilder.MethodNames.Contains(call.Method.Name))
+				return false;
+
+			Expression expr = call;
+
+			while (expr.NodeType == ExpressionType.Call)
+				expr = ((MethodCallExpression)expr).Arguments[0];
+
+			var ctx = GetContext(context, expr);
+
+			return ctx != null && ctx.IsExpression(expr, 0, RequestFor.GroupJoin).Result;
+		}
+
+		#endregion
+
+		#region ConvertExpression
+
+		interface IConvertHelper
+		{
+			Expression ConvertNull(MemberExpression expression);
+		}
+
+		class ConvertHelper<T> : IConvertHelper
+			where T : struct 
+		{
+			public Expression ConvertNull(MemberExpression expression)
+			{
+				return Expression.Call(
+					null,
+					ReflectionHelper.Expressor<T?>.MethodExpressor(p => Sql.ConvertNullable(p)),
+					expression.Expression);
+			}
+		}
+
+		Expression ConvertExpression(Expression expression)
+		{
+			return expression.Convert2(e =>
+			{
+				if (CanBeConstant(e) || CanBeCompiled(e))
+					return new ExpressionHelper.ConvertInfo(e, true);
+
+				switch (e.NodeType)
+				{
+					case ExpressionType.New:
+						{
+							var ex = ConvertNew((NewExpression)e);
+							if (ex != null)
+								return new ExpressionHelper.ConvertInfo(ConvertExpression(ex));
+							break;
+						}
+
+					case ExpressionType.Call:
+						{
+							var cm = ConvertMethod((MethodCallExpression)e);
+							if (cm != null)
+								return new ExpressionHelper.ConvertInfo(ConvertExpression(cm));
+							break;
+						}
+
+					case ExpressionType.MemberAccess:
+						{
+							var ma = (MemberExpression)e;
+							var l  = SqlProvider.ConvertMember(ma.Member);
+
+							if (l != null)
+							{
+								var body = l.Body.Unwrap();
+								var expr = body.Convert(wpi => wpi.NodeType == ExpressionType.Parameter ? ma.Expression : wpi);
+
+								if (expr.Type != e.Type)
+									expr = new ChangeTypeExpression(expr, e.Type);
+
+								return new ExpressionHelper.ConvertInfo(ConvertExpression(expr));
+							}
+
+							if (TypeHelper.IsNullableValueMember(ma.Member))
+							{
+								var ntype  = typeof(ConvertHelper<>).MakeGenericType(ma.Type);
+								var helper = (IConvertHelper)Activator.CreateInstance(ntype);
+								var expr   = helper.ConvertNull(ma);
+
+								return new ExpressionHelper.ConvertInfo(ConvertExpression(expr));
+							}
+
+							if (ma.Member.DeclaringType == typeof(TimeSpan))
+							{
+								switch (ma.Expression.NodeType)
+								{
+									case ExpressionType.Subtract       :
+									case ExpressionType.SubtractChecked:
+
+										Sql.DateParts datePart;
+
+										switch (ma.Member.Name)
+										{
+											case "TotalMilliseconds" : datePart = Sql.DateParts.Millisecond; break;
+											case "TotalSeconds"      : datePart = Sql.DateParts.Second;      break;
+											case "TotalMinutes"      : datePart = Sql.DateParts.Minute;      break;
+											case "TotalHours"        : datePart = Sql.DateParts.Hour;        break;
+											case "TotalDays"         : datePart = Sql.DateParts.Day;         break;
+											default                  : return new ExpressionHelper.ConvertInfo(e);
+										}
+
+										var ex     = (BinaryExpression)ma.Expression;
+										var method = ReflectionHelper.Expressor<object>.MethodExpressor(
+											_ => Sql.DateDiff(Sql.DateParts.Day, DateTime.MinValue, DateTime.MinValue));
+
+										var call   =
+											Expression.Convert(
+												Expression.Call(
+													null,
+													method,
+													Expression.Constant(datePart),
+													Expression.Convert(ex.Right, typeof(DateTime?)),
+													Expression.Convert(ex.Left,  typeof(DateTime?))),
+												typeof(double));
+
+										return new ExpressionHelper.ConvertInfo(ConvertExpression(call));
+								}
+							}
+
+							break;
+						}
+				}
+
+				return new ExpressionHelper.ConvertInfo(e);
+			});
+		}
+
+		Expression ConvertMethod(MethodCallExpression pi)
+		{
+			var l = SqlProvider.ConvertMember(pi.Method);
+			return l == null ? null : ConvertMethod(pi, l);
+		}
+
+		static Expression ConvertMethod(MethodCallExpression pi, LambdaExpression lambda)
+		{
+			var ef    = lambda.Body.Unwrap();
+			var parms = new Dictionary<string,int>(lambda.Parameters.Count);
+			var pn    = pi.Method.IsStatic ? 0 : -1;
+
+			foreach (var p in lambda.Parameters)
+				parms.Add(p.Name, pn++);
+
+			var pie = ef.Convert(wpi =>
+			{
+				if (wpi.NodeType == ExpressionType.Parameter)
+				{
+					int n;
+					if (parms.TryGetValue(((ParameterExpression)wpi).Name, out n))
+						return n < 0 ? pi.Object : pi.Arguments[n];
+				}
+
+				return wpi;
+			});
+
+			if (pi.Method.ReturnType != pie.Type)
+				pie = new ChangeTypeExpression(pie, pi.Method.ReturnType);
+
+			return pie;
+		}
+
+		Expression ConvertNew(NewExpression pi)
+		{
+			var lambda = SqlProvider.ConvertMember(pi.Constructor);
+
+			if (lambda != null)
+			{
+				var ef    = lambda.Body.Unwrap();
+				var parms = new Dictionary<string,int>(lambda.Parameters.Count);
+				var pn    = 0;
+
+				foreach (var p in lambda.Parameters)
+					parms.Add(p.Name, pn++);
+
+				return ef.Convert(wpi =>
+				{
+					if (wpi.NodeType == ExpressionType.Parameter)
+					{
+						var pe   = (ParameterExpression)wpi;
+						var n    = parms[pe.Name];
+						return pi.Arguments[n];
+					}
+
+					return wpi;
+				});
+			}
+
+			return null;
+		}
+
+		#endregion
+
+		#region BuildExpression
+
+		public SqlInfo[] ConvertExpressions(IBuildContext context, Expression expression, ConvertFlags queryConvertFlag)
+		{
+			expression = ConvertExpression(expression);
+
+			switch (expression.NodeType)
+			{
+				case ExpressionType.New :
+					{
+						var expr = (NewExpression)expression;
+
+// ReSharper disable ConditionIsAlwaysTrueOrFalse
+// ReSharper disable HeuristicUnreachableCode
+						if (expr.Members == null)
+							return Array<SqlInfo>.Empty;
+// ReSharper restore HeuristicUnreachableCode
+// ReSharper restore ConditionIsAlwaysTrueOrFalse
+
+						return expr.Arguments
+							.Select((arg,i) =>
+							{
+								var mi = expr.Members[i];
+								if (mi is MethodInfo)
+									mi = TypeHelper.GetPropertyByMethod((MethodInfo)mi);
+
+								return ConvertExpressions(context, arg, queryConvertFlag).Select(si => si.Clone(mi));
+							})
+							.SelectMany(si => si)
+							.ToArray();
+					}
+
+				case ExpressionType.MemberInit :
+					{
+						var expr = (MemberInitExpression)expression;
+						var dic  = TypeAccessor.GetAccessor(expr.Type)
+							.Select((m,i) => new { m, i })
+							.ToDictionary(_ => _.m.MemberInfo, _ => _.i);
+
+						return expr.Bindings
+							.Where  (b => b is MemberAssignment)
+							.Cast<MemberAssignment>()
+							.OrderBy(b => dic[b.Member])
+							.Select (a =>
+							{
+								var mi = a.Member;
+								if (mi is MethodInfo)
+									mi = TypeHelper.GetPropertyByMethod((MethodInfo)mi);
+
+								return ConvertExpressions(context, a.Expression, queryConvertFlag).Select(si => si.Clone(mi));
+							})
+							.SelectMany(si => si)
+							.ToArray();
+					}
+			}
+
+			var ctx = GetContext(context, expression);
+
+			if (ctx != null && ctx.IsExpression(expression, 0, RequestFor.Object).Result)
+				return ctx.ConvertToSql(expression, 0, queryConvertFlag);
+
+			return new[] { new SqlInfo { Sql = ConvertToSql(context, expression, false) } };
+		}
+
+		public ISqlExpression ConvertToSqlExpression(IBuildContext context, Expression expression, bool convertEnum)
+		{
+			var expr = ConvertExpression(expression);
+			return ConvertToSql(context, expr, false, convertEnum);
+		}
+
+#if FW3
+		public ISqlExpression ConvertToSql(IBuildContext context, Expression expression, bool unwrap)
+		{
+			return ConvertToSql(context, expression, unwrap, true);
+		}
+#endif
+
+		public ISqlExpression ConvertToSql(IBuildContext context, Expression expression, bool unwrap, bool convertEnum
+#if !FW3
+			= true
+#endif
+			)
+		{
+			if (CanBeConstant(expression))
+				return BuildConstant(expression, convertEnum);
+
+			if (CanBeCompiled(expression))
+				return BuildParameter(expression).SqlParameter;
+
+			if (unwrap)
+				expression = expression.Unwrap();
+
+			switch (expression.NodeType)
+			{
+				case ExpressionType.AndAlso            :
+				case ExpressionType.OrElse             :
+				case ExpressionType.Not                :
+				case ExpressionType.Equal              :
+				case ExpressionType.NotEqual           :
+				case ExpressionType.GreaterThan        :
+				case ExpressionType.GreaterThanOrEqual :
+				case ExpressionType.LessThan           :
+				case ExpressionType.LessThanOrEqual    :
+					{
+						var condition = new SqlQuery.SearchCondition();
+						BuildSearchCondition(context, expression, condition.Conditions);
+						return condition;
+					}
+
+				case ExpressionType.And                :
+				case ExpressionType.Or                 :
+					{
+						if (expression.Type == typeof(bool))
+							goto case ExpressionType.AndAlso;
+						goto case ExpressionType.Add;
+					}
+
+				case ExpressionType.Add                :
+				case ExpressionType.AddChecked         :
+				case ExpressionType.Divide             :
+				case ExpressionType.ExclusiveOr        :
+				case ExpressionType.Modulo             :
+				case ExpressionType.Multiply           :
+				case ExpressionType.MultiplyChecked    :
+				case ExpressionType.Power              :
+				case ExpressionType.Subtract           :
+				case ExpressionType.SubtractChecked    :
+				case ExpressionType.Coalesce           :
+					{
+						var e = (BinaryExpression)expression;
+						var l = ConvertToSql(context, e.Left,  false);
+						var r = ConvertToSql(context, e.Right, false);
+						var t = e.Type;
+
+						switch (expression.NodeType)
+						{
+							case ExpressionType.Add             :
+							case ExpressionType.AddChecked      : return Convert(context, new SqlBinaryExpression(t, l, "+", r, Precedence.Additive));
+							case ExpressionType.And             : return Convert(context, new SqlBinaryExpression(t, l, "&", r, Precedence.Bitwise));
+							case ExpressionType.Divide          : return Convert(context, new SqlBinaryExpression(t, l, "/", r, Precedence.Multiplicative));
+							case ExpressionType.ExclusiveOr     : return Convert(context, new SqlBinaryExpression(t, l, "^", r, Precedence.Bitwise));
+							case ExpressionType.Modulo          : return Convert(context, new SqlBinaryExpression(t, l, "%", r, Precedence.Multiplicative));
+							case ExpressionType.Multiply:
+							case ExpressionType.MultiplyChecked : return Convert(context, new SqlBinaryExpression(t, l, "*", r, Precedence.Multiplicative));
+							case ExpressionType.Or              : return Convert(context, new SqlBinaryExpression(t, l, "|", r, Precedence.Bitwise));
+							case ExpressionType.Power           : return Convert(context, new SqlFunction(t, "Power", l, r));
+							case ExpressionType.Subtract        :
+							case ExpressionType.SubtractChecked : return Convert(context, new SqlBinaryExpression(t, l, "-", r, Precedence.Subtraction));
+							case ExpressionType.Coalesce        :
+								{
+									if (r is SqlFunction)
+									{
+										var c = (SqlFunction)r;
+
+										if (c.Name == "Coalesce")
+										{
+											var parms = new ISqlExpression[c.Parameters.Length + 1];
+
+											parms[0] = l;
+											c.Parameters.CopyTo(parms, 1);
+
+											return Convert(context, new SqlFunction(t, "Coalesce", parms));
+										}
+									}
+
+									return Convert(context, new SqlFunction(t, "Coalesce", l, r));
+								}
+						}
+
+						break;
+					}
+
+				case ExpressionType.UnaryPlus      :
+				case ExpressionType.Negate         :
+				case ExpressionType.NegateChecked  :
+					{
+						var e = (UnaryExpression)expression;
+						var o = ConvertToSql(context, e.Operand, false);
+						var t = e.Type;
+
+						switch (expression.NodeType)
+						{
+							case ExpressionType.UnaryPlus     : return o;
+							case ExpressionType.Negate        :
+							case ExpressionType.NegateChecked :
+								return Convert(context, new SqlBinaryExpression(t, new SqlValue(-1), "*", o, Precedence.Multiplicative));
+						}
+
+						break;
+					}
+
+				case ExpressionType.Convert        :
+				case ExpressionType.ConvertChecked :
+					{
+						var e = (UnaryExpression)expression;
+						var o = ConvertToSql(context, e.Operand, false);
+
+						if (e.Method == null && e.IsLifted)
+							return o;
+
+						var t = e.Operand.Type;
+						var s = SqlDataType.GetDataType(t);
+
+						if (o.SystemType != null && s.Type == typeof(object))
+						{
+							t = o.SystemType;
+							s = SqlDataType.GetDataType(t);
+						}
+
+						if (e.Type == t ||
+							t.IsEnum && Enum.GetUnderlyingType(t) == e.Type ||
+							e.Type.IsEnum && Enum.GetUnderlyingType(e.Type) == t)
+							return o;
+
+						return Convert(
+							context,
+							new SqlFunction(e.Type, "$Convert$", SqlDataType.GetDataType(e.Type), s, o));
+					}
+
+				case ExpressionType.Conditional    :
+					{
+						var e = (ConditionalExpression)expression;
+						var s = ConvertToSql(context, e.Test,    false);
+						var t = ConvertToSql(context, e.IfTrue,  false);
+						var f = ConvertToSql(context, e.IfFalse, false);
+
+						if (f is SqlFunction)
+						{
+							var c = (SqlFunction)f;
+
+							if (c.Name == "CASE")
+							{
+								var parms = new ISqlExpression[c.Parameters.Length + 2];
+
+								parms[0] = s;
+								parms[1] = t;
+								c.Parameters.CopyTo(parms, 2);
+
+								return Convert(context, new SqlFunction(e.Type, "CASE", parms));
+							}
+						}
+
+						return Convert(context, new SqlFunction(e.Type, "CASE", s, t, f));
+					}
+
+				case ExpressionType.MemberAccess :
+					{
+						var ma   = (MemberExpression)expression;
+						var attr = GetFunctionAttribute(ma.Member);
+
+						if (attr != null)
+							return Convert(context, attr.GetExpression(ma.Member));
+
+						var ctx = GetContext(context, expression);
+
+						if (ctx != null)
+						{
+							var sql = ctx.ConvertToSql(expression, 0, ConvertFlags.Field);
+
+							switch (sql.Length)
+							{
+								case 0  : break;
+								case 1  : return sql[0].Sql;
+								default : throw new InvalidOperationException();
+							}
+						}
+
+						break;
+					}
+
+				case ExpressionType.Parameter   :
+					{
+						var ctx = GetContext(context, expression);
+
+						if (ctx != null)
+						{
+							var sql = ctx.ConvertToSql(expression, 0, ConvertFlags.Field);
+
+							switch (sql.Length)
+							{
+								case 0  : break;
+								case 1  : return sql[0].Sql;
+								default : throw new InvalidOperationException();
+							}
+						}
+
+						break;
+					}
+
+				case ExpressionType.Call        :
+					{
+						var e = (MethodCallExpression)expression;
+
+						if (e.IsQueryable())
+						{
+							if (IsSubQuery(context, e))
+								return SubQueryToSql(context, e);
+
+							if (CountBuilder.MethodNames.Concat(AggregationBuilder.MethodNames).Contains(e.Method.Name))
+							{
+								var ctx = GetContext(context, expression);
+
+								if (ctx != null)
+								{
+									var sql = ctx.ConvertToSql(expression, 0, ConvertFlags.Field);
+
+									if (sql.Length != 1)
+										throw new InvalidOperationException();
+
+									return sql[0].Sql;
+								}
+
+								break;
+							}
+
+							return SubQueryToSql(context, e);
+						}
+
+						var attr = GetFunctionAttribute(e.Method);
+
+						if (attr != null)
+						{
+							var parms = new List<ISqlExpression>();
+
+							if (e.Object != null)
+								parms.Add(ConvertToSql(context, e.Object, false));
+
+							parms.AddRange(e.Arguments.Select(t => ConvertToSql(context, t, false)));
+
+							return Convert(context, attr.GetExpression(e.Method, parms.ToArray()));
+						}
+
+						break;
+					}
+
+				case ExpressionType.Invoke :
+					{
+						var pi = (InvocationExpression)expression;
+						var ex = pi.Expression;
+
+						if (ex.NodeType == ExpressionType.Quote)
+							ex = ((UnaryExpression)ex).Operand;
+
+						if (ex.NodeType == ExpressionType.Lambda)
+						{
+							var l   = (LambdaExpression)ex;
+							var dic = new Dictionary<Expression,Expression>();
+
+							for (var i = 0; i < l.Parameters.Count; i++)
+								dic.Add(l.Parameters[i], pi.Arguments[i]);
+
+							var pie = l.Body.Convert(wpi =>
+							{
+								Expression ppi;
+								return dic.TryGetValue(wpi, out ppi) ? ppi : wpi;
+							});
+
+							return ConvertToSql(context, pie, false);
+						}
+
+						break;
+					}
+
+				case ExpressionType.TypeIs :
+					{
+						var condition = new SqlQuery.SearchCondition();
+						BuildSearchCondition(context, expression, condition.Conditions);
+						return condition;
+					}
+
+				case (ExpressionType)ChangeTypeExpression.ChangeTypeType :
+					return ConvertToSql(context, ((ChangeTypeExpression)expression).Expression, false);
+			}
+
+			if (expression.Type == typeof(bool) && _convertedPredicates.Add(expression))
+			{
+				var predicate = ConvertPredicate(context, expression);
+				_convertedPredicates.Remove(expression);
+				if (predicate != null)
+					return new SqlQuery.SearchCondition(new SqlQuery.Condition(false, predicate));
+			}
+
+			throw new LinqException("'{0}' cannot be converted to SQL.", expression);
+		}
+
+		readonly HashSet<Expression> _convertedPredicates = new HashSet<Expression>();
+
+		#endregion
+
+		#region IsServerSideOnly
+
+		bool IsServerSideOnly(Expression expr)
+		{
+			switch (expr.NodeType)
+			{
+				case ExpressionType.MemberAccess:
+					{
+						var ex = (MemberExpression)expr;
+						var l  = SqlProvider.ConvertMember(ex.Member);
+
+						if (l != null)
+							return IsServerSideOnly(l.Body.Unwrap());
+
+						var attr = GetFunctionAttribute(ex.Member);
+						return attr != null && attr.ServerSideOnly;
+					}
+
+				case ExpressionType.Call:
+					{
+						var e = (MethodCallExpression)expr;
+
+						if (e.Method.DeclaringType == typeof(Enumerable))
+						{
+							if (CountBuilder.MethodNames.Concat(AggregationBuilder.MethodNames).Contains(e.Method.Name))
+								return IsQueryMember(e.Arguments[0]);
+						}
+						else if (e.Method.DeclaringType == typeof(Queryable))
+						{
+							switch (e.Method.Name)
+							{
+								case "Any"      :
+								case "All"      :
+								case "Contains" : return true;
+							}
+						}
+						else
+						{
+							var l = SqlProvider.ConvertMember(e.Method);
+
+							if (l != null)
+								return l.Body.Unwrap().Find(IsServerSideOnly) != null;
+
+							var attr = GetFunctionAttribute(e.Method);
+							return attr != null && attr.ServerSideOnly;
+						}
+
+						break;
+					}
+			}
+
+			return false;
+		}
+
+		static bool IsQueryMember(Expression expr)
+		{
+			if (expr != null) switch (expr.NodeType)
+			{
+				case ExpressionType.Parameter    : return true;
+				case ExpressionType.MemberAccess : return IsQueryMember(((MemberExpression)expr).Expression);
+				case ExpressionType.Call         :
+					{
+						var call = (MethodCallExpression)expr;
+
+						if (call.Method.DeclaringType == typeof(Queryable))
+							return true;
+
+						if (call.Method.DeclaringType == typeof(Enumerable) && call.Arguments.Count > 0)
+							return IsQueryMember(call.Arguments[0]);
+
+						return IsQueryMember(call.Object);
+					}
+			}
+
+			return false;
+		}
+
+		#endregion
+
+		#region CanBeConstant
+
+		bool CanBeConstant(Expression expr)
+		{
+			return null == expr.Find(ex =>
+			{
+				if (ex is BinaryExpression || ex is UnaryExpression /*|| ex.NodeType == ExpressionType.Convert*/)
+					return false;
+
+				switch (ex.NodeType)
+				{
+					case ExpressionType.Constant     :
+						{
+							var c = (ConstantExpression)ex;
+
+							if (c.Value == null || ExpressionHelper.IsConstant(ex.Type))
+								return false;
+
+							break;
+						}
+
+					case ExpressionType.MemberAccess :
+						{
+							var ma = (MemberExpression)ex;
+
+							if (ExpressionHelper.IsConstant(ma.Member.DeclaringType) || TypeHelper.IsNullableValueMember(ma.Member))
+								return false;
+
+							break;
+						}
+
+					case ExpressionType.Call         :
+						{
+							var mc = (MethodCallExpression)ex;
+
+							if (ExpressionHelper.IsConstant(mc.Method.DeclaringType) || mc.Method.DeclaringType == typeof(object))
+								return false;
+
+							var attr = GetFunctionAttribute(mc.Method);
+
+							if (attr != null && !attr.ServerSideOnly)
+								return false;
+
+							break;
+						}
+				}
+
+				return true;
+			});
+		}
+
+		#endregion
+
+		#region CanBeCompiled
+
+		bool CanBeCompiled(Expression expr)
+		{
+			return null == expr.Find(ex =>
+			{
+				if (IsServerSideOnly(ex))
+					return true;
+
+				switch (ex.NodeType)
+				{
+					case ExpressionType.Parameter    :
+						return ex != ParametersParam;
+
+					case ExpressionType.MemberAccess :
+						{
+							var attr = GetFunctionAttribute(((MemberExpression)ex).Member);
+							return attr != null && attr.ServerSideOnly;
+						}
+
+					case ExpressionType.Call         :
+						{
+							var attr = GetFunctionAttribute(((MethodCallExpression)ex).Method);
+							return attr != null && attr.ServerSideOnly;
+						}
+				}
+
+				return false;
+			});
+		}
+
+		#endregion
+
+		#region Build Constant
+
+		readonly Dictionary<Expression,SqlValue> _constants = new Dictionary<Expression,SqlValue>();
+
+		SqlValue BuildConstant(Expression expr, bool convertEnum)
+		{
+			SqlValue value;
+
+			if (_constants.TryGetValue(expr, out value))
+				return value;
+
+			var lambda = Expression.Lambda<Func<object>>(Expression.Convert(expr, typeof(object)));
+			var v      = lambda.Compile()();
+
+			if (v != null && convertEnum && v.GetType().IsEnum)
+			{
+				var attrs = v.GetType().GetCustomAttributes(typeof(SqlEnumAttribute), true);
+
+				v = Map.EnumToValue(v, attrs.Length == 0);
+			}
+
+			value = new SqlValue(v);
+
+			_constants.Add(expr, value);
+
+			return value;
+		}
+
+		#endregion
+
+		#region Build Parameter
+
+		readonly Dictionary<Expression,ParameterAccessor> _parameters = new Dictionary<Expression, ParameterAccessor>();
+
+		public readonly HashSet<Expression> AsParameters = new HashSet<Expression>();
+
+		ParameterAccessor BuildParameter(Expression expr)
+		{
+			ParameterAccessor p;
+
+			if (_parameters.TryGetValue(expr, out p))
+				return p;
+
+			string name = null;
+
+			var newExpr = ReplaceParameter(_expressionAccessors, expr, nm => name = nm);
+			var mapper  = Expression.Lambda<Func<Expression,object[],object>>(
+				Expression.Convert(newExpr, typeof(object)),
+				new [] { ExpressionParam, ParametersParam });
+
+			p = new ParameterAccessor
+			{
+				Expression   = expr,
+				Accessor     = mapper.Compile(),
+				SqlParameter = new SqlParameter(expr.Type, name, null, MappingSchema)
+			};
+
+			_parameters.Add(expr, p);
+			CurrentSqlParameters.Add(p);
+
+			return p;
+		}
+
+		Expression ReplaceParameter(IDictionary<Expression,Expression> expressionAccessors, Expression expression, Action<string> setName)
+		{
+			return expression.Convert(expr =>
+			{
+				if (expr.NodeType == ExpressionType.Constant)
+				{
+					var c = (ConstantExpression)expr;
+
+					if (!ExpressionHelper.IsConstant(expr.Type) || AsParameters.Contains(c))
+					{
+						Expression val;
+						
+						if (expressionAccessors.TryGetValue(expr, out val))
+						{
+							expr = Expression.Convert(val, expr.Type);
+
+							if (expression.NodeType == ExpressionType.MemberAccess)
+							{
+								var ma = (MemberExpression)expression;
+								setName(ma.Member.Name);
+							}
+						}
+					}
+				}
+
+				return expr;
+			});
+		}
+
+		#endregion
+
+		#region Predicate Converter
+
+		ISqlPredicate ConvertPredicate(IBuildContext context, Expression expression)
+		{
+			switch (expression.NodeType)
+			{
+				case ExpressionType.Equal              :
+				case ExpressionType.NotEqual           :
+				case ExpressionType.GreaterThan        :
+				case ExpressionType.GreaterThanOrEqual :
+				case ExpressionType.LessThan           :
+				case ExpressionType.LessThanOrEqual    :
+					{
+						var e = (BinaryExpression)expression;
+						return ConvertCompare(context, expression.NodeType, e.Left, e.Right);
+					}
+
+				case ExpressionType.Call               :
+					{
+						var e = (MethodCallExpression)expression;
+
+						ISqlPredicate predicate = null;
+
+						if (e.Method.Name == "Equals" && e.Object != null && e.Arguments.Count == 1)
+							return ConvertCompare(context, ExpressionType.Equal, e.Object, e.Arguments[0]);
+
+						if (e.Method.DeclaringType == typeof(string))
+						{
+							switch (e.Method.Name)
+							{
+								case "Contains"   : predicate = ConvertLikePredicate(context, e, "%", "%"); break;
+								case "StartsWith" : predicate = ConvertLikePredicate(context, e, "",  "%"); break;
+								case "EndsWith"   : predicate = ConvertLikePredicate(context, e, "%", "");  break;
+							}
+						}
+						else if (e.Method.Name == "Contains")
+						{
+							if (e.Method.DeclaringType == typeof(Enumerable) ||
+							    TypeHelper.IsSameOrParent(typeof(IList), e.Method.DeclaringType) ||
+							    TypeHelper.IsSameOrParent(typeof(ICollection<>), e.Method.DeclaringType))
+							{
+								predicate = ConvertInPredicate(context, e);
+							}
+						}
+						else if (e.Method.Name == "ContainsValue" && TypeHelper.IsSameOrParent(typeof(Dictionary<,>), e.Method.DeclaringType))
+						{
+							var args = TypeHelper.GetGenericArguments(e.Method.DeclaringType, typeof(Dictionary<,>));
+							var minf = EnumerableMethods
+								.First(m => m.Name == "Contains" && m.GetParameters().Length == 2)
+								.MakeGenericMethod(args[1]);
+
+							var expr = Expression.Call(
+								minf, 
+								Expression.PropertyOrField(e.Object, "Values"),
+								e.Arguments[0]);
+
+							predicate = ConvertInPredicate(context, expr);
+						}
+						else if (e.Method.Name == "ContainsKey" && TypeHelper.IsSameOrParent(typeof(IDictionary<,>), e.Method.DeclaringType))
+						{
+							var args = TypeHelper.GetGenericArguments(e.Method.DeclaringType, typeof(IDictionary<,>));
+							var minf = EnumerableMethods
+								.First(m => m.Name == "Contains" && m.GetParameters().Length == 2)
+								.MakeGenericMethod(args[0]);
+
+							var expr = Expression.Call(
+								minf, 
+								Expression.PropertyOrField(e.Object, "Keys"),
+								e.Arguments[0]);
+
+							predicate = ConvertInPredicate(context, expr);
+						}
+#if !SILVERLIGHT
+						else if (e.Method == ReflectionHelper.Functions.String.Like11) predicate = ConvertLikePredicate(context, e);
+						else if (e.Method == ReflectionHelper.Functions.String.Like12) predicate = ConvertLikePredicate(context, e);
+#endif
+						else if (e.Method == ReflectionHelper.Functions.String.Like21) predicate = ConvertLikePredicate(context, e);
+						else if (e.Method == ReflectionHelper.Functions.String.Like22) predicate = ConvertLikePredicate(context, e);
+
+						if (predicate != null)
+							return Convert(context, predicate);
+
+						break;
+					}
+
+				case ExpressionType.Conditional  :
+					return Convert(context,
+						new SqlQuery.Predicate.ExprExpr(
+							ConvertToSql(context, expression, false),
+							SqlQuery.Predicate.Operator.Equal,
+							new SqlValue(true)));
+
+				case ExpressionType.MemberAccess :
+					{
+						var e = (MemberExpression)expression;
+
+						if (e.Member.Name == "HasValue" && 
+							e.Member.DeclaringType.IsGenericType && 
+							e.Member.DeclaringType.GetGenericTypeDefinition() == typeof(Nullable<>))
+						{
+							var expr = ConvertToSql(context, e.Expression, false);
+							return Convert(context, new SqlQuery.Predicate.IsNull(expr, true));
+						}
+
+						break;
+					}
+
+				case ExpressionType.TypeIs:
+					{
+						var e   = (TypeBinaryExpression)expression;
+						var ctx = GetContext(context, e.Expression);
+
+						if (ctx != null && ctx.IsExpression(e.Expression, 0, RequestFor.Table).Result)
+							return MakeIsPredicate(ctx, e);
+
+						break;
+					}
+			}
+
+			var ex = ConvertToSql(context, expression, false);
+
+			if (SqlExpression.NeedsEqual(ex))
+				return Convert(context, new SqlQuery.Predicate.ExprExpr(ex, SqlQuery.Predicate.Operator.Equal, new SqlValue(true)));
+
+			return Convert(context, new SqlQuery.Predicate.Expr(ex));
+		}
+
+		#region ConvertCompare
+
+		ISqlPredicate ConvertCompare(IBuildContext context, ExpressionType nodeType, Expression left, Expression right)
+		{
+			if (left.NodeType == ExpressionType.Convert && left.Type == typeof(int) && right.NodeType == ExpressionType.Constant)
+			{
+				var conv = (UnaryExpression)left;
+
+				if (conv.Operand.Type == typeof(char))
+				{
+					left  = conv.Operand;
+					right = Expression.Constant(ConvertTo<char>.From(((ConstantExpression)right).Value));
+				}
+			}
+
+			if (right.NodeType == ExpressionType.Convert && right.Type == typeof(int) && left.NodeType == ExpressionType.Constant)
+			{
+				var conv = (UnaryExpression)right;
+
+				if (conv.Operand.Type == typeof(char))
+				{
+					right = conv.Operand;
+					left  = Expression.Constant(ConvertTo<char>.From(((ConstantExpression)left).Value));
+				}
+			}
+
+			#region special case for char?
+
+//			if (left.NodeType == ExpressionType.Convert && left.Type == typeof(int?) && right.NodeType == ExpressionType.Convert)
+//			{
+//				var convLeft  = left  as UnaryExpression;
+//				var convRight = right as UnaryExpression;
+//
+//				if (convLeft != null && convRight != null && convLeft.Operand.Type == typeof(char?))
+//				{
+//					left  = convLeft.Operand;
+//					right = Expression.Constant(ConvertTo<char?>.From(((ConstantExpression)convRight.Operand).Value));
+//				}
+//			}
+
+			#endregion
+
+			switch (nodeType)
+			{
+				case ExpressionType.Equal    :
+				case ExpressionType.NotEqual :
+
+					var p = ConvertObjectComparison(nodeType, context, left, context, right);
+					if (p != null)
+						return p;
+
+					p = ConvertObjectNullComparison(context, left, right, nodeType == ExpressionType.Equal);
+					if (p != null)
+						return p;
+
+					p = ConvertObjectNullComparison(context, right, left, nodeType == ExpressionType.Equal);
+					if (p != null)
+						return p;
+
+					if (left.NodeType == ExpressionType.New || right.NodeType == ExpressionType.New)
+					{
+						p = ConvertNewObjectComparison(context, nodeType, left, right);
+						if (p != null)
+							return p;
+					}
+
+					break;
+			}
+
+			SqlQuery.Predicate.Operator op;
+
+			switch (nodeType)
+			{
+				case ExpressionType.Equal             : op = SqlQuery.Predicate.Operator.Equal;          break;
+				case ExpressionType.NotEqual          : op = SqlQuery.Predicate.Operator.NotEqual;       break;
+				case ExpressionType.GreaterThan       : op = SqlQuery.Predicate.Operator.Greater;        break;
+				case ExpressionType.GreaterThanOrEqual: op = SqlQuery.Predicate.Operator.GreaterOrEqual; break;
+				case ExpressionType.LessThan          : op = SqlQuery.Predicate.Operator.Less;           break;
+				case ExpressionType.LessThanOrEqual   : op = SqlQuery.Predicate.Operator.LessOrEqual;    break;
+				default: throw new InvalidOperationException();
+			}
+
+			if (left.NodeType == ExpressionType.Convert || right.NodeType == ExpressionType.Convert
+				|| left.NodeType == ExpressionType.MemberAccess || right.NodeType == ExpressionType.MemberAccess)
+			{
+				var p = ConvertEnumConversion(context, left, op, right);
+				if (p != null)
+					return p;
+			}
+
+			var l = ConvertToSql(context, left,  false);
+			var r = ConvertToSql(context, right, true);
+
+			switch (nodeType)
+			{
+				case ExpressionType.Equal   :
+				case ExpressionType.NotEqual:
+
+					if (!context.SqlQuery.IsParameterDependent && (l is SqlParameter || r is SqlParameter) && l.CanBeNull() && r.CanBeNull())
+						context.SqlQuery.IsParameterDependent = true;
+
+					// | (SqlQuery(Select([]) as q), SqlValue(null))
+					// | (SqlValue(null), SqlQuery(Select([]) as q))  =>
+
+					SqlQuery q =
+						l.ElementType == QueryElementType.SqlQuery &&
+						r.ElementType == QueryElementType.SqlValue &&
+						((SqlValue)r).Value == null &&
+						((SqlQuery)l).Select.Columns.Count == 0 ?
+							(SqlQuery)l :
+						r.ElementType == QueryElementType.SqlQuery &&
+						l.ElementType == QueryElementType.SqlValue &&
+						((SqlValue)l).Value == null &&
+						((SqlQuery)r).Select.Columns.Count == 0 ?
+							(SqlQuery)r :
+							null;
+
+					if (q != null)
+					{
+						q.Select.Columns.Add(new SqlQuery.Column(q, new SqlValue(1)));
+					}
+
+					break;
+			}
+
+			if (l is SqlQuery.SearchCondition)
+				l = Convert(context, new SqlFunction(typeof(bool), "CASE", l, new SqlValue(true), new SqlValue(false)));
+
+			if (r is SqlQuery.SearchCondition)
+				r = Convert(context, new SqlFunction(typeof(bool), "CASE", r, new SqlValue(true), new SqlValue(false)));
+
+			return Convert(context, new SqlQuery.Predicate.ExprExpr(l, op, r));
+		}
+
+		#endregion
+
+		#region ConvertEnumConversion
+
+		ISqlPredicate ConvertEnumConversion(IBuildContext context, Expression left, SqlQuery.Predicate.Operator op, Expression right)
+		{
+			Expression value;
+			Expression operand;
+
+			if (left is MemberExpression)
+			{
+				operand = left;
+				value   = right;
+			}
+			else if (left.NodeType == ExpressionType.Convert && ((UnaryExpression)left).Operand is MemberExpression)
+			{
+				operand = ((UnaryExpression)left).Operand;
+				value   = right;
+			}
+			else if (right is MemberExpression)
+			{
+				operand = right;
+				value   = left;
+			}
+			else if (right.NodeType == ExpressionType.Convert && ((UnaryExpression)right).Operand is MemberExpression)
+			{
+				operand = ((UnaryExpression)right).Operand;
+				value   = left;
+			}
+			else if (left.NodeType == ExpressionType.Convert)
+			{
+				operand = ((UnaryExpression)left).Operand;
+				value   = right;
+			}
+			else
+			{
+				operand = ((UnaryExpression)right).Operand;
+				value = left;
+			}
+
+			var type = operand.Type;
+
+			if (!TypeHelper.IsEnumOrNullableEnum(type))
+				return null;
+
+			var dic = new Dictionary<object,object>();
+
+			var nullValue = MappingSchema.GetNullValue(type);
+
+			if (nullValue != null)
+				dic.Add(nullValue, null);
+
+			var mapValues = MappingSchema.GetMapValues(type);
+
+			if (mapValues != null)
+				foreach (var mv in mapValues)
+					if (!dic.ContainsKey(mv.OrigValue))
+						dic.Add(mv.OrigValue, mv.MapValues[0]);
+
+			switch (value.NodeType)
+			{
+				case ExpressionType.Constant:
+					{
+						var name = Enum.GetName(type, ((ConstantExpression)value).Value);
+
+// ReSharper disable ConditionIsAlwaysTrueOrFalse
+// ReSharper disable HeuristicUnreachableCode
+						if (name == null)
+							return null;
+// ReSharper restore HeuristicUnreachableCode
+// ReSharper restore ConditionIsAlwaysTrueOrFalse
+
+						var origValue = Enum.Parse(type, name, false);
+						var mapValue  = origValue;
+
+						if (!(operand is MemberExpression))
+						{
+							if (!dic.TryGetValue(origValue, out mapValue))
+								return null;
+						}
+
+						ISqlExpression l, r;
+
+						SqlValue sqlValue;
+
+						if (left.NodeType == ExpressionType.Convert)
+						{
+							l = ConvertToSql(context, operand, false);
+							r = sqlValue = new SqlValue(mapValue);
+						}
+						else
+						{
+							r = ConvertToSql(context, operand, false);
+							l = sqlValue = new SqlValue(mapValue);
+						}
+
+						if (operand is MemberExpression)
+						{
+							var me = (MemberExpression)operand;
+							var memberAccessor = TypeAccessor.GetAccessor(me.Member.DeclaringType)[me.Member.Name];
+							sqlValue.SetEnumConverter(memberAccessor, MappingSchema);
+						}
+
+
+						return Convert(context, new SqlQuery.Predicate.ExprExpr(l, op, r));
+					}
+
+				case ExpressionType.Convert:
+					{
+						value = ((UnaryExpression)value).Operand;
+
+						var l = ConvertToSql(context, operand, false, false);
+						var r = ConvertToSql(context, value,   false, false);
+
+						MemberAccessor memberAccessor = null;
+
+						if (operand is MemberExpression)
+						{
+							// is it even possible that operand is not MemberExpression?
+							// if no, then we can remove this two last uses of SetEnumConverter(type, map)
+							// and other depending code
+							// At least currently there is no test coverage for this method and I didn't
+							// manage to create such test
+							var me = (MemberExpression)operand;
+							memberAccessor = TypeAccessor.GetAccessor(me.Member.DeclaringType)[me.Member.Name];
+						}
+
+						if (l is SqlValueBase)
+						{
+							if (memberAccessor != null)
+							{
+								((SqlValueBase)l).SetEnumConverter(memberAccessor, MappingSchema);
+							}
+							else
+							{
+								((SqlValueBase)l).SetEnumConverter(type, MappingSchema);
+							}
+						}
+
+						if (r is SqlValueBase)
+						{
+							if (memberAccessor != null)
+							{
+								((SqlValueBase)r).SetEnumConverter(memberAccessor, MappingSchema);
+							}
+							else
+							{
+								((SqlValueBase)r).SetEnumConverter(type, MappingSchema);
+							}
+						}
+
+						return Convert(context, new SqlQuery.Predicate.ExprExpr(l, op, r));
+					}
+			}
+
+			return null;
+		}
+
+		#endregion
+
+		#region ConvertObjectNullComparison
+
+		ISqlPredicate ConvertObjectNullComparison(IBuildContext context, Expression left, Expression right, bool isEqual)
+		{
+			if (right.NodeType == ExpressionType.Constant && ((ConstantExpression)right).Value == null)
+			{
+				if (left.NodeType == ExpressionType.MemberAccess || left.NodeType == ExpressionType.Parameter)
+				{
+					var ctx = GetContext(context, left);
+
+					if (ctx != null && ctx.IsExpression(left, 0, RequestFor.Object).Result ||
+						left.NodeType == ExpressionType.Parameter && ctx.IsExpression(left, 0, RequestFor.Field).Result)
+					{
+						return new SqlQuery.Predicate.Expr(new SqlValue(!isEqual));
+					}
+				}
+			}
+
+			return null;
+		}
+
+		#endregion
+
+		#region ConvertObjectComparison
+
+		public ISqlPredicate ConvertObjectComparison(
+			ExpressionType nodeType,
+			IBuildContext  leftContext,
+			Expression     left,
+			IBuildContext  rightContext,
+			Expression     right)
+		{
+			var qsl = GetContext(leftContext,  left);
+			var qsr = GetContext(rightContext, right);
+
+			var sl = qsl != null && qsl.IsExpression(left,  0, RequestFor.Object).Result;
+			var sr = qsr != null && qsr.IsExpression(right, 0, RequestFor.Object).Result;
+
+			bool      isNull;
+			SqlInfo[] lcols;
+
+			var rmembers = new Dictionary<MemberInfo,Expression>(new MemberInfoComparer());
+
+			if (sl == false && sr == false)
+			{
+				var lmembers = new Dictionary<MemberInfo,Expression>(new MemberInfoComparer());
+
+				if (!ProcessProjection(lmembers, left) && !ProcessProjection(rmembers, right))
+					return null;
+
+				if (lmembers.Count == 0)
+				{
+					var r = right;
+					right = left;
+					left  = r;
+
+					var c = rightContext;
+					rightContext = leftContext;
+					leftContext  = c;
+
+					var q = qsr;
+					qsl = q;
+
+					sr = false;
+
+					var lm = lmembers;
+					lmembers = rmembers;
+					rmembers = lm;
+				}
+
+				isNull = right is ConstantExpression && ((ConstantExpression)right).Value == null;
+				lcols  = lmembers.Select(m => new SqlInfo(m.Key) { Sql = ConvertToSql(leftContext, m.Value, false) }).ToArray();
+			}
+			else
+			{
+				if (sl == false)
+				{
+					var r = right;
+					right = left;
+					left  = r;
+
+					var c = rightContext;
+					rightContext = leftContext;
+					leftContext  = c;
+
+					var q = qsr;
+					qsl = q;
+
+					sr = false;
+				}
+
+				isNull = right is ConstantExpression && ((ConstantExpression)right).Value == null;
+				lcols  = qsl.ConvertToSql(left, 0, ConvertFlags.Key);
+
+				if (!sr)
+					ProcessProjection(rmembers, right);
+			}
+
+			if (lcols.Length == 0)
+				return null;
+
+			var condition = new SqlQuery.SearchCondition();
+
+			foreach (var lcol in lcols)
+			{
+				if (lcol.Members.Count == 0)
+					throw new InvalidOperationException();
+
+				ISqlExpression rcol = null;
+
+				var lmember = lcol.Members[lcol.Members.Count - 1];
+
+				if (sr)
+				{
+					var info = rightContext.ConvertToSql(Expression.MakeMemberAccess(right, lmember), 0, ConvertFlags.Field).Single();
+					rcol = info.Sql;
+				}
+				else
+				{
+					if (rmembers.Count != 0)
+					{
+						var info = rightContext.ConvertToSql(rmembers[lmember], 0, ConvertFlags.Field)[0];
+						rcol = info.Sql;
+					}
+				}
+
+				var rex =
+					isNull ?
+						new SqlValue(right.Type, null) :
+						rcol ?? GetParameter(right, lmember);
+
+				var predicate = Convert(leftContext, new SqlQuery.Predicate.ExprExpr(
+					lcol.Sql,
+					nodeType == ExpressionType.Equal ? SqlQuery.Predicate.Operator.Equal : SqlQuery.Predicate.Operator.NotEqual,
+					rex));
+
+				condition.Conditions.Add(new SqlQuery.Condition(false, predicate));
+			}
+
+			if (nodeType == ExpressionType.NotEqual)
+				foreach (var c in condition.Conditions)
+					c.IsOr = true;
+
+			return condition;
+		}
+
+		ISqlPredicate ConvertNewObjectComparison(IBuildContext context, ExpressionType nodeType, Expression left, Expression right)
+		{
+			left  = FindExpression(left);
+			right = FindExpression(right);
+
+			var condition = new SqlQuery.SearchCondition();
+
+			if (left.NodeType != ExpressionType.New)
+			{
+				var temp = left;
+				left  = right;
+				right = temp;
+			}
+
+			var newRight = right as NewExpression;
+			var newExpr  = (NewExpression)left;
+
+// ReSharper disable ConditionIsAlwaysTrueOrFalse
+// ReSharper disable HeuristicUnreachableCode
+			if (newExpr.Members == null)
+				return null;
+// ReSharper restore HeuristicUnreachableCode
+// ReSharper restore ConditionIsAlwaysTrueOrFalse
+
+			for (var i = 0; i < newExpr.Arguments.Count; i++)
+			{
+				var lex = ConvertToSql(context, newExpr.Arguments[i], false);
+				var rex =
+					newRight != null ?
+						ConvertToSql(context, newRight.Arguments[i], false) :
+						GetParameter(right, newExpr.Members[i]);
+
+				var predicate = Convert(context,
+					new SqlQuery.Predicate.ExprExpr(
+						lex,
+						nodeType == ExpressionType.Equal ? SqlQuery.Predicate.Operator.Equal : SqlQuery.Predicate.Operator.NotEqual,
+						rex));
+
+				condition.Conditions.Add(new SqlQuery.Condition(false, predicate));
+			}
+
+			if (nodeType == ExpressionType.NotEqual)
+				foreach (var c in condition.Conditions)
+					c.IsOr = true;
+
+			return condition;
+		}
+
+		ISqlExpression GetParameter(Expression ex, MemberInfo member)
+		{
+			if (member is MethodInfo)
+				member = TypeHelper.GetPropertyByMethod((MethodInfo)member);
+
+			var par    = ReplaceParameter(_expressionAccessors, ex, _ => {});
+			var expr   = Expression.MakeMemberAccess(par.Type == typeof(object) ? Expression.Convert(par, member.DeclaringType) : par, member);
+			var mapper = Expression.Lambda<Func<Expression,object[],object>>(
+				Expression.Convert(expr, typeof(object)),
+				new [] { ExpressionParam, ParametersParam });
+
+			var p = new ParameterAccessor
+			{
+				Expression   = expr,
+				Accessor     = mapper.Compile(),
+				SqlParameter = new SqlParameter(expr.Type, member.Name, null, MappingSchema)
+			};
+
+			_parameters.Add(expr, p);
+			CurrentSqlParameters.Add(p);
+
+			return p.SqlParameter;
+		}
+
+		static Expression FindExpression(Expression expr)
+		{
+			var ret = expr.Find(pi =>
+			{
+				switch (pi.NodeType)
+				{
+					case ExpressionType.Convert      :
+						{
+							var e = (UnaryExpression)expr;
+
+							return
+								e.Operand.NodeType == ExpressionType.ArrayIndex &&
+								((BinaryExpression)e.Operand).Left == ParametersParam;
+						}
+
+					case ExpressionType.MemberAccess :
+					case ExpressionType.New          :
+						return true;
+				}
+
+				return false;
+			});
+
+			if (ret == null)
+				throw new InvalidOperationException();
+
+			return ret;
+		}
+
+		#endregion
+
+		#region ConvertInPredicate
+
+		private ISqlPredicate ConvertInPredicate(IBuildContext context, MethodCallExpression expression)
+		{
+			var e        = expression;
+			var argIndex = e.Object != null ? 0 : 1;
+			var arr      = e.Object ?? e.Arguments[0];
+			var arg      = e.Arguments[argIndex];
+
+			ISqlExpression expr = null;
+
+			var ctx = GetContext(context, arg);
+
+			if (ctx is TableBuilder.TableContext &&
+			    ctx.SqlQuery != context.SqlQuery &&
+			    ctx.IsExpression(arg, 0, RequestFor.Object).Result)
+			{
+				expr = ctx.SqlQuery;
+			}
+
+			if (expr == null)
+			{
+				var sql = ConvertExpressions(context, arg, ConvertFlags.Key);
+
+				if (sql.Length == 1 && sql[0].Members.Count == 0)
+					expr = sql[0].Sql;
+				else
+					expr = new SqlExpression(
+						'\x1' + string.Join(",", sql.Select(s => s.Members[s.Members.Count - 1].Name).ToArray()),
+						sql.Select(s => s.Sql).ToArray());
+			}
+
+			MemberAccessor memberAccessor = null;
+
+			if (arg is MemberExpression)
+			{
+				var me = (MemberExpression)arg;
+				if (TypeHelper.IsEnumOrNullableEnum(me.Type))
+				{
+					memberAccessor = TypeAccessor.GetAccessor(me.Member.DeclaringType)[me.Member.Name];
+				}
+			}
+			
+			switch (arr.NodeType)
+			{
+				case ExpressionType.NewArrayInit :
+					{
+						var newArr = (NewArrayExpression)arr;
+
+						if (newArr.Expressions.Count == 0)
+							return new SqlQuery.Predicate.Expr(new SqlValue(false));
+
+						var exprs  = new ISqlExpression[newArr.Expressions.Count];
+
+						for (var i = 0; i < newArr.Expressions.Count; i++)
+						{
+							exprs[i] = ConvertToSql(context, newArr.Expressions[i], false, false);
+
+							if (memberAccessor != null && exprs[i] is SqlValue)
+							{
+								((SqlValue)exprs[i]).SetEnumConverter(memberAccessor, MappingSchema);
+							}
+						}
+
+						return new SqlQuery.Predicate.InList(expr, false, exprs);
+					}
+
+				default :
+
+					if (CanBeCompiled(arr))
+					{
+						var p = BuildParameter(arr).SqlParameter;
+						p.IsQueryParameter = false;
+						if (memberAccessor != null)
+						{
+							p.SetEnumConverter(memberAccessor, MappingSchema);
+						}
+						return new SqlQuery.Predicate.InList(expr, false, p);
+					}
+
+					break;
+			}
+
+			throw new LinqException("'{0}' cannot be converted to SQL.", expression);
+		}
+
+		#endregion
+
+		#region LIKE predicate
+
+		ISqlPredicate ConvertLikePredicate(IBuildContext context, MethodCallExpression expression, string start, string end)
+		{
+			var e = expression;
+			var o = ConvertToSql(context, e.Object,       false);
+			var a = ConvertToSql(context, e.Arguments[0], false);
+
+			if (a is SqlValue)
+			{
+				var value = ((SqlValue)a).Value;
+
+				if (value == null)
+					throw new LinqException("NULL cannot be used as a LIKE predicate parameter.");
+
+				return value.ToString().IndexOfAny(new[] { '%', '_' }) < 0?
+					new SqlQuery.Predicate.Like(o, false, new SqlValue(start + value + end), null):
+					new SqlQuery.Predicate.Like(o, false, new SqlValue(start + EscapeLikeText(value.ToString()) + end), new SqlValue('~'));
+			}
+
+			if (a is SqlParameter)
+			{
+				var p  = (SqlParameter)a;
+				var ep = (from pm in CurrentSqlParameters where pm.SqlParameter == p select pm).First();
+
+				ep = new ParameterAccessor
+				{
+					Expression   = ep.Expression,
+					Accessor     = ep.Accessor,
+					SqlParameter = new SqlParameter(ep.Expression.Type, p.Name, p.Value, GetLikeEscaper(start, end))
+				};
+
+				CurrentSqlParameters.Add(ep);
+
+				return new SqlQuery.Predicate.Like(o, false, ep.SqlParameter, new SqlValue('~'));
+			}
+
+			var mi = ReflectionHelper.Expressor<string>.MethodExpressor(_ => _.Replace("", ""));
+			var ex =
+				Expression.Call(
+				Expression.Call(
+				Expression.Call(
+					e.Arguments[0],
+						mi, Expression.Constant("~"), Expression.Constant("~~")),
+						mi, Expression.Constant("%"), Expression.Constant("~%")),
+						mi, Expression.Constant("_"), Expression.Constant("~_"));
+
+			var expr = ConvertToSql(context, ConvertExpression(ex), false);
+
+			if (!string.IsNullOrEmpty(start))
+				expr = new SqlBinaryExpression(typeof(string), new SqlValue("%"), "+", expr);
+
+			if (!string.IsNullOrEmpty(end))
+				expr = new SqlBinaryExpression(typeof(string), expr, "+", new SqlValue("%"));
+
+			return new SqlQuery.Predicate.Like(o, false, expr, new SqlValue('~'));
+		}
+
+		ISqlPredicate ConvertLikePredicate(IBuildContext context, MethodCallExpression expression)
+		{
+			var e  = expression;
+			var a1 = ConvertToSql(context, e.Arguments[0], false);
+			var a2 = ConvertToSql(context, e.Arguments[1], false);
+
+			ISqlExpression a3 = null;
+
+			if (e.Arguments.Count == 3)
+				a3 = ConvertToSql(context, e.Arguments[2], false);
+
+			return new SqlQuery.Predicate.Like(a1, false, a2, a3);
+		}
+
+		static string EscapeLikeText(string text)
+		{
+			if (text.IndexOfAny(new[] { '%', '_' }) < 0)
+				return text;
+
+			var builder = new StringBuilder(text.Length);
+
+			foreach (var ch in text)
+			{
+				switch (ch)
+				{
+					case '%':
+					case '_':
+					case '~':
+						builder.Append('~');
+						break;
+				}
+
+				builder.Append(ch);
+			}
+
+			return builder.ToString();
+		}
+
+		static Converter<object,object> GetLikeEscaper(string start, string end)
+		{
+			return value => value == null? null: start + EscapeLikeText(value.ToString()) + end;
+		}
+
+		#endregion
+
+		#region MakeIsPredicate
+
+		internal ISqlPredicate MakeIsPredicate(TableBuilder.TableContext table, Type typeOperand)
+		{
+			if (typeOperand == table.ObjectType && !table.InheritanceMapping.Any(m => m.Type == typeOperand))
+				return Convert(table, new SqlQuery.Predicate.Expr(new SqlValue(true)));
+
+			return MakeIsPredicate(
+				table, table.InheritanceMapping, table.InheritanceDiscriminators, typeOperand,
+				name => table.SqlTable.Fields.Values.First(f => f.Name == name));
+		}
+
+		internal ISqlPredicate MakeIsPredicate(
+			IBuildContext                     context,
+			List<InheritanceMappingAttribute> inheritanceMapping,
+			List<string>                      inheritanceDiscriminators,
+			Type                              toType,
+			Func<string,ISqlExpression>       getSql)
+		{
+			var mapping = inheritanceMapping
+				.Select((m,i) => new { m, i })
+				.Where ( m => m.m.Type == toType && !m.m.IsDefault)
+				.ToList();
+
+			switch (mapping.Count)
+			{
+				case 0 :
+					{
+						var cond = new SqlQuery.SearchCondition();
+
+						foreach (var m in inheritanceMapping.Select((m,i) => new { m, i }).Where(m => !m.m.IsDefault))
+						{
+							cond.Conditions.Add(
+								new SqlQuery.Condition(
+									false, 
+									Convert(context,
+										new SqlQuery.Predicate.ExprExpr(
+											getSql(inheritanceDiscriminators[m.i]),
+											SqlQuery.Predicate.Operator.NotEqual,
+											new SqlValue(m.m.Code)))));
+						}
+
+						return cond;
+					}
+
+				case 1 :
+					return Convert(context,
+						new SqlQuery.Predicate.ExprExpr(
+							getSql(inheritanceDiscriminators[mapping[0].i]),
+							SqlQuery.Predicate.Operator.Equal,
+							new SqlValue(mapping[0].m.Code)));
+
+				default:
+					{
+						var cond = new SqlQuery.SearchCondition();
+
+						foreach (var m in mapping)
+						{
+							cond.Conditions.Add(
+								new SqlQuery.Condition(
+									false,
+									Convert(context,
+										new SqlQuery.Predicate.ExprExpr(
+											getSql(inheritanceDiscriminators[m.i]),
+											SqlQuery.Predicate.Operator.Equal,
+											new SqlValue(m.m.Code))),
+									true));
+						}
+
+						return cond;
+					}
+			}
+		}
+
+		ISqlPredicate MakeIsPredicate(IBuildContext context, TypeBinaryExpression expression)
+		{
+			var typeOperand = expression.TypeOperand;
+			var table       = new TableBuilder.TableContext(this, new BuildInfo((IBuildContext)null, Expression.Constant(null), new SqlQuery()), typeOperand);
+
+			if (typeOperand == table.ObjectType && !table.InheritanceMapping.Any(m => m.Type == typeOperand))
+				return Convert(table, new SqlQuery.Predicate.Expr(new SqlValue(true)));
+
+			var mapping = table.InheritanceMapping.Select((m,i) => new { m, i }).Where(m => m.m.Type == typeOperand && !m.m.IsDefault).ToList();
+			var isEqual = true;
+
+			if (mapping.Count == 0)
+			{
+				mapping = table.InheritanceMapping.Select((m,i) => new { m, i }).Where(m => !m.m.IsDefault).ToList();
+				isEqual = false;
+			}
+
+			Expression expr = null;
+
+			foreach (var m in mapping)
+			{
+				var field = table.SqlTable.Fields[table.InheritanceDiscriminators[m.i]];
+				var ttype = field.MemberMapper.MemberAccessor.TypeAccessor.OriginalType;
+				var obj   = expression.Expression;
+
+				if (obj.Type != ttype)
+					obj = Expression.Convert(expression.Expression, ttype);
+
+				var left = Expression.PropertyOrField(obj, field.Name);
+				var code = m.m.Code;
+
+				if (code == null)
+					code = TypeHelper.GetDefaultValue(left.Type);
+				else if (left.Type != code.GetType())
+					code = MappingSchema.ConvertChangeType(code, left.Type);
+
+				Expression right = Expression.Constant(code, left.Type);
+
+				var e = isEqual ? Expression.Equal(left, right) : Expression.NotEqual(left, right);
+
+				expr = expr != null ? Expression.AndAlso(expr, e) : e;
+			}
+
+			return ConvertPredicate(context, expr);
+		}
+
+		#endregion
+
+		#endregion
+
+		#region Search Condition Builder
+
+		void BuildSearchCondition(IBuildContext context, Expression expression, List<SqlQuery.Condition> conditions)
+		{
+			switch (expression.NodeType)
+			{
+				case ExpressionType.And     :
+				case ExpressionType.AndAlso :
+					{
+						var e = (BinaryExpression)expression;
+
+						BuildSearchCondition(context, e.Left,  conditions);
+						BuildSearchCondition(context, e.Right, conditions);
+
+						break;
+					}
+
+				case ExpressionType.Or     :
+				case ExpressionType.OrElse :
+					{
+						var e           = (BinaryExpression)expression;
+						var orCondition = new SqlQuery.SearchCondition();
+
+						BuildSearchCondition(context, e.Left,  orCondition.Conditions);
+						orCondition.Conditions[orCondition.Conditions.Count - 1].IsOr = true;
+						BuildSearchCondition(context, e.Right, orCondition.Conditions);
+
+						conditions.Add(new SqlQuery.Condition(false, orCondition));
+
+						break;
+					}
+
+				case ExpressionType.Not    :
+					{
+						var e            = expression as UnaryExpression;
+						var notCondition = new SqlQuery.SearchCondition();
+
+						BuildSearchCondition(context, e.Operand, notCondition.Conditions);
+
+						if (notCondition.Conditions.Count == 1 && notCondition.Conditions[0].Predicate is SqlQuery.Predicate.NotExpr)
+						{
+							var p = notCondition.Conditions[0].Predicate as SqlQuery.Predicate.NotExpr;
+							p.IsNot = !p.IsNot;
+							conditions.Add(notCondition.Conditions[0]);
+						}
+						else
+							conditions.Add(new SqlQuery.Condition(true, notCondition));
+
+						break;
+					}
+
+				default                    :
+					var predicate = ConvertPredicate(context, expression);
+
+					if (predicate is SqlQuery.Predicate.Expr)
+					{
+						var expr = ((SqlQuery.Predicate.Expr)predicate).Expr1;
+
+						if (expr.ElementType == QueryElementType.SearchCondition)
+						{
+							var sc = (SqlQuery.SearchCondition)expr;
+
+							if (sc.Conditions.Count == 1)
+							{
+								conditions.Add(sc.Conditions[0]);
+								break;
+							}
+						}
+					}
+
+					conditions.Add(new SqlQuery.Condition(false, predicate));
+
+					break;
+			}
+		}
+
+		#endregion
+
+		#region CanBeTranslatedToSql
+
+		bool CanBeTranslatedToSql(IBuildContext context, Expression expr, bool canBeCompiled)
+		{
+			List<Expression> ignoredMembers = null;
+
+			return null == expr.Find(pi =>
+			{
+				if (ignoredMembers != null)
+				{
+					if (pi != ignoredMembers[ignoredMembers.Count - 1])
+						throw new InvalidOperationException();
+
+					if (ignoredMembers.Count == 1)
+						ignoredMembers = null;
+					else
+						ignoredMembers.RemoveAt(ignoredMembers.Count - 1);
+
+					return false;
+				}
+
+				switch (pi.NodeType)
+				{
+					case ExpressionType.MemberAccess :
+						{
+							var ma   = (MemberExpression)pi;
+							var attr = GetFunctionAttribute(ma.Member);
+
+							if (attr == null && !TypeHelper.IsNullableValueMember(ma.Member))
+							{
+								if (canBeCompiled)
+								{
+									var ctx = GetContext(context, pi);
+
+									if (ctx == null)
+										return !CanBeCompiled(pi);
+
+									if (ctx.IsExpression(pi, 0, RequestFor.Object).Result)
+										return !CanBeCompiled(pi);
+
+									ignoredMembers = ma.Expression.GetMembers();
+								}
+							}
+
+							break;
+						}
+
+					case ExpressionType.Parameter    :
+						{
+							var ctx = GetContext(context, pi);
+
+							if (ctx == null)
+								if (canBeCompiled)
+									return !CanBeCompiled(pi);
+
+							break;
+						}
+
+					case ExpressionType.Call         :
+						{
+							var e = (MethodCallExpression)pi;
+
+							if (e.Method.DeclaringType != typeof(Enumerable))
+							{
+								var attr = GetFunctionAttribute(e.Method);
+
+								if (attr == null && canBeCompiled)
+									return !CanBeCompiled(pi);
+							}
+
+							break;
+						}
+
+					case ExpressionType.TypeIs       : return canBeCompiled;
+					case ExpressionType.TypeAs       :
+					case ExpressionType.New          : return true;
+
+					case ExpressionType.NotEqual     :
+					case ExpressionType.Equal        :
+						{
+							var e = (BinaryExpression)pi;
+
+							Expression obj = null;
+
+							if (e.Left.NodeType == ExpressionType.Constant && ((ConstantExpression)e.Left).Value == null)
+								obj = e.Right;
+							else if (e.Right.NodeType == ExpressionType.Constant && ((ConstantExpression)e.Right).Value == null)
+								obj = e.Left;
+
+							if (obj != null)
+							{
+								var ctx = GetContext(context, obj);
+
+								if (ctx != null)
+								{
+									if (ctx.IsExpression(obj, 0, RequestFor.Table).      Result ||
+									    ctx.IsExpression(obj, 0, RequestFor.Association).Result)
+									{
+										ignoredMembers = obj.GetMembers();
+									}
+								}
+							}
+
+							break;
+						}
+				}
+
+				return false;
+			});
+		}
+
+		#endregion
+
+		#region Helpers
+
+		public IBuildContext GetContext([JetBrains.Annotations.NotNull] IBuildContext current, Expression expression)
+		{
+			var root = expression.GetRootObject();
+
+			for (; current != null; current = current.Parent)
+				if (current.IsExpression(root, 0, RequestFor.Root).Result)
+					return current;
+
+			return null;
+		}
+
+		SqlFunctionAttribute GetFunctionAttribute(ICustomAttributeProvider member)
+		{
+			var attrs = member.GetCustomAttributes(typeof(SqlFunctionAttribute), true);
+
+			if (attrs.Length == 0)
+				return null;
+
+			SqlFunctionAttribute attr = null;
+
+			foreach (SqlFunctionAttribute a in attrs)
+			{
+				if (a.SqlProvider == SqlProvider.Name)
+				{
+					attr = a;
+					break;
+				}
+
+				if (a.SqlProvider == null)
+					attr = a;
+			}
+
+			return attr;
+		}
+
+		internal TableFunctionAttribute GetTableFunctionAttribute(ICustomAttributeProvider member)
+		{
+			var attrs = member.GetCustomAttributes(typeof(TableFunctionAttribute), true);
+
+			if (attrs.Length == 0)
+				return null;
+
+			TableFunctionAttribute attr = null;
+
+			foreach (TableFunctionAttribute a in attrs)
+			{
+				if (a.SqlProvider == SqlProvider.Name)
+				{
+					attr = a;
+					break;
+				}
+
+				if (a.SqlProvider == null)
+					attr = a;
+			}
+
+			return attr;
+		}
+
+		public ISqlExpression Convert(IBuildContext context, ISqlExpression expr)
+		{
+			SqlProvider.SqlQuery = context.SqlQuery;
+			return SqlProvider.ConvertExpression(expr);
+		}
+
+		public ISqlPredicate Convert(IBuildContext context, ISqlPredicate predicate)
+		{
+			SqlProvider.SqlQuery = context.SqlQuery;
+			return SqlProvider.ConvertPredicate(predicate);
+		}
+
+		public ISqlExpression ConvertTimeSpanMember(IBuildContext context, MemberExpression expression)
+		{
+			if (expression.Member.DeclaringType == typeof(TimeSpan))
+			{
+				switch (expression.Expression.NodeType)
+				{
+					case ExpressionType.Subtract       :
+					case ExpressionType.SubtractChecked:
+
+						Sql.DateParts datePart;
+
+						switch (expression.Member.Name)
+						{
+							case "TotalMilliseconds" : datePart = Sql.DateParts.Millisecond; break;
+							case "TotalSeconds"      : datePart = Sql.DateParts.Second;      break;
+							case "TotalMinutes"      : datePart = Sql.DateParts.Minute;      break;
+							case "TotalHours"        : datePart = Sql.DateParts.Hour;        break;
+							case "TotalDays"         : datePart = Sql.DateParts.Day;         break;
+							default                  : return null;
+						}
+
+						var e = (BinaryExpression)expression.Expression;
+
+						return new SqlFunction(
+							typeof(int),
+							"DateDiff",
+							new SqlValue(datePart),
+							ConvertToSql(context, e.Right, false),
+							ConvertToSql(context, e.Left,  false));
+				}
+			}
+
+			return null;
+		}
+
+		internal ISqlExpression ConvertSearchCondition(IBuildContext context, ISqlExpression sqlExpression)
+		{
+			if (sqlExpression is SqlQuery.SearchCondition)
+			{
+				if (sqlExpression.CanBeNull())
+				{
+					var notExpr = new SqlQuery.SearchCondition
+					{
+						Conditions = { new SqlQuery.Condition(true, new SqlQuery.Predicate.Expr(sqlExpression, sqlExpression.Precedence)) }
+					};
+
+					return Convert(context, new SqlFunction(sqlExpression.SystemType, "CASE", sqlExpression, new SqlValue(1), notExpr, new SqlValue(0), new SqlValue(null)));
+				}
+
+				return Convert(context, new SqlFunction(sqlExpression.SystemType, "CASE", sqlExpression, new SqlValue(1), new SqlValue(0)));
+			}
+
+			return sqlExpression;
+		}
+
+		public bool ProcessProjection(Dictionary<MemberInfo,Expression> members, Expression expression)
+		{
+			switch (expression.NodeType)
+			{
+				// new { ... }
+				//
+				case ExpressionType.New        :
+					{
+						var expr = (NewExpression)expression;
+
+// ReSharper disable ConditionIsAlwaysTrueOrFalse
+// ReSharper disable HeuristicUnreachableCode
+						if (expr.Members == null)
+							return false;
+// ReSharper restore HeuristicUnreachableCode
+// ReSharper restore ConditionIsAlwaysTrueOrFalse
+
+						for (var i = 0; i < expr.Members.Count; i++)
+						{
+							var member = expr.Members[i];
+
+							members.Add(member, expr.Arguments[i]);
+
+							if (member is MethodInfo)
+								members.Add(TypeHelper.GetPropertyByMethod((MethodInfo)member), expr.Arguments[i]);
+						}
+
+						return true;
+					}
+
+				// new MyObject { ... }
+				//
+				case ExpressionType.MemberInit :
+					{
+						var expr = (MemberInitExpression)expression;
+						var dic  = TypeAccessor.GetAccessor(expr.Type)
+							.Select((m,i) => new { m, i })
+							.ToDictionary(_ => _.m.MemberInfo.Name, _ => _.i);
+
+						foreach (var binding in expr.Bindings.Cast<MemberAssignment>().OrderBy(b => dic.ContainsKey(b.Member.Name) ? dic[b.Member.Name] : 1000000))
+						{
+							members.Add(binding.Member, binding.Expression);
+
+							if (binding.Member is MethodInfo)
+								members.Add(TypeHelper.GetPropertyByMethod((MethodInfo)binding.Member), binding.Expression);
+						}
+
+						return true;
+					}
+
+				// .Select(p => everything else)
+				//
+				default                        :
+					return false;
+			}
+		}
+
+		public void ReplaceParent(IBuildContext oldParent, IBuildContext newParent)
+		{
+			foreach (var context in Contexts)
+				if (context != newParent)
+					if (context.Parent == oldParent)
+						context.Parent = newParent;
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/ExpressionBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1331 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+	using Common;
+	using Data.Sql;
+	using Data.Sql.SqlProvider;
+	using Mapping;
+	using Reflection;
+
+	public partial class ExpressionBuilder
+	{
+		#region Sequence
+
+		static readonly object _sync = new object();
+
+		static List<ISequenceBuilder> _sequenceBuilders = new List<ISequenceBuilder>
+		{
+			new TableBuilder         (),
+			new SelectBuilder        (),
+			new SelectManyBuilder    (),
+			new WhereBuilder         (),
+			new OrderByBuilder       (),
+			new GroupByBuilder       (),
+			new JoinBuilder          (),
+			new TakeSkipBuilder      (),
+			new DefaultIfEmptyBuilder(),
+			new DistinctBuilder      (),
+			new FirstSingleBuilder   (),
+			new AggregationBuilder   (),
+			new ScalarSelectBuilder  (),
+			new CountBuilder         (),
+			new PassThroughBuilder   (),
+			new TableAttributeBuilder(),
+			new InsertBuilder        (),
+			new InsertBuilder.Into   (),
+			new InsertBuilder.Value  (),
+			new InsertOrUpdateBuilder(),
+			new UpdateBuilder        (),
+			new UpdateBuilder.Set    (),
+			new DeleteBuilder        (),
+			new ContainsBuilder      (),
+			new AllAnyBuilder        (),
+			new ConcatUnionBuilder   (),
+			new IntersectBuilder     (),
+			new CastBuilder          (),
+			new OfTypeBuilder        (),
+			new AsUpdatableBuilder   (),
+		};
+
+		public static void AddBuilder(ISequenceBuilder builder)
+		{
+			_sequenceBuilders.Add(builder);
+		}
+
+		#endregion
+
+		#region Init
+
+		readonly Query                             _query;
+		readonly List<ISequenceBuilder>            _builders = _sequenceBuilders;
+		private  bool                              _reorder;
+		readonly Dictionary<Expression,Expression> _expressionAccessors;
+		private  HashSet<Expression>               _subQueryExpressions;
+
+		readonly public List<ParameterAccessor>    CurrentSqlParameters = new List<ParameterAccessor>();
+
+#if FW4 || SILVERLIGHT
+
+		readonly public List<ParameterExpression>  BlockVariables       = new List<ParameterExpression>();
+		readonly public List<Expression>           BlockExpressions     = new List<Expression>();
+		         public bool                       IsBlockDisable;
+
+#else
+		         public bool                       IsBlockDisable = true;
+#endif
+
+		readonly HashSet<Expression> _visitedExpressions;
+
+		public ExpressionBuilder(
+			Query                 query,
+			IDataContextInfo      dataContext,
+			Expression            expression,
+			ParameterExpression[] compiledParameters)
+		{
+			_query               = query;
+			_expressionAccessors = expression.GetExpressionAccessors(ExpressionParam);
+
+			CompiledParameters = compiledParameters;
+			DataContextInfo    = dataContext;
+			OriginalExpression = expression;
+
+			_visitedExpressions = new HashSet<Expression>();
+			Expression          = ConvertExpressionTree(expression);
+			_visitedExpressions = null;
+		}
+
+		#endregion
+
+		#region Public Members
+
+		public readonly IDataContextInfo      DataContextInfo;
+		public readonly Expression            OriginalExpression;
+		public readonly Expression            Expression;
+		public readonly ParameterExpression[] CompiledParameters;
+		public readonly List<IBuildContext>   Contexts = new List<IBuildContext>();
+
+		private ISqlProvider _sqlProvider;
+		public  ISqlProvider  SqlProvider
+		{
+			get { return _sqlProvider ?? (_sqlProvider = DataContextInfo.CreateSqlProvider()); }
+		}
+
+		public static readonly ParameterExpression ContextParam     = Expression.Parameter(typeof(QueryContext), "context");
+		public static readonly ParameterExpression DataContextParam = Expression.Parameter(typeof(IDataContext), "dctx");
+		public static readonly ParameterExpression DataReaderParam  = Expression.Parameter(typeof(IDataReader),  "rd");
+		public static readonly ParameterExpression ParametersParam  = Expression.Parameter(typeof(object[]),     "ps");
+		public static readonly ParameterExpression ExpressionParam  = Expression.Parameter(typeof(Expression),   "expr");
+
+		public MappingSchema MappingSchema
+		{
+			get { return DataContextInfo.MappingSchema; }
+		}
+
+		#endregion
+
+		#region Builder SQL
+
+		internal Query<T> Build<T>()
+		{
+			var sequence = BuildSequence(new BuildInfo((IBuildContext)null, Expression, new SqlQuery()));
+			
+			if (_reorder)
+				lock (_sync)
+				{
+					_reorder = false;
+					_sequenceBuilders = _sequenceBuilders.OrderByDescending(_ => _.BuildCounter).ToList();
+				}
+
+			_query.Init(sequence, CurrentSqlParameters);
+
+			var param = Expression.Parameter(typeof(Query<T>), "info");
+
+			sequence.BuildQuery((Query<T>)_query, param);
+
+			return (Query<T>)_query;
+		}
+
+		[JetBrains.Annotations.NotNull]
+		public IBuildContext BuildSequence(BuildInfo buildInfo)
+		{
+			buildInfo.Expression = buildInfo.Expression.Unwrap();
+
+			var n = _builders[0].BuildCounter;
+
+			foreach (var builder in _builders)
+			{
+				if (builder.CanBuild(this, buildInfo))
+				{
+					var sequence = builder.BuildSequence(this, buildInfo);
+
+					lock (builder)
+						builder.BuildCounter++;
+
+					_reorder = _reorder || n < builder.BuildCounter;
+
+					return sequence;
+				}
+
+				n = builder.BuildCounter;
+			}
+
+			throw new LinqException("Sequence '{0}' cannot be converted to SQL.", buildInfo.Expression);
+		}
+
+		public SequenceConvertInfo ConvertSequence(BuildInfo buildInfo, ParameterExpression param)
+		{
+			buildInfo.Expression = buildInfo.Expression.Unwrap();
+
+			foreach (var builder in _builders)
+				if (builder.CanBuild(this, buildInfo))
+					return builder.Convert(this, buildInfo, param);
+
+			throw new LinqException("Sequence '{0}' cannot be converted to SQL.", buildInfo.Expression);
+		}
+
+		public bool IsSequence(BuildInfo buildInfo)
+		{
+			buildInfo.Expression = buildInfo.Expression.Unwrap();
+
+			foreach (var builder in _builders)
+				if (builder.CanBuild(this, buildInfo))
+					return builder.IsSequence(this, buildInfo);
+
+			return false;
+		}
+
+		#endregion
+
+		#region ConvertExpression
+
+		public ParameterExpression SequenceParameter;
+
+		Expression ConvertExpressionTree(Expression expression)
+		{
+			var expr = ConvertParameters(expression);
+
+			expr = ExposeExpression  (expr);
+			expr = OptimizeExpression(expr);
+
+			var paramType   = expr.Type;
+			var isQueryable = false;
+
+			if (expression.NodeType == ExpressionType.Call)
+			{
+				var call = (MethodCallExpression)expression;
+
+				if (call.IsQueryable() && call.Object == null && call.Arguments.Count > 0 && call.Type.IsGenericType)
+				{
+					var type = call.Type.GetGenericTypeDefinition();
+
+					if (type == typeof(IQueryable<>) || type == typeof(IEnumerable<>))
+					{
+						var arg = call.Type.GetGenericArguments();
+
+						if (arg.Length == 1)
+						{
+							paramType   = arg[0];
+							isQueryable = true;
+						}
+					}
+				}
+			}
+
+			SequenceParameter = Expression.Parameter(paramType, "cp");
+
+			var sequence = ConvertSequence(new BuildInfo((IBuildContext)null, expr, new SqlQuery()), SequenceParameter);
+
+			if (sequence != null)
+			{
+				if (sequence.Expression.Type != expr.Type)
+				{
+					if (isQueryable)
+					{
+						var p = sequence.ExpressionsToReplace.SingleOrDefault(s => s.Path.NodeType == ExpressionType.Parameter);
+
+						return Expression.Call(
+							((MethodCallExpression)expr).Method.DeclaringType,
+							"Select",
+							new[] { p.Path.Type, paramType },
+							sequence.Expression,
+							Expression.Lambda(p.Expr, (ParameterExpression)p.Path));
+					}
+
+					throw new InvalidOperationException();
+				}
+
+				return sequence.Expression;
+			}
+
+			return expr;
+		}
+
+		#region ConvertParameters
+
+		Expression ConvertParameters(Expression expression)
+		{
+			return expression.Convert(expr =>
+			{
+				switch (expr.NodeType)
+				{
+					case ExpressionType.Parameter:
+						if (CompiledParameters != null)
+						{
+							var idx = Array.IndexOf(CompiledParameters, (ParameterExpression)expr);
+
+							if (idx > 0)
+								return
+									Expression.Convert(
+										Expression.ArrayIndex(
+											ParametersParam,
+											Expression.Constant(Array.IndexOf(CompiledParameters, (ParameterExpression)expr))),
+										expr.Type);
+						}
+
+						break;
+				}
+
+				return expr;
+			});
+		}
+
+		#endregion
+
+		#region ExposeExpression
+
+		Expression ExposeExpression(Expression expression)
+		{
+			return expression.Convert(expr =>
+			{
+				switch (expr.NodeType)
+				{
+					case ExpressionType.MemberAccess:
+						{
+							var me = (MemberExpression)expr;
+							var l  = ConvertMethodExpression(me.Member);
+
+							if (l != null)
+							{
+								var body = l.Body.Unwrap();
+								var ex   = body.Convert2(wpi => new ExpressionHelper.ConvertInfo(wpi.NodeType == ExpressionType.Parameter ? me.Expression : wpi));
+
+								if (ex.Type != expr.Type)
+									ex = new ChangeTypeExpression(ex, expr.Type);
+
+								return ExposeExpression(ex);
+							}
+
+							break;
+						}
+
+					case ExpressionType.Constant :
+						{
+							var c = (ConstantExpression)expr;
+
+							// Fix Mono behaviour.
+							//
+							//if (c.Value is IExpressionQuery)
+							//	return ((IQueryable)c.Value).Expression;
+
+							if (c.Value is IQueryable && !(c.Value is ITable))
+							{
+								var e = ((IQueryable)c.Value).Expression;
+
+								if (!_visitedExpressions.Contains(e))
+								{
+									_visitedExpressions.Add(e);
+									return ExposeExpression(e);
+								}
+							}
+
+							break;
+						}
+				}
+
+				return expr;
+			});
+		}
+
+		#endregion
+
+		#region OptimizeExpression
+
+		private MethodInfo[] _enumerableMethods;
+		public  MethodInfo[]  EnumerableMethods
+		{
+			get { return _enumerableMethods ?? (_enumerableMethods = typeof(Enumerable).GetMethods()); }
+		}
+
+		private MethodInfo[] _queryableMethods;
+		public  MethodInfo[]  QueryableMethods
+		{
+			get { return _queryableMethods ?? (_queryableMethods = typeof(Queryable).GetMethods()); }
+		}
+
+		readonly Dictionary<Expression,Expression> _optimizedExpressions = new Dictionary<Expression,Expression>();
+
+		Expression OptimizeExpression(Expression expression)
+		{
+			Expression expr;
+
+			if (_optimizedExpressions.TryGetValue(expression, out expr))
+				return expr;
+
+			_optimizedExpressions[expression] = expr = expression.Convert(OptimizeExpressionImpl);
+
+			return expr;
+		}
+
+		Expression OptimizeExpressionImpl(Expression expr)
+		{
+			switch (expr.NodeType)
+			{
+				case ExpressionType.MemberAccess:
+					{
+						var me = (MemberExpression)expr;
+
+						// Replace Count with Count()
+						//
+						if (me.Member.Name == "Count")
+						{
+							var isList = typeof(ICollection).IsAssignableFrom(me.Member.DeclaringType);
+
+							if (!isList)
+								isList = me.Member.DeclaringType.GetInterfaces()
+									.Any(t => t.IsGenericType && t.GetGenericTypeDefinition() == typeof(IList<>));
+
+							if (isList)
+							{
+								var mi = EnumerableMethods
+									.First(m => m.Name == "Count" && m.GetParameters().Length == 1)
+									.MakeGenericMethod(TypeHelper.GetElementType(me.Expression.Type));
+
+								return Expression.Call(null, mi, me.Expression);
+							}
+						}
+
+						if (CompiledParameters == null && TypeHelper.IsSameOrParent(typeof(IQueryable), expr.Type))
+						{
+							var ex = ConvertIQueriable(expr);
+
+							if (ex != expr)
+								return ConvertExpressionTree(ex);
+						}
+
+						return ConvertSubquery(expr);
+					}
+
+				case ExpressionType.Call :
+					{
+						var call = (MethodCallExpression)expr;
+
+						if (call.IsQueryable())
+						{
+							switch (call.Method.Name)
+							{
+								case "Where"              : return ConvertWhere     (call);
+								case "GroupBy"            : return ConvertGroupBy   (call);
+								case "SelectMany"         : return ConvertSelectMany(call);
+								case "Select"             : return ConvertSelect    (call);
+								case "LongCount"          :
+								case "Count"              :
+								case "Single"             :
+								case "SingleOrDefault"    :
+								case "First"              :
+								case "FirstOrDefault"     : return ConvertPredicate (call);
+								case "Min"                :
+								case "Max"                : return ConvertSelector  (call, true);
+								case "Sum"                :
+								case "Average"            : return ConvertSelector  (call, false);
+								case "ElementAt"          :
+								case "ElementAtOrDefault" : return ConvertElementAt (call);
+							}
+						}
+						else
+						{
+							var l = ConvertMethodExpression(call.Method);
+
+							if (l != null)
+								return OptimizeExpression(ConvertMethod(call, l));
+
+							if (CompiledParameters == null && TypeHelper.IsSameOrParent(typeof(IQueryable), expr.Type))
+							{
+								var attr = GetTableFunctionAttribute(call.Method);
+
+								if (attr == null)
+								{
+									var ex = ConvertIQueriable(expr);
+
+									if (ex != expr)
+										return ConvertExpressionTree(ex);
+								}
+							}
+						}
+
+						return ConvertSubquery(expr);
+					}
+			}
+
+			return expr;
+		}
+
+		LambdaExpression ConvertMethodExpression(MemberInfo mi)
+		{
+			var attrs = mi.GetCustomAttributes(typeof(MethodExpressionAttribute), true);
+
+			if (attrs.Length == 0)
+				return null;
+
+			MethodExpressionAttribute attr = null;
+
+			foreach (MethodExpressionAttribute a in attrs)
+			{
+				if (a.SqlProvider == SqlProvider.Name)
+				{
+					attr = a;
+					break;
+				}
+
+				if (a.SqlProvider == null)
+					attr = a;
+			}
+
+			if (attr != null)
+			{
+				Expression expr;
+
+				if (mi is MethodInfo && ((MethodInfo)mi).IsGenericMethod)
+				{
+					var method = (MethodInfo)mi;
+					var args   = method.GetGenericArguments();
+					var names  = args.Select(t => t.Name).ToArray();
+					var name   = string.Format(attr.MethodName, names);
+
+					if (name != attr.MethodName)
+						expr = Expression.Call(mi.DeclaringType, name, Array<Type>.Empty);
+					else
+						expr = Expression.Call(mi.DeclaringType, name, args);
+				}
+				else
+				{
+					expr = Expression.Call(mi.DeclaringType, attr.MethodName, Array<Type>.Empty);
+				}
+
+				var call = Expression.Lambda<Func<LambdaExpression>>(Expression.Convert(expr, typeof(LambdaExpression)));
+
+				return call.Compile()();
+			}
+
+			return null;
+		}
+
+		Expression ConvertSubquery(Expression expr)
+		{
+			var ex = expr;
+
+			while (ex != null)
+			{
+				switch (ex.NodeType)
+				{
+					default                          : return expr;
+					case ExpressionType.MemberAccess : ex = ((MemberExpression)ex).Expression; break;
+					case ExpressionType.Call         :
+						{
+							var call = (MethodCallExpression)ex;
+
+							if (call.Object == null)
+							{
+								if (call.IsQueryable()) switch (call.Method.Name)
+								{
+									case "Single"          :
+									case "SingleOrDefault" :
+									case "First"           :
+									case "FirstOrDefault"  :
+										return ConvertSingleOrFirst(expr, call);
+								}
+
+								return expr;
+							}
+
+							ex = call.Object;
+
+							break;
+						}
+				}
+			}
+
+			return expr;
+		}
+
+		Expression ConvertSingleOrFirst(Expression expr, MethodCallExpression call)
+		{
+			var param = Expression.Parameter(call.Type, "p");
+			var selector = expr.Convert(e => e == call ? param : e);
+			var method = GetQueriableMethodInfo(call, (m, _) => m.Name == call.Method.Name && m.GetParameters().Length == 1);
+			var select = call.Method.DeclaringType == typeof(Enumerable) ?
+				EnumerableMethods
+					.Where(m => m.Name == "Select" && m.GetParameters().Length == 2)
+					.First(m => m.GetParameters()[1].ParameterType.GetGenericArguments().Length == 2) :
+				QueryableMethods
+					.Where(m => m.Name == "Select" && m.GetParameters().Length == 2)
+					.First(m => m.GetParameters()[1].ParameterType.GetGenericArguments()[0].GetGenericArguments().Length == 2);
+
+			call = (MethodCallExpression)OptimizeExpression(call);
+			select = select.MakeGenericMethod(call.Type, expr.Type);
+			method = method.MakeGenericMethod(expr.Type);
+
+			return Expression.Call(null, method,
+				Expression.Call(null, select,
+					call.Arguments[0],
+					Expression.Lambda(selector, param)));
+		}
+
+		#endregion
+
+		#region ConvertWhere
+
+		Expression ConvertWhere(MethodCallExpression method)
+		{
+			var sequence  = OptimizeExpression(method.Arguments[0]);
+			var predicate = OptimizeExpression(method.Arguments[1]);
+			var lambda    = (LambdaExpression)predicate.Unwrap();
+			var lparam    = lambda.Parameters[0];
+			var lbody     = lambda.Body;
+
+			if (lambda.Parameters.Count > 1)
+				return method;
+
+			var exprs     = new List<Expression>();
+
+			lbody.Visit(ex =>
+			{
+				if (ex.NodeType == ExpressionType.Call)
+				{
+					var call = (MethodCallExpression)ex;
+
+					if (call.Arguments.Count > 0)
+					{
+						var arg = call.Arguments[0];
+
+						if (call.IsQueryable(AggregationBuilder.MethodNames))
+						{
+							while (arg.NodeType == ExpressionType.Call && ((MethodCallExpression) arg).Method.Name == "Select")
+								arg = ((MethodCallExpression) arg).Arguments[0];
+
+							if (arg.NodeType == ExpressionType.Call)
+								exprs.Add(ex);
+						}
+						else if (call.IsQueryable(CountBuilder.MethodNames))
+						{
+							//while (arg.NodeType == ExpressionType.Call && ((MethodCallExpression) arg).Method.Name == "Select")
+							//	arg = ((MethodCallExpression) arg).Arguments[0];
+
+							if (arg.NodeType == ExpressionType.Call)
+								exprs.Add(ex);
+						}
+					}
+				}
+			});
+
+			Expression expr = null;
+
+			if (exprs.Count > 0)
+			{
+				expr = lparam;
+
+				foreach (var ex in exprs)
+				{
+					var type   = typeof(ExpressionHoder<,>).MakeGenericType(expr.Type, ex.Type);
+					var fields = type.GetFields();
+
+					expr = Expression.MemberInit(
+						Expression.New(type),
+						Expression.Bind(fields[0], expr),
+						Expression.Bind(fields[1], ex));
+				}
+
+				var dic  = new Dictionary<Expression, Expression>();
+				var parm = Expression.Parameter(expr.Type, lparam.Name);
+
+				for (var i = 0; i < exprs.Count; i++)
+				{
+					Expression ex = parm;
+
+					for (var j = i; j < exprs.Count - 1; j++)
+						ex = Expression.PropertyOrField(ex, "p");
+
+					ex = Expression.PropertyOrField(ex, "ex");
+
+					dic.Add(exprs[i], ex);
+
+					if (_subQueryExpressions == null)
+						_subQueryExpressions = new HashSet<Expression>();
+					_subQueryExpressions.Add(ex);
+				}
+
+				var newBody = lbody.Convert(ex =>
+				{
+					Expression e;
+					return dic.TryGetValue(ex, out e) ? e : ex;
+				});
+
+				var nparm = exprs.Aggregate<Expression,Expression>(parm, (c,t) => Expression.PropertyOrField(c, "p"));
+
+				newBody = newBody.Convert(ex => ex == lparam ? nparm : ex);
+
+				predicate = Expression.Lambda(newBody, parm);
+
+				var methodInfo = GetMethodInfo(method, "Select");
+
+				methodInfo = methodInfo.MakeGenericMethod(lparam.Type, expr.Type);
+				sequence   = Expression.Call(methodInfo, sequence, Expression.Lambda(expr, lparam));
+			}
+
+			if (sequence != method.Arguments[0] || predicate != method.Arguments[1])
+			{
+				var methodInfo  = method.Method.GetGenericMethodDefinition();
+				var genericType = sequence.Type.GetGenericArguments()[0];
+				var newMethod   = methodInfo.MakeGenericMethod(genericType);
+
+				method = Expression.Call(newMethod, sequence, predicate);
+
+				if (exprs.Count > 0)
+				{
+					var parameter = Expression.Parameter(expr.Type, lparam.Name);
+
+					methodInfo = GetMethodInfo(method, "Select");
+					methodInfo = methodInfo.MakeGenericMethod(expr.Type, lparam.Type);
+					method     = Expression.Call(methodInfo, method,
+						Expression.Lambda(
+							exprs.Aggregate((Expression)parameter, (current,_) => Expression.PropertyOrField(current, "p")),
+							parameter));
+				}
+			}
+
+			return method;
+		}
+
+		#endregion
+
+		#region ConvertGroupBy
+
+		public class GroupSubQuery<TKey,TElement>
+		{
+			public TKey     Key;
+			public TElement Element;
+		}
+
+		interface IGroupByHelper
+		{
+			void Set(bool wrapInSubQuery, Expression sourceExpression, LambdaExpression keySelector, LambdaExpression elementSelector, LambdaExpression resultSelector);
+
+			Expression AddElementSelectorQ  ();
+			Expression AddElementSelectorE  ();
+			Expression AddResultQ           ();
+			Expression AddResultE           ();
+			Expression WrapInSubQueryQ      ();
+			Expression WrapInSubQueryE      ();
+			Expression WrapInSubQueryResultQ();
+			Expression WrapInSubQueryResultE();
+		}
+
+		class GroupByHelper<TSource,TKey,TElement,TResult> : IGroupByHelper
+		{
+			bool             _wrapInSubQuery;
+			Expression       _sourceExpression;
+			LambdaExpression _keySelector;
+			LambdaExpression _elementSelector;
+			LambdaExpression _resultSelector;
+
+			public void Set(
+				bool             wrapInSubQuery,
+				Expression       sourceExpression,
+				LambdaExpression keySelector,
+				LambdaExpression elementSelector,
+				LambdaExpression resultSelector)
+			{
+				_wrapInSubQuery   = wrapInSubQuery;
+				_sourceExpression = sourceExpression;
+				_keySelector      = keySelector;
+				_elementSelector  = elementSelector;
+				_resultSelector   = resultSelector;
+			}
+
+			public Expression AddElementSelectorQ()
+			{
+				Expression<Func<IQueryable<TSource>,TKey,TElement,TResult,IQueryable<IGrouping<TKey,TSource>>>> func = (source,key,e,r) => source
+					.GroupBy(keyParam => key, _ => _)
+					;
+
+				var body   = func.Body.Unwrap();
+				var keyArg = GetLambda(body, 1).Parameters[0]; // .GroupBy(keyParam
+
+				return Convert(func, keyArg, null, null);
+			}
+
+			public Expression AddElementSelectorE()
+			{
+				Expression<Func<IEnumerable<TSource>,TKey,TElement,TResult,IEnumerable<IGrouping<TKey,TSource>>>> func = (source,key,e,r) => source
+					.GroupBy(keyParam => key, _ => _)
+					;
+
+				var body   = func.Body.Unwrap();
+				var keyArg = GetLambda(body, 1).Parameters[0]; // .GroupBy(keyParam
+
+				return Convert(func, keyArg, null, null);
+			}
+
+			public Expression AddResultQ()
+			{
+				Expression<Func<IQueryable<TSource>,TKey,TElement,TResult,IQueryable<TResult>>> func = (source,key,e,r) => source
+					.GroupBy(keyParam => key, elemParam => e)
+					.Select (resParam => r)
+					;
+
+				var body    = func.Body.Unwrap();
+				var keyArg  = GetLambda(body, 0, 1).Parameters[0]; // .GroupBy(keyParam
+				var elemArg = GetLambda(body, 0, 2).Parameters[0]; // .GroupBy(..., elemParam
+				var resArg  = GetLambda(body, 1).   Parameters[0]; // .Select (resParam
+
+				return Convert(func, keyArg, elemArg, resArg);
+			}
+
+			public Expression AddResultE()
+			{
+				Expression<Func<IEnumerable<TSource>,TKey,TElement,TResult,IEnumerable<TResult>>> func = (source,key,e,r) => source
+					.GroupBy(keyParam => key, elemParam => e)
+					.Select (resParam => r)
+					;
+
+				var body    = func.Body.Unwrap();
+				var keyArg  = GetLambda(body, 0, 1).Parameters[0]; // .GroupBy(keyParam
+				var elemArg = GetLambda(body, 0, 2).Parameters[0]; // .GroupBy(..., elemParam
+				var resArg  = GetLambda(body, 1).   Parameters[0]; // .Select (resParam
+
+				return Convert(func, keyArg, elemArg, resArg);
+			}
+
+			public Expression WrapInSubQueryQ()
+			{
+				Expression<Func<IQueryable<TSource>,TKey,TElement,TResult,IQueryable<IGrouping<TKey,TElement>>>> func = (source,key,e,r) => source
+					.Select(selectParam => new GroupSubQuery<TKey,TSource>
+					{
+						Key     = key,
+						Element = selectParam
+					})
+					.GroupBy(_ => _.Key, elemParam => e)
+					;
+
+				var body    = func.Body.Unwrap();
+				var keyArg  = GetLambda(body, 0, 1).Parameters[0]; // .Select (selectParam
+				var elemArg = GetLambda(body, 2).   Parameters[0]; // .GroupBy(..., elemParam
+
+				return Convert(func, keyArg, elemArg, null);
+			}
+
+			public Expression WrapInSubQueryE()
+			{
+				Expression<Func<IEnumerable<TSource>,TKey,TElement,TResult,IEnumerable<IGrouping<TKey,TElement>>>> func = (source,key,e,r) => source
+					.Select(selectParam => new GroupSubQuery<TKey,TSource>
+					{
+						Key     = key,
+						Element = selectParam
+					})
+					.GroupBy(_ => _.Key, elemParam => e)
+					;
+
+				var body    = func.Body.Unwrap();
+				var keyArg  = GetLambda(body, 0, 1).Parameters[0]; // .Select (selectParam
+				var elemArg = GetLambda(body, 2).   Parameters[0]; // .GroupBy(..., elemParam
+
+				return Convert(func, keyArg, elemArg, null);
+			}
+
+			public Expression WrapInSubQueryResultQ()
+			{
+				Expression<Func<IQueryable<TSource>,TKey,TElement,TResult,IQueryable<TResult>>> func = (source,key,e,r) => source
+					.Select(selectParam => new GroupSubQuery<TKey,TSource>
+					{
+						Key     = key,
+						Element = selectParam
+					})
+					.GroupBy(_ => _.Key, elemParam => e)
+					.Select (resParam => r)
+					;
+
+				var body    = func.Body.Unwrap();
+				var keyArg  = GetLambda(body, 0, 0, 1).Parameters[0]; // .Select (selectParam
+				var elemArg = GetLambda(body, 0, 2).   Parameters[0]; // .GroupBy(..., elemParam
+				var resArg  = GetLambda(body, 1).      Parameters[0]; // .Select (resParam
+
+				return Convert(func, keyArg, elemArg, resArg);
+			}
+
+			public Expression WrapInSubQueryResultE()
+			{
+				Expression<Func<IEnumerable<TSource>,TKey,TElement,TResult,IEnumerable<TResult>>> func = (source,key,e,r) => source
+					.Select(selectParam => new GroupSubQuery<TKey,TSource>
+					{
+						Key     = key,
+						Element = selectParam
+					})
+					.GroupBy(_ => _.Key, elemParam => e)
+					.Select (resParam => r)
+					;
+
+				var body    = func.Body.Unwrap();
+				var keyArg  = GetLambda(body, 0, 0, 1).Parameters[0]; // .Select (selectParam
+				var elemArg = GetLambda(body, 0, 2).   Parameters[0]; // .GroupBy(..., elemParam
+				var resArg  = GetLambda(body, 1).      Parameters[0]; // .Select (resParam
+
+				return Convert(func, keyArg, elemArg, resArg);
+			}
+
+			Expression Convert(
+				LambdaExpression    func,
+				ParameterExpression keyArg,
+				ParameterExpression elemArg,
+				ParameterExpression resArg)
+			{
+				var body = func.Body.Unwrap();
+				var expr = body.Convert(ex =>
+				{
+					if (ex == func.Parameters[0])
+						return _sourceExpression;
+
+					if (ex == func.Parameters[1])
+						return _keySelector.Body.Convert(e => e == _keySelector.Parameters[0] ? keyArg : e);
+
+					if (ex == func.Parameters[2])
+					{
+						Expression obj = elemArg;
+
+						if (_wrapInSubQuery)
+							obj = Expression.PropertyOrField(elemArg, "Element");
+
+						if (_elementSelector == null)
+							return obj;
+
+						return _elementSelector.Body.Convert(e => e == _elementSelector.Parameters[0] ? obj : e);
+					}
+
+					if (ex == func.Parameters[3])
+						return _resultSelector.Body.Convert(e =>
+						{
+							if (e == _resultSelector.Parameters[0])
+								return Expression.PropertyOrField(resArg, "Key");
+
+							if (e == _resultSelector.Parameters[1])
+								return resArg;
+
+							return e;
+						});
+
+					return ex;
+				});
+
+				return expr;
+			}
+		}
+
+		static LambdaExpression GetLambda(Expression expression, params int[] n)
+		{
+			foreach (var i in n)
+				expression = ((MethodCallExpression)expression).Arguments[i].Unwrap();
+			return (LambdaExpression)expression;
+		}
+
+		Expression ConvertGroupBy(MethodCallExpression method)
+		{
+			if (method.Arguments[method.Arguments.Count - 1].Unwrap().NodeType != ExpressionType.Lambda)
+				return method;
+
+			var types = method.Method.GetGenericMethodDefinition().GetGenericArguments()
+				.Zip(method.Method.GetGenericArguments(), (n, t) => new { n = n.Name, t })
+				.ToDictionary(_ => _.n, _ => _.t);
+
+			var sourceExpression = OptimizeExpression(method.Arguments[0].Unwrap());
+			var keySelector      = (LambdaExpression)OptimizeExpression(method.Arguments[1].Unwrap());
+			var elementSelector  = types.ContainsKey("TElement") ? (LambdaExpression)OptimizeExpression(method.Arguments[2].Unwrap()) : null;
+			var resultSelector   = types.ContainsKey("TResult")  ?
+				(LambdaExpression)OptimizeExpression(method.Arguments[types.ContainsKey("TElement") ? 3 : 2].Unwrap()) : null;
+
+			var needSubQuery = null != ConvertExpression(keySelector.Body.Unwrap()).Find(IsExpression);
+
+			if (!needSubQuery && resultSelector == null && elementSelector != null)
+				return method;
+
+			var gtype  = typeof(GroupByHelper<,,,>).MakeGenericType(
+				types["TSource"],
+				types["TKey"],
+				types.ContainsKey("TElement") ? types["TElement"] : types["TSource"],
+				types.ContainsKey("TResult")  ? types["TResult"]  : types["TSource"]);
+
+			var helper =
+				//Expression.Lambda<Func<IGroupByHelper>>(
+				//	Expression.Convert(Expression.New(gtype), typeof(IGroupByHelper)))
+				//.Compile()();
+				(IGroupByHelper)Activator.CreateInstance(gtype);
+
+			helper.Set(needSubQuery, sourceExpression, keySelector, elementSelector, resultSelector);
+
+			if (method.Method.DeclaringType == typeof(Queryable))
+			{
+				if (!needSubQuery)
+					return resultSelector == null ? helper.AddElementSelectorQ() : helper.AddResultQ();
+
+				return resultSelector == null ? helper.WrapInSubQueryQ() : helper.WrapInSubQueryResultQ();
+			}
+			else
+			{
+				if (!needSubQuery)
+					return resultSelector == null ? helper.AddElementSelectorE() : helper.AddResultE();
+
+				return resultSelector == null ? helper.WrapInSubQueryE() : helper.WrapInSubQueryResultE();
+			}
+		}
+
+		bool IsExpression(Expression ex)
+		{
+			switch (ex.NodeType)
+			{
+				case ExpressionType.Convert        :
+				case ExpressionType.ConvertChecked :
+				case ExpressionType.MemberInit     :
+				case ExpressionType.New            :
+				case ExpressionType.NewArrayBounds :
+				case ExpressionType.NewArrayInit   :
+				case ExpressionType.Parameter      : return false;
+				case ExpressionType.MemberAccess   :
+					{
+						var ma   = (MemberExpression)ex;
+						var attr = GetFunctionAttribute(ma.Member);
+
+						if (attr != null)
+							return true;
+
+						return false;
+					}
+			}
+
+			return true;
+		}
+
+		#endregion
+
+		#region ConvertSelectMany
+
+		interface ISelectManyHelper
+		{
+			void Set(Expression sourceExpression, LambdaExpression colSelector);
+
+			Expression AddElementSelectorQ();
+			Expression AddElementSelectorE();
+		}
+
+		class SelectManyHelper<TSource,TCollection> : ISelectManyHelper
+		{
+			Expression       _sourceExpression;
+			LambdaExpression _colSelector;
+
+			public void Set(Expression sourceExpression, LambdaExpression colSelector)
+			{
+				_sourceExpression = sourceExpression;
+				_colSelector      = colSelector;
+			}
+
+			public Expression AddElementSelectorQ()
+			{
+				Expression<Func<IQueryable<TSource>,IEnumerable<TCollection>,IQueryable<TCollection>>> func = (source,col) => source
+					.SelectMany(colParam => col, (s,c) => c)
+					;
+
+				var body   = func.Body.Unwrap();
+				var colArg = GetLambda(body, 1).Parameters[0]; // .SelectMany(colParam
+
+				return Convert(func, colArg);
+			}
+
+			public Expression AddElementSelectorE()
+			{
+				Expression<Func<IEnumerable<TSource>,IEnumerable<TCollection>,IEnumerable<TCollection>>> func = (source,col) => source
+					.SelectMany(colParam => col, (s,c) => c)
+					;
+
+				var body   = func.Body.Unwrap();
+				var colArg = GetLambda(body, 1).Parameters[0]; // .SelectMany(colParam
+
+				return Convert(func, colArg);
+			}
+
+			Expression Convert(LambdaExpression func, ParameterExpression colArg)
+			{
+				var body = func.Body.Unwrap();
+				var expr = body.Convert(ex =>
+				{
+					if (ex == func.Parameters[0])
+						return _sourceExpression;
+
+					if (ex == func.Parameters[1])
+						return _colSelector.Body.Convert(e => e == _colSelector.Parameters[0] ? colArg : e);
+
+					return ex;
+				});
+
+				return expr;
+			}
+		}
+
+		Expression ConvertSelectMany(MethodCallExpression method)
+		{
+			if (method.Arguments.Count != 2 || ((LambdaExpression)method.Arguments[1].Unwrap()).Parameters.Count != 1)
+				return method;
+
+			var types = method.Method.GetGenericMethodDefinition().GetGenericArguments()
+				.Zip(method.Method.GetGenericArguments(), (n, t) => new { n = n.Name, t })
+				.ToDictionary(_ => _.n, _ => _.t);
+
+			var sourceExpression = OptimizeExpression(method.Arguments[0].Unwrap());
+			var colSelector      = (LambdaExpression)OptimizeExpression(method.Arguments[1].Unwrap());
+
+			var gtype  = typeof(SelectManyHelper<,>).MakeGenericType(types["TSource"], types["TResult"]);
+			var helper =
+				//Expression.Lambda<Func<ISelectManyHelper>>(
+				//	Expression.Convert(Expression.New(gtype), typeof(ISelectManyHelper)))
+				//.Compile()();
+				(ISelectManyHelper)Activator.CreateInstance(gtype);
+
+			helper.Set(sourceExpression, colSelector);
+
+			return method.Method.DeclaringType == typeof(Queryable) ?
+				helper.AddElementSelectorQ() :
+				helper.AddElementSelectorE();
+		}
+
+		#endregion
+
+		#region ConvertPredicate
+
+		Expression ConvertPredicate(MethodCallExpression method)
+		{
+			if (method.Arguments.Count != 2)
+				return method;
+
+			var cm = GetQueriableMethodInfo(method, (m,_) => m.Name == method.Method.Name && m.GetParameters().Length == 1);
+			var wm = GetMethodInfo(method, "Where");
+
+			var argType = method.Method.GetGenericArguments()[0];
+
+			wm = wm.MakeGenericMethod(argType);
+			cm = cm.MakeGenericMethod(argType);
+
+			return Expression.Call(null, cm,
+				Expression.Call(null, wm,
+					OptimizeExpression(method.Arguments[0]),
+					OptimizeExpression(method.Arguments[1])));
+		}
+
+		#endregion
+
+		#region ConvertSelector
+
+		Expression ConvertSelector(MethodCallExpression method, bool isGeneric)
+		{
+			if (method.Arguments.Count != 2)
+				return method;
+
+			isGeneric = isGeneric && method.Method.DeclaringType == typeof(Queryable);
+
+			var types = GetMethodGenericTypes(method);
+			var sm    = GetMethodInfo(method, "Select");
+			var cm    = GetQueriableMethodInfo(method, (m,isDefault) =>
+			{
+				if (m.Name == method.Method.Name)
+				{
+					var ps = m.GetParameters();
+
+					if (ps.Length == 1)
+					{
+						if (isGeneric)
+							return true;
+
+						var ts = ps[0].ParameterType.GetGenericArguments();
+						return ts[0] == types[1] || isDefault && ts[0].IsGenericParameter;
+					}
+				}
+
+				return false;
+			});
+
+			var argType = types[0];
+
+			sm = sm.MakeGenericMethod(argType, types[1]);
+
+			if (cm.IsGenericMethodDefinition)
+				cm = cm.MakeGenericMethod(types[1]);
+
+			return Expression.Call(null, cm,
+				OptimizeExpression(Expression.Call(null, sm,
+					method.Arguments[0],
+					method.Arguments[1])));
+		}
+
+		#endregion
+
+		#region ConvertSelect
+
+		Expression ConvertSelect(MethodCallExpression method)
+		{
+			var sequence = OptimizeExpression(method.Arguments[0]);
+			var lambda1  = (LambdaExpression)method.Arguments[1].Unwrap();
+			var lambda   = (LambdaExpression)OptimizeExpression(lambda1);
+
+			if (lambda1.Parameters.Count > 1 ||
+				sequence.NodeType != ExpressionType.Call ||
+				((MethodCallExpression)sequence).Method.Name != method.Method.Name)
+			{
+				return method;
+			}
+
+			var slambda = (LambdaExpression)((MethodCallExpression)sequence).Arguments[1].Unwrap();
+			var sbody   = slambda.Body.Unwrap();
+
+			if (slambda.Parameters.Count > 1 || sbody.NodeType != ExpressionType.MemberAccess)
+				return method;
+
+			var types1 = GetMethodGenericTypes((MethodCallExpression)sequence);
+			var types2 = GetMethodGenericTypes(method);
+
+			var expr = Expression.Call(null,
+				GetMethodInfo(method, "Select").MakeGenericMethod(types1[0], types2[1]),
+				((MethodCallExpression)sequence).Arguments[0],
+				Expression.Lambda(
+					lambda.Body.Convert(ex => ex == lambda.Parameters[0] ? sbody : ex),
+					slambda.Parameters[0]));
+
+			return expr;
+		}
+
+		#endregion
+
+		#region ConvertIQueriable
+
+		Expression ConvertIQueriable(Expression expression)
+		{
+			if (expression.NodeType == ExpressionType.MemberAccess || expression.NodeType == ExpressionType.Call)
+			{
+				var p    = Expression.Parameter(typeof(Expression), "exp");
+				var exas = expression.GetExpressionAccessors(p);
+				var expr = ReplaceParameter(exas, expression, _ => {});
+
+				if (expr.Find(e => e.NodeType == ExpressionType.Parameter && e != p) != null)
+					return expression;
+
+				var l    = Expression.Lambda<Func<Expression,IQueryable>>(Expression.Convert(expr, typeof(IQueryable)), new [] { p });
+				var n    = _query.AddQueryableAccessors(expression, l);
+
+				Expression accessor;
+
+				_expressionAccessors.TryGetValue(expression, out accessor);
+
+				var path =
+					Expression.Call(
+						Expression.Constant(_query),
+						ReflectionHelper.Expressor<Query>.MethodExpressor(a => a.GetIQueryable(0, null)),
+						new[] { Expression.Constant(n), accessor ?? Expression.Constant(null, typeof(Expression)) });
+
+				var qex = _query.GetIQueryable(n, expression);
+
+				if (expression.NodeType == ExpressionType.Call && qex.NodeType == ExpressionType.Call)
+				{
+					var m1 = (MethodCallExpression)expression;
+					var m2 = (MethodCallExpression)qex;
+
+					if (m1.Method == m2.Method)
+						return expression;
+				}
+
+				foreach (var a in qex.GetExpressionAccessors(path))
+					if (!_expressionAccessors.ContainsKey(a.Key))
+						_expressionAccessors.Add(a.Key, a.Value);
+
+				return qex;
+			}
+
+			throw new InvalidOperationException();
+		}
+
+		#endregion
+
+		#region ConvertElementAt
+
+		Expression ConvertElementAt(MethodCallExpression method)
+		{
+			var sequence   = OptimizeExpression(method.Arguments[0]);
+			var index      = OptimizeExpression(method.Arguments[1]).Unwrap();
+			var sourceType = method.Method.GetGenericArguments()[0];
+
+			MethodInfo skipMethod;
+
+			if (index.NodeType == ExpressionType.Lambda)
+			{
+				skipMethod = ReflectionHelper.Expressor<object>.MethodExpressor(o => LinqExtensions.Skip<object>(null, null));
+				skipMethod = skipMethod.GetGenericMethodDefinition();
+			}
+			else
+			{
+				skipMethod = GetQueriableMethodInfo(method, (mi,_) => mi.Name == "Skip");
+			}
+
+			skipMethod = skipMethod.MakeGenericMethod(sourceType);
+
+			var methodName  = method.Method.Name == "ElementAt" ? "First" : "FirstOrDefault";
+			var firstMethod = GetQueriableMethodInfo(method, (mi,_) => mi.Name == methodName && mi.GetParameters().Length == 1);
+
+			firstMethod = firstMethod.MakeGenericMethod(sourceType);
+
+			return Expression.Call(null, firstMethod, Expression.Call(null, skipMethod, sequence, index));
+		}
+
+		#endregion
+
+		#region Helpers
+
+		MethodInfo GetQueriableMethodInfo(MethodCallExpression method, Func<MethodInfo,bool,bool> predicate)
+		{
+			return method.Method.DeclaringType == typeof(Enumerable) ?
+				EnumerableMethods.FirstOrDefault(m => predicate(m, false)) ?? EnumerableMethods.First(m => predicate(m, true)):
+				QueryableMethods. FirstOrDefault(m => predicate(m, false)) ?? QueryableMethods. First(m => predicate(m, true));
+		}
+
+		MethodInfo GetMethodInfo(MethodCallExpression method, string name)
+		{
+			return method.Method.DeclaringType == typeof(Enumerable) ?
+				EnumerableMethods
+					.Where(m => m.Name == name && m.GetParameters().Length == 2)
+					.First(m => m.GetParameters()[1].ParameterType.GetGenericArguments().Length == 2) :
+				QueryableMethods
+					.Where(m => m.Name == name && m.GetParameters().Length == 2)
+					.First(m => m.GetParameters()[1].ParameterType.GetGenericArguments()[0].GetGenericArguments().Length == 2);
+		}
+
+		static Type[] GetMethodGenericTypes(MethodCallExpression method)
+		{
+			return method.Method.DeclaringType == typeof(Enumerable) ?
+				method.Method.GetParameters()[1].ParameterType.GetGenericArguments() :
+				method.Method.GetParameters()[1].ParameterType.GetGenericArguments()[0].GetGenericArguments();
+		}
+
+		#endregion
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/ExpressionContext.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,108 @@
+using System;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+	using Data.Sql;
+
+	public class ExpressionContext : SequenceContextBase
+	{
+		public ExpressionContext(IBuildContext parent, IBuildContext sequence, LambdaExpression lambda)
+			: base(parent, sequence, lambda)
+		{
+		}
+
+		public ExpressionContext(IBuildContext parent, IBuildContext sequence, LambdaExpression lambda, SqlQuery sqlQuery)
+			: base(parent, sequence, lambda)
+		{
+			SqlQuery = sqlQuery;
+		}
+
+		public override Expression BuildExpression(Expression expression, int level)
+		{
+			throw new InvalidOperationException();
+		}
+
+		public override SqlInfo[] ConvertToSql(Expression expression, int level, ConvertFlags flags)
+		{
+			if (level == 0)
+			{
+				switch (flags)
+				{
+					case ConvertFlags.Field :
+					case ConvertFlags.Key   :
+					case ConvertFlags.All   :
+						{
+							var root = expression.GetRootObject();
+
+							if (root.NodeType == ExpressionType.Parameter)
+							{
+								var ctx = Builder.GetContext(this, root);
+
+								if (ctx != null)
+								{
+									if (ctx != this)
+										return ctx.ConvertToSql(expression, 0, flags);
+
+									return root == expression ?
+										Sequence.ConvertToSql(null,       0,         flags) :
+										Sequence.ConvertToSql(expression, level + 1, flags);
+								}
+							}
+
+							break;
+						}
+				}
+
+				throw new InvalidOperationException();
+			}
+
+			throw new InvalidOperationException();
+		}
+
+		public override SqlInfo[] ConvertToIndex(Expression expression, int level, ConvertFlags flags)
+		{
+			throw new InvalidOperationException();
+		}
+
+		public override IsExpressionResult IsExpression(Expression expression, int level, RequestFor requestFlag)
+		{
+			switch (requestFlag)
+			{
+				case RequestFor.Root        : return new IsExpressionResult(Lambda.Parameters.Count > 0 && expression == Lambda.Parameters[0]);
+
+				case RequestFor.Table       :
+				case RequestFor.Association :
+				case RequestFor.Object      :
+				case RequestFor.GroupJoin   :
+				case RequestFor.Field       :
+				case RequestFor.Expression  :
+					{
+						var levelExpression = expression.GetLevelExpression(level);
+
+						return levelExpression == expression ?
+							Sequence.IsExpression(null,       0,         requestFlag) :
+							Sequence.IsExpression(expression, level + 1, requestFlag);
+					}
+			}
+
+			return IsExpressionResult.False;
+		}
+
+		public override IBuildContext GetContext(Expression expression, int level, BuildInfo buildInfo)
+		{
+			if (expression == Lambda.Parameters[0])
+				return Sequence.GetContext(null, 0, buildInfo);
+
+			switch (expression.NodeType)
+			{
+				case ExpressionType.Constant   :
+				case ExpressionType.New        :
+				case ExpressionType.MemberInit : return null;
+			}
+
+			return Sequence.GetContext(expression, level + 1, buildInfo);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/ExpressionHoder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+using System;
+
+#pragma warning disable 649
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	class ExpressionHoder<TP,TE>
+	{
+		public TP p;
+		public TE ex;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/ExpressionTestGenerator.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,873 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Text;
+
+using BLToolkit.Linq;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	class ExpressionTestGenerator
+	{
+		readonly StringBuilder _exprBuilder = new StringBuilder();
+
+		string _indent = "\t\t\t\t";
+
+		void PushIndent() { _indent += '\t'; }
+		void PopIndent () { _indent = _indent.Substring(1); }
+
+		readonly HashSet<Expression> _visitedExprs = new HashSet<Expression>();
+
+		bool BuildExpression(Expression expr)
+		{
+			switch (expr.NodeType)
+			{
+				case ExpressionType.Add:
+				case ExpressionType.AddChecked:
+				case ExpressionType.And:
+				case ExpressionType.AndAlso:
+#if FW4 || SILVERLIGHT
+				case ExpressionType.Assign:
+#endif
+				case ExpressionType.Coalesce:
+				case ExpressionType.Divide:
+				case ExpressionType.Equal:
+				case ExpressionType.ExclusiveOr:
+				case ExpressionType.GreaterThan:
+				case ExpressionType.GreaterThanOrEqual:
+				case ExpressionType.LeftShift:
+				case ExpressionType.LessThan:
+				case ExpressionType.LessThanOrEqual:
+				case ExpressionType.Modulo:
+				case ExpressionType.Multiply:
+				case ExpressionType.MultiplyChecked:
+				case ExpressionType.NotEqual:
+				case ExpressionType.Or:
+				case ExpressionType.OrElse:
+				case ExpressionType.Power:
+				case ExpressionType.RightShift:
+				case ExpressionType.Subtract:
+				case ExpressionType.SubtractChecked:
+					{
+						var e = (BinaryExpression)expr;
+
+						_exprBuilder.Append("(");
+
+						e.Left.Visit(new Func<Expression,bool>(BuildExpression));
+
+						switch (expr.NodeType)
+						{
+							case ExpressionType.Add                :
+							case ExpressionType.AddChecked         : _exprBuilder.Append(" + ");  break;
+							case ExpressionType.And                : _exprBuilder.Append(" & ");  break;
+							case ExpressionType.AndAlso            : _exprBuilder.Append(" && "); break;
+#if FW4 || SILVERLIGHT
+							case ExpressionType.Assign             : _exprBuilder.Append(" = ");  break;
+#endif
+							case ExpressionType.Coalesce           : _exprBuilder.Append(" ?? "); break;
+							case ExpressionType.Divide             : _exprBuilder.Append(" / ");  break;
+							case ExpressionType.Equal              : _exprBuilder.Append(" == "); break;
+							case ExpressionType.ExclusiveOr        : _exprBuilder.Append(" ^ ");  break;
+							case ExpressionType.GreaterThan        : _exprBuilder.Append(" > ");  break;
+							case ExpressionType.GreaterThanOrEqual : _exprBuilder.Append(" >= "); break;
+							case ExpressionType.LeftShift          : _exprBuilder.Append(" << "); break;
+							case ExpressionType.LessThan           : _exprBuilder.Append(" < ");  break;
+							case ExpressionType.LessThanOrEqual    : _exprBuilder.Append(" <= "); break;
+							case ExpressionType.Modulo             : _exprBuilder.Append(" % ");  break;
+							case ExpressionType.Multiply           :
+							case ExpressionType.MultiplyChecked    : _exprBuilder.Append(" * ");  break;
+							case ExpressionType.NotEqual           : _exprBuilder.Append(" != "); break;
+							case ExpressionType.Or                 : _exprBuilder.Append(" | ");  break;
+							case ExpressionType.OrElse             : _exprBuilder.Append(" || "); break;
+							case ExpressionType.Power              : _exprBuilder.Append(" ** "); break;
+							case ExpressionType.RightShift         : _exprBuilder.Append(" >> "); break;
+							case ExpressionType.Subtract           :
+							case ExpressionType.SubtractChecked    : _exprBuilder.Append(" - ");  break;
+						}
+
+						e.Right.Visit(new Func<Expression,bool>(BuildExpression));
+
+						_exprBuilder.Append(")");
+
+						return false;
+					}
+
+				case ExpressionType.ArrayLength:
+					{
+						var e = (UnaryExpression)expr;
+
+						e.Operand.Visit(new Func<Expression,bool>(BuildExpression));
+						_exprBuilder.Append(".Length");
+
+						return false;
+					}
+
+				case ExpressionType.Convert:
+				case ExpressionType.ConvertChecked:
+					{
+						var e = (UnaryExpression)expr;
+
+						_exprBuilder.AppendFormat("({0})", GetTypeName(e.Type));
+						e.Operand.Visit(new Func<Expression,bool>(BuildExpression));
+
+						return false;
+					}
+
+				case ExpressionType.Negate:
+				case ExpressionType.NegateChecked:
+					{
+						_exprBuilder.Append("-");
+						return true;
+					}
+
+				case ExpressionType.Not:
+					{
+						_exprBuilder.Append("!");
+						return true;
+					}
+
+				case ExpressionType.Quote:
+					return true;
+
+				case ExpressionType.TypeAs:
+					{
+						var e = (UnaryExpression)expr;
+
+						_exprBuilder.Append("(");
+						e.Operand.Visit(new Func<Expression,bool>(BuildExpression));
+						_exprBuilder.AppendFormat(" as {0})", GetTypeName(e.Type));
+
+						return false;
+					}
+
+				case ExpressionType.UnaryPlus:
+					{
+						_exprBuilder.Append("+");
+						return true;
+					}
+
+				case ExpressionType.ArrayIndex:
+					{
+						var e = (BinaryExpression)expr;
+
+						e.Left.Visit(new Func<Expression,bool>(BuildExpression));
+						_exprBuilder.Append("[");
+						e.Right.Visit(new Func<Expression,bool>(BuildExpression));
+						_exprBuilder.Append("]");
+
+						return false;
+					}
+
+				case ExpressionType.MemberAccess :
+					{
+						var e = (MemberExpression)expr;
+
+						e.Expression.Visit(new Func<Expression,bool>(BuildExpression));
+						_exprBuilder.AppendFormat(".{0}", e.Member.Name);
+
+						return false;
+					}
+
+				case ExpressionType.Parameter :
+					{
+						var e = (ParameterExpression)expr;
+						_exprBuilder.Append(e.Name);
+						return false;
+					}
+
+				case ExpressionType.Call :
+					{
+						var ex = (MethodCallExpression)expr;
+						var mi = ex.Method;
+
+						var attrs = mi.GetCustomAttributes(typeof(ExtensionAttribute), false);
+
+						if (attrs.Length != 0)
+						{
+							ex.Arguments[0].Visit(new Func<Expression,bool>(BuildExpression));
+							PushIndent();
+							_exprBuilder.AppendLine().Append(_indent);
+						}
+						else if (ex.Object != null)
+							ex.Object.Visit(new Func<Expression,bool>(BuildExpression));
+						else
+							_exprBuilder.Append(GetTypeName(mi.DeclaringType));
+
+						_exprBuilder.Append(".").Append(mi.Name);
+
+						if (mi.IsGenericMethod && mi.GetGenericArguments().Select(GetTypeName).All(t => t != null))
+						{
+							_exprBuilder
+								.Append("<")
+								.Append(GetTypeNames(mi.GetGenericArguments(), ","))
+								.Append(">");
+						}
+
+						_exprBuilder.Append("(");
+
+						PushIndent();
+
+						var n = attrs.Length != 0 ? 1 : 0;
+
+						for (var i = n; i < ex.Arguments.Count; i++)
+						{
+							if (i != n)
+								_exprBuilder.Append(",");
+
+							_exprBuilder.AppendLine().Append(_indent);
+
+							ex.Arguments[i].Visit(new Func<Expression,bool>(BuildExpression));
+						}
+
+						PopIndent();
+
+						_exprBuilder.Append(")");
+
+						if (attrs.Length != 0)
+						{
+							PopIndent();
+						}
+
+						return false;
+					}
+
+				case ExpressionType.Constant:
+					{
+						var c = (ConstantExpression)expr;
+
+						if (c.Value is IQueryable)
+						{
+							var e = ((IQueryable)c.Value).Expression;
+
+							if (_visitedExprs.Add(e))
+							{
+								e.Visit(new Func<Expression,bool>(BuildExpression));
+								return false;
+							}
+						}
+
+						_exprBuilder.Append(expr);
+
+						return true;
+					}
+
+				case ExpressionType.Lambda:
+					{
+						var le = (LambdaExpression)expr;
+						var ps = le.Parameters
+							.Select(p => (GetTypeName(p.Type) + " " + p.Name).TrimStart())
+							.Aggregate("", (p1, p2) => p1 + ", " + p2, p => p.TrimStart(',', ' '));
+
+						_exprBuilder.Append("(").Append(ps).Append(") => ");
+
+						le.Body.Visit(new Func<Expression,bool>(BuildExpression));
+						return false;
+					}
+
+				case ExpressionType.Conditional:
+					{
+						var e = (ConditionalExpression)expr;
+
+						_exprBuilder.Append("(");
+						e.Test.Visit(new Func<Expression,bool>(BuildExpression));
+						_exprBuilder.Append(" ? ");
+						e.IfTrue.Visit(new Func<Expression,bool>(BuildExpression));
+						_exprBuilder.Append(" : ");
+						e.IfFalse.Visit(new Func<Expression,bool>(BuildExpression));
+						_exprBuilder.Append(")");
+
+						return false;
+					}
+
+				case ExpressionType.New:
+					{
+						var ne = (NewExpression)expr;
+
+						if (IsAnonymous(ne.Type))
+						{
+							if (ne.Members.Count == 1)
+							{
+								_exprBuilder.AppendFormat("new {{ {0} = ", ne.Members[0].Name);
+								ne.Arguments[0].Visit(new Func<Expression,bool>(BuildExpression));
+								_exprBuilder.Append(" }}");
+							}
+							else
+							{
+								_exprBuilder.AppendLine("new").Append(_indent).Append("{");
+
+								PushIndent();
+
+								for (var i = 0; i < ne.Members.Count; i++)
+								{
+									_exprBuilder.AppendLine().Append(_indent).AppendFormat("{0} = ", ne.Members[i].Name);
+									ne.Arguments[i].Visit(new Func<Expression,bool>(BuildExpression));
+
+									if (i + 1 < ne.Members.Count)
+										_exprBuilder.Append(",");
+								}
+
+								PopIndent();
+								_exprBuilder.AppendLine().Append(_indent).Append("}");
+							}
+						}
+						else
+						{
+							_exprBuilder.AppendFormat("new {0}(", GetTypeName(ne.Type));
+
+							for (var i = 0; i < ne.Arguments.Count; i++)
+							{
+								ne.Arguments[i].Visit(new Func<Expression,bool>(BuildExpression));
+								if (i + 1 < ne.Arguments.Count)
+									_exprBuilder.Append(", ");
+							}
+
+							_exprBuilder.Append(")");
+						}
+
+						return false;
+					}
+
+				case ExpressionType.MemberInit:
+					{
+						Func<MemberBinding,bool> modify = b =>
+						{
+							switch (b.BindingType)
+							{
+								case MemberBindingType.Assignment    :
+									var ma = (MemberAssignment)b;
+									_exprBuilder.AppendFormat("{0} = ", ma.Member.Name);
+									ma.Expression.Visit(new Func<Expression,bool>(BuildExpression));
+									break;
+								default:
+									_exprBuilder.Append(b.ToString());
+									break;
+							}
+
+							return true;
+						};
+
+						var e = (MemberInitExpression)expr;
+
+						e.NewExpression.Visit(new Func<Expression,bool>(BuildExpression));
+
+						if (e.Bindings.Count == 1)
+						{
+							_exprBuilder.Append(" { ");
+							modify(e.Bindings[0]);
+							_exprBuilder.Append(" }");
+						}
+						else
+						{
+							_exprBuilder.AppendLine().Append(_indent).Append("{");
+
+							PushIndent();
+
+							for (var i = 0; i < e.Bindings.Count; i++)
+							{
+								_exprBuilder.AppendLine().Append(_indent);
+								modify(e.Bindings[i]);
+								if (i + 1 < e.Bindings.Count)
+									_exprBuilder.Append(",");
+							}
+
+							PopIndent();
+							_exprBuilder.AppendLine().Append(_indent).Append("}");
+						}
+
+						return false;
+					}
+
+				case ExpressionType.NewArrayInit:
+					{
+						var e = (NewArrayExpression)expr;
+
+						_exprBuilder.AppendFormat("new {0}[]", GetTypeName(e.Type.GetElementType()));
+
+						if (e.Expressions.Count == 1)
+						{
+							_exprBuilder.Append(" { ");
+							e.Expressions[0].Visit(new Func<Expression,bool>(BuildExpression));
+							_exprBuilder.Append(" }");
+						}
+						else
+						{
+							_exprBuilder.AppendLine().Append(_indent).Append("{");
+
+							PushIndent();
+
+							for (var i = 0; i < e.Expressions.Count; i++)
+							{
+								_exprBuilder.AppendLine().Append(_indent);
+								e.Expressions[i].Visit(new Func<Expression,bool>(BuildExpression));
+								if (i + 1 < e.Expressions.Count)
+									_exprBuilder.Append(",");
+							}
+
+							PopIndent();
+							_exprBuilder.AppendLine().Append(_indent).Append("}");
+						}
+
+						return false;
+					}
+
+				case ExpressionType.TypeIs:
+					{
+						var e = (TypeBinaryExpression)expr;
+
+						_exprBuilder.Append("(");
+						e.Expression.Visit(new Func<Expression, bool>(BuildExpression));
+						_exprBuilder.AppendFormat(" is {0})", e.TypeOperand);
+
+						return false;
+					}
+
+				case ExpressionType.ListInit:
+					{
+						var e = (ListInitExpression)expr;
+
+						e.NewExpression.Visit(new Func<Expression,bool>(BuildExpression));
+
+						if (e.Initializers.Count == 1)
+						{
+							_exprBuilder.Append(" { ");
+							e.Initializers[0].Arguments[0].Visit(new Func<Expression, bool>(BuildExpression));
+							_exprBuilder.Append(" }");
+						}
+						else
+						{
+							_exprBuilder.AppendLine().Append(_indent).Append("{");
+
+							PushIndent();
+
+							for (var i = 0; i < e.Initializers.Count; i++)
+							{
+								_exprBuilder.AppendLine().Append(_indent);
+								e.Initializers[i].Arguments[0].Visit(new Func<Expression,bool>(BuildExpression));
+								if (i + 1 < e.Initializers.Count)
+									_exprBuilder.Append(",");
+							}
+
+							PopIndent();
+							_exprBuilder.AppendLine().Append(_indent).Append("}");
+						}
+
+						return false;
+					}
+
+				case ExpressionType.Invoke:
+					{
+						var e = (InvocationExpression)expr;
+
+						_exprBuilder.Append("Expression.Invoke(");
+						e.Expression.Visit(new Func<Expression,bool>(BuildExpression));
+						_exprBuilder.Append(", (");
+
+						for (var i = 0; i < e.Arguments.Count; i++)
+						{
+							e.Arguments[i].Visit(new Func<Expression,bool>(BuildExpression));
+							if (i + 1 < e.Arguments.Count)
+								_exprBuilder.Append(", ");
+						}
+						_exprBuilder.Append("))");
+
+						return false;
+					}
+
+				default:
+					_exprBuilder.AppendLine("// Unknown expression.").Append(_indent).Append(expr);
+					return false;
+			}
+		}
+
+		readonly Dictionary<Type,string> _typeNames = new Dictionary<Type,string>
+		{
+			{ typeof(object), "object" },
+			{ typeof(bool),   "bool"   },
+			{ typeof(int),    "int"    },
+			{ typeof(string), "string" },
+		};
+
+		readonly StringBuilder _typeBuilder = new StringBuilder();
+
+		void BuildType(Type type)
+		{
+			if (type.Namespace != null && type.Namespace.StartsWith("System") ||
+				IsAnonymous(type)                                             ||
+				type.Assembly == GetType().Assembly                           ||
+				type.IsGenericType && type.GetGenericTypeDefinition() != type)
+				return;
+
+			var name = type.Name;//.Replace('<', '_').Replace('>', '_').Replace('`', '_').Replace("__f__", "");
+
+			var idx = name.LastIndexOf("`");
+
+			if (idx > 0)
+				name = name.Substring(0, idx);
+
+			if (type.IsGenericType)
+				type = type.GetGenericTypeDefinition();
+
+			var baseClasses = new[] { type.BaseType }
+				.Where(t => t != null && t != typeof(object))
+				.Concat(type.GetInterfaces()).ToArray();
+
+			var ctors = type.GetConstructors().Select(c =>
+			{
+#if SILVERLIGHT
+				var attrs = c.GetCustomAttributes(false).ToList();
+#else
+				var attrs = c.GetCustomAttributesData();
+#endif
+				var ps    = c.GetParameters().Select(p => GetTypeName(p.ParameterType) + " " + p.Name).ToArray();
+				return string.Format(
+					"{0}\n\t\tpublic {1}({2})\n\t\t{{\n\t\t\tthrow new NotImplementedException();\n\t\t}}",
+					attrs.Count > 0 ? attrs.Select(a => "\n\t\t" + a.ToString()).Aggregate((a1,a2) => a1 + a2) : "",
+					name,
+					ps.Length == 0 ? "" : ps.Aggregate((s,t) => s + ", " + t));
+			}).ToList();
+
+			if (ctors.Count == 1 && ctors[0].IndexOf("()") >= 0)
+				ctors.Clear();
+
+			var members = type.GetFields().Intersect(_usedMembers.OfType<FieldInfo>()).Select(f =>
+			{
+#if SILVERLIGHT
+				var attrs = f.GetCustomAttributes(false).ToList();
+#else
+				var attrs = f.GetCustomAttributesData();
+#endif
+				return string.Format(
+					"{0}\n\t\tpublic {1} {2};",
+					attrs.Count > 0 ? attrs.Select(a => "\n\t\t" + a.ToString()).Aggregate((a1,a2) => a1 + a2) : "",
+					GetTypeName(f.FieldType),
+					f.Name);
+			})
+			.Concat(
+				type.GetProperties().Intersect(_usedMembers.OfType<PropertyInfo>()).Select(p =>
+				{
+#if SILVERLIGHT
+					var attrs = p.GetCustomAttributes(false).ToList();
+#else
+					var attrs = p.GetCustomAttributesData();
+#endif
+					return string.Format(
+						"{0}\n\t\t{3}{1} {2} {{ get; set; }}",
+						attrs.Count > 0 ? attrs.Select(a => "\n\t\t" + a.ToString()).Aggregate((a1,a2) => a1 + a2) : "",
+						GetTypeName(p.PropertyType),
+						p.Name,
+						type.IsInterface ? "" : "public ");
+				}))
+			.Concat(
+				type.GetMethods().Intersect(_usedMembers.OfType<MethodInfo>()).Select(m =>
+				{
+#if SILVERLIGHT
+					var attrs = m.GetCustomAttributes(false).ToList();
+#else
+					var attrs = m.GetCustomAttributesData();
+#endif
+					var ps    = m.GetParameters().Select(p => GetTypeName(p.ParameterType) + " " + p.Name).ToArray();
+					return string.Format(
+						"{0}\n\t\t{5}{4}{1} {2}({3})\n\t\t{{\n\t\t\tthrow new NotImplementedException();\n\t\t}}",
+						attrs.Count > 0 ? attrs.Select(a => "\n\t\t" + a.ToString()).Aggregate((a1,a2) => a1 + a2) : "",
+						GetTypeName(m.ReturnType),
+						m.Name,
+						ps.Length == 0 ? "" : ps.Aggregate((s,t) => s + ", " + t),
+						m.IsStatic   ? "static "   :
+						m.IsVirtual  ? "virtual "  :
+						m.IsAbstract ? "abstract " :
+						               "",
+						type.IsInterface ? "" : "public ");
+				}))
+			.ToArray();
+
+			{
+#if SILVERLIGHT
+				var attrs = type.GetCustomAttributes(false).ToList();
+#else
+				var attrs = type.GetCustomAttributesData();
+#endif
+
+				_typeBuilder.AppendFormat(
+					type.IsGenericType ?
+@"
+namespace {0}
+{{{8}
+	{6}{7}{1} {2}<{3}>{5}
+	{{{4}{9}
+	}}
+}}
+"
+:
+@"
+namespace {0}
+{{{8}
+	{6}{7}{1} {2}{5}
+	{{{4}{9}
+	}}
+}}
+",
+					type.Namespace,
+					type.IsInterface ? "interface" : type.IsClass ? "class" : "struct",
+					name,
+					type.IsGenericType ? GetTypeNames(type.GetGenericArguments(), ",") : null,
+					ctors.Count == 0 ? "" : ctors.Aggregate((s,t) => s + "\n" + t),
+					baseClasses.Length == 0 ? "" : " : " + GetTypeNames(baseClasses),
+					type.IsPublic ? "public " : "",
+					type.IsAbstract && !type.IsInterface ? "abstract " : "",
+					attrs.Count > 0 ? attrs.Select(a => "\n\t" + a.ToString()).Aggregate((a1,a2) => a1 + a2) : "",
+					members.Length > 0 ?
+						(ctors.Count != 0 ? "\n" : "") + members.Aggregate((f1,f2) => f1 + "\n" + f2) :
+						"");
+			}
+		}
+
+		string GetTypeNames(IEnumerable<Type> types, string separator = ", ")
+		{
+			return types.Select(GetTypeName).Aggregate("", (t1,t2) => t1 + separator + t2, p => p.TrimStart(separator.ToCharArray()));
+		}
+
+		bool IsAnonymous(Type type)
+		{
+			return type.Name.StartsWith("<>f__AnonymousType");
+		}
+
+		string GetTypeName(Type type)
+		{
+			if (type == null || type == typeof(object))
+				return null;
+
+			if (type.IsGenericParameter)
+				return type.ToString();
+
+			string name;
+
+			if (_typeNames.TryGetValue(type, out name))
+				return name;
+
+			if (IsAnonymous(type))
+			{
+				_typeNames[type] = null;
+				return null;
+			}
+
+			if (type.IsGenericType)
+			{
+				var args = type.GetGenericArguments();
+
+				name = "";
+
+				if (type.Namespace != "System")
+					name = type.Namespace + ".";
+
+				name += type.Name;
+
+				var idx = name.LastIndexOf("`");
+
+				if (idx > 0)
+					name = name.Substring(0, idx);
+
+				if (type.GetGenericTypeDefinition() == typeof(Nullable<>))
+				{
+					name = string.Format("{0}?", GetTypeName(args[0]));
+				}
+				else
+				{
+					name = string.Format("{0}<{1}>",
+						name,
+						args.Select(GetTypeName).Aggregate("", (s,t) => s + "," + t, p => p.TrimStart(',')));
+				}
+
+				_typeNames[type] = name;
+
+				return name;
+			}
+
+			if (type.Namespace == "System")
+				return type.Name;
+
+			return type.ToString();
+		}
+
+		readonly HashSet<MemberInfo> _usedMembers = new HashSet<MemberInfo>();
+
+		void VisitMembers(Expression expr)
+		{
+			switch (expr.NodeType)
+			{
+				case ExpressionType.Call :
+					{
+						var ex = (MethodCallExpression)expr;
+						_usedMembers.Add(ex.Method);
+
+						if (ex.Method.IsGenericMethod)
+						{
+							var gmd = ex.Method.GetGenericMethodDefinition();
+
+							if (gmd != ex.Method)
+								_usedMembers.Add(gmd);
+
+							var ga = ex.Method.GetGenericArguments();
+
+							foreach (var type in ga)
+								_usedMembers.Add(type);
+						}
+
+						break;
+					}
+
+				case ExpressionType.MemberAccess :
+					{
+						var ex = (MemberExpression)expr;
+						_usedMembers.Add(ex.Member);
+						break;
+					}
+
+				case ExpressionType.MemberInit :
+					{
+						var ex = (MemberInitExpression)expr;
+
+						Action<IEnumerable<MemberBinding>> visit = null; visit = bs =>
+						{
+							foreach (var b in bs)
+							{
+								_usedMembers.Add(b.Member);
+
+								switch (b.BindingType)
+								{
+									case MemberBindingType.MemberBinding :
+										visit(((MemberMemberBinding)b).Bindings);
+										break;
+								}}
+						};
+
+						visit(ex.Bindings);
+						break;
+					}
+			}
+		}
+
+		readonly HashSet<Type> _usedTypes = new HashSet<Type>();
+
+		void AddType(Type type)
+		{
+			if (type == null || type == typeof(object) || type.IsGenericParameter || _usedTypes.Contains(type))
+				return;
+
+			_usedTypes.Add(type);
+
+			if (type.IsGenericType)
+				foreach (var arg in type.GetGenericArguments())
+					AddType(arg);
+
+			if (type.IsGenericType && type.GetGenericTypeDefinition() != type)
+				AddType(type.GetGenericTypeDefinition());
+
+			AddType(type.BaseType);
+
+			foreach (var i in type.GetInterfaces())
+				AddType(i);
+		}
+
+		void VisitTypes(Expression expr)
+		{
+			AddType(expr.Type);
+
+			switch (expr.NodeType)
+			{
+				case ExpressionType.Call :
+					{
+						var ex = (MethodCallExpression)expr;
+						var mi = ex.Method;
+
+						AddType(mi.DeclaringType);
+						AddType(mi.ReturnType);
+
+						foreach (var arg in mi.GetGenericArguments())
+							AddType(arg);
+
+						break;
+					}
+			}
+		}
+
+		public string GenerateSource(Expression expr)
+		{
+			string       fileName = null;
+			StreamWriter sw       = null;
+
+			try
+			{
+				var dir = Path.Combine(Path.GetTempPath(), "bltookit\\");
+
+				if (!Directory.Exists(dir))
+					Directory.CreateDirectory(dir);
+
+				var number = 0;//DateTime.Now.Ticks;
+
+				fileName = Path.Combine(dir, "ExpressionTest." + number  + ".cs");
+
+				expr.Visit(new Action<Expression>(VisitMembers));
+				expr.Visit(new Action<Expression>(VisitTypes));
+
+				foreach (var type in _usedTypes.OrderBy(t => t.Namespace).ThenBy(t => t.Name))
+					BuildType(type);
+
+				expr.Visit(new Func<Expression,bool>(BuildExpression));
+
+				_exprBuilder.Replace("<>h__TransparentIdentifier", "tp");
+
+				sw = File.CreateText(fileName);
+
+				sw.WriteLine(@"//---------------------------------------------------------------------------------------------------
+// This code was generated by BLToolkit.
+//---------------------------------------------------------------------------------------------------
+using System;
+using System.Linq.Expressions;
+
+using NUnit.Framework;
+{0}
+namespace Data.Linq.UserTests
+{{
+	[TestFixture]
+	public class UserTest : TestBase
+	{{
+		[Test]
+		public void Test([DataContexts] string context)
+		{{
+			// {1}
+			using (var db = GetDataContext(context))
+			{{
+				{2};
+			}}
+		}}
+	}}
+}}
+",
+					_typeBuilder,
+					expr,
+					_exprBuilder);
+			}
+			catch(Exception ex)
+			{
+				if (sw != null)
+				{
+					sw.WriteLine();
+					sw.WriteLine(ex.GetType());
+					sw.WriteLine(ex.Message);
+					sw.WriteLine(ex.StackTrace);
+				}
+			}
+			finally
+			{
+				if (sw != null)
+					sw.Close();
+			}
+
+			return fileName;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/FirstSingleBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,172 @@
+using System;
+using System.Linq;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+	using Data.Sql;
+	using Reflection;
+
+	class FirstSingleBuilder : MethodCallBuilder
+	{
+		public static string[] MethodNames = new[] { "First", "FirstOrDefault", "Single", "SingleOrDefault" };
+
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			return 
+				methodCall.IsQueryable(MethodNames) &&
+				methodCall.Arguments.Count == 1;
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
+			var take     = 0;
+
+			if (!buildInfo.IsSubQuery || builder.SqlProvider.IsSubQueryTakeSupported)
+				switch (methodCall.Method.Name)
+				{
+					case "First"           :
+					case "FirstOrDefault"  :
+						take = 1;
+						break;
+
+					case "Single"          :
+					case "SingleOrDefault" :
+						if (!buildInfo.IsSubQuery)
+							take = 2;
+						break;
+				}
+
+			if (take != 0)
+				builder.BuildTake(sequence, new SqlValue(take));
+
+			return new FirstSingleContext(buildInfo.Parent, sequence, methodCall);
+		}
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			if (methodCall.Arguments.Count == 2)
+			{
+				var predicate = (LambdaExpression)methodCall.Arguments[1].Unwrap();
+				var info      = builder.ConvertSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]), predicate.Parameters[0]);
+
+				if (info != null)
+				{
+					info.Expression = methodCall.Convert(ex => ConvertMethod(methodCall, 0, info, predicate.Parameters[0], ex));
+					info.Parameter  = param;
+
+					return info;
+				}
+			}
+			else
+			{
+				var info = builder.ConvertSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]), null);
+
+				if (info != null)
+				{
+					info.Expression = methodCall.Convert(ex => ConvertMethod(methodCall, 0, info, null, ex));
+					info.Parameter  = param;
+
+					return info;
+				}
+			}
+
+			return null;
+		}
+
+		public class FirstSingleContext : SequenceContextBase
+		{
+			public FirstSingleContext(IBuildContext parent, IBuildContext sequence, MethodCallExpression methodCall)
+				: base(parent, sequence, null)
+			{
+				_methodCall = methodCall;
+			}
+
+			readonly MethodCallExpression _methodCall;
+
+			public override void BuildQuery<T>(Query<T> query, ParameterExpression queryParameter)
+			{
+				Sequence.BuildQuery(query, queryParameter);
+
+				switch (_methodCall.Method.Name)
+				{
+					case "First"           : query.GetElement = (ctx, db, expr, ps) => query.GetIEnumerable(ctx, db, expr, ps).First();           break;
+					case "FirstOrDefault"  : query.GetElement = (ctx, db, expr, ps) => query.GetIEnumerable(ctx, db, expr, ps).FirstOrDefault();  break;
+					case "Single"          : query.GetElement = (ctx, db, expr, ps) => query.GetIEnumerable(ctx, db, expr, ps).Single();          break;
+					case "SingleOrDefault" : query.GetElement = (ctx, db, expr, ps) => query.GetIEnumerable(ctx, db, expr, ps).SingleOrDefault(); break;
+				}
+			}
+
+			static object SequenceException()
+			{
+				return new object[0].First();
+			}
+
+			public override Expression BuildExpression(Expression expression, int level)
+			{
+				if (expression == null)
+				{
+					if (Builder.SqlProvider.IsApplyJoinSupported && Parent.SqlQuery.GroupBy.IsEmpty)
+					{
+						var join = SqlQuery.OuterApply(SqlQuery);
+
+						Parent.SqlQuery.From.Tables[0].Joins.Add(join.JoinedTable);
+
+						var expr = Sequence.BuildExpression(expression, level);
+						var idx  = SqlQuery.Select.Add(new SqlValue(1));
+
+						idx = ConvertToParentIndex(idx, this);
+
+						var defaultValue = _methodCall.Method.Name.EndsWith("OrDefault") ?
+							Expression.Constant(TypeHelper.GetDefaultValue(expr.Type), expr.Type) as Expression :
+							Expression.Convert(
+								Expression.Call(
+									null,
+									ReflectionHelper.Expressor<object>.MethodExpressor(_ => SequenceException())),
+								expr.Type);
+
+						expr = Expression.Condition(
+							Expression.Call(
+								ExpressionBuilder.DataReaderParam,
+								ReflectionHelper.DataReader.IsDBNull,
+								Expression.Constant(idx)),
+							defaultValue,
+							expr);
+
+						return expr;
+					}
+
+					if (Sequence.IsExpression(null, level, RequestFor.Object).Result)
+						return Builder.BuildMultipleQuery(Parent, _methodCall);
+
+					return Builder.BuildSql(_methodCall.Type, Parent.SqlQuery.Select.Add(SqlQuery));
+				}
+
+				throw new InvalidOperationException();
+			}
+
+			public override SqlInfo[] ConvertToSql(Expression expression, int level, ConvertFlags flags)
+			{
+				return Sequence.ConvertToSql(expression, level + 1, flags);
+			}
+
+			public override SqlInfo[] ConvertToIndex(Expression expression, int level, ConvertFlags flags)
+			{
+				return Sequence.ConvertToIndex(expression, level, flags);
+			}
+
+			public override IsExpressionResult IsExpression(Expression expression, int level, RequestFor requestFlag)
+			{
+				return Sequence.IsExpression(expression, level, requestFlag);
+			}
+
+			public override IBuildContext GetContext(Expression expression, int level, BuildInfo buildInfo)
+			{
+				throw new InvalidOperationException();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/GroupByBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,621 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+	using Data.Sql;
+
+	class GroupByBuilder : MethodCallBuilder
+	{
+		#region Builder Methods
+
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			if (!methodCall.IsQueryable("GroupBy"))
+				return false;
+
+			var body = ((LambdaExpression)methodCall.Arguments[1].Unwrap()).Body.Unwrap();
+
+			if (body.NodeType == ExpressionType.MemberInit)
+			{
+				var mi = (MemberInitExpression)body;
+				bool throwExpr;
+
+				if (mi.NewExpression.Arguments.Count > 0 || mi.Bindings.Count == 0)
+					throwExpr = true;
+				else
+					throwExpr = mi.Bindings.Any(b => b.BindingType != MemberBindingType.Assignment);
+
+				if (throwExpr)
+					throw new NotSupportedException(string.Format("Explicit construction of entity type '{0}' in group by is not allowed.", body.Type));
+			}
+
+			return (methodCall.Arguments[methodCall.Arguments.Count - 1].Unwrap().NodeType == ExpressionType.Lambda);
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			var sequenceExpr    = methodCall.Arguments[0];
+			var sequence        = builder.BuildSequence(new BuildInfo(buildInfo, sequenceExpr));
+			var groupingType    = methodCall.Type.GetGenericArguments()[0];
+			var keySelector     = (LambdaExpression)methodCall.Arguments[1].Unwrap();
+			var elementSelector = (LambdaExpression)methodCall.Arguments[2].Unwrap();
+
+			if (methodCall.Arguments[0].NodeType == ExpressionType.Call)
+			{
+				var call = (MethodCallExpression)methodCall.Arguments[0];
+
+				if (call.Method.Name == "Select")
+				{
+					var type = ((LambdaExpression)call.Arguments[1].Unwrap()).Body.Type;
+
+					if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(ExpressionBuilder.GroupSubQuery<,>))
+					{
+						sequence = new SubQueryContext(sequence);
+					}
+				}
+			}
+
+			var key      = new KeyContext(buildInfo.Parent, keySelector, sequence);
+			var groupSql = builder.ConvertExpressions(key, keySelector.Body.Unwrap(), ConvertFlags.Key);
+
+			if (sequence.SqlQuery.Select.IsDistinct       ||
+			    sequence.SqlQuery.GroupBy.Items.Count > 0 ||
+			    groupSql.Any(_ => !(_.Sql is SqlField || _.Sql is SqlQuery.Column)))
+			{
+				sequence = new SubQueryContext(sequence);
+				key      = new KeyContext(buildInfo.Parent, keySelector, sequence);
+				groupSql = builder.ConvertExpressions(key, keySelector.Body.Unwrap(), ConvertFlags.Key);
+			}
+
+			//sequence.SqlQuery.GroupBy.Items.Clear();
+
+			foreach (var sql in groupSql)
+				sequence.SqlQuery.GroupBy.Expr(sql.Sql);
+
+			new QueryVisitor().Visit(sequence.SqlQuery.From, e =>
+			{
+				if (e.ElementType == QueryElementType.JoinedTable)
+				{
+					var jt = (SqlQuery.JoinedTable)e;
+					if (jt.JoinType == SqlQuery.JoinType.Inner)
+						jt.IsWeak = false;
+				}
+			});
+
+			var element = new SelectContext (buildInfo.Parent, elementSelector, sequence/*, key*/);
+			var groupBy = new GroupByContext(buildInfo.Parent, sequenceExpr, groupingType, sequence, key, element);
+
+			return groupBy;
+		}
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			return null;
+		}
+
+		#endregion
+
+		#region KeyContext
+
+		internal class KeyContext : SelectContext
+		{
+			public KeyContext(IBuildContext parent, LambdaExpression lambda, params IBuildContext[] sequences)
+				: base(parent, lambda, sequences)
+			{
+			}
+		}
+
+		#endregion
+
+		#region GroupByContext
+
+		internal class GroupByContext : SequenceContextBase
+		{
+			public GroupByContext(
+				IBuildContext parent,
+				Expression   sequenceExpr,
+				Type          groupingType,
+				IBuildContext sequence,
+				KeyContext    key,
+				SelectContext element)
+				: base(parent, sequence, null)
+			{
+				_sequenceExpr = sequenceExpr;
+				_key          = key;
+				_element      = element;
+				_groupingType = groupingType;
+
+				key.Parent = this;
+			}
+
+			readonly Expression    _sequenceExpr;
+			readonly KeyContext    _key;
+			readonly SelectContext _element;
+			readonly Type          _groupingType;
+
+			internal class Grouping<TKey,TElement> : IGrouping<TKey,TElement>
+			{
+				public Grouping(
+					TKey                    key,
+					QueryContext            queryContext,
+					List<ParameterAccessor> parameters,
+					Func<IDataContext,TKey,object[],IQueryable<TElement>> itemReader)
+				{
+					Key = key;
+
+					_queryContext = queryContext;
+					_parameters   = parameters;
+					_itemReader   = itemReader;
+
+					if (Common.Configuration.Linq.PreloadGroups)
+					{
+						_items = GetItems();
+					}
+				}
+
+				private  IList<TElement>                                       _items;
+				readonly QueryContext                                          _queryContext;
+				readonly List<ParameterAccessor>                               _parameters;
+				readonly Func<IDataContext,TKey,object[],IQueryable<TElement>> _itemReader;
+
+				public TKey Key { get; private set; }
+
+				List<TElement> GetItems()
+				{
+					var db = _queryContext.GetDataContext();
+
+					try
+					{
+						var ps = new object[_parameters.Count];
+
+						for (var i = 0; i < ps.Length; i++)
+							ps[i] = _parameters[i].Accessor(_queryContext.Expression, _queryContext.CompiledParameters);
+
+						return _itemReader(db.DataContextInfo.DataContext, Key, ps).ToList();
+					}
+					finally
+					{
+						_queryContext.ReleaseDataContext(db);
+					}
+				}
+
+				public IEnumerator<TElement> GetEnumerator()
+				{
+					if (_items == null)
+						_items = GetItems();
+
+					return _items.GetEnumerator();
+				}
+
+				IEnumerator IEnumerable.GetEnumerator()
+				{
+					return GetEnumerator();
+				}
+			}
+
+			interface IGroupByHelper
+			{
+				Expression GetGrouping(GroupByContext context);
+			}
+
+			class GroupByHelper<TKey,TElement,TSource> : IGroupByHelper
+			{
+				public Expression GetGrouping(GroupByContext context)
+				{
+					var parameters = context.Builder.CurrentSqlParameters
+						.Select((p,i) => new { p, i })
+						.ToDictionary(_ => _.p.Expression, _ => _.i);
+					var paramArray = Expression.Parameter(typeof(object[]), "ps");
+
+					var groupExpression = context._sequenceExpr.Convert(e =>
+					{
+						int idx;
+
+						if (parameters.TryGetValue(e, out idx))
+						{
+							return
+								Expression.Convert(
+									Expression.ArrayIndex(paramArray, Expression.Constant(idx)),
+									e.Type);
+						}
+
+						return e;
+					});
+
+					var keyParam = Expression.Parameter(typeof(TKey), "key");
+
+// ReSharper disable AssignNullToNotNullAttribute
+
+					var expr = Expression.Call(
+						null,
+						ReflectionHelper.Expressor<object>.MethodExpressor(_ => Queryable.Where(null, (Expression<Func<TSource,bool>>)null)),
+						groupExpression,
+						Expression.Lambda<Func<TSource,bool>>(
+							Expression.Equal(context._key.Lambda.Body, keyParam),
+							new[] { context._key.Lambda.Parameters[0] }));
+
+					expr = Expression.Call(
+						null,
+						ReflectionHelper.Expressor<object>.MethodExpressor(_ => Queryable.Select(null, (Expression<Func<TSource,TElement>>)null)),
+						expr,
+						context._element.Lambda);
+
+// ReSharper restore AssignNullToNotNullAttribute
+
+					var lambda = Expression.Lambda<Func<IDataContext,TKey,object[],IQueryable<TElement>>>(
+						Expression.Convert(expr, typeof(IQueryable<TElement>)),
+						Expression.Parameter(typeof(IDataContext), "ctx"),
+						keyParam,
+						paramArray);
+
+					var itemReader = CompiledQuery.Compile(lambda);
+					var keyExpr    = context._key.BuildExpression(null, 0);
+					var keyReader  = Expression.Lambda<Func<QueryContext,IDataContext,IDataReader,Expression,object[],TKey>>(
+						keyExpr,
+						new []
+						{
+							ExpressionBuilder.ContextParam,
+							ExpressionBuilder.DataContextParam,
+							ExpressionBuilder.DataReaderParam,
+							ExpressionBuilder.ExpressionParam,
+							ExpressionBuilder.ParametersParam,
+						});
+
+					return Expression.Call(
+						null,
+						ReflectionHelper.Expressor<object>.MethodExpressor(_ => GetGrouping(null, null, null, null, null, null, null, null)),
+						new Expression[]
+						{
+							ExpressionBuilder.ContextParam,
+							ExpressionBuilder.DataContextParam,
+							ExpressionBuilder.DataReaderParam,
+							Expression.Constant(context.Builder.CurrentSqlParameters),
+							ExpressionBuilder.ExpressionParam,
+							ExpressionBuilder.ParametersParam,
+							Expression.Constant(keyReader.Compile()),
+							Expression.Constant(itemReader),
+						});
+				}
+
+				static IGrouping<TKey,TElement> GetGrouping(
+					QueryContext             context,
+					IDataContext             dataContext,
+					IDataReader              dataReader,
+					List<ParameterAccessor>  parameterAccessor,
+					Expression               expr,
+					object[]                 ps,
+					Func<QueryContext,IDataContext,IDataReader,Expression,object[],TKey> keyReader,
+					Func<IDataContext,TKey,object[],IQueryable<TElement>>                itemReader)
+				{
+					var key = keyReader(context, dataContext, dataReader, expr, ps);
+					return new Grouping<TKey,TElement>(key, context, parameterAccessor, itemReader);
+				}
+			}
+
+			Expression BuildGrouping()
+			{
+				var gtype = typeof(GroupByHelper<,,>).MakeGenericType(
+					_key.Lambda.Body.Type,
+					_element.Lambda.Body.Type,
+					_key.Lambda.Parameters[0].Type);
+
+				var isBlockDisable = Builder.IsBlockDisable;
+
+				Builder.IsBlockDisable = true;
+
+				var helper = (IGroupByHelper)Activator.CreateInstance(gtype);
+				var expr   = helper.GetGrouping(this);
+
+				Builder.IsBlockDisable = isBlockDisable;
+
+				return expr;
+			}
+
+			public override Expression BuildExpression(Expression expression, int level)
+			{
+				if (expression == null)
+					return BuildGrouping();
+
+				if (level != 0)
+				{
+					var levelExpression = expression.GetLevelExpression(level);
+
+					if (levelExpression.NodeType == ExpressionType.MemberAccess)
+					{
+						var ma = (MemberExpression)levelExpression;
+
+						if (ma.Member.Name == "Key" && ma.Member.DeclaringType == _groupingType)
+						{
+							return levelExpression == expression ?
+								_key.BuildExpression(null,       0) :
+								_key.BuildExpression(expression, level + 1);
+						}
+					}
+				}
+
+				throw new InvalidOperationException();
+			}
+
+			ISqlExpression ConvertEnumerable(MethodCallExpression call)
+			{
+				if (AggregationBuilder.MethodNames.Contains(call.Method.Name))
+				{
+					if (call.Arguments[0].NodeType == ExpressionType.Call)
+					{
+						var arg = (MethodCallExpression)call.Arguments[0];
+
+						if (arg.Method.Name == "Select")
+						{
+							if (arg.Arguments[0].NodeType != ExpressionType.Call)
+							{
+								var l     = (LambdaExpression)arg.Arguments[1].Unwrap();
+								var largs = l.Type.GetGenericArguments();
+
+								if (largs.Length == 2)
+								{
+									var p   = _element.Parent;
+									var ctx = new ExpressionContext(Parent, _element, l);
+									var sql = Builder.ConvertToSql(ctx, l.Body, true);
+
+									Builder.ReplaceParent(ctx, p);
+
+									return new SqlFunction(call.Type, call.Method.Name, sql);
+								}
+							}
+						}
+					}
+				}
+
+				if (call.Arguments[0].NodeType == ExpressionType.Call)
+				{
+					var ctx = Builder.GetSubQuery(this, call);
+
+					if (Builder.SqlProvider.IsSubQueryColumnSupported)
+						return ctx.SqlQuery;
+
+					var join = ctx.SqlQuery.CrossApply();
+
+					SqlQuery.From.Tables[0].Joins.Add(join.JoinedTable);
+
+					return ctx.SqlQuery.Select.Columns[0];
+				}
+
+				var args = new ISqlExpression[call.Arguments.Count - 1];
+
+				if (CountBuilder.MethodNames.Contains(call.Method.Name))
+				{
+					if (args.Length > 0)
+						throw new InvalidOperationException();
+
+					return SqlFunction.CreateCount(call.Type, SqlQuery);
+				}
+
+				if (call.Arguments.Count > 1)
+				{
+					for (var i = 1; i < call.Arguments.Count; i++)
+					{
+						var ex = call.Arguments[i].Unwrap();
+
+						if (ex is LambdaExpression)
+						{
+							var l   = (LambdaExpression)ex;
+							var p   = _element.Parent;
+							var ctx = new ExpressionContext(Parent, _element, l);
+
+							args[i - 1] = Builder.ConvertToSql(ctx, l.Body, true);
+
+							Builder.ReplaceParent(ctx, p);
+						}
+						else
+						{
+							throw new InvalidOperationException();
+						}
+					}
+				}
+				else
+				{
+					args = _element.ConvertToSql(null, 0, ConvertFlags.Field).Select(_ => _.Sql).ToArray();
+				}
+
+				return new SqlFunction(call.Type, call.Method.Name, args);
+			}
+
+			PropertyInfo _keyProperty;
+
+			public override SqlInfo[] ConvertToSql(Expression expression, int level, ConvertFlags flags)
+			{
+				if (expression == null)
+					return _key.ConvertToSql(null, 0, flags);
+
+				if (level > 0)
+				{
+					switch (expression.NodeType)
+					{
+						case ExpressionType.Call         :
+							{
+								var e = (MethodCallExpression)expression;
+
+								if (e.Method.DeclaringType == typeof(Enumerable))
+								{
+									return new[] { new SqlInfo { Sql = ConvertEnumerable(e) } };
+								}
+
+								break;
+							}
+
+						case ExpressionType.MemberAccess :
+							{
+								var levelExpression = expression.GetLevelExpression(level);
+
+								if (levelExpression.NodeType == ExpressionType.MemberAccess)
+								{
+									var e = (MemberExpression)levelExpression;
+
+									if (e.Member.Name == "Key")
+									{
+										if (_keyProperty == null)
+											_keyProperty = _groupingType.GetProperty("Key");
+
+										if (e.Member == _keyProperty)
+										{
+											if (levelExpression == expression)
+												return _key.ConvertToSql(null, 0, flags);
+
+											return _key.ConvertToSql(expression, level + 1, flags);
+										}
+									}
+
+									return Sequence.ConvertToSql(expression, level, flags);
+								}
+
+								break;
+							}
+					}
+				}
+
+				throw new InvalidOperationException();
+			}
+
+			readonly Dictionary<Tuple<Expression,int,ConvertFlags>,SqlInfo[]> _expressionIndex = new Dictionary<Tuple<Expression,int,ConvertFlags>,SqlInfo[]>();
+
+			public override SqlInfo[] ConvertToIndex(Expression expression, int level, ConvertFlags flags)
+			{
+				var key = Tuple.Create(expression, level, flags);
+
+				SqlInfo[] info;
+
+				if (!_expressionIndex.TryGetValue(key, out info))
+				{
+					info = ConvertToSql(expression, level, flags);
+
+					foreach (var item in info)
+					{
+						item.Query = SqlQuery;
+						item.Index = SqlQuery.Select.Add(item.Sql);
+					}
+				}
+
+				return info;
+			}
+
+			public override IsExpressionResult IsExpression(Expression expression, int level, RequestFor requestFlag)
+			{
+				if (level != 0)
+				{
+					var levelExpression = expression.GetLevelExpression(level);
+
+					if (levelExpression.NodeType == ExpressionType.MemberAccess)
+					{
+						var ma = (MemberExpression)levelExpression;
+
+						if (ma.Member.Name == "Key" && ma.Member.DeclaringType == _groupingType)
+						{
+							return levelExpression == expression ?
+								_key.IsExpression(null,       0,         requestFlag) :
+								_key.IsExpression(expression, level + 1, requestFlag);
+						}
+					}
+				}
+
+				return IsExpressionResult.False;
+			}
+
+			public override int ConvertToParentIndex(int index, IBuildContext context)
+			{
+				var expr = SqlQuery.Select.Columns[index].Expression;
+
+				if (!SqlQuery.GroupBy.Items.Exists(_ => _ == expr || (expr is SqlQuery.Column && _ == ((SqlQuery.Column)expr).Expression)))
+					SqlQuery.GroupBy.Items.Add(expr);
+
+				return base.ConvertToParentIndex(index, this);
+			}
+
+			interface IContextHelper
+			{
+				Expression GetContext(Expression sequence, ParameterExpression param, Expression expr1, Expression expr2);
+			}
+
+			class ContextHelper<T> : IContextHelper
+			{
+				public Expression GetContext(Expression sequence, ParameterExpression param, Expression expr1, Expression expr2)
+				{
+// ReSharper disable AssignNullToNotNullAttribute
+					//ReflectionHelper.Expressor<object>.MethodExpressor(_ => Queryable.Where(null, (Expression<Func<T,bool>>)null)),
+					var mi   = ReflectionHelper.Expressor<object>.MethodExpressor(_ => Enumerable.Where(null, (Func<T,bool>)null));
+// ReSharper restore AssignNullToNotNullAttribute
+					var arg2 = Expression.Lambda<Func<T,bool>>(Expression.Equal(expr1, expr2), new[] { param });
+
+					return Expression.Call(null, mi, sequence, arg2);
+				}
+			}
+
+			public override IBuildContext GetContext(Expression expression, int level, BuildInfo buildInfo)
+			{
+				if (expression == null && buildInfo != null)
+				{
+					if (buildInfo.Parent is SelectManyBuilder.SelectManyContext)
+					{
+						var sm     = (SelectManyBuilder.SelectManyContext)buildInfo.Parent;
+						var ctype  = typeof(ContextHelper<>).MakeGenericType(_key.Lambda.Parameters[0].Type);
+						var helper = (IContextHelper)Activator.CreateInstance(ctype);
+						var expr   = helper.GetContext(
+							Sequence.Expression,
+							_key.Lambda.Parameters[0],
+							Expression.PropertyOrField(sm.Lambda.Parameters[0], "Key"),
+							_key.Lambda.Body);
+
+						return Builder.BuildSequence(new BuildInfo(buildInfo, expr));
+					}
+
+					//if (buildInfo.Parent == this)
+					{
+						var ctype  = typeof(ContextHelper<>).MakeGenericType(_key.Lambda.Parameters[0].Type);
+						var helper = (IContextHelper)Activator.CreateInstance(ctype);
+						var expr   = helper.GetContext(
+							_sequenceExpr,
+							_key.Lambda.Parameters[0],
+							Expression.PropertyOrField(buildInfo.Expression, "Key"),
+							_key.Lambda.Body);
+
+						var ctx = Builder.BuildSequence(new BuildInfo(buildInfo, expr));
+
+						ctx.SqlQuery.Properties.Add(Tuple.Create("from_group_by", SqlQuery));
+
+						return ctx;
+					}
+
+					//return this;
+				}
+
+				if (level != 0)
+				{
+					var levelExpression = expression.GetLevelExpression(level);
+
+					if (levelExpression.NodeType == ExpressionType.MemberAccess)
+					{
+						var ma = (MemberExpression)levelExpression;
+
+						if (ma.Member.Name == "Key" && ma.Member.DeclaringType == _groupingType)
+						{
+							return levelExpression == expression ?
+								_key.GetContext(null,       0,         buildInfo) :
+								_key.GetContext(expression, level + 1, buildInfo);
+						}
+					}
+				}
+
+				throw new InvalidOperationException();
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/IBuildContext.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,36 @@
+using System;
+using System.Linq.Expressions;
+
+#if DEBUG
+#pragma warning disable 3010
+#endif
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using Data.Sql;
+
+	public interface IBuildContext
+	{
+#if DEBUG
+// ReSharper disable InconsistentNaming
+		[CLSCompliant(false)]
+		string _sqlQueryText { get; }
+// ReSharper restore InconsistentNaming
+#endif
+
+		ExpressionBuilder  Builder    { get; }
+		Expression         Expression { get; }
+		SqlQuery           SqlQuery   { get; set; }
+		IBuildContext      Parent     { get; set; }
+
+		void               BuildQuery<T>       (Query<T> query, ParameterExpression queryParameter);
+		Expression         BuildExpression     (Expression expression, int level);
+		SqlInfo[]          ConvertToSql        (Expression expression, int level, ConvertFlags flags);
+		SqlInfo[]          ConvertToIndex      (Expression expression, int level, ConvertFlags flags);
+		IsExpressionResult IsExpression        (Expression expression, int level, RequestFor requestFlag);
+		IBuildContext      GetContext          (Expression expression, int level, BuildInfo buildInfo);
+		int                ConvertToParentIndex(int index, IBuildContext context);
+		void               SetAlias            (string alias);
+		ISqlExpression     GetSubQuery         (IBuildContext context);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/ISequenceBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,14 @@
+using System;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	public interface ISequenceBuilder
+	{
+		int                 BuildCounter { get; set; }
+		bool                CanBuild     (ExpressionBuilder builder, BuildInfo buildInfo);
+		IBuildContext       BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo);
+		SequenceConvertInfo Convert      (ExpressionBuilder builder, BuildInfo buildInfo, ParameterExpression param);
+		bool                IsSequence   (ExpressionBuilder builder, BuildInfo buildInfo);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/InsertBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,265 @@
+using System;
+using System.Linq;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+	using Data.Sql;
+
+	class InsertBuilder : MethodCallBuilder
+	{
+		#region InsertBuilder
+
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			return methodCall.IsQueryable("Insert", "InsertWithIdentity");
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
+
+			var isSubQuery = sequence.SqlQuery.Select.IsDistinct;
+
+			if (isSubQuery)
+				sequence = new SubQueryContext(sequence);
+
+			switch (methodCall.Arguments.Count)
+			{
+				case 1 : 
+					// static int Insert<T>              (this IValueInsertable<T> source)
+					// static int Insert<TSource,TTarget>(this ISelectInsertable<TSource,TTarget> source)
+					{
+						foreach (var item in sequence.SqlQuery.Insert.Items)
+							sequence.SqlQuery.Select.Expr(item.Expression);
+						break;
+					}
+
+				case 2 : // static int Insert<T>(this Table<T> target, Expression<Func<T>> setter)
+					{
+						UpdateBuilder.BuildSetter(
+							builder,
+							buildInfo,
+							(LambdaExpression)methodCall.Arguments[1].Unwrap(),
+							sequence,
+							sequence.SqlQuery.Insert.Items,
+							sequence);
+
+						sequence.SqlQuery.Insert.Into  = ((TableBuilder.TableContext)sequence).SqlTable;
+						sequence.SqlQuery.From.Tables.Clear();
+
+						break;
+					}
+
+				case 3 : // static int Insert<TSource,TTarget>(this IQueryable<TSource> source, Table<TTarget> target, Expression<Func<TSource,TTarget>> setter)
+					{
+						var into = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[1], new SqlQuery()));
+
+						UpdateBuilder.BuildSetter(
+							builder,
+							buildInfo,
+							(LambdaExpression)methodCall.Arguments[2].Unwrap(),
+							into,
+							sequence.SqlQuery.Insert.Items,
+							sequence);
+
+						sequence.SqlQuery.Select.Columns.Clear();
+
+						foreach (var item in sequence.SqlQuery.Insert.Items)
+							sequence.SqlQuery.Select.Columns.Add(new SqlQuery.Column(sequence.SqlQuery, item.Expression));
+
+						sequence.SqlQuery.Insert.Into = ((TableBuilder.TableContext)into).SqlTable;
+
+						break;
+					}
+			}
+
+			var insert = sequence.SqlQuery.Insert;
+
+			var q = insert.Into.Fields.Values.Cast<ISqlExpression>().Except(insert.Items.Select(e => e.Column))
+				.OfType<SqlField>()
+				.Where(f => f.IsIdentity);
+
+			foreach (var field in q)
+			{
+				var expr = builder.SqlProvider.GetIdentityExpression(insert.Into, field, false);
+
+				if (expr != null)
+				{
+					insert.Items.Insert(0, new SqlQuery.SetExpression(field, expr));
+
+					if (methodCall.Arguments.Count == 3)
+					{
+						sequence.SqlQuery.Select.Columns.Insert(0, new SqlQuery.Column(sequence.SqlQuery, insert.Items[0].Expression));
+					}
+				}
+			}
+
+			sequence.SqlQuery.QueryType           = QueryType.Insert;
+			sequence.SqlQuery.Insert.WithIdentity = methodCall.Method.Name == "InsertWithIdentity";
+
+			return new InsertContext(buildInfo.Parent, sequence, sequence.SqlQuery.Insert.WithIdentity);
+		}
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			return null;
+		}
+
+		#endregion
+
+		#region InsertContext
+
+		class InsertContext : SequenceContextBase
+		{
+			public InsertContext(IBuildContext parent, IBuildContext sequence, bool insertWithIdentity)
+				: base(parent, sequence, null)
+			{
+				_insertWithIdentity = insertWithIdentity;
+			}
+
+			readonly bool _insertWithIdentity;
+
+			public override void BuildQuery<T>(Query<T> query, ParameterExpression queryParameter)
+			{
+				if (_insertWithIdentity) query.SetScalarQuery<object>();
+				else                     query.SetNonQueryQuery();
+			}
+
+			public override Expression BuildExpression(Expression expression, int level)
+			{
+				throw new InvalidOperationException();
+			}
+
+			public override SqlInfo[] ConvertToSql(Expression expression, int level, ConvertFlags flags)
+			{
+				throw new InvalidOperationException();
+			}
+
+			public override SqlInfo[] ConvertToIndex(Expression expression, int level, ConvertFlags flags)
+			{
+				throw new InvalidOperationException();
+			}
+
+			public override IsExpressionResult IsExpression(Expression expression, int level, RequestFor requestFlag)
+			{
+				throw new InvalidOperationException();
+			}
+
+			public override IBuildContext GetContext(Expression expression, int level, BuildInfo buildInfo)
+			{
+				throw new InvalidOperationException();
+			}
+		}
+
+		#endregion
+
+		#region Into
+
+		internal class Into : MethodCallBuilder
+		{
+			protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+			{
+				return methodCall.IsQueryable("Into");
+			}
+
+			protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+			{
+				var source = methodCall.Arguments[0].Unwrap();
+				var into   = methodCall.Arguments[1].Unwrap();
+
+				IBuildContext sequence;
+
+				// static IValueInsertable<T> Into<T>(this IDataContext dataContext, Table<T> target)
+				//
+				if (source.NodeType == ExpressionType.Constant && ((ConstantExpression)source).Value == null)
+				{
+					sequence = builder.BuildSequence(new BuildInfo((IBuildContext)null, into, new SqlQuery()));
+
+					if (sequence.SqlQuery.Select.IsDistinct)
+						sequence = new SubQueryContext(sequence);
+
+					sequence.SqlQuery.Insert.Into = ((TableBuilder.TableContext)sequence).SqlTable;
+					sequence.SqlQuery.From.Tables.Clear();
+				}
+				// static ISelectInsertable<TSource,TTarget> Into<TSource,TTarget>(this IQueryable<TSource> source, Table<TTarget> target)
+				//
+				else
+				{
+					sequence = builder.BuildSequence(new BuildInfo(buildInfo, source));
+
+					if (sequence.SqlQuery.Select.IsDistinct)
+						sequence = new SubQueryContext(sequence);
+
+					var tbl = builder.BuildSequence(new BuildInfo((IBuildContext)null, into, new SqlQuery()));
+					sequence.SqlQuery.Insert.Into = ((TableBuilder.TableContext)tbl).SqlTable;
+				}
+
+				sequence.SqlQuery.Select.Columns.Clear();
+
+				return sequence;
+			}
+
+			protected override SequenceConvertInfo Convert(
+				ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+			{
+				return null;
+			}
+		}
+
+		#endregion
+
+		#region Value
+
+		internal class Value : MethodCallBuilder
+		{
+			protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+			{
+				return methodCall.IsQueryable("Value");
+			}
+
+			protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+			{
+				var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
+				var extract  = (LambdaExpression)methodCall.Arguments[1].Unwrap();
+				var update   =                   methodCall.Arguments[2].Unwrap();
+
+				if (sequence.SqlQuery.Insert.Into == null)
+				{
+					sequence.SqlQuery.Insert.Into = (SqlTable)sequence.SqlQuery.From.Tables[0].Source;
+					sequence.SqlQuery.From.Tables.Clear();
+				}
+
+				if (update.NodeType == ExpressionType.Lambda)
+					UpdateBuilder.ParseSet(
+						builder,
+						buildInfo,
+						extract,
+						(LambdaExpression)update,
+						sequence,
+						sequence.SqlQuery.Insert.Into,
+						sequence.SqlQuery.Insert.Items);
+				else
+					UpdateBuilder.ParseSet(
+						builder,
+						buildInfo,
+						extract,
+						update,
+						sequence,
+						sequence.SqlQuery.Insert.Items);
+
+				return sequence;
+			}
+
+			protected override SequenceConvertInfo Convert(
+				ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+			{
+				return null;
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/InsertOrUpdateBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,138 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+	using Data.Sql;
+
+	class InsertOrUpdateBuilder : MethodCallBuilder
+	{
+		#region InsertOrUpdateBuilder
+
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			return methodCall.IsQueryable("InsertOrUpdate");
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
+
+			UpdateBuilder.BuildSetter(
+				builder,
+				buildInfo,
+				(LambdaExpression)methodCall.Arguments[1].Unwrap(),
+				sequence,
+				sequence.SqlQuery.Insert.Items,
+				sequence);
+
+			UpdateBuilder.BuildSetter(
+				builder,
+				buildInfo,
+				(LambdaExpression)methodCall.Arguments[2].Unwrap(),
+				sequence,
+				sequence.SqlQuery.Update.Items,
+				sequence);
+
+			sequence.SqlQuery.Insert.Into  = ((TableBuilder.TableContext)sequence).SqlTable;
+			sequence.SqlQuery.Update.Table = ((TableBuilder.TableContext)sequence).SqlTable;
+			sequence.SqlQuery.From.Tables.Clear();
+			sequence.SqlQuery.From.Table(sequence.SqlQuery.Update.Table);
+
+			if (methodCall.Arguments.Count == 3)
+			{
+				var table = sequence.SqlQuery.Insert.Into;
+				var keys  = table.GetKeys(false);
+
+				if (keys.Count == 0)
+					throw new LinqException("InsertOrUpdate method requires the '{0}' table to have a primary key.", table.Name);
+
+				var q =
+				(
+					from k in keys
+					join i in sequence.SqlQuery.Insert.Items on k equals i.Column
+					select new { k, i }
+				).ToList();
+
+				var missedKey = keys.Except(q.Select(i => i.k)).FirstOrDefault();
+
+				if (missedKey != null)
+					throw new LinqException("InsertOrUpdate method requires the '{0}.{1}' field to be included in the insert setter.",
+						table.Name,
+						((SqlField)missedKey).Name);
+
+				sequence.SqlQuery.Update.Keys.AddRange(q.Select(i => i.i));
+			}
+			else
+			{
+				UpdateBuilder.BuildSetter(
+					builder,
+					buildInfo,
+					(LambdaExpression)methodCall.Arguments[3].Unwrap(),
+					sequence,
+					sequence.SqlQuery.Update.Keys,
+					sequence);
+			}
+
+			sequence.SqlQuery.QueryType = QueryType.InsertOrUpdate;
+
+			return new InsertOrUpdateContext(buildInfo.Parent, sequence);
+		}
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			return null;
+		}
+
+		#endregion
+
+		#region UpdateContext
+
+		class InsertOrUpdateContext : SequenceContextBase
+		{
+			public InsertOrUpdateContext(IBuildContext parent, IBuildContext sequence)
+				: base(parent, sequence, null)
+			{
+			}
+
+			public override void BuildQuery<T>(Query<T> query, ParameterExpression queryParameter)
+			{
+				if (Builder.SqlProvider.IsInsertOrUpdateSupported)
+					query.SetNonQueryQuery();
+				else
+					query.MakeAlternativeInsertOrUpdate(SqlQuery);
+			}
+
+			public override Expression BuildExpression(Expression expression, int level)
+			{
+				throw new InvalidOperationException();
+			}
+
+			public override SqlInfo[] ConvertToSql(Expression expression, int level, ConvertFlags flags)
+			{
+				throw new InvalidOperationException();
+			}
+
+			public override SqlInfo[] ConvertToIndex(Expression expression, int level, ConvertFlags flags)
+			{
+				throw new InvalidOperationException();
+			}
+
+			public override IsExpressionResult IsExpression(Expression expression, int level, RequestFor requestFlag)
+			{
+				throw new InvalidOperationException();
+			}
+
+			public override IBuildContext GetContext(Expression expression, int level, BuildInfo buildInfo)
+			{
+				throw new InvalidOperationException();
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/IntersectBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,56 @@
+using System;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+	using Data.Sql;
+
+	class IntersectBuilder : MethodCallBuilder
+	{
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			return methodCall.Arguments.Count == 2 && methodCall.IsQueryable("Except", "Intersect");
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
+			var query    = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[1], new SqlQuery()));
+			var except   = query.SqlQuery;
+
+			sequence = new SubQueryContext(sequence);
+
+			var sql = sequence.SqlQuery;
+
+			except.ParentSql = sql;
+
+			if (methodCall.Method.Name == "Except")
+				sql.Where.Not.Exists(except);
+			else
+				sql.Where.Exists(except);
+
+			var keys1 = sequence.ConvertToSql(null, 0, ConvertFlags.Key);
+			var keys2 = query.   ConvertToSql(null, 0, ConvertFlags.Key);
+
+			if (keys1.Length != keys2.Length)
+				throw new InvalidOperationException();
+
+			for (var i = 0; i < keys1.Length; i++)
+			{
+				except.Where
+					.Expr(keys1[i].Sql)
+					.Equal
+					.Expr(keys2[i].Sql);
+			}
+
+			return sequence;
+		}
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			return null;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/IsExpressionResult.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,25 @@
+using System;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	public struct IsExpressionResult
+	{
+		public readonly bool          Result;
+		public readonly IBuildContext Context;
+
+		public IsExpressionResult(bool result)
+		{
+			Result  = result;
+			Context = null;
+		}
+
+		public IsExpressionResult(bool result, IBuildContext context)
+		{
+			Result  = result;
+			Context = context;
+		}
+
+		public static IsExpressionResult True  = new IsExpressionResult(true);
+		public static IsExpressionResult False = new IsExpressionResult(false);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/JoinBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,397 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+	using Data.Sql;
+
+	class JoinBuilder : MethodCallBuilder
+	{
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			if (!methodCall.IsQueryable("Join", "GroupJoin") || methodCall.Arguments.Count != 5)
+				return false;
+
+			var body = ((LambdaExpression)methodCall.Arguments[2].Unwrap()).Body.Unwrap();
+
+			if (body.NodeType == ExpressionType	.MemberInit)
+			{
+				var mi = (MemberInitExpression)body;
+				bool throwExpr;
+
+				if (mi.NewExpression.Arguments.Count > 0 || mi.Bindings.Count == 0)
+					throwExpr = true;
+				else
+					throwExpr = mi.Bindings.Any(b => b.BindingType != MemberBindingType.Assignment);
+
+				if (throwExpr)
+					throw new NotSupportedException(string.Format("Explicit construction of entity type '{0}' in join is not allowed.", body.Type));
+			}
+
+			return true;
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			var isGroup      = methodCall.Method.Name == "GroupJoin";
+			var outerContext = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0], buildInfo.SqlQuery));
+			var innerContext = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[1], new SqlQuery()));
+			var countContext = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[1], new SqlQuery()));
+
+			var context  = new SubQueryContext(outerContext);
+			innerContext = isGroup ? new GroupJoinSubQueryContext(innerContext, methodCall) : new SubQueryContext(innerContext);
+			countContext = new SubQueryContext(countContext);
+
+			var join = isGroup ? innerContext.SqlQuery.WeakLeftJoin() : innerContext.SqlQuery.InnerJoin();
+			var sql  = context.SqlQuery;
+
+			sql.From.Tables[0].Joins.Add(join.JoinedTable);
+
+			var selector = (LambdaExpression)methodCall.Arguments[4].Unwrap();
+
+			context.SetAlias(selector.Parameters[0].Name);
+			innerContext.SetAlias(selector.Parameters[1].Name);
+
+			var outerKeyLambda = ((LambdaExpression)methodCall.Arguments[2].Unwrap());
+			var innerKeyLambda = ((LambdaExpression)methodCall.Arguments[3].Unwrap());
+
+			var outerKeySelector = outerKeyLambda.Body.Unwrap();
+			var innerKeySelector = innerKeyLambda.Body.Unwrap();
+
+			var outerParent = context.     Parent;
+			var innerParent = innerContext.Parent;
+			var countParent = countContext.Parent;
+
+			var outerKeyContext = new ExpressionContext(buildInfo.Parent, context,      outerKeyLambda);
+			var innerKeyContext = new InnerKeyContext  (buildInfo.Parent, innerContext, innerKeyLambda);
+			var countKeyContext = new ExpressionContext(buildInfo.Parent, countContext, innerKeyLambda);
+
+			// Process counter.
+			//
+			var counterSql = ((SubQueryContext)countContext).SqlQuery;
+
+			// Make join and where for the counter.
+			//
+			if (outerKeySelector.NodeType == ExpressionType.New)
+			{
+				var new1 = (NewExpression)outerKeySelector;
+				var new2 = (NewExpression)innerKeySelector;
+
+				for (var i = 0; i < new1.Arguments.Count; i++)
+				{
+					var arg1 = new1.Arguments[i];
+					var arg2 = new2.Arguments[i];
+
+					BuildJoin(builder, join, outerKeyContext, arg1, innerKeyContext, arg2, countKeyContext, counterSql);
+				}
+			}
+			else if (outerKeySelector.NodeType == ExpressionType.MemberInit)
+			{
+				var mi1 = (MemberInitExpression)outerKeySelector;
+				var mi2 = (MemberInitExpression)innerKeySelector;
+
+				for (var i = 0; i < mi1.Bindings.Count; i++)
+				{
+					if (mi1.Bindings[i].Member != mi2.Bindings[i].Member)
+						throw new LinqException(string.Format("List of member inits does not match for entity type '{0}'.", outerKeySelector.Type));
+
+					var arg1 = ((MemberAssignment)mi1.Bindings[i]).Expression;
+					var arg2 = ((MemberAssignment)mi2.Bindings[i]).Expression;
+
+					BuildJoin(builder, join, outerKeyContext, arg1, innerKeyContext, arg2, countKeyContext, counterSql);
+				}
+			}
+			else
+			{
+				BuildJoin(builder, join, outerKeyContext, outerKeySelector, innerKeyContext, innerKeySelector, countKeyContext, counterSql);
+			}
+
+			builder.ReplaceParent(outerKeyContext, outerParent);
+			builder.ReplaceParent(innerKeyContext, innerParent);
+			builder.ReplaceParent(countKeyContext, countParent);
+
+			if (isGroup)
+			{
+				counterSql.ParentSql = sql;
+				counterSql.Select.Columns.Clear();
+
+				var inner = (GroupJoinSubQueryContext)innerContext;
+
+				inner.Join       = join.JoinedTable;
+				inner.CounterSql = counterSql;
+				return new GroupJoinContext(
+					buildInfo.Parent, selector, context, inner, methodCall.Arguments[1], outerKeyLambda, innerKeyLambda);
+			}
+
+			return new JoinContext(buildInfo.Parent, selector, context, innerContext)
+#if DEBUG
+			{
+				MethodCall = methodCall
+			}
+#endif
+				;
+		}
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			return null;
+		}
+
+		static void BuildJoin(
+			ExpressionBuilder        builder,
+			SqlQuery.FromClause.Join join,
+			IBuildContext outerKeyContext, Expression outerKeySelector,
+			IBuildContext innerKeyContext, Expression innerKeySelector,
+			IBuildContext countKeyContext, SqlQuery countSql)
+		{
+			var predicate = builder.ConvertObjectComparison(
+				ExpressionType.Equal,
+				outerKeyContext, outerKeySelector,
+				innerKeyContext, innerKeySelector);
+
+			if (predicate != null)
+				join.JoinedTable.Condition.Conditions.Add(new SqlQuery.Condition(false, predicate));
+			else
+				join
+					.Expr(builder.ConvertToSql(outerKeyContext, outerKeySelector, false)).Equal
+					.Expr(builder.ConvertToSql(innerKeyContext, innerKeySelector, false));
+
+			predicate = builder.ConvertObjectComparison(
+				ExpressionType.Equal,
+				outerKeyContext, outerKeySelector,
+				countKeyContext, innerKeySelector);
+
+			if (predicate != null)
+				countSql.Where.SearchCondition.Conditions.Add(new SqlQuery.Condition(false, predicate));
+			else
+				countSql.Where
+					.Expr(builder.ConvertToSql(outerKeyContext, outerKeySelector, false)).Equal
+					.Expr(builder.ConvertToSql(countKeyContext, innerKeySelector, false));
+		}
+
+		class InnerKeyContext : ExpressionContext
+		{
+			public InnerKeyContext(IBuildContext parent, IBuildContext sequence, LambdaExpression lambda)
+				: base(parent, sequence, lambda)
+			{
+			}
+
+			public override SqlInfo[] ConvertToSql(Expression expression, int level, ConvertFlags flags)
+			{
+				return base
+					.ConvertToSql(expression, level, flags)
+					.Select(idx =>
+					{
+						var n = SqlQuery.Select.Add(idx.Sql);
+
+						return new SqlInfo(idx.Members)
+						{
+							Sql   = SqlQuery.Select.Columns[n],
+							Index = n
+						};
+					})
+					.ToArray();
+			}
+		}
+
+		internal class JoinContext : SelectContext
+		{
+			public JoinContext(IBuildContext parent, LambdaExpression lambda, IBuildContext outerContext, IBuildContext innerContext)
+				: base(parent, lambda, outerContext, innerContext)
+			{
+			}
+		}
+
+		internal class GroupJoinContext : JoinContext
+		{
+			public GroupJoinContext(
+				IBuildContext            parent,
+				LambdaExpression         lambda,
+				IBuildContext            outerContext,
+				GroupJoinSubQueryContext innerContext,
+				Expression               innerExpression,
+				LambdaExpression         outerKeyLambda,
+				LambdaExpression         innerKeyLambda)
+				: base(parent, lambda, outerContext, innerContext)
+			{
+				_innerExpression = innerExpression;
+				_outerKeyLambda  = outerKeyLambda;
+				_innerKeyLambda  = innerKeyLambda;
+
+				innerContext.GroupJoin = this;
+			}
+
+			readonly Expression       _innerExpression;
+			readonly LambdaExpression _outerKeyLambda;
+			readonly LambdaExpression _innerKeyLambda;
+			private  Expression       _groupExpression;
+
+			interface IGroupJoinHelper
+			{
+				Expression GetGroupJoin(GroupJoinContext context);
+			}
+
+			class GroupJoinHelper<TKey,TElement> : IGroupJoinHelper
+			{
+				public Expression GetGroupJoin(GroupJoinContext context)
+				{
+					// Convert outer condition.
+					//
+					var outerParam = Expression.Parameter(context._outerKeyLambda.Body.Type, "o");
+					var outerKey   = context._outerKeyLambda.Body.Convert(
+						e => e == context._outerKeyLambda.Parameters[0] ? context.Lambda.Parameters[0] : e);
+
+					outerKey = context.Builder.BuildExpression(context, outerKey);
+
+					// Convert inner condition.
+					//
+					var parameters = context.Builder.CurrentSqlParameters
+						.Select((p,i) => new { p, i })
+						.ToDictionary(_ => _.p.Expression, _ => _.i);
+					var paramArray = Expression.Parameter(typeof(object[]), "ps");
+
+					var innerKey = context._innerKeyLambda.Body.Convert(e =>
+					{
+						int idx;
+
+						if (parameters.TryGetValue(e, out idx))
+						{
+							return
+								Expression.Convert(
+									Expression.ArrayIndex(paramArray, Expression.Constant(idx)),
+									e.Type);
+						}
+
+						return e;
+					});
+
+					// Item reader.
+					//
+// ReSharper disable AssignNullToNotNullAttribute
+
+					var expr = Expression.Call(
+						null,
+						ReflectionHelper.Expressor<object>.MethodExpressor(_ => Queryable.Where(null, (Expression<Func<TElement,bool>>)null)),
+						context._innerExpression,
+						Expression.Lambda<Func<TElement,bool>>(
+							Expression.Equal(innerKey, outerParam),
+							new[] { context._innerKeyLambda.Parameters[0] }));
+
+// ReSharper restore AssignNullToNotNullAttribute
+
+					var lambda = Expression.Lambda<Func<IDataContext,TKey,object[],IQueryable<TElement>>>(
+						Expression.Convert(expr, typeof(IQueryable<TElement>)),
+						Expression.Parameter(typeof(IDataContext), "ctx"),
+						outerParam,
+						paramArray);
+
+					var itemReader = CompiledQuery.Compile(lambda);
+
+					return Expression.Call(
+						null,
+						ReflectionHelper.Expressor<object>.MethodExpressor(_ => GetGrouping(null, null, default(TKey), null)),
+						new[]
+						{
+							ExpressionBuilder.ContextParam,
+							Expression.Constant(context.Builder.CurrentSqlParameters),
+							outerKey,
+							Expression.Constant(itemReader),
+						});
+				}
+
+				static IEnumerable<TElement> GetGrouping(
+					QueryContext             context,
+					List<ParameterAccessor>  parameterAccessor,
+					TKey                     key,
+					Func<IDataContext,TKey,object[],IQueryable<TElement>> itemReader)
+				{
+					return new GroupByBuilder.GroupByContext.Grouping<TKey,TElement>(key, context, parameterAccessor, itemReader);
+				}
+			}
+
+			public override Expression BuildExpression(Expression expression, int level)
+			{
+				if (expression == Lambda.Parameters[1])
+				{
+					if (_groupExpression == null)
+					{
+						var gtype  = typeof(GroupJoinHelper<,>).MakeGenericType(
+							_innerKeyLambda.Body.Type,
+							_innerKeyLambda.Parameters[0].Type);
+
+						var helper = (IGroupJoinHelper)Activator.CreateInstance(gtype);
+
+						_groupExpression = helper.GetGroupJoin(this);
+					}
+
+					return _groupExpression;
+				}
+
+				return base.BuildExpression(expression, level);
+			}
+		}
+
+		internal class GroupJoinSubQueryContext : SubQueryContext
+		{
+			//readonly MethodCallExpression _methodCall;
+
+			public SqlQuery.JoinedTable Join;
+			public SqlQuery             CounterSql;
+			public GroupJoinContext     GroupJoin;
+
+			public GroupJoinSubQueryContext(IBuildContext subQuery, MethodCallExpression methodCall)
+				: base(subQuery)
+			{
+				//_methodCall = methodCall;
+			}
+
+			public override IBuildContext GetContext(Expression expression, int level, BuildInfo buildInfo)
+			{
+				if (expression == null)
+					return this;
+
+				return base.GetContext(expression, level, buildInfo);
+			}
+
+			Expression _counterExpression;
+			SqlInfo[]  _counterInfo;
+
+			public override SqlInfo[] ConvertToIndex(Expression expression, int level, ConvertFlags flags)
+			{
+				if (expression != null && expression == _counterExpression)
+					return _counterInfo ?? (_counterInfo = new[]
+					{
+						new SqlInfo
+						{
+							Query = CounterSql.ParentSql,
+							Index = CounterSql.ParentSql.Select.Add(CounterSql),
+							Sql   = CounterSql
+						}
+					});
+
+				return base.ConvertToIndex(expression, level, flags);
+			}
+
+			public override IsExpressionResult IsExpression(Expression expression, int level, RequestFor testFlag)
+			{
+				if (testFlag == RequestFor.GroupJoin && expression == null)
+					return IsExpressionResult.True;
+
+				return base.IsExpression(expression, level, testFlag);
+			}
+
+			public SqlQuery GetCounter(Expression expr)
+			{
+				Join.IsWeak = true;
+
+				_counterExpression = expr;
+
+				return CounterSql;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/MethodCallBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,125 @@
+using System;
+using System.Linq;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+
+	abstract class MethodCallBuilder : ISequenceBuilder
+	{
+		public int BuildCounter { get; set; }
+
+		public bool CanBuild(ExpressionBuilder builder, BuildInfo buildInfo)
+		{
+			if (buildInfo.Expression.NodeType == ExpressionType.Call)
+				return CanBuildMethodCall(builder, (MethodCallExpression)buildInfo.Expression, buildInfo);
+			return false;
+		}
+
+		public IBuildContext BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo)
+		{
+			return BuildMethodCall(builder, (MethodCallExpression)buildInfo.Expression, buildInfo);
+		}
+
+		public SequenceConvertInfo Convert(ExpressionBuilder builder, BuildInfo buildInfo, ParameterExpression param)
+		{
+			return Convert(builder, (MethodCallExpression)buildInfo.Expression, buildInfo, param);
+		}
+
+		public bool IsSequence(ExpressionBuilder builder, BuildInfo buildInfo)
+		{
+			return builder.IsSequence(new BuildInfo(buildInfo, ((MethodCallExpression)buildInfo.Expression).Arguments[0]));
+		}
+
+		protected abstract bool                CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo);
+		protected abstract IBuildContext       BuildMethodCall   (ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo);
+		protected abstract SequenceConvertInfo Convert           (ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param);
+
+		protected static Expression ConvertMethod(
+			MethodCallExpression methodCall,
+			int                  sourceTypeNumber,
+			SequenceConvertInfo  info,
+			ParameterExpression  param,
+			Expression           expression)
+		{
+			if (expression == methodCall && param != null && param.Type != info.Parameter.Type)
+			{
+				var types = methodCall.Method.GetGenericArguments();
+				var mgen  = methodCall.Method.GetGenericMethodDefinition();
+
+				types[sourceTypeNumber] = info.Parameter.Type;
+
+				var args = methodCall.Arguments.ToArray();
+
+				args[0] = info.Expression;
+
+				for (var i = 1; i < args.Length; i++)
+				{
+					var arg = args[i].Unwrap();
+
+					if (arg.NodeType == ExpressionType.Lambda)
+					{
+						var l = (LambdaExpression)arg;
+
+						if (l.Parameters.Any(a => a == param))
+						{
+							args[i] = Expression.Lambda(
+								l.Body.Convert(ex => ConvertMethod(methodCall, sourceTypeNumber, info, param, ex)),
+								info.Parameter);
+
+							return Expression.Call(methodCall.Object, mgen.MakeGenericMethod(types), args);
+						}
+					}
+				}
+			}
+
+			if (expression == methodCall.Arguments[0])
+				return info.Expression;
+
+			switch (expression.NodeType)
+			{
+				case ExpressionType.Parameter :
+
+					if (info.ExpressionsToReplace != null)
+						foreach (var item in info.ExpressionsToReplace)
+							if (expression == item.Path || expression == param && item.Path.NodeType == ExpressionType.Parameter)
+								return item.Expr;
+					break;
+
+				case ExpressionType.MemberAccess :
+
+					if (info.ExpressionsToReplace != null)
+					{
+						foreach (var item in info.ExpressionsToReplace)
+						{
+							var ex1 = expression;
+							var ex2 = item.Path;
+
+							while (ex1.NodeType == ex2.NodeType)
+							{
+								if (ex1.NodeType == ExpressionType.Parameter)
+									return ex1 == ex2 || info.Parameter == ex2? item.Expr : expression;
+
+								if (ex2.NodeType != ExpressionType.MemberAccess)
+									break;
+
+								var ma1 = (MemberExpression)ex1;
+								var ma2 = (MemberExpression)ex2;
+
+								if (ma1.Member != ma2.Member)
+									break;
+
+								ex1 = ma1.Expression;
+								ex2 = ma2.Expression;
+							}
+						}
+					}
+
+					break;
+			}
+
+			return expression;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/OfTypeBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,124 @@
+using System;
+using System.Data;
+using System.Linq;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+	using Data.Sql;
+	using Reflection;
+	using Reflection.Extension;
+
+	class OfTypeBuilder : MethodCallBuilder
+	{
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			return methodCall.IsQueryable("OfType");
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
+			var table    = sequence as TableBuilder.TableContext;
+
+			if (table != null && table.InheritanceMapping.Count > 0)
+			{
+				var objectType = methodCall.Type.GetGenericArguments()[0];
+
+				if (TypeHelper.IsSameOrParent(table.ObjectType, objectType))
+				{
+					var predicate = builder.MakeIsPredicate(table, objectType);
+
+					if (predicate.GetType() != typeof(SqlQuery.Predicate.Expr))
+						sequence.SqlQuery.Where.SearchCondition.Conditions.Add(new SqlQuery.Condition(false, predicate));
+				}
+			}
+			else
+			{
+				var toType   = methodCall.Type.GetGenericArguments()[0];
+				var gargs    = TypeHelper.GetGenericArguments(methodCall.Arguments[0].Type, typeof(IQueryable<>));
+				var fromType = gargs == null ? typeof(object) : gargs[0];
+
+				if (toType.IsSubclassOf(fromType))
+				{
+					for (var type = toType.BaseType; type != null && type != typeof(object); type = type.BaseType)
+					{
+						var extension = TypeExtension.GetTypeExtension(type, builder.MappingSchema.Extensions);
+						var mapping   = builder.MappingSchema.MetadataProvider.GetInheritanceMapping(type, extension);
+
+						if (mapping.Length > 0)
+						{
+							var predicate = MakeIsPredicate(builder, sequence, fromType, toType);
+
+							sequence.SqlQuery.Where.SearchCondition.Conditions.Add(new SqlQuery.Condition(false, predicate));
+
+							return new OfTypeContext(sequence, methodCall);
+						}
+					}
+				}
+			}
+
+			return sequence;
+		}
+
+		ISqlPredicate MakeIsPredicate(ExpressionBuilder builder, IBuildContext context, Type fromType, Type toType)
+		{
+			var table          = new SqlTable(builder.MappingSchema, fromType);
+			var mapper         = builder.MappingSchema.GetObjectMapper(fromType);
+			var discriminators = TableBuilder.TableContext.GetInheritanceDiscriminators(
+				builder, table, fromType, mapper.InheritanceMapping);
+
+			return builder.MakeIsPredicate(context, mapper.InheritanceMapping, discriminators, toType,
+				name =>
+				{
+					var field  = table.Fields.Values.First(f => f.Name == name);
+					var member = field.MemberMapper.MemberAccessor.MemberInfo;
+					var expr   = Expression.MakeMemberAccess(Expression.Parameter(member.DeclaringType, "p"), member);
+					var sql    = context.ConvertToSql(expr, 1, ConvertFlags.Field)[0].Sql;
+
+					return sql;
+				});
+		}
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			return null;
+		}
+
+		#region OfTypeContext
+
+		class OfTypeContext : PassThroughContext
+		{
+			public OfTypeContext(IBuildContext context, MethodCallExpression methodCall)
+				: base(context)
+			{
+				_methodCall = methodCall;
+			}
+
+			private readonly MethodCallExpression _methodCall;
+
+			public override void BuildQuery<T>(Query<T> query, ParameterExpression queryParameter)
+			{
+				var expr   = BuildExpression(null, 0);
+				var mapper = Builder.BuildMapper<T>(expr);
+
+				query.SetQuery(mapper.Compile());
+			}
+
+			public override Expression BuildExpression(Expression expression, int level)
+			{
+				var expr = base.BuildExpression(expression, level);
+				var type = _methodCall.Method.GetGenericArguments()[0];
+
+				if (expr.Type != type)
+					expr = Expression.Convert(expr, type);
+
+				return expr;
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/OrderByBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,68 @@
+using System;
+using System.Linq;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+
+	class OrderByBuilder : MethodCallBuilder
+	{
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			if (!methodCall.IsQueryable("OrderBy", "OrderByDescending", "ThenBy", "ThenByDescending"))
+				return false;
+
+			var body = ((LambdaExpression)methodCall.Arguments[1].Unwrap()).Body.Unwrap();
+
+			if (body.NodeType == ExpressionType.MemberInit)
+			{
+				var mi = (MemberInitExpression)body;
+				bool throwExpr;
+
+				if (mi.NewExpression.Arguments.Count > 0 || mi.Bindings.Count == 0)
+					throwExpr = true;
+				else
+					throwExpr = mi.Bindings.Any(b => b.BindingType != MemberBindingType.Assignment);
+
+				if (throwExpr)
+					throw new NotSupportedException(string.Format("Explicit construction of entity type '{0}' in order by is not allowed.", body.Type));
+			}
+
+			return true;
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
+
+			if (sequence.SqlQuery.Select.TakeValue != null || sequence.SqlQuery.Select.SkipValue != null)
+				sequence = new SubQueryContext(sequence);
+
+			var lambda  = (LambdaExpression)methodCall.Arguments[1].Unwrap();
+			var sparent = sequence.Parent;
+			var order   = new ExpressionContext(buildInfo.Parent, sequence, lambda);
+			var body    = lambda.Body.Unwrap();
+			var sql     = builder.ConvertExpressions(order, body, ConvertFlags.Key);
+
+			builder.ReplaceParent(order, sparent);
+
+			if (!methodCall.Method.Name.StartsWith("Then"))
+				sequence.SqlQuery.OrderBy.Items.Clear();
+
+			foreach (var expr in sql)
+			{
+				var e = builder.ConvertSearchCondition(sequence, expr.Sql);
+				sequence.SqlQuery.OrderBy.Expr(e, methodCall.Method.Name.EndsWith("Descending"));
+			}
+
+			return sequence;
+		}
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			return null;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/PassThroughBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,26 @@
+using System;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+
+	class PassThroughBuilder : MethodCallBuilder
+	{
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			return methodCall.IsQueryable("AsQueryable");
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			return builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
+		}
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			return null;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/PassThroughContext.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,73 @@
+using System;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using Data.Sql;
+
+	public abstract class PassThroughContext : IBuildContext
+	{
+		protected PassThroughContext(IBuildContext context)
+		{
+			Context = context;
+
+			context.Builder.Contexts.Add(this);
+		}
+
+		public IBuildContext Context { get; set; }
+
+#if DEBUG
+		string IBuildContext._sqlQueryText { get { return Context._sqlQueryText; } }
+#endif
+
+		public virtual ExpressionBuilder Builder    { get { return Context.Builder;    } }
+		public virtual Expression        Expression { get { return Context.Expression; } }
+		public virtual SqlQuery          SqlQuery   { get { return Context.SqlQuery;   } set { Context.SqlQuery = value; } }
+		public virtual IBuildContext     Parent     { get { return Context.Parent;     } set { Context.Parent   = value; } }
+
+		public virtual void BuildQuery<T>(Query<T> query, ParameterExpression queryParameter)
+		{
+			Context.BuildQuery(query, queryParameter);
+		}
+
+		public virtual Expression BuildExpression(Expression expression, int level)
+		{
+			return Context.BuildExpression(expression, level);
+		}
+
+		public virtual SqlInfo[] ConvertToSql(Expression expression, int level, ConvertFlags flags)
+		{
+			return Context.ConvertToSql(expression, level, flags);
+		}
+
+		public virtual SqlInfo[] ConvertToIndex(Expression expression, int level, ConvertFlags flags)
+		{
+			return Context.ConvertToIndex(expression, level, flags);
+		}
+
+		public virtual IsExpressionResult IsExpression(Expression expression, int level, RequestFor requestFlag)
+		{
+			return Context.IsExpression(expression, level, requestFlag);
+		}
+
+		public virtual IBuildContext GetContext(Expression expression, int level, BuildInfo buildInfo)
+		{
+			return Context.GetContext(expression, level, buildInfo);
+		}
+
+		public virtual int ConvertToParentIndex(int index, IBuildContext context)
+		{
+			return Context.ConvertToParentIndex(index, context);
+		}
+
+		public virtual void SetAlias(string alias)
+		{
+			Context.SetAlias(alias);
+		}
+
+		public virtual ISqlExpression GetSubQuery(IBuildContext context)
+		{
+			return Context.GetSubQuery(context);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/RequestFor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,52 @@
+using System;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	public enum RequestFor
+	{
+		/// <summary>
+		/// Checks the sequence if the expression is a table or an association.
+		/// </summary>
+		Table,
+
+		/// <summary>
+		/// Checks the sequence if the expression is an association.
+		/// </summary>
+		Association,
+
+		/// <summary>
+		/// Checks the sequence if the expression is a table, an association, new {}, or new MyClass {}.
+		/// </summary>
+		Object,
+
+		/// <summary>
+		/// Checks the sequence if the expression is a group join.
+		/// </summary>
+		GroupJoin,
+
+		/// <summary>
+		/// Checks the sequence if the expression is a field or single value expression.
+		/// </summary>
+		//Scalar,
+
+		/// <summary>
+		/// Checks the sequence if the expression is a field.
+		/// </summary>
+		Field,
+
+		/// <summary>
+		/// Checks the sequence if the expression contains an SQL expression.
+		/// </summary>
+		Expression,
+
+		/// <summary>
+		/// Checks the context if it's a subquery.
+		/// </summary>
+		SubQuery,
+
+		/// <summary>
+		/// Checks the context if it's a root of the expression.
+		/// </summary>
+		Root,
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/ScalarSelectBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,134 @@
+using System;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+	using Data.Sql;
+
+	class ScalarSelectBuilder : ISequenceBuilder
+	{
+		public int BuildCounter { get; set; }
+
+		public bool CanBuild(ExpressionBuilder builder, BuildInfo buildInfo)
+		{
+			return
+				buildInfo.Expression.NodeType == ExpressionType.Lambda &&
+				((LambdaExpression)buildInfo.Expression).Parameters.Count == 0;
+		}
+
+		public IBuildContext BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo)
+		{
+			return new ScalarSelectContext(builder)
+			{
+				Parent     = buildInfo.Parent,
+				Expression = buildInfo.Expression,
+				SqlQuery   = buildInfo.SqlQuery
+			};
+		}
+
+		public SequenceConvertInfo Convert(ExpressionBuilder builder, BuildInfo buildInfo, ParameterExpression param)
+		{
+			return null;
+		}
+
+		public bool IsSequence(ExpressionBuilder builder, BuildInfo buildInfo)
+		{
+			return true;
+		}
+
+		class ScalarSelectContext : IBuildContext
+		{
+			public ScalarSelectContext(ExpressionBuilder builder)
+			{
+				Builder = builder;
+
+				builder.Contexts.Add(this);
+			}
+
+#if DEBUG
+			public string _sqlQueryText { get { return SqlQuery == null ? "" : SqlQuery.SqlText; } }
+#endif
+
+			public ExpressionBuilder Builder    { get; set; }
+			public Expression        Expression { get; set; }
+			public SqlQuery          SqlQuery   { get; set; }
+			public IBuildContext     Parent     { get; set; }
+
+			public void BuildQuery<T>(Query<T> query, ParameterExpression queryParameter)
+			{
+				var expr   = BuildExpression(null, 0);
+				var mapper = Builder.BuildMapper<T>(expr);
+
+				query.SetQuery(mapper.Compile());
+			}
+
+			public Expression BuildExpression(Expression expression, int level)
+			{
+				if (expression == null)
+					expression = ((LambdaExpression)Expression).Body.Unwrap();
+
+				switch (expression.NodeType)
+				{
+					case ExpressionType.New:
+					case ExpressionType.MemberInit:
+						{
+							var expr = Builder.BuildExpression(this, expression);
+
+							if (SqlQuery.Select.Columns.Count == 0)
+								SqlQuery.Select.Expr(new SqlValue(1));
+
+							return expr;
+						}
+
+					default :
+						{
+							var expr = Builder.ConvertToSql(this, expression, false);
+							var idx  = SqlQuery.Select.Add(expr);
+
+							return Builder.BuildSql(expression.Type, idx);
+						}
+				}
+
+			}
+
+			public SqlInfo[] ConvertToSql(Expression expression, int level, ConvertFlags flags)
+			{
+				throw new NotImplementedException();
+			}
+
+			public SqlInfo[] ConvertToIndex(Expression expression, int level, ConvertFlags flags)
+			{
+				throw new NotImplementedException();
+			}
+
+			public IsExpressionResult IsExpression(Expression expression, int level, RequestFor requestFlag)
+			{
+				switch (requestFlag)
+				{
+					case RequestFor.Expression : return IsExpressionResult.True;
+					default                    : return IsExpressionResult.False;
+				}
+			}
+
+			public IBuildContext GetContext(Expression expression, int level, BuildInfo buildInfo)
+			{
+				throw new NotImplementedException();
+			}
+
+			public int ConvertToParentIndex(int index, IBuildContext context)
+			{
+				throw new NotImplementedException();
+			}
+
+			public void SetAlias(string alias)
+			{
+			}
+
+			public ISqlExpression GetSubQuery(IBuildContext context)
+			{
+				return null;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/SelectBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,315 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+	using Reflection;
+
+	class SelectBuilder : MethodCallBuilder
+	{
+		#region SelectBuilder
+
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			if (methodCall.IsQueryable("Select"))
+			{
+				switch (((LambdaExpression)methodCall.Arguments[1].Unwrap()).Parameters.Count)
+				{
+					case 1 :
+					case 2 : return true;
+					default: break;
+				}
+			}
+
+			return false;
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			var selector = (LambdaExpression)methodCall.Arguments[1].Unwrap();
+			var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
+
+			sequence.SetAlias(selector.Parameters[0].Name);
+
+			var body = selector.Body.Unwrap();
+
+			switch (body.NodeType)
+			{
+				case ExpressionType.Parameter : break;
+				default                       :
+					sequence = CheckSubQueryForSelect(sequence);
+					break;
+			}
+
+			var context = selector.Parameters.Count == 1 ?
+				new SelectContext (buildInfo.Parent, selector, sequence) :
+				new SelectContext2(buildInfo.Parent, selector, sequence);
+
+#if DEBUG
+			context.MethodCall = methodCall;
+#endif
+
+			return context;
+		}
+
+		static IBuildContext CheckSubQueryForSelect(IBuildContext context)
+		{
+			return context.SqlQuery.Select.IsDistinct ? new SubQueryContext(context) : context;
+		}
+
+		#endregion
+
+		#region SelectContext2
+
+		class SelectContext2 : SelectContext
+		{
+			public SelectContext2(IBuildContext parent, LambdaExpression lambda, IBuildContext sequence)
+				: base(parent, lambda, sequence)
+			{
+			}
+
+			static readonly ParameterExpression _counterParam = Expression.Parameter(typeof(int), "counter");
+
+			public override void BuildQuery<T>(Query<T> query, ParameterExpression queryParameter)
+			{
+				var expr   = BuildExpression(null, 0);
+
+			if (expr.Type != typeof(T))
+				expr = Expression.Convert(expr, typeof(T));
+
+				var mapper = Expression.Lambda<Func<int,QueryContext,IDataContext,IDataReader,Expression,object[],T>>(
+					Builder.BuildBlock(expr), new []
+					{
+						_counterParam,
+						ExpressionBuilder.ContextParam,
+						ExpressionBuilder.DataContextParam,
+						ExpressionBuilder.DataReaderParam,
+						ExpressionBuilder.ExpressionParam,
+						ExpressionBuilder.ParametersParam,
+					});
+
+				var func = mapper.Compile();
+
+				Func<QueryContext,IDataContext,IDataReader,Expression,object[],int,T> map = (ctx,db,rd,e,ps,n) => func(n, ctx, db, rd, e, ps);
+
+				query.SetQuery(map);
+			}
+
+			public override IsExpressionResult IsExpression(Expression expression, int level, RequestFor requestFlag)
+			{
+				switch (requestFlag)
+				{
+					case RequestFor.Expression :
+					case RequestFor.Root       :
+						if (expression == Lambda.Parameters[1])
+							return IsExpressionResult.True;
+						break;
+				}
+
+				return base.IsExpression(expression, level, requestFlag);
+			}
+
+			public override Expression BuildExpression(Expression expression, int level)
+			{
+				if (expression == Lambda.Parameters[1])
+					return _counterParam;
+
+				return base.BuildExpression(expression, level);
+			}
+		}
+
+		#endregion
+
+		#region Convert
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression originalMethodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			var methodCall = originalMethodCall;
+			var selector   = (LambdaExpression)methodCall.Arguments[1].Unwrap();
+			var info       = builder.ConvertSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]), selector.Parameters[0]);
+
+			if (info != null)
+			{
+				methodCall = (MethodCallExpression)methodCall.Convert(
+					ex => ConvertMethod(methodCall, 0, info, selector.Parameters[0], ex));
+				selector   = (LambdaExpression)methodCall.Arguments[1].Unwrap();
+			}
+
+			if (param != null && param != builder.SequenceParameter)
+			{
+				var list =
+					(
+						from path in GetExpressions(selector.Parameters[0], param, 0, selector.Body.Unwrap())
+						orderby path.Level descending
+						select path
+					).ToList();
+
+				if (list.Count > 0)
+				{
+					var plist = list.Where(e => e.Expr == selector.Parameters[0]).ToList();
+
+					if (plist.Count > 1)
+						list = list.Except(plist.Skip(1)).ToList();
+
+					var p = plist.FirstOrDefault();
+
+					if (p == null)
+					{
+						var types  = methodCall.Method.GetGenericArguments();
+						var mgen   = methodCall.Method.GetGenericMethodDefinition();
+						var btype  = typeof(ExpressionHoder<,>).MakeGenericType(types[0], selector.Body.Type);
+						var fields = btype.GetFields();
+						var pold   = selector.Parameters[0];
+						var psel   = Expression.Parameter(types[0], pold.Name);
+
+						methodCall = Expression.Call(
+							methodCall.Object,
+							mgen.MakeGenericMethod(types[0], btype),
+							methodCall.Arguments[0],
+							Expression.Lambda(
+								Expression.MemberInit(
+									Expression.New(btype),
+									Expression.Bind(fields[0], psel),
+									Expression.Bind(fields[1], selector.Body.Convert(e => e == pold ? psel : e))),
+								psel));
+
+						selector = (LambdaExpression)methodCall.Arguments[1].Unwrap();
+						param    = Expression.Parameter(selector.Body.Type, param.Name);
+
+						list.Add(new SequenceConvertPath { Path = param, Expr = Expression.MakeMemberAccess(param, fields[1]), Level = 1 });
+
+						var expr = Expression.MakeMemberAccess(param, fields[0]);
+
+						foreach (var t in list)
+							t.Expr = t.Expr.Convert(ex => ex == pold ? expr : ex);
+
+						return new SequenceConvertInfo
+						{
+							Parameter            = param,
+							Expression           = methodCall,
+							ExpressionsToReplace = list
+						};
+					}
+
+					if (info != null)
+					{
+						if (info.ExpressionsToReplace != null)
+						{
+							foreach (var path in info.ExpressionsToReplace)
+							{
+								path.Path = path.Path.Convert(e => e == info.Parameter ? p.Path : e);
+								path.Expr = path.Expr.Convert(e => e == info.Parameter ? p.Path : e);
+								path.Level += p.Level;
+
+								list.Add(path);
+							}
+
+							list = list.OrderByDescending(path => path.Level).ToList();
+						}
+					}
+
+					if (list.Count > 1)
+					{
+						return new SequenceConvertInfo
+						{
+							Parameter            = param,
+							Expression           = methodCall,
+							ExpressionsToReplace = list
+								.Where (e => e != p)
+								.Select(ei =>
+								{
+									ei.Expr = ei.Expr.Convert(e => e == p.Expr ? p.Path : e);
+									return ei;
+								})
+								.ToList()
+						};
+					}
+				}
+			}
+
+			if (methodCall != originalMethodCall)
+				return new SequenceConvertInfo
+				{
+					Parameter  = param,
+					Expression = methodCall,
+				};
+
+			return null;
+		}
+
+		static IEnumerable<SequenceConvertPath> GetExpressions(ParameterExpression param, Expression path, int level, Expression expression)
+		{
+			switch (expression.NodeType)
+			{
+				// new { ... }
+				//
+				case ExpressionType.New        :
+					{
+						var expr = (NewExpression)expression;
+
+						if (expr.Members != null) for (var i = 0; i < expr.Members.Count; i++)
+						{
+							var q = GetExpressions(param, Expression.MakeMemberAccess(path, expr.Members[i]), level + 1, expr.Arguments[i]);
+							foreach (var e in q)
+								yield return e;
+						}
+
+						break;
+					}
+
+				// new MyObject { ... }
+				//
+				case ExpressionType.MemberInit :
+					{
+						var expr = (MemberInitExpression)expression;
+						var dic  = TypeAccessor.GetAccessor(expr.Type)
+							.Select((m,i) => new { m, i })
+							.ToDictionary(_ => _.m.MemberInfo.Name, _ => _.i);
+
+						foreach (var binding in expr.Bindings.Cast<MemberAssignment>().OrderBy(b => dic[b.Member.Name]))
+						{
+							var q = GetExpressions(param, Expression.MakeMemberAccess(path, binding.Member), level + 1, binding.Expression);
+							foreach (var e in q)
+								yield return e;
+						}
+
+						break;
+					}
+
+				// parameter
+				//
+				case ExpressionType.Parameter  :
+					if (expression == param)
+						yield return new SequenceConvertPath { Path = path, Expr = expression, Level = level };
+					break;
+
+				case ExpressionType.TypeAs     :
+					yield return new SequenceConvertPath { Path = path, Expr = expression, Level = level };
+					break;
+
+				// Queriable method.
+				//
+				case ExpressionType.Call       :
+					{
+						var call = (MethodCallExpression)expression;
+
+						if (call.IsQueryable())
+							if (TypeHelper.IsSameOrParent(typeof(IEnumerable), call.Type) ||
+							    TypeHelper.IsSameOrParent(typeof(IQueryable),  call.Type) ||
+							    FirstSingleBuilder.MethodNames.Contains(call.Method.Name))
+								yield return new SequenceConvertPath { Path = path, Expr = expression, Level = level };
+
+						break;
+					}
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/SelectContext.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1081 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+	using Data.Sql;
+	using Reflection;
+
+	// This class implements double functionality (scalar and member type selects)
+	// and could be implemented as two different classes.
+	// But the class means to have a lot of inheritors, and functionality of the inheritors
+	// will be doubled as well. So lets double it once here.
+	//
+	public class SelectContext : IBuildContext
+	{
+		#region Init
+
+#if DEBUG
+		[CLSCompliant(false)]
+		public string _sqlQueryText { get { return SqlQuery == null ? "" : SqlQuery.SqlText; } }
+
+		public MethodCallExpression MethodCall;
+#endif
+
+		public IBuildContext[]   Sequence { get; set; }
+		public LambdaExpression  Lambda   { get; set; }
+		public Expression        Body     { get; set; }
+		public ExpressionBuilder Builder  { get; private set; }
+		public SqlQuery          SqlQuery { get; set; }
+		public IBuildContext     Parent   { get; set; }
+		public bool              IsScalar { get; private set; }
+
+		Expression IBuildContext.Expression { get { return Lambda; } }
+
+		public readonly Dictionary<MemberInfo,Expression> Members = new Dictionary<MemberInfo,Expression>(new MemberInfoComparer());
+
+		public SelectContext(IBuildContext parent, LambdaExpression lambda, params IBuildContext[] sequences)
+		{
+			Parent   = parent;
+			Sequence = sequences;
+			Builder  = sequences[0].Builder;
+			Lambda   = lambda;
+			Body     = lambda.Body;
+			SqlQuery = sequences[0].SqlQuery;
+
+			foreach (var context in Sequence)
+				context.Parent = this;
+
+			IsScalar = !Builder.ProcessProjection(Members, Body);
+
+			Builder.Contexts.Add(this);
+		}
+
+		#endregion
+
+		#region BuildQuery
+
+		public virtual void BuildQuery<T>(Query<T> query, ParameterExpression queryParameter)
+		{
+			var expr   = BuildExpression(null, 0);
+			var mapper = Builder.BuildMapper<T>(expr);
+
+			query.SetQuery(mapper.Compile());
+		}
+
+		#endregion
+
+		#region BuildExpression
+
+		public virtual Expression BuildExpression(Expression expression, int level)
+		{
+			{
+				var key = Tuple.Create(expression, level, ConvertFlags.Field);
+
+				SqlInfo[] info;
+
+				if (_expressionIndex.TryGetValue(key, out info))
+				{
+					var idx  = Parent == null ? info[0].Index : Parent.ConvertToParentIndex(info[0].Index, this);
+					return Builder.BuildSql((expression ?? Body).Type, idx);
+				}
+			}
+
+			if (expression == null)
+				return Builder.BuildExpression(this, Body);
+
+			var levelExpression = expression.GetLevelExpression(level);
+
+			if (IsScalar)
+			{
+				if (Body.NodeType != ExpressionType.Parameter && level == 0)
+					if (levelExpression == expression)
+						if (IsSubQuery() && IsExpression(null, 0, RequestFor.Expression).Result)
+						{
+							var info = ConvertToIndex(expression, level, ConvertFlags.Field).Single();
+							var idx = Parent == null ? info.Index : Parent.ConvertToParentIndex(info.Index, this);
+
+							return Builder.BuildSql(expression.Type, idx);
+						}
+
+				return ProcessScalar(
+					expression,
+					level,
+					(ctx, ex, l) => ctx.BuildExpression(ex, l),
+					() => GetSequence(expression, level).BuildExpression(null, 0));
+			}
+			else
+			{
+				if (level == 0)
+				{
+					var sequence = GetSequence(expression, level);
+
+					return levelExpression == expression ?
+						sequence.BuildExpression(null,       0) :
+						sequence.BuildExpression(expression, level + 1);
+				}
+
+				switch (levelExpression.NodeType)
+				{
+					case ExpressionType.MemberAccess :
+						{
+							var memberExpression = GetMemberExpression(
+								((MemberExpression)levelExpression).Member,
+								levelExpression == expression,
+								levelExpression.Type);
+
+							if (levelExpression == expression)
+							{
+								if (IsSubQuery())
+								{
+									switch (memberExpression.NodeType)
+									{
+										case ExpressionType.New        :
+										case ExpressionType.MemberInit :
+											{
+												return memberExpression.Convert(e =>
+												{
+													if (e != memberExpression)
+													{
+														switch (e.NodeType)
+														{
+															case ExpressionType.MemberAccess :
+																var sequence = GetSequence(memberExpression, 0);
+
+																if (sequence != null &&
+																	!sequence.IsExpression(e, 0, RequestFor.Object).Result &&
+																	!sequence.IsExpression(e, 0, RequestFor.Field). Result)
+																{
+																	var info = ConvertToIndex(e, 0, ConvertFlags.Field).Single();
+																	var idx  = Parent == null ? info.Index : Parent.ConvertToParentIndex(info.Index, this);
+
+																	return Builder.BuildSql(e.Type, idx);
+																}
+
+																return Builder.BuildExpression(this, e);
+														}
+													}
+
+													return e;
+												});
+											}
+									}
+
+									var me = memberExpression.NodeType == ExpressionType.Parameter ? null : memberExpression;
+
+									if (!IsExpression(me, 0, RequestFor.Object).Result &&
+										!IsExpression(me, 0, RequestFor.Field). Result)
+									{
+										var info = ConvertToIndex(expression, level, ConvertFlags.Field).Single();
+										var idx  = Parent == null ? info.Index : Parent.ConvertToParentIndex(info.Index, this);
+
+										return Builder.BuildSql(expression.Type, idx);
+									}
+								}
+
+								return Builder.BuildExpression(this, memberExpression);
+							}
+
+							{
+								var sequence = GetSequence(expression, level);
+
+								switch (memberExpression.NodeType)
+								{
+									case ExpressionType.Parameter  :
+										{
+											var parameter = Lambda.Parameters[Sequence.Length == 0 ? 0 : Array.IndexOf(Sequence, sequence)];
+										
+											if (memberExpression == parameter)
+												return sequence.BuildExpression(expression, level + 1);
+
+											break;
+										
+										}
+
+									case ExpressionType.New        :
+									case ExpressionType.MemberInit :
+										{
+											var mmExpresion = GetMemberExpression(memberExpression, expression, level + 1);
+											return Builder.BuildExpression(this, mmExpresion);
+										}
+								}
+
+								var expr = expression.Convert(ex => ex == levelExpression ? memberExpression : ex);
+
+								return sequence.BuildExpression(expr, 1);
+							}
+						}
+
+					case ExpressionType.Parameter :
+						break;
+				}
+			}
+
+			throw new InvalidOperationException();
+		}
+
+		#endregion
+
+		#region ConvertToSql
+
+		readonly Dictionary<MemberInfo,SqlInfo[]> _sql = new Dictionary<MemberInfo,SqlInfo[]>(new MemberInfoComparer());
+
+		public virtual SqlInfo[] ConvertToSql(Expression expression, int level, ConvertFlags flags)
+		{
+			if (expression != null && level > 0 && expression.NodeType == ExpressionType.Call)
+			{
+				var e = (MethodCallExpression)expression;
+
+				if (e.Method.DeclaringType == typeof(Enumerable))
+				{
+					return new[] { new SqlInfo { Sql = Builder.SubQueryToSql(this, e) } };
+				}
+			}
+
+			if (IsScalar)
+			{
+				if (expression == null)
+					return Builder.ConvertExpressions(this, Body, flags);
+
+				switch (flags)
+				{
+					case ConvertFlags.Field :
+					case ConvertFlags.Key   :
+					case ConvertFlags.All   :
+						{
+							if (Body.NodeType != ExpressionType.Parameter && level == 0)
+							{
+								var levelExpression = expression.GetLevelExpression(level);
+
+								if (levelExpression != expression)
+									if (flags != ConvertFlags.Field && IsExpression(expression, level, RequestFor.Field).Result)
+										flags = ConvertFlags.Field;
+							}
+
+							return ProcessScalar(
+								expression,
+								level,
+								(ctx, ex, l) => ctx.ConvertToSql(ex, l, flags),
+								() => new[] { new SqlInfo { Sql = Builder.ConvertToSql(this, expression, false) } });
+						}
+				}
+			}
+			else
+			{
+				if (expression == null)
+				{
+					if (flags != ConvertFlags.Field)
+					{
+						var q =
+							from m in Members
+							where !(m.Key is MethodInfo)
+							select ConvertMember(m.Key, m.Value, flags) into mm
+							from m in mm
+							select m;
+
+						return q.ToArray();
+					}
+
+					throw new InvalidOperationException();
+				}
+
+				switch (flags)
+				{
+					case ConvertFlags.All   :
+					case ConvertFlags.Key   :
+					case ConvertFlags.Field :
+						{
+							var levelExpression = expression.GetLevelExpression(level);
+
+							switch (levelExpression.NodeType)
+							{
+								case ExpressionType.MemberAccess :
+									{
+										if (level != 0 && levelExpression == expression)
+										{
+											var member = ((MemberExpression)levelExpression).Member;
+
+											SqlInfo[] sql;
+
+											if (!_sql.TryGetValue(member, out sql))
+											{
+												var memberExpression = GetMemberExpression(
+													member, levelExpression == expression, levelExpression.Type);
+
+												sql = ConvertExpressions(memberExpression, flags)
+													.Select(si => si.Clone(member)).ToArray();
+
+												_sql.Add(member, sql);
+											}
+
+											return sql;
+										}
+
+										return ProcessMemberAccess(
+											expression, (MemberExpression)levelExpression, level,
+											(n,ctx,ex,l,mex) =>
+											{
+												switch (n)
+												{
+													case 0 :
+														var buildExpression = GetExpression(expression, levelExpression, mex);
+														return ConvertExpressions(buildExpression, flags);
+													default:
+														return ctx.ConvertToSql(ex, l, flags);
+												}
+											});
+									}
+
+								case ExpressionType.Parameter:
+									if (levelExpression != expression)
+										return GetSequence(expression, level).ConvertToSql(expression, level + 1, flags);
+
+									if (level == 0)
+										return GetSequence(expression, level).ConvertToSql(null, 0, flags);
+
+									break;
+
+								default:
+									if (level == 0)
+										return Builder.ConvertExpressions(this, expression, flags);
+									break;
+							}
+
+							break;
+						}
+				}
+			}
+
+			throw new InvalidOperationException();
+		}
+
+		SqlInfo[] ConvertMember(MemberInfo member, Expression expression, ConvertFlags flags)
+		{
+			return ConvertExpressions(expression, flags)
+				.Select(si => si.Clone(member))
+				.ToArray();
+		}
+
+		SqlInfo[] ConvertExpressions(Expression expression, ConvertFlags flags)
+		{
+			return Builder.ConvertExpressions(this, expression, flags)
+				.Select(CheckExpression)
+				.ToArray();
+		}
+
+		SqlInfo CheckExpression(SqlInfo expression)
+		{
+			if (expression.Sql is SqlQuery.SearchCondition)
+			{
+				expression.Sql = Builder.Convert(this, new SqlFunction(typeof(bool), "CASE", expression.Sql, new SqlValue(true), new SqlValue(false)));
+			}
+
+			return expression;
+		}
+
+		#endregion
+
+		#region ConvertToIndex
+
+		readonly Dictionary<Tuple<Expression,int,ConvertFlags>,SqlInfo[]> _expressionIndex = new Dictionary<Tuple<Expression,int,ConvertFlags>,SqlInfo[]>();
+
+		public virtual SqlInfo[] ConvertToIndex(Expression expression, int level, ConvertFlags flags)
+		{
+			var key = Tuple.Create(expression, level, flags);
+
+			SqlInfo[] info;
+
+			if (!_expressionIndex.TryGetValue(key, out info))
+			{
+				info = ConvertToIndexInternal(expression, level, flags);
+
+				var newInfo = info
+					.Select(i =>
+					{
+						if (i.Query == SqlQuery)
+							return i;
+
+						return new SqlInfo(i.Members)
+						{
+							Query = SqlQuery,
+							Index = SqlQuery.Select.Add(i.Query.Select.Columns[i.Index])
+						};
+					})
+					.ToArray();
+
+				_expressionIndex.Add(key, newInfo);
+
+				return newInfo;
+			}
+
+			return info;
+		}
+
+		readonly Dictionary<Tuple<MemberInfo,ConvertFlags>,SqlInfo[]> _memberIndex = new Dictionary<Tuple<MemberInfo,ConvertFlags>,SqlInfo[]>();
+
+		SqlInfo[] ConvertToIndexInternal(Expression expression, int level, ConvertFlags flags)
+		{
+			if (IsScalar)
+			{
+				if (Body.NodeType == ExpressionType.Parameter)
+					for (var i = 0; i < Sequence.Length; i++)
+						if (Body == Lambda.Parameters[i])
+							return Sequence[i].ConvertToIndex(expression, level, flags);
+
+				if (expression == null)
+				{
+					var key = Tuple.Create((MemberInfo)null, flags);
+
+					SqlInfo[] idx;
+
+					if (!_memberIndex.TryGetValue(key, out idx))
+					{
+						idx = ConvertToSql(null, 0, flags);
+
+						foreach (var info in idx)
+							SetInfo(info);
+
+						_memberIndex.Add(key, idx);
+					}
+
+					return idx;
+				}
+
+				switch (flags)
+				{
+					case ConvertFlags.Field :
+					case ConvertFlags.All   :
+						return ProcessScalar(
+							expression,
+							level,
+							(ctx, ex, l) => ctx.ConvertToIndex(ex, l, flags),
+							() => GetSequence(expression, level).ConvertToIndex(expression, level + 1, flags));
+				}
+			}
+			else
+			{
+				if (expression == null)
+				{
+					switch (flags)
+					{
+						case ConvertFlags.Field : throw new InvalidOperationException();
+						case ConvertFlags.Key   :
+						case ConvertFlags.All   :
+							{
+								var p = Expression.Parameter(Body.Type, "p");
+								var q =
+									from m in Members.Keys
+									where !(m is MethodInfo)
+									select new
+									{
+										Sql    = ConvertToIndex(Expression.MakeMemberAccess(p, m), 1, flags),
+										Member = m
+									} into mm
+									from m in mm.Sql.Select(s => s.Clone(mm.Member))
+									select m;
+
+								return q.ToArray();
+							}
+					}
+				}
+
+				switch (flags)
+				{
+					case ConvertFlags.All   :
+					case ConvertFlags.Key   :
+					case ConvertFlags.Field :
+						{
+							if (level == 0)
+							{
+								var idx = Builder.ConvertExpressions(this, expression, flags);
+
+								foreach (var info in idx)
+									SetInfo(info);
+
+								return idx;
+							}
+
+							var levelExpression = expression.GetLevelExpression(level);
+
+							switch (levelExpression.NodeType)
+							{
+								case ExpressionType.MemberAccess :
+									{
+										if (levelExpression == expression)
+										{
+											var member = Tuple.Create(((MemberExpression)levelExpression).Member, flags);
+
+											SqlInfo[] idx;
+
+											if (!_memberIndex.TryGetValue(member, out idx))
+											{
+												idx = ConvertToSql(expression, level, flags);
+
+												if (flags == ConvertFlags.Field && idx.Length != 1)
+													throw new InvalidOperationException();
+
+												foreach (var info in idx)
+													SetInfo(info);
+
+												_memberIndex.Add(member, idx);
+											}
+
+											return idx;
+										}
+
+										return ProcessMemberAccess(
+											expression,
+											(MemberExpression)levelExpression,
+											level,
+											(n, ctx, ex, l, _) => n == 0 ?
+												GetSequence(expression, level).ConvertToIndex(expression, level + 1, flags) :
+												ctx.ConvertToIndex(ex, l, flags));
+									}
+
+								case ExpressionType.Parameter:
+
+									if (levelExpression != expression)
+										return GetSequence(expression, level).ConvertToIndex(expression, level + 1, flags);
+									break;
+							}
+
+							break;
+						}
+				}
+			}
+
+			throw new InvalidOperationException();
+		}
+
+		void SetInfo(SqlInfo info)
+		{
+			info.Query = SqlQuery;
+
+			if (info.Sql == SqlQuery)
+				info.Index = SqlQuery.Select.Columns.Count - 1;
+			else
+				info.Index = SqlQuery.Select.Add(info.Sql);
+		}
+
+		#endregion
+
+		#region IsExpression
+
+		public virtual IsExpressionResult IsExpression(Expression expression, int level, RequestFor requestFlag)
+		{
+			switch (requestFlag)
+			{
+				case RequestFor.SubQuery : return IsExpressionResult.False;
+				case RequestFor.Root     :
+					return new IsExpressionResult(Sequence.Length == 1 ?
+						expression == Lambda.Parameters[0] :
+						Lambda.Parameters.Any(p => p == expression));
+			}
+
+			if (IsScalar)
+			{
+				if (expression == null)
+					return IsExpression(Body, 0, requestFlag);
+
+				switch (requestFlag)
+				{
+					default                     : return IsExpressionResult.False;
+					case RequestFor.Table       :
+					case RequestFor.Association :
+					case RequestFor.Field       :
+					case RequestFor.Expression  :
+					case RequestFor.Object      :
+					case RequestFor.GroupJoin   :
+						return ProcessScalar(
+							expression,
+							level,
+							(ctx, ex, l) => ctx.IsExpression(ex, l, requestFlag),
+							() => new IsExpressionResult(requestFlag == RequestFor.Expression));
+				}
+			}
+			else
+			{
+				switch (requestFlag)
+				{
+					default                     : return IsExpressionResult.False;
+					case RequestFor.Table       :
+					case RequestFor.Association :
+					case RequestFor.Field       :
+					case RequestFor.Expression  :
+					case RequestFor.Object      :
+					case RequestFor.GroupJoin   :
+						{
+							if (expression == null)
+							{
+								if (requestFlag == RequestFor.Expression)
+									return new IsExpressionResult(Members.Values.Any(member => IsExpression(member, 0, requestFlag).Result));
+
+								return new IsExpressionResult(requestFlag == RequestFor.Object);
+							}
+
+							var levelExpression = expression.GetLevelExpression(level);
+
+							switch (levelExpression.NodeType)
+							{
+								case ExpressionType.MemberAccess :
+									{
+										var member = ((MemberExpression)levelExpression).Member;
+
+										Expression memberExpression;
+
+										if (!Members.TryGetValue(member, out memberExpression))
+										{
+											var nm = Members.Keys.FirstOrDefault(m => m.Name == member.Name);
+
+											if (nm != null && member.DeclaringType.IsInterface)
+											{
+												if (TypeHelper.IsSameOrParent(member.DeclaringType, nm.DeclaringType))
+													memberExpression = Members[nm];
+												else
+												{
+													var mdt = TypeHelper.GetDefiningTypes(member.DeclaringType, member);
+													var ndt = TypeHelper.GetDefiningTypes(Body.Type,            nm);
+
+													if (mdt.Intersect(ndt).Any())
+														memberExpression = Members[nm];
+												}
+											}
+
+											if (memberExpression == null)
+												return new IsExpressionResult(requestFlag == RequestFor.Expression);
+												//throw new InvalidOperationException(
+												//	string.Format("Invalid member '{0}.{1}'", member.DeclaringType, member.Name));
+										}
+
+										if (levelExpression == expression)
+										{
+											switch (memberExpression.NodeType)
+											{
+												case ExpressionType.New        :
+												case ExpressionType.MemberInit :
+													return new IsExpressionResult(requestFlag == RequestFor.Object);
+											}
+										}
+
+										return ProcessMemberAccess(
+											expression,
+											(MemberExpression)levelExpression,
+											level,
+											(n,ctx,ex,l,_) => n == 0 ?
+												new IsExpressionResult(requestFlag == RequestFor.Expression) : 
+												ctx.IsExpression(ex, l, requestFlag));
+									}
+
+								case ExpressionType.Parameter    :
+									{
+										var sequence  = GetSequence(expression, level);
+										var parameter = Lambda.Parameters[Sequence.Length == 0 ? 0 : Array.IndexOf(Sequence, sequence)];
+
+										if (levelExpression == expression)
+										{
+											if (levelExpression == parameter)
+												return sequence.IsExpression(null, 0, requestFlag);
+										}
+										else if (level == 0)
+											return sequence.IsExpression(expression, 1, requestFlag);
+
+										break;
+									}
+
+								case ExpressionType.New          :
+								case ExpressionType.MemberInit   : return new IsExpressionResult(requestFlag == RequestFor.Object);
+								default                          : return new IsExpressionResult(requestFlag == RequestFor.Expression);
+							}
+
+							break;
+						}
+				}
+			}
+
+			throw new InvalidOperationException();
+		}
+
+		#endregion
+
+		#region GetContext
+
+		public virtual IBuildContext GetContext(Expression expression, int level, BuildInfo buildInfo)
+		{
+			if (expression == null)
+				return this;
+
+			if (IsScalar)
+			{
+				return ProcessScalar(
+					expression,
+					level,
+					(ctx, ex, l) => ctx.GetContext(ex, l, buildInfo),
+					() => { throw new InvalidOperationException(); });
+			}
+			else
+			{
+				var levelExpression = expression.GetLevelExpression(level);
+
+				switch (levelExpression.NodeType)
+				{
+					case ExpressionType.MemberAccess :
+						{
+							if (levelExpression == expression && Sequence.Length == 1 && !(Sequence[0] is GroupByBuilder.GroupByContext))
+							{
+								var memberExpression = GetMemberExpression(
+									((MemberExpression)levelExpression).Member,
+									levelExpression == expression,
+									levelExpression.Type);
+
+								//var sequence = GetSequence(memberExpression, 0);
+								//return sequence.GetContext(memberExpression, 1, new BuildInfo(buildInfo, memberExpression));
+
+								var ctx = GetContext(memberExpression, 0, new BuildInfo(this, memberExpression, buildInfo.SqlQuery));
+
+								if (ctx != null)
+								{
+									return ctx;
+								}
+							}
+
+							var context = ProcessMemberAccess(
+								expression,
+								(MemberExpression)levelExpression,
+								level,
+								(n,ctx,ex,l,_) => n == 0 ?
+									null :
+									ctx.GetContext(ex, l, buildInfo));
+
+							if (context == null)
+								throw new InvalidOperationException();
+
+							return context;
+						}
+
+					case ExpressionType.Parameter    :
+						{
+							var sequence  = GetSequence(expression, level);
+							var parameter = Lambda.Parameters[Sequence.Length == 0 ? 0 : Array.IndexOf(Sequence, sequence)];
+
+							if (levelExpression == expression)
+							{
+								if (levelExpression == parameter)
+									return sequence.GetContext(null, 0, buildInfo);
+							}
+							else if (level == 0)
+								return sequence.GetContext(expression, 1, buildInfo);
+
+							break;
+						}
+				}
+
+				if (level == 0)
+				{
+					var sequence = GetSequence(expression, level);
+					return sequence.GetContext(expression, level + 1, buildInfo);
+				}
+			}
+
+			throw new InvalidOperationException();
+		}
+
+		#endregion
+
+		#region ConvertToParentIndex
+
+		public virtual int ConvertToParentIndex(int index, IBuildContext context)
+		{
+			if (context.SqlQuery != SqlQuery)
+				index = SqlQuery.Select.Add(context.SqlQuery.Select.Columns[index]);
+
+			return Parent == null ? index : Parent.ConvertToParentIndex(index, this);
+		}
+
+		#endregion
+
+		#region SetAlias
+
+		public virtual void SetAlias(string alias)
+		{
+		}
+
+		#endregion
+
+		#region GetSubQuery
+
+		public ISqlExpression GetSubQuery(IBuildContext context)
+		{
+			return null;
+		}
+
+		#endregion
+
+		#region Helpers
+
+		T ProcessScalar<T>(Expression expression, int level, Func<IBuildContext,Expression,int,T> action, Func<T> defaultAction)
+		{
+			if (level == 0)
+			{
+				if (Body.NodeType == ExpressionType.Parameter)
+				{
+					var sequence = GetSequence(Body, 0);
+
+					return expression == Body ?
+						action(sequence, null,       0) :
+						action(sequence, expression, 1);
+				}
+
+				var levelExpression = expression.GetLevelExpression(level);
+
+				if (levelExpression != expression)
+				{
+					var ctx = GetSequence(expression, level);
+					return ctx == null ? defaultAction() : action(ctx, expression, Sequence.Contains(ctx) ? level + 1 : 0);
+				}
+
+				if (expression.NodeType == ExpressionType.Parameter)
+				{
+					var sequence  = GetSequence(expression, level);
+					var parameter = Lambda.Parameters[Sequence.Length == 0 ? 0 : Array.IndexOf(Sequence, sequence)];
+
+					if (levelExpression == parameter)
+						return action(sequence, null, 0);
+				}
+
+				switch (Body.NodeType)
+				{
+					case ExpressionType.MemberAccess : return action(GetSequence(expression, level), null, 0);
+					default                          : return defaultAction();
+				}
+			}
+			else
+			{
+				var root = Body.GetRootObject();
+
+				if (root.NodeType == ExpressionType.Parameter)
+				{
+					var levelExpression = expression.GetLevelExpression(level - 1);
+					var newExpression   = GetExpression(expression, levelExpression, Body);
+
+					return action(this, newExpression, 0);
+				}
+			}
+
+			throw new InvalidOperationException();
+		}
+
+		T ProcessMemberAccess<T>(Expression expression, MemberExpression levelExpression, int level,
+			Func<int,IBuildContext,Expression,int,Expression,T> action)
+		{
+			var memberExpression = Members[levelExpression.Member];
+			var newExpression    = GetExpression(expression, levelExpression, memberExpression);
+			var sequence         = GetSequence  (expression, level);
+			var nextLevel        = 1;
+
+			if (sequence != null)
+			{
+				var idx = Sequence.Length == 0 ? 0 : Array.IndexOf(Sequence, sequence);
+
+				if (idx >= 0)
+				{
+					var parameter = Lambda.Parameters[idx];
+
+					if (levelExpression == expression)
+					{
+						if (memberExpression == parameter)
+							return action(1, sequence, null, 0, memberExpression);
+
+//						if (!(sequence is GroupByBuilder.GroupByContext) && memberExpression.GetRootObject() == parameter)
+//							return action(3, this, newExpression, 0, memberExpression);
+					}
+				}
+				else
+				{
+					nextLevel = 0;
+				}
+			}
+
+			switch (memberExpression.NodeType)
+			{
+				case ExpressionType.MemberAccess :
+				case ExpressionType.Parameter    :
+					if (sequence != null)
+						return action(2, sequence, newExpression, nextLevel, memberExpression);
+					throw new InvalidOperationException();
+
+				case ExpressionType.New          :
+				case ExpressionType.MemberInit   :
+					{
+						var mmExpresion = GetMemberExpression(memberExpression, expression, level + 1);
+						return action(3, this, mmExpresion, 0, memberExpression);
+					}
+			}
+
+			return action(0, this, null, 0, memberExpression);
+		}
+
+		protected bool IsSubQuery()
+		{
+			for (var p = Parent; p != null; p = p.Parent)
+				if (p.IsExpression(null, 0, RequestFor.SubQuery).Result)
+					return true;
+			return false;
+		}
+
+		IBuildContext GetSequence(Expression expression, int level)
+		{
+			if (Sequence.Length == 1 && Sequence[0].Parent == null)
+				return Sequence[0];
+
+			Expression root = null;
+
+			if (IsScalar)
+			{
+				root = expression.GetRootObject();
+			}
+			else
+			{
+				var levelExpression = expression.GetLevelExpression(level);
+
+				switch (levelExpression.NodeType)
+				{
+					case ExpressionType.MemberAccess :
+						{
+							var memberExpression = Members[((MemberExpression)levelExpression).Member];
+
+							root =  memberExpression.GetRootObject();
+
+							if (root.NodeType != ExpressionType.Parameter)
+								return null;
+
+							break;
+						}
+
+					case ExpressionType.Parameter :
+						{
+							root = expression.GetRootObject();
+							break;
+						}
+				}
+			}
+
+			if (root != null)
+				for (var i = 0; i < Lambda.Parameters.Count; i++)
+					if (root == Lambda.Parameters[i])
+						return Sequence[i];
+
+			foreach (var context in Sequence)
+			{
+				if (context.Parent != null)
+				{
+					var ctx = Builder.GetContext(context, root);
+					if (ctx != null)
+						return ctx;
+				}
+			}
+
+			return null;
+		}
+
+		static Expression GetExpression(Expression expression, Expression levelExpression, Expression memberExpression)
+		{
+			return levelExpression != expression ?
+				expression.Convert(ex => ex == levelExpression ? memberExpression : ex) :
+				memberExpression;
+		}
+
+		static Expression GetMemberExpression(Expression newExpression, Expression expression, int level)
+		{
+			var levelExpresion = expression.GetLevelExpression(level);
+
+			switch (newExpression.NodeType)
+			{
+				case ExpressionType.New        :
+				case ExpressionType.MemberInit : break;
+				default                        :
+					var le = expression.GetLevelExpression(level - 1);
+					return GetExpression(expression, le, newExpression);
+			}
+
+			if (levelExpresion.NodeType != ExpressionType.MemberAccess)
+				throw new LinqException("Invalid expression {0}", levelExpresion);
+
+			var me = (MemberExpression)levelExpresion;
+
+			switch (newExpression.NodeType)
+			{
+				case ExpressionType.New:
+					{
+						var expr = (NewExpression)newExpression;
+
+// ReSharper disable ConditionIsAlwaysTrueOrFalse
+// ReSharper disable HeuristicUnreachableCode
+						if (expr.Members == null)
+							throw new LinqException("Invalid expression {0}", expression);
+// ReSharper restore HeuristicUnreachableCode
+// ReSharper restore ConditionIsAlwaysTrueOrFalse
+
+						for (var i = 0; i < expr.Members.Count; i++)
+							if (me.Member == expr.Members[i])
+								return levelExpresion == expression ?
+									expr.Arguments[i].Unwrap() :
+									GetMemberExpression(expr.Arguments[i].Unwrap(), expression, level + 1);
+
+						throw new LinqException("Invalid expression {0}", expression);
+					}
+
+				case ExpressionType.MemberInit:
+					{
+						var expr = (MemberInitExpression)newExpression;
+
+						foreach (var binding in expr.Bindings.Cast<MemberAssignment>())
+						{
+							if (me.Member == binding.Member)
+								return levelExpresion == expression ?
+									binding.Expression.Unwrap() :
+									GetMemberExpression(binding.Expression.Unwrap(), expression, level + 1);
+						}
+
+						throw new LinqException("Invalid expression {0}", expression);
+					}
+			}
+
+			return expression;
+		}
+
+		Expression GetMemberExpression(MemberInfo member, bool add, Type type)
+		{
+			Expression memberExpression;
+
+			if (!Members.TryGetValue(member, out memberExpression))
+			{
+				foreach (var m in Members)
+				{
+					if (m.Key.Name == member.Name)
+					{
+						if (TypeHelper.Equals(m.Key, member, IsScalar ? null : Body.Type))
+							return m.Value;
+					}
+				}
+
+				if (add && TypeHelper.IsSameOrParent(member.DeclaringType, Body.Type))
+				{
+					memberExpression = Expression.Constant(
+						TypeHelper.GetDefaultValue(type), type);
+
+					Members.Add(member, memberExpression);
+				}
+				else
+					throw new InvalidOperationException();
+			}
+
+			return memberExpression;
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/SelectManyBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,246 @@
+using System;
+using System.Collections.Generic;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+	using Data.Sql;
+
+	class SelectManyBuilder : MethodCallBuilder
+	{
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			return
+				methodCall.IsQueryable("SelectMany") &&
+				methodCall.Arguments.Count == 3      &&
+				((LambdaExpression)methodCall.Arguments[1].Unwrap()).Parameters.Count == 1;
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			var sequence           = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
+			var collectionSelector = (LambdaExpression)methodCall.Arguments[1].Unwrap();
+			var resultSelector     = (LambdaExpression)methodCall.Arguments[2].Unwrap();
+
+			if (!sequence.SqlQuery.GroupBy.IsEmpty)
+			{
+				sequence = new SubQueryContext(sequence);
+			}
+
+			var context        = new SelectManyContext(buildInfo.Parent, collectionSelector, sequence);
+			var expr           = collectionSelector.Body.Unwrap();
+
+			var collectionInfo = new BuildInfo(context, expr, new SqlQuery());
+			var collection     = builder.BuildSequence(collectionInfo);
+			var leftJoin       = collection is DefaultIfEmptyBuilder.DefaultIfEmptyContext;
+			var sql            = collection.SqlQuery;
+
+			var sequenceTables = new HashSet<ISqlTableSource>(sequence.SqlQuery.From.Tables[0].GetTables());
+			var newQuery       = null != new QueryVisitor().Find(sql, e => e == collectionInfo.SqlQuery);
+			var crossApply     = null != new QueryVisitor().Find(sql, e =>
+				e.ElementType == QueryElementType.TableSource && sequenceTables.Contains((ISqlTableSource)e)  ||
+				e.ElementType == QueryElementType.SqlField    && sequenceTables.Contains(((SqlField)e).Table) ||
+				e.ElementType == QueryElementType.Column      && sequenceTables.Contains(((SqlQuery.Column)e).Parent));
+
+			if (collection is JoinBuilder.GroupJoinSubQueryContext)
+			{
+				var groupJoin = ((JoinBuilder.GroupJoinSubQueryContext)collection).GroupJoin;
+
+				groupJoin.SqlQuery.From.Tables[0].Joins[0].JoinType = SqlQuery.JoinType.Inner;
+				groupJoin.SqlQuery.From.Tables[0].Joins[0].IsWeak   = false;
+			}
+
+			if (!newQuery)
+			{
+				context.Collection = new SubQueryContext(collection, sequence.SqlQuery, false);
+				return new SelectContext(buildInfo.Parent, resultSelector, sequence, context);
+			}
+
+			if (!crossApply)
+			{
+				if (!leftJoin)
+				{
+					context.Collection = new SubQueryContext(collection, sequence.SqlQuery, true);
+					return new SelectContext(buildInfo.Parent, resultSelector, sequence, context);
+				}
+				else
+				{
+					var join = SqlQuery.OuterApply(sql);
+					sequence.SqlQuery.From.Tables[0].Joins.Add(join.JoinedTable);
+					context.Collection = new SubQueryContext(collection, sequence.SqlQuery, false);
+
+					return new SelectContext(buildInfo.Parent, resultSelector, sequence, context);
+				}
+			}
+
+			if (collection is TableBuilder.TableContext)
+			{
+				var table = (TableBuilder.TableContext)collection;
+				var join  = table.SqlTable.TableArguments != null && table.SqlTable.TableArguments.Length > 0 ?
+					(leftJoin ? SqlQuery.OuterApply(sql) : SqlQuery.CrossApply(sql)) :
+					(leftJoin ? SqlQuery.LeftJoin  (sql) : SqlQuery.InnerJoin (sql));
+
+				join.JoinedTable.Condition.Conditions.AddRange(sql.Where.SearchCondition.Conditions);
+				join.JoinedTable.CanConvertApply = false;
+
+				sql.Where.SearchCondition.Conditions.Clear();
+
+				var collectionParent = collection.Parent as TableBuilder.TableContext;
+
+				// Association.
+				//
+				if (collectionParent != null && collectionInfo.IsAssociationBuilt)
+				{
+					var ts = (SqlQuery.TableSource)new QueryVisitor().Find(sequence.SqlQuery.From, e =>
+					{
+						if (e.ElementType == QueryElementType.TableSource)
+						{
+							var t = (SqlQuery.TableSource)e;
+							return t.Source == collectionParent.SqlTable;
+						}
+
+						return false;
+					});
+
+					ts.Joins.Add(join.JoinedTable);
+				}
+				else
+				{
+					sequence.SqlQuery.From.Tables[0].Joins.Add(join.JoinedTable);
+				}
+
+				context.Collection = new SubQueryContext(collection, sequence.SqlQuery, false);
+				return new SelectContext(buildInfo.Parent, resultSelector, sequence, context);
+			}
+			else
+			{
+				var join = leftJoin ? SqlQuery.OuterApply(sql) : SqlQuery.CrossApply(sql);
+				sequence.SqlQuery.From.Tables[0].Joins.Add(join.JoinedTable);
+
+				context.Collection = new SubQueryContext(collection, sequence.SqlQuery, false);
+				return new SelectContext(buildInfo.Parent, resultSelector, sequence, context);
+			}
+		}
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			return null;
+		}
+
+		public class SelectManyContext : SelectContext
+		{
+			public SelectManyContext(IBuildContext parent, LambdaExpression lambda, IBuildContext sequence)
+				: base(parent, lambda, sequence)
+			{
+			}
+
+			private IBuildContext _collection;
+			public  IBuildContext  Collection
+			{
+				get { return _collection; }
+				set
+				{
+					_collection = value;
+					_collection.Parent = this;
+				}
+			}
+
+			public override Expression BuildExpression(Expression expression, int level)
+			{
+				if (expression == null)
+					return Collection.BuildExpression(expression, level);
+
+				var root = expression.GetRootObject();
+
+				if (root == Lambda.Parameters[0])
+					return base.BuildExpression(expression, level);
+
+				return Collection.BuildExpression(expression, level);
+			}
+
+			public override void BuildQuery<T>(Query<T> query, ParameterExpression queryParameter)
+			{
+				if (Collection == null)
+					base.BuildQuery(query, queryParameter);
+
+				throw new InvalidOperationException();
+			}
+
+			public override SqlInfo[] ConvertToIndex(Expression expression, int level, ConvertFlags flags)
+			{
+				if (Collection != null)
+				{
+					if (expression == null)
+						return Collection.ConvertToIndex(expression, level, flags);
+
+					var root = expression.GetRootObject();
+
+					if (root != Lambda.Parameters[0])
+						return Collection.ConvertToIndex(expression, level, flags);
+				}
+
+				return base.ConvertToIndex(expression, level, flags);
+			}
+
+			/*
+			public override int ConvertToParentIndex(int index, IBuildContext context)
+			{
+				if (Collection == null)
+					return base.ConvertToParentIndex(index, context);
+
+				throw new NotImplementedException();
+			}
+			*/
+
+			public override SqlInfo[] ConvertToSql(Expression expression, int level, ConvertFlags flags)
+			{
+				if (Collection != null)
+				{
+					if (expression == null)
+						return Collection.ConvertToSql(expression, level, flags);
+
+					var root = expression.GetRootObject();
+
+					if (root != Lambda.Parameters[0])
+						return Collection.ConvertToSql(expression, level, flags);
+				}
+
+				return base.ConvertToSql(expression, level, flags);
+			}
+
+			public override IBuildContext GetContext(Expression expression, int level, BuildInfo buildInfo)
+			{
+				if (Collection != null)
+				{
+					if (expression == null)
+						return Collection.GetContext(expression, level, buildInfo);
+
+					var root = expression.GetRootObject();
+
+					if (root != Lambda.Parameters[0])
+						return Collection.GetContext(expression, level, buildInfo);
+				}
+
+				return base.GetContext(expression, level, buildInfo);
+			}
+
+			public override IsExpressionResult IsExpression(Expression expression, int level, RequestFor requestFlag)
+			{
+				if (Collection != null)
+				{
+					if (expression == null)
+						return Collection.IsExpression(expression, level, requestFlag);
+
+					var root = expression.GetRootObject();
+
+					if (root != Lambda.Parameters[0])
+						return Collection.IsExpression(expression, level, requestFlag);
+				}
+
+				return base.IsExpression(expression, level, requestFlag);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/SequenceContextBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,73 @@
+using System;
+using System.Data;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using Data.Sql;
+
+	public abstract class SequenceContextBase : IBuildContext
+	{
+		protected SequenceContextBase(IBuildContext parent, IBuildContext sequence, LambdaExpression lambda)
+		{
+			Parent   = parent;
+			Sequence = sequence;
+			Builder  = sequence.Builder;
+			Lambda   = lambda;
+			SqlQuery = sequence.SqlQuery;
+
+			Sequence.Parent = this;
+
+			Builder.Contexts.Add(this);
+		}
+
+#if DEBUG
+		[CLSCompliant(false)]
+		public string _sqlQueryText { get { return SqlQuery == null ? "" : SqlQuery.SqlText; } }
+#endif
+
+		public IBuildContext     Parent   { get; set; }
+		public IBuildContext     Sequence { get; set; }
+		public ExpressionBuilder Builder  { get; set; }
+		public LambdaExpression  Lambda   { get; set; }
+		public SqlQuery          SqlQuery { get; set; }
+
+		Expression IBuildContext.Expression { get { return Lambda; } }
+
+		public virtual void BuildQuery<T>(Query<T> query, ParameterExpression queryParameter)
+		{
+			var expr   = BuildExpression(null, 0);
+			var mapper = Builder.BuildMapper<T>(expr);
+
+			query.SetQuery(mapper.Compile());
+		}
+
+		public abstract Expression         BuildExpression(Expression expression, int level);
+		public abstract SqlInfo[]          ConvertToSql   (Expression expression, int level, ConvertFlags flags);
+		public abstract SqlInfo[]          ConvertToIndex (Expression expression, int level, ConvertFlags flags);
+		public abstract IsExpressionResult IsExpression   (Expression expression, int level, RequestFor requestFlag);
+		public abstract IBuildContext      GetContext     (Expression expression, int level, BuildInfo buildInfo);
+
+		public virtual int ConvertToParentIndex(int index, IBuildContext context)
+		{
+			return Parent == null ? index : Parent.ConvertToParentIndex(index, context);
+		}
+
+		public virtual void SetAlias(string alias)
+		{
+		}
+
+		public virtual ISqlExpression GetSubQuery(IBuildContext context)
+		{
+			return null;
+		}
+
+		protected bool IsSubQuery()
+		{
+			for (var p = Parent; p != null; p = p.Parent)
+				if (p.IsExpression(null, 0, RequestFor.SubQuery).Result)
+					return true;
+			return false;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/SequenceConvertInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	public class SequenceConvertInfo
+	{
+		public ParameterExpression       Parameter;
+		public Expression                Expression;
+		public List<SequenceConvertPath> ExpressionsToReplace;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/SequenceConvertPath.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,16 @@
+using System;
+using System.Diagnostics;
+using System.Linq.Expressions;
+
+using JetBrains.Annotations;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	[DebuggerDisplay("Path = {Path}, Expr = {Expr}, Level = {Level}")]
+	public class SequenceConvertPath
+	{
+		[NotNull] public Expression Path;
+		[NotNull] public Expression Expr;
+		          public int        Level;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/SqlInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,61 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using Data.Sql;
+
+	public class SqlInfo
+	{
+		public ISqlExpression   Sql;
+		public SqlQuery         Query;
+		public int              Index   = -1;
+		public List<MemberInfo> Members = new List<MemberInfo>();
+
+		public SqlInfo()
+		{
+		}
+
+		public SqlInfo(MemberInfo mi)
+		{
+			Members.Add(mi);
+		}
+
+		public SqlInfo(IEnumerable<MemberInfo> mi)
+		{
+			Members.AddRange(mi);
+		}
+
+		public SqlInfo Clone()
+		{
+			return new SqlInfo(Members) { Sql = Sql, Query = Query, Index = Index };
+		}
+
+		public SqlInfo Clone(MemberInfo mi)
+		{
+			var info = Clone();
+			if (Members.Count == 0 || Members[0] != mi)
+				info.Members.Insert(0, mi);
+			else
+			{
+				
+			}
+			return info;
+		}
+
+		public bool CompareMembers(SqlInfo info)
+		{
+			return Members.Count == info.Members.Count && !Members.Where((t, i) => !TypeHelper.Equals(t, info.Members[i])).Any();
+		}
+
+		public bool CompareLastMember(SqlInfo info)
+		{
+			return
+				Members.Count > 0 && info.Members.Count > 0 &&
+				TypeHelper.Equals(Members[Members.Count - 1], info.Members[info.Members.Count - 1]);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/SubQueryContext.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,171 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+	using Data.Sql;
+
+	class SubQueryContext : PassThroughContext
+	{
+		public readonly IBuildContext SubQuery;
+
+		public SubQueryContext(IBuildContext subQuery, SqlQuery sqlQuery, bool addToSql)
+			: base(subQuery)
+		{
+			if (sqlQuery == subQuery.SqlQuery)
+				throw new ArgumentException("Wrong subQuery argument.", "subQuery");
+
+			SubQuery = subQuery;
+			SubQuery.Parent = this;
+
+			SqlQuery = sqlQuery;
+
+			if (addToSql)
+				sqlQuery.From.Table(SubQuery.SqlQuery);
+		}
+
+		public SubQueryContext(IBuildContext subQuery, bool addToSql)
+			: this(subQuery, new SqlQuery { ParentSql = subQuery.SqlQuery.ParentSql }, addToSql)
+		{
+		}
+
+		public SubQueryContext(IBuildContext subQuery)
+			: this(subQuery, true)
+		{
+		}
+
+		public override SqlQuery      SqlQuery { get; set; }
+		public override IBuildContext Parent   { get; set; }
+
+		public override void BuildQuery<T>(Query<T> query, ParameterExpression queryParameter)
+		{
+			if (Expression.NodeType == ExpressionType.Lambda)
+			{
+				var le = (LambdaExpression)Expression;
+
+				if (le.Parameters.Count == 1 && null != Expression.Find(
+					e => e.NodeType == ExpressionType.Call && ((MethodCallExpression)e).IsQueryable()))
+				{
+					if (le.Body.NodeType == ExpressionType.New)
+					{
+						var ne = (NewExpression)le.Body;
+						var p  = Expression.Parameter(ne.Type, "p");
+
+						var seq = new SelectContext(
+							Parent,
+							Expression.Lambda(
+								Expression.New(
+									ne.Constructor,
+									ne.Members.Select(m => Expression.MakeMemberAccess(p, m)).ToArray(),
+									ne.Members),
+								p),
+							this);
+
+						seq.BuildQuery(query, queryParameter);
+
+						return;
+					}
+
+					if (le.Body.NodeType == ExpressionType.MemberInit)
+					{
+						var mi = (MemberInitExpression)le.Body;
+
+						if (mi.NewExpression.Arguments.Count == 0 && mi.Bindings.All(b => b is MemberAssignment))
+						{
+							var p = Expression.Parameter(mi.Type, "p");
+
+							var seq = new SelectContext(
+								Parent,
+								Expression.Lambda(
+									Expression.MemberInit(
+										mi.NewExpression,
+										mi.Bindings
+											.OfType<MemberAssignment>()
+											.Select(ma => Expression.Bind(ma.Member, Expression.MakeMemberAccess(p, ma.Member)))
+											.ToArray()),
+									p),
+								this);
+
+							seq.BuildQuery(query, queryParameter);
+
+							return;
+						}
+					}
+				}
+			}
+
+			base.BuildQuery(query, queryParameter);
+		}
+
+		public override SqlInfo[] ConvertToSql(Expression expression, int level, ConvertFlags flags)
+		{
+			return SubQuery
+				.ConvertToIndex(expression, level, flags)
+				.Select(idx => new SqlInfo(idx.Members) { Sql = SubQuery.SqlQuery.Select.Columns[idx.Index] })
+				.ToArray();
+		}
+
+		// JoinContext has similar logic. Consider to review it.
+		//
+		public override SqlInfo[] ConvertToIndex(Expression expression, int level, ConvertFlags flags)
+		{
+			return ConvertToSql(expression, level, flags)
+				.Select(idx =>
+				{
+					idx.Query = SqlQuery;
+					idx.Index = GetIndex((SqlQuery.Column)idx.Sql);
+
+					return idx;
+				})
+				.ToArray();
+		}
+
+		public override IsExpressionResult IsExpression(Expression expression, int level, RequestFor testFlag)
+		{
+			switch (testFlag)
+			{
+				case RequestFor.SubQuery : return IsExpressionResult.True;
+			}
+
+			return base.IsExpression(expression, level, testFlag);
+		}
+
+		internal protected readonly Dictionary<ISqlExpression,int> ColumnIndexes = new Dictionary<ISqlExpression,int>();
+
+		protected virtual int GetIndex(SqlQuery.Column column)
+		{
+			int idx;
+
+			if (!ColumnIndexes.TryGetValue(column, out idx))
+			{
+				idx = SqlQuery.Select.Add(column);
+				ColumnIndexes.Add(column, idx);
+			}
+
+			return idx;
+		}
+
+		public override int ConvertToParentIndex(int index, IBuildContext context)
+		{
+			var idx = GetIndex(context.SqlQuery.Select.Columns[index]);
+			return Parent == null ? idx : Parent.ConvertToParentIndex(idx, this);
+		}
+
+		public override void SetAlias(string alias)
+		{
+			if (alias.Contains('<'))
+				return;
+
+			if (SqlQuery.From.Tables[0].Alias == null)
+				SqlQuery.From.Tables[0].Alias = alias;
+		}
+
+		public override ISqlExpression GetSubQuery(IBuildContext context)
+		{
+			return null;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/TableAttributeBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,38 @@
+using System;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+
+	class TableAttributeBuilder : MethodCallBuilder
+	{
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			return methodCall.IsQueryable("TableName", "DatabaseName", "OwnerName");
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
+
+			var table = (TableBuilder.TableContext)sequence;
+			var value = (string)((ConstantExpression)methodCall.Arguments[1]).Value;
+
+			switch (methodCall.Method.Name)
+			{
+				case "TableName"    : table.SqlTable.PhysicalName = value; break;
+				case "DatabaseName" : table.SqlTable.Database     = value; break;
+				case "OwnerName"    : table.SqlTable.Owner        = value; break;
+			}
+
+			return sequence;
+		}
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			return null;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/TableBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1278 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+	using Data.Sql;
+	using Mapping;
+	using Reflection;
+	using Reflection.Extension;
+
+	class TableBuilder : ISequenceBuilder
+	{
+		#region TableBuilder
+
+		int ISequenceBuilder.BuildCounter { get; set; }
+
+		static T Find<T>(ExpressionBuilder builder, BuildInfo buildInfo, Func<int,IBuildContext,T> action)
+		{
+			var expression = buildInfo.Expression;
+
+			switch (expression.NodeType)
+			{
+				case ExpressionType.Constant:
+					{
+						var c = (ConstantExpression)expression;
+						if (c.Value is IQueryable)
+							return action(1, null);
+
+						break;
+					}
+
+				case ExpressionType.Call:
+					{
+						var mc = (MethodCallExpression)expression;
+
+						if (mc.Method.Name == "GetTable")
+							if (expression.Type.IsGenericType && expression.Type.GetGenericTypeDefinition() == typeof(Table<>))
+								return action(2, null);
+
+						var attr = builder.GetTableFunctionAttribute(mc.Method);
+
+						if (attr != null)
+							return action(5, null);
+
+						break;
+					}
+
+				case ExpressionType.MemberAccess:
+
+					if (expression.Type.IsGenericType && expression.Type.GetGenericTypeDefinition() == typeof(Table<>))
+						return action(3, null);
+
+					// Looking for association.
+					//
+					if (buildInfo.IsSubQuery && buildInfo.SqlQuery.From.Tables.Count == 0)
+					{
+						var ctx = builder.GetContext(buildInfo.Parent, expression);
+						if (ctx != null)
+							return action(4, ctx);
+					}
+
+					break;
+
+				case ExpressionType.Parameter:
+					{
+						if (buildInfo.IsSubQuery && buildInfo.SqlQuery.From.Tables.Count == 0)
+						{
+							var ctx = builder.GetContext(buildInfo.Parent, expression);
+							if (ctx != null)
+								return action(4, ctx);
+						}
+
+						break;
+					}
+			}
+
+			return action(0, null);
+		}
+
+		public bool CanBuild(ExpressionBuilder builder, BuildInfo buildInfo)
+		{
+			return Find(builder, buildInfo, (n,_) => n > 0);
+		}
+
+		public IBuildContext BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo)
+		{
+			return Find(builder, buildInfo, (n,ctx) =>
+			{
+				switch (n)
+				{
+					case 0 : return null;
+					case 1 : return new TableContext(builder, buildInfo, ((IQueryable)((ConstantExpression)buildInfo.Expression).Value).ElementType);
+					case 2 :
+					case 3 : return new TableContext(builder, buildInfo, buildInfo.Expression.Type.GetGenericArguments()[0]);
+					case 4 : return ctx.GetContext(buildInfo.Expression, 0, buildInfo);
+					case 5 : return new TableContext(builder, buildInfo);
+				}
+
+				throw new InvalidOperationException();
+			});
+		}
+
+		public SequenceConvertInfo Convert(ExpressionBuilder builder, BuildInfo buildInfo, ParameterExpression param)
+		{
+			return null;
+		}
+
+		public bool IsSequence(ExpressionBuilder builder, BuildInfo buildInfo)
+		{
+			return true;
+		}
+
+		#endregion
+
+		#region TableContext
+
+		public class TableContext : IBuildContext
+		{
+			#region Properties
+
+#if DEBUG
+			public string _sqlQueryText { get { return SqlQuery == null ? "" : SqlQuery.SqlText; } }
+#endif
+
+			public ExpressionBuilder Builder    { get; private set; }
+			public Expression        Expression { get; private set; }
+			public SqlQuery          SqlQuery   { get; set; }
+
+			public virtual IBuildContext Parent { get; set; }
+
+			public Type         OriginalType;
+			public Type         ObjectType;
+			public ObjectMapper ObjectMapper;
+			public SqlTable     SqlTable;
+
+			#endregion
+
+			#region Init
+
+			public TableContext(ExpressionBuilder builder, BuildInfo buildInfo, Type originalType)
+			{
+				Builder      = builder;
+				Parent       = buildInfo.Parent;
+				Expression   = buildInfo.Expression;
+				SqlQuery     = buildInfo.SqlQuery;
+
+				OriginalType = originalType;
+				ObjectType   = GetObjectType();
+				SqlTable     = new SqlTable(builder.MappingSchema, ObjectType);
+				ObjectMapper = Builder.MappingSchema.GetObjectMapper(ObjectType);
+
+				SqlQuery.From.Table(SqlTable);
+
+				Init();
+			}
+
+			protected TableContext(ExpressionBuilder builder, SqlQuery sqlQuery)
+			{
+				Builder  = builder;
+				SqlQuery = sqlQuery;
+			}
+
+			public TableContext(ExpressionBuilder builder, BuildInfo buildInfo)
+			{
+				Builder    = builder;
+				Parent     = buildInfo.Parent;
+				Expression = buildInfo.Expression;
+				SqlQuery   = buildInfo.SqlQuery;
+
+				var mc   = (MethodCallExpression)Expression;
+				var attr = builder.GetTableFunctionAttribute(mc.Method);
+
+				if (!mc.Method.ReturnType.IsGenericType || mc.Method.ReturnType.GetGenericTypeDefinition() != typeof(Table<>))
+					throw new LinqException("Table function has to return Table<T>.");
+
+				OriginalType = mc.Method.ReturnType.GetGenericArguments()[0];
+				ObjectType   = GetObjectType();
+				SqlTable     = new SqlTable(builder.MappingSchema, ObjectType);
+				ObjectMapper = Builder.MappingSchema.GetObjectMapper(ObjectType);
+
+				SqlQuery.From.Table(SqlTable);
+
+				var args = mc.Arguments.Select(a => builder.ConvertToSql(this, a, false));
+
+				attr.SetTable(SqlTable, mc.Method, mc.Arguments, args);
+
+				Init();
+			}
+
+			protected Type GetObjectType()
+			{
+				for (var type = OriginalType.BaseType; type != null && type != typeof(object); type = type.BaseType)
+				{
+					var extension = TypeExtension.GetTypeExtension(type, Builder.MappingSchema.Extensions);
+					var mapping   = Builder.MappingSchema.MetadataProvider.GetInheritanceMapping(type, extension);
+
+					if (mapping.Length > 0)
+						return type;
+				}
+
+				return OriginalType;
+			}
+
+			public List<InheritanceMappingAttribute> InheritanceMapping;
+			public List<string>                      InheritanceDiscriminators;
+
+			protected void Init()
+			{
+				Builder.Contexts.Add(this);
+
+				InheritanceMapping = ObjectMapper.InheritanceMapping;
+
+				if (InheritanceMapping.Count > 0)
+					InheritanceDiscriminators = GetInheritanceDiscriminators(Builder, SqlTable, ObjectType, InheritanceMapping);
+
+				// Original table is a parent.
+				//
+				if (ObjectType != OriginalType)
+				{
+					var predicate = Builder.MakeIsPredicate(this, OriginalType);
+
+					if (predicate.GetType() != typeof(SqlQuery.Predicate.Expr))
+						SqlQuery.Where.SearchCondition.Conditions.Add(new SqlQuery.Condition(false, predicate));
+				}
+			}
+
+			internal static List<string> GetInheritanceDiscriminators(
+				ExpressionBuilder                 builder,
+				SqlTable                          sqlTable,
+				Type                              objectType,
+				List<InheritanceMappingAttribute> inheritanceMapping)
+			{
+				var inheritanceDiscriminators = new List<string>(inheritanceMapping.Count);
+
+				foreach (var mapping in inheritanceMapping)
+				{
+					string discriminator = null;
+
+					foreach (MemberMapper mm in builder.MappingSchema.GetObjectMapper(mapping.Type))
+					{
+						if (mm.MapMemberInfo.SqlIgnore == false && !sqlTable.Fields.Any(f => f.Value.Name == mm.MemberName))
+						{
+							var field = new SqlField(mm.Type, mm.MemberName, mm.Name, mm.MapMemberInfo.Nullable, int.MinValue, null, mm);
+							sqlTable.Fields.Add(field);
+						}
+
+						if (mm.MapMemberInfo.IsInheritanceDiscriminator)
+							discriminator = mm.MapMemberInfo.MemberName;
+					}
+
+					inheritanceDiscriminators.Add(discriminator);
+				}
+
+				var dname = inheritanceDiscriminators.FirstOrDefault(s => s != null);
+
+				if (dname == null)
+					throw new LinqException("Inheritance Discriminator is not defined for the '{0}' hierarchy.", objectType);
+
+				for (var i = 0; i < inheritanceDiscriminators.Count; i++)
+					if (inheritanceDiscriminators[i] == null)
+						inheritanceDiscriminators[i] = dname;
+
+				return inheritanceDiscriminators;
+			}
+
+			#endregion
+
+			#region BuildQuery
+
+			class MappingData
+			{
+				public MappingSchema  MappingSchema;
+				public ObjectMapper   ObjectMapper;
+				public int[]          Index;
+				public IValueMapper[] ValueMappers;
+			}
+
+			static object MapDataReaderToObject1(IDataReader dataReader, MappingData data)
+			{
+				var source     = data.MappingSchema.CreateDataReaderMapper(dataReader);
+				var destObject = data.ObjectMapper.CreateInstance();
+
+				if (data.ValueMappers == null)
+				{
+					var mappers = new IValueMapper[data.Index.Length];
+
+					for (var i = 0; i < data.Index.Length; i++)
+					{
+						var n = data.Index[i];
+
+						if (n < 0)
+							continue;
+
+						if (!data.ObjectMapper.SupportsTypedValues(i))
+						{
+							mappers[i] = data.MappingSchema.DefaultValueMapper;
+							continue;
+						}
+
+						var sourceType = source.           GetFieldType(n) ?? typeof(object);
+						var destType   = data.ObjectMapper.GetFieldType(i) ?? typeof(object);
+
+						IValueMapper t;
+
+						if (sourceType == destType)
+						{
+							lock (data.MappingSchema.SameTypeMappers)
+								if (!data.MappingSchema.SameTypeMappers.TryGetValue(sourceType, out t))
+									data.MappingSchema.SameTypeMappers.Add(sourceType, t = data.MappingSchema.GetValueMapper(sourceType, destType));
+						}
+						else
+						{
+							var key = new KeyValuePair<Type,Type>(sourceType, destType);
+
+							lock (data.MappingSchema.DifferentTypeMappers)
+								if (!data.MappingSchema.DifferentTypeMappers.TryGetValue(key, out t))
+									data.MappingSchema.DifferentTypeMappers.Add(key, t = data.MappingSchema.GetValueMapper(sourceType, destType));
+						}
+
+						mappers[i] = t;
+					}
+
+					data.ValueMappers = mappers;
+				}
+
+				var dest = data.ObjectMapper;
+				var idx  = data.Index;
+				var ms   = data.ValueMappers;
+
+				for (var i = 0; i < idx.Length; i++)
+				{
+					var n = idx[i];
+
+					if (n >= 0)
+						ms[i].Map(source, dataReader, n, dest, destObject, i);
+				}
+
+				return destObject;
+			}
+
+			static object MapDataReaderToObject2(IDataReader dataReader, MappingData data)
+			{
+				var source = data.MappingSchema.CreateDataReaderMapper(dataReader);
+
+				var initContext = new InitContext
+				{
+					MappingSchema = data.MappingSchema,
+					DataSource    = source,
+					SourceObject  = dataReader,
+					ObjectMapper  = data.ObjectMapper
+				};
+
+				var destObject = data.ObjectMapper.CreateInstance(initContext);
+
+				if (initContext.StopMapping)
+					return destObject;
+
+				var smDest = destObject as ISupportMapping;
+
+				if (smDest != null)
+				{
+					smDest.BeginMapping(initContext);
+
+					if (initContext.StopMapping)
+						return destObject;
+				}
+
+				if (data.ValueMappers == null)
+				{
+					var mappers = new IValueMapper[data.Index.Length];
+
+					for (var i = 0; i < data.Index.Length; i++)
+					{
+						var n = data.Index[i];
+
+						if (n < 0)
+							continue;
+
+						if (!data.ObjectMapper.SupportsTypedValues(i))
+						{
+							mappers[i] = data.MappingSchema.DefaultValueMapper;
+							continue;
+						}
+
+						var sourceType = source.           GetFieldType(n) ?? typeof(object);
+						var destType   = data.ObjectMapper.GetFieldType(i) ?? typeof(object);
+
+						IValueMapper t;
+
+						if (sourceType == destType)
+						{
+							lock (data.MappingSchema.SameTypeMappers)
+								if (!data.MappingSchema.SameTypeMappers.TryGetValue(sourceType, out t))
+									data.MappingSchema.SameTypeMappers.Add(sourceType, t = data.MappingSchema.GetValueMapper(sourceType, destType));
+						}
+						else
+						{
+							var key = new KeyValuePair<Type,Type>(sourceType, destType);
+
+							lock (data.MappingSchema.DifferentTypeMappers)
+								if (!data.MappingSchema.DifferentTypeMappers.TryGetValue(key, out t))
+									data.MappingSchema.DifferentTypeMappers.Add(key, t = data.MappingSchema.GetValueMapper(sourceType, destType));
+						}
+
+						mappers[i] = t;
+					}
+
+					data.ValueMappers = mappers;
+				}
+
+				var dest = data.ObjectMapper;
+				var idx  = data.Index;
+				var ms   = data.ValueMappers;
+
+				for (var i = 0; i < idx.Length; i++)
+				{
+					var n = idx[i];
+
+					if (n >= 0)
+						ms[i].Map(source, dataReader, n, dest, destObject, i);
+				}
+
+				if (smDest != null)
+					smDest.EndMapping(initContext);
+
+				return destObject;
+			}
+
+			static object DefaultInheritanceMappingException(object value, Type type)
+			{
+				throw new LinqException("Inheritance mapping is not defined for discriminator value '{0}' in the '{1}' hierarchy.", value, type);
+			}
+
+			static readonly MethodInfo _mapperMethod1 = ReflectionHelper.Expressor<object>.MethodExpressor(_ => MapDataReaderToObject1(null, null));
+			static readonly MethodInfo _mapperMethod2 = ReflectionHelper.Expressor<object>.MethodExpressor(_ => MapDataReaderToObject2(null, null));
+
+#if FW4 || SILVERLIGHT
+			ParameterExpression _variable;
+			static int _varIndex;
+#endif
+
+			Expression BuildTableExpression(bool buildBlock, Type objectType, int[] index)
+			{
+#if FW4 || SILVERLIGHT
+				if (buildBlock && _variable != null)
+					return _variable;
+#endif
+
+				var data = new MappingData
+				{
+					MappingSchema = Builder.MappingSchema,
+					ObjectMapper  = Builder.MappingSchema.GetObjectMapper(objectType),
+					Index         = index
+				};
+
+				Expression expr;
+
+				if (Builder.DataContextInfo.DataContext == null ||
+					TypeHelper.IsSameOrParent(typeof(ISupportMapping), objectType) ||
+					TypeHelper.GetFirstAttribute(objectType, typeof(ObjectFactoryAttribute)) != null)
+				{
+					expr = Expression.Convert(
+						Expression.Call(null, _mapperMethod2,
+							ExpressionBuilder.DataReaderParam,
+							Expression.Constant(data)),
+						objectType);
+				}
+				else
+				{
+					expr = Expression.Convert(
+						Expression.Call(null, _mapperMethod1,
+							ExpressionBuilder.DataReaderParam,
+							Expression.Constant(data)),
+						objectType);
+				}
+
+				expr = ProcessExpression(expr);
+
+#if FW4 || SILVERLIGHT
+
+				if (!buildBlock)
+					return expr;
+
+				Builder.BlockVariables.  Add(_variable = Expression.Variable(expr.Type, expr.Type.Name + _varIndex++));
+				Builder.BlockExpressions.Add(Expression.Assign(_variable, expr));
+
+				return _variable;
+
+#else
+				return expr;
+#endif
+			}
+
+			protected virtual Expression ProcessExpression(Expression expression)
+			{
+				return expression;
+			}
+
+			int[] BuildIndex(int[] index, Type objectType)
+			{
+				var names = new Dictionary<string,int>();
+				var n     = 0;
+
+				foreach (MemberMapper mm in Builder.MappingSchema.GetObjectMapper(objectType))
+					if (mm.MapMemberInfo.SqlIgnore == false)
+						names.Add(mm.MemberName, n++);
+
+				var q =
+					from r in SqlTable.Fields.Values.Select((f,i) => new { f, i })
+					where names.ContainsKey(r.f.Name)
+					orderby names[r.f.Name]
+					select index[r.i];
+
+				return q.ToArray();
+			}
+
+			Expression BuildQuery(Type tableType)
+			{
+				SqlInfo[] info;
+
+				if (ObjectType == tableType)
+				{
+					info = ConvertToIndex(null, 0, ConvertFlags.All);
+				}
+				else
+				{
+					info = ConvertToSql(null, 0, ConvertFlags.All);
+
+					var table = new SqlTable(Builder.MappingSchema, tableType);
+					var q     =
+						from fld1 in table.Fields.Values.Select((f,i) => new { f, i })
+						join fld2 in info on fld1.f.Name equals ((SqlField)fld2.Sql).Name
+						orderby fld1.i
+						select GetIndex(fld2);
+
+					info = q.ToArray();
+				}
+
+				var index = info.Select(idx => ConvertToParentIndex(idx.Index, null)).ToArray();
+
+				if (ObjectType != tableType || InheritanceMapping.Count == 0)
+					return BuildTableExpression(!Builder.IsBlockDisable, tableType, index);
+
+				Expression expr;
+
+				var defaultMapping = InheritanceMapping.SingleOrDefault(m => m.IsDefault);
+
+				if (defaultMapping != null)
+				{
+					expr = Expression.Convert(
+						BuildTableExpression(false, defaultMapping.Type, BuildIndex(index, defaultMapping.Type)),
+						ObjectType);
+				}
+				else
+				{
+					var exceptionMethod = ReflectionHelper.Expressor<object>.MethodExpressor(_ => DefaultInheritanceMappingException(null, null));
+					var dindex          =
+						(
+							from f in SqlTable.Fields.Values
+							where f.Name == InheritanceDiscriminators[0]
+							select ConvertToParentIndex(_indexes[f].Index, null)
+						).First();
+
+					expr = Expression.Convert(
+						Expression.Call(null, exceptionMethod,
+							Expression.Call(
+								ExpressionBuilder.DataReaderParam,
+								ReflectionHelper.DataReader.GetValue,
+								Expression.Constant(dindex)),
+							Expression.Constant(ObjectType)),
+						ObjectType);
+				}
+
+				foreach (var mapping in InheritanceMapping.Select((m,i) => new { m, i }).Where(m => m.m != defaultMapping))
+				{
+					var dindex =
+						(
+							from f in SqlTable.Fields.Values
+							where f.Name == InheritanceDiscriminators[mapping.i]
+							select ConvertToParentIndex(_indexes[f].Index, null)
+						).First();
+
+					Expression testExpr;
+
+					if (mapping.m.Code == null)
+					{
+						testExpr = Expression.Call(
+							ExpressionBuilder.DataReaderParam,
+							ReflectionHelper.DataReader.IsDBNull,
+							Expression.Constant(dindex));
+					}
+					else
+					{
+						var codeType = mapping.m.Code.GetType();
+
+						testExpr = Expression.Equal(
+							Expression.Constant(mapping.m.Code),
+							Builder.BuildSql(codeType, dindex));
+					}
+
+					expr = Expression.Condition(
+						testExpr,
+						Expression.Convert(BuildTableExpression(false, mapping.m.Type, BuildIndex(index, mapping.m.Type)), ObjectType),
+						expr);
+				}
+
+				return expr;
+			}
+
+			public void BuildQuery<T>(Query<T> query, ParameterExpression queryParameter)
+			{
+				var expr   = BuildQuery(typeof(T));
+				var mapper = Builder.BuildMapper<T>(expr);
+
+				query.SetQuery(mapper.Compile());
+			}
+
+			#endregion
+
+			#region BuildExpression
+
+			public Expression BuildExpression(Expression expression, int level)
+			{
+				// Build table.
+				//
+				var table = FindTable(expression, level, false);
+
+				if (table == null)
+				{
+					if (expression is MemberExpression)
+					{
+						var memberExpression = (MemberExpression)expression;
+
+						if (ObjectMapper != null &&
+							ObjectMapper.TypeAccessor.OriginalType == memberExpression.Member.DeclaringType)
+						{
+							throw new LinqException("Member '{0}.{1}' is not a table column.",
+								memberExpression.Member.Name, memberExpression.Member.Name);
+						}
+					}
+
+					throw new InvalidOperationException();
+				}
+
+				if (table.Field == null)
+					return table.Table.BuildQuery(table.Table.OriginalType);
+
+				// Build field.
+				//
+				var info = ConvertToIndex(expression, level, ConvertFlags.Field).Single();
+				var idx  = ConvertToParentIndex(info.Index, null);
+
+				if (expression is MemberExpression)
+				{
+					var me = (MemberExpression)expression;
+					var memberAccessor = TypeAccessor.GetAccessor(me.Member.DeclaringType)[me.Member.Name];
+					return Builder.BuildSql(memberAccessor, idx);
+				}
+				else
+				{
+					return Builder.BuildSql(expression.Type, idx);
+				}
+			}
+
+			#endregion
+
+			#region ConvertToSql
+
+			public SqlInfo[] ConvertToSql(Expression expression, int level, ConvertFlags flags)
+			{
+				switch (flags)
+				{
+					case ConvertFlags.All   :
+						{
+							var table = FindTable(expression, level, false);
+
+							if (table.Field == null)
+								return table.Table.SqlTable.Fields.Values
+									.Select(_ => new SqlInfo(_.MemberMapper.MemberAccessor.MemberInfo) { Sql = _ })
+									.ToArray();
+
+							break;
+						}
+
+					case ConvertFlags.Key   :
+						{
+							var table = FindTable(expression, level, false);
+
+							if (table.Field == null)
+							{
+								var q =
+									from f in table.Table.SqlTable.Fields.Values
+									where f.IsPrimaryKey
+									orderby f.PrimaryKeyOrder
+									select new SqlInfo(f.MemberMapper.MemberAccessor.MemberInfo) { Sql = f };
+
+								var key = q.ToArray();
+
+								return key.Length != 0 ? key : ConvertToSql(expression, level, ConvertFlags.All);
+							}
+
+							break;
+						}
+
+					case ConvertFlags.Field :
+						{
+							var table = FindTable(expression, level, true);
+
+							if (table.Field != null)
+								return new[]
+								{
+									new SqlInfo(table.Field.MemberMapper.MemberAccessor.MemberInfo) { Sql = table.Field }
+								};
+
+							break;
+						}
+				}
+
+				throw new InvalidOperationException();
+			}
+
+			#endregion
+
+			#region ConvertToIndex
+
+			readonly Dictionary<ISqlExpression,SqlInfo> _indexes = new Dictionary<ISqlExpression,SqlInfo>();
+
+			protected SqlInfo GetIndex(SqlInfo expr)
+			{
+				SqlInfo n;
+
+				if (_indexes.TryGetValue(expr.Sql, out n))
+					return n;
+
+				if (expr.Sql is SqlField)
+				{
+					var field = (SqlField)expr.Sql;
+					expr.Index = SqlQuery.Select.Add(field, field.Alias);
+				}
+				else
+				{
+					expr.Index = SqlQuery.Select.Add(expr.Sql);
+				}
+
+				expr.Query = SqlQuery;
+
+				_indexes.Add(expr.Sql, expr);
+
+				return expr;
+			}
+
+			public SqlInfo[] ConvertToIndex(Expression expression, int level, ConvertFlags flags)
+			{
+				switch (flags)
+				{
+					case ConvertFlags.Field :
+					case ConvertFlags.Key   :
+					case ConvertFlags.All   :
+
+						var info = ConvertToSql(expression, level, flags);
+
+						for (var i = 0; i < info.Length; i++)
+							info[i] = GetIndex(info[i]);
+
+						return info;
+				}
+
+				throw new InvalidOperationException();
+			}
+
+			#endregion
+
+			#region IsExpression
+
+			public IsExpressionResult IsExpression(Expression expression, int level, RequestFor requestFor)
+			{
+				switch (requestFor)
+				{
+					case RequestFor.Field      :
+						{
+							var table = FindTable(expression, level, false);
+							return new IsExpressionResult(table != null && table.Field != null);
+						}
+
+					case RequestFor.Table       :
+					case RequestFor.Object      :
+						{
+							var table   = FindTable(expression, level, false);
+							var isTable =
+								table       != null &&
+								table.Field == null &&
+								(expression == null || expression.GetLevelExpression(table.Level) == expression);
+
+							return new IsExpressionResult(isTable, isTable ? table.Table : null);
+						}
+
+					case RequestFor.Expression :
+						{
+							if (expression == null)
+								return IsExpressionResult.False;
+
+							var levelExpression = expression.GetLevelExpression(level);
+
+							switch (levelExpression.NodeType)
+							{
+								case ExpressionType.MemberAccess :
+								case ExpressionType.Parameter    :
+								case ExpressionType.Call         :
+
+									var table = FindTable(expression, level, false);
+									return new IsExpressionResult(table == null);
+							}
+
+							return IsExpressionResult.True;
+						}
+
+					case RequestFor.Association      :
+						{
+							if (ObjectMapper.Associations.Count > 0)
+							{
+								var table = FindTable(expression, level, false);
+								var isat  =
+									table       != null &&
+									table.Table is AssociatedTableContext &&
+									table.Field == null &&
+									(expression == null || expression.GetLevelExpression(table.Level) == expression);
+
+								return new IsExpressionResult(isat, isat ? table.Table : null);
+							}
+
+							return IsExpressionResult.False;
+						}
+				}
+
+				return IsExpressionResult.False;
+			}
+
+			#endregion
+
+			#region GetContext
+
+			interface IAssociationHelper
+			{
+				Expression GetExpression(Expression parent, AssociatedTableContext association);
+			}
+
+			class AssociationHelper<T> : IAssociationHelper
+				where T : class
+			{
+				public Expression GetExpression(Expression parent, AssociatedTableContext association)
+				{
+					Expression expr  = null;
+					var        param = Expression.Parameter(typeof(T), "c");
+
+					foreach (var cond in (association).ParentAssociationJoin.Condition.Conditions)
+					{
+						var p  = (SqlQuery.Predicate.ExprExpr)cond.Predicate;
+						var e1 = Expression.MakeMemberAccess(parent, ((SqlField)p.Expr1).MemberMapper.MemberAccessor.MemberInfo);
+						var e2 = Expression.MakeMemberAccess(param,  ((SqlField)p.Expr2).MemberMapper.MemberAccessor.MemberInfo) as Expression;
+
+						while (e1.Type != e2.Type)
+						{
+							if (TypeHelper.IsNullableType(e1.Type))
+							{
+								e1 = Expression.PropertyOrField(e1, "Value");
+								continue;
+							}
+
+							if (TypeHelper.IsNullableType(e2.Type))
+							{
+								e2 = Expression.PropertyOrField(e2, "Value");
+								continue;
+							}
+
+							e2 = Expression.Convert(e2, e1.Type);
+						}
+
+						var ex = Expression.Equal(e1, e2);
+							
+						expr = expr == null ? ex : Expression.AndAlso(expr, ex);
+					}
+
+					var predicate = Expression.Lambda<Func<T,bool>>(expr, param);
+
+					return association.Builder.DataContextInfo.DataContext.GetTable<T>().Where(predicate).Expression;
+				}
+			}
+
+			public IBuildContext GetContext(Expression expression, int level, BuildInfo buildInfo)
+			{
+				if (expression == null)
+				{
+					if (buildInfo != null && buildInfo.IsSubQuery)
+					{
+						var table = new TableContext(
+							Builder,
+							new BuildInfo(Parent is SelectManyBuilder.SelectManyContext ? this : Parent, Expression, buildInfo.SqlQuery),
+							SqlTable.ObjectType);
+
+						return table;
+					}
+
+					return this;
+				}
+
+				if (ObjectMapper.Associations.Count > 0)
+				{
+					var levelExpression = expression.GetLevelExpression(level);
+
+					if (buildInfo != null && buildInfo.IsSubQuery)
+					{
+						if (levelExpression == expression && expression.NodeType == ExpressionType.MemberAccess)
+						{
+							var tableLevel  = GetAssociation(expression, level);
+							var association = (AssociatedTableContext)tableLevel.Table;
+
+							if (association.IsList)
+							{
+								var ma     = (MemberExpression)buildInfo.Expression;
+								var atype  = typeof(AssociationHelper<>).MakeGenericType(association.ObjectType);
+								var helper = (IAssociationHelper)Activator.CreateInstance(atype);
+								var expr   = helper.GetExpression(ma.Expression, association);
+
+								buildInfo.IsAssociationBuilt = true;
+
+								if (tableLevel.IsNew || buildInfo.CopyTable)
+									association.ParentAssociationJoin.IsWeak = true;
+
+								return Builder.BuildSequence(new BuildInfo(buildInfo, expr));
+							}
+						}
+						else
+						{
+							var association = GetAssociation(levelExpression, level);
+							var paj         = ((AssociatedTableContext)association.Table).ParentAssociationJoin;
+
+							paj.IsWeak = paj.IsWeak && buildInfo.CopyTable;
+
+							return association.Table.GetContext(expression, level + 1, buildInfo);
+						}
+					}
+				}
+
+				throw new InvalidOperationException();
+			}
+
+			#endregion
+
+			#region ConvertToParentIndex
+
+			public int ConvertToParentIndex(int index, IBuildContext context)
+			{
+				return Parent == null ? index : Parent.ConvertToParentIndex(index, this);
+			}
+
+			#endregion
+
+			#region SetAlias
+
+			public void SetAlias(string alias)
+			{
+				if (alias.Contains('<'))
+					return;
+
+				if (SqlTable.Alias == null)
+					SqlTable.Alias = alias;
+			}
+
+			#endregion
+
+			#region GetSubQuery
+
+			public ISqlExpression GetSubQuery(IBuildContext context)
+			{
+				return null;
+			}
+
+			#endregion
+
+			#region Helpers
+
+			SqlField GetField(Expression expression, int level, bool throwException)
+			{
+				if (expression.NodeType == ExpressionType.MemberAccess)
+				{
+					var memberExpression = (MemberExpression)expression;
+					var levelExpression  = expression.GetLevelExpression(level);
+
+					if (levelExpression.NodeType == ExpressionType.MemberAccess)
+					{
+						if (levelExpression != expression)
+						{
+							var levelMember = (MemberExpression)levelExpression;
+
+							if (TypeHelper.IsNullableValueMember(memberExpression.Member) && memberExpression.Expression == levelExpression)
+								memberExpression = levelMember;
+							else
+							{
+								var sameType =
+									levelMember.Member.ReflectedType == SqlTable.ObjectType ||
+									levelMember.Member.DeclaringType == SqlTable.ObjectType;
+
+								if (!sameType)
+								{
+									var mi = SqlTable.ObjectType.GetMember(levelMember.Member.Name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
+									sameType = mi.Any(_ => _.DeclaringType == levelMember.Member.DeclaringType);
+								}
+
+								if (sameType || InheritanceMapping.Count > 0)
+								{
+									foreach (var field in SqlTable.Fields.Values)
+									{
+										if (field.MemberMapper is MemberMapper.ComplexMapper)
+										{
+											var name = levelMember.Member.Name;
+
+											for (var ex = (MemberExpression)expression; ex != levelMember; ex = (MemberExpression)ex.Expression)
+												name += "." + ex.Member.Name;
+
+											if (field.MemberMapper.MemberName == name)
+												return field;
+										}
+									}
+								}
+							}
+						}
+
+						if (levelExpression == memberExpression)
+						{
+							foreach (var field in SqlTable.Fields.Values)
+							{
+								if (TypeHelper.Equals(field.MemberMapper.MapMemberInfo.MemberAccessor.MemberInfo, memberExpression.Member, SqlTable.ObjectType))
+								{
+									if (field.MemberMapper is MemberMapper.ComplexMapper &&
+										field.MemberMapper.MemberName.IndexOf('.') > 0)
+									{
+										var name = memberExpression.Member.Name;
+										var me   = memberExpression;
+
+										if (!(me.Expression is MemberExpression))
+											return null;
+
+										while (me.Expression is MemberExpression)
+										{
+											me   = (MemberExpression)me.Expression;
+											name = me.Member.Name + '.' + name;
+										}
+
+										return SqlTable.Fields.Values.FirstOrDefault(f => f.MemberMapper.MemberName == name);
+									}
+
+									return field;
+								}
+
+								if (InheritanceMapping.Count > 0 && field.Name == memberExpression.Member.Name)
+									foreach (var mapping in InheritanceMapping)
+										foreach (MemberMapper mm in Builder.MappingSchema.GetObjectMapper(mapping.Type))
+											if (TypeHelper.Equals(mm.MapMemberInfo.MemberAccessor.MemberInfo, memberExpression.Member))
+												return field;
+							}
+
+							if (throwException &&
+								ObjectMapper != null &&
+								ObjectMapper.TypeAccessor.OriginalType == memberExpression.Member.DeclaringType)
+							{
+								throw new LinqException("Member '{0}.{1}' is not a table column.",
+									memberExpression.Member.DeclaringType.Name, memberExpression.Member.Name);
+							}
+						}
+					}
+				}
+
+				return null;
+			}
+
+			[JetBrains.Annotations.NotNull]
+			readonly Dictionary<MemberInfo,AssociatedTableContext> _associations =
+				new Dictionary<MemberInfo,AssociatedTableContext>(new MemberInfoComparer());
+
+			class TableLevel
+			{
+				public TableContext Table;
+				public SqlField     Field;
+				public int          Level;
+				public bool         IsNew;
+			}
+
+			TableLevel FindTable(Expression expression, int level, bool throwException)
+			{
+				if (expression == null)
+					return new TableLevel { Table = this };
+
+				var levelExpression = expression.GetLevelExpression(level);
+
+				switch (levelExpression.NodeType)
+				{
+					case ExpressionType.MemberAccess :
+					case ExpressionType.Parameter    :
+						{
+							var field = GetField(expression, level, throwException);
+
+							if (field != null || (level == 0 && levelExpression == expression))
+								return new TableLevel { Table = this, Field = field, Level = level };
+
+							return GetAssociation(expression, level);
+						}
+				}
+
+				return null;
+			}
+
+			TableLevel GetAssociation(Expression expression, int level)
+			{
+				var objectMapper    = ObjectMapper;
+				var levelExpression = expression.GetLevelExpression(level);
+				var inheritance     =
+					(
+						from m in InheritanceMapping
+						let om = Builder.MappingSchema.GetObjectMapper(m.Type)
+						where om.Associations.Count > 0
+						select om
+					).ToList();
+
+				if (objectMapper.Associations.Count > 0 || inheritance.Count > 0)
+				{
+					if (levelExpression.NodeType == ExpressionType.MemberAccess)
+					{
+						var memberExpression = (MemberExpression)levelExpression;
+						var isNew = false;
+
+						AssociatedTableContext tableAssociation;
+
+						if (!_associations.TryGetValue(memberExpression.Member, out tableAssociation))
+						{
+							var q =
+								from a in objectMapper.Associations.Concat(inheritance.SelectMany(om => om.Associations))
+								where TypeHelper.Equals(a.MemberAccessor.MemberInfo, memberExpression.Member)
+								select new AssociatedTableContext(Builder, this, a) { Parent = Parent };
+
+							tableAssociation = q.FirstOrDefault();
+
+							isNew = true;
+
+							_associations.Add(memberExpression.Member, tableAssociation);
+						}
+
+						if (tableAssociation != null)
+						{
+							if (levelExpression == expression)
+								return new TableLevel { Table = tableAssociation, Level = level, IsNew = isNew };
+
+							var al = tableAssociation.GetAssociation(expression, level + 1);
+
+							if (al != null)
+								return al;
+
+							var field = tableAssociation.GetField(expression, level + 1, false);
+
+							return new TableLevel { Table = tableAssociation, Field = field, Level = field == null ? level : level + 1, IsNew = isNew };
+						}
+					}
+				}
+
+				return null;
+			}
+
+			#endregion
+		}
+
+		#endregion
+
+		#region AssociatedTableContext
+
+		public class AssociatedTableContext : TableContext
+		{
+			public readonly TableContext          ParentAssociation;
+			public readonly SqlQuery.JoinedTable  ParentAssociationJoin;
+			public readonly Association           Association;
+			public readonly bool                  IsList;
+
+			public override IBuildContext Parent
+			{
+				get { return ParentAssociation.Parent; }
+				set { }
+			}
+
+			public AssociatedTableContext(ExpressionBuilder builder, TableContext parent, Association association)
+				: base(builder, parent.SqlQuery)
+			{
+				var type = TypeHelper.GetMemberType(association.MemberAccessor.MemberInfo);
+				var left = association.CanBeNull;
+
+				if (TypeHelper.IsSameOrParent(typeof(IEnumerable), type))
+				{
+					var etypes = TypeHelper.GetGenericArguments(type, typeof(IEnumerable));
+					type       = etypes != null && etypes.Length > 0 ? etypes[0] : TypeHelper.GetListItemType(type);
+					IsList     = true;
+				}
+
+				OriginalType = type;
+				ObjectType   = GetObjectType();
+				ObjectMapper = Builder.MappingSchema.GetObjectMapper(ObjectType);
+				SqlTable     = new SqlTable(builder.MappingSchema, ObjectType);
+
+				var psrc = parent.SqlQuery.From[parent.SqlTable];
+				var join = left ? SqlTable.WeakLeftJoin() : IsList ? SqlTable.InnerJoin() : SqlTable.WeakInnerJoin();
+
+				Association           = association;
+				ParentAssociation     = parent;
+				ParentAssociationJoin = join.JoinedTable;
+
+				psrc.Joins.Add(join.JoinedTable);
+
+				for (var i = 0; i < association.ThisKey.Length; i++)
+				{
+					SqlField field1;
+					SqlField field2;
+
+					if (!parent.SqlTable.Fields.TryGetValue(association.ThisKey[i], out field1))
+						throw new LinqException("Association key '{0}' not found for type '{1}.", association.ThisKey[i], parent.ObjectType);
+
+					if (!SqlTable.Fields.TryGetValue(association.OtherKey[i], out field2))
+						throw new LinqException("Association key '{0}' not found for type '{1}.", association.OtherKey[i], ObjectType);
+
+					join.Field(field1).Equal.Field(field2);
+				}
+
+				Init();
+			}
+
+			protected override Expression ProcessExpression(Expression expression)
+			{
+				var isLeft = false;
+
+				for (
+					var association = this;
+					isLeft == false && association != null;
+					association = association.ParentAssociation as AssociatedTableContext)
+				{
+					isLeft =
+						association.ParentAssociationJoin.JoinType == SqlQuery.JoinType.Left ||
+						association.ParentAssociationJoin.JoinType == SqlQuery.JoinType.OuterApply;
+				}
+
+				if (isLeft)
+				{
+					Expression cond = null;
+
+					var keys = ConvertToIndex(null, 0, ConvertFlags.Key);
+
+					foreach (var key in keys)
+					{
+						var index2  = ConvertToParentIndex(key.Index, null);
+
+						Expression e = Expression.Call(
+							ExpressionBuilder.DataReaderParam,
+							ReflectionHelper.DataReader.IsDBNull,
+							Expression.Constant(index2));
+
+						cond = cond == null ? e : Expression.AndAlso(cond, e);
+					}
+
+					expression = Expression.Condition(cond, Expression.Constant(null, expression.Type), expression);
+				}
+
+				return expression;
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/TakeSkipBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,139 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+	using Data.Sql;
+
+	class TakeSkipBuilder : MethodCallBuilder
+	{
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			return methodCall.IsQueryable("Skip", "Take");
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
+
+			var arg = methodCall.Arguments[1].Unwrap();
+
+			if (arg.NodeType == ExpressionType.Lambda)
+				arg = ((LambdaExpression)arg).Body.Unwrap();
+
+			var expr = builder.ConvertToSql(sequence, arg, false);
+
+			if (methodCall.Method.Name == "Take")
+			{
+				BuildTake(builder, sequence, expr);
+			}
+			else
+			{
+				BuildSkip(builder, sequence, sequence.SqlQuery.Select.SkipValue, expr);
+			}
+
+			return sequence;
+		}
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			var info = builder.ConvertSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]), null);
+
+			if (info != null)
+			{
+				info.Expression =
+					Expression.Call(
+						methodCall.Method.DeclaringType,
+						methodCall.Method.Name,
+						new[] { info.Expression.Type.GetGenericArguments()[0] },
+						info.Expression, methodCall.Arguments[1]);
+				info.Parameter  = param;
+
+				return info;
+			}
+
+			return null;
+		}
+
+		static void BuildTake(ExpressionBuilder builder, IBuildContext sequence, ISqlExpression expr)
+		{
+			var sql = sequence.SqlQuery;
+
+			builder.SqlProvider.SqlQuery = sql;
+
+			sql.Select.Take(expr);
+
+			if (sql.Select.SkipValue != null && builder.SqlProvider.IsTakeSupported && !builder.SqlProvider.IsSkipSupported)
+			{
+				if (sql.Select.SkipValue is SqlParameter && sql.Select.TakeValue is SqlValue)
+				{
+					var skip = (SqlParameter)sql.Select.SkipValue;
+					var parm = (SqlParameter)sql.Select.SkipValue.Clone(new Dictionary<ICloneableElement,ICloneableElement>(), _ => true);
+
+					parm.SetTakeConverter((int)((SqlValue)sql.Select.TakeValue).Value);
+
+					sql.Select.Take(parm);
+
+					var ep = (from pm in builder.CurrentSqlParameters where pm.SqlParameter == skip select pm).First();
+
+					ep = new ParameterAccessor
+					{
+						Expression   = ep.Expression,
+						Accessor     = ep.Accessor,
+						SqlParameter = parm
+					};
+
+					builder.CurrentSqlParameters.Add(ep);
+				}
+				else
+					sql.Select.Take(builder.Convert(
+						sequence,
+						new SqlBinaryExpression(typeof(int), sql.Select.SkipValue, "+", sql.Select.TakeValue, Precedence.Additive)));
+			}
+
+			if (!builder.SqlProvider.TakeAcceptsParameter)
+			{
+				var p = sql.Select.TakeValue as SqlParameter;
+
+				if (p != null)
+					p.IsQueryParameter = false;
+			}
+		}
+
+		static void BuildSkip(ExpressionBuilder builder, IBuildContext sequence, ISqlExpression prevSkipValue, ISqlExpression expr)
+		{
+			var sql = sequence.SqlQuery;
+
+			builder.SqlProvider.SqlQuery = sql;
+
+			sql.Select.Skip(expr);
+
+			builder.SqlProvider.SqlQuery = sql;
+
+			if (sql.Select.TakeValue != null)
+			{
+				if (builder.SqlProvider.IsSkipSupported || !builder.SqlProvider.IsTakeSupported)
+					sql.Select.Take(builder.Convert(
+						sequence,
+						new SqlBinaryExpression(typeof(int), sql.Select.TakeValue, "-", sql.Select.SkipValue, Precedence.Additive)));
+
+				if (prevSkipValue != null)
+					sql.Select.Skip(builder.Convert(
+						sequence,
+						new SqlBinaryExpression(typeof(int), prevSkipValue, "+", sql.Select.SkipValue, Precedence.Additive)));
+			}
+
+			if (!builder.SqlProvider.TakeAcceptsParameter)
+			{
+				var p = sql.Select.SkipValue as SqlParameter;
+
+				if (p != null)
+					p.IsQueryParameter = false;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/UpdateBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,443 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+	using Data.Sql;
+	using Reflection;
+
+	class UpdateBuilder : MethodCallBuilder
+	{
+		#region Update
+
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			return methodCall.IsQueryable("Update");
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
+
+			switch (methodCall.Arguments.Count)
+			{
+				case 1 : // int Update<T>(this IUpdateable<T> source)
+					CheckAssociation(sequence);
+					break;
+
+				case 2 : // int Update<T>(this IQueryable<T> source, Expression<Func<T,T>> setter)
+					{
+						CheckAssociation(sequence);
+
+						BuildSetter(
+							builder,
+							buildInfo,
+							(LambdaExpression)methodCall.Arguments[1].Unwrap(),
+							sequence,
+							sequence.SqlQuery.Update.Items,
+							sequence);
+						break;
+					}
+
+				case 3 :
+					{
+						var expr = methodCall.Arguments[1].Unwrap();
+
+						if (expr is LambdaExpression)
+						{
+							// int Update<T>(this IQueryable<T> source, Expression<Func<T,bool>> predicate, Expression<Func<T,T>> setter)
+							//
+							sequence = builder.BuildWhere(buildInfo.Parent, sequence, (LambdaExpression)methodCall.Arguments[1].Unwrap(), false);
+
+							CheckAssociation(sequence);
+
+							BuildSetter(
+								builder,
+								buildInfo,
+								(LambdaExpression)methodCall.Arguments[2].Unwrap(),
+								sequence,
+								sequence.SqlQuery.Update.Items,
+								sequence);
+						}
+						else
+						{
+							// static int Update<TSource,TTarget>(this IQueryable<TSource> source, Table<TTarget> target, Expression<Func<TSource,TTarget>> setter)
+							//
+							var into = builder.BuildSequence(new BuildInfo(buildInfo, expr, new SqlQuery()));
+
+							sequence.ConvertToIndex(null, 0, ConvertFlags.All);
+							sequence.SqlQuery.ResolveWeakJoins(new List<ISqlTableSource>());
+							sequence.SqlQuery.Select.Columns.Clear();
+
+							BuildSetter(
+								builder,
+								buildInfo,
+								(LambdaExpression)methodCall.Arguments[2].Unwrap(),
+								into,
+								sequence.SqlQuery.Update.Items,
+								sequence);
+
+							var sql = sequence.SqlQuery;
+
+							sql.Select.Columns.Clear();
+
+							foreach (var item in sql.Update.Items)
+								sql.Select.Columns.Add(new SqlQuery.Column(sql, item.Expression));
+
+							sql.Update.Table = ((TableBuilder.TableContext)into).SqlTable;
+						}
+
+						break;
+					}
+			}
+
+			sequence.SqlQuery.QueryType = QueryType.Update;
+
+			return new UpdateContext(buildInfo.Parent, sequence);
+		}
+
+		static void CheckAssociation(IBuildContext sequence)
+		{
+			var ctx = sequence as SelectContext;
+
+			if (ctx != null && ctx.IsScalar)
+			{
+				var res = ctx.IsExpression(null, 0, RequestFor.Association);
+
+				if (res.Result && res.Context is TableBuilder.AssociatedTableContext)
+				{
+					var atc = (TableBuilder.AssociatedTableContext)res.Context;
+					sequence.SqlQuery.Update.Table = atc.SqlTable;
+				}
+				else
+				{
+					res = ctx.IsExpression(null, 0, RequestFor.Table);
+
+					if (res.Result && res.Context is TableBuilder.TableContext)
+					{
+						var tc = (TableBuilder.TableContext)res.Context;
+
+						if (sequence.SqlQuery.From.Tables.Count == 0 || sequence.SqlQuery.From.Tables[0].Source != tc.SqlQuery)
+							sequence.SqlQuery.Update.Table = tc.SqlTable;
+					}
+				}
+			}
+		}
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			return null;
+		}
+
+		#endregion
+
+		#region Helpers
+
+		internal static void BuildSetter(
+			ExpressionBuilder            builder,
+			BuildInfo                    buildInfo,
+			LambdaExpression             setter,
+			IBuildContext                into,
+			List<SqlQuery.SetExpression> items,
+			IBuildContext                sequence)
+		{
+			var path = Expression.Parameter(setter.Body.Type, "p");
+			var ctx  = new ExpressionContext(buildInfo.Parent, sequence, setter);
+
+			if (setter.Body.NodeType == ExpressionType.MemberInit)
+			{
+				var ex  = (MemberInitExpression)setter.Body;
+				var p   = sequence.Parent;
+
+				BuildSetter(builder, into, items, ctx, ex, path);
+
+				builder.ReplaceParent(ctx, p);
+			}
+			else
+			{
+				var sqlInfo = ctx.ConvertToSql(setter.Body, 0, ConvertFlags.All);
+
+				foreach (var info in sqlInfo)
+				{
+					if (info.Members.Count == 0)
+						throw new LinqException("Object initializer expected for insert statement.");
+
+					if (info.Members.Count != 1)
+						throw new InvalidOperationException();
+
+					var member = info.Members[0];
+					var pe     = Expression.MakeMemberAccess(path, member);
+					var column = into.ConvertToSql(pe, 1, ConvertFlags.Field);
+					var expr   = info.Sql;
+
+					if (expr is SqlParameter)
+					{
+						var type = member.MemberType == MemberTypes.Field ? 
+							((FieldInfo)   member).FieldType :
+							((PropertyInfo)member).PropertyType;
+
+						if (TypeHelper.IsEnumOrNullableEnum(type))
+						{
+							var memberAccessor = TypeAccessor.GetAccessor(member.DeclaringType)[member.Name];
+							((SqlParameter)expr).SetEnumConverter(memberAccessor, builder.MappingSchema);
+						}
+					}
+
+					items.Add(new SqlQuery.SetExpression(column[0].Sql, expr));
+				}
+			}
+		}
+
+		static void BuildSetter(
+			ExpressionBuilder            builder,
+			IBuildContext                into,
+			List<SqlQuery.SetExpression> items,
+			IBuildContext                ctx,
+			MemberInitExpression         expression,
+			Expression                   path)
+		{
+			foreach (var binding in expression.Bindings)
+			{
+				var member  = binding.Member;
+
+				if (member is MethodInfo)
+					member = TypeHelper.GetPropertyByMethod((MethodInfo)member);
+
+				if (binding is MemberAssignment)
+				{
+					var ma = binding as MemberAssignment;
+					var pe = Expression.MakeMemberAccess(path, member);
+
+					if (ma.Expression is MemberInitExpression && !into.IsExpression(pe, 1, RequestFor.Field).Result)
+					{
+						BuildSetter(
+							builder,
+							into,
+							items,
+							ctx,
+							(MemberInitExpression)ma.Expression, Expression.MakeMemberAccess(path, member));
+					}
+					else
+					{
+						var column = into.ConvertToSql(pe, 1, ConvertFlags.Field);
+						var expr   = builder.ConvertToSqlExpression(ctx, ma.Expression, false);
+
+						if (expr is SqlValueBase && TypeHelper.IsEnumOrNullableEnum(ma.Expression.Type))
+						{
+							var memberAccessor = TypeAccessor.GetAccessor(ma.Member.DeclaringType)[ma.Member.Name];
+							((SqlValueBase)expr).SetEnumConverter(memberAccessor, builder.MappingSchema);
+						}
+
+						items.Add(new SqlQuery.SetExpression(column[0].Sql, expr));
+					}
+				}
+				else
+					throw new InvalidOperationException();
+			}
+		}
+
+		internal static void ParseSet(
+			ExpressionBuilder            builder,
+			BuildInfo                    buildInfo,
+			LambdaExpression             extract,
+			LambdaExpression             update,
+			IBuildContext                select,
+			SqlTable                     table,
+			List<SqlQuery.SetExpression> items)
+		{
+			var ext = extract.Body;
+
+			while (ext.NodeType == ExpressionType.Convert || ext.NodeType == ExpressionType.ConvertChecked)
+				ext = ((UnaryExpression)ext).Operand;
+
+			if (ext.NodeType != ExpressionType.MemberAccess || ext.GetRootObject() != extract.Parameters[0])
+				throw new LinqException("Member expression expected for the 'Set' statement.");
+
+			var body   = (MemberExpression)ext;
+			var member = body.Member;
+
+			if (member is MethodInfo)
+				member = TypeHelper.GetPropertyByMethod((MethodInfo)member);
+
+			var members = body.GetMembers();
+			var name    = members
+				.Skip(1)
+				.Select(ex =>
+				{
+					var me = ex as MemberExpression;
+
+					if (me == null)
+						return null;
+
+					var m = me.Member;
+
+					if (m is MethodInfo)
+						m = TypeHelper.GetPropertyByMethod((MethodInfo)m);
+
+					return m;
+				})
+				.Where(m => m != null && !TypeHelper.IsNullableValueMember(m))
+				.Select(m => m.Name)
+				.Aggregate((s1,s2) => s1 + "." + s2);
+
+			if (table != null && !table.Fields.ContainsKey(name))
+				throw new LinqException("Member '{0}.{1}' is not a table column.", member.DeclaringType.Name, name);
+
+			var column = table != null ?
+				table.Fields[name] :
+				select.ConvertToSql(
+					body, 1, ConvertFlags.Field)[0].Sql;
+					//Expression.MakeMemberAccess(Expression.Parameter(member.DeclaringType, "p"), member), 1, ConvertFlags.Field)[0].Sql;
+			var sp     = select.Parent;
+			var ctx    = new ExpressionContext(buildInfo.Parent, select, update);
+			var expr   = builder.ConvertToSqlExpression(ctx, update.Body, false);
+
+			builder.ReplaceParent(ctx, sp);
+
+			if (expr is SqlValueBase && TypeHelper.IsEnumOrNullableEnum(update.Body.Type))
+			{
+				var memberAccessor = TypeAccessor.GetAccessor(body.Member.DeclaringType)[body.Member.Name];
+				((SqlValueBase)expr).SetEnumConverter(memberAccessor, builder.MappingSchema);
+			}
+
+			items.Add(new SqlQuery.SetExpression(column, expr));
+		}
+
+		internal static void ParseSet(
+			ExpressionBuilder            builder,
+			BuildInfo                    buildInfo,
+			LambdaExpression             extract,
+			Expression                   update,
+			IBuildContext                select,
+			List<SqlQuery.SetExpression> items)
+		{
+			var ext = extract.Body;
+
+			if (!ExpressionHelper.IsConstant(update.Type) && !builder.AsParameters.Contains(update))
+				builder.AsParameters.Add(update);
+
+			while (ext.NodeType == ExpressionType.Convert || ext.NodeType == ExpressionType.ConvertChecked)
+				ext = ((UnaryExpression)ext).Operand;
+
+			if (ext.NodeType != ExpressionType.MemberAccess || ext.GetRootObject() != extract.Parameters[0])
+				throw new LinqException("Member expression expected for the 'Set' statement.");
+
+			var body   = (MemberExpression)ext;
+			var member = body.Member;
+
+			if (member is MethodInfo)
+				member = TypeHelper.GetPropertyByMethod((MethodInfo)member);
+
+			var column = select.ConvertToSql(
+				body, 1, ConvertFlags.Field);
+				//Expression.MakeMemberAccess(Expression.Parameter(member.DeclaringType, "p"), member), 1, ConvertFlags.Field);
+
+			if (column.Length == 0)
+				throw new LinqException("Member '{0}.{1}' is not a table column.", member.DeclaringType.Name, member.Name);
+
+			var expr   = builder.ConvertToSql(select, update, false, false);
+
+			if (expr is SqlValueBase && TypeHelper.IsEnumOrNullableEnum(update.Type))
+			{
+				var memberAccessor = TypeAccessor.GetAccessor(body.Member.DeclaringType)[body.Member.Name];
+				((SqlValueBase)expr).SetEnumConverter(memberAccessor, builder.MappingSchema);
+			}
+
+			items.Add(new SqlQuery.SetExpression(column[0].Sql, expr));
+		}
+
+		#endregion
+
+		#region UpdateContext
+
+		class UpdateContext : SequenceContextBase
+		{
+			public UpdateContext(IBuildContext parent, IBuildContext sequence)
+				: base(parent, sequence, null)
+			{
+			}
+
+			public override void BuildQuery<T>(Query<T> query, ParameterExpression queryParameter)
+			{
+				query.SetNonQueryQuery();
+			}
+
+			public override Expression BuildExpression(Expression expression, int level)
+			{
+				throw new InvalidOperationException();
+			}
+
+			public override SqlInfo[] ConvertToSql(Expression expression, int level, ConvertFlags flags)
+			{
+				throw new InvalidOperationException();
+			}
+
+			public override SqlInfo[] ConvertToIndex(Expression expression, int level, ConvertFlags flags)
+			{
+				throw new InvalidOperationException();
+			}
+
+			public override IsExpressionResult IsExpression(Expression expression, int level, RequestFor requestFlag)
+			{
+				throw new InvalidOperationException();
+			}
+
+			public override IBuildContext GetContext(Expression expression, int level, BuildInfo buildInfo)
+			{
+				throw new InvalidOperationException();
+			}
+		}
+
+		#endregion
+
+		#region Set
+
+		internal class Set : MethodCallBuilder
+		{
+			protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+			{
+				return methodCall.IsQueryable("Set");
+			}
+
+			protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+			{
+				var sequence = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
+				var extract  = (LambdaExpression)methodCall.Arguments[1].Unwrap();
+				var update   =                   methodCall.Arguments[2].Unwrap();
+
+				if (update.NodeType == ExpressionType.Lambda)
+					ParseSet(
+						builder,
+						buildInfo,
+						extract,
+						(LambdaExpression)update,
+						sequence,
+						sequence.SqlQuery.Update.Table,
+						sequence.SqlQuery.Update.Items);
+				else
+					ParseSet(
+						builder,
+						buildInfo,
+						extract,
+						update,
+						sequence,
+						sequence.SqlQuery.Update.Items);
+
+				return sequence;
+			}
+
+			protected override SequenceConvertInfo Convert(
+				ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+			{
+				return null;
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Builder/WhereBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,57 @@
+using System;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq.Builder
+{
+	using BLToolkit.Linq;
+
+	class WhereBuilder : MethodCallBuilder
+	{
+		protected override bool CanBuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			return methodCall.IsQueryable("Where");
+		}
+
+		protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
+		{
+			var sequence  = builder.BuildSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]));
+			var condition = (LambdaExpression)methodCall.Arguments[1].Unwrap();
+			var result    = builder.BuildWhere(buildInfo.Parent, sequence, condition, true);
+
+			result.SetAlias(condition.Parameters[0].Name);
+
+			return result;
+		}
+
+		protected override SequenceConvertInfo Convert(
+			ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo, ParameterExpression param)
+		{
+			var predicate = (LambdaExpression)methodCall.Arguments[1].Unwrap();
+			var info      = builder.ConvertSequence(new BuildInfo(buildInfo, methodCall.Arguments[0]), predicate.Parameters[0]);
+
+			if (info != null)
+			{
+				info.Expression = methodCall.Convert(ex => ConvertMethod(methodCall, 0, info, predicate.Parameters[0], ex));
+
+				if (param != null)
+				{
+					if (param.Type != info.Parameter.Type)
+						param = Expression.Parameter(info.Parameter.Type, param.Name);
+
+					if (info.ExpressionsToReplace != null)
+						foreach (var path in info.ExpressionsToReplace)
+						{
+							path.Path = path.Path.Convert(e => e == info.Parameter ? param : e);
+							path.Expr = path.Expr.Convert(e => e == info.Parameter ? param : e);
+						}
+				}
+
+				info.Parameter = param;
+
+				return info;
+			}
+
+			return null;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/CompiledQuery.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,336 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq
+{
+	using BLToolkit.Linq;
+	using Reflection;
+
+	/// <summary>
+	/// Provides for compilation and caching of queries for reuse.
+	/// </summary>
+	public class CompiledQuery
+	{
+		protected CompiledQuery(LambdaExpression query)
+		{
+			_query = query;
+		}
+
+		readonly object                _sync = new object();
+		readonly LambdaExpression      _query;
+		volatile Func<object[],object> _compiledQuery;
+
+		TResult ExecuteQuery<TResult>(params object[] args)
+		{
+			if (_compiledQuery == null)
+				lock (_sync)
+					if (_compiledQuery == null)
+						_compiledQuery = CompileQuery(_query);
+
+			return (TResult)_compiledQuery(args);
+		}
+
+		private interface ITableHelper
+		{
+			Expression CallTable(LambdaExpression query, Expression expr, ParameterExpression ps, bool isQueriable);
+		}
+
+		internal class TableHelper<T> : ITableHelper
+		{
+			public Expression CallTable(LambdaExpression query, Expression expr, ParameterExpression ps, bool isQueriable)
+			{
+				var table = new CompiledTable<T>(query, expr);
+
+				return Expression.Call(
+					Expression.Constant(table),
+					isQueriable ?
+						ReflectionHelper.Expressor<CompiledTable<T>>.MethodExpressor(t => t.Create (null)) :
+						ReflectionHelper.Expressor<CompiledTable<T>>.MethodExpressor(t => t.Execute(null)),
+					ps);
+			}
+		}
+
+		static Func<object[],object> CompileQuery(LambdaExpression query)
+		{
+			var ps = Expression.Parameter(typeof(object[]), "ps");
+
+			var info = query.Body.Convert(pi =>
+			{
+				switch (pi.NodeType)
+				{
+					case ExpressionType.Parameter :
+						{
+							var idx = query.Parameters.IndexOf((ParameterExpression)pi);
+
+							if (idx >= 0)
+								return Expression.Convert(Expression.ArrayIndex(ps, Expression.Constant(idx)), pi.Type);
+
+							break;
+						}
+
+					case ExpressionType.Call :
+						{
+							var expr = (MethodCallExpression)pi;
+
+							if (expr.IsQueryable())
+							{
+								var qtype  = TypeHelper.GetGenericType(
+									TypeHelper.IsSameOrParent(typeof(IQueryable), expr.Type) ?
+										typeof(IQueryable<>) :
+										typeof(IEnumerable<>),
+									expr.Type);
+
+								var helper = (ITableHelper)Activator.CreateInstance(
+									typeof(TableHelper<>).MakeGenericType(qtype == null ? expr.Type : qtype.GetGenericArguments()[0]));
+
+								return helper.CallTable(query, expr, ps, qtype != null);
+							}
+
+							if (expr.Method.Name == "GetTable" && expr.Method.DeclaringType == typeof(Extensions))
+								goto case ExpressionType.MemberAccess;
+						}
+
+						break;
+
+					case ExpressionType.MemberAccess :
+						if (pi.Type.IsGenericType && pi.Type.GetGenericTypeDefinition() == typeof(Table<>))
+						{
+							var helper = (ITableHelper)Activator
+								.CreateInstance(typeof(TableHelper<>)
+								.MakeGenericType(pi.Type.GetGenericArguments()[0]));
+							return helper.CallTable(query, pi, ps, true);
+						}
+
+						break;
+				}
+
+				return pi;
+			});
+
+			return Expression.Lambda<Func<object[],object>>(Expression.Convert(info, typeof(object)), ps).Compile();
+		}
+
+		#region Invoke
+
+		public TResult Invoke<TDC,TResult>(TDC dataContext)
+		{
+			return ExecuteQuery<TResult>(dataContext);
+		}
+
+		public TResult Invoke<TDC,T1,TResult>(TDC dataContext, T1 arg1)
+		{
+			return ExecuteQuery<TResult>(dataContext, arg1);
+		}
+
+		public TResult Invoke<TDC,T1,T2,TResult>(TDC dataContext, T1 arg1, T2 arg2)
+		{
+			return ExecuteQuery<TResult>(dataContext, arg1, arg2);
+		}
+
+		public TResult Invoke<TDC,T1,T2,T3,TResult>(TDC dataContext, T1 arg1, T2 arg2, T3 arg3)
+		{
+			return ExecuteQuery<TResult>(dataContext, arg1, arg2, arg3);
+		}
+
+		public TResult Invoke<TDC,T1,T2,T3,T4,TResult>(TDC dataContext, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
+		{
+			return ExecuteQuery<TResult>(dataContext, arg1, arg2, arg3, arg4);
+		}
+
+		public TResult Invoke<TDC,T1,T2,T3,T4,T5,TResult>(TDC dataContext, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5)
+		{
+			return ExecuteQuery<TResult>(dataContext, arg1, arg2, arg3, arg4, arg5);
+		}
+
+		#endregion
+
+		#region Compile
+
+		/// <summary>
+		/// Compiles the query.
+		/// </summary>
+		/// <returns>
+		/// A generic delegate that represents the compiled query.
+		/// </returns>
+		/// <param name="query">
+		/// The query expression to be compiled.
+		/// </param>
+		/// <typeparam name="TDC ">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TResult">
+		/// Returned type of the delegate returned by the method.
+		/// </typeparam>
+		public static Func<TDC,TResult> Compile<TDC,TResult>(
+			[JetBrains.Annotations.NotNull] Expression<Func<TDC,TResult>> query)
+			  where TDC : IDataContext
+		{
+			if (query == null) throw new ArgumentNullException("query");
+			return new CompiledQuery(query).Invoke<TDC,TResult>;
+		}
+
+		/// <summary>
+		/// Compiles the query.
+		/// </summary>
+		/// <returns>
+		/// A generic delegate that represents the compiled query.
+		/// </returns>
+		/// <param name="query">
+		/// The query expression to be compiled.
+		/// </param>
+		/// <typeparam name="TDC">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TArg1">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TResult">
+		/// Returned type of the delegate returned by the method.
+		/// </typeparam>
+		public static Func<TDC,TArg1,TResult> Compile<TDC,TArg1,TResult>(
+			[JetBrains.Annotations.NotNull] Expression<Func<TDC,TArg1,TResult>> query)
+			where TDC : IDataContext
+		{
+			if (query == null) throw new ArgumentNullException("query");
+			return new CompiledQuery(query).Invoke<TDC,TArg1,TResult>;
+		}
+
+		/// <summary>
+		/// Compiles the query.
+		/// </summary>
+		/// <returns>
+		/// A generic delegate that represents the compiled query.
+		/// </returns>
+		/// <param name="query">
+		/// The query expression to be compiled.
+		/// </param>
+		/// <typeparam name="TDC ">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TArg1">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TArg2">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TResult">
+		/// Returned type of the delegate returned by the method.
+		/// </typeparam>
+		public static Func<TDC,TArg1,TArg2,TResult> Compile<TDC,TArg1,TArg2,TResult>(
+			[JetBrains.Annotations.NotNull] Expression<Func<TDC,TArg1,TArg2,TResult>> query)
+			where TDC : IDataContext
+		{
+			if (query == null) throw new ArgumentNullException("query");
+			return new CompiledQuery(query).Invoke<TDC,TArg1,TArg2,TResult>;
+		}
+
+		/// <summary>
+		/// Compiles the query.
+		/// </summary>
+		/// <returns>
+		/// A generic delegate that represents the compiled query.
+		/// </returns>
+		/// <param name="query">
+		/// The query expression to be compiled.
+		/// </param>
+		/// <typeparam name="TDC ">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TArg1">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TArg2">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TArg3">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TResult">
+		/// Returned type of the delegate returned by the method.
+		/// </typeparam>
+		public static Func<TDC,TArg1,TArg2,TArg3,TResult> Compile<TDC,TArg1,TArg2,TArg3,TResult>(
+			[JetBrains.Annotations.NotNull] Expression<Func<TDC,TArg1,TArg2,TArg3,TResult>> query)
+			where TDC : IDataContext
+		{
+			if (query == null) throw new ArgumentNullException("query");
+			return new CompiledQuery(query).Invoke<TDC,TArg1,TArg2,TArg3,TResult>;
+		}
+
+		/// <summary>
+		/// Compiles the query.
+		/// </summary>
+		/// <returns>
+		/// A generic delegate that represents the compiled query.
+		/// </returns>
+		/// <param name="query">
+		/// The query expression to be compiled.
+		/// </param>
+		/// <typeparam name="TDC ">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TArg1">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TArg2">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TArg3">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TArg4">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TResult">
+		/// Returned type of the delegate returned by the method.
+		/// </typeparam>
+		public static Func<TDC,TArg1,TArg2,TArg3,TArg4,TResult> Compile<TDC,TArg1,TArg2,TArg3,TArg4,TResult>(
+			[JetBrains.Annotations.NotNull] Expression<Func<TDC,TArg1,TArg2,TArg3,TArg4,TResult>> query)
+			where TDC : IDataContext
+		{
+			if (query == null) throw new ArgumentNullException("query");
+			return new CompiledQuery(query).Invoke<TDC,TArg1,TArg2,TArg3,TArg4,TResult>;
+		}
+
+		/// <summary>
+		/// Compiles the query.
+		/// </summary>
+		/// <returns>
+		/// A generic delegate that represents the compiled query.
+		/// </returns>
+		/// <param name="query">
+		/// The query expression to be compiled.
+		/// </param>
+		/// <typeparam name="TDC ">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TArg1">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TArg2">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TArg3">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TArg4">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TArg5">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TResult">
+		/// Returned type of the delegate returned by the method.
+		/// </typeparam>
+		public static Func<TDC,TArg1,TArg2,TArg3,TArg4,TArg5,TResult> Compile<TDC,TArg1,TArg2,TArg3,TArg4,TArg5,TResult>(
+			[JetBrains.Annotations.NotNull] Expression<Func<TDC,TArg1,TArg2,TArg3,TArg4,TArg5,TResult>> query)
+			where TDC : IDataContext
+		{
+			if (query == null) throw new ArgumentNullException("query");
+			return new CompiledQuery(query).Invoke<TDC,TArg1,TArg2,TArg3,TArg4,TArg5,TResult>;
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/CompiledTableT.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,96 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq
+{
+	using Mapping;
+	using Builder;
+
+	class CompiledTable<T>
+	{
+		public CompiledTable(LambdaExpression lambda, Expression expression)
+		{
+			_lambda     = lambda;
+			_expression = expression;
+		}
+
+		readonly LambdaExpression _lambda;
+		readonly Expression       _expression;
+		readonly object           _sync = new object();
+
+		string        _lastContextID;
+		MappingSchema _lastMappingSchema;
+		Query<T>      _lastQuery;
+
+		readonly Dictionary<object,Query<T>> _infos = new Dictionary<object, Query<T>>();
+
+		Query<T> GetInfo(IDataContext dataContext)
+		{
+			var dataContextInfo = DataContextInfo.Create(dataContext);
+
+			string        lastContextID;
+			MappingSchema lastMappingSchema;
+			Query<T>      query;
+
+			lock (_sync)
+			{
+				lastContextID     = _lastContextID;
+				lastMappingSchema = _lastMappingSchema;
+				query             = _lastQuery;
+			}
+
+			var contextID     = dataContextInfo.ContextID;
+			var mappingSchema = dataContextInfo.MappingSchema;
+
+			if (lastContextID != contextID || lastMappingSchema != mappingSchema)
+				query = null;
+
+			if (query == null)
+			{
+				var key = new { contextID, mappingSchema };
+
+				lock (_sync)
+					_infos.TryGetValue(key, out query);
+
+				if (query == null)
+				{
+					lock (_sync)
+					{
+						_infos.TryGetValue(key, out query);
+
+						if (query == null)
+						{
+							query = new ExpressionBuilder(new Query<T>(), dataContextInfo, _expression, _lambda.Parameters.ToArray())
+								.Build<T>();
+
+							_infos.Add(key, query);
+
+							_lastContextID     = contextID;
+							_lastMappingSchema = mappingSchema;
+							_lastQuery         = query;
+						}
+					}
+				}
+			}
+
+			return query;
+		}
+
+		public IQueryable<T> Create(object[] parameters)
+		{
+			var db = (IDataContext)parameters[0];
+			return new Table<T>(db, _expression) { Info = GetInfo(db), Parameters = parameters };
+		}
+
+		public T Execute(object[] parameters)
+		{
+			var db    = (IDataContext)parameters[0];
+			var ctx   = DataContextInfo.Create(db);
+			var query = GetInfo(db);
+
+			return (T)query.GetElement(null, ctx, _expression, parameters);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/DataContext.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,173 @@
+using System;
+using System.Data;
+using System.Text;
+
+namespace BLToolkit.Data.Linq
+{
+	using Data.Sql.SqlProvider;
+	using DataProvider;
+	using Mapping;
+
+	public class DataContext : IDataContext
+	{
+		public DataContext() : this(DbManager.DefaultConfiguration)
+		{
+		}
+
+		public DataContext(string configurationString)
+		{
+			ConfigurationString = configurationString;
+			DataProvider        = DbManager.GetDataProvider(configurationString);
+			ContextID           = DataProvider.Name;
+
+			MappingSchema = DataProvider.MappingSchema ?? Map.DefaultSchema;
+		}
+
+		public string           ConfigurationString { get; private set; }
+		public DataProviderBase DataProvider        { get; private set; }
+		public string           ContextID           { get; set;         }
+		public MappingSchema    MappingSchema       { get; set;         }
+		public string           LastQuery           { get; set;         }
+
+		private bool _keepConnectionAlive;
+		public  bool  KeepConnectionAlive
+		{
+			get { return _keepConnectionAlive; }
+			set
+			{
+				_keepConnectionAlive = value;
+
+				if (value == false)
+					ReleaseQuery();
+			}
+		}
+
+		private bool? _isMarsEnabled;
+		public  bool   IsMarsEnabled
+		{
+			get
+			{
+				if (_isMarsEnabled == null)
+				{
+					if (_dbManager == null)
+						return false;
+					_isMarsEnabled = _dbManager.IsMarsEnabled;
+				}
+
+				return _isMarsEnabled.Value;
+			}
+			set { _isMarsEnabled = value; }
+		}
+
+		internal int LockDbManagerCounter;
+
+		string    _connectionString;
+		DbManager _dbManager;
+
+		internal DbManager GetDBManager()
+		{
+			if (_dbManager == null)
+			{
+				if (_connectionString == null)
+					_connectionString = DbManager.GetConnectionString(ConfigurationString);
+
+				_dbManager = new DbManager(DataProvider, _connectionString) { MappingSchema = MappingSchema };
+			}
+
+			return _dbManager;
+		}
+
+		internal void ReleaseQuery()
+		{
+			LastQuery = _dbManager.LastQuery;
+
+			if (_dbManager != null && LockDbManagerCounter == 0 && KeepConnectionAlive == false)
+			{
+				_dbManager.Dispose();
+				_dbManager = null;
+			}
+		}
+
+		Func<ISqlProvider> IDataContext.CreateSqlProvider
+		{
+			get { return DataProvider.CreateSqlProvider; }
+		}
+
+		object IDataContext.SetQuery(IQueryContext queryContext)
+		{
+			var ctx = GetDBManager() as IDataContext;
+			return ctx.SetQuery(queryContext);
+		}
+
+		int IDataContext.ExecuteNonQuery(object query)
+		{
+			var ctx = GetDBManager() as IDataContext;
+			return ctx.ExecuteNonQuery(query);
+		}
+
+		object IDataContext.ExecuteScalar(object query)
+		{
+			var ctx = GetDBManager() as IDataContext;
+			return ctx.ExecuteScalar(query);
+		}
+
+		IDataReader IDataContext.ExecuteReader(object query)
+		{
+			var ctx = GetDBManager() as IDataContext;
+			return ctx.ExecuteReader(query);
+		}
+
+		void IDataContext.ReleaseQuery(object query)
+		{
+			ReleaseQuery();
+		}
+
+		string IDataContext.GetSqlText(object query)
+		{
+			if (_dbManager != null)
+				return ((IDataContext)_dbManager).GetSqlText(query);
+
+			var ctx = GetDBManager() as IDataContext;
+			var str = ctx.GetSqlText(query);
+
+			ReleaseQuery();
+
+			return str;
+		}
+
+		DataContext(int n) {}
+
+		IDataContext IDataContext.Clone(bool forNestedQuery)
+		{
+			var dc = new DataContext(0)
+			{
+				ConfigurationString = ConfigurationString,
+				KeepConnectionAlive = KeepConnectionAlive,
+				DataProvider        = DataProvider,
+				ContextID           = ContextID,
+				MappingSchema       = MappingSchema,
+			};
+
+			if (forNestedQuery && _dbManager != null && _dbManager.IsMarsEnabled)
+				dc._dbManager = _dbManager.Transaction != null ?
+					new DbManager(DataProvider, _dbManager.Transaction) { MappingSchema = MappingSchema } :
+					new DbManager(DataProvider, _dbManager.Connection)  { MappingSchema = MappingSchema };
+
+			return dc;
+		}
+
+		public event EventHandler OnClosing;
+
+		void IDisposable.Dispose()
+		{
+			if (_dbManager != null)
+			{
+				if (OnClosing != null)
+					OnClosing(this, EventArgs.Empty);
+
+				_dbManager.Dispose();
+				_dbManager = null;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/DataContextInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,47 @@
+using System;
+
+namespace BLToolkit.Data.Linq
+{
+	using Data.Sql.SqlProvider;
+	using Mapping;
+
+	public class DataContextInfo : IDataContextInfo
+	{
+		public DataContextInfo(IDataContext dataContext)
+		{
+			DataContext    = dataContext;
+			DisposeContext = false;
+		}
+
+		public DataContextInfo(IDataContext dataContext, bool disposeContext)
+		{
+			DataContext    = dataContext;
+			DisposeContext = disposeContext;
+		}
+
+		public IDataContext  DataContext    { get; private set; }
+		public bool          DisposeContext { get; private set; }
+		public string        ContextID      { get { return DataContext.ContextID;     } }
+		public MappingSchema MappingSchema  { get { return DataContext.MappingSchema; } }
+
+		public ISqlProvider CreateSqlProvider()
+		{
+			return DataContext.CreateSqlProvider();
+		}
+
+		public IDataContextInfo Clone(bool forNestedQuery)
+		{
+			return new DataContextInfo(DataContext.Clone(forNestedQuery));
+		}
+
+		public static IDataContextInfo Create(IDataContext dataContext)
+		{
+#if SILVERLIGHT
+			if (dataContext == null) throw new ArgumentNullException("dataContext");
+			return new DataContextInfo(dataContext);
+#else
+			return dataContext == null ? (IDataContextInfo)new DefaultDataContextInfo() : new DataContextInfo(dataContext);
+#endif
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/DataContextTransaction.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,95 @@
+using System;
+using System.Data;
+
+using JetBrains.Annotations;
+
+namespace BLToolkit.Data.Linq
+{
+	public class DataContextTransaction : IDisposable
+	{
+		public DataContextTransaction([NotNull] DataContext dataContext)
+		{
+			if (dataContext == null) throw new ArgumentNullException("dataContext");
+
+			DataContext = dataContext;
+		}
+
+		public DataContext DataContext { get; set; }
+
+		int _transactionCounter;
+
+		public void BeginTransaction()
+		{
+			var db = DataContext.GetDBManager();
+
+			db.BeginTransaction();
+
+			if (_transactionCounter == 0)
+				DataContext.LockDbManagerCounter++;
+
+			_transactionCounter++;
+		}
+
+		public void BeginTransaction(IsolationLevel level)
+		{
+			var db = DataContext.GetDBManager();
+
+			db.BeginTransaction(level);
+
+			if (_transactionCounter == 0)
+				DataContext.LockDbManagerCounter++;
+
+			_transactionCounter++;
+		}
+
+		public void CommitTransaction()
+		{
+			if (_transactionCounter > 0)
+			{
+				var db = DataContext.GetDBManager();
+
+				db.CommitTransaction();
+
+				_transactionCounter--;
+
+				if (_transactionCounter == 0)
+				{
+					DataContext.LockDbManagerCounter--;
+					DataContext.ReleaseQuery();
+				}
+			}
+		}
+
+		public void RollbackTransaction()
+		{
+			if (_transactionCounter > 0)
+			{
+				var db = DataContext.GetDBManager();
+
+				db.RollbackTransaction();
+
+				_transactionCounter--;
+
+				if (_transactionCounter == 0)
+				{
+					DataContext.LockDbManagerCounter--;
+					DataContext.ReleaseQuery();
+				}
+			}
+		}
+
+		public void Dispose()
+		{
+			if (_transactionCounter > 0)
+			{
+				var db = DataContext.GetDBManager();
+
+				db.RollbackTransaction();
+
+				_transactionCounter = 0;
+
+				DataContext.LockDbManagerCounter--;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/DefaultDataContextInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,30 @@
+using System;
+
+namespace BLToolkit.Data.Linq
+{
+	using Data.Sql.SqlProvider;
+	using DataProvider;
+	using Mapping;
+
+	class DefaultDataContextInfo : IDataContextInfo
+	{
+		private IDataContext _dataContext;
+		public  IDataContext  DataContext    { get { return _dataContext ?? (_dataContext = new DbManager()); } }
+
+		public MappingSchema  MappingSchema  { get { return Map.DefaultSchema; } }
+		public bool           DisposeContext { get { return true; } }
+		public string         ContextID      { get { return _dataProvider.Name; } }
+
+		public ISqlProvider CreateSqlProvider()
+		{
+			return _dataProvider.CreateSqlProvider();
+		}
+
+		public IDataContextInfo Clone(bool forNestedQuery)
+		{
+			return new DataContextInfo(DataContext.Clone(forNestedQuery));
+		}
+
+		static readonly DataProviderBase _dataProvider = DbManager.GetDataProvider(DbManager.DefaultConfiguration);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/ExpressionQuery.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,159 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+
+using JetBrains.Annotations;
+
+namespace BLToolkit.Data.Linq
+{
+	using Reflection;
+
+	public abstract class ExpressionQuery<T> : IOrderedQueryable<T>, IQueryProvider
+	{
+		#region Init
+
+		protected void Init(IDataContextInfo dataContextInfo, Expression expression)
+		{
+#if SILVERLIGHT
+			if (dataContextInfo == null) throw new ArgumentNullException("dataContextInfo");
+
+			DataContextInfo = dataContextInfo;
+#else
+			DataContextInfo = dataContextInfo ?? new DefaultDataContextInfo();
+#endif
+			Expression      = expression      ?? Expression.Constant(this);
+		}
+
+		[NotNull] public Expression       Expression      { get; set; }
+		[NotNull] public IDataContextInfo DataContextInfo { get; set; }
+
+		internal  Query<T> Info;
+		internal  object[] Parameters;
+
+		#endregion
+
+		#region Public Members
+
+		[DebuggerBrowsable(DebuggerBrowsableState.Never)]
+		private string _sqlTextHolder;
+
+// ReSharper disable InconsistentNaming
+		[UsedImplicitly]
+		private string _sqlText { get { return SqlText; }}
+// ReSharper restore InconsistentNaming
+
+		public  string  SqlText
+		{
+			get
+			{
+				if (_sqlTextHolder == null)
+				{
+					var info = GetQuery(Expression, true);
+					_sqlTextHolder = info.GetSqlText(DataContextInfo.DataContext, Expression, Parameters, 0);
+				}
+
+				return _sqlTextHolder;
+			}
+		}
+
+		#endregion
+
+		#region Execute
+
+		IEnumerable<T> Execute(IDataContextInfo dataContextInfo, Expression expression)
+		{
+			return GetQuery(expression, true).GetIEnumerable(null, dataContextInfo, expression, Parameters);
+		}
+
+		Query<T> GetQuery(Expression expression, bool cache)
+		{
+			if (cache && Info != null)
+				return Info;
+
+			var info = Query<T>.GetQuery(DataContextInfo, expression);
+
+			if (cache)
+				Info = info;
+
+			return info;
+		}
+
+		#endregion
+
+		#region IQueryable Members
+
+		Type IQueryable.ElementType
+		{
+			get { return typeof(T); }
+		}
+
+		Expression IQueryable.Expression
+		{
+			get { return Expression; }
+		}
+
+		IQueryProvider IQueryable.Provider
+		{
+			get { return this; }
+		}
+
+		#endregion
+
+		#region IQueryProvider Members
+
+		IQueryable<TElement> IQueryProvider.CreateQuery<TElement>(Expression expression)
+		{
+			if (expression == null)
+				throw new ArgumentNullException("expression");
+
+			return new ExpressionQueryImpl<TElement>(DataContextInfo, expression);
+		}
+
+		IQueryable IQueryProvider.CreateQuery(Expression expression)
+		{
+			if (expression == null)
+				throw new ArgumentNullException("expression");
+
+			var elementType = TypeHelper.GetElementType(expression.Type) ?? expression.Type;
+
+			try
+			{
+				return (IQueryable)Activator.CreateInstance(typeof(ExpressionQueryImpl<>).MakeGenericType(elementType), new object[] { DataContextInfo, expression });
+			}
+			catch (TargetInvocationException ex)
+			{
+				throw ex.InnerException;
+			}
+		}
+
+		TResult IQueryProvider.Execute<TResult>(Expression expression)
+		{
+			return (TResult)GetQuery(expression, false).GetElement(null, DataContextInfo, expression, Parameters);
+		}
+
+		object IQueryProvider.Execute(Expression expression)
+		{
+			return GetQuery(expression, false).GetElement(null, DataContextInfo, expression, Parameters);
+		}
+
+		#endregion
+
+		#region IEnumerable Members
+
+		IEnumerator<T> IEnumerable<T>.GetEnumerator()
+		{
+			return Execute(DataContextInfo, Expression).GetEnumerator();
+		}
+
+		IEnumerator IEnumerable.GetEnumerator()
+		{
+			return Execute(DataContextInfo, Expression).GetEnumerator();
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/ExpressionQueryImpl.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,27 @@
+using System;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq
+{
+	class ExpressionQueryImpl<T> : ExpressionQuery<T>, IExpressionQuery
+	{
+		public ExpressionQueryImpl(IDataContextInfo dataContext, Expression expression)
+		{
+			Init(dataContext, expression);
+		}
+
+		//public new string SqlText
+		//{
+		//	get { return base.SqlText; }
+		//}
+
+//#if OVERRIDETOSTRING
+
+		public override string ToString()
+		{
+			return base.SqlText;
+		}
+
+//#endif
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Expressions.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1238 @@
+using System;
+using System.Collections.Generic;
+using System.Data.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+using System.Text;
+
+#region ReSharper disables
+// ReSharper disable RedundantTypeArgumentsOfMethod
+// ReSharper disable RedundantCast
+// ReSharper disable PossibleInvalidOperationException
+// ReSharper disable CSharpWarnings::CS0693
+// ReSharper disable RedundantToStringCall
+#endregion
+
+namespace BLToolkit.Data.Linq
+{
+	using B = Boolean;
+	using C = Char;
+	using S = String;
+	using I = Int32;
+	using O = Object;
+	using D = DateTime;
+	using T = TimeSpan;
+	using F = Double;
+	using M = Decimal;
+
+	public static class Expressions
+	{
+		#region MapMember
+
+		public static void MapMember(MemberInfo memberInfo, LambdaExpression expression)
+		{
+			MapMember("", memberInfo, expression);
+		}
+
+		public static void MapMember(string providerName, MemberInfo memberInfo, LambdaExpression expression)
+		{
+			Dictionary<MemberInfo,LambdaExpression> dic;
+
+			if (!_members.TryGetValue(providerName, out dic))
+				_members.Add(providerName, dic = new Dictionary<MemberInfo,LambdaExpression>());
+
+			dic[memberInfo] = expression;
+		}
+
+		public static void MapMember(Expression<Func<object>> memberInfo, LambdaExpression expression)
+		{
+			MapMember("", M(memberInfo), expression);
+		}
+
+		public static void MapMember(string providerName, Expression<Func<object>> memberInfo, LambdaExpression expression)
+		{
+			MapMember(providerName, M(memberInfo), expression);
+		}
+
+		public static void MapMember<T>(Expression<Func<T,object>> memberInfo, LambdaExpression expression)
+		{
+			MapMember("", M(memberInfo), expression);
+		}
+
+		public static void MapMember<T>(string providerName, Expression<Func<T,object>> memberInfo, LambdaExpression expression)
+		{
+			MapMember(providerName, M(memberInfo), expression);
+		}
+
+		public static void MapMember<TR>               (string providerName, Expression<Func<TR>>                memberInfo, Expression<Func<TR>>               expression) { MapMember(providerName, ReflectionHelper.MemeberInfo(memberInfo), expression); }
+		public static void MapMember<TR>               (                     Expression<Func<TR>>                memberInfo, Expression<Func<TR>>               expression) { MapMember("",           ReflectionHelper.MemeberInfo(memberInfo), expression); }
+		public static void MapMember<T1,TR>            (string providerName, Expression<Func<T1,TR>>             memberInfo, Expression<Func<T1,TR>>            expression) { MapMember(providerName, ReflectionHelper.MemeberInfo(memberInfo), expression); }
+		public static void MapMember<T1,TR>            (                     Expression<Func<T1,TR>>             memberInfo, Expression<Func<T1,TR>>            expression) { MapMember("",           ReflectionHelper.MemeberInfo(memberInfo), expression); }
+		public static void MapMember<T1,T2,TR>         (string providerName, Expression<Func<T1,T2,TR>>          memberInfo, Expression<Func<T1,T2,TR>>         expression) { MapMember(providerName, ReflectionHelper.MemeberInfo(memberInfo), expression); }
+		public static void MapMember<T1,T2,TR>         (                     Expression<Func<T1,T2,TR>>          memberInfo, Expression<Func<T1,T2,TR>>         expression) { MapMember("",           ReflectionHelper.MemeberInfo(memberInfo), expression); }
+		public static void MapMember<T1,T2,T3,TR>      (string providerName, Expression<Func<T1,T2,T3,TR>>       memberInfo, Expression<Func<T1,T2,T3,TR>>      expression) { MapMember(providerName, ReflectionHelper.MemeberInfo(memberInfo), expression); }
+		public static void MapMember<T1,T2,T3,TR>      (                     Expression<Func<T1,T2,T3,TR>>       memberInfo, Expression<Func<T1,T2,T3,TR>>      expression) { MapMember("",           ReflectionHelper.MemeberInfo(memberInfo), expression); }
+		public static void MapMember<T1,T2,T3,T4,TR>   (string providerName, Expression<Func<T1,T2,T3,T4,TR>>    memberInfo, Expression<Func<T1,T2,T3,T4,TR>>   expression) { MapMember(providerName, ReflectionHelper.MemeberInfo(memberInfo), expression); }
+		public static void MapMember<T1,T2,T3,T4,TR>   (                     Expression<Func<T1,T2,T3,T4,TR>>    memberInfo, Expression<Func<T1,T2,T3,T4,TR>>   expression) { MapMember("",           ReflectionHelper.MemeberInfo(memberInfo), expression); }
+		public static void MapMember<T1,T2,T3,T4,T5,TR>(string providerName, Expression<Func<T1,T2,T3,T4,T5,TR>> memberInfo, Expression<Func<T1,T2,T3,T4,T5,TR>> expression) { MapMember(providerName, ReflectionHelper.MemeberInfo(memberInfo), expression); }
+		public static void MapMember<T1,T2,T3,T4,T5,TR>(                     Expression<Func<T1,T2,T3,T4,T5,TR>> memberInfo, Expression<Func<T1,T2,T3,T4,T5,TR>> expression) { MapMember("",           ReflectionHelper.MemeberInfo(memberInfo), expression); }
+
+		#endregion
+
+		#region Public Members
+
+		public static LambdaExpression ConvertMember(string providerName, MemberInfo mi)
+		{
+			Dictionary<MemberInfo,LambdaExpression> dic;
+			LambdaExpression                        expr;
+
+			if (Members.TryGetValue(providerName, out dic))
+				if (dic.TryGetValue(mi, out expr))
+					return expr;
+
+			if (!Members[""].TryGetValue(mi, out expr))
+			{
+				if (mi is MethodInfo && mi.Name == "CompareString" && mi.DeclaringType.FullName == "Microsoft.VisualBasic.CompilerServices.Operators")
+				{
+					lock (_members)
+					{
+						if (!Members[""].TryGetValue(mi, out expr))
+						{
+							expr = L<S,S,B,I>((s1,s2,b) => b ? string.CompareOrdinal(s1.ToUpper(), s2.ToUpper()) : string.CompareOrdinal(s1, s2));
+
+							_members[""].Add(mi, expr);
+						}
+					}
+				}
+			}
+
+			return expr;
+		}
+
+		#endregion
+
+		#region Function Mapping
+
+		#region Helpers
+
+		static MemberInfo M<T>(Expression<Func<T,object>> func)
+		{
+			return ReflectionHelper.MemeberInfo(func);
+		}
+
+		static MemberInfo M(Expression<Func<object>> func)
+		{
+			return ReflectionHelper.MemeberInfo(func);
+		}
+
+		static LambdaExpression L<TR>                   (Expression<Func<TR>>                   func) { return func; }
+		static LambdaExpression L<T1,TR>                (Expression<Func<T1,TR>>                func) { return func; }
+		static LambdaExpression L<T1,T2,TR>             (Expression<Func<T1,T2,TR>>             func) { return func; }
+		static LambdaExpression L<T1,T2,T3,TR>          (Expression<Func<T1,T2,T3,TR>>          func) { return func; }
+		static LambdaExpression L<T1,T2,T3,T4,TR>       (Expression<Func<T1,T2,T3,T4,TR>>       func) { return func; }
+		static LambdaExpression L<T1,T2,T3,T4,T5,TR>    (Expression<Func<T1,T2,T3,T4,T5,TR>>    func) { return func; }
+		static LambdaExpression L<T1,T2,T3,T4,T5,T6,TR> (Expression<Func<T1,T2,T3,T4,T5,T6,TR>> func) { return func; }
+
+		#endregion
+
+		static public   Dictionary<string,Dictionary<MemberInfo,LambdaExpression>>  Members { get { return _members; } }
+		static readonly Dictionary<string,Dictionary<MemberInfo,LambdaExpression>> _members = new Dictionary<string,Dictionary<MemberInfo,LambdaExpression>>
+		{
+			{ "", new Dictionary<MemberInfo,LambdaExpression> {
+
+				#region String
+
+				{ M(() => "".Length               ), L<S,I>      ( obj           => Sql.Length(obj).Value) },
+				{ M(() => "".Substring  (0)       ), L<S,I,S>    ((obj,p0)       => Sql.Substring(obj, p0 + 1, obj.Length - p0)) },
+				{ M(() => "".Substring  (0,0)     ), L<S,I,I,S>  ((obj,p0,p1)    => Sql.Substring(obj, p0 + 1, p1)) },
+				{ M(() => "".ContainsExactly("")  ), L<S,S,I>    ((obj,p0)       => p0.Length == 0                    ? 0  : (Sql.ContainsExactly(p0, obj)                .Value) - 1) },
+				{ M(() => "".IndexOf    ("")      ), L<S,S,I>    ((obj,p0)       => p0.Length == 0                    ? 0  : (Sql.CharIndex(p0, obj)                      .Value) - 1) },
+				{ M(() => "".IndexOf    ("",0)    ), L<S,S,I,I>  ((obj,p0,p1)    => p0.Length == 0 && obj.Length > p1 ? p1 : (Sql.CharIndex(p0, obj,               p1 + 1).Value) - 1) },
+				{ M(() => "".IndexOf    ("",0,0)  ), L<S,S,I,I,I>((obj,p0,p1,p2) => p0.Length == 0 && obj.Length > p1 ? p1 : (Sql.CharIndex(p0, Sql.Left(obj, p2), p1)    .Value) - 1) },
+				{ M(() => "".IndexOf    (' ')     ), L<S,C,I>    ((obj,p0)       =>                                          (Sql.CharIndex(p0, obj)                      .Value) - 1) },
+				{ M(() => "".IndexOf    (' ',0)   ), L<S,C,I,I>  ((obj,p0,p1)    =>                                          (Sql.CharIndex(p0, obj,               p1 + 1).Value) - 1) },
+				{ M(() => "".IndexOf    (' ',0,0) ), L<S,C,I,I,I>((obj,p0,p1,p2) =>                                          (Sql.CharIndex(p0, Sql.Left(obj, p2), p1)     ?? 0) - 1) },
+				{ M(() => "".LastIndexOf("")      ), L<S,S,I>    ((obj,p0)       => p0.Length == 0 ? obj.Length - 1 : (Sql.CharIndex(p0, obj)                           .Value) == 0 ? -1 : obj.Length - (Sql.CharIndex(Sql.Reverse(p0), Sql.Reverse(obj))                               .Value) - p0.Length + 1) },
+				{ M(() => "".LastIndexOf("",0)    ), L<S,S,I,I>  ((obj,p0,p1)    => p0.Length == 0 ? p1             : (Sql.CharIndex(p0, obj,                    p1 + 1).Value) == 0 ? -1 : obj.Length - (Sql.CharIndex(Sql.Reverse(p0), Sql.Reverse(obj.Substring(p1, obj.Length - p1))).Value) - p0.Length + 1) },
+				{ M(() => "".LastIndexOf("",0,0)  ), L<S,S,I,I,I>((obj,p0,p1,p2) => p0.Length == 0 ? p1             : (Sql.CharIndex(p0, Sql.Left(obj, p1 + p2), p1 + 1).Value) == 0 ? -1 :    p1 + p2 - (Sql.CharIndex(Sql.Reverse(p0), Sql.Reverse(obj.Substring(p1, p2)))             .Value) - p0.Length + 1) },
+				{ M(() => "".LastIndexOf(' ')     ), L<S,C,I>    ((obj,p0)       => (Sql.CharIndex(p0, obj)                           .Value) == 0 ? -1 : obj.Length - (Sql.CharIndex(p0, Sql.Reverse(obj))                               .Value)) },
+				{ M(() => "".LastIndexOf(' ',0)   ), L<S,C,I,I>  ((obj,p0,p1)    => (Sql.CharIndex(p0, obj, p1 + 1)                   .Value) == 0 ? -1 : obj.Length - (Sql.CharIndex(p0, Sql.Reverse(obj.Substring(p1, obj.Length - p1))).Value)) },
+				{ M(() => "".LastIndexOf(' ',0,0) ), L<S,C,I,I,I>((obj,p0,p1,p2) => (Sql.CharIndex(p0, Sql.Left(obj, p1 + p2), p1 + 1).Value) == 0 ? -1 : p1 + p2    - (Sql.CharIndex(p0, Sql.Reverse(obj.Substring(p1, p2)))             .Value)) },
+				{ M(() => "".Insert     (0,"")    ), L<S,I,S,S>  ((obj,p0,p1)    => obj.Length == p0 ? obj + p1 : Sql.Stuff(obj, p0 + 1, 0, p1)) },
+				{ M(() => "".Remove     (0)       ), L<S,I,S>    ((obj,p0)       => Sql.Left     (obj, p0)) },
+				{ M(() => "".Remove     (0,0)     ), L<S,I,I,S>  ((obj,p0,p1)    => Sql.Stuff    (obj, p0 + 1, p1, "")) },
+				{ M(() => "".PadLeft    (0)       ), L<S,I,S>    ((obj,p0)       => Sql.PadLeft  (obj, p0, ' ')) },
+				{ M(() => "".PadLeft    (0,' ')   ), L<S,I,C,S>  ((obj,p0,p1)    => Sql.PadLeft  (obj, p0, p1)) },
+				{ M(() => "".PadRight   (0)       ), L<S,I,S>    ((obj,p0)       => Sql.PadRight (obj, p0, ' ')) },
+				{ M(() => "".PadRight   (0,' ')   ), L<S,I,C,S>  ((obj,p0,p1)    => Sql.PadRight (obj, p0, p1)) },
+				{ M(() => "".Replace    ("","")   ), L<S,S,S,S>  ((obj,p0,p1)    => Sql.Replace  (obj, p0, p1)) },
+				{ M(() => "".Replace    (' ',' ') ), L<S,C,C,S>  ((obj,p0,p1)    => Sql.Replace  (obj, p0, p1)) },
+				{ M(() => "".Trim       ()        ), L<S,S>      ( obj           => Sql.Trim     (obj)) },
+				{ M(() => "".TrimEnd    ()        ), L<S,C[],S>  ((obj,ch)       =>     TrimRight(obj, ch)) },
+				{ M(() => "".TrimStart  ()        ), L<S,C[],S>  ((obj,ch)       =>     TrimLeft (obj, ch)) },
+				{ M(() => "".ToLower    ()        ), L<S,S>      ( obj           => Sql.Lower(obj)) },
+				{ M(() => "".ToUpper    ()        ), L<S,S>      ( obj           => Sql.Upper(obj)) },
+				{ M(() => "".CompareTo  ("")      ), L<S,S,I>    ((obj,p0)       => ConvertToCaseCompareTo(obj, p0).Value ) },
+				{ M(() => "".CompareTo  (1)       ), L<S,O,I>    ((obj,p0)       => ConvertToCaseCompareTo(obj, p0.ToString()).Value ) },
+
+				{ M(() => string.IsNullOrEmpty ("")    ),           L<S,B>          ( p0               => p0 == null || p0.Length == 0) },
+				{ M(() => string.CompareOrdinal("","")),            L<S,S,I>        ((s1,s2)           => s1.CompareTo(s2)) },
+				{ M(() => string.CompareOrdinal("",0,"",0,0)),      L<S,I,S,I,I,I>  ((s1,i1,s2,i2,l)   => s1.Substring(i1, l).CompareTo(s2.Substring(i2, l))) },
+				{ M(() => string.Compare       ("","")),            L<S,S,I>        ((s1,s2)           => s1.CompareTo(s2)) },
+				{ M(() => string.Compare       ("",0,"",0,0)),      L<S,I,S,I,I,I>  ((s1,i1,s2,i2,l)   => s1.Substring(i1,l).CompareTo(s2.Substring(i2,l))) },
+#if !SILVERLIGHT
+				{ M(() => string.Compare       ("","",true)),       L<S,S,B,I>      ((s1,s2,b)         => b ? s1.ToLower().CompareTo(s2.ToLower()) : s1.CompareTo(s2)) },
+				{ M(() => string.Compare       ("",0,"",0,0,true)), L<S,I,S,I,I,B,I>((s1,i1,s2,i2,l,b) => b ? s1.Substring(i1,l).ToLower().CompareTo(s2.Substring(i2, l).ToLower()) : s1.Substring(i1, l).CompareTo(s2.Substring(i2, l))) },
+#endif
+
+				{ M(() => AltStuff("",0,0,"")), L<S,I?,I?,S,S>((p0,p1,p2,p3) => Sql.Left(p0, p1 - 1) + p3 + Sql.Right(p0, p0.Length - (p1 + p2 - 1))) },
+
+				#endregion
+
+				#region Binary
+
+				{ M(() => ((Binary)null).Length ), L<Binary,I>(obj => Sql.Length(obj).Value) },
+
+				#endregion
+
+				#region DateTime
+
+				{ M(() => Sql.GetDate()                  ), L<D>      (()       => Sql.CurrentTimestamp2 ) },
+				{ M(() => DateTime.Now                   ), L<D>      (()       => Sql.CurrentTimestamp2 ) },
+
+				{ M(() => DateTime.Now.Year              ), L<D,I>    (obj      => Sql.DatePart(Sql.DateParts.Year,        obj).Value     ) },
+				{ M(() => DateTime.Now.Month             ), L<D,I>    (obj      => Sql.DatePart(Sql.DateParts.Month,       obj).Value     ) },
+				{ M(() => DateTime.Now.DayOfYear         ), L<D,I>    (obj      => Sql.DatePart(Sql.DateParts.DayOfYear,   obj).Value     ) },
+				{ M(() => DateTime.Now.Day               ), L<D,I>    (obj      => Sql.DatePart(Sql.DateParts.Day,         obj).Value     ) },
+				{ M(() => DateTime.Now.DayOfWeek         ), L<D,I>    (obj      => Sql.DatePart(Sql.DateParts.WeekDay,     obj).Value - 1 ) },
+				{ M(() => DateTime.Now.Hour              ), L<D,I>    (obj      => Sql.DatePart(Sql.DateParts.Hour,        obj).Value     ) },
+				{ M(() => DateTime.Now.Minute            ), L<D,I>    (obj      => Sql.DatePart(Sql.DateParts.Minute,      obj).Value     ) },
+				{ M(() => DateTime.Now.Second            ), L<D,I>    (obj      => Sql.DatePart(Sql.DateParts.Second,      obj).Value     ) },
+				{ M(() => DateTime.Now.Millisecond       ), L<D,I>    (obj      => Sql.DatePart(Sql.DateParts.Millisecond, obj).Value     ) },
+				{ M(() => DateTime.Now.Date              ), L<D,D>    (obj      => Sql.Convert2(Sql.Date,                  obj)     ) },
+				{ M(() => DateTime.Now.TimeOfDay         ), L<D,T>    (obj      => Sql.DateToTime(Sql.Convert2(Sql.Time,   obj)).Value    ) },
+				{ M(() => DateTime.Now.AddYears       (0)), L<D,I,D>  ((obj,p0) => Sql.DateAdd(Sql.DateParts.Year,        p0, obj).Value ) },
+				{ M(() => DateTime.Now.AddMonths      (0)), L<D,I,D>  ((obj,p0) => Sql.DateAdd(Sql.DateParts.Month,       p0, obj).Value ) },
+				{ M(() => DateTime.Now.AddDays        (0)), L<D,F,D>  ((obj,p0) => Sql.DateAdd(Sql.DateParts.Day,         p0, obj).Value ) },
+				{ M(() => DateTime.Now.AddHours       (0)), L<D,F,D>  ((obj,p0) => Sql.DateAdd(Sql.DateParts.Hour,        p0, obj).Value ) },
+				{ M(() => DateTime.Now.AddMinutes     (0)), L<D,F,D>  ((obj,p0) => Sql.DateAdd(Sql.DateParts.Minute,      p0, obj).Value ) },
+				{ M(() => DateTime.Now.AddSeconds     (0)), L<D,F,D>  ((obj,p0) => Sql.DateAdd(Sql.DateParts.Second,      p0, obj).Value ) },
+				{ M(() => DateTime.Now.AddMilliseconds(0)), L<D,F,D>  ((obj,p0) => Sql.DateAdd(Sql.DateParts.Millisecond, p0, obj).Value ) },
+				{ M(() => new DateTime(0, 0, 0)          ), L<I,I,I,D>((y,m,d)  => Sql.MakeDateTime(y, m, d).Value                    ) },
+
+				{ M(() => Sql.MakeDateTime(0, 0, 0)          ), L<I?,I?,I?,D?>         ((y,m,d)        => Sql.Convert(Sql.Date, y.ToString() + "-" + m.ToString() + "-" + d.ToString())) },
+				{ M(() => new DateTime    (0, 0, 0, 0, 0, 0) ), L<I,I,I,I,I,I,D>       ((y,m,d,h,mm,s) => Sql.MakeDateTime(y, m, d, h, mm, s).Value ) },
+				{ M(() => Sql.MakeDateTime(0, 0, 0, 0, 0, 0) ), L<I?,I?,I?,I?,I?,I?,D?>((y,m,d,h,mm,s) => Sql.Convert(Sql.DateTime2,
+					y.ToString() + "-" + m.ToString() + "-" + d.ToString() + " " +
+					h.ToString() + ":" + mm.ToString() + ":" + s.ToString())) },
+
+				#endregion
+
+				#region Parse
+
+				{ M(() => Boolean. Parse("")), L<String,Boolean> (p0 => Sql.ConvertTo<Boolean>. From(p0) ) },
+				{ M(() => Byte.    Parse("")), L<String,Byte>    (p0 => Sql.ConvertTo<Byte>.    From(p0) ) },
+#if !SILVERLIGHT
+				{ M(() => Char.    Parse("")), L<String,Char>    (p0 => Sql.ConvertTo<Char>.    From(p0) ) },
+#endif
+				{ M(() => DateTime.Parse("")), L<String,DateTime>(p0 => Sql.ConvertTo<DateTime>.From(p0) ) },
+				{ M(() => Decimal. Parse("")), L<String,Decimal> (p0 => Sql.ConvertTo<Decimal>. From(p0) ) },
+				{ M(() => Double.  Parse("")), L<String,Double>  (p0 => Sql.ConvertTo<Double>.  From(p0) ) },
+				{ M(() => Int16.   Parse("")), L<String,Int16>   (p0 => Sql.ConvertTo<Int16>.   From(p0) ) },
+				{ M(() => Int32.   Parse("")), L<String,Int32>   (p0 => Sql.ConvertTo<Int32>.   From(p0) ) },
+				{ M(() => Int64.   Parse("")), L<String,Int64>   (p0 => Sql.ConvertTo<Int64>.   From(p0) ) },
+				{ M(() => SByte.   Parse("")), L<String,SByte>   (p0 => Sql.ConvertTo<SByte>.   From(p0) ) },
+				{ M(() => Single.  Parse("")), L<String,Single>  (p0 => Sql.ConvertTo<Single>.  From(p0) ) },
+				{ M(() => UInt16.  Parse("")), L<String,UInt16>  (p0 => Sql.ConvertTo<UInt16>.  From(p0) ) },
+				{ M(() => UInt32.  Parse("")), L<String,UInt32>  (p0 => Sql.ConvertTo<UInt32>.  From(p0) ) },
+				{ M(() => UInt64.  Parse("")), L<String,UInt64>  (p0 => Sql.ConvertTo<UInt64>.  From(p0) ) },
+
+				#endregion
+
+				#region ToString
+
+				{ M(() => ((Boolean)true).ToString()), L<Boolean, String>(p0 => Sql.ConvertTo<string>.From(p0) ) },
+				{ M(() => ((Byte)    0)  .ToString()), L<Byte,    String>(p0 => Sql.ConvertTo<string>.From(p0) ) },
+				{ M(() => ((Char)   '0') .ToString()), L<Char,    String>(p0 => Sql.ConvertTo<string>.From(p0) ) },
+				{ M(() => ((Decimal) 0)  .ToString()), L<Decimal, String>(p0 => Sql.ConvertTo<string>.From(p0) ) },
+				{ M(() => ((Double)  0)  .ToString()), L<Double,  String>(p0 => Sql.ConvertTo<string>.From(p0) ) },
+				{ M(() => ((Int16)   0)  .ToString()), L<Int16,   String>(p0 => Sql.ConvertTo<string>.From(p0) ) },
+				{ M(() => ((Int32)   0)  .ToString()), L<Int32,   String>(p0 => Sql.ConvertTo<string>.From(p0) ) },
+				{ M(() => ((Int64)   0)  .ToString()), L<Int64,   String>(p0 => Sql.ConvertTo<string>.From(p0) ) },
+				{ M(() => ((SByte)   0)  .ToString()), L<SByte,   String>(p0 => Sql.ConvertTo<string>.From(p0) ) },
+				{ M(() => ((Single)  0)  .ToString()), L<Single,  String>(p0 => Sql.ConvertTo<string>.From(p0) ) },
+				{ M(() => ((String) "0") .ToString()), L<String,  String>(p0 => p0                             ) },
+				{ M(() => ((UInt16)  0)  .ToString()), L<UInt16,  String>(p0 => Sql.ConvertTo<string>.From(p0) ) },
+				{ M(() => ((UInt32)  0)  .ToString()), L<UInt32,  String>(p0 => Sql.ConvertTo<string>.From(p0) ) },
+				{ M(() => ((UInt64)  0)  .ToString()), L<UInt64,  String>(p0 => Sql.ConvertTo<string>.From(p0) ) },
+
+				#endregion
+
+				#region Convert
+
+				#region ToBoolean
+
+				{ M(() => Convert.ToBoolean((Boolean)true)), L<Boolean, Boolean>(p0 => Sql.ConvertTo<Boolean>.From(p0) ) },
+				{ M(() => Convert.ToBoolean((Byte)    0)  ), L<Byte,    Boolean>(p0 => Sql.ConvertTo<Boolean>.From(p0) ) },
+				{ M(() => Convert.ToBoolean((Char)   '0') ), L<Char,    Boolean>(p0 => Sql.ConvertTo<Boolean>.From(p0) ) },
+#if !SILVERLIGHT
+				{ M(() => Convert.ToBoolean(DateTime.Now) ), L<DateTime,Boolean>(p0 => Sql.ConvertTo<Boolean>.From(p0) ) },
+#endif
+				{ M(() => Convert.ToBoolean((Decimal) 0)  ), L<Decimal, Boolean>(p0 => Sql.ConvertTo<Boolean>.From(p0) ) },
+				{ M(() => Convert.ToBoolean((Double)  0)  ), L<Double,  Boolean>(p0 => Sql.ConvertTo<Boolean>.From(p0) ) },
+				{ M(() => Convert.ToBoolean((Int16)   0)  ), L<Int16,   Boolean>(p0 => Sql.ConvertTo<Boolean>.From(p0) ) },
+				{ M(() => Convert.ToBoolean((Int32)   0)  ), L<Int32,   Boolean>(p0 => Sql.ConvertTo<Boolean>.From(p0) ) },
+				{ M(() => Convert.ToBoolean((Int64)   0)  ), L<Int64,   Boolean>(p0 => Sql.ConvertTo<Boolean>.From(p0) ) },
+				{ M(() => Convert.ToBoolean((Object)  0)  ), L<Object,  Boolean>(p0 => Sql.ConvertTo<Boolean>.From(p0) ) },
+				{ M(() => Convert.ToBoolean((SByte)   0)  ), L<SByte,   Boolean>(p0 => Sql.ConvertTo<Boolean>.From(p0) ) },
+				{ M(() => Convert.ToBoolean((Single)  0)  ), L<Single,  Boolean>(p0 => Sql.ConvertTo<Boolean>.From(p0) ) },
+				{ M(() => Convert.ToBoolean((String) "0") ), L<String,  Boolean>(p0 => Sql.ConvertTo<Boolean>.From(p0) ) },
+				{ M(() => Convert.ToBoolean((UInt16)  0)  ), L<UInt16,  Boolean>(p0 => Sql.ConvertTo<Boolean>.From(p0) ) },
+				{ M(() => Convert.ToBoolean((UInt32)  0)  ), L<UInt32,  Boolean>(p0 => Sql.ConvertTo<Boolean>.From(p0) ) },
+				{ M(() => Convert.ToBoolean((UInt64)  0)  ), L<UInt64,  Boolean>(p0 => Sql.ConvertTo<Boolean>.From(p0) ) },
+
+				#endregion
+
+				#region ToByte
+
+				{ M(() => Convert.ToByte((Boolean)true)), L<Boolean, Byte>(p0 => Sql.ConvertTo<Byte>.From(p0) ) },
+				{ M(() => Convert.ToByte((Byte)    0)  ), L<Byte,    Byte>(p0 => Sql.ConvertTo<Byte>.From(p0) ) },
+				{ M(() => Convert.ToByte((Char)   '0') ), L<Char,    Byte>(p0 => Sql.ConvertTo<Byte>.From(p0) ) },
+#if !SILVERLIGHT
+				{ M(() => Convert.ToByte(DateTime.Now) ), L<DateTime,Byte>(p0 => Sql.ConvertTo<Byte>.From(p0) ) },
+#endif
+				{ M(() => Convert.ToByte((Decimal) 0)  ), L<Decimal, Byte>(p0 => Sql.ConvertTo<Byte>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToByte((Double)  0)  ), L<Double,  Byte>(p0 => Sql.ConvertTo<Byte>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToByte((Int16)   0)  ), L<Int16,   Byte>(p0 => Sql.ConvertTo<Byte>.From(p0) ) },
+				{ M(() => Convert.ToByte((Int32)   0)  ), L<Int32,   Byte>(p0 => Sql.ConvertTo<Byte>.From(p0) ) },
+				{ M(() => Convert.ToByte((Int64)   0)  ), L<Int64,   Byte>(p0 => Sql.ConvertTo<Byte>.From(p0) ) },
+				{ M(() => Convert.ToByte((Object)  0)  ), L<Object,  Byte>(p0 => Sql.ConvertTo<Byte>.From(p0) ) },
+				{ M(() => Convert.ToByte((SByte)   0)  ), L<SByte,   Byte>(p0 => Sql.ConvertTo<Byte>.From(p0) ) },
+				{ M(() => Convert.ToByte((Single)  0)  ), L<Single,  Byte>(p0 => Sql.ConvertTo<Byte>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToByte((String) "0") ), L<String,  Byte>(p0 => Sql.ConvertTo<Byte>.From(p0) ) },
+				{ M(() => Convert.ToByte((UInt16)  0)  ), L<UInt16,  Byte>(p0 => Sql.ConvertTo<Byte>.From(p0) ) },
+				{ M(() => Convert.ToByte((UInt32)  0)  ), L<UInt32,  Byte>(p0 => Sql.ConvertTo<Byte>.From(p0) ) },
+				{ M(() => Convert.ToByte((UInt64)  0)  ), L<UInt64,  Byte>(p0 => Sql.ConvertTo<Byte>.From(p0) ) },
+
+				#endregion
+
+				#region ToChar
+
+#if !SILVERLIGHT
+				{ M(() => Convert.ToChar((Boolean)true)), L<Boolean, Char>(p0 => Sql.ConvertTo<Char>.From(p0) ) },
+#endif
+				{ M(() => Convert.ToChar((Byte)    0)  ), L<Byte,    Char>(p0 => Sql.ConvertTo<Char>.From(p0) ) },
+				{ M(() => Convert.ToChar((Char)   '0') ), L<Char,    Char>(p0 => p0                       ) },
+#if !SILVERLIGHT
+				{ M(() => Convert.ToChar(DateTime.Now) ), L<DateTime,Char>(p0 => Sql.ConvertTo<Char>.From(p0) ) },
+#endif
+				{ M(() => Convert.ToChar((Decimal) 0)  ), L<Decimal, Char>(p0 => Sql.ConvertTo<Char>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToChar((Double)  0)  ), L<Double,  Char>(p0 => Sql.ConvertTo<Char>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToChar((Int16)   0)  ), L<Int16,   Char>(p0 => Sql.ConvertTo<Char>.From(p0) ) },
+				{ M(() => Convert.ToChar((Int32)   0)  ), L<Int32,   Char>(p0 => Sql.ConvertTo<Char>.From(p0) ) },
+				{ M(() => Convert.ToChar((Int64)   0)  ), L<Int64,   Char>(p0 => Sql.ConvertTo<Char>.From(p0) ) },
+				{ M(() => Convert.ToChar((Object)  0)  ), L<Object,  Char>(p0 => Sql.ConvertTo<Char>.From(p0) ) },
+				{ M(() => Convert.ToChar((SByte)   0)  ), L<SByte,   Char>(p0 => Sql.ConvertTo<Char>.From(p0) ) },
+				{ M(() => Convert.ToChar((Single)  0)  ), L<Single,  Char>(p0 => Sql.ConvertTo<Char>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToChar((String) "0") ), L<String,  Char>(p0 => Sql.ConvertTo<Char>.From(p0) ) },
+				{ M(() => Convert.ToChar((UInt16)  0)  ), L<UInt16,  Char>(p0 => Sql.ConvertTo<Char>.From(p0) ) },
+				{ M(() => Convert.ToChar((UInt32)  0)  ), L<UInt32,  Char>(p0 => Sql.ConvertTo<Char>.From(p0) ) },
+				{ M(() => Convert.ToChar((UInt64)  0)  ), L<UInt64,  Char>(p0 => Sql.ConvertTo<Char>.From(p0) ) },
+
+				#endregion
+
+				#region ToDateTime
+
+				{ M(() => Convert.ToDateTime((Object)  0)  ), L<Object,  DateTime>(p0 => Sql.ConvertTo<DateTime>.From(p0) ) },
+				{ M(() => Convert.ToDateTime((String) "0") ), L<String,  DateTime>(p0 => Sql.ConvertTo<DateTime>.From(p0) ) },
+#if !SILVERLIGHT
+				{ M(() => Convert.ToDateTime((Boolean)true)), L<Boolean, DateTime>(p0 => Sql.ConvertTo<DateTime>.From(p0) ) },
+				{ M(() => Convert.ToDateTime((Byte)    0)  ), L<Byte,    DateTime>(p0 => Sql.ConvertTo<DateTime>.From(p0) ) },
+				{ M(() => Convert.ToDateTime((Char)   '0') ), L<Char,    DateTime>(p0 => Sql.ConvertTo<DateTime>.From(p0) ) },
+				{ M(() => Convert.ToDateTime(DateTime.Now) ), L<DateTime,DateTime>(p0 => p0                           ) },
+				{ M(() => Convert.ToDateTime((Decimal) 0)  ), L<Decimal, DateTime>(p0 => Sql.ConvertTo<DateTime>.From(p0) ) },
+				{ M(() => Convert.ToDateTime((Double)  0)  ), L<Double,  DateTime>(p0 => Sql.ConvertTo<DateTime>.From(p0) ) },
+				{ M(() => Convert.ToDateTime((Int16)   0)  ), L<Int16,   DateTime>(p0 => Sql.ConvertTo<DateTime>.From(p0) ) },
+				{ M(() => Convert.ToDateTime((Int32)   0)  ), L<Int32,   DateTime>(p0 => Sql.ConvertTo<DateTime>.From(p0) ) },
+				{ M(() => Convert.ToDateTime((Int64)   0)  ), L<Int64,   DateTime>(p0 => Sql.ConvertTo<DateTime>.From(p0) ) },
+				{ M(() => Convert.ToDateTime((SByte)   0)  ), L<SByte,   DateTime>(p0 => Sql.ConvertTo<DateTime>.From(p0) ) },
+				{ M(() => Convert.ToDateTime((Single)  0)  ), L<Single,  DateTime>(p0 => Sql.ConvertTo<DateTime>.From(p0) ) },
+				{ M(() => Convert.ToDateTime((UInt16)  0)  ), L<UInt16,  DateTime>(p0 => Sql.ConvertTo<DateTime>.From(p0) ) },
+				{ M(() => Convert.ToDateTime((UInt32)  0)  ), L<UInt32,  DateTime>(p0 => Sql.ConvertTo<DateTime>.From(p0) ) },
+				{ M(() => Convert.ToDateTime((UInt64)  0)  ), L<UInt64,  DateTime>(p0 => Sql.ConvertTo<DateTime>.From(p0) ) },
+#endif
+
+				#endregion
+
+				#region ToDecimal
+
+				{ M(() => Convert.ToDecimal((Boolean)true)), L<Boolean, Decimal>(p0 => Sql.ConvertTo<Decimal>.From(p0) ) },
+				{ M(() => Convert.ToDecimal((Byte)    0)  ), L<Byte,    Decimal>(p0 => Sql.ConvertTo<Decimal>.From(p0) ) },
+				{ M(() => Convert.ToDecimal((Char)   '0') ), L<Char,    Decimal>(p0 => Sql.ConvertTo<Decimal>.From(p0) ) },
+				{ M(() => Convert.ToDecimal(DateTime.Now) ), L<DateTime,Decimal>(p0 => Sql.ConvertTo<Decimal>.From(p0) ) },
+				{ M(() => Convert.ToDecimal((Decimal) 0)  ), L<Decimal, Decimal>(p0 => Sql.ConvertTo<Decimal>.From(p0) ) },
+				{ M(() => Convert.ToDecimal((Double)  0)  ), L<Double,  Decimal>(p0 => Sql.ConvertTo<Decimal>.From(p0) ) },
+				{ M(() => Convert.ToDecimal((Int16)   0)  ), L<Int16,   Decimal>(p0 => Sql.ConvertTo<Decimal>.From(p0) ) },
+				{ M(() => Convert.ToDecimal((Int32)   0)  ), L<Int32,   Decimal>(p0 => Sql.ConvertTo<Decimal>.From(p0) ) },
+				{ M(() => Convert.ToDecimal((Int64)   0)  ), L<Int64,   Decimal>(p0 => Sql.ConvertTo<Decimal>.From(p0) ) },
+				{ M(() => Convert.ToDecimal((Object)  0)  ), L<Object,  Decimal>(p0 => Sql.ConvertTo<Decimal>.From(p0) ) },
+				{ M(() => Convert.ToDecimal((SByte)   0)  ), L<SByte,   Decimal>(p0 => Sql.ConvertTo<Decimal>.From(p0) ) },
+				{ M(() => Convert.ToDecimal((Single)  0)  ), L<Single,  Decimal>(p0 => Sql.ConvertTo<Decimal>.From(p0) ) },
+				{ M(() => Convert.ToDecimal((String) "0") ), L<String,  Decimal>(p0 => Sql.ConvertTo<Decimal>.From(p0) ) },
+				{ M(() => Convert.ToDecimal((UInt16)  0)  ), L<UInt16,  Decimal>(p0 => Sql.ConvertTo<Decimal>.From(p0) ) },
+				{ M(() => Convert.ToDecimal((UInt32)  0)  ), L<UInt32,  Decimal>(p0 => Sql.ConvertTo<Decimal>.From(p0) ) },
+				{ M(() => Convert.ToDecimal((UInt64)  0)  ), L<UInt64,  Decimal>(p0 => Sql.ConvertTo<Decimal>.From(p0) ) },
+
+				#endregion
+
+				#region ToDouble
+
+				{ M(() => Convert.ToDouble((Boolean)true)), L<Boolean, Double>(p0 => Sql.ConvertTo<Double>.From(p0) ) },
+				{ M(() => Convert.ToDouble((Byte)    0)  ), L<Byte,    Double>(p0 => Sql.ConvertTo<Double>.From(p0) ) },
+				{ M(() => Convert.ToDouble((Char)   '0') ), L<Char,    Double>(p0 => Sql.ConvertTo<Double>.From(p0) ) },
+#if !SILVERLIGHT
+				{ M(() => Convert.ToDouble(DateTime.Now) ), L<DateTime,Double>(p0 => Sql.ConvertTo<Double>.From(p0) ) },
+#endif
+				{ M(() => Convert.ToDouble((Decimal) 0)  ), L<Decimal, Double>(p0 => Sql.ConvertTo<Double>.From(p0) ) },
+				{ M(() => Convert.ToDouble((Double)  0)  ), L<Double,  Double>(p0 => Sql.ConvertTo<Double>.From(p0) ) },
+				{ M(() => Convert.ToDouble((Int16)   0)  ), L<Int16,   Double>(p0 => Sql.ConvertTo<Double>.From(p0) ) },
+				{ M(() => Convert.ToDouble((Int32)   0)  ), L<Int32,   Double>(p0 => Sql.ConvertTo<Double>.From(p0) ) },
+				{ M(() => Convert.ToDouble((Int64)   0)  ), L<Int64,   Double>(p0 => Sql.ConvertTo<Double>.From(p0) ) },
+				{ M(() => Convert.ToDouble((Object)  0)  ), L<Object,  Double>(p0 => Sql.ConvertTo<Double>.From(p0) ) },
+				{ M(() => Convert.ToDouble((SByte)   0)  ), L<SByte,   Double>(p0 => Sql.ConvertTo<Double>.From(p0) ) },
+				{ M(() => Convert.ToDouble((Single)  0)  ), L<Single,  Double>(p0 => Sql.ConvertTo<Double>.From(p0) ) },
+				{ M(() => Convert.ToDouble((String) "0") ), L<String,  Double>(p0 => Sql.ConvertTo<Double>.From(p0) ) },
+				{ M(() => Convert.ToDouble((UInt16)  0)  ), L<UInt16,  Double>(p0 => Sql.ConvertTo<Double>.From(p0) ) },
+				{ M(() => Convert.ToDouble((UInt32)  0)  ), L<UInt32,  Double>(p0 => Sql.ConvertTo<Double>.From(p0) ) },
+				{ M(() => Convert.ToDouble((UInt64)  0)  ), L<UInt64,  Double>(p0 => Sql.ConvertTo<Double>.From(p0) ) },
+
+				#endregion
+
+				#region ToInt64
+
+				{ M(() => Convert.ToInt64((Boolean)true)), L<Boolean, Int64>(p0 => Sql.ConvertTo<Int64>.From(p0) ) },
+				{ M(() => Convert.ToInt64((Byte)    0)  ), L<Byte,    Int64>(p0 => Sql.ConvertTo<Int64>.From(p0) ) },
+				{ M(() => Convert.ToInt64((Char)   '0') ), L<Char,    Int64>(p0 => Sql.ConvertTo<Int64>.From(p0) ) },
+#if !SILVERLIGHT
+				{ M(() => Convert.ToInt64(DateTime.Now) ), L<DateTime,Int64>(p0 => Sql.ConvertTo<Int64>.From(p0) ) },
+#endif
+				{ M(() => Convert.ToInt64((Decimal) 0)  ), L<Decimal, Int64>(p0 => Sql.ConvertTo<Int64>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToInt64((Double)  0)  ), L<Double,  Int64>(p0 => Sql.ConvertTo<Int64>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToInt64((Int16)   0)  ), L<Int16,   Int64>(p0 => Sql.ConvertTo<Int64>.From(p0) ) },
+				{ M(() => Convert.ToInt64((Int32)   0)  ), L<Int32,   Int64>(p0 => Sql.ConvertTo<Int64>.From(p0) ) },
+				{ M(() => Convert.ToInt64((Int64)   0)  ), L<Int64,   Int64>(p0 => Sql.ConvertTo<Int64>.From(p0) ) },
+				{ M(() => Convert.ToInt64((Object)  0)  ), L<Object,  Int64>(p0 => Sql.ConvertTo<Int64>.From(p0) ) },
+				{ M(() => Convert.ToInt64((SByte)   0)  ), L<SByte,   Int64>(p0 => Sql.ConvertTo<Int64>.From(p0) ) },
+				{ M(() => Convert.ToInt64((Single)  0)  ), L<Single,  Int64>(p0 => Sql.ConvertTo<Int64>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToInt64((String) "0") ), L<String,  Int64>(p0 => Sql.ConvertTo<Int64>.From(p0) ) },
+				{ M(() => Convert.ToInt64((UInt16)  0)  ), L<UInt16,  Int64>(p0 => Sql.ConvertTo<Int64>.From(p0) ) },
+				{ M(() => Convert.ToInt64((UInt32)  0)  ), L<UInt32,  Int64>(p0 => Sql.ConvertTo<Int64>.From(p0) ) },
+				{ M(() => Convert.ToInt64((UInt64)  0)  ), L<UInt64,  Int64>(p0 => Sql.ConvertTo<Int64>.From(p0) ) },
+
+				#endregion
+
+				#region ToInt32
+
+				{ M(() => Convert.ToInt32((Boolean)true)), L<Boolean, Int32>(p0 => Sql.ConvertTo<Int32>.From(p0) ) },
+				{ M(() => Convert.ToInt32((Byte)    0)  ), L<Byte,    Int32>(p0 => Sql.ConvertTo<Int32>.From(p0) ) },
+				{ M(() => Convert.ToInt32((Char)   '0') ), L<Char,    Int32>(p0 => Sql.ConvertTo<Int32>.From(p0) ) },
+#if !SILVERLIGHT
+				{ M(() => Convert.ToInt32(DateTime.Now) ), L<DateTime,Int32>(p0 => Sql.ConvertTo<Int32>.From(p0) ) },
+#endif
+				{ M(() => Convert.ToInt32((Decimal) 0)  ), L<Decimal, Int32>(p0 => Sql.ConvertTo<Int32>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToInt32((Double)  0)  ), L<Double,  Int32>(p0 => Sql.ConvertTo<Int32>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToInt32((Int16)   0)  ), L<Int16,   Int32>(p0 => Sql.ConvertTo<Int32>.From(p0) ) },
+				{ M(() => Convert.ToInt32((Int32)   0)  ), L<Int32,   Int32>(p0 => Sql.ConvertTo<Int32>.From(p0) ) },
+				{ M(() => Convert.ToInt32((Int64)   0)  ), L<Int64,   Int32>(p0 => Sql.ConvertTo<Int32>.From(p0) ) },
+				{ M(() => Convert.ToInt32((Object)  0)  ), L<Object,  Int32>(p0 => Sql.ConvertTo<Int32>.From(p0) ) },
+				{ M(() => Convert.ToInt32((SByte)   0)  ), L<SByte,   Int32>(p0 => Sql.ConvertTo<Int32>.From(p0) ) },
+				{ M(() => Convert.ToInt32((Single)  0)  ), L<Single,  Int32>(p0 => Sql.ConvertTo<Int32>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToInt32((String) "0") ), L<String,  Int32>(p0 => Sql.ConvertTo<Int32>.From(p0) ) },
+				{ M(() => Convert.ToInt32((UInt16)  0)  ), L<UInt16,  Int32>(p0 => Sql.ConvertTo<Int32>.From(p0) ) },
+				{ M(() => Convert.ToInt32((UInt32)  0)  ), L<UInt32,  Int32>(p0 => Sql.ConvertTo<Int32>.From(p0) ) },
+				{ M(() => Convert.ToInt32((UInt64)  0)  ), L<UInt64,  Int32>(p0 => Sql.ConvertTo<Int32>.From(p0) ) },
+
+				#endregion
+
+				#region ToInt16
+
+				{ M(() => Convert.ToInt16((Boolean)true)), L<Boolean, Int16>(p0 => Sql.ConvertTo<Int16>.From(p0) ) },
+				{ M(() => Convert.ToInt16((Byte)    0)  ), L<Byte,    Int16>(p0 => Sql.ConvertTo<Int16>.From(p0) ) },
+				{ M(() => Convert.ToInt16((Char)   '0') ), L<Char,    Int16>(p0 => Sql.ConvertTo<Int16>.From(p0) ) },
+#if !SILVERLIGHT
+				{ M(() => Convert.ToInt16(DateTime.Now) ), L<DateTime,Int16>(p0 => Sql.ConvertTo<Int16>.From(p0) ) },
+#endif
+				{ M(() => Convert.ToInt16((Decimal) 0)  ), L<Decimal, Int16>(p0 => Sql.ConvertTo<Int16>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToInt16((Double)  0)  ), L<Double,  Int16>(p0 => Sql.ConvertTo<Int16>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToInt16((Int16)   0)  ), L<Int16,   Int16>(p0 => Sql.ConvertTo<Int16>.From(p0) ) },
+				{ M(() => Convert.ToInt16((Int32)   0)  ), L<Int32,   Int16>(p0 => Sql.ConvertTo<Int16>.From(p0) ) },
+				{ M(() => Convert.ToInt16((Int64)   0)  ), L<Int64,   Int16>(p0 => Sql.ConvertTo<Int16>.From(p0) ) },
+				{ M(() => Convert.ToInt16((Object)  0)  ), L<Object,  Int16>(p0 => Sql.ConvertTo<Int16>.From(p0) ) },
+				{ M(() => Convert.ToInt16((SByte)   0)  ), L<SByte,   Int16>(p0 => Sql.ConvertTo<Int16>.From(p0) ) },
+				{ M(() => Convert.ToInt16((Single)  0)  ), L<Single,  Int16>(p0 => Sql.ConvertTo<Int16>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToInt16((String) "0") ), L<String,  Int16>(p0 => Sql.ConvertTo<Int16>.From(p0) ) },
+				{ M(() => Convert.ToInt16((UInt16)  0)  ), L<UInt16,  Int16>(p0 => Sql.ConvertTo<Int16>.From(p0) ) },
+				{ M(() => Convert.ToInt16((UInt32)  0)  ), L<UInt32,  Int16>(p0 => Sql.ConvertTo<Int16>.From(p0) ) },
+				{ M(() => Convert.ToInt16((UInt64)  0)  ), L<UInt64,  Int16>(p0 => Sql.ConvertTo<Int16>.From(p0) ) },
+
+				#endregion
+
+				#region ToSByte
+
+				{ M(() => Convert.ToSByte((Boolean)true)), L<Boolean, SByte>(p0 => Sql.ConvertTo<SByte>.From(p0) ) },
+				{ M(() => Convert.ToSByte((Byte)    0)  ), L<Byte,    SByte>(p0 => Sql.ConvertTo<SByte>.From(p0) ) },
+				{ M(() => Convert.ToSByte((Char)   '0') ), L<Char,    SByte>(p0 => Sql.ConvertTo<SByte>.From(p0) ) },
+#if !SILVERLIGHT
+				{ M(() => Convert.ToSByte(DateTime.Now) ), L<DateTime,SByte>(p0 => Sql.ConvertTo<SByte>.From(p0) ) },
+#endif
+				{ M(() => Convert.ToSByte((Decimal) 0)  ), L<Decimal, SByte>(p0 => Sql.ConvertTo<SByte>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToSByte((Double)  0)  ), L<Double,  SByte>(p0 => Sql.ConvertTo<SByte>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToSByte((Int16)   0)  ), L<Int16,   SByte>(p0 => Sql.ConvertTo<SByte>.From(p0) ) },
+				{ M(() => Convert.ToSByte((Int32)   0)  ), L<Int32,   SByte>(p0 => Sql.ConvertTo<SByte>.From(p0) ) },
+				{ M(() => Convert.ToSByte((Int64)   0)  ), L<Int64,   SByte>(p0 => Sql.ConvertTo<SByte>.From(p0) ) },
+				{ M(() => Convert.ToSByte((Object)  0)  ), L<Object,  SByte>(p0 => Sql.ConvertTo<SByte>.From(p0) ) },
+				{ M(() => Convert.ToSByte((SByte)   0)  ), L<SByte,   SByte>(p0 => Sql.ConvertTo<SByte>.From(p0) ) },
+				{ M(() => Convert.ToSByte((Single)  0)  ), L<Single,  SByte>(p0 => Sql.ConvertTo<SByte>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToSByte((String) "0") ), L<String,  SByte>(p0 => Sql.ConvertTo<SByte>.From(p0) ) },
+				{ M(() => Convert.ToSByte((UInt16)  0)  ), L<UInt16,  SByte>(p0 => Sql.ConvertTo<SByte>.From(p0) ) },
+				{ M(() => Convert.ToSByte((UInt32)  0)  ), L<UInt32,  SByte>(p0 => Sql.ConvertTo<SByte>.From(p0) ) },
+				{ M(() => Convert.ToSByte((UInt64)  0)  ), L<UInt64,  SByte>(p0 => Sql.ConvertTo<SByte>.From(p0) ) },
+
+				#endregion
+
+				#region ToSingle
+
+				{ M(() => Convert.ToSingle((Boolean)true)), L<Boolean, Single>(p0 => Sql.ConvertTo<Single>.From(p0) ) },
+				{ M(() => Convert.ToSingle((Byte)    0)  ), L<Byte,    Single>(p0 => Sql.ConvertTo<Single>.From(p0) ) },
+				{ M(() => Convert.ToSingle((Char)   '0') ), L<Char,    Single>(p0 => Sql.ConvertTo<Single>.From(p0) ) },
+#if !SILVERLIGHT
+				{ M(() => Convert.ToSingle(DateTime.Now) ), L<DateTime,Single>(p0 => Sql.ConvertTo<Single>.From(p0) ) },
+#endif
+				{ M(() => Convert.ToSingle((Decimal) 0)  ), L<Decimal, Single>(p0 => Sql.ConvertTo<Single>.From(p0) ) },
+				{ M(() => Convert.ToSingle((Double)  0)  ), L<Double,  Single>(p0 => Sql.ConvertTo<Single>.From(p0) ) },
+				{ M(() => Convert.ToSingle((Int16)   0)  ), L<Int16,   Single>(p0 => Sql.ConvertTo<Single>.From(p0) ) },
+				{ M(() => Convert.ToSingle((Int32)   0)  ), L<Int32,   Single>(p0 => Sql.ConvertTo<Single>.From(p0) ) },
+				{ M(() => Convert.ToSingle((Int64)   0)  ), L<Int64,   Single>(p0 => Sql.ConvertTo<Single>.From(p0) ) },
+				{ M(() => Convert.ToSingle((Object)  0)  ), L<Object,  Single>(p0 => Sql.ConvertTo<Single>.From(p0) ) },
+				{ M(() => Convert.ToSingle((SByte)   0)  ), L<SByte,   Single>(p0 => Sql.ConvertTo<Single>.From(p0) ) },
+				{ M(() => Convert.ToSingle((Single)  0)  ), L<Single,  Single>(p0 => Sql.ConvertTo<Single>.From(p0) ) },
+				{ M(() => Convert.ToSingle((String) "0") ), L<String,  Single>(p0 => Sql.ConvertTo<Single>.From(p0) ) },
+				{ M(() => Convert.ToSingle((UInt16)  0)  ), L<UInt16,  Single>(p0 => Sql.ConvertTo<Single>.From(p0) ) },
+				{ M(() => Convert.ToSingle((UInt32)  0)  ), L<UInt32,  Single>(p0 => Sql.ConvertTo<Single>.From(p0) ) },
+				{ M(() => Convert.ToSingle((UInt64)  0)  ), L<UInt64,  Single>(p0 => Sql.ConvertTo<Single>.From(p0) ) },
+
+				#endregion
+
+				#region ToString
+
+				{ M(() => Convert.ToString((Boolean)true)), L<Boolean, String>(p0 => Sql.ConvertTo<String>.From(p0) ) },
+				{ M(() => Convert.ToString((Byte)    0)  ), L<Byte,    String>(p0 => Sql.ConvertTo<String>.From(p0) ) },
+				{ M(() => Convert.ToString((Char)   '0') ), L<Char,    String>(p0 => Sql.ConvertTo<String>.From(p0) ) },
+				{ M(() => Convert.ToString(DateTime.Now) ), L<DateTime,String>(p0 => Sql.ConvertTo<String>.From(p0) ) },
+				{ M(() => Convert.ToString((Decimal) 0)  ), L<Decimal, String>(p0 => Sql.ConvertTo<String>.From(p0) ) },
+				{ M(() => Convert.ToString((Double)  0)  ), L<Double,  String>(p0 => Sql.ConvertTo<String>.From(p0) ) },
+				{ M(() => Convert.ToString((Int16)   0)  ), L<Int16,   String>(p0 => Sql.ConvertTo<String>.From(p0) ) },
+				{ M(() => Convert.ToString((Int32)   0)  ), L<Int32,   String>(p0 => Sql.ConvertTo<String>.From(p0) ) },
+				{ M(() => Convert.ToString((Int64)   0)  ), L<Int64,   String>(p0 => Sql.ConvertTo<String>.From(p0) ) },
+				{ M(() => Convert.ToString((Object)  0)  ), L<Object,  String>(p0 => Sql.ConvertTo<String>.From(p0) ) },
+				{ M(() => Convert.ToString((SByte)   0)  ), L<SByte,   String>(p0 => Sql.ConvertTo<String>.From(p0) ) },
+				{ M(() => Convert.ToString((Single)  0)  ), L<Single,  String>(p0 => Sql.ConvertTo<String>.From(p0) ) },
+#if !SILVERLIGHT
+				{ M(() => Convert.ToString((String) "0") ), L<String,  String>(p0 => p0                         ) },
+#endif
+				{ M(() => Convert.ToString((UInt16)  0)  ), L<UInt16,  String>(p0 => Sql.ConvertTo<String>.From(p0) ) },
+				{ M(() => Convert.ToString((UInt32)  0)  ), L<UInt32,  String>(p0 => Sql.ConvertTo<String>.From(p0) ) },
+				{ M(() => Convert.ToString((UInt64)  0)  ), L<UInt64,  String>(p0 => Sql.ConvertTo<String>.From(p0) ) },
+
+				#endregion
+
+				#region ToInt16
+
+				{ M(() => Convert.ToUInt16((Boolean)true)), L<Boolean, UInt16>(p0 => Sql.ConvertTo<UInt16>.From(p0) ) },
+				{ M(() => Convert.ToUInt16((Byte)    0)  ), L<Byte,    UInt16>(p0 => Sql.ConvertTo<UInt16>.From(p0) ) },
+				{ M(() => Convert.ToUInt16((Char)   '0') ), L<Char,    UInt16>(p0 => Sql.ConvertTo<UInt16>.From(p0) ) },
+#if !SILVERLIGHT
+				{ M(() => Convert.ToUInt16(DateTime.Now) ), L<DateTime,UInt16>(p0 => Sql.ConvertTo<UInt16>.From(p0) ) },
+#endif
+				{ M(() => Convert.ToUInt16((Decimal) 0)  ), L<Decimal, UInt16>(p0 => Sql.ConvertTo<UInt16>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToUInt16((Double)  0)  ), L<Double,  UInt16>(p0 => Sql.ConvertTo<UInt16>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToUInt16((Int16)   0)  ), L<Int16,   UInt16>(p0 => Sql.ConvertTo<UInt16>.From(p0) ) },
+				{ M(() => Convert.ToUInt16((Int32)   0)  ), L<Int32,   UInt16>(p0 => Sql.ConvertTo<UInt16>.From(p0) ) },
+				{ M(() => Convert.ToUInt16((Int64)   0)  ), L<Int64,   UInt16>(p0 => Sql.ConvertTo<UInt16>.From(p0) ) },
+				{ M(() => Convert.ToUInt16((Object)  0)  ), L<Object,  UInt16>(p0 => Sql.ConvertTo<UInt16>.From(p0) ) },
+				{ M(() => Convert.ToUInt16((SByte)   0)  ), L<SByte,   UInt16>(p0 => Sql.ConvertTo<UInt16>.From(p0) ) },
+				{ M(() => Convert.ToUInt16((Single)  0)  ), L<Single,  UInt16>(p0 => Sql.ConvertTo<UInt16>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToUInt16((String) "0") ), L<String,  UInt16>(p0 => Sql.ConvertTo<UInt16>.From(p0) ) },
+				{ M(() => Convert.ToUInt16((UInt16)  0)  ), L<UInt16,  UInt16>(p0 => Sql.ConvertTo<UInt16>.From(p0) ) },
+				{ M(() => Convert.ToUInt16((UInt32)  0)  ), L<UInt32,  UInt16>(p0 => Sql.ConvertTo<UInt16>.From(p0) ) },
+				{ M(() => Convert.ToUInt16((UInt64)  0)  ), L<UInt64,  UInt16>(p0 => Sql.ConvertTo<UInt16>.From(p0) ) },
+
+				#endregion
+
+				#region ToInt32
+
+				{ M(() => Convert.ToUInt32((Boolean)true)), L<Boolean, UInt32>(p0 => Sql.ConvertTo<UInt32>.From(p0) ) },
+				{ M(() => Convert.ToUInt32((Byte)    0)  ), L<Byte,    UInt32>(p0 => Sql.ConvertTo<UInt32>.From(p0) ) },
+				{ M(() => Convert.ToUInt32((Char)   '0') ), L<Char,    UInt32>(p0 => Sql.ConvertTo<UInt32>.From(p0) ) },
+#if !SILVERLIGHT
+				{ M(() => Convert.ToUInt32(DateTime.Now) ), L<DateTime,UInt32>(p0 => Sql.ConvertTo<UInt32>.From(p0) ) },
+#endif
+				{ M(() => Convert.ToUInt32((Decimal) 0)  ), L<Decimal, UInt32>(p0 => Sql.ConvertTo<UInt32>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToUInt32((Double)  0)  ), L<Double,  UInt32>(p0 => Sql.ConvertTo<UInt32>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToUInt32((Int16)   0)  ), L<Int16,   UInt32>(p0 => Sql.ConvertTo<UInt32>.From(p0) ) },
+				{ M(() => Convert.ToUInt32((Int32)   0)  ), L<Int32,   UInt32>(p0 => Sql.ConvertTo<UInt32>.From(p0) ) },
+				{ M(() => Convert.ToUInt32((Int64)   0)  ), L<Int64,   UInt32>(p0 => Sql.ConvertTo<UInt32>.From(p0) ) },
+				{ M(() => Convert.ToUInt32((Object)  0)  ), L<Object,  UInt32>(p0 => Sql.ConvertTo<UInt32>.From(p0) ) },
+				{ M(() => Convert.ToUInt32((SByte)   0)  ), L<SByte,   UInt32>(p0 => Sql.ConvertTo<UInt32>.From(p0) ) },
+				{ M(() => Convert.ToUInt32((Single)  0)  ), L<Single,  UInt32>(p0 => Sql.ConvertTo<UInt32>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToUInt32((String) "0") ), L<String,  UInt32>(p0 => Sql.ConvertTo<UInt32>.From(p0) ) },
+				{ M(() => Convert.ToUInt32((UInt16)  0)  ), L<UInt16,  UInt32>(p0 => Sql.ConvertTo<UInt32>.From(p0) ) },
+				{ M(() => Convert.ToUInt32((UInt32)  0)  ), L<UInt32,  UInt32>(p0 => Sql.ConvertTo<UInt32>.From(p0) ) },
+				{ M(() => Convert.ToUInt32((UInt64)  0)  ), L<UInt64,  UInt32>(p0 => Sql.ConvertTo<UInt32>.From(p0) ) },
+
+				#endregion
+
+				#region ToUInt64
+
+				{ M(() => Convert.ToUInt64((Boolean)true)), L<Boolean, UInt64>(p0 => Sql.ConvertTo<UInt64>.From(p0) ) },
+				{ M(() => Convert.ToUInt64((Byte)    0)  ), L<Byte,    UInt64>(p0 => Sql.ConvertTo<UInt64>.From(p0) ) },
+				{ M(() => Convert.ToUInt64((Char)   '0') ), L<Char,    UInt64>(p0 => Sql.ConvertTo<UInt64>.From(p0) ) },
+#if !SILVERLIGHT
+				{ M(() => Convert.ToUInt64(DateTime.Now) ), L<DateTime,UInt64>(p0 => Sql.ConvertTo<UInt64>.From(p0) ) },
+#endif
+				{ M(() => Convert.ToUInt64((Decimal) 0)  ), L<Decimal, UInt64>(p0 => Sql.ConvertTo<UInt64>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToUInt64((Double)  0)  ), L<Double,  UInt64>(p0 => Sql.ConvertTo<UInt64>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToUInt64((Int16)   0)  ), L<Int16,   UInt64>(p0 => Sql.ConvertTo<UInt64>.From(p0) ) },
+				{ M(() => Convert.ToUInt64((Int32)   0)  ), L<Int32,   UInt64>(p0 => Sql.ConvertTo<UInt64>.From(p0) ) },
+				{ M(() => Convert.ToUInt64((Int64)   0)  ), L<Int64,   UInt64>(p0 => Sql.ConvertTo<UInt64>.From(p0) ) },
+				{ M(() => Convert.ToUInt64((Object)  0)  ), L<Object,  UInt64>(p0 => Sql.ConvertTo<UInt64>.From(p0) ) },
+				{ M(() => Convert.ToUInt64((SByte)   0)  ), L<SByte,   UInt64>(p0 => Sql.ConvertTo<UInt64>.From(p0) ) },
+				{ M(() => Convert.ToUInt64((Single)  0)  ), L<Single,  UInt64>(p0 => Sql.ConvertTo<UInt64>.From(Sql.RoundToEven(p0)) ) },
+				{ M(() => Convert.ToUInt64((String) "0") ), L<String,  UInt64>(p0 => Sql.ConvertTo<UInt64>.From(p0) ) },
+				{ M(() => Convert.ToUInt64((UInt16)  0)  ), L<UInt16,  UInt64>(p0 => Sql.ConvertTo<UInt64>.From(p0) ) },
+				{ M(() => Convert.ToUInt64((UInt32)  0)  ), L<UInt32,  UInt64>(p0 => Sql.ConvertTo<UInt64>.From(p0) ) },
+				{ M(() => Convert.ToUInt64((UInt64)  0)  ), L<UInt64,  UInt64>(p0 => Sql.ConvertTo<UInt64>.From(p0) ) },
+
+				#endregion
+
+				#endregion
+
+				#region Math
+
+				{ M(() => Math.Abs    ((Decimal)0)), L<Decimal,Decimal>(p => Sql.Abs(p).Value ) },
+				{ M(() => Math.Abs    ((Double) 0)), L<Double, Double> (p => Sql.Abs(p).Value ) },
+				{ M(() => Math.Abs    ((Int16)  0)), L<Int16,  Int16>  (p => Sql.Abs(p).Value ) },
+				{ M(() => Math.Abs    ((Int32)  0)), L<Int32,  Int32>  (p => Sql.Abs(p).Value ) },
+				{ M(() => Math.Abs    ((Int64)  0)), L<Int64,  Int64>  (p => Sql.Abs(p).Value ) },
+				{ M(() => Math.Abs    ((SByte)  0)), L<SByte,  SByte>  (p => Sql.Abs(p).Value ) },
+				{ M(() => Math.Abs    ((Single) 0)), L<Single, Single> (p => Sql.Abs(p).Value ) },
+
+				{ M(() => Math.Acos   (0)   ), L<F,F>  ( p    => Sql.Acos   (p)   .Value ) },
+				{ M(() => Math.Asin   (0)   ), L<F,F>  ( p    => Sql.Asin   (p)   .Value ) },
+				{ M(() => Math.Atan   (0)   ), L<F,F>  ( p    => Sql.Atan   (p)   .Value ) },
+				{ M(() => Math.Atan2  (0,0) ), L<F,F,F>((x,y) => Sql.Atan2  (x, y).Value ) },
+#if !SILVERLIGHT
+				{ M(() => Math.Ceiling((M)0)), L<M,M>  ( p    => Sql.Ceiling(p)   .Value ) },
+#endif
+				{ M(() => Math.Ceiling((F)0)), L<F,F>  ( p    => Sql.Ceiling(p)   .Value ) },
+				{ M(() => Math.Cos    (0)   ), L<F,F>  ( p    => Sql.Cos    (p)   .Value ) },
+				{ M(() => Math.Cosh   (0)   ), L<F,F>  ( p    => Sql.Cosh   (p)   .Value ) },
+				{ M(() => Math.Exp    (0)   ), L<F,F>  ( p    => Sql.Exp    (p)   .Value ) },
+#if !SILVERLIGHT
+				{ M(() => Math.Floor  ((M)0)), L<M,M>  ( p    => Sql.Floor  (p)   .Value ) },
+#endif
+				{ M(() => Math.Floor  ((F)0)), L<F,F>  ( p    => Sql.Floor  (p)   .Value ) },
+				{ M(() => Math.Log    (0)   ), L<F,F>  ( p    => Sql.Log    (p)   .Value ) },
+				{ M(() => Math.Log    (0,0) ), L<F,F,F>((m,n) => Sql.Log    (n, m).Value ) },
+				{ M(() => Math.Log10  (0)   ), L<F,F>  ( p    => Sql.Log10  (p)   .Value ) },
+
+				{ M(() => Math.Max((Byte)   0, (Byte)   0)), L<Byte,   Byte,   Byte>   ((v1,v2) => v1 > v2 ? v1 : v2) },
+				{ M(() => Math.Max((Decimal)0, (Decimal)0)), L<Decimal,Decimal,Decimal>((v1,v2) => v1 > v2 ? v1 : v2) },
+				{ M(() => Math.Max((Double) 0, (Double) 0)), L<Double, Double, Double> ((v1,v2) => v1 > v2 ? v1 : v2) },
+				{ M(() => Math.Max((Int16)  0, (Int16)  0)), L<Int16,  Int16,  Int16>  ((v1,v2) => v1 > v2 ? v1 : v2) },
+				{ M(() => Math.Max((Int32)  0, (Int32)  0)), L<Int32,  Int32,  Int32>  ((v1,v2) => v1 > v2 ? v1 : v2) },
+				{ M(() => Math.Max((Int64)  0, (Int64)  0)), L<Int64,  Int64,  Int64>  ((v1,v2) => v1 > v2 ? v1 : v2) },
+				{ M(() => Math.Max((SByte)  0, (SByte)  0)), L<SByte,  SByte,  SByte>  ((v1,v2) => v1 > v2 ? v1 : v2) },
+				{ M(() => Math.Max((Single) 0, (Single) 0)), L<Single, Single, Single> ((v1,v2) => v1 > v2 ? v1 : v2) },
+				{ M(() => Math.Max((UInt16) 0, (UInt16) 0)), L<UInt16, UInt16, UInt16> ((v1,v2) => v1 > v2 ? v1 : v2) },
+				{ M(() => Math.Max((UInt32) 0, (UInt32) 0)), L<UInt32, UInt32, UInt32> ((v1,v2) => v1 > v2 ? v1 : v2) },
+				{ M(() => Math.Max((UInt64) 0, (UInt64) 0)), L<UInt64, UInt64, UInt64> ((v1,v2) => v1 > v2 ? v1 : v2) },
+
+				{ M(() => Math.Min((Byte)   0, (Byte)   0)), L<Byte,   Byte,   Byte>   ((v1,v2) => v1 < v2 ? v1 : v2) },
+				{ M(() => Math.Min((Decimal)0, (Decimal)0)), L<Decimal,Decimal,Decimal>((v1,v2) => v1 < v2 ? v1 : v2) },
+				{ M(() => Math.Min((Double) 0, (Double) 0)), L<Double, Double, Double> ((v1,v2) => v1 < v2 ? v1 : v2) },
+				{ M(() => Math.Min((Int16)  0, (Int16)  0)), L<Int16,  Int16,  Int16>  ((v1,v2) => v1 < v2 ? v1 : v2) },
+				{ M(() => Math.Min((Int32)  0, (Int32)  0)), L<Int32,  Int32,  Int32>  ((v1,v2) => v1 < v2 ? v1 : v2) },
+				{ M(() => Math.Min((Int64)  0, (Int64)  0)), L<Int64,  Int64,  Int64>  ((v1,v2) => v1 < v2 ? v1 : v2) },
+				{ M(() => Math.Min((SByte)  0, (SByte)  0)), L<SByte,  SByte,  SByte>  ((v1,v2) => v1 < v2 ? v1 : v2) },
+				{ M(() => Math.Min((Single) 0, (Single) 0)), L<Single, Single, Single> ((v1,v2) => v1 < v2 ? v1 : v2) },
+				{ M(() => Math.Min((UInt16) 0, (UInt16) 0)), L<UInt16, UInt16, UInt16> ((v1,v2) => v1 < v2 ? v1 : v2) },
+				{ M(() => Math.Min((UInt32) 0, (UInt32) 0)), L<UInt32, UInt32, UInt32> ((v1,v2) => v1 < v2 ? v1 : v2) },
+				{ M(() => Math.Min((UInt64) 0, (UInt64) 0)), L<UInt64, UInt64, UInt64> ((v1,v2) => v1 < v2 ? v1 : v2) },
+
+				{ M(() => Math.Pow        (0,0)), L<F,F,F>((x,y) => Sql.Power(x, y).Value ) },
+
+				{ M(() => Sql.Round       (0m)  ), L<M?,M?>   ( d    => Sql.Round(d, 0)) },
+				{ M(() => Sql.Round       (0.0) ), L<F?,F?>   ( d    => Sql.Round(d, 0)) },
+
+				{ M(() => Sql.RoundToEven(0m)   ), L<M?,M?>   ( d    => d - Sql.Floor(d) == 0.5m && Sql.Floor(d) % 2 == 0? Sql.Floor(d) : Sql.Round(d)) },
+				{ M(() => Sql.RoundToEven(0.0)  ), L<F?,F?>   ( d    => d - Sql.Floor(d) == 0.5  && Sql.Floor(d) % 2 == 0? Sql.Floor(d) : Sql.Round(d)) },
+
+				{ M(() => Sql.RoundToEven(0m, 0)), L<M?,I?,M?>((d,n) => d * 2 == Sql.Round(d * 2, n) && d != Sql.Round(d, n) ? Sql.Round(d / 2, n) * 2 : Sql.Round(d, n)) },
+				{ M(() => Sql.RoundToEven(0.0,0)), L<F?,I?,F?>((d,n) => d * 2 == Sql.Round(d * 2, n) && d != Sql.Round(d, n) ? Sql.Round(d / 2, n) * 2 : Sql.Round(d, n)) },
+
+				{ M(() => Math.Round     (0m)   ), L<M,M>     ( d    => Sql.RoundToEven(d).Value ) },
+				{ M(() => Math.Round     (0.0)  ), L<F,F>     ( d    => Sql.RoundToEven(d).Value ) },
+
+				{ M(() => Math.Round     (0m, 0)), L<M,I,M>   ((d,n) => Sql.RoundToEven(d, n).Value ) },
+				{ M(() => Math.Round     (0.0,0)), L<F,I,F>   ((d,n) => Sql.RoundToEven(d, n).Value ) },
+
+#if !SILVERLIGHT
+				{ M(() => Math.Round (0m,    MidpointRounding.ToEven)), L<M,  MidpointRounding,M>((d,  p) => p == MidpointRounding.ToEven ? Sql.RoundToEven(d).  Value : Sql.Round(d).  Value ) },
+				{ M(() => Math.Round (0.0,   MidpointRounding.ToEven)), L<F,  MidpointRounding,F>((d,  p) => p == MidpointRounding.ToEven ? Sql.RoundToEven(d).  Value : Sql.Round(d).  Value ) },
+
+				{ M(() => Math.Round (0m, 0, MidpointRounding.ToEven)), L<M,I,MidpointRounding,M>((d,n,p) => p == MidpointRounding.ToEven ? Sql.RoundToEven(d,n).Value : Sql.Round(d,n).Value ) },
+				{ M(() => Math.Round (0.0,0, MidpointRounding.ToEven)), L<F,I,MidpointRounding,F>((d,n,p) => p == MidpointRounding.ToEven ? Sql.RoundToEven(d,n).Value : Sql.Round(d,n).Value ) },
+#endif
+
+				{ M(() => Math.Sign  ((Decimal)0)), L<Decimal,I>(p => Sql.Sign(p).Value ) },
+				{ M(() => Math.Sign  ((Double) 0)), L<Double, I>(p => Sql.Sign(p).Value ) },
+				{ M(() => Math.Sign  ((Int16)  0)), L<Int16,  I>(p => Sql.Sign(p).Value ) },
+				{ M(() => Math.Sign  ((Int32)  0)), L<Int32,  I>(p => Sql.Sign(p).Value ) },
+				{ M(() => Math.Sign  ((Int64)  0)), L<Int64,  I>(p => Sql.Sign(p).Value ) },
+				{ M(() => Math.Sign  ((SByte)  0)), L<SByte,  I>(p => Sql.Sign(p).Value ) },
+				{ M(() => Math.Sign  ((Single) 0)), L<Single, I>(p => Sql.Sign(p).Value ) },
+
+				{ M(() => Math.Sin   (0)), L<F,F>( p => Sql.Sin (p).Value ) },
+				{ M(() => Math.Sinh  (0)), L<F,F>( p => Sql.Sinh(p).Value ) },
+				{ M(() => Math.Sqrt  (0)), L<F,F>( p => Sql.Sqrt(p).Value ) },
+				{ M(() => Math.Tan   (0)), L<F,F>( p => Sql.Tan (p).Value ) },
+				{ M(() => Math.Tanh  (0)), L<F,F>( p => Sql.Tanh(p).Value ) },
+
+#if !SILVERLIGHT
+				{ M(() => Math.Truncate(0m)),  L<M,M>( p => Sql.Truncate(p).Value ) },
+				{ M(() => Math.Truncate(0.0)), L<F,F>( p => Sql.Truncate(p).Value ) },
+#endif
+
+				#endregion
+
+				#region Visual Basic Compiler Services
+
+//#if !SILVERLIGHT
+//				{ M(() => Operators.CompareString("","",false)), L<S,S,B,I>((s1,s2,b) => b ? string.CompareOrdinal(s1.ToUpper(), s2.ToUpper()) : string.CompareOrdinal(s1, s2)) },
+//#endif
+
+				#endregion
+
+			}},
+
+			#region MsSql2012
+
+			{ "MsSql2012", new Dictionary<MemberInfo,LambdaExpression> {
+				{ M(() => Sql.PadRight("",0,' ')),  L<S,I?,C,S>   ((p0,p1,p2) => p0.Length > p1 ? p0 : p0 + Replicate(p2, p1 - p0.Length)) },
+				{ M(() => Sql.PadLeft ("",0,' ')),  L<S,I?,C,S>   ((p0,p1,p2) => p0.Length > p1 ? p0 : Replicate(p2, p1 - p0.Length) + p0) },
+				{ M(() => Sql.Trim    ("")      ),  L<S,S>        ( p0        => Sql.TrimLeft(Sql.TrimRight(p0))) },
+				{ M(() => Sql.MakeDateTime(0,0,0)), L<I?,I?,I?,D?>((y,m,d)    => DateAdd(Sql.DateParts.Month, (y.Value - 1900) * 12 + m.Value - 1, d.Value - 1)) },
+
+				{ M(() => Sql.Cosh(0)   ), L<F?,F?>   ( v    => (Sql.Exp(v) + Sql.Exp(-v)) / 2) },
+				{ M(() => Sql.Log(0m, 0)), L<M?,M?,M?>((m,n) => Sql.Log(n) / Sql.Log(m)) },
+				{ M(() => Sql.Log(0.0,0)), L<F?,F?,F?>((m,n) => Sql.Log(n) / Sql.Log(m)) },
+				{ M(() => Sql.Sinh(0)   ), L<F?,F?>   ( v    => (Sql.Exp(v) - Sql.Exp(-v)) / 2) },
+				{ M(() => Sql.Tanh(0)   ), L<F?,F?>   ( v    => (Sql.Exp(v) - Sql.Exp(-v)) / (Sql.Exp(v) + Sql.Exp(-v))) },
+			}},
+
+			#endregion
+
+			#region MsSql2008
+
+			{ "MsSql2008", new Dictionary<MemberInfo,LambdaExpression> {
+				{ M(() => Sql.PadRight("",0,' ')),  L<S,I?,C,S>   ((p0,p1,p2) => p0.Length > p1 ? p0 : p0 + Replicate(p2, p1 - p0.Length)) },
+				{ M(() => Sql.PadLeft ("",0,' ')),  L<S,I?,C,S>   ((p0,p1,p2) => p0.Length > p1 ? p0 : Replicate(p2, p1 - p0.Length) + p0) },
+				{ M(() => Sql.Trim    ("")      ),  L<S,S>        ( p0        => Sql.TrimLeft(Sql.TrimRight(p0))) },
+				{ M(() => Sql.MakeDateTime(0,0,0)), L<I?,I?,I?,D?>((y,m,d)    => DateAdd(Sql.DateParts.Month, (y.Value - 1900) * 12 + m.Value - 1, d.Value - 1)) },
+
+				{ M(() => Sql.Cosh(0)   ), L<F?,F?>   ( v    => (Sql.Exp(v) + Sql.Exp(-v)) / 2) },
+				{ M(() => Sql.Log(0m, 0)), L<M?,M?,M?>((m,n) => Sql.Log(n) / Sql.Log(m)) },
+				{ M(() => Sql.Log(0.0,0)), L<F?,F?,F?>((m,n) => Sql.Log(n) / Sql.Log(m)) },
+				{ M(() => Sql.Sinh(0)   ), L<F?,F?>   ( v    => (Sql.Exp(v) - Sql.Exp(-v)) / 2) },
+				{ M(() => Sql.Tanh(0)   ), L<F?,F?>   ( v    => (Sql.Exp(v) - Sql.Exp(-v)) / (Sql.Exp(v) + Sql.Exp(-v))) },
+			}},
+
+			#endregion
+
+			#region MsSql2000
+
+			{ "MsSql2000", new Dictionary<MemberInfo,LambdaExpression> {
+				{ M(() => Sql.PadRight("",0,' ')),  L<S,I?,C,S>   ((p0,p1,p2) => p0.Length > p1 ? p0 : p0 + Replicate(p2, p1 - p0.Length)) },
+				{ M(() => Sql.PadLeft ("",0,' ')),  L<S,I?,C,S>   ((p0,p1,p2) => p0.Length > p1 ? p0 : Replicate(p2, p1 - p0.Length) + p0) },
+				{ M(() => Sql.Trim    ("")      ),  L<S,S>        ( p0        => Sql.TrimLeft(Sql.TrimRight(p0))) },
+				{ M(() => Sql.MakeDateTime(0,0,0)), L<I?,I?,I?,D?>((y,m,d)    => DateAdd(Sql.DateParts.Month, (y.Value - 1900) * 12 + m.Value - 1, d.Value - 1)) },
+				{ M(() => Sql.MakeDateTime(0, 0, 0, 0, 0, 0) ), L<I?,I?,I?,I?,I?,I?,D?>((y,m,d,h,mm,s) => Sql.Convert(Sql.DateTime2,
+					y.ToString() + "-" + m.ToString() + "-" + d.ToString() + " " +
+					h.ToString() + ":" + mm.ToString() + ":" + s.ToString(), 120)) },
+				{ M(() => Sql.Cosh(0)   ), L<F?,F?>   ( v    => (Sql.Exp(v) + Sql.Exp(-v)) / 2) },
+				{ M(() => Sql.Log(0m, 0)), L<M?,M?,M?>((m,n) => Sql.Log(n) / Sql.Log(m)) },
+				{ M(() => Sql.Log(0.0,0)), L<F?,F?,F?>((m,n) => Sql.Log(n) / Sql.Log(m)) },
+				{ M(() => Sql.Sinh(0)   ), L<F?,F?>   ( v    => (Sql.Exp(v) - Sql.Exp(-v)) / 2) },
+				{ M(() => Sql.Tanh(0)   ), L<F?,F?>   ( v    => (Sql.Exp(v) - Sql.Exp(-v)) / (Sql.Exp(v) + Sql.Exp(-v))) },
+
+				{ M(() => DateTime.Parse("")), L<String,DateTime>(p0 => Sql.ConvertTo<DateTime>.From(p0) ) },
+				{ M(() => Sql.RoundToEven(0m) ), L<M?,M?>(d => d - Sql.Floor(d) == 0.5m && (long)Sql.Floor(d) % 2 == 0? Sql.Floor(d) : Sql.Round(d)) },
+				{ M(() => Sql.RoundToEven(0.0)), L<F?,F?>(d => d - Sql.Floor(d) == 0.5  && (long)Sql.Floor(d) % 2 == 0? Sql.Floor(d) : Sql.Round(d)) },
+
+			}},
+
+			#endregion
+
+			#region MsSql2005
+
+			{ "MsSql2005", new Dictionary<MemberInfo,LambdaExpression> {
+				{ M(() => Sql.PadRight("",0,' ')),  L<S,I?,C,S>   ((p0,p1,p2) => p0.Length > p1 ? p0 : p0 + Replicate(p2, p1 - p0.Length)) },
+				{ M(() => Sql.PadLeft ("",0,' ')),  L<S,I?,C,S>   ((p0,p1,p2) => p0.Length > p1 ? p0 : Replicate(p2, p1 - p0.Length) + p0) },
+				{ M(() => Sql.Trim    ("")      ),  L<S,S>        ( p0        => Sql.TrimLeft(Sql.TrimRight(p0))) },
+				{ M(() => Sql.MakeDateTime(0,0,0)), L<I?,I?,I?,D?>((y,m,d)    => DateAdd(Sql.DateParts.Month, (y.Value - 1900) * 12 + m.Value - 1, d.Value - 1)) },
+				{ M(() => Sql.MakeDateTime(0, 0, 0, 0, 0, 0) ), L<I?,I?,I?,I?,I?,I?,D?>((y,m,d,h,mm,s) => Sql.Convert(Sql.DateTime2,
+					y.ToString() + "-" + m.ToString() + "-" + d.ToString() + " " +
+					h.ToString() + ":" + mm.ToString() + ":" + s.ToString(), 120)) },
+				{ M(() => Sql.Cosh(0)   ), L<F?,F?>   ( v    => (Sql.Exp(v) + Sql.Exp(-v)) / 2) },
+				{ M(() => Sql.Log(0m, 0)), L<M?,M?,M?>((m,n) => Sql.Log(n) / Sql.Log(m)) },
+				{ M(() => Sql.Log(0.0,0)), L<F?,F?,F?>((m,n) => Sql.Log(n) / Sql.Log(m)) },
+				{ M(() => Sql.Sinh(0)   ), L<F?,F?>   ( v    => (Sql.Exp(v) - Sql.Exp(-v)) / 2) },
+				{ M(() => Sql.Tanh(0)   ), L<F?,F?>   ( v    => (Sql.Exp(v) - Sql.Exp(-v)) / (Sql.Exp(v) + Sql.Exp(-v))) },
+
+				{ M(() => DateTime.Parse("")), L<String,DateTime>(p0 => Sql.ConvertTo<DateTime>.From(p0) ) },
+			}},
+
+			#endregion
+
+			#region SqlCe
+
+			{ "SqlCe", new Dictionary<MemberInfo,LambdaExpression> {
+				{ M(() => Sql.Left    ("",0)    ), L<S,I?,S>   ((p0,p1)    => Sql.Substring(p0, 1, p1)) },
+				{ M(() => Sql.Right   ("",0)    ), L<S,I?,S>   ((p0,p1)    => Sql.Substring(p0, p0.Length - p1 + 1, p1)) },
+				{ M(() => Sql.PadRight("",0,' ')), L<S,I?,C?,S>((p0,p1,p2) => p0.Length > p1 ? p0 : p0 + Replicate(p2, p1 - p0.Length)) },
+				{ M(() => Sql.PadLeft ("",0,' ')), L<S,I?,C?,S>((p0,p1,p2) => p0.Length > p1 ? p0 : Replicate(p2, p1 - p0.Length) + p0) },
+				{ M(() => Sql.Trim    ("")      ), L<S,S>      ( p0        => Sql.TrimLeft(Sql.TrimRight(p0))) },
+
+				{ M(() => Sql.Cosh(0)    ), L<F?,F?>   ( v    => (Sql.Exp(v) + Sql.Exp(-v)) / 2) },
+				{ M(() => Sql.Log (0m, 0)), L<M?,M?,M?>((m,n) => Sql.Log(n) / Sql.Log(m)) },
+				{ M(() => Sql.Log (0.0,0)), L<F?,F?,F?>((m,n) => Sql.Log(n) / Sql.Log(m)) },
+				{ M(() => Sql.Sinh(0)    ), L<F?,F?>   ( v    => (Sql.Exp(v) - Sql.Exp(-v)) / 2) },
+				{ M(() => Sql.Tanh(0)    ), L<F?,F?>   ( v    => (Sql.Exp(v) - Sql.Exp(-v)) / (Sql.Exp(v) + Sql.Exp(-v))) },
+			}},
+
+			#endregion
+
+			#region DB2
+
+			{ "DB2", new Dictionary<MemberInfo,LambdaExpression> {
+				{ M(() => Sql.Space   (0)        ), L<I?,S>       ( p0           => Sql.Convert(Sql.VarChar(1000), Replicate(" ", p0))) },
+				{ M(() => Sql.Stuff   ("",0,0,"")), L<S,I?,I?,S,S>((p0,p1,p2,p3) => AltStuff(p0, p1, p2, p3)) },
+				{ M(() => Sql.PadRight("",0,' ') ), L<S,I?,C?,S>  ((p0,p1,p2)    => p0.Length > p1 ? p0 : p0 + VarChar(Replicate(p2, p1 - p0.Length), 1000)) },
+				{ M(() => Sql.PadLeft ("",0,' ') ), L<S,I?,C?,S>  ((p0,p1,p2)    => p0.Length > p1 ? p0 : VarChar(Replicate(p2, p1 - p0.Length), 1000) + p0) },
+
+				{ M(() => Sql.ConvertTo<String>.From((Decimal)0)), L<Decimal,S>(p => Sql.TrimLeft(Sql.Convert<string,Decimal>(p), '0')) },
+				{ M(() => Sql.ConvertTo<String>.From(Guid.Empty)), L<Guid,   S>(p => Sql.Lower(
+					Sql.Substring(Hex(p),  7,  2) + Sql.Substring(Hex(p),  5, 2) + Sql.Substring(Hex(p), 3, 2) + Sql.Substring(Hex(p), 1, 2) + "-" +
+					Sql.Substring(Hex(p), 11,  2) + Sql.Substring(Hex(p),  9, 2) + "-" +
+					Sql.Substring(Hex(p), 15,  2) + Sql.Substring(Hex(p), 13, 2) + "-" +
+					Sql.Substring(Hex(p), 17,  4) + "-" +
+					Sql.Substring(Hex(p), 21, 12))) },
+
+				{ M(() => Sql.Log(0m, 0)), L<M?,M?,M?>((m,n) => Sql.Log(n) / Sql.Log(m)) },
+				{ M(() => Sql.Log(0.0,0)), L<F?,F?,F?>((m,n) => Sql.Log(n) / Sql.Log(m)) },
+			}},
+
+			#endregion
+
+			#region Informix
+
+			{ "Informix", new Dictionary<MemberInfo,LambdaExpression> {
+				{ M(() => Sql.Left ("",0)     ), L<S,I?,S>     ((p0,p1)       => Sql.Substring(p0,  1, p1))                  },
+				{ M(() => Sql.Right("",0)     ), L<S,I?,S>     ((p0,p1)       => Sql.Substring(p0,  p0.Length - p1 + 1, p1)) },
+				{ M(() => Sql.Stuff("",0,0,"")), L<S,I?,I?,S,S>((p0,p1,p2,p3) =>     AltStuff (p0,  p1, p2, p3))             },
+				{ M(() => Sql.Space(0)        ), L<I?,S>       ( p0           => Sql.PadRight (" ", p0, ' '))                },
+
+				{ M(() => Sql.MakeDateTime(0,0,0)), L<I?,I?,I?,D?>((y,m,d) => Mdy(m, d, y)) },
+
+				{ M(() => Sql.Cot (0)         ), L<F?,F?>      ( v            => Sql.Cos(v) / Sql.Sin(v) )        },
+				{ M(() => Sql.Cosh(0)         ), L<F?,F?>      ( v            => (Sql.Exp(v) + Sql.Exp(-v)) / 2 ) },
+
+				{ M(() => Sql.Degrees((Decimal?)0)), L<Decimal?,Decimal?>( v => (Decimal?)(v.Value * (180 / (Decimal)Math.PI))) },
+				{ M(() => Sql.Degrees((Double?) 0)), L<Double?, Double?> ( v => (Double?) (v.Value * (180 / Math.PI))) },
+				{ M(() => Sql.Degrees((Int16?)  0)), L<Int16?,  Int16?>  ( v => (Int16?)  (v.Value * (180 / Math.PI))) },
+				{ M(() => Sql.Degrees((Int32?)  0)), L<Int32?,  Int32?>  ( v => (Int32?)  (v.Value * (180 / Math.PI))) },
+				{ M(() => Sql.Degrees((Int64?)  0)), L<Int64?,  Int64?>  ( v => (Int64?)  (v.Value * (180 / Math.PI))) },
+				{ M(() => Sql.Degrees((SByte?)  0)), L<SByte?,  SByte?>  ( v => (SByte?)  (v.Value * (180 / Math.PI))) },
+				{ M(() => Sql.Degrees((Single?) 0)), L<Single?, Single?> ( v => (Single?) (v.Value * (180 / Math.PI))) },
+
+				{ M(() => Sql.Log(0m, 0)), L<M?,M?,M?>((m,n) => Sql.Log(n) / Sql.Log(m)) },
+				{ M(() => Sql.Log(0.0,0)), L<F?,F?,F?>((m,n) => Sql.Log(n) / Sql.Log(m)) },
+
+				{ M(() => Sql.Sign((Decimal?)0)), L<Decimal?,I?>(p => p > 0 ? 1 : p < 0 ? -1 : 0 ) },
+				{ M(() => Sql.Sign((Double?) 0)), L<Double?, I?>(p => p > 0 ? 1 : p < 0 ? -1 : 0 ) },
+				{ M(() => Sql.Sign((Int16?)  0)), L<Int16?,  I?>(p => p > 0 ? 1 : p < 0 ? -1 : 0 ) },
+				{ M(() => Sql.Sign((Int32?)  0)), L<Int32?,  I?>(p => p > 0 ? 1 : p < 0 ? -1 : 0 ) },
+				{ M(() => Sql.Sign((Int64?)  0)), L<Int64?,  I?>(p => p > 0 ? 1 : p < 0 ? -1 : 0 ) },
+				{ M(() => Sql.Sign((SByte?)  0)), L<SByte?,  I?>(p => p > 0 ? 1 : p < 0 ? -1 : 0 ) },
+				{ M(() => Sql.Sign((Single?) 0)), L<Single?, I?>(p => p > 0 ? 1 : p < 0 ? -1 : 0 ) },
+
+				{ M(() => Sql.Sinh(0)), L<F?,F?>( v => (Sql.Exp(v) - Sql.Exp(-v)) / 2) },
+				{ M(() => Sql.Tanh(0)), L<F?,F?>( v => (Sql.Exp(v) - Sql.Exp(-v)) / (Sql.Exp(v) +Sql.Exp(-v))) },
+			}},
+
+			#endregion
+
+			#region Oracle
+
+			{ "Oracle", new Dictionary<MemberInfo,LambdaExpression> {
+				{ M(() => Sql.Left ("",0)     ), L<S,I?,S>     ((p0,p1)       => Sql.Substring(p0, 1, p1)) },
+				{ M(() => Sql.Right("",0)     ), L<S,I?,S>     ((p0,p1)       => Sql.Substring(p0, p0.Length - p1 + 1, p1)) },
+				{ M(() => Sql.Stuff("",0,0,"")), L<S,I?,I?,S,S>((p0,p1,p2,p3) => AltStuff(p0, p1, p2, p3)) },
+				{ M(() => Sql.Space(0)        ), L<I?,S>       ( p0           => Sql.PadRight(" ", p0, ' ')) },
+
+				{ M(() => Sql.ConvertTo<String>.From(Guid.Empty)), L<Guid,S>(p => Sql.Lower(
+					Sql.Substring(Sql.Convert2(Sql.Char(36), p),  7,  2) + Sql.Substring(Sql.Convert2(Sql.Char(36), p),  5, 2) + Sql.Substring(Sql.Convert2(Sql.Char(36), p), 3, 2) + Sql.Substring(Sql.Convert2(Sql.Char(36), p), 1, 2) + "-" +
+					Sql.Substring(Sql.Convert2(Sql.Char(36), p), 11,  2) + Sql.Substring(Sql.Convert2(Sql.Char(36), p),  9, 2) + "-" +
+					Sql.Substring(Sql.Convert2(Sql.Char(36), p), 15,  2) + Sql.Substring(Sql.Convert2(Sql.Char(36), p), 13, 2) + "-" +
+					Sql.Substring(Sql.Convert2(Sql.Char(36), p), 17,  4) + "-" +
+					Sql.Substring(Sql.Convert2(Sql.Char(36), p), 21, 12))) },
+
+				{ M(() => Sql.Cot  (0)),   L<F?,F?>(v => Sql.Cos(v) / Sql.Sin(v) ) },
+				{ M(() => Sql.Log10(0.0)), L<F?,F?>(v => Sql.Log(10, v)      ) },
+
+				{ M(() => Sql.Degrees((Decimal?)0)), L<Decimal?,Decimal?>( v => (Decimal?)(v.Value * (180 / (Decimal)Math.PI))) },
+				{ M(() => Sql.Degrees((Double?) 0)), L<Double?, Double?> ( v => (Double?) (v.Value * (180 / Math.PI))) },
+				{ M(() => Sql.Degrees((Int16?)  0)), L<Int16?,  Int16?>  ( v => (Int16?)  (v.Value * (180 / Math.PI))) },
+				{ M(() => Sql.Degrees((Int32?)  0)), L<Int32?,  Int32?>  ( v => (Int32?)  (v.Value * (180 / Math.PI))) },
+				{ M(() => Sql.Degrees((Int64?)  0)), L<Int64?,  Int64?>  ( v => (Int64?)  (v.Value * (180 / Math.PI))) },
+				{ M(() => Sql.Degrees((SByte?)  0)), L<SByte?,  SByte?>  ( v => (SByte?)  (v.Value * (180 / Math.PI))) },
+				{ M(() => Sql.Degrees((Single?) 0)), L<Single?, Single?> ( v => (Single?) (v.Value * (180 / Math.PI))) },
+			}},
+
+			#endregion
+
+			#region Firebird
+
+			{ "Firebird", new Dictionary<MemberInfo,LambdaExpression> {
+				{ M<S>(_  => Sql.Space(0         )),   L<I?,S>       ( p0           => Sql.PadRight(" ", p0, ' ')) },
+				{ M<S>(s  => Sql.Stuff(s, 0, 0, s)),   L<S,I?,I?,S,S>((p0,p1,p2,p3) => AltStuff(p0, p1, p2, p3)) },
+
+				{ M(() => Sql.Degrees((Decimal?)0)), L<Decimal?,Decimal?>( v => (Decimal?)(v.Value * 180 / DecimalPI())) },
+				{ M(() => Sql.Degrees((Double?) 0)), L<Double?, Double?> ( v => (Double?) (v.Value * (180 / Math.PI))) },
+				{ M(() => Sql.Degrees((Int16?)  0)), L<Int16?,  Int16?>  ( v => (Int16?)  (v.Value * (180 / Math.PI))) },
+				{ M(() => Sql.Degrees((Int32?)  0)), L<Int32?,  Int32?>  ( v => (Int32?)  (v.Value * (180 / Math.PI))) },
+				{ M(() => Sql.Degrees((Int64?)  0)), L<Int64?,  Int64?>  ( v => (Int64?)  (v.Value * (180 / Math.PI))) },
+				{ M(() => Sql.Degrees((SByte?)  0)), L<SByte?,  SByte?>  ( v => (SByte?)  (v.Value * (180 / Math.PI))) },
+				{ M(() => Sql.Degrees((Single?) 0)), L<Single?, Single?> ( v => (Single?) (v.Value * (180 / Math.PI))) },
+
+				{ M(() => Sql.RoundToEven(0.0)  ), L<F?,F?>   ( v    => (double)Sql.RoundToEven((decimal)v))    },
+				{ M(() => Sql.RoundToEven(0.0,0)), L<F?,I?,F?>((v,p) => (double)Sql.RoundToEven((decimal)v, p)) },
+			}},
+
+			#endregion
+
+			#region MySql
+
+			{ "MySql", new Dictionary<MemberInfo,LambdaExpression> {
+				{ M<S>(s => Sql.Stuff(s, 0, 0, s)), L<S,I?,I?,S,S>((p0,p1,p2,p3) => AltStuff(p0, p1, p2, p3)) },
+
+				{ M(() => Sql.Cosh(0)), L<F?,F?>(v => (Sql.Exp(v) + Sql.Exp(-v)) / 2) },
+				{ M(() => Sql.Sinh(0)), L<F?,F?>(v => (Sql.Exp(v) - Sql.Exp(-v)) / 2) },
+				{ M(() => Sql.Tanh(0)), L<F?,F?>(v => (Sql.Exp(v) - Sql.Exp(-v)) / (Sql.Exp(v) + Sql.Exp(-v))) },
+			}},
+
+			#endregion
+
+			#region PostgreSQL
+
+			{ "PostgreSQL", new Dictionary<MemberInfo,LambdaExpression> {
+				{ M(() => Sql.Left ("",0)     ), L<S,I?,S>     ((p0,p1)       => Sql.Substring(p0, 1, p1)) },
+				{ M(() => Sql.Right("",0)     ), L<S,I?,S>     ((p0,p1)       => Sql.Substring(p0, p0.Length - p1 + 1, p1)) },
+				{ M(() => Sql.Stuff("",0,0,"")), L<S,I?,I?,S,S>((p0,p1,p2,p3) => AltStuff(p0, p1, p2, p3)) },
+				{ M(() => Sql.Space(0)        ), L<I?,S>       ( p0           => Replicate(" ", p0)) },
+
+				{ M(() => Sql.Cosh(0)           ), L<F?,F?>    ( v            => (Sql.Exp(v) + Sql.Exp(-v)) / 2 ) },
+				{ M(() => Sql.Round      (0.0,0)), L<F?,I?,F?> ((v,p)         => (double)Sql.Round      ((decimal)v, p)) },
+				{ M(() => Sql.RoundToEven(0.0)  ), L<F?,F?>    ( v            => (double)Sql.RoundToEven((decimal)v))    },
+				{ M(() => Sql.RoundToEven(0.0,0)), L<F?,I?,F?> ((v,p)         => (double)Sql.RoundToEven((decimal)v, p)) },
+
+				{ M(() => Sql.Log  ((double)0,0)), L<F?,F?,F?> ((m,n)         => (F?)Sql.Log((M)m,(M)n).Value ) },
+				{ M(() => Sql.Sinh (0)          ), L<F?,F?>    ( v            => (Sql.Exp(v) - Sql.Exp(-v)) / 2) },
+				{ M(() => Sql.Tanh (0)          ), L<F?,F?>    ( v            => (Sql.Exp(v) - Sql.Exp(-v)) / (Sql.Exp(v) + Sql.Exp(-v))) },
+
+				{ M(() => Sql.Truncate(0.0)     ), L<F?,F?>    ( v            => (double)Sql.Truncate((decimal)v)) },
+			}},
+
+			#endregion
+
+			#region SQLite
+
+			{ "SQLite", new Dictionary<MemberInfo,LambdaExpression> {
+				{ M(() => Sql.Stuff   ("",0,0,"")), L<S,I?,I?,S,S>((p0,p1,p2,p3) => AltStuff(p0, p1, p2, p3)) },
+				{ M(() => Sql.PadRight("",0,' ') ), L<S,I?,C?,S>  ((p0,p1,p2)    => p0.Length > p1 ? p0 : p0 + Replicate(p2, p1 - p0.Length)) },
+				{ M(() => Sql.PadLeft ("",0,' ') ), L<S,I?,C?,S>  ((p0,p1,p2)    => p0.Length > p1 ? p0 : Replicate(p2, p1 - p0.Length) + p0) },
+
+				{ M(() => Sql.MakeDateTime(0, 0, 0)), L<I?,I?,I?,D?>((y,m,d) => Sql.Convert(Sql.Date,
+					y.ToString() + "-" +
+					(m.ToString().Length == 1 ? "0" + m.ToString() : m.ToString()) + "-" +
+					(d.ToString().Length == 1 ? "0" + d.ToString() : d.ToString()))) },
+
+				{ M(() => Sql.MakeDateTime(0, 0, 0, 0, 0, 0)), L<I?,I?,I?,I?,I?,I?,D?>((y,m,d,h,i,s) => Sql.Convert(Sql.DateTime2,
+					y.ToString() + "-" +
+					(m.ToString().Length == 1 ? "0" + m.ToString() : m.ToString()) + "-" +
+					(d.ToString().Length == 1 ? "0" + d.ToString() : d.ToString()) + " " +
+					(h.ToString().Length == 1 ? "0" + h.ToString() : h.ToString()) + ":" +
+					(i.ToString().Length == 1 ? "0" + i.ToString() : i.ToString()) + ":" +
+					(s.ToString().Length == 1 ? "0" + s.ToString() : s.ToString()))) },
+
+				{ M(() => Sql.ConvertTo<String>.From(Guid.Empty)), L<Guid,S>(p => Sql.Lower(
+					Sql.Substring(Hex(p),  7,  2) + Sql.Substring(Hex(p),  5, 2) + Sql.Substring(Hex(p), 3, 2) + Sql.Substring(Hex(p), 1, 2) + "-" +
+					Sql.Substring(Hex(p), 11,  2) + Sql.Substring(Hex(p),  9, 2) + "-" +
+					Sql.Substring(Hex(p), 15,  2) + Sql.Substring(Hex(p), 13, 2) + "-" +
+					Sql.Substring(Hex(p), 17,  4) + "-" +
+					Sql.Substring(Hex(p), 21, 12))) },
+
+				{ M(() => Sql.Log (0m, 0)), L<M?,M?,M?>((m,n) => Sql.Log(n) / Sql.Log(m)) },
+				{ M(() => Sql.Log (0.0,0)), L<F?,F?,F?>((m,n) => Sql.Log(n) / Sql.Log(m)) },
+
+				{ M(() => Sql.Truncate(0m)),  L<M?,M?>( v => v >= 0 ? Sql.Floor(v) : Sql.Ceiling(v)) },
+				{ M(() => Sql.Truncate(0.0)), L<F?,F?>( v => v >= 0 ? Sql.Floor(v) : Sql.Ceiling(v)) },
+			}},
+
+			#endregion
+
+			#region Sybase
+
+			{ "Sybase", new Dictionary<MemberInfo,LambdaExpression> {
+				{ M(() => Sql.PadRight("",0,' ')),  L<S,I?,C?,S>((p0,p1,p2) => p0.Length > p1 ? p0 : p0 + Replicate(p2, p1 - p0.Length)) },
+				{ M(() => Sql.PadLeft ("",0,' ')),  L<S,I?,C?,S>((p0,p1,p2) => p0.Length > p1 ? p0 : Replicate(p2, p1 - p0.Length) + p0) },
+				{ M(() => Sql.Trim    ("")      ),  L<S,S>      ( p0        => Sql.TrimLeft(Sql.TrimRight(p0))) },
+
+				{ M(() => Sql.Cosh(0)    ), L<F?,F?>   ( v    => (Sql.Exp(v) + Sql.Exp(-v)) / 2) },
+				{ M(() => Sql.Log (0m, 0)), L<M?,M?,M?>((m,n) => Sql.Log(n) / Sql.Log(m)) },
+				{ M(() => Sql.Log (0.0,0)), L<F?,F?,F?>((m,n) => Sql.Log(n) / Sql.Log(m)) },
+
+				{ M(() => Sql.Degrees((Decimal?)0)), L<Decimal?,Decimal?>( v => (Decimal?)(v.Value * (180 / (Decimal)Math.PI))) },
+				{ M(() => Sql.Degrees((Double?) 0)), L<Double?, Double?> ( v => (Double?) (v.Value * (180 / Math.PI))) },
+				{ M(() => Sql.Degrees((Int16?)  0)), L<Int16?,  Int16?>  ( v => (Int16?)  (v.Value * (180 / Math.PI))) },
+				{ M(() => Sql.Degrees((Int32?)  0)), L<Int32?,  Int32?>  ( v => (Int32?)  (v.Value * (180 / Math.PI))) },
+				{ M(() => Sql.Degrees((Int64?)  0)), L<Int64?,  Int64?>  ( v => (Int64?)  (v.Value * (180 / Math.PI))) },
+				{ M(() => Sql.Degrees((SByte?)  0)), L<SByte?,  SByte?>  ( v => (SByte?)  (v.Value * (180 / Math.PI))) },
+				{ M(() => Sql.Degrees((Single?) 0)), L<Single?, Single?> ( v => (Single?) (v.Value * (180 / Math.PI))) },
+
+				{ M(() => Sql.Sinh(0)), L<F?,F?>( v => (Sql.Exp(v) - Sql.Exp(-v)) / 2) },
+				{ M(() => Sql.Tanh(0)), L<F?,F?>( v => (Sql.Exp(v) - Sql.Exp(-v)) / (Sql.Exp(v) + Sql.Exp(-v))) },
+
+				{ M(() => Sql.Truncate(0m)),  L<M?,M?>( v => v >= 0 ? Sql.Floor(v) : Sql.Ceiling(v)) },
+				{ M(() => Sql.Truncate(0.0)), L<F?,F?>( v => v >= 0 ? Sql.Floor(v) : Sql.Ceiling(v)) },
+			}},
+
+			#endregion
+
+			#region Access
+
+			{ "Access", new Dictionary<MemberInfo,LambdaExpression> {
+				{ M(() => Sql.Stuff   ("",0,0,"")), L<S,I?,I?,S,S>((p0,p1,p2,p3) => AltStuff(p0, p1, p2, p3)) },
+				{ M(() => Sql.PadRight("",0,' ') ), L<S,I?,C?,S>  ((p0,p1,p2)    => p0.Length > p1 ? p0 : p0 + Replicate(p2, p1 - p0.Length)) },
+				{ M(() => Sql.PadLeft ("",0,' ') ), L<S,I?,C?,S>  ((p0,p1,p2)    => p0.Length > p1 ? p0 : Replicate(p2, p1 - p0.Length) + p0) },
+				{ M(() => Sql.MakeDateTime(0,0,0)), L<I?,I?,I?,D?>((y,m,d)       => MakeDateTime2(y, m, d))                                   },
+
+				{ M(() => Sql.ConvertTo<String>.From(Guid.Empty)), L<Guid,S>(p => Sql.Lower(Sql.Substring(p.ToString(), 2, 36))) },
+
+				{ M(() => Sql.Ceiling((Decimal)0)), L<Decimal?,Decimal?>(p => -Sql.Floor(-p) ) },
+				{ M(() => Sql.Ceiling((Double) 0)), L<Double?, Double?> (p => -Sql.Floor(-p) ) },
+
+				{ M(() => Sql.Cot  (0)    ), L<F?,F?>   ( v    => Sql.Cos(v) / Sql.Sin(v)       ) },
+				{ M(() => Sql.Cosh (0)    ), L<F?,F?>   ( v    => (Sql.Exp(v) + Sql.Exp(-v)) / 2) },
+				{ M(() => Sql.Log  (0m, 0)), L<M?,M?,M?>((m,n) => Sql.Log(n) / Sql.Log(m)       ) },
+				{ M(() => Sql.Log  (0.0,0)), L<F?,F?,F?>((m,n) => Sql.Log(n) / Sql.Log(m)       ) },
+				{ M(() => Sql.Log10(0.0)  ), L<F?,F?>   ( n    => Sql.Log(n) / Sql.Log(10.0)    ) },
+
+				{ M(() => Sql.Degrees((Decimal?)0)), L<Decimal?,Decimal?>( v => (Decimal?)         (          v.Value  * (180 / (Decimal)Math.PI))) },
+				{ M(() => Sql.Degrees((Double?) 0)), L<Double?, Double?> ( v => (Double?)          (          v.Value  * (180 / Math.PI))) },
+				{ M(() => Sql.Degrees((Int16?)  0)), L<Int16?,  Int16?>  ( v => (Int16?)  AccessInt(AccessInt(v.Value) * (180 / Math.PI))) },
+				{ M(() => Sql.Degrees((Int32?)  0)), L<Int32?,  Int32?>  ( v => (Int32?)  AccessInt(AccessInt(v.Value) * (180 / Math.PI))) },
+				{ M(() => Sql.Degrees((Int64?)  0)), L<Int64?,  Int64?>  ( v => (Int64?)  AccessInt(AccessInt(v.Value) * (180 / Math.PI))) },
+				{ M(() => Sql.Degrees((SByte?)  0)), L<SByte?,  SByte?>  ( v => (SByte?)  AccessInt(AccessInt(v.Value) * (180 / Math.PI))) },
+				{ M(() => Sql.Degrees((Single?) 0)), L<Single?, Single?> ( v => (Single?)          (          v.Value  * (180 / Math.PI))) },
+
+				{ M(() => Sql.Round      (0m)   ), L<M?,M?>   ( d   => d - Sql.Floor(d) == 0.5m && Sql.Floor(d) % 2 == 0? Sql.Ceiling(d) : AccessRound(d, 0)) },
+				{ M(() => Sql.Round      (0.0)  ), L<F?,F?>   ( d   => d - Sql.Floor(d) == 0.5  && Sql.Floor(d) % 2 == 0? Sql.Ceiling(d) : AccessRound(d, 0)) },
+				{ M(() => Sql.Round      (0m, 0)), L<M?,I?,M?>((v,p)=>
+					p == 1 ? Sql.Round(v * 10) / 10 :
+					p == 2 ? Sql.Round(v * 10) / 10 :
+					p == 3 ? Sql.Round(v * 10) / 10 :
+					p == 4 ? Sql.Round(v * 10) / 10 :
+					p == 5 ? Sql.Round(v * 10) / 10 :
+					         Sql.Round(v * 10) / 10) },
+				{ M(() => Sql.Round      (0.0,0)), L<F?,I?,F?>((v,p)=>
+					p == 1 ? Sql.Round(v * 10) / 10 :
+					p == 2 ? Sql.Round(v * 10) / 10 :
+					p == 3 ? Sql.Round(v * 10) / 10 :
+					p == 4 ? Sql.Round(v * 10) / 10 :
+					p == 5 ? Sql.Round(v * 10) / 10 :
+					         Sql.Round(v * 10) / 10) },
+				{ M(() => Sql.RoundToEven(0m)   ), L<M?,M?>   ( v   => AccessRound(v, 0))},
+				{ M(() => Sql.RoundToEven(0.0)  ), L<F?,F?>   ( v   => AccessRound(v, 0))},
+				{ M(() => Sql.RoundToEven(0m, 0)), L<M?,I?,M?>((v,p)=> AccessRound(v, p))},
+				{ M(() => Sql.RoundToEven(0.0,0)), L<F?,I?,F?>((v,p)=> AccessRound(v, p))},
+
+				{ M(() => Sql.Sinh(0)), L<F?,F?>( v => (Sql.Exp(v) - Sql.Exp(-v)) / 2) },
+				{ M(() => Sql.Tanh(0)), L<F?,F?>( v => (Sql.Exp(v) - Sql.Exp(-v)) / (Sql.Exp(v) + Sql.Exp(-v))) },
+
+				{ M(() => Sql.Truncate(0m)),  L<M?,M?>( v => v >= 0 ? Sql.Floor(v) : Sql.Ceiling(v)) },
+				{ M(() => Sql.Truncate(0.0)), L<F?,F?>( v => v >= 0 ? Sql.Floor(v) : Sql.Ceiling(v)) },
+			}},
+
+			#endregion
+		};
+
+		#region Sql specific
+
+		[CLSCompliant(false)]
+		[SqlFunction("RTrim", 0)]
+		public static string TrimRight(string str, char[] trimChars)
+		{
+			return str == null ? null : str.TrimEnd(trimChars);
+		}
+
+		[CLSCompliant(false)]
+		[SqlFunction("LTrim", 0)]
+		public static string TrimLeft(string str, char[] trimChars)
+		{
+			return str == null ? null : str.TrimStart(trimChars);
+		}
+
+		#endregion
+
+		#region Provider specific functions
+
+		[SqlFunction]
+		static int? ConvertToCaseCompareTo(string str, string value)
+		{
+			return str == null || value == null ? (int?)null : str.CompareTo(value);
+		}
+
+		// Access, DB2, Firebird, Informix, MySql, Oracle, PostgreSQL, SQLite
+		//
+		[SqlFunction]
+		static string AltStuff(string str, int? startLocation, int? length, string value)
+		{
+			return Sql.Stuff(str, startLocation, length, value);
+		}
+
+		// DB2
+		//
+		[SqlFunction]
+		static string VarChar(object obj, int? size)
+		{
+			return obj.ToString();
+		}
+
+		// DB2
+		//
+		[SqlFunction]
+		static string Hex(Guid? guid)
+		{
+			return guid == null ? null : guid.ToString();
+		}
+
+#pragma warning disable 3019
+
+		// DB2, PostgreSQL, Access, MS SQL, SqlCe
+		//
+		[CLSCompliant(false)]
+		[SqlFunction]
+		[SqlFunction("DB2",        "Repeat")]
+		[SqlFunction("PostgreSQL", "Repeat")]
+		[SqlFunction("Access",     "String", 1, 0)]
+		static string Replicate(string str, int? count)
+		{
+			if (str == null || count == null)
+				return null;
+
+			var sb = new StringBuilder(str.Length * count.Value);
+
+			for (var i = 0; i < count; i++)
+				sb.Append(str);
+
+			return sb.ToString();
+		}
+
+		[CLSCompliant(false)]
+		[SqlFunction]
+		[SqlFunction("DB2",        "Repeat")]
+		[SqlFunction("PostgreSQL", "Repeat")]
+		[SqlFunction("Access",     "String", 1, 0)]
+		static string Replicate(char? ch, int? count)
+		{
+			if (ch == null || count == null)
+				return null;
+
+			var sb = new StringBuilder(count.Value);
+
+			for (var i = 0; i < count; i++)
+				sb.Append(ch);
+
+			return sb.ToString();
+		}
+
+		// MSSQL
+		//
+		[SqlFunction]
+		static DateTime? DateAdd(Sql.DateParts part, int? number, int? days)
+		{
+			return days == null ? null : Sql.DateAdd(part, number, new DateTime(1900, 1, days.Value + 1));
+		}
+
+		// MSSQL
+		//
+		[SqlFunction] static Decimal? Round(Decimal? value, int precision, int mode) { return 0; }
+		[SqlFunction] static Double?  Round(Double?  value, int precision, int mode) { return 0; }
+
+		// Access
+		//
+		[SqlFunction("Access", "DateSerial")]
+		static DateTime? MakeDateTime2(int? year, int? month, int? day)
+		{
+			return year == null || month == null || day == null?
+				(DateTime?)null :
+				new DateTime(year.Value, month.Value, day.Value);
+		}
+
+		// Access
+		//
+		[CLSCompliant(false)]
+		[SqlFunction("Int", 0)]
+		static T AccessInt<T>(T value)
+		{
+			return value;
+		}
+
+		// Access
+		//
+		[CLSCompliant(false)]
+		[SqlFunction("Round", 0, 1)]
+		static T AccessRound<T>(T value, int? precision) { return value; }
+
+		// Firebird
+		//
+		[SqlFunction("PI", ServerSideOnly = true)] static decimal DecimalPI() { return (decimal)Math.PI; }
+		[SqlFunction("PI", ServerSideOnly = true)] static double  DoublePI () { return          Math.PI; }
+
+		// Informix
+		//
+		[SqlFunction]
+		static DateTime? Mdy(int? month, int? day, int? year)
+		{
+			return year == null || month == null || day == null ?
+				(DateTime?)null :
+				new DateTime(year.Value, month.Value, day.Value);
+		}
+
+		#endregion
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Extensions.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,369 @@
+using System;
+using System.Collections.Generic;
+using System.Linq.Expressions;
+using System.Reflection;
+using System.Text.RegularExpressions;
+
+using JetBrains.Annotations;
+
+namespace BLToolkit.Data.Linq
+{
+	using DataAccess;
+
+	public static class Extensions
+	{
+		#region Table Helpers
+
+		static public Table<T> GetTable<T>(this IDataContext dataContext)
+			where T : class
+		{
+			return new Table<T>(dataContext);
+		}
+
+		static public Table<T> GetTable<T>(
+			this IDataContext dataContext,
+			object instance,
+			[NotNull] MethodInfo methodInfo,
+			[NotNull] params object[] parameters)
+			where T : class
+		{
+			if (methodInfo == null) throw new ArgumentNullException("methodInfo");
+			if (parameters == null) throw new ArgumentNullException("parameters");
+
+			if (!typeof(Table<T>).IsAssignableFrom(methodInfo.ReturnType))
+				throw new LinqException(
+					"Method '{0}.{1}' must return type 'Table<{2}>'",
+					methodInfo.Name, methodInfo.DeclaringType.FullName, typeof(T).FullName);
+
+			Expression expr;
+
+			if (parameters.Length > 0)
+			{
+				var pis  = methodInfo.GetParameters(); 
+				var args = new List<Expression>(parameters.Length);
+
+				for (var i = 0; i < parameters.Length; i++)
+				{
+					var type = pis[i].ParameterType;
+					args.Add(Expression.Constant(parameters[i], type.IsByRef ? type.GetElementType() : type));
+				}
+
+				expr = Expression.Call(Expression.Constant(instance), methodInfo, args); 
+			}
+			else
+				expr = Expression.Call(Expression.Constant(instance), methodInfo); 
+
+			return new Table<T>(dataContext, expr);
+		}
+
+		#endregion
+
+		#region Compile
+
+		/// <summary>
+		/// Compiles the query.
+		/// </summary>
+		/// <returns>
+		/// A generic delegate that represents the compiled query.
+		/// </returns>
+		/// <param name="dataContext"></param>
+		/// <param name="query">
+		/// The query expression to be compiled.
+		/// </param>
+		/// <typeparam name="TDc">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TResult">
+		/// Returned type of the delegate returned by the method.
+		/// </typeparam>
+		static public Func<TDc,TResult> Compile<TDc,TResult>(
+			[NotNull] this IDataContext dataContext,
+			[NotNull] Expression<Func<TDc,TResult>> query)
+			where TDc : IDataContext
+		{
+			return CompiledQuery.Compile(query);
+		}
+
+		/// <summary>
+		/// Compiles the query.
+		/// </summary>
+		/// <returns>
+		/// A generic delegate that represents the compiled query.
+		/// </returns>
+		/// <param name="dataContext"></param>
+		/// <param name="query">
+		/// The query expression to be compiled.
+		/// </param>
+		/// <typeparam name="TDc">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TArg1">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TResult">
+		/// Returned type of the delegate returned by the method.
+		/// </typeparam>
+		static public Func<TDc,TArg1,TResult> Compile<TDc,TArg1, TResult>(
+			[NotNull] this IDataContext dataContext,
+			[NotNull] Expression<Func<TDc,TArg1,TResult>> query)
+			where TDc : IDataContext
+		{
+			return CompiledQuery.Compile(query);
+		}
+
+		/// <summary>
+		/// Compiles the query.
+		/// </summary>
+		/// <returns>
+		/// A generic delegate that represents the compiled query.
+		/// </returns>
+		/// <param name="dataContext"></param>
+		/// <param name="query">
+		/// The query expression to be compiled.
+		/// </param>
+		/// <typeparam name="TDc">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TArg1">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TArg2">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TResult">
+		/// Returned type of the delegate returned by the method.
+		/// </typeparam>
+		static public Func<TDc,TArg1,TArg2,TResult> Compile<TDc,TArg1,TArg2,TResult>(
+			[NotNull] this IDataContext dataContext,
+			[NotNull] Expression<Func<TDc,TArg1,TArg2,TResult>> query)
+			where TDc : IDataContext
+		{
+			return CompiledQuery.Compile(query);
+		}
+
+		/// <summary>
+		/// Compiles the query.
+		/// </summary>
+		/// <returns>
+		/// A generic delegate that represents the compiled query.
+		/// </returns>
+		/// <param name="dataContext"></param>
+		/// <param name="query">
+		/// The query expression to be compiled.
+		/// </param>
+		/// <typeparam name="TDc">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TArg1">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TArg2">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TArg3">
+		/// Represents the type of the parameter that has to be passed in when executing the delegate returned by the method.
+		/// </typeparam>
+		/// <typeparam name="TResult">
+		/// Returned type of the delegate returned by the method.
+		/// </typeparam>
+		static public Func<TDc,TArg1,TArg2,TArg3,TResult> Compile<TDc,TArg1,TArg2,TArg3,TResult>(
+			[NotNull] this IDataContext dataContext,
+			[NotNull] Expression<Func<TDc,TArg1,TArg2,TArg3,TResult>> query)
+			where TDc : IDataContext
+		{
+			return CompiledQuery.Compile(query);
+		}
+
+		#endregion
+
+		#region Object Operations
+
+		#region Insert
+
+		public static int Insert<T>([NotNull] this IDataContextInfo dataContextInfo, T obj)
+		{
+			if (dataContextInfo == null) throw new ArgumentNullException("dataContextInfo");
+			return Query<T>.Insert(dataContextInfo, obj);
+		}
+
+		public static int Insert<T>(this IDataContext dataContext, T obj)
+		{
+			return Query<T>.Insert(DataContextInfo.Create(dataContext), obj);
+		}
+
+		#endregion
+
+		#region InsertOrUpdate
+
+		[Obsolete("Use 'InsertOrReplace' instead.")]
+		public static int InsertOrUpdate<T>(this IDataContextInfo dataContextInfo, T obj)
+		{
+			return InsertOrReplace(dataContextInfo, obj);
+		}
+
+		public static int InsertOrReplace<T>([NotNull] this IDataContextInfo dataContextInfo, T obj)
+		{
+			if (dataContextInfo == null) throw new ArgumentNullException("dataContextInfo");
+			return Query<T>.InsertOrReplace(dataContextInfo, obj);
+		}
+
+		public static int InsertOrReplace<T>([NotNull] this IDataContextInfo dataContextInfo, IEnumerable<T> objs)
+		{
+			if (dataContextInfo == null) throw new ArgumentNullException("dataContextInfo");
+			int cnt = 0;
+			foreach (var obj in objs)
+			{
+				cnt += Query<T>.InsertOrReplace(dataContextInfo, obj);
+			}
+			return cnt;
+		}
+
+		[Obsolete("Use 'InsertOrReplace' instead.")]
+		public static int InsertOrUpdate<T>(this IDataContext dataContext, T obj)
+		{
+			return InsertOrReplace(dataContext, obj);
+		}
+
+		public static int InsertOrReplace<T>(this IDataContext dataContext, T obj)
+		{
+			return Query<T>.InsertOrReplace(DataContextInfo.Create(dataContext), obj);
+		}
+
+		public static int InsertOrReplace<T>(this IDataContext dataContext, IEnumerable<T> objs)
+		{
+			int cnt = 0;
+			foreach (var obj in objs)
+			{
+				cnt += Query<T>.InsertOrReplace(DataContextInfo.Create(dataContext), obj);
+			}
+			return cnt;
+		}
+
+		#endregion
+
+		#region InsertBatch
+
+#if !SILVERLIGHT
+
+		public static int InsertBatch<T>(this DbManager dataContext, int maxBatchSize, IEnumerable<T> list)
+		{
+			return new SqlQuery<T>(dataContext).Insert(dataContext, maxBatchSize, list);
+		}
+
+		public static int InsertBatch<T>(this DbManager dataContext, IEnumerable<T> list)
+		{
+			return InsertBatch(dataContext, int.MaxValue, list);
+		}
+
+		public static int InsertBatch<T>(this DbManager dataContext, T[] list)
+		{
+			return InsertBatch(dataContext, int.MaxValue, list);
+		}
+
+		[Obsolete("Use InsertBatch instead.")]
+		public static int Insert<T>(this DbManager dataContext, T[] list)
+		{
+			return Insert(dataContext, int.MaxValue, list);
+		}
+
+		[Obsolete("Use InsertBatch instead.")]
+		public static int Insert<T>(this DbManager dataContext, int maxBatchSize, IEnumerable<T> list)
+		{
+			return new SqlQuery<T>().Insert(dataContext, maxBatchSize, list);
+		}
+
+		[Obsolete("Use InsertBatch instead.")]
+		public static int Insert<T>(this DbManager dataContext, IEnumerable<T> list)
+		{
+			return Insert(dataContext, int.MaxValue, list);
+		}
+
+#endif
+
+		#endregion
+
+		#region InsertWithIdentity
+
+		public static object InsertWithIdentity<T>([NotNull] this IDataContextInfo dataContextInfo, T obj)
+		{
+			if (dataContextInfo == null) throw new ArgumentNullException("dataContextInfo");
+			return Query<T>.InsertWithIdentity(dataContextInfo, obj);
+		}
+
+		public static object InsertWithIdentity<T>(this IDataContext dataContext, T obj)
+		{
+			return Query<T>.InsertWithIdentity(DataContextInfo.Create(dataContext), obj);
+		}
+
+		#endregion
+
+		#region Update
+
+		public static int Update<T>([NotNull] this IDataContextInfo dataContextInfo, T obj)
+		{
+			if (dataContextInfo == null) throw new ArgumentNullException("dataContextInfo");
+			return Query<T>.Update(dataContextInfo, obj);
+		}
+
+		public static int Update<T>(this IDataContext dataContext, T obj)
+		{
+			return Query<T>.Update(DataContextInfo.Create(dataContext), obj);
+		}
+
+#if !SILVERLIGHT
+
+		public static int Update<T>(this DbManager dataContext, int maxBatchSize, IEnumerable<T> list)
+		{
+			return new SqlQuery<T>(dataContext).Update(dataContext, maxBatchSize, list);
+		}
+
+		public static int Update<T>(this DbManager dataContext, IEnumerable<T> list)
+		{
+			return Update(dataContext, int.MaxValue, list);
+		}
+
+#endif
+
+		#endregion
+
+		#region Delete
+
+		public static int Delete<T>([NotNull] this IDataContextInfo dataContextInfo, T obj)
+		{
+			if (dataContextInfo == null) throw new ArgumentNullException("dataContextInfo");
+			return Query<T>.Delete(dataContextInfo, obj);
+		}
+
+		public static int Delete<T>([NotNull] this IDataContext dataContext, T obj)
+		{
+			return Query<T>.Delete(DataContextInfo.Create(dataContext), obj);
+		}
+
+#if !SILVERLIGHT
+
+		public static int Delete<T>(this DbManager dataContext, int maxBatchSize, IEnumerable<T> list)
+		{
+			return new SqlQuery<T>(dataContext).Delete(dataContext, maxBatchSize, list);
+		}
+
+		public static int Delete<T>(this DbManager dataContext, IEnumerable<T> list)
+		{
+			return Delete(dataContext, int.MaxValue, list);
+		}
+
+#endif
+
+		#endregion
+
+		#endregion
+
+		#region String Extensions
+
+		public static int ContainsExactly(this string s, string value)
+		{
+			return Regex.Matches(s, string.Format(@"(^|\s){0}(\s|$)", value), RegexOptions.IgnoreCase).Count;
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/IDataContext.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,25 @@
+using System;
+using System.Data;
+
+namespace BLToolkit.Data.Linq
+{
+	using Data.Sql.SqlProvider;
+	using Mapping;
+
+	public interface IDataContext : IMappingSchemaProvider, IDisposable
+	{
+		string             ContextID         { get; }
+		Func<ISqlProvider> CreateSqlProvider { get; }
+
+		object             SetQuery        (IQueryContext queryContext);
+		int                ExecuteNonQuery (object query);
+		object             ExecuteScalar   (object query);
+		IDataReader        ExecuteReader   (object query);
+		void               ReleaseQuery    (object query);
+
+		string             GetSqlText      (object query);
+		IDataContext       Clone           (bool forNestedQuery);
+
+		event EventHandler OnClosing;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/IDataContextInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,18 @@
+using System;
+
+namespace BLToolkit.Data.Linq
+{
+	using Data.Sql.SqlProvider;
+	using Mapping;
+
+	public interface IDataContextInfo
+	{
+		IDataContext  DataContext    { get; }
+		string        ContextID      { get; }
+		MappingSchema MappingSchema  { get; }
+		bool          DisposeContext { get; }
+
+		ISqlProvider     CreateSqlProvider();
+		IDataContextInfo Clone(bool forNestedQuery);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/IExpressionQuery.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+using System;
+
+namespace BLToolkit.Data.Linq
+{
+	interface IExpressionQuery
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/IQueryContext.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,13 @@
+using System;
+
+namespace BLToolkit.Data.Linq
+{
+	using Data.Sql;
+
+	public interface IQueryContext
+	{
+		SqlQuery       SqlQuery { get; }
+		object         Context  { get; set; }
+		SqlParameter[] GetParameters();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/ISelectInsertable.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+using System;
+
+namespace BLToolkit.Data.Linq
+{
+	public interface ISelectInsertable<TSource,TTarget>
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/ITable.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+using System;
+
+namespace BLToolkit.Data.Linq
+{
+	interface ITable
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/IUpdatable.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+using System;
+
+namespace BLToolkit.Data.Linq
+{
+	public interface IUpdatable<out T>
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/IValueInsertable.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+using System;
+
+namespace BLToolkit.Data.Linq
+{
+	public interface IValueInsertable<T>
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/IgnoreIEnumerableAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+using System;
+
+namespace BLToolkit.Data.Linq
+{
+	[AttributeUsageAttribute(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
+	public class IgnoreIEnumerableAttribute : Attribute
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/LinqException.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,87 @@
+using System;
+using System.Runtime.Serialization;
+
+namespace BLToolkit.Data.Linq
+{
+	/// <summary>
+	/// Defines the base class for the namespace exceptions.
+	/// </summary>
+	/// <remarks>
+	/// This class is the base class for exceptions that may occur during
+	/// execution of the namespace members.
+	/// </remarks>
+	[Serializable] 
+	public class LinqException : Exception
+	{
+		/// <summary>
+		/// Initializes a new instance of the <see cref="LinqException"/> class.
+		/// </summary>
+		/// <remarks>
+		/// This constructor initializes the <see cref="Exception.Message"/>
+		/// property of the new instance
+		/// to a system-supplied message that describes the error,
+		/// such as "BLToolkit Linq error has occurred."
+		/// </remarks>
+		public LinqException()
+			: base("A BLToolkit Linq error has occurred.")
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="LinqException"/> class
+		/// with the specified error message.
+		/// </summary>
+		/// <param name="message">The message to display to the client when the exception is thrown.</param>
+		/// <param name="args">An System.Object array containing zero or more objects to format.</param>
+		/// <seealso cref="Exception.Message"/>
+		[JetBrains.Annotations.StringFormatMethod("args")]
+		public LinqException(string message, params object[] args)
+			: base(string.Format(message, args))
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="LinqException"/> class
+		/// with the specified error message and InnerException property.
+		/// </summary>
+		/// <param name="message">The message to display to the client when the exception is thrown.</param>
+		/// <param name="innerException">The InnerException, if any, that threw the current exception.</param>
+		/// <seealso cref="Exception.Message"/>
+		/// <seealso cref="Exception.InnerException"/>
+		public LinqException(string message, Exception innerException)
+			: base(message, innerException)
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="LinqException"/> class
+		/// with the InnerException property.
+		/// </summary>
+		/// <param name="innerException">The InnerException, if any, that threw the current exception.</param>
+		/// <seealso cref="Exception.InnerException"/>
+		public LinqException(Exception innerException)
+			: base(innerException.Message, innerException)
+		{
+		}
+
+#if !SILVERLIGHT
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="LinqException"/> class
+		/// with serialized data.
+		/// </summary>
+		/// <param name="info">The object that holds the serialized object data.</param>
+		/// <param name="context">The contextual information about the source or destination.</param>
+		/// <remarks>
+		/// This constructor is called during deserialization to
+		/// reconstitute the exception object transmitted over a stream.
+		/// </remarks>
+		protected LinqException(SerializationInfo info, StreamingContext context)
+			: base(info, context)
+		{
+		}
+
+#endif
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/LinqExtensions.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,716 @@
+using System;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+
+using JetBrains.Annotations;
+
+namespace BLToolkit.Data.Linq
+{
+	public static class LinqExtensions
+	{
+		#region Table Helpers
+
+		static public Table<T> TableName<T>([NotNull] this Table<T> table, [NotNull] string name)
+		{
+			if (table == null) throw new ArgumentNullException("table");
+			if (name  == null) throw new ArgumentNullException("name");
+
+			table.Expression = Expression.Call(
+				null,
+				((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
+				new[] { table.Expression, Expression.Constant(name) });
+
+			return table;
+		}
+
+		static public Table<T> DatabaseName<T>([NotNull] this Table<T> table, [NotNull] string name)
+		{
+			if (table == null) throw new ArgumentNullException("table");
+			if (name  == null) throw new ArgumentNullException("name");
+
+			table.Expression = Expression.Call(
+				null,
+				((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
+				new[] { table.Expression, Expression.Constant(name) });
+
+			return table;
+		}
+
+		static public Table<T> OwnerName<T>([NotNull] this Table<T> table, [NotNull] string name)
+		{
+			if (table == null) throw new ArgumentNullException("table");
+			if (name  == null) throw new ArgumentNullException("name");
+
+			table.Expression = Expression.Call(
+				null,
+				((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
+				new[] { table.Expression, Expression.Constant(name) });
+
+			return table;
+		}
+
+		#endregion
+
+		#region Scalar Select
+
+		static public T Select<T>([NotNull] this IDataContext dataContext, [NotNull, InstantHandle] Expression<Func<T>> selector)
+		{
+			if (dataContext == null) throw new ArgumentNullException("dataContext");
+			if (selector    == null) throw new ArgumentNullException("selector");
+
+			var q = new Table<T>(dataContext, selector);
+
+			foreach (var item in q)
+				return item;
+
+			throw new InvalidOperationException();
+		}
+
+		#endregion
+
+		#region Delete
+
+		public static int Delete<T>([NotNull] this IQueryable<T> source)
+		{
+			if (source == null) throw new ArgumentNullException("source");
+
+			return source.Provider.Execute<int>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
+					new[] { source.Expression }));
+		}
+
+		public static int Delete<T>(
+			[NotNull, InstantHandle] this IQueryable<T>       source,
+			[NotNull, InstantHandle] Expression<Func<T,bool>> predicate)
+		{
+			if (source    == null) throw new ArgumentNullException("source");
+			if (predicate == null) throw new ArgumentNullException("predicate");
+
+			return source.Provider.Execute<int>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
+					new[] { source.Expression, Expression.Quote(predicate) }));
+		}
+
+		#endregion
+
+		#region Update
+
+		public static int Update<TSource,TTarget>(
+			[NotNull]                this IQueryable<TSource>          source,
+			[NotNull]                Table<TTarget>                    target,
+			[NotNull, InstantHandle] Expression<Func<TSource,TTarget>> setter)
+		{
+			if (source == null) throw new ArgumentNullException("source");
+			if (target == null) throw new ArgumentNullException("target");
+			if (setter == null) throw new ArgumentNullException("setter");
+
+			return source.Provider.Execute<int>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(TSource), typeof(TTarget) }),
+					new[] { source.Expression, ((IQueryable<TTarget>)target).Expression, Expression.Quote(setter) }));
+		}
+
+		public static int Update<T>(
+			[NotNull]                this IQueryable<T>    source,
+			[NotNull, InstantHandle] Expression<Func<T,T>> setter)
+		{
+			if (source == null) throw new ArgumentNullException("source");
+			if (setter == null) throw new ArgumentNullException("setter");
+
+			return source.Provider.Execute<int>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
+					new[] { source.Expression, Expression.Quote(setter) }));
+		}
+
+		public static int Update<T>(
+			[NotNull]                this IQueryable<T>       source,
+			[NotNull, InstantHandle] Expression<Func<T,bool>> predicate,
+			[NotNull, InstantHandle] Expression<Func<T,T>>    setter)
+		{
+			if (source    == null) throw new ArgumentNullException("source");
+			if (predicate == null) throw new ArgumentNullException("predicate");
+			if (setter    == null) throw new ArgumentNullException("setter");
+
+			return source.Provider.Execute<int>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
+					new[] { source.Expression, Expression.Quote(predicate), Expression.Quote(setter) }));
+		}
+
+		public static int Update<T>([NotNull] this IUpdatable<T> source)
+		{
+			if (source == null) throw new ArgumentNullException("source");
+
+			var query = ((Updatable<T>)source).Query;
+
+			return query.Provider.Execute<int>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
+					new[] { query.Expression }));
+		}
+
+		class Updatable<T> : IUpdatable<T>
+		{
+			public IQueryable<T> Query;
+		}
+
+		public static IUpdatable<T> AsUpdatable<T>([NotNull] this IQueryable<T> source)
+		{
+			if (source  == null) throw new ArgumentNullException("source");
+
+			var query = source.Provider.CreateQuery<T>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
+					new[] { source.Expression }));
+
+			return new Updatable<T> { Query = query };
+		}
+
+		public static IUpdatable<T> Set<T,TV>(
+			[NotNull]                this IQueryable<T>     source,
+			[NotNull, InstantHandle] Expression<Func<T,TV>> extract,
+			[NotNull, InstantHandle] Expression<Func<T,TV>> update)
+		{
+			if (source  == null) throw new ArgumentNullException("source");
+			if (extract == null) throw new ArgumentNullException("extract");
+			if (update  == null) throw new ArgumentNullException("update");
+
+			var query = source.Provider.CreateQuery<T>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T), typeof(TV) }),
+					new[] { source.Expression, Expression.Quote(extract), Expression.Quote(update) }));
+
+			return new Updatable<T> { Query = query };
+		}
+
+		public static IUpdatable<T> Set<T,TV>(
+			[NotNull]                this IUpdatable<T>    source,
+			[NotNull, InstantHandle] Expression<Func<T,TV>> extract,
+			[NotNull, InstantHandle] Expression<Func<T,TV>> update)
+		{
+			if (source  == null) throw new ArgumentNullException("source");
+			if (extract == null) throw new ArgumentNullException("extract");
+			if (update  == null) throw new ArgumentNullException("update");
+
+			var query = ((Updatable<T>)source).Query;
+
+			query = query.Provider.CreateQuery<T>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T), typeof(TV) }),
+					new[] { query.Expression, Expression.Quote(extract), Expression.Quote(update) }));
+
+			return new Updatable<T> { Query = query };
+		}
+
+		public static IUpdatable<T> Set<T,TV>(
+			[NotNull]                this IQueryable<T>     source,
+			[NotNull, InstantHandle] Expression<Func<T,TV>> extract,
+			[NotNull, InstantHandle] Expression<Func<TV>>   update)
+		{
+			if (source  == null) throw new ArgumentNullException("source");
+			if (extract == null) throw new ArgumentNullException("extract");
+			if (update  == null) throw new ArgumentNullException("update");
+
+			var query = source.Provider.CreateQuery<T>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T), typeof(TV) }),
+					new[] { source.Expression, Expression.Quote(extract), Expression.Quote(update) }));
+
+			return new Updatable<T> { Query = query };
+		}
+
+		public static IUpdatable<T> Set<T,TV>(
+			[NotNull]                this IUpdatable<T>    source,
+			[NotNull, InstantHandle] Expression<Func<T,TV>> extract,
+			[NotNull, InstantHandle] Expression<Func<TV>>   update)
+		{
+			if (source  == null) throw new ArgumentNullException("source");
+			if (extract == null) throw new ArgumentNullException("extract");
+			if (update  == null) throw new ArgumentNullException("update");
+
+			var query = ((Updatable<T>)source).Query;
+
+			query = query.Provider.CreateQuery<T>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T), typeof(TV) }),
+					new[] { query.Expression, Expression.Quote(extract), Expression.Quote(update) }));
+
+			return new Updatable<T> { Query = query };
+		}
+
+		public static IUpdatable<T> Set<T,TV>(
+			[NotNull]                this IQueryable<T>     source,
+			[NotNull, InstantHandle] Expression<Func<T,TV>> extract,
+			TV                                              value)
+		{
+			if (source  == null) throw new ArgumentNullException("source");
+			if (extract == null) throw new ArgumentNullException("extract");
+
+			var query = source.Provider.CreateQuery<T>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T), typeof(TV) }),
+					new[] { source.Expression, Expression.Quote(extract), Expression.Constant(value, typeof(TV)) }));
+
+			return new Updatable<T> { Query = query };
+		}
+
+		public static IUpdatable<T> Set<T,TV>(
+			[NotNull]                this IUpdatable<T>    source,
+			[NotNull, InstantHandle] Expression<Func<T,TV>> extract,
+			TV                                              value)
+		{
+			if (source  == null) throw new ArgumentNullException("source");
+			if (extract == null) throw new ArgumentNullException("extract");
+
+			var query = ((Updatable<T>)source).Query;
+
+			query = query.Provider.CreateQuery<T>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T), typeof(TV) }),
+					new[] { query.Expression, Expression.Quote(extract), Expression.Constant(value, typeof(TV)) }));
+
+			return new Updatable<T> { Query = query };
+		}
+
+		#endregion
+
+		#region Insert
+
+		public static int Insert<T>(
+			[NotNull]                this Table<T>       target,
+			[NotNull, InstantHandle] Expression<Func<T>> setter)
+		{
+			if (target == null) throw new ArgumentNullException("target");
+			if (setter == null) throw new ArgumentNullException("setter");
+
+			IQueryable<T> query = target;
+
+			return query.Provider.Execute<int>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
+					new[] { query.Expression, Expression.Quote(setter) }));
+		}
+
+        public static object InsertWithIdentity<T>(
+			[NotNull]                this Table<T>       target,
+			[NotNull, InstantHandle] Expression<Func<T>> setter)
+		{
+			if (target == null) throw new ArgumentNullException("target");
+			if (setter == null) throw new ArgumentNullException("setter");
+
+			IQueryable<T> query = target;
+
+			return query.Provider.Execute<object>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
+					new[] { query.Expression, Expression.Quote(setter) }));
+		}
+
+		#region ValueInsertable
+
+		class ValueInsertable<T> : IValueInsertable<T>
+		{
+			public IQueryable<T> Query;
+		}
+
+		public static IValueInsertable<T> Into<T>(this IDataContext dataContext, [NotNull] Table<T> target)
+		{
+			if (target == null) throw new ArgumentNullException("target");
+
+			IQueryable<T> query = target;
+
+			var q = query.Provider.CreateQuery<T>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
+					new[] { Expression.Constant(null, typeof(IDataContext)), query.Expression }));
+
+			return new ValueInsertable<T> { Query = q };
+		}
+
+		public static IValueInsertable<T> Value<T,TV>(
+			[NotNull]                this Table<T>          source,
+			[NotNull, InstantHandle] Expression<Func<T,TV>> field,
+			[NotNull, InstantHandle] Expression<Func<TV>>   value)
+		{
+			if (source == null) throw new ArgumentNullException("source");
+			if (field  == null) throw new ArgumentNullException("field");
+			if (value  == null) throw new ArgumentNullException("value");
+
+			var query = (IQueryable<T>)source;
+
+			var q = query.Provider.CreateQuery<T>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T), typeof(TV) }),
+					new[] { query.Expression, Expression.Quote(field), Expression.Quote(value) }));
+
+			return new ValueInsertable<T> { Query = q };
+		}
+
+		public static IValueInsertable<T> Value<T,TV>(
+			[NotNull]                this Table<T>          source,
+			[NotNull, InstantHandle] Expression<Func<T,TV>> field,
+			TV                                              value)
+		{
+			if (source == null) throw new ArgumentNullException("source");
+			if (field  == null) throw new ArgumentNullException("field");
+
+			var query = (IQueryable<T>)source;
+
+			var q = query.Provider.CreateQuery<T>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T), typeof(TV) }),
+					new[] { query.Expression, Expression.Quote(field), Expression.Constant(value, typeof(TV)) }));
+
+			return new ValueInsertable<T> { Query = q };
+		}
+
+		public static IValueInsertable<T> Value<T,TV>(
+			[NotNull]                this IValueInsertable<T> source,
+			[NotNull, InstantHandle] Expression<Func<T,TV>>   field,
+			[NotNull, InstantHandle] Expression<Func<TV>>     value)
+		{
+			if (source == null) throw new ArgumentNullException("source");
+			if (field  == null) throw new ArgumentNullException("field");
+			if (value  == null) throw new ArgumentNullException("value");
+
+			var query = ((ValueInsertable<T>)source).Query;
+
+			var q = query.Provider.CreateQuery<T>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T), typeof(TV) }),
+					new[] { query.Expression, Expression.Quote(field), Expression.Quote(value) }));
+
+			return new ValueInsertable<T> { Query = q };
+		}
+
+		public static IValueInsertable<T> Value<T,TV>(
+			[NotNull]                this IValueInsertable<T> source,
+			[NotNull, InstantHandle] Expression<Func<T,TV>>   field,
+			TV                                                value)
+		{
+			if (source == null) throw new ArgumentNullException("source");
+			if (field  == null) throw new ArgumentNullException("field");
+
+			var query = ((ValueInsertable<T>)source).Query;
+
+			var q = query.Provider.CreateQuery<T>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T), typeof(TV) }),
+					new[] { query.Expression, Expression.Quote(field), Expression.Constant(value, typeof(TV)) }));
+
+			return new ValueInsertable<T> { Query = q };
+		}
+
+		public static int Insert<T>([NotNull] this IValueInsertable<T> source)
+		{
+			if (source == null) throw new ArgumentNullException("source");
+
+			var query = ((ValueInsertable<T>)source).Query;
+
+			return query.Provider.Execute<int>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
+					new[] { query.Expression }));
+		}
+
+		public static object InsertWithIdentity<T>([NotNull] this IValueInsertable<T> source)
+		{
+			if (source == null) throw new ArgumentNullException("source");
+
+			var query = ((ValueInsertable<T>)source).Query;
+
+			return query.Provider.Execute<object>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
+					new[] { query.Expression }));
+		}
+
+		#endregion
+
+		#region SelectInsertable
+
+		public static int Insert<TSource,TTarget>(
+			[NotNull]                this IQueryable<TSource> source, 
+			[NotNull]                Table<TTarget> target, 
+			[NotNull, InstantHandle] Expression<Func<TSource, TTarget>> setter)
+		{
+			if (source == null) throw new ArgumentNullException("source");
+			if (target == null) throw new ArgumentNullException("target");
+			if (setter == null) throw new ArgumentNullException("setter");
+
+			return source.Provider.Execute<int>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(TSource), typeof(TTarget) }),
+					new[] { source.Expression, ((IQueryable<TTarget>)target).Expression, Expression.Quote(setter) }));
+		}
+
+		public static object InsertWithIdentity<TSource,TTarget>(
+			[NotNull]                this IQueryable<TSource>          source,
+			[NotNull]                Table<TTarget>                    target,
+			[NotNull, InstantHandle] Expression<Func<TSource,TTarget>> setter)
+		{
+			if (source == null) throw new ArgumentNullException("source");
+			if (target == null) throw new ArgumentNullException("target");
+			if (setter == null) throw new ArgumentNullException("setter");
+
+			return source.Provider.Execute<object>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(TSource), typeof(TTarget) }),
+					new[] { source.Expression, ((IQueryable<TTarget>)target).Expression, Expression.Quote(setter) }));
+		}
+
+		class SelectInsertable<T,TT> : ISelectInsertable<T,TT>
+		{
+			public IQueryable<T> Query;
+		}
+
+		public static ISelectInsertable<TSource,TTarget> Into<TSource,TTarget>(
+			[NotNull] this IQueryable<TSource> source,
+			[NotNull] Table<TTarget>           target)
+		{
+			if (target == null) throw new ArgumentNullException("target");
+
+			var q = source.Provider.CreateQuery<TSource>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(TSource), typeof(TTarget) }),
+					new[] { source.Expression, ((IQueryable<TTarget>)target).Expression }));
+
+			return new SelectInsertable<TSource,TTarget> { Query = q };
+		}
+
+		public static ISelectInsertable<TSource,TTarget> Value<TSource,TTarget,TValue>(
+			[NotNull]                this ISelectInsertable<TSource,TTarget> source,
+			[NotNull, InstantHandle] Expression<Func<TTarget,TValue>>        field,
+			[NotNull, InstantHandle] Expression<Func<TSource,TValue>>        value)
+		{
+			if (source == null) throw new ArgumentNullException("source");
+			if (field  == null) throw new ArgumentNullException("field");
+			if (value  == null) throw new ArgumentNullException("value");
+
+			var query = ((SelectInsertable<TSource,TTarget>)source).Query;
+
+			var q = query.Provider.CreateQuery<TSource>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(TSource), typeof(TTarget), typeof(TValue) }),
+					new[] { query.Expression, Expression.Quote(field), Expression.Quote(value) }));
+
+			return new SelectInsertable<TSource,TTarget> { Query = q };
+		}
+
+		public static ISelectInsertable<TSource,TTarget> Value<TSource,TTarget,TValue>(
+			[NotNull]                this ISelectInsertable<TSource,TTarget> source,
+			[NotNull, InstantHandle] Expression<Func<TTarget,TValue>>        field,
+			[NotNull, InstantHandle] Expression<Func<TValue>>                value)
+		{
+			if (source == null) throw new ArgumentNullException("source");
+			if (field  == null) throw new ArgumentNullException("field");
+			if (value  == null) throw new ArgumentNullException("value");
+
+			var query = ((SelectInsertable<TSource,TTarget>)source).Query;
+
+			var q = query.Provider.CreateQuery<TSource>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(TSource), typeof(TTarget), typeof(TValue) }),
+					new[] { query.Expression, Expression.Quote(field), Expression.Quote(value) }));
+
+			return new SelectInsertable<TSource,TTarget> { Query = q };
+		}
+
+		public static ISelectInsertable<TSource,TTarget> Value<TSource,TTarget,TValue>(
+			[NotNull]                this ISelectInsertable<TSource,TTarget> source,
+			[NotNull, InstantHandle] Expression<Func<TTarget,TValue>>        field,
+			TValue                                            value)
+		{
+			if (source == null) throw new ArgumentNullException("source");
+			if (field  == null) throw new ArgumentNullException("field");
+
+			var query = ((SelectInsertable<TSource,TTarget>)source).Query;
+
+			var q = query.Provider.CreateQuery<TSource>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(TSource), typeof(TTarget), typeof(TValue) }),
+					new[] { query.Expression, Expression.Quote(field), Expression.Constant(value, typeof(TValue)) }));
+
+			return new SelectInsertable<TSource,TTarget> { Query = q };
+		}
+
+		public static int Insert<TSource,TTarget>([NotNull] this ISelectInsertable<TSource,TTarget> source)
+		{
+			if (source == null) throw new ArgumentNullException("source");
+
+			var query = ((SelectInsertable<TSource,TTarget>)source).Query;
+
+			return query.Provider.Execute<int>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(TSource), typeof(TTarget) }),
+					new[] { query.Expression }));
+		}
+
+		public static object InsertWithIdentity<TSource,TTarget>([NotNull] this ISelectInsertable<TSource,TTarget> source)
+		{
+			if (source == null) throw new ArgumentNullException("source");
+
+			var query = ((SelectInsertable<TSource,TTarget>)source).Query;
+
+			return query.Provider.Execute<object>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(TSource), typeof(TTarget) }),
+					new[] { query.Expression }));
+		}
+
+		#endregion
+
+		#endregion
+
+		#region InsertOrUpdate
+
+		public static int InsertOrUpdate<T>(
+			[NotNull]                this Table<T>         target,
+			[NotNull, InstantHandle] Expression<Func<T>>   insertSetter,
+			[NotNull, InstantHandle] Expression<Func<T,T>> onDuplicateKeyUpdateSetter)
+		{
+			if (target                     == null) throw new ArgumentNullException("target");
+			if (insertSetter               == null) throw new ArgumentNullException("insertSetter");
+			if (onDuplicateKeyUpdateSetter == null) throw new ArgumentNullException("onDuplicateKeyUpdateSetter");
+
+			IQueryable<T> query = target;
+
+			return query.Provider.Execute<int>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
+					new[] { query.Expression, Expression.Quote(insertSetter), Expression.Quote(onDuplicateKeyUpdateSetter) }));
+		}
+
+		public static int InsertOrUpdate<T>(
+			[NotNull]                this Table<T>         target,
+			[NotNull, InstantHandle] Expression<Func<T>>   insertSetter,
+			[NotNull, InstantHandle] Expression<Func<T,T>> onDuplicateKeyUpdateSetter,
+			[NotNull, InstantHandle] Expression<Func<T>>   keySelector)
+		{
+			if (target                     == null) throw new ArgumentNullException("target");
+			if (insertSetter               == null) throw new ArgumentNullException("insertSetter");
+			if (onDuplicateKeyUpdateSetter == null) throw new ArgumentNullException("onDuplicateKeyUpdateSetter");
+			if (keySelector                == null) throw new ArgumentNullException("keySelector");
+
+			IQueryable<T> query = target;
+
+			return query.Provider.Execute<int>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
+					new[]
+					{
+						query.Expression,
+						Expression.Quote(insertSetter),
+						Expression.Quote(onDuplicateKeyUpdateSetter),
+						Expression.Quote(keySelector)
+					}));
+		}
+
+		#endregion
+
+		#region Take / Skip / ElementAt
+
+		public static IQueryable<TSource> Take<TSource>(
+			[NotNull] this IQueryable<TSource> source,
+			[NotNull, InstantHandle] Expression<Func<int>>    count)
+		{
+			if (source == null) throw new ArgumentNullException("source");
+			if (count  == null) throw new ArgumentNullException("count");
+
+			return source.Provider.CreateQuery<TSource>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(TSource) }),
+					new[] { source.Expression, Expression.Quote(count) }));
+		}
+
+		public static IQueryable<TSource> Skip<TSource>(
+			[NotNull]                this IQueryable<TSource> source,
+			[NotNull, InstantHandle] Expression<Func<int>>    count)
+		{
+			if (source == null) throw new ArgumentNullException("source");
+			if (count  == null) throw new ArgumentNullException("count");
+
+			return source.Provider.CreateQuery<TSource>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(TSource) }),
+					new[] { source.Expression, Expression.Quote(count) }));
+		}
+
+		public static TSource ElementAt<TSource>(
+			[NotNull]                this IQueryable<TSource> source,
+			[NotNull, InstantHandle] Expression<Func<int>>    index)
+		{
+			if (source == null) throw new ArgumentNullException("source");
+			if (index  == null) throw new ArgumentNullException("index");
+
+			return source.Provider.Execute<TSource>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(TSource) }),
+					new[] { source.Expression, Expression.Quote(index) }));
+		}
+
+		public static TSource ElementAtOrDefault<TSource>(
+			[NotNull]                this IQueryable<TSource> source,
+			[NotNull, InstantHandle] Expression<Func<int>> index)
+		{
+			if (source == null) throw new ArgumentNullException("source");
+			if (index  == null) throw new ArgumentNullException("index");
+
+			return source.Provider.Execute<TSource>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(TSource) }),
+					new[] { source.Expression, Expression.Quote(index) }));
+		}
+
+		#endregion
+
+		#region Stub helpers
+
+		static TOutput Where<TOutput,TSource,TInput>(this TInput source, Func<TSource,bool> predicate)
+		{
+			throw new InvalidOperationException();
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/MemberInfoComparer.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+
+namespace BLToolkit.Data.Linq
+{
+	using Reflection;
+
+	class MemberInfoComparer : IEqualityComparer<MemberInfo>
+	{
+		public bool Equals(MemberInfo x, MemberInfo y)
+		{
+			return TypeHelper.Equals(x, y);
+		}
+
+		public int GetHashCode(MemberInfo obj)
+		{
+			return obj == null ? 0 : obj.Name.GetHashCode();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/MethodExpressionAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,22 @@
+using System;
+
+namespace BLToolkit.Data.Linq
+{
+	[AttributeUsageAttribute(AttributeTargets.Property | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
+	public class MethodExpressionAttribute : Attribute
+	{
+		public MethodExpressionAttribute(string methodName)
+		{
+			MethodName = methodName;
+		}
+
+		public MethodExpressionAttribute(string sqlProvider, string methodName)
+		{
+			SqlProvider = sqlProvider;
+			MethodName  = methodName;
+		}
+
+		public string SqlProvider { get; set; }
+		public string MethodName  { get; set; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Query.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1120 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq
+{
+	using BLToolkit.Linq;
+	using Common;
+	using Data.Sql;
+	using Data.Sql.SqlProvider;
+	using Mapping;
+	using Builder;
+	using Reflection;
+
+	public abstract class Query
+	{
+		#region Init
+
+		public abstract void Init(IBuildContext parseContext, List<ParameterAccessor> sqlParameters);
+
+		#endregion
+
+		#region Compare
+
+		public string        ContextID;
+		public Expression    Expression;
+		public MappingSchema MappingSchema;
+
+		public bool Compare(string contextID, MappingSchema mappingSchema, Expression expr)
+		{
+			return
+				ContextID.Length == contextID.Length &&
+				ContextID        == contextID        &&
+				MappingSchema    == mappingSchema    &&
+				ExpressionHelper.Compare(Expression, expr, _queryableAccessorDic);
+		}
+
+		readonly Dictionary<Expression,QueryableAccessor> _queryableAccessorDic  = new Dictionary<Expression,QueryableAccessor>();
+		readonly List<QueryableAccessor>                  _queryableAccessorList = new List<QueryableAccessor>();
+
+		internal int AddQueryableAccessors(Expression expr, Expression<Func<Expression,IQueryable>> qe)
+		{
+			QueryableAccessor e;
+
+			if (_queryableAccessorDic.TryGetValue(expr, out e))
+				return _queryableAccessorList.IndexOf(e);
+
+			e = new QueryableAccessor { Accessor = qe.Compile() };
+			e.Queryable = e.Accessor(expr);
+
+			_queryableAccessorDic. Add(expr, e);
+			_queryableAccessorList.Add(e);
+
+			return _queryableAccessorList.Count - 1;
+		}
+
+		public Expression GetIQueryable(int n, Expression expr)
+		{
+			return _queryableAccessorList[n].Accessor(expr).Expression;
+		}
+
+		#endregion
+	}
+
+	public class Query<T> : Query
+	{
+		public Query()
+		{
+			GetIEnumerable = MakeEnumerable;
+		}
+
+		public override void Init(IBuildContext parseContext, List<ParameterAccessor> sqlParameters)
+		{
+			Queries.Add(new QueryInfo
+			{
+				SqlQuery   = parseContext.SqlQuery,
+				Parameters = sqlParameters,
+			});
+
+			ContextID         = parseContext.Builder.DataContextInfo.ContextID;
+			MappingSchema     = parseContext.Builder.MappingSchema;
+			CreateSqlProvider = parseContext.Builder.DataContextInfo.CreateSqlProvider;
+			Expression        = parseContext.Builder.OriginalExpression;
+			//Parameters        = parameters;
+		}
+
+		#region Properties & Fields
+
+		public Query<T>              Next;
+		public ParameterExpression[] CompiledParameters;
+		public List<QueryInfo>       Queries = new List<QueryInfo>(1);
+		public Func<ISqlProvider>    CreateSqlProvider;
+
+		private ISqlProvider _sqlProvider; 
+		public  ISqlProvider  SqlProvider
+		{
+			get { return _sqlProvider ?? (_sqlProvider = CreateSqlProvider()); }
+		}
+
+		public Func<QueryContext,IDataContextInfo,Expression,object[],object>         GetElement;
+		public Func<QueryContext,IDataContextInfo,Expression,object[],IEnumerable<T>> GetIEnumerable;
+
+		IEnumerable<T> MakeEnumerable(QueryContext qc, IDataContextInfo dci, Expression expr, object[] ps)
+		{
+			yield return ConvertTo<T>.From(GetElement(qc, dci, expr, ps));
+		}
+
+		#endregion
+
+		#region GetInfo
+
+		static          Query<T> _first;
+		static readonly object   _sync = new object();
+
+		const int CacheSize = 100;
+
+		public static Query<T> GetQuery(IDataContextInfo dataContextInfo, Expression expr)
+		{
+			var query = FindQuery(dataContextInfo, expr);
+
+			if (query == null)
+			{
+				lock (_sync)
+				{
+					query = FindQuery(dataContextInfo, expr);
+
+					if (query == null)
+					{
+						if (Configuration.Linq.GenerateExpressionTest)
+						{
+#if FW4 || SILVERLIGHT
+							var testFile = new ExpressionTestGenerator().GenerateSource(expr);
+#else
+							var testFile = "";
+#endif
+
+#if !SILVERLIGHT
+							DbManager.WriteTraceLine(
+								"Expression test code generated: '" + testFile + "'.", 
+								DbManager.TraceSwitch.DisplayName);
+#endif
+						}
+
+						try
+						{
+							query = new ExpressionBuilder(new Query<T>(), dataContextInfo, expr, null).Build<T>();
+						}
+						catch (Exception)
+						{
+							if (!Configuration.Linq.GenerateExpressionTest)
+							{
+#if !SILVERLIGHT
+								DbManager.WriteTraceLine(
+									"To generate test code to diagnose the problem set 'BLToolkit.Common.Configuration.Linq.GenerateExpressionTest = true'.",
+									DbManager.TraceSwitch.DisplayName);
+#endif
+							}
+
+							throw;
+						}
+
+						query.Next = _first;
+						_first = query;
+					}
+				}
+			}
+
+			return query;
+		}
+
+		static Query<T> FindQuery(IDataContextInfo dataContextInfo, Expression expr)
+		{
+			Query<T> prev = null;
+			var      n    = 0;
+
+			for (var query = _first; query != null; query = query.Next)
+			{
+				if (query.Compare(dataContextInfo.ContextID, dataContextInfo.MappingSchema, expr))
+				{
+					if (prev != null)
+					{
+						lock (_sync)
+						{
+							prev.Next  = query.Next;
+							query.Next = _first;
+							_first     = query;
+						}
+					}
+
+					return query;
+				}
+
+				if (n++ >= CacheSize)
+				{
+					query.Next = null;
+					return null;
+				}
+
+				prev = query;
+			}
+
+			return null;
+		}
+
+		#endregion
+
+		#region NonQueryQuery
+
+		void FinalizeQuery()
+		{
+			foreach (var sql in Queries)
+			{
+				sql.SqlQuery   = SqlProvider.Finalize(sql.SqlQuery);
+				sql.Parameters = sql.Parameters
+					.Select (p => new { p, idx = sql.SqlQuery.Parameters.IndexOf(p.SqlParameter) })
+					.OrderBy(p => p.idx)
+					.Select (p => p.p)
+					.ToList();
+			}
+		}
+
+		public void SetNonQueryQuery()
+		{
+			FinalizeQuery();
+
+			if (Queries.Count != 1)
+				throw new InvalidOperationException();
+
+			SqlProvider.SqlQuery = Queries[0].SqlQuery;
+
+			GetElement = (ctx,db,expr,ps) => NonQueryQuery(db, expr, ps);
+		}
+
+		int NonQueryQuery(IDataContextInfo dataContextInfo, Expression expr, object[] parameters)
+		{
+			var dataContext = dataContextInfo.DataContext;
+
+			object query = null;
+
+			try
+			{
+				query = SetCommand(dataContext, expr, parameters, 0);
+				return dataContext.ExecuteNonQuery(query);
+			}
+			finally
+			{
+				if (query != null)
+					dataContext.ReleaseQuery(query);
+
+				if (dataContextInfo.DisposeContext)
+					dataContext.Dispose();
+			}
+		}
+
+		public void SetNonQueryQuery2()
+		{
+			FinalizeQuery();
+
+			if (Queries.Count != 2)
+				throw new InvalidOperationException();
+
+			SqlProvider.SqlQuery = Queries[0].SqlQuery;
+
+			GetElement = (ctx,db,expr,ps) => NonQueryQuery2(db, expr, ps);
+		}
+
+		int NonQueryQuery2(IDataContextInfo dataContextInfo, Expression expr, object[] parameters)
+		{
+			var dataContext = dataContextInfo.DataContext;
+
+			object query = null;
+
+			try
+			{
+				query = SetCommand(dataContext, expr, parameters, 0);
+
+				var n = dataContext.ExecuteNonQuery(query);
+
+				if (n != 0)
+					return n;
+
+				query = SetCommand(dataContext, expr, parameters, 1);
+				return dataContext.ExecuteNonQuery(query);
+			}
+			finally
+			{
+				if (query != null)
+					dataContext.ReleaseQuery(query);
+
+				if (dataContextInfo.DisposeContext)
+					dataContext.Dispose();
+			}
+		}
+
+		#endregion
+
+		#region ScalarQuery
+
+		public void SetScalarQuery<TS>()
+		{
+			FinalizeQuery();
+
+			if (Queries.Count != 1)
+				throw new InvalidOperationException();
+
+			SqlProvider.SqlQuery = Queries[0].SqlQuery;
+
+			GetElement = (ctx,db,expr,ps) => ScalarQuery<TS>(db, expr, ps);
+		}
+
+		TS ScalarQuery<TS>(IDataContextInfo dataContextInfo, Expression expr, object[] parameters)
+		{
+			var dataContext = dataContextInfo.DataContext;
+
+			object query = null;
+
+			try
+			{
+				query = SetCommand(dataContext, expr, parameters, 0);
+				return (TS)dataContext.ExecuteScalar(query);
+			}
+			finally
+			{
+				if (query != null)
+					dataContext.ReleaseQuery(query);
+
+				if (dataContextInfo.DisposeContext)
+					dataContext.Dispose();
+			}
+		}
+
+		#endregion
+
+		#region Query
+
+		int GetParameterIndex(ISqlExpression parameter)
+		{
+			for (var i = 0; i < Queries[0].Parameters.Count; i++)
+			{
+				var p = Queries[0].Parameters[i].SqlParameter;
+						
+				if (p == parameter)
+					return i;
+			}
+
+			throw new InvalidOperationException();
+		}
+
+		IEnumerable<IDataReader> RunQuery(IDataContextInfo dataContextInfo, Expression expr, object[] parameters, int queryNumber)
+		{
+			var dataContext = dataContextInfo.DataContext;
+
+			object query = null;
+
+			try
+			{
+				query = SetCommand(dataContext, expr, parameters, queryNumber);
+
+				using (var dr = dataContext.ExecuteReader(query))
+					while (dr.Read())
+						yield return dr;
+			}
+			finally
+			{
+				if (query != null)
+					dataContext.ReleaseQuery(query);
+
+				if (dataContextInfo.DisposeContext)
+					dataContext.Dispose();
+			}
+		}
+
+		object SetCommand(IDataContext dataContext, Expression expr, object[] parameters, int idx)
+		{
+			lock (this)
+			{
+				SetParameters(expr, parameters, idx);
+				return dataContext.SetQuery(Queries[idx]);
+			}
+		}
+
+		void SetParameters(Expression expr, object[] parameters, int idx)
+		{
+			foreach (var p in Queries[idx].Parameters)
+			{
+				var value = p.Accessor(expr, parameters);
+
+				if (value is IEnumerable)
+				{
+					var type  = value.GetType();
+					var etype = TypeHelper.GetElementType(type);
+
+					if (etype == null || etype == typeof(object) ||
+						etype.IsEnum ||
+						(TypeHelper.IsNullableType(etype) && etype.GetGenericArguments()[0].IsEnum))
+					{
+						var values = new List<object>();
+
+						foreach (var v in (IEnumerable)value)
+						{
+							values.Add(v);
+							// Enum mapping done by parameter itself
+							//values.Add(v != null && v.GetType().IsEnum ?
+							//	MappingSchema.MapEnumToValue(v, true) :
+							//	v);
+						}
+
+						value = values;
+					}
+				}
+
+				p.SqlParameter.Value = value;
+			}
+		}
+
+		#endregion
+
+		#region GetSqlText
+
+		public string GetSqlText(IDataContext dataContext, Expression expr, object[] parameters, int idx)
+		{
+			var query = SetCommand(dataContext, expr, parameters, 0);
+			return dataContext.GetSqlText(query);
+		}
+
+		#endregion
+
+		#region Inner Types
+
+		internal delegate TElement Mapper<TElement>(
+			Query<T>      query,
+			QueryContext  qc,
+			IDataContext  dc,
+			IDataReader   rd,
+			MappingSchema ms,
+			Expression    expr,
+			object[]      ps);
+
+		public class QueryInfo : IQueryContext
+		{
+			public QueryInfo()
+			{
+				SqlQuery = new SqlQuery();
+			}
+
+			public SqlQuery SqlQuery { get; set; }
+			public object   Context  { get; set; }
+
+			public SqlParameter[] GetParameters()
+			{
+				var ps = new SqlParameter[Parameters.Count];
+
+				for (var i = 0; i < ps.Length; i++)
+					ps[i] = Parameters[i].SqlParameter;
+
+				return ps;
+			}
+
+			public List<ParameterAccessor> Parameters = new List<ParameterAccessor>();
+		}
+
+		#endregion
+
+		#region Object Operations
+
+		static class ObjectOperation<T1>
+		{
+			public static readonly Dictionary<object,Query<int>>    Insert             = new Dictionary<object,Query<int>>();
+			public static readonly Dictionary<object,Query<object>> InsertWithIdentity = new Dictionary<object,Query<object>>();
+			public static readonly Dictionary<object,Query<int>>    InsertOrUpdate     = new Dictionary<object,Query<int>>();
+			public static readonly Dictionary<object,Query<int>>    Update             = new Dictionary<object,Query<int>>();
+			public static readonly Dictionary<object,Query<int>>    Delete             = new Dictionary<object,Query<int>>();
+		}
+
+		static object ConvertNullable<TT>(TT value, TT defaultValue)
+			where TT : struct
+		{
+			return value.Equals(defaultValue) ? null : (object)value;
+		}
+
+		static ParameterAccessor GetParameter<TR>(IDataContext dataContext, SqlField field)
+		{
+			var exprParam = Expression.Parameter(typeof(Expression), "expr");
+
+			Expression getter = Expression.Convert(
+				Expression.Property(
+					Expression.Convert(exprParam, typeof(ConstantExpression)),
+					ReflectionHelper.Constant.Value),
+				typeof(T));
+
+			var mm       = field.MemberMapper;
+			var members  = mm.MemberName.Split('.');
+			var defValue = Expression.Constant(
+				mm.MapMemberInfo.DefaultValue ?? TypeHelper.GetDefaultValue(mm.MapMemberInfo.Type),
+				mm.MapMemberInfo.Type);
+
+			for (var i = 0; i < members.Length; i++)
+			{
+				var member = members[i];
+				var pof    = Expression.PropertyOrField(getter, member) as Expression;
+
+				if (i == 0)
+				{
+					if (members.Length == 1 && mm.IsExplicit)
+					{
+						if (getter.Type != typeof(object))
+							getter = Expression.Convert(getter, typeof(object));
+
+						pof = Expression.Call(
+							Expression.Constant(mm),
+							ReflectionHelper.Expressor<MemberMapper>.MethodExpressor(m => m.GetValue(null)),
+							getter);
+					}
+
+					getter = pof;
+				}
+				else
+				{
+					getter = Expression.Condition(Expression.Equal(getter, Expression.Constant(null)), defValue, pof);
+				}
+			}
+
+			if (!mm.Type.IsClass && !mm.Type.IsInterface && mm.MapMemberInfo.Nullable && !TypeHelper.IsNullableType(mm.Type))
+			{
+				var method = ReflectionHelper.Expressor<int>.MethodExpressor(_ => ConvertNullable(0, 0))
+					.GetGenericMethodDefinition()
+					.MakeGenericMethod(mm.Type);
+
+				getter = Expression.Call(null, method, getter, Expression.Constant(mm.MapMemberInfo.NullValue));
+			}
+			else
+			{
+				if (getter.Type != typeof(object))
+					getter = Expression.Convert(getter, typeof(object));
+			}
+
+			var mapper    = Expression.Lambda<Func<Expression,object[],object>>(
+				getter,
+				new [] { exprParam, Expression.Parameter(typeof(object[]), "ps") });
+
+			var param = new ParameterAccessor
+			{
+				Expression   = null,
+				Accessor     = mapper.Compile(),
+				SqlParameter = new SqlParameter(field.SystemType, field.Name.Replace('.', '_'), null, dataContext.MappingSchema)
+			};
+
+			if (TypeHelper.IsEnumOrNullableEnum(field.SystemType))
+			{
+				param.SqlParameter.SetEnumConverter(field.MemberMapper.ComplexMemberAccessor, dataContext.MappingSchema);
+			}
+
+			return param;
+		}
+
+		#region Insert
+
+		public static int Insert(IDataContextInfo dataContextInfo, T obj)
+		{
+			if (Equals(default(T), obj))
+				return 0;
+
+			Query<int> ei;
+
+			var key = new { dataContextInfo.MappingSchema, dataContextInfo.ContextID };
+
+			if (!ObjectOperation<T>.Insert.TryGetValue(key, out ei))
+				lock (_sync)
+					if (!ObjectOperation<T>.Insert.TryGetValue(key, out ei))
+					{
+						var sqlTable = new SqlTable<T>(dataContextInfo.MappingSchema);
+						var sqlQuery = new SqlQuery { QueryType = QueryType.Insert };
+
+						sqlQuery.Insert.Into = sqlTable;
+
+						ei = new Query<int>
+						{
+							MappingSchema     = dataContextInfo.MappingSchema,
+							ContextID         = dataContextInfo.ContextID,
+							CreateSqlProvider = dataContextInfo.CreateSqlProvider,
+							Queries           = { new Query<int>.QueryInfo { SqlQuery = sqlQuery, } }
+						};
+
+						foreach (var field in sqlTable.Fields)
+						{
+							if (field.Value.IsInsertable)
+							{
+								var param = GetParameter<int>(dataContextInfo.DataContext, field.Value);
+
+								ei.Queries[0].Parameters.Add(param);
+
+								sqlQuery.Insert.Items.Add(new SqlQuery.SetExpression(field.Value, param.SqlParameter));
+							}
+							else if (field.Value.IsIdentity)
+							{
+								var expr = ei.SqlProvider.GetIdentityExpression(sqlTable, field.Value, false);
+
+								if (expr != null)
+									sqlQuery.Insert.Items.Add(new SqlQuery.SetExpression(field.Value, expr));
+							}
+						}
+
+						ei.SetNonQueryQuery();
+
+						ObjectOperation<T>.Insert.Add(key, ei);
+					}
+
+			return (int)ei.GetElement(null, dataContextInfo, Expression.Constant(obj), null);
+		}
+
+		#endregion
+
+		#region InsertWithIdentity
+
+		public static object InsertWithIdentity(IDataContextInfo dataContextInfo, T obj)
+		{
+			if (Equals(default(T), obj))
+				return 0;
+
+			Query<object> ei;
+
+			var key = new { dataContextInfo.MappingSchema, dataContextInfo.ContextID };
+
+			if (!ObjectOperation<T>.InsertWithIdentity.TryGetValue(key, out ei))
+				lock (_sync)
+					if (!ObjectOperation<T>.InsertWithIdentity.TryGetValue(key, out ei))
+					{
+						var sqlTable = new SqlTable<T>(dataContextInfo.MappingSchema);
+						var sqlQuery = new SqlQuery { QueryType = QueryType.Insert };
+
+						sqlQuery.Insert.Into         = sqlTable;
+						sqlQuery.Insert.WithIdentity = true;
+
+						ei = new Query<object>
+						{
+							MappingSchema     = dataContextInfo.MappingSchema,
+							ContextID         = dataContextInfo.ContextID,
+							CreateSqlProvider = dataContextInfo.CreateSqlProvider,
+							Queries           = { new Query<object>.QueryInfo { SqlQuery = sqlQuery, } }
+						};
+
+						foreach (var field in sqlTable.Fields)
+						{
+							if (field.Value.IsInsertable)
+							{
+								var param = GetParameter<object>(dataContextInfo.DataContext, field.Value);
+
+								ei.Queries[0].Parameters.Add(param);
+
+								sqlQuery.Insert.Items.Add(new SqlQuery.SetExpression(field.Value, param.SqlParameter));
+							}
+							else if (field.Value.IsIdentity)
+							{
+								var expr = ei.SqlProvider.GetIdentityExpression(sqlTable, field.Value, true);
+
+								if (expr != null)
+									sqlQuery.Insert.Items.Add(new SqlQuery.SetExpression(field.Value, expr));
+							}
+						}
+
+						ei.SetScalarQuery<object>();
+
+						ObjectOperation<T>.InsertWithIdentity.Add(key, ei);
+					}
+
+			return ei.GetElement(null, dataContextInfo, Expression.Constant(obj), null);
+		}
+
+		#endregion
+
+		#region InsertOrReplace
+
+		[Obsolete("Use 'InsertOrReplace' instead.")]
+		public static int InsertOrUpdate(IDataContextInfo dataContextInfo, T obj)
+		{
+			return InsertOrReplace(dataContextInfo, obj);
+		}
+
+		public static int InsertOrReplace(IDataContextInfo dataContextInfo, T obj)
+		{
+			if (Equals(default(T), obj))
+				return 0;
+
+			Query<int> ei;
+
+			var key = new { dataContextInfo.MappingSchema, dataContextInfo.ContextID };
+
+			if (!ObjectOperation<T>.InsertOrUpdate.TryGetValue(key, out ei))
+			{
+				lock (_sync)
+				{
+					if (!ObjectOperation<T>.InsertOrUpdate.TryGetValue(key, out ei))
+					{
+						var fieldDic = new Dictionary<SqlField, ParameterAccessor>();
+						var sqlTable = new SqlTable<T>(dataContextInfo.MappingSchema);
+						var sqlQuery = new SqlQuery { QueryType = QueryType.InsertOrUpdate };
+
+						ParameterAccessor param;
+
+						sqlQuery.Insert.Into  = sqlTable;
+						sqlQuery.Update.Table = sqlTable;
+
+						sqlQuery.From.Table(sqlTable);
+
+						ei = new Query<int>
+						{
+							MappingSchema     = dataContextInfo.MappingSchema,
+							ContextID         = dataContextInfo.ContextID,
+							CreateSqlProvider = dataContextInfo.CreateSqlProvider,
+							Queries           = { new Query<int>.QueryInfo { SqlQuery = sqlQuery, } }
+						};
+
+						var supported = ei.SqlProvider.IsInsertOrUpdateSupported && ei.SqlProvider.CanCombineParameters;
+
+						// Insert.
+						//
+						foreach (var field in sqlTable.Fields.Select(f => f.Value))
+						{
+							if (field.IsInsertable)
+							{
+								if (!supported || !fieldDic.TryGetValue(field, out param))
+								{
+									param = GetParameter<int>(dataContextInfo.DataContext, field);
+									ei.Queries[0].Parameters.Add(param);
+
+									if (supported)
+										fieldDic.Add(field, param);
+								}
+
+								sqlQuery.Insert.Items.Add(new SqlQuery.SetExpression(field, param.SqlParameter));
+							}
+							else if (field.IsIdentity)
+							{
+								throw new LinqException("InsertOrUpdate method does not support identity field '{0}.{1}'.", sqlTable.Name, field.Name);
+							}
+						}
+
+						// Update.
+						//
+						var keys   = sqlTable.GetKeys(true).Cast<SqlField>().ToList();
+						var fields = sqlTable.Fields.Values.Where(f => f.IsUpdatable).Except(keys).ToList();
+
+						if (keys.Count == 0)
+							throw new LinqException("InsertOrUpdate method requires the '{0}' table to have a primary key.", sqlTable.Name);
+
+						var q =
+						(
+							from k in keys
+							join i in sqlQuery.Insert.Items on k equals i.Column
+							select new { k, i }
+						).ToList();
+
+						var missedKey = keys.Except(q.Select(i => i.k)).FirstOrDefault();
+
+						if (missedKey != null)
+							throw new LinqException("InsertOrUpdate method requires the '{0}.{1}' field to be included in the insert setter.",
+								sqlTable.Name,
+								missedKey.Name);
+
+						if (fields.Count == 0)
+							throw new LinqException(
+								string.Format("There are no fields to update in the type '{0}'.", sqlTable.Name));
+
+						foreach (var field in fields)
+						{
+							if (!supported || !fieldDic.TryGetValue(field, out param))
+							{
+								param = GetParameter<int>(dataContextInfo.DataContext, field);
+								ei.Queries[0].Parameters.Add(param);
+
+								if (supported)
+									fieldDic.Add(field, param = GetParameter<int>(dataContextInfo.DataContext, field));
+							}
+
+							sqlQuery.Update.Items.Add(new SqlQuery.SetExpression(field, param.SqlParameter));
+						}
+
+						sqlQuery.Update.Keys.AddRange(q.Select(i => i.i));
+
+						// Set the query.
+						//
+						if (ei.SqlProvider.IsInsertOrUpdateSupported)
+							ei.SetNonQueryQuery();
+						else
+							ei.MakeAlternativeInsertOrUpdate(sqlQuery);
+
+						ObjectOperation<T>.InsertOrUpdate.Add(key, ei);
+					}
+				}
+			}
+
+			return (int)ei.GetElement(null, dataContextInfo, Expression.Constant(obj), null);
+		}
+
+		internal void MakeAlternativeInsertOrUpdate(SqlQuery sqlQuery)
+		{
+			var dic = new Dictionary<ICloneableElement,ICloneableElement>();
+
+			var insertQuery = (SqlQuery)sqlQuery.Clone(dic, _ => true);
+
+			insertQuery.QueryType = QueryType.Insert;
+			insertQuery.ClearUpdate();
+			insertQuery.From.Tables.Clear();
+
+			Queries.Add(new QueryInfo
+			{
+				SqlQuery   = insertQuery,
+				Parameters = Queries[0].Parameters
+					.Select(p => new ParameterAccessor
+						{
+							Expression   = p.Expression,
+							Accessor     = p.Accessor,
+							SqlParameter = dic.ContainsKey(p.SqlParameter) ? (SqlParameter)dic[p.SqlParameter] : null
+						})
+					.Where(p => p.SqlParameter != null)
+					.ToList(),
+			});
+
+			var keys = sqlQuery.Update.Keys;
+
+			foreach (var key in keys)
+				sqlQuery.Where.Expr(key.Column).Equal.Expr(key.Expression);
+
+			sqlQuery.QueryType = QueryType.Update;
+			sqlQuery.ClearInsert();
+
+			SetNonQueryQuery2();
+
+			Queries.Add(new QueryInfo
+			{
+				SqlQuery   = insertQuery,
+				Parameters = Queries[0].Parameters.ToList(),
+			});
+		}
+
+		#endregion
+
+		#region Update
+
+		public static int Update(IDataContextInfo dataContextInfo, T obj)
+		{
+			if (Equals(default(T), obj))
+				return 0;
+
+			Query<int> ei;
+
+			var key = new { dataContextInfo.MappingSchema, dataContextInfo.ContextID };
+
+			if (!ObjectOperation<T>.Update.TryGetValue(key, out ei))
+				lock (_sync)
+					if (!ObjectOperation<T>.Update.TryGetValue(key, out ei))
+					{
+						var sqlTable = new SqlTable<T>(dataContextInfo.MappingSchema);
+						var sqlQuery = new SqlQuery { QueryType = QueryType.Update };
+
+						sqlQuery.From.Table(sqlTable);
+
+						ei = new Query<int>
+						{
+							MappingSchema     = dataContextInfo.MappingSchema,
+							ContextID         = dataContextInfo.ContextID,
+							CreateSqlProvider = dataContextInfo.CreateSqlProvider,
+							Queries           = { new Query<int>.QueryInfo { SqlQuery = sqlQuery, } }
+						};
+
+						var keys   = sqlTable.GetKeys(true).Cast<SqlField>();
+						var fields = sqlTable.Fields.Values.Where(f => f.IsUpdatable).Except(keys).ToList();
+
+						if (fields.Count == 0)
+						{
+							if (Configuration.Linq.IgnoreEmptyUpdate)
+								return 0;
+
+							throw new LinqException(
+								string.Format("There are no fields to update in the type '{0}'.", sqlTable.Name));
+						}
+
+						foreach (var field in fields)
+						{
+							var param = GetParameter<int>(dataContextInfo.DataContext, field);
+
+							ei.Queries[0].Parameters.Add(param);
+
+							sqlQuery.Update.Items.Add(new SqlQuery.SetExpression(field, param.SqlParameter));
+						}
+
+						foreach (var field in keys)
+						{
+							var param = GetParameter<int>(dataContextInfo.DataContext, field);
+
+							ei.Queries[0].Parameters.Add(param);
+
+							sqlQuery.Where.Field(field).Equal.Expr(param.SqlParameter);
+
+							if (field.Nullable)
+								sqlQuery.IsParameterDependent = true;
+						}
+
+						ei.SetNonQueryQuery();
+
+						ObjectOperation<T>.Update.Add(key, ei);
+					}
+
+			return (int)ei.GetElement(null, dataContextInfo, Expression.Constant(obj), null);
+		}
+
+		#endregion
+
+		#region Delete
+
+		public static int Delete(IDataContextInfo dataContextInfo, T obj)
+		{
+			if (Equals(default(T), obj))
+				return 0;
+
+			Query<int> ei;
+
+			var key = new { dataContextInfo.MappingSchema, dataContextInfo.ContextID };
+
+			if (!ObjectOperation<T>.Delete.TryGetValue(key, out ei))
+				lock (_sync)
+					if (!ObjectOperation<T>.Delete.TryGetValue(key, out ei))
+					{
+						var sqlTable = new SqlTable<T>(dataContextInfo.MappingSchema);
+						var sqlQuery = new SqlQuery { QueryType = QueryType.Delete };
+
+						sqlQuery.From.Table(sqlTable);
+
+						ei = new Query<int>
+						{
+							MappingSchema     = dataContextInfo.MappingSchema,
+							ContextID         = dataContextInfo.ContextID,
+							CreateSqlProvider = dataContextInfo.CreateSqlProvider,
+							Queries           = { new Query<int>.QueryInfo { SqlQuery = sqlQuery, } }
+						};
+
+						var keys = sqlTable.GetKeys(true).Cast<SqlField>().ToList();
+
+						if (keys.Count == 0)
+							throw new LinqException(
+								string.Format("Table '{0}' does not have primary key.", sqlTable.Name));
+
+						foreach (var field in keys)
+						{
+							var param = GetParameter<int>(dataContextInfo.DataContext, field);
+
+							ei.Queries[0].Parameters.Add(param);
+
+							sqlQuery.Where.Field(field).Equal.Expr(param.SqlParameter);
+
+							if (field.Nullable)
+								sqlQuery.IsParameterDependent = true;
+						}
+
+						ei.SetNonQueryQuery();
+
+						ObjectOperation<T>.Delete.Add(key, ei);
+					}
+
+			return (int)ei.GetElement(null, dataContextInfo, Expression.Constant(obj), null);
+		}
+
+		#endregion
+
+		#endregion
+
+		#region New Builder Support
+
+		public void SetElementQuery(Func<QueryContext,IDataContext,IDataReader,Expression,object[],object> mapper)
+		{
+			FinalizeQuery();
+
+			if (Queries.Count != 1)
+				throw new InvalidOperationException();
+
+			SqlProvider.SqlQuery = Queries[0].SqlQuery;
+
+			GetElement = (ctx,db,expr,ps) => RunQuery(ctx, db,expr, ps, mapper);
+		}
+
+		TE RunQuery<TE>(
+			QueryContext     ctx,
+			IDataContextInfo dataContextInfo,
+			Expression       expr,
+			object[]         parameters,
+			Func<QueryContext,IDataContext,IDataReader,Expression,object[],TE> mapper)
+		{
+			var dataContext = dataContextInfo.DataContext;
+
+			object query = null;
+
+			try
+			{
+				query = SetCommand(dataContext, expr, parameters, 0);
+
+				using (var dr = dataContext.ExecuteReader(query))
+					while (dr.Read())
+						return mapper(ctx, dataContext, dr, expr, parameters);
+
+				return Array<TE>.Empty.First();
+			}
+			finally
+			{
+				if (query != null)
+					dataContext.ReleaseQuery(query);
+
+				if (dataContextInfo.DisposeContext)
+					dataContext.Dispose();
+			}
+		}
+
+		Func<IDataContextInfo,Expression,object[],int,IEnumerable<IDataReader>> GetQuery()
+		{
+			FinalizeQuery();
+
+			if (Queries.Count != 1)
+				throw new InvalidOperationException();
+
+			Func<IDataContextInfo,Expression,object[],int,IEnumerable<IDataReader>> query = RunQuery;
+
+			SqlProvider.SqlQuery = Queries[0].SqlQuery;
+
+			var select = Queries[0].SqlQuery.Select;
+
+			if (select.SkipValue != null && !SqlProvider.IsSkipSupported)
+			{
+				var q = query;
+
+				if (select.SkipValue is SqlValue)
+				{
+					var n = (int)((IValueContainer)select.SkipValue).Value;
+
+					if (n > 0)
+						query = (db, expr, ps, qn) => q(db, expr, ps, qn).Skip(n);
+				}
+				else if (select.SkipValue is SqlParameter)
+				{
+					var i = GetParameterIndex(select.SkipValue);
+					query = (db, expr, ps, qn) => q(db, expr, ps, qn).Skip((int)Queries[0].Parameters[i].Accessor(expr, ps));
+				}
+			}
+
+			if (select.TakeValue != null && !SqlProvider.IsTakeSupported)
+			{
+				var q = query;
+
+				if (select.TakeValue is SqlValue)
+				{
+					var n = (int)((IValueContainer)select.TakeValue).Value;
+
+					if (n > 0)
+						query = (db, expr, ps, qn) => q(db, expr, ps, qn).Take(n);
+				}
+				else if (select.TakeValue is SqlParameter)
+				{
+					var i = GetParameterIndex(select.TakeValue);
+					query = (db, expr, ps, qn) => q(db, expr, ps, qn).Take((int)Queries[0].Parameters[i].Accessor(expr, ps));
+				}
+			}
+
+			return query;
+		}
+
+		internal void SetQuery(Func<QueryContext,IDataContext,IDataReader,Expression,object[],T> mapper)
+		{
+			var query = GetQuery();
+			GetIEnumerable = (ctx,db,expr,ps) => Map(query(db, expr, ps, 0), ctx, db, expr, ps, mapper);
+		}
+
+		static IEnumerable<T> Map(
+			IEnumerable<IDataReader> data,
+			QueryContext             queryContext,
+			IDataContextInfo         dataContextInfo,
+			Expression               expr,
+			object[]                 ps,
+			Func<QueryContext,IDataContext,IDataReader,Expression,object[],T> mapper)
+		{
+			if (queryContext == null)
+				queryContext = new QueryContext(dataContextInfo, expr, ps);
+
+			foreach (var dr in data)
+				yield return mapper(queryContext, dataContextInfo.DataContext, dr, expr, ps);
+		}
+
+		internal void SetQuery(Func<QueryContext,IDataContext,IDataReader,Expression,object[],int,T> mapper)
+		{
+			var query = GetQuery();
+			GetIEnumerable = (ctx,db,expr,ps) => Map(query(db, expr, ps, 0), ctx, db, expr, ps, mapper);
+		}
+
+		static IEnumerable<T> Map(
+			IEnumerable<IDataReader> data,
+			QueryContext             queryContext,
+			IDataContextInfo         dataContextInfo,
+			Expression               expr,
+			object[]                 ps,
+			Func<QueryContext,IDataContext,IDataReader,Expression,object[],int,T> mapper)
+		{
+			if (queryContext == null)
+				queryContext = new QueryContext(dataContextInfo, expr, ps);
+
+			var counter = 0;
+
+			foreach (var dr in data)
+				yield return mapper(queryContext, dataContextInfo.DataContext, dr, expr, ps, counter++);
+		}
+
+		#endregion
+	}
+
+	public class ParameterAccessor
+	{
+		public Expression                       Expression;
+		public Func<Expression,object[],object> Accessor;
+		public SqlParameter                     SqlParameter;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/QueryContext.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,73 @@
+using System;
+using System.Collections.Generic;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq
+{
+	public class QueryContext
+	{
+		public class DataContextContext
+		{
+			public IDataContextInfo DataContextInfo;
+			public bool             InUse;
+		}
+
+		public QueryContext(IDataContextInfo dataContext, Expression expr, object[] compiledParameters)
+		{
+			RootDataContext    = dataContext;
+			Expression         = expr;
+			CompiledParameters = compiledParameters;
+		}
+
+		public IDataContextInfo RootDataContext;
+		public Expression       Expression;
+		public object[]         CompiledParameters;
+		public int              Counter;
+
+		List<DataContextContext> _contexts;
+
+		public DataContextContext GetDataContext()
+		{
+			if (_contexts == null)
+			{
+				RootDataContext.DataContext.OnClosing += OnRootClosing;
+				_contexts = new List<DataContextContext>(1);
+			}
+
+			foreach (var context in _contexts)
+			{
+				if (!context.InUse)
+				{
+					context.InUse = true;
+					return context;
+				}
+			}
+
+			var ctx = new DataContextContext { DataContextInfo = RootDataContext.Clone(true), InUse = true };
+
+			_contexts.Add(ctx);
+
+			return ctx;
+		}
+
+		public void ReleaseDataContext(DataContextContext context)
+		{
+			context.InUse = false;
+		}
+
+		void OnRootClosing(object sender, EventArgs e)
+		{
+			foreach (var context in _contexts)
+				context.DataContextInfo.DataContext.Dispose();
+
+			RootDataContext.DataContext.OnClosing -= OnRootClosing;
+
+			_contexts = null;
+		}
+
+		public void AfterQuery()
+		{
+			Counter++;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/QueryableAccessor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+using System;
+using System.Linq;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq
+{
+	class QueryableAccessor
+	{
+		public IQueryable                  Queryable;
+		public Func<Expression,IQueryable> Accessor;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/ReflectionHelper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,299 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Data;
+using System.Data.SqlTypes;
+using System.IO;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+using System.Xml;
+#if !SILVERLIGHT
+using System.Xml.Linq;
+#endif
+
+using LinqBinary = System.Data.Linq.Binary;
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Data.Linq
+{
+	public class ReflectionHelper
+	{
+		public class Expressor<T>
+		{
+			public static FieldInfo FieldExpressor(Expression<Func<T,object>> func)
+			{
+				return (FieldInfo)((MemberExpression)((UnaryExpression)func.Body).Operand).Member;
+			}
+
+			public static MethodInfo PropertyExpressor(Expression<Func<T,object>> func)
+			{
+				return ((PropertyInfo)((MemberExpression)func.Body).Member).GetGetMethod();
+			}
+
+			public static MethodInfo MethodExpressor(Expression<Func<T,object>> func)
+			{
+				var ex = func.Body;
+
+				if (ex is UnaryExpression)
+					ex = ((UnaryExpression)ex).Operand;
+
+				//if (ex is MemberExpression)
+				//	return ((PropertyInfo)((MemberExpression)ex).Member).GetGetMethod();
+
+				return ((MethodCallExpression)ex).Method;
+			}
+		}
+
+		public static MemberInfo MemeberInfo(LambdaExpression func)
+		{
+			var ex = func.Body;
+
+			if (ex is UnaryExpression)
+				ex = ((UnaryExpression)ex).Operand;
+
+			return
+				ex is MemberExpression     ? ((MemberExpression)    ex).Member :
+				ex is MethodCallExpression ? ((MethodCallExpression)ex).Method :
+				                 (MemberInfo)((NewExpression)       ex).Constructor;
+		}
+
+		public class Binary : Expressor<BinaryExpression>
+		{
+			public static MethodInfo Conversion = PropertyExpressor(e => e.Conversion);
+			public static MethodInfo Left       = PropertyExpressor(e => e.Left);
+			public static MethodInfo Right      = PropertyExpressor(e => e.Right);
+		}
+
+		public class Unary : Expressor<UnaryExpression>
+		{
+			public static MethodInfo Operand = PropertyExpressor(e => e.Operand);
+		}
+
+		public class LambdaExpr : Expressor<LambdaExpression>
+		{
+			public static MethodInfo Body       = PropertyExpressor(e => e.Body);
+			public static MethodInfo Parameters = PropertyExpressor(e => e.Parameters);
+		}
+
+		public class Constant : Expressor<ConstantExpression>
+		{
+			public static MethodInfo Value = PropertyExpressor(e => e.Value);
+		}
+
+		public class QueryableInt : Expressor<IQueryable>
+		{
+			public static MethodInfo Expression = PropertyExpressor(e => e.Expression);
+		}
+
+		public class MethodCall : Expressor<MethodCallExpression>
+		{
+			public static MethodInfo Object    = PropertyExpressor(e => e.Object);
+			public static MethodInfo Arguments = PropertyExpressor(e => e.Arguments);
+		}
+
+		public class Conditional : Expressor<ConditionalExpression>
+		{
+			public static MethodInfo Test    = PropertyExpressor(e => e.Test);
+			public static MethodInfo IfTrue  = PropertyExpressor(e => e.IfTrue);
+			public static MethodInfo IfFalse = PropertyExpressor(e => e.IfFalse);
+		}
+
+		public class Invocation : Expressor<InvocationExpression>
+		{
+			public static MethodInfo Expression = PropertyExpressor(e => e.Expression);
+			public static MethodInfo Arguments  = PropertyExpressor(e => e.Arguments);
+		}
+
+		public class ListInit : Expressor<ListInitExpression>
+		{
+			public static MethodInfo NewExpression = PropertyExpressor(e => e.NewExpression);
+			public static MethodInfo Initializers  = PropertyExpressor(e => e.Initializers);
+		}
+
+		public class ElementInit : Expressor<System.Linq.Expressions.ElementInit>
+		{
+			public static MethodInfo Arguments = PropertyExpressor(e => e.Arguments);
+		}
+
+		public class Member : Expressor<MemberExpression>
+		{
+			public static MethodInfo Expression = PropertyExpressor(e => e.Expression);
+		}
+
+		public class MemberInit : Expressor<MemberInitExpression>
+		{
+			public static MethodInfo NewExpression = PropertyExpressor(e => e.NewExpression);
+			public static MethodInfo Bindings      = PropertyExpressor(e => e.Bindings);
+		}
+
+		public class New : Expressor<NewExpression>
+		{
+			public static MethodInfo Arguments = PropertyExpressor(e => e.Arguments);
+		}
+
+		public class NewArray : Expressor<NewArrayExpression>
+		{
+			public static MethodInfo Expressions = PropertyExpressor(e => e.Expressions);
+		}
+
+		public class TypeBinary : Expressor<TypeBinaryExpression>
+		{
+			public static MethodInfo Expression = PropertyExpressor(e => e.Expression);
+		}
+
+		public class IndexExpressor<T>
+		{
+			public static MethodInfo IndexerExpressor(Expression<Func<ReadOnlyCollection<T>, object>> func)
+			{
+				return ((MethodCallExpression)((UnaryExpression)func.Body).Operand).Method;
+			}
+
+			public static MethodInfo Item = IndexerExpressor(c => c[0]);
+		}
+
+		public class MemberAssignmentBind : Expressor<MemberAssignment>
+		{
+			public static MethodInfo Expression = PropertyExpressor(e => e.Expression);
+		}
+
+		public class MemberListBind : Expressor<MemberListBinding>
+		{
+			public static MethodInfo Initializers = PropertyExpressor(e => e.Initializers);
+		}
+
+		public class MemberMemberBind : Expressor<MemberMemberBinding>
+		{
+			public static MethodInfo Bindings = PropertyExpressor(e => e.Bindings);
+		}
+
+#if FW4 || SILVERLIGHT
+
+		public class Block : Expressor<BlockExpression>
+		{
+			public static MethodInfo Expressions = PropertyExpressor(e => e.Expressions);
+			public static MethodInfo Variables   = PropertyExpressor(e => e.Variables);
+		}
+
+#endif
+
+		public static MethodInfo ExprItem  = IndexExpressor<Expression>         .Item;
+		public static MethodInfo ParamItem = IndexExpressor<ParameterExpression>.Item;
+		public static MethodInfo ElemItem  = IndexExpressor<ElementInit>        .Item;
+
+		public class DataReader : Expressor<IDataReader>
+		{
+			public static MethodInfo GetValue = MethodExpressor(rd => rd.GetValue(0));
+			public static MethodInfo IsDBNull = MethodExpressor(rd => rd.IsDBNull(0));
+		}
+
+		internal class QueryCtx : Expressor<QueryContext>
+		{
+			public static FieldInfo Counter = FieldExpressor(ctx => ctx.Counter);
+		}
+
+		public class MapSchema : Expressor<Mapping.MappingSchema>
+		{
+			public static MethodInfo MapValueToEnum = MethodExpressor(m => m.MapValueToEnum(null, (Type)null));
+			public static MethodInfo MapValueToEnumWithMemberAccessor = MethodExpressor(m => m.MapValueToEnum(null, (MemberAccessor)null));
+			public static MethodInfo ChangeType     = MethodExpressor(m => m.ConvertChangeType(null, null));
+
+			public static Dictionary<Type,MethodInfo> Converters = new Dictionary<Type,MethodInfo>
+			{
+				// Primitive Types
+				//
+				{ typeof(SByte),           MethodExpressor(m => m.ConvertToSByte                 (null)) },
+				{ typeof(Int16),           MethodExpressor(m => m.ConvertToInt16                 (null)) },
+				{ typeof(Int32),           MethodExpressor(m => m.ConvertToInt32                 (null)) },
+				{ typeof(Int64),           MethodExpressor(m => m.ConvertToInt64                 (null)) },
+				{ typeof(Byte),            MethodExpressor(m => m.ConvertToByte                  (null)) },
+				{ typeof(UInt16),          MethodExpressor(m => m.ConvertToUInt16                (null)) },
+				{ typeof(UInt32),          MethodExpressor(m => m.ConvertToUInt32                (null)) },
+				{ typeof(UInt64),          MethodExpressor(m => m.ConvertToUInt64                (null)) },
+				{ typeof(Char),            MethodExpressor(m => m.ConvertToChar                  (null)) },
+				{ typeof(Single),          MethodExpressor(m => m.ConvertToSingle                (null)) },
+				{ typeof(Double),          MethodExpressor(m => m.ConvertToDouble                (null)) },
+				{ typeof(Boolean),         MethodExpressor(m => m.ConvertToBoolean               (null)) },
+
+				// Simple Types
+				//
+				{ typeof(String),          MethodExpressor(m => m.ConvertToString                (null)) },
+				{ typeof(DateTime),        MethodExpressor(m => m.ConvertToDateTime              (null)) },
+				{ typeof(TimeSpan),        MethodExpressor(m => m.ConvertToTimeSpan              (null)) },
+				{ typeof(DateTimeOffset),  MethodExpressor(m => m.ConvertToDateTimeOffset        (null)) },
+				{ typeof(Decimal),         MethodExpressor(m => m.ConvertToDecimal               (null)) },
+				{ typeof(Guid),            MethodExpressor(m => m.ConvertToGuid                  (null)) },
+				{ typeof(Stream),          MethodExpressor(m => m.ConvertToStream                (null)) },
+#if !SILVERLIGHT
+				{ typeof(XmlReader),       MethodExpressor(m => m.ConvertToXmlReader             (null)) },
+				{ typeof(XmlDocument),     MethodExpressor(m => m.ConvertToXmlDocument           (null)) },
+				{ typeof(XElement),        MethodExpressor(m => m.ConvertToXElement              (null)) },
+#endif
+				{ typeof(Byte[]),          MethodExpressor(m => m.ConvertToByteArray             (null)) },
+				{ typeof(LinqBinary),      MethodExpressor(m => m.ConvertToLinqBinary            (null)) },
+				{ typeof(Char[]),          MethodExpressor(m => m.ConvertToCharArray             (null)) },
+
+				// Nullable Types
+				//
+				{ typeof(SByte?),          MethodExpressor(m => m.ConvertToNullableSByte         (null)) },
+				{ typeof(Int16?),          MethodExpressor(m => m.ConvertToNullableInt16         (null)) },
+				{ typeof(Int32?),          MethodExpressor(m => m.ConvertToNullableInt32         (null)) },
+				{ typeof(Int64?),          MethodExpressor(m => m.ConvertToNullableInt64         (null)) },
+				{ typeof(Byte?),           MethodExpressor(m => m.ConvertToNullableByte          (null)) },
+				{ typeof(UInt16?),         MethodExpressor(m => m.ConvertToNullableUInt16        (null)) },
+				{ typeof(UInt32?),         MethodExpressor(m => m.ConvertToNullableUInt32        (null)) },
+				{ typeof(UInt64?),         MethodExpressor(m => m.ConvertToNullableUInt64        (null)) },
+				{ typeof(Char?),           MethodExpressor(m => m.ConvertToNullableChar          (null)) },
+				{ typeof(Double?),         MethodExpressor(m => m.ConvertToNullableDouble        (null)) },
+				{ typeof(Single?),         MethodExpressor(m => m.ConvertToNullableSingle        (null)) },
+				{ typeof(Boolean?),        MethodExpressor(m => m.ConvertToNullableBoolean       (null)) },
+				{ typeof(DateTime?),       MethodExpressor(m => m.ConvertToNullableDateTime      (null)) },
+				{ typeof(TimeSpan?),       MethodExpressor(m => m.ConvertToNullableTimeSpan      (null)) },
+				{ typeof(DateTimeOffset?), MethodExpressor(m => m.ConvertToNullableDateTimeOffset(null)) },
+				{ typeof(Decimal?),        MethodExpressor(m => m.ConvertToNullableDecimal       (null)) },
+				{ typeof(Guid?),           MethodExpressor(m => m.ConvertToNullableGuid          (null)) },
+
+#if !SILVERLIGHT
+
+				// SqlTypes
+				//
+				{ typeof(SqlByte),         MethodExpressor(m => m.ConvertToSqlByte               (null)) },
+				{ typeof(SqlInt16),        MethodExpressor(m => m.ConvertToSqlInt16              (null)) },
+				{ typeof(SqlInt32),        MethodExpressor(m => m.ConvertToSqlInt32              (null)) },
+				{ typeof(SqlInt64),        MethodExpressor(m => m.ConvertToSqlInt64              (null)) },
+				{ typeof(SqlSingle),       MethodExpressor(m => m.ConvertToSqlSingle             (null)) },
+				{ typeof(SqlBoolean),      MethodExpressor(m => m.ConvertToSqlBoolean            (null)) },
+				{ typeof(SqlDouble),       MethodExpressor(m => m.ConvertToSqlDouble             (null)) },
+				{ typeof(SqlDateTime),     MethodExpressor(m => m.ConvertToSqlDateTime           (null)) },
+				{ typeof(SqlDecimal),      MethodExpressor(m => m.ConvertToSqlDecimal            (null)) },
+				{ typeof(SqlMoney),        MethodExpressor(m => m.ConvertToSqlMoney              (null)) },
+				{ typeof(SqlString),       MethodExpressor(m => m.ConvertToSqlString             (null)) },
+				{ typeof(SqlBinary),       MethodExpressor(m => m.ConvertToSqlBinary             (null)) },
+				{ typeof(SqlGuid),         MethodExpressor(m => m.ConvertToSqlGuid               (null)) },
+				{ typeof(SqlBytes),        MethodExpressor(m => m.ConvertToSqlBytes              (null)) },
+				{ typeof(SqlChars),        MethodExpressor(m => m.ConvertToSqlChars              (null)) },
+				{ typeof(SqlXml),          MethodExpressor(m => m.ConvertToSqlXml                (null)) },
+
+#endif
+			};
+		}
+
+		public class Functions
+		{
+			public class String : Expressor<string>
+			{
+				//public static MethodInfo Contains   = MethodExpressor(s => s.Contains(""));
+				//public static MethodInfo StartsWith = MethodExpressor(s => s.StartsWith(""));
+				//public static MethodInfo EndsWith   = MethodExpressor(s => s.EndsWith(""));
+
+#if !SILVERLIGHT
+				public static MethodInfo Like11     = MethodExpressor(s => System.Data.Linq.SqlClient.SqlMethods.Like("", ""));
+				public static MethodInfo Like12     = MethodExpressor(s => System.Data.Linq.SqlClient.SqlMethods.Like("", "", ' '));
+#endif
+
+				public static MethodInfo Like21     = MethodExpressor(s => Sql.Like(s, ""));
+				public static MethodInfo Like22     = MethodExpressor(s => Sql.Like(s, "", ' '));
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Settings.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,13 @@
+using System;
+
+namespace BLToolkit.Data.Linq
+{
+	public static class Settings
+	{
+#if SILVERLIGHT
+		public static Func<string,IDataContext> CreateDefaultDataContext = config => { throw new InvalidOperationException(); };
+#else
+		public static Func<string,IDataContext> CreateDefaultDataContext = config => new DbManager(config ?? DbManager.DefaultConfiguration);
+#endif
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/Sql.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,904 @@
+using System;
+using System.Data.Linq;
+using System.Globalization;
+using System.Reflection;
+
+namespace BLToolkit.Data.Linq
+{
+	using Data.Sql;
+	using Reflection;
+
+	public static class Sql
+	{
+		#region Common Functions
+
+		[CLSCompliant(false)]
+		[SqlExpression("{0}", 0, ServerSideOnly = true)]
+		public static T AsSql<T>(T obj)
+		{
+			return obj;
+		}
+
+		[Obsolete("Use AsSql instead.")]
+		[CLSCompliant(false)]
+		[SqlExpression("{0}", 0, ServerSideOnly = true)]
+		public static T OnServer<T>(T obj)
+		{
+			return obj;
+		}
+
+		[CLSCompliant(false)]
+		[SqlExpression("{0}", 0)]
+		public static T ConvertNullable<T>(T? value)
+			where T : struct
+		{
+			return value.Value;
+		}
+
+		#endregion
+
+		#region Guid Functions
+
+		[SqlFunction  ("Oracle",   "Sys_Guid", ServerSideOnly=true)]
+		[SqlFunction  ("Firebird", "Gen_Uuid", ServerSideOnly=true)]
+		[SqlFunction  ("MySql",    "Uuid",     ServerSideOnly=true)]
+		[SqlExpression("Sybase",   "NewID(1)", ServerSideOnly=true)]
+		[SqlFunction  (            "NewID",    ServerSideOnly=true)]
+		public static Guid NewGuid()
+		{
+			return Guid.NewGuid();
+		}
+
+		#endregion
+
+		#region Convert Functions
+
+		[CLSCompliant(false)]
+		[SqlFunction("Convert", 0, 1, ServerSideOnly = true)]
+		public static TTo Convert<TTo,TFrom>(TTo to, TFrom from)
+		{
+			var dt = Common.ConvertTo<TTo>.From(from);
+			return dt;
+		}
+
+		[CLSCompliant(false)]
+		[SqlFunction("Convert", 0, 1, 2, ServerSideOnly = true)]
+		public static TTo Convert<TTo, TFrom>(TTo to, TFrom from, int format)
+		{
+			var dt = Common.ConvertTo<TTo>.From(from);
+			return dt;
+		}
+
+		[CLSCompliant(false)]
+		[SqlFunction("Convert", 0, 1)]
+		public static TTo Convert2<TTo,TFrom>(TTo to, TFrom from)
+		{
+			return Common.ConvertTo<TTo>.From(from);
+		}
+
+		[CLSCompliant(false)]
+		[SqlFunction("$Convert$", 1, 2, 0)]
+		public static TTo Convert<TTo,TFrom>(TFrom obj)
+		{
+			return Common.ConvertTo<TTo>.From(obj);
+		}
+
+		public static class ConvertTo<TTo>
+		{
+			[CLSCompliant(false)]
+			[SqlFunction("$Convert$", 1, 2, 0)]
+			public static TTo From<TFrom>(TFrom obj)
+			{
+				return Common.ConvertTo<TTo>.From(obj);
+			}
+		}
+
+		[SqlExpression("{0}")]
+		public static TimeSpan? DateToTime(DateTime? date)
+		{
+			return date == null ? null : (TimeSpan?)new TimeSpan(date.Value.Ticks);
+		}
+
+		[SqlProperty("Informix",   "Boolean",        ServerSideOnly=true)]
+		[SqlProperty("PostgreSQL", "Boolean",        ServerSideOnly=true)]
+		[SqlProperty("MySql",      "Boolean",        ServerSideOnly=true)]
+		[SqlProperty("SQLite",     "Boolean",        ServerSideOnly=true)]
+		[SqlProperty(              "Bit",            ServerSideOnly=true)] public static Boolean        Bit                               { get { return false; } }
+
+		[SqlProperty("Oracle",     "Number(19)",     ServerSideOnly=true)]
+		[SqlProperty(              "BigInt",         ServerSideOnly=true)] public static Int64          BigInt                            { get { return 0; } }
+
+		[SqlProperty("MySql",      "Signed",         ServerSideOnly=true)]
+		[SqlProperty(              "Int",            ServerSideOnly=true)] public static Int32          Int                               { get { return 0; } }
+
+		[SqlProperty("MySql",      "Signed",         ServerSideOnly=true)]
+		[SqlProperty(              "SmallInt",       ServerSideOnly=true)] public static Int16          SmallInt                          { get { return 0; } }
+
+		[SqlProperty("DB2",        "SmallInt",       ServerSideOnly=true)]
+		[SqlProperty("Informix",   "SmallInt",       ServerSideOnly=true)]
+		[SqlProperty("Oracle",     "Number(3)",      ServerSideOnly=true)]
+		[SqlProperty("DB2",        "SmallInt",       ServerSideOnly=true)]
+		[SqlProperty("Firebird",   "SmallInt",       ServerSideOnly=true)]
+		[SqlProperty("PostgreSQL", "SmallInt",       ServerSideOnly=true)]
+		[SqlProperty("MySql",      "Unsigned",       ServerSideOnly=true)]
+		[SqlProperty(              "TinyInt",        ServerSideOnly=true)] public static Byte           TinyInt                           { get { return 0; } }
+
+		[SqlProperty(              "Decimal",        ServerSideOnly=true)] public static Decimal DefaultDecimal                           { get { return 0; } }
+		[SqlFunction(                                ServerSideOnly=true)] public static Decimal        Decimal(int precision)            {       return 0;   }
+		[SqlFunction(                                ServerSideOnly=true)] public static Decimal        Decimal(int precision, int scale) {       return 0;   }
+
+		[SqlProperty("Oracle",     "Number(19,4)",   ServerSideOnly=true)]
+		[SqlProperty("Firebird",   "Decimal(18,4)",  ServerSideOnly=true)]
+		[SqlProperty("PostgreSQL", "Decimal(19,4)",  ServerSideOnly=true)]
+		[SqlProperty("MySql",      "Decimal(19,4)",  ServerSideOnly=true)]
+		[SqlProperty(              "Money",          ServerSideOnly=true)] public static Decimal        Money                             { get { return 0; } }
+
+		[SqlProperty("Informix",   "Decimal(10,4)",  ServerSideOnly=true)]
+		[SqlProperty("Oracle",     "Number(10,4)",   ServerSideOnly=true)]
+		[SqlProperty("Firebird",   "Decimal(10,4)",  ServerSideOnly=true)]
+		[SqlProperty("PostgreSQL", "Decimal(10,4)",  ServerSideOnly=true)]
+		[SqlProperty("MySql",      "Decimal(10,4)",  ServerSideOnly=true)]
+		[SqlProperty("SqlCe",      "Decimal(10,4)",  ServerSideOnly=true)]
+		[SqlProperty(              "SmallMoney",     ServerSideOnly=true)] public static Decimal        SmallMoney                        { get { return 0; } }
+
+		[SqlProperty("MySql",      "Decimal(29,10)", ServerSideOnly=true)]
+		[SqlProperty(              "Float",          ServerSideOnly=true)] public static Double         Float                             { get { return 0; } }
+
+		[SqlProperty("MySql",      "Decimal(29,10)", ServerSideOnly=true)]
+		[SqlProperty(              "Real",           ServerSideOnly=true)] public static Single         Real                              { get { return 0; } }
+
+		[SqlProperty("PostgreSQL", "TimeStamp",      ServerSideOnly=true)]
+		[SqlProperty("Firebird",   "TimeStamp",      ServerSideOnly=true)]
+		[SqlProperty(              "DateTime",       ServerSideOnly=true)] public static DateTime       DateTime                          { get { return DateTime.Now; } }
+
+		[SqlProperty("MsSql2000",  "DateTime",       ServerSideOnly=true)]
+		[SqlProperty("MsSql2005",  "DateTime",       ServerSideOnly=true)]
+		[SqlProperty("PostgreSQL", "TimeStamp",      ServerSideOnly=true)]
+		[SqlProperty("Firebird",   "TimeStamp",      ServerSideOnly=true)]
+		[SqlProperty("MySql",      "DateTime",       ServerSideOnly=true)]
+		[SqlProperty("SqlCe",      "DateTime",       ServerSideOnly=true)]
+		[SqlProperty("Sybase",     "DateTime",       ServerSideOnly=true)]
+		[SqlProperty(              "DateTime2",      ServerSideOnly=true)] public static DateTime       DateTime2                         { get { return DateTime.Now; } }
+
+		[SqlProperty("PostgreSQL", "TimeStamp",      ServerSideOnly=true)]
+		[SqlProperty("Firebird",   "TimeStamp",      ServerSideOnly=true)]
+		[SqlProperty("MySql",      "DateTime",       ServerSideOnly=true)]
+		[SqlProperty("SqlCe",      "DateTime",       ServerSideOnly=true)]
+		[SqlProperty(              "SmallDateTime",  ServerSideOnly=true)] public static DateTime       SmallDateTime                     { get { return DateTime.Now; } }
+
+		[SqlProperty("MsSql2000",  "Datetime",       ServerSideOnly=true)]
+		[SqlProperty("MsSql2005",  "Datetime",       ServerSideOnly=true)]
+		[SqlProperty("SqlCe",      "Datetime",       ServerSideOnly=true)]
+		[SqlProperty(              "Date",           ServerSideOnly=true)] public static DateTime       Date                              { get { return DateTime.Now; } }
+
+		[SqlProperty(              "Time",           ServerSideOnly=true)] public static DateTime       Time                              { get { return DateTime.Now; } }
+
+		[SqlProperty("PostgreSQL", "TimeStamp",      ServerSideOnly=true)]
+		[SqlProperty("Firebird",   "TimeStamp",      ServerSideOnly=true)]
+		[SqlProperty("MsSql2008",  "DateTimeOffset", ServerSideOnly=true)]
+		[SqlProperty("MsSql2012",  "DateTimeOffset", ServerSideOnly=true)]
+		[SqlProperty(              "DateTime",       ServerSideOnly=true)] public static DateTimeOffset DateTimeOffset                    { get { return DateTimeOffset.Now; } }
+
+		[SqlFunction("SqlCe",      "NChar",          ServerSideOnly=true)]
+		[SqlFunction(                                ServerSideOnly=true)] public static String         Char(int length)                  {       return ""; }
+
+		[SqlProperty("SqlCe",      "NChar",          ServerSideOnly=true)]
+		[SqlProperty(              "Char",           ServerSideOnly=true)] public static String  DefaultChar                              { get { return ""; } }
+
+		[SqlFunction("MySql",      "Char",           ServerSideOnly=true)]
+		[SqlFunction("SqlCe",      "NVarChar",       ServerSideOnly=true)]
+		[SqlFunction(                                ServerSideOnly=true)] public static String         VarChar(int length)               {       return ""; }
+
+		[SqlProperty("MySql",      "Char",           ServerSideOnly=true)]
+		[SqlProperty("SqlCe",      "NVarChar",       ServerSideOnly=true)]
+		[SqlProperty(              "VarChar",        ServerSideOnly=true)] public static String  DefaultVarChar                           { get { return ""; } }
+
+		[SqlFunction("DB2",        "Char",           ServerSideOnly=true)]
+		[SqlFunction(                                ServerSideOnly=true)] public static String         NChar(int length)                 {       return ""; }
+
+		[SqlProperty("DB2",        "Char",           ServerSideOnly=true)]
+		[SqlProperty(              "NChar",          ServerSideOnly=true)] public static String  DefaultNChar                             { get { return ""; } }
+
+		[SqlFunction("DB2",        "Char",           ServerSideOnly=true)]
+		[SqlFunction("Oracle",     "VarChar2",       ServerSideOnly=true)]
+		[SqlFunction("Firebird",   "VarChar",        ServerSideOnly=true)]
+		[SqlFunction("PostgreSQL", "VarChar",        ServerSideOnly=true)]
+		[SqlFunction("MySql",      "Char",           ServerSideOnly=true)]
+		[SqlFunction(                                ServerSideOnly=true)] public static String         NVarChar(int length)              {       return ""; }
+
+		[SqlProperty("DB2",        "Char",           ServerSideOnly=true)]
+		[SqlProperty("Oracle",     "VarChar2",       ServerSideOnly=true)]
+		[SqlProperty("Firebird",   "VarChar",        ServerSideOnly=true)]
+		[SqlProperty("PostgreSQL", "VarChar",        ServerSideOnly=true)]
+		[SqlProperty("MySql",      "Char",           ServerSideOnly=true)]
+		[SqlProperty(              "NVarChar",       ServerSideOnly=true)] public static String  DefaultNVarChar                          { get { return ""; } }
+
+		#endregion
+
+		#region String Functions
+
+		[SqlFunction(                            PreferServerSide = true)]
+		[SqlFunction("Access",    "Len",         PreferServerSide = true)]
+		[SqlFunction("Firebird",  "Char_Length", PreferServerSide = true)]
+		[SqlFunction("MsSql2000", "Len",         PreferServerSide = true)]
+		[SqlFunction("MsSql2005", "Len",         PreferServerSide = true)]
+		[SqlFunction("MsSql2008", "Len",         PreferServerSide = true)]
+		[SqlFunction("MsSql2012", "Len",         PreferServerSide = true)]
+		[SqlFunction("SqlCe",     "Len",         PreferServerSide = true)]
+		[SqlFunction("Sybase",    "Len",         PreferServerSide = true)]
+		public static int? Length(string str)
+		{
+			return str == null ? null : (int?)str.Length;
+		}
+
+		[SqlFunction]
+		[SqlFunction  ("Access",   "Mid")]
+		[SqlFunction  ("DB2",      "Substr")]
+		[SqlFunction  ("Informix", "Substr")]
+		[SqlFunction  ("Oracle",   "Substr")]
+		[SqlFunction  ("SQLite",   "Substr")]
+		[SqlExpression("Firebird", "Substring({0} from {1} for {2})")]
+		public static string Substring(string str, int? startIndex, int? length)
+		{
+			return str == null || startIndex == null || length == null ? null : str.Substring(startIndex.Value, length.Value);
+		}
+
+		[SqlFunction(ServerSideOnly = true)]
+		public static bool Like(string matchExpression, string pattern)
+		{
+#if SILVERLIGHT
+			throw new InvalidOperationException();
+#else
+			return matchExpression == null || pattern == null ? false : System.Data.Linq.SqlClient.SqlMethods.Like(matchExpression, pattern);
+#endif
+		}
+
+		[SqlFunction(ServerSideOnly = true)]
+		public static bool Like(string matchExpression, string pattern, char? escapeCharacter)
+		{
+#if SILVERLIGHT
+			throw new InvalidOperationException();
+#else
+			return matchExpression == null || pattern == null || escapeCharacter == null ?
+				false :
+				System.Data.Linq.SqlClient.SqlMethods.Like(matchExpression, pattern, escapeCharacter.Value);
+#endif
+		}
+
+		[SqlFunction]
+		[SqlFunction("DB2",   "Locate")]
+		[SqlFunction("MySql", "Locate")]
+		public static int? CharIndex(string value, string str)
+		{
+			if (str == null || value == null)
+				return null;
+
+			return str.IndexOf(value) + 1;
+		}
+
+		[SqlFunction]
+		public static int? ContainsExactly(string value, string str)
+		{
+			if (str == null || value == null)
+				return null;
+
+			return str.ContainsExactly(value);
+		}
+
+		[SqlFunction]
+		[SqlFunction("DB2",   "Locate")]
+		[SqlFunction("MySql", "Locate")]
+		public static int? CharIndex(string value, string str, int? startLocation)
+		{
+			if (str == null || value == null || startLocation == null)
+				return null;
+
+			return str.IndexOf(value, startLocation.Value - 1) + 1;
+		}
+
+		[SqlFunction]
+		[SqlFunction("DB2",   "Locate")]
+		[SqlFunction("MySql", "Locate")]
+		public static int? CharIndex(char? value, string str)
+		{
+			if (value == null || str == null)
+				return null;
+
+			return str.IndexOf(value.Value) + 1;
+		}
+
+		[SqlFunction]
+		[SqlFunction("DB2",   "Locate")]
+		[SqlFunction("MySql", "Locate")]
+		public static int? CharIndex(char? value, string str, int? startLocation)
+		{
+			if (str == null || value == null || startLocation == null)
+				return null;
+
+			return str.IndexOf(value.Value, startLocation.Value - 1) + 1;
+		}
+
+		[SqlFunction]
+		public static string Reverse(string str)
+		{
+			if (string.IsNullOrEmpty(str))
+				return str;
+
+			var chars = str.ToCharArray();
+			Array.Reverse(chars);
+			return new string(chars);
+		}
+
+		[SqlFunction]
+		[SqlFunction("SQLite", "LeftStr")]
+		public static string Left(string str, int? length)
+		{
+			return length == null || str == null || str.Length < length? null: str.Substring(1, length.Value);
+		}
+
+		[SqlFunction]
+		[SqlFunction("SQLite", "RightStr")]
+		public static string Right(string str, int? length)
+		{
+			return length == null || str == null || str.Length < length?
+				null :
+				str.Substring(str.Length - length.Value);
+		}
+
+		[SqlFunction]
+		public static string Stuff(string str, int? startLocation, int? length, string value)
+		{
+			return str == null || value == null || startLocation == null || length == null ?
+				null :
+				str.Remove(startLocation.Value - 1, length.Value).Insert(startLocation.Value - 1, value);
+		}
+
+		[SqlFunction]
+		public static string Space(int? length)
+		{
+			return length == null ? null : "".PadRight(length.Value);
+		}
+
+		[SqlFunction(Name = "LPad")]
+		public static string PadLeft(string str, int? totalWidth, char? paddingChar)
+		{
+			return str == null || totalWidth == null || paddingChar == null ?
+				null :
+				str.PadLeft(totalWidth.Value, paddingChar.Value);
+		}
+
+		[SqlFunction(Name = "RPad")]
+		public static string PadRight(string str, int? totalWidth, char? paddingChar)
+		{
+			return str == null || totalWidth == null || paddingChar == null ?
+				null :
+				str.PadRight(totalWidth.Value, paddingChar.Value);
+		}
+
+		[SqlFunction]
+		[SqlFunction("Sybase", "Str_Replace")]
+		public static string Replace(string str, string oldValue, string newValue)
+		{
+			return str == null || oldValue == null || newValue == null ?
+				null :
+				str.Replace(oldValue, newValue);
+		}
+
+		[SqlFunction]
+		[SqlFunction("Sybase", "Str_Replace")]
+		public static string Replace(string str, char? oldValue, char? newValue)
+		{
+			return str == null || oldValue == null || newValue == null ?
+				null :
+				str.Replace(oldValue.Value, newValue.Value);
+		}
+
+		[SqlFunction]
+		public static string Trim(string str)
+		{
+			return str == null ? null : str.Trim();
+		}
+
+		[SqlFunction("LTrim")]
+		public static string TrimLeft(string str)
+		{
+			return str == null ? null : str.TrimStart();
+		}
+
+		[SqlFunction("RTrim")]
+		public static string TrimRight(string str)
+		{
+			return str == null ? null : str.TrimEnd();
+		}
+
+		[SqlExpression("DB2", "Strip({0}, B, {1})")]
+		[SqlFunction]
+		public static string Trim(string str, char? ch)
+		{
+			return str == null || ch == null ? null : str.Trim(ch.Value);
+		}
+
+		[SqlExpression("DB2", "Strip({0}, L, {1})")]
+		[SqlFunction  (       "LTrim")]
+		public static string TrimLeft(string str, char? ch)
+		{
+			return str == null || ch == null ? null : str.TrimStart(ch.Value);
+		}
+
+		[SqlExpression("DB2", "Strip({0}, T, {1})")]
+		[SqlFunction  (       "RTrim")]
+		public static string TrimRight(string str, char? ch)
+		{
+			return str == null || ch == null ? null : str.TrimEnd(ch.Value);
+		}
+
+		[SqlFunction]
+		[SqlFunction("Access",   "LCase")]
+		public static string Lower(string str)
+		{
+			return str == null ? null : str.ToLower();
+		}
+
+		[SqlFunction]
+		[SqlFunction("Access",   "UCase")]
+		public static string Upper(string str)
+		{
+			return str == null ? null : str.ToUpper();
+		}
+
+		#endregion
+
+		#region Binary Functions
+
+		[SqlFunction(                             PreferServerSide = true)]
+		[SqlFunction("Access",    "Len",          PreferServerSide = true)]
+		[SqlFunction("Firebird",  "Octet_Length", PreferServerSide = true)]
+		[SqlFunction("MsSql2000", "DataLength",   PreferServerSide = true)]
+		[SqlFunction("MsSql2005", "DataLength",   PreferServerSide = true)]
+		[SqlFunction("MsSql2008", "DataLength",   PreferServerSide = true)]
+		[SqlFunction("MsSql2012", "DataLength",   PreferServerSide = true)]
+		[SqlFunction("SqlCe",     "DataLength",   PreferServerSide = true)]
+		[SqlFunction("Sybase",    "DataLength",   PreferServerSide = true)]
+		public static int? Length(Binary value)
+		{
+			return value == null ? null : (int?)value.Length;
+		}
+
+		#endregion
+
+		#region DateTime Functions
+
+		[SqlProperty("CURRENT_TIMESTAMP")]
+		[SqlProperty("Informix", "CURRENT")]
+		[SqlProperty("Access",   "Now")]
+		public static DateTime GetDate()
+		{
+			return DateTime.Now;
+		}
+
+		[SqlProperty("CURRENT_TIMESTAMP",   ServerSideOnly = true)]
+		[SqlProperty("Informix", "CURRENT", ServerSideOnly = true)]
+		[SqlProperty("Access",   "Now",     ServerSideOnly = true)]
+		[SqlFunction("SqlCe",    "GetDate", ServerSideOnly = true)]
+		[SqlFunction("Sybase",   "GetDate", ServerSideOnly = true)]
+		public static DateTime CurrentTimestamp
+		{
+			get { throw new LinqException("The 'CurrentTimestamp' is server side only property."); }
+		}
+
+		[SqlProperty("CURRENT_TIMESTAMP")]
+		[SqlProperty("Informix", "CURRENT")]
+		[SqlProperty("Access",   "Now")]
+		[SqlFunction("SqlCe",    "GetDate")]
+		[SqlFunction("Sybase",   "GetDate")]
+		public static DateTime CurrentTimestamp2
+		{
+			get { return DateTime.Now; }
+		}
+
+		[SqlFunction]
+		public static DateTime? ToDate(int? year, int? month, int? day, int? hour, int? minute, int? second, int? millisecond)
+		{
+			return year == null || month == null || day == null || hour == null || minute == null || second == null || millisecond == null ?
+				(DateTime?)null :
+				new DateTime(year.Value, month.Value, day.Value, hour.Value, minute.Value, second.Value, millisecond.Value);
+		}
+
+		[SqlFunction]
+		public static DateTime? ToDate(int? year, int? month, int? day, int? hour, int? minute, int? second)
+		{
+			return year == null || month == null || day == null || hour == null || minute == null || second == null ?
+				(DateTime?)null :
+				new DateTime(year.Value, month.Value, day.Value, hour.Value, minute.Value, second.Value);
+		}
+
+		[SqlFunction]
+		public static DateTime? ToDate(int? year, int? month, int? day)
+		{
+			return year == null || month == null || day == null ?
+				(DateTime?)null :
+				new DateTime(year.Value, month.Value, day.Value);
+		}
+
+		[SqlEnum]
+		public enum DateParts
+		{
+			Year        =  0,
+			Quarter     =  1,
+			Month       =  2,
+			DayOfYear   =  3,
+			Day         =  4,
+			Week        =  5,
+			WeekDay     =  6,
+			Hour        =  7,
+			Minute      =  8,
+			Second      =  9,
+			Millisecond = 10,
+		}
+
+		class DatePartAttribute : SqlExpressionAttribute
+		{
+			public DatePartAttribute(string sqlProvider, string expression, int datePartIndex, params int[] argIndices)
+				: this(sqlProvider, expression, Data.Sql.Precedence.Primary, false, null, datePartIndex, argIndices)
+			{
+			}
+
+			public DatePartAttribute(string sqlProvider, string expression, bool isExpression, int datePartIndex, params int[] argIndices)
+				: this(sqlProvider, expression, Data.Sql.Precedence.Primary, isExpression, null, datePartIndex, argIndices)
+			{
+			}
+
+			public DatePartAttribute(string sqlProvider, string expression, bool isExpression, string[] partMapping, int datePartIndex, params int[] argIndices)
+				: this(sqlProvider, expression, Data.Sql.Precedence.Primary, isExpression, partMapping, datePartIndex, argIndices)
+			{
+			}
+
+			public DatePartAttribute(string sqlProvider, string expression, int precedence, bool isExpression, string[] partMapping, int datePartIndex, params int[] argIndices)
+				: base(sqlProvider, expression, argIndices)
+			{
+				_isExpression  = isExpression;
+				_partMapping   = partMapping;
+				_datePartIndex = datePartIndex;
+				Precedence     = precedence;
+			}
+
+			readonly bool     _isExpression;
+			readonly string[] _partMapping;
+			readonly int      _datePartIndex;
+
+			public override ISqlExpression GetExpression(MemberInfo member, params ISqlExpression[] args)
+			{
+				var part = (DateParts)((SqlValue)args[_datePartIndex]).Value;
+				var pstr = _partMapping != null ? _partMapping[(int)part] : part.ToString();
+				var str  = string.Format(Expression, pstr ?? part.ToString());
+				var type = TypeHelper.GetMemberType(member);
+
+
+				return _isExpression ?
+					                new SqlExpression(type, str, Precedence, ConvertArgs(member, args)) :
+					(ISqlExpression)new SqlFunction  (type, str, ConvertArgs(member, args));
+			}
+		}
+
+		[CLSCompliant(false)]
+		[SqlFunction]
+		[DatePart("Oracle",     "Add{0}",                                                   false, 0, 2, 1)]
+		[DatePart("DB2",        "{{1}} + {0}",                         Precedence.Additive, true,  new[] { "{0} Year",          "({0} * 3) Month",         "{0} Month",           "{0} Day",         "{0} Day",         "({0} * 7) Day",       "{0} Day",         "{0} Hour",          "{0} Minute",            "{0} Second",            "({0} * 1000) Microsecond" }, 0, 1, 2)]
+		[DatePart("Informix",   "{{1}} + Interval({0}",                Precedence.Additive, true,  new[] { "{0}) Year to Year", "{0}) Month to Month * 3", "{0}) Month to Month", "{0}) Day to Day", "{0}) Day to Day", "{0}) Day to Day * 7", "{0}) Day to Day", "{0}) Hour to Hour", "{0}) Minute to Minute", "{0}) Second to Second", null                       }, 0, 1, 2)]
+		[DatePart("PostgreSQL", "{{1}} + Interval '{{0}} {0}",         Precedence.Additive, true,  new[] { "Year'",             "Month' * 3",              "Month'",              "Day'",            "Day'",            "Day' * 7",            "Day'",            "Hour'",             "Minute'",               "Second'",               "Millisecond'"             }, 0, 1, 2)]
+		[DatePart("MySql",      "Date_Add({{1}}, Interval {{0}} {0})",                      true,  new[] { null,                null,                      null,                  "Day",             null,              null,                  "Day",             null,                null,                    null,                    null                       }, 0, 1, 2)]
+		[DatePart("SQLite",     "DateTime({{1}}, '{{0}} {0}')",                             true,  new[] { null,                null,                      null,                  "Day",             null,              null,                  "Day",             null,                null,                    null,                    null                       }, 0, 1, 2)]
+		[DatePart("Access",     "DateAdd({0}, {{0}}, {{1}})",                               true,  new[] { "'yyyy'",            "'q'",                     "'m'",                 "'y'",             "'d'",             "'ww'",                "'w'",             "'h'",               "'n'",                   "'s'",                   null                       }, 0, 1, 2)]
+		public static DateTime? DateAdd(DateParts part, double? number, DateTime? date)
+		{
+			if (number == null || date == null)
+				return null;
+
+			switch (part)
+			{
+				case DateParts.Year        : return date.Value.AddYears       ((int)number);
+				case DateParts.Quarter     : return date.Value.AddMonths      ((int)number * 3);
+				case DateParts.Month       : return date.Value.AddMonths      ((int)number);
+				case DateParts.DayOfYear   : return date.Value.AddDays        (number.Value);
+				case DateParts.Day         : return date.Value.AddDays        (number.Value);
+				case DateParts.Week        : return date.Value.AddDays        (number.Value * 7);
+				case DateParts.WeekDay     : return date.Value.AddDays        (number.Value);
+				case DateParts.Hour        : return date.Value.AddHours       (number.Value);
+				case DateParts.Minute      : return date.Value.AddMinutes     (number.Value);
+				case DateParts.Second      : return date.Value.AddSeconds     (number.Value);
+				case DateParts.Millisecond : return date.Value.AddMilliseconds(number.Value);
+			}
+
+			throw new InvalidOperationException();
+		}
+
+		[CLSCompliant(false)]
+		[SqlFunction]
+		[DatePart("DB2",        "{0}",                               false, new[] { null,     null,  null,   null,      null,   null,   "DayOfWeek", null,     null,   null,   null   }, 0, 1)]
+		[DatePart("Informix",   "{0}",                                      0, 1)]
+		[DatePart("MySql",      "Extract({0} from {{0}})",           true,  0, 1)]
+		[DatePart("PostgreSQL", "Extract({0} from {{0}})",           true,  new[] { null,     null,  null,   "DOY",     null,   null,   "DOW",       null,     null,   null,   null   }, 0, 1)]
+		[DatePart("Firebird",   "Extract({0} from {{0}})",           true,  new[] { null,     null,  null,   "YearDay", null,   null,   null,        null,     null,   null,   null   }, 0, 1)]
+		[DatePart("Oracle",     "To_Number(To_Char({{0}}, {0}))",    true,  new[] { "'YYYY'", "'Q'", "'MM'", "'DDD'",   "'DD'", "'WW'", "'D'",       "'HH24'", "'MI'", "'SS'", "'FF'" }, 0, 1)]
+		[DatePart("SQLite",     "Cast(StrFTime({0}, {{0}}) as int)", true,  new[] { "'%Y'",   null,  "'%m'", "'%j'",    "'%d'", "'%W'", "'%w'",      "'%H'",   "'%M'", "'%S'", "'%f'" }, 0, 1)]
+		[DatePart("Access",     "DatePart({0}, {{0}})",              true,  new[] { "'yyyy'", "'q'", "'m'",  "'y'",     "'d'",  "'ww'", "'w'",       "'h'",    "'n'",  "'s'",  null   }, 0, 1)]
+		public static int? DatePart(DateParts part, DateTime? date)
+		{
+			if (date == null)
+				return null;
+
+			switch (part)
+			{
+				case DateParts.Year        : return date.Value.Year;
+				case DateParts.Quarter     : return (date.Value.Month - 1) / 3 + 1;
+				case DateParts.Month       : return date.Value.Month;
+				case DateParts.DayOfYear   : return date.Value.DayOfYear;
+				case DateParts.Day         : return date.Value.Day;
+				case DateParts.Week        : return CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(date.Value, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
+				case DateParts.WeekDay     : return ((int)date.Value.DayOfWeek + 1 + DateFirst + 6) % 7 + 1;
+				case DateParts.Hour        : return date.Value.Hour;
+				case DateParts.Minute      : return date.Value.Minute;
+				case DateParts.Second      : return date.Value.Second;
+				case DateParts.Millisecond : return date.Value.Millisecond;
+			}
+
+			throw new InvalidOperationException();
+		}
+
+		[CLSCompliant(false)]
+		[SqlFunction]
+		[SqlFunction("MySql", "TIMESTAMPDIFF")]
+		public static int? DateDiff(DateParts part, DateTime? startDate, DateTime? endDate)
+		{
+			if (startDate == null || endDate == null)
+				return null;
+
+			switch (part)
+			{
+				case DateParts.Day         : return (int)(endDate - startDate).Value.TotalDays;
+				case DateParts.Hour        : return (int)(endDate - startDate).Value.TotalHours;
+				case DateParts.Minute      : return (int)(endDate - startDate).Value.TotalMinutes;
+				case DateParts.Second      : return (int)(endDate - startDate).Value.TotalSeconds;
+				case DateParts.Millisecond : return (int)(endDate - startDate).Value.TotalMilliseconds;
+			}
+
+			throw new InvalidOperationException();
+		}
+
+		[SqlProperty("@@DATEFIRST")]
+		public static int DateFirst
+		{
+			get { return 7; }
+		}
+
+		[SqlFunction]
+		public static DateTime? MakeDateTime(int? year, int? month, int? day)
+		{
+			return year == null || month == null || day == null ?
+				(DateTime?)null :
+				new DateTime(year.Value, month.Value, day.Value);
+		}
+
+		[SqlFunction]
+		public static DateTime? MakeDateTime(int? year, int? month, int? day, int? hour, int? minute, int? second)
+		{
+			return year == null || month == null || day == null || hour == null || minute == null || second == null ?
+				(DateTime?)null :
+				new DateTime(year.Value, month.Value, day.Value, hour.Value, minute.Value, second.Value);
+		}
+
+		#endregion
+
+		#region Math Functions
+
+		[SqlFunction] public static Decimal? Abs    (Decimal? value) { return value == null ? null : (Decimal?)Math.Abs    (value.Value); }
+		[SqlFunction] public static Double?  Abs    (Double?  value) { return value == null ? null : (Double?) Math.Abs    (value.Value); }
+		[SqlFunction] public static Int16?   Abs    (Int16?   value) { return value == null ? null : (Int16?)  Math.Abs    (value.Value); }
+		[SqlFunction] public static Int32?   Abs    (Int32?   value) { return value == null ? null : (Int32?)  Math.Abs    (value.Value); }
+		[SqlFunction] public static Int64?   Abs    (Int64?   value) { return value == null ? null : (Int64?)  Math.Abs    (value.Value); }
+		[CLSCompliant(false)]
+		[SqlFunction] public static SByte?   Abs    (SByte?   value) { return value == null ? null : (SByte?)  Math.Abs    (value.Value); }
+		[SqlFunction] public static Single?  Abs    (Single?  value) { return value == null ? null : (Single?) Math.Abs    (value.Value); }
+
+		[SqlFunction] public static Double?  Acos   (Double?  value) { return value == null ? null : (Double?) Math.Acos   (value.Value); }
+		[SqlFunction] public static Double?  Asin   (Double?  value) { return value == null ? null : (Double?) Math.Asin   (value.Value); }
+
+		[SqlFunction("Access", "Atn")]
+		[SqlFunction] public static Double?  Atan   (Double?  value) { return value == null ? null : (Double?) Math.Atan   (value.Value); }
+
+		[CLSCompliant(false)]
+		[SqlFunction( "MsSql2012", "Atn2")]
+		[SqlFunction( "MsSql2008", "Atn2")]
+		[SqlFunction( "MsSql2000", "Atn2")]
+		[SqlFunction( "MsSql2005", "Atn2")]
+		[SqlFunction( "DB2",       "Atan2", 1, 0)]
+		[SqlFunction( "SqlCe",     "Atn2")]
+		[SqlFunction( "Sybase",    "Atn2")]
+		[SqlFunction] public static Double?  Atan2  (Double? x, Double? y) { return x == null || y == null? null : (Double?)Math.Atan2(x.Value, y.Value); }
+
+		[SqlFunction("Informix", "Ceil")]
+		[SqlFunction("Oracle",   "Ceil")]
+		[SqlFunction] public static Decimal? Ceiling(Decimal? value) { return value == null ? null : (Decimal?)decimal.Ceiling(value.Value); }
+		[SqlFunction("Informix", "Ceil")]
+		[SqlFunction("Oracle",   "Ceil")]
+		[SqlFunction] public static Double?  Ceiling(Double?  value) { return value == null ? null : (Double?)Math.Ceiling(value.Value); }
+
+		[SqlFunction] public static Double?  Cos    (Double?  value) { return value == null ? null : (Double?)Math.Cos    (value.Value); }
+
+		[SqlFunction] public static Double?  Cosh   (Double?  value) { return value == null ? null : (Double?)Math.Cosh   (value.Value); }
+
+		[SqlFunction] public static Double?  Cot    (Double?  value) { return value == null ? null : (Double?)Math.Cos(value.Value) / Math.Sin(value.Value); }
+
+		[SqlFunction] public static Decimal? Degrees(Decimal? value) { return value == null ? null : (Decimal?)(value.Value * 180m / (Decimal)Math.PI); }
+		[SqlFunction] public static Double?  Degrees(Double?  value) { return value == null ? null : (Double?) (value * 180 / Math.PI); }
+		[SqlFunction] public static Int16?   Degrees(Int16?   value) { return value == null ? null : (Int16?)  (value * 180 / Math.PI); }
+		[SqlFunction] public static Int32?   Degrees(Int32?   value) { return value == null ? null : (Int32?)  (value * 180 / Math.PI); }
+		[SqlFunction] public static Int64?   Degrees(Int64?   value) { return value == null ? null : (Int64?)  (value * 180 / Math.PI); }
+		[CLSCompliant(false)]
+		[SqlFunction] public static SByte?   Degrees(SByte?   value) { return value == null ? null : (SByte?)  (value * 180 / Math.PI); }
+		[SqlFunction] public static Single?  Degrees(Single?  value) { return value == null ? null : (Single?) (value * 180 / Math.PI); }
+
+		[SqlFunction] public static Double?  Exp    (Double?  value) { return value == null ? null : (Double?)Math.Exp    (value.Value); }
+
+		[SqlFunction("Access", "Int")]
+		[SqlFunction] public static Decimal? Floor  (Decimal? value) { return value == null ? null : (Decimal?)decimal.Floor(value.Value); }
+		[SqlFunction("Access", "Int")]
+		[SqlFunction] public static Double?  Floor  (Double?  value) { return value == null ? null : (Double?) Math.   Floor(value.Value); }
+
+		[SqlFunction("Informix",   "LogN")]
+		[SqlFunction("Oracle",     "Ln")]
+		[SqlFunction("Firebird",   "Ln")]
+		[SqlFunction("PostgreSQL", "Ln")]
+		[SqlFunction] public static Decimal? Log    (Decimal? value) { return value == null ? null : (Decimal?)Math.Log     ((Double)value.Value); }
+		[SqlFunction("Informix",   "LogN")]
+		[SqlFunction("Oracle",     "Ln")]
+		[SqlFunction("Firebird",   "Ln")]
+		[SqlFunction("PostgreSQL", "Ln")]
+		[SqlFunction] public static Double?  Log    (Double?  value) { return value == null ? null : (Double?) Math.Log     (value.Value); }
+
+		[SqlFunction("PostgreSQL", "Log")]
+		[SqlFunction] public static Double?  Log10  (Double?  value) { return value == null ? null : (Double?) Math.Log10   (value.Value); }
+
+		[SqlFunction]
+		public static double?  Log(double? newBase, double? value)
+		{
+			return value == null || newBase == null ? null : (Double?)Math.Log(value.Value, newBase.Value);
+		}
+
+		[SqlFunction]
+		public static decimal? Log(decimal? newBase, decimal? value)
+		{
+			return value == null || newBase == null ? null : (decimal?)Math.Log((double)value.Value, (double)newBase.Value);
+		}
+
+		[SqlExpression("Access", "{0} ^ {1}", Precedence = Precedence.Multiplicative)]
+		[SqlFunction]
+		public static Double?  Power(Double? x, Double? y)
+		{
+			return x == null || y == null ? null : (Double?)Math.Pow(x.Value, y.Value);
+		}
+
+		[SqlFunction]
+		public static Decimal? RoundToEven(Decimal? value)
+		{
+#if SILVERLIGHT
+			return value == null ? null : (Decimal?)Math.Round(value.Value);
+#else
+			return value == null ? null : (Decimal?)Math.Round(value.Value, MidpointRounding.ToEven);
+#endif
+		}
+
+		[SqlFunction]
+		public static Double? RoundToEven(Double? value)
+		{
+#if SILVERLIGHT
+			return value == null ? null : (Double?) Math.Round(value.Value);
+#else
+			return value == null ? null : (Double?) Math.Round(value.Value, MidpointRounding.ToEven);
+#endif
+		}
+
+		[SqlFunction] public static Decimal? Round(Decimal? value) { return Round(value, 0); }
+		[SqlFunction] public static Double?  Round(Double?  value) { return Round(value, 0); }
+
+		[SqlFunction]
+		public static Decimal? Round(Decimal? value, int? precision)
+		{
+#if SILVERLIGHT
+			throw new InvalidOperationException();
+#else
+			return value == null || precision == null? null : (Decimal?)Math.Round(value.Value, precision.Value, MidpointRounding.AwayFromZero);
+#endif
+		}
+
+		[SqlFunction]
+		public static Double? Round(Double? value, int? precision)
+		{
+#if SILVERLIGHT
+			throw new InvalidOperationException();
+#else
+			return value == null || precision == null? null : (Double?) Math.Round(value.Value, precision.Value, MidpointRounding.AwayFromZero);
+#endif
+		}
+
+		[SqlFunction]
+		public static Decimal? RoundToEven(Decimal? value, int? precision)
+		{
+#if SILVERLIGHT
+			return value == null || precision == null? null : (Decimal?)Math.Round(value.Value, precision.Value);
+#else
+			return value == null || precision == null? null : (Decimal?)Math.Round(value.Value, precision.Value, MidpointRounding.ToEven);
+#endif
+		}
+
+		[SqlFunction]
+		public static Double? RoundToEven(Double?  value, int? precision)
+		{
+#if SILVERLIGHT
+			return value == null || precision == null? null : (Double?) Math.Round(value.Value, precision.Value);
+#else
+			return value == null || precision == null? null : (Double?) Math.Round(value.Value, precision.Value, MidpointRounding.ToEven);
+#endif
+		}
+
+		[SqlFunction("Access", "Sgn"), SqlFunction] public static int? Sign(Decimal? value) { return value == null ? null : (int?)Math.Sign(value.Value); }
+		[SqlFunction("Access", "Sgn"), SqlFunction] public static int? Sign(Double?  value) { return value == null ? null : (int?)Math.Sign(value.Value); }
+		[SqlFunction("Access", "Sgn"), SqlFunction] public static int? Sign(Int16?   value) { return value == null ? null : (int?)Math.Sign(value.Value); }
+		[SqlFunction("Access", "Sgn"), SqlFunction] public static int? Sign(Int32?   value) { return value == null ? null : (int?)Math.Sign(value.Value); }
+		[SqlFunction("Access", "Sgn"), SqlFunction] public static int? Sign(Int64?   value) { return value == null ? null : (int?)Math.Sign(value.Value); }
+		[CLSCompliant(false)]
+		[SqlFunction("Access", "Sgn"), SqlFunction] public static int? Sign(SByte?   value) { return value == null ? null : (int?)Math.Sign(value.Value); }
+		[SqlFunction("Access", "Sgn"), SqlFunction] public static int? Sign(Single?  value) { return value == null ? null : (int?)Math.Sign(value.Value); }
+
+		[SqlFunction] public static Double?  Sin     (Double?  value) { return value == null ? null : (Double?)Math.Sin (value.Value); }
+		[SqlFunction] public static Double?  Sinh    (Double?  value) { return value == null ? null : (Double?)Math.Sinh(value.Value); }
+		[SqlFunction("Access", "Sqr")]
+		[SqlFunction] public static Double?  Sqrt    (Double?  value) { return value == null ? null : (Double?)Math.Sqrt(value.Value); }
+		[SqlFunction] public static Double?  Tan     (Double?  value) { return value == null ? null : (Double?)Math.Tan (value.Value); }
+		[SqlFunction] public static Double?  Tanh    (Double?  value) { return value == null ? null : (Double?)Math.Tanh(value.Value); }
+
+		[SqlExpression("MsSql2012",  "Round({0}, 0, 1)")]
+		[SqlExpression("MsSql2008",  "Round({0}, 0, 1)")]
+		[SqlExpression("MsSql2005",  "Round({0}, 0, 1)")]
+		[SqlExpression("MsSql2000",  "Round({0}, 0, 1)")]
+		[SqlExpression("DB2",        "Truncate({0}, 0)")]
+		[SqlExpression("Informix",   "Trunc({0}, 0)")]
+		[SqlExpression("Oracle",     "Trunc({0}, 0)")]
+		[SqlExpression("Firebird",   "Trunc({0}, 0)")]
+		[SqlExpression("PostgreSQL", "Trunc({0}, 0)")]
+		[SqlExpression("MySql",      "Truncate({0}, 0)")]
+		[SqlExpression("SqlCe",      "Round({0}, 0, 1)")]
+		[SqlFunction]
+		public static Decimal? Truncate(Decimal? value)
+		{
+#if SILVERLIGHT
+			throw new InvalidOperationException();
+#else
+			return value == null ? null : (Decimal?)decimal.Truncate(value.Value);
+#endif
+		}
+
+		[SqlExpression("MsSql2012",  "Round({0}, 0, 1)")]
+		[SqlExpression("MsSql2008",  "Round({0}, 0, 1)")]
+		[SqlExpression("MsSql2005",  "Round({0}, 0, 1)")]
+		[SqlExpression("MsSql2000",  "Round({0}, 0, 1)")]
+		[SqlExpression("DB2",        "Truncate({0}, 0)")]
+		[SqlExpression("Informix",   "Trunc({0}, 0)")]
+		[SqlExpression("Oracle",     "Trunc({0}, 0)")]
+		[SqlExpression("Firebird",   "Trunc({0}, 0)")]
+		[SqlExpression("PostgreSQL", "Trunc({0}, 0)")]
+		[SqlExpression("MySql",      "Truncate({0}, 0)")]
+		[SqlExpression("SqlCe",      "Round({0}, 0, 1)")]
+		[SqlFunction]
+		public static Double? Truncate(Double? value)
+		{
+#if SILVERLIGHT
+			throw new InvalidOperationException();
+#else
+			return value == null ? null : (Double?) Math.Truncate(value.Value);
+#endif
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/SqlEnumAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+using System;
+
+namespace BLToolkit.Data.Linq
+{
+	[AttributeUsageAttribute(AttributeTargets.Enum, AllowMultiple = false, Inherited = false)]
+	public sealed class SqlEnumAttribute : Attribute
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/SqlExpressionAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,55 @@
+using System;
+using System.Reflection;
+
+namespace BLToolkit.Data.Linq
+{
+	using Data.Sql;
+	using Reflection;
+
+	[SerializableAttribute]
+	[AttributeUsageAttribute(AttributeTargets.Property | AttributeTargets.Method, AllowMultiple = true, Inherited = false)]
+	public class SqlExpressionAttribute : SqlFunctionAttribute
+	{
+		public SqlExpressionAttribute(string expression)
+			: base(expression)
+		{
+			Precedence = Data.Sql.Precedence.Primary;
+		}
+
+		public SqlExpressionAttribute(string expression, params int[] argIndices)
+			: base(expression, argIndices)
+		{
+			Precedence = Data.Sql.Precedence.Primary;
+		}
+
+		public SqlExpressionAttribute(string sqlProvider, string expression)
+			: base(sqlProvider, expression)
+		{
+			Precedence = Data.Sql.Precedence.Primary;
+		}
+
+		public SqlExpressionAttribute(string sqlProvider, string expression, params int[] argIndices)
+			: base(sqlProvider, expression, argIndices)
+		{
+			Precedence = Data.Sql.Precedence.Primary;
+		}
+
+		protected new string Name
+		{
+			get { return base.Name; }
+		}
+
+		public string Expression
+		{
+			get { return base.Name;  }
+			set { base.Name = value; }
+		}
+
+		public int Precedence { get; set; }
+
+		public override ISqlExpression GetExpression(MemberInfo member, params ISqlExpression[] args)
+		{
+			return new SqlExpression(TypeHelper.GetMemberType(member), Expression ?? member.Name, Precedence, ConvertArgs(member, args));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/SqlFunctionAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,79 @@
+using System;
+using System.Linq;
+using System.Reflection;
+
+namespace BLToolkit.Data.Linq
+{
+	using Data.Sql;
+	using Reflection;
+
+	[SerializableAttribute]
+	[AttributeUsageAttribute(AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true, Inherited = false)]
+	public class SqlFunctionAttribute : Attribute
+	{
+		public SqlFunctionAttribute()
+		{
+		}
+
+		public SqlFunctionAttribute(string name)
+		{
+			Name = name;
+		}
+
+		public SqlFunctionAttribute(string name, params int[] argIndices)
+		{
+			Name        = name;
+			ArgIndices  = argIndices;
+		}
+
+		public SqlFunctionAttribute(string sqlProvider, string name)
+		{
+			SqlProvider = sqlProvider;
+			Name        = name;
+		}
+
+		public SqlFunctionAttribute(string sqlProvider, string name, params int[] argIndices)
+		{
+			SqlProvider = sqlProvider;
+			Name        = name;
+			ArgIndices  = argIndices;
+		}
+
+		public string SqlProvider      { get; set; }
+		public string Name             { get; set; }
+		public bool   ServerSideOnly   { get; set; }
+		public bool   PreferServerSide { get; set; }
+		public int[]  ArgIndices       { get; set; }
+
+		protected ISqlExpression[] ConvertArgs(MemberInfo member, ISqlExpression[] args)
+		{
+			if (member is MethodInfo)
+			{
+				var method = (MethodInfo)member;
+
+				if (method.DeclaringType.IsGenericType)
+					args = args.Concat(method.DeclaringType.GetGenericArguments().Select(t => (ISqlExpression)SqlDataType.GetDataType(t))).ToArray();
+
+				if (method.IsGenericMethod)
+					args = args.Concat(method.GetGenericArguments().Select(t => (ISqlExpression)SqlDataType.GetDataType(t))).ToArray();
+			}
+
+			if (ArgIndices != null)
+			{
+				var idxs = new ISqlExpression[ArgIndices.Length];
+
+				for (var i = 0; i < ArgIndices.Length; i++)
+					idxs[i] = args[ArgIndices[i]];
+
+				return idxs;
+			}
+
+			return args;
+		}
+
+		public virtual ISqlExpression GetExpression(MemberInfo member, params ISqlExpression[] args)
+		{
+			return new SqlFunction(TypeHelper.GetMemberType(member), Name ?? member.Name, ConvertArgs(member, args));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/SqlPropertyAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,32 @@
+using System;
+using System.Reflection;
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Data.Linq
+{
+	using Data.Sql;
+
+	[SerializableAttribute]
+	[AttributeUsageAttribute(AttributeTargets.Property | AttributeTargets.Method, AllowMultiple = true, Inherited = false)]
+	public class SqlPropertyAttribute : SqlFunctionAttribute
+	{
+		public SqlPropertyAttribute()
+		{
+		}
+
+		public SqlPropertyAttribute(string name)
+			: base(name)
+		{
+		}
+
+		public SqlPropertyAttribute(string sqlProvider, string name)
+			: base(sqlProvider, name)
+		{
+		}
+
+		public override ISqlExpression GetExpression(MemberInfo member, params ISqlExpression[] args)
+		{
+			return new SqlExpression(TypeHelper.GetMemberType(member), Name ?? member.Name, Precedence.Primary);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/TableExpressionAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,53 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+
+using BLToolkit.Data.Sql;
+
+namespace BLToolkit.Data.Linq
+{
+	[SerializableAttribute]
+	[AttributeUsageAttribute(AttributeTargets.Method, AllowMultiple = true, Inherited = false)]
+	public class TableExpressionAttribute : TableFunctionAttribute
+	{
+		public TableExpressionAttribute(string expression)
+			: base(expression)
+		{
+		}
+
+		public TableExpressionAttribute(string expression, params int[] argIndices)
+			: base(expression, argIndices)
+		{
+		}
+
+		public TableExpressionAttribute(string sqlProvider, string expression)
+			: base(sqlProvider, expression)
+		{
+		}
+
+		public TableExpressionAttribute(string sqlProvider, string expression, params int[] argIndices)
+			: base(sqlProvider, expression, argIndices)
+		{
+		}
+
+		protected new string Name
+		{
+			get { return base.Name; }
+		}
+
+		public string Expression
+		{
+			get { return base.Name;  }
+			set { base.Name = value; }
+		}
+
+		public override void SetTable(SqlTable table, MemberInfo member, IEnumerable<Expression> arguments, IEnumerable<ISqlExpression> sqlArgs)
+		{
+			table.SqlTableType   = SqlTableType.Expression;
+			table.Name           = Expression ?? member.Name;
+			table.TableArguments = ConvertArgs(member, sqlArgs.ToArray());
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/TableFunctionAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,81 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+
+using BLToolkit.Data.Sql;
+
+namespace BLToolkit.Data.Linq
+{
+	[SerializableAttribute]
+	[AttributeUsageAttribute(AttributeTargets.Method, AllowMultiple = true, Inherited = false)]
+	public class TableFunctionAttribute : Attribute
+	{
+		public TableFunctionAttribute()
+		{
+		}
+
+		public TableFunctionAttribute(string name)
+		{
+			Name = name;
+		}
+
+		public TableFunctionAttribute(string name, params int[] argIndices)
+		{
+			Name        = name;
+			ArgIndices  = argIndices;
+		}
+
+		public TableFunctionAttribute(string sqlProvider, string name)
+		{
+			SqlProvider = sqlProvider;
+			Name        = name;
+		}
+
+		public TableFunctionAttribute(string sqlProvider, string name, params int[] argIndices)
+		{
+			SqlProvider = sqlProvider;
+			Name        = name;
+			ArgIndices  = argIndices;
+		}
+
+		public string SqlProvider      { get; set; }
+		public string Name             { get; set; }
+		public int[]  ArgIndices       { get; set; }
+
+		protected ISqlExpression[] ConvertArgs(MemberInfo member, ISqlExpression[] args)
+		{
+			if (member is MethodInfo)
+			{
+				var method = (MethodInfo)member;
+
+				if (method.DeclaringType.IsGenericType)
+					args = args.Concat(method.DeclaringType.GetGenericArguments().Select(t => (ISqlExpression)SqlDataType.GetDataType(t))).ToArray();
+
+				if (method.IsGenericMethod)
+					args = args.Concat(method.GetGenericArguments().Select(t => (ISqlExpression)SqlDataType.GetDataType(t))).ToArray();
+			}
+
+			if (ArgIndices != null)
+			{
+				var idxs = new ISqlExpression[ArgIndices.Length];
+
+				for (var i = 0; i < ArgIndices.Length; i++)
+					idxs[i] = args[ArgIndices[i]];
+
+				return idxs;
+			}
+
+			return args;
+		}
+
+		public virtual void SetTable(SqlTable table, MemberInfo member, IEnumerable<Expression> arguments, IEnumerable<ISqlExpression> sqlArgs)
+		{
+			table.SqlTableType   = SqlTableType.Function;
+			table.Name           = Name ?? member.Name;
+			table.PhysicalName   = Name ?? member.Name;
+			table.TableArguments = ConvertArgs(member, sqlArgs.ToArray());
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Linq/TableT.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,60 @@
+using System;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Data.Linq
+{
+	public class Table<T> : ExpressionQuery<T>, ITable
+	{
+		public Table(IDataContextInfo dataContextInfo, Expression expression)
+		{
+			Init(dataContextInfo, expression);
+		}
+
+		public Table(IDataContextInfo dataContextInfo)
+		{
+			Init(dataContextInfo, null);
+		}
+
+#if !SILVERLIGHT
+
+		public Table()
+		{
+			Init(null, null);
+		}
+
+		public Table(Expression expression)
+		{
+			Init(null, expression);
+		}
+		
+#endif
+
+		public Table(IDataContext dataContext)
+		{
+			Init(dataContext == null ? null : new DataContextInfo(dataContext), null);
+		}
+
+		public Table(IDataContext dataContext, Expression expression)
+		{
+			Init(dataContext == null ? null : new DataContextInfo(dataContext), expression);
+		}
+
+		#region Overrides
+
+#if OVERRIDETOSTRING
+
+		public override string ToString()
+		{
+			return "Table(" + typeof (T).Name + ")";
+		}
+
+#endif
+
+		#endregion
+
+		public object Select(object p)
+		{
+			throw new NotImplementedException();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/OperationExceptionEventArgs.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,19 @@
+namespace BLToolkit.Data
+{
+	public delegate void OperationExceptionEventHandler(object sender, OperationExceptionEventArgs ea);
+
+	public class OperationExceptionEventArgs : OperationTypeEventArgs
+	{
+		private readonly DataException _exception;
+		public           DataException  Exception
+		{
+			get { return _exception; }
+		}
+
+		public OperationExceptionEventArgs(OperationType operation, DataException exception)
+			: base (operation)
+		{
+			_exception = exception;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/OperationType.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,26 @@
+using System;
+
+namespace BLToolkit.Data
+{
+	/// <summary>
+	/// Type of an operation being performed.
+	/// </summary>
+	public enum OperationType
+	{
+		OpenConnection,
+		CloseConnection,
+		BeginTransaction,
+		CommitTransaction,
+		RollbackTransaction,
+		DisposeTransaction,
+		DeriveParameters,
+		PrepareCommand,
+		ExecuteNonQuery,
+		[Obsolete]
+		ExecuteScalar,
+		ExecuteReader,
+		Fill,
+		Update,
+		Read
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/OperationTypeEventArgs.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+using System;
+
+namespace BLToolkit.Data
+{
+	public delegate void OperationTypeEventHandler(object sender, OperationTypeEventArgs ea);
+
+	public class OperationTypeEventArgs : EventArgs
+	{
+		private readonly OperationType _operation;
+		public           OperationType  Operation
+		{
+			get { return _operation; }
+		}
+
+		public OperationTypeEventArgs(OperationType operation)
+		{
+			_operation = operation;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/ScalarSourceType.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,32 @@
+namespace BLToolkit.Data
+{
+	/// <summary>
+	/// Defines the method how a scalar value is returned from the server.
+	/// </summary>
+	public enum ScalarSourceType
+	{
+		/// <summary>
+		/// A call to <see cref="DbManager"/>.<see cref="DbManager.ExecuteReader()"/>
+		/// then <see cref="System.Data.IDataReader"/>.<see cref="System.Data.IDataReader.GetValue(int)"/>.
+		/// </summary>
+		DataReader,
+
+		/// <summary>
+		/// A call to <see cref="DbManager"/>.<see cref="DbManager.ExecuteNonQuery()"/>.
+		/// An output parameter <see cref="System.Data.IDbDataParameter.Value"/> is used.
+		/// </summary>
+		OutputParameter,
+
+		/// <summary>
+		/// A call to <see cref="DbManager"/>.<see cref="DbManager.ExecuteNonQuery()"/>.
+		/// The return parameter <see cref="System.Data.IDbDataParameter.Value"/> is used.
+		/// </summary>
+		ReturnValue,
+
+		/// <summary>
+		/// Same as <see cref="DbManager"/>.<see cref="DbManager.ExecuteNonQuery()"/>.
+		/// Useful for an abstract <see cref="BLToolkit.DataAccess.DataAccessor"/>.
+		/// </summary>
+		AffectedRows,
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/ChildContainer.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,41 @@
+using System;
+using System.Collections.Generic;
+
+namespace BLToolkit.Data.Sql
+{
+	public class ChildContainer<TP,TC> : Dictionary<string,TC>, IDictionary<string,TC>
+		where TC : IChild<TP>
+		where TP : class
+	{
+		internal ChildContainer()
+		{
+		}
+
+		internal ChildContainer(TP parent)
+		{
+			_parent = parent;
+		}
+
+		readonly TP _parent;
+		public   TP  Parent { get { return _parent; } }
+
+		public void Add(TC item)
+		{
+			Add(item.Name, item);
+		}
+
+		public new void Add(string key, TC value)
+		{
+			if (value.Parent != null) throw new InvalidOperationException("Invalid parent.");
+			value.Parent = _parent;
+
+			base.Add(key, value);
+		}
+
+		public void AddRange(IEnumerable<TC> collection)
+		{
+			foreach (var item in collection)
+				Add(item);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/Extensions.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,27 @@
+using System;
+
+namespace BLToolkit.Data.Sql
+{
+	using FJoin = SqlQuery.FromClause.Join;
+
+	public static class Extensions
+	{
+		public static FJoin InnerJoin    (this ISqlTableSource table,               params FJoin[] joins) { return SqlQuery.InnerJoin    (table,        joins); }
+		public static FJoin InnerJoin    (this ISqlTableSource table, string alias, params FJoin[] joins) { return SqlQuery.InnerJoin    (table, alias, joins); }
+		public static FJoin LeftJoin     (this ISqlTableSource table,               params FJoin[] joins) { return SqlQuery.LeftJoin     (table,        joins); }
+		public static FJoin LeftJoin     (this ISqlTableSource table, string alias, params FJoin[] joins) { return SqlQuery.LeftJoin     (table, alias, joins); }
+		public static FJoin Join         (this ISqlTableSource table,               params FJoin[] joins) { return SqlQuery.Join         (table,        joins); }
+		public static FJoin Join         (this ISqlTableSource table, string alias, params FJoin[] joins) { return SqlQuery.Join         (table, alias, joins); }
+		public static FJoin CrossApply   (this ISqlTableSource table,               params FJoin[] joins) { return SqlQuery.CrossApply   (table,        joins); }
+		public static FJoin CrossApply   (this ISqlTableSource table, string alias, params FJoin[] joins) { return SqlQuery.CrossApply   (table, alias, joins); }
+		public static FJoin OuterApply   (this ISqlTableSource table,               params FJoin[] joins) { return SqlQuery.OuterApply   (table,        joins); }
+		public static FJoin OuterApply   (this ISqlTableSource table, string alias, params FJoin[] joins) { return SqlQuery.OuterApply   (table, alias, joins); }
+
+		public static FJoin WeakInnerJoin(this ISqlTableSource table,               params FJoin[] joins) { return SqlQuery.WeakInnerJoin(table,        joins); }
+		public static FJoin WeakInnerJoin(this ISqlTableSource table, string alias, params FJoin[] joins) { return SqlQuery.WeakInnerJoin(table, alias, joins); }
+		public static FJoin WeakLeftJoin (this ISqlTableSource table,               params FJoin[] joins) { return SqlQuery.WeakLeftJoin (table,        joins); }
+		public static FJoin WeakLeftJoin (this ISqlTableSource table, string alias, params FJoin[] joins) { return SqlQuery.WeakLeftJoin (table, alias, joins); }
+		public static FJoin WeakJoin     (this ISqlTableSource table,               params FJoin[] joins) { return SqlQuery.WeakJoin     (table,        joins); }
+		public static FJoin WeakJoin     (this ISqlTableSource table, string alias, params FJoin[] joins) { return SqlQuery.WeakJoin     (table, alias, joins); }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/IChild.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+using System;
+
+namespace BLToolkit.Data.Sql
+{
+	public interface IChild<T>
+	{
+		string Name   { get; }
+		T      Parent { get; set; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/ICloneableElement.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+using System;
+using System.Collections.Generic;
+
+namespace BLToolkit.Data.Sql
+{
+	public interface ICloneableElement
+	{
+		ICloneableElement Clone(Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/IQueryElement.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace BLToolkit.Data.Sql
+{
+	public interface IQueryElement //: ICloneableElement
+	{
+		QueryElementType ElementType { get; }
+		StringBuilder    ToString (StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/ISqlExpression.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,13 @@
+using System;
+
+namespace BLToolkit.Data.Sql
+{
+	public interface ISqlExpression : IQueryElement, IEquatable<ISqlExpression>, ISqlExpressionWalkable, ICloneableElement
+	{
+		bool CanBeNull();
+		bool Equals   (ISqlExpression other, Func<ISqlExpression,ISqlExpression,bool> comparer);
+
+		int  Precedence { get; }
+		Type SystemType { get; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/ISqlExpressionWalkable.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+using System;
+
+namespace BLToolkit.Data.Sql
+{
+	public interface ISqlExpressionWalkable
+	{
+		//[Obsolete]
+		ISqlExpression Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/ISqlPredicate.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+using System;
+
+namespace BLToolkit.Data.Sql
+{
+	public interface ISqlPredicate : IQueryElement, ISqlExpressionWalkable, ICloneableElement
+	{
+		bool CanBeNull();
+		int  Precedence { get; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/ISqlTableSource.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+
+namespace BLToolkit.Data.Sql
+{
+	public interface ISqlTableSource : ISqlExpression
+	{
+		SqlField              All          { get; }
+		int                   SourceID     { get; }
+		SqlTableType          SqlTableType { get; }
+		IList<ISqlExpression> GetKeys(bool allIfEmpty);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/IValueContainer.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+using System;
+
+namespace BLToolkit.Data.Sql
+{
+	public interface IValueContainer
+	{
+		object Value { get; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/Join.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,98 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace BLToolkit.Data.Sql
+{
+	using Reflection.Extension;
+
+	public class Join : IQueryElement, ICloneableElement
+	{
+		public Join()
+		{
+		}
+
+		public Join(string tableName, params JoinOn[] joinOns)
+			: this(tableName, null, joinOns)
+		{
+		}
+
+		public Join(string tableName, string alias, params JoinOn[] joinOns)
+		{
+			_tableName = tableName;
+			_alias     = alias;
+			_joinOns.AddRange(joinOns);
+		}
+
+		public Join(string tableName, string alias, IEnumerable<JoinOn> joinOns)
+		{
+			_tableName = tableName;
+			_alias     = alias;
+			_joinOns.AddRange(joinOns);
+		}
+
+		public Join(AttributeExtension ext)
+		{
+			_tableName = (string)ext["TableName"];
+			_alias     = (string)ext["Alias"];
+
+			var col = ext.Attributes["On"];
+
+			foreach (AttributeExtension ae in col)
+				_joinOns.Add(new JoinOn(ae));
+		}
+
+		private string _tableName;
+		public  string  TableName { get { return _tableName; } set { _tableName = value; } }
+
+		private string _alias;
+		public  string  Alias { get { return _alias; } set { _alias = value; } }
+
+		readonly List<JoinOn> _joinOns = new List<JoinOn>();
+		public   List<JoinOn>  JoinOns
+		{
+			get { return _joinOns; }
+		}
+
+		public Join Clone()
+		{
+			var join = new Join(_tableName, _alias);
+
+			foreach (var on in JoinOns)
+				join.JoinOns.Add(new JoinOn(on.Field, on.OtherField, on.Expression));
+
+			return join;
+		}
+
+		#region IQueryElement Members
+
+		public QueryElementType ElementType { get { return QueryElementType.Join; } }
+
+		StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+		{
+			return sb;
+		}
+
+		#endregion
+
+		#region ICloneableElement Members
+
+		public ICloneableElement Clone(Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+		{
+			if (!doClone(this))
+				return this;
+
+			ICloneableElement clone;
+
+			if (!objectTree.TryGetValue(this, out clone))
+				objectTree.Add(this, clone = new Join(
+					_tableName,
+					_alias,
+					_joinOns.ConvertAll(j => (JoinOn)j.Clone(objectTree, doClone))));
+
+			return clone;
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/JoinOn.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,72 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace BLToolkit.Data.Sql
+{
+	using Reflection.Extension;
+
+	public class JoinOn : IQueryElement, ICloneableElement
+	{
+		public JoinOn()
+		{
+		}
+
+		public JoinOn(string field, string otherField)
+		{
+			_field      = field;
+			_otherField = otherField;
+		}
+
+		public JoinOn(string field, string otherField, string expression)
+		{
+			_field      = field;
+			_otherField = otherField;
+			_expression = expression;
+		}
+
+		public JoinOn(AttributeExtension ext)
+		{
+			_field      = (string)ext["Field"];
+			_otherField = (string)ext["OtherField"];
+			_expression = (string)ext["Expression"];
+		}
+
+		private string _field;
+		public  string  Field { get { return _field; } set { _field = value; } }
+
+		private string _otherField;
+		public  string  OtherField { get { return _otherField; } set { _otherField = value; } }
+
+		private string _expression;
+		public  string  Expression { get { return _expression; } set { _expression = value; } }
+
+		#region IQueryElement Members
+
+		public QueryElementType ElementType { get { return QueryElementType.JoinOn; } }
+
+		StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+		{
+			return sb;
+		}
+
+		#endregion
+
+		#region ICloneableElement Members
+
+		public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+		{
+			if (!doClone(this))
+				return this;
+
+			ICloneableElement clone;
+
+			if (!objectTree.TryGetValue(this, out clone))
+				objectTree.Add(this, clone = new JoinOn(_field, _otherField, _expression));
+
+			return clone;
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/Precedence.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,19 @@
+using System;
+
+namespace BLToolkit.Data.Sql
+{
+	public class Precedence
+	{
+		public const int Primary            = 100; // (x) x.y f(x) a[x] x++ x-- new typeof sizeof checked unchecked
+		public const int Unary              =  90; // + - ! ++x --x (T)x
+		public const int Multiplicative     =  80; // * / %
+		public const int Subtraction        =  70; // -
+		public const int Additive           =  60; // +
+		public const int Comparison         =  50; // ANY ALL SOME EXISTS, IS [NOT], IN, BETWEEN, LIKE, < > <= >=, == !=
+		public const int Bitwise            =  40; // ^
+		public const int LogicalNegation    =  30; // NOT
+		public const int LogicalConjunction =  20; // AND
+		public const int LogicalDisjunction =  10; // OR
+		public const int Unknown            =   0;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/QueryElementType.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,47 @@
+using System;
+
+namespace BLToolkit.Data.Sql
+{
+	public enum QueryElementType
+	{
+		SqlField,
+		SqlFunction,
+		SqlParameter,
+		SqlExpression,
+		SqlBinaryExpression,
+		SqlValue,
+		SqlDataType,
+		SqlTable,
+			Join,
+				JoinOn,
+
+		ExprPredicate,
+		NotExprPredicate,
+		ExprExprPredicate,
+		LikePredicate,
+		BetweenPredicate,
+		IsNullPredicate,
+		InSubQueryPredicate,
+		InListPredicate,
+		FuncLikePredicate,
+
+		SqlQuery,
+			Column,
+			SearchCondition,
+				Condition,
+			TableSource,
+				JoinedTable,
+
+			SelectClause,
+			InsertClause,
+			UpdateClause,
+				SetExpression,
+			DeleteClause,
+			FromClause,
+			WhereClause,
+			GroupByClause,
+			OrderByClause,
+				OrderByItem,
+			Union,
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/QueryType.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,13 @@
+using System;
+
+namespace BLToolkit.Data.Sql
+{
+	public enum QueryType
+	{
+		Select,
+		Delete,
+		Update,
+		Insert,
+		InsertOrUpdate
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/QueryVisitor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1465 @@
+using System;
+using System.Collections.Generic;
+
+namespace BLToolkit.Data.Sql
+{
+	using VisitFunc   = Func<IQueryElement,bool>;
+	using FindFunc    = Func<IQueryElement,bool>;
+	using ConvertFunc = Func<IQueryElement,IQueryElement>;
+
+	public class QueryVisitor
+	{
+		#region Visit
+
+		readonly Dictionary<IQueryElement,IQueryElement> _visitedElements = new Dictionary<IQueryElement, IQueryElement>();
+		public   Dictionary<IQueryElement,IQueryElement>  VisitedElements
+		{
+			get { return _visitedElements; }
+		}
+
+		bool                     _all;
+		Func<IQueryElement,bool> _action1;
+		Action<IQueryElement>    _action2;
+
+		public void VisitParentFirst(IQueryElement element, Func<IQueryElement,bool> action)
+		{
+			_visitedElements.Clear();
+			_action1 = action;
+			Visit1(element);
+		}
+
+		void Visit1(IQueryElement element)
+		{
+			if (element == null || _visitedElements.ContainsKey(element))
+				return;
+
+			_visitedElements.Add(element, element);
+
+			if (!_action1(element))
+				return;
+
+			switch (element.ElementType)
+			{
+				case QueryElementType.SqlFunction:
+					{
+						foreach (var p in ((SqlFunction)element).Parameters) Visit1(p);
+						break;
+					}
+
+				case QueryElementType.SqlExpression:
+					{
+						foreach (var v in ((SqlExpression)element).Parameters) Visit1(v);
+						break;
+					}
+
+				case QueryElementType.SqlBinaryExpression:
+					{
+						//var bexpr = (SqlBinaryExpression)element;
+						Visit1(((SqlBinaryExpression)element).Expr1);
+						Visit1(((SqlBinaryExpression)element).Expr2);
+						break;
+					}
+
+				case QueryElementType.SqlTable:
+					{
+						var table = (SqlTable)element;
+
+						Visit1(table.All);
+						foreach (var field in table.Fields.Values) Visit1(field);
+						foreach (var join  in table.Joins)         Visit1(join);
+
+						if (table.TableArguments != null)
+							foreach (var a in table.TableArguments) Visit1(a);
+
+						break;
+					}
+
+				case QueryElementType.Join:
+					{
+						foreach (var j in ((Join)element).JoinOns) Visit1(j);
+						break;
+					}
+
+				case QueryElementType.Column:
+					{
+						Visit1(((SqlQuery.Column)element).Expression);
+						break;
+					}
+
+				case QueryElementType.TableSource:
+					{
+						//var table = ((SqlQuery.TableSource)element);
+
+						Visit1(((SqlQuery.TableSource)element).Source);
+						foreach (var j in ((SqlQuery.TableSource)element).Joins) Visit1(j);
+						break;
+					}
+
+				case QueryElementType.JoinedTable:
+					{
+						//var join = (SqlQuery.JoinedTable)element;
+						Visit1(((SqlQuery.JoinedTable)element).Table);
+						Visit1(((SqlQuery.JoinedTable)element).Condition);
+						break;
+					}
+
+				case QueryElementType.SearchCondition:
+					{
+						foreach (var c in ((SqlQuery.SearchCondition)element).Conditions) Visit1(c);
+						break;
+					}
+
+				case QueryElementType.Condition:
+					{
+						Visit1(((SqlQuery.Condition)element).Predicate);
+						break;
+					}
+
+				case QueryElementType.ExprPredicate:
+					{
+						Visit1(((SqlQuery.Predicate.Expr)element).Expr1);
+						break;
+					}
+
+				case QueryElementType.NotExprPredicate:
+					{
+						Visit1(((SqlQuery.Predicate.NotExpr)element).Expr1);
+						break;
+					}
+
+				case QueryElementType.ExprExprPredicate:
+					{
+						//var p = ((SqlQuery.Predicate.ExprExpr)element);
+						Visit1(((SqlQuery.Predicate.ExprExpr)element).Expr1);
+						Visit1(((SqlQuery.Predicate.ExprExpr)element).Expr2);
+						break;
+					}
+
+				case QueryElementType.LikePredicate:
+					{
+						//var p = ((SqlQuery.Predicate.Like)element);
+						Visit1(((SqlQuery.Predicate.Like)element).Expr1);
+						Visit1(((SqlQuery.Predicate.Like)element).Expr2);
+						Visit1(((SqlQuery.Predicate.Like)element).Escape);
+						break;
+					}
+
+				case QueryElementType.BetweenPredicate:
+					{
+						//var p = (SqlQuery.Predicate.Between)element;
+						Visit1(((SqlQuery.Predicate.Between)element).Expr1);
+						Visit1(((SqlQuery.Predicate.Between)element).Expr2);
+						Visit1(((SqlQuery.Predicate.Between)element).Expr3);
+						break;
+					}
+
+				case QueryElementType.IsNullPredicate:
+					{
+						Visit1(((SqlQuery.Predicate.IsNull)element).Expr1);
+						break;
+					}
+
+				case QueryElementType.InSubQueryPredicate:
+					{
+						//var p = (SqlQuery.Predicate.InSubQuery)element;
+						Visit1(((SqlQuery.Predicate.InSubQuery)element).Expr1);
+						Visit1(((SqlQuery.Predicate.InSubQuery)element).SubQuery);
+						break;
+					}
+
+				case QueryElementType.InListPredicate:
+					{
+						//var p = (SqlQuery.Predicate.InList)element;
+						Visit1(((SqlQuery.Predicate.InList)element).Expr1);
+						foreach (var value in ((SqlQuery.Predicate.InList)element).Values) Visit1(value);
+						break;
+					}
+
+				case QueryElementType.FuncLikePredicate:
+					{
+						Visit1(((SqlQuery.Predicate.FuncLike)element).Function);
+						break;
+					}
+
+				case QueryElementType.SetExpression:
+					{
+						//var s = (SqlQuery.SetExpression)element;
+						Visit1(((SqlQuery.SetExpression)element).Column);
+						Visit1(((SqlQuery.SetExpression)element).Expression);
+						break;
+					}
+
+				case QueryElementType.InsertClause:
+					{
+						//var sc = (SqlQuery.InsertClause)element;
+
+						if (((SqlQuery.InsertClause)element).Into != null)
+							Visit1(((SqlQuery.InsertClause)element).Into);
+
+						foreach (var c in ((SqlQuery.InsertClause)element).Items.ToArray()) Visit1(c);
+						break;
+					}
+
+				case QueryElementType.UpdateClause:
+					{
+						//var sc = (SqlQuery.UpdateClause)element;
+
+						if (((SqlQuery.UpdateClause)element).Table != null)
+							Visit1(((SqlQuery.UpdateClause)element).Table);
+
+						foreach (var c in ((SqlQuery.UpdateClause)element).Items.ToArray()) Visit1(c);
+						foreach (var c in ((SqlQuery.UpdateClause)element).Keys. ToArray()) Visit1(c);
+						break;
+					}
+
+				case QueryElementType.DeleteClause:
+					{
+						if (((SqlQuery.DeleteClause)element).Table != null)
+							Visit1(((SqlQuery.DeleteClause)element).Table);
+						break;
+					}
+
+				case QueryElementType.SelectClause:
+					{
+						//var sc = (SqlQuery.SelectClause)element;
+						Visit1(((SqlQuery.SelectClause)element).TakeValue);
+						Visit1(((SqlQuery.SelectClause)element).SkipValue);
+
+						foreach (var c in ((SqlQuery.SelectClause)element).Columns.ToArray()) Visit1(c);
+						break;
+					}
+
+				case QueryElementType.FromClause:
+					{
+						foreach (var t in ((SqlQuery.FromClause)element).Tables) Visit1(t);
+						break;
+					}
+
+				case QueryElementType.WhereClause:
+					{
+						Visit1(((SqlQuery.WhereClause)element).SearchCondition);
+						break;
+					}
+
+				case QueryElementType.GroupByClause:
+					{
+						foreach (var i in ((SqlQuery.GroupByClause)element).Items) Visit1(i);
+						break;
+					}
+
+				case QueryElementType.OrderByClause:
+					{
+						foreach (var i in ((SqlQuery.OrderByClause)element).Items) Visit1(i);
+						break;
+					}
+
+				case QueryElementType.OrderByItem:
+					{
+						Visit1(((SqlQuery.OrderByItem)element).Expression);
+						break;
+					}
+
+				case QueryElementType.Union:
+					Visit1(((SqlQuery.Union)element).SqlQuery);
+					break;
+
+				case QueryElementType.SqlQuery:
+					{
+						if (_all)
+						{
+							if (_visitedElements.ContainsKey(element))
+								return;
+							_visitedElements.Add(element, element);
+						}
+
+						var q = (SqlQuery)element;
+
+						switch (q.QueryType)
+						{
+							case QueryType.InsertOrUpdate :
+								Visit1(q.Insert);
+								Visit1(q.Update);
+
+								if (q.From.Tables.Count == 0)
+									break;
+
+								goto default;
+
+							case QueryType.Update :
+								Visit1(q.Update);
+								break;
+
+							case QueryType.Delete :
+								Visit1(q.Delete);
+								Visit1(q.Select);
+								break;
+
+							case QueryType.Insert :
+								Visit1(q.Insert);
+
+								if (q.From.Tables.Count != 0)
+									Visit1(q.Select);
+
+								break;
+
+							default :
+								Visit1(q.Select);
+								break;
+						}
+
+						Visit1(q.From);
+						Visit1(q.Where);
+						Visit1(q.GroupBy);
+						Visit1(q.Having);
+						Visit1(q.OrderBy);
+
+						if (q.HasUnion)
+						{
+							foreach (var i in q.Unions)
+							{
+								if (i.SqlQuery == q)
+									throw new InvalidOperationException();
+
+								Visit1(i);
+							}
+						}
+
+						break;
+					}
+			}
+		}
+
+		public void Visit(IQueryElement element, Action<IQueryElement> action)
+		{
+			_visitedElements.Clear();
+			_all         = false;
+			_action2     = action;
+			Visit2(element);
+		}
+
+		public void VisitAll(IQueryElement element, Action<IQueryElement> action)
+		{
+			_visitedElements.Clear();
+			_all         = true;
+			_action2     = action;
+			Visit2(element);
+		}
+
+		void Visit2(IQueryElement element)
+		{
+			if (element == null || !_all && _visitedElements.ContainsKey(element))
+				return;
+
+			switch (element.ElementType)
+			{
+				case QueryElementType.SqlFunction:
+					{
+						foreach (var p in ((SqlFunction)element).Parameters) Visit2(p);
+						break;
+					}
+
+				case QueryElementType.SqlExpression:
+					{
+						foreach (var v in ((SqlExpression)element).Parameters) Visit2(v);
+						break;
+					}
+
+				case QueryElementType.SqlBinaryExpression:
+					{
+						//var bexpr = (SqlBinaryExpression)element;
+						Visit2(((SqlBinaryExpression)element).Expr1);
+						Visit2(((SqlBinaryExpression)element).Expr2);
+						break;
+					}
+
+				case QueryElementType.SqlTable:
+					{
+						var table = (SqlTable)element;
+
+						Visit2(table.All);
+						foreach (var field in table.Fields.Values) Visit2(field);
+						foreach (var join  in table.Joins)         Visit2(join);
+
+						if (table.TableArguments != null)
+							foreach (var a in table.TableArguments) Visit2(a);
+
+						break;
+					}
+
+				case QueryElementType.Join:
+					{
+						foreach (var j in ((Join)element).JoinOns) Visit2(j);
+						break;
+					}
+
+				case QueryElementType.Column:
+					{
+						Visit2(((SqlQuery.Column)element).Expression);
+						break;
+					}
+
+				case QueryElementType.TableSource:
+					{
+						//var table = ((SqlQuery.TableSource)element);
+
+						Visit2(((SqlQuery.TableSource)element).Source);
+						foreach (var j in ((SqlQuery.TableSource)element).Joins) Visit2(j);
+						break;
+					}
+
+				case QueryElementType.JoinedTable:
+					{
+						//var join = (SqlQuery.JoinedTable)element;
+						Visit2(((SqlQuery.JoinedTable)element).Table);
+						Visit2(((SqlQuery.JoinedTable)element).Condition);
+						break;
+					}
+
+				case QueryElementType.SearchCondition:
+					{
+						foreach (var c in ((SqlQuery.SearchCondition)element).Conditions) Visit2(c);
+						break;
+					}
+
+				case QueryElementType.Condition:
+					{
+						Visit2(((SqlQuery.Condition)element).Predicate);
+						break;
+					}
+
+				case QueryElementType.ExprPredicate:
+					{
+						Visit2(((SqlQuery.Predicate.Expr)element).Expr1);
+						break;
+					}
+
+				case QueryElementType.NotExprPredicate:
+					{
+						Visit2(((SqlQuery.Predicate.NotExpr)element).Expr1);
+						break;
+					}
+
+				case QueryElementType.ExprExprPredicate:
+					{
+						//var p = ((SqlQuery.Predicate.ExprExpr)element);
+						Visit2(((SqlQuery.Predicate.ExprExpr)element).Expr1);
+						Visit2(((SqlQuery.Predicate.ExprExpr)element).Expr2);
+						break;
+					}
+
+				case QueryElementType.LikePredicate:
+					{
+						//var p = ((SqlQuery.Predicate.Like)element);
+						Visit2(((SqlQuery.Predicate.Like)element).Expr1);
+						Visit2(((SqlQuery.Predicate.Like)element).Expr2);
+						Visit2(((SqlQuery.Predicate.Like)element).Escape);
+						break;
+					}
+
+				case QueryElementType.BetweenPredicate:
+					{
+						//var p = (SqlQuery.Predicate.Between)element;
+						Visit2(((SqlQuery.Predicate.Between)element).Expr1);
+						Visit2(((SqlQuery.Predicate.Between)element).Expr2);
+						Visit2(((SqlQuery.Predicate.Between)element).Expr3);
+						break;
+					}
+
+				case QueryElementType.IsNullPredicate:
+					{
+						Visit2(((SqlQuery.Predicate.IsNull)element).Expr1);
+						break;
+					}
+
+				case QueryElementType.InSubQueryPredicate:
+					{
+						//var p = (SqlQuery.Predicate.InSubQuery)element;
+						Visit2(((SqlQuery.Predicate.InSubQuery)element).Expr1);
+						Visit2(((SqlQuery.Predicate.InSubQuery)element).SubQuery);
+						break;
+					}
+
+				case QueryElementType.InListPredicate:
+					{
+						//var p = (SqlQuery.Predicate.InList)element;
+						Visit2(((SqlQuery.Predicate.InList)element).Expr1);
+						foreach (var value in ((SqlQuery.Predicate.InList)element).Values) Visit2(value);
+						break;
+					}
+
+				case QueryElementType.FuncLikePredicate:
+					{
+						Visit2(((SqlQuery.Predicate.FuncLike)element).Function);
+						break;
+					}
+
+				case QueryElementType.SetExpression:
+					{
+						//var s = (SqlQuery.SetExpression)element;
+						Visit2(((SqlQuery.SetExpression)element).Column);
+						Visit2(((SqlQuery.SetExpression)element).Expression);
+						break;
+					}
+
+				case QueryElementType.InsertClause:
+					{
+						//var sc = (SqlQuery.InsertClause)element;
+
+						if (((SqlQuery.InsertClause)element).Into != null)
+							Visit2(((SqlQuery.InsertClause)element).Into);
+
+						foreach (var c in ((SqlQuery.InsertClause)element).Items.ToArray()) Visit2(c);
+						break;
+					}
+
+				case QueryElementType.UpdateClause:
+					{
+						//var sc = (SqlQuery.UpdateClause)element;
+
+						if (((SqlQuery.UpdateClause)element).Table != null)
+							Visit2(((SqlQuery.UpdateClause)element).Table);
+
+						foreach (var c in ((SqlQuery.UpdateClause)element).Items.ToArray()) Visit2(c);
+						foreach (var c in ((SqlQuery.UpdateClause)element).Keys. ToArray()) Visit2(c);
+						break;
+					}
+
+				case QueryElementType.DeleteClause:
+					{
+						if (((SqlQuery.DeleteClause)element).Table != null)
+							Visit2(((SqlQuery.DeleteClause)element).Table);
+						break;
+					}
+
+				case QueryElementType.SelectClause:
+					{
+						//var sc = (SqlQuery.SelectClause)element;
+						Visit2(((SqlQuery.SelectClause)element).TakeValue);
+						Visit2(((SqlQuery.SelectClause)element).SkipValue);
+
+						foreach (var c in ((SqlQuery.SelectClause)element).Columns.ToArray()) Visit2(c);
+						break;
+					}
+
+				case QueryElementType.FromClause:
+					{
+						foreach (var t in ((SqlQuery.FromClause)element).Tables) Visit2(t);
+						break;
+					}
+
+				case QueryElementType.WhereClause:
+					{
+						Visit2(((SqlQuery.WhereClause)element).SearchCondition);
+						break;
+					}
+
+				case QueryElementType.GroupByClause:
+					{
+						foreach (var i in ((SqlQuery.GroupByClause)element).Items) Visit2(i);
+						break;
+					}
+
+				case QueryElementType.OrderByClause:
+					{
+						foreach (var i in ((SqlQuery.OrderByClause)element).Items) Visit2(i);
+						break;
+					}
+
+				case QueryElementType.OrderByItem:
+					{
+						Visit2(((SqlQuery.OrderByItem)element).Expression);
+						break;
+					}
+
+				case QueryElementType.Union:
+					Visit2(((SqlQuery.Union)element).SqlQuery);
+					break;
+
+				case QueryElementType.SqlQuery:
+					{
+						if (_all)
+						{
+							if (_visitedElements.ContainsKey(element))
+								return;
+							_visitedElements.Add(element, element);
+						}
+
+						var q = (SqlQuery)element;
+
+						switch (q.QueryType)
+						{
+							case QueryType.InsertOrUpdate :
+								Visit2(q.Insert);
+								Visit2(q.Update);
+
+								if (q.From.Tables.Count == 0)
+									break;
+
+								goto default;
+
+							case QueryType.Update :
+								Visit2(q.Update);
+								break;
+
+							case QueryType.Delete :
+								Visit2(q.Delete);
+								Visit2(q.Select);
+								break;
+
+							case QueryType.Insert :
+								Visit2(q.Insert);
+
+								if (q.From.Tables.Count != 0)
+									Visit2(q.Select);
+
+								break;
+
+							default :
+								Visit2(q.Select);
+								break;
+						}
+
+						// Visit2(q.From);
+						//
+						if (q.From != null && (_all || !_visitedElements.ContainsKey(q.From)))
+						{
+							foreach (var t in q.From.Tables)
+							{
+								//Visit2(t);
+								//
+								if (t != null && (_all || !_visitedElements.ContainsKey(t)))
+								{
+									Visit2(t.Source);
+
+									foreach (var j in t.Joins)
+										Visit2(j);
+
+									_action2(t);
+									if (!_all)
+										_visitedElements.Add(t, t);
+								}
+							}
+							_action2(q.From);
+							if (!_all)
+								_visitedElements.Add(q.From, q.From);
+						}
+
+						Visit2(q.Where);
+						Visit2(q.GroupBy);
+						Visit2(q.Having);
+						Visit2(q.OrderBy);
+
+						if (q.HasUnion)
+						{
+							foreach (var i in q.Unions)
+							{
+								if (i.SqlQuery == q)
+									throw new InvalidOperationException();
+
+								Visit2(i);
+							}
+						}
+
+						break;
+					}
+			}
+
+			_action2(element);
+			if (!_all)
+				_visitedElements.Add(element, element);
+		}
+
+		#endregion
+
+		#region Find
+
+		IQueryElement Find<T>(IEnumerable<T> arr, FindFunc find)
+			where T : class, IQueryElement
+		{
+			if (arr == null)
+				return null;
+
+			foreach (var item in arr)
+			{
+				var e = Find(item, find);
+				if (e != null)
+					return e;
+			}
+
+			return null;
+		}
+
+		public IQueryElement Find(IQueryElement element, FindFunc find)
+		{
+			if (element == null || find(element))
+				return element;
+
+			switch (element.ElementType)
+			{
+				case QueryElementType.SqlFunction       : return Find(((SqlFunction)                element).Parameters,      find);
+				case QueryElementType.SqlExpression     : return Find(((SqlExpression)              element).Parameters,      find);
+				case QueryElementType.Join              : return Find(((Join)                       element).JoinOns,         find);
+				case QueryElementType.Column            : return Find(((SqlQuery.Column)            element).Expression,      find);
+				case QueryElementType.SearchCondition   : return Find(((SqlQuery.SearchCondition)   element).Conditions,      find);
+				case QueryElementType.Condition         : return Find(((SqlQuery.Condition)         element).Predicate,       find);
+				case QueryElementType.ExprPredicate     : return Find(((SqlQuery.Predicate.Expr)    element).Expr1,           find);
+				case QueryElementType.NotExprPredicate  : return Find(((SqlQuery.Predicate.NotExpr) element).Expr1,           find);
+				case QueryElementType.IsNullPredicate   : return Find(((SqlQuery.Predicate.IsNull)  element).Expr1,           find);
+				case QueryElementType.FromClause        : return Find(((SqlQuery.FromClause)        element).Tables,          find);
+				case QueryElementType.WhereClause       : return Find(((SqlQuery.WhereClause)       element).SearchCondition, find);
+				case QueryElementType.GroupByClause     : return Find(((SqlQuery.GroupByClause)     element).Items,           find);
+				case QueryElementType.OrderByClause     : return Find(((SqlQuery.OrderByClause)     element).Items,           find);
+				case QueryElementType.OrderByItem       : return Find(((SqlQuery.OrderByItem)       element).Expression,      find);
+				case QueryElementType.Union             : return Find(((SqlQuery.Union)             element).SqlQuery,        find);
+				case QueryElementType.FuncLikePredicate : return Find(((SqlQuery.Predicate.FuncLike)element).Function,        find);
+
+				case QueryElementType.SqlBinaryExpression:
+					{
+						var bexpr = (SqlBinaryExpression)element;
+						return
+							Find(bexpr.Expr1, find) ??
+							Find(bexpr.Expr2, find);
+					}
+
+				case QueryElementType.SqlTable:
+					{
+						var table = (SqlTable)element;
+						return
+							Find(table.All,            find) ??
+							Find(table.Fields.Values,  find) ??
+							Find(table.Joins,          find) ??
+							Find(table.TableArguments, find);
+					}
+
+				case QueryElementType.TableSource:
+					{
+						var table = (SqlQuery.TableSource)element;
+						return
+							Find(table.Source, find) ??
+							Find(table.Joins,  find);
+					}
+
+				case QueryElementType.JoinedTable:
+					{
+						var join = (SqlQuery.JoinedTable)element;
+						return
+							Find(join.Table,     find) ??
+							Find(join.Condition, find);
+					}
+
+				case QueryElementType.ExprExprPredicate:
+					{
+						var p = (SqlQuery.Predicate.ExprExpr)element;
+						return
+							Find(p.Expr1, find) ??
+							Find(p.Expr2, find);
+					}
+
+				case QueryElementType.LikePredicate:
+					{
+						var p = (SqlQuery.Predicate.Like)element;
+						return
+							Find(p.Expr1,  find) ??
+							Find(p.Expr2,  find) ??
+							Find(p.Escape, find);
+					}
+
+				case QueryElementType.BetweenPredicate:
+					{
+						var p = (SqlQuery.Predicate.Between)element;
+						return
+							Find(p.Expr1, find) ??
+							Find(p.Expr2, find) ??
+							Find(p.Expr3, find);
+					}
+
+				case QueryElementType.InSubQueryPredicate:
+					{
+						var p = (SqlQuery.Predicate.InSubQuery)element;
+						return
+							Find(p.Expr1,    find) ??
+							Find(p.SubQuery, find);
+					}
+
+				case QueryElementType.InListPredicate:
+					{
+						var p = (SqlQuery.Predicate.InList)element;
+						return
+							Find(p.Expr1,  find) ??
+							Find(p.Values, find);
+					}
+
+				case QueryElementType.SetExpression:
+					{
+						var s = (SqlQuery.SetExpression)element;
+						return
+							Find(s.Column,     find) ??
+							Find(s.Expression, find);
+					}
+
+				case QueryElementType.InsertClause:
+					{
+						var sc = (SqlQuery.InsertClause)element;
+						return
+							Find(sc.Into,  find) ??
+							Find(sc.Items, find);
+					}
+
+				case QueryElementType.UpdateClause:
+					{
+						var sc = (SqlQuery.UpdateClause)element;
+						return
+							Find(sc.Table, find) ??
+							Find(sc.Items, find) ??
+							Find(sc.Keys,  find);
+					}
+
+				case QueryElementType.DeleteClause:
+					{
+						var sc = (SqlQuery.DeleteClause)element;
+						return Find(sc.Table, find);
+					}
+
+				case QueryElementType.SelectClause:
+					{
+						var sc = (SqlQuery.SelectClause)element;
+						return
+							Find(sc.TakeValue, find) ??
+							Find(sc.SkipValue, find) ??
+							Find(sc.Columns,   find);
+					}
+
+				case QueryElementType.SqlQuery:
+					{
+						var q = (SqlQuery)element;
+						return
+							Find(q.Select,  find) ??
+							(q.IsInsert ? Find(q.Insert, find) : null) ??
+							(q.IsUpdate ? Find(q.Update, find) : null) ??
+							Find(q.From,    find) ??
+							Find(q.Where,   find) ??
+							Find(q.GroupBy, find) ??
+							Find(q.Having,  find) ??
+							Find(q.OrderBy, find) ??
+							(q.HasUnion ? Find(q.Unions, find) : null);
+					}
+			}
+
+			return null;
+		}
+
+		#endregion
+
+		#region Convert
+
+		public T Convert<T>(T element, ConvertFunc action)
+			where T : class, IQueryElement
+		{
+			_visitedElements.Clear();
+			return (T)ConvertInternal(element, action) ?? element;
+		}
+
+		IQueryElement ConvertInternal(IQueryElement element, ConvertFunc action)
+		{
+			if (element == null)
+				return null;
+
+			IQueryElement newElement;
+
+			if (_visitedElements.TryGetValue(element, out newElement))
+				return newElement;
+
+			switch (element.ElementType)
+			{
+				case QueryElementType.SqlFunction:
+					{
+						var func  = (SqlFunction)element;
+						var parms = Convert(func.Parameters, action);
+
+						if (parms != null && !ReferenceEquals(parms, func.Parameters))
+							newElement = new SqlFunction(func.SystemType, func.Name, func.Precedence, parms);
+
+						break;
+					}
+
+				case QueryElementType.SqlExpression:
+					{
+						var expr      = (SqlExpression)element;
+						var parameter = Convert(expr.Parameters, action);
+
+						if (parameter != null && !ReferenceEquals(parameter, expr.Parameters))
+							newElement = new SqlExpression(expr.SystemType, expr.Expr, expr.Precedence, parameter);
+
+						break;
+					}
+
+				case QueryElementType.SqlBinaryExpression:
+					{
+						var bexpr = (SqlBinaryExpression)element;
+						var expr1 = (ISqlExpression)ConvertInternal(bexpr.Expr1, action);
+						var expr2 = (ISqlExpression)ConvertInternal(bexpr.Expr2, action);
+
+						if (expr1 != null && !ReferenceEquals(expr1, bexpr.Expr1) ||
+							expr2 != null && !ReferenceEquals(expr2, bexpr.Expr2))
+							newElement = new SqlBinaryExpression(bexpr.SystemType, expr1 ?? bexpr.Expr1, bexpr.Operation, expr2 ?? bexpr.Expr2, bexpr.Precedence);
+
+						break;
+					}
+
+				case QueryElementType.SqlTable:
+					{
+						var table   = (SqlTable)element;
+						var fields1 = ToArray(table.Fields);
+						var fields2 = Convert(fields1,     action, f => new SqlField(f));
+						var joins   = Convert(table.Joins, action, j => j.Clone());
+						var targs   = table.TableArguments == null ? null : Convert(table.TableArguments, action);
+
+						var fe = fields2 == null || ReferenceEquals(fields1,     fields2);
+						var je = joins   == null || ReferenceEquals(table.Joins, joins);
+						var ta = ReferenceEquals(table.TableArguments, targs);
+
+						if (!fe || !je || !ta)
+						{
+							if (fe)
+							{
+								fields2 = fields1;
+
+								for (var i = 0; i < fields2.Length; i++)
+								{
+									var field = fields2[i];
+
+									fields2[i] = new SqlField(field);
+
+									_visitedElements[field] = fields2[i];
+								}
+							}
+
+							newElement = new SqlTable(table, fields2, joins ?? table.Joins, targs ?? table.TableArguments);
+
+							_visitedElements[((SqlTable)newElement).All] = table.All;
+						}
+
+						break;
+					}
+
+				case QueryElementType.Join:
+					{
+						var join = (Join)element;
+						var ons  = Convert(join.JoinOns, action);
+
+						if (ons != null && !ReferenceEquals(join.JoinOns, ons))
+							newElement = new Join(join.TableName, join.Alias, ons);
+
+						break;
+					}
+
+				case QueryElementType.Column:
+					{
+						var col  = (SqlQuery.Column)element;
+						var expr = (ISqlExpression)ConvertInternal(col.Expression, action);
+
+						IQueryElement parent;
+						_visitedElements.TryGetValue(col.Parent, out parent);
+
+						if (parent != null || expr != null && !ReferenceEquals(expr, col.Expression))
+							newElement = new SqlQuery.Column(parent == null ? col.Parent : (SqlQuery)parent, expr ?? col.Expression, col._alias);
+
+						break;
+					}
+
+				case QueryElementType.TableSource:
+					{
+						var table  = (SqlQuery.TableSource)element;
+						var source = (ISqlTableSource)ConvertInternal(table.Source, action);
+						var joins  = Convert(table.Joins, action);
+
+						if (source != null && !ReferenceEquals(source, table.Source) ||
+							joins  != null && !ReferenceEquals(table.Joins, joins))
+							newElement = new SqlQuery.TableSource(source ?? table.Source, table._alias, joins ?? table.Joins);
+
+						break;
+					}
+
+				case QueryElementType.JoinedTable:
+					{
+						var join  = (SqlQuery.JoinedTable)element;
+						var table = (SqlQuery.TableSource)    ConvertInternal(join.Table,     action);
+						var cond  = (SqlQuery.SearchCondition)ConvertInternal(join.Condition, action);
+
+						if (table != null && !ReferenceEquals(table, join.Table) ||
+							cond  != null && !ReferenceEquals(cond,  join.Condition))
+							newElement = new SqlQuery.JoinedTable(join.JoinType, table ?? join.Table, join.IsWeak, cond ?? join.Condition);
+
+						break;
+					}
+
+				case QueryElementType.SearchCondition:
+					{
+						var sc    = (SqlQuery.SearchCondition)element;
+						var conds = Convert(sc.Conditions, action);
+
+						if (conds != null && !ReferenceEquals(sc.Conditions, conds))
+							newElement = new SqlQuery.SearchCondition(conds);
+
+						break;
+					}
+
+				case QueryElementType.Condition:
+					{
+						var c = (SqlQuery.Condition)element;
+						var p = (ISqlPredicate)ConvertInternal(c.Predicate, action);
+
+						if (p != null && !ReferenceEquals(c.Predicate, p))
+							newElement = new SqlQuery.Condition(c.IsNot, p, c.IsOr);
+
+						break;
+					}
+
+				case QueryElementType.ExprPredicate:
+					{
+						var p = (SqlQuery.Predicate.Expr)element;
+						var e = (ISqlExpression)ConvertInternal(p.Expr1, action);
+
+						if (e != null && !ReferenceEquals(p.Expr1, e))
+							newElement = new SqlQuery.Predicate.Expr(e, p.Precedence);
+
+						break;
+					}
+
+				case QueryElementType.NotExprPredicate:
+					{
+						var p = (SqlQuery.Predicate.NotExpr)element;
+						var e = (ISqlExpression)ConvertInternal(p.Expr1, action);
+
+						if (e != null && !ReferenceEquals(p.Expr1, e))
+							newElement = new SqlQuery.Predicate.NotExpr(e, p.IsNot, p.Precedence);
+
+						break;
+					}
+
+				case QueryElementType.ExprExprPredicate:
+					{
+						var p  = (SqlQuery.Predicate.ExprExpr)element;
+						var e1 = (ISqlExpression)ConvertInternal(p.Expr1, action);
+						var e2 = (ISqlExpression)ConvertInternal(p.Expr2, action);
+
+						if (e1 != null && !ReferenceEquals(p.Expr1, e1) || e2 != null && !ReferenceEquals(p.Expr2, e2))
+							newElement = new SqlQuery.Predicate.ExprExpr(e1 ?? p.Expr1, p.Operator, e2 ?? p.Expr2);
+
+						break;
+					}
+
+				case QueryElementType.LikePredicate:
+					{
+						var p  = (SqlQuery.Predicate.Like)element;
+						var e1 = (ISqlExpression)ConvertInternal(p.Expr1,  action);
+						var e2 = (ISqlExpression)ConvertInternal(p.Expr2,  action);
+						var es = (ISqlExpression)ConvertInternal(p.Escape, action);
+
+						if (e1 != null && !ReferenceEquals(p.Expr1, e1) ||
+							e2 != null && !ReferenceEquals(p.Expr2, e2) ||
+							es != null && !ReferenceEquals(p.Escape, es))
+							newElement = new SqlQuery.Predicate.Like(e1 ?? p.Expr1, p.IsNot, e2 ?? p.Expr2, es ?? p.Escape);
+
+						break;
+					}
+
+				case QueryElementType.BetweenPredicate:
+					{
+						var p = (SqlQuery.Predicate.Between)element;
+						var e1 = (ISqlExpression)ConvertInternal(p.Expr1, action);
+						var e2 = (ISqlExpression)ConvertInternal(p.Expr2, action);
+						var e3 = (ISqlExpression)ConvertInternal(p.Expr3, action);
+
+						if (e1 != null && !ReferenceEquals(p.Expr1, e1) ||
+							e2 != null && !ReferenceEquals(p.Expr2, e2) ||
+							e3 != null && !ReferenceEquals(p.Expr3, e3))
+							newElement = new SqlQuery.Predicate.Between(e1 ?? p.Expr1, p.IsNot, e2 ?? p.Expr2, e3 ?? p.Expr3);
+
+						break;
+					}
+
+				case QueryElementType.IsNullPredicate:
+					{
+						var p = (SqlQuery.Predicate.IsNull)element;
+						var e = (ISqlExpression)ConvertInternal(p.Expr1, action);
+
+						if (e != null && !ReferenceEquals(p.Expr1, e))
+							newElement = new SqlQuery.Predicate.IsNull(e, p.IsNot);
+
+						break;
+					}
+
+				case QueryElementType.InSubQueryPredicate:
+					{
+						var p = (SqlQuery.Predicate.InSubQuery)element;
+						var e = (ISqlExpression)ConvertInternal(p.Expr1,    action);
+						var q = (SqlQuery)ConvertInternal(p.SubQuery, action);
+
+						if (e != null && !ReferenceEquals(p.Expr1, e) || q != null && !ReferenceEquals(p.SubQuery, q))
+							newElement = new SqlQuery.Predicate.InSubQuery(e ?? p.Expr1, p.IsNot, q ?? p.SubQuery);
+
+						break;
+					}
+
+				case QueryElementType.InListPredicate:
+					{
+						var p = (SqlQuery.Predicate.InList)element;
+						var e = (ISqlExpression)ConvertInternal(p.Expr1,    action);
+						var v = Convert(p.Values, action);
+
+						if (e != null && !ReferenceEquals(p.Expr1, e) || v != null && !ReferenceEquals(p.Values, v))
+							newElement = new SqlQuery.Predicate.InList(e ?? p.Expr1, p.IsNot, v ?? p.Values);
+
+						break;
+					}
+
+				case QueryElementType.FuncLikePredicate:
+					{
+						var p = (SqlQuery.Predicate.FuncLike)element;
+						var f = (SqlFunction)ConvertInternal(p.Function, action);
+
+						if (f != null && !ReferenceEquals(p.Function, f))
+							newElement = new SqlQuery.Predicate.FuncLike(f);
+
+						break;
+					}
+
+				case QueryElementType.SetExpression:
+					{
+						var s = (SqlQuery.SetExpression)element;
+						var c = (ISqlExpression)ConvertInternal(s.Column,     action);
+						var e = (ISqlExpression)ConvertInternal(s.Expression, action);
+
+						if (c != null && !ReferenceEquals(s.Column, c) || e != null && !ReferenceEquals(s.Expression, e))
+							newElement = new SqlQuery.SetExpression(c ?? s.Column, e ?? s.Expression);
+
+						break;
+					}
+
+				case QueryElementType.InsertClause:
+					{
+						var s = (SqlQuery.InsertClause)element;
+						var t = s.Into != null ? (SqlTable)ConvertInternal(s.Into, action) : null;
+						var i = Convert(s.Items, action);
+
+						if (t != null && !ReferenceEquals(s.Into, t) || i != null && !ReferenceEquals(s.Items, i))
+						{
+							var sc = new SqlQuery.InsertClause { Into = t ?? s.Into };
+
+							sc.Items.AddRange(i ?? s.Items);
+							sc.WithIdentity = s.WithIdentity;
+
+							newElement = sc;
+						}
+
+						break;
+					}
+
+				case QueryElementType.UpdateClause:
+					{
+						var s = (SqlQuery.UpdateClause)element;
+						var t = s.Table != null ? (SqlTable)ConvertInternal(s.Table, action) : null;
+						var i = Convert(s.Items, action);
+						var k = Convert(s.Keys,  action);
+
+						if (t != null && !ReferenceEquals(s.Table, t) ||
+							i != null && !ReferenceEquals(s.Items, i) ||
+							k != null && !ReferenceEquals(s.Keys,  k))
+						{
+							var sc = new SqlQuery.UpdateClause { Table = t ?? s.Table };
+
+							sc.Items.AddRange(i ?? s.Items);
+							sc.Keys. AddRange(k ?? s.Keys);
+
+							newElement = sc;
+						}
+
+						break;
+					}
+
+				case QueryElementType.DeleteClause:
+					{
+						var s = (SqlQuery.DeleteClause)element;
+						var t = s.Table != null ? (SqlTable)ConvertInternal(s.Table, action) : null;
+
+						if (t != null && !ReferenceEquals(s.Table, t))
+						{
+							newElement = new SqlQuery.DeleteClause { Table = t ?? s.Table };
+						}
+
+						break;
+					}
+
+				case QueryElementType.SelectClause:
+					{
+						var sc   = (SqlQuery.SelectClause)element;
+						var cols = Convert(sc.Columns, action);
+						var take = (ISqlExpression)ConvertInternal(sc.TakeValue, action);
+						var skip = (ISqlExpression)ConvertInternal(sc.SkipValue, action);
+
+						IQueryElement parent;
+						_visitedElements.TryGetValue(sc.SqlQuery, out parent);
+
+						if (parent != null ||
+							cols != null && !ReferenceEquals(sc.Columns,   cols) ||
+							take != null && !ReferenceEquals(sc.TakeValue, take) ||
+							skip != null && !ReferenceEquals(sc.SkipValue, skip))
+						{
+							newElement = new SqlQuery.SelectClause(sc.IsDistinct, take ?? sc.TakeValue, skip ?? sc.SkipValue, cols ?? sc.Columns);
+							((SqlQuery.SelectClause)newElement).SetSqlQuery((SqlQuery)parent);
+						}
+
+						break;
+					}
+
+				case QueryElementType.FromClause:
+					{
+						var fc   = (SqlQuery.FromClause)element;
+						var ts = Convert(fc.Tables, action);
+
+						IQueryElement parent;
+						_visitedElements.TryGetValue(fc.SqlQuery, out parent);
+
+						if (parent != null || ts != null && !ReferenceEquals(fc.Tables, ts))
+						{
+							newElement = new SqlQuery.FromClause(ts ?? fc.Tables);
+							((SqlQuery.FromClause)newElement).SetSqlQuery((SqlQuery)parent);
+						}
+
+						break;
+					}
+
+				case QueryElementType.WhereClause:
+					{
+						var wc   = (SqlQuery.WhereClause)element;
+						var cond = (SqlQuery.SearchCondition)ConvertInternal(wc.SearchCondition, action);
+
+						IQueryElement parent;
+						_visitedElements.TryGetValue(wc.SqlQuery, out parent);
+
+						if (parent != null || cond != null && !ReferenceEquals(wc.SearchCondition, cond))
+						{
+							newElement = new SqlQuery.WhereClause(cond ?? wc.SearchCondition);
+							((SqlQuery.WhereClause)newElement).SetSqlQuery((SqlQuery)parent);
+						}
+
+						break;
+					}
+
+				case QueryElementType.GroupByClause:
+					{
+						var gc = (SqlQuery.GroupByClause)element;
+						var es = Convert(gc.Items, action);
+
+						IQueryElement parent;
+						_visitedElements.TryGetValue(gc.SqlQuery, out parent);
+
+						if (parent != null || es != null && !ReferenceEquals(gc.Items, es))
+						{
+							newElement = new SqlQuery.GroupByClause(es ?? gc.Items);
+							((SqlQuery.GroupByClause)newElement).SetSqlQuery((SqlQuery)parent);
+						}
+
+						break;
+					}
+
+				case QueryElementType.OrderByClause:
+					{
+						var oc = (SqlQuery.OrderByClause)element;
+						var es = Convert(oc.Items, action);
+
+						IQueryElement parent;
+						_visitedElements.TryGetValue(oc.SqlQuery, out parent);
+
+						if (parent != null || es != null && !ReferenceEquals(oc.Items, es))
+						{
+							newElement = new SqlQuery.OrderByClause(es ?? oc.Items);
+							((SqlQuery.OrderByClause)newElement).SetSqlQuery((SqlQuery)parent);
+						}
+
+						break;
+					}
+
+				case QueryElementType.OrderByItem:
+					{
+						var i = (SqlQuery.OrderByItem)element;
+						var e = (ISqlExpression)ConvertInternal(i.Expression, action);
+
+						if (e != null && !ReferenceEquals(i.Expression, e))
+							newElement = new SqlQuery.OrderByItem(e, i.IsDescending);
+
+						break;
+					}
+
+				case QueryElementType.Union:
+					{
+						var u = (SqlQuery.Union)element;
+						var q = (SqlQuery)ConvertInternal(u.SqlQuery, action);
+
+						if (q != null && !ReferenceEquals(u.SqlQuery, q))
+							newElement = new SqlQuery.Union(q, u.IsAll);
+
+						break;
+					}
+
+				case QueryElementType.SqlQuery:
+					{
+						var q = (SqlQuery)element;
+						IQueryElement parent = null;
+
+						var doConvert = q.ParentSql != null && !_visitedElements.TryGetValue(q.ParentSql, out parent);
+
+						if (!doConvert)
+						{
+							doConvert = null != Find(q, e =>
+							{
+								if (_visitedElements.ContainsKey(e) && _visitedElements[e] != e)
+									return true;
+
+								var ret = action(e);
+
+								if (ret != null && !ReferenceEquals(e, ret))
+								{
+									_visitedElements.Add(e, ret);
+									return true;
+								}
+
+								return false;
+							});
+						}
+
+						if (!doConvert)
+							break;
+
+						var nq = new SqlQuery { QueryType = q.QueryType };
+
+						_visitedElements.Add(q, nq);
+
+						var fc = (SqlQuery.FromClause)   ConvertInternal(q.From,    action) ?? q.From;
+						var sc = (SqlQuery.SelectClause) ConvertInternal(q.Select,  action) ?? q.Select;
+						var ic = q.IsInsert ? ((SqlQuery.InsertClause)ConvertInternal(q.Insert, action) ?? q.Insert) : null;
+						var uc = q.IsUpdate ? ((SqlQuery.UpdateClause)ConvertInternal(q.Update, action) ?? q.Update) : null;
+						var dc = q.IsDelete ? ((SqlQuery.DeleteClause)ConvertInternal(q.Delete, action) ?? q.Delete) : null;
+						var wc = (SqlQuery.WhereClause)  ConvertInternal(q.Where,   action) ?? q.Where;
+						var gc = (SqlQuery.GroupByClause)ConvertInternal(q.GroupBy, action) ?? q.GroupBy;
+						var hc = (SqlQuery.WhereClause)  ConvertInternal(q.Having,  action) ?? q.Having;
+						var oc = (SqlQuery.OrderByClause)ConvertInternal(q.OrderBy, action) ?? q.OrderBy;
+						var us = q.HasUnion ? Convert(q.Unions, action) : q.Unions;
+
+						var ps = new List<SqlParameter>(q.Parameters.Count);
+
+						foreach (var p in q.Parameters)
+						{
+							IQueryElement e;
+
+							if (_visitedElements.TryGetValue(p, out e))
+							{
+								if (e == null)
+									ps.Add(p);
+								else if (e is SqlParameter)
+									ps.Add((SqlParameter)e);
+							}
+						}
+
+						nq.Init(ic, uc, dc, sc, fc, wc, gc, hc, oc, us, (SqlQuery)parent, q.IsParameterDependent, ps);
+
+						_visitedElements[q] = action(nq) ?? nq;
+
+						return nq;
+					}
+			}
+
+			newElement = newElement == null ? action(element) : (action(newElement) ?? newElement);
+
+			_visitedElements.Add(element, newElement);
+
+			return newElement;
+		}
+
+		static TE[] ToArray<TK,TE>(IDictionary<TK,TE> dic)
+		{
+			var es = new TE[dic.Count];
+			var i  = 0;
+
+			foreach (var e in dic.Values)
+				es[i++] = e;
+
+			return es;
+		}
+
+		delegate T Clone<T>(T obj);
+
+		T[] Convert<T>(T[] arr, ConvertFunc action)
+			where T : class, IQueryElement
+		{
+			return Convert(arr, action, null);
+		}
+
+		T[] Convert<T>(T[] arr1, ConvertFunc action, Clone<T> clone)
+			where T : class, IQueryElement
+		{
+			T[] arr2 = null;
+
+			for (var i = 0; i < arr1.Length; i++)
+			{
+				var elem1 = arr1[i];
+				var elem2 = (T)ConvertInternal(elem1, action);
+
+				if (elem2 != null && !ReferenceEquals(elem1, elem2))
+				{
+					if (arr2 == null)
+					{
+						arr2 = new T[arr1.Length];
+
+						for (var j = 0; j < i; j++)
+							arr2[j] = clone == null ? arr1[j] : clone(arr1[j]);
+					}
+
+					arr2[i] = elem2;
+				}
+				else if (arr2 != null)
+					arr2[i] = clone == null ? elem1 : clone(elem1);
+			}
+
+			return arr2;
+		}
+
+		List<T> Convert<T>(List<T> list, ConvertFunc action)
+			where T : class, IQueryElement
+		{
+			return Convert(list, action, null);
+		}
+
+		List<T> Convert<T>(List<T> list1, ConvertFunc action, Clone<T> clone)
+			where T : class, IQueryElement
+		{
+			List<T> list2 = null;
+
+			for (var i = 0; i < list1.Count; i++)
+			{
+				var elem1 = list1[i];
+				var elem2 = (T)ConvertInternal(elem1, action);
+
+				if (elem2 != null && !ReferenceEquals(elem1, elem2))
+				{
+					if (list2 == null)
+					{
+						list2 = new List<T>(list1.Count);
+
+						for (var j = 0; j < i; j++)
+							list2.Add(clone == null ? list1[j] : clone(list1[j]));
+					}
+
+					list2.Add(elem2);
+				}
+				else if (list2 != null)
+					list2.Add(clone == null ? elem1 : clone(elem1));
+			}
+
+			return list2;
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/ReservedWords.txt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,529 @@
+ABORT
+ABSOLUTE
+ACCEPT
+ACCESS
+ACTION
+ADD
+ADMIN
+AFTER
+ALL
+ALLOCATE
+ALTER
+ANALYZE
+AND
+ANY
+ARCHIVE
+ARCHIVELOG
+ARE
+ARRAY
+ARRAYLEN
+AS
+ASC
+ASENSITIVE
+ASSERT
+ASSERTION
+ASSIGN
+ASYMMETRIC
+AT
+ATOMIC
+AUDIT
+AUTHORIZATION
+AVG
+BACKUP
+BASE_TABLE
+BECOME
+BEFORE
+BEGIN
+BETWEEN
+BIGINT
+BINARY
+BINARY_INTEGER
+BIT
+BIT_LENGTH
+BLOB
+BLOCK
+BODY
+BOOLEAN
+BOTH
+BREADTH
+BY
+CACHE
+CALL
+CALLED
+CANCEL
+CASCADE
+CASCADED
+CASE
+CAST
+CATALOG
+CHANGE
+CHAR
+CHAR_BASE
+CHAR_LENGTH
+CHARACTER
+CHARACTER_LENGTH
+CHECK
+CHECKPOINT
+CLOB
+CLOSE
+CLUSTER
+CLUSTERS
+COALESCE
+COBOL
+COLAUTH
+COLLATE
+COLLATION
+COLUMN
+COLUMNS
+COMMENT
+COMMIT
+COMPILE
+COMPRESS
+CONDITION
+CONNECT
+CONNECTION
+CONSTANT
+CONSTRAINT
+CONSTRAINTS
+CONSTRUCTOR
+CONTAINS
+CONTENTS
+CONTINUE
+CONTROLFILE
+CONVERT
+CORRESPONDING
+COUNT
+CRASH
+CREATE
+CROSS
+CUBE
+CURRENT
+CURRENT_DATE
+CURRENT_DEFAULT_TRANSFORM_GROUP
+CURRENT_PATH
+CURRENT_ROLE
+CURRENT_TIME
+CURRENT_TIMESTAMP
+CURRENT_TRANSFORM_GROUP_FOR_TYPE
+CURRENT_USER
+CURRVAL
+CURSOR
+CYCLE
+DATA
+DATA_BASE
+DATABASE
+DATAFILE
+DATE
+DAY
+DBA
+DEALLOCATE
+DEBUGOFF
+DEBUGON
+DEC
+DECIMAL
+DECLARE
+DEFAULT
+DEFERRABLE
+DEFERRED
+DEFINITION
+DELAY
+DELETE
+DELTA
+DEPTH
+DEREF
+DESC
+DESCRIBE
+DESCRIPTOR
+DETERMINISTIC
+DIAGNOSTICS
+DIGITS
+DISABLE
+DISCONNECT
+DISMOUNT
+DISPOSE
+DISTINCT
+DO
+DOMAIN
+DOUBLE
+DROP
+DUMP
+DYNAMIC
+EACH
+ELEMENT
+ELSE
+ELSEIF
+ELSIF
+ENABLE
+END
+ENTRY
+EQUALS
+ESCAPE
+EVENTS
+EXCEPT
+EXCEPTION
+EXCEPTION_INIT
+EXCEPTIONS
+EXCLUSIVE
+EXEC
+EXECUTE
+EXISTS
+EXIT
+EXPLAIN
+EXTENT
+EXTERNAL
+EXTERNALLY
+EXTRACT
+FALSE
+FETCH
+FILE
+FILTER
+FIRST
+FLOAT
+FLUSH
+FOR
+FORCE
+FOREIGN
+FORM
+FORTRAN
+FOUND
+FREE
+FREELIST
+FREELISTS
+FROM
+FULL
+FUNCTION
+GENERAL
+GENERIC
+GET
+GLOBAL
+GO
+GOTO
+GRANT
+GROUP
+GROUPING
+GROUPS
+HANDLER
+HAVING
+HOLD
+HOUR
+IDENTIFIED
+IDENTITY
+IDENTITY_PARAMETER
+IF
+IMMEDIATE
+IN
+INCLUDING
+INCREMEN
+INDEX
+INDEXES
+INDICATOR
+INITIAL
+INITIALLY
+INITRANS
+INNER
+INOUT
+INPUT
+INSENSITIVE
+INSERT
+INSTANCE
+INT
+INTEGER
+INTERSECT
+INTERVAL
+INTO
+IS
+ISOLATION
+ITERATE
+JOIN
+KEY
+LANGUAGE
+LARGE
+LAST
+LATERAL
+LAYER
+LEADING
+LEAVE
+LEFT
+LEVEL
+LIKE
+LIMITED
+LINK
+LISTS
+LOCAL
+LOCALTIME
+LOCALTIMESTAMP
+LOCATOR
+LOCK
+LOGFILE
+LONG
+LOOP
+LOWER
+MANAGE
+MANUAL
+MAP
+MATCH
+MAX
+MAXDATAFILES
+MAXEXTENTS
+MAXINSTANCES
+MAXLOGFILES
+MAXLOGHISTORY
+MAXLOGMEMBERS
+MAXTRANS
+MAXVALUE
+MEMBER
+MERGE
+METHOD
+MIN
+MINEXTENTS
+MINUS
+MINUTE
+MINVALUE
+MLSLABEL
+MOD
+MODE
+MODIFIES
+MODIFY
+MODULE
+MONTH
+MOUNT
+MULTISET
+NAMES
+NATIONAL
+NATURAL
+NCHAR
+NCLOB
+NEW
+NEXT
+NEXTVAL
+NO
+NOARCHIVELOG
+NOAUDIT
+NOCACHE
+NOCOMPRESS
+NOCYCLE
+NOMAXVALUE
+NOMINVALUE
+NONE
+NOORDER
+NORESETLOGS
+NORMAL
+NOSORT
+NOT
+NOTFOUND
+NOWAIT
+NULL
+NULLIF
+NUMBER
+NUMBER_BASE
+NUMERIC
+OBJECT
+OCTET_LENGTH
+OF
+OFF
+OFFLINE
+OLD
+ON
+ONLINE
+ONLY
+OPEN
+OPTIMAL
+OPTION
+OR
+ORDER
+ORDINALITY
+OTHERS
+OUT
+OUTER
+OUTPUT
+OVER
+OVERLAPS
+OWN
+PACKAGE
+PAD
+PARALLEL
+PARAMETER
+PARTIAL
+PARTITION
+PATH
+PCTFREE
+PCTINCREASE
+PCTUSED
+PLAN
+PLI
+POSITION
+POSITIVE
+PRAGMA
+PRECISION
+PREPARE
+PRESERVE
+PRIMARY
+PRIOR
+PRIVATE
+PRIVILEGES
+PROCEDURE
+PROFILE
+PUBLIC
+QUOTA
+RAISE
+RANGE
+RAW
+READ
+READS
+REAL
+RECORD
+RECOVER
+RECURSIVE
+REF
+REFERENCES
+REFERENCING
+RELATIVE
+RELEASE
+REMR
+RENAME
+REPEAT
+RESETLOGS
+RESIGNAL
+RESOURCE
+RESTRICT
+RESTRICTED
+RESULT
+RETURN
+RETURNS
+REUSE
+REVERSE
+REVOKE
+RIGHT
+ROLE
+ROLES
+ROLLBACK
+ROLLUP
+ROUTINE
+ROW
+ROWID
+ROWLABEL
+ROWNUM
+ROWS
+ROWTYPE
+RUN
+SAVEPOINT
+SCHEMA
+SCN
+SCOPE
+SCROLL
+SEARCH
+SECOND
+SECTION
+SEGMENT
+SELECT
+SENSITIVE
+SEPARATE
+SEQUENCE
+SESSION
+SESSION_USER
+SET
+SETS
+SHARE
+SHARED
+SIGNAL
+SIMILAR
+SIZE
+SMALLINT
+SNAPSHOT
+SOME
+SORT
+SPACE
+SPECIFIC
+SPECIFICTYPE
+SQL
+SQLBUF
+SQLCODE
+SQLERRM
+SQLERROR
+SQLEXCEPTION
+SQLSTATE
+SQLWARNING
+START
+STATE
+STATEMENT
+STATEMENT_ID
+STATIC
+STATISTICS
+STDDEV
+STOP
+STORAGE
+SUBMULTISET
+SUBSTRING
+SUBTYPE
+SUCCESSFUL
+SUM
+SWITCH
+SYMMETRIC
+SYNONYM
+SYSDATE
+SYSTEM
+SYSTEM_USER
+TABAUTH
+TABLE
+TABLES
+TABLESAMPLE
+TABLESPACE
+TASK
+TEMPORARY
+TERMINATE
+THEN
+THREAD
+TIME
+TIMESTAMP
+TIMEZONE_HOUR
+TIMEZONE_MINUTE
+TO
+TRACING
+TRAILING
+TRANSACTION
+TRANSLATE
+TRANSLATION
+TREAT
+TRIGGER
+TRIGGERS
+TRIM
+TRUE
+TRUNCATE
+TYPE
+UID
+UNDER
+UNDO
+UNION
+UNIQUE
+UNKNOWN
+UNLIMITED
+UNNEST
+UNTIL
+UPDATE
+UPPER
+USAGE
+USE
+USER
+USING
+VALIDATE
+VALUE
+VALUES
+VARCHAR
+VARCHAR2
+VARIANCE
+VARYING
+VIEW
+VIEWS
+WHEN
+WHENEVER
+WHERE
+WHILE
+WINDOW
+WITH
+WITHIN
+WITHOUT
+WORK
+WRITE
+XOR
+YEAR
+ZONE
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlBinaryExpression.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,139 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Text;
+
+namespace BLToolkit.Data.Sql
+{
+	[Serializable, DebuggerDisplay("SQL = {SqlText}")]
+	public class SqlBinaryExpression : ISqlExpression
+	{
+		public SqlBinaryExpression(Type systemType, ISqlExpression expr1, string operation, ISqlExpression expr2, int precedence)
+		{
+			if (expr1     == null) throw new ArgumentNullException("expr1");
+			if (operation == null) throw new ArgumentNullException("operation");
+			if (expr2     == null) throw new ArgumentNullException("expr2");
+
+			Expr1      = expr1;
+			Operation  = operation;
+			Expr2      = expr2;
+			SystemType = systemType;
+			Precedence = precedence;
+		}
+
+		public SqlBinaryExpression(Type systemType, ISqlExpression expr1, string operation, ISqlExpression expr2)
+			: this(systemType, expr1, operation, expr2, Sql.Precedence.Unknown)
+		{
+		}
+
+		public ISqlExpression Expr1      { get; internal set; }
+		public string         Operation  { get; private set;  }
+		public ISqlExpression Expr2      { get; internal set; }
+		public Type           SystemType { get; private set;  }
+
+		public int            Precedence { get; private set; }
+
+		#region Overrides
+
+		public string SqlText { get { return ToString(); } }
+
+#if OVERRIDETOSTRING
+
+		public override string ToString()
+		{
+			return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+		}
+
+#endif
+
+		#endregion
+
+		#region ISqlExpressionWalkable Members
+
+		[Obsolete]
+		ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+		{
+			Expr1 = Expr1.Walk(skipColumns, func);
+			Expr2 = Expr2.Walk(skipColumns, func);
+
+			return func(this);
+		}
+
+		#endregion
+
+		#region IEquatable<ISqlExpression> Members
+
+		bool IEquatable<ISqlExpression>.Equals(ISqlExpression other)
+		{
+			return Equals(other, SqlExpression.DefaultComparer);
+		}
+
+		#endregion
+
+		#region ISqlExpression Members
+
+		public bool CanBeNull()
+		{
+			return Expr1.CanBeNull() || Expr2.CanBeNull();
+		}
+
+		public bool Equals(ISqlExpression other, Func<ISqlExpression,ISqlExpression,bool> comparer)
+		{
+			if (this == other)
+				return true;
+
+			var expr = other as SqlBinaryExpression;
+
+			return
+				expr        != null                &&
+				Operation  == expr.Operation       &&
+				SystemType == expr.SystemType      &&
+				Expr1.Equals(expr.Expr1, comparer) &&
+				Expr2.Equals(expr.Expr2, comparer) &&
+				comparer(this, other);
+		}
+
+		#endregion
+
+		#region ICloneableElement Members
+
+		public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+		{
+			if (!doClone(this))
+				return this;
+
+			ICloneableElement clone;
+
+			if (!objectTree.TryGetValue(this, out clone))
+			{
+				objectTree.Add(this, clone = new SqlBinaryExpression(
+					SystemType,
+					(ISqlExpression)Expr1.Clone(objectTree, doClone),
+					Operation,
+					(ISqlExpression)Expr2.Clone(objectTree, doClone),
+					Precedence));
+			}
+
+			return clone;
+		}
+
+		#endregion
+
+		#region IQueryElement Members
+
+		public QueryElementType ElementType { get { return QueryElementType.SqlBinaryExpression; } }
+
+		StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+		{
+			Expr1
+				.ToString(sb, dic)
+				.Append(' ')
+				.Append(Operation)
+				.Append(' ');
+
+			return Expr2.ToString(sb, dic);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlDataType.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,555 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.SqlTypes;
+using System.Linq;
+using System.Text;
+
+namespace BLToolkit.Data.Sql
+{
+	using Reflection;
+
+	public class SqlDataType : ISqlExpression
+	{
+		#region Init
+
+		public SqlDataType(SqlDbType dbType)
+		{
+			var defaultType = GetDataType(dbType);
+
+			SqlDbType = dbType;
+			Type      = defaultType.Type;
+			Length    = defaultType.Length;
+			Precision = defaultType.Precision;
+			Scale     = defaultType.Scale;
+		}
+
+		public SqlDataType(SqlDbType dbType, int length)
+		{
+			if (length <= 0) throw new ArgumentOutOfRangeException("length");
+
+			SqlDbType = dbType;
+			Type      = GetDataType(dbType).Type;
+			Length    = length;
+		}
+
+		public SqlDataType(SqlDbType dbType, int precision, int scale)
+		{
+			if (precision <= 0) throw new ArgumentOutOfRangeException("precision");
+			if (scale     <  0) throw new ArgumentOutOfRangeException("scale");
+
+			SqlDbType = dbType;
+			Type      = GetDataType(dbType).Type;
+			Precision = precision;
+			Scale     = scale;
+		}
+
+		public SqlDataType([JetBrains.Annotations.NotNull]Type type)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			var defaultType = GetDataType(type);
+
+			SqlDbType = defaultType.SqlDbType;
+			Type      = type;
+			Length    = defaultType.Length;
+			Precision = defaultType.Precision;
+			Scale     = defaultType.Scale;
+		}
+
+		public SqlDataType([JetBrains.Annotations.NotNull] Type type, int length)
+		{
+			if (type   == null) throw new ArgumentNullException      ("type");
+			if (length <= 0)    throw new ArgumentOutOfRangeException("length");
+
+			SqlDbType = GetDataType(type).SqlDbType;
+			Type      = type;
+			Length    = length;
+		}
+
+		public SqlDataType([JetBrains.Annotations.NotNull] Type type, int precision, int scale)
+		{
+			if (type  == null)  throw new ArgumentNullException      ("type");
+			if (precision <= 0) throw new ArgumentOutOfRangeException("precision");
+			if (scale     <  0) throw new ArgumentOutOfRangeException("scale");
+
+			SqlDbType = GetDataType(type).SqlDbType;
+			Type      = type;
+			Precision = precision;
+			Scale     = scale;
+		}
+
+		public SqlDataType(SqlDbType dbType, [JetBrains.Annotations.NotNull]Type type)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			var defaultType = GetDataType(dbType);
+
+			SqlDbType = dbType;
+			Type      = type;
+			Length    = defaultType.Length;
+			Precision = defaultType.Precision;
+			Scale     = defaultType.Scale;
+		}
+
+		public SqlDataType(SqlDbType dbType, [JetBrains.Annotations.NotNull] Type type, int length)
+		{
+			if (type   == null) throw new ArgumentNullException      ("type");
+			if (length <= 0)    throw new ArgumentOutOfRangeException("length");
+
+			SqlDbType = dbType;
+			Type      = type;
+			Length    = length;
+		}
+
+		public SqlDataType(SqlDbType dbType, [JetBrains.Annotations.NotNull] Type type, int precision, int scale)
+		{
+			if (type  == null)  throw new ArgumentNullException      ("type");
+			if (precision <= 0) throw new ArgumentOutOfRangeException("precision");
+			if (scale     <  0) throw new ArgumentOutOfRangeException("scale");
+
+			SqlDbType = dbType;
+			Type      = type;
+			Precision = precision;
+			Scale     = scale;
+		}
+
+		#endregion
+
+		#region Public Members
+
+		public SqlDbType SqlDbType { get; private set; }
+		public Type      Type      { get; private set; }
+		public int       Length    { get; private set; }
+		public int       Precision { get; private set; }
+		public int       Scale     { get; private set; }
+
+		#endregion
+
+		#region Static Members
+
+		struct TypeInfo
+		{
+			public TypeInfo(SqlDbType dbType, int maxLength, int maxPrecision, int maxScale, int maxDisplaySize)
+			{
+				SqlDbType      = dbType;
+				MaxLength      = maxLength;
+				MaxPrecision   = maxPrecision;
+				MaxScale       = maxScale;
+				MaxDisplaySize = maxDisplaySize;
+			}
+
+			public readonly SqlDbType SqlDbType;
+			public readonly int       MaxLength;
+			public readonly int       MaxPrecision;
+			public readonly int       MaxScale;
+			public readonly int       MaxDisplaySize;
+		}
+
+		static TypeInfo[] SortTypeInfo(params TypeInfo[] info)
+		{
+			var sortedInfo = new TypeInfo[info.Max(ti => (int)ti.SqlDbType) + 1];
+
+			foreach (var typeInfo in info)
+				sortedInfo[(int)typeInfo.SqlDbType] = typeInfo;
+
+			return sortedInfo;
+		}
+
+		static int Len(object obj)
+		{
+			return obj.ToString().Length;
+		}
+
+		static readonly TypeInfo[] _typeInfo = SortTypeInfo
+		(
+			//           DbType                         MaxLength           MaxPrecision               MaxScale       MaxDisplaySize
+			//
+			new TypeInfo(SqlDbType.BigInt,                      8,   Len( long.MaxValue),                     0,     Len( long.MinValue)),
+			new TypeInfo(SqlDbType.Int,                         4,   Len(  int.MaxValue),                     0,     Len(  int.MinValue)),
+			new TypeInfo(SqlDbType.SmallInt,                    2,   Len(short.MaxValue),                     0,     Len(short.MinValue)),
+			new TypeInfo(SqlDbType.TinyInt,                     1,   Len( byte.MaxValue),                     0,     Len( byte.MaxValue)),
+			new TypeInfo(SqlDbType.Bit,                         1,                     1,                     0,                       1),
+
+			new TypeInfo(SqlDbType.Decimal,                    17, Len(decimal.MaxValue), Len(decimal.MaxValue), Len(decimal.MinValue)+1),
+			new TypeInfo(SqlDbType.Money,                       8,                    19,                     4,                  19 + 2),
+			new TypeInfo(SqlDbType.SmallMoney,                  4,                    10,                     4,                  10 + 2),
+			new TypeInfo(SqlDbType.Float,                       8,                    15,                    15,              15 + 2 + 5),
+			new TypeInfo(SqlDbType.Real,                        4,                     7,                     7,               7 + 2 + 4),
+
+			new TypeInfo(SqlDbType.DateTime,                    8,                    -1,                    -1,                      23),
+#if !MONO
+			new TypeInfo(SqlDbType.DateTime2,                   8,                    -1,                    -1,                      27),
+#endif				
+			new TypeInfo(SqlDbType.SmallDateTime,               4,                    -1,                    -1,                      19),
+			new TypeInfo(SqlDbType.Date,                        3,                    -1,                    -1,                      10),
+			new TypeInfo(SqlDbType.Time,                        5,                    -1,                    -1,                      16),
+#if !MONO
+			new TypeInfo(SqlDbType.DateTimeOffset,             10,                    -1,                    -1,                      34),
+#endif
+
+			new TypeInfo(SqlDbType.Char,                     8000,                    -1,                    -1,                    8000),
+			new TypeInfo(SqlDbType.VarChar,                  8000,                    -1,                    -1,                    8000),
+			new TypeInfo(SqlDbType.Text,             int.MaxValue,                    -1,                    -1,            int.MaxValue),
+			new TypeInfo(SqlDbType.NChar,                    4000,                    -1,                    -1,                    4000),
+			new TypeInfo(SqlDbType.NVarChar,                 4000,                    -1,                    -1,                    4000),
+			new TypeInfo(SqlDbType.NText,            int.MaxValue,                    -1,                    -1,        int.MaxValue / 2),
+
+			new TypeInfo(SqlDbType.Binary,                   8000,                    -1,                    -1,                      -1),
+			new TypeInfo(SqlDbType.VarBinary,                8000,                    -1,                    -1,                      -1),
+			new TypeInfo(SqlDbType.Image,            int.MaxValue,                    -1,                    -1,                      -1),
+
+			new TypeInfo(SqlDbType.Timestamp,                   8,                    -1,                    -1,                      -1),
+			new TypeInfo(SqlDbType.UniqueIdentifier,           16,                    -1,                    -1,                      36),
+
+			new TypeInfo(SqlDbType.Variant,                    -1,                    -1,                    -1,                      -1),
+			new TypeInfo(SqlDbType.Xml,                        -1,                    -1,                    -1,                      -1),
+#if !MONO
+			new TypeInfo(SqlDbType.Structured,                 -1,                    -1,                    -1,                      -1),
+#endif
+			new TypeInfo(SqlDbType.Udt,                        -1,                    -1,                    -1,                      -1)
+		);
+
+		public static int GetMaxLength     (SqlDbType dbType) { return _typeInfo[(int)dbType].MaxLength;      }
+		public static int GetMaxPrecision  (SqlDbType dbType) { return _typeInfo[(int)dbType].MaxPrecision;   }
+		public static int GetMaxScale      (SqlDbType dbType) { return _typeInfo[(int)dbType].MaxScale;       }
+		public static int GetMaxDisplaySize(SqlDbType dbType) { return _typeInfo[(int)dbType].MaxDisplaySize; }
+
+		public static SqlDataType GetDataType(Type type)
+		{
+			var underlyingType = type;
+
+			if (underlyingType.IsGenericType && underlyingType.GetGenericTypeDefinition() == typeof(Nullable<>))
+				underlyingType = underlyingType.GetGenericArguments()[0];
+
+			if (underlyingType.IsEnum)
+				underlyingType = Enum.GetUnderlyingType(underlyingType);
+
+			switch (Type.GetTypeCode(underlyingType))
+			{
+				case TypeCode.Boolean  : return Boolean;
+				case TypeCode.Char     : return Char;
+				case TypeCode.SByte    : return SByte;
+				case TypeCode.Byte     : return Byte;
+				case TypeCode.Int16    : return Int16;
+				case TypeCode.UInt16   : return UInt16;
+				case TypeCode.Int32    : return Int32;
+				case TypeCode.UInt32   : return UInt32;
+				case TypeCode.Int64    : return Int64;
+				case TypeCode.UInt64   : return UInt64;
+				case TypeCode.Single   : return Single;
+				case TypeCode.Double   : return Double;
+				case TypeCode.Decimal  : return Decimal;
+				case TypeCode.DateTime : return DateTime;
+				case TypeCode.String   : return String;
+				case TypeCode.Object   :
+					if (underlyingType == typeof(Guid))           return Guid;
+					if (underlyingType == typeof(byte[]))         return ByteArray;
+					if (underlyingType == typeof(System.Data.Linq.Binary)) return LinqBinary;
+					if (underlyingType == typeof(char[]))         return CharArray;
+#if !MONO
+					if (underlyingType == typeof(DateTimeOffset)) return DateTimeOffset;
+#endif
+					if (underlyingType == typeof(TimeSpan))       return TimeSpan;
+					break;
+
+				case TypeCode.DBNull   :
+				case TypeCode.Empty    :
+				default                : break;
+			}
+
+#if !SILVERLIGHT
+
+			if (underlyingType == typeof(SqlByte))     return SqlByte;
+			if (underlyingType == typeof(SqlInt16))    return SqlInt16;
+			if (underlyingType == typeof(SqlInt32))    return SqlInt32;
+			if (underlyingType == typeof(SqlInt64))    return SqlInt64;
+			if (underlyingType == typeof(SqlSingle))   return SqlSingle;
+			if (underlyingType == typeof(SqlBoolean))  return SqlBoolean;
+			if (underlyingType == typeof(SqlDouble))   return SqlDouble;
+			if (underlyingType == typeof(SqlDateTime)) return SqlDateTime;
+			if (underlyingType == typeof(SqlDecimal))  return SqlDecimal;
+			if (underlyingType == typeof(SqlMoney))    return SqlMoney;
+			if (underlyingType == typeof(SqlString))   return SqlString;
+			if (underlyingType == typeof(SqlBinary))   return SqlBinary;
+			if (underlyingType == typeof(SqlGuid))     return SqlGuid;
+			if (underlyingType == typeof(SqlBytes))    return SqlBytes;
+			if (underlyingType == typeof(SqlChars))    return SqlChars;
+			if (underlyingType == typeof(SqlXml))      return SqlXml;
+
+#endif
+
+			return DbVariant;
+		}
+
+		public static SqlDataType GetDataType(SqlDbType type)
+		{
+			switch (type)
+			{
+				case SqlDbType.BigInt           : return DbBigInt;
+				case SqlDbType.Binary           : return DbBinary;
+				case SqlDbType.Bit              : return DbBit;
+				case SqlDbType.Char             : return DbChar;
+				case SqlDbType.DateTime         : return DbDateTime;
+				case SqlDbType.Decimal          : return DbDecimal;
+				case SqlDbType.Float            : return DbFloat;
+				case SqlDbType.Image            : return DbImage;
+				case SqlDbType.Int              : return DbInt;
+				case SqlDbType.Money            : return DbMoney;
+				case SqlDbType.NChar            : return DbNChar;
+				case SqlDbType.NText            : return DbNText;
+				case SqlDbType.NVarChar         : return DbNVarChar;
+				case SqlDbType.Real             : return DbReal;
+				case SqlDbType.UniqueIdentifier : return DbUniqueIdentifier;
+				case SqlDbType.SmallDateTime    : return DbSmallDateTime;
+				case SqlDbType.SmallInt         : return DbSmallInt;
+				case SqlDbType.SmallMoney       : return DbSmallMoney;
+				case SqlDbType.Text             : return DbText;
+				case SqlDbType.Timestamp        : return DbTimestamp;
+				case SqlDbType.TinyInt          : return DbTinyInt;
+				case SqlDbType.VarBinary        : return DbVarBinary;
+				case SqlDbType.VarChar          : return DbVarChar;
+				case SqlDbType.Variant          : return DbVariant;
+#if !SILVERLIGHT
+				case SqlDbType.Xml              : return DbXml;
+#endif
+				case SqlDbType.Udt              : return DbUdt;
+#if !MONO
+				case SqlDbType.Structured       : return DbStructured;
+#endif
+				case SqlDbType.Date             : return DbDate;
+				case SqlDbType.Time             : return DbTime;
+#if !MONO
+				case SqlDbType.DateTime2        : return DbDateTime2;
+				case SqlDbType.DateTimeOffset   : return DbDateTimeOffset;
+#endif
+			}
+
+			throw new InvalidOperationException();
+		}
+
+		public static bool CanBeNull(Type type)
+		{
+			if (type.IsValueType == false ||
+				type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>) ||
+				TypeHelper.IsSameOrParent(typeof(INullable), type))
+				return true;
+
+			return false;
+		}
+
+		#endregion
+
+		#region Default Types
+
+		internal SqlDataType(SqlDbType dbType, Type type, int length, int precision, int scale)
+		{
+			SqlDbType = dbType;
+			Type      = type;
+			Length    = length;
+			Precision = precision;
+			Scale     = scale;
+		}
+
+		SqlDataType(SqlDbType dbType, Type type, Func<SqlDbType,int> length, int precision, int scale)
+			: this(dbType, type, length(dbType), precision, scale)
+		{
+		}
+
+		SqlDataType(SqlDbType dbType, Type type, int length, Func<SqlDbType,int> precision, int scale)
+			: this(dbType, type, length, precision(dbType), scale)
+		{
+		}
+
+		public static readonly SqlDataType DbBigInt           = new SqlDataType(SqlDbType.BigInt,           typeof(Int64),                  0, 0,                0);
+		public static readonly SqlDataType DbInt              = new SqlDataType(SqlDbType.Int,              typeof(Int32),                  0, 0,                0);
+		public static readonly SqlDataType DbSmallInt         = new SqlDataType(SqlDbType.SmallInt,         typeof(Int16),                  0, 0,                0);
+		public static readonly SqlDataType DbTinyInt          = new SqlDataType(SqlDbType.TinyInt,          typeof(Byte),                   0, 0,                0);
+		public static readonly SqlDataType DbBit              = new SqlDataType(SqlDbType.Bit,              typeof(Boolean),                0, 0,                0);
+
+		public static readonly SqlDataType DbDecimal          = new SqlDataType(SqlDbType.Decimal,          typeof(Decimal),                0, GetMaxPrecision, 10);
+		public static readonly SqlDataType DbMoney            = new SqlDataType(SqlDbType.Money,            typeof(Decimal),                0, GetMaxPrecision,  4);
+		public static readonly SqlDataType DbSmallMoney       = new SqlDataType(SqlDbType.SmallMoney,       typeof(Decimal),                0, GetMaxPrecision,  4);
+		public static readonly SqlDataType DbFloat            = new SqlDataType(SqlDbType.Float,            typeof(Double),                 0,               0,  0);
+		public static readonly SqlDataType DbReal             = new SqlDataType(SqlDbType.Real,             typeof(Single),                 0,               0,  0);
+
+		public static readonly SqlDataType DbDateTime         = new SqlDataType(SqlDbType.DateTime,         typeof(DateTime),               0,               0,  0);
+#if !MONO
+		public static readonly SqlDataType DbDateTime2        = new SqlDataType(SqlDbType.DateTime2,        typeof(DateTime),               0,               0,  0);
+#else		
+		public static readonly SqlDataType DbDateTime2        = new SqlDataType(SqlDbType.DateTime,         typeof(DateTime),               0,               0,  0);
+#endif		
+		public static readonly SqlDataType DbSmallDateTime    = new SqlDataType(SqlDbType.SmallDateTime,    typeof(DateTime),               0,               0,  0);
+		public static readonly SqlDataType DbDate             = new SqlDataType(SqlDbType.Date,             typeof(DateTime),               0,               0,  0);
+		public static readonly SqlDataType DbTime             = new SqlDataType(SqlDbType.Time,             typeof(TimeSpan),               0,               0,  0);
+#if !MONO
+		public static readonly SqlDataType DbDateTimeOffset   = new SqlDataType(SqlDbType.DateTimeOffset,   typeof(DateTimeOffset),         0,               0,  0);
+#endif
+
+		public static readonly SqlDataType DbChar             = new SqlDataType(SqlDbType.Char,             typeof(String),      GetMaxLength,               0,  0);
+		public static readonly SqlDataType DbVarChar          = new SqlDataType(SqlDbType.VarChar,          typeof(String),      GetMaxLength,               0,  0);
+		public static readonly SqlDataType DbText             = new SqlDataType(SqlDbType.Text,             typeof(String),      GetMaxLength,               0,  0);
+		public static readonly SqlDataType DbNChar            = new SqlDataType(SqlDbType.NChar,            typeof(String),      GetMaxLength,               0,  0);
+		public static readonly SqlDataType DbNVarChar         = new SqlDataType(SqlDbType.NVarChar,         typeof(String),      GetMaxLength,               0,  0);
+		public static readonly SqlDataType DbNText            = new SqlDataType(SqlDbType.NText,            typeof(String),      GetMaxLength,               0,  0);
+
+		public static readonly SqlDataType DbBinary           = new SqlDataType(SqlDbType.Binary,           typeof(Byte[]),      GetMaxLength,               0,  0);
+		public static readonly SqlDataType DbVarBinary        = new SqlDataType(SqlDbType.VarBinary,        typeof(Byte[]),      GetMaxLength,               0,  0);
+		public static readonly SqlDataType DbImage            = new SqlDataType(SqlDbType.Image,            typeof(Byte[]),      GetMaxLength,               0,  0);
+
+		public static readonly SqlDataType DbTimestamp        = new SqlDataType(SqlDbType.Timestamp,        typeof(Byte[]),                 0,               0,  0);
+		public static readonly SqlDataType DbUniqueIdentifier = new SqlDataType(SqlDbType.UniqueIdentifier, typeof(Guid),                   0,               0,  0);
+
+		public static readonly SqlDataType DbVariant          = new SqlDataType(SqlDbType.Variant,          typeof(Object),                 0,               0,  0);
+#if !SILVERLIGHT
+		public static readonly SqlDataType DbXml              = new SqlDataType(SqlDbType.Xml,              typeof(SqlXml),                 0,               0,  0);
+#endif
+		public static readonly SqlDataType DbUdt              = new SqlDataType(SqlDbType.Udt,              typeof(Object),                 0,               0,  0);
+#if !MONO
+		public static readonly SqlDataType DbStructured       = new SqlDataType(SqlDbType.Structured,       typeof(Object),                 0,               0,  0);
+#endif
+
+		public static readonly SqlDataType Boolean            = DbBit;
+		public static readonly SqlDataType Char               = new SqlDataType(SqlDbType.Char,             typeof(Char),                   1,               0,  0);
+		public static readonly SqlDataType SByte              = new SqlDataType(SqlDbType.SmallInt,         typeof(SByte),                  0,               0,  0);
+		public static readonly SqlDataType Byte               = DbTinyInt;
+		public static readonly SqlDataType Int16              = DbSmallInt;
+		public static readonly SqlDataType UInt16             = new SqlDataType(SqlDbType.Int,              typeof(UInt16),                 0,               0,  0);
+		public static readonly SqlDataType Int32              = DbInt;
+		public static readonly SqlDataType UInt32             = new SqlDataType(SqlDbType.BigInt,           typeof(UInt32),                 0,               0,  0);
+		public static readonly SqlDataType Int64              = DbBigInt;
+		public static readonly SqlDataType UInt64             = new SqlDataType(SqlDbType.Decimal,          typeof(UInt64),                 0, ulong.MaxValue.ToString().Length, 0);
+		public static readonly SqlDataType Single             = DbReal;
+		public static readonly SqlDataType Double             = DbFloat;
+		public static readonly SqlDataType Decimal            = DbDecimal;
+		public static readonly SqlDataType DateTime           = DbDateTime2;
+		public static readonly SqlDataType String             = DbNVarChar;
+		public static readonly SqlDataType Guid               = DbUniqueIdentifier;
+		public static readonly SqlDataType ByteArray          = DbVarBinary;
+		public static readonly SqlDataType LinqBinary         = DbVarBinary;
+		public static readonly SqlDataType CharArray          = new SqlDataType(SqlDbType.NVarChar,         typeof(Char[]),      GetMaxLength,               0,  0);
+#if !MONO
+		public static readonly SqlDataType DateTimeOffset     = DbDateTimeOffset;
+#endif
+		public static readonly SqlDataType TimeSpan           = DbTime;
+
+#if !SILVERLIGHT
+		public static readonly SqlDataType SqlByte            = new SqlDataType(SqlDbType.TinyInt,          typeof(SqlByte),                0,               0,  0);
+		public static readonly SqlDataType SqlInt16           = new SqlDataType(SqlDbType.SmallInt,         typeof(SqlInt16),               0,               0,  0);
+		public static readonly SqlDataType SqlInt32           = new SqlDataType(SqlDbType.Int,              typeof(SqlInt32),               0,               0,  0);
+		public static readonly SqlDataType SqlInt64           = new SqlDataType(SqlDbType.BigInt,           typeof(SqlInt64),               0,               0,  0);
+		public static readonly SqlDataType SqlSingle          = new SqlDataType(SqlDbType.Real,             typeof(SqlSingle),              0,               0,  0);
+		public static readonly SqlDataType SqlBoolean         = new SqlDataType(SqlDbType.Bit,              typeof(SqlBoolean),             0,               0,  0);
+		public static readonly SqlDataType SqlDouble          = new SqlDataType(SqlDbType.Float,            typeof(SqlDouble),              0,               0,  0);
+		public static readonly SqlDataType SqlDateTime        = new SqlDataType(SqlDbType.DateTime,         typeof(SqlDateTime),            0,               0,  0);
+		public static readonly SqlDataType SqlDecimal         = new SqlDataType(SqlDbType.Decimal,          typeof(SqlDecimal),             0, GetMaxPrecision, 10);
+		public static readonly SqlDataType SqlMoney           = new SqlDataType(SqlDbType.Money,            typeof(SqlMoney),               0, GetMaxPrecision,  4);
+		public static readonly SqlDataType SqlString          = new SqlDataType(SqlDbType.NVarChar,         typeof(SqlString),   GetMaxLength,               0,  0);
+		public static readonly SqlDataType SqlBinary          = new SqlDataType(SqlDbType.Binary,           typeof(SqlBinary),   GetMaxLength,               0,  0);
+		public static readonly SqlDataType SqlGuid            = new SqlDataType(SqlDbType.UniqueIdentifier, typeof(SqlGuid),                0,               0,  0);
+		public static readonly SqlDataType SqlBytes           = new SqlDataType(SqlDbType.Image,            typeof(SqlBytes),    GetMaxLength,               0,  0);
+		public static readonly SqlDataType SqlChars           = new SqlDataType(SqlDbType.Text,             typeof(SqlChars),    GetMaxLength,               0,  0);
+		public static readonly SqlDataType SqlXml             = new SqlDataType(SqlDbType.Xml,              typeof(SqlXml),                 0,               0,  0);
+#endif
+
+		#endregion
+
+		#region Overrides
+
+#if OVERRIDETOSTRING
+
+		public override string ToString()
+		{
+			return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+		}
+
+#endif
+
+		#endregion
+
+		#region ISqlExpression Members
+
+		public int Precedence
+		{
+			get { return Sql.Precedence.Primary; }
+		}
+
+		public Type SystemType
+		{
+			get { return typeof(Type); }
+		}
+
+		#endregion
+
+		#region ISqlExpressionWalkable Members
+
+		ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+		{
+			return func(this);
+		}
+
+		#endregion
+
+		#region IEquatable<ISqlExpression> Members
+
+		bool IEquatable<ISqlExpression>.Equals(ISqlExpression other)
+		{
+			if (this == other)
+				return true;
+
+			var value = (SqlDataType)other;
+			return Type == value.Type && Length == value.Length && Precision == value.Precision && Scale == value.Scale;
+		}
+
+		#endregion
+
+		#region ISqlExpression Members
+
+		public bool CanBeNull()
+		{
+			return false;
+		}
+
+		public bool Equals(ISqlExpression other, Func<ISqlExpression,ISqlExpression,bool> comparer)
+		{
+			return ((ISqlExpression)this).Equals(other) && comparer(this, other);
+		}
+
+		#endregion
+
+		#region ICloneableElement Members
+
+		public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+		{
+			if (!doClone(this))
+				return this;
+
+			ICloneableElement clone;
+
+			if (!objectTree.TryGetValue(this, out clone))
+				objectTree.Add(this, clone = new SqlDataType(SqlDbType, Type, Length, Precision, Scale));
+
+			return clone;
+		}
+
+		#endregion
+
+		#region IQueryElement Members
+
+		public QueryElementType ElementType { get { return QueryElementType.SqlDataType; } }
+
+		StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+		{
+			sb.Append(SqlDbType);
+
+			if (Length != 0)
+				sb.Append('(').Append(Length).Append(')');
+			else if (Precision != 0)
+				sb.Append('(').Append(Precision).Append(',').Append(Scale).Append(')');
+
+			return sb;
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlException.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,44 @@
+using System;
+using System.Runtime.Serialization;
+
+namespace BLToolkit.Data.Sql
+{
+	public class SqlException : Exception
+	{
+		public SqlException()
+			: base("A BLToolkit Sql error has occurred.")
+		{
+		}
+
+		public SqlException(string message)
+			: base(message) 
+		{
+		}
+
+		[JetBrains.Annotations.StringFormatMethod("message")]
+		public SqlException(string message, params object[] args)
+			: base(string.Format(message, args))
+		{
+		}
+
+		public SqlException(string message, Exception innerException)
+			: base(message, innerException)
+		{
+		}
+
+		public SqlException(Exception innerException)
+			: base(innerException.Message, innerException)
+		{
+		}
+
+#if !SILVERLIGHT
+
+		protected SqlException(SerializationInfo info, StreamingContext context)
+			: base(info, context)
+		{
+		}
+
+#endif
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlExpression.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,180 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace BLToolkit.Data.Sql
+{
+	public class SqlExpression : ISqlExpression
+	{
+		public SqlExpression(Type systemType, string expr, int precedence, params ISqlExpression[] parameters)
+		{
+			if (parameters == null) throw new ArgumentNullException("parameters");
+
+			foreach (var value in parameters)
+				if (value == null) throw new ArgumentNullException("parameters");
+
+			SystemType = systemType;
+			Expr       = expr;
+			Precedence = precedence;
+			Parameters = parameters;
+		}
+
+		public SqlExpression(string expr, int precedence, params ISqlExpression[] parameters)
+			: this(null, expr, precedence, parameters)
+		{
+		}
+
+		public SqlExpression(Type systemType, string expr, params ISqlExpression[] parameters)
+			: this(systemType, expr, Sql.Precedence.Unknown, parameters)
+		{
+		}
+
+		public SqlExpression(string expr, params ISqlExpression[] parameters)
+			: this(null, expr, Sql.Precedence.Unknown, parameters)
+		{
+		}
+
+		public Type             SystemType { get; private set; }
+		public string           Expr       { get; private set; }
+
+		public int              Precedence { get; private set; }
+		public ISqlExpression[] Parameters { get; private set; }
+
+		#region Overrides
+
+#if OVERRIDETOSTRING
+
+		public override string ToString()
+		{
+			return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+		}
+
+#endif
+
+		#endregion
+
+		#region ISqlExpressionWalkable Members
+
+		[Obsolete]
+		ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+		{
+			for (var i = 0; i < Parameters.Length; i++)
+				Parameters[i] = Parameters[i].Walk(skipColumns, func);
+
+			return func(this);
+		}
+
+		#endregion
+
+		#region IEquatable<ISqlExpression> Members
+
+		bool IEquatable<ISqlExpression>.Equals(ISqlExpression other)
+		{
+			return Equals(other, DefaultComparer);
+		}
+
+		#endregion
+
+		#region ISqlExpression Members
+
+		public bool CanBeNull()
+		{
+			foreach (var value in Parameters)
+				if (value.CanBeNull())
+					return true;
+
+			return false;
+		}
+
+		public static Func<ISqlExpression,ISqlExpression,bool> DefaultComparer = (x, y) => true;
+
+		public bool Equals(ISqlExpression other, Func<ISqlExpression,ISqlExpression,bool> comparer)
+		{
+			if (this == other)
+				return true;
+
+			var expr = other as SqlExpression;
+
+			if (expr == null || SystemType != expr.SystemType || Expr != expr.Expr || Parameters.Length != expr.Parameters.Length)
+				return false;
+
+			for (var i = 0; i < Parameters.Length; i++)
+				if (!Parameters[i].Equals(expr.Parameters[i], comparer))
+					return false;
+
+			return comparer(this, other);
+		}
+
+		#endregion
+
+		#region ICloneableElement Members
+
+		public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+		{
+			if (!doClone(this))
+				return this;
+
+			ICloneableElement clone;
+
+			if (!objectTree.TryGetValue(this, out clone))
+			{
+				objectTree.Add(this, clone = new SqlExpression(
+					SystemType,
+					Expr,
+					Precedence,
+					Parameters.Select(e => (ISqlExpression)e.Clone(objectTree, doClone)).ToArray()));
+			}
+
+			return clone;
+		}
+
+		#endregion
+
+		#region IQueryElement Members
+
+		public QueryElementType ElementType { get { return QueryElementType.SqlExpression; } }
+
+		StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+		{
+			var len = sb.Length;
+			var ss  = Parameters.Select(p =>
+			{
+				p.ToString(sb, dic);
+				var s = sb.ToString(len, sb.Length - len);
+				sb.Length = len;
+				return (object)s;
+			});
+			
+			return sb.AppendFormat(Expr, ss.ToArray());
+		}
+
+		#endregion
+
+		#region Public Static Members
+
+		public static bool NeedsEqual(IQueryElement ex)
+		{
+			switch (ex.ElementType)
+			{
+				case QueryElementType.SqlParameter:
+				case QueryElementType.SqlField    :
+				case QueryElementType.Column      : return true;
+				case QueryElementType.SqlFunction :
+
+					var f = (SqlFunction)ex;
+
+					switch (f.Name)
+					{
+						case "EXISTS" : return false;
+					}
+
+					return true;
+			}
+
+			return false;
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlField.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,148 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace BLToolkit.Data.Sql
+{
+	using DataAccess;
+	using Mapping;
+
+	public class SqlField : IChild<ISqlTableSource>, ISqlExpression
+	{
+		public SqlField()
+		{
+		}
+
+		public SqlField(SqlField field)
+			: this(field.SystemType, field.Name, field.PhysicalName, field.Nullable, field.PrimaryKeyOrder, field._nonUpdatableAttribute, field.MemberMapper)
+		{
+		}
+
+		public SqlField(
+			Type                  systemType,
+			string                name,
+			string                physicalName,
+			bool                  nullable,
+			int                   pkOrder,
+			NonUpdatableAttribute nonUpdatableAttribute,
+			MemberMapper          memberMapper)
+		{
+			SystemType             = systemType;
+			Alias                  = name.Replace('.', '_');
+			Name                   = name;
+			Nullable               = nullable;
+			PrimaryKeyOrder        = pkOrder;
+			_memberMapper          = memberMapper;
+			_physicalName          = physicalName;
+			_nonUpdatableAttribute = nonUpdatableAttribute;
+		}
+
+		public Type            SystemType      { get; set; }
+		public string          Alias           { get; set; }
+		public string          Name            { get; set; }
+		public bool            Nullable        { get; set; }
+		public int             PrimaryKeyOrder { get; set; }
+		public ISqlTableSource Table           { get; private set; }
+
+		readonly MemberMapper _memberMapper;
+		public   MemberMapper  MemberMapper
+		{
+			get { return _memberMapper; }
+		}
+
+		private string _physicalName;
+		public  string  PhysicalName
+		{
+			get { return _physicalName ?? Name; }
+			set { _physicalName = value; }
+		}
+
+		public bool IsIdentity   { get { return _nonUpdatableAttribute != null && _nonUpdatableAttribute.IsIdentity; } }
+		public bool IsInsertable { get { return _nonUpdatableAttribute == null || !_nonUpdatableAttribute.OnInsert;  } }
+		public bool IsUpdatable  { get { return _nonUpdatableAttribute == null || !_nonUpdatableAttribute.OnUpdate;  } }
+
+		public bool IsPrimaryKey { get { return PrimaryKeyOrder != int.MinValue; } }
+
+		readonly NonUpdatableAttribute  _nonUpdatableAttribute;
+
+		ISqlTableSource IChild<ISqlTableSource>.Parent { get { return Table; } set { Table = value; } }
+
+		#region Overrides
+
+#if OVERRIDETOSTRING
+
+		public override string ToString()
+		{
+			return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+		}
+
+#endif
+
+		#endregion
+
+		#region ISqlExpression Members
+
+		public bool CanBeNull()
+		{
+			return Nullable;
+		}
+
+		public bool Equals(ISqlExpression other, Func<ISqlExpression,ISqlExpression,bool> comparer)
+		{
+			return this == other;
+		}
+
+		public int Precedence
+		{
+			get { return Sql.Precedence.Primary; }
+		}
+
+		#endregion
+
+		#region ISqlExpressionWalkable Members
+
+		ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+		{
+			return func(this);
+		}
+
+		#endregion
+
+		#region IEquatable<ISqlExpression> Members
+
+		bool IEquatable<ISqlExpression>.Equals(ISqlExpression other)
+		{
+			return this == other;
+		}
+
+		#endregion
+
+		#region ICloneableElement Members
+
+		public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+		{
+			if (!doClone(this))
+				return this;
+
+			Table.Clone(objectTree, doClone);
+			return objectTree[this];
+		}
+
+		#endregion
+
+		#region IQueryElement Members
+
+		public QueryElementType ElementType { get { return QueryElementType.SqlField; } }
+
+		StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+		{
+			return sb
+				.Append('t')
+				.Append(Table.SourceID)
+				.Append('.')
+				.Append(Name);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlFunction.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,192 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace BLToolkit.Data.Sql
+{
+	public class SqlFunction : ISqlExpression//ISqlTableSource
+	{
+		[Obsolete]
+		public SqlFunction(string name, params ISqlExpression[] parameters)
+			: this(null, name, Sql.Precedence.Primary, parameters)
+		{
+		}
+
+		[Obsolete]
+		public SqlFunction(string name, int precedence, params ISqlExpression[] parameters)
+			: this(null, name, precedence, parameters)
+		{
+		}
+
+		public SqlFunction(Type systemType, string name, params ISqlExpression[] parameters)
+			: this(systemType, name, Sql.Precedence.Primary, parameters)
+		{
+		}
+
+		public SqlFunction(Type systemType, string name, int precedence, params ISqlExpression[] parameters)
+		{
+			//_sourceID = Interlocked.Increment(ref SqlQuery.SourceIDCounter);
+
+			if (parameters == null) throw new ArgumentNullException("parameters");
+
+			foreach (var p in parameters)
+				if (p == null) throw new ArgumentNullException("parameters");
+
+			SystemType = systemType;
+			Name       = name;
+			Precedence = precedence;
+			Parameters = parameters;
+		}
+
+		public Type             SystemType { get; private set; }
+		public string           Name       { get; private set; }
+
+		public int              Precedence { get; private set; }
+		public ISqlExpression[] Parameters { get; private set; }
+
+		public static SqlFunction CreateCount (Type type, ISqlTableSource table) { return new SqlFunction(type, "Count",  table.All); }
+
+		public static SqlFunction CreateAll   (SqlQuery subQuery) { return new SqlFunction(typeof(bool), "ALL",    Sql.Precedence.Comparison, subQuery); }
+		public static SqlFunction CreateSome  (SqlQuery subQuery) { return new SqlFunction(typeof(bool), "SOME",   Sql.Precedence.Comparison, subQuery); }
+		public static SqlFunction CreateAny   (SqlQuery subQuery) { return new SqlFunction(typeof(bool), "ANY",    Sql.Precedence.Comparison, subQuery); }
+		public static SqlFunction CreateExists(SqlQuery subQuery) { return new SqlFunction(typeof(bool), "EXISTS", Sql.Precedence.Comparison, subQuery); }
+
+		#region Overrides
+
+#if OVERRIDETOSTRING
+
+		public override string ToString()
+		{
+			return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+		}
+
+#endif
+
+		#endregion
+
+		#region ISqlExpressionWalkable Members
+
+		[Obsolete]
+		ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> action)
+		{
+			for (var i = 0; i < Parameters.Length; i++)
+				Parameters[i] = Parameters[i].Walk(skipColumns, action);
+
+			return action(this);
+		}
+
+		#endregion
+
+		#region IEquatable<ISqlExpression> Members
+
+		bool IEquatable<ISqlExpression>.Equals(ISqlExpression other)
+		{
+			return Equals(other, SqlExpression.DefaultComparer);
+		}
+
+		#endregion
+
+		#region ISqlTableSource Members
+
+		/*
+		readonly int _sourceID;
+		public   int  SourceID { get { return _sourceID; } }
+
+		SqlField _all;
+		SqlField  ISqlTableSource.All
+		{
+			get
+			{
+				if (_all == null)
+				{
+					_all = new SqlField(null, "*", "*", true, -1, null, null);
+					((IChild<ISqlTableSource>)_all).Parent = this;
+				}
+
+				return _all;
+			}
+		}
+
+		IList<ISqlExpression> ISqlTableSource.GetKeys(bool allIfEmpty)
+		{
+			return null;
+		}
+		*/
+
+		#endregion
+
+		#region ISqlExpression Members
+
+		public bool CanBeNull()
+		{
+			return true;
+		}
+
+		public bool Equals(ISqlExpression other, Func<ISqlExpression,ISqlExpression,bool> comparer)
+		{
+			if (this == other)
+				return true;
+
+			var func = other as SqlFunction;
+
+			if (func == null || Name != func.Name || Parameters.Length != func.Parameters.Length && SystemType != func.SystemType)
+				return false;
+
+			for (var i = 0; i < Parameters.Length; i++)
+				if (!Parameters[i].Equals(func.Parameters[i], comparer))
+					return false;
+
+			return comparer(this, other);
+		}
+
+		#endregion
+
+		#region ICloneableElement Members
+
+		public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+		{
+			if (!doClone(this))
+				return this;
+
+			ICloneableElement clone;
+
+			if (!objectTree.TryGetValue(this, out clone))
+			{
+				objectTree.Add(this, clone = new SqlFunction(
+					SystemType,
+					Name,
+					Precedence,
+					Parameters.Select(e => (ISqlExpression)e.Clone(objectTree, doClone)).ToArray()));
+			}
+
+			return clone;
+		}
+
+		#endregion
+
+		#region IQueryElement Members
+
+		public QueryElementType ElementType { get { return QueryElementType.SqlFunction; } }
+
+		StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+		{
+			sb
+				.Append(Name)
+				.Append("(");
+
+			foreach (var p in Parameters)
+			{
+				p.ToString(sb, dic);
+				sb.Append(", ");
+			}
+
+			if (Parameters.Length > 0)
+				sb.Length -= 2;
+
+			return sb.Append(")");
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlParameter.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,147 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Text;
+
+namespace BLToolkit.Data.Sql
+{
+	using Mapping;
+
+    public class SqlParameter : SqlValueBase, ISqlExpression
+	{
+		public SqlParameter(Type systemType, string name, object value, MappingSchema mappingSchema)
+		{
+			IsQueryParameter = true;
+			Name             = name;
+			SystemType       = systemType;
+			_value           = value;
+			DbType           = DbType.Object;
+
+			if (systemType != null && mappingSchema != null && systemType.IsEnum)
+			{
+			}
+		}
+
+		public SqlParameter(Type systemType, string name, object value, Converter<object,object> valueConverter)
+			: this(systemType, name, value, (MappingSchema)null)
+		{
+			ValueConverter = valueConverter;
+		}
+
+		[Obsolete]
+		public SqlParameter(string name, object value)
+			: this(value == null ? null : value.GetType(), name, value, (MappingSchema)null)
+		{
+		}
+
+		[Obsolete]
+		public SqlParameter(string name, object value, Converter<object,object> valueConverter)
+			: this(value == null ? null : value.GetType(), name, value, valueConverter)
+		{
+		}
+
+		public string Name             { get; set; }
+		public Type   SystemType       { get; set; }
+		public bool   IsQueryParameter { get; set; }
+		public DbType DbType           { get; set; }
+		public int    DbSize           { get; set; }
+
+		#region Overrides
+
+#if OVERRIDETOSTRING
+
+		public override string ToString()
+		{
+			return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+		}
+
+#endif
+
+		#endregion
+
+		#region ISqlExpression Members
+
+		public int Precedence
+		{
+			get { return Sql.Precedence.Primary; }
+		}
+
+		#endregion
+
+		#region ISqlExpressionWalkable Members
+
+		ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+		{
+			return func(this);
+		}
+
+		#endregion
+
+		#region IEquatable<ISqlExpression> Members
+
+		bool IEquatable<ISqlExpression>.Equals(ISqlExpression other)
+		{
+			if (this == other)
+				return true;
+
+			var p = other as SqlParameter;
+			return (object)p != null && Name != null && p.Name != null && Name == p.Name && SystemType == p.SystemType;
+		}
+
+		#endregion
+
+		#region ISqlExpression Members
+
+		public bool CanBeNull()
+		{
+			if (SystemType == null && _value == null)
+				return true;
+
+			return SqlDataType.CanBeNull(SystemType ?? _value.GetType());
+		}
+
+		public bool Equals(ISqlExpression other, Func<ISqlExpression,ISqlExpression,bool> comparer)
+		{
+			return ((ISqlExpression)this).Equals(other) && comparer(this, other);
+		}
+
+		#endregion
+
+		#region ICloneableElement Members
+
+		public ICloneableElement Clone(Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+		{
+			if (!doClone(this))
+				return this;
+
+			ICloneableElement clone;
+
+			if (!objectTree.TryGetValue(this, out clone))
+			{
+				var p = new SqlParameter(SystemType, Name, _value, ValueConverter) { IsQueryParameter = IsQueryParameter, DbType = DbType, DbSize = DbSize };
+
+				objectTree.Add(this, clone = p);
+			}
+
+			return clone;
+		}
+
+		#endregion
+
+		#region IQueryElement Members
+
+		public QueryElementType ElementType { get { return QueryElementType.SqlParameter; } }
+
+		StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+		{
+			return sb
+				.Append('@')
+				.Append(Name ?? "parameter")
+				.Append('[')
+				.Append(Value ?? "NULL")
+				.Append(']');
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlProvider/AccessSqlProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,429 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace BLToolkit.Data.Sql.SqlProvider
+{
+	using DataProvider;
+	using Reflection;
+
+	public class AccessSqlProvider : BasicSqlProvider
+	{
+		public override int CommandCount(SqlQuery sqlQuery)
+		{
+			return sqlQuery.IsInsert && sqlQuery.Insert.WithIdentity ? 2 : 1;
+		}
+
+		protected override void BuildCommand(int commandNumber, StringBuilder sb)
+		{
+			sb.AppendLine("SELECT @@IDENTITY");
+		}
+
+		//public override bool IsSkipSupported           { get { return SqlQuery.Select.TakeValue != null; } }
+		public override bool IsSkipSupported           { get { return false; } }
+		public override bool TakeAcceptsParameter      { get { return false; } }
+		public override bool IsCountSubQuerySupported  { get { return false; } }
+		public override bool IsNestedJoinSupported     { get { return false; } }
+		public override bool IsInsertOrUpdateSupported { get { return false; } }
+
+		public override bool ConvertCountSubQuery(SqlQuery subQuery)
+		{
+			return !subQuery.Where.IsEmpty;
+		}
+
+		#region Skip / Take Support
+
+		protected override string FirstFormat { get { return "TOP {0}"; } }
+
+		protected override void BuildSql(StringBuilder sb)
+		{
+			if (NeedSkip)
+			{
+				AlternativeBuildSql2(sb, base.BuildSql);
+				return;
+			}
+
+			if (SqlQuery.From.Tables.Count == 0 && SqlQuery.Select.Columns.Count == 1)
+			{
+				if (SqlQuery.Select.Columns[0].Expression is SqlFunction)
+				{
+					var func = (SqlFunction)SqlQuery.Select.Columns[0].Expression;
+
+					if (func.Name == "Iif" && func.Parameters.Length == 3 && func.Parameters[0] is SqlQuery.SearchCondition)
+					{
+						var sc = (SqlQuery.SearchCondition)func.Parameters[0];
+
+						if (sc.Conditions.Count == 1 && sc.Conditions[0].Predicate is SqlQuery.Predicate.FuncLike)
+						{
+							var p = (SqlQuery.Predicate.FuncLike)sc.Conditions[0].Predicate;
+
+							if (p.Function.Name == "EXISTS")
+							{
+								BuildAnyAsCount(sb);
+								return;
+							}
+						}
+					}
+				}
+				else if (SqlQuery.Select.Columns[0].Expression is SqlQuery.SearchCondition)
+				{
+					var sc = (SqlQuery.SearchCondition)SqlQuery.Select.Columns[0].Expression;
+
+					if (sc.Conditions.Count == 1 && sc.Conditions[0].Predicate is SqlQuery.Predicate.FuncLike)
+					{
+						var p = (SqlQuery.Predicate.FuncLike)sc.Conditions[0].Predicate;
+
+						if (p.Function.Name == "EXISTS")
+						{
+							BuildAnyAsCount(sb);
+							return;
+						}
+					}
+				}
+			}
+
+			base.BuildSql(sb);
+		}
+
+		SqlQuery.Column _selectColumn;
+
+		void BuildAnyAsCount(StringBuilder sb)
+		{
+			SqlQuery.SearchCondition cond;
+
+			if (SqlQuery.Select.Columns[0].Expression is SqlFunction)
+			{
+				var func  = (SqlFunction)SqlQuery.Select.Columns[0].Expression;
+				cond  = (SqlQuery.SearchCondition)func.Parameters[0];
+			}
+			else
+			{
+				cond  = (SqlQuery.SearchCondition)SqlQuery.Select.Columns[0].Expression;
+			}
+
+			var exist = ((SqlQuery.Predicate.FuncLike)cond.Conditions[0].Predicate).Function;
+			var query = (SqlQuery)exist.Parameters[0];
+
+			_selectColumn = new SqlQuery.Column(SqlQuery, new SqlExpression(cond.Conditions[0].IsNot ? "Count(*) = 0" : "Count(*) > 0"), SqlQuery.Select.Columns[0].Alias);
+
+			BuildSql(0, query, sb, 0, 0, false);
+
+			_selectColumn = null;
+		}
+
+		protected override IEnumerable<SqlQuery.Column> GetSelectedColumns()
+		{
+			if (_selectColumn != null)
+				return new[] { _selectColumn };
+
+			if (NeedSkip && !SqlQuery.OrderBy.IsEmpty)
+				return AlternativeGetSelectedColumns(base.GetSelectedColumns);
+
+			return base.GetSelectedColumns();
+		}
+
+		protected override void BuildSkipFirst(StringBuilder sb)
+		{
+			if (NeedSkip)
+			{
+				if (!NeedTake)
+				{
+					sb.AppendFormat(" TOP {0}", int.MaxValue);
+				}
+				else if (!SqlQuery.OrderBy.IsEmpty)
+				{
+					sb.Append(" TOP ");
+					BuildExpression(sb, Add<int>(SqlQuery.Select.SkipValue, SqlQuery.Select.TakeValue));
+				}
+			}
+			else
+				base.BuildSkipFirst(sb);
+		}
+
+		#endregion
+
+		protected override ISqlProvider CreateSqlProvider()
+		{
+			return new AccessSqlProvider();
+		}
+
+		protected override bool ParenthesizeJoin()
+		{
+			return true;
+		}
+
+		public override ISqlPredicate ConvertPredicate(ISqlPredicate predicate)
+		{
+			if (predicate is SqlQuery.Predicate.Like)
+			{
+				var l = (SqlQuery.Predicate.Like)predicate;
+
+				if (l.Escape != null)
+				{
+					if (l.Expr2 is SqlValue && l.Escape is SqlValue)
+					{
+						var text = ((SqlValue) l.Expr2).Value.ToString();
+						var val  = new SqlValue(ReescapeLikeText(text, (char)((SqlValue)l.Escape).Value));
+
+						return new SqlQuery.Predicate.Like(l.Expr1, l.IsNot, val, null);
+					}
+
+					if (l.Expr2 is SqlParameter)
+					{
+						var p = (SqlParameter)l.Expr2;
+						var v = "";
+						
+						if (p.ValueConverter != null)
+							v = p.ValueConverter(" ") as string;
+
+						p.SetLikeConverter(v.StartsWith("%") ? "%" : "", v.EndsWith("%") ? "%" : "");
+
+						return new SqlQuery.Predicate.Like(l.Expr1, l.IsNot, p, null);
+					}
+				}
+			}
+
+			return base.ConvertPredicate(predicate);
+		}
+
+		static string ReescapeLikeText(string text, char esc)
+		{
+			var sb = new StringBuilder(text.Length);
+
+			for (var i = 0; i < text.Length; i++)
+			{
+				var c = text[i];
+
+				if (c == esc)
+				{
+					sb.Append('[');
+					sb.Append(text[++i]);
+					sb.Append(']');
+				}
+				else if (c == '[')
+					sb.Append("[[]");
+				else
+					sb.Append(c);
+			}
+
+			return sb.ToString();
+		}
+
+		public override ISqlExpression ConvertExpression(ISqlExpression expr)
+		{
+			expr = base.ConvertExpression(expr);
+
+			if (expr is SqlBinaryExpression)
+			{
+				var be = (SqlBinaryExpression)expr;
+
+				switch (be.Operation[0])
+				{
+					case '%': return new SqlBinaryExpression(be.SystemType, be.Expr1, "MOD", be.Expr2, Precedence.Additive - 1);
+					case '&':
+					case '|':
+					case '^': throw new SqlException("Operator '{0}' is not supported by the {1}.", be.Operation, GetType().Name);
+				}
+			}
+			else if (expr is SqlFunction)
+			{
+				var func = (SqlFunction) expr;
+
+				switch (func.Name)
+				{
+					case "Coalesce":
+
+						if (func.Parameters.Length > 2)
+						{
+							var parms = new ISqlExpression[func.Parameters.Length - 1];
+
+							Array.Copy(func.Parameters, 1, parms, 0, parms.Length);
+							return new SqlFunction(func.SystemType, func.Name, func.Parameters[0], new SqlFunction(func.SystemType, func.Name, parms));
+						}
+
+						var sc = new SqlQuery.SearchCondition();
+
+						sc.Conditions.Add(new SqlQuery.Condition(false, new SqlQuery.Predicate.IsNull(func.Parameters[0], false)));
+
+						return new SqlFunction(func.SystemType, "Iif", sc, func.Parameters[1], func.Parameters[0]);
+
+					case "CASE"      : return ConvertCase(func.SystemType, func.Parameters, 0);
+					case "CharIndex" :
+						return func.Parameters.Length == 2?
+							new SqlFunction(func.SystemType, "InStr", new SqlValue(1),    func.Parameters[1], func.Parameters[0], new SqlValue(1)):
+							new SqlFunction(func.SystemType, "InStr", func.Parameters[2], func.Parameters[1], func.Parameters[0], new SqlValue(1));
+
+					case "Convert"   : 
+						{
+							switch (Type.GetTypeCode(TypeHelper.GetUnderlyingType(func.SystemType)))
+							{
+								case TypeCode.String   : return new SqlFunction(func.SystemType, "CStr",  func.Parameters[1]);
+								case TypeCode.DateTime :
+									if (IsDateDataType(func.Parameters[0], "Date"))
+										return new SqlFunction(func.SystemType, "DateValue", func.Parameters[1]);
+
+									if (IsTimeDataType(func.Parameters[0]))
+										return new SqlFunction(func.SystemType, "TimeValue", func.Parameters[1]);
+
+									return new SqlFunction(func.SystemType, "CDate", func.Parameters[1]);
+
+								default:
+									if (func.SystemType == typeof(DateTime))
+										goto case TypeCode.DateTime;
+									break;
+							}
+
+							return func.Parameters[1];
+						}
+
+						/*
+					case "Convert"   :
+						{
+							string name = null;
+
+							switch (((SqlDataType)func.Parameters[0]).DbType)
+							{
+								case SqlDbType.BigInt           : name = "CLng"; break;
+								case SqlDbType.TinyInt          : name = "CByte"; break;
+								case SqlDbType.Int              :
+								case SqlDbType.SmallInt         : name = "CInt"; break;
+								case SqlDbType.Bit              : name = "CBool"; break;
+								case SqlDbType.Char             :
+								case SqlDbType.Text             :
+								case SqlDbType.VarChar          :
+								case SqlDbType.NChar            :
+								case SqlDbType.NText            :
+								case SqlDbType.NVarChar         : name = "CStr"; break;
+								case SqlDbType.DateTime         :
+								case SqlDbType.Date             :
+								case SqlDbType.Time             :
+								case SqlDbType.DateTime2        :
+								case SqlDbType.SmallDateTime    :
+								case SqlDbType.DateTimeOffset   : name = "CDate"; break;
+								case SqlDbType.Decimal          : name = "CDec"; break;
+								case SqlDbType.Float            : name = "CDbl"; break;
+								case SqlDbType.Money            :
+								case SqlDbType.SmallMoney       : name = "CCur"; break;
+								case SqlDbType.Real             : name = "CSng"; break;
+								case SqlDbType.Image            :
+								case SqlDbType.Binary           :
+								case SqlDbType.UniqueIdentifier :
+								case SqlDbType.Timestamp        :
+								case SqlDbType.VarBinary        :
+								case SqlDbType.Variant          :
+								case SqlDbType.Xml              :
+								case SqlDbType.Udt              :
+								case SqlDbType.Structured       : name = "CVar"; break;
+							}
+
+							return new SqlFunction(name, func.Parameters[1]);
+						}
+						*/
+				}
+			}
+
+			return expr;
+		}
+
+		SqlFunction ConvertCase(Type systemType, ISqlExpression[] parameters, int start)
+		{
+			var len = parameters.Length - start;
+
+			if (len < 3)
+				throw new SqlException("CASE statement is not supported by the {0}.", GetType().Name);
+
+			if (len == 3)
+				return new SqlFunction(systemType, "Iif", parameters[start], parameters[start + 1], parameters[start + 2]);
+
+			return new SqlFunction(systemType, "Iif", parameters[start], parameters[start + 1], ConvertCase(systemType, parameters, start + 2));
+		}
+
+		public override void BuildValue(StringBuilder sb, object value)
+		{
+			if (value is bool)
+				sb.Append(value);
+			else if (value is Guid)
+				sb.Append("'").Append(((Guid)value).ToString("B")).Append("'");
+			else
+				base.BuildValue(sb, value);
+		}
+
+		public override SqlQuery Finalize(SqlQuery sqlQuery)
+		{
+			sqlQuery = base.Finalize(sqlQuery);
+
+			switch (sqlQuery.QueryType)
+			{
+				case QueryType.Delete : return GetAlternativeDelete(sqlQuery);
+				default               : return sqlQuery;
+			}
+		}
+
+		protected override void BuildUpdateClause(StringBuilder sb)
+		{
+			base.BuildFromClause(sb);
+			sb.Remove(0, 4).Insert(0, "UPDATE");
+			base.BuildUpdateSet(sb);
+		}
+
+		protected override void BuildFromClause(StringBuilder sb)
+		{
+			if (!SqlQuery.IsUpdate)
+				base.BuildFromClause(sb);
+		}
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			switch (convertType)
+			{
+				case ConvertType.NameToQueryParameter:
+				case ConvertType.NameToCommandParameter:
+				case ConvertType.NameToSprocParameter:
+					return "@" + value;
+
+				case ConvertType.NameToQueryField:
+				case ConvertType.NameToQueryFieldAlias:
+				case ConvertType.NameToQueryTableAlias:
+					{
+						var name = value.ToString();
+
+						if (name.Length > 0 && name[0] == '[')
+							return value;
+					}
+
+					return "[" + value + "]";
+
+				case ConvertType.NameToDatabase:
+				case ConvertType.NameToOwner:
+				case ConvertType.NameToQueryTable:
+					{
+						var name = value.ToString();
+
+						if (name.Length > 0 && name[0] == '[')
+							return value;
+
+						if (name.IndexOf('.') > 0)
+							value = string.Join("].[", name.Split('.'));
+					}
+
+					return "[" + value + "]";
+
+				case ConvertType.SprocParameterToName:
+					if (value != null)
+					{
+						var str = value.ToString();
+						return str.Length > 0 && str[0] == '@'? str.Substring(1): str;
+					}
+
+					break;
+			}
+
+			return value;
+		}
+
+		protected override void BuildDateTime(StringBuilder sb, object value)
+		{
+			sb.Append(string.Format("#{0:yyyy-MM-dd HH:mm:ss}#", value));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlProvider/BasicSqlProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,3606 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Data;
+using System.Globalization;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+using System.Text;
+
+namespace BLToolkit.Data.Sql.SqlProvider
+{
+	using DataProvider;
+	using Mapping;
+	using Linq;
+	using Reflection;
+
+	public abstract class BasicSqlProvider : ISqlProvider
+	{
+		#region Init
+
+		public SqlQuery SqlQuery { get; set; }
+		public int      Indent   { get; set; }
+
+		private int _nextNesting = 1;
+		private int _nesting;
+		public  int  Nesting
+		{
+			get { return _nesting; }
+		}
+
+		bool _skipAlias;
+
+		public Step BuildStep { get; set; }
+
+		#endregion
+
+		#region Support Flags
+
+		public virtual bool SkipAcceptsParameter            { get { return true;  } }
+		public virtual bool TakeAcceptsParameter            { get { return true;  } }
+		public virtual bool IsTakeSupported                 { get { return true;  } }
+		public virtual bool IsSkipSupported                 { get { return true;  } }
+		public virtual bool IsSubQueryTakeSupported         { get { return true;  } }
+		public virtual bool IsSubQueryColumnSupported       { get { return true;  } }
+		public virtual bool IsCountSubQuerySupported        { get { return true;  } }
+		public virtual bool IsNestedJoinSupported           { get { return true;  } }
+		public virtual bool IsNestedJoinParenthesisRequired { get { return false; } }
+		public virtual bool IsIdentityParameterRequired     { get { return false; } }
+		public virtual bool IsApplyJoinSupported            { get { return false; } }
+		public virtual bool IsInsertOrUpdateSupported       { get { return true;  } }
+		public virtual bool CanCombineParameters            { get { return true;  } }
+		public virtual bool IsGroupByExpressionSupported    { get { return true;  } }
+		public virtual int  MaxInListValuesCount            { get { return int.MaxValue; } }
+
+		public virtual bool ConvertCountSubQuery(SqlQuery subQuery)
+		{
+			return true;
+		}
+
+		#endregion
+
+		#region CommandCount
+
+		public virtual int CommandCount(SqlQuery sqlQuery)
+		{
+			return 1;
+		}
+
+		#endregion
+
+		#region BuildSql
+
+		public virtual int BuildSql(int commandNumber, SqlQuery sqlQuery, StringBuilder sb, int indent, int nesting, bool skipAlias)
+		{
+			SqlQuery     = sqlQuery;
+			Indent       = indent;
+			_nesting     = nesting;
+			_nextNesting = _nesting + 1;
+			_skipAlias   = skipAlias;
+
+			if (commandNumber == 0)
+			{
+				BuildSql(sb);
+
+				if (sqlQuery.HasUnion)
+				{
+					foreach (var union in sqlQuery.Unions)
+					{
+						AppendIndent(sb);
+						sb.Append("UNION");
+						if (union.IsAll) sb.Append(" ALL");
+						sb.AppendLine();
+
+						CreateSqlProvider().BuildSql(commandNumber, union.SqlQuery, sb, indent, nesting, skipAlias);
+					}
+				}
+			}
+			else
+			{
+				BuildCommand(commandNumber, sb);
+			}
+
+			return _nextNesting;
+		}
+
+		protected virtual void BuildCommand(int commandNumber, StringBuilder sb)
+		{
+		}
+
+		#endregion
+
+		#region Overrides
+
+		protected virtual int BuildSqlBuilder(SqlQuery sqlQuery, StringBuilder sb, int indent, int nesting, bool skipAlias)
+		{
+			if (!IsSkipSupported && sqlQuery.Select.SkipValue != null)
+				throw new SqlException("Skip for subqueries is not supported by the '{0}' provider.", Name);
+
+			if (!IsTakeSupported && sqlQuery.Select.TakeValue != null)
+				throw new SqlException("Take for subqueries is not supported by the '{0}' provider.", Name);
+
+			return CreateSqlProvider().BuildSql(0, sqlQuery, sb, indent, nesting, skipAlias);
+		}
+
+		protected abstract ISqlProvider CreateSqlProvider();
+
+		protected virtual bool ParenthesizeJoin()
+		{
+			return false;
+		}
+
+		protected virtual void BuildSql(StringBuilder sb)
+		{
+			switch (SqlQuery.QueryType)
+			{
+				case QueryType.Select         : BuildSelectQuery        (sb); break;
+				case QueryType.Delete         : BuildDeleteQuery        (sb); break;
+				case QueryType.Update         : BuildUpdateQuery        (sb); break;
+				case QueryType.Insert         : BuildInsertQuery        (sb); break;
+				case QueryType.InsertOrUpdate : BuildInsertOrUpdateQuery(sb); break;
+				default                       : BuildUnknownQuery       (sb); break;
+			}
+		}
+
+		protected virtual void BuildDeleteQuery(StringBuilder sb)
+		{
+			BuildStep = Step.DeleteClause;  BuildDeleteClause (sb);
+			BuildStep = Step.FromClause;    BuildFromClause   (sb);
+			BuildStep = Step.WhereClause;   BuildWhereClause  (sb);
+			BuildStep = Step.GroupByClause; BuildGroupByClause(sb);
+			BuildStep = Step.HavingClause;  BuildHavingClause (sb);
+			BuildStep = Step.OrderByClause; BuildOrderByClause(sb);
+			BuildStep = Step.OffsetLimit;   BuildOffsetLimit  (sb);
+		}
+
+		protected virtual void BuildUpdateQuery(StringBuilder sb)
+		{
+			BuildStep = Step.UpdateClause;  BuildUpdateClause (sb);
+			BuildStep = Step.FromClause;    BuildFromClause   (sb);
+			BuildStep = Step.WhereClause;   BuildWhereClause  (sb);
+			BuildStep = Step.GroupByClause; BuildGroupByClause(sb);
+			BuildStep = Step.HavingClause;  BuildHavingClause (sb);
+			BuildStep = Step.OrderByClause; BuildOrderByClause(sb);
+			BuildStep = Step.OffsetLimit;   BuildOffsetLimit  (sb);
+		}
+
+		protected virtual void BuildSelectQuery(StringBuilder sb)
+		{
+			BuildStep = Step.SelectClause;  BuildSelectClause (sb);
+			BuildStep = Step.FromClause;    BuildFromClause   (sb);
+			BuildStep = Step.WhereClause;   BuildWhereClause  (sb);
+			BuildStep = Step.GroupByClause; BuildGroupByClause(sb);
+			BuildStep = Step.HavingClause;  BuildHavingClause (sb);
+			BuildStep = Step.OrderByClause; BuildOrderByClause(sb);
+			BuildStep = Step.OffsetLimit;   BuildOffsetLimit  (sb);
+		}
+
+		protected virtual void BuildInsertQuery(StringBuilder sb)
+		{
+			BuildStep = Step.InsertClause; BuildInsertClause(sb);
+
+			if (SqlQuery.QueryType == QueryType.Insert && SqlQuery.From.Tables.Count != 0)
+			{
+				BuildStep = Step.SelectClause;  BuildSelectClause (sb);
+				BuildStep = Step.FromClause;    BuildFromClause   (sb);
+				BuildStep = Step.WhereClause;   BuildWhereClause  (sb);
+				BuildStep = Step.GroupByClause; BuildGroupByClause(sb);
+				BuildStep = Step.HavingClause;  BuildHavingClause (sb);
+				BuildStep = Step.OrderByClause; BuildOrderByClause(sb);
+				BuildStep = Step.OffsetLimit;   BuildOffsetLimit  (sb);
+			}
+
+			if (SqlQuery.Insert.WithIdentity)
+				BuildGetIdentity(sb);
+		}
+
+		protected virtual void BuildUnknownQuery(StringBuilder sb)
+		{
+			throw new SqlException("Unknown query type '{0}'.", SqlQuery.QueryType);
+		}
+
+		public virtual StringBuilder BuildTableName(StringBuilder sb, string database, string owner, string table)
+		{
+			if (database != null)
+			{
+				if (owner == null)  sb.Append(database).Append("..");
+				else                sb.Append(database).Append(".").Append(owner).Append(".");
+			}
+			else if (owner != null) sb.Append(owner).Append(".");
+
+			return sb.Append(table);
+		}
+
+		public virtual object Convert(object value, ConvertType convertType)
+		{
+			return value;
+		}
+
+		#endregion
+
+		#region Build Select
+
+		protected virtual void BuildSelectClause(StringBuilder sb)
+		{
+			AppendIndent(sb);
+			sb.Append("SELECT");
+
+			if (SqlQuery.Select.IsDistinct)
+				sb.Append(" DISTINCT");
+
+			BuildSkipFirst(sb);
+
+			sb.AppendLine();
+			BuildColumns(sb);
+		}
+
+		protected virtual IEnumerable<SqlQuery.Column> GetSelectedColumns()
+		{
+			return SqlQuery.Select.Columns;
+		}
+
+		protected virtual void BuildColumns(StringBuilder sb)
+		{
+			Indent++;
+
+			var first = true;
+
+			foreach (var col in GetSelectedColumns())
+			{
+				if (!first)
+					sb.Append(',').AppendLine();
+				first = false;
+
+				var addAlias = true;
+
+				AppendIndent(sb);
+				BuildColumnExpression(sb, col.Expression, col.Alias, ref addAlias);
+
+				if (!_skipAlias && addAlias && col.Alias != null)
+					sb.Append(" as ").Append(Convert(col.Alias, ConvertType.NameToQueryFieldAlias));
+			}
+
+			if (first)
+				AppendIndent(sb).Append("*");
+
+			Indent--;
+
+			sb.AppendLine();
+		}
+
+//		protected virtual void BuildColumn(StringBuilder sb, SqlQuery.Column col, ref bool addAlias)
+//		{
+//			BuildExpression(sb, col.Expression, true, true, col.Alias, ref addAlias);
+//		}
+
+		protected virtual void BuildColumnExpression(StringBuilder sb, ISqlExpression expr, string alias, ref bool addAlias)
+		{
+			BuildExpression(sb, expr, true, true, alias, ref addAlias);
+		}
+
+		#endregion
+
+		#region Build Delete
+
+		protected virtual void BuildDeleteClause(StringBuilder sb)
+		{
+			AppendIndent(sb);
+			sb.Append("DELETE ");
+		}
+
+		#endregion
+
+		#region Build Update
+
+		protected virtual void BuildUpdateClause(StringBuilder sb)
+		{
+			BuildUpdateTable(sb);
+			BuildUpdateSet  (sb);
+		}
+
+		protected virtual void BuildUpdateTable(StringBuilder sb)
+		{
+			AppendIndent(sb)
+				.AppendLine("UPDATE")
+				.Append('\t');
+			BuildUpdateTableName(sb);
+			sb.AppendLine();
+		}
+
+		protected virtual void BuildUpdateTableName(StringBuilder sb)
+		{
+			if (SqlQuery.Update.Table != null && SqlQuery.Update.Table != SqlQuery.From.Tables[0].Source)
+				BuildPhysicalTable(sb, SqlQuery.Update.Table, null);
+			else
+				BuildTableName(sb, SqlQuery.From.Tables[0], true, true);
+		}
+
+		protected virtual void BuildUpdateSet(StringBuilder sb)
+		{
+			AppendIndent(sb)
+				.AppendLine("SET");
+
+			Indent++;
+
+			var first = true;
+
+			foreach (var expr in SqlQuery.Update.Items)
+			{
+				if (!first)
+					sb.Append(',').AppendLine();
+				first = false;
+
+				AppendIndent(sb);
+				BuildExpression(sb, expr.Column, false, true);
+				sb.Append(" = ");
+
+				var addAlias = false;
+
+				BuildColumnExpression(sb, expr.Expression, null, ref addAlias);
+			}
+
+			Indent--;
+
+			sb.AppendLine();
+		}
+
+		#endregion
+
+		#region Build Insert
+
+		protected void BuildInsertClause(StringBuilder sb)
+		{
+			BuildInsertClause(sb, "INSERT INTO ", true);
+		}
+
+		protected virtual void BuildEmptyInsert(StringBuilder sb)
+		{
+			sb.AppendLine("DEFAULT VALUES");
+		}
+
+		protected virtual void BuildInsertClause(StringBuilder sb, string insertText, bool appendTableName)
+		{
+			AppendIndent(sb).Append(insertText);
+
+			if (appendTableName)
+				BuildPhysicalTable(sb, SqlQuery.Insert.Into, null);
+
+			if (SqlQuery.Insert.Items.Count == 0)
+			{
+				sb.Append(' ');
+				BuildEmptyInsert(sb);
+			}
+			else
+			{
+				sb.AppendLine();
+
+				AppendIndent(sb).AppendLine("(");
+
+				Indent++;
+
+				var first = true;
+
+				foreach (var expr in SqlQuery.Insert.Items)
+				{
+					if (!first)
+						sb.Append(',').AppendLine();
+					first = false;
+
+					AppendIndent(sb);
+					BuildExpression(sb, expr.Column, false, true);
+				}
+
+				Indent--;
+
+				sb.AppendLine();
+				AppendIndent(sb).AppendLine(")");
+
+				if (SqlQuery.QueryType == QueryType.InsertOrUpdate || SqlQuery.From.Tables.Count == 0)
+				{
+					AppendIndent(sb).AppendLine("VALUES");
+					AppendIndent(sb).AppendLine("(");
+
+					Indent++;
+
+					first = true;
+
+					foreach (var expr in SqlQuery.Insert.Items)
+					{
+						if (!first)
+							sb.Append(',').AppendLine();
+						first = false;
+
+						AppendIndent(sb);
+						BuildExpression(sb, expr.Expression);
+					}
+
+					Indent--;
+
+					sb.AppendLine();
+					AppendIndent(sb).AppendLine(")");
+				}
+			}
+		}
+
+		protected virtual void BuildGetIdentity(StringBuilder sb)
+		{
+			//throw new SqlException("Insert with identity is not supported by the '{0}' sql provider.", Name);
+		}
+
+		#endregion
+
+		#region Build InsertOrUpdate
+
+		protected virtual void BuildInsertOrUpdateQuery(StringBuilder sb)
+		{
+			throw new SqlException("InsertOrUpdate query type is not supported by {0} provider.", Name);
+		}
+
+		protected void BuildInsertOrUpdateQueryAsMerge(StringBuilder sb, string fromDummyTable)
+		{
+			var table       = SqlQuery.Insert.Into;
+			var targetAlias = Convert(SqlQuery.From.Tables[0].Alias, ConvertType.NameToQueryTableAlias).ToString();
+			var sourceAlias = Convert(GetTempAliases(1, "s")[0],     ConvertType.NameToQueryTableAlias).ToString();
+			var keys        = SqlQuery.Update.Keys;
+
+			AppendIndent(sb).Append("MERGE INTO ");
+			BuildPhysicalTable(sb, table, null);
+			sb.Append(' ').AppendLine(targetAlias);
+
+			AppendIndent(sb).Append("USING (SELECT ");
+
+			for (var i = 0; i < keys.Count; i++)
+			{
+				BuildExpression(sb, keys[i].Expression, false, false);
+				sb.Append(" AS ");
+				BuildExpression(sb, keys[i].Column, false, false);
+
+				if (i + 1 < keys.Count)
+					sb.Append(", ");
+			}
+
+			if (!string.IsNullOrEmpty(fromDummyTable))
+				sb.Append(' ').Append(fromDummyTable);
+
+			sb.Append(") ").Append(sourceAlias).AppendLine(" ON");
+
+			AppendIndent(sb).AppendLine("(");
+
+			Indent++;
+
+			for (var i = 0; i < keys.Count; i++)
+			{
+				var key = keys[i];
+
+				AppendIndent(sb);
+
+				sb.Append(targetAlias).Append('.');
+				BuildExpression(sb, key.Column, false, false);
+
+				sb.Append(" = ").Append(sourceAlias).Append('.');
+				BuildExpression(sb, key.Column, false, false);
+
+				if (i + 1 < keys.Count)
+					sb.Append(" AND");
+
+				sb.AppendLine();
+			}
+
+			Indent--;
+
+			AppendIndent(sb).AppendLine(")");
+			AppendIndent(sb).AppendLine("WHEN MATCHED THEN");
+
+			Indent++;
+			AppendIndent(sb).AppendLine("UPDATE ");
+			BuildUpdateSet(sb);
+			Indent--;
+
+			AppendIndent(sb).AppendLine("WHEN NOT MATCHED THEN");
+
+			Indent++;
+			BuildInsertClause(sb, "INSERT", false);
+			Indent--;
+
+			while (_endLine.Contains(sb[sb.Length - 1]))
+				sb.Length--;
+		}
+
+		static readonly char[] _endLine = new[] { ' ', '\r', '\n' };
+
+		protected void BuildInsertOrUpdateQueryAsUpdateInsert(StringBuilder sb)
+		{
+			AppendIndent(sb).AppendLine("BEGIN TRAN").AppendLine();
+
+			BuildUpdateQuery(sb);
+
+			AppendIndent(sb).AppendLine("WHERE");
+
+			var alias = Convert(SqlQuery.From.Tables[0].Alias, ConvertType.NameToQueryTableAlias).ToString();
+			var exprs = SqlQuery.Update.Keys;
+
+			Indent++;
+
+			for (var i = 0; i < exprs.Count; i++)
+			{
+				var expr = exprs[i];
+
+				AppendIndent(sb);
+
+				sb.Append(alias).Append('.');
+				BuildExpression(sb, expr.Column, false, false);
+
+				sb.Append(" = ");
+				BuildExpression(sb, Precedence.Comparison, expr.Expression);
+
+				if (i + 1 < exprs.Count)
+					sb.Append(" AND");
+
+				sb.AppendLine();
+			}
+
+			Indent--;
+
+			sb.AppendLine();
+			AppendIndent(sb).AppendLine("IF @@ROWCOUNT = 0");
+			AppendIndent(sb).AppendLine("BEGIN");
+
+			Indent++;
+
+			BuildInsertQuery(sb);
+
+			Indent--;
+
+			AppendIndent(sb).AppendLine("END");
+
+			sb.AppendLine();
+			AppendIndent(sb).AppendLine("COMMIT");
+		}
+
+		#endregion
+
+		#region Build From
+
+		protected virtual void BuildFromClause(StringBuilder sb)
+		{
+			if (SqlQuery.From.Tables.Count == 0)
+				return;
+
+			AppendIndent(sb);
+
+			sb.Append("FROM").AppendLine();
+
+			Indent++;
+			AppendIndent(sb);
+
+			var first = true;
+
+			foreach (var ts in SqlQuery.From.Tables)
+			{
+				if (!first)
+				{
+					sb.AppendLine(",");
+					AppendIndent(sb);
+				}
+
+				first = false;
+
+				var jn = ParenthesizeJoin() ? ts.GetJoinNumber() : 0;
+
+				if (jn > 0)
+				{
+					jn--;
+					for (var i = 0; i < jn; i++)
+						sb.Append("(");
+				}
+
+				BuildTableName(sb, ts, true, true);
+
+				foreach (var jt in ts.Joins)
+					BuildJoinTable(sb, jt, ref jn);
+			}
+
+			Indent--;
+
+			sb.AppendLine();
+		}
+
+		protected void BuildPhysicalTable(StringBuilder sb, ISqlTableSource table, string alias)
+		{
+			switch (table.ElementType)
+			{
+				case QueryElementType.SqlTable    :
+				case QueryElementType.TableSource :
+					sb.Append(GetTablePhysicalName(table, alias));
+					break;
+
+				case QueryElementType.SqlQuery    :
+					sb.Append("(").AppendLine();
+					_nextNesting = BuildSqlBuilder((SqlQuery)table, sb, Indent + 1, _nextNesting, false);
+					AppendIndent(sb).Append(")");
+
+					break;
+
+				default:
+					throw new InvalidOperationException();
+			}
+		}
+
+		protected void BuildTableName(StringBuilder sb, SqlQuery.TableSource ts, bool buildName, bool buildAlias)
+		{
+			if (buildName)
+			{
+				var alias = GetTableAlias(ts);
+				BuildPhysicalTable(sb, ts.Source, alias);
+			}
+
+			if (buildAlias)
+			{
+				if (ts.SqlTableType != SqlTableType.Expression)
+				{
+					var alias = GetTableAlias(ts);
+
+					if (!string.IsNullOrEmpty(alias))
+					{
+						if (buildName)
+							sb.Append(" ");
+						sb.Append(Convert(alias, ConvertType.NameToQueryTableAlias));
+					}
+					
+				}
+			}
+		}
+
+		void BuildJoinTable(StringBuilder sb, SqlQuery.JoinedTable join, ref int joinCounter)
+		{
+			sb.AppendLine();
+			Indent++;
+			AppendIndent(sb);
+
+			var buildOn = BuildJoinType(sb, join);
+
+			if (IsNestedJoinParenthesisRequired && join.Table.Joins.Count != 0)
+				sb.Append('(');
+
+			BuildTableName(sb, join.Table, true, true);
+
+			if (IsNestedJoinSupported && join.Table.Joins.Count != 0)
+			{
+				foreach (var jt in join.Table.Joins)
+					BuildJoinTable(sb, jt, ref joinCounter);
+
+				if (IsNestedJoinParenthesisRequired && join.Table.Joins.Count != 0)
+					sb.Append(')');
+
+				if (buildOn)
+				{
+					sb.AppendLine();
+					AppendIndent(sb);
+					sb.Append("ON ");
+				}
+			}
+			else if (buildOn)
+				sb.Append(" ON ");
+
+			if (buildOn)
+			{
+				if (join.Condition.Conditions.Count != 0)
+					BuildSearchCondition(sb, Precedence.Unknown, join.Condition);
+				else
+					sb.Append("1=1");
+			}
+
+			if (joinCounter > 0)
+			{
+				joinCounter--;
+				sb.Append(")");
+			}
+
+			if (!IsNestedJoinSupported)
+				foreach (var jt in join.Table.Joins)
+					BuildJoinTable(sb, jt, ref joinCounter);
+
+			Indent--;
+		}
+
+		protected virtual bool BuildJoinType(StringBuilder sb, SqlQuery.JoinedTable join)
+		{
+			switch (join.JoinType)
+			{
+				case SqlQuery.JoinType.Inner      : sb.Append("INNER JOIN ");  return true;
+				case SqlQuery.JoinType.Left       : sb.Append("LEFT JOIN ");   return true;
+				case SqlQuery.JoinType.CrossApply : sb.Append("CROSS APPLY "); return false;
+				case SqlQuery.JoinType.OuterApply : sb.Append("OUTER APPLY "); return false;
+				default: throw new InvalidOperationException();
+			}
+		}
+
+		#endregion
+
+		#region Where Clause
+
+		protected virtual bool BuildWhere()
+		{
+			return SqlQuery.Where.SearchCondition.Conditions.Count != 0;
+		}
+
+		protected virtual void BuildWhereClause(StringBuilder sb)
+		{
+			if (!BuildWhere())
+				return;
+
+			AppendIndent(sb);
+
+			sb.Append("WHERE").AppendLine();
+
+			Indent++;
+			AppendIndent(sb);
+			BuildWhereSearchCondition(sb, SqlQuery.Where.SearchCondition);
+			Indent--;
+
+			sb.AppendLine();
+		}
+
+		#endregion
+
+		#region GroupBy Clause
+
+		protected virtual void BuildGroupByClause(StringBuilder sb)
+		{
+			if (SqlQuery.GroupBy.Items.Count == 0)
+				return;
+
+			AppendIndent(sb);
+
+			sb.Append("GROUP BY").AppendLine();
+
+			Indent++;
+
+			for (var i = 0; i < SqlQuery.GroupBy.Items.Count; i++)
+			{
+				AppendIndent(sb);
+
+				BuildExpression(sb, SqlQuery.GroupBy.Items[i]);
+
+				if (i + 1 < SqlQuery.GroupBy.Items.Count)
+					sb.Append(',');
+
+				sb.AppendLine();
+			}
+
+			Indent--;
+		}
+
+		#endregion
+
+		#region Having Clause
+
+		protected virtual void BuildHavingClause(StringBuilder sb)
+		{
+			if (SqlQuery.Having.SearchCondition.Conditions.Count == 0)
+				return;
+
+			AppendIndent(sb);
+
+			sb.Append("HAVING").AppendLine();
+
+			Indent++;
+			AppendIndent(sb);
+			BuildWhereSearchCondition(sb, SqlQuery.Having.SearchCondition);
+			Indent--;
+
+			sb.AppendLine();
+		}
+
+		#endregion
+
+		#region OrderBy Clause
+
+		protected virtual void BuildOrderByClause(StringBuilder sb)
+		{
+			if (SqlQuery.OrderBy.Items.Count == 0)
+				return;
+
+			AppendIndent(sb);
+
+			sb.Append("ORDER BY").AppendLine();
+
+			Indent++;
+
+			for (var i = 0; i < SqlQuery.OrderBy.Items.Count; i++)
+			{
+				AppendIndent(sb);
+
+				var item = SqlQuery.OrderBy.Items[i];
+
+				BuildExpression(sb, item.Expression);
+
+				if (item.IsDescending)
+					sb.Append(" DESC");
+
+				if (i + 1 < SqlQuery.OrderBy.Items.Count)
+					sb.Append(',');
+
+				sb.AppendLine();
+			}
+
+			Indent--;
+		}
+
+		#endregion
+
+		#region Skip/Take
+
+		protected virtual bool   SkipFirst    { get { return true;  } }
+		protected virtual string SkipFormat   { get { return null;  } }
+		protected virtual string FirstFormat  { get { return null;  } }
+		protected virtual string LimitFormat  { get { return null;  } }
+		protected virtual string OffsetFormat { get { return null;  } }
+		protected virtual bool   OffsetFirst  { get { return false; } }
+
+		protected bool NeedSkip { get { return SqlQuery.Select.SkipValue != null && IsSkipSupported; } }
+		protected bool NeedTake { get { return SqlQuery.Select.TakeValue != null && IsTakeSupported; } }
+
+		protected virtual void BuildSkipFirst(StringBuilder sb)
+		{
+			if (SkipFirst && NeedSkip && SkipFormat != null)
+				sb.Append(' ').AppendFormat(SkipFormat,  BuildExpression(new StringBuilder(), SqlQuery.Select.SkipValue));
+
+			if (NeedTake && FirstFormat != null)
+				sb.Append(' ').AppendFormat(FirstFormat, BuildExpression(new StringBuilder(), SqlQuery.Select.TakeValue));
+
+			if (!SkipFirst && NeedSkip && SkipFormat != null)
+				sb.Append(' ').AppendFormat(SkipFormat,  BuildExpression(new StringBuilder(), SqlQuery.Select.SkipValue));
+		}
+
+		protected virtual void BuildOffsetLimit(StringBuilder sb)
+		{
+			var doSkip = NeedSkip && OffsetFormat != null;
+			var doTake = NeedTake && LimitFormat  != null;
+
+			if (doSkip || doTake)
+			{
+				AppendIndent(sb);
+
+				if (doSkip && OffsetFirst)
+				{
+					sb.AppendFormat(OffsetFormat, BuildExpression(new StringBuilder(), SqlQuery.Select.SkipValue));
+
+					if (doTake)
+						sb.Append(' ');
+				}
+
+				if (doTake)
+				{
+					sb.AppendFormat(LimitFormat, BuildExpression(new StringBuilder(), SqlQuery.Select.TakeValue));
+
+					if (doSkip)
+						sb.Append(' ');
+				}
+
+				if (doSkip && !OffsetFirst)
+					sb.AppendFormat(OffsetFormat, BuildExpression(new StringBuilder(), SqlQuery.Select.SkipValue));
+
+				sb.AppendLine();
+			}
+		}
+
+		#endregion
+
+		#region Builders
+
+		#region BuildSearchCondition
+
+		protected virtual void BuildWhereSearchCondition(StringBuilder sb, SqlQuery.SearchCondition condition)
+		{
+			BuildSearchCondition(sb, Precedence.Unknown, condition);
+		}
+
+		protected virtual void BuildSearchCondition(StringBuilder sb, SqlQuery.SearchCondition condition)
+		{
+			var isOr = (bool?)null;
+			var len  = sb.Length;
+			var parentPrecedence = condition.Precedence + 1;
+
+			foreach (var cond in condition.Conditions)
+			{
+				if (isOr != null)
+				{
+					sb.Append(isOr.Value ? " OR" : " AND");
+
+					if (condition.Conditions.Count < 4 && sb.Length - len < 50 || condition != SqlQuery.Where.SearchCondition)
+					{
+						sb.Append(' ');
+					}
+					else
+					{
+						sb.AppendLine();
+						AppendIndent(sb);
+						len = sb.Length;
+					}
+				}
+
+				if (cond.IsNot)
+					sb.Append("NOT ");
+
+				var precedence = GetPrecedence(cond.Predicate);
+
+				BuildPredicate(sb, cond.IsNot ? Precedence.LogicalNegation : parentPrecedence, precedence, cond.Predicate);
+
+				isOr = cond.IsOr;
+			}
+		}
+
+		protected virtual void BuildSearchCondition(StringBuilder sb, int parentPrecedence, SqlQuery.SearchCondition condition)
+		{
+			var wrap = Wrap(GetPrecedence(condition as ISqlExpression), parentPrecedence);
+
+			if (wrap) sb.Append('(');
+			BuildSearchCondition(sb, condition);
+			if (wrap) sb.Append(')');
+		}
+
+		#endregion
+
+		#region BuildPredicate
+
+		protected virtual void BuildPredicate(StringBuilder sb, ISqlPredicate predicate)
+		{
+			switch (predicate.ElementType)
+			{
+				case QueryElementType.ExprExprPredicate :
+					{
+						var expr = (SqlQuery.Predicate.ExprExpr)predicate;
+
+						switch (expr.Operator)
+						{
+							case SqlQuery.Predicate.Operator.Equal :
+							case SqlQuery.Predicate.Operator.NotEqual :
+								{
+									ISqlExpression e = null;
+
+									if (expr.Expr1 is SqlValueBase && ((SqlValueBase)expr.Expr1).Value == null)
+										e = expr.Expr2;
+									else if (expr.Expr2 is SqlValueBase && ((SqlValueBase)expr.Expr2).Value == null)
+										e = expr.Expr1;
+
+									if (e != null)
+									{
+										BuildExpression(sb, GetPrecedence(expr), e);
+										sb.Append(expr.Operator == SqlQuery.Predicate.Operator.Equal ? " IS NULL" : " IS NOT NULL");
+										return;
+									}
+
+									break;
+								}
+						}
+
+						BuildExpression(sb, GetPrecedence(expr), expr.Expr1);
+
+						switch (expr.Operator)
+						{
+							case SqlQuery.Predicate.Operator.Equal          : sb.Append(" = ");  break;
+							case SqlQuery.Predicate.Operator.NotEqual       : sb.Append(" <> "); break;
+							case SqlQuery.Predicate.Operator.Greater        : sb.Append(" > ");  break;
+							case SqlQuery.Predicate.Operator.GreaterOrEqual : sb.Append(" >= "); break;
+							case SqlQuery.Predicate.Operator.NotGreater     : sb.Append(" !> "); break;
+							case SqlQuery.Predicate.Operator.Less           : sb.Append(" < ");  break;
+							case SqlQuery.Predicate.Operator.LessOrEqual    : sb.Append(" <= "); break;
+							case SqlQuery.Predicate.Operator.NotLess        : sb.Append(" !< "); break;
+						}
+
+						BuildExpression(sb, GetPrecedence(expr), expr.Expr2);
+					}
+
+					break;
+
+				case QueryElementType.LikePredicate :
+					BuildLikePredicate(sb, (SqlQuery.Predicate.Like)predicate);
+					break;
+
+				case QueryElementType.BetweenPredicate :
+					{
+						var p = (SqlQuery.Predicate.Between)predicate;
+						BuildExpression(sb, GetPrecedence(p), p.Expr1);
+						if (p.IsNot) sb.Append(" NOT");
+						sb.Append(" BETWEEN ");
+						BuildExpression(sb, GetPrecedence(p), p.Expr2);
+						sb.Append(" AND ");
+						BuildExpression(sb, GetPrecedence(p), p.Expr3);
+					}
+
+					break;
+
+				case QueryElementType.IsNullPredicate :
+					{
+						var p = (SqlQuery.Predicate.IsNull)predicate;
+						BuildExpression(sb, GetPrecedence(p), p.Expr1);
+						sb.Append(p.IsNot ? " IS NOT NULL" : " IS NULL");
+					}
+
+					break;
+
+				case QueryElementType.InSubQueryPredicate :
+					{
+						var p = (SqlQuery.Predicate.InSubQuery)predicate;
+						BuildExpression(sb, GetPrecedence(p), p.Expr1);
+						sb.Append(p.IsNot ? " NOT IN " : " IN ");
+						BuildExpression(sb, GetPrecedence(p), p.SubQuery);
+					}
+
+					break;
+
+				case QueryElementType.InListPredicate :
+					BuildInListPredicate(predicate, sb);
+					break;
+
+				case QueryElementType.FuncLikePredicate :
+					{
+						var f = (SqlQuery.Predicate.FuncLike)predicate;
+						BuildExpression(sb, f.Function.Precedence, f.Function);
+					}
+
+					break;
+
+				case QueryElementType.SearchCondition :
+					BuildSearchCondition(sb, predicate.Precedence, (SqlQuery.SearchCondition)predicate);
+					break;
+
+				case QueryElementType.NotExprPredicate :
+					{
+						var p = (SqlQuery.Predicate.NotExpr)predicate;
+
+						if (p.IsNot)
+							sb.Append("NOT ");
+
+						BuildExpression(sb, p.IsNot ? Precedence.LogicalNegation : GetPrecedence(p), p.Expr1);
+					}
+
+					break;
+
+				case QueryElementType.ExprPredicate :
+					{
+						var p = (SqlQuery.Predicate.Expr)predicate;
+
+						if (p.Expr1 is SqlValue)
+						{
+							var value = ((SqlValue)p.Expr1).Value;
+
+							if (value is bool)
+							{
+								sb.Append((bool)value ? "1 = 1" : "1 = 0");
+								return;
+							}
+						}
+
+						BuildExpression(sb, GetPrecedence(p), p.Expr1);
+					}
+
+					break;
+
+				default :
+					throw new InvalidOperationException();
+			}
+		}
+
+		static SqlField GetUnderlayingField(ISqlExpression expr)
+		{
+			switch (expr.ElementType)
+			{
+				case QueryElementType.SqlField: return (SqlField)expr;
+				case QueryElementType.Column  : return GetUnderlayingField(((SqlQuery.Column)expr).Expression);
+			}
+
+			throw new InvalidOperationException();
+		}
+
+		void BuildInListPredicate(ISqlPredicate predicate, StringBuilder sb)
+		{
+			var p = (SqlQuery.Predicate.InList)predicate;
+
+			if (p.Values == null || p.Values.Count == 0)
+			{
+				BuildPredicate(sb, new SqlQuery.Predicate.Expr(new SqlValue(false)));
+			}
+			else
+			{
+				ICollection values = p.Values;
+
+				if (p.Values.Count == 1 && p.Values[0] is SqlParameter &&
+					!(p.Expr1.SystemType == typeof(string) && ((SqlParameter)p.Values[0]).Value is string))
+				{
+					var pr = (SqlParameter)p.Values[0];
+
+					if (pr.Value == null)
+					{
+						BuildPredicate(sb, new SqlQuery.Predicate.Expr(new SqlValue(false)));
+						return;
+					}
+
+					if (pr.Value is IEnumerable)
+					{
+						var items = (IEnumerable)pr.Value;
+
+						if (p.Expr1 is ISqlTableSource)
+						{
+							var firstValue = true;
+							var table      = (ISqlTableSource)p.Expr1;
+							var keys       = table.GetKeys(true);
+
+							if (keys == null || keys.Count == 0)
+								throw new SqlException("Cannot create IN expression.");
+
+							if (keys.Count == 1)
+							{
+								foreach (var item in items)
+								{
+									if (firstValue)
+									{
+										firstValue = false;
+										BuildExpression(sb, GetPrecedence(p), keys[0]);
+										sb.Append(p.IsNot ? " NOT IN (" : " IN (");
+									}
+
+									var field = GetUnderlayingField(keys[0]);
+									var value = field.MemberMapper.GetValue(item);
+
+									if (value is ISqlExpression)
+										BuildExpression(sb, (ISqlExpression)value);
+									else
+										BuildValue(sb, value);
+
+									sb.Append(", ");
+								}
+							}
+							else
+							{
+								var len = sb.Length;
+								var rem = 1;
+
+								foreach (var item in items)
+								{
+									if (firstValue)
+									{
+										firstValue = false;
+										sb.Append('(');
+									}
+
+									foreach (var key in keys)
+									{
+										var field = GetUnderlayingField(key);
+										var value = field.MemberMapper.GetValue(item);
+
+										BuildExpression(sb, GetPrecedence(p), key);
+
+										if (value == null)
+										{
+											sb.Append(" IS NULL");
+										}
+										else
+										{
+											sb.Append(" = ");
+											BuildValue(sb, value);
+										}
+
+										sb.Append(" AND ");
+									}
+
+									sb.Remove(sb.Length - 4, 4).Append("OR ");
+
+									if (sb.Length - len >= 50)
+									{
+										sb.AppendLine();
+										AppendIndent(sb);
+										sb.Append(' ');
+										len = sb.Length;
+										rem = 5 + Indent;
+									}
+								}
+
+								if (!firstValue)
+									sb.Remove(sb.Length - rem, rem);
+							}
+
+							if (firstValue)
+								BuildPredicate(sb, new SqlQuery.Predicate.Expr(new SqlValue(p.IsNot)));
+							else
+								sb.Remove(sb.Length - 2, 2).Append(')');
+						}
+						else
+						{
+							BuildInListValues(sb, p, items);
+						}
+
+						return;
+					}
+				}
+
+				BuildInListValues(sb, p, values);
+			}
+		}
+
+		void BuildInListValues(StringBuilder sb, SqlQuery.Predicate.InList predicate, IEnumerable values)
+		{
+			var firstValue = true;
+			var len        = sb.Length;
+			var hasNull    = false;
+			var count      = 0;
+			var longList   = false;
+
+			foreach (var value in values)
+			{
+				if (count++ >= MaxInListValuesCount)
+				{
+					count = 1;
+					longList = true;
+
+					// start building next bucked
+					firstValue = true;
+					sb.Remove(sb.Length - 2, 2).Append(')');
+					sb.Append(" OR ");
+				}
+
+				var val = value;
+
+				if (val is IValueContainer)
+					val = ((IValueContainer)value).Value;
+
+				if (val == null)
+				{
+					hasNull = true;
+					continue;
+				}
+
+				if (firstValue)
+				{
+					firstValue = false;
+					BuildExpression(sb, GetPrecedence(predicate), predicate.Expr1);
+					sb.Append(predicate.IsNot ? " NOT IN (" : " IN (");
+				}
+
+				if (value is ISqlExpression)
+					BuildExpression(sb, (ISqlExpression)value);
+				else
+					BuildValue(sb, value);
+
+				sb.Append(", ");
+			}
+
+			if (firstValue)
+			{
+				BuildPredicate(sb,
+					hasNull ?
+						new SqlQuery.Predicate.IsNull(predicate.Expr1, predicate.IsNot) :
+						new SqlQuery.Predicate.Expr(new SqlValue(predicate.IsNot)));
+			}
+			else
+			{
+				sb.Remove(sb.Length - 2, 2).Append(')');
+
+				if (hasNull)
+				{
+					sb.Insert(len, "(");
+					sb.Append(" OR ");
+					BuildPredicate(sb, new SqlQuery.Predicate.IsNull(predicate.Expr1, predicate.IsNot));
+					sb.Append(")");
+				}
+			}
+
+			if (longList && !hasNull)
+			{
+				sb.Insert(len, "(");
+				sb.Append(")");
+			}
+		}
+
+		protected void BuildPredicate(StringBuilder sb, int parentPrecedence, ISqlPredicate predicate)
+		{
+			BuildPredicate(sb, parentPrecedence, GetPrecedence(predicate), predicate);
+		}
+
+		protected void BuildPredicate(StringBuilder sb, int parentPrecedence, int precedence, ISqlPredicate predicate)
+		{
+			var wrap = Wrap(precedence, parentPrecedence);
+
+			if (wrap) sb.Append('(');
+			BuildPredicate(sb, predicate);
+			if (wrap) sb.Append(')');
+		}
+
+		protected virtual void BuildLikePredicate(StringBuilder sb, SqlQuery.Predicate.Like predicate)
+		{
+			var precedence = GetPrecedence(predicate);
+
+			BuildExpression(sb, precedence, predicate.Expr1);
+			sb.Append(predicate.IsNot? " NOT LIKE ": " LIKE ");
+			BuildExpression(sb, precedence, predicate.Expr2);
+
+			if (predicate.Escape != null)
+			{
+				sb.Append(" ESCAPE ");
+				BuildExpression(sb, predicate.Escape);
+			}
+		}
+
+		#endregion
+
+		#region BuildExpression
+
+		protected virtual StringBuilder BuildExpression(
+			StringBuilder  sb,
+			ISqlExpression expr,
+			bool           buildTableName,
+			bool           checkParentheses,
+			string         alias,
+			ref bool       addAlias)
+		{
+			expr = ConvertExpression(expr);
+
+			switch (expr.ElementType)
+			{
+				case QueryElementType.SqlField:
+					{
+						var field = (SqlField)expr;
+
+						if (field == field.Table.All)
+						{
+							sb.Append("*");
+						}
+						else
+						{
+							if (buildTableName)
+							{
+								var ts = SqlQuery.GetTableSource(field.Table);
+
+								if (ts == null)
+								{
+#if DEBUG
+									SqlQuery.GetTableSource(field.Table);
+#endif
+
+									throw new SqlException(string.Format("Table '{0}' not found.", field.Table));
+								}
+
+								var table = GetTableAlias(ts);
+
+								table = table == null ?
+									GetTablePhysicalName(field.Table, null) :
+									Convert(table, ConvertType.NameToQueryTableAlias).ToString();
+
+								if (string.IsNullOrEmpty(table))
+									throw new SqlException(string.Format("Table {0} should have an alias.", field.Table));
+
+								addAlias = alias != field.PhysicalName;
+
+								sb
+									.Append(table)
+									.Append('.');
+							}
+
+							sb.Append(Convert(field.PhysicalName, ConvertType.NameToQueryField));
+						}
+					}
+
+					break;
+
+				case QueryElementType.Column:
+					{
+						var column = (SqlQuery.Column)expr;
+
+#if DEBUG
+						//if (column.ToString() == "t8.ParentID")
+						//{
+						//    column.ToString();
+						//}
+
+						var sql = SqlQuery.SqlText;
+#endif
+
+						var table = SqlQuery.GetTableSource(column.Parent);
+
+						if (table == null)
+						{
+#if DEBUG
+							table = SqlQuery.GetTableSource(column.Parent);
+#endif
+
+							throw new SqlException(string.Format("Table not found for '{0}'.", column));
+						}
+
+						var tableAlias = GetTableAlias(table) ?? GetTablePhysicalName(column.Parent, null);
+
+						if (string.IsNullOrEmpty(tableAlias))
+							throw new SqlException(string.Format("Table {0} should have an alias.", column.Parent));
+
+						addAlias = alias != column.Alias;
+
+						sb
+							.Append(Convert(tableAlias, ConvertType.NameToQueryTableAlias))
+							.Append('.')
+							.Append(Convert(column.Alias, ConvertType.NameToQueryField));
+					}
+
+					break;
+
+				case QueryElementType.SqlQuery:
+					{
+						var hasParentheses = checkParentheses && sb[sb.Length - 1] == '(';
+
+						if (!hasParentheses)
+							sb.Append("(");
+						sb.AppendLine();
+
+						_nextNesting = BuildSqlBuilder((SqlQuery)expr, sb, Indent + 1, _nextNesting, BuildStep != Step.FromClause);
+
+						AppendIndent(sb);
+
+						if (!hasParentheses)
+							sb.Append(")");
+					}
+
+					break;
+
+				case QueryElementType.SqlValue:
+					BuildValue(sb, ((SqlValue)expr).Value);
+					break;
+
+				case QueryElementType.SqlExpression:
+					{
+						var e = (SqlExpression)expr;
+						var s = new StringBuilder();
+
+						if (e.Parameters == null || e.Parameters.Length == 0)
+							sb.Append(e.Expr);
+						else
+						{
+							var values = new object[e.Parameters.Length];
+
+							for (var i = 0; i < values.Length; i++)
+							{
+								var value = e.Parameters[i];
+
+								s.Length = 0;
+								BuildExpression(s, GetPrecedence(e), value);
+								values[i] = s.ToString();
+							}
+
+							sb.AppendFormat(e.Expr, values);
+						}
+					}
+
+					break;
+
+				case QueryElementType.SqlBinaryExpression:
+					BuildBinaryExpression(sb, (SqlBinaryExpression)expr);
+					break;
+
+				case QueryElementType.SqlFunction:
+					BuildFunction(sb, (SqlFunction)expr);
+					break;
+
+				case QueryElementType.SqlParameter:
+					{
+						var parm = (SqlParameter)expr;
+
+						if (parm.IsQueryParameter)
+						{
+							var name = Convert(parm.Name, ConvertType.NameToQueryParameter);
+							sb.Append(name);
+						}
+						else
+							BuildValue(sb, parm.Value);
+					}
+
+					break;
+
+				case QueryElementType.SqlDataType:
+					BuildDataType(sb, (SqlDataType)expr);
+					break;
+
+				case QueryElementType.SearchCondition:
+					BuildSearchCondition(sb, expr.Precedence, (SqlQuery.SearchCondition)expr);
+					break;
+
+				default:
+					throw new InvalidOperationException();
+			}
+
+			return sb;
+		}
+
+		protected void BuildExpression(StringBuilder sb, int parentPrecedence, ISqlExpression expr, string alias, ref bool addAlias)
+		{
+			var wrap = Wrap(GetPrecedence(expr), parentPrecedence);
+
+			if (wrap) sb.Append('(');
+			BuildExpression(sb, expr, true, true, alias, ref addAlias);
+			if (wrap) sb.Append(')');
+		}
+
+		protected StringBuilder BuildExpression(StringBuilder sb, ISqlExpression expr)
+		{
+			var dummy = false;
+			return BuildExpression(sb, expr, true, true, null, ref dummy);
+		}
+
+		protected StringBuilder BuildExpression(StringBuilder sb, ISqlExpression expr, bool buildTableName, bool checkParentheses)
+		{
+			var dummy = false;
+			return BuildExpression(sb, expr, buildTableName, checkParentheses, null, ref dummy);
+		}
+
+		protected void BuildExpression(StringBuilder sb, int precedence, ISqlExpression expr)
+		{
+			var dummy = false;
+			BuildExpression(sb, precedence, expr, null, ref dummy);
+		}
+
+		#endregion
+
+		#region BuildValue
+
+		interface INullableValueReader
+		{
+			object GetValue(object value);
+		}
+
+		class NullableValueReader<T> : INullableValueReader where T : struct
+		{
+			public object GetValue(object value)
+			{
+				return ((T?)value).Value;
+			}
+		}
+
+		static readonly Dictionary<Type,INullableValueReader> _nullableValueReader = new Dictionary<Type,INullableValueReader>();
+
+		public NumberFormatInfo NumberFormatInfo = new NumberFormatInfo
+		{
+			CurrencyDecimalDigits    = NumberFormatInfo.InvariantInfo.CurrencyDecimalDigits,
+			CurrencyDecimalSeparator = NumberFormatInfo.InvariantInfo.CurrencyDecimalSeparator,
+			CurrencyGroupSeparator   = NumberFormatInfo.InvariantInfo.CurrencyGroupSeparator,
+			CurrencyGroupSizes       = NumberFormatInfo.InvariantInfo.CurrencyGroupSizes,
+			CurrencyNegativePattern  = NumberFormatInfo.InvariantInfo.CurrencyNegativePattern,
+			CurrencyPositivePattern  = NumberFormatInfo.InvariantInfo.CurrencyPositivePattern,
+			CurrencySymbol           = NumberFormatInfo.InvariantInfo.CurrencySymbol,
+			NaNSymbol                = NumberFormatInfo.InvariantInfo.NaNSymbol,
+			NegativeInfinitySymbol   = NumberFormatInfo.InvariantInfo.NegativeInfinitySymbol,
+			NegativeSign             = NumberFormatInfo.InvariantInfo.NegativeSign,
+			NumberDecimalDigits      = NumberFormatInfo.InvariantInfo.NumberDecimalDigits,
+			NumberDecimalSeparator   = ".",
+			NumberGroupSeparator     = NumberFormatInfo.InvariantInfo.NumberGroupSeparator,
+			NumberGroupSizes         = NumberFormatInfo.InvariantInfo.NumberGroupSizes,
+			NumberNegativePattern    = NumberFormatInfo.InvariantInfo.NumberNegativePattern,
+			PercentDecimalDigits     = NumberFormatInfo.InvariantInfo.PercentDecimalDigits,
+			PercentDecimalSeparator  = ".",
+			PercentGroupSeparator    = NumberFormatInfo.InvariantInfo.PercentGroupSeparator,
+			PercentGroupSizes        = NumberFormatInfo.InvariantInfo.PercentGroupSizes,
+			PercentNegativePattern   = NumberFormatInfo.InvariantInfo.PercentNegativePattern,
+			PercentPositivePattern   = NumberFormatInfo.InvariantInfo.PercentPositivePattern,
+			PercentSymbol            = NumberFormatInfo.InvariantInfo.PercentSymbol,
+			PerMilleSymbol           = NumberFormatInfo.InvariantInfo.PerMilleSymbol,
+			PositiveInfinitySymbol   = NumberFormatInfo.InvariantInfo.PositiveInfinitySymbol,
+			PositiveSign             = NumberFormatInfo.InvariantInfo.PositiveSign,
+		};
+
+		public virtual void BuildValue(StringBuilder sb, object value)
+		{
+			if      (value == null)     sb.Append("NULL");
+			else if (value is string)   BuildString(sb, value.ToString());
+			else if (value is char)     BuildChar  (sb, (char)value);
+			else if (value is bool)     sb.Append((bool)value ? "1" : "0");
+			else if (value is DateTime) BuildDateTime(sb, value);
+			else if (value is Guid)     sb.Append('\'').Append(value).Append('\'');
+			else if (value is decimal)  sb.Append(((decimal)value).ToString(NumberFormatInfo));
+			else if (value is double)   sb.Append(((double) value).ToString(NumberFormatInfo));
+			else if (value is float)    sb.Append(((float)  value).ToString(NumberFormatInfo));
+			else
+			{
+				var type = value.GetType();
+
+				if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
+				{
+					type = type.GetGenericArguments()[0];
+
+					if (type.IsEnum)
+					{
+						lock (_nullableValueReader)
+						{
+							INullableValueReader reader;
+
+							if (_nullableValueReader.TryGetValue(type, out reader) == false)
+							{
+								reader = (INullableValueReader)Activator.CreateInstance(typeof(NullableValueReader<>).MakeGenericType(type));
+								_nullableValueReader.Add(type, reader);
+							}
+
+							value = reader.GetValue(value);
+						}
+					}
+				}
+
+				if (type.IsEnum)
+				{
+					value = Map.EnumToValue(value);
+
+					if (value != null && !value.GetType().IsEnum)
+						BuildValue(sb, value);
+					else
+						sb.Append(value);
+				}
+				else
+					sb.Append(value);
+			}
+		}
+
+		protected virtual void BuildString(StringBuilder sb, string value)
+		{
+			sb
+				.Append('\'')
+				.Append(value.Replace("'", "''"))
+				.Append('\'');
+		}
+
+		protected virtual void BuildChar(StringBuilder sb, char value)
+		{
+			sb.Append('\'');
+
+			if (value == '\'') sb.Append("''");
+			else               sb.Append(value);
+
+			sb.Append('\'');
+		}
+
+		protected virtual void BuildDateTime(StringBuilder sb, object value)
+		{
+			sb.Append(string.Format("'{0:yyyy-MM-dd HH:mm:ss.fff}'", value));
+		}
+
+		#endregion
+
+		#region BuildBinaryExpression
+
+		protected virtual void BuildBinaryExpression(StringBuilder sb, SqlBinaryExpression expr)
+		{
+			BuildBinaryExpression(sb, expr.Operation, expr);
+		}
+
+		protected void BuildFunction(StringBuilder sb, string name, SqlBinaryExpression expr)
+		{
+			sb.Append(name);
+			sb.Append("(");
+			BuildExpression(sb, expr.Expr1);
+			sb.Append(", ");
+			BuildExpression(sb, expr.Expr2);
+			sb.Append(')');
+		}
+
+		protected void BuildBinaryExpression(StringBuilder sb, string op, SqlBinaryExpression expr)
+		{
+			if (expr.Operation == "*" && expr.Expr1 is SqlValue)
+			{
+				var value = (SqlValue)expr.Expr1;
+
+				if (value.Value is int && (int)value.Value == -1)
+				{
+					sb.Append('-');
+					BuildExpression(sb, GetPrecedence(expr), expr.Expr2);
+					return;
+				}
+			}
+
+			BuildExpression(sb, GetPrecedence(expr), expr.Expr1);
+			sb.Append(' ').Append(op).Append(' ');
+			BuildExpression(sb, GetPrecedence(expr), expr.Expr2);
+		}
+
+		#endregion
+
+		#region BuildFunction
+
+		protected virtual void BuildFunction(StringBuilder sb, SqlFunction func)
+		{
+			if (func.Name == "CASE")
+			{
+				sb.Append(func.Name).AppendLine();
+
+				Indent++;
+
+				var i = 0;
+
+				for (; i < func.Parameters.Length - 1; i += 2)
+				{
+					AppendIndent(sb).Append("WHEN ");
+
+					var len = sb.Length;
+
+					BuildExpression(sb, func.Parameters[i]);
+
+					if (SqlExpression.NeedsEqual(func.Parameters[i]))
+					{
+						sb.Append(" = ");
+						BuildValue(sb, true);
+					}
+
+					if (sb.Length - len > 20)
+					{
+						sb.AppendLine();
+						AppendIndent(sb).Append("\tTHEN ");
+					}
+					else
+						sb.Append(" THEN ");
+
+					BuildExpression(sb, func.Parameters[i+1]);
+					sb.AppendLine();
+				}
+
+				if (i < func.Parameters.Length)
+				{
+					AppendIndent(sb).Append("ELSE ");
+					BuildExpression(sb, func.Parameters[i]);
+					sb.AppendLine();
+				}
+
+				Indent--;
+
+				AppendIndent(sb).Append("END");
+			}
+			else
+				BuildFunction(sb, func.Name, func.Parameters);
+		}
+
+		protected void BuildFunction(StringBuilder sb, string name, ISqlExpression[] exprs)
+		{
+			sb.Append(name).Append('(');
+
+			var first = true;
+
+			foreach (var parameter in exprs)
+			{
+				if (!first)
+					sb.Append(", ");
+
+				BuildExpression(sb, parameter, true, !first || name == "EXISTS");
+
+				first = false;
+			}
+
+			sb.Append(')');
+		}
+
+		#endregion
+
+		#region BuildDataType
+	
+		protected virtual void BuildDataType(StringBuilder sb, SqlDataType type)
+		{
+			sb.Append(type.SqlDbType.ToString());
+
+			if (type.Length > 0)
+				sb.Append('(').Append(type.Length).Append(')');
+
+			if (type.Precision > 0)
+				sb.Append('(').Append(type.Precision).Append(',').Append(type.Scale).Append(')');
+		}
+
+		#endregion
+
+		#region GetPrecedence
+
+		protected virtual int GetPrecedence(ISqlExpression expr)
+		{
+			return expr.Precedence;
+		}
+
+		protected virtual int GetPrecedence(ISqlPredicate predicate)
+		{
+			return predicate.Precedence;
+		}
+
+		#endregion
+
+		#endregion
+
+		#region Internal Types
+
+		public enum Step
+		{
+			SelectClause,
+			DeleteClause,
+			UpdateClause,
+			InsertClause,
+			FromClause,
+			WhereClause,
+			GroupByClause,
+			HavingClause,
+			OrderByClause,
+			OffsetLimit
+		}
+
+		#endregion
+
+		#region Alternative Builders
+
+		protected virtual void BuildAliases(StringBuilder sb, string table, List<SqlQuery.Column> columns, string postfix)
+		{
+			Indent++;
+
+			var first = true;
+
+			foreach (var col in columns)
+			{
+				if (!first)
+					sb.Append(',').AppendLine();
+				first = false;
+
+				AppendIndent(sb).AppendFormat("{0}.{1}", table, Convert(col.Alias, ConvertType.NameToQueryFieldAlias));
+
+				if (postfix != null)
+					sb.Append(postfix);
+			}
+
+			Indent--;
+
+			sb.AppendLine();
+		}
+
+		protected void AlternativeBuildSql(StringBuilder sb, bool implementOrderBy, Action<StringBuilder> buildSql)
+		{
+			if (NeedSkip)
+			{
+				var aliases  = GetTempAliases(2, "t");
+				var rnaliase = GetTempAliases(1, "rn")[0];
+
+				AppendIndent(sb).Append("SELECT *").AppendLine();
+				AppendIndent(sb).Append("FROM").    AppendLine();
+				AppendIndent(sb).Append("(").       AppendLine();
+				Indent++;
+
+				AppendIndent(sb).Append("SELECT").AppendLine();
+
+				Indent++;
+				AppendIndent(sb).AppendFormat("{0}.*,", aliases[0]).AppendLine();
+				AppendIndent(sb).Append("ROW_NUMBER() OVER");
+
+				if (!SqlQuery.OrderBy.IsEmpty && !implementOrderBy)
+					sb.Append("()");
+				else
+				{
+					sb.AppendLine();
+					AppendIndent(sb).Append("(").AppendLine();
+
+					Indent++;
+
+					if (SqlQuery.OrderBy.IsEmpty)
+					{
+						AppendIndent(sb).Append("ORDER BY").AppendLine();
+						BuildAliases(sb, aliases[0], SqlQuery.Select.Columns.Take(1).ToList(), null);
+					}
+					else
+						BuildAlternativeOrderBy(sb, true);
+
+					Indent--;
+					AppendIndent(sb).Append(")");
+				}
+
+				sb.Append(" as ").Append(rnaliase).AppendLine();
+				Indent--;
+
+				AppendIndent(sb).Append("FROM").AppendLine();
+				AppendIndent(sb).Append("(").AppendLine();
+
+				Indent++;
+				buildSql(sb);
+				Indent--;
+
+				AppendIndent(sb).AppendFormat(") {0}", aliases[0]).AppendLine();
+
+				Indent--;
+
+				AppendIndent(sb).AppendFormat(") {0}", aliases[1]).AppendLine();
+				AppendIndent(sb).Append("WHERE").AppendLine();
+
+				Indent++;
+
+				if (NeedTake)
+				{
+					var expr1 = Add(SqlQuery.Select.SkipValue, 1);
+					var expr2 = Add<int>(SqlQuery.Select.SkipValue, SqlQuery.Select.TakeValue);
+
+					if (expr1 is SqlValue && expr2 is SqlValue && Equals(((SqlValue)expr1).Value, ((SqlValue)expr2).Value))
+					{
+						AppendIndent(sb).AppendFormat("{0}.{1} = ", aliases[1], rnaliase);
+						BuildExpression(sb, expr1);
+					}
+					else
+					{
+						AppendIndent(sb).AppendFormat("{0}.{1} BETWEEN ", aliases[1], rnaliase);
+						BuildExpression(sb, expr1);
+						sb.Append(" AND ");
+						BuildExpression(sb, expr2);
+					}
+				}
+				else
+				{
+					AppendIndent(sb).AppendFormat("{0}.{1} > ", aliases[1], rnaliase);
+					BuildExpression(sb, SqlQuery.Select.SkipValue);
+				}
+
+				sb.AppendLine();
+				Indent--;
+			}
+			else
+				buildSql(sb);
+		}
+
+		protected void AlternativeBuildSql2(StringBuilder sb, Action<StringBuilder> buildSql)
+		{
+			var aliases = GetTempAliases(3, "t");
+
+			AppendIndent(sb).Append("SELECT *").AppendLine();
+			AppendIndent(sb).Append("FROM")    .AppendLine();
+			AppendIndent(sb).Append("(")       .AppendLine();
+			Indent++;
+
+			AppendIndent(sb).Append("SELECT TOP ");
+			BuildExpression(sb, SqlQuery.Select.TakeValue);
+			sb.Append(" *").AppendLine();
+			AppendIndent(sb).Append("FROM").AppendLine();
+			AppendIndent(sb).Append("(")   .AppendLine();
+			Indent++;
+
+			if (SqlQuery.OrderBy.IsEmpty)
+			{
+				AppendIndent(sb).Append("SELECT TOP ");
+
+				var p = SqlQuery.Select.SkipValue as SqlParameter;
+
+				if (p != null && !p.IsQueryParameter && SqlQuery.Select.TakeValue is SqlValue)
+					BuildValue(sb, (int)p.Value + (int)((SqlValue)(SqlQuery.Select.TakeValue)).Value);
+				else
+					BuildExpression(sb, Add<int>(SqlQuery.Select.SkipValue, SqlQuery.Select.TakeValue));
+
+				sb.Append(" *").AppendLine();
+				AppendIndent(sb).Append("FROM").AppendLine();
+				AppendIndent(sb).Append("(")   .AppendLine();
+				Indent++;
+			}
+
+			buildSql(sb);
+
+			if (SqlQuery.OrderBy.IsEmpty)
+			{
+				Indent--;
+				AppendIndent(sb).AppendFormat(") {0}", aliases[2]).AppendLine();
+				AppendIndent(sb).Append("ORDER BY").AppendLine();
+				BuildAliases(sb, aliases[2], SqlQuery.Select.Columns, null);
+			}
+
+			Indent--;
+			AppendIndent(sb).AppendFormat(") {0}", aliases[1]).AppendLine();
+
+			if (SqlQuery.OrderBy.IsEmpty)
+			{
+				AppendIndent(sb).Append("ORDER BY").AppendLine();
+				BuildAliases(sb, aliases[1], SqlQuery.Select.Columns, " DESC");
+			}
+			else
+			{
+				BuildAlternativeOrderBy(sb, false);
+			}
+
+			Indent--;
+			AppendIndent(sb).AppendFormat(") {0}", aliases[0]).AppendLine();
+
+			if (SqlQuery.OrderBy.IsEmpty)
+			{
+				AppendIndent(sb).Append("ORDER BY").AppendLine();
+				BuildAliases(sb, aliases[0], SqlQuery.Select.Columns, null);
+			}
+			else
+			{
+				BuildAlternativeOrderBy(sb, true);
+			}
+		}
+
+		protected void BuildAlternativeOrderBy(StringBuilder sb, bool ascending)
+		{
+			AppendIndent(sb).Append("ORDER BY").AppendLine();
+
+			var obys = GetTempAliases(SqlQuery.OrderBy.Items.Count, "oby");
+
+			Indent++;
+
+			for (var i = 0; i < obys.Length; i++)
+			{
+				AppendIndent(sb).Append(obys[i]);
+
+				if ( ascending &&  SqlQuery.OrderBy.Items[i].IsDescending ||
+					!ascending && !SqlQuery.OrderBy.Items[i].IsDescending)
+					sb.Append(" DESC");
+
+				if (i + 1 < obys.Length)
+					sb.Append(',');
+
+				sb.AppendLine();
+			}
+
+			Indent--;
+		}
+
+		protected delegate IEnumerable<SqlQuery.Column> ColumnSelector();
+
+		protected IEnumerable<SqlQuery.Column> AlternativeGetSelectedColumns(ColumnSelector columnSelector)
+		{
+			foreach (var col in columnSelector())
+				yield return col;
+
+			var obys = GetTempAliases(SqlQuery.OrderBy.Items.Count, "oby");
+
+			for (var i = 0; i < obys.Length; i++)
+				yield return new SqlQuery.Column(SqlQuery, SqlQuery.OrderBy.Items[i].Expression, obys[i]);
+		}
+
+		protected bool IsDateDataType(ISqlExpression expr, string dateName)
+		{
+			switch (expr.ElementType)
+			{
+				case QueryElementType.SqlDataType   : return ((SqlDataType)  expr).SqlDbType == SqlDbType.Date;
+				case QueryElementType.SqlExpression : return ((SqlExpression)expr).Expr      == dateName;
+			}
+
+			return false;
+		}
+
+		protected bool IsTimeDataType(ISqlExpression expr)
+		{
+			switch (expr.ElementType)
+			{
+				case QueryElementType.SqlDataType   : return ((SqlDataType)expr).  SqlDbType == SqlDbType.Time;
+				case QueryElementType.SqlExpression : return ((SqlExpression)expr).Expr      == "Time";
+			}
+
+			return false;
+		}
+
+		protected ISqlExpression FloorBeforeConvert(SqlFunction func)
+		{
+			var par1 = func.Parameters[1];
+
+			return TypeHelper.IsFloatType(par1.SystemType) && TypeHelper.IsIntegerType(func.SystemType) ?
+				new SqlFunction(func.SystemType, "Floor", par1) : par1;
+		}
+
+		protected ISqlExpression AlternativeConvertToBoolean(SqlFunction func, int paramNumber)
+		{
+			var par = func.Parameters[paramNumber];
+
+			if (TypeHelper.IsFloatType(par.SystemType) || TypeHelper.IsIntegerType(par.SystemType))
+			{
+				var sc = new SqlQuery.SearchCondition();
+
+				sc.Conditions.Add(
+					new SqlQuery.Condition(false, new SqlQuery.Predicate.ExprExpr(par, SqlQuery.Predicate.Operator.Equal, new SqlValue(0))));
+
+				return ConvertExpression(new SqlFunction(func.SystemType, "CASE", sc, new SqlValue(false), new SqlValue(true)));
+			}
+
+			return null;
+		}
+
+		protected SqlQuery GetAlternativeDelete(SqlQuery sqlQuery)
+		{
+			if (sqlQuery.IsDelete && 
+				(sqlQuery.From.Tables.Count > 1 || sqlQuery.From.Tables[0].Joins.Count > 0) && 
+				sqlQuery.From.Tables[0].Source is SqlTable)
+			{
+				var sql = new SqlQuery { QueryType = QueryType.Delete, IsParameterDependent = sqlQuery.IsParameterDependent };
+
+				sqlQuery.ParentSql = sql;
+				sqlQuery.QueryType = QueryType.Select;
+
+				var table = (SqlTable)sqlQuery.From.Tables[0].Source;
+				var copy  = new SqlTable(table) { Alias = null };
+
+				var tableKeys = table.GetKeys(true);
+				var copyKeys  = copy. GetKeys(true);
+
+				if (sqlQuery.Where.SearchCondition.Conditions.Any(c => c.IsOr))
+				{
+					var sc1 = new SqlQuery.SearchCondition(sqlQuery.Where.SearchCondition.Conditions);
+					var sc2 = new SqlQuery.SearchCondition();
+
+					for (var i = 0; i < tableKeys.Count; i++)
+					{
+						sc2.Conditions.Add(new SqlQuery.Condition(
+							false,
+							new SqlQuery.Predicate.ExprExpr(copyKeys[i], SqlQuery.Predicate.Operator.Equal, tableKeys[i])));
+					}
+
+					sqlQuery.Where.SearchCondition.Conditions.Clear();
+					sqlQuery.Where.SearchCondition.Conditions.Add(new SqlQuery.Condition(false, sc1));
+					sqlQuery.Where.SearchCondition.Conditions.Add(new SqlQuery.Condition(false, sc2));
+				}
+				else
+				{
+					for (var i = 0; i < tableKeys.Count; i++)
+						sqlQuery.Where.Expr(copyKeys[i]).Equal.Expr(tableKeys[i]);
+				}
+
+				sql.From.Table(copy).Where.Exists(sqlQuery);
+				sql.Parameters.AddRange(sqlQuery.Parameters);
+
+				sqlQuery.Parameters.Clear();
+
+				sqlQuery = sql;
+			}
+
+			return sqlQuery;
+		}
+
+		protected SqlQuery GetAlternativeUpdate(SqlQuery sqlQuery)
+		{
+			if (sqlQuery.IsUpdate && (sqlQuery.From.Tables[0].Source is SqlTable || sqlQuery.Update.Table != null))
+			{
+				if (sqlQuery.From.Tables.Count > 1 || sqlQuery.From.Tables[0].Joins.Count > 0)
+				{
+					var sql = new SqlQuery { QueryType = QueryType.Update, IsParameterDependent = sqlQuery.IsParameterDependent };
+
+					sqlQuery.ParentSql = sql;
+					sqlQuery.QueryType = QueryType.Select;
+
+					var table = sqlQuery.Update.Table ?? (SqlTable)sqlQuery.From.Tables[0].Source;
+
+					if (sqlQuery.Update.Table != null)
+						if (new QueryVisitor().Find(sqlQuery.From, t => t == table) == null)
+							table = (SqlTable)new QueryVisitor().Find(sqlQuery.From,
+								ex => ex is SqlTable && ((SqlTable)ex).ObjectType == table.ObjectType) ?? table;
+
+					var copy = new SqlTable(table);
+
+					var tableKeys = table.GetKeys(true);
+					var copyKeys  = copy. GetKeys(true);
+
+					for (var i = 0; i < tableKeys.Count; i++)
+						sqlQuery.Where
+							.Expr(copyKeys[i]).Equal.Expr(tableKeys[i]);
+
+					sql.From.Table(copy).Where.Exists(sqlQuery);
+
+					var map = new Dictionary<SqlField, SqlField>(table.Fields.Count);
+
+					foreach (var field in table.Fields.Values)
+						map.Add(field, copy[field.Name]);
+
+					foreach (var item in sqlQuery.Update.Items)
+					{
+						var ex = new QueryVisitor().Convert(item, expr =>
+						{
+							var fld = expr as SqlField;
+							return fld != null && map.TryGetValue(fld, out fld) ? fld : expr;
+						});
+
+						sql.Update.Items.Add(ex);
+					}
+
+					sql.Parameters.AddRange(sqlQuery.Parameters);
+					sql.Update.Table = sqlQuery.Update.Table;
+
+					sqlQuery.Parameters.Clear();
+					sqlQuery.Update.Items.Clear();
+
+					sqlQuery = sql;
+				}
+
+				sqlQuery.From.Tables[0].Alias = "$";
+			}
+
+			return sqlQuery;
+		}
+
+		static bool IsBooleanParameter(ISqlExpression expr, int count, int i)
+		{
+			if ((i % 2 == 1 || i == count - 1) && expr.SystemType == typeof(bool) || expr.SystemType == typeof(bool?))
+			{
+				switch (expr.ElementType)
+				{
+					case QueryElementType.SearchCondition : return true;
+				}
+			}
+
+			return false;
+		}
+
+		protected SqlFunction ConvertFunctionParameters(SqlFunction func)
+		{
+			if (func.Name == "CASE" &&
+				func.Parameters.Select((p,i) => new { p, i }).Any(p => IsBooleanParameter(p.p, func.Parameters.Length, p.i)))
+			{
+				return new SqlFunction(
+					func.SystemType,
+					func.Name,
+					func.Precedence,
+					func.Parameters.Select((p,i) =>
+						IsBooleanParameter(p, func.Parameters.Length, i) ?
+							ConvertExpression(new SqlFunction(typeof(bool), "CASE", p, new SqlValue(true), new SqlValue(false))) :
+							p
+					).ToArray());
+			}
+
+			return func;
+		}
+
+		#endregion
+
+		#region Helpers
+
+		protected SequenceNameAttribute GetSequenceNameAttribute(SqlTable table, bool throwException)
+		{
+			var identityField = table.GetIdentityField();
+
+			if (identityField == null)
+				if (throwException)
+					throw new SqlException("Identity field must be defined for '{0}'.", table.Name);
+				else
+					return null;
+
+			if (table.ObjectType == null)
+				if (throwException)
+					throw new SqlException("Sequence name can not be retrieved for the '{0}' table.", table.Name);
+				else
+					return null;
+
+			var attrs = table.SequenceAttributes;
+
+			if (attrs == null)
+				if (throwException)
+					throw new SqlException("Sequence name can not be retrieved for the '{0}' table.", table.Name);
+				else
+					return null;
+
+			SequenceNameAttribute defaultAttr = null;
+
+			foreach (var attr in attrs)
+			{
+				if (attr.ProviderName == Name)
+					return attr;
+
+				if (defaultAttr == null && attr.ProviderName == null)
+					defaultAttr = attr;
+			}
+
+			if (defaultAttr == null)
+				if (throwException)
+					throw new SqlException("Sequence name can not be retrieved for the '{0}' table.", table.Name);
+				else
+					return null;
+
+			return defaultAttr;
+		}
+
+		static string SetAlias(string alias, int maxLen)
+		{
+			if (alias == null)
+				return null;
+
+			alias = alias.TrimStart('_');
+
+			var cs      = alias.ToCharArray();
+			var replace = false;
+
+			for (var i = 0; i < cs.Length; i++)
+			{
+				var c = cs[i];
+
+				if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9' || c == '_')
+					continue;
+
+				cs[i] = ' ';
+				replace = true;
+			}
+
+			if (replace)
+				alias = new string(cs).Replace(" ", "");
+
+			return alias.Length == 0 || alias.Length > maxLen ? null : alias;
+		}
+
+		protected void CheckAliases(SqlQuery sqlQuery, int maxLen)
+		{
+			new QueryVisitor().Visit(sqlQuery, e =>
+			{
+				switch (e.ElementType)
+				{
+					case QueryElementType.SqlField     : ((SqlField)            e).Alias = SetAlias(((SqlField)            e).Alias, maxLen); break;
+					case QueryElementType.SqlParameter : ((SqlParameter)        e).Name  = SetAlias(((SqlParameter)        e).Name,  maxLen); break;
+					case QueryElementType.SqlTable     : ((SqlTable)            e).Alias = SetAlias(((SqlTable)            e).Alias, maxLen); break;
+					case QueryElementType.Join         : ((Join)                e).Alias = SetAlias(((Join)                e).Alias, maxLen); break;
+					case QueryElementType.Column       : ((SqlQuery.Column)     e).Alias = SetAlias(((SqlQuery.Column)     e).Alias, maxLen); break;
+					case QueryElementType.TableSource  : ((SqlQuery.TableSource)e).Alias = SetAlias(((SqlQuery.TableSource)e).Alias, maxLen); break;
+				}
+			});
+		}
+
+		static bool Wrap(int precedence, int parentPrecedence)
+		{
+			return
+				precedence == 0 ||
+				precedence < parentPrecedence ||
+				(precedence == parentPrecedence && 
+					(parentPrecedence == Precedence.Subtraction ||
+					 parentPrecedence == Precedence.LogicalNegation));
+		}
+
+		protected string[] GetTempAliases(int n, string defaultAlias)
+		{
+			return SqlQuery.GetTempAliases(n, defaultAlias + (Nesting == 0? "": "n" + Nesting));
+		}
+
+		protected static string GetTableAlias(ISqlTableSource table)
+		{
+			switch (table.ElementType)
+			{
+				case QueryElementType.TableSource :
+					var ts    = (SqlQuery.TableSource)table;
+					var alias = string.IsNullOrEmpty(ts.Alias) ? GetTableAlias(ts.Source) : ts.Alias;
+					return alias != "$" ? alias : null;
+
+				case QueryElementType.SqlTable :
+					return ((SqlTable)table).Alias;
+
+				default :
+					throw new InvalidOperationException();
+			}
+		}
+
+		string GetTablePhysicalName(ISqlTableSource table, string alias)
+		{
+			switch (table.ElementType)
+			{
+				case QueryElementType.SqlTable :
+					{
+						var tbl = (SqlTable)table;
+
+						var database     = tbl.Database     == null ? null : Convert(tbl.Database,     ConvertType.NameToDatabase).  ToString();
+						var owner        = tbl.Owner        == null ? null : Convert(tbl.Owner,        ConvertType.NameToOwner).     ToString();
+						var physicalName = tbl.PhysicalName == null ? null : Convert(tbl.PhysicalName, ConvertType.NameToQueryTable).ToString();
+
+						var sb = new StringBuilder();
+
+						if (tbl.SqlTableType == SqlTableType.Expression)
+						{
+							if (tbl.TableArguments == null)
+								physicalName = tbl.PhysicalName;
+							else
+							{
+								var values = new object[tbl.TableArguments.Length + 2];
+
+								values[0] = physicalName;
+								values[1] = Convert(alias, ConvertType.NameToQueryTableAlias);
+
+								for (var i = 2; i < values.Length; i++)
+								{
+									var value = tbl.TableArguments[i - 2];
+
+									sb.Length = 0;
+									BuildExpression(sb, Precedence.Primary, value);
+									values[i] = sb.ToString();
+								}
+
+								physicalName = string.Format(tbl.Name, values);
+
+								sb.Length = 0;
+							}
+						}
+
+						BuildTableName(sb, database, owner, physicalName);
+
+						if (tbl.SqlTableType == SqlTableType.Function)
+						{
+							sb.Append('(');
+
+							if (tbl.TableArguments != null && tbl.TableArguments.Length > 0)
+							{
+								var first = true;
+
+								foreach (var arg in tbl.TableArguments)
+								{
+									if (!first)
+										sb.Append(", ");
+
+									BuildExpression(sb, arg, true, !first);
+
+									first = false;
+								}
+							}
+
+							sb.Append(')');
+						}
+
+						return sb.ToString();
+					}
+
+				case QueryElementType.TableSource :
+					return GetTablePhysicalName(((SqlQuery.TableSource)table).Source, alias);
+
+				default :
+					throw new InvalidOperationException();
+			}
+		}
+
+		protected StringBuilder AppendIndent(StringBuilder sb)
+		{
+			if (Indent > 0)
+				sb.Append('\t', Indent);
+
+			return sb;
+		}
+
+		public ISqlExpression Add(ISqlExpression expr1, ISqlExpression expr2, Type type)
+		{
+			return ConvertExpression(new SqlBinaryExpression(type, expr1, "+", expr2, Precedence.Additive));
+		}
+
+		public ISqlExpression Add<T>(ISqlExpression expr1, ISqlExpression expr2)
+		{
+			return Add(expr1, expr2, typeof(T));
+		}
+
+		public ISqlExpression Add(ISqlExpression expr1, int value)
+		{
+			return Add<int>(expr1, new SqlValue(value));
+		}
+
+		public ISqlExpression Inc(ISqlExpression expr1)
+		{
+			return Add(expr1, 1);
+		}
+
+		public ISqlExpression Sub(ISqlExpression expr1, ISqlExpression expr2, Type type)
+		{
+			return ConvertExpression(new SqlBinaryExpression(type, expr1, "-", expr2, Precedence.Subtraction));
+		}
+
+		public ISqlExpression Sub<T>(ISqlExpression expr1, ISqlExpression expr2)
+		{
+			return Sub(expr1, expr2, typeof(T));
+		}
+
+		public ISqlExpression Sub(ISqlExpression expr1, int value)
+		{
+			return Sub<int>(expr1, new SqlValue(value));
+		}
+
+		public ISqlExpression Dec(ISqlExpression expr1)
+		{
+			return Sub(expr1, 1);
+		}
+
+		public ISqlExpression Mul(ISqlExpression expr1, ISqlExpression expr2, Type type)
+		{
+			return ConvertExpression(new SqlBinaryExpression(type, expr1, "*", expr2, Precedence.Multiplicative));
+		}
+
+		public ISqlExpression Mul<T>(ISqlExpression expr1, ISqlExpression expr2)
+		{
+			return Mul(expr1, expr2, typeof(T));
+		}
+
+		public ISqlExpression Mul(ISqlExpression expr1, int value)
+		{
+			return Mul<int>(expr1, new SqlValue(value));
+		}
+
+		public ISqlExpression Div(ISqlExpression expr1, ISqlExpression expr2, Type type)
+		{
+			return ConvertExpression(new SqlBinaryExpression(type, expr1, "/", expr2, Precedence.Multiplicative));
+		}
+
+		public ISqlExpression Div<T>(ISqlExpression expr1, ISqlExpression expr2)
+		{
+			return Div(expr1, expr2, typeof(T));
+		}
+
+		public ISqlExpression Div(ISqlExpression expr1, int value)
+		{
+			return Div<int>(expr1, new SqlValue(value));
+		}
+
+		#endregion
+
+		#region DataTypes
+
+		protected virtual int GetMaxLength     (SqlDataType type) { return SqlDataType.GetMaxLength     (type.SqlDbType); }
+		protected virtual int GetMaxPrecision  (SqlDataType type) { return SqlDataType.GetMaxPrecision  (type.SqlDbType); }
+		protected virtual int GetMaxScale      (SqlDataType type) { return SqlDataType.GetMaxScale      (type.SqlDbType); }
+		protected virtual int GetMaxDisplaySize(SqlDataType type) { return SqlDataType.GetMaxDisplaySize(type.SqlDbType); }
+
+		protected virtual ISqlExpression ConvertConvertion(SqlFunction func)
+		{
+			var from = (SqlDataType)func.Parameters[1];
+			var to   = (SqlDataType)func.Parameters[0];
+
+			if (to.Type == typeof(object))
+				return func.Parameters[2];
+
+			if (to.Precision > 0)
+			{
+				var maxPrecision = GetMaxPrecision(from);
+				var maxScale     = GetMaxScale    (from);
+				var newPrecision = maxPrecision >= 0 ? Math.Min(to.Precision, maxPrecision) : to.Precision;
+				var newScale     = maxScale     >= 0 ? Math.Min(to.Scale,     maxScale)     : to.Scale;
+
+				if (to.Precision != newPrecision || to.Scale != newScale)
+					to = new SqlDataType(to.SqlDbType, to.Type, newPrecision, newScale);
+			}
+			else if (to.Length > 0)
+			{
+				var maxLength = to.Type == typeof(string) ? GetMaxDisplaySize(from) : GetMaxLength(from);
+				var newLength = maxLength >= 0 ? Math.Min(to.Length, maxLength) : to.Length;
+
+				if (to.Length != newLength)
+					to = new SqlDataType(to.SqlDbType, to.Type, newLength);
+			}
+			else if (from.Type == typeof(short) && to.Type == typeof(int))
+				return func.Parameters[2];
+
+			return ConvertExpression(new SqlFunction(func.SystemType, "Convert", to, func.Parameters[2]));
+		}
+
+		#endregion
+
+		#region ISqlProvider Members
+
+		public virtual ISqlExpression ConvertExpression(ISqlExpression expression)
+		{
+			switch (expression.ElementType)
+			{
+				case QueryElementType.SqlBinaryExpression:
+
+					#region SqlBinaryExpression
+
+					{
+						var be = (SqlBinaryExpression)expression;
+
+						switch (be.Operation)
+						{
+							case "+":
+								if (be.Expr1 is SqlValue)
+								{
+									var v1 = (SqlValue)be.Expr1;
+									if (v1.Value is int    && (int)   v1.Value == 0 ||
+										v1.Value is string && (string)v1.Value == "") return be.Expr2;
+								}
+
+								if (be.Expr2 is SqlValue)
+								{
+									var v2 = (SqlValue) be.Expr2;
+
+									if (v2.Value is int)
+									{
+										if ((int)v2.Value == 0) return be.Expr1;
+
+										if (be.Expr1 is SqlBinaryExpression)
+										{
+											var be1 = (SqlBinaryExpression) be.Expr1;
+
+											if (be1.Expr2 is SqlValue)
+											{
+												var be1v2 = (SqlValue)be1.Expr2;
+
+												if (be1v2.Value is int)
+												{
+													switch (be1.Operation)
+													{
+														case "+":
+															{
+																var value = (int)be1v2.Value + (int)v2.Value;
+																var oper  = be1.Operation;
+
+																if (value < 0)
+																{
+																	value = - value;
+																	oper  = "-";
+																}
+
+																return new SqlBinaryExpression(be.SystemType, be1.Expr1, oper, new SqlValue(value), be.Precedence);
+															}
+
+														case "-":
+															{
+																var value = (int)be1v2.Value - (int)v2.Value;
+																var oper  = be1.Operation;
+
+																if (value < 0)
+																{
+																	value = - value;
+																	oper  = "+";
+																}
+
+																return new SqlBinaryExpression(be.SystemType, be1.Expr1, oper, new SqlValue(value), be.Precedence);
+															}
+													}
+												}
+											}
+										}
+									}
+									else if (v2.Value is string)
+									{
+										if ((string)v2.Value == "") return be.Expr1;
+
+										if (be.Expr1 is SqlBinaryExpression)
+										{
+											var be1 = (SqlBinaryExpression)be.Expr1;
+
+											if (be1.Expr2 is SqlValue)
+											{
+												var value = ((SqlValue)be1.Expr2).Value;
+
+												if (value is string)
+													return new SqlBinaryExpression(
+														be1.SystemType,
+														be1.Expr1,
+														be1.Operation,
+														new SqlValue(string.Concat(value, v2.Value)));
+											}
+										}
+									}
+								}
+
+								if (be.Expr1 is SqlValue && be.Expr2 is SqlValue)
+								{
+									var v1 = (SqlValue)be.Expr1;
+									var v2 = (SqlValue)be.Expr2;
+									if (v1.Value is int    && v2.Value is int)    return new SqlValue((int)v1.Value + (int)v2.Value);
+									if (v1.Value is string || v2.Value is string) return new SqlValue(v1.Value.ToString() + v2.Value);
+								}
+
+								if (be.Expr1.SystemType == typeof(string) && be.Expr2.SystemType != typeof(string))
+								{
+									var len = be.Expr2.SystemType == null ? 100 : SqlDataType.GetMaxDisplaySize(SqlDataType.GetDataType(be.Expr2.SystemType).SqlDbType);
+
+									if (len <= 0)
+										len = 100;
+
+									return new SqlBinaryExpression(
+										be.SystemType,
+										be.Expr1,
+										be.Operation,
+										ConvertExpression(new SqlFunction(typeof(string), "Convert", new SqlDataType(SqlDbType.VarChar, len), be.Expr2)),
+										be.Precedence);
+								}
+
+								if (be.Expr1.SystemType != typeof(string) && be.Expr2.SystemType == typeof(string))
+								{
+									var len = be.Expr1.SystemType == null ? 100 : SqlDataType.GetMaxDisplaySize(SqlDataType.GetDataType(be.Expr1.SystemType).SqlDbType);
+
+									if (len <= 0)
+										len = 100;
+
+									return new SqlBinaryExpression(
+										be.SystemType,
+										ConvertExpression(new SqlFunction(typeof(string), "Convert", new SqlDataType(SqlDbType.VarChar, len), be.Expr1)),
+										be.Operation,
+										be.Expr2,
+										be.Precedence);
+								}
+
+								break;
+
+							case "-":
+								if (be.Expr2 is SqlValue)
+								{
+									var v2 = (SqlValue) be.Expr2;
+
+									if (v2.Value is int)
+									{
+										if ((int)v2.Value == 0) return be.Expr1;
+
+										if (be.Expr1 is SqlBinaryExpression)
+										{
+											var be1 = (SqlBinaryExpression)be.Expr1;
+
+											if (be1.Expr2 is SqlValue)
+											{
+												var be1v2 = (SqlValue)be1.Expr2;
+
+												if (be1v2.Value is int)
+												{
+													switch (be1.Operation)
+													{
+														case "+":
+															{
+																var value = (int)be1v2.Value - (int)v2.Value;
+																var oper  = be1.Operation;
+
+																if (value < 0)
+																{
+																	value = -value;
+																	oper  = "-";
+																}
+
+																return new SqlBinaryExpression(be.SystemType, be1.Expr1, oper, new SqlValue(value), be.Precedence);
+															}
+
+														case "-":
+															{
+																var value = (int)be1v2.Value + (int)v2.Value;
+																var oper  = be1.Operation;
+
+																if (value < 0)
+																{
+																	value = -value;
+																	oper  = "+";
+																}
+
+																return new SqlBinaryExpression(be.SystemType, be1.Expr1, oper, new SqlValue(value), be.Precedence);
+															}
+													}
+												}
+											}
+										}
+									}
+								}
+
+								if (be.Expr1 is SqlValue && be.Expr2 is SqlValue)
+								{
+									var v1 = (SqlValue)be.Expr1;
+									var v2 = (SqlValue)be.Expr2;
+									if (v1.Value is int && v2.Value is int) return new SqlValue((int)v1.Value - (int)v2.Value);
+								}
+
+								break;
+
+							case "*":
+								if (be.Expr1 is SqlValue)
+								{
+									var v1 = (SqlValue)be.Expr1;
+
+									if (v1.Value is int)
+									{
+										var v1v = (int)v1.Value;
+
+										switch (v1v)
+										{
+											case  0 : return new SqlValue(0);
+											case  1 : return be.Expr2;
+											default :
+												{
+													var be2 = be.Expr2 as SqlBinaryExpression;
+
+													if (be2 != null && be2.Operation == "*" && be2.Expr1 is SqlValue)
+													{
+														var be2v1 = be2.Expr1 as SqlValue;
+
+														if (be2v1.Value is int)
+															return ConvertExpression(
+																new SqlBinaryExpression(be2.SystemType, new SqlValue(v1v * (int)be2v1.Value), "*", be2.Expr2));
+													}
+
+													break;
+												}
+
+										}
+									}
+								}
+
+								if (be.Expr2 is SqlValue)
+								{
+									var v2 = (SqlValue)be.Expr2;
+									if (v2.Value is int && (int)v2.Value == 1) return be.Expr1;
+									if (v2.Value is int && (int)v2.Value == 0) return new SqlValue(0);
+								}
+
+								if (be.Expr1 is SqlValue && be.Expr2 is SqlValue)
+								{
+									var v1 = (SqlValue)be.Expr1;
+									var v2 = (SqlValue)be.Expr2;
+
+									if (v1.Value is int)
+									{
+										if (v2.Value is int)    return new SqlValue((int)   v1.Value * (int)   v2.Value);
+										if (v2.Value is double) return new SqlValue((int)   v1.Value * (double)v2.Value);
+									}
+									else if (v1.Value is double)
+									{
+										if (v2.Value is int)    return new SqlValue((double)v1.Value * (int)   v2.Value);
+										if (v2.Value is double) return new SqlValue((double)v1.Value * (double)v2.Value);
+									}
+								}
+
+								break;
+						}
+					}
+
+					#endregion
+
+					break;
+
+				case QueryElementType.SqlFunction:
+
+					#region SqlFunction
+
+					{
+						var func = (SqlFunction)expression;
+
+						switch (func.Name)
+						{
+							case "ConvertToCaseCompareTo":
+								return ConvertExpression(new SqlFunction(func.SystemType, "CASE",
+									new SqlQuery.SearchCondition().Expr(func.Parameters[0]). Greater .Expr(func.Parameters[1]).ToExpr(), new SqlValue(1),
+									new SqlQuery.SearchCondition().Expr(func.Parameters[0]). Equal   .Expr(func.Parameters[1]).ToExpr(), new SqlValue(0),
+									new SqlValue(-1)));
+
+							case "$Convert$": return ConvertConvertion(func);
+							case "Average"  : return new SqlFunction(func.SystemType, "Avg", func.Parameters);
+							case "Max"      :
+							case "Min"      :
+								{
+									if (func.SystemType == typeof(bool) || func.SystemType == typeof(bool?))
+									{
+										return new SqlFunction(typeof(int), func.Name,
+											new SqlFunction(func.SystemType, "CASE", func.Parameters[0], new SqlValue(1), new SqlValue(0)));
+									}
+
+									break;
+								}
+
+							case "CASE"     :
+								{
+									var parms = func.Parameters;
+									var len   = parms.Length;
+
+									for (var i = 0; i < parms.Length - 1; i += 2)
+									{
+										var value = parms[i] as SqlValue;
+
+										if (value != null)
+										{
+											if ((bool)value.Value == false)
+											{
+												var newParms = new ISqlExpression[parms.Length - 2];
+
+												if (i != 0)
+													Array.Copy(parms, 0, newParms, 0, i);
+
+												Array.Copy(parms, i + 2, newParms, i, parms.Length - i - 2);
+
+												parms = newParms;
+												i -= 2;
+											}
+											else
+											{
+												var newParms = new ISqlExpression[i + 1];
+
+												if (i != 0)
+													Array.Copy(parms, 0, newParms, 0, i);
+
+												newParms[i] = parms[i + 1];
+
+												parms = newParms;
+												break;
+											}
+										}
+									}
+
+									if (parms.Length == 1)
+										return parms[0];
+
+									if (parms.Length != len)
+										return new SqlFunction(func.SystemType, func.Name, func.Precedence, parms);
+								}
+
+								break;
+
+							case "Convert":
+								{
+									var from  = func.Parameters[1] as SqlFunction;
+									var typef = TypeHelper.GetUnderlyingType(func.SystemType);
+
+									if (from != null && from.Name == "Convert" && TypeHelper.GetUnderlyingType(from.Parameters[1].SystemType) == typef)
+										return from.Parameters[1];
+
+									var fe = func.Parameters[1] as SqlExpression;
+
+									if (fe != null && fe.Expr == "Cast({0} as {1})" && TypeHelper.GetUnderlyingType(fe.Parameters[0].SystemType) == typef)
+										return fe.Parameters[0];
+								}
+
+								break;
+						}
+					}
+
+					#endregion
+
+					break;
+
+				case QueryElementType.SearchCondition :
+					SqlQuery.OptimizeSearchCondition((SqlQuery.SearchCondition)expression);
+					break;
+
+				case QueryElementType.SqlExpression   :
+					{
+						var se = (SqlExpression)expression;
+
+						if (se.Expr == "{0}" && se.Parameters.Length == 1 && se.Parameters[0] != null)
+							return se.Parameters[0];
+					}
+
+					break;
+			}
+
+			return expression;
+		}
+
+		public virtual ISqlPredicate ConvertPredicate(ISqlPredicate predicate)
+		{
+			switch (predicate.ElementType)
+			{
+				case QueryElementType.ExprExprPredicate:
+					{
+						var expr = (SqlQuery.Predicate.ExprExpr)predicate;
+
+						if (expr.Operator == SqlQuery.Predicate.Operator.Equal && expr.Expr1 is SqlValue && expr.Expr2 is SqlValue)
+						{
+							var value = Equals(((SqlValue)expr.Expr1).Value, ((SqlValue)expr.Expr2).Value);
+							return new SqlQuery.Predicate.Expr(new SqlValue(value), Precedence.Comparison);
+						}
+
+						switch (expr.Operator)
+						{
+							case SqlQuery.Predicate.Operator.Equal         :
+							case SqlQuery.Predicate.Operator.NotEqual      :
+							case SqlQuery.Predicate.Operator.Greater       :
+							case SqlQuery.Predicate.Operator.GreaterOrEqual:
+							case SqlQuery.Predicate.Operator.Less          :
+							case SqlQuery.Predicate.Operator.LessOrEqual   :
+								predicate = OptimizeCase(expr);
+								break;
+						}
+
+						if (predicate is SqlQuery.Predicate.ExprExpr)
+						{
+							expr = (SqlQuery.Predicate.ExprExpr)predicate;
+
+							switch (expr.Operator)
+							{
+								case SqlQuery.Predicate.Operator.Equal :
+								case SqlQuery.Predicate.Operator.NotEqual :
+									var expr1 = expr.Expr1;
+									var expr2 = expr.Expr2;
+
+									if (expr1.CanBeNull() && expr2.CanBeNull())
+									{
+										if (expr1 is SqlParameter || expr2 is SqlParameter)
+											SqlQuery.IsParameterDependent = true;
+										else
+											if (expr1 is SqlQuery.Column || expr1 is SqlField)
+											if (expr2 is SqlQuery.Column || expr2 is SqlField)
+												predicate = ConvertEqualPredicate(expr);
+									}
+
+									break;
+							}
+						}
+					}
+
+					break;
+
+				case QueryElementType.NotExprPredicate:
+					{
+						var expr = (SqlQuery.Predicate.NotExpr)predicate;
+
+						if (expr.IsNot && expr.Expr1 is SqlQuery.SearchCondition)
+						{
+							var sc = (SqlQuery.SearchCondition)expr.Expr1;
+
+							if (sc.Conditions.Count == 1)
+							{
+								var cond = sc.Conditions[0];
+
+								if (cond.IsNot)
+									return cond.Predicate;
+
+								if (cond.Predicate is SqlQuery.Predicate.ExprExpr)
+								{
+									var ee = (SqlQuery.Predicate.ExprExpr)cond.Predicate;
+
+									if (ee.Operator == SqlQuery.Predicate.Operator.Equal)
+										return new SqlQuery.Predicate.ExprExpr(ee.Expr1, SqlQuery.Predicate.Operator.NotEqual, ee.Expr2);
+
+									if (ee.Operator == SqlQuery.Predicate.Operator.NotEqual)
+										return new SqlQuery.Predicate.ExprExpr(ee.Expr1, SqlQuery.Predicate.Operator.Equal, ee.Expr2);
+								}
+							}
+						}
+					}
+
+					break;
+			}
+
+			return predicate;
+		}
+
+		protected ISqlPredicate ConvertEqualPredicate(SqlQuery.Predicate.ExprExpr expr)
+		{
+			var expr1 = expr.Expr1;
+			var expr2 = expr.Expr2;
+			var cond  = new SqlQuery.SearchCondition();
+
+			if (expr.Operator == SqlQuery.Predicate.Operator.Equal)
+				cond
+					.Expr(expr1).IsNull.    And .Expr(expr2).IsNull. Or
+					.Expr(expr1).IsNotNull. And .Expr(expr2).IsNotNull. And .Expr(expr1).Equal.Expr(expr2);
+			else
+				cond
+					.Expr(expr1).IsNull.    And .Expr(expr2).IsNotNull. Or
+					.Expr(expr1).IsNotNull. And .Expr(expr2).IsNull.    Or
+					.Expr(expr1).NotEqual.Expr(expr2);
+
+			return cond;
+		}
+
+		static SqlQuery.Predicate.Operator InvertOperator(SqlQuery.Predicate.Operator op, bool skipEqual)
+		{
+			switch (op)
+			{
+				case SqlQuery.Predicate.Operator.Equal          : return skipEqual ? op : SqlQuery.Predicate.Operator.NotEqual;
+				case SqlQuery.Predicate.Operator.NotEqual       : return skipEqual ? op : SqlQuery.Predicate.Operator.Equal;
+				case SqlQuery.Predicate.Operator.Greater        : return SqlQuery.Predicate.Operator.LessOrEqual;
+				case SqlQuery.Predicate.Operator.NotLess        :
+				case SqlQuery.Predicate.Operator.GreaterOrEqual : return SqlQuery.Predicate.Operator.Less;
+				case SqlQuery.Predicate.Operator.Less           : return SqlQuery.Predicate.Operator.GreaterOrEqual;
+				case SqlQuery.Predicate.Operator.NotGreater     :
+				case SqlQuery.Predicate.Operator.LessOrEqual    : return SqlQuery.Predicate.Operator.Greater;
+				default: throw new InvalidOperationException();
+			}
+		}
+
+		ISqlPredicate OptimizeCase(SqlQuery.Predicate.ExprExpr expr)
+		{
+			var value = expr.Expr1 as SqlValue;
+			var func  = expr.Expr2 as SqlFunction;
+			var valueFirst = false;
+
+			if (value != null && func != null)
+			{
+				valueFirst = true;
+			}
+			else
+			{
+				value = expr.Expr2 as SqlValue;
+				func  = expr.Expr1 as SqlFunction;
+			}
+
+			if (value != null && func != null && func.Name == "CASE")
+			{
+				if (value.Value is int && func.Parameters.Length == 5)
+				{
+					var c1 = func.Parameters[0] as SqlQuery.SearchCondition;
+					var v1 = func.Parameters[1] as SqlValue;
+					var c2 = func.Parameters[2] as SqlQuery.SearchCondition;
+					var v2 = func.Parameters[3] as SqlValue;
+					var v3 = func.Parameters[4] as SqlValue;
+
+					if (c1 != null && c1.Conditions.Count == 1 && v1 != null && v1.Value is int &&
+					    c2 != null && c2.Conditions.Count == 1 && v2 != null && v2.Value is int && v3 != null && v3.Value is int)
+					{
+						var ee1 = c1.Conditions[0].Predicate as SqlQuery.Predicate.ExprExpr;
+						var ee2 = c2.Conditions[0].Predicate as SqlQuery.Predicate.ExprExpr;
+
+						if (ee1 != null && ee2 != null && ee1.Expr1.Equals(ee2.Expr1) && ee1.Expr2.Equals(ee2.Expr2))
+						{
+							int e = 0, g = 0, l = 0;
+
+							if (ee1.Operator == SqlQuery.Predicate.Operator.Equal   || ee2.Operator == SqlQuery.Predicate.Operator.Equal)   e = 1;
+							if (ee1.Operator == SqlQuery.Predicate.Operator.Greater || ee2.Operator == SqlQuery.Predicate.Operator.Greater) g = 1;
+							if (ee1.Operator == SqlQuery.Predicate.Operator.Less    || ee2.Operator == SqlQuery.Predicate.Operator.Less)    l = 1;
+
+							if (e + g + l == 2)
+							{
+								var n  = (int)value.Value;
+								var i1 = (int)v1.Value;
+								var i2 = (int)v2.Value;
+								var i3 = (int)v3.Value;
+
+								var n1 = Compare(valueFirst ? n : i1, valueFirst ? i1 : n, expr.Operator) ? 1 : 0;
+								var n2 = Compare(valueFirst ? n : i2, valueFirst ? i2 : n, expr.Operator) ? 1 : 0;
+								var n3 = Compare(valueFirst ? n : i3, valueFirst ? i3 : n, expr.Operator) ? 1 : 0;
+
+								if (n1 + n2 + n3 == 1)
+								{
+									if (n1 == 1) return ee1;
+									if (n2 == 1) return ee2;
+
+									return ConvertPredicate(new SqlQuery.Predicate.ExprExpr(
+										ee1.Expr1,
+										e == 0 ? SqlQuery.Predicate.Operator.Equal :
+										g == 0 ? SqlQuery.Predicate.Operator.Greater :
+												 SqlQuery.Predicate.Operator.Less,
+										ee1.Expr2));
+								}
+
+								//	CASE
+								//		WHEN [p].[FirstName] > 'John'
+								//			THEN 1
+								//		WHEN [p].[FirstName] = 'John'
+								//			THEN 0
+								//		ELSE -1
+								//	END <= 0
+								if (ee1.Operator == SqlQuery.Predicate.Operator.Greater && i1 == 1 &&
+									ee2.Operator == SqlQuery.Predicate.Operator.Equal   && i2 == 0 &&
+									i3 == -1 && n == 0)
+								{
+									return ConvertPredicate(new SqlQuery.Predicate.ExprExpr(
+										ee1.Expr1,
+										valueFirst ? InvertOperator(expr.Operator, true) : expr.Operator,
+										ee1.Expr2));
+								}
+							}
+						}
+					}
+				}
+				else if (value.Value is bool && func.Parameters.Length == 3)
+				{
+					var c1 = func.Parameters[0] as SqlQuery.SearchCondition;
+					var v1 = func.Parameters[1] as SqlValue;
+					var v2 = func.Parameters[2] as SqlValue;
+
+					if (c1 != null && c1.Conditions.Count == 1 && v1 != null && v1.Value is bool && v2 != null && v2.Value is bool)
+					{
+						var bv  = (bool)value.Value;
+						var bv1 = (bool)v1.Value;
+						var bv2 = (bool)v2.Value;
+
+						if (bv == bv1 && expr.Operator == SqlQuery.Predicate.Operator.Equal ||
+						    bv != bv1 && expr.Operator == SqlQuery.Predicate.Operator.NotEqual)
+						{
+							return c1;
+						}
+
+						if (bv == bv2 && expr.Operator == SqlQuery.Predicate.Operator.NotEqual ||
+						    bv != bv1 && expr.Operator == SqlQuery.Predicate.Operator.Equal)
+						{
+							var ee = c1.Conditions[0].Predicate as SqlQuery.Predicate.ExprExpr;
+
+							if (ee != null)
+							{
+								var op = InvertOperator(ee.Operator, false);
+								return new SqlQuery.Predicate.ExprExpr(ee.Expr1, op, ee.Expr2);
+							}
+
+							var sc = new SqlQuery.SearchCondition();
+
+							sc.Conditions.Add(new SqlQuery.Condition(true, c1));
+
+							return sc;
+						}
+					}
+				}
+				else if (expr.Operator == SqlQuery.Predicate.Operator.Equal && func.Parameters.Length == 3)
+				{
+					var sc = func.Parameters[0] as SqlQuery.SearchCondition;
+					var v1 = func.Parameters[1] as SqlValue;
+					var v2 = func.Parameters[2] as SqlValue;
+
+					if (sc != null && v1 != null && v2 != null)
+					{
+						if (Equals(value.Value, v1.Value))
+							return sc;
+
+						if (Equals(value.Value, v2.Value) && !sc.CanBeNull())
+							return ConvertPredicate(new SqlQuery.Predicate.NotExpr(sc, true, Precedence.LogicalNegation));
+					}
+				}
+			}
+
+			return expr;
+		}
+
+		static bool Compare(int v1, int v2, SqlQuery.Predicate.Operator op)
+		{
+			switch (op)
+			{
+				case SqlQuery.Predicate.Operator.Equal:           return v1 == v2;
+				case SqlQuery.Predicate.Operator.NotEqual:        return v1 != v2;
+				case SqlQuery.Predicate.Operator.Greater:         return v1 >  v2;
+				case SqlQuery.Predicate.Operator.NotLess:
+				case SqlQuery.Predicate.Operator.GreaterOrEqual:  return v1 >= v2;
+				case SqlQuery.Predicate.Operator.Less:            return v1 <  v2;
+				case SqlQuery.Predicate.Operator.NotGreater:
+				case SqlQuery.Predicate.Operator.LessOrEqual:     return v1 <= v2;
+			}
+
+			throw new InvalidOperationException();
+		}
+
+		public virtual SqlQuery Finalize(SqlQuery sqlQuery)
+		{
+			sqlQuery.FinalizeAndValidate(IsApplyJoinSupported, IsGroupByExpressionSupported);
+
+			if (!IsCountSubQuerySupported)  sqlQuery = MoveCountSubQuery (sqlQuery);
+			if (!IsSubQueryColumnSupported) sqlQuery = MoveSubQueryColumn(sqlQuery);
+
+			if (!IsCountSubQuerySupported || !IsSubQueryColumnSupported)
+				sqlQuery.FinalizeAndValidate(IsApplyJoinSupported, IsGroupByExpressionSupported);
+
+			return sqlQuery;
+		}
+
+		SqlQuery MoveCountSubQuery(SqlQuery sqlQuery)
+		{
+			new QueryVisitor().Visit(sqlQuery, MoveCountSubQuery);
+			return sqlQuery;
+		}
+
+		void MoveCountSubQuery(IQueryElement element)
+		{
+			if (element.ElementType != QueryElementType.SqlQuery)
+				return;
+
+			var query = (SqlQuery)element;
+
+			for (var i = 0; i < query.Select.Columns.Count; i++)
+			{
+				var col = query.Select.Columns[i];
+
+				// The column is a subquery.
+				//
+				if (col.Expression.ElementType == QueryElementType.SqlQuery)
+				{
+					var subQuery = (SqlQuery)col.Expression;
+					var isCount  = false;
+
+					// Check if subquery is Count subquery.
+					//
+					if (subQuery.Select.Columns.Count == 1)
+					{
+						var subCol = subQuery.Select.Columns[0];
+
+						if (subCol.Expression.ElementType == QueryElementType.SqlFunction)
+							isCount = ((SqlFunction)subCol.Expression).Name == "Count";
+					}
+
+					if (!isCount)
+						continue;
+
+					// Check if subquery where clause does not have ORs.
+					//
+					SqlQuery.OptimizeSearchCondition(subQuery.Where.SearchCondition);
+
+					var allAnd = true;
+
+					for (var j = 0; allAnd && j < subQuery.Where.SearchCondition.Conditions.Count - 1; j++)
+					{
+						var cond = subQuery.Where.SearchCondition.Conditions[j];
+
+						if (cond.IsOr)
+							allAnd = false;
+					}
+
+					if (!allAnd || !ConvertCountSubQuery(subQuery))
+						continue;
+
+					// Collect tables.
+					//
+					var allTables   = new HashSet<ISqlTableSource>();
+					var levelTables = new HashSet<ISqlTableSource>();
+
+					new QueryVisitor().Visit(subQuery, e =>
+					{
+						if (e is ISqlTableSource)
+							allTables.Add((ISqlTableSource)e);
+					});
+
+					new QueryVisitor().Visit(subQuery, e =>
+					{
+						if (e is ISqlTableSource)
+							if (subQuery.From.IsChild((ISqlTableSource)e))
+								levelTables.Add((ISqlTableSource)e);
+					});
+
+					Func<IQueryElement,bool> checkTable = e =>
+					{
+						switch (e.ElementType)
+						{
+							case QueryElementType.SqlField : return !allTables.Contains(((SqlField)       e).Table);
+							case QueryElementType.Column   : return !allTables.Contains(((SqlQuery.Column)e).Parent);
+						}
+						return false;
+					};
+
+					var join = SqlQuery.LeftJoin(subQuery);
+
+					query.From.Tables[0].Joins.Add(join.JoinedTable);
+
+					for (var j = 0; j < subQuery.Where.SearchCondition.Conditions.Count; j++)
+					{
+						var cond = subQuery.Where.SearchCondition.Conditions[j];
+
+						if (new QueryVisitor().Find(cond, checkTable) == null)
+							continue;
+
+						var replaced = new Dictionary<IQueryElement,IQueryElement>();
+
+						var nc = new QueryVisitor().Convert(cond, e =>
+						{
+							var ne = e;
+
+							switch (e.ElementType)
+							{
+								case QueryElementType.SqlField :
+									if (replaced.TryGetValue(e, out ne))
+										return ne;
+
+									if (levelTables.Contains(((SqlField)e).Table))
+									{
+										subQuery.GroupBy.Expr((SqlField)e);
+										ne = subQuery.Select.Columns[subQuery.Select.Add((SqlField)e)];
+										break;
+									}
+
+									break;
+
+								case QueryElementType.Column   :
+									if (replaced.TryGetValue(e, out ne))
+										return ne;
+
+									if (levelTables.Contains(((SqlQuery.Column)e).Parent))
+									{
+										subQuery.GroupBy.Expr((SqlQuery.Column)e);
+										ne = subQuery.Select.Columns[subQuery.Select.Add((SqlQuery.Column)e)];
+										break;
+									}
+
+									break;
+							}
+
+							if (!ReferenceEquals(e, ne))
+								replaced.Add(e, ne);
+
+							return ne;
+						});
+
+						if (nc != null && !ReferenceEquals(nc, cond))
+						{
+							join.JoinedTable.Condition.Conditions.Add(nc);
+							subQuery.Where.SearchCondition.Conditions.RemoveAt(j);
+							j--;
+						}
+					}
+
+					if (!query.GroupBy.IsEmpty/* && subQuery.Select.Columns.Count > 1*/)
+					{
+						var oldFunc = (SqlFunction)subQuery.Select.Columns[0].Expression;
+
+						subQuery.Select.Columns.RemoveAt(0);
+
+						query.Select.Columns[i].Expression = 
+							new SqlFunction(oldFunc.SystemType, oldFunc.Name, subQuery.Select.Columns[0]);
+					}
+					else
+					{
+						query.Select.Columns[i].Expression = subQuery.Select.Columns[0];
+					}
+				}
+			}
+		}
+
+		SqlQuery MoveSubQueryColumn(SqlQuery sqlQuery)
+		{
+			var dic = new Dictionary<IQueryElement,IQueryElement>();
+
+			new QueryVisitor().Visit(sqlQuery, element =>
+			{
+				if (element.ElementType != QueryElementType.SqlQuery)
+					return;
+
+				var query = (SqlQuery)element;
+
+				for (var i = 0; i < query.Select.Columns.Count; i++)
+				{
+					var col = query.Select.Columns[i];
+
+					if (col.Expression.ElementType == QueryElementType.SqlQuery)
+					{
+						var subQuery    = (SqlQuery)col.Expression;
+						var allTables   = new HashSet<ISqlTableSource>();
+						var levelTables = new HashSet<ISqlTableSource>();
+
+						Func<IQueryElement,bool> checkTable = e =>
+						{
+							switch (e.ElementType)
+							{
+								case QueryElementType.SqlField : return !allTables.Contains(((SqlField)e).Table);
+								case QueryElementType.Column   : return !allTables.Contains(((SqlQuery.Column)e).Parent);
+							}
+							return false;
+						};
+
+						new QueryVisitor().Visit(subQuery, e =>
+						{
+							if (e is ISqlTableSource /*&& subQuery.From.IsChild((ISqlTableSource)e)*/)
+								allTables.Add((ISqlTableSource)e);
+						});
+
+						new QueryVisitor().Visit(subQuery, e =>
+						{
+							if (e is ISqlTableSource && subQuery.From.IsChild((ISqlTableSource)e))
+								levelTables.Add((ISqlTableSource)e);
+						});
+
+						if (IsSubQueryColumnSupported && new QueryVisitor().Find(subQuery, checkTable) == null)
+							continue;
+
+						var join = SqlQuery.LeftJoin(subQuery);
+
+						query.From.Tables[0].Joins.Add(join.JoinedTable);
+
+						SqlQuery.OptimizeSearchCondition(subQuery.Where.SearchCondition);
+
+						var isCount      = false;
+						var isAggregated = false;
+						
+						if (subQuery.Select.Columns.Count == 1)
+						{
+							var subCol = subQuery.Select.Columns[0];
+
+							if (subCol.Expression.ElementType == QueryElementType.SqlFunction)
+							{
+								switch (((SqlFunction)subCol.Expression).Name)
+								{
+									case "Min"     :
+									case "Max"     :
+									case "Sum"     :
+									case "Average" : isAggregated = true;                 break;
+									case "Count"   : isAggregated = true; isCount = true; break;
+								}
+							}
+						}
+
+						if (IsSubQueryColumnSupported && !isCount)
+							continue;
+
+						var allAnd = true;
+
+						for (var j = 0; allAnd && j < subQuery.Where.SearchCondition.Conditions.Count - 1; j++)
+						{
+							var cond = subQuery.Where.SearchCondition.Conditions[j];
+
+							if (cond.IsOr)
+								allAnd = false;
+						}
+
+						if (!allAnd)
+							continue;
+
+						var modified = false;
+
+						for (var j = 0; j < subQuery.Where.SearchCondition.Conditions.Count; j++)
+						{
+							var cond = subQuery.Where.SearchCondition.Conditions[j];
+
+							if (new QueryVisitor().Find(cond, checkTable) == null)
+								continue;
+
+							var replaced = new Dictionary<IQueryElement,IQueryElement>();
+
+							var nc = new QueryVisitor().Convert(cond, delegate(IQueryElement e)
+							{
+								var ne = e;
+
+								switch (e.ElementType)
+								{
+									case QueryElementType.SqlField :
+										if (replaced.TryGetValue(e, out ne))
+											return ne;
+
+										if (levelTables.Contains(((SqlField)e).Table))
+										{
+											if (isAggregated)
+												subQuery.GroupBy.Expr((SqlField)e);
+											ne = subQuery.Select.Columns[subQuery.Select.Add((SqlField)e)];
+											break;
+										}
+
+										break;
+
+									case QueryElementType.Column   :
+										if (replaced.TryGetValue(e, out ne))
+											return ne;
+
+										if (levelTables.Contains(((SqlQuery.Column)e).Parent))
+										{
+											if (isAggregated)
+												subQuery.GroupBy.Expr((SqlQuery.Column)e);
+											ne = subQuery.Select.Columns[subQuery.Select.Add((SqlQuery.Column)e)];
+											break;
+										}
+
+										break;
+								}
+
+								if (!ReferenceEquals(e, ne))
+									replaced.Add(e, ne);
+
+								return ne;
+							});
+
+							if (nc != null && !ReferenceEquals(nc, cond))
+							{
+								modified = true;
+
+								join.JoinedTable.Condition.Conditions.Add(nc);
+								subQuery.Where.SearchCondition.Conditions.RemoveAt(j);
+								j--;
+							}
+						}
+
+						if (modified || isAggregated)
+						{
+							if (isCount && !query.GroupBy.IsEmpty)
+							{
+								var oldFunc = (SqlFunction)subQuery.Select.Columns[0].Expression;
+
+								subQuery.Select.Columns.RemoveAt(0);
+
+								query.Select.Columns[i] = new SqlQuery.Column(
+									query,
+									new SqlFunction(oldFunc.SystemType, oldFunc.Name, subQuery.Select.Columns[0]));
+							}
+							else if (isAggregated && !query.GroupBy.IsEmpty)
+							{
+								var oldFunc = (SqlFunction)subQuery.Select.Columns[0].Expression;
+
+								subQuery.Select.Columns.RemoveAt(0);
+
+								var idx = subQuery.Select.Add(oldFunc.Parameters[0]);
+
+								query.Select.Columns[i] = new SqlQuery.Column(
+									query,
+									new SqlFunction(oldFunc.SystemType, oldFunc.Name, subQuery.Select.Columns[idx]));
+							}
+							else
+							{
+								query.Select.Columns[i] = new SqlQuery.Column(query, subQuery.Select.Columns[0]);
+							}
+
+							dic.Add(col, query.Select.Columns[i]);
+						}
+					}
+				}
+			});
+
+			sqlQuery = new QueryVisitor().Convert(sqlQuery, e =>
+			{
+				IQueryElement ne;
+				return dic.TryGetValue(e, out ne) ? ne : e;
+			});
+
+			return sqlQuery;
+		}
+
+		public virtual ISqlExpression GetIdentityExpression(SqlTable table, SqlField identityField, bool forReturning)
+		{
+			return null;
+		}
+
+		private        string _name;
+		public virtual string  Name
+		{
+			get { return _name ?? (_name = GetType().Name.Replace("SqlProvider", "")); }
+		}
+
+		#endregion
+
+		#region Linq Support
+
+		public virtual LambdaExpression ConvertMember(MemberInfo mi)
+		{
+			return Expressions.ConvertMember(Name, mi);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlProvider/DB2SqlProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,321 @@
+using System;
+using System.Text;
+
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Data.Sql.SqlProvider
+{
+	using DataProvider;
+
+	public class DB2SqlProvider : BasicSqlProvider
+	{
+		public override bool TakeAcceptsParameter { get { return SqlQuery.Select.SkipValue != null; } }
+
+		SqlField _identityField;
+
+		public override int CommandCount(SqlQuery sqlQuery)
+		{
+			if (sqlQuery.IsInsert && sqlQuery.Insert.WithIdentity)
+			{
+				_identityField = sqlQuery.Insert.Into.GetIdentityField();
+
+				if (_identityField == null)
+					return 2;
+			}
+
+			return 1;
+		}
+
+		public override int BuildSql(int commandNumber, SqlQuery sqlQuery, StringBuilder sb, int indent, int nesting, bool skipAlias)
+		{
+			if (_identityField != null)
+			{
+				indent += 2;
+
+				AppendIndent(sb).AppendLine("SELECT");
+				AppendIndent(sb).Append("\t");
+				BuildExpression(sb, _identityField, false, true);
+				sb.AppendLine();
+				AppendIndent(sb).AppendLine("FROM");
+				AppendIndent(sb).AppendLine("\tNEW TABLE");
+				AppendIndent(sb).AppendLine("\t(");
+			}
+
+			var ret = base.BuildSql(commandNumber, sqlQuery, sb, indent, nesting, skipAlias);
+
+			if (_identityField != null)
+				sb.AppendLine("\t)");
+
+			return ret;
+		}
+
+		protected override void BuildCommand(int commandNumber, StringBuilder sb)
+		{
+			sb.AppendLine("SELECT identity_val_local() FROM SYSIBM.SYSDUMMY1");
+		}
+
+		protected override ISqlProvider CreateSqlProvider()
+		{
+			return new DB2SqlProvider();
+		}
+
+		protected override void BuildSql(StringBuilder sb)
+		{
+			AlternativeBuildSql(sb, false, base.BuildSql);
+		}
+
+		protected override void BuildSelectClause(StringBuilder sb)
+		{
+			if (SqlQuery.From.Tables.Count == 0)
+			{
+				AppendIndent(sb).AppendLine("SELECT");
+				BuildColumns(sb);
+				AppendIndent(sb).AppendLine("FROM SYSIBM.SYSDUMMY1 FETCH FIRST 1 ROW ONLY");
+			}
+			else
+				base.BuildSelectClause(sb);
+		}
+
+		protected override string LimitFormat
+		{
+			get { return SqlQuery.Select.SkipValue == null ? "FETCH FIRST {0} ROWS ONLY" : null; }
+		}
+
+		public override ISqlExpression ConvertExpression(ISqlExpression expr)
+		{
+			expr = base.ConvertExpression(expr);
+
+			if (expr is SqlBinaryExpression)
+			{
+				var be = (SqlBinaryExpression)expr;
+
+				switch (be.Operation)
+				{
+					case "%":
+						{
+							var expr1 = !TypeHelper.IsIntegerType(be.Expr1.SystemType) ? new SqlFunction(typeof(int), "Int", be.Expr1) : be.Expr1;
+							return new SqlFunction(be.SystemType, "Mod", expr1, be.Expr2);
+						}
+					case "&": return new SqlFunction(be.SystemType, "BitAnd", be.Expr1, be.Expr2);
+					case "|": return new SqlFunction(be.SystemType, "BitOr",  be.Expr1, be.Expr2);
+					case "^": return new SqlFunction(be.SystemType, "BitXor", be.Expr1, be.Expr2);
+					case "+": return be.SystemType == typeof(string)? new SqlBinaryExpression(be.SystemType, be.Expr1, "||", be.Expr2, be.Precedence): expr;
+				}
+			}
+			else if (expr is SqlFunction)
+			{
+				var func = (SqlFunction) expr;
+
+				switch (func.Name)
+				{
+					case "Convert"    :
+						if (TypeHelper.GetUnderlyingType(func.SystemType) == typeof(bool))
+						{
+							var ex = AlternativeConvertToBoolean(func, 1);
+							if (ex != null)
+								return ex;
+						}
+
+						if (func.Parameters[0] is SqlDataType)
+						{
+							var type = (SqlDataType)func.Parameters[0];
+
+							if (type.Type == typeof(string) && func.Parameters[1].SystemType != typeof(string))
+								return new SqlFunction(func.SystemType, "RTrim", new SqlFunction(typeof(string), "Char", func.Parameters[1]));
+
+							if (type.Length > 0)
+								return new SqlFunction(func.SystemType, type.SqlDbType.ToString(), func.Parameters[1], new SqlValue(type.Length));
+
+							if (type.Precision > 0)
+								return new SqlFunction(func.SystemType, type.SqlDbType.ToString(), func.Parameters[1], new SqlValue(type.Precision), new SqlValue(type.Scale));
+
+							return new SqlFunction(func.SystemType, type.SqlDbType.ToString(), func.Parameters[1]);
+						}
+
+						if (func.Parameters[0] is SqlFunction)
+						{
+							var f = (SqlFunction)func.Parameters[0];
+
+							return
+								f.Name == "Char" ?
+									new SqlFunction(func.SystemType, f.Name, func.Parameters[1]) :
+								f.Parameters.Length == 1 ?
+									new SqlFunction(func.SystemType, f.Name, func.Parameters[1], f.Parameters[0]) :
+									new SqlFunction(func.SystemType, f.Name, func.Parameters[1], f.Parameters[0], f.Parameters[1]);
+						}
+
+						{
+							var e = (SqlExpression)func.Parameters[0];
+							return new SqlFunction(func.SystemType, e.Expr, func.Parameters[1]);
+						}
+
+					case "Millisecond"   : return Div(new SqlFunction(func.SystemType, "Microsecond", func.Parameters), 1000);
+					case "SmallDateTime" :
+					case "DateTime"      :
+					case "DateTime2"     : return new SqlFunction(func.SystemType, "TimeStamp", func.Parameters);
+					case "TinyInt"       : return new SqlFunction(func.SystemType, "SmallInt",  func.Parameters);
+					case "Money"         : return new SqlFunction(func.SystemType, "Decimal",   func.Parameters[0], new SqlValue(19), new SqlValue(4));
+					case "SmallMoney"    : return new SqlFunction(func.SystemType, "Decimal",   func.Parameters[0], new SqlValue(10), new SqlValue(4));
+					case "VarChar"       :
+						if (TypeHelper.GetUnderlyingType(func.Parameters[0].SystemType) == typeof(decimal))
+							return new SqlFunction(func.SystemType, "Char", func.Parameters[0]);
+						break;
+					case "NChar"         :
+					case "NVarChar"      : return new SqlFunction(func.SystemType, "Char",      func.Parameters);
+					case "DateDiff"      :
+						{
+							switch ((Linq.Sql.DateParts)((SqlValue)func.Parameters[0]).Value)
+							{
+								case Linq.Sql.DateParts.Day         : return new SqlExpression(typeof(int), "((Days({0}) - Days({1})) * 86400 + (MIDNIGHT_SECONDS({0}) - MIDNIGHT_SECONDS({1}))) / 86400",                                               Precedence.Multiplicative, func.Parameters[2], func.Parameters[1]);
+								case Linq.Sql.DateParts.Hour        : return new SqlExpression(typeof(int), "((Days({0}) - Days({1})) * 86400 + (MIDNIGHT_SECONDS({0}) - MIDNIGHT_SECONDS({1}))) / 3600",                                                Precedence.Multiplicative, func.Parameters[2], func.Parameters[1]);
+								case Linq.Sql.DateParts.Minute      : return new SqlExpression(typeof(int), "((Days({0}) - Days({1})) * 86400 + (MIDNIGHT_SECONDS({0}) - MIDNIGHT_SECONDS({1}))) / 60",                                                  Precedence.Multiplicative, func.Parameters[2], func.Parameters[1]);
+								case Linq.Sql.DateParts.Second      : return new SqlExpression(typeof(int), "(Days({0}) - Days({1})) * 86400 + (MIDNIGHT_SECONDS({0}) - MIDNIGHT_SECONDS({1}))",                                                         Precedence.Additive,       func.Parameters[2], func.Parameters[1]);
+								case Linq.Sql.DateParts.Millisecond : return new SqlExpression(typeof(int), "((Days({0}) - Days({1})) * 86400 + (MIDNIGHT_SECONDS({0}) - MIDNIGHT_SECONDS({1}))) * 1000 + (MICROSECOND({0}) - MICROSECOND({1})) / 1000", Precedence.Additive,       func.Parameters[2], func.Parameters[1]);
+							}
+						}
+
+						break;
+				}
+			}
+
+			return expr;
+		}
+
+		protected override void BuildFunction(StringBuilder sb, SqlFunction func)
+		{
+			func = ConvertFunctionParameters(func);
+			base.BuildFunction(sb, func);
+		}
+
+		static void SetQueryParameter(IQueryElement element)
+		{
+			if (element.ElementType == QueryElementType.SqlParameter)
+				((SqlParameter)element).IsQueryParameter = false;
+		}
+
+		public override SqlQuery Finalize(SqlQuery sqlQuery)
+		{
+			new QueryVisitor().Visit(sqlQuery.Select, SetQueryParameter);
+
+			//if (sqlQuery.QueryType == QueryType.InsertOrUpdate)
+			//	foreach (var key in sqlQuery.Insert.Items)
+			//		if (((SqlField)key.Column).IsPrimaryKey)
+			//			new QueryVisitor().Visit(key.Expression, SetQueryParameter);
+
+			sqlQuery = base.Finalize(sqlQuery);
+
+			switch (sqlQuery.QueryType)
+			{
+				case QueryType.Delete : return GetAlternativeDelete(sqlQuery);
+				case QueryType.Update : return GetAlternativeUpdate(sqlQuery);
+				default               : return sqlQuery;
+			}
+		}
+
+		protected override void BuildFromClause(StringBuilder sb)
+		{
+			if (!SqlQuery.IsUpdate)
+				base.BuildFromClause(sb);
+		}
+
+		public override void BuildValue(StringBuilder sb, object value)
+		{
+			if (value is Guid)
+			{
+				var s = ((Guid)value).ToString("N");
+
+				sb
+					.Append("Cast(x'")
+					.Append(s.Substring( 6,  2))
+					.Append(s.Substring( 4,  2))
+					.Append(s.Substring( 2,  2))
+					.Append(s.Substring( 0,  2))
+					.Append(s.Substring(10,  2))
+					.Append(s.Substring( 8,  2))
+					.Append(s.Substring(14,  2))
+					.Append(s.Substring(12,  2))
+					.Append(s.Substring(16, 16))
+					.Append("' as char(16) for bit data)");
+			}
+			else
+				base.BuildValue(sb, value);
+		}
+
+		protected override void BuildColumnExpression(StringBuilder sb, ISqlExpression expr, string alias, ref bool addAlias)
+		{
+			var wrap = false;
+
+			if (expr.SystemType == typeof(bool))
+			{
+				if (expr is SqlQuery.SearchCondition)
+					wrap = true;
+				else
+				{
+					var ex = expr as SqlExpression;
+					wrap = ex != null && ex.Expr == "{0}" && ex.Parameters.Length == 1 && ex.Parameters[0] is SqlQuery.SearchCondition;
+				}
+			}
+
+			if (wrap) sb.Append("CASE WHEN ");
+			base.BuildColumnExpression(sb, expr, alias, ref addAlias);
+			if (wrap) sb.Append(" THEN 1 ELSE 0 END");
+		}
+
+		public static bool QuoteIdentifiers = true;
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			switch (convertType)
+			{
+				case ConvertType.NameToQueryParameter:
+					return "@" + value;
+
+				case ConvertType.NameToCommandParameter:
+				case ConvertType.NameToSprocParameter:
+					return ":" + value;
+
+				case ConvertType.SprocParameterToName:
+					if (value != null)
+					{
+						var str = value.ToString();
+						return str.Length > 0 && str[0] == ':'? str.Substring(1): str;
+					}
+
+					break;
+
+				case ConvertType.NameToQueryField:
+				case ConvertType.NameToQueryFieldAlias:
+				case ConvertType.NameToQueryTable:
+				case ConvertType.NameToQueryTableAlias:
+					if (QuoteIdentifiers)
+					{
+						var name = value.ToString();
+
+						if (name.Length > 0 && name[0] == '"')
+							return value;
+
+						return '"' + name + '"';
+					}
+
+					break;
+			}
+
+			return value;
+		}
+
+		protected override void BuildInsertOrUpdateQuery(StringBuilder sb)
+		{
+			BuildInsertOrUpdateQueryAsMerge(sb, "FROM SYSIBM.SYSDUMMY1 FETCH FIRST 1 ROW ONLY");
+		}
+
+		protected override void BuildEmptyInsert(StringBuilder sb)
+		{
+			sb.Append("VALUES ");
+
+			foreach (var col in SqlQuery.Insert.Into.Fields)
+				sb.Append("(DEFAULT)");
+
+			sb.AppendLine();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlProvider/FirebirdSqlProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,299 @@
+using System;
+using System.Data;
+using System.Text;
+
+#region ReSharper disable
+// ReSharper disable SuggestUseVarKeywordEverywhere
+// ReSharper disable SuggestUseVarKeywordEvident
+#endregion
+
+namespace BLToolkit.Data.Sql.SqlProvider
+{
+	using DataProvider;
+	using Mapping;
+	using Reflection;
+
+	using Linq;
+
+	public class FirebirdSqlProvider : BasicSqlProvider, IMappingSchemaProvider
+	{
+		public FirebirdSqlProvider()
+		{
+		}
+
+//		public override int CommandCount(SqlQuery sqlQuery)
+//		{
+//			return sqlQuery.IsInsert && sqlQuery.Set.WithIdentity ? 2 : 1;
+//		}
+
+//		protected override void BuildCommand(int commandNumber, StringBuilder sb)
+//		{
+//			SequenceNameAttribute attr = GetSequenceNameAttribute(true);
+//
+//			AppendIndent(sb)
+//				.Append("SELECT gen_id(")
+//				.Append(attr.SequenceName)
+//				.AppendLine(", 0) FROM rdb$database");
+//		}
+
+		protected override ISqlProvider CreateSqlProvider()
+		{
+			return new FirebirdSqlProvider();
+		}
+
+		protected override void BuildSelectClause(StringBuilder sb)
+		{
+			if (SqlQuery.From.Tables.Count == 0)
+			{
+				AppendIndent(sb);
+				sb.Append("SELECT").AppendLine();
+				BuildColumns(sb);
+				AppendIndent(sb);
+				sb.Append("FROM rdb$database").AppendLine();
+			}
+			else
+				base.BuildSelectClause(sb);
+		}
+
+		protected override bool   SkipFirst   { get { return false;       } }
+		protected override string SkipFormat  { get { return "SKIP {0}";  } }
+		protected override string FirstFormat { get { return "FIRST {0}"; } }
+
+		public override bool IsIdentityParameterRequired { get { return true; } }
+
+		protected override void BuildGetIdentity(StringBuilder sb)
+		{
+			var identityField = SqlQuery.Insert.Into.GetIdentityField();
+
+			if (identityField == null)
+				throw new SqlException("Identity field must be defined for '{0}'.", SqlQuery.Insert.Into.Name);
+
+			AppendIndent(sb).AppendLine("RETURNING");
+			AppendIndent(sb).Append("\t");
+			BuildExpression(sb, identityField, false, true);
+		}
+
+		public override ISqlExpression GetIdentityExpression(SqlTable table, SqlField identityField, bool forReturning)
+		{
+			if (table.SequenceAttributes != null)
+				return new SqlExpression("GEN_ID(" + table.SequenceAttributes[0].SequenceName + ", 1)", Precedence.Primary);
+
+			return base.GetIdentityExpression(table, identityField, forReturning);
+		}
+
+		public override ISqlExpression ConvertExpression(ISqlExpression expr)
+		{
+			expr = base.ConvertExpression(expr);
+
+			if (expr is SqlBinaryExpression)
+			{
+				SqlBinaryExpression be = (SqlBinaryExpression)expr;
+
+				switch (be.Operation)
+				{
+					case "%": return new SqlFunction(be.SystemType, "Mod",     be.Expr1, be.Expr2);
+					case "&": return new SqlFunction(be.SystemType, "Bin_And", be.Expr1, be.Expr2);
+					case "|": return new SqlFunction(be.SystemType, "Bin_Or",  be.Expr1, be.Expr2);
+					case "^": return new SqlFunction(be.SystemType, "Bin_Xor", be.Expr1, be.Expr2);
+					case "+": return be.SystemType == typeof(string)? new SqlBinaryExpression(be.SystemType, be.Expr1, "||", be.Expr2, be.Precedence): expr;
+				}
+			}
+			else if (expr is SqlFunction)
+			{
+				SqlFunction func = (SqlFunction)expr;
+
+				switch (func.Name)
+				{
+					case "Convert" :
+						if (TypeHelper.GetUnderlyingType(func.SystemType) == typeof(bool))
+						{
+							ISqlExpression ex = AlternativeConvertToBoolean(func, 1);
+							if (ex != null)
+								return ex;
+						}
+
+						return new SqlExpression(func.SystemType, "Cast({0} as {1})", Precedence.Primary, FloorBeforeConvert(func), func.Parameters[0]);
+
+					case "DateAdd" :
+						switch ((Sql.DateParts)((SqlValue)func.Parameters[0]).Value)
+						{
+							case Sql.DateParts.Quarter  :
+								return new SqlFunction(func.SystemType, func.Name, new SqlValue(Sql.DateParts.Month), Mul(func.Parameters[1], 3), func.Parameters[2]);
+							case Sql.DateParts.DayOfYear:
+							case Sql.DateParts.WeekDay:
+								return new SqlFunction(func.SystemType, func.Name, new SqlValue(Sql.DateParts.Day),   func.Parameters[1],         func.Parameters[2]);
+							case Sql.DateParts.Week     :
+								return new SqlFunction(func.SystemType, func.Name, new SqlValue(Sql.DateParts.Day),   Mul(func.Parameters[1], 7), func.Parameters[2]);
+						}
+
+						break;
+				}
+			}
+			else if (expr is SqlExpression)
+			{
+				SqlExpression e = (SqlExpression)expr;
+
+				if (e.Expr.StartsWith("Extract(Quarter"))
+					return Inc(Div(Dec(new SqlExpression(e.SystemType, "Extract(Month from {0})", e.Parameters)), 3));
+
+				if (e.Expr.StartsWith("Extract(YearDay"))
+					return Inc(new SqlExpression(e.SystemType, e.Expr.Replace("Extract(YearDay", "Extract(yearDay"), e.Parameters));
+
+				if (e.Expr.StartsWith("Extract(WeekDay"))
+					return Inc(new SqlExpression(e.SystemType, e.Expr.Replace("Extract(WeekDay", "Extract(weekDay"), e.Parameters));
+			}
+
+			return expr;
+		}
+
+		protected override void BuildFunction(StringBuilder sb, SqlFunction func)
+		{
+			func = ConvertFunctionParameters(func);
+			base.BuildFunction(sb, func);
+		}
+
+		protected override void BuildDataType(StringBuilder sb, SqlDataType type)
+		{
+			switch (type.SqlDbType)
+			{
+				case SqlDbType.Decimal       :
+					base.BuildDataType(sb, type.Precision > 18 ? new SqlDataType(type.SqlDbType, type.Type, 18, type.Scale) : type);
+					break;
+				case SqlDbType.TinyInt       : sb.Append("SmallInt");        break;
+				case SqlDbType.Money         : sb.Append("Decimal(18,4)");   break;
+				case SqlDbType.SmallMoney    : sb.Append("Decimal(10,4)");   break;
+#if !MONO
+				case SqlDbType.DateTime2     :
+#endif
+				case SqlDbType.SmallDateTime :
+				case SqlDbType.DateTime      : sb.Append("TimeStamp");       break;
+				case SqlDbType.NVarChar      :
+					sb.Append("VarChar");
+					if (type.Length > 0)
+						sb.Append('(').Append(type.Length).Append(')');
+					break;
+				default                      : base.BuildDataType(sb, type); break;
+			}
+		}
+
+		static void SetNonQueryParameter(IQueryElement element)
+		{
+			if (element.ElementType == QueryElementType.SqlParameter)
+				((SqlParameter)element).IsQueryParameter = false;
+		}
+
+		public override SqlQuery Finalize(SqlQuery sqlQuery)
+		{
+			CheckAliases(sqlQuery, int.MaxValue);
+
+			new QueryVisitor().Visit(sqlQuery.Select, SetNonQueryParameter);
+
+			if (sqlQuery.QueryType == QueryType.InsertOrUpdate)
+			{
+				foreach (var key in sqlQuery.Insert.Items)
+					new QueryVisitor().Visit(key.Expression, SetNonQueryParameter);
+
+				foreach (var key in sqlQuery.Update.Items)
+					new QueryVisitor().Visit(key.Expression, SetNonQueryParameter);
+
+				foreach (var key in sqlQuery.Update.Keys)
+					new QueryVisitor().Visit(key.Expression, SetNonQueryParameter);
+			}
+
+			new QueryVisitor().Visit(sqlQuery, element =>
+			{
+				if (element.ElementType == QueryElementType.InSubQueryPredicate)
+					new QueryVisitor().Visit(((SqlQuery.Predicate.InSubQuery)element).Expr1, SetNonQueryParameter);
+			});
+
+			sqlQuery = base.Finalize(sqlQuery);
+
+			switch (sqlQuery.QueryType)
+			{
+				case QueryType.Delete : return GetAlternativeDelete(sqlQuery);
+				case QueryType.Update : return GetAlternativeUpdate(sqlQuery);
+				default               : return sqlQuery;
+			}
+		}
+
+		protected override void BuildFromClause(StringBuilder sb)
+		{
+			if (!SqlQuery.IsUpdate)
+				base.BuildFromClause(sb);
+		}
+
+		protected override void BuildColumnExpression(StringBuilder sb, ISqlExpression expr, string alias, ref bool addAlias)
+		{
+			var wrap = false;
+
+			if (expr.SystemType == typeof(bool))
+			{
+				if (expr is SqlQuery.SearchCondition)
+					wrap = true;
+				else
+				{
+					var ex = expr as SqlExpression;
+					wrap = ex != null && ex.Expr == "{0}" && ex.Parameters.Length == 1 && ex.Parameters[0] is SqlQuery.SearchCondition;
+				}
+			}
+
+			if (wrap) sb.Append("CASE WHEN ");
+			base.BuildColumnExpression(sb, expr, alias, ref addAlias);
+			if (wrap) sb.Append(" THEN 1 ELSE 0 END");
+		}
+
+		public static bool QuoteIdentifiers = false;
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			switch (convertType)
+			{
+				case ConvertType.NameToQueryField:
+				case ConvertType.NameToQueryTable:
+					if (QuoteIdentifiers)
+					{
+						string name = value.ToString();
+
+						if (name.Length > 0 && name[0] == '"')
+							return value;
+
+						return '"' + name + '"';
+					}
+
+					break;
+
+				case ConvertType.NameToQueryParameter:
+				case ConvertType.NameToCommandParameter:
+				case ConvertType.NameToSprocParameter:
+					return "@" + value;
+
+				case ConvertType.SprocParameterToName:
+					if (value != null)
+					{
+						string str = value.ToString();
+						return str.Length > 0 && str[0] == '@' ? str.Substring(1) : str;
+					}
+
+					break;
+			}
+
+			return value;
+		}
+
+		protected override void BuildInsertOrUpdateQuery(StringBuilder sb)
+		{
+			BuildInsertOrUpdateQueryAsMerge(sb, "FROM rdb$database");
+		}
+
+		#region IMappingSchemaProvider Members
+
+		readonly FirebirdMappingSchema _mappingSchema = new FirebirdMappingSchema();
+
+		MappingSchema IMappingSchemaProvider.MappingSchema
+		{
+			get { return _mappingSchema; }
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlProvider/ISqlProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,38 @@
+using System;
+using System.Linq.Expressions;
+using System.Reflection;
+using System.Text;
+
+namespace BLToolkit.Data.Sql.SqlProvider
+{
+	using DataProvider;
+
+	public interface ISqlProvider
+	{
+		int              CommandCount         (SqlQuery sqlQuery);
+		int              BuildSql             (int commandNumber, SqlQuery sqlQuery, StringBuilder sb, int indent, int nesting, bool skipAlias);
+		ISqlExpression   ConvertExpression    (ISqlExpression expression);
+		ISqlPredicate    ConvertPredicate     (ISqlPredicate  predicate);
+		SqlQuery         Finalize             (SqlQuery sqlQuery);
+
+		StringBuilder    BuildTableName       (StringBuilder sb, string database, string owner, string table);
+		object           Convert              (object value, ConvertType convertType);
+		LambdaExpression ConvertMember        (MemberInfo mi);
+		ISqlExpression   GetIdentityExpression(SqlTable table, SqlField identityField, bool forReturning);
+
+		string           Name                        { get; }
+		SqlQuery         SqlQuery                    { get; set; }
+
+		bool             SkipAcceptsParameter        { get; }
+		bool             TakeAcceptsParameter        { get; }
+		bool             IsSkipSupported             { get; }
+		bool             IsTakeSupported             { get; }
+		bool             IsSubQueryTakeSupported     { get; }
+		bool             IsSubQueryColumnSupported   { get; }
+		bool             IsCountSubQuerySupported    { get; }
+		bool             IsIdentityParameterRequired { get; }
+		bool             IsApplyJoinSupported        { get; }
+		bool             IsInsertOrUpdateSupported   { get; }
+		bool             CanCombineParameters        { get; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlProvider/InformixSqlProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,274 @@
+using System;
+using System.Data;
+using System.Text;
+
+namespace BLToolkit.Data.Sql.SqlProvider
+{
+	using DataProvider;
+	using Reflection;
+
+	public class InformixSqlProvider : BasicSqlProvider
+	{
+		public override int CommandCount(SqlQuery sqlQuery)
+		{
+			return sqlQuery.IsInsert && sqlQuery.Insert.WithIdentity ? 2 : 1;
+		}
+
+		protected override void BuildCommand(int commandNumber, StringBuilder sb)
+		{
+			sb.AppendLine("SELECT DBINFO('sqlca.sqlerrd1') FROM systables where tabid = 1");
+		}
+
+		protected override ISqlProvider CreateSqlProvider()
+		{
+			return new InformixSqlProvider();
+		}
+
+		public override int BuildSql(int commandNumber, SqlQuery sqlQuery, StringBuilder sb, int indent, int nesting, bool skipAlias)
+		{
+			var n = base.BuildSql(commandNumber, sqlQuery, sb, indent, nesting, skipAlias);
+
+			sb
+				.Replace("NULL IS NOT NULL", "1=0")
+				.Replace("NULL IS NULL",     "1=1");
+
+			return n;
+		}
+
+		protected override void BuildSelectClause(StringBuilder sb)
+		{
+			if (SqlQuery.From.Tables.Count == 0)
+			{
+				AppendIndent(sb).Append("SELECT FIRST 1").AppendLine();
+				BuildColumns(sb);
+				AppendIndent(sb).Append("FROM SYSTABLES").AppendLine();
+			}
+			else
+				base.BuildSelectClause(sb);
+		}
+
+		public override bool IsSubQueryTakeSupported      { get { return false; } }
+		public override bool IsInsertOrUpdateSupported    { get { return false; } }
+		public override bool IsGroupByExpressionSupported { get { return false; } }
+
+		protected override string FirstFormat { get { return "FIRST {0}"; } }
+		protected override string SkipFormat  { get { return "SKIP {0}";  } }
+
+		protected override void BuildLikePredicate(StringBuilder sb, SqlQuery.Predicate.Like predicate)
+		{
+			if (predicate.IsNot)
+				sb.Append("NOT ");
+
+			var precedence = GetPrecedence(predicate);
+
+			BuildExpression(sb, precedence, predicate.Expr1);
+			sb.Append(" LIKE ");
+			BuildExpression(sb, precedence, predicate.Expr2);
+
+			if (predicate.Escape != null)
+			{
+				sb.Append(" ESCAPE ");
+				BuildExpression(sb, precedence, predicate.Escape);
+			}
+		}
+
+		public override ISqlExpression ConvertExpression(ISqlExpression expr)
+		{
+			expr = base.ConvertExpression(expr);
+
+			if (expr is SqlBinaryExpression)
+			{
+				var be = (SqlBinaryExpression)expr;
+
+				switch (be.Operation)
+				{
+					case "%": return new SqlFunction(be.SystemType, "Mod",    be.Expr1, be.Expr2);
+					case "&": return new SqlFunction(be.SystemType, "BitAnd", be.Expr1, be.Expr2);
+					case "|": return new SqlFunction(be.SystemType, "BitOr",  be.Expr1, be.Expr2);
+					case "^": return new SqlFunction(be.SystemType, "BitXor", be.Expr1, be.Expr2);
+					case "+": return be.SystemType == typeof(string)? new SqlBinaryExpression(be.SystemType, be.Expr1, "||", be.Expr2, be.Precedence): expr;
+				}
+			}
+			else if (expr is SqlFunction)
+			{
+				var func = (SqlFunction)expr;
+
+				switch (func.Name)
+				{
+					case "Coalesce" : return new SqlFunction(func.SystemType, "Nvl", func.Parameters);
+					case "Convert"  :
+						{
+							var par0 = func.Parameters[0];
+							var par1 = func.Parameters[1];
+
+							switch (Type.GetTypeCode(TypeHelper.GetUnderlyingType(func.SystemType)))
+							{
+								case TypeCode.String   : return new SqlFunction(func.SystemType, "To_Char", func.Parameters[1]);
+								case TypeCode.Boolean  :
+									{
+										var ex = AlternativeConvertToBoolean(func, 1);
+										if (ex != null)
+											return ex;
+										break;
+									}
+
+								case TypeCode.UInt64:
+									if (TypeHelper.IsFloatType(func.Parameters[1].SystemType))
+										par1 = new SqlFunction(func.SystemType, "Floor", func.Parameters[1]);
+									break;
+
+								case TypeCode.DateTime :
+									if (IsDateDataType(func.Parameters[0], "Date"))
+									{
+										if (func.Parameters[1].SystemType == typeof(string))
+										{
+											return new SqlFunction(
+												func.SystemType,
+												"Date",
+												new SqlFunction(func.SystemType, "To_Date", func.Parameters[1], new SqlValue("%Y-%m-%d")));
+										}
+
+										return new SqlFunction(func.SystemType, "Date", func.Parameters[1]);
+									}
+
+									if (IsTimeDataType(func.Parameters[0]))
+										return new SqlExpression(func.SystemType, "Cast(Extend({0}, hour to second) as Char(8))", Precedence.Primary, func.Parameters[1]);
+
+									return new SqlFunction(func.SystemType, "To_Date", func.Parameters[1]);
+
+								default:
+									if (TypeHelper.GetUnderlyingType(func.SystemType) == typeof(DateTimeOffset))
+										goto case TypeCode.DateTime;
+									break;
+							}
+
+							return new SqlExpression(func.SystemType, "Cast({0} as {1})", Precedence.Primary, par1, par0);
+						}
+
+					case "Quarter"  : return Inc(Div(Dec(new SqlFunction(func.SystemType, "Month", func.Parameters)), 3));
+					case "WeekDay"  : return Inc(new SqlFunction(func.SystemType, "weekDay", func.Parameters));
+					case "DayOfYear":
+						return
+							Inc(Sub<int>(
+								new SqlFunction(null, "Mdy",
+									new SqlFunction(null, "Month", func.Parameters),
+									new SqlFunction(null, "Day",   func.Parameters),
+									new SqlFunction(null, "Year",  func.Parameters)),
+								new SqlFunction(null, "Mdy",
+									new SqlValue(1),
+									new SqlValue(1),
+									new SqlFunction(null, "Year", func.Parameters))));
+					case "Week"     :
+						return
+							new SqlExpression(
+								func.SystemType,
+								"((Extend({0}, year to day) - (Mdy(12, 31 - WeekDay(Mdy(1, 1, year({0}))), Year({0}) - 1) + Interval(1) day to day)) / 7 + Interval(1) day to day)::char(10)::int",
+								func.Parameters);
+					case "Hour"     :
+					case "Minute"   :
+					case "Second"   : return new SqlExpression(func.SystemType, string.Format("({{0}}::datetime {0} to {0})::char(3)::int", func.Name), func.Parameters);
+				}
+			}
+
+			return expr;
+		}
+
+		protected override void BuildFunction(StringBuilder sb, SqlFunction func)
+		{
+			func = ConvertFunctionParameters(func);
+			base.BuildFunction(sb, func);
+		}
+
+		public virtual object ConvertBooleanValue(bool value)
+		{
+			return value ? 't' : 'f';
+		}
+
+		public override void BuildValue(StringBuilder sb, object value)
+		{
+			if (value is bool || value is bool?)
+				sb.Append("'").Append(ConvertBooleanValue((bool)value)).Append("'");
+			else
+				base.BuildValue(sb, value);
+		}
+
+		protected override void BuildDataType(StringBuilder sb, SqlDataType type)
+		{
+			switch (type.SqlDbType)
+			{
+				case SqlDbType.TinyInt    : sb.Append("SmallInt");        break;
+				case SqlDbType.SmallMoney : sb.Append("Decimal(10,4)");   break;
+				default                   : base.BuildDataType(sb, type); break;
+			}
+		}
+
+		static void SetQueryParameter(IQueryElement element)
+		{
+			if (element.ElementType == QueryElementType.SqlParameter)
+				((SqlParameter)element).IsQueryParameter = false;
+		}
+
+		public override SqlQuery Finalize(SqlQuery sqlQuery)
+		{
+			CheckAliases(sqlQuery, int.MaxValue);
+
+			new QueryVisitor().Visit(sqlQuery.Select, SetQueryParameter);
+
+			//if (sqlQuery.QueryType == QueryType.InsertOrUpdate)
+			//{
+			//	foreach (var key in sqlQuery.Insert.Items)
+			//		new QueryVisitor().Visit(key.Expression, SetQueryParameter);
+			//
+			//	foreach (var key in sqlQuery.Update.Items)
+			//		new QueryVisitor().Visit(key.Expression, SetQueryParameter);
+			//}
+
+			sqlQuery = base.Finalize(sqlQuery);
+
+			switch (sqlQuery.QueryType)
+			{
+				case QueryType.Delete :
+					sqlQuery = GetAlternativeDelete(sqlQuery);
+					sqlQuery.From.Tables[0].Alias = "$";
+					break;
+
+				case QueryType.Update :
+					sqlQuery = GetAlternativeUpdate(sqlQuery);
+					break;
+			}
+
+			return sqlQuery;
+		}
+
+		protected override void BuildFromClause(StringBuilder sb)
+		{
+			if (!SqlQuery.IsUpdate)
+				base.BuildFromClause(sb);
+		}
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			switch (convertType)
+			{
+				case ConvertType.NameToQueryParameter   : return "?";
+				case ConvertType.NameToCommandParameter :
+				case ConvertType.NameToSprocParameter   : return ":" + value;
+				case ConvertType.SprocParameterToName   :
+					if (value != null)
+					{
+						var str = value.ToString();
+						return (str.Length > 0 && str[0] == ':')? str.Substring(1): str;
+					}
+
+					break;
+			}
+
+			return value;
+		}
+
+		//protected override void BuildInsertOrUpdateQuery(StringBuilder sb)
+		//{
+		//	BuildInsertOrUpdateQueryAsMerge(sb, "FROM SYSTABLES");
+		//}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlProvider/MSSqlSqlProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,242 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace BLToolkit.Data.Sql.SqlProvider
+{
+	using DataProvider;
+	using Reflection;
+
+	public abstract class MsSqlSqlProvider : BasicSqlProvider
+	{
+		public override bool IsApplyJoinSupported { get { return true; } }
+
+		protected virtual  bool BuildAlternativeSql  { get { return true; } }
+
+		protected override string FirstFormat
+		{
+			get { return SqlQuery.Select.SkipValue == null ? "TOP ({0})" : null; }
+		}
+
+		protected override void BuildSql(StringBuilder sb)
+		{
+			if (BuildAlternativeSql)
+				AlternativeBuildSql(sb, true, base.BuildSql);
+			else
+				base.BuildSql(sb);
+		}
+
+		protected override void BuildGetIdentity(StringBuilder sb)
+		{
+			sb
+				.AppendLine()
+				.AppendLine("SELECT SCOPE_IDENTITY()");
+		}
+
+		protected override void BuildOrderByClause(StringBuilder sb)
+		{
+			if (!BuildAlternativeSql || !NeedSkip)
+				base.BuildOrderByClause(sb);
+		}
+
+		protected override IEnumerable<SqlQuery.Column> GetSelectedColumns()
+		{
+			if (BuildAlternativeSql && NeedSkip && !SqlQuery.OrderBy.IsEmpty)
+				return AlternativeGetSelectedColumns(base.GetSelectedColumns);
+			return base.GetSelectedColumns();
+		}
+
+		public override ISqlExpression ConvertExpression(ISqlExpression expr)
+		{
+			expr = base.ConvertExpression(expr);
+
+			switch (expr.ElementType)
+			{
+				case QueryElementType.SqlBinaryExpression:
+					{
+						var be = (SqlBinaryExpression)expr;
+
+						switch (be.Operation)
+						{
+							case "%":
+								{
+									var type1 = TypeHelper.GetUnderlyingType(be.Expr1.SystemType);
+
+									if (type1 == typeof(double) || type1 == typeof(float))
+									{
+										return new SqlBinaryExpression(
+											be.Expr2.SystemType,
+											new SqlFunction(typeof(int), "Convert", SqlDataType.Int32, be.Expr1),
+											be.Operation,
+											be.Expr2);
+									}
+
+									break;
+								}
+						}
+
+						break;
+					}
+
+				case QueryElementType.SqlFunction:
+					{
+						var func = (SqlFunction)expr;
+
+						switch (func.Name)
+						{
+							case "Convert" :
+								{
+									if (TypeHelper.GetUnderlyingType(func.SystemType) == typeof(ulong) &&
+										TypeHelper.IsFloatType(func.Parameters[1].SystemType))
+										return new SqlFunction(
+											func.SystemType,
+											func.Name,
+											func.Precedence,
+											func.Parameters[0],
+											new SqlFunction(func.SystemType, "Floor", func.Parameters[1]));
+
+									break;
+								}
+						}
+
+						break;
+					}
+			}
+
+			return expr;
+		}
+
+		protected override void BuildDeleteClause(StringBuilder sb)
+		{
+			var table = SqlQuery.Delete.Table != null ?
+				(SqlQuery.From.FindTableSource(SqlQuery.Delete.Table) ?? SqlQuery.Delete.Table) :
+				SqlQuery.From.Tables[0];
+
+			AppendIndent(sb)
+				.Append("DELETE ")
+				.Append(Convert(GetTableAlias(table), ConvertType.NameToQueryTableAlias))
+				.AppendLine();
+		}
+
+		protected override void BuildUpdateTableName(StringBuilder sb)
+		{
+			var table = SqlQuery.Update.Table != null ?
+				(SqlQuery.From.FindTableSource(SqlQuery.Update.Table) ?? SqlQuery.Update.Table) :
+				SqlQuery.From.Tables[0];
+
+			if (table is SqlTable)
+				BuildPhysicalTable(sb, table, null);
+			else
+				sb.Append(Convert(GetTableAlias(table), ConvertType.NameToQueryTableAlias));
+		}
+
+		protected override void BuildString(StringBuilder sb, string value)
+		{
+			foreach (var ch in value)
+			{
+				if (ch > 127)
+				{
+					sb.Append("N");
+					break;
+				}
+			}
+
+			base.BuildString(sb, value);
+		}
+
+		protected override void BuildChar(StringBuilder sb, char value)
+		{
+			if (value > 127)
+				sb.Append("N");
+
+			base.BuildChar(sb, value);
+		}
+
+		protected override void BuildColumnExpression(StringBuilder sb, ISqlExpression expr, string alias, ref bool addAlias)
+		{
+			var wrap = false;
+
+			if (expr.SystemType == typeof(bool))
+			{
+				if (expr is SqlQuery.SearchCondition)
+					wrap = true;
+				else
+				{
+					var ex = expr as SqlExpression;
+					wrap = ex != null && ex.Expr == "{0}" && ex.Parameters.Length == 1 && ex.Parameters[0] is SqlQuery.SearchCondition;
+				}
+			}
+
+			if (wrap) sb.Append("CASE WHEN ");
+			base.BuildColumnExpression(sb, expr, alias, ref addAlias);
+			if (wrap) sb.Append(" THEN 1 ELSE 0 END");
+		}
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			switch (convertType)
+			{
+				case ConvertType.NameToQueryParameter:
+				case ConvertType.NameToCommandParameter:
+				case ConvertType.NameToSprocParameter:
+					return "@" + value;
+
+				case ConvertType.NameToQueryField:
+				case ConvertType.NameToQueryFieldAlias:
+				case ConvertType.NameToQueryTableAlias:
+					{
+						var name = value.ToString();
+
+						if (name.Length > 0 && name[0] == '[')
+							return value;
+					}
+
+					return "[" + value + "]";
+
+				case ConvertType.NameToDatabase:
+				case ConvertType.NameToOwner:
+				case ConvertType.NameToQueryTable:
+					{
+						var name = value.ToString();
+
+						if (name.Length > 0 && name[0] == '[')
+							return value;
+
+						if (name.IndexOf('.') > 0)
+							value = string.Join("].[", name.Split('.'));
+					}
+
+					return "[" + value + "]";
+
+				case ConvertType.SprocParameterToName:
+					if (value != null)
+					{
+						var str = value.ToString();
+						return str.Length > 0 && str[0] == '@'? str.Substring(1): str;
+					}
+					break;
+			}
+
+			return value;
+		}
+
+		protected override void BuildInsertOrUpdateQuery(StringBuilder sb)
+		{
+			BuildInsertOrUpdateQueryAsUpdateInsert(sb);
+		}
+
+		protected override void BuildDateTime(StringBuilder sb, object value)
+		{
+			sb.Append(string.Format("'{0:yyyy-MM-ddTHH:mm:ss.fff}'", value));
+		}
+
+		public override void BuildValue(StringBuilder sb, object value)
+		{
+			if      (value is sbyte)  sb.Append((byte)(sbyte)value);
+			else if (value is ushort) sb.Append((short)(ushort)value);
+			else if (value is uint)   sb.Append((int)(uint)value);
+			else if (value is ulong)  sb.Append((long)(ulong)value);
+			else base.BuildValue(sb, value);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlProvider/MsSql2000SqlProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,90 @@
+using System;
+using System.Data;
+using System.Text;
+
+namespace BLToolkit.Data.Sql.SqlProvider
+{
+	using Reflection;
+
+	public class MsSql2000SqlProvider : MsSqlSqlProvider
+	{
+		protected override string FirstFormat              { get { return "TOP {0}"; } }
+
+		public    override bool   IsSkipSupported          { get { return false;     } }
+		public    override bool   IsApplyJoinSupported     { get { return false;     } }
+		public    override bool   TakeAcceptsParameter     { get { return false;     } }
+		public    override bool   IsCountSubQuerySupported { get { return false;     } }
+
+		public override ISqlExpression ConvertExpression(ISqlExpression expr)
+		{
+			expr = base.ConvertExpression(expr);
+
+			if (expr is SqlFunction)
+			{
+				var func = (SqlFunction)expr;
+
+				switch (Type.GetTypeCode(TypeHelper.GetUnderlyingType(func.SystemType)))
+				{
+					case TypeCode.DateTime :
+
+						if (func.Name == "Convert")
+						{
+							var type1 = TypeHelper.GetUnderlyingType(func.Parameters[1].SystemType);
+
+							if (IsTimeDataType(func.Parameters[0]))
+							{
+								if (type1 == typeof(DateTime) || type1 == typeof(DateTimeOffset))
+									return new SqlExpression(
+										func.SystemType, "Cast(Convert(Char, {0}, 114) as DateTime)", Precedence.Primary, func.Parameters[1]);
+
+								if (func.Parameters[1].SystemType == typeof(string))
+									return func.Parameters[1];
+
+								return new SqlExpression(
+									func.SystemType, "Convert(Char, {0}, 114)", Precedence.Primary, func.Parameters[1]);
+							}
+
+							if (type1 == typeof(DateTime) || type1 == typeof(DateTimeOffset))
+							{
+								if (IsDateDataType(func.Parameters[0], "Datetime"))
+									return new SqlExpression(
+										func.SystemType, "Cast(Floor(Cast({0} as Float)) as DateTime)", Precedence.Primary, func.Parameters[1]);
+							}
+
+							if (func.Parameters.Length == 2 && func.Parameters[0] is SqlDataType && func.Parameters[0] == SqlDataType.DateTime)
+								return new SqlFunction(func.SystemType, func.Name, func.Precedence, func.Parameters[0], func.Parameters[1], new SqlValue(120));
+						}
+
+						break;
+				}
+			}
+
+			return expr;
+		}
+
+		protected override void BuildFunction(StringBuilder sb, SqlFunction func)
+		{
+			func = ConvertFunctionParameters(func);
+			base.BuildFunction(sb, func);
+		}
+
+		protected override ISqlProvider CreateSqlProvider()
+		{
+			return new MsSql2000SqlProvider();
+		}
+
+		protected override void BuildDataType(System.Text.StringBuilder sb, SqlDataType type)
+		{
+			switch (type.SqlDbType)
+			{
+#if !MONO
+				case SqlDbType.DateTimeOffset :
+				case SqlDbType.DateTime2      :
+#endif
+				case SqlDbType.Time           :
+				case SqlDbType.Date           : sb.Append("DateTime");        break;
+				default                       : base.BuildDataType(sb, type); break;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlProvider/MsSql2005SqlProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,83 @@
+using System;
+using System.Data;
+using System.Text;
+
+namespace BLToolkit.Data.Sql.SqlProvider
+{
+	using Reflection;
+
+	public class MsSql2005SqlProvider : MsSqlSqlProvider
+	{
+		public override ISqlExpression ConvertExpression(ISqlExpression expr)
+		{
+			expr = base.ConvertExpression(expr);
+
+			if (expr is SqlFunction)
+			{
+				var func = (SqlFunction)expr;
+
+				switch (Type.GetTypeCode(TypeHelper.GetUnderlyingType(func.SystemType)))
+				{
+					case TypeCode.DateTime :
+
+						if (func.Name == "Convert")
+						{
+							var type1 = TypeHelper.GetUnderlyingType(func.Parameters[1].SystemType);
+
+							if (IsTimeDataType(func.Parameters[0]))
+							{
+								if (type1 == typeof(DateTime) || type1 == typeof(DateTimeOffset))
+									return new SqlExpression(
+										func.SystemType, "Cast(Convert(Char, {0}, 114) as DateTime)", Precedence.Primary, func.Parameters[1]);
+
+								if (func.Parameters[1].SystemType == typeof(string))
+									return func.Parameters[1];
+
+								return new SqlExpression(
+									func.SystemType, "Convert(Char, {0}, 114)", Precedence.Primary, func.Parameters[1]);
+							}
+
+							if (type1 == typeof(DateTime) || type1 == typeof(DateTimeOffset))
+							{
+								if (IsDateDataType(func.Parameters[0], "Datetime"))
+									return new SqlExpression(
+										func.SystemType, "Cast(Floor(Cast({0} as Float)) as DateTime)", Precedence.Primary, func.Parameters[1]);
+							}
+
+							if (func.Parameters.Length == 2 && func.Parameters[0] is SqlDataType && func.Parameters[0] == SqlDataType.DateTime)
+								return new SqlFunction(func.SystemType, func.Name, func.Precedence, func.Parameters[0], func.Parameters[1], new SqlValue(120));
+						}
+
+						break;
+				}
+			}
+
+			return expr;
+		}
+
+		protected override void BuildFunction(StringBuilder sb, SqlFunction func)
+		{
+			func = ConvertFunctionParameters(func);
+			base.BuildFunction(sb, func);
+		}
+
+		protected override ISqlProvider CreateSqlProvider()
+		{
+			return new MsSql2005SqlProvider();
+		}
+
+		protected override void BuildDataType(System.Text.StringBuilder sb, SqlDataType type)
+		{
+			switch (type.SqlDbType)
+			{
+#if !MONO
+				case SqlDbType.DateTimeOffset :
+				case SqlDbType.DateTime2      :
+#endif
+				case SqlDbType.Time           :
+				case SqlDbType.Date           : sb.Append("DateTime");        break;
+				default                       : base.BuildDataType(sb, type); break;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlProvider/MsSql2008SqlProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,25 @@
+using System;
+using System.Text;
+
+namespace BLToolkit.Data.Sql.SqlProvider
+{
+	public class MsSql2008SqlProvider : MsSqlSqlProvider
+	{
+		protected override ISqlProvider CreateSqlProvider()
+		{
+			return new MsSql2008SqlProvider();
+		}
+
+		protected override void BuildFunction(StringBuilder sb, SqlFunction func)
+		{
+			func = ConvertFunctionParameters(func);
+			base.BuildFunction(sb, func);
+		}
+
+		protected override void BuildInsertOrUpdateQuery(StringBuilder sb)
+		{
+			BuildInsertOrUpdateQueryAsMerge(sb, null);
+			sb.AppendLine(";");
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlProvider/MsSql2012SqlProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,89 @@
+using System;
+using System.Text;
+
+namespace BLToolkit.Data.Sql.SqlProvider
+{
+	public class MsSql2012SqlProvider : MsSqlSqlProvider
+	{
+		protected override string LimitFormat         { get { return SqlQuery.Select.SkipValue != null ? "FETCH NEXT {0} ROWS ONLY" : null; } }
+		protected override string OffsetFormat        { get { return "OFFSET {0} ROWS"; } }
+		protected override bool   OffsetFirst         { get { return true;              } }
+		protected override bool   BuildAlternativeSql { get { return false;             } }
+
+		protected override ISqlProvider CreateSqlProvider()
+		{
+			return new MsSql2012SqlProvider();
+		}
+
+		protected override void BuildInsertOrUpdateQuery(StringBuilder sb)
+		{
+			BuildInsertOrUpdateQueryAsMerge(sb, null);
+			sb.AppendLine(";");
+		}
+
+		protected override void BuildSql(StringBuilder sb)
+		{
+			if (NeedSkip && SqlQuery.OrderBy.IsEmpty)
+			{
+				for (var i = 0; i < SqlQuery.Select.Columns.Count; i++)
+					SqlQuery.OrderBy.ExprAsc(new SqlValue(i + 1));
+			}
+
+			base.BuildSql(sb);
+		}
+
+		protected override void BuildFunction(StringBuilder sb, SqlFunction func)
+		{
+			func = ConvertFunctionParameters(func);
+
+			switch (func.Name)
+			{
+				case "CASE"     : func = ConvertCase(func.SystemType, func.Parameters, 0); break;
+				case "Coalesce" :
+
+					if (func.Parameters.Length > 2)
+					{
+						var parms = new ISqlExpression[func.Parameters.Length - 1];
+
+						Array.Copy(func.Parameters, 1, parms, 0, parms.Length);
+						BuildFunction(sb, new SqlFunction(func.SystemType, func.Name, func.Parameters[0],
+						                  new SqlFunction(func.SystemType, func.Name, parms)));
+						return;
+					}
+
+					var sc = new SqlQuery.SearchCondition();
+
+					sc.Conditions.Add(new SqlQuery.Condition(false, new SqlQuery.Predicate.IsNull(func.Parameters[0], false)));
+
+					func = new SqlFunction(func.SystemType, "IIF", sc, func.Parameters[1], func.Parameters[0]);
+
+					break;
+			}
+
+			base.BuildFunction(sb, func);
+		}
+
+		static SqlFunction ConvertCase(Type systemType, ISqlExpression[] parameters, int start)
+		{
+			var len  = parameters.Length - start;
+			var name = start == 0 ? "IIF" : "CASE";
+			var cond = parameters[start];
+
+			if (start == 0 && SqlExpression.NeedsEqual(cond))
+			{
+				cond = new SqlQuery.SearchCondition(
+					new SqlQuery.Condition(
+						false,
+						new SqlQuery.Predicate.ExprExpr(cond, SqlQuery.Predicate.Operator.Equal, new SqlValue(1))));
+			}
+
+			if (len == 3)
+				return new SqlFunction(systemType, name, cond, parameters[start + 1], parameters[start + 2]);
+
+			return new SqlFunction(systemType, name,
+				cond,
+				parameters[start + 1],
+				ConvertCase(systemType, parameters, start + 2));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlProvider/MySqlSqlProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,348 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Text;
+
+namespace BLToolkit.Data.Sql.SqlProvider
+{
+	using DataProvider;
+	using Reflection;
+
+	public class MySqlSqlProvider : BasicSqlProvider
+	{
+		public override int CommandCount(SqlQuery sqlQuery)
+		{
+			return sqlQuery.IsInsert && sqlQuery.Insert.WithIdentity ? 2 : 1;
+		}
+
+		protected override void BuildCommand(int commandNumber, StringBuilder sb)
+		{
+			sb.AppendLine("SELECT LAST_INSERT_ID()");
+		}
+
+		protected override ISqlProvider CreateSqlProvider()
+		{
+			return new MySqlSqlProvider();
+		}
+
+		protected override string LimitFormat { get { return "LIMIT {0}"; } }
+
+		public override bool IsNestedJoinParenthesisRequired { get { return true; } }
+
+		protected override void BuildOffsetLimit(StringBuilder sb)
+		{
+			if (SqlQuery.Select.SkipValue == null)
+				base.BuildOffsetLimit(sb);
+			else
+			{
+				AppendIndent(sb)
+					.AppendFormat(
+						"LIMIT {0},{1}",
+						BuildExpression(new StringBuilder(), SqlQuery.Select.SkipValue),
+						SqlQuery.Select.TakeValue == null ?
+							long.MaxValue.ToString() :
+							BuildExpression(new StringBuilder(), SqlQuery.Select.TakeValue).ToString())
+					.AppendLine();
+			}
+		}
+
+		public override ISqlExpression ConvertExpression(ISqlExpression expr)
+		{
+			expr = base.ConvertExpression(expr);
+
+			if (expr is SqlBinaryExpression)
+			{
+				var be = (SqlBinaryExpression)expr;
+
+				switch (be.Operation)
+				{
+					case "+":
+						if (be.SystemType == typeof(string))
+						{
+							if (be.Expr1 is SqlFunction)
+							{
+								var func = (SqlFunction)be.Expr1;
+
+								if (func.Name == "Concat")
+								{
+									var list = new List<ISqlExpression>(func.Parameters) { be.Expr2 };
+									return new SqlFunction(be.SystemType, "Concat", list.ToArray());
+								}
+							}
+
+							return new SqlFunction(be.SystemType, "Concat", be.Expr1, be.Expr2);
+						}
+
+						break;
+				}
+			}
+			else if (expr is SqlFunction)
+			{
+				var func = (SqlFunction) expr;
+
+				switch (func.Name)
+				{
+					case "Convert" :
+						var ftype = TypeHelper.GetUnderlyingType(func.SystemType);
+
+						if (ftype == typeof(bool))
+						{
+							var ex = AlternativeConvertToBoolean(func, 1);
+							if (ex != null)
+								return ex;
+						}
+
+						if ((ftype == typeof(double) || ftype == typeof(float)) && TypeHelper.GetUnderlyingType(func.Parameters[1].SystemType) == typeof(decimal))
+							return func.Parameters[1];
+
+						return new SqlExpression(func.SystemType, "Cast({0} as {1})", Precedence.Primary, FloorBeforeConvert(func), func.Parameters[0]);
+				}
+			}
+			else if (expr is SqlExpression)
+			{
+				var e = (SqlExpression)expr;
+
+				if (e.Expr.StartsWith("Extract(DayOfYear"))
+					return new SqlFunction(e.SystemType, "DayOfYear", e.Parameters);
+
+				if (e.Expr.StartsWith("Extract(WeekDay"))
+					return Inc(
+						new SqlFunction(e.SystemType,
+							"WeekDay",
+							new SqlFunction(
+								null,
+								"Date_Add",
+								e.Parameters[0],
+								new SqlExpression(null, "interval 1 day"))));
+			}
+
+			return expr;
+		}
+
+		protected override void BuildDataType(StringBuilder sb, SqlDataType type)
+		{
+			switch (type.SqlDbType)
+			{
+				case SqlDbType.Int           :
+				case SqlDbType.SmallInt      : sb.Append("Signed");        break;
+				case SqlDbType.TinyInt       : sb.Append("Unsigned");      break;
+				case SqlDbType.Money         : sb.Append("Decimal(19,4)"); break;
+				case SqlDbType.SmallMoney    : sb.Append("Decimal(10,4)"); break;
+#if !MONO
+				case SqlDbType.DateTime2     :
+#endif
+				case SqlDbType.SmallDateTime : sb.Append("DateTime");      break;
+				case SqlDbType.Bit           : sb.Append("Boolean");       break;
+				case SqlDbType.Float         :
+				case SqlDbType.Real          : base.BuildDataType(sb, SqlDataType.Decimal); break;
+				case SqlDbType.VarChar       :
+				case SqlDbType.NVarChar      :
+					sb.Append("Char");
+					if (type.Length > 0)
+						sb.Append('(').Append(type.Length).Append(')');
+					break;
+				default: base.BuildDataType(sb, type); break;
+			}
+		}
+
+		protected override void BuildDeleteClause(StringBuilder sb)
+		{
+			var table = SqlQuery.Delete.Table != null ?
+				(SqlQuery.From.FindTableSource(SqlQuery.Delete.Table) ?? SqlQuery.Delete.Table) :
+				SqlQuery.From.Tables[0];
+
+			AppendIndent(sb)
+				.Append("DELETE ")
+				.Append(Convert(GetTableAlias(table), ConvertType.NameToQueryTableAlias))
+				.AppendLine();
+		}
+
+		protected override void BuildUpdateClause(StringBuilder sb)
+		{
+			base.BuildFromClause(sb);
+			sb.Remove(0, 4).Insert(0, "UPDATE");
+			base.BuildUpdateSet(sb);
+		}
+
+		protected override void BuildFromClause(StringBuilder sb)
+		{
+			if (!SqlQuery.IsUpdate)
+				base.BuildFromClause(sb);
+		}
+
+		public static char ParameterSymbol           { get; set; }
+		public static bool TryConvertParameterSymbol { get; set; }
+
+		private static string _commandParameterPrefix = "";
+		public  static string  CommandParameterPrefix
+		{
+			get { return _commandParameterPrefix; }
+			set { _commandParameterPrefix = string.IsNullOrEmpty(value) ? string.Empty : value; }
+		}
+
+		private static string _sprocParameterPrefix = "";
+		public  static string  SprocParameterPrefix
+		{
+			get { return _sprocParameterPrefix; }
+			set { _sprocParameterPrefix = string.IsNullOrEmpty(value) ? string.Empty : value; }
+		}
+
+		private static List<char> _convertParameterSymbols;
+		public  static List<char>  ConvertParameterSymbols
+		{
+			get { return _convertParameterSymbols; }
+			set { _convertParameterSymbols = value ?? new List<char>(); }
+		}
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			if (value == null)
+				throw new ArgumentNullException("value");
+
+			switch (convertType)
+			{
+				case ConvertType.NameToQueryParameter:
+					return ParameterSymbol + value.ToString();
+
+				case ConvertType.NameToCommandParameter:
+					return ParameterSymbol + CommandParameterPrefix + value;
+
+				case ConvertType.NameToSprocParameter:
+					{
+						var valueStr = value.ToString();
+
+						if(string.IsNullOrEmpty(valueStr))
+							throw new ArgumentException("Argument 'value' must represent parameter name.");
+
+						if (valueStr[0] == ParameterSymbol)
+							valueStr = valueStr.Substring(1);
+
+						if (valueStr.StartsWith(SprocParameterPrefix, StringComparison.Ordinal))
+							valueStr = valueStr.Substring(SprocParameterPrefix.Length);
+
+						return ParameterSymbol + SprocParameterPrefix + valueStr;
+					}
+
+				case ConvertType.SprocParameterToName:
+					{
+						var str = value.ToString();
+						str = (str.Length > 0 && (str[0] == ParameterSymbol || (TryConvertParameterSymbol && ConvertParameterSymbols.Contains(str[0])))) ? str.Substring(1) : str;
+
+						if (!string.IsNullOrEmpty(SprocParameterPrefix) && str.StartsWith(SprocParameterPrefix))
+							str = str.Substring(SprocParameterPrefix.Length);
+
+						return str;
+					}
+				case ConvertType.NameToQueryField:
+				case ConvertType.NameToQueryFieldAlias:
+				case ConvertType.NameToQueryTableAlias:
+					{
+						var name = value.ToString();
+						if (name.Length > 0 && name[0] == '`')
+							return value;
+					}
+					return "`" + value + "`";
+				case ConvertType.NameToDatabase:
+				case ConvertType.NameToOwner:
+				case ConvertType.NameToQueryTable:
+					{
+						var name = value.ToString();
+						if (name.Length > 0 && name[0] == '`')
+						return value;
+
+						if (name.IndexOf('.') > 0)
+						value = string.Join("`.`", name.Split('.'));
+					}
+					return "`" + value + "`";
+
+			}
+
+			return value;
+		}
+
+		protected override StringBuilder BuildExpression(StringBuilder sb, ISqlExpression expr, bool buildTableName, bool checkParentheses, string alias, ref bool addAlias)
+		{
+			return base.BuildExpression(
+				sb,
+				expr,
+				buildTableName && SqlQuery.QueryType != QueryType.InsertOrUpdate,
+				checkParentheses,
+				alias,
+				ref addAlias);
+		}
+
+		protected override void BuildInsertOrUpdateQuery(StringBuilder sb)
+		{
+			BuildInsertQuery(sb);
+			AppendIndent(sb).AppendLine("ON DUPLICATE KEY UPDATE");
+
+			Indent++;
+
+			var first = true;
+
+			foreach (var expr in SqlQuery.Update.Items)
+			{
+				if (!first)
+					sb.Append(',').AppendLine();
+				first = false;
+
+				AppendIndent(sb);
+				BuildExpression(sb, expr.Column, false, true);
+				sb.Append(" = ");
+				BuildExpression(sb, expr.Expression, false, true);
+			}
+
+			Indent--;
+
+			sb.AppendLine();
+		}
+
+		protected override void BuildEmptyInsert(StringBuilder sb)
+		{
+			sb.AppendLine("() VALUES ()");
+		}
+
+		public static bool GenerateOldGuid = false;
+
+		public override void BuildValue(StringBuilder sb, object value)
+		{
+			if (GenerateOldGuid && value is Guid)
+			{
+				var bytes = ((Guid)value).ToByteArray();
+
+				sb.Append("X'").Append(ByteArrayToHex(bytes)).Append('\'');
+			}
+			else
+				base.BuildValue(sb, value);
+		}
+
+		static string ByteArrayToHex(byte[] barray)
+		{
+			var c = new char[barray.Length * 2];
+
+			for (var i = 0; i < barray.Length; ++i)
+			{
+				var b = ((byte)(barray[i] >> 4));
+
+				c[i * 2] = (char)(b > 9 ? b + 0x37 : b + 0x30);
+				b = ((byte)(barray[i] & 0xF));
+				c[i * 2 + 1] = (char)(b > 9 ? b + 0x37 : b + 0x30);
+			}
+
+			return new string(c);
+		}
+
+		protected override void BuildString(StringBuilder sb, string value)
+		{
+			base.BuildString(sb, value.Replace("\\", "\\\\"));
+		}
+
+		protected override void BuildChar(StringBuilder sb, char value)
+		{
+			if (value == '\\')
+				sb.Append("\\\\");
+			else
+				base.BuildChar(sb, value);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlProvider/OracleSqlProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,378 @@
+using System;
+using System.Data;
+using System.Text;
+
+namespace BLToolkit.Data.Sql.SqlProvider
+{
+	using DataProvider;
+	using Reflection;
+
+	public class OracleSqlProvider : BasicSqlProvider
+	{
+		public override bool IsCountSubQuerySupported    { get { return false; } }
+		public override bool IsIdentityParameterRequired { get { return true;  } }
+		public override int  MaxInListValuesCount        { get { return 1000;  } }
+
+		protected override void BuildSelectClause(StringBuilder sb)
+		{
+			if (SqlQuery.From.Tables.Count == 0)
+			{
+				AppendIndent(sb).Append("SELECT").AppendLine();
+				BuildColumns(sb);
+				AppendIndent(sb).Append("FROM SYS.DUAL").AppendLine();
+			}
+			else
+				base.BuildSelectClause(sb);
+		}
+
+		protected override void BuildGetIdentity(StringBuilder sb)
+		{
+			var identityField = SqlQuery.Insert.Into.GetIdentityField();
+
+			if (identityField == null)
+				throw new SqlException("Identity field must be defined for '{0}'.", SqlQuery.Insert.Into.Name);
+
+			AppendIndent(sb).AppendLine("RETURNING");
+			AppendIndent(sb).Append("\t");
+			BuildExpression(sb, identityField, false, true);
+			sb.AppendLine(" INTO :IDENTITY_PARAMETER");
+		}
+
+		public override ISqlExpression GetIdentityExpression(SqlTable table, SqlField identityField, bool forReturning)
+		{
+			if (table.SequenceAttributes != null)
+			{
+				var attr = GetSequenceNameAttribute(table, false);
+
+				if (attr != null)
+					return new SqlExpression(attr.SequenceName + ".nextval", Precedence.Primary);
+			}
+
+			return base.GetIdentityExpression(table, identityField, forReturning);
+		}
+
+		protected override bool BuildWhere()
+		{
+			return base.BuildWhere() || !NeedSkip && NeedTake && SqlQuery.OrderBy.IsEmpty && SqlQuery.Having.IsEmpty;
+		}
+
+		string _rowNumberAlias;
+
+		protected override ISqlProvider CreateSqlProvider()
+		{
+			return new OracleSqlProvider();
+		}
+
+		protected override void BuildSql(StringBuilder sb)
+		{
+			var buildRowNum = NeedSkip || NeedTake && (!SqlQuery.OrderBy.IsEmpty || !SqlQuery.Having.IsEmpty);
+			var aliases     = null as string[];
+
+			if (buildRowNum)
+			{
+				aliases = GetTempAliases(2, "t");
+
+				if (_rowNumberAlias == null)
+					_rowNumberAlias = GetTempAliases(1, "rn")[0];
+
+				AppendIndent(sb).AppendFormat("SELECT {0}.*", aliases[1]).AppendLine();
+				AppendIndent(sb).Append("FROM").    AppendLine();
+				AppendIndent(sb).Append("(").       AppendLine();
+				Indent++;
+
+				AppendIndent(sb).AppendFormat("SELECT {0}.*, ROWNUM as {1}", aliases[0], _rowNumberAlias).AppendLine();
+				AppendIndent(sb).Append("FROM").    AppendLine();
+				AppendIndent(sb).Append("(").       AppendLine();
+				Indent++;
+			}
+
+			base.BuildSql(sb);
+
+			if (buildRowNum)
+			{
+				Indent--;
+				AppendIndent(sb).Append(") ").Append(aliases[0]).AppendLine();
+
+				if (NeedTake && NeedSkip)
+				{
+					AppendIndent(sb).AppendLine("WHERE");
+					AppendIndent(sb).Append("\tROWNUM <= ");
+					BuildExpression(sb, Add<int>(SqlQuery.Select.SkipValue, SqlQuery.Select.TakeValue));
+					sb.AppendLine();
+				}
+
+				Indent--;
+				AppendIndent(sb).Append(") ").Append(aliases[1]).AppendLine();
+				AppendIndent(sb).Append("WHERE").AppendLine();
+
+				Indent++;
+
+				if (NeedTake && NeedSkip)
+				{
+					AppendIndent(sb).AppendFormat("{0}.{1} > ", aliases[1], _rowNumberAlias);
+					BuildExpression(sb, SqlQuery.Select.SkipValue);
+				}
+				else if (NeedTake)
+				{
+					AppendIndent(sb).AppendFormat("{0}.{1} <= ", aliases[1], _rowNumberAlias);
+					BuildExpression(sb, Precedence.Comparison, SqlQuery.Select.TakeValue);
+				}
+				else
+				{
+					AppendIndent(sb).AppendFormat("{0}.{1} > ", aliases[1], _rowNumberAlias);
+					BuildExpression(sb, Precedence.Comparison, SqlQuery.Select.SkipValue);
+				}
+
+				sb.AppendLine();
+				Indent--;
+			}
+		}
+
+		protected override void BuildWhereSearchCondition(StringBuilder sb, SqlQuery.SearchCondition condition)
+		{
+			if (NeedTake && !NeedSkip && SqlQuery.OrderBy.IsEmpty && SqlQuery.Having.IsEmpty)
+			{
+				BuildPredicate(
+					sb,
+					Precedence.LogicalConjunction,
+					new SqlQuery.Predicate.ExprExpr(
+						new SqlExpression(null, "ROWNUM", Precedence.Primary),
+						SqlQuery.Predicate.Operator.LessOrEqual,
+						SqlQuery.Select.TakeValue));
+
+				if (base.BuildWhere())
+				{
+					sb.Append(" AND ");
+					BuildSearchCondition(sb, Precedence.LogicalConjunction, condition);
+				}
+			}
+			else
+				BuildSearchCondition(sb, Precedence.Unknown, condition);
+		}
+
+		public override ISqlExpression ConvertExpression(ISqlExpression expr)
+		{
+			expr = base.ConvertExpression(expr);
+
+			if (expr is SqlBinaryExpression)
+			{
+				var be = (SqlBinaryExpression)expr;
+
+				switch (be.Operation)
+				{
+					case "%": return new SqlFunction(be.SystemType, "MOD",    be.Expr1, be.Expr2);
+					case "&": return new SqlFunction(be.SystemType, "BITAND", be.Expr1, be.Expr2);
+					case "|": // (a + b) - BITAND(a, b)
+						return Sub(
+							Add(be.Expr1, be.Expr2, be.SystemType),
+							new SqlFunction(be.SystemType, "BITAND", be.Expr1, be.Expr2),
+							be.SystemType);
+
+					case "^": // (a + b) - BITAND(a, b) * 2
+						return Sub(
+							Add(be.Expr1, be.Expr2, be.SystemType),
+							Mul(new SqlFunction(be.SystemType, "BITAND", be.Expr1, be.Expr2), 2),
+							be.SystemType);
+					case "+": return be.SystemType == typeof(string)? new SqlBinaryExpression(be.SystemType, be.Expr1, "||", be.Expr2, be.Precedence): expr;
+				}
+			}
+			else if (expr is SqlFunction)
+			{
+				var func = (SqlFunction) expr;
+
+				switch (func.Name)
+				{
+					case "Coalesce"       : return new SqlFunction(func.SystemType, "Nvl", func.Parameters);
+					case "Convert"        :
+						{
+							var ftype = TypeHelper.GetUnderlyingType(func.SystemType);
+
+							if (ftype == typeof(bool))
+							{
+								var ex = AlternativeConvertToBoolean(func, 1);
+								if (ex != null)
+									return ex;
+							}
+
+							if (ftype == typeof(DateTime) || ftype == typeof(DateTimeOffset))
+							{
+								if (IsTimeDataType(func.Parameters[0]))
+								{
+									if (func.Parameters[1].SystemType == typeof(string))
+										return func.Parameters[1];
+
+									return new SqlFunction(func.SystemType, "To_Char", func.Parameters[1], new SqlValue("HH24:MI:SS"));
+								}
+
+								if (TypeHelper.GetUnderlyingType(func.Parameters[1].SystemType) == typeof(DateTime) &&
+									IsDateDataType(func.Parameters[0], "Date"))
+								{
+									return new SqlFunction(func.SystemType, "Trunc", func.Parameters[1], new SqlValue("DD"));
+								}
+
+								return new SqlFunction(func.SystemType, "To_Timestamp", func.Parameters[1], new SqlValue("YYYY-MM-DD HH24:MI:SS"));
+							}
+
+							return new SqlExpression(func.SystemType, "Cast({0} as {1})", Precedence.Primary, FloorBeforeConvert(func), func.Parameters[0]);
+						}
+					case "ContainsExactly":
+						return func.Parameters.Length == 2 ?
+							new SqlFunction(func.SystemType, "Contains", func.Parameters[1], func.Parameters[0]) :
+							new SqlFunction(func.SystemType, "Contains", func.Parameters[1], func.Parameters[0], func.Parameters[2]);
+					case "CharIndex"      :
+						return func.Parameters.Length == 2?
+							new SqlFunction(func.SystemType, "InStr", func.Parameters[1], func.Parameters[0]):
+							new SqlFunction(func.SystemType, "InStr", func.Parameters[1], func.Parameters[0], func.Parameters[2]);
+					case "AddYear"        : return new SqlFunction(func.SystemType, "Add_Months", func.Parameters[0], Mul(func.Parameters[1], 12));
+					case "AddQuarter"     : return new SqlFunction(func.SystemType, "Add_Months", func.Parameters[0], Mul(func.Parameters[1],  3));
+					case "AddMonth"       : return new SqlFunction(func.SystemType, "Add_Months", func.Parameters[0],     func.Parameters[1]);
+					case "AddDayOfYear"   :
+					case "AddWeekDay"     :
+					case "AddDay"         : return Add<DateTime>(func.Parameters[0],     func.Parameters[1]);
+					case "AddWeek"        : return Add<DateTime>(func.Parameters[0], Mul(func.Parameters[1], 7));
+					case "AddHour"        : return Add<DateTime>(func.Parameters[0], Div(func.Parameters[1],                  24));
+					case "AddMinute"      : return Add<DateTime>(func.Parameters[0], Div(func.Parameters[1],             60 * 24));
+					case "AddSecond"      : return Add<DateTime>(func.Parameters[0], Div(func.Parameters[1],        60 * 60 * 24));
+					case "AddMillisecond" : return Add<DateTime>(func.Parameters[0], Div(func.Parameters[1], 1000 * 60 * 60 * 24));
+					case "Avg"            : 
+						return new SqlFunction(
+							func.SystemType,
+							"Round",
+							new SqlFunction(func.SystemType, "AVG", func.Parameters[0]),
+							new SqlValue(27));
+				}
+			}
+			else if (expr is SqlExpression)
+			{
+				var e = (SqlExpression)expr;
+
+				if (e.Expr.StartsWith("To_Number(To_Char(") && e.Expr.EndsWith(", 'FF'))"))
+					return Div(new SqlExpression(e.SystemType, e.Expr.Replace("To_Number(To_Char(", "to_Number(To_Char("), e.Parameters), 1000);
+			}
+
+			return expr;
+		}
+
+		protected override void BuildFunction(StringBuilder sb, SqlFunction func)
+		{
+			func = ConvertFunctionParameters(func);
+			base.BuildFunction(sb, func);
+		}
+
+		protected override void BuildDataType(StringBuilder sb, SqlDataType type)
+		{
+			switch (type.SqlDbType)
+			{
+				case SqlDbType.BigInt     : sb.Append("Number(19)");      break;
+				case SqlDbType.TinyInt    : sb.Append("Number(3)");       break;
+				case SqlDbType.Money      : sb.Append("Number(19,4)");    break;
+				case SqlDbType.SmallMoney : sb.Append("Number(10,4)");    break;
+				case SqlDbType.NVarChar   :
+					sb.Append("VarChar2");
+					if (type.Length > 0)
+						sb.Append('(').Append(type.Length).Append(')');
+					break;
+				default                   : base.BuildDataType(sb, type); break;
+			}
+		}
+
+		public override SqlQuery Finalize(SqlQuery sqlQuery)
+		{
+			CheckAliases(sqlQuery, 30);
+
+			new QueryVisitor().Visit(sqlQuery.Select, element =>
+			{
+				if (element.ElementType == QueryElementType.SqlParameter)
+					((SqlParameter)element).IsQueryParameter = false;
+			});
+
+			sqlQuery = base.Finalize(sqlQuery);
+
+			switch (sqlQuery.QueryType)
+			{
+				case QueryType.Delete : return GetAlternativeDelete(sqlQuery);
+				case QueryType.Update : return GetAlternativeUpdate(sqlQuery);
+				default               : return sqlQuery;
+			}
+		}
+
+		protected override void BuildFromClause(StringBuilder sb)
+		{
+			if (!SqlQuery.IsUpdate)
+				base.BuildFromClause(sb);
+		}
+
+		public override void BuildValue(StringBuilder sb, object value)
+		{
+			if (value is Guid)
+			{
+				var s = ((Guid)value).ToString("N");
+
+				sb
+					.Append("Cast('")
+					.Append(s.Substring( 6,  2))
+					.Append(s.Substring( 4,  2))
+					.Append(s.Substring( 2,  2))
+					.Append(s.Substring( 0,  2))
+					.Append(s.Substring(10,  2))
+					.Append(s.Substring( 8,  2))
+					.Append(s.Substring(14,  2))
+					.Append(s.Substring(12,  2))
+					.Append(s.Substring(16, 16))
+					.Append("' as raw(16))");
+			}
+			else if (value is DateTime)
+			{
+				sb.AppendFormat("TO_TIMESTAMP('{0:yyyy-MM-dd HH:mm:ss.fffffff}', 'YYYY-MM-DD HH24:MI:SS.FF7')", value);
+			}
+			else
+				base.BuildValue(sb, value);
+		}
+
+		protected override void BuildColumnExpression(StringBuilder sb, ISqlExpression expr, string alias, ref bool addAlias)
+		{
+			var wrap = false;
+
+			if (expr.SystemType == typeof(bool))
+			{
+				if (expr is SqlQuery.SearchCondition)
+					wrap = true;
+				else
+				{
+					var ex = expr as SqlExpression;
+					wrap = ex != null && ex.Expr == "{0}" && ex.Parameters.Length == 1 && ex.Parameters[0] is SqlQuery.SearchCondition;
+				}
+			}
+
+			if (wrap) sb.Append("CASE WHEN ");
+			base.BuildColumnExpression(sb, expr, alias, ref addAlias);
+			if (wrap) sb.Append(" THEN 1 ELSE 0 END");
+		}
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			switch (convertType)
+			{
+				case ConvertType.NameToQueryParameter:
+					return ":" + value;
+			}
+
+			return value;
+		}
+
+		protected override void BuildInsertOrUpdateQuery(StringBuilder sb)
+		{
+			BuildInsertOrUpdateQueryAsMerge(sb, "FROM SYS.DUAL");
+		}
+
+		protected override void BuildEmptyInsert(StringBuilder sb)
+		{
+			sb.Append("VALUES ");
+
+			foreach (var col in SqlQuery.Insert.Into.Fields)
+				sb.Append("(DEFAULT)");
+
+			sb.AppendLine();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlProvider/PostgreSQLSqlProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,208 @@
+using System;
+using System.Data;
+using System.Text;
+
+namespace BLToolkit.Data.Sql.SqlProvider
+{
+	using DataProvider;
+	using Reflection;
+
+	public class PostgreSQLSqlProvider : BasicSqlProvider
+	{
+		public override bool IsInsertOrUpdateSupported { get { return false; } }
+
+		public override int CommandCount(SqlQuery sqlQuery)
+		{
+			return sqlQuery.IsInsert && sqlQuery.Insert.WithIdentity ? 2 : 1;
+		}
+
+		protected override void BuildCommand(int commandNumber, StringBuilder sb)
+		{
+			var into = SqlQuery.Insert.Into;
+			var attr = GetSequenceNameAttribute(into, false);
+			var name =
+				attr != null ?
+					attr.SequenceName :
+					Convert(
+						string.Format("{0}_{1}_seq", into.PhysicalName, into.GetIdentityField().PhysicalName),
+						ConvertType.NameToQueryField);
+
+			AppendIndent(sb)
+				.Append("SELECT currval('")
+				.Append(name)
+				.AppendLine("')");
+		}
+
+		protected override ISqlProvider CreateSqlProvider()
+		{
+			return new PostgreSQLSqlProvider();
+		}
+
+		protected override string LimitFormat  { get { return "LIMIT {0}";   } }
+		protected override string OffsetFormat { get { return "OFFSET {0} "; } }
+
+		public override ISqlExpression ConvertExpression(ISqlExpression expr)
+		{
+			expr = base.ConvertExpression(expr);
+
+			if (expr is SqlBinaryExpression)
+			{
+				var be = (SqlBinaryExpression)expr;
+
+				switch (be.Operation)
+				{
+					case "^": return new SqlBinaryExpression(be.SystemType, be.Expr1, "#", be.Expr2);
+					case "+": return be.SystemType == typeof(string)? new SqlBinaryExpression(be.SystemType, be.Expr1, "||", be.Expr2, be.Precedence): expr;
+				}
+			}
+			else if (expr is SqlFunction)
+			{
+				var func = (SqlFunction) expr;
+
+				switch (func.Name)
+				{
+					case "Convert"   :
+						if (TypeHelper.GetUnderlyingType(func.SystemType) == typeof(bool))
+						{
+							var ex = AlternativeConvertToBoolean(func, 1);
+							if (ex != null)
+								return ex;
+						}
+
+						return new SqlExpression(func.SystemType, "Cast({0} as {1})", Precedence.Primary, FloorBeforeConvert(func), func.Parameters[0]);
+
+					case "CharIndex" :
+						return func.Parameters.Length == 2?
+							new SqlExpression(func.SystemType, "Position({0} in {1})", Precedence.Primary, func.Parameters[0], func.Parameters[1]):
+							Add<int>(
+								new SqlExpression(func.SystemType, "Position({0} in {1})", Precedence.Primary, func.Parameters[0],
+									ConvertExpression(new SqlFunction(typeof(string), "Substring",
+										func.Parameters[1],
+										func.Parameters[2],
+										Sub<int>(ConvertExpression(new SqlFunction(typeof(int), "Length", func.Parameters[1])), func.Parameters[2])))),
+								Sub(func.Parameters[2], 1));
+				}
+			}
+			else if (expr is SqlExpression)
+			{
+				var e = (SqlExpression)expr;
+
+				if (e.Expr.StartsWith("Extract(DOW"))
+					return Inc(new SqlExpression(expr.SystemType, e.Expr.Replace("Extract(DOW", "Extract(Dow"), e.Parameters));
+
+				if (e.Expr.StartsWith("Extract(Millisecond"))
+					return new SqlExpression(expr.SystemType, "Cast(To_Char({0}, 'MS') as int)", e.Parameters);
+			}
+
+			return expr;
+		}
+
+		public override void BuildValue(StringBuilder sb, object value)
+		{
+			if (value is bool)
+				sb.Append(value);
+			else
+				base.BuildValue(sb, value);
+		}
+
+		protected override void BuildDataType(StringBuilder sb, SqlDataType type)
+		{
+			switch (type.SqlDbType)
+			{
+				case SqlDbType.TinyInt       : sb.Append("SmallInt");        break;
+				case SqlDbType.Money         : sb.Append("Decimal(19,4)");   break;
+				case SqlDbType.SmallMoney    : sb.Append("Decimal(10,4)");   break;
+#if !MONO
+				case SqlDbType.DateTime2     :
+#endif
+				case SqlDbType.SmallDateTime :
+				case SqlDbType.DateTime      : sb.Append("TimeStamp");       break;
+				case SqlDbType.Bit           : sb.Append("Boolean");         break;
+				case SqlDbType.NVarChar      :
+					sb.Append("VarChar");
+					if (type.Length > 0)
+						sb.Append('(').Append(type.Length).Append(')');
+					break;
+				default                      : base.BuildDataType(sb, type); break;
+			}
+		}
+
+		public override SqlQuery Finalize(SqlQuery sqlQuery)
+		{
+			CheckAliases(sqlQuery, int.MaxValue);
+
+			sqlQuery = base.Finalize(sqlQuery);
+
+			switch (sqlQuery.QueryType)
+			{
+				case QueryType.Delete : return GetAlternativeDelete(sqlQuery);
+				case QueryType.Update : return GetAlternativeUpdate(sqlQuery);
+				default               : return sqlQuery;
+			}
+		}
+
+		protected override void BuildFromClause(StringBuilder sb)
+		{
+			if (!SqlQuery.IsUpdate)
+				base.BuildFromClause(sb);
+		}
+
+		public static bool QuoteIdentifiers;
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			switch (convertType)
+			{
+				case ConvertType.NameToQueryField:
+				case ConvertType.NameToQueryFieldAlias:
+				case ConvertType.NameToQueryTable:
+				case ConvertType.NameToQueryTableAlias:
+					if (QuoteIdentifiers)
+					{
+						var name = value.ToString();
+
+						if (name.Length > 0 && name[0] == '"')
+							return value;
+
+						return '"' + name + '"';
+					}
+
+					break;
+
+				case ConvertType.NameToQueryParameter:
+				case ConvertType.NameToCommandParameter:
+				case ConvertType.NameToSprocParameter:
+					return ":" + value;
+
+				case ConvertType.SprocParameterToName:
+					if (value != null)
+					{
+						var str = value.ToString();
+						return (str.Length > 0 && str[0] == ':')? str.Substring(1): str;
+					}
+
+					break;
+			}
+
+			return value;
+		}
+
+		public override ISqlExpression GetIdentityExpression(SqlTable table, SqlField identityField, bool forReturning)
+		{
+			if (table.SequenceAttributes != null)
+			{
+				var attr = GetSequenceNameAttribute(table, false);
+	
+				if (attr != null)
+					return new SqlExpression("nextval('" + attr.SequenceName+"')", Precedence.Primary);
+			}
+
+			return base.GetIdentityExpression(table, identityField, forReturning);
+		}
+
+		//protected override void BuildInsertOrUpdateQuery(StringBuilder sb)
+		//{
+		//	BuildInsertOrUpdateQueryAsMerge(sb, null);
+		//}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlProvider/SQLiteSqlProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,206 @@
+using System;
+using System.Text;
+
+namespace BLToolkit.Data.Sql.SqlProvider
+{
+	using DataProvider;
+	using Reflection;
+
+	public class SQLiteSqlProvider : BasicSqlProvider
+	{
+		public override int CommandCount(SqlQuery sqlQuery)
+		{
+			return sqlQuery.IsInsert && sqlQuery.Insert.WithIdentity ? 2 : 1;
+		}
+
+		protected override void BuildCommand(int commandNumber, StringBuilder sb)
+		{
+			sb.AppendLine("SELECT last_insert_rowid()");
+		}
+
+		protected override ISqlProvider CreateSqlProvider()
+		{
+			return new SQLiteSqlProvider();
+		}
+
+		protected override string LimitFormat  { get { return "LIMIT {0}";  } }
+		protected override string OffsetFormat { get { return "OFFSET {0}"; } }
+
+		public override bool IsSkipSupported           { get { return SqlQuery.Select.TakeValue != null; } }
+		public override bool IsNestedJoinSupported     { get { return false; } }
+		public override bool IsInsertOrUpdateSupported { get { return false; } }
+
+		public override ISqlExpression ConvertExpression(ISqlExpression expr)
+		{
+			expr = base.ConvertExpression(expr);
+
+			if (expr is SqlBinaryExpression)
+			{
+				var be = (SqlBinaryExpression)expr;
+
+				switch (be.Operation)
+				{
+					case "+": return be.SystemType == typeof(string)? new SqlBinaryExpression(be.SystemType, be.Expr1, "||", be.Expr2, be.Precedence): expr;
+					case "^": // (a + b) - (a & b) * 2
+						return Sub(
+							Add(be.Expr1, be.Expr2, be.SystemType),
+							Mul(new SqlBinaryExpression(be.SystemType, be.Expr1, "&", be.Expr2), 2), be.SystemType);
+				}
+			}
+			else if (expr is SqlFunction)
+			{
+				var func = (SqlFunction) expr;
+
+				switch (func.Name)
+				{
+					case "Space"   : return new SqlFunction(func.SystemType, "PadR", new SqlValue(" "), func.Parameters[0]);
+					case "Convert" :
+						{
+							var ftype = TypeHelper.GetUnderlyingType(func.SystemType);
+
+							if (ftype == typeof(bool))
+							{
+								var ex = AlternativeConvertToBoolean(func, 1);
+								if (ex != null)
+									return ex;
+							}
+
+							if (ftype == typeof(DateTime) || ftype == typeof(DateTimeOffset))
+							{
+								if (IsDateDataType(func.Parameters[0], "Date"))
+									return new SqlFunction(func.SystemType, "Date", func.Parameters[1]);
+								return new SqlFunction(func.SystemType, "DateTime", func.Parameters[1]);
+							}
+
+							return new SqlExpression(func.SystemType, "Cast({0} as {1})", Precedence.Primary, func.Parameters[1], func.Parameters[0]);
+						}
+				}
+			}
+			else if (expr is SqlExpression)
+			{
+				var e = (SqlExpression)expr;
+
+				if (e.Expr.StartsWith("Cast(StrFTime(Quarter"))
+					return Inc(Div(Dec(new SqlExpression(e.SystemType, e.Expr.Replace("Cast(StrFTime(Quarter", "Cast(StrFTime('%m'"), e.Parameters)), 3));
+
+				if (e.Expr.StartsWith("Cast(StrFTime('%w'"))
+					return Inc(new SqlExpression(e.SystemType, e.Expr.Replace("Cast(StrFTime('%w'", "Cast(strFTime('%w'"), e.Parameters));
+
+				if (e.Expr.StartsWith("Cast(StrFTime('%f'"))
+					return new SqlExpression(e.SystemType, "Cast(strFTime('%f', {0}) * 1000 as int) % 1000", Precedence.Multiplicative, e.Parameters);
+
+				if (e.Expr.StartsWith("DateTime"))
+				{
+					if (e.Expr.EndsWith("Quarter')"))
+						return new SqlExpression(e.SystemType, "DateTime({1}, '{0} Month')", Precedence.Primary, Mul(e.Parameters[0], 3), e.Parameters[1]);
+
+					if (e.Expr.EndsWith("Week')"))
+						return new SqlExpression(e.SystemType, "DateTime({1}, '{0} Day')",   Precedence.Primary, Mul(e.Parameters[0], 7), e.Parameters[1]);
+				}
+			}
+
+			return expr;
+		}
+
+		public override SqlQuery Finalize(SqlQuery sqlQuery)
+		{
+			sqlQuery = base.Finalize(sqlQuery);
+
+			switch (sqlQuery.QueryType)
+			{
+				case QueryType.Delete :
+					sqlQuery = GetAlternativeDelete(base.Finalize(sqlQuery));
+					sqlQuery.From.Tables[0].Alias = "$";
+					break;
+
+				case QueryType.Update :
+					sqlQuery = GetAlternativeUpdate(sqlQuery);
+					break;
+			}
+
+			return sqlQuery;
+		}
+
+		protected override void BuildFromClause(StringBuilder sb)
+		{
+			if (!SqlQuery.IsUpdate)
+				base.BuildFromClause(sb);
+		}
+
+		public override void BuildValue(StringBuilder sb, object value)
+		{
+			if (value is Guid)
+			{
+				var s = ((Guid)value).ToString("N");
+
+				sb
+					.Append("Cast(x'")
+					.Append(s.Substring( 6,  2))
+					.Append(s.Substring( 4,  2))
+					.Append(s.Substring( 2,  2))
+					.Append(s.Substring( 0,  2))
+					.Append(s.Substring(10,  2))
+					.Append(s.Substring( 8,  2))
+					.Append(s.Substring(14,  2))
+					.Append(s.Substring(12,  2))
+					.Append(s.Substring(16, 16))
+					.Append("' as blob)");
+			}
+			else
+				base.BuildValue(sb, value);
+		}
+
+		protected override void BuildDateTime(StringBuilder sb, object value)
+		{
+			sb
+				.Append(string.Format("'{0:yyyy-MM-dd HH:mm:ss.fff}", value).TrimEnd('0'))
+				.Append('\'');
+		}
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			switch (convertType)
+			{
+				case ConvertType.NameToQueryParameter:
+				case ConvertType.NameToCommandParameter:
+				case ConvertType.NameToSprocParameter:
+					return "@" + value;
+
+				case ConvertType.NameToQueryField:
+				case ConvertType.NameToQueryFieldAlias:
+				case ConvertType.NameToQueryTableAlias:
+					{
+						var name = value.ToString();
+
+						if (name.Length > 0 && name[0] == '[')
+							return value;
+					}
+
+					return "[" + value + "]";
+
+				case ConvertType.NameToDatabase:
+				case ConvertType.NameToOwner:
+				case ConvertType.NameToQueryTable:
+					{
+						var name = value.ToString();
+
+						if (name.Length > 0 && name[0] == '[')
+							return value;
+
+						if (name.IndexOf('.') > 0)
+							value = string.Join("].[", name.Split('.'));
+					}
+
+					return "[" + value + "]";
+
+				case ConvertType.SprocParameterToName:
+					{
+						var name = (string)value;
+						return name.Length > 0 && name[0] == '@'? name.Substring(1): name;
+					}
+			}
+
+			return value;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlProvider/SequenceNameAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,22 @@
+using System;
+
+namespace BLToolkit.Data.Sql.SqlProvider
+{
+	[AttributeUsageAttribute(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = true)]
+	public class SequenceNameAttribute : Attribute
+	{
+		public SequenceNameAttribute(string providerName, string sequenceName)
+		{
+			ProviderName = providerName;
+			SequenceName = sequenceName;
+		}
+
+		public SequenceNameAttribute(string sequenceName)
+		{
+			SequenceName = sequenceName;
+		}
+
+		private string _providerName; public string ProviderName { get { return _providerName; } set { _providerName = value; } }
+		private string _sequenceName; public string SequenceName { get { return _sequenceName; } set { _sequenceName = value; } }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlProvider/SqlCeSqlProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,262 @@
+using System;
+using System.Data;
+using System.Text;
+
+namespace BLToolkit.Data.Sql.SqlProvider
+{
+	using DataProvider;
+	using Reflection;
+
+	public class SqlCeSqlProvider : BasicSqlProvider
+	{
+		const int Version = 4;
+
+		public override bool IsSkipSupported           { get { return Version == 4; } }
+		public override bool IsTakeSupported           { get { return Version == 4; } }
+		public override bool IsSubQueryTakeSupported   { get { return Version == 4; } }
+		public override bool IsSubQueryColumnSupported { get { return false; } }
+		public override bool IsCountSubQuerySupported  { get { return false; } }
+		public override bool IsApplyJoinSupported      { get { return true;  } }
+		public override bool IsInsertOrUpdateSupported { get { return false; } }
+
+		protected override string FirstFormat  { get { return SqlQuery.Select.SkipValue == null ? "TOP ({0})" :                null; } }
+		protected override string LimitFormat  { get { return SqlQuery.Select.SkipValue != null ? "FETCH NEXT {0} ROWS ONLY" : null; } }
+		protected override string OffsetFormat { get { return "OFFSET {0} ROWS"; } }
+		protected override bool   OffsetFirst  { get { return true;              } }
+
+		public override int CommandCount(SqlQuery sqlQuery)
+		{
+			return sqlQuery.IsInsert && sqlQuery.Insert.WithIdentity ? 2 : 1;
+		}
+
+		protected override void BuildCommand(int commandNumber, StringBuilder sb)
+		{
+			sb.AppendLine("SELECT @@IDENTITY");
+		}
+
+		protected override ISqlProvider CreateSqlProvider()
+		{
+			return new SqlCeSqlProvider();
+		}
+
+		public override ISqlExpression ConvertExpression(ISqlExpression expr)
+		{
+			expr = base.ConvertExpression(expr);
+
+			if (expr is SqlBinaryExpression)
+			{
+				var be = (SqlBinaryExpression)expr;
+
+				switch (be.Operation)
+				{
+					case "%":
+						return TypeHelper.IsIntegerType(be.Expr1.SystemType)?
+							be :
+							new SqlBinaryExpression(
+								typeof(int),
+								new SqlFunction(typeof(int), "Convert", SqlDataType.Int32, be.Expr1),
+								be.Operation,
+								be.Expr2,
+								be.Precedence);
+				}
+			}
+			else if (expr is SqlFunction)
+			{
+				var func = (SqlFunction)expr;
+
+				switch (func.Name)
+				{
+					case "Convert" :
+						switch (Type.GetTypeCode(TypeHelper.GetUnderlyingType(func.SystemType)))
+						{
+							case TypeCode.UInt64 :
+								if (TypeHelper.IsFloatType(func.Parameters[1].SystemType))
+									return new SqlFunction(
+										func.SystemType,
+										func.Name,
+										func.Precedence,
+										func.Parameters[0],
+										new SqlFunction(func.SystemType, "Floor", func.Parameters[1]));
+
+								break;
+
+							case TypeCode.DateTime :
+								var type1 = TypeHelper.GetUnderlyingType(func.Parameters[1].SystemType);
+
+								if (IsTimeDataType(func.Parameters[0]))
+								{
+									if (type1 == typeof(DateTime) || type1 == typeof(DateTimeOffset))
+										return new SqlExpression(
+											func.SystemType, "Cast(Convert(NChar, {0}, 114) as DateTime)", Precedence.Primary, func.Parameters[1]);
+
+									if (func.Parameters[1].SystemType == typeof(string))
+										return func.Parameters[1];
+
+									return new SqlExpression(
+										func.SystemType, "Convert(NChar, {0}, 114)", Precedence.Primary, func.Parameters[1]);
+								}
+
+								if (type1 == typeof(DateTime) || type1 == typeof(DateTimeOffset))
+								{
+									if (IsDateDataType(func.Parameters[0], "Datetime"))
+										return new SqlExpression(
+											func.SystemType, "Cast(Floor(Cast({0} as Float)) as DateTime)", Precedence.Primary, func.Parameters[1]);
+								}
+
+								break;
+						}
+
+						break;
+				}
+			}
+
+			return expr;
+		}
+
+		protected override void BuildFunction(StringBuilder sb, SqlFunction func)
+		{
+			func = ConvertFunctionParameters(func);
+			base.BuildFunction(sb, func);
+		}
+
+		public override SqlQuery Finalize(SqlQuery sqlQuery)
+		{
+			sqlQuery = base.Finalize(sqlQuery);
+
+			new QueryVisitor().Visit(sqlQuery.Select, element =>
+			{
+				if (element.ElementType == QueryElementType.SqlParameter)
+				{
+					((SqlParameter)element).IsQueryParameter = false;
+					sqlQuery.IsParameterDependent = true;
+				}
+			});
+
+			switch (sqlQuery.QueryType)
+			{
+				case QueryType.Delete :
+					sqlQuery = GetAlternativeDelete(sqlQuery);
+					sqlQuery.From.Tables[0].Alias = "$";
+					break;
+
+				case QueryType.Update :
+					sqlQuery = GetAlternativeUpdate(sqlQuery);
+					break;
+			}
+
+			return sqlQuery;
+		}
+
+		protected override void BuildDataType(StringBuilder sb, SqlDataType type)
+		{
+			switch (type.SqlDbType)
+			{
+				case SqlDbType.Char          : base.BuildDataType(sb, new SqlDataType(SqlDbType.NChar,    type.Length)); break;
+				case SqlDbType.VarChar       : base.BuildDataType(sb, new SqlDataType(SqlDbType.NVarChar, type.Length)); break;
+				case SqlDbType.SmallMoney    : sb.Append("Decimal(10,4)");   break;
+#if !MONO
+				case SqlDbType.DateTime2     :
+#endif
+				case SqlDbType.Time          :
+				case SqlDbType.Date          :
+				case SqlDbType.SmallDateTime : sb.Append("DateTime");        break;
+				default                      : base.BuildDataType(sb, type); break;
+			}
+		}
+
+		protected override void BuildFromClause(StringBuilder sb)
+		{
+			if (!SqlQuery.IsUpdate)
+				base.BuildFromClause(sb);
+		}
+
+		protected override void BuildOrderByClause(StringBuilder sb)
+		{
+			if (SqlQuery.OrderBy.Items.Count == 0 && SqlQuery.Select.SkipValue != null)
+			{
+				AppendIndent(sb);
+
+				sb.Append("ORDER BY").AppendLine();
+
+				Indent++;
+
+				AppendIndent(sb);
+
+				BuildExpression(sb, SqlQuery.Select.Columns[0].Expression);
+				sb.AppendLine();
+
+				Indent--;
+			}
+			else
+				base.BuildOrderByClause(sb);
+		}
+
+		protected override void BuildColumnExpression(StringBuilder sb, ISqlExpression expr, string alias, ref bool addAlias)
+		{
+			var wrap = false;
+
+			if (expr.SystemType == typeof(bool))
+			{
+				if (expr is SqlQuery.SearchCondition)
+					wrap = true;
+				else
+				{
+					var ex = expr as SqlExpression;
+					wrap = ex != null && ex.Expr == "{0}" && ex.Parameters.Length == 1 && ex.Parameters[0] is SqlQuery.SearchCondition;
+				}
+			}
+
+			if (wrap) sb.Append("CASE WHEN ");
+			base.BuildColumnExpression(sb, expr, alias, ref addAlias);
+			if (wrap) sb.Append(" THEN 1 ELSE 0 END");
+		}
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			switch (convertType)
+			{
+				case ConvertType.NameToQueryParameter:
+				case ConvertType.NameToCommandParameter:
+				case ConvertType.NameToSprocParameter:
+					return "@" + value;
+
+				case ConvertType.NameToQueryField:
+				case ConvertType.NameToQueryFieldAlias:
+				case ConvertType.NameToQueryTableAlias:
+					{
+						var name = value.ToString();
+
+						if (name.Length > 0 && name[0] == '[')
+							return value;
+					}
+
+					return "[" + value + "]";
+
+				case ConvertType.NameToDatabase:
+				case ConvertType.NameToOwner:
+				case ConvertType.NameToQueryTable:
+					{
+						var name = value.ToString();
+
+						if (name.Length > 0 && name[0] == '[')
+							return value;
+
+						if (name.IndexOf('.') > 0)
+							value = string.Join("].[", name.Split('.'));
+					}
+
+					return "[" + value + "]";
+
+				case ConvertType.SprocParameterToName:
+					if (value != null)
+					{
+						var str = value.ToString();
+						return str.Length > 0 && str[0] == '@'? str.Substring(1): str;
+					}
+					break;
+			}
+
+			return value;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlProvider/SybaseSqlProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,252 @@
+using System;
+using System.Data;
+using System.Text;
+
+namespace BLToolkit.Data.Sql.SqlProvider
+{
+	using DataProvider;
+
+	public class SybaseSqlProvider : BasicSqlProvider
+	{
+		public SybaseSqlProvider()
+		{
+		}
+
+		protected override void BuildGetIdentity(StringBuilder sb)
+		{
+			sb
+				.AppendLine()
+				.AppendLine("SELECT @@IDENTITY");
+		}
+
+		protected override string FirstFormat              { get { return "TOP {0}"; } }
+
+		public    override bool   IsSkipSupported          { get { return false;     } }
+		public    override bool   TakeAcceptsParameter     { get { return false;     } }
+		public    override bool   IsSubQueryTakeSupported  { get { return false;     } }
+		public    override bool   IsCountSubQuerySupported { get { return false;     } }
+		public    override bool   CanCombineParameters     { get { return false;     } }
+
+		public override ISqlExpression ConvertExpression(ISqlExpression expr)
+		{
+			expr = base.ConvertExpression(expr);
+
+			if (expr is SqlFunction)
+			{
+				var func = (SqlFunction) expr;
+
+				switch (func.Name)
+				{
+					case "CharIndex" :
+						if (func.Parameters.Length == 3)
+							return Add<int>(
+								ConvertExpression(new SqlFunction(func.SystemType, "CharIndex",
+									func.Parameters[0],
+									ConvertExpression(new SqlFunction(typeof(string), "Substring",
+										func.Parameters[1],
+										func.Parameters[2], new SqlFunction(typeof(int), "Len", func.Parameters[1]))))),
+								Sub(func.Parameters[2], 1));
+						break;
+
+					case "Stuff"     :
+						if (func.Parameters[3] is SqlValue)
+						{
+							var value = (SqlValue)func.Parameters[3];
+
+							if (value.Value is string && string.IsNullOrEmpty((string)value.Value))
+								return new SqlFunction(
+									func.SystemType,
+									func.Name,
+									func.Precedence,
+									func.Parameters[0],
+									func.Parameters[1],
+									func.Parameters[1],
+									new SqlValue(null));
+						}
+
+						break;
+				}
+			}
+
+			return expr;
+		}
+
+		protected override void BuildFunction(StringBuilder sb, SqlFunction func)
+		{
+			func = ConvertFunctionParameters(func);
+			base.BuildFunction(sb, func);
+		}
+
+		private  bool _isSelect;
+		readonly bool _skipAliases;
+
+		SybaseSqlProvider(bool skipAliases)
+		{
+			_skipAliases = skipAliases;
+		}
+
+		protected override void BuildSelectClause(StringBuilder sb)
+		{
+			_isSelect = true;
+			base.BuildSelectClause(sb);
+			_isSelect = false;
+		}
+
+		protected override void BuildColumnExpression(StringBuilder sb, ISqlExpression expr, string alias, ref bool addAlias)
+		{
+			var wrap = false;
+
+			if (expr.SystemType == typeof(bool))
+			{
+				if (expr is SqlQuery.SearchCondition)
+					wrap = true;
+				else
+				{
+					var ex = expr as SqlExpression;
+					wrap = ex != null && ex.Expr == "{0}" && ex.Parameters.Length == 1 && ex.Parameters[0] is SqlQuery.SearchCondition;
+				}
+			}
+
+			if (wrap) sb.Append("CASE WHEN ");
+			base.BuildColumnExpression(sb, expr, alias, ref addAlias);
+			if (wrap) sb.Append(" THEN 1 ELSE 0 END");
+
+			if (_skipAliases) addAlias = false;
+		}
+
+		protected override ISqlProvider CreateSqlProvider()
+		{
+			return new SybaseSqlProvider(_isSelect);
+		}
+
+		protected override void BuildDataType(StringBuilder sb, SqlDataType type)
+		{
+			switch (type.SqlDbType)
+			{
+#if !MONO
+				case SqlDbType.DateTime2 : sb.Append("DateTime");        break;
+#endif
+				default                  : base.BuildDataType(sb, type); break;
+			}
+		}
+
+		protected override void BuildDeleteClause(StringBuilder sb)
+		{
+			AppendIndent(sb);
+			sb.Append("DELETE FROM ");
+//			BuildTableName(sb, SqlQuery.From.Tables[0], true, false);
+
+			ISqlTableSource table;
+			ISqlTableSource source;
+
+			if (SqlQuery.Delete.Table != null)
+				table = source = SqlQuery.Delete.Table;
+			else
+			{
+				table  = SqlQuery.From.Tables[0];
+				source = SqlQuery.From.Tables[0].Source;
+			}
+
+			var alias = GetTableAlias(table);
+			BuildPhysicalTable(sb, source, alias);
+
+			sb.AppendLine();
+		}
+
+		protected override void BuildUpdateTableName(StringBuilder sb)
+		{
+			if (SqlQuery.Update.Table != null && SqlQuery.Update.Table != SqlQuery.From.Tables[0].Source)
+				BuildPhysicalTable(sb, SqlQuery.Update.Table, null);
+			else
+				BuildTableName(sb, SqlQuery.From.Tables[0], true, false);
+		}
+
+		protected override void BuildString(StringBuilder sb, string value)
+		{
+			foreach (var ch in value)
+			{
+				if (ch > 127)
+				{
+					sb.Append("N");
+					break;
+				}
+			}
+
+			base.BuildString(sb, value);
+		}
+
+		protected override void BuildChar(StringBuilder sb, char value)
+		{
+			if (value > 127)
+				sb.Append("N");
+
+			base.BuildChar(sb, value);
+		}
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			switch (convertType)
+			{
+				case ConvertType.NameToQueryParameter:
+				case ConvertType.NameToCommandParameter:
+				case ConvertType.NameToSprocParameter:
+					{
+						var name = "@" + value;
+
+						if (name.Length > 27)
+							name = name.Substring(0, 27);
+
+						return name;
+					}
+
+				case ConvertType.NameToQueryField:
+				case ConvertType.NameToQueryFieldAlias:
+				case ConvertType.NameToQueryTableAlias:
+					{
+						var name = value.ToString();
+
+						if (name.Length > 28 || name.Length > 0 && name[0] == '[')
+							return value;
+					}
+
+					return "[" + value + "]";
+
+				case ConvertType.NameToDatabase:
+				case ConvertType.NameToOwner:
+				case ConvertType.NameToQueryTable:
+					{
+						var name = value.ToString();
+
+						if (name.Length > 28 || name.Length > 0 && (name[0] == '[' || name[0] == '#'))
+							return value;
+
+						if (name.IndexOf('.') > 0)
+							value = string.Join("].[", name.Split('.'));
+					}
+
+					return "[" + value + "]";
+
+				case ConvertType.SprocParameterToName:
+					if (value != null)
+					{
+						var str = value.ToString();
+						return str.Length > 0 && str[0] == '@'? str.Substring(1): str;
+					}
+
+					break;
+			}
+
+			return value;
+		}
+
+		protected override void BuildInsertOrUpdateQuery(StringBuilder sb)
+		{
+			BuildInsertOrUpdateQueryAsUpdateInsert(sb);
+		}
+
+		protected override void BuildEmptyInsert(StringBuilder sb)
+		{
+			sb.AppendLine("VALUES ()");
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlQuery.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4850 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading;
+
+using JetBrains.Annotations;
+
+namespace BLToolkit.Data.Sql
+{
+	using Reflection;
+
+	using FJoin = SqlQuery.FromClause.Join;
+
+	[DebuggerDisplay("SQL = {SqlText}")]
+	public class SqlQuery : ISqlTableSource
+	{
+		#region Init
+
+		static readonly Dictionary<string,object> _reservedWords = new Dictionary<string,object>();
+
+		static SqlQuery()
+		{
+			using (var stream = typeof(SqlQuery).Assembly.GetManifestResourceStream(typeof(SqlQuery), "ReservedWords.txt"))
+			using (var reader = new StreamReader(stream))
+			{
+				/*
+				var words = reader.ReadToEnd().Replace(' ', '\n').Replace('\t', '\n').Split('\n');
+				var q = from w in words where w.Length > 0 orderby w select w;
+
+				var text = string.Join("\n", q.Distinct().ToArray());
+				*/
+
+				string s;
+				while ((s = reader.ReadLine()) != null)
+					_reservedWords.Add(s, s);
+			}
+		}
+
+		public SqlQuery()
+		{
+			SourceID = Interlocked.Increment(ref SourceIDCounter);
+
+			_select  = new SelectClause (this);
+			_from    = new FromClause   (this);
+			_where   = new WhereClause  (this);
+			_groupBy = new GroupByClause(this);
+			_having  = new WhereClause  (this);
+			_orderBy = new OrderByClause(this);
+		}
+
+		internal SqlQuery(int id)
+		{
+			SourceID = id;
+		}
+
+		internal void Init(
+			InsertClause       insert,
+			UpdateClause       update,
+			DeleteClause       delete,
+			SelectClause       select,
+			FromClause         from,
+			WhereClause        where,
+			GroupByClause      groupBy,
+			WhereClause        having,
+			OrderByClause      orderBy,
+			List<Union>        unions,
+			SqlQuery           parentSql,
+			bool               parameterDependent,
+			List<SqlParameter> parameters)
+		{
+			_insert             = insert;
+			_update             = update;
+			_delete             = delete;
+			_select             = select;
+			_from               = from;
+			_where              = where;
+			_groupBy            = groupBy;
+			_having             = having;
+			_orderBy            = orderBy;
+			_unions             = unions;
+			ParentSql          = parentSql;
+			IsParameterDependent = parameterDependent;
+			_parameters.AddRange(parameters);
+
+			foreach (var col in select.Columns)
+				col.Parent = this;
+
+			_select. SetSqlQuery(this);
+			_from.   SetSqlQuery(this);
+			_where.  SetSqlQuery(this);
+			_groupBy.SetSqlQuery(this);
+			_having. SetSqlQuery(this);
+			_orderBy.SetSqlQuery(this);
+		}
+
+		readonly List<SqlParameter> _parameters = new List<SqlParameter>();
+		public   List<SqlParameter>  Parameters
+		{
+			get { return _parameters; }
+		}
+
+		private List<object> _properties;
+		public  List<object>  Properties
+		{
+			get { return _properties ?? (_properties = new List<object>()); }
+		}
+
+		public bool     IsParameterDependent { get; set; }
+		public SqlQuery ParentSql            { get; set; }
+
+		public bool IsSimple
+		{
+			get { return !Select.HasModifier && Where.IsEmpty && GroupBy.IsEmpty && Having.IsEmpty && OrderBy.IsEmpty; }
+		}
+
+		private QueryType _queryType = QueryType.Select;
+		public  QueryType  QueryType
+		{
+			get { return _queryType;  }
+			set { _queryType = value; }
+		}
+
+		public bool IsSelect         { get { return _queryType == QueryType.Select;        } }
+		public bool IsDelete         { get { return _queryType == QueryType.Delete;        } }
+		public bool IsInsertOrUpdate { get { return _queryType == QueryType.InsertOrUpdate; } }
+		public bool IsInsert         { get { return _queryType == QueryType.Insert || _queryType == QueryType.InsertOrUpdate; } }
+		public bool IsUpdate         { get { return _queryType == QueryType.Update || _queryType == QueryType.InsertOrUpdate; } }
+
+		#endregion
+
+		#region Column
+
+		public class Column : IEquatable<Column>, ISqlExpression, IChild<SqlQuery>
+		{
+			public Column(SqlQuery parent, ISqlExpression expression, string alias)
+			{
+				if (expression == null) throw new ArgumentNullException("expression");
+
+				Parent     = parent;
+				Expression = expression;
+				_alias      = alias;
+
+#if DEBUG
+				_columnNumber = ++_columnCounter;
+#endif
+			}
+
+			public Column(SqlQuery builder, ISqlExpression expression)
+				: this(builder, expression, null)
+			{
+			}
+
+#if DEBUG
+			readonly int _columnNumber;
+			static   int _columnCounter;
+#endif
+
+			public ISqlExpression Expression { get; set; }
+
+			internal string _alias;
+			public   string  Alias
+			{
+				get
+				{
+					if (_alias == null)
+					{
+						if (Expression is SqlField)
+						{
+							var field = (SqlField)Expression;
+							return field.Alias ?? field.PhysicalName;
+						}
+
+						if (Expression is Column)
+						{
+							var col = (Column)Expression;
+							return col.Alias;
+						}
+					}
+
+					return _alias;
+				}
+				set { _alias = value; }
+			}
+
+			public bool Equals(Column other)
+			{
+				return Expression.Equals(other.Expression);
+			}
+
+#if OVERRIDETOSTRING
+
+			public override string ToString()
+			{
+				return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+			}
+
+#endif
+
+			#region ISqlExpression Members
+
+			public bool CanBeNull()
+			{
+				return Expression.CanBeNull();
+			}
+
+			public bool Equals(ISqlExpression other, Func<ISqlExpression,ISqlExpression,bool> comparer)
+			{
+				if (this == other)
+					return true;
+
+				return
+					other is Column &&
+					Expression.Equals(((Column)other).Expression, comparer) &&
+					comparer(this, other);
+			}
+
+			public int Precedence
+			{
+				get { return Sql.Precedence.Primary; }
+			}
+
+			public Type SystemType
+			{
+				get { return Expression.SystemType; }
+			}
+
+			public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+			{
+				if (!doClone(this))
+					return this;
+
+				ICloneableElement clone;
+
+				var parent = (SqlQuery)Parent.Clone(objectTree, doClone);
+
+				if (!objectTree.TryGetValue(this, out clone))
+					objectTree.Add(this, clone = new Column(
+						parent,
+						(ISqlExpression)Expression.Clone(objectTree, doClone),
+						_alias));
+
+				return clone;
+			}
+
+			#endregion
+
+			#region IEquatable<ISqlExpression> Members
+
+			bool IEquatable<ISqlExpression>.Equals(ISqlExpression other)
+			{
+				if (this == other)
+					return true;
+
+				return other is Column && Equals((Column)other);
+			}
+
+			#endregion
+
+			#region ISqlExpressionWalkable Members
+
+			[Obsolete]
+			public ISqlExpression Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+			{
+				if (!(skipColumns && Expression is Column))
+					Expression = Expression.Walk(skipColumns, func);
+
+				return func(this);
+			}
+
+			#endregion
+
+			#region IChild<ISqlTableSource> Members
+
+			string IChild<SqlQuery>.Name
+			{
+				get { return Alias; }
+			}
+
+			public SqlQuery Parent { get; set; }
+
+			#endregion
+	
+			#region IQueryElement Members
+
+			public QueryElementType ElementType { get { return QueryElementType.Column; } }
+
+			StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+			{
+				if (dic.ContainsKey(this))
+					return sb.Append("...");
+
+				dic.Add(this, this);
+
+				sb
+					.Append('t')
+					.Append(Parent.SourceID)
+					.Append(".");
+
+#if DEBUG
+				sb.Append('[').Append(_columnNumber).Append(']');
+#endif
+
+				if (Expression is SqlQuery)
+				{
+					sb
+						.Append("(\n\t\t");
+					var len = sb.Length;
+					Expression.ToString(sb, dic).Replace("\n", "\n\t\t", len, sb.Length - len);
+					sb.Append("\n\t)");
+				}
+				/*else if (Expression is Column)
+				{
+					var col = (Column)Expression;
+					sb
+						.Append("t")
+						.Append(col.Parent.SourceID)
+						.Append(".")
+						.Append(col.Alias ?? "c" + (col.Parent.Select.Columns.IndexOf(col) + 1));
+				}*/
+				else
+				{
+					Expression.ToString(sb, dic);
+				}
+
+				dic.Remove(this);
+
+				return sb;
+			}
+
+			#endregion
+		}
+
+		#endregion
+
+		#region TableSource
+
+		public class TableSource : ISqlTableSource
+		{
+			public TableSource(ISqlTableSource source, string alias)
+				: this(source, alias, null)
+			{
+			}
+
+			public TableSource(ISqlTableSource source, string alias, params JoinedTable[] joins)
+			{
+				if (source == null) throw new ArgumentNullException("source");
+
+				Source = source;
+				_alias = alias;
+
+				if (joins != null)
+					_joins.AddRange(joins);
+			}
+
+			public TableSource(ISqlTableSource source, string alias, IEnumerable<JoinedTable> joins)
+			{
+				if (source == null) throw new ArgumentNullException("source");
+
+				Source = source;
+				_alias = alias;
+
+				if (joins != null)
+					_joins.AddRange(joins);
+			}
+
+			public ISqlTableSource Source       { get; set; }
+			public SqlTableType    SqlTableType { get { return Source.SqlTableType; } }
+
+			internal string _alias;
+			public   string  Alias
+			{
+				get
+				{
+					if (string.IsNullOrEmpty(_alias))
+					{
+						if (Source is TableSource)
+							return (Source as TableSource).Alias;
+
+						if (Source is SqlTable)
+							return ((SqlTable)Source).Alias;
+					}
+
+					return _alias;
+				}
+				set { _alias = value; }
+			}
+
+			public TableSource this[ISqlTableSource table]
+			{
+				get { return this[table, null]; }
+			}
+
+			public TableSource this[ISqlTableSource table, string alias]
+			{
+				get
+				{
+					foreach (var tj in Joins)
+					{
+						var t = CheckTableSource(tj.Table, table, alias);
+
+						if (t != null)
+							return t;
+					}
+
+					return null;
+				}
+			}
+
+			readonly List<JoinedTable> _joins = new List<JoinedTable>();
+			public   List<JoinedTable>  Joins
+			{
+				get { return _joins;  }
+			}
+
+			public void ForEach(Action<TableSource> action, HashSet<SqlQuery> visitedQueries)
+			{
+				action(this);
+				foreach (var join in Joins)
+					join.Table.ForEach(action, visitedQueries);
+
+				if (Source is SqlQuery && visitedQueries.Contains((SqlQuery)Source))
+					((SqlQuery)Source).ForEachTable(action, visitedQueries);
+			}
+
+			public IEnumerable<ISqlTableSource> GetTables()
+			{
+				yield return Source;
+
+				foreach (var join in Joins)
+					foreach (var table in join.Table.GetTables())
+						yield return table;
+			}
+
+			public int GetJoinNumber()
+			{
+				var n = Joins.Count;
+
+				foreach (var join in Joins)
+					n += join.Table.GetJoinNumber();
+
+				return n;
+			}
+
+#if OVERRIDETOSTRING
+
+			public override string ToString()
+			{
+				return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+			}
+
+#endif
+
+			#region IEquatable<ISqlExpression> Members
+
+			bool IEquatable<ISqlExpression>.Equals(ISqlExpression other)
+			{
+				return this == other;
+			}
+
+			#endregion
+
+			#region ISqlExpressionWalkable Members
+
+			[Obsolete]
+			public ISqlExpression Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+			{
+				Source = (ISqlTableSource)Source.Walk(skipColumns, func);
+
+				foreach (var t in Joins)
+					((ISqlExpressionWalkable)t).Walk(skipColumns, func);
+
+				return this;
+			}
+
+			#endregion
+
+			#region ISqlTableSource Members
+
+			public int       SourceID { get { return Source.SourceID; } }
+			public SqlField  All      { get { return Source.All;      } }
+
+			IList<ISqlExpression> ISqlTableSource.GetKeys(bool allIfEmpty)
+			{
+				return Source.GetKeys(allIfEmpty);
+			}
+
+			#endregion
+
+			#region ICloneableElement Members
+
+			public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+			{
+				if (!doClone(this))
+					return this;
+
+				ICloneableElement clone;
+
+				if (!objectTree.TryGetValue(this, out clone))
+				{
+					var ts = new TableSource((ISqlTableSource)Source.Clone(objectTree, doClone), _alias);
+
+					objectTree.Add(this, clone = ts);
+
+					ts._joins.AddRange(_joins.ConvertAll(jt => (JoinedTable)jt.Clone(objectTree, doClone)));
+				}
+
+				return clone;
+			}
+
+			#endregion
+
+			#region IQueryElement Members
+
+			public QueryElementType ElementType { get { return QueryElementType.TableSource; } }
+
+			StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+			{
+				if (sb.Length > 500)
+					return sb;
+
+				if (dic.ContainsKey(this))
+					return sb.Append("...");
+
+				dic.Add(this, this);
+
+				if (Source is SqlQuery)
+				{
+					sb.Append("(\n\t");
+					var len = sb.Length;
+					Source.ToString(sb, dic).Replace("\n", "\n\t", len, sb.Length - len);
+					sb.Append("\n)");
+				}
+				else
+					Source.ToString(sb, dic);
+
+				sb
+					.Append(" as t")
+					.Append(SourceID);
+
+				foreach (IQueryElement join in Joins)
+				{
+					sb.AppendLine().Append('\t');
+					var len = sb.Length;
+					join.ToString(sb, dic).Replace("\n", "\n\t", len, sb.Length - len);
+				}
+
+				dic.Remove(this);
+
+				return sb;
+			}
+
+			#endregion
+
+			#region ISqlExpression Members
+
+			public bool CanBeNull()
+			{
+				return Source.CanBeNull();
+			}
+
+			public bool Equals(ISqlExpression other, Func<ISqlExpression,ISqlExpression,bool> comparer)
+			{
+				return this == other;
+			}
+
+			public int  Precedence { get { return Source.Precedence; } }
+			public Type SystemType { get { return Source.SystemType; } }
+
+			#endregion
+		}
+
+		#endregion
+
+		#region TableJoin
+
+		public enum JoinType
+		{
+			Auto,
+			Inner,
+			Left,
+			CrossApply,
+			OuterApply
+		}
+
+		public class JoinedTable : IQueryElement, ISqlExpressionWalkable, ICloneableElement
+		{
+			public JoinedTable(JoinType joinType, TableSource table, bool isWeak, SearchCondition searchCondition)
+			{
+				JoinType        = joinType;
+				Table           = table;
+				IsWeak          = isWeak;
+				Condition       = searchCondition;
+				CanConvertApply = true;
+			}
+
+			public JoinedTable(JoinType joinType, TableSource table, bool isWeak)
+				: this(joinType, table, isWeak, new SearchCondition())
+			{
+			}
+
+			public JoinedTable(JoinType joinType, ISqlTableSource table, string alias, bool isWeak)
+				: this(joinType, new TableSource(table, alias), isWeak)
+			{
+			}
+
+			public JoinType        JoinType        { get; set; }
+			public TableSource     Table           { get; set; }
+			public SearchCondition Condition       { get; private set; }
+			public bool            IsWeak          { get; set; }
+			public bool            CanConvertApply { get; set; }
+
+			public ICloneableElement Clone(Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+			{
+				if (!doClone(this))
+					return this;
+
+				ICloneableElement clone;
+
+				if (!objectTree.TryGetValue(this, out clone))
+					objectTree.Add(this, clone = new JoinedTable(
+						JoinType,
+						(TableSource)Table.Clone(objectTree, doClone), 
+						IsWeak,
+						(SearchCondition)Condition.Clone(objectTree, doClone)));
+
+				return clone;
+			}
+
+#if OVERRIDETOSTRING
+
+			public override string ToString()
+			{
+				return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+			}
+
+#endif
+
+			#region ISqlExpressionWalkable Members
+
+			[Obsolete]
+			public ISqlExpression Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> action)
+			{
+				Condition = (SearchCondition)((ISqlExpressionWalkable)Condition).Walk(skipColumns, action);
+
+#pragma warning disable 0618
+				Table.Walk(skipColumns, action);
+#pragma warning restore 0618
+
+				return null;
+			}
+
+			#endregion
+
+			#region IQueryElement Members
+
+			public QueryElementType ElementType { get { return QueryElementType.JoinedTable; } }
+
+			StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+			{
+				if (dic.ContainsKey(this))
+					return sb.Append("...");
+
+				dic.Add(this, this);
+
+				switch (JoinType)
+				{
+					case JoinType.Inner      : sb.Append("INNER JOIN ");  break;
+					case JoinType.Left       : sb.Append("LEFT JOIN ");   break;
+					case JoinType.CrossApply : sb.Append("CROSS APPLY "); break;
+					case JoinType.OuterApply : sb.Append("OUTER APPLY "); break;
+					default                  : sb.Append("SOME JOIN "); break;
+				}
+
+				((IQueryElement)Table).ToString(sb, dic);
+				sb.Append(" ON ");
+				((IQueryElement)Condition).ToString(sb, dic);
+
+				dic.Remove(this);
+
+				return sb;
+			}
+
+			#endregion
+		}
+
+		#endregion
+
+		#region Predicate
+
+		public abstract class Predicate : ISqlPredicate
+		{
+			public enum Operator
+			{
+				Equal,          // =     Is the operator used to test the equality between two expressions.
+				NotEqual,       // <> != Is the operator used to test the condition of two expressions not being equal to each other.
+				Greater,        // >     Is the operator used to test the condition of one expression being greater than the other.
+				GreaterOrEqual, // >=    Is the operator used to test the condition of one expression being greater than or equal to the other expression.
+				NotGreater,     // !>    Is the operator used to test the condition of one expression not being greater than the other expression.
+				Less,           // <     Is the operator used to test the condition of one expression being less than the other.
+				LessOrEqual,    // <=    Is the operator used to test the condition of one expression being less than or equal to the other expression.
+				NotLess         // !<    Is the operator used to test the condition of one expression not being less than the other expression.
+			}
+
+			public class Expr : Predicate
+			{
+				public Expr([NotNull] ISqlExpression exp1, int precedence)
+					: base(precedence)
+				{
+					if (exp1 == null) throw new ArgumentNullException("exp1");
+
+					Expr1 = exp1;
+				}
+
+				public Expr([NotNull] ISqlExpression exp1)
+					: base(exp1.Precedence)
+				{
+					if (exp1 == null) throw new ArgumentNullException("exp1");
+
+					Expr1 = exp1;
+				}
+
+				public ISqlExpression Expr1 { get; set; }
+
+				[Obsolete]
+				protected override void Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+				{
+					Expr1 = Expr1.Walk(skipColumns, func);
+
+					if (Expr1 == null)
+						throw new InvalidOperationException();
+				}
+
+				public override bool CanBeNull()
+				{
+					return Expr1.CanBeNull();
+				}
+
+				protected override ICloneableElement Clone(Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+				{
+					if (!doClone(this))
+						return this;
+
+					ICloneableElement clone;
+
+					if (!objectTree.TryGetValue(this, out clone))
+						objectTree.Add(this, clone = new Expr((ISqlExpression)Expr1.Clone(objectTree, doClone), Precedence));
+
+					return clone;
+				}
+
+				public override QueryElementType ElementType
+				{
+					get { return QueryElementType.ExprPredicate; }
+				}
+
+				protected override void ToString(StringBuilder sb, Dictionary<IQueryElement, IQueryElement> dic)
+				{
+					Expr1.ToString(sb, dic);
+				}
+			}
+
+			public class NotExpr : Expr
+			{
+				public NotExpr(ISqlExpression exp1, bool isNot, int precedence)
+					: base(exp1, precedence)
+				{
+					IsNot = isNot;
+				}
+
+				public bool IsNot { get; set; }
+
+				protected override ICloneableElement Clone(Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+				{
+					if (!doClone(this))
+						return this;
+
+					ICloneableElement clone;
+
+					if (!objectTree.TryGetValue(this, out clone))
+						objectTree.Add(this, clone = new NotExpr((ISqlExpression)Expr1.Clone(objectTree, doClone), IsNot, Precedence));
+
+					return clone;
+				}
+
+				public override QueryElementType ElementType
+				{
+					get { return QueryElementType.NotExprPredicate; }
+				}
+
+				protected override void ToString(StringBuilder sb, Dictionary<IQueryElement, IQueryElement> dic)
+				{
+					if (IsNot) sb.Append("NOT (");
+					base.ToString(sb, dic);
+					if (IsNot) sb.Append(")");
+				}
+			}
+
+			// { expression { = | <> | != | > | >= | ! > | < | <= | !< } expression
+			//
+			public class ExprExpr : Expr
+			{
+				public ExprExpr(ISqlExpression exp1, Operator op, ISqlExpression exp2)
+					: base(exp1, Sql.Precedence.Comparison)
+				{
+					this.Operator = op;
+					Expr2 = exp2;
+				}
+
+				public new Operator   Operator { get; private set; }
+				public ISqlExpression Expr2    { get; internal set; }
+
+				[Obsolete]
+				protected override void Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+				{
+#pragma warning disable 0618
+					base.Walk(skipColumns, func);
+#pragma warning restore 0618
+					Expr2 = Expr2.Walk(skipColumns, func);
+				}
+
+				public override bool CanBeNull()
+				{
+					return base.CanBeNull() || Expr2.CanBeNull();
+				}
+
+				protected override ICloneableElement Clone(Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+				{
+					if (!doClone(this))
+						return this;
+
+					ICloneableElement clone;
+
+					if (!objectTree.TryGetValue(this, out clone))
+						objectTree.Add(this, clone = new ExprExpr(
+							(ISqlExpression)Expr1.Clone(objectTree, doClone), this.Operator, (ISqlExpression)Expr2.Clone(objectTree, doClone)));
+
+					return clone;
+				}
+
+				public override QueryElementType ElementType
+				{
+					get { return QueryElementType.ExprExprPredicate; }
+				}
+
+				protected override void ToString(StringBuilder sb, Dictionary<IQueryElement, IQueryElement> dic)
+				{
+					Expr1.ToString(sb, dic);
+
+					string op;
+
+					switch (this.Operator)
+					{
+						case Operator.Equal         : op = "=";  break;
+						case Operator.NotEqual      : op = "<>"; break;
+						case Operator.Greater       : op = ">";  break;
+						case Operator.GreaterOrEqual: op = ">="; break;
+						case Operator.NotGreater    : op = "!>"; break;
+						case Operator.Less          : op = "<";  break;
+						case Operator.LessOrEqual   : op = "<="; break;
+						case Operator.NotLess       : op = "!<"; break;
+						default: throw new InvalidOperationException();
+					}
+
+					sb.Append(" ").Append(op).Append(" ");
+
+					Expr2.ToString(sb, dic);
+				}
+			}
+
+			// string_expression [ NOT ] LIKE string_expression [ ESCAPE 'escape_character' ]
+			//
+			public class Like : NotExpr
+			{
+				public Like(ISqlExpression exp1, bool isNot, ISqlExpression exp2, ISqlExpression escape)
+					: base(exp1, isNot, Sql.Precedence.Comparison)
+				{
+					Expr2  = exp2;
+					Escape = escape;
+				}
+
+				public ISqlExpression Expr2  { get; internal set; }
+				public ISqlExpression Escape { get; internal set; }
+
+				[Obsolete]
+				protected override void Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+				{
+#pragma warning disable 0618
+					base.Walk(skipColumns, func);
+#pragma warning restore 0618
+					Expr2 = Expr2.Walk(skipColumns, func);
+
+					if (Escape != null)
+						Escape = Escape.Walk(skipColumns, func);
+				}
+
+				protected override ICloneableElement Clone(Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+				{
+					if (!doClone(this))
+						return this;
+
+					ICloneableElement clone;
+
+					if (!objectTree.TryGetValue(this, out clone))
+						objectTree.Add(this, clone = new Like(
+							(ISqlExpression)Expr1.Clone(objectTree, doClone), IsNot, (ISqlExpression)Expr2.Clone(objectTree, doClone), Escape));
+
+					return clone;
+				}
+
+				public override QueryElementType ElementType
+				{
+					get { return QueryElementType.LikePredicate; }
+				}
+
+				protected override void ToString(StringBuilder sb, Dictionary<IQueryElement, IQueryElement> dic)
+				{
+					Expr1.ToString(sb, dic);
+
+					if (IsNot) sb.Append(" NOT");
+					sb.Append(" LIKE ");
+
+					Expr2.ToString(sb, dic);
+
+					if (Escape != null)
+					{
+						sb.Append(" ESCAPE ");
+						Escape.ToString(sb, dic);
+					}
+				}
+			}
+
+			// expression [ NOT ] BETWEEN expression AND expression
+			//
+			public class Between : NotExpr
+			{
+				public Between(ISqlExpression exp1, bool isNot, ISqlExpression exp2, ISqlExpression exp3)
+					: base(exp1, isNot, Sql.Precedence.Comparison)
+				{
+					Expr2 = exp2;
+					Expr3 = exp3;
+				}
+
+				public ISqlExpression Expr2 { get; internal set; }
+				public ISqlExpression Expr3 { get; internal set; }
+
+				[Obsolete]
+				protected override void Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+				{
+#pragma warning disable 0618
+					base.Walk(skipColumns, func);
+#pragma warning restore 0618
+					Expr2 = Expr2.Walk(skipColumns, func);
+					Expr3 = Expr3.Walk(skipColumns, func);
+				}
+
+				protected override ICloneableElement Clone(Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+				{
+					if (!doClone(this))
+						return this;
+
+					ICloneableElement clone;
+
+					if (!objectTree.TryGetValue(this, out clone))
+						objectTree.Add(this, clone = new Between(
+							(ISqlExpression)Expr1.Clone(objectTree, doClone),
+							IsNot,
+							(ISqlExpression)Expr2.Clone(objectTree, doClone),
+							(ISqlExpression)Expr3.Clone(objectTree, doClone)));
+
+					return clone;
+				}
+
+				public override QueryElementType ElementType
+				{
+					get { return QueryElementType.BetweenPredicate; }
+				}
+
+				protected override void ToString(StringBuilder sb, Dictionary<IQueryElement, IQueryElement> dic)
+				{
+					Expr1.ToString(sb, dic);
+
+					if (IsNot) sb.Append(" NOT");
+					sb.Append(" BETWEEN ");
+
+					Expr2.ToString(sb, dic);
+					sb.Append(" AND ");
+					Expr3.ToString(sb, dic);
+				}
+			}
+
+			// expression IS [ NOT ] NULL
+			//
+			public class IsNull : NotExpr
+			{
+				public IsNull(ISqlExpression exp1, bool isNot)
+					: base(exp1, isNot, Sql.Precedence.Comparison)
+				{
+				}
+
+				protected override ICloneableElement Clone(Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+				{
+					if (!doClone(this))
+						return this;
+
+					ICloneableElement clone;
+
+					if (!objectTree.TryGetValue(this, out clone))
+						objectTree.Add(this, clone = new IsNull((ISqlExpression)Expr1.Clone(objectTree, doClone), IsNot));
+
+					return clone;
+				}
+
+				protected override void ToString(StringBuilder sb, Dictionary<IQueryElement, IQueryElement> dic)
+				{
+					Expr1.ToString(sb, dic);
+					sb
+						.Append(" IS ")
+						.Append(IsNot ? "NOT " : "")
+						.Append("NULL");
+				}
+
+				public override QueryElementType ElementType
+				{
+					get { return QueryElementType.IsNullPredicate; }
+				}
+			}
+
+			// expression [ NOT ] IN ( subquery | expression [ ,...n ] )
+			//
+			public class InSubQuery : NotExpr
+			{
+				public InSubQuery(ISqlExpression exp1, bool isNot, SqlQuery subQuery)
+					: base(exp1, isNot, Sql.Precedence.Comparison)
+				{
+					SubQuery = subQuery;
+				}
+
+				public SqlQuery SubQuery { get; private set; }
+
+				[Obsolete]
+				protected override void Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+				{
+#pragma warning disable 0618
+					base.Walk(skipColumns, func);
+#pragma warning restore 0618
+					SubQuery = (SqlQuery)((ISqlExpression)SubQuery).Walk(skipColumns, func);
+				}
+
+				protected override ICloneableElement Clone(Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+				{
+					if (!doClone(this))
+						return this;
+
+					ICloneableElement clone;
+
+					if (!objectTree.TryGetValue(this, out clone))
+						objectTree.Add(this, clone = new InSubQuery(
+							(ISqlExpression)Expr1.Clone(objectTree, doClone),
+							IsNot,
+							(SqlQuery)SubQuery.Clone(objectTree, doClone)));
+
+					return clone;
+				}
+
+				public override QueryElementType ElementType
+				{
+					get { return QueryElementType.InSubQueryPredicate; }
+				}
+
+				protected override void ToString(StringBuilder sb, Dictionary<IQueryElement, IQueryElement> dic)
+				{
+					Expr1.ToString(sb, dic);
+
+					if (IsNot) sb.Append(" NOT");
+					sb.Append(" IN (");
+
+					((IQueryElement)SubQuery).ToString(sb, dic);
+					sb.Append(")");
+				}
+			}
+
+			public class InList : NotExpr
+			{
+				public InList(ISqlExpression exp1, bool isNot, params ISqlExpression[] values)
+					: base(exp1, isNot, Sql.Precedence.Comparison)
+				{
+					if (values != null && values.Length > 0)
+						_values.AddRange(values);
+				}
+
+				public InList(ISqlExpression exp1, bool isNot, IEnumerable<ISqlExpression> values)
+					: base(exp1, isNot, Sql.Precedence.Comparison)
+				{
+					if (values != null)
+						_values.AddRange(values);
+				}
+
+				readonly List<ISqlExpression> _values = new List<ISqlExpression>();
+				public   List<ISqlExpression>  Values { get { return _values; } }
+
+				[Obsolete]
+				protected override void Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> action)
+				{
+#pragma warning disable 0618
+					base.Walk(skipColumns, action);
+#pragma warning restore 0618
+					for (var i = 0; i < _values.Count; i++)
+						_values[i] = _values[i].Walk(skipColumns, action);
+				}
+
+				protected override ICloneableElement Clone(Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+				{
+					if (!doClone(this))
+						return this;
+
+					ICloneableElement clone;
+
+					if (!objectTree.TryGetValue(this, out clone))
+					{
+						objectTree.Add(this, clone = new InList(
+							(ISqlExpression)Expr1.Clone(objectTree, doClone),
+							IsNot,
+							_values.ConvertAll(e => (ISqlExpression)e.Clone(objectTree, doClone)).ToArray()));
+					}
+
+					return clone;
+				}
+
+				public override QueryElementType ElementType
+				{
+					get { return QueryElementType.InListPredicate; }
+				}
+
+				protected override void ToString(StringBuilder sb, Dictionary<IQueryElement, IQueryElement> dic)
+				{
+					Expr1.ToString(sb, dic);
+
+					if (IsNot) sb.Append(" NOT");
+					sb.Append(" IN (");
+
+					foreach (var value in Values)
+					{
+						value.ToString(sb, dic);
+						sb.Append(',');
+					}
+
+					if (Values.Count > 0)
+						sb.Length--;
+
+					sb.Append(")");
+				}
+			}
+
+			// CONTAINS ( { column | * } , '< contains_search_condition >' )
+			// FREETEXT ( { column | * } , 'freetext_string' )
+			// expression { = | <> | != | > | >= | !> | < | <= | !< } { ALL | SOME | ANY } ( subquery )
+			// EXISTS ( subquery )
+
+			public class FuncLike : Predicate
+			{
+				public FuncLike(SqlFunction func)
+					: base(func.Precedence)
+				{
+					Function = func;
+				}
+
+				public SqlFunction Function { get; private set; }
+
+				[Obsolete]
+				protected override void Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+				{
+					Function = (SqlFunction)((ISqlExpression)Function).Walk(skipColumns, func);
+				}
+
+				public override bool CanBeNull()
+				{
+					return Function.CanBeNull();
+				}
+
+				protected override ICloneableElement Clone(Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+				{
+					if (!doClone(this))
+						return this;
+
+					ICloneableElement clone;
+
+					if (!objectTree.TryGetValue(this, out clone))
+						objectTree.Add(this, clone = new FuncLike((SqlFunction)Function.Clone(objectTree, doClone)));
+
+					return clone;
+				}
+
+				public override QueryElementType ElementType
+				{
+					get { return QueryElementType.FuncLikePredicate; }
+				}
+
+				protected override void ToString(StringBuilder sb, Dictionary<IQueryElement, IQueryElement> dic)
+				{
+					((IQueryElement)Function).ToString(sb, dic);
+				}
+			}
+
+			#region Overrides
+
+#if OVERRIDETOSTRING
+
+			public override string ToString()
+			{
+				return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+			}
+
+#endif
+
+			#endregion
+
+			protected Predicate(int precedence)
+			{
+				Precedence = precedence;
+			}
+
+			#region IPredicate Members
+
+			public int Precedence { get; private set; }
+
+			public    abstract bool              CanBeNull();
+			protected abstract ICloneableElement Clone    (Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone);
+			[Obsolete]
+			protected abstract void              Walk     (bool skipColumns, Func<ISqlExpression,ISqlExpression> action);
+
+			[Obsolete]
+			ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+			{
+				Walk(skipColumns, func);
+				return null;
+			}
+
+			ICloneableElement ICloneableElement.Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+			{
+				if (!doClone(this))
+					return this;
+
+				return Clone(objectTree, doClone);
+			}
+
+			#endregion
+
+			#region IQueryElement Members
+
+			public abstract QueryElementType ElementType { get; }
+
+			protected abstract void ToString(StringBuilder sb, Dictionary<IQueryElement, IQueryElement> dic);
+
+			StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+			{
+				if (dic.ContainsKey(this))
+					return sb.Append("...");
+
+				dic.Add(this, this);
+				ToString(sb, dic);
+				dic.Remove(this);
+
+				return sb;
+			}
+
+			#endregion
+		}
+
+		#endregion
+
+		#region Condition
+
+		public class Condition : IQueryElement, ICloneableElement
+		{
+			public Condition(bool isNot, ISqlPredicate predicate)
+			{
+				IsNot     = isNot;
+				Predicate = predicate;
+			}
+
+			public Condition(bool isNot, ISqlPredicate predicate, bool isOr)
+			{
+				IsNot     = isNot;
+				Predicate = predicate;
+				IsOr      = isOr;
+			}
+
+			public bool          IsNot     { get; set; }
+			public ISqlPredicate Predicate { get; set; }
+			public bool          IsOr      { get; set; }
+
+			public int Precedence
+			{
+				get
+				{
+					return
+						IsNot ? Sql.Precedence.LogicalNegation :
+						IsOr  ? Sql.Precedence.LogicalDisjunction :
+						        Sql.Precedence.LogicalConjunction;
+				}
+			}
+
+			public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+			{
+				if (!doClone(this))
+					return this;
+
+				ICloneableElement clone;
+
+				if (!objectTree.TryGetValue(this, out clone))
+					objectTree.Add(this, clone = new Condition(IsNot, (ISqlPredicate)Predicate.Clone(objectTree, doClone), IsOr));
+
+				return clone;
+			}
+
+			public bool CanBeNull()
+			{
+				return Predicate.CanBeNull();
+			}
+
+#if OVERRIDETOSTRING
+
+			public override string ToString()
+			{
+				return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+			}
+
+#endif
+
+			#region IQueryElement Members
+
+			public QueryElementType ElementType { get { return QueryElementType.Condition; } }
+
+			StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+			{
+				if (dic.ContainsKey(this))
+					return sb.Append("...");
+
+				dic.Add(this, this);
+
+				sb.Append('(');
+
+				if (IsNot) sb.Append("NOT ");
+
+				Predicate.ToString(sb, dic);
+				sb.Append(')').Append(IsOr ? " OR " : " AND ");
+
+				dic.Remove(this);
+
+				return sb;
+			}
+
+			#endregion
+		}
+
+		#endregion
+
+		#region SearchCondition
+
+		public class SearchCondition : ConditionBase<SearchCondition, SearchCondition.Next>, ISqlPredicate, ISqlExpression
+		{
+			public SearchCondition()
+			{
+			}
+
+			public SearchCondition(IEnumerable<Condition> list)
+			{
+				_conditions.AddRange(list);
+			}
+
+			public SearchCondition(params Condition[] list)
+			{
+				_conditions.AddRange(list);
+			}
+
+			public class Next
+			{
+				internal Next(SearchCondition parent)
+				{
+					_parent = parent;
+				}
+
+				readonly SearchCondition _parent;
+
+				public SearchCondition Or  { get { return _parent.SetOr(true);  } }
+				public SearchCondition And { get { return _parent.SetOr(false); } }
+
+				public ISqlExpression  ToExpr() { return _parent; }
+			}
+
+			readonly List<Condition> _conditions = new List<Condition>();
+			public   List<Condition>  Conditions
+			{
+				get { return _conditions; }
+			}
+
+			protected override SearchCondition Search
+			{
+				get { return this; }
+			}
+
+			protected override Next GetNext()
+			{
+				return new Next(this);
+			}
+
+			#region Overrides
+
+#if OVERRIDETOSTRING
+
+			public override string ToString()
+			{
+				return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+			}
+
+#endif
+
+			#endregion
+
+			#region IPredicate Members
+
+			public int Precedence
+			{
+				get
+				{
+					if (_conditions.Count == 0) return Sql.Precedence.Unknown;
+					if (_conditions.Count == 1) return _conditions[0].Precedence;
+
+					return _conditions.Select(_ =>
+						_.IsNot ? Sql.Precedence.LogicalNegation :
+						_.IsOr  ? Sql.Precedence.LogicalDisjunction :
+						          Sql.Precedence.LogicalConjunction).Min();
+				}
+			}
+
+			public Type SystemType
+			{
+				get { return typeof(bool); }
+			}
+
+			[Obsolete]
+			ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+			{
+				foreach (var condition in Conditions)
+					condition.Predicate.Walk(skipColumns, func);
+
+				return func(this);
+			}
+
+			#endregion
+
+			#region IEquatable<ISqlExpression> Members
+
+			bool IEquatable<ISqlExpression>.Equals(ISqlExpression other)
+			{
+				return this == other;
+			}
+
+			#endregion
+
+			#region ISqlExpression Members
+
+			public bool CanBeNull()
+			{
+				foreach (var c in Conditions)
+					if (c.CanBeNull())
+						return true;
+
+				return false;
+			}
+
+			public bool Equals(ISqlExpression other, Func<ISqlExpression,ISqlExpression,bool> comparer)
+			{
+				return this == other;
+			}
+
+			#endregion
+
+			#region ICloneableElement Members
+
+			public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+			{
+				if (!doClone(this))
+					return this;
+
+				ICloneableElement clone;
+
+				if (!objectTree.TryGetValue(this, out clone))
+				{
+					var sc = new SearchCondition();
+
+					objectTree.Add(this, clone = sc);
+
+					sc._conditions.AddRange(_conditions.ConvertAll(c => (Condition)c.Clone(objectTree, doClone)));
+				}
+
+				return clone;
+			}
+
+			#endregion
+
+			#region IQueryElement Members
+
+			public QueryElementType ElementType { get { return QueryElementType.SearchCondition; } }
+
+			StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+			{
+				if (dic.ContainsKey(this))
+					return sb.Append("...");
+
+				dic.Add(this, this);
+
+				foreach (IQueryElement c in Conditions)
+					c.ToString(sb, dic);
+
+				if (Conditions.Count > 0)
+					sb.Length -= 4;
+
+				dic.Remove(this);
+
+				return sb;
+			}
+
+			#endregion
+		}
+
+		#endregion
+
+		#region ConditionBase
+
+		interface IConditionExpr<T>
+		{
+			T Expr    (ISqlExpression expr);
+			T Field   (SqlField       field);
+			T SubQuery(SqlQuery       sqlQuery);
+			T Value   (object         value);
+		}
+
+		public abstract class ConditionBase<T1,T2> : IConditionExpr<ConditionBase<T1,T2>.Expr_>
+			where T1 : ConditionBase<T1,T2>
+		{
+			public class Expr_
+			{
+				internal Expr_(ConditionBase<T1,T2> condition, bool isNot, ISqlExpression expr)
+				{
+					_condition = condition;
+					_isNot     = isNot;
+					_expr      = expr;
+				}
+
+				readonly ConditionBase<T1,T2> _condition;
+				readonly bool                 _isNot;
+				readonly ISqlExpression       _expr;
+
+				T2 Add(ISqlPredicate predicate)
+				{
+					_condition.Search.Conditions.Add(new Condition(_isNot, predicate));
+					return _condition.GetNext();
+				}
+
+				#region Predicate.ExprExpr
+
+				public class Op_ : IConditionExpr<T2>
+				{
+					internal Op_(Expr_ expr, Predicate.Operator op) 
+					{
+						_expr = expr;
+						_op   = op;
+					}
+
+					readonly Expr_              _expr;
+					readonly Predicate.Operator _op;
+
+					public T2 Expr    (ISqlExpression expr) { return _expr.Add(new Predicate.ExprExpr(_expr._expr, _op, expr)); }
+					public T2 Field   (SqlField      field) { return Expr(field);               }
+					public T2 SubQuery(SqlQuery   subQuery) { return Expr(subQuery);            }
+					public T2 Value   (object        value) { return Expr(new SqlValue(value)); }
+
+					public T2 All     (SqlQuery   subQuery) { return Expr(SqlFunction.CreateAll (subQuery)); }
+					public T2 Some    (SqlQuery   subQuery) { return Expr(SqlFunction.CreateSome(subQuery)); }
+					public T2 Any     (SqlQuery   subQuery) { return Expr(SqlFunction.CreateAny (subQuery)); }
+				}
+
+				public Op_ Equal          { get { return new Op_(this, Predicate.Operator.Equal);          } }
+				public Op_ NotEqual       { get { return new Op_(this, Predicate.Operator.NotEqual);       } }
+				public Op_ Greater        { get { return new Op_(this, Predicate.Operator.Greater);        } }
+				public Op_ GreaterOrEqual { get { return new Op_(this, Predicate.Operator.GreaterOrEqual); } }
+				public Op_ NotGreater     { get { return new Op_(this, Predicate.Operator.NotGreater);     } }
+				public Op_ Less           { get { return new Op_(this, Predicate.Operator.Less);           } }
+				public Op_ LessOrEqual    { get { return new Op_(this, Predicate.Operator.LessOrEqual);    } }
+				public Op_ NotLess        { get { return new Op_(this, Predicate.Operator.NotLess);        } }
+
+				#endregion
+
+				#region Predicate.Like
+
+				public T2 Like(ISqlExpression expression, SqlValue escape) { return Add(new Predicate.Like(_expr, false, expression, escape)); }
+				public T2 Like(ISqlExpression expression)                  { return Like(expression, null); }
+				public T2 Like(string expression,         SqlValue escape) { return Like(new SqlValue(expression), escape); }
+				public T2 Like(string expression)                          { return Like(new SqlValue(expression), null);   }
+
+				#endregion
+
+				#region Predicate.Between
+
+				public T2 Between   (ISqlExpression expr1, ISqlExpression expr2) { return Add(new Predicate.Between(_expr, false, expr1, expr2)); }
+				public T2 NotBetween(ISqlExpression expr1, ISqlExpression expr2) { return Add(new Predicate.Between(_expr, true,  expr1, expr2)); }
+
+				#endregion
+
+				#region Predicate.IsNull
+
+				public T2 IsNull    { get { return Add(new Predicate.IsNull(_expr, false)); } }
+				public T2 IsNotNull { get { return Add(new Predicate.IsNull(_expr, true));  } }
+
+				#endregion
+
+				#region Predicate.In
+
+				public T2 In   (SqlQuery subQuery) { return Add(new Predicate.InSubQuery(_expr, false, subQuery)); }
+				public T2 NotIn(SqlQuery subQuery) { return Add(new Predicate.InSubQuery(_expr, true,  subQuery)); }
+
+				Predicate.InList CreateInList(bool isNot, object[] exprs)
+				{
+					var list = new Predicate.InList(_expr, isNot, null);
+
+					if (exprs != null && exprs.Length > 0)
+					{
+						foreach (var item in exprs)
+						{
+							if (item == null || item is SqlValue && ((SqlValue)item).Value == null)
+								continue;
+
+							if (item is ISqlExpression)
+								list.Values.Add((ISqlExpression)item);
+							else
+								list.Values.Add(new SqlValue(item));
+						}
+					}
+
+					return list;
+				}
+
+				public T2 In   (params object[] exprs) { return Add(CreateInList(false, exprs)); }
+				public T2 NotIn(params object[] exprs) { return Add(CreateInList(true,  exprs)); }
+
+				#endregion
+			}
+
+			public class Not_ : IConditionExpr<Expr_>
+			{
+				internal Not_(ConditionBase<T1,T2> condition)
+				{
+					_condition = condition;
+				}
+
+				readonly ConditionBase<T1,T2> _condition;
+
+				public Expr_ Expr    (ISqlExpression expr)     { return new Expr_(_condition, true, expr); }
+				public Expr_ Field   (SqlField       field)    { return Expr(field);               }
+				public Expr_ SubQuery(SqlQuery       subQuery) { return Expr(subQuery);            }
+				public Expr_ Value   (object         value)    { return Expr(new SqlValue(value)); }
+
+				public T2 Exists(SqlQuery subQuery)
+				{
+					_condition.Search.Conditions.Add(new Condition(true, new Predicate.FuncLike(SqlFunction.CreateExists(subQuery))));
+					return _condition.GetNext();
+				}
+			}
+
+			protected abstract SearchCondition Search { get; }
+			protected abstract T2              GetNext();
+
+			protected T1 SetOr(bool value)
+			{
+				Search.Conditions[Search.Conditions.Count - 1].IsOr = value;
+				return (T1)this;
+			}
+
+			public Not_  Not { get { return new Not_(this); } }
+
+			public Expr_ Expr    (ISqlExpression expr)     { return new Expr_(this, false, expr); }
+			public Expr_ Field   (SqlField       field)    { return Expr(field);                  }
+			public Expr_ SubQuery(SqlQuery       subQuery) { return Expr(subQuery);               }
+			public Expr_ Value   (object         value)    { return Expr(new SqlValue(value));    }
+
+			public T2 Exists(SqlQuery subQuery)
+			{
+				Search.Conditions.Add(new Condition(false, new Predicate.FuncLike(SqlFunction.CreateExists(subQuery))));
+				return GetNext();
+			}
+		}
+
+		#endregion
+
+		#region OrderByItem
+
+		public class OrderByItem : IQueryElement, ICloneableElement
+		{
+			public OrderByItem(ISqlExpression expression, bool isDescending)
+			{
+				Expression   = expression;
+				IsDescending = isDescending;
+			}
+
+			public ISqlExpression Expression   { get; internal set; }
+			public bool           IsDescending { get; private set; }
+
+			[Obsolete]
+			internal void Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+			{
+				Expression = Expression.Walk(skipColumns, func);
+			}
+
+			public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+			{
+				if (!doClone(this))
+					return this;
+
+				ICloneableElement clone;
+
+				if (!objectTree.TryGetValue(this, out clone))
+					objectTree.Add(this, clone = new OrderByItem((ISqlExpression)Expression.Clone(objectTree, doClone), IsDescending));
+
+				return clone;
+			}
+
+			#region Overrides
+
+#if OVERRIDETOSTRING
+
+			public override string ToString()
+			{
+				return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+			}
+
+#endif
+
+			#endregion
+
+			#region IQueryElement Members
+
+			public QueryElementType ElementType
+			{
+				get { return QueryElementType.OrderByItem; }
+			}
+
+			StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+			{
+				Expression.ToString(sb, dic);
+
+				if (IsDescending)
+					sb.Append(" DESC");
+
+				return sb;
+			}
+
+			#endregion
+		}
+
+		#endregion
+
+		#region ClauseBase
+
+		public abstract class ClauseBase
+		{
+			protected ClauseBase(SqlQuery sqlQuery)
+			{
+				SqlQuery = sqlQuery;
+			}
+
+			public SelectClause  Select  { get { return SqlQuery.Select;  } }
+			public FromClause    From    { get { return SqlQuery.From;    } }
+			public WhereClause   Where   { get { return SqlQuery.Where;   } }
+			public GroupByClause GroupBy { get { return SqlQuery.GroupBy; } }
+			public WhereClause   Having  { get { return SqlQuery.Having;  } }
+			public OrderByClause OrderBy { get { return SqlQuery.OrderBy; } }
+			public SqlQuery      End()   { return SqlQuery; }
+
+			protected internal SqlQuery SqlQuery { get; private set; }
+
+			internal void SetSqlQuery(SqlQuery sqlQuery)
+			{
+				SqlQuery = sqlQuery;
+			}
+		}
+
+		public abstract class ClauseBase<T1, T2> : ConditionBase<T1, T2>
+			where T1 : ClauseBase<T1, T2>
+		{
+			protected ClauseBase(SqlQuery sqlQuery)
+			{
+				SqlQuery = sqlQuery;
+			}
+
+			public SelectClause  Select  { get { return SqlQuery.Select;  } }
+			public FromClause    From    { get { return SqlQuery.From;    } }
+			public GroupByClause GroupBy { get { return SqlQuery.GroupBy; } }
+			public WhereClause   Having  { get { return SqlQuery.Having;  } }
+			public OrderByClause OrderBy { get { return SqlQuery.OrderBy; } }
+			public SqlQuery      End()   { return SqlQuery; }
+
+			protected internal SqlQuery SqlQuery { get; private set; }
+
+			internal void SetSqlQuery(SqlQuery sqlQuery)
+			{
+				SqlQuery = sqlQuery;
+			}
+		}
+
+		#endregion
+
+		#region SelectClause
+
+		public class SelectClause : ClauseBase, IQueryElement, ISqlExpressionWalkable
+		{
+			#region Init
+
+			internal SelectClause(SqlQuery sqlQuery) : base(sqlQuery)
+			{
+			}
+
+			internal SelectClause(
+				SqlQuery   sqlQuery,
+				SelectClause clone,
+				Dictionary<ICloneableElement,ICloneableElement> objectTree,
+				Predicate<ICloneableElement> doClone)
+				: base(sqlQuery)
+			{
+				_columns.AddRange(clone._columns.ConvertAll(c => (Column)c.Clone(objectTree, doClone)));
+
+				IsDistinct = clone.IsDistinct;
+				TakeValue  = clone.TakeValue == null ? null : (ISqlExpression)clone.TakeValue.Clone(objectTree, doClone);
+				SkipValue  = clone.SkipValue == null ? null : (ISqlExpression)clone.SkipValue.Clone(objectTree, doClone);
+			}
+
+			internal SelectClause(bool isDistinct, ISqlExpression takeValue, ISqlExpression skipValue, IEnumerable<Column> columns)
+				: base(null)
+			{
+				IsDistinct = isDistinct;
+				TakeValue  = takeValue;
+				SkipValue  = skipValue;
+
+				_columns.AddRange(columns);
+			}
+
+			#endregion
+
+			#region Columns
+
+			public SelectClause Field(SqlField field)
+			{
+				AddOrGetColumn(new Column(SqlQuery, field));
+				return this;
+			}
+
+			public SelectClause Field(SqlField field, string alias)
+			{
+				AddOrGetColumn(new Column(SqlQuery, field, alias));
+				return this;
+			}
+
+			public SelectClause SubQuery(SqlQuery subQuery)
+			{
+				if (subQuery.ParentSql != null && subQuery.ParentSql != SqlQuery)
+					throw new ArgumentException("SqlQuery already used as subquery");
+
+				subQuery.ParentSql = SqlQuery;
+
+				AddOrGetColumn(new Column(SqlQuery, subQuery));
+				return this;
+			}
+
+			public SelectClause SubQuery(SqlQuery sqlQuery, string alias)
+			{
+				if (sqlQuery.ParentSql != null && sqlQuery.ParentSql != SqlQuery)
+					throw new ArgumentException("SqlQuery already used as subquery");
+
+				sqlQuery.ParentSql = SqlQuery;
+
+				AddOrGetColumn(new Column(SqlQuery, sqlQuery, alias));
+				return this;
+			}
+
+			public SelectClause Expr(ISqlExpression expr)
+			{
+				AddOrGetColumn(new Column(SqlQuery, expr));
+				return this;
+			}
+
+			public SelectClause Expr(ISqlExpression expr, string alias)
+			{
+				AddOrGetColumn(new Column(SqlQuery, expr, alias));
+				return this;
+			}
+
+			public SelectClause Expr(string expr, params ISqlExpression[] values)
+			{
+				AddOrGetColumn(new Column(SqlQuery, new SqlExpression(null, expr, values)));
+				return this;
+			}
+
+			public SelectClause Expr(Type systemType, string expr, params ISqlExpression[] values)
+			{
+				AddOrGetColumn(new Column(SqlQuery, new SqlExpression(systemType, expr, values)));
+				return this;
+			}
+
+			public SelectClause Expr(string expr, int priority, params ISqlExpression[] values)
+			{
+				AddOrGetColumn(new Column(SqlQuery, new SqlExpression(null, expr, priority, values)));
+				return this;
+			}
+
+			public SelectClause Expr(Type systemType, string expr, int priority, params ISqlExpression[] values)
+			{
+				AddOrGetColumn(new Column(SqlQuery, new SqlExpression(systemType, expr, priority, values)));
+				return this;
+			}
+
+			public SelectClause Expr(string alias, string expr, int priority, params ISqlExpression[] values)
+			{
+				AddOrGetColumn(new Column(SqlQuery, new SqlExpression(null, expr, priority, values)));
+				return this;
+			}
+
+			public SelectClause Expr(Type systemType, string alias, string expr, int priority, params ISqlExpression[] values)
+			{
+				AddOrGetColumn(new Column(SqlQuery, new SqlExpression(systemType, expr, priority, values)));
+				return this;
+			}
+
+			public SelectClause Expr<T>(ISqlExpression expr1, string operation, ISqlExpression expr2)
+			{
+				AddOrGetColumn(new Column(SqlQuery, new SqlBinaryExpression(typeof(T), expr1, operation, expr2)));
+				return this;
+			}
+
+			public SelectClause Expr<T>(ISqlExpression expr1, string operation, ISqlExpression expr2, int priority)
+			{
+				AddOrGetColumn(new Column(SqlQuery, new SqlBinaryExpression(typeof(T), expr1, operation, expr2, priority)));
+				return this;
+			}
+
+			public SelectClause Expr<T>(string alias, ISqlExpression expr1, string operation, ISqlExpression expr2, int priority)
+			{
+				AddOrGetColumn(new Column(SqlQuery, new SqlBinaryExpression(typeof(T), expr1, operation, expr2, priority), alias));
+				return this;
+			}
+
+			public int Add(ISqlExpression expr)
+			{
+				if (expr is Column && ((Column)expr).Parent == SqlQuery)
+					throw new InvalidOperationException();
+
+				return Columns.IndexOf(AddOrGetColumn(new Column(SqlQuery, expr)));
+			}
+
+			public int Add(ISqlExpression expr, string alias)
+			{
+				return Columns.IndexOf(AddOrGetColumn(new Column(SqlQuery, expr, alias)));
+			}
+
+			Column AddOrGetColumn(Column col)
+			{
+				foreach (var c in Columns)
+					if (c.Equals(col))
+						return col;
+
+#if DEBUG
+
+				switch (col.Expression.ElementType)
+				{
+					case QueryElementType.SqlField :
+						{
+							var table = ((SqlField)col.Expression).Table;
+
+							//if (SqlQuery.From.GetFromTables().Any(_ => _ == table))
+							//	throw new InvalidOperationException("Wrong field usage.");
+
+							break;
+						}
+
+					case QueryElementType.Column :
+						{
+							var query = ((Column)col.Expression).Parent;
+
+							//if (!SqlQuery.From.GetFromQueries().Any(_ => _ == query))
+							//	throw new InvalidOperationException("Wrong column usage.");
+
+							break;
+						}
+
+					case QueryElementType.SqlQuery :
+						{
+							if (col.Expression == SqlQuery)
+								throw new InvalidOperationException("Wrong query usage.");
+							break;
+						}
+				}
+
+#endif
+
+				Columns.Add(col);
+
+				return col;
+			}
+
+			readonly List<Column> _columns = new List<Column>();
+			public   List<Column>  Columns
+			{
+				get { return _columns; }
+			}
+
+			#endregion
+
+			#region HasModifier
+
+			public bool HasModifier
+			{
+				get { return IsDistinct || SkipValue != null || TakeValue != null; }
+			}
+
+			#endregion
+
+			#region Distinct
+
+			public SelectClause Distinct
+			{
+				get { IsDistinct = true; return this; }
+			}
+
+			public bool IsDistinct { get; set; }
+
+			#endregion
+
+			#region Take
+
+			public SelectClause Take(int value)
+			{
+				TakeValue = new SqlValue(value);
+				return this;
+			}
+
+			public SelectClause Take(ISqlExpression value)
+			{
+				TakeValue = value;
+				return this;
+			}
+
+			public ISqlExpression TakeValue { get; set; }
+
+			#endregion
+
+			#region Skip
+
+			public SelectClause Skip(int value)
+			{
+				SkipValue = new SqlValue(value);
+				return this;
+			}
+
+			public SelectClause Skip(ISqlExpression value)
+			{
+				SkipValue = value;
+				return this;
+			}
+
+			public ISqlExpression SkipValue { get; set; }
+
+			#endregion
+
+			#region Overrides
+
+#if OVERRIDETOSTRING
+
+			public override string ToString()
+			{
+				return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+			}
+
+#endif
+
+			#endregion
+
+			#region ISqlExpressionWalkable Members
+
+			[Obsolete]
+			ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+			{
+				for (var i = 0; i < Columns.Count; i++)
+				{
+					var col  = Columns[i];
+#pragma warning disable 0618
+					var expr = col.Walk(skipColumns, func);
+#pragma warning restore 0618
+
+					if (expr is Column)
+						Columns[i] = (Column)expr;
+					else
+						Columns[i] = new Column(col.Parent, expr, col.Alias);
+				}
+
+				if (TakeValue != null) TakeValue = TakeValue.Walk(skipColumns, func);
+				if (SkipValue != null) SkipValue = SkipValue.Walk(skipColumns, func);
+
+				return null;
+			}
+
+			#endregion
+
+			#region IQueryElement Members
+
+			public QueryElementType ElementType { get { return QueryElementType.SelectClause; } }
+
+			StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+			{
+				if (dic.ContainsKey(this))
+					return sb.Append("...");
+
+				dic.Add(this, this);
+
+				sb.Append("SELECT ");
+
+				if (IsDistinct) sb.Append("DISTINCT ");
+
+				if (SkipValue != null)
+				{
+					sb.Append("SKIP ");
+					SkipValue.ToString(sb, dic);
+					sb.Append(" ");
+				}
+
+				if (TakeValue != null)
+				{
+					sb.Append("TAKE ");
+					TakeValue.ToString(sb, dic);
+					sb.Append(" ");
+				}
+
+				sb.AppendLine();
+
+				if (Columns.Count == 0)
+					sb.Append("\t*, \n");
+				else
+					foreach (var c in Columns)
+					{
+						sb.Append("\t");
+						((IQueryElement)c).ToString(sb, dic);
+						sb
+							.Append(" as ")
+							.Append(c.Alias ?? "c" + (Columns.IndexOf(c) + 1))
+							.Append(", \n");
+					}
+
+				sb.Length -= 3;
+
+				dic.Remove(this);
+
+				return sb;
+			}
+
+			#endregion
+		}
+
+		private SelectClause _select;
+		public  SelectClause  Select
+		{
+			get { return _select; }
+		}
+
+		#endregion
+
+		#region InsertClause
+
+		public class SetExpression : IQueryElement, ISqlExpressionWalkable, ICloneableElement
+		{
+			public SetExpression(ISqlExpression column, ISqlExpression expression)
+			{
+				Column     = column;
+				Expression = expression;
+
+				if (expression is SqlParameter)
+				{
+					var p = (SqlParameter)expression;
+
+					//if (type.IsEnum)
+					//	p.SetEnumConverter(type, mappingSchema);
+
+					if (column is SqlField)
+					{
+						var field = (SqlField)column;
+
+						if (field.MemberMapper != null)
+						{
+							if (field.MemberMapper.MapMemberInfo.IsDbTypeSet)
+								p.DbType = field.MemberMapper.MapMemberInfo.DbType;
+
+							if (field.MemberMapper.MapMemberInfo.IsDbSizeSet)
+								p.DbSize = field.MemberMapper.MapMemberInfo.DbSize;
+						}
+					}
+				}
+			}
+
+			public ISqlExpression Column     { get; set; }
+			public ISqlExpression Expression { get; set; }
+
+			#region Overrides
+
+#if OVERRIDETOSTRING
+
+			public override string ToString()
+			{
+				return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+			}
+
+#endif
+
+			#endregion
+
+			#region ICloneableElement Members
+
+			public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+			{
+				if (!doClone(this))
+					return this;
+
+				ICloneableElement clone;
+
+				if (!objectTree.TryGetValue(this, out clone))
+				{
+					objectTree.Add(this, clone = new SetExpression(
+						(ISqlExpression)Column.    Clone(objectTree, doClone),
+						(ISqlExpression)Expression.Clone(objectTree, doClone)));
+				}
+
+				return clone;
+			}
+
+			#endregion
+
+			#region ISqlExpressionWalkable Members
+
+			[Obsolete]
+			ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+			{
+				Column     = Column.    Walk(skipColumns, func);
+				Expression = Expression.Walk(skipColumns, func);
+				return null;
+			}
+
+			#endregion
+
+			#region IQueryElement Members
+
+			public QueryElementType ElementType { get { return QueryElementType.SetExpression; } }
+
+			StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+			{
+				Column.ToString(sb, dic);
+				sb.Append(" = ");
+				Expression.ToString(sb, dic);
+
+				return sb;
+			}
+
+			#endregion
+		}
+
+		public class InsertClause : IQueryElement, ISqlExpressionWalkable, ICloneableElement
+		{
+			public InsertClause()
+			{
+				Items = new List<SetExpression>();
+			}
+
+			public List<SetExpression> Items        { get; private set; }
+			public SqlTable            Into         { get; set; }
+			public bool                WithIdentity { get; set; }
+
+			#region Overrides
+
+#if OVERRIDETOSTRING
+
+			public override string ToString()
+			{
+				return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+			}
+
+#endif
+
+			#endregion
+
+			#region ICloneableElement Members
+
+			public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+			{
+				if (!doClone(this))
+					return this;
+
+				var clone = new InsertClause { WithIdentity = WithIdentity };
+
+				if (Into != null)
+					clone.Into = (SqlTable)Into.Clone(objectTree, doClone);
+
+				foreach (var item in Items)
+					clone.Items.Add((SetExpression)item.Clone(objectTree, doClone));
+
+				objectTree.Add(this, clone);
+
+				return clone;
+			}
+
+			#endregion
+
+			#region ISqlExpressionWalkable Members
+
+			[Obsolete]
+			ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+			{
+				if (Into != null)
+					((ISqlExpressionWalkable)Into).Walk(skipColumns, func);
+
+				foreach (var t in Items)
+					((ISqlExpressionWalkable)t).Walk(skipColumns, func);
+
+				return null;
+			}
+
+			#endregion
+
+			#region IQueryElement Members
+
+			public QueryElementType ElementType { get { return QueryElementType.InsertClause; } }
+
+			StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+			{
+				sb.Append("VALUES ");
+
+				if (Into != null)
+					((IQueryElement)Into).ToString(sb, dic);
+
+				sb.AppendLine();
+
+				foreach (var e in Items)
+				{
+					sb.Append("\t");
+					((IQueryElement)e).ToString(sb, dic);
+					sb.AppendLine();
+				}
+
+				return sb;
+			}
+
+			#endregion
+		}
+
+		private InsertClause _insert;
+		public  InsertClause  Insert
+		{
+			get { return _insert ?? (_insert = new InsertClause()); }
+		}
+
+		public void ClearInsert()
+		{
+			_insert = null;
+		}
+
+		#endregion
+
+		#region UpdateClause
+
+		public class UpdateClause : IQueryElement, ISqlExpressionWalkable, ICloneableElement
+		{
+			public UpdateClause()
+			{
+				Items = new List<SetExpression>();
+				Keys  = new List<SetExpression>();
+			}
+
+			public List<SetExpression> Items { get; private set; }
+			public List<SetExpression> Keys  { get; private set; }
+			public SqlTable            Table { get; set; }
+
+			#region Overrides
+
+#if OVERRIDETOSTRING
+
+			public override string ToString()
+			{
+				return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+			}
+
+#endif
+
+			#endregion
+
+			#region ICloneableElement Members
+
+			public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+			{
+				if (!doClone(this))
+					return this;
+
+				var clone = new UpdateClause();
+
+				if (Table != null)
+					clone.Table = (SqlTable)Table.Clone(objectTree, doClone);
+
+				foreach (var item in Items)
+					clone.Items.Add((SetExpression)item.Clone(objectTree, doClone));
+
+				foreach (var item in Keys)
+					clone.Keys.Add((SetExpression)item.Clone(objectTree, doClone));
+
+				objectTree.Add(this, clone);
+
+				return clone;
+			}
+
+			#endregion
+
+			#region ISqlExpressionWalkable Members
+
+			[Obsolete]
+			ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+			{
+				if (Table != null)
+					((ISqlExpressionWalkable)Table).Walk(skipColumns, func);
+
+				foreach (var t in Items)
+					((ISqlExpressionWalkable)t).Walk(skipColumns, func);
+
+				foreach (var t in Keys)
+					((ISqlExpressionWalkable)t).Walk(skipColumns, func);
+
+				return null;
+			}
+
+			#endregion
+
+			#region IQueryElement Members
+
+			public QueryElementType ElementType { get { return QueryElementType.UpdateClause; } }
+
+			StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+			{
+				sb.Append("SET ");
+
+				if (Table != null)
+					((IQueryElement)Table).ToString(sb, dic);
+
+				sb.AppendLine();
+
+				foreach (var e in Items)
+				{
+					sb.Append("\t");
+					((IQueryElement)e).ToString(sb, dic);
+					sb.AppendLine();
+				}
+
+				return sb;
+			}
+
+			#endregion
+		}
+
+		private UpdateClause _update;
+		public  UpdateClause  Update
+		{
+			get { return _update ?? (_update = new UpdateClause()); }
+		}
+
+		public void ClearUpdate()
+		{
+			_update = null;
+		}
+
+		#endregion
+
+		#region DeleteClause
+
+		public class DeleteClause : IQueryElement, ISqlExpressionWalkable, ICloneableElement
+		{
+			public SqlTable Table { get; set; }
+
+			#region Overrides
+
+#if OVERRIDETOSTRING
+
+			public override string ToString()
+			{
+				return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+			}
+
+#endif
+
+			#endregion
+
+			#region ICloneableElement Members
+
+			public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+			{
+				if (!doClone(this))
+					return this;
+
+				var clone = new DeleteClause();
+
+				if (Table != null)
+					clone.Table = (SqlTable)Table.Clone(objectTree, doClone);
+
+				objectTree.Add(this, clone);
+
+				return clone;
+			}
+
+			#endregion
+
+			#region ISqlExpressionWalkable Members
+
+			[Obsolete]
+			ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+			{
+				if (Table != null)
+					((ISqlExpressionWalkable)Table).Walk(skipColumns, func);
+
+				return null;
+			}
+
+			#endregion
+
+			#region IQueryElement Members
+
+			public QueryElementType ElementType { get { return QueryElementType.DeleteClause; } }
+
+			StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+			{
+				sb.Append("DELETE FROM ");
+
+				if (Table != null)
+					((IQueryElement)Table).ToString(sb, dic);
+
+				sb.AppendLine();
+
+				return sb;
+			}
+
+			#endregion
+		}
+
+		private DeleteClause _delete;
+		public  DeleteClause  Delete
+		{
+			get { return _delete ?? (_delete = new DeleteClause()); }
+		}
+
+		public void ClearDelete()
+		{
+			_delete = null;
+		}
+
+		#endregion
+
+		#region FromClause
+
+		public class FromClause : ClauseBase, IQueryElement, ISqlExpressionWalkable
+		{
+			#region Join
+
+			public class Join : ConditionBase<Join,Join.Next>
+			{
+				public class Next
+				{
+					internal Next(Join parent)
+					{
+						_parent = parent;
+					}
+
+					readonly Join _parent;
+
+					public Join Or  { get { return _parent.SetOr(true);  } }
+					public Join And { get { return _parent.SetOr(false); } }
+
+					public static implicit operator Join(Next next)
+					{
+						return next._parent;
+					}
+				}
+
+				protected override SearchCondition Search
+				{
+					get { return JoinedTable.Condition; }
+				}
+
+				protected override Next GetNext()
+				{
+					return new Next(this);
+				}
+
+				internal Join(JoinType joinType, ISqlTableSource table, string alias, bool isWeak, ICollection<Join> joins)
+				{
+					JoinedTable = new JoinedTable(joinType, table, alias, isWeak);
+
+					if (joins != null && joins.Count > 0)
+						foreach (var join in joins)
+							JoinedTable.Table.Joins.Add(join.JoinedTable);
+				}
+
+				public JoinedTable JoinedTable { get; private set; }
+			}
+
+			#endregion
+
+			internal FromClause(SqlQuery sqlQuery) : base(sqlQuery)
+			{
+			}
+
+			internal FromClause(
+				SqlQuery sqlQuery,
+				FromClause clone,
+				Dictionary<ICloneableElement,ICloneableElement> objectTree,
+				Predicate<ICloneableElement> doClone)
+				: base(sqlQuery)
+			{
+				_tables.AddRange(clone._tables.ConvertAll(ts => (TableSource)ts.Clone(objectTree, doClone)));
+			}
+
+			internal FromClause(IEnumerable<TableSource> tables)
+				: base(null)
+			{
+				_tables.AddRange(tables);
+			}
+
+			public FromClause Table(ISqlTableSource table, params FJoin[] joins)
+			{
+				return Table(table, null, joins);
+			}
+
+			public FromClause Table(ISqlTableSource table, string alias, params FJoin[] joins)
+			{
+				var ts = AddOrGetTable(table, alias);
+
+				if (joins != null && joins.Length > 0)
+					foreach (var join in joins)
+						ts.Joins.Add(join.JoinedTable);
+
+				return this;
+			}
+
+			TableSource GetTable(ISqlTableSource table, string alias)
+			{
+				foreach (var ts in Tables)
+					if (ts.Source == table)
+						if (alias == null || ts.Alias == alias)
+							return ts;
+						else
+							throw new ArgumentException("alias");
+
+				return null;
+			}
+
+			TableSource AddOrGetTable(ISqlTableSource table, string alias)
+			{
+				var ts = GetTable(table, alias);
+
+				if (ts != null)
+					return ts;
+
+				var t = new TableSource(table, alias);
+
+				Tables.Add(t);
+
+				return t;
+			}
+
+			public TableSource this[ISqlTableSource table]
+			{
+				get { return this[table, null]; }
+			}
+
+			public TableSource this[ISqlTableSource table, string alias]
+			{
+				get
+				{
+					foreach (var ts in Tables)
+					{
+						var t = CheckTableSource(ts, table, alias);
+
+						if (t != null)
+							return t;
+					}
+
+					return null;
+				}
+			}
+
+			public bool IsChild(ISqlTableSource table)
+			{
+				foreach (var ts in Tables)
+					if (ts.Source == table || CheckChild(ts.Joins, table))
+						return true;
+				return false;
+			}
+
+			static bool CheckChild(IEnumerable<JoinedTable> joins, ISqlTableSource table)
+			{
+				foreach (var j in joins)
+					if (j.Table.Source == table || CheckChild(j.Table.Joins, table))
+						return true;
+				return false;
+			}
+
+			readonly List<TableSource> _tables = new List<TableSource>();
+			public   List<TableSource>  Tables
+			{
+				get { return _tables; }
+			}
+
+			static IEnumerable<ISqlTableSource> GetJoinTables(TableSource source, QueryElementType elementType)
+			{
+				if (source.Source.ElementType == elementType)
+					yield return source.Source;
+
+				foreach (var join in source.Joins)
+					foreach (var table in GetJoinTables(join.Table, elementType))
+						yield return table;
+			}
+
+			internal IEnumerable<ISqlTableSource> GetFromTables()
+			{
+				return Tables.SelectMany(_ => GetJoinTables(_, QueryElementType.SqlTable));
+			}
+
+			internal IEnumerable<ISqlTableSource> GetFromQueries()
+			{
+				return Tables.SelectMany(_ => GetJoinTables(_, QueryElementType.SqlQuery));
+			}
+
+			static TableSource FindTableSource(TableSource source, SqlTable table)
+			{
+				if (source.Source == table)
+					return source;
+
+				foreach (var join in source.Joins)
+				{
+					var ts = FindTableSource(join.Table, table);
+					if (ts != null)
+						return ts;
+				}
+
+				return null;
+			}
+
+			public ISqlTableSource FindTableSource(SqlTable table)
+			{
+				foreach (var source in Tables)
+				{
+					var ts = FindTableSource(source, table);
+					if (ts != null)
+						return ts;
+				}
+
+				return null;
+			}
+
+			#region Overrides
+
+#if OVERRIDETOSTRING
+
+			public override string ToString()
+			{
+				return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+			}
+
+#endif
+
+			#endregion
+
+			#region ISqlExpressionWalkable Members
+
+			[Obsolete]
+			ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+			{
+				for (var i = 0; i <	Tables.Count; i++)
+					((ISqlExpressionWalkable)Tables[i]).Walk(skipColumns, func);
+
+				return null;
+			}
+
+			#endregion
+
+			#region IQueryElement Members
+
+			public QueryElementType ElementType { get { return QueryElementType.FromClause; } }
+
+			StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+			{
+				sb.Append(" \nFROM \n");
+
+				if (Tables.Count > 0)
+				{
+					foreach (IQueryElement ts in Tables)
+					{
+						sb.Append('\t');
+						var len = sb.Length;
+						ts.ToString(sb, dic).Replace("\n", "\n\t", len, sb.Length - len);
+						sb.Append(", ");
+					}
+
+					sb.Length -= 2;
+				}
+
+				return sb;
+			}
+
+			#endregion
+		}
+
+		public static FJoin InnerJoin    (ISqlTableSource table,               params FJoin[] joins) { return new FJoin(JoinType.Inner,      table, null,  false, joins); }
+		public static FJoin InnerJoin    (ISqlTableSource table, string alias, params FJoin[] joins) { return new FJoin(JoinType.Inner,      table, alias, false, joins); }
+		public static FJoin LeftJoin     (ISqlTableSource table,               params FJoin[] joins) { return new FJoin(JoinType.Left,       table, null,  false, joins); }
+		public static FJoin LeftJoin     (ISqlTableSource table, string alias, params FJoin[] joins) { return new FJoin(JoinType.Left,       table, alias, false, joins); }
+		public static FJoin Join         (ISqlTableSource table,               params FJoin[] joins) { return new FJoin(JoinType.Auto,       table, null,  false, joins); }
+		public static FJoin Join         (ISqlTableSource table, string alias, params FJoin[] joins) { return new FJoin(JoinType.Auto,       table, alias, false, joins); }
+		public static FJoin CrossApply   (ISqlTableSource table,               params FJoin[] joins) { return new FJoin(JoinType.CrossApply, table, null,  false, joins); }
+		public static FJoin CrossApply   (ISqlTableSource table, string alias, params FJoin[] joins) { return new FJoin(JoinType.CrossApply, table, alias, false, joins); }
+		public static FJoin OuterApply   (ISqlTableSource table,               params FJoin[] joins) { return new FJoin(JoinType.OuterApply, table, null,  false, joins); }
+		public static FJoin OuterApply   (ISqlTableSource table, string alias, params FJoin[] joins) { return new FJoin(JoinType.OuterApply, table, alias, false, joins); }
+
+		public static FJoin WeakInnerJoin(ISqlTableSource table,               params FJoin[] joins) { return new FJoin(JoinType.Inner,      table, null,  true,  joins); }
+		public static FJoin WeakInnerJoin(ISqlTableSource table, string alias, params FJoin[] joins) { return new FJoin(JoinType.Inner,      table, alias, true,  joins); }
+		public static FJoin WeakLeftJoin (ISqlTableSource table,               params FJoin[] joins) { return new FJoin(JoinType.Left,       table, null,  true,  joins); }
+		public static FJoin WeakLeftJoin (ISqlTableSource table, string alias, params FJoin[] joins) { return new FJoin(JoinType.Left,       table, alias, true,  joins); }
+		public static FJoin WeakJoin     (ISqlTableSource table,               params FJoin[] joins) { return new FJoin(JoinType.Auto,       table, null,  true,  joins); }
+		public static FJoin WeakJoin     (ISqlTableSource table, string alias, params FJoin[] joins) { return new FJoin(JoinType.Auto,       table, alias, true,  joins); }
+
+		private FromClause _from;
+		public  FromClause  From
+		{
+			get { return _from; }
+		}
+
+		#endregion
+
+		#region WhereClause
+
+		public class WhereClause : ClauseBase<WhereClause,WhereClause.Next>, IQueryElement, ISqlExpressionWalkable
+		{
+			public class Next : ClauseBase
+			{
+				internal Next(WhereClause parent) : base(parent.SqlQuery)
+				{
+					_parent = parent;
+				}
+
+				readonly WhereClause _parent;
+
+				public WhereClause Or  { get { return _parent.SetOr(true);  } }
+				public WhereClause And { get { return _parent.SetOr(false); } }
+			}
+
+			internal WhereClause(SqlQuery sqlQuery) : base(sqlQuery)
+			{
+				SearchCondition = new SearchCondition();
+			}
+
+			internal WhereClause(
+				SqlQuery sqlQuery,
+				WhereClause clone,
+				Dictionary<ICloneableElement,ICloneableElement> objectTree,
+				Predicate<ICloneableElement> doClone)
+				: base(sqlQuery)
+			{
+				SearchCondition = (SearchCondition)clone.SearchCondition.Clone(objectTree, doClone);
+			}
+
+			internal WhereClause(SearchCondition searchCondition) : base(null)
+			{
+				SearchCondition = searchCondition;
+			}
+
+			public SearchCondition SearchCondition { get; private set; }
+
+			public bool IsEmpty
+			{
+				get { return SearchCondition.Conditions.Count == 0; }
+			}
+
+			protected override SearchCondition Search
+			{
+				get { return SearchCondition; }
+			}
+
+			protected override Next GetNext()
+			{
+				return new Next(this);
+			}
+
+#if OVERRIDETOSTRING
+
+			public override string ToString()
+			{
+				return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+			}
+
+#endif
+
+			#region ISqlExpressionWalkable Members
+
+			[Obsolete]
+			ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> action)
+			{
+				SearchCondition = (SearchCondition)((ISqlExpressionWalkable)SearchCondition).Walk(skipColumns, action);
+				return null;
+			}
+
+			#endregion
+
+			#region IQueryElement Members
+
+			public QueryElementType ElementType
+			{
+				get { return QueryElementType.WhereClause; }
+			}
+
+			StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+			{
+				if (Search.Conditions.Count == 0)
+					return sb;
+
+				sb.Append("\nWHERE\n\t");
+				return ((IQueryElement)Search).ToString(sb, dic);
+			}
+
+			#endregion
+		}
+
+		private WhereClause _where;
+		public  WhereClause  Where
+		{
+			get { return _where; }
+		}
+
+		#endregion
+
+		#region GroupByClause
+
+		public class GroupByClause : ClauseBase, IQueryElement, ISqlExpressionWalkable
+		{
+			internal GroupByClause(SqlQuery sqlQuery) : base(sqlQuery)
+			{
+			}
+
+			internal GroupByClause(
+				SqlQuery    sqlQuery,
+				GroupByClause clone,
+				Dictionary<ICloneableElement,ICloneableElement> objectTree,
+				Predicate<ICloneableElement> doClone)
+				: base(sqlQuery)
+			{
+				_items.AddRange(clone._items.ConvertAll(e => (ISqlExpression)e.Clone(objectTree, doClone)));
+			}
+
+			internal GroupByClause(IEnumerable<ISqlExpression> items) : base(null)
+			{
+				_items.AddRange(items);
+			}
+
+			public GroupByClause Expr(ISqlExpression expr)
+			{
+				Add(expr);
+				return this;
+			}
+
+			public GroupByClause Field(SqlField field)
+			{
+				return Expr(field);
+			}
+
+			void Add(ISqlExpression expr)
+			{
+				foreach (var e in Items)
+					if (e.Equals(expr))
+						return;
+
+				Items.Add(expr);
+			}
+
+			readonly List<ISqlExpression> _items = new List<ISqlExpression>();
+			public   List<ISqlExpression>  Items
+			{
+				get { return _items; }
+			}
+
+			public bool IsEmpty
+			{
+				get { return Items.Count == 0; }
+			}
+
+#if OVERRIDETOSTRING
+
+			public override string ToString()
+			{
+				return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+			}
+
+#endif
+
+			#region ISqlExpressionWalkable Members
+
+			[Obsolete]
+			ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+			{
+				for (var i = 0; i < Items.Count; i++)
+					Items[i] = Items[i].Walk(skipColumns, func);
+
+				return null;
+			}
+
+			#endregion
+
+			#region IQueryElement Members
+
+			public QueryElementType ElementType { get { return QueryElementType.GroupByClause; } }
+
+			StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+			{
+				if (Items.Count == 0)
+					return sb;
+
+				sb.Append(" \nGROUP BY \n");
+
+				foreach (var item in Items)
+				{
+					sb.Append('\t');
+					item.ToString(sb, dic);
+					sb.Append(",");
+				}
+
+				sb.Length--;
+
+				return sb;
+			}
+
+			#endregion
+		}
+
+		private GroupByClause _groupBy;
+		public  GroupByClause  GroupBy
+		{
+			get { return _groupBy; }
+		}
+
+		#endregion
+
+		#region HavingClause
+
+		private WhereClause _having;
+		public  WhereClause  Having
+		{
+			get { return _having; }
+		}
+
+		#endregion
+
+		#region OrderByClause
+
+		public class OrderByClause : ClauseBase, IQueryElement, ISqlExpressionWalkable
+		{
+			internal OrderByClause(SqlQuery sqlQuery) : base(sqlQuery)
+			{
+			}
+
+			internal OrderByClause(
+				SqlQuery    sqlQuery,
+				OrderByClause clone,
+				Dictionary<ICloneableElement,ICloneableElement> objectTree,
+				Predicate<ICloneableElement> doClone)
+				: base(sqlQuery)
+			{
+				_items.AddRange(clone._items.ConvertAll(item => (OrderByItem)item.Clone(objectTree, doClone)));
+			}
+
+			internal OrderByClause(IEnumerable<OrderByItem> items) : base(null)
+			{
+				_items.AddRange(items);
+			}
+
+			public OrderByClause Expr(ISqlExpression expr, bool isDescending)
+			{
+				Add(expr, isDescending);
+				return this;
+			}
+
+			public OrderByClause Expr     (ISqlExpression expr)               { return Expr(expr,  false);        }
+			public OrderByClause ExprAsc  (ISqlExpression expr)               { return Expr(expr,  false);        }
+			public OrderByClause ExprDesc (ISqlExpression expr)               { return Expr(expr,  true);         }
+			public OrderByClause Field    (SqlField field, bool isDescending) { return Expr(field, isDescending); }
+			public OrderByClause Field    (SqlField field)                    { return Expr(field, false);        }
+			public OrderByClause FieldAsc (SqlField field)                    { return Expr(field, false);        }
+			public OrderByClause FieldDesc(SqlField field)                    { return Expr(field, true);         }
+
+			void Add(ISqlExpression expr, bool isDescending)
+			{
+				foreach (var item in Items)
+					if (item.Expression.Equals(expr, (x, y) =>
+					{
+						var col = x as Column;
+						return col == null || !col.Parent.HasUnion || x == y;
+					}))
+						return;
+
+				Items.Add(new OrderByItem(expr, isDescending));
+			}
+
+			readonly List<OrderByItem> _items = new List<OrderByItem>();
+			public   List<OrderByItem>  Items
+			{
+				get { return _items; }
+			}
+
+			public bool IsEmpty
+			{
+				get { return Items.Count == 0; }
+			}
+
+#if OVERRIDETOSTRING
+
+			public override string ToString()
+			{
+				return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+			}
+
+#endif
+
+			#region ISqlExpressionWalkable Members
+
+			[Obsolete]
+			ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+			{
+#pragma warning disable 0618
+				foreach (var t in Items)
+					t.Walk(skipColumns, func);
+#pragma warning restore 0618
+				return null;
+			}
+
+			#endregion
+
+			#region IQueryElement Members
+
+			public QueryElementType ElementType { get { return QueryElementType.OrderByClause; } }
+
+			StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+			{
+				if (Items.Count == 0)
+					return sb;
+
+				sb.Append(" \nORDER BY \n");
+
+				foreach (IQueryElement item in Items)
+				{
+					sb.Append('\t');
+					item.ToString(sb, dic);
+					sb.Append(", ");
+				}
+
+				sb.Length -= 2;
+
+				return sb;
+			}
+
+			#endregion
+		}
+
+		private OrderByClause _orderBy;
+		public  OrderByClause  OrderBy
+		{
+			get { return _orderBy; }
+		}
+
+		#endregion
+
+		#region Union
+
+		public class Union : IQueryElement
+		{
+			public Union()
+			{
+			}
+
+			public Union(SqlQuery sqlQuery, bool isAll)
+			{
+				SqlQuery = sqlQuery;
+				IsAll    = isAll;
+			}
+
+			public SqlQuery SqlQuery { get; private set; }
+			public bool IsAll { get; private set; }
+
+			public QueryElementType ElementType
+			{
+				get { return QueryElementType.Union; }
+			}
+
+#if OVERRIDETOSTRING
+
+			public override string ToString()
+			{
+				return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+			}
+
+#endif
+
+			StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+			{
+				sb.Append(" \nUNION").Append(IsAll ? " ALL" : "").Append(" \n");
+				return ((IQueryElement)SqlQuery).ToString(sb, dic);
+			}
+		}
+
+		private List<Union> _unions;
+		public  List<Union>  Unions
+		{
+			get { return _unions ?? (_unions = new List<Union>()); }
+		}
+
+		public bool HasUnion { get { return _unions != null && _unions.Count > 0; } }
+
+		public void AddUnion(SqlQuery union, bool isAll)
+		{
+			Unions.Add(new Union(union, isAll));
+		}
+
+		#endregion
+
+		#region FinalizeAndValidate
+
+		public void FinalizeAndValidate(bool isApplySupported, bool optimizeColumns)
+		{
+#if DEBUG
+			var sqlText = SqlText;
+
+			var dic = new Dictionary<SqlQuery,SqlQuery>();
+
+			new QueryVisitor().VisitAll(this, e =>
+			{
+				var sql = e as SqlQuery;
+
+				if (sql != null)
+				{
+					if (dic.ContainsKey(sql))
+						throw new InvalidOperationException("SqlQuery circle reference detected.");
+
+					dic.Add(sql, sql);
+				}
+			});
+#endif
+
+			OptimizeUnions();
+			FinalizeAndValidateInternal(isApplySupported, optimizeColumns, true, new List<ISqlTableSource>());
+			ResolveFields();
+			SetAliases();
+
+#if DEBUG
+			sqlText = SqlText;
+#endif
+		}
+
+		class QueryData
+		{
+			public SqlQuery             Query;
+			public List<ISqlExpression> Fields  = new List<ISqlExpression>();
+			public List<QueryData>      Queries = new List<QueryData>();
+		}
+
+		void ResolveFields()
+		{
+			var root = GetQueryData();
+
+			ResolveFields(root);
+		}
+
+		QueryData GetQueryData()
+		{
+			var data = new QueryData { Query = this };
+
+			new QueryVisitor().VisitParentFirst(this, e =>
+			{
+				switch (e.ElementType)
+				{
+					case QueryElementType.SqlField :
+						{
+							var field = (SqlField)e;
+
+							if (field.Name.Length != 1 || field.Name[0] != '*')
+								data.Fields.Add(field);
+
+							break;
+						}
+
+					case QueryElementType.SqlQuery :
+						{
+							if (e != this)
+							{
+								data.Queries.Add(((SqlQuery)e).GetQueryData());
+								return false;
+							}
+
+							break;
+						}
+
+					case QueryElementType.Column :
+						return ((Column)e).Parent == this;
+
+					case QueryElementType.SqlTable :
+						return false;
+				}
+
+				return true;
+			});
+
+			return data;
+		}
+
+		static TableSource FindField(SqlField field, TableSource table)
+		{
+			if (field.Table == table.Source)
+				return table;
+
+			foreach (var @join in table.Joins)
+			{
+				var t = FindField(field, @join.Table);
+
+				if (t != null)
+					return @join.Table;
+			}
+
+			return null;
+		}
+
+		static ISqlExpression GetColumn(QueryData data, SqlField field)
+		{
+			foreach (var query in data.Queries)
+			{
+				var q = query.Query;
+
+				foreach (var table in q.From.Tables)
+				{
+					var t = FindField(field, table);
+
+					if (t != null)
+					{
+						var n   = q.Select.Columns.Count;
+						var idx = q.Select.Add(field);
+
+						if (n != q.Select.Columns.Count)
+							if (!q.GroupBy.IsEmpty || q.Select.Columns.Exists(c => IsAggregationFunction(c.Expression)))
+								q.GroupBy.Items.Add(field);
+
+						return q.Select.Columns[idx];
+					}
+				}
+			}
+
+			return null;
+		}
+
+		static void ResolveFields(QueryData data)
+		{
+			if (data.Queries.Count == 0)
+				return;
+
+			var dic = new Dictionary<ISqlExpression,ISqlExpression>();
+
+			foreach (SqlField field in data.Fields)
+			{
+				if (dic.ContainsKey(field))
+					continue;
+
+				var found = false;
+
+				foreach (var table in data.Query.From.Tables)
+				{
+					found = FindField(field, table) != null;
+
+					if (found)
+						break;
+				}
+
+				if (!found)
+				{
+					var expr = GetColumn(data, field);
+
+					if (expr != null)
+						dic.Add(field, expr);
+				}
+			}
+
+			if (dic.Count > 0)
+				new QueryVisitor().VisitParentFirst(data.Query, e =>
+				{
+					ISqlExpression ex;
+
+					switch (e.ElementType)
+					{
+						case QueryElementType.SqlQuery :
+							return e == data.Query;
+
+						case QueryElementType.SqlFunction :
+							{
+								var parms = ((SqlFunction)e).Parameters;
+
+								for (var i = 0; i < parms.Length; i++)
+									if (dic.TryGetValue(parms[i], out ex))
+										parms[i] = ex;
+
+								break;
+							}
+
+						case QueryElementType.SqlExpression :
+							{
+								var parms = ((SqlExpression)e).Parameters;
+
+								for (var i = 0; i < parms.Length; i++)
+									if (dic.TryGetValue(parms[i], out ex))
+										parms[i] = ex;
+
+								break;
+							}
+
+						case QueryElementType.SqlBinaryExpression :
+							{
+								var expr = (SqlBinaryExpression)e;
+								if (dic.TryGetValue(expr.Expr1, out ex)) expr.Expr1 = ex;
+								if (dic.TryGetValue(expr.Expr2, out ex)) expr.Expr2 = ex;
+								break;
+							}
+
+						case QueryElementType.ExprPredicate       :
+						case QueryElementType.NotExprPredicate    :
+						case QueryElementType.IsNullPredicate     :
+						case QueryElementType.InSubQueryPredicate :
+							{
+								var expr = (Predicate.Expr)e;
+								if (dic.TryGetValue(expr.Expr1, out ex)) expr.Expr1 = ex;
+								break;
+							}
+
+						case QueryElementType.ExprExprPredicate :
+							{
+								var expr = (Predicate.ExprExpr)e;
+								if (dic.TryGetValue(expr.Expr1, out ex)) expr.Expr1 = ex;
+								if (dic.TryGetValue(expr.Expr2, out ex)) expr.Expr2 = ex;
+								break;
+							}
+
+						case QueryElementType.LikePredicate :
+							{
+								var expr = (Predicate.Like)e;
+								if (dic.TryGetValue(expr.Expr1,  out ex)) expr.Expr1  = ex;
+								if (dic.TryGetValue(expr.Expr2,  out ex)) expr.Expr2  = ex;
+								if (dic.TryGetValue(expr.Escape, out ex)) expr.Escape = ex;
+								break;
+							}
+
+						case QueryElementType.BetweenPredicate :
+							{
+								var expr = (Predicate.Between)e;
+								if (dic.TryGetValue(expr.Expr1, out ex)) expr.Expr1 = ex;
+								if (dic.TryGetValue(expr.Expr2, out ex)) expr.Expr2 = ex;
+								if (dic.TryGetValue(expr.Expr3, out ex)) expr.Expr3 = ex;
+								break;
+							}
+
+						case QueryElementType.InListPredicate :
+							{
+								var expr = (Predicate.InList)e;
+
+								if (dic.TryGetValue(expr.Expr1, out ex)) expr.Expr1 = ex;
+
+								for (var i = 0; i < expr.Values.Count; i++)
+									if (dic.TryGetValue(expr.Values[i], out ex))
+										expr.Values[i] = ex;
+
+								break;
+							}
+
+						case QueryElementType.Column :
+							{
+								var expr = (Column)e;
+
+								if (expr.Parent != data.Query)
+									return false;
+
+								if (dic.TryGetValue(expr.Expression, out ex)) expr.Expression = ex;
+
+								break;
+							}
+
+						case QueryElementType.SetExpression :
+							{
+								var expr = (SetExpression)e;
+								if (dic.TryGetValue(expr.Expression, out ex)) expr.Expression = ex;
+								break;
+							}
+
+						case QueryElementType.GroupByClause :
+							{
+								var expr = (GroupByClause)e;
+
+								for (var i = 0; i < expr.Items.Count; i++)
+									if (dic.TryGetValue(expr.Items[i], out ex))
+										expr.Items[i] = ex;
+
+								break;
+							}
+
+						case QueryElementType.OrderByItem :
+							{
+								var expr = (OrderByItem)e;
+								if (dic.TryGetValue(expr.Expression, out ex)) expr.Expression = ex;
+								break;
+							}
+					}
+
+					return true;
+				});
+
+			foreach (var query in data.Queries)
+				if (query.Queries.Count > 0)
+					ResolveFields(query);
+		}
+
+		void OptimizeUnions()
+		{
+			var exprs = new Dictionary<ISqlExpression,ISqlExpression>();
+
+			new QueryVisitor().Visit(this, e =>
+			{
+				var sql = e as SqlQuery;
+
+				if (sql == null || sql.From.Tables.Count != 1 || !sql.IsSimple || sql._insert != null || sql._update != null || sql._delete != null)
+					return;
+
+				var table = sql.From.Tables[0];
+
+				if (table.Joins.Count != 0 || !(table.Source is SqlQuery))
+					return;
+
+				var union = (SqlQuery)table.Source;
+
+				if (!union.HasUnion)
+					return;
+
+				for (var i = 0; i < sql.Select.Columns.Count; i++)
+				{
+					var scol = sql.  Select.Columns[i];
+					var ucol = union.Select.Columns[i];
+
+					if (scol.Expression != ucol)
+						return;
+				}
+
+				exprs.Add(union, sql);
+
+				for (var i = 0; i < sql.Select.Columns.Count; i++)
+				{
+					var scol = sql.  Select.Columns[i];
+					var ucol = union.Select.Columns[i];
+
+					scol.Expression = ucol.Expression;
+					scol._alias     = ucol._alias;
+
+					exprs.Add(ucol, scol);
+				}
+
+				for (var i = sql.Select.Columns.Count; i < union.Select.Columns.Count; i++)
+					sql.Select.Expr(union.Select.Columns[i].Expression);
+
+				sql.From.Tables.Clear();
+				sql.From.Tables.AddRange(union.From.Tables);
+
+				sql.Where.  SearchCondition.Conditions.AddRange(union.Where. SearchCondition.Conditions);
+				sql.Having. SearchCondition.Conditions.AddRange(union.Having.SearchCondition.Conditions);
+				sql.GroupBy.Items.                     AddRange(union.GroupBy.Items);
+				sql.OrderBy.Items.                     AddRange(union.OrderBy.Items);
+				sql.Unions.InsertRange(0, union.Unions);
+			});
+
+			((ISqlExpressionWalkable)this).Walk(false, expr =>
+			{
+				ISqlExpression e;
+
+				if (exprs.TryGetValue(expr, out e))
+					return e;
+
+				return expr;
+			});
+		}
+
+		void FinalizeAndValidateInternal(bool isApplySupported, bool optimizeColumns, bool optimizeSearchCondition, List<ISqlTableSource> tables)
+		{
+			OptimizeSearchCondition(Where. SearchCondition);
+			OptimizeSearchCondition(Having.SearchCondition);
+
+			if (optimizeSearchCondition)
+			{
+				ForEachTable(table =>
+				{
+					foreach (var join in table.Joins)
+						OptimizeSearchCondition(join.Condition);
+				}, new HashSet<SqlQuery>());
+			}
+
+			new QueryVisitor().Visit(this, e =>
+			{
+				var sql = e as SqlQuery;
+
+				if (sql != null && sql != this)
+				{
+					sql.ParentSql = this;
+					sql.FinalizeAndValidateInternal(isApplySupported, optimizeColumns, false, tables);
+
+					if (sql.IsParameterDependent)
+						IsParameterDependent = true;
+				}
+			});
+
+			ResolveWeakJoins(tables);
+			OptimizeColumns();
+			OptimizeApplies   (isApplySupported, optimizeColumns);
+			OptimizeSubQueries(isApplySupported, optimizeColumns);
+			OptimizeApplies   (isApplySupported, optimizeColumns);
+
+			new QueryVisitor().Visit(this, e =>
+			{
+				var sql = e as SqlQuery;
+
+				if (sql != null && sql != this)
+					sql.RemoveOrderBy();
+			});
+		}
+
+		internal static void OptimizeSearchCondition(SearchCondition searchCondition)
+		{
+			// This 'if' could be replaced by one simple match:
+			//
+			// match (searchCondition.Conditions)
+			// {
+			// | [SearchCondition(true, _) sc] =>
+			//     searchCondition.Conditions = sc.Conditions;
+			//     OptimizeSearchCondition(searchCodition)
+			//
+			// | [SearchCondition(false, [SearchCondition(true, [ExprExpr]) sc])] => ...
+			//
+			// | [Expr(true,  SqlValue(true))]
+			// | [Expr(false, SqlValue(false))]
+			//     searchCondition.Conditions = []
+			// }
+			//
+			// One day I am going to rewrite all this crap in Nemerle.
+			//
+			if (searchCondition.Conditions.Count == 1)
+			{
+				var cond = searchCondition.Conditions[0];
+
+				if (cond.Predicate is SearchCondition)
+				{
+					var sc = (SearchCondition)cond.Predicate;
+
+					if (!cond.IsNot)
+					{
+						searchCondition.Conditions.Clear();
+						searchCondition.Conditions.AddRange(sc.Conditions);
+
+						OptimizeSearchCondition(searchCondition);
+						return;
+					}
+
+					if (sc.Conditions.Count == 1)
+					{
+						var c1 = sc.Conditions[0];
+
+						if (!c1.IsNot && c1.Predicate is Predicate.ExprExpr)
+						{
+							var ee = (Predicate.ExprExpr)c1.Predicate;
+							Predicate.Operator op;
+
+							switch (ee.Operator)
+							{
+								case Predicate.Operator.Equal          : op = Predicate.Operator.NotEqual;       break;
+								case Predicate.Operator.NotEqual       : op = Predicate.Operator.Equal;          break;
+								case Predicate.Operator.Greater        : op = Predicate.Operator.LessOrEqual;    break;
+								case Predicate.Operator.NotLess        :
+								case Predicate.Operator.GreaterOrEqual : op = Predicate.Operator.Less;           break;
+								case Predicate.Operator.Less           : op = Predicate.Operator.GreaterOrEqual; break;
+								case Predicate.Operator.NotGreater     :
+								case Predicate.Operator.LessOrEqual    : op = Predicate.Operator.Greater;        break;
+								default: throw new InvalidOperationException();
+							}
+
+							c1.Predicate = new Predicate.ExprExpr(ee.Expr1, op, ee.Expr2);
+
+							searchCondition.Conditions.Clear();
+							searchCondition.Conditions.AddRange(sc.Conditions);
+
+							OptimizeSearchCondition(searchCondition);
+							return;
+						}
+					}
+				}
+
+				if (cond.Predicate.ElementType == QueryElementType.ExprPredicate)
+				{
+					var expr = (Predicate.Expr)cond.Predicate;
+
+					if (expr.Expr1 is SqlValue)
+					{
+						var value = (SqlValue)expr.Expr1;
+
+						if (value.Value is bool)
+							if (cond.IsNot ? !(bool)value.Value : (bool)value.Value)
+								searchCondition.Conditions.Clear();
+					}
+				}
+			}
+
+			for (var i = 0; i < searchCondition.Conditions.Count; i++)
+			{
+				var cond = searchCondition.Conditions[i];
+
+				if (cond.Predicate is Predicate.Expr)
+				{
+					var expr = (Predicate.Expr)cond.Predicate;
+
+					if (expr.Expr1 is SqlValue)
+					{
+						var value = (SqlValue)expr.Expr1;
+
+						if (value.Value is bool)
+						{
+							if (cond.IsNot ? !(bool)value.Value : (bool)value.Value)
+							{
+								if (i > 0)
+								{
+									if (searchCondition.Conditions[i-1].IsOr)
+									{
+										searchCondition.Conditions.RemoveRange(0, i);
+										OptimizeSearchCondition(searchCondition);
+
+										break;
+									}
+								}
+							}
+						}
+					}
+				}
+				else if (cond.Predicate is SearchCondition)
+				{
+					var sc = (SearchCondition)cond.Predicate;
+					OptimizeSearchCondition(sc);
+				}
+			}
+		}
+
+		void ForEachTable(Action<TableSource> action, HashSet<SqlQuery> visitedQueries)
+		{
+			if (!visitedQueries.Add(this))
+				return;
+
+			foreach (var table in From.Tables)
+				table.ForEach(action, visitedQueries);
+
+			new QueryVisitor().Visit(this, e =>
+			{
+				if (e is SqlQuery && e != this)
+					((SqlQuery)e).ForEachTable(action, visitedQueries);
+			});
+		}
+
+		void RemoveOrderBy()
+		{
+			if (OrderBy.Items.Count > 0 && Select.SkipValue == null && Select.TakeValue == null)
+				OrderBy.Items.Clear();
+		}
+
+		internal void ResolveWeakJoins(List<ISqlTableSource> tables)
+		{
+			Func<TableSource,bool> findTable = null; findTable = table =>
+			{
+				if (tables.Contains(table.Source))
+					return true;
+
+				foreach (var join in table.Joins)
+				{
+					if (findTable(join.Table))
+					{
+						join.IsWeak = false;
+						return true;
+					}
+				}
+
+				if (table.Source is SqlQuery)
+					foreach (var t in ((SqlQuery)table.Source).From.Tables)
+						if (findTable(t))
+							return true;
+
+				return false;
+			};
+
+			var areTablesCollected = false;
+
+			ForEachTable(table =>
+			{
+				for (var i = 0; i < table.Joins.Count; i++)
+				{
+					var join = table.Joins[i];
+
+					if (join.IsWeak)
+					{
+						if (!areTablesCollected)
+						{
+							areTablesCollected = true;
+
+							Action<IQueryElement> tableCollector = expr =>
+							{
+								var field = expr as SqlField;
+
+								if (field != null && !tables.Contains(field.Table))
+									tables.Add(field.Table);
+							};
+
+							var visitor = new QueryVisitor();
+
+							visitor.VisitAll(Select,  tableCollector);
+							visitor.VisitAll(Where,   tableCollector);
+							visitor.VisitAll(GroupBy, tableCollector);
+							visitor.VisitAll(Having,  tableCollector);
+							visitor.VisitAll(OrderBy, tableCollector);
+
+							if (_insert != null)
+								visitor.VisitAll(Insert, tableCollector);
+
+							if (_update != null)
+								visitor.VisitAll(Update, tableCollector);
+
+							if (_delete != null)
+								visitor.VisitAll(Delete, tableCollector);
+
+							visitor.VisitAll(From, expr =>
+							{
+								var tbl = expr as SqlTable;
+
+								if (tbl != null && tbl.TableArguments != null)
+								{
+									var v = new QueryVisitor();
+
+									foreach (var arg in tbl.TableArguments)
+										v.VisitAll(arg, tableCollector);
+								}
+							});
+						}
+
+						if (findTable(join.Table))
+						{
+							join.IsWeak = false;
+						}
+						else
+						{
+							table.Joins.RemoveAt(i);
+							i--;
+						}
+					}
+				}
+			}, new HashSet<SqlQuery>());
+		}
+
+		TableSource OptimizeSubQuery(
+			TableSource source,
+			bool        optimizeWhere,
+			bool        allColumns,
+			bool        isApplySupported,
+			bool        optimizeValues,
+			bool        optimizeColumns)
+		{
+			foreach (var jt in source.Joins)
+			{
+				var table = OptimizeSubQuery(
+					jt.Table,
+					jt.JoinType == JoinType.Inner || jt.JoinType == JoinType.CrossApply,
+					false,
+					isApplySupported,
+					jt.JoinType == JoinType.Inner || jt.JoinType == JoinType.CrossApply,
+					optimizeColumns);
+
+				if (table != jt.Table)
+				{
+					var sql = jt.Table.Source as SqlQuery;
+
+					if (sql != null && sql.OrderBy.Items.Count > 0)
+						foreach (var item in sql.OrderBy.Items)
+							OrderBy.Expr(item.Expression, item.IsDescending);
+
+					jt.Table = table;
+				}
+			}
+
+			return source.Source is SqlQuery ?
+				RemoveSubQuery(source, optimizeWhere, allColumns && !isApplySupported, optimizeValues, optimizeColumns) :
+				source;
+		}
+
+		static bool CheckColumn(Column column, ISqlExpression expr, SqlQuery query, bool optimizeValues, bool optimizeColumns)
+		{
+			if (expr is SqlField || expr is Column)
+				return false;
+
+			if (expr is SqlValue)
+				return !optimizeValues && 1.Equals(((SqlValue)expr).Value);
+
+			if (expr is SqlBinaryExpression)
+			{
+				var e = (SqlBinaryExpression)expr;
+
+				if (e.Operation == "*" && e.Expr1 is SqlValue)
+				{
+					var value = (SqlValue)e.Expr1;
+
+					if (value.Value is int && (int)value.Value == -1)
+						return CheckColumn(column, e.Expr2, query, optimizeValues, optimizeColumns);
+				}
+			}
+
+			var visitor = new QueryVisitor();
+
+			if (optimizeColumns &&
+				visitor.Find(expr, e => e is SqlQuery || IsAggregationFunction(e)) == null)
+			{
+				var n = 0;
+				var q = query.ParentSql ?? query;
+
+				visitor.VisitAll(q, e => { if (e == column) n++; });
+
+				return n > 2;
+			}
+
+			return true;
+		}
+
+		TableSource RemoveSubQuery(
+			TableSource childSource,
+			bool        concatWhere,
+			bool        allColumns,
+			bool        optimizeValues,
+			bool        optimizeColumns)
+		{
+			var query = (SqlQuery)childSource.Source;
+
+			var isQueryOK = query.From.Tables.Count == 1;
+
+			isQueryOK = isQueryOK && (concatWhere || query.Where.IsEmpty && query.Having.IsEmpty);
+			isQueryOK = isQueryOK && !query.HasUnion && query.GroupBy.IsEmpty && !query.Select.HasModifier;
+
+			if (!isQueryOK)
+				return childSource;
+
+			var isColumnsOK =
+				(allColumns && !query.Select.Columns.Exists(c => IsAggregationFunction(c.Expression))) ||
+				!query.Select.Columns.Exists(c => CheckColumn(c, c.Expression, query, optimizeValues, optimizeColumns));
+
+			if (!isColumnsOK)
+				return childSource;
+
+			var map = new Dictionary<ISqlExpression,ISqlExpression>(query.Select.Columns.Count);
+
+			foreach (var c in query.Select.Columns)
+				map.Add(c, c.Expression);
+
+			var top = this;
+
+			while (top.ParentSql != null)
+				top = top.ParentSql;
+
+			((ISqlExpressionWalkable)top).Walk(false, expr =>
+			{
+				ISqlExpression fld;
+				return map.TryGetValue(expr, out fld) ? fld : expr;
+			});
+
+			new QueryVisitor().Visit(top, expr =>
+			{
+				if (expr.ElementType == QueryElementType.InListPredicate)
+				{
+					var p = (Predicate.InList)expr;
+
+					if (p.Expr1 == query)
+						p.Expr1 = query.From.Tables[0];
+				}
+			});
+
+			query.From.Tables[0].Joins.AddRange(childSource.Joins);
+
+			if (query.From.Tables[0].Alias == null)
+				query.From.Tables[0].Alias = childSource.Alias;
+
+			if (!query.Where. IsEmpty) ConcatSearchCondition(Where,  query.Where);
+			if (!query.Having.IsEmpty) ConcatSearchCondition(Having, query.Having);
+
+			((ISqlExpressionWalkable)top).Walk(false, expr =>
+			{
+				if (expr is SqlQuery)
+				{
+					var sql = (SqlQuery)expr;
+
+					if (sql.ParentSql == query)
+						sql.ParentSql = query.ParentSql ?? this;
+				}
+
+				return expr;
+			});
+
+			return query.From.Tables[0];
+		}
+
+		static bool IsAggregationFunction(IQueryElement expr)
+		{
+			if (expr is SqlFunction)
+				switch (((SqlFunction)expr).Name)
+				{
+					case "Count"   :
+					case "Average" :
+					case "Min"     :
+					case "Max"     :
+					case "Sum"     : return true;
+				}
+
+			return false;
+		}
+
+		void OptimizeApply(TableSource tableSource, JoinedTable joinTable, bool isApplySupported, bool optimizeColumns)
+		{
+			var joinSource = joinTable.Table;
+
+			foreach (var join in joinSource.Joins)
+				if (join.JoinType == JoinType.CrossApply || join.JoinType == JoinType.OuterApply)
+					OptimizeApply(joinSource, join, isApplySupported, optimizeColumns);
+
+			if (isApplySupported && !joinTable.CanConvertApply)
+				return;
+
+			if (joinSource.Source.ElementType == QueryElementType.SqlQuery)
+			{
+				var sql   = (SqlQuery)joinSource.Source;
+				var isAgg = sql.Select.Columns.Exists(c => IsAggregationFunction(c.Expression));
+
+				if (isApplySupported && (isAgg || sql.Select.TakeValue != null || sql.Select.SkipValue != null))
+					return;
+
+				var searchCondition = new List<Condition>(sql.Where.SearchCondition.Conditions);
+
+				sql.Where.SearchCondition.Conditions.Clear();
+
+				if (!ContainsTable(tableSource.Source, sql))
+				{
+					joinTable.JoinType = joinTable.JoinType == JoinType.CrossApply ? JoinType.Inner : JoinType.Left;
+					joinTable.Condition.Conditions.AddRange(searchCondition);
+				}
+				else
+				{
+					sql.Where.SearchCondition.Conditions.AddRange(searchCondition);
+
+					var table = OptimizeSubQuery(
+						joinTable.Table,
+						joinTable.JoinType == JoinType.Inner || joinTable.JoinType == JoinType.CrossApply,
+						joinTable.JoinType == JoinType.CrossApply,
+						isApplySupported,
+						joinTable.JoinType == JoinType.Inner || joinTable.JoinType == JoinType.CrossApply,
+						optimizeColumns);
+
+					if (table != joinTable.Table)
+					{
+						var q = joinTable.Table.Source as SqlQuery;
+
+						if (q != null && q.OrderBy.Items.Count > 0)
+							foreach (var item in q.OrderBy.Items)
+								OrderBy.Expr(item.Expression, item.IsDescending);
+
+						joinTable.Table = table;
+
+						OptimizeApply(tableSource, joinTable, isApplySupported, optimizeColumns);
+					}
+				}
+			}
+			else
+			{
+				if (!ContainsTable(tableSource.Source, joinSource.Source))
+					joinTable.JoinType = joinTable.JoinType == JoinType.CrossApply ? JoinType.Inner : JoinType.Left;
+			}
+		}
+
+		static bool ContainsTable(ISqlTableSource table, IQueryElement sql)
+		{
+			return null != new QueryVisitor().Find(sql, e =>
+				e == table ||
+				e.ElementType == QueryElementType.SqlField && table == ((SqlField)e).Table ||
+				e.ElementType == QueryElementType.Column   && table == ((Column)  e).Parent);
+		}
+
+		static void ConcatSearchCondition(WhereClause where1, WhereClause where2)
+		{
+			if (where1.IsEmpty)
+			{
+				where1.SearchCondition.Conditions.AddRange(where2.SearchCondition.Conditions);
+			}
+			else
+			{
+				if (where1.SearchCondition.Precedence < Sql.Precedence.LogicalConjunction)
+				{
+					var sc1 = new SearchCondition();
+
+					sc1.Conditions.AddRange(where1.SearchCondition.Conditions);
+
+					where1.SearchCondition.Conditions.Clear();
+					where1.SearchCondition.Conditions.Add(new Condition(false, sc1));
+				}
+
+				if (where2.SearchCondition.Precedence < Sql.Precedence.LogicalConjunction)
+				{
+					var sc2 = new SearchCondition();
+
+					sc2.Conditions.AddRange(where2.SearchCondition.Conditions);
+
+					where1.SearchCondition.Conditions.Add(new Condition(false, sc2));
+				}
+				else
+					where1.SearchCondition.Conditions.AddRange(where2.SearchCondition.Conditions);
+			}
+		}
+
+		void OptimizeSubQueries(bool isApplySupported, bool optimizeColumns)
+		{
+			for (var i = 0; i < From.Tables.Count; i++)
+			{
+				var table = OptimizeSubQuery(From.Tables[i], true, false, isApplySupported, true, optimizeColumns);
+
+				if (table != From.Tables[i])
+				{
+					var sql = From.Tables[i].Source as SqlQuery;
+
+					if (!Select.Columns.All(c => IsAggregationFunction(c.Expression)))
+						if (sql != null && sql.OrderBy.Items.Count > 0)
+							foreach (var item in sql.OrderBy.Items)
+								OrderBy.Expr(item.Expression, item.IsDescending);
+
+					From.Tables[i] = table;
+				}
+			}
+		}
+
+		void OptimizeApplies(bool isApplySupported, bool optimizeColumns)
+		{
+			foreach (var table in From.Tables)
+				foreach (var join in table.Joins)
+					if (join.JoinType == JoinType.CrossApply || join.JoinType == JoinType.OuterApply)
+						OptimizeApply(table, join, isApplySupported, optimizeColumns);
+		}
+
+		void OptimizeColumns()
+		{
+			((ISqlExpressionWalkable)Select).Walk(false, expr =>
+			{
+				var query = expr as SqlQuery;
+					
+				if (query != null && query.From.Tables.Count == 0 && query.Select.Columns.Count == 1)
+				{
+					new QueryVisitor().Visit(query.Select.Columns[0].Expression, e =>
+					{
+						if (e.ElementType == QueryElementType.SqlQuery)
+						{
+							var q = (SqlQuery)e;
+
+							if (q.ParentSql == query)
+								q.ParentSql = query.ParentSql;
+						}
+					});
+
+					return query.Select.Columns[0].Expression;
+				}
+
+				return expr;
+			});
+		}
+
+		IDictionary<string,object> _aliases;
+
+		public void RemoveAlias(string alias)
+		{
+			if (_aliases != null)
+			{
+				alias = alias.ToUpper();
+				if (_aliases.ContainsKey(alias))
+					_aliases.Remove(alias);
+			}
+		}
+
+		public string GetAlias(string desiredAlias, string defaultAlias)
+		{
+			if (_aliases == null)
+				_aliases = new Dictionary<string,object>();
+
+			var alias = desiredAlias;
+
+			if (string.IsNullOrEmpty(desiredAlias) || desiredAlias.Length > 30)
+			{
+				desiredAlias = defaultAlias;
+				alias        = defaultAlias + "1";
+			}
+
+			for (var i = 1; ; i++)
+			{
+				var s = alias.ToUpper();
+
+				if (!_aliases.ContainsKey(s) && !_reservedWords.ContainsKey(s))
+				{
+					_aliases.Add(s, s);
+					break;
+				}
+
+				alias = desiredAlias + i;
+			}
+
+			return alias;
+		}
+
+		public string[] GetTempAliases(int n, string defaultAlias)
+		{
+			var aliases = new string[n];
+
+			for (var i = 0; i < aliases.Length; i++)
+				aliases[i] = GetAlias(defaultAlias, defaultAlias);
+
+			foreach (var t in aliases)
+				RemoveAlias(t);
+
+			return aliases;
+		}
+
+		void SetAliases()
+		{
+			_aliases = null;
+
+			var objs = new Dictionary<object,object>();
+
+			Parameters.Clear();
+
+			new QueryVisitor().VisitAll(this, expr =>
+			{
+				switch (expr.ElementType)
+				{
+					case QueryElementType.SqlParameter:
+						{
+							var p = (SqlParameter)expr;
+
+							if (p.IsQueryParameter)
+							{
+								if (!objs.ContainsKey(expr))
+								{
+									objs.Add(expr, expr);
+									p.Name = GetAlias(p.Name, "p");
+								}
+
+								Parameters.Add(p);
+							}
+							else
+								IsParameterDependent = true;
+						}
+
+						break;
+
+					case QueryElementType.Column:
+						{
+							if (!objs.ContainsKey(expr))
+							{
+								objs.Add(expr, expr);
+
+								var c = (Column)expr;
+
+								if (c.Alias != "*")
+									c.Alias = GetAlias(c.Alias, "c");
+							}
+						}
+
+						break;
+
+					case QueryElementType.TableSource:
+						{
+							var table = (TableSource)expr;
+
+							if (!objs.ContainsKey(table))
+							{
+								objs.Add(table, table);
+								table.Alias = GetAlias(table.Alias, "t");
+							}
+						}
+
+						break;
+
+					case QueryElementType.SqlQuery:
+						{
+							var sql = (SqlQuery)expr;
+
+							if (sql.HasUnion)
+							{
+								for (var i = 0; i < sql.Select.Columns.Count; i++)
+								{
+									var col = sql.Select.Columns[i];
+
+									foreach (var t in sql.Unions)
+									{
+										var union = t.SqlQuery.Select;
+
+										objs.Remove(union.Columns[i].Alias);
+
+										union.Columns[i].Alias = col.Alias;
+									}
+								}
+							}
+						}
+
+						break;
+				}
+			});
+		}
+
+		#endregion
+
+		#region ProcessParameters
+
+		public SqlQuery ProcessParameters()
+		{
+			if (IsParameterDependent)
+			{
+				var query = new QueryVisitor().Convert(this, e =>
+				{
+					switch (e.ElementType)
+					{
+						case QueryElementType.SqlParameter :
+							{
+								var p = (SqlParameter)e;
+
+								if (p.Value == null)
+									return new SqlValue(null);
+							}
+
+							break;
+
+						case QueryElementType.ExprExprPredicate :
+							{
+								var ee = (Predicate.ExprExpr)e;
+								
+								if (ee.Operator == Predicate.Operator.Equal || ee.Operator == Predicate.Operator.NotEqual)
+								{
+									object value1;
+									object value2;
+
+									if (ee.Expr1 is SqlValue)
+										value1 = ((SqlValue)ee.Expr1).Value;
+									else if (ee.Expr1 is SqlParameter)
+										value1 = ((SqlParameter)ee.Expr1).Value;
+									else
+										break;
+
+									if (ee.Expr2 is SqlValue)
+										value2 = ((SqlValue)ee.Expr2).Value;
+									else if (ee.Expr2 is SqlParameter)
+										value2 = ((SqlParameter)ee.Expr2).Value;
+									else
+										break;
+
+									var value = Equals(value1, value2);
+
+									if (ee.Operator == Predicate.Operator.NotEqual)
+										value = !value;
+
+									return new Predicate.Expr(new SqlValue(value), Sql.Precedence.Comparison);
+								}
+							}
+
+							break;
+
+						case QueryElementType.InListPredicate :
+							return ConvertInListPredicate((Predicate.InList)e);
+					}
+
+					return null;
+				});
+
+				if (query != this)
+				{
+					query.Parameters.Clear();
+
+					new QueryVisitor().VisitAll(query, expr =>
+					{
+						if (expr.ElementType == QueryElementType.SqlParameter)
+						{
+							var p = (SqlParameter)expr;
+							if (p.IsQueryParameter)
+								query.Parameters.Add(p);
+						}
+					});
+				}
+
+				return query;
+			}
+
+			return this;
+		}
+
+		static Predicate ConvertInListPredicate(Predicate.InList p)
+		{
+			if (p.Values == null || p.Values.Count == 0)
+				return new Predicate.Expr(new SqlValue(p.IsNot));
+
+			if (p.Values.Count == 1 && p.Values[0] is SqlParameter)
+			{
+				var pr = (SqlParameter)p.Values[0];
+
+				if (pr.Value == null)
+					return new Predicate.Expr(new SqlValue(p.IsNot));
+
+				if (pr.Value is IEnumerable)
+				{
+					if (p.Expr1 is ISqlTableSource)
+					{
+						var items = (IEnumerable)pr.Value;
+						var table = (ISqlTableSource)p.Expr1;
+						var keys  = table.GetKeys(true);
+
+						if (keys == null || keys.Count == 0)
+							throw new SqlException("Cant create IN expression.");
+
+						if (keys.Count == 1)
+						{
+							var values = new List<ISqlExpression>();
+							var field  = GetUnderlayingField(keys[0]);
+
+							foreach (var item in items)
+							{
+								var value = field.MemberMapper.GetValue(item);
+								values.Add(new SqlValue(value));
+							}
+
+							if (values.Count == 0)
+								return new Predicate.Expr(new SqlValue(p.IsNot));
+
+							return new Predicate.InList(keys[0], p.IsNot, values);
+						}
+
+						{
+							var sc = new SearchCondition();
+
+							foreach (var item in items)
+							{
+								var itemCond = new SearchCondition();
+
+								foreach (var key in keys)
+								{
+									var field = GetUnderlayingField(key);
+									var value = field.MemberMapper.GetValue(item);
+									var cond  = value == null ?
+										new Condition(false, new Predicate.IsNull  (field, false)) :
+										new Condition(false, new Predicate.ExprExpr(field, Predicate.Operator.Equal, new SqlValue(value)));
+
+									itemCond.Conditions.Add(cond);
+								}
+
+								sc.Conditions.Add(new Condition(false, new Predicate.Expr(itemCond), true));
+							}
+
+							if (sc.Conditions.Count == 0)
+								return new Predicate.Expr(new SqlValue(p.IsNot));
+
+							if (p.IsNot)
+								return new Predicate.NotExpr(sc, true, Sql.Precedence.LogicalNegation);
+
+							return new Predicate.Expr(sc, Sql.Precedence.LogicalDisjunction);
+						}
+					}
+
+					if (p.Expr1 is SqlExpression)
+					{
+						var expr  = (SqlExpression)p.Expr1;
+
+						if (expr.Expr.Length > 1 && expr.Expr[0] == '\x1')
+						{
+							var type  = TypeHelper.GetListItemType(pr.Value);
+							var ta    = TypeAccessor.GetAccessor(type);
+							var items = (IEnumerable)pr.Value;
+							var names = expr.Expr.Substring(1).Split(',');
+
+							if (expr.Parameters.Length == 1)
+							{
+								var values = new List<ISqlExpression>();
+
+								foreach (var item in items)
+								{
+									var value = ta[names[0]].GetValue(item);
+									values.Add(new SqlValue(value));
+								}
+
+								if (values.Count == 0)
+									return new Predicate.Expr(new SqlValue(p.IsNot));
+
+								return new Predicate.InList(expr.Parameters[0], p.IsNot, values);
+							}
+
+							{
+								var sc = new SearchCondition();
+
+								foreach (var item in items)
+								{
+									var itemCond = new SearchCondition();
+
+									for (var i = 0; i < expr.Parameters.Length; i++)
+									{
+										var sql   = expr.Parameters[i];
+										var value = ta[names[i]].GetValue(item);
+										var cond  = value == null ?
+											new Condition(false, new Predicate.IsNull  (sql, false)) :
+											new Condition(false, new Predicate.ExprExpr(sql, Predicate.Operator.Equal, new SqlValue(value)));
+
+										itemCond.Conditions.Add(cond);
+									}
+
+									sc.Conditions.Add(new Condition(false, new Predicate.Expr(itemCond), true));
+								}
+
+								if (sc.Conditions.Count == 0)
+									return new Predicate.Expr(new SqlValue(p.IsNot));
+
+								if (p.IsNot)
+									return new Predicate.NotExpr(sc, true, Sql.Precedence.LogicalNegation);
+
+								return new Predicate.Expr(sc, Sql.Precedence.LogicalDisjunction);
+							}
+						}
+					}
+
+					/*
+					var itemType = items.GetType().GetItemType();
+
+					if (itemType == typeof(DateTime)  || itemType == typeof(DateTimeOffset) ||
+						itemType == typeof(DateTime?) || itemType == typeof(DateTimeOffset?))
+					{
+						var list = new List<SqlParameter>();
+
+						foreach (var item in items)
+							list.Add(new SqlParameter(itemType, "p", item, (MappingSchema)null));
+
+						return new Predicate.InList(p.Expr1, p.IsNot, list);
+					}
+					*/
+				}
+			}
+
+			return null;
+		}
+
+		static SqlField GetUnderlayingField(ISqlExpression expr)
+		{
+			switch (expr.ElementType)
+			{
+				case QueryElementType.SqlField: return (SqlField)expr;
+				case QueryElementType.Column  : return GetUnderlayingField(((Column)expr).Expression);
+			}
+
+			throw new InvalidOperationException();
+		}
+
+		#endregion
+
+		#region Clone
+
+		SqlQuery(SqlQuery clone, Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+		{
+			objectTree.Add(clone,     this);
+			objectTree.Add(clone.All, All);
+
+			SourceID = Interlocked.Increment(ref SourceIDCounter);
+
+			_queryType = clone._queryType;
+
+			if (IsInsert) _insert = (InsertClause)clone._insert.Clone(objectTree, doClone);
+			if (IsUpdate) _update = (UpdateClause)clone._update.Clone(objectTree, doClone);
+			if (IsDelete) _delete = (DeleteClause)clone._delete.Clone(objectTree, doClone);
+
+			_select  = new SelectClause (this, clone._select,  objectTree, doClone);
+			_from    = new FromClause   (this, clone._from,    objectTree, doClone);
+			_where   = new WhereClause  (this, clone._where,   objectTree, doClone);
+			_groupBy = new GroupByClause(this, clone._groupBy, objectTree, doClone);
+			_having  = new WhereClause  (this, clone._having,  objectTree, doClone);
+			_orderBy = new OrderByClause(this, clone._orderBy, objectTree, doClone);
+
+			_parameters.AddRange(clone._parameters.ConvertAll(p => (SqlParameter)p.Clone(objectTree, doClone)));
+			IsParameterDependent = clone.IsParameterDependent;
+
+			new QueryVisitor().Visit(this, expr =>
+			{
+				var sb = expr as SqlQuery;
+
+				if (sb != null && sb.ParentSql == clone)
+					sb.ParentSql = this;
+			});
+		}
+
+		public SqlQuery Clone()
+		{
+			return (SqlQuery)Clone(new Dictionary<ICloneableElement,ICloneableElement>(), _ => true);
+		}
+
+		public SqlQuery Clone(Predicate<ICloneableElement> doClone)
+		{
+			return (SqlQuery)Clone(new Dictionary<ICloneableElement,ICloneableElement>(), doClone);
+		}
+
+		#endregion
+
+		#region Helpers
+
+		public TableSource GetTableSource(ISqlTableSource table)
+		{
+			var ts = From[table];
+			return ts == null && ParentSql != null? ParentSql.GetTableSource(table) : ts;
+		}
+
+		static TableSource CheckTableSource(TableSource ts, ISqlTableSource table, string alias)
+		{
+			if (ts.Source == table && (alias == null || ts.Alias == alias))
+				return ts;
+
+			var jt = ts[table, alias];
+
+			if (jt != null)
+				return jt;
+
+			if (ts.Source is SqlQuery)
+			{
+				var s = ((SqlQuery)ts.Source).From[table, alias];
+
+				if (s != null)
+					return s;
+			}
+
+			return null;
+		}
+
+		#endregion
+
+		#region Overrides
+
+		public string SqlText { get { return ToString(); } }
+
+#if OVERRIDETOSTRING
+
+		public override string ToString()
+		{
+			return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+		}
+
+#endif
+
+		#endregion
+
+		#region ISqlExpression Members
+
+		public bool CanBeNull()
+		{
+			return true;
+		}
+
+		public bool Equals(ISqlExpression other, Func<ISqlExpression, ISqlExpression, bool> comparer)
+		{
+			return this == other;
+		}
+
+		public int Precedence
+		{
+			get { return Sql.Precedence.Unknown; }
+		}
+
+		public Type SystemType
+		{
+			get
+			{
+				if (Select.Columns.Count == 1)
+					return Select.Columns[0].SystemType;
+
+				if (From.Tables.Count == 1 && From.Tables[0].Joins.Count == 0)
+					return From.Tables[0].SystemType;
+
+				return null;
+			}
+		}
+
+		#endregion
+
+		#region ICloneableElement Members
+
+		public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+		{
+			if (!doClone(this))
+				return this;
+
+			ICloneableElement clone;
+
+			if (!objectTree.TryGetValue(this, out clone))
+				clone = new SqlQuery(this, objectTree, doClone);
+
+			return clone;
+		}
+
+		#endregion
+
+		#region ISqlExpressionWalkable Members
+
+		[Obsolete]
+		ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+		{
+			if (_insert != null) ((ISqlExpressionWalkable)_insert).Walk(skipColumns, func);
+			if (_update != null) ((ISqlExpressionWalkable)_update).Walk(skipColumns, func);
+			if (_delete != null) ((ISqlExpressionWalkable)_delete).Walk(skipColumns, func);
+
+			((ISqlExpressionWalkable)Select) .Walk(skipColumns, func);
+			((ISqlExpressionWalkable)From)   .Walk(skipColumns, func);
+			((ISqlExpressionWalkable)Where)  .Walk(skipColumns, func);
+			((ISqlExpressionWalkable)GroupBy).Walk(skipColumns, func);
+			((ISqlExpressionWalkable)Having) .Walk(skipColumns, func);
+			((ISqlExpressionWalkable)OrderBy).Walk(skipColumns, func);
+
+			if (HasUnion)
+				foreach (var union in Unions)
+					((ISqlExpressionWalkable)union.SqlQuery).Walk(skipColumns, func);
+
+			return func(this);
+		}
+
+		#endregion
+
+		#region IEquatable<ISqlExpression> Members
+
+		bool IEquatable<ISqlExpression>.Equals(ISqlExpression other)
+		{
+			return this == other;
+		}
+
+		#endregion
+
+		#region ISqlTableSource Members
+
+		public static int SourceIDCounter;
+
+		public int           SourceID     { get; private set; }
+		public SqlTableType  SqlTableType { get { return SqlTableType.Table; } }
+
+		private SqlField _all;
+		public  SqlField  All
+		{
+			get
+			{
+				if (_all == null)
+				{
+					_all = new SqlField(null, "*", "*", true, -1, null, null);
+					((IChild<ISqlTableSource>)_all).Parent = this;
+				}
+
+				return _all;
+			}
+
+			internal set
+			{
+				_all = value;
+
+				if (_all != null)
+					((IChild<ISqlTableSource>)_all).Parent = this;
+			}
+		}
+
+		List<ISqlExpression> _keys;
+
+		public IList<ISqlExpression> GetKeys(bool allIfEmpty)
+		{
+			if (_keys == null && From.Tables.Count == 1 && From.Tables[0].Joins.Count == 0)
+			{
+				_keys = new List<ISqlExpression>();
+
+				var q =
+					from key in ((ISqlTableSource)From.Tables[0]).GetKeys(allIfEmpty)
+					from col in Select.Columns
+					where col.Expression == key
+					select col as ISqlExpression;
+
+				_keys = q.ToList();
+			}
+
+			return _keys;
+		}
+
+		#endregion
+
+		#region IQueryElement Members
+
+		public QueryElementType ElementType { get { return QueryElementType.SqlQuery; } }
+
+		StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+		{
+			if (dic.ContainsKey(this))
+				return sb.Append("...");
+
+			dic.Add(this, this);
+
+			sb
+				.Append("(")
+				.Append(SourceID)
+				.Append(") ");
+
+			((IQueryElement)Select). ToString(sb, dic);
+			((IQueryElement)From).   ToString(sb, dic);
+			((IQueryElement)Where).  ToString(sb, dic);
+			((IQueryElement)GroupBy).ToString(sb, dic);
+			((IQueryElement)Having). ToString(sb, dic);
+			((IQueryElement)OrderBy).ToString(sb, dic);
+
+			if (HasUnion)
+				foreach (IQueryElement u in Unions)
+					u.ToString(sb, dic);
+
+			dic.Remove(this);
+
+			return sb;
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlTable.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,430 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading;
+
+namespace BLToolkit.Data.Sql
+{
+	using DataAccess;
+	using Mapping;
+	using Reflection.Extension;
+	using SqlProvider;
+
+	public class SqlTable : ISqlTableSource
+	{
+		#region Init
+
+		public SqlTable()
+		{
+			_sourceID = Interlocked.Increment(ref SqlQuery.SourceIDCounter);
+			_fields   = new ChildContainer<ISqlTableSource,SqlField>(this);
+		}
+
+		internal SqlTable(
+			int id, string name, string alias, string database, string owner, string physicalName, Type objectType,
+			SequenceNameAttribute[] sequenceAttributes,
+			SqlField[] fields,
+			SqlTableType sqlTableType, ISqlExpression[] tableArguments)
+		{
+			_sourceID           = id;
+			Name                = name;
+			Alias               = alias;
+			Database            = database;
+			Owner               = owner;
+			PhysicalName        = physicalName;
+			ObjectType          = objectType;
+			_sequenceAttributes = sequenceAttributes;
+
+			_fields  = new ChildContainer<ISqlTableSource,SqlField>(this);
+			_fields.AddRange(fields);
+
+			foreach (var field in fields)
+			{
+				if (field.Name == "*")
+				{
+					_all = field;
+					_fields.Remove("*");
+					((IChild<ISqlTableSource>)_all).Parent = this;
+					break;
+				}
+			}
+
+			SqlTableType   = sqlTableType;
+			TableArguments = tableArguments;
+		}
+
+		#endregion
+
+		#region Init from type
+
+		public SqlTable([JetBrains.Annotations.NotNull] MappingSchema mappingSchema, Type objectType) : this()
+		{
+			if (mappingSchema == null) throw new ArgumentNullException("mappingSchema");
+
+			bool isSet;
+			Database     = mappingSchema.MetadataProvider.GetDatabaseName(objectType, mappingSchema.Extensions, out isSet);
+			Owner        = mappingSchema.MetadataProvider.GetOwnerName   (objectType, mappingSchema.Extensions, out isSet);
+			Name         = mappingSchema.MetadataProvider.GetTableName   (objectType, mappingSchema.Extensions, out isSet);
+			ObjectType   = objectType;
+			PhysicalName = Name;
+
+			var typeExt = TypeExtension.GetTypeExtension(objectType, mappingSchema.Extensions);
+
+			foreach (MemberMapper mm in mappingSchema.GetObjectMapper(objectType))
+				if (mm.MapMemberInfo.SqlIgnore == false)
+				{
+					var ua =
+						mappingSchema.MetadataProvider.GetNonUpdatableAttribute(objectType, typeExt, mm.MapMemberInfo.MemberAccessor, out isSet);
+
+					var order = mappingSchema.MetadataProvider.GetPrimaryKeyOrder(objectType, typeExt, mm.MapMemberInfo.MemberAccessor, out isSet);
+
+					Fields.Add(new SqlField(
+						mm.Type,
+						mm.MemberName,
+						mm.Name,
+						mm.MapMemberInfo.Nullable,
+						isSet ? order : int.MinValue,
+						ua,
+						mm));
+				}
+
+			var identityField = GetIdentityField();
+
+			if (identityField != null)
+			{
+				var om = mappingSchema.GetObjectMapper(ObjectType);
+				var mm = om[identityField.Name, true];
+
+				_sequenceAttributes = mm.MapMemberInfo.MemberAccessor.GetAttributes<SequenceNameAttribute>();
+			}
+		}
+
+		public SqlTable(Type objectType)
+			: this(Map.DefaultSchema, objectType)
+		{
+		}
+
+		#endregion
+
+		#region Init from Table
+
+		public SqlTable(SqlTable table) : this()
+		{
+			Alias               = table.Alias;
+			Database            = table.Database;
+			Owner               = table.Owner;
+			Name                = table.Name;
+			PhysicalName        = table.PhysicalName;
+			ObjectType          = table.ObjectType;
+			_sequenceAttributes = table._sequenceAttributes;
+
+			foreach (var field in table.Fields.Values)
+				Fields.Add(new SqlField(field));
+
+			foreach (var join in table.Joins)
+				Joins.Add(join.Clone());
+
+			SqlTableType   = table.SqlTableType;
+			TableArguments = table.TableArguments;
+		}
+
+		public SqlTable(SqlTable table, IEnumerable<SqlField> fields, IEnumerable<Join> joins, ISqlExpression[] tableArguments) : this()
+		{
+			Alias               = table.Alias;
+			Database            = table.Database;
+			Owner               = table.Owner;
+			Name                = table.Name;
+			PhysicalName        = table.PhysicalName;
+			ObjectType          = table.ObjectType;
+			_sequenceAttributes = table._sequenceAttributes;
+
+			Fields.AddRange(fields);
+			Joins. AddRange(joins);
+
+			SqlTableType   = table.SqlTableType;
+			TableArguments = tableArguments;
+		}
+
+		#endregion
+
+		#region Init from XML
+
+		public SqlTable(ExtensionList extensions, string name)
+			: this(Map.DefaultSchema, extensions, name)
+		{
+		}
+
+		public SqlTable([JetBrains.Annotations.NotNull] MappingSchema mappingSchema, ExtensionList extensions, string name) : this()
+		{
+			if (mappingSchema == null) throw new ArgumentNullException("mappingSchema");
+			if (extensions    == null) throw new ArgumentNullException("extensions");
+			if (name          == null) throw new ArgumentNullException("name");
+
+			var te = extensions[name];
+
+			if (te == TypeExtension.Null)
+				throw new ArgumentException(string.Format("Table '{0}' not found.", name));
+
+			Name         = te.Name;
+			Alias        = (string)te.Attributes["Alias"].       Value;
+			Database     = (string)te.Attributes["Database"].    Value;
+			Owner        = (string)te.Attributes["Owner"].       Value;
+			PhysicalName = (string)te.Attributes["PhysicalName"].Value ?? te.Name;
+
+			foreach (var me in te.Members.Values)
+				Fields.Add(new SqlField(
+					(Type)me["Type"].Value,
+					me.Name,
+					(string)me["MapField"].Value ?? (string)me["PhysicalName"].Value,
+					(bool?)me["Nullable"].Value ?? false,
+					-1,
+					(bool?)me["Identity"].Value == true ? new IdentityAttribute() : null,
+					null));
+
+			foreach (var ae in te.Attributes["Join"])
+				Joins.Add(new Join(ae));
+
+			var baseExtension = (string)te.Attributes["BaseExtension"].Value;
+
+			if (!string.IsNullOrEmpty(baseExtension))
+				InitFromBase(new SqlTable(mappingSchema, extensions, baseExtension));
+
+			var baseTypeName = (string)te.Attributes["BaseType"].Value;
+
+			if (!string.IsNullOrEmpty(baseTypeName))
+				InitFromBase(new SqlTable(mappingSchema, Type.GetType(baseTypeName, true, true)));
+		}
+
+		void InitFromBase(SqlTable baseTable)
+		{
+			if (Alias        == null) Alias        = baseTable.Alias;
+			if (Database     == null) Database     = baseTable.Database;
+			if (Owner        == null) Owner        = baseTable.Owner;
+			if (PhysicalName == null) PhysicalName = baseTable.PhysicalName;
+
+			foreach (var field in baseTable.Fields.Values)
+				if (!Fields.ContainsKey(field.Name))
+					Fields.Add(new SqlField(field));
+
+			foreach (var join in baseTable.Joins)
+				if (Joins.FirstOrDefault(j => j.TableName == join.TableName) == null)
+					Joins.Add(join);
+		}
+
+		#endregion
+
+		#region Overrides
+
+#if OVERRIDETOSTRING
+
+		public override string ToString()
+		{
+			return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+		}
+
+#endif
+
+		#endregion
+
+		#region Public Members
+
+		public SqlField this[string fieldName]
+		{
+			get
+			{
+				SqlField field;
+				Fields.TryGetValue(fieldName, out field);
+				return field;
+			}
+		}
+
+		public string Name         { get; set; }
+		public string Alias        { get; set; }
+		public string Database     { get; set; }
+		public string Owner        { get; set; }
+		public Type   ObjectType   { get; set; }
+		public string PhysicalName { get; set; }
+
+		private SqlTableType _sqlTableType = SqlTableType.Table;
+		public  SqlTableType  SqlTableType { get { return _sqlTableType; } set { _sqlTableType = value; } }
+
+		public ISqlExpression[] TableArguments { get; set; }
+
+		readonly ChildContainer<ISqlTableSource,SqlField> _fields;
+		public   ChildContainer<ISqlTableSource,SqlField>  Fields { get { return _fields; } }
+
+		readonly List<Join> _joins = new List<Join>();
+		public   List<Join>  Joins { get { return _joins; } }
+
+		private SequenceNameAttribute[] _sequenceAttributes;
+		public  SequenceNameAttribute[]  SequenceAttributes
+		{
+			get { return _sequenceAttributes; }
+		}
+
+		private SqlField _all;
+		public  SqlField  All
+		{
+			get
+			{
+				if (_all == null)
+				{
+					_all = new SqlField(null, "*", "*", true, -1, null, null);
+					((IChild<ISqlTableSource>)_all).Parent = this;
+				}
+
+				return _all;
+			}
+		}
+
+		public SqlField GetIdentityField()
+		{
+			foreach (var field in Fields)
+				if (field.Value.IsIdentity)
+					return field.Value;
+
+			var keys = GetKeys(true);
+
+			if (keys != null && keys.Count == 1)
+				return (SqlField)keys[0];
+
+			return null;
+		}
+
+		#endregion
+
+		#region ISqlTableSource Members
+
+		readonly int _sourceID;
+		public   int  SourceID { get { return _sourceID; } }
+
+		List<ISqlExpression> _keyFields;
+
+		public IList<ISqlExpression> GetKeys(bool allIfEmpty)
+		{
+			if (_keyFields == null)
+			{
+				_keyFields = (
+					from f in Fields.Values
+					where   f.IsPrimaryKey
+					orderby f.PrimaryKeyOrder
+					select f as ISqlExpression
+				).ToList();
+			}
+
+			if (_keyFields.Count == 0 && allIfEmpty)
+				return Fields.Values.Select(f => f as ISqlExpression).ToList();
+
+			return _keyFields;
+		}
+
+		#endregion
+
+		#region ICloneableElement Members
+
+		public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+		{
+			if (!doClone(this))
+				return this;
+
+			ICloneableElement clone;
+
+			if (!objectTree.TryGetValue(this, out clone))
+			{
+				var table = new SqlTable
+				{
+					Name                = Name,
+					Alias               = Alias,
+					Database            = Database,
+					Owner               = Owner,
+					PhysicalName        = PhysicalName,
+					ObjectType          = ObjectType,
+					SqlTableType        = SqlTableType,
+					_sequenceAttributes = _sequenceAttributes,
+				};
+
+				table._fields.Clear();
+
+				foreach (var field in _fields)
+				{
+					var fc = new SqlField(field.Value);
+
+					objectTree.   Add(field.Value, fc);
+					table._fields.Add(field.Key,   fc);
+				}
+
+				table._joins.AddRange(_joins.ConvertAll(j => j.Clone()));
+
+				if (TableArguments != null)
+					TableArguments = TableArguments.Select(e => (ISqlExpression)e.Clone(objectTree, doClone)).ToArray();
+
+				objectTree.Add(this, table);
+				objectTree.Add(All,  table.All);
+
+				clone = table;
+			}
+
+			return clone;
+		}
+
+		#endregion
+
+		#region IQueryElement Members
+
+		public QueryElementType ElementType { get { return QueryElementType.SqlTable; } }
+
+		StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+		{
+			return sb.Append(Name);
+		}
+
+		#endregion
+
+		#region ISqlExpression Members
+
+		bool ISqlExpression.CanBeNull()
+		{
+			return true;
+		}
+
+		public bool Equals(ISqlExpression other, Func<ISqlExpression, ISqlExpression, bool> comparer)
+		{
+			return this == other;
+		}
+
+		int ISqlExpression.Precedence
+		{
+			get { return Precedence.Unknown; }
+		}
+
+		Type ISqlExpression.SystemType
+		{
+			get { return ObjectType; }
+		}
+
+		#endregion
+
+		#region IEquatable<ISqlExpression> Members
+
+		bool IEquatable<ISqlExpression>.Equals(ISqlExpression other)
+		{
+			return this == other;
+		}
+
+		#endregion
+
+		#region ISqlExpressionWalkable Members
+
+		ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+		{
+			if (TableArguments != null)
+				for (var i = 0; i < TableArguments.Length; i++)
+					TableArguments[i] = TableArguments[i].Walk(skipColumns, func);
+
+			return func(this);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlTableT.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,19 @@
+using System;
+
+using BLToolkit.Mapping;
+
+namespace BLToolkit.Data.Sql
+{
+	public class SqlTable<T> : SqlTable
+	{
+		public SqlTable()
+			: base(typeof(T))
+		{
+		}
+
+		public SqlTable(MappingSchema mappingSchema)
+			: base(mappingSchema, typeof(T))
+		{
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlTableType.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,11 @@
+using System;
+
+namespace BLToolkit.Data.Sql
+{
+	public enum SqlTableType
+	{
+		Table,
+		Function,
+		Expression
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlValue.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,138 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace BLToolkit.Data.Sql
+{
+    public class SqlValue : SqlValueBase, ISqlExpression
+	{
+		public SqlValue(Type systemType, object value)
+		{
+			_systemType = systemType;
+			_value = value;
+		}
+
+		public SqlValue(object value)
+		{
+			_value = value;
+
+			if (value != null)
+				_systemType = value.GetType();
+		}
+
+		public override object Value
+		{
+			get
+			{
+				var rv = base.Value;
+
+				if (rv != null && rv.GetType() != _systemType)
+				{
+					_systemType = rv.GetType();
+				}
+
+				return rv;
+			}
+		}
+
+		Type _systemType; public Type    SystemType { get { return _systemType; } }
+
+		#region Overrides
+
+#if OVERRIDETOSTRING
+
+		public override string ToString()
+		{
+			return ((IQueryElement)this).ToString(new StringBuilder(), new Dictionary<IQueryElement,IQueryElement>()).ToString();
+		}
+
+#endif
+
+		#endregion
+
+		#region ISqlExpression Members
+
+		public int Precedence
+		{
+			get { return Sql.Precedence.Primary; }
+		}
+
+		#endregion
+
+		#region ISqlExpressionWalkable Members
+
+		ISqlExpression ISqlExpressionWalkable.Walk(bool skipColumns, Func<ISqlExpression,ISqlExpression> func)
+		{
+			return func(this);
+		}
+
+		#endregion
+
+		#region IEquatable<ISqlExpression> Members
+
+		bool IEquatable<ISqlExpression>.Equals(ISqlExpression other)
+		{
+			if (this == other)
+				return true;
+
+			var value = other as SqlValue;
+			return
+				value       != null              &&
+				_systemType == value._systemType &&
+				(_value == null && value._value == null || _value != null && _value.Equals(value._value));
+		}
+
+		#endregion
+
+		#region ISqlExpression Members
+
+		public bool CanBeNull()
+		{
+			return Value == null;
+		}
+
+		public bool Equals(ISqlExpression other, Func<ISqlExpression, ISqlExpression, bool> comparer)
+		{
+			return ((ISqlExpression)this).Equals(other) && comparer(this, other);
+		}
+
+		#endregion
+
+		#region ICloneableElement Members
+
+		public ICloneableElement Clone(Dictionary<ICloneableElement, ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
+		{
+			if (!doClone(this))
+				return this;
+
+			ICloneableElement clone;
+
+			if (!objectTree.TryGetValue(this, out clone))
+				objectTree.Add(this, clone = new SqlValue(_systemType, _value));
+
+			return clone;
+		}
+
+		#endregion
+
+		#region IQueryElement Members
+
+		public QueryElementType ElementType { get { return QueryElementType.SqlValue; } }
+
+		StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
+		{
+			return
+				Value == null ?
+					sb.Append("NULL") :
+				Value is string ?
+					sb
+						.Append('\'')
+						.Append(Value.ToString().Replace("\'", "''"))
+						.Append('\'')
+				:
+					sb.Append(Value);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Data/Sql/SqlValueBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,179 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Data.Sql
+{
+	public abstract class SqlValueBase: IValueContainer
+	{
+		[CLSCompliant(false)]
+		protected      object _value;
+		public virtual object  Value
+		{
+			get
+			{
+				var valueConverter = ValueConverter;
+				return valueConverter == null ? _value : valueConverter(_value);
+			}
+
+			set { _value = value; }
+		}
+
+		#region Value Converter
+
+		internal List<Type> EnumTypes;
+		internal List<int>  TakeValues;
+		internal string     LikeStart, LikeEnd;
+
+		private Converter<object,object> _valueConverter;
+		public  Converter<object,object>  ValueConverter
+		{
+			get
+			{
+				if (_valueConverter == null)
+				{
+					if (EnumTypes != null)
+						foreach (var type in EnumTypes.ToArray())
+							SetEnumConverter(type, Map.DefaultSchema);
+					else if (TakeValues != null)
+						foreach (var take in TakeValues.ToArray())
+							SetTakeConverter(take);
+					else if (LikeStart != null)
+						SetLikeConverter(LikeStart, LikeEnd);
+				}
+
+				return _valueConverter;
+			}
+
+			set { _valueConverter = value; }
+		}
+
+		bool _isEnumConverterSet;
+
+		internal void SetEnumConverter(Type type, MappingSchema ms)
+		{
+			if (!_isEnumConverterSet)
+			{
+				_isEnumConverterSet = true;
+
+				if (EnumTypes == null)
+					EnumTypes = new List<Type>();
+
+				EnumTypes.Add(type);
+
+				SetEnumConverterInternal(type, ms);
+			}
+		}
+
+		internal void SetEnumConverter(MemberAccessor ma, MappingSchema ms)
+		{
+			if (!_isEnumConverterSet)
+			{
+				_isEnumConverterSet = true;
+
+				if (EnumTypes == null)
+					EnumTypes = new List<Type>();
+
+				EnumTypes.Add(ma.Type);
+
+				SetEnumConverterInternal(ma, ms);
+			}
+		}
+
+		void SetEnumConverterInternal(MemberAccessor ma, MappingSchema ms)
+		{
+			if (_valueConverter == null)
+			{
+				_valueConverter = o => ms.MapEnumToValue(o, ma, true);
+			}
+			else
+			{
+				var converter = _valueConverter;
+				_valueConverter = o => ms.MapEnumToValue(converter(o), ma, true);
+			}
+			// update system type in SqlValue :-/
+			var tmp = Value;
+		}
+
+		void SetEnumConverterInternal(Type type, MappingSchema ms)
+		{
+			if (_valueConverter == null)
+			{
+				_valueConverter = o => ms.MapEnumToValue(o, type, true);
+			}
+			else
+			{
+				var converter = _valueConverter;
+				_valueConverter = o => ms.MapEnumToValue(converter(o), type, true);
+			}
+			// update system type in SqlValue :-/
+			var tmp = Value;
+		}
+
+		internal void SetTakeConverter(int take)
+		{
+			if (TakeValues == null)
+				TakeValues = new List<int>();
+
+			TakeValues.Add(take);
+
+			SetTakeConverterInternal(take);
+		}
+
+		void SetTakeConverterInternal(int take)
+		{
+			var conv = _valueConverter;
+
+			if (conv == null)
+				_valueConverter = v => v == null ? null : (object)((int)v + take);
+			else
+				_valueConverter = v => v == null ? null : (object)((int)conv(v) + take);
+		}
+
+		internal void SetLikeConverter(string start, string end)
+		{
+			LikeStart = start;
+			LikeEnd = end;
+			_valueConverter = GetLikeEscaper(start, end);
+		}
+
+		static Converter<object, object> GetLikeEscaper(string start, string end)
+		{
+			return value =>
+			{
+				if (value == null)
+	#if DEBUG
+					value = "";
+	#else
+					throw new SqlException("NULL cannot be used as a LIKE predicate parameter.");
+	#endif
+
+				var text = value.ToString();
+
+				if (text.IndexOfAny(new[] { '%', '_', '[' }) < 0)
+					return start + text + end;
+
+				var sb = new StringBuilder(start, text.Length + start.Length + end.Length);
+
+				foreach (var c in text)
+				{
+					if (c == '%' || c == '_' || c == '[')
+					{
+						sb.Append('[');
+						sb.Append(c);
+						sb.Append(']');
+					}
+					else
+						sb.Append(c);
+				}
+
+				return sb.ToString();
+			};
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/ActionNameAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,19 @@
+using System;
+
+namespace BLToolkit.DataAccess
+{
+	[AttributeUsage(AttributeTargets.Method)]
+	public class ActionNameAttribute : Attribute
+	{
+		public ActionNameAttribute(string name)
+		{
+			_name = name;
+		}
+
+		private readonly string _name;
+		public           string  Name
+		{
+			get { return _name; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/ActionSprocNameAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,26 @@
+using System;
+
+namespace BLToolkit.DataAccess
+{
+	[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
+	public class ActionSprocNameAttribute : Attribute
+	{
+		public ActionSprocNameAttribute(string actionName, string procedureName)
+		{
+			_actionName    = actionName;
+			_procedureName = procedureName;
+		}
+
+		private readonly string _actionName;
+		public           string  ActionName
+		{
+			get { return _actionName; }
+		}
+
+		private readonly string _procedureName;
+		public           string  ProcedureName
+		{
+			get { return _procedureName; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/ActualTypeAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,27 @@
+using System;
+
+namespace BLToolkit.DataAccess
+{
+	[JetBrains.Annotations.BaseTypeRequired(typeof(DataAccessor))]
+	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = true)]
+	public class ActualTypeAttribute : Attribute
+	{
+		public ActualTypeAttribute(Type baseType, Type actualType)
+		{
+			_baseType   = baseType;
+			_actualType = actualType;
+		}
+
+		private readonly Type _baseType;
+		public           Type  BaseType
+		{
+			get { return _baseType;  }
+		}
+
+		private readonly Type _actualType;
+		public           Type  ActualType
+		{
+			get { return _actualType;  }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/CommandBehaviorAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,26 @@
+using System;
+using System.Data;
+
+namespace BLToolkit.DataAccess
+{
+	[AttributeUsage(AttributeTargets.Method)]
+	public class CommandBehaviorAttribute : Attribute
+	{
+		public CommandBehaviorAttribute()
+		{
+			_commandBehavior = CommandBehavior.Default;
+		}
+
+		public CommandBehaviorAttribute(CommandBehavior commandBehavior)
+		{
+			_commandBehavior = commandBehavior;
+		}
+
+		private CommandBehavior _commandBehavior;
+		public  CommandBehavior  CommandBehavior
+		{
+			get { return _commandBehavior;  }
+			set { _commandBehavior = value; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/DataAccess.xsd	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xsd:schema id="DataAccess"
+	xmlns:tns="urn:schemas-bltoolkit-net:dataaccess"
+	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+	targetNamespace="urn:schemas-bltoolkit-net:dataaccess">
+
+	<xsd:attribute name="TableName"    type="xsd:string" />
+	<xsd:attribute name="PrimaryKey"   type="xsd:int" />
+	<xsd:attribute name="NonUpdatable" type="xsd:boolean" />
+</xsd:schema>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/DataAccess.xsx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--This file is auto-generated by the XML Schema Designer. It holds layout information for components on the designer surface.-->
+<XSDDesignerLayout Style="LeftRight" />
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/DataAccessException.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,83 @@
+using System;
+using System.Runtime.Serialization;
+
+namespace BLToolkit.DataAccess
+{
+	/// <summary>
+	/// Defines the base class for the namespace exceptions.
+	/// </summary>
+	/// <remarks>
+	/// This class is the base class for exceptions that may occur during
+	/// execution of the namespace members.
+	/// </remarks>
+	[Serializable]
+	public class DataAccessException : Exception
+	{
+		/// <summary>
+		/// Initializes a new instance of the <see cref="DataAccessException"/> class.
+		/// </summary>
+		/// <remarks>
+		/// This constructor initializes the <see cref="Exception.Message"/>
+		/// property of the new instance
+		/// to a system-supplied message that describes the error,
+		/// such as "BLToolkit Data Access error has occurred."
+		/// </remarks>
+		public DataAccessException()
+			: base("A Data Access exception has occurred.")
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="DataAccessException"/> class 
+		/// with the specified error message.
+		/// </summary>
+		/// <param name="message">The message to display to the client when the
+		/// exception is thrown.</param>
+		/// <seealso cref="Exception.Message"/>
+		public DataAccessException(string message)
+			: base(message)
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="DataAccessException"/> class 
+		/// with the specified error message and InnerException property.
+		/// </summary>
+		/// <param name="message">The message to display to the client when the
+		/// exception is thrown.</param>
+		/// <param name="innerException">The InnerException, if any, that threw
+		/// the current exception.</param>
+		/// <seealso cref="Exception.Message"/>
+		/// <seealso cref="Exception.InnerException"/>
+		public DataAccessException(string message, Exception innerException)
+			: base(message, innerException)
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="DataAccessException"/> class 
+		/// with the InnerException property.
+		/// </summary>
+		/// <param name="innerException">The InnerException, if any, that threw
+		/// the current exception.</param>
+		/// <seealso cref="Exception.InnerException"/>
+		public DataAccessException(Exception innerException) 
+			: base(innerException.Message, innerException) 
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="DataAccessException"/> class
+		/// with serialized data.
+		/// </summary>
+		/// <param name="info">The object that holds the serialized object data.</param>
+		/// <param name="context">The contextual information about the source or
+		/// destination.</param>
+		/// <remarks>This constructor is called during deserialization to
+		/// reconstitute the exception object transmitted over a stream.</remarks>
+		protected DataAccessException(SerializationInfo info, StreamingContext context)
+			: base(info, context)
+		{
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/DataAccessor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,711 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.SqlTypes;
+using System.Diagnostics;
+using System.IO;
+using System.Reflection;
+using System.Xml;
+#if !SILVERLIGHT
+using System.Xml.Linq;
+#endif
+
+namespace BLToolkit.DataAccess
+{
+	using Aspects;
+	using Common;
+	using Data;
+	using Data.DataProvider;
+	using Mapping;
+	using Patterns;
+	using Properties;
+	using Reflection;
+	using TypeBuilder;
+
+	[DataAccessor, DebuggerStepThrough]
+	public abstract class DataAccessor : DataAccessorBase
+	{
+		#region Constructors
+
+		protected DataAccessor()
+		{
+		}
+
+		protected DataAccessor(DbManager dbManager)
+			: base(dbManager)
+		{
+		}
+
+		protected DataAccessor(DbManager dbManager, bool dispose)
+			: base(dbManager, dispose)
+		{
+		}
+
+		#endregion
+
+		#region CreateInstance
+
+		public static DataAccessor CreateInstance(Type type)
+		{
+			return (DataAccessor)Activator.CreateInstance(TypeFactory.GetType(type));
+		}
+
+		public static DataAccessor CreateInstance(Type type, InitContext context)
+		{
+			return (DataAccessor)Activator.CreateInstance(TypeFactory.GetType(type), context);
+		}
+
+		public static DataAccessor CreateInstance(Type type, DbManager dbManager)
+		{
+			return CreateInstance(type, dbManager, false);
+		}
+
+		public static DataAccessor CreateInstance(
+			Type type,
+			InitContext context,
+			DbManager dbManager)
+		{
+			return CreateInstance(type, context, dbManager, false);
+		}
+
+		public static DataAccessor CreateInstance(Type type, DbManager dbManager, bool dispose)
+		{
+			var da = CreateInstance(type);
+
+			da.SetDbManager(dbManager, dispose);
+
+			return da;
+		}
+
+		public static DataAccessor CreateInstance(
+			Type type,
+			InitContext context,
+			DbManager dbManager,
+			bool dispose)
+		{
+			var da = CreateInstance(type, context);
+
+			da.SetDbManager(dbManager, dispose);
+
+			return da;
+		}
+
+		public static T CreateInstance<T>() where T : DataAccessor
+		{
+			return TypeFactory.CreateInstance<T>();
+		}
+
+		public static T CreateInstance<T>(DbManager dbManager)
+			where T : DataAccessor
+		{
+			return CreateInstance<T>(dbManager, false);
+		}
+
+		public static T CreateInstance<T>(DbManager dbManager, bool dispose)
+			where T : DataAccessor
+		{
+			var da = TypeFactory.CreateInstance<T>();
+
+			da.SetDbManager(dbManager, dispose);
+
+			return da;
+		}
+
+		#endregion
+
+		#region Protected Members
+
+		#region Parameters
+
+		[NoInterception]
+		protected virtual string GetQueryParameterName(DbManager db, string paramName)
+		{
+			return (string)db.DataProvider.Convert(paramName, ConvertType.NameToQueryParameter);
+		}
+
+		[NoInterception]
+		protected virtual string GetSpParameterName(DbManager db, string paramName)
+		{
+			return (string)db.DataProvider.Convert(paramName, db.GetConvertTypeToParameter());
+		}
+
+		[NoInterception]
+		protected virtual IDbDataParameter[] PrepareParameters(DbManager db, object[] parameters)
+		{
+			return db.PrepareParameters(parameters);
+		}
+
+		[NoInterception]
+		protected virtual IDbDataParameter GetParameter(DbManager db, string paramName)
+		{
+			var p = db.Parameter(paramName);
+
+			if (p == null)
+			{
+				// This usually means that the parameter name is incorrect.
+				//
+				throw new DataAccessException(string.Format(
+					Resources.DataAccessot_ParameterNotFound, paramName));
+			}
+
+			// Input parameter mapping make no sence.
+			//
+			Debug.WriteLineIf(p.Direction == ParameterDirection.Input,
+				string.Format("'{0}.{1}' is an input parameter.",
+					db.Command.CommandText, paramName));
+
+			return p;
+		}
+
+		[NoInterception]
+		protected virtual IDbDataParameter[] CreateParameters(
+			DbManager                 db,
+			object                    obj,
+			string[]                  outputParameters,
+			string[]                  inputOutputParameters,
+			string[]                  ignoreParameters,
+			params IDbDataParameter[] commandParameters)
+		{
+			return db.CreateParameters(obj, outputParameters,
+				inputOutputParameters, ignoreParameters, commandParameters);
+		}
+
+		[NoInterception]
+		protected virtual IDbDataParameter[] CreateParameters(
+			DbManager                 db,
+			DataRow                   dataRow,
+			string[]                  outputParameters,
+			string[]                  inputOutputParameters,
+			string[]                  ignoreParameters,
+			params IDbDataParameter[] commandParameters)
+		{
+			return db.CreateParameters(dataRow, outputParameters,
+				inputOutputParameters, ignoreParameters, commandParameters);
+		}
+
+		[NoInterception]
+		protected virtual string PrepareSqlQuery(DbManager db, int queryID, int uniqueID, string sqlQuery)
+		{
+			return sqlQuery;
+		}
+
+		#endregion
+
+		#region ExecuteDictionary
+
+		protected void ExecuteDictionary(
+			DbManager             db,
+			IDictionary           dictionary,
+			Type                  objectType,
+			Type                  keyType,
+			string                methodName)
+		{
+			var isIndex = TypeHelper.IsSameOrParent(typeof(CompoundValue), keyType);
+			var mms     = new SqlQuery(Extensions).GetKeyFieldList(db, objectType);
+
+			if (mms.Length == 0)
+				throw new DataAccessException(string.Format(
+					Resources.DataAccessor_UnknownIndex,
+					GetType().Name, methodName));
+
+			if (mms.Length > 1 && keyType != typeof(object) && !isIndex)
+				throw new DataAccessException(string.Format(
+					Resources.DataAccessor_InvalidKeyType,
+					GetType().Name, methodName));
+
+			if (isIndex || mms.Length > 1)
+			{
+				var fields = new string[mms.Length];
+
+				for (var i = 0; i < mms.Length; i++)
+					fields[i] = mms[i].MemberName;
+
+				db.ExecuteDictionary(dictionary, new MapIndex(fields), objectType, null);
+			}
+			else
+			{
+				db.ExecuteDictionary(dictionary, mms[0].MemberName, objectType, null);
+			}
+		}
+
+		protected void ExecuteDictionary<TValue>(
+			DbManager                          db,
+			IDictionary<CompoundValue, TValue> dictionary,
+			Type                               objectType,
+			string                             methodName)
+		{
+			var mms = new SqlQuery(Extensions).GetKeyFieldList(db, objectType);
+
+			if (mms.Length == 0)
+				throw new DataAccessException(string.Format(
+					Resources.DataAccessor_UnknownIndex,
+					GetType().Name, methodName));
+
+			var fields = new string[mms.Length];
+
+			for (var i = 0; i < mms.Length; i++)
+				fields[i] = mms[i].MemberName;
+
+			db.ExecuteDictionary(dictionary, new MapIndex(fields), objectType, null);
+		}
+
+		protected void ExecuteDictionary<TKey, TValue>(
+			DbManager                 db,
+			IDictionary<TKey, TValue> dictionary,
+			Type                      objectType,
+			string                    methodName)
+		{
+			var mms = new SqlQuery(Extensions).GetKeyFieldList(db, objectType);
+
+			if (mms.Length == 0)
+				throw new DataAccessException(string.Format(
+					Resources.DataAccessor_UnknownIndex,
+					GetType().Name, methodName));
+
+			if (mms.Length != 1)
+				throw new DataAccessException(string.Format(
+					Resources.DataAccessor_IndexIsComplex,
+					GetType().Name, methodName));
+
+			db.ExecuteDictionary(dictionary, mms[0].MemberName, objectType, null);
+		}
+
+		protected void ExecuteScalarDictionary(
+			DbManager             db,
+			IDictionary           dictionary,
+			Type                  objectType,
+			Type                  keyType,
+			string                methodName,
+			NameOrIndexParameter  scalarField,
+			Type                  elementType)
+		{
+			var isIndex = TypeHelper.IsSameOrParent(typeof(CompoundValue), keyType);
+			var mms     = new SqlQuery(Extensions).GetKeyFieldList(db, objectType);
+
+			if (mms.Length == 0)
+				throw new DataAccessException(string.Format(
+					Resources.DataAccessor_UnknownIndex,
+					GetType().Name, methodName));
+
+			if (mms.Length > 1 && keyType != typeof(object) && !isIndex)
+				throw new DataAccessException(string.Format(
+					Resources.DataAccessor_InvalidKeyType,
+					GetType().Name, methodName));
+
+			if (isIndex || mms.Length > 1)
+			{
+				var fields = new string[mms.Length];
+
+				for (var i = 0; i < mms.Length; i++)
+					fields[i] = mms[i].Name;
+
+				db.ExecuteScalarDictionary(dictionary, new MapIndex(fields), scalarField, elementType);
+			}
+			else
+			{
+				db.ExecuteScalarDictionary(
+					dictionary,
+					mms[0].Name,
+					keyType,
+					scalarField,
+					elementType);
+			}
+		}
+
+		#endregion
+
+		#region ExecuteEnumerable
+
+		protected IEnumerable<T> ExecuteEnumerable<T>(DbManager db, Type objectType, bool disposeDbManager)
+		{
+			try
+			{
+				using (var rd = db.ExecuteReader())
+				{
+					if (rd.Read())
+					{
+						var dest   = MappingSchema.GetObjectMapper(objectType);
+						var source = MappingSchema.CreateDataReaderMapper(rd);
+
+						var ctx = new InitContext
+						{
+							MappingSchema = MappingSchema,
+							ObjectMapper  = dest,
+							DataSource    = source,
+							SourceObject  = rd
+						};
+
+						var index   = MappingSchema.GetIndex(source, dest);
+						var mappers = ctx.MappingSchema.GetValueMappers(source, dest, index);
+
+						do
+						{
+							var destObject = (T)dest.CreateInstance(ctx);
+
+							if (ctx.StopMapping)
+								yield return destObject;
+
+							var smDest = destObject as ISupportMapping;
+
+							if (smDest != null)
+							{
+								smDest.BeginMapping(ctx);
+
+								if (ctx.StopMapping)
+									yield return destObject;
+							}
+
+							MappingSchema.MapInternal(source, rd, dest, destObject, index, mappers);
+
+							if (smDest != null)
+								smDest.EndMapping(ctx);
+
+							yield return destObject;
+						} while (rd.Read());
+					}
+				}
+			}
+			finally
+			{
+				if (disposeDbManager)
+					db.Dispose();
+			}
+		}
+
+		protected IEnumerable ExecuteEnumerable(DbManager db, Type objectType, bool disposeDbManager)
+		{
+			var ms = db.MappingSchema;
+
+			if (disposeDbManager)
+			{
+				using (db)
+				using (var rd = db.ExecuteReader())
+					while (rd.Read())
+						yield return ms.MapDataReaderToObject(rd, objectType);
+			}
+			else
+			{
+				using (var rd = db.ExecuteReader())
+					while (rd.Read())
+						yield return ms.MapDataReaderToObject(rd, objectType);
+			}
+		}
+
+		#endregion
+
+		#region Convert
+
+		#region Primitive Types
+
+		[CLSCompliant(false)]
+		[NoInterception]
+		protected virtual SByte ConvertToSByte(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToSByte(value);
+		}
+
+		[NoInterception]
+		protected virtual Int16 ConvertToInt16(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToInt16(value);
+		}
+
+		[NoInterception]
+		protected virtual Int32 ConvertToInt32(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToInt32(value);
+		}
+
+		[NoInterception]
+		protected virtual Int64 ConvertToInt64(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToInt64(value);
+		}
+
+		[NoInterception]
+		protected virtual Byte ConvertToByte(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToByte(value);
+		}
+
+		[CLSCompliant(false)]
+		[NoInterception]
+		protected virtual UInt16 ConvertToUInt16(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToUInt16(value);
+		}
+
+		[CLSCompliant(false)]
+		[NoInterception]
+		protected virtual UInt32 ConvertToUInt32(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToUInt32(value);
+		}
+
+		[CLSCompliant(false)]
+		[NoInterception]
+		protected virtual UInt64 ConvertToUInt64(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToUInt64(value);
+		}
+
+		[NoInterception]
+		protected virtual Char ConvertToChar(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToChar(value);
+		}
+
+		[NoInterception]
+		protected virtual Single ConvertToSingle(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToSingle(value);
+		}
+
+		[NoInterception]
+		protected virtual Double ConvertToDouble(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToDouble(value);
+		}
+
+		[NoInterception]
+		protected virtual Boolean ConvertToBoolean(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToBoolean(value);
+		}
+
+		#endregion
+
+		#region Simple Types
+
+		[NoInterception]
+		protected virtual String ConvertToString(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToString(value);
+		}
+
+		[NoInterception]
+		protected virtual DateTime ConvertToDateTime(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToDateTime(value);
+		}
+
+		[NoInterception]
+		protected virtual DateTimeOffset ConvertToDateTimeOffset(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToDateTimeOffset(value);
+		}
+
+		[NoInterception]
+		protected virtual System.Data.Linq.Binary ConvertToLinqBinary(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToLinqBinary(value);
+		}
+
+		[NoInterception]
+		protected virtual Decimal ConvertToDecimal(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToDecimal(value);
+		}
+
+		[NoInterception]
+		protected virtual Guid ConvertToGuid(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToGuid(value);
+		}
+
+		[NoInterception]
+		protected virtual Stream ConvertToStream(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToStream(value);
+		}
+
+		[NoInterception]
+		protected virtual XmlReader ConvertToXmlReader(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToXmlReader(value);
+		}
+
+		[NoInterception]
+		protected virtual XmlDocument ConvertToXmlDocument(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToXmlDocument(value);
+		}
+
+#if !SILVERLIGHT
+		[NoInterception]
+        protected virtual XElement ConvertToXElement(DbManager db, object value, object parameter)
+        {
+            return db.MappingSchema.ConvertToXElement(value);
+        }
+#endif
+
+        [NoInterception]
+		protected virtual Byte[] ConvertToByteArray(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToByteArray(value);
+		}
+
+		[NoInterception]
+		protected virtual Char[] ConvertToCharArray(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToCharArray(value);
+		}
+
+		#endregion
+
+		#region SqlTypes
+
+		[NoInterception]
+		protected virtual SqlByte ConvertToSqlByte(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToSqlByte(value);
+		}
+
+		[NoInterception]
+		protected virtual SqlInt16 ConvertToSqlInt16(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToSqlInt16(value);
+		}
+
+		[NoInterception]
+		protected virtual SqlInt32 ConvertToSqlInt32(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToSqlInt32(value);
+		}
+
+		[NoInterception]
+		protected virtual SqlInt64 ConvertToSqlInt64(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToSqlInt64(value);
+		}
+
+		[NoInterception]
+		protected virtual SqlSingle ConvertToSqlSingle(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToSqlSingle(value);
+		}
+
+		[NoInterception]
+		protected virtual SqlBoolean ConvertToSqlBoolean(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToSqlBoolean(value);
+		}
+
+		[NoInterception]
+		protected virtual SqlDouble ConvertToSqlDouble(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToSqlDouble(value);
+		}
+
+		[NoInterception]
+		protected virtual SqlDateTime ConvertToSqlDateTime(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToSqlDateTime(value);
+		}
+
+		[NoInterception]
+		protected virtual SqlDecimal ConvertToSqlDecimal(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToSqlDecimal(value);
+		}
+
+		[NoInterception]
+		protected virtual SqlMoney ConvertToSqlMoney(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToSqlMoney(value);
+		}
+
+		[NoInterception]
+		protected virtual SqlGuid ConvertToSqlGuid(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToSqlGuid(value);
+		}
+
+		[NoInterception]
+		protected virtual SqlString ConvertToSqlString(DbManager db, object value, object parameter)
+		{
+			return db.MappingSchema.ConvertToSqlString(value);
+		}
+
+		#endregion
+
+		#region General case
+
+		[NoInterception]
+		protected virtual object ConvertChangeType(
+			DbManager db,
+			object    value,
+			Type      conversionType,
+			object    parameter)
+		{
+			return db.MappingSchema.ConvertChangeType(value, conversionType);
+		}
+
+		#endregion
+		
+		#endregion
+
+		#region IsNull
+
+		/// <summary>
+		/// Reserved for internal BLToolkit use.
+		/// </summary>
+		public interface INullableInternal
+		{
+			bool IsNull { [MustImplement(false, false)] get; }
+		}
+
+		[NoInterception]
+		protected virtual bool IsNull(
+			DbManager db,
+			object    value,
+			object    parameter)
+		{
+			// Speed up for scalar and nullable types.
+			//
+			switch (System.Convert.GetTypeCode(value))
+			{
+				// null, DBNull.Value, Nullable<T> without a value.
+				//
+				case TypeCode.Empty:
+				case TypeCode.DBNull:
+					return true;
+
+				case TypeCode.Object:
+					break;
+
+				// int, byte, string, DateTime and other primitives except Guid.
+				// Also Nullable<T> with a value.
+				//
+				default:
+					return false;
+			}
+
+			// Speed up for SqlTypes.
+			//
+			var nullable = value as INullable;
+			if (nullable != null)
+				return nullable.IsNull;
+
+			// All other types which have 'IsNull' property but does not implement 'INullable' interface.
+			// For example: 'Oracle.DataAccess.Types.OracleDecimal'.
+			//
+			// For types without 'IsNull' property the return value is always false.
+			//
+			var nullableInternal = (INullableInternal)DuckTyping.Implement(typeof(INullableInternal), value);
+
+			return nullableInternal.IsNull;
+		}
+
+		#endregion
+
+		protected virtual SqlQueryAttribute GetSqlQueryAttribute(MethodInfo methodInfo)
+		{
+			var attrs = methodInfo.GetCustomAttributes(typeof(SqlQueryAttribute), true);
+			return (SqlQueryAttribute)attrs[0];
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/DataAccessorAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+using System;
+
+using BLToolkit.TypeBuilder.Builders;
+
+namespace BLToolkit.DataAccess
+{
+	[AttributeUsage(AttributeTargets.Class)]
+	class DataAccessorAttribute : AbstractTypeBuilderAttribute
+	{
+		public override IAbstractTypeBuilder TypeBuilder
+		{
+			get { return new DataAccessorBuilder(); }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/DataAccessorBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,195 @@
+using System;
+using System.Collections;
+using System.Data;
+
+using BLToolkit.Aspects;
+using BLToolkit.Data;
+using BLToolkit.Mapping;
+using BLToolkit.Properties;
+using BLToolkit.Reflection.Extension;
+
+namespace BLToolkit.DataAccess
+{
+	public abstract class DataAccessorBase
+	{
+		#region Constructors
+
+		[System.Diagnostics.DebuggerStepThrough]
+		protected DataAccessorBase()
+		{
+		}
+
+		[System.Diagnostics.DebuggerStepThrough]
+		protected DataAccessorBase(DbManager dbManager)
+		{
+			SetDbManager(dbManager, false);
+		}
+
+		[System.Diagnostics.DebuggerStepThrough]
+		protected DataAccessorBase(DbManager dbManager, bool dispose)
+		{
+			SetDbManager(dbManager, dispose);
+		}
+
+		#endregion
+
+		#region Public Members
+
+		[NoInterception, System.Diagnostics.DebuggerStepThrough]
+		public virtual DbManager GetDbManager()
+		{
+			return _dbManager ?? CreateDbManager();
+		}
+
+		[NoInterception]
+		protected virtual DbManager CreateDbManager()
+		{
+			return new DbManager();
+		}
+
+		[NoInterception]
+		public virtual void BeginTransaction()
+		{
+			if (_dbManager == null)
+				throw new InvalidOperationException(Resources.DataAccessorBase_NoDbManager);
+
+			_dbManager.BeginTransaction();
+		}
+
+		[NoInterception]
+		public virtual void BeginTransaction(IsolationLevel il)
+		{
+			if (_dbManager == null)
+				throw new InvalidOperationException(Resources.DataAccessorBase_NoDbManager);
+
+			_dbManager.BeginTransaction(il);
+		}
+
+		[NoInterception]
+		public virtual void CommitTransaction()
+		{
+			if (_dbManager == null)
+				throw new InvalidOperationException(Resources.DataAccessorBase_NoDbManager);
+
+			_dbManager.CommitTransaction();
+		}
+
+		[NoInterception]
+		public virtual void RollbackTransaction()
+		{
+			if (_dbManager == null)
+				throw new InvalidOperationException(Resources.DataAccessorBase_NoDbManager);
+
+			_dbManager.RollbackTransaction();
+		}
+
+		private ExtensionList _extensions;
+		public  ExtensionList  Extensions
+		{
+			get { return _extensions ?? (_extensions = MappingSchema.Extensions); }
+			set { _extensions = value; }
+		}
+
+		private        bool _disposeDbManager = true;
+		[NoInterception]
+		public virtual bool  DisposeDbManager
+		{
+			get { return _disposeDbManager;  }
+			set { _disposeDbManager = value; }
+		}
+
+		private MappingSchema _mappingSchema;
+		public  MappingSchema  MappingSchema
+		{
+			get { return _mappingSchema ?? (_mappingSchema = _dbManager != null? _dbManager.MappingSchema: Map.DefaultSchema); }
+			set { _mappingSchema = value; }
+		}
+
+		#endregion
+
+		#region Protected Members
+
+		private   DbManager _dbManager;
+		protected DbManager  DbManager
+		{
+			get { return _dbManager; }
+		}
+
+		protected internal void SetDbManager(DbManager dbManager, bool dispose)
+		{
+			_dbManager        = dbManager;
+			_disposeDbManager = dispose;
+		}
+
+		[NoInterception]
+		protected virtual string GetDefaultSpName(string typeName, string actionName)
+		{
+			return typeName == null?
+				actionName:
+				string.Format("{0}_{1}", typeName, actionName);
+		}
+
+		private static readonly Hashtable _actionSproc = new Hashtable();
+
+		[NoInterception]
+		protected virtual string GetSpName(Type type, string actionName)
+		{
+			if (type == null)
+				return GetDefaultSpName(null, actionName);
+
+			string key       = type.FullName + "$" + actionName;
+			string sprocName = (string)_actionSproc[key];
+
+			if (sprocName == null)
+			{
+				object[] attrs = type.GetCustomAttributes(typeof(ActionSprocNameAttribute), true);
+
+				foreach (ActionSprocNameAttribute attr in attrs)
+				{
+					if (attr.ActionName == actionName)
+					{
+						sprocName = attr.ProcedureName;
+						break;
+					}
+				}
+
+				if (sprocName == null)
+					sprocName = GetDefaultSpName(GetTableName(type), actionName);
+
+				_actionSproc[key] = sprocName;
+			}
+
+			return sprocName;
+		}
+
+		[NoInterception]
+		protected virtual string GetDatabaseName(Type type)
+		{
+			bool isSet;
+			return MappingSchema.MetadataProvider.GetDatabaseName(type, Extensions, out isSet);
+		}
+
+		[NoInterception]
+		protected virtual string GetOwnerName(Type type)
+		{
+			bool isSet;
+			return MappingSchema.MetadataProvider.GetOwnerName(type, Extensions, out isSet);
+		}
+
+		[NoInterception]
+		protected virtual string GetTableName(Type type)
+		{
+			bool isSet;
+			return MappingSchema.MetadataProvider.GetTableName(type, Extensions, out isSet);
+		}
+
+		[NoInterception]
+		protected virtual void Dispose(DbManager dbManager)
+		{
+			if (dbManager != null && DisposeDbManager)
+				dbManager.Dispose();
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/DataAccessorBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,2107 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Linq;
+using System.Reflection;
+using System.Reflection.Emit;
+
+using BLToolkit.Common;
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Mapping;
+using BLToolkit.Properties;
+using BLToolkit.Reflection;
+using BLToolkit.Reflection.Emit;
+using BLToolkit.TypeBuilder;
+using BLToolkit.TypeBuilder.Builders;
+
+namespace BLToolkit.DataAccess
+{
+	public class DataAccessorBuilder : AbstractTypeBuilderBase
+	{
+		struct MapOutputParametersValue
+		{
+			public readonly string ReturnValueMember;
+			public readonly ParameterInfo ParameterInfo;
+
+			public MapOutputParametersValue(string returnValueMember, ParameterInfo parameterInfo)
+			{
+				ReturnValueMember = returnValueMember;
+				ParameterInfo = parameterInfo;
+			}
+		}
+
+		public override int GetPriority(BuildContext context)
+		{
+			return TypeBuilderConsts.Priority.DataAccessor;
+		}
+
+		public override bool IsApplied(BuildContext context, AbstractTypeBuilderList builders)
+		{
+			if (context.IsBuildStep)
+			{
+				if (context.IsAbstractMethod)
+				{
+					// Give up if there is any builder that builds the method body.
+					//
+					if (builders.Count > 1)
+						foreach (IAbstractTypeBuilder builder in builders)
+							if (builder != this && builder.IsApplied(context, builders))
+								return false;
+
+					return true;
+				}
+
+				// Treat an abstract getter/setter as a regular method
+				// when the property has [NoInstance] attribute 
+				//
+				if (context.IsAbstractGetter || context.IsAbstractSetter)
+					return context.CurrentProperty.IsDefined(typeof(NoInstanceAttribute), true);
+			}
+
+			return false;
+		}
+
+		private Dictionary<Type, Type> _actualTypes;
+		private Dictionary<Type, Type> ActualTypes
+		{
+			get
+			{
+				if (_actualTypes == null)
+				{
+					_actualTypes = new Dictionary<Type, Type>();
+
+					object[] attrs = Context.Type.GetAttributes(typeof(ActualTypeAttribute));
+
+					foreach (ActualTypeAttribute attr in attrs)
+						if (!_actualTypes.ContainsKey(attr.BaseType))
+							_actualTypes.Add(attr.BaseType, attr.ActualType);
+				}
+
+				return _actualTypes;
+			}
+		}
+
+		enum ReturnType
+		{
+			DataReader,
+			DataSet,
+			DataTable,
+			List,
+			Dictionary,
+			Enumerable,
+			Void,
+			Scalar,
+			Object
+		}
+
+		static ReturnType GetReturnType(Type returnType)
+		{
+			if (returnType == typeof(IDataReader))
+				return ReturnType.DataReader;
+
+			if (returnType == typeof(DataSet) || returnType.IsSubclassOf(typeof(DataSet)))
+				return ReturnType.DataSet;
+
+			if (returnType == typeof(DataTable) || returnType.IsSubclassOf(typeof(DataTable)))
+				return ReturnType.DataTable;
+
+			if (!returnType.IsArray &&
+				(IsInterfaceOf(returnType, typeof(IList)) ||
+					returnType.IsGenericType && returnType.GetGenericTypeDefinition() == typeof(IList<>)))
+				return ReturnType.List;
+
+			if (IsInterfaceOf(returnType, typeof(IDictionary)) ||
+				returnType.IsGenericType && returnType.GetGenericTypeDefinition() == typeof(IDictionary<,>))
+				return ReturnType.Dictionary;
+
+			if (returnType == typeof(IEnumerable) ||
+				returnType.IsGenericType && returnType.GetGenericTypeDefinition() == typeof(IEnumerable<>))
+				return ReturnType.Enumerable;
+
+			if (returnType == typeof(void))
+				return ReturnType.Void;
+
+			if (TypeHelper.IsScalar(returnType.IsByRef ? returnType.GetElementType() : returnType))
+				return ReturnType.Scalar;
+
+			return ReturnType.Object;
+		}
+
+		void ThrowTypeBuilderException(string message)
+		{
+			throw new TypeBuilderException(
+				string.Format(message, Context.CurrentMethod.DeclaringType.Name, Context.CurrentMethod.Name));
+		}
+
+		const BindingFlags _bindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
+
+		readonly Type     _baseType = typeof(DataAccessor);
+		Type              _objectType;
+		bool              _explicitObjectType;
+		ParameterInfo[]   _parameters;
+		ArrayList         _paramList;
+		ArrayList         _refParamList;
+		bool              _createManager;
+		LocalBuilder      _locManager;
+		LocalBuilder      _locObjType;
+		ArrayList         _outputParameters;
+		SqlQueryAttribute _sqlQueryAttribute;
+		ArrayList         _formatParamList;
+		ParameterInfo     _destination;
+		ArrayList         _mapOutputParameters;
+
+		protected override void BuildAbstractMethod()
+		{
+			// Any class variable must be initialized before use
+			// as the same instance of the class is utilized to build abstract methods.
+			//
+			_paramList           = new ArrayList();
+			_refParamList        = new ArrayList();
+			_formatParamList     = new ArrayList();
+			_mapOutputParameters = new ArrayList();
+			_destination         = null;
+			_createManager       = true;
+			_objectType          = null;
+			_explicitObjectType  = false;
+			_parameters          = Context.CurrentMethod.GetParameters();
+			_locManager          = Context.MethodBuilder.Emitter.DeclareLocal(typeof(DbManager));
+			_locObjType          = Context.MethodBuilder.Emitter.DeclareLocal(typeof(Type));
+			_outputParameters    = null;
+			_sqlQueryAttribute   = null;
+
+			GetSqlQueryAttribute();
+			ProcessParameters();
+
+			var returnType = MethodReturnType;
+			var rt         = GetReturnType(returnType);
+
+			CreateDbManager(rt != ReturnType.Enumerable);
+			SetObjectType();
+
+			// Define execution method type.
+			//
+			switch (rt)
+			{
+				case ReturnType.DataReader : ExecuteReader();            break;
+				case ReturnType.DataSet    : ExecuteDataSet(returnType); break;
+				case ReturnType.DataTable  : ExecuteDataTable();         break;
+				case ReturnType.Void       : ExecuteNonQuery();          break;
+				case ReturnType.Scalar     : ExecuteScalar();            break;
+				case ReturnType.Enumerable : ExecuteEnumerable();        break;
+
+				case ReturnType.List:
+
+					if (!_explicitObjectType)
+					{
+						Type elementType = TypeHelper.GetListItemType(returnType);
+
+						if (elementType == typeof(object) && _destination != null)
+							elementType = TypeHelper.GetListItemType(Context.CurrentMethod.ReturnType);
+
+						if (elementType != typeof(object))
+							_objectType = elementType;
+
+						if (ActualTypes.ContainsKey(_objectType))
+							_objectType = ActualTypes[_objectType];
+					}
+
+					if (_objectType == null || _objectType == typeof(object))
+						ThrowTypeBuilderException(Resources.DataAccessorBuilder_BadListItemType);
+
+					if (TypeHelper.IsScalar(_objectType))
+						ExecuteScalarList();
+					else
+						ExecuteList();
+
+					break;
+
+				case ReturnType.Dictionary:
+					{
+						Type elementType = null;
+						Type keyType = typeof(object);
+						Type[] gTypes = TypeHelper.GetGenericArguments(returnType, typeof(IDictionary));
+
+						if ((gTypes == null || gTypes.Length != 2) && _destination != null)
+							gTypes = TypeHelper.GetGenericArguments(_destination.ParameterType, typeof(IDictionary));
+
+						if (gTypes != null && gTypes.Length == 2)
+						{
+							keyType = gTypes[0];
+							elementType = gTypes[1];
+						}
+
+						if (elementType == null || _explicitObjectType)
+							elementType = _objectType;
+
+						if (elementType == null || elementType == typeof(object))
+							ThrowTypeBuilderException(Resources.DataAccessorBuilder_BadListItemType);
+
+						bool isIndex = TypeHelper.IsSameOrParent(typeof(CompoundValue), keyType);
+
+						if (keyType != typeof(object) && !isIndex && !TypeHelper.IsScalar(keyType))
+							ThrowTypeBuilderException(
+								Resources.DataAccessorBuilder_BadKeyType);
+
+						MethodInfo mi = Context.CurrentMethod;
+
+						object[] attrs = mi.GetCustomAttributes(typeof(IndexAttribute), true);
+						NameOrIndexParameter[] fields = new NameOrIndexParameter[0];
+
+						if (attrs.Length != 0)
+							fields = ((IndexAttribute)attrs[0]).Fields;
+
+						if (fields.Length > 1 && keyType != typeof(object) && !isIndex)
+							ThrowTypeBuilderException(
+								Resources.DataAccessor_InvalidKeyType);
+
+						if (TypeHelper.IsScalar(elementType))
+						{
+							attrs = mi.GetCustomAttributes(typeof(ScalarFieldNameAttribute), true);
+
+							if (attrs.Length == 0)
+								ThrowTypeBuilderException(Resources.DataAccessorBuilder_ScalarFieldNameMissing);
+
+							NameOrIndexParameter scalarField = ((ScalarFieldNameAttribute)attrs[0]).NameOrIndex;
+
+							if (fields.Length == 0)
+								ExecuteScalarDictionaryWithPK(keyType, scalarField, elementType);
+							else if (isIndex || fields.Length > 1)
+								ExecuteScalarDictionaryWithMapIndex(fields, scalarField, elementType);
+							else
+								ExecuteScalarDictionaryWithScalarKey(fields[0], keyType, scalarField, elementType);
+						}
+						else
+						{
+							if (!_explicitObjectType && ActualTypes.ContainsKey(elementType))
+								elementType = ActualTypes[elementType];
+
+							if (fields.Length == 0)
+								ExecuteDictionaryWithPK(keyType, elementType);
+							else if (isIndex || fields.Length > 1)
+								ExecuteDictionaryWithMapIndex(fields, elementType);
+							else
+								ExecuteDictionaryWithScalarKey(fields[0], elementType);
+						}
+					}
+
+					break;
+
+				default:
+
+					if (_objectType == null || !TypeHelper.IsSameOrParent(returnType, _objectType))
+						_objectType = returnType;
+
+					if (!_explicitObjectType && ActualTypes.ContainsKey(_objectType))
+						_objectType = ActualTypes[_objectType];
+
+					ExecuteObject();
+
+					break;
+			}
+
+			GetOutRefParameters();
+
+			if (rt != ReturnType.Enumerable)
+				Finally();
+		}
+
+		protected override void BuildAbstractGetter()
+		{
+			BuildAbstractMethod();
+		}
+
+		protected override void BuildAbstractSetter()
+		{
+			BuildAbstractMethod();
+		}
+
+		void GetSqlQueryAttribute()
+		{
+			object[] attrs = Context.CurrentMethod.GetCustomAttributes(typeof(SqlQueryAttribute), true);
+
+			if (attrs.Length != 0)
+				_sqlQueryAttribute = (SqlQueryAttribute)attrs[0];
+		}
+
+		void AddParameter(ParameterInfo pi)
+		{
+			Type pType = pi.ParameterType;
+
+			if (pType.IsByRef)
+				pType = pType.GetElementType();
+
+			if (TypeHelper.IsScalar(pType)
+#if FW4
+				|| pi.IsRefCursor()
+#endif
+				)
+				_paramList.Add(pi);
+			else if (pType == typeof(DbManager) || pType.IsSubclassOf(typeof(DbManager)))
+				_createManager = false;
+			else
+				_refParamList.Add(pi);
+		}
+
+		void ProcessParameters()
+		{
+			for (int i = 0; i < _parameters.Length; i++)
+			{
+				ParameterInfo pi = _parameters[i];
+				NoMapAttribute[] attrs = (NoMapAttribute[])pi.GetCustomAttributes(typeof(NoMapAttribute), true);
+
+				if (attrs.Length == 0)
+					AddParameter(pi);
+				else
+				{
+					for (int j = 0; j < attrs.Length; ++j)
+					{
+						if (!attrs[j].NoMap)
+							AddParameter(pi);
+
+						if (attrs[j] is FormatAttribute)
+						{
+							int index = ((FormatAttribute)attrs[j]).Index;
+
+							if (index < 0)
+								index = 0;
+							else if (index > _formatParamList.Count)
+								index = _formatParamList.Count;
+
+							_formatParamList.Insert(index, pi);
+						}
+						else if (attrs[j] is DestinationAttribute)
+						{
+							if (_destination != null)
+								throw new TypeBuilderException(Resources.DataAccessorBuilderTooManyDestinations);
+
+							_destination = pi;
+						}
+					}
+				}
+			}
+		}
+
+		void CreateDbManager(bool beginException)
+		{
+			EmitHelper emit = Context.MethodBuilder.Emitter;
+
+			if (_createManager)
+			{
+				emit
+					.ldarg_0
+					.callvirt(_baseType, "GetDbManager")
+					.stloc(_locManager);
+
+				if (beginException)
+					emit.BeginExceptionBlock();
+			}
+			else
+			{
+				for (int i = 0; i < _parameters.Length; i++)
+				{
+					Type pType = _parameters[i].ParameterType;
+
+					if (pType == typeof(DbManager) || pType.IsSubclassOf(typeof(DbManager)))
+					{
+						emit
+							.ldarg(_parameters[i])
+							.stloc(_locManager)
+							;
+
+						break;
+					}
+				}
+			}
+		}
+
+		void SetObjectType()
+		{
+			var mi    = Context.CurrentMethod;
+			var attrs = mi.GetCustomAttributes(typeof(ObjectTypeAttribute), true);
+
+			if (attrs.Length == 0)
+				attrs = mi.DeclaringType.GetCustomAttributes(typeof(ObjectTypeAttribute), true);
+			else
+				_explicitObjectType = true;
+
+			if (attrs.Length != 0)
+				_objectType = ((ObjectTypeAttribute)attrs[0]).ObjectType;
+
+			if (_objectType == null)
+			{
+				var types = TypeHelper.GetGenericArguments(mi.DeclaringType, typeof(DataAccessor));
+
+				if (types != null)
+					_objectType = types[0];
+			}
+		}
+
+		#region ExecuteReader
+
+		void ExecuteReader()
+		{
+			InitObjectType();
+			GetSprocNameOrSqlQueryTest();
+			CallSetCommand();
+
+			var attrs = Context.CurrentMethod.GetCustomAttributes(typeof(CommandBehaviorAttribute), true);
+
+			if (attrs.Length == 0)
+			{
+				Context.MethodBuilder.Emitter
+					.callvirt(typeof(DbManager).GetMethod("ExecuteReader", Type.EmptyTypes))
+					.stloc(Context.ReturnValue)
+					;
+			}
+			else
+			{
+				Context.MethodBuilder.Emitter
+					.ldc_i4_((int)((CommandBehaviorAttribute)attrs[0]).CommandBehavior)
+					.callvirt(typeof(DbManager), "ExecuteReader", typeof(CommandBehavior))
+					.stloc(Context.ReturnValue)
+					;
+			}
+		}
+
+		#endregion
+
+		#region ExecuteDataSet
+
+		void ExecuteDataSet(Type returnType)
+		{
+			CreateReturnTypeInstance();
+			InitObjectType();
+			GetSprocNameOrSqlQueryTest();
+			CallSetCommand();
+
+			var emit = Context.MethodBuilder.Emitter;
+
+			if (returnType == typeof(DataSet))
+			{
+				LoadDestinationOrReturnValue();
+
+				object[] attrs = Context.CurrentMethod.GetCustomAttributes(typeof(DataSetTableAttribute), true);
+
+				if (attrs.Length == 0)
+				{
+					emit
+						.callvirt(typeof(DbManager), "ExecuteDataSet", typeof(DataSet))
+						.pop
+						.end()
+						;
+				}
+				else
+				{
+					emit
+						.ldNameOrIndex(((DataSetTableAttribute)attrs[0]).NameOrIndex)
+						.callvirt(typeof(DbManager), "ExecuteDataSet", typeof(DataSet), typeof(NameOrIndexParameter))
+						.pop
+						.end()
+						;
+				}
+			}
+			else
+			{
+				emit
+					.pop
+					.end()
+					;
+
+				LoadDestinationOrReturnValue();
+
+				Label l1 = emit.DefineLabel();
+				Label l2 = emit.DefineLabel();
+
+				emit
+					.callvirt(typeof(DataSet).GetProperty("Tables").GetGetMethod())
+					.callvirt(typeof(InternalDataCollectionBase).GetProperty("Count").GetGetMethod())
+					.ldc_i4_0
+					.ble_s(l1)
+					.ldloc(_locManager);
+
+				LoadDestinationOrReturnValue();
+
+				object[] attrs = Context.CurrentMethod.GetCustomAttributes(typeof(DataSetTableAttribute), true);
+
+				if (attrs.Length == 0)
+				{
+					LoadDestinationOrReturnValue();
+
+					emit
+						.callvirt(typeof(DataSet).GetProperty("Tables").GetGetMethod())
+						.ldc_i4_0
+						.callvirt(typeof(DataTableCollection), "get_Item", typeof(int))
+						.callvirt(typeof(DataTable).GetProperty("TableName").GetGetMethod())
+						.call(typeof(NameOrIndexParameter), "op_Implicit", typeof(string))
+						;
+				}
+				else
+				{
+					emit
+						.ldNameOrIndex(((DataSetTableAttribute)attrs[0]).NameOrIndex)
+						;
+				}
+
+				emit
+					.callvirt(typeof(DbManager), "ExecuteDataSet", typeof(DataSet), typeof(NameOrIndexParameter))
+					.pop
+					.br_s(l2)
+					.MarkLabel(l1)
+					.ldloc(_locManager);
+
+				LoadDestinationOrReturnValue();
+
+				emit
+					.callvirt(typeof(DbManager), "ExecuteDataSet", typeof(DataSet))
+					.pop
+					.MarkLabel(l2)
+					;
+			}
+		}
+
+		#endregion
+
+		#region ExecuteDataTable
+
+		void ExecuteDataTable()
+		{
+			CreateReturnTypeInstance();
+			InitObjectType();
+			GetSprocNameOrSqlQueryTest();
+			CallSetCommand();
+			LoadDestinationOrReturnValue();
+
+			EmitHelper emit = Context.MethodBuilder.Emitter;
+
+			emit
+				.callvirt(typeof(DbManager), "ExecuteDataTable", typeof(DataTable))
+				.pop
+				.end()
+				;
+
+			// When DataSetTableAttribute is present, simply set table name to the name specified.
+			//
+			object[] attrs = Context.CurrentMethod.GetCustomAttributes(typeof(DataSetTableAttribute), true);
+
+			if (attrs.Length != 0)
+			{
+				DataSetTableAttribute attr = (DataSetTableAttribute)attrs[0];
+
+				if (!attr.NameOrIndex.ByName)
+					throw new TypeBuilderException(string.Format(
+						Resources.DataAccessorBuilder_DataSetTableMustBeByName,
+						Context.CurrentMethod.DeclaringType.Name, Context.CurrentMethod.Name));
+
+				LoadDestinationOrReturnValue();
+
+				emit
+					.ldstr(attr.NameOrIndex.Name)
+					.callvirt(typeof(DataTable), "set_TableName", typeof(string))
+					;
+			}
+		}
+
+		#endregion
+
+		#region ExecuteScalarList
+
+		void ExecuteScalarList()
+		{
+			CreateReturnTypeInstance();
+			InitObjectType();
+			GetSprocNameOrSqlQueryTest();
+			CallSetCommand();
+			LoadDestinationOrReturnValue();
+
+			object[] attrs = Context.CurrentMethod.GetCustomAttributes(typeof(ScalarFieldNameAttribute), true);
+
+			if (attrs.Length == 0)
+			{
+				Context.MethodBuilder.Emitter
+					.ldloc(_locObjType)
+					.callvirt(typeof(DbManager), "ExecuteScalarList", typeof(IList), typeof(Type))
+					.pop
+					.end()
+					;
+			}
+			else
+			{
+				Context.MethodBuilder.Emitter
+					.ldloc(_locObjType)
+					.ldNameOrIndex(((ScalarFieldNameAttribute)attrs[0]).NameOrIndex)
+					.callvirt(typeof(DbManager), "ExecuteScalarList", typeof(IList), typeof(Type), typeof(NameOrIndexParameter))
+					.pop
+					.end()
+					;
+			}
+		}
+
+		void ExecuteList()
+		{
+			CreateReturnTypeInstance();
+			InitObjectType();
+			GetSprocNameOrSqlQueryTest();
+			CallSetCommand();
+			LoadDestinationOrReturnValue();
+
+			Context.MethodBuilder.Emitter
+				.CastIfNecessary(typeof(IList), MethodReturnType)
+				.ldloc(_locObjType)
+				.callvirt(typeof(DbManager), "ExecuteList", typeof(IList), typeof(Type))
+				.pop
+				.end()
+				;
+		}
+
+		#endregion
+
+		#region ExecuteDictionary
+
+		public FieldBuilder GetIndexField(NameOrIndexParameter[] namesOrIndexes)
+		{
+			var id = "index$" + string.Join("%",
+				Array.ConvertAll<NameOrIndexParameter, string>(namesOrIndexes,
+					delegate(NameOrIndexParameter nameOrIndex)
+					{
+						return nameOrIndex.ToString();
+					}));
+
+			var fieldBuilder = Context.GetField(id);
+
+			if (fieldBuilder == null)
+			{
+				fieldBuilder = Context.CreatePrivateStaticField(id, typeof(MapIndex));
+
+				EmitHelper emit = Context.TypeBuilder.TypeInitializer.Emitter;
+
+				emit
+					.ldc_i4_(namesOrIndexes.Length)
+					.newarr(typeof(NameOrIndexParameter))
+					;
+
+				for (int i = 0; i < namesOrIndexes.Length; i++)
+				{
+					emit
+						.dup
+						.ldc_i4_(i)
+						.ldelema(typeof(NameOrIndexParameter));
+
+					if (namesOrIndexes[i].ByName)
+					{
+						emit
+							.ldstr(namesOrIndexes[i].Name)
+							.call(typeof(NameOrIndexParameter), "op_Implicit", typeof(string));
+					}
+					else
+					{
+						emit
+							.ldc_i4_(namesOrIndexes[i].Index)
+							.call(typeof(NameOrIndexParameter), "op_Implicit", typeof(int));
+					}
+
+					emit
+						.stobj(typeof(NameOrIndexParameter))
+						.end()
+						;
+				}
+
+				emit
+					.newobj(typeof(MapIndex), typeof(NameOrIndexParameter[]))
+					.stsfld(fieldBuilder)
+					;
+			}
+
+			return fieldBuilder;
+		}
+
+		/// <summary>
+		/// Maps primary keys(s) to a scalar field.
+		/// </summary>
+		void ExecuteScalarDictionaryWithPK(
+			Type keyType,
+			NameOrIndexParameter scalarField,
+			Type elementType)
+		{
+			CreateReturnTypeInstance();
+			InitObjectType();
+
+			Context.MethodBuilder.Emitter
+				.ldarg_0
+				.end()
+				;
+
+			GetSprocNameOrSqlQueryTest();
+			CallSetCommand();
+			LoadDestinationOrReturnValue();
+
+			Context.MethodBuilder.Emitter
+				.ldloc(_locObjType)
+				.LoadType(keyType)
+				.ldstr(Context.CurrentMethod.Name)
+				.ldNameOrIndex(scalarField)
+				.LoadType(elementType)
+				.callvirt(_baseType, "ExecuteScalarDictionary", _bindingFlags,
+								typeof(DbManager), typeof(IDictionary), typeof(Type),
+								typeof(Type), typeof(string), typeof(NameOrIndexParameter), typeof(Type))
+				;
+		}
+
+		/// <summary>
+		/// Maps a complex index to a scalar field.
+		/// </summary>
+		void ExecuteScalarDictionaryWithMapIndex(
+			NameOrIndexParameter[] index,
+			NameOrIndexParameter scalarField,
+			Type elementType)
+		{
+			_objectType = elementType;
+
+			CreateReturnTypeInstance();
+			InitObjectType();
+			GetSprocNameOrSqlQueryTest();
+			CallSetCommand();
+			LoadDestinationOrReturnValue();
+
+			Context.MethodBuilder.Emitter
+				.ldsfld(GetIndexField(index))
+				.ldNameOrIndex(scalarField)
+				.ldloc(_locObjType)
+				.callvirt(typeof(DbManager), "ExecuteScalarDictionary",
+								typeof(IDictionary), typeof(MapIndex),
+								typeof(NameOrIndexParameter), typeof(Type))
+				.pop
+				.end()
+				;
+		}
+
+		/// <summary>
+		/// Maps any single field to any (other) single field.
+		/// </summary>
+		void ExecuteScalarDictionaryWithScalarKey(
+			NameOrIndexParameter keyField, Type keyType,
+			NameOrIndexParameter scalarField, Type elementType)
+		{
+			_objectType = elementType;
+
+			CreateReturnTypeInstance();
+			InitObjectType();
+			GetSprocNameOrSqlQueryTest();
+			CallSetCommand();
+			LoadDestinationOrReturnValue();
+
+			Context.MethodBuilder.Emitter
+				.ldNameOrIndex(keyField)
+				.LoadType(keyType)
+				.ldNameOrIndex(scalarField)
+				.ldloc(_locObjType)
+				.callvirt(typeof(DbManager), "ExecuteScalarDictionary",
+								typeof(IDictionary), typeof(NameOrIndexParameter), typeof(Type),
+								typeof(NameOrIndexParameter), typeof(Type))
+				.pop
+				.end()
+				;
+		}
+
+		/// <summary>
+		/// Maps primary keys(s) to an object of the specified type.
+		/// </summary>
+		void ExecuteDictionaryWithPK(
+			Type keyType,
+			Type elementType)
+		{
+			EmitHelper emit = Context.MethodBuilder.Emitter;
+
+			_objectType = elementType;
+
+			CreateReturnTypeInstance();
+			InitObjectType();
+
+			emit
+				.ldarg_0
+				.end()
+				;
+
+			GetSprocNameOrSqlQueryTest();
+			CallSetCommand();
+			LoadDestinationOrReturnValue();
+
+			if (IsGenericDestinationOrReturnValue())
+			{
+				Type[] genericArgs = Context.ReturnValue.LocalType.GetGenericArguments();
+				Type[] types = new Type[]
+					{
+						typeof(DbManager),
+						typeof(IDictionary<,>).MakeGenericType(genericArgs),
+						typeof(Type),
+						typeof(string),
+					};
+				MethodInfo method = _baseType.GetMethod("ExecuteDictionary",
+					_bindingFlags, GenericBinder.Generic, types, null);
+
+				if (TypeHelper.IsSameOrParent(typeof(CompoundValue), genericArgs[0]))
+					method = method.MakeGenericMethod(genericArgs[1]);
+				else
+					method = method.MakeGenericMethod(genericArgs);
+
+				emit
+					.ldloc(_locObjType)
+					.ldstr(Context.CurrentMethod.Name)
+					.callvirt(method)
+					;
+			}
+			else
+
+				emit
+					.ldloc(_locObjType)
+					.LoadType(keyType)
+					.ldstr(Context.CurrentMethod.Name)
+					.callvirt(_baseType, "ExecuteDictionary", _bindingFlags,
+								typeof(DbManager), typeof(IDictionary), typeof(Type),
+								typeof(Type), typeof(string))
+					;
+		}
+
+		/// <summary>
+		/// Maps a complex index to an object of the specified type.
+		/// </summary>
+		void ExecuteDictionaryWithMapIndex(
+			NameOrIndexParameter[] index,
+			Type elementType)
+		{
+			_objectType = elementType;
+
+			CreateReturnTypeInstance();
+			InitObjectType();
+			GetSprocNameOrSqlQueryTest();
+			CallSetCommand();
+			LoadDestinationOrReturnValue();
+
+			Context.MethodBuilder.Emitter
+				.ldsfld(GetIndexField(index))
+				.ldloc(_locObjType)
+				.ldnull
+				.callvirt(typeof(DbManager), "ExecuteDictionary",
+							typeof(IDictionary), typeof(MapIndex), typeof(Type), typeof(object[]))
+				.pop
+				.end()
+				;
+		}
+
+		/// <summary>
+		/// Maps any single field to object type.
+		/// </summary>
+		void ExecuteDictionaryWithScalarKey(
+			NameOrIndexParameter keyField,
+			Type elementType)
+		{
+			EmitHelper emit = Context.MethodBuilder.Emitter;
+
+			_objectType = elementType;
+
+			CreateReturnTypeInstance();
+			InitObjectType();
+			GetSprocNameOrSqlQueryTest();
+			CallSetCommand();
+			LoadDestinationOrReturnValue();
+
+			if (IsGenericDestinationOrReturnValue())
+			{
+				Type[] genericArgs = Context.ReturnValue.LocalType.GetGenericArguments();
+				Type[] types = new Type[]
+					{
+						typeof(IDictionary<,>).MakeGenericType(genericArgs),
+						typeof(NameOrIndexParameter),
+						typeof(Type),
+						typeof(object[]),
+					};
+				MethodInfo method = typeof(DbManager).GetMethod("ExecuteDictionary", _bindingFlags, GenericBinder.Generic, types, null)
+					.MakeGenericMethod(genericArgs);
+
+				emit
+					.ldNameOrIndex(keyField)
+					.ldloc(_locObjType)
+					.ldnull
+					.callvirt(method)
+					.pop
+					.end()
+					;
+			}
+			else
+			{
+				emit
+					.ldNameOrIndex(keyField)
+					.ldloc(_locObjType)
+					.ldnull
+					.callvirt(typeof(DbManager), "ExecuteDictionary", typeof(IDictionary), typeof(NameOrIndexParameter), typeof(Type), typeof(object[]))
+					.pop
+					.end()
+					;
+			}
+		}
+
+		#endregion
+
+		#region ExecuteEnumerable
+
+		public void ExecuteEnumerable()
+		{
+			EmitHelper emit = Context.MethodBuilder.Emitter;
+			Type returnType = Context.CurrentMethod.ReturnType;
+
+			if (_objectType == null && returnType.IsGenericType)
+				_objectType = returnType.GetGenericArguments()[0];
+
+			if (_objectType == null || _objectType == typeof(object))
+				ThrowTypeBuilderException(Resources.DataAccessorBuilder_BadListItemType);
+
+			Type returnObjectType = returnType.IsGenericType ? returnType.GetGenericArguments()[0] : _objectType;
+
+			InitObjectType();
+
+			Context.MethodBuilder.Emitter
+				.ldarg_0
+				.end()
+				;
+
+			GetSprocNameOrSqlQueryTest();
+			CallSetCommand();
+
+			Type[] genericArgs = new Type[] { returnObjectType };
+			Type[] types = new Type[] { typeof(DbManager), typeof(Type), typeof(bool), };
+			MethodInfo method = _baseType
+				.GetMethod("ExecuteEnumerable", _bindingFlags, GenericBinder.Generic, types, null)
+				.MakeGenericMethod(genericArgs);
+
+			emit
+				.LoadType(_objectType)
+				.ldc_i4_1
+				.callvirt(method)
+				.stloc(Context.ReturnValue)
+				;
+		}
+
+		#endregion
+
+		#region ExecuteNonQuery
+
+		public void ExecuteNonQuery()
+		{
+			if (_destination != null)
+				throw new TypeBuilderException(Resources.DataAccessorBuilder_CantExecuteNonQueryToDestination);
+
+			InitObjectType();
+			GetSprocNameOrSqlQueryTest();
+			CallSetCommand();
+
+			MethodInfo mi = typeof(DbManager).GetMethod("ExecuteNonQuery", Type.EmptyTypes);
+			LocalBuilder locExec = Context.MethodBuilder.Emitter.DeclareLocal(mi.ReturnType);
+
+			Context.MethodBuilder.Emitter
+				.callvirt(mi)
+				.stloc(locExec)
+				;
+
+			if (Context.ReturnValue != null)
+			{
+				Context.MethodBuilder.Emitter
+					.ldloc(locExec)
+					.stloc(Context.ReturnValue)
+					;
+			}
+		}
+
+		#endregion
+
+		#region ExecuteScalar
+
+		public void ExecuteScalar()
+		{
+			EmitHelper emit = Context.MethodBuilder.Emitter;
+			Type returnType = Context.CurrentMethod.ReturnType;
+			Type scalarType;
+
+			if (_destination != null)
+			{
+				if (_destination.ParameterType.IsByRef)
+					scalarType = _destination.ParameterType.GetElementType();
+				else
+					throw new TypeBuilderException(Resources.DataAccessorBuilder_ScalarDestinationIsNotByRef);
+
+				if (returnType != typeof(void) && !TypeHelper.IsSameOrParent(returnType, scalarType))
+				{
+					// object Foo(out int num) is valid,
+					// IConvertible Foo(ref int num) is also ok,
+					// but string Bar(out DateTime dt) is not
+					//
+					throw new TypeBuilderException(string.Format(
+						Resources.DataAccessorBuilder_IncompatibleDestinationType,
+						returnType.FullName, Context.CurrentMethod.Name, scalarType.FullName));
+				}
+			}
+			else
+				scalarType = returnType;
+
+			if (_destination != null)
+				emit
+					.ldarg(_destination)
+					;
+
+			emit
+				.ldarg_0
+				.ldloc(_locManager)
+				;
+
+			InitObjectType();
+			GetSprocNameOrSqlQueryTest();
+			CallSetCommand();
+
+			object[] attrs = Context.CurrentMethod.GetCustomAttributes(typeof(ScalarSourceAttribute), true);
+
+			if (attrs.Length == 0)
+			{
+				emit
+					.callvirtNoGenerics(typeof(DbManager), "ExecuteScalar")
+					;
+			}
+			else
+			{
+				ScalarSourceAttribute attr = (ScalarSourceAttribute)attrs[0];
+
+				emit
+					.ldc_i4_((int)attr.ScalarType)
+					.ldNameOrIndex(attr.NameOrIndex)
+					.callvirtNoGenerics(typeof(DbManager), "ExecuteScalar", typeof(ScalarSourceType), typeof(NameOrIndexParameter));
+			}
+
+			MethodInfo converter = GetConverterMethod(scalarType);
+
+			if (converter == null)
+			{
+				emit
+					.LoadType(scalarType)
+					.ldnull
+					.callvirt(_baseType, "ConvertChangeType", _bindingFlags, typeof(DbManager), typeof(object), typeof(Type), typeof(object))
+					.unboxIfValueType(scalarType)
+					;
+
+			}
+			else
+			{
+				emit
+					.ldnull
+					.callvirt(converter)
+					;
+			}
+
+			if (_destination != null)
+			{
+				emit
+					.stind(scalarType)
+					;
+
+				// The return value and a destination both are present
+				//
+				if (Context.ReturnValue != null)
+				{
+					emit
+						.ldargEx(_destination, false)
+						;
+
+					if (scalarType != returnType)
+						emit
+							.boxIfValueType(scalarType)
+							.CastFromObject(returnType)
+							;
+
+					emit.stloc(Context.ReturnValue)
+					;
+				}
+			}
+			else
+				emit
+					.stloc(Context.ReturnValue)
+					;
+		}
+
+		#endregion
+
+		#region ExecuteObject
+
+		public void ExecuteObject()
+		{
+			InitObjectType();
+			GetSprocNameOrSqlQueryTest();
+			CallSetCommand();
+
+			EmitHelper emit = Context.MethodBuilder.Emitter;
+
+			if (_destination != null)
+			{
+				emit
+					.ldarg(_destination)
+					.callvirt(typeof(DbManager), "ExecuteObject", typeof(Object))
+					;
+			}
+			else
+			{
+				emit
+					.ldloc(_locObjType)
+					.callvirt(typeof(DbManager), "ExecuteObject", typeof(Type))
+					;
+			}
+
+			if (null != Context.ReturnValue)
+			{
+				emit
+					.castclass(_objectType)
+					.stloc(Context.ReturnValue)
+					;
+			}
+			else
+			{
+				emit
+					.pop
+					.end()
+					;
+			}
+		}
+
+		#endregion
+
+		void Finally()
+		{
+			if (_createManager)
+			{
+				Context.MethodBuilder.Emitter
+					.BeginFinallyBlock()
+					.ldarg_0
+					.ldloc(_locManager)
+					.callvirt(_baseType, "Dispose", _bindingFlags, typeof(DbManager))
+					.EndExceptionBlock()
+					;
+			}
+		}
+
+		void CreateReturnTypeInstance()
+		{
+			if (null == Context.ReturnValue)
+				return;
+
+			if (null != _destination)
+			{
+				Context.MethodBuilder.Emitter
+					.ldarg(_destination)
+					.CastIfNecessary(Context.ReturnValue.LocalType, _destination.ParameterType)
+					.stloc(Context.ReturnValue)
+					;
+			}
+			else
+			{
+				Type returnType = Context.CurrentMethod.ReturnType;
+
+				if (returnType.IsInterface)
+				{
+					if (IsInterfaceOf(returnType, typeof(IList)))
+						returnType = typeof(ArrayList);
+					else if (IsInterfaceOf(returnType, typeof(IDictionary)))
+						returnType = typeof(Hashtable);
+					else if (returnType.GetGenericTypeDefinition() == typeof(IList<>))
+						returnType = typeof(List<>).MakeGenericType(returnType.GetGenericArguments());
+					else if (returnType.GetGenericTypeDefinition() == typeof(IDictionary<,>))
+						returnType = typeof(Dictionary<,>).MakeGenericType(returnType.GetGenericArguments());
+				}
+
+				ConstructorInfo ci = TypeHelper.GetDefaultConstructor(returnType);
+
+				if (ci == null)
+					throw new TypeBuilderException(string.Format(Resources.DataAccessorBuilder_CantCreateTypeInstance,
+						Context.CurrentMethod.ReturnType.FullName));
+
+				Context.MethodBuilder.Emitter
+					.newobj(ci)
+					.stloc(Context.ReturnValue)
+					;
+			}
+		}
+
+		Type MethodReturnType
+		{
+			get
+			{
+				return _destination != null ?
+					_destination.ParameterType :
+					Context.CurrentMethod.ReturnType;
+			}
+		}
+
+		void LoadDestinationOrReturnValue()
+		{
+			if (_destination != null)
+				Context.MethodBuilder.Emitter.ldarg(_destination);
+			else
+				Context.MethodBuilder.Emitter.ldloc(Context.ReturnValue);
+		}
+
+		bool IsGenericDestinationOrReturnValue()
+		{
+			return _destination == null ?
+				Context.ReturnValue.LocalType.IsGenericType :
+				_destination.ParameterType.IsGenericType;
+		}
+
+		void InitObjectType()
+		{
+			Context.MethodBuilder.Emitter
+				.LoadType(_objectType)
+				.stloc(_locObjType)
+				;
+		}
+
+		static int _nameCounter;
+		static int _uniqueQueryID;
+
+		void GetSprocNameOrSqlQueryTest()
+		{
+			EmitHelper emit = Context.MethodBuilder.Emitter;
+
+			if (_sqlQueryAttribute != null)
+			{
+				emit
+					.ldloc(_locManager)
+					;
+
+				if (_sqlQueryAttribute.ID != int.MinValue)
+				{
+					emit
+						.ldarg_0
+						.ldloc(_locManager)
+						.ldc_i4_(_sqlQueryAttribute.ID)
+						.ldc_i4_(++_uniqueQueryID)
+						;
+				}
+
+				if (_sqlQueryAttribute.IsDynamic)
+				{
+					Type attrType = typeof(SqlQueryAttribute);
+					FieldBuilder field = Context.CreatePrivateStaticField(attrType + "$" + ++_nameCounter, attrType);
+					Label isNull = emit.DefineLabel();
+
+					emit
+						.ldsfld(field)
+						.brtrue_s(isNull)
+
+						.ldarg_0
+						.call(typeof(MethodBase), "GetCurrentMethod")
+						.castclass(typeof(MethodInfo))
+						.callvirt(_baseType, "GetSqlQueryAttribute", _bindingFlags, typeof(MethodInfo))
+
+						.stsfld(field)
+						.MarkLabel(isNull)
+
+						.ldsfld(field)
+						.ldarg_0
+						.ldloc(_locManager)
+						.callvirt(attrType, "GetSqlText", _bindingFlags, typeof(DataAccessor), typeof(DbManager))
+						;
+				}
+				else
+				{
+					emit
+						.ldstr(_sqlQueryAttribute.SqlText)
+						;
+				}
+
+				if (_sqlQueryAttribute.ID != int.MinValue)
+				{
+					emit
+						.callvirt(_baseType, "PrepareSqlQuery", _bindingFlags,
+							typeof(DbManager), typeof(int), typeof(int), typeof(string))
+						;
+				}
+			}
+			else
+			{
+				object[] attrs = Context.CurrentMethod.GetCustomAttributes(typeof(SprocNameAttribute), true);
+
+				if (attrs.Length == 0)
+				{
+					attrs = Context.CurrentMethod.GetCustomAttributes(typeof(ActionNameAttribute), true);
+
+					string actionName = attrs.Length == 0 ?
+						Context.CurrentMethod.Name : ((ActionNameAttribute)attrs[0]).Name;
+
+					// Call GetSpName.
+					//
+					emit
+						.ldloc(_locManager)
+						.ldarg_0
+						.ldloc(_locObjType)
+						.ldstr(actionName)
+						.callvirt(_baseType, "GetSpName", _bindingFlags, typeof(Type), typeof(string))
+						;
+				}
+				else
+				{
+					emit
+						.ldloc(_locManager)
+						.ldstr(((SprocNameAttribute)attrs[0]).Name)
+						;
+				}
+			}
+
+			// string.Format
+			//
+			if (_formatParamList.Count > 0)
+			{
+				emit
+					.ldc_i4_(_formatParamList.Count)
+					.newarr(typeof(object))
+					;
+
+				for (int i = 0; i < _formatParamList.Count; i++)
+				{
+					ParameterInfo pi = (ParameterInfo)_formatParamList[i];
+
+					emit
+						.dup
+						.ldc_i4_(i)
+						.ldarg(pi)
+						.boxIfValueType(pi.ParameterType)
+						.stelem_ref
+						.end()
+						;
+				}
+
+				emit
+					.call(typeof(string), "Format", typeof(string), typeof(object[]))
+					;
+			}
+		}
+
+		void CallSetCommand()
+		{
+			EmitHelper emit = Context.MethodBuilder.Emitter;
+
+			// Get DiscoverParametersAttribute.
+			//
+			object[] attrs =
+				Context.CurrentMethod.DeclaringType.GetCustomAttributes(typeof(DiscoverParametersAttribute), true);
+
+			bool discoverParams = false;
+
+			if (_sqlQueryAttribute == null)
+			{
+				discoverParams = attrs.Length == 0 ?
+					false : ((DiscoverParametersAttribute)attrs[0]).Discover;
+
+				attrs = Context.CurrentMethod.GetCustomAttributes(typeof(DiscoverParametersAttribute), true);
+
+				if (attrs.Length != 0)
+					discoverParams = ((DiscoverParametersAttribute)attrs[0]).Discover;
+			}
+
+			LocalBuilder locParams = discoverParams ?
+				BuildParametersWithDiscoverParameters() :
+				BuildParameters();
+
+			// Call SetSpCommand.
+			//
+			string methodName = _sqlQueryAttribute == null ? "SetSpCommand" : "SetCommand";
+			Type paramType = _sqlQueryAttribute == null ? typeof(object[]) : typeof(IDbDataParameter[]);
+
+			emit
+				.ldloc(locParams)
+				.callvirt(typeof(DbManager), methodName, _bindingFlags, typeof(string), paramType)
+				;
+		}
+
+		LocalBuilder BuildParameters()
+		{
+			EmitHelper emit = Context.MethodBuilder.Emitter;
+
+			LocalBuilder retParams = emit
+				.DeclareLocal(typeof(IDbDataParameter[]));
+
+			LocalBuilder locParams = _refParamList.Count > 0 ?
+				BuildRefParameters() :
+				BuildSimpleParameters();
+
+			emit
+				.ldarg_0
+				.ldloc(_locManager)
+				.ldloc(locParams)
+				.callvirt(_baseType, "PrepareParameters", _bindingFlags, typeof(DbManager), typeof(object[]))
+				.stloc(retParams)
+				;
+
+			return retParams;
+		}
+
+		LocalBuilder BuildSimpleParameters()
+		{
+			EmitHelper emit = Context.MethodBuilder.Emitter;
+
+			// Parameters.
+			//
+			LocalBuilder locParams = emit.DeclareLocal(
+				_sqlQueryAttribute == null ? typeof(object[]) : typeof(IDbDataParameter[]));
+
+			emit
+				.ldc_i4_(_paramList.Count)
+				.newarr(_sqlQueryAttribute == null ? typeof(object) : typeof(IDbDataParameter))
+				;
+
+			for (int i = 0; i < _paramList.Count; i++)
+			{
+				ParameterInfo pi = (ParameterInfo)_paramList[i];
+
+				emit
+					.dup
+					.ldc_i4_(i)
+					;
+
+				BuildParameter(pi);
+
+				emit
+					.stelem_ref
+					.end()
+					;
+			}
+
+			emit.stloc(locParams);
+			return locParams;
+		}
+
+		FieldBuilder CreateStringArrayField(object[] attrs)
+		{
+			if (attrs.Length == 0)
+				return null;
+
+			List<string> list = new List<string>();
+
+			foreach (Direction attr in attrs)
+				if (attr.Members != null)
+					list.AddRange(attr.Members);
+
+			if (list.Count == 0)
+				return null;
+
+			list.Sort(string.CompareOrdinal);
+
+			string[] strings = list.ToArray();
+
+			// There a no limit for a field name length, but Visual Studio Debugger
+			// may crash on fields with name longer then 256 symbols.
+			//
+			string key = "_string_array$" + string.Join("%", strings);
+			FieldBuilder fieldBuilder = Context.GetField(key);
+
+			if (null == fieldBuilder)
+			{
+				fieldBuilder = Context.CreatePrivateStaticField(key, typeof(string[]));
+
+				EmitHelper emit = Context.TypeBuilder.TypeInitializer.Emitter;
+
+				emit
+					.ldc_i4_(strings.Length)
+					.newarr(typeof(string))
+					;
+
+				for (int i = 0; i < strings.Length; i++)
+				{
+					emit
+						.dup
+						.ldc_i4_(i)
+						.ldstr(strings[i])
+						.stelem_ref
+						.end()
+						;
+				}
+
+				emit
+					.stsfld(fieldBuilder)
+					;
+			}
+
+			return fieldBuilder;
+		}
+
+		FieldBuilder CreateNullValueField(Type type, string value)
+		{
+			string key = "_null_value$" + type.FullName + "%" + value;
+			FieldBuilder fieldBuilder = Context.GetField(key);
+
+			if (null == fieldBuilder)
+			{
+				fieldBuilder = Context.CreatePrivateStaticField(key, type);
+
+				EmitHelper emit = Context.TypeBuilder.TypeInitializer.Emitter;
+
+				emit
+					.LoadType(type)
+					.call(typeof(TypeDescriptor), "GetConverter", typeof(Type))
+					.ldstr(value)
+					.callvirt(typeof(TypeConverter), "ConvertFromInvariantString", typeof(string))
+					.unbox_any(type)
+					.stsfld(fieldBuilder)
+					;
+			}
+
+			return fieldBuilder;
+		}
+
+		LocalBuilder BuildRefParameters()
+		{
+			EmitHelper emit = Context.MethodBuilder.Emitter;
+
+			// Parameters.
+			//
+			LocalBuilder locParams = emit.DeclareLocal(typeof(object[]));
+
+			emit
+				.ldc_i4_(_parameters.Length)
+				.newarr(typeof(object))
+				;
+
+			for (int i = 0; i < _parameters.Length; i++)
+			{
+				ParameterInfo pi = _parameters[i];
+
+				emit
+					.dup
+					.ldc_i4_(i)
+					;
+
+				if (_paramList.Contains(pi))
+				{
+					BuildParameter(pi);
+				}
+				else if (_refParamList.Contains(pi))
+				{
+					var          mapOutputParameters = false;
+					string       returnValueMember = null;
+					FieldBuilder fieldBuilder;
+					var          type =
+						pi.ParameterType == typeof(DataRow) || pi.ParameterType.IsSubclassOf(typeof(DataRow)) ?
+							typeof(DataRow) : typeof(object);
+
+					emit
+						.ldarg_0
+						.ldloc(_locManager)
+						.ldarg(pi)
+						;
+
+					fieldBuilder = CreateStringArrayField(pi.GetCustomAttributes(typeof(Direction.OutputAttribute), true));
+
+					if (fieldBuilder != null)
+					{
+						emit.ldsfld(fieldBuilder);
+						mapOutputParameters = true;
+					}
+					else
+						emit.ldnull.end();
+
+					fieldBuilder = CreateStringArrayField(pi.GetCustomAttributes(typeof(Direction.InputOutputAttribute), true));
+
+					if (fieldBuilder != null)
+					{
+						emit.ldsfld(fieldBuilder);
+						mapOutputParameters = true;
+					}
+					else
+						emit.ldnull.end();
+
+					fieldBuilder = CreateStringArrayField(pi.GetCustomAttributes(typeof(Direction.IgnoreAttribute), true));
+
+					if (fieldBuilder != null)
+						emit.ldsfld(fieldBuilder);
+					else
+						emit.ldnull.end();
+
+					emit
+						.ldnull
+						.callvirt(_baseType, "CreateParameters", _bindingFlags,
+							typeof(DbManager), type, typeof(string[]), typeof(string[]), typeof(string[]), typeof(IDbDataParameter[]))
+						;
+
+					object[] attrs = pi.GetCustomAttributes(typeof(Direction.ReturnValueAttribute), true);
+
+					if (attrs.Length != 0)
+						returnValueMember = ((Direction.ReturnValueAttribute)attrs[0]).Member;
+
+					if (null != returnValueMember || mapOutputParameters)
+						_mapOutputParameters.Add(new MapOutputParametersValue(returnValueMember, pi));
+				}
+				else
+				{
+					emit
+						.ldnull
+						.end()
+						;
+				}
+
+				emit
+					.stelem_ref
+					.end()
+					;
+			}
+
+			emit.stloc(locParams);
+			return locParams;
+		}
+
+		void LoadParameterOrNull(ParameterInfo pi, Type type)
+		{
+			EmitHelper emit = Context.MethodBuilder.Emitter;
+			object[] attrs = pi.GetCustomAttributes(typeof(ParamNullValueAttribute), true);
+
+			object nullValue = attrs.Length == 0 ?
+				null : ((ParamNullValueAttribute)attrs[0]).Value;
+
+			Label labelNull = emit.DefineLabel();
+			Label labelEndIf = emit.DefineLabel();
+
+			if (pi.Attributes == ParameterAttributes.Out)
+			{
+				emit
+					.ldnull
+					.end()
+					;
+
+				return;
+			}
+
+			if (nullValue != null)
+			{
+				Type nullValueType = type;
+				bool isNullable = TypeHelper.IsNullable(type);
+
+				if (type.IsEnum)
+				{
+					nullValueType = Enum.GetUnderlyingType(type);
+					nullValue = System.Convert.ChangeType(nullValue, nullValueType);
+				}
+				else if (isNullable)
+				{
+					nullValueType = type.GetGenericArguments()[0];
+
+					emit
+						.ldarga(pi)
+						.call(type, "get_HasValue")
+						.brfalse(labelNull)
+						;
+				}
+
+				if (nullValueType == nullValue.GetType() && emit.LoadWellKnownValue(nullValue))
+				{
+					if (nullValueType == typeof(string))
+						emit
+							.ldargEx(pi, false)
+							.call(nullValueType, "Equals", nullValueType)
+							.brtrue(labelNull)
+							;
+					else if (isNullable)
+						emit
+							.ldarga(pi)
+							.call(type, "get_Value")
+							.beq(labelNull)
+							;
+					else
+						emit
+							.ldargEx(pi, false)
+							.beq(labelNull)
+						;
+				}
+				else
+				{
+					string nullString = TypeDescriptor.GetConverter(nullValue).ConvertToInvariantString(nullValue);
+					FieldBuilder staticField = CreateNullValueField(nullValueType, nullString);
+					MethodInfo miEquals = new TypeHelper(nullValueType).GetPublicMethod("Equals", nullValueType);
+
+					if (miEquals == null)
+					{
+						// Is it possible?
+						//
+						throw new TypeBuilderException(string.Format(
+							Resources.DataAccessorBuilder_EqualsMethodIsNotPublic, type.FullName));
+					}
+
+					if (isNullable)
+						emit
+							.ldsflda(staticField)
+							.ldarga(pi)
+							.call(pi.ParameterType, "get_Value")
+							;
+					else
+						emit
+							.ldsflda(staticField)
+							.ldarg(pi)
+						;
+
+					if (miEquals.GetParameters()[0].ParameterType.IsClass)
+						emit
+							.boxIfValueType(nullValueType)
+							;
+
+					emit
+						.call(miEquals)
+						.brtrue(labelNull)
+						;
+				}
+			}
+
+			if (type.IsEnum)
+				emit
+					.ldloc(_locManager)
+					.callvirt(typeof(DbManager).GetProperty("MappingSchema").GetGetMethod())
+					;
+
+			emit
+				.ldargEx(pi, true)
+				;
+
+			if (type.IsEnum)
+				emit
+					.ldc_i4_1
+					.callvirt(typeof(MappingSchema), "MapEnumToValue", typeof(object), typeof(bool))
+					;
+
+			if (nullValue != null)
+			{
+				emit
+					.br(labelEndIf)
+					.MarkLabel(labelNull)
+					.ldnull
+					.MarkLabel(labelEndIf)
+					;
+			}
+		}
+
+		void BuildParameter(ParameterInfo pi)
+		{
+			EmitHelper emit = Context.MethodBuilder.Emitter;
+			Type type = pi.ParameterType;
+			object[] attrs = pi.GetCustomAttributes(typeof(ParamNameAttribute), true);
+			string paramName = attrs.Length == 0 ? pi.Name : ((ParamNameAttribute)attrs[0]).Name;
+
+			ParameterDirection direction = !type.IsByRef ? ParameterDirection.Input :
+				pi.IsOut ? ParameterDirection.Output : ParameterDirection.InputOutput;
+
+			emit
+				.ldloc(_locManager)
+				.ldc_i4_((int)direction)
+				;
+
+			if (paramName[0] != '@')
+			{
+				string methodName = _sqlQueryAttribute == null ? "GetSpParameterName" : "GetQueryParameterName";
+				emit
+					.ldarg_0
+					.ldloc(_locManager)
+					.ldstr(paramName)
+					.callvirt(_baseType, methodName, _bindingFlags, typeof(DbManager), typeof(string))
+					;
+			}
+			else
+				emit.ldstr(paramName);
+
+			if (type.IsByRef)
+			{
+				if (_outputParameters == null)
+					_outputParameters = new ArrayList();
+
+				_outputParameters.Add(pi);
+
+				type = type.GetElementType();
+			}
+
+			LoadParameterOrNull(pi, type);
+
+			// Special case for user-defined types.
+			//
+			attrs = pi.GetCustomAttributes(typeof(ParamTypeNameAttribute), true);
+			if (attrs.Length > 0)
+			{
+				emit
+					.ldstr(((ParamTypeNameAttribute)attrs[0]).TypeName)
+					.callvirt(typeof(DbManager), "Parameter",
+										typeof(ParameterDirection), typeof(string), typeof(object), typeof(string))
+					;
+			}
+			else
+			{
+				emit
+					.callvirt(typeof(DbManager), "Parameter",
+										typeof(ParameterDirection), typeof(string), typeof(object))
+					;
+			}
+
+			// Check if parameter type/size is specified.
+			//
+			attrs = pi.GetCustomAttributes(typeof(ParamDbTypeAttribute), true);
+			if (attrs.Length > 0)
+			{
+				emit
+					.dup
+					.ldc_i4_((int)((ParamDbTypeAttribute)attrs[0]).DbType)
+					.callvirt(typeof(IDataParameter), "set_DbType", typeof(DbType))
+					;
+			}
+
+			attrs = pi.GetCustomAttributes(typeof(ParamSizeAttribute), true);
+			if (attrs.Length > 0)
+			{
+				emit
+					.dup
+					.ldc_i4_(((ParamSizeAttribute)attrs[0]).Size)
+					.callvirt(typeof(IDbDataParameter), "set_Size", typeof(int))
+					;
+			}
+		}
+
+		LocalBuilder BuildParametersWithDiscoverParameters()
+		{
+			EmitHelper emit = Context.MethodBuilder.Emitter;
+			LocalBuilder locParams = emit.DeclareLocal(typeof(object[]));
+
+			emit
+				.ldc_i4_(_paramList.Count)
+				.newarr(typeof(object))
+				;
+
+			for (int i = 0; i < _paramList.Count; i++)
+			{
+				ParameterInfo pi = (ParameterInfo)_paramList[i];
+
+				emit
+					.dup
+					.ldc_i4_(i)
+					;
+
+				LoadParameterOrNull(pi, pi.ParameterType);
+
+				emit
+					.stelem_ref
+					.end()
+					;
+			}
+
+			emit.stloc(locParams);
+			return locParams;
+		}
+
+		void StoreParameterValue(LocalBuilder param, ParameterInfo pi, Type type)
+		{
+			EmitHelper emit = Context.MethodBuilder.Emitter;
+			Label labelNull = emit.DefineLabel();
+			Label labelEndIf = emit.DefineLabel();
+
+			object[] attrs = pi.GetCustomAttributes(typeof(ParamNullValueAttribute), true);
+			object nullValue = attrs.Length == 0 ? null : ((ParamNullValueAttribute)attrs[0]).Value;
+
+			if (nullValue != null)
+			{
+				emit
+					.ldarg_0
+					.ldloc(_locManager)
+					.ldloc(param)
+					.callvirt(typeof(IDataParameter).GetProperty("Value").GetGetMethod())
+					.ldloc(param)
+					.callvirt(_baseType, "IsNull", _bindingFlags, typeof(DbManager), typeof(object), typeof(object))
+					.brtrue(labelNull)
+					;
+			}
+
+			if (type.IsEnum)
+			{
+				emit
+					.ldloc(_locManager)
+					.callvirt(typeof(DbManager).GetProperty("MappingSchema").GetGetMethod())
+					.ldloc(param)
+					.callvirt(typeof(IDataParameter).GetProperty("Value").GetGetMethod())
+					.LoadType(type)
+					.callvirt(typeof(MappingSchema), "MapValueToEnum", typeof(object), typeof(Type))
+					.CastFromObject(type)
+					;
+			}
+#if FW4
+			else if (pi.IsRefCursor())
+			{
+				// Make sure the parameter is a List
+				if (!type.GetInterfaces().Contains(typeof(IList)))
+				{
+					throw new Exception("The argument '" + pi.Name + "' must be of type 'IList'");
+				}
+				//Get the generic type of the list
+				Type genericType = type.GetGenericArguments().First();
+
+
+				// Get the data reader to the ref cursor
+				var dataReader = emit.DeclareLocal(typeof(IDataReader));
+				emit
+					.ldloc(_locManager)
+					.callvirt(typeof(DbManager).GetProperty("DataProvider").GetGetMethod())
+					.ldloc(param)
+					.callvirt(typeof(IDataParameter).GetProperty("Value").GetGetMethod())
+					.callvirt(typeof(DataProviderBase), "GetRefCursorDataReader", typeof(object))
+					.CastFromObject(typeof(IDataReader))
+					.stloc(dataReader)
+					;
+
+				// Create the generic methos info to invoke
+				var mapDataReaderToListMethodInfo = typeof (MappingSchema).GetMethod("MapDataReaderToList",
+																						new[]
+																							{
+																								typeof (IDataReader),
+																								typeof (object[])
+																							})
+					.MakeGenericMethod(genericType);
+
+				// Run MapDataReaderToList
+				emit
+					.ldloc(_locManager)
+					.callvirt(typeof(DbManager).GetProperty("MappingSchema").GetGetMethod())
+					.ldloc(dataReader)
+					.ldnull
+					.callvirt(mapDataReaderToListMethodInfo)
+					;
+			}
+#endif
+			else
+			{
+				emit
+					.ldarg_0
+					.ldloc(_locManager)
+					.ldloc(param)
+					.callvirt(typeof(IDataParameter).GetProperty("Value").GetGetMethod())
+					;
+
+				MethodInfo converter = GetConverterMethod(type);
+
+				if (converter == null)
+				{
+					emit
+						.LoadType(type)
+						.ldloc(param)
+						.callvirt(_baseType, "ConvertChangeType", _bindingFlags, typeof(DbManager), typeof(object), typeof(Type), typeof(object))
+						.unboxIfValueType(type)
+						;
+				}
+				else
+				{
+					emit
+						.ldloc(param)
+						.callvirt(converter)
+						;
+				}
+			}
+
+			if (nullValue != null)
+			{
+				emit
+					.br(labelEndIf)
+					.MarkLabel(labelNull);
+
+				if (nullValue.GetType() != type || !emit.LoadWellKnownValue(nullValue))
+				{
+					string nullString = TypeDescriptor.GetConverter(type).ConvertToInvariantString(nullValue);
+					FieldBuilder staticField = CreateNullValueField(type, nullString);
+
+					emit
+						.ldsfld(staticField)
+						;
+				}
+
+				emit
+					.MarkLabel(labelEndIf)
+					;
+			}
+
+			emit.stind(type);
+		}
+
+		void GetOutRefParameters()
+		{
+			EmitHelper emit = Context.MethodBuilder.Emitter;
+
+			if (_outputParameters != null)
+			{
+				LocalBuilder param = emit.DeclareLocal(typeof(IDataParameter));
+
+				foreach (ParameterInfo pi in _outputParameters)
+				{
+					Type type = pi.ParameterType.GetElementType();
+
+					emit
+						.ldarg(pi)
+						;
+
+					// Get parameter.
+					//
+					object[] attrs = pi.GetCustomAttributes(typeof(ParamNameAttribute), true);
+
+					string paramName = attrs.Length == 0 ?
+						pi.Name : ((ParamNameAttribute)attrs[0]).Name;
+
+					emit
+						.ldarg_0
+						.ldloc(_locManager)
+						;
+
+					if (paramName[0] != '@')
+					{
+						string methodName = _sqlQueryAttribute == null ? "GetSpParameterName" : "GetQueryParameterName";
+
+						emit
+							.ldarg_0
+							.ldloc(_locManager)
+							.ldstr(paramName)
+							.callvirt(_baseType, methodName, _bindingFlags, typeof(DbManager), typeof(string))
+							;
+					}
+					else
+						emit.ldstr(paramName);
+
+					emit
+						.callvirt(_baseType, "GetParameter", _bindingFlags, typeof(DbManager), typeof(string))
+						.stloc(param)
+						;
+
+					StoreParameterValue(param, pi, type);
+				}
+			}
+
+			foreach (MapOutputParametersValue v in _mapOutputParameters)
+			{
+				emit
+					.ldloc(_locManager)
+					.ldstrEx(v.ReturnValueMember)
+					.ldarg(v.ParameterInfo)
+					.callvirt(typeof(DbManager), "MapOutputParameters", typeof(string), typeof(object));
+			}
+		}
+
+		static bool IsInterfaceOf(Type type, Type interfaceType)
+		{
+			Type[] types = type.GetInterfaces();
+
+			foreach (Type t in types)
+				if (t == interfaceType)
+					return true;
+
+			return type == interfaceType;
+		}
+
+		private MethodInfo GetConverterMethod(Type type)
+		{
+			if (type.IsEnum)
+				type = Enum.GetUnderlyingType(type);
+
+			Type[] types = new Type[] { typeof(DbManager), typeof(object), typeof(object) };
+			return _baseType.GetMethod("ConvertTo" + type.Name, _bindingFlags, null, types, null);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/DataAccessorT.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,28 @@
+using BLToolkit.Data;
+
+namespace BLToolkit.DataAccess
+{
+	public abstract class DataAccessor<T> : DataAccessor
+	{
+		#region Constructors
+
+		[System.Diagnostics.DebuggerStepThrough]
+		protected DataAccessor()
+		{
+		}
+
+		[System.Diagnostics.DebuggerStepThrough]
+		protected DataAccessor(DbManager dbManager)
+			: base(dbManager)
+		{
+		}
+
+		[System.Diagnostics.DebuggerStepThrough]
+		protected DataAccessor(DbManager dbManager, bool dispose)
+			: base(dbManager, dispose)
+		{
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/DataAccessorTA.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,47 @@
+using BLToolkit.Data;
+using BLToolkit.TypeBuilder;
+
+namespace BLToolkit.DataAccess
+{
+	public abstract class DataAccessor<T,TA> : DataAccessor<T>
+		where TA : DataAccessor<T>
+	{
+		#region Constructors
+
+		[System.Diagnostics.DebuggerStepThrough]
+		protected DataAccessor()
+		{
+		}
+
+		[System.Diagnostics.DebuggerStepThrough]
+		protected DataAccessor(DbManager dbManager)
+			: base(dbManager)
+		{
+		}
+
+		#endregion
+
+		#region CreateInstance
+
+		public static TA CreateInstance()
+		{
+			return TypeFactory.CreateInstance<TA>();
+		}
+
+		public static TA CreateInstance(DbManager dbManager)
+		{
+			return CreateInstance(dbManager, false);
+		}
+
+		public static TA CreateInstance(DbManager dbManager, bool dispose)
+		{
+			TA da = TypeFactory.CreateInstance<TA>();
+
+			da.SetDbManager(dbManager, dispose);
+
+			return da;
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/DataSetTableAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,31 @@
+using System;
+
+using BLToolkit.Common;
+
+namespace BLToolkit.DataAccess
+{
+	[AttributeUsage(AttributeTargets.Method, AllowMultiple=false)]
+	public class DataSetTableAttribute : Attribute
+	{
+		public DataSetTableAttribute()
+		{
+		}
+
+		public DataSetTableAttribute(string name)
+		{
+			_nameOrIndex = name;
+		}
+
+		public DataSetTableAttribute(int index)
+		{
+			_nameOrIndex = index;
+		}
+
+		private NameOrIndexParameter _nameOrIndex;
+		public  NameOrIndexParameter  NameOrIndex
+		{
+			get { return _nameOrIndex; }
+			set { _nameOrIndex = value; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/DbTypeAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,23 @@
+using System;
+using System.Data;
+
+namespace BLToolkit.DataAccess
+{
+	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false), CLSCompliant(false)]
+	public sealed class DbTypeAttribute : Attribute
+	{
+		public DbType DbType { get; set; }
+		public int?   Size   { get; set; }
+
+		public DbTypeAttribute(DbType sqlDbType)
+		{
+			DbType = sqlDbType;
+		}
+
+		public DbTypeAttribute(DbType sqlDbType, int size)
+		{
+			DbType = sqlDbType;
+			Size   = size;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/DestinationAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+using System;
+
+namespace BLToolkit.DataAccess
+{
+	[AttributeUsage(AttributeTargets.Parameter)]
+	public class DestinationAttribute : NoMapAttribute
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/Direction.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,54 @@
+using System;
+
+namespace BLToolkit.DataAccess
+{
+	[AttributeUsage(AttributeTargets.Parameter), CLSCompliant(false)]
+	public abstract class Direction : Attribute
+	{
+		protected string[] _members;
+		public    string[]  Members
+		{
+			get { return _members;  }
+			set { _members = value; }
+		}
+
+		public class OutputAttribute : Direction
+		{
+			public OutputAttribute(params string[] members)
+			{
+				_members = members;
+			}
+		}
+
+		public class InputOutputAttribute : Direction
+		{
+			public InputOutputAttribute(params string[] members)
+			{
+				_members = members;
+			}
+		}
+
+		public class IgnoreAttribute : Direction
+		{
+			public IgnoreAttribute(params string[] members)
+			{
+				_members = members;
+			}
+		}
+
+		public class ReturnValueAttribute : Direction
+		{
+			protected string _member;
+			public    string  Member
+			{
+				get { return _member;  }
+				set { _member = value; }
+			}
+
+			public ReturnValueAttribute(string member)
+			{
+				_member = member;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/DiscoverParametersAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,24 @@
+using System;
+
+namespace BLToolkit.DataAccess
+{
+	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
+	public class DiscoverParametersAttribute : Attribute
+	{
+		public DiscoverParametersAttribute()
+		{
+			_discover = true;
+		}
+
+		public DiscoverParametersAttribute(bool discover)
+		{
+			_discover = discover;
+		}
+
+		private readonly bool _discover;
+		public  bool           Discover
+		{
+			get { return _discover; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/FormatAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,24 @@
+using System;
+
+namespace BLToolkit.DataAccess
+{
+	[AttributeUsage(AttributeTargets.Parameter)]
+	public class FormatAttribute : NoMapAttribute
+	{
+		public FormatAttribute()
+		{
+			_index = int.MaxValue;
+		}
+
+		public FormatAttribute(int index)
+		{
+			_index = index;
+		}
+
+		private readonly int _index;
+		public           int  Index
+		{
+			get { return _index; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/ISqlQueryT.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,47 @@
+using System.Collections.Generic;
+using BLToolkit.Data;
+
+namespace BLToolkit.DataAccess
+{
+    public interface ISqlQueryT<T>
+    {
+        T SelectByKey(DbManager db, params object[] keys);
+        T SelectByKey(params object[] keys);
+        List<T> SelectAll(DbManager db);
+
+        TL SelectAll<TL>(DbManager db, TL list)
+            where TL : IList<T>;
+
+        TL SelectAll<TL>(DbManager db)
+            where TL : IList<T>, new();
+
+        List<T> SelectAll();
+
+        TL SelectAll<TL>(TL list)
+            where TL : IList<T>;
+
+        TL SelectAll<TL>()
+            where TL : IList<T>, new();
+
+        int Insert(DbManager db, T obj);
+        int Insert(T obj);
+        int Insert(DbManager db, int maxBatchSize, IEnumerable<T> list);
+        int Insert(int maxBatchSize, IEnumerable<T> list);
+        int Insert(DbManager db, IEnumerable<T> list);
+        int Insert(IEnumerable<T> list);
+        int Update(DbManager db, T obj);
+        int Update(T obj);
+        int Update(DbManager db, int maxBatchSize, IEnumerable<T> list);
+        int Update(int maxBatchSize, IEnumerable<T> list);
+        int Update(DbManager db, IEnumerable<T> list);
+        int Update(IEnumerable<T> list);
+        int DeleteByKey(DbManager db, params object[] key);
+        int DeleteByKey(params object[] key);
+        int Delete(DbManager db, T obj);
+        int Delete(T obj);
+        int Delete(DbManager db, int maxBatchSize, IEnumerable<T> list);
+        int Delete(int maxBatchSize, IEnumerable<T> list);
+        int Delete(DbManager db, IEnumerable<T> list);
+        int Delete(IEnumerable<T> list);
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/IdentityAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,16 @@
+using System;
+
+namespace BLToolkit.DataAccess
+{
+	[Serializable]
+	[AttributeUsage(
+		AttributeTargets.Field | AttributeTargets.Property |
+		AttributeTargets.Class | AttributeTargets.Interface,
+		AllowMultiple = true)]
+	public class IdentityAttribute : NonUpdatableAttribute
+	{
+		public IdentityAttribute() : base(true, true, true)
+		{
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/IndexAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,50 @@
+using System;
+
+using BLToolkit.Common;
+using BLToolkit.Properties;
+
+namespace BLToolkit.DataAccess
+{
+	[AttributeUsage(AttributeTargets.Method), CLSCompliant(false)]
+	public class IndexAttribute : Attribute
+	{
+		public IndexAttribute(params string[] names)
+		{
+			if (null == names)
+				throw new ArgumentNullException("names");
+
+			if (names.Length == 0)
+				throw new ArgumentException(Resources.MapIndex_EmptyNames, "names");
+
+			_fields = NameOrIndexParameter.FromStringArray(names);
+		}
+
+		public IndexAttribute(params int[] indices)
+		{
+			if (null == indices)
+				throw new ArgumentNullException("indices");
+
+			if (indices.Length == 0)
+				throw new ArgumentException(Resources.MapIndex_EmptyIndices, "indices");
+
+			_fields = NameOrIndexParameter.FromIndexArray(indices);
+		}
+
+		public IndexAttribute(params NameOrIndexParameter[] fields)
+		{
+			if (null == fields)
+				throw new ArgumentNullException("fields");
+
+			if (fields.Length == 0)
+				throw new ArgumentException(Resources.MapIndex_EmptyFields, "fields");
+			
+			_fields = fields;
+		}
+
+		private readonly NameOrIndexParameter[] _fields;
+		public           NameOrIndexParameter[]  Fields
+		{
+			get { return _fields; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/NoMapAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,26 @@
+using System;
+
+namespace BLToolkit.DataAccess
+{
+	[AttributeUsage(AttributeTargets.Parameter)]
+	public class NoMapAttribute : Attribute
+	{
+		public NoMapAttribute()
+		{
+			_noMap = true;
+		}
+
+		public NoMapAttribute(bool noMap)
+		{
+			_noMap = noMap;
+		}
+
+		private bool _noMap;
+		public  bool  NoMap
+		{
+			get { return _noMap;  }
+			set { _noMap = value; }
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/NonUpdatableAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,29 @@
+using System;
+
+namespace BLToolkit.DataAccess
+{
+	[Serializable]
+	[AttributeUsage(
+		AttributeTargets.Field | AttributeTargets.Property |
+		AttributeTargets.Class | AttributeTargets.Interface,
+		AllowMultiple = true)]
+	public class NonUpdatableAttribute : Attribute
+	{
+		public NonUpdatableAttribute()
+			: this(true, true, false)
+		{
+		}
+
+		public NonUpdatableAttribute(bool onInsert, bool onUpdate, bool isIdentity)
+		{
+			OnInsert   = onInsert;
+			OnUpdate   = onUpdate;
+			IsIdentity = isIdentity;
+		}
+
+		public bool   OnInsert   { get; set; }
+		public bool   OnUpdate   { get; set; }
+		public bool   IsIdentity { get; set; }
+		public string FieldName  { get; set; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/ObjectTypeAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+using System;
+
+namespace BLToolkit.DataAccess
+{
+	[JetBrains.Annotations.BaseTypeRequired(typeof(DataAccessor))]
+	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
+	public class ObjectTypeAttribute : Attribute
+	{
+		public ObjectTypeAttribute(Type objectType)
+		{
+			_objectType = objectType;
+		}
+
+		private readonly Type _objectType;
+		public           Type  ObjectType
+		{
+			get { return _objectType; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/ParamDbTypeAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+using System;
+using System.Data;
+
+namespace BLToolkit.DataAccess
+{
+	[AttributeUsage(AttributeTargets.Parameter)]
+	public class ParamDbTypeAttribute : Attribute
+	{
+		public ParamDbTypeAttribute(DbType dbType)
+		{
+			_dbType = dbType;
+		}
+
+		private readonly DbType _dbType;
+		public           DbType  DbType
+		{
+			get { return _dbType; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/ParamNameAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,19 @@
+using System;
+
+namespace BLToolkit.DataAccess
+{
+	[AttributeUsage(AttributeTargets.Parameter)]
+	public class ParamNameAttribute : Attribute
+	{
+		public ParamNameAttribute(string name)
+		{
+			_name = name;
+		}
+
+		private readonly string _name;
+		public           string  Name
+		{
+			get { return _name; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/ParamNullValue.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,25 @@
+using System;
+using System.ComponentModel;
+
+namespace BLToolkit.DataAccess
+{
+	[AttributeUsage(AttributeTargets.Parameter)]
+	public class ParamNullValueAttribute : Attribute
+	{
+		public ParamNullValueAttribute(object value)
+		{
+			_value = value;
+		}
+
+		public ParamNullValueAttribute(Type type, string value)
+		{
+			_value = TypeDescriptor.GetConverter(type).ConvertFromInvariantString(value);
+		}
+
+		private readonly object _value;
+		public           object  Value
+		{
+			get { return _value; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/ParamSizeAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,19 @@
+using System;
+
+namespace BLToolkit.DataAccess
+{
+	[AttributeUsage(AttributeTargets.Parameter)]
+	public class ParamSizeAttribute : Attribute
+	{
+		public ParamSizeAttribute(int size)
+		{
+			_size = size;
+		}
+
+		private readonly int _size;
+		public           int  Size
+		{
+			get { return _size; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/ParamTypeNameAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,19 @@
+using System;
+
+namespace BLToolkit.DataAccess
+{
+	[AttributeUsage(AttributeTargets.Parameter)]
+	public class ParamTypeNameAttribute : Attribute
+	{
+		public ParamTypeNameAttribute(string typeName)
+		{
+			_typeName = typeName;
+		}
+
+		private readonly string _typeName;
+		public           string  TypeName
+		{
+			get { return _typeName; }
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/PrimaryKeyAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,24 @@
+using System;
+
+namespace BLToolkit.DataAccess
+{
+	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
+	public sealed class PrimaryKeyAttribute : Attribute
+	{
+		public PrimaryKeyAttribute()
+		{
+			_order = -1;
+		}
+
+		public PrimaryKeyAttribute(int order)
+		{
+			_order = order;
+		}
+
+		private readonly int _order;
+		public           int  Order
+		{
+			get { return _order; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/PrimaryKeyGeneratorType.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,7 @@
+namespace BLToolkit.DataAccess
+{
+    public enum PrimaryKeyGeneratorType
+    {
+        Sequence,
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/ScalarAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,17 @@
+using System;
+
+namespace BLToolkit.DataAccess
+{
+	/// <summary>
+	/// This attribute is used to represent that a type is a UDT type linked to a UDT Type in the DB (Used most commanly in Oracle)
+	/// 
+	/// Without this attribute if you try to use the code generation method to call a Stored Procedure in the DB and try to pass the UDT as a parm 
+	/// BLToolkit will flaten the object and cause error's
+	/// 
+	/// Another solution is to convert your UDT to a Struct which also causes BLToolkits 'IsScaler()' Method to return true.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
+	public class ScalarAttribute : Attribute
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/ScalarFieldNameAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,27 @@
+using System;
+
+using BLToolkit.Common;
+
+namespace BLToolkit.DataAccess
+{
+	[AttributeUsage(AttributeTargets.Method)]
+	public class ScalarFieldNameAttribute : Attribute
+	{
+		public ScalarFieldNameAttribute(string name)
+		{
+			_nameOrIndex = name;
+		}
+
+		public ScalarFieldNameAttribute(int index)
+		{
+			_nameOrIndex = index;
+		}
+
+		private NameOrIndexParameter _nameOrIndex;
+		public  NameOrIndexParameter  NameOrIndex
+		{
+			get { return _nameOrIndex; }
+			set { _nameOrIndex = value; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/ScalarSourceAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,35 @@
+using System;
+
+using BLToolkit.Data;
+
+namespace BLToolkit.DataAccess
+{
+	[AttributeUsage(AttributeTargets.Method)]
+	public class ScalarSourceAttribute : ScalarFieldNameAttribute
+	{
+		public ScalarSourceAttribute(ScalarSourceType scalarType)
+			: base(0)
+		{
+			_scalarType = scalarType;
+		}
+
+		public ScalarSourceAttribute(ScalarSourceType scalarType, string name)
+			: base(name)
+		{
+			_scalarType = scalarType;
+		}
+
+		public ScalarSourceAttribute(ScalarSourceType scalarType, int index)
+			: base(index)
+		{
+			_scalarType = scalarType;
+		}
+		
+		private ScalarSourceType _scalarType;
+		public  ScalarSourceType  ScalarType
+		{
+			get { return _scalarType; }
+			set { _scalarType = value; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/SequenceKeyGenerator.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,23 @@
+using System;
+
+namespace BLToolkit.DataAccess
+{
+	public class SequenceKeyGenerator : KeyGenerator
+	{
+		private readonly string _sequence;
+
+		public SequenceKeyGenerator(string sequence)
+		{
+			_sequence = sequence;
+		}
+
+		public string Sequence
+		{
+			get { return _sequence; }
+		}
+	}
+
+	public class KeyGenerator
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/SprocNameAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,19 @@
+using System;
+
+namespace BLToolkit.DataAccess
+{
+	[AttributeUsage(AttributeTargets.Method)]
+	public class SprocNameAttribute : Attribute
+	{
+		public SprocNameAttribute(string name)
+		{
+			_name = name;
+		}
+
+		private readonly string _name;
+		public           string  Name
+		{
+			get { return _name; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/SprocQuery.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,282 @@
+using System;
+using System.Collections;
+
+using BLToolkit.Data;
+
+namespace BLToolkit.DataAccess
+{
+	public class SprocQuery : DataAccessorBase
+	{
+		#region Constructors
+
+		public SprocQuery()
+		{
+		}
+
+		public SprocQuery(DbManager dbManager)
+			: base(dbManager)
+		{
+		}
+
+		public SprocQuery(DbManager dbManager, bool dispose)
+			: base(dbManager, dispose)
+		{
+		}
+
+		#endregion
+
+		#region SelectByKey
+
+		public virtual object SelectByKey(DbManager db, Type type, params object[] key)
+		{
+			return db
+				.SetSpCommand(GetSpName(type, "SelectByKey"), key)
+				.ExecuteObject(type);
+		}
+
+		public virtual object SelectByKey(Type type, params object[] key)
+		{
+			DbManager db = GetDbManager();
+
+			try
+			{
+				return SelectByKey(db, type, key);
+			}
+			finally
+			{
+				Dispose(db);
+			}
+		}
+
+		public virtual T SelectByKey<T>(DbManager db, params object[] key)
+		{
+			return db
+				.SetSpCommand(GetSpName(typeof(T), "SelectByKey"), key)
+				.ExecuteObject<T>();
+		}
+
+		public virtual T SelectByKey<T>(params object[] key)
+		{
+			DbManager db = GetDbManager();
+
+			try
+			{
+				return SelectByKey<T>(db, key);
+			}
+			finally
+			{
+				Dispose(db);
+			}
+		}
+
+		#endregion
+
+		#region SelectAll
+
+		public virtual ArrayList SelectAll(DbManager db, Type type)
+		{
+			return db
+				.SetSpCommand(GetSpName(type, "SelectAll"))
+				.ExecuteList(type);
+		}
+
+		public virtual IList SelectAll(DbManager db, IList list, Type type)
+		{
+			return db
+				.SetSpCommand(GetSpName(type, "SelectAll"))
+				.ExecuteList(list, type);
+		}
+
+		public virtual ArrayList SelectAll(Type type)
+		{
+			DbManager db = GetDbManager();
+
+			try
+			{
+				return SelectAll(db, type);
+			}
+			finally
+			{
+				Dispose(db);
+			}
+		}
+
+		public virtual IList SelectAll(IList list, Type type)
+		{
+			DbManager db = GetDbManager();
+
+			try
+			{
+				return SelectAll(db, list, type);
+			}
+			finally
+			{
+				Dispose(db);
+			}
+		}
+
+		public virtual System.Collections.Generic.List<T> SelectAll<T>(DbManager db)
+		{
+			return db
+				.SetSpCommand(GetSpName(typeof(T), "SelectAll"))
+				.ExecuteList<T>();
+		}
+
+		public virtual L SelectAll<L,T>(DbManager db, L list)
+			where L : System.Collections.Generic.IList<T>
+		{
+			return db
+				.SetSpCommand(GetSpName(typeof(T), "SelectAll"))
+				.ExecuteList<L,T>(list);
+		}
+
+		public virtual L SelectAll<L, T>(DbManager db)
+			where L : System.Collections.Generic.IList<T>, new()
+		{
+			return SelectAll<L, T>(db, new L());
+		}
+
+		public virtual System.Collections.Generic.List<T> SelectAll<T>()
+		{
+			DbManager db = GetDbManager();
+
+			try
+			{
+				return SelectAll<T>(db);
+			}
+			finally
+			{
+				Dispose(db);
+			}
+		}
+
+		public virtual L SelectAll<L,T>(L list)
+			where L : System.Collections.Generic.IList<T>
+		{
+			DbManager db = GetDbManager();
+
+			try
+			{
+				return SelectAll<L,T>(db, list);
+			}
+			finally
+			{
+				Dispose(db);
+			}
+		}
+
+		public virtual L SelectAll<L,T>()
+			where L : System.Collections.Generic.IList<T>, new()
+		{
+			return SelectAll<L,T>(new L());
+		}
+
+		#endregion
+
+		#region Insert
+
+		public virtual void Insert(DbManager db, object obj)
+		{
+			db
+				.SetSpCommand(
+					GetSpName(obj.GetType(), "Insert"),
+					db.CreateParameters(obj))
+				.ExecuteNonQuery();
+		}
+
+		public virtual void Insert(object obj)
+		{
+			var db = GetDbManager();
+
+			try
+			{
+				Insert(db, obj);
+			}
+			finally
+			{
+				Dispose(db);
+			}
+		}
+
+		#endregion
+
+		#region Update
+
+		public virtual int Update(DbManager db, object obj)
+		{
+			return db
+				.SetSpCommand(
+					GetSpName(obj.GetType(), "Update"),
+					db.CreateParameters(obj))
+				.ExecuteNonQuery();
+		}
+
+		public virtual int Update(object obj)
+		{
+			DbManager db = GetDbManager();
+
+			try
+			{
+				return Update(db, obj);
+			}
+			finally
+			{
+				Dispose(db);
+			}
+		}
+
+		#endregion
+
+		#region DeleteByKey
+
+		public virtual int DeleteByKey(DbManager db, Type type, params object[] key)
+		{
+			return db
+				.SetSpCommand(GetSpName(type, "Delete"), key)
+				.ExecuteNonQuery();
+		}
+
+		public virtual int DeleteByKey(Type type, params object[] key)
+		{
+			DbManager db = GetDbManager();
+
+			try
+			{
+				return DeleteByKey(db, type, key);
+			}
+			finally
+			{
+				Dispose(db);
+			}
+		}
+
+		#endregion
+
+		#region Delete
+
+		public virtual int Delete(DbManager db, object obj)
+		{
+			return db
+				.SetSpCommand(
+					GetSpName(obj.GetType(), "Delete"), 
+					db.CreateParameters(obj))
+				.ExecuteNonQuery();
+		}
+
+		public virtual int Delete(object obj)
+		{
+			DbManager db = GetDbManager();
+
+			try
+			{
+				return Delete(db, obj);
+			}
+			finally
+			{
+				Dispose(db);
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/SprocQueryT.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,218 @@
+using System.Collections.Generic;
+
+using BLToolkit.Data;
+
+namespace BLToolkit.DataAccess
+{
+	public class SprocQuery<T> : DataAccessorBase
+	{
+		#region Constructors
+
+		public SprocQuery()
+		{
+		}
+
+		public SprocQuery(DbManager dbManager)
+			: base(dbManager)
+		{
+		}
+
+		public SprocQuery(DbManager dbManager, bool dispose)
+			: base(dbManager, dispose)
+		{
+		}
+
+		#endregion
+
+		#region SelectByKey
+
+		public virtual T SelectByKey(DbManager db, params object[] key)
+		{
+			return db
+				.SetSpCommand(GetSpName(typeof(T), "SelectByKey"), key)
+				.ExecuteObject<T>();
+		}
+
+		public virtual T SelectByKey(params object[] key)
+		{
+			DbManager db = GetDbManager();
+
+			try
+			{
+				return SelectByKey(db, key);
+			}
+			finally
+			{
+				Dispose(db);
+			}
+		}
+
+		#endregion
+
+		#region SelectAll
+
+		public virtual List<T> SelectAll(DbManager db)
+		{
+			return db
+				.SetSpCommand(GetSpName(typeof(T), "SelectAll"))
+				.ExecuteList<T>();
+		}
+
+		public virtual L SelectAll<L>(DbManager db, L list)
+			where L : IList<T>
+		{
+			return db
+				.SetSpCommand(GetSpName(typeof(T), "SelectAll"))
+				.ExecuteList<L,T>(list);
+		}
+
+		public virtual L SelectAll<L>(DbManager db)
+			where L : IList<T>, new()
+		{
+			return SelectAll<L>(db, new L());
+		}
+
+		public virtual List<T> SelectAll()
+		{
+			DbManager db = GetDbManager();
+
+			try
+			{
+				return SelectAll(db);
+			}
+			finally
+			{
+				Dispose(db);
+			}
+		}
+
+		public virtual L SelectAll<L>(L list)
+			where L : IList<T>
+		{
+			DbManager db = GetDbManager();
+
+			try
+			{
+				return SelectAll(db, list);
+			}
+			finally
+			{
+				Dispose(db);
+			}
+		}
+
+		public virtual L SelectAll<L>()
+			where L : IList<T>, new()
+		{
+			return SelectAll<L>(new L());
+		}
+
+		#endregion
+
+		#region Insert
+
+		public virtual void Insert(DbManager db, T obj)
+		{
+			db
+			  .SetSpCommand(
+					GetSpName(obj.GetType(), "Insert"),
+					db.CreateParameters(obj))
+			  .ExecuteNonQuery();
+		}
+
+		public virtual void Insert(T obj)
+		{
+			var db = GetDbManager();
+
+			try
+			{
+				Insert(db, obj);
+			}
+			finally
+			{
+				Dispose(db);
+			}
+		}
+
+		#endregion
+
+		#region Update
+
+		public virtual int Update(DbManager db, T obj)
+		{
+			return db
+				.SetSpCommand(
+					GetSpName(obj.GetType(), "Update"),
+					db.CreateParameters(obj))
+				.ExecuteNonQuery();
+		}
+
+		public virtual int Update(T obj)
+		{
+			DbManager db = GetDbManager();
+
+			try
+			{
+				return Update(db, obj);
+			}
+			finally
+			{
+				Dispose(db);
+			}
+		}
+
+		#endregion
+
+		#region DeleteByKey
+
+		public virtual int DeleteByKey(DbManager db, params object[] key)
+		{
+			return db
+				.SetSpCommand(GetSpName(typeof(T), "Delete"), key)
+				.ExecuteNonQuery();
+		}
+
+		public virtual int DeleteByKey(params object[] key)
+		{
+			DbManager db = GetDbManager();
+
+			try
+			{
+				return DeleteByKey(db, key);
+			}
+			finally
+			{
+				Dispose(db);
+			}
+		}
+
+		#endregion
+
+		#region Delete
+
+		public virtual int Delete(DbManager db, T obj)
+		{
+			return db
+				.SetSpCommand(
+					GetSpName(obj.GetType(), "Delete"), 
+					db.CreateParameters(obj))
+				.ExecuteNonQuery();
+		}
+
+		public virtual int Delete(T obj)
+		{
+			DbManager db = GetDbManager();
+
+			try
+			{
+				return Delete(db, obj);
+			}
+			finally
+			{
+				Dispose(db);
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/SqlIgnoreAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,25 @@
+using System;
+
+namespace BLToolkit.DataAccess
+{
+	[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
+	public class SqlIgnoreAttribute : Attribute
+	{
+		public SqlIgnoreAttribute()
+		{
+			_ignore = true;
+		}
+
+		public SqlIgnoreAttribute(bool ignore)
+		{
+			_ignore = ignore;
+		}
+
+		private bool _ignore;
+		public  bool  Ignore
+		{
+			get { return _ignore;  }
+			set { _ignore = value; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/SqlQuery.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,336 @@
+using System;
+using System.Collections;
+
+using BLToolkit.Data;
+using BLToolkit.Reflection.Extension;
+
+namespace BLToolkit.DataAccess
+{
+	public class SqlQuery : SqlQueryBase
+	{
+		#region Constructors
+
+		public SqlQuery()
+		{
+		}
+
+		public SqlQuery(DbManager dbManager)
+			: base(dbManager)
+		{
+		}
+
+		public SqlQuery(DbManager dbManager, bool dispose)
+			: base(dbManager, dispose)
+		{
+		}
+
+		public SqlQuery(ExtensionList extensions)
+		{
+			Extensions = extensions;
+		}
+
+		#endregion
+
+		#region Overrides
+
+		public SqlQueryInfo GetSqlQueryInfo<T>(DbManager db, string actionName)
+		{
+			return base.GetSqlQueryInfo(db, typeof(T), actionName);
+		}
+
+		#endregion
+
+		#region SelectByKey
+
+		public virtual object SelectByKey(DbManager db, Type type, params object[] keys)
+		{
+			var query = GetSqlQueryInfo(db, type, "SelectByKey");
+
+			return db
+				.SetCommand(query.QueryText, query.GetParameters(db, keys))
+				.ExecuteObject(type);
+		}
+
+		public virtual object SelectByKey(Type type, params object[] keys)
+		{
+			var db = GetDbManager();
+
+			try
+			{
+				return SelectByKey(db, type, keys);
+			}
+			finally
+			{
+				if (DisposeDbManager)
+					db.Dispose();
+			}
+		}
+
+		public virtual T SelectByKey<T>(DbManager db, params object[] keys)
+		{
+			var query = GetSqlQueryInfo(db, typeof(T), "SelectByKey");
+
+			return db
+				.SetCommand(query.QueryText, query.GetParameters(db, keys))
+				.ExecuteObject<T>();
+		}
+
+		public virtual T SelectByKey<T>(params object[] keys)
+		{
+			var db = GetDbManager();
+
+			try
+			{
+				return SelectByKey<T>(db, keys);
+			}
+			finally
+			{
+				if (DisposeDbManager)
+					db.Dispose();
+			}
+		}
+
+		#endregion
+
+		#region SelectAll
+
+		public virtual ArrayList SelectAll(DbManager db, Type type)
+		{
+			var query = GetSqlQueryInfo(db, type, "SelectAll");
+
+			return db
+				.SetCommand(query.QueryText)
+				.ExecuteList(type);
+		}
+
+		public virtual IList SelectAll(DbManager db, IList list, Type type)
+		{
+			var query = GetSqlQueryInfo(db, type, "SelectAll");
+
+			return db
+				.SetCommand(query.QueryText)
+				.ExecuteList(list, type);
+		}
+
+		public virtual ArrayList SelectAll(Type type)
+		{
+			var db = GetDbManager();
+
+			try
+			{
+				return SelectAll(db, type);
+			}
+			finally
+			{
+				Dispose(db);
+			}
+		}
+
+		public virtual IList SelectAll(IList list, Type type)
+		{
+			var db = GetDbManager();
+
+			try
+			{
+				return SelectAll(db, list, type);
+			}
+			finally
+			{
+				Dispose(db);
+			}
+		}
+
+		public virtual System.Collections.Generic.List<T> SelectAll<T>(DbManager db)
+		{
+			var query = GetSqlQueryInfo(db, typeof(T), "SelectAll");
+
+			return db
+				.SetCommand(query.QueryText)
+				.ExecuteList<T>();
+		}
+
+		public virtual TL SelectAll<TL,T>(DbManager db, TL list)
+			where TL : System.Collections.Generic.IList<T>
+		{
+			var query = GetSqlQueryInfo(db, typeof(T), "SelectAll");
+
+			return db
+				.SetCommand(query.QueryText)
+				.ExecuteList<TL,T>(list);
+		}
+
+		public virtual TL SelectAll<TL,T>(DbManager db)
+			where TL : System.Collections.Generic.IList<T>, new()
+		{
+			return SelectAll<TL,T>(db, new TL());
+		}
+
+		public virtual System.Collections.Generic.List<T> SelectAll<T>()
+		{
+			var db = GetDbManager();
+
+			try
+			{
+				return SelectAll<T>(db);
+			}
+			finally
+			{
+				Dispose(db);
+			}
+		}
+
+		public virtual TL SelectAll<TL,T>(TL list)
+			where TL : System.Collections.Generic.IList<T>
+		{
+			var db = GetDbManager();
+
+			try
+			{
+				return SelectAll<TL,T>(db, list);
+			}
+			finally
+			{
+				Dispose(db);
+			}
+		}
+
+		public virtual TL SelectAll<TL,T>()
+			where TL : System.Collections.Generic.IList<T>, new()
+		{
+			return SelectAll<TL,T>(new TL());
+		}
+
+		#endregion
+
+		#region Insert
+
+		public virtual int Insert(DbManager db, object obj)
+		{
+			var query = GetSqlQueryInfo(db, obj.GetType(), "Insert");
+
+			return db
+				.SetCommand(query.QueryText, query.GetParameters(db, obj))
+				.ExecuteNonQuery();
+		}
+
+		public virtual int Insert(object obj)
+		{
+			var db = GetDbManager();
+
+			try
+			{
+				return Insert(db, obj);
+			}
+			finally
+			{
+				Dispose(db);
+			}
+		}
+
+		#endregion
+
+		#region Update
+
+		public virtual int Update(DbManager db, object obj)
+		{
+			var query = GetSqlQueryInfo(db, obj.GetType(), "Update");
+
+			return db
+				.SetCommand(query.QueryText, query.GetParameters(db, obj))
+				.ExecuteNonQuery();
+		}
+
+		public virtual int Update(object obj)
+		{
+			var db = GetDbManager();
+
+			try
+			{
+				return Update(db, obj);
+			}
+			finally
+			{
+				Dispose(db);
+			}
+		}
+
+		#endregion
+
+		#region DeleteByKey
+
+		public virtual int DeleteByKey(DbManager db, Type type, params object[] key)
+		{
+			var query = GetSqlQueryInfo(db, type, "Delete");
+
+			return db
+				.SetCommand(query.QueryText, query.GetParameters(db, key))
+				.ExecuteNonQuery();
+		}
+
+		public virtual int DeleteByKey(Type type, params object[] key)
+		{
+			var db = GetDbManager();
+
+			try
+			{
+				return DeleteByKey(db, type, key);
+			}
+			finally
+			{
+				Dispose(db);
+			}
+		}
+
+		public virtual int DeleteByKey<T>(DbManager db, params object[] key)
+		{
+			var query = GetSqlQueryInfo(db, typeof(T), "Delete");
+
+			return db
+				.SetCommand(query.QueryText, query.GetParameters(db, key))
+				.ExecuteNonQuery();
+		}
+
+		public virtual int DeleteByKey<T>(params object[] key)
+		{
+			var db = GetDbManager();
+
+			try
+			{
+				return DeleteByKey<T>(db, key);
+			}
+			finally
+			{
+				Dispose(db);
+			}
+		}
+
+		#endregion
+
+		#region Delete
+
+		public virtual int Delete(DbManager db, object obj)
+		{
+			var query = GetSqlQueryInfo(db, obj.GetType(), "Delete");
+
+			return db
+				.SetCommand(query.QueryText, query.GetParameters(db, obj))
+				.ExecuteNonQuery();
+		}
+
+		public virtual int Delete(object obj)
+		{
+			var db = GetDbManager();
+
+			try
+			{
+				return Delete(db, obj);
+			}
+			finally
+			{
+				Dispose(db);
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/SqlQueryAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,46 @@
+using System;
+
+using BLToolkit.Data;
+
+namespace BLToolkit.DataAccess
+{
+	[JetBrains.Annotations.BaseTypeRequired(typeof(DataAccessor))]
+	[AttributeUsage(AttributeTargets.Method)]
+	public class SqlQueryAttribute : Attribute
+	{
+		public SqlQueryAttribute()
+		{
+		}
+
+		public SqlQueryAttribute(string sqlText)
+		{
+			_sqlText = sqlText;
+		}
+
+		private string _sqlText;
+		public  string  SqlText
+		{
+			get { return _sqlText;  }
+			set { _sqlText = value; }
+		}
+
+		private bool _isDynamic;
+		public  bool  IsDynamic
+		{
+			get { return _isDynamic;  }
+			set { _isDynamic = value; }
+		}
+
+		private int _id = int.MinValue;
+		public  int  ID
+		{
+			get { return _id;  }
+			set { _id = value; _isDynamic = value != int.MinValue; }
+		}
+
+		public virtual string GetSqlText(DataAccessor accessor, DbManager dbManager)
+		{
+			return _sqlText;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/SqlQueryBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,384 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Text;
+
+using BLToolkit.Aspects;
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+using BLToolkit.Reflection.Extension;
+
+namespace BLToolkit.DataAccess
+{
+	public abstract class SqlQueryBase : DataAccessorBase
+	{
+		#region Constructors
+
+		protected SqlQueryBase()
+		{
+		}
+
+		protected SqlQueryBase(DbManager dbManager)
+			: base(dbManager)
+		{
+		}
+
+		protected SqlQueryBase(DbManager dbManager, bool dispose)
+			: base(dbManager, dispose)
+		{
+		}
+
+		#endregion
+
+		#region Protected Members
+
+		[NoInterception]
+		protected virtual MemberMapper[] GetFieldList(ObjectMapper om)
+		{
+			var list = new List<MemberMapper>(om.Count);
+
+			foreach (MemberMapper mm in om)
+				if (mm.MapMemberInfo.SqlIgnore == false)
+					list.Add(mm);
+
+			return list.ToArray();
+		}
+
+		[NoInterception]
+		protected virtual MemberMapper[] GetNonKeyFieldList(ObjectMapper om)
+		{
+			var typeExt = TypeExtension.GetTypeExtension(om.TypeAccessor.OriginalType, Extensions);
+			var list    = new List<MemberMapper>();
+
+			foreach (MemberMapper mm in om)
+			{
+				if (mm.MapMemberInfo.SqlIgnore)
+					continue;
+
+				var ma = mm.MapMemberInfo.MemberAccessor;
+
+				bool isSet;
+				MappingSchema.MetadataProvider.GetPrimaryKeyOrder(om.TypeAccessor.OriginalType, typeExt, ma, out isSet);
+
+				if (!isSet)
+					list.Add(mm);
+			}
+
+			return list.ToArray();
+		}
+
+		struct MemberOrder
+		{
+			public MemberOrder(MemberMapper memberMapper, int order)
+			{
+				MemberMapper = memberMapper;
+				Order        = order;
+			}
+
+			public readonly MemberMapper MemberMapper;
+			public readonly int          Order;
+		}
+
+		private static readonly Hashtable _keyList = new Hashtable();
+
+		[NoInterception]
+		protected internal virtual MemberMapper[] GetKeyFieldList(DbManager db, Type type)
+		{
+			var key    = type.FullName + "$" + db.DataProvider.UniqueName;
+			var mmList = (MemberMapper[])_keyList[key];
+
+			if (mmList == null)
+			{
+				var typeExt = TypeExtension.GetTypeExtension(type, Extensions);
+				var list    = new List<MemberOrder>();
+
+				foreach (MemberMapper mm in db.MappingSchema.GetObjectMapper(type))
+				{
+					if (mm.MapMemberInfo.SqlIgnore)
+						continue;
+
+					var ma = mm.MapMemberInfo.MemberAccessor;
+
+					if (TypeHelper.IsScalar(ma.Type))
+					{
+						bool isSet;
+						var order = MappingSchema.MetadataProvider.GetPrimaryKeyOrder(type, typeExt, ma, out isSet);
+
+						if (isSet)
+							list.Add(new MemberOrder(mm, order));
+					}
+				}
+
+				list.Sort((x, y) => x.Order - y.Order);
+
+				_keyList[key] = mmList = new MemberMapper[list.Count];
+
+				for (var i = 0; i < list.Count; i++)
+					mmList[i] = list[i].MemberMapper;
+			}
+
+			return mmList;
+		}
+
+		[NoInterception]
+		protected virtual void AddWherePK(DbManager db, SqlQueryInfo query, StringBuilder sb, int nParameter)
+		{
+			sb.Append("WHERE\n");
+
+			var memberMappers = GetKeyFieldList(db, query.ObjectType);
+
+			if (memberMappers.Length == 0)
+				throw new DataAccessException(
+						string.Format("No primary key field(s) in the type '{0}'.", query.ObjectType.FullName));
+
+			foreach (var mm in memberMappers)
+			{
+				var p = query.AddParameter(
+					db.DataProvider.Convert(mm.Name + "_W", ConvertType.NameToQueryParameter).ToString(),
+					mm.Name);
+
+				sb.AppendFormat("\t{0} = ", db.DataProvider.Convert(p.FieldName, ConvertType.NameToQueryField));
+
+				if (nParameter < 0)
+					sb.AppendFormat("{0} AND\n", p.ParameterName);
+				else
+					sb.AppendFormat("{{{0}}} AND\n", nParameter++);
+			}
+
+			sb.Remove(sb.Length - 5, 5);
+		}
+
+		protected SqlQueryInfo CreateSelectByKeySqlText(DbManager db, Type type)
+		{
+			var om    = db.MappingSchema.GetObjectMapper(type);
+			var sb    = new StringBuilder();
+			var query = new SqlQueryInfo(om);
+
+			sb.Append("SELECT\n");
+
+			foreach (var mm in GetFieldList(om))
+				sb.AppendFormat("\t{0},\n",
+					db.DataProvider.Convert(mm.Name, ConvertType.NameToQueryField));
+
+			sb.Remove(sb.Length - 2, 1);
+
+			sb.Append("FROM\n\t");
+
+			AppendTableName(sb, db, type);
+
+			AddWherePK(db, query, sb, -1);
+
+			query.QueryText = sb.ToString();
+
+			return query;
+		}
+
+		// NOTE changed to virtual
+		protected virtual void AppendTableName(StringBuilder sb, DbManager db, Type type)
+		{
+			var database = GetDatabaseName(type);
+			var owner    = GetOwnerName   (type);
+			var name     = GetTableName   (type);
+
+			db.DataProvider.CreateSqlProvider().BuildTableName(sb,
+				database == null ? null : db.DataProvider.Convert(database, ConvertType.NameToDatabase).  ToString(),
+				owner    == null ? null : db.DataProvider.Convert(owner,    ConvertType.NameToOwner).     ToString(),
+				name     == null ? null : db.DataProvider.Convert(name,     ConvertType.NameToQueryTable).ToString());
+
+			sb.AppendLine();
+		}
+
+		protected SqlQueryInfo CreateSelectAllSqlText(DbManager db, Type type)
+		{
+			var om    = db.MappingSchema.GetObjectMapper(type);
+			var sb    = new StringBuilder();
+			var query = new SqlQueryInfo(om);
+
+			sb.Append("SELECT\n");
+
+			foreach (var mm in GetFieldList(om))
+				sb.AppendFormat("\t{0},\n",
+					db.DataProvider.Convert(mm.Name, ConvertType.NameToQueryField));
+
+			sb.Remove(sb.Length - 2, 1);
+
+			sb.Append("FROM\n\t");
+			AppendTableName(sb, db, type);
+
+			query.QueryText = sb.ToString();
+
+			return query;
+		}
+
+		protected SqlQueryInfo CreateInsertSqlText(DbManager db, Type type, int nParameter)
+		{
+			var typeExt = TypeExtension.GetTypeExtension(type, Extensions);
+			var om      = db.MappingSchema.GetObjectMapper(type);
+			var list    = new List<MemberMapper>();
+			var sb      = new StringBuilder();
+			var query   = new SqlQueryInfo(om);
+			var mp      = MappingSchema.MetadataProvider;
+
+			sb.Append("INSERT INTO ");
+			AppendTableName(sb, db, type);
+			sb.Append(" (\n");
+
+			foreach (var mm in GetFieldList(om))
+			{
+				// IT: This works incorrectly for complex mappers.
+				//
+				// [2009-03-24] ili: use mm.MemberAccessor instead of mm.ComplexMemberAccessor
+				// as in CreateUpdateSqlText
+				//
+
+				bool isSet;
+				var nonUpdatableAttribute = mp.GetNonUpdatableAttribute(type, typeExt, mm.MapMemberInfo.MemberAccessor, out isSet);
+
+				if (nonUpdatableAttribute == null || !isSet || nonUpdatableAttribute.OnInsert == false)
+				{
+					sb.AppendFormat("\t{0},\n",
+						db.DataProvider.Convert(mm.Name, ConvertType.NameToQueryField));
+					list.Add(mm);
+				}
+			}
+
+			sb.Remove(sb.Length - 2, 1);
+
+			sb.Append(") VALUES (\n");
+
+			foreach (var mm in list)
+			{
+				var p = query.AddParameter(
+					db.DataProvider.Convert(mm.Name + "_P", ConvertType.NameToQueryParameter).ToString(),
+					mm.Name);
+
+				if (nParameter < 0)
+					sb.AppendFormat("\t{0},\n", p.ParameterName);
+					//sb.AppendFormat("\t{0},\n", db.DataProvider.Convert(p.ParameterName, ConvertType.NameToQueryParameter));
+				else
+					sb.AppendFormat("\t{{{0}}},\n", nParameter++);
+			}
+
+			sb.Remove(sb.Length - 2, 1);
+
+			sb.Append(")");
+
+			query.QueryText = sb.ToString();
+
+			return query;
+		}
+
+		protected SqlQueryInfo CreateUpdateSqlText(DbManager db, Type type, int nParameter)
+		{
+			var typeExt = TypeExtension.GetTypeExtension(type, Extensions);
+			var om      = db.MappingSchema.GetObjectMapper(type);
+			var sb      = new StringBuilder();
+			var query   = new SqlQueryInfo(om);
+			var mp      = MappingSchema.MetadataProvider;
+
+			sb.Append("UPDATE\n\t");
+			AppendTableName(sb, db, type);
+			sb.Append("\nSET\n");
+
+			var fields    = GetFieldList(om);
+			var hasFields = false;
+
+			foreach (var mm in fields)
+			{
+				bool isSet;
+
+				var nonUpdatableAttribute = mp.GetNonUpdatableAttribute(type, typeExt, mm.MapMemberInfo.MemberAccessor, out isSet);
+
+				if (nonUpdatableAttribute != null && isSet && nonUpdatableAttribute.OnUpdate == true)
+					continue;
+
+				mp.GetPrimaryKeyOrder(type, typeExt, mm.MapMemberInfo.MemberAccessor, out isSet);
+
+				if (isSet)
+					continue;
+
+				hasFields = true;
+
+				var p = query.AddParameter(
+					db.DataProvider.Convert(mm.Name + "_P", ConvertType.NameToQueryParameter).ToString(),
+					mm.Name);
+
+				sb.AppendFormat("\t{0} = ", db.DataProvider.Convert(p.FieldName, ConvertType.NameToQueryField));
+
+				if (nParameter < 0)
+					sb.AppendFormat("{0},\n", p.ParameterName);
+				else
+					sb.AppendFormat("\t{{{0}}},\n", nParameter++);
+			}
+
+			if (!hasFields)
+				throw new DataAccessException(
+						string.Format("There are no fields to update in the type '{0}'.", query.ObjectType.FullName));
+
+			sb.Remove(sb.Length - 2, 1);
+
+			AddWherePK(db, query, sb, nParameter);
+
+			query.QueryText = sb.ToString();
+
+			return query;
+		}
+
+		protected SqlQueryInfo CreateDeleteSqlText(DbManager db, Type type, int nParameter)
+		{
+			var om    = db.MappingSchema.GetObjectMapper(type);
+			var sb    = new StringBuilder();
+			var query = new SqlQueryInfo(om);
+
+			sb.Append("DELETE FROM\n\t");
+			AppendTableName(sb, db, type);
+			sb.AppendLine();
+
+			AddWherePK(db, query, sb, nParameter);
+
+			query.QueryText = sb.ToString();
+
+			return query;
+		}
+
+		[NoInterception]
+		protected virtual SqlQueryInfo CreateSqlText(DbManager db, Type type, string actionName)
+		{
+			switch (actionName)
+			{
+				case "SelectByKey": return CreateSelectByKeySqlText(db, type);
+				case "SelectAll":   return CreateSelectAllSqlText  (db, type);
+				case "Insert":      return CreateInsertSqlText     (db, type, -1);
+				case "InsertBatch": return CreateInsertSqlText     (db, type,  0);
+				case "Update":      return CreateUpdateSqlText     (db, type, -1);
+				case "UpdateBatch": return CreateUpdateSqlText     (db, type,  0);
+				case "Delete":      return CreateDeleteSqlText     (db, type, -1);
+				case "DeleteBatch": return CreateDeleteSqlText     (db, type,  0);
+				default:
+					throw new DataAccessException(
+						string.Format("Unknown action '{0}'.", actionName));
+			}
+		}
+
+		private static readonly Hashtable _actionSqlQueryInfo = new Hashtable();
+
+		[NoInterception]
+		public virtual SqlQueryInfo GetSqlQueryInfo(DbManager db, Type type, string actionName)
+		{
+			var key   = type.FullName + "$" + actionName + "$" + db.DataProvider.UniqueName + "$" + GetTableName(type);
+			var query = (SqlQueryInfo)_actionSqlQueryInfo[key];
+
+			if (query == null)
+			{
+				query = CreateSqlText(db, type, actionName);
+				_actionSqlQueryInfo[key] = query;
+			}
+
+			return query;
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/SqlQueryInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,108 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+
+using BLToolkit.Data;
+using BLToolkit.Mapping;
+
+namespace BLToolkit.DataAccess
+{
+	public class SqlQueryInfo
+	{
+		//NOTE Added empty constructor
+		public SqlQueryInfo()
+		{
+		}
+
+		public SqlQueryInfo(ObjectMapper objectMapper)
+		{
+			ObjectMapper = objectMapper;
+		}
+
+		public string       QueryText    { get; set; }
+		public ObjectMapper ObjectMapper { get; private set; }
+
+		public Type ObjectType
+		{
+			get { return ObjectMapper.TypeAccessor.OriginalType; }
+		}
+
+		//NOTE Changed from private to protected
+		protected readonly List<SqlQueryParameterInfo> Parameters = new List<SqlQueryParameterInfo>();
+
+		//NOTE Changed to virtual
+		public virtual SqlQueryParameterInfo AddParameter(string parameterName, string fieldName)
+		{
+			var parameter = new SqlQueryParameterInfo { ParameterName = parameterName, FieldName = fieldName };
+
+			parameter.SetMemberMapper(ObjectMapper);
+
+			Parameters.Add(parameter);
+
+			return parameter;
+		}
+
+		public IDbDataParameter[] GetParameters(DbManager db, object[] key)
+		{
+			if (Parameters.Count != key.Length)
+				throw new DataAccessException("Parameter list does match key list.");
+
+			var parameters = new IDbDataParameter[Parameters.Count];
+
+			for (var i = 0; i < Parameters.Count; i++)
+			{
+				var info = Parameters[i];
+
+				parameters[i] = db.Parameter(info.ParameterName, key[i]);
+			}
+
+			return parameters;
+		}
+
+		public IDbDataParameter[] GetParameters(DbManager db, object obj)
+		{
+			var parameters = new IDbDataParameter[Parameters.Count];
+
+			for (var i = 0; i < Parameters.Count; i++)
+			{
+				var info = Parameters[i];
+
+				//parameters[i] = db.Parameter(info.ParameterName, info.MemberMapper.GetValue(obj));
+
+				var mmi = info.MemberMapper.MapMemberInfo;
+				var val = info.MemberMapper.GetValue(obj);
+
+				if (val == null && mmi.Nullable/* && mmi.NullValue == null*/)
+				{
+					//replace value with DbNull
+					val = DBNull.Value;
+				}
+
+				if (mmi.IsDbTypeSet)
+				{
+					parameters[i] = mmi.IsDbSizeSet
+						? db.Parameter(info.ParameterName, val, info.MemberMapper.DbType, mmi.DbSize) 
+						: db.Parameter(info.ParameterName, val, info.MemberMapper.DbType);
+				}
+				else
+				{
+					parameters[i] = val != DBNull.Value
+						? db.Parameter(info.ParameterName, val)
+						: db.Parameter(info.ParameterName, val, info.MemberMapper.GetDbType());
+				}
+			}
+
+			return parameters;
+		}
+
+		public MemberMapper[] GetMemberMappers()
+		{
+			var members = new MemberMapper[Parameters.Count];
+
+			for (var i = 0; i < Parameters.Count; i++)
+				members[i] = Parameters[i].MemberMapper;
+
+			return members;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/SqlQueryParameterInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,33 @@
+using BLToolkit.Mapping;
+
+namespace BLToolkit.DataAccess
+{
+	public class SqlQueryParameterInfo
+	{
+		private string _parameterName;
+		public  string  ParameterName
+		{
+			get { return _parameterName;  }
+			set { _parameterName = value; }
+		}
+	
+		private string _fieldName;
+		public  string  FieldName
+		{
+			get { return _fieldName;  }
+			set { _fieldName = value; }
+		}
+
+		private MemberMapper _memberMapper;
+		public  MemberMapper  MemberMapper
+		{
+			get { return _memberMapper; }
+		}
+
+        //NOTE Changed internal to public and added virtual
+		public virtual void SetMemberMapper(ObjectMapper objectMapper)
+		{
+			_memberMapper = objectMapper[_fieldName];
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/SqlQueryT.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,383 @@
+using System;
+using System.Collections.Generic;
+
+namespace BLToolkit.DataAccess
+{
+	using Data;
+	using Mapping;
+	using Reflection.Extension;
+
+	public class SqlQuery<T> : SqlQueryBase
+	{
+		#region Constructors
+
+		public SqlQuery()
+		{
+		}
+
+		public SqlQuery(DbManager dbManager)
+			: base(dbManager)
+		{
+		}
+
+		public SqlQuery(DbManager dbManager, bool dispose)
+			: base(dbManager, dispose)
+		{
+		}
+
+		public SqlQuery(ExtensionList extensions)
+		{
+			Extensions = extensions;
+		}
+
+		#endregion
+
+		#region Overrides
+
+		public SqlQueryInfo GetSqlQueryInfo(DbManager db, string actionName)
+		{
+			return base.GetSqlQueryInfo(db, typeof(T), actionName);
+		}
+
+		#endregion
+
+		#region SelectByKey
+
+		public virtual T SelectByKey(DbManager db, params object[] keys)
+		{
+			var query = GetSqlQueryInfo(db, typeof(T), "SelectByKey");
+
+			return db
+				.SetCommand(query.QueryText, query.GetParameters(db, keys))
+				.ExecuteObject<T>();
+		}
+
+		public virtual T SelectByKey(params object[] keys)
+		{
+			var db = GetDbManager();
+
+			try
+			{
+				return SelectByKey(db, keys);
+			}
+			finally
+			{
+				if (DisposeDbManager)
+					db.Dispose();
+			}
+		}
+
+		#endregion
+
+		#region SelectAll
+
+		static SqlQueryInfo _selectAllQuery;
+
+		public virtual List<T> SelectAll(DbManager db)
+		{
+			if (_selectAllQuery == null)
+				_selectAllQuery = GetSqlQueryInfo(db, typeof(T), "SelectAll");
+
+			return db
+				.SetCommand(_selectAllQuery.QueryText)
+				.ExecuteList<T>();
+		}
+
+		public virtual TL SelectAll<TL>(DbManager db, TL list)
+			where TL : IList<T>
+		{
+			var query = GetSqlQueryInfo(db, typeof(T), "SelectAll");
+
+			return db
+				.SetCommand(query.QueryText)
+				.ExecuteList<TL,T>(list);
+		}
+
+		public virtual TL SelectAll<TL>(DbManager db)
+			where TL : IList<T>, new()
+		{
+			return SelectAll(db, new TL());
+		}
+
+		public virtual List<T> SelectAll()
+		{
+			var db = GetDbManager();
+
+			try
+			{
+				return SelectAll(db);
+			}
+			finally
+			{
+				if (DisposeDbManager)
+					db.Dispose();
+			}
+		}
+
+		public virtual TL SelectAll<TL>(TL list)
+			where TL : IList<T>
+		{
+			var db = GetDbManager();
+
+			try
+			{
+				return SelectAll(db, list);
+			}
+			finally
+			{
+				if (DisposeDbManager)
+					db.Dispose();
+			}
+		}
+
+		public virtual TL SelectAll<TL>()
+			where TL : IList<T>, new()
+		{
+			return SelectAll(new TL());
+		}
+
+		#endregion
+
+		#region Insert
+
+		public virtual int Insert(DbManager db, T obj)
+		{
+			var query = GetSqlQueryInfo(db, obj.GetType(), "Insert");
+
+			return db
+				.SetCommand(query.QueryText, query.GetParameters(db, obj))
+				.ExecuteNonQuery();
+		}
+
+		public virtual int Insert(T obj)
+		{
+			var db = GetDbManager();
+
+			try
+			{
+				return Insert(db, obj);
+			}
+			finally
+			{
+				if (DisposeDbManager)
+					db.Dispose();
+			}
+		}
+
+		public virtual int Insert(DbManager db, int maxBatchSize, IEnumerable<T> list)
+		{
+			var query = GetSqlQueryInfo(db, typeof(T), "InsertBatch");
+
+			return db.DataProvider.InsertBatch(
+				db,
+				query.QueryText,
+				list,
+				query.GetMemberMappers(),
+				maxBatchSize,
+				obj => query.GetParameters(db, obj));
+		}
+
+		public virtual int Insert(int maxBatchSize, IEnumerable<T> list)
+		{
+			var db = GetDbManager();
+
+			try
+			{
+				return Insert(db, maxBatchSize, list);
+			}
+			finally
+			{
+				if (DisposeDbManager)
+					db.Dispose();
+			}
+		}
+
+		public virtual int Insert(DbManager db, IEnumerable<T> list)
+		{
+			return Insert(db, int.MaxValue, list);
+		}
+
+		public virtual int Insert(IEnumerable<T> list)
+		{
+			return Insert(int.MaxValue, list);
+		}
+
+		#endregion
+
+		#region Update
+
+		public virtual int Update(DbManager db, T obj)
+		{
+			var query = GetSqlQueryInfo(db, obj.GetType(), "Update");
+
+			return db
+				.SetCommand(query.QueryText, query.GetParameters(db, obj))
+				.ExecuteNonQuery();
+		}
+
+		public virtual int Update(T obj)
+		{
+			var db = GetDbManager();
+
+			try
+			{
+				return Update(db, obj);
+			}
+			finally
+			{
+				if (DisposeDbManager)
+					db.Dispose();
+			}
+		}
+
+		public virtual int Update(DbManager db, int maxBatchSize, IEnumerable<T> list)
+		{
+			var query = GetSqlQueryInfo(db, typeof(T), "UpdateBatch");
+
+			db.SetCommand(query.QueryText);
+
+			return ExecuteForEach(
+				db,
+				list,
+				query.GetMemberMappers(),
+				maxBatchSize,
+				obj => query.GetParameters(db, obj));
+		}
+
+		public virtual int Update(int maxBatchSize, IEnumerable<T> list)
+		{
+			var db = GetDbManager();
+
+			try
+			{
+				return Update(db, maxBatchSize, list);
+			}
+			finally
+			{
+				if (DisposeDbManager)
+					db.Dispose();
+			}
+		}
+
+		public virtual int Update(DbManager db, IEnumerable<T> list)
+		{
+			return Update(db, int.MaxValue, list);
+		}
+
+		public virtual int Update(IEnumerable<T> list)
+		{
+			return Update(int.MaxValue, list);
+		}
+
+		#endregion
+
+		#region DeleteByKey
+
+		public virtual int DeleteByKey(DbManager db, params object[] key)
+		{
+			var query = GetSqlQueryInfo(db, typeof(T), "Delete");
+
+			return db
+				.SetCommand(query.QueryText, query.GetParameters(db, key))
+				.ExecuteNonQuery();
+		}
+
+		public virtual int DeleteByKey(params object[] key)
+		{
+			var db = GetDbManager();
+
+			try
+			{
+				return DeleteByKey(db, key);
+			}
+			finally
+			{
+				if (DisposeDbManager)
+					db.Dispose();
+			}
+		}
+
+		#endregion
+
+		#region Delete
+
+		public virtual int Delete(DbManager db, T obj)
+		{
+			var query = GetSqlQueryInfo(db, obj.GetType(), "Delete");
+
+			return db
+				.SetCommand(query.QueryText, query.GetParameters(db, obj))
+				.ExecuteNonQuery();
+		}
+
+		public virtual int Delete(T obj)
+		{
+			var db = GetDbManager();
+
+			try
+			{
+				return Delete(db, obj);
+			}
+			finally
+			{
+				if (DisposeDbManager)
+					db.Dispose();
+			}
+		}
+
+		public virtual int Delete(DbManager db, int maxBatchSize, IEnumerable<T> list)
+		{
+			var query = GetSqlQueryInfo(db, typeof(T), "DeleteBatch");
+
+			db.SetCommand(query.QueryText);
+
+			return ExecuteForEach(
+				db,
+				list,
+				query.GetMemberMappers(),
+				maxBatchSize,
+				obj => query.GetParameters(db, obj));
+		}
+
+		public virtual int Delete(int maxBatchSize, IEnumerable<T> list)
+		{
+			var db = GetDbManager();
+
+			try
+			{
+				return Delete(db, list);
+			}
+			finally
+			{
+				if (DisposeDbManager)
+					db.Dispose();
+			}
+		}
+
+		public virtual int Delete(DbManager db, IEnumerable<T> list)
+		{
+			return Delete(db, int.MaxValue, list);
+		}
+
+		public virtual int Delete(IEnumerable<T> list)
+		{
+			return Delete(int.MaxValue, list);
+		}
+
+		#endregion
+
+		#region Helpers
+
+		protected int ExecuteForEach(
+			DbManager      db,
+			IEnumerable<T> collection,
+			MemberMapper[] members,
+			int            maxBatchSize,
+			DbManager.ParameterProvider<T> getParameters)
+		{
+			return db.ExecuteForEach(collection, members, maxBatchSize, getParameters);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/DataAccess/TableNameAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,34 @@
+using System;
+
+namespace BLToolkit.DataAccess
+{
+	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface)]
+	public class TableNameAttribute : Attribute
+	{
+		public TableNameAttribute()
+		{
+		}
+
+		public TableNameAttribute(string name)
+		{
+			_name = name;
+		}
+
+		public TableNameAttribute(string database, string name)
+		{
+			_database = database;
+			_name     = name;
+		}
+
+		public TableNameAttribute(string database, string owner, string name)
+		{
+			_database = database;
+			_owner    = owner;
+			_name     = name;
+		}
+
+		private string _database; public virtual string Database { get { return _database; } set { _database = value; } }
+		private string _owner;    public virtual string Owner    { get { return _owner;    } set { _owner = value;    } }
+		private string _name;     public virtual string Name     { get { return _name;     } set { _name = value;     } }
+	}
+}
Binary file Source/Doc/BLToolkit.chm has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Doc/ChangeLog.txt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,299 @@
+v 4.1
+
+Enhancement
+
+- New Linq converter.
+- New InsertOrUpdate method.
+
+
+v 4.0
+
+Enhancement
+
+- No more .NET Framework 2.0 support.
+- T4 Templates for Sybase, MS SQL Server, MySql, and PostgreSQL.
+- Linq over WCF.
+- Silverlight support.
+- New attributes TableFunction & TableExpression to support table-valued UDF, hints,
+  and other around table decorations.
+- Linq DML support.
+
+
+v 3.2
+
+Demo (see the dev version of the project)
+
+- Linq.Demo.
+- WebServices powered by BLToolkit.
+- Partial.Trust demo.
+
+Bug fixes
+
+- Extension assemblies are ignored in TypeFactory.GetType(type).
+- Default parameter values were ignored by OverloadAspectBuilder.
+- [Parameter(null)] wasn't setting Nullable<> and EditableValue<Nullable<>> values to null
+- DefaultTypeBuilder throwing exception if [Parameter(value)] was used on
+  EditableValue<Nullable<>> generated properties when Nullable<> did have appropriate
+  constructor accepting value type
+- DateTimeOffset wasn't handled in DataReaderMapper correctly.
+
+Enhancement
+
+- Linq provider for supported databases.
+- New Object to Object mapping. See ExpressionMapper.
+- PostgreSQL Data Provider added.
+- Informix Data Provider added.
+- DB2 Data Provider added.
+- New SqlIgnore attribute.
+- New SqlBuilder class.
+- Partial trust support.
+- Mapping to/from private classes (FW 3.x only).
+- New ParamTypeName attribute for SqlServer2008 table-type parameter support (FW 3.x only).
+- EditableArrayList & BindingListImpl implements INotifyCollectionChanged interface.
+
+
+v 3.1
+
+Bug fixes
+
+- MapValueAttribute ignored for nullable enums.
+- MappingSchema.ConvertChangeType does not handle nullable enums properly.
+- EditableArrayList indexer add/remove bug.
+- ParameterAttribute doesn't work with Nullabe<T> and EditableValue<T>
+  when 'T' constructor is not trivial.
+- BindingListImpl.AddNew does not fire ListChanged event.
+- Some inner types are missing in ObjectMappes, some included w/o reason.
+- Setter for ObjectBinder.ItemType fires OnListChanged event before the list changes.
+- Convert<To,From> does not handle `Nullable<To>' from scalar `From' case.
+- EditableXmlDocument fires PropertyChanged event before an xml node changes.
+
+Enhancement
+
+- CHM help file provided. See the Doc folder.
+- New InstanceCache attribute.
+- DataAccessor support for IEnumerable<T>.
+- Multiple duck. See DuckTyping.Aggregate methods.
+- New Overload aspect.
+- Own configuration section.
+- TypeFactory.GetType() is public now.
+- Simplified GenerateAttributeAttribute usage.
+
+
+v 3.0
+
+Breaking changes
+
+- No more support for .Net 1.1 Framework.
+
+Bug fixes
+
+- EmitHelper.ldc_i4_ emits wrong opcode for numbers from 128 till 255 (bug in msdn)
+- Some opcodes were not implemented.
+- MappingSchema.MapResultSets fails with NullReferenceException when no data returned.
+- Nullable enums were not handled properly.
+- BindingList.GetItemSortedPosition() returns wrong index for an item at end of the list.
+- Fixed AsyncAspect and other type builders compatibility.
+- DbMananger.DiscoverSpParameters fires both OpenConnection and CloseConnection events.
+
+Enhancement
+
+- DateTimeOffset type support.
+- MemberAccessor.CloneValue to avoid boxing.
+- Named arguments support for GenerateAttributeTypeBuilder.
+- Extended support for IsNull & Nullable types in MemberAccessor.
+- Support for enum values in EmitHelper.LoadWellKnownValue/LoadInitValue and so on.
+- Generic GetValue/SetValue methods for ValueHolders.
+- Different projects to support FW 2.0 & FW 3.5.
+- LinqMetadataProvider to support Linq To SQL attributes.
+- Relocated MetadataProvider's to BLToolkit.Reflection namespace.
+- New DbManager ctors to support manual/custom configuration.
+- Ability to configure SqlQueryAttribute dynamically.
+- Assembly is signed.
+- New ActualTypeAttribute to associate DataAccessor's object type and its implementation.
+- New AutoImplementInterfaceAttribute to automatically generate interface implementation.
+- New TypeAccessor.AssociateType method and TypeAccessor.AssociatedTypeHandler event
+  to control interface/type implementation.
+- DataException now has the 'Number' property.
+- New ClearCache aspect.
+
+
+v 2.0.7
+
+Bug fixes
+
+- Oracle/Odp does not handle colon (':') in ConvertType.ParameterToName.
+- Property change builder will use op_Inequality operation if it is available to compare
+  property values.
+- DbManager.ExecuteList<T>(params object[]) add an extra typeof(T)
+- EditableObject.Clone does reference cloning of its inner objects.
+- EditableObject.Clone does not track dirty state of its members.
+- Generated assembly name ends with '.dll'.
+  As a result, System.Reflection.Assembly.Load() tries to load 'SomeAssembly.dll.DLL'
+  and fails.
+- Oracle treat '\r' as an invalid character.
+- DataAccessorBuilder calls DbProvider.Convert(NameToParameter) for text query
+  parameters.
+- SqlQueryBase.GetKeyFieldList was incorrectly marked as public.
+- TypeAccessorBuilder fails to build a getter/setter if base method is protected.
+- EditableXmlDocument fails to reject changes if there was an attribute insertion or
+  deletion.
+
+Enhancement
+
+- FdpDataProvider.QuoteIdentifiers option for FB data provier.
+- GenerateAtribute attribute to specify any custom attribute for a generated type or
+  member.
+- SQLite data provider.
+- DeriveParameters implemented for MsAccess data provider.
+- XmlIncludeAbstractAttribute to simplify the xml serialization of a BLToolkit generated
+  type.
+- Better support for internal types/members. The behavior is configurable via
+  Configuration.EditableObjectUsesMemberwiseEquals property.
+- VS 2008 support.
+
+
+v 2.0.6
+
+Demo
+
+- MS PetShop 4.0 powered by BLToolkit (see the dev version of the project).
+
+Bug fixes
+
+- DbManager.OutputParameter lacks overload with 'size' parameters.
+- CacheAspect hungs a desktop application on exit.
+- ExecuteResultSet fails on many-to-one relations.
+- TypeBuilder fails to override a method with generic parameters or generic return type.
+
+Enhancement
+
+- ParamSize & ParamDbType attributes to tweak DataAccessor parameters. Especially output
+  ones.
+- All 'emit.stloc' immediately followed by 'emit.ldloc' were replaced with simple
+  'emit.dup' command.
+  Lots of redundant local variables were removed.
+- UnitTests for Oracle, Firebird & Access (Jet)
+- DataSetTableAttribute is handled by all DataSet/DataTable related methods of
+  DataAccessBuilder.
+- ClearCache method for CacheAspect.
+- Metadata provider for mapping.
+- Ability to specify global assembly version & strong name key pair.
+- AsyncAspect to execute any method asynchronously.
+- Added support for ConnectionStrings config settings.
+- Editable XmlDocuments.
+- Added support for IDictionary, IDictionary<,>, IList, and IList<> abstract data
+  accessor return types.
+
+
+v 2.0.5
+
+Breaking changes
+
+- DbManager.InitCommand renamed to OnInitCommand.
+
+Bug fixes
+
+- System.Reflection.Emit.AssemblyBuilder assemblies are processed properly.
+- RegExAttribute - now properly returns valid==true only when whole value is equal to
+  match.
+- EditableObject serialization issue
+- StandardPropertyDescriptor.CheckNull was always returning DBNull.Value if _isNull
+  handler was returning null. Now configurable via Configuration.CheckNullReturnIfNull.
+- PropertyChangedBuilder was crashing when property was not public
+- ObjectBinder.IsNull was serialized to resources
+- Oracle provider now handles arrays of nullable types correctly.
+- DataAccessor.PrepareParameters was invoked only to ref parameters.
+- DataAccessor.PrepareParameters lacks DbManager which may be external.
+- DbManager.InitParameters did hot handle decimal type.
+- MappingSchema.ValueToEnum fails with underlying type other then Int32. 
+- CounterAspect catches the OnCatch event now to count exceptions.
+- DbManager.ExecuteForEach does not call InitParameters in the loop.
+
+Enhancement
+
+- Ability to specify RegexOptions for RegExAttribute. Regex not being created on every
+  call to IsValid
+- Destination attribute works with scalar types.
+- DataAccessorBuilder generates getters/setters for abstract properties & indexers.
+- Ability to specify globaly whether strings should be trimed when mapping
+- Ability to specify whether PropertyChange notification should only be fired when
+  underlying value is changed and not when setter is called
+- XmlDocument type support.
+- DbManager.SetParameters() accepts arrays of IDbDataParameter.
+- DataSetTableAttribute for DataAccessorBuilder to explicitly specify DataSet table name.
+- Default CacheAspect.IsWeak value changed to false.
+- Cleanup thread for CacheAspect.
+- MemberMapper type can be specified directly in the target type declaration.
+- Events for DbManager.OnBeforeOperation, OnAfterOperation, OnOperationException &
+  OnInitCommand.
+
+
+v 2.0.4
+
+Bug fixes
+
+- By default, the mapper included const fields into map list (???).
+- If enum does not have explicit mapping, data accessor builder 
+  does not convert it to underlying type.
+- MemberMapper fails to convert an object to its base type.
+- BindingListImpl.RemoveSort was not firing ListChange event.
+- TypeAccessor.CreateExtendedPropertyDescriptors did not work properly
+  with 3rd+ level nested properties.
+- Object holder ignored NoInstanceAttribute.
+- ValidatorContext caches NullValue.
+- EditableObject.RejectChanges/RejectMemberChanges were not firing PropertyChanged event
+  for reverted fields.
+- Fixed the generating IsValueType && !IsPrimitive ref/out parameters.
+
+Enhancement
+
+- Operator<T> is extensible now.
+- ObjectBinder can now control lifetime (Disposal) of underlying collection.
+- DuckTyping.
+- ParamNullValue attribute.
+- Virtual method DataProviderBase.PrepareCommand to let a data provider modify SQL
+  statement befory query.
+- Virtual method CacheAspect.GetCache. Can be used to provide a custom hashtable.
+
+
+v 2.0.3
+
+Bug fixes
+
+- Race condition in MappingSchema.GetObjectMapper.
+- DbManager will not try to close the connection in the finalizer anymore.
+- MinValue/MaxValue attributes now determine value type by object property/field instead
+  of test value.
+- Fixed obscure case when object is removed from EditableArrayList/BindingListImpl while
+  ItemPropertyChanged delegate is in process of being executed and collection handler was
+  not yet invoked.
+
+Enhancement
+
+- HttpReader SOAP support.
+- Convert<T,P> uses type cast operators when available.
+- Third party DataProvider registration via appsettings.
+- More specification adherent sorting behavior implementation of 
+  IBindingList/IBindingListView in BindingListImpl. 
+- EditableArrayList (potentially breaking changes) heavily relies on BindingListImpl for
+  IBindingList/IBindingListView and their base interfaces implementation. 
+- BindingListImpl is changed to be fully specification adherent binding wrapper for other
+  object lists/collection types.
+- 2.0.1 version obsolete methods have been removed.
+
+
+v 2.0.2
+
+Bug fixes
+
+- Abstract class builder overrode virtual final methods.
+- Append records to a log file.
+- ObjectBinder's AllowNew, AllowEdit, AllowRemove properties serialization.
+
+Enhancement
+
+- New DataAccessor<T,A> class.
+- Direction.ReturnValueAttribute takes the Member parameter in '@fieldName' format.
+- New property Object of the InterceptCallInfo class, which is an intercepted object
+  reference.
+
Binary file Source/Doc/Development rules and regulations.doc has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Doc/License.txt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,19 @@
+Copyright (c) 2002-2011 www.bltoolkit.net
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Doc/OnlineDoc.txt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1 @@
+See online documentation at http://www.bltoolkit.net/Doc/index.htm
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/EditableObjects/EditableArrayList.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1100 @@
+using System;
+using System.Collections;
+using System.Collections.Specialized;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Reflection;
+
+namespace BLToolkit.EditableObjects
+{
+	using Reflection;
+	using Mapping;
+	using ComponentModel;
+
+	[DebuggerDisplay("Count = {Count}, ItemType = {ItemType}")]
+	[Serializable]
+	public class EditableArrayList : ArrayList, IEditable, ISortable, ISupportMapping,
+		IDisposable, IPrintDebugState, ITypedList, IBindingListView, ICancelAddNew, INotifyCollectionChanged
+	{
+		#region Constructors
+
+		public EditableArrayList() : this(typeof(object), new ArrayList(), true)
+		{
+		}
+
+		public EditableArrayList([JetBrains.Annotations.NotNull] Type itemType, [JetBrains.Annotations.NotNull] ArrayList list, bool trackChanges)
+		{
+			if (itemType == null) throw new ArgumentNullException("itemType");
+			if (list     == null) throw new ArgumentNullException("list");
+
+			ItemType = itemType;
+			List     = list;
+
+			_noTrackingChangesCount++;
+			AddInternal(List);
+			_noTrackingChangesCount--;
+
+			if (!trackChanges)
+			{
+				SetTrackingChanges(false);
+				_minTrackingChangesCount = 1;
+			}
+		}
+
+		public EditableArrayList(Type itemType)
+			: this(itemType, new ArrayList(), true)
+		{
+		}
+
+		public EditableArrayList(Type itemType, bool trackChanges)
+			: this(itemType, new ArrayList(), trackChanges)
+		{
+		}
+
+		public EditableArrayList(Type itemType, int capacity)
+			: this(itemType, new ArrayList(capacity), true)
+		{
+		}
+
+		public EditableArrayList(Type itemType, int capacity, bool trackChanges)
+			: this(itemType, new ArrayList(capacity), trackChanges)
+		{
+		}
+
+		public EditableArrayList(Type itemType, ICollection c)
+			: this(itemType, new ArrayList(c), true)
+		{
+		}
+
+		public EditableArrayList(Type itemType, ICollection c, bool trackChanges)
+			: this(itemType, new ArrayList(c), trackChanges)
+		{
+		}
+
+		public EditableArrayList(Type itemType, ArrayList list)
+			: this(itemType, list, true)
+		{
+		}
+
+		public EditableArrayList(EditableArrayList list)
+			: this(list.ItemType, new ArrayList(list), true)
+		{
+		}
+
+		public EditableArrayList(EditableArrayList list, bool trackChanges)
+			: this(list.ItemType, new ArrayList(list), trackChanges)
+		{
+		}
+
+		public EditableArrayList(Type itemType, EditableArrayList list)
+			: this(itemType, new ArrayList(list), true)
+		{
+		}
+
+		public EditableArrayList(Type itemType, EditableArrayList list, bool trackChanges)
+			: this(itemType, new ArrayList(list), trackChanges)
+		{
+		}
+
+		#endregion
+
+		#region Public Members
+
+		internal ArrayList List     { get; private set; }
+		public   Type      ItemType { get; private set; }
+
+		private ArrayList _newItems;
+		public  ArrayList  NewItems
+		{
+			get { return _newItems ?? (_newItems = new ArrayList()); }
+		}
+
+		private ArrayList _delItems;
+		public  ArrayList  DelItems
+		{
+			get { return _delItems ?? (_delItems = new ArrayList()); }
+		}
+
+		public void Sort(params string[] memberNames)
+		{
+			Sort(ListSortDirection.Ascending, memberNames);
+		}
+
+		public void Sort(ListSortDirection direction, params string[] memberNames)
+		{
+			if (memberNames        == null) throw new ArgumentNullException      ("memberNames");
+			if (memberNames.Length == 0)    throw new ArgumentOutOfRangeException("memberNames");
+
+			Sort(new SortMemberComparer(TypeAccessor.GetAccessor(ItemType), direction, memberNames));
+		}
+
+		public void SortEx(string sortExpression)
+		{
+			var sorts = sortExpression.Split(',');
+
+			for (var i = 0; i < sorts.Length; i++)
+				sorts[i] = sorts[i].Trim();
+
+			var last = sorts[sorts.Length - 1];
+			var desc = last.ToLower().EndsWith(" desc");
+
+			if (desc)
+				sorts[sorts.Length - 1] = last.Substring(0, last.Length - " desc".Length);
+
+			Sort(desc? ListSortDirection.Descending: ListSortDirection.Ascending, sorts);
+		}
+
+		public void Move(int newIndex, int oldIndex)
+		{
+			BindingListImpl.Move(newIndex, oldIndex);
+		}
+
+		public void Move(int newIndex, object item)
+		{
+			lock (SyncRoot)
+			{
+				var index = IndexOf(item);
+
+				if (index >= 0)
+					Move(newIndex, index);
+			}
+		}
+
+		#endregion
+
+		#region Change Notification
+
+		public bool NotifyChanges
+		{
+			get { return BindingListImpl.NotifyChanges;  }
+			set { BindingListImpl.NotifyChanges = value; }
+		}
+
+		protected virtual void OnListChanged(ListChangedEventArgs e)
+		{
+			if (!_supressEvent && NotifyChanges && ListChanged != null)
+				ListChanged(this, e);
+		}
+
+		protected void OnListChanged(ListChangedType listChangedType, int index)
+		{
+			OnListChanged(new EditableListChangedEventArgs(listChangedType, index));
+		}
+
+		private void OnResetList()
+		{
+			OnListChanged(ListChangedType.Reset, -1);
+			OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
+		}
+
+		private void OnAddItem(object newObject, int index)
+		{
+			OnListChanged(ListChangedType.ItemAdded, index);
+			OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, newObject, index));
+		}
+
+		#endregion
+
+		#region Add/Remove Internal
+
+		void AddInternal(object value)
+		{
+			if (IsTrackingChanges)
+			{
+				if (DelItems.Contains(value))
+					DelItems.Remove(value);
+				else
+					NewItems.Add(value);
+			}
+
+			OnAdd(value);
+		}
+
+		private void RemoveInternal(object value)
+		{
+			if (IsTrackingChanges)
+			{
+				if (NewItems.Contains(value))
+					NewItems.Remove(value);
+				else
+					DelItems.Add(value);
+			}
+
+			OnRemove(value);
+		}
+
+		private void AddInternal(IEnumerable e)
+		{
+			foreach (var o in e)
+				AddInternal(o);
+		}
+
+		private void RemoveInternal(IEnumerable e)
+		{
+			foreach (var o in e)
+				RemoveInternal(o);
+		}
+
+		protected virtual void OnAdd(object value)
+		{
+		}
+
+		protected virtual void OnRemove(object value)
+		{
+		}
+
+		#endregion
+
+		#region Track Changes
+
+		private          int _noTrackingChangesCount;
+		private readonly int _minTrackingChangesCount;
+
+		public  bool IsTrackingChanges
+		{
+			get { return _noTrackingChangesCount == 0; }
+		}
+
+		protected void SetTrackingChanges(bool trackChanges)
+		{
+			if (trackChanges)
+			{
+				_noTrackingChangesCount--;
+
+				if (_noTrackingChangesCount < _minTrackingChangesCount)
+				{
+					_noTrackingChangesCount = _minTrackingChangesCount;
+					throw new InvalidOperationException("Tracking Changes Counter can not be negative.");
+				}
+			}
+			else
+			{
+				_noTrackingChangesCount++;
+			}
+		}
+
+		#endregion
+
+		#region ISupportMapping Members
+
+		public virtual void BeginMapping(InitContext initContext)
+		{
+			if (initContext.IsDestination)
+				_noTrackingChangesCount++;
+		}
+
+		public virtual void EndMapping(InitContext initContext)
+		{
+			if (initContext.IsDestination)
+			{
+				AcceptChanges();
+				_noTrackingChangesCount--;
+			}
+		}
+
+		#endregion
+
+		#region IEditable Members
+
+		public virtual void AcceptChanges()
+		{
+			foreach (var o in List)
+			{
+				if (o is EditableObject)
+					((EditableObject)o).AcceptChanges();
+				else if (o is IEditable)
+					((IEditable)o).AcceptChanges();
+			}
+
+			_newItems = null;
+			_delItems = null;
+		}
+
+		public virtual void RejectChanges()
+		{
+			_noTrackingChangesCount++;
+
+			if (_delItems != null)
+				foreach (var o in _delItems)
+					Add(o);
+
+			if (_newItems != null)
+				foreach (var o in _newItems)
+					Remove(o);
+
+			foreach (var o in List)
+			{
+				if (o is EditableObject)
+					((EditableObject)o).RejectChanges();
+				else if (o is IEditable)
+					((IEditable)o).RejectChanges();
+			}
+
+			_noTrackingChangesCount--;
+
+			_newItems  = null;
+			_delItems  = null;
+		}
+
+		public virtual bool IsDirty
+		{
+			get
+			{
+				if (_newItems != null && _newItems.Count > 0 ||
+					_delItems != null && _delItems.Count > 0)
+					return true;
+
+				foreach (var o in List)
+				{
+					if (o is EditableObject)
+						if (((EditableObject)o).IsDirty)
+							return true;
+					else if (o is IEditable)
+						if (((IEditable)o).IsDirty)
+							return true;
+				}
+
+				return false;
+			}
+		}
+
+		void IPrintDebugState.PrintDebugState(PropertyInfo propertyInfo, ref string str)
+		{
+			var original = List.Count
+				- (_newItems == null? 0: _newItems.Count)
+				+ (_delItems == null? 0: _delItems.Count);
+
+			str += string.Format("{0,-20} {1} {2,-40} {3,-40} \r\n",
+				propertyInfo.Name, IsDirty? "*": " ", original, List.Count);
+		}
+
+		#endregion
+
+		#region IList Members
+
+		public override bool IsFixedSize
+		{
+			get { return BindingListImpl.IsFixedSize; }
+		}
+
+		public override bool IsReadOnly
+		{
+			get { return BindingListImpl.IsReadOnly; }
+		}
+
+		public override object this[int index]
+		{
+			get { return BindingListImpl[index];  }
+			set
+			{
+				var o = BindingListImpl[index];
+
+				if (o != value)
+				{
+					RemoveInternal(o);
+					AddInternal(value);
+				}
+				
+				BindingListImpl[index] = value;
+			}
+		} 
+
+		public override int Add(object value)
+		{
+			AddInternal(value);
+
+			return BindingListImpl.Add(value);
+		}
+
+		public override void Clear()
+		{
+			if (List.Count > 0)
+				RemoveInternal(List);
+			
+			BindingListImpl.Clear();
+		}
+
+		public override bool Contains(object item)
+		{
+			return BindingListImpl.Contains(item);
+		}
+
+		public override int IndexOf(object value)
+		{
+			return BindingListImpl.IndexOf(value);
+		}
+
+		public override void Insert(int index, object value)
+		{
+			AddInternal(value);
+
+			BindingListImpl.Insert(index, value);
+		}
+
+		public override void Remove(object value)
+		{
+			RemoveInternal(value);
+
+			BindingListImpl.Remove(value);
+		}
+
+		public override void RemoveAt(int index)
+		{
+			RemoveInternal(BindingListImpl[index]);
+			
+			BindingListImpl.RemoveAt(index);
+		}
+		
+		#endregion
+
+		#region ICollection Members
+
+		public override int Count
+		{
+			get { return BindingListImpl.Count; }
+		}
+
+		public override bool IsSynchronized
+		{
+			get { return BindingListImpl.IsSynchronized; }
+		}
+
+		public override object SyncRoot
+		{
+			get { return BindingListImpl.SyncRoot; }
+		}
+
+		public override void CopyTo(Array array, int arrayIndex)
+		{
+			BindingListImpl.CopyTo(array, arrayIndex);
+		}
+		
+		#endregion
+
+		#region IEnumerable Members
+
+		public override IEnumerator GetEnumerator()
+		{
+			return BindingListImpl.GetEnumerator();
+		}
+		
+		#endregion
+
+		#region Overridden Methods
+
+		public int Add(object value, bool trackChanges)
+		{
+			if (!trackChanges) _noTrackingChangesCount++;
+			var idx = Add(value);
+			if (!trackChanges) _noTrackingChangesCount--;
+
+			return idx;
+		}
+
+		public override void AddRange(ICollection c)
+		{
+			if (c.Count == 0)
+				return;
+			
+			AddInternal(c);
+
+			BindingListImpl.AddRange(c);
+		}
+
+		public void AddRange(ICollection c, bool trackChanges)
+		{
+			if (c.Count == 0)
+				return;
+
+			if (!trackChanges) _noTrackingChangesCount++;
+			AddRange(c);
+			if (!trackChanges) _noTrackingChangesCount--;
+		}
+
+		public override int BinarySearch(int index, int count, object value, IComparer comparer)
+		{
+			return List.BinarySearch(index, count, value, comparer);
+		}
+
+		public override int BinarySearch(object value)
+		{
+			return List.BinarySearch(value);
+		}
+
+		public override int BinarySearch(object value, IComparer comparer)
+		{
+			return List.BinarySearch(value, comparer);
+		}
+
+		public override int Capacity
+		{
+			get { return List.Capacity;  }
+			set { List.Capacity = value; }
+		}
+
+		public void Clear(bool trackChanges)
+		{
+			if (!trackChanges) _noTrackingChangesCount++;
+			Clear();
+			if (!trackChanges) _noTrackingChangesCount--;
+		}
+
+		protected EditableArrayList Clone(EditableArrayList el)
+		{
+			if (_newItems != null) el._newItems = (ArrayList)_newItems.Clone();
+			if (_delItems != null) el._delItems = (ArrayList)_delItems.Clone();
+
+			el.NotifyChanges           = NotifyChanges;
+			el._noTrackingChangesCount = _noTrackingChangesCount;
+
+			return el;
+		}
+
+		public override object Clone()
+		{
+			return Clone(new EditableArrayList(ItemType, (ArrayList)List.Clone()));
+		}
+
+		public override void CopyTo(int index, Array array, int arrayIndex, int count)
+		{
+			List.CopyTo(index, array, arrayIndex, count);
+		}
+
+		public override void CopyTo(Array array)
+		{
+			List.CopyTo(array);
+		}
+
+		public override bool Equals(object obj)
+		{
+			return List.Equals(obj);
+		}
+
+		public override IEnumerator GetEnumerator(int index, int count)
+		{
+			return List.GetEnumerator(index, count);
+		}
+
+		public override int GetHashCode()
+		{
+			return List.GetHashCode();
+		}
+
+		public override ArrayList GetRange(int index, int count)
+		{
+			return List.GetRange(index, count);
+		}
+
+		public override int IndexOf(object value, int startIndex)
+		{
+			return List.IndexOf(value, startIndex);
+		}
+
+		public override int IndexOf(object value, int startIndex, int count)
+		{
+			return List.IndexOf(value, startIndex, count);
+		}
+
+		public void Insert(int index, object value, bool trackChanges)
+		{
+			if (!trackChanges) _noTrackingChangesCount++;
+			Insert(index, value);
+			if (!trackChanges) _noTrackingChangesCount--;
+		}
+
+		public override void InsertRange(int index, ICollection c)
+		{
+			BindingListImpl.InsertRange(index, c);
+		}
+
+		public void InsertRange(int index, ICollection c, bool trackChanges)
+		{
+			if (!trackChanges) _noTrackingChangesCount++;
+			InsertRange(index, c);
+			if (!trackChanges) _noTrackingChangesCount--;
+		}
+
+		public override int LastIndexOf(object value)
+		{
+			return List.LastIndexOf(value);
+		}
+
+		public override int LastIndexOf(object value, int startIndex)
+		{
+			return List.LastIndexOf(value, startIndex);
+		}
+
+		public override int LastIndexOf(object value, int startIndex, int count)
+		{
+			return List.LastIndexOf(value, startIndex, count);
+		}
+
+		public void Remove(object obj, bool trackChanges)
+		{
+			if (!trackChanges) _noTrackingChangesCount++;
+			Remove(obj);
+			if (!trackChanges) _noTrackingChangesCount--;
+		}
+
+		public void RemoveAt(int index, bool trackChanges)
+		{
+			if (!trackChanges) _noTrackingChangesCount++;
+			RemoveAt(index);
+			if (!trackChanges) _noTrackingChangesCount--;
+		}
+
+		public override void RemoveRange(int index, int count)
+		{
+			RemoveInternal(GetRange(index, count));
+
+			BindingListImpl.RemoveRange(index, count);
+		}
+
+		public void RemoveRange(int index, int count, bool trackChanges)
+		{
+			if (!trackChanges) _noTrackingChangesCount++;
+			RemoveRange(index, count);
+			if (!trackChanges) _noTrackingChangesCount--;
+		}
+
+		public override void Reverse()
+		{
+			BindingListImpl.EndNew();
+
+			if (!BindingListImpl.IsSorted)
+				List.Reverse();
+			else
+				throw new InvalidOperationException("Reverse is not supported for already sorted arrays. Invoke IBindingList.RemoveSort() first or provide reverse sort direction.");
+
+			if (List.Count > 1)
+				OnResetList();
+		}
+
+		public override void Reverse(int index, int count)
+		{
+			BindingListImpl.EndNew();
+
+			if (!BindingListImpl.IsSorted)
+				List.Reverse(index, count);
+			else
+				throw new InvalidOperationException("Range Reverse is not supported for already sorted arrays. Invoke IBindingList.RemoveSort() first.");
+
+			if (count > 1)
+				OnResetList();
+		}
+
+		public override void SetRange(int index, ICollection c)
+		{
+			if (c.Count == 0)
+				return;
+
+			AddInternal(c);
+
+			BindingListImpl.SetRange(index, c);
+		}
+
+		public override void Sort()
+		{
+			BindingListImpl.EndNew();
+
+			if (!BindingListImpl.IsSorted)
+			{
+				List.Sort();
+
+				if (List.Count > 1)
+					OnResetList();
+			}
+			else
+			{
+				if (BindingListImpl.SortProperty != null)
+					BindingListImpl.ApplySort(BindingListImpl.SortProperty, BindingListImpl.SortDirection);
+				else if (BindingListImpl.SortDescriptions != null)
+					BindingListImpl.ApplySort(BindingListImpl.SortDescriptions);
+				else
+					throw new InvalidOperationException("Currently applied sort method is not recognized/supported by EditableArrayList.");
+			}
+		}
+
+		public override void Sort(int index, int count, IComparer comparer)
+		{
+			BindingListImpl.EndNew();
+
+			if (!BindingListImpl.IsSorted)
+				List.Sort(index, count, comparer);
+			else
+				throw new InvalidOperationException("Custom sorting is not supported on already sorted arrays. Invoke IBindingList.RemoveSort first.");
+
+			if (count > 1)
+				OnResetList();
+		}
+
+		public override void Sort(IComparer comparer)
+		{
+			BindingListImpl.EndNew();
+
+			if (!BindingListImpl.IsSorted)
+				List.Sort(comparer);
+			else
+				throw new InvalidOperationException("Custom sorting is not supported on already sorted arrays. Invoke IBindingList.RemoveSort first.");
+
+			if (List.Count > 1)
+				OnResetList();
+		}
+
+		public override object[] ToArray()
+		{
+			return List.ToArray();
+		}
+
+		public override Array ToArray(Type type)
+		{
+			return List.ToArray(type);
+		}
+
+		public override string ToString()
+		{
+			return List.ToString();
+		}
+
+		public override void TrimToSize()
+		{
+			List.TrimToSize();
+		}
+
+		#endregion
+
+		#region Static Methods
+
+		public static EditableArrayList Adapter(Type itemType, IList list)
+		{
+			if (list == null) throw new ArgumentNullException("list");
+
+			if (list.IsFixedSize)
+				return new EditableArrayList(itemType, new ArrayList(list));
+
+			return list is ArrayList?
+				new EditableArrayList(itemType, (ArrayList)list):
+				new EditableArrayList(itemType, ArrayList.Adapter(list));
+		}
+
+		public static new EditableArrayList Adapter(IList list)
+		{
+			return Adapter(TypeHelper.GetListItemType(list), list);
+		}
+
+		#endregion
+
+		#region IDisposable
+
+		public void Dispose()
+		{
+			Clear();
+		}
+
+		#endregion
+
+		#region SortMemberComparer
+
+		class SortMemberComparer : IComparer
+		{
+			readonly ListSortDirection  _direction;
+			readonly string[]           _memberNames;
+			readonly TypeAccessor       _typeAccessor;
+			readonly MemberAccessor[]   _members;
+			readonly MemberAccessor     _member;
+
+			public SortMemberComparer(TypeAccessor typeAccessor, ListSortDirection direction, string[] memberNames)
+			{
+				_typeAccessor = typeAccessor;
+				_direction    = direction;
+				_memberNames  = memberNames;
+				_members      = new MemberAccessor[memberNames.Length];
+
+				_member = _members[0] = _typeAccessor[memberNames[0]];
+
+				if (_member == null)
+					throw new InvalidOperationException(
+						string.Format("Field '{0}.{1}' not found.",
+							_typeAccessor.OriginalType.Name, _memberNames[0]));
+			}
+
+			public int Compare(object x, object y)
+			{
+				var a = _member.GetValue(x);
+				var b = _member.GetValue(y);
+				var n = Comparer.Default.Compare(a, b);
+
+				if (n == 0) for (var i = 1; n == 0 && i < _members.Length; i++)
+				{
+					var member = _members[i];
+
+					if (member == null)
+					{
+						member = _members[i] = _typeAccessor[_memberNames[i]];
+
+						if (member == null)
+							throw new InvalidOperationException(
+								string.Format("Field '{0}.{1}' not found.",
+									_typeAccessor.OriginalType.Name, _memberNames[i]));
+					}
+
+					a = member.GetValue(x);
+					b = member.GetValue(y);
+					n = Comparer.Default.Compare(a, b);
+				}
+
+				return _direction == ListSortDirection.Ascending? n: -n;
+			}
+		}
+
+		#endregion
+
+		#region ITypedList Members
+
+		[NonSerialized]
+		private TypedListImpl _typedListImpl;
+		private TypedListImpl  TypedListImpl
+		{
+			get { return _typedListImpl ?? (_typedListImpl = new TypedListImpl(ItemType)); }
+		}
+
+		public PropertyDescriptorCollection GetItemProperties(PropertyDescriptor[] listAccessors)
+		{
+			return GetItemProperties(listAccessors, null, null, true);
+		}
+
+		public PropertyDescriptorCollection GetItemProperties(
+			PropertyDescriptor[] listAccessors,
+			Type                 objectViewType,
+			IsNullHandler        isNull,
+			bool                 cache)
+		{
+			return TypedListImpl.GetItemProperties(listAccessors, objectViewType, isNull, cache);
+		}
+
+		public string GetListName(PropertyDescriptor[] listAccessors)
+		{
+			return TypedListImpl.GetListName(listAccessors);
+		}
+
+		#endregion
+
+		#region IBindingList Members
+
+		sealed class BindingListImplInternal : BindingListImpl
+		{
+			readonly EditableArrayList _owner;
+
+			public BindingListImplInternal(IList list, Type itemType, EditableArrayList owner)
+				: base(list, itemType)
+			{
+				_owner = owner;
+			}
+
+			protected override void OnListChanged(EditableListChangedEventArgs e)
+			{
+				_owner.OnListChanged(e);
+			}
+
+			protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs ea)
+			{
+				_owner.OnCollectionChanged(ea);
+			}
+		}
+
+		[NonSerialized]
+		private BindingListImpl _bindingListImpl;
+		private BindingListImpl  BindingListImpl
+		{
+			get { return _bindingListImpl ?? (_bindingListImpl = new BindingListImplInternal(List, ItemType, this)); }
+		}
+
+		public void AddIndex(PropertyDescriptor property)
+		{
+			BindingListImpl.AddIndex(property);
+		}
+
+		public object AddNew()
+		{
+			object newObject;
+
+			try
+			{
+				BeginSuppressEvent();
+				newObject = BindingListImpl.AddNew();
+			}
+			finally
+			{
+				EndSuppressEvent();
+			}
+
+			AddInternal(newObject);
+
+			var index = IndexOf(newObject);
+
+			EndSuppressEvent();
+			OnAddItem(newObject, index);
+
+			return newObject;
+		}
+
+		public bool AllowEdit
+		{
+			get { return BindingListImpl.AllowEdit; }
+		}
+
+		public bool AllowNew
+		{
+			get { return BindingListImpl.AllowNew; }
+		}
+
+		public bool AllowRemove
+		{
+			get { return BindingListImpl.AllowRemove; }
+		}
+
+		public void ApplySort(PropertyDescriptor property, ListSortDirection direction)
+		{
+			BindingListImpl.ApplySort(property, direction);
+		}
+
+		public int Find(PropertyDescriptor property, object key)
+		{
+			return BindingListImpl.Find(property, key);
+		}
+
+		public bool IsSorted
+		{
+			get { return BindingListImpl.IsSorted; }
+		}
+
+		public void RemoveIndex(PropertyDescriptor property)
+		{
+			BindingListImpl.RemoveIndex(property);
+		}
+
+		public void RemoveSort()
+		{
+			BindingListImpl.RemoveSort();
+		}
+
+		public ListSortDirection SortDirection
+		{
+			get { return BindingListImpl.SortDirection; }
+		}
+
+		public PropertyDescriptor SortProperty
+		{
+			get { return BindingListImpl.SortProperty; }
+		}
+
+		public bool SupportsChangeNotification
+		{
+			get { return BindingListImpl.SupportsChangeNotification; }
+		}
+
+		public event ListChangedEventHandler ListChanged;
+
+		private bool _supressEvent;
+
+		private void BeginSuppressEvent()
+		{
+			_supressEvent = true;
+		}
+
+		private void EndSuppressEvent()
+		{
+			_supressEvent = false;
+		}
+
+		public bool SupportsSearching
+		{
+			get { return BindingListImpl.SupportsSearching; }
+		}
+
+		public bool SupportsSorting
+		{
+			get { return BindingListImpl.SupportsSorting; }
+		}
+
+		#endregion
+
+		#region Sorting Enhancement
+
+		public void CreateSortSubstitution(string originalProperty, string substituteProperty)
+		{
+			BindingListImpl.CreateSortSubstitution(originalProperty, substituteProperty);
+		}
+
+		public void RemoveSortSubstitution(string originalProperty)
+		{
+			BindingListImpl.RemoveSortSubstitution(originalProperty);
+		}
+
+		#endregion
+
+		#region IBindingListView Members
+
+		public void ApplySort(ListSortDescriptionCollection sorts)
+		{
+			BindingListImpl.ApplySort(sorts);
+		}
+
+		public string Filter
+		{
+			get { return BindingListImpl.Filter;  }
+			set { BindingListImpl.Filter = value; }
+		}
+
+		public void RemoveFilter()
+		{
+			BindingListImpl.RemoveFilter();
+		}
+
+		public ListSortDescriptionCollection SortDescriptions
+		{
+			get { return BindingListImpl.SortDescriptions; }
+		}
+
+		public bool SupportsAdvancedSorting
+		{
+			get { return BindingListImpl.SupportsAdvancedSorting; }
+		}
+
+		public bool SupportsFiltering
+		{
+			get { return BindingListImpl.SupportsFiltering; }
+		}
+
+		#endregion
+
+		#region ICancelAddNew Members
+
+		public void CancelNew(int itemIndex)
+		{
+			if (itemIndex >= 0 && itemIndex < List.Count)
+				NewItems.Remove(List[itemIndex]);
+
+			BindingListImpl.CancelNew(itemIndex);
+		}
+
+		public void EndNew(int itemIndex)
+		{
+			BindingListImpl.EndNew(itemIndex);
+		}
+
+		#endregion
+
+		#region INotifyCollectionChanged Members
+
+		public event NotifyCollectionChangedEventHandler CollectionChanged;
+
+		protected virtual void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
+		{
+			if (!_supressEvent && NotifyChanges && CollectionChanged != null)
+				CollectionChanged(this, e);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/EditableObjects/EditableList.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,369 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Diagnostics;
+
+namespace BLToolkit.EditableObjects
+{
+	[Serializable]
+	[DebuggerDisplay("Count = {Count}")]
+	public class EditableList<T> : EditableArrayList, IList<T>
+	{
+		#region Constructors
+
+		public EditableList()
+			: base(typeof(T))
+		{
+		}
+
+		public EditableList(int capacity)
+			: base(typeof(T), capacity)
+		{
+		}
+
+		public EditableList(ICollection c)
+			: base(typeof(T), c)
+		{
+		}
+
+		public EditableList(bool trackChanges)
+			: base(typeof(T), trackChanges)
+		{
+		}
+
+		public EditableList(int capacity, bool trackChanges)
+			: base(typeof(T), capacity, trackChanges)
+		{
+		}
+
+		public EditableList(ICollection c, bool trackChanges)
+			: base(typeof(T), c, trackChanges)
+		{
+		}
+
+		public EditableList(EditableList<T> list) 
+			: base(list, true)
+		{
+		}
+
+		public EditableList(EditableList<T> list, bool trackChanges)
+			: base(list, trackChanges)
+		{
+		}
+
+		#endregion
+
+		#region Typed Methods
+
+		public override object Clone()
+		{
+			return Clone(new EditableList<T>((ArrayList)List.Clone()));
+		}
+
+		public new T this[int index]
+		{
+			get { return (T)base[index]; }
+			set { base[index] = value; }
+		}
+
+		public new T[] ToArray()
+		{
+			return (T[])base.ToArray(typeof(T));
+		}
+
+		public new T AddNew()
+		{
+			return (T)base.AddNew();
+		}
+
+		public int RemoveAll(Predicate<T> match)
+		{
+			var n = 0;
+
+			for (var i = 0; i < Count; i++)
+			{
+				var item = this[i];
+
+				if (match(item))
+				{
+					Remove((object)item);
+					i--;
+					n++;
+				}
+			}
+
+			return n;
+		}
+
+		#endregion
+
+		#region Like List<T> Methods
+
+		public T Find(Predicate<T> match)
+		{
+			if (match == null) throw new ArgumentNullException("match");
+
+			foreach (T t in List)
+				if (match(t))
+					return t;
+
+			return default(T);
+		}
+
+		public EditableList<T> FindAll(Predicate<T> match)
+		{
+			if (match == null) throw new ArgumentNullException("match");
+
+			var list = new EditableList<T>();
+
+			foreach (T t in List)
+				if (match(t))
+					list.Add(t);
+
+			return list;
+		}
+
+		public int FindIndex(Predicate<T> match)
+		{
+			return FindIndex(0, List.Count, match);
+		}
+
+		public int FindIndex(int startIndex, Predicate<T> match)
+		{
+			return FindIndex(startIndex, List.Count - startIndex, match);
+		}
+
+		public int FindIndex(int startIndex, int count, Predicate<T> match)
+		{
+			if (startIndex > List.Count)
+				throw new ArgumentOutOfRangeException("startIndex");
+
+			if (count < 0 || startIndex > List.Count - count)
+				throw new ArgumentOutOfRangeException("count");
+
+			if (match == null)
+				throw new ArgumentNullException("match");
+
+			for (var i = startIndex; i < startIndex + count; i++)
+				if (match((T)List[i]))
+					return i;
+
+			return -1;
+		}
+
+		public T FindLast(Predicate<T> match)
+		{
+			if (match == null) throw new ArgumentNullException("match");
+
+			for (var i = List.Count - 1; i >= 0; i--)
+			{
+				var t = (T)List[i];
+
+				if (match(t))
+					return t;
+			}
+
+			return default(T);
+		}
+
+		public int FindLastIndex(Predicate<T> match)
+		{
+			return FindLastIndex(List.Count - 1, List.Count, match);
+		}
+
+		public int FindLastIndex(int startIndex, Predicate<T> match)
+		{
+			return FindLastIndex(startIndex, startIndex + 1, match);
+		}
+
+		public int FindLastIndex(int startIndex, int count, Predicate<T> match)
+		{
+			if (startIndex >= List.Count)
+				throw new ArgumentOutOfRangeException("startIndex");
+
+			if (count < 0 || startIndex - count + 1 < 0)
+				throw new ArgumentOutOfRangeException("count");
+
+			if (match == null)
+				throw new ArgumentNullException("match");
+
+			for (var i = startIndex; i > startIndex - count; i--)
+			{
+				var t = (T)List[i];
+
+				if (match(t))
+					return i;
+			}
+
+			return -1;
+		}
+
+		public void ForEach(Action<T> action)
+		{
+			if (action == null) throw new ArgumentNullException("action");
+
+			foreach (T t in List)
+				action(t);
+		}
+
+		public void Sort(IComparer<T> comparer)
+		{
+			Sort(0, List.Count, comparer);
+		}
+
+		public void Sort(int index, int count, IComparer<T> comparer)
+		{
+			if (List.Count > 1 && count > 1)
+			{
+				var items = new T[count];
+
+				List.CopyTo(index, items, 0, count);
+				Array.Sort(items, index, count, comparer);
+
+				for (var i = 0; i < count; i++)
+					List[i + index] = items[i];
+
+				OnListChanged(ListChangedType.Reset, 0);
+			}
+		}
+
+		public void Sort(Comparison<T> comparison)
+		{
+			if (List.Count > 1)
+			{
+				var items = new T[List.Count];
+
+				List.CopyTo(items);
+				Array.Sort(items, comparison);
+
+				for (var i = 0; i < List.Count; i++)
+					List[i] = items[i];
+
+				OnListChanged(ListChangedType.Reset, 0);
+			}
+		}
+
+		#endregion
+
+		#region Static Methods
+
+		internal EditableList(ArrayList list)
+			: base(typeof(T), list)
+		{
+		}
+
+		public static EditableList<T> Adapter(List<T> list)
+		{
+			return new EditableList<T>(ArrayList.Adapter(list));
+		}
+
+		public static new EditableList<T> Adapter(IList list)
+		{
+			return list is ArrayList? 
+				new EditableList<T>((ArrayList)list):
+				new EditableList<T>(ArrayList.Adapter(list));
+		}
+
+		#endregion
+
+		#region IList<T> Members
+
+		public int IndexOf(T item)
+		{
+			return IndexOf((object)item);
+		}
+
+		public void Insert(int index, T item)
+		{
+			Insert(index, (object)item);
+		}
+
+		#endregion
+
+		#region ICollection<T> Members
+
+		public void Add(T item)
+		{
+			Add((object)item);
+		}
+
+		public bool Contains(T item)
+		{
+			return Contains((object)item);
+		}
+
+		public void CopyTo(T[] array, int arrayIndex)
+		{
+			CopyTo((Array)array, arrayIndex);
+		}
+
+		public bool Remove(T item)
+		{
+			if (Contains(item) == false)
+				return false;
+
+			Remove((object)item);
+
+			return true;
+		}
+
+		#endregion
+
+		#region IEnumerable<T> Members
+
+		public new IEnumerator<T> GetEnumerator()
+		{
+			return new Enumerator(List.GetEnumerator());
+		}
+
+		class Enumerator : IEnumerator<T>
+		{
+			public Enumerator(IEnumerator enumerator)
+			{
+				_enumerator = enumerator;
+			}
+
+			private readonly IEnumerator _enumerator;
+
+			#region IEnumerator<T> Members
+
+			T IEnumerator<T>.Current
+			{
+				get { return (T)_enumerator.Current; }
+			}
+
+			#endregion
+
+			#region IEnumerator Members
+
+			object IEnumerator.Current
+			{
+				get { return _enumerator.Current; }
+			}
+
+			bool IEnumerator.MoveNext()
+			{
+				return _enumerator.MoveNext();
+			}
+
+			void IEnumerator.Reset()
+			{
+				_enumerator.Reset();
+			}
+
+			#endregion
+
+			#region IDisposable Members
+
+			void IDisposable.Dispose()
+			{
+			}
+
+			#endregion
+		}
+
+		#endregion
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/EditableObjects/EditableListChangedEventArgs.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,27 @@
+using System.ComponentModel;
+
+namespace BLToolkit.EditableObjects
+{
+	public class EditableListChangedEventArgs : ListChangedEventArgs
+	{
+		public EditableListChangedEventArgs(int newIndex, int oldIndex)
+			: base(ListChangedType.ItemMoved, newIndex, oldIndex)
+		{
+		}
+
+		public EditableListChangedEventArgs(ListChangedType listChangedType, int index)
+			: base(listChangedType, index)
+		{
+		}
+
+		public EditableListChangedEventArgs(ListChangedType listChangedType)
+			: base(listChangedType, -1)
+		{
+		}
+
+		public EditableListChangedEventArgs(int index, PropertyDescriptor propDesc)
+			: base(ListChangedType.ItemChanged, index, propDesc)
+		{
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/EditableObjects/EditableObject.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,301 @@
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Data.SqlTypes;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Xml;
+using System.Xml.Serialization;
+
+using BLToolkit.Common;
+using BLToolkit.ComponentModel;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+using BLToolkit.Validation;
+
+namespace BLToolkit.EditableObjects
+{
+	#region Instance Types
+	[GlobalInstanceType(typeof(byte),     typeof(EditableValue<byte>))]
+	[GlobalInstanceType(typeof(char),     typeof(EditableValue<char>))]
+	[GlobalInstanceType(typeof(ushort),   typeof(EditableValue<ushort>))]
+	[GlobalInstanceType(typeof(uint),     typeof(EditableValue<uint>))]
+	[GlobalInstanceType(typeof(ulong),    typeof(EditableValue<ulong>))]
+	[GlobalInstanceType(typeof(bool),     typeof(EditableValue<bool>))]
+	[GlobalInstanceType(typeof(sbyte),    typeof(EditableValue<sbyte>))]
+	[GlobalInstanceType(typeof(short),    typeof(EditableValue<short>))]
+	[GlobalInstanceType(typeof(int),      typeof(EditableValue<int>))]
+	[GlobalInstanceType(typeof(long),     typeof(EditableValue<long>))]
+	[GlobalInstanceType(typeof(float),    typeof(EditableValue<float>))]
+	[GlobalInstanceType(typeof(double),   typeof(EditableValue<double>))]
+	[GlobalInstanceType(typeof(string),   typeof(EditableValue<string>), "")]
+	[GlobalInstanceType(typeof(DateTime), typeof(EditableValue<DateTime>))]
+	[GlobalInstanceType(typeof(decimal),  typeof(EditableValue<decimal>))]
+	[GlobalInstanceType(typeof(Guid),     typeof(EditableValue<Guid>))]
+
+	[GlobalInstanceType(typeof(byte?),     typeof(EditableValue<byte?>))]
+	[GlobalInstanceType(typeof(char?),     typeof(EditableValue<char?>))]
+	[GlobalInstanceType(typeof(ushort?),   typeof(EditableValue<ushort?>))]
+	[GlobalInstanceType(typeof(uint?),     typeof(EditableValue<uint?>))]
+	[GlobalInstanceType(typeof(ulong?),    typeof(EditableValue<ulong?>))]
+	[GlobalInstanceType(typeof(bool?),     typeof(EditableValue<bool?>))]
+	[GlobalInstanceType(typeof(sbyte?),    typeof(EditableValue<sbyte?>))]
+	[GlobalInstanceType(typeof(short?),    typeof(EditableValue<short?>))]
+	[GlobalInstanceType(typeof(int?),      typeof(EditableValue<int?>))]
+	[GlobalInstanceType(typeof(long?),     typeof(EditableValue<long?>))]
+	[GlobalInstanceType(typeof(float?),    typeof(EditableValue<float?>))]
+	[GlobalInstanceType(typeof(double?),   typeof(EditableValue<double?>))]
+	[GlobalInstanceType(typeof(DateTime?), typeof(EditableValue<DateTime?>))]
+	[GlobalInstanceType(typeof(decimal?),  typeof(EditableValue<decimal?>))]
+	[GlobalInstanceType(typeof(Guid?),     typeof(EditableValue<Guid?>))]
+
+	[GlobalInstanceType(typeof(SqlBoolean),  typeof(EditableValue<SqlBoolean>))]
+	[GlobalInstanceType(typeof(SqlByte),     typeof(EditableValue<SqlByte>))]
+	[GlobalInstanceType(typeof(SqlDateTime), typeof(EditableValue<SqlDateTime>))]
+	[GlobalInstanceType(typeof(SqlDecimal),  typeof(EditableValue<SqlDecimal>))]
+	[GlobalInstanceType(typeof(SqlDouble),   typeof(EditableValue<SqlDouble>))]
+	[GlobalInstanceType(typeof(SqlGuid),     typeof(EditableValue<SqlGuid>))]
+	[GlobalInstanceType(typeof(SqlInt16),    typeof(EditableValue<SqlInt16>))]
+	[GlobalInstanceType(typeof(SqlInt32),    typeof(EditableValue<SqlInt32>))]
+	[GlobalInstanceType(typeof(SqlInt64),    typeof(EditableValue<SqlInt64>))]
+	[GlobalInstanceType(typeof(SqlMoney),    typeof(EditableValue<SqlMoney>))]
+	[GlobalInstanceType(typeof(SqlSingle),   typeof(EditableValue<SqlSingle>))]
+	[GlobalInstanceType(typeof(SqlString),   typeof(EditableValue<SqlString>), "")]
+
+	[GlobalInstanceType(typeof(XmlDocument),    typeof(EditableXmlDocument))]
+	[GlobalInstanceType(typeof(EditableObject), typeof(EditableObjectHolder), IsObjectHolder=true)]
+	#endregion
+	[ImplementInterface(typeof(IEditable))]
+	[ImplementInterface(typeof(IMemberwiseEditable))]
+	[ImplementInterface(typeof(IPrintDebugState))]
+	[ImplementInterface(typeof(ISetParent))]
+	[ComVisible(true)]
+	[Serializable]
+	public abstract class EditableObject : EntityBase,
+		ICloneable, IEditableObject, INotifyPropertyChanged,
+		ISupportMapping, IValidatable, IPropertyChanged, INotifyObjectEdit
+	{
+		#region Constructor
+
+		protected EditableObject()
+		{
+			ISetParent setParent = this as ISetParent;
+
+			if (setParent != null)
+				setParent.SetParent(this, null);
+		}
+
+		#endregion
+
+		#region IEditable
+
+		public virtual void AcceptChanges()
+		{
+			if (this is IEditable)
+				((IEditable)this).AcceptChanges();
+		}
+
+		public virtual void RejectChanges()
+		{
+			var dirtyMembers = GetDirtyMembers();
+
+			if (this is IEditable)
+				((IEditable)this).RejectChanges();
+
+			foreach (PropertyInfo dirtyMember in dirtyMembers)
+				OnPropertyChanged(dirtyMember.Name);
+		}
+
+		[MapIgnore, Bindable(false)]
+		public virtual bool IsDirty
+		{
+			get { return this is IEditable? ((IEditable)this).IsDirty: false; }
+		}
+
+		public virtual void AcceptMemberChanges(string memberName)
+		{
+			if (this is IMemberwiseEditable)
+				((IMemberwiseEditable)this).AcceptMemberChanges(null, memberName);
+		}
+
+		public virtual void RejectMemberChanges(string memberName)
+		{
+			bool notifyChange = IsDirtyMember(memberName);
+
+			if (this is IMemberwiseEditable)
+				((IMemberwiseEditable)this).RejectMemberChanges(null, memberName);
+
+			if (notifyChange)
+				OnPropertyChanged(memberName);
+		}
+
+		public virtual bool IsDirtyMember(string memberName)
+		{
+			bool isDirty = false;
+
+			if (this is IMemberwiseEditable)
+				((IMemberwiseEditable)this).IsDirtyMember(null, memberName, ref isDirty);
+
+			return isDirty;
+		}
+
+		public virtual PropertyInfo[] GetDirtyMembers()
+		{
+			ArrayList list = new ArrayList();
+
+			if (this is IMemberwiseEditable)
+				((IMemberwiseEditable)this).GetDirtyMembers(null, list);
+
+			return (PropertyInfo[])list.ToArray(typeof(PropertyInfo));
+		}
+
+		[MapIgnore, Bindable(false)]
+		public virtual string PrintDebugState
+		{
+			get
+			{
+#if DEBUG
+				if (this is IPrintDebugState)
+				{
+					string s = string.Format(
+						"====== {0} ======\r\nIsDirty: {1}\r\n" +
+						"Property       IsDirty Original                                 Current\r\n" +
+						"==================== = ======================================== ========================================\r\n",
+						GetType().Name, IsDirty);
+
+					((IPrintDebugState)this).PrintDebugState(null, ref s);
+
+					return s + "\r\n";
+				}
+#endif
+				return "";
+			}
+		}
+
+		#endregion
+
+		#region ISupportMapping Members
+
+		private bool _isInMapping;
+		[MapIgnore, Bindable(false)]
+		public  bool  IsInMapping
+		{
+			get { return _isInMapping; }
+		}
+
+		protected void SetIsInMapping(bool isInMapping)
+		{
+			_isInMapping = isInMapping;
+		}
+
+		public virtual void BeginMapping(InitContext initContext)
+		{
+			_isInMapping = true;
+		}
+
+		public virtual void EndMapping(InitContext initContext)
+		{
+			if (initContext.IsDestination)
+				AcceptChanges();
+
+			_isInMapping = false;
+
+			if (initContext.IsDestination)
+				OnPropertyChanged("");
+		}
+
+		#endregion
+
+		#region Notify Changes
+
+		protected internal virtual void OnPropertyChanged(string propertyName)
+		{
+			if (NotifyChanges && PropertyChanged != null)
+				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+		}
+
+		private int _notNotifyChangesCount = 0;
+		[MapIgnore, Bindable(false), XmlIgnore]
+		public  bool  NotifyChanges
+		{
+			get { return _notNotifyChangesCount == 0;   }
+			set { _notNotifyChangesCount = value? 0: 1; }
+		}
+
+		public void LockNotifyChanges()
+		{
+			_notNotifyChangesCount++;
+		}
+
+		public void UnlockNotifyChanges()
+		{
+			_notNotifyChangesCount--;
+
+			if (_notNotifyChangesCount < 0)
+				throw new InvalidOperationException();
+		}
+
+		#endregion
+
+		#region IPropertyChanged Members
+
+		void IPropertyChanged.OnPropertyChanged(PropertyInfo propertyInfo)
+		{
+			if (_isInMapping == false)
+				OnPropertyChanged(propertyInfo.Name);
+		}
+
+		#endregion
+
+		#region INotifyPropertyChanged Members
+
+		[field : NonSerialized]
+		public virtual event PropertyChangedEventHandler PropertyChanged;
+
+		#endregion
+
+		#region IEditableObject Members
+
+		public virtual void BeginEdit()
+		{
+			if (ObjectEdit != null)
+				ObjectEdit(this, new ObjectEditEventArgs(ObjectEditType.Begin));
+		}
+
+		public virtual void CancelEdit()
+		{
+			if (ObjectEdit != null)
+				ObjectEdit(this, new ObjectEditEventArgs(ObjectEditType.Cancel));
+		}
+
+		public virtual void EndEdit()
+		{
+			if (ObjectEdit != null)
+				ObjectEdit(this, new ObjectEditEventArgs(ObjectEditType.End));
+		}
+
+		#endregion
+
+		#region INotifyObjectEdit Members
+
+		public event ObjectEditEventHandler ObjectEdit;
+
+		#endregion
+
+		#region ICloneable Members
+
+		///<summary>
+		///Creates a new object that is a copy of the current instance.
+		///</summary>
+		///<returns>
+		///A new object that is a copy of this instance.
+		///</returns>
+		object ICloneable.Clone()
+		{
+			return TypeAccessor.Copy(this);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/EditableObjects/EditableObjectHolder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,142 @@
+using System;
+using System.Collections;
+using System.Reflection;
+using System.ComponentModel;
+
+using BLToolkit.TypeBuilder;
+
+namespace BLToolkit.EditableObjects
+{
+	[Serializable]
+	public class /*struct*/ EditableObjectHolder : IEditable, IMemberwiseEditable, ISetParent, IPrintDebugState
+	{
+		public EditableObjectHolder(EditableObject obj)
+		{
+			_original = obj;
+			_current  = obj;
+
+			if (_current != null)
+				_current.PropertyChanged += _current_PropertyChanged;
+		}
+
+		void _current_PropertyChanged(object sender, PropertyChangedEventArgs e)
+		{
+			EditableObject obj = _parent as EditableObject;
+
+			if (obj != null)
+				obj.OnPropertyChanged(_propertyInfo.Name + "." + e.PropertyName);
+		}
+
+		private EditableObject _original;
+		private EditableObject _current;
+		private object         _parent;
+		private PropertyInfo   _propertyInfo;
+
+		[GetValue, SetValue]
+		public EditableObject Value
+		{
+			get { return _current; }
+			set
+			{
+				if (_current != null)
+					_current.PropertyChanged -= _current_PropertyChanged;
+
+				_current = value;
+
+				if (_current != null)
+					_current.PropertyChanged += _current_PropertyChanged;
+			}
+		}
+
+		#region IEditable Members
+
+		public void AcceptChanges()
+		{
+			_original = _current;
+
+			if (_current != null)
+				_current.AcceptChanges();
+		}
+
+		public void RejectChanges()
+		{
+			_current = _original;
+
+			if (_current != null)
+				_current.RejectChanges();
+		}
+
+		public bool IsDirty
+		{
+			get
+			{
+				if (_current == null)
+					return _original != null;
+
+				return _current != _original || _current.IsDirty;
+			}
+		}
+
+		#endregion
+
+		#region IMemberwiseEditable Members
+
+		public bool AcceptMemberChanges(PropertyInfo propertyInfo, string memberName)
+		{
+			if (memberName != propertyInfo.Name)
+				return false;
+
+			AcceptChanges();
+
+			return true;
+		}
+
+		public bool RejectMemberChanges(PropertyInfo propertyInfo, string memberName)
+		{
+			if (memberName != propertyInfo.Name)
+				return false;
+
+			RejectChanges();
+
+			return true;
+		}
+
+		public bool IsDirtyMember(PropertyInfo propertyInfo, string memberName, ref bool isDirty)
+		{
+			if (memberName != propertyInfo.Name)
+				return false;
+
+			isDirty = IsDirty;
+
+			return true;
+		}
+
+		public void GetDirtyMembers(PropertyInfo propertyInfo, ArrayList list)
+		{
+			if (IsDirty)
+				list.Add(propertyInfo);
+		}
+
+		#endregion
+
+		#region IPrintDebugState Members
+
+		public void PrintDebugState(PropertyInfo propertyInfo, ref string str)
+		{
+			str += string.Format("{0,-20} {1} {2,-40} {3,-40} \r\n",
+				propertyInfo.Name, IsDirty? "*": " ", _original, _current);
+		}
+
+		#endregion
+
+		#region ISetParent Members
+
+		public void SetParent(object parent, PropertyInfo propertyInfo)
+		{
+			_parent       = parent;
+			_propertyInfo = propertyInfo;
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/EditableObjects/EditableObjectT.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,38 @@
+using System;
+
+using BLToolkit.Reflection;
+
+namespace BLToolkit.EditableObjects
+{
+	[Serializable]
+	public abstract class EditableObject<T> : EditableObject
+		where T : EditableObject<T>
+	{
+		#region CreateInstance
+
+		public static T CreateInstance()
+		{
+			return TypeAccessor.CreateInstanceEx<T>();
+		}
+
+		#endregion
+
+		#region Clone
+
+		public virtual T Clone()
+		{
+			return (T)TypeAccessor.Copy(this);
+		}
+			
+		#endregion
+
+		#region Copy
+
+		public void CopyTo(T dest)
+		{
+			TypeAccessor.Copy(this, dest);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/EditableObjects/EditableValue.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,103 @@
+using System;
+using System.Collections;
+using System.Reflection;
+
+using BLToolkit.TypeBuilder;
+
+namespace BLToolkit.EditableObjects
+{
+	[Serializable]
+	public struct EditableValue<T>: IEditable, IMemberwiseEditable, IPrintDebugState
+	{
+		private T _original;
+		private T _current;
+
+		public EditableValue(T value)
+		{
+			_original = value;
+			_current  = value;
+		}
+
+		[GetValue, SetValue]
+		public T Value
+		{
+			get { return _current;  }
+			set { _current = value; }
+		}
+
+		#region IEditable Members
+
+		public void AcceptChanges()
+		{
+			_original = _current;
+		}
+
+		public void RejectChanges()
+		{
+			_current = _original;
+		}
+
+		public bool IsDirty
+		{
+			get
+			{
+				object o = _original;
+				object c = _current;
+
+				return o == null? c != null: o.Equals(c) == false;
+			}
+		}
+
+		#endregion
+
+		#region IMemberwiseEditable Members
+
+		public bool AcceptMemberChanges(PropertyInfo propertyInfo, string memberName)
+		{
+			if (memberName != propertyInfo.Name)
+				return false;
+
+			AcceptChanges();
+
+			return true;
+		}
+
+		public bool RejectMemberChanges(PropertyInfo propertyInfo, string memberName)
+		{
+			if (memberName != propertyInfo.Name)
+				return false;
+
+			RejectChanges();
+
+			return true;
+		}
+
+		public bool IsDirtyMember(PropertyInfo propertyInfo, string memberName, ref bool isDirty)
+		{
+			if (memberName != propertyInfo.Name)
+				return false;
+
+			isDirty = IsDirty;
+
+			return true;
+		}
+
+		public void GetDirtyMembers(PropertyInfo propertyInfo, ArrayList list)
+		{
+			if (IsDirty)
+				list.Add(propertyInfo);
+		}
+
+		#endregion
+
+		#region IPrintDebugState Members
+
+		public void PrintDebugState(PropertyInfo propertyInfo, ref string str)
+		{
+			str += string.Format("{0,-20} {1} {2,-40} {3,-40} \r\n",
+				propertyInfo.Name, IsDirty? "*": " ", _original, _current);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/EditableObjects/EditableXmlDocument.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,267 @@
+using System;
+using System.Collections;
+using System.Reflection;
+using System.Xml;
+
+using BLToolkit.TypeBuilder;
+
+namespace BLToolkit.EditableObjects
+{
+	[Serializable]
+	public class EditableXmlDocument: IEditable, ISetParent, IMemberwiseEditable, IPrintDebugState
+	{
+		private          Stack                      _changedNodes;
+		private          XmlDocument                _original;
+		private          XmlDocument                _current;
+		private          IPropertyChanged           _parent;
+		private          PropertyInfo               _propertyInfo;
+
+		public EditableXmlDocument()
+			: this(new XmlDocument())
+		{
+		}
+
+		public EditableXmlDocument(XmlDocument value)
+		{
+			_changedNodes = null;
+			_current      = value;
+			_original     = value;
+
+			StartXmlDocTracking();
+		}
+
+		[GetValue, SetValue]
+		public XmlDocument Value
+		{
+			get { return _current; }
+			set
+			{
+				if (_current == value)
+					return;
+
+				if (_current == _original)
+					StopXmlDocTracking();
+
+				// Drop changes, if any.
+				//
+				if (_changedNodes != null)
+					_changedNodes.Clear();
+
+				_current = value;
+
+				if (_current == _original)
+					StartXmlDocTracking();
+			}
+		}
+
+		private void StartXmlDocTracking()
+		{
+			if (_current == null)
+				return;
+
+			_current.NodeInserted += HandleNodeChanged;
+			_current.NodeRemoved  += HandleNodeChanged;
+			_current.NodeChanged  += HandleNodeChanged;
+		}
+
+		private void StopXmlDocTracking()
+		{
+			if (_current == null)
+				return;
+
+			_current.NodeInserted -= HandleNodeChanged;
+			_current.NodeRemoved  -= HandleNodeChanged;
+			_current.NodeChanged  -= HandleNodeChanged;
+		}
+
+		private void HandleNodeChanged(object sender, XmlNodeChangedEventArgs ea)
+		{
+			if (ea.Action == XmlNodeChangedAction.Change && ea.NewValue == ea.OldValue)
+			{
+				// A void change can be ignored.
+				//
+				return;
+			}
+
+			if (_changedNodes == null)
+				_changedNodes = new Stack();
+
+			_changedNodes.Push(new XmlNodeTrackBack(ea));
+
+			// Propagate changes to parent object, if set.
+			//
+			if (_parent != null)
+				_parent.OnPropertyChanged(_propertyInfo);
+		}
+
+		#region IEditable Members
+
+		public void AcceptChanges()
+		{
+			if (_original != _current)
+			{
+				_original = _current;
+				StartXmlDocTracking();
+			}
+			else
+			{
+				// Let them go away.
+				//
+				if (_changedNodes != null)
+					_changedNodes.Clear();
+			}
+		}
+
+		public void RejectChanges()
+		{
+			if (_original != _current)
+			{
+				_current = _original;
+				StartXmlDocTracking();
+			}
+			else if (_changedNodes != null && _changedNodes.Count > 0)
+			{
+				// Don't fall into an infinite loop.
+				//
+				StopXmlDocTracking();
+
+				// A Stack enumerates from back to front.
+				//
+				foreach (XmlNodeTrackBack nodeTrackBack in _changedNodes)
+				{
+					switch (nodeTrackBack.Action)
+					{
+						case XmlNodeChangedAction.Insert:
+							if (nodeTrackBack.Node.NodeType == XmlNodeType.Attribute)
+								((XmlElement)nodeTrackBack.Value).Attributes.Remove((XmlAttribute)nodeTrackBack.Node);
+							else
+								((XmlNode)nodeTrackBack.Value).RemoveChild(nodeTrackBack.Node);
+							break;
+						case XmlNodeChangedAction.Remove:
+							// NB: The order of children nodes may change.
+							//
+							if (nodeTrackBack.Node.NodeType == XmlNodeType.Attribute)
+								((XmlElement)nodeTrackBack.Value).Attributes.Append((XmlAttribute)nodeTrackBack.Node);
+							else
+								((XmlNode)nodeTrackBack.Value).AppendChild(nodeTrackBack.Node);
+							break;
+						case XmlNodeChangedAction.Change:
+							nodeTrackBack.Node.Value = (string)nodeTrackBack.Value;
+							break;
+					}
+				}
+
+				_changedNodes.Clear();
+				StartXmlDocTracking();
+			}
+		}
+
+		public bool IsDirty
+		{
+			get
+			{
+				if (_current == _original)
+					return _changedNodes != null && _changedNodes.Count > 0;
+
+				if (_current == null || _original == null)
+					return true;
+
+				return _current.InnerXml.TrimEnd() != _original.InnerXml.TrimEnd();
+			}
+		}
+
+		#endregion
+
+		#region IMemberwiseEditable Members
+
+		public bool AcceptMemberChanges(PropertyInfo propertyInfo, string memberName)
+		{
+			if (memberName != propertyInfo.Name)
+				return false;
+
+			AcceptChanges();
+
+			return true;
+		}
+
+		public bool RejectMemberChanges(PropertyInfo propertyInfo, string memberName)
+		{
+			if (memberName != propertyInfo.Name)
+				return false;
+
+			RejectChanges();
+
+			return true;
+		}
+
+		public bool IsDirtyMember(PropertyInfo propertyInfo, string memberName, ref bool isDirty)
+		{
+			if (memberName != propertyInfo.Name)
+				return false;
+
+			isDirty = IsDirty;
+
+			return true;
+		}
+
+		public void GetDirtyMembers(PropertyInfo propertyInfo, ArrayList list)
+		{
+			if (IsDirty)
+				list.Add(propertyInfo);
+		}
+
+		#endregion
+
+		#region IPrintDebugState Members
+
+		public void PrintDebugState(PropertyInfo propertyInfo, ref string str)
+		{
+			str += string.Format("{0,-20} {1} {2,-80}\r\n",
+				propertyInfo.Name, IsDirty? "*": " ", _current != null? _current.OuterXml: "(null)");
+		}
+
+		#endregion
+
+		#region ISetParent Members
+
+		public void SetParent(object parent, PropertyInfo propertyInfo)
+		{
+			_parent       = parent as IPropertyChanged;
+			_propertyInfo = propertyInfo;
+		}
+
+		#endregion
+
+		#region Inner types
+
+		private struct XmlNodeTrackBack
+		{
+			public readonly XmlNode              Node;
+			public readonly XmlNodeChangedAction Action;
+			public readonly object               Value;
+
+			public XmlNodeTrackBack(XmlNodeChangedEventArgs ea)
+			{
+				Node   = ea.Node;
+				Action = ea.Action;
+				switch(ea.Action)
+				{
+					case XmlNodeChangedAction.Insert:
+						Value = ea.NewParent;
+						break;
+					case XmlNodeChangedAction.Remove:
+						Value = ea.OldParent;
+						break;
+					case XmlNodeChangedAction.Change:
+						Value = ea.OldValue;
+						break;
+					default:
+						throw new ArgumentOutOfRangeException("ea", ea.Action, string.Format("Unknown XmlNodeChangedAction"));
+				}
+			}
+		}
+
+		#endregion
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/EditableObjects/IEditable.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,11 @@
+using BLToolkit.TypeBuilder;
+
+namespace BLToolkit.EditableObjects
+{
+	public interface IEditable
+	{
+		void AcceptChanges();
+		void RejectChanges();
+		bool IsDirty { [return: ReturnIfTrue] get; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/EditableObjects/IMemberwiseEditable.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,16 @@
+using System.Reflection;
+using System.Collections;
+
+using BLToolkit.TypeBuilder;
+
+namespace BLToolkit.EditableObjects
+{
+	public interface IMemberwiseEditable
+	{
+		[return: ReturnIfTrue] bool AcceptMemberChanges([PropertyInfo] PropertyInfo propertyInfo, string memberName);
+		[return: ReturnIfTrue] bool RejectMemberChanges([PropertyInfo] PropertyInfo propertyInfo, string memberName);
+		[return: ReturnIfTrue] bool IsDirtyMember      ([PropertyInfo] PropertyInfo propertyInfo, string memberName, ref bool isDirty);
+
+		void GetDirtyMembers([PropertyInfo] PropertyInfo propertyInfo, ArrayList list);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/EditableObjects/IPrintDebugState.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,13 @@
+using System.Reflection;
+using System.Diagnostics.CodeAnalysis;
+
+using BLToolkit.TypeBuilder;
+
+namespace BLToolkit.EditableObjects
+{
+	public interface IPrintDebugState
+	{
+		[SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference", MessageId = "1#")]
+		void PrintDebugState([PropertyInfo] PropertyInfo propertyInfo, ref string str);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Linq/ExpressionHelper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,2298 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+
+using BLToolkit.Data.Linq.Builder;
+
+// ReSharper disable ConditionIsAlwaysTrueOrFalse
+// ReSharper disable HeuristicUnreachableCode
+
+namespace BLToolkit.Linq
+{
+	using Data.Linq;
+	using Reflection;
+
+	public static class ExpressionHelper
+	{
+		#region IsConstant
+
+		public static bool IsConstant(Type type)
+		{
+			if (type.IsEnum)
+				return true;
+
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.Int16   :
+				case TypeCode.Int32   :
+				case TypeCode.Int64   :
+				case TypeCode.UInt16  :
+				case TypeCode.UInt32  :
+				case TypeCode.UInt64  :
+				case TypeCode.SByte   :
+				case TypeCode.Byte    :
+				case TypeCode.Decimal :
+				case TypeCode.Double  :
+				case TypeCode.Single  :
+				case TypeCode.Boolean :
+				case TypeCode.String  :
+				case TypeCode.Char    : return true;
+			}
+
+			if (TypeHelper.IsNullableType(type))
+				return IsConstant(type.GetGenericArguments()[0]);
+
+			return false;
+		}
+
+		#endregion
+
+		#region Compare
+
+		internal static bool Compare(Expression expr1, Expression expr2, Dictionary<Expression,QueryableAccessor> queryableAccessorDic)
+		{
+			return Compare(expr1, expr2, new HashSet<Expression>(), queryableAccessorDic);
+		}
+
+		static bool Compare(
+			Expression          expr1,
+			Expression          expr2,
+			HashSet<Expression> visited,
+			Dictionary<Expression,QueryableAccessor> queryableAccessorDic)
+		{
+			if (expr1 == expr2)
+				return true;
+
+			if (expr1 == null || expr2 == null || expr1.NodeType != expr2.NodeType || expr1.Type != expr2.Type)
+				return false;
+
+			switch (expr1.NodeType)
+			{
+				case ExpressionType.Add:
+				case ExpressionType.AddChecked:
+				case ExpressionType.And:
+				case ExpressionType.AndAlso:
+				case ExpressionType.ArrayIndex:
+#if FW4 || SILVERLIGHT
+				case ExpressionType.Assign:
+#endif
+				case ExpressionType.Coalesce:
+				case ExpressionType.Divide:
+				case ExpressionType.Equal:
+				case ExpressionType.ExclusiveOr:
+				case ExpressionType.GreaterThan:
+				case ExpressionType.GreaterThanOrEqual:
+				case ExpressionType.LeftShift:
+				case ExpressionType.LessThan:
+				case ExpressionType.LessThanOrEqual:
+				case ExpressionType.Modulo:
+				case ExpressionType.Multiply:
+				case ExpressionType.MultiplyChecked:
+				case ExpressionType.NotEqual:
+				case ExpressionType.Or:
+				case ExpressionType.OrElse:
+				case ExpressionType.Power:
+				case ExpressionType.RightShift:
+				case ExpressionType.Subtract:
+				case ExpressionType.SubtractChecked:
+					{
+						var e1 = (BinaryExpression)expr1;
+						var e2 = (BinaryExpression)expr2;
+						return
+							e1.Method == e2.Method &&
+							Compare(e1.Conversion, e2.Conversion, visited, queryableAccessorDic) &&
+							Compare(e1.Left,       e2.Left,       visited, queryableAccessorDic) &&
+							Compare(e1.Right,      e2.Right,      visited, queryableAccessorDic);
+					}
+
+				case ExpressionType.ArrayLength:
+				case ExpressionType.Convert:
+				case ExpressionType.ConvertChecked:
+				case ExpressionType.Negate:
+				case ExpressionType.NegateChecked:
+				case ExpressionType.Not:
+				case ExpressionType.Quote:
+				case ExpressionType.TypeAs:
+				case ExpressionType.UnaryPlus:
+					{
+						var e1 = (UnaryExpression)expr1;
+						var e2 = (UnaryExpression)expr2;
+						return e1.Method == e2.Method && Compare(e1.Operand, e2.Operand, visited, queryableAccessorDic);
+					}
+
+				case ExpressionType.Call:
+					{
+						var e1 = (MethodCallExpression)expr1;
+						var e2 = (MethodCallExpression)expr2;
+
+						if (e1.Arguments.Count != e2.Arguments.Count || e1.Method != e2.Method)
+							return false;
+
+						if (queryableAccessorDic.Count > 0)
+						{
+							QueryableAccessor qa;
+
+							if (queryableAccessorDic.TryGetValue(expr1, out qa))
+								return Compare(qa.Queryable.Expression, qa.Accessor(expr2).Expression, visited, queryableAccessorDic);
+						}
+
+						if (!Compare(e1.Object, e2.Object, visited, queryableAccessorDic))
+							return false;
+
+						for (var i = 0; i < e1.Arguments.Count; i++)
+							if (!Compare(e1.Arguments[i], e2.Arguments[i], visited, queryableAccessorDic))
+								return false;
+
+						return true;
+					}
+
+				case ExpressionType.Conditional:
+					{
+						var e1 = (ConditionalExpression)expr1;
+						var e2 = (ConditionalExpression)expr2;
+						return
+							Compare(e1.Test,    e2.Test,    visited, queryableAccessorDic) &&
+							Compare(e1.IfTrue,  e2.IfTrue,  visited, queryableAccessorDic) &&
+							Compare(e1.IfFalse, e2.IfFalse, visited, queryableAccessorDic);
+					}
+
+				case ExpressionType.Constant:
+					{
+						var e1 = (ConstantExpression)expr1;
+						var e2 = (ConstantExpression)expr2;
+
+						if (e1.Value == null && e2.Value == null)
+							return true;
+
+						if (IsConstant(e1.Type))
+							return Equals(e1.Value, e2.Value);
+
+						if (e1.Value == null || e2.Value == null)
+							return false;
+
+						if (e1.Value is IQueryable)
+						{
+							var eq1 = ((IQueryable)e1.Value).Expression;
+							var eq2 = ((IQueryable)e2.Value).Expression;
+
+							if (visited.Add(eq1))
+								return Compare(eq1, eq2, visited, queryableAccessorDic);
+						}
+
+						return true;
+					}
+
+				case ExpressionType.Invoke:
+					{
+						var e1 = (InvocationExpression)expr1;
+						var e2 = (InvocationExpression)expr2;
+
+						if (e1.Arguments.Count != e2.Arguments.Count || !Compare(e1.Expression, e2.Expression, visited, queryableAccessorDic))
+							return false;
+
+						for (var i = 0; i < e1.Arguments.Count; i++)
+							if (!Compare(e1.Arguments[i], e2.Arguments[i], visited, queryableAccessorDic))
+								return false;
+
+						return true;
+					}
+
+				case ExpressionType.Lambda:
+					{
+						var e1 = (LambdaExpression)expr1;
+						var e2 = (LambdaExpression)expr2;
+
+						if (e1.Parameters.Count != e2.Parameters.Count || !Compare(e1.Body, e2.Body, visited, queryableAccessorDic))
+							return false;
+
+						for (var i = 0; i < e1.Parameters.Count; i++)
+							if (!Compare(e1.Parameters[i], e2.Parameters[i], visited, queryableAccessorDic))
+								return false;
+
+						return true;
+					}
+
+				case ExpressionType.ListInit:
+					{
+						var e1 = (ListInitExpression)expr1;
+						var e2 = (ListInitExpression)expr2;
+
+						if (e1.Initializers.Count != e2.Initializers.Count || !Compare(e1.NewExpression, e2.NewExpression, visited, queryableAccessorDic))
+							return false;
+
+						for (var i = 0; i < e1.Initializers.Count; i++)
+						{
+							var i1 = e1.Initializers[i];
+							var i2 = e2.Initializers[i];
+
+							if (i1.Arguments.Count != i2.Arguments.Count || i1.AddMethod != i2.AddMethod)
+								return false;
+
+							for (var j = 0; j < i1.Arguments.Count; j++)
+								if (!Compare(i1.Arguments[j], i2.Arguments[j], visited, queryableAccessorDic))
+									return false;
+						}
+
+						return true;
+					}
+
+				case ExpressionType.MemberAccess:
+					{
+						var e1 = (MemberExpression)expr1;
+						var e2 = (MemberExpression)expr2;
+
+						if (e1.Member == e2.Member)
+						{
+							if (e1.Expression == e2.Expression || e1.Expression.Type == e2.Expression.Type)
+							{
+								if (queryableAccessorDic.Count > 0)
+								{
+									QueryableAccessor qa;
+
+									if (queryableAccessorDic.TryGetValue(expr1, out qa))
+										return
+											Compare(e1.Expression, e2.Expression, visited, queryableAccessorDic) &&
+											Compare(qa.Queryable.Expression, qa.Accessor(expr2).Expression, visited, queryableAccessorDic);
+								}
+							}
+
+							return Compare(e1.Expression, e2.Expression, visited, queryableAccessorDic);
+						}
+
+						return false;
+					}
+
+				case ExpressionType.MemberInit:
+					{
+						var e1 = (MemberInitExpression)expr1;
+						var e2 = (MemberInitExpression)expr2;
+
+						if (e1.Bindings.Count != e2.Bindings.Count || !Compare(e1.NewExpression, e2.NewExpression, visited, queryableAccessorDic))
+							return false;
+
+						Func<MemberBinding,MemberBinding,bool> compareBindings = null; compareBindings = (b1,b2) =>
+						{
+							if (b1 == b2)
+								return true;
+
+							if (b1 == null || b2 == null || b1.BindingType != b2.BindingType || b1.Member != b2.Member)
+								return false;
+
+							switch (b1.BindingType)
+							{
+								case MemberBindingType.Assignment:
+									return Compare(((MemberAssignment)b1).Expression, ((MemberAssignment)b2).Expression, visited, queryableAccessorDic);
+
+								case MemberBindingType.ListBinding:
+									var ml1 = (MemberListBinding)b1;
+									var ml2 = (MemberListBinding)b2;
+
+									if (ml1.Initializers.Count != ml2.Initializers.Count)
+										return false;
+
+									for (var i = 0; i < ml1.Initializers.Count; i++)
+									{
+										var ei1 = ml1.Initializers[i];
+										var ei2 = ml2.Initializers[i];
+
+										if (ei1.AddMethod != ei2.AddMethod || ei1.Arguments.Count != ei2.Arguments.Count)
+											return false;
+
+										for (var j = 0; j < ei1.Arguments.Count; j++)
+											if (!Compare(ei1.Arguments[j], ei2.Arguments[j], visited, queryableAccessorDic))
+												return false;
+									}
+
+									break;
+
+								case MemberBindingType.MemberBinding:
+									var mm1 = (MemberMemberBinding)b1;
+									var mm2 = (MemberMemberBinding)b2;
+
+									if (mm1.Bindings.Count != mm2.Bindings.Count)
+										return false;
+
+									for (var i = 0; i < mm1.Bindings.Count; i++)
+										if (!compareBindings(mm1.Bindings[i], mm2.Bindings[i]))
+											return false;
+
+									break;
+							}
+
+							return true;
+						};
+
+						for (var i = 0; i < e1.Bindings.Count; i++)
+						{
+							var b1 = e1.Bindings[i];
+							var b2 = e2.Bindings[i];
+
+							if (!compareBindings(b1, b2))
+								return false;
+						}
+
+						return true;
+					}
+
+				case ExpressionType.New:
+					{
+						var e1 = (NewExpression)expr1;
+						var e2 = (NewExpression)expr2;
+
+						if (e1.Arguments.Count != e2.Arguments.Count)
+							return false;
+
+						if (e1.Members == null && e2.Members != null)
+							return false;
+
+						if (e1.Members != null && e2.Members == null)
+							return false;
+
+						if (e1.Constructor != e2.Constructor)
+							return false;
+
+						if (e1.Members != null)
+						{
+							if (e1.Members.Count != e2.Members.Count)
+								return false;
+
+							for (var i = 0; i < e1.Members.Count; i++)
+								if (e1.Members[i] != e2.Members[i])
+									return false;
+						}
+
+						for (var i = 0; i < e1.Arguments.Count; i++)
+							if (!Compare(e1.Arguments[i], e2.Arguments[i], visited, queryableAccessorDic))
+								return false;
+
+						return true;
+					}
+
+				case ExpressionType.NewArrayBounds:
+				case ExpressionType.NewArrayInit:
+					{
+						var e1 = (NewArrayExpression)expr1;
+						var e2 = (NewArrayExpression)expr2;
+
+						if (e1.Expressions.Count != e2.Expressions.Count)
+							return false;
+
+						for (var i = 0; i < e1.Expressions.Count; i++)
+							if (!Compare(e1.Expressions[i], e2.Expressions[i], visited, queryableAccessorDic))
+								return false;
+
+						return true;
+					}
+
+				case ExpressionType.Parameter:
+					{
+						var e1 = (ParameterExpression)expr1;
+						var e2 = (ParameterExpression)expr2;
+						return e1.Name == e2.Name;
+					}
+
+				case ExpressionType.TypeIs:
+					{
+						var e1 = (TypeBinaryExpression)expr1;
+						var e2 = (TypeBinaryExpression)expr2;
+						return e1.TypeOperand == e2.TypeOperand && Compare(e1.Expression, e2.Expression, visited, queryableAccessorDic);
+					}
+
+#if FW4 || SILVERLIGHT
+
+				case ExpressionType.Block:
+					{
+						var e1 = (BlockExpression)expr1;
+						var e2 = (BlockExpression)expr2;
+
+						for (var i = 0; i < e1.Expressions.Count; i++)
+							if (!Compare(e1.Expressions[i], e2.Expressions[i], visited, queryableAccessorDic))
+								return false;
+
+						for (var i = 0; i < e1.Variables.Count; i++)
+							if (!Compare(e1.Variables[i], e2.Variables[i], visited, queryableAccessorDic))
+								return false;
+
+						return true;
+					}
+
+#endif
+			}
+
+			throw new InvalidOperationException();
+		}
+
+		#endregion
+
+		#region Path
+
+		static Expression ConvertTo(Expression expr, Type type)
+		{
+			return Expression.Convert(expr, type);
+		}
+
+		static void Path<T>(IEnumerable<T> source, HashSet<Expression> visited, Expression path, MethodInfo property, Action<T,Expression> func)
+			where T : class
+		{
+			var prop = Expression.Property(path, property);
+			var i    = 0;
+			foreach (var item in source)
+				func(item, Expression.Call(prop, ReflectionHelper.IndexExpressor<T>.Item, new Expression[] { Expression.Constant(i++) }));
+		}
+
+		static void Path<T>(IEnumerable<T> source, HashSet<Expression> visited, Expression path, MethodInfo property, Action<Expression,Expression> func)
+			where T : Expression
+		{
+			var prop = Expression.Property(path, property);
+			var i    = 0;
+			foreach (var item in source)
+				Path(item, visited, Expression.Call(prop, ReflectionHelper.IndexExpressor<T>.Item, new Expression[] { Expression.Constant(i++) }), func);
+		}
+
+		static void Path(Expression expr, HashSet<Expression> visited, Expression path, MethodInfo property, Action<Expression,Expression> func)
+		{
+			Path(expr, visited, Expression.Property(path, property), func);
+		}
+
+		public static void Path(this Expression expr, Expression path, Action<Expression,Expression> func)
+		{
+			Path(expr, new HashSet<Expression>(), path, func);
+		}
+
+		static void Path(
+			this Expression               expr,
+			HashSet<Expression>           visited,
+			Expression                    path,
+			Action<Expression,Expression> func)
+		{
+			if (expr == null)
+				return;
+
+			switch (expr.NodeType)
+			{
+				case ExpressionType.Add:
+				case ExpressionType.AddChecked:
+				case ExpressionType.And:
+				case ExpressionType.AndAlso:
+				case ExpressionType.ArrayIndex:
+#if FW4 || SILVERLIGHT
+				case ExpressionType.Assign:
+#endif
+				case ExpressionType.Coalesce:
+				case ExpressionType.Divide:
+				case ExpressionType.Equal:
+				case ExpressionType.ExclusiveOr:
+				case ExpressionType.GreaterThan:
+				case ExpressionType.GreaterThanOrEqual:
+				case ExpressionType.LeftShift:
+				case ExpressionType.LessThan:
+				case ExpressionType.LessThanOrEqual:
+				case ExpressionType.Modulo:
+				case ExpressionType.Multiply:
+				case ExpressionType.MultiplyChecked:
+				case ExpressionType.NotEqual:
+				case ExpressionType.Or:
+				case ExpressionType.OrElse:
+				case ExpressionType.Power:
+				case ExpressionType.RightShift:
+				case ExpressionType.Subtract:
+				case ExpressionType.SubtractChecked:
+					{
+						path  = ConvertTo(path, typeof(BinaryExpression));
+						var e = (BinaryExpression)expr;
+
+						Path(e.Conversion, visited, path, ReflectionHelper.Binary.Conversion, func);
+						Path(e.Left,       visited, path, ReflectionHelper.Binary.Left,       func);
+						Path(e.Right,      visited, path, ReflectionHelper.Binary.Right,      func);
+
+						break;
+					}
+
+				case ExpressionType.ArrayLength:
+				case ExpressionType.Convert:
+				case ExpressionType.ConvertChecked:
+				case ExpressionType.Negate:
+				case ExpressionType.NegateChecked:
+				case ExpressionType.Not:
+				case ExpressionType.Quote:
+				case ExpressionType.TypeAs:
+				case ExpressionType.UnaryPlus:
+					Path(
+						((UnaryExpression)expr).Operand,
+						visited,
+						path = ConvertTo(path, typeof(UnaryExpression)),
+						ReflectionHelper.Unary.Operand,
+						func);
+					break;
+
+				case ExpressionType.Call:
+					{
+						path  = ConvertTo(path, typeof(MethodCallExpression));
+						var e = (MethodCallExpression)expr;
+
+						Path(e.Object,    visited, path, ReflectionHelper.MethodCall.Object,    func);
+						Path(e.Arguments, visited, path, ReflectionHelper.MethodCall.Arguments, func);
+
+						break;
+					}
+
+				case ExpressionType.Conditional:
+					{
+						path  = ConvertTo(path, typeof(ConditionalExpression));
+						var e = (ConditionalExpression)expr;
+
+						Path(e.Test,    visited, path, ReflectionHelper.Conditional.Test,    func);
+						Path(e.IfTrue,  visited, path, ReflectionHelper.Conditional.IfTrue,  func);
+						Path(e.IfFalse, visited, path, ReflectionHelper.Conditional.IfFalse, func);
+
+						break;
+					}
+
+				case ExpressionType.Invoke:
+					{
+						path  = ConvertTo(path, typeof(InvocationExpression));
+						var e = (InvocationExpression)expr;
+
+						Path(e.Expression, visited, path, ReflectionHelper.Invocation.Expression, func);
+						Path(e.Arguments,  visited, path, ReflectionHelper.Invocation.Arguments,  func);
+
+						break;
+					}
+
+				case ExpressionType.Lambda:
+					{
+						path  = ConvertTo(path, typeof(LambdaExpression));
+						var e = (LambdaExpression)expr;
+
+						Path(e.Body,       visited, path, ReflectionHelper.LambdaExpr.Body,       func);
+						Path(e.Parameters, visited, path, ReflectionHelper.LambdaExpr.Parameters, func);
+
+						break;
+					}
+
+				case ExpressionType.ListInit:
+					{
+						path  = ConvertTo(path, typeof(ListInitExpression));
+						var e = (ListInitExpression)expr;
+
+						Path(e.NewExpression, visited, path, ReflectionHelper.ListInit.NewExpression, func);
+						Path(e.Initializers,  visited, path, ReflectionHelper.ListInit.Initializers,
+							(ex,p) => Path(ex.Arguments, visited, p, ReflectionHelper.ElementInit.Arguments, func));
+
+						break;
+					}
+
+				case ExpressionType.MemberAccess:
+					Path(
+						((MemberExpression)expr).Expression,
+						visited,
+						path = ConvertTo(path, typeof(MemberExpression)),
+						ReflectionHelper.Member.Expression,
+						func);
+					break;
+
+				case ExpressionType.MemberInit:
+					{
+						Action<MemberBinding,Expression> modify = null; modify = (b,pinf) =>
+						{
+							switch (b.BindingType)
+							{
+								case MemberBindingType.Assignment:
+									Path(
+										((MemberAssignment)b).Expression,
+										visited,
+										ConvertTo(pinf, typeof(MemberAssignment)),
+										ReflectionHelper.MemberAssignmentBind.Expression,
+										func);
+									break;
+
+								case MemberBindingType.ListBinding:
+									Path(
+										((MemberListBinding)b).Initializers,
+										visited,
+										ConvertTo(pinf, typeof(MemberListBinding)),
+										ReflectionHelper.MemberListBind.Initializers,
+										(p,psi) => Path(p.Arguments, visited, psi, ReflectionHelper.ElementInit.Arguments, func));
+									break;
+
+								case MemberBindingType.MemberBinding:
+									Path(
+										((MemberMemberBinding)b).Bindings,
+										visited,
+										ConvertTo(pinf, typeof(MemberMemberBinding)),
+										ReflectionHelper.MemberMemberBind.Bindings,
+										modify);
+									break;
+							}
+						};
+
+						path  = ConvertTo(path, typeof(MemberInitExpression));
+						var e = (MemberInitExpression)expr;
+
+						Path(e.NewExpression, visited, path, ReflectionHelper.MemberInit.NewExpression, func);
+						Path(e.Bindings,      visited, path, ReflectionHelper.MemberInit.Bindings,      modify);
+
+						break;
+					}
+
+				case ExpressionType.New:
+					Path(
+						((NewExpression)expr).Arguments,
+						visited,
+						path = ConvertTo(path, typeof(NewExpression)),
+						ReflectionHelper.New.Arguments,
+						func);
+					break;
+
+				case ExpressionType.NewArrayBounds:
+					Path(
+						((NewArrayExpression)expr).Expressions,
+						visited,
+						path = ConvertTo(path, typeof(NewArrayExpression)),
+						ReflectionHelper.NewArray.Expressions,
+						func);
+					break;
+
+				case ExpressionType.NewArrayInit:
+					Path(
+						((NewArrayExpression)expr).Expressions,
+						visited,
+						path = ConvertTo(path, typeof(NewArrayExpression)),
+						ReflectionHelper.NewArray.Expressions,
+						func);
+					break;
+
+				case ExpressionType.TypeIs:
+					Path(
+						((TypeBinaryExpression)expr).Expression,
+						visited,
+						path = ConvertTo(path, typeof(TypeBinaryExpression)),
+						ReflectionHelper.TypeBinary.Expression,
+						func);
+					break;
+
+#if FW4 || SILVERLIGHT
+
+				case ExpressionType.Block:
+					{
+						path  = ConvertTo(path, typeof(BlockExpression));
+						var e = (BlockExpression)expr;
+
+						Path(e.Expressions, visited, path, ReflectionHelper.Block.Expressions, func);
+						Path(e.Variables,   visited, path, ReflectionHelper.Block.Variables,   func); // ?
+
+						break;
+					}
+
+#endif
+
+				case ExpressionType.Constant :
+					{
+						path   = ConvertTo(path, typeof(ConstantExpression));
+						var e  = (ConstantExpression)expr;
+						var iq = e.Value as IQueryable;
+
+						if (iq != null && !visited.Contains(iq.Expression))
+						{
+							visited.Add(iq.Expression);
+
+							Expression p = Expression.Property(path, ReflectionHelper.Constant.Value);
+							p = ConvertTo(p, typeof(IQueryable));
+							Path(iq.Expression, visited, p, ReflectionHelper.QueryableInt.Expression, func);
+						}
+
+						break;
+					}
+
+				case ExpressionType.Parameter: path = ConvertTo(path, typeof(ParameterExpression)); break;
+			}
+
+			func(expr, path);
+		}
+
+		#endregion
+
+		#region Visit
+
+		static void Visit<T>(IEnumerable<T> source, Action<T> func)
+		{
+			foreach (var item in source)
+				func(item);
+		}
+
+		static void Visit<T>(IEnumerable<T> source, Action<Expression> func)
+			where T : Expression
+		{
+			foreach (var item in source)
+				Visit(item, func);
+		}
+
+		public static void Visit(this Expression expr, Action<Expression> func)
+		{
+			if (expr == null)
+				return;
+
+			switch (expr.NodeType)
+			{
+				case ExpressionType.Add:
+				case ExpressionType.AddChecked:
+				case ExpressionType.And:
+				case ExpressionType.AndAlso:
+				case ExpressionType.ArrayIndex:
+#if FW4 || SILVERLIGHT
+				case ExpressionType.Assign:
+#endif
+				case ExpressionType.Coalesce:
+				case ExpressionType.Divide:
+				case ExpressionType.Equal:
+				case ExpressionType.ExclusiveOr:
+				case ExpressionType.GreaterThan:
+				case ExpressionType.GreaterThanOrEqual:
+				case ExpressionType.LeftShift:
+				case ExpressionType.LessThan:
+				case ExpressionType.LessThanOrEqual:
+				case ExpressionType.Modulo:
+				case ExpressionType.Multiply:
+				case ExpressionType.MultiplyChecked:
+				case ExpressionType.NotEqual:
+				case ExpressionType.Or:
+				case ExpressionType.OrElse:
+				case ExpressionType.Power:
+				case ExpressionType.RightShift:
+				case ExpressionType.Subtract:
+				case ExpressionType.SubtractChecked:
+					{
+						var e = (BinaryExpression)expr;
+
+						Visit(e.Conversion, func);
+						Visit(e.Left,       func);
+						Visit(e.Right,      func);
+
+						break;
+					}
+
+				case ExpressionType.ArrayLength:
+				case ExpressionType.Convert:
+				case ExpressionType.ConvertChecked:
+				case ExpressionType.Negate:
+				case ExpressionType.NegateChecked:
+				case ExpressionType.Not:
+				case ExpressionType.Quote:
+				case ExpressionType.TypeAs:
+				case ExpressionType.UnaryPlus:
+					Visit(((UnaryExpression)expr).Operand, func);
+					break;
+
+				case ExpressionType.Call:
+					{
+						var e = (MethodCallExpression)expr;
+
+						Visit(e.Object,    func);
+						Visit(e.Arguments, func);
+
+						break;
+					}
+
+				case ExpressionType.Conditional:
+					{
+						var e = (ConditionalExpression)expr;
+
+						Visit(e.Test,    func);
+						Visit(e.IfTrue,  func);
+						Visit(e.IfFalse, func);
+
+						break;
+					}
+
+				case ExpressionType.Invoke:
+					{
+						var e = (InvocationExpression)expr;
+
+						Visit(e.Expression, func);
+						Visit(e.Arguments,  func);
+
+						break;
+					}
+
+				case ExpressionType.Lambda:
+					{
+						var e = (LambdaExpression)expr;
+
+						Visit(e.Body,       func);
+						Visit(e.Parameters, func);
+
+						break;
+					}
+
+				case ExpressionType.ListInit:
+					{
+						var e = (ListInitExpression)expr;
+
+						Visit(e.NewExpression, func);
+						Visit(e.Initializers,  ex => Visit(ex.Arguments, func));
+
+						break;
+					}
+
+				case ExpressionType.MemberAccess: Visit(((MemberExpression)expr).Expression, func); break;
+
+				case ExpressionType.MemberInit:
+					{
+						Action<MemberBinding> modify = null; modify = b =>
+						{
+							switch (b.BindingType)
+							{
+								case MemberBindingType.Assignment    : Visit(((MemberAssignment)b). Expression,   func);                          break;
+								case MemberBindingType.ListBinding   : Visit(((MemberListBinding)b).Initializers, p => Visit(p.Arguments, func)); break;
+								case MemberBindingType.MemberBinding : Visit(((MemberMemberBinding)b).Bindings,   modify);                        break;
+							}
+						};
+
+						var e = (MemberInitExpression)expr;
+
+						Visit(e.NewExpression, func);
+						Visit(e.Bindings,      modify);
+
+						break;
+					}
+
+				case ExpressionType.New            : Visit(((NewExpression)       expr).Arguments,   func); break;
+				case ExpressionType.NewArrayBounds : Visit(((NewArrayExpression)  expr).Expressions, func); break;
+				case ExpressionType.NewArrayInit   : Visit(((NewArrayExpression)  expr).Expressions, func); break;
+				case ExpressionType.TypeIs         : Visit(((TypeBinaryExpression)expr).Expression,  func); break;
+
+#if FW4 || SILVERLIGHT
+
+				case ExpressionType.Block:
+					{
+						var e = (BlockExpression)expr;
+
+						Visit(e.Expressions, func);
+						Visit(e.Variables,   func);
+
+						break;
+					}
+
+#endif
+
+				case (ExpressionType)ChangeTypeExpression.ChangeTypeType :
+					Visit(((ChangeTypeExpression)expr).Expression,  func); break;
+			}
+
+			func(expr);
+		}
+
+		static void Visit<T>(IEnumerable<T> source, Func<T,bool> func)
+		{
+			foreach (var item in source)
+				func(item);
+		}
+
+		static void Visit<T>(IEnumerable<T> source, Func<Expression,bool> func)
+			where T : Expression
+		{
+			foreach (var item in source)
+				Visit(item, func);
+		}
+
+		public static void Visit(this Expression expr, Func<Expression,bool> func)
+		{
+			if (expr == null || !func(expr))
+				return;
+
+			switch (expr.NodeType)
+			{
+				case ExpressionType.Add:
+				case ExpressionType.AddChecked:
+				case ExpressionType.And:
+				case ExpressionType.AndAlso:
+				case ExpressionType.ArrayIndex:
+#if FW4 || SILVERLIGHT
+				case ExpressionType.Assign:
+#endif
+				case ExpressionType.Coalesce:
+				case ExpressionType.Divide:
+				case ExpressionType.Equal:
+				case ExpressionType.ExclusiveOr:
+				case ExpressionType.GreaterThan:
+				case ExpressionType.GreaterThanOrEqual:
+				case ExpressionType.LeftShift:
+				case ExpressionType.LessThan:
+				case ExpressionType.LessThanOrEqual:
+				case ExpressionType.Modulo:
+				case ExpressionType.Multiply:
+				case ExpressionType.MultiplyChecked:
+				case ExpressionType.NotEqual:
+				case ExpressionType.Or:
+				case ExpressionType.OrElse:
+				case ExpressionType.Power:
+				case ExpressionType.RightShift:
+				case ExpressionType.Subtract:
+				case ExpressionType.SubtractChecked:
+					{
+						var e = (BinaryExpression)expr;
+
+						Visit(e.Conversion, func);
+						Visit(e.Left,       func);
+						Visit(e.Right,      func);
+
+						break;
+					}
+
+				case ExpressionType.ArrayLength:
+				case ExpressionType.Convert:
+				case ExpressionType.ConvertChecked:
+				case ExpressionType.Negate:
+				case ExpressionType.NegateChecked:
+				case ExpressionType.Not:
+				case ExpressionType.Quote:
+				case ExpressionType.TypeAs:
+				case ExpressionType.UnaryPlus:
+					Visit(((UnaryExpression)expr).Operand, func);
+					break;
+
+				case ExpressionType.Call:
+					{
+						var e = (MethodCallExpression)expr;
+
+						Visit(e.Object,    func);
+						Visit(e.Arguments, func);
+
+						break;
+					}
+
+				case ExpressionType.Conditional:
+					{
+						var e = (ConditionalExpression)expr;
+
+						Visit(e.Test,    func);
+						Visit(e.IfTrue,  func);
+						Visit(e.IfFalse, func);
+
+						break;
+					}
+
+				case ExpressionType.Invoke:
+					{
+						var e = (InvocationExpression)expr;
+
+						Visit(e.Expression, func);
+						Visit(e.Arguments,  func);
+
+						break;
+					}
+
+				case ExpressionType.Lambda:
+					{
+						var e = (LambdaExpression)expr;
+
+						Visit(e.Body,       func);
+						Visit(e.Parameters, func);
+
+						break;
+					}
+
+				case ExpressionType.ListInit:
+					{
+						var e = (ListInitExpression)expr;
+
+						Visit(e.NewExpression, func);
+						Visit(e.Initializers,  ex => Visit(ex.Arguments, func));
+
+						break;
+					}
+
+				case ExpressionType.MemberAccess: Visit(((MemberExpression)expr).Expression, func); break;
+
+				case ExpressionType.MemberInit:
+					{
+						Func<MemberBinding,bool> modify = null; modify = b =>
+						{
+							switch (b.BindingType)
+							{
+								case MemberBindingType.Assignment    : Visit(((MemberAssignment)b). Expression,   func);                          break;
+								case MemberBindingType.ListBinding   : Visit(((MemberListBinding)b).Initializers, p => Visit(p.Arguments, func)); break;
+								case MemberBindingType.MemberBinding : Visit(((MemberMemberBinding)b).Bindings,   modify);                        break;
+							}
+
+							return true;
+						};
+
+						var e = (MemberInitExpression)expr;
+
+						Visit(e.NewExpression, func);
+						Visit(e.Bindings,      modify);
+
+						break;
+					}
+
+				case ExpressionType.New            : Visit(((NewExpression)       expr).Arguments,   func); break;
+				case ExpressionType.NewArrayBounds : Visit(((NewArrayExpression)  expr).Expressions, func); break;
+				case ExpressionType.NewArrayInit   : Visit(((NewArrayExpression)  expr).Expressions, func); break;
+				case ExpressionType.TypeIs         : Visit(((TypeBinaryExpression)expr).Expression,  func); break;
+
+#if FW4 || SILVERLIGHT
+
+				case ExpressionType.Block:
+					{
+						var e = (BlockExpression)expr;
+
+						Visit(e.Expressions, func);
+						Visit(e.Variables,   func);
+
+						break;
+					}
+
+#endif
+
+				case (ExpressionType)ChangeTypeExpression.ChangeTypeType :
+					Visit(((ChangeTypeExpression)expr).Expression,  func);
+					break;
+			}
+		}
+
+		#endregion
+
+		#region Find
+
+		static Expression Find<T>(IEnumerable<T> source, Func<T,Expression> func)
+		{
+			foreach (var item in source)
+			{
+				var ex = func(item);
+				if (ex != null)
+					return ex;
+			}
+
+			return null;
+		}
+
+		static Expression Find<T>(IEnumerable<T> source, Func<Expression,bool> func)
+			where T : Expression
+		{
+			foreach (var item in source)
+			{
+				var f = Find(item, func);
+				if (f != null)
+					return f;
+			}
+
+			return null;
+		}
+
+		public static Expression Find(this Expression expr, Func<Expression,bool> func)
+		{
+			if (expr == null || func(expr))
+				return expr;
+
+			switch (expr.NodeType)
+			{
+				case ExpressionType.Add:
+				case ExpressionType.AddChecked:
+				case ExpressionType.And:
+				case ExpressionType.AndAlso:
+				case ExpressionType.ArrayIndex:
+#if FW4 || SILVERLIGHT
+				case ExpressionType.Assign:
+#endif
+				case ExpressionType.Coalesce:
+				case ExpressionType.Divide:
+				case ExpressionType.Equal:
+				case ExpressionType.ExclusiveOr:
+				case ExpressionType.GreaterThan:
+				case ExpressionType.GreaterThanOrEqual:
+				case ExpressionType.LeftShift:
+				case ExpressionType.LessThan:
+				case ExpressionType.LessThanOrEqual:
+				case ExpressionType.Modulo:
+				case ExpressionType.Multiply:
+				case ExpressionType.MultiplyChecked:
+				case ExpressionType.NotEqual:
+				case ExpressionType.Or:
+				case ExpressionType.OrElse:
+				case ExpressionType.Power:
+				case ExpressionType.RightShift:
+				case ExpressionType.Subtract:
+				case ExpressionType.SubtractChecked:
+					{
+						var e = (BinaryExpression)expr;
+
+						return
+							Find(e.Conversion, func) ??
+							Find(e.Left,       func) ??
+							Find(e.Right,      func);
+					}
+
+				case ExpressionType.ArrayLength:
+				case ExpressionType.Convert:
+				case ExpressionType.ConvertChecked:
+				case ExpressionType.Negate:
+				case ExpressionType.NegateChecked:
+				case ExpressionType.Not:
+				case ExpressionType.Quote:
+				case ExpressionType.TypeAs:
+				case ExpressionType.UnaryPlus:
+					return Find(((UnaryExpression)expr).Operand, func);
+
+				case ExpressionType.Call:
+					{
+						var e = (MethodCallExpression)expr;
+
+						return
+							Find(e.Object,    func) ??
+							Find(e.Arguments, func);
+					}
+
+				case ExpressionType.Conditional:
+					{
+						var e = (ConditionalExpression)expr;
+
+						return
+							Find(e.Test,    func) ??
+							Find(e.IfTrue,  func) ??
+							Find(e.IfFalse, func);
+					}
+
+				case ExpressionType.Invoke:
+					{
+						var e = (InvocationExpression)expr;
+
+						return
+							Find(e.Expression, func) ??
+							Find(e.Arguments,  func);
+					}
+
+				case ExpressionType.Lambda:
+					{
+						var e = (LambdaExpression)expr;
+
+						return
+							Find(e.Body,       func) ??
+							Find(e.Parameters, func);
+					}
+
+				case ExpressionType.ListInit:
+					{
+						var e = (ListInitExpression)expr;
+
+						return
+							Find(e.NewExpression, func) ??
+							Find(e.Initializers,  ex => Find(ex.Arguments, func));
+					}
+
+				case ExpressionType.MemberAccess:
+					return Find(((MemberExpression)expr).Expression, func);
+
+				case ExpressionType.MemberInit:
+					{
+						Func<MemberBinding,Expression> modify = null; modify = b =>
+						{
+							switch (b.BindingType)
+							{
+								case MemberBindingType.Assignment    : return Find(((MemberAssignment)b).   Expression,   func);
+								case MemberBindingType.ListBinding   : return Find(((MemberListBinding)b).  Initializers, p => Find(p.Arguments, func));
+								case MemberBindingType.MemberBinding : return Find(((MemberMemberBinding)b).Bindings,     modify);
+							}
+
+							return null;
+						};
+
+						var e = (MemberInitExpression)expr;
+
+						return
+							Find(e.NewExpression, func) ??
+							Find(e.Bindings,      modify);
+					}
+
+				case ExpressionType.New            : return Find(((NewExpression)       expr).Arguments,   func);
+				case ExpressionType.NewArrayBounds : return Find(((NewArrayExpression)  expr).Expressions, func);
+				case ExpressionType.NewArrayInit   : return Find(((NewArrayExpression)  expr).Expressions, func);
+				case ExpressionType.TypeIs         : return Find(((TypeBinaryExpression)expr).Expression,  func);
+
+#if FW4 || SILVERLIGHT
+
+				case ExpressionType.Block:
+					{
+						var e = (BlockExpression)expr;
+
+						return
+							Find(e.Expressions, func) ??
+							Find(e.Variables,   func);
+					}
+
+#endif
+
+				case (ExpressionType)ChangeTypeExpression.ChangeTypeType :
+					return Find(((ChangeTypeExpression)expr).Expression, func);
+			}
+
+			return null;
+		}
+
+		#endregion
+
+		#region Convert
+
+		static IEnumerable<T> Convert<T>(IEnumerable<T> source, Func<T,T> func)
+			where T : class
+		{
+			var modified = false;
+			var list     = new List<T>();
+
+			foreach (var item in source)
+			{
+				var e = func(item);
+				list.Add(e);
+				modified = modified || e != item;
+			}
+
+			return modified ? list : source;
+		}
+
+		static IEnumerable<T> Convert<T>(IEnumerable<T> source, Func<Expression,Expression> func)
+			where T : Expression
+		{
+			var modified = false;
+			var list     = new List<T>();
+
+			foreach (var item in source)
+			{
+				var e = Convert(item, func);
+				list.Add((T)e);
+				modified = modified || e != item;
+			}
+
+			return modified? list: source;
+		}
+
+		public static Expression Convert(this Expression expr, Func<Expression,Expression> func)
+		{
+			if (expr == null)
+				return null;
+
+			switch (expr.NodeType)
+			{
+				case ExpressionType.Add:
+				case ExpressionType.AddChecked:
+				case ExpressionType.And:
+				case ExpressionType.AndAlso:
+				case ExpressionType.ArrayIndex:
+#if FW4 || SILVERLIGHT
+				case ExpressionType.Assign:
+#endif
+				case ExpressionType.Coalesce:
+				case ExpressionType.Divide:
+				case ExpressionType.Equal:
+				case ExpressionType.ExclusiveOr:
+				case ExpressionType.GreaterThan:
+				case ExpressionType.GreaterThanOrEqual:
+				case ExpressionType.LeftShift:
+				case ExpressionType.LessThan:
+				case ExpressionType.LessThanOrEqual:
+				case ExpressionType.Modulo:
+				case ExpressionType.Multiply:
+				case ExpressionType.MultiplyChecked:
+				case ExpressionType.NotEqual:
+				case ExpressionType.Or:
+				case ExpressionType.OrElse:
+				case ExpressionType.Power:
+				case ExpressionType.RightShift:
+				case ExpressionType.Subtract:
+				case ExpressionType.SubtractChecked:
+					{
+						var ex = func(expr);
+						if (ex != expr)
+							return ex;
+
+						var e = (BinaryExpression)expr;
+						var c = Convert(e.Conversion, func);
+						var l = Convert(e.Left,       func);
+						var r = Convert(e.Right,      func);
+
+#if FW3
+						return c != e.Conversion || l != e.Left || r != e.Right ?
+							Expression.MakeBinary(expr.NodeType, l, r, e.IsLiftedToNull, e.Method, (LambdaExpression)c):
+							expr;
+#else
+						return e.Update(l, (LambdaExpression)c, r);
+#endif
+					}
+
+				case ExpressionType.ArrayLength:
+				case ExpressionType.Convert:
+				case ExpressionType.ConvertChecked:
+				case ExpressionType.Negate:
+				case ExpressionType.NegateChecked:
+				case ExpressionType.Not:
+				case ExpressionType.Quote:
+				case ExpressionType.TypeAs:
+				case ExpressionType.UnaryPlus:
+					{
+						var ex = func(expr);
+						if (ex != expr)
+							return ex;
+
+						var e = (UnaryExpression)expr;
+						var o = Convert(e.Operand, func);
+
+#if FW3
+						return o != e.Operand ?
+							Expression.MakeUnary(expr.NodeType, o, e.Type, e.Method) :
+							expr;
+#else
+						return e.Update(o);
+#endif
+					}
+
+				case ExpressionType.Call:
+					{
+						var ex = func(expr);
+						if (ex != expr)
+							return ex;
+
+						var e = (MethodCallExpression)expr;
+						var o = Convert(e.Object,    func);
+						var a = Convert(e.Arguments, func);
+
+#if FW3
+						return o != e.Object || a != e.Arguments ? 
+							Expression.Call(o, e.Method, a) :
+							expr;
+#else
+						return e.Update(o, a);
+#endif
+					}
+
+				case ExpressionType.Conditional:
+					{
+						var ex = func(expr);
+						if (ex != expr)
+							return ex;
+
+						var e = (ConditionalExpression)expr;
+						var s = Convert(e.Test,    func);
+						var t = Convert(e.IfTrue,  func);
+						var f = Convert(e.IfFalse, func);
+
+#if FW3
+						return s != e.Test || t != e.IfTrue || f != e.IfFalse ?
+							Expression.Condition(s, t, f) :
+							expr;
+#else
+						return e.Update(s, t, f);
+#endif
+					}
+
+				case ExpressionType.Invoke:
+					{
+						var exp = func(expr);
+						if (exp != expr)
+							return exp;
+
+						var e  = (InvocationExpression)expr;
+						var ex = Convert(e.Expression, func);
+						var a  = Convert(e.Arguments,  func);
+
+#if FW3
+						return ex != e.Expression || a != e.Arguments ? Expression.Invoke(ex, a) : expr;
+#else
+						return e.Update(ex, a);
+#endif
+					}
+
+				case ExpressionType.Lambda:
+					{
+						var ex = func(expr);
+						if (ex != expr)
+							return ex;
+
+						var e = (LambdaExpression)expr;
+						var b = Convert(e.Body,       func);
+						var p = Convert(e.Parameters, func);
+
+						return b != e.Body || p != e.Parameters ? Expression.Lambda(ex.Type, b, p.ToArray()) : expr;
+					}
+
+				case ExpressionType.ListInit:
+					{
+						var ex = func(expr);
+						if (ex != expr)
+							return ex;
+
+						var e = (ListInitExpression)expr;
+						var n = Convert(e.NewExpression, func);
+						var i = Convert(e.Initializers,  p =>
+						{
+							var args = Convert(p.Arguments, func);
+							return args != p.Arguments? Expression.ElementInit(p.AddMethod, args): p;
+						});
+
+#if FW3
+						return n != e.NewExpression || i != e.Initializers ?
+							Expression.ListInit((NewExpression)n, i) :
+							expr;
+#else
+						return e.Update((NewExpression)n, i);
+#endif
+					}
+
+				case ExpressionType.MemberAccess:
+					{
+						var exp = func(expr);
+						if (exp != expr)
+							return exp;
+
+						var e  = (MemberExpression)expr;
+						var ex = Convert(e.Expression, func);
+
+#if FW3
+						return ex != e.Expression ? Expression.MakeMemberAccess(ex, e.Member) : expr;
+#else
+						return e.Update(ex);
+#endif
+					}
+
+				case ExpressionType.MemberInit:
+					{
+						var exp = func(expr);
+						if (exp != expr)
+							return exp;
+
+						Func<MemberBinding,MemberBinding> modify = null; modify = b =>
+						{
+							switch (b.BindingType)
+							{
+								case MemberBindingType.Assignment:
+									{
+										var ma = (MemberAssignment)b;
+										var ex = Convert(ma.Expression, func);
+
+										if (ex != ma.Expression)
+											ma = Expression.Bind(ma.Member, ex);
+
+										return ma;
+									}
+
+								case MemberBindingType.ListBinding:
+									{
+										var ml = (MemberListBinding)b;
+										var i  = Convert(ml.Initializers, p =>
+										{
+											var args = Convert(p.Arguments, func);
+											return args != p.Arguments? Expression.ElementInit(p.AddMethod, args): p;
+										});
+
+										if (i != ml.Initializers)
+											ml = Expression.ListBind(ml.Member, i);
+
+										return ml;
+									}
+
+								case MemberBindingType.MemberBinding:
+									{
+										var mm = (MemberMemberBinding)b;
+										var bs = Convert(mm.Bindings, modify);
+
+										if (bs != mm.Bindings)
+											mm = Expression.MemberBind(mm.Member);
+
+										return mm;
+									}
+							}
+
+							return b;
+						};
+
+						var e  = (MemberInitExpression)expr;
+						var ne = Convert(e.NewExpression, func);
+						var bb = Convert(e.Bindings,      modify);
+
+#if FW3
+						return ne != e.NewExpression || bb != e.Bindings ?
+							Expression.MemberInit((NewExpression)ne, bb) :
+							expr;
+#else
+						return e.Update((NewExpression)ne, bb);
+#endif
+					}
+
+				case ExpressionType.New:
+					{
+						var ex = func(expr);
+						if (ex != expr)
+							return ex;
+
+						var e = (NewExpression)expr;
+						var a = Convert(e.Arguments, func);
+
+#if FW3
+						return a != e.Arguments ?
+							e.Members == null ?
+								Expression.New(e.Constructor, a) :
+								Expression.New(e.Constructor, a, e.Members) :
+							expr;
+#else
+						return e.Update(a);
+#endif
+					}
+
+				case ExpressionType.NewArrayBounds:
+					{
+						var exp = func(expr);
+						if (exp != expr)
+							return exp;
+
+						var e  = (NewArrayExpression)expr;
+						var ex = Convert(e.Expressions, func);
+
+#if FW3
+						return ex != e.Expressions ? Expression.NewArrayBounds(e.Type, ex) : expr;
+#else
+						return e.Update(ex);
+#endif
+					}
+
+				case ExpressionType.NewArrayInit:
+					{
+						var exp = func(expr);
+						if (exp != expr)
+							return exp;
+
+						var e  = (NewArrayExpression)expr;
+						var ex = Convert(e.Expressions, func);
+
+#if FW3
+						return ex != e.Expressions ?
+							Expression.NewArrayInit(e.Type.GetElementType(), ex) :
+							expr;
+#else
+						return e.Update(ex);
+
+#endif
+					}
+
+				case ExpressionType.TypeIs:
+					{
+						var exp = func(expr);
+						if (exp != expr)
+							return exp;
+
+						var e  = (TypeBinaryExpression)expr;
+						var ex = Convert(e.Expression, func);
+
+#if FW3
+						return ex != e.Expression ? Expression.TypeIs(ex, e.Type) : expr;
+#else
+						return e.Update(ex);
+#endif
+					}
+
+#if FW4 || SILVERLIGHT
+
+				case ExpressionType.Block:
+					{
+						var exp = func(expr);
+						if (exp != expr)
+							return exp;
+
+						var e  = (BlockExpression)expr;
+						var ex = Convert(e.Expressions, func);
+						var v  = Convert(e.Variables,   func);
+
+						return e.Update(v, ex);
+					}
+
+#endif
+
+				case ExpressionType.Constant : return func(expr);
+				case ExpressionType.Parameter: return func(expr);
+
+				case (ExpressionType)ChangeTypeExpression.ChangeTypeType :
+					{
+						var exp = func(expr);
+						if (exp != expr)
+							return exp;
+
+						var e  = expr as ChangeTypeExpression;
+						var ex = Convert(e.Expression, func);
+
+						if (ex == e.Expression)
+							return expr;
+
+						if (ex.Type == e.Type)
+							return ex;
+
+						return new ChangeTypeExpression(ex, e.Type);
+					}
+			}
+
+			throw new InvalidOperationException();
+		}
+
+		#endregion
+
+		#region Convert2
+
+		public struct ConvertInfo
+		{
+			public ConvertInfo(Expression expression, bool stop)
+			{
+				Expression = expression;
+				Stop       = stop;
+			}
+
+			public ConvertInfo(Expression expression)
+			{
+				Expression = expression;
+				Stop       = false;
+			}
+
+			public Expression Expression;
+			public bool       Stop;
+		}
+
+		static IEnumerable<T> Convert2<T>(IEnumerable<T> source, Func<T,T> func)
+			where T : class
+		{
+			var modified = false;
+			var list     = new List<T>();
+
+			foreach (var item in source)
+			{
+				var e = func(item);
+				list.Add(e);
+				modified = modified || e != item;
+			}
+
+			return modified ? list : source;
+		}
+
+		static IEnumerable<T> Convert2<T>(IEnumerable<T> source, Func<Expression,ConvertInfo> func)
+			where T : Expression
+		{
+			var modified = false;
+			var list     = new List<T>();
+
+			foreach (var item in source)
+			{
+				var e = Convert2(item, func);
+				list.Add((T)e);
+				modified = modified || e != item;
+			}
+
+			return modified ? list : source;
+		}
+
+#if FW3
+		static IEnumerable<Expression> ConvertMethodArguments(IEnumerable<Expression> source, MethodBase method)
+		{
+			return ConvertMethodArguments(source, method, null);
+		}
+
+		static IEnumerable<Expression> ConvertMethodArguments(IEnumerable<Expression> source, MethodBase method, IList<MemberInfo> initMembers)
+#else
+		static IEnumerable<Expression> ConvertMethodArguments(IEnumerable<Expression> source, MethodBase method, IList<MemberInfo> initMembers = null)
+#endif
+		{
+			var list = new List<Expression>();
+
+			var targetTypes = new List<Type>();
+			foreach (var param in method.GetParameters())
+			{
+				targetTypes.Add(param.ParameterType);
+			}
+			if (initMembers != null)
+			{
+				foreach (var mi in initMembers)
+				{
+					if (mi is PropertyInfo)
+					{
+						targetTypes.Add(((PropertyInfo)mi).PropertyType);
+					}
+					else if (mi is FieldInfo)
+					{
+						targetTypes.Add(((FieldInfo)mi).FieldType);
+					}
+				}
+			}
+
+			var idx = 0;
+			foreach (var item in source)
+			{
+				var targetType = targetTypes[idx];
+				if (item.Type != targetType)
+				{
+					list.Add(Expression.Convert(item, targetType));
+				}
+				else
+				{
+					list.Add(item);
+				}
+				idx++;
+			}
+
+			return list;
+		}
+
+		public static Expression Convert2(this Expression expr, Func<Expression,ConvertInfo> func)
+		{
+			if (expr == null)
+				return null;
+
+			ConvertInfo ci;
+
+			switch (expr.NodeType)
+			{
+				case ExpressionType.Add:
+				case ExpressionType.AddChecked:
+				case ExpressionType.And:
+				case ExpressionType.AndAlso:
+				case ExpressionType.ArrayIndex:
+#if FW4 || SILVERLIGHT
+				case ExpressionType.Assign:
+#endif
+				case ExpressionType.Coalesce:
+				case ExpressionType.Divide:
+				case ExpressionType.Equal:
+				case ExpressionType.ExclusiveOr:
+				case ExpressionType.GreaterThan:
+				case ExpressionType.GreaterThanOrEqual:
+				case ExpressionType.LeftShift:
+				case ExpressionType.LessThan:
+				case ExpressionType.LessThanOrEqual:
+				case ExpressionType.Modulo:
+				case ExpressionType.Multiply:
+				case ExpressionType.MultiplyChecked:
+				case ExpressionType.NotEqual:
+				case ExpressionType.Or:
+				case ExpressionType.OrElse:
+				case ExpressionType.Power:
+				case ExpressionType.RightShift:
+				case ExpressionType.Subtract:
+				case ExpressionType.SubtractChecked:
+					{
+						ci = func(expr);
+						if (ci.Stop || ci.Expression != expr)
+							return ci.Expression;
+
+						var e = expr as BinaryExpression;
+						var c = Convert2(e.Conversion, func);
+						var l = Convert2(e.Left,       func);
+						var r = Convert2(e.Right,      func);
+
+						return c != e.Conversion || l != e.Left || r != e.Right ?
+							Expression.MakeBinary(expr.NodeType, l, r, e.IsLiftedToNull, e.Method, (LambdaExpression)c):
+							expr;
+					}
+
+				case ExpressionType.ArrayLength:
+				case ExpressionType.Convert:
+				case ExpressionType.ConvertChecked:
+				case ExpressionType.Negate:
+				case ExpressionType.NegateChecked:
+				case ExpressionType.Not:
+				case ExpressionType.Quote:
+				case ExpressionType.TypeAs:
+				case ExpressionType.UnaryPlus:
+					{
+						ci = func(expr);
+						if (ci.Stop || ci.Expression != expr)
+							return ci.Expression;
+
+						var e = expr as UnaryExpression;
+						var o = Convert2(e.Operand, func);
+
+						return o != e.Operand ?
+							Expression.MakeUnary(expr.NodeType, o, e.Type, e.Method) :
+							expr;
+					}
+
+				case ExpressionType.Call:
+					{
+						ci = func(expr);
+						if (ci.Stop || ci.Expression != expr)
+							return ci.Expression;
+
+						var e = expr as MethodCallExpression;
+						var o = Convert2(e.Object,    func);
+						var a = Convert2(e.Arguments, func);
+
+						return o != e.Object || a != e.Arguments ?
+							Expression.Call(o, e.Method, ConvertMethodArguments(a, e.Method)) : 
+							expr;
+					}
+
+				case ExpressionType.Conditional:
+					{
+						ci = func(expr);
+						if (ci.Stop || ci.Expression != expr)
+							return ci.Expression;
+
+						var e = expr as ConditionalExpression;
+						var s = Convert2(e.Test,    func);
+						var t = Convert2(e.IfTrue,  func);
+						var f = Convert2(e.IfFalse, func);
+
+						return s != e.Test || t != e.IfTrue || f != e.IfFalse ?
+							Expression.Condition(s, t, f) :
+							expr;
+					}
+
+				case ExpressionType.Invoke:
+					{
+						ci = func(expr);
+						if (ci.Stop || ci.Expression != expr)
+							return ci.Expression;
+
+						var e  = expr as InvocationExpression;
+						var ex = Convert2(e.Expression, func);
+						var a  = Convert2(e.Arguments,  func);
+
+						return ex != e.Expression || a != e.Arguments ? Expression.Invoke(ex, a) : expr;
+					}
+
+				case ExpressionType.Lambda:
+					{
+						ci = func(expr);
+						if (ci.Stop || ci.Expression != expr)
+							return ci.Expression;
+
+						var e = expr as LambdaExpression;
+						var b = Convert2(e.Body,       func);
+						var p = Convert2(e.Parameters, func);
+
+						return b != e.Body || p != e.Parameters ? Expression.Lambda(ci.Expression.Type, b, p.ToArray()) : expr;
+					}
+
+				case ExpressionType.ListInit:
+					{
+						ci = func(expr);
+						if (ci.Stop || ci.Expression != expr)
+							return ci.Expression;
+
+						var e = expr as ListInitExpression;
+						var n = Convert2(e.NewExpression, func);
+						var i = Convert2(e.Initializers,  p =>
+						{
+							var args = Convert2(p.Arguments, func);
+							return args != p.Arguments? Expression.ElementInit(p.AddMethod, args): p;
+						});
+
+						return n != e.NewExpression || i != e.Initializers ?
+							Expression.ListInit((NewExpression)n, i) :
+							expr;
+					}
+
+				case ExpressionType.MemberAccess:
+					{
+						ci = func(expr);
+						if (ci.Stop || ci.Expression != expr)
+							return ci.Expression;
+
+						var e  = expr as MemberExpression;
+						var ex = Convert2(e.Expression, func);
+
+						return ex != e.Expression ? Expression.MakeMemberAccess(ex, e.Member) : expr;
+					}
+
+				case ExpressionType.MemberInit:
+					{
+						ci = func(expr);
+						if (ci.Stop || ci.Expression != expr)
+							return ci.Expression;
+
+						Func<MemberBinding,MemberBinding> modify = null; modify = b =>
+						{
+							switch (b.BindingType)
+							{
+								case MemberBindingType.Assignment:
+									{
+										var ma = (MemberAssignment)b;
+										var ex = Convert2(ma.Expression, func);
+
+										if (ex != ma.Expression)
+										{
+											if (ex.Type != ma.Expression.Type)
+											{
+												ex = Expression.Convert(ex, ma.Expression.Type);
+											}
+											ma = Expression.Bind(ma.Member, ex);
+										}
+
+										return ma;
+									}
+
+								case MemberBindingType.ListBinding:
+									{
+										var ml = (MemberListBinding)b;
+										var i  = Convert(ml.Initializers, p =>
+										{
+											var args = Convert2(p.Arguments, func);
+											return args != p.Arguments? Expression.ElementInit(p.AddMethod, args): p;
+										});
+
+										if (i != ml.Initializers)
+											ml = Expression.ListBind(ml.Member, i);
+
+										return ml;
+									}
+
+								case MemberBindingType.MemberBinding:
+									{
+										var mm = (MemberMemberBinding)b;
+										var bs = Convert(mm.Bindings, modify);
+
+										if (bs != mm.Bindings)
+											mm = Expression.MemberBind(mm.Member);
+
+										return mm;
+									}
+							}
+
+							return b;
+						};
+
+						var e  = expr as MemberInitExpression;
+						var ne = Convert2(e.NewExpression, func);
+						var bb = Convert2(e.Bindings,      modify);
+
+						return ne != e.NewExpression || bb != e.Bindings ?
+							Expression.MemberInit((NewExpression)ne, bb) :
+							expr;
+					}
+
+				case ExpressionType.New:
+					{
+						ci = func(expr);
+						if (ci.Stop || ci.Expression != expr)
+							return ci.Expression;
+
+						var e = expr as NewExpression;
+						var a = Convert2(e.Arguments, func);
+
+						return a != e.Arguments ?
+							e.Members == null ?
+								Expression.New(e.Constructor, ConvertMethodArguments(a, e.Constructor)) :
+								Expression.New(e.Constructor, ConvertMethodArguments(a, e.Constructor, e.Members), e.Members) :
+							expr;
+					}
+
+				case ExpressionType.NewArrayBounds:
+					{
+						ci = func(expr);
+						if (ci.Stop || ci.Expression != expr)
+							return ci.Expression;
+
+						var e  = expr as NewArrayExpression;
+						var ex = Convert2(e.Expressions, func);
+
+						return ex != e.Expressions ? Expression.NewArrayBounds(e.Type, ex) : expr;
+					}
+
+				case ExpressionType.NewArrayInit:
+					{
+						ci = func(expr);
+						if (ci.Stop || ci.Expression != expr)
+							return ci.Expression;
+
+						var e  = expr as NewArrayExpression;
+						var et = e.Type.GetElementType();
+						var ex = Convert2(e.Expressions, func)
+							.Select(ee => et == typeof(object) && ee.Type.IsValueType ?
+								Expression.Convert(ee, typeof(object)) :
+								ee);
+
+						return ex != e.Expressions ?
+							Expression.NewArrayInit(et, ex) :
+							expr;
+					}
+
+				case ExpressionType.TypeIs :
+					{
+						ci = func(expr);
+						if (ci.Stop || ci.Expression != expr)
+							return ci.Expression;
+
+						var e  = expr as TypeBinaryExpression;
+						var ex = Convert2(e.Expression, func);
+
+						return ex != e.Expression ? Expression.TypeIs(ex, e.Type) : expr;
+					}
+
+#if FW4 || SILVERLIGHT
+
+				case ExpressionType.Block :
+					{
+						ci = func(expr);
+						if (ci.Stop || ci.Expression != expr)
+							return ci.Expression;
+
+						var e  = expr as BlockExpression;
+						var ex = Convert2(e.Expressions, func);
+						var v  = Convert2(e.Variables,   func);
+
+						return ex != e.Expressions || v != e.Variables ? Expression.Block(e.Type, v, ex) : expr;
+					}
+
+#endif
+
+				case ExpressionType.Constant : return func(expr).Expression;
+				case ExpressionType.Parameter: return func(expr).Expression;
+
+				case (ExpressionType)ChangeTypeExpression.ChangeTypeType :
+					{
+						ci = func(expr);
+						if (ci.Stop || ci.Expression != expr)
+							return ci.Expression;
+
+						var e  = expr as ChangeTypeExpression;
+						var ex = Convert2(e.Expression, func);
+
+						if (ex == e.Expression)
+							return expr;
+
+						if (ex.Type == e.Type)
+							return ex;
+
+						return new ChangeTypeExpression(ex, e.Type);
+					}
+			}
+
+			throw new InvalidOperationException();
+		}
+
+		#endregion
+
+		#region Helpers
+
+		static public Expression Unwrap(this Expression ex)
+		{
+			if (ex == null)
+				return null;
+
+			switch (ex.NodeType)
+			{
+				case ExpressionType.Quote          : return ((UnaryExpression)ex).Operand.Unwrap();
+				case ExpressionType.ConvertChecked :
+				case ExpressionType.Convert        :
+					{
+						var ue = (UnaryExpression)ex;
+
+						if (!ue.Operand.Type.IsEnum)
+							return ue.Operand.Unwrap();
+
+						break;
+					}
+			}
+
+			return ex;
+		}
+
+		static public Dictionary<Expression,Expression> GetExpressionAccessors(this Expression expression, Expression path)
+		{
+			var accessors = new Dictionary<Expression,Expression>();
+
+			expression.Path(path, (e,p) =>
+			{
+				switch (e.NodeType)
+				{
+					case ExpressionType.Call           :
+					case ExpressionType.MemberAccess   :
+					case ExpressionType.New            :
+						if (!accessors.ContainsKey(e))
+							accessors.Add(e, p);
+						break;
+
+					case ExpressionType.Constant       :
+						if (!accessors.ContainsKey(e))
+							accessors.Add(e, Expression.Property(p, ReflectionHelper.Constant.Value));
+						break;
+
+					case ExpressionType.ConvertChecked :
+					case ExpressionType.Convert        :
+						if (!accessors.ContainsKey(e))
+						{
+							var ue = (UnaryExpression)e;
+
+							switch (ue.Operand.NodeType)
+							{
+								case ExpressionType.Call           :
+								case ExpressionType.MemberAccess   :
+								case ExpressionType.New            :
+								case ExpressionType.Constant       :
+
+									accessors.Add(e, p);
+									break;
+							}
+						}
+
+						break;
+				}
+			});
+
+			return accessors;
+		}
+
+		static public Expression GetRootObject(this Expression expr)
+		{
+			if (expr == null)
+				return null;
+
+			switch (expr.NodeType)
+			{
+				case ExpressionType.Call         :
+					{
+						var e = (MethodCallExpression)expr;
+
+						if (e.Object != null)
+							return GetRootObject(e.Object);
+
+						if (e.Arguments != null && e.Arguments.Count > 0 && e.IsQueryable())
+							return GetRootObject(e.Arguments[0]);
+
+						break;
+					}
+
+				case ExpressionType.MemberAccess :
+					{
+						var e = (MemberExpression)expr;
+
+						if (e.Expression != null)
+							return GetRootObject(e.Expression.Unwrap());
+
+						break;
+					}
+			}
+
+			return expr;
+		}
+
+		static public List<Expression> GetMembers(this Expression expr)
+		{
+			if (expr == null)
+				return new List<Expression>();
+
+			List<Expression> list;
+
+			switch (expr.NodeType)
+			{
+				case ExpressionType.Call         :
+					{
+						var e = (MethodCallExpression)expr;
+
+						if (e.Object != null)
+							list = GetMembers(e.Object);
+						else if (e.Arguments != null && e.Arguments.Count > 0 && e.IsQueryable())
+							list = GetMembers(e.Arguments[0]);
+						else
+							list = new List<Expression>();
+
+						break;
+					}
+
+				case ExpressionType.MemberAccess :
+					{
+						var e = (MemberExpression)expr;
+
+						if (e.Expression != null)
+							list = GetMembers(e.Expression.Unwrap());
+						else
+							list = new List<Expression>();
+
+						break;
+					}
+
+				default                          :
+					list = new List<Expression>();
+					break;
+			}
+
+			list.Add(expr);
+
+			return list;
+		}
+
+		static public bool IsQueryable(this MethodCallExpression method)
+		{
+			var type = method.Method.DeclaringType;
+
+			return type == typeof(Queryable) || type == typeof(Enumerable) || type == typeof(LinqExtensions);
+		}
+
+		static public bool IsQueryable(this MethodCallExpression method, string name)
+		{
+			return method.Method.Name == name && method.IsQueryable();
+		}
+
+		static public bool IsQueryable(this MethodCallExpression method, params string[] names)
+		{
+			if (method.IsQueryable())
+				foreach (var name in names)
+					if (method.Method.Name == name)
+						return true;
+
+			return false;
+		}
+
+		static Expression FindLevel(Expression expression, int level, ref int current)
+		{
+			switch (expression.NodeType)
+			{
+				case ExpressionType.Call :
+					{
+						var call = (MethodCallExpression)expression;
+						var expr = call.Object;
+
+						if (expr == null && call.IsQueryable() && call.Arguments.Count > 0)
+							expr = call.Arguments[0];
+
+						if (expr != null)
+						{
+							var ex = FindLevel(expr, level, ref current);
+
+							if (level == current)
+								return ex;
+
+							current++;
+						}
+
+						break;
+					}
+
+				case ExpressionType.MemberAccess:
+					{
+						var e = ((MemberExpression)expression);
+
+						if (e.Expression != null)
+						{
+							var expr = FindLevel(e.Expression.Unwrap(), level, ref current);
+
+							if (level == current)
+								return expr;
+
+							current++;
+						}
+
+						break;
+					}
+			}
+
+			return expression;
+		}
+
+		static public Expression GetLevelExpression(this Expression expression, int level)
+		{
+			var current = 0;
+			var expr    = FindLevel(expression, level, ref current);
+
+			if (expr == null || current != level)
+				throw new InvalidOperationException();
+
+			return expr;
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Linq/Extensions.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+
+using JetBrains.Annotations;
+
+namespace BLToolkit.Linq
+{
+	public static class Extensions
+	{
+		public static IEnumerable<TResult> Zip<TFirst,TSecond,TResult>(
+			[NotNull] this IEnumerable<TFirst>     first,
+			[NotNull] IEnumerable<TSecond>         second,
+			[NotNull] Func<TFirst,TSecond,TResult> resultSelector)
+		{
+			if (first          == null) throw new ArgumentNullException("first");
+			if (second         == null) throw new ArgumentNullException("second");
+			if (resultSelector == null) throw new ArgumentNullException("resultSelector");
+
+			using (var e1 = first.GetEnumerator())
+			using (var e2 = second.GetEnumerator())
+				while (e1.MoveNext() && e2.MoveNext())
+					yield return resultSelector(e1.Current, e2.Current);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/Association.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,52 @@
+using System;
+
+using JNotNull = JetBrains.Annotations.NotNullAttribute;
+
+namespace BLToolkit.Mapping
+{
+	using Common;
+	using Reflection;
+
+	public class Association
+	{
+		public Association(
+			[JNotNull] MemberAccessor memberAccessor,
+			[JNotNull] string[]       thisKey,
+			[JNotNull] string[]       otherKey,
+			           string         storage,
+			           bool           canBeNull)
+		{
+			if (memberAccessor == null) throw new ArgumentNullException("memberAccessor");
+			if (thisKey        == null) throw new ArgumentNullException("thisKey");
+			if (otherKey       == null) throw new ArgumentNullException("otherKey");
+
+			if (thisKey.Length == 0)
+				throw new ArgumentOutOfRangeException(
+					"thisKey",
+					string.Format("Association '{0}.{1}' does not define keys.", memberAccessor.TypeAccessor.Type.Name, memberAccessor.Name));
+
+			if (thisKey.Length != otherKey.Length)
+				throw new ArgumentException(
+					string.Format(
+						"Association '{0}.{1}' has different number of keys for parent and child objects.",
+						memberAccessor.TypeAccessor.Type.Name, memberAccessor.Name));
+
+			MemberAccessor = memberAccessor;
+			ThisKey        = thisKey;
+			OtherKey       = otherKey;
+			Storage        = storage;
+			CanBeNull      = canBeNull;
+		}
+
+		public MemberAccessor MemberAccessor { get; set; }
+		public string[]       ThisKey        { get; set; }
+		public string[]       OtherKey       { get; set; }
+		public string         Storage        { get; set; }
+		public bool           CanBeNull      { get; set; }
+
+		public static string[] ParseKeys(string keys)
+		{
+			return keys == null ? Array<string>.Empty : keys.Replace(" ", "").Split(',');
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/AssociationAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,16 @@
+using System;
+
+namespace BLToolkit.Mapping
+{
+	[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field, AllowMultiple=false)]
+	public class AssociationAttribute : Attribute
+	{
+		private string _thisKey;          public string ThisKey   { get { return _thisKey;   } set { _thisKey   = value; } }
+		private string _otherKey;         public string OtherKey  { get { return _otherKey;  } set { _otherKey  = value; } }
+		private string _storage;          public string Storage   { get { return _storage;   } set { _storage   = value; } }
+		private bool   _canBeNull = true; public bool   CanBeNull { get { return _canBeNull; } set { _canBeNull = value; } }
+
+		public string[] GetThisKeys () { return Association.ParseKeys(_thisKey);  }
+		public string[] GetOtherKeys() { return Association.ParseKeys(_otherKey); }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/DataReaderListMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,29 @@
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Mapping
+{
+	public class DataReaderListMapper : IMapDataSourceList
+	{
+		public DataReaderListMapper(DataReaderMapper mapper)
+		{
+			_mapper = mapper;
+		}
+
+		private readonly DataReaderMapper _mapper;
+
+		public virtual void InitMapping(InitContext initContext)
+		{
+			initContext.DataSource   = _mapper;
+			initContext.SourceObject = _mapper.DataReader;
+		}
+
+		public virtual bool SetNextDataSource(InitContext initContext)
+		{
+			return _mapper.DataReader.Read();
+		}
+
+		public virtual void EndMapping(InitContext initContext)
+		{
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/DataReaderMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,151 @@
+using System;
+using System.Data;
+using System.Data.SqlTypes;
+
+namespace BLToolkit.Mapping
+{
+	using Data;
+
+	public class DataReaderMapper : IMapDataSource
+	{
+		public DataReaderMapper(MappingSchema mappingSchema, IDataReader dataReader)
+		{
+			_mappingSchema = mappingSchema;
+			_dataReader    = dataReader;
+			_dataReaderEx  = dataReader as IDataReaderEx;
+		}
+
+		readonly IDataReaderEx _dataReaderEx;
+
+		readonly IDataReader _dataReader;
+		public   IDataReader  DataReader
+		{
+			get { return _dataReader; }
+		}
+
+		readonly MappingSchema _mappingSchema;
+		public   MappingSchema  MappingSchema
+		{
+			get { return _mappingSchema; }
+		}
+
+		#region IMapDataSource Members
+
+		public virtual int Count
+		{
+			get { return _dataReader.FieldCount; }
+		}
+
+		public virtual Type GetFieldType(int index)
+		{
+			return _dataReader.GetFieldType(index);
+		}
+
+		public virtual string GetName(int index)
+		{
+			return _dataReader.GetName(index);
+		}
+
+		public virtual int GetOrdinal(string name)
+		{
+			return _dataReader.GetOrdinal(name);
+		}
+
+		public virtual object GetValue(object o, int index)
+		{
+			var value = _dataReader.GetValue(index);
+			return value is DBNull? null: value;
+		}
+
+		public virtual object GetValue(object o, string name)
+		{
+			var value = _dataReader[name];
+			return value is DBNull? null: value;
+		}
+
+		public virtual bool     IsNull     (object o, int index) { return _dataReader.IsDBNull(index); }
+		public virtual bool     SupportsTypedValues(int index)   { return true; }
+
+		// Simple type getters.
+		//
+		[CLSCompliant(false)]
+		public virtual SByte    GetSByte   (object o, int index) { return _mappingSchema.ConvertToSByte(GetValue(o, index)); }
+		public virtual Int16    GetInt16   (object o, int index) { return _dataReader.GetInt16   (index); }
+		public virtual Int32    GetInt32   (object o, int index) { return _dataReader.GetInt32   (index); }
+		public virtual Int64    GetInt64   (object o, int index) { return _dataReader.GetInt64   (index); }
+
+		public virtual Byte     GetByte    (object o, int index) { return _dataReader.GetByte    (index); }
+		[CLSCompliant(false)]
+		public virtual UInt16   GetUInt16  (object o, int index) { return _mappingSchema.ConvertToUInt16(GetValue(o, index)); }
+		[CLSCompliant(false)]
+		public virtual UInt32   GetUInt32  (object o, int index) { return _mappingSchema.ConvertToUInt32(GetValue(o, index)); }
+		[CLSCompliant(false)]
+		public virtual UInt64   GetUInt64  (object o, int index) { return _mappingSchema.ConvertToUInt64(GetValue(o, index)); }
+
+		public virtual Boolean  GetBoolean (object o, int index) { return _dataReader.GetBoolean (index); }
+		public virtual Char     GetChar    (object o, int index) { return _dataReader.GetChar    (index); }
+		public virtual Single   GetSingle  (object o, int index) { return _dataReader.GetFloat   (index); }
+		public virtual Double   GetDouble  (object o, int index) { return _dataReader.GetDouble  (index); }
+		public virtual Decimal  GetDecimal (object o, int index) { return _dataReader.GetDecimal (index); }
+		public virtual Guid     GetGuid    (object o, int index) { return _dataReader.GetGuid    (index); }
+		public virtual DateTime GetDateTime(object o, int index) { return _dataReader.GetDateTime(index); }
+
+		public virtual DateTimeOffset GetDateTimeOffset(object o, int index)
+		{
+			return _dataReaderEx != null?
+				_dataReaderEx.GetDateTimeOffset(index):
+				_mappingSchema.ConvertToDateTimeOffset(_dataReader.GetValue(index));
+		}
+
+		// Nullable type getters.
+		//
+		[CLSCompliant(false)]
+		public virtual SByte?    GetNullableSByte   (object o, int index) { return _dataReader.IsDBNull(index)? null: _mappingSchema.ConvertToNullableSByte(GetValue(o, index)); }
+		public virtual Int16?    GetNullableInt16   (object o, int index) { return _dataReader.IsDBNull(index)? null: (Int16?)_dataReader.GetInt16   (index); }
+		public virtual Int32?    GetNullableInt32   (object o, int index) { return _dataReader.IsDBNull(index)? null: (Int32?)_dataReader.GetInt32   (index); }
+		public virtual Int64?    GetNullableInt64   (object o, int index) { return _dataReader.IsDBNull(index)? null: (Int64?)_dataReader.GetInt64   (index); }
+
+		public virtual Byte?     GetNullableByte    (object o, int index) { return _dataReader.IsDBNull(index)? null: (Byte?) _dataReader.GetByte    (index); }
+		[CLSCompliant(false)]
+		public virtual UInt16?   GetNullableUInt16  (object o, int index) { return _dataReader.IsDBNull(index)? null: _mappingSchema.ConvertToNullableUInt16(GetValue(o, index)); }
+		[CLSCompliant(false)]
+		public virtual UInt32?   GetNullableUInt32  (object o, int index) { return _dataReader.IsDBNull(index)? null: _mappingSchema.ConvertToNullableUInt32(GetValue(o, index)); }
+		[CLSCompliant(false)]
+		public virtual UInt64?   GetNullableUInt64  (object o, int index) { return _dataReader.IsDBNull(index)? null: _mappingSchema.ConvertToNullableUInt64(GetValue(o, index)); }
+
+		public virtual Boolean?  GetNullableBoolean (object o, int index) { return _dataReader.IsDBNull(index)? null: (Boolean?) _dataReader.GetBoolean (index); }
+		public virtual Char?     GetNullableChar    (object o, int index) { return _dataReader.IsDBNull(index)? null: (Char?)    _dataReader.GetChar    (index); }
+		public virtual Single?   GetNullableSingle  (object o, int index) { return _dataReader.IsDBNull(index)? null: (Single?)  _dataReader.GetFloat   (index); }
+		public virtual Double?   GetNullableDouble  (object o, int index) { return _dataReader.IsDBNull(index)? null: (Double?)  _dataReader.GetDouble  (index); }
+		public virtual Decimal?  GetNullableDecimal (object o, int index) { return _dataReader.IsDBNull(index)? null: (Decimal?) _dataReader.GetDecimal (index); }
+		public virtual Guid?     GetNullableGuid    (object o, int index) { return _dataReader.IsDBNull(index)? null: (Guid?)    _dataReader.GetGuid    (index); }
+		public virtual DateTime? GetNullableDateTime(object o, int index) { return _dataReader.IsDBNull(index)? null: (DateTime?)_dataReader.GetDateTime(index); }
+		public virtual DateTimeOffset? GetNullableDateTimeOffset(object o, int index)
+		{
+			return _dataReader.IsDBNull(index)? null:
+				_dataReaderEx != null? _dataReaderEx.GetDateTimeOffset(index):
+				_mappingSchema.ConvertToNullableDateTimeOffset(_dataReader.GetValue(index));
+		}
+
+#if !SILVERLIGHT
+
+		// SQL type getters.
+		//
+		public virtual SqlByte     GetSqlByte    (object o, int index) { return _dataReader.IsDBNull(index)? SqlByte.    Null: _dataReader.GetByte    (index); }
+		public virtual SqlInt16    GetSqlInt16   (object o, int index) { return _dataReader.IsDBNull(index)? SqlInt16.   Null: _dataReader.GetInt16   (index); }
+		public virtual SqlInt32    GetSqlInt32   (object o, int index) { return _dataReader.IsDBNull(index)? SqlInt32.   Null: _dataReader.GetInt32   (index); }
+		public virtual SqlInt64    GetSqlInt64   (object o, int index) { return _dataReader.IsDBNull(index)? SqlInt64.   Null: _dataReader.GetInt64   (index); }
+		public virtual SqlSingle   GetSqlSingle  (object o, int index) { return _dataReader.IsDBNull(index)? SqlSingle.  Null: _dataReader.GetFloat   (index); }
+		public virtual SqlBoolean  GetSqlBoolean (object o, int index) { return _dataReader.IsDBNull(index)? SqlBoolean. Null: _dataReader.GetBoolean (index); }
+		public virtual SqlDouble   GetSqlDouble  (object o, int index) { return _dataReader.IsDBNull(index)? SqlDouble.  Null: _dataReader.GetDouble  (index); }
+		public virtual SqlDateTime GetSqlDateTime(object o, int index) { return _dataReader.IsDBNull(index)? SqlDateTime.Null: _dataReader.GetDateTime(index); }
+		public virtual SqlDecimal  GetSqlDecimal (object o, int index) { return _dataReader.IsDBNull(index)? SqlDecimal. Null: _dataReader.GetDecimal (index); }
+		public virtual SqlMoney    GetSqlMoney   (object o, int index) { return _dataReader.IsDBNull(index)? SqlMoney.   Null: _dataReader.GetDecimal (index); }
+		public virtual SqlGuid     GetSqlGuid    (object o, int index) { return _dataReader.IsDBNull(index)? SqlGuid.    Null: _dataReader.GetGuid    (index); }
+		public virtual SqlString   GetSqlString  (object o, int index) { return _dataReader.IsDBNull(index)? SqlString.  Null: _dataReader.GetString  (index); }
+
+#endif
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/DataRowMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,188 @@
+using System;
+using System.Data;
+using System.Collections;
+
+namespace BLToolkit.Mapping
+{
+	public class DataRowMapper : MapDataSourceDestinationBase
+	{
+		bool                    _createColumns;
+		readonly DataRowVersion _version;
+
+		public DataRowMapper(DataRow dataRow)
+			: this(dataRow, DataRowVersion.Default)
+		{
+		}
+
+		public DataRowMapper(DataRowView view)
+			: this(view.Row, view.RowVersion)
+		{
+		}
+
+		public DataRowMapper(DataRow dataRow, DataRowVersion version)
+		{
+			_version = version;
+
+			Init(dataRow);
+		}
+
+		private void Init(DataRow dataRow)
+		{
+			if (_dataRow == null && dataRow != null)
+				_createColumns = dataRow.Table.Columns.Count == 0;
+
+			_dataRow = dataRow;
+		}
+
+		private DataRow _dataRow;
+		public  DataRow  DataRow
+		{
+			get { return _dataRow; }
+			set { Init(value);     }
+		}
+
+		#region IMapDataSource Members
+
+		public override int Count
+		{
+			get { return _dataRow.Table.Columns.Count; }
+		}
+
+		public override Type GetFieldType(int index)
+		{
+			return index < _dataRow.Table.Columns.Count?
+				_dataRow.Table.Columns[index].DataType: null;
+		}
+
+		public override string GetName(int index)
+		{
+			return _dataRow.Table.Columns[index].ColumnName;
+		}
+
+		public override object GetValue(object o, int index)
+		{
+			object value = _version == DataRowVersion.Default ? _dataRow[index] : _dataRow[index, _version];
+			return value is DBNull? null: value;
+		}
+
+		public override object GetValue(object o, string name)
+		{
+			object value = _version == DataRowVersion.Default ? _dataRow[name] : _dataRow[name, _version];
+			return value is DBNull? null: value;
+		}
+
+		public override bool IsNull(object o, int index)
+		{
+			if (_version == DataRowVersion.Default)
+				return _dataRow.IsNull(index);
+
+			DataColumn col = _dataRow.Table.Columns[index];
+
+			return _dataRow.IsNull(col, _version);
+		}
+
+		#endregion
+
+		#region IMapDataDestination Members
+
+		private ArrayList _nameList;
+
+		public override int GetOrdinal(string name)
+		{
+			if (_createColumns)
+			{
+				if (_nameList == null)
+					_nameList = new ArrayList();
+
+				for (int i = 0; i < _nameList.Count; i++)
+					if (name == _nameList[i].ToString())
+						return i;
+
+				return _nameList.Add(name);
+			}
+
+			return _dataRow.Table.Columns.IndexOf(name);
+		}
+
+		private void CreateColumn(int index, object value)
+		{
+			if (_dataRow.Table.Rows.Count > 1)
+			{
+				_createColumns = false;
+			}
+			else
+			{
+				DataColumnCollection cc   = _dataRow.Table.Columns;
+				string               name = _nameList[index].ToString();
+
+				DataColumn column = 
+					value == null || value is DBNull? cc.Add(name): cc.Add(name, value.GetType());
+
+				if (cc.IndexOf(column) != index)
+					throw new MappingException(string.Format("Cant create data column '{0}'.", name));
+			}
+		}
+
+		public override void SetValue(object o, int index, object value)
+		{
+			if (_createColumns)
+				CreateColumn(index, value);
+
+			if (value == null || value is DBNull)
+			{
+				_dataRow[index] = DBNull.Value;
+			}
+			else
+			{
+				DataColumn column = _dataRow.Table.Columns[index];
+
+				if (column.DataType != value.GetType())
+				{
+					if (column.DataType == typeof(Guid))
+					{
+						value = new Guid(value.ToString());
+					}
+					else
+					{
+						if (column.DataType != typeof(string))
+							value = Convert.ChangeType(value, column.DataType);
+					}
+				}
+
+				_dataRow[index] = value;
+			}
+		}
+
+		public override void SetValue(object o, string name, object value)
+		{
+			if (_createColumns)
+				CreateColumn(GetOrdinal(name), value);
+
+			if (value == null || value is DBNull)
+			{
+				_dataRow[name] = DBNull.Value;
+			}
+			else
+			{
+				DataColumn dc = _dataRow.Table.Columns[name];
+
+				if (dc.DataType != value.GetType())
+				{
+					if (dc.DataType == typeof(Guid))
+					{
+						value = new Guid(value.ToString());
+					}
+					else
+					{
+						if (dc.DataType != typeof(string))
+							value = Convert.ChangeType(value, dc.DataType);
+					}
+				}
+
+				_dataRow[name] = value;
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/DataTableMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,75 @@
+using System.Data;
+
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Mapping
+{
+	public class DataTableMapper : IMapDataSourceList, IMapDataDestinationList
+	{
+		public DataTableMapper(DataTable dataTable, DataRowMapper mapper)
+		{
+			_table  = dataTable;
+			_mapper = mapper;
+		}
+
+		private readonly DataTable     _table;
+		private readonly DataRowMapper _mapper;
+		private int                    _currentRow;
+
+		#region IMapDataSourceList Members
+
+		void IMapDataSourceList.InitMapping(InitContext initContext)
+		{
+			initContext.DataSource = _mapper;
+		}
+
+		bool IMapDataSourceList.SetNextDataSource(InitContext initContext)
+		{
+			if (_currentRow >= _table.Rows.Count)
+				return false;
+
+			DataRow row = _table.Rows[_currentRow++];
+
+			if (row.RowState == DataRowState.Deleted)
+				return ((IMapDataSourceList)this).SetNextDataSource(initContext);
+
+			_mapper.DataRow          = row;
+			initContext.SourceObject = row;
+
+			return true;
+		}
+
+		void IMapDataSourceList.EndMapping(InitContext initContext)
+		{
+		}
+
+		#endregion
+
+		#region IMapDataDestinationList Members
+
+		void IMapDataDestinationList.InitMapping(InitContext initContext)
+		{
+		}
+
+		IMapDataDestination IMapDataDestinationList.GetDataDestination(InitContext initContext)
+		{
+			return _mapper;
+		}
+
+		object IMapDataDestinationList.GetNextObject(InitContext initContext)
+		{
+			DataRow row = _table.NewRow();
+
+			_mapper.DataRow = row;
+			_table.Rows.Add(row);
+
+			return row;
+		}
+
+		void IMapDataDestinationList.EndMapping(InitContext initContext)
+		{
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/DefaultMappingSchema.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,6 @@
+namespace BLToolkit.Mapping
+{
+	public sealed class DefaultMappingSchema : MappingSchema
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/DefaultMemberMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+namespace BLToolkit.Mapping
+{
+	class DefaultMemberMapper : MemberMapper
+	{
+		public override bool SupportsValue
+		{
+			get { return false; }
+		}
+
+		public override object GetValue(object o)
+		{
+			return MapTo(base.GetValue(o));
+		}
+
+		public override void SetValue(object o, object value)
+		{
+			base.SetValue(o, MapFrom(value));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/DefaultValueAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,41 @@
+using System;
+using System.Diagnostics.CodeAnalysis;
+
+namespace BLToolkit.Mapping
+{
+	[SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes")]
+	[AttributeUsage(
+		AttributeTargets.Class | AttributeTargets.Interface |
+		AttributeTargets.Property | AttributeTargets.Field |
+		AttributeTargets.Enum,
+		AllowMultiple=true)]
+	public class DefaultValueAttribute : Attribute
+	{
+		public DefaultValueAttribute()
+		{
+		}
+
+		public DefaultValueAttribute(object value)
+		{
+			_value = value;
+		}
+
+		public DefaultValueAttribute(Type type, object value)
+		{
+			_type  = type;
+			_value = value;
+		}
+
+		private readonly object _value;
+		public           object  Value
+		{
+			get { return _value; }
+		}
+
+		private readonly Type _type;
+		public           Type  Type
+		{
+			get { return _type; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/DictionaryIndexListMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,104 @@
+using System;
+using System.Collections;
+
+using BLToolkit.Common;
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Mapping
+{
+	public class DictionaryIndexListMapper : IMapDataDestinationList
+	{
+		public DictionaryIndexListMapper(
+			IDictionary  dic,
+			MapIndex     index,
+			ObjectMapper objectMapper)
+		{
+			_dic    = dic;
+			_mapper = objectMapper;
+
+			_fields = new NameOrIndexParameter[index.Fields.Length];
+			_fromSource = new bool[index.Fields.Length];
+
+			for (int i = 0; i < _fields.Length; i++)
+			{
+				bool fromSource = index.Fields[i].ByName && index.Fields[i].Name[0] == '@';
+
+				_fields[i]     = fromSource? index.Fields[i].Name.Substring(1): index.Fields[i];
+				_fromSource[i] = fromSource;
+				_isFromSource  = _isFromSource ||  fromSource;
+				_isFromDest    = _isFromDest   || !fromSource;
+			}
+		}
+
+		private readonly NameOrIndexParameter[] _fields;
+		private readonly IDictionary            _dic;
+		private readonly bool[]                 _fromSource;
+		private readonly bool                   _isFromSource;
+		private readonly bool                   _isFromDest;
+		private          ObjectMapper           _mapper;
+		private          object                 _newObject;
+		private          object[]               _indexValue;
+
+		#region IMapDataDestinationList Members
+
+		private void AddObject()
+		{
+			if (_newObject != null)
+			{
+				if (_isFromDest)
+					for (int i = 0; i < _fields.Length; i++)
+						if (!_fromSource[i])
+							_indexValue[i] = _mapper.TypeAccessor[_fields[i]].GetValue(_newObject);
+
+				_dic[new CompoundValue(_indexValue)] = _newObject;
+			}
+		}
+
+		public virtual void InitMapping(InitContext initContext)
+		{
+			var sm = _dic as ISupportMapping;
+
+			if (sm != null)
+			{
+				sm.BeginMapping(initContext);
+
+				if (_mapper != initContext.ObjectMapper)
+					_mapper = initContext.ObjectMapper;
+			}
+		}
+
+		[CLSCompliant(false)]
+		public virtual IMapDataDestination GetDataDestination(InitContext initContext)
+		{
+			return _mapper;
+		}
+
+		public virtual object GetNextObject(InitContext initContext)
+		{
+			AddObject();
+
+			_indexValue = new object[_fields.Length];
+
+			if (_isFromSource)
+				for (int i = 0; i < _fields.Length; i++)
+					if (_fromSource[i])
+						_indexValue[i] = _fields[i].ByName ?
+							initContext.DataSource.GetValue( initContext.SourceObject, _fields[i].Name) :
+							initContext.DataSource.GetValue( initContext.SourceObject, _fields[i].Index);
+
+			return _newObject = _mapper.CreateInstance(initContext);
+		}
+
+		public virtual void EndMapping(InitContext initContext)
+		{
+			AddObject();
+
+			ISupportMapping sm = _dic as ISupportMapping;
+
+			if (sm != null)
+				sm.EndMapping(initContext);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/DictionaryIndexListMapperT.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,104 @@
+using System;
+using System.Collections.Generic;
+
+using BLToolkit.Common;
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Mapping
+{
+	public class DictionaryIndexListMapper<T> : IMapDataDestinationList
+	{
+		public DictionaryIndexListMapper(
+			IDictionary<CompoundValue,T> dic,
+			MapIndex                     index,
+			ObjectMapper                 objectMapper)
+		{
+			_dic    = dic;
+			_mapper = objectMapper;
+
+			_fields = new NameOrIndexParameter[index.Fields.Length];
+			_fromSource = new bool[index.Fields.Length];
+
+			for (int i = 0; i < _fields.Length; i++)
+			{
+				bool fromSource = index.Fields[i].ByName && index.Fields[i].Name[0] == '@';
+
+				_fields[i]     = fromSource ? index.Fields[i].Name.Substring(1) : index.Fields[i];
+				_fromSource[i] = fromSource;
+				_isFromSource  = _isFromSource ||  fromSource;
+				_isFromDest    = _isFromDest   || !fromSource;
+			}
+		}
+
+		private readonly NameOrIndexParameter[]       _fields;
+		private readonly IDictionary<CompoundValue,T> _dic;
+		private readonly bool[]                       _fromSource;
+		private readonly bool                         _isFromSource;
+		private readonly bool                         _isFromDest;
+		private          ObjectMapper                 _mapper;
+		private          object                       _newObject;
+		private          object[]                     _indexValue;
+
+		#region IMapDataDestinationList Members
+
+		private void AddObject()
+		{
+			if (_newObject != null)
+			{
+				if (_isFromDest)
+					for (int i = 0; i < _fields.Length; i++)
+						if (!_fromSource[i])
+							_indexValue[i] = _mapper.TypeAccessor[_fields[i]].GetValue(_newObject);
+
+				_dic[new CompoundValue(_indexValue)] = (T)_newObject;
+			}
+		}
+
+		public virtual void InitMapping(InitContext initContext)
+		{
+			ISupportMapping sm = _dic as ISupportMapping;
+
+			if (sm != null)
+			{
+				sm.BeginMapping(initContext);
+
+				if (_mapper != initContext.ObjectMapper)
+					_mapper = initContext.ObjectMapper;
+			}
+		}
+
+		[CLSCompliant(false)]
+		public virtual IMapDataDestination GetDataDestination(InitContext initContext)
+		{
+			return _mapper;
+		}
+
+		public virtual object GetNextObject(InitContext initContext)
+		{
+			AddObject();
+
+			_indexValue = new object[_fields.Length];
+
+			if (_isFromSource)
+				for (int i = 0; i < _fields.Length; i++)
+					if (_fromSource[i])
+						_indexValue[i] = _fields[i].ByName ?
+							initContext.DataSource.GetValue(initContext.SourceObject, _fields[i].Name) :
+							initContext.DataSource.GetValue(initContext.SourceObject, _fields[i].Index);
+
+			return _newObject = _mapper.CreateInstance(initContext);
+		}
+
+		public virtual void EndMapping(InitContext initContext)
+		{
+			AddObject();
+
+			ISupportMapping sm = _dic as ISupportMapping;
+
+			if (sm != null)
+				sm.EndMapping(initContext);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/DictionaryListMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,92 @@
+using System;
+using System.Collections;
+
+using BLToolkit.Common;
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Mapping
+{
+	public class DictionaryListMapper : IMapDataDestinationList
+	{
+		public DictionaryListMapper(
+			IDictionary          dic,
+			NameOrIndexParameter keyField,
+			ObjectMapper         objectMapper)
+		{
+			_dic        = dic;
+			_mapper     = objectMapper;
+			_fromSource = keyField.ByName && keyField.Name[0] == '@';
+			_keyField   = _fromSource? keyField.Name.Substring(1): keyField;
+		}
+
+		private readonly IDictionary          _dic;
+		private readonly bool                 _fromSource;
+		private          NameOrIndexParameter _keyField;
+		private          ObjectMapper         _mapper;
+		private          object               _newObject;
+		private          object               _keyValue;
+
+		#region IMapDataDestinationList Members
+
+		private void AddObject()
+		{
+			if (_newObject != null)
+			{
+				if (!_fromSource)
+					_keyValue = _mapper.TypeAccessor[_keyField].GetValue(_newObject);
+
+				_dic[_keyValue]  = _newObject;
+			}
+		}
+
+		public virtual void InitMapping(InitContext initContext)
+		{
+			ISupportMapping sm = _dic as ISupportMapping;
+
+			if (sm != null)
+			{
+				sm.BeginMapping(initContext);
+
+				if (_mapper != initContext.ObjectMapper)
+					_mapper = initContext.ObjectMapper;
+			}
+		}
+
+		[CLSCompliant(false)]
+		public virtual IMapDataDestination GetDataDestination(InitContext initContext)
+		{
+			return _mapper;
+		}
+
+		static readonly char[] _trim = { ' ' };
+
+		public virtual object GetNextObject(InitContext initContext)
+		{
+			AddObject();
+
+			if (_fromSource)
+			{
+				_keyValue = _keyField.ByName ? 
+					initContext.DataSource.GetValue(initContext.SourceObject, _keyField.Name) :
+					initContext.DataSource.GetValue(initContext.SourceObject, _keyField.Index);
+
+				if (Common.Configuration.TrimDictionaryKey && _keyValue is string)
+					_keyValue = _keyValue.ToString().TrimEnd(_trim);
+			}
+
+			return _newObject = _mapper.CreateInstance(initContext);
+		}
+
+		public virtual void EndMapping(InitContext initContext)
+		{
+			AddObject();
+
+			ISupportMapping sm = _dic as ISupportMapping;
+
+			if (sm != null)
+				sm.EndMapping(initContext);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/DictionaryListMapperT.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,120 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using BLToolkit.Common;
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Mapping
+{
+	public class DictionaryListMapper<K,T> : IMapDataDestinationList
+	{
+		public DictionaryListMapper(
+			IDictionary<K,T>     dic,
+			NameOrIndexParameter keyField,
+			ObjectMapper         objectMapper)
+		{
+			_dic        = dic;
+			_mapper     = objectMapper;
+			_keyGetter  = MapGetData<K>.I;
+			_fromSource = keyField.ByName && keyField.Name[0] == '@';
+			_keyField   = _fromSource? keyField.Name.Substring(1): keyField;
+		}
+
+		private readonly IDictionary<K,T>     _dic;
+		private readonly bool                 _fromSource;
+		private readonly MapGetData<K>.MB<K>  _keyGetter;
+		private          NameOrIndexParameter _keyField;
+		private          int                  _index;
+		private          ObjectMapper         _mapper;
+		private          object               _newObject;
+		private          bool                 _typeMismatch;
+		private          K                    _keyValue;
+
+		#region IMapDataDestinationList Members
+
+		private void AddObject()
+		{
+			if (_newObject != null)
+			{
+				if (_typeMismatch)
+					_keyValue = _mapper.MappingSchema.ConvertTo<K,object>(_mapper[_index].GetValue(_newObject));
+				else if (!_fromSource)
+					_keyValue = _keyGetter.From(_mapper, _newObject, _index);
+
+				_dic[_keyValue] = (T)_newObject;
+			}
+		}
+
+		public virtual void InitMapping(InitContext initContext)
+		{
+			var sm = _dic as ISupportMapping;
+
+			if (sm != null)
+			{
+				sm.BeginMapping(initContext);
+
+				if (_mapper != initContext.ObjectMapper)
+					_mapper = initContext.ObjectMapper;
+			}
+
+			if (_fromSource)
+				_index = _keyField.ByName? initContext.DataSource.GetOrdinal(_keyField.Name): _keyField.Index;
+			else
+			{
+				_index = _keyField.ByName? _mapper.GetOrdinal(_keyField.Name, true): _keyField.Index;
+
+				if (_index < 0)
+					throw new MappingException(
+						_keyField.ByName?
+						string.Format("Field '{0}' not found.", _keyField.Name):
+						string.Format("Index '{0}' is invalid.", _keyField.Index));
+
+				var mm = _mapper[_index];
+				_typeMismatch = !TypeHelper.IsSameOrParent(typeof(K), mm.Type);
+
+#if !SILVERLIGHT
+
+				Debug.WriteLineIf(_typeMismatch, string.Format(
+					"Member {0} type '{1}' does not match dictionary key type '{2}'.",
+						mm.Name, mm.Type.Name, (typeof(K).Name)));
+
+#endif
+			}
+		}
+
+		[CLSCompliant(false)]
+		public virtual IMapDataDestination GetDataDestination(InitContext initContext)
+		{
+			return _mapper;
+		}
+
+		static readonly char[] _trim = { ' ' };
+
+		public virtual object GetNextObject(InitContext initContext)
+		{
+			AddObject();
+
+			if (_fromSource)
+			{
+				_keyValue = _keyGetter.From(initContext.DataSource, initContext.SourceObject, _index);
+
+				if (Common.Configuration.TrimDictionaryKey && _keyValue is string)
+					_keyValue = (K)(object)_keyValue.ToString().TrimEnd(_trim);
+			}
+
+			return _newObject = _mapper.CreateInstance(initContext);
+		}
+
+		public virtual void EndMapping(InitContext initContext)
+		{
+			AddObject();
+
+			ISupportMapping sm = _dic as ISupportMapping;
+
+			if (sm != null)
+				sm.EndMapping(initContext);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/DictionaryMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,115 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace BLToolkit.Mapping
+{
+	public class DictionaryMapper : MapDataSourceDestinationBase
+	{
+		public DictionaryMapper(IDictionary dictionary)
+		{
+			if (dictionary == null) throw new ArgumentNullException("dictionary");
+
+			_dictionary = dictionary;
+		}
+
+		private readonly IDictionary _dictionary;
+		public           IDictionary  Dictionary
+		{
+			get { return _dictionary; }
+		}
+
+		private int                   _currentIndex;
+		private IDictionaryEnumerator _enumerator;
+
+		private void SetEnumerator(int i)
+		{
+			if (_enumerator == null)
+			{
+				_enumerator = _dictionary.GetEnumerator();
+				_enumerator.MoveNext();
+			}
+
+			if (_currentIndex > i)
+			{
+				_currentIndex = 0;
+				_enumerator.Reset();
+				_enumerator.MoveNext();
+			}
+
+			for (; _currentIndex < i; _currentIndex++)
+				_enumerator.MoveNext();
+		}
+
+		#region IMapDataSource Members
+
+		public override int Count
+		{
+			get { return _dictionary.Count; }
+		}
+
+		public override Type GetFieldType(int index)
+		{
+			SetEnumerator(index);
+			return _enumerator.Value == null? typeof(object): _enumerator.Value.GetType();
+		}
+
+		public override string GetName(int index)
+		{
+			SetEnumerator(index);
+			return _enumerator.Key.ToString();
+		}
+
+		public override bool SupportsTypedValues(int index)
+		{
+			return index < _dictionary.Count;
+		}
+
+		public override object GetValue(object o, int index)
+		{
+			SetEnumerator(index);
+			return _enumerator.Value;
+		}
+
+		public override object GetValue(object o, string name)
+		{
+			return _dictionary.Contains(name) ? _dictionary[name] : null;
+		}
+
+		#endregion
+
+		#region IMapDataDestination Members
+
+		private List<string> _nameList;
+
+		public override int GetOrdinal(string name)
+		{
+			if (_nameList == null)
+				_nameList = new List<string>();
+
+			var idx = _nameList.IndexOf(name);
+
+			if (idx >= 0)
+				return idx;
+
+			_nameList.Add(name);
+
+			return _nameList.Count - 1;
+		}
+
+		public override void SetValue(object o, int index, object value)
+		{
+			SetValue(o, _nameList[index], value);
+		}
+
+		public override void SetValue(object o, string name, object value)
+		{
+			if (_dictionary.Contains(name))
+				_dictionary[name] = value;
+			else
+				_dictionary.Add(name, value);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/EnumeratorMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,51 @@
+using System;
+using System.Collections;
+
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Mapping
+{
+	public class EnumeratorMapper : IMapDataSourceList
+	{
+		public EnumeratorMapper(IEnumerator enumerator)
+		{
+			_enumerator = enumerator;
+		}
+
+		private readonly IEnumerator _enumerator;
+		private          Type        _objectType;
+
+		#region IMapDataSourceList Members
+
+		public virtual void InitMapping(InitContext initContext)
+		{
+			_enumerator.Reset();
+		}
+
+		public virtual bool SetNextDataSource(InitContext initContext)
+		{
+			if (initContext == null) throw new ArgumentNullException("initContext");
+
+			if (_enumerator.MoveNext() == false)
+				return false;
+
+			object sourceObject = _enumerator.Current;
+
+			if (_objectType != sourceObject.GetType())
+			{
+				_objectType = sourceObject.GetType();
+				initContext.DataSource = initContext.MappingSchema.GetObjectMapper(_objectType);
+			}
+
+			initContext.SourceObject = sourceObject;
+
+			return true;
+		}
+
+		public virtual void EndMapping(InitContext initContext)
+		{
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/ExpressionMapIgnoreAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+using System;
+
+namespace BLToolkit.Mapping
+{
+	[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
+	public sealed class ExpressionMapIgnoreAttribute : Attribute
+	{
+		public ExpressionMapIgnoreAttribute()
+		{
+			Ignore = true;
+		}
+
+		public ExpressionMapIgnoreAttribute(bool ignore)
+		{
+			Ignore = ignore;
+		}
+
+		public bool Ignore { get; set; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/ExpressionMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,785 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+
+using BLToolkit.Common;
+using BLToolkit.Data.Linq;
+using BLToolkit.Reflection;
+
+using JetBrains.Annotations;
+
+namespace BLToolkit.Mapping
+{
+	class Mapper<TS,TD>
+	{
+		public Func<TS,MappingContext,TD> Map;
+	}
+
+	class MappingContext
+	{
+		public Dictionary<object,object> Objects;
+		public Func<object,object>       GetParent;
+		public List<Action<object>>      CrossActions;
+		public Dictionary<object,List<Action<object,object>>> Crosses;
+	}
+
+	class MappingParameters
+	{
+		public   MappingSchema             MappingSchema;
+		public   bool                      DeepCopy              = true;
+		public   bool                      HandleCrossReferences = true;
+		public   bool                      IncludeComplexMapping;
+
+		public   Dictionary<object,object> MapperList     = new Dictionary<object,object>();
+
+		public   bool                      UseContext;
+		public   bool                      ContextParameterUsed;
+
+		readonly ParameterExpression      _mappingContext = Expression.Parameter(typeof(MappingContext), "ctx");
+		public   ParameterExpression       MappingContext
+		{
+			get
+			{
+				ContextParameterUsed = true;
+				return _mappingContext;
+			}
+		}
+	}
+
+	public class ExpressionMapper<TSource,TDest>
+	{
+		readonly MappingParameters     _parameters;
+		private  Func<object,object>   _getCurrent;
+		private  Action<object,object> _setCurrent;
+
+		public bool DeepCopy              { get { return _parameters.DeepCopy;              } set { _parameters.DeepCopy              = value; } }
+		public bool HandleBackReferences  { get { return _parameters.HandleCrossReferences; } set { _parameters.HandleCrossReferences = value; } }
+		public bool IncludeComplexMapping { get { return _parameters.IncludeComplexMapping; } set { _parameters.IncludeComplexMapping = value; } }
+
+		public ExpressionMapper()
+			: this(Map.DefaultSchema)
+		{
+		}
+
+		public ExpressionMapper(MappingSchema mappingSchema)
+		{
+			_parameters = new MappingParameters { MappingSchema = mappingSchema };
+		}
+
+		ExpressionMapper(MappingParameters parameters)
+		{
+			_parameters = parameters;
+		}
+
+		#region Value Converter
+
+		interface IValueConvertHelper
+		{
+			Expression GetConverter   (Expression source);
+			Expression CheckNull      (ExpressionMapper<TSource,TDest> mapper, Expression source, object nullValue, MapValue[] mapValues, object defaultValue, MapValue[] srcMapValues);
+			Expression SourceMapValues(ExpressionMapper<TSource,TDest> mapper, Expression source, object nullValue, object defaultValue, MapValue[] srcMapValues);
+			Expression DestMapValues  (ExpressionMapper<TSource,TDest> mapper, Expression source, object nullValue, MapValue[] mapValues, object defaultValue);
+		}
+
+		class ValueConvertHelper<TS,TD> : IValueConvertHelper
+		{
+			public Expression GetConverter(Expression source)
+			{
+				return Expression.Invoke(Expression.Constant(Convert<TD,TS>.From), source);
+			}
+
+			public Expression CheckNull(
+				ExpressionMapper<TSource,TDest> mapper,
+				Expression                      source,
+				object                          nullValue,
+				MapValue[]                      mapValues,
+				object                          defaultValue,
+				MapValue[]                      srcMapValues)
+			{
+				var param =
+					source.NodeType != ExpressionType.MemberAccess &&
+					source.NodeType != ExpressionType.Parameter    &&
+					source.NodeType != ExpressionType.Constant?
+						Expression.Parameter(typeof(TS), "p") :
+						null;
+
+				var nexpr = Expression.Constant(nullValue ?? default(TD));
+
+				var expr =
+					source.NodeType == ExpressionType.Constant && ((ConstantExpression)source).Value == null ?
+						nexpr as Expression:
+						Expression.Condition(
+							Expression.Equal(param ?? source, Expression.Constant(null)),
+							nexpr.Value == null ? Expression.Convert(nexpr, typeof(TD)) : nexpr as Expression,
+							mapper.GetValueMapper(param ?? source, typeof(TD), false, null, mapValues, defaultValue, srcMapValues));
+
+				return param == null ? expr : Expression.Invoke(Expression.Lambda<Func<TS,TD>>(expr, param), source);
+			}
+
+			public Expression SourceMapValues(
+				ExpressionMapper<TSource,TDest> mapper,
+				Expression                      source,
+				object                          nullValue,
+				object                          defaultValue,
+				MapValue[]                      srcMapValues)
+			{
+				var param =
+					//source.NodeType != ExpressionType.MemberAccess &&
+					source.NodeType != ExpressionType.Parameter    &&
+					source.NodeType != ExpressionType.Constant?
+						Expression.Parameter(typeof(TS), "p") :
+						null;
+
+				var expr = mapper.GetValueMapper(Expression.Constant(defaultValue), typeof(TD), true, nullValue, null, null, null);
+
+				for (var i = srcMapValues.Length - 1; i >= 0; i--)
+				{
+					var value = srcMapValues[i];
+
+					expr = Expression.Condition(
+						Expression.Equal(param ?? source, mapper.GetValueMapper(Expression.Constant(value.OrigValue), typeof(TS), false, null, null, null, null)),
+						mapper.GetValueMapper(Expression.Constant(value.MapValues[0]), typeof(TD), true, nullValue, null, null, null),
+						expr);
+				}
+
+				return param == null ? expr : Expression.Invoke(Expression.Lambda<Func<TS,TD>>(expr, param), source);
+			}
+
+			public Expression DestMapValues(
+				ExpressionMapper<TSource,TDest> mapper,
+				Expression                      source,
+				object                          nullValue,
+				MapValue[]                      mapValues,
+				object                          defaultValue)
+			{
+				var param =
+					//source.NodeType != ExpressionType.MemberAccess &&
+					source.NodeType != ExpressionType.Parameter    &&
+					source.NodeType != ExpressionType.Constant?
+						Expression.Parameter(typeof(TS), "p") :
+						null;
+
+				var expr = mapper.GetValueMapper(Expression.Constant(defaultValue), typeof(TD), true, nullValue, null, null, null);
+
+				for (var i = mapValues.Length - 1; i >= 0; i--)
+				{
+					var value = mapValues[i];
+					var orex  = null as Expression;
+
+					foreach (var mapValue in value.MapValues)
+					{
+						var ex = Expression.Equal(param ?? source, mapper.GetValueMapper(Expression.Constant(mapValue), typeof (TS), false, null, null, null, null));
+						orex = orex == null ? ex : Expression.OrElse(orex, ex);
+					}
+
+					if (orex != null)
+						expr = Expression.Condition(
+							orex,
+							mapper.GetValueMapper(Expression.Constant(value.OrigValue), typeof(TD), true, nullValue, null, null, null),
+							expr);
+				}
+
+				return param == null ? expr : Expression.Invoke(Expression.Lambda<Func<TS,TD>>(expr, param), source);
+			}
+		}
+
+		static IValueConvertHelper GetValueHelper(Type stype, Type dtype)
+		{
+			var type = typeof(ValueConvertHelper<,>).MakeGenericType(typeof(TSource), typeof(TDest), stype, dtype);
+			return ((IValueConvertHelper)Activator.CreateInstance(type));
+		}
+
+		#endregion
+
+		#region Object Converter
+
+		interface IConvertHelper
+		{
+			Expression MapObjects(ExpressionMapper<TSource,TDest> mapper, Expression source);
+			Expression MapLists  (ExpressionMapper<TSource,TDest> mapper, Expression source);
+		}
+
+		class ConvertHelper<TS,TD> : IConvertHelper
+			where TS : class
+			where TD : class
+		{
+			static TD MapCrossReferences(
+				MappingContext        ctx,
+				TS                    source,
+				Func<TS,TD>           func,
+				Func<object,object>   getCurrent,
+				Action<object,object> setCurrent)
+			{
+				if (source == null)
+					return null;
+
+				object dest;
+				List<Action<object,object>> list;
+
+				if (ctx.Objects.TryGetValue(source, out dest))
+				{
+					if (dest == null)
+					{
+						if (ctx.Crosses == null)
+							ctx.Crosses = new Dictionary<object,List<Action<object,object>>>();
+
+						if (!ctx.Crosses.TryGetValue(source, out list))
+							ctx.Crosses[source] = list = new List<Action<object,object>>();
+
+						var getParent = ctx.GetParent;
+
+						Action<object,object> setter = (obj,value) => setCurrent(getParent(obj), value);
+
+						list.Add(setter);
+					}
+
+					return (TD)dest;
+				}
+
+				var currParent = ctx.GetParent;
+
+				ctx.GetParent = p => getCurrent(currParent(p));
+				ctx.Objects.Add(source, null);
+				ctx.Objects[source] = dest = func(source);
+				ctx.GetParent = currParent;
+
+				if (ctx.Crosses != null && ctx.Crosses.TryGetValue(source, out list))
+				{
+					if (ctx.CrossActions == null)
+						ctx.CrossActions = new List<Action<object>>();
+
+					foreach (var action in list)
+					{
+						var setValue = action;
+
+						Action<object> f = parent => setValue(parent, dest);
+						ctx.CrossActions.Add(f);
+					}
+
+					ctx.Crosses.Remove(source);
+				}
+
+				return (TD)dest;
+			}
+
+			static TD MapObjects(TS source, Func<TS,TD> func)
+			{
+				return source == null ? null : func(source);
+			}
+
+			public Expression MapObjects(ExpressionMapper<TSource,TDest> mapper, Expression source)
+			{
+				var param = mapper._getCurrent == null ? (ParameterExpression)source : Expression.Parameter(source.Type, "source");
+
+				Expression expr;
+				object     m;
+
+				if (mapper._parameters.MapperList.TryGetValue(new { S = typeof(TS), D = typeof(TD) }, out m))
+				{
+					var map = (Mapper<TS,TD>)m;
+
+					if (map.Map == null)
+					{
+						expr = Expression.Invoke(
+							Expression.PropertyOrField(Expression.Constant(map), "Map"),
+							source, mapper._parameters.MappingContext);
+					}
+					else
+					{
+						expr = Expression.Invoke(Expression.Constant(map.Map), source, mapper._parameters.MappingContext);
+					}
+				}
+				else
+				{
+					var exmap = new ExpressionMapper<TS,TD>(mapper._parameters);
+					expr = exmap.GetMemberInit(param);
+				}
+
+				if (mapper._getCurrent == null)
+					return expr;
+
+				if (!mapper.HandleBackReferences)
+				{
+					Expression<Func<object>> func = () => MapObjects((TS)null, null);
+					return Expression.Call((MethodInfo)ReflectionHelper.MemeberInfo(func), source, Expression.Lambda<Func<TS,TD>>(expr, param));
+				}
+				else
+				{
+					mapper._parameters.UseContext = true;
+
+					Expression<Func<object>> func = () => MapCrossReferences(null, null, null, null, null);
+
+					return Expression.Call(
+						(MethodInfo)ReflectionHelper.MemeberInfo(func),
+						mapper._parameters.MappingContext,
+						source,
+						Expression.Lambda<Func<TS,TD>>(expr, param),
+						Expression.Constant(mapper._getCurrent),
+						Expression.Constant(mapper._setCurrent));
+				}
+			}
+
+			interface IItemHelper
+			{
+				Expression MapLists(ExpressionMapper<TSource,TDest> mapper, Expression source);
+			}
+
+			interface IClassItemHelper
+			{
+				MethodInfo GetObjectArrayInfo();
+				MethodInfo GetObjectListInfo(bool isList);
+			}
+
+			class ClassItemHelper<TSourceItem,TDestItem> : IClassItemHelper
+				where TSourceItem : class
+				where TDestItem   : class
+			{
+				static TDestItem[] MapObjectArray(MappingContext ctx, IEnumerable<TSourceItem> source, Func<TSourceItem,TDestItem> itemMapper)
+				{
+					if (source == null)
+						return null;
+
+					if (source is ICollection)
+					{
+						var col  = (ICollection)source;
+						var dest = new TDestItem[col.Count];
+						var n    = 0;
+
+						foreach (var item in source)
+						{
+							var current = n;
+							dest[n++] = ConvertHelper<TSourceItem,TDestItem>.MapCrossReferences(
+								ctx, item, itemMapper,
+								_ => dest[current],
+								(_,v) => { dest[current] = (TDestItem)v; });
+						}
+
+						return dest;
+					}
+					else
+					{
+						TDestItem[] dest = null;
+
+						var list = new List<TDestItem>();
+						var n    = 0;
+
+						foreach (var item in source)
+						{
+							var current = n;
+							list.Add(null);
+							list[n++] = ConvertHelper<TSourceItem,TDestItem>.MapCrossReferences(
+								ctx, item, itemMapper,
+								_ => dest == null ? list[current] : dest[current],
+								(_,v) => { if (dest == null) list[current] = (TDestItem)v; else dest[current] = (TDestItem)v; });
+						}
+
+						return dest = list.ToArray();
+					}
+				}
+
+				[UsedImplicitly]
+				static TList MapObjectList<TList>(MappingContext ctx, IEnumerable<TSourceItem> source, Func<TSourceItem,TDestItem> itemMapper)
+					where TList : class, IList<TDestItem>, new()
+				{
+					if (source == null)
+						return null;
+
+					var n    = 0;
+					var dest = source is ICollection && typeof(TList) == typeof(List<TDestItem>) ?
+						(TList)(IList<TDestItem>)new List<TDestItem>(((ICollection)source).Count) : new TList();
+
+					foreach (var item in source)
+					{
+						var current = n;
+						dest.Add(null);
+						dest[n++] = ConvertHelper<TSourceItem,TDestItem>.MapCrossReferences(
+							ctx, item, itemMapper,
+							_ => dest[current],
+							(_,v) => { dest[current] = (TDestItem)v; });
+					}
+
+					return dest;
+				}
+
+				public MethodInfo GetObjectArrayInfo()
+				{
+					Expression<Func<object>> arrMapper = () => MapObjectArray(null, null, null);
+					return (MethodInfo)ReflectionHelper.MemeberInfo(arrMapper);
+				}
+
+				public MethodInfo GetObjectListInfo(bool isList)
+				{
+					var method = typeof(ClassItemHelper<TSourceItem,TDestItem>).GetMethod("MapObjectList", BindingFlags.NonPublic | BindingFlags.Static);
+					return method.MakeGenericMethod(isList ? typeof (List<TDestItem>) : typeof (TD));
+				}
+			}
+
+			class ItemHelper<TSourceItem,TDestItem> : IItemHelper
+			{
+				static TDestItem[] MapScalarArray(IEnumerable<TSourceItem> source, Func<TSourceItem,TDestItem> itemMapper)
+				{
+					if (source == null)
+						return null;
+
+					if (source is ICollection)
+					{
+						var col  = (ICollection)source;
+						var dest = new TDestItem[col.Count];
+						var n    = 0;
+
+						foreach (var item in source)
+							dest[n++] = itemMapper(item);
+
+						return dest;
+					}
+
+					return source.Select(itemMapper).ToArray();
+				}
+
+				[UsedImplicitly]
+				static TList MapScalarList<TList>(IEnumerable<TSourceItem> source, Func<TSourceItem,TDestItem> itemMapper)
+					where TList : class, IList<TDestItem>, new()
+				{
+					if (source == null)
+						return null;
+
+					var dest = new TList();
+					var list = dest as List<TDestItem>;
+
+					if (list != null)
+						list.AddRange(source.Select(itemMapper));
+					else
+						foreach (var item in source)
+							dest.Add(itemMapper(item));
+
+					return dest;
+				}
+
+				public Expression MapLists(ExpressionMapper<TSource,TDest> mapper, Expression source)
+				{
+					var itemMapper =
+						new ExpressionMapper<TSourceItem,TDestItem>(mapper._parameters);
+
+					var itemParam = Expression.Parameter(typeof(TSourceItem), "item");
+					var itemExpr  = itemMapper.GetValueMapper(
+						itemParam,
+						typeof(TDestItem),
+						true,
+						mapper._parameters.MappingSchema.GetNullValue   (typeof(TDestItem)),
+						mapper._parameters.MappingSchema.GetMapValues   (typeof(TDestItem)),
+						mapper._parameters.MappingSchema.GetDefaultValue(typeof(TDestItem)),
+						mapper._parameters.MappingSchema.GetMapValues   (typeof(TSourceItem)));
+
+					var itemLambda = Expression.Lambda<Func<TSourceItem,TDestItem>>(itemExpr, itemParam);
+
+					var isSourceScalar = !typeof(TSourceItem).IsArray && TypeHelper.IsScalar(typeof(TSourceItem));
+					var isDestScalar   = !typeof(TDestItem).  IsArray && TypeHelper.IsScalar(typeof(TDestItem));
+
+					if (!mapper.HandleBackReferences || isSourceScalar || isDestScalar)
+					{
+						if (typeof (TD).IsArray)
+						{
+							Expression<Func<object>> arrMapper = () => MapScalarArray(null, null);
+							return Expression.Call((MethodInfo)ReflectionHelper.MemeberInfo(arrMapper), source, itemLambda);
+						}
+
+						var isList =
+							typeof (TD) == typeof (IEnumerable<TDestItem>) || typeof (TD) == typeof (ICollection<TDestItem>) ||
+							typeof (TD) == typeof (IList<TDestItem>)       || typeof (TD) == typeof (List<TDestItem>);
+
+						var method = typeof (ItemHelper<TSourceItem, TDestItem>).GetMethod("MapScalarList", BindingFlags.NonPublic | BindingFlags.Static);
+
+						method = method.MakeGenericMethod(isList ? typeof (List<TDestItem>) : typeof (TD));
+
+						return Expression.Call(method, source, itemLambda);
+					}
+					else
+					{
+						mapper._parameters.UseContext = true;
+
+						var type = typeof (ClassItemHelper<,>).MakeGenericType(
+							typeof (TSource), typeof (TDest),
+							typeof (TS), typeof (TD),
+							typeof (TSourceItem), typeof (TDestItem));
+
+						var helper = ((IClassItemHelper)Activator.CreateInstance(type));
+
+						if (typeof (TD).IsArray)
+							return Expression.Call(helper.GetObjectArrayInfo(), mapper._parameters.MappingContext, source, itemLambda);
+
+						var isList =
+							typeof (TD) == typeof (IEnumerable<TDestItem>) || typeof (TD) == typeof (ICollection<TDestItem>) ||
+							typeof (TD) == typeof (IList<TDestItem>) || typeof (TD) == typeof (List<TDestItem>);
+
+						return Expression.Call(helper.GetObjectListInfo(isList), mapper._parameters.MappingContext, source, itemLambda);
+					}
+				}
+			}
+
+			public Expression MapLists(ExpressionMapper<TSource,TDest> mapper, Expression source)
+			{
+				var ts = TypeHelper.GetGenericType(typeof(IEnumerable<>), typeof(TS)).GetGenericArguments()[0];
+				var td = TypeHelper.GetGenericType(typeof(IEnumerable<>), typeof(TD)).GetGenericArguments()[0];
+
+				var type = typeof(ItemHelper<,>).MakeGenericType(typeof(TSource), typeof(TDest), typeof(TS), typeof(TD), ts, td);
+				return ((IItemHelper)Activator.CreateInstance(type)).MapLists(mapper, source);
+			}
+		}
+
+		static IConvertHelper GetHelper(Type stype, Type dtype)
+		{
+			var type = typeof(ConvertHelper<,>).MakeGenericType(typeof(TSource), typeof(TDest), stype, dtype);
+			return ((IConvertHelper)Activator.CreateInstance(type));
+		}
+
+		#endregion
+
+		Expression GetValueMapper(
+			Expression source,
+			Type       dtype,
+			bool       checkNull,
+			object     nullValue,
+			MapValue[] destMapValues,
+			object     defaultValue,
+			MapValue[] srcMapValues)
+		{
+			var stype = source.Type;
+
+			var isSourceScalar = !stype.IsArray && TypeHelper.IsScalar(stype);
+			var isDestScalar   = !dtype.IsArray && TypeHelper.IsScalar(dtype);
+
+			if (dtype == typeof(object) || dtype == stype && (!DeepCopy || isSourceScalar))
+				return source;
+
+			var isSourceNullable = TypeHelper.IsNullableType(stype) || stype.IsClass;
+
+			if (checkNull && isSourceNullable && !TypeHelper.IsNullableType(dtype) && (isDestScalar || isSourceScalar))
+				return GetValueHelper(stype, dtype).CheckNull(this, source, nullValue, destMapValues, defaultValue, srcMapValues);
+
+			if (srcMapValues != null)
+				return GetValueHelper(stype, dtype).SourceMapValues(this, source, nullValue, defaultValue, srcMapValues);
+
+			if (destMapValues != null)
+				return GetValueHelper(stype, dtype).DestMapValues(this, source, nullValue, destMapValues, defaultValue);
+
+			if (dtype == typeof (string))
+				return
+					isSourceNullable
+						?
+							Expression.Condition(
+								Expression.Equal(source, Expression.Constant(null)),
+								Expression.Constant(null),
+								Expression.Call(source, "ToString", Array<Type>.Empty)) as Expression
+						:
+							Expression.Call(source, "ToString", Array<Type>.Empty);
+
+			if (!isDestScalar && !isSourceScalar)
+			{
+				if (TypeHelper.GetGenericType(typeof(IEnumerable<>), dtype) != null &&
+				    TypeHelper.GetGenericType(typeof(IEnumerable<>), stype) != null)
+					return GetHelper(stype, dtype).MapLists(this, source);
+
+				return GetHelper(stype, dtype).MapObjects(this, source);
+			}
+
+			try
+			{
+				return Expression.Convert(source, dtype);
+			}
+			catch (InvalidOperationException)
+			{
+			}
+
+			return GetValueHelper(stype, dtype).GetConverter(source);
+		}
+
+		IEnumerable<MemberBinding> GetBindings(Expression source)
+		{
+			var dest = _parameters.MappingSchema.GetObjectMapper(typeof(TDest));
+			var src  = _parameters.MappingSchema.GetObjectMapper(typeof(TSource));
+
+			foreach (MemberMapper dmm in dest)
+			{
+				if (!IncludeComplexMapping && dmm is MemberMapper.ComplexMapper)
+					continue;
+
+				var dma = dmm.MemberAccessor;
+
+				if (!dma.HasSetter)
+					continue;
+
+				var attr = dma.GetAttribute<ExpressionMapIgnoreAttribute>();
+
+				if (attr != null && attr.Ignore)
+					continue;
+
+				var smm = src[dmm.Name];
+
+				if (smm == null)
+					continue;
+
+				if (!IncludeComplexMapping && smm is MemberMapper.ComplexMapper)
+					continue;
+
+				var sma = smm.MemberAccessor;
+
+				if (!sma.HasGetter)
+					continue;
+
+				attr = sma.GetAttribute<ExpressionMapIgnoreAttribute>();
+
+				if (attr != null && attr.Ignore)
+					continue;
+
+				_getCurrent = dma.GetValue;
+				_setCurrent = dma.SetValue;
+
+				var bind = Expression.Bind(
+					dma.MemberInfo,
+					GetValueMapper(
+						Expression.PropertyOrField(source, sma.Name),
+						dma.Type,
+						true,
+						dmm.MapMemberInfo.NullValue,
+						dmm.MapMemberInfo.MapValues,
+						dmm.MapMemberInfo.DefaultValue,
+						smm.MapMemberInfo.MapValues));
+
+				yield return bind;
+			}
+
+			var destMembers = from m in ((IEnumerable<MemberAccessor>)dest.TypeAccessor) select m;
+
+			destMembers = destMembers.Except(dest.Select(mm => mm.MemberAccessor)).ToList();
+
+			var srcMembers =
+				(from m in ((IEnumerable<MemberAccessor>)src.TypeAccessor) select m)
+				.Except(src.Select(mm => mm.MemberAccessor))
+				.ToList();
+
+			foreach (var dma in destMembers)
+			{
+				if (!dma.HasSetter)
+					continue;
+
+				var sma = srcMembers.FirstOrDefault(mi => mi.Name == dma.Name);
+
+				if (sma == null || !sma.HasGetter)
+					continue;
+
+				_getCurrent = dma.GetValue;
+				_setCurrent = dma.SetValue;
+
+				var bind = Expression.Bind(
+					dma.MemberInfo,
+					GetValueMapper(
+						Expression.MakeMemberAccess(source, sma.MemberInfo),
+						dma.Type,
+						true,
+						_parameters.MappingSchema.GetNullValue   (dma.Type),
+						_parameters.MappingSchema.GetMapValues   (dma.Type),
+						_parameters.MappingSchema.GetDefaultValue(dma.Type),
+						_parameters.MappingSchema.GetMapValues   (sma.Type)));
+
+				yield return bind;
+			}
+		}
+
+		Expression GetMemberInit(ParameterExpression source)
+		{
+			var mapper = new Mapper<TSource,TDest>();
+
+			_parameters.MapperList.Add(new { S = typeof(TSource), D = typeof(TDest) }, mapper);
+
+			var dest = TypeAccessor<TDest>.Instance;
+			var expr = Expression.MemberInit(Expression.New(dest.Type), GetBindings(source));
+
+			mapper.Map = Expression.Lambda<Func<TSource,MappingContext,TDest>>(expr, source, _parameters.MappingContext).Compile();
+
+			return expr;
+		}
+
+		interface IAbstractHelper
+		{
+			Func<TSource,TDest> GetMapper(MappingParameters ps);
+		}
+
+		class AbstractHelper<TS,TD> : IAbstractHelper
+		{
+			public Func<TSource,TDest> GetMapper(MappingParameters ps)
+			{
+				var em     = new ExpressionMapper<TS,TD>(ps);
+				var mapper = em.GetMapper();
+
+				return source => (TDest)(object)mapper((TS)(object)source);
+			}
+		}
+
+		public Func<TSource,TDest> GetMapper()
+		{
+			if (typeof(TSource) == typeof(TDest) && !DeepCopy)
+				return s => (TDest)(object)s;
+
+			if (TypeHelper.IsAbstractClass(typeof(TSource)) || TypeHelper.IsAbstractClass(typeof(TDest)))
+			{
+				var st = TypeHelper.IsAbstractClass(typeof(TSource)) ? TypeAccessor<TSource>.Instance.Type : typeof(TSource);
+				var dt = TypeHelper.IsAbstractClass(typeof(TDest))   ? TypeAccessor<TDest>.  Instance.Type : typeof(TDest);
+
+				var type = typeof(AbstractHelper<,>).MakeGenericType(typeof(TSource), typeof(TDest), st, dt);
+				return ((IAbstractHelper)Activator.CreateInstance(type)).GetMapper(_parameters);
+			}
+
+			var parm = Expression.Parameter(typeof(TSource), "src");
+			var expr = GetValueMapper(
+				parm,
+				typeof(TDest),
+				true,
+				_parameters.MappingSchema.GetNullValue   (typeof(TDest)),
+				_parameters.MappingSchema.GetMapValues   (typeof(TDest)),
+				_parameters.MappingSchema.GetDefaultValue(typeof(TDest)),
+				_parameters.MappingSchema.GetMapValues   (typeof(TSource)));
+
+			if (_parameters.ContextParameterUsed)
+			{
+				var l = Expression.Lambda<Func<TSource,MappingContext,TDest>>(expr, parm, _parameters.MappingContext);
+				var f = l.Compile();
+
+				if (!_parameters.UseContext)
+					return s => f(s, null);
+
+				return s =>
+				{
+					var ctx  = new MappingContext
+					{
+						Objects   = new Dictionary<object,object>(10) { { s, null } },
+						GetParent = p => p,
+					};
+
+					var dest = f(s, ctx);
+
+					if (ctx.CrossActions != null)
+						foreach (var circle in ctx.CrossActions)
+							circle(dest);
+
+					if (ctx.Crosses != null)
+					{
+						List<Action<object,object>> list;
+
+						if (ctx.Crosses.TryGetValue(s, out list))
+							foreach (var action in list)
+								action(dest, dest);
+					}
+
+					return dest;
+				};
+			}
+
+			var lambda = Expression.Lambda<Func<TSource,TDest>>(expr, parm);
+
+			return lambda.Compile();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/Fluent/AssociationMap.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,37 @@
+using System;
+using System.Collections.Generic;
+using System.Linq.Expressions;
+
+namespace BLToolkit.Mapping.Fluent
+{
+	public partial class MapFieldMap<T, TR>
+	{
+		public class AssociationMap<TRt>
+		{
+			private readonly MapFieldMap<T, TR> _owner;
+			private readonly bool _canBeNull;
+			private readonly List<Expression<Func<T, TRt>>> _thisKeys;
+
+			public AssociationMap(MapFieldMap<T, TR> owner, bool canBeNull, List<Expression<Func<T, TRt>>> thisKeys)
+			{
+				this._owner = owner;
+				this._canBeNull = canBeNull;
+				this._thisKeys = thisKeys;
+			}
+
+			public MapFieldMap<T, TR> ToMany<TRf, TRo>(Expression<Func<TRf, TRo>> otherKey, params Expression<Func<TRf, TRo>>[] otherKeys)
+			{
+                var keys = new List<Expression<Func<TRf, TRo>>>(otherKeys);
+				keys.Insert(0, otherKey);
+				return this._owner.Association(this._canBeNull, this._thisKeys, keys);
+			}
+
+			public MapFieldMap<T, TR> ToOne<TRo>(Expression<Func<TR, TRo>> otherKey, params Expression<Func<TR, TRo>>[] otherKeys)
+			{
+				var keys = new List<Expression<Func<TR, TRo>>>(otherKeys);
+				keys.Insert(0, otherKey);
+				return this._owner.Association(this._canBeNull, this._thisKeys, keys);
+			}
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/Fluent/Attributes.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,107 @@
+namespace BLToolkit.Mapping.Fluent
+{
+    /// <summary>
+    /// Used Attribute Names
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    public partial class FluentMap<T>
+    {
+        protected static class Attributes
+        {
+            public static class TableName
+            {
+                public const string Name = "TableName";
+
+                public const string Database = "DatabaseName";
+
+                public const string Owner = "OwnerName";
+            }
+
+            public static class MapField
+            {
+                public const string Name = "MapField";
+
+                public const string Storage = "FieldStorage";
+
+                public const string IsInheritanceDiscriminator = "IsInheritanceDiscriminator";
+
+                public const string OrigName = "OrigName";
+
+                public const string MapName = "MapName";
+            }
+
+            public static class PrimaryKey
+            {
+                public const string Order = "PrimaryKey";
+            }
+
+            public static class SqlIgnore
+            {
+                public const string Ignore = "SqlIgnore";
+            }
+
+            public static class MapIgnore
+            {
+                public const string Ignore = "MapIgnore";
+            }
+
+            public static class MapValue
+            {
+                public const string Name = "MapValue";
+
+                public const string OrigValue = "OrigValue";
+            }
+
+            public static class Nullable
+            {
+                public const string IsNullable = "Nullable";
+            }
+
+            public static class LazyInstance
+            {
+                public const string IsLazyInstance = "LazyInstance";
+            }
+
+            public static class InheritanceMapping
+            {
+                public const string Name = "InheritanceMapping";
+
+                public const string Code = "Code";
+
+                public const string IsDefault = "IsDefault";
+
+                public const string Type = "Type";
+            }
+
+            public static class Association
+            {
+                public const string ThisKey = "ThisKey";
+
+                public const string OtherKey = "OtherKey";
+
+                public const string Storage = "Storage";
+            }
+
+            public const string NonUpdatable = "NonUpdatable";
+
+            public const string Identity = "Identity";
+
+            public const string Trimmable = "Trimmable";
+
+            public const string DefaultValue = "DefaultValue";
+
+            public const string DbType = "DbType";
+
+            public static class MemberMapper
+            {
+                public const string Name = "MemberMapper";
+
+                public const string MemberType = "MemberType";
+
+                public const string MemberMapperType = "MemberMapperType";
+            }
+
+            public const string NullValue = "NullValue";
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/Fluent/FluentConfig.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,133 @@
+using System;
+using System.CodeDom;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Reflection.Extension;
+
+namespace BLToolkit.Mapping.Fluent
+{
+	/// <summary>
+	/// Configure BLToolkit in fluent style
+	/// </summary>
+	public static class FluentConfig
+	{
+		private static Dictionary<Assembly, ExtensionList> _hash = new Dictionary<Assembly, ExtensionList>();
+
+		/// <summary>
+		/// Configure DbManager
+		/// </summary>
+		/// <param name="dbManager"></param>
+		public static MappingConfigurator Configure(DbManager dbManager)
+		{
+			MappingSchema mappingSchema = dbManager.MappingSchema ?? (dbManager.MappingSchema = Map.DefaultSchema);
+			return Configure(mappingSchema);
+		}
+
+		/// <summary>
+		/// Configure DataProvider
+		/// </summary>
+		/// <param name="dataProvider"></param>
+		public static MappingConfigurator Configure(DataProviderBase dataProvider)
+		{
+			MappingSchema mappingSchema = dataProvider.MappingSchema ?? (dataProvider.MappingSchema = Map.DefaultSchema);
+			return Configure(mappingSchema);
+		}
+
+		/// <summary>
+		/// Configure MappingSchema
+		/// </summary>
+		/// <param name="mappingSchema"></param>
+		public static MappingConfigurator Configure(MappingSchema mappingSchema)
+		{
+			ExtensionList extensionList = mappingSchema.Extensions ?? (mappingSchema.Extensions = new ExtensionList());
+			return Configure(extensionList);
+		}
+
+		/// <summary>
+		/// Configure ExtensionList
+		/// </summary>
+		/// <param name="extensionList"></param>
+		public static MappingConfigurator Configure(ExtensionList extensionList)
+		{
+			return new MappingConfigurator(extensionList);
+		}
+
+		public class MappingConfigurator
+		{
+			private ExtensionList _extensions;
+
+			public MappingConfigurator(ExtensionList extensions)
+			{
+				this._extensions = extensions;
+			}
+
+            /// <summary>
+            /// Mapping IFluentMap-Type
+            /// </summary>
+            /// <typeparam name="T"></typeparam>
+            /// <returns></returns>
+            public void MapingFromType<T>() where T : IFluentMap
+            {
+                MapingFromType(typeof(T));                
+            }
+
+            public void MapingFromType(Type T)
+            {
+                var res = new ExtensionList();
+                var map = (IFluentMap)Activator.CreateInstance(T);
+
+                map.MapTo(res);
+
+                FluentMapHelper.MergeExtensions(res, ref this._extensions);
+            }
+			/// <summary>
+			/// Mapping from assembly contains type
+			/// </summary>
+			/// <typeparam name="T"></typeparam>
+			/// <returns></returns>
+			public void MapingFromAssemblyOf<T>()
+			{
+				this.MapingFromAssembly(typeof(T).Assembly);
+			}
+		    
+		    /// <summary>
+			/// Mapping from assembly
+			/// </summary>
+			/// <param name="assembly"></param>
+			/// <returns></returns>
+			public void MapingFromAssembly(Assembly assembly)
+			{
+				ExtensionList res;
+				if (!_hash.TryGetValue(assembly, out res))
+				{
+					res = new ExtensionList();
+					_hash.Add(assembly, res);
+
+					string fluentType = typeof(IFluentMap).FullName;
+					var mapTypes = from type in assembly.GetTypes()
+							   where type.IsClass && !type.IsAbstract && !type.IsGenericType
+									 && (null != type.GetInterface(fluentType)) // Is IFluentMap
+									 && (null != type.GetConstructor(new Type[0])) // Is defaut ctor
+							   select type;
+                    foreach (var fluentMapType in mapTypes)
+					{
+                        MapingFromType(fluentMapType);
+					}
+				}
+				//FluentMapHelper.MergeExtensions(res, ref this._extensions);
+            }
+
+            #region Conventions
+
+            public static Func<Type, string> GetTableName;
+            public static Func<MappedProperty, string> GetColumnName;                          
+            //public static Func<MappedProperty, MappedProperty, string> GetManyToManyTableName;
+            
+            #endregion
+		}        
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/Fluent/FluentMap.Interface.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,348 @@
+using System;
+using System.Collections;
+using System.Data;
+using System.Linq;
+
+using BLToolkit.Reflection;
+using BLToolkit.Reflection.Extension;
+
+namespace BLToolkit.Mapping.Fluent
+{
+	public partial class FluentMap<T> : IFluentMap
+	{
+		/// <summary>
+		/// Get mapping
+		/// </summary>
+		/// <returns></returns>
+		ExtensionList IFluentMap.Map()
+		{
+			return this.Map();
+		}
+
+		/// <summary>
+		/// TableNameAttribute
+		/// </summary>
+		/// <param name="database"></param>
+		/// <param name="owner"></param>
+		/// <param name="name"></param>
+		/// <returns></returns>
+		void IFluentMap.TableName(string database, string owner, string name)
+		{
+			if (null != database)
+			{
+				this._typeExtension.Attributes.Add(Attributes.TableName.Database, database);
+			}
+			if (null != owner)
+			{
+				this._typeExtension.Attributes.Add(Attributes.TableName.Owner, owner);
+			}
+			if (null != name)
+			{
+				this._typeExtension.Attributes.Add(Attributes.TableName.Name, name);
+			}
+			this.EachChilds(m => m.TableName(database, owner, name));
+		}
+
+		/// <summary>
+		/// Map to ExtensionList
+		/// </summary>
+		/// <param name="extensions"></param>
+		void IFluentMap.MapTo(ExtensionList extensions)
+		{
+			this.MapTo(extensions);
+		}
+
+		/// <summary>
+		/// Maps the field.
+		/// </summary>
+		/// <param name="propName">Name of the prop.</param>
+		/// <param name="mapName">Name of the map.</param>
+		/// <param name="storage">The storage.</param>
+		/// <param name="isInheritanceDiscriminator">The is inheritance discriminator.</param>
+		/// <returns></returns>
+		void IFluentMap.MapField(string propName, string mapName, string storage, bool? isInheritanceDiscriminator)
+		{
+			if (propName.Contains(MemberNameSeparator))
+			{
+				this.MapFieldOnType(propName, mapName);
+			}
+			else
+			{
+				this.MapFieldOnField(propName, mapName, storage, isInheritanceDiscriminator);
+			}
+			this.EachChilds(m => m.MapField(propName, mapName, storage, isInheritanceDiscriminator));
+		}
+
+		/// <summary>
+		/// Primaries the key.
+		/// </summary>
+		/// <param name="propName">Name of the prop.</param>
+		/// <param name="order">The order.</param>
+		void IFluentMap.PrimaryKey(string propName, int order)
+		{
+			var member = this.GetMemberExtension(propName);
+			member.Attributes.Add(Attributes.PrimaryKey.Order, Convert.ToString(order));
+			this.EachChilds(m => m.PrimaryKey(propName, order));
+		}
+
+		/// <summary>
+		/// Nons the updatable.
+		/// </summary>
+		/// <param name="propName">Name of the prop.</param>
+		void IFluentMap.NonUpdatable(string propName)
+		{
+			var member = this.GetMemberExtension(propName);
+			member.Attributes.Add(Attributes.NonUpdatable, this.ToString(true));
+			this.EachChilds(m => m.NonUpdatable(propName));
+		}
+
+		/// <summary>
+		/// Identities the specified prop name.
+		/// </summary>
+		/// <param name="propName">Name of the prop.</param>
+		void IFluentMap.Identity(string propName)
+		{
+			var member = this.GetMemberExtension(propName);
+			member.Attributes.Add(Attributes.Identity, this.ToString(true));
+			this.EachChilds(m => m.Identity(propName));
+		}
+
+		/// <summary>
+		/// SQLs the ignore.
+		/// </summary>
+		/// <param name="propName">Name of the prop.</param>
+		/// <param name="ignore">if set to <c>true</c> [ignore].</param>
+		void IFluentMap.SqlIgnore(string propName, bool ignore)
+		{
+			var member = this.GetMemberExtension(propName);
+			member.Attributes.Add(Attributes.SqlIgnore.Ignore, this.ToString(ignore));
+			this.EachChilds(m => m.SqlIgnore(propName, ignore));
+		}
+
+		/// <summary>
+		/// Maps the ignore.
+		/// </summary>
+		/// <param name="propName">Name of the prop.</param>
+		/// <param name="ignore">if set to <c>true</c> [ignore].</param>
+		void IFluentMap.MapIgnore(string propName, bool ignore)
+		{
+			var member = this.GetMemberExtension(propName);
+			member.Attributes.Add(Attributes.MapIgnore.Ignore, this.ToString(ignore));
+			this.EachChilds(m => m.MapIgnore(propName, ignore));
+		}
+
+		/// <summary>
+		/// Trimmables the specified prop name.
+		/// </summary>
+		/// <param name="propName">Name of the prop.</param>
+		void IFluentMap.Trimmable(string propName)
+		{
+			var member = this.GetMemberExtension(propName);
+			member.Attributes.Add(Attributes.Trimmable, this.ToString(true));
+			this.EachChilds(m => m.Trimmable(propName));
+		}
+
+		/// <summary>
+		/// Maps the value.
+		/// </summary>
+		/// <typeparam name="TR">The type of the R.</typeparam>
+		/// <typeparam name="TV">The type of the V.</typeparam>
+		/// <param name="propName">Name of the prop.</param>
+		/// <param name="origValue">The orig value.</param>
+		/// <param name="value">The value.</param>
+		/// <param name="values">The values.</param>
+		void IFluentMap.MapValue<TR, TV>(string propName, TR origValue, TV value, TV[] values)
+		{
+			var member = this.GetMemberExtension(propName);
+			this.FillMapValueExtension(member.Attributes, origValue, value, values);
+			this.EachChilds(m => m.MapValue(propName, origValue, value, values));
+		}
+
+		/// <summary>
+		/// Maps the value.
+		/// </summary>
+		/// <typeparam name="TV">The type of the V.</typeparam>
+		/// <param name="origValue">The orig value.</param>
+		/// <param name="value">The value.</param>
+		/// <param name="values">The values.</param>
+		void IFluentMap.MapValue<TV>(Enum origValue, TV value, TV[] values)
+		{
+			MemberExtension member;
+			var name = Enum.GetName(origValue.GetType(), origValue);
+			if (!this._typeExtension.Members.TryGetValue(name, out member))
+			{
+				member = new MemberExtension { Name = name };
+				this._typeExtension.Members.Add(member);
+			}
+			this.FillMapValueExtension(member.Attributes, origValue, value, values);
+			this.EachChilds(m => m.MapValue(origValue, value, values));
+		}
+
+		/// <summary>
+		/// Maps the value.
+		/// </summary>
+		/// <typeparam name="TV">The type of the V.</typeparam>
+		/// <param name="origValue">The orig value.</param>
+		/// <param name="value">The value.</param>
+		/// <param name="values">The values.</param>
+		void IFluentMap.MapValue<TV>(object origValue, TV value, TV[] values)
+		{
+			this.FillMapValueExtension(this._typeExtension.Attributes, origValue, value, values);
+			this.EachChilds(m => m.MapValue(origValue, value, values));
+		}
+
+		/// <summary>
+		/// Defauls the value.
+		/// </summary>
+		/// <typeparam name="TR">The type of the R.</typeparam>
+		/// <param name="propName">Name of the prop.</param>
+		/// <param name="value">The value.</param>
+		void IFluentMap.DefaulValue<TR>(string propName, TR value)
+		{
+			var member = this.GetMemberExtension(propName);
+			member.Attributes.Add(Attributes.DefaultValue, Convert.ToString(value));
+			this.EachChilds(m => m.DefaulValue(propName, value));
+		}
+
+        /// <summary>
+        /// DB-Type of the value.
+        /// </summary>
+        /// <typeparam name="TR">The type of the R.</typeparam>
+        /// <param name="propName">Name of the prop.</param>
+        /// <param name="dbType">The value.</param>
+        void IFluentMap.DbType<TR>(string propName, DbType dbType)
+        {
+            var member = this.GetMemberExtension(propName);
+            member.Attributes.Add(Attributes.DbType, Convert.ToString(dbType));
+            this.EachChilds(m => m.DefaulValue(propName, dbType));
+        }
+
+        /// <summary>
+        /// MemberMapper
+		/// </summary>
+		/// <typeparam name="TR">The type of the R.</typeparam>
+		/// <param name="propName">Name of the prop.</param>
+		/// <param name="value">The value.</param>
+        void IFluentMap.MemberMapper<TR>(string propName, Type memberType, Type memberMapperType)
+		{
+            var member = this.GetMemberExtension(propName);
+            this.FillMemberMapperExtension(member.Attributes, memberType, memberMapperType);
+            this.EachChilds(m => m.MemberMapper<TR>(propName, memberType, memberMapperType));
+		}
+        
+		/// <summary>
+		/// Nullables the specified prop name.
+		/// </summary>
+		/// <param name="propName">Name of the prop.</param>
+		/// <param name="isNullable">if set to <c>true</c> [is nullable].</param>
+		void IFluentMap.Nullable(string propName, bool isNullable)
+		{
+			var member = this.GetMemberExtension(propName);
+			member.Attributes.Add(Attributes.Nullable.IsNullable, this.ToString(isNullable));
+			this.EachChilds(m => m.Nullable(propName, isNullable));
+		}
+
+        void IFluentMap.LazyInstance(string propName, bool isLazy)
+		{
+			var member = this.GetMemberExtension(propName);
+			member.Attributes.Add(Attributes.LazyInstance.IsLazyInstance, this.ToString(isLazy));
+            this.EachChilds(m => m.LazyInstance(propName, isLazy));
+		}
+        
+		/// <summary>
+		/// Nulls the value.
+		/// </summary>
+		/// <typeparam name="TR">The type of the R.</typeparam>
+		/// <param name="propName">Name of the prop.</param>
+		/// <param name="value">The value.</param>
+		void IFluentMap.NullValue<TR>(string propName, TR value)
+		{
+			var member = this.GetMemberExtension(propName);
+			member.Attributes.Add(Attributes.NullValue, Equals(value, null) ? null : Convert.ToString(value));
+			this.EachChilds(m => m.NullValue(propName, value));
+		}
+
+		/// <summary>
+		/// Associations the specified prop name.
+		/// </summary>
+		/// <param name="propName">Name of the prop.</param>
+		/// <param name="canBeNull">if set to <c>true</c> [can be null].</param>
+		/// <param name="thisKeys">The this keys.</param>
+		/// <param name="otherKeys">The other keys.</param>
+		void IFluentMap.Association(string propName, bool canBeNull, string thisKeys, string otherKeys)
+		{
+			var member = this.GetMemberExtension(propName);
+			AttributeExtensionCollection attrs;
+			if (!member.Attributes.TryGetValue(TypeExtension.NodeName.Association, out attrs))
+			{
+				attrs = new AttributeExtensionCollection();
+				member.Attributes.Add(TypeExtension.NodeName.Association, attrs);
+			}
+			attrs.Clear();
+			var attributeExtension = new AttributeExtension();
+			attributeExtension.Values.Add(Attributes.Association.ThisKey, thisKeys);
+			attributeExtension.Values.Add(Attributes.Association.OtherKey, otherKeys);
+			attributeExtension.Values.Add(Attributes.Association.Storage, this.ToString(canBeNull));
+			attrs.Add(attributeExtension);
+			this.EachChilds(m => m.Association(propName, canBeNull, thisKeys, otherKeys));
+		}
+
+		/// <summary>
+		/// Relations the specified prop name.
+		/// </summary>
+		/// <param name="propName">Name of the prop.</param>
+		/// <param name="destinationType">Type of the destination.</param>
+		/// <param name="slaveIndex">Index of the slave.</param>
+		/// <param name="masterIndex">Index of the master.</param>
+		void IFluentMap.Relation(string propName, Type destinationType, string[] slaveIndex, string[] masterIndex)
+		{
+			if (TypeHelper.IsSameOrParent(typeof(IEnumerable), destinationType))
+			{
+				destinationType = destinationType.GetGenericArguments().Single();
+			}
+			var member = this.GetMemberExtension(propName);
+			AttributeExtensionCollection attrs;
+			if (!member.Attributes.TryGetValue(TypeExtension.NodeName.Relation, out attrs))
+			{
+				attrs = new AttributeExtensionCollection();
+				member.Attributes.Add(TypeExtension.NodeName.Relation, attrs);
+			}
+			attrs.Clear();
+			var attributeExtension = new AttributeExtension();
+			attributeExtension.Values.Add(TypeExtension.AttrName.DestinationType, destinationType.AssemblyQualifiedName);
+			attrs.Add(attributeExtension);
+
+			FillRelationIndex(slaveIndex, attributeExtension, TypeExtension.NodeName.SlaveIndex);
+			FillRelationIndex(masterIndex, attributeExtension, TypeExtension.NodeName.MasterIndex);
+			this.EachChilds(m => m.Relation(propName, destinationType, slaveIndex, masterIndex));
+		}
+
+		/// <summary>
+		/// Inheritances the mapping.
+		/// </summary>
+		/// <param name="type">The type.</param>
+		/// <param name="code">The code.</param>
+		/// <param name="isDefault">The is default.</param>
+		void IFluentMap.InheritanceMapping(Type type, object code, bool? isDefault)
+		{
+			AttributeExtensionCollection extList;
+			if (!this._typeExtension.Attributes.TryGetValue(Attributes.InheritanceMapping.Name, out extList))
+			{
+				extList = new AttributeExtensionCollection();
+				this._typeExtension.Attributes.Add(Attributes.InheritanceMapping.Name, extList);
+			}
+			var attr = new AttributeExtension();
+			attr.Values.Add(Attributes.InheritanceMapping.Type, type.AssemblyQualifiedName);
+			if (null != code)
+			{
+				attr.Values.Add(Attributes.InheritanceMapping.Code, code);
+			}
+			if (null != isDefault)
+			{
+				attr.Values.Add(Attributes.InheritanceMapping.IsDefault, isDefault.Value);
+			}
+			extList.Add(attr);
+			this.EachChilds(m => m.InheritanceMapping(type,code,isDefault));
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/Fluent/FluentMap.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,686 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Reflection.Extension;
+
+namespace BLToolkit.Mapping.Fluent
+{
+	/// <summary>
+	/// FluentSettings
+	/// </summary>
+	/// <typeparam name="T"></typeparam>
+	public partial class FluentMap<T>
+	{
+		private readonly TypeExtension _typeExtension;
+		private List<IFluentMap> _childs;
+		private const string MemberNameSeparator = ".";
+
+		/// <summary>
+		/// ctor
+		/// </summary>
+		public FluentMap()
+			: this(new TypeExtension { Name = typeof(T).FullName }, null)
+		{ }
+
+		/// <summary>
+		/// ctor
+		/// </summary>
+		/// <param name="typeExtension"></param>
+		/// <param name="childs"></param>
+		protected FluentMap(TypeExtension typeExtension, List<IFluentMap> childs)
+		{
+			this._typeExtension = typeExtension;
+			this._childs = childs;
+
+            if (FluentConfig.MappingConfigurator.GetTableName != null)
+            {
+                this.TableName(null, null, FluentConfig.MappingConfigurator.GetTableName(typeof(T)));
+            }
+		}
+
+		/// <summary>
+		/// TableNameAttribute
+		/// </summary>
+		/// <param name="name"></param>
+		/// <returns></returns>
+		public FluentMap<T> TableName(string name)
+		{
+			return this.TableName(null, null, name);
+		}
+
+		/// <summary>
+		/// TableNameAttribute
+		/// </summary>
+		/// <param name="database"></param>
+		/// <param name="name"></param>
+		/// <returns></returns>
+		public FluentMap<T> TableName(string database, string name)
+		{
+			return this.TableName(database, null, name);
+		}
+
+		/// <summary>
+		/// TableNameAttribute
+		/// </summary>
+		/// <param name="database"></param>
+		/// <param name="owner"></param>
+		/// <param name="name"></param>
+		/// <returns></returns>
+		public FluentMap<T> TableName(string database, string owner, string name)
+		{
+			((IFluentMap)this).TableName(database, owner, name);
+			return this;
+		}
+
+		/// <summary>
+		/// MapFieldAttribute
+		/// </summary>
+		/// <typeparam name="TR"></typeparam>
+		/// <param name="prop"></param>
+		/// <param name="isInheritanceDiscriminator"></param>
+		/// <returns></returns>
+		public MapFieldMap<T,TR> MapField<TR>(Expression<Func<T, TR>> prop, bool isInheritanceDiscriminator)
+		{
+			return this.MapField(prop, null, null, isInheritanceDiscriminator);
+		}
+
+		/// <summary>
+		/// MapFieldAttribute
+		/// </summary>
+		/// <typeparam name="TR"></typeparam>
+		/// <param name="prop"></param>
+		/// <param name="mapName"></param>
+		/// <param name="storage"></param>
+		/// <param name="isInheritanceDiscriminator"></param>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> MapField<TR>(Expression<Func<T, TR>> prop, string mapName = null, string storage = null, bool? isInheritanceDiscriminator = null)
+		{
+			string name = this.GetExprName(prop);
+
+			if (mapName == null && FluentConfig.MappingConfigurator.GetColumnName != null)
+			{
+				mapName = FluentConfig.MappingConfigurator.GetColumnName(new MappedProperty { Name = name, Type = typeof(TR), ParentType = typeof(T) });
+			}
+
+			((IFluentMap)this).MapField(name, mapName, storage, isInheritanceDiscriminator);
+			return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
+		}
+
+		private void MapFieldOnType(string origName, string mapName)
+		{
+			AttributeExtensionCollection attrs;
+			if (!this._typeExtension.Attributes.TryGetValue(Attributes.MapField.Name, out attrs))
+			{
+				attrs = new AttributeExtensionCollection();
+				this._typeExtension.Attributes.Add(Attributes.MapField.Name, attrs);
+			}
+			var attributeExtension = new AttributeExtension();
+			attributeExtension.Values.Add(Attributes.MapField.OrigName, origName);
+            attributeExtension.Values.Add(Attributes.MapField.MapName, mapName);
+			attrs.Add(attributeExtension);
+		}
+
+		private void MapFieldOnField(string origName, string mapName, string storage, bool? isInheritanceDiscriminator)
+		{
+			var member = this.GetMemberExtension(origName);
+			if (!string.IsNullOrEmpty(mapName))
+			{
+				member.Attributes.Add(Attributes.MapField.Name, mapName);
+			}
+			if (null != storage)
+			{
+				member.Attributes.Add(Attributes.MapField.Storage, storage);
+			}
+			if (null != isInheritanceDiscriminator)
+			{
+				member.Attributes.Add(Attributes.MapField.IsInheritanceDiscriminator, this.ToString(isInheritanceDiscriminator.Value));
+			}
+		}
+
+		/// <summary>
+		/// PrimaryKeyAttribute
+		/// </summary>
+		/// <typeparam name="TR"></typeparam>
+		/// <param name="prop"></param>
+		/// <param name="order"></param>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> PrimaryKey<TR>(Expression<Func<T, TR>> prop, int order = -1)
+		{
+			string name = this.GetExprName(prop);
+			((IFluentMap)this).PrimaryKey(name, order);
+			return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
+		}
+
+		/// <summary>
+		/// NonUpdatableAttribute
+		/// </summary>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> NonUpdatable<TR>(Expression<Func<T, TR>> prop)
+		{
+			string name = this.GetExprName(prop);
+			((IFluentMap)this).NonUpdatable(name);
+			return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
+		}
+
+		/// <summary>
+		/// IdentityAttribute
+		/// </summary>
+		/// <typeparam name="TR"></typeparam>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> Identity<TR>(Expression<Func<T, TR>> prop)
+		{
+			string name = this.GetExprName(prop);
+			((IFluentMap)this).Identity(name);
+			return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
+		}
+
+		/// <summary>
+		/// SqlIgnoreAttribute
+		/// </summary>
+		/// <param name="prop"></param>
+		/// <param name="ignore"></param>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> SqlIgnore<TR>(Expression<Func<T, TR>> prop, bool ignore = true)
+		{
+			string name = this.GetExprName(prop);
+			((IFluentMap)this).SqlIgnore(name, ignore);
+			return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
+		}
+
+		/// <summary>
+		/// MapIgnoreAttribute
+		/// </summary>
+		/// <param name="prop"></param>
+		/// <param name="ignore"></param>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> MapIgnore<TR>(Expression<Func<T, TR>> prop, bool ignore = true)
+		{
+			string name = this.GetExprName(prop);
+			((IFluentMap)this).MapIgnore(name, ignore);
+			return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
+		}
+
+		/// <summary>
+		/// TrimmableAttribute
+		/// </summary>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> Trimmable<TR>(Expression<Func<T, TR>> prop)
+		{
+			string name = this.GetExprName(prop);
+			((IFluentMap)this).Trimmable(name);
+			return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
+		}
+
+		/// <summary>
+		/// MapValueAttribute
+		/// </summary>
+		/// <typeparam name="TV"> </typeparam>
+		/// <typeparam name="TR"> </typeparam>
+		/// <param name="prop"></param>
+		/// <param name="origValue"></param>
+		/// <param name="value"></param>
+		/// <param name="values"></param>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> MapValue<TV, TR>(Expression<Func<T, TR>> prop, TR origValue, TV value, params TV[] values)
+		{
+			string name = this.GetExprName(prop);
+			((IFluentMap)this).MapValue(name, origValue, value, values);
+			return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
+		}
+
+		/// <summary>
+		/// DefaultValueAttribute
+		/// </summary>
+		/// <param name="prop"> </param>
+		/// <param name="value"></param>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> DefaultValue<TR>(Expression<Func<T, TR>> prop, TR value)
+		{
+			string name = this.GetExprName(prop);
+			((IFluentMap)this).DefaulValue(name, value);
+			return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
+		}
+
+		/// <summary>
+		/// DbTypeAttribute
+		/// </summary>
+		/// <param name="prop"> </param>
+		/// <param name="dbType"></param>
+		/// <returns></returns>
+		public MapFieldMap<T,TR> DbType<TR>(Expression<Func<T, TR>> prop, DbType dbType)
+		{
+			string name = this.GetExprName(prop);
+			((IFluentMap)this).DbType<TR>(name, dbType);
+			return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
+		}
+
+		/// <summary>
+		/// MemberMapperAttribute
+		/// </summary>
+		/// <param name="prop"> </param>
+		/// <param name="memberMapperType"></param>
+		/// <returns></returns>
+		public MapFieldMap<T,TR> MemberMapper<TR>(Expression<Func<T,TR>> prop, Type memberMapperType)
+		{
+			return this.MemberMapper(prop, null, memberMapperType);
+		}
+
+		/// <summary>
+		/// MemberMapperAttribute
+		/// </summary>
+		/// <param name="prop"> </param>
+		/// <param name="memberType"></param>
+		/// <param name="memberMapperType"></param>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> MemberMapper<TR>(Expression<Func<T, TR>> prop, Type memberType, Type memberMapperType)
+		{
+			string name = this.GetExprName(prop);
+			((IFluentMap)this).MemberMapper<TR>(name, memberType, memberMapperType);
+			return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
+		}
+
+		/// <summary>
+		/// NullableAttribute
+		/// </summary>
+		/// <param name="prop"></param>
+		/// <param name="isNullable"></param>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> Nullable<TR>(Expression<Func<T, TR>> prop, bool isNullable = true)
+		{
+			string name = this.GetExprName(prop);
+			((IFluentMap)this).Nullable(name, isNullable);
+			return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
+		}
+
+		/// <summary>
+		/// LazyInstanceAttribute
+		/// </summary>
+		/// <param name="prop"></param>
+		/// <param name="isLazy"></param>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> LazyInstance<TR>(Expression<Func<T, TR>> prop, bool isLazy = true)
+		{
+			string name = this.GetExprName(prop);
+			if (!GetIsVirtual(prop))
+				throw new Exception("Property wich uses LazyInstance needs to be virtual!");
+			((IFluentMap)this).LazyInstance(name, isLazy);
+			return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
+		}
+
+		/// <summary>
+		/// NullValueAttribute
+		/// </summary>
+		/// <param name="prop"></param>
+		/// <param name="value"></param>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> NullValue<TR>(Expression<Func<T, TR>> prop, TR value)
+		{
+			string name = this.GetExprName(prop);
+			((IFluentMap)this).NullValue(name, value);
+			return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
+		}
+
+		/// <summary>
+		/// AssociationAttribute
+		/// </summary>
+		/// <typeparam name="TRt"></typeparam>
+		/// <typeparam name="TR"> </typeparam>
+		/// <param name="prop"> </param>
+		/// <param name="canBeNull"></param>
+		/// <param name="thisKey"></param>
+		/// <param name="thisKeys"></param>
+		/// <returns></returns>
+		public MapFieldMap<T, TR>.AssociationMap<TRt> Association<TRt, TR>(Expression<Func<T, TR>> prop, bool canBeNull, Expression<Func<T, TRt>> thisKey, params Expression<Func<T, TRt>>[] thisKeys)
+		{
+			var keys = new List<Expression<Func<T, TRt>>>(thisKeys);
+			keys.Insert(0, thisKey);
+			return new MapFieldMap<T, TR>.AssociationMap<TRt>(new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop), canBeNull, keys);
+		}
+
+		/// <summary>
+		/// AssociationAttribute
+		/// </summary>
+		/// <typeparam name="TRt"></typeparam>
+		/// <typeparam name="TR"> </typeparam>
+		/// <param name="prop"> </param>
+		/// <param name="thisKey"></param>
+		/// <param name="thisKeys"></param>
+		/// <returns></returns>
+		public MapFieldMap<T, TR>.AssociationMap<TRt> Association<TRt, TR>(Expression<Func<T, TR>> prop, Expression<Func<T, TRt>> thisKey, params Expression<Func<T, TRt>>[] thisKeys)
+		{
+			return this.Association(prop, true, thisKey, thisKeys);
+		}
+
+		protected MapFieldMap<T, TR> Association<TRt, TR, TRf, TRo>(Expression<Func<T, TR>> prop, bool canBeNull
+			, IEnumerable<Expression<Func<T, TRt>>> thisKeys, IEnumerable<Expression<Func<TRf, TRo>>> otherKeys)
+		{
+			string name = this.GetExprName(prop);
+			((IFluentMap)this).Association(name, canBeNull, this.KeysToString(thisKeys.ToArray()), this.KeysToString(otherKeys.ToArray()));
+			return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
+		}
+
+		/// <summary>
+		/// Reverse on BLToolkit.Mapping.Association.ParseKeys()
+		/// </summary>
+		/// <typeparam name="T1"></typeparam>
+		/// <typeparam name="T2"></typeparam>
+		/// <param name="keys"></param>
+		/// <returns></returns>
+		private string KeysToString<T1, T2>(IEnumerable<Expression<Func<T1, T2>>> keys)
+		{
+			return keys.Select(this.GetExprName).Aggregate((s1, s2) => s1 + ", " + s2);
+		}
+
+		/// <summary>
+		/// RelationAttribute
+		/// </summary>
+		/// <typeparam name="TR"></typeparam>
+		/// <param name="prop"></param>
+		/// <param name="slaveIndex"></param>
+		/// <param name="masterIndex"></param>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> Relation<TR>(Expression<Func<T, TR>> prop, string slaveIndex = null, string masterIndex = null)
+		{
+			return this.Relation(prop, new[] { slaveIndex }, new[] { masterIndex });
+		}
+
+		/// <summary>
+		/// RelationAttribute
+		/// </summary>
+		/// <typeparam name="TR"></typeparam>
+		/// <param name="prop"></param>
+		/// <param name="slaveIndex"></param>
+		/// <param name="masterIndex"></param>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> Relation<TR>(Expression<Func<T, TR>> prop, string[] slaveIndex, string[] masterIndex)
+		{
+			string name = this.GetExprName(prop);
+
+			slaveIndex = (slaveIndex ?? new string[0]).Where(i => !string.IsNullOrEmpty(i)).ToArray();
+			masterIndex = (masterIndex ?? new string[0]).Where(i => !string.IsNullOrEmpty(i)).ToArray();
+
+			Type destinationType = typeof(TR);
+
+			((IFluentMap)this).Relation(name, destinationType, slaveIndex, masterIndex);
+			return new MapFieldMap<T, TR>(this._typeExtension, this.Childs, prop);
+		}
+
+		static void FillRelationIndex(string[] index, AttributeExtension attributeExtension, string indexName)
+		{
+			if (index.Any())
+			{
+				var collection = new AttributeExtensionCollection();
+				foreach (var s in index)
+				{
+					var ae = new AttributeExtension();
+					ae.Values.Add(TypeExtension.AttrName.Name, s);
+					collection.Add(ae);
+				}
+				attributeExtension.Attributes.Add(indexName, collection);
+			}
+		}
+
+		/// <summary>
+		/// MapValueAttribute
+		/// </summary>
+		/// <typeparam name="TV"></typeparam>
+		/// <param name="origValue"></param>
+		/// <param name="value"></param>
+		/// <param name="values"></param>
+		/// <returns></returns>
+		public FluentMap<T> MapValue<TV>(Enum origValue, TV value, params TV[] values)
+		{
+			((IFluentMap)this).MapValue(origValue, value, values);
+			return this;
+		}
+
+		/// <summary>
+		/// MapValueAttribute
+		/// </summary>
+		/// <typeparam name="TV"></typeparam>
+		/// <param name="origValue"></param>
+		/// <param name="value"></param>
+		/// <param name="values"></param>
+		/// <returns></returns>
+		public FluentMap<T> MapValue<TV>(object origValue, TV value, params TV[] values)
+		{
+			((IFluentMap)this).MapValue(origValue, value, values);
+			return this;
+		}
+
+		/// <summary>
+		/// MapFieldAttribute(isInheritanceDescriminator = true)
+		/// </summary>
+		/// <typeparam name="TR"></typeparam>
+		/// <param name="prop"></param>
+		/// <returns></returns>
+		public FluentMap<T> InheritanceField<TR>(Expression<Func<T, TR>> prop)
+		{
+			return this.MapField(prop, true);
+		}
+
+		/// <summary>
+		/// InheritanceMappingAttribute
+		/// </summary>
+		/// <typeparam name="TC"></typeparam>
+		/// <param name="code"></param>
+		/// <returns></returns>
+		public FluentMap<T> InheritanceMapping<TC>(object code)
+		{
+			return this.InheritanceMapping<TC>(code, null);
+		}
+
+		/// <summary>
+		/// InheritanceMappingAttribute
+		/// </summary>
+		/// <typeparam name="TC"></typeparam>
+		/// <param name="isDefault"></param>
+		/// <returns></returns>
+		public FluentMap<T> InheritanceMapping<TC>(bool isDefault)
+		{
+			return this.InheritanceMapping<TC>(null, isDefault);
+		}
+
+		/// <summary>
+		/// InheritanceMappingAttribute
+		/// </summary>
+		/// <typeparam name="TC"></typeparam>
+		/// <param name="code"></param>
+		/// <param name="isDefault"></param>
+		/// <returns></returns>
+		public FluentMap<T> InheritanceMapping<TC>(object code, bool? isDefault)
+		{
+			((IFluentMap)this).InheritanceMapping(typeof(TC), code, isDefault);
+			return this;
+		}
+
+		protected void FillMapValueExtension<TR, TV>(AttributeNameCollection attributeCollection, TR origValue, TV value, TV[] values)
+		{
+			AttributeExtensionCollection list;
+			if (!attributeCollection.TryGetValue(Attributes.MapValue.Name, out list))
+			{
+				list = new AttributeExtensionCollection();
+				attributeCollection.Add(Attributes.MapValue.Name, list);
+			}
+
+			var allValues = new List<TV>(values);
+			allValues.Insert(0, value);
+			var tvFullName = typeof(TV).FullName;
+
+			foreach (var val in allValues)
+			{
+				var attributeExtension = new AttributeExtension();
+				attributeExtension.Values.Add(Attributes.MapValue.OrigValue, origValue);
+				attributeExtension.Values.Add(TypeExtension.ValueName.Value, Convert.ToString(val));
+				attributeExtension.Values.Add(TypeExtension.ValueName.Value + TypeExtension.ValueName.TypePostfix, tvFullName);
+				list.Add(attributeExtension);
+			}
+		}
+
+		protected void FillMemberMapperExtension(AttributeNameCollection attributeCollection, Type memberType, Type memberMapperType)
+		{
+			AttributeExtensionCollection attrs;
+			if (!attributeCollection.TryGetValue(Attributes.MemberMapper.Name, out attrs))
+			{
+				attrs = new AttributeExtensionCollection();
+				attributeCollection.Add(Attributes.MemberMapper.Name, attrs);
+			}
+			var attributeExtension = new AttributeExtension();
+			attributeExtension.Values.Add(Attributes.MemberMapper.MemberType, memberType);
+			attributeExtension.Values.Add(Attributes.MemberMapper.MemberMapperType, memberMapperType);
+			attrs.Add(attributeExtension);	       
+		}
+
+		/// <summary>
+		/// Fluent settings result
+		/// </summary>
+		/// <returns></returns>
+		public ExtensionList Map()
+		{
+			var result = new ExtensionList();
+			this.MapTo(result);
+			return result;
+		}
+
+		/// <summary>
+		/// Apply fluent settings to DbManager
+		/// </summary>
+		/// <param name="dbManager"></param>
+		public void MapTo(DbManager dbManager)
+		{
+			var ms = dbManager.MappingSchema ?? (dbManager.MappingSchema = Mapping.Map.DefaultSchema);
+			this.MapTo(ms);
+		}
+
+		/// <summary>
+		/// Apply fluent settings to DataProviderBase
+		/// </summary>
+		/// <param name="dataProvider"></param>
+		public void MapTo(DataProviderBase dataProvider)
+		{
+			var ms = dataProvider.MappingSchema ?? (dataProvider.MappingSchema = Mapping.Map.DefaultSchema);
+			this.MapTo(ms);
+		}
+
+		/// <summary>
+		/// Apply fluent settings to MappingSchema
+		/// </summary>
+		/// <param name="mappingSchema"></param>
+		public void MapTo(MappingSchema mappingSchema)
+		{
+			var extensions = mappingSchema.Extensions ?? (mappingSchema.Extensions = new ExtensionList());
+			this.MapTo(extensions);
+		}
+
+		/// <summary>
+		/// Apply fluent settings to ExtensionList
+		/// </summary>
+		/// <param name="extensions"></param>
+		public void MapTo(ExtensionList extensions)
+		{
+			var ext = this._typeExtension;
+			TypeExtension oldExt;
+			if (extensions.TryGetValue(ext.Name, out oldExt))
+			{
+				FluentMapHelper.MergeExtensions(ext, ref oldExt);
+			}
+			else
+			{
+				extensions.Add(ext);
+			}
+			this.EachChilds(m => m.MapTo(extensions));
+		}
+
+		protected MemberExtension GetMemberExtension<TR>(Expression<Func<T, TR>> prop)
+		{
+			string name = this.GetExprName(prop);
+			return this.GetMemberExtension(name);
+		}
+
+		protected MemberExtension GetMemberExtension(string name)
+		{
+			MemberExtension member;
+			if (!this._typeExtension.Members.TryGetValue(name, out member))
+			{
+				member = new MemberExtension { Name = name };
+				this._typeExtension.Members.Add(member);
+			}
+			return member;
+		}
+
+		private string GetExprName<TT, TR>(Expression<Func<TT, TR>> prop)
+		{
+			string result = null;
+			var memberExpression = prop.Body as MemberExpression;
+			while (null != memberExpression)
+			{
+				result = null == result ? "" : MemberNameSeparator + result;
+				result = memberExpression.Member.Name + result;
+				memberExpression = memberExpression.Expression as MemberExpression;
+			}
+			if (null == result)
+			{
+				throw new ArgumentException("Fail member access expression.");
+			}
+			return result;
+		}
+
+		static bool GetIsVirtual<TT, TR>(Expression<Func<TT, TR>> prop)
+		{
+			var memberExpression = prop.Body as MemberExpression;
+			if (memberExpression != null)
+			{
+				var prpInfo = memberExpression.Member as PropertyInfo;
+				if (prpInfo != null && !prpInfo.GetGetMethod().IsVirtual)
+				{
+					return false;
+				}
+			}
+
+			return true;
+		}
+
+		/// <summary>
+		/// Invert for BLToolkit.Reflection.Extension.TypeExtension.ToBoolean()
+		/// </summary>
+		/// <param name="value"></param>
+		/// <returns></returns>
+		protected string ToString(bool value)
+		{
+			return Convert.ToString(value);
+		}
+
+		private void EachChilds(Action<IFluentMap> action)
+		{
+			foreach (var childMap in this.Childs)
+			{
+				action(childMap);
+			}
+		}
+
+		private List<IFluentMap> Childs
+		{
+			get
+			{
+				if (null == this._childs)
+				{
+					this._childs = new List<IFluentMap>();
+					var thisType = typeof(T);
+					var fmType = typeof(FluentMap<>);
+					// Find child only first generation ... other generation find recursive
+					foreach (var childType in thisType.Assembly.GetTypes().Where(t => t.BaseType == thisType))
+					{
+						this._childs.Add((IFluentMap)Activator.CreateInstance(fmType.MakeGenericType(childType)));
+					}
+				}
+				return this._childs;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/Fluent/FluentMapHelper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,72 @@
+using BLToolkit.Reflection.Extension;
+
+namespace BLToolkit.Mapping.Fluent
+{
+	public static class FluentMapHelper
+	{
+		public static void MergeExtensions(ExtensionList fromExt, ref ExtensionList toExt)
+		{
+			foreach (var kv in fromExt)
+			{
+				TypeExtension toType;
+				if (toExt.TryGetValue(kv.Key, out toType))
+				{
+					MergeExtensions(kv.Value, ref toType);
+				}
+				else
+				{
+					toExt.Add(kv.Key, kv.Value);
+				}
+			}
+		}
+
+		public static void MergeExtensions(TypeExtension fromExt, ref TypeExtension toExt)
+		{
+			if (ReferenceEquals(fromExt, toExt))
+			{
+				return;
+			}
+			foreach (var attribute in fromExt.Attributes)
+			{
+				AttributeExtensionCollection attrs;
+				if (toExt.Attributes.TryGetValue(attribute.Key, out attrs))
+				{
+					MergeExtensions(attribute.Value, ref attrs);
+				}
+				else
+				{
+					toExt.Attributes.Add(attribute.Key, attribute.Value);
+				}
+			}
+			foreach (var member in fromExt.Members)
+			{
+				MemberExtension value;
+				if (toExt.Members.TryGetValue(member.Key, out value))
+				{
+					MergeExtensions(member.Value, ref value);
+				}
+				else
+				{
+					toExt.Members.Add(member.Key, member.Value);
+				}
+			}
+		}
+
+		private static void MergeExtensions(MemberExtension fromExt, ref MemberExtension toExt)
+		{
+			foreach (var attribute in fromExt.Attributes)
+			{
+				if (toExt.Attributes.ContainsKey(attribute.Key))
+				{
+					toExt.Attributes.Remove(attribute.Key);
+				}
+				toExt.Attributes.Add(attribute.Key, attribute.Value);
+			}
+		}
+
+		private static void MergeExtensions(AttributeExtensionCollection fromExt, ref AttributeExtensionCollection toExt)
+		{
+			toExt.AddRange(fromExt);
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/Fluent/IFluentMap.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,179 @@
+using System;
+using System.Data;
+
+using BLToolkit.Reflection.Extension;
+
+namespace BLToolkit.Mapping.Fluent
+{
+	/// <summary>
+	/// Interface fluent mapping
+	/// </summary>
+	public interface IFluentMap
+	{
+		/// <summary>
+		/// Get mapping
+		/// </summary>
+		/// <returns></returns>
+		ExtensionList Map();
+
+		/// <summary>
+		/// TableNameAttribute
+		/// </summary>
+		/// <param name="database"></param>
+		/// <param name="owner"></param>
+		/// <param name="name"></param>
+		/// <returns></returns>
+		void TableName(string database, string owner, string name);
+
+		/// <summary>
+		/// Map to ExtensionList
+		/// </summary>
+		/// <param name="extensions"></param>
+		void MapTo(ExtensionList extensions);
+
+		/// <summary>
+		/// Maps the field.
+		/// </summary>
+		/// <param name="propName">Name of the prop.</param>
+		/// <param name="mapName">Name of the map.</param>
+		/// <param name="storage">The storage.</param>
+		/// <param name="isInheritanceDiscriminator">The is inheritance discriminator.</param>
+		/// <returns></returns>
+		void MapField(string propName, string mapName, string storage, bool? isInheritanceDiscriminator);
+
+		/// <summary>
+		/// Primaries the key.
+		/// </summary>
+		/// <param name="propName">Name of the prop.</param>
+		/// <param name="order">The order.</param>
+		void PrimaryKey(string propName, int order);
+
+		/// <summary>
+		/// Nons the updatable.
+		/// </summary>
+		/// <param name="propName">Name of the prop.</param>
+		void NonUpdatable(string propName);
+
+		/// <summary>
+		/// Identities the specified prop name.
+		/// </summary>
+		/// <param name="propName">Name of the prop.</param>
+		void Identity(string propName);
+
+		/// <summary>
+		/// SQLs the ignore.
+		/// </summary>
+		/// <param name="propName">Name of the prop.</param>
+		/// <param name="ignore">if set to <c>true</c> [ignore].</param>
+		void SqlIgnore(string propName, bool ignore);
+
+		/// <summary>
+		/// Maps the ignore.
+		/// </summary>
+		/// <param name="propName">Name of the prop.</param>
+		/// <param name="ignore">if set to <c>true</c> [ignore].</param>
+		void MapIgnore(string propName, bool ignore);
+
+		/// <summary>
+		/// Trimmables the specified prop name.
+		/// </summary>
+		/// <param name="propName">Name of the prop.</param>
+		void Trimmable(string propName);
+
+		/// <summary>
+		/// Maps the value.
+		/// </summary>
+		/// <typeparam name="TR">The type of the R.</typeparam>
+		/// <typeparam name="TV">The type of the V.</typeparam>
+		/// <param name="propName">Name of the prop.</param>
+		/// <param name="origValue">The orig value.</param>
+		/// <param name="value">The value.</param>
+		/// <param name="values">The values.</param>
+		void MapValue<TR, TV>(string propName, TR origValue, TV value, TV[] values);
+
+		/// <summary>
+		/// Maps the value.
+		/// </summary>
+		/// <typeparam name="TV">The type of the V.</typeparam>
+		/// <param name="origValue">The orig value.</param>
+		/// <param name="value">The value.</param>
+		/// <param name="values">The values.</param>
+		void MapValue<TV>(Enum origValue, TV value, TV[] values);
+
+		/// <summary>
+		/// Maps the value.
+		/// </summary>
+		/// <typeparam name="TV">The type of the V.</typeparam>
+		/// <param name="origValue">The orig value.</param>
+		/// <param name="value">The value.</param>
+		/// <param name="values">The values.</param>
+		void MapValue<TV>(object origValue, TV value, TV[] values);
+
+		/// <summary>
+		/// Defauls the value.
+		/// </summary>
+		/// <typeparam name="TR">The type of the R.</typeparam>
+		/// <param name="propName">Name of the prop.</param>
+		/// <param name="value">The value.</param>
+		void DefaulValue<TR>(string propName, TR value);
+
+        /// <summary>
+		/// Defauls the value.
+		/// </summary>
+		/// <typeparam name="TR">The type of the R.</typeparam>
+		/// <param name="propName">Name of the prop.</param>
+		/// <param name="value">The value.</param>
+        void DbType<TR>(string propName, DbType value);
+
+        /// <summary>
+        /// MemberMapper
+		/// </summary>
+		/// <typeparam name="TR">The type of the R.</typeparam>
+		/// <param name="propName">Name of the prop.</param>
+		/// <param name="value">The value.</param>
+        void MemberMapper<TR>(string propName, Type memberType, Type memberMapperType);
+        
+		/// <summary>
+		/// Nullables the specified prop name.
+		/// </summary>
+		/// <param name="propName">Name of the prop.</param>
+		/// <param name="isNullable">if set to <c>true</c> [is nullable].</param>
+		void Nullable(string propName, bool isNullable);
+
+        void LazyInstance(string propName, bool isLazy);
+
+		/// <summary>
+		/// Nulls the value.
+		/// </summary>
+		/// <typeparam name="TR">The type of the R.</typeparam>
+		/// <param name="propName">Name of the prop.</param>
+		/// <param name="value">The value.</param>
+		void NullValue<TR>(string propName, TR value);
+
+		/// <summary>
+		/// Associations the specified prop name.
+		/// </summary>
+		/// <param name="propName">Name of the prop.</param>
+		/// <param name="canBeNull">if set to <c>true</c> [can be null].</param>
+		/// <param name="thisKeys">The this keys.</param>
+		/// <param name="otherKeys">The other keys.</param>
+		void Association(string propName, bool canBeNull, string thisKeys, string otherKeys);
+
+		/// <summary>
+		/// Relations the specified prop name.
+		/// </summary>
+		/// <param name="propName">Name of the prop.</param>
+		/// <param name="destinationType">Type of the destination.</param>
+		/// <param name="slaveIndex">Index of the slave.</param>
+		/// <param name="masterIndex">Index of the master.</param>
+		void Relation(string propName, Type destinationType, string[] slaveIndex, string[] masterIndex);
+
+		/// <summary>
+		/// Inheritances the mapping.
+		/// </summary>
+		/// <param name="type">The type.</param>
+		/// <param name="code">The code.</param>
+		/// <param name="isDefault">The is default.</param>
+		void InheritanceMapping(Type type, object code, bool? isDefault);
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/Fluent/MapFieldMap.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,218 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq.Expressions;
+
+using BLToolkit.Reflection.Extension;
+
+namespace BLToolkit.Mapping.Fluent
+{
+	/// <summary>
+	/// Fluent settings for field
+	/// </summary>
+	/// <typeparam name="T"></typeparam>
+	/// <typeparam name="TR"></typeparam>
+	public partial class MapFieldMap<T, TR> : FluentMap<T>
+	{
+		private readonly Expression<Func<T, TR>> _prop;
+
+		public MapFieldMap(TypeExtension owner, List<IFluentMap> childs, Expression<Func<T, TR>> prop)
+			: base(owner, childs)
+		{
+			this._prop = prop;
+		}
+
+		/// <summary>
+		/// PrimaryKeyAttribute
+		/// </summary>
+		/// <typeparam name="TR"></typeparam>
+		/// <param name="order"></param>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> PrimaryKey(int order = -1)
+		{
+			return this.PrimaryKey(this._prop, order);
+		}
+
+        public MapFieldMap<T, TR> LazyInstance(bool isLazy = true)
+        {
+            return this.LazyInstance(this._prop, isLazy);
+        }
+
+
+		/// <summary>
+		/// NonUpdatableAttribute
+		/// </summary>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> NonUpdatable()
+		{
+			return this.NonUpdatable(this._prop);
+		}
+
+		/// <summary>
+		/// IdentityAttribute
+		/// </summary>
+		/// <typeparam name="TR"></typeparam>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> Identity()
+		{
+			return this.Identity(this._prop);
+		}
+
+		/// <summary>
+		/// SqlIgnoreAttribute
+		/// </summary>
+		/// <param name="ignore"></param>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> SqlIgnore(bool ignore = true)
+		{
+			return this.SqlIgnore(this._prop, ignore);
+		}
+
+		/// <summary>
+		/// MapIgnoreAttribute
+		/// </summary>
+		/// <param name="ignore"></param>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> MapIgnore(bool ignore = true)
+		{
+			return this.MapIgnore(this._prop, ignore);
+		}
+
+		/// <summary>
+		/// TrimmableAttribute
+		/// </summary>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> Trimmable()
+		{
+			return this.Trimmable(this._prop);
+		}
+
+		/// <summary>
+		/// MapValueAttribute
+		/// </summary>
+		/// <typeparam name="TV"> </typeparam>
+		/// <param name="origValue"></param>
+		/// <param name="value"></param>
+		/// <param name="values"></param>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> MapValue<TV>(TR origValue, TV value, params TV[] values)
+		{
+			return this.MapValue(this._prop, origValue, value, values);
+		}
+
+		/// <summary>
+		/// DefaultValueAttribute
+		/// </summary>
+		/// <param name="value"></param>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> DefaultValue(TR value)
+		{
+			return this.DefaultValue(this._prop, value);
+		}
+
+        /// <summary>
+        /// DbTypeAttribute
+        /// </summary>
+        /// <param name="dbType"></param>
+        /// <returns></returns>
+        public MapFieldMap<T, TR> DbType(DbType dbType)
+        {
+            return this.DbType(this._prop, dbType);
+        }
+
+        /// <summary>
+        /// MemberMapperAttribute
+        /// at the Moment you also have to specify MapIgnore(false) when using Complex types with Member Mapper.
+        /// </summary>
+        /// <param name="value"></param>
+        /// <returns></returns>
+        public MapFieldMap<T, TR> MemberMapper(Type memberMapperType)
+        {
+            return this.MemberMapper(this._prop, memberMapperType);
+        }
+
+        /// <summary>
+        /// MemberMapperAttribute
+        /// at the Moment you also have to specify MapIgnore(false) when using Complex types with Member Mapper.
+        /// </summary>
+        /// <param name="value"></param>
+        /// <returns></returns>
+        public MapFieldMap<T, TR> MemberMapper(Type memberType, Type memberMapperType)
+        {
+            return this.MemberMapper(this._prop, memberType, memberMapperType);
+        }
+
+		/// <summary>
+		/// NullableAttribute
+		/// </summary>
+		/// <param name="isNullable"></param>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> Nullable(bool isNullable = true)
+		{
+			return this.Nullable(this._prop, isNullable);
+		}
+
+		/// <summary>
+		/// NullValueAttribute
+		/// </summary>
+		/// <param name="value"></param>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> NullValue(TR value)
+		{
+			return this.NullValue(this._prop, value);
+		}
+
+		/// <summary>
+		/// AssociationAttribute
+		/// </summary>
+		/// <typeparam name="TRt"></typeparam>
+		/// <param name="canBeNull"></param>
+		/// <param name="thisKey"></param>
+		/// <param name="thisKeys"></param>
+		/// <returns></returns>
+		public AssociationMap<TRt> Association<TRt>(bool canBeNull, Expression<Func<T, TRt>> thisKey, params Expression<Func<T, TRt>>[] thisKeys)
+		{
+			return this.Association(this._prop, canBeNull, thisKey, thisKeys);
+		}
+
+		/// <summary>
+		/// AssociationAttribute
+		/// </summary>
+		/// <typeparam name="TRt"></typeparam>
+		/// <param name="thisKey"></param>
+		/// <param name="thisKeys"></param>
+		/// <returns></returns>
+		public AssociationMap<TRt> Association<TRt>(Expression<Func<T, TRt>> thisKey, params Expression<Func<T, TRt>>[] thisKeys)
+		{
+			return this.Association(this._prop, thisKey, thisKeys);
+		}
+
+		private MapFieldMap<T, TR> Association<TRt, TRf, TRo>(bool canBeNull
+			, IEnumerable<Expression<Func<T, TRt>>> thisKeys, IEnumerable<Expression<Func<TRf, TRo>>> otherKeys)
+		{
+			return this.Association(this._prop, canBeNull, thisKeys, otherKeys);
+		}
+
+		/// <summary>
+		/// RelationAttribute
+		/// </summary>
+		/// <param name="slaveIndex"></param>
+		/// <param name="masterIndex"></param>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> Relation(string slaveIndex = null, string masterIndex = null)
+		{
+			return this.Relation(this._prop, slaveIndex, masterIndex);
+		}
+
+		/// <summary>
+		/// RelationAttribute
+		/// </summary>
+		/// <param name="slaveIndex"></param>
+		/// <param name="masterIndex"></param>
+		/// <returns></returns>
+		public MapFieldMap<T, TR> Relation(string[] slaveIndex, string[] masterIndex)
+		{
+			return this.Relation(this._prop, slaveIndex, masterIndex);
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/Fluent/MappedProperty.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace BLToolkit.Mapping.Fluent
+{
+    public class MappedProperty
+    {
+        public string Name { get; internal set; }
+        public Type Type { get; internal set; }
+        public Type ParentType { get; internal set; }        
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/IMapDataDestination.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,87 @@
+using System;
+using System.Data.SqlTypes;
+
+namespace BLToolkit.Mapping
+{
+	[CLSCompliant(false)]
+	public interface IMapDataDestination
+	{
+		Type GetFieldType (int index);
+		int  GetOrdinal   (string name);
+		void SetValue     (object o, int index,   object value);
+		void SetValue     (object o, string name, object value);
+
+		void SetNull      (object o, int index);
+
+		bool SupportsTypedValues(int index);
+
+		// Simple type setters.
+		//
+		[CLSCompliant(false)]
+		void SetSByte     (object o, int index, SByte    value);
+		void SetInt16     (object o, int index, Int16    value);
+		void SetInt32     (object o, int index, Int32    value);
+		void SetInt64     (object o, int index, Int64    value);
+
+		void SetByte      (object o, int index, Byte     value);
+		[CLSCompliant(false)]
+		void SetUInt16    (object o, int index, UInt16   value);
+		[CLSCompliant(false)]
+		void SetUInt32    (object o, int index, UInt32   value);
+		[CLSCompliant(false)]
+		void SetUInt64    (object o, int index, UInt64   value);
+
+		void SetBoolean   (object o, int index, Boolean  value);
+		void SetChar      (object o, int index, Char     value);
+		void SetSingle    (object o, int index, Single   value);
+		void SetDouble    (object o, int index, Double   value);
+		void SetDecimal   (object o, int index, Decimal  value);
+		void SetGuid      (object o, int index, Guid     value);
+		void SetDateTime  (object o, int index, DateTime value);
+		void SetDateTimeOffset(object o, int index, DateTimeOffset value);
+
+		// Simple type setters.
+		//
+		[CLSCompliant(false)]
+		void SetNullableSByte     (object o, int index, SByte?    value);
+		void SetNullableInt16     (object o, int index, Int16?    value);
+		void SetNullableInt32     (object o, int index, Int32?    value);
+		void SetNullableInt64     (object o, int index, Int64?    value);
+
+		void SetNullableByte      (object o, int index, Byte?     value);
+		[CLSCompliant(false)]
+		void SetNullableUInt16    (object o, int index, UInt16?   value);
+		[CLSCompliant(false)]
+		void SetNullableUInt32    (object o, int index, UInt32?   value);
+		[CLSCompliant(false)]
+		void SetNullableUInt64    (object o, int index, UInt64?   value);
+
+		void SetNullableBoolean   (object o, int index, Boolean?  value);
+		void SetNullableChar      (object o, int index, Char?     value);
+		void SetNullableSingle    (object o, int index, Single?   value);
+		void SetNullableDouble    (object o, int index, Double?   value);
+		void SetNullableDecimal   (object o, int index, Decimal?  value);
+		void SetNullableGuid      (object o, int index, Guid?     value);
+		void SetNullableDateTime  (object o, int index, DateTime? value);
+		void SetNullableDateTimeOffset(object o, int index, DateTimeOffset? value);
+
+#if !SILVERLIGHT
+
+		// SQL type setters.
+		//
+		void SetSqlByte    (object o, int index, SqlByte     value);
+		void SetSqlInt16   (object o, int index, SqlInt16    value);
+		void SetSqlInt32   (object o, int index, SqlInt32    value);
+		void SetSqlInt64   (object o, int index, SqlInt64    value);
+		void SetSqlSingle  (object o, int index, SqlSingle   value);
+		void SetSqlBoolean (object o, int index, SqlBoolean  value);
+		void SetSqlDouble  (object o, int index, SqlDouble   value);
+		void SetSqlDateTime(object o, int index, SqlDateTime value);
+		void SetSqlDecimal (object o, int index, SqlDecimal  value);
+		void SetSqlMoney   (object o, int index, SqlMoney    value);
+		void SetSqlGuid    (object o, int index, SqlGuid     value);
+		void SetSqlString  (object o, int index, SqlString   value);
+
+#endif
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/IMapDataDestinationList.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,16 @@
+using System;
+
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Mapping
+{
+	[CLSCompliant(false)]
+	public interface IMapDataDestinationList
+	{
+		void                InitMapping       (InitContext initContext);
+		[CLSCompliant(false)]
+		IMapDataDestination GetDataDestination(InitContext initContext);
+		object              GetNextObject     (InitContext initContext);
+		void                EndMapping        (InitContext initContext);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/IMapDataSource.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,93 @@
+using System;
+
+#if !SILVERLIGHT
+using System.Data.SqlTypes;
+#endif
+
+namespace BLToolkit.Mapping
+{
+	[CLSCompliant(false)]
+	public interface IMapDataSource
+	{
+		int      Count { get; }
+
+		Type     GetFieldType (int index);
+		string   GetName      (int index);
+		int      GetOrdinal   (string name);
+		object   GetValue     (object o, int index);
+		object   GetValue     (object o, string name);
+
+		bool     IsNull       (object o, int index);
+
+		bool     SupportsTypedValues(int index);
+
+		// Simple type getters.
+		//
+		[CLSCompliant(false)]
+		SByte    GetSByte     (object o, int index);
+		Int16    GetInt16     (object o, int index);
+		Int32    GetInt32     (object o, int index);
+		Int64    GetInt64     (object o, int index);
+
+		Byte     GetByte      (object o, int index);
+		[CLSCompliant(false)]
+		UInt16   GetUInt16    (object o, int index);
+		[CLSCompliant(false)]
+		UInt32   GetUInt32    (object o, int index);
+		[CLSCompliant(false)]
+		UInt64   GetUInt64    (object o, int index);
+
+		Boolean  GetBoolean   (object o, int index);
+		Char     GetChar      (object o, int index);
+		Single   GetSingle    (object o, int index);
+		Double   GetDouble    (object o, int index);
+		Decimal  GetDecimal   (object o, int index);
+		DateTime GetDateTime  (object o, int index);
+		DateTimeOffset GetDateTimeOffset(object o, int index);
+		Guid     GetGuid      (object o, int index);
+
+		// Simple type getters.
+		//
+		[CLSCompliant(false)]
+		SByte?    GetNullableSByte   (object o, int index);
+		Int16?    GetNullableInt16   (object o, int index);
+		Int32?    GetNullableInt32   (object o, int index);
+		Int64?    GetNullableInt64   (object o, int index);
+
+		Byte?     GetNullableByte    (object o, int index);
+		[CLSCompliant(false)]
+		UInt16?   GetNullableUInt16  (object o, int index);
+		[CLSCompliant(false)]
+		UInt32?   GetNullableUInt32  (object o, int index);
+		[CLSCompliant(false)]
+		UInt64?   GetNullableUInt64  (object o, int index);
+
+		Boolean?  GetNullableBoolean (object o, int index);
+		Char?     GetNullableChar    (object o, int index);
+		Single?   GetNullableSingle  (object o, int index);
+		Double?   GetNullableDouble  (object o, int index);
+		Decimal?  GetNullableDecimal (object o, int index);
+		DateTime? GetNullableDateTime(object o, int index);
+		DateTimeOffset? GetNullableDateTimeOffset(object o, int index);
+		Guid?     GetNullableGuid    (object o, int index);
+
+#if !SILVERLIGHT
+
+		// SQL type getters.
+		//
+		SqlByte     GetSqlByte     (object o, int index);
+		SqlInt16    GetSqlInt16    (object o, int index);
+		SqlInt32    GetSqlInt32    (object o, int index);
+		SqlInt64    GetSqlInt64    (object o, int index);
+		SqlSingle   GetSqlSingle   (object o, int index);
+		SqlBoolean  GetSqlBoolean  (object o, int index);
+		SqlDouble   GetSqlDouble   (object o, int index);
+		SqlDateTime GetSqlDateTime (object o, int index);
+		SqlDecimal  GetSqlDecimal  (object o, int index);
+		SqlMoney    GetSqlMoney    (object o, int index);
+		SqlGuid     GetSqlGuid     (object o, int index);
+		SqlString   GetSqlString   (object o, int index);
+
+#endif
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/IMapDataSourceList.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,11 @@
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Mapping
+{
+	public interface IMapDataSourceList
+	{
+		void InitMapping      (InitContext initContext);
+		bool SetNextDataSource(InitContext initContext);
+		void EndMapping       (InitContext initContext);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/IMappingSchemaProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+using System;
+
+namespace BLToolkit.Mapping
+{
+	public interface IMappingSchemaProvider
+	{
+		MappingSchema MappingSchema { get; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/ISupportMapping.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Mapping
+{
+	public interface ISupportMapping
+	{
+		void BeginMapping(InitContext initContext);
+		void EndMapping  (InitContext initContext);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/IValueMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+using System;
+
+namespace BLToolkit.Mapping
+{
+	[CLSCompliant(false)]
+	public interface IValueMapper
+	{
+		void Map(
+			IMapDataSource      source, object sourceObject, int sourceIndex,
+			IMapDataDestination dest,   object destObject,   int destIndex);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/InheritanceMappingAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+using System;
+
+namespace BLToolkit.Mapping
+{
+	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple=true)]
+	public class InheritanceMappingAttribute : Attribute
+	{
+		object _code;      public object Code      { get { return _code;      } set { _code      = value; } }
+		bool   _isDefault; public bool   IsDefault { get { return _isDefault; } set { _isDefault = value; } }
+		Type   _type;      public Type   Type      { get { return _type;      } set { _type      = value; } }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/Map.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1021 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Data;
+
+namespace BLToolkit.Mapping
+{
+	using Common;
+	using Reflection;
+	using Reflection.Extension;
+
+	public class Map
+	{
+		#region Public Members
+		
+		private static MappingSchema _defaultSchema = new DefaultMappingSchema();
+		public  static MappingSchema  DefaultSchema
+		{
+			[System.Diagnostics.DebuggerStepThrough]
+			get { return _defaultSchema;  }
+			set { _defaultSchema = value; }
+		}
+
+		public static ExtensionList Extensions
+		{
+			[System.Diagnostics.DebuggerStepThrough]
+			get { return _defaultSchema.Extensions;  }
+			set { _defaultSchema.Extensions = value; }
+		}
+
+		public static ObjectMapper GetObjectMapper(Type type)
+		{
+			return _defaultSchema.GetObjectMapper(type);
+		}
+
+		#endregion
+
+		#region GetNullValue
+
+		public static object GetNullValue(Type type)
+		{
+			return _defaultSchema.GetNullValue(type);
+		}
+
+		public static bool IsNull(object value)
+		{
+			return _defaultSchema.IsNull(value);
+		}
+
+		#endregion
+
+		#region Base Mapping
+
+		public static void SourceToDestination(object sourceObject, object destObject, params object[] parameters)
+		{
+			_defaultSchema.MapSourceToDestination(sourceObject, destObject, parameters);
+		}
+
+		[CLSCompliant(false)]
+		public static void MapSourceToDestination(
+			IMapDataSource      source, object sourceObject, 
+			IMapDataDestination dest,   object destObject,
+			params object[]     parameters)
+		{
+			_defaultSchema.MapSourceToDestination(source, sourceObject, dest, destObject, parameters);
+		}
+
+		[CLSCompliant(false)]
+		public static void SourceListToDestinationList(
+			IMapDataSourceList      dataSourceList,
+			IMapDataDestinationList dataDestinationList,
+			params object[]         parameters)
+		{
+			_defaultSchema.MapSourceListToDestinationList(dataSourceList, dataDestinationList, parameters);
+		}
+
+		#endregion
+
+		#region ValueToEnum, EnumToValue
+
+		public static object ValueToEnum(object value, Type type)
+		{
+			return _defaultSchema.MapValueToEnum(value, type);
+		}
+
+		public static object EnumToValue(object value)
+		{
+			return _defaultSchema.MapEnumToValue(value);
+		}
+
+		public static object EnumToValue(object value, bool convertToUnderlyingType)
+		{
+			return _defaultSchema.MapEnumToValue(value, convertToUnderlyingType);
+		}
+
+		public static T ToEnum<T>(object value)
+		{
+			return (T)_defaultSchema.MapValueToEnum(value, typeof(T));
+		}
+
+		#endregion
+
+		#region Object
+
+		#region ObjectToObject
+
+		public static object ObjectToObject(object sourceObject, object destObject, params object[] parameters)
+		{
+			return _defaultSchema.MapObjectToObject(sourceObject, destObject, parameters);
+		}
+
+		public static object ObjectToObject(object sourceObject, Type destObjectType, params object[] parameters)
+		{
+			return _defaultSchema.MapObjectToObject(sourceObject, destObjectType, parameters);
+		}
+
+		public static T ObjectToObject<T>(object sourceObject, params object[] parameters)
+		{
+			return (T)_defaultSchema.MapObjectToObject(sourceObject, typeof(T), parameters);
+		}
+
+		#endregion
+
+		#region ObjectToDataRow
+
+#if !SILVERLIGHT
+
+		public static DataRow ObjectToDataRow(object sourceObject, DataRow destRow)
+		{
+			return _defaultSchema.MapObjectToDataRow(sourceObject, destRow);
+		}
+
+		public static DataRow ObjectToDataRow(object sourceObject, DataTable destTable)
+		{
+			return _defaultSchema.MapObjectToDataRow(sourceObject, destTable);
+		}
+
+#endif
+
+		#endregion
+
+		#region ObjectToDictionary
+
+		public static IDictionary ObjectToDictionary(object sourceObject, IDictionary destDictionary)
+		{
+			return _defaultSchema.MapObjectToDictionary(sourceObject, destDictionary);
+		}
+
+		public static IDictionary ObjectToDictionary(object sourceObject)
+		{
+			return _defaultSchema.MapObjectToDictionary(sourceObject);
+		}
+
+		#endregion
+
+		#endregion
+
+		#region DataRow
+
+		#region DataRowToObject
+
+#if !SILVERLIGHT
+
+		public static object DataRowToObject(DataRow dataRow, object destObject, params object[] parameters)
+		{
+			return _defaultSchema.MapDataRowToObject(dataRow, destObject, parameters);
+		}
+
+		public static object DataRowToObject(
+			DataRow dataRow, DataRowVersion version, object destObject, params object[] parameters)
+		{
+			return _defaultSchema.MapDataRowToObject(dataRow, version, destObject, parameters);
+		}
+
+		public static object DataRowToObject(DataRow dataRow, Type destObjectType, params object[] parameters)
+		{
+			return _defaultSchema.MapDataRowToObject(dataRow, destObjectType, parameters);
+		}
+
+		public static object DataRowToObject(
+			DataRow dataRow, DataRowVersion version, Type destObjectType, params object[] parameters)
+		{
+			return _defaultSchema.MapDataRowToObject(dataRow, version, destObjectType, parameters);
+		}
+
+		public static T DataRowToObject<T>(DataRow dataRow, params object[] parameters)
+		{
+			return (T)_defaultSchema.MapDataRowToObject(dataRow, typeof(T), parameters);
+		}
+
+		public static T DataRowToObject<T>(DataRow dataRow, DataRowVersion version, params object[] parameters)
+		{
+			return (T)_defaultSchema.MapDataRowToObject(dataRow, version, typeof(T), parameters);
+		}
+
+#endif
+
+		#endregion
+
+		#region DataRowToDataRow
+
+#if !SILVERLIGHT
+
+		public static DataRow DataRowToDataRow(DataRow sourceRow, DataRow destRow)
+		{
+			return _defaultSchema.MapDataRowToDataRow(sourceRow, destRow);
+		}
+
+		public static DataRow DataRowToDataRow(DataRow sourceRow, DataRowVersion version, DataRow destRow)
+		{
+			return _defaultSchema.MapDataRowToDataRow(sourceRow, version, destRow);
+		}
+
+		public static DataRow DataRowToDataRow(DataRow sourceRow, DataTable destTable)
+		{
+			return _defaultSchema.MapDataRowToDataRow(sourceRow, destTable);
+		}
+
+		public static DataRow DataRowToDataRow(DataRow sourceRow, DataRowVersion version, DataTable destTable)
+		{
+			return _defaultSchema.MapDataRowToDataRow(sourceRow, version, destTable);
+		}
+
+#endif
+
+		#endregion
+
+		#region DataRowToDictionary
+
+#if !SILVERLIGHT
+
+		public static IDictionary DataRowToDictionary(DataRow sourceRow, IDictionary destDictionary)
+		{
+			return _defaultSchema.MapDataRowToDictionary(sourceRow, destDictionary);
+		}
+
+		public static Hashtable DataRowToDictionary(DataRow sourceRow)
+		{
+			return _defaultSchema.MapDataRowToDictionary(sourceRow);
+		}
+
+		public static IDictionary DataRowToDictionary(
+			DataRow sourceRow, DataRowVersion version, IDictionary destDictionary)
+		{
+			return _defaultSchema.MapDataRowToDictionary(sourceRow, version, destDictionary);
+		}
+
+		public static Hashtable DataRowToDictionary(DataRow sourceRow, DataRowVersion version)
+		{
+			return _defaultSchema.MapDataRowToDictionary(sourceRow, version);
+		}
+
+#endif
+
+		#endregion
+
+		#endregion
+
+		#region DataReader
+
+		#region DataReaderToObject
+
+		public static object DataReaderToObject(IDataReader dataReader, object destObject, params object[] parameters)
+		{
+			return _defaultSchema.MapDataReaderToObject(dataReader, destObject, parameters);
+		}
+
+		public static object DataReaderToObject(IDataReader dataReader, Type destObjectType, params object[] parameters)
+		{
+			return _defaultSchema.MapDataReaderToObject(dataReader, destObjectType, parameters);
+		}
+
+		public static T DataReaderToObject<T>(IDataReader dataReader, params object[] parameters)
+		{
+			return (T)_defaultSchema.MapDataReaderToObject(dataReader, typeof(T), parameters);
+		}
+
+		#endregion
+
+		#region DataReaderToDataRow
+
+#if !SILVERLIGHT
+
+		public static DataRow DataReaderToDataRow(IDataReader dataReader, DataRow destRow)
+		{
+			return _defaultSchema.MapDataReaderToDataRow(dataReader, destRow);
+		}
+
+		public static DataRow DataReaderToDataRow(IDataReader dataReader, DataTable destTable)
+		{
+			return _defaultSchema.MapDataReaderToDataRow(dataReader, destTable);
+		}
+
+#endif
+
+		#endregion
+
+		#region DataReaderToDictionary
+
+		public static IDictionary DataReaderToDictionary(IDataReader dataReader, IDictionary destDictionary)
+		{
+			return _defaultSchema.MapDataReaderToDictionary(dataReader, destDictionary);
+		}
+
+		public static IDictionary DataReaderToDictionary(IDataReader dataReader)
+		{
+			return _defaultSchema.MapDataReaderToDictionary(dataReader);
+		}
+
+		#endregion
+
+		#endregion
+
+		#region Dictionary
+
+		#region DictionaryToObject
+
+		public static object DictionaryToObject(
+			IDictionary sourceDictionary, object destObject, params object[] parameters)
+		{
+			return _defaultSchema.MapDictionaryToObject(sourceDictionary, destObject, parameters);
+		}
+
+		public static object DictionaryToObject(
+			IDictionary sourceDictionary, Type destObjectType, params object[] parameters)
+		{
+			return _defaultSchema.MapDictionaryToObject(sourceDictionary, destObjectType, parameters);
+		}
+
+		public static T DictionaryToObject<T>(IDictionary sourceDictionary, params object[] parameters)
+		{
+			return (T)_defaultSchema.MapDictionaryToObject(sourceDictionary, typeof(T), parameters);
+		}
+
+		#endregion
+
+		#region DictionaryToDataRow
+
+#if !SILVERLIGHT
+
+		public static DataRow DictionaryToDataRow(IDictionary sourceDictionary, DataRow destRow)
+		{
+			return _defaultSchema.MapDictionaryToDataRow(sourceDictionary, destRow);
+		}
+
+		public static DataRow DictionaryToDataRow(IDictionary sourceDictionary, DataTable destTable)
+		{
+			return _defaultSchema.MapDictionaryToDataRow(sourceDictionary, destTable);
+		}
+
+#endif
+
+		#endregion
+
+		#endregion
+
+		#region List
+
+		#region ListToList
+
+		public static IList ListToList(
+			ICollection     sourceList,
+			IList           destList,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			return _defaultSchema.MapListToList(sourceList, destList, destObjectType, parameters);
+		}
+
+		public static IList ListToList(ICollection sourceList, Type destObjectType, params object[] parameters)
+		{
+			return _defaultSchema.MapListToList(sourceList, destObjectType, parameters);
+		}
+
+		public static List<T> ListToList<T>(ICollection sourceList, List<T> destList, params object[] parameters)
+		{
+			return _defaultSchema.MapListToList(sourceList, destList, parameters);
+		}
+
+		public static List<T> ListToList<T>(ICollection sourceList, params object[] parameters)
+		{
+			return _defaultSchema.MapListToList<T>(sourceList, parameters);
+		}
+
+		#endregion
+
+		#region ListToDataTable
+
+#if !SILVERLIGHT
+
+		public static DataTable ListToDataTable(ICollection sourceList, DataTable destTable)
+		{
+			return _defaultSchema.MapListToDataTable(sourceList, destTable);
+		}
+
+		public static DataTable ListToDataTable(ICollection sourceList)
+		{
+			return _defaultSchema.MapListToDataTable(sourceList);
+		}
+
+#endif
+
+		#endregion
+
+		#region MapListToDictionary
+
+		public static IDictionary ListToDictionary(
+			ICollection          sourceList,
+			IDictionary          destDictionary,
+			NameOrIndexParameter keyField,
+			Type                 destObjectType,
+			params object[]      parameters)
+		{
+			return _defaultSchema.MapListToDictionary(
+				sourceList, destDictionary, keyField, destObjectType, parameters);
+		}
+
+		public static IDictionary ListToDictionary(
+			ICollection          sourceList,
+			NameOrIndexParameter keyField,
+			Type                 destObjectType,
+			params object[]      parameters)
+		{
+			return _defaultSchema.MapListToDictionary(sourceList, keyField, destObjectType, parameters);
+		}
+
+		public static IDictionary<TK,T> ListToDictionary<TK,T>(
+			ICollection          sourceList,
+			IDictionary<TK,T>     destDictionary,
+			NameOrIndexParameter keyField,
+			params object[]      parameters)
+		{
+			return _defaultSchema.MapListToDictionary(sourceList, destDictionary, keyField, parameters);
+		}
+
+		public static Dictionary<TK,T> ListToDictionary<TK,T>(
+			ICollection          sourceList,
+			NameOrIndexParameter keyField,
+			params object[]      parameters)
+		{
+			return _defaultSchema.MapListToDictionary<TK,T>(sourceList, keyField, parameters);
+		}
+
+		#endregion
+
+		#region MapListToDictionary (Index)
+
+		public static IDictionary ListToDictionary(
+			ICollection     sourceList,
+			IDictionary     destDictionary,
+			MapIndex        index,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			return _defaultSchema.MapListToDictionary(
+				sourceList, destDictionary, index, destObjectType, parameters);
+		}
+
+		public static IDictionary ListToDictionary(
+			ICollection     sourceList,
+			MapIndex        index,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			return _defaultSchema.MapListToDictionary(sourceList, index, destObjectType, parameters);
+		}
+
+		public static IDictionary<CompoundValue,T> ListToDictionary<T>(
+			ICollection                  sourceList,
+			IDictionary<CompoundValue,T> destDictionary,
+			MapIndex                     index,
+			params object[]              parameters)
+		{
+			return _defaultSchema.MapListToDictionary(sourceList, destDictionary, index, parameters);
+		}
+
+		public static Dictionary<CompoundValue,T> ListToDictionary<T>(
+			ICollection     sourceList,
+			MapIndex        index,
+			params object[] parameters)
+		{
+			return _defaultSchema.MapListToDictionary<T>(sourceList, index, parameters);
+		}
+
+		#endregion
+
+		#endregion
+
+		#region DataTable
+
+		#region DataTableToDataTable
+
+#if !SILVERLIGHT
+
+		public static DataTable DataTableToDataTable(DataTable sourceTable, DataTable destTable)
+		{
+			return _defaultSchema.MapDataTableToDataTable(sourceTable, destTable);
+		}
+
+		public static DataTable DataTableToDataTable(DataTable sourceTable, DataRowVersion version, DataTable destTable)
+		{
+			return _defaultSchema.MapDataTableToDataTable(sourceTable, version, destTable);
+		}
+
+		public static DataTable DataTableToDataTable(DataTable sourceTable)
+		{
+			return _defaultSchema.MapDataTableToDataTable(sourceTable);
+		}
+
+		public static DataTable DataTableToDataTable(DataTable sourceTable, DataRowVersion version)
+		{
+			return _defaultSchema.MapDataTableToDataTable(sourceTable, version);
+		}
+
+#endif
+
+		#endregion
+
+		#region DataTableToList
+
+#if !SILVERLIGHT
+
+		public static IList DataTableToList(
+			DataTable sourceTable, IList list, Type destObjectType, params object[] parameters)
+		{
+			return _defaultSchema.MapDataTableToList(sourceTable, list, destObjectType, parameters);
+		}
+
+		public static IList DataTableToList(
+			DataTable       sourceTable,
+			DataRowVersion  version,
+			IList           list,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			return _defaultSchema.MapDataTableToList(sourceTable, version, list, destObjectType, parameters);
+		}
+
+		public static ArrayList DataTableToList(DataTable sourceTable, Type destObjectType, params object[] parameters)
+		{
+			return _defaultSchema.MapDataTableToList(sourceTable, destObjectType, parameters);
+		}
+
+		public static ArrayList DataTableToList(
+			DataTable sourceTable, DataRowVersion version, Type destObjectType, params object[] parameters)
+		{
+			return _defaultSchema.MapDataTableToList(sourceTable, version, destObjectType, parameters);
+		}
+
+		public static List<T> DataTableToList<T>(DataTable sourceTable, List<T> list, params object[] parameters)
+		{
+			return _defaultSchema.MapDataTableToList(sourceTable, list, parameters);
+		}
+
+		public static List<T> DataTableToList<T>(
+			DataTable       sourceTable,
+			DataRowVersion  version,
+			List<T>         list,
+			params object[] parameters)
+		{
+			return _defaultSchema.MapDataTableToList(sourceTable, version, list, parameters);
+		}
+
+		public static List<T> DataTableToList<T>(DataTable sourceTable, params object[] parameters)
+		{
+			return _defaultSchema.MapDataTableToList<T>(sourceTable, parameters);
+		}
+
+		public static List<T> DataTableToList<T>(DataTable sourceTable, DataRowVersion version, params object[] parameters)
+		{
+			return _defaultSchema.MapDataTableToList<T>(sourceTable, version, parameters);
+		}
+
+#endif
+
+		#endregion
+
+		#region DataTableToDictionary
+
+#if !SILVERLIGHT
+
+		public static IDictionary DataTableToDictionary(
+			DataTable            sourceTable,
+			IDictionary          destDictionary,
+			NameOrIndexParameter keyField,
+			Type                 destObjectType,
+			params object[]      parameters)
+		{
+			return _defaultSchema.MapDataTableToDictionary(
+				sourceTable, destDictionary, keyField, destObjectType, parameters);
+		}
+
+		public static Hashtable DataTableToDictionary(
+			DataTable            sourceTable,
+			NameOrIndexParameter keyField,
+			Type                 destObjectType,
+			params object[]      parameters)
+		{
+			return _defaultSchema.MapDataTableToDictionary(sourceTable, keyField, destObjectType, parameters);
+		}
+
+		public static IDictionary<TK,T> DataTableToDictionary<TK,T>(
+			DataTable            sourceTable,
+			IDictionary<TK,T>     destDictionary,
+			NameOrIndexParameter keyField,
+			params object[]      parameters)
+		{
+			return _defaultSchema.MapDataTableToDictionary(sourceTable, destDictionary, keyField, parameters);
+		}
+
+		public static Dictionary<TK,T> DataTableToDictionary<TK,T>(
+			DataTable            sourceTable,
+			NameOrIndexParameter keyField,
+			params object[]      parameters)
+		{
+			return _defaultSchema.MapDataTableToDictionary<TK,T>(sourceTable, keyField, parameters);
+		}
+
+#endif
+
+		#endregion
+
+		#region DataTableToDictionary (Index)
+
+#if !SILVERLIGHT
+
+		public static IDictionary DataTableToDictionary(
+			DataTable       sourceTable,
+			IDictionary     destDictionary,
+			MapIndex        index,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			return _defaultSchema.MapDataTableToDictionary(
+				sourceTable, destDictionary, index, destObjectType, parameters);
+		}
+
+		public static Hashtable DataTableToDictionary(
+			DataTable       sourceTable,
+			MapIndex        index,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			return _defaultSchema.MapDataTableToDictionary(sourceTable, index, destObjectType, parameters);
+		}
+
+		public static IDictionary<CompoundValue,T> DataTableToDictionary<T>(
+			DataTable                    sourceTable,
+			IDictionary<CompoundValue,T> destDictionary,
+			MapIndex                     index,
+			params object[]              parameters)
+		{
+			return _defaultSchema.MapDataTableToDictionary(sourceTable, destDictionary, index, parameters);
+		}
+
+		public static Dictionary<CompoundValue,T> DataTableToDictionary<T>(
+			DataTable       sourceTable,
+			MapIndex        index,
+			params object[] parameters)
+		{
+			return _defaultSchema.MapDataTableToDictionary<T>(sourceTable, index, parameters);
+		}
+
+#endif
+
+		#endregion
+
+		#endregion
+
+		#region DataReader
+
+		#region DataReaderToList
+
+		public static IList DataReaderToList(
+			IDataReader     reader,
+			IList           list,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			return _defaultSchema.MapDataReaderToList(reader, list, destObjectType, parameters);
+		}
+
+		public static IList DataReaderToList(IDataReader reader, Type destObjectType, params object[] parameters)
+		{
+			return _defaultSchema.MapDataReaderToList(reader, destObjectType, parameters);
+		}
+
+		public static IList<T> DataReaderToList<T>(IDataReader reader, IList<T> list, params object[] parameters)
+		{
+			return _defaultSchema.MapDataReaderToList(reader, list, parameters);
+		}
+
+		public static List<T> DataReaderToList<T>(IDataReader reader, params object[] parameters)
+		{
+			return _defaultSchema.MapDataReaderToList<T>(reader, parameters);
+		}
+
+		#endregion
+
+		#region DataReaderToDataTable
+
+#if !SILVERLIGHT
+
+		public static DataTable DataReaderToDataTable(IDataReader reader, DataTable destTable)
+		{
+			return _defaultSchema.MapDataReaderToDataTable(reader, destTable);
+		}
+
+		public static DataTable DataReaderToDataTable(IDataReader reader)
+		{
+			return _defaultSchema.MapDataReaderToDataTable(reader);
+		}
+
+#endif
+
+		#endregion
+
+		#region DataReaderToDictionary
+
+		public static IDictionary DataReaderToDictionary(
+			IDataReader          dataReader,
+			IDictionary          destDictionary,
+			NameOrIndexParameter keyField,
+			Type                 destObjectType,
+			params object[]      parameters)
+		{
+			return _defaultSchema.MapDataReaderToDictionary(
+				dataReader, destDictionary, keyField, destObjectType, parameters);
+		}
+
+		public static IDictionary DataReaderToDictionary(
+			IDataReader          dataReader,
+			NameOrIndexParameter keyField,
+			Type                 destObjectType,
+			params object[]      parameters)
+		{
+			return _defaultSchema.MapDataReaderToDictionary(dataReader, keyField, destObjectType, parameters);
+		}
+
+		public static IDictionary<TK,T> DataReaderToDictionary<TK,T>(
+			IDataReader          dataReader,
+			IDictionary<TK,T>     destDictionary,
+			NameOrIndexParameter keyField,
+			params object[]      parameters)
+		{
+			return _defaultSchema.MapDataReaderToDictionary(
+				dataReader, destDictionary, keyField, parameters);
+		}
+
+		public static Dictionary<TK,T> DataReaderToDictionary<TK,T>(
+			IDataReader          dataReader,
+			NameOrIndexParameter keyField,
+			params object[]      parameters)
+		{
+			return _defaultSchema.MapDataReaderToDictionary<TK,T>(dataReader, keyField, parameters);
+		}
+
+		#endregion
+
+		#region DataReaderToDictionary (Index)
+
+		public static IDictionary DataReaderToDictionary(
+			IDataReader     dataReader,
+			IDictionary     destDictionary,
+			MapIndex        index,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			return _defaultSchema.MapDataReaderToDictionary(
+				dataReader, destDictionary, index, destObjectType, parameters);
+		}
+
+		public static IDictionary DataReaderToDictionary(
+			IDataReader     dataReader,
+			MapIndex        index,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			return _defaultSchema.MapDataReaderToDictionary(dataReader, index, destObjectType, parameters);
+		}
+
+		public static IDictionary<CompoundValue,T> DataReaderToDictionary<T>(
+			IDataReader                  dataReader,
+			IDictionary<CompoundValue,T> destDictionary,
+			MapIndex                     index,
+			params object[]              parameters)
+		{
+			return _defaultSchema.MapDataReaderToDictionary(dataReader, destDictionary, index, parameters);
+		}
+
+		public static Dictionary<CompoundValue,T> DataReaderToDictionary<T>(
+			IDataReader     dataReader,
+			MapIndex        index,
+			params object[] parameters)
+		{
+			return _defaultSchema.MapDataReaderToDictionary<T>(dataReader, index, parameters);
+		}
+
+		#endregion
+
+		#endregion
+
+		#region Dictionary
+
+		#region DictionaryToList
+
+		public static IList DictionaryToList(
+			IDictionary     sourceDictionary,
+			IList           destList,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			return _defaultSchema.MapDictionaryToList(sourceDictionary, destList, destObjectType, parameters);
+		}
+
+		public static IList DictionaryToList(
+			IDictionary     sourceDictionary,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			return _defaultSchema.MapDictionaryToList(sourceDictionary, destObjectType, parameters);
+		}
+
+		public static List<T> DictionaryToList<T>(
+			IDictionary     sourceDictionary,
+			List<T>         destList,
+			params object[] parameters)
+		{
+			return _defaultSchema.MapDictionaryToList(sourceDictionary, destList, parameters);
+		}
+
+		public static List<T> DictionaryToList<T>(IDictionary sourceDictionary, params object[] parameters)
+		{
+			return _defaultSchema.MapDictionaryToList<T>(sourceDictionary, parameters);
+		}
+
+		#endregion
+
+		#region DictionaryToDataTable
+
+#if !SILVERLIGHT
+
+		public static DataTable DictionaryToDataTable(IDictionary sourceDictionary, DataTable destTable)
+		{
+			return _defaultSchema.MapDictionaryToDataTable(sourceDictionary, destTable);
+		}
+
+		public static DataTable DictionaryToDataTable(IDictionary sourceDictionary)
+		{
+			return _defaultSchema.MapDictionaryToDataTable(sourceDictionary);
+		}
+
+#endif
+
+		#endregion
+
+		#region DictionaryToDictionary
+
+		public static IDictionary DictionaryToDictionary(
+			IDictionary          sourceDictionary,
+			IDictionary          destDictionary,
+			NameOrIndexParameter keyField,
+			Type                 destObjectType,
+			params object[]      parameters)
+		{
+			return _defaultSchema.MapDictionaryToDictionary(
+				sourceDictionary, destDictionary, keyField, destObjectType, parameters);
+		}
+
+		public static IDictionary DictionaryToDictionary(
+			IDictionary          sourceDictionary,
+			NameOrIndexParameter keyField,
+			Type                 destObjectType,
+			params object[]      parameters)
+		{
+			return _defaultSchema.MapDictionaryToDictionary(
+				sourceDictionary, keyField, destObjectType, parameters);
+		}
+
+		public static IDictionary<TK,T> DictionaryToDictionary<TK,T>(
+			IDictionary          sourceDictionary,
+			IDictionary<TK,T>    destDictionary,
+			NameOrIndexParameter keyField,
+			params object[]      parameters)
+		{
+			return _defaultSchema.MapDictionaryToDictionary(sourceDictionary, destDictionary, keyField, parameters);
+		}
+
+		public static Dictionary<TK,T> DictionaryToDictionary<TK,T>(
+			IDictionary          sourceDictionary,
+			NameOrIndexParameter keyField,
+			params object[]      parameters)
+		{
+			return _defaultSchema.MapDictionaryToDictionary<TK,T>(sourceDictionary, keyField, parameters);
+		}
+
+		#endregion
+
+		#region DictionaryToDictionary (Index)
+
+		public static IDictionary DictionaryToDictionary(
+			IDictionary     sourceDictionary,
+			IDictionary     destDictionary,
+			MapIndex        index,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			return _defaultSchema.MapDictionaryToDictionary(
+				sourceDictionary, destDictionary, index, destObjectType, parameters);
+		}
+
+		public static IDictionary DictionaryToDictionary(
+			IDictionary     sourceDictionary,
+			MapIndex        index,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			return _defaultSchema.MapDictionaryToDictionary(sourceDictionary, index, destObjectType, parameters);
+		}
+
+		public static IDictionary<CompoundValue,T> DictionaryToDictionary<T>(
+			IDictionary                  sourceDictionary,
+			IDictionary<CompoundValue,T> destDictionary,
+			MapIndex                     index,
+			params object[]              parameters)
+		{
+			return _defaultSchema.MapDictionaryToDictionary(sourceDictionary, destDictionary, index, parameters);
+		}
+
+		public static Dictionary<CompoundValue,T> DictionaryToDictionary<T>(
+			IDictionary     sourceDictionary,
+			MapIndex        index,
+			params object[] parameters)
+		{
+			return _defaultSchema.MapDictionaryToDictionary<T>(sourceDictionary, index, parameters);
+		}
+
+		#endregion
+
+		#endregion
+
+		#region ToResultSet
+
+		public static void ResultSets(MapResultSet[] resultSets)
+		{
+			_defaultSchema.MapResultSets(resultSets);//, true);
+		}
+
+		//public static void ResultSets(MapResultSet[] resultSets, bool throwException)
+		//{
+		//    _defaultSchema.MapResultSets(resultSets, throwException);
+		//}
+
+		//public static void DataReaderToResultSet(IDataReader reader, MapResultSet[] resultSets)
+		//{
+		//    _defaultSchema.MapDataReaderToResultSet(reader, resultSets, true);
+		//}
+
+		//public static void DataReaderToResultSet(
+		//    IDataReader reader, MapResultSet[] resultSets, bool throwException)
+		//{
+		//    _defaultSchema.MapDataReaderToResultSet(reader, resultSets, throwException);
+		//}
+
+		//public static void DataSetToResultSet(DataSet dataSet, MapResultSet[] resultSets)
+		//{
+		//    _defaultSchema.MapDataSetToResultSet(dataSet, resultSets, true);
+		//}
+
+		//public static void DataSetToResultSet(
+		//    DataSet dataSet, MapResultSet[] resultSets, bool throwException)
+		//{
+		//    _defaultSchema.MapDataSetToResultSet(dataSet, resultSets, throwException);
+		//}
+
+		//public static MapResultSet[] Clone(MapResultSet[] resultSets)
+		//{
+		//    return _defaultSchema.Clone(resultSets);
+		//}
+
+		//public static MapResultSet[] ConvertToResultSet(Type masterType, params MapNextResult[] nextResults)
+		//{
+		//    return _defaultSchema.ConvertToResultSet(masterType, nextResults);
+		//}
+
+		#endregion
+
+		#region CreateInstance
+
+		public static object CreateInstance(Type type)
+		{
+			return TypeAccessor.CreateInstanceEx(type);
+		}
+
+		public static T CreateInstance<T>()
+		{
+			return TypeAccessor<T>.CreateInstanceEx();
+		}
+
+		#endregion
+
+		#region GetObjectMapper
+
+		public static Func<TSource,TDest> GetObjectMapper<TSource,TDest>()
+		{
+			return _defaultSchema.GetObjectMapper<TSource,TDest>();
+		}
+
+		public static Func<TSource,TDest> GetObjectMapper<TSource,TDest>(bool deepCopy)
+		{
+			return _defaultSchema.GetObjectMapper<TSource,TDest>(deepCopy);
+		}
+
+		public static Func<TSource,TDest> GetObjectMapper<TSource,TDest>(bool deepCopy, bool includeComplexMapping)
+		{
+			return _defaultSchema.GetObjectMapper<TSource,TDest>(deepCopy, includeComplexMapping);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MapDataDestinationBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,91 @@
+using System;
+using System.Data.SqlTypes;
+
+namespace BLToolkit.Mapping
+{
+	public abstract class MapDataDestinationBase : IMapDataDestination
+	{
+		#region IMapDataDestination Members
+
+		public abstract Type GetFieldType(int index);
+
+		public abstract int  GetOrdinal  (string name);
+		public abstract void SetValue    (object o, int index, object value);
+		public abstract void SetValue    (object o, string name, object value);
+
+		public virtual  void SetNull     (object o, int index) { SetValue(o, index, null); }
+
+		public virtual  bool SupportsTypedValues(int index)    { return true; }
+
+		// Simple types setters.
+		//
+		[CLSCompliant(false)]
+		public virtual  void SetSByte    (object o, int index, SByte    value) { SetValue(o, index, value); }
+		public virtual  void SetInt16    (object o, int index, Int16    value) { SetValue(o, index, value); }
+		public virtual  void SetInt32    (object o, int index, Int32    value) { SetValue(o, index, value); }
+		public virtual  void SetInt64    (object o, int index, Int64    value) { SetValue(o, index, value); }
+
+		public virtual  void SetByte     (object o, int index, Byte     value) { SetValue(o, index, value); }
+		[CLSCompliant(false)]
+		public virtual  void SetUInt16   (object o, int index, UInt16   value) { SetValue(o, index, value); }
+		[CLSCompliant(false)]
+		public virtual  void SetUInt32   (object o, int index, UInt32   value) { SetValue(o, index, value); }
+		[CLSCompliant(false)]
+		public virtual  void SetUInt64   (object o, int index, UInt64   value) { SetValue(o, index, value); }
+
+		public virtual  void SetBoolean  (object o, int index, Boolean  value) { SetValue(o, index, value); }
+		public virtual  void SetChar     (object o, int index, Char     value) { SetValue(o, index, value); }
+		public virtual  void SetSingle   (object o, int index, Single   value) { SetValue(o, index, value); }
+		public virtual  void SetDouble   (object o, int index, Double   value) { SetValue(o, index, value); }
+		public virtual  void SetDecimal  (object o, int index, Decimal  value) { SetValue(o, index, value); }
+		public virtual  void SetGuid     (object o, int index, Guid     value) { SetValue(o, index, value); }
+		public virtual  void SetDateTime (object o, int index, DateTime value) { SetValue(o, index, value); }
+		public virtual void SetDateTimeOffset(object o, int index, DateTimeOffset value) { SetValue(o, index, value); }
+
+		// Nullable types setters.
+		//
+		[CLSCompliant(false)]
+		public virtual void SetNullableSByte   (object o, int index, SByte?    value) { SetValue(o, index, value); }
+		public virtual void SetNullableInt16   (object o, int index, Int16?    value) { SetValue(o, index, value); }
+		public virtual void SetNullableInt32   (object o, int index, Int32?    value) { SetValue(o, index, value); }
+		public virtual void SetNullableInt64   (object o, int index, Int64?    value) { SetValue(o, index, value); }
+
+		public virtual void SetNullableByte    (object o, int index, Byte?     value) { SetValue(o, index, value); }
+		[CLSCompliant(false)]
+		public virtual void SetNullableUInt16  (object o, int index, UInt16?   value) { SetValue(o, index, value); }
+		[CLSCompliant(false)]
+		public virtual void SetNullableUInt32  (object o, int index, UInt32?   value) { SetValue(o, index, value); }
+		[CLSCompliant(false)]
+		public virtual void SetNullableUInt64  (object o, int index, UInt64?   value) { SetValue(o, index, value); }
+
+		public virtual void SetNullableBoolean (object o, int index, Boolean?  value) { SetValue(o, index, value); }
+		public virtual void SetNullableChar    (object o, int index, Char?     value) { SetValue(o, index, value); }
+		public virtual void SetNullableSingle  (object o, int index, Single?   value) { SetValue(o, index, value); }
+		public virtual void SetNullableDouble  (object o, int index, Double?   value) { SetValue(o, index, value); }
+		public virtual void SetNullableDecimal (object o, int index, Decimal?  value) { SetValue(o, index, value); }
+		public virtual void SetNullableGuid    (object o, int index, Guid?     value) { SetValue(o, index, value); }
+		public virtual void SetNullableDateTime(object o, int index, DateTime? value) { SetValue(o, index, value); }
+		public virtual void SetNullableDateTimeOffset(object o, int index, DateTimeOffset? value) { SetValue(o, index, value); }
+
+#if !SILVERLIGHT
+
+		// SQL type setters.
+		//
+		public virtual void SetSqlByte    (object o, int index, SqlByte     value) { SetValue(o, index, value); }
+		public virtual void SetSqlInt16   (object o, int index, SqlInt16    value) { SetValue(o, index, value); }
+		public virtual void SetSqlInt32   (object o, int index, SqlInt32    value) { SetValue(o, index, value); }
+		public virtual void SetSqlInt64   (object o, int index, SqlInt64    value) { SetValue(o, index, value); }
+		public virtual void SetSqlSingle  (object o, int index, SqlSingle   value) { SetValue(o, index, value); }
+		public virtual void SetSqlBoolean (object o, int index, SqlBoolean  value) { SetValue(o, index, value); }
+		public virtual void SetSqlDouble  (object o, int index, SqlDouble   value) { SetValue(o, index, value); }
+		public virtual void SetSqlDateTime(object o, int index, SqlDateTime value) { SetValue(o, index, value); }
+		public virtual void SetSqlDecimal (object o, int index, SqlDecimal  value) { SetValue(o, index, value); }
+		public virtual void SetSqlMoney   (object o, int index, SqlMoney    value) { SetValue(o, index, value); }
+		public virtual void SetSqlGuid    (object o, int index, SqlGuid     value) { SetValue(o, index, value); }
+		public virtual void SetSqlString  (object o, int index, SqlString   value) { SetValue(o, index, value); }
+
+#endif
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MapDataSourceBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,92 @@
+using System;
+using System.Data.SqlTypes;
+
+namespace BLToolkit.Mapping
+{
+	public abstract class MapDataSourceBase : IMapDataSource
+	{
+		#region IMapDataSource Members
+
+		public abstract int      Count { get; }
+		public abstract Type     GetFieldType(int index);
+		public abstract string   GetName     (int index);
+		public abstract int      GetOrdinal  (string name);
+		public abstract object   GetValue    (object o, int index);
+		public abstract object   GetValue    (object o, string name);
+
+		public virtual  bool     IsNull      (object o, int index) { return GetValue(o, index) == null; }
+
+		public virtual  bool     SupportsTypedValues(int index)   { return true; }
+
+		// Simple type getters.
+		//
+		[CLSCompliant(false)]
+		public virtual  SByte    GetSByte    (object o, int index) { return Map.DefaultSchema.ConvertToSByte   (GetValue(o, index)); }
+		public virtual  Int16    GetInt16    (object o, int index) { return Map.DefaultSchema.ConvertToInt16   (GetValue(o, index)); }
+		public virtual  Int32    GetInt32    (object o, int index) { return Map.DefaultSchema.ConvertToInt32   (GetValue(o, index)); }
+		public virtual  Int64    GetInt64    (object o, int index) { return Map.DefaultSchema.ConvertToInt64   (GetValue(o, index)); }
+
+		public virtual  Byte     GetByte     (object o, int index) { return Map.DefaultSchema.ConvertToByte    (GetValue(o, index)); }
+		[CLSCompliant(false)]
+		public virtual  UInt16   GetUInt16   (object o, int index) { return Map.DefaultSchema.ConvertToUInt16  (GetValue(o, index)); }
+		[CLSCompliant(false)]
+		public virtual  UInt32   GetUInt32   (object o, int index) { return Map.DefaultSchema.ConvertToUInt32  (GetValue(o, index)); }
+		[CLSCompliant(false)]
+		public virtual  UInt64   GetUInt64   (object o, int index) { return Map.DefaultSchema.ConvertToUInt64  (GetValue(o, index)); }
+
+		public virtual  Boolean  GetBoolean  (object o, int index) { return Map.DefaultSchema.ConvertToBoolean (GetValue(o, index)); }
+		public virtual  Char     GetChar     (object o, int index) { return Map.DefaultSchema.ConvertToChar    (GetValue(o, index)); }
+		public virtual  Single   GetSingle   (object o, int index) { return Map.DefaultSchema.ConvertToSingle  (GetValue(o, index)); }
+		public virtual  Double   GetDouble   (object o, int index) { return Map.DefaultSchema.ConvertToDouble  (GetValue(o, index)); }
+		public virtual  Decimal  GetDecimal  (object o, int index) { return Map.DefaultSchema.ConvertToDecimal (GetValue(o, index)); }
+		public virtual  Guid     GetGuid     (object o, int index) { return Map.DefaultSchema.ConvertToGuid    (GetValue(o, index)); }
+		public virtual  DateTime GetDateTime (object o, int index) { return Map.DefaultSchema.ConvertToDateTime(GetValue(o, index)); }
+		public virtual DateTimeOffset GetDateTimeOffset(object o, int index) { return Map.DefaultSchema.ConvertToDateTimeOffset(GetValue(o, index)); }
+
+		// Nullable type getters.
+		//
+		[CLSCompliant(false)]
+		public virtual SByte?    GetNullableSByte   (object o, int index) { return Map.DefaultSchema.ConvertToNullableSByte   (GetValue(o, index)); }
+		public virtual Int16?    GetNullableInt16   (object o, int index) { return Map.DefaultSchema.ConvertToNullableInt16   (GetValue(o, index)); }
+		public virtual Int32?    GetNullableInt32   (object o, int index) { return Map.DefaultSchema.ConvertToNullableInt32   (GetValue(o, index)); }
+		public virtual Int64?    GetNullableInt64   (object o, int index) { return Map.DefaultSchema.ConvertToNullableInt64   (GetValue(o, index)); }
+
+		public virtual Byte?     GetNullableByte    (object o, int index) { return Map.DefaultSchema.ConvertToNullableByte    (GetValue(o, index)); }
+		[CLSCompliant(false)]
+		public virtual UInt16?   GetNullableUInt16  (object o, int index) { return Map.DefaultSchema.ConvertToNullableUInt16  (GetValue(o, index)); }
+		[CLSCompliant(false)]
+		public virtual UInt32?   GetNullableUInt32  (object o, int index) { return Map.DefaultSchema.ConvertToNullableUInt32  (GetValue(o, index)); }
+		[CLSCompliant(false)]
+		public virtual UInt64?   GetNullableUInt64  (object o, int index) { return Map.DefaultSchema.ConvertToNullableUInt64  (GetValue(o, index)); }
+
+		public virtual Boolean?  GetNullableBoolean (object o, int index) { return Map.DefaultSchema.ConvertToNullableBoolean (GetValue(o, index)); }
+		public virtual Char?     GetNullableChar    (object o, int index) { return Map.DefaultSchema.ConvertToNullableChar    (GetValue(o, index)); }
+		public virtual Single?   GetNullableSingle  (object o, int index) { return Map.DefaultSchema.ConvertToNullableSingle  (GetValue(o, index)); }
+		public virtual Double?   GetNullableDouble  (object o, int index) { return Map.DefaultSchema.ConvertToNullableDouble  (GetValue(o, index)); }
+		public virtual Decimal?  GetNullableDecimal (object o, int index) { return Map.DefaultSchema.ConvertToNullableDecimal (GetValue(o, index)); }
+		public virtual Guid?     GetNullableGuid    (object o, int index) { return Map.DefaultSchema.ConvertToNullableGuid    (GetValue(o, index)); }
+		public virtual DateTime? GetNullableDateTime(object o, int index) { return Map.DefaultSchema.ConvertToNullableDateTime(GetValue(o, index)); }
+		public virtual DateTimeOffset? GetNullableDateTimeOffset(object o, int index) { return Map.DefaultSchema.ConvertToNullableDateTimeOffset(GetValue(o, index)); }
+
+#if !SILVERLIGHT
+
+		// SQL type getters.
+		//
+		public virtual SqlByte     GetSqlByte     (object o, int index) { return Map.DefaultSchema.ConvertToSqlByte    (GetValue(o, index)); }
+		public virtual SqlInt16    GetSqlInt16    (object o, int index) { return Map.DefaultSchema.ConvertToSqlInt16   (GetValue(o, index)); }
+		public virtual SqlInt32    GetSqlInt32    (object o, int index) { return Map.DefaultSchema.ConvertToSqlInt32   (GetValue(o, index)); }
+		public virtual SqlInt64    GetSqlInt64    (object o, int index) { return Map.DefaultSchema.ConvertToSqlInt64   (GetValue(o, index)); }
+		public virtual SqlSingle   GetSqlSingle   (object o, int index) { return Map.DefaultSchema.ConvertToSqlSingle  (GetValue(o, index)); }
+		public virtual SqlBoolean  GetSqlBoolean  (object o, int index) { return Map.DefaultSchema.ConvertToSqlBoolean (GetValue(o, index)); }
+		public virtual SqlDouble   GetSqlDouble   (object o, int index) { return Map.DefaultSchema.ConvertToSqlDouble  (GetValue(o, index)); }
+		public virtual SqlDateTime GetSqlDateTime (object o, int index) { return Map.DefaultSchema.ConvertToSqlDateTime(GetValue(o, index)); }
+		public virtual SqlDecimal  GetSqlDecimal  (object o, int index) { return Map.DefaultSchema.ConvertToSqlDecimal (GetValue(o, index)); }
+		public virtual SqlMoney    GetSqlMoney    (object o, int index) { return Map.DefaultSchema.ConvertToSqlMoney   (GetValue(o, index)); }
+		public virtual SqlGuid     GetSqlGuid     (object o, int index) { return Map.DefaultSchema.ConvertToSqlGuid    (GetValue(o, index)); }
+		public virtual SqlString   GetSqlString   (object o, int index) { return Map.DefaultSchema.ConvertToSqlString  (GetValue(o, index)); }
+
+#endif
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MapDataSourceDestinationBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,86 @@
+using System;
+using System.Data.SqlTypes;
+
+namespace BLToolkit.Mapping
+{
+	public abstract class MapDataSourceDestinationBase : MapDataSourceBase, IMapDataDestination
+	{
+		#region IMapDataDestination Members
+
+		public abstract void SetValue  (object o, int index, object value);
+		public abstract void SetValue  (object o, string name, object value);
+
+		public virtual  void SetNull   (object o, int index)                { SetValue(o, index, null); }
+
+		// Simple types setters.
+		//
+		[CLSCompliant(false)]
+		public virtual void SetSByte   (object o, int index, SByte    value) { SetValue(o, index, value); }
+		public virtual void SetInt16   (object o, int index, Int16    value) { SetValue(o, index, value); }
+		public virtual void SetInt32   (object o, int index, Int32    value) { SetValue(o, index, value); }
+		public virtual void SetInt64   (object o, int index, Int64    value) { SetValue(o, index, value); }
+
+		public virtual void SetByte    (object o, int index, Byte     value) { SetValue(o, index, value); }
+		[CLSCompliant(false)]
+		public virtual void SetUInt16  (object o, int index, UInt16   value) { SetValue(o, index, value); }
+		[CLSCompliant(false)]
+		public virtual void SetUInt32  (object o, int index, UInt32   value) { SetValue(o, index, value); }
+		[CLSCompliant(false)]
+		public virtual void SetUInt64  (object o, int index, UInt64   value) { SetValue(o, index, value); }
+
+		public virtual void SetBoolean (object o, int index, Boolean  value) { SetValue(o, index, value); }
+		public virtual void SetChar    (object o, int index, Char     value) { SetValue(o, index, value); }
+		public virtual void SetSingle  (object o, int index, Single   value) { SetValue(o, index, value); }
+		public virtual void SetDouble  (object o, int index, Double   value) { SetValue(o, index, value); }
+		public virtual void SetDecimal (object o, int index, Decimal  value) { SetValue(o, index, value); }
+		public virtual void SetGuid    (object o, int index, Guid     value) { SetValue(o, index, value); }
+		public virtual void SetDateTime(object o, int index, DateTime value) { SetValue(o, index, value); }
+		public virtual void SetDateTimeOffset(object o, int index, DateTimeOffset value) { SetValue(o, index, value); }
+
+		// Nullable types setters.
+		//
+		[CLSCompliant(false)]
+		public virtual void SetNullableSByte   (object o, int index, SByte?    value) { SetValue(o, index, value); }
+		public virtual void SetNullableInt16   (object o, int index, Int16?    value) { SetValue(o, index, value); }
+		public virtual void SetNullableInt32   (object o, int index, Int32?    value) { SetValue(o, index, value); }
+		public virtual void SetNullableInt64   (object o, int index, Int64?    value) { SetValue(o, index, value); }
+
+		public virtual void SetNullableByte    (object o, int index, Byte?     value) { SetValue(o, index, value); }
+		[CLSCompliant(false)]
+		public virtual void SetNullableUInt16  (object o, int index, UInt16?   value) { SetValue(o, index, value); }
+		[CLSCompliant(false)]
+		public virtual void SetNullableUInt32  (object o, int index, UInt32?   value) { SetValue(o, index, value); }
+		[CLSCompliant(false)]
+		public virtual void SetNullableUInt64  (object o, int index, UInt64?   value) { SetValue(o, index, value); }
+
+		public virtual void SetNullableBoolean (object o, int index, Boolean?  value) { SetValue(o, index, value); }
+		public virtual void SetNullableChar    (object o, int index, Char?     value) { SetValue(o, index, value); }
+		public virtual void SetNullableSingle  (object o, int index, Single?   value) { SetValue(o, index, value); }
+		public virtual void SetNullableDouble  (object o, int index, Double?   value) { SetValue(o, index, value); }
+		public virtual void SetNullableDecimal (object o, int index, Decimal?  value) { SetValue(o, index, value); }
+		public virtual void SetNullableGuid    (object o, int index, Guid?     value) { SetValue(o, index, value); }
+		public virtual void SetNullableDateTime(object o, int index, DateTime? value) { SetValue(o, index, value); }
+		public virtual void SetNullableDateTimeOffset(object o, int index, DateTimeOffset? value) { SetValue(o, index, value); }
+
+#if !SILVERLIGHT
+
+		// SQL type setters.
+		//
+		public virtual void SetSqlByte    (object o, int index, SqlByte     value) { SetValue(o, index, value); }
+		public virtual void SetSqlInt16   (object o, int index, SqlInt16    value) { SetValue(o, index, value); }
+		public virtual void SetSqlInt32   (object o, int index, SqlInt32    value) { SetValue(o, index, value); }
+		public virtual void SetSqlInt64   (object o, int index, SqlInt64    value) { SetValue(o, index, value); }
+		public virtual void SetSqlSingle  (object o, int index, SqlSingle   value) { SetValue(o, index, value); }
+		public virtual void SetSqlBoolean (object o, int index, SqlBoolean  value) { SetValue(o, index, value); }
+		public virtual void SetSqlDouble  (object o, int index, SqlDouble   value) { SetValue(o, index, value); }
+		public virtual void SetSqlDateTime(object o, int index, SqlDateTime value) { SetValue(o, index, value); }
+		public virtual void SetSqlDecimal (object o, int index, SqlDecimal  value) { SetValue(o, index, value); }
+		public virtual void SetSqlMoney   (object o, int index, SqlMoney    value) { SetValue(o, index, value); }
+		public virtual void SetSqlGuid    (object o, int index, SqlGuid     value) { SetValue(o, index, value); }
+		public virtual void SetSqlString  (object o, int index, SqlString   value) { SetValue(o, index, value); }
+
+#endif
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MapFieldAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,32 @@
+using System;
+
+namespace BLToolkit.Mapping
+{
+	[AttributeUsage(
+		AttributeTargets.Field | AttributeTargets.Property |
+		AttributeTargets.Class | AttributeTargets.Interface,
+		AllowMultiple=true)]
+	public class MapFieldAttribute : Attribute
+	{
+		public MapFieldAttribute()
+		{
+		}
+
+		public MapFieldAttribute(string mapName)
+		{
+			MapName = mapName;
+		}
+
+		public MapFieldAttribute(string mapName, string origName)
+		{
+			MapName  = mapName;
+			OrigName = origName;
+		}
+
+		public string MapName                    { get; set; }
+		public string OrigName                   { get; set; }
+		public string Format                     { get; set; }
+		public string Storage                    { get; set; }
+		public bool   IsInheritanceDiscriminator { get; set; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MapGetDataT.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,227 @@
+using System;
+using System.Data.SqlTypes;
+
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Mapping
+{
+	[CLSCompliant(false)]
+	public static class MapGetData<T>
+	{
+		public abstract class MB<V>
+		{
+			public abstract V From(IMapDataSource s, object o, int i);
+		}
+
+		public static T From(IMapDataSource s, object o, int i)
+		{
+			return I.From(s, o, i);
+		}
+
+		public  static MB<T> I = GetGetter();
+		private static MB<T>     GetGetter()
+		{
+			Type t = typeof(T);
+
+			// Scalar Types.
+			//
+			if (t == typeof(SByte))        return (MB<T>)(object)(new I8());
+			if (t == typeof(Int16))        return (MB<T>)(object)(new I16());
+			if (t == typeof(Int32))        return (MB<T>)(object)(new I32());
+			if (t == typeof(Int64))        return (MB<T>)(object)(new I64());
+
+			if (t == typeof(Byte))         return (MB<T>)(object)(new U8());
+			if (t == typeof(UInt16))       return (MB<T>)(object)(new U16());
+			if (t == typeof(UInt32))       return (MB<T>)(object)(new U32());
+			if (t == typeof(UInt64))       return (MB<T>)(object)(new U64());
+
+			if (t == typeof(Single))       return (MB<T>)(object)(new R4());
+			if (t == typeof(Double))       return (MB<T>)(object)(new R8());
+
+			if (t == typeof(Boolean))      return (MB<T>)(object)(new B());
+			if (t == typeof(Decimal))      return (MB<T>)(object)(new D());
+
+			if (t == typeof(Char))         return (MB<T>)(object)(new C());
+			if (t == typeof(Guid))         return (MB<T>)(object)(new G());
+			if (t == typeof(DateTime))     return (MB<T>)(object)(new DT());
+			if (t == typeof(DateTimeOffset)) return (MB<T>)(object)(new DTO());
+
+			// Enums.
+			//
+			if (t.IsEnum)
+			{
+				t = Enum.GetUnderlyingType(t);
+
+				if (t == typeof(SByte))        return new EI8<T>();
+				if (t == typeof(Int16))        return new EI16<T>();
+				if (t == typeof(Int32))        return new EI32<T>();
+				if (t == typeof(Int64))        return new EI64<T>();
+
+				if (t == typeof(Byte))         return new EU8<T>();
+				if (t == typeof(UInt16))       return new EU16<T>();
+				if (t == typeof(UInt32))       return new EU32<T>();
+				if (t == typeof(UInt64))       return new EU64<T>();
+			}
+
+			// Nullable Types.
+			//
+			if (t == typeof(SByte?))       return (MB<T>)(object)(new NI8());
+			if (t == typeof(Int16?))       return (MB<T>)(object)(new NI16());
+			if (t == typeof(Int32?))       return (MB<T>)(object)(new NI32());
+			if (t == typeof(Int64?))       return (MB<T>)(object)(new NI64());
+
+			if (t == typeof(Byte?))        return (MB<T>)(object)(new NU8());
+			if (t == typeof(UInt16?))      return (MB<T>)(object)(new NU16());
+			if (t == typeof(UInt32?))      return (MB<T>)(object)(new NU32());
+			if (t == typeof(UInt64?))      return (MB<T>)(object)(new NU64());
+
+			if (t == typeof(Single?))      return (MB<T>)(object)(new NR4());
+			if (t == typeof(Double?))      return (MB<T>)(object)(new NR8());
+
+			if (t == typeof(Boolean?))     return (MB<T>)(object)(new NB());
+			if (t == typeof(Decimal?))     return (MB<T>)(object)(new ND());
+
+			if (t == typeof(Char?))        return (MB<T>)(object)(new NC());
+			if (t == typeof(Guid?))        return (MB<T>)(object)(new NG());
+			if (t == typeof(DateTime?))    return (MB<T>)(object)(new NDT());
+			if (t == typeof(DateTimeOffset?)) return (MB<T>)(object)(new NDTO());
+
+			// Nullable Enums.
+			//
+			if (TypeHelper.IsNullable(t) && Nullable.GetUnderlyingType(t).IsEnum)
+			{
+				Type enumType = Nullable.GetUnderlyingType(t);
+				t = Enum.GetUnderlyingType(enumType);
+
+				if (t == typeof(SByte))  return (MB<T>)Activator.CreateInstance(typeof(NEI8<>).MakeGenericType(typeof(T), enumType));
+				if (t == typeof(Int16))  return (MB<T>)Activator.CreateInstance(typeof(NEI16<>).MakeGenericType(typeof(T), enumType));
+				if (t == typeof(Int32))  return (MB<T>)Activator.CreateInstance(typeof(NEI32<>).MakeGenericType(typeof(T), enumType));
+				if (t == typeof(Int64))  return (MB<T>)Activator.CreateInstance(typeof(NEI64<>).MakeGenericType(typeof(T), enumType));
+
+				if (t == typeof(Byte))   return (MB<T>)Activator.CreateInstance(typeof(NEU8<>).MakeGenericType(typeof(T), enumType));
+				if (t == typeof(UInt16)) return (MB<T>)Activator.CreateInstance(typeof(NEU16<>).MakeGenericType(typeof(T), enumType));
+				if (t == typeof(UInt32)) return (MB<T>)Activator.CreateInstance(typeof(NEU32<>).MakeGenericType(typeof(T), enumType));
+				if (t == typeof(UInt64)) return (MB<T>)Activator.CreateInstance(typeof(NEU64<>).MakeGenericType(typeof(T), enumType));
+			}
+
+#if !SILVERLIGHT
+
+			// SqlTypes.
+			//
+			if (t == typeof(SqlString))    return (MB<T>)(object)(new dbS());
+
+			if (t == typeof(SqlByte))      return (MB<T>)(object)(new dbU8());
+			if (t == typeof(SqlInt16))     return (MB<T>)(object)(new dbI16());
+			if (t == typeof(SqlInt32))     return (MB<T>)(object)(new dbI32());
+			if (t == typeof(SqlInt64))     return (MB<T>)(object)(new dbI64());
+
+			if (t == typeof(SqlSingle))    return (MB<T>)(object)(new dbR4());
+			if (t == typeof(SqlDouble))    return (MB<T>)(object)(new dbR8());
+			if (t == typeof(SqlDecimal))   return (MB<T>)(object)(new dbD());
+			if (t == typeof(SqlMoney))     return (MB<T>)(object)(new dbM());
+
+			if (t == typeof(SqlBoolean))   return (MB<T>)(object)(new dbB());
+			if (t == typeof(SqlGuid))      return (MB<T>)(object)(new dbG());
+			if (t == typeof(SqlDateTime))  return (MB<T>)(object)(new dbDT());
+
+#endif
+
+			return new Default<T>();
+		}
+
+		// Default setter.
+		//
+		public sealed class Default<V> : MB<V>     { public override V           From(IMapDataSource s, object o, int i) { return (V)s.GetValue    (o, i); } }
+
+		// Scalar Types.
+		//
+		sealed class I8          : MB<SByte>       { public override SByte       From(IMapDataSource s, object o, int i) { return s.GetSByte       (o, i); } }
+		sealed class I16         : MB<Int16>       { public override Int16       From(IMapDataSource s, object o, int i) { return s.GetInt16       (o, i); } }
+		sealed class I32         : MB<Int32>       { public override Int32       From(IMapDataSource s, object o, int i) { return s.GetInt32       (o, i); } }
+		sealed class I64         : MB<Int64>       { public override Int64       From(IMapDataSource s, object o, int i) { return s.GetInt64       (o, i); } }
+
+		sealed class U8          : MB<Byte>        { public override Byte        From(IMapDataSource s, object o, int i) { return s.GetByte        (o, i); } }
+		sealed class U16         : MB<UInt16>      { public override UInt16      From(IMapDataSource s, object o, int i) { return s.GetUInt16      (o, i); } }
+		sealed class U32         : MB<UInt32>      { public override UInt32      From(IMapDataSource s, object o, int i) { return s.GetUInt32      (o, i); } }
+		sealed class U64         : MB<UInt64>      { public override UInt64      From(IMapDataSource s, object o, int i) { return s.GetUInt64      (o, i); } }
+
+		sealed class R4          : MB<Single>      { public override Single      From(IMapDataSource s, object o, int i) { return s.GetSingle      (o, i); } }
+		sealed class R8          : MB<Double>      { public override Double      From(IMapDataSource s, object o, int i) { return s.GetDouble      (o, i); } }
+
+		sealed class B           : MB<Boolean>     { public override Boolean     From(IMapDataSource s, object o, int i) { return s.GetBoolean     (o, i); } }
+		sealed class D           : MB<Decimal>     { public override Decimal     From(IMapDataSource s, object o, int i) { return s.GetDecimal     (o, i); } }
+
+		sealed class C           : MB<Char>        { public override Char        From(IMapDataSource s, object o, int i) { return s.GetChar        (o, i); } }
+		sealed class G           : MB<Guid>        { public override Guid        From(IMapDataSource s, object o, int i) { return s.GetGuid        (o, i); } }
+		sealed class DT          : MB<DateTime>    { public override DateTime    From(IMapDataSource s, object o, int i) { return s.GetDateTime    (o, i); } }
+		sealed class DTO         : MB<DateTimeOffset> { public override DateTimeOffset From(IMapDataSource s, object o, int i) { return s.GetDateTimeOffset    (o, i); } }
+		// Enums.
+		//
+		sealed class EI8<E>      : MB<E>           { public override E           From(IMapDataSource s, object o, int i) { return (E)(object)s.GetSByte   (o, i); } }
+		sealed class EI16<E>     : MB<E>           { public override E           From(IMapDataSource s, object o, int i) { return (E)(object)s.GetInt16   (o, i); } }
+		sealed class EI32<E>     : MB<E>           { public override E           From(IMapDataSource s, object o, int i) { return (E)(object)s.GetInt32   (o, i); } }
+		sealed class EI64<E>     : MB<E>           { public override E           From(IMapDataSource s, object o, int i) { return (E)(object)s.GetInt64   (o, i); } }
+
+		sealed class EU8<E>      : MB<E>           { public override E           From(IMapDataSource s, object o, int i) { return (E)(object)s.GetByte    (o, i); } }
+		sealed class EU16<E>     : MB<E>           { public override E           From(IMapDataSource s, object o, int i) { return (E)(object)s.GetUInt16  (o, i); } }
+		sealed class EU32<E>     : MB<E>           { public override E           From(IMapDataSource s, object o, int i) { return (E)(object)s.GetUInt32  (o, i); } }
+		sealed class EU64<E>     : MB<E>           { public override E           From(IMapDataSource s, object o, int i) { return (E)(object)s.GetUInt64  (o, i); } }
+
+		// Nullable Types.
+		//
+		sealed class NI8         : MB<SByte?>      { public override SByte?      From(IMapDataSource s, object o, int i) { return s.GetNullableSByte      (o, i); } }
+		sealed class NI16        : MB<Int16?>      { public override Int16?      From(IMapDataSource s, object o, int i) { return s.GetNullableInt16      (o, i); } }
+		sealed class NI32        : MB<Int32?>      { public override Int32?      From(IMapDataSource s, object o, int i) { return s.GetNullableInt32      (o, i); } }
+		sealed class NI64        : MB<Int64?>      { public override Int64?      From(IMapDataSource s, object o, int i) { return s.GetNullableInt64      (o, i); } }
+
+		sealed class NU8         : MB<Byte?>       { public override Byte?       From(IMapDataSource s, object o, int i) { return s.GetNullableByte       (o, i); } }
+		sealed class NU16        : MB<UInt16?>     { public override UInt16?     From(IMapDataSource s, object o, int i) { return s.GetNullableUInt16     (o, i); } }
+		sealed class NU32        : MB<UInt32?>     { public override UInt32?     From(IMapDataSource s, object o, int i) { return s.GetNullableUInt32     (o, i); } }
+		sealed class NU64        : MB<UInt64?>     { public override UInt64?     From(IMapDataSource s, object o, int i) { return s.GetNullableUInt64     (o, i); } }
+
+		sealed class NR4         : MB<Single?>     { public override Single?     From(IMapDataSource s, object o, int i) { return s.GetNullableSingle     (o, i); } }
+		sealed class NR8         : MB<Double?>     { public override Double?     From(IMapDataSource s, object o, int i) { return s.GetNullableDouble     (o, i); } }
+
+		sealed class NB          : MB<Boolean?>    { public override Boolean?    From(IMapDataSource s, object o, int i) { return s.GetNullableBoolean    (o, i); } }
+		sealed class ND          : MB<Decimal?>    { public override Decimal?    From(IMapDataSource s, object o, int i) { return s.GetNullableDecimal    (o, i); } }
+
+		sealed class NC          : MB<Char?>       { public override Char?       From(IMapDataSource s, object o, int i) { return s.GetNullableChar       (o, i); } }
+		sealed class NG          : MB<Guid?>       { public override Guid?       From(IMapDataSource s, object o, int i) { return s.GetNullableGuid       (o, i); } }
+		sealed class NDT         : MB<DateTime?>   { public override DateTime?   From(IMapDataSource s, object o, int i) { return s.GetNullableDateTime   (o, i); } }
+		sealed class NDTO        : MB<DateTimeOffset?> { public override DateTimeOffset? From(IMapDataSource s, object o, int i) { return s.GetNullableDateTimeOffset    (o, i); } }
+
+		// Nullable Enums.
+		//
+		sealed class NEI8<E>     : MB<E?> where E : struct { public override E?  From(IMapDataSource s, object o, int i) { return /*s.IsNull(o, i) ? (E?)null :*/ (E)(object)s.GetSByte (o, i); } }
+		sealed class NEI16<E>    : MB<E?> where E : struct { public override E?  From(IMapDataSource s, object o, int i) { return /*s.IsNull(o, i) ? (E?)null :*/ (E)(object)s.GetInt16 (o, i); } }
+		sealed class NEI32<E>    : MB<E?> where E : struct { public override E?  From(IMapDataSource s, object o, int i) { return /*s.IsNull(o, i) ? (E?)null :*/ (E)(object)s.GetInt32 (o, i); } }
+		sealed class NEI64<E>    : MB<E?> where E : struct { public override E?  From(IMapDataSource s, object o, int i) { return /*s.IsNull(o, i) ? (E?)null :*/ (E)(object)s.GetInt64 (o, i); } }
+
+		sealed class NEU8<E>     : MB<E?> where E : struct { public override E?  From(IMapDataSource s, object o, int i) { return /*s.IsNull(o, i) ? (E?)null :*/ (E)(object)s.GetByte  (o, i); } }
+		sealed class NEU16<E>    : MB<E?> where E : struct { public override E?  From(IMapDataSource s, object o, int i) { return /*s.IsNull(o, i) ? (E?)null :*/ (E)(object)s.GetUInt16(o, i); } }
+		sealed class NEU32<E>    : MB<E?> where E : struct { public override E?  From(IMapDataSource s, object o, int i) { return /*s.IsNull(o, i) ? (E?)null :*/ (E)(object)s.GetUInt32(o, i); } }
+		sealed class NEU64<E>    : MB<E?> where E : struct { public override E?  From(IMapDataSource s, object o, int i) { return /*s.IsNull(o, i) ? (E?)null :*/ (E)(object)s.GetUInt64(o, i); } }
+
+#if !SILVERLIGHT
+
+		// SqlTypes.
+		//
+		sealed class dbS         : MB<SqlString>   { public override SqlString   From(IMapDataSource s, object o, int i) { return s.GetSqlString   (o, i); } }
+
+		sealed class dbU8        : MB<SqlByte>     { public override SqlByte     From(IMapDataSource s, object o, int i) { return s.GetSqlByte     (o, i); } }
+		sealed class dbI16       : MB<SqlInt16>    { public override SqlInt16    From(IMapDataSource s, object o, int i) { return s.GetSqlInt16    (o, i); } }
+		sealed class dbI32       : MB<SqlInt32>    { public override SqlInt32    From(IMapDataSource s, object o, int i) { return s.GetSqlInt32    (o, i); } }
+		sealed class dbI64       : MB<SqlInt64>    { public override SqlInt64    From(IMapDataSource s, object o, int i) { return s.GetSqlInt64    (o, i); } }
+
+		sealed class dbR4        : MB<SqlSingle>   { public override SqlSingle   From(IMapDataSource s, object o, int i) { return s.GetSqlSingle   (o, i); } }
+		sealed class dbR8        : MB<SqlDouble>   { public override SqlDouble   From(IMapDataSource s, object o, int i) { return s.GetSqlDouble   (o, i); } }
+		sealed class dbD         : MB<SqlDecimal>  { public override SqlDecimal  From(IMapDataSource s, object o, int i) { return s.GetSqlDecimal  (o, i); } }
+		sealed class dbM         : MB<SqlMoney>    { public override SqlMoney    From(IMapDataSource s, object o, int i) { return s.GetSqlMoney    (o, i); } }
+
+		sealed class dbB         : MB<SqlBoolean>  { public override SqlBoolean  From(IMapDataSource s, object o, int i) { return s.GetSqlBoolean  (o, i); } }
+		sealed class dbG         : MB<SqlGuid>     { public override SqlGuid     From(IMapDataSource s, object o, int i) { return s.GetSqlGuid     (o, i); } }
+		sealed class dbDT        : MB<SqlDateTime> { public override SqlDateTime From(IMapDataSource s, object o, int i) { return s.GetSqlDateTime (o, i); } }
+
+#endif
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MapIgnoreAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,25 @@
+using System;
+
+namespace BLToolkit.Mapping
+{
+	[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
+	public sealed class MapIgnoreAttribute : Attribute
+	{
+		public MapIgnoreAttribute()
+		{
+			_ignore = true;
+		}
+
+		public MapIgnoreAttribute(bool ignore)
+		{
+			_ignore = ignore;
+		}
+
+		private bool _ignore;
+		public  bool  Ignore
+		{
+			get { return _ignore;  }
+			set { _ignore = value; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MapImplicitAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+using System;
+
+namespace BLToolkit.Mapping
+{
+	[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
+	public abstract class MapImplicitAttribute : Attribute
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MapIndex.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,99 @@
+using System;
+using System.Linq;
+using BLToolkit.Common;
+using BLToolkit.Properties;
+
+namespace BLToolkit.Mapping
+{
+	public class MapIndex
+	{
+		public MapIndex(string[] names)
+		{
+			if (null == names)
+				throw new ArgumentNullException("names");
+
+			if (names.Length == 0)
+				throw new ArgumentException(Resources.MapIndex_EmptyNames, "names");
+
+			Fields = NameOrIndexParameter.FromStringArray(names);
+		}
+
+		public MapIndex(int[] indices)
+		{
+			if (null == indices)
+				throw new ArgumentNullException("indices");
+
+			if (indices.Length == 0)
+				throw new ArgumentException(Resources.MapIndex_EmptyIndices, "indices");
+
+			Fields = NameOrIndexParameter.FromIndexArray(indices);
+		}
+		
+		public MapIndex(params NameOrIndexParameter[] fields)
+		{
+			if (null == fields)
+				throw new ArgumentNullException("fields");
+
+			if (fields.Length == 0)
+				throw new ArgumentException(Resources.MapIndex_EmptyFields, "fields");
+			
+			Fields = fields;
+		}
+
+		public NameOrIndexParameter[] Fields { get; private set; }
+
+		private string _id;
+		public  string  ID
+		{
+			get { return _id ?? (_id = string.Join(".", Fields.Select(_ => _.ToString()).ToArray())); }
+		}
+
+		[CLSCompliant(false)]
+		public object GetValue(IMapDataSource source, object obj, int index)
+		{
+			if (source == null)
+				throw new ArgumentNullException("source");
+
+			var value = Fields[index].ByName?
+				source.GetValue(obj, Fields[index].Name):
+				source.GetValue(obj, Fields[index].Index);
+
+			if (value == null)
+			{
+				var objectMapper = source as ObjectMapper;
+
+				if (objectMapper != null)
+				{
+					var mm = Fields[index].ByName?
+						objectMapper[Fields[index].Name]: objectMapper[Fields[index].Index];
+
+					if (mm == null)
+						throw new MappingException(string.Format(Resources.MapIndex_BadField,
+							objectMapper.TypeAccessor.OriginalType.Name, Fields[index]));
+				}
+			}
+
+			return value;
+		}
+
+		[CLSCompliant(false)]
+		public object GetValueOrIndex(IMapDataSource source, object obj)
+		{
+			return Fields.Length == 1?
+				GetValue(source, obj, 0):
+				GetIndexValue(source, obj);
+		}
+
+		[CLSCompliant(false)]
+		public CompoundValue GetIndexValue(IMapDataSource source, object obj)
+		{
+			var values = new object[Fields.Length];
+
+			for (var i = 0; i < values.Length; i++)
+				values[i] = GetValue(source, obj, i);
+
+			return new CompoundValue(values);
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MapMemberInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,101 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Diagnostics;
+
+using BLToolkit.DataAccess;
+using BLToolkit.Reflection;
+using BLToolkit.Reflection.Extension;
+
+namespace BLToolkit.Mapping
+{
+	[DebuggerStepThrough]
+	public class MapMemberInfo
+	{
+		public MapMemberInfo()
+		{
+			DbType = DbType.Object;
+		}
+
+		public MemberAccessor  MemberAccessor             { get; set; }
+		public MemberAccessor  ComplexMemberAccessor      { get; set; }
+		public string          Name                       { get; set; }
+		public string          MemberName                 { get; set; }
+		public string          Storage                    { get; set; }
+		public bool            IsInheritanceDiscriminator { get; set; }
+		public bool            Trimmable                  { get; set; }
+		public bool            SqlIgnore                  { get; set; }
+		public bool            Nullable                   { get; set; }
+		public object          NullValue                  { get; set; }
+		public object          DefaultValue               { get; set; }
+		public Type            Type                       { get; set; }
+		public int             DbSize                     { get; set; }
+		public bool            IsDbTypeSet                { get; set; }
+		public bool            IsDbSizeSet                { get; set; }
+		public MappingSchema   MappingSchema              { get; set; }
+		public MemberExtension MemberExtension            { get; set; }
+		public DbType          DbType                     { get; set; }
+		public KeyGenerator    KeyGenerator               { get; set; }
+
+		private MapValue[] _mapValues;
+		public  MapValue[]  MapValues
+		{
+			get { return _mapValues; }
+			set
+			{
+				_mapValues = value;
+				if (value != null)
+					CacheMapValues();
+				else
+				{
+					_mapValueCache  = new Dictionary<object, object>();
+					_origValueCache = new Dictionary<object, object>();
+				}
+			}
+		}
+
+		private Dictionary<object,object> _mapValueCache;
+
+		public bool TryGetOrigValue(object mapedValue, out object origValue)
+		{
+			return _mapValueCache.TryGetValue(mapedValue, out origValue);
+		}
+
+		private Dictionary<object,object> _origValueCache;
+
+		public bool TryGetMapValue(object origValue, out object mapValue)
+		{
+			return _origValueCache.TryGetValue(origValue, out mapValue);
+		}
+
+		private void CacheMapValues()
+		{
+			_mapValueCache = new Dictionary<object,object>();
+
+			foreach (var mv in MapValues)
+			foreach (var mapValue in mv.MapValues)
+			{
+				_mapValueCache[mapValue] = mv.OrigValue;
+
+				// this fixes spesial case for char
+				if (mapValue is char)
+				{
+					var str = new string(new[] { (char)mapValue });
+					_mapValueCache[str] = mv.OrigValue;
+				}
+			}
+
+			_origValueCache = new Dictionary<object, object>();
+
+			foreach (var mv in MapValues)
+			{
+				// previous behaviour - first wins!
+				// yah, no...
+				// any wins - attributes order is not specified
+				// and memberInfo.GetCustomAttributes(...) order and can differ
+				if (!_origValueCache.ContainsKey(mv.OrigValue))
+					_origValueCache[mv.OrigValue] = mv.MapValues[0];
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MapNextResult.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,61 @@
+using System;
+
+namespace BLToolkit.Mapping
+{
+	public class MapNextResult
+	{
+		public MapNextResult(
+			Type     type,
+			MapIndex slaveIndex,
+			MapIndex masterIndex,
+			string   containerName,
+			params MapNextResult[] nextResults)
+		{
+			_objectType    = type;
+			_slaveIndex    = slaveIndex;
+			_masterIndex   = masterIndex;
+			_containerName = containerName;
+			_nextResults   = nextResults;
+		}
+
+		public MapNextResult(
+			Type   type,
+			string slaveIndex,
+			string masterIndex,
+			string containerName,
+			params MapNextResult[] nextResults)
+			: this(type, new MapIndex(slaveIndex), new MapIndex(masterIndex), containerName, nextResults)
+		{
+		}
+
+		private readonly Type _objectType;
+		internal         Type  ObjectType
+		{
+			get { return _objectType;  }
+		}
+
+		private readonly MapIndex _slaveIndex;
+		internal         MapIndex  SlaveIndex
+		{
+			get { return _slaveIndex;  }
+		}
+
+		private readonly MapIndex _masterIndex;
+		internal         MapIndex  MasterIndex
+		{
+			get { return _masterIndex;  }
+		}
+
+		private readonly string _containerName;
+		internal string          ContainerName
+		{
+			get { return _containerName;  }
+		}
+
+		private readonly MapNextResult[] _nextResults;
+		internal         MapNextResult[]  NextResults
+		{
+			get { return _nextResults; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MapRelation.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,27 @@
+using System;
+
+namespace BLToolkit.Mapping
+{
+	public class MapRelation : MapRelationBase
+	{
+		public MapRelation(
+			MapResultSet slaveResultSet,
+			MapIndex     slaveIndex,
+			MapIndex     masterIndex,
+			string       containerName)
+			: base(slaveResultSet.ObjectType, slaveIndex, masterIndex, containerName)
+		{
+			_slaveResultSet  = slaveResultSet;
+		}
+
+		public MapRelation(MapResultSet slaveResultSet, MapRelationBase relation)
+			: this(slaveResultSet, relation.SlaveIndex, relation.MasterIndex, relation.ContainerName)
+		{ }
+
+		private readonly MapResultSet _slaveResultSet;
+		public           MapResultSet  SlaveResultSet
+		{
+			get { return _slaveResultSet; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MapRelationBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,58 @@
+using System;
+
+namespace BLToolkit.Mapping
+{
+	public class MapRelationBase
+	{
+		public MapRelationBase(
+			Type         slave,
+			MapIndex     slaveIndex,
+			MapIndex     masterIndex,
+			string       containerName)
+		{
+			if (slave == null)
+				throw new ArgumentNullException("slave");
+
+			if (masterIndex.Fields.Length == 0)
+				throw new MappingException("Master index length can not be 0.");
+
+			if ( slaveIndex.Fields.Length == 0)
+				throw new MappingException("Slave index length can not be 0.");
+
+			if (masterIndex.Fields.Length != slaveIndex.Fields.Length)
+				throw new MappingException("Master and slave indexes do not match.");
+
+			if (string.IsNullOrEmpty(containerName))
+				throw new MappingException("Master container field name is wrong.");
+			
+			_slave           = slave;
+			_masterIndex     = masterIndex;
+			_slaveIndex      = slaveIndex;
+			_containerName   = containerName;
+		}
+
+		private readonly MapIndex _masterIndex;
+		public           MapIndex  MasterIndex
+		{
+			get { return _masterIndex; }
+		}
+
+		private readonly MapIndex _slaveIndex;
+		public           MapIndex  SlaveIndex
+		{
+			get { return _slaveIndex; }
+		}
+
+		private readonly string _containerName;
+		public           string  ContainerName
+		{
+			get { return _containerName; }
+		}
+
+		private readonly Type _slave;
+		public           Type  Slave
+		{
+			get { return _slave; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MapResultSet.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,146 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace BLToolkit.Mapping
+{
+	public class MapResultSet
+	{
+		public MapResultSet(Type objectType)
+		{
+			_objectType = objectType;
+		}
+
+		public MapResultSet(Type objectType, IList list)
+		{
+			_objectType = objectType;
+			_list       = list;
+		}
+
+		public MapResultSet(Type objectType, object[] parameters)
+		{
+			_objectType = objectType;
+			_parameters = parameters;
+		}
+
+		public MapResultSet(Type objectType, IList list, object[] parameters)
+		{
+			_objectType = objectType;
+			_parameters = parameters;
+			_list       = list;
+		}
+
+		internal MapResultSet(MapResultSet resultSet)
+		{
+			_objectType = resultSet._objectType;
+			_parameters = resultSet._parameters;
+
+			if (resultSet._relationList != null)
+			{
+				_relationList = new List<MapRelation>(resultSet._relationList.Count);
+				_relationList.AddRange(resultSet._relationList);
+			}
+		}
+
+		private readonly Type _objectType;
+		internal         Type  ObjectType
+		{
+			get { return _objectType; }
+		}
+
+		private object[] _parameters;
+		public  object[]  Parameters
+		{
+			get { return _parameters;  }
+			set { _parameters = value; }
+		}
+
+		private IList _list;
+		public  IList  List
+		{
+			get { return _list ?? (_list = new List<object>()); }
+			set { _list = value; }
+		}
+
+		private  MapRelation[] _relations;
+		internal MapRelation[]  Relations
+		{
+			get 
+			{
+				if (_relationList != null && (_relations == null || _relations.Length != _relationList.Count))
+					_relations = _relationList.ToArray();
+
+				return _relations;
+			}
+
+			set { _relations = value; }
+		}
+
+		private List<MapRelation> _relationList;
+
+		public void AddRelation(
+			MapResultSet slaveResultSet,
+			MapIndex     slaveIndex,
+			MapIndex     masterIndex,
+			string       containerName)
+		{
+			if (_relationList == null)
+				_relationList = new List<MapRelation>();
+
+			_relationList.Add(new MapRelation(slaveResultSet, slaveIndex, masterIndex, containerName));
+		}
+
+		public void AddRelation(
+			MapResultSet slaveResultSet,
+			string       slaveIndex,
+			string       masterIndex,
+			string       containerName)
+		{
+			AddRelation( slaveResultSet, new MapIndex(slaveIndex), new MapIndex(masterIndex),containerName);
+		}
+
+		public void AddRelation(MapResultSet slaveResultSet, MapRelationBase relation)
+		{
+			AddRelation(slaveResultSet, relation.SlaveIndex, relation.MasterIndex, relation.ContainerName);
+		}
+
+		readonly Dictionary<string,IDictionary<object,IList>> _indexies = new Dictionary<string,IDictionary<object,IList>>();
+
+		public  IDictionary<object,IList> GetIndex(MappingSchema ms, MapIndex masterIndex)
+		{
+			var indexId = masterIndex.ID;
+
+			IDictionary<object,IList> indexHash;
+
+			if (_indexies.TryGetValue(indexId, out indexHash))
+				return indexHash;
+
+			var masterMapper = ms.GetObjectMapper(ObjectType);
+
+			indexHash = new Dictionary<object, IList>();
+
+			foreach (var o in List)
+			{
+				var key = masterIndex.GetValueOrIndex(masterMapper, o);
+
+				if (ms.IsNull(key))
+					continue;
+
+				IList matches;
+
+				if (!indexHash.TryGetValue(key, out matches))
+					indexHash.Add(key, matches = new List<object>());
+
+				matches.Add(o);
+			}
+
+			return indexHash;
+		}
+
+		public IDictionary<object,IList> GetIndex(MappingSchema ms, MapRelation relation)
+		{
+			return GetIndex(ms, relation.MasterIndex);
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MapSetDataT.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,228 @@
+using System;
+using System.Data.SqlTypes;
+
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Mapping
+{
+	[CLSCompliant(false)]
+	public static class MapSetData<T>
+	{
+		public abstract class MB<V>
+		{
+			public abstract void To(IMapDataDestination d, object o, int i, V v);
+		}
+
+		public static void To(IMapDataDestination d, object o, int i, T v)
+		{
+			I.To(d, o, i, v);
+		}
+
+		public  static MB<T> I = GetSetter();
+		private static MB<T>     GetSetter()
+		{
+			Type t = typeof(T);
+
+			// Scalar Types.
+			//
+			if (t == typeof(SByte))        return (MB<T>)(object)(new I8());
+			if (t == typeof(Int16))        return (MB<T>)(object)(new I16());
+			if (t == typeof(Int32))        return (MB<T>)(object)(new I32());
+			if (t == typeof(Int64))        return (MB<T>)(object)(new I64());
+
+			if (t == typeof(Byte))         return (MB<T>)(object)(new U8());
+			if (t == typeof(UInt16))       return (MB<T>)(object)(new U16());
+			if (t == typeof(UInt32))       return (MB<T>)(object)(new U32());
+			if (t == typeof(UInt64))       return (MB<T>)(object)(new U64());
+
+			if (t == typeof(Single))       return (MB<T>)(object)(new R4());
+			if (t == typeof(Double))       return (MB<T>)(object)(new R8());
+
+			if (t == typeof(Boolean))      return (MB<T>)(object)(new B());
+			if (t == typeof(Decimal))      return (MB<T>)(object)(new D());
+
+			if (t == typeof(Char))         return (MB<T>)(object)(new C());
+			if (t == typeof(Guid))         return (MB<T>)(object)(new G());
+			if (t == typeof(DateTime))     return (MB<T>)(object)(new DT());
+			if (t == typeof(DateTimeOffset)) return (MB<T>)(object)(new DTO());
+
+			// Enums.
+			//
+			if (t.IsEnum)
+			{
+				t = Enum.GetUnderlyingType(t);
+
+				if (t == typeof(SByte))        return new EI8<T>();
+				if (t == typeof(Int16))        return new EI16<T>();
+				if (t == typeof(Int32))        return new EI32<T>();
+				if (t == typeof(Int64))        return new EI64<T>();
+
+				if (t == typeof(Byte))         return new EU8<T>();
+				if (t == typeof(UInt16))       return new EU16<T>();
+				if (t == typeof(UInt32))       return new EU32<T>();
+				if (t == typeof(UInt64))       return new EU64<T>();
+			}
+
+			// Nullable Types.
+			//
+			if (t == typeof(SByte?))       return (MB<T>)(object)(new NI8());
+			if (t == typeof(Int16?))       return (MB<T>)(object)(new NI16());
+			if (t == typeof(Int32?))       return (MB<T>)(object)(new NI32());
+			if (t == typeof(Int64?))       return (MB<T>)(object)(new NI64());
+
+			if (t == typeof(Byte?))        return (MB<T>)(object)(new NU8());
+			if (t == typeof(UInt16?))      return (MB<T>)(object)(new NU16());
+			if (t == typeof(UInt32?))      return (MB<T>)(object)(new NU32());
+			if (t == typeof(UInt64?))      return (MB<T>)(object)(new NU64());
+
+			if (t == typeof(Single?))      return (MB<T>)(object)(new NR4());
+			if (t == typeof(Double?))      return (MB<T>)(object)(new NR8());
+
+			if (t == typeof(Boolean?))     return (MB<T>)(object)(new NB());
+			if (t == typeof(Decimal?))     return (MB<T>)(object)(new ND());
+
+			if (t == typeof(Char?))        return (MB<T>)(object)(new NC());
+			if (t == typeof(Guid?))        return (MB<T>)(object)(new NG());
+			if (t == typeof(DateTime?))    return (MB<T>)(object)(new NDT());
+			if (t == typeof(DateTimeOffset?)) return (MB<T>)(object)(new NDTO());
+
+			// Nullable Enums.
+			//
+			if (TypeHelper.IsNullable(t) && Nullable.GetUnderlyingType(t).IsEnum)
+			{
+				Type enumType = Nullable.GetUnderlyingType(t);
+				t = Enum.GetUnderlyingType(enumType);
+
+				if (t == typeof(SByte))  return (MB<T>)Activator.CreateInstance(typeof(NEI8<>).MakeGenericType(typeof(T), enumType));
+				if (t == typeof(Int16))  return (MB<T>)Activator.CreateInstance(typeof(NEI16<>).MakeGenericType(typeof(T), enumType));
+				if (t == typeof(Int32))  return (MB<T>)Activator.CreateInstance(typeof(NEI32<>).MakeGenericType(typeof(T), enumType));
+				if (t == typeof(Int64))  return (MB<T>)Activator.CreateInstance(typeof(NEI64<>).MakeGenericType(typeof(T), enumType));
+
+				if (t == typeof(Byte))   return (MB<T>)Activator.CreateInstance(typeof(NEU8<>).MakeGenericType(typeof(T), enumType));
+				if (t == typeof(UInt16)) return (MB<T>)Activator.CreateInstance(typeof(NEU16<>).MakeGenericType(typeof(T), enumType));
+				if (t == typeof(UInt32)) return (MB<T>)Activator.CreateInstance(typeof(NEU32<>).MakeGenericType(typeof(T), enumType));
+				if (t == typeof(UInt64)) return (MB<T>)Activator.CreateInstance(typeof(NEU64<>).MakeGenericType(typeof(T), enumType));
+			}
+
+#if !SILVERLIGHT
+
+			// SqlTypes.
+			//
+			if (t == typeof(SqlString))    return (MB<T>)(object)(new dbS());
+
+			if (t == typeof(SqlByte))      return (MB<T>)(object)(new dbU8());
+			if (t == typeof(SqlInt16))     return (MB<T>)(object)(new dbI16());
+			if (t == typeof(SqlInt32))     return (MB<T>)(object)(new dbI32());
+			if (t == typeof(SqlInt64))     return (MB<T>)(object)(new dbI64());
+
+			if (t == typeof(SqlSingle))    return (MB<T>)(object)(new dbR4());
+			if (t == typeof(SqlDouble))    return (MB<T>)(object)(new dbR8());
+			if (t == typeof(SqlDecimal))   return (MB<T>)(object)(new dbD());
+			if (t == typeof(SqlMoney))     return (MB<T>)(object)(new dbM());
+
+			if (t == typeof(SqlBoolean))   return (MB<T>)(object)(new dbB());
+			if (t == typeof(SqlGuid))      return (MB<T>)(object)(new dbG());
+			if (t == typeof(SqlDateTime))  return (MB<T>)(object)(new dbDT());
+
+#endif
+
+			return new Default<T>();
+		}
+
+		// Default setter.
+		//
+		public sealed class Default<V> : MB<V>     { public override  void To(IMapDataDestination d, object o, int i, V           v) { d.SetValue       (o, i, v); } }
+
+		// Scalar Types.
+		//
+		sealed class I8    : MB<SByte>       { public override  void To(IMapDataDestination d, object o, int i, SByte       v) { d.SetSByte       (o, i, v); } }
+		sealed class I16   : MB<Int16>       { public override  void To(IMapDataDestination d, object o, int i, Int16       v) { d.SetInt16       (o, i, v); } }
+		sealed class I32   : MB<Int32>       { public override  void To(IMapDataDestination d, object o, int i, Int32       v) { d.SetInt32       (o, i, v); } }
+		sealed class I64   : MB<Int64>       { public override  void To(IMapDataDestination d, object o, int i, Int64       v) { d.SetInt64       (o, i, v); } }
+
+		sealed class U8    : MB<Byte>        { public override  void To(IMapDataDestination d, object o, int i, Byte        v) { d.SetByte        (o, i, v); } }
+		sealed class U16   : MB<UInt16>      { public override  void To(IMapDataDestination d, object o, int i, UInt16      v) { d.SetUInt16      (o, i, v); } }
+		sealed class U32   : MB<UInt32>      { public override  void To(IMapDataDestination d, object o, int i, UInt32      v) { d.SetUInt32      (o, i, v); } }
+		sealed class U64   : MB<UInt64>      { public override  void To(IMapDataDestination d, object o, int i, UInt64      v) { d.SetUInt64      (o, i, v); } }
+
+		sealed class R4    : MB<Single>      { public override  void To(IMapDataDestination d, object o, int i, Single      v) { d.SetSingle      (o, i, v); } }
+		sealed class R8    : MB<Double>      { public override  void To(IMapDataDestination d, object o, int i, Double      v) { d.SetDouble      (o, i, v); } }
+
+		sealed class B     : MB<Boolean>     { public override  void To(IMapDataDestination d, object o, int i, Boolean     v) { d.SetBoolean     (o, i, v); } }
+		sealed class D     : MB<Decimal>     { public override  void To(IMapDataDestination d, object o, int i, Decimal     v) { d.SetDecimal     (o, i, v); } }
+
+		sealed class C     : MB<Char>        { public override  void To(IMapDataDestination d, object o, int i, Char        v) { d.SetChar        (o, i, v); } }
+		sealed class G     : MB<Guid>        { public override  void To(IMapDataDestination d, object o, int i, Guid        v) { d.SetGuid        (o, i, v); } }
+		sealed class DT    : MB<DateTime>    { public override  void To(IMapDataDestination d, object o, int i, DateTime    v) { d.SetDateTime    (o, i, v); } }
+		sealed class DTO   : MB<DateTimeOffset>{ public override  void To(IMapDataDestination d, object o, int i, DateTimeOffset    v) { d.SetDateTimeOffset    (o, i, v); } }
+
+		// Enums.
+		//
+		sealed class EI8<E>  : MB<E>         { public override  void To(IMapDataDestination d, object o, int i, E           v) { d.SetSByte       (o, i, (SByte)(object)v); } }
+		sealed class EI16<E> : MB<E>         { public override  void To(IMapDataDestination d, object o, int i, E           v) { d.SetInt16       (o, i, (Int16)(object)v); } }
+		sealed class EI32<E> : MB<E>         { public override  void To(IMapDataDestination d, object o, int i, E           v) { d.SetInt32       (o, i, (Int32)(object)v); } }
+		sealed class EI64<E> : MB<E>         { public override  void To(IMapDataDestination d, object o, int i, E           v) { d.SetInt64       (o, i, (Int64)(object)v); } }
+
+		sealed class EU8<E>  : MB<E>         { public override  void To(IMapDataDestination d, object o, int i, E           v) { d.SetByte        (o, i, (Byte)(object)v); } }
+		sealed class EU16<E> : MB<E>         { public override  void To(IMapDataDestination d, object o, int i, E           v) { d.SetUInt16      (o, i, (UInt16)(object)v); } }
+		sealed class EU32<E> : MB<E>         { public override  void To(IMapDataDestination d, object o, int i, E           v) { d.SetUInt32      (o, i, (UInt32)(object)v); } }
+		sealed class EU64<E> : MB<E>         { public override  void To(IMapDataDestination d, object o, int i, E           v) { d.SetUInt64      (o, i, (UInt64)(object)v); } }
+
+		// Nullable Types.
+		//
+		sealed class NI8   : MB<SByte?>      { public override  void To(IMapDataDestination d, object o, int i, SByte?      v) { d.SetNullableSByte      (o, i, v); } }
+		sealed class NI16  : MB<Int16?>      { public override  void To(IMapDataDestination d, object o, int i, Int16?      v) { d.SetNullableInt16      (o, i, v); } }
+		sealed class NI32  : MB<Int32?>      { public override  void To(IMapDataDestination d, object o, int i, Int32?      v) { d.SetNullableInt32      (o, i, v); } }
+		sealed class NI64  : MB<Int64?>      { public override  void To(IMapDataDestination d, object o, int i, Int64?      v) { d.SetNullableInt64      (o, i, v); } }
+
+		sealed class NU8   : MB<Byte?>       { public override  void To(IMapDataDestination d, object o, int i, Byte?       v) { d.SetNullableByte       (o, i, v); } }
+		sealed class NU16  : MB<UInt16?>     { public override  void To(IMapDataDestination d, object o, int i, UInt16?     v) { d.SetNullableUInt16     (o, i, v); } }
+		sealed class NU32  : MB<UInt32?>     { public override  void To(IMapDataDestination d, object o, int i, UInt32?     v) { d.SetNullableUInt32     (o, i, v); } }
+		sealed class NU64  : MB<UInt64?>     { public override  void To(IMapDataDestination d, object o, int i, UInt64?     v) { d.SetNullableUInt64     (o, i, v); } }
+
+		sealed class NR4   : MB<Single?>     { public override  void To(IMapDataDestination d, object o, int i, Single?     v) { d.SetNullableSingle     (o, i, v); } }
+		sealed class NR8   : MB<Double?>     { public override  void To(IMapDataDestination d, object o, int i, Double?     v) { d.SetNullableDouble     (o, i, v); } }
+
+		sealed class NB    : MB<Boolean?>    { public override  void To(IMapDataDestination d, object o, int i, Boolean?    v) { d.SetNullableBoolean    (o, i, v); } }
+		sealed class ND    : MB<Decimal?>    { public override  void To(IMapDataDestination d, object o, int i, Decimal?    v) { d.SetNullableDecimal    (o, i, v); } }
+
+		sealed class NC    : MB<Char?>       { public override  void To(IMapDataDestination d, object o, int i, Char?       v) { d.SetNullableChar       (o, i, v); } }
+		sealed class NG    : MB<Guid?>       { public override  void To(IMapDataDestination d, object o, int i, Guid?       v) { d.SetNullableGuid       (o, i, v); } }
+		sealed class NDT   : MB<DateTime?>   { public override  void To(IMapDataDestination d, object o, int i, DateTime?   v) { d.SetNullableDateTime   (o, i, v); } }
+		sealed class NDTO  : MB<DateTimeOffset?>{ public override  void To(IMapDataDestination d, object o, int i, DateTimeOffset?    v) { d.SetNullableDateTimeOffset    (o, i, v); } }
+
+		// Nullable Enums.
+		//
+		sealed class NEI8<E>  : MB<E?> where E : struct { public override  void To(IMapDataDestination d, object o, int i, E? v) { /*if (null == v) d.SetNull(o, i); else*/ d.SetSByte (o, i, (SByte)(object)v.Value); } }
+		sealed class NEI16<E> : MB<E?> where E : struct { public override  void To(IMapDataDestination d, object o, int i, E? v) { /*if (null == v) d.SetNull(o, i); else*/ d.SetInt16 (o, i, (Int16)(object)v.Value); } }
+		sealed class NEI32<E> : MB<E?> where E : struct { public override  void To(IMapDataDestination d, object o, int i, E? v) { /*if (null == v) d.SetNull(o, i); else*/ d.SetInt32 (o, i, (Int32)(object)v.Value); } }
+		sealed class NEI64<E> : MB<E?> where E : struct { public override  void To(IMapDataDestination d, object o, int i, E? v) { /*if (null == v) d.SetNull(o, i); else*/ d.SetInt64 (o, i, (Int64)(object)v.Value); } }
+
+		sealed class NEU8<E>  : MB<E?> where E : struct { public override  void To(IMapDataDestination d, object o, int i, E? v) { /*if (null == v) d.SetNull(o, i); else*/ d.SetByte  (o, i, (Byte)(object)v.Value); } }
+		sealed class NEU16<E> : MB<E?> where E : struct { public override  void To(IMapDataDestination d, object o, int i, E? v) { /*if (null == v) d.SetNull(o, i); else*/ d.SetUInt16(o, i, (UInt16)(object)v.Value); } }
+		sealed class NEU32<E> : MB<E?> where E : struct { public override  void To(IMapDataDestination d, object o, int i, E? v) { /*if (null == v) d.SetNull(o, i); else*/ d.SetUInt32(o, i, (UInt32)(object)v.Value); } }
+		sealed class NEU64<E> : MB<E?> where E : struct { public override  void To(IMapDataDestination d, object o, int i, E? v) { /*if (null == v) d.SetNull(o, i); else*/ d.SetUInt64(o, i, (UInt64)(object)v.Value); } }
+
+#if !SILVERLIGHT
+
+		// SqlTypes.
+		//
+		sealed class dbS   : MB<SqlString>   { public override  void To(IMapDataDestination d, object o, int i, SqlString   v) { d.SetSqlString   (o, i, v); } }
+
+		sealed class dbU8  : MB<SqlByte>     { public override  void To(IMapDataDestination d, object o, int i, SqlByte     v) { d.SetSqlByte     (o, i, v); } }
+		sealed class dbI16 : MB<SqlInt16>    { public override  void To(IMapDataDestination d, object o, int i, SqlInt16    v) { d.SetSqlInt16    (o, i, v); } }
+		sealed class dbI32 : MB<SqlInt32>    { public override  void To(IMapDataDestination d, object o, int i, SqlInt32    v) { d.SetSqlInt32    (o, i, v); } }
+		sealed class dbI64 : MB<SqlInt64>    { public override  void To(IMapDataDestination d, object o, int i, SqlInt64    v) { d.SetSqlInt64    (o, i, v); } }
+
+		sealed class dbR4  : MB<SqlSingle>   { public override  void To(IMapDataDestination d, object o, int i, SqlSingle   v) { d.SetSqlSingle   (o, i, v); } }
+		sealed class dbR8  : MB<SqlDouble>   { public override  void To(IMapDataDestination d, object o, int i, SqlDouble   v) { d.SetSqlDouble   (o, i, v); } }
+		sealed class dbD   : MB<SqlDecimal>  { public override  void To(IMapDataDestination d, object o, int i, SqlDecimal  v) { d.SetSqlDecimal  (o, i, v); } }
+		sealed class dbM   : MB<SqlMoney>    { public override  void To(IMapDataDestination d, object o, int i, SqlMoney    v) { d.SetSqlMoney    (o, i, v); } }
+
+		sealed class dbB   : MB<SqlBoolean>  { public override  void To(IMapDataDestination d, object o, int i, SqlBoolean  v) { d.SetSqlBoolean  (o, i, v); } }
+		sealed class dbG   : MB<SqlGuid>     { public override  void To(IMapDataDestination d, object o, int i, SqlGuid     v) { d.SetSqlGuid     (o, i, v); } }
+		sealed class dbDT  : MB<SqlDateTime> { public override  void To(IMapDataDestination d, object o, int i, SqlDateTime v) { d.SetSqlDateTime (o, i, v); } }
+
+#endif
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MapValue.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,23 @@
+namespace BLToolkit.Mapping
+{
+	public class MapValue
+	{
+		public MapValue(object origValue, params object[] mapValues)
+		{
+			_origValue = origValue;
+			_mapValues = mapValues;
+		}
+
+		private readonly object _origValue;
+		public           object  OrigValue
+		{
+			get { return _origValue;  }
+		}
+
+		private readonly object[] _mapValues;
+		public           object[]  MapValues
+		{
+			get { return _mapValues;  }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MapValueAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,108 @@
+using System;
+using System.Diagnostics.CodeAnalysis;
+
+namespace BLToolkit.Mapping
+{
+	[SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes")]
+	[AttributeUsage(
+		AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Enum |
+		AttributeTargets.Class | AttributeTargets.Interface,
+		AllowMultiple=true)]
+	public class MapValueAttribute : Attribute
+	{
+		public MapValueAttribute(object value1)
+		{
+			SetValues(null, null, value1);
+		}
+
+		public MapValueAttribute(object[] values)
+		{
+			SetValues(null, null, values);
+		}
+
+		public MapValueAttribute(object origValue, object[] values)
+		{
+			SetValues(null, origValue, values);
+		}
+
+		public MapValueAttribute(object origValue, object value1)
+		{
+			SetValues(null, origValue, value1);
+		}
+
+		public MapValueAttribute(object origValue, object value1, object value2)
+		{
+			SetValues(null, origValue, value1, value2);
+		}
+
+		public MapValueAttribute(object origValue, object value1, object value2, object value3)
+		{
+			SetValues(null, origValue, value1, value2, value3);
+		}
+
+		public MapValueAttribute(object origValue, object value1, object value2, object value3, object value4)
+		{
+			SetValues(null, origValue, value1, value2, value3, value4);
+		}
+		
+		public MapValueAttribute(object origValue, object value1, object value2, object value3, object value4, object value5)
+		{
+			SetValues(null, origValue, value1, value2, value3, value4, value5);
+		}
+
+		public MapValueAttribute(Type type, object origValue, object[] values)
+		{
+			SetValues(type, origValue, values);
+		}
+
+		public MapValueAttribute(Type type, object origValue, object value1)
+		{
+			SetValues(type, origValue, value1);
+		}
+
+		public MapValueAttribute(Type type, object origValue, object value1, object value2)
+		{
+			SetValues(type, origValue, value1, value2);
+		}
+
+		public MapValueAttribute(Type type, object origValue, object value1, object value2, object value3)
+		{
+			SetValues(type, origValue, value1, value2, value3);
+		}
+
+		public MapValueAttribute(Type type, object origValue, object value1, object value2, object value3, object value4)
+		{
+			SetValues(type, origValue, value1, value2, value3, value4);
+		}
+		
+		public MapValueAttribute(Type type, object origValue, object value1, object value2, object value3, object value4, object value5)
+		{
+			SetValues(type, origValue, value1, value2, value3, value4, value5);
+		}
+
+		protected void SetValues(Type type, object origValue, params object[] values)
+		{
+			_type      = type;
+			_origValue = origValue;
+			_values    = values;
+		}
+
+		private Type   _type;
+		public  object  Type
+		{
+			get { return _type; }
+		}
+
+		private object _origValue;
+		public  object  OrigValue
+		{
+			get { return _origValue; }
+		}
+
+		private object[] _values;
+		public  object[]  Values
+		{
+			get { return _values; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/Mapping.xsd	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xsd:schema id="Mapping"
+	xmlns:tns="urn:schemas-bltoolkit-net:mapping"
+	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+	targetNamespace="urn:schemas-bltoolkit-net:mapping">
+
+	<xsd:attribute name="MapField"                type="xsd:string" />
+	<xsd:attribute name="MapIgnore"               type="xsd:boolean" />
+	<xsd:attribute name="Trimmable"               type="xsd:boolean" />
+	<xsd:attribute name="Nullable"                type="xsd:boolean" />
+	<xsd:attribute name="MapValue"                type="xsd:string" />
+	<xsd:attribute name="MapValue-Type"           type="xsd:string" />
+	<xsd:attribute name="MapValue-OrigValue"      type="xsd:string" />
+	<xsd:attribute name="MapValue-OrigValue-Type" type="xsd:string" />
+	<xsd:attribute name="DefaultValue"            type="xsd:string" />
+	<xsd:attribute name="DefaultValue-Type"       type="xsd:string" />
+	<xsd:attribute name="NullValue"               type="xsd:string" />
+	<xsd:attribute name="NullValue-Type"          type="xsd:string" />
+
+	<xsd:complexType name="MapValue" id="MapValue">
+		<xsd:sequence>
+			<xsd:any maxOccurs="unbounded" />
+		</xsd:sequence>
+		<xsd:attribute name="Value"           type="xsd:string" use="optional" />
+		<xsd:attribute name="Type"            type="xsd:string" use="required" />
+		<xsd:attribute name="OrigValue"       type="xsd:string" use="optional" />
+		<xsd:attribute name="OrigValue-Type"  type="xsd:string" use="optional" />
+	</xsd:complexType>
+
+	<xsd:complexType name="DefaultValue" id="DefaultValue">
+		<xsd:attribute name="Value"           type="xsd:string" use="optional" />
+		<xsd:attribute name="Type"            type="xsd:string" use="optional" />
+	</xsd:complexType>
+
+	<xsd:complexType name="NullValue" id="NullValue">
+		<xsd:attribute name="Value"           type="xsd:string" use="optional" />
+		<xsd:attribute name="Type"            type="xsd:string" use="optional" />
+	</xsd:complexType>
+
+	<xsd:complexType name="MapField" id="MapField">
+		<xsd:attribute name="MapName"  type="xsd:string" use="required" />
+		<xsd:attribute name="OrigName" type="xsd:string" use="required" />
+	</xsd:complexType>
+</xsd:schema>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/Mapping.xsx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--This file is auto-generated by the XML Schema Designer. It holds layout information for components on the designer surface.-->
+<XSDDesignerLayout Style="LeftRight" layoutVersion="2" viewPortLeft="0" viewPortTop="0" zoom="100">
+    <MapField_XmlAttribute left="317" top="254" width="5292" height="767" selected="0" zOrder="1" index="0" expanded="1" />
+    <MapIgnore_XmlAttribute left="634" top="1662" width="5292" height="767" selected="0" zOrder="2" index="1" expanded="1" />
+    <Trimmable_XmlAttribute left="634" top="3070" width="5292" height="767" selected="0" zOrder="4" index="2" expanded="1" />
+    <Nullable_XmlAttribute left="634" top="4478" width="5292" height="767" selected="0" zOrder="6" index="3" expanded="1" />
+    <MapValue_XmlAttribute left="634" top="5886" width="5292" height="767" selected="0" zOrder="8" index="4" expanded="1" />
+    <MapValue-Type_XmlAttribute left="634" top="7294" width="5292" height="767" selected="0" zOrder="10" index="5" expanded="1" />
+    <MapValue-OrigValue_XmlAttribute left="634" top="8702" width="5292" height="767" selected="0" zOrder="12" index="6" expanded="1" />
+    <MapValue-OrigValue-Type_XmlAttribute left="634" top="10110" width="5292" height="767" selected="0" zOrder="14" index="7" expanded="1" />
+    <DefaultValue_XmlAttribute left="634" top="11518" width="5292" height="767" selected="0" zOrder="16" index="8" expanded="1" />
+    <DefaultValue-Type_XmlAttribute left="634" top="12926" width="5292" height="767" selected="0" zOrder="18" index="9" expanded="1" />
+    <NullValue_XmlAttribute left="634" top="14334" width="5292" height="767" selected="0" zOrder="20" index="10" expanded="1" />
+    <NullValue-Type_XmlAttribute left="634" top="15742" width="5292" height="767" selected="0" zOrder="22" index="11" expanded="1" />
+    <MapValue_XmlComplexType left="634" top="17150" width="5292" height="3149" selected="0" zOrder="24" index="12" expanded="1" />
+    <DefaultValue_XmlComplexType left="634" top="20939" width="5292" height="3149" selected="0" zOrder="26" index="13" expanded="1" />
+    <NullValue_XmlComplexType left="634" top="24728" width="5292" height="3149" selected="0" zOrder="28" index="14" expanded="1" />
+</XSDDesignerLayout>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MappingException.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,88 @@
+using System;
+using System.Runtime.Serialization;
+
+namespace BLToolkit.Mapping
+{
+	/// <summary>
+	/// Defines the base class for the namespace exceptions.
+	/// </summary>
+	/// <remarks>
+	/// This class is the base class for exceptions that may occur during
+	/// the execution of the <see cref="Map"/> class and other namespace members.
+	/// </remarks>
+	[Serializable] 
+	public class MappingException : Exception
+	{
+		/// <summary>
+		/// Initializes a new instance of the <see cref="MappingException"/> class.
+		/// </summary>
+		/// <remarks>
+		/// This constructor initializes the <see cref="Exception.Message"/>
+		/// property of the new instance 
+		/// to a system-supplied message that describes the error, 
+		/// such as "A Mapping exception has occurred."
+		/// </remarks>
+		public MappingException() 
+			: base("A Mapping exception has occurred.")
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="MappingException"/> class 
+		/// with the specified error message.
+		/// </summary>
+		/// <param name="message">The message to display to the client when the
+		/// exception is thrown.</param>
+		/// <seealso cref="Exception.Message"/>
+		public MappingException(string message) 
+			: base(message) 
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="MappingException"/> class 
+		/// with the specified error message and InnerException property.
+		/// </summary>
+		/// <param name="message">The message to display to the client when the
+		/// exception is thrown.</param>
+		/// <param name="innerException">The InnerException, if any, that threw
+		/// the current exception.</param>
+		/// <seealso cref="Exception.Message"/>
+		/// <seealso cref="Exception.InnerException"/>
+		public MappingException(string message, Exception innerException) 
+			: base(message, innerException) 
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="MappingException"/> class 
+		/// with the specified InnerException property.
+		/// </summary>
+		/// exception is thrown.</param>
+		/// <param name="innerException">The InnerException, if any, that threw
+		/// the current exception.</param>
+		/// <seealso cref="Exception.InnerException"/>
+		public MappingException(Exception innerException) 
+			: base(innerException.Message, innerException) 
+		{
+		}
+
+#if !SILVERLIGHT
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="MappingException"/> class
+		/// with serialized data.
+		/// </summary>
+		/// <param name="info">The object that holds the serialized object data.</param>
+		/// <param name="context">The contextual information about the source or
+		/// destination.</param>
+		/// <remarks>This constructor is called during deserialization to
+		/// reconstitute the exception object transmitted over a stream.</remarks>
+		protected MappingException(SerializationInfo info, StreamingContext context) 
+			: base(info,context) 
+		{
+		}
+
+#endif
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MappingSchema.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,3921 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.Linq;
+using System.Data.SqlTypes;
+using System.Diagnostics;
+using System.Linq;
+using System.IO;
+using System.Reflection;
+using System.Diagnostics.CodeAnalysis;
+using System.Threading;
+using System.Xml;
+
+#if !SILVERLIGHT
+using System.Xml.Linq;
+#endif
+
+using BLToolkit.Common;
+using BLToolkit.Properties;
+using BLToolkit.Reflection;
+using BLToolkit.Reflection.Extension;
+using BLToolkit.Reflection.MetadataProvider;
+
+#region ReSharper disable
+// ReSharper disable SuggestUseVarKeywordEvident
+// ReSharper disable UseObjectOrCollectionInitializer
+// ReSharper disable SuggestUseVarKeywordEverywhere
+// ReSharper disable RedundantTypeArgumentsOfMethod
+#endregion
+
+using KeyValue = System.Collections.Generic.KeyValuePair<System.Type,System.Type>;
+using Convert  = BLToolkit.Common.Convert;
+
+namespace BLToolkit.Mapping
+{
+	public class MappingSchema
+	{
+		#region Constructors
+
+		public MappingSchema()
+		{
+			InitNullValues();
+		}
+
+		#endregion
+
+		#region ObjectMapper Support
+
+		private readonly Dictionary<Type,ObjectMapper> _mappers        = new Dictionary<Type,ObjectMapper>();
+		private readonly Dictionary<Type,ObjectMapper> _pendingMappers = new Dictionary<Type,ObjectMapper>();
+
+		public ObjectMapper GetObjectMapper(Type type)
+		{
+			ObjectMapper om;
+
+			lock (_mappers)
+			{
+				if (_mappers.TryGetValue(type, out om))
+					return om;
+
+				// This object mapper is initializing right now.
+				// Note that only one thread can access to _pendingMappers each time.
+				//
+				if (_pendingMappers.TryGetValue(type, out om))
+					return om;
+
+				om = CreateObjectMapper(type);
+
+				if (om == null)
+					throw new MappingException(
+						string.Format("Cannot create object mapper for the '{0}' type.", type.FullName));
+
+				_pendingMappers.Add(type, om);
+
+				try
+				{
+					om.Init(this, type);
+				}
+				finally
+				{
+					_pendingMappers.Remove(type);
+				}
+
+				// Officially publish this ready to use object mapper.
+				//
+				SetObjectMapperInternal(type, om);
+
+				return om;
+			}
+		}
+
+		private void SetObjectMapperInternal(Type type, ObjectMapper om)
+		{
+			_mappers.Add(type, om);
+
+			if (type.IsAbstract)
+			{
+				var actualType = TypeAccessor.GetAccessor(type).Type;
+
+				if (!_mappers.ContainsKey(actualType))
+					_mappers.Add(actualType, om);
+			}
+		}
+
+		public void SetObjectMapper(Type type, ObjectMapper om)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			lock (_mappers)
+				SetObjectMapperInternal(type, om);
+		}
+
+		protected virtual ObjectMapper CreateObjectMapper(Type type)
+		{
+			Attribute attr = TypeHelper.GetFirstAttribute(type, typeof(ObjectMapperAttribute));
+			return attr == null? CreateObjectMapperInstance(type): ((ObjectMapperAttribute)attr).ObjectMapper;
+		}
+
+		protected virtual ObjectMapper CreateObjectMapperInstance(Type type)
+		{
+			return new ObjectMapper();
+		}
+
+		#endregion
+
+		#region MetadataProvider
+
+		private MetadataProviderBase _metadataProvider;
+		public  MetadataProviderBase  MetadataProvider
+		{
+			[DebuggerStepThrough]
+			get { return _metadataProvider ?? (_metadataProvider = CreateMetadataProvider()); }
+			set { _metadataProvider = value; }
+		}
+
+		protected virtual MetadataProviderBase CreateMetadataProvider()
+		{
+			return MetadataProviderBase.CreateProvider();
+		}
+
+		#endregion
+
+		#region Public Members
+
+		public virtual ExtensionList Extensions { get; set; }
+
+		#endregion
+
+		#region Convert
+
+		public virtual void InitNullValues()
+		{
+			DefaultSByteNullValue          = (SByte)         GetNullValue(typeof(SByte));
+			DefaultInt16NullValue          = (Int16)         GetNullValue(typeof(Int16));
+			DefaultInt32NullValue          = (Int32)         GetNullValue(typeof(Int32));
+			DefaultInt64NullValue          = (Int64)         GetNullValue(typeof(Int64));
+			DefaultByteNullValue           = (Byte)          GetNullValue(typeof(Byte));
+			DefaultUInt16NullValue         = (UInt16)        GetNullValue(typeof(UInt16));
+			DefaultUInt32NullValue         = (UInt32)        GetNullValue(typeof(UInt32));
+			DefaultUInt64NullValue         = (UInt64)        GetNullValue(typeof(UInt64));
+			DefaultCharNullValue           = (Char)          GetNullValue(typeof(Char));
+			DefaultSingleNullValue         = (Single)        GetNullValue(typeof(Single));
+			DefaultDoubleNullValue         = (Double)        GetNullValue(typeof(Double));
+			DefaultBooleanNullValue        = (Boolean)       GetNullValue(typeof(Boolean));
+
+			DefaultStringNullValue         = (String)        GetNullValue(typeof(String));
+			DefaultDateTimeNullValue       = (DateTime)      GetNullValue(typeof(DateTime));
+			DefaultDateTimeOffsetNullValue = (DateTimeOffset)GetNullValue(typeof(DateTimeOffset));
+			DefaultLinqBinaryNullValue     = (Binary)        GetNullValue(typeof(Binary));
+			DefaultDecimalNullValue        = (Decimal)       GetNullValue(typeof(Decimal));
+			DefaultGuidNullValue           = (Guid)          GetNullValue(typeof(Guid));
+			DefaultStreamNullValue         = (Stream)        GetNullValue(typeof(Stream));
+#if !SILVERLIGHT
+			DefaultXmlReaderNullValue      = (XmlReader)     GetNullValue(typeof(XmlReader));
+			DefaultXmlDocumentNullValue    = (XmlDocument)   GetNullValue(typeof(XmlDocument));
+            DefaultXElementNullValue       = (XElement)      GetNullValue(typeof(XElement));
+#endif
+		}
+
+		#region Primitive Types
+
+		[CLSCompliant(false)]
+		public sbyte DefaultSByteNullValue { get; set; }
+
+		[CLSCompliant(false)]
+		public virtual SByte ConvertToSByte(object value)
+		{
+			return
+				value is SByte ? (SByte)value :
+				value is Byte ? (SByte)(Byte)value :
+				value == null ? DefaultSByteNullValue :
+					Convert.ToSByte(value);
+		}
+
+		public short DefaultInt16NullValue { get; set; }
+
+		public virtual Int16 ConvertToInt16(object value)
+		{
+			return
+				value is Int16? (Int16)value:
+				value == null || value is DBNull? DefaultInt16NullValue:
+					Convert.ToInt16(value);
+		}
+
+		public int DefaultInt32NullValue { get; set; }
+
+		public virtual Int32 ConvertToInt32(object value)
+		{
+			return
+				value is Int32? (Int32)value:
+				value == null || value is DBNull? DefaultInt32NullValue:
+					Convert.ToInt32(value);
+		}
+
+		public long DefaultInt64NullValue { get; set; }
+
+		public virtual Int64 ConvertToInt64(object value)
+		{
+			return
+				value is Int64? (Int64)value:
+				value == null || value is DBNull? DefaultInt64NullValue:
+					Convert.ToInt64(value);
+		}
+
+		public byte DefaultByteNullValue { get; set; }
+
+		public virtual Byte ConvertToByte(object value)
+		{
+			return
+				value is Byte? (Byte)value:
+				value == null || value is DBNull? DefaultByteNullValue:
+					Convert.ToByte(value);
+		}
+
+		[CLSCompliant(false)]
+		public ushort DefaultUInt16NullValue { get; set; }
+
+		[CLSCompliant(false)]
+		public virtual UInt16 ConvertToUInt16(object value)
+		{
+			return
+				value is UInt16? (UInt16)value:
+				value is Int16? (UInt16)(Int16)value:
+				value == null || value is DBNull? DefaultUInt16NullValue:
+					Convert.ToUInt16(value);
+		}
+
+		[CLSCompliant(false)]
+		public uint DefaultUInt32NullValue { get; set; }
+
+		[CLSCompliant(false)]
+		public virtual UInt32 ConvertToUInt32(object value)
+		{
+			return
+				value is UInt32? (UInt32)value:
+				value is Int32? (UInt32)(Int32)value:
+				value == null || value is DBNull? DefaultUInt32NullValue:
+					Convert.ToUInt32(value);
+		}
+
+		[CLSCompliant(false)]
+		public ulong DefaultUInt64NullValue { get; set; }
+
+		[CLSCompliant(false)]
+		public virtual UInt64 ConvertToUInt64(object value)
+		{
+			return
+				value is UInt64? (UInt64)value:
+				value is Int64? (UInt64)(Int64)value:
+				value == null || value is DBNull? DefaultUInt64NullValue:
+					Convert.ToUInt64(value);
+		}
+
+		public char DefaultCharNullValue { get; set; }
+
+		public virtual Char ConvertToChar(object value)
+		{
+			return
+				value is Char? (Char)value:
+				value == null || value is DBNull? DefaultCharNullValue:
+					Convert.ToChar(value);
+		}
+
+		public float DefaultSingleNullValue { get; set; }
+
+		public virtual Single ConvertToSingle(object value)
+		{
+			return
+				value is Single? (Single)value:
+				value == null || value is DBNull? DefaultSingleNullValue:
+					Convert.ToSingle(value);
+		}
+
+		public double DefaultDoubleNullValue { get; set; }
+
+		public virtual Double ConvertToDouble(object value)
+		{
+			return
+				value is Double? (Double)value:
+				value == null || value is DBNull? DefaultDoubleNullValue:
+					Convert.ToDouble(value);
+		}
+
+		public bool DefaultBooleanNullValue { get; set; }
+
+		public virtual Boolean ConvertToBoolean(object value)
+		{
+			return
+				value is Boolean? (Boolean)value:
+				value == null || value is DBNull? DefaultBooleanNullValue:
+					Convert.ToBoolean(value);
+		}
+
+		#endregion
+
+		#region Simple Types
+
+		public string DefaultStringNullValue { get; set; }
+
+		public virtual String ConvertToString(object value)
+		{
+			return
+				value is String? (String)value :
+				value == null || value is DBNull? DefaultStringNullValue:
+					Convert.ToString(value);
+		}
+
+		public DateTime DefaultDateTimeNullValue { get; set; }
+
+		public virtual DateTime ConvertToDateTime(object value)
+		{
+			return
+				value is DateTime? (DateTime)value:
+				value == null || value is DBNull? DefaultDateTimeNullValue:
+					Convert.ToDateTime(value);
+		}
+
+		public virtual TimeSpan ConvertToTimeSpan(object value)
+		{
+			return ConvertToDateTime(value).TimeOfDay;
+		}
+
+		public DateTimeOffset DefaultDateTimeOffsetNullValue { get; set; }
+
+		public virtual DateTimeOffset ConvertToDateTimeOffset(object value)
+		{
+			return
+				value is DateTimeOffset? (DateTimeOffset)value:
+				value == null || value is DBNull? DefaultDateTimeOffsetNullValue:
+					Convert.ToDateTimeOffset(value);
+		}
+
+		public Binary DefaultLinqBinaryNullValue { get; set; }
+
+		public virtual Binary ConvertToLinqBinary(object value)
+		{
+			return
+				value is Binary ? (Binary)value:
+				value is byte[] ? new Binary((byte[])value) : 
+				value == null || value is DBNull? DefaultLinqBinaryNullValue:
+					Convert.ToLinqBinary(value);
+		}
+
+		public decimal DefaultDecimalNullValue { get; set; }
+
+		public virtual Decimal ConvertToDecimal(object value)
+		{
+			return
+				value is Decimal? (Decimal)value:
+				value == null || value is DBNull? DefaultDecimalNullValue:
+					Convert.ToDecimal(value);
+		}
+
+		public Guid DefaultGuidNullValue { get; set; }
+
+		public virtual Guid ConvertToGuid(object value)
+		{
+			return
+				value is Guid? (Guid)value:
+				value == null || value is DBNull? DefaultGuidNullValue:
+					Convert.ToGuid(value);
+		}
+
+		public Stream DefaultStreamNullValue { get; set; }
+
+		public virtual Stream ConvertToStream(object value)
+		{
+			return
+				value is Stream? (Stream)value:
+				value == null || value is DBNull? DefaultStreamNullValue:
+					 Convert.ToStream(value);
+		}
+
+#if !SILVERLIGHT
+
+		public XmlReader DefaultXmlReaderNullValue { get; set; }
+
+		public virtual XmlReader ConvertToXmlReader(object value)
+		{
+			return
+				value is XmlReader? (XmlReader)value:
+				value == null || value is DBNull? DefaultXmlReaderNullValue:
+					Convert.ToXmlReader(value);
+		}
+
+		public XmlDocument DefaultXmlDocumentNullValue { get; set; }
+
+		public virtual XmlDocument ConvertToXmlDocument(object value)
+		{
+			return
+				value is XmlDocument? (XmlDocument)value:
+				value == null || value is DBNull? DefaultXmlDocumentNullValue:
+					Convert.ToXmlDocument(value);
+		}
+
+        public XElement DefaultXElementNullValue { get; set; }
+
+        public virtual XElement ConvertToXElement(object value)
+        {
+            return
+                value is XElement ? (XElement)value :
+                value == null || value is DBNull ? DefaultXElementNullValue :
+                    XElement.Parse(value.ToString());
+        }
+
+#endif
+
+		public virtual byte[] ConvertToByteArray(object value)
+		{
+			return
+				value is byte[]? (byte[])value:
+				value == null || value is DBNull? null:
+					Convert.ToByteArray(value);
+		}
+
+		public virtual char[] ConvertToCharArray(object value)
+		{
+			return
+				value is char[]? (char[])value:
+				value == null || value is DBNull? null:
+					Convert.ToCharArray(value);
+		}
+
+		#endregion
+
+		#region Nullable Types
+
+		[CLSCompliant(false)]
+		public virtual SByte? ConvertToNullableSByte(object value)
+		{
+			return
+				value is SByte? (SByte?)value:
+				value is Byte? (SByte?)(Byte)value:
+				value == null || value is DBNull? null:
+					Convert.ToNullableSByte(value);
+		}
+
+		public virtual Int16? ConvertToNullableInt16(object value)
+		{
+			return
+				value is Int16? (Int16?)value:
+				value == null || value is DBNull? null:
+					Convert.ToNullableInt16(value);
+		}
+
+		public virtual Int32? ConvertToNullableInt32(object value)
+		{
+			return
+				value is Int32? (Int32?)value:
+				value == null || value is DBNull? null:
+					Convert.ToNullableInt32(value);
+		}
+
+		public virtual Int64? ConvertToNullableInt64(object value)
+		{
+			return
+				value is Int64? (Int64?)value:
+				value == null || value is DBNull? null:
+					Convert.ToNullableInt64(value);
+		}
+
+		public virtual Byte? ConvertToNullableByte(object value)
+		{
+			return
+				value is Byte? (Byte?)value:
+				value == null || value is DBNull? null:
+					Convert.ToNullableByte(value);
+		}
+
+		[CLSCompliant(false)]
+		public virtual UInt16? ConvertToNullableUInt16(object value)
+		{
+			return
+				value is UInt16? (UInt16?)value:
+				value is Int16? (UInt16?)(Int16)value:
+				value == null || value is DBNull? null:
+					Convert.ToNullableUInt16(value);
+		}
+
+		[CLSCompliant(false)]
+		public virtual UInt32? ConvertToNullableUInt32(object value)
+		{
+			return
+				value is UInt32? (UInt32?)value:
+				value is Int32? (UInt32?)(Int32)value:
+				value == null || value is DBNull? null:
+					Convert.ToNullableUInt32(value);
+		}
+
+		[CLSCompliant(false)]
+		public virtual UInt64? ConvertToNullableUInt64(object value)
+		{
+			return
+				value is UInt64? (UInt64?)value:
+				value is Int64? (UInt64?)(Int64)value:
+				value == null || value is DBNull? null:
+					Convert.ToNullableUInt64(value);
+		}
+
+		public virtual Char? ConvertToNullableChar(object value)
+		{
+			return
+				value is Char? (Char?)value:
+				value == null || value is DBNull? null:
+					Convert.ToNullableChar(value);
+		}
+
+		public virtual Double? ConvertToNullableDouble(object value)
+		{
+			return
+				value is Double? (Double?)value:
+				value == null || value is DBNull? null:
+					Convert.ToNullableDouble(value);
+		}
+
+		public virtual Single? ConvertToNullableSingle(object value)
+		{
+			return
+				value is Single? (Single?)value:
+				value == null || value is DBNull? null:
+					Convert.ToNullableSingle(value);
+		}
+
+		public virtual Boolean? ConvertToNullableBoolean(object value)
+		{
+			return
+				value is Boolean? (Boolean?)value:
+				value == null || value is DBNull? null:
+					Convert.ToNullableBoolean(value);
+		}
+
+		public virtual DateTime? ConvertToNullableDateTime(object value)
+		{
+			return
+				value is DateTime? (DateTime?)value:
+				value == null || value is DBNull? null:
+					Convert.ToNullableDateTime(value);
+		}
+
+		public virtual TimeSpan? ConvertToNullableTimeSpan(object value)
+		{
+			DateTime? dt = ConvertToNullableDateTime(value);
+			return dt == null? null : (TimeSpan?)dt.Value.TimeOfDay;
+		}
+
+		public virtual DateTimeOffset? ConvertToNullableDateTimeOffset(object value)
+		{
+			return
+				value is DateTimeOffset? (DateTimeOffset?)value:
+				value == null || value is DBNull? null:
+					Convert.ToNullableDateTimeOffset(value);
+		}
+
+		public virtual Decimal? ConvertToNullableDecimal(object value)
+		{
+			return
+				value is Decimal? (Decimal?)value:
+				value == null || value is DBNull? null:
+					Convert.ToNullableDecimal(value);
+		}
+
+		public virtual Guid? ConvertToNullableGuid(object value)
+		{
+			return
+				value is Guid? (Guid?)value:
+				value == null || value is DBNull? null:
+					Convert.ToNullableGuid(value);
+		}
+
+		#endregion
+
+		#region SqlTypes
+
+#if !SILVERLIGHT
+
+		public virtual SqlByte ConvertToSqlByte(object value)
+		{
+			return
+				value == null || value is DBNull? SqlByte.Null :
+				value is SqlByte? (SqlByte)value:
+					Convert.ToSqlByte(value);
+		}
+
+		public virtual SqlInt16 ConvertToSqlInt16(object value)
+		{
+			return
+				value == null || value is DBNull? SqlInt16.Null:
+				value is SqlInt16? (SqlInt16)value:
+					Convert.ToSqlInt16(value);
+		}
+
+		public virtual SqlInt32 ConvertToSqlInt32(object value)
+		{
+			return
+				value == null || value is DBNull? SqlInt32.Null:
+				value is SqlInt32? (SqlInt32)value:
+					Convert.ToSqlInt32(value);
+		}
+
+		public virtual SqlInt64 ConvertToSqlInt64(object value)
+		{
+			return
+				value == null || value is DBNull? SqlInt64.Null:
+				value is SqlInt64? (SqlInt64)value:
+					Convert.ToSqlInt64(value);
+		}
+
+		public virtual SqlSingle ConvertToSqlSingle(object value)
+		{
+			return
+				value == null || value is DBNull? SqlSingle.Null:
+				value is SqlSingle? (SqlSingle)value:
+					Convert.ToSqlSingle(value);
+		}
+
+		public virtual SqlBoolean ConvertToSqlBoolean(object value)
+		{
+			return
+				value == null || value is DBNull? SqlBoolean.Null:
+				value is SqlBoolean? (SqlBoolean)value:
+					Convert.ToSqlBoolean(value);
+		}
+
+		public virtual SqlDouble ConvertToSqlDouble(object value)
+		{
+			return
+				value == null || value is DBNull? SqlDouble.Null:
+				value is SqlDouble? (SqlDouble)value:
+					Convert.ToSqlDouble(value);
+		}
+
+		public virtual SqlDateTime ConvertToSqlDateTime(object value)
+		{
+			return
+				value == null || value is DBNull? SqlDateTime.Null:
+				value is SqlDateTime? (SqlDateTime)value:
+					Convert.ToSqlDateTime(value);
+		}
+
+		public virtual SqlDecimal ConvertToSqlDecimal(object value)
+		{
+			return
+				value == null || value is DBNull? SqlDecimal.Null:
+				value is SqlDecimal? (SqlDecimal)value:
+				value is SqlMoney?   ((SqlMoney)value).ToSqlDecimal():
+					Convert.ToSqlDecimal(value);
+		}
+
+		public virtual SqlMoney ConvertToSqlMoney(object value)
+		{
+			return
+				value == null || value is DBNull? SqlMoney.Null:
+				value is SqlMoney?   (SqlMoney)value:
+				value is SqlDecimal? ((SqlDecimal)value).ToSqlMoney():
+					Convert.ToSqlMoney(value);
+		}
+
+		public virtual SqlString ConvertToSqlString(object value)
+		{
+			return
+				value == null || value is DBNull? SqlString.Null:
+				value is SqlString? (SqlString)value:
+					Convert.ToSqlString(value);
+		}
+
+		public virtual SqlBinary ConvertToSqlBinary(object value)
+		{
+			return
+				value == null || value is DBNull? SqlBinary.Null:
+				value is SqlBinary? (SqlBinary)value:
+					Convert.ToSqlBinary(value);
+		}
+
+		public virtual SqlGuid ConvertToSqlGuid(object value)
+		{
+			return
+				value == null || value is DBNull? SqlGuid.Null:
+				value is SqlGuid? (SqlGuid)value:
+					Convert.ToSqlGuid(value);
+		}
+
+		public virtual SqlBytes ConvertToSqlBytes(object value)
+		{
+			return
+				value == null || value is DBNull? SqlBytes.Null:
+				value is SqlBytes? (SqlBytes)value:
+					Convert.ToSqlBytes(value);
+		}
+
+		public virtual SqlChars ConvertToSqlChars(object value)
+		{
+			return
+				value == null || value is DBNull? SqlChars.Null:
+				value is SqlChars? (SqlChars)value:
+					Convert.ToSqlChars(value);
+		}
+
+		public virtual SqlXml ConvertToSqlXml(object value)
+		{
+			return
+				value == null || value is DBNull? SqlXml.Null:
+				value is SqlXml? (SqlXml)value:
+					Convert.ToSqlXml(value);
+		}
+
+#endif
+
+		#endregion
+
+		#region General case
+
+		public virtual T GetDefaultNullValue<T>()
+		{
+			switch (Type.GetTypeCode(typeof(T)))
+			{
+				case TypeCode.Boolean:  return (T)(object)DefaultBooleanNullValue;
+				case TypeCode.Byte:     return (T)(object)DefaultByteNullValue;
+				case TypeCode.Char:     return (T)(object)DefaultCharNullValue;
+				case TypeCode.DateTime: return (T)(object)DefaultDateTimeNullValue;
+				case TypeCode.Decimal:  return (T)(object)DefaultDecimalNullValue;
+				case TypeCode.Double:   return (T)(object)DefaultDoubleNullValue;
+				case TypeCode.Int16:    return (T)(object)DefaultInt16NullValue;
+				case TypeCode.Int32:    return (T)(object)DefaultInt32NullValue;
+				case TypeCode.Int64:    return (T)(object)DefaultInt64NullValue;
+				case TypeCode.SByte:    return (T)(object)DefaultSByteNullValue;
+				case TypeCode.Single:   return (T)(object)DefaultSingleNullValue;
+				case TypeCode.String:   return (T)(object)DefaultStringNullValue;
+				case TypeCode.UInt16:   return (T)(object)DefaultUInt16NullValue;
+				case TypeCode.UInt32:   return (T)(object)DefaultUInt32NullValue;
+				case TypeCode.UInt64:   return (T)(object)DefaultUInt64NullValue;
+			}
+
+			if (typeof(Guid)           == typeof(T)) return (T)(object)DefaultGuidNullValue;
+			if (typeof(Stream)         == typeof(T)) return (T)(object)DefaultStreamNullValue;
+#if !SILVERLIGHT
+			if (typeof(XmlReader)      == typeof(T)) return (T)(object)DefaultXmlReaderNullValue;
+			if (typeof(XmlDocument)    == typeof(T)) return (T)(object)DefaultXmlDocumentNullValue;
+            if (typeof(XElement)       == typeof(T)) return (T)(object)DefaultXElementNullValue;
+#endif
+			if (typeof(DateTimeOffset) == typeof(T)) return (T)(object)DefaultDateTimeOffsetNullValue;
+
+			return default(T);
+		}
+
+		public virtual T ConvertTo<T,TP>(TP value)
+		{
+			return Equals(value, default(TP))?
+				GetDefaultNullValue<T>():
+				Convert<T,TP>.From(value);
+		}
+
+		public virtual object ConvertChangeType(object value, Type conversionType)
+		{
+			return ConvertChangeType(value, conversionType, TypeHelper.IsNullable(conversionType));
+		}
+
+		public virtual object ConvertChangeType(object value, Type conversionType, bool isNullable)
+		{
+			if (conversionType.IsArray)
+			{
+				if (null == value)
+					return null;
+				
+				Type srcType = value.GetType();
+
+				if (srcType == conversionType)
+					return value;
+
+				if (srcType.IsArray)
+				{
+					Type srcElementType = srcType.GetElementType();
+					Type dstElementType = conversionType.GetElementType();
+
+					if (srcElementType.IsArray != dstElementType.IsArray
+						|| (srcElementType.IsArray &&
+							srcElementType.GetArrayRank() != dstElementType.GetArrayRank()))
+					{
+						throw new InvalidCastException(string.Format(
+							Resources.MappingSchema_IncompatibleArrayTypes,
+							srcType.FullName, conversionType.FullName));
+					}
+
+					Array srcArray = (Array)value;
+					Array dstArray;
+
+					int rank = srcArray.Rank;
+
+					if (rank == 1 && 0 == srcArray.GetLowerBound(0))
+					{
+						int arrayLength = srcArray.Length;
+
+						dstArray = Array.CreateInstance(dstElementType, arrayLength);
+
+						// Int32 is assignable from UInt32, SByte from Byte and so on.
+						//
+						if (dstElementType.IsAssignableFrom(srcElementType))
+							Array.Copy(srcArray, dstArray, arrayLength);
+						else
+							for (int i = 0; i < arrayLength; ++i)
+								dstArray.SetValue(ConvertChangeType(srcArray.GetValue(i), dstElementType, isNullable), i);
+					}
+					else
+					{
+#if SILVERLIGHT
+						throw new InvalidOperationException();
+#else
+						var arrayLength = 1;
+						var dimensions  = new int[rank];
+						var indices     = new int[rank];
+						var lbounds     = new int[rank];
+
+						for (int i = 0; i < rank; ++i)
+						{
+							arrayLength *= (dimensions[i] = srcArray.GetLength(i));
+							lbounds[i] = srcArray.GetLowerBound(i);
+						}
+
+						dstArray = Array.CreateInstance(dstElementType, dimensions, lbounds);
+
+						for (int i = 0; i < arrayLength; ++i)
+						{
+							var index = i;
+
+							for (var j = rank - 1; j >= 0; --j)
+							{
+								indices[j] = index % dimensions[j] + lbounds[j];
+								index /= dimensions[j];
+							}
+
+							dstArray.SetValue(ConvertChangeType(srcArray.GetValue(indices), dstElementType, isNullable), indices);
+						}
+
+#endif
+					}
+
+					return dstArray;
+				}
+			}
+			else if (conversionType.IsEnum)
+			{
+				return MapValueToEnum(value, conversionType);
+			}
+
+			if (isNullable)
+			{
+				if (TypeHelper.IsNullable(conversionType))
+				{
+					// Return a null reference or boxed not null value.
+					//
+					return value == null || value is DBNull? null:
+						ConvertChangeType(value, conversionType.GetGenericArguments()[0]);
+				}
+
+				Type type = conversionType.IsEnum? Enum.GetUnderlyingType(conversionType): conversionType;
+
+				switch (Type.GetTypeCode(type))
+				{
+					case TypeCode.Boolean:  return ConvertToNullableBoolean (value);
+					case TypeCode.Byte:     return ConvertToNullableByte    (value);
+					case TypeCode.Char:     return ConvertToNullableChar    (value);
+					case TypeCode.DateTime: return ConvertToNullableDateTime(value);
+					case TypeCode.Decimal:  return ConvertToNullableDecimal (value);
+					case TypeCode.Double:   return ConvertToNullableDouble  (value);
+					case TypeCode.Int16:    return ConvertToNullableInt16   (value);
+					case TypeCode.Int32:    return ConvertToNullableInt32   (value);
+					case TypeCode.Int64:    return ConvertToNullableInt64   (value);
+					case TypeCode.SByte:    return ConvertToNullableSByte   (value);
+					case TypeCode.Single:   return ConvertToNullableSingle  (value);
+					case TypeCode.UInt16:   return ConvertToNullableUInt16  (value);
+					case TypeCode.UInt32:   return ConvertToNullableUInt32  (value);
+					case TypeCode.UInt64:   return ConvertToNullableUInt64  (value);
+				}
+
+				if (typeof(Guid)           == conversionType) return ConvertToNullableGuid(value);
+				if (typeof(DateTimeOffset) == conversionType) return ConvertToNullableDateTimeOffset(value);
+				if (typeof(TimeSpan)       == conversionType) return ConvertToNullableTimeSpan(value);	
+			}
+
+			switch (Type.GetTypeCode(conversionType))
+			{
+				case TypeCode.Boolean:  return ConvertToBoolean (value);
+				case TypeCode.Byte:     return ConvertToByte    (value);
+				case TypeCode.Char:     return ConvertToChar    (value);
+				case TypeCode.DateTime: return ConvertToDateTime(value);
+				case TypeCode.Decimal:  return ConvertToDecimal (value);
+				case TypeCode.Double:   return ConvertToDouble  (value);
+				case TypeCode.Int16:    return ConvertToInt16   (value);
+				case TypeCode.Int32:    return ConvertToInt32   (value);
+				case TypeCode.Int64:    return ConvertToInt64   (value);
+				case TypeCode.SByte:    return ConvertToSByte   (value);
+				case TypeCode.Single:   return ConvertToSingle  (value);
+				case TypeCode.String:   return ConvertToString  (value);
+				case TypeCode.UInt16:   return ConvertToUInt16  (value);
+				case TypeCode.UInt32:   return ConvertToUInt32  (value);
+				case TypeCode.UInt64:   return ConvertToUInt64  (value);
+			}
+
+			if (typeof(Guid)           == conversionType) return ConvertToGuid          (value);
+			if (typeof(Stream)         == conversionType) return ConvertToStream        (value);
+#if !SILVERLIGHT
+			if (typeof(XmlReader)      == conversionType) return ConvertToXmlReader     (value);
+			if (typeof(XmlDocument)    == conversionType) return ConvertToXmlDocument   (value);
+            if (typeof(XElement)       == conversionType) return ConvertToXElement      (value);
+#endif
+			if (typeof(byte[])         == conversionType) return ConvertToByteArray     (value);
+			if (typeof(Binary)         == conversionType) return ConvertToLinqBinary    (value);
+			if (typeof(DateTimeOffset) == conversionType) return ConvertToDateTimeOffset(value);
+			if (typeof(char[])         == conversionType) return ConvertToCharArray     (value);
+			if (typeof(TimeSpan)       == conversionType) return ConvertToTimeSpan      (value);
+
+#if !SILVERLIGHT
+
+			if (typeof(SqlInt32)       == conversionType) return ConvertToSqlInt32      (value);
+			if (typeof(SqlString)      == conversionType) return ConvertToSqlString     (value);
+			if (typeof(SqlDecimal)     == conversionType) return ConvertToSqlDecimal    (value);
+			if (typeof(SqlDateTime)    == conversionType) return ConvertToSqlDateTime   (value);
+			if (typeof(SqlBoolean)     == conversionType) return ConvertToSqlBoolean    (value);
+			if (typeof(SqlMoney)       == conversionType) return ConvertToSqlMoney      (value);
+			if (typeof(SqlGuid)        == conversionType) return ConvertToSqlGuid       (value);
+			if (typeof(SqlDouble)      == conversionType) return ConvertToSqlDouble     (value);
+			if (typeof(SqlByte)        == conversionType) return ConvertToSqlByte       (value);
+			if (typeof(SqlInt16)       == conversionType) return ConvertToSqlInt16      (value);
+			if (typeof(SqlInt64)       == conversionType) return ConvertToSqlInt64      (value);
+			if (typeof(SqlSingle)      == conversionType) return ConvertToSqlSingle     (value);
+			if (typeof(SqlBinary)      == conversionType) return ConvertToSqlBinary     (value);
+			if (typeof(SqlBytes)       == conversionType) return ConvertToSqlBytes      (value);
+			if (typeof(SqlChars)       == conversionType) return ConvertToSqlChars      (value);
+			if (typeof(SqlXml)         == conversionType) return ConvertToSqlXml        (value);
+
+#endif
+
+			return System.Convert.ChangeType(value, conversionType, Thread.CurrentThread.CurrentCulture);
+		}
+
+		#endregion
+		
+		#endregion
+
+		#region Factory Members
+
+		public virtual DataReaderMapper CreateDataReaderMapper(IDataReader dataReader)
+		{
+			return new DataReaderMapper(this, dataReader);
+		}
+
+		public virtual DataReaderListMapper CreateDataReaderListMapper(IDataReader reader)
+		{
+			return new DataReaderListMapper(CreateDataReaderMapper(reader));
+		}
+
+		public virtual DataReaderMapper CreateDataReaderMapper(
+			IDataReader          dataReader,
+			NameOrIndexParameter nameOrIndex)
+		{
+			return new ScalarDataReaderMapper(this, dataReader, nameOrIndex);
+		}
+
+		public virtual DataReaderListMapper CreateDataReaderListMapper(
+			IDataReader          reader,
+			NameOrIndexParameter nameOrIndex)
+		{
+			return new DataReaderListMapper(CreateDataReaderMapper(reader, nameOrIndex));
+		}
+
+#if !SILVERLIGHT
+
+		public virtual DataRowMapper CreateDataRowMapper(
+			DataRow        row,
+			DataRowVersion version)
+		{
+			return new DataRowMapper(row, version);
+		}
+
+		public virtual DataTableMapper CreateDataTableMapper(
+			DataTable      dataTable,
+			DataRowVersion version)
+		{
+			return new DataTableMapper(dataTable, CreateDataRowMapper(null, version));
+		}
+
+#endif
+
+		public virtual DictionaryMapper CreateDictionaryMapper(IDictionary dictionary)
+		{
+			return new DictionaryMapper(dictionary);
+		}
+
+		public virtual DictionaryListMapper CreateDictionaryListMapper(
+			IDictionary          dic,
+			NameOrIndexParameter keyFieldNameOrIndex,
+			ObjectMapper         objectMapper)
+		{
+			return new DictionaryListMapper(dic, keyFieldNameOrIndex, objectMapper);
+		}
+		
+		public virtual DictionaryIndexListMapper CreateDictionaryListMapper(
+			IDictionary  dic,
+			MapIndex     index,
+			ObjectMapper objectMapper)
+		{
+			return new DictionaryIndexListMapper(dic, index, objectMapper);
+		}
+
+		public virtual DictionaryListMapper<TK,T> CreateDictionaryListMapper<TK,T>(
+			IDictionary<TK,T>     dic,
+			NameOrIndexParameter keyFieldNameOrIndex,
+			ObjectMapper         objectMapper)
+		{
+			return new DictionaryListMapper<TK,T>(dic, keyFieldNameOrIndex, objectMapper);
+		}
+
+		public virtual DictionaryIndexListMapper<T> CreateDictionaryListMapper<T>(
+			IDictionary<CompoundValue,T> dic,
+			MapIndex                     index,
+			ObjectMapper                 objectMapper)
+		{
+			return new DictionaryIndexListMapper<T>(dic, index, objectMapper);
+		}
+
+		public virtual EnumeratorMapper CreateEnumeratorMapper(IEnumerator enumerator)
+		{
+			return new EnumeratorMapper(enumerator);
+		}
+
+		public virtual ObjectListMapper CreateObjectListMapper(IList list, ObjectMapper objectMapper)
+		{
+			return new ObjectListMapper(list, objectMapper);
+		}
+
+		public virtual ScalarListMapper CreateScalarListMapper(IList list, Type type)
+		{
+			return new ScalarListMapper(list, type);
+		}
+
+		public virtual SimpleDestinationListMapper CreateScalarDestinationListMapper(IList list, Type type)
+		{
+			return new SimpleDestinationListMapper(CreateScalarListMapper(list, type));
+		}
+
+		public virtual SimpleSourceListMapper CreateScalarSourceListMapper(IList list, Type type)
+		{
+			return new SimpleSourceListMapper(CreateScalarListMapper(list, type));
+		}
+
+		public virtual ScalarListMapper<T> CreateScalarListMapper<T>(IList<T> list)
+		{
+			return new ScalarListMapper<T>(this, list);
+		}
+
+		public virtual SimpleDestinationListMapper CreateScalarDestinationListMapper<T>(IList<T> list)
+		{
+			return new SimpleDestinationListMapper(CreateScalarListMapper<T>(list));
+		}
+
+		#endregion
+
+		#region GetNullValue
+
+		public virtual object GetNullValue(Type type)
+		{
+			return TypeAccessor.GetNullValue(type);
+		}
+
+		public virtual bool IsNull(object value)
+		{
+			return TypeAccessor.IsNull(value);
+		}
+
+		#endregion
+
+		#region GetMapValues
+
+		private readonly Dictionary<Type,MapValue[]> _mapValues = new Dictionary<Type,MapValue[]>();
+
+		public virtual MapValue[] GetMapValues([JetBrains.Annotations.NotNull] Type type)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			lock (_mapValues)
+			{
+				MapValue[] mapValues;
+
+				if (_mapValues.TryGetValue(type, out mapValues))
+					return mapValues;
+
+				var  typeExt = TypeExtension.GetTypeExtension(type, Extensions);
+				bool isSet;
+
+				mapValues = MetadataProvider.GetMapValues(typeExt, type, out isSet);
+
+				_mapValues.Add(type, mapValues);
+
+				return mapValues;
+			}
+		}
+
+		private readonly Dictionary<MemberAccessor, MapValue[]> _memberMapValues = new Dictionary<MemberAccessor, MapValue[]>();
+
+		private Type GetMapValueType(MapValue[] mapValues)
+		{
+			if (mapValues != null)
+			{
+				var value = mapValues.SelectMany(mv => mv.MapValues).FirstOrDefault();
+				if (value != null)
+				{
+					return value.GetType();
+				}
+			}
+			return null;
+		}
+
+		public virtual MapValue[] GetMapValues([JetBrains.Annotations.NotNull] MemberAccessor memberAccessor)
+		{
+			if (memberAccessor == null) throw new ArgumentNullException("memberAccessor");
+
+			lock (_memberMapValues)
+			{
+				MapValue[] mapValues;
+
+				if (_memberMapValues.TryGetValue(memberAccessor, out mapValues))
+					return mapValues;
+
+				var typeExt = TypeExtension.GetTypeExtension(memberAccessor.Type, Extensions);
+				bool isSet;
+
+				mapValues = MetadataProvider.GetMapValues(typeExt, memberAccessor, out isSet);
+
+				_memberMapValues.Add(memberAccessor, mapValues);
+
+				return mapValues;
+			}
+		}
+
+		#endregion
+
+		#region GetDefaultValue
+
+		private readonly Dictionary<Type,object> _defaultValues = new Dictionary<Type,object>();
+
+		public virtual object GetDefaultValue([JetBrains.Annotations.NotNull] Type type)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			lock (_defaultValues)
+			{
+				object defaultValue;
+
+				if (_defaultValues.TryGetValue(type, out defaultValue))
+					return defaultValue;
+
+				var  typeExt = TypeExtension.GetTypeExtension(type, Extensions);
+				bool isSet;
+
+				defaultValue = MetadataProvider.GetDefaultValue(this, typeExt, type, out isSet);
+
+				_defaultValues.Add(type, defaultValue = TypeExtension.ChangeType(defaultValue, type));
+
+				return defaultValue;
+			}
+		}
+
+		#endregion
+
+		#region GetDataSource, GetDataDestination
+
+		[CLSCompliant(false)]
+		public virtual IMapDataSource GetDataSource(object obj)
+		{
+			if (obj == null) throw new ArgumentNullException("obj");
+
+			if (obj is IMapDataSource)
+				return (IMapDataSource)obj;
+
+			if (obj is IDataReader)
+				return CreateDataReaderMapper((IDataReader)obj);
+
+#if !SILVERLIGHT
+
+			if (obj is DataRow)
+				return CreateDataRowMapper((DataRow)obj, DataRowVersion.Default);
+
+			if (obj is DataRowView)
+				return CreateDataRowMapper(
+					((DataRowView)obj).Row,
+					((DataRowView)obj).RowVersion);
+
+			if (obj is DataTable)
+				return CreateDataRowMapper(((DataTable)(obj)).Rows[0], DataRowVersion.Default);
+
+#endif
+
+			if (obj is IDictionary)
+				return CreateDictionaryMapper((IDictionary)obj);
+
+			return GetObjectMapper(obj.GetType());
+		}
+
+		[CLSCompliant(false)]
+		public virtual IMapDataDestination GetDataDestination(object obj)
+		{
+			if (obj == null) throw new ArgumentNullException("obj");
+
+			if (obj is IMapDataDestination)
+				return (IMapDataDestination)obj;
+
+#if !SILVERLIGHT
+
+			if (obj is DataRow)
+				return CreateDataRowMapper((DataRow)obj, DataRowVersion.Default);
+
+			if (obj is DataRowView)
+				return CreateDataRowMapper(
+					((DataRowView)obj).Row,
+					((DataRowView)obj).RowVersion);
+
+			if (obj is DataTable)
+			{
+				DataTable dt = obj as DataTable;
+				DataRow   dr = dt.NewRow();
+
+				dt.Rows.Add(dr);
+
+				return CreateDataRowMapper(dr, DataRowVersion.Default);
+			}
+
+#endif
+
+			if (obj is IDictionary)
+				return CreateDictionaryMapper((IDictionary)obj);
+
+			return GetObjectMapper(obj.GetType());
+		}
+
+		[CLSCompliant(false)]
+		public virtual IMapDataSourceList GetDataSourceList(object obj)
+		{
+			if (obj == null) throw new ArgumentNullException("obj");
+
+			if (obj is IMapDataSourceList)
+				return (IMapDataSourceList)obj;
+
+			if (obj is IDataReader)
+				return CreateDataReaderListMapper((IDataReader)obj);
+
+			Type type = obj.GetType().GetElementType();
+
+			return TypeHelper.IsScalar(type)?
+				(IMapDataSourceList)CreateScalarSourceListMapper((IList)obj, type):
+				CreateObjectListMapper((IList)obj, CreateObjectMapper(type));
+		}
+
+		[CLSCompliant(false)]
+		public virtual IMapDataDestinationList GetDataDestinationList(object obj)
+		{
+			if (obj == null) throw new ArgumentNullException("obj");
+
+			if (obj is IMapDataDestinationList)
+				return (IMapDataDestinationList)obj;
+
+			Type type = obj.GetType().GetElementType();
+
+			return TypeHelper.IsScalar(type)?
+				(IMapDataDestinationList)CreateScalarDestinationListMapper((IList)obj, type):
+				CreateObjectListMapper((IList)obj, CreateObjectMapper(type));
+		}
+
+		#endregion
+
+		#region ValueMapper
+
+		[CLSCompliant(false)]
+		public virtual IValueMapper DefaultValueMapper
+		{
+			get { return ValueMapping.DefaultMapper; }
+		}
+
+		internal readonly Dictionary<Type,IValueMapper>     SameTypeMappers      = new Dictionary<Type,IValueMapper>();
+		internal readonly Dictionary<KeyValue,IValueMapper> DifferentTypeMappers = new Dictionary<KeyValue,IValueMapper>();
+
+		[CLSCompliant(false)]
+		public void SetValueMapper(
+			Type         sourceType,
+			Type         destType,
+			IValueMapper mapper)
+		{
+			if (sourceType == null) sourceType = typeof(object);
+			if (destType   == null) destType   = typeof(object);
+
+			if (sourceType == destType)
+			{
+				lock (SameTypeMappers)
+				{
+					if (mapper == null)
+						SameTypeMappers.Remove(sourceType);
+					else if (SameTypeMappers.ContainsKey(sourceType))
+						SameTypeMappers[sourceType] = mapper;
+					else
+						SameTypeMappers.Add(sourceType, mapper);
+				}
+			}
+			else
+			{
+				KeyValue key = new KeyValue(sourceType, destType);
+
+				lock (DifferentTypeMappers)
+				{
+					if (mapper == null)
+						DifferentTypeMappers.Remove(key);
+					else if (DifferentTypeMappers.ContainsKey(key))
+						DifferentTypeMappers[key] = mapper;
+					else
+						DifferentTypeMappers.Add(key, mapper);
+				}
+			}
+		}
+
+		[CLSCompliant(false)]
+		protected internal virtual IValueMapper GetValueMapper(
+			Type sourceType,
+			Type destType)
+		{
+			return ValueMapping.GetMapper(sourceType, destType);
+		}
+
+		[CLSCompliant(false)]
+		internal protected IValueMapper[] GetValueMappers(
+			IMapDataSource      source,
+			IMapDataDestination dest,
+			int[]               index)
+		{
+			IValueMapper[] mappers = new IValueMapper[index.Length];
+
+			for (int i = 0; i < index.Length; i++)
+			{
+				int n = index[i];
+
+				if (n < 0)
+					continue;
+
+				if (!source.SupportsTypedValues(i) || !dest.SupportsTypedValues(n))
+				{
+					mappers[i] = DefaultValueMapper;
+					continue;
+				}
+
+				Type sourceType = source.GetFieldType(i);
+				Type destType   = dest.  GetFieldType(n);
+
+				if (sourceType == null) sourceType = typeof(object);
+				if (destType   == null) destType   = typeof(object);
+
+				IValueMapper t;
+
+				if (sourceType == destType)
+				{
+					lock (SameTypeMappers)
+						if (!SameTypeMappers.TryGetValue(sourceType, out t))
+							SameTypeMappers.Add(sourceType, t = GetValueMapper(sourceType, destType));
+				}
+				else
+				{
+					var key = new KeyValue(sourceType, destType);
+
+					lock (DifferentTypeMappers)
+						if (!DifferentTypeMappers.TryGetValue(key, out t))
+								DifferentTypeMappers[key] = t = GetValueMapper(sourceType, destType);
+				}
+
+				mappers[i] = t;
+			}
+
+			return mappers;
+		}
+
+		#endregion
+
+		#region Base Mapping
+
+		[CLSCompliant(false)]
+		internal protected static int[] GetIndex(
+			IMapDataSource      source,
+			IMapDataDestination dest)
+		{
+			int   count = source.Count;
+			int[] index = new int[count];
+
+			for (int i = 0; i < count; i++)
+				index[i] = dest.GetOrdinal(source.GetName(i));
+
+			return index;
+		}
+
+		[CLSCompliant(false), Obsolete]
+		protected static void MapInternal(
+			IMapDataSource      source, object sourceObject,
+			IMapDataDestination dest,   object destObject,
+			int[]               index)
+		{
+			for (int i = 0; i < index.Length; i++)
+			{
+				int n = index[i];
+
+				if (n >= 0)
+					dest.SetValue(destObject, n, source.GetValue(sourceObject, i));
+			}
+		}
+
+		[CLSCompliant(false)]
+		internal protected static void MapInternal(
+			IMapDataSource      source, object sourceObject,
+			IMapDataDestination dest,   object destObject,
+			int[]               index,
+			IValueMapper[]      mappers)
+		{
+			for (int i = 0; i < index.Length; i++)
+			{
+				int n = index[i];
+
+				if (n >= 0)
+					mappers[i].Map(source, sourceObject, i, dest, destObject, n);
+			}
+		}
+
+		[CLSCompliant(false)]
+		protected virtual void MapInternal(
+			InitContext         initContext,
+			IMapDataSource      source, object sourceObject, 
+			IMapDataDestination dest,   object destObject,
+			params object[]     parameters)
+		{
+			ISupportMapping smSource = sourceObject as ISupportMapping;
+			ISupportMapping smDest   = destObject   as ISupportMapping;
+
+			if (smSource != null)
+			{
+				if (initContext == null)
+				{
+					initContext = new InitContext();
+
+					initContext.MappingSchema = this;
+					initContext.DataSource    = source;
+					initContext.SourceObject  = sourceObject;
+					initContext.ObjectMapper  = dest as ObjectMapper;
+					initContext.Parameters    = parameters;
+				}
+
+				initContext.IsSource = true;
+				smSource.BeginMapping(initContext);
+				initContext.IsSource = false;
+
+				if (initContext.StopMapping)
+					return;
+			}
+
+			if (smDest != null)
+			{
+				if (initContext == null)
+				{
+					initContext = new InitContext();
+
+					initContext.MappingSchema = this;
+					initContext.DataSource    = source;
+					initContext.SourceObject  = sourceObject;
+					initContext.ObjectMapper  = dest as ObjectMapper;
+					initContext.Parameters    = parameters;
+				}
+
+				smDest.BeginMapping(initContext);
+
+				if (initContext.StopMapping)
+					return;
+
+				if (dest != initContext.ObjectMapper && initContext.ObjectMapper != null)
+					dest = initContext.ObjectMapper;
+			}
+
+			int[]          index   = GetIndex       (source, dest);
+			IValueMapper[] mappers = GetValueMappers(source, dest, index);
+
+			MapInternal(source, sourceObject, dest, destObject, index, mappers);
+
+			if (smDest != null)
+				smDest.EndMapping(initContext);
+
+			if (smSource != null)
+			{
+				initContext.IsSource = true;
+				smSource.EndMapping(initContext);
+				initContext.IsSource = false;
+			}
+		}
+
+		protected virtual object MapInternal(InitContext initContext)
+		{
+			object dest = initContext.ObjectMapper.CreateInstance(initContext);
+
+			if (initContext.StopMapping == false)
+			{
+				MapInternal(initContext,
+					initContext.DataSource, initContext.SourceObject,
+					initContext.ObjectMapper, dest,
+					initContext.Parameters);
+			}
+
+			return dest;
+		}
+
+		[CLSCompliant(false)]
+		public void MapSourceToDestination(
+			IMapDataSource      source, object sourceObject, 
+			IMapDataDestination dest,   object destObject,
+			params object[]     parameters)
+		{
+			MapInternal(null, source, sourceObject, dest, destObject, parameters);
+		}
+
+		public void MapSourceToDestination(
+			object          sourceObject,
+			object          destObject,
+			params object[] parameters)
+		{
+			IMapDataSource      source = GetDataSource     (sourceObject);
+			IMapDataDestination dest   = GetDataDestination(destObject);
+
+			MapInternal(null, source, sourceObject, dest, destObject, parameters);
+		}
+
+		private static readonly ObjectMapper _nullMapper = new ObjectMapper();
+
+		private class MapInfo
+		{
+			public int[]          Index;
+			public IValueMapper[] Mappers;
+		}
+
+		[CLSCompliant(false)]
+		public virtual void MapSourceListToDestinationList(
+			IMapDataSourceList      dataSourceList,
+			IMapDataDestinationList dataDestinationList,
+			params object[]         parameters)
+		{
+			if (dataSourceList      == null) throw new ArgumentNullException("dataSourceList");
+			if (dataDestinationList == null) throw new ArgumentNullException("dataDestinationList");
+
+			Dictionary<ObjectMapper,MapInfo> infos = new Dictionary<ObjectMapper,MapInfo>();
+
+			InitContext ctx = new InitContext();
+
+			ctx.MappingSchema = this;
+			ctx.Parameters    = parameters;
+
+			dataSourceList.     InitMapping(ctx); if (ctx.StopMapping) return;
+			dataDestinationList.InitMapping(ctx); if (ctx.StopMapping) return;
+
+			int[]               index   = null;
+			IValueMapper[]      mappers = null;
+			ObjectMapper        current = _nullMapper;
+			IMapDataDestination dest    = dataDestinationList.GetDataDestination(ctx);
+			ObjectMapper        om      = dest as ObjectMapper;
+
+			while (dataSourceList.SetNextDataSource(ctx))
+			{
+				ctx.ObjectMapper = om;
+				ctx.StopMapping  = false;
+
+				object destObject = dataDestinationList.GetNextObject(ctx);
+
+				if (ctx.StopMapping) continue;
+
+				ISupportMapping smSource = ctx.SourceObject as ISupportMapping;
+				ISupportMapping smDest   = destObject       as ISupportMapping;
+
+				if (smSource != null)
+				{
+					ctx.IsSource = true;
+					smSource.BeginMapping(ctx);
+					ctx.IsSource = false;
+
+					if (ctx.StopMapping)
+						continue;
+				}
+
+				if (smDest != null)
+				{
+					smDest.BeginMapping(ctx);
+
+					if (ctx.StopMapping)
+						continue;
+				}
+
+				IMapDataDestination currentDest = current ?? dest;
+
+				if (current != ctx.ObjectMapper)
+				{
+					current     = ctx.ObjectMapper;
+					currentDest = current ?? dest;
+
+					if (current != null)
+					{
+						MapInfo info;
+						if (!infos.TryGetValue(current, out info))
+						{
+							info = new MapInfo();
+
+							info.Index   = GetIndex(ctx.DataSource, currentDest);
+							info.Mappers = GetValueMappers(ctx.DataSource, currentDest, info.Index);
+
+							infos.Add(current, info);
+						}
+
+						index   = info.Index;
+						mappers = info.Mappers;
+					}
+					else
+					{
+						index   = GetIndex(ctx.DataSource, currentDest);
+						mappers = GetValueMappers(ctx.DataSource, currentDest, index);
+					}
+				}
+
+				MapInternal(
+					ctx.DataSource,
+					ctx.SourceObject,
+					currentDest,
+					destObject,
+					index,
+					mappers);
+
+				if (smDest != null)
+					smDest.EndMapping(ctx);
+
+				if (smSource != null)
+				{
+					ctx.IsSource = true;
+					smSource.EndMapping(ctx);
+					ctx.IsSource = false;
+				}
+			}
+
+			dataDestinationList.EndMapping(ctx);
+			dataSourceList.     EndMapping(ctx);
+		}
+
+		#endregion
+
+		#region ValueToEnum, EnumToValue
+
+		[SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]
+		public virtual object MapValueToEnum(object value, Type type)
+		{
+			if (value == null || value == DBNull.Value)
+				return GetNullValue(type);
+
+			MapValue[] mapValues = GetMapValues(type);
+
+			var mapValueType = GetMapValueType(mapValues);
+			if (mapValueType != null && value.GetType() != mapValueType)
+			{
+				value = ConvertChangeType(value, mapValueType);
+			}
+
+			if (mapValues != null)
+			{
+				var comp = (IComparable)value;
+
+				foreach (MapValue mv in mapValues)
+				foreach (object mapValue in mv.MapValues)
+				{
+					try
+					{
+						if (comp.CompareTo(mapValue) == 0)
+							return mv.OrigValue;
+					}
+					catch (ArgumentException ex)
+					{
+						Debug.WriteLine(ex.Message, MethodBase.GetCurrentMethod().Name);
+					}
+				}
+			}
+
+			InvalidCastException exInvalidCast = null;
+
+			var enumType = TypeHelper.UnwrapNullableType(type);
+			try
+			{
+				value = ConvertChangeType(value, Enum.GetUnderlyingType(enumType));
+
+				if (Enum.IsDefined(enumType, value))
+				{
+					// Regular (known) enum field w/o explicit mapping defined.
+					//
+					return Enum.ToObject(enumType, value);
+				}
+			}
+			catch (InvalidCastException ex)
+			{
+				exInvalidCast = ex;
+			}
+
+			// Default value.
+			//
+			object defaultValue = GetDefaultValue(type);
+
+			if (defaultValue != null)
+				return defaultValue;
+
+			if (exInvalidCast != null)
+			{
+				// Rethrow an InvalidCastException when no default value specified.
+				//
+				throw exInvalidCast;
+			}
+
+			// At this point we have an undefined enum value.
+			//
+			return Enum.ToObject(enumType, value);
+		}
+
+		[SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]
+		public virtual object MapValueToEnum(object value, MemberAccessor ma)
+		{
+			if (value == null || value is DBNull)
+				return GetNullValue(ma.Type);
+
+			MapValue[] mapValues = GetMapValues(ma);
+
+			var mapValueType = GetMapValueType(mapValues);
+			if (mapValueType != null && value.GetType() != mapValueType)
+			{
+				value = ConvertChangeType(value, mapValueType);
+			}
+
+			if (mapValues != null)
+			{
+				var comp = (IComparable)value;
+
+				foreach (MapValue mv in mapValues)
+					foreach (object mapValue in mv.MapValues)
+					{
+						try
+						{
+							if (comp.CompareTo(mapValue) == 0)
+								return mv.OrigValue;
+						}
+						catch (ArgumentException ex)
+						{
+							Debug.WriteLine(ex.Message, MethodBase.GetCurrentMethod().Name);
+						}
+					}
+			}
+
+			InvalidCastException exInvalidCast = null;
+
+			var enumType = TypeHelper.UnwrapNullableType(ma.Type);
+			try
+			{
+				value = ConvertChangeType(value, Enum.GetUnderlyingType(enumType));
+
+				if (Enum.IsDefined(enumType, value))
+				{
+					// Regular (known) enum field w/o explicit mapping defined.
+					//
+					return Enum.ToObject(enumType, value);
+				}
+			}
+			catch (InvalidCastException ex)
+			{
+				exInvalidCast = ex;
+			}
+
+			// Default value.
+			//
+			object defaultValue = GetDefaultValue(ma.Type);
+
+			if (defaultValue != null)
+				return defaultValue;
+
+			if (exInvalidCast != null)
+			{
+				// Rethrow an InvalidCastException when no default value specified.
+				//
+				throw exInvalidCast;
+			}
+
+			// At this point we have an undefined enum value.
+			//
+			return Enum.ToObject(enumType, value);
+		}
+
+		[SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]
+		public virtual object MapEnumToValue(object value, [JetBrains.Annotations.NotNull] Type type, bool convertToUnderlyingType)
+		{
+			if (value == null)
+				return null;
+
+			if (type == null) throw new ArgumentNullException("type");
+
+			type = value.GetType();
+
+			object nullValue = GetNullValue(type);
+
+			if (nullValue != null)
+			{
+				IComparable comp = (IComparable)value;
+
+				try
+				{
+					if (comp.CompareTo(nullValue) == 0)
+						return null;
+				}
+				catch
+				{
+				}
+			}
+
+			MapValue[] mapValues = GetMapValues(type);
+
+			if (mapValues != null)
+			{
+				IComparable comp = (IComparable)value;
+
+				foreach (MapValue mv in mapValues)
+				{
+					try
+					{
+						if (comp.CompareTo(mv.OrigValue) == 0)
+							return mv.MapValues[0];
+					}
+					catch
+					{
+					}
+				}
+			}
+
+			return convertToUnderlyingType ?
+				System.Convert.ChangeType(value, Enum.GetUnderlyingType(type), Thread.CurrentThread.CurrentCulture) :
+				value;
+		}
+
+		[SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]
+		public virtual object MapEnumToValue(object value, [JetBrains.Annotations.NotNull] MemberAccessor memberAccessor, bool convertToUnderlyingType)
+		{
+			if (value == null)
+				return null;
+
+			if (memberAccessor == null) throw new ArgumentNullException("memberAccessor");
+
+			if (value is IEnumerable)
+			{
+#if SILVERLIGHT
+				var result = new List<object>();
+
+				foreach (var item in (IEnumerable)value)
+				{
+					result.Add(MapEnumToValue(item, memberAccessor, convertToUnderlyingType));
+				}
+
+				var type = typeof(object);
+
+				foreach (var var in result)
+				{
+					if (var != null)
+					{
+						type = var.GetType();
+						break;
+					}
+				}
+
+				var arr = Array.CreateInstance(type, result.Count);
+
+				Array.Copy(result.ToArray(), arr, arr.Length);
+
+				return arr;
+#else
+				var result = new ArrayList();
+
+				foreach (var item in (IEnumerable)value)
+				{
+					result.Add(MapEnumToValue(item, memberAccessor, convertToUnderlyingType));
+				}
+
+				var type = typeof(object);
+
+				foreach (var var in result)
+				{
+					if (var != null)
+					{
+						type = var.GetType();
+						break;
+					}
+				}
+
+				return result.ToArray(type);
+#endif
+			}
+
+			object nullValue = GetNullValue(memberAccessor.Type);
+
+			if (nullValue != null)
+			{
+				IComparable comp = (IComparable)value;
+
+				try
+				{
+					if (comp.CompareTo(nullValue) == 0)
+						return null;
+				}
+				catch
+				{
+				}
+			}
+
+			MapValue[] mapValues = GetMapValues(memberAccessor);
+
+			if (mapValues != null)
+			{
+				IComparable comp = (IComparable)value;
+
+				foreach (MapValue mv in mapValues)
+				{
+					try
+					{
+						if (comp.CompareTo(mv.OrigValue) == 0)
+							return mv.MapValues[0];
+					}
+					catch
+					{
+					}
+				}
+			}
+
+			var memberAccessorType = TypeHelper.UnwrapNullableType(memberAccessor.Type);
+
+			return convertToUnderlyingType ?
+				System.Convert.ChangeType(value, Enum.GetUnderlyingType(memberAccessorType), Thread.CurrentThread.CurrentCulture) :
+				value;
+		}
+
+		[SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]
+		public virtual object MapEnumToValue(object value, bool convertToUnderlyingType)
+		{
+			if (value == null)
+				return null;
+
+			return MapEnumToValue(value, value.GetType(), convertToUnderlyingType);
+		}
+
+		public object MapEnumToValue(object value)
+		{
+			return MapEnumToValue(value, false);
+		}
+
+		public virtual object MapEnumToValue(object value, Type type)
+		{
+			return MapEnumToValue(value, type, false);
+		}
+
+		public T MapValueToEnum<T>(object value)
+		{
+			return (T)MapValueToEnum(value, typeof(T));
+		}
+
+		#endregion
+
+		#region Object
+
+		#region MapObjectToObject
+
+		public object MapObjectToObject(
+			object          sourceObject,
+			object          destObject,
+			params object[] parameters)
+		{
+			if (sourceObject == null) throw new ArgumentNullException("sourceObject");
+			if (destObject   == null) throw new ArgumentNullException("destObject");
+
+			MapInternal(
+				null,
+				GetObjectMapper(sourceObject.GetType()), sourceObject,
+				GetObjectMapper(destObject.  GetType()), destObject,
+				parameters);
+
+			return destObject;
+		}
+
+		public object MapObjectToObject(
+			object          sourceObject,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			if (sourceObject == null) throw new ArgumentNullException("sourceObject");
+
+			InitContext ctx = new InitContext();
+
+			ctx.MappingSchema = this;
+			ctx.DataSource    = GetObjectMapper(sourceObject.GetType());
+			ctx.SourceObject  = sourceObject;
+			ctx.ObjectMapper  = GetObjectMapper(destObjectType);
+			ctx.Parameters    = parameters;
+
+			return MapInternal(ctx);
+		}
+
+		public T MapObjectToObject<T>(
+			object          sourceObject,
+			params object[] parameters)
+		{
+			return (T)MapObjectToObject(sourceObject, typeof(T), parameters);
+		}
+
+		#endregion
+
+		#region MapObjectToDataRow
+
+#if !SILVERLIGHT
+
+		public DataRow MapObjectToDataRow(
+			object  sourceObject,
+			DataRow destRow)
+		{
+			if (sourceObject == null) throw new ArgumentNullException("sourceObject");
+
+			MapInternal(
+				null,
+				GetObjectMapper    (sourceObject.GetType()), sourceObject,
+				CreateDataRowMapper(destRow, DataRowVersion.Default), destRow,
+				null);
+
+			return destRow;
+		}
+
+		public DataRow MapObjectToDataRow(
+			object    sourceObject,
+			DataTable destTable)
+		{
+			if (destTable    == null) throw new ArgumentNullException("destTable");
+			if (sourceObject == null) throw new ArgumentNullException("sourceObject");
+
+			DataRow destRow = destTable.NewRow();
+
+			destTable.Rows.Add(destRow);
+
+			MapInternal(
+				null,
+				GetObjectMapper    (sourceObject.GetType()), sourceObject,
+				CreateDataRowMapper(destRow, DataRowVersion.Default), destRow,
+				null);
+
+			return destRow;
+		}
+
+#endif
+
+		#endregion
+
+		#region MapObjectToDictionary
+
+		public IDictionary MapObjectToDictionary(
+			object      sourceObject,
+			IDictionary destDictionary)
+		{
+			if (sourceObject == null) throw new ArgumentNullException("sourceObject");
+
+			MapInternal(
+				null,
+				GetObjectMapper       (sourceObject.GetType()), sourceObject,
+				CreateDictionaryMapper(destDictionary),         destDictionary,
+				null);
+
+			return destDictionary;
+		}
+
+		public IDictionary MapObjectToDictionary(object sourceObject)
+		{
+			if (sourceObject == null) throw new ArgumentNullException("sourceObject");
+
+			ObjectMapper om = GetObjectMapper(sourceObject.GetType());
+
+			var destDictionary = new Dictionary<object,object>(om.Count);
+
+			MapInternal(
+				null,
+				om, sourceObject,
+				CreateDictionaryMapper(destDictionary), destDictionary,
+				null);
+
+			return destDictionary;
+		}
+
+		#endregion
+
+		#endregion
+
+		#region DataRow
+
+#if !SILVERLIGHT
+
+		#region MapDataRowToObject
+
+		public object MapDataRowToObject(
+			DataRow         dataRow,
+			object          destObject,
+			params object[] parameters)
+		{
+			if (destObject == null) throw new ArgumentNullException("destObject");
+
+			MapInternal(
+				null,
+				CreateDataRowMapper(dataRow, DataRowVersion.Default), dataRow,
+				GetObjectMapper(destObject.  GetType()), destObject,
+				parameters);
+
+			return destObject;
+		}
+
+		public object MapDataRowToObject(
+			DataRow         dataRow,
+			DataRowVersion  version,
+			object          destObject,
+			params object[] parameters)
+		{
+			if (destObject == null) throw new ArgumentNullException("destObject");
+
+			MapInternal(
+				null,
+				CreateDataRowMapper(dataRow, version), dataRow,
+				GetObjectMapper(destObject.  GetType()), destObject,
+				parameters);
+
+			return destObject;
+		}
+
+		public object MapDataRowToObject(
+			DataRow         dataRow,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			InitContext ctx = new InitContext();
+
+			ctx.MappingSchema = this;
+			ctx.DataSource    = CreateDataRowMapper(dataRow, DataRowVersion.Default);
+			ctx.SourceObject  = dataRow;
+			ctx.ObjectMapper  = GetObjectMapper(destObjectType);
+			ctx.Parameters    = parameters;
+
+			return MapInternal(ctx);
+		}
+
+		public object MapDataRowToObject(
+			DataRow         dataRow,
+			DataRowVersion  version,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			InitContext ctx = new InitContext();
+
+			ctx.MappingSchema = this;
+			ctx.DataSource    = CreateDataRowMapper(dataRow, version);
+			ctx.SourceObject  = dataRow;
+			ctx.ObjectMapper  = GetObjectMapper(destObjectType);
+			ctx.Parameters    = parameters;
+
+			return MapInternal(ctx);
+		}
+
+		public T MapDataRowToObject<T>(
+			DataRow         dataRow,
+			params object[] parameters)
+		{
+			return (T)MapDataRowToObject(dataRow, typeof(T), parameters);
+		}
+
+		public T MapDataRowToObject<T>(
+			DataRow         dataRow,
+			DataRowVersion  version,
+			params object[] parameters)
+		{
+			return (T)MapDataRowToObject(dataRow, version, typeof(T), parameters);
+		}
+
+		#endregion
+
+		#region MapDataRowToDataRow
+
+		public DataRow MapDataRowToDataRow(
+			DataRow sourceRow,
+			DataRow destRow)
+		{
+			MapInternal(
+				null,
+				CreateDataRowMapper(sourceRow, DataRowVersion.Default), sourceRow,
+				CreateDataRowMapper(destRow,   DataRowVersion.Default), destRow,
+				null);
+
+			return destRow;
+		}
+
+		public DataRow MapDataRowToDataRow(
+			DataRow        sourceRow,
+			DataRowVersion version,
+			DataRow        destRow)
+		{
+			MapInternal(
+				null,
+				CreateDataRowMapper(sourceRow, version), sourceRow,
+				CreateDataRowMapper(destRow, DataRowVersion.Default), destRow,
+				null);
+
+			return destRow;
+		}
+
+		public DataRow MapDataRowToDataRow(
+			DataRow   sourceRow,
+			DataTable destTable)
+		{
+			if (destTable == null) throw new ArgumentNullException("destTable");
+
+			DataRow destRow = destTable.NewRow();
+
+			destTable.Rows.Add(destRow);
+
+			MapInternal(
+				null,
+				CreateDataRowMapper(sourceRow, DataRowVersion.Default), sourceRow,
+				CreateDataRowMapper(destRow,   DataRowVersion.Default), destRow,
+				null);
+
+			return destRow;
+		}
+
+		public DataRow MapDataRowToDataRow(
+			DataRow        sourceRow,
+			DataRowVersion version,
+			DataTable      destTable)
+		{
+			if (destTable == null) throw new ArgumentNullException("destTable");
+
+			DataRow destRow = destTable.NewRow();
+
+			destTable.Rows.Add(destRow);
+
+			MapInternal(
+				null,
+				CreateDataRowMapper(sourceRow, version), sourceRow,
+				CreateDataRowMapper(destRow, DataRowVersion.Default), destRow,
+				null);
+
+			return destRow;
+		}
+
+		#endregion
+
+		#region MapDataRowToDictionary
+
+		public IDictionary MapDataRowToDictionary(
+			DataRow sourceRow,
+			IDictionary destDictionary)
+		{
+			MapInternal(
+				null,
+				CreateDataRowMapper   (sourceRow, DataRowVersion.Default), sourceRow,
+				CreateDictionaryMapper(destDictionary),                    destDictionary,
+				null);
+
+			return destDictionary;
+		}
+
+		public Hashtable MapDataRowToDictionary(DataRow sourceRow)
+		{
+			if (sourceRow == null) throw new ArgumentNullException("sourceRow");
+
+			Hashtable destDictionary = new Hashtable(sourceRow.Table.Columns.Count);
+
+			MapInternal(
+				null,
+				CreateDataRowMapper   (sourceRow, DataRowVersion.Default), sourceRow,
+				CreateDictionaryMapper(destDictionary),                    destDictionary,
+				null);
+
+			return destDictionary;
+		}
+
+		public IDictionary MapDataRowToDictionary(
+			DataRow        sourceRow,
+			DataRowVersion version,
+			IDictionary    destDictionary)
+		{
+			MapInternal(
+				null,
+				CreateDataRowMapper   (sourceRow, version), sourceRow,
+				CreateDictionaryMapper(destDictionary),     destDictionary,
+				null);
+
+			return destDictionary;
+		}
+
+		public Hashtable MapDataRowToDictionary(
+			DataRow        sourceRow,
+			DataRowVersion version)
+		{
+			if (sourceRow == null) throw new ArgumentNullException("sourceRow");
+
+			Hashtable destDictionary = new Hashtable(sourceRow.Table.Columns.Count);
+
+			MapInternal(
+				null,
+				CreateDataRowMapper   (sourceRow, version), sourceRow,
+				CreateDictionaryMapper(destDictionary),     destDictionary,
+				null);
+
+			return destDictionary;
+		}
+
+		#endregion
+
+#endif
+
+		#endregion
+
+		#region DataReader
+
+		#region MapDataReaderToObject
+
+		public object MapDataReaderToObject(
+			IDataReader     dataReader,
+			object          destObject,
+			params object[] parameters)
+		{
+			if (destObject == null) throw new ArgumentNullException("destObject");
+
+			MapInternal(
+				null,
+				CreateDataReaderMapper(dataReader), dataReader,
+				GetObjectMapper(destObject. GetType()), destObject,
+				parameters);
+
+			return destObject;
+		}
+
+		//NOTE changed to virtual
+		public virtual object MapDataReaderToObject(
+			IDataReader     dataReader,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			InitContext ctx = new InitContext();
+
+			ctx.MappingSchema = this;
+			ctx.DataSource    = CreateDataReaderMapper(dataReader);
+			ctx.SourceObject  = dataReader;
+			ctx.ObjectMapper  = GetObjectMapper(destObjectType);
+			ctx.Parameters    = parameters;
+
+			return MapInternal(ctx);
+		}
+
+		public T MapDataReaderToObject<T>(
+			IDataReader     dataReader,
+			params object[] parameters)
+		{
+			return (T)MapDataReaderToObject(dataReader, typeof(T), parameters);
+		}
+
+		#endregion
+
+		#region MapDataReaderToDataRow
+
+#if !SILVERLIGHT
+
+		public DataRow MapDataReaderToDataRow(IDataReader dataReader, DataRow destRow)
+		{
+			MapInternal(
+				null,
+				CreateDataReaderMapper(dataReader), dataReader,
+				CreateDataRowMapper(destRow, DataRowVersion.Default), destRow,
+				null);
+
+			return destRow;
+		}
+
+		public DataRow MapDataReaderToDataRow(
+			IDataReader dataReader,
+			DataTable   destTable)
+		{
+			if (destTable == null) throw new ArgumentNullException("destTable");
+
+			DataRow destRow = destTable.NewRow();
+
+			destTable.Rows.Add(destRow);
+
+			MapInternal(
+				null,
+				CreateDataReaderMapper(dataReader), dataReader,
+				CreateDataRowMapper(destRow, DataRowVersion.Default), destRow,
+				null);
+
+			return destRow;
+		}
+
+#endif
+
+		#endregion
+
+		#region MapDataReaderToDictionary
+
+		public IDictionary MapDataReaderToDictionary(
+			IDataReader dataReader,
+			IDictionary destDictionary)
+		{
+			MapInternal(
+				null,
+				CreateDataReaderMapper(dataReader),     dataReader,
+				CreateDictionaryMapper(destDictionary), destDictionary,
+				null);
+
+			return destDictionary;
+		}
+
+		public IDictionary MapDataReaderToDictionary(IDataReader dataReader)
+		{
+			if (dataReader == null) throw new ArgumentNullException("dataReader");
+
+			var destDictionary = new Dictionary<object,object>(dataReader.FieldCount);
+
+			MapInternal(
+				null,
+				CreateDataReaderMapper(dataReader),     dataReader,
+				CreateDictionaryMapper(destDictionary), destDictionary,
+				null);
+
+			return destDictionary;
+		}
+
+		#endregion
+
+		#endregion
+
+		#region Dictionary
+
+		#region MapDictionaryToObject
+
+		public object MapDictionaryToObject(
+			IDictionary     sourceDictionary,
+			object          destObject,
+			params object[] parameters)
+		{
+			if (destObject == null) throw new ArgumentNullException("destObject");
+
+			MapInternal(
+				null,
+				CreateDictionaryMapper(sourceDictionary),       sourceDictionary,
+				GetObjectMapper       (destObject.  GetType()), destObject,
+				parameters);
+
+			return destObject;
+		}
+
+		public object MapDictionaryToObject(
+			IDictionary     sourceDictionary,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			InitContext ctx = new InitContext();
+
+			ctx.MappingSchema = this;
+			ctx.DataSource    = CreateDictionaryMapper(sourceDictionary);
+			ctx.SourceObject  = sourceDictionary;
+			ctx.ObjectMapper  = GetObjectMapper(destObjectType);
+			ctx.Parameters    = parameters;
+
+			return MapInternal(ctx);
+		}
+
+		public T MapDictionaryToObject<T>(IDictionary sourceDictionary, params object[] parameters)
+		{
+			return (T)MapDictionaryToObject(sourceDictionary, typeof(T), parameters);
+		}
+
+		#endregion
+
+		#region MapDictionaryToDataRow
+
+#if !SILVERLIGHT
+
+		public DataRow MapDictionaryToDataRow(
+			IDictionary sourceDictionary,
+			DataRow     destRow)
+		{
+			MapInternal(
+				null,
+				CreateDictionaryMapper(sourceDictionary),                sourceDictionary,
+				CreateDataRowMapper   (destRow, DataRowVersion.Default), destRow,
+				null);
+
+			return destRow;
+		}
+
+		public DataRow MapDictionaryToDataRow(
+			IDictionary sourceDictionary,
+			DataTable   destTable)
+		{
+			if (destTable == null) throw new ArgumentNullException("destTable");
+
+			DataRow destRow = destTable.NewRow();
+
+			destTable.Rows.Add(destRow);
+
+			MapInternal(
+				null,
+				CreateDictionaryMapper(sourceDictionary),                sourceDictionary,
+				CreateDataRowMapper   (destRow, DataRowVersion.Default), destRow,
+				null);
+
+			return destRow;
+		}
+
+#endif
+
+		#endregion
+
+		#endregion
+
+		#region List
+
+		#region MapListToList
+
+		public IList MapListToList(
+			ICollection     sourceList,
+			IList           destList,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			if (sourceList == null) throw new ArgumentNullException("sourceList");
+
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper(sourceList.GetEnumerator()),
+				CreateObjectListMapper(destList, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return destList;
+		}
+
+		public IList MapListToList(
+			ICollection     sourceList,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			if (sourceList == null) throw new ArgumentNullException("sourceList");
+
+			var destList = new List<object>();
+
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper(sourceList.GetEnumerator()),
+				CreateObjectListMapper(destList, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return destList;
+		}
+
+		public List<T> MapListToList<T>(
+			ICollection     sourceList,
+			List<T>         destList,
+			params object[] parameters)
+		{
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper(sourceList.GetEnumerator()),
+				CreateObjectListMapper(destList, GetObjectMapper(typeof(T))),
+				parameters);
+
+			return destList;
+		}
+
+		public List<T> MapListToList<T>(
+			ICollection     sourceList,
+			params object[] parameters)
+		{
+			List<T> destList = new List<T>();
+
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper(sourceList.GetEnumerator()),
+				CreateObjectListMapper(destList, GetObjectMapper(typeof(T))),
+				parameters);
+
+			return destList;
+		}
+
+		#endregion
+
+		#region MapListToDataTable
+
+#if !SILVERLIGHT
+
+		public DataTable MapListToDataTable(
+			ICollection sourceList,
+			DataTable   destTable)
+		{
+			if (sourceList == null) throw new ArgumentNullException("sourceList");
+
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper(sourceList.GetEnumerator()),
+				CreateDataTableMapper (destTable, DataRowVersion.Default),
+				null);
+
+			return destTable;
+		}
+
+		[SuppressMessage("Microsoft.Globalization", "CA1306:SetLocaleForDataTypes")]
+		public DataTable MapListToDataTable(ICollection sourceList)
+		{
+			if (sourceList == null) throw new ArgumentNullException("sourceList");
+
+			DataTable destTable = new DataTable();
+
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper(sourceList.GetEnumerator()),
+				CreateDataTableMapper (destTable, DataRowVersion.Default),
+				null);
+
+			return destTable;
+		}
+
+#endif
+
+		#endregion
+
+		#region MapListToDictionary
+
+		public IDictionary MapListToDictionary(
+			ICollection          sourceList,
+			IDictionary          destDictionary,
+			NameOrIndexParameter keyFieldNameOrIndex,
+			Type                 destObjectType,
+			params object[]      parameters)
+		{
+			if (sourceList == null) throw new ArgumentNullException("sourceList");
+
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper    (sourceList.GetEnumerator()),
+				CreateDictionaryListMapper(destDictionary, keyFieldNameOrIndex, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return destDictionary;
+		}
+
+		public IDictionary MapListToDictionary(
+			ICollection          sourceList,
+			NameOrIndexParameter keyFieldNameOrIndex,
+			Type                 destObjectType,
+			params object[]      parameters)
+		{
+			if (sourceList == null) throw new ArgumentNullException("sourceList");
+
+			IDictionary destDictionary = new Dictionary<object,object>();
+
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper    (sourceList.GetEnumerator()),
+				CreateDictionaryListMapper(destDictionary, keyFieldNameOrIndex, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return destDictionary;
+		}
+
+		public IDictionary<TK,T> MapListToDictionary<TK,T>(
+			ICollection          sourceList,
+			IDictionary<TK,T>     destDictionary,
+			NameOrIndexParameter keyFieldNameOrIndex,
+			params object[]      parameters)
+		{
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper         (sourceList.GetEnumerator()),
+				CreateDictionaryListMapper<TK,T>(destDictionary, keyFieldNameOrIndex, GetObjectMapper(typeof(T))),
+				parameters);
+
+			return destDictionary;
+		}
+
+		public Dictionary<TK,T> MapListToDictionary<TK,T>(
+			ICollection          sourceList,
+			NameOrIndexParameter keyFieldNameOrIndex,
+			params object[]      parameters)
+		{
+			Dictionary<TK,T> destDictionary = new Dictionary<TK,T>();
+
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper          (sourceList.GetEnumerator()),
+				CreateDictionaryListMapper<TK,T>(destDictionary, keyFieldNameOrIndex, GetObjectMapper(typeof(T))),
+				parameters);
+
+			return destDictionary;
+		}
+
+		#endregion
+
+		#region MapListToDictionaryIndex
+
+		public IDictionary MapListToDictionary(
+			ICollection     sourceList,
+			IDictionary     destDictionary,
+			MapIndex        index,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			if (sourceList == null) throw new ArgumentNullException("sourceList");
+
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper    (sourceList.GetEnumerator()),
+				CreateDictionaryListMapper(destDictionary, index, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return destDictionary;
+		}
+
+		public IDictionary MapListToDictionary(
+			ICollection     sourceList,
+			MapIndex        index,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			if (sourceList == null) throw new ArgumentNullException("sourceList");
+
+			IDictionary destDictionary = new Dictionary<object,object>();
+
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper    (sourceList.GetEnumerator()),
+				CreateDictionaryListMapper(destDictionary, index, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return destDictionary;
+		}
+
+		public IDictionary<CompoundValue,T> MapListToDictionary<T>(
+			ICollection                  sourceList,
+			IDictionary<CompoundValue,T> destDictionary,
+			MapIndex                     index,
+			params object[]              parameters)
+		{
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper       (sourceList.GetEnumerator()),
+				CreateDictionaryListMapper<T>(destDictionary, index, GetObjectMapper(typeof(T))),
+				parameters);
+
+			return destDictionary;
+		}
+
+		public Dictionary<CompoundValue,T> MapListToDictionary<T>(
+			ICollection     sourceList,
+			MapIndex        index,
+			params object[] parameters)
+		{
+			Dictionary<CompoundValue, T> destDictionary = new Dictionary<CompoundValue,T>();
+
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper       (sourceList.GetEnumerator()),
+				CreateDictionaryListMapper<T>(destDictionary, index, GetObjectMapper(typeof(T))),
+				parameters);
+
+			return destDictionary;
+		}
+
+		#endregion
+
+		#endregion
+
+		#region Table
+
+#if !SILVERLIGHT
+
+
+		#region MapDataTableToDataTable
+
+		public DataTable MapDataTableToDataTable(
+			DataTable sourceTable,
+			DataTable destTable)
+		{
+			MapSourceListToDestinationList(
+				CreateDataTableMapper(sourceTable, DataRowVersion.Default),
+				CreateDataTableMapper(destTable,   DataRowVersion.Default),
+				null);
+
+			return destTable;
+		}
+
+		public DataTable MapDataTableToDataTable(
+			DataTable      sourceTable,
+			DataRowVersion version,
+			DataTable      destTable)
+		{
+			MapSourceListToDestinationList(
+				CreateDataTableMapper(sourceTable, version),
+				CreateDataTableMapper(destTable,   DataRowVersion.Default),
+				null);
+
+			return destTable;
+		}
+
+		public DataTable MapDataTableToDataTable(DataTable sourceTable)
+		{
+			if (sourceTable == null) throw new ArgumentNullException("sourceTable");
+
+			DataTable destTable = sourceTable.Clone();
+
+			MapSourceListToDestinationList(
+				CreateDataTableMapper(sourceTable, DataRowVersion.Default),
+				CreateDataTableMapper(destTable,   DataRowVersion.Default),
+				null);
+
+			return destTable;
+		}
+
+		public DataTable MapDataTableToDataTable(
+			DataTable      sourceTable,
+			DataRowVersion version)
+		{
+			if (sourceTable == null) throw new ArgumentNullException("sourceTable");
+
+			DataTable destTable = sourceTable.Clone();
+
+			MapSourceListToDestinationList(
+				CreateDataTableMapper(sourceTable, version),
+				CreateDataTableMapper(destTable,   DataRowVersion.Default),
+				null);
+
+			return destTable;
+		}
+
+		#endregion
+
+		#region MapDataTableToList
+
+		public IList MapDataTableToList(
+			DataTable       sourceTable,
+			IList           list,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			MapSourceListToDestinationList(
+				CreateDataTableMapper (sourceTable, DataRowVersion.Default),
+				CreateObjectListMapper(list, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return list;
+		}
+
+		public IList MapDataTableToList(
+			DataTable       sourceTable,
+			DataRowVersion  version,
+			IList           list,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			MapSourceListToDestinationList(
+				CreateDataTableMapper (sourceTable, version),
+				CreateObjectListMapper(list, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return list;
+		}
+
+		public ArrayList MapDataTableToList(
+			DataTable       sourceTable,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			ArrayList list = new ArrayList();
+
+			MapSourceListToDestinationList(
+				CreateDataTableMapper (sourceTable, DataRowVersion.Default),
+				CreateObjectListMapper(list, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return list;
+		}
+
+		public ArrayList MapDataTableToList(
+			DataTable       sourceTable,
+			DataRowVersion  version,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			ArrayList list = new ArrayList();
+
+			MapSourceListToDestinationList(
+				CreateDataTableMapper (sourceTable, version),
+				CreateObjectListMapper(list, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return list;
+		}
+
+		public List<T> MapDataTableToList<T>(
+			DataTable       sourceTable,
+			List<T>         list,
+			params object[] parameters)
+		{
+			MapSourceListToDestinationList(
+				CreateDataTableMapper (sourceTable, DataRowVersion.Default),
+				CreateObjectListMapper(list, GetObjectMapper(typeof(T))),
+				parameters);
+
+			return list;
+		}
+
+		public List<T> MapDataTableToList<T>(
+			DataTable       sourceTable,
+			DataRowVersion  version,
+			List<T>         list,
+			params object[] parameters)
+		{
+			MapSourceListToDestinationList(
+				CreateDataTableMapper (sourceTable, version),
+				CreateObjectListMapper(list, GetObjectMapper(typeof(T))),
+				parameters);
+
+			return list;
+		}
+
+		public List<T> MapDataTableToList<T>(
+			DataTable       sourceTable,
+			params object[] parameters)
+		{
+			List<T> list = new List<T>();
+
+			MapSourceListToDestinationList(
+				CreateDataTableMapper (sourceTable, DataRowVersion.Default),
+				CreateObjectListMapper(list, GetObjectMapper(typeof(T))),
+				parameters);
+
+			return list;
+		}
+
+		public List<T> MapDataTableToList<T>(
+			DataTable       sourceTable,
+			DataRowVersion  version,
+			params object[] parameters)
+		{
+			List<T> list = new List<T>();
+
+			MapSourceListToDestinationList(
+				CreateDataTableMapper (sourceTable, version),
+				CreateObjectListMapper(list, GetObjectMapper(typeof(T))),
+				parameters);
+
+			return list;
+		}
+
+		#endregion
+
+		#region MapDataTableToDictionary
+
+		public IDictionary MapDataTableToDictionary(
+			DataTable            sourceTable,
+			IDictionary          destDictionary,
+			NameOrIndexParameter keyFieldNameOrIndex,
+			Type                 destObjectType,
+			params object[]      parameters)
+		{
+			MapSourceListToDestinationList(
+				CreateDataTableMapper     (sourceTable,    DataRowVersion.Default),
+				CreateDictionaryListMapper(destDictionary, keyFieldNameOrIndex, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return destDictionary;
+		}
+
+		public Hashtable MapDataTableToDictionary(
+			DataTable            sourceTable,
+			NameOrIndexParameter keyFieldNameOrIndex,
+			Type                 destObjectType,
+			params object[]      parameters)
+		{
+			Hashtable destDictionary = new Hashtable();
+
+			MapSourceListToDestinationList(
+				CreateDataTableMapper     (sourceTable,    DataRowVersion.Default),
+				CreateDictionaryListMapper(destDictionary, keyFieldNameOrIndex, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return destDictionary;
+		}
+
+		public IDictionary<TK,T> MapDataTableToDictionary<TK,T>(
+			DataTable            sourceTable,
+			IDictionary<TK,T>     destDictionary,
+			NameOrIndexParameter keyFieldNameOrIndex,
+			params object[]      parameters)
+		{
+			MapSourceListToDestinationList(
+				CreateDataTableMapper          (sourceTable,    DataRowVersion.Default),
+				CreateDictionaryListMapper<TK,T>(destDictionary, keyFieldNameOrIndex, GetObjectMapper(typeof(T))),
+				parameters);
+
+			return destDictionary;
+		}
+
+		public Dictionary<TK,T> MapDataTableToDictionary<TK,T>(
+			DataTable            sourceTable,
+			NameOrIndexParameter keyFieldNameOrIndex,
+			params object[]      parameters)
+		{
+			Dictionary<TK,T> destDictionary = new Dictionary<TK,T>();
+
+			MapSourceListToDestinationList(
+				CreateDataTableMapper          (sourceTable,    DataRowVersion.Default),
+				CreateDictionaryListMapper<TK,T>(destDictionary, keyFieldNameOrIndex, GetObjectMapper(typeof(T))),
+				parameters);
+
+			return destDictionary;
+		}
+
+		#endregion
+
+		#region MapDataTableToDictionary (Index)
+
+		public IDictionary MapDataTableToDictionary(
+			DataTable       sourceTable,
+			IDictionary     destDictionary,
+			MapIndex        index,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			MapSourceListToDestinationList(
+				CreateDataTableMapper     (sourceTable,    DataRowVersion.Default),
+				CreateDictionaryListMapper(destDictionary, index, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return destDictionary;
+		}
+
+		public Hashtable MapDataTableToDictionary(
+			DataTable       sourceTable,
+			MapIndex        index,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			Hashtable destDictionary = new Hashtable();
+
+			MapSourceListToDestinationList(
+				CreateDataTableMapper     (sourceTable,    DataRowVersion.Default),
+				CreateDictionaryListMapper(destDictionary, index, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return destDictionary;
+		}
+
+		public IDictionary<CompoundValue,T> MapDataTableToDictionary<T>(
+			DataTable                    sourceTable,
+			IDictionary<CompoundValue,T> destDictionary,
+			MapIndex                     index,
+			params object[]              parameters)
+		{
+			MapSourceListToDestinationList(
+				CreateDataTableMapper        (sourceTable,    DataRowVersion.Default),
+				CreateDictionaryListMapper<T>(destDictionary, index, GetObjectMapper(typeof(T))),
+				parameters);
+
+			return destDictionary;
+		}
+
+		public Dictionary<CompoundValue,T> MapDataTableToDictionary<T>(
+			DataTable       sourceTable,
+			MapIndex        index,
+			params object[] parameters)
+		{
+			Dictionary<CompoundValue,T> destDictionary = new Dictionary<CompoundValue,T>();
+
+			MapSourceListToDestinationList(
+				CreateDataTableMapper        (sourceTable,    DataRowVersion.Default),
+				CreateDictionaryListMapper<T>(destDictionary, index, GetObjectMapper(typeof(T))),
+				parameters);
+
+			return destDictionary;
+		}
+
+		#endregion
+
+#endif
+
+		#endregion
+
+		#region DataReader
+
+		#region MapDataReaderToList
+
+		public virtual IList MapDataReaderToList(
+			IDataReader     reader,
+			IList           list,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			MapSourceListToDestinationList(
+				CreateDataReaderListMapper(reader),
+				CreateObjectListMapper    (list, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return list;
+		}
+
+		public IList MapDataReaderToList(
+			IDataReader     reader,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			IList list = new List<object>();
+
+			MapSourceListToDestinationList(
+				CreateDataReaderListMapper(reader),
+				CreateObjectListMapper    (list, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return list;
+		}
+
+		//NOTE changed to virtual
+		public virtual IList<T> MapDataReaderToList<T>(
+			IDataReader     reader,
+			IList<T>        list,
+			params object[] parameters)
+		{
+			MapSourceListToDestinationList(
+				CreateDataReaderListMapper(reader),
+				CreateObjectListMapper    ((IList)list, GetObjectMapper(typeof(T))),
+				parameters);
+
+			return list;
+		}
+
+		public List<T> MapDataReaderToList<T>(
+			IDataReader     reader,
+			params object[] parameters)
+		{
+			List<T> list = new List<T>();
+
+			MapSourceListToDestinationList(
+				CreateDataReaderListMapper(reader),
+				CreateObjectListMapper    (list, GetObjectMapper(typeof(T))),
+				parameters);
+
+			return list;
+		}
+
+		#endregion
+
+		#region MapDataReaderToScalarList
+
+		public IList MapDataReaderToScalarList(
+			IDataReader          reader,
+			NameOrIndexParameter nameOrIndex,
+			IList                list,
+			Type                 type)
+		{
+			MapSourceListToDestinationList(
+				CreateDataReaderListMapper(reader, nameOrIndex),
+				CreateScalarDestinationListMapper(list,   type),
+				null);
+
+			return list;
+		}
+
+		public IList MapDataReaderToScalarList(
+			IDataReader          reader,
+			NameOrIndexParameter nameOrIndex,
+			Type                 type)
+		{
+			IList list = new List<object>();
+
+			MapSourceListToDestinationList(
+				CreateDataReaderListMapper(reader, nameOrIndex),
+				CreateScalarDestinationListMapper(list,   type),
+				null);
+
+			return list;
+		}
+
+		public IList<T> MapDataReaderToScalarList<T>(
+			IDataReader          reader,
+			NameOrIndexParameter nameOrIndex,
+			IList<T>             list)
+		{
+			MapSourceListToDestinationList(
+				CreateDataReaderListMapper(reader, nameOrIndex),
+				CreateScalarDestinationListMapper(list),
+				null);
+
+			return list;
+		}
+
+		public List<T> MapDataReaderToScalarList<T>(
+			IDataReader          reader,
+			NameOrIndexParameter nameOrIndex)
+		{
+			List<T> list = new List<T>();
+
+			MapSourceListToDestinationList(
+				CreateDataReaderListMapper(reader, nameOrIndex),
+				CreateScalarDestinationListMapper(list),
+				null);
+
+			return list;
+		}
+
+		#endregion
+
+		#region MapDataReaderToDataTable
+
+#if !SILVERLIGHT
+
+		public DataTable MapDataReaderToDataTable(
+			IDataReader reader,
+			DataTable   destTable)
+		{
+			MapSourceListToDestinationList(
+				CreateDataReaderListMapper(reader),
+				CreateDataTableMapper     (destTable, DataRowVersion.Default),
+				null);
+
+			return destTable;
+		}
+
+		[SuppressMessage("Microsoft.Globalization", "CA1306:SetLocaleForDataTypes")]
+		public DataTable MapDataReaderToDataTable(IDataReader reader)
+		{
+			DataTable destTable = new DataTable();
+
+			MapSourceListToDestinationList(
+				CreateDataReaderListMapper(reader),
+				CreateDataTableMapper     (destTable, DataRowVersion.Default),
+				null);
+
+			return destTable;
+		}
+
+#endif
+
+		#endregion
+
+		#region MapDataReaderToDictionary
+
+		public IDictionary MapDataReaderToDictionary(
+			IDataReader          reader,
+			IDictionary          destDictionary,
+			NameOrIndexParameter keyFieldNameOrIndex,
+			Type                 destObjectType,
+			params object[]      parameters)
+		{
+			MapSourceListToDestinationList(
+				CreateDataReaderListMapper(reader),
+				CreateDictionaryListMapper(destDictionary, keyFieldNameOrIndex, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return destDictionary;
+		}
+
+		public IDictionary MapDataReaderToDictionary(
+			IDataReader          reader,
+			NameOrIndexParameter keyFieldNameOrIndex,
+			Type                 destObjectType,
+			params object[]      parameters)
+		{
+			IDictionary dest = new Dictionary<object,object>();
+
+			MapSourceListToDestinationList(
+				CreateDataReaderListMapper(reader),
+				CreateDictionaryListMapper(dest, keyFieldNameOrIndex, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return dest;
+		}
+
+		public IDictionary<TK,T> MapDataReaderToDictionary<TK,T>(
+			IDataReader          reader,
+			IDictionary<TK,T>     destDictionary,
+			NameOrIndexParameter keyFieldNameOrIndex,
+			Type                 destObjectType,
+			params object[]      parameters)
+		{
+			MapSourceListToDestinationList(
+				CreateDataReaderListMapper     (reader),
+				CreateDictionaryListMapper<TK,T>(destDictionary, keyFieldNameOrIndex, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return destDictionary;
+		}
+
+		public IDictionary<TK,T> MapDataReaderToDictionary<TK,T>(
+			IDataReader          reader,
+			IDictionary<TK,T>     destDictionary,
+			NameOrIndexParameter keyFieldNameOrIndex,
+			params object[]      parameters)
+		{
+			MapSourceListToDestinationList(
+				CreateDataReaderListMapper     (reader),
+				CreateDictionaryListMapper<TK,T>(destDictionary, keyFieldNameOrIndex, GetObjectMapper(typeof(T))),
+				parameters);
+
+			return destDictionary;
+		}
+
+		public Dictionary<TK,T> MapDataReaderToDictionary<TK,T>(
+			IDataReader          reader,
+			NameOrIndexParameter keyFieldNameOrIndex,
+			params object[]      parameters)
+		{
+			Dictionary<TK,T> dest = new Dictionary<TK,T>();
+
+			MapSourceListToDestinationList(
+				CreateDataReaderListMapper     (reader),
+				CreateDictionaryListMapper<TK,T>(dest, keyFieldNameOrIndex, GetObjectMapper(typeof(T))),
+				parameters);
+
+			return dest;
+		}
+
+		#endregion
+
+		#region MapDataReaderToDictionary (Index)
+
+		public IDictionary MapDataReaderToDictionary(
+			IDataReader     reader,
+			IDictionary     destDictionary,
+			MapIndex        index,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			MapSourceListToDestinationList(
+				CreateDataReaderListMapper(reader),
+				CreateDictionaryListMapper(destDictionary, index, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return destDictionary;
+		}
+
+		public IDictionary MapDataReaderToDictionary(
+			IDataReader     reader,
+			MapIndex        index,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			IDictionary destDictionary = new Dictionary<object,object>();
+
+			MapSourceListToDestinationList(
+				CreateDataReaderListMapper(reader),
+				CreateDictionaryListMapper(destDictionary, index, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return destDictionary;
+		}
+
+		public IDictionary<CompoundValue,T> MapDataReaderToDictionary<T>(
+			IDataReader                  reader,
+			IDictionary<CompoundValue,T> destDictionary,
+			MapIndex                     index,
+			Type                         destObjectType,
+			params object[]              parameters)
+		{
+			MapSourceListToDestinationList(
+				CreateDataReaderListMapper(reader),
+				CreateDictionaryListMapper(destDictionary, index, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return destDictionary;
+		}
+
+		public IDictionary<CompoundValue,T> MapDataReaderToDictionary<T>(
+			IDataReader                  reader,
+			IDictionary<CompoundValue,T> destDictionary,
+			MapIndex                     index,
+			params object[]              parameters)
+		{
+			MapSourceListToDestinationList(
+				CreateDataReaderListMapper(reader),
+				CreateDictionaryListMapper(destDictionary, index, GetObjectMapper(typeof(T))),
+				parameters);
+
+			return destDictionary;
+		}
+
+		public Dictionary<CompoundValue,T> MapDataReaderToDictionary<T>(
+			IDataReader     reader,
+			MapIndex        index,
+			params object[] parameters)
+		{
+			Dictionary<CompoundValue,T> destDictionary = new Dictionary<CompoundValue,T>();
+
+			MapSourceListToDestinationList(
+				CreateDataReaderListMapper   (reader),
+				CreateDictionaryListMapper<T>(destDictionary, index, GetObjectMapper(typeof(T))),
+				parameters);
+
+			return destDictionary;
+		}
+
+		#endregion
+
+		#endregion
+
+		#region Dictionary
+
+		#region MapDictionaryToList
+
+		public IList MapDictionaryToList(
+			IDictionary     sourceDictionary,
+			IList           destList,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			if (sourceDictionary == null) throw new ArgumentNullException("sourceDictionary");
+
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper(sourceDictionary.Values.GetEnumerator()),
+				CreateObjectListMapper(destList, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return destList;
+		}
+
+		public IList MapDictionaryToList(
+			IDictionary     sourceDictionary,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			if (sourceDictionary == null) throw new ArgumentNullException("sourceDictionary");
+
+			IList destList = new List<object>();
+
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper(sourceDictionary.Values.GetEnumerator()),
+				CreateObjectListMapper(destList, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return destList;
+		}
+
+		public List<T> MapDictionaryToList<T>(
+			IDictionary     sourceDictionary,
+			List<T>         destList,
+			params object[] parameters)
+		{
+			if (sourceDictionary == null) throw new ArgumentNullException("sourceDictionary");
+
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper(sourceDictionary.Values.GetEnumerator()),
+				CreateObjectListMapper(destList, GetObjectMapper(typeof(T))),
+				parameters);
+
+			return destList;
+		}
+
+		public List<T> MapDictionaryToList<T>(
+			IDictionary     sourceDictionary,
+			params object[] parameters)
+		{
+			if (sourceDictionary == null) throw new ArgumentNullException("sourceDictionary");
+
+			List<T> destList = new List<T>();
+
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper(sourceDictionary.Values.GetEnumerator()),
+				CreateObjectListMapper(destList, GetObjectMapper(typeof(T))),
+				parameters);
+
+			return destList;
+		}
+
+		#endregion
+
+		#region MapDictionaryToDataTable
+
+#if !SILVERLIGHT
+
+		public DataTable MapDictionaryToDataTable(
+			IDictionary sourceDictionary,
+			DataTable   destTable)
+		{
+			if (sourceDictionary == null) throw new ArgumentNullException("sourceDictionary");
+
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper(sourceDictionary.Values.GetEnumerator()),
+				CreateDataTableMapper (destTable, DataRowVersion.Default),
+				null);
+
+			return destTable;
+		}
+
+		[SuppressMessage("Microsoft.Globalization", "CA1306:SetLocaleForDataTypes")]
+		public DataTable MapDictionaryToDataTable(IDictionary sourceDictionary)
+		{
+			if (sourceDictionary == null) throw new ArgumentNullException("sourceDictionary");
+
+			DataTable destTable = new DataTable();
+
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper(sourceDictionary.Values.GetEnumerator()),
+				CreateDataTableMapper (destTable, DataRowVersion.Default),
+				null);
+
+			return destTable;
+		}
+
+#endif
+
+		#endregion
+
+		#region MapDictionaryToDictionary
+
+		public IDictionary MapDictionaryToDictionary(
+			IDictionary          sourceDictionary,
+			IDictionary          destDictionary,
+			NameOrIndexParameter keyFieldNameOrIndex,
+			Type                 destObjectType,
+			params object[]      parameters)
+		{
+			if (sourceDictionary == null) throw new ArgumentNullException("sourceDictionary");
+
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper    (sourceDictionary.Values.GetEnumerator()),
+				CreateDictionaryListMapper(destDictionary, keyFieldNameOrIndex, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return destDictionary;
+		}
+
+		public IDictionary MapDictionaryToDictionary(
+			IDictionary          sourceDictionary,
+			NameOrIndexParameter keyFieldNameOrIndex,
+			Type                 destObjectType,
+			params object[]      parameters)
+		{
+			if (sourceDictionary == null) throw new ArgumentNullException("sourceDictionary");
+
+			IDictionary dest = new Dictionary<object,object>();
+
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper    (sourceDictionary.Values.GetEnumerator()),
+				CreateDictionaryListMapper(dest, keyFieldNameOrIndex, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return dest;
+		}
+
+		public IDictionary<TK,T> MapDictionaryToDictionary<TK,T>(
+			IDictionary          sourceDictionary,
+			IDictionary<TK,T>     destDictionary,
+			NameOrIndexParameter keyFieldNameOrIndex,
+			params object[]      parameters)
+		{
+			if (sourceDictionary == null) throw new ArgumentNullException("sourceDictionary");
+
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper         (sourceDictionary.Values.GetEnumerator()),
+				CreateDictionaryListMapper<TK,T>(destDictionary, keyFieldNameOrIndex, GetObjectMapper(typeof(T))),
+				parameters);
+
+			return destDictionary;
+		}
+
+		public Dictionary<TK,T> MapDictionaryToDictionary<TK,T>(
+			IDictionary          sourceDictionary,
+			NameOrIndexParameter keyFieldNameOrIndex,
+			params object[]      parameters)
+		{
+			if (sourceDictionary == null) throw new ArgumentNullException("sourceDictionary");
+
+			Dictionary<TK,T> dest = new Dictionary<TK,T>();
+
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper         (sourceDictionary.Values.GetEnumerator()),
+				CreateDictionaryListMapper<TK,T>(dest, keyFieldNameOrIndex, GetObjectMapper(typeof(T))),
+				parameters);
+
+			return dest;
+		}
+
+		#endregion
+
+		#region MapDictionaryToDictionary (Index)
+
+		public IDictionary MapDictionaryToDictionary(
+			IDictionary     sourceDictionary,
+			IDictionary     destDictionary,
+			MapIndex        index,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			if (sourceDictionary == null) throw new ArgumentNullException("sourceDictionary");
+
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper    (sourceDictionary.Values.GetEnumerator()),
+				CreateDictionaryListMapper(destDictionary, index, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return destDictionary;
+		}
+
+		public IDictionary MapDictionaryToDictionary(
+			IDictionary     sourceDictionary,
+			MapIndex        index,
+			Type            destObjectType,
+			params object[] parameters)
+		{
+			if (sourceDictionary == null) throw new ArgumentNullException("sourceDictionary");
+
+			IDictionary destDictionary = new Dictionary<object,object>();
+
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper    (sourceDictionary.Values.GetEnumerator()),
+				CreateDictionaryListMapper(destDictionary, index, GetObjectMapper(destObjectType)),
+				parameters);
+
+			return destDictionary;
+		}
+
+		public IDictionary<CompoundValue,T> MapDictionaryToDictionary<T>(
+			IDictionary                  sourceDictionary,
+			IDictionary<CompoundValue,T> destDictionary,
+			MapIndex                     index,
+			params object[]              parameters)
+		{
+			if (sourceDictionary == null) throw new ArgumentNullException("sourceDictionary");
+
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper       (sourceDictionary.Values.GetEnumerator()),
+				CreateDictionaryListMapper<T>(destDictionary, index, GetObjectMapper(typeof(T))),
+				parameters);
+
+			return destDictionary;
+		}
+
+		public Dictionary<CompoundValue,T> MapDictionaryToDictionary<T>(
+			IDictionary     sourceDictionary,
+			MapIndex        index,
+			params object[] parameters)
+		{
+			if (sourceDictionary == null) throw new ArgumentNullException("sourceDictionary");
+
+			Dictionary<CompoundValue,T> destDictionary = new Dictionary<CompoundValue,T>();
+
+			MapSourceListToDestinationList(
+				CreateEnumeratorMapper       (sourceDictionary.Values.GetEnumerator()),
+				CreateDictionaryListMapper<T>(destDictionary, index, GetObjectMapper(typeof(T))),
+				parameters);
+
+			return destDictionary;
+		}
+
+		#endregion
+
+		#endregion
+
+		#region MapToResultSet
+
+		public void MapResultSets(MapResultSet[] resultSets)
+		{
+			var initTable = new Dictionary<object,object>();
+			var context   = new InitContext();
+
+			object lastContainer = null;
+
+			context.MappingSchema = this;
+
+			try
+			{
+				PrepareRelarions(resultSets);
+
+				// Map relations.
+				//
+				foreach (MapResultSet rs in resultSets)
+				{
+					if (rs.Relations == null)
+						continue;
+
+					ObjectMapper masterMapper = GetObjectMapper(rs.ObjectType);
+
+					foreach (MapRelation r in rs.Relations)
+					{
+						MemberAccessor ma = masterMapper.TypeAccessor[r.ContainerName];
+
+						if (ma == null)
+							throw new MappingException(string.Format(Resources.MapIndex_BadField,
+								masterMapper.TypeAccessor.OriginalType.Name, r.ContainerName));
+
+						// Map.
+						//
+						var slave        = r.SlaveResultSet;
+						var slaveMapper  = GetObjectMapper(r.SlaveResultSet.ObjectType);
+						var indexedLists = rs.GetIndex(this, r.MasterIndex);
+
+						foreach (object o in slave.List)
+						{
+							object key = r.SlaveIndex.GetValueOrIndex(slaveMapper, o);
+
+							if (IsNull(key))
+								continue;
+
+							IList masterList;
+
+							if (!indexedLists.TryGetValue(key, out masterList))
+								continue;
+
+							foreach (object master in masterList)
+							{
+								ISupportMapping msm = master as ISupportMapping;
+
+								if (msm != null)
+								{
+									if (initTable.ContainsKey(master) == false)
+									{
+										msm.BeginMapping(context);
+										initTable.Add(master, msm);
+									}
+								}
+
+								object container = ma.GetValue(master);
+
+								if (container is IList)
+								{
+									if (lastContainer != container)
+									{
+										lastContainer = container;
+
+										ISupportMapping sm = container as ISupportMapping;
+
+										if (sm != null)
+										{
+											if (initTable.ContainsKey(container) == false)
+											{
+												sm.BeginMapping(context);
+												initTable[container] = sm;
+											}
+										}
+									}
+
+									((IList)container).Add(o);
+								}
+								else
+								{
+									ma.SetValue(master, o);
+								}
+							}
+						}
+					}
+				}
+			}
+			finally
+			{
+				foreach (ISupportMapping si in initTable.Values)
+					si.EndMapping(context);
+			}
+		}
+
+		public void MapDataReaderToResultSet(
+			IDataReader    reader,
+			MapResultSet[] resultSets)
+		{
+			if (reader == null) throw new ArgumentNullException("reader");
+
+			foreach (MapResultSet rs in resultSets)
+			{
+				MapDataReaderToList(reader, rs.List, rs.ObjectType, rs.Parameters);
+
+				if (reader.NextResult() == false)
+					break;
+			}
+
+			MapResultSets(resultSets);
+		}
+
+#if !SILVERLIGHT
+
+		public void MapDataSetToResultSet(
+			DataSet        dataSet,
+			MapResultSet[] resultSets)
+		{
+			for (int i = 0; i < resultSets.Length && i < dataSet.Tables.Count; i++)
+			{
+				MapResultSet rs = resultSets[i];
+
+				MapDataTableToList(dataSet.Tables[i], rs.List, rs.ObjectType, rs.Parameters);
+			}
+
+			MapResultSets(resultSets);
+		}
+
+#endif
+
+		public MapResultSet[] Clone(MapResultSet[] resultSets)
+		{
+			MapResultSet[] output = new MapResultSet[resultSets.Length];
+
+			for (int i = 0; i < resultSets.Length; i++)
+				output[i] = new MapResultSet(resultSets[i]);
+
+			return output;
+		}
+
+		private static int GetResultCount(MapNextResult[] nextResults)
+		{
+			int n = nextResults.Length;
+
+			foreach (MapNextResult nr in nextResults)
+				n += GetResultCount(nr.NextResults);
+
+			return n;
+		}
+
+		private static int GetResultSets(
+			int             current,
+			MapResultSet[]  output,
+			MapResultSet    master,
+			MapNextResult[] nextResults)
+		{
+			foreach (MapNextResult nr in nextResults)
+			{
+				output[current] = new MapResultSet(nr.ObjectType);
+
+				master.AddRelation(output[current], nr.SlaveIndex, nr.MasterIndex, nr.ContainerName);
+
+				current += GetResultSets(current + 1, output, output[current], nr.NextResults);
+			}
+
+			return current;
+		}
+
+		public MapResultSet[] ConvertToResultSet(
+			Type                   masterType,
+			params MapNextResult[] nextResults)
+		{
+			MapResultSet[] output = new MapResultSet[1 + GetResultCount(nextResults)];
+
+			output[0] = new MapResultSet(masterType);
+
+			GetResultSets(1, output, output[0], nextResults);
+
+			return output;
+		}
+
+		private void PrepareRelarions(params MapResultSet[] sets)
+		{
+			foreach (MapResultSet masterSet in sets)
+			{
+				if (masterSet.Relations != null)
+					continue;
+
+				foreach (MapResultSet slaveSet in sets)
+				{
+					bool isSet;
+
+					List<MapRelationBase> relations
+						= MetadataProvider.GetRelations(this, Extensions, masterSet.ObjectType, slaveSet.ObjectType, out isSet);
+
+					if (!isSet)
+						continue;
+
+					foreach (MapRelationBase relation in relations)
+						masterSet.AddRelation(slaveSet, relation);
+				}
+			}
+		}
+
+		#endregion
+
+		#region GetObjectMapper
+
+		public Func<TSource,TDest> GetObjectMapper<TSource,TDest>()
+		{
+			return new ExpressionMapper<TSource,TDest>(this)
+			{
+				IncludeComplexMapping = Common.Configuration.ExpressionMapper.IncludeComplexMapping
+			}.GetMapper();
+		}
+
+		public Func<TSource,TDest> GetObjectMapper<TSource,TDest>(bool deepCopy)
+		{
+			return new ExpressionMapper<TSource,TDest>(this)
+			{
+				DeepCopy              = deepCopy,
+				IncludeComplexMapping = Common.Configuration.ExpressionMapper.IncludeComplexMapping
+			}.GetMapper();
+		}
+
+		public Func<TSource,TDest> GetObjectMapper<TSource,TDest>(bool deepCopy, bool includeComplexMapping)
+		{
+			return new ExpressionMapper<TSource,TDest>(this)
+			{
+				DeepCopy              = deepCopy,
+				IncludeComplexMapping = includeComplexMapping
+			}.GetMapper();
+		}
+
+		#endregion
+
+		#region ConvertParameterValue
+
+		public virtual object ConvertParameterValue(object value, Type systemType)
+		{
+			return value;
+		}
+
+		#endregion        
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MemberMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,902 @@
+using System;
+using System.Data;
+using System.Data.SqlTypes;
+using System.Diagnostics;
+using System.IO;
+using System.Xml;
+
+using BLToolkit.Data.Sql;
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+
+using Convert = BLToolkit.Common.Convert;
+#if !SILVERLIGHT
+using System.Xml.Linq;
+#endif
+
+namespace BLToolkit.Mapping
+{
+	public partial class MemberMapper
+	{
+		#region Init
+
+		public virtual void Init(MapMemberInfo mapMemberInfo)
+		{
+			if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");
+
+			MapMemberInfo          = mapMemberInfo;
+			Name                   = mapMemberInfo.Name;
+			MemberName             = mapMemberInfo.MemberName;
+			Storage                = mapMemberInfo.Storage;
+			DbType                 = mapMemberInfo.DbType;
+			_type                  = mapMemberInfo.Type;
+			MemberAccessor         = mapMemberInfo.MemberAccessor;
+			_complexMemberAccessor = mapMemberInfo.ComplexMemberAccessor;
+			MappingSchema          = mapMemberInfo.MappingSchema;
+
+			if (Storage != null)
+				MemberAccessor = ExprMemberAccessor.GetMemberAccessor(MemberAccessor.TypeAccessor, Storage);
+		}
+
+		internal static MemberMapper CreateMemberMapper(MapMemberInfo mi)
+		{
+			var type = mi.Type;
+			var mm   = null as MemberMapper;
+
+			if (type.IsPrimitive || type.IsEnum)
+				mm = GetPrimitiveMemberMapper(mi);
+
+			if (mm == null)
+			{
+				mm = GetNullableMemberMapper(mi);
+
+				//if (mm != null)
+				//    mi.IsNullable = true;
+			}
+
+			if (mm == null) mm = GetSimpleMemberMapper(mi);
+#if !SILVERLIGHT
+			if (mm == null) mm = GetSqlTypeMemberMapper(mi);
+#endif
+			return mm ?? new DefaultMemberMapper();
+		}
+
+		#endregion
+
+		#region Public Properties
+
+		public MappingSchema  MappingSchema  { get; private set; }
+		public string         Name           { get; private set; }
+		public string         MemberName     { get; private set; }
+		public string         Storage        { get; private set; }
+		public DbType         DbType         { get; private set; }
+		public MapMemberInfo  MapMemberInfo  { get; private set; }
+		public int            Ordinal        { get; private set; }
+		public MemberAccessor MemberAccessor { get; private set; }
+		public bool           IsExplicit     { get; set;         }
+
+		internal void SetOrdinal(int ordinal)
+		{
+			Ordinal = ordinal;
+		}
+
+		private MemberAccessor _complexMemberAccessor;
+		public  MemberAccessor  ComplexMemberAccessor
+		{
+			[DebuggerStepThrough]
+			get { return _complexMemberAccessor ?? MemberAccessor; }
+		}
+
+		Type _type;
+		public virtual Type Type
+		{
+			get { return _type; }
+		}
+
+		public DbType GetDbType()
+		{
+			if (MapMemberInfo.IsDbTypeSet)
+				return DbType;
+
+			if (DbType != DbType.Object)
+				return DbType;
+
+			var dataType = SqlDataType.GetDataType(_type);
+
+			switch (dataType.SqlDbType)
+			{
+				case SqlDbType.BigInt           : return DbType.Int64;
+				case SqlDbType.Binary           : return DbType.Binary;
+				case SqlDbType.Bit              : return DbType.Boolean;
+				case SqlDbType.Char             : return DbType.AnsiStringFixedLength;
+				case SqlDbType.DateTime         : return DbType.DateTime;
+				case SqlDbType.Decimal          : return DbType.Decimal;
+				case SqlDbType.Float            : return DbType.Double;
+				case SqlDbType.Image            : return DbType.Binary;
+				case SqlDbType.Int              : return DbType.Int32;
+				case SqlDbType.Money            : return DbType.Currency;
+				case SqlDbType.NChar            : return DbType.StringFixedLength;
+				case SqlDbType.NText            : return DbType.String;
+				case SqlDbType.NVarChar         : return DbType.String;
+				case SqlDbType.Real             : return DbType.Single;
+				case SqlDbType.UniqueIdentifier : return DbType.Guid;
+				case SqlDbType.SmallDateTime    : return DbType.DateTime;
+				case SqlDbType.SmallInt         : return DbType.Int16;
+				case SqlDbType.SmallMoney       : return DbType.Currency;
+				case SqlDbType.Text             : return DbType.AnsiString;
+				case SqlDbType.Timestamp        : return DbType.Binary;
+				case SqlDbType.TinyInt          : return DbType.Byte;
+				case SqlDbType.VarBinary        : return DbType.Binary;
+				case SqlDbType.VarChar          : return DbType.AnsiString;
+				case SqlDbType.Variant          : return DbType.Object;
+				case SqlDbType.Xml              : return DbType.Xml;
+				case SqlDbType.Udt              : return DbType.Binary;
+				case SqlDbType.Date             : return DbType.Date;
+				case SqlDbType.Time             : return DbType.Time;
+#if !MONO
+				case SqlDbType.Structured       : return DbType.Binary;
+				case SqlDbType.DateTime2        : return DbType.DateTime2;
+				case SqlDbType.DateTimeOffset   : return DbType.DateTimeOffset;
+#endif
+			}
+
+			return DbType.Object;
+		}
+
+		public int GetDbSize(object value)
+		{
+			if (MapMemberInfo.IsDbSizeSet)
+				return MapMemberInfo.DbSize;
+
+			if (value == null)
+				return 0;
+
+			if (value is string)
+				return ((string)value).Length;
+
+			if (value is byte[])
+				return ((byte[])value).Length;
+
+
+			var dataType = SqlDataType.GetDataType(_type);
+
+			switch (dataType.SqlDbType)
+			{
+				case SqlDbType.BigInt           : return 0;
+				case SqlDbType.Binary           : return 0;
+				case SqlDbType.Bit              : return 0;
+				case SqlDbType.Char             : return 0;
+				case SqlDbType.DateTime         : return 0;
+				case SqlDbType.Decimal          : return 0;
+				case SqlDbType.Float            : return 0;
+				case SqlDbType.Image            : return 0;
+				case SqlDbType.Int              : return 0;
+				case SqlDbType.Money            : return 0;
+				case SqlDbType.NChar            : return 0;
+				case SqlDbType.NText            : return 0;
+				case SqlDbType.NVarChar         : return 0;
+				case SqlDbType.Real             : return 0;
+				case SqlDbType.UniqueIdentifier : return 0;
+				case SqlDbType.SmallDateTime    : return 0;
+				case SqlDbType.SmallInt         : return 0;
+				case SqlDbType.SmallMoney       : return 0;
+				case SqlDbType.Text             : return 0;
+				case SqlDbType.Timestamp        : return 0;
+				case SqlDbType.TinyInt          : return 0;
+				case SqlDbType.VarBinary        : return 0;
+				case SqlDbType.VarChar          : return 0;
+				case SqlDbType.Variant          : return 0;
+				case SqlDbType.Xml              : return 0;
+				case SqlDbType.Udt              : return 0;
+				case SqlDbType.Date             : return 0;
+				case SqlDbType.Time             : return 0;
+#if !MONO
+				case SqlDbType.Structured       : return 0;
+				case SqlDbType.DateTime2        : return 0;
+				case SqlDbType.DateTimeOffset   : return 0;
+#endif
+			}
+
+			return 0;
+		}
+
+		#endregion
+
+		#region Default Members (GetValue, SetValue)
+
+		public virtual bool SupportsValue { get { return !IsExplicit; } }
+
+		public virtual object GetValue(object o)
+		{
+			return MemberAccessor.GetValue(o);
+		}
+
+		public virtual bool     IsNull     (object o) { return GetValue(o) == null; }
+
+		// Simple type getters.
+		//
+		[CLSCompliant(false)]
+		public virtual SByte    GetSByte   (object o) { return MemberAccessor.GetSByte   (o); }
+		public virtual Int16    GetInt16   (object o) { return MemberAccessor.GetInt16   (o); }
+		public virtual Int32    GetInt32   (object o) { return MemberAccessor.GetInt32   (o); }
+		public virtual Int64    GetInt64   (object o) { return MemberAccessor.GetInt64   (o); }
+
+		public virtual Byte     GetByte    (object o) { return MemberAccessor.GetByte    (o); }
+		[CLSCompliant(false)]
+		public virtual UInt16   GetUInt16  (object o) { return MemberAccessor.GetUInt16  (o); }
+		[CLSCompliant(false)]
+		public virtual UInt32   GetUInt32  (object o) { return MemberAccessor.GetUInt32  (o); }
+		[CLSCompliant(false)]
+		public virtual UInt64   GetUInt64  (object o) { return MemberAccessor.GetUInt64  (o); }
+
+		public virtual Boolean  GetBoolean (object o) { return MemberAccessor.GetBoolean (o); }
+		public virtual Char     GetChar    (object o) { return MemberAccessor.GetChar    (o); }
+		public virtual Single   GetSingle  (object o) { return MemberAccessor.GetSingle  (o); }
+		public virtual Double   GetDouble  (object o) { return MemberAccessor.GetDouble  (o); }
+		public virtual Decimal  GetDecimal (object o) { return MemberAccessor.GetDecimal (o); }
+		public virtual Guid     GetGuid    (object o) { return MemberAccessor.GetGuid    (o); }
+		public virtual DateTime GetDateTime(object o) { return MemberAccessor.GetDateTime(o); }
+		public virtual DateTimeOffset GetDateTimeOffset(object o) { return MemberAccessor.GetDateTimeOffset(o); }
+
+		// Nullable type getters.
+		//
+		[CLSCompliant(false)]
+		public virtual SByte?    GetNullableSByte   (object o) { return MemberAccessor.GetNullableSByte   (o); }
+		public virtual Int16?    GetNullableInt16   (object o) { return MemberAccessor.GetNullableInt16   (o); }
+		public virtual Int32?    GetNullableInt32   (object o) { return MemberAccessor.GetNullableInt32   (o); }
+		public virtual Int64?    GetNullableInt64   (object o) { return MemberAccessor.GetNullableInt64   (o); }
+
+		public virtual Byte?     GetNullableByte    (object o) { return MemberAccessor.GetNullableByte    (o); }
+		[CLSCompliant(false)]
+		public virtual UInt16?   GetNullableUInt16  (object o) { return MemberAccessor.GetNullableUInt16  (o); }
+		[CLSCompliant(false)]
+		public virtual UInt32?   GetNullableUInt32  (object o) { return MemberAccessor.GetNullableUInt32  (o); }
+		[CLSCompliant(false)]
+		public virtual UInt64?   GetNullableUInt64  (object o) { return MemberAccessor.GetNullableUInt64  (o); }
+
+		public virtual Boolean?  GetNullableBoolean (object o) { return MemberAccessor.GetNullableBoolean (o); }
+		public virtual Char?     GetNullableChar    (object o) { return MemberAccessor.GetNullableChar    (o); }
+		public virtual Single?   GetNullableSingle  (object o) { return MemberAccessor.GetNullableSingle  (o); }
+		public virtual Double?   GetNullableDouble  (object o) { return MemberAccessor.GetNullableDouble  (o); }
+		public virtual Decimal?  GetNullableDecimal (object o) { return MemberAccessor.GetNullableDecimal (o); }
+		public virtual Guid?     GetNullableGuid    (object o) { return MemberAccessor.GetNullableGuid    (o); }
+		public virtual DateTime? GetNullableDateTime(object o) { return MemberAccessor.GetNullableDateTime(o); }
+		public virtual DateTimeOffset? GetNullableDateTimeOffset(object o) { return MemberAccessor.GetNullableDateTimeOffset(o); }
+
+#if !SILVERLIGHT
+
+		// SQL type getters.
+		//
+		public virtual SqlByte     GetSqlByte    (object o) { return MemberAccessor.GetSqlByte    (o); }
+		public virtual SqlInt16    GetSqlInt16   (object o) { return MemberAccessor.GetSqlInt16   (o); }
+		public virtual SqlInt32    GetSqlInt32   (object o) { return MemberAccessor.GetSqlInt32   (o); }
+		public virtual SqlInt64    GetSqlInt64   (object o) { return MemberAccessor.GetSqlInt64   (o); }
+		public virtual SqlSingle   GetSqlSingle  (object o) { return MemberAccessor.GetSqlSingle  (o); }
+		public virtual SqlBoolean  GetSqlBoolean (object o) { return MemberAccessor.GetSqlBoolean (o); }
+		public virtual SqlDouble   GetSqlDouble  (object o) { return MemberAccessor.GetSqlDouble  (o); }
+		public virtual SqlDateTime GetSqlDateTime(object o) { return MemberAccessor.GetSqlDateTime(o); }
+		public virtual SqlDecimal  GetSqlDecimal (object o) { return MemberAccessor.GetSqlDecimal (o); }
+		public virtual SqlMoney    GetSqlMoney   (object o) { return MemberAccessor.GetSqlMoney   (o); }
+		public virtual SqlGuid     GetSqlGuid    (object o) { return MemberAccessor.GetSqlGuid    (o); }
+		public virtual SqlString   GetSqlString  (object o) { return MemberAccessor.GetSqlString  (o); }
+
+#endif
+
+		public virtual void SetValue(object o, object value)
+		{
+			MemberAccessor.SetValue(o, value);
+		}
+
+		public virtual void SetNull   (object o)                { SetValue(o, null); }
+
+		// Simple type setters.
+		//
+		[CLSCompliant(false)]
+		public virtual void SetSByte   (object o, SByte    value) { MemberAccessor.SetSByte   (o, value); }
+		public virtual void SetInt16   (object o, Int16    value) { MemberAccessor.SetInt16   (o, value); }
+		public virtual void SetInt32   (object o, Int32    value) { MemberAccessor.SetInt32   (o, value); }
+		public virtual void SetInt64   (object o, Int64    value) { MemberAccessor.SetInt64   (o, value); }
+
+		public virtual void SetByte    (object o, Byte     value) { MemberAccessor.SetByte    (o, value); }
+		[CLSCompliant(false)]
+		public virtual void SetUInt16  (object o, UInt16   value) { MemberAccessor.SetUInt16  (o, value); }
+		[CLSCompliant(false)]
+		public virtual void SetUInt32  (object o, UInt32   value) { MemberAccessor.SetUInt32  (o, value); }
+		[CLSCompliant(false)]
+		public virtual void SetUInt64  (object o, UInt64   value) { MemberAccessor.SetUInt64  (o, value); }
+
+		public virtual void SetBoolean (object o, Boolean  value) { MemberAccessor.SetBoolean (o, value); }
+		public virtual void SetChar    (object o, Char     value) { MemberAccessor.SetChar    (o, value); }
+		public virtual void SetSingle  (object o, Single   value) { MemberAccessor.SetSingle  (o, value); }
+		public virtual void SetDouble  (object o, Double   value) { MemberAccessor.SetDouble  (o, value); }
+		public virtual void SetDecimal (object o, Decimal  value) { MemberAccessor.SetDecimal (o, value); }
+		public virtual void SetGuid    (object o, Guid     value) { MemberAccessor.SetGuid    (o, value); }
+		public virtual void SetDateTime(object o, DateTime value) { MemberAccessor.SetDateTime(o, value); }
+		public virtual void SetDateTimeOffset(object o, DateTimeOffset value) { MemberAccessor.SetDateTimeOffset(o, value); }
+
+		// Nullable type setters.
+		//
+		[CLSCompliant(false)]
+		public virtual void SetNullableSByte   (object o, SByte?    value) { MemberAccessor.SetNullableSByte   (o, value); }
+		public virtual void SetNullableInt16   (object o, Int16?    value) { MemberAccessor.SetNullableInt16   (o, value); }
+		public virtual void SetNullableInt32   (object o, Int32?    value) { MemberAccessor.SetNullableInt32   (o, value); }
+		public virtual void SetNullableInt64   (object o, Int64?    value) { MemberAccessor.SetNullableInt64   (o, value); }
+
+		public virtual void SetNullableByte    (object o, Byte?     value) { MemberAccessor.SetNullableByte    (o, value); }
+		[CLSCompliant(false)]
+		public virtual void SetNullableUInt16  (object o, UInt16?   value) { MemberAccessor.SetNullableUInt16  (o, value); }
+		[CLSCompliant(false)]
+		public virtual void SetNullableUInt32  (object o, UInt32?   value) { MemberAccessor.SetNullableUInt32  (o, value); }
+		[CLSCompliant(false)]
+		public virtual void SetNullableUInt64  (object o, UInt64?   value) { MemberAccessor.SetNullableUInt64  (o, value); }
+
+		public virtual void SetNullableBoolean (object o, Boolean?  value) { MemberAccessor.SetNullableBoolean (o, value); }
+		public virtual void SetNullableChar    (object o, Char?     value) { MemberAccessor.SetNullableChar    (o, value); }
+		public virtual void SetNullableSingle  (object o, Single?   value) { MemberAccessor.SetNullableSingle  (o, value); }
+		public virtual void SetNullableDouble  (object o, Double?   value) { MemberAccessor.SetNullableDouble  (o, value); }
+		public virtual void SetNullableDecimal (object o, Decimal?  value) { MemberAccessor.SetNullableDecimal (o, value); }
+		public virtual void SetNullableGuid    (object o, Guid?     value) { MemberAccessor.SetNullableGuid    (o, value); }
+		public virtual void SetNullableDateTime(object o, DateTime? value) { MemberAccessor.SetNullableDateTime(o, value); }
+		public virtual void SetNullableDateTimeOffset(object o, DateTimeOffset? value) { MemberAccessor.SetNullableDateTimeOffset(o, value); }
+
+#if !SILVERLIGHT
+
+		// SQL type setters.
+		//
+		public virtual void SetSqlByte    (object o, SqlByte     value) { MemberAccessor.SetSqlByte    (o, value); }
+		public virtual void SetSqlInt16   (object o, SqlInt16    value) { MemberAccessor.SetSqlInt16   (o, value); }
+		public virtual void SetSqlInt32   (object o, SqlInt32    value) { MemberAccessor.SetSqlInt32   (o, value); }
+		public virtual void SetSqlInt64   (object o, SqlInt64    value) { MemberAccessor.SetSqlInt64   (o, value); }
+		public virtual void SetSqlSingle  (object o, SqlSingle   value) { MemberAccessor.SetSqlSingle  (o, value); }
+		public virtual void SetSqlBoolean (object o, SqlBoolean  value) { MemberAccessor.SetSqlBoolean (o, value); }
+		public virtual void SetSqlDouble  (object o, SqlDouble   value) { MemberAccessor.SetSqlDouble  (o, value); }
+		public virtual void SetSqlDateTime(object o, SqlDateTime value) { MemberAccessor.SetSqlDateTime(o, value); }
+		public virtual void SetSqlDecimal (object o, SqlDecimal  value) { MemberAccessor.SetSqlDecimal (o, value); }
+		public virtual void SetSqlMoney   (object o, SqlMoney    value) { MemberAccessor.SetSqlMoney   (o, value); }
+		public virtual void SetSqlGuid    (object o, SqlGuid     value) { MemberAccessor.SetSqlGuid    (o, value); }
+		public virtual void SetSqlString  (object o, SqlString   value) { MemberAccessor.SetSqlString  (o, value); }
+
+#endif
+
+		public virtual void CloneValue    (object source, object dest)  { MemberAccessor.CloneValue(source, dest); }
+
+		#endregion
+
+		#region Intermal Mappers
+
+		#region Complex Mapper
+
+		internal sealed class ComplexMapper : MemberMapper
+		{
+			public ComplexMapper(MemberMapper memberMapper)
+			{
+				_mapper = memberMapper;
+			}
+
+			private readonly MemberMapper _mapper;
+
+			public override void Init(MapMemberInfo mapMemberInfo)
+			{
+				base.Init(mapMemberInfo);
+
+				var attr = MemberAccessor.GetAttribute<NoInstanceAttribute>();
+
+				if (attr != null)
+				{
+					_createInstance = true;
+				}
+			}
+
+			bool         _createInstance;
+			TypeAccessor _typeAccessor;
+
+			object GetObject(object o)
+			{
+				var obj = MemberAccessor.GetValue(o);
+
+				if (_createInstance && obj == null)
+				{
+					if (_typeAccessor == null)
+						_typeAccessor = TypeAccessor.GetAccessor(MemberAccessor.Type);
+
+					obj = _typeAccessor.CreateInstanceEx();
+
+					MemberAccessor.SetValue(o, obj);
+				}
+
+				return obj;
+			}
+
+			#region GetValue
+
+			public override object GetValue(object o)
+			{
+				var obj = MemberAccessor.GetValue(o);
+				return obj == null? null: _mapper.GetValue(obj);
+			}
+
+			// Simple type getters.
+			//
+			public override SByte    GetSByte   (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? MappingSchema.DefaultSByteNullValue:    _mapper.GetSByte   (obj); }
+			public override Int16    GetInt16   (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? MappingSchema.DefaultInt16NullValue:    _mapper.GetInt16   (obj); }
+			public override Int32    GetInt32   (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? MappingSchema.DefaultInt32NullValue:    _mapper.GetInt32   (obj); }
+			public override Int64    GetInt64   (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? MappingSchema.DefaultInt64NullValue:    _mapper.GetInt64   (obj); }
+
+			public override Byte     GetByte    (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? MappingSchema.DefaultByteNullValue:     _mapper.GetByte    (obj); }
+			public override UInt16   GetUInt16  (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? MappingSchema.DefaultUInt16NullValue:   _mapper.GetUInt16  (obj); }
+			public override UInt32   GetUInt32  (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? MappingSchema.DefaultUInt32NullValue:   _mapper.GetUInt32  (obj); }
+			public override UInt64   GetUInt64  (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? MappingSchema.DefaultUInt64NullValue:   _mapper.GetUInt64  (obj); }
+
+			public override Boolean  GetBoolean (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? MappingSchema.DefaultBooleanNullValue:  _mapper.GetBoolean (obj); }
+			public override Char     GetChar    (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? MappingSchema.DefaultCharNullValue:     _mapper.GetChar    (obj); }
+			public override Single   GetSingle  (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? MappingSchema.DefaultSingleNullValue:   _mapper.GetSingle  (obj); }
+			public override Double   GetDouble  (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? MappingSchema.DefaultDoubleNullValue:   _mapper.GetDouble  (obj); }
+			public override Decimal  GetDecimal (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? MappingSchema.DefaultDecimalNullValue:  _mapper.GetDecimal (obj); }
+			public override Guid     GetGuid    (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? MappingSchema.DefaultGuidNullValue:     _mapper.GetGuid    (obj); }
+			public override DateTime GetDateTime(object o) { var obj = MemberAccessor.GetValue(o); return obj == null? MappingSchema.DefaultDateTimeNullValue: _mapper.GetDateTime(obj); }
+			public override DateTimeOffset GetDateTimeOffset(object o) { var obj = MemberAccessor.GetValue(o); return obj == null? MappingSchema.DefaultDateTimeOffsetNullValue: _mapper.GetDateTimeOffset(obj); }
+
+			// Nullable type getters.
+			//
+			public override SByte?    GetNullableSByte   (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? null: _mapper.GetNullableSByte   (obj); }
+			public override Int16?    GetNullableInt16   (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? null: _mapper.GetNullableInt16   (obj); }
+			public override Int32?    GetNullableInt32   (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? null: _mapper.GetNullableInt32   (obj); }
+			public override Int64?    GetNullableInt64   (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? null: _mapper.GetNullableInt64   (obj); }
+
+			public override Byte?     GetNullableByte    (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? null: _mapper.GetNullableByte    (obj); }
+			public override UInt16?   GetNullableUInt16  (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? null: _mapper.GetNullableUInt16  (obj); }
+			public override UInt32?   GetNullableUInt32  (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? null: _mapper.GetNullableUInt32  (obj); }
+			public override UInt64?   GetNullableUInt64  (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? null: _mapper.GetNullableUInt64  (obj); }
+
+			public override Boolean?  GetNullableBoolean (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? null: _mapper.GetNullableBoolean (obj); }
+			public override Char?     GetNullableChar    (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? null: _mapper.GetNullableChar    (obj); }
+			public override Single?   GetNullableSingle  (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? null: _mapper.GetNullableSingle  (obj); }
+			public override Double?   GetNullableDouble  (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? null: _mapper.GetNullableDouble  (obj); }
+			public override Decimal?  GetNullableDecimal (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? null: _mapper.GetNullableDecimal (obj); }
+			public override Guid?     GetNullableGuid    (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? null: _mapper.GetNullableGuid    (obj); }
+			public override DateTime? GetNullableDateTime(object o) { var obj = MemberAccessor.GetValue(o); return obj == null? null: _mapper.GetNullableDateTime(obj); }
+			public override DateTimeOffset? GetNullableDateTimeOffset(object o) { var obj = MemberAccessor.GetValue(o); return obj == null? null: _mapper.GetNullableDateTimeOffset(obj); }
+
+#if !SILVERLIGHT
+
+			// SQL type getters.
+			//
+			public override SqlByte     GetSqlByte    (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? SqlByte.    Null: _mapper.GetSqlByte    (obj); }
+			public override SqlInt16    GetSqlInt16   (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? SqlInt16.   Null: _mapper.GetSqlInt16   (obj); }
+			public override SqlInt32    GetSqlInt32   (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? SqlInt32.   Null: _mapper.GetSqlInt32   (obj); }
+			public override SqlInt64    GetSqlInt64   (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? SqlInt64.   Null: _mapper.GetSqlInt64   (obj); }
+			public override SqlSingle   GetSqlSingle  (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? SqlSingle.  Null: _mapper.GetSqlSingle  (obj); }
+			public override SqlBoolean  GetSqlBoolean (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? SqlBoolean. Null: _mapper.GetSqlBoolean (obj); }
+			public override SqlDouble   GetSqlDouble  (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? SqlDouble.  Null: _mapper.GetSqlDouble  (obj); }
+			public override SqlDateTime GetSqlDateTime(object o) { var obj = MemberAccessor.GetValue(o); return obj == null? SqlDateTime.Null: _mapper.GetSqlDateTime(obj); }
+			public override SqlDecimal  GetSqlDecimal (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? SqlDecimal. Null: _mapper.GetSqlDecimal (obj); }
+			public override SqlMoney    GetSqlMoney   (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? SqlMoney.   Null: _mapper.GetSqlMoney   (obj); }
+			public override SqlGuid     GetSqlGuid    (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? SqlGuid.    Null: _mapper.GetSqlGuid    (obj); }
+			public override SqlString   GetSqlString  (object o) { var obj = MemberAccessor.GetValue(o); return obj == null? SqlString.  Null: _mapper.GetSqlString  (obj); }
+
+#endif
+
+			#endregion
+
+			#region SetValue
+
+			public override void SetValue(object o, object value)
+			{
+				var obj = MemberAccessor.GetValue(o);
+
+				if (obj != null)
+					_mapper.SetValue(obj, value);
+			}
+
+			public override void SetSByte   (object o, SByte    value) { var obj = GetObject(o); if (obj != null) _mapper.SetSByte   (obj, value); }
+			public override void SetInt16   (object o, Int16    value) { var obj = GetObject(o); if (obj != null) _mapper.SetInt16   (obj, value); }
+			public override void SetInt32   (object o, Int32    value) { var obj = GetObject(o); if (obj != null) _mapper.SetInt32   (obj, value); }
+			public override void SetInt64   (object o, Int64    value) { var obj = GetObject(o); if (obj != null) _mapper.SetInt64   (obj, value); }
+
+			public override void SetByte    (object o, Byte     value) { var obj = GetObject(o); if (obj != null) _mapper.SetByte    (obj, value); }
+			public override void SetUInt16  (object o, UInt16   value) { var obj = GetObject(o); if (obj != null) _mapper.SetUInt16  (obj, value); }
+			public override void SetUInt32  (object o, UInt32   value) { var obj = GetObject(o); if (obj != null) _mapper.SetUInt32  (obj, value); }
+			public override void SetUInt64  (object o, UInt64   value) { var obj = GetObject(o); if (obj != null) _mapper.SetUInt64  (obj, value); }
+
+			public override void SetBoolean (object o, Boolean  value) { var obj = GetObject(o); if (obj != null) _mapper.SetBoolean (obj, value); }
+			public override void SetChar    (object o, Char     value) { var obj = GetObject(o); if (obj != null) _mapper.SetChar    (obj, value); }
+			public override void SetSingle  (object o, Single   value) { var obj = GetObject(o); if (obj != null) _mapper.SetSingle  (obj, value); }
+			public override void SetDouble  (object o, Double   value) { var obj = GetObject(o); if (obj != null) _mapper.SetDouble  (obj, value); }
+			public override void SetDecimal (object o, Decimal  value) { var obj = GetObject(o); if (obj != null) _mapper.SetDecimal (obj, value); }
+			public override void SetGuid    (object o, Guid     value) { var obj = GetObject(o); if (obj != null) _mapper.SetGuid    (obj, value); }
+			public override void SetDateTime(object o, DateTime value) { var obj = GetObject(o); if (obj != null) _mapper.SetDateTime(obj, value); }
+			public override void SetDateTimeOffset(object o, DateTimeOffset value) { var obj = GetObject(o); if (obj != null) _mapper.SetDateTimeOffset(obj, value); }
+
+			// Nullable type setters.
+			//
+			public override void SetNullableSByte   (object o, SByte?    value) { var obj = GetObject(o); if (obj != null) _mapper.SetNullableSByte   (obj, value); }
+			public override void SetNullableInt16   (object o, Int16?    value) { var obj = GetObject(o); if (obj != null) _mapper.SetNullableInt16   (obj, value); }
+			public override void SetNullableInt32   (object o, Int32?    value) { var obj = GetObject(o); if (obj != null) _mapper.SetNullableInt32   (obj, value); }
+			public override void SetNullableInt64   (object o, Int64?    value) { var obj = GetObject(o); if (obj != null) _mapper.SetNullableInt64   (obj, value); }
+
+			public override void SetNullableByte    (object o, Byte?     value) { var obj = GetObject(o); if (obj != null) _mapper.SetNullableByte    (obj, value); }
+			public override void SetNullableUInt16  (object o, UInt16?   value) { var obj = GetObject(o); if (obj != null) _mapper.SetNullableUInt16  (obj, value); }
+			public override void SetNullableUInt32  (object o, UInt32?   value) { var obj = GetObject(o); if (obj != null) _mapper.SetNullableUInt32  (obj, value); }
+			public override void SetNullableUInt64  (object o, UInt64?   value) { var obj = GetObject(o); if (obj != null) _mapper.SetNullableUInt64  (obj, value); }
+
+			public override void SetNullableBoolean (object o, Boolean?  value) { var obj = GetObject(o); if (obj != null) _mapper.SetNullableBoolean (obj, value); }
+			public override void SetNullableChar    (object o, Char?     value) { var obj = GetObject(o); if (obj != null) _mapper.SetNullableChar    (obj, value); }
+			public override void SetNullableSingle  (object o, Single?   value) { var obj = GetObject(o); if (obj != null) _mapper.SetNullableSingle  (obj, value); }
+			public override void SetNullableDouble  (object o, Double?   value) { var obj = GetObject(o); if (obj != null) _mapper.SetNullableDouble  (obj, value); }
+			public override void SetNullableDecimal (object o, Decimal?  value) { var obj = GetObject(o); if (obj != null) _mapper.SetNullableDecimal (obj, value); }
+			public override void SetNullableGuid    (object o, Guid?     value) { var obj = GetObject(o); if (obj != null) _mapper.SetNullableGuid    (obj, value); }
+			public override void SetNullableDateTime(object o, DateTime? value) { var obj = GetObject(o); if (obj != null) _mapper.SetNullableDateTime(obj, value); }
+			public override void SetNullableDateTimeOffset(object o, DateTimeOffset? value) { var obj = GetObject(o); if (obj != null) _mapper.SetNullableDateTimeOffset(obj, value); }
+
+#if !SILVERLIGHT
+
+			// SQL type setters.
+			//
+			public override void SetSqlByte    (object o, SqlByte     value) { var obj = GetObject(o); if (obj != null) _mapper.SetSqlByte    (obj, value); }
+			public override void SetSqlInt16   (object o, SqlInt16    value) { var obj = GetObject(o); if (obj != null) _mapper.SetSqlInt16   (obj, value); }
+			public override void SetSqlInt32   (object o, SqlInt32    value) { var obj = GetObject(o); if (obj != null) _mapper.SetSqlInt32   (obj, value); }
+			public override void SetSqlInt64   (object o, SqlInt64    value) { var obj = GetObject(o); if (obj != null) _mapper.SetSqlInt64   (obj, value); }
+			public override void SetSqlSingle  (object o, SqlSingle   value) { var obj = GetObject(o); if (obj != null) _mapper.SetSqlSingle  (obj, value); }
+			public override void SetSqlBoolean (object o, SqlBoolean  value) { var obj = GetObject(o); if (obj != null) _mapper.SetSqlBoolean (obj, value); }
+			public override void SetSqlDouble  (object o, SqlDouble   value) { var obj = GetObject(o); if (obj != null) _mapper.SetSqlDouble  (obj, value); }
+			public override void SetSqlDateTime(object o, SqlDateTime value) { var obj = GetObject(o); if (obj != null) _mapper.SetSqlDateTime(obj, value); }
+			public override void SetSqlDecimal (object o, SqlDecimal  value) { var obj = GetObject(o); if (obj != null) _mapper.SetSqlDecimal (obj, value); }
+			public override void SetSqlMoney   (object o, SqlMoney    value) { var obj = GetObject(o); if (obj != null) _mapper.SetSqlMoney   (obj, value); }
+			public override void SetSqlGuid    (object o, SqlGuid     value) { var obj = GetObject(o); if (obj != null) _mapper.SetSqlGuid    (obj, value); }
+			public override void SetSqlString  (object o, SqlString   value) { var obj = GetObject(o); if (obj != null) _mapper.SetSqlString  (obj, value); }
+
+#endif
+
+			#endregion
+		}
+
+		#endregion
+
+		#region Primitive Mappers
+
+		private static MemberMapper GetPrimitiveMemberMapper(MapMemberInfo mi)
+		{
+			if (mi.MapValues != null)
+				return null;
+
+			var n    = mi.Nullable;
+			var type = mi.MemberAccessor.UnderlyingType;
+ 
+			if (type == typeof(SByte))   return n? new SByteMapper.  Nullable(): new SByteMapper();
+			if (type == typeof(Int16))   return n? new Int16Mapper.  Nullable(): new Int16Mapper();
+			if (type == typeof(Int32))   return n? new Int32Mapper.  Nullable(): new Int32Mapper();
+			if (type == typeof(Int64))   return n? new Int64Mapper.  Nullable(): new Int64Mapper();
+			if (type == typeof(Byte))    return n? new ByteMapper.   Nullable(): new ByteMapper();
+			if (type == typeof(UInt16))  return n? new UInt16Mapper. Nullable(): new UInt16Mapper();
+			if (type == typeof(UInt32))  return n? new UInt32Mapper. Nullable(): new UInt32Mapper();
+			if (type == typeof(UInt64))  return n? new UInt64Mapper. Nullable(): new UInt64Mapper();
+			if (type == typeof(Single))  return n? new SingleMapper. Nullable(): new SingleMapper();
+			if (type == typeof(Double))  return n? new DoubleMapper. Nullable(): new DoubleMapper();
+			if (type == typeof(Char))    return n? new CharMapper.   Nullable(): new CharMapper();
+			if (type == typeof(Boolean)) return n? new BooleanMapper.Nullable(): new BooleanMapper();
+
+			throw new InvalidOperationException();
+		}
+
+		#endregion
+
+		#region Simple Mappers
+
+		private static MemberMapper GetSimpleMemberMapper(MapMemberInfo mi)
+		{
+			if (mi.MapValues != null)
+				return null;
+
+			var n    = mi.Nullable;
+			var type = mi.Type;
+
+			if (type == typeof(String))
+				if (mi.Trimmable) return n? new StringMapper.Trimmable.NullableT(): new StringMapper.Trimmable();
+				else              return n? new StringMapper.Nullable()           : new StringMapper();
+
+			if (type == typeof(DateTime))       return n? new DateTimeMapper.Nullable()       : new DateTimeMapper();
+			if (type == typeof(DateTimeOffset)) return n? new DateTimeOffsetMapper.Nullable() : new DateTimeOffsetMapper();
+			if (type == typeof(Decimal))        return n? new DecimalMapper.Nullable()        : new DecimalMapper();
+			if (type == typeof(Guid))           return n? new GuidMapper.Nullable()           : new GuidMapper();
+			if (type == typeof(Stream))         return n? new StreamMapper.Nullable()         : new StreamMapper();
+#if !SILVERLIGHT
+			if (type == typeof(XmlReader))      return n? new XmlReaderMapper.Nullable()      : new XmlReaderMapper();
+			if (type == typeof(XmlDocument))    return n? new XmlDocumentMapper.Nullable()    : new XmlDocumentMapper();
+            if (type == typeof(XElement))       return n? new XElementMapper.Nullable()       : new XElementMapper();
+#endif
+			return null;
+		}
+
+		class StringMapper : MemberMapper
+		{
+			string _nullValue;
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetValue(
+					o,
+					value is string? value:
+					value == null?   _nullValue:
+					                 MappingSchema.ConvertToString(value));
+			}
+
+			public override void Init(MapMemberInfo mapMemberInfo)
+			{
+				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");
+
+				if (mapMemberInfo.NullValue != null)
+					_nullValue = Convert.ToString(mapMemberInfo.NullValue);
+
+				base.Init(mapMemberInfo);
+			}
+
+			public class Nullable : StringMapper
+			{
+				public override object GetValue(object o)
+				{
+					var value = MemberAccessor.GetValue(o);
+					return (string)value == _nullValue? null: value;
+				}
+			}
+
+			public class Trimmable : StringMapper
+			{
+				public override void SetValue(object o, object value)
+				{
+					MemberAccessor.SetValue(
+						o, value == null? _nullValue: MappingSchema.ConvertToString(value).TrimEnd(_trim));
+				}
+
+				public class NullableT : Trimmable
+				{
+					public override object GetValue(object o)
+					{
+						var value = MemberAccessor.GetValue(o);
+						return (string)value == _nullValue? null: value;
+					}
+				}
+			}
+		}
+
+		#endregion
+
+		#region Nullable Mappers
+
+		private static MemberMapper GetNullableMemberMapper(MapMemberInfo mi)
+		{
+			var type = mi.Type;
+
+			if (type.IsGenericType == false || mi.MapValues != null)
+				return null;
+
+			var underlyingType = Nullable.GetUnderlyingType(type);
+
+			if (underlyingType == null)
+				return null;
+
+			if (underlyingType.IsEnum)
+			{
+				underlyingType = Enum.GetUnderlyingType(underlyingType);
+
+				if (underlyingType == typeof(SByte))    return new NullableSByteMapper. Enum();
+				if (underlyingType == typeof(Int16))    return new NullableInt16Mapper. Enum();
+				if (underlyingType == typeof(Int32))    return new NullableInt32Mapper. Enum();
+				if (underlyingType == typeof(Int64))    return new NullableInt64Mapper. Enum();
+				if (underlyingType == typeof(Byte))     return new NullableByteMapper.  Enum();
+				if (underlyingType == typeof(UInt16))   return new NullableUInt16Mapper.Enum();
+				if (underlyingType == typeof(UInt32))   return new NullableUInt32Mapper.Enum();
+				if (underlyingType == typeof(UInt64))   return new NullableUInt64Mapper.Enum();
+			}
+			else
+			{
+				if (underlyingType == typeof(SByte))    return new NullableSByteMapper();
+				if (underlyingType == typeof(Int16))    return new NullableInt16Mapper();
+				if (underlyingType == typeof(Int32))    return new NullableInt32Mapper();
+				if (underlyingType == typeof(Int64))    return new NullableInt64Mapper();
+				if (underlyingType == typeof(Byte))     return new NullableByteMapper();
+				if (underlyingType == typeof(UInt16))   return new NullableUInt16Mapper();
+				if (underlyingType == typeof(UInt32))   return new NullableUInt32Mapper();
+				if (underlyingType == typeof(UInt64))   return new NullableUInt64Mapper();
+				if (underlyingType == typeof(Char))     return new NullableCharMapper();
+				if (underlyingType == typeof(Single))   return new NullableSingleMapper();
+				if (underlyingType == typeof(Boolean))  return new NullableBooleanMapper();
+				if (underlyingType == typeof(Double))   return new NullableDoubleMapper();
+				if (underlyingType == typeof(DateTime)) return new NullableDateTimeMapper();
+				if (underlyingType == typeof(Decimal))  return new NullableDecimalMapper();
+				if (underlyingType == typeof(Guid))     return new NullableGuidMapper();
+			}
+
+			return null;
+		}
+
+		abstract class NullableEnumMapper : MemberMapper
+		{
+			protected Type MemberType;
+			protected Type UnderlyingType;
+
+			public override void Init(MapMemberInfo mapMemberInfo)
+			{
+				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");
+
+				MemberType     = Nullable.GetUnderlyingType(mapMemberInfo.Type);
+				UnderlyingType = mapMemberInfo.MemberAccessor.UnderlyingType;
+
+				base.Init(mapMemberInfo);
+			}
+		}
+
+		#endregion
+
+		#region SqlTypes
+
+#if !SILVERLIGHT
+
+		private static MemberMapper GetSqlTypeMemberMapper(MapMemberInfo mi)
+		{
+			var type = mi.Type;
+
+			if (TypeHelper.IsSameOrParent(typeof(INullable), type) == false)
+				return null;
+
+			var d = mi.MapValues != null;
+
+			if (type == typeof(SqlByte))     return d? new SqlByteMapper.    Default(): new SqlByteMapper();
+			if (type == typeof(SqlInt16))    return d? new SqlInt16Mapper.   Default(): new SqlInt16Mapper();
+			if (type == typeof(SqlInt32))    return d? new SqlInt32Mapper.   Default(): new SqlInt32Mapper();
+			if (type == typeof(SqlInt64))    return d? new SqlInt64Mapper.   Default(): new SqlInt64Mapper();
+			if (type == typeof(SqlSingle))   return d? new SqlSingleMapper.  Default(): new SqlSingleMapper();
+			if (type == typeof(SqlBoolean))  return d? new SqlBooleanMapper. Default(): new SqlBooleanMapper();
+			if (type == typeof(SqlDouble))   return d? new SqlDoubleMapper.  Default(): new SqlDoubleMapper();
+			if (type == typeof(SqlDateTime)) return d? new SqlDateTimeMapper.Default(): new SqlDateTimeMapper();
+			if (type == typeof(SqlDecimal))  return d? new SqlDecimalMapper. Default(): new SqlDecimalMapper();
+			if (type == typeof(SqlMoney))    return d? new SqlMoneyMapper.   Default(): new SqlMoneyMapper();
+			if (type == typeof(SqlGuid))     return d? new SqlGuidMapper.    Default(): new SqlGuidMapper();
+			if (type == typeof(SqlString))   return d? new SqlStringMapper.  Default(): new SqlStringMapper();
+
+			return null;
+		}
+
+#endif
+
+		#endregion
+
+		#endregion
+
+		#region MapFrom, MapTo
+
+		protected object MapFrom(object value)
+		{
+			return MapFrom(value, MapMemberInfo);
+		}
+
+		static readonly char[] _trim = { ' ' };
+
+		protected object MapFrom(object value, MapMemberInfo mapInfo)
+		{
+			if (mapInfo == null) throw new ArgumentNullException("mapInfo");
+
+			if (value == null)
+				return mapInfo.NullValue;
+
+			if (mapInfo.Trimmable && value is string)
+				value = value.ToString().TrimEnd(_trim);
+
+			if (mapInfo.MapValues != null)
+			{
+				object origValue;
+				if (mapInfo.TryGetOrigValue(value, out origValue))
+					return origValue;
+
+				// 2012-09-18 ili: this is too slow when we have for ex. enum with 50+ values
+				//
+				//var comp = (IComparable)value;
+
+				//foreach (var mv       in mapInfo.MapValues)
+				//foreach (var mapValue in mv.MapValues)
+				//{
+				//    try
+				//    {
+				//        if (comp.CompareTo(mapValue) == 0)
+				//            return mv.OrigValue;
+				//    }
+				//    catch
+				//    {
+				//    }
+				//}
+
+				// Default value.
+				//
+				if (mapInfo.DefaultValue != null)
+					return mapInfo.DefaultValue;
+			}
+
+			var valueType  = value.GetType();
+			var memberType = mapInfo.Type;
+
+			if (!TypeHelper.IsSameOrParent(memberType, valueType))
+			{
+				if (memberType.IsGenericType)
+				{
+					var underlyingType = Nullable.GetUnderlyingType(memberType);
+
+					if (valueType == underlyingType)
+						return value;
+
+					memberType = underlyingType;
+				}
+
+				if (memberType.IsEnum)
+				{
+					var underlyingType = mapInfo.MemberAccessor.UnderlyingType;
+
+					if (valueType != underlyingType)
+						//value = _mappingSchema.ConvertChangeType(value, underlyingType);
+						return MapFrom(MappingSchema.ConvertChangeType(value, underlyingType), mapInfo);
+
+					//value = Enum.Parse(type, Enum.GetName(type, value));
+					value = Enum.ToObject(memberType, value);
+				}
+				else
+				{
+					value = MappingSchema.ConvertChangeType(value, memberType);
+				}
+			}
+
+			return value;
+		}
+
+		protected object MapTo(object value)
+		{
+			return MapTo(value, MapMemberInfo);
+		}
+
+		protected static object MapTo(object value, MapMemberInfo mapInfo)
+		{
+			if (mapInfo == null) throw new ArgumentNullException("mapInfo");
+
+			if (value == null)
+				return null;
+
+			if (mapInfo.Nullable && mapInfo.NullValue != null)
+			{
+				try
+				{
+					var comp = (IComparable)value;
+
+					if (comp.CompareTo(mapInfo.NullValue) == 0)
+						return null;
+				}
+				catch
+				{
+				}
+			}
+
+			if (mapInfo.MapValues != null)
+			{
+				object mapValue;
+				if (mapInfo.TryGetMapValue(value, out mapValue))
+					return mapValue;
+
+				//2011-11-16 ili: this is too slow when we have for ex. enum with 50+ values
+				//
+				//var comp = (IComparable)value;
+
+				//foreach (var mv in mapInfo.MapValues)
+				//{
+				//    try
+				//    {
+				//        if (comp.CompareTo(mv.OrigValue) == 0)
+				//            return mv.MapValues[0];
+				//    }
+				//    catch
+				//    {
+				//    }
+				//}
+			}
+
+			return value;
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MemberMapper.generated.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1477 @@
+//---------------------------------------------------------------------------------------------------
+// <auto-generated>
+//    This code was generated by BLToolkit template for T4.
+//    Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
+// </auto-generated>
+//---------------------------------------------------------------------------------------------------
+using System;
+using System.Data.SqlTypes;
+using System.IO;
+using System.Xml;
+
+using Convert = BLToolkit.Common.Convert;
+#if !SILVERLIGHT
+using System.Xml.Linq;
+#endif
+
+namespace BLToolkit.Mapping
+{
+	public partial class MemberMapper
+	{
+
+		class SByteMapper : MemberMapper
+		{
+			SByte _nullValue;
+
+			public override bool IsNull (object o) { return false; }
+			public override void SetNull(object o) { MemberAccessor.SetSByte(o, _nullValue); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetSByte(
+					o,
+					value is SByte ? (SByte)value :
+					value == null ? _nullValue : MappingSchema.ConvertToSByte(value));
+			}
+
+			public override void Init(MapMemberInfo mapMemberInfo)
+			{
+				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");
+
+				_nullValue = Convert.ToSByte(mapMemberInfo.NullValue);
+
+				base.Init(mapMemberInfo);
+			}
+
+			public class Nullable : SByteMapper
+			{
+				public override bool IsNull(object o) { return GetSByte(o) == _nullValue; }
+
+				public override object GetValue(object o)
+				{
+					var value = MemberAccessor.GetSByte(o);
+					return value == _nullValue ? null : (object)value;
+				}
+			}
+		}
+
+		class Int16Mapper : MemberMapper
+		{
+			Int16 _nullValue;
+
+			public override bool IsNull (object o) { return false; }
+			public override void SetNull(object o) { MemberAccessor.SetInt16(o, _nullValue); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetInt16(
+					o,
+					value is Int16 ? (Int16)value :
+					value == null ? _nullValue : MappingSchema.ConvertToInt16(value));
+			}
+
+			public override void Init(MapMemberInfo mapMemberInfo)
+			{
+				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");
+
+				_nullValue = Convert.ToInt16(mapMemberInfo.NullValue);
+
+				base.Init(mapMemberInfo);
+			}
+
+			public class Nullable : Int16Mapper
+			{
+				public override bool IsNull(object o) { return GetInt16(o) == _nullValue; }
+
+				public override object GetValue(object o)
+				{
+					var value = MemberAccessor.GetInt16(o);
+					return value == _nullValue ? null : (object)value;
+				}
+			}
+		}
+
+		class Int32Mapper : MemberMapper
+		{
+			Int32 _nullValue;
+
+			public override bool IsNull (object o) { return false; }
+			public override void SetNull(object o) { MemberAccessor.SetInt32(o, _nullValue); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetInt32(
+					o,
+					value is Int32 ? (Int32)value :
+					value == null ? _nullValue : MappingSchema.ConvertToInt32(value));
+			}
+
+			public override void Init(MapMemberInfo mapMemberInfo)
+			{
+				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");
+
+				_nullValue = Convert.ToInt32(mapMemberInfo.NullValue);
+
+				base.Init(mapMemberInfo);
+			}
+
+			public class Nullable : Int32Mapper
+			{
+				public override bool IsNull(object o) { return GetInt32(o) == _nullValue; }
+
+				public override object GetValue(object o)
+				{
+					var value = MemberAccessor.GetInt32(o);
+					return value == _nullValue ? null : (object)value;
+				}
+			}
+		}
+
+		class Int64Mapper : MemberMapper
+		{
+			Int64 _nullValue;
+
+			public override bool IsNull (object o) { return false; }
+			public override void SetNull(object o) { MemberAccessor.SetInt64(o, _nullValue); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetInt64(
+					o,
+					value is Int64 ? (Int64)value :
+					value == null ? _nullValue : MappingSchema.ConvertToInt64(value));
+			}
+
+			public override void Init(MapMemberInfo mapMemberInfo)
+			{
+				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");
+
+				_nullValue = Convert.ToInt64(mapMemberInfo.NullValue);
+
+				base.Init(mapMemberInfo);
+			}
+
+			public class Nullable : Int64Mapper
+			{
+				public override bool IsNull(object o) { return GetInt64(o) == _nullValue; }
+
+				public override object GetValue(object o)
+				{
+					var value = MemberAccessor.GetInt64(o);
+					return value == _nullValue ? null : (object)value;
+				}
+			}
+		}
+
+		class ByteMapper : MemberMapper
+		{
+			Byte _nullValue;
+
+			public override bool IsNull (object o) { return false; }
+			public override void SetNull(object o) { MemberAccessor.SetByte(o, _nullValue); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetByte(
+					o,
+					value is Byte ? (Byte)value :
+					value == null ? _nullValue : MappingSchema.ConvertToByte(value));
+			}
+
+			public override void Init(MapMemberInfo mapMemberInfo)
+			{
+				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");
+
+				_nullValue = Convert.ToByte(mapMemberInfo.NullValue);
+
+				base.Init(mapMemberInfo);
+			}
+
+			public class Nullable : ByteMapper
+			{
+				public override bool IsNull(object o) { return GetByte(o) == _nullValue; }
+
+				public override object GetValue(object o)
+				{
+					var value = MemberAccessor.GetByte(o);
+					return value == _nullValue ? null : (object)value;
+				}
+			}
+		}
+
+		class UInt16Mapper : MemberMapper
+		{
+			UInt16 _nullValue;
+
+			public override bool IsNull (object o) { return false; }
+			public override void SetNull(object o) { MemberAccessor.SetUInt16(o, _nullValue); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetUInt16(
+					o,
+					value is UInt16 ? (UInt16)value :
+					value == null ? _nullValue : MappingSchema.ConvertToUInt16(value));
+			}
+
+			public override void Init(MapMemberInfo mapMemberInfo)
+			{
+				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");
+
+				_nullValue = Convert.ToUInt16(mapMemberInfo.NullValue);
+
+				base.Init(mapMemberInfo);
+			}
+
+			public class Nullable : UInt16Mapper
+			{
+				public override bool IsNull(object o) { return GetUInt16(o) == _nullValue; }
+
+				public override object GetValue(object o)
+				{
+					var value = MemberAccessor.GetUInt16(o);
+					return value == _nullValue ? null : (object)value;
+				}
+			}
+		}
+
+		class UInt32Mapper : MemberMapper
+		{
+			UInt32 _nullValue;
+
+			public override bool IsNull (object o) { return false; }
+			public override void SetNull(object o) { MemberAccessor.SetUInt32(o, _nullValue); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetUInt32(
+					o,
+					value is UInt32 ? (UInt32)value :
+					value == null ? _nullValue : MappingSchema.ConvertToUInt32(value));
+			}
+
+			public override void Init(MapMemberInfo mapMemberInfo)
+			{
+				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");
+
+				_nullValue = Convert.ToUInt32(mapMemberInfo.NullValue);
+
+				base.Init(mapMemberInfo);
+			}
+
+			public class Nullable : UInt32Mapper
+			{
+				public override bool IsNull(object o) { return GetUInt32(o) == _nullValue; }
+
+				public override object GetValue(object o)
+				{
+					var value = MemberAccessor.GetUInt32(o);
+					return value == _nullValue ? null : (object)value;
+				}
+			}
+		}
+
+		class UInt64Mapper : MemberMapper
+		{
+			UInt64 _nullValue;
+
+			public override bool IsNull (object o) { return false; }
+			public override void SetNull(object o) { MemberAccessor.SetUInt64(o, _nullValue); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetUInt64(
+					o,
+					value is UInt64 ? (UInt64)value :
+					value == null ? _nullValue : MappingSchema.ConvertToUInt64(value));
+			}
+
+			public override void Init(MapMemberInfo mapMemberInfo)
+			{
+				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");
+
+				_nullValue = Convert.ToUInt64(mapMemberInfo.NullValue);
+
+				base.Init(mapMemberInfo);
+			}
+
+			public class Nullable : UInt64Mapper
+			{
+				public override bool IsNull(object o) { return GetUInt64(o) == _nullValue; }
+
+				public override object GetValue(object o)
+				{
+					var value = MemberAccessor.GetUInt64(o);
+					return value == _nullValue ? null : (object)value;
+				}
+			}
+		}
+
+		class SingleMapper : MemberMapper
+		{
+			Single _nullValue;
+
+			public override bool IsNull (object o) { return false; }
+			public override void SetNull(object o) { MemberAccessor.SetSingle(o, _nullValue); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetSingle(
+					o,
+					value is Single ? (Single)value :
+					value == null ? _nullValue : MappingSchema.ConvertToSingle(value));
+			}
+
+			public override void Init(MapMemberInfo mapMemberInfo)
+			{
+				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");
+
+				_nullValue = Convert.ToSingle(mapMemberInfo.NullValue);
+
+				base.Init(mapMemberInfo);
+			}
+
+			public class Nullable : SingleMapper
+			{
+				public override bool IsNull(object o) { return GetSingle(o) == _nullValue; }
+
+				public override object GetValue(object o)
+				{
+					var value = MemberAccessor.GetSingle(o);
+					return value == _nullValue ? null : (object)value;
+				}
+			}
+		}
+
+		class DoubleMapper : MemberMapper
+		{
+			Double _nullValue;
+
+			public override bool IsNull (object o) { return false; }
+			public override void SetNull(object o) { MemberAccessor.SetDouble(o, _nullValue); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetDouble(
+					o,
+					value is Double ? (Double)value :
+					value == null ? _nullValue : MappingSchema.ConvertToDouble(value));
+			}
+
+			public override void Init(MapMemberInfo mapMemberInfo)
+			{
+				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");
+
+				_nullValue = Convert.ToDouble(mapMemberInfo.NullValue);
+
+				base.Init(mapMemberInfo);
+			}
+
+			public class Nullable : DoubleMapper
+			{
+				public override bool IsNull(object o) { return GetDouble(o) == _nullValue; }
+
+				public override object GetValue(object o)
+				{
+					var value = MemberAccessor.GetDouble(o);
+					return value == _nullValue ? null : (object)value;
+				}
+			}
+		}
+
+		class CharMapper : MemberMapper
+		{
+			Char _nullValue;
+
+			public override bool IsNull (object o) { return false; }
+			public override void SetNull(object o) { MemberAccessor.SetChar(o, _nullValue); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetChar(
+					o,
+					value is Char ? (Char)value :
+					value == null ? _nullValue : MappingSchema.ConvertToChar(value));
+			}
+
+			public override void Init(MapMemberInfo mapMemberInfo)
+			{
+				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");
+
+				_nullValue = Convert.ToChar(mapMemberInfo.NullValue);
+
+				base.Init(mapMemberInfo);
+			}
+
+			public class Nullable : CharMapper
+			{
+				public override bool IsNull(object o) { return GetChar(o) == _nullValue; }
+
+				public override object GetValue(object o)
+				{
+					var value = MemberAccessor.GetChar(o);
+					return value == _nullValue ? null : (object)value;
+				}
+			}
+		}
+
+		class BooleanMapper : MemberMapper
+		{
+			Boolean _nullValue;
+
+			public override bool IsNull (object o) { return false; }
+			public override void SetNull(object o) { MemberAccessor.SetBoolean(o, _nullValue); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetBoolean(
+					o,
+					value is Boolean ? (Boolean)value :
+					value == null ? _nullValue : MappingSchema.ConvertToBoolean(value));
+			}
+
+			public override void Init(MapMemberInfo mapMemberInfo)
+			{
+				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");
+
+				_nullValue = Convert.ToBoolean(mapMemberInfo.NullValue);
+
+				base.Init(mapMemberInfo);
+			}
+
+			public class Nullable : BooleanMapper
+			{
+				public override bool IsNull(object o) { return GetBoolean(o) == _nullValue; }
+
+				public override object GetValue(object o)
+				{
+					var value = MemberAccessor.GetBoolean(o);
+					return value == _nullValue ? null : (object)value;
+				}
+			}
+		}
+
+		class DateTimeMapper : MemberMapper
+		{
+			DateTime _nullValue;
+
+			public override bool IsNull (object o) { return false; }
+			public override void SetNull(object o) { MemberAccessor.SetDateTime(o, _nullValue); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetDateTime(
+					o,
+					value is DateTime ? (DateTime)value :
+					value == null ? _nullValue : MappingSchema.ConvertToDateTime(value));
+			}
+
+			public override void Init(MapMemberInfo mapMemberInfo)
+			{
+				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");
+
+				_nullValue = Convert.ToDateTime(mapMemberInfo.NullValue);
+
+				base.Init(mapMemberInfo);
+			}
+
+			public class Nullable : DateTimeMapper
+			{
+				public override bool IsNull(object o) { return GetDateTime(o) == _nullValue; }
+
+				public override object GetValue(object o)
+				{
+					var value = MemberAccessor.GetDateTime(o);
+					return value == _nullValue ? null : (object)value;
+				}
+			}
+		}
+
+		class DateTimeOffsetMapper : MemberMapper
+		{
+			DateTimeOffset _nullValue;
+
+			public override bool IsNull (object o) { return false; }
+			public override void SetNull(object o) { MemberAccessor.SetDateTimeOffset(o, _nullValue); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetDateTimeOffset(
+					o,
+					value is DateTimeOffset ? (DateTimeOffset)value :
+					value == null ? _nullValue : MappingSchema.ConvertToDateTimeOffset(value));
+			}
+
+			public override void Init(MapMemberInfo mapMemberInfo)
+			{
+				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");
+
+				_nullValue = Convert.ToDateTimeOffset(mapMemberInfo.NullValue);
+
+				base.Init(mapMemberInfo);
+			}
+
+			public class Nullable : DateTimeOffsetMapper
+			{
+				public override bool IsNull(object o) { return GetDateTimeOffset(o) == _nullValue; }
+
+				public override object GetValue(object o)
+				{
+					var value = MemberAccessor.GetDateTimeOffset(o);
+					return value == _nullValue ? null : (object)value;
+				}
+			}
+		}
+
+		class DecimalMapper : MemberMapper
+		{
+			Decimal _nullValue;
+
+			public override bool IsNull (object o) { return false; }
+			public override void SetNull(object o) { MemberAccessor.SetDecimal(o, _nullValue); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetDecimal(
+					o,
+					value is Decimal ? (Decimal)value :
+					value == null ? _nullValue : MappingSchema.ConvertToDecimal(value));
+			}
+
+			public override void Init(MapMemberInfo mapMemberInfo)
+			{
+				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");
+
+				_nullValue = Convert.ToDecimal(mapMemberInfo.NullValue);
+
+				base.Init(mapMemberInfo);
+			}
+
+			public class Nullable : DecimalMapper
+			{
+				public override bool IsNull(object o) { return GetDecimal(o) == _nullValue; }
+
+				public override object GetValue(object o)
+				{
+					var value = MemberAccessor.GetDecimal(o);
+					return value == _nullValue ? null : (object)value;
+				}
+			}
+		}
+
+		class GuidMapper : MemberMapper
+		{
+			Guid _nullValue;
+
+			public override bool IsNull (object o) { return false; }
+			public override void SetNull(object o) { MemberAccessor.SetGuid(o, _nullValue); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetGuid(
+					o,
+					value is Guid ? (Guid)value :
+					value == null ? _nullValue : MappingSchema.ConvertToGuid(value));
+			}
+
+			public override void Init(MapMemberInfo mapMemberInfo)
+			{
+				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");
+
+				if (mapMemberInfo.NullValue != null)
+					_nullValue = mapMemberInfo.NullValue is Guid ?
+						(Guid)mapMemberInfo.NullValue : new Guid(mapMemberInfo.NullValue.ToString());
+
+				base.Init(mapMemberInfo);
+			}
+
+			public class Nullable : GuidMapper
+			{
+				public override bool IsNull(object o) { return GetGuid(o) == _nullValue; }
+
+				public override object GetValue(object o)
+				{
+					var value = MemberAccessor.GetGuid(o);
+					return value == _nullValue ? null : (object)value;
+				}
+			}
+		}
+
+		class StreamMapper : MemberMapper
+		{
+			Stream _nullValue;
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetValue(
+					o,
+					value is Stream ? value :
+					value == null ? _nullValue : MappingSchema.ConvertToStream(value));
+			}
+
+			public override void Init(MapMemberInfo mapMemberInfo)
+			{
+				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");
+
+				if (mapMemberInfo.NullValue != null)
+					_nullValue = mapMemberInfo.MappingSchema.ConvertToStream(mapMemberInfo.NullValue);
+
+				base.Init(mapMemberInfo);
+			}
+
+			public class Nullable : StreamMapper
+			{
+				public override object GetValue(object o)
+				{
+					var value = MemberAccessor.GetValue(o);
+					return value == _nullValue ? null : (object)value;
+				}
+			}
+		}
+
+		class NullableSByteMapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetNullableSByte(o) == null; }
+			public override void SetNull(object o) { MemberAccessor.SetNullableSByte(o, null); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetNullableSByte(
+					o, value == null || value is SByte? (SByte?)value: MappingSchema.ConvertToNullableSByte(value));
+			}
+
+			public class Enum : NullableEnumMapper
+			{
+				public override void SetValue(object o, object value)
+				{
+					if (value != null)
+					{
+						var valueType = value.GetType();
+						
+						if (valueType != MemberType)
+						{
+							if (valueType != UnderlyingType)
+								value = MappingSchema.ConvertToNullableSByte(value);
+
+							value = System.Enum.ToObject(MemberType, (SByte)value);
+						}
+					}
+
+					MemberAccessor.SetValue(o, value);
+				}
+			}
+		}
+
+		class NullableInt16Mapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetNullableInt16(o) == null; }
+			public override void SetNull(object o) { MemberAccessor.SetNullableInt16(o, null); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetNullableInt16(
+					o, value == null || value is Int16? (Int16?)value: MappingSchema.ConvertToNullableInt16(value));
+			}
+
+			public class Enum : NullableEnumMapper
+			{
+				public override void SetValue(object o, object value)
+				{
+					if (value != null)
+					{
+						var valueType = value.GetType();
+						
+						if (valueType != MemberType)
+						{
+							if (valueType != UnderlyingType)
+								value = MappingSchema.ConvertToNullableInt16(value);
+
+							value = System.Enum.ToObject(MemberType, (Int16)value);
+						}
+					}
+
+					MemberAccessor.SetValue(o, value);
+				}
+			}
+		}
+
+		class NullableInt32Mapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetNullableInt32(o) == null; }
+			public override void SetNull(object o) { MemberAccessor.SetNullableInt32(o, null); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetNullableInt32(
+					o, value == null || value is Int32? (Int32?)value: MappingSchema.ConvertToNullableInt32(value));
+			}
+
+			public class Enum : NullableEnumMapper
+			{
+				public override void SetValue(object o, object value)
+				{
+					if (value != null)
+					{
+						var valueType = value.GetType();
+						
+						if (valueType != MemberType)
+						{
+							if (valueType != UnderlyingType)
+								value = MappingSchema.ConvertToNullableInt32(value);
+
+							value = System.Enum.ToObject(MemberType, (Int32)value);
+						}
+					}
+
+					MemberAccessor.SetValue(o, value);
+				}
+			}
+		}
+
+		class NullableInt64Mapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetNullableInt64(o) == null; }
+			public override void SetNull(object o) { MemberAccessor.SetNullableInt64(o, null); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetNullableInt64(
+					o, value == null || value is Int64? (Int64?)value: MappingSchema.ConvertToNullableInt64(value));
+			}
+
+			public class Enum : NullableEnumMapper
+			{
+				public override void SetValue(object o, object value)
+				{
+					if (value != null)
+					{
+						var valueType = value.GetType();
+						
+						if (valueType != MemberType)
+						{
+							if (valueType != UnderlyingType)
+								value = MappingSchema.ConvertToNullableInt64(value);
+
+							value = System.Enum.ToObject(MemberType, (Int64)value);
+						}
+					}
+
+					MemberAccessor.SetValue(o, value);
+				}
+			}
+		}
+
+		class NullableByteMapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetNullableByte(o) == null; }
+			public override void SetNull(object o) { MemberAccessor.SetNullableByte(o, null); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetNullableByte(
+					o, value == null || value is Byte? (Byte?)value: MappingSchema.ConvertToNullableByte(value));
+			}
+
+			public class Enum : NullableEnumMapper
+			{
+				public override void SetValue(object o, object value)
+				{
+					if (value != null)
+					{
+						var valueType = value.GetType();
+						
+						if (valueType != MemberType)
+						{
+							if (valueType != UnderlyingType)
+								value = MappingSchema.ConvertToNullableByte(value);
+
+							value = System.Enum.ToObject(MemberType, (Byte)value);
+						}
+					}
+
+					MemberAccessor.SetValue(o, value);
+				}
+			}
+		}
+
+		class NullableUInt16Mapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetNullableUInt16(o) == null; }
+			public override void SetNull(object o) { MemberAccessor.SetNullableUInt16(o, null); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetNullableUInt16(
+					o, value == null || value is UInt16? (UInt16?)value: MappingSchema.ConvertToNullableUInt16(value));
+			}
+
+			public class Enum : NullableEnumMapper
+			{
+				public override void SetValue(object o, object value)
+				{
+					if (value != null)
+					{
+						var valueType = value.GetType();
+						
+						if (valueType != MemberType)
+						{
+							if (valueType != UnderlyingType)
+								value = MappingSchema.ConvertToNullableUInt16(value);
+
+							value = System.Enum.ToObject(MemberType, (UInt16)value);
+						}
+					}
+
+					MemberAccessor.SetValue(o, value);
+				}
+			}
+		}
+
+		class NullableUInt32Mapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetNullableUInt32(o) == null; }
+			public override void SetNull(object o) { MemberAccessor.SetNullableUInt32(o, null); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetNullableUInt32(
+					o, value == null || value is UInt32? (UInt32?)value: MappingSchema.ConvertToNullableUInt32(value));
+			}
+
+			public class Enum : NullableEnumMapper
+			{
+				public override void SetValue(object o, object value)
+				{
+					if (value != null)
+					{
+						var valueType = value.GetType();
+						
+						if (valueType != MemberType)
+						{
+							if (valueType != UnderlyingType)
+								value = MappingSchema.ConvertToNullableUInt32(value);
+
+							value = System.Enum.ToObject(MemberType, (UInt32)value);
+						}
+					}
+
+					MemberAccessor.SetValue(o, value);
+				}
+			}
+		}
+
+		class NullableUInt64Mapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetNullableUInt64(o) == null; }
+			public override void SetNull(object o) { MemberAccessor.SetNullableUInt64(o, null); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetNullableUInt64(
+					o, value == null || value is UInt64? (UInt64?)value: MappingSchema.ConvertToNullableUInt64(value));
+			}
+
+			public class Enum : NullableEnumMapper
+			{
+				public override void SetValue(object o, object value)
+				{
+					if (value != null)
+					{
+						var valueType = value.GetType();
+						
+						if (valueType != MemberType)
+						{
+							if (valueType != UnderlyingType)
+								value = MappingSchema.ConvertToNullableUInt64(value);
+
+							value = System.Enum.ToObject(MemberType, (UInt64)value);
+						}
+					}
+
+					MemberAccessor.SetValue(o, value);
+				}
+			}
+		}
+
+		class NullableCharMapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetNullableChar(o) == null; }
+			public override void SetNull(object o) { MemberAccessor.SetNullableChar(o, null); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetNullableChar(
+					o, value == null || value is Char? (Char?)value: MappingSchema.ConvertToNullableChar(value));
+			}
+		}
+
+		class NullableDoubleMapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetNullableDouble(o) == null; }
+			public override void SetNull(object o) { MemberAccessor.SetNullableDouble(o, null); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetNullableDouble(
+					o, value == null || value is Double? (Double?)value: MappingSchema.ConvertToNullableDouble(value));
+			}
+		}
+
+		class NullableSingleMapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetNullableSingle(o) == null; }
+			public override void SetNull(object o) { MemberAccessor.SetNullableSingle(o, null); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetNullableSingle(
+					o, value == null || value is Single? (Single?)value: MappingSchema.ConvertToNullableSingle(value));
+			}
+		}
+
+		class NullableBooleanMapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetNullableBoolean(o) == null; }
+			public override void SetNull(object o) { MemberAccessor.SetNullableBoolean(o, null); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetNullableBoolean(
+					o, value == null || value is Boolean? (Boolean?)value: MappingSchema.ConvertToNullableBoolean(value));
+			}
+		}
+
+		class NullableDateTimeMapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetNullableDateTime(o) == null; }
+			public override void SetNull(object o) { MemberAccessor.SetNullableDateTime(o, null); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetNullableDateTime(
+					o, value == null || value is DateTime? (DateTime?)value: MappingSchema.ConvertToNullableDateTime(value));
+			}
+		}
+
+		class NullableDecimalMapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetNullableDecimal(o) == null; }
+			public override void SetNull(object o) { MemberAccessor.SetNullableDecimal(o, null); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetNullableDecimal(
+					o, value == null || value is Decimal? (Decimal?)value: MappingSchema.ConvertToNullableDecimal(value));
+			}
+		}
+
+		class NullableGuidMapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetNullableGuid(o) == null; }
+			public override void SetNull(object o) { MemberAccessor.SetNullableGuid(o, null); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetNullableGuid(
+					o, value == null || value is Guid? (Guid?)value: MappingSchema.ConvertToNullableGuid(value));
+			}
+		}
+
+#if !SILVERLIGHT
+
+		class XmlReaderMapper : MemberMapper
+		{
+			XmlReader _nullValue;
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetValue(
+					o,
+					value is XmlReader ? value :
+					value == null ? _nullValue : MappingSchema.ConvertToXmlReader(value));
+			}
+
+			public override void Init(MapMemberInfo mapMemberInfo)
+			{
+				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");
+
+				if (mapMemberInfo.NullValue != null)
+					_nullValue = mapMemberInfo.MappingSchema.ConvertToXmlReader(mapMemberInfo.NullValue);
+
+				base.Init(mapMemberInfo);
+			}
+
+			public class Nullable : XmlReaderMapper
+			{
+				public override object GetValue(object o)
+				{
+					var value = MemberAccessor.GetValue(o);
+					return value == _nullValue ? null : (object)value;
+				}
+			}
+		}
+
+		class XmlDocumentMapper : MemberMapper
+		{
+			XmlDocument _nullValue;
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetValue(
+					o,
+					value is XmlDocument ? value :
+					value == null ? _nullValue : MappingSchema.ConvertToXmlDocument(value));
+			}
+
+			public override void Init(MapMemberInfo mapMemberInfo)
+			{
+				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");
+
+				if (mapMemberInfo.NullValue != null)
+					_nullValue = mapMemberInfo.MappingSchema.ConvertToXmlDocument(mapMemberInfo.NullValue);
+
+				base.Init(mapMemberInfo);
+			}
+
+			public class Nullable : XmlDocumentMapper
+			{
+				public override object GetValue(object o)
+				{
+					var value = MemberAccessor.GetValue(o);
+					return value == _nullValue ? null : (object)value;
+				}
+			}
+		}
+
+        class XElementMapper : MemberMapper
+        {
+            XElement _nullValue;
+
+            public override void SetValue(object o, object value)
+            {
+                MemberAccessor.SetValue(
+                    o,
+                    value is XElement ? value :
+                    value == null ? _nullValue : MappingSchema.ConvertToXElement(value));
+            }
+
+            public override void Init(MapMemberInfo mapMemberInfo)
+            {
+                if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");
+
+                if (mapMemberInfo.NullValue != null)
+                    _nullValue = mapMemberInfo.MappingSchema.ConvertToXElement(mapMemberInfo.NullValue);
+
+                base.Init(mapMemberInfo);
+            }
+
+            public class Nullable : XElementMapper
+            {
+                public override object GetValue(object o)
+                {
+                    var value = MemberAccessor.GetValue(o);
+                    return value == _nullValue ? null : (object)value;
+                }
+            }
+        }
+
+		class SqlByteMapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetSqlByte(o).IsNull; }
+			public override void SetNull(object o) { MemberAccessor.SetSqlByte(o, SqlByte.Null); }
+
+			public override object GetValue(object o)
+			{
+				var value = MemberAccessor.GetSqlByte(o);
+				return value.IsNull? null: (object)value.Value;
+			}
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetSqlByte(
+					o, value is SqlByte? (SqlByte)value: MappingSchema.ConvertToSqlByte(value));
+			}
+
+			public class Default : SqlByteMapper
+			{
+				public override bool SupportsValue { get { return false; } }
+
+				public override object GetValue(object o)
+				{
+					return MapTo(base.GetValue(o));
+				}
+
+				public override void SetValue(object o, object value)
+				{
+					base.SetValue(o, MapFrom(value));
+				}
+			}
+		}
+
+		class SqlInt16Mapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetSqlInt16(o).IsNull; }
+			public override void SetNull(object o) { MemberAccessor.SetSqlInt16(o, SqlInt16.Null); }
+
+			public override object GetValue(object o)
+			{
+				var value = MemberAccessor.GetSqlInt16(o);
+				return value.IsNull? null: (object)value.Value;
+			}
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetSqlInt16(
+					o, value is SqlInt16? (SqlInt16)value: MappingSchema.ConvertToSqlInt16(value));
+			}
+
+			public class Default : SqlInt16Mapper
+			{
+				public override bool SupportsValue { get { return false; } }
+
+				public override object GetValue(object o)
+				{
+					return MapTo(base.GetValue(o));
+				}
+
+				public override void SetValue(object o, object value)
+				{
+					base.SetValue(o, MapFrom(value));
+				}
+			}
+		}
+
+		class SqlInt32Mapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetSqlInt32(o).IsNull; }
+			public override void SetNull(object o) { MemberAccessor.SetSqlInt32(o, SqlInt32.Null); }
+
+			public override object GetValue(object o)
+			{
+				var value = MemberAccessor.GetSqlInt32(o);
+				return value.IsNull? null: (object)value.Value;
+			}
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetSqlInt32(
+					o, value is SqlInt32? (SqlInt32)value: MappingSchema.ConvertToSqlInt32(value));
+			}
+
+			public class Default : SqlInt32Mapper
+			{
+				public override bool SupportsValue { get { return false; } }
+
+				public override object GetValue(object o)
+				{
+					return MapTo(base.GetValue(o));
+				}
+
+				public override void SetValue(object o, object value)
+				{
+					base.SetValue(o, MapFrom(value));
+				}
+			}
+		}
+
+		class SqlInt64Mapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetSqlInt64(o).IsNull; }
+			public override void SetNull(object o) { MemberAccessor.SetSqlInt64(o, SqlInt64.Null); }
+
+			public override object GetValue(object o)
+			{
+				var value = MemberAccessor.GetSqlInt64(o);
+				return value.IsNull? null: (object)value.Value;
+			}
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetSqlInt64(
+					o, value is SqlInt64? (SqlInt64)value: MappingSchema.ConvertToSqlInt64(value));
+			}
+
+			public class Default : SqlInt64Mapper
+			{
+				public override bool SupportsValue { get { return false; } }
+
+				public override object GetValue(object o)
+				{
+					return MapTo(base.GetValue(o));
+				}
+
+				public override void SetValue(object o, object value)
+				{
+					base.SetValue(o, MapFrom(value));
+				}
+			}
+		}
+
+		class SqlSingleMapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetSqlSingle(o).IsNull; }
+			public override void SetNull(object o) { MemberAccessor.SetSqlSingle(o, SqlSingle.Null); }
+
+			public override object GetValue(object o)
+			{
+				var value = MemberAccessor.GetSqlSingle(o);
+				return value.IsNull? null: (object)value.Value;
+			}
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetSqlSingle(
+					o, value is SqlSingle? (SqlSingle)value: MappingSchema.ConvertToSqlSingle(value));
+			}
+
+			public class Default : SqlSingleMapper
+			{
+				public override bool SupportsValue { get { return false; } }
+
+				public override object GetValue(object o)
+				{
+					return MapTo(base.GetValue(o));
+				}
+
+				public override void SetValue(object o, object value)
+				{
+					base.SetValue(o, MapFrom(value));
+				}
+			}
+		}
+
+		class SqlBooleanMapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetSqlBoolean(o).IsNull; }
+			public override void SetNull(object o) { MemberAccessor.SetSqlBoolean(o, SqlBoolean.Null); }
+
+			public override object GetValue(object o)
+			{
+				var value = MemberAccessor.GetSqlBoolean(o);
+				return value.IsNull? null: (object)value.Value;
+			}
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetSqlBoolean(
+					o, value is SqlBoolean? (SqlBoolean)value: MappingSchema.ConvertToSqlBoolean(value));
+			}
+
+			public class Default : SqlBooleanMapper
+			{
+				public override bool SupportsValue { get { return false; } }
+
+				public override object GetValue(object o)
+				{
+					return MapTo(base.GetValue(o));
+				}
+
+				public override void SetValue(object o, object value)
+				{
+					base.SetValue(o, MapFrom(value));
+				}
+			}
+		}
+
+		class SqlDoubleMapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetSqlDouble(o).IsNull; }
+			public override void SetNull(object o) { MemberAccessor.SetSqlDouble(o, SqlDouble.Null); }
+
+			public override object GetValue(object o)
+			{
+				var value = MemberAccessor.GetSqlDouble(o);
+				return value.IsNull? null: (object)value.Value;
+			}
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetSqlDouble(
+					o, value is SqlDouble? (SqlDouble)value: MappingSchema.ConvertToSqlDouble(value));
+			}
+
+			public class Default : SqlDoubleMapper
+			{
+				public override bool SupportsValue { get { return false; } }
+
+				public override object GetValue(object o)
+				{
+					return MapTo(base.GetValue(o));
+				}
+
+				public override void SetValue(object o, object value)
+				{
+					base.SetValue(o, MapFrom(value));
+				}
+			}
+		}
+
+		class SqlDateTimeMapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetSqlDateTime(o).IsNull; }
+			public override void SetNull(object o) { MemberAccessor.SetSqlDateTime(o, SqlDateTime.Null); }
+
+			public override object GetValue(object o)
+			{
+				var value = MemberAccessor.GetSqlDateTime(o);
+				return value.IsNull? null: (object)value.Value;
+			}
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetSqlDateTime(
+					o, value is SqlDateTime? (SqlDateTime)value: MappingSchema.ConvertToSqlDateTime(value));
+			}
+
+			public class Default : SqlDateTimeMapper
+			{
+				public override bool SupportsValue { get { return false; } }
+
+				public override object GetValue(object o)
+				{
+					return MapTo(base.GetValue(o));
+				}
+
+				public override void SetValue(object o, object value)
+				{
+					base.SetValue(o, MapFrom(value));
+				}
+			}
+		}
+
+		class SqlDecimalMapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetSqlDecimal(o).IsNull; }
+			public override void SetNull(object o) { MemberAccessor.SetSqlDecimal(o, SqlDecimal.Null); }
+
+			public override object GetValue(object o)
+			{
+				var value = MemberAccessor.GetSqlDecimal(o);
+				return value.IsNull? null: (object)value.Value;
+			}
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetSqlDecimal(
+					o, value is SqlDecimal? (SqlDecimal)value: MappingSchema.ConvertToSqlDecimal(value));
+			}
+
+			public class Default : SqlDecimalMapper
+			{
+				public override bool SupportsValue { get { return false; } }
+
+				public override object GetValue(object o)
+				{
+					return MapTo(base.GetValue(o));
+				}
+
+				public override void SetValue(object o, object value)
+				{
+					base.SetValue(o, MapFrom(value));
+				}
+			}
+		}
+
+		class SqlMoneyMapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetSqlMoney(o).IsNull; }
+			public override void SetNull(object o) { MemberAccessor.SetSqlMoney(o, SqlMoney.Null); }
+
+			public override object GetValue(object o)
+			{
+				var value = MemberAccessor.GetSqlMoney(o);
+				return value.IsNull? null: (object)value.Value;
+			}
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetSqlMoney(
+					o, value is SqlMoney? (SqlMoney)value: MappingSchema.ConvertToSqlMoney(value));
+			}
+
+			public class Default : SqlMoneyMapper
+			{
+				public override bool SupportsValue { get { return false; } }
+
+				public override object GetValue(object o)
+				{
+					return MapTo(base.GetValue(o));
+				}
+
+				public override void SetValue(object o, object value)
+				{
+					base.SetValue(o, MapFrom(value));
+				}
+			}
+		}
+
+		class SqlGuidMapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetSqlGuid(o).IsNull; }
+			public override void SetNull(object o) { MemberAccessor.SetSqlGuid(o, SqlGuid.Null); }
+
+			public override object GetValue(object o)
+			{
+				var value = MemberAccessor.GetSqlGuid(o);
+				return value.IsNull? null: (object)value.Value;
+			}
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetSqlGuid(
+					o, value is SqlGuid? (SqlGuid)value: MappingSchema.ConvertToSqlGuid(value));
+			}
+
+			public class Default : SqlGuidMapper
+			{
+				public override bool SupportsValue { get { return false; } }
+
+				public override object GetValue(object o)
+				{
+					return MapTo(base.GetValue(o));
+				}
+
+				public override void SetValue(object o, object value)
+				{
+					base.SetValue(o, MapFrom(value));
+				}
+			}
+		}
+
+		class SqlStringMapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetSqlString(o).IsNull; }
+			public override void SetNull(object o) { MemberAccessor.SetSqlString(o, SqlString.Null); }
+
+			public override object GetValue(object o)
+			{
+				var value = MemberAccessor.GetSqlString(o);
+				return value.IsNull? null: (object)value.Value;
+			}
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetSqlString(
+					o, value is SqlString? (SqlString)value: MappingSchema.ConvertToSqlString(value));
+			}
+
+			public class Default : SqlStringMapper
+			{
+				public override bool SupportsValue { get { return false; } }
+
+				public override object GetValue(object o)
+				{
+					return MapTo(base.GetValue(o));
+				}
+
+				public override void SetValue(object o, object value)
+				{
+					base.SetValue(o, MapFrom(value));
+				}
+			}
+		}
+
+#endif
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MemberMapper.tt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,254 @@
+<#@ template language="C#" debug="True" #>
+<#@ output extension="generated.cs" #>
+//---------------------------------------------------------------------------------------------------
+// <auto-generated>
+//    This code was generated by BLToolkit template for T4.
+//    Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
+// </auto-generated>
+//---------------------------------------------------------------------------------------------------
+using System;
+using System.Data.SqlTypes;
+using System.IO;
+using System.Xml;
+
+using Convert = BLToolkit.Common.Convert;
+
+namespace BLToolkit.Mapping
+{
+	public partial class MemberMapper
+	{
+<#
+		CreateMapper(SimpleMapper,
+			"SByte", "Int16",  "Int32",  "Int64",
+			"Byte",  "UInt16", "UInt32", "UInt64",
+			"Single", "Double", "Char", "Boolean",
+			"DateTime", "DateTimeOffset", "Decimal", "Guid", "Stream");
+		CreateMapper(EnumNullableMapper, "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "UInt64");
+		CreateMapper(NullableMapper,     "Char", "Double", "Single", "Boolean", "DateTime", "Decimal", "Guid");
+#>
+
+#if !SILVERLIGHT
+<#
+		CreateMapper(SimpleMapper,  "XmlReader", "XmlDocument");
+		CreateMapper(SqlTypeMapper, "Byte", "Int16", "Int32", "Int64", "Single", "Boolean", "Double", "DateTime", "Decimal", "Money", "Guid", "String");
+#>
+
+#endif
+	}
+}
+
+<#+
+void CreateMapper(Action<string> mapper, params string[] types)
+{
+	foreach (string t in types)
+		mapper(t);
+}
+
+void SimpleMapper(string type)
+{
+	string getset = type;
+	string cast   = "(" + type + ")";
+
+	switch (type)
+	{
+		case "Stream"      :
+		case "XmlReader"   :
+		case "XmlDocument" :
+			getset = "Value";
+			cast   = "";
+			break;
+	}
+
+#>
+
+		class <#= type #>Mapper : MemberMapper
+		{
+			<#= type #> _nullValue;
+<#+
+				switch (type)
+				{
+					case "Stream"      :
+					case "XmlReader"   :
+					case "XmlDocument" :
+						break;
+					default            :
+#>
+
+			public override bool IsNull (object o) { return false; }
+			public override void SetNull(object o) { MemberAccessor.Set<#= type #>(o, _nullValue); }
+<#+
+						break;
+				}
+#>
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.Set<#= getset #>(
+					o,
+					value is <#= type #> ? <#= cast #>value :
+					value == null ? _nullValue : MappingSchema.ConvertTo<#= type #>(value));
+			}
+
+			public override void Init(MapMemberInfo mapMemberInfo)
+			{
+				if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");
+<#+
+				switch (type)
+				{
+					case "Guid" :
+#>
+
+				if (mapMemberInfo.NullValue != null)
+					_nullValue = mapMemberInfo.NullValue is Guid ?
+						(Guid)mapMemberInfo.NullValue : new Guid(mapMemberInfo.NullValue.ToString());
+<#+
+						break;
+
+					case "Stream"      :
+					case "XmlReader"   :
+					case "XmlDocument" :
+#>
+
+				if (mapMemberInfo.NullValue != null)
+					_nullValue = mapMemberInfo.MappingSchema.ConvertTo<#= type #>(mapMemberInfo.NullValue);
+<#+
+						break;
+
+					default:
+#>
+
+				_nullValue = Convert.To<#= type #>(mapMemberInfo.NullValue);
+<#+
+
+						break;
+				}
+#>
+
+				base.Init(mapMemberInfo);
+			}
+
+			public class Nullable : <#= type #>Mapper
+			{
+<#+
+				switch (type)
+				{
+					case "Stream"      :
+					case "XmlReader"   :
+					case "XmlDocument" :
+						break;
+					default:
+#>
+				public override bool IsNull(object o) { return Get<#= type #>(o) == _nullValue; }
+
+<#+
+
+						break;
+				}
+#>
+				public override object GetValue(object o)
+				{
+					var value = MemberAccessor.Get<#= getset #>(o);
+					return value == _nullValue ? null : (object)value;
+				}
+			}
+		}
+<#+
+}
+
+void NullableMapper(string type)
+{
+#>
+
+		class Nullable<#= type #>Mapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetNullable<#= type #>(o) == null; }
+			public override void SetNull(object o) { MemberAccessor.SetNullable<#= type #>(o, null); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetNullable<#= type #>(
+					o, value == null || value is <#= type #>? (<#= type #>?)value: MappingSchema.ConvertToNullable<#= type #>(value));
+			}
+		}
+<#+
+}
+
+void EnumNullableMapper(string type)
+{
+#>
+
+		class Nullable<#= type #>Mapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetNullable<#= type #>(o) == null; }
+			public override void SetNull(object o) { MemberAccessor.SetNullable<#= type #>(o, null); }
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetNullable<#= type #>(
+					o, value == null || value is <#= type #>? (<#= type #>?)value: MappingSchema.ConvertToNullable<#= type #>(value));
+			}
+
+			public class Enum : NullableEnumMapper
+			{
+				public override void SetValue(object o, object value)
+				{
+					if (value != null)
+					{
+						var valueType = value.GetType();
+						
+						if (valueType != MemberType)
+						{
+							if (valueType != UnderlyingType)
+								value = MappingSchema.ConvertToNullable<#= type #>(value);
+
+							value = System.Enum.ToObject(MemberType, (<#= type #>)value);
+						}
+					}
+
+					MemberAccessor.SetValue(o, value);
+				}
+			}
+		}
+<#+
+}
+
+void SqlTypeMapper(string type)
+{
+#>
+
+		class Sql<#= type #>Mapper : MemberMapper
+		{
+			public override bool IsNull (object o) { return GetSql<#= type #>(o).IsNull; }
+			public override void SetNull(object o) { MemberAccessor.SetSql<#= type #>(o, Sql<#= type #>.Null); }
+
+			public override object GetValue(object o)
+			{
+				var value = MemberAccessor.GetSql<#= type #>(o);
+				return value.IsNull? null: (object)value.Value;
+			}
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetSql<#= type #>(
+					o, value is Sql<#= type #>? (Sql<#= type #>)value: MappingSchema.ConvertToSql<#= type #>(value));
+			}
+
+			public class Default : Sql<#= type #>Mapper
+			{
+				public override bool SupportsValue { get { return false; } }
+
+				public override object GetValue(object o)
+				{
+					return MapTo(base.GetValue(o));
+				}
+
+				public override void SetValue(object o, object value)
+				{
+					base.SetValue(o, MapFrom(value));
+				}
+			}
+		}
+<#+
+}
+
+#>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MemberMapperAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,52 @@
+using System;
+
+namespace BLToolkit.Mapping
+{
+	[AttributeUsage(
+		AttributeTargets.Class    | AttributeTargets.Interface | 
+		AttributeTargets.Property | AttributeTargets.Field,
+		AllowMultiple=true)]
+	public class MemberMapperAttribute : MapImplicitAttribute
+	{
+		public MemberMapperAttribute(Type memberMapperType)
+			: this(null, memberMapperType)
+		{
+		}
+
+		public MemberMapperAttribute(Type memberType, Type memberMapperType)
+		{
+			if (memberMapperType == null) throw new ArgumentNullException("memberMapperType");
+
+			_memberType       = memberType;
+			_memberMapperType = memberMapperType;
+		}
+
+		private readonly Type _memberType;
+		public           Type  MemberType
+		{
+			get { return _memberType; }
+		}
+
+		private readonly Type _memberMapperType;
+		public           Type  MemberMapperType
+		{
+			get { return _memberMapperType; }
+		}
+
+		public virtual MemberMapper MemberMapper
+		{
+			get
+			{
+				var mm = Activator.CreateInstance(_memberMapperType) as MemberMapper;
+
+				if (mm == null)
+					throw new ArgumentException(
+						string.Format("Type '{0}' is not MemberMapper.", _memberMapperType));
+
+				mm.IsExplicit = true;
+
+				return mm;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MemberMappers/BinarySerialisationMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,39 @@
+using System.IO;
+using System.Runtime.Serialization.Formatters.Binary;
+
+namespace BLToolkit.Mapping.MemberMappers
+{
+	public class BinarySerialisationMapper : MemberMapper
+	{
+		public override void SetValue(object o, object value)
+		{
+			if (value != null) this.MemberAccessor.SetValue(o, BinarydesSrialize((byte[])value));
+		}
+
+		public override object GetValue(object o)
+		{
+			return BinarySerialize(this.MemberAccessor.GetValue(o));
+		}
+
+		static byte[] BinarySerialize(object obj)
+		{
+			if (obj == null) return null;
+			MemoryStream memoryStream = new MemoryStream();
+			BinaryFormatter binaryFormatter = new BinaryFormatter();
+			binaryFormatter.Serialize(memoryStream, obj);
+			memoryStream.Flush();
+			memoryStream.Position = 0;
+			return memoryStream.ToArray();
+		}
+
+		static object BinarydesSrialize(byte[] data)
+		{
+			using (var stream = new MemoryStream(data))
+			{
+				var formatter = new BinaryFormatter();
+				stream.Seek(0, SeekOrigin.Begin);
+				return formatter.Deserialize(stream);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MemberMappers/BinarySerialisationToBase64StringMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,40 @@
+using System;
+using System.IO;
+using System.Runtime.Serialization.Formatters.Binary;
+
+namespace BLToolkit.Mapping.MemberMappers
+{
+	public class BinarySerialisationToBase64StringMapper : MemberMapper
+	{
+		public override void SetValue(object o, object value)
+		{
+			if (value != null) this.MemberAccessor.SetValue(o, BinarydeSerialize(Convert.FromBase64String(value.ToString())));                                
+		}
+
+		public override object GetValue(object o)
+		{
+			return Convert.ToBase64String(BinarySerialize(this.MemberAccessor.GetValue(o)));            
+		}
+
+		static byte[] BinarySerialize(object obj)
+		{
+			if (obj == null) return null;
+			MemoryStream memoryStream = new MemoryStream();
+			BinaryFormatter binaryFormatter = new BinaryFormatter();
+			binaryFormatter.Serialize(memoryStream, obj);
+			memoryStream.Flush();
+			memoryStream.Position = 0;
+			return memoryStream.ToArray();
+		}
+
+		static object BinarydeSerialize(byte[] data)
+		{
+			using (var stream = new MemoryStream(data))
+			{
+				var formatter = new BinaryFormatter();
+				stream.Seek(0, SeekOrigin.Begin);
+				return formatter.Deserialize(stream);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MemberMappers/JSONSerialisationMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,49 @@
+using System;
+using System.IO;
+using System.Runtime.Serialization.Json;
+using System.Text;
+
+namespace BLToolkit.Mapping.MemberMappers
+{
+	public class JSONSerialisationMapper : MemberMapper
+	{
+		public override void SetValue(object o, object value)
+		{
+			if (value != null) this.MemberAccessor.SetValue(o, Deserialize(value.ToString()));
+		}
+
+        public override object GetValue(object o)
+        {
+            return this.serialize(this.MemberAccessor.GetValue(o));
+        }
+
+        private string serialize(object obj)
+        {
+            if (obj == null) return null;
+
+			DataContractJsonSerializer ser = new DataContractJsonSerializer(this.Type);
+			MemoryStream ms = new MemoryStream();
+			ser.WriteObject(ms, obj);
+			string jsonString = Encoding.UTF8.GetString(ms.ToArray());
+			ms.Close();
+			return jsonString;   
+		}
+
+		object Deserialize(string txt)
+		{
+			object retVal = null;
+			if (string.IsNullOrEmpty(txt)) return null;
+
+			try
+			{
+				DataContractJsonSerializer ser = new DataContractJsonSerializer(this.Type);
+				MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(txt));
+				retVal = ser.ReadObject(ms);                
+			}
+			catch (Exception)
+			{
+			}
+			return retVal;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MemberMappers/TimeSpanBigIntMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,22 @@
+using System;
+using System.IO;
+using System.Runtime.Serialization.Formatters.Binary;
+
+namespace BLToolkit.Mapping.MemberMappers
+{
+    public class TimeSpanBigIntMapper : MemberMapper
+    {
+        public override void SetValue(object o, object value)
+        {
+            if (value != null) this.MemberAccessor.SetValue(o, new TimeSpan((long)value));                                
+        }
+
+        public override object GetValue(object o)
+        {
+            var val = this.MemberAccessor.GetValue(o);
+            if (val != null)
+                return ((TimeSpan) val).Ticks;
+            return null;                        
+        }                
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/MemberMappers/XMLSerialisationMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,58 @@
+using System;
+using System.IO;
+using System.Xml;
+using System.Xml.Serialization;
+
+namespace BLToolkit.Mapping.MemberMappers
+{
+	public class XMLSerialisationMapper : MemberMapper
+	{
+		public override void SetValue(object o, object value)
+		{
+			if (value != null) this.MemberAccessor.SetValue(o, this.Deserialize(value.ToString()));
+		}
+
+		public override object GetValue(object o)
+		{
+			return this.XmlSerialize(this.MemberAccessor.GetValue(o));
+		}
+
+		string XmlSerialize(object obj)
+		{
+			if (obj == null) return null;
+			XmlSerializer serializer = new XmlSerializer(this.Type);
+			MemoryStream ms = new MemoryStream();
+			XmlWriterSettings settings = new XmlWriterSettings();
+			settings.OmitXmlDeclaration = true;
+			settings.Indent = true;
+			XmlWriter writer = XmlWriter.Create(ms, settings);
+			XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
+			namespaces.Add(string.Empty, string.Empty);
+			serializer.Serialize(writer, obj, namespaces);
+			StreamReader r = new StreamReader(ms);
+			r.BaseStream.Seek(0, SeekOrigin.Begin);
+
+			return r.ReadToEnd();
+		}
+
+		object Deserialize(string txt)
+		{
+			object retVal = null;
+			if (string.IsNullOrEmpty(txt)) return null;
+
+			try
+			{
+				XmlSerializer ser = new XmlSerializer(this.Type);
+				StringReader stringReader = new StringReader(txt);
+				XmlTextReader xmlReader = new XmlTextReader(stringReader);
+				retVal = ser.Deserialize(xmlReader);
+				xmlReader.Close();
+				stringReader.Close();
+			}
+			catch (Exception)
+			{
+			}
+			return retVal;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/NotNullAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,13 @@
+using System;
+
+namespace BLToolkit.Mapping
+{
+	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
+	public sealed class NotNullAttribute : NullableAttribute
+	{
+		public NotNullAttribute()
+			: base(false)
+		{
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/NullDateTimeAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,27 @@
+using System;
+
+namespace BLToolkit.Mapping
+{
+	public class NullDateTimeAttribute : NullValueAttribute
+	{
+		public NullDateTimeAttribute()
+			: base(DateTime.MinValue)
+		{
+		}
+
+		public NullDateTimeAttribute(int year, int month, int day)
+			: base(new DateTime(year, month, day))
+		{
+		}
+
+		public NullDateTimeAttribute(int year, int month, int day, int hour, int minute, int second)
+			: base(new DateTime(year, month, day, hour, minute, second))
+		{
+		}
+
+		public NullDateTimeAttribute(int year, int month, int day, int hour, int minute, int second, int millisecond)
+			: base(new DateTime(year, month, day, hour, minute, second, millisecond))
+		{
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/NullDecimalAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,43 @@
+using System;
+
+namespace BLToolkit.Mapping
+{
+	public class NullDecimalAttribute : NullValueAttribute
+	{
+		public NullDecimalAttribute()
+			: base(0m)
+		{
+		}
+
+		public NullDecimalAttribute(decimal nullValue)
+			: base(nullValue)
+		{
+		}
+
+		public NullDecimalAttribute(double value)
+			: base(new Decimal(value))
+		{
+		}
+
+		public NullDecimalAttribute(int[] bits)
+			: base(new Decimal(bits))
+		{
+		}
+
+		public NullDecimalAttribute(long value)
+			: base(new Decimal(value))
+		{
+		}
+
+		[CLSCompliant(false)]
+		public NullDecimalAttribute(ulong value)
+			: base(new Decimal(value))
+		{
+		}
+
+		public NullDecimalAttribute(int lo, int mid, int hi, bool isNegative, byte scale)
+			: base(new Decimal(lo, mid, hi, isNegative, scale))
+		{
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/NullGuidAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,42 @@
+using System;
+
+namespace BLToolkit.Mapping
+{
+	public class NullGuidAttribute : NullValueAttribute
+	{
+		public NullGuidAttribute()
+			: base(Guid.Empty)
+		{
+		}
+
+		public NullGuidAttribute(byte[] b)
+			: base(new Guid(b))
+		{
+		}
+
+		public NullGuidAttribute(string g)
+			: base(new Guid(g))
+		{
+		}
+
+		public NullGuidAttribute(int a, short b, short c, byte[] d)
+			: base(new Guid(a, b, c, d))
+		{
+		}
+
+		public NullGuidAttribute(int a, short b, short c, byte d, byte e, byte f, byte g, byte h, byte i, byte j, byte k)
+			: base(new Guid(a, b, c, d, e, f, g, h, i, j, k))
+		{
+		}
+
+#if !SILVERLIGHT
+
+		[CLSCompliant(false)]
+		public NullGuidAttribute(uint a, ushort b, ushort c, byte d, byte e, byte f, byte g, byte h, byte i, byte j, byte k)
+			: base(new Guid(a, b, c, d, e, f, g, h, i, j, k))
+		{
+		}
+
+#endif
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/NullValueAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,41 @@
+using System;
+using System.Diagnostics.CodeAnalysis;
+
+namespace BLToolkit.Mapping
+{
+	[SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes")]
+	[AttributeUsage(
+		AttributeTargets.Class | AttributeTargets.Interface |
+		AttributeTargets.Property | AttributeTargets.Field | 
+		AttributeTargets.Enum,
+		AllowMultiple=true)]
+	public class NullValueAttribute : Attribute
+	{
+		public NullValueAttribute()
+		{
+		}
+
+		public NullValueAttribute(object value)
+		{
+			_value = value;
+		}
+
+		public NullValueAttribute(Type type, object value)
+		{
+			_type  = type;
+			_value = value;
+		}
+
+		private readonly object _value;
+		public           object  Value
+		{
+			get { return _value; }
+		}
+
+		private readonly Type _type;
+		public           Type  Type
+		{
+			get { return _type; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/NullableAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,35 @@
+using System;
+
+namespace BLToolkit.Mapping
+{
+	[AttributeUsage(
+		AttributeTargets.Property | AttributeTargets.Field |
+		AttributeTargets.Class | AttributeTargets.Interface)]
+	public class NullableAttribute : Attribute
+	{
+		public NullableAttribute()
+		{
+			IsNullable = true;
+		}
+
+		public NullableAttribute(bool isNullable)
+		{
+			IsNullable = isNullable;
+		}
+
+		public NullableAttribute(Type type)
+		{
+			Type       = type;
+			IsNullable = true;
+		}
+
+		public NullableAttribute(Type type, bool isNullable)
+		{
+			Type       = type;
+			IsNullable = isNullable;
+		}
+
+		public bool IsNullable { get; set; }
+		public Type Type       { get; private set; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/ObjectListMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,93 @@
+using System.Collections;
+
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Mapping
+{
+	public class ObjectListMapper : IMapDataSourceList, IMapDataDestinationList
+	{
+		public ObjectListMapper(IList list, ObjectMapper objectMapper)
+		{
+			_list   = list;
+			_mapper = objectMapper;
+		}
+
+		private readonly IList        _list;
+		private          ObjectMapper _mapper;
+		private          int          _currentItem;
+
+		#region IMapDataSourceList Members
+
+		void IMapDataSourceList.InitMapping(InitContext initContext)
+		{
+			initContext.DataSource = _mapper;
+		}
+
+		bool IMapDataSourceList.SetNextDataSource(InitContext initContext)
+		{
+			if (_currentItem >= _list.Count)
+				return false;
+
+			initContext.SourceObject = _list[_currentItem];
+			_currentItem++;
+
+			return true;
+		}
+
+		void IMapDataSourceList.EndMapping(InitContext initContext)
+		{
+		}
+
+		#endregion
+
+		#region IMapDataDestinationList Members
+
+		void IMapDataDestinationList.InitMapping(InitContext initContext)
+		{
+			ISupportMapping sm = _list as ISupportMapping;
+
+			if (sm != null)
+			{
+				sm.BeginMapping(initContext);
+
+				if (initContext.ObjectMapper != null && _mapper != initContext.ObjectMapper)
+					_mapper = initContext.ObjectMapper;
+			}
+		}
+
+		IMapDataDestination IMapDataDestinationList.GetDataDestination(InitContext initContext)
+		{
+			return _mapper;
+		}
+
+		private object _currentObject;
+
+		private void AddCurrent()
+		{
+			if (_currentObject != null)
+			{
+				_list.Add(_currentObject);
+				_currentObject = null;
+			}
+		}
+
+		object IMapDataDestinationList.GetNextObject(InitContext initContext)
+		{
+			AddCurrent();
+
+			return _currentObject = _mapper.CreateInstance(initContext);
+		}
+
+		void IMapDataDestinationList.EndMapping(InitContext initContext)
+		{
+			AddCurrent();
+
+			ISupportMapping sm = _list as ISupportMapping;
+
+			if (sm != null)
+				sm.EndMapping(initContext);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/ObjectMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,786 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Data.SqlTypes;
+using System.Diagnostics;
+using System.Diagnostics.CodeAnalysis;
+using System.Globalization;
+
+namespace BLToolkit.Mapping
+{
+	using DataAccess;
+	using Reflection;
+	using Reflection.Extension;
+	using Reflection.MetadataProvider;
+
+	[DebuggerDisplay("Type = {TypeAccessor.Type}, OriginalType = {TypeAccessor.OriginalType}")]
+	public class ObjectMapper : MapDataSourceDestinationBase, IEnumerable<MemberMapper>
+	{
+		#region Protected Members
+
+		protected virtual MemberMapper CreateMemberMapper(MapMemberInfo mapMemberInfo)
+		{
+			if (mapMemberInfo == null) throw new ArgumentNullException("mapMemberInfo");
+
+			MemberMapper mm = null;
+
+			var attr = mapMemberInfo.MemberAccessor.GetAttribute<MemberMapperAttribute>();
+
+			MemberExtension ext;
+
+			if (_extension != null && _extension.Members.TryGetValue(mapMemberInfo.MemberName,out ext))
+			{
+				AttributeExtensionCollection attrExt;
+
+				if (ext.Attributes.TryGetValue("MemberMapper", out attrExt))
+				{
+					attr = new MemberMapperAttribute((Type)attrExt[0].Values["MemberMapperType"]);
+				}
+			}
+
+			if (attr == null)
+			{
+				var attrs = TypeHelper.GetAttributes(mapMemberInfo.Type, typeof(MemberMapperAttribute));
+
+				foreach (MemberMapperAttribute a in attrs)
+				{
+					if (a.MemberType == null)
+					{
+						mm = a.MemberMapper;
+						break;
+					}
+				}
+			}
+			else
+				mm = attr.MemberMapper;
+
+			if (mm == null)
+			{
+				var attrs = TypeHelper.GetAttributes(
+					mapMemberInfo.MemberAccessor.MemberInfo.DeclaringType, typeof(MemberMapperAttribute));
+
+				foreach (MemberMapperAttribute a in attrs)
+				{
+					if (a.MemberType == mapMemberInfo.Type)
+					{
+						mm = a.MemberMapper;
+						break;
+					}
+				}
+			}
+
+			if (mm == null)
+				mm = MemberMapper.CreateMemberMapper(mapMemberInfo);
+
+			mm.Init(mapMemberInfo);
+
+			return mm;
+		}
+
+		[SuppressMessage("Microsoft.Performance", "CA1807:AvoidUnnecessaryStringCreation", MessageId = "stack1")]
+		protected virtual void Add(MemberMapper memberMapper)
+		{
+			if (memberMapper == null) throw new ArgumentNullException("memberMapper");
+
+			memberMapper.SetOrdinal(_members.Count);
+
+			_members           .Add(memberMapper);
+			_nameToMember      .Add(memberMapper.Name.ToLower(), memberMapper);
+			_memberNameToMember.Add(memberMapper.MemberName,     memberMapper);
+		}
+
+		protected virtual MetadataProviderBase CreateMetadataProvider()
+		{
+			return MetadataProviderBase.CreateProvider();
+		}
+
+		#endregion
+
+		#region Public Members
+
+		private readonly List<MemberMapper> _members = new List<MemberMapper>();
+		public  MemberMapper this[int index]
+		{
+			get { return _members[index]; }
+		}
+
+		readonly List<Association> _associations = new List<Association>();
+		public   List<Association>  Associations
+		{
+			get { return _associations; }
+		}
+
+		readonly List<InheritanceMappingAttribute> _inheritanceMapping = new List<InheritanceMappingAttribute>();
+		public   List<InheritanceMappingAttribute>  InheritanceMapping
+		{
+			get { return _inheritanceMapping; }
+		}
+
+		[CLSCompliant(false)]
+		protected TypeExtension _extension;
+		public  TypeExtension  Extension
+		{
+			get { return _extension;  }
+			set { _extension = value; }
+		}
+
+		private MetadataProviderBase _metadataProvider;
+		public  MetadataProviderBase  MetadataProvider
+		{
+			get { return _metadataProvider ?? (_metadataProvider = CreateMetadataProvider()); }
+			set { _metadataProvider = value; }
+		}
+
+		private string[] _fieldNames;
+		public  string[]  FieldNames
+		{
+			get
+			{
+				if (_fieldNames == null)
+				{
+					_fieldNames = new string[_members.Count];
+
+					for (var i = 0; i < _fieldNames.Length; i++)
+					{
+						_fieldNames[i] = _members[i].Name;
+					}
+				}
+
+				return _fieldNames;
+			}
+		}
+
+		private readonly Dictionary<string,MemberMapper> _nameToMember       = new Dictionary<string,MemberMapper>();
+		private readonly Dictionary<string,MemberMapper> _memberNameToMember = new Dictionary<string,MemberMapper>();
+		public  MemberMapper this[string name]
+		{
+			get
+			{
+				if (name == null) throw new ArgumentNullException("name");
+
+				lock (_nameToMember)
+				{
+					MemberMapper mm;
+
+					if (!_nameToMember.TryGetValue(name, out mm))
+					{
+						if (!_nameToMember.TryGetValue(name.ToLower(CultureInfo.CurrentCulture), out mm))
+						{
+							lock (_memberNameToMember)
+								if (_memberNameToMember.ContainsKey(name) || _memberNameToMember.ContainsKey(name.ToLower(CultureInfo.CurrentCulture)))
+									return null;
+
+							mm = GetComplexMapper(name, name);
+
+							if (mm != null)
+							{
+								if (_members.Contains(mm))
+								{
+									//throw new MappingException(string.Format(
+									//    "Wrong mapping field name: '{0}', type: '{1}'. Use field name '{2}' instead.",
+									//    name, _typeAccessor.OriginalType.Name, mm.Name));
+									return null;
+								}
+
+								Add(mm);
+							}
+						}
+						else
+							_nameToMember.Add(name, mm);
+					}
+
+					return mm;
+				}
+			}
+		}
+
+		public MemberMapper this[string name, bool byPropertyName]
+		{
+			get
+			{
+				MemberMapper mm;
+
+				if (byPropertyName)
+					lock (_memberNameToMember)
+						return _memberNameToMember.TryGetValue(name, out mm) ? mm : null;
+
+				return this[name];
+			}
+		}
+
+		public int GetOrdinal(string name, bool byPropertyName)
+		{
+			if (byPropertyName)
+			{
+				for (var i = 0; i < _members.Count; ++i)
+					if (_members[i].MemberName == name)
+						return i;
+
+				return -1;
+			}
+
+			return GetOrdinal(name);
+		}
+
+		[CLSCompliant(false)]
+		protected TypeAccessor _typeAccessor;
+		public  TypeAccessor  TypeAccessor
+		{
+			get { return _typeAccessor; }
+		}
+
+		private MappingSchema _mappingSchema;
+		public  MappingSchema  MappingSchema
+		{
+			get { return _mappingSchema; }
+		}
+
+		#endregion
+
+		#region Init Mapper
+
+		public virtual void Init(MappingSchema mappingSchema, Type type)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			_typeAccessor  = TypeAccessor.GetAccessor(type);
+			_mappingSchema = mappingSchema;
+			_extension     = TypeExtension.GetTypeExtension(_typeAccessor.OriginalType, mappingSchema.Extensions);
+
+			_inheritanceMapping.AddRange(GetInheritanceMapping());
+
+			foreach (MemberAccessor ma in _typeAccessor)
+			{
+				var a = GetAssociation(ma);
+
+				if (a != null)
+				{
+					_associations.Add(a);
+					continue;
+				}
+
+				if (GetMapIgnore(ma))
+					continue;
+
+			    var mapFieldAttr = GetMapField(ma); // ma.GetAttribute<MapFieldAttribute>();
+
+				if (mapFieldAttr == null || (mapFieldAttr.OrigName == null && mapFieldAttr.Format == null))
+				{
+					var mi = new MapMemberInfo();
+
+				    var dbTypeAttribute = GetDbType(ma); // ma.GetAttribute<DbTypeAttribute>();
+
+					if (dbTypeAttribute != null)
+					{
+						mi.DbType      = dbTypeAttribute.DbType;
+						mi.IsDbTypeSet = true;
+
+						if (dbTypeAttribute.Size != null)
+						{
+							mi.DbSize      = dbTypeAttribute.Size.Value;
+							mi.IsDbSizeSet = true;
+						}
+					}
+
+					mi.MemberAccessor             = ma;
+					mi.Type                       = ma.Type;
+					mi.MappingSchema              = mappingSchema;
+					mi.MemberExtension            = _extension[ma.Name];
+					mi.Name                       = GetFieldName   (ma);
+					mi.MemberName                 = ma.Name;
+					mi.Storage                    = GetFieldStorage(ma);
+					mi.IsInheritanceDiscriminator = GetInheritanceDiscriminator(ma);
+					mi.Trimmable                  = GetTrimmable   (ma);
+					mi.SqlIgnore                  = GetSqlIgnore   (ma);
+					mi.MapValues                  = GetMapValues   (ma);
+					mi.DefaultValue               = GetDefaultValue(ma);
+					mi.Nullable                   = GetNullable    (ma);
+					mi.NullValue                  = GetNullValue   (ma, mi.Nullable);
+
+					Add(CreateMemberMapper(mi));
+				}
+				else if (mapFieldAttr.OrigName != null)
+				{
+					EnsureMapper(mapFieldAttr.MapName, ma.Name + "." + mapFieldAttr.OrigName);
+				}
+				else //if (mapFieldAttr.Format != null)
+				{
+					foreach (MemberMapper inner in _mappingSchema.GetObjectMapper(ma.Type))
+						EnsureMapper(string.Format(mapFieldAttr.Format, inner.Name), ma.Name + "." + inner.MemberName);
+				}
+			}
+
+			foreach (var ae in _extension.Attributes["MapField"])
+			{
+				var mapName  = (string)ae["MapName"];
+				var origName = (string)ae["OrigName"];
+
+				if (mapName == null || origName == null)
+					throw new MappingException(string.Format(
+						"Type '{0}' has invalid  extension. MapField MapName='{1}' OrigName='{2}'.",
+							type.FullName, mapName, origName));
+
+				EnsureMapper(mapName, origName);
+			}
+
+			MetadataProvider.EnsureMapper(TypeAccessor, MappingSchema, EnsureMapper);
+		}
+
+		private MemberMapper EnsureMapper(string mapName, string origName)
+		{
+			var mm = this[mapName];
+
+			if (mm == null)
+			{
+				var name = mapName.ToLower();
+
+				foreach (var m in _members)
+				{
+					if (m.MemberAccessor.Name.ToLower() == name)
+					{
+						_nameToMember.Add(name, m);
+						return m;
+					}
+				}
+
+				mm = GetComplexMapper(mapName, origName);
+
+				if (mm != null)
+					Add(mm);
+			}
+
+			return mm;
+		}
+
+		private readonly Dictionary<string,MemberMapper> _nameToComplexMapper = new Dictionary<string,MemberMapper>();
+
+		[SuppressMessage("Microsoft.Performance", "CA1807:AvoidUnnecessaryStringCreation", MessageId = "stack0")]
+		[SuppressMessage("Microsoft.Performance", "CA1807:AvoidUnnecessaryStringCreation", MessageId = "origName")]
+		protected MemberMapper GetComplexMapper(string mapName, string origName)
+		{
+			if (origName == null) throw new ArgumentNullException("origName");
+
+			var name = origName.ToLower();
+			var idx  = origName.IndexOf('.');
+
+			lock (_nameToComplexMapper)
+			{
+				MemberMapper mm;
+
+				if (_nameToComplexMapper.TryGetValue(name, out mm))
+					return mm;
+
+				if (idx > 0)
+				{
+					name = name.Substring(0, idx);
+
+					foreach (MemberAccessor ma in TypeAccessor)
+					{
+						if (ma.Name.Length == name.Length && ma.Name.ToLower() == name)
+						{
+							var om = MappingSchema.GetObjectMapper(ma.Type);
+
+							if (om != null)
+							{
+								mm = om.GetComplexMapper(mapName, origName.Substring(idx + 1));
+
+								if (mm != null)
+								{
+									var mi = new MapMemberInfo
+									{
+										MemberAccessor        = ma,
+										ComplexMemberAccessor = mm.ComplexMemberAccessor,
+										Type                  = mm.Type,
+										MappingSchema         = MappingSchema,
+										Name                  = mapName,
+										MemberName            = origName
+									};
+
+									var mapper = new MemberMapper.ComplexMapper(mm);
+									var key    = origName.ToLower();
+
+									mapper.Init(mi);
+
+									if (_nameToComplexMapper.ContainsKey(key))
+										_nameToComplexMapper[key] = mapper;
+									else
+										_nameToComplexMapper.Add(key, mapper);
+
+									return mapper;
+								}
+							}
+
+							break;
+						}
+					}
+				}
+				else
+				{
+					foreach (var m in _members)
+						if (m.MemberAccessor.Name.Length == name.Length && m.MemberAccessor.Name.ToLower() == name)
+						{
+							if (_nameToComplexMapper.ContainsKey(name))
+								_nameToComplexMapper[name] = m;
+							else
+								_nameToComplexMapper.Add(name, m);
+
+							return m;
+						}
+				}
+
+				// Under some conditions, this way lead to memory leaks.
+				// In other hand, shaking mappers up every time lead to performance loss.
+				// So we cache failed requests.
+				// If this optimization is a memory leak for you, just comment out next line.
+				//
+				if (_nameToComplexMapper.ContainsKey(name))
+					_nameToComplexMapper[name] = null;
+				else
+					_nameToComplexMapper.Add(name, null);
+
+				return null;
+			}
+
+		}
+
+		private MapValue[] GetMapValues(MemberAccessor member)
+		{
+			bool isSet;
+
+			var values = MetadataProvider.GetMapValues(Extension, member, out isSet);
+
+			return isSet? values: _mappingSchema.GetMapValues(member.Type);
+		}
+
+		protected virtual object GetDefaultValue(MemberAccessor memberAccessor)
+		{
+			bool isSet;
+
+			var value = MetadataProvider.GetDefaultValue(MappingSchema, Extension, memberAccessor, out isSet);
+
+			return isSet? value: _mappingSchema.GetDefaultValue(memberAccessor.Type);
+		}
+
+		protected virtual bool GetNullable(MemberAccessor memberAccessor)
+		{
+			bool isSet;
+			return MetadataProvider.GetNullable(MappingSchema, Extension, memberAccessor, out isSet);
+		}
+
+		protected virtual bool GetLazyInstance(MemberAccessor memberAccessor)
+		{
+			bool isSet;
+			return MetadataProvider.GetLazyInstance(MappingSchema, Extension, memberAccessor, out isSet);
+		}
+
+		protected virtual bool GetMapIgnore(MemberAccessor memberAccessor)
+		{
+			bool isSet;
+			return MetadataProvider.GetMapIgnore(Extension, memberAccessor, out isSet);
+		}
+
+		protected virtual MapFieldAttribute GetMapField(MemberAccessor memberAccessor)
+		{
+			bool isSet;
+			return MetadataProvider.GetMapField(Extension, memberAccessor, out isSet);
+		}
+
+		[CLSCompliant(false)]
+		protected virtual DbTypeAttribute GetDbType(MemberAccessor memberAccessor)
+		{
+			bool isSet;
+			return MetadataProvider.GetDbType(Extension, memberAccessor, out isSet);
+		}
+
+		protected virtual PrimaryKeyAttribute GetPrimaryKey(MemberAccessor memberAccessor)
+		{
+			bool isSet;
+			return MetadataProvider.GetPrimaryKey(Extension, memberAccessor, out isSet);
+		}
+
+		protected virtual bool GetSqlIgnore(MemberAccessor memberAccessor)
+		{
+			bool isSet;
+			return MetadataProvider.GetSqlIgnore(Extension, memberAccessor, out isSet);
+		}
+
+		protected virtual string GetFieldName(MemberAccessor memberAccessor)
+		{
+			bool isSet;
+			return MetadataProvider.GetFieldName(Extension, memberAccessor, out isSet);
+		}
+
+		protected virtual string GetFieldStorage(MemberAccessor memberAccessor)
+		{
+			bool isSet;
+			return MetadataProvider.GetFieldStorage(Extension, memberAccessor, out isSet);
+		}
+
+		protected virtual bool GetInheritanceDiscriminator(MemberAccessor memberAccessor)
+		{
+			bool isSet;
+			return MetadataProvider.GetInheritanceDiscriminator(Extension, memberAccessor, out isSet);
+		}
+
+		protected virtual bool GetTrimmable(MemberAccessor memberAccessor)
+		{
+			bool isSet;
+			return MetadataProvider.GetTrimmable(Extension, memberAccessor, out isSet);
+		}
+
+		protected virtual object GetNullValue(MemberAccessor memberAccessor, bool isNullable)
+		{
+			if (isNullable)
+			{
+				bool isSet;
+				return MetadataProvider.GetNullValue(MappingSchema, Extension, memberAccessor, out isSet);
+			}
+
+			return MappingSchema.GetNullValue(memberAccessor.Type);
+		}
+
+		protected virtual Association GetAssociation(MemberAccessor memberAccessor)
+		{
+			return MetadataProvider.GetAssociation(Extension, memberAccessor);
+		}
+
+		protected virtual InheritanceMappingAttribute[] GetInheritanceMapping()
+		{
+			return MetadataProvider.GetInheritanceMapping(_typeAccessor.OriginalType, Extension);
+		}
+
+		#endregion
+
+		#region IObjectMappper Members
+
+		public virtual object CreateInstance()
+		{
+			return _typeAccessor.CreateInstanceEx();
+		}
+
+		public virtual object CreateInstance(InitContext context)
+		{
+			return _typeAccessor.CreateInstanceEx(context);
+		}
+
+		#endregion
+
+		#region IMapDataSource Members
+
+		public override int Count
+		{
+			get { return _members.Count; }
+		}
+
+		public override Type GetFieldType(int index)
+		{
+			return _members[index].Type;
+		}
+
+		public override string GetName(int index)
+		{
+			return _members[index].Name;
+		}
+
+		public override object GetValue(object o, int index)
+		{
+			return _members[index].GetValue(o);
+		}
+
+		public override object GetValue(object o, string name)
+		{
+			MemberMapper mm;
+
+			lock (_nameToMember)
+				if (!_nameToMember.TryGetValue(name, out mm))
+					mm = this[name];
+
+			return mm == null? null: mm.GetValue(o);
+		}
+
+		public override bool     IsNull     (object o, int index) { return this[index].IsNull(o);      }
+
+		public override bool     SupportsTypedValues(int index)   { return this[index].SupportsValue;  }
+
+		// Simple type getters.
+		//
+		[CLSCompliant(false)]
+		public override SByte    GetSByte   (object o, int index) { return this[index].GetSByte   (o); }
+		public override Int16    GetInt16   (object o, int index) { return this[index].GetInt16   (o); }
+		public override Int32    GetInt32   (object o, int index) { return this[index].GetInt32   (o); }
+		public override Int64    GetInt64   (object o, int index) { return this[index].GetInt64   (o); }
+
+		public override Byte     GetByte    (object o, int index) { return this[index].GetByte    (o); }
+		[CLSCompliant(false)]
+		public override UInt16   GetUInt16  (object o, int index) { return this[index].GetUInt16  (o); }
+		[CLSCompliant(false)]
+		public override UInt32   GetUInt32  (object o, int index) { return this[index].GetUInt32  (o); }
+		[CLSCompliant(false)]
+		public override UInt64   GetUInt64  (object o, int index) { return this[index].GetUInt64  (o); }
+
+		public override Boolean  GetBoolean (object o, int index) { return this[index].GetBoolean (o); }
+		public override Char     GetChar    (object o, int index) { return this[index].GetChar    (o); }
+		public override Single   GetSingle  (object o, int index) { return this[index].GetSingle  (o); }
+		public override Double   GetDouble  (object o, int index) { return this[index].GetDouble  (o); }
+		public override Decimal  GetDecimal (object o, int index) { return this[index].GetDecimal (o); }
+		public override Guid     GetGuid    (object o, int index) { return this[index].GetGuid    (o); }
+		public override DateTime GetDateTime(object o, int index) { return this[index].GetDateTime(o); }
+		public override DateTimeOffset GetDateTimeOffset(object o, int index) { return this[index].GetDateTimeOffset(o); }
+
+		// Nullable type getters.
+		//
+		[CLSCompliant(false)]
+		public override SByte?    GetNullableSByte   (object o, int index) { return this[index].GetNullableSByte   (o); }
+		public override Int16?    GetNullableInt16   (object o, int index) { return this[index].GetNullableInt16   (o); }
+		public override Int32?    GetNullableInt32   (object o, int index) { return this[index].GetNullableInt32   (o); }
+		public override Int64?    GetNullableInt64   (object o, int index) { return this[index].GetNullableInt64   (o); }
+
+		public override Byte?     GetNullableByte    (object o, int index) { return this[index].GetNullableByte    (o); }
+		[CLSCompliant(false)]
+		public override UInt16?   GetNullableUInt16  (object o, int index) { return this[index].GetNullableUInt16  (o); }
+		[CLSCompliant(false)]
+		public override UInt32?   GetNullableUInt32  (object o, int index) { return this[index].GetNullableUInt32  (o); }
+		[CLSCompliant(false)]
+		public override UInt64?   GetNullableUInt64  (object o, int index) { return this[index].GetNullableUInt64  (o); }
+
+		public override Boolean?  GetNullableBoolean (object o, int index) { return this[index].GetNullableBoolean (o); }
+		public override Char?     GetNullableChar    (object o, int index) { return this[index].GetNullableChar    (o); }
+		public override Single?   GetNullableSingle  (object o, int index) { return this[index].GetNullableSingle  (o); }
+		public override Double?   GetNullableDouble  (object o, int index) { return this[index].GetNullableDouble  (o); }
+		public override Decimal?  GetNullableDecimal (object o, int index) { return this[index].GetNullableDecimal (o); }
+		public override Guid?     GetNullableGuid    (object o, int index) { return this[index].GetNullableGuid    (o); }
+		public override DateTime? GetNullableDateTime(object o, int index) { return this[index].GetNullableDateTime(o); }
+		public override DateTimeOffset? GetNullableDateTimeOffset(object o, int index) { return this[index].GetNullableDateTimeOffset(o); }
+
+#if !SILVERLIGHT
+
+		// SQL type getters.
+		//
+		public override SqlByte     GetSqlByte    (object o, int index) { return this[index].GetSqlByte    (o); }
+		public override SqlInt16    GetSqlInt16   (object o, int index) { return this[index].GetSqlInt16   (o); }
+		public override SqlInt32    GetSqlInt32   (object o, int index) { return this[index].GetSqlInt32   (o); }
+		public override SqlInt64    GetSqlInt64   (object o, int index) { return this[index].GetSqlInt64   (o); }
+		public override SqlSingle   GetSqlSingle  (object o, int index) { return this[index].GetSqlSingle  (o); }
+		public override SqlBoolean  GetSqlBoolean (object o, int index) { return this[index].GetSqlBoolean (o); }
+		public override SqlDouble   GetSqlDouble  (object o, int index) { return this[index].GetSqlDouble  (o); }
+		public override SqlDateTime GetSqlDateTime(object o, int index) { return this[index].GetSqlDateTime(o); }
+		public override SqlDecimal  GetSqlDecimal (object o, int index) { return this[index].GetSqlDecimal (o); }
+		public override SqlMoney    GetSqlMoney   (object o, int index) { return this[index].GetSqlMoney   (o); }
+		public override SqlGuid     GetSqlGuid    (object o, int index) { return this[index].GetSqlGuid    (o); }
+		public override SqlString   GetSqlString  (object o, int index) { return this[index].GetSqlString  (o); }
+
+#endif
+
+		#endregion
+
+		#region IMapDataDestination Members
+
+		public override int GetOrdinal(string name)
+		{
+			MemberMapper mm;
+
+			lock (_nameToMember)
+				if (!_nameToMember.TryGetValue(name, out mm))
+					mm = this[name];
+
+			return mm == null? -1: mm.Ordinal;
+		}
+
+		public override void SetValue(object o, int index, object value)
+		{
+			_members[index].SetValue(o, value);
+		}
+
+		public override void SetValue(object o, string name, object value)
+		{
+			SetValue(o, GetOrdinal(name), value);
+		}
+
+		public override void SetNull    (object o, int index)                 { this[index].SetNull    (o); }
+
+		// Simple types setters.
+		//
+		[CLSCompliant(false)]
+		public override void SetSByte   (object o, int index, SByte    value) { this[index].SetSByte   (o, value); }
+		public override void SetInt16   (object o, int index, Int16    value) { this[index].SetInt16   (o, value); }
+		public override void SetInt32   (object o, int index, Int32    value) { this[index].SetInt32   (o, value); }
+		public override void SetInt64   (object o, int index, Int64    value) { this[index].SetInt64   (o, value); }
+
+		public override void SetByte    (object o, int index, Byte     value) { this[index].SetByte    (o, value); }
+		[CLSCompliant(false)]
+		public override void SetUInt16  (object o, int index, UInt16   value) { this[index].SetUInt16  (o, value); }
+		[CLSCompliant(false)]
+		public override void SetUInt32  (object o, int index, UInt32   value) { this[index].SetUInt32  (o, value); }
+		[CLSCompliant(false)]
+		public override void SetUInt64  (object o, int index, UInt64   value) { this[index].SetUInt64  (o, value); }
+
+		public override void SetBoolean (object o, int index, Boolean  value) { this[index].SetBoolean (o, value); }
+		public override void SetChar    (object o, int index, Char     value) { this[index].SetChar    (o, value); }
+		public override void SetSingle  (object o, int index, Single   value) { this[index].SetSingle  (o, value); }
+		public override void SetDouble  (object o, int index, Double   value) { this[index].SetDouble  (o, value); }
+		public override void SetDecimal (object o, int index, Decimal  value) { this[index].SetDecimal (o, value); }
+		public override void SetGuid    (object o, int index, Guid     value) { this[index].SetGuid    (o, value); }
+		public override void SetDateTime(object o, int index, DateTime value) { this[index].SetDateTime(o, value); }
+		public override void SetDateTimeOffset(object o, int index, DateTimeOffset value) { this[index].SetDateTimeOffset(o, value); }
+
+		// Simple types setters.
+		//
+		[CLSCompliant(false)]
+		public override void SetNullableSByte   (object o, int index, SByte?    value) { this[index].SetNullableSByte   (o, value); }
+		public override void SetNullableInt16   (object o, int index, Int16?    value) { this[index].SetNullableInt16   (o, value); }
+		public override void SetNullableInt32   (object o, int index, Int32?    value) { this[index].SetNullableInt32   (o, value); }
+		public override void SetNullableInt64   (object o, int index, Int64?    value) { this[index].SetNullableInt64   (o, value); }
+
+		public override void SetNullableByte    (object o, int index, Byte?     value) { this[index].SetNullableByte    (o, value); }
+		[CLSCompliant(false)]
+		public override void SetNullableUInt16  (object o, int index, UInt16?   value) { this[index].SetNullableUInt16  (o, value); }
+		[CLSCompliant(false)]
+		public override void SetNullableUInt32  (object o, int index, UInt32?   value) { this[index].SetNullableUInt32  (o, value); }
+		[CLSCompliant(false)]
+		public override void SetNullableUInt64  (object o, int index, UInt64?   value) { this[index].SetNullableUInt64  (o, value); }
+
+		public override void SetNullableBoolean (object o, int index, Boolean?  value) { this[index].SetNullableBoolean (o, value); }
+		public override void SetNullableChar    (object o, int index, Char?     value) { this[index].SetNullableChar    (o, value); }
+		public override void SetNullableSingle  (object o, int index, Single?   value) { this[index].SetNullableSingle  (o, value); }
+		public override void SetNullableDouble  (object o, int index, Double?   value) { this[index].SetNullableDouble  (o, value); }
+		public override void SetNullableDecimal (object o, int index, Decimal?  value) { this[index].SetNullableDecimal (o, value); }
+		public override void SetNullableGuid    (object o, int index, Guid?     value) { this[index].SetNullableGuid    (o, value); }
+		public override void SetNullableDateTime(object o, int index, DateTime? value) { this[index].SetNullableDateTime(o, value); }
+		public override void SetNullableDateTimeOffset(object o, int index, DateTimeOffset? value) { this[index].SetNullableDateTimeOffset(o, value); }
+
+#if !SILVERLIGHT
+
+		// SQL type setters.
+		//
+		public override void SetSqlByte    (object o, int index, SqlByte     value) { this[index].SetSqlByte    (o, value); }
+		public override void SetSqlInt16   (object o, int index, SqlInt16    value) { this[index].SetSqlInt16   (o, value); }
+		public override void SetSqlInt32   (object o, int index, SqlInt32    value) { this[index].SetSqlInt32   (o, value); }
+		public override void SetSqlInt64   (object o, int index, SqlInt64    value) { this[index].SetSqlInt64   (o, value); }
+		public override void SetSqlSingle  (object o, int index, SqlSingle   value) { this[index].SetSqlSingle  (o, value); }
+		public override void SetSqlBoolean (object o, int index, SqlBoolean  value) { this[index].SetSqlBoolean (o, value); }
+		public override void SetSqlDouble  (object o, int index, SqlDouble   value) { this[index].SetSqlDouble  (o, value); }
+		public override void SetSqlDateTime(object o, int index, SqlDateTime value) { this[index].SetSqlDateTime(o, value); }
+		public override void SetSqlDecimal (object o, int index, SqlDecimal  value) { this[index].SetSqlDecimal (o, value); }
+		public override void SetSqlMoney   (object o, int index, SqlMoney    value) { this[index].SetSqlMoney   (o, value); }
+		public override void SetSqlGuid    (object o, int index, SqlGuid     value) { this[index].SetSqlGuid    (o, value); }
+		public override void SetSqlString  (object o, int index, SqlString   value) { this[index].SetSqlString  (o, value); }
+
+#endif
+
+		#endregion
+
+		#region IEnumerable Members
+
+		public IEnumerator GetEnumerator()
+		{
+			return _members.GetEnumerator();
+		}
+
+		IEnumerator<MemberMapper> IEnumerable<MemberMapper>.GetEnumerator()
+		{
+			return _members.GetEnumerator();
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/ObjectMapperAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,25 @@
+using System;
+
+namespace BLToolkit.Mapping
+{
+	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface)]
+	public sealed class ObjectMapperAttribute : Attribute
+	{
+		public ObjectMapperAttribute(Type objectMapperType)
+		{
+			if (objectMapperType == null) throw new ArgumentNullException("objectMapperType");
+
+			_objectMapper = Activator.CreateInstance(objectMapperType) as ObjectMapper;
+
+			if (_objectMapper == null)
+				throw new ArgumentException(
+					string.Format("Type '{0}' does not implement IObjectMapper interface.", objectMapperType));
+		}
+
+		private readonly ObjectMapper _objectMapper;
+		public           ObjectMapper  ObjectMapper
+		{
+			get { return _objectMapper; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/ObjectMapperT.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,58 @@
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Mapping
+{
+	public static class ObjectMapper<T>
+	{
+		public static T CreateInstance()
+		{
+			return (T)_instance.CreateInstance();
+		}
+
+		public static T CreateInstance(InitContext context)
+		{
+			return (T)_instance.CreateInstance(context);
+		}
+
+		public static int Count
+		{
+			get { return _instance.Count; }
+		}
+
+		public static string GetName(int index)
+		{
+			return _instance.GetName(index);
+		}
+
+		public static object GetValue(T o, int index)
+		{
+			return _instance.GetValue(o, index);
+		}
+
+		public static object GetValue(T o, string name)
+		{
+			return _instance.GetValue(o, name);
+		}
+
+		public static int GetOrdinal(string name)
+		{
+			return _instance.GetOrdinal(name);
+		}
+
+		public static void SetValue(T o, int index, object value)
+		{
+			_instance.SetValue(o, index, value);
+		}
+
+		public static void SetValue(object o, string name, object value)
+		{
+			_instance.SetValue(o, name, value);
+		}
+
+		private static readonly ObjectMapper _instance = Map.GetObjectMapper(typeof(T));
+		public  static          ObjectMapper  Instance
+		{
+			get { return _instance; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/RelationAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,108 @@
+using System;
+using System.Collections.Generic;
+
+namespace BLToolkit.Mapping
+{
+
+	[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, Inherited = true, AllowMultiple = false)]
+	public sealed class RelationAttribute : Attribute
+	{
+		#region Constructors
+
+		public RelationAttribute()
+		{
+		}
+
+		public RelationAttribute(Type destination)
+		{
+			_destination = destination;
+		}
+
+		public RelationAttribute(string slaveIndex)
+		{
+			SlaveIndex1 = slaveIndex;
+		}
+
+		public RelationAttribute(string slaveIndex, string masterIndex)
+			: this(slaveIndex)
+		{
+			MasterIndex1 = masterIndex;
+		}
+
+		public RelationAttribute(Type destination, string slaveIndex)
+			: this(destination)
+		{
+			SlaveIndex1 = slaveIndex;
+		}
+
+		public RelationAttribute(Type destination, string slaveIndex, string masterIndex)
+			: this(destination)
+		{
+			SlaveIndex1 = slaveIndex;
+			MasterIndex1 = masterIndex;
+		}
+
+		#endregion
+
+		private Type _destination;
+		public  Type Destination { get { return _destination; } }
+
+		private string _masterIndex1;
+		public  string MasterIndex1 { get { return _masterIndex1; } set { _masterIndex1 = value; } }
+		
+		private string _masterIndex2;
+		public  string MasterIndex2 { get { return _masterIndex2; } set { _masterIndex2 = value; } }
+		
+		private string _masterIndex3;
+		public  string MasterIndex3 { get { return _masterIndex3; } set { _masterIndex3 = value; } }
+
+		private string _slaveIndex1;
+		public  string SlaveIndex1 { get { return _slaveIndex1; } set { _slaveIndex1 = value; } }
+		
+		private string _slaveIndex2;
+		public  string SlaveIndex2 { get { return _slaveIndex2; } set { _slaveIndex2 = value; } }
+		
+		private string _slaveIndex3;
+		public  string SlaveIndex3 { get { return _slaveIndex3; } set { _slaveIndex3 = value; } }
+
+		public MapIndex MasterIndex
+		{
+			get
+			{
+				List<String> index = new List<string>();
+
+				AddIndex(index, MasterIndex1);
+				AddIndex(index, MasterIndex2);
+				AddIndex(index, MasterIndex3);
+
+				if (index.Count == 0)
+					return null;
+
+				return new MapIndex(index.ToArray());
+			}
+		}
+
+		public MapIndex SlaveIndex
+		{
+			get
+			{
+				List<String> index = new List<string>();
+
+				AddIndex(index, SlaveIndex1);
+				AddIndex(index, SlaveIndex2);
+				AddIndex(index, SlaveIndex3);
+
+				if (index.Count == 0)
+					return null;
+
+				return new MapIndex(index.ToArray());
+			}
+		}
+
+		private void AddIndex(List<string> index, string field)
+		{
+			if (!string.IsNullOrEmpty(field))
+				index.Add(field);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/ScalarDataReaderMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,126 @@
+using System;
+using System.Data;
+
+using BLToolkit.Common;
+using System.Data.SqlTypes;
+
+namespace BLToolkit.Mapping
+{
+	public class ScalarDataReaderMapper : DataReaderMapper
+	{
+		public ScalarDataReaderMapper(
+			MappingSchema         mappingSchema,
+			IDataReader           dataReader,
+			NameOrIndexParameter  nameOrIndex)
+			: base(mappingSchema, dataReader)
+		{
+			_index = nameOrIndex.ByName? dataReader.GetOrdinal(nameOrIndex.Name): nameOrIndex.Index;
+		}
+
+		private readonly int _index;
+		public           int  Index
+		{
+			get { return _index; }
+		}
+
+		#region IMapDataSource Members
+
+		public override int Count
+		{
+			get { return 1; }
+		}
+
+		public override Type GetFieldType(int index)
+		{
+			return DataReader.GetFieldType(_index);
+		}
+
+		public override string GetName(int index)
+		{
+			return DataReader.GetName(_index);
+		}
+
+		public override object GetValue(object o, int index)
+		{
+			return base.GetValue(o, _index);
+		}
+
+		public override object GetValue(object o, string name)
+		{
+			return base.GetValue(o, _index);
+		}
+
+		public override bool     IsNull     (object o, int index) { return DataReader.IsDBNull(_index); }
+
+		// Simple type getters.
+		//
+		[CLSCompliant(false)]
+		public override SByte    GetSByte   (object o, int index) { return base.GetSByte(o, _index); }
+		public override Int16    GetInt16   (object o, int index) { return DataReader.GetInt16   (_index); }
+		public override Int32    GetInt32   (object o, int index) { return DataReader.GetInt32   (_index); }
+		public override Int64    GetInt64   (object o, int index) { return DataReader.GetInt64   (_index); }
+
+		public override Byte     GetByte    (object o, int index) { return DataReader.GetByte    (_index); }
+		[CLSCompliant(false)]
+		public override UInt16   GetUInt16  (object o, int index) { return base.GetUInt16(o, _index); }
+		[CLSCompliant(false)]
+		public override UInt32   GetUInt32  (object o, int index) { return base.GetUInt32(o, _index); }
+		[CLSCompliant(false)]
+		public override UInt64   GetUInt64  (object o, int index) { return base.GetUInt64(o, _index); }
+
+		public override Boolean  GetBoolean (object o, int index) { return DataReader.GetBoolean (_index); }
+		public override Char     GetChar    (object o, int index) { return DataReader.GetChar    (_index); }
+		public override Single   GetSingle  (object o, int index) { return DataReader.GetFloat   (_index); }
+		public override Double   GetDouble  (object o, int index) { return DataReader.GetDouble  (_index); }
+		public override Decimal  GetDecimal (object o, int index) { return DataReader.GetDecimal (_index); }
+		public override Guid     GetGuid    (object o, int index) { return DataReader.GetGuid    (_index); }
+		public override DateTime GetDateTime(object o, int index) { return DataReader.GetDateTime(_index); }
+		public override DateTimeOffset GetDateTimeOffset(object o, int index) { return (DateTimeOffset)DataReader.GetValue(_index); }
+
+		// Nullable type getters.
+		//
+		[CLSCompliant(false)]
+		public override SByte?    GetNullableSByte   (object o, int index) { return base.GetNullableSByte(o, _index); }
+		public override Int16?    GetNullableInt16   (object o, int index) { return DataReader.IsDBNull(_index)? null: (Int16?)DataReader.GetInt16   (_index); }
+		public override Int32?    GetNullableInt32   (object o, int index) { return DataReader.IsDBNull(_index)? null: (Int32?)DataReader.GetInt32   (_index); }
+		public override Int64?    GetNullableInt64   (object o, int index) { return DataReader.IsDBNull(_index)? null: (Int64?)DataReader.GetInt64   (_index); }
+
+		public override Byte?     GetNullableByte    (object o, int index) { return DataReader.IsDBNull(_index)? null: (Byte?) DataReader.GetByte    (_index); }
+		[CLSCompliant(false)]
+		public override UInt16?   GetNullableUInt16  (object o, int index) { return base.GetNullableUInt16(o, _index); }
+		[CLSCompliant(false)]
+		public override UInt32?   GetNullableUInt32  (object o, int index) { return base.GetNullableUInt32(o, _index); }
+		[CLSCompliant(false)]
+		public override UInt64?   GetNullableUInt64  (object o, int index) { return base.GetNullableUInt64(o, _index); }
+
+		public override Boolean?  GetNullableBoolean (object o, int index) { return DataReader.IsDBNull(_index)? null: (Boolean?) DataReader.GetBoolean (_index); }
+		public override Char?     GetNullableChar    (object o, int index) { return DataReader.IsDBNull(_index)? null: (Char?)    DataReader.GetChar    (_index); }
+		public override Single?   GetNullableSingle  (object o, int index) { return DataReader.IsDBNull(_index)? null: (Single?)  DataReader.GetFloat   (_index); }
+		public override Double?   GetNullableDouble  (object o, int index) { return DataReader.IsDBNull(_index)? null: (Double?)  DataReader.GetDouble  (_index); }
+		public override Decimal?  GetNullableDecimal (object o, int index) { return DataReader.IsDBNull(_index)? null: (Decimal?) DataReader.GetDecimal (_index); }
+		public override Guid?     GetNullableGuid    (object o, int index) { return DataReader.IsDBNull(_index)? null: (Guid?)    DataReader.GetGuid    (_index); }
+		public override DateTime? GetNullableDateTime(object o, int index) { return DataReader.IsDBNull(_index)? null: (DateTime?)DataReader.GetDateTime(_index); }
+		public override DateTimeOffset? GetNullableDateTimeOffset(object o, int index) { return DataReader.IsDBNull(_index)? null: (DateTimeOffset?)DataReader.GetValue(_index); }
+
+#if !SILVERLIGHT
+
+		// SQL type getters.
+		//
+		public override SqlByte     GetSqlByte    (object o, int index) { return DataReader.IsDBNull(_index)? SqlByte.    Null: DataReader.GetByte    (_index); }
+		public override SqlInt16    GetSqlInt16   (object o, int index) { return DataReader.IsDBNull(_index)? SqlInt16.   Null: DataReader.GetInt16   (_index); }
+		public override SqlInt32    GetSqlInt32   (object o, int index) { return DataReader.IsDBNull(_index)? SqlInt32.   Null: DataReader.GetInt32   (_index); }
+		public override SqlInt64    GetSqlInt64   (object o, int index) { return DataReader.IsDBNull(_index)? SqlInt64.   Null: DataReader.GetInt64   (_index); }
+		public override SqlSingle   GetSqlSingle  (object o, int index) { return DataReader.IsDBNull(_index)? SqlSingle.  Null: DataReader.GetFloat   (_index); }
+		public override SqlBoolean  GetSqlBoolean (object o, int index) { return DataReader.IsDBNull(_index)? SqlBoolean. Null: DataReader.GetBoolean (_index); }
+		public override SqlDouble   GetSqlDouble  (object o, int index) { return DataReader.IsDBNull(_index)? SqlDouble.  Null: DataReader.GetDouble  (_index); }
+		public override SqlDateTime GetSqlDateTime(object o, int index) { return DataReader.IsDBNull(_index)? SqlDateTime.Null: DataReader.GetDateTime(_index); }
+		public override SqlDecimal  GetSqlDecimal (object o, int index) { return DataReader.IsDBNull(_index)? SqlDecimal. Null: DataReader.GetDecimal (_index); }
+		public override SqlMoney    GetSqlMoney   (object o, int index) { return DataReader.IsDBNull(_index)? SqlMoney.   Null: DataReader.GetDecimal (_index); }
+		public override SqlGuid     GetSqlGuid    (object o, int index) { return DataReader.IsDBNull(_index)? SqlGuid.    Null: DataReader.GetGuid    (_index); }
+		public override SqlString   GetSqlString  (object o, int index) { return DataReader.IsDBNull(_index)? SqlString.  Null: DataReader.GetString  (_index); }
+
+#endif
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/ScalarListMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,66 @@
+using System;
+using System.Collections;
+
+namespace BLToolkit.Mapping
+{
+	public class ScalarListMapper : MapDataSourceDestinationBase
+	{
+		public ScalarListMapper(IList list, Type type)
+		{
+			_list = list;
+			_type = type;
+		}
+
+		private readonly IList _list;
+		private readonly Type  _type;
+		private          int   _index;
+
+		#region Destination
+
+		public override Type GetFieldType(int index)
+		{
+			return _type;
+		}
+
+		public override int GetOrdinal(string name)
+		{
+			return 0;
+		}
+
+		public override void SetValue(object o, int index, object value)
+		{
+			_list.Add(value);
+		}
+
+		public override void SetValue(object o, string name, object value)
+		{
+			_list.Add(value);
+		}
+
+		#endregion
+
+		#region Source
+
+		public override int Count
+		{
+			get { return _index < _list.Count? 1: 0; }
+		}
+
+		public override string GetName(int index)
+		{
+			return string.Empty;
+		}
+
+		public override object GetValue(object o, int index)
+		{
+			return _list[_index++];
+		}
+
+		public override object GetValue(object o, string name)
+		{
+			return _list[_index++];
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/ScalarListMapperT.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,109 @@
+using System;
+using System.Collections.Generic;
+using System.Data.SqlTypes;
+
+using BLToolkit.Common;
+
+namespace BLToolkit.Mapping
+{
+	public class ScalarListMapper<T> : MapDataDestinationBase
+	{
+		public ScalarListMapper(MappingSchema mappingSchema, IList<T> list)
+		{
+			_list           = list;
+			_mappingSchema  = mappingSchema;
+			_nullValue      = (T)mappingSchema.GetNullValue(_type);
+			_isNullable     = _type.IsGenericType && _type.GetGenericTypeDefinition() == typeof(Nullable<>);
+			_underlyingType = _isNullable? Nullable.GetUnderlyingType(_type): _type;
+		}
+
+		private readonly IList<T>      _list;
+		private readonly MappingSchema _mappingSchema;
+		private readonly T             _nullValue;
+		private readonly bool          _isNullable;
+		private readonly Type          _type = typeof(T);
+		private readonly Type          _underlyingType;
+
+		#region IMapDataDestination Members
+
+		public override Type GetFieldType(int index)   { return _type; }
+		public override int  GetOrdinal  (string name) { return 0; }
+		public override void SetValue    (object o, int    index, object value) { _list.Add((T)_mappingSchema.ConvertChangeType(value, _underlyingType, _isNullable)); }
+		public override void SetValue    (object o, string name,  object value) { _list.Add((T)_mappingSchema.ConvertChangeType(value, _underlyingType, _isNullable)); }
+
+		public override void SetNull     (object o, int index) { _list.Add(_nullValue); }
+
+		public override bool SupportsTypedValues(int index)    { return true; }
+
+		// Simple types setters.
+		//
+		[CLSCompliant(false)]
+		public override void SetSByte    (object o, int index, SByte    value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetInt16    (object o, int index, Int16    value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetInt32    (object o, int index, Int32    value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetInt64    (object o, int index, Int64    value) { _list.Add(ConvertTo<T>.From(value)); }
+
+		public override void SetByte     (object o, int index, Byte     value) { _list.Add(ConvertTo<T>.From(value)); }
+		[CLSCompliant(false)]
+		public override void SetUInt16   (object o, int index, UInt16   value) { _list.Add(ConvertTo<T>.From(value)); }
+		[CLSCompliant(false)]
+		public override void SetUInt32   (object o, int index, UInt32   value) { _list.Add(ConvertTo<T>.From(value)); }
+		[CLSCompliant(false)]
+		public override void SetUInt64   (object o, int index, UInt64   value) { _list.Add(ConvertTo<T>.From(value)); }
+
+		public override void SetBoolean  (object o, int index, Boolean  value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetChar     (object o, int index, Char     value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetSingle   (object o, int index, Single   value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetDouble   (object o, int index, Double   value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetDecimal  (object o, int index, Decimal  value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetGuid     (object o, int index, Guid     value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetDateTime (object o, int index, DateTime value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetDateTimeOffset(object o, int index, DateTimeOffset value) { _list.Add(ConvertTo<T>.From(value)); }
+
+		// Nullable types setters.
+		//
+		[CLSCompliant(false)]
+		public override void SetNullableSByte   (object o, int index, SByte?    value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetNullableInt16   (object o, int index, Int16?    value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetNullableInt32   (object o, int index, Int32?    value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetNullableInt64   (object o, int index, Int64?    value) { _list.Add(ConvertTo<T>.From(value)); }
+
+		public override void SetNullableByte    (object o, int index, Byte?     value) { _list.Add(ConvertTo<T>.From(value)); }
+		[CLSCompliant(false)]
+		public override void SetNullableUInt16  (object o, int index, UInt16?   value) { _list.Add(ConvertTo<T>.From(value)); }
+		[CLSCompliant(false)]
+		public override void SetNullableUInt32  (object o, int index, UInt32?   value) { _list.Add(ConvertTo<T>.From(value)); }
+		[CLSCompliant(false)]
+		public override void SetNullableUInt64  (object o, int index, UInt64?   value) { _list.Add(ConvertTo<T>.From(value)); }
+
+		public override void SetNullableBoolean (object o, int index, Boolean?  value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetNullableChar    (object o, int index, Char?     value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetNullableSingle  (object o, int index, Single?   value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetNullableDouble  (object o, int index, Double?   value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetNullableDecimal (object o, int index, Decimal?  value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetNullableGuid    (object o, int index, Guid?     value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetNullableDateTime(object o, int index, DateTime? value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetNullableDateTimeOffset(object o, int index, DateTimeOffset? value) { _list.Add(ConvertTo<T>.From(value)); }
+
+#if !SILVERLIGHT
+
+		// SQL type setters.
+		//
+		public override void SetSqlByte    (object o, int index, SqlByte     value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetSqlInt16   (object o, int index, SqlInt16    value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetSqlInt32   (object o, int index, SqlInt32    value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetSqlInt64   (object o, int index, SqlInt64    value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetSqlSingle  (object o, int index, SqlSingle   value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetSqlBoolean (object o, int index, SqlBoolean  value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetSqlDouble  (object o, int index, SqlDouble   value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetSqlDateTime(object o, int index, SqlDateTime value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetSqlDecimal (object o, int index, SqlDecimal  value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetSqlMoney   (object o, int index, SqlMoney    value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetSqlGuid    (object o, int index, SqlGuid     value) { _list.Add(ConvertTo<T>.From(value)); }
+		public override void SetSqlString  (object o, int index, SqlString   value) { _list.Add(ConvertTo<T>.From(value)); }
+
+#endif
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/SimpleDestinationListMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,40 @@
+using System;
+
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Mapping
+{
+	public class SimpleDestinationListMapper : IMapDataDestinationList
+	{
+		[CLSCompliant(false)]
+		public SimpleDestinationListMapper(IMapDataDestination mapper)
+		{
+			_mapper = mapper;
+		}
+
+		private readonly IMapDataDestination _mapper;
+
+		#region IMapDataDestinationList Members
+
+		public virtual void InitMapping(InitContext initContext)
+		{
+		}
+
+		[CLSCompliant(false)]
+		public virtual IMapDataDestination GetDataDestination(InitContext initContext)
+		{
+			return _mapper;
+		}
+
+		public virtual object GetNextObject(InitContext initContext)
+		{
+			return _mapper;
+		}
+
+		public virtual void EndMapping(InitContext initContext)
+		{
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/SimpleSourceListMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,35 @@
+using System;
+
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Mapping
+{
+	public class SimpleSourceListMapper : IMapDataSourceList
+	{
+		[CLSCompliant(false)]
+		public SimpleSourceListMapper(IMapDataSource mapper)
+		{
+			_mapper = mapper;
+		}
+
+		private readonly IMapDataSource _mapper;
+
+		#region IMapDataSourceList Members
+
+		public virtual void InitMapping(InitContext initContext)
+		{
+		}
+
+		public bool SetNextDataSource(InitContext initContext)
+		{
+			initContext.DataSource = _mapper;
+			return _mapper.Count > 0;
+		}
+
+		public virtual void EndMapping(InitContext initContext)
+		{
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/TextDataListMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,42 @@
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Mapping
+{
+	public class TextDataListMapper : IMapDataDestinationList
+	{
+		public TextDataListMapper(TextDataMapper mapper)
+		{
+			_mapper = mapper;
+		}
+
+		public TextDataListMapper(TextDataWriter writer)
+			: this(new TextDataMapper(writer))
+		{
+		}
+
+		private readonly TextDataMapper _mapper;
+
+		#region IMapDataDestinationList Members
+
+		void IMapDataDestinationList.InitMapping(InitContext initContext)
+		{
+		}
+
+		IMapDataDestination IMapDataDestinationList.GetDataDestination(InitContext initContext)
+		{
+			return _mapper;
+		}
+
+		object IMapDataDestinationList.GetNextObject(InitContext initContext)
+		{
+			return _mapper.Writer;
+		}
+
+		void IMapDataDestinationList.EndMapping(InitContext initContext)
+		{
+			_mapper.WriteEnd();
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/TextDataMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,45 @@
+using System;
+
+namespace BLToolkit.Mapping
+{
+	public class TextDataMapper : MapDataDestinationBase
+	{
+		public TextDataMapper(TextDataWriter writer)
+		{
+			if (writer == null) throw new ArgumentNullException("writer");
+
+			_writer = writer;
+		}
+
+		private readonly TextDataWriter _writer;
+		public           TextDataWriter  Writer
+		{
+			get { return _writer; }
+		}
+
+		public virtual void WriteEnd()
+		{
+			_writer.WriteEnd();
+		}
+
+		public override Type GetFieldType(int index)
+		{
+			return _writer.GetFieldType(index);
+		}
+
+		public override int GetOrdinal(string name)
+		{
+			return _writer.GetOrdinal(name);
+		}
+
+		public override void SetValue(object o, int index, object value)
+		{
+			_writer.SetValue(index, value);
+		}
+
+		public override void SetValue(object o, string name, object value)
+		{
+			_writer.SetValue(name, value);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/TextDataReader.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,381 @@
+using System;
+using System.Data;
+#if !SILVERLIGHT
+using System.Data.Common;
+#endif
+using System.IO;
+using System.Text;
+
+namespace BLToolkit.Mapping
+{
+	public class TextDataReader : IDataReader
+	{
+		#region Constructors
+
+		public TextDataReader(Stream stream)
+			: this(stream, Map.DefaultSchema)
+		{
+		}
+
+		public TextDataReader(Stream stream, MappingSchema mappingSchema)
+		{
+			GC.SuppressFinalize(this);
+
+			if (mappingSchema == null) throw new ArgumentNullException("mappingSchema");
+
+			_reader        = new StreamReader(stream);
+			_mappingSchema = mappingSchema;
+
+			ReadHeader();
+		}
+
+		#endregion
+
+		#region Protected Members
+
+		private readonly StreamReader  _reader;
+		private readonly MappingSchema _mappingSchema;
+		private          string        _line       = string.Empty;
+		private          string[]      _names      = _empty;
+		private          string[]      _values     = _empty;
+		private          int           _lineNumber = 0;
+
+		private static readonly string[] _empty = new string[0];
+
+		private bool IsEof
+		{
+			get { return _line == null; }
+		}
+
+		private bool ReadNextLine()
+		{
+			while (!IsEof)
+			{
+				_line = _reader.ReadLine();
+				_lineNumber++;
+
+				if (!string.IsNullOrEmpty(_line) && _line[0] == '*')
+					return true;
+			}
+
+			return false;
+		}
+
+		private void ReadHeader()
+		{
+			while (ReadNextLine())
+			{
+				if (_line.StartsWith("*:"))
+				{
+					_names  = _line.Substring(2).Split(':');
+					_values = new string[_names.Length];
+
+					for (int i = 0; i < _names.Length; i++)
+						_names[i] = _names[i].Trim();
+				}
+				else if (_line.StartsWith("**") || _line.StartsWith("*-"))
+					break;
+			}
+		}
+
+		static string Encode(string value)
+		{
+			var arr = Convert.FromBase64String(value.Substring(1));
+
+#if SILVERLIGHT
+			return new UnicodeEncoding(false, true).GetString(arr, 0, arr.Length);
+#else
+			return Encoding.Unicode.GetString(arr);
+#endif
+		}
+
+		bool ReadRecord()
+		{
+			if (!IsEof)
+			{
+				if (_line.StartsWith("*-"))
+					return false;
+
+				if (_line.StartsWith("**") && _line.Length > 3)
+				{
+					var values = _line.Substring(3).Split(_line[2]);
+
+					for (var i = 0; i < _values.Length && i < values.Length; i++)
+					{
+						var value = values[i];
+
+						_values[i] =
+							value.Length == 0? null:
+							value[0] == '*'?   value.Substring(1):
+							value[0] == '+'?   Encode(value.Substring(1)) : value;
+					}
+
+					ReadNextLine();
+
+					return true;
+				}
+
+				throw new MappingException(
+					string.Format("Invalid data format in the line {0}.", _lineNumber));
+			}
+
+			return false;
+		}
+
+		#endregion
+
+		#region IDataReader Members
+
+		public virtual void Close()
+		{
+			_line = null;
+		}
+
+		public virtual int Depth
+		{
+			get { return 0; }
+		}
+
+		public virtual Type GetFieldType(int index)
+		{
+			return typeof(string);
+		}
+
+		public virtual string GetName(int index)
+		{
+			return _names[index];
+		}
+
+#if !SILVERLIGHT
+		private DataTable _schemaTable;
+
+		public virtual DataTable GetSchemaTable()
+		{
+			if (_schemaTable == null)
+			{
+				_schemaTable = new DataTable("SchemaTable");
+
+				_schemaTable.Columns.AddRange(new DataColumn[]
+				{
+					new DataColumn(SchemaTableColumn.ColumnName,               typeof(string)),
+					new DataColumn(SchemaTableColumn.ColumnOrdinal,            typeof(int)),
+					new DataColumn(SchemaTableColumn.ColumnSize,               typeof(int)),
+					new DataColumn(SchemaTableColumn.NumericPrecision,         typeof(short)),
+					new DataColumn(SchemaTableColumn.NumericScale,             typeof(short)),
+					new DataColumn(SchemaTableColumn.DataType,                 typeof(Type)),
+					new DataColumn(SchemaTableColumn.NonVersionedProviderType, typeof(int)),
+					new DataColumn(SchemaTableColumn.ProviderType,             typeof(int)),
+					new DataColumn(SchemaTableColumn.IsLong,                   typeof(bool)),
+					new DataColumn(SchemaTableColumn.AllowDBNull,              typeof(bool)),
+					new DataColumn(SchemaTableColumn.IsUnique,                 typeof(bool)),
+					new DataColumn(SchemaTableColumn.IsKey,                    typeof(bool)),
+					new DataColumn(SchemaTableColumn.BaseSchemaName,           typeof(string)),
+					new DataColumn(SchemaTableColumn.BaseTableName,            typeof(string)),
+					new DataColumn(SchemaTableColumn.BaseColumnName,           typeof(string)),
+					new DataColumn(SchemaTableColumn.IsAliased,                typeof(bool)),
+					new DataColumn(SchemaTableColumn.IsExpression,             typeof(bool)),
+				});
+
+				for (int i = 0; i < _names.Length; i++)
+				{
+					DataRow row = _schemaTable.NewRow();
+
+					row[SchemaTableColumn.ColumnName]               = _names[i];
+					row[SchemaTableColumn.ColumnOrdinal]            = i;
+					row[SchemaTableColumn.ColumnSize]               = (int)byte.MaxValue;
+					row[SchemaTableColumn.NumericPrecision]         = (short)0;
+					row[SchemaTableColumn.NumericScale]             = (short)0;
+					row[SchemaTableColumn.DataType]                 = typeof(string);
+					row[SchemaTableColumn.NonVersionedProviderType] = 1;
+					row[SchemaTableColumn.ProviderType]             = 1;
+					row[SchemaTableColumn.IsLong]                   = false;
+					row[SchemaTableColumn.AllowDBNull]              = true;
+					row[SchemaTableColumn.IsUnique]                 = false;
+					row[SchemaTableColumn.IsKey]                    = false;
+					row[SchemaTableColumn.BaseSchemaName]           = string.Empty;
+					row[SchemaTableColumn.BaseTableName]            = string.Empty;
+					row[SchemaTableColumn.BaseColumnName]           = string.Empty;
+					row[SchemaTableColumn.IsAliased]                = false;
+					row[SchemaTableColumn.IsExpression]             = false;
+
+					_schemaTable.Rows.Add(row);
+				}
+			}
+
+			return _schemaTable;
+		}
+
+#endif
+
+		public virtual int FieldCount
+		{
+			get { return _names.Length; }
+		}
+
+		public virtual bool IsClosed
+		{
+			get { return IsEof; }
+		}
+
+		public virtual bool NextResult()
+		{
+			ReadHeader();
+			return !IsEof;
+		}
+
+		public virtual bool Read()
+		{
+			return ReadRecord();
+		}
+
+		public virtual int RecordsAffected
+		{
+			get { return -1; }
+		}
+
+		#endregion
+
+		#region IDisposable Members
+
+		public virtual void Dispose()
+		{
+		}
+
+		#endregion
+
+		#region IDataRecord Members
+
+		public virtual bool GetBoolean(int i)
+		{
+			return _mappingSchema.ConvertToBoolean(_values[i]);
+		}
+
+		public virtual byte GetByte(int i)
+		{
+			return _mappingSchema.ConvertToByte(_values[i]);
+		}
+
+		public virtual long GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length)
+		{
+			throw new Exception("The method or operation is not implemented.");
+		}
+
+		public virtual char GetChar(int i)
+		{
+			return _mappingSchema.ConvertToChar(_values[i]);
+		}
+
+		public virtual long GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length)
+		{
+			throw new Exception("The method or operation is not implemented.");
+		}
+
+		public virtual IDataReader GetData(int i)
+		{
+			throw new Exception("The method or operation is not implemented.");
+		}
+
+		public virtual string GetDataTypeName(int i)
+		{
+			return typeof(string).FullName;
+		}
+
+		public virtual DateTime GetDateTime(int i)
+		{
+			return _mappingSchema.ConvertToDateTime(_values[i]);
+		}
+
+		public virtual DateTimeOffset GetDateTimeOffset(int i)
+		{
+			return _mappingSchema.ConvertToDateTimeOffset(_values[i]);
+		}
+
+		public virtual decimal GetDecimal(int i)
+		{
+			return _mappingSchema.ConvertToDecimal(_values[i]);
+		}
+
+		public virtual double GetDouble(int i)
+		{
+			return _mappingSchema.ConvertToDouble(_values[i]);
+		}
+
+		public virtual float GetFloat(int i)
+		{
+			return _mappingSchema.ConvertToSingle(_values[i]);
+		}
+
+		public virtual Guid GetGuid(int i)
+		{
+			return _mappingSchema.ConvertToGuid(_values[i]);
+		}
+
+		public virtual short GetInt16(int i)
+		{
+			return _mappingSchema.ConvertToInt16(_values[i]);
+		}
+
+		public virtual int GetInt32(int i)
+		{
+			return _mappingSchema.ConvertToInt32(_values[i]);
+		}
+
+		public virtual long GetInt64(int i)
+		{
+			return _mappingSchema.ConvertToInt64(_values[i]);
+		}
+
+		public virtual int GetOrdinal(string name)
+		{
+			for (int i = 0; i < _names.Length; i++)
+				if (_names[i] == name)
+					return i;
+
+			return -1;
+		}
+
+		public virtual string GetString(int i)
+		{
+			return _values[i];
+		}
+
+		public virtual object GetValue(int i)
+		{
+			return _values[i];
+		}
+
+		public virtual int GetValues(object[] values)
+		{
+			int n = Math.Min(values.Length, _values.Length);
+
+			for (int i = 0; i < n; i++)
+				values[i] = _values[i];
+
+			return n;
+		}
+
+		public virtual bool IsDBNull(int i)
+		{
+			return _values[i] == null;
+		}
+
+		public virtual object this[string name]
+		{
+			get
+			{
+				for (int i = 0; i < _names.Length; i++)
+					if (_names[i] == name)
+						return _values[i];
+
+				throw new ArgumentException(string.Format("Invalid field name '{0}'", name));
+			}
+		}
+
+		public virtual object this[int i]
+		{
+			get { return _values[i]; }
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/TextDataWriter.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,194 @@
+using System;
+using System.IO;
+using System.Text;
+
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Mapping
+{
+	public class TextDataWriter : ISupportMapping
+	{
+		#region Constructors
+
+		public TextDataWriter(Stream stream, params string[] fieldNames)
+			: this(stream, Map.DefaultSchema, fieldNames)
+		{
+		}
+
+		public TextDataWriter(Stream stream, Type type)
+			: this(stream, Map.DefaultSchema, Map.GetObjectMapper(type).FieldNames)
+		{
+		}
+
+		public TextDataWriter(Stream stream, MappingSchema mappingSchema, params string[] fieldNames)
+			: this(new StreamWriter(stream), mappingSchema, fieldNames)
+		{
+		}
+
+		public TextDataWriter(Stream stream, MappingSchema mappingSchema, Type type)
+			: this(stream, mappingSchema, mappingSchema.GetObjectMapper(type).FieldNames)
+		{
+		}
+
+		public TextDataWriter(TextWriter writer, params string[] fieldNames)
+			: this(writer, Map.DefaultSchema, fieldNames)
+		{
+		}
+
+		public TextDataWriter(TextWriter writer, Type type)
+			: this(writer, Map.DefaultSchema, Map.GetObjectMapper(type).FieldNames)
+		{
+		}
+
+		public TextDataWriter(TextWriter writer, MappingSchema mappingSchema, params string[] fieldNames)
+		{
+			GC.SuppressFinalize(this);
+
+			if (mappingSchema == null) throw new ArgumentNullException("mappingSchema");
+
+			_writer        = writer;
+			_names         = fieldNames;
+
+			_values = new string[_names.Length];
+
+			WriteHeader();
+		}
+
+		public TextDataWriter(TextWriter writer, MappingSchema mappingSchema, Type type)
+			: this(writer, mappingSchema, mappingSchema.GetObjectMapper(type).FieldNames)
+		{
+		}
+
+		#endregion
+
+		#region Public Members
+
+		public virtual void WriteEnd()
+		{
+			_writer.WriteLine("*-");
+			_writer.Flush();
+		}
+
+		public virtual Type GetFieldType(int index)
+		{
+			return typeof(string);
+		}
+
+		public virtual int GetOrdinal(string name)
+		{
+			for (int i = 0; i < _names.Length; i++)
+				if (_names[i] == name)
+					return i;
+
+			return 0;
+		}
+
+		public virtual void SetValue(int index, object value)
+		{
+			_values[index] = value == null? null: value.ToString();
+		}
+
+		public virtual void SetValue(string name, object value)
+		{
+			SetValue(GetOrdinal(name), value);
+		}
+
+		#endregion
+
+		#region Protected Members
+
+		private readonly TextWriter    _writer;
+		private readonly string[]      _names;
+		private readonly string[]      _values;
+
+		private void WriteHeader()
+		{
+			_writer.Write("*");
+
+			foreach (string name in _names)
+			{
+				_writer.Write(':');
+				_writer.Write(name);
+			}
+
+			_writer.WriteLine();
+		}
+
+		private void WriteRecord()
+		{
+			_writer.Write("**");
+
+			char[] delimiters = new char[] { ',', ':', '|', '-', '_' };
+			char   delimiter  = '\0';
+
+			foreach (char ch in delimiters)
+			{
+				bool found = false;
+
+				foreach (string value in _values)
+				{
+					if (value != null && value.IndexOf(ch) >= 0)
+					{
+						found = true;
+						break;
+					}
+				}
+
+				if (!found)
+				{
+					delimiter = ch;
+					break;
+				}
+			}
+
+			if (delimiter == 0)
+				delimiter = delimiters[0];
+
+			char[] exChars = new char[] { delimiter, '\r', '\n', '\t', '\0' };
+
+			foreach (string value in _values)
+			{
+				_writer.Write(delimiter);
+
+				if (value != null)
+				{
+					if (value.Length == 0)
+						_writer.Write('*');
+					else
+					{
+						if (value.IndexOfAny(exChars) >= 0)
+						{
+							_writer.Write('+');
+							_writer.Write(Convert.ToBase64String(Encoding.Unicode.GetBytes(value)));
+						}
+						else
+						{
+							if (value[0] == '*' || value[0] == '+')
+								_writer.Write('*');
+
+							_writer.Write(value);
+						}
+					}
+				}
+			}
+
+			_writer.WriteLine();
+			_writer.Flush();
+		}
+
+		#endregion
+
+		#region ISupportMapping Members
+
+		void ISupportMapping.BeginMapping(InitContext initContext)
+		{
+		}
+
+		void ISupportMapping.EndMapping(InitContext initContext)
+		{
+			WriteRecord();
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/TrimmableAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,40 @@
+using System;
+using System.Diagnostics.CodeAnalysis;
+using BLToolkit.Common;
+
+namespace BLToolkit.Mapping
+{
+	[AttributeUsage(
+		AttributeTargets.Property | AttributeTargets.Field |
+		AttributeTargets.Class | AttributeTargets.Interface)]
+	public sealed class TrimmableAttribute : Attribute
+	{
+		public TrimmableAttribute()
+		{
+			_isTrimmable = true;
+		}
+
+		public TrimmableAttribute(bool isTrimmable)
+		{
+			_isTrimmable = isTrimmable;
+		}
+
+		private readonly bool _isTrimmable;
+		public           bool  IsTrimmable
+		{
+			get { return _isTrimmable;  }
+		}
+
+		private static TrimmableAttribute GetDefaultTrimmableAttribute()
+		{
+			return Common.Configuration.TrimOnMapping ? Yes : No;
+		}
+
+		[SuppressMessage("Microsoft.Security", "CA2104:DoNotDeclareReadOnlyMutableReferenceTypes")]
+		public static readonly TrimmableAttribute Yes     = new TrimmableAttribute(true);
+		[SuppressMessage("Microsoft.Security", "CA2104:DoNotDeclareReadOnlyMutableReferenceTypes")]
+		public static readonly TrimmableAttribute No      = new TrimmableAttribute(false);
+		[SuppressMessage("Microsoft.Security", "CA2104:DoNotDeclareReadOnlyMutableReferenceTypes")]
+		public static readonly TrimmableAttribute Default = GetDefaultTrimmableAttribute();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Mapping/ValueMapping.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,155 @@
+using System;
+
+using BLToolkit.Common;
+
+using KeyValue = System.Collections.Generic.KeyValuePair<System.Type, System.Type>;
+using Table    = System.Collections.Generic.Dictionary<System.Collections.Generic.KeyValuePair<System.Type, System.Type>, BLToolkit.Mapping.IValueMapper>;
+
+namespace BLToolkit.Mapping
+{
+	public static class ValueMapping
+	{
+		#region Init
+
+		private static readonly Table _mappers = new Table();
+
+		#endregion
+
+		#region Default Mapper
+
+		class DefaultValueMapper : IValueMapper
+		{
+			public void Map(
+				IMapDataSource      source, object sourceObject, int sourceIndex,
+				IMapDataDestination dest,   object destObject,   int destIndex)
+			{
+				dest.SetValue(destObject, destIndex, source.GetValue(sourceObject, sourceIndex));
+
+				//object o = source.GetValue(sourceObject, sourceIndex);
+
+				//if (o == null) dest.SetNull (destObject, destIndex);
+				//else           dest.SetValue(destObject, destIndex, o);
+			}
+		}
+
+		private static IValueMapper _defaultMapper = new DefaultValueMapper();
+		[CLSCompliant(false)]
+		public  static IValueMapper  DefaultMapper
+		{
+			get { return _defaultMapper;  }
+			set { _defaultMapper = value; }
+		}
+
+		#endregion
+
+		#region GetMapper
+
+		private static readonly object _sync = new object();
+
+		[CLSCompliant(false)]
+		public static IValueMapper GetMapper(Type t1, Type t2)
+		{
+			if (t1 == null) t1 = typeof(object);
+			if (t2 == null) t2 = typeof(object);
+
+			if (t1.IsEnum) t1 = Enum.GetUnderlyingType(t1);
+			if (t2.IsEnum) t2 = Enum.GetUnderlyingType(t2);
+
+			var key = new KeyValue(t1, t2);
+
+			lock (_sync)
+			{
+				IValueMapper t;
+
+				if (_mappers.TryGetValue(key, out t))
+					return t;
+
+				//t = BLToolkit.Mapping.ValueMappingInternal.MapperSelector.GetMapper(t1, t2);
+
+				if (null == t)
+				{
+					var type = typeof(GetSetDataChecker<,>).MakeGenericType(t1, t2);
+
+					if (((IGetSetDataChecker)Activator.CreateInstance(type)).Check() == false)
+					{
+						t = _defaultMapper;
+					}
+					else
+					{
+						type = t1 == t2 ?
+							typeof(ValueMapper<>).MakeGenericType(t1) :
+							typeof(ValueMapper<,>).MakeGenericType(t1, t2);
+
+						t = (IValueMapper)Activator.CreateInstance(type);
+					}
+				}
+
+				_mappers.Add(key, t);
+
+				return t;
+			}
+		}
+
+		#endregion
+
+		#region Generic Mappers
+
+		interface IGetSetDataChecker
+		{
+			bool Check();
+		}
+
+		class GetSetDataChecker<S,D> : IGetSetDataChecker
+		{
+			public bool Check()
+			{
+				return
+					!(MapGetData<S>.I is MapGetData<S>.Default<S>) &&
+					!(MapSetData<S>.I is MapSetData<S>.Default<S>) &&
+					!(MapGetData<D>.I is MapGetData<D>.Default<D>) &&
+					!(MapSetData<D>.I is MapSetData<D>.Default<D>);
+			}
+		}
+
+		class ValueMapper<T> : IValueMapper
+		{
+			public void Map(
+				IMapDataSource      source, object sourceObject, int sourceIndex,
+				IMapDataDestination dest,   object destObject,   int destIndex)
+			{
+				if (source.IsNull(sourceObject, sourceIndex))
+					dest.SetNull(destObject, destIndex);
+				else
+				{
+					var setter = MapSetData<T>.I;
+					var getter = MapGetData<T>.I;
+
+					setter.To(dest, destObject, destIndex,
+						getter.From(source, sourceObject, sourceIndex));
+				}
+			}
+		}
+
+		class ValueMapper<S,D> : IValueMapper
+		{
+			public void Map(
+				IMapDataSource      source, object sourceObject, int sourceIndex,
+				IMapDataDestination dest,   object destObject,   int destIndex)
+			{
+				if (source.IsNull(sourceObject, sourceIndex))
+					dest.SetNull(destObject, destIndex);
+				else
+				{
+					var setter    = MapSetData<D>.I;
+					var getter    = MapGetData<S>.I;
+					var converter = Convert<D,S>.From;
+
+					setter.To(dest, destObject, destIndex,
+						converter(getter.From(source, sourceObject, sourceIndex)));
+				}
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Net/HttpReader.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,465 @@
+/*
+ * File:    HttpReader.cs
+ * Created: 01/17/2003
+ * Author:  Igor Tkachev
+ *          mailto:it@rsdn.ru
+ */
+
+using System;
+using System.Collections;
+using System.IO;
+using System.Net;
+using System.Text;
+using System.Security.Cryptography.X509Certificates;
+using System.Collections.Generic;
+
+namespace BLToolkit.Net
+{
+	public delegate void ProcessStream(Stream stream);
+
+	/// <summary>
+	/// Encapsulates WebReader functions.
+	/// </summary>
+	public class HttpReader
+	{
+		#region Costructors
+
+		public HttpReader()
+		{
+			BaseUri = string.Empty;
+		}
+
+		public HttpReader(string baseUri)
+		{
+			BaseUri = baseUri;
+		}
+
+		#endregion
+
+		#region Public Properties
+
+		private X509Certificate _certificate;
+		public  X509Certificate  Certificate
+		{
+			get { return _certificate;  }
+			set { _certificate = value; }
+		}
+
+		private string _baseUri;
+		public  string  BaseUri
+		{
+			get { return _baseUri;  }
+			set { _baseUri = value; }
+		}
+
+		private string _previousUri;
+		public  string  PreviousUri
+		{
+			get { return _previousUri;  }
+			set { _previousUri = value; }
+		}
+
+		private CookieContainer _cookieContainer = new CookieContainer();
+		public  CookieContainer  CookieContainer
+		{
+			get { return _cookieContainer;  }
+			set { _cookieContainer = value; }
+		}
+
+		private string _userAgent = @"HttpReader";
+		public  string  UserAgent
+		{
+			get { return _userAgent;  }
+			set { _userAgent = value; }
+		}
+
+		private string _accept =
+			@"image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*";
+		public  string  Accept
+		{
+			get { return _accept;  }
+			set { _accept = value; }
+		}
+
+		private Uri _requestUri;
+		public  Uri  RequestUri
+		{
+			get { return _requestUri;  }
+			set { _requestUri = value; }
+		}
+
+		private string _contentType = string.Empty;
+		public  string  ContentType
+		{
+			get { return _contentType;  }
+			set { _contentType = value; }
+		}
+
+		private IWebProxy _proxy = new WebProxy();
+		public  IWebProxy  Proxy
+		{
+			get { return _proxy;  }
+			set { _proxy = value; }
+		}
+
+		private ICredentials _credentials = CredentialCache.DefaultCredentials;
+		public  ICredentials  Credentials
+		{
+			get { return _credentials;  }
+			set { _credentials = value; }
+		}
+
+		private string _html;
+		public  string  Html
+		{
+			get { return _html; }
+		}
+
+		private readonly Hashtable _headers = new Hashtable();
+		public           Hashtable  Headers
+		{
+			get { return _headers; }
+		}
+
+		private string _location;
+		public  string  Location
+		{
+			get { return _location; }
+		}
+
+		private bool _sendReferer = true;
+		public  bool  SendReferer
+		{
+			get { return _sendReferer;  }
+			set { _sendReferer = value; }
+		}
+
+		private HttpStatusCode _statusCode;
+		public  HttpStatusCode  StatusCode
+		{
+			get { return _statusCode; }
+		}
+
+		private int _timeout;
+		public  int  Timeout
+		{
+			get { return _timeout;  }
+			set { _timeout = value; }
+		}
+
+		#endregion
+
+		#region Public Methods
+
+		public void LoadCertificate(string fileName)
+		{
+			Certificate = X509Certificate.CreateFromCertFile(fileName);
+		}
+
+		#endregion
+
+		#region Request Methods
+
+		private HttpWebRequest PrepareRequest(string method, string requestUri, ProcessStream requestStreamProcessor)
+		{
+			_html = "";
+
+			string uri = BaseUri;
+			
+			if (method != "SOAP")
+				uri += requestUri;
+
+			HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
+
+			if (Proxy       != null) request.Proxy       = Proxy;
+			if (Credentials != null) request.Credentials = Credentials;
+
+			request.CookieContainer = CookieContainer;
+			request.UserAgent       = UserAgent;
+			request.Accept          = Accept;
+			request.Method          = method == "SOAP"? "POST" : method;
+			request.KeepAlive       = true;
+
+			if (SendReferer)
+				request.Referer = PreviousUri ?? uri;
+
+			foreach (string key in Headers.Keys)
+				request.Headers.Add(key, Headers[key].ToString());
+
+			if (method == "POST")
+			{
+				request.ContentType       = "application/x-www-form-urlencoded";
+				request.AllowAutoRedirect = false;
+			}
+			else if (method == "SOAP")
+			{
+				request.ContentType       = "text/xml; charset=utf-8";
+				request.AllowAutoRedirect = false;
+
+				request.Headers.Add("SOAPAction", requestUri);
+			}
+			else
+			{
+				request.ContentType       = ContentType;
+				request.AllowAutoRedirect = true;
+			}
+
+			PreviousUri = uri;
+			RequestUri  = request.RequestUri;
+
+			if (Certificate != null)
+				request.ClientCertificates.Add(Certificate);
+
+			if (Timeout != 0)
+				request.Timeout = Timeout;
+
+			if (requestStreamProcessor != null)
+				using (Stream st = request.GetRequestStream())
+					requestStreamProcessor(st);
+
+			return request;
+		}
+
+		public HttpStatusCode Request(
+			string        requestUri,
+			string        method,
+			ProcessStream requestStreamProcessor,
+			ProcessStream responseStreamProcessor)
+		{
+			HttpWebRequest request = PrepareRequest(method, requestUri, requestStreamProcessor);
+
+			using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse())
+			using (Stream          sm   = resp.GetResponseStream())
+			{
+				_statusCode = resp.StatusCode;
+				_location   = resp.Headers["Location"];
+
+				if (resp.ResponseUri.AbsoluteUri.StartsWith(BaseUri) == false)
+					BaseUri = resp.ResponseUri.Scheme + "://" + resp.ResponseUri.Host;
+
+				CookieCollection cc = request.CookieContainer.GetCookies(request.RequestUri);
+
+				// This code fixes the situation when a server sets a cookie without the 'path'.
+				// IE takes this as the root ('/') value,
+				// the HttpWebRequest class as the RequestUri.AbsolutePath value.
+				//
+				foreach (Cookie c in cc)
+					if (c.Path == request.RequestUri.AbsolutePath)
+						CookieContainer.Add(new Cookie(c.Name, c.Value, "/", c.Domain));
+
+				if (responseStreamProcessor != null)
+					responseStreamProcessor(sm);
+			}
+
+			return StatusCode;
+		}
+
+		public IEnumerable<string> Request(
+			string        requestUri,
+			string        method,
+			ProcessStream requestStreamProcessor)
+		{
+			HttpWebRequest request = PrepareRequest(method, requestUri, requestStreamProcessor);
+
+			using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse())
+			using (Stream          sm   = resp.GetResponseStream())
+			using (StreamReader    sr   = new StreamReader(sm, Encoding.Default))
+			{
+				_statusCode = resp.StatusCode;
+				_location   = resp.Headers["Location"];
+
+				if (resp.ResponseUri.AbsoluteUri.StartsWith(BaseUri) == false)
+					BaseUri = resp.ResponseUri.Scheme + "://" + resp.ResponseUri.Host;
+
+				CookieCollection cc = request.CookieContainer.GetCookies(request.RequestUri);
+
+				// This code fixes the case when a server sets a cookie without the 'path'.
+				// IE takes this as the root ('/') value,
+				// the HttpWebRequest class as the RequestUri.AbsolutePath value.
+				//
+				foreach (Cookie c in cc)
+					if (c.Path == request.RequestUri.AbsolutePath)
+						CookieContainer.Add(new Cookie(c.Name, c.Value, "/", c.Domain));
+
+				while (true)
+				{
+					string str = sr.ReadLine();
+
+					if (str == null)
+						break;
+
+					yield return str;
+				}
+			}
+		}
+
+		class DefaultRequestStreamProcessor
+		{
+			public DefaultRequestStreamProcessor(string data)
+			{
+				_data = data;
+			}
+
+			readonly string _data;
+
+			public void Process(Stream stream)
+			{
+				byte[] bytes = Encoding.ASCII.GetBytes(_data);
+				stream.Write(bytes, 0, bytes.Length);
+			}
+		}
+
+		class DefaultResponseStreamProcessor
+		{
+			public DefaultResponseStreamProcessor(HttpReader reader)
+			{
+				_reader = reader;
+			}
+
+			readonly HttpReader _reader;
+
+			public void Process(Stream stream)
+			{
+				using (StreamReader sr = new StreamReader(stream, Encoding.Default))
+					_reader._html = sr.ReadToEnd();
+			}
+		}
+
+		public HttpStatusCode Get(string requestUri)
+		{
+			DefaultResponseStreamProcessor rp = new DefaultResponseStreamProcessor(this);
+
+			return Request(requestUri, "GET", null, rp.Process);
+		}
+
+		public HttpStatusCode Get(string requestUri, ProcessStream responseStreamProcessor)
+		{
+			return Request(requestUri, "GET", null, responseStreamProcessor);
+		}
+
+		public HttpStatusCode Post(
+			string requestUri,
+			string postData)
+		{
+			return Post(
+				requestUri,
+				new DefaultRequestStreamProcessor(postData).Process,
+				new DefaultResponseStreamProcessor(this).Process);
+		}
+
+		public HttpStatusCode Post(
+			string        requestUri,
+			ProcessStream requestStreamProcessor)
+		{
+			return Post(
+				requestUri,
+				requestStreamProcessor,
+				new DefaultResponseStreamProcessor(this).Process);
+		}
+
+		public HttpStatusCode Post(
+			string        requestUri,
+			string        postData,
+			ProcessStream responseStreamProcessor)
+		{
+			return Post(
+				requestUri,
+				new ProcessStream(new DefaultRequestStreamProcessor(postData).Process),
+				responseStreamProcessor);
+		}
+
+		public HttpStatusCode Post(
+			string        requestUri,
+			ProcessStream requestStreamProcessor,
+			ProcessStream responseStreamProcessor)
+		{
+			Request(requestUri, "POST", requestStreamProcessor, responseStreamProcessor);
+
+			for (int i = 0; i < 10; i++)
+			{
+				bool post = false;
+
+				switch (StatusCode)
+				{
+					case HttpStatusCode.MultipleChoices:   // 300
+					case HttpStatusCode.MovedPermanently:  // 301
+					case HttpStatusCode.Found:             // 302
+					case HttpStatusCode.SeeOther:          // 303
+						break;
+
+					case HttpStatusCode.TemporaryRedirect: // 307
+						post = true;
+						break;
+
+					default:
+						return StatusCode;
+				}
+
+				if (Location == null)
+					break;
+
+				Uri uri = new Uri(new Uri(PreviousUri), Location);
+
+				BaseUri    = uri.Scheme + "://" + uri.Host;
+				requestUri = uri.AbsolutePath + uri.Query;
+
+				Request(
+					requestUri,
+					post? "POST": "GET",
+					post? requestStreamProcessor: null,
+					responseStreamProcessor);
+			}
+
+			return StatusCode;
+		}
+
+		private HttpStatusCode Soap(
+			string        soapAction,
+			ProcessStream inputStreamProcessor,
+			ProcessStream outputStreamProcessor)
+		{
+			return Request("\"" + soapAction + "\"", "SOAP", inputStreamProcessor, outputStreamProcessor);
+		}
+
+		public HttpStatusCode Soap(string soapAction, string postData)
+		{
+			return Soap(soapAction,
+				new DefaultRequestStreamProcessor(postData).Process,
+				new DefaultResponseStreamProcessor(this).Process);
+		}
+
+		public HttpStatusCode Soap(string soapAction, string postData, ProcessStream outputStreamProcessor)
+		{
+			return Soap(
+				soapAction,
+				new DefaultRequestStreamProcessor(postData).Process,
+				outputStreamProcessor);
+		}
+
+		public IEnumerable<string> SoapEx(string soapAction, string postData)
+		{
+			return Request("\"" + soapAction + "\"", "SOAP", new DefaultRequestStreamProcessor(postData).Process);
+		}
+
+		#endregion
+
+		#region Download
+
+		public void Download(string requestUri, string fileName)
+		{
+			string uri = BaseUri + requestUri;
+
+			WebClient request = new WebClient();
+
+			if (Proxy       != null) request.Proxy       = Proxy;
+			if (Credentials != null) request.Credentials = Credentials;
+
+			foreach (string key in Headers.Keys)
+				request.Headers.Add(key, Headers[key].ToString());
+
+			request.DownloadFile(uri, fileName);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Patterns/DuckType.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,22 @@
+using System;
+
+namespace BLToolkit.Patterns
+{
+	/// <summary>
+	/// Reserved to internal BLToolkit use.
+	/// </summary>
+	public abstract class DuckType
+	{
+		[CLSCompliant(false)]
+		protected object[] _objects;
+		public    object[]  Objects
+		{
+			get { return _objects; }
+		}
+
+		internal void SetObjects(params object[] objs)
+		{
+			_objects = objs;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Patterns/DuckTyping.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,357 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+
+using BLToolkit.Common;
+using BLToolkit.Properties;
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+using BLToolkit.TypeBuilder.Builders;
+
+namespace BLToolkit.Patterns
+{
+	/// <summary>
+	/// Duck typing implementation.
+	/// In computer science, duck typing is a term for dynamic typing typical
+	/// of some programming languages, such as Smalltalk, Python or ColdFusion,
+	/// where a variable's value itself determines what the variable can do.
+	/// Thus an object or set of objects having all the methods described in
+	/// an interface can be made to implement that interface dynamically
+	/// at runtime, even if the objects class does not include the interface
+	/// in its implements clause.
+	/// </summary>
+	public static class DuckTyping
+	{
+		#region Single Duck
+
+		static readonly Dictionary<Type,Dictionary<object,Type>> _duckTypes = new Dictionary<Type,Dictionary<object,Type>>();
+
+		/// <summary>
+		/// Build a proxy type which implements the requested interface by redirecting all calls to the supplied object type.
+		/// </summary>
+		/// <param name="interfaceType">An interface type to implement.</param>
+		/// <param name="objectType">Any type which expected to have all members of the given interface.</param>
+		/// <returns>The duck object type.</returns>
+		public static Type GetDuckType(Type interfaceType, Type objectType)
+		{
+			if (interfaceType == null)      throw new ArgumentNullException("interfaceType");
+			if (!interfaceType.IsInterface) throw new ArgumentException(Resources.DuckTyping_InterfaceTypeMustBeAnInterface, "interfaceType");
+			if (!interfaceType.IsPublic && !interfaceType.IsNestedPublic)
+				throw new ArgumentException(Resources.DuckTyping_InterfaceMustBePublic, "interfaceType");
+
+			Dictionary<object,Type> types;
+
+			lock(_duckTypes)
+				if (!_duckTypes.TryGetValue(interfaceType, out types))
+					_duckTypes.Add(interfaceType, types = new Dictionary<object,Type>());
+
+			Type type;
+
+			lock (types) if (!types.TryGetValue(objectType, out type))
+			{
+				type = TypeFactory.GetType(
+					new CompoundValue(interfaceType, objectType),
+					interfaceType, //objectType,
+					new DuckTypeBuilder(MustImplementAttribute.Default, interfaceType, new[] { objectType }));
+
+				types.Add(objectType, type);
+			}
+
+			return type;
+		}
+
+		/// <summary>
+		/// Implements the requested interface for supplied object.
+		/// If the supplied object implements the interface, the object itself will be returned.
+		/// Otherwise a convenient duck object will be created.
+		/// </summary>
+		/// <param name="interfaceType">An interface type to implement.</param>
+		/// <param name="baseObjectType">Any type which has all members of the given interface.
+		/// When this parameter is set to null, the object type will be used.</param>
+		/// <param name="obj">An object which type expected to have all members of the given interface.</param>
+		/// <returns>An object which implements the interface.</returns>
+		public static object Implement(Type interfaceType, Type baseObjectType, object obj)
+		{
+			if (obj == null) throw new ArgumentNullException("obj");
+
+			var objType = obj.GetType();
+
+			if (TypeHelper.IsSameOrParent(interfaceType, objType))
+				return obj;
+
+			if (obj is DuckType)
+			{
+				var duckObject = (DuckType)obj;
+
+				if (duckObject.Objects.Length == 1)
+				{
+					// Switch to underlying objects when a duck object was passed.
+					//
+					return Implement(interfaceType, baseObjectType, duckObject.Objects[0]);
+				}
+
+				// Re-aggregate underlying objects to expose new interface.
+				//
+				return Aggregate(interfaceType, duckObject.Objects);
+			}
+
+			if (baseObjectType == null)
+				baseObjectType = objType;
+			else if (!TypeHelper.IsSameOrParent(baseObjectType, objType))
+				throw new ArgumentException(string.Format(Resources.DuckTyping_NotASubtypeOf, objType.FullName, baseObjectType.FullName), "obj");
+
+			var duckType = GetDuckType(interfaceType, baseObjectType);
+
+			if (duckType == null)
+				return null;
+
+			var duck = TypeAccessor.CreateInstanceEx(duckType);
+
+			((DuckType)duck).SetObjects(obj);
+
+			return duck;
+		}
+
+		/// <summary>
+		/// Implements the requested interface.
+		/// If the supplied object implements the interface, the object itself will be returned.
+		/// Otherwise a convenient duck object will be created.
+		/// </summary>
+		/// <param name="interfaceType">An interface type to implement.</param>
+		/// <param name="obj">An object which type expected to have all members of the given interface.</param>
+		/// <returns>An object which implements the interface.</returns>
+		public static object Implement(Type interfaceType, object obj)
+		{
+			return Implement(interfaceType, null, obj);
+		}
+
+		/// <summary>
+		/// Implements the requested interface for all supplied objects.
+		/// If any of supplied object implements the interface, the object itself will be returned.
+		/// Otherwise a convenient duck object will be created.
+		/// </summary>
+		/// <param name="interfaceType">An interface type to implement.</param>
+		/// <param name="baseObjectType">Any type which has all members of the given interface.
+		/// When this parameter is set to null, the object type will be used.</param>
+		/// <param name="objects">An object array which types expected to have all members of the given interface.
+		/// All objects may have different types.</param>
+		/// <returns>An array of object which implements the interface.</returns>
+		public static object[] Implement(Type interfaceType, Type baseObjectType, params object[] objects)
+		{
+			if (objects == null) throw new ArgumentNullException("objects");
+
+			object[] result = new object[objects.Length];
+	
+			for (int i = 0; i < objects.Length; i++)
+				result[i] = Implement(interfaceType, baseObjectType, objects[i]);
+
+			return result;
+		}
+
+		/// <summary>
+		/// Implements the requested interface for all supplied objects.
+		/// If any of supplied object implements the interface, the object itself will be returned.
+		/// Otherwise a convenient duck object will be created.
+		/// </summary>
+		/// <param name="interfaceType">An interface type to implement.</param>
+		/// <param name="objects">An object array which types expected to have all members of the given interface.
+		/// All objects may have different types.</param>
+		/// <returns>An array of object which implements the interface.</returns>
+		public static object[] Implement(Type interfaceType, params object[] objects)
+		{
+			return Implement(interfaceType, (Type)null, objects);
+		}
+
+		/// <summary>
+		/// Implements the requested interface for supplied object.
+		/// If the supplied object implements the interface, the object itself will be returned.
+		/// Otherwise a convenient duck object will be created.
+		/// </summary>
+		/// <typeparam name="I">An interface type to implement.</typeparam>
+		/// <param name="obj">An object which type expected to have all members of the given interface.</param>
+		/// <returns>An object which implements the interface.</returns>
+		public static I Implement<I>(object obj)
+			where I : class
+		{
+			return (I)Implement(typeof(I), null, obj);
+		}
+
+		/// <summary>
+		/// Implements the requested interface for supplied object.
+		/// If the supplied object implements the interface, the object itself will be returned.
+		/// Otherwise a convenient duck object will be created.
+		/// </summary>
+		/// <typeparam name="I">An interface type to implement.</typeparam>
+		/// <typeparam name="T">Any type which has all members of the given interface.</typeparam>
+		/// <param name="obj">An object which type expected to have all members of the given interface.</param>
+		/// <returns>An object which implements the interface.</returns>
+		public static I Implement<I,T>(T obj)
+			where I : class
+		{
+			return (I)Implement(typeof(I), typeof(T), obj);
+		}
+
+		/// <summary>
+		/// Implements the requested interface for all supplied objects.
+		/// If any of supplied object implements the interface, the object itself will be returned.
+		/// Otherwise a convenient duck object will be created.
+		/// </summary>
+		/// <typeparam name="I">An interface type to implement.</typeparam>
+		/// <param name="objects">An object array which types expected to have all members of the given interface.
+		/// All objects may have different types.</param>
+		/// <returns>An array of object which implements the interface.</returns>
+		public static I[] Implement<I>(params object[] objects)
+			where I : class
+		{
+			if (objects == null) throw new ArgumentNullException("objects");
+
+			I[] result = new I[objects.Length];
+
+			for (int i = 0; i < objects.Length; i++)
+				result[i] = Implement<I>(objects[i]);
+
+			return result;
+		}
+
+		/// <summary>
+		/// Implements the requested interface for all supplied objects.
+		/// If any of supplied object implements the interface, the object itself will be returned.
+		/// Otherwise a convenient duck object will be created.
+		/// </summary>
+		/// <typeparam name="I">An interface type to implement.</typeparam>
+		/// <typeparam name="T">Any type which has all members of the given interface.</typeparam>
+		/// <param name="objects">An object array which types expected to have all members of the given interface.
+		/// All objects may have different types.</param>
+		/// <returns>An array of object which implements the interface.</returns>
+		public static I[] Implement<I,T>(params T[] objects)
+			where I : class
+		{
+			if (objects == null) throw new ArgumentNullException("objects");
+
+			I[] result = new I[objects.Length];
+
+			for (int i = 0; i < objects.Length; i++)
+				result[i] = Implement<I,T>(objects[i]);
+
+			return result;
+		}
+
+		private static bool _allowStaticMembers;
+		public  static bool  AllowStaticMembers
+		{
+			get { return _allowStaticMembers;  }
+			set { _allowStaticMembers = value; }
+		}
+
+		#endregion
+
+		#region Multiple Duck
+
+		/// <summary>
+		/// Build a proxy type which implements the requested interface by redirecting all calls to the supplied object type.
+		/// </summary>
+		/// <param name="interfaceType">An interface type to implement.</param>
+		/// <param name="objectTypes">Array of types which expected to have all members of the given interface.</param>
+		/// <returns>The duck object type.</returns>
+		public static Type GetDuckType(Type interfaceType, Type[] objectTypes)
+		{
+			if (interfaceType == null)      throw new ArgumentNullException("interfaceType");
+			if (!interfaceType.IsInterface) throw new ArgumentException(Resources.DuckTyping_InterfaceTypeMustBeAnInterface, "interfaceType");
+			if (!interfaceType.IsPublic && !interfaceType.IsNestedPublic)
+				throw new ArgumentException(Resources.DuckTyping_InterfaceMustBePublic, "interfaceType");
+
+			Dictionary<object,Type> types;
+
+			lock (_duckTypes)
+				if (!_duckTypes.TryGetValue(interfaceType, out types))
+					_duckTypes.Add(interfaceType, types = new Dictionary<object,Type>());
+
+			object key = new CompoundValue(objectTypes);
+			Type   type;
+
+			lock (types) if (!types.TryGetValue(key, out type))
+			{
+				type = TypeFactory.GetType(
+					new CompoundValue(interfaceType, key),
+					interfaceType,
+					new DuckTypeBuilder(MustImplementAttribute.Aggregate, interfaceType, objectTypes));
+
+				types.Add(key, type);
+			}
+
+			return type;
+		}
+
+		/// <summary>
+		/// Implements the requested interface from supplied set of objects.
+		/// </summary>
+		/// <param name="interfaceType">An interface type to implement.</param>
+		/// <param name="baseObjectTypes">Array of types which have all members of the given interface.
+		/// When this parameter is set to null, the object type will be used.</param>
+		/// <param name="objs">Array of objects which types expected to have all members of the given interface.</param>
+		/// <returns>An object which implements the interface.</returns>
+		public static object Aggregate(Type interfaceType, Type[] baseObjectTypes,params object[] objs)
+		{
+			if (objs == null) throw new ArgumentNullException("objs");
+
+			if (baseObjectTypes == null)
+			{
+				baseObjectTypes = new Type[objs.Length];
+
+				for (int i = 0; i < objs.Length; i++)
+					if (objs[i] != null)
+						baseObjectTypes[i] = objs[i].GetType();
+			}
+			else
+			{
+				if (baseObjectTypes.Length != objs.Length)
+					throw new ArgumentException(Resources.DuckTyping_InvalidNumberOfObjs, "baseObjectTypes");
+
+				for (int i = 0; i < objs.Length; i++)
+				{
+					Type objType = objs[i].GetType();
+
+					if (!TypeHelper.IsSameOrParent(baseObjectTypes[i], objType))
+						throw new ArgumentException(
+							string.Format(Resources.DuckTyping_NotASubtypeOf, objType.FullName, baseObjectTypes[i].FullName), "objs");
+				}
+			}
+
+			Type duckType = GetDuckType(interfaceType, baseObjectTypes);
+
+			if (duckType == null)
+				return null;
+
+			object duck = TypeAccessor.CreateInstanceEx(duckType);
+
+			((DuckType)duck).SetObjects(objs);
+
+			return duck;
+		}
+
+		/// <summary>
+		/// Implements the requested interface from supplied set of objects.
+		/// </summary>
+		/// <param name="interfaceType">An interface type to implement.</param>
+		/// <param name="objs">Array of object which types expected to have of the given interface.</param>
+		/// <returns>An object which implements the interface.</returns>
+		public static object Aggregate(Type interfaceType,params object[] objs)
+		{
+			return Aggregate(interfaceType, (Type[])null, objs);
+		}
+
+		/// <summary>
+		/// Implements the requested interface from supplied set of objects.
+		/// </summary>
+		/// <typeparam name="I">An interface type to implement.</typeparam>
+		/// <param name="objs">Array of object which type expected to have all members of the given interface.</param>
+		/// <returns>An object which implements the interface.</returns>
+		public static I Aggregate<I>(params object[] objs)
+			where I : class
+		{
+			return (I)Aggregate(typeof(I), null, objs);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Patterns/MustImplementAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,66 @@
+using System;
+
+namespace BLToolkit.Patterns
+{
+	[AttributeUsage(AttributeTargets.Interface | AttributeTargets.Method | AttributeTargets.Property)]
+	public sealed class MustImplementAttribute : Attribute
+	{
+		public MustImplementAttribute(bool implement, bool throwException, string exceptionMessage)
+		{
+			_implement        = implement;
+			_throwException   = throwException;
+			_exceptionMessage = exceptionMessage;
+		}
+
+		public MustImplementAttribute(bool implement, bool throwException)
+			: this(implement, throwException, null)
+		{
+		}
+
+		public MustImplementAttribute(bool implement, string exceptionMessage)
+			: this(implement, true, exceptionMessage)
+		{
+		}
+
+		public MustImplementAttribute(bool implement)
+			: this(implement, true, null)
+		{
+		}
+
+		public MustImplementAttribute()
+			: this(true, true, null)
+		{
+		}
+
+		private readonly bool _implement;
+		public           bool  Implement
+		{
+			get { return _implement;  }
+		}
+
+		private bool _throwException;
+		public  bool  ThrowException
+		{
+			get { return _throwException;  }
+			set { _throwException = value; }
+		}
+
+		private string _exceptionMessage;
+		public  string  ExceptionMessage
+		{
+			get { return _exceptionMessage;  }
+			set { _exceptionMessage = value; }
+		}
+
+		/// <summary>
+		/// All methods are optional and throws <see cref="NotImplementedException"/> at run tune.
+		/// </summary>
+		public static readonly MustImplementAttribute Default   = new MustImplementAttribute(false, true, null);
+
+		/// <summary>
+		/// All methods are optional and does nothing at run tune.
+		/// Return value and all output parameters will be set to appropriate default values.
+		/// </summary>
+		public static readonly MustImplementAttribute Aggregate = new MustImplementAttribute(false, false, null);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,49 @@
+using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Resources;
+
+using BLToolkit;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle        (BLToolkitConstants.ProductName)]
+[assembly: AssemblyDescription  (BLToolkitConstants.ProductDescription)]
+[assembly: AssemblyProduct      (BLToolkitConstants.ProductName)]
+[assembly: AssemblyCopyright    (BLToolkitConstants.Copyright)]
+[assembly: AssemblyCulture      ("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany      (BLToolkitConstants.ProductName)]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM componenets.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("9a7e41f3-ca15-4dc5-b724-65b7cdbbdcd1")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion    (BLToolkitConstants.FullVersionString)]
+[assembly: AssemblyFileVersion(BLToolkitConstants.FullVersionString)]
+
+// The AllowPartiallyTrustedCallersAttribute requires the assembly to be signed with a strong name key.
+// This attribute is necessary since the control is called by either an intranet or Internet
+// Web page that should be running under restricted permissions.
+#if !SILVERLIGHT
+[assembly: AllowPartiallyTrustedCallers]
+//[assembly: SecurityRules(SecurityRuleSet.Level2, SkipVerificationInFullTrust = true)]
+#endif
+
+[assembly: CLSCompliant(true)]
+[assembly: NeutralResourcesLanguageAttribute("en-US")]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Properties/BLToolkitConstants.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,39 @@
+using System;
+
+namespace BLToolkit
+{
+	/// <summary>
+	/// Global library constants.
+	/// </summary>
+	public static partial class BLToolkitConstants
+	{
+		/// <summary>
+		/// Major component of version.
+		/// </summary>
+		public const string MajorVersion = "4";
+
+		/// <summary>
+		/// Minor component of version.
+		/// </summary>
+		public const string MinorVersion = "1";
+
+		/// <summary>
+		/// Build component of version.
+		/// </summary>
+		public const string Build = "21";
+
+		/// <summary>
+		/// Full version string.
+		/// </summary>
+		public const string FullVersionString = MajorVersion + "." + MinorVersion + "." + Build + "." + Revision;
+
+		/// <summary>
+		/// Full BLT version.
+		/// </summary>
+		public static readonly Version FullVersion = new Version(FullVersionString);
+
+		public const string ProductName        = "BLToolkit";
+		public const string ProductDescription = "Business Logic Toolkit for .NET";
+		public const string Copyright          = "\xA9 2002-2013 www.bltoolkit.net";
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Properties/JetBrains.Annotations.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,281 @@
+using System;
+using System.Collections.Generic;
+
+namespace JetBrains.Annotations
+{
+	/// <summary>
+	/// Indicates that marked method builds string by format pattern and (optional) arguments. 
+	/// Parameter, which contains format string, should be given in constructor.
+	/// The format string should be in <see cref="string.Format(IFormatProvider,string,object[])"/> -like form
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Constructor | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
+	internal sealed class StringFormatMethodAttribute : Attribute
+	{
+		private readonly string _formatParameterName;
+
+		/// <summary>
+		/// Initializes new instance of StringFormatMethodAttribute
+		/// </summary>
+		/// <param name="formatParameterName">Specifies which parameter of an annotated method should be treated as format-string</param>
+		public StringFormatMethodAttribute(string formatParameterName)
+		{
+			_formatParameterName = formatParameterName;
+		}
+
+		/// <summary>
+		/// Gets format parameter name
+		/// </summary>
+		public string FormatParameterName
+		{
+			get { return _formatParameterName; }
+		}
+	}
+
+	/// <summary>
+	/// Indicates that the function argument should be string literal and match one  of the parameters of the caller function.
+	/// For example, <see cref="ArgumentNullException"/> has such parameter.
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)]
+	internal sealed class InvokerParameterNameAttribute : Attribute
+	{
+	}
+
+	/// <summary>
+	/// Indicates that the marked method is assertion method, i.e. it halts control flow if one of the conditions is satisfied. 
+	/// To set the condition, mark one of the parameters with <see cref="AssertionConditionAttribute"/> attribute
+	/// </summary>
+	/// <seealso cref="AssertionConditionAttribute"/>
+	[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
+	internal sealed class AssertionMethodAttribute : Attribute
+	{
+	}
+
+	/// <summary>
+	/// Indicates the condition parameter of the assertion method. 
+	/// The method itself should be marked by <see cref="AssertionMethodAttribute"/> attribute.
+	/// The mandatory argument of the attribute is the assertion type.
+	/// </summary>
+	/// <seealso cref="AssertionConditionType"/>
+	[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)]
+	internal sealed class AssertionConditionAttribute : Attribute
+	{
+		private readonly AssertionConditionType _conditionType;
+
+		/// <summary>
+		/// Initializes new instance of AssertionConditionAttribute
+		/// </summary>
+		/// <param name="conditionType">Specifies condition type</param>
+		public AssertionConditionAttribute(AssertionConditionType conditionType)
+		{
+			_conditionType = conditionType;
+		}
+
+		/// <summary>
+		/// Gets condition type
+		/// </summary>
+		public AssertionConditionType ConditionType
+		{
+			get { return _conditionType; }
+		}
+	}
+
+	/// <summary>
+	/// Specifies assertion type. If the assertion method argument satisifes the condition, then the execution continues. 
+	/// Otherwise, execution is assumed to be halted
+	/// </summary>
+	internal enum AssertionConditionType
+	{
+		/// <summary>
+		/// Indicates that the marked parameter should be evaluated to true
+		/// </summary>
+		IS_TRUE = 0,
+
+		/// <summary>
+		/// Indicates that the marked parameter should be evaluated to false
+		/// </summary>
+		IS_FALSE = 1,
+
+		/// <summary>
+		/// Indicates that the marked parameter should be evaluated to null value
+		/// </summary>
+		IS_NULL = 2,
+
+		/// <summary>
+		/// Indicates that the marked parameter should be evaluated to not null value
+		/// </summary>
+		IS_NOT_NULL = 3,
+	}
+
+	/// <summary>
+	/// Indicates that the marked method unconditionally terminates control flow execution.
+	/// For example, it could unconditionally throw exception
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
+	internal sealed class TerminatesProgramAttribute : Attribute
+	{
+	}
+
+	/// <summary>
+	/// Indicates that the value of marked element could be <c>null</c> sometimes, so the check for <c>null</c> is necessary before its usage
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Delegate | AttributeTargets.Field, AllowMultiple = false, Inherited = true)]
+	internal sealed class CanBeNullAttribute : Attribute
+	{
+	}
+
+	/// <summary>
+	/// Indicates that the value of marked element could never be <c>null</c>
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Delegate | AttributeTargets.Field, AllowMultiple = false, Inherited = true)]
+	internal sealed class NotNullAttribute : Attribute
+	{
+	}
+
+	/// <summary>
+	/// Indicates that the value of marked type (or its derivatives) cannot be compared using '==' or '!=' operators.
+	/// There is only exception to compare with <c>null</c>, it is permitted
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Interface | AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = false, Inherited = true)]
+	internal sealed class CannotApplyEqualityOperatorAttribute : Attribute
+	{
+	}
+
+	/// <summary>
+	/// When applied to target attribute, specifies a requirement for any type which is marked with 
+	/// target attribute to implement or inherit specific type or types
+	/// </summary>
+	/// <example>
+	/// <code>
+	/// [BaseTypeRequired(typeof(IComponent)] // Specify requirement
+	/// public class ComponentAttribute : Attribute 
+	/// {}
+	/// 
+	/// [Component] // ComponentAttribute requires implementing IComponent interface
+	/// public class MyComponent : IComponent
+	/// {}
+	/// </code>
+	/// </example>
+	[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
+	[BaseTypeRequired(typeof(Attribute))]
+	internal sealed class BaseTypeRequiredAttribute : Attribute
+	{
+		private readonly Type[] _baseTypes;
+
+		/// <summary>
+		/// Initializes new instance of BaseTypeRequiredAttribute
+		/// </summary>
+		/// <param name="baseType">Specifies which types are required</param>
+		public BaseTypeRequiredAttribute(Type baseType)
+			: this(new Type[] { baseType })
+		{
+		}
+
+		/// <summary>
+		/// Initializes new instance of BaseTypeRequiredAttribute
+		/// </summary>
+		/// <param name="baseTypes">Specifies which types are required</param>
+		public BaseTypeRequiredAttribute(params Type[] baseTypes)
+		{
+			_baseTypes = baseTypes;
+		}
+
+		/// <summary>
+		/// Gets enumerations of specified base types
+		/// </summary>
+		public IEnumerable<Type> BaseTypes
+		{
+			get { return _baseTypes; }
+		}
+	}
+
+	/// <summary>
+	/// Indicates that the marked symbol is used implicitly (e.g. via reflection, in external library),
+	/// so this symbol will not be marked as unused (as well as by other usage inspections)
+	/// </summary>
+	[AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = false)]
+	internal class UsedImplicitlyAttribute : Attribute
+	{
+		readonly ImplicitUseFlags _flags;
+		/// <summary>
+		/// Gets value indicating what is meant to be used
+		/// </summary>
+		[UsedImplicitly]
+		public ImplicitUseFlags Flags
+		{
+			get { return _flags; }
+		}
+
+		/// <summary>
+		/// Initializes new instance of UsedImplicitlyAttribute
+		/// </summary>
+		public UsedImplicitlyAttribute()
+			: this(ImplicitUseFlags.Default)
+		{
+		}
+
+		/// <summary>
+		/// Initializes new instance of UsedImplicitlyAttribute with specified flags
+		/// </summary>
+		/// <param name="flags">Value of type <see cref="ImplicitUseFlags"/> indicating usage kind</param>
+		public UsedImplicitlyAttribute(ImplicitUseFlags flags)
+		{
+			_flags = flags;
+		}
+	}
+
+	/// <summary>
+	/// Should be used on attributes and causes ReSharper to not mark symbols marked with such attributes as unused (as well as by other usage inspections)
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
+	internal class MeansImplicitUseAttribute : Attribute
+	{
+		readonly ImplicitUseFlags _flags;
+		/// <summary>
+		/// Gets value indicating what is meant to be used
+		/// </summary>
+		[UsedImplicitly]
+		public ImplicitUseFlags Flags
+		{
+			get { return _flags; }
+		}
+
+		/// <summary>
+		/// Initializes new instance of MeansImplicitUseAttribute
+		/// </summary>
+		[UsedImplicitly]
+		public MeansImplicitUseAttribute()
+			: this(ImplicitUseFlags.Default)
+		{
+		}
+
+		/// <summary>
+		/// Initializes new instance of MeansImplicitUseAttribute with specified flags
+		/// </summary>
+		/// <param name="flags">Value of type <see cref="ImplicitUseFlags"/> indicating usage kind</param>
+		[UsedImplicitly]
+		public MeansImplicitUseAttribute(ImplicitUseFlags flags)
+		{
+			_flags = flags;
+		}
+	}
+
+	/// <summary>
+	/// Specify what is considered used implicitly when marked with <see cref="MeansImplicitUseAttribute"/> or <see cref="UsedImplicitlyAttribute"/>
+	/// </summary>
+	[Flags]
+	internal enum ImplicitUseFlags
+	{
+		/// <summary>
+		/// Only entity marked with attribute considered used
+		/// </summary>
+		Default = 0,
+
+		/// <summary>
+		/// Entity marked with attribute and all its members considered used
+		/// </summary>
+		IncludeMembers = 1
+	}
+
+    [AttributeUsage(AttributeTargets.Parameter, Inherited = true)]
+    internal sealed class InstantHandleAttribute : Attribute { }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Properties/Resources.Designer.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,585 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.1
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace BLToolkit.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("BLToolkit.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to The &apos;{0}&apos; must be an interface..
+        /// </summary>
+        internal static string AbstractClassBuilder_TypeIsNotAnInterface {
+            get {
+                return ResourceManager.GetString("AbstractClassBuilder_TypeIsNotAnInterface", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Can not figure out the target method for the method &apos;{0}.{1}&apos;..
+        /// </summary>
+        internal static string AsyncAspectBuilder_NoTargetMethod {
+            get {
+                return ResourceManager.GetString("AsyncAspectBuilder_NoTargetMethod", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Parameter &apos;cacheAspectType&apos; must be of CacheAspect type.
+        /// </summary>
+        internal static string CacheAttribute_ParentTypeConstraintViolated {
+            get {
+                return ResourceManager.GetString("CacheAttribute_ParentTypeConstraintViolated", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Invalid cast from {0} to {1}.
+        /// </summary>
+        internal static string Convert_InvalidCast {
+            get {
+                return ResourceManager.GetString("Convert_InvalidCast", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Index has more then one field for the method &apos;{0}.{1}&apos;. Use CompoundValue as the Key type.
+        /// </summary>
+        internal static string DataAccessor_IndexIsComplex {
+            get {
+                return ResourceManager.GetString("DataAccessor_IndexIsComplex", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Key type for the method &apos;{0}.{1}&apos; can be of type object or CompoundValue..
+        /// </summary>
+        internal static string DataAccessor_InvalidKeyType {
+            get {
+                return ResourceManager.GetString("DataAccessor_InvalidKeyType", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Index is not defined for the method &apos;{0}.{1}&apos;..
+        /// </summary>
+        internal static string DataAccessor_UnknownIndex {
+            get {
+                return ResourceManager.GetString("DataAccessor_UnknownIndex", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to DbManager object is not provided..
+        /// </summary>
+        internal static string DataAccessorBase_NoDbManager {
+            get {
+                return ResourceManager.GetString("DataAccessorBase_NoDbManager", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Key type for the method &apos;{0}.{1}&apos; can be of type object, CompoundValue, or a scalar type..
+        /// </summary>
+        internal static string DataAccessorBuilder_BadKeyType {
+            get {
+                return ResourceManager.GetString("DataAccessorBuilder_BadKeyType", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Can not determine object type for the method &apos;{0}.{1}&apos;.
+        /// </summary>
+        internal static string DataAccessorBuilder_BadListItemType {
+            get {
+                return ResourceManager.GetString("DataAccessorBuilder_BadListItemType", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Cannot create an instance of the type &apos;{0}&apos;.
+        /// </summary>
+        internal static string DataAccessorBuilder_CantCreateTypeInstance {
+            get {
+                return ResourceManager.GetString("DataAccessorBuilder_CantCreateTypeInstance", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to ExecuteNonQuery does not support the Destination attribute.
+        /// </summary>
+        internal static string DataAccessorBuilder_CantExecuteNonQueryToDestination {
+            get {
+                return ResourceManager.GetString("DataAccessorBuilder_CantExecuteNonQueryToDestination", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to DataSetTable attribute for method &apos;{0}.{1}&apos; may not be an index.
+        /// </summary>
+        internal static string DataAccessorBuilder_DataSetTableMustBeByName {
+            get {
+                return ResourceManager.GetString("DataAccessorBuilder_DataSetTableMustBeByName", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to The type &apos;{0}&apos; does not have &apos;Equals&apos; method.
+        /// </summary>
+        internal static string DataAccessorBuilder_EqualsMethodIsNotPublic {
+            get {
+                return ResourceManager.GetString("DataAccessorBuilder_EqualsMethodIsNotPublic", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to The return type &apos;{0}&apos; of the method &apos;{1}&apos; is incompatible with the destination parameter type &apos;{2}&apos;..
+        /// </summary>
+        internal static string DataAccessorBuilder_IncompatibleDestinationType {
+            get {
+                return ResourceManager.GetString("DataAccessorBuilder_IncompatibleDestinationType", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to ExecuteScalar destination must be an out or a ref parameter..
+        /// </summary>
+        internal static string DataAccessorBuilder_ScalarDestinationIsNotByRef {
+            get {
+                return ResourceManager.GetString("DataAccessorBuilder_ScalarDestinationIsNotByRef", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Scalar field name is not defined for the method &apos;{0}.{1}&apos;..
+        /// </summary>
+        internal static string DataAccessorBuilder_ScalarFieldNameMissing {
+            get {
+                return ResourceManager.GetString("DataAccessorBuilder_ScalarFieldNameMissing", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to More then one parameter is marked as destination.
+        /// </summary>
+        internal static string DataAccessorBuilderTooManyDestinations {
+            get {
+                return ResourceManager.GetString("DataAccessorBuilderTooManyDestinations", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to No such parameter: &apos;{0}&apos;.
+        /// </summary>
+        internal static string DataAccessot_ParameterNotFound {
+            get {
+                return ResourceManager.GetString("DataAccessot_ParameterNotFound", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to DataSet must be initialized before calling Update routine. Cannot update database from a null dataset..
+        /// </summary>
+        internal static string DbManager_CannotUpdateNullDataset {
+            get {
+                return ResourceManager.GetString("DbManager_CannotUpdateNullDataset", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to DataTable must be initialized before calling Update routine. Cannot update database from a null data table..
+        /// </summary>
+        internal static string DbManager_CannotUpdateNullDataTable {
+            get {
+                return ResourceManager.GetString("DbManager_CannotUpdateNullDataTable", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to The connection does not match the data provider type..
+        /// </summary>
+        internal static string DbManager_ConnectionTypeMismatch {
+            get {
+                return ResourceManager.GetString("DbManager_ConnectionTypeMismatch", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to dataProvider.ConnectionType must be a valid connection type.
+        /// </summary>
+        internal static string DbManager_InvalidDataProviderConnectionType {
+            get {
+                return ResourceManager.GetString("DbManager_InvalidDataProviderConnectionType", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to dataProvider.Name must be a valid string.
+        /// </summary>
+        internal static string DbManager_InvalidDataProviderName {
+            get {
+                return ResourceManager.GetString("DbManager_InvalidDataProviderName", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to dataProvider.ProviderName must be a valid string.
+        /// </summary>
+        internal static string DbManager_InvalidDataProviderProviderName {
+            get {
+                return ResourceManager.GetString("DbManager_InvalidDataProviderProviderName", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to providerName must be a valid string.
+        /// </summary>
+        internal static string DbManager_InvalidProviderName {
+            get {
+                return ResourceManager.GetString("DbManager_InvalidProviderName", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Parameter count does not match Parameter Value count..
+        /// </summary>
+        internal static string DbManager_MismatchParameterCount {
+            get {
+                return ResourceManager.GetString("DbManager_MismatchParameterCount", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Both `{0}&apos; and `{1}&apos; data providers are default.
+        /// </summary>
+        internal static string DbManager_MoreThenOneDefaultProvider {
+            get {
+                return ResourceManager.GetString("DbManager_MoreThenOneDefaultProvider", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Only objects of type IDbDataParameter or arrays of IDbDataParameter are supported.
+        /// </summary>
+        internal static string DbManager_NotDbDataParameter {
+            get {
+                return ResourceManager.GetString("DbManager_NotDbDataParameter", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to The &apos;{0}&apos; key does not exist in the configuration file..
+        /// </summary>
+        internal static string DbManager_UnknownConfiguration {
+            get {
+                return ResourceManager.GetString("DbManager_UnknownConfiguration", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to The &apos;{0}&apos; type of the connection could not be recognized..
+        /// </summary>
+        internal static string DbManager_UnknownConnectionType {
+            get {
+                return ResourceManager.GetString("DbManager_UnknownConnectionType", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to A suitable data provider is not available for configuration &apos;{0}&apos;..
+        /// </summary>
+        internal static string DbManager_UnknownDataProvider {
+            get {
+                return ResourceManager.GetString("DbManager_UnknownDataProvider", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to The interface must be public..
+        /// </summary>
+        internal static string DuckTyping_InterfaceMustBePublic {
+            get {
+                return ResourceManager.GetString("DuckTyping_InterfaceMustBePublic", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &apos;interfaceType&apos; must be an interface..
+        /// </summary>
+        internal static string DuckTyping_InterfaceTypeMustBeAnInterface {
+            get {
+                return ResourceManager.GetString("DuckTyping_InterfaceTypeMustBeAnInterface", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Invalid number of &apos;baseObjectTypes&apos; or &apos;objs&apos;..
+        /// </summary>
+        internal static string DuckTyping_InvalidNumberOfObjs {
+            get {
+                return ResourceManager.GetString("DuckTyping_InvalidNumberOfObjs", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to &apos;{0}&apos; is not a subtype of &apos;{1}&apos;..
+        /// </summary>
+        internal static string DuckTyping_NotASubtypeOf {
+            get {
+                return ResourceManager.GetString("DuckTyping_NotASubtypeOf", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Failed to query type &apos;{0}&apos; for method &apos;{1}&apos;..
+        /// </summary>
+        internal static string EmitHelper_NoSuchMethod {
+            get {
+                return ResourceManager.GetString("EmitHelper_NoSuchMethod", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Type &apos;{0}&apos; is not expected..
+        /// </summary>
+        internal static string EmitHelper_NotExpectedType {
+            get {
+                return ResourceManager.GetString("EmitHelper_NotExpectedType", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to MethodInfo can not be changed..
+        /// </summary>
+        internal static string InterceptCallInfo_CallMethodInfoIsNotMutable {
+            get {
+                return ResourceManager.GetString("InterceptCallInfo_CallMethodInfoIsNotMutable", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Type &apos;{0}&apos; does not contain field &apos;{1}&apos;..
+        /// </summary>
+        internal static string MapIndex_BadField {
+            get {
+                return ResourceManager.GetString("MapIndex_BadField", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to At least one field name or index must be specified.
+        /// </summary>
+        internal static string MapIndex_EmptyFields {
+            get {
+                return ResourceManager.GetString("MapIndex_EmptyFields", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to At least one field index must be specified.
+        /// </summary>
+        internal static string MapIndex_EmptyIndices {
+            get {
+                return ResourceManager.GetString("MapIndex_EmptyIndices", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to At least one field name must be specified.
+        /// </summary>
+        internal static string MapIndex_EmptyNames {
+            get {
+                return ResourceManager.GetString("MapIndex_EmptyNames", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Can not convert array of type &apos;{0}&apos; to array of &apos;{1}&apos;..
+        /// </summary>
+        internal static string MappingSchema_IncompatibleArrayTypes {
+            get {
+                return ResourceManager.GetString("MappingSchema_IncompatibleArrayTypes", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to The index parameter must be greater or equal to zero..
+        /// </summary>
+        internal static string NameOrIndexParameter_BadIndex {
+            get {
+                return ResourceManager.GetString("NameOrIndexParameter_BadIndex", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Name must be a valid string..
+        /// </summary>
+        internal static string NameOrIndexParameter_BadName {
+            get {
+                return ResourceManager.GetString("NameOrIndexParameter_BadName", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Can not figure out the overloaded method for the method &apos;{0}.{1}&apos;..
+        /// </summary>
+        internal static string OverloadAspectBuilder_NoOverloadedMethod {
+            get {
+                return ResourceManager.GetString("OverloadAspectBuilder_NoOverloadedMethod", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to The &apos;{0}&apos; type does not have appropriate getter. See &apos;{1}&apos; member &apos;{2}&apos; of &apos;{3}&apos; type..
+        /// </summary>
+        internal static string TypeBuilder_CannotGetGetter {
+            get {
+                return ResourceManager.GetString("TypeBuilder_CannotGetGetter", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to The &apos;{0}&apos; type does not have appropriate setter. See &apos;{1}&apos; member &apos;{2}&apos; of &apos;{3}&apos; type..
+        /// </summary>
+        internal static string TypeBuilder_CannotGetSetter {
+            get {
+                return ResourceManager.GetString("TypeBuilder_CannotGetSetter", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Could not build the &apos;{0}&apos; property of the &apos;{1}&apos; type: generic type &apos;{2}&apos; and it&apos;s generic parameter types should have only one parameter type..
+        /// </summary>
+        internal static string TypeBuilder_GenericShouldBeSingleTyped {
+            get {
+                return ResourceManager.GetString("TypeBuilder_GenericShouldBeSingleTyped", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Could not build the &apos;{0}&apos; type: default constructor not found..
+        /// </summary>
+        internal static string TypeBuilder_NoDefaultCtor {
+            get {
+                return ResourceManager.GetString("TypeBuilder_NoDefaultCtor", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Could not build the &apos;{0}&apos; property of the &apos;{1}&apos; type: type &apos;{2}&apos; has to have constructor taking type &apos;{3}&apos;..
+        /// </summary>
+        internal static string TypeBuilder_PropertyTypeHasNoCtorWithParamType {
+            get {
+                return ResourceManager.GetString("TypeBuilder_PropertyTypeHasNoCtorWithParamType", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Could not build the &apos;{0}&apos; property of the &apos;{1}&apos; type: type &apos;{2}&apos; has to have public constructor..
+        /// </summary>
+        internal static string TypeBuilder_PropertyTypeHasNoPublicCtor {
+            get {
+                return ResourceManager.GetString("TypeBuilder_PropertyTypeHasNoPublicCtor", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Could not build the &apos;{0}&apos; property of the &apos;{1}&apos; type: type &apos;{2}&apos; has to have public default constructor..
+        /// </summary>
+        internal static string TypeBuilder_PropertyTypeHasNoPublicDefaultCtor {
+            get {
+                return ResourceManager.GetString("TypeBuilder_PropertyTypeHasNoPublicDefaultCtor", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Type &apos;{0}&apos; must implement required public method &apos;{1}&apos;.
+        /// </summary>
+        internal static string TypeBuilder_PublicMethodMustBeImplemented {
+            get {
+                return ResourceManager.GetString("TypeBuilder_PublicMethodMustBeImplemented", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Type &apos;{0}&apos; does not implement public method &apos;{1}&apos;.
+        /// </summary>
+        internal static string TypeBuilder_PublicMethodNotImplemented {
+            get {
+                return ResourceManager.GetString("TypeBuilder_PublicMethodNotImplemented", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to The method &apos;{0}&apos; of &apos;{1}&apos; has parameter &apos;{2}&apos; wich can&apos;t be handled. Please specify attrbutes [Parent] or [PropertyInfo] to get access to them..
+        /// </summary>
+        internal static string TypeBuilder_UnknownParameterType {
+            get {
+                return ResourceManager.GetString("TypeBuilder_UnknownParameterType", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Could not build the &apos;{0}&apos; type..
+        /// </summary>
+        internal static string TypeFactory_BuildFailed {
+            get {
+                return ResourceManager.GetString("TypeFactory_BuildFailed", resourceCulture);
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Properties/Resources.resx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,294 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="DbManager_ConnectionTypeMismatch" xml:space="preserve">
+    <value>The connection does not match the data provider type.</value>
+  </data>
+  <data name="DbManager_UnknownDataProvider" xml:space="preserve">
+    <value>A suitable data provider is not available for configuration '{0}'.</value>
+  </data>
+  <data name="DbManager_UnknownConfiguration" xml:space="preserve">
+    <value>The '{0}' key does not exist in the configuration file.</value>
+  </data>
+  <data name="DbManager_UnknownConnectionType" xml:space="preserve">
+    <value>The '{0}' type of the connection could not be recognized.</value>
+  </data>
+  <data name="DbManager_NotDbDataParameter" xml:space="preserve">
+    <value>Only objects of type IDbDataParameter or arrays of IDbDataParameter are supported</value>
+  </data>
+  <data name="DbManager_MismatchParameterCount" xml:space="preserve">
+    <value>Parameter count does not match Parameter Value count.</value>
+  </data>
+  <data name="DbManager_InvalidDataProviderName" xml:space="preserve">
+    <value>dataProvider.Name must be a valid string</value>
+  </data>
+  <data name="DbManager_InvalidDataProviderProviderName" xml:space="preserve">
+    <value>dataProvider.ProviderName must be a valid string</value>
+  </data>
+  <data name="DbManager_InvalidDataProviderConnectionType" xml:space="preserve">
+    <value>dataProvider.ConnectionType must be a valid connection type</value>
+  </data>
+  <data name="DbManager_InvalidProviderName" xml:space="preserve">
+    <value>providerName must be a valid string</value>
+  </data>
+  <data name="DbManager_CannotUpdateNullDataset" xml:space="preserve">
+    <value>DataSet must be initialized before calling Update routine. Cannot update database from a null dataset.</value>
+  </data>
+  <data name="DbManager_CannotUpdateNullDataTable" xml:space="preserve">
+    <value>DataTable must be initialized before calling Update routine. Cannot update database from a null data table.</value>
+  </data>
+  <data name="EmitHelper_NotExpectedType" xml:space="preserve">
+    <value>Type '{0}' is not expected.</value>
+  </data>
+  <data name="EmitHelper_NoSuchMethod" xml:space="preserve">
+    <value>Failed to query type '{0}' for method '{1}'.</value>
+  </data>
+  <data name="Convert_InvalidCast" xml:space="preserve">
+    <value>Invalid cast from {0} to {1}</value>
+  </data>
+  <data name="TypeBuilder_CannotGetGetter" xml:space="preserve">
+    <value>The '{0}' type does not have appropriate getter. See '{1}' member '{2}' of '{3}' type.</value>
+  </data>
+  <data name="TypeBuilder_CannotGetSetter" xml:space="preserve">
+    <value>The '{0}' type does not have appropriate setter. See '{1}' member '{2}' of '{3}' type.</value>
+  </data>
+  <data name="TypeBuilder_UnknownParameterType" xml:space="preserve">
+    <value>The method '{0}' of '{1}' has parameter '{2}' wich can't be handled. Please specify attrbutes [Parent] or [PropertyInfo] to get access to them.</value>
+  </data>
+  <data name="TypeBuilder_NoDefaultCtor" xml:space="preserve">
+    <value>Could not build the '{0}' type: default constructor not found.</value>
+  </data>
+  <data name="TypeBuilder_PropertyTypeHasNoPublicDefaultCtor" xml:space="preserve">
+    <value>Could not build the '{0}' property of the '{1}' type: type '{2}' has to have public default constructor.</value>
+  </data>
+  <data name="TypeBuilder_PropertyTypeHasNoPublicCtor" xml:space="preserve">
+    <value>Could not build the '{0}' property of the '{1}' type: type '{2}' has to have public constructor.</value>
+  </data>
+  <data name="TypeBuilder_PropertyTypeHasNoCtorWithParamType" xml:space="preserve">
+    <value>Could not build the '{0}' property of the '{1}' type: type '{2}' has to have constructor taking type '{3}'.</value>
+  </data>
+  <data name="TypeBuilder_PublicMethodMustBeImplemented" xml:space="preserve">
+    <value>Type '{0}' must implement required public method '{1}'</value>
+  </data>
+  <data name="TypeBuilder_PublicMethodNotImplemented" xml:space="preserve">
+    <value>Type '{0}' does not implement public method '{1}'</value>
+  </data>
+  <data name="DuckTyping_InterfaceMustBePublic" xml:space="preserve">
+    <value>The interface must be public.</value>
+  </data>
+  <data name="DuckTyping_InterfaceTypeMustBeAnInterface" xml:space="preserve">
+    <value>'interfaceType' must be an interface.</value>
+  </data>
+  <data name="DuckTyping_NotASubtypeOf" xml:space="preserve">
+    <value>'{0}' is not a subtype of '{1}'.</value>
+  </data>
+  <data name="DuckTyping_InvalidNumberOfObjs" xml:space="preserve">
+    <value>Invalid number of 'baseObjectTypes' or 'objs'.</value>
+  </data>
+  <data name="MapIndex_EmptyNames" xml:space="preserve">
+    <value>At least one field name must be specified</value>
+  </data>
+  <data name="MapIndex_EmptyIndices" xml:space="preserve">
+    <value>At least one field index must be specified</value>
+  </data>
+  <data name="MapIndex_EmptyFields" xml:space="preserve">
+    <value>At least one field name or index must be specified</value>
+  </data>
+  <data name="MapIndex_BadField" xml:space="preserve">
+    <value>Type '{0}' does not contain field '{1}'.</value>
+  </data>
+  <data name="MappingSchema_IncompatibleArrayTypes" xml:space="preserve">
+    <value>Can not convert array of type '{0}' to array of '{1}'.</value>
+  </data>
+  <data name="AsyncAspectBuilder_NoTargetMethod" xml:space="preserve">
+    <value>Can not figure out the target method for the method '{0}.{1}'.</value>
+  </data>
+  <data name="OverloadAspectBuilder_NoOverloadedMethod" xml:space="preserve">
+    <value>Can not figure out the overloaded method for the method '{0}.{1}'.</value>
+  </data>
+  <data name="DbManager_MoreThenOneDefaultProvider" xml:space="preserve">
+    <value>Both `{0}' and `{1}' data providers are default</value>
+  </data>
+  <data name="TypeFactory_BuildFailed" xml:space="preserve">
+    <value>Could not build the '{0}' type.</value>
+  </data>
+  <data name="AbstractClassBuilder_TypeIsNotAnInterface" xml:space="preserve">
+    <value>The '{0}' must be an interface.</value>
+  </data>
+  <data name="DataAccessor_UnknownIndex" xml:space="preserve">
+    <value>Index is not defined for the method '{0}.{1}'.</value>
+  </data>
+  <data name="DataAccessor_InvalidKeyType" xml:space="preserve">
+    <value>Key type for the method '{0}.{1}' can be of type object or CompoundValue.</value>
+  </data>
+  <data name="DataAccessot_ParameterNotFound" xml:space="preserve">
+    <value>No such parameter: '{0}'</value>
+  </data>
+  <data name="DataAccessor_IndexIsComplex" xml:space="preserve">
+    <value>Index has more then one field for the method '{0}.{1}'. Use CompoundValue as the Key type</value>
+  </data>
+  <data name="DataAccessorBuilder_BadListItemType" xml:space="preserve">
+    <value>Can not determine object type for the method '{0}.{1}'</value>
+  </data>
+  <data name="DataAccessorBuilder_BadKeyType" xml:space="preserve">
+    <value>Key type for the method '{0}.{1}' can be of type object, CompoundValue, or a scalar type.</value>
+  </data>
+  <data name="DataAccessorBuilder_ScalarFieldNameMissing" xml:space="preserve">
+    <value>Scalar field name is not defined for the method '{0}.{1}'.</value>
+  </data>
+  <data name="DataAccessorBuilderTooManyDestinations" xml:space="preserve">
+    <value>More then one parameter is marked as destination</value>
+  </data>
+  <data name="DataAccessorBuilder_DataSetTableMustBeByName" xml:space="preserve">
+    <value>DataSetTable attribute for method '{0}.{1}' may not be an index</value>
+  </data>
+  <data name="DataAccessorBuilder_CantExecuteNonQueryToDestination" xml:space="preserve">
+    <value>ExecuteNonQuery does not support the Destination attribute</value>
+  </data>
+  <data name="DataAccessorBuilder_ScalarDestinationIsNotByRef" xml:space="preserve">
+    <value>ExecuteScalar destination must be an out or a ref parameter.</value>
+  </data>
+  <data name="DataAccessorBuilder_IncompatibleDestinationType" xml:space="preserve">
+    <value>The return type '{0}' of the method '{1}' is incompatible with the destination parameter type '{2}'.</value>
+  </data>
+  <data name="DataAccessorBuilder_CantCreateTypeInstance" xml:space="preserve">
+    <value>Cannot create an instance of the type '{0}'</value>
+  </data>
+  <data name="DataAccessorBuilder_EqualsMethodIsNotPublic" xml:space="preserve">
+    <value>The type '{0}' does not have 'Equals' method</value>
+  </data>
+  <data name="CacheAttribute_ParentTypeConstraintViolated" xml:space="preserve">
+    <value>Parameter 'cacheAspectType' must be of CacheAspect type</value>
+  </data>
+  <data name="InterceptCallInfo_CallMethodInfoIsNotMutable" xml:space="preserve">
+    <value>MethodInfo can not be changed.</value>
+  </data>
+  <data name="NameOrIndexParameter_BadName" xml:space="preserve">
+    <value>Name must be a valid string.</value>
+  </data>
+  <data name="NameOrIndexParameter_BadIndex" xml:space="preserve">
+    <value>The index parameter must be greater or equal to zero.</value>
+  </data>
+  <data name="DataAccessorBase_NoDbManager" xml:space="preserve">
+    <value>DbManager object is not provided.</value>
+  </data>
+  <data name="TypeBuilder_GenericShouldBeSingleTyped" xml:space="preserve">
+    <value>Could not build the '{0}' property of the '{1}' type: generic type '{2}' and it's generic parameter types should have only one parameter type.</value>
+  </data>
+</root>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Properties/Revision.generated.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+// Autogenerated. Do not modify!
+
+namespace BLToolkit
+{
+	partial class BLToolkitConstants
+	{
+		// <summary>
+		// Revision component of version.
+		// <summary>
+		public const string Revision = "0";
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Properties/Revision.tt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,30 @@
+<#@ template language="C#v3.5" debug="True" #>
+<#@ output extension=".generated.cs" #>
+<#@ assembly name="System.Core"      #>
+<#@ import namespace="System.Linq"   #>
+// Autogenerated. Do not modify!
+
+namespace BLToolkit
+{
+	partial class BLToolkitConstants
+	{
+		// <summary>
+		// Revision component of version.
+		// <summary>
+		public const string Revision = "<#= Revision() #>";
+	}
+}
+
+<#+
+string Revision()
+{
+	try
+	{
+		return System.IO.File.ReadAllLines(@"..\..\_svn\entries").ElementAt(3);
+	}
+	catch
+	{
+		return "0";
+	}
+}
+#>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/Emit/AssemblyBuilderHelper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,315 @@
+using System;
+using System.Configuration.Assemblies;
+using System.Reflection;
+using System.Reflection.Emit;
+using System.Security;
+using System.Threading;
+
+namespace BLToolkit.Reflection.Emit
+{
+	/// <summary>
+	/// A wrapper around the <see cref="AssemblyBuilder"/> and <see cref="ModuleBuilder"/> classes.
+	/// </summary>
+	/// <include file="Examples.CS.xml" path='examples/emit[@name="Emit"]/*' />
+	/// <include file="Examples.VB.xml" path='examples/emit[@name="Emit"]/*' />
+	/// <seealso cref="System.Reflection.Emit.AssemblyBuilder">AssemblyBuilder Class</seealso>
+	/// <seealso cref="System.Reflection.Emit.ModuleBuilder">ModuleBuilder Class</seealso>
+	public class AssemblyBuilderHelper
+	{
+		/// <summary>
+		/// Initializes a new instance of the <see cref="AssemblyBuilderHelper"/> class
+		/// with the specified parameters.
+		/// </summary>
+		/// <param name="path">The path where the assembly will be saved.</param>
+		public AssemblyBuilderHelper(string path) : this(path, null, null)
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="AssemblyBuilderHelper"/> class
+		/// with the specified parameters.
+		/// </summary>
+		/// <param name="path">The path where the assembly will be saved.</param>
+		/// <param name="version">The assembly version.</param>
+		/// <param name="keyFile">The key pair file to sign the assembly.</param>
+		public AssemblyBuilderHelper(string path, Version version, string keyFile)
+		{
+			if (path == null) throw new ArgumentNullException("path");
+
+			var idx = path.IndexOf(',');
+
+			if (idx > 0)
+			{
+				path = path.Substring(0, idx);
+
+				if (path.Length >= 200)
+				{
+					idx = path.IndexOf('`');
+
+					if (idx > 0)
+					{
+						var idx2 = path.LastIndexOf('.');
+
+						if (idx2 > 0 && idx2 > idx)
+							path = path.Substring(0, idx + 1) + path.Substring(idx2 + 1);
+					}
+				}
+			}
+
+			path = path.Replace("+", ".").Replace("<", "_").Replace(">", "_");
+
+			if (path.Length >= 260)
+			{
+				path = path.Substring(0, 248);
+
+				for (var i = 0; i < int.MaxValue; i++)
+				{
+					var newPath = string.Format("{0}_{1:0000}.dll", path, i);
+
+					if (!System.IO.File.Exists(newPath))
+					{
+						path = newPath;
+						break;
+					}
+				}
+			}
+
+			var assemblyName = System.IO.Path.GetFileNameWithoutExtension(path);
+			var assemblyDir  = System.IO.Path.GetDirectoryName(path);
+
+			Path               = path;
+			_assemblyName.Name = assemblyName;
+
+			if (version != null)
+				_assemblyName.Version = version;
+
+#if !SILVERLIGHT
+
+			if (!string.IsNullOrEmpty(keyFile))
+			{
+				_assemblyName.Flags        |= AssemblyNameFlags.PublicKey;
+				_assemblyName.KeyPair       = new StrongNameKeyPair(System.IO.File.OpenRead(keyFile));
+				_assemblyName.HashAlgorithm = AssemblyHashAlgorithm.SHA1;
+			}
+
+#endif
+
+#if DEBUG
+			_assemblyName.Flags |= AssemblyNameFlags.EnableJITcompileTracking;
+#else
+			_assemblyName.Flags |= AssemblyNameFlags.EnableJITcompileOptimizer;
+#endif
+
+			_createAssemblyBuilder = _ =>
+			{
+#if SILVERLIGHT
+				_assemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(_assemblyName, AssemblyBuilderAccess.Run);
+#else
+				_assemblyBuilder =
+					string.IsNullOrEmpty(assemblyDir)?
+					Thread.GetDomain().DefineDynamicAssembly(_assemblyName, AssemblyBuilderAccess.RunAndSave):
+					Thread.GetDomain().DefineDynamicAssembly(_assemblyName, AssemblyBuilderAccess.RunAndSave, assemblyDir);
+#endif
+
+				_assemblyBuilder.SetCustomAttribute(BLToolkitAttribute);
+
+#if !SILVERLIGHT
+
+				_assemblyBuilder.SetCustomAttribute(
+					new CustomAttributeBuilder(
+						typeof(AllowPartiallyTrustedCallersAttribute)
+							.GetConstructor(Type.EmptyTypes),
+						new object[0]));
+
+#endif
+			};
+		}
+
+		/// <summary>
+		/// Gets the path where the assembly will be saved.
+		/// </summary>
+		public string Path { get; private set; }
+
+		private readonly AssemblyName _assemblyName = new AssemblyName();
+		/// <summary>
+		/// Gets AssemblyName.
+		/// </summary>
+		public           AssemblyName  AssemblyName
+		{
+			get { return _assemblyName; }
+		}
+
+		readonly Action<int> _createAssemblyBuilder; 
+
+		AssemblyBuilder _assemblyBuilder;
+		/// <summary>
+		/// Gets AssemblyBuilder.
+		/// </summary>
+		public   AssemblyBuilder  AssemblyBuilder
+		{
+			get
+			{
+				if (_assemblyBuilder == null)
+					_createAssemblyBuilder(0);
+				return _assemblyBuilder;
+			}
+		}
+
+		/// <summary>
+		/// Gets the path where the assembly will be saved.
+		/// </summary>
+		public  string  ModulePath
+		{
+			get { return System.IO.Path.GetFileName(Path); }
+		}
+
+		private ModuleBuilder _moduleBuilder;
+		/// <summary>
+		/// Gets ModuleBuilder.
+		/// </summary>
+		public  ModuleBuilder  ModuleBuilder
+		{
+			get 
+			{
+				if (_moduleBuilder == null)
+				{
+					_moduleBuilder = AssemblyBuilder.DefineDynamicModule(ModulePath);
+					_moduleBuilder.SetCustomAttribute(BLToolkitAttribute);
+
+				}
+
+				return _moduleBuilder;
+			}
+		}
+
+		private CustomAttributeBuilder _blToolkitAttribute;
+		/// <summary>
+		/// Retrieves a cached instance of <see cref="BLToolkit.TypeBuilder.BLToolkitGeneratedAttribute"/> builder.
+		/// </summary>
+		public  CustomAttributeBuilder  BLToolkitAttribute
+		{
+			get 
+			{
+				if (_blToolkitAttribute == null)
+				{
+					var at = typeof(TypeBuilder.BLToolkitGeneratedAttribute);
+					var ci = at.GetConstructor(Type.EmptyTypes);
+
+					_blToolkitAttribute = new CustomAttributeBuilder(ci, new object[0]);
+				}
+
+				return _blToolkitAttribute;
+			}
+		}
+
+		/// <summary>
+		/// Converts the supplied <see cref="AssemblyBuilderHelper"/> to a <see cref="AssemblyBuilder"/>.
+		/// </summary>
+		/// <param name="assemblyBuilder">The <see cref="AssemblyBuilderHelper"/>.</param>
+		/// <returns>An <see cref="AssemblyBuilder"/>.</returns>
+		public static implicit operator AssemblyBuilder(AssemblyBuilderHelper assemblyBuilder)
+		{
+			if (assemblyBuilder == null) throw new ArgumentNullException("assemblyBuilder");
+
+			return assemblyBuilder.AssemblyBuilder;
+		}
+
+		/// <summary>
+		/// Converts the supplied <see cref="AssemblyBuilderHelper"/> to a <see cref="ModuleBuilder"/>.
+		/// </summary>
+		/// <param name="assemblyBuilder">The <see cref="AssemblyBuilderHelper"/>.</param>
+		/// <returns>A <see cref="ModuleBuilder"/>.</returns>
+		public static implicit operator ModuleBuilder(AssemblyBuilderHelper assemblyBuilder)
+		{
+			if (assemblyBuilder == null) throw new ArgumentNullException("assemblyBuilder");
+
+			return assemblyBuilder.ModuleBuilder;
+		}
+
+		/// <summary>
+		/// Saves this dynamic assembly to disk.
+		/// </summary>
+		public void Save()
+		{
+#if !SILVERLIGHT
+
+			if (_assemblyBuilder != null)
+				_assemblyBuilder.Save(ModulePath);
+
+#endif
+		}
+
+		#region DefineType Overrides
+
+		/// <summary>
+		/// Constructs a <see cref="TypeBuilderHelper"/> for a type with the specified name.
+		/// </summary>
+		/// <param name="name">The full path of the type.</param>
+		/// <returns>Returns the created <see cref="TypeBuilderHelper"/>.</returns>
+		/// <seealso cref="System.Reflection.Emit.ModuleBuilder.DefineType(string)">ModuleBuilder.DefineType Method</seealso>
+		public TypeBuilderHelper DefineType(string name)
+		{
+			return new TypeBuilderHelper(this, ModuleBuilder.DefineType(name));
+		}
+
+		/// <summary>
+		/// Constructs a <see cref="TypeBuilderHelper"/> for a type with the specified name and base type.
+		/// </summary>
+		/// <param name="name">The full path of the type.</param>
+		/// <param name="parent">The Type that the defined type extends.</param>
+		/// <returns>Returns the created <see cref="TypeBuilderHelper"/>.</returns>
+		/// <seealso cref="System.Reflection.Emit.ModuleBuilder.DefineType(string,TypeAttributes,Type)">ModuleBuilder.DefineType Method</seealso>
+		public TypeBuilderHelper DefineType(string name, Type parent)
+		{
+			return new TypeBuilderHelper(this, ModuleBuilder.DefineType(name, TypeAttributes.Public, parent));
+		}
+
+		/// <summary>
+		/// Constructs a <see cref="TypeBuilderHelper"/> for a type with the specified name, its attributes, and base type.
+		/// </summary>
+		/// <param name="name">The full path of the type.</param>
+		/// <param name="attrs">The attribute to be associated with the type.</param>
+		/// <param name="parent">The Type that the defined type extends.</param>
+		/// <returns>Returns the created <see cref="TypeBuilderHelper"/>.</returns>
+		/// <seealso cref="System.Reflection.Emit.ModuleBuilder.DefineType(string,TypeAttributes,Type)">ModuleBuilder.DefineType Method</seealso>
+		public TypeBuilderHelper DefineType(string name, TypeAttributes attrs, Type parent)
+		{
+			return new TypeBuilderHelper(this, ModuleBuilder.DefineType(name, attrs, parent));
+		}
+
+		/// <summary>
+		/// Constructs a <see cref="TypeBuilderHelper"/> for a type with the specified name, base type,
+		/// and the interfaces that the defined type implements.
+		/// </summary>
+		/// <param name="name">The full path of the type.</param>
+		/// <param name="parent">The Type that the defined type extends.</param>
+		/// <param name="interfaces">The list of interfaces that the type implements.</param>
+		/// <returns>Returns the created <see cref="TypeBuilderHelper"/>.</returns>
+		/// <seealso cref="System.Reflection.Emit.ModuleBuilder.DefineType(string,TypeAttributes,Type,Type[])">ModuleBuilder.DefineType Method</seealso>
+		public TypeBuilderHelper DefineType(string name, Type parent, params Type[] interfaces)
+		{
+			return new TypeBuilderHelper(
+				this,
+				ModuleBuilder.DefineType(name, TypeAttributes.Public, parent, interfaces));
+		}
+
+		/// <summary>
+		/// Constructs a <see cref="TypeBuilderHelper"/> for a type with the specified name, its attributes, base type,
+		/// and the interfaces that the defined type implements.
+		/// </summary>
+		/// <param name="name">The full path of the type.</param>
+		/// <param name="attrs">The attribute to be associated with the type.</param>
+		/// <param name="parent">The Type that the defined type extends.</param>
+		/// <param name="interfaces">The list of interfaces that the type implements.</param>
+		/// <returns>Returns the created <see cref="TypeBuilderHelper"/>.</returns>
+		/// <seealso cref="System.Reflection.Emit.ModuleBuilder.DefineType(string,TypeAttributes,Type,Type[])">ModuleBuilder.DefineType Method</seealso>
+		public TypeBuilderHelper DefineType(string name, TypeAttributes attrs, Type parent, params Type[] interfaces)
+		{
+			return new TypeBuilderHelper(
+				this,
+				ModuleBuilder.DefineType(name, attrs, parent, interfaces));
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/Emit/ConstructorBuilderHelper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,62 @@
+using System;
+using System.Reflection.Emit;
+
+namespace BLToolkit.Reflection.Emit
+{
+	/// <summary>
+	/// A wrapper around the <see cref="ConstructorBuilder"/> class.
+	/// </summary>
+	public class ConstructorBuilderHelper : MethodBuilderBase
+	{
+		/// <summary>
+		/// Initializes a new instance of the <see cref="ConstructorBuilder"/> class
+		/// with the specified parameters.
+		/// </summary>
+		/// <param name="typeBuilder">Associated <see cref="TypeBuilderHelper"/>.</param>
+		/// <param name="constructorBuilder">A <see cref="ConstructorBuilder"/></param>
+		public ConstructorBuilderHelper(TypeBuilderHelper typeBuilder, ConstructorBuilder constructorBuilder)
+			: base(typeBuilder)
+		{
+			if (constructorBuilder == null) throw new ArgumentNullException("constructorBuilder");
+
+			_constructorBuilder = constructorBuilder;
+			_constructorBuilder.SetCustomAttribute(Type.Assembly.BLToolkitAttribute);
+		}
+
+		private readonly ConstructorBuilder _constructorBuilder;
+		/// <summary>
+		/// Gets ConstructorBuilder.
+		/// </summary>
+		public           ConstructorBuilder  ConstructorBuilder
+		{
+			get { return _constructorBuilder; }
+		}
+
+		/// <summary>
+		/// Converts the supplied <see cref="ConstructorBuilderHelper"/> to a <see cref="MethodBuilder"/>.
+		/// </summary>
+		/// <param name="constructorBuilder">The <see cref="ConstructorBuilder"/>.</param>
+		/// <returns>A <see cref="ConstructorBuilder"/>.</returns>
+		public static implicit operator ConstructorBuilder(ConstructorBuilderHelper constructorBuilder)
+		{
+			if (constructorBuilder == null) throw new ArgumentNullException("constructorBuilder");
+
+			return constructorBuilder.ConstructorBuilder;
+		}
+
+		private EmitHelper _emitter;
+		/// <summary>
+		/// Gets <see cref="EmitHelper"/>.
+		/// </summary>
+		public override EmitHelper Emitter
+		{
+			get
+			{
+				if (_emitter == null)
+					_emitter = new EmitHelper(this, _constructorBuilder.GetILGenerator());
+
+				return _emitter;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/Emit/EmitHelper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,3666 @@
+using System;
+using System.Diagnostics.CodeAnalysis;
+using System.Diagnostics.SymbolStore;
+using System.Reflection;
+using System.Reflection.Emit;
+using System.Runtime.InteropServices;
+
+using BLToolkit.Common;
+using BLToolkit.Properties;
+
+// ReSharper disable InconsistentNaming
+
+namespace BLToolkit.Reflection.Emit
+{
+	/// <summary>
+	/// A wrapper around the <see cref="ILGenerator"/> class.
+	/// </summary>
+	/// <include file="Examples.CS.xml" path='examples/emit[@name="Emit"]/*' />
+	/// <include file="Examples.VB.xml" path='examples/emit[@name="Emit"]/*' />
+	/// <seealso cref="System.Reflection.Emit.ILGenerator">ILGenerator Class</seealso>
+	public class EmitHelper
+	{
+		/// <summary>
+		/// Initializes a new instance of the <see cref="EmitHelper"/> class
+		/// with the specified <see cref="System.Reflection.Emit.ILGenerator"/>.
+		/// </summary>
+		/// <param name="ilGenerator">The <see cref="System.Reflection.Emit.ILGenerator"/> to use.</param>
+		public EmitHelper(ILGenerator ilGenerator)
+		{
+			if (ilGenerator == null) throw new ArgumentNullException("ilGenerator");
+
+			_ilGenerator = ilGenerator;
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="EmitHelper"/> class
+		/// with the specified <see cref="System.Reflection.Emit.ILGenerator"/>.
+		/// </summary>
+		/// <param name="methodBuilder">Associated <see cref="MethodBuilderBase"/>.</param>
+		/// <param name="ilGenerator">The <see cref="System.Reflection.Emit.ILGenerator"/> to use.</param>
+		public EmitHelper(MethodBuilderBase methodBuilder, ILGenerator ilGenerator)
+		{
+			if (methodBuilder == null) throw new ArgumentNullException("methodBuilder");
+			if (ilGenerator   == null) throw new ArgumentNullException("ilGenerator");
+
+			_method      = methodBuilder;
+			_ilGenerator = ilGenerator;
+		}
+
+		private readonly MethodBuilderBase _method;
+		/// <summary>
+		/// Gets <see cref="MethodBuilderHelper"/>.
+		/// </summary>
+		public           MethodBuilderBase  Method
+		{
+			get { return _method; }
+		}
+
+		private readonly ILGenerator _ilGenerator;
+		/// <summary>
+		/// Gets MSIL generator.
+		/// </summary>
+		public           ILGenerator  ILGenerator
+		{
+			get { return _ilGenerator; }
+		}
+
+		/// <summary>
+		/// Converts the supplied <see cref="EmitHelper"/> to a <see cref="ILGenerator"/>.
+		/// </summary>
+		/// <param name="emitHelper">The <see cref="EmitHelper"/>.</param>
+		/// <returns>An ILGenerator.</returns>
+		public static implicit operator ILGenerator(EmitHelper emitHelper)
+		{
+			if (emitHelper == null) throw new ArgumentNullException("emitHelper");
+
+			return emitHelper.ILGenerator;
+		}
+
+		#region ILGenerator Methods
+
+		/// <summary>
+		/// Begins a catch block.
+		/// </summary>
+		/// <param name="exceptionType">The Type object that represents the exception.</param>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.BeginCatchBlock(Type)">ILGenerator.BeginCatchBlock Method</seealso>
+		public EmitHelper BeginCatchBlock(Type exceptionType)
+		{
+			_ilGenerator.BeginCatchBlock(exceptionType); return this;
+		}
+
+		/// <summary>
+		/// Begins an exception block for a filtered exception.
+		/// </summary>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.BeginExceptFilterBlock">ILGenerator.BeginCatchBlock Method</seealso>
+		public EmitHelper BeginExceptFilterBlock()
+		{
+			_ilGenerator.BeginExceptFilterBlock(); return this;
+		}
+
+		/// <summary>
+		/// Begins an exception block for a non-filtered exception.
+		/// </summary>
+		/// <returns>The label for the end of the block.</returns>
+		public Label BeginExceptionBlock()
+		{
+			return _ilGenerator.BeginExceptionBlock();
+		}
+
+		/// <summary>
+		/// Begins an exception fault block in the Microsoft intermediate language (MSIL) stream.
+		/// </summary>
+		/// <returns>Current instance of the <see cref="EmitHelper"/>.</returns>
+		public EmitHelper BeginFaultBlock()
+		{
+			_ilGenerator.BeginFaultBlock(); return this;
+		}
+
+		/// <summary>
+		/// Begins a finally block in the Microsoft intermediate language (MSIL) instruction stream.
+		/// </summary>
+		/// <returns>Current instance of the <see cref="EmitHelper"/>.</returns>
+		public EmitHelper BeginFinallyBlock()
+		{
+			_ilGenerator.BeginFinallyBlock(); return this;
+		}
+
+		/// <summary>
+		/// Begins a lexical scope.
+		/// </summary>
+		/// <returns>Current instance of the <see cref="EmitHelper"/>.</returns>
+		public EmitHelper BeginScope()
+		{
+			_ilGenerator.BeginScope(); return this;
+		}
+
+		/// <summary>
+		/// Declares a local variable.
+		/// </summary>
+		/// <param name="localType">The Type of the local variable.</param>
+		/// <returns>The declared local variable.</returns>
+		public LocalBuilder DeclareLocal(Type localType)
+		{
+			return _ilGenerator.DeclareLocal(localType);
+		}
+
+		/// <summary>
+		/// Declares a local variable, optionally pinning the object referred to by the variable.
+		/// </summary>
+		/// <param name="localType">The Type of the local variable.</param>
+		/// <param name="pinned"><b>true</b> to pin the object in memory; otherwise, <b>false</b>.</param>
+		/// <returns>The declared local variable.</returns>
+		public LocalBuilder DeclareLocal(Type localType, bool pinned)
+		{
+			return _ilGenerator.DeclareLocal(localType, pinned);
+		}
+
+		/// <summary>
+		/// Declares a new label.
+		/// </summary>
+		/// <returns>Returns a new label that can be used as a token for branching.</returns>
+		public Label DefineLabel()
+		{
+			return _ilGenerator.DefineLabel();
+		}
+
+		/// <summary>
+		/// Ends an exception block.
+		/// </summary>
+		/// <returns>Current instance of the <see cref="EmitHelper"/>.</returns>
+		public EmitHelper EndExceptionBlock()
+		{
+			_ilGenerator.EndExceptionBlock(); return this;
+		}
+
+		/// <summary>
+		/// Ends a lexical scope.
+		/// </summary>
+		/// <returns>Current instance of the <see cref="EmitHelper"/>.</returns>
+		public EmitHelper EndScope()
+		{
+			_ilGenerator.EndScope(); return this;
+		}
+
+		/// <summary>
+		/// Marks the Microsoft intermediate language (MSIL) stream's current position 
+		/// with the given label.
+		/// </summary>
+		/// <param name="loc">The label for which to set an index.</param>
+		/// <returns>Current instance of the <see cref="EmitHelper"/>.</returns>
+		public EmitHelper MarkLabel(Label loc)
+		{
+			_ilGenerator.MarkLabel(loc); return this;
+		}
+
+		/// <summary>
+		/// Marks a sequence point in the Microsoft intermediate language (MSIL) stream.
+		/// </summary>
+		/// <param name="document">The document for which the sequence point is being defined.</param>
+		/// <param name="startLine">The line where the sequence point begins.</param>
+		/// <param name="startColumn">The column in the line where the sequence point begins.</param>
+		/// <param name="endLine">The line where the sequence point ends.</param>
+		/// <param name="endColumn">The column in the line where the sequence point ends.</param>
+		/// <returns>Current instance of the <see cref="EmitHelper"/>.</returns>
+		public EmitHelper MarkSequencePoint(
+			ISymbolDocumentWriter document,
+			int startLine,
+			int startColumn,
+			int endLine,
+			int endColumn)
+		{
+			_ilGenerator.MarkSequencePoint(document, startLine, startColumn, endLine, endColumn);
+			return this;
+		}
+
+		/// <summary>
+		/// Emits an instruction to throw an exception.
+		/// </summary>
+		/// <param name="exceptionType">The class of the type of exception to throw.</param>
+		/// <returns>Current instance of the <see cref="EmitHelper"/>.</returns>
+		public EmitHelper ThrowException(Type exceptionType)
+		{
+			_ilGenerator.ThrowException(exceptionType); return this;
+		}
+
+		/// <summary>
+		/// Specifies the namespace to be used in evaluating locals and watches for 
+		/// the current active lexical scope.
+		/// </summary>
+		/// <param name="namespaceName">The namespace to be used in evaluating locals and watches for the current active lexical scope.</param>
+		/// <returns>Current instance of the <see cref="EmitHelper"/>.</returns>
+		public EmitHelper UsingNamespace(string namespaceName)
+		{
+			_ilGenerator.UsingNamespace(namespaceName); return this;
+		}
+
+		#endregion
+
+		#region Emit Wrappers
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Add"/>) that
+		/// adds two values and pushes the result onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Add">OpCodes.Add</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper add
+		{
+			get { _ilGenerator.Emit(OpCodes.Add); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Add_Ovf"/>) that
+		/// adds two integers, performs an overflow check, and pushes the result onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Add_Ovf">OpCodes.Add_Ovf</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper add_ovf
+		{
+			get { _ilGenerator.Emit(OpCodes.Add_Ovf); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Add_Ovf_Un"/>) that
+		/// adds two unsigned integer values, performs an overflow check, and pushes the result onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Add_Ovf_Un">OpCodes.Add_Ovf_Un</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper add_ovf_un
+		{
+			get { _ilGenerator.Emit(OpCodes.Add_Ovf_Un); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.And"/>) that
+		/// computes the bitwise AND of two values and pushes the result onto the evalution stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.And">OpCodes.And</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper and
+		{
+			get { _ilGenerator.Emit(OpCodes.And); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Arglist"/>) that
+		/// returns an unmanaged pointer to the argument list of the current method.
+		/// </summary>
+		/// <seealso cref="OpCodes.Arglist">OpCodes.Arglist</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper arglist
+		{
+			get { _ilGenerator.Emit(OpCodes.Arglist); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Beq"/>, label) that
+		/// transfers control to a target instruction if two values are equal.
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Beq">OpCodes.Beq</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper beq(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Beq, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Beq_S"/>, label) that
+		/// transfers control to a target instruction (short form) if two values are equal.
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Beq_S">OpCodes.Beq_S</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper beq_s(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Beq_S, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Bge"/>, label) that
+		/// transfers control to a target instruction if the first value is greater than or equal to the second value.
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Bge">OpCodes.Bge</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper bge(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Bge, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Bge_S"/>, label) that
+		/// transfers control to a target instruction (short form) 
+		/// if the first value is greater than or equal to the second value.
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Bge_S">OpCodes.Bge_S</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper bge_s(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Bge_S, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Bge_Un"/>, label) that
+		/// transfers control to a target instruction if the the first value is greather than the second value,
+		/// when comparing unsigned integer values or unordered float values.
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Bge_Un">OpCodes.Bge_Un</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper bge_un(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Bge_Un, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Bge_Un_S"/>, label) that
+		/// transfers control to a target instruction (short form) if if the the first value is greather than the second value,
+		/// when comparing unsigned integer values or unordered float values.
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Bge_Un_S">OpCodes.Bge_Un_S</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper bge_un_s(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Bge_Un_S, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Bgt"/>, label) that
+		/// transfers control to a target instruction if the first value is greater than the second value.
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Bgt">OpCodes.Bgt</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper bgt(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Bgt, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Bgt_S"/>, label) that
+		/// transfers control to a target instruction (short form) if the first value is greater than the second value.
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Bgt_S">OpCodes.Bgt_S</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper bgt_s(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Bgt_S, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Bgt_Un"/>, label) that
+		/// transfers control to a target instruction if the first value is greater than the second value,
+		/// when comparing unsigned integer values or unordered float values.
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Bgt_Un">OpCodes.Bgt_Un</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper bgt_un(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Bgt_Un, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Bgt_Un_S"/>, label) that
+		/// transfers control to a target instruction (short form) if the first value is greater than the second value,
+		/// when comparing unsigned integer values or unordered float values.
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Bgt_Un_S">OpCodes.Bgt_Un_S</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper bgt_un_s(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Bgt_Un_S, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ble"/>, label) that
+		/// transfers control to a target instruction if the first value is less than or equal to the second value.
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Ble">OpCodes.Ble</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper ble(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Ble, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ble_S"/>, label) that
+		/// transfers control to a target instruction (short form) if the first value is less than or equal to the second value.
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Ble_S">OpCodes.Ble_S</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper ble_s(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Ble_S, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ble_Un"/>, label) that
+		/// transfers control to a target instruction if the first value is less than or equal to the second value,
+		/// when comparing unsigned integer values or unordered float values.
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Ble_Un">OpCodes.Ble_Un</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper ble_un(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Ble_Un, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ble_Un_S"/>, label) that
+		/// transfers control to a target instruction (short form) if the first value is less than or equal to the second value,
+		/// when comparing unsigned integer values or unordered float values.
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Ble_Un_S">OpCodes.Ble_Un_S</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper ble_un_s(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Ble_Un_S, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Blt"/>, label) that
+		/// transfers control to a target instruction if the first value is less than the second value.
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Blt">OpCodes.Blt</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper blt(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Blt, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Blt_S"/>, label) that
+		/// transfers control to a target instruction (short form) if the first value is less than the second value.
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Blt_S">OpCodes.Blt_S</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper blt_s(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Blt_S, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Blt_Un"/>, label) that
+		/// transfers control to a target instruction if the first value is less than the second value,
+		/// when comparing unsigned integer values or unordered float values.
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Blt_Un">OpCodes.Blt_Un</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper blt_un(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Blt_Un, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Blt_Un_S"/>, label) that
+		/// transfers control to a target instruction (short form) if the first value is less than the second value,
+		/// when comparing unsigned integer values or unordered float values.
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Blt_Un_S">OpCodes.Blt_Un_S</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper blt_un_s(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Blt_Un_S, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Bne_Un"/>, label) that
+		/// transfers control to a target instruction when two unsigned integer values or unordered float values are not equal.
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Bne_Un">OpCodes.Bne_Un</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper bne_un(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Bne_Un, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Bne_Un_S"/>, label) that
+		/// transfers control to a target instruction (short form) 
+		/// when two unsigned integer values or unordered float values are not equal.
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Bne_Un_S">OpCodes.Bne_Un_S</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper bne_un_s(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Bne_Un_S, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Box"/>, type) that
+		/// converts a value type to an object reference.
+		/// </summary>
+		/// <param name="type">A Type</param>
+		/// <seealso cref="OpCodes.Box">OpCodes.Box</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
+		public EmitHelper box(Type type)
+		{
+			_ilGenerator.Emit(OpCodes.Box, type); return this;
+		}
+
+		/// <summary>
+		/// Converts a value type to an object reference if the value is a value type.
+		/// </summary>
+		/// <param name="type">A Type</param>
+		/// <seealso cref="OpCodes.Box">OpCodes.Box</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
+		public EmitHelper boxIfValueType(Type type)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			return type.IsValueType? box(type): this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Br"/>, label) that
+		/// unconditionally transfers control to a target instruction. 
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Br">OpCodes.Br</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper br(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Br, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Break"/>) that
+		/// signals the Common Language Infrastructure (CLI) to inform the debugger that a break point has been tripped.
+		/// </summary>
+		/// <seealso cref="OpCodes.Break">OpCodes.Break</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper @break
+		{
+			get { _ilGenerator.Emit(OpCodes.Break); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Brfalse"/>, label) that
+		/// transfers control to a target instruction if value is false, a null reference (Nothing in Visual Basic), or zero.
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Brfalse">OpCodes.Brfalse</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper brfalse(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Brfalse, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Brfalse_S"/>, label) that
+		/// transfers control to a target instruction if value is false, a null reference, or zero. 
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Brfalse_S">OpCodes.Brfalse_S</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper brfalse_s(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Brfalse_S, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Brtrue"/>, label) that
+		/// transfers control to a target instruction if value is true, not null, or non-zero.
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Brtrue">OpCodes.Brtrue</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper brtrue(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Brtrue, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Brtrue_S"/>, label) that
+		/// transfers control to a target instruction (short form) if value is true, not null, or non-zero.
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Brtrue_S">OpCodes.Brtrue_S</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper brtrue_s(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Brtrue_S, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Br_S"/>, label) that
+		/// unconditionally transfers control to a target instruction (short form).
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Br_S">OpCodes.Br_S</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper br_s(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Br_S, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Call"/>, methodInfo) that
+		/// calls the method indicated by the passed method descriptor.
+		/// </summary>
+		/// <param name="methodInfo">The method to be called.</param>
+		/// <seealso cref="OpCodes.Call">OpCodes.Call</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,MethodInfo)">ILGenerator.Emit</seealso>
+		public EmitHelper call(MethodInfo methodInfo)
+		{
+			_ilGenerator.Emit(OpCodes.Call, methodInfo); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Call"/>, constructorInfo) that
+		/// calls the method indicated by the passed method descriptor.
+		/// </summary>
+		/// <param name="constructorInfo">The constructor to be called.</param>
+		/// <seealso cref="OpCodes.Call">OpCodes.Call</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,MethodInfo)">ILGenerator.Emit</seealso>
+		public EmitHelper call(ConstructorInfo constructorInfo)
+		{
+			_ilGenerator.Emit(OpCodes.Call, constructorInfo); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.EmitCall(<see cref="OpCodes.Call"/>, methodInfo, optionalParameterTypes) that
+		/// calls the method indicated by the passed method descriptor.
+		/// </summary>
+		/// <param name="methodInfo">The method to be called.</param>
+		/// <param name="optionalParameterTypes">The types of the optional arguments if the method is a varargs method.</param>
+		/// <seealso cref="OpCodes.Call">OpCodes.Call</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.EmitCall(OpCode,MethodInfo,Type[])">ILGenerator.EmitCall</seealso>
+		public EmitHelper call(MethodInfo methodInfo, Type[] optionalParameterTypes)
+		{
+			_ilGenerator.EmitCall(OpCodes.Call, methodInfo, optionalParameterTypes); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.EmitCall(<see cref="OpCodes.Call"/>, methodInfo, optionalParameterTypes) that
+		/// calls the method indicated by the passed method descriptor.
+		/// </summary>
+		/// <param name="type">A Type</param>
+		/// <param name="methodName">The name of the method to be called.</param>
+		/// <param name="optionalParameterTypes">The types of the optional arguments if the method is a varargs method.</param>
+		/// <seealso cref="OpCodes.Call">OpCodes.Call</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.EmitCall(OpCode,MethodInfo,Type[])">ILGenerator.EmitCall</seealso>
+		public EmitHelper call(Type type, string methodName, params Type[] optionalParameterTypes)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			MethodInfo methodInfo = type.GetMethod(methodName, optionalParameterTypes);
+
+			if (methodInfo == null)
+				throw CreateNoSuchMethodException(type, methodName);
+
+			return call(methodInfo);
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.EmitCall(<see cref="OpCodes.Call"/>, methodInfo, optionalParameterTypes) that
+		/// calls the method indicated by the passed method descriptor.
+		/// </summary>
+		/// <param name="type">A Type</param>
+		/// <param name="methodName">The name of the method to be called.</param>
+		/// <param name="flags">A bitmask comprised of one or more <see cref="BindingFlags"/> 
+		/// that specify how the search is conducted.</param>
+		/// <param name="optionalParameterTypes">The types of the optional arguments if the method is a varargs method.</param>
+		/// <seealso cref="OpCodes.Call">OpCodes.Call</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.EmitCall(OpCode,MethodInfo,Type[])">ILGenerator.EmitCall</seealso>
+		public EmitHelper call(Type type, string methodName, BindingFlags flags, params Type[] optionalParameterTypes)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			MethodInfo methodInfo = type.GetMethod(methodName, flags, null, optionalParameterTypes, null);
+
+			if (methodInfo == null)
+				throw CreateNoSuchMethodException(type, methodName);
+
+			return call(methodInfo);
+		}
+
+#if !SILVERLIGHT
+
+		/// <summary>
+		/// Calls ILGenerator.EmitCalli(<see cref="OpCodes.Calli"/>, <see cref="CallingConvention"/>, Type, Type[]) that
+		/// calls the method indicated on the evaluation stack (as a pointer to an entry point) 
+		/// with arguments described by a calling convention using an unmanaged calling convention.
+		/// </summary>
+		/// <param name="unmanagedCallConv">The unmanaged calling convention to be used.</param>
+		/// <param name="returnType">The Type of the result.</param>
+		/// <param name="parameterTypes">The types of the required arguments to the instruction.</param>
+		/// <seealso cref="OpCodes.Calli">OpCodes.Calli</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.EmitCalli(OpCode,CallingConvention,Type,Type[])">ILGenerator.EmitCalli</seealso>
+		public EmitHelper calli(CallingConvention unmanagedCallConv, Type returnType, Type[] parameterTypes)
+		{
+			_ilGenerator.EmitCalli(OpCodes.Calli, unmanagedCallConv, returnType, parameterTypes);
+			return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.EmitCalli(<see cref="OpCodes.Calli"/>, <see cref="CallingConvention"/>, Type, Type[], Type[]) that
+		/// calls the method indicated on the evaluation stack (as a pointer to an entry point)
+		/// with arguments described by a calling convention using a managed calling convention.
+		/// </summary>
+		/// <param name="callingConvention">The managed calling convention to be used.</param>
+		/// <param name="returnType">The Type of the result.</param>
+		/// <param name="parameterTypes">The types of the required arguments to the instruction.</param>
+		/// <param name="optionalParameterTypes">The types of the optional arguments for vararg calls.</param>
+		/// <seealso cref="OpCodes.Calli">OpCodes.Calli</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.EmitCalli(OpCode,CallingConventions,Type,Type[],Type[])">ILGenerator.EmitCalli</seealso>
+		public EmitHelper calli(CallingConventions callingConvention, Type returnType, Type[] parameterTypes, Type[] optionalParameterTypes)
+		{
+			_ilGenerator.EmitCalli(OpCodes.Calli, callingConvention, returnType, parameterTypes, optionalParameterTypes);
+			return this;
+		}
+
+#endif
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Callvirt"/>, methodInfo) that
+		/// calls a late-bound method on an object, pushing the return value onto the evaluation stack.
+		/// </summary>
+		/// <param name="methodInfo">The method to be called.</param>
+		/// <seealso cref="OpCodes.Callvirt">OpCodes.Callvirt</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,MethodInfo)">ILGenerator.Emit</seealso>
+		public EmitHelper callvirt(MethodInfo methodInfo)
+		{
+			_ilGenerator.Emit(OpCodes.Callvirt, methodInfo); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.EmitCall(<see cref="OpCodes.Callvirt"/>, methodInfo, optionalParameterTypes) that
+		/// calls a late-bound method on an object, pushing the return value onto the evaluation stack.
+		/// </summary>
+		/// <param name="methodInfo">The method to be called.</param>
+		/// <param name="optionalParameterTypes">The types of the optional arguments if the method is a varargs method.</param>
+		/// <seealso cref="OpCodes.Callvirt">OpCodes.Callvirt</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.EmitCall(OpCode,MethodInfo,Type[])">ILGenerator.EmitCall</seealso>
+		public EmitHelper callvirt(MethodInfo methodInfo, Type[] optionalParameterTypes)
+		{
+			_ilGenerator.EmitCall(OpCodes.Callvirt, methodInfo, optionalParameterTypes); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.EmitCall(<see cref="OpCodes.Callvirt"/>, methodInfo, optionalParameterTypes) that
+		/// calls a late-bound method on an object, pushing the return value onto the evaluation stack.
+		/// </summary>
+		/// <param name="methodName">The method to be called.</param>
+		/// <param name="type">The declaring type of the method.</param>
+		/// <param name="optionalParameterTypes">The types of the optional arguments if the method is a varargs method.</param>
+		/// <seealso cref="OpCodes.Callvirt">OpCodes.Callvirt</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.EmitCall(OpCode,MethodInfo,Type[])">ILGenerator.EmitCall</seealso>
+		public EmitHelper callvirt(Type type, string methodName, params Type[] optionalParameterTypes)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			MethodInfo methodInfo = type.GetMethod(methodName, optionalParameterTypes);
+
+			if (methodInfo == null)
+				throw CreateNoSuchMethodException(type, methodName);
+
+			return callvirt(methodInfo);
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.EmitCall(<see cref="OpCodes.Callvirt"/>, methodInfo, optionalParameterTypes) that
+		/// calls a late-bound method on an object, pushing the return value onto the evaluation stack.
+		/// </summary>
+		/// <param name="methodName">The method to be called.</param>
+		/// <param name="type">The declaring type of the method.</param>
+		/// <param name="flags">A bitmask comprised of one or more <see cref="BindingFlags"/> 
+		/// that specify how the search is conducted.</param>
+		/// <param name="optionalParameterTypes">The types of the optional arguments if the method is a varargs method.</param>
+		/// <seealso cref="OpCodes.Callvirt">OpCodes.Callvirt</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.EmitCall(OpCode,MethodInfo,Type[])">ILGenerator.EmitCall</seealso>
+		public EmitHelper callvirt(Type type, string methodName, BindingFlags flags, params Type[] optionalParameterTypes)
+		{
+			MethodInfo methodInfo = 
+				optionalParameterTypes == null?
+					type.GetMethod(methodName, flags):
+					type.GetMethod(methodName, flags, null, optionalParameterTypes, null);
+
+			if (methodInfo == null)
+				throw CreateNoSuchMethodException(type, methodName);
+
+			return callvirt(methodInfo, null);
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.EmitCall(<see cref="OpCodes.Callvirt"/>, methodInfo, optionalParameterTypes) that
+		/// calls a late-bound method on an object, pushing the return value onto the evaluation stack.
+		/// </summary>
+		/// <param name="methodName">The method to be called.</param>
+		/// <param name="type">The declaring type of the method.</param>
+		/// <param name="flags">A bitmask comprised of one or more <see cref="BindingFlags"/> 
+		/// that specify how the search is conducted.</param>
+		/// <seealso cref="OpCodes.Callvirt">OpCodes.Callvirt</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.EmitCall(OpCode,MethodInfo,Type[])">ILGenerator.EmitCall</seealso>
+		public EmitHelper callvirt(Type type, string methodName, BindingFlags flags)
+		{
+			return callvirt(type, methodName, flags, null);
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.EmitCall(<see cref="OpCodes.Callvirt"/>, methodInfo, optionalParameterTypes) that
+		/// calls a late-bound method on an object, pushing the return value onto the evaluation stack.
+		/// </summary>
+		/// <param name="methodName">The non-generic method to be called.</param>
+		/// <param name="type">The declaring type of the method.</param>
+		/// <param name="optionalParameterTypes">The types of the optional arguments if the method is a varargs method.</param>
+		/// <seealso cref="OpCodes.Callvirt">OpCodes.Callvirt</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.EmitCall(OpCode,MethodInfo,Type[])">ILGenerator.EmitCall</seealso>
+		public EmitHelper callvirtNoGenerics(Type type, string methodName, params Type[] optionalParameterTypes)
+		{
+			MethodInfo methodInfo = type.GetMethod(
+				methodName,
+				BindingFlags.Instance | BindingFlags.Public,
+				GenericBinder.NonGeneric,
+				optionalParameterTypes, null);
+
+			if (methodInfo == null)
+				throw CreateNoSuchMethodException(type, methodName);
+
+			return callvirt(methodInfo);
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Castclass"/>, type) that
+		/// attempts to cast an object passed by reference to the specified class.
+		/// </summary>
+		/// <param name="type">A Type</param>
+		/// <seealso cref="OpCodes.Castclass">OpCodes.Castclass</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
+		public EmitHelper castclass(Type type)
+		{
+			_ilGenerator.Emit(OpCodes.Castclass, type); return this;
+		}
+
+		/// <summary>
+		/// Attempts to cast an object passed by reference to the specified class 
+		/// or to unbox if the type is a value type.
+		/// </summary>
+		/// <param name="type">A Type</param>
+		public EmitHelper castType(Type type)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			return type.IsValueType? unbox_any(type): castclass(type);
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ceq"/>) that
+		/// compares two values. If they are equal, the integer value 1 (int32) is pushed onto the evaluation stack;
+		/// otherwise 0 (int32) is pushed onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ceq">OpCodes.Ceq</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ceq
+		{
+			get { _ilGenerator.Emit(OpCodes.Ceq); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Cgt"/>) that
+		/// compares two values. If the first value is greater than the second,
+		/// the integer value 1 (int32) is pushed onto the evaluation stack;
+		/// otherwise 0 (int32) is pushed onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Cgt">OpCodes.Cgt</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper cgt
+		{
+			get { _ilGenerator.Emit(OpCodes.Cgt); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Cgt_Un"/>) that
+		/// compares two unsigned or unordered values.
+		/// If the first value is greater than the second, the integer value 1 (int32) is pushed onto the evaluation stack;
+		/// otherwise 0 (int32) is pushed onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Cgt_Un">OpCodes.Cgt_Un</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper cgt_un
+		{
+			get { _ilGenerator.Emit(OpCodes.Cgt_Un); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Constrained"/>) that
+		/// constrains the type on which a virtual method call is made.
+		/// </summary>
+		/// <param name="type">A Type</param>
+		/// <seealso cref="OpCodes.Cgt_Un">OpCodes.Constrained</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper constrained(Type type)
+		{
+			_ilGenerator.Emit(OpCodes.Constrained, type); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ckfinite"/>) that
+		/// throws <see cref="ArithmeticException"/> if value is not a finite number.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ckfinite">OpCodes.Ckfinite</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ckfinite
+		{
+			get { _ilGenerator.Emit(OpCodes.Ckfinite); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Clt"/>) that
+		/// compares two values. If the first value is less than the second,
+		/// the integer value 1 (int32) is pushed onto the evaluation stack;
+		/// otherwise 0 (int32) is pushed onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Clt">OpCodes.Clt</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper clt
+		{
+			get { _ilGenerator.Emit(OpCodes.Clt); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Clt_Un"/>) that
+		/// compares the unsigned or unordered values value1 and value2.
+		/// If value1 is less than value2, then the integer value 1 (int32) is pushed onto the evaluation stack;
+		/// otherwise 0 (int32) is pushed onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Clt_Un">OpCodes.Clt_Un</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper clt_un
+		{
+			get { _ilGenerator.Emit(OpCodes.Clt_Un); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_I"/>) that
+		/// converts the value on top of the evaluation stack to natural int.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_I">OpCodes.Conv_I</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_i
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_I); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_I1"/>) that
+		/// converts the value on top of the evaluation stack to int8, then extends (pads) it to int32.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_I1">OpCodes.Conv_I1</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_i1
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_I1); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_I2"/>) that
+		/// converts the value on top of the evaluation stack to int16, then extends (pads) it to int32.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_I2">OpCodes.Conv_I2</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_i2
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_I2); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_I4"/>) that
+		/// converts the value on top of the evaluation stack to int32.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_I4">OpCodes.Conv_I4</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_i4
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_I4); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_I8"/>) that
+		/// converts the value on top of the evaluation stack to int64.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_I8">OpCodes.Conv_I8</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_i8
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_I8); return this; }
+		}
+
+		/// <summary>
+		/// Converts the value on top of the evaluation stack to the specified type.
+		/// </summary>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv(Type type)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.Boolean:
+				case TypeCode.SByte:   conv_i1.end(); break;
+				case TypeCode.Int16:   conv_i2.end(); break;
+				case TypeCode.Int32:   conv_i4.end(); break;
+				case TypeCode.Int64:   conv_i8.end(); break;
+
+				case TypeCode.Byte:    conv_u1.end(); break;
+				case TypeCode.Char:
+				case TypeCode.UInt16:  conv_u2.end(); break;
+				case TypeCode.UInt32:  conv_u4.end(); break;
+				case TypeCode.UInt64:  conv_u8.end(); break;
+
+				case TypeCode.Single:  conv_r4.end(); break;
+				case TypeCode.Double:  conv_r8.end(); break;
+
+				default:
+					{
+						if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
+						{
+							ConstructorInfo ci = type.GetConstructor(type.GetGenericArguments());
+							if (ci != null)
+							{
+								newobj(ci);
+								break;
+							}
+						}
+
+						throw CreateNotExpectedTypeException(type);
+					}
+			}
+
+			return this;
+		}
+
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_I"/>) that
+		/// converts the signed value on top of the evaluation stack to signed natural int,
+		/// throwing <see cref="OverflowException"/> on overflow.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_Ovf_I">OpCodes.Conv_Ovf_I</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_ovf_i
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_Ovf_I); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_I1"/>) that
+		/// converts the signed value on top of the evaluation stack to signed int8 and extends it to int32,
+		/// throwing <see cref="OverflowException"/> on overflow.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_Ovf_I1">OpCodes.Conv_Ovf_I1</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_ovf_i1
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_Ovf_I1); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_I1_Un"/>) that
+		/// converts the unsigned value on top of the evaluation stack to signed int8 and extends it to int32,
+		/// throwing <see cref="OverflowException"/> on overflow.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_Ovf_I1_Un">OpCodes.Conv_Ovf_I1_Un</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_ovf_i1_un
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_Ovf_I1_Un); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_I2"/>) that
+		/// converts the signed value on top of the evaluation stack to signed int16 and extending it to int32,
+		/// throwing <see cref="OverflowException"/> on overflow.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_Ovf_I2">OpCodes.Conv_Ovf_I2</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_ovf_i2
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_Ovf_I2); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_I2_Un"/>) that
+		/// converts the unsigned value on top of the evaluation stack to signed int16 and extends it to int32,
+		/// throwing <see cref="OverflowException"/> on overflow.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_Ovf_I2_Un">OpCodes.Conv_Ovf_I2_Un</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_ovf_i2_un
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_Ovf_I2_Un); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_I4"/>) that
+		/// converts the signed value on top of the evaluation tack to signed int32, throwing <see cref="OverflowException"/> on overflow.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_Ovf_I4">OpCodes.Conv_Ovf_I4</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_ovf_i4
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_Ovf_I2_Un); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_I4_Un"/>) that
+		/// converts the unsigned value on top of the evaluation stack to signed int32, throwing <see cref="OverflowException"/> on overflow.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_Ovf_I4_Un">OpCodes.Conv_Ovf_I4_Un</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_ovf_i4_un
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_Ovf_I4_Un); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_I8"/>) that
+		/// converts the signed value on top of the evaluation stack to signed int64,
+		/// throwing <see cref="OverflowException"/> on overflow.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_Ovf_I8">OpCodes.Conv_Ovf_I8</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_ovf_i8
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_Ovf_I8); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_I8_Un"/>) that
+		/// converts the unsigned value on top of the evaluation stack to signed int64, throwing <see cref="OverflowException"/> on overflow.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_Ovf_I8_Un">OpCodes.Conv_Ovf_I8_Un</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_ovf_i8_un
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_Ovf_I8_Un); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_I_Un"/>) that
+		/// converts the unsigned value on top of the evaluation stack to signed natural int,
+		/// throwing <see cref="OverflowException"/> on overflow.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_Ovf_I_Un">OpCodes.Conv_Ovf_I_Un</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_ovf_i_un
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_Ovf_I_Un); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_U"/>) that
+		/// converts the signed value on top of the evaluation stack to unsigned natural int,
+		/// throwing <see cref="OverflowException"/> on overflow.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_Ovf_U">OpCodes.Conv_Ovf_U</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_ovf_u
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_Ovf_U); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_U1"/>) that
+		/// converts the signed value on top of the evaluation stack to unsigned int8 and extends it to int32,
+		/// throwing <see cref="OverflowException"/> on overflow.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_Ovf_U1">OpCodes.Conv_Ovf_U1</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_ovf_u1
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_Ovf_U1); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_U1_Un"/>) that
+		/// converts the unsigned value on top of the evaluation stack to unsigned int8 and extends it to int32,
+		/// throwing <see cref="OverflowException"/> on overflow.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_Ovf_U1_Un">OpCodes.Conv_Ovf_U1_Un</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_ovf_u1_un
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_Ovf_U1_Un); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_U2"/>) that
+		/// converts the signed value on top of the evaluation stack to unsigned int16 and extends it to int32,
+		/// throwing <see cref="OverflowException"/> on overflow.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_Ovf_U2">OpCodes.Conv_Ovf_U2</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_ovf_u2
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_Ovf_U2); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_U2_Un"/>) that
+		/// converts the unsigned value on top of the evaluation stack to unsigned int16 and extends it to int32,
+		/// throwing <see cref="OverflowException"/> on overflow.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_Ovf_U2_Un">OpCodes.Conv_Ovf_U2_Un</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_ovf_u2_un
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_Ovf_U2_Un); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_U4"/>) that
+		/// Converts the signed value on top of the evaluation stack to unsigned int32, throwing <see cref="OverflowException"/> on overflow.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_Ovf_U4">OpCodes.Conv_Ovf_U4</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_ovf_u4
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_Ovf_U4); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_U4_Un"/>) that
+		/// converts the unsigned value on top of the evaluation stack to unsigned int32, throwing <see cref="OverflowException"/> on overflow.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_Ovf_U4_Un">OpCodes.Conv_Ovf_U4_Un</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_ovf_u4_un
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_Ovf_U4_Un); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_U8"/>) that
+		/// converts the signed value on top of the evaluation stack to unsigned int64, throwing <see cref="OverflowException"/> on overflow.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_Ovf_U8">OpCodes.Conv_Ovf_U8</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_ovf_u8
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_Ovf_U8); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_U8_Un"/>) that
+		/// converts the unsigned value on top of the evaluation stack to unsigned int64, throwing <see cref="OverflowException"/> on overflow.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_Ovf_U8_Un">OpCodes.Conv_Ovf_U8_Un</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_ovf_u8_un
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_Ovf_U8_Un); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_Ovf_U_Un"/>) that
+		/// converts the unsigned value on top of the evaluation stack to unsigned natural int,
+		/// throwing <see cref="OverflowException"/> on overflow.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_Ovf_U_Un">OpCodes.Conv_Ovf_U_Un</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_ovf_u_un
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_Ovf_U_Un); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_R4"/>) that
+		/// converts the value on top of the evaluation stack to float32.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_R4">OpCodes.Conv_R4</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_r4
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_R4); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_R8"/>) that
+		/// converts the value on top of the evaluation stack to float64.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_R8">OpCodes.Conv_R8</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_r8
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_R8); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_R_Un"/>) that
+		/// converts the unsigned integer value on top of the evaluation stack to float32.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_R_Un">OpCodes.Conv_R_Un</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_r_un
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_R_Un); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_U"/>) that
+		/// converts the value on top of the evaluation stack to unsigned natural int, and extends it to natural int.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_U">OpCodes.Conv_U</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_u
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_U); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_U1"/>) that
+		/// converts the value on top of the evaluation stack to unsigned int8, and extends it to int32.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_U1">OpCodes.Conv_U1</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_u1
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_U1); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_U2"/>) that
+		/// converts the value on top of the evaluation stack to unsigned int16, and extends it to int32.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_U2">OpCodes.Conv_U2</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_u2
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_U2); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_U4"/>) that
+		/// converts the value on top of the evaluation stack to unsigned int32, and extends it to int32.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_U4">OpCodes.Conv_U4</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_u4
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_U4); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Conv_U8"/>) that
+		/// converts the value on top of the evaluation stack to unsigned int64, and extends it to int64.
+		/// </summary>
+		/// <seealso cref="OpCodes.Conv_U8">OpCodes.Conv_U8</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper conv_u8
+		{
+			get { _ilGenerator.Emit(OpCodes.Conv_U8); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Cpblk"/>) that
+		/// copies a specified number bytes from a source address to a destination address.
+		/// </summary>
+		/// <seealso cref="OpCodes.Cpblk">OpCodes.Cpblk</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper cpblk
+		{
+			get { _ilGenerator.Emit(OpCodes.Cpblk); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Cpobj"/>, type) that
+		/// copies the value type located at the address of an object (type &amp;, * or natural int) 
+		/// to the address of the destination object (type &amp;, * or natural int).
+		/// </summary>
+		/// <param name="type">A Type</param>
+		/// <seealso cref="OpCodes.Cpobj">OpCodes.Cpobj</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
+		public EmitHelper cpobj(Type type)
+		{
+			_ilGenerator.Emit(OpCodes.Cpobj, type); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Div"/>) that
+		/// divides two values and pushes the result as a floating-point (type F) or
+		/// quotient (type int32) onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Div">OpCodes.Div</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper div
+		{
+			get { _ilGenerator.Emit(OpCodes.Div); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Div_Un"/>) that
+		/// divides two unsigned integer values and pushes the result (int32) onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Div_Un">OpCodes.Div_Un</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper div_un
+		{
+			get { _ilGenerator.Emit(OpCodes.Div_Un); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Dup"/>) that
+		/// copies the current topmost value on the evaluation stack, and then pushes the copy onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Dup">OpCodes.Dup</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper dup
+		{
+			get { _ilGenerator.Emit(OpCodes.Dup); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Endfilter"/>) that
+		/// transfers control from the filter clause of an exception back to
+		/// the Common Language Infrastructure (CLI) exception handler.
+		/// </summary>
+		/// <seealso cref="OpCodes.Endfilter">OpCodes.Endfilter</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper endfilter
+		{
+			get { _ilGenerator.Emit(OpCodes.Endfilter); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Endfinally"/>) that
+		/// transfers control from the fault or finally clause of an exception block back to
+		/// the Common Language Infrastructure (CLI) exception handler.
+		/// </summary>
+		/// <seealso cref="OpCodes.Endfinally">OpCodes.Endfinally</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper endfinally
+		{
+			get { _ilGenerator.Emit(OpCodes.Endfinally); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Initblk"/>) that
+		/// initializes a specified block of memory at a specific address to a given size and initial value.
+		/// </summary>
+		/// <seealso cref="OpCodes.Initblk">OpCodes.Initblk</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper initblk
+		{
+			get { _ilGenerator.Emit(OpCodes.Initblk); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Initobj"/>, type) that
+		/// initializes all the fields of the object at a specific address to a null reference or 
+		/// a 0 of the appropriate primitive type.
+		/// </summary>
+		/// <param name="type">A Type</param>
+		/// <seealso cref="OpCodes.Initobj">OpCodes.Initobj</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
+		public EmitHelper initobj(Type type)
+		{
+			_ilGenerator.Emit(OpCodes.Initobj, type); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Isinst"/>, type) that
+		/// tests whether an object reference (type O) is an instance of a particular class.
+		/// </summary>
+		/// <param name="type">A Type</param>
+		/// <seealso cref="OpCodes.Isinst">OpCodes.Isinst</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
+		public EmitHelper isinst(Type type)
+		{
+			_ilGenerator.Emit(OpCodes.Isinst, type); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Jmp"/>, methodInfo) that
+		/// exits current method and jumps to specified method.
+		/// </summary>
+		/// <param name="methodInfo">The method to be jumped.</param>
+		/// <seealso cref="OpCodes.Jmp">OpCodes.Jmp</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,MethodInfo)">ILGenerator.Emit</seealso>
+		public EmitHelper jmp(MethodInfo methodInfo)
+		{
+			_ilGenerator.Emit(OpCodes.Jmp, methodInfo); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldarg"/>, short) that
+		/// loads an argument (referenced by a specified index value) onto the stack.
+		/// </summary>
+		/// <param name="index">Index of the argument that is pushed onto the stack.</param>
+		/// <seealso cref="OpCodes.Ldarg">OpCodes.Ldarg</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,short)">ILGenerator.Emit</seealso>
+		public EmitHelper ldarg(short index)
+		{
+			_ilGenerator.Emit(OpCodes.Ldarg, index); return this;
+		}
+
+		/// <summary>
+		/// Loads an argument onto the stack.
+		/// </summary>
+		/// <param name="parameterInfo">A <see cref="ParameterInfo"/> representing a parameter.</param>
+		/// <param name="box">True, if parameter must be converted to a reference.</param>
+		/// <seealso cref="ldarg(ParameterInfo)"/>
+		public EmitHelper ldargEx(ParameterInfo parameterInfo, bool box)
+		{
+			ldarg(parameterInfo);
+
+			Type type = parameterInfo.ParameterType;
+
+			if (parameterInfo.ParameterType.IsByRef)
+				type = parameterInfo.ParameterType.GetElementType();
+
+			if (parameterInfo.ParameterType.IsByRef)
+			{
+				if (type.IsValueType && type.IsPrimitive == false)
+					ldobj(type);
+				else
+					ldind(type);
+			}
+
+			if (box)
+				boxIfValueType(type);
+
+			return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldarg"/>, short) or 
+		/// ILGenerator.Emit(<see cref="OpCodes.Ldarg_S"/>, byte) that
+		/// loads an argument (referenced by a specified index value) onto the stack.
+		/// </summary>
+		/// <param name="index">Index of the argument that is pushed onto the stack.</param>
+		/// <seealso cref="OpCodes.Ldarg">OpCodes.Ldarg</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,short)">ILGenerator.Emit</seealso>
+		public EmitHelper ldarg(int index)
+		{
+			switch (index)
+			{
+				case 0: ldarg_0.end(); break;
+				case 1: ldarg_1.end(); break;
+				case 2: ldarg_2.end(); break;
+				case 3: ldarg_3.end(); break;
+				default:
+					if      (index <= byte. MaxValue) ldarg_s((byte)index);
+					else if (index <= short.MaxValue) ldarg ((short)index);
+					else
+						throw new ArgumentOutOfRangeException("index");
+
+					break;
+			}
+
+			return this;
+		}
+
+		/// <summary>
+		/// Loads an argument onto the stack.
+		/// </summary>
+		/// <param name="parameterInfo">A <see cref="ParameterInfo"/> representing a parameter.</param>
+		public EmitHelper ldarg(ParameterInfo parameterInfo)
+		{
+			if (parameterInfo == null) throw new ArgumentNullException("parameterInfo");
+
+			bool isStatic = 
+				Method is MethodBuilderHelper && ((MethodBuilderHelper)Method).MethodBuilder.IsStatic;
+
+			return ldarg(parameterInfo.Position + (isStatic? 0: 1));
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldarga"/>, short) that
+		/// load an argument address onto the evaluation stack.
+		/// </summary>
+		/// <param name="index">Index of the address addr of the argument that is pushed onto the stack.</param>
+		/// <seealso cref="OpCodes.Ldarga">OpCodes.Ldarga</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,short)">ILGenerator.Emit</seealso>
+		public EmitHelper ldarga(short index)
+		{
+			_ilGenerator.Emit(OpCodes.Ldarga, index); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldarga_S"/>, byte) that
+		/// load an argument address, in short form, onto the evaluation stack.
+		/// </summary>
+		/// <param name="index">Index of the address addr of the argument that is pushed onto the stack.</param>
+		/// <seealso cref="OpCodes.Ldarga_S">OpCodes.Ldarga_S</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,byte)">ILGenerator.Emit</seealso>
+		public EmitHelper ldarga_s(byte index)
+		{
+			_ilGenerator.Emit(OpCodes.Ldarga_S, index); return this;
+		}
+
+		/// <summary>
+		/// Load an argument address onto the evaluation stack.
+		/// </summary>
+		/// <param name="index">Index of the address addr of the argument that is pushed onto the stack.</param>
+		public EmitHelper ldarga(int index)
+		{
+			if      (index <= byte. MaxValue) ldarga_s((byte)index);
+			else if (index <= short.MaxValue) ldarga ((short)index);
+			else
+				throw new ArgumentOutOfRangeException("index");
+
+			return this;
+		}
+
+		/// <summary>
+		/// Loads an argument address onto the stack.
+		/// </summary>
+		/// <param name="parameterInfo">A <see cref="ParameterInfo"/> representing a parameter.</param>
+		public EmitHelper ldarga(ParameterInfo parameterInfo)
+		{
+			if (parameterInfo == null) throw new ArgumentNullException("parameterInfo");
+
+			bool isStatic = 
+				Method is MethodBuilderHelper && ((MethodBuilderHelper)Method).MethodBuilder.IsStatic;
+
+			return ldarga(parameterInfo.Position + (isStatic? 0: 1));
+		}
+
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldarg_0"/>) that
+		/// loads the argument at index 0 onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldarg_0">OpCodes.Ldarg_0</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldarg_0
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldarg_0); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldarg_1"/>) that
+		/// loads the argument at index 1 onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldarg_1">OpCodes.Ldarg_1</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldarg_1
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldarg_1); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldarg_2"/>) that
+		/// loads the argument at index 2 onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldarg_2">OpCodes.Ldarg_2</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldarg_2
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldarg_2); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldarg_3"/>) that
+		/// loads the argument at index 3 onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldarg_3">OpCodes.Ldarg_3</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldarg_3
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldarg_3); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldarg_S"/>, byte) that
+		/// loads the argument (referenced by a specified short form index) onto the evaluation stack.
+		/// </summary>
+		/// <param name="index">Index of the argument value that is pushed onto the stack.</param>
+		/// <seealso cref="OpCodes.Ldarg_S">OpCodes.Ldarg_S</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,byte)">ILGenerator.Emit</seealso>
+		public EmitHelper ldarg_s(byte index)
+		{
+			_ilGenerator.Emit(OpCodes.Ldarg_S, index); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I4_0"/> or <see cref="OpCodes.Ldc_I4_1"/>) that
+		/// pushes a supplied value of type int32 onto the evaluation stack as an int32.
+		/// </summary>
+		/// <param name="b">The value pushed onto the stack.</param>
+		/// <seealso cref="OpCodes.Ldc_I4">OpCodes.Ldc_I4_0</seealso>
+		/// <seealso cref="OpCodes.Ldc_I4">OpCodes.Ldc_I4_1</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,int)">ILGenerator.Emit</seealso>
+		public EmitHelper ldc_bool(bool b)
+		{
+			_ilGenerator.Emit(b? OpCodes.Ldc_I4_1: OpCodes.Ldc_I4_0); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I4"/>, int) that
+		/// pushes a supplied value of type int32 onto the evaluation stack as an int32.
+		/// </summary>
+		/// <param name="num">The value pushed onto the stack.</param>
+		/// <seealso cref="OpCodes.Ldc_I4">OpCodes.Ldc_I4</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,int)">ILGenerator.Emit</seealso>
+		public EmitHelper ldc_i4(int num)
+		{
+			_ilGenerator.Emit(OpCodes.Ldc_I4, num); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I4_0"/>) that
+		/// pushes the integer value of 0 onto the evaluation stack as an int32.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldc_I4_0">OpCodes.Ldc_I4_0</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldc_i4_0
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldc_I4_0); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I4_1"/>) that
+		/// pushes the integer value of 1 onto the evaluation stack as an int32.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldc_I4_1">OpCodes.Ldc_I4_1</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldc_i4_1
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldc_I4_1); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I4_2"/>) that
+		/// pushes the integer value of 2 onto the evaluation stack as an int32.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldc_I4_2">OpCodes.Ldc_I4_2</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldc_i4_2
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldc_I4_2); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I4_3"/>) that
+		/// pushes the integer value of 3 onto the evaluation stack as an int32.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldc_I4_3">OpCodes.Ldc_I4_3</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldc_i4_3
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldc_I4_3); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I4_4"/>) that
+		/// pushes the integer value of 4 onto the evaluation stack as an int32.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldc_I4_4">OpCodes.Ldc_I4_4</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldc_i4_4
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldc_I4_4); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I4_5"/>) that
+		/// pushes the integer value of 5 onto the evaluation stack as an int32.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldc_I4_5">OpCodes.Ldc_I4_0</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldc_i4_5
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldc_I4_5); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I4_6"/>) that
+		/// pushes the integer value of 6 onto the evaluation stack as an int32.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldc_I4_6">OpCodes.Ldc_I4_6</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldc_i4_6
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldc_I4_6); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I4_7"/>) that
+		/// pushes the integer value of 7 onto the evaluation stack as an int32.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldc_I4_7">OpCodes.Ldc_I4_7</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldc_i4_7
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldc_I4_7); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I4_8"/>) that
+		/// pushes the integer value of 8 onto the evaluation stack as an int32.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldc_I4_8">OpCodes.Ldc_I4_8</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldc_i4_8
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldc_I4_8); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I4_M1"/>) that
+		/// pushes the integer value of -1 onto the evaluation stack as an int32.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldc_I4_M1">OpCodes.Ldc_I4_M1</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldc_i4_m1
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldc_I4_M1); return this; }
+		}
+
+		/// <summary>
+		/// Calls the best form of ILGenerator.Emit(Ldc_I4_X) that
+		/// pushes the integer value of -1 onto the evaluation stack as an int32.
+		/// </summary>
+		/// <seealso cref="ldc_i4"/>
+		public EmitHelper ldc_i4_(int num)
+		{
+			switch (num)
+			{
+				case -1: ldc_i4_m1.end(); break;
+				case  0: ldc_i4_0. end(); break;
+				case  1: ldc_i4_1. end(); break;
+				case  2: ldc_i4_2. end(); break;
+				case  3: ldc_i4_3. end(); break;
+				case  4: ldc_i4_4. end(); break;
+				case  5: ldc_i4_5. end(); break;
+				case  6: ldc_i4_6. end(); break;
+				case  7: ldc_i4_7. end(); break;
+				case  8: ldc_i4_8. end(); break;
+				default:
+					if (num >= sbyte.MinValue && num <= sbyte.MaxValue)
+						ldc_i4_s((sbyte)num);
+					else
+						ldc_i4   (num);
+
+					break;
+			}
+
+			return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I4_S"/>, byte) that
+		/// pushes the supplied int8 value onto the evaluation stack as an int32, short form.
+		/// </summary>
+		/// <param name="num">The value pushed onto the stack.</param>
+		/// <seealso cref="OpCodes.Ldc_I4_S">OpCodes.Ldc_I4_S</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,byte)">ILGenerator.Emit</seealso>
+		[CLSCompliant(false)]
+		public EmitHelper ldc_i4_s(sbyte num)
+		{
+			_ilGenerator.Emit(OpCodes.Ldc_I4_S, num); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_I8"/>, long) that
+		/// pushes a supplied value of type int64 onto the evaluation stack as an int64.
+		/// </summary>
+		/// <param name="num">The value pushed onto the stack.</param>
+		/// <seealso cref="OpCodes.Ldc_I8">OpCodes.Ldc_I8</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,long)">ILGenerator.Emit</seealso>
+		public EmitHelper ldc_i8(long num)
+		{
+			_ilGenerator.Emit(OpCodes.Ldc_I8, num); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_R4"/>, float) that
+		/// pushes a supplied value of type float32 onto the evaluation stack as type F (float).
+		/// </summary>
+		/// <param name="num">The value pushed onto the stack.</param>
+		/// <seealso cref="OpCodes.Ldc_R4">OpCodes.Ldc_R4</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,float)">ILGenerator.Emit</seealso>
+		public EmitHelper ldc_r4(float num)
+		{
+			_ilGenerator.Emit(OpCodes.Ldc_R4, num); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldc_R8"/>, double) that
+		/// pushes a supplied value of type float64 onto the evaluation stack as type F (float).
+		/// </summary>
+		/// <param name="num">The value pushed onto the stack.</param>
+		/// <seealso cref="OpCodes.Ldc_R8">OpCodes.Ldc_R8</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,double)">ILGenerator.Emit</seealso>
+		public EmitHelper ldc_r8(double num)
+		{
+			_ilGenerator.Emit(OpCodes.Ldc_R8, num); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldelema"/>, type) that
+		/// loads the address of the array element at a specified array index onto the top of the evaluation stack 
+		/// as type &amp; (managed pointer).
+		/// </summary>
+		/// <param name="type">A Type</param>
+		/// <seealso cref="OpCodes.Ldelema">OpCodes.Ldelema</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
+		public EmitHelper ldelema(Type type)
+		{
+			_ilGenerator.Emit(OpCodes.Ldelema, type); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldelem_I"/>) that
+		/// loads the element with type natural int at a specified array index onto the top of the evaluation stack 
+		/// as a natural int.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldelem_I">OpCodes.Ldelem_I</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldelem_i
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldelem_I); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldelem_I1"/>) that
+		/// loads the element with type int8 at a specified array index onto the top of the evaluation stack as an int32.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldelem_I1">OpCodes.Ldelem_I1</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldelem_i1
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldelem_I1); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldelem_I2"/>) that
+		/// loads the element with type int16 at a specified array index onto the top of the evaluation stack as an int32.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldelem_I2">OpCodes.Ldelem_I2</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldelem_i2
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldelem_I2); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldelem_I4"/>) that
+		/// loads the element with type int32 at a specified array index onto the top of the evaluation stack as an int32.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldelem_I4">OpCodes.Ldelem_I4</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldelem_i4
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldelem_I4); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldelem_I8"/>) that
+		/// loads the element with type int64 at a specified array index onto the top of the evaluation stack as an int64.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldelem_I8">OpCodes.Ldelem_I8</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldelem_i8
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldelem_I8); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldelem_R4"/>) that
+		/// loads the element with type float32 at a specified array index onto the top of the evaluation stack as type F (float).
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldelem_R4">OpCodes.Ldelem_R4</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldelem_r4
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldelem_R4); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldelem_R8"/>) that
+		/// loads the element with type float64 at a specified array index onto the top of the evaluation stack as type F (float).
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldelem_R8">OpCodes.Ldelem_R8</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldelem_r8
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldelem_R8); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldelem_Ref"/>) that
+		/// loads the element containing an object reference at a specified array index 
+		/// onto the top of the evaluation stack as type O (object reference).
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldelem_Ref">OpCodes.Ldelem_Ref</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldelem_ref
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldelem_Ref); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldelem_U1"/>) that
+		/// loads the element with type unsigned int8 at a specified array index onto the top of the evaluation stack as an int32.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldelem_U1">OpCodes.Ldelem_U1</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldelem_u1
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldelem_U1); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldelem_U2"/>) that
+		/// loads the element with type unsigned int16 at a specified array index 
+		/// onto the top of the evaluation stack as an int32.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldelem_U2">OpCodes.Ldelem_U2</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldelem_u2
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldelem_U2); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldelem_U4"/>) that
+		/// loads the element with type unsigned int32 at a specified array index 
+		/// onto the top of the evaluation stack as an int32.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldelem_U4">OpCodes.Ldelem_U4</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldelem_u4
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldelem_U4); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldfld"/>, fieldInfo) that
+		/// finds the value of a field in the object whose reference is currently on the evaluation stack.
+		/// </summary>
+		/// <param name="fieldInfo">A <see cref="FieldInfo"/> representing a field.</param>
+		/// <seealso cref="OpCodes.Ldfld">OpCodes.Ldfld</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,FieldInfo)">ILGenerator.Emit</seealso>
+		public EmitHelper ldfld(FieldInfo fieldInfo)
+		{
+			_ilGenerator.Emit(OpCodes.Ldfld, fieldInfo); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldflda"/>, fieldInfo) that
+		/// finds the address of a field in the object whose reference is currently on the evaluation stack.
+		/// </summary>
+		/// <param name="fieldInfo">A <see cref="FieldInfo"/> representing a field.</param>
+		/// <seealso cref="OpCodes.Ldflda">OpCodes.Ldflda</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,FieldInfo)">ILGenerator.Emit</seealso>
+		public EmitHelper ldflda(FieldInfo fieldInfo)
+		{
+			_ilGenerator.Emit(OpCodes.Ldflda, fieldInfo); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldftn"/>, methodInfo) that
+		/// pushes an unmanaged pointer (type natural int) to the native code implementing a specific method 
+		/// onto the evaluation stack.
+		/// </summary>
+		/// <param name="methodInfo">The method to be called.</param>
+		/// <seealso cref="OpCodes.Ldftn">OpCodes.Ldftn</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,MethodInfo)">ILGenerator.Emit</seealso>
+		public EmitHelper ldftn(MethodInfo methodInfo)
+		{
+			_ilGenerator.Emit(OpCodes.Ldftn, methodInfo); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldind_I"/>) that
+		/// loads a value of type natural int as a natural int onto the evaluation stack indirectly.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldind_I">OpCodes.Ldind_I</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldind_i
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldind_I); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldind_I1"/>) that
+		/// loads a value of type int8 as an int32 onto the evaluation stack indirectly.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldind_I1">OpCodes.Ldind_I1</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldind_i1
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldind_I1); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldind_I2"/>) that
+		/// loads a value of type int16 as an int32 onto the evaluation stack indirectly.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldind_I2">OpCodes.Ldind_I2</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldind_i2
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldind_I2); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldind_I4"/>) that
+		/// loads a value of type int32 as an int32 onto the evaluation stack indirectly.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldind_I4">OpCodes.Ldind_I4</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldind_i4
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldind_I4); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldind_I8"/>) that
+		/// loads a value of type int64 as an int64 onto the evaluation stack indirectly.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldind_I8">OpCodes.Ldind_I8</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldind_i8
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldind_I8); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldind_R4"/>) that
+		/// loads a value of type float32 as a type F (float) onto the evaluation stack indirectly.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldind_R4">OpCodes.Ldind_R4</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldind_r4
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldind_R4); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldind_R8"/>) that
+		/// loads a value of type float64 as a type F (float) onto the evaluation stack indirectly.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldind_R8">OpCodes.Ldind_R8</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldind_r8
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldind_R8); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldind_Ref"/>) that
+		/// loads an object reference as a type O (object reference) onto the evaluation stack indirectly.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldind_Ref">OpCodes.Ldind_Ref</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldind_ref
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldind_Ref); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldind_U1"/>) that
+		/// loads a value of type unsigned int8 as an int32 onto the evaluation stack indirectly.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldind_U1">OpCodes.Ldind_U1</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldind_u1
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldind_U1); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldind_U2"/>) that
+		/// loads a value of type unsigned int16 as an int32 onto the evaluation stack indirectly.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldind_U2">OpCodes.Ldind_U2</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldind_u2
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldind_U2); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldind_U4"/>) that
+		/// loads a value of type unsigned int32 as an int32 onto the evaluation stack indirectly.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldind_U4">OpCodes.Ldind_U4</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldind_u4
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldind_U4); return this; }
+		}
+
+		/// <summary>
+		/// Loads a value of the type from a supplied address.
+		/// </summary>
+		/// <param name="type">A Type.</param>
+		public EmitHelper ldind(Type type)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.Boolean:
+				case TypeCode.Byte:
+				case TypeCode.SByte:   ldind_i1.end(); break;
+
+				case TypeCode.Char:
+				case TypeCode.Int16:
+				case TypeCode.UInt16:  ldind_i2.end(); break;
+
+				case TypeCode.Int32:
+				case TypeCode.UInt32:  ldind_i4.end(); break;
+
+				case TypeCode.Int64:
+				case TypeCode.UInt64:  ldind_i8.end(); break;
+
+				case TypeCode.Single:  ldind_r4.end(); break;
+				case TypeCode.Double:  ldind_r8.end(); break;
+
+				default:
+					if (type.IsClass)
+						ldind_ref.end();
+					else if (type.IsValueType)
+						stobj(type);
+					else
+						throw CreateNotExpectedTypeException(type);
+					break;
+			}
+
+			return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldlen"/>) that
+		/// pushes the number of elements of a zero-based, one-dimensional array onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldlen">OpCodes.Ldlen</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldlen
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldlen); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldloc"/>, short) that
+		/// load an argument address onto the evaluation stack.
+		/// </summary>
+		/// <param name="index">Index of the local variable value pushed onto the stack.</param>
+		/// <seealso cref="OpCodes.Ldloc">OpCodes.Ldloc</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,short)">ILGenerator.Emit</seealso>
+		public EmitHelper ldloc(short index)
+		{
+			_ilGenerator.Emit(OpCodes.Ldloc, index); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldloc"/>, <see cref="LocalBuilder"/>) that
+		/// load an argument address onto the evaluation stack.
+		/// </summary>
+		/// <param name="localBuilder">Local variable builder.</param>
+		/// <seealso cref="OpCodes.Ldloc">OpCodes.Ldloc</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,short)">ILGenerator.Emit</seealso>
+		public EmitHelper ldloc(LocalBuilder localBuilder)
+		{
+			_ilGenerator.Emit(OpCodes.Ldloc, localBuilder); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldloca"/>, short) that
+		/// loads the address of the local variable at a specific index onto the evaluation stack.
+		/// </summary>
+		/// <param name="index">Index of the local variable.</param>
+		/// <seealso cref="OpCodes.Ldloca">OpCodes.Ldloca</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,short)">ILGenerator.Emit</seealso>
+		public EmitHelper ldloca(short index)
+		{
+			_ilGenerator.Emit(OpCodes.Ldloca, index); return this;
+		}
+		
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldloca_S"/>, byte) that
+		/// loads the address of the local variable at a specific index onto the evaluation stack, short form.
+		/// </summary>
+		/// <param name="index">Index of the local variable.</param>
+		/// <seealso cref="OpCodes.Ldloca_S">OpCodes.Ldloca_S</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,byte)">ILGenerator.Emit</seealso>
+		public EmitHelper ldloca_s(byte index)
+		{
+			_ilGenerator.Emit(OpCodes.Ldloca_S, index); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldloca"/>, <see cref="LocalBuilder"/>) that
+		/// loads the address of the local variable at a specific index onto the evaluation stack.
+		/// </summary>
+		/// <param name="local">A <see cref="LocalBuilder"/> representing the local variable.</param>
+		/// <seealso cref="OpCodes.Ldloca">OpCodes.Ldloca</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,short)">ILGenerator.Emit</seealso>
+		public EmitHelper ldloca(LocalBuilder local)
+		{
+			_ilGenerator.Emit(OpCodes.Ldloca, local); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldloc_0"/>) that
+		/// loads the local variable at index 0 onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldloc_0">OpCodes.Ldloc_0</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldloc_0
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldloc_0); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldloc_1"/>) that
+		/// loads the local variable at index 1 onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldloc_1">OpCodes.Ldloc_1</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldloc_1
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldloc_1); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldloc_2"/>) that
+		/// loads the local variable at index 2 onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldloc_2">OpCodes.Ldloc_2</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldloc_2
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldloc_2); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldloc_3"/>) that
+		/// loads the local variable at index 3 onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldloc_3">OpCodes.Ldloc_3</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldloc_3
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldloc_3); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldloc_S"/>, byte) that
+		/// loads the local variable at a specific index onto the evaluation stack, short form.
+		/// </summary>
+		/// <param name="index">Index of the local variable.</param>
+		/// <seealso cref="OpCodes.Ldloc_S">OpCodes.Ldloc_S</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,byte)">ILGenerator.Emit</seealso>
+		public EmitHelper ldloc_s(byte index)
+		{
+			_ilGenerator.Emit(OpCodes.Ldloca_S, index); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldnull"/>) that
+		/// pushes a null reference (type O) onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ldnull">OpCodes.Ldnull</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ldnull
+		{
+			get { _ilGenerator.Emit(OpCodes.Ldnull); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldobj"/>, type) that
+		/// copies the value type object pointed to by an address to the top of the evaluation stack.
+		/// </summary>
+		/// <param name="type">A Type</param>
+		/// <seealso cref="OpCodes.Ldobj">OpCodes.Ldobj</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
+		public EmitHelper ldobj(Type type)
+		{
+			_ilGenerator.Emit(OpCodes.Ldobj, type); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldsfld"/>, fieldInfo) that
+		/// pushes the value of a static field onto the evaluation stack.
+		/// </summary>
+		/// <param name="fieldInfo">A <see cref="FieldInfo"/> representing a field.</param>
+		/// <seealso cref="OpCodes.Ldsfld">OpCodes.Ldsfld</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,FieldInfo)">ILGenerator.Emit</seealso>
+		public EmitHelper ldsfld(FieldInfo fieldInfo)
+		{
+			_ilGenerator.Emit(OpCodes.Ldsfld, fieldInfo); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldsflda"/>, fieldInfo) that
+		/// pushes the address of a static field onto the evaluation stack.
+		/// </summary>
+		/// <param name="fieldInfo">A <see cref="FieldInfo"/> representing a field.</param>
+		/// <seealso cref="OpCodes.Ldsflda">OpCodes.Ldsflda</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,FieldInfo)">ILGenerator.Emit</seealso>
+		public EmitHelper ldsflda(FieldInfo fieldInfo)
+		{
+			_ilGenerator.Emit(OpCodes.Ldsflda, fieldInfo); return this;
+		}
+
+		/// <summary>
+		/// Calls <see cref="ldstr"/> -or- <see cref="ldnull"/>,
+		/// if given string is a null reference.
+		/// </summary>
+		/// <param name="str">The String to be emitted.</param>
+		/// <seealso cref="ldstr"/>
+		/// <seealso cref="ldnull"/>
+		public EmitHelper ldstrEx(string str)
+		{
+			return str == null ? ldnull : ldstr(str);
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldstr"/>, string) that
+		/// pushes a new object reference to a string literal stored in the metadata.
+		/// </summary>
+		/// <param name="str">The String to be emitted.</param>
+		/// <seealso cref="OpCodes.Ldstr">OpCodes.Ldstr</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,FieldInfo)">ILGenerator.Emit</seealso>
+		public EmitHelper ldstr(string str)
+		{
+			_ilGenerator.Emit(OpCodes.Ldstr, str); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldstr"/>, string) that
+		/// pushes a new object reference to a string literal stored in the metadata.
+		/// </summary>
+		/// <param name="nameOrIndex">The <see cref="NameOrIndexParameter"/> to be emitted.</param>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,FieldInfo)">ILGenerator.Emit</seealso>
+		public EmitHelper ldNameOrIndex(NameOrIndexParameter nameOrIndex)
+		{
+			return nameOrIndex.ByName?
+				ldstr  (nameOrIndex.Name) .call(typeof(NameOrIndexParameter), "op_Implicit", typeof(string)):
+				ldc_i4_(nameOrIndex.Index).call(typeof(NameOrIndexParameter), "op_Implicit", typeof(int));
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldtoken"/>, methodInfo) that
+		/// converts a metadata token to its runtime representation, pushing it onto the evaluation stack.
+		/// </summary>
+		/// <param name="methodInfo">The method to be called.</param>
+		/// <seealso cref="OpCodes.Ldtoken">OpCodes.Ldtoken</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,MethodInfo)">ILGenerator.Emit</seealso>
+		public EmitHelper ldtoken(MethodInfo methodInfo)
+		{
+			_ilGenerator.Emit(OpCodes.Ldtoken, methodInfo); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldtoken"/>, fieldInfo) that
+		/// converts a metadata token to its runtime representation, 
+		/// pushing it onto the evaluation stack.
+		/// </summary>
+		/// <param name="fieldInfo">A <see cref="FieldInfo"/> representing a field.</param>
+		/// <seealso cref="OpCodes.Ldtoken">OpCodes.Ldtoken</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,FieldInfo)">ILGenerator.Emit</seealso>
+		public EmitHelper ldtoken(FieldInfo fieldInfo)
+		{
+			_ilGenerator.Emit(OpCodes.Ldtoken, fieldInfo); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldtoken"/>, type) that
+		/// converts a metadata token to its runtime representation, pushing it onto the evaluation stack.
+		/// </summary>
+		/// <param name="type">A Type</param>
+		/// <seealso cref="OpCodes.Ldtoken">OpCodes.Ldtoken</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
+		public EmitHelper ldtoken(Type type)
+		{
+			_ilGenerator.Emit(OpCodes.Ldtoken, type); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ldvirtftn"/>, methodInfo) that
+		/// pushes an unmanaged pointer (type natural int) to the native code implementing a particular virtual method 
+		/// associated with a specified object onto the evaluation stack.
+		/// </summary>
+		/// <param name="methodInfo">The method to be called.</param>
+		/// <seealso cref="OpCodes.Ldvirtftn">OpCodes.Ldvirtftn</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,MethodInfo)">ILGenerator.Emit</seealso>
+		public EmitHelper ldvirtftn(MethodInfo methodInfo)
+		{
+			_ilGenerator.Emit(OpCodes.Ldvirtftn, methodInfo); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Leave"/>, label) that
+		/// exits a protected region of code, unconditionally tranferring control to a specific target instruction.
+		/// </summary>
+		/// <param name="label">The label.</param>
+		/// <seealso cref="OpCodes.Leave">OpCodes.Leave</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper leave(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Leave, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Leave_S"/>, label) that
+		/// exits a protected region of code, unconditionally transferring control to a target instruction (short form).
+		/// </summary>
+		/// <param name="label">The label.</param>
+		/// <seealso cref="OpCodes.Leave_S">OpCodes.Leave_S</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper leave_s(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Leave_S, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Localloc"/>) that
+		/// allocates a certain number of bytes from the local dynamic memory pool and pushes the address 
+		/// (a transient pointer, type *) of the first allocated byte onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Localloc">OpCodes.Localloc</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper localloc
+		{
+			get { _ilGenerator.Emit(OpCodes.Localloc); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Mkrefany"/>, type) that
+		/// pushes a typed reference to an instance of a specific type onto the evaluation stack.
+		/// </summary>
+		/// <param name="type">A Type</param>
+		/// <seealso cref="OpCodes.Mkrefany">OpCodes.Mkrefany</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
+		public EmitHelper mkrefany(Type type)
+		{
+			_ilGenerator.Emit(OpCodes.Mkrefany, type); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Mul"/>) that
+		/// multiplies two values and pushes the result on the evaluation stack.
+		/// (a transient pointer, type *) of the first allocated byte onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Mul">OpCodes.Mul</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper mul
+		{
+			get { _ilGenerator.Emit(OpCodes.Mul); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Mul_Ovf"/>) that
+		/// multiplies two integer values, performs an overflow check, 
+		/// and pushes the result onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Mul_Ovf">OpCodes.Mul_Ovf</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper mul_ovf
+		{
+			get { _ilGenerator.Emit(OpCodes.Mul_Ovf); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Mul_Ovf_Un"/>) that
+		/// multiplies two unsigned integer values, performs an overflow check, 
+		/// and pushes the result onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Mul_Ovf_Un">OpCodes.Mul_Ovf_Un</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper mul_ovf_un
+		{
+			get { _ilGenerator.Emit(OpCodes.Mul_Ovf_Un); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Neg"/>) that
+		/// negates a value and pushes the result onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Neg">OpCodes.Neg</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper neg
+		{
+			get { _ilGenerator.Emit(OpCodes.Neg); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Newarr"/>, type) that
+		/// pushes an object reference to a new zero-based, one-dimensional array whose elements 
+		/// are of a specific type onto the evaluation stack.
+		/// </summary>
+		/// <param name="type">A Type</param>
+		/// <seealso cref="OpCodes.Newarr">OpCodes.Newarr</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
+		public EmitHelper newarr(Type type)
+		{
+			_ilGenerator.Emit(OpCodes.Newarr, type); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Newobj"/>, <see cref="ConstructorInfo"/>) that
+		/// creates a new object or a new instance of a value type,
+		/// pushing an object reference (type O) onto the evaluation stack.
+		/// </summary>
+		/// <param name="constructorInfo">A <see cref="ConstructorInfo"/> representing a constructor.</param>
+		/// <seealso cref="OpCodes.Newobj">OpCodes.Newobj</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,ConstructorInfo)">ILGenerator.Emit</seealso>
+		public EmitHelper newobj(ConstructorInfo constructorInfo)
+		{
+			_ilGenerator.Emit(OpCodes.Newobj, constructorInfo); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Newobj"/>, ConstructorInfo) that
+		/// creates a new object or a new instance of a value type,
+		/// pushing an object reference (type O) onto the evaluation stack.
+		/// </summary>
+		/// <param name="type">A type.</param>
+		/// <param name="parameters">An array of System.Type objects representing
+		/// the number, order, and type of the parameters for the desired constructor.
+		/// -or- An empty array of System.Type objects, to get a constructor that takes
+		/// no parameters. Such an empty array is provided by the static field System.Type.EmptyTypes.</param>
+		public EmitHelper newobj(Type type, params Type[] parameters)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			ConstructorInfo ci = type.GetConstructor(parameters);
+
+			return newobj(ci);
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Nop"/>) that
+		/// fills space if opcodes are patched. No meaningful operation is performed although 
+		/// a processing cycle can be consumed.
+		/// </summary>
+		/// <seealso cref="OpCodes.Nop">OpCodes.Nop</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper nop
+		{
+			get { _ilGenerator.Emit(OpCodes.Nop); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Not"/>) that
+		/// computes the bitwise complement of the integer value on top of the stack 
+		/// and pushes the result onto the evaluation stack as the same type.
+		/// </summary>
+		/// <seealso cref="OpCodes.Not">OpCodes.Not</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper not
+		{
+			get { _ilGenerator.Emit(OpCodes.Not); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Or"/>) that
+		/// compute the bitwise complement of the two integer values on top of the stack and 
+		/// pushes the result onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Or">OpCodes.Or</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper or
+		{
+			get { _ilGenerator.Emit(OpCodes.Or); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Pop"/>) that
+		/// removes the value currently on top of the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Pop">OpCodes.Pop</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper pop
+		{
+			get { _ilGenerator.Emit(OpCodes.Pop); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Refanytype"/>) that
+		/// specifies that the subsequent array address operation performs
+		/// no type check at run time, and that it returns a managed pointer
+		/// whose mutability is restricted.
+		/// </summary>
+		/// <seealso cref="OpCodes.Refanytype">OpCodes.Refanytype</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper @readonly
+		{
+			get { _ilGenerator.Emit(OpCodes.Readonly); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Refanytype"/>) that
+		/// retrieves the type token embedded in a typed reference.
+		/// </summary>
+		/// <seealso cref="OpCodes.Refanytype">OpCodes.Refanytype</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper refanytype
+		{
+			get { _ilGenerator.Emit(OpCodes.Refanytype); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Refanyval"/>, type) that
+		/// retrieves the address (type &amp;) embedded in a typed reference.
+		/// </summary>
+		/// <param name="type">A Type</param>
+		/// <seealso cref="OpCodes.Refanyval">OpCodes.Refanyval</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
+		public EmitHelper refanyval(Type type)
+		{
+			_ilGenerator.Emit(OpCodes.Refanyval, type); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Rem"/>) that
+		/// divides two values and pushes the remainder onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Rem">OpCodes.Rem</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper rem
+		{
+			get { _ilGenerator.Emit(OpCodes.Rem); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Rem_Un"/>) that
+		/// divides two unsigned values and pushes the remainder onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Rem_Un">OpCodes.Rem_Un</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper rem_un
+		{
+			get { _ilGenerator.Emit(OpCodes.Rem_Un); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Ret"/>) that
+		/// returns from the current method, pushing a return value (if present) 
+		/// from the caller's evaluation stack onto the callee's evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Ret">OpCodes.Ret</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper ret()
+		{
+			_ilGenerator.Emit(OpCodes.Ret); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Rethrow"/>) that
+		/// rethrows the current exception.
+		/// </summary>
+		/// <seealso cref="OpCodes.Rethrow">OpCodes.Rethrow</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper rethrow
+		{
+			get { _ilGenerator.Emit(OpCodes.Rethrow); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Shl"/>) that
+		/// shifts an integer value to the left (in zeroes) by a specified number of bits,
+		/// pushing the result onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Shl">OpCodes.Shl</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper shl
+		{
+			get { _ilGenerator.Emit(OpCodes.Shl); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Shr"/>) that
+		/// shifts an integer value (in sign) to the right by a specified number of bits,
+		/// pushing the result onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Shr">OpCodes.Shr</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper shr
+		{
+			get { _ilGenerator.Emit(OpCodes.Shr); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Shr_Un"/>) that
+		/// shifts an unsigned integer value (in zeroes) to the right by a specified number of bits,
+		/// pushing the result onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Shr_Un">OpCodes.Shr_Un</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper shr_un
+		{
+			get { _ilGenerator.Emit(OpCodes.Shr_Un); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Sizeof"/>, type) that
+		/// pushes the size, in bytes, of a supplied value type onto the evaluation stack.
+		/// </summary>
+		/// <param name="type">A Type</param>
+		/// <seealso cref="OpCodes.Sizeof">OpCodes.Sizeof</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
+		public EmitHelper @sizeof(Type type)
+		{
+			_ilGenerator.Emit(OpCodes.Sizeof, type); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Starg"/>, short) that
+		/// stores the value on top of the evaluation stack in the argument slot at a specified index.
+		/// </summary>
+		/// <param name="index">Slot index.</param>
+		/// <seealso cref="OpCodes.Starg">OpCodes.Starg</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,short)">ILGenerator.Emit</seealso>
+		public EmitHelper starg(short index)
+		{
+			_ilGenerator.Emit(OpCodes.Starg, index); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Starg_S"/>, byte) that
+		/// stores the value on top of the evaluation stack in the argument slot at a specified index,
+		/// short form.
+		/// </summary>
+		/// <param name="index">Slot index.</param>
+		/// <seealso cref="OpCodes.Starg_S">OpCodes.Starg_S</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,byte)">ILGenerator.Emit</seealso>
+		public EmitHelper starg_s(byte index)
+		{
+			_ilGenerator.Emit(OpCodes.Starg_S, index); return this;
+		}
+
+		/// <summary>
+		/// Stores the value on top of the evaluation stack in the argument slot at a specified index.
+		/// </summary>
+		/// <param name="index">Slot index.</param>
+		/// <seealso cref="OpCodes.Starg">OpCodes.Starg</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,short)">ILGenerator.Emit</seealso>
+		public EmitHelper starg(int index)
+		{
+			if      (index < byte. MaxValue) starg_s((byte)index);
+			else if (index < short.MaxValue) starg ((short)index);
+			else
+				throw new ArgumentOutOfRangeException("index");
+
+			return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stelem_I"/>) that
+		/// replaces the array element at a given index with the natural int value 
+		/// on the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Stelem_I">OpCodes.Stelem_I</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper stelem_i
+		{
+			get { _ilGenerator.Emit(OpCodes.Stelem_I); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stelem_I1"/>) that
+		/// replaces the array element at a given index with the int8 value on the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Stelem_I1">OpCodes.Stelem_I1</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper stelem_i1
+		{
+			get { _ilGenerator.Emit(OpCodes.Stelem_I1); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stelem_I2"/>) that
+		/// replaces the array element at a given index with the int16 value on the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Stelem_I2">OpCodes.Stelem_I2</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper stelem_i2
+		{
+			get { _ilGenerator.Emit(OpCodes.Stelem_I2); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stelem_I4"/>) that
+		/// replaces the array element at a given index with the int32 value on the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Stelem_I4">OpCodes.Stelem_I4</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper stelem_i4
+		{
+			get { _ilGenerator.Emit(OpCodes.Stelem_I4); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stelem_I8"/>) that
+		/// replaces the array element at a given index with the int64 value on the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Stelem_I8">OpCodes.Stelem_I8</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper stelem_i8
+		{
+			get { _ilGenerator.Emit(OpCodes.Stelem_I8); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stelem_R4"/>) that
+		/// replaces the array element at a given index with the float32 value on the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Stelem_R4">OpCodes.Stelem_R4</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper stelem_r4
+		{
+			get { _ilGenerator.Emit(OpCodes.Stelem_R4); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stelem_R8"/>) that
+		/// replaces the array element at a given index with the float64 value on the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Stelem_R8">OpCodes.Stelem_R8</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper stelem_r8
+		{
+			get { _ilGenerator.Emit(OpCodes.Stelem_R8); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stelem_Ref"/>) that
+		/// replaces the array element at a given index with the object ref value (type O)
+		/// on the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Stelem_Ref">OpCodes.Stelem_Ref</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper stelem_ref
+		{
+			get { _ilGenerator.Emit(OpCodes.Stelem_Ref); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stfld"/>, <see cref="FieldInfo"/>) that
+		/// replaces the value stored in the field of an object reference or pointer with a new value.
+		/// </summary>
+		/// <param name="fieldInfo">A <see cref="FieldInfo"/> representing a field.</param>
+		/// <seealso cref="OpCodes.Stfld">OpCodes.Stfld</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,FieldInfo)">ILGenerator.Emit</seealso>
+		public EmitHelper stfld(FieldInfo fieldInfo)
+		{
+			_ilGenerator.Emit(OpCodes.Stfld, fieldInfo); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stind_I"/>) that
+		/// stores a value of type natural int at a supplied address.
+		/// </summary>
+		/// <seealso cref="OpCodes.Stind_I">OpCodes.Stind_I</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper stind_i
+		{
+			get { _ilGenerator.Emit(OpCodes.Stind_I); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stind_I1"/>) that
+		/// stores a value of type int8 at a supplied address.
+		/// </summary>
+		/// <seealso cref="OpCodes.Stind_I1">OpCodes.Stind_I1</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper stind_i1
+		{
+			get { _ilGenerator.Emit(OpCodes.Stind_I1); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stind_I2"/>) that
+		/// stores a value of type int16 at a supplied address.
+		/// </summary>
+		/// <seealso cref="OpCodes.Stind_I2">OpCodes.Stind_I2</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper stind_i2
+		{
+			get { _ilGenerator.Emit(OpCodes.Stind_I2); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stind_I4"/>) that
+		/// stores a value of type int32 at a supplied address.
+		/// </summary>
+		/// <seealso cref="OpCodes.Stind_I4">OpCodes.Stind_I4</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper stind_i4
+		{
+			get { _ilGenerator.Emit(OpCodes.Stind_I4); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stind_I8"/>) that
+		/// stores a value of type int64 at a supplied address.
+		/// </summary>
+		/// <seealso cref="OpCodes.Stind_I8">OpCodes.Stind_I8</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper stind_i8
+		{
+			get { _ilGenerator.Emit(OpCodes.Stind_I8); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stind_R4"/>) that
+		/// stores a value of type float32 at a supplied address.
+		/// </summary>
+		/// <seealso cref="OpCodes.Stind_R4">OpCodes.Stind_R4</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper stind_r4
+		{
+			get { _ilGenerator.Emit(OpCodes.Stind_R4); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stind_R8"/>) that
+		/// stores a value of type float64 at a supplied address.
+		/// </summary>
+		/// <seealso cref="OpCodes.Stind_R8">OpCodes.Stind_R8</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper stind_r8
+		{
+			get { _ilGenerator.Emit(OpCodes.Stind_R8); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stind_Ref"/>) that
+		/// stores an object reference value at a supplied address.
+		/// </summary>
+		/// <seealso cref="OpCodes.Stind_Ref">OpCodes.Stind_Ref</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper stind_ref
+		{
+			get { _ilGenerator.Emit(OpCodes.Stind_Ref); return this; }
+		}
+
+		/// <summary>
+		/// Stores a value of the type at a supplied address.
+		/// </summary>
+		/// <param name="type">A Type.</param>
+		public EmitHelper stind(Type type)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.Boolean:
+				case TypeCode.Byte:
+				case TypeCode.SByte:   stind_i1.end(); break;
+
+				case TypeCode.Char:
+				case TypeCode.Int16:
+				case TypeCode.UInt16:  stind_i2.end(); break;
+
+				case TypeCode.Int32:
+				case TypeCode.UInt32:  stind_i4.end(); break;
+
+				case TypeCode.Int64:
+				case TypeCode.UInt64:  stind_i8.end(); break;
+
+				case TypeCode.Single:  stind_r4.end(); break;
+				case TypeCode.Double:  stind_r8.end(); break;
+
+				default:
+					if (type.IsClass)
+						stind_ref.end();
+					else if (type.IsValueType)
+						stobj(type);
+			else
+						throw CreateNotExpectedTypeException(type);
+					break;
+			}
+
+			return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stloc"/>, <see cref="LocalBuilder"/>) that
+		/// pops the current value from the top of the evaluation stack and stores it 
+		/// in the local variable list at a specified index.
+		/// </summary>
+		/// <param name="local">A local variable.</param>
+		/// <seealso cref="OpCodes.Stloc">OpCodes.Stloc</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,LocalBuilder)">ILGenerator.Emit</seealso>
+		public EmitHelper stloc(LocalBuilder local)
+		{
+			_ilGenerator.Emit(OpCodes.Stloc, local); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stloc"/>, short) that
+		/// pops the current value from the top of the evaluation stack and stores it 
+		/// in the local variable list at a specified index.
+		/// </summary>
+		/// <param name="index">A local variable index.</param>
+		/// <seealso cref="OpCodes.Stloc">OpCodes.Stloc</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,short)">ILGenerator.Emit</seealso>
+		public EmitHelper stloc(short index)
+		{
+			if (index >= byte.MinValue && index <= byte.MaxValue)
+				return stloc_s((byte)index);
+
+			_ilGenerator.Emit(OpCodes.Stloc, index);
+			return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stloc_0"/>) that
+		/// pops the current value from the top of the evaluation stack and stores it 
+		/// in the local variable list at index 0.
+		/// </summary>
+		/// <seealso cref="OpCodes.Stloc_0">OpCodes.Stloc_0</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper stloc_0
+		{
+			get { _ilGenerator.Emit(OpCodes.Stloc_0); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stloc_1"/>) that
+		/// pops the current value from the top of the evaluation stack and stores it 
+		/// in the local variable list at index 1.
+		/// </summary>
+		/// <seealso cref="OpCodes.Stloc_1">OpCodes.Stloc_1</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper stloc_1
+		{
+			get { _ilGenerator.Emit(OpCodes.Stloc_1); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stloc_2"/>) that
+		/// pops the current value from the top of the evaluation stack and stores it 
+		/// in the local variable list at index 2.
+		/// </summary>
+		/// <seealso cref="OpCodes.Stloc_2">OpCodes.Stloc_2</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper stloc_2
+		{
+			get { _ilGenerator.Emit(OpCodes.Stloc_2); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stloc_3"/>) that
+		/// pops the current value from the top of the evaluation stack and stores it 
+		/// in the local variable list at index 3.
+		/// </summary>
+		/// <seealso cref="OpCodes.Stloc_3">OpCodes.Stloc_3</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper stloc_3
+		{
+			get { _ilGenerator.Emit(OpCodes.Stloc_3); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stloc_S"/>, <see cref="LocalBuilder"/>) that
+		/// pops the current value from the top of the evaluation stack and stores it 
+		/// in the local variable list at index (short form).
+		/// </summary>
+		/// <param name="local">A local variable.</param>
+		/// <seealso cref="OpCodes.Stloc_S">OpCodes.Stloc_S</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,LocalBuilder)">ILGenerator.Emit</seealso>
+		public EmitHelper stloc_s(LocalBuilder local)
+		{
+			_ilGenerator.Emit(OpCodes.Stloc_S, local); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stloc_S"/>, byte) that
+		/// pops the current value from the top of the evaluation stack and stores it 
+		/// in the local variable list at index (short form).
+		/// </summary>
+		/// <param name="index">A local variable index.</param>
+		/// <seealso cref="OpCodes.Stloc_S">OpCodes.Stloc_S</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,short)">ILGenerator.Emit</seealso>
+		public EmitHelper stloc_s(byte index)
+		{
+			switch (index)
+			{
+				case 0: stloc_0.end(); break;
+				case 1: stloc_1.end(); break;
+				case 2: stloc_2.end(); break;
+				case 3: stloc_3.end(); break;
+
+				default:
+					_ilGenerator.Emit(OpCodes.Stloc_S, index); break;
+			}
+
+			return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stobj"/>, type) that
+		/// copies a value of a specified type from the evaluation stack into a supplied memory address.
+		/// </summary>
+		/// <param name="type">A Type</param>
+		/// <seealso cref="OpCodes.Stobj">OpCodes.Stobj</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
+		public EmitHelper stobj(Type type)
+		{
+			_ilGenerator.Emit(OpCodes.Stobj, type); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Stsfld"/>, fieldInfo) that
+		/// replaces the value of a static field with a value from the evaluation stack.
+		/// </summary>
+		/// <param name="fieldInfo">A <see cref="FieldInfo"/> representing a field.</param>
+		/// <seealso cref="OpCodes.Stsfld">OpCodes.Stsfld</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,FieldInfo)">ILGenerator.Emit</seealso>
+		public EmitHelper stsfld(FieldInfo fieldInfo)
+		{
+			_ilGenerator.Emit(OpCodes.Stsfld, fieldInfo); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Sub"/>) that
+		/// subtracts one value from another and pushes the result onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Sub">OpCodes.Sub</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper sub
+		{
+			get { _ilGenerator.Emit(OpCodes.Sub); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Sub_Ovf"/>) that
+		/// subtracts one integer value from another, performs an overflow check,
+		/// and pushes the result onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Sub_Ovf">OpCodes.Sub_Ovf</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper sub_ovf
+		{
+			get { _ilGenerator.Emit(OpCodes.Sub_Ovf); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Sub_Ovf_Un"/>) that
+		/// subtracts one unsigned integer value from another, performs an overflow check,
+		/// and pushes the result onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Sub_Ovf_Un">OpCodes.Sub_Ovf_Un</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper sub_ovf_un
+		{
+			get { _ilGenerator.Emit(OpCodes.Sub_Ovf_Un); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Switch"/>, label[]) that
+		/// implements a jump table.
+		/// </summary>
+		/// <param name="labels">The array of label objects to which to branch from this location.</param>
+		/// <seealso cref="OpCodes.Switch">OpCodes.Switch</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label[])">ILGenerator.Emit</seealso>
+		public EmitHelper @switch(Label[] labels)
+		{
+			_ilGenerator.Emit(OpCodes.Switch, labels); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Tailcall"/>) that
+		/// performs a postfixed method call instruction such that the current method's stack frame 
+		/// is removed before the actual call instruction is executed.
+		/// </summary>
+		/// <seealso cref="OpCodes.Tailcall">OpCodes.Tailcall</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper tailcall
+		{
+			get { _ilGenerator.Emit(OpCodes.Tailcall); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Throw"/>) that
+		/// throws the exception object currently on the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Throw">OpCodes.Throw</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper @throw
+		{
+			get { _ilGenerator.Emit(OpCodes.Throw); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Unaligned"/>, label) that
+		/// indicates that an address currently atop the evaluation stack might not be aligned 
+		/// to the natural size of the immediately following ldind, stind, ldfld, stfld, ldobj, stobj, 
+		/// initblk, or cpblk instruction.
+		/// </summary>
+		/// <param name="label">The label to branch from this location.</param>
+		/// <seealso cref="OpCodes.Unaligned">OpCodes.Unaligned</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Label)">ILGenerator.Emit</seealso>
+		public EmitHelper unaligned(Label label)
+		{
+			_ilGenerator.Emit(OpCodes.Unaligned, label); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Unaligned"/>, long) that
+		/// indicates that an address currently atop the evaluation stack might not be aligned 
+		/// to the natural size of the immediately following ldind, stind, ldfld, stfld, ldobj, stobj, 
+		/// initblk, or cpblk instruction.
+		/// </summary>
+		/// <param name="addr">An address is pushed onto the stack.</param>
+		/// <seealso cref="OpCodes.Unaligned">OpCodes.Unaligned</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,long)">ILGenerator.Emit</seealso>
+		public EmitHelper unaligned(long addr)
+		{
+			_ilGenerator.Emit(OpCodes.Unaligned, addr); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Unbox"/>, type) that
+		/// converts the boxed representation of a value type to its unboxed form.
+		/// </summary>
+		/// <param name="type">A Type</param>
+		/// <seealso cref="OpCodes.Unbox">OpCodes.Unbox</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
+		public EmitHelper unbox(Type type)
+		{
+			_ilGenerator.Emit(OpCodes.Unbox, type); return this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Unbox_Any"/>, type) that
+		/// converts the boxed representation of a value type to its unboxed form.
+		/// </summary>
+		/// <param name="type">A Type</param>
+		/// <seealso cref="OpCodes.Unbox_Any">OpCodes.Unbox_Any</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
+		public EmitHelper unbox_any(Type type)
+		{
+			_ilGenerator.Emit(OpCodes.Unbox_Any, type);
+			return this;
+		}
+
+		/// <summary>
+		/// Calls <see cref="unbox_any(Type)"/> if given type is a value type.
+		/// </summary>
+		/// <param name="type">A Type</param>
+		/// <seealso cref="OpCodes.Unbox_Any">OpCodes.Unbox</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode,Type)">ILGenerator.Emit</seealso>
+		public EmitHelper unboxIfValueType(Type type)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			return type.IsValueType? unbox_any(type): this;
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Volatile"/>) that
+		/// specifies that an address currently atop the evaluation stack might be volatile, 
+		/// and the results of reading that location cannot be cached or that multiple stores 
+		/// to that location cannot be suppressed.
+		/// </summary>
+		/// <seealso cref="OpCodes.Volatile">OpCodes.Volatile</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper @volatile
+		{
+			get { _ilGenerator.Emit(OpCodes.Volatile); return this; }
+		}
+
+		/// <summary>
+		/// Calls ILGenerator.Emit(<see cref="OpCodes.Xor"/>) that
+		/// computes the bitwise XOR of the top two values on the evaluation stack, 
+		/// pushing the result onto the evaluation stack.
+		/// </summary>
+		/// <seealso cref="OpCodes.Xor">OpCodes.Xor</seealso>
+		/// <seealso cref="System.Reflection.Emit.ILGenerator.Emit(OpCode)">ILGenerator.Emit</seealso>
+		public EmitHelper xor
+		{
+			get { _ilGenerator.Emit(OpCodes.Xor); return this; }
+		}
+
+		/// <summary>
+		/// Ends sequence of property calls.
+		/// </summary>
+		[SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic")]
+		public void end()
+		{
+		}
+
+		#endregion
+
+		/// <summary>
+		/// Loads default value of given type onto the evaluation stack.
+		/// </summary>
+		/// <param name="type">A Type</param>
+		public EmitHelper LoadInitValue(Type type)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.Boolean:
+				case TypeCode.Char:
+				case TypeCode.SByte:
+				case TypeCode.Int16:
+				case TypeCode.Int32:
+				case TypeCode.Byte:
+				case TypeCode.UInt16:
+				case TypeCode.UInt32:
+					ldc_i4_0.end();
+					break;
+
+				case TypeCode.Int64:
+				case TypeCode.UInt64:
+					ldc_i4_0.conv_i8.end();
+					break;
+
+				case TypeCode.Single:
+				case TypeCode.Double:
+					ldc_r4(0).end();
+					break;
+
+				case TypeCode.String:
+					ldsfld(typeof(string).GetField("Empty"));
+					break;
+
+				default:
+					if (type.IsClass || type.IsInterface)
+						ldnull.end();
+					else
+						throw CreateNotExpectedTypeException(type);
+					break;
+			}
+
+			return this;
+		}
+
+		/// <summary>
+		/// Loads supplied object value (if possible) onto the evaluation stack.
+		/// </summary>
+		/// <param name="o">Any object instance or null reference.</param>
+		/// <returns>True is a value was loaded, otherwise false.</returns>
+		public bool LoadWellKnownValue(object o)
+		{
+			if (o == null)
+				ldnull.end();
+			else
+				switch (Type.GetTypeCode(o.GetType()))
+				{
+					case TypeCode.Boolean:  ldc_bool((Boolean)o); break;
+					case TypeCode.Char:     ldc_i4_ ((Char)   o); break;
+					case TypeCode.Single:   ldc_r4  ((Single) o); break;
+					case TypeCode.Double:   ldc_r8  ((Double) o); break;
+					case TypeCode.String:   ldstr   ((String) o); break;
+					case TypeCode.SByte:    ldc_i4_ ((SByte)  o); break;
+					case TypeCode.Int16:    ldc_i4_ ((Int16)  o); break;
+					case TypeCode.Int32:    ldc_i4_ ((Int32)  o); break;
+					case TypeCode.Int64:    ldc_i8  ((Int64)  o); break;
+					case TypeCode.Byte:     ldc_i4_ ((Byte)   o); break;
+					case TypeCode.UInt16:   ldc_i4_ ((UInt16) o); break;
+					case TypeCode.UInt32:   ldc_i4_ (unchecked((Int32)(UInt32)o)); break;
+					case TypeCode.UInt64:   ldc_i8  (unchecked((Int64)(UInt64)o)); break;
+					default:
+						return false;
+				}
+
+			return true;
+		}
+
+		/// <summary>
+		/// Initialize parameter with some default value.
+		/// </summary>
+		/// <param name="parameterInfo">A method parameter.</param>
+		/// <param name="index">The parameter index.</param>
+		public EmitHelper Init(ParameterInfo parameterInfo, int index)
+		{
+			if (parameterInfo == null) throw new ArgumentNullException("parameterInfo");
+
+			Type type = TypeHelper.GetUnderlyingType(parameterInfo.ParameterType);
+
+			if (parameterInfo.ParameterType.IsByRef)
+			{
+				type = type.GetElementType();
+
+				return type.IsValueType && type.IsPrimitive == false?
+					ldarg(index).initobj(type):
+					ldarg(index).LoadInitValue(type).stind(type);
+			}
+			else
+			{
+				return type.IsValueType && type.IsPrimitive == false?
+					ldarga(index).initobj(type):
+					LoadInitValue(type).starg(index);
+			}
+		}
+
+		/// <summary>
+		/// Initialize all output parameters with some default value.
+		/// </summary>
+		/// <param name="parameters">A method parameters array.</param>
+		public EmitHelper InitOutParameters(ParameterInfo[] parameters)
+		{
+			for (int i = 0; i < parameters.Length; i++)
+			{
+				ParameterInfo pi = parameters[i];
+
+				if (pi.IsOut)
+					Init(pi, i + 1);
+			}
+
+			return this;
+		}
+
+		/// <summary>
+		/// Initialize local variable with some default value.
+		/// </summary>
+		/// <param name="localBuilder">A method local variable.</param>
+		public EmitHelper Init(LocalBuilder localBuilder)
+		{
+			if (localBuilder == null) throw new ArgumentNullException("localBuilder");
+
+			Type type = localBuilder.LocalType;
+
+			if (type.IsEnum)
+				type = Enum.GetUnderlyingType(type);
+
+			return type.IsValueType && type.IsPrimitive == false?
+				ldloca(localBuilder).initobj(type):
+				LoadInitValue(type).stloc(localBuilder);
+		}
+
+		/// <summary>
+		/// Loads a type instance at runtime.
+		/// </summary>
+		/// <param name="type">A type</param>
+		public EmitHelper LoadType(Type type)
+		{
+			return type == null?
+				ldnull:
+				ldtoken(type).call(typeof(Type), "GetTypeFromHandle", typeof(RuntimeTypeHandle));
+		}
+
+		/// <summary>
+		/// Loads a field instance at runtime.
+		/// </summary>
+		/// <param name="fieldInfo">A <see cref="FieldInfo"/> representing a field.</param>
+		public EmitHelper LoadField(FieldInfo fieldInfo)
+		{
+			return fieldInfo.IsStatic ? ldsfld(fieldInfo) : ldarg_0.ldfld(fieldInfo);
+		}
+
+		/// <summary>
+		/// Cast an object passed by reference to the specified type
+		/// or unbox a boxed value type.
+		/// </summary>
+		/// <param name="type">A type</param>
+		public EmitHelper CastFromObject(Type type)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			return
+				type == typeof(object)? this:
+				(type.IsValueType?      unbox_any(type):
+					castclass(type));
+		}
+
+		/// <summary>
+		/// Cast an object passed by reference to the specified type
+		/// or unbox a boxed value type unless <paramref name="expectedType"/>
+		/// is a parent of <paramref name="actualType"/>.
+		/// </summary>
+		/// <param name="expectedType">A type required.</param>
+		/// <param name="actualType">A type available.</param>
+		public EmitHelper CastIfNecessary(Type expectedType, Type actualType)
+		{
+			if (expectedType == null) throw new ArgumentNullException("expectedType");
+			if (actualType   == null) throw new ArgumentNullException("actualType");
+
+			return
+				TypeHelper.IsSameOrParent(expectedType, actualType)? this:
+				actualType.IsValueType?                              unbox_any(expectedType):
+					castclass(expectedType);
+		}
+
+		/// <summary>
+		/// Increase max stack size by specified delta.
+		/// </summary>
+		/// <param name="size">Number of bytes to enlarge max stack size.</param>
+		public void AddMaxStackSize(int size)
+		{
+			// m_maxStackSize isn't public so we need some hacking here.
+			//
+			FieldInfo fi = _ilGenerator.GetType().GetField(
+				"m_maxStackSize", BindingFlags.Instance | BindingFlags.NonPublic);
+
+			if (fi != null)
+			{
+				size += (int)fi.GetValue(_ilGenerator);
+				fi.SetValue(_ilGenerator, size);
+			}
+		}
+
+		private static Exception CreateNoSuchMethodException(Type type, string methodName)
+		{
+			return new InvalidOperationException(
+				string.Format(Resources.EmitHelper_NoSuchMethod, type.FullName, methodName));
+		}
+
+		private static Exception CreateNotExpectedTypeException(Type type)
+		{
+			return new ArgumentException(
+				string.Format(Resources.EmitHelper_NotExpectedType, type.FullName));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/Emit/Examples.CS.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<examples>
+
+<emit name="Emit">
+<example>
+<code lang="C#">
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Reflection;
+using BLToolkit.Reflection.Emit;
+
+namespace Examples.Reflection.Emit
+{
+	[TestFixture]
+	public class HelloWorld
+	{
+		public interface IHello
+		{
+			void SayHello(string toWhom);
+		}
+
+		[Test]
+		public void Test()
+		{
+			EmitHelper emit = new AssemblyBuilderHelper("HelloWorld.dll")
+				.DefineType  ("Hello", typeof(object), typeof(IHello))
+				.DefineMethod(typeof(IHello).GetMethod("SayHello"))
+				.Emitter;
+
+			/*[a]*/emit/*[/a]*/
+				// string.Format("Hello, {0}!", toWhom)
+				//
+				./*[a]*/ldstr/*[/a]*/   ("Hello, {0}!")
+				./*[a]*/ldarg_1/*[/a]*/
+				./*[a]*/call/*[/a]*/    (typeof(string), "Format", typeof(string), typeof(object))
+
+				// Console.WriteLine("Hello, World!");
+				//
+				./*[a]*/call/*[/a]*/    (typeof(Console), "WriteLine", typeof(string))
+				./*[a]*/ret/*[/a]*/()
+				;
+
+			Type type = emit.Method.Type.Create();
+
+			IHello hello = (IHello)TypeAccessor.CreateInstance(type);
+
+			hello.SayHello("World");
+		}
+	}
+}
+</code>
+</example>
+</emit>
+
+
+</examples>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/Emit/Examples.VB.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<examples>
+
+<emit name="Emit">
+<example>
+<code lang="VB">
+Imports System
+Imports NUnit.Framework
+
+Imports BLToolkit.Reflection
+Imports BLToolkit.Reflection.Emit
+
+Namespace Examples.Reflection.Emit
+
+    &lt;TestFixture()&gt; _
+    Public Class HelloWorld
+
+        Public Interface IHello
+            Sub SayHello(ByVal toWhom As String)
+        End Interface
+
+        &lt;Test()&gt; _
+        Sub Test()
+            Dim assemblyHelper As AssemblyBuilderHelper = New AssemblyBuilderHelper("HelloWorld.dll")
+            Dim typeHelper As TypeBuilderHelper = assemblyHelper.DefineType("Hello", GetType(Object), GetType(IHello))
+            Dim methodHelper As MethodBuilderHelper = typeHelper.DefineMethod(GetType(IHello).GetMethod("SayHello"))
+            Dim emit As EmitHelper = methodHelper.Emitter
+
+            ' string.Format("Hello, {0} World!", toWhom)
+            '
+            emit _
+            .ldstr("Hello, {0} World!") _
+            .ldarg_1 _
+            .call(GetType(String), "Format", GetType(String), GetType(Object))
+
+            ' Console.WriteLine("Hello, World!");
+            '
+            emit _
+            .call(GetType(Console), "WriteLine", GetType(String)) _
+            .ret()
+
+            Dim type As Type = typeHelper.Create()
+
+            Dim hello As IHello = TypeAccessor.CreateInstance(type)
+
+            hello.SayHello("VB")
+        End Sub
+
+    End Class
+
+End Namespace
+</code>
+</example>
+</emit>
+
+
+</examples>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/Emit/MethodBuilderBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,36 @@
+using System;
+
+namespace BLToolkit.Reflection.Emit
+{
+	/// <summary>
+	/// Base class for wrappers around methods and constructors.
+	/// </summary>
+	public abstract class MethodBuilderBase
+	{
+		/// <summary>
+		/// Initializes a new instance of the <see cref="MethodBuilderHelper"/> class
+		/// with the specified parameters.
+		/// </summary>
+		/// <param name="typeBuilder">Associated <see cref="TypeBuilderHelper"/>.</param>
+		protected MethodBuilderBase(TypeBuilderHelper typeBuilder)
+		{
+			if (typeBuilder == null) throw new ArgumentNullException("typeBuilder");
+
+			_type = typeBuilder;
+		}
+
+		private readonly TypeBuilderHelper _type;
+		/// <summary>
+		/// Gets associated <see cref="TypeBuilderHelper"/>.
+		/// </summary>
+		public           TypeBuilderHelper  Type
+		{
+			get { return _type; }
+		}
+
+		/// <summary>
+		/// Gets <see cref="EmitHelper"/>.
+		/// </summary>
+		public abstract EmitHelper Emitter { get; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/Emit/MethodBuilderHelper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,207 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection.Emit;
+using System.Reflection;
+
+namespace BLToolkit.Reflection.Emit
+{
+	/// <summary>
+	/// A wrapper around the <see cref="MethodBuilder"/> class.
+	/// </summary>
+	/// <include file="Examples.CS.xml" path='examples/emit[@name="Emit"]/*' />
+	/// <include file="Examples.VB.xml" path='examples/emit[@name="Emit"]/*' />
+	/// <seealso cref="System.Reflection.Emit.MethodBuilder">MethodBuilder Class</seealso>
+	public class MethodBuilderHelper : MethodBuilderBase
+	{
+		/// <summary>
+		/// Initializes a new instance of the <see cref="MethodBuilderHelper"/> class
+		/// with the specified parameters.
+		/// </summary>
+		/// <param name="typeBuilder">Associated <see cref="TypeBuilderHelper"/>.</param>
+		/// <param name="methodBuilder">A <see cref="MethodBuilder"/></param>
+		public MethodBuilderHelper(TypeBuilderHelper typeBuilder, MethodBuilder methodBuilder)
+			: base(typeBuilder)
+		{
+			if (methodBuilder == null) throw new ArgumentNullException("methodBuilder");
+
+			_methodBuilder = methodBuilder;
+
+			methodBuilder.SetCustomAttribute(Type.Assembly.BLToolkitAttribute);
+		}
+
+		/// <summary>
+		/// Sets a custom attribute using a custom attribute type.
+		/// </summary>
+		/// <param name="attributeType">Attribute type.</param>
+		public void SetCustomAttribute(Type attributeType)
+		{
+			if (attributeType == null) throw new ArgumentNullException("attributeType");
+
+			ConstructorInfo ci = attributeType.GetConstructor(System.Type.EmptyTypes);
+			CustomAttributeBuilder caBuilder = new CustomAttributeBuilder(ci, new object[0]);
+
+			_methodBuilder.SetCustomAttribute(caBuilder);
+		}
+
+		/// <summary>
+		/// Sets a custom attribute using a custom attribute type
+		/// and named properties.
+		/// </summary>
+		/// <param name="attributeType">Attribute type.</param>
+		/// <param name="properties">Named properties of the custom attribute.</param>
+		/// <param name="propertyValues">Values for the named properties of the custom attribute.</param>
+		public void SetCustomAttribute(
+			Type           attributeType,
+			PropertyInfo[] properties,
+			object[]       propertyValues)
+		{
+			if (attributeType == null) throw new ArgumentNullException("attributeType");
+
+			ConstructorInfo ci = attributeType.GetConstructor(System.Type.EmptyTypes);
+			CustomAttributeBuilder caBuilder = new CustomAttributeBuilder(
+				ci, new object[0], properties, propertyValues);
+
+			_methodBuilder.SetCustomAttribute(caBuilder);
+		}
+
+		/// <summary>
+		/// Sets a custom attribute using a custom attribute type
+		/// and named property.
+		/// </summary>
+		/// <param name="attributeType">Attribute type.</param>
+		/// <param name="propertyName">A named property of the custom attribute.</param>
+		/// <param name="propertyValue">Value for the named property of the custom attribute.</param>
+		public void SetCustomAttribute(
+			Type   attributeType,
+			string propertyName,
+			object propertyValue)
+		{
+			SetCustomAttribute(
+				attributeType,
+				new PropertyInfo[] { attributeType.GetProperty(propertyName) },
+				new object[] { propertyValue });
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="MethodBuilderHelper"/> class
+		/// with the specified parameters.
+		/// </summary>
+		/// <param name="typeBuilder">Associated <see cref="TypeBuilderHelper"/>.</param>
+		/// <param name="methodBuilder">A <see cref="MethodBuilder"/></param>
+		/// <param name="genericArguments">Generic arguments of the method.</param>
+		/// <param name="returnType">The return type of the method.</param>
+		/// <param name="parameterTypes">The types of the parameters of the method.</param>
+		internal MethodBuilderHelper(
+			TypeBuilderHelper  typeBuilder,
+			MethodBuilder      methodBuilder,
+			Type[]             genericArguments,
+			Type               returnType,
+			Type[]             parameterTypes
+			)
+			: base(typeBuilder)
+		{
+			if (methodBuilder    == null) throw new ArgumentNullException("methodBuilder");
+			if (genericArguments == null) throw new ArgumentNullException("genericArguments");
+
+			_methodBuilder = methodBuilder;
+
+			var genArgNames = genericArguments.Select(t => t.Name).ToArray();
+			var genParams   = methodBuilder.DefineGenericParameters(genArgNames);
+
+			// Copy parameter constraints.
+			//
+			List<Type> interfaceConstraints = null;
+
+			for (var i = 0; i < genParams.Length; i++)
+			{
+				genParams[i].SetGenericParameterAttributes(genericArguments[i].GenericParameterAttributes);
+
+				foreach (var constraint in genericArguments[i].GetGenericParameterConstraints())
+				{
+					if (constraint.IsClass)
+						genParams[i].SetBaseTypeConstraint(constraint);
+					else
+					{
+						if (interfaceConstraints == null)
+							interfaceConstraints = new List<Type>();
+						interfaceConstraints.Add(constraint);
+					}
+				}
+
+				if (interfaceConstraints != null && interfaceConstraints.Count != 0)
+				{
+					genParams[i].SetInterfaceConstraints(interfaceConstraints.ToArray());
+					interfaceConstraints.Clear();
+				}
+			}
+
+			// When a method contains a generic parameter we need to replace all
+			// generic types from methodInfoDeclaration with local ones.
+			//
+			for (var i = 0; i < parameterTypes.Length; i++)
+				parameterTypes[i] = TypeHelper.TranslateGenericParameters(parameterTypes[i], genParams);
+
+			methodBuilder.SetParameters(parameterTypes);
+			methodBuilder.SetReturnType(TypeHelper.TranslateGenericParameters(returnType, genParams));
+
+			// Once all generic stuff is done is it is safe to call SetCustomAttribute
+			//
+			methodBuilder.SetCustomAttribute(Type.Assembly.BLToolkitAttribute);
+		}
+
+		private readonly MethodBuilder _methodBuilder;
+		/// <summary>
+		/// Gets MethodBuilder.
+		/// </summary>
+		public MethodBuilder MethodBuilder
+		{
+			get { return _methodBuilder; }
+		}
+
+		/// <summary>
+		/// Converts the supplied <see cref="MethodBuilderHelper"/> to a <see cref="MethodBuilder"/>.
+		/// </summary>
+		/// <param name="methodBuilder">The <see cref="MethodBuilderHelper"/>.</param>
+		/// <returns>A <see cref="MethodBuilder"/>.</returns>
+		public static implicit operator MethodBuilder(MethodBuilderHelper methodBuilder)
+		{
+			if (methodBuilder == null) throw new ArgumentNullException("methodBuilder");
+
+			return methodBuilder.MethodBuilder;
+		}
+
+		private EmitHelper _emitter;
+		/// <summary>
+		/// Gets <see cref="EmitHelper"/>.
+		/// </summary>
+		public override EmitHelper Emitter
+		{
+			get
+			{
+				if (_emitter == null)
+					_emitter = new EmitHelper(this, _methodBuilder.GetILGenerator());
+
+				return _emitter;
+			}
+		}
+
+		private MethodInfo _overriddenMethod;
+		/// <summary>
+		/// Gets or sets the base type method overridden by this method, if any.
+		/// </summary>
+		public  MethodInfo  OverriddenMethod
+		{
+			get { return _overriddenMethod;  }
+			set { _overriddenMethod = value; }
+		}
+
+		/// <summary>
+		/// Returns the type that declares this method.
+		/// </summary>
+		public Type DeclaringType
+		{
+			get { return _methodBuilder.DeclaringType; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/Emit/TypeBuilderHelper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,578 @@
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Reflection.Emit;
+
+namespace BLToolkit.Reflection.Emit
+{
+	using TypeBuilder.Builders;
+
+	/// <summary>
+	/// A wrapper around the <see cref="TypeBuilder"/> class.
+	/// </summary>
+	/// <include file="Examples.CS.xml" path='examples/emit[@name="Emit"]/*' />
+	/// <include file="Examples.VB.xml" path='examples/emit[@name="Emit"]/*' />
+	/// <seealso cref="System.Reflection.Emit.TypeBuilder">TypeBuilder Class</seealso>
+	public class TypeBuilderHelper
+	{
+		/// <summary>
+		/// Initializes a new instance of the <see cref="TypeBuilderHelper"/> class
+		/// with the specified parameters.
+		/// </summary>
+		/// <param name="assemblyBuilder">Associated <see cref="AssemblyBuilderHelper"/>.</param>
+		/// <param name="typeBuilder">A <see cref="TypeBuilder"/></param>
+		public TypeBuilderHelper(AssemblyBuilderHelper assemblyBuilder, System.Reflection.Emit.TypeBuilder typeBuilder)
+		{
+			if (assemblyBuilder == null) throw new ArgumentNullException("assemblyBuilder");
+			if (typeBuilder     == null) throw new ArgumentNullException("typeBuilder");
+
+			_assembly    = assemblyBuilder;
+			_typeBuilder = typeBuilder;
+
+			_typeBuilder.SetCustomAttribute(_assembly.BLToolkitAttribute);
+		}
+
+		private readonly AssemblyBuilderHelper _assembly;
+		/// <summary>
+		/// Gets associated <see cref="AssemblyBuilderHelper"/>.
+		/// </summary>
+		public  AssemblyBuilderHelper  Assembly
+		{
+			get { return _assembly; }
+		}
+
+		private readonly System.Reflection.Emit.TypeBuilder _typeBuilder;
+		/// <summary>
+		/// Gets <see cref="System.Reflection.Emit.TypeBuilder"/>.
+		/// </summary>
+		public  System.Reflection.Emit.TypeBuilder  TypeBuilder
+		{
+			get { return _typeBuilder; }
+		}
+
+		/// <summary>
+		/// Converts the supplied <see cref="TypeBuilderHelper"/> to a <see cref="TypeBuilder"/>.
+		/// </summary>
+		/// <param name="typeBuilder">The <see cref="TypeBuilderHelper"/>.</param>
+		/// <returns>A <see cref="TypeBuilder"/>.</returns>
+		public static implicit operator System.Reflection.Emit.TypeBuilder(TypeBuilderHelper typeBuilder)
+		{
+			if (typeBuilder == null) throw new ArgumentNullException("typeBuilder");
+
+			return typeBuilder.TypeBuilder;
+		}
+
+		#region DefineMethod Overrides
+
+		/// <summary>
+		/// Adds a new method to the class, with the given name and method signature.
+		/// </summary>
+		/// <param name="name">The name of the method. name cannot contain embedded nulls. </param>
+		/// <param name="attributes">The attributes of the method. </param>
+		/// <param name="returnType">The return type of the method.</param>
+		/// <param name="parameterTypes">The types of the parameters of the method.</param>
+		/// <returns>The defined method.</returns>
+		public MethodBuilderHelper DefineMethod(
+			string name, MethodAttributes attributes, Type returnType, params Type[] parameterTypes)
+		{
+			return new MethodBuilderHelper(this, _typeBuilder.DefineMethod(name, attributes, returnType, parameterTypes));
+		}
+
+		/// <summary>
+		/// Adds a new method to the class, with the given name and method signature.
+		/// </summary>
+		/// <param name="name">The name of the method. name cannot contain embedded nulls. </param>
+		/// <param name="attributes">The attributes of the method. </param>
+		/// <param name="callingConvention">The <see cref="CallingConventions">calling convention</see> of the method.</param>
+		/// <param name="returnType">The return type of the method.</param>
+		/// <param name="parameterTypes">The types of the parameters of the method.</param>
+		/// <returns>The defined method.</returns>
+		public MethodBuilderHelper DefineMethod(
+			string             name,
+			MethodAttributes   attributes,
+			CallingConventions callingConvention,
+			Type               returnType,
+			Type[]             parameterTypes)
+		{
+			return new MethodBuilderHelper(this, _typeBuilder.DefineMethod(
+				name, attributes, callingConvention, returnType, parameterTypes));
+		}
+
+		/// <summary>
+		/// Adds a new method to the class, with the given name and method signature.
+		/// </summary>
+		/// <param name="name">The name of the method. name cannot contain embedded nulls. </param>
+		/// <param name="attributes">The attributes of the method. </param>
+		/// <param name="returnType">The return type of the method.</param>
+		/// <returns>The defined method.</returns>
+		public MethodBuilderHelper DefineMethod(string name, MethodAttributes attributes, Type returnType)
+		{
+			return new MethodBuilderHelper(
+				this,
+				_typeBuilder.DefineMethod(name, attributes, returnType, Type.EmptyTypes));
+		}
+
+		/// <summary>
+		/// Adds a new method to the class, with the given name and method signature.
+		/// </summary>
+		/// <param name="name">The name of the method. name cannot contain embedded nulls. </param>
+		/// <param name="attributes">The attributes of the method. </param>
+		/// <returns>The defined method.</returns>
+		public MethodBuilderHelper DefineMethod(string name, MethodAttributes attributes)
+		{
+			return new MethodBuilderHelper(
+				this,
+				_typeBuilder.DefineMethod(name, attributes, typeof(void), Type.EmptyTypes));
+		}
+
+		/// <summary>
+		/// Adds a new method to the class, with the given name and method signature.
+		/// </summary>
+		/// <param name="name">The name of the method. name cannot contain embedded nulls. </param>
+		/// <param name="attributes">The attributes of the method. </param>
+		/// <returns>The defined method.</returns>
+		/// <param name="callingConvention">The calling convention of the method.</param>
+		public MethodBuilderHelper DefineMethod(
+			string             name,
+			MethodAttributes   attributes,
+			CallingConventions callingConvention)
+		{
+			return new MethodBuilderHelper(
+				this,
+				_typeBuilder.DefineMethod(name, attributes, callingConvention));
+		}
+
+		/// <summary>
+		/// Adds a new method to the class, with the given name and method signature.
+		/// </summary>
+		/// <param name="name">The name of the method. name cannot contain embedded nulls. </param>
+		/// <param name="attributes">The attributes of the method. </param>
+		/// <param name="callingConvention">The <see cref="CallingConventions">calling convention</see> of the method.</param>
+		/// <param name="genericArguments">Generic arguments of the method.</param>
+		/// <param name="returnType">The return type of the method.</param>
+		/// <param name="parameterTypes">The types of the parameters of the method.</param>
+		/// <returns>The defined generic method.</returns>
+		public MethodBuilderHelper DefineGenericMethod(
+			string             name,
+			MethodAttributes   attributes,
+			CallingConventions callingConvention,
+			Type[]             genericArguments,
+			Type               returnType,
+			Type[]             parameterTypes)
+		{
+			return new MethodBuilderHelper(
+				this,
+				_typeBuilder.DefineMethod(name, attributes, callingConvention), genericArguments, returnType, parameterTypes);
+		}
+
+
+		private Dictionary<MethodInfo, MethodBuilder> _overriddenMethods;
+
+		/// <summary>
+		/// Retrieves the map of base type methods overridden by this type.
+		/// </summary>
+		public  Dictionary<MethodInfo, MethodBuilder>  OverriddenMethods
+		{
+			get { return _overriddenMethods ?? (_overriddenMethods = new Dictionary<MethodInfo,MethodBuilder>()); }
+		}
+
+		/// <summary>
+		/// Adds a new method to the class, with the given name and method signature.
+		/// </summary>
+		/// <param name="name">The name of the method. name cannot contain embedded nulls. </param>
+		/// <param name="methodInfoDeclaration">The method whose declaration is to be used.</param>
+		/// <param name="attributes">The attributes of the method. </param>
+		/// <returns>The defined method.</returns>
+		public MethodBuilderHelper DefineMethod(
+			string           name,
+			MethodInfo       methodInfoDeclaration,
+			MethodAttributes attributes)
+		{
+			if (methodInfoDeclaration == null) throw new ArgumentNullException("methodInfoDeclaration");
+
+			MethodBuilderHelper method;
+			ParameterInfo[]     pi         = methodInfoDeclaration.GetParameters();
+			Type[]              parameters = new Type[pi.Length];
+
+			for (int i = 0; i < pi.Length; i++)
+				parameters[i] = pi[i].ParameterType;
+
+			if (methodInfoDeclaration.ContainsGenericParameters)
+			{
+				method = DefineGenericMethod(
+					name,
+					attributes,
+					methodInfoDeclaration.CallingConvention,
+					methodInfoDeclaration.GetGenericArguments(),
+					methodInfoDeclaration.ReturnType,
+					parameters);
+			}
+			else
+			{
+				method = DefineMethod(
+					name,
+					attributes,
+					methodInfoDeclaration.CallingConvention,
+					methodInfoDeclaration.ReturnType,
+					parameters);
+			}
+
+			// Compiler overrides methods only for interfaces. We do the same.
+			// If we wanted to override virtual methods, then methods should've had
+			// MethodAttributes.VtableLayoutMask attribute
+			// and the following condition should've been used below:
+			// if ((methodInfoDeclaration is FakeMethodInfo) == false)
+			//
+			if (methodInfoDeclaration.DeclaringType.IsInterface
+#if !SILVERLIGHT
+				&& !(methodInfoDeclaration is FakeMethodInfo)
+#endif
+				)
+			{
+				OverriddenMethods.Add(methodInfoDeclaration, method.MethodBuilder);
+				_typeBuilder.DefineMethodOverride(method.MethodBuilder, methodInfoDeclaration);
+			}
+
+			method.OverriddenMethod = methodInfoDeclaration;
+
+			for (int i = 0; i < pi.Length; i++)
+				method.MethodBuilder.DefineParameter(i + 1, pi[i].Attributes, pi[i].Name);
+
+			return method;
+		}
+
+		/// <summary>
+		/// Adds a new method to the class, with the given name and method signature.
+		/// </summary>
+		/// <param name="name">The name of the method. name cannot contain embedded nulls. </param>
+		/// <param name="methodInfoDeclaration">The method whose declaration is to be used.</param>
+		/// <returns>The defined method.</returns>
+		public MethodBuilderHelper DefineMethod(string name, MethodInfo methodInfoDeclaration)
+		{
+			return DefineMethod(name, methodInfoDeclaration, MethodAttributes.Virtual);
+		}
+
+		/// <summary>
+		/// Adds a new private method to the class.
+		/// </summary>
+		/// <param name="methodInfoDeclaration">The method whose declaration is to be used.</param>
+		/// <returns>The defined method.</returns>
+		public MethodBuilderHelper DefineMethod(MethodInfo methodInfoDeclaration)
+		{
+			if (methodInfoDeclaration == null) throw new ArgumentNullException("methodInfoDeclaration");
+
+			var isInterface = methodInfoDeclaration.DeclaringType.IsInterface;
+#if SILVERLIGHT
+			var isFake      = false;
+#else
+			var isFake      = methodInfoDeclaration is FakeMethodInfo;
+#endif
+
+			var name = isInterface && !isFake?
+				methodInfoDeclaration.DeclaringType.FullName + "." + methodInfoDeclaration.Name:
+				methodInfoDeclaration.Name;
+
+			var attributes = 
+				MethodAttributes.Virtual |
+				MethodAttributes.HideBySig |
+				MethodAttributes.PrivateScope |
+				methodInfoDeclaration.Attributes & MethodAttributes.SpecialName;
+
+			if (isInterface && !isFake)
+				attributes |= MethodAttributes.Private;
+			else if ((attributes & MethodAttributes.SpecialName) != 0)
+				attributes |= MethodAttributes.Public;
+			else
+				attributes |= methodInfoDeclaration.Attributes & 
+					(MethodAttributes.Public | MethodAttributes.Private);
+
+			return DefineMethod(name, methodInfoDeclaration, attributes);
+		}
+
+		#endregion
+
+		/// <summary>
+		/// Creates a Type object for the class.
+		/// </summary>
+		/// <returns>Returns the new Type object for this class.</returns>
+		public Type Create()
+		{
+			return TypeBuilder.CreateType();
+		}
+
+		/// <summary>
+		/// Sets a custom attribute using a custom attribute type.
+		/// </summary>
+		/// <param name="attributeType">Attribute type.</param>
+		public void SetCustomAttribute(Type attributeType)
+		{
+			if (attributeType == null) throw new ArgumentNullException("attributeType");
+
+			ConstructorInfo        ci        = attributeType.GetConstructor(Type.EmptyTypes);
+			CustomAttributeBuilder caBuilder = new CustomAttributeBuilder(ci, new object[0]);
+
+			_typeBuilder.SetCustomAttribute(caBuilder);
+		}
+
+		/// <summary>
+		/// Sets a custom attribute using a custom attribute type
+		/// and named properties.
+		/// </summary>
+		/// <param name="attributeType">Attribute type.</param>
+		/// <param name="properties">Named properties of the custom attribute.</param>
+		/// <param name="propertyValues">Values for the named properties of the custom attribute.</param>
+		public void SetCustomAttribute(
+			Type           attributeType,
+			PropertyInfo[] properties,
+			object[]       propertyValues)
+		{
+			if (attributeType == null) throw new ArgumentNullException("attributeType");
+
+			ConstructorInfo        ci        = attributeType.GetConstructor(Type.EmptyTypes);
+			CustomAttributeBuilder caBuilder = new CustomAttributeBuilder(
+				ci, new object[0], properties, propertyValues);
+
+			_typeBuilder.SetCustomAttribute(caBuilder);
+		}
+
+		/// <summary>
+		/// Sets a custom attribute using a custom attribute type
+		/// and named property.
+		/// </summary>
+		/// <param name="attributeType">Attribute type.</param>
+		/// <param name="propertyName">A named property of the custom attribute.</param>
+		/// <param name="propertyValue">Value for the named property of the custom attribute.</param>
+		public void SetCustomAttribute(
+			Type   attributeType,
+			string propertyName,
+			object propertyValue)
+		{
+			SetCustomAttribute(
+				attributeType,
+				new PropertyInfo[] { attributeType.GetProperty(propertyName) },
+				new object[]       { propertyValue } );
+		}
+
+		private ConstructorBuilderHelper _typeInitializer;
+		/// <summary>
+		/// Gets the initializer for this type.
+		/// </summary>
+		public ConstructorBuilderHelper TypeInitializer
+		{
+			get 
+			{
+				if (_typeInitializer == null)
+					_typeInitializer = new ConstructorBuilderHelper(this, _typeBuilder.DefineTypeInitializer());
+
+				return _typeInitializer;
+			}
+		}
+
+		/// <summary>
+		/// Returns true if the initializer for this type has a body.
+		/// </summary>
+		public bool IsTypeInitializerDefined
+		{
+			get { return _typeInitializer != null; }
+		}
+
+		private ConstructorBuilderHelper _defaultConstructor;
+		/// <summary>
+		/// Gets the default constructor for this type.
+		/// </summary>
+		public  ConstructorBuilderHelper  DefaultConstructor
+		{
+			get 
+			{
+				if (_defaultConstructor == null)
+				{
+					ConstructorBuilder builder = _typeBuilder.DefineConstructor(
+						MethodAttributes.Public,
+						CallingConventions.Standard,
+						Type.EmptyTypes);
+
+					_defaultConstructor = new ConstructorBuilderHelper(this, builder);
+				}
+
+				return _defaultConstructor;
+			}
+		}
+
+		/// <summary>
+		/// Returns true if the default constructor for this type has a body.
+		/// </summary>
+		public bool IsDefaultConstructorDefined
+		{
+			get { return _defaultConstructor != null; }
+		}
+
+		private ConstructorBuilderHelper _initConstructor;
+		/// <summary>
+		/// Gets the init context constructor for this type.
+		/// </summary>
+		public  ConstructorBuilderHelper  InitConstructor
+		{
+			get 
+			{
+				if (_initConstructor == null)
+				{
+					ConstructorBuilder builder = _typeBuilder.DefineConstructor(
+						MethodAttributes.Public, 
+						CallingConventions.Standard,
+						new Type[] { typeof(InitContext) });
+
+					_initConstructor = new ConstructorBuilderHelper(this, builder);
+				}
+
+				return _initConstructor;
+			}
+		}
+
+		/// <summary>
+		/// Returns true if a constructor with parameter of <see cref="InitContext"/> for this type has a body.
+		/// </summary>
+		public bool IsInitConstructorDefined
+		{
+			get { return _initConstructor != null; }
+		}
+
+		/// <summary>
+		/// Adds a new field to the class, with the given name, attributes and field type.
+		/// </summary>
+		/// <param name="fieldName">The name of the field. <paramref name="fieldName"/> cannot contain embedded nulls.</param>
+		/// <param name="type">The type of the field.</param>
+		/// <param name="attributes">The attributes of the field.</param>
+		/// <returns>The defined field.</returns>
+		public FieldBuilder DefineField(
+			string          fieldName,
+			Type            type,
+			FieldAttributes attributes)
+		{
+			return _typeBuilder.DefineField(fieldName, type, attributes);
+		}
+
+		#region DefineConstructor Overrides
+
+		/// <summary>
+		/// Adds a new public constructor to the class, with the given parameters.
+		/// </summary>
+		/// <param name="parameterTypes">The types of the parameters of the method.</param>
+		/// <returns>The defined constructor.</returns>
+		public ConstructorBuilderHelper DefinePublicConstructor(params Type[] parameterTypes)
+		{
+			return new ConstructorBuilderHelper(
+				this,
+				_typeBuilder.DefineConstructor(
+					MethodAttributes.Public, CallingConventions.Standard, parameterTypes));
+		}
+
+		/// <summary>
+		/// Adds a new constructor to the class, with the given attributes and parameters.
+		/// </summary>
+		/// <param name="attributes">The attributes of the field.</param>
+		/// <param name="callingConvention">The <see cref="CallingConventions">calling convention</see> of the method.</param>
+		/// <param name="parameterTypes">The types of the parameters of the method.</param>
+		/// <returns>The defined constructor.</returns>
+		public ConstructorBuilderHelper DefineConstructor(
+			MethodAttributes   attributes,
+			CallingConventions callingConvention,
+			params Type[]      parameterTypes)
+		{
+			return new ConstructorBuilderHelper(
+				this,
+				_typeBuilder.DefineConstructor(attributes, callingConvention, parameterTypes));
+		}
+
+		#endregion
+
+		#region DefineNestedType Overrides
+
+		/// <summary>
+		/// Defines a nested type given its name..
+		/// </summary>
+		/// <param name="name">The short name of the type.</param>
+		/// <returns>Returns the created <see cref="TypeBuilderHelper"/>.</returns>
+		/// <seealso cref="System.Reflection.Emit.TypeBuilder.DefineNestedType(string)">
+		/// TypeBuilder.DefineNestedType Method</seealso>
+		public TypeBuilderHelper DefineNestedType(string name)
+		{
+			return new TypeBuilderHelper(_assembly, _typeBuilder.DefineNestedType(name));
+		}
+
+		/// <summary>
+		/// Defines a public nested type given its name and the type that it extends.
+		/// </summary>
+		/// <param name="name">The short name of the type.</param>
+		/// <param name="parent">The type that the nested type extends.</param>
+		/// <returns>Returns the created <see cref="TypeBuilderHelper"/>.</returns>
+		/// <seealso cref="System.Reflection.Emit.TypeBuilder.DefineNestedType(string,TypeAttributes,Type)">
+		/// TypeBuilder.DefineNestedType Method</seealso>
+		public TypeBuilderHelper DefineNestedType(string name, Type parent)
+		{
+			return new TypeBuilderHelper(
+				_assembly,
+				_typeBuilder.DefineNestedType(name, TypeAttributes.NestedPublic, parent));
+		}
+
+		/// <summary>
+		/// Defines a nested type given its name, attributes, and the type that it extends.
+		/// </summary>
+		/// <param name="name">The short name of the type.</param>
+		/// <param name="attributes">The attributes of the type.</param>
+		/// <param name="parent">The type that the nested type extends.</param>
+		/// <returns>Returns the created <see cref="TypeBuilderHelper"/>.</returns>
+		/// <seealso cref="System.Reflection.Emit.TypeBuilder.DefineNestedType(string,TypeAttributes,Type)">
+		/// TypeBuilder.DefineNestedType Method</seealso>
+		public TypeBuilderHelper DefineNestedType(
+			string         name,
+			TypeAttributes attributes,
+			Type           parent)
+		{
+			return new TypeBuilderHelper(
+				_assembly,
+				_typeBuilder.DefineNestedType(name, attributes, parent));
+		}
+
+		/// <summary>
+		/// Defines a public nested type given its name, the type that it extends, and the interfaces that it implements.
+		/// </summary>
+		/// <param name="name">The short name of the type.</param>
+		/// <param name="parent">The type that the nested type extends.</param>
+		/// <param name="interfaces">The interfaces that the nested type implements.</param>
+		/// <returns>Returns the created <see cref="TypeBuilderHelper"/>.</returns>
+		/// <seealso cref="System.Reflection.Emit.TypeBuilder.DefineNestedType(string,TypeAttributes,Type,Type[])">
+		/// TypeBuilder.DefineNestedType Method</seealso>
+		public TypeBuilderHelper DefineNestedType(
+			string        name,
+			Type          parent,
+			params Type[] interfaces)
+		{
+			return new TypeBuilderHelper(
+				_assembly,
+				_typeBuilder.DefineNestedType(name, TypeAttributes.NestedPublic, parent, interfaces));
+		}
+
+		/// <summary>
+		/// Defines a nested type given its name, attributes, the type that it extends, and the interfaces that it implements.
+		/// </summary>
+		/// <param name="name">The short name of the type.</param>
+		/// <param name="attributes">The attributes of the type.</param>
+		/// <param name="parent">The type that the nested type extends.</param>
+		/// <param name="interfaces">The interfaces that the nested type implements.</param>
+		/// <returns>Returns the created <see cref="TypeBuilderHelper"/>.</returns>
+		/// <seealso cref="System.Reflection.Emit.ModuleBuilder.DefineType(string,TypeAttributes,Type,Type[])">ModuleBuilder.DefineType Method</seealso>
+		public TypeBuilderHelper DefineNestedType(
+			string         name,
+			TypeAttributes attributes,
+			Type           parent,
+			params         Type[] interfaces)
+		{
+			return new TypeBuilderHelper(
+				_assembly,
+				_typeBuilder.DefineNestedType(name, attributes, parent, interfaces));
+		}
+
+		#endregion
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/ExprMemberAccessor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,717 @@
+using System;
+using System.Data.SqlTypes;
+using System.Linq.Expressions;
+using System.Reflection;
+using System.Reflection.Emit;
+
+namespace BLToolkit.Reflection
+{
+	using Common;
+	using Emit;
+
+	public abstract class ExprMemberAccessor : MemberAccessor
+	{
+		protected ExprMemberAccessor(TypeAccessor typeAccessor, MemberInfo memberInfo)
+			: base(typeAccessor, memberInfo)
+		{
+		}
+
+		#region Public Properties
+
+		protected bool HasSetterValue; 
+		public override bool HasGetter { get { return true;           } }
+		public override bool HasSetter { get { return HasSetterValue; } }
+
+		#endregion
+
+		static public MemberAccessor GetMemberAccessor(TypeAccessor typeAccessor, string memberName)
+		{
+			var par  = Expression.Parameter(typeof(object), "obj");
+			var expr = Expression.PropertyOrField(Expression.Convert(par, typeAccessor.Type), memberName);
+
+			var type = expr.Type;
+
+			var underlyingType = type;
+			var isNullable     = false;
+
+			if (underlyingType.IsGenericType && underlyingType.GetGenericTypeDefinition() == typeof(Nullable<>))
+			{
+				underlyingType = underlyingType.GetGenericArguments()[0];
+				isNullable     = true;
+			}
+
+			if (underlyingType.IsEnum)
+				underlyingType = Enum.GetUnderlyingType(underlyingType);
+
+			if (isNullable)
+			{
+				switch (Type.GetTypeCode(underlyingType))
+				{
+					case TypeCode.Boolean  : return new NullableBooleanAccessor (typeAccessor, par, expr);
+					case TypeCode.Char     : return new NullableCharAccessor    (typeAccessor, par, expr);
+					case TypeCode.SByte    : return new NullableSByteAccessor   (typeAccessor, par, expr);
+					case TypeCode.Byte     : return new NullableByteAccessor    (typeAccessor, par, expr);
+					case TypeCode.Int16    : return new NullableInt16Accessor   (typeAccessor, par, expr);
+					case TypeCode.UInt16   : return new NullableUInt16Accessor  (typeAccessor, par, expr);
+					case TypeCode.Int32    : return new NullableInt32Accessor   (typeAccessor, par, expr);
+					case TypeCode.UInt32   : return new NullableUInt32Accessor  (typeAccessor, par, expr);
+					case TypeCode.Int64    : return new NullableInt64Accessor   (typeAccessor, par, expr);
+					case TypeCode.UInt64   : return new NullableUInt64Accessor  (typeAccessor, par, expr);
+					case TypeCode.Single   : return new NullableSingleAccessor  (typeAccessor, par, expr);
+					case TypeCode.Double   : return new NullableDoubleAccessor  (typeAccessor, par, expr);
+					case TypeCode.Decimal  : return new NullableDecimalAccessor (typeAccessor, par, expr);
+					case TypeCode.DateTime : return new NullableDateTimeAccessor(typeAccessor, par, expr);
+					case TypeCode.Object   :
+						if (type == typeof(Guid))           return new NullableGuidAccessor          (typeAccessor, par, expr);
+						if (type == typeof(DateTimeOffset)) return new NullableDateTimeOffsetAccessor(typeAccessor, par, expr);
+						if (type == typeof(TimeSpan))       return new NullableTimeSpanAccessor      (typeAccessor, par, expr);
+						break;
+					default                : break;
+				}
+			}
+			else
+			{
+				switch (Type.GetTypeCode(underlyingType))
+				{
+					case TypeCode.Boolean  : return new BooleanAccessor (typeAccessor, par, expr);
+					case TypeCode.Char     : return new CharAccessor    (typeAccessor, par, expr);
+					case TypeCode.SByte    : return new SByteAccessor   (typeAccessor, par, expr);
+					case TypeCode.Byte     : return new ByteAccessor    (typeAccessor, par, expr);
+					case TypeCode.Int16    : return new Int16Accessor   (typeAccessor, par, expr);
+					case TypeCode.UInt16   : return new UInt16Accessor  (typeAccessor, par, expr);
+					case TypeCode.Int32    : return new Int32Accessor   (typeAccessor, par, expr);
+					case TypeCode.UInt32   : return new UInt32Accessor  (typeAccessor, par, expr);
+					case TypeCode.Int64    : return new Int64Accessor   (typeAccessor, par, expr);
+					case TypeCode.UInt64   : return new UInt64Accessor  (typeAccessor, par, expr);
+					case TypeCode.Single   : return new SingleAccessor  (typeAccessor, par, expr);
+					case TypeCode.Double   : return new DoubleAccessor  (typeAccessor, par, expr);
+					case TypeCode.Decimal  : return new DecimalAccessor (typeAccessor, par, expr);
+					case TypeCode.DateTime : return new DateTimeAccessor(typeAccessor, par, expr);
+					case TypeCode.Object   :
+						if (type == typeof(Guid))           return new GuidAccessor          (typeAccessor, par, expr);
+						if (type == typeof(DateTimeOffset)) return new DateTimeOffsetAccessor(typeAccessor, par, expr);
+						if (type == typeof(TimeSpan))       return new TimeSpanAccessor      (typeAccessor, par, expr);
+						break;
+					default                : break;
+				}
+			}
+
+#if !SILVERLIGHT
+
+			if (type == typeof(SqlByte))     return new SqlByteAccessor    (typeAccessor, par, expr);
+			if (type == typeof(SqlInt16))    return new SqlInt16Accessor   (typeAccessor, par, expr);
+			if (type == typeof(SqlInt32))    return new SqlInt32Accessor   (typeAccessor, par, expr);
+			if (type == typeof(SqlInt64))    return new SqlInt64Accessor   (typeAccessor, par, expr);
+			if (type == typeof(SqlSingle))   return new SqlSingleAccessor  (typeAccessor, par, expr);
+			if (type == typeof(SqlBoolean))  return new SqlBooleanAccessor (typeAccessor, par, expr);
+			if (type == typeof(SqlDouble))   return new SqlDoubleAccessor  (typeAccessor, par, expr);
+			if (type == typeof(SqlDateTime)) return new SqlDateTimeAccessor(typeAccessor, par, expr);
+			if (type == typeof(SqlDecimal))  return new SqlDecimalAccessor (typeAccessor, par, expr);
+			if (type == typeof(SqlMoney))    return new SqlMoneyAccessor   (typeAccessor, par, expr);
+			if (type == typeof(SqlString))   return new SqlStringAccessor  (typeAccessor, par, expr);
+			if (type == typeof(SqlGuid))     return new SqlGuidAccessor    (typeAccessor, par, expr);
+
+#endif
+
+			return (MemberAccessor)Activator.CreateInstance(
+				typeof(BaseAccessor<>).MakeGenericType(type),
+				new object[] { typeAccessor, par, expr });
+		}
+
+		class BaseAccessor<T> : ExprMemberAccessor
+		{
+			protected readonly Func  <object,T> Getter;
+			protected readonly Action<object,T> Setter;
+
+			static int _counter;
+
+			public BaseAccessor(TypeAccessor typeAccessor, ParameterExpression par, MemberExpression expr)
+				: base(typeAccessor, expr.Member)
+			{
+				Expression ex = expr;
+
+				if (TypeHelper.IsEnumOrNullableEnum(ex.Type) && ex.Type != typeof(T))
+					ex = Expression.Convert(ex, typeof(T));
+
+				Getter = Expression.Lambda<Func<object,T>>(ex, par).Compile();
+
+				var mi = expr.Member;
+
+				HasSetterValue = !(mi is PropertyInfo) || ((PropertyInfo)mi).GetSetMethod(true) != null;
+
+				if (HasSetterValue)
+				{
+					var dm   = new DynamicMethod(
+						"setter_" + mi.Name + "_" + ++_counter,
+						typeof(void),
+						new[] { typeof(object), typeof(T) },
+						typeAccessor.Type);
+					var emit = new EmitHelper(dm.GetILGenerator());
+
+					emit
+						.ldarg_0
+						.castType (typeAccessor.Type)
+						.ldarg_1
+						.end();
+
+					if (mi is FieldInfo) emit.stfld   ((FieldInfo)mi);
+					else                 emit.callvirt(((PropertyInfo)mi).GetSetMethod(true));
+
+					emit.ret();
+
+					Setter = (Action<object,T>)dm.CreateDelegate(typeof(Action<object,T>));
+				}
+				else
+				{
+					Setter = (_,__) => {};
+				}
+			}
+
+			public override object GetValue(object obj)
+			{
+				return Getter(obj);
+			}
+
+			public override void SetValue(object obj, object value)
+			{
+				Setter(obj, ConvertTo<T>.From(value));
+			}
+		}
+
+		class NullableAccessor<T> : BaseAccessor<T?>
+			where T : struct
+		{
+			public NullableAccessor(TypeAccessor typeAccessor, ParameterExpression par, MemberExpression member)
+				: base(typeAccessor, par, member)
+			{
+			}
+
+			public override bool IsNull(object obj)
+			{
+				return Getter(obj) == null;
+			}
+		}
+
+		#region Basic Types
+
+		class BooleanAccessor : BaseAccessor<Boolean>
+		{
+			public BooleanAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override Boolean GetBoolean(object obj)                { return Getter(obj); }
+			public override void    SetBoolean(object obj, Boolean value) { Setter(obj, value); }
+		}
+
+		class CharAccessor : BaseAccessor<Char>
+		{
+			public CharAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override Char GetChar(object obj)             { return Getter(obj); }
+			public override void SetChar(object obj, Char value) { Setter(obj, value); }
+		}
+
+		class SByteAccessor : BaseAccessor<SByte>
+		{
+			public SByteAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override SByte GetSByte(object obj)              { return Getter(obj); }
+			public override void  SetSByte(object obj, SByte value) { Setter(obj, value); }
+		}
+
+		class ByteAccessor : BaseAccessor<Byte>
+		{
+			public ByteAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override Byte GetByte(object obj)             { return Getter(obj); }
+			public override void SetByte(object obj, Byte value) { Setter(obj, value); }
+		}
+
+		class Int16Accessor : BaseAccessor<Int16>
+		{
+			public Int16Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override Int16 GetInt16(object obj)              { return Getter(obj); }
+			public override void  SetInt16(object obj, Int16 value) { Setter(obj, value); }
+		}
+
+		class UInt16Accessor : BaseAccessor<UInt16>
+		{
+			public UInt16Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override UInt16 GetUInt16(object obj)               { return Getter(obj); }
+			public override void   SetUInt16(object obj, UInt16 value) { Setter(obj, value); }
+		}
+
+		class Int32Accessor : BaseAccessor<Int32>
+		{
+			public Int32Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override Int32 GetInt32(object obj)              { return Getter(obj); }
+			public override void  SetInt32(object obj, Int32 value) { Setter(obj, value); }
+		}
+
+		class UInt32Accessor : BaseAccessor<UInt32>
+		{
+			public UInt32Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override UInt32 GetUInt32(object obj)               { return Getter(obj); }
+			public override void   SetUInt32(object obj, UInt32 value) { Setter(obj, value); }
+		}
+
+		class Int64Accessor : BaseAccessor<Int64>
+		{
+			public Int64Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override Int64 GetInt64(object obj)              { return Getter(obj); }
+			public override void  SetInt64(object obj, Int64 value) { Setter(obj, value); }
+		}
+
+		class UInt64Accessor : BaseAccessor<UInt64>
+		{
+			public UInt64Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override UInt64 GetUInt64(object obj)               { return Getter(obj); }
+			public override void   SetUInt64(object obj, UInt64 value) { Setter(obj, value); }
+		}
+
+		class SingleAccessor : BaseAccessor<Single>
+		{
+			public SingleAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override Single GetSingle(object obj)               { return Getter(obj); }
+			public override void   SetSingle(object obj, Single value) { Setter(obj, value); }
+		}
+
+		class DoubleAccessor : BaseAccessor<Double>
+		{
+			public DoubleAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override Double GetDouble(object obj)               { return Getter(obj); }
+			public override void   SetDouble(object obj, Double value) { Setter(obj, value); }
+		}
+
+		class DecimalAccessor : BaseAccessor<Decimal>
+		{
+			public DecimalAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override Decimal GetDecimal(object obj)                { return Getter(obj); }
+			public override void    SetDecimal(object obj, Decimal value) { Setter(obj, value); }
+		}
+
+		class DateTimeAccessor : BaseAccessor<DateTime>
+		{
+			public DateTimeAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override DateTime GetDateTime(object obj)                 { return Getter(obj); }
+			public override void     SetDateTime(object obj, DateTime value) { Setter(obj, value); }
+		}
+
+		class GuidAccessor : BaseAccessor<Guid>
+		{
+			public GuidAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override Guid GetGuid(object obj)             { return Getter(obj); }
+			public override void SetGuid(object obj, Guid value) { Setter(obj, value); }
+		}
+
+		class DateTimeOffsetAccessor : BaseAccessor<DateTimeOffset>
+		{
+			public DateTimeOffsetAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override DateTimeOffset GetDateTimeOffset(object obj)                       { return Getter(obj); }
+			public override void           SetDateTimeOffset(object obj, DateTimeOffset value) { Setter(obj, value); }
+		}
+
+		class TimeSpanAccessor : BaseAccessor<TimeSpan>
+		{
+			public TimeSpanAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override TimeSpan GetTimeSpan(object obj)                 { return Getter(obj); }
+			public override void     SetTimeSpan(object obj, TimeSpan value) { Setter(obj, value); }
+		}
+
+		#endregion
+
+		#region Nullable
+
+		class NullableBooleanAccessor : NullableAccessor<Boolean>
+		{
+			public NullableBooleanAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override Boolean? GetNullableBoolean(object obj)                 { return Getter(obj); }
+			public override void     SetNullableBoolean(object obj, Boolean? value) { Setter(obj, value); }
+		}
+
+		class NullableCharAccessor : NullableAccessor<Char>
+		{
+			public NullableCharAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override Char? GetNullableChar(object obj)              { return Getter(obj); }
+			public override void  SetNullableChar(object obj, Char? value) { Setter(obj, value); }
+		}
+
+		class NullableSByteAccessor : NullableAccessor<SByte>
+		{
+			public NullableSByteAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override SByte? GetNullableSByte(object obj)               { return Getter(obj); }
+			public override void   SetNullableSByte(object obj, SByte? value) { Setter(obj, value); }
+		}
+
+		class NullableByteAccessor : NullableAccessor<Byte>
+		{
+			public NullableByteAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override Byte? GetNullableByte(object obj)              { return Getter(obj); }
+			public override void  SetNullableByte(object obj, Byte? value) { Setter(obj, value); }
+		}
+
+		class NullableInt16Accessor : NullableAccessor<Int16>
+		{
+			public NullableInt16Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override Int16? GetNullableInt16(object obj)               { return Getter(obj); }
+			public override void   SetNullableInt16(object obj, Int16? value) { Setter(obj, value); }
+		}
+
+		class NullableUInt16Accessor : NullableAccessor<UInt16>
+		{
+			public NullableUInt16Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override UInt16? GetNullableUInt16(object obj)                { return Getter(obj); }
+			public override void    SetNullableUInt16(object obj, UInt16? value) { Setter(obj, value); }
+		}
+
+		class NullableInt32Accessor : NullableAccessor<Int32>
+		{
+			public NullableInt32Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override Int32? GetNullableInt32(object obj)               { return Getter(obj); }
+			public override void   SetNullableInt32(object obj, Int32? value) { Setter(obj, value); }
+		}
+
+		class NullableUInt32Accessor : NullableAccessor<UInt32>
+		{
+			public NullableUInt32Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override UInt32? GetNullableUInt32(object obj)                { return Getter(obj); }
+			public override void    SetNullableUInt32(object obj, UInt32? value) { Setter(obj, value); }
+		}
+
+		class NullableInt64Accessor : NullableAccessor<Int64>
+		{
+			public NullableInt64Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override Int64? GetNullableInt64(object obj)               { return Getter(obj); }
+			public override void   SetNullableInt64(object obj, Int64? value) { Setter(obj, value); }
+		}
+
+		class NullableUInt64Accessor : NullableAccessor<UInt64>
+		{
+			public NullableUInt64Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override UInt64? GetNullableUInt64(object obj)                { return Getter(obj); }
+			public override void    SetNullableUInt64(object obj, UInt64? value) { Setter(obj, value); }
+		}
+
+		class NullableSingleAccessor : NullableAccessor<Single>
+		{
+			public NullableSingleAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override Single? GetNullableSingle(object obj)                { return Getter(obj); }
+			public override void    SetNullableSingle(object obj, Single? value) { Setter(obj, value); }
+		}
+
+		class NullableDoubleAccessor : NullableAccessor<Double>
+		{
+			public NullableDoubleAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override Double? GetNullableDouble(object obj)                { return Getter(obj); }
+			public override void    SetNullableDouble(object obj, Double? value) { Setter(obj, value); }
+		}
+
+		class NullableDecimalAccessor : NullableAccessor<Decimal>
+		{
+			public NullableDecimalAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override Decimal? GetNullableDecimal(object obj)                 { return Getter(obj); }
+			public override void     SetNullableDecimal(object obj, Decimal? value) { Setter(obj, value); }
+		}
+
+		class NullableDateTimeAccessor : NullableAccessor<DateTime>
+		{
+			public NullableDateTimeAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override DateTime? GetNullableDateTime(object obj)                  { return Getter(obj); }
+			public override void      SetNullableDateTime(object obj, DateTime? value) { Setter(obj, value); }
+		}
+
+		class NullableGuidAccessor : NullableAccessor<Guid>
+		{
+			public NullableGuidAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override Guid? GetNullableGuid(object obj)              { return Getter(obj); }
+			public override void  SetNullableGuid(object obj, Guid? value) { Setter(obj, value); }
+		}
+
+		class NullableDateTimeOffsetAccessor : NullableAccessor<DateTimeOffset>
+		{
+			public NullableDateTimeOffsetAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override DateTimeOffset? GetNullableDateTimeOffset(object obj)                        { return Getter(obj); }
+			public override void            SetNullableDateTimeOffset(object obj, DateTimeOffset? value) { Setter(obj, value); }
+		}
+
+		class NullableTimeSpanAccessor : NullableAccessor<TimeSpan>
+		{
+			public NullableTimeSpanAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override TimeSpan? GetNullableTimeSpan(object obj)                  { return Getter(obj); }
+			public override void      SetNullableTimeSpan(object obj, TimeSpan? value) { Setter(obj, value); }
+		}
+
+		#endregion
+
+		#region Sql Types
+
+#if !SILVERLIGHT
+
+		class SqlByteAccessor : BaseAccessor<SqlByte>
+		{
+			public SqlByteAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override SqlByte GetSqlByte(object obj)                { return Getter(obj); }
+			public override void    SetSqlByte(object obj, SqlByte value) { Setter(obj, value); }
+		}
+
+		class SqlInt16Accessor : BaseAccessor<SqlInt16>
+		{
+			public SqlInt16Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override SqlInt16 GetSqlInt16(object obj)                 { return Getter(obj); }
+			public override void     SetSqlInt16(object obj, SqlInt16 value) { Setter(obj, value); }
+		}
+
+		class SqlInt32Accessor : BaseAccessor<SqlInt32>
+		{
+			public SqlInt32Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override SqlInt32 GetSqlInt32(object obj)                 { return Getter(obj); }
+			public override void     SetSqlInt32(object obj, SqlInt32 value) { Setter(obj, value); }
+		}
+
+		class SqlInt64Accessor : BaseAccessor<SqlInt64>
+		{
+			public SqlInt64Accessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override SqlInt64 GetSqlInt64(object obj)                 { return Getter(obj); }
+			public override void     SetSqlInt64(object obj, SqlInt64 value) { Setter(obj, value); }
+		}
+
+		class SqlSingleAccessor : BaseAccessor<SqlSingle>
+		{
+			public SqlSingleAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override SqlSingle GetSqlSingle(object obj)                  { return Getter(obj); }
+			public override void      SetSqlSingle(object obj, SqlSingle value) { Setter(obj, value); }
+		}
+
+		class SqlBooleanAccessor : BaseAccessor<SqlBoolean>
+		{
+			public SqlBooleanAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override SqlBoolean GetSqlBoolean(object obj)                   { return Getter(obj); }
+			public override void       SetSqlBoolean(object obj, SqlBoolean value) { Setter(obj, value); }
+		}
+
+		class SqlDoubleAccessor : BaseAccessor<SqlDouble>
+		{
+			public SqlDoubleAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override SqlDouble GetSqlDouble(object obj)                  { return Getter(obj); }
+			public override void      SetSqlDouble(object obj, SqlDouble value) { Setter(obj, value); }
+		}
+
+		class SqlDateTimeAccessor : BaseAccessor<SqlDateTime>
+		{
+			public SqlDateTimeAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override SqlDateTime GetSqlDateTime(object obj)                    { return Getter(obj); }
+			public override void        SetSqlDateTime(object obj, SqlDateTime value) { Setter(obj, value); }
+		}
+
+		class SqlDecimalAccessor : BaseAccessor<SqlDecimal>
+		{
+			public SqlDecimalAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override SqlDecimal GetSqlDecimal(object obj)                   { return Getter(obj); }
+			public override void       SetSqlDecimal(object obj, SqlDecimal value) { Setter(obj, value); }
+		}
+
+		class SqlMoneyAccessor : BaseAccessor<SqlMoney>
+		{
+			public SqlMoneyAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override SqlMoney GetSqlMoney(object obj)                 { return Getter(obj); }
+			public override void     SetSqlMoney(object obj, SqlMoney value) { Setter(obj, value); }
+		}
+
+		class SqlStringAccessor : BaseAccessor<SqlString>
+		{
+			public SqlStringAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override SqlString GetSqlString(object obj)                  { return Getter(obj); }
+			public override void      SetSqlString(object obj, SqlString value) { Setter(obj, value); }
+		}
+
+		class SqlGuidAccessor : BaseAccessor<SqlGuid>
+		{
+			public SqlGuidAccessor(TypeAccessor accessor, ParameterExpression expression, MemberExpression expr)
+				: base(accessor, expression, expr)
+			{
+			}
+
+			public override SqlGuid GetSqlGuid(object obj)                 { return Getter(obj); }
+			public override void     SetSqlGuid(object obj, SqlGuid value) { Setter(obj, value); }
+		}
+
+#endif
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/ExprTypeAccessor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,125 @@
+using System;
+using System.Linq;
+using System.Collections.Generic;
+using System.Linq.Expressions;
+using System.Reflection;
+
+namespace BLToolkit.Reflection
+{
+	using TypeBuilder;
+
+	class ExprTypeAccessor<T,TOriginal> : TypeAccessor
+	{
+		static ExprTypeAccessor()
+		{
+			// Create Instance.
+			//
+			var type     = typeof(T);
+			var typeInit = typeof(InitContext);
+			var initPar  = Expression.Parameter(typeInit, "ctx");
+
+			if (type.IsValueType)
+			{
+				_createInstance = () => default(T);
+				_createInstanceInit = ctx => default(T);
+			}
+			else
+			{
+				var ctor = type.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public, null, Type.EmptyTypes, null);
+				var ctorInit = type.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public, null, new[] { typeInit }, null);
+
+				if (ctor == null && ctorInit == null)
+				{
+					Expression<Func<T>> mi = () => ThrowException();
+
+					var body = Expression.Call(null, ((MethodCallExpression)mi.Body).Method);
+
+					_createInstance = Expression.Lambda<Func<T>>(body).Compile();
+					_createInstanceInit = Expression.Lambda<Func<InitContext, T>>(body, initPar).Compile();
+				}
+				else
+				{
+					_createInstance = ctor != null ?
+						Expression.Lambda<Func<T>>(Expression.New(ctor)).Compile() :
+						Expression.Lambda<Func<T>>(Expression.New(ctorInit, Expression.Constant(null))).Compile();
+
+					_createInstanceInit = ctorInit != null ?
+						Expression.Lambda<Func<InitContext, T>>(Expression.New(ctorInit, initPar), initPar).Compile() :
+						Expression.Lambda<Func<InitContext, T>>(Expression.New(ctor), initPar).Compile();
+				}
+			}
+
+			var originalType = typeof(TOriginal);
+
+			// Add fields.
+			//
+			foreach (var fi in originalType.GetFields(BindingFlags.Instance | BindingFlags.Public))
+				_members.Add(fi);
+
+			foreach (var pi in originalType.GetProperties(BindingFlags.Instance | BindingFlags.Public))
+				if (pi.GetIndexParameters().Length == 0)
+					_members.Add(pi);
+
+			// Add explicit iterface implementation properties support
+			// Or maybe we should support all private fields/properties?
+			var interfaceMethods = originalType.GetInterfaces().SelectMany(ti => originalType.GetInterfaceMap(ti).TargetMethods).ToList();
+
+			if (interfaceMethods.Count > 0)
+			{
+				foreach (var pi in originalType.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic))
+				{
+					if (pi.GetIndexParameters().Length == 0)
+					{
+						var getMethod = pi.GetGetMethod(true);
+						var setMethod = pi.GetSetMethod(true);
+
+						if ((getMethod == null || interfaceMethods.Contains(getMethod)) &&
+							(setMethod == null || interfaceMethods.Contains(setMethod)))
+						{
+							_members.Add(pi);
+						}
+					}
+				}
+			}
+
+			// ObjectFactory
+			//
+			var attr = TypeHelper.GetFirstAttribute(type, typeof(ObjectFactoryAttribute));
+
+			if (attr != null)
+				_objectFactory = ((ObjectFactoryAttribute)attr).ObjectFactory;
+		}
+
+		static T ThrowException()
+		{
+			throw new TypeBuilderException(string.Format("The '{0}' type must have default or init constructor.", typeof(TOriginal).FullName));
+		}
+
+		static readonly List<MemberInfo> _members = new List<MemberInfo>();
+		static readonly IObjectFactory   _objectFactory;
+
+		public ExprTypeAccessor()
+		{
+			foreach (var member in _members)
+				AddMember(ExprMemberAccessor.GetMemberAccessor(this, member.Name));
+
+			ObjectFactory = _objectFactory;
+		}
+
+		static readonly Func<T> _createInstance;
+		public override object   CreateInstance()
+		{
+			return _createInstance();
+		}
+
+		static readonly Func<InitContext,T> _createInstanceInit;
+
+		public override object CreateInstance(InitContext context)
+		{
+			return _createInstanceInit(context);
+		}
+
+		public override Type Type         { get { return typeof(T);         } }
+		public override Type OriginalType { get { return typeof(TOriginal); } }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/Extension/AttributeExtension.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,47 @@
+using System;
+
+namespace BLToolkit.Reflection.Extension
+{
+	public class AttributeExtension
+	{
+		public AttributeExtension()
+		{
+			Values = new ValueCollection();
+		}
+
+		private AttributeExtension(ValueCollection values)
+		{
+			Values = values;
+		}
+
+		public string          Name   { get; set; }
+		public ValueCollection Values { get; private set; }
+
+		public object Value
+		{
+			get { return this == _null? null: Values.Value; }
+		}
+
+		public object this[string valueName]
+		{
+			get { return this == _null? null: Values[valueName]; }
+		}
+
+		public object this[string valueName, object defaultValue]
+		{
+			get { return this[valueName] ?? defaultValue; }
+		}
+
+		private AttributeNameCollection _attributes;
+		public  AttributeNameCollection  Attributes
+		{
+			get { return _attributes ?? (_attributes = new AttributeNameCollection()); }
+		}
+
+		private static readonly AttributeExtension _null = new AttributeExtension(ValueCollection.Null);
+		public  static          AttributeExtension  Null
+		{
+			get { return _null;  }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/Extension/AttributeExtensionCollection.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+
+namespace BLToolkit.Reflection.Extension
+{
+	public class AttributeExtensionCollection : List<AttributeExtension>
+	{
+		public new AttributeExtension this[int index]
+		{
+			get
+			{
+				return this == _null || index < 0 || index >= Count ? AttributeExtension.Null : base[index];
+			}
+		}
+
+		public object Value
+		{
+			get { return this == _null? null: this[0].Value; }
+		}
+
+		public new void Add(AttributeExtension attributeExtension)
+		{
+			if (this != _null)
+				base.Add(attributeExtension);
+		}
+
+		private static readonly AttributeExtensionCollection _null = new AttributeExtensionCollection();
+		public  static          AttributeExtensionCollection  Null
+		{
+			get { return _null;  }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/Extension/AttributeNameCollection.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,104 @@
+using System;
+using System.Collections.Generic;
+
+namespace BLToolkit.Reflection.Extension
+{
+	public class AttributeNameCollection : Dictionary<string,AttributeExtensionCollection>
+	{
+		public new AttributeExtensionCollection this[string attributeName]
+		{
+			get
+			{
+				if (this == _null)
+					return AttributeExtensionCollection.Null;
+
+				AttributeExtensionCollection ext;
+
+				return TryGetValue(attributeName, out ext) ? ext : AttributeExtensionCollection.Null;
+			}
+		}
+
+		public void Add(AttributeExtension attributeExtension)
+		{
+			if (this != _null)
+			{
+				// Add attribute.
+				//
+				AttributeExtensionCollection attr;
+
+				if (!TryGetValue(attributeExtension.Name, out attr))
+					Add(attributeExtension.Name, attr = new AttributeExtensionCollection());
+
+				attr.Add(attributeExtension);
+
+				/*
+				// Convert value type.
+				//
+				bool isType = attributeExtension.Name.EndsWith(TypeExtension.AttrName.TypePostfix);
+
+				if (isType)
+				{
+					string attrName = attributeExtension.Name.Substring(
+						0, attributeExtension.Name.Length - 5);
+
+					AttributeExtensionCollection ext =
+						(AttributeExtensionCollection)_attributes[attrName];
+
+					if (ext != null && ext.Count == 1)
+						ext[0].Values.ChangeValueType(attributeExtension.Value.ToString());
+				}
+				else
+				{
+					string attrName = attributeExtension.Name + TypeExtension.AttrName.TypePostfix;
+
+					AttributeExtensionCollection ext =
+						(AttributeExtensionCollection)_attributes[attrName];
+
+					if (ext != null && ext.Count == 1)
+						attributeExtension.Values.ChangeValueType(ext.Value.ToString());
+				}
+				*/
+			}
+		}
+
+		public void Add(string name, string value)
+		{
+			if (this != _null)
+			{
+				var attrName  = name;
+				var valueName = string.Empty;
+				var idx       = name.IndexOf(TypeExtension.ValueName.Delimiter);
+
+				if (idx > 0)
+				{
+					valueName = name.Substring(idx + 1).TrimStart(TypeExtension.ValueName.Delimiter);
+					attrName  = name.Substring(0, idx);
+				}
+
+				if (valueName.Length == 0)
+					valueName = TypeExtension.ValueName.Value;
+				else if (valueName == TypeExtension.ValueName.Type)
+					valueName = TypeExtension.ValueName.ValueType;
+
+				AttributeExtensionCollection ext;
+
+				if (TryGetValue(attrName, out ext))
+					ext[0].Values.Add(valueName, value);
+				else
+				{
+					var attributeExtension = new AttributeExtension { Name = name };
+
+					attributeExtension.Values.Add(valueName, value);
+
+					Add(attributeExtension);
+				}
+			}
+		}
+
+		private static readonly AttributeNameCollection _null = new AttributeNameCollection();
+		public  static          AttributeNameCollection  Null
+		{
+			get { return _null; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/Extension/ExtensionList.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,40 @@
+using System;
+using System.Collections.Generic;
+
+namespace BLToolkit.Reflection.Extension
+{
+	public class ExtensionList : Dictionary<string,TypeExtension>
+	{
+		public new TypeExtension this[string typeName]
+		{
+			get
+			{
+				TypeExtension value;
+				lock (this)
+					return TryGetValue(typeName, out value) ? value : TypeExtension.Null;
+			}
+		}
+
+		public TypeExtension this[Type type]
+		{
+			get
+			{
+				lock (this)
+					foreach (var ext in Values)
+						if (ext.Name == type.Name || ext.Name == type.FullName)
+							return ext;
+
+				if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
+					return this[Nullable.GetUnderlyingType(type)];
+
+				return TypeExtension.Null;
+			}
+		}
+
+		public void Add(TypeExtension typeInfo)
+		{
+			lock (this)
+				Add(typeInfo.Name, typeInfo);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/Extension/MemberExtension.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,36 @@
+using System;
+
+namespace BLToolkit.Reflection.Extension
+{
+	public class MemberExtension
+	{
+		public MemberExtension()
+		{
+			_attributes = new AttributeNameCollection();
+		}
+
+		private MemberExtension(AttributeNameCollection attributes)
+		{
+			_attributes = attributes;
+		}
+
+		public string Name { get; set; }
+
+		public AttributeExtensionCollection this[string attributeName]
+		{
+			get { return _attributes[attributeName]; }
+		}
+
+		private readonly AttributeNameCollection _attributes;
+		public           AttributeNameCollection  Attributes
+		{
+			get { return _attributes; }
+		}
+
+		private static readonly MemberExtension _null = new MemberExtension(AttributeNameCollection.Null);
+		public  static          MemberExtension  Null
+		{
+			get { return _null; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/Extension/MemberExtensionCollection.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+
+namespace BLToolkit.Reflection.Extension
+{
+	public class MemberExtensionCollection : Dictionary<string,MemberExtension>
+	{
+		public new MemberExtension this[string memberName]
+		{
+			get
+			{
+				if (this == _null)
+					return MemberExtension.Null;
+
+				MemberExtension value;
+
+				return TryGetValue(memberName, out value) ? value : MemberExtension.Null;
+			}
+		}
+
+		public void Add(MemberExtension memberInfo)
+		{
+			if (this != _null)
+				Add(memberInfo.Name, memberInfo);
+		}
+
+		private static readonly MemberExtensionCollection _null = new MemberExtensionCollection();
+		public  static          MemberExtensionCollection  Null
+		{
+			get { return _null; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/Extension/TypeExtension.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,305 @@
+using System;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Threading;
+using System.Xml.Linq;
+
+namespace BLToolkit.Reflection.Extension
+{
+	public class TypeExtension
+	{
+		#region Consts
+
+		public static class NodeName
+		{
+			public const string Type        = "Type";
+			public const string Member      = "Member";
+			public const string Association = "Association";
+			public const string Relation    = "Relation";
+			public const string MasterIndex = "MasterIndex";
+			public const string SlaveIndex  = "SlaveIndex";
+		}
+
+		public static class AttrName
+		{
+			public const string Name            = "Name";
+			public const string DestinationType = "DestinationType";
+		}
+
+		public static class ValueName
+		{
+			public const char   Delimiter   = '-';
+			public const string Value       = "Value";
+			public const string Type        = "Type";
+			public const string ValueType   = "Value-Type";
+			public const string TypePostfix = "-Type";
+		}
+
+		#endregion
+
+		#region Public Instance Members
+
+		public TypeExtension()
+			: this(new MemberExtensionCollection(), new AttributeNameCollection())
+		{
+		}
+
+		private TypeExtension(
+			MemberExtensionCollection  members,
+			AttributeNameCollection    attributes)
+		{
+			_members    = members;
+			_attributes = attributes;
+		}
+
+		public string Name { get; set; }
+
+		public MemberExtension this[string memberName]
+		{
+			get { return _members[memberName]; }
+		}
+
+		private readonly MemberExtensionCollection _members;
+		public           MemberExtensionCollection  Members
+		{
+			get { return _members; }
+		}
+
+		private readonly AttributeNameCollection _attributes;
+		public           AttributeNameCollection  Attributes
+		{
+			get { return _attributes; }
+		}
+
+		private static readonly TypeExtension _null = new TypeExtension(MemberExtensionCollection.Null, AttributeNameCollection.Null);
+		public           static TypeExtension  Null
+		{
+			get { return _null; }
+		}
+
+		#endregion
+
+		#region Conversion
+
+		public static bool ToBoolean(object value, bool defaultValue)
+		{
+			return value == null? defaultValue: ToBoolean(value);
+		}
+
+		public static bool ToBoolean(object value)
+		{
+			if (value != null)
+			{
+				if (value is bool)
+					return (bool)value;
+
+				var s = value as string;
+
+				if (s != null)
+				{
+					if (s == "1")
+						return true;
+
+					s = s.ToLower();
+
+					if (s == "true" || s == "yes" || s == "on")
+						return true;
+				}
+
+				return Convert.ToBoolean(value);
+			}
+
+			return false;
+		}
+
+		public static object ChangeType(object value, Type type)
+		{
+			if (value == null || type == value.GetType())
+				return value;
+
+			if (type == typeof(string))
+				return value.ToString();
+
+			if (type == typeof(bool))
+				return ToBoolean(value);
+
+			if (type.IsEnum)
+			{
+				if (value is string)
+					return Enum.Parse(type, value.ToString(), false);
+			}
+
+			return Convert.ChangeType(value, type, Thread.CurrentThread.CurrentCulture);
+		}
+
+		#endregion
+
+		#region Public Static Members
+		
+		public static ExtensionList GetExtensions(string xmlFile)
+		{
+			return GetExtensions(xmlFile, Assembly.GetCallingAssembly());
+		}
+
+		public static ExtensionList GetExtensions(string xmlFile, Assembly assembly)
+		{
+			StreamReader streamReader = null;
+
+			try
+			{
+				if (File.Exists(xmlFile))
+				{
+					streamReader = File.OpenText(xmlFile);
+				}
+#if !SILVERLIGHT
+				else
+				{
+					var combinePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, xmlFile);
+
+					if (File.Exists(combinePath))
+						streamReader = File.OpenText(combinePath);
+				}
+#endif
+
+				var embedded = streamReader == null;
+				var stream   = embedded ? assembly.GetManifestResourceStream(xmlFile) : streamReader.BaseStream;
+
+				if (embedded && stream == null)
+				{
+					var names = assembly.GetManifestResourceNames();
+
+					// Prepare file name with a dot to avoid partial name matching.
+					//
+					xmlFile = "." + xmlFile;
+
+					foreach (var name in names)
+					{
+						if (name.EndsWith(xmlFile))
+						{
+							stream = assembly.GetManifestResourceStream(name);
+							break;
+						}
+					}
+				}
+
+				if (stream == null)
+					throw new TypeExtensionException(
+						string.Format("Could not find file '{0}'.", xmlFile));
+
+				using (stream)
+					return GetExtensions(stream);
+			} 
+			finally
+			{
+				if (streamReader != null)
+					streamReader.Close();
+			}
+		}
+
+		public static ExtensionList GetExtensions(Stream xmlDocStream)
+		{
+			var doc = XDocument.Load(new StreamReader(xmlDocStream));
+
+			return CreateTypeInfo(doc);
+		}
+
+		public static TypeExtension GetTypeExtension(Type type, ExtensionList typeExtensions)
+		{
+			var attrs = type.GetCustomAttributes(typeof(TypeExtensionAttribute), true);
+
+			if (attrs != null && attrs.Length != 0)
+			{
+				var attr = (TypeExtensionAttribute)attrs[0];
+
+				if (!string.IsNullOrEmpty(attr.FileName))
+					typeExtensions = GetExtensions(attr.FileName, type.Assembly);
+
+				if (typeExtensions != null && !string.IsNullOrEmpty(attr.TypeName))
+					return typeExtensions[attr.TypeName];
+			}
+
+			return typeExtensions != null? typeExtensions[type]: Null;
+		}
+
+		#endregion
+
+		#region Private Static Members
+
+		private static ExtensionList CreateTypeInfo(XDocument doc)
+		{
+			var list = new ExtensionList();
+
+			foreach (var typeNode in doc.Root.Elements().Where(_ => _.Name.LocalName == NodeName.Type))
+				list.Add(ParseType(typeNode));
+
+			return list;
+		}
+
+		private static TypeExtension ParseType(XElement typeNode)
+		{
+			var ext = new TypeExtension();
+
+			foreach (var attr in typeNode.Attributes())
+			{
+				if (attr.Name.LocalName == AttrName.Name)
+					ext.Name = attr.Value;
+				else
+					ext.Attributes.Add(attr.Name.LocalName, attr.Value);
+			}
+
+			foreach (var node in typeNode.Elements())
+			{
+				if (node.Name.LocalName == NodeName.Member)
+					ext.Members.Add(ParseMember(node));
+				else
+					ext.Attributes.Add(ParseAttribute(node));
+			}
+
+			return ext;
+		}
+
+		private static MemberExtension ParseMember(XElement memberNode)
+		{
+			var ext = new MemberExtension();
+
+			foreach (var attr in memberNode.Attributes())
+			{
+				if (attr.Name.LocalName == AttrName.Name)
+					ext.Name = attr.Value;
+				else
+					ext.Attributes.Add(attr.Name.LocalName, attr.Value);
+			}
+
+			foreach (var node in memberNode.Elements())
+				ext.Attributes.Add(ParseAttribute(node));
+
+			return ext;
+		}
+
+		private static AttributeExtension ParseAttribute(XElement attributeNode)
+		{
+			var ext = new AttributeExtension
+			{
+				Name = attributeNode.Name.LocalName
+			};
+
+			ext.Values.Add(ValueName.Value, attributeNode.Value);
+
+			foreach (var attr in attributeNode.Attributes())
+			{
+				if (attr.Name.LocalName == ValueName.Type)
+					ext.Values.Add(ValueName.ValueType, attr.Value);
+				else
+					ext.Values.Add(attr.Name.LocalName, attr.Value);
+			}
+
+			foreach (var node in attributeNode.Elements())
+				ext.Attributes.Add(ParseAttribute(node));
+
+			return ext;
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/Extension/TypeExtension.xsd	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema id="TypeInfo"
+	xmlns:m="urn:schemas-bltoolkit-net:mapping"
+	xmlns:xs="http://www.w3.org/2001/XMLSchema"
+	xmlns:tns="urn:schemas-bltoolkit-net:typeext"
+	targetNamespace="urn:schemas-bltoolkit-net:typeext">
+	
+	<xs:element name="Types" type="tns:Types" />
+
+	<xs:complexType name="Types">
+		<xs:choice minOccurs="0" maxOccurs="unbounded">
+			<xs:element name="Type" type="tns:Type" minOccurs="0" maxOccurs="unbounded" />
+		</xs:choice>
+	</xs:complexType>
+
+	<xs:complexType name="Type">
+		<xs:choice minOccurs="0" maxOccurs="unbounded">
+			<xs:element name="Member" type="tns:Member" minOccurs="0" maxOccurs="unbounded" />
+			<xs:any namespace="##other" processContents="lax"/>
+		</xs:choice>
+		<xs:attribute name="Name" type="xs:NCName" use="required" />
+		<xs:anyAttribute namespace="##other" processContents="lax" />
+	</xs:complexType>
+
+	<xs:complexType name="Member">
+		<xs:choice minOccurs="0" maxOccurs="unbounded">
+			<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax" />
+		</xs:choice>
+		<xs:attribute name="Name" type="xs:NCName" use="required" />
+		<xs:anyAttribute namespace="##other" processContents="skip" />
+	</xs:complexType>
+
+</xs:schema>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/Extension/TypeExtension.xsx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--This file is auto-generated by the XML Schema Designer. It holds layout information for components on the designer surface.-->
+<XSDDesignerLayout Style="LeftRight" layoutVersion="2" viewPortLeft="-733" viewPortTop="10873" zoom="100">
+    <Types_XmlElement left="979" top="17303" width="5291" height="1720" selected="0" zOrder="6" index="0" expanded="1">
+        <Type_XmlElement left="6904" top="16827" width="9446" height="2672" selected="0" zOrder="7" index="0" expanded="1">
+            <Member_XmlElement left="16984" top="14999" width="5292" height="2672" selected="0" zOrder="9" index="0" expanded="1">
+                <Attribute_XmlElement left="22910" top="14761" width="5292" height="3149" selected="0" zOrder="11" index="0" expanded="0" />
+            </Member_XmlElement>
+            <Attribute_XmlElement left="16984" top="18179" width="5292" height="3149" selected="0" zOrder="13" index="1" expanded="1" />
+        </Type_XmlElement>
+    </Types_XmlElement>
+    <Types_XmlComplexType left="1317" top="24135" width="5292" height="3149" selected="0" zOrder="16" index="1" expanded="1">
+        <Type_XmlElement left="7243" top="24135" width="5292" height="3149" selected="0" zOrder="17" index="0" expanded="0" />
+    </Types_XmlComplexType>
+    <Type_XmlComplexType left="1317" top="29818" width="5292" height="3149" selected="0" zOrder="20" index="2" expanded="1">
+        <Member_XmlElement left="7243" top="27924" width="5292" height="3149" selected="0" zOrder="22" index="0" expanded="0" />
+        <Attribute_XmlElement left="7243" top="31713" width="5292" height="3149" selected="0" zOrder="25" index="1" expanded="0" />
+    </Type_XmlComplexType>
+    <Member_XmlComplexType left="1317" top="35502" width="5292" height="3149" selected="0" zOrder="28" index="3" expanded="1">
+        <Attribute_XmlElement left="7243" top="35502" width="5292" height="3149" selected="0" zOrder="30" index="0" expanded="0" />
+    </Member_XmlComplexType>
+    <Attribute_XmlComplexType left="16907" top="22595" width="5292" height="3149" selected="0" zOrder="15" index="4" expanded="1" />
+</XSDDesignerLayout>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/Extension/TypeExtensionAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,26 @@
+using System;
+
+namespace BLToolkit.Reflection.Extension
+{
+	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Enum)]
+	public class TypeExtensionAttribute : Attribute
+	{
+		public TypeExtensionAttribute()
+		{
+		}
+
+		public TypeExtensionAttribute(string typeName) 
+			: this(null, typeName)
+		{
+		}
+
+		public TypeExtensionAttribute(string fileName, string typeName)
+		{
+			FileName = fileName;
+			TypeName = typeName;
+		}
+
+		public string FileName { get; set; }
+		public string TypeName { get; set; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/Extension/TypeExtensionException.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,88 @@
+using System;
+using System.Runtime.Serialization;
+
+namespace BLToolkit.Reflection.Extension
+{
+	/// <summary>
+	/// Defines the base class for the namespace exceptions.
+	/// </summary>
+	/// <remarks>
+	/// This class is the base class for exceptions that may occur during
+	/// execution of the namespace members.
+	/// </remarks>
+	[Serializable] 
+	public class TypeExtensionException : Exception
+	{
+		/// <summary>
+		/// Initializes a new instance of the <see cref="TypeExtensionException"/> class.
+		/// </summary>
+		/// <remarks>
+		/// This constructor initializes the <see cref="Exception.Message"/>
+		/// property of the new instance 
+		/// to a system-supplied message that describes the error, 
+		/// such as "BLToolkit Type Extension error has occurred."
+		/// </remarks>
+		public TypeExtensionException() 
+			: base("An BLToolkit Type Extension error has occurred.")
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="TypeExtensionException"/> class 
+		/// with the specified error message.
+		/// </summary>
+		/// <param name="message">The message to display to the client when the
+		/// exception is thrown.</param>
+		/// <seealso cref="Exception.Message"/>
+		public TypeExtensionException(string message) 
+			: base(message) 
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="TypeExtensionException"/> class 
+		/// with the specified error message and InnerException property.
+		/// </summary>
+		/// <param name="message">The message to display to the client when the
+		/// exception is thrown.</param>
+		/// <param name="innerException">The InnerException, if any, that threw
+		/// the current exception.</param>
+		/// <seealso cref="Exception.Message"/>
+		/// <seealso cref="Exception.InnerException"/>
+		public TypeExtensionException(string message, Exception innerException) 
+			: base(message, innerException) 
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="TypeExtensionException"/> class 
+		/// with the InnerException property.
+		/// </summary>
+		/// <param name="innerException">The InnerException, if any, that threw
+		/// the current exception.</param>
+		/// <seealso cref="Exception.InnerException"/>
+		public TypeExtensionException(Exception innerException) 
+			: base(innerException.Message, innerException) 
+		{
+		}
+
+#if !SILVERLIGHT
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="TypeExtensionException"/> class
+		/// with serialized data.
+		/// </summary>
+		/// <param name="info">The object that holds the serialized object data.</param>
+		/// <param name="context">The contextual information about the source or
+		/// destination.</param>
+		/// <remarks>This constructor is called during deserialization to 
+		/// reconstitute the exception object transmitted over a stream.</remarks>
+		protected TypeExtensionException(SerializationInfo info, StreamingContext context) 
+			: base(info, context) 
+		{
+		}
+
+#endif
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/Extension/ValueCollection.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,75 @@
+using System;
+
+namespace BLToolkit.Reflection.Extension
+{
+	public class ValueCollection : System.Collections.Generic.Dictionary<string,object>
+	{
+		private object _value;
+		public  object  Value
+		{
+			get { return _value; }
+		}
+
+		public new object this[string name]
+		{
+			get
+			{
+				object value;
+				return TryGetValue(name, out value) ? value : null;
+			}
+		}
+
+		public void Add(string name, string value)
+		{
+			if (this != _null)
+			{
+				var isType = name.EndsWith(TypeExtension.ValueName.TypePostfix);
+
+				if (isType)
+				{
+					var type      = Type.GetType(value, true);
+					var valueName = name.Substring(0, name.Length - TypeExtension.ValueName.TypePostfix.Length);
+
+					Add(name, type);
+
+					object val;
+
+					TryGetValue(valueName, out val);
+
+					if (val != null && val.GetType() != type)
+					{
+						base[valueName] = val = TypeExtension.ChangeType(val.ToString(), type);
+
+						if (valueName == TypeExtension.ValueName.Value)
+							_value = val;
+					}
+				}
+				else
+				{
+					object val;
+
+					var type = TryGetValue(name + TypeExtension.ValueName.TypePostfix, out val) ? (Type)val : null;
+
+					val  = value;
+
+					if (type != null && type != _value.GetType())
+						val = TypeExtension.ChangeType(value, type);
+
+					if (ContainsKey(name))
+						base[name] = val;
+					else
+						Add(name, val);
+
+					if (name == TypeExtension.ValueName.Value)
+						_value = val;
+				}
+			}
+		}
+
+		private static readonly Extension.ValueCollection _null = new Extension.ValueCollection();
+		public  static          Extension.ValueCollection  Null
+		{
+			get { return _null;  }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/GenericBinder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,89 @@
+using System;
+using System.Globalization;
+using System.Reflection;
+
+namespace BLToolkit.Reflection
+{
+	/// <Summary>
+	/// Selects a member from a list of candidates, and performs type conversion
+	/// from actual argument type to formal argument type.
+	/// </Summary>
+	[Serializable]
+	public class GenericBinder : Binder
+	{
+		private readonly bool _genericMethodDefinition;
+		public GenericBinder(bool genericMethodDefinition)
+		{
+			_genericMethodDefinition = genericMethodDefinition;
+		}
+
+		#region System.Reflection.Binder methods
+
+		public override MethodBase BindToMethod(BindingFlags bindingAttr, MethodBase[] match, ref object[] args,
+			ParameterModifier[] modifiers, CultureInfo culture, string[] names, out object state)
+		{
+			throw new InvalidOperationException("GenericBinder.BindToMethod");
+		}
+
+		public override FieldInfo BindToField(BindingFlags bindingAttr, FieldInfo[] match, object value, CultureInfo culture)
+		{
+			throw new InvalidOperationException("GenericBinder.BindToField");
+		}
+
+		public override MethodBase SelectMethod(
+			BindingFlags        bindingAttr,
+			MethodBase[]        matchMethods,
+			Type[]              parameterTypes,
+			ParameterModifier[] modifiers)
+		{
+			for (int i = 0; i < matchMethods.Length; ++i)
+			{
+				if (matchMethods[i].IsGenericMethodDefinition != _genericMethodDefinition)
+					continue;
+
+				ParameterInfo[] pis = matchMethods[i].GetParameters();
+				bool          match = (pis.Length == parameterTypes.Length);
+
+				for (int j = 0; match && j < pis.Length; ++j)
+				{
+					match = TypeHelper.CompareParameterTypes(pis[j].ParameterType, parameterTypes[j]);
+				}
+
+				if (match)
+					return matchMethods[i];
+			}
+
+			return null;
+		}
+
+		public override PropertyInfo SelectProperty(BindingFlags bindingAttr, PropertyInfo[] match, Type returnType,
+			Type[] indexes, ParameterModifier[] modifiers)
+		{
+			throw new InvalidOperationException("GenericBinder.SelectProperty");
+		}
+
+		public override object ChangeType(object value, Type type, CultureInfo culture)
+		{
+			throw new InvalidOperationException("GenericBinder.ChangeType");
+		}
+
+		public override void ReorderArgumentArray(ref object[] args, object state)
+		{
+			throw new InvalidOperationException("GenericBinder.ReorderArgumentArray");
+		}
+
+		#endregion
+
+		private static GenericBinder _generic;
+		public  static GenericBinder  Generic
+		{
+			get { return _generic ?? (_generic = new GenericBinder(true)); }
+		}
+
+		private static GenericBinder _nonGeneric;
+		public  static GenericBinder  NonGeneric
+		{
+			get { return _nonGeneric ?? (_nonGeneric = new GenericBinder(false)); }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/IObjectFactory.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+using System;
+
+namespace BLToolkit.Reflection
+{
+	public interface IObjectFactory
+	{
+		object CreateInstance(TypeAccessor typeAccessor, InitContext context);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/InitContext.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,37 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+
+using BLToolkit.Mapping;
+
+namespace BLToolkit.Reflection
+{
+	public class InitContext
+	{
+		public object[]       MemberParameters { get; set; }
+		public object[]       Parameters       { get; set; }
+		public bool           IsInternal       { get; set; }
+		public bool           IsLazyInstance   { get; set; }
+		public object         Parent           { get; set; }
+		public object         SourceObject     { get; set; }
+		public ObjectMapper   ObjectMapper     { get; set; }
+		public MappingSchema  MappingSchema    { get; set; }
+		public bool           IsSource         { get; set; }
+		public bool           StopMapping      { get; set; }
+		[CLSCompliant(false)]
+		public IMapDataSource DataSource       { get; set; }
+
+		private Dictionary<object,object> _items;
+		public  Dictionary<object,object>  Items
+		{
+			[DebuggerStepThrough] 
+			get { return _items ?? (_items = new Dictionary<object, object>()); }
+		}
+
+		public  bool  IsDestination
+		{
+			[DebuggerStepThrough] get { return !IsSource;  }
+			[DebuggerStepThrough] set { IsSource = !value; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/MemberAccessor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,305 @@
+using System;
+using System.Data.SqlTypes;
+using System.Linq.Expressions;
+using System.Reflection;
+using System.ComponentModel;
+using BLToolkit.Data.Linq;
+
+#if !SILVERLIGHT && !DATA
+using BLToolkit.ComponentModel;
+#endif
+
+namespace BLToolkit.Reflection
+{
+	public abstract class MemberAccessor
+	{
+		protected MemberAccessor(TypeAccessor typeAccessor, MemberInfo memberInfo)
+		{
+			TypeAccessor = typeAccessor;
+			MemberInfo   = memberInfo;
+		}
+
+		#region Public Properties
+
+		public MemberInfo   MemberInfo   { get; private set; }
+		public TypeAccessor TypeAccessor { get; private set; }
+
+#if !SILVERLIGHT && !DATA
+
+		private PropertyDescriptor _propertyDescriptor;
+		public  PropertyDescriptor  PropertyDescriptor
+		{
+			get
+			{
+				if (_propertyDescriptor == null)
+					_propertyDescriptor = new MemberPropertyDescriptor(TypeAccessor.OriginalType, Name);
+
+				return _propertyDescriptor;
+			}
+		}
+
+#endif
+
+		public virtual bool HasGetter { get { return false; } }
+		public virtual bool HasSetter { get { return false; } }
+
+		public Type Type
+		{
+			get
+			{
+				return MemberInfo is PropertyInfo?
+					((PropertyInfo)MemberInfo).PropertyType:
+					((FieldInfo)   MemberInfo).FieldType;
+			}
+		}
+
+		public string Name
+		{
+			get { return MemberInfo.Name; }
+		}
+
+		private Type _underlyingType;
+		public  Type  UnderlyingType
+		{
+			get { return _underlyingType ?? (_underlyingType = TypeHelper.GetUnderlyingType(Type)); }
+		}
+
+		#endregion
+
+		#region Public Methods
+
+		public bool IsDefined<T>() where T : Attribute
+		{
+			return MemberInfo.IsDefined(typeof(T), true);
+		}
+
+		[Obsolete("Use generic version instead")]
+		public Attribute GetAttribute(Type attributeType)
+		{
+			var attrs = MemberInfo.GetCustomAttributes(attributeType, true);
+
+			return attrs.Length > 0? (Attribute)attrs[0]: null;
+		}
+
+		public T GetAttribute<T>() where T : Attribute
+		{
+			var attrs = MemberInfo.GetCustomAttributes(typeof(T), true);
+
+			return attrs.Length > 0? (T)attrs[0]: null;
+		}
+
+		[Obsolete("Use generic version instead")]
+		public object[] GetAttributes(Type attributeType)
+		{
+			var attrs = MemberInfo.GetCustomAttributes(attributeType, true);
+
+			return attrs.Length > 0? attrs: null;
+		}
+
+		public T[] GetAttributes<T>() where T : Attribute
+		{
+			Array attrs = MemberInfo.GetCustomAttributes(typeof(T), true);
+
+			return attrs.Length > 0? (T[])attrs: null;
+		}
+
+		public object[] GetAttributes()
+		{
+			var attrs = MemberInfo.GetCustomAttributes(true);
+
+			return attrs.Length > 0? attrs: null;
+		}
+
+		public object[] GetTypeAttributes(Type attributeType)
+		{
+			return TypeHelper.GetAttributes(TypeAccessor.OriginalType, attributeType);
+		}
+
+		#endregion
+
+		#region Set/Get Value
+
+		public virtual Boolean IsNull(object o)
+		{
+			return true;
+		}
+
+		static object GetDefaultValue<T>()
+		{
+			return default(T);
+		}
+
+		object _defaultValue;
+
+		public virtual object GetValue(object o)
+		{
+			if (_defaultValue == null && Type.IsValueType && !TypeHelper.IsNullableType(Type))
+			{
+				var mi = ReflectionHelper.Expressor<object>.MethodExpressor(_ => GetDefaultValue<int>());
+
+				_defaultValue =
+					Expression.Lambda<Func<object>>(
+						Expression.Call(mi.GetGenericMethodDefinition().MakeGenericMethod(Type)))
+					.Compile()();
+			}
+
+			return _defaultValue;
+		}
+
+		public virtual void SetValue(object o, object value)
+		{
+		}
+
+		public virtual void CloneValue(object source, object dest)
+		{
+			var value = GetValue(source);
+
+			SetValue(dest, value is ICloneable? ((ICloneable)value).Clone(): value);
+		}
+
+
+		// Simple types getters.
+		//
+		[CLSCompliant(false)]
+		public virtual SByte    GetSByte   (object o) { return (SByte)   GetValue(o); }
+		public virtual Int16    GetInt16   (object o) { return (Int16)   GetValue(o); }
+		public virtual Int32    GetInt32   (object o) { return (Int32)   GetValue(o); }
+		public virtual Int64    GetInt64   (object o) { return (Int64)   GetValue(o); }
+
+		public virtual Byte     GetByte    (object o) { return (Byte)    GetValue(o); }
+		[CLSCompliant(false)]
+		public virtual UInt16   GetUInt16  (object o) { return (UInt16)  GetValue(o); }
+		[CLSCompliant(false)]
+		public virtual UInt32   GetUInt32  (object o) { return (UInt32)  GetValue(o); }
+		[CLSCompliant(false)]
+		public virtual UInt64   GetUInt64  (object o) { return (UInt64)  GetValue(o); }
+
+		public virtual Boolean  GetBoolean (object o) { return (Boolean) GetValue(o); }
+		public virtual Char     GetChar    (object o) { return (Char)    GetValue(o); }
+		public virtual Single   GetSingle  (object o) { return (Single)  GetValue(o); }
+		public virtual Double   GetDouble  (object o) { return (Double)  GetValue(o); }
+		public virtual Decimal  GetDecimal (object o) { return (Decimal) GetValue(o); }
+		public virtual Guid     GetGuid    (object o) { return (Guid)    GetValue(o); }
+		public virtual DateTime GetDateTime(object o) { return (DateTime)GetValue(o); }
+		public virtual TimeSpan GetTimeSpan(object o) { return (TimeSpan)GetValue(o); }
+		public virtual DateTimeOffset GetDateTimeOffset(object o) { return (DateTimeOffset)GetValue(o); }
+
+		// Nullable types getters.
+		//
+		[CLSCompliant(false)]
+		public virtual SByte?    GetNullableSByte   (object o) { return (SByte?)   GetValue(o); }
+		public virtual Int16?    GetNullableInt16   (object o) { return (Int16?)   GetValue(o); }
+		public virtual Int32?    GetNullableInt32   (object o) { return (Int32?)   GetValue(o); }
+		public virtual Int64?    GetNullableInt64   (object o) { return (Int64?)   GetValue(o); }
+
+		public virtual Byte?     GetNullableByte    (object o) { return (Byte?)    GetValue(o); }
+		[CLSCompliant(false)]
+		public virtual UInt16?   GetNullableUInt16  (object o) { return (UInt16?)  GetValue(o); }
+		[CLSCompliant(false)]
+		public virtual UInt32?   GetNullableUInt32  (object o) { return (UInt32?)  GetValue(o); }
+		[CLSCompliant(false)]
+		public virtual UInt64?   GetNullableUInt64  (object o) { return (UInt64?)  GetValue(o); }
+
+		public virtual Boolean?  GetNullableBoolean (object o) { return (Boolean?) GetValue(o); }
+		public virtual Char?     GetNullableChar    (object o) { return (Char?)    GetValue(o); }
+		public virtual Single?   GetNullableSingle  (object o) { return (Single?)  GetValue(o); }
+		public virtual Double?   GetNullableDouble  (object o) { return (Double?)  GetValue(o); }
+		public virtual Decimal?  GetNullableDecimal (object o) { return (Decimal?) GetValue(o); }
+		public virtual Guid?     GetNullableGuid    (object o) { return (Guid?)    GetValue(o); }
+		public virtual DateTime? GetNullableDateTime(object o) { return (DateTime?)GetValue(o); }
+		public virtual TimeSpan? GetNullableTimeSpan(object o) { return (TimeSpan?)GetValue(o); }
+		public virtual DateTimeOffset? GetNullableDateTimeOffset(object o) { return (DateTimeOffset?)GetValue(o); }
+
+#if !SILVERLIGHT
+
+		// SQL type getters.
+		//
+		public virtual SqlByte     GetSqlByte    (object o) { return (SqlByte)    GetValue(o); }
+		public virtual SqlInt16    GetSqlInt16   (object o) { return (SqlInt16)   GetValue(o); }
+		public virtual SqlInt32    GetSqlInt32   (object o) { return (SqlInt32)   GetValue(o); }
+		public virtual SqlInt64    GetSqlInt64   (object o) { return (SqlInt64)   GetValue(o); }
+		public virtual SqlSingle   GetSqlSingle  (object o) { return (SqlSingle)  GetValue(o); }
+		public virtual SqlBoolean  GetSqlBoolean (object o) { return (SqlBoolean) GetValue(o); }
+		public virtual SqlDouble   GetSqlDouble  (object o) { return (SqlDouble)  GetValue(o); }
+		public virtual SqlDateTime GetSqlDateTime(object o) { return (SqlDateTime)GetValue(o); }
+		public virtual SqlDecimal  GetSqlDecimal (object o) { return (SqlDecimal) GetValue(o); }
+		public virtual SqlMoney    GetSqlMoney   (object o) { return (SqlMoney)   GetValue(o); }
+		public virtual SqlGuid     GetSqlGuid    (object o) { return (SqlGuid)    GetValue(o); }
+		public virtual SqlString   GetSqlString  (object o) { return (SqlString)  GetValue(o); }
+
+#endif
+
+		// Simple type setters.
+		//
+		[CLSCompliant(false)]
+		public virtual void    SetSByte   (object o, SByte    value) { SetValue(o, value); }
+		public virtual void    SetInt16   (object o, Int16    value) { SetValue(o, value); }
+		public virtual void    SetInt32   (object o, Int32    value) { SetValue(o, value); }
+		public virtual void    SetInt64   (object o, Int64    value) { SetValue(o, value); }
+
+		public virtual void    SetByte    (object o, Byte     value) { SetValue(o, value); }
+		[CLSCompliant(false)]
+		public virtual void    SetUInt16  (object o, UInt16   value) { SetValue(o, value); }
+		[CLSCompliant(false)]
+		public virtual void    SetUInt32  (object o, UInt32   value) { SetValue(o, value); }
+		[CLSCompliant(false)]
+		public virtual void    SetUInt64  (object o, UInt64   value) { SetValue(o, value); }
+
+		public virtual void    SetBoolean (object o, Boolean  value) { SetValue(o, value); }
+		public virtual void    SetChar    (object o, Char     value) { SetValue(o, value); }
+		public virtual void    SetSingle  (object o, Single   value) { SetValue(o, value); }
+		public virtual void    SetDouble  (object o, Double   value) { SetValue(o, value); }
+		public virtual void    SetDecimal (object o, Decimal  value) { SetValue(o, value); }
+		public virtual void    SetGuid    (object o, Guid     value) { SetValue(o, value); }
+		public virtual void    SetDateTime(object o, DateTime value) { SetValue(o, value); }
+		public virtual void    SetTimeSpan(object o, TimeSpan value) { SetValue(o, value); }
+		public virtual void    SetDateTimeOffset(object o, DateTimeOffset value) { SetValue(o, value); }
+
+		// Simple type setters.
+		//
+		[CLSCompliant(false)]
+		public virtual void    SetNullableSByte   (object o, SByte?    value) { SetValue(o, value); }
+		public virtual void    SetNullableInt16   (object o, Int16?    value) { SetValue(o, value); }
+		public virtual void    SetNullableInt32   (object o, Int32?    value) { SetValue(o, value); }
+		public virtual void    SetNullableInt64   (object o, Int64?    value) { SetValue(o, value); }
+
+		public virtual void    SetNullableByte    (object o, Byte?     value) { SetValue(o, value); }
+		[CLSCompliant(false)]
+		public virtual void    SetNullableUInt16  (object o, UInt16?   value) { SetValue(o, value); }
+		[CLSCompliant(false)]
+		public virtual void    SetNullableUInt32  (object o, UInt32?   value) { SetValue(o, value); }
+		[CLSCompliant(false)]
+		public virtual void    SetNullableUInt64  (object o, UInt64?   value) { SetValue(o, value); }
+
+		public virtual void    SetNullableBoolean (object o, Boolean?  value) { SetValue(o, value); }
+		public virtual void    SetNullableChar    (object o, Char?     value) { SetValue(o, value); }
+		public virtual void    SetNullableSingle  (object o, Single?   value) { SetValue(o, value); }
+		public virtual void    SetNullableDouble  (object o, Double?   value) { SetValue(o, value); }
+		public virtual void    SetNullableDecimal (object o, Decimal?  value) { SetValue(o, value); }
+		public virtual void    SetNullableGuid    (object o, Guid?     value) { SetValue(o, value); }
+		public virtual void    SetNullableDateTime(object o, DateTime? value) { SetValue(o, value); }
+		public virtual void    SetNullableTimeSpan(object o, TimeSpan? value) { SetValue(o, value); }
+		public virtual void    SetNullableDateTimeOffset(object o, DateTimeOffset? value) { SetValue(o, value); }
+
+#if !SILVERLIGHT
+
+		// SQL type setters.
+		//
+		public virtual void SetSqlByte    (object o, SqlByte     value) { SetValue(o, value); }
+		public virtual void SetSqlInt16   (object o, SqlInt16    value) { SetValue(o, value); }
+		public virtual void SetSqlInt32   (object o, SqlInt32    value) { SetValue(o, value); }
+		public virtual void SetSqlInt64   (object o, SqlInt64    value) { SetValue(o, value); }
+		public virtual void SetSqlSingle  (object o, SqlSingle   value) { SetValue(o, value); }
+		public virtual void SetSqlBoolean (object o, SqlBoolean  value) { SetValue(o, value); }
+		public virtual void SetSqlDouble  (object o, SqlDouble   value) { SetValue(o, value); }
+		public virtual void SetSqlDateTime(object o, SqlDateTime value) { SetValue(o, value); }
+		public virtual void SetSqlDecimal (object o, SqlDecimal  value) { SetValue(o, value); }
+		public virtual void SetSqlMoney   (object o, SqlMoney    value) { SetValue(o, value); }
+		public virtual void SetSqlGuid    (object o, SqlGuid     value) { SetValue(o, value); }
+		public virtual void SetSqlString  (object o, SqlString   value) { SetValue(o, value); }
+
+#endif
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/MetadataProvider/AttributeMetadataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,799 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Reflection;
+using BLToolkit.Data.Sql.SqlProvider;
+
+using BLToolkit.TypeBuilder;
+
+namespace BLToolkit.Reflection.MetadataProvider
+{
+	using DataAccess;
+	using Extension;
+	using Mapping;
+
+	public class AttributeMetadataProvider : MetadataProviderBase
+	{
+		#region Helpers
+
+		private  TypeAccessor _typeAccessor;
+		private  object[]     _mapFieldAttributes;
+		private  object[]     _nonUpdatableAttributes;
+		readonly object       _sync = new object();
+
+		void EnsureMapper(TypeAccessor typeAccessor)
+		{
+			if (_typeAccessor != typeAccessor)
+			{
+				_typeAccessor           = typeAccessor;
+				_mapFieldAttributes     = null;
+				_nonUpdatableAttributes = null;
+			}
+		}
+
+		protected object[] GetMapFieldAttributes(TypeAccessor typeAccessor)
+		{
+			lock (_sync)
+			{
+				EnsureMapper(typeAccessor);
+
+				return _mapFieldAttributes ?? (_mapFieldAttributes = TypeHelper.GetAttributes(typeAccessor.Type, typeof (MapFieldAttribute)));
+			}
+		}
+
+		object[] GetNonUpdatableAttributes(TypeAccessor typeAccessor)
+		{
+			lock (_sync)
+			{
+				EnsureMapper(typeAccessor);
+
+				return _nonUpdatableAttributes ?? (_nonUpdatableAttributes = TypeHelper.GetAttributes(typeAccessor.Type, typeof(NonUpdatableAttribute)));
+			}
+		}
+
+		#endregion
+
+		#region GetFieldName
+
+		public override string GetFieldName(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			var a = member.GetAttribute<MapFieldAttribute>();
+
+			if (a != null && a.MapName != null)
+			{
+				isSet = true;
+				return a.MapName;
+			}
+
+			foreach (MapFieldAttribute attr in GetMapFieldAttributes(member.TypeAccessor))
+			{
+				if (attr.MapName != null && string.Equals(attr.OrigName, member.Name, StringComparison.InvariantCultureIgnoreCase))
+				{
+					isSet = true;
+					return attr.MapName;
+				}
+			}
+
+			return base.GetFieldName(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetFieldStorage
+
+		public override string GetFieldStorage(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			var a = member.GetAttribute<MapFieldAttribute>();
+
+			if (a != null)
+			{
+				isSet = true;
+				return a.Storage;
+			}
+
+			foreach (MapFieldAttribute attr in GetMapFieldAttributes(member.TypeAccessor))
+			{
+				if (string.Equals(attr.OrigName, member.Name, StringComparison.InvariantCultureIgnoreCase))
+				{
+					isSet = true;
+					return attr.Storage;
+				}
+			}
+
+			return base.GetFieldStorage(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetInheritanceDiscriminator
+
+		public override bool GetInheritanceDiscriminator(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			var a = member.GetAttribute<MapFieldAttribute>();
+
+			if (a != null)
+			{
+				isSet = true;
+				return a.IsInheritanceDiscriminator;
+			}
+
+			foreach (MapFieldAttribute attr in GetMapFieldAttributes(member.TypeAccessor))
+			{
+				if (string.Equals(attr.OrigName, member.Name, StringComparison.InvariantCultureIgnoreCase))
+				{
+					isSet = true;
+					return attr.IsInheritanceDiscriminator;
+				}
+			}
+
+			return base.GetInheritanceDiscriminator(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region EnsureMapper
+
+		public override void EnsureMapper(TypeAccessor typeAccessor, MappingSchema mappingSchema, EnsureMapperHandler handler)
+		{
+			foreach (MapFieldAttribute attr in GetMapFieldAttributes(typeAccessor))
+			{
+				if (attr.OrigName != null)
+					handler(attr.MapName, attr.OrigName);
+				else
+				{
+					var ma = typeAccessor[attr.MapName];
+
+					foreach (MemberMapper inner in mappingSchema.GetObjectMapper(ma.Type))
+						handler(string.Format(attr.Format, inner.Name), ma.Name + "." + inner.MemberName);
+				}
+			}
+		}
+
+		#endregion
+
+		#region GetMapIgnore
+
+		public override bool GetMapIgnore(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			var attr = member.GetAttribute<MapIgnoreAttribute>() ?? (MapIgnoreAttribute)TypeHelper.GetFirstAttribute(member.Type, typeof(MapIgnoreAttribute));
+
+			if (attr != null)
+			{
+				isSet = true;
+				return attr.Ignore;
+			}
+
+			if (member.GetAttribute<MapFieldAttribute>()    != null ||
+				member.GetAttribute<MapImplicitAttribute>() != null ||
+				TypeHelper.GetFirstAttribute(member.Type, typeof(MapImplicitAttribute)) != null)
+			{
+				isSet = true;
+				return false;
+			}
+
+			return base.GetMapIgnore(typeExtension, member, out isSet) || member.GetAttribute<AssociationAttribute>() != null;
+		}
+
+		#endregion
+
+		#region GetMapField
+
+		public override MapFieldAttribute GetMapField(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			var attr = member.GetAttribute<MapFieldAttribute>() ?? (MapFieldAttribute)TypeHelper.GetFirstAttribute(member.Type, typeof(MapFieldAttribute));
+
+			if (attr != null)
+			{
+				isSet = true;
+				return attr;
+			}
+
+			return base.GetMapField(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetDbType
+
+		[CLSCompliant(false)]
+		public override DbTypeAttribute GetDbType(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			var attr = member.GetAttribute<DbTypeAttribute>() ?? (DbTypeAttribute)TypeHelper.GetFirstAttribute(member.Type, typeof(DbTypeAttribute));
+
+			if (attr != null)
+			{
+				isSet = true;
+				return attr;
+			}
+
+			return base.GetDbType(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetPrimaryKey
+
+		public override PrimaryKeyAttribute GetPrimaryKey(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			var attr = member.GetAttribute<PrimaryKeyAttribute>() ?? (PrimaryKeyAttribute)TypeHelper.GetFirstAttribute(member.Type, typeof(PrimaryKeyAttribute));
+
+			if (attr != null)
+			{
+				isSet = true;
+				return attr;
+			}
+
+			return base.GetPrimaryKey(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetTrimmable
+
+		public override bool GetTrimmable(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			if (member.Type == typeof(string))
+			{
+				var attr = member.GetAttribute<TrimmableAttribute>();
+
+				if (attr != null)
+				{
+					isSet = true;
+					return attr.IsTrimmable;
+				}
+
+				attr = (TrimmableAttribute)TypeHelper.GetFirstAttribute(
+					member.MemberInfo.DeclaringType, typeof(TrimmableAttribute));
+
+				if (attr != null)
+				{
+					isSet = true;
+					return attr.IsTrimmable;
+				}
+			}
+
+			return base.GetTrimmable(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetMapValues
+
+		public override MapValue[] GetMapValues(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			List<MapValue> list = null;
+
+			object[] attrs = member.GetAttributes<MapValueAttribute>();
+
+			if (attrs != null)
+			{
+				list = new List<MapValue>(attrs.Length);
+
+				foreach (MapValueAttribute a in attrs)
+					list.Add(new MapValue(a.OrigValue, a.Values));
+			}
+
+			attrs = member.GetTypeAttributes(typeof(MapValueAttribute));
+
+			var memberType = TypeHelper.UnwrapNullableType(member.Type);
+
+			if (attrs != null && attrs.Length > 0)
+			{
+				if (list == null)
+					list = new List<MapValue>(attrs.Length);
+
+				foreach (MapValueAttribute a in attrs)
+					if (a.Type == null && a.OrigValue != null && a.OrigValue.GetType() == memberType ||
+						a.Type is Type && (Type)a.Type == memberType)
+						list.Add(new MapValue(a.OrigValue, a.Values));
+			}
+
+			var typeMapValues = GetMapValues(typeExtension, memberType, out isSet);
+
+			if (list == null)
+				return typeMapValues;
+
+			if (typeMapValues != null)
+				list.AddRange(typeMapValues);
+
+			isSet = true;
+
+			return list.ToArray();
+		}
+
+		const FieldAttributes EnumField = FieldAttributes.Public | FieldAttributes.Static | FieldAttributes.Literal;
+
+		static List<MapValue> GetEnumMapValues(Type type)
+		{
+			var list   = null as List<MapValue>;
+			var fields = type.GetFields();
+
+			foreach (var fi in fields)
+			{
+				if ((fi.Attributes & EnumField) == EnumField)
+				{
+					var enumAttributes = Attribute.GetCustomAttributes(fi, typeof(MapValueAttribute));
+
+					foreach (MapValueAttribute attr in enumAttributes)
+					{
+						if (list == null)
+							list = new List<MapValue>(fields.Length);
+
+						var origValue = Enum.Parse(type, fi.Name, false);
+
+						list.Add(new MapValue(origValue, attr.Values));
+					}
+				}
+			}
+
+			return list;
+		}
+
+		public override MapValue[] GetMapValues(TypeExtension typeExtension, Type type, out bool isSet)
+		{
+			List<MapValue> list = null;
+
+			if (TypeHelper.IsNullable(type))
+				type = type.GetGenericArguments()[0];
+
+			if (type.IsEnum)
+				list = GetEnumMapValues(type);
+
+			var attrs = TypeHelper.GetAttributes(type, typeof(MapValueAttribute));
+
+			if (attrs != null && attrs.Length != 0)
+			{
+				if (list == null)
+					list = new List<MapValue>(attrs.Length);
+
+				for (var i = 0; i < attrs.Length; i++)
+				{
+					var a = (MapValueAttribute)attrs[i];
+					list.Add(new MapValue(a.OrigValue, a.Values));
+				}
+			}
+
+			isSet = list != null;
+
+			return isSet? list.ToArray(): null;
+		}
+
+		#endregion
+
+		#region GetDefaultValue
+
+		public override object GetDefaultValue(MappingSchema mappingSchema, TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			// Check member [DefaultValue(0)]
+			//
+			var attr = member.GetAttribute<DefaultValueAttribute>();
+
+			if (attr != null)
+			{
+				isSet = true;
+				return attr.Value;
+			}
+
+			// Check type [DefaultValues(typeof(int), 0)]
+			//
+			var attrs = member.GetTypeAttributes(typeof(DefaultValueAttribute));
+
+			foreach (DefaultValueAttribute a in attrs)
+				if (a.Type == null && a.Value != null && a.Value.GetType() == member.Type ||
+					a.Type != null && a.Type == member.Type)
+				{
+					isSet = true;
+					return a.Value;
+				}
+
+			return GetDefaultValue(mappingSchema, typeExtension, member.Type, out isSet);
+		}
+
+		public override object GetDefaultValue(MappingSchema mappingSchema, TypeExtension typeExtension, Type type, out bool isSet)
+		{
+			object value = null;
+
+			if (type.IsEnum)
+				value = GetEnumDefaultValueFromType(type);
+
+			if (value == null)
+			{
+				var attrs = TypeHelper.GetAttributes(type, typeof(DefaultValueAttribute));
+
+				if (attrs != null && attrs.Length != 0)
+					value = ((DefaultValueAttribute)attrs[0]).Value;
+			}
+
+			isSet = value != null;
+
+			return TypeExtension.ChangeType(value, type);
+		}
+
+		private static object GetEnumDefaultValueFromType(Type type)
+		{
+			var fields = type.GetFields();
+
+			foreach (var fi in fields)
+			{
+				if ((fi.Attributes & EnumField) == EnumField)
+				{
+					var attrs = Attribute.GetCustomAttributes(fi, typeof(DefaultValueAttribute));
+
+					if (attrs.Length > 0)
+						return Enum.Parse(type, fi.Name, false);
+				}
+			}
+
+			return null;
+		}
+
+		#endregion
+
+		#region GetNullable
+
+		public override bool GetNullable(MappingSchema mappingSchema, TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			// Check member [Nullable(true | false)]
+			//
+			var attr1 = member.GetAttribute<NullableAttribute>();
+
+			if (attr1 != null)
+			{
+				isSet = true;
+				return attr1.IsNullable;
+			}
+
+			// Check member [NullValue(0)]
+			//
+			var attr2 = member.GetAttribute<NullValueAttribute>();
+
+			if (attr2 != null)
+				return isSet = true;
+
+			// Check type [Nullable(true || false)]
+			//
+			attr1 = (NullableAttribute)TypeHelper.GetFirstAttribute(
+				member.MemberInfo.DeclaringType, typeof(NullableAttribute));
+
+			if (attr1 != null)
+			{
+				isSet = true;
+				return attr1.IsNullable;
+			}
+
+			// Check type [NullValues(typeof(int), 0)]
+			//
+			var attrs = member.GetTypeAttributes(typeof(NullValueAttribute));
+
+			foreach (NullValueAttribute a in attrs)
+				if (a.Type == null && a.Value != null && a.Value.GetType() == member.Type ||
+					a.Type != null && a.Type == member.Type)
+					return isSet = true;
+
+			if (member.Type.IsEnum)
+				return isSet = mappingSchema.GetNullValue(member.Type) != null;
+
+			if (member.Type.IsClass)
+			{
+				var pk = member.GetAttribute<PrimaryKeyAttribute>();
+
+				if (pk != null)
+				{
+					isSet = false;
+					return false;
+				}
+			}
+
+			return base.GetNullable(mappingSchema, typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetLazyInstance
+
+		public override bool GetLazyInstance(MappingSchema mappingSchema, TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			var attr1 = member.GetAttribute<LazyInstanceAttribute>();
+
+			if (attr1 != null)
+			{
+				isSet = true;
+				return attr1.IsLazy;
+			}
+
+			attr1 = (LazyInstanceAttribute)TypeHelper.GetFirstAttribute(member.MemberInfo.DeclaringType, typeof(LazyInstanceAttribute));
+
+			if (attr1 != null)
+			{
+				isSet = true;
+				return attr1.IsLazy;
+			}
+
+			return base.GetLazyInstance(mappingSchema, typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetNullValue
+
+		private static object CheckNullValue(object value, MemberAccessor member)
+		{
+			if (value is Type && (Type)value == typeof(DBNull))
+			{
+				value = DBNull.Value;
+
+				if (member.Type == typeof(string))
+					value = null;
+			}
+
+			return value;
+		}
+
+		public override object GetNullValue(MappingSchema mappingSchema, TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			// Check member [NullValue(0)]
+			//
+			var attr = member.GetAttribute<NullValueAttribute>();
+
+			if (attr != null)
+			{
+				isSet = true;
+				return CheckNullValue(attr.Value, member);
+			}
+
+			// Check type [NullValues(typeof(int), 0)]
+			//
+			var attrs = member.GetTypeAttributes(typeof(NullValueAttribute));
+
+			foreach (NullValueAttribute a in attrs)
+			{
+				if (a.Type == null && a.Value != null && a.Value.GetType() == member.Type ||
+					a.Type != null && a.Type == member.Type)
+				{
+					isSet = true;
+					return CheckNullValue(a.Value, member);
+				}
+			}
+
+			if (member.Type.IsEnum)
+			{
+				var value = CheckNullValue(mappingSchema.GetNullValue(member.Type), member);
+
+				if (value != null)
+				{
+					isSet = true;
+					return value;
+				}
+			}
+
+			isSet = false;
+			return null;
+		}
+
+		#endregion
+
+		#region GetDbName
+
+		public override string GetDatabaseName(Type type, ExtensionList extensions, out bool isSet)
+		{
+			var attrs = type.GetCustomAttributes(typeof(TableNameAttribute), true);
+
+			if (attrs.Length > 0)
+			{
+				var name = ((TableNameAttribute)attrs[0]).Database;
+				isSet = name != null;
+				return name;
+			}
+
+			return base.GetDatabaseName(type, extensions, out isSet);
+		}
+
+		#endregion
+
+		#region GetTableName
+
+		public override string GetOwnerName(Type type, ExtensionList extensions, out bool isSet)
+		{
+			var attrs = type.GetCustomAttributes(typeof(TableNameAttribute), true);
+
+			if (attrs.Length > 0)
+			{
+				var name = ((TableNameAttribute)attrs[0]).Owner;
+				isSet = name != null;
+				return name;
+			}
+
+			return base.GetOwnerName(type, extensions, out isSet);
+		}
+
+		#endregion
+
+		#region GetTableName
+
+		public override string GetTableName(Type type, ExtensionList extensions, out bool isSet)
+		{
+			var attrs = type.GetCustomAttributes(typeof(TableNameAttribute), true);
+
+			if (attrs.Length > 0)
+			{
+				var name = ((TableNameAttribute)attrs[0]).Name;
+				isSet = name != null;
+				return name;
+			}
+
+			return base.GetTableName(type, extensions, out isSet);
+		}
+
+		#endregion
+
+		#region GetPrimaryKeyOrder
+
+		public override int GetPrimaryKeyOrder(Type type, TypeExtension typeExt, MemberAccessor member, out bool isSet)
+		{
+			var attr = member.GetAttribute<PrimaryKeyAttribute>();
+
+			if (attr != null)
+			{
+				isSet = true;
+				return attr.Order;
+			}
+
+			return base.GetPrimaryKeyOrder(type, typeExt, member, out isSet);
+		}
+
+		#endregion
+
+		public override string GetSequenceName(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			var attr = member.GetAttribute<SequenceNameAttribute>();
+
+			if (attr != null)
+			{
+				isSet = true;
+				return attr.SequenceName;
+			}
+
+			return base.GetSequenceName(typeExtension, member, out isSet);
+		}
+
+		#region GetNonUpdatableFlag
+
+		public override NonUpdatableAttribute GetNonUpdatableAttribute(Type type, TypeExtension typeExt, MemberAccessor member, out bool isSet)
+		{
+			var attr = member.GetAttribute<NonUpdatableAttribute>();
+
+			if (attr != null)
+			{
+				isSet = true;
+				return attr;
+			}
+
+			foreach (NonUpdatableAttribute a in GetNonUpdatableAttributes(member.TypeAccessor))
+			{
+				if (string.Equals(a.FieldName, member.Name, StringComparison.InvariantCultureIgnoreCase))
+				{
+					isSet = true;
+					return a;
+				}
+			}
+
+			return base.GetNonUpdatableAttribute(type, typeExt, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetSqlIgnore
+
+		public override bool GetSqlIgnore(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			var attr = member.GetAttribute<SqlIgnoreAttribute>();
+
+			if (attr == null)
+				attr = (SqlIgnoreAttribute)TypeHelper.GetFirstAttribute(member.Type, typeof(SqlIgnoreAttribute));
+
+			if (attr != null)
+			{
+				isSet = true;
+				return attr.Ignore;
+			}
+
+			return base.GetSqlIgnore(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetRelations
+
+		public override List<MapRelationBase> GetRelations(MappingSchema schema, ExtensionList typeExt, Type master, Type slave, out bool isSet)
+		{
+			var masterAccessor = TypeAccessor.GetAccessor(master);
+			var slaveAccessor  = slave != null ? TypeAccessor.GetAccessor(slave) : null;
+			var relations      = new List<MapRelationBase>();
+
+			foreach (MemberAccessor ma in masterAccessor)
+			{
+				var attr = ma.GetAttribute<RelationAttribute>();
+
+				if (attr == null || (slave != null && attr.Destination != slave && ma.Type != slave))
+					continue;
+
+				if (slave == null)
+					slaveAccessor = TypeAccessor.GetAccessor(attr.Destination ?? ma.Type);
+
+
+				var toMany = TypeHelper.IsSameOrParent(typeof(IEnumerable), ma.Type);
+
+				if (toMany && attr.Destination == null)
+					throw new InvalidOperationException("Destination type should be set for enumerable relations: " + ma.Type.FullName + "." + ma.Name);
+
+				var masterIndex = attr.MasterIndex;
+				var slaveIndex  = attr.SlaveIndex;
+
+				if (slaveIndex == null)
+				{
+					var accessor = toMany ? masterAccessor : slaveAccessor;
+					var tex      = TypeExtension.GetTypeExtension(accessor.Type, typeExt);
+					var keys     = GetPrimaryKeyFields(schema, accessor, tex);
+
+					if (keys.Count > 0)
+						slaveIndex = new MapIndex(keys.ToArray());
+				}
+
+				if (slaveIndex == null)
+					throw new InvalidOperationException("Slave index is not set for relation: " + ma.Type.FullName + "." + ma.Name);
+
+				if (masterIndex == null)
+					masterIndex = slaveIndex;
+
+				var relation = new MapRelationBase(attr.Destination ?? ma.Type, slaveIndex, masterIndex, ma.Name);
+
+				relations.Add(relation);
+			}
+
+			isSet = true;
+			return relations;
+		}
+		
+		#endregion
+
+		#region GetAssociation
+
+		public override Association GetAssociation(TypeExtension typeExtension, MemberAccessor member)
+		{
+			var aa = member.GetAttribute<AssociationAttribute>();
+
+			if (aa == null)
+				return base.GetAssociation(typeExtension, member);
+
+			return new Association(
+				member,
+				aa.GetThisKeys(),
+				aa.GetOtherKeys(),
+				aa.Storage,
+				aa.CanBeNull);
+		}
+
+		#endregion
+
+		#region GetInheritanceMapping
+
+		public override InheritanceMappingAttribute[] GetInheritanceMapping(Type type, TypeExtension typeExtension)
+		{
+			var attrs = type.GetCustomAttributes(typeof(InheritanceMappingAttribute), true);
+
+			if (attrs.Length > 0)
+			{
+				var maps = new InheritanceMappingAttribute[attrs.Length];
+
+				for (var i = 0; i < attrs.Length; i++)
+					maps[i] = (InheritanceMappingAttribute)attrs[i];
+
+				return maps;
+			}
+
+			return base.GetInheritanceMapping(type, typeExtension);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/MetadataProvider/ExtensionMetadataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,659 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.Reflection;
+
+using BLToolkit.Common;
+using BLToolkit.DataAccess;
+
+using Convert=System.Convert;
+
+namespace BLToolkit.Reflection.MetadataProvider
+{
+	using Extension;
+	using Mapping;
+
+	public class ExtensionMetadataProvider : MetadataProviderBase
+	{
+		#region Helpers
+
+		private static object GetValue(TypeExtension typeExtension, MemberAccessor member, string elemName, out bool isSet)
+		{
+			AttributeExtensionCollection ext;
+			isSet = typeExtension[member.Name].Attributes.TryGetValue(elemName, out ext);
+			return isSet ? ext.Value : null;
+		}
+
+		#endregion
+
+		#region GetFieldName
+
+		public override string GetFieldName(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			var value = GetValue(typeExtension, member, "MapField", out isSet);
+
+			if (value != null)
+				return value.ToString();
+
+			return base.GetFieldName(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetFieldStorage
+
+		public override string GetFieldStorage(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			var value = GetValue(typeExtension, member, "FieldStorage", out isSet);
+
+			if (value != null)
+				return value.ToString();
+
+			return base.GetFieldStorage(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetInheritanceDiscriminator
+
+		public override bool GetInheritanceDiscriminator(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			var value = GetValue(typeExtension, member, "IsInheritanceDiscriminator", out isSet);
+
+			if (value != null)
+				return TypeExtension.ToBoolean(value);
+
+			return base.GetInheritanceDiscriminator(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetMapIgnore
+
+		public override bool GetMapIgnore(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			var value = GetValue(typeExtension, member, "MapIgnore", out isSet);
+
+			if (value != null)
+				return TypeExtension.ToBoolean(value);
+
+			return base.GetMapIgnore(typeExtension, member, out isSet) || GetAssociation(typeExtension, member) != null;
+		}
+
+		#endregion
+
+		#region GetMapField
+
+		public override MapFieldAttribute GetMapField(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			var extList = typeExtension[member.Name]["MapField"];
+
+			if (extList != AttributeExtensionCollection.Null)
+			{
+				isSet = true;
+				var attr = new MapFieldAttribute();
+
+				var extFormat = extList.FirstOrDefault(x => x.Name == "Format");
+				var extMapName = extList.FirstOrDefault(x => x.Name == "MapName");
+				var extIsInheritanceDiscriminator = extList.FirstOrDefault(x => x.Name == "IsInheritanceDiscriminator");
+				var extOrigName = extList.FirstOrDefault(x => x.Name == "OrigName");
+				var extStorage = extList.FirstOrDefault(x => x.Name == "Storage");
+
+				if (extFormat != null) 
+					attr.Format = (string)extFormat.Value;
+				if (extMapName != null) 
+					attr.MapName = (string)extMapName.Value;
+				if (extFormat != null) 
+					attr.IsInheritanceDiscriminator = Convert.ToBoolean(extIsInheritanceDiscriminator.Value);
+				if (extFormat != null) 
+					attr.OrigName = (string)extOrigName.Value;
+				if (extFormat != null) 
+					attr.Storage = (string)extStorage.Value;
+				return attr;
+			}
+
+			return base.GetMapField(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetDbType
+
+		[CLSCompliant(false)]
+		public override DbTypeAttribute GetDbType(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			var extList = typeExtension[member.Name]["DbType"];
+
+			if (extList != AttributeExtensionCollection.Null)
+			{
+				isSet = true;
+				var attr = new DbTypeAttribute(DbType.String);
+
+				var extDbType = extList.FirstOrDefault(x => x.Name == "DbType");
+				var extSize = extList.FirstOrDefault(x => x.Name == "Size");
+
+				DbType dbType;
+				if (extDbType != null)
+				{
+#if SILVERLIGHT || FW4
+					DbType.TryParse(extDbType.Value.ToString(), out dbType);
+#else
+					dbType = (DbType)Enum.Parse(typeof(DbType), extDbType.Value.ToString());
+#endif
+					attr.DbType = dbType;
+				}
+				if (extSize != null)
+				{
+					attr.Size = int.Parse(extSize.Value.ToString());
+				}
+				return attr;
+			}
+
+			return base.GetDbType(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+        #region GetPrimaryKey
+
+        public override PrimaryKeyAttribute GetPrimaryKey(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+        {
+            var extList = typeExtension[member.Name]["PrimaryKey"];
+
+            if (extList != AttributeExtensionCollection.Null)
+            {
+                isSet = true;
+                int order = -1;
+                var extOrder = extList.FirstOrDefault(x => x.Name == "Order");
+                if (extOrder != null)
+                {
+                    order = int.Parse(extOrder.Value.ToString());
+                }
+                var attr = new PrimaryKeyAttribute(order);
+                return attr;
+            }
+
+            return base.GetPrimaryKey(typeExtension, member, out isSet);
+        }
+
+        #endregion
+
+
+		#region GetTrimmable
+
+		public override bool GetTrimmable(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			if (member.Type == typeof(string))
+			{
+				var value = GetValue(typeExtension, member, "Trimmable", out isSet);
+
+				if (value != null)
+					return TypeExtension.ToBoolean(value);
+			}
+
+			return base.GetTrimmable(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetMapValues
+
+		public override MapValue[] GetMapValues(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			var extList = typeExtension[member.Name]["MapValue"];
+
+			if (extList == AttributeExtensionCollection.Null)
+				return GetMapValues(typeExtension, member.Type, out isSet);
+
+			var list = new List<MapValue>(extList.Count);
+
+			foreach (var ext in extList)
+			{
+				var origValue = ext["OrigValue"];
+
+				if (origValue != null)
+				{
+					origValue = TypeExtension.ChangeType(origValue, member.Type);
+					list.Add(new MapValue(origValue, ext.Value));
+				}
+			}
+
+			isSet = true;
+
+			return list.ToArray();
+		}
+
+		const FieldAttributes EnumField = FieldAttributes.Public | FieldAttributes.Static | FieldAttributes.Literal;
+
+		static List<MapValue> GetEnumMapValues(TypeExtension typeExt, Type type)
+		{
+			List<MapValue> mapValues = null;
+
+			var fields = type.GetFields();
+
+			foreach (var fi in fields)
+			{
+				if ((fi.Attributes & EnumField) == EnumField)
+				{
+					var attrExt = typeExt[fi.Name]["MapValue"];
+
+					if (attrExt.Count == 0)
+						continue;
+
+					var list      = new List<object>(attrExt.Count);
+					var origValue = Enum.Parse(type, fi.Name, false);
+
+					list.AddRange(from ae in attrExt where ae.Value != null select ae.Value);
+
+					if (list.Count > 0)
+					{
+						if (mapValues == null)
+							mapValues = new List<MapValue>(fields.Length);
+
+						mapValues.Add(new MapValue(origValue, list.ToArray()));
+					}
+				}
+			}
+
+			return mapValues;
+		}
+
+		static List<MapValue> GetTypeMapValues(TypeExtension typeExt, Type type)
+		{
+			var extList = typeExt.Attributes["MapValue"];
+
+			if (extList == AttributeExtensionCollection.Null)
+				return null;
+
+			var attrs = new List<MapValue>(extList.Count);
+
+			foreach (var ext in extList)
+			{
+				var origValue = ext["OrigValue"];
+
+				if (origValue != null)
+				{
+					origValue = TypeExtension.ChangeType(origValue, type);
+					attrs.Add(new MapValue(origValue, ext.Value));
+				}
+			}
+
+			return attrs;
+		}
+
+		public override MapValue[] GetMapValues(TypeExtension typeExt, Type type, out bool isSet)
+		{
+			List<MapValue> list = null;
+
+			if (TypeHelper.IsNullable(type))
+				type = type.GetGenericArguments()[0];
+
+			if (type.IsEnum)
+				list = GetEnumMapValues(typeExt, type);
+
+			if (list == null)
+				list = GetTypeMapValues(typeExt, type);
+
+			isSet = list != null;
+
+			return isSet? list.ToArray(): null;
+		}
+
+		#endregion
+
+		#region GetDefaultValue
+
+		public override object GetDefaultValue(MappingSchema mappingSchema, TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			var value = typeExtension[member.Name]["DefaultValue"].Value;
+
+			if (value != null)
+			{
+				isSet = true;
+				return TypeExtension.ChangeType(value, member.Type);
+			}
+
+			return GetDefaultValue(mappingSchema, typeExtension, member.Type, out isSet);
+		}
+
+		public override object GetDefaultValue(MappingSchema mappingSchema, TypeExtension typeExt, Type type, out bool isSet)
+		{
+			object value = null;
+
+			if (type.IsEnum)
+				value = GetEnumDefaultValueFromExtension(typeExt, type);
+
+			if (value == null)
+				value = typeExt.Attributes["DefaultValue"].Value;
+
+			isSet = value != null;
+
+			return TypeExtension.ChangeType(value, type);
+		}
+
+		private static object GetEnumDefaultValueFromExtension(TypeExtension typeExt, Type type)
+		{
+			var fields = type.GetFields();
+
+			foreach (var fi in fields)
+				if ((fi.Attributes & EnumField) == EnumField)
+					if (typeExt[fi.Name]["DefaultValue"].Value != null)
+						return Enum.Parse(type, fi.Name, false);
+
+			return null;
+		}
+
+		#endregion
+
+		#region GetNullable
+
+		public override bool GetNullable(MappingSchema mappingSchema, TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			// Check extension <Member1 Nullable='true' />
+			//
+			var value = GetValue(typeExtension, member, "Nullable", out isSet);
+
+			if (isSet)
+				return TypeExtension.ToBoolean(value);
+
+			// Check extension <Member1 NullValue='-1' />
+			//
+			if (GetValue(typeExtension, member, "NullValue", out isSet) != null)
+				return true;
+
+			return base.GetNullable(mappingSchema, typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+        #region GetNullable
+
+        public override bool GetLazyInstance(MappingSchema mappingSchema, TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+        {
+            // Check extension <Member1 Nullable='true' />
+            //
+            var value = GetValue(typeExtension, member, "LazyInstance", out isSet);
+
+            if (isSet)
+                return TypeExtension.ToBoolean(value);
+
+            // Check extension <Member1 NullValue='-1' />
+            //
+            if (GetValue(typeExtension, member, "LazyInstance", out isSet) != null)
+                return true;
+
+            return base.GetLazyInstance(mappingSchema, typeExtension, member, out isSet);
+        }
+
+        #endregion
+
+		#region GetNullable
+
+		public override object GetNullValue(MappingSchema mappingSchema, TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			// Check extension <Member1 NullValue='-1' />
+			//
+			var value = GetValue(typeExtension, member, "NullValue", out isSet);
+
+			return isSet? TypeExtension.ChangeType(value, member.Type): null;
+		}
+
+		#endregion
+
+		#region GetDbName
+
+		public override string GetDatabaseName(Type type, ExtensionList extensions, out bool isSet)
+		{
+			var typeExt = TypeExtension.GetTypeExtension(type, extensions);
+			var value   = typeExt.Attributes["DatabaseName"].Value;
+
+			if (value != null)
+			{
+				isSet = true;
+				return value.ToString();
+			}
+
+			return base.GetDatabaseName(type, extensions, out isSet);
+		}
+
+		#endregion
+
+		#region GetOwnerName
+
+		public override string GetOwnerName(Type type, ExtensionList extensions, out bool isSet)
+		{
+			var typeExt = TypeExtension.GetTypeExtension(type, extensions);
+			var value   = typeExt.Attributes["OwnerName"].Value;
+
+			if (value != null)
+			{
+				isSet = true;
+				return value.ToString();
+			}
+
+			return base.GetOwnerName(type, extensions, out isSet);
+		}
+
+		#endregion
+
+		#region GetTableName
+
+		public override string GetTableName(Type type, ExtensionList extensions, out bool isSet)
+		{
+			var typeExt = TypeExtension.GetTypeExtension(type, extensions);
+			var value   = typeExt.Attributes["TableName"].Value;
+
+			if (value != null)
+			{
+				isSet = true;
+				return value.ToString();
+			}
+
+			return base.GetTableName(type, extensions, out isSet);
+		}
+
+		#endregion
+
+		#region GetPrimaryKeyOrder
+
+		public override int GetPrimaryKeyOrder(Type type, TypeExtension typeExt, MemberAccessor member, out bool isSet)
+		{
+			var value = typeExt[member.Name]["PrimaryKey"].Value;
+
+			if (value != null)
+			{
+				isSet = true;
+				return (int)TypeExtension.ChangeType(value, typeof(int));
+			}
+
+			return base.GetPrimaryKeyOrder(type, typeExt, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetNonUpdatableFlag
+
+		public override NonUpdatableAttribute GetNonUpdatableAttribute(Type type, TypeExtension typeExt, MemberAccessor member, out bool isSet)
+		{
+			var value = typeExt[member.Name]["NonUpdatable"].Value;
+
+			if (value != null)
+			{
+				isSet = true;
+				return (bool)TypeExtension.ChangeType(value, typeof(bool)) ? new NonUpdatableAttribute() : null;
+			}
+
+			value = typeExt[member.Name]["Identity"].Value;
+
+			if (value != null)
+			{
+				isSet = true;
+				return (bool)TypeExtension.ChangeType(value, typeof(bool)) ? new IdentityAttribute() : null;
+			}
+
+			return base.GetNonUpdatableAttribute(type, typeExt, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetSqlIgnore
+
+		public override bool GetSqlIgnore(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			var value = GetValue(typeExtension, member, "SqlIgnore", out isSet);
+
+			if (value != null)
+				return TypeExtension.ToBoolean(value);
+
+			return base.GetSqlIgnore(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetRelations
+
+		public override List<MapRelationBase> GetRelations(MappingSchema schema, ExtensionList typeExt, Type master, Type slave, out bool isSet)
+		{
+			var relations = new List<MapRelationBase>();
+			var ext       = typeExt != null ? typeExt[master] : TypeExtension.Null;
+
+			isSet = ext != TypeExtension.Null;
+
+			if (!isSet)
+				return relations;
+
+			var ta = TypeAccessor.GetAccessor(master);
+
+			foreach (var mex in ext.Members.Values)
+			{
+				var relationInfos = mex.Attributes[TypeExtension.NodeName.Relation];
+
+				if (relationInfos == AttributeExtensionCollection.Null)
+					continue;
+
+				var destinationTypeName = relationInfos[0][TypeExtension.AttrName.DestinationType, string.Empty].ToString();
+				var destinationType     = slave;
+				var ma                  = ta[mex.Name];
+				var toMany              = TypeHelper.IsSameOrParent(typeof(IEnumerable), ma.Type);
+
+				if (destinationTypeName == string.Empty)
+				{
+					if (toMany)
+						throw new InvalidOperationException("Destination type should be set for enumerable relations: " + ma.Type.FullName + "." + ma.Name);
+
+					destinationType = ma.Type;
+				}
+				else
+				{
+					if (!destinationTypeName.Contains(","))
+						destinationTypeName += ", " + ta.OriginalType.Assembly.FullName;
+					
+					try
+					{
+						destinationType = Type.GetType(destinationTypeName, true);
+					}
+					catch (TypeLoadException ex)
+					{
+						throw new InvalidOperationException(
+							"Unable to load type by name: " + destinationTypeName
+							+ "\n may be assembly is not specefied, please see Type.GetType(string typeName) documentation",
+							ex);
+					}
+				}
+
+				if (slave != null && !TypeHelper.IsSameOrParent(slave, destinationType))
+					continue;
+
+				var masterIndexFields = new List<string>();
+				var slaveIndexFields  = new List<string>();
+
+				foreach (var ae in relationInfos[0].Attributes[TypeExtension.NodeName.MasterIndex])
+					masterIndexFields.Add(ae[TypeExtension.AttrName.Name].ToString());
+
+				foreach (var ae in relationInfos[0].Attributes[TypeExtension.NodeName.SlaveIndex])
+					slaveIndexFields.Add(ae[TypeExtension.AttrName.Name].ToString());
+
+
+				if (slaveIndexFields.Count == 0)
+				{
+					var  accessor = toMany ? ta : TypeAccessor.GetAccessor(destinationType);
+					var tex      = TypeExtension.GetTypeExtension(accessor.Type, typeExt);
+
+					slaveIndexFields = GetPrimaryKeyFields(schema, accessor, tex);
+				}
+
+				if (slaveIndexFields.Count == 0)
+					throw new InvalidOperationException("Slave index is not set for relation: " + ma.Type.FullName + "." + ma.Name);
+
+				var slaveIndex  = new MapIndex(slaveIndexFields.ToArray());
+				var masterIndex = masterIndexFields.Count > 0 ? new MapIndex(masterIndexFields.ToArray()) : slaveIndex;
+				var mapRelation = new MapRelationBase(destinationType, slaveIndex, masterIndex, mex.Name);
+
+				relations.Add(mapRelation);
+
+			}
+
+			isSet = relations.Count > 0;
+			return relations;
+		}
+
+		#endregion
+
+		#region GetAssociation
+
+		public override Association GetAssociation(TypeExtension typeExtension, MemberAccessor member)
+		{
+			if (typeExtension == TypeExtension.Null)
+				return null;
+
+			var mex = typeExtension[member.Name];
+
+			if (mex == MemberExtension.Null)
+				return null;
+
+			var attrs = mex.Attributes[TypeExtension.NodeName.Association];
+
+			if (attrs == AttributeExtensionCollection.Null)
+				return null;
+
+			return new Association(
+				member,
+				Association.ParseKeys(attrs[0]["ThisKey",  string.Empty].ToString()),
+				Association.ParseKeys(attrs[0]["OtherKey", string.Empty].ToString()),
+				attrs[0]["Storage", string.Empty].ToString(),
+				TypeExtension.ToBoolean(attrs[0]["Storage", "True"], true));
+		}
+
+		#endregion
+
+		#region GetInheritanceMapping
+
+		public override InheritanceMappingAttribute[] GetInheritanceMapping(Type type, TypeExtension typeExtension)
+		{
+			var extList = typeExtension.Attributes["InheritanceMapping"];
+
+			if (extList == AttributeExtensionCollection.Null)
+				return Array<InheritanceMappingAttribute>.Empty;
+
+			var attrs = new InheritanceMappingAttribute[extList.Count];
+
+			for (var i = 0; i < extList.Count; i++)
+			{
+				var ext = extList[i];
+
+				attrs[i] = new InheritanceMappingAttribute
+				{
+					Code      = ext["Code"],
+					IsDefault = TypeExtension.ToBoolean(ext["IsDefault", "False"], false),
+					Type      = Type.GetType(Convert.ToString(ext["Type"]))
+				};
+			}
+
+			return attrs;
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/MetadataProvider/LinqMetadataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,239 @@
+using System;
+using System.Data.Linq.Mapping;
+using System.Linq;
+
+namespace BLToolkit.Reflection.MetadataProvider
+{
+	using DataAccess;
+	using Mapping;
+	using Extension;
+
+	public class LinqMetadataProvider : MetadataProviderBase
+	{
+		#region Helpers
+
+		private  Type   _type;
+		private  bool?  _isLinqObject;
+		readonly object _sync = new object();
+
+		void EnsureMapper(Type type)
+		{
+			if (_type != type)
+			{
+				_type         = type;
+				_isLinqObject = null;
+			}
+		}
+
+		bool IsLinqObject(Type type)
+		{
+			lock (_sync)
+			{
+				EnsureMapper(type);
+
+				if (_isLinqObject == null)
+				{
+					var attrs = type.GetCustomAttributes(typeof(TableAttribute), true);
+					_isLinqObject = attrs.Length > 0;
+				}
+
+				return _isLinqObject.Value;
+			}
+		}
+
+		#endregion
+
+		#region GetFieldName
+
+		public override string GetFieldName(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			if (IsLinqObject(member.TypeAccessor.Type))
+			{
+				var a = member.GetAttribute<ColumnAttribute>();
+
+				if (a != null && !string.IsNullOrEmpty(a.Name))
+				{
+					isSet = true;
+					return a.Name;
+				}
+			}
+
+			return base.GetFieldName(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetFieldStorage
+
+		public override string GetFieldStorage(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			if (IsLinqObject(member.TypeAccessor.Type))
+			{
+				var a = member.GetAttribute<ColumnAttribute>();
+
+				if (a != null && !string.IsNullOrEmpty(a.Name))
+				{
+					isSet = true;
+					return a.Storage;
+				}
+			}
+
+			return base.GetFieldStorage(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetInheritanceDiscriminator
+
+		public override bool GetInheritanceDiscriminator(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			if (IsLinqObject(member.TypeAccessor.Type))
+			{
+				var a = member.GetAttribute<ColumnAttribute>();
+
+				if (a != null && !string.IsNullOrEmpty(a.Name))
+				{
+					isSet = true;
+					return a.IsDiscriminator;
+				}
+			}
+
+			return base.GetInheritanceDiscriminator(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetMapIgnore
+
+		public override bool GetMapIgnore(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			if (member.GetAttribute<AssociationAttribute>() != null)
+			{
+				isSet = true;
+				return true;
+			}
+
+			if (IsLinqObject(member.TypeAccessor.Type))
+			{
+				isSet = true;
+				return member.GetAttribute<ColumnAttribute>() == null;
+			}
+
+			return base.GetMapIgnore(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetNullable
+
+		public override bool GetNullable(MappingSchema mappingSchema, TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			if (IsLinqObject(member.TypeAccessor.Type))
+			{
+				var attr = member.GetAttribute<ColumnAttribute>();
+
+				if (attr != null)
+				{
+					isSet = true;
+					return attr.CanBeNull;
+				}
+			}
+
+			return base.GetNullable(mappingSchema, typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetTableName
+
+		public override string GetTableName(Type type, ExtensionList extensions, out bool isSet)
+		{
+			if (IsLinqObject(type))
+			{
+				isSet = true;
+
+				var attrs = type.GetCustomAttributes(typeof(TableAttribute), true);
+
+				return ((TableAttribute)attrs[0]).Name;
+			}
+
+			return base.GetTableName(type, extensions, out isSet);
+		}
+
+		#endregion
+
+		#region GetPrimaryKeyOrder
+
+		public override int GetPrimaryKeyOrder(Type type, TypeExtension typeExt, MemberAccessor member, out bool isSet)
+		{
+			if (IsLinqObject(type))
+			{
+				ColumnAttribute a = member.GetAttribute<ColumnAttribute>();
+
+				if (a != null && a.IsPrimaryKey)
+				{
+					isSet = true;
+					return 0;
+				}
+			}
+
+			return base.GetPrimaryKeyOrder(type, typeExt, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetNonUpdatableFlag
+
+		public override NonUpdatableAttribute GetNonUpdatableAttribute(Type type, TypeExtension typeExt, MemberAccessor member, out bool isSet)
+		{
+			if (IsLinqObject(member.TypeAccessor.Type))
+			{
+				var a = member.GetAttribute<ColumnAttribute>();
+
+				if (a != null)
+				{
+					isSet = true;
+					return a.IsDbGenerated ? new IdentityAttribute() : null;
+				}
+			}
+
+			return base.GetNonUpdatableAttribute(type, typeExt, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetAssociation
+
+		public override Association GetAssociation(TypeExtension typeExtension, MemberAccessor member)
+		{
+			if (IsLinqObject(member.TypeAccessor.Type))
+			{
+				var a = member.GetAttribute<System.Data.Linq.Mapping.AssociationAttribute>();
+
+				if (a != null)
+					return new Association(member, Association.ParseKeys(a.ThisKey), Association.ParseKeys(a.OtherKey), a.Storage, true);
+			}
+
+			return base.GetAssociation(typeExtension, member);
+		}
+
+		#endregion
+
+		#region GetInheritanceMapping
+
+		public override InheritanceMappingAttribute[] GetInheritanceMapping(Type type,TypeExtension typeExtension)
+		{
+			if (IsLinqObject(type))
+			{
+				var attrs = type.GetCustomAttributes(typeof(InheritanceMappingAttribute), true);
+
+				if (attrs.Length > 0)
+					return attrs.Select(a => (InheritanceMappingAttribute)a).ToArray();
+			}
+
+			return base.GetInheritanceMapping(type, typeExtension);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/MetadataProvider/MetadataProviderBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,349 @@
+using System;
+using System.Collections.Generic;
+
+using BLToolkit.Common;
+using BLToolkit.DataAccess;
+
+namespace BLToolkit.Reflection.MetadataProvider
+{
+	using Extension;
+	using Mapping;
+
+	public delegate void                 OnCreateProvider(MetadataProviderBase parentProvider);
+	public delegate MetadataProviderBase CreateProvider();
+	public delegate MemberMapper         EnsureMapperHandler(string mapName, string origName);
+
+	public abstract class MetadataProviderBase
+	{
+		#region Provider Support
+
+		public virtual void AddProvider(MetadataProviderBase provider)
+		{
+		}
+
+		public virtual void InsertProvider(int index, MetadataProviderBase provider)
+		{
+		}
+
+		public virtual MetadataProviderBase[] GetProviders()
+		{
+			return new MetadataProviderBase[0];
+		}
+
+		#endregion
+
+		#region GetFieldName
+
+		public virtual string GetFieldName(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			isSet = false;
+			return member.Name;
+		}
+
+		#endregion
+
+		public virtual string GetSequenceName(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			isSet = false;
+			return null;
+		}
+
+		#region GetFieldStorage
+
+		public virtual string GetFieldStorage(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			isSet = false;
+			return null;
+		}
+
+		#endregion
+
+		#region GetInheritanceDiscriminator
+
+		public virtual bool GetInheritanceDiscriminator(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			isSet = false;
+			return false;
+		}
+
+		#endregion
+
+		#region EnsureMapper
+
+		public virtual void EnsureMapper(TypeAccessor typeAccessor, MappingSchema mappingSchema, EnsureMapperHandler handler)
+		{
+		}
+
+		#endregion
+
+		#region GetMapIgnore
+
+		public virtual bool GetMapIgnore(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			isSet = false;
+
+			return
+				TypeHelper.IsScalar(member.Type) == false;// ||
+				//(member.MemberInfo is FieldInfo && ((FieldInfo)member.MemberInfo).IsLiteral);
+		}
+
+		#endregion
+
+		#region GetMapField
+
+		public virtual MapFieldAttribute GetMapField(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			isSet = false;
+			return null;
+		}
+
+		#endregion
+
+		#region GetDbType
+
+		[CLSCompliant(false)]
+		public virtual DbTypeAttribute GetDbType(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			isSet = false;
+			return null;
+		}
+
+		#endregion
+
+		#region GetPrimaryKey
+
+		public virtual PrimaryKeyAttribute GetPrimaryKey(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			isSet = false;
+			return null;
+		}
+
+		#endregion
+
+		#region GetTrimmable
+
+		public virtual bool GetTrimmable(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			isSet = member.Type != typeof(string);
+			return isSet? false: TrimmableAttribute.Default.IsTrimmable;
+		}
+
+		#endregion
+
+		#region GetMapValues
+
+		public virtual MapValue[] GetMapValues(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			isSet = false;
+			return null;
+		}
+
+		public virtual MapValue[] GetMapValues(TypeExtension typeExtension, Type type, out bool isSet)
+		{
+			isSet = false;
+			return null;
+		}
+
+		#endregion
+
+		#region GetDefaultValue
+
+		public virtual object GetDefaultValue(MappingSchema mappingSchema, TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			isSet = false;
+			return null;
+		}
+
+		public virtual object GetDefaultValue(MappingSchema mappingSchema, TypeExtension typeExtension, Type type, out bool isSet)
+		{
+			isSet = false;
+			return null;
+		}
+
+		#endregion
+
+		#region GetNullable
+
+		public virtual bool GetNullable(MappingSchema mappingSchema, TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			isSet = false;
+			return
+				//member.Type.IsClass ||
+				member.Type.IsGenericType && member.Type.GetGenericTypeDefinition() == typeof (Nullable<>)
+				/*||
+				member.Type == typeof(System.Data.Linq.Binary) ||
+				member.Type == typeof(byte[])*/;
+		}
+
+		#endregion
+
+		#region GetLazyInstance
+
+		public virtual bool GetLazyInstance(MappingSchema mappingSchema, TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			isSet = false;
+			return false;
+		}
+
+		#endregion
+
+		#region GetNullValue
+
+		public virtual object GetNullValue(MappingSchema mappingSchema, TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			isSet = false;
+
+			if (member.Type.IsEnum)
+				return null;
+
+			var value = mappingSchema.GetNullValue(member.Type);
+
+			if (value is Type && (Type)value == typeof(DBNull))
+			{
+				value = DBNull.Value;
+
+				if (member.Type == typeof(string))
+					value = null;
+			}
+
+			return value;
+		}
+
+		#endregion
+
+		#region GetDbName
+
+		public virtual string GetDatabaseName(Type type, ExtensionList extensions, out bool isSet)
+		{
+			isSet = false;
+			return null;
+		}
+
+		#endregion
+
+		#region GetOwnerName
+
+		public virtual string GetOwnerName(Type type, ExtensionList extensions, out bool isSet)
+		{
+			isSet = false;
+			return null;
+		}
+
+		#endregion
+
+		#region GetTableName
+
+		public virtual string GetTableName(Type type, ExtensionList extensions, out bool isSet)
+		{
+			isSet = false;
+			return
+				type.IsInterface && type.Name.StartsWith("I")
+					? type.Name.Substring(1)
+					: type.Name;
+		}
+
+		#endregion
+
+		#region GetPrimaryKeyOrder
+
+		public virtual int GetPrimaryKeyOrder(Type type, TypeExtension typeExt, MemberAccessor member, out bool isSet)
+		{
+			isSet = false;
+			return 0;
+		}
+
+		#endregion
+
+		#region GetNonUpdatableAttribute
+
+		public virtual NonUpdatableAttribute GetNonUpdatableAttribute(Type type, TypeExtension typeExt, MemberAccessor member, out bool isSet)
+		{
+			isSet = false;
+			return null;
+		}
+
+		#endregion
+
+		#region GetSqlIgnore
+
+		public virtual bool GetSqlIgnore(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			isSet = false;
+			return false;
+		}
+
+		#endregion
+
+		#region GetRelations
+
+		public virtual List<MapRelationBase> GetRelations(MappingSchema schema, ExtensionList typeExt, Type master, Type slave, out bool isSet)
+		{
+			isSet = false;
+			return new List<MapRelationBase>();
+		}
+
+		protected static List<string> GetPrimaryKeyFields(MappingSchema schema, TypeAccessor ta, TypeExtension tex)
+		{
+			var mdp  = schema.MetadataProvider;
+			var keys = new List<string>();
+
+			foreach (MemberAccessor sma in ta)
+			{
+				bool isSetFlag;
+
+				mdp.GetPrimaryKeyOrder(ta.Type, tex, sma, out isSetFlag);
+
+				if (isSetFlag)
+				{
+					var name = mdp.GetFieldName(tex, sma, out isSetFlag);
+					keys.Add(name);
+				}
+			}
+
+			return keys;
+		}
+
+		#endregion
+
+		#region GetAssociation
+
+		public virtual Association GetAssociation(TypeExtension typeExtension, MemberAccessor member)
+		{
+			return null;
+		}
+
+		#endregion
+
+		#region GetInheritanceMapping
+
+		public virtual InheritanceMappingAttribute[] GetInheritanceMapping(Type type, TypeExtension typeExtension)
+		{
+			return Array<InheritanceMappingAttribute>.Empty;
+		}
+
+		#endregion
+
+		#region Static Members
+
+		public static event OnCreateProvider OnCreateProvider;
+
+		private static CreateProvider _createProvider = CreateInternal;
+		public  static CreateProvider  CreateProvider
+		{
+			get { return _createProvider; }
+			set { _createProvider = value ?? new CreateProvider(CreateInternal); }
+		}
+
+		private static MetadataProviderBase CreateInternal()
+		{
+			var list = new MetadataProviderList();
+
+			if (OnCreateProvider != null)
+				OnCreateProvider(list);
+
+			return list;
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/MetadataProvider/MetadataProviderList.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,473 @@
+using System;
+using System.Collections.Generic;
+
+namespace BLToolkit.Reflection.MetadataProvider
+{
+	using DataAccess;
+	using Extension;
+	using Mapping;
+
+	public class MetadataProviderList : MetadataProviderBase
+	{
+		#region Init
+
+		public MetadataProviderList()
+		{
+			AddProvider(new ExtensionMetadataProvider());
+			AddProvider(new AttributeMetadataProvider());
+#if !SILVERLIGHT
+			AddProvider(new LinqMetadataProvider());
+#endif
+		}
+
+		private readonly List<MetadataProviderBase> _list = new List<MetadataProviderBase>(3);
+
+		#endregion
+
+		#region Provider Support
+
+		public override void AddProvider(MetadataProviderBase provider)
+		{
+			_list.Add(provider);
+		}
+
+		public override void InsertProvider(int index, MetadataProviderBase provider)
+		{
+			_list.Insert(index, provider);
+		}
+
+		public override MetadataProviderBase[] GetProviders()
+		{
+			return _list.ToArray();
+		}
+
+		#endregion
+
+		#region GetFieldName
+
+		public override string GetFieldName(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			foreach (var p in _list)
+			{
+				var name = p.GetFieldName(typeExtension, member, out isSet);
+
+				if (isSet)
+					return name;
+			}
+
+			return base.GetFieldName(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetFieldStorage
+
+		public override string GetFieldStorage(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			foreach (var p in _list)
+			{
+				var name = p.GetFieldStorage(typeExtension, member, out isSet);
+
+				if (isSet)
+					return name;
+			}
+
+			return base.GetFieldStorage(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetInheritanceDiscriminator
+
+		public override bool GetInheritanceDiscriminator(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			foreach (var p in _list)
+			{
+				var value = p.GetInheritanceDiscriminator(typeExtension, member, out isSet);
+
+				if (isSet)
+					return value;
+			}
+
+			return base.GetInheritanceDiscriminator(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region EnsureMapper
+
+		public override void EnsureMapper(TypeAccessor typeAccessor, MappingSchema mappingSchema, EnsureMapperHandler handler)
+		{
+			foreach (var p in _list)
+				p.EnsureMapper(typeAccessor, mappingSchema, handler);
+		}
+
+		#endregion
+
+		#region GetMapIgnore
+
+		public override bool GetMapIgnore(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			foreach (var p in _list)
+			{
+				var ignore = p.GetMapIgnore(typeExtension, member, out isSet);
+
+				if (isSet)
+					return ignore;
+			}
+
+			return base.GetMapIgnore(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetMapField
+
+		public override MapFieldAttribute GetMapField(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			foreach (var p in _list)
+			{
+				var attr = p.GetMapField(typeExtension, member, out isSet);
+
+				if (attr != null) 
+					return attr;
+			}
+
+			return base.GetMapField(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetDbType
+
+		[CLSCompliant(false)]
+		public override DbTypeAttribute GetDbType(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			foreach (var p in _list)
+			{
+				var attr = p.GetDbType(typeExtension, member, out isSet);
+
+				if (attr != null)
+					return attr;
+			}
+
+			return base.GetDbType(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetPrimaryKey
+
+		public override PrimaryKeyAttribute GetPrimaryKey(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			foreach (var p in _list)
+			{
+				var attr = p.GetPrimaryKey(typeExtension, member, out isSet);
+
+				if (attr != null)
+					return attr;
+			}
+
+			return base.GetPrimaryKey(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetTrimmable
+
+		public override bool GetTrimmable(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			if (member.Type == typeof(string))
+			{
+				foreach (var p in _list)
+				{
+					var trimmable = p.GetTrimmable(typeExtension, member, out isSet);
+
+					if (isSet)
+						return trimmable;
+				}
+			}
+
+			return base.GetTrimmable(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetMapValues
+
+		public override MapValue[] GetMapValues(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			foreach (var p in _list)
+			{
+				var value = p.GetMapValues(typeExtension, member, out isSet);
+
+				if (isSet)
+					return value;
+			}
+
+			return base.GetMapValues(typeExtension, member, out isSet);
+		}
+
+		public override MapValue[] GetMapValues(TypeExtension typeExt, Type type, out bool isSet)
+		{
+			foreach (var p in _list)
+			{
+				var value = p.GetMapValues(typeExt, type, out isSet);
+
+				if (isSet)
+					return value;
+			}
+
+			return base.GetMapValues(typeExt, type, out isSet);
+		}
+
+		#endregion
+
+		#region GetDefaultValue
+
+		public override object GetDefaultValue(MappingSchema mappingSchema, TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			foreach (var p in _list)
+			{
+				var value = p.GetDefaultValue(mappingSchema, typeExtension, member, out isSet);
+
+				if (isSet)
+					return value;
+			}
+
+			return base.GetDefaultValue(mappingSchema, typeExtension, member, out isSet);
+		}
+
+		public override object GetDefaultValue(MappingSchema mappingSchema, TypeExtension typeExtension, Type type, out bool isSet)
+		{
+			foreach (var p in _list)
+			{
+				var value = p.GetDefaultValue(mappingSchema, typeExtension, type, out isSet);
+
+				if (isSet)
+					return value;
+			}
+
+			return base.GetDefaultValue(mappingSchema, typeExtension, type, out isSet);
+		}
+
+		#endregion
+
+		#region GetNullable
+
+		public override bool GetNullable(MappingSchema mappingSchema, TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			foreach (var p in _list)
+			{
+				var value = p.GetNullable(mappingSchema, typeExtension, member, out isSet);
+
+				if (isSet)
+					return value;
+			}
+
+			return base.GetNullable(mappingSchema, typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+        #region GetLazyInstance
+
+        public override bool GetLazyInstance(MappingSchema mappingSchema, TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+        {
+            foreach (var p in _list)
+            {
+                var value = p.GetLazyInstance(mappingSchema, typeExtension, member, out isSet);
+
+                if (isSet)
+                    return value;
+            }
+
+            return base.GetLazyInstance(mappingSchema, typeExtension, member, out isSet);
+        }
+
+        #endregion
+
+		#region GetNullValue
+
+		public override object GetNullValue(MappingSchema mappingSchema, TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			foreach (var p in _list)
+			{
+				var value = p.GetNullValue(mappingSchema, typeExtension, member, out isSet);
+
+				if (isSet)
+					return value;
+			}
+
+			return base.GetNullValue(mappingSchema, typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetDbName
+
+		public override string GetDatabaseName(Type type, ExtensionList extensions, out bool isSet)
+		{
+			foreach (var p in _list)
+			{
+				var value = p.GetDatabaseName(type, extensions, out isSet);
+
+				if (isSet)
+					return value;
+			}
+
+			return base.GetDatabaseName(type, extensions, out isSet);
+		}
+
+		#endregion
+
+		#region GetOwnerName
+
+		public override string GetOwnerName(Type type, ExtensionList extensions, out bool isSet)
+		{
+			foreach (var p in _list)
+			{
+				var value = p.GetOwnerName(type, extensions, out isSet);
+
+				if (isSet)
+					return value;
+			}
+
+			return base.GetOwnerName(type, extensions, out isSet);
+		}
+
+		#endregion
+
+		#region GetTableName
+
+		public override string GetTableName(Type type, ExtensionList extensions, out bool isSet)
+		{
+			foreach (var p in _list)
+			{
+				var value = p.GetTableName(type, extensions, out isSet);
+
+				if (isSet)
+					return value;
+			}
+
+			return base.GetTableName(type, extensions, out isSet);
+		}
+
+		#endregion
+
+		#region GetPrimaryKeyOrder
+
+		public override int GetPrimaryKeyOrder(Type type, TypeExtension typeExt, MemberAccessor member, out bool isSet)
+		{
+			foreach (var p in _list)
+			{
+				var value = p.GetPrimaryKeyOrder(type, typeExt, member, out isSet);
+
+				if (isSet)
+					return value;
+			}
+
+			return base.GetPrimaryKeyOrder(type, typeExt, member, out isSet);
+		}
+
+		#endregion
+
+        public override string GetSequenceName(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+        {
+            foreach (var p in _list)
+            {
+                var value = p.GetSequenceName(typeExtension, member, out isSet);
+
+                if (isSet)
+                    return value;
+            }
+
+            return base.GetSequenceName(typeExtension, member, out isSet);
+        }
+
+	    #region GetNonUpdatableFlag
+
+		public override NonUpdatableAttribute GetNonUpdatableAttribute(Type type, TypeExtension typeExt, MemberAccessor member, out bool isSet)
+		{
+			foreach (var p in _list)
+			{
+				var value = p.GetNonUpdatableAttribute(type, typeExt, member, out isSet);
+
+				if (isSet)
+					return value;
+			}
+
+			return base.GetNonUpdatableAttribute(type, typeExt, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetSqlIgnore
+
+		public override bool GetSqlIgnore(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+		{
+			foreach (var p in _list)
+			{
+				var ignore = p.GetSqlIgnore(typeExtension, member, out isSet);
+
+				if (isSet)
+					return ignore;
+			}
+
+			return base.GetSqlIgnore(typeExtension, member, out isSet);
+		}
+
+		#endregion
+
+		#region GetRelations
+
+		public override List<MapRelationBase> GetRelations(MappingSchema schema, ExtensionList typeExt, Type master, Type slave, out bool isSet)
+		{
+			foreach (var p in _list)
+			{
+				var relations = p.GetRelations(schema, typeExt, master, slave, out isSet);
+
+				if (isSet)
+					return relations;
+			}
+
+			return base.GetRelations(schema, typeExt, master, slave, out isSet);
+		}
+
+		#endregion
+
+		#region GetAssociation
+
+		public override Association GetAssociation(TypeExtension typeExtension, MemberAccessor member)
+		{
+			foreach (var p in _list)
+			{
+				var attr = p.GetAssociation(typeExtension, member);
+
+				if (attr != null)
+					return attr;
+			}
+
+			return base.GetAssociation(typeExtension, member);
+		}
+
+		#endregion
+
+		#region GetInheritanceMapping
+
+		public override InheritanceMappingAttribute[] GetInheritanceMapping(Type type, TypeExtension typeExtension)
+		{
+			foreach (var p in _list)
+			{
+				var attrs = p.GetInheritanceMapping(type, typeExtension);
+
+				if (attrs.Length > 0)
+					return attrs;
+			}
+
+			return base.GetInheritanceMapping(type, typeExtension);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/ObjectFactoryAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,27 @@
+using System;
+using System.Diagnostics.CodeAnalysis;
+
+namespace BLToolkit.Reflection
+{
+	[SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes")]
+	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface)]
+	public class ObjectFactoryAttribute : Attribute
+	{
+		public ObjectFactoryAttribute(Type type)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			_objectFactory = Activator.CreateInstance(type) as IObjectFactory;
+
+			if (_objectFactory == null)
+				throw new ArgumentException(
+					string.Format("Type '{0}' does not implement IObjectFactory interface.", type));
+		}
+
+		private readonly IObjectFactory _objectFactory;
+		public           IObjectFactory  ObjectFactory
+		{
+			get { return _objectFactory; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/TypeAccessor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1152 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Data.SqlTypes;
+using System.Diagnostics;
+using System.Diagnostics.CodeAnalysis;
+using System.IO;
+using System.Reflection;
+
+using BLToolkit.Common;
+#if !SILVERLIGHT && !DATA
+using BLToolkit.ComponentModel;
+using BLToolkit.EditableObjects;
+#endif
+using BLToolkit.Mapping;
+using BLToolkit.TypeBuilder;
+using BLToolkit.TypeBuilder.Builders;
+
+using JNotNull = JetBrains.Annotations.NotNullAttribute;
+
+namespace BLToolkit.Reflection
+{
+	public delegate object NullValueProvider(Type type);
+	public delegate bool   IsNullHandler    (object obj);
+
+	[DebuggerDisplay("Type = {Type}, OriginalType = {OriginalType}")]
+	public abstract class TypeAccessor : ICollection<MemberAccessor>
+#if !SILVERLIGHT && !DATA
+		, ITypeDescriptionProvider
+#endif
+	{
+		#region Protected Emit Helpers
+
+		protected MemberInfo GetMember(int memberType, string memberName)
+		{
+			const BindingFlags allInstaceMembers =
+				BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
+			MemberInfo mi;
+
+			switch (memberType)
+			{
+				case 1: mi = Type.GetField   (memberName, allInstaceMembers); break;
+				case 2:
+					mi =
+						Type.        GetProperty(memberName, allInstaceMembers) ??
+						OriginalType.GetProperty(memberName, allInstaceMembers);
+					break;
+				default:
+					throw new InvalidOperationException();
+			}
+
+			return mi;
+		}
+
+		protected void AddMember(MemberAccessor member)
+		{
+			if (member == null) throw new ArgumentNullException("member");
+
+			_members.Add(member);
+			_memberNames.Add(member.MemberInfo.Name, member);
+		}
+
+		#endregion
+
+		#region CreateInstance
+
+		[DebuggerStepThrough]
+		public virtual object CreateInstance()
+		{
+			throw new TypeBuilderException(string.Format(
+				"The '{0}' type must have public default or init constructor.",
+				OriginalType.Name));
+		}
+
+		[DebuggerStepThrough]
+		public virtual object CreateInstance(InitContext context)
+		{
+			return CreateInstance();
+		}
+
+		[DebuggerStepThrough]
+		public object CreateInstanceEx()
+		{
+			return _objectFactory != null?
+				_objectFactory.CreateInstance(this, null): CreateInstance((InitContext)null);
+		}
+
+		[DebuggerStepThrough]
+		public object CreateInstanceEx(InitContext context)
+		{
+			return _objectFactory != null? _objectFactory.CreateInstance(this, context): CreateInstance(context);
+		}
+
+		#endregion
+
+		#region ObjectFactory
+
+		private IObjectFactory _objectFactory;
+		public  IObjectFactory  ObjectFactory
+		{
+			get { return _objectFactory;  }
+			set { _objectFactory = value; }
+		}
+
+		#endregion
+
+		#region Copy & AreEqual
+
+		internal static object CopyInternal(object source, object dest, TypeAccessor ta)
+		{
+#if !SILVERLIGHT && !DATA
+			var isDirty        = false;
+			var sourceEditable = source as IMemberwiseEditable;
+			var destEditable   = dest   as IMemberwiseEditable;
+
+			if (sourceEditable != null && destEditable != null)
+			{
+				foreach (MemberAccessor ma in ta)
+				{
+					ma.CloneValue(source, dest);
+					if (sourceEditable.IsDirtyMember(null, ma.MemberInfo.Name, ref isDirty) && !isDirty)
+						destEditable.AcceptMemberChanges(null, ma.MemberInfo.Name);
+				}
+			}
+			else
+#endif
+			{
+				foreach (MemberAccessor ma in ta)
+					ma.CloneValue(source, dest);
+			}
+
+			return dest;
+		}
+
+		public static object Copy(object source, object dest)
+		{
+			if (source == null) throw new ArgumentNullException("source");
+			if (dest   == null) throw new ArgumentNullException("dest");
+
+			TypeAccessor ta;
+
+			var sType = source.GetType();
+			var dType = dest.  GetType();
+
+			if      (TypeHelper.IsSameOrParent(sType, dType)) ta = GetAccessor(sType);
+			else if (TypeHelper.IsSameOrParent(dType, sType)) ta = GetAccessor(dType);
+			else
+				throw new ArgumentException();
+
+			return CopyInternal(source, dest, ta);
+		}
+
+		public static object Copy(object source)
+		{
+			if (source == null) throw new ArgumentNullException("source");
+
+			var ta = GetAccessor(source.GetType());
+
+			return CopyInternal(source, ta.CreateInstanceEx(), ta);
+		}
+
+		public static bool AreEqual(object obj1, object obj2)
+		{
+			if (ReferenceEquals(obj1, obj2))
+				return true;
+
+			if (obj1 == null || obj2 == null)
+				return false;
+
+			TypeAccessor ta;
+
+			var sType = obj1.GetType();
+			var dType = obj2.GetType();
+
+			if      (TypeHelper.IsSameOrParent(sType, dType)) ta = GetAccessor(sType);
+			else if (TypeHelper.IsSameOrParent(dType, sType)) ta = GetAccessor(dType);
+			else
+				return false;
+
+			foreach (MemberAccessor ma in ta)
+				if ((!Equals(ma.GetValue(obj1), ma.GetValue(obj2))))
+					return false;
+
+			return true;
+		}
+
+		public static int GetHashCode(object obj)
+		{
+			if (obj == null)
+				throw new ArgumentNullException("obj");
+
+			var    hash = 0;
+			object value;
+
+			foreach (MemberAccessor ma in GetAccessor(obj.GetType()))
+			{
+				value = ma.GetValue(obj);
+				hash = ((hash << 5) + hash) ^ (value == null ? 0 : value.GetHashCode());
+			}
+
+			return hash;
+		}
+
+		#endregion
+
+		#region Abstract Members
+
+		public abstract Type Type         { get; }
+		public abstract Type OriginalType { get; }
+
+		#endregion
+
+		#region Items
+
+		private readonly List<MemberAccessor>              _members     = new List<MemberAccessor>();
+		private readonly Dictionary<string,MemberAccessor> _memberNames = new Dictionary<string,MemberAccessor>();
+
+		public MemberAccessor this[string memberName]
+		{
+			get
+			{
+				MemberAccessor ma;
+				return _memberNames.TryGetValue(memberName, out ma) ? ma : null;
+			}
+		}
+
+		public MemberAccessor this[int index]
+		{
+			get { return _members[index]; }
+		}
+
+		public MemberAccessor this[NameOrIndexParameter nameOrIndex]
+		{
+			get
+			{
+				return nameOrIndex.ByName ? _memberNames[nameOrIndex.Name] : _members[nameOrIndex.Index];
+			}
+		}
+
+		#endregion
+
+		#region Static Members
+
+		[Obsolete("Use TypeFactory.LoadTypes instead")]
+		public static bool LoadTypes
+		{
+			get { return TypeFactory.LoadTypes;  }
+			set { TypeFactory.LoadTypes = value; }
+		}
+
+		private static readonly Dictionary<Type,TypeAccessor> _accessors = new Dictionary<Type,TypeAccessor>(10);
+
+		public static TypeAccessor GetAccessor(Type originalType)
+		{
+			if (originalType == null) throw new ArgumentNullException("originalType");
+
+			lock (_accessors)
+			{
+				TypeAccessor accessor;
+
+				if (_accessors.TryGetValue(originalType, out accessor))
+					return accessor;
+
+				if (IsAssociatedType(originalType))
+					return _accessors[originalType];
+
+				var instanceType = (IsClassBulderNeeded(originalType) ? null : originalType) ?? TypeFactory.GetType(originalType);
+
+				var accessorType = TypeFactory.GetType(originalType, originalType, new TypeAccessorBuilder(instanceType, originalType));
+
+				accessor = (TypeAccessor)Activator.CreateInstance(accessorType);
+
+				_accessors.Add(originalType, accessor);
+
+				if (originalType != instanceType)
+					_accessors.Add(instanceType, accessor);
+
+				return accessor;
+			}
+		}
+
+		public static TypeAccessor GetAccessor([JNotNull] object obj)
+		{
+			if (obj == null) throw new ArgumentNullException("obj");
+			return GetAccessor(obj.GetType());
+		}
+
+		public static TypeAccessor GetAccessor<T>()
+		{
+			return TypeAccessor<T>.Instance;
+		}
+
+		private static bool IsClassBulderNeeded(Type type)
+		{
+			if (type.IsAbstract && !type.IsSealed)
+			{
+				if (!type.IsInterface)
+				{
+					if (TypeHelper.GetDefaultConstructor(type) != null)
+						return true;
+
+					if (TypeHelper.GetConstructor(type, typeof(InitContext)) != null)
+						return true;
+				}
+				else
+				{
+					var attrs = TypeHelper.GetAttributes(type, typeof(AutoImplementInterfaceAttribute));
+
+					if (attrs != null && attrs.Length > 0)
+						return true;
+				}
+			}
+
+			return false;
+		}
+
+		internal static bool IsInstanceBuildable(Type type)
+		{
+			if (!type.IsInterface)
+				return true;
+
+			lock (_accessors)
+			{
+				if (_accessors.ContainsKey(type))
+					return true;
+
+				if (IsAssociatedType(type))
+					return true;
+			}
+
+			var attrs = TypeHelper.GetAttributes(type, typeof(AutoImplementInterfaceAttribute));
+
+			return attrs != null && attrs.Length > 0;
+		}
+
+		private static bool IsAssociatedType(Type type)
+		{
+			if (AssociatedTypeHandler != null)
+			{
+				var child = AssociatedTypeHandler(type);
+
+				if (child != null)
+				{
+					AssociateType(type, child);
+					return true;
+				}
+			}
+
+			return false;
+		}
+
+		public static object CreateInstance(Type type)
+		{
+			return GetAccessor(type).CreateInstance();
+		}
+
+		public static object CreateInstance(Type type, InitContext context)
+		{
+			return GetAccessor(type).CreateInstance(context);
+		}
+
+		public static object CreateInstanceEx(Type type)
+		{
+			return GetAccessor(type).CreateInstanceEx();
+		}
+
+		public static object CreateInstanceEx(Type type, InitContext context)
+		{
+			return GetAccessor(type).CreateInstance(context);
+		}
+
+		public static T CreateInstance<T>()
+		{
+			return TypeAccessor<T>.CreateInstance();
+		}
+
+		public static T CreateInstance<T>(InitContext context)
+		{
+			return TypeAccessor<T>.CreateInstance(context);
+		}
+
+		public static T CreateInstanceEx<T>()
+		{
+			return TypeAccessor<T>.CreateInstanceEx();
+		}
+
+		public static T CreateInstanceEx<T>(InitContext context)
+		{
+			return TypeAccessor<T>.CreateInstance(context);
+		}
+
+		public static TypeAccessor AssociateType(Type parent, Type child)
+		{
+			if (!TypeHelper.IsSameOrParent(parent, child))
+				throw new ArgumentException(
+					string.Format("'{0}' must be a base type of '{1}'", parent, child),
+					"child");
+
+			var accessor = GetAccessor(child);
+
+			accessor = (TypeAccessor)Activator.CreateInstance(accessor.GetType());
+
+			lock (_accessors)
+				_accessors.Add(parent, accessor);
+
+			return accessor;
+		}
+
+		public delegate Type GetAssociatedType(Type parent);
+		public static event GetAssociatedType AssociatedTypeHandler;
+
+		#endregion
+
+		#region GetNullValue
+
+		private static NullValueProvider _getNullValue = GetNullInternal;
+		public  static NullValueProvider  GetNullValue
+		{
+			get { return _getNullValue ?? (_getNullValue = GetNullInternal);}
+			set { _getNullValue = value; }
+		}
+
+		private static object GetNullInternal(Type type)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			if (type.IsValueType)
+			{
+				if (type.IsEnum)
+					return GetEnumNullValue(type);
+
+				if (type.IsPrimitive)
+				{
+					if (type == typeof(Int32))          return Common.Configuration.NullableValues.Int32;
+					if (type == typeof(Double))         return Common.Configuration.NullableValues.Double;
+					if (type == typeof(Int16))          return Common.Configuration.NullableValues.Int16;
+					if (type == typeof(Boolean))        return Common.Configuration.NullableValues.Boolean;
+					if (type == typeof(SByte))          return Common.Configuration.NullableValues.SByte;
+					if (type == typeof(Int64))          return Common.Configuration.NullableValues.Int64;
+					if (type == typeof(Byte))           return Common.Configuration.NullableValues.Byte;
+					if (type == typeof(UInt16))         return Common.Configuration.NullableValues.UInt16;
+					if (type == typeof(UInt32))         return Common.Configuration.NullableValues.UInt32;
+					if (type == typeof(UInt64))         return Common.Configuration.NullableValues.UInt64;
+					if (type == typeof(Single))         return Common.Configuration.NullableValues.Single;
+					if (type == typeof(Char))           return Common.Configuration.NullableValues.Char;
+				}
+				else
+				{
+					if (type == typeof(DateTime))       return Common.Configuration.NullableValues.DateTime;
+					if (type == typeof(DateTimeOffset)) return Common.Configuration.NullableValues.DateTimeOffset;
+					if (type == typeof(Decimal))        return Common.Configuration.NullableValues.Decimal;
+					if (type == typeof(Guid))           return Common.Configuration.NullableValues.Guid;
+
+#if !SILVERLIGHT
+
+					if (type == typeof(SqlInt32))       return SqlInt32.   Null;
+					if (type == typeof(SqlString))      return SqlString.  Null;
+					if (type == typeof(SqlBoolean))     return SqlBoolean. Null;
+					if (type == typeof(SqlByte))        return SqlByte.    Null;
+					if (type == typeof(SqlDateTime))    return SqlDateTime.Null;
+					if (type == typeof(SqlDecimal))     return SqlDecimal. Null;
+					if (type == typeof(SqlDouble))      return SqlDouble.  Null;
+					if (type == typeof(SqlGuid))        return SqlGuid.    Null;
+					if (type == typeof(SqlInt16))       return SqlInt16.   Null;
+					if (type == typeof(SqlInt64))       return SqlInt64.   Null;
+					if (type == typeof(SqlMoney))       return SqlMoney.   Null;
+					if (type == typeof(SqlSingle))      return SqlSingle.  Null;
+					if (type == typeof(SqlBinary))      return SqlBinary.  Null;
+
+#endif
+				}
+			}
+			else
+			{
+				if (type == typeof(String)) return Common.Configuration.NullableValues.String;
+				if (type == typeof(DBNull)) return DBNull.Value;
+				if (type == typeof(Stream)) return Stream.Null;
+#if !SILVERLIGHT
+				if (type == typeof(SqlXml)) return SqlXml.Null;
+#endif
+			}
+
+			return null;
+		}
+
+		const FieldAttributes EnumField = FieldAttributes.Public | FieldAttributes.Static | FieldAttributes.Literal;
+
+		static readonly Dictionary<Type,object> _nullValues = new Dictionary<Type,object>();
+
+		static object GetEnumNullValue(Type type)
+		{
+			object nullValue;
+
+			lock (_nullValues)
+				if (_nullValues.TryGetValue(type, out nullValue))
+					return nullValue;
+
+			var fields = type.GetFields();
+
+			foreach (var fi in fields)
+			{
+				if ((fi.Attributes & EnumField) == EnumField)
+				{
+					var attrs = Attribute.GetCustomAttributes(fi, typeof(NullValueAttribute));
+
+					if (attrs.Length > 0)
+					{
+						nullValue = Enum.Parse(type, fi.Name, false);
+						break;
+					}
+				}
+			}
+
+			lock (_nullValues)
+				if (!_nullValues.ContainsKey(type))
+					_nullValues.Add(type, nullValue);
+
+			return nullValue;
+		}
+
+		private static IsNullHandler _isNull = IsNullInternal;
+		public  static IsNullHandler  IsNull
+		{
+			get { return _isNull ?? (_isNull = IsNullInternal); }
+			set { _isNull = value; }
+		}
+
+		private static bool IsNullInternal(object value)
+		{
+			if (value == null)
+				return true;
+
+			var nullValue = GetNullValue(value.GetType());
+
+			return nullValue != null && value.Equals(nullValue);
+		}
+
+		#endregion
+
+		#region ICollection Members
+
+		void ICollection<MemberAccessor>.Add(MemberAccessor item)
+		{
+			_members.Add(item);
+		}
+
+		void ICollection<MemberAccessor>.Clear()
+		{
+			_members.Clear();
+		}
+
+		bool ICollection<MemberAccessor>.Contains(MemberAccessor item)
+		{
+			return _members.Contains(item);
+		}
+
+		void ICollection<MemberAccessor>.CopyTo(MemberAccessor[] array, int arrayIndex)
+		{
+			_members.CopyTo(array, arrayIndex);
+		}
+
+		bool ICollection<MemberAccessor>.Remove(MemberAccessor item)
+		{
+			return _members.Remove(item);
+		}
+
+		public int Count
+		{
+			get { return _members.Count; }
+		}
+
+		bool ICollection<MemberAccessor>.IsReadOnly
+		{
+			get { return ((ICollection<MemberAccessor>)_members).IsReadOnly; }
+		}
+
+		public int IndexOf(MemberAccessor ma)
+		{
+			return _members.IndexOf(ma);
+		}
+
+		#endregion
+
+		#region IEnumerable Members
+
+		public IEnumerator GetEnumerator()
+		{
+			return _members.GetEnumerator();
+		}
+
+		#endregion
+
+		#region IEnumerable<MemberAccessor> Members
+
+		IEnumerator<MemberAccessor> IEnumerable<MemberAccessor>.GetEnumerator()
+		{
+			foreach (MemberAccessor member in _members)
+				yield return member;
+		}
+
+		#endregion
+
+		#region Write Object Info
+
+		public static void WriteDebug(object o)
+		{
+#if DEBUG
+			Write(o, DebugWriteLine);
+#endif
+		}
+
+		private static void DebugWriteLine(string text)
+		{
+			Debug.WriteLine(text);
+		}
+
+		public static void WriteConsole(object o)
+		{
+			Write(o, Console.WriteLine);
+		}
+
+		[SuppressMessage("Microsoft.Performance", "CA1818:DoNotConcatenateStringsInsideLoops")]
+		private static string MapTypeName(Type type)
+		{
+			if (type.IsGenericType)
+			{
+				if (type.GetGenericTypeDefinition() == typeof(Nullable<>))
+					return string.Format("{0}?", MapTypeName(Nullable.GetUnderlyingType(type)));
+
+				var name = type.Name;
+				var idx  = name.IndexOf('`');
+
+				if (idx >= 0)
+					name = name.Substring(0, idx);
+
+				name += "<";
+
+				foreach (var t in type.GetGenericArguments())
+					name += MapTypeName(t) + ',';
+
+				if (name[name.Length - 1] == ',')
+					name = name.Substring(0, name.Length - 1);
+
+				name += ">";
+
+				return name;
+			}
+
+			if (type.IsPrimitive ||
+				type == typeof(string) ||
+				type == typeof(object) ||
+				type == typeof(decimal))
+			{
+				if (type == typeof(int))    return "int";
+				if (type == typeof(bool))   return "bool";
+				if (type == typeof(short))  return "short";
+				if (type == typeof(long))   return "long";
+				if (type == typeof(ushort)) return "ushort";
+				if (type == typeof(uint))   return "uint";
+				if (type == typeof(ulong))  return "ulong";
+				if (type == typeof(float))  return "float";
+
+				return type.Name.ToLower();
+			}
+
+			return type.Name;
+		}
+
+		public delegate void WriteLine(string text);
+
+		[SuppressMessage("Microsoft.Usage", "CA2241:ProvideCorrectArgumentsToFormattingMethods")]
+		public static void Write(object o, WriteLine writeLine)
+		{
+			if (o == null)
+			{
+				writeLine("*** (null) ***");
+				return;
+			}
+
+			MemberAccessor ma;
+
+			var ta      = GetAccessor(o.GetType());
+			var nameLen = 0;
+			var typeLen = 0;
+
+			foreach (var de in ta._memberNames)
+			{
+				if (nameLen < de.Key.Length)
+					nameLen = de.Key.Length;
+
+				ma = de.Value;
+
+				if (typeLen < MapTypeName(ma.Type).Length)
+					typeLen = MapTypeName(ma.Type).Length;
+			}
+
+			var text = "*** " + o.GetType().FullName + ": ***";
+
+			writeLine(text);
+
+			var format = string.Format("{{0,-{0}}} {{1,-{1}}} : {{2}}", typeLen, nameLen);
+
+			foreach (var de in ta._memberNames)
+			{
+				ma = de.Value;
+
+				var value = ma.GetValue(o);
+
+				if (value == null)
+					value = "(null)";
+				else if (value is ICollection)
+					value = string.Format("(Count = {0})", ((ICollection)value).Count);
+
+				text = string.Format(format, MapTypeName(ma.Type), de.Key, value);
+
+				writeLine(text);
+			}
+
+			writeLine("***");
+		}
+
+		#endregion
+
+		#region TypeDescriptor
+
+#if !SILVERLIGHT && !DATA
+
+		#region CustomTypeDescriptor
+
+		private static readonly Hashtable _descriptors = new Hashtable();
+
+		public static ICustomTypeDescriptor GetCustomTypeDescriptor(Type type)
+		{
+			var descriptor = (ICustomTypeDescriptor)_descriptors[type];
+
+			if (descriptor == null)
+			{
+				lock (_descriptors.SyncRoot)
+				{
+					descriptor = (ICustomTypeDescriptor)_descriptors[type];
+					
+					if (descriptor == null)
+					{
+						descriptor = new CustomTypeDescriptorImpl(type);
+						
+						_descriptors.Add(type, descriptor);
+					}
+				}
+			}
+			return descriptor;
+		}
+
+		private ICustomTypeDescriptor _customTypeDescriptor;
+		public  ICustomTypeDescriptor  CustomTypeDescriptor
+		{
+			get { return _customTypeDescriptor ?? (_customTypeDescriptor = GetCustomTypeDescriptor(OriginalType)); }
+		}
+
+		#endregion
+
+		#region Property Descriptors
+
+		private PropertyDescriptorCollection _propertyDescriptors;
+		public  PropertyDescriptorCollection  PropertyDescriptors
+		{
+			get
+			{
+				if (_propertyDescriptors == null)
+				{
+					if (TypeHelper.IsSameOrParent(typeof(ICustomTypeDescriptor), OriginalType))
+					{
+						var descriptor = CreateInstance() as ICustomTypeDescriptor;
+
+						if (descriptor != null)
+							_propertyDescriptors = descriptor.GetProperties();
+					}
+
+					if (_propertyDescriptors == null)
+						_propertyDescriptors = CreatePropertyDescriptors();
+				}
+
+				return _propertyDescriptors;
+			}
+		}
+
+		public PropertyDescriptorCollection CreatePropertyDescriptors()
+		{
+			if (Data.DbManager.TraceSwitch.TraceInfo)
+				Data.DbManager.WriteTraceLine(OriginalType.FullName, "CreatePropertyDescriptors");
+
+			var pd = new PropertyDescriptor[Count];
+
+			var i = 0;
+			foreach (MemberAccessor ma in _members)
+				pd[i++] = ma.PropertyDescriptor;
+
+			return new PropertyDescriptorCollection(pd);
+		}
+
+		public PropertyDescriptorCollection CreateExtendedPropertyDescriptors(
+			Type          objectViewType,
+			IsNullHandler isNull)
+		{
+			// This is definitely wrong.
+			//
+			//if (isNull == null)
+			//	isNull = _isNull;
+
+			var pdc = CreatePropertyDescriptors();
+
+			if (objectViewType != null)
+			{
+				var viewAccessor = GetAccessor(objectViewType);
+				var objectView   = (IObjectView)viewAccessor.CreateInstanceEx();
+				var list         = new List<PropertyDescriptor>();
+
+				var viewpdc = viewAccessor.PropertyDescriptors;
+
+				foreach (PropertyDescriptor pd in viewpdc)
+					list.Add(new ObjectViewPropertyDescriptor(pd, objectView));
+
+				foreach (PropertyDescriptor pd in pdc)
+					if (viewpdc.Find(pd.Name, false) == null)
+						list.Add(pd);
+
+				pdc = new PropertyDescriptorCollection(list.ToArray());
+			}
+
+			pdc = pdc.Sort(new PropertyDescriptorComparer());
+
+			pdc = GetExtendedProperties(pdc, OriginalType, String.Empty, Type.EmptyTypes, new PropertyDescriptor[0], isNull);
+
+			return pdc;
+		}
+
+		private static PropertyDescriptorCollection GetExtendedProperties(
+			PropertyDescriptorCollection pdc,
+			Type                         itemType,
+			string                       propertyPrefix,
+			Type[]                       parentTypes,
+			PropertyDescriptor[]         parentAccessors,
+			IsNullHandler                isNull)
+		{
+			var list      = new ArrayList(pdc.Count);
+			var objects   = new ArrayList();
+			var isDataRow = itemType.IsSubclassOf(typeof(DataRow));
+
+			foreach (PropertyDescriptor p in pdc)
+			{
+				var propertyType = p.PropertyType;
+
+				if (p.Attributes.Matches(BindableAttribute.No) ||
+					//propertyType == typeof(Type)               ||
+					isDataRow && p.Name == "ItemArray")
+					continue;
+
+				var isList           = false;
+				var explicitlyBound  = p.Attributes.Contains(BindableAttribute.Yes);
+				var pd               = p;
+
+				if (propertyType.GetInterface("IList") != null)
+				{
+					//if (!explicitlyBound)
+					//	continue;
+
+					isList = true;
+					pd     = new ListPropertyDescriptor(pd);
+				}
+
+				if (!isList                   &&
+					!propertyType.IsValueType &&
+					!propertyType.IsArray     &&
+					(!propertyType.FullName.StartsWith("System.") || explicitlyBound
+					|| propertyType.IsGenericType) &&
+					 propertyType != typeof(Type)   &&
+					 propertyType != typeof(string) &&
+					 propertyType != typeof(object) &&
+					Array.IndexOf(parentTypes, propertyType) == -1)
+				{
+					var childParentTypes = new Type[parentTypes.Length + 1];
+
+					parentTypes.CopyTo(childParentTypes, 0);
+					childParentTypes[parentTypes.Length] = itemType;
+
+					var childParentAccessors = new PropertyDescriptor[parentAccessors.Length + 1];
+
+					parentAccessors.CopyTo(childParentAccessors, 0);
+					childParentAccessors[parentAccessors.Length] = pd;
+
+					var pdch = GetAccessor(propertyType).PropertyDescriptors;
+
+					pdch = pdch.Sort(new PropertyDescriptorComparer());
+					pdch = GetExtendedProperties(
+						pdch,
+						propertyType,
+						propertyPrefix + pd.Name + "+",
+						childParentTypes,
+						childParentAccessors,
+						isNull);
+
+					objects.AddRange(pdch);
+				}
+				else
+				{
+					if (propertyPrefix.Length != 0 || isNull != null)
+						pd = new StandardPropertyDescriptor(pd, propertyPrefix, parentAccessors, isNull);
+
+					list.Add(pd);
+				}
+			}
+
+			list.AddRange(objects);
+
+			return new PropertyDescriptorCollection(
+				(PropertyDescriptor[])list.ToArray(typeof(PropertyDescriptor)));
+		}
+
+		#region PropertyDescriptorComparer
+
+		class PropertyDescriptorComparer : IComparer
+		{
+			public int Compare(object x, object y)
+			{
+				return String.Compare(((PropertyDescriptor)x).Name, ((PropertyDescriptor)y).Name);
+			}
+		}
+
+		#endregion
+
+		#region ListPropertyDescriptor
+
+		class ListPropertyDescriptor : PropertyDescriptorWrapper
+		{
+			public ListPropertyDescriptor(PropertyDescriptor descriptor)
+				: base(descriptor)
+			{
+			}
+
+			public override object GetValue(object component)
+			{
+				var value = base.GetValue(component);
+
+				if (value == null)
+					return value;
+
+				if (value is IBindingList && value is ITypedList)
+					return value;
+
+				return EditableArrayList.Adapter((IList)value);
+			}
+		}
+
+		#endregion
+
+		#region StandardPropertyDescriptor
+
+		class StandardPropertyDescriptor : PropertyDescriptorWrapper
+		{
+			protected readonly PropertyDescriptor   _descriptor;
+			protected readonly IsNullHandler        _isNull;
+
+			protected readonly string               _prefixedName;
+			protected readonly PropertyDescriptor[] _chainAccessors;
+
+			public StandardPropertyDescriptor(
+				PropertyDescriptor   pd,
+				string               namePrefix,
+				PropertyDescriptor[] chainAccessors,
+				IsNullHandler        isNull)
+				: base(pd)
+			{
+				_descriptor     = pd;
+				_isNull         = isNull;
+				_prefixedName   = namePrefix + pd.Name;
+				_chainAccessors = chainAccessors;
+			}
+
+			protected object GetNestedComponent(object component)
+			{
+				for (var i = 0;
+					i < _chainAccessors.Length && component != null && !(component is DBNull);
+					i++)
+				{
+					component = _chainAccessors[i].GetValue(component);
+				}
+
+				return component;
+			}
+
+			public override void SetValue(object component, object value)
+			{
+				component = GetNestedComponent(component);
+
+				if (component != null && !(component is DBNull))
+					_descriptor.SetValue(component, value);
+			}
+
+			public override object GetValue(object component)
+			{
+				component = GetNestedComponent(component);
+
+				return CheckNull(
+					component != null && !(component is DBNull)? _descriptor.GetValue(component): null);
+			}
+
+			public override string Name
+			{
+				get { return _prefixedName; }
+			}
+
+			protected object CheckNull(object value)
+			{
+				if (_isNull != null && _isNull(value))
+				{
+					switch (Common.Configuration.CheckNullReturnIfNull)
+					{
+						case Common.Configuration.NullEquivalent.DBNull:
+							return DBNull.Value;
+						case Common.Configuration.NullEquivalent.Null:
+							return null;
+						case Common.Configuration.NullEquivalent.Value:
+							return value;
+					}
+
+					return DBNull.Value;
+				}
+
+				return value;
+			}
+		}
+
+		#endregion
+
+		#region objectViewPropertyDescriptor
+
+		class ObjectViewPropertyDescriptor : PropertyDescriptorWrapper
+		{
+			public ObjectViewPropertyDescriptor(PropertyDescriptor pd, IObjectView objectView)
+				: base(pd)
+			{
+				_objectView = objectView;
+			}
+
+			private readonly IObjectView _objectView;
+
+			public override object GetValue(object component)
+			{
+				_objectView.Object = component;
+
+				return base.GetValue(_objectView);
+			}
+
+			public override void SetValue(object component, object value)
+			{
+				_objectView.Object = component;
+
+				base.SetValue(_objectView, value);
+			}
+		}
+
+		#endregion
+
+		#endregion
+
+		#region ITypeDescriptionProvider Members
+
+		string ITypeDescriptionProvider.ClassName
+		{
+			get { return OriginalType.Name; }
+		}
+
+		string ITypeDescriptionProvider.ComponentName
+		{
+			get { return OriginalType.Name; }
+		}
+
+		EventDescriptor ITypeDescriptionProvider.GetEvent(string name)
+		{
+			return new CustomEventDescriptor(OriginalType.GetEvent(name));
+		}
+
+		PropertyDescriptor ITypeDescriptionProvider.GetProperty(string name)
+		{
+			var ma = this[name];
+			return ma != null ? ma.PropertyDescriptor : null;
+		}
+
+		AttributeCollection ITypeDescriptionProvider.GetAttributes()
+		{
+			var attributesAsObj = new TypeHelper(OriginalType).GetAttributes();
+			var attributes      = new Attribute[attributesAsObj.Length];
+
+			for (var i = 0; i < attributesAsObj.Length; i++)
+				attributes[i] = attributesAsObj[i] as Attribute;
+
+			return new AttributeCollection(attributes);
+		}
+
+		EventDescriptorCollection ITypeDescriptionProvider.GetEvents()
+		{
+			var ei = OriginalType.GetEvents();
+			var ed = new EventDescriptor[ei.Length];
+
+			for (var i = 0; i < ei.Length; i++)
+				ed[i] = new CustomEventDescriptor(ei[i]);
+
+			return new EventDescriptorCollection(ed);
+		}
+
+		PropertyDescriptorCollection ITypeDescriptionProvider.GetProperties()
+		{
+			return CreatePropertyDescriptors();
+		}
+
+		#region CustomEventDescriptor
+
+		class CustomEventDescriptor : EventDescriptor
+		{
+			public CustomEventDescriptor(EventInfo eventInfo)
+				: base(eventInfo.Name, null)
+			{
+				_eventInfo = eventInfo;
+			}
+
+			private readonly EventInfo _eventInfo;
+
+			public override void AddEventHandler(object component, Delegate value)
+			{
+				_eventInfo.AddEventHandler(component, value);
+			}
+
+			public override void RemoveEventHandler(object component, Delegate value)
+			{
+				_eventInfo.RemoveEventHandler(component, value);
+			}
+
+			public override Type ComponentType { get { return _eventInfo.DeclaringType;    } }
+			public override Type EventType     { get { return _eventInfo.EventHandlerType; } }
+			public override bool IsMulticast   { get { return _eventInfo.IsMulticast;      } }
+		}
+
+		#endregion
+
+		#endregion
+
+#endif
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/TypeAccessorT.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,103 @@
+using System;
+
+namespace BLToolkit.Reflection
+{
+	public static class TypeAccessor<T>
+	{
+		#region CreateInstance
+
+		[System.Diagnostics.DebuggerStepThrough]
+		public static T CreateInstance()
+		{
+			return (T)_instance.CreateInstance();
+		}
+
+		[System.Diagnostics.DebuggerStepThrough]
+		public static T CreateInstance(InitContext context)
+		{
+			return (T)_instance.CreateInstance(context);
+		}
+
+		[System.Diagnostics.DebuggerStepThrough]
+		public static T CreateInstanceEx()
+		{
+			return (T)_instance.CreateInstanceEx();
+		}
+
+		[System.Diagnostics.DebuggerStepThrough]
+		public static T CreateInstanceEx(InitContext context)
+		{
+			return (T)_instance.CreateInstanceEx(context);
+		}
+
+		#endregion
+
+		#region Copy & AreEqual
+
+		public static T Copy(T source, T dest)
+		{
+			if (source == null) throw new ArgumentNullException("source");
+			if (dest   == null) throw new ArgumentNullException("dest");
+
+			return (T)TypeAccessor.CopyInternal(source, dest, _instance);
+		}
+
+		public static T Copy(T source)
+		{
+			if (source == null) return source;
+
+			return (T)TypeAccessor.CopyInternal(source, CreateInstanceEx(), _instance);
+		}
+
+		public static bool AreEqual(T obj1, T obj2)
+		{
+			if (ReferenceEquals(obj1, obj2))
+				return true;
+
+			if (obj1 == null || obj2 == null)
+				return false;
+
+			foreach (MemberAccessor ma in _instance)
+				if ((!Equals(ma.GetValue(obj1), ma.GetValue(obj2))))
+					return false;
+
+			return true;
+		}
+
+		#endregion
+
+		public static IObjectFactory ObjectFactory
+		{
+			get { return _instance.ObjectFactory;  }
+			set { _instance.ObjectFactory = value; }
+		}
+
+		public static Type Type         { get { return _instance.Type; } }
+		public static Type OriginalType { get { return _instance.OriginalType; } }
+
+		private static readonly TypeAccessor _instance;
+		public  static          TypeAccessor  Instance
+		{
+			[System.Diagnostics.DebuggerStepThrough]
+			get { return _instance; }
+		}
+
+		static TypeAccessor()
+		{
+			// Explicitly typed type constructor to prevent 'BeforeFieldInit' jit optimization.
+			// See http://blogs.msdn.com/davidnotario/archive/2005/02/08/369593.aspx for details.
+			//
+			// For us, this means that
+			//
+			// TypeFactory.SetGlobalAssembly();
+			// SomeObject o = TypeAccessor.CreateInstance<SomeObject>();
+			//
+			// May be executed in reverse order. Usually, there is no problem,
+			// but sometimes the order is important.
+			// See UnitTests\CS\TypeBuilder\InternalTypesTest.cs for an example.
+			//
+			_instance = TypeAccessor.GetAccessor(typeof(T));
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/TypeHelper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1692 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Diagnostics.CodeAnalysis;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Xml;
+
+#if !SILVERLIGHT
+using System.Xml.Linq;
+#endif
+
+namespace BLToolkit.Reflection
+{
+#if !SILVERLIGHT && !DATA
+	using EditableObjects;
+#endif
+	using DataAccess;
+	using TypeBuilder;
+
+	/// <summary>
+	/// A wrapper around the <see cref="Type"/> class.
+	/// </summary>
+	[System.Diagnostics.DebuggerDisplay("Type = {Type}")]
+	public class TypeHelper
+	{
+		/// <summary>
+		/// Initializes a new instance of the <see cref="TypeHelper"/> class.
+		/// </summary>
+		/// <param name="type">The Type to wrap.</param>
+		public TypeHelper(Type type)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			Type = type;
+		}
+
+		/// <summary>
+		/// Gets associated Type.
+		/// </summary>
+		public Type Type { get; private set; }
+
+		/// <summary>
+		/// Converts the supplied <see cref="Type"/> to a <see cref="TypeHelper"/>.
+		/// </summary>
+		/// <param name="type">The Type.</param>
+		/// <returns>A TypeHelper.</returns>
+		public static implicit operator TypeHelper(Type type)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			return new TypeHelper(type);
+		}
+
+		/// <summary>
+		/// Converts the supplied <see cref="TypeHelper"/> to a <see cref="Type"/>.
+		/// </summary>
+		/// <param name="typeHelper">The TypeHelper.</param>
+		/// <returns>A Type.</returns>
+		public static implicit operator Type(TypeHelper typeHelper)
+		{
+			if (typeHelper == null) throw new ArgumentNullException("typeHelper");
+
+			return typeHelper.Type;
+		}
+
+		#region GetAttributes
+
+		/// <summary>
+		/// Returns an array of custom attributes identified by <b>Type</b>.
+		/// </summary>
+		/// <param name="attributeType">The type of attribute to search for.
+		/// Only attributes that are assignable to this type are returned.</param>
+		/// <param name="inherit">Specifies whether to search this member's inheritance chain
+		/// to find the attributes.</param>
+		/// <returns>An array of custom attributes defined on this reflected member,
+		/// or an array with zero (0) elements if no attributes are defined.</returns>
+		public object[] GetCustomAttributes(Type attributeType, bool inherit)
+		{
+			return Type.GetCustomAttributes(attributeType, inherit);
+		}
+
+		/// <summary>
+		/// Returns an array of custom attributes identified by <b>Type</b>
+		/// including attribute's inheritance chain.
+		/// </summary>
+		/// <param name="attributeType">The type of attribute to search for.
+		/// Only attributes that are assignable to this type are returned.</param>
+		/// <returns>An array of custom attributes defined on this reflected member,
+		/// or an array with zero (0) elements if no attributes are defined.</returns>
+		public object[] GetCustomAttributes(Type attributeType)
+		{
+			return Type.GetCustomAttributes(attributeType, true);
+		}
+
+
+		/// <summary>
+		/// Returns an array of all of the custom attributes.
+		/// </summary>
+		/// <param name="inherit">Specifies whether to search this member's inheritance chain
+		/// to find the attributes.</param>
+		/// <returns>An array of custom attributes defined on this reflected member,
+		/// or an array with zero (0) elements if no attributes are defined.</returns>
+		public object[] GetCustomAttributes(bool inherit)
+		{
+			return Type.GetCustomAttributes(inherit);
+		}
+
+		/// <summary>
+		/// Returns an array of all of the custom attributes including attributes' inheritance chain.
+		/// </summary>
+		/// <returns>An array of custom attributes defined on this reflected member,
+		/// or an array with zero (0) elements if no attributes are defined.</returns>
+		public object[] GetCustomAttributes()
+		{
+			return Type.GetCustomAttributes(true);
+		}
+
+		/// <summary>
+		/// Returns an array of all custom attributes identified by <b>Type</b> including type's
+		/// inheritance chain.
+		/// </summary>
+		/// <param name="attributeType">The type of attribute to search for.
+		/// Only attributes that are assignable to this type are returned.</param>
+		/// <returns>An array of custom attributes defined on this reflected member,
+		/// or an array with zero (0) elements if no attributes are defined.</returns>
+		public object[] GetAttributes(Type attributeType)
+		{
+			return GetAttributes(Type, attributeType);
+		}
+
+		/// <summary>
+		/// Returns an array of all custom attributes including type's inheritance chain.
+		/// </summary>
+		/// <returns>An array of custom attributes defined on this reflected member,
+		/// or an array with zero (0) elements if no attributes are defined.</returns>
+		public object[] GetAttributes()
+		{
+			return GetAttributesInternal();
+		}
+
+		#region Attributes cache
+
+		object[] GetAttributesInternal()
+		{
+			lock (_typeAttributes)
+			{
+				var key = Type.FullName;
+
+				object[] attrs;
+
+				if (!_typeAttributes.TryGetValue(key, out attrs))
+				{
+					var list = new List<object>();
+
+					GetAttributesInternal(list, Type);
+
+					_typeAttributes.Add(key, attrs = list.ToArray());
+				}
+
+				return attrs;
+			}
+		}
+
+		static readonly Dictionary<Type,object[]> _typeAttributesTopInternal = new Dictionary<Type,object[]>(10);
+
+		static void GetAttributesInternal(List<object> list, Type type)
+		{
+			object[] attrs;
+
+			if (_typeAttributesTopInternal.TryGetValue(type, out attrs))
+				list.AddRange(attrs);
+			else
+			{
+				GetAttributesTreeInternal(list, type);
+				_typeAttributesTopInternal.Add(type, list.ToArray());
+			}
+		}
+
+		static readonly Dictionary<Type,object[]> _typeAttributesInternal = new Dictionary<Type,object[]>(10);
+
+		static void GetAttributesTreeInternal(List<object> list, Type type)
+		{
+			object[] attrs;
+
+			if (!_typeAttributesInternal.TryGetValue(type, out attrs))
+				_typeAttributesInternal.Add(type, attrs = type.GetCustomAttributes(false));
+
+			if (Common.Configuration.FilterOutBaseEqualAttributes)
+			{
+				foreach (var t in attrs)
+					if (!list.Contains(t))
+						list.Add(t);
+			}
+			else
+				list.AddRange(attrs);
+
+			if (type.IsInterface)
+				return;
+
+			// Reflection returns interfaces for the whole inheritance chain.
+			// So, we are going to get some hemorrhoid here to restore the inheritance sequence.
+			//
+			var interfaces      = type.GetInterfaces();
+			var nBaseInterfaces = type.BaseType != null? type.BaseType.GetInterfaces().Length: 0;
+
+			for (var i = 0; i < interfaces.Length; i++)
+			{
+				var intf = interfaces[i];
+
+				if (i < nBaseInterfaces)
+				{
+					var getAttr = false;
+
+					foreach (var mi in type.GetInterfaceMap(intf).TargetMethods)
+					{
+						// Check if the interface is reimplemented.
+						//
+						if (mi.DeclaringType == type)
+						{
+							getAttr = true;
+							break;
+						}
+					}
+
+					if (getAttr == false)
+						continue;
+				}
+
+				GetAttributesTreeInternal(list, intf);
+			}
+
+			if (type.BaseType != null && type.BaseType != typeof(object))
+				GetAttributesTreeInternal(list, type.BaseType);
+		}
+
+		static readonly Dictionary<string,object[]> _typeAttributes = new Dictionary<string, object[]>(10);
+
+		#endregion
+
+		/// <summary>
+		/// Returns an array of custom attributes applied to a type.
+		/// </summary>
+		/// <param name="type">A type instance.</param>
+		/// <param name="attributeType">The type of attribute to search for.
+		/// Only attributes that are assignable to this type are returned.</param>
+		/// <returns>An array of custom attributes applied to this type,
+		/// or an array with zero (0) elements if no attributes have been applied.</returns>
+		public static object[] GetAttributes(Type type, Type attributeType)
+		{
+			if (type          == null) throw new ArgumentNullException("type");
+			if (attributeType == null) throw new ArgumentNullException("attributeType");
+
+			lock (_typeAttributes)
+			{
+				var key   = type.FullName + "#" + attributeType.FullName;
+
+				object[] attrs;
+
+				if (!_typeAttributes.TryGetValue(key, out attrs))
+				{
+					var list = new List<object>();
+
+					GetAttributesInternal(list, type);
+
+					for (var i = 0; i < list.Count; i++)
+						if (attributeType.IsInstanceOfType(list[i]) == false)
+							list.RemoveAt(i--);
+
+					_typeAttributes.Add(key, attrs = list.ToArray());
+				}
+
+				return attrs;
+			}
+		}
+
+		/// <summary>
+		/// Retrieves a custom attribute applied to a type.
+		/// </summary>
+		/// <param name="type">A type instance.</param>
+		/// <param name="attributeType">The type of attribute to search for.
+		/// Only attributes that are assignable to this type are returned.</param>
+		/// <returns>A reference to the first custom attribute of type <paramref name="attributeType"/>
+		/// that is applied to element, or null if there is no such attribute.</returns>
+		public static Attribute GetFirstAttribute(Type type, Type attributeType)
+		{
+			var attrs = new TypeHelper(type).GetAttributes(attributeType);
+
+			return attrs.Length > 0? (Attribute)attrs[0]: null;
+		}
+
+		/// <summary>
+		/// Retrieves a custom attribute applied to a type.
+		/// </summary>
+		/// <param name="type">A type instance.</param>
+		/// <typeparam name="T">The type of attribute to search for.
+		/// Only attributes that are assignable to this type are returned.</param>
+		/// <returns>A reference to the first custom attribute of type attributeType
+		/// that is applied to element, or null if there is no such attribute.</returns>
+		public static T GetFirstAttribute<T>(Type type) where T : Attribute
+		{
+			var attrs = new TypeHelper(type).GetAttributes(typeof(T));
+
+			return attrs.Length > 0? (T)attrs[0]: null;
+		}
+
+		#endregion
+
+		#region Property Wrappers
+
+		/// <summary>
+		/// Gets the fully qualified name of the Type, including the namespace of the Type.
+		/// </summary>
+		public string FullName
+		{
+			get { return Type.FullName; }
+		}
+
+		/// <summary>
+		/// Gets the name of the Type.
+		/// </summary>
+		public string Name
+		{
+			get { return Type.Name; }
+		}
+
+		/// <summary>
+		/// Gets a value indicating whether the Type is abstract and must be overridden.
+		/// </summary>
+		public bool IsAbstract
+		{
+			get { return Type.IsAbstract; }
+		}
+
+		/// <summary>
+		/// Gets a value indicating whether the System.Type is an array.
+		/// </summary>
+		public bool IsArray
+		{
+			get { return Type.IsArray; }
+		}
+
+		/// <summary>
+		/// Gets a value indicating whether the Type is a value type.
+		/// </summary>
+		public bool IsValueType
+		{
+			get { return Type.IsValueType; }
+		}
+
+		/// <summary>
+		/// Gets a value indicating whether the Type is a class; that is, not a value type or interface.
+		/// </summary>
+		public bool IsClass
+		{
+			get { return Type.IsClass; }
+		}
+
+		/// <summary>
+		/// Gets a value indicating whether the System.Type is an interface; that is, not a class or a value type.
+		/// </summary>
+		public bool IsInterface
+		{
+			get { return Type.IsInterface; }
+		}
+
+		/// <summary>
+		/// Indicates whether the Type is serializable.
+		/// </summary>
+		public bool IsSerializable
+		{
+			get
+			{
+#if SILVERLIGHT
+				return false;
+#else
+				return Type.IsSerializable;
+#endif
+			}
+		}
+
+		#endregion
+
+		#region GetMethods
+
+		/// <summary>
+		/// Returns all the methods of the current Type.
+		/// </summary>
+		/// <returns>An array of <see cref="MethodInfo"/> objects representing all methods 
+		/// defined for the current Type.</returns>
+		public MethodInfo[] GetMethods()
+		{
+			return Type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
+		}
+
+		/// <summary>
+		/// Returns all the public methods of the current Type.
+		/// </summary>
+		/// <returns>An array of <see cref="MethodInfo"/> objects representing all the public methods 
+		/// defined for the current Type.</returns>
+		public MethodInfo[] GetPublicMethods()
+		{
+			return Type.GetMethods(BindingFlags.Instance | BindingFlags.Public);
+		}
+
+		/// <summary>
+		/// Searches for the methods defined for the current Type,
+		/// using the specified binding constraints.
+		/// </summary>
+		/// <param name="flags">A bitmask comprised of one or more <see cref="BindingFlags"/> 
+		/// that specify how the search is conducted.</param>
+		/// <returns>An array of <see cref="MethodInfo"/> objects representing all methods defined 
+		/// for the current Type that match the specified binding constraints.</returns>
+		public MethodInfo[] GetMethods(BindingFlags flags)
+		{
+			return Type.GetMethods(flags);
+		}
+
+		/// <summary>
+		/// Returns all the generic or non-generic methods of the current Type.
+		/// </summary>
+		/// <param name="generic">True to return all generic methods, false to return all non-generic.</param>
+		/// <returns>An array of <see cref="MethodInfo"/> objects representing all methods 
+		/// defined for the current Type.</returns>
+		public MethodInfo[] GetMethods(bool generic)
+		{
+			return GetMethods(Type, generic, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
+		}
+
+		/// <summary>
+		/// Returns all the public and non-generic methods of the current Type.
+		/// </summary>
+		/// <param name="generic">True to return all generic methods, false to return all non-generic.</param>
+		/// <returns>An array of <see cref="MethodInfo"/> objects representing all the public methods 
+		/// defined for the current Type.</returns>
+		public MethodInfo[] GetPublicMethods(bool generic)
+		{
+			return GetMethods(Type, generic, BindingFlags.Instance | BindingFlags.Public);
+		}
+
+		/// <summary>
+		/// Searches for the generic methods defined for the current Type,
+		/// using the specified binding constraints.
+		/// </summary>
+		/// <param name="generic">True to return all generic methods, false to return all non-generic.</param>
+		/// <param name="flags">A bitmask comprised of one or more <see cref="BindingFlags"/> 
+		/// that specify how the search is conducted.</param>
+		/// <returns>An array of <see cref="MethodInfo"/> objects representing all methods defined 
+		/// for the current Type that match the specified binding constraints.</returns>
+		public MethodInfo[] GetMethods(bool generic, BindingFlags flags)
+		{
+			return GetMethods(Type, generic, flags);
+		}
+
+		#endregion
+
+		#region GetMethod
+
+		/// <summary>
+		/// Searches for the specified instance method (public or non-public), using the specified name.
+		/// </summary>
+		/// <param name="methodName">The String containing the name of the method to get.</param>
+		/// <returns>A <see cref="MethodInfo"/> object representing the method
+		/// that matches the specified name, if found; otherwise, null.</returns>
+		public MethodInfo GetMethod(string methodName)
+		{
+			return Type.GetMethod(methodName,
+				BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
+		}
+
+		/// <summary>
+		/// Searches for the specified public instance method, using the specified name.
+		/// </summary>
+		/// <param name="methodName">The String containing the name of the method to get.</param>
+		/// <returns>A <see cref="MethodInfo"/> object representing the method
+		/// that matches the specified name, if found; otherwise, null.</returns>
+		public MethodInfo GetPublicMethod(string methodName)
+		{
+			return Type.GetMethod(methodName,
+				BindingFlags.Instance | BindingFlags.Public);
+		}
+
+		/// <summary>
+		/// Searches for the specified method, using the specified name and binding flags.
+		/// </summary>
+		/// <param name="methodName">The String containing the name of the method to get.</param>
+		/// <param name="flags">A bitmask comprised of one or more <see cref="BindingFlags"/> 
+		/// that specify how the search is conducted.</param>
+		/// <returns>A <see cref="MethodInfo"/> object representing the method
+		/// that matches the specified requirements, if found; otherwise, null.</returns>
+		public MethodInfo GetMethod(string methodName, BindingFlags flags)
+		{
+			return Type.GetMethod(methodName, flags);
+		}
+
+		/// <summary>
+		/// Searches for the specified public instance method, using the specified name.
+		/// </summary>
+		/// <param name="methodName">The String containing the name of the method to get.</param>
+		/// <param name="types">An array of <see cref="System.Type"/> objects representing
+		/// the number, order, and type of the parameters for the method to get.-or-
+		/// An empty array of the type <see cref="System.Type"/> (for example, <see cref="System.Type.EmptyTypes"/>)
+		/// to get a method that takes no parameters.</param>
+		/// <returns>A <see cref="MethodInfo"/> object representing the method
+		/// that matches the specified requirements, if found; otherwise, null.</returns>
+		public MethodInfo GetPublicMethod(string methodName, params Type[] types)
+		{
+			return Type.GetMethod(
+				methodName,
+				BindingFlags.Instance | BindingFlags.Public,
+				null,
+				types,
+				null);
+		}
+
+		/// <summary>
+		/// Searches for the specified instance method (public or non-public),
+		/// using the specified name and argument types.
+		/// </summary>
+		/// <param name="methodName">The String containing the name of the method to get.</param>
+		/// <param name="types">An array of <see cref="System.Type"/> objects representing
+		/// the number, order, and type of the parameters for the method to get.-or-
+		/// An empty array of the type <see cref="System.Type"/> (for example, <see cref="System.Type.EmptyTypes"/>)
+		/// to get a method that takes no parameters.</param>
+		/// <returns>A <see cref="MethodInfo"/> object representing the method
+		/// that matches the specified requirements, if found; otherwise, null.</returns>
+		public MethodInfo GetMethod(string methodName, params Type[] types)
+		{
+			return Type.GetMethod(
+				methodName,
+				BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
+				null,
+				types,
+				null);
+		}
+
+		/// <summary>
+		/// Searches for the specified method, using the specified name,
+		/// binding flags and argument types.
+		/// </summary>
+		/// <param name="methodName">The String containing the name of the method to get.</param>
+		/// <param name="types">An array of <see cref="System.Type"/> objects representing
+		/// the number, order, and type of the parameters for the method to get.-or-
+		/// An empty array of the type <see cref="System.Type"/> (for example, <see cref="System.Type.EmptyTypes"/>)
+		/// to get a method that takes no parameters.</param>
+		/// <param name="flags">A bitmask comprised of one or more <see cref="BindingFlags"/> 
+		/// that specify how the search is conducted.</param>
+		/// <returns>A <see cref="MethodInfo"/> object representing the method
+		/// that matches the specified requirements, if found; otherwise, null.</returns>
+		public MethodInfo GetMethod(string methodName, BindingFlags flags, params Type[] types)
+		{
+			return Type.GetMethod(methodName, flags, null, types, null);
+		}
+
+		/// <summary>
+		/// Searches for the specified instance method (public or non-public), using the specified name.
+		/// </summary>
+		/// <param name="methodName">The String containing the name of the method to get.</param>
+		/// <param name="generic">True to search only for a generic method, or
+		/// False to search only for non-generic method.</param>
+		/// <returns>A <see cref="MethodInfo"/> object representing the method
+		/// that matches the specified requirements, if found; otherwise, null.</returns>
+		public MethodInfo GetMethod(bool generic, string methodName)
+		{
+			return GetMethod(Type, generic, methodName,
+				BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
+		}
+
+		/// <summary>
+		/// Searches for the specified public instance method, using the specified name.
+		/// </summary>
+		/// <param name="methodName">The String containing the name of the method to get.</param>
+		/// <param name="generic">True to search only for a generic method, or
+		/// False to search only for non-generic method.</param>
+		/// <returns>A <see cref="MethodInfo"/> object representing the method
+		/// that matches the specified requirements, if found; otherwise, null.</returns>
+		public MethodInfo GetPublicMethod(bool generic, string methodName)
+		{
+			return GetMethod(Type, generic, methodName,
+				BindingFlags.Instance | BindingFlags.Public);
+		}
+
+		/// <summary>
+		/// Searches for the specified method, using the specified name and binding flags.
+		/// </summary>
+		/// <param name="methodName">The String containing the name of the method to get.</param>
+		/// <param name="generic">True to search only for a generic method, or
+		/// False to search only for non-generic method.</param>
+		/// <param name="flags">A bitmask comprised of one or more <see cref="BindingFlags"/> 
+		/// that specify how the search is conducted.</param>
+		/// <returns>A <see cref="MethodInfo"/> object representing the method
+		/// that matches the specified requirements, if found; otherwise, null.</returns>
+		public MethodInfo GetMethod(bool generic, string methodName, BindingFlags flags)
+		{
+			return GetMethod(Type, generic, methodName, flags);
+		}
+
+		/// <summary>
+		/// Searches for the specified public instance method, using the specified name and argument types.
+		/// </summary>
+		/// <param name="methodName">The String containing the name of the method to get.</param>
+		/// <param name="generic">True to search only for a generic method, or
+		/// False to search only for non-generic method.</param>
+		/// <param name="types">An array of <see cref="System.Type"/> objects representing
+		/// the number, order, and type of the parameters for the method to get.-or-
+		/// An empty array of the type <see cref="System.Type"/> (for example, <see cref="System.Type.EmptyTypes"/>)
+		/// to get a method that takes no parameters.</param>
+		/// <returns>A <see cref="MethodInfo"/> object representing the method
+		/// that matches the specified requirements, if found; otherwise, null.</returns>
+		public MethodInfo GetPublicMethod(bool generic, string methodName, params Type[] types)
+		{
+			return Type.GetMethod(methodName,
+				BindingFlags.Instance | BindingFlags.Public,
+				generic ? GenericBinder.Generic : GenericBinder.NonGeneric,
+				types, null);
+		}
+
+		/// <summary>
+		/// Searches for the specified instance method (public or non-public),
+		/// using the specified name and argument types.
+		/// </summary>
+		/// <param name="methodName">The String containing the name of the method to get.</param>
+		/// <param name="generic">True to search only for a generic method, or
+		/// False to search only for non-generic method.</param>
+		/// <param name="types">An array of <see cref="System.Type"/> objects representing
+		/// the number, order, and type of the parameters for the method to get.-or-
+		/// An empty array of the type <see cref="System.Type"/> (for example, <see cref="System.Type.EmptyTypes"/>)
+		/// to get a method that takes no parameters.</param>
+		/// <returns>A <see cref="MethodInfo"/> object representing the method
+		/// that matches the specified requirements, if found; otherwise, null.</returns>
+		public MethodInfo GetMethod(bool generic, string methodName, params Type[] types)
+		{
+			return Type.GetMethod(methodName,
+				BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
+				generic ? GenericBinder.Generic : GenericBinder.NonGeneric,
+				types, null);
+		}
+
+		/// <summary>
+		/// Searches for the specified method using the specified name, binding flags and argument types.
+		/// </summary>
+		/// <param name="methodName">The String containing the name of the method to get.</param>
+		/// <param name="generic">True to search only for a generic method, or
+		/// False to search only for non-generic method.</param>
+		/// <param name="types">An array of <see cref="System.Type"/> objects representing
+		/// the number, order, and type of the parameters for the method to get.-or-
+		/// An empty array of the type <see cref="System.Type"/> (for example, <see cref="System.Type.EmptyTypes"/>)
+		/// to get a method that takes no parameters.</param>
+		/// <param name="flags">A bitmask comprised of one or more <see cref="BindingFlags"/> 
+		/// that specify how the search is conducted.</param>
+		/// <returns>A <see cref="MethodInfo"/> object representing the method
+		/// that matches the specified requirements, if found; otherwise, null.</returns>
+		public MethodInfo GetMethod(bool generic, string methodName, BindingFlags flags, params Type[] types)
+		{
+			return Type.GetMethod(methodName,
+				flags,
+				generic ? GenericBinder.Generic : GenericBinder.NonGeneric,
+				types, null);
+		}
+
+		#endregion
+
+		#region GetFields
+
+		/// <summary>
+		/// Returns all the public fields of the current Type.
+		/// </summary>
+		/// <returns>An array of <see cref="FieldInfo"/> objects representing
+		/// all the public fields defined for the current Type.</returns>
+		public FieldInfo[] GetFields()
+		{
+			return Type.GetFields();
+		}
+
+		/// <summary>
+		/// Searches for the fields of the current Type, using the specified binding constraints.
+		/// </summary>
+		/// <param name="bindingFlags">A bitmask comprised of one or more <see cref="BindingFlags"/> 
+		/// that specify how the search is conducted.</param>
+		/// <returns>An array of <see cref="FieldInfo"/> objects representing
+		/// all fields of the current Type
+		/// that match the specified binding constraints.</returns>
+		public FieldInfo[] GetFields(BindingFlags bindingFlags)
+		{
+			return Type.GetFields(bindingFlags);
+		}
+
+		/// <summary>
+		/// Searches for the public field with the specified name.
+		/// </summary>
+		/// <param name="name">The String containing the name of the public field to get.</param>
+		/// <returns>A <see cref="PropertyInfo"/> object representing the public field with the specified name,
+		/// if found; otherwise, a null reference.</returns>
+		public FieldInfo GetField(string name)
+		{
+			return Type.GetField(
+				name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
+		}
+
+		#endregion
+
+		#region GetProperties
+
+		/// <summary>
+		/// Returns all the public properties of the current Type.
+		/// </summary>
+		/// <returns>An array of <see cref="PropertyInfo"/> objects representing
+		/// all public properties of the current Type.</returns>
+		public PropertyInfo[] GetProperties()
+		{
+			return Type.GetProperties();
+		}
+
+		/// <summary>
+		/// Searches for the properties of the current Type, using the specified binding constraints.
+		/// </summary>
+		/// <param name="bindingFlags">A bitmask comprised of one or more <see cref="BindingFlags"/> 
+		/// that specify how the search is conducted.</param>
+		/// <returns>An array of <see cref="PropertyInfo"/> objects representing
+		/// all properties of the current Type
+		/// that match the specified binding constraints.</returns>
+		public PropertyInfo[] GetProperties(BindingFlags bindingFlags)
+		{
+			return Type.GetProperties(bindingFlags);
+		}
+
+		/// <summary>
+		/// Searches for the public property with the specified name.
+		/// </summary>
+		/// <param name="name">The String containing the name of the public property to get.</param>
+		/// <returns>A <see cref="PropertyInfo"/> object representing the public property with the specified name,
+		/// if found; otherwise, a null reference.</returns>
+		public PropertyInfo GetProperty(string name)
+		{
+			return Type.GetProperty(
+				name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
+		}
+
+		#endregion
+
+		#region GetInterfaces
+
+		/*
+		private Type[] _interfaces;
+
+		/// <summary>
+		/// Gets all the interfaces implemented or inherited by the current <see cref="Type"/>.
+		/// </summary>
+		/// <returns>An array of Type objects representing all the interfaces implemented or
+		/// inherited by the current Type,
+		/// if found; otherwise, an empty array.</returns>
+		public Type[] GetInterfaces()
+		{
+			if (_interfaces == null)
+				_interfaces = _type.GetInterfaces();
+
+			return _interfaces;
+		}
+
+		/// <summary>
+		/// Gets a specific interface implemented or inherited by the current <see cref="Type"/>.
+		/// </summary>
+		/// <param name="interfaceType">The type of the interface to get.</param>
+		/// <returns>A Type object representing the interface of the specified type, if found;
+		///  otherwise, a null reference (Nothing in Visual Basic).</returns>
+		public Type GetInterface(Type interfaceType)
+		{
+			foreach (Type intf in GetInterfaces())
+				if (intf == interfaceType)
+					return null;
+
+			_type.IsSubclassOf(interfaceType);
+
+			return null;
+		}
+		*/
+
+		/// <summary>
+		/// Returns an interface mapping for the current <see cref="Type"/>.
+		/// </summary>
+		/// <param name="interfaceType">The <see cref="System.Type"/>
+		/// of the interface of which to retrieve a mapping.</param>
+		/// <returns>An <see cref="InterfaceMapping"/> object representing the interface
+		/// mapping for <paramref name="interfaceType"/>.</returns>
+		public InterfaceMapping GetInterfaceMap(Type interfaceType)
+		{
+			return Type.GetInterfaceMap(interfaceType);
+		}
+
+		#endregion
+
+		#region GetConstructor
+
+		/// <summary>
+		/// Searches for a public instance constructor whose parameters match
+		/// the types in the specified array.
+		/// </summary>
+		/// <param name="types">An array of Type objects representing the number,
+		/// order, and type of the parameters for the constructor to get.</param>
+		/// <returns>A <see cref="ConstructorInfo"/> object representing the
+		/// public instance constructor whose parameters match the types in
+		/// the parameter type array, if found; otherwise, a null reference.</returns>
+		public ConstructorInfo GetPublicConstructor(params Type[] types)
+		{
+			return Type.GetConstructor(types);
+		}
+
+		/// <summary>
+		/// Searches for an instance constructor (public or non-public) whose
+		/// parameters match the types in the specified array.
+		/// </summary>
+		/// <param name="parameterType">Type object representing type of the
+		/// parameter for the constructor to get.</param>
+		/// <returns>A <see cref="ConstructorInfo"/> object representing the constructor
+		///  whose parameters match the types in the parameter type array, if found;
+		/// otherwise, a null reference.</returns>
+		public ConstructorInfo GetConstructor(Type parameterType)
+		{
+			return GetConstructor(Type, parameterType);
+		}
+
+		/// <summary>
+		/// Searches for an instance constructor (public or non-public) whose
+		/// parameters match the types in the specified array.
+		/// </summary>
+		/// <param name="type">An instance of <see cref="System.Type"/> to search constructor for.</param>
+		/// <param name="types">An array of Type objects representing the number,
+		/// order, and type of the parameters for the constructor to get.</param>
+		/// <returns>A <see cref="ConstructorInfo"/> object representing the constructor
+		///  whose parameters match the types in the parameter type array, if found;
+		/// otherwise, a null reference.</returns>
+		public static ConstructorInfo GetConstructor(Type type, params Type[] types)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			return type.GetConstructor(
+				BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
+				null,
+				types,
+				null);
+		}
+
+		/// <summary>
+		/// Searches for a public default constructor.
+		/// </summary>
+		/// <returns>A <see cref="ConstructorInfo"/> object representing the constructor.</returns>
+		public ConstructorInfo GetPublicDefaultConstructor()
+		{
+			return Type.GetConstructor(Type.EmptyTypes);
+		}
+
+		/// <summary>
+		/// Searches for a default constructor.
+		/// </summary>
+		/// <returns>A <see cref="ConstructorInfo"/> object representing the constructor.</returns>
+		public ConstructorInfo GetDefaultConstructor()
+		{
+			return GetDefaultConstructor(Type);
+		}
+
+		/// <summary>
+		/// Searches for a default constructor.
+		/// </summary>
+		/// <param name="type">An instance of <see cref="System.Type"/> to search constructor for.</param>
+		/// <returns>A <see cref="ConstructorInfo"/> object representing the constructor.</returns>
+		public static ConstructorInfo GetDefaultConstructor(Type type)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			return type.GetConstructor(
+				BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
+				null,
+				Type.EmptyTypes,
+				null);
+		}
+
+		/// <summary>
+		/// Searches for a public constructors.
+		/// </summary>
+		/// <returns>An array of <see cref="ConstructorInfo"/> objects
+		/// representing all the type public constructors, if found; otherwise, an empty array.</returns>
+		public ConstructorInfo[] GetPublicConstructors()
+		{
+			return Type.GetConstructors();
+		}
+
+		/// <summary>
+		/// Searches for all constructors (except type constructors).
+		/// </summary>
+		/// <returns>An array of <see cref="ConstructorInfo"/> objects
+		/// representing all the type constructors, if found; otherwise, an empty array.</returns>
+		public ConstructorInfo[] GetConstructors()
+		{
+			return Type.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
+		}
+
+		#endregion
+
+		#region Static Members
+
+		/// <summary>
+		/// Gets a value indicating whether a type (or type's element type)
+		/// instance can be null in the underlying data store.
+		/// </summary>
+		/// <param name="type">A <see cref="System.Type"/> instance. </param>
+		/// <returns> True, if the type parameter is a closed generic nullable type; otherwise, False.</returns>
+		/// <remarks>Arrays of Nullable types are treated as Nullable types.</remarks>
+		public static bool IsNullable(Type type)
+		{
+			while (type.IsArray)
+				type = type.GetElementType();
+
+			return (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>));
+		}
+
+		public static bool IsNullableType(Type type)
+		{
+			return (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>));
+		}
+
+		public static bool IsNullableEnum(Type type)
+		{
+			return IsNullableType(type) && type.GetGenericArguments()[0].IsEnum;
+		}
+
+		public static bool IsEnumOrNullableEnum(Type type)
+		{
+			return type.IsEnum || IsNullableEnum(type);
+		}
+
+		public static Type ToNullable(Type type)
+		{
+			if (!IsNullable(type) && type.IsValueType)
+			{
+				var nullable = typeof(Nullable<>);
+				var typeArguments = nullable.GetGenericArguments();
+				if (typeArguments != null && typeArguments.Length == 1)
+				{
+					type = nullable.MakeGenericType(type);
+				}
+			}
+			return type;
+		}
+
+		/// <summary>
+		/// Returns the underlying type argument of the specified type.
+		/// </summary>
+		/// <param name="type">A <see cref="System.Type"/> instance. </param>
+		/// <returns><list>
+		/// <item>The type argument of the type parameter,
+		/// if the type parameter is a closed generic nullable type.</item>
+		/// <item>The underlying Type if the type parameter is an enum type.</item>
+		/// <item>Otherwise, the type itself.</item>
+		/// </list>
+		/// </returns>
+		public static Type GetUnderlyingType(Type type)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			if (IsNullableType(type))
+				type = type.GetGenericArguments()[0];
+
+			if (type.IsEnum)
+				type = Enum.GetUnderlyingType(type);
+
+			return type;
+		}
+
+		public static Type UnwrapNullableType(Type type)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			return IsNullableType(type) ? type.GetGenericArguments()[0] : type;
+		}
+
+		public static IEnumerable<Type> GetDefiningTypes(Type child, MemberInfo member)
+		{
+			if (member.MemberType == MemberTypes.Property)
+			{
+				var prop = (PropertyInfo)member;
+				member = prop.GetGetMethod();
+			}
+
+			foreach (var inf in child.GetInterfaces())
+			{
+				var pm = child.GetInterfaceMap(inf);
+
+				for (var i = 0; i < pm.TargetMethods.Length; i++)
+				{
+					var method = pm.TargetMethods[i];
+
+					if (method == member || (method.DeclaringType == member.DeclaringType && method.Name == member.Name))
+						yield return inf;
+				}
+			}
+
+			yield return member.DeclaringType;
+		}
+
+		public static bool IsAbstractClass(Type type)
+		{
+			return type.IsClass && type.IsAbstract;
+		}
+
+		/// <summary>
+		/// Determines whether the specified types are considered equal.
+		/// </summary>
+		/// <param name="parent">A <see cref="System.Type"/> instance. </param>
+		/// <param name="child">A type possible derived from the <c>parent</c> type</param>
+		/// <returns>True, when an object instance of the type <c>child</c>
+		/// can be used as an object of the type <c>parent</c>; otherwise, false.</returns>
+		/// <remarks>Note that nullable types does not have a parent-child relation to it's underlying type.
+		/// For example, the 'int?' type (nullable int) and the 'int' type
+		/// aren't a parent and it's child.</remarks>
+		public static bool IsSameOrParent([JetBrains.Annotations.NotNull] Type parent, [JetBrains.Annotations.NotNull] Type child)
+		{
+			if (parent == null) throw new ArgumentNullException("parent");
+			if (child  == null) throw new ArgumentNullException("child");
+
+			if (parent == child ||
+				child.IsEnum && Enum.GetUnderlyingType(child) == parent ||
+				child.IsSubclassOf(parent))
+			{
+				return true;
+			}
+
+			if (parent.IsGenericTypeDefinition)
+				for (var t = child; t != typeof(object) && t != null; t = t.BaseType)
+					if (t.IsGenericType && t.GetGenericTypeDefinition() == parent)
+						return true;
+
+			if (parent.IsInterface)
+			{
+				var interfaces = child.GetInterfaces();
+
+				foreach (var t in interfaces)
+				{
+					if (parent.IsGenericTypeDefinition)
+					{
+						if (t.IsGenericType && t.GetGenericTypeDefinition() == parent)
+							return true;
+					}
+					else if (t == parent)
+						return true;
+				}
+			}
+
+			return false;
+		}
+
+		public static Type GetGenericType([JetBrains.Annotations.NotNull] Type genericType, Type type)
+		{
+			if (genericType == null) throw new ArgumentNullException("genericType");
+
+			while (type != null && type != typeof(object))
+			{
+				if (type.IsGenericType && type.GetGenericTypeDefinition() == genericType)
+					return type;
+
+				if (genericType.IsInterface)
+				{
+					foreach (var interfaceType in type.GetInterfaces())
+					{
+						var gType = GetGenericType(genericType, interfaceType);
+
+						if (gType != null)
+							return gType;
+					}
+				}
+
+				type = type.BaseType;
+			}
+
+			return null;
+		}
+
+		/// <summary>
+		/// Searches for the method defined for a <see cref="System.Type"/>,
+		/// using the specified name and binding flags.
+		/// </summary>
+		/// <param name="methodName">The String containing the name of the method to get.</param>
+		/// <param name="generic">True to search only for a generic method, or
+		/// False to search only for non-generic method.</param>
+		/// <param name="type">A <see cref="System.Type"/> instance. </param>
+		/// <param name="flags">A bitmask comprised of one or more <see cref="BindingFlags"/> 
+		/// that specify how the search is conducted.</param>
+		/// <returns>A <see cref="MethodInfo"/> object representing the method
+		/// that matches the specified requirements, if found; otherwise, null.</returns>
+		public static MethodInfo GetMethod([JetBrains.Annotations.NotNull] Type type, bool generic, string methodName, BindingFlags flags)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			foreach (var method in type.GetMethods(flags))
+				if (method.IsGenericMethodDefinition == generic && method.Name == methodName)
+					return method;
+
+			return null;
+		}
+
+		/// <summary>
+		/// Searches for the methods defined for a <see cref="System.Type"/>,
+		/// using the specified name and binding flags.
+		/// </summary>
+		/// <param name="type">A <see cref="System.Type"/> instance. </param>
+		/// <param name="generic">True to return all generic methods, false to return all non-generic.</param>
+		/// <param name="flags">A bitmask comprised of one or more <see cref="BindingFlags"/> 
+		/// that specify how the search is conducted.</param>
+		/// <returns>An array of <see cref="MethodInfo"/> objects representing all methods defined 
+		/// for the current Type that match the specified binding constraints.</returns>
+		public static MethodInfo[] GetMethods(Type type, bool generic, BindingFlags flags)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			return type.GetMethods(flags).Where(method => method.IsGenericMethodDefinition == generic).ToArray();
+		}
+
+		/// <summary>
+		/// Searches for the method defined for a <see cref="System.Type"/>,
+		/// using the specified name and binding flags.
+		/// </summary>
+		/// <param name="type">A <see cref="System.Type"/> instance. </param>
+		/// <param name="methodName">The String containing the name of the method to get.</param>
+		/// <param name="requiredParametersCount">Number of required (non optional)
+		/// parameter types.</param>
+		/// <param name="bindingFlags">A bitmask comprised of one or more <see cref="BindingFlags"/> 
+		/// that specify how the search is conducted.</param>
+		/// <param name="parameterTypes">An array of <see cref="System.Type"/> objects representing
+		/// the number, order, and type of the parameters for the method to get.-or-
+		/// An empty array of the type <see cref="System.Type"/> (for example, <see cref="System.Type.EmptyTypes"/>)
+		/// to get a method that takes no parameters.</param>
+		/// <returns>A <see cref="MethodInfo"/> object representing the method
+		/// that matches the specified requirements, if found; otherwise, null.</returns>
+		public static MethodInfo GetMethod(
+			Type          type,
+			string        methodName,
+			BindingFlags  bindingFlags,
+			int           requiredParametersCount,
+			params Type[] parameterTypes)
+		{
+			while (parameterTypes.Length >= requiredParametersCount)
+			{
+				var method = type.GetMethod(methodName, parameterTypes);
+
+				if (null != method)
+					return method;
+
+				if (parameterTypes.Length == 0)
+					break;
+
+				Array.Resize(ref parameterTypes, parameterTypes.Length - 1);
+			}
+
+			return null;
+		}
+
+		[SuppressMessage("Microsoft.Design", "CA1011:ConsiderPassingBaseTypesAsParameters")]
+		public static object[] GetPropertyParameters(PropertyInfo propertyInfo)
+		{
+			if (propertyInfo == null) throw new ArgumentNullException("propertyInfo");
+
+			var attrs = propertyInfo.GetCustomAttributes(typeof(ParameterAttribute), true);
+
+			if (attrs != null && attrs.Length > 0)
+				return ((ParameterAttribute)attrs[0]).Parameters;
+
+			attrs = propertyInfo.GetCustomAttributes(typeof(InstanceTypeAttribute), true);
+
+			if (attrs.Length > 0)
+				return ((InstanceTypeAttribute)attrs[0]).Parameters;
+
+			attrs = new TypeHelper(
+				propertyInfo.DeclaringType).GetAttributes(typeof(GlobalInstanceTypeAttribute));
+
+			foreach (GlobalInstanceTypeAttribute attr in attrs)
+				if (IsSameOrParent(attr.PropertyType, propertyInfo.PropertyType))
+//				if (attr.PropertyType == propertyInfo.PropertyType)
+					return attr.Parameters;
+
+			return null;
+		}
+
+		/// <summary>
+		/// Searches for the property defined for a <see cref="System.Type"/>,
+		/// using the specified name and parameter types.
+		/// </summary>
+		/// <param name="type">A <see cref="System.Type"/> instance. </param>
+		/// <param name="propertyName">The String containing the name of the method to get.</param>
+		/// <param name="types">An array of Type objects representing the number,
+		/// order, and type of the parameters for the constructor to get.</param>
+		/// <param name="returnType">The property return <see cref="System.Type"/>. </param>
+		/// <returns>A <see cref="MethodInfo"/> object representing the method
+		/// that matches the specified requirements, if found; otherwise, null.</returns>
+		public static PropertyInfo GetPropertyInfo(
+			Type type, string propertyName, Type returnType, Type[] types)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+
+			return type.GetProperty(
+				propertyName,
+				BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,
+				null,
+				returnType,
+				types,
+				null);
+		}
+
+		///<summary>
+		/// Gets the Type of a list item.
+		///</summary>
+		/// <param name="list">A <see cref="System.Object"/> instance. </param>
+		///<returns>The Type instance that represents the exact runtime type of a list item.</returns>
+		public static Type GetListItemType(object list)
+		{
+			var typeOfObject = typeof(object);
+
+			if (list == null)
+				return typeOfObject;
+
+#if !SILVERLIGHT && !DATA
+
+			if (list is EditableArrayList)
+				return ((EditableArrayList)list).ItemType;
+
+#endif
+
+			if (list is Array)
+				return list.GetType().GetElementType();
+
+			var type = list.GetType();
+
+			// object[] attrs = type.GetCustomAttributes(typeof(DefaultMemberAttribute), true);
+			// string   itemMemberName = (attrs.Length == 0)? "Item": ((DefaultMemberAttribute)attrs[0]).MemberName;
+
+			if (list is IList
+#if !SILVERLIGHT
+				|| list is ITypedList || list is IListSource
+#endif
+				)
+			{
+				PropertyInfo last = null;
+
+				foreach (var pi in type.GetProperties())
+				{
+					if (pi.GetIndexParameters().Length > 0 && pi.PropertyType != typeOfObject)
+					{
+						if (pi.Name == "Item")
+							return pi.PropertyType;
+
+						last = pi;
+					}
+				}
+
+				if (last != null)
+					return last.PropertyType;
+			}
+
+			try
+			{
+				if (list is IList)
+				{
+					foreach (var o in (IList)list)
+						if (o != null && o.GetType() != typeOfObject)
+							return o.GetType();
+				}
+				else if (list is IEnumerable)
+				{
+					foreach (var o in (IEnumerable)list)
+						if (o != null && o.GetType() != typeOfObject)
+							return o.GetType();
+				}
+			}
+			catch
+			{
+			}
+
+			return typeOfObject;
+		}
+
+		///<summary>
+		/// Gets the Type of a list item.
+		///</summary>
+		/// <param name="listType">A <see cref="System.Type"/> instance. </param>
+		///<returns>The Type instance that represents the exact runtime type of a list item.</returns>
+		public static Type GetListItemType(Type listType)
+		{
+			if (listType.IsGenericType)
+			{
+				var elementTypes = GetGenericArguments(listType, typeof(IList));
+
+				if (elementTypes != null)
+					return elementTypes[0];
+			}
+
+			if (IsSameOrParent(typeof(IList),       listType)
+#if !SILVERLIGHT
+				|| IsSameOrParent(typeof(ITypedList),  listType)
+				|| IsSameOrParent(typeof(IListSource), listType)
+#endif
+				)
+			{
+				var elementType = listType.GetElementType();
+
+				if (elementType != null)
+					return elementType;
+
+				PropertyInfo last = null;
+
+				foreach (var pi in listType.GetProperties())
+				{
+					if (pi.GetIndexParameters().Length > 0 && pi.PropertyType != typeof(object))
+					{
+						if (pi.Name == "Item")
+							return pi.PropertyType;
+
+						last = pi;
+					}
+				}
+
+				if (last != null)
+					return last.PropertyType;
+			}
+
+			return typeof(object);
+		}
+
+		public static Type GetElementType(Type type)
+		{
+			if (type == null)
+				return null;
+
+			if (type == typeof(object))
+				return type.HasElementType ? type.GetElementType(): null;
+
+			if (type.IsArray)
+				return type.GetElementType();
+
+			if (type.IsGenericType)
+				foreach (var aType in type.GetGenericArguments())
+					if (typeof(IEnumerable<>).MakeGenericType(new[] { aType }).IsAssignableFrom(type))
+						return aType;
+
+			var interfaces = type.GetInterfaces();
+
+			if (interfaces != null && interfaces.Length > 0)
+			{
+				foreach (var iType in interfaces)
+				{
+					var eType = GetElementType(iType);
+
+					if (eType != null)
+						return eType;
+				}
+			}
+
+			return GetElementType(type.BaseType);
+		}
+
+		/// <summary>
+		/// Gets a value indicating whether a type can be used as a db primitive.
+		/// </summary>
+		/// <param name="type">A <see cref="System.Type"/> instance. </param>
+		/// <returns> True, if the type parameter is a primitive type; otherwise, False.</returns>
+		/// <remarks><see cref="System.String"/>. <see cref="Stream"/>. 
+		/// <see cref="XmlReader"/>. <see cref="XmlDocument"/>. are specially handled by the library
+		/// and, therefore, can be treated as scalar types.</remarks>
+		public static bool IsScalar(Type type)
+		{
+			while (type.IsArray)
+				type = type.GetElementType();
+
+			return type.IsValueType
+				|| type == typeof(string)
+				|| type == typeof(System.Data.Linq.Binary)
+				|| type == typeof(Stream)
+				|| type == typeof(XmlReader)
+				|| type.GetCustomAttributes(typeof(ScalarAttribute),true).Any() // If the type is a UDT pass it as is
+#if !SILVERLIGHT
+				|| type == typeof(XmlDocument)
+				|| type == typeof(XElement)
+#endif
+				;
+		}
+
+		///<summary>
+		/// Returns an array of Type objects that represent the type arguments
+		/// of a generic type or the type parameters of a generic type definition.
+		///</summary>
+		/// <param name="type">A <see cref="System.Type"/> instance.</param>
+		///<param name="baseType">Non generic base type.</param>
+		///<returns>An array of Type objects that represent the type arguments
+		/// of a generic type. Returns an empty array if the current type is not a generic type.</returns>
+		public static Type[] GetGenericArguments(Type type, Type baseType)
+		{
+			var baseTypeName = baseType.Name;
+
+			for (var t = type; t != typeof(object) && t != null; t = t.BaseType)
+			{
+				if (t.IsGenericType)
+				{
+					if (baseType.IsGenericTypeDefinition)
+					{
+						if (t.GetGenericTypeDefinition() == baseType)
+							return t.GetGenericArguments();
+					}
+					else if (baseTypeName == null || t.Name.Split('`')[0] == baseTypeName)
+					{
+						return t.GetGenericArguments();
+					}
+				}
+			}
+
+			foreach (var t in type.GetInterfaces())
+			{
+				if (t.IsGenericType)
+				{
+					if (baseType.IsGenericTypeDefinition)
+					{
+						if (t.GetGenericTypeDefinition() == baseType)
+							return t.GetGenericArguments();
+					}
+					else if (baseTypeName == null || t.Name.Split('`')[0] == baseTypeName)
+					{
+						return t.GetGenericArguments();
+					}
+				}
+			}
+
+			return null;
+		}
+
+		/// <summary>
+		/// Substitutes the elements of an array of types for the type parameters
+		/// of the current generic type definition and returns a Type object
+		/// representing the resulting constructed type.
+		/// </summary>
+		/// <param name="type">A <see cref="System.Type"/> instance.</param>
+		/// <param name="typeArguments">An array of types to be substituted for
+		/// the type parameters of the current generic type.</param>
+		/// <returns>A Type representing the constructed type formed by substituting
+		/// the elements of <paramref name="typeArguments"/> for the type parameters
+		/// of the current generic type.</returns>
+		/// <seealso cref="System.Type.MakeGenericType"/>
+		public static Type TranslateGenericParameters(Type type, Type[] typeArguments)
+		{
+			// 'T paramName' case
+			//
+			if (type.IsGenericParameter)
+				return typeArguments[type.GenericParameterPosition];
+
+			// 'List<T> paramName' or something like that.
+			//
+			if (type.IsGenericType && type.ContainsGenericParameters)
+			{
+				var genArgs = type.GetGenericArguments();
+
+				for (var i = 0; i < genArgs.Length; ++i)
+					genArgs[i] = TranslateGenericParameters(genArgs[i], typeArguments);
+
+				return type.GetGenericTypeDefinition().MakeGenericType(genArgs);
+			}
+
+			// Non-generic type.
+			//
+			return type;
+		}
+
+		public static bool CompareParameterTypes(Type goal, Type probe)
+		{
+			if (goal == probe)
+				return true;
+
+			if (goal.IsGenericParameter)
+				return CheckConstraints(goal, probe);
+			if (goal.IsGenericType && probe.IsGenericType)
+				return CompareGenericTypes(goal, probe);
+
+			return false;
+		}
+
+		public static bool CheckConstraints(Type goal, Type probe)
+		{
+			var constraints = goal.GetGenericParameterConstraints();
+
+			for (var i = 0; i < constraints.Length; i++)
+				if (!constraints[i].IsAssignableFrom(probe))
+					return false;
+
+			return true;
+		}
+
+		public static bool CompareGenericTypes(Type goal, Type probe)
+		{
+			var  genArgs =  goal.GetGenericArguments();
+			var specArgs = probe.GetGenericArguments();
+			var match    = (genArgs.Length == specArgs.Length);
+
+			for (var i = 0; match && i < genArgs.Length; i++)
+			{
+				if (genArgs[i] == specArgs[i])
+					continue;
+
+				if (genArgs[i].IsGenericParameter)
+					match = CheckConstraints(genArgs[i], specArgs[i]);
+				else if (genArgs[i].IsGenericType && specArgs[i].IsGenericType)
+					match = CompareGenericTypes(genArgs[i], specArgs[i]);
+				else
+					match = false;
+			}
+
+			return match;
+		}
+
+		public static PropertyInfo GetPropertyByMethod(MethodInfo method)
+		{
+			if (method != null)
+			{
+				var type = method.DeclaringType;
+				var attr = BindingFlags.NonPublic | BindingFlags.Public | (method.IsStatic ? BindingFlags.Static : BindingFlags.Instance);
+
+				foreach (var info in type.GetProperties(attr))
+				{
+					if (info.CanRead && method == info.GetGetMethod(true))
+						return info;
+
+					if (info.CanWrite && method == info.GetSetMethod(true))
+						return info;
+				}
+			}
+
+			return null;
+		}
+
+		public static Type GetMemberType(MemberInfo memberInfo)
+		{
+			switch (memberInfo.MemberType)
+			{
+				case MemberTypes.Property    : return ((PropertyInfo)   memberInfo).PropertyType;
+				case MemberTypes.Field       : return ((FieldInfo)      memberInfo).FieldType;
+				case MemberTypes.Method      : return ((MethodInfo)     memberInfo).ReturnType;
+				case MemberTypes.Constructor : return ((ConstructorInfo)memberInfo).DeclaringType;
+			}
+
+			throw new InvalidOperationException();
+		}
+
+		public static bool IsFloatType(Type type)
+		{
+			if (IsNullableType(type))
+				type = type.GetGenericArguments()[0];
+
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.Single  :
+				case TypeCode.Double  :
+				case TypeCode.Decimal : return true;
+			}
+
+			return false;
+		}
+
+		public static bool IsIntegerType(Type type)
+		{
+			if (IsNullableType(type))
+				type = type.GetGenericArguments()[0];
+
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.SByte  :
+				case TypeCode.Byte   :
+				case TypeCode.Int16  :
+				case TypeCode.UInt16 :
+				case TypeCode.Int32  :
+				case TypeCode.UInt32 :
+				case TypeCode.Int64  :
+				case TypeCode.UInt64 : return true;
+			}
+
+			return false;
+		}
+
+		public static bool IsNullableValueMember(MemberInfo member)
+		{
+			return
+				member.Name == "Value" &&
+				member.DeclaringType.IsGenericType &&
+				member.DeclaringType.GetGenericTypeDefinition() == typeof(Nullable<>);
+		}
+
+		public static bool IsNullableHasValueMember(MemberInfo member)
+		{
+			return
+				member.Name == "HasValue" &&
+				member.DeclaringType.IsGenericType &&
+				member.DeclaringType.GetGenericTypeDefinition() == typeof(Nullable<>);
+		}
+
+		public static bool Equals(MemberInfo member1, MemberInfo member2)
+		{
+			return Equals(member1, member2, null);
+		}
+
+		public static bool Equals(MemberInfo member1, MemberInfo member2, Type declaringType)
+		{
+			if (ReferenceEquals(member1, member2))
+				return true;
+
+			if (member1 == null || member2 == null)
+				return false;
+
+			if (member1.Name == member2.Name)
+			{
+				if (member1.DeclaringType == member2.DeclaringType)
+					return true;
+
+				if (member1 is PropertyInfo)
+				{
+					var isSubclass =
+						IsSameOrParent(member1.DeclaringType, member2.DeclaringType) ||
+						IsSameOrParent(member2.DeclaringType, member1.DeclaringType);
+
+					if (isSubclass)
+						return true;
+
+					if (declaringType != null && member2.DeclaringType.IsInterface)
+					{
+						var getter1 = ((PropertyInfo)member1).GetGetMethod();
+						var getter2 = ((PropertyInfo)member2).GetGetMethod();
+
+						var map = declaringType.GetInterfaceMap(member2.DeclaringType);
+
+						for (var i = 0; i < map.InterfaceMethods.Length; i++)
+							if (getter2.Name == map.InterfaceMethods[i].Name && getter2.DeclaringType == map.InterfaceMethods[i].DeclaringType &&
+								getter1.Name == map.TargetMethods   [i].Name && getter1.DeclaringType == map.TargetMethods   [i].DeclaringType)
+								return true;
+					}
+				}
+			}
+
+			if (member2.DeclaringType.IsInterface && member1.Name.EndsWith(member2.Name))
+			{
+				if (member1 is PropertyInfo)
+				{
+					var isSubclass = member2.DeclaringType.IsAssignableFrom(member1.DeclaringType);
+
+					if (isSubclass)
+					{
+						var getter1 = ((PropertyInfo)member1).GetGetMethod();
+						var getter2 = ((PropertyInfo)member2).GetGetMethod();
+
+						var map = member1.DeclaringType.GetInterfaceMap(member2.DeclaringType);
+
+						for (var i = 0; i < map.InterfaceMethods.Length; i++)
+							if ((getter2 == null || (getter2.Name == map.InterfaceMethods[i].Name && getter2.DeclaringType == map.InterfaceMethods[i].DeclaringType))
+								&&
+								(getter1 == null || (getter1.Name == map.InterfaceMethods[i].Name && getter1.DeclaringType == map.InterfaceMethods[i].DeclaringType))
+								)
+							{
+								return true;
+							}
+					}
+				}
+			}
+
+			return false;
+		}
+
+		interface IGetDefaultValueHelper
+		{
+			object GetDefaultValue();
+		}
+
+		class GetDefaultValueHelper<T> : IGetDefaultValueHelper
+		{
+			public object GetDefaultValue()
+			{
+				return default(T);
+			}
+		}
+
+		public static object GetDefaultValue(Type type)
+		{
+			var dtype  = typeof(GetDefaultValueHelper<>).MakeGenericType(type);
+			var helper = (IGetDefaultValueHelper)Activator.CreateInstance(dtype);
+
+			return helper.GetDefaultValue();
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Reflection/XmlIncludeAbstractAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,22 @@
+using System;
+using System.Xml.Serialization;
+
+namespace BLToolkit.Reflection
+{
+	/// <summary>
+	/// Allows the <see cref="XmlSerializer"/> to recognize a type generated
+	/// by the BLToolkit when it serializes or deserializes an object.
+	/// </summary>
+	public class XmlIncludeAbstractAttribute : XmlIncludeAttribute
+	{
+		/// <summary>
+		/// Initializes a new instance of the <see cref="XmlIncludeAbstractAttribute"/> class.
+		/// </summary>
+		/// <param name="type">The <see cref="Type"/> of an abstract class to
+		/// include its BLToolkit extensions.</param>
+		public XmlIncludeAbstractAttribute(Type type)
+			: base(TypeBuilder.TypeFactory.GetType(type))
+		{
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ServiceModel/Async/ILinqService.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,36 @@
+using System;
+using System.ServiceModel;
+
+namespace BLToolkit.ServiceModel.Async
+{
+	[ServiceContract]
+	[ServiceKnownType(typeof(LinqServiceQuery))]
+	[ServiceKnownType(typeof(LinqServiceResult))]
+	public interface ILinqService
+	{
+		[OperationContract(AsyncPattern = true, Action = "http://tempuri.org/ILinqService/GetSqlProviderType", ReplyAction = "http://tempuri.org/ILinqService/GetSqlProviderTypeResponse")]
+		IAsyncResult BeginGetSqlProviderType(AsyncCallback callback, object asyncState);
+
+		string EndGetSqlProviderType(IAsyncResult result);
+
+		[OperationContract(AsyncPattern = true, Action = "http://tempuri.org/ILinqService/ExecuteNonQuery", ReplyAction = "http://tempuri.org/ILinqService/ExecuteNonQueryResponse")]
+		IAsyncResult BeginExecuteNonQuery(string queryData, AsyncCallback callback, object asyncState);
+
+		int EndExecuteNonQuery(IAsyncResult result);
+
+		[OperationContract(AsyncPattern = true, Action = "http://tempuri.org/ILinqService/ExecuteScalar", ReplyAction = "http://tempuri.org/ILinqService/ExecuteScalarResponse")]
+		IAsyncResult BeginExecuteScalar(string queryData, AsyncCallback callback, object asyncState);
+
+		object EndExecuteScalar(IAsyncResult result);
+
+		[OperationContract(AsyncPattern = true, Action = "http://tempuri.org/ILinqService/ExecuteReader", ReplyAction = "http://tempuri.org/ILinqService/ExecuteReaderResponse")]
+		IAsyncResult BeginExecuteReader(string queryData, AsyncCallback callback, object asyncState);
+
+		string EndExecuteReader(IAsyncResult result);
+
+		[OperationContract(AsyncPattern = true, Action = "http://tempuri.org/ILinqService/ExecuteBatch", ReplyAction = "http://tempuri.org/ILinqService/ExecuteBatchResponse")]
+		IAsyncResult BeginExecuteBatch(string queryData, AsyncCallback callback, object asyncState);
+
+		int EndExecuteBatch(IAsyncResult result);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ServiceModel/Async/ILinqSoapService.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,36 @@
+using System;
+using System.ServiceModel;
+
+namespace BLToolkit.ServiceModel.Async
+{
+	[ServiceContract]
+	[ServiceKnownType(typeof(LinqServiceQuery))]
+	[ServiceKnownType(typeof(LinqServiceResult))]
+	public interface ILinqSoapService
+	{
+		[OperationContract(AsyncPattern = true, Action = "http://tempuri.org/GetSqlProviderType", ReplyAction = "http://tempuri.org/GetSqlProviderTypeResponse")]
+		IAsyncResult BeginGetSqlProviderType(AsyncCallback callback, object asyncState);
+
+		string EndGetSqlProviderType(IAsyncResult result);
+
+		[OperationContract(AsyncPattern = true, Action = "http://tempuri.org/ExecuteNonQuery", ReplyAction = "http://tempuri.org/ExecuteNonQueryResponse")]
+		IAsyncResult BeginExecuteNonQuery(string queryData, AsyncCallback callback, object asyncState);
+
+		int EndExecuteNonQuery(IAsyncResult result);
+
+		[OperationContract(AsyncPattern = true, Action = "http://tempuri.org/ExecuteScalar", ReplyAction = "http://tempuri.org/ExecuteScalarResponse")]
+		IAsyncResult BeginExecuteScalar(string queryData, AsyncCallback callback, object asyncState);
+
+		object EndExecuteScalar(IAsyncResult result);
+
+		[OperationContract(AsyncPattern = true, Action = "http://tempuri.org/ExecuteReader", ReplyAction = "http://tempuri.org/ExecuteReaderResponse")]
+		IAsyncResult BeginExecuteReader(string queryData, AsyncCallback callback, object asyncState);
+
+		string EndExecuteReader(IAsyncResult result);
+
+		[OperationContract(AsyncPattern = true, Action = "http://tempuri.org/ExecuteBatch", ReplyAction = "http://tempuri.org/ExecuteBatchResponse")]
+		IAsyncResult BeginExecuteBatch(string queryData, AsyncCallback callback, object asyncState);
+
+		int EndExecuteBatch(IAsyncResult result);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ServiceModel/DataService.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,467 @@
+using System;
+using System.Collections.Generic;
+using System.Data.Services.Providers;
+using System.Linq;
+using System.Linq.Expressions;
+
+namespace BLToolkit.ServiceModel
+{
+	using Data.Linq;
+	using Data.Sql;
+	using Mapping;
+
+	public class DataService<T> : System.Data.Services.DataService<T>, IServiceProvider
+		where T : IDataContext
+	{
+		#region Init
+
+		public DataService()
+		{
+			if (_defaultMetadata == null)
+				_defaultMetadata = Tuple.Create(default(T), new MetadataInfo(Map.DefaultSchema));
+
+			_metadata = new MetadataProvider(_defaultMetadata.Item2);
+			_query    = new QueryProvider   (_defaultMetadata.Item2);
+			_update   = new UpdateProvider  (_defaultMetadata.Item2, _metadata, _query);
+		}
+
+		static Tuple<T,MetadataInfo> _defaultMetadata;
+
+		public DataService(MappingSchema mappingSchema)
+		{
+			lock (_cache)
+			{
+				Tuple<T,MetadataInfo> data;
+
+				if (!_cache.TryGetValue(mappingSchema, out data))
+					data = Tuple.Create(default(T), new MetadataInfo(mappingSchema));
+
+				_metadata = new MetadataProvider(data.Item2);
+				_query    = new QueryProvider   (data.Item2);
+				_update   = new UpdateProvider  (data.Item2, _metadata, _query);
+			}
+		}
+
+		readonly static Dictionary<MappingSchema,Tuple<T,MetadataInfo>> _cache =
+			new Dictionary<MappingSchema,Tuple<T,MetadataInfo>>();
+
+		readonly MetadataProvider _metadata;
+		readonly QueryProvider    _query;
+		readonly UpdateProvider   _update;
+
+		#endregion
+
+		#region Public Members
+
+		public object GetService(Type serviceType)
+		{
+			if (serviceType == typeof(IDataServiceMetadataProvider)) return _metadata;
+			if (serviceType == typeof(IDataServiceQueryProvider))    return _query;
+			if (serviceType == typeof(IDataServiceUpdateProvider))   return _update;
+
+			return null;
+		}
+
+		#endregion
+
+		#region MetadataInfo
+
+		class TypeInfo
+		{
+			public ResourceType Type;
+			public SqlTable     Table;
+			public ObjectMapper Mapper;
+		}
+
+		class MetadataInfo
+		{
+			public MetadataInfo(MappingSchema mappingSchema)
+			{
+				_mappingSchema = mappingSchema;
+				LoadMetadata();
+			}
+
+			readonly MappingSchema _mappingSchema;
+
+			readonly public Dictionary<Type,TypeInfo>                  TypeDic     = new Dictionary<Type,TypeInfo>();
+			readonly public Dictionary<string,ResourceType>            Types       = new Dictionary<string,ResourceType>();
+			readonly public Dictionary<string,ResourceSet>             Sets        = new Dictionary<string,ResourceSet>();
+			readonly public Dictionary<string,Func<object,IQueryable>> RootGetters = new Dictionary<string,Func<object,IQueryable>>();
+
+			void LoadMetadata()
+			{
+				var n = 0;
+				var list =
+				(
+					from p in typeof(T).GetProperties()
+					let t   = p.PropertyType
+					where t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Table<>)
+					let tt  = t.GetGenericArguments()[0]
+					let tbl = new SqlTable(_mappingSchema, tt)
+					where tbl.Fields.Values.Any(f => f.IsPrimaryKey)
+					let m   = _mappingSchema.GetObjectMapper(tt)
+					select new
+					{
+						p.Name,
+						ID     = n++,
+						Type   = tt,
+						Table  = tbl,
+						Mapper = m
+					}
+				).ToList();
+
+				var baseTypes = new Dictionary<Type,Type>();
+
+				foreach (var item in list)
+					foreach (var m in item.Mapper.InheritanceMapping)
+						if (!baseTypes.ContainsKey(m.Type))
+							baseTypes.Add(m.Type, item.Type);
+
+				list.Sort((x,y) =>
+				{
+					Type baseType;
+
+					if (baseTypes.TryGetValue(x.Type, out baseType))
+						if (y.Type == baseType)
+							return 1;
+
+					if (baseTypes.TryGetValue(y.Type, out baseType))
+						if (x.Type == baseType)
+							return -1;
+
+					return x.ID - y.ID;
+				});
+
+				foreach (var item in list)
+				{
+					Type baseType;
+					baseTypes.TryGetValue(item.Type, out baseType);
+
+					var type = GetTypeInfo(item.Type, baseType, item.Table, item.Mapper);
+					var set  = new ResourceSet(item.Name, type.Type);
+
+					set.SetReadOnly();
+
+					Sets.Add(set.Name, set);
+				}
+
+				foreach (var item in list)
+				{
+					foreach (var m in item.Mapper.InheritanceMapping)
+					{
+						if (!TypeDic.ContainsKey(m.Type))
+						{
+							GetTypeInfo(
+								m.Type,
+								item.Type,
+								new SqlTable(_mappingSchema, item.Type),
+								_mappingSchema.GetObjectMapper(item.Type));
+						}
+					}
+				}
+			}
+
+			TypeInfo GetTypeInfo(Type type, Type baseType, SqlTable table, ObjectMapper mapper)
+			{
+				TypeInfo typeInfo;
+
+				if (!TypeDic.TryGetValue(type, out typeInfo))
+				{
+					var baseInfo = baseType != null ? TypeDic[baseType] : null;
+
+					typeInfo = new TypeInfo
+					{
+						Type   = new ResourceType(
+							type,
+							ResourceTypeKind.EntityType,
+							baseInfo != null ? baseInfo.Type : null,
+							type.Namespace,
+							type.Name,
+							type.IsAbstract),
+						Table  = table,
+						Mapper = mapper,
+					};
+
+					foreach (var field in table.Fields.Values)
+					{
+						if (baseType != null && baseInfo.Table.Fields.ContainsKey(field.Name))
+							continue;
+
+						var kind  = ResourcePropertyKind.Primitive;
+						var ptype = ResourceType.GetPrimitiveResourceType(field.SystemType);
+
+						if (baseType == null && field.IsPrimaryKey)
+							kind |= ResourcePropertyKind.Key;
+
+						var p = new ResourceProperty(field.Name, kind, ptype);
+
+						typeInfo.Type.AddProperty(p);
+					}
+
+					typeInfo.Type.SetReadOnly();
+
+					Types.  Add(typeInfo.Type.FullName, typeInfo.Type);
+					TypeDic.Add(type, typeInfo);
+				}
+
+				return typeInfo;
+			}
+
+			public object CreateInstance(Type type)
+			{
+				return TypeDic[type].Mapper.CreateInstance();
+			}
+		}
+
+		#endregion
+
+		#region MetadataProvider
+
+		class MetadataProvider : IDataServiceMetadataProvider
+		{
+			public MetadataProvider(MetadataInfo data)
+			{
+				_data = data;
+			}
+
+			readonly MetadataInfo _data;
+
+			public bool TryResolveResourceSet(string name, out ResourceSet resourceSet)
+			{
+				return _data.Sets.TryGetValue(name, out resourceSet);
+			}
+
+			public ResourceAssociationSet GetResourceAssociationSet(ResourceSet resourceSet, ResourceType resourceType, ResourceProperty resourceProperty)
+			{
+				throw new InvalidOperationException();
+			}
+
+			public bool TryResolveResourceType(string name, out ResourceType resourceType)
+			{
+				return _data.Types.TryGetValue(name, out resourceType);
+			}
+
+			public IEnumerable<ResourceType> GetDerivedTypes(ResourceType resourceType)
+			{
+				return _data.TypeDic[resourceType.InstanceType].Mapper.InheritanceMapping.Select(m => _data.TypeDic[m.Type].Type);
+			}
+
+			public bool HasDerivedTypes(ResourceType resourceType)
+			{
+				return _data.TypeDic[resourceType.InstanceType].Mapper.InheritanceMapping.Count > 0;
+			}
+
+			public bool TryResolveServiceOperation(string name, out ServiceOperation serviceOperation)
+			{
+				serviceOperation = null;
+				return false;
+			}
+
+			public string                        ContainerNamespace { get { return typeof(T).Namespace; } }
+			public string                        ContainerName      { get { return typeof(T).Name;      } }
+			public IEnumerable<ResourceSet>      ResourceSets       { get { return _data.Sets.Values;   } }
+			public IEnumerable<ResourceType>     Types              { get { return _data.Types.Values;  } }
+			public IEnumerable<ServiceOperation> ServiceOperations  { get { yield break;                } }
+		}
+
+		#endregion
+
+		#region QueryProvider
+
+		class QueryProvider : IDataServiceQueryProvider
+		{
+			public QueryProvider(MetadataInfo data)
+			{
+				_data = data;
+			}
+
+			readonly MetadataInfo _data;
+
+			public IQueryable GetQueryRootForResourceSet(ResourceSet resourceSet)
+			{
+				Func<object,IQueryable> func;
+
+				lock (_data.RootGetters)
+				{
+					if (!_data.RootGetters.TryGetValue(resourceSet.Name, out func))
+					{
+						var p = Expression.Parameter(typeof(object), "p");
+						var l = Expression.Lambda<Func<object,IQueryable>>(
+							Expression.PropertyOrField(
+								Expression.Convert(p, typeof(T)),
+								resourceSet.Name),
+							p);
+
+						func = l.Compile();
+
+						_data.RootGetters.Add(resourceSet.Name, func);
+					}
+				}
+
+				return func(CurrentDataSource);
+			}
+
+			public ResourceType GetResourceType(object target)
+			{
+				return _data.TypeDic[target.GetType()].Type;
+			}
+
+			public object GetPropertyValue(object target, ResourceProperty resourceProperty)
+			{
+				throw new InvalidOperationException();
+			}
+
+			public object GetOpenPropertyValue(object target, string propertyName)
+			{
+				throw new InvalidOperationException();
+			}
+
+			public IEnumerable<KeyValuePair<string,object>> GetOpenPropertyValues(object target)
+			{
+				throw new InvalidOperationException();
+			}
+
+			public object InvokeServiceOperation(ServiceOperation serviceOperation, object[] parameters)
+			{
+				throw new InvalidOperationException();
+			}
+
+			public object CurrentDataSource         { get; set; }
+			public bool   IsNullPropagationRequired { get { return true; } }
+		}
+
+		#endregion
+
+		#region UpdateProvider
+
+		abstract class ResourceAction
+		{
+			public object Resource;
+
+			public class Create : ResourceAction {}
+			public class Delete : ResourceAction {}
+			public class Reset  : ResourceAction {}
+
+			public class Update : ResourceAction
+			{
+				public string Property;
+				public object Value;
+			}
+
+		}
+
+		class UpdateProvider : IDataServiceUpdateProvider
+		{
+			#region Init
+
+			public UpdateProvider(MetadataInfo data, MetadataProvider metadata, QueryProvider query)
+			{
+				_data     = data;
+				_metadata = metadata;
+				_query    = query;
+			}
+
+			readonly MetadataInfo         _data;
+			readonly MetadataProvider     _metadata;
+			readonly QueryProvider        _query;
+			readonly List<ResourceAction> _actions = new List<ResourceAction>();
+
+			#endregion
+
+			#region IDataServiceUpdateProvider
+
+			public void SetConcurrencyValues(object resourceCookie, bool? checkForEquality, IEnumerable<KeyValuePair<string,object>> concurrencyValues)
+			{
+				throw new InvalidOperationException();
+			}
+
+			public void AddReferenceToCollection(object targetResource, string propertyName, object resourceToBeAdded)
+			{
+				throw new InvalidOperationException();
+			}
+
+			public void ClearChanges()
+			{
+				_actions.Clear();
+			}
+
+			public object CreateResource(string containerName, string fullTypeName)
+			{
+				ResourceType type;
+
+				if (_metadata.TryResolveResourceType(fullTypeName, out type)) 
+				{
+					var resource = _data.CreateInstance(type.InstanceType);
+					_actions.Add(new ResourceAction.Create { Resource = resource });
+					return resource; 
+				}
+
+				throw new Exception(string.Format("Type '{0}' not found", fullTypeName));
+			}
+
+			public void DeleteResource(object targetResource)
+			{
+				_actions.Add(new ResourceAction.Delete { Resource = targetResource });
+			}
+
+			public object GetResource(IQueryable query, string fullTypeName)
+			{
+				object resource = null;
+
+				foreach (var item in query)
+				{
+					if (resource != null)
+						throw new LinqException("Resource not uniquely identified");
+					resource = item;
+				}
+
+				return resource;
+			}
+
+			public object GetValue(object targetResource, string propertyName)
+			{
+				var m = _data.TypeDic[targetResource.GetType()].Mapper;
+				return m[propertyName, true].GetValue(targetResource);
+			}
+
+			public void RemoveReferenceFromCollection(object targetResource, string propertyName, object resourceToBeRemoved)
+			{
+				throw new InvalidOperationException();
+			}
+
+			public object ResetResource(object resource)
+			{
+				_actions.Add(new ResourceAction.Reset { Resource = resource });
+				return resource;
+			}
+
+			public object ResolveResource(object resource)
+			{
+				return resource;
+			}
+
+			public void SaveChanges()
+			{
+				throw new InvalidOperationException();
+			}
+
+			public void SetReference(object targetResource, string propertyName, object propertyValue)
+			{
+				throw new InvalidOperationException();
+			}
+
+			public void SetValue(object targetResource, string propertyName, object propertyValue)
+			{
+				var m = _data.TypeDic[targetResource.GetType()].Mapper;
+
+				m[propertyName, true].SetValue(targetResource, propertyValue);
+
+				_actions.Add(new ResourceAction.Update { Resource = targetResource, Property = propertyName, Value = propertyValue });
+			}
+
+			#endregion
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ServiceModel/ILinqService.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+using System;
+using System.ServiceModel;
+
+namespace BLToolkit.ServiceModel
+{
+	[ServiceContract]
+	public interface ILinqService
+	{
+		[OperationContract] string GetSqlProviderType();
+		[OperationContract] int    ExecuteNonQuery(string queryData);
+		[OperationContract] object ExecuteScalar  (string queryData);
+		[OperationContract] string ExecuteReader  (string queryData);
+		[OperationContract] int    ExecuteBatch   (string queryData);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ServiceModel/ILinqSoapService.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+using System;
+using System.ServiceModel;
+
+namespace BLToolkit.ServiceModel
+{
+	[ServiceContract]
+	public interface ILinqSoapService
+	{
+		[OperationContract] string GetSqlProviderType();
+		[OperationContract] int    ExecuteNonQuery(string queryData);
+		[OperationContract] object ExecuteScalar  (string queryData);
+		[OperationContract] string ExecuteReader  (string queryData);
+		[OperationContract] int    ExecuteBatch   (string queryData);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ServiceModel/LinqService.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,272 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.ServiceModel;
+using System.Web.Services;
+
+namespace BLToolkit.ServiceModel
+{
+	using Data;
+	using Data.Linq;
+	using Data.Sql;
+
+	[ServiceBehavior  (InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
+	[WebService       (Namespace  = "http://tempuri.org/")]
+	[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
+	public class LinqService : ILinqService
+	{
+		public LinqService()
+		{
+		}
+
+		public LinqService(string configuration)
+		{
+			Configuration = configuration;
+		}
+
+		public string Configuration { get; set; }
+		public bool   AllowUpdates  { get; set; }
+
+		public static Func<string,Type> TypeResolver = _ => null;
+
+		public virtual IDataContext CreateDataContext()
+		{
+			return Settings.CreateDefaultDataContext(Configuration);
+		}
+
+		protected virtual void ValidateQuery(LinqServiceQuery query)
+		{
+			if (AllowUpdates == false && !query.Query.IsSelect)
+				throw new LinqException("Insert/Update/Delete requests are not allowed by the service policy.");
+		}
+
+		protected virtual void HandleException(Exception exception)
+		{
+		}
+
+		#region ILinqService Members
+
+		public Type SqlProviderType { get; set; }
+
+		[WebMethod]
+		public virtual string GetSqlProviderType()
+		{
+			try
+			{
+				if (SqlProviderType == null)
+					using (var ctx = CreateDataContext())
+						SqlProviderType = ctx.CreateSqlProvider().GetType();
+
+				return SqlProviderType.FullName;
+			}
+			catch (Exception exception)
+			{
+				HandleException(exception);
+				throw;
+			}
+		}
+
+		class QueryContext : IQueryContext
+		{
+			public SqlQuery       SqlQuery   { get; set; }
+			public object         Context    { get; set; }
+			public SqlParameter[] Parameters { get; set; }
+
+			public SqlParameter[] GetParameters()
+			{
+				return Parameters;
+			}
+		}
+
+		[WebMethod]
+		public int ExecuteNonQuery(string queryData)
+		{
+			try
+			{
+				var query = LinqServiceSerializer.Deserialize(queryData);
+
+				ValidateQuery(query);
+
+				using (var db = CreateDataContext())
+				{
+					var obj = db.SetQuery(new QueryContext { SqlQuery = query.Query, Parameters = query.Parameters });
+					return db.ExecuteNonQuery(obj);
+				}
+			}
+			catch (Exception exception)
+			{
+				HandleException(exception);
+				throw;
+			}
+		}
+
+		[WebMethod]
+		public object ExecuteScalar(string queryData)
+		{
+			try
+			{
+				var query = LinqServiceSerializer.Deserialize(queryData);
+
+				ValidateQuery(query);
+
+				using (var db = CreateDataContext())
+				{
+					var obj = db.SetQuery(new QueryContext { SqlQuery = query.Query, Parameters = query.Parameters });
+					return db.ExecuteScalar(obj);
+				}
+			}
+			catch (Exception exception)
+			{
+				HandleException(exception);
+				throw;
+			}
+		}
+
+		[WebMethod]
+		public string ExecuteReader(string queryData)
+		{
+			try
+			{
+				var query = LinqServiceSerializer.Deserialize(queryData);
+
+				ValidateQuery(query);
+
+				using (var db = CreateDataContext())
+				{
+					var obj = db.SetQuery(new QueryContext { SqlQuery = query.Query, Parameters = query.Parameters });
+
+					using (var rd = db.ExecuteReader(obj))
+					{
+						var ret = new LinqServiceResult
+						{
+							QueryID    = Guid.NewGuid(),
+							FieldCount = rd.FieldCount,
+							FieldNames = new string[rd.FieldCount],
+							FieldTypes = new Type  [rd.FieldCount],
+							Data       = new List<string[]>(),
+						};
+
+						for (var i = 0; i < ret.FieldCount; i++)
+						{
+							ret.FieldNames[i] = rd.GetName(i);
+							ret.FieldTypes[i] = rd.GetFieldType(i);
+						}
+
+						var varyingTypes = new List<Type>();
+
+						while (rd.Read())
+						{
+							var data  = new string  [rd.FieldCount];
+							var codes = new TypeCode[rd.FieldCount];
+
+							for (var i = 0; i < ret.FieldCount; i++)
+								codes[i] = Type.GetTypeCode(ret.FieldTypes[i]);
+
+							ret.RowCount++;
+
+							for (var i = 0; i < ret.FieldCount; i++)
+							{
+								if (!rd.IsDBNull(i))
+								{
+									var code = codes[i];
+									var type = rd.GetFieldType(i);
+									var idx = -1;
+
+									if (type != ret.FieldTypes[i])
+									{
+										code = Type.GetTypeCode(type);
+										idx  = varyingTypes.IndexOf(type);
+
+										if (idx < 0)
+										{
+											varyingTypes.Add(type);
+											idx = varyingTypes.Count - 1;
+										}
+									}
+
+									switch (code)
+									{
+										case TypeCode.Decimal  : data[i] = rd.GetDecimal (i).ToString(CultureInfo.InvariantCulture); break;
+										case TypeCode.Double   : data[i] = rd.GetDouble  (i).ToString(CultureInfo.InvariantCulture); break;
+										case TypeCode.Single   : data[i] = rd.GetFloat   (i).ToString(CultureInfo.InvariantCulture); break;
+										case TypeCode.DateTime : data[i] = rd.GetDateTime(i).ToString("o");                          break;
+										default                :
+											{
+												if (type == typeof(DateTimeOffset))
+												{
+													var dt = rd.GetValue(i);
+
+													if (dt is DateTime)
+														data[i] = ((DateTime)dt).ToString("o");
+													else if (dt is DateTimeOffset)
+														data[i] = ((DateTimeOffset)dt).ToString("o");
+													else
+														data[i] = rd.GetValue(i).ToString();
+												}
+												else if (ret.FieldTypes[i] == typeof(byte[]))
+													data[i] = Convert.ToBase64String((byte[])rd.GetValue(i));
+												else
+													data[i] = (rd.GetValue(i) ?? "").ToString();
+
+												break;
+											}
+									}
+
+									if (idx >= 0)
+										data[i] = "\0" + (char)idx + data[i];
+								}
+							}
+
+							ret.Data.Add(data);
+						}
+
+						ret.VaryingTypes = varyingTypes.ToArray();
+
+						return LinqServiceSerializer.Serialize(ret);
+					}
+				}
+			}
+			catch (Exception exception)
+			{
+				HandleException(exception);
+				throw;
+			}
+		}
+
+		[WebMethod]
+		public int ExecuteBatch(string queryData)
+		{
+			try
+			{
+				var data    = LinqServiceSerializer.DeserializeStringArray(queryData);
+				var queries = data.Select<string,LinqServiceQuery>(LinqServiceSerializer.Deserialize).ToArray();
+
+				foreach (var query in queries)
+					ValidateQuery(query);
+
+				using (var db = CreateDataContext())
+				{
+					if (db is DbManager) ((DbManager)db).BeginTransaction();
+
+					foreach (var query in queries)
+					{
+						var obj = db.SetQuery(new QueryContext { SqlQuery = query.Query, Parameters = query.Parameters });
+						db.ExecuteNonQuery(obj);
+					}
+
+					if (db is DbManager) ((DbManager)db).CommitTransaction();
+
+					return queryData.Length;
+				}
+			}
+			catch (Exception exception)
+			{
+				HandleException(exception);
+				throw;
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ServiceModel/LinqServiceClient.Silverlight.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,150 @@
+using System;
+using System.ServiceModel;
+
+namespace BLToolkit.ServiceModel
+{
+	class LinqServiceClient : ClientBase<Async.ILinqService>, ILinqService, IDisposable
+	{
+		#region Init
+
+		public LinqServiceClient(string endpointConfigurationName)                                            : base(endpointConfigurationName) { }
+		public LinqServiceClient(string endpointConfigurationName, string remoteAddress)                      : base(endpointConfigurationName, remoteAddress) { }
+		public LinqServiceClient(string endpointConfigurationName, EndpointAddress remoteAddress)             : base(endpointConfigurationName, remoteAddress) { }
+		public LinqServiceClient(System.ServiceModel.Channels.Binding binding, EndpointAddress remoteAddress) : base(binding, remoteAddress) { }
+
+		#endregion
+
+		#region ILinqService Members
+
+		public string GetSqlProviderType()
+		{
+			var async = Channel.BeginGetSqlProviderType(null, null);
+			return Channel.EndGetSqlProviderType(async);
+		}
+
+		public int ExecuteNonQuery(string queryData)
+		{
+			var async = Channel.BeginExecuteNonQuery(queryData, null, null);
+			return Channel.EndExecuteNonQuery(async);
+		}
+
+		public object ExecuteScalar(string queryData)
+		{
+			var async = Channel.BeginExecuteScalar(queryData, null, null);
+			return Channel.EndExecuteScalar(async);
+		}
+
+		public string ExecuteReader(string queryData)
+		{
+			var async = Channel.BeginExecuteReader(queryData, null, null);
+			return Channel.EndExecuteReader(async);
+		}
+
+		public int ExecuteBatch(string queryData)
+		{
+			var async = Channel.BeginExecuteBatch(queryData, null, null);
+			return Channel.EndExecuteBatch(async);
+		}
+
+		#endregion
+
+		#region IDisposable Members
+
+		void IDisposable.Dispose()
+		{
+			try
+			{
+				if (State != CommunicationState.Faulted)
+					((ICommunicationObject)this).Close();
+				else
+					Abort();
+			}
+			catch (CommunicationException)
+			{
+				Abort();
+			}
+			catch (TimeoutException)
+			{
+				Abort();
+			}
+			catch (Exception)
+			{
+				Abort();
+				throw;
+			}
+		}
+
+		#endregion
+
+		#region Overrides
+
+		protected override Async.ILinqService CreateChannel()
+		{
+			return new LinqServiceClientChannel(this);
+		}
+
+		#endregion
+
+		#region Channel
+
+		class LinqServiceClientChannel : ChannelBase<Async.ILinqService>, Async.ILinqService
+		{
+			public LinqServiceClientChannel(ClientBase<Async.ILinqService> client) :
+				base(client)
+			{
+			}
+
+			public IAsyncResult BeginGetSqlProviderType(AsyncCallback callback, object asyncState)
+			{
+				return BeginInvoke("GetSqlProviderType", new object[0], callback, asyncState);
+			}
+
+			public string EndGetSqlProviderType(IAsyncResult result)
+			{
+				return (string)EndInvoke("GetSqlProviderType", new object[0], result);
+			}
+
+			public IAsyncResult BeginExecuteNonQuery(string queryData, AsyncCallback callback, object asyncState)
+			{
+				return BeginInvoke("ExecuteNonQuery", new object[] { queryData }, callback, asyncState);
+			}
+
+			public int EndExecuteNonQuery(IAsyncResult result)
+			{
+				return (int)EndInvoke("ExecuteNonQuery", new object[0], result);
+			}
+
+			public IAsyncResult BeginExecuteScalar(string queryData, AsyncCallback callback, object asyncState)
+			{
+				return BeginInvoke("ExecuteScalar", new object[] { queryData }, callback, asyncState);
+			}
+
+			public object EndExecuteScalar(IAsyncResult result)
+			{
+				return EndInvoke("ExecuteScalar", new object[0], result);
+			}
+
+			public IAsyncResult BeginExecuteReader(string queryData, AsyncCallback callback, object asyncState)
+			{
+				return BeginInvoke("ExecuteReader", new object[] { queryData }, callback, asyncState);
+			}
+
+			public string EndExecuteReader(IAsyncResult result)
+			{
+				return (string)EndInvoke("ExecuteReader", new object[0], result);
+			}
+
+			public IAsyncResult BeginExecuteBatch(string queryData, AsyncCallback callback, object asyncState)
+			{
+				return BeginInvoke("ExecuteBatch", new object[] { queryData }, callback, asyncState);
+			}
+
+			public int EndExecuteBatch(IAsyncResult result)
+			{
+				return (int)EndInvoke("ExecuteBatch", new object[0], result);
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ServiceModel/LinqServiceClient.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,81 @@
+using System;
+using System.ServiceModel;
+using System.ServiceModel.Channels;
+
+namespace BLToolkit.ServiceModel
+{
+	class LinqServiceClient : ClientBase<ILinqService>, ILinqService, IDisposable
+	{
+		#region Init
+
+		//public LinqServiceClient() {}
+		public LinqServiceClient(string endpointConfigurationName)                                                                  : base(endpointConfigurationName) { }
+		public LinqServiceClient(string endpointConfigurationName, string remoteAddress)                                            : base(endpointConfigurationName, remoteAddress) { }
+		public LinqServiceClient(string endpointConfigurationName, EndpointAddress remoteAddress)                                   : base(endpointConfigurationName, remoteAddress) { }
+		public LinqServiceClient(Binding binding, EndpointAddress remoteAddress)                                                    : base(binding, remoteAddress) { }
+		//public LinqServiceClient(InstanceContext callbackInstance)                                                                  : base(callbackInstance) { }
+		//public LinqServiceClient(InstanceContext callbackInstance, string endpointConfigurationName)                                : base(callbackInstance, endpointConfigurationName) { }
+		//public LinqServiceClient(InstanceContext callbackInstance, string endpointConfigurationName, string remoteAddress)          : base(callbackInstance, endpointConfigurationName, remoteAddress) { }
+		//public LinqServiceClient(InstanceContext callbackInstance, string endpointConfigurationName, EndpointAddress remoteAddress) : base(callbackInstance, endpointConfigurationName, remoteAddress) { }
+		//public LinqServiceClient(InstanceContext callbackInstance, Binding binding, EndpointAddress remoteAddress)                  : base(callbackInstance, binding, remoteAddress) { }
+
+		#endregion
+
+		#region ILinqService Members
+
+		public string GetSqlProviderType()
+		{
+			return Channel.GetSqlProviderType();
+		}
+
+		public int ExecuteNonQuery(string queryData)
+		{
+			return Channel.ExecuteNonQuery(queryData);
+		}
+
+		public object ExecuteScalar(string queryData)
+		{
+			return Channel.ExecuteScalar(queryData);
+		}
+
+		public string ExecuteReader(string queryData)
+		{
+			return Channel.ExecuteReader(queryData);
+		}
+
+		public int ExecuteBatch(string queryData)
+		{
+			return Channel.ExecuteBatch(queryData);
+		}
+
+		#endregion
+
+		#region IDisposable Members
+
+		void IDisposable.Dispose()
+		{
+			try
+			{
+				if (State != CommunicationState.Faulted)
+					((ICommunicationObject)this).Close();
+				else
+					Abort();
+			}
+			catch (CommunicationException)
+			{
+				Abort();
+			}
+			catch (TimeoutException)
+			{
+				Abort();
+			}
+			catch (Exception)
+			{
+				Abort();
+				throw;
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ServiceModel/LinqServiceQuery.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+using System;
+
+namespace BLToolkit.ServiceModel
+{
+	using Data.Sql;
+
+	public class LinqServiceQuery
+	{
+		public SqlQuery       Query      { get; set; }
+		public SqlParameter[] Parameters { get; set; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ServiceModel/LinqServiceResult.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+
+namespace BLToolkit.ServiceModel
+{
+	public class LinqServiceResult
+	{
+		public int            FieldCount   { get; set; }
+		public int            RowCount     { get; set; }
+		public Guid           QueryID      { get; set; }
+		public string[]       FieldNames   { get; set; }
+		public Type[]         FieldTypes   { get; set; }
+		public Type[]         VaryingTypes { get; set; }
+		public List<string[]> Data         { get; set; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ServiceModel/LinqServiceSerializer.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1699 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Data;
+using System.Diagnostics;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+
+namespace BLToolkit.ServiceModel
+{
+	using Data.Sql;
+	using Data.Sql.SqlProvider;
+	using Mapping;
+	using Reflection;
+
+	static class LinqServiceSerializer
+	{
+		#region Public Members
+
+		public static string Serialize(SqlQuery query, SqlParameter[] parameters)
+		{
+			return new QuerySerializer().Serialize(query, parameters);
+		}
+
+		public static LinqServiceQuery Deserialize(string str)
+		{
+			return new QueryDeserializer().Deserialize(str);
+		}
+
+		public static string Serialize(LinqServiceResult result)
+		{
+			return new ResultSerializer().Serialize(result);
+		}
+
+		public static LinqServiceResult DeserializeResult(string str)
+		{
+			return new ResultDeserializer().DeserializeResult(str);
+		}
+
+		public static string Serialize(string[] data)
+		{
+			return new StringArraySerializer().Serialize(data);
+		}
+
+		public static string[] DeserializeStringArray(string str)
+		{
+			return new StringArrayDeserializer().Deserialize(str);
+		}
+
+		#endregion
+
+		#region SerializerBase
+
+		const int _paramIndex     = -1;
+		const int _typeIndex      = -2;
+		const int _typeArrayIndex = -3;
+
+		class SerializerBase
+		{
+			protected readonly StringBuilder          Builder = new StringBuilder();
+			protected readonly Dictionary<object,int> Dic     = new Dictionary<object,int>();
+			protected int                             Index;
+
+			string ConvertToString(Type type, object value)
+			{
+				switch (Type.GetTypeCode(type))
+				{
+					case TypeCode.Decimal  : return ((decimal) value).ToString(CultureInfo.InvariantCulture);
+					case TypeCode.Double   : return ((double)  value).ToString(CultureInfo.InvariantCulture);
+					case TypeCode.Single   : return ((float)   value).ToString(CultureInfo.InvariantCulture);
+					case TypeCode.DateTime : return ((DateTime)value).ToString("o");
+				}
+
+				if (type == typeof(DateTimeOffset))
+					return ((DateTimeOffset)value).ToString("o");
+
+				return Common.Convert.ToString(value);
+			}
+
+			protected void Append(Type type, object value)
+			{
+				Append(type);
+
+				if (value == null)
+					Append((string)null);
+				else if (!type.IsArray)
+				{
+					Append(ConvertToString(type, value));
+				}
+				else
+				{
+					var elementType = type.GetElementType();
+
+					Builder.Append(' ');
+
+					var len = Builder.Length;
+					var cnt = 0;
+
+					if (elementType.IsArray)
+						foreach (var val in (IEnumerable)value)
+						{
+							Append(elementType, val);
+							cnt++;
+						}
+					else
+						foreach (var val in (IEnumerable)value)
+						{
+							if (val == null)
+								Append((string)null);
+							else
+								Append(ConvertToString(val.GetType(), val));
+							cnt++;
+						}
+
+					Builder.Insert(len, cnt.ToString(CultureInfo.CurrentCulture));
+				}
+			}
+
+			protected void Append(int value)
+			{
+				Builder.Append(' ').Append(value);
+			}
+
+			protected void Append(Type value)
+			{
+				Builder.Append(' ').Append(value == null ? 0 : GetType(value));
+			}
+
+			protected void Append(bool value)
+			{
+				Builder.Append(' ').Append(value ? '1' : '0');
+			}
+
+			protected void Append(IQueryElement element)
+			{
+				Builder.Append(' ').Append(element == null ? 0 : Dic[element]);
+			}
+
+			protected void Append(string str)
+			{
+				Builder.Append(' ');
+
+				if (str == null)
+				{
+					Builder.Append('-');
+				}
+				else if (str.Length == 0)
+				{
+					Builder.Append('0');
+				}
+				else
+				{
+					Builder
+						.Append(str.Length)
+						.Append(':')
+						.Append(str);
+				}
+			}
+
+			protected int GetType(Type type)
+			{
+				if (type == null)
+					return 0;
+
+				int idx;
+
+				if (!Dic.TryGetValue(type, out idx))
+				{
+					if (type.IsArray)
+					{
+						var elementType = GetType(type.GetElementType());
+
+						Dic.Add(type, idx = ++Index);
+
+						Builder
+							.Append(idx)
+							.Append(' ')
+							.Append(_typeArrayIndex)
+							.Append(' ')
+							.Append(elementType);
+					}
+					else
+					{
+						Dic.Add(type, idx = ++Index);
+
+						Builder
+							.Append(idx)
+							.Append(' ')
+							.Append(_typeIndex);
+
+						Append(type.FullName);
+					}
+
+					Builder.AppendLine();
+				}
+
+				return idx;
+			}
+		}
+
+		#endregion
+
+		#region DeserializerBase
+
+		public class DeserializerBase
+		{
+			protected readonly Dictionary<int,object> Dic = new Dictionary<int,object>();
+
+			protected string Str;
+			protected int    Pos;
+
+			protected char Peek()
+			{
+				return Str[Pos];
+			}
+
+			char Next()
+			{
+				return Str[++Pos];
+			}
+
+			protected bool Get(char c)
+			{
+				if (Peek() == c)
+				{
+					Pos++;
+					return true;
+				}
+
+				return false;
+			}
+
+			protected int ReadInt()
+			{
+				Get(' ');
+
+				var minus = Get('-');
+				var value = 0;
+
+				for (var c = Peek(); char.IsDigit(c); c = Next())
+					value = value * 10 + (c - '0');
+
+				return minus ? -value : value;
+			}
+
+			protected int? ReadCount()
+			{
+				Get(' ');
+
+				if (Get('-'))
+					return null;
+
+				var value = 0;
+
+				for (var c = Peek(); char.IsDigit(c); c = Next())
+					value = value * 10 + (c - '0');
+
+				return value;
+			}
+
+			protected string ReadString()
+			{
+				Get(' ');
+
+				var c = Peek();
+
+				if (c == '-')
+				{
+					Pos++;
+					return null;
+				}
+
+				if (c == '0')
+				{
+					Pos++;
+					return string.Empty;
+				}
+
+				var len   = ReadInt();
+				var value = Str.Substring(++Pos, len);
+
+				Pos += len;
+
+				return value;
+			}
+
+			protected bool ReadBool()
+			{
+				Get(' ');
+
+				var value = Peek() == '1';
+
+				Pos++;
+
+				return value;
+			}
+
+			protected T Read<T>()
+				where T : class
+			{
+				var idx = ReadInt();
+				return idx == 0 ? null : (T)Dic[idx];
+			}
+
+			protected T[] ReadArray<T>()
+				where T : class
+			{
+				var count = ReadCount();
+
+				if (count == null)
+					return null;
+
+				var items = new T[count.Value];
+
+				for (var i = 0; i < count; i++)
+					items[i] = Read<T>();
+
+				return items;
+			}
+
+			protected List<T> ReadList<T>()
+				where T : class
+			{
+				var count = ReadCount();
+
+				if (count == null)
+					return null;
+
+				var items = new List<T>(count.Value);
+
+				for (var i = 0; i < count; i++)
+					items.Add(Read<T>());
+
+				return items;
+			}
+
+			protected void NextLine()
+			{
+				while (Pos < Str.Length && (Peek() == '\n' || Peek() == '\r'))
+					Pos++;
+			}
+
+			interface IDeserializerHelper
+			{
+				object GetArray(DeserializerBase deserializer);
+			}
+
+			class DeserializerHelper<T> : IDeserializerHelper
+			{
+				public object GetArray(DeserializerBase deserializer)
+				{
+					var count = deserializer.ReadCount();
+
+					if (count == null)
+						return null;
+
+					var arr   = new T[count.Value];
+					var type  = typeof(T);
+
+					for (var i = 0; i < count.Value; i++)
+						arr[i] = (T)deserializer.ReadValue(type);
+
+					return arr;
+				}
+			}
+
+			static readonly Dictionary<Type,Func<DeserializerBase,object>> _arrayDeserializers =
+				new Dictionary<Type,Func<DeserializerBase,object>>();
+
+			protected object ReadValue(Type type)
+			{
+				if (type == null)
+					return ReadString();
+
+				if (type.IsArray)
+				{
+					var elem = type.GetElementType();
+
+					Func<DeserializerBase,object> deserializer;
+
+					lock (_arrayDeserializers)
+					{
+						if (!_arrayDeserializers.TryGetValue(elem, out deserializer))
+						{
+							var helper = (IDeserializerHelper)Activator.CreateInstance(typeof(DeserializerHelper<>).MakeGenericType(elem));
+							_arrayDeserializers.Add(elem, deserializer = helper.GetArray);
+						}
+					}
+
+					return deserializer(this);
+				}
+
+				var str = ReadString();
+
+				switch (Type.GetTypeCode(type))
+				{
+					case TypeCode.Decimal  : return decimal. Parse(str, CultureInfo.InvariantCulture);
+					case TypeCode.Double   : return double.  Parse(str, CultureInfo.InvariantCulture);
+					case TypeCode.Single   : return float.   Parse(str, CultureInfo.InvariantCulture);
+					case TypeCode.DateTime : return DateTime.ParseExact(str, "o", CultureInfo.InvariantCulture);
+				}
+
+				if (type == typeof(DateTimeOffset))
+					return DateTimeOffset.ParseExact(str, "o", CultureInfo.InvariantCulture);
+
+				return Common.Convert.ChangeTypeFromString(str, type);
+			}
+
+			protected readonly List<string> UnresolvedTypes = new List<string>();
+
+			protected Type ResolveType(string str)
+			{
+				if (str == null)
+					return null;
+
+				var type = Type.GetType(str, false);
+
+				if (type == null)
+				{
+					if (str == "System.Data.Linq.Binary")
+						return typeof(System.Data.Linq.Binary);
+
+#if !SILVERLIGHT
+
+					type = LinqService.TypeResolver(str);
+
+#endif
+
+					if (type == null)
+					{
+						UnresolvedTypes.Add(str);
+
+						Debug.WriteLine(
+							string.Format("Type '{0}' cannot be resolved. Use LinqService.TypeResolver to resolve unknown types.", str),
+							"LinqServiceSerializer");
+					}
+				}
+
+				return type;
+			}
+		}
+
+		#endregion
+
+		#region QuerySerializer
+
+		class QuerySerializer : SerializerBase
+		{
+			public string Serialize(SqlQuery query, SqlParameter[] parameters)
+			{
+				var visitor = new QueryVisitor();
+
+				visitor.Visit(query, Visit);
+
+				foreach (var parameter in parameters)
+					if (!Dic.ContainsKey(parameter))
+						Visit(parameter);
+
+				Builder
+					.Append(++Index)
+					.Append(' ')
+					.Append(_paramIndex);
+
+				Append(parameters.Length);
+
+				foreach (var parameter in parameters)
+					Append(parameter);
+
+				Builder.AppendLine();
+
+				return Builder.ToString();
+			}
+
+			void Visit(IQueryElement e)
+			{
+				switch (e.ElementType)
+				{
+					case QueryElementType.SqlField :
+						{
+							var fld = (SqlField)e;
+
+							if (fld != fld.Table.All)
+							{
+								GetType(fld.SystemType);
+
+								if (fld.MemberMapper != null)
+									GetType(fld.MemberMapper.MemberAccessor.TypeAccessor.OriginalType);
+							}
+
+							break;
+						}
+
+					case QueryElementType.SqlParameter :
+						{
+							var p = (SqlParameter)e;
+							var t = p.Value == null ? p.SystemType : p.Value.GetType();
+
+							if (p.Value == null || t.IsArray || t == typeof(string) || !(p.Value is IEnumerable))
+							{
+								GetType(t);
+							}
+							else
+							{
+								var elemType = TypeHelper.GetElementType(t);
+								GetType(GetArrayType(elemType));
+							}
+
+							//if (p.EnumTypes != null)
+							//	foreach (var type in p.EnumTypes)
+							//		GetType(type);
+
+							break;
+						}
+
+					case QueryElementType.SqlFunction         : GetType(((SqlFunction)        e).SystemType); break;
+					case QueryElementType.SqlExpression       : GetType(((SqlExpression)      e).SystemType); break;
+					case QueryElementType.SqlBinaryExpression : GetType(((SqlBinaryExpression)e).SystemType); break;
+					case QueryElementType.SqlDataType         : GetType(((SqlDataType)        e).Type);       break;
+					case QueryElementType.SqlValue            : GetType(((SqlValue)           e).SystemType); break;
+					case QueryElementType.SqlTable            : GetType(((SqlTable)           e).ObjectType); break;
+				}
+
+				Dic.Add(e, ++Index);
+
+				Builder
+					.Append(Index)
+					.Append(' ')
+					.Append((int)e.ElementType);
+
+				switch (e.ElementType)
+				{
+					case QueryElementType.SqlField :
+						{
+							var elem = (SqlField)e;
+
+							Append(elem.SystemType);
+							Append(elem.Name);
+							Append(elem.PhysicalName);
+							Append(elem.Nullable);
+							Append(elem.PrimaryKeyOrder);
+							Append(elem.IsIdentity);
+							Append(elem.IsUpdatable);
+							Append(elem.IsInsertable);
+							Append(elem.MemberMapper == null ? null : elem.MemberMapper.MemberAccessor.TypeAccessor.OriginalType);
+							Append(elem.MemberMapper == null ? null : elem.MemberMapper.Name);
+
+							break;
+						}
+
+					case QueryElementType.SqlFunction :
+						{
+							var elem = (SqlFunction)e;
+
+							Append(elem.SystemType);
+							Append(elem.Name);
+							Append(elem.Precedence);
+							Append(elem.Parameters);
+
+							break;
+						}
+
+					case QueryElementType.SqlParameter :
+						{
+							var elem = (SqlParameter)e;
+
+							Append(elem.Name);
+							Append(elem.IsQueryParameter);
+							Append((int)elem.DbType);
+							Append(elem.DbSize);
+
+							var type = elem.Value == null ? elem.SystemType : elem.Value.GetType();
+
+							if (elem.Value == null || type.IsArray || type == typeof(string) || !(elem.Value is IEnumerable))
+							{
+								Append(type, elem.Value);
+							}
+							else
+							{
+								var elemType = TypeHelper.GetElementType(type);
+								var value    = ConvertIEnumerableToArray(elem.Value, elemType);
+
+								Append(GetArrayType(elemType), value);
+							}
+
+							break;
+						}
+
+					case QueryElementType.SqlExpression :
+						{
+							var elem = (SqlExpression)e;
+
+							Append(elem.SystemType);
+							Append(elem.Expr);
+							Append(elem.Precedence);
+							Append(elem.Parameters);
+
+							break;
+						}
+
+					case QueryElementType.SqlBinaryExpression :
+						{
+							var elem = (SqlBinaryExpression)e;
+
+							Append(elem.SystemType);
+							Append(elem.Expr1);
+							Append(elem.Operation);
+							Append(elem.Expr2);
+							Append(elem.Precedence);
+
+							break;
+						}
+
+					case QueryElementType.SqlValue :
+						{
+							var elem = (SqlValue)e;
+							Append(elem.SystemType, elem.Value);
+							break;
+						}
+
+					case QueryElementType.SqlDataType :
+						{
+							var elem = (SqlDataType)e;
+
+							Append((int)elem.SqlDbType);
+							Append(elem.Type);
+							Append(elem.Length);
+							Append(elem.Precision);
+							Append(elem.Scale);
+
+							break;
+						}
+
+					case QueryElementType.SqlTable :
+						{
+							var elem = (SqlTable)e;
+
+							Append(elem.SourceID);
+							Append(elem.Name);
+							Append(elem.Alias);
+							Append(elem.Database);
+							Append(elem.Owner);
+							Append(elem.PhysicalName);
+							Append(elem.ObjectType);
+
+							if (elem.SequenceAttributes == null)
+								Builder.Append(" -");
+							else
+							{
+								Append(elem.SequenceAttributes.Length);
+
+								foreach (var a in elem.SequenceAttributes)
+								{
+									Append(a.ProviderName);
+									Append(a.SequenceName);
+								}
+							}
+
+							Append(Dic[elem.All]);
+							Append(elem.Fields.Count);
+
+							foreach (var field in elem.Fields)
+								Append(Dic[field.Value]);
+
+							Append((int)elem.SqlTableType);
+
+							if (elem.SqlTableType != SqlTableType.Table)
+							{
+								if (elem.TableArguments == null)
+									Append(0);
+								else
+								{
+									Append(elem.TableArguments.Length);
+
+									foreach (var expr in elem.TableArguments)
+										Append(Dic[expr]);
+								}
+							}
+
+							break;
+						}
+
+					case QueryElementType.ExprPredicate :
+						{
+							var elem = (SqlQuery.Predicate.Expr)e;
+
+							Append(elem.Expr1);
+							Append(elem.Precedence);
+
+							break;
+						}
+
+					case QueryElementType.NotExprPredicate :
+						{
+							var elem = (SqlQuery.Predicate.NotExpr)e;
+
+							Append(elem.Expr1);
+							Append(elem.IsNot);
+							Append(elem.Precedence);
+
+							break;
+						}
+
+					case QueryElementType.ExprExprPredicate :
+						{
+							var elem = (SqlQuery.Predicate.ExprExpr)e;
+
+							Append(elem.Expr1);
+							Append((int)elem.Operator);
+							Append(elem.Expr2);
+
+							break;
+						}
+
+					case QueryElementType.LikePredicate :
+						{
+							var elem = (SqlQuery.Predicate.Like)e;
+
+							Append(elem.Expr1);
+							Append(elem.IsNot);
+							Append(elem.Expr2);
+							Append(elem.Escape);
+
+							break;
+						}
+
+					case QueryElementType.BetweenPredicate :
+						{
+							var elem = (SqlQuery.Predicate.Between)e;
+
+							Append(elem.Expr1);
+							Append(elem.IsNot);
+							Append(elem.Expr2);
+							Append(elem.Expr3);
+
+							break;
+						}
+
+					case QueryElementType.IsNullPredicate :
+						{
+							var elem = (SqlQuery.Predicate.IsNull)e;
+
+							Append(elem.Expr1);
+							Append(elem.IsNot);
+
+							break;
+						}
+
+					case QueryElementType.InSubQueryPredicate :
+						{
+							var elem = (SqlQuery.Predicate.InSubQuery)e;
+
+							Append(elem.Expr1);
+							Append(elem.IsNot);
+							Append(elem.SubQuery);
+
+							break;
+						}
+
+					case QueryElementType.InListPredicate :
+						{
+							var elem = (SqlQuery.Predicate.InList)e;
+
+							Append(elem.Expr1);
+							Append(elem.IsNot);
+							Append(elem.Values);
+
+							break;
+						}
+
+					case QueryElementType.FuncLikePredicate :
+						{
+							var elem = (SqlQuery.Predicate.FuncLike)e;
+							Append(elem.Function);
+							break;
+						}
+
+					case QueryElementType.SqlQuery :
+						{
+							var elem = (SqlQuery)e;
+
+							Append(elem.SourceID);
+							Append((int)elem.QueryType);
+							Append(elem.From);
+
+							var appendInsert = false;
+							var appendUpdate = false;
+							var appendDelete = false;
+							var appendSelect = false;
+
+							switch (elem.QueryType)
+							{
+								case QueryType.InsertOrUpdate :
+									appendUpdate = true;
+									appendInsert = true;
+									break;
+
+								case QueryType.Update         :
+									appendUpdate = true;
+									break;
+
+								case QueryType.Delete         :
+									appendDelete = true;
+									appendSelect = true;
+									break;
+
+								case QueryType.Insert         :
+									appendInsert = true;
+									if (elem.From.Tables.Count != 0)
+										appendSelect = true;
+									break;
+
+								default                       :
+									appendSelect = true;
+									break;
+							}
+
+							Append(appendInsert); if (appendInsert) Append(elem.Insert);
+							Append(appendUpdate); if (appendUpdate) Append(elem.Update);
+							Append(appendDelete); if (appendDelete) Append(elem.Delete);
+							Append(appendSelect); if (appendSelect) Append(elem.Select);
+
+							Append(elem.Where);
+							Append(elem.GroupBy);
+							Append(elem.Having);
+							Append(elem.OrderBy);
+							Append(elem.ParentSql == null ? 0 : elem.ParentSql.SourceID);
+							Append(elem.IsParameterDependent);
+
+							if (!elem.HasUnion)
+								Builder.Append(" -");
+							else
+								Append(elem.Unions);
+
+							Append(elem.Parameters);
+
+							if (Dic.ContainsKey(elem.All))
+								Append(Dic[elem.All]);
+							else
+								Builder.Append(" -");
+
+							break;
+						}
+
+					case QueryElementType.Column :
+						{
+							var elem = (SqlQuery.Column) e;
+
+							Append(elem.Parent.SourceID);
+							Append(elem.Expression);
+							Append(elem._alias);
+
+							break;
+						}
+
+					case QueryElementType.SearchCondition :
+							Append(((SqlQuery.SearchCondition)e).Conditions);
+							break;
+
+					case QueryElementType.Condition :
+						{
+							var elem = (SqlQuery.Condition)e;
+
+							Append(elem.IsNot);
+							Append(elem.Predicate);
+							Append(elem.IsOr);
+
+							break;
+						}
+
+					case QueryElementType.TableSource :
+						{
+							var elem = (SqlQuery.TableSource)e;
+
+							Append(elem.Source);
+							Append(elem._alias);
+							Append(elem.Joins);
+
+							break;
+						}
+
+					case QueryElementType.JoinedTable :
+						{
+							var elem = (SqlQuery.JoinedTable)e;
+
+							Append((int)elem.JoinType);
+							Append(elem.Table);
+							Append(elem.IsWeak);
+							Append(elem.Condition);
+
+							break;
+						}
+
+					case QueryElementType.SelectClause :
+						{
+							var elem = (SqlQuery.SelectClause)e;
+
+							Append(elem.IsDistinct);
+							Append(elem.SkipValue);
+							Append(elem.TakeValue);
+							Append(elem.Columns);
+
+							break;
+						}
+
+					case QueryElementType.InsertClause :
+						{
+							var elem = (SqlQuery.InsertClause)e;
+
+							Append(elem.Items);
+							Append(elem.Into);
+							Append(elem.WithIdentity);
+
+							break;
+						}
+
+					case QueryElementType.UpdateClause :
+						{
+							var elem = (SqlQuery.UpdateClause)e;
+
+							Append(elem.Items);
+							Append(elem.Keys);
+							Append(elem.Table);
+
+							break;
+						}
+
+					case QueryElementType.DeleteClause :
+						{
+							var elem = (SqlQuery.DeleteClause)e;
+							Append(elem.Table);
+							break;
+						}
+
+					case QueryElementType.SetExpression :
+						{
+							var elem = (SqlQuery.SetExpression)e;
+
+							Append(elem.Column);
+							Append(elem.Expression);
+
+							break;
+						}
+
+					case QueryElementType.FromClause    : Append(((SqlQuery.FromClause)   e).Tables);          break;
+					case QueryElementType.WhereClause   : Append(((SqlQuery.WhereClause)  e).SearchCondition); break;
+					case QueryElementType.GroupByClause : Append(((SqlQuery.GroupByClause)e).Items);           break;
+					case QueryElementType.OrderByClause : Append(((SqlQuery.OrderByClause)e).Items);           break;
+
+					case QueryElementType.OrderByItem :
+						{
+							var elem = (SqlQuery.OrderByItem)e;
+
+							Append(elem.Expression);
+							Append(elem.IsDescending);
+
+							break;
+						}
+
+					case QueryElementType.Union :
+						{
+							var elem = (SqlQuery.Union)e;
+
+							Append(elem.SqlQuery);
+							Append(elem.IsAll);
+
+							break;
+						}
+				}
+
+				Builder.AppendLine();
+			}
+
+			void Append<T>(ICollection<T> exprs)
+				where T : IQueryElement
+			{
+				if (exprs == null)
+					Builder.Append(" -");
+				else
+				{
+					Append(exprs.Count);
+
+					foreach (var e in exprs)
+						Append(Dic[e]);
+				}
+			}
+		}
+
+		#endregion
+
+		#region QueryDeserializer
+
+		public class QueryDeserializer : DeserializerBase
+		{
+			SqlQuery       _query;
+			SqlParameter[] _parameters;
+
+			readonly Dictionary<int,SqlQuery> _queries = new Dictionary<int,SqlQuery>();
+			readonly List<Action>             _actions = new List<Action>();
+
+			public LinqServiceQuery Deserialize(string str)
+			{
+				Str = str;
+
+				while (Parse()) {}
+
+				foreach (var action in _actions)
+					action();
+
+				return new LinqServiceQuery { Query = _query, Parameters = _parameters };
+			}
+
+			bool Parse()
+			{
+				NextLine();
+
+				if (Pos >= Str.Length)
+					return false;
+
+				var obj  = null as object;
+				var idx  = ReadInt(); Pos++;
+				var type = ReadInt(); Pos++;
+
+				switch ((QueryElementType)type)
+				{
+					case (QueryElementType)_paramIndex     : obj = _parameters = ReadArray<SqlParameter>(); break;
+					case (QueryElementType)_typeIndex      : obj = ResolveType(ReadString());               break;
+					case (QueryElementType)_typeArrayIndex : obj = GetArrayType(Read<Type>());              break;
+
+					case QueryElementType.SqlField :
+						{
+							var systemType       = Read<Type>();
+							var name             = ReadString();
+							var physicalName     = ReadString();
+							var nullable         = ReadBool();
+							var primaryKeyOrder  = ReadInt();
+							var isIdentity       = ReadBool();
+							var isUpdatable      = ReadBool();
+							var isInsertable     = ReadBool();
+							var memberMapperType = Read<Type>();
+							var memberMapperName = ReadString();
+							var memberMapper     = memberMapperType == null ? null : Map.GetObjectMapper(memberMapperType)[memberMapperName];
+
+							obj = new SqlField(
+								systemType,
+								name,
+								physicalName,
+								nullable,
+								primaryKeyOrder,
+								isIdentity
+									? new DataAccess.IdentityAttribute()
+									: isInsertable || isUpdatable
+										? new DataAccess.NonUpdatableAttribute(isInsertable, isUpdatable, false)
+										: null,
+								memberMapper);
+
+							break;
+						}
+
+					case QueryElementType.SqlFunction :
+						{
+							var systemType = Read<Type>();
+							var name       = ReadString();
+							var precedence = ReadInt();
+							var parameters = ReadArray<ISqlExpression>();
+
+							obj = new SqlFunction(systemType, name, precedence, parameters);
+
+							break;
+						}
+
+					case QueryElementType.SqlParameter :
+						{
+							var name             = ReadString();
+							var isQueryParameter = ReadBool();
+							var dbType           = (DbType)ReadInt();
+							var dbSize           = ReadInt();
+							var systemType       = Read<Type>();
+							var value            = ReadValue(systemType);
+							//var enumTypes        = ReadList<Type>();
+							//var takeValues       = null as List<int>;
+
+							/*
+							var count = ReadCount();
+
+							if (count != null)
+							{
+								takeValues = new List<int>(count.Value);
+
+								for (var i = 0; i < count; i++)
+									takeValues.Add(ReadInt());
+							}
+
+							var likeStart = ReadString();
+							var likeEnd   = ReadString();
+							*/
+
+							obj = new SqlParameter(systemType, name, value, (MappingSchema)null)
+							{
+								IsQueryParameter = isQueryParameter,
+								DbType           = dbType,
+								DbSize           = dbSize,
+								//EnumTypes        = enumTypes,
+								//TakeValues       = takeValues,
+								//LikeStart        = likeStart,
+								//LikeEnd          = likeEnd,
+							};
+
+							/*
+							if (enumTypes != null && UnresolvedTypes.Count > 0)
+								foreach (var et in enumTypes)
+									if (et == null)
+										throw new LinqException(
+											"Query cannot be deserialized. The possible reason is that the deserializer could not resolve the following types: {0}. Use LinqService.TypeResolver to resolve types.",
+											string.Join(", ", UnresolvedTypes.Select(_ => "'" + _ + "'").ToArray()));
+							*/
+
+							break;
+						}
+
+					case QueryElementType.SqlExpression :
+						{
+							var systemType = Read<Type>();
+							var expr       = ReadString();
+							var precedence = ReadInt();
+							var parameters = ReadArray<ISqlExpression>();
+
+							obj = new SqlExpression(systemType, expr, precedence, parameters);
+
+							break;
+						}
+
+					case QueryElementType.SqlBinaryExpression :
+						{
+							var systemType = Read<Type>();
+							var expr1      = Read<ISqlExpression>();
+							var operation  = ReadString();
+							var expr2      = Read<ISqlExpression>();
+							var precedence = ReadInt();
+
+							obj = new SqlBinaryExpression(systemType, expr1, operation, expr2, precedence);
+
+							break;
+						}
+
+					case QueryElementType.SqlValue :
+						{
+							var systemType = Read<Type>();
+							var value      = ReadValue(systemType);
+
+							obj = new SqlValue(systemType, value);
+
+							break;
+						}
+
+					case QueryElementType.SqlDataType :
+						{
+							var dbType     = (SqlDbType)ReadInt();
+							var systemType = Read<Type>();
+							var length     = ReadInt();
+							var precision  = ReadInt();
+							var scale      = ReadInt();
+
+							obj = new SqlDataType(dbType, systemType, length, precision, scale);
+
+							break;
+						}
+
+					case QueryElementType.SqlTable :
+						{
+							var sourceID           = ReadInt();
+							var name               = ReadString();
+							var alias              = ReadString();
+							var database           = ReadString();
+							var owner              = ReadString();
+							var physicalName       = ReadString();
+							var objectType         = Read<Type>();
+							var sequenceAttributes = null as SequenceNameAttribute[];
+
+							var count = ReadCount();
+
+							if (count != null)
+							{
+								sequenceAttributes = new SequenceNameAttribute[count.Value];
+
+								for (var i = 0; i < count.Value; i++)
+									sequenceAttributes[i] = new SequenceNameAttribute(ReadString(), ReadString());
+							}
+
+							var all    = Read<SqlField>();
+							var fields = ReadArray<SqlField>();
+							var flds   = new SqlField[fields.Length + 1];
+
+							flds[0] = all;
+							Array.Copy(fields, 0, flds, 1, fields.Length);
+
+							var sqlTableType = (SqlTableType)ReadInt();
+							var tableArgs    = sqlTableType == SqlTableType.Table ? null : ReadArray<ISqlExpression>();
+
+							obj = new SqlTable(
+								sourceID, name, alias, database, owner, physicalName, objectType, sequenceAttributes, flds,
+								sqlTableType, tableArgs);
+
+							break;
+						}
+
+					case QueryElementType.ExprPredicate :
+						{
+							var expr1      = Read<ISqlExpression>();
+							var precedence = ReadInt();
+
+							obj = new SqlQuery.Predicate.Expr(expr1, precedence);
+
+							break;
+						}
+
+					case QueryElementType.NotExprPredicate :
+						{
+							var expr1      = Read<ISqlExpression>();
+							var isNot      = ReadBool();
+							var precedence = ReadInt();
+
+							obj = new SqlQuery.Predicate.NotExpr(expr1, isNot, precedence);
+
+							break;
+						}
+
+					case QueryElementType.ExprExprPredicate :
+						{
+							var expr1     = Read<ISqlExpression>();
+							var @operator = (SqlQuery.Predicate.Operator)ReadInt();
+							var expr2     = Read<ISqlExpression>();
+
+							obj = new SqlQuery.Predicate.ExprExpr(expr1, @operator, expr2);
+
+							break;
+						}
+
+					case QueryElementType.LikePredicate :
+						{
+							var expr1  = Read<ISqlExpression>();
+							var isNot  = ReadBool();
+							var expr2  = Read<ISqlExpression>();
+							var escape = Read<ISqlExpression>();
+
+							obj = new SqlQuery.Predicate.Like(expr1, isNot, expr2, escape);
+
+							break;
+						}
+
+					case QueryElementType.BetweenPredicate :
+						{
+							var expr1 = Read<ISqlExpression>();
+							var isNot = ReadBool();
+							var expr2 = Read<ISqlExpression>();
+							var expr3 = Read<ISqlExpression>();
+
+							obj = new SqlQuery.Predicate.Between(expr1, isNot, expr2, expr3);
+
+							break;
+						}
+
+					case QueryElementType.IsNullPredicate :
+						{
+							var expr1 = Read<ISqlExpression>();
+							var isNot = ReadBool();
+
+							obj = new SqlQuery.Predicate.IsNull(expr1, isNot);
+
+							break;
+						}
+
+					case QueryElementType.InSubQueryPredicate :
+						{
+							var expr1    = Read<ISqlExpression>();
+							var isNot    = ReadBool();
+							var subQuery = Read<SqlQuery>();
+
+							obj = new SqlQuery.Predicate.InSubQuery(expr1, isNot, subQuery);
+
+							break;
+						}
+
+					case QueryElementType.InListPredicate :
+						{
+							var expr1  = Read<ISqlExpression>();
+							var isNot  = ReadBool();
+							var values = ReadList<ISqlExpression>();
+
+							obj = new SqlQuery.Predicate.InList(expr1, isNot, values);
+
+							break;
+						}
+
+					case QueryElementType.FuncLikePredicate :
+						{
+							var func = Read<SqlFunction>();
+							obj = new SqlQuery.Predicate.FuncLike(func);
+							break;
+						}
+
+					case QueryElementType.SqlQuery :
+						{
+							var sid                = ReadInt();
+							var queryType          = (QueryType)ReadInt();
+							var from               = Read<SqlQuery.FromClause>();
+							var readInsert         = ReadBool();
+							var insert             = readInsert ? Read<SqlQuery.InsertClause>() : null;
+							var readUpdate         = ReadBool();
+							var update             = readUpdate ? Read<SqlQuery.UpdateClause>() : null;
+							var readDelete         = ReadBool();
+							var delete             = readDelete ? Read<SqlQuery.DeleteClause>() : null;
+							var readSelect         = ReadBool();
+							var select             = readSelect ? Read<SqlQuery.SelectClause>() : new SqlQuery.SelectClause(null);
+							var where              = Read<SqlQuery.WhereClause>();
+							var groupBy            = Read<SqlQuery.GroupByClause>();
+							var having             = Read<SqlQuery.WhereClause>();
+							var orderBy            = Read<SqlQuery.OrderByClause>();
+							var parentSql          = ReadInt();
+							var parameterDependent = ReadBool();
+							var unions             = ReadArray<SqlQuery.Union>();
+							var parameters         = ReadArray<SqlParameter>();
+
+							var query = _query = new SqlQuery(sid) { QueryType = queryType };
+
+							query.Init(
+								insert,
+								update,
+								delete,
+								select,
+								from,
+								where,
+								groupBy,
+								having,
+								orderBy,
+								unions == null ? null : unions.ToList(),
+								null,
+								parameterDependent,
+								parameters.ToList());
+
+							_queries.Add(sid, _query);
+
+							if (parentSql != 0)
+								_actions.Add(() =>
+								{
+									SqlQuery sql;
+									if (_queries.TryGetValue(parentSql, out sql))
+										query.ParentSql = sql;
+								});
+
+							query.All = Read<SqlField>();
+
+							obj = query;
+
+							break;
+						}
+
+					case QueryElementType.Column :
+						{
+							var sid        = ReadInt();
+							var expression = Read<ISqlExpression>();
+							var alias      = ReadString();
+
+							var col = new SqlQuery.Column(null, expression, alias);
+
+							_actions.Add(() => col.Parent = _queries[sid]);
+
+							obj = col;
+
+							break;
+						}
+
+					case QueryElementType.SearchCondition :
+						obj = new SqlQuery.SearchCondition(ReadArray<SqlQuery.Condition>());
+						break;
+
+					case QueryElementType.Condition :
+						obj = new SqlQuery.Condition(ReadBool(), Read<ISqlPredicate>(), ReadBool());
+						break;
+
+					case QueryElementType.TableSource :
+						{
+							var source = Read<ISqlTableSource>();
+							var alias  = ReadString();
+							var joins  = ReadArray<SqlQuery.JoinedTable>();
+
+							obj = new SqlQuery.TableSource(source, alias, joins);
+
+							break;
+						}
+
+					case QueryElementType.JoinedTable :
+						{
+							var joinType  = (SqlQuery.JoinType)ReadInt();
+							var table     = Read<SqlQuery.TableSource>();
+							var isWeak    = ReadBool();
+							var condition = Read<SqlQuery.SearchCondition>();
+
+							obj = new SqlQuery.JoinedTable(joinType, table, isWeak, condition);
+
+							break;
+						}
+
+					case QueryElementType.SelectClause :
+						{
+							var isDistinct = ReadBool();
+							var skipValue  = Read<ISqlExpression>();
+							var takeValue  = Read<ISqlExpression>();
+							var columns    = ReadArray<SqlQuery.Column>();
+
+							obj = new SqlQuery.SelectClause(isDistinct, takeValue, skipValue, columns);
+
+							break;
+						}
+
+					case QueryElementType.InsertClause :
+						{
+							var items = ReadArray<SqlQuery.SetExpression>();
+							var into  = Read<SqlTable>();
+							var wid   = ReadBool();
+
+							var c = new SqlQuery.InsertClause { Into = into, WithIdentity = wid };
+
+							c.Items.AddRange(items);
+							obj = c;
+
+							break;
+						}
+
+					case QueryElementType.UpdateClause :
+						{
+							var items = ReadArray<SqlQuery.SetExpression>();
+							var keys  = ReadArray<SqlQuery.SetExpression>();
+							var table = Read<SqlTable>();
+							//var wid   = ReadBool();
+
+							var c = new SqlQuery.UpdateClause { Table = table };
+
+							c.Items.AddRange(items);
+							c.Keys. AddRange(keys);
+							obj = c;
+
+							break;
+						}
+
+					case QueryElementType.DeleteClause :
+						{
+							var table = Read<SqlTable>();
+							obj = new SqlQuery.DeleteClause { Table = table };
+							break;
+						}
+
+					case QueryElementType.SetExpression : obj = new SqlQuery.SetExpression(Read<ISqlExpression>(), Read<ISqlExpression>()); break;
+					case QueryElementType.FromClause    : obj = new SqlQuery.FromClause(ReadArray<SqlQuery.TableSource>());                 break;
+					case QueryElementType.WhereClause   : obj = new SqlQuery.WhereClause(Read<SqlQuery.SearchCondition>());                 break;
+					case QueryElementType.GroupByClause : obj = new SqlQuery.GroupByClause(ReadArray<ISqlExpression>());                    break;
+					case QueryElementType.OrderByClause : obj = new SqlQuery.OrderByClause(ReadArray<SqlQuery.OrderByItem>());              break;
+
+					case QueryElementType.OrderByItem :
+						{
+							var expression   = Read<ISqlExpression>();
+							var isDescending = ReadBool();
+
+							obj = new SqlQuery.OrderByItem(expression, isDescending);
+
+							break;
+						}
+
+					case QueryElementType.Union :
+						{
+							var sqlQuery = Read<SqlQuery>();
+							var isAll    = ReadBool();
+
+							obj = new SqlQuery.Union(sqlQuery, isAll);
+
+							break;
+						}
+				}
+
+				Dic.Add(idx, obj);
+
+				return true;
+			}
+		}
+
+		#endregion
+
+		#region ResultSerializer
+
+		class ResultSerializer : SerializerBase
+		{
+			public string Serialize(LinqServiceResult result)
+			{
+				Append(result.FieldCount);
+				Append(result.VaryingTypes.Length);
+				Append(result.RowCount);
+				Append(result.QueryID.ToString());
+
+				Builder.AppendLine();
+
+				foreach (var name in result.FieldNames)
+				{
+					Append(name);
+					Builder.AppendLine();
+				}
+
+				foreach (var type in result.FieldTypes)
+				{
+					Append(type.FullName);
+					Builder.AppendLine();
+				}
+
+				foreach (var type in result.VaryingTypes)
+				{
+					Append(type.FullName);
+					Builder.AppendLine();
+				}
+
+				foreach (var data in result.Data)
+				{
+					foreach (var str in data)
+					{
+						if (result.VaryingTypes.Length > 0 && !string.IsNullOrEmpty(str) && str[0] == '\0')
+						{
+							Builder.Append('*');
+							Append((int)str[1]);
+							Append(str.Substring(2));
+						}
+						else
+							Append(str);
+					}
+
+					Builder.AppendLine();
+				}
+
+				return Builder.ToString();
+			}
+		}
+
+		#endregion
+
+		#region ResultDeserializer
+
+		class ResultDeserializer : DeserializerBase
+		{
+			public LinqServiceResult DeserializeResult(string str)
+			{
+				Str = str;
+
+				var fieldCount  = ReadInt();
+				var varTypesLen = ReadInt();
+
+				var result = new LinqServiceResult
+				{
+					FieldCount   = fieldCount,
+					RowCount     = ReadInt(),
+					VaryingTypes = new Type[varTypesLen],
+					QueryID      = new Guid(ReadString()),
+					FieldNames   = new string[fieldCount],
+					FieldTypes   = new Type  [fieldCount],
+					Data         = new List<string[]>(),
+				};
+
+				NextLine();
+
+				for (var i = 0; i < fieldCount;  i++) { result.FieldNames  [i] = ReadString();              NextLine(); }
+				for (var i = 0; i < fieldCount;  i++) { result.FieldTypes  [i] = ResolveType(ReadString()); NextLine(); }
+				for (var i = 0; i < varTypesLen; i++) { result.VaryingTypes[i] = ResolveType(ReadString()); NextLine(); }
+
+				for (var n = 0; n < result.RowCount; n++)
+				{
+					var data = new string[fieldCount];
+
+					for (var i = 0; i < fieldCount; i++)
+					{
+						if (varTypesLen > 0)
+						{
+							Get(' ');
+
+							if (Get('*'))
+							{
+								var idx = ReadInt();
+								data[i] = "\0" + (char)idx + ReadString();
+							}
+							else
+								data[i] = ReadString();
+						}
+						else
+							data[i] = ReadString();
+					}
+
+					result.Data.Add(data);
+
+					NextLine();
+				}
+
+				return result;
+			}
+		}
+
+		#endregion
+
+		#region StringArraySerializer
+
+		class StringArraySerializer : SerializerBase
+		{
+			public string Serialize(string[] data)
+			{
+				Append(data.Length);
+
+				foreach (var str in data)
+					Append(str);
+
+				Builder.AppendLine();
+
+				return Builder.ToString();
+			}
+		}
+
+		#endregion
+
+		#region StringArrayDeserializer
+
+		class StringArrayDeserializer : DeserializerBase
+		{
+			public string[] Deserialize(string str)
+			{
+				Str = str;
+
+				var data = new string[ReadInt()];
+
+				for (var i = 0; i < data.Length; i++)
+					data[i] = ReadString();
+
+				return data;
+			}
+		}
+
+		#endregion
+
+		#region Helpers
+
+		interface IArrayHelper
+		{
+			Type   GetArrayType();
+			object ConvertToArray(object list);
+		}
+
+		class ArrayHelper<T> : IArrayHelper
+		{
+			public Type GetArrayType()
+			{
+				return typeof(T[]);
+			}
+
+			public object ConvertToArray(object list)
+			{
+				return ((IEnumerable<T>)list).ToArray();
+			}
+		}
+
+		static readonly Dictionary<Type,Type>                _arrayTypes      = new Dictionary<Type,Type>();
+		static readonly Dictionary<Type,Func<object,object>> _arrayConverters = new Dictionary<Type,Func<object,object>>();
+
+		static Type GetArrayType(Type elementType)
+		{
+			Type arrayType;
+
+			lock (_arrayTypes)
+			{
+				if (!_arrayTypes.TryGetValue(elementType, out arrayType))
+				{
+					var helper = (IArrayHelper)Activator.CreateInstance(typeof(ArrayHelper<>).MakeGenericType(elementType));
+					_arrayTypes.Add(elementType, arrayType = helper.GetArrayType());
+				}
+			}
+
+			return arrayType;
+		}
+
+		static object ConvertIEnumerableToArray(object list, Type elementType)
+		{
+			Func<object,object> converter;
+
+			lock (_arrayConverters)
+			{
+				if (!_arrayConverters.TryGetValue(elementType, out converter))
+				{
+					var helper = (IArrayHelper)Activator.CreateInstance(typeof(ArrayHelper<>).MakeGenericType(elementType));
+					_arrayConverters.Add(elementType, converter = helper.ConvertToArray);
+				}
+			}
+
+			return converter(list);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ServiceModel/LinqSoapServiceClient.Silverlight.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,150 @@
+using System;
+using System.ServiceModel;
+
+namespace BLToolkit.ServiceModel
+{
+	class LinqSoapServiceClient : ClientBase<Async.ILinqSoapService>, ILinqService, IDisposable
+	{
+		#region Init
+
+		public LinqSoapServiceClient(string endpointConfigurationName)                                            : base(endpointConfigurationName) { }
+		public LinqSoapServiceClient(string endpointConfigurationName, string remoteAddress)                      : base(endpointConfigurationName, remoteAddress) { }
+		public LinqSoapServiceClient(string endpointConfigurationName, EndpointAddress remoteAddress)             : base(endpointConfigurationName, remoteAddress) { }
+		public LinqSoapServiceClient(System.ServiceModel.Channels.Binding binding, EndpointAddress remoteAddress) : base(binding, remoteAddress) { }
+
+		#endregion
+
+		#region ILinqService Members
+
+		public string GetSqlProviderType()
+		{
+			var async = Channel.BeginGetSqlProviderType(null, null);
+			return Channel.EndGetSqlProviderType(async);
+		}
+
+		public int ExecuteNonQuery(string queryData)
+		{
+			var async = Channel.BeginExecuteNonQuery(queryData, null, null);
+			return Channel.EndExecuteNonQuery(async);
+		}
+
+		public object ExecuteScalar(string queryData)
+		{
+			var async = Channel.BeginExecuteScalar(queryData, null, null);
+			return Channel.EndExecuteScalar(async);
+		}
+
+		public string ExecuteReader(string queryData)
+		{
+			var async = Channel.BeginExecuteReader(queryData, null, null);
+			return Channel.EndExecuteReader(async);
+		}
+
+		public int ExecuteBatch(string queryData)
+		{
+			var async = Channel.BeginExecuteBatch(queryData, null, null);
+			return Channel.EndExecuteBatch(async);
+		}
+
+		#endregion
+
+		#region IDisposable Members
+
+		void IDisposable.Dispose()
+		{
+			try
+			{
+				if (State != CommunicationState.Faulted)
+					((ICommunicationObject)this).Close();
+				else
+					Abort();
+			}
+			catch (CommunicationException)
+			{
+				Abort();
+			}
+			catch (TimeoutException)
+			{
+				Abort();
+			}
+			catch (Exception)
+			{
+				Abort();
+				throw;
+			}
+		}
+
+		#endregion
+
+		#region Overrides
+
+		protected override Async.ILinqSoapService CreateChannel()
+		{
+			return new LinqSoapServiceClientChannel(this);
+		}
+
+		#endregion
+
+		#region Channel
+
+		class LinqSoapServiceClientChannel : ChannelBase<Async.ILinqSoapService>, Async.ILinqSoapService
+		{
+			public LinqSoapServiceClientChannel(ClientBase<Async.ILinqSoapService> client) :
+				base(client)
+			{
+			}
+
+			public IAsyncResult BeginGetSqlProviderType(AsyncCallback callback, object asyncState)
+			{
+				return BeginInvoke("GetSqlProviderType", new object[0], callback, asyncState);
+			}
+
+			public string EndGetSqlProviderType(IAsyncResult result)
+			{
+				return (string)EndInvoke("GetSqlProviderType", new object[0], result);
+			}
+
+			public IAsyncResult BeginExecuteNonQuery(string queryData, AsyncCallback callback, object asyncState)
+			{
+				return BeginInvoke("ExecuteNonQuery", new object[] { queryData }, callback, asyncState);
+			}
+
+			public int EndExecuteNonQuery(IAsyncResult result)
+			{
+				return (int)EndInvoke("ExecuteNonQuery", new object[0], result);
+			}
+
+			public IAsyncResult BeginExecuteScalar(string queryData, AsyncCallback callback, object asyncState)
+			{
+				return BeginInvoke("ExecuteScalar", new object[] { queryData }, callback, asyncState);
+			}
+
+			public object EndExecuteScalar(IAsyncResult result)
+			{
+				return EndInvoke("ExecuteScalar", new object[0], result);
+			}
+
+			public IAsyncResult BeginExecuteReader(string queryData, AsyncCallback callback, object asyncState)
+			{
+				return BeginInvoke("ExecuteReader", new object[] { queryData }, callback, asyncState);
+			}
+
+			public string EndExecuteReader(IAsyncResult result)
+			{
+				return (string)EndInvoke("ExecuteReader", new object[0], result);
+			}
+
+			public IAsyncResult BeginExecuteBatch(string queryData, AsyncCallback callback, object asyncState)
+			{
+				return BeginInvoke("ExecuteBatch", new object[] { queryData }, callback, asyncState);
+			}
+
+			public int EndExecuteBatch(IAsyncResult result)
+			{
+				return (int)EndInvoke("ExecuteBatch", new object[0], result);
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ServiceModel/LinqSoapServiceClient.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,75 @@
+using System;
+using System.ServiceModel;
+using System.ServiceModel.Channels;
+
+namespace BLToolkit.ServiceModel
+{
+	class LinqSoapServiceClient : ClientBase<ILinqSoapService>, ILinqService, IDisposable
+	{
+		#region Init
+
+		public LinqSoapServiceClient(string endpointConfigurationName)                                                                  : base(endpointConfigurationName) { }
+		public LinqSoapServiceClient(string endpointConfigurationName, string remoteAddress)                                            : base(endpointConfigurationName, remoteAddress) { }
+		public LinqSoapServiceClient(string endpointConfigurationName, EndpointAddress remoteAddress)                                   : base(endpointConfigurationName, remoteAddress) { }
+		public LinqSoapServiceClient(Binding binding, EndpointAddress remoteAddress)                                                    : base(binding, remoteAddress) { }
+
+		#endregion
+
+		#region ILinqService Members
+
+		public string GetSqlProviderType()
+		{
+			return Channel.GetSqlProviderType();
+		}
+
+		public int ExecuteNonQuery(string queryData)
+		{
+			return Channel.ExecuteNonQuery(queryData);
+		}
+
+		public object ExecuteScalar(string queryData)
+		{
+			return Channel.ExecuteScalar(queryData);
+		}
+
+		public string ExecuteReader(string queryData)
+		{
+			return Channel.ExecuteReader(queryData);
+		}
+
+		public int ExecuteBatch(string queryData)
+		{
+			return Channel.ExecuteBatch(queryData);
+		}
+
+		#endregion
+
+		#region IDisposable Members
+
+		void IDisposable.Dispose()
+		{
+			try
+			{
+				if (State != CommunicationState.Faulted)
+					((ICommunicationObject)this).Close();
+				else
+					Abort();
+			}
+			catch (CommunicationException)
+			{
+				Abort();
+			}
+			catch (TimeoutException)
+			{
+				Abort();
+			}
+			catch (Exception)
+			{
+				Abort();
+				throw;
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ServiceModel/RemoteDataContextBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,276 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq.Expressions;
+using System.Text;
+
+namespace BLToolkit.ServiceModel
+{
+	using Data.Linq;
+	using Data.Sql.SqlProvider;
+	using Mapping;
+
+	public abstract class RemoteDataContextBase : IDataContext
+	{
+		protected abstract ILinqService GetClient();
+		protected abstract IDataContext Clone    ();
+		protected abstract string       ContextIDPrefix { get; }
+
+		string             _contextID;
+		string IDataContext.ContextID
+		{
+			get { return _contextID ?? (_contextID = ContextIDPrefix + SqlProviderType.Name.Replace("SqlProvider", "")); }
+		}
+
+		private MappingSchema _mappingSchema;
+		public  MappingSchema  MappingSchema
+		{
+			get
+			{
+				if (_mappingSchema == null)
+				{
+					var sp = ((IDataContext)this).CreateSqlProvider();
+					_mappingSchema = sp is IMappingSchemaProvider ? ((IMappingSchemaProvider)sp).MappingSchema : Map.DefaultSchema;
+				}
+
+				return _mappingSchema;
+			}
+
+			set { _mappingSchema = value; }
+		}
+
+		private        Type _sqlProviderType;
+		public virtual Type  SqlProviderType
+		{
+			get
+			{
+				if (_sqlProviderType == null)
+				{
+					var client = GetClient();
+
+					try
+					{
+						var type = client.GetSqlProviderType();
+						_sqlProviderType = Type.GetType(type);
+					}
+					finally
+					{
+						((IDisposable)client).Dispose();
+					}
+				}
+
+				return _sqlProviderType;
+			}
+
+			set { _sqlProviderType = value;  }
+		}
+
+		public bool IsMarsEnabled
+		{
+			get { return false; }
+		}
+
+		static readonly Dictionary<Type,Func<ISqlProvider>> _sqlProviders = new Dictionary<Type, Func<ISqlProvider>>();
+
+		Func<ISqlProvider> _createSqlProvider;
+
+		Func<ISqlProvider> IDataContext.CreateSqlProvider
+		{
+			get
+			{
+				if (_createSqlProvider == null)
+				{
+					var type = SqlProviderType;
+
+					if (!_sqlProviders.TryGetValue(type, out _createSqlProvider))
+						lock (_sqlProviderType)
+							if (!_sqlProviders.TryGetValue(type, out _createSqlProvider))
+								_sqlProviders.Add(type, _createSqlProvider = Expression.Lambda<Func<ISqlProvider>>(Expression.New(type)).Compile());
+				}
+
+				return _createSqlProvider;
+			}
+		}
+
+		List<string> _queryBatch;
+		int          _batchCounter;
+
+		public void BeginBatch()
+		{
+			_batchCounter++;
+
+			if (_queryBatch == null)
+				_queryBatch = new List<string>();
+		}
+
+		public void CommitBatch()
+		{
+			if (_batchCounter == 0)
+				throw new InvalidOperationException();
+
+			_batchCounter--;
+
+			if (_batchCounter == 0)
+			{
+				var client = GetClient();
+
+				try
+				{
+					var data = LinqServiceSerializer.Serialize(_queryBatch.ToArray());
+					client.ExecuteBatch(data);
+				}
+				finally
+				{
+					((IDisposable)client).Dispose();
+					_queryBatch = null;
+				}
+			}
+		}
+
+		class QueryContext
+		{
+			public IQueryContext Query;
+			public ILinqService  Client;
+		}
+
+		object IDataContext.SetQuery(IQueryContext queryContext)
+		{
+			return new QueryContext { Query = queryContext };
+		}
+
+		int IDataContext.ExecuteNonQuery(object query)
+		{
+			var ctx  = (QueryContext)query;
+			var q    = ctx.Query.SqlQuery.ProcessParameters();
+			var data = LinqServiceSerializer.Serialize(q, q.IsParameterDependent ? q.Parameters.ToArray() : ctx.Query.GetParameters());
+
+			if (_batchCounter > 0)
+			{
+				_queryBatch.Add(data);
+				return -1;
+			}
+
+			ctx.Client = GetClient();
+
+			return ctx.Client.ExecuteNonQuery(data);
+		}
+
+		object IDataContext.ExecuteScalar(object query)
+		{
+			if (_batchCounter > 0)
+				throw new LinqException("Incompatible batch operation.");
+
+			var ctx = (QueryContext)query;
+
+			ctx.Client = GetClient();
+
+			var q = ctx.Query.SqlQuery.ProcessParameters();
+
+			return ctx.Client.ExecuteScalar(
+				LinqServiceSerializer.Serialize(q, q.IsParameterDependent ? q.Parameters.ToArray() : ctx.Query.GetParameters()));
+		}
+
+		IDataReader IDataContext.ExecuteReader(object query)
+		{
+			if (_batchCounter > 0)
+				throw new LinqException("Incompatible batch operation.");
+
+			var ctx = (QueryContext)query;
+
+			ctx.Client = GetClient();
+
+			var q      = ctx.Query.SqlQuery.ProcessParameters();
+			var ret    = ctx.Client.ExecuteReader(
+				LinqServiceSerializer.Serialize(q, q.IsParameterDependent ? q.Parameters.ToArray() : ctx.Query.GetParameters()));
+			var result = LinqServiceSerializer.DeserializeResult(ret);
+
+			return new ServiceModelDataReader(result);
+		}
+
+		public void ReleaseQuery(object query)
+		{
+			var ctx = (QueryContext)query;
+
+			if (ctx.Client != null)
+				((IDisposable)ctx.Client).Dispose();
+		}
+
+		string IDataContext.GetSqlText(object query)
+		{
+			var ctx         = (QueryContext)query;
+			var sqlProvider = ((IDataContext)this).CreateSqlProvider();
+			var sb          = new StringBuilder();
+
+			sb
+				.Append("-- ")
+				.Append("ServiceModel")
+				.Append(' ')
+				.Append(((IDataContext)this).ContextID)
+				.Append(' ')
+				.Append(sqlProvider.Name)
+				.AppendLine();
+
+			if (ctx.Query.SqlQuery.Parameters != null && ctx.Query.SqlQuery.Parameters.Count > 0)
+			{
+				foreach (var p in ctx.Query.SqlQuery.Parameters)
+					sb
+						.Append("-- DECLARE ")
+						.Append(p.Name)
+						.Append(' ')
+						.Append(p.Value == null ? p.SystemType.ToString() : p.Value.GetType().Name)
+						.AppendLine();
+
+				sb.AppendLine();
+
+				foreach (var p in ctx.Query.SqlQuery.Parameters)
+				{
+					var value = p.Value;
+
+					if (value is string || value is char)
+						value = "'" + value.ToString().Replace("'", "''") + "'";
+
+					sb
+						.Append("-- SET ")
+						.Append(p.Name)
+						.Append(" = ")
+						.Append(value)
+						.AppendLine();
+				}
+
+				sb.AppendLine();
+			}
+
+			var cc       = sqlProvider.CommandCount(ctx.Query.SqlQuery);
+			var commands = new string[cc];
+
+			for (var i = 0; i < cc; i++)
+			{
+				sb.Length = 0;
+
+				sqlProvider.BuildSql(i, ctx.Query.SqlQuery, sb, 0, 0, false);
+				commands[i] = sb.ToString();
+			}
+
+			if (!ctx.Query.SqlQuery.IsParameterDependent)
+				ctx.Query.Context = commands;
+
+			foreach (var command in commands)
+				sb.AppendLine(command);
+
+			return sb.ToString();
+		}
+
+		IDataContext IDataContext.Clone(bool forNestedQuery)
+		{
+			return Clone();
+		}
+
+		public event EventHandler OnClosing;
+
+		public void Dispose()
+		{
+			if (OnClosing != null)
+				OnClosing(this, EventArgs.Empty);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ServiceModel/ServiceModelDataContext.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,102 @@
+using System;
+using System.ServiceModel;
+using System.ServiceModel.Channels;
+
+using JetBrains.Annotations;
+
+namespace BLToolkit.ServiceModel
+{
+	using Data.Linq;
+
+	using NotNullAttribute = NotNullAttribute;
+
+	public class ServiceModelDataContext : RemoteDataContextBase
+	{
+		#region Init
+
+		ServiceModelDataContext()
+		{
+		}
+
+		public ServiceModelDataContext([NotNull] string endpointConfigurationName)
+			: this()
+		{
+			if (endpointConfigurationName == null) throw new ArgumentNullException("endpointConfigurationName");
+
+			_endpointConfigurationName = endpointConfigurationName;
+		}
+
+		public ServiceModelDataContext([NotNull] string endpointConfigurationName, [NotNull] string remoteAddress)
+			: this()
+		{
+			if (endpointConfigurationName == null) throw new ArgumentNullException("endpointConfigurationName");
+			if (remoteAddress             == null) throw new ArgumentNullException("remoteAddress");
+
+			_endpointConfigurationName = endpointConfigurationName;
+			_remoteAddress             = remoteAddress;
+		}
+
+		public ServiceModelDataContext([NotNull] string endpointConfigurationName, [NotNull] EndpointAddress endpointAddress)
+			: this()
+		{
+			if (endpointConfigurationName == null) throw new ArgumentNullException("endpointConfigurationName");
+			if (endpointAddress           == null) throw new ArgumentNullException("endpointAddress");
+
+			_endpointConfigurationName = endpointConfigurationName;
+			_endpointAddress           = endpointAddress;
+		}
+
+		public ServiceModelDataContext([NotNull] Binding binding, [NotNull] EndpointAddress endpointAddress)
+			: this()
+		{
+			if (binding         == null) throw new ArgumentNullException("binding");
+			if (endpointAddress == null) throw new ArgumentNullException("endpointAddress");
+
+			Binding          = binding;
+			_endpointAddress = endpointAddress;
+		}
+
+		string          _endpointConfigurationName;
+		string          _remoteAddress;
+		EndpointAddress _endpointAddress;
+
+		public Binding Binding { get; private set; }
+
+		#endregion
+
+		#region Overrides
+
+		protected override ILinqService GetClient()
+		{
+			if (Binding != null)
+				return new LinqServiceClient(Binding, _endpointAddress);
+
+			if (_endpointAddress != null)
+				return new LinqServiceClient(_endpointConfigurationName, _endpointAddress);
+
+			if (_remoteAddress != null)
+				return new LinqServiceClient(_endpointConfigurationName, _remoteAddress);
+
+			return new LinqServiceClient(_endpointConfigurationName);
+		}
+
+		protected override IDataContext Clone()
+		{
+			return new ServiceModelDataContext
+			{
+				MappingSchema              = MappingSchema,
+				Binding                    = Binding,
+				_endpointConfigurationName = _endpointConfigurationName,
+				_remoteAddress             = _remoteAddress,
+				_endpointAddress           = _endpointAddress,
+			};
+		}
+
+		protected override string ContextIDPrefix
+		{
+			get { return "LinqService_"; }
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ServiceModel/ServiceModelDataReader.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,247 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Globalization;
+
+namespace BLToolkit.ServiceModel
+{
+	using Common;
+
+	class ServiceModelDataReader : IDataReader
+	{
+		public ServiceModelDataReader(LinqServiceResult result)
+		{
+			_result = result;
+
+			for (var i = 0; i < result.FieldNames.Length; i++)
+				_ordinal.Add(result.FieldNames[i], i);
+		}
+
+		readonly LinqServiceResult      _result;
+		readonly Dictionary<string,int> _ordinal = new Dictionary<string,int>();
+
+		string[] _data;
+		int      _current = -1;
+
+		#region IDataReader Members
+
+		public void Close()
+		{
+		}
+
+		public int Depth
+		{
+			get { return 0; }
+		}
+
+#if !SILVERLIGHT
+
+		public DataTable GetSchemaTable()
+		{
+			throw new InvalidOperationException();
+		}
+
+#endif
+
+		public bool IsClosed
+		{
+			get { throw new InvalidOperationException(); }
+		}
+
+		public bool NextResult()
+		{
+			throw new InvalidOperationException();
+		}
+
+		public bool Read()
+		{
+			if (++_current < _result.RowCount)
+			{
+				_data = _result.Data[_current];
+
+				return true;
+			}
+
+			_data = null;
+
+			return false;
+		}
+
+		public int RecordsAffected
+		{
+			get { throw new InvalidOperationException(); }
+		}
+
+		#endregion
+
+		#region IDisposable Members
+
+		public void Dispose()
+		{
+		}
+
+		#endregion
+
+		#region IDataRecord Members
+
+		public int FieldCount
+		{
+			get { return _result.FieldCount; }
+		}
+
+		public bool GetBoolean(int i)
+		{
+			return bool.Parse(_data[i]);
+		}
+
+		public byte GetByte(int i)
+		{
+			return byte.Parse(_data[i]);
+		}
+
+		public long GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length)
+		{
+			throw new InvalidOperationException();
+		}
+
+		public char GetChar(int i)
+		{
+			return _data[i][0];
+		}
+
+		public long GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length)
+		{
+			throw new InvalidOperationException();
+		}
+
+		public IDataReader GetData(int i)
+		{
+			throw new InvalidOperationException();
+		}
+
+		public string GetDataTypeName(int i)
+		{
+			return _result.FieldTypes[i].FullName;
+		}
+
+		public DateTime GetDateTime(int i)
+		{
+			return DateTime.Parse(_data[i], CultureInfo.InvariantCulture);
+		}
+
+		public decimal GetDecimal(int i)
+		{
+			return decimal.Parse(_data[i], CultureInfo.InvariantCulture);
+		}
+
+		public double GetDouble(int i)
+		{
+			return double.Parse(_data[i], CultureInfo.InvariantCulture);
+		}
+
+		public Type GetFieldType(int i)
+		{
+			return _result.FieldTypes[i];
+		}
+
+		public float GetFloat(int i)
+		{
+			return float.Parse(_data[i], CultureInfo.InvariantCulture);
+		}
+
+		public Guid GetGuid(int i)
+		{
+			return new Guid(_data[i]);
+		}
+
+		public short GetInt16(int i)
+		{
+			return short.Parse(_data[i]);
+		}
+
+		public int GetInt32(int i)
+		{
+			return int.Parse(_data[i]);
+		}
+
+		public long GetInt64(int i)
+		{
+			return long.Parse(_data[i]);
+		}
+
+		public string GetName(int i)
+		{
+			return _result.FieldNames[i];
+		}
+
+		public int GetOrdinal(string name)
+		{
+			return _ordinal[name];
+		}
+
+		public string GetString(int i)
+		{
+			return _data[i];
+		}
+
+		public object GetValue(int i)
+		{
+			var type  = _result.FieldTypes[i];
+			var value = _data[i];
+
+			if (_result.VaryingTypes.Length > 0 && !string.IsNullOrEmpty(value) && value[0] == '\0')
+			{
+				type  = _result.VaryingTypes[value[1]];
+				value = value.Substring(2);
+			}
+
+			if (value == null)
+				return null;
+
+			if (type.IsArray && type == typeof(byte[]))
+				return System.Convert.FromBase64String(value);
+
+			switch (Type.GetTypeCode(type))
+			{
+				case TypeCode.String   : return value;
+				case TypeCode.Double   : return double.  Parse(value, CultureInfo.InvariantCulture);
+				case TypeCode.Decimal  : return decimal. Parse(value, CultureInfo.InvariantCulture);
+				case TypeCode.Single   : return float.   Parse(value, CultureInfo.InvariantCulture);
+				case TypeCode.DateTime : return DateTime.Parse(value, CultureInfo.InvariantCulture);
+				case TypeCode.Object   :
+					if (type == typeof(double?))   return double.        Parse(value, CultureInfo.InvariantCulture);
+					if (type == typeof(decimal?))  return decimal.       Parse(value, CultureInfo.InvariantCulture);
+					if (type == typeof(float?))    return float.         Parse(value, CultureInfo.InvariantCulture);
+					if (type == typeof(DateTime?)) return DateTime.      Parse(value, CultureInfo.InvariantCulture);
+
+					if (type == typeof(DateTimeOffset) || type == typeof(DateTimeOffset?))
+						return DateTimeOffset.Parse(value, CultureInfo.InvariantCulture);
+					break;
+			}
+
+			return Convert.ChangeTypeFromString(value, type);
+		}
+
+		public int GetValues(object[] values)
+		{
+			throw new InvalidOperationException();
+		}
+
+		public bool IsDBNull(int i)
+		{
+			return _data[i] == null;
+		}
+
+		public object this[string name]
+		{
+			get { return GetValue(GetOrdinal(name)); }
+		}
+
+		public object this[int i]
+		{
+			get { return GetValue(i); }
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/ServiceModel/SoapDataContext.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,102 @@
+using System;
+using System.ServiceModel;
+using System.ServiceModel.Channels;
+
+using JetBrains.Annotations;
+
+namespace BLToolkit.ServiceModel
+{
+	using Data.Linq;
+
+	using NotNullAttribute = NotNullAttribute;
+
+	public class SoapDataContext : RemoteDataContextBase
+	{
+		#region Init
+
+		SoapDataContext()
+		{
+		}
+
+		public SoapDataContext([NotNull] string endpointConfigurationName)
+			: this()
+		{
+			if (endpointConfigurationName == null) throw new ArgumentNullException("endpointConfigurationName");
+
+			_endpointConfigurationName = endpointConfigurationName;
+		}
+
+		public SoapDataContext([NotNull] string endpointConfigurationName, [NotNull] string remoteAddress)
+			: this()
+		{
+			if (endpointConfigurationName == null) throw new ArgumentNullException("endpointConfigurationName");
+			if (remoteAddress             == null) throw new ArgumentNullException("remoteAddress");
+
+			_endpointConfigurationName = endpointConfigurationName;
+			_remoteAddress             = remoteAddress;
+		}
+
+		public SoapDataContext([NotNull] string endpointConfigurationName, [NotNull] EndpointAddress endpointAddress)
+			: this()
+		{
+			if (endpointConfigurationName == null) throw new ArgumentNullException("endpointConfigurationName");
+			if (endpointAddress           == null) throw new ArgumentNullException("endpointAddress");
+
+			_endpointConfigurationName = endpointConfigurationName;
+			_endpointAddress           = endpointAddress;
+		}
+
+		public SoapDataContext([NotNull] Binding binding, [NotNull] EndpointAddress endpointAddress)
+			: this()
+		{
+			if (binding         == null) throw new ArgumentNullException("binding");
+			if (endpointAddress == null) throw new ArgumentNullException("endpointAddress");
+
+			Binding          = binding;
+			_endpointAddress = endpointAddress;
+		}
+
+		string          _endpointConfigurationName;
+		string          _remoteAddress;
+		EndpointAddress _endpointAddress;
+
+		public Binding Binding { get; private set; }
+
+		#endregion
+
+		#region Overrides
+
+		protected override ILinqService GetClient()
+		{
+			if (Binding != null)
+				return new LinqSoapServiceClient(Binding, _endpointAddress);
+
+			if (_endpointAddress != null)
+				return new LinqSoapServiceClient(_endpointConfigurationName, _endpointAddress);
+
+			if (_remoteAddress != null)
+				return new LinqSoapServiceClient(_endpointConfigurationName, _remoteAddress);
+
+			return new LinqSoapServiceClient(_endpointConfigurationName);
+		}
+
+		protected override IDataContext Clone()
+		{
+			return new SoapDataContext
+			{
+				MappingSchema              = MappingSchema,
+				Binding                    = Binding,
+				_endpointConfigurationName = _endpointConfigurationName,
+				_remoteAddress             = _remoteAddress,
+				_endpointAddress           = _endpointAddress,
+			};
+		}
+
+		protected override string ContextIDPrefix
+		{
+			get { return "LinqSoapService_"; }
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Templates/BLT4Toolkit.ttinclude	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+<#@ include file="T4Toolbox.tt" #>
+<#
+
+	var customToolNamespace = TransformationContext.FindProjectItem(Host.TemplateFile).Properties.Item("CustomToolNamespace").Value;
+
+	if (customToolNamespace != null)
+		Namespace = customToolNamespace.ToString();
+
+	if (string.IsNullOrEmpty(Namespace))
+		Namespace = TransformationContext.DefaultNamespace;
+
+	if (string.IsNullOrEmpty(DataContextName))
+		DataContextName = System.IO.Path.GetFileNameWithoutExtension(Host.TemplateFile);
+
+#>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Templates/BLToolkit.ttinclude	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,643 @@
+<#@ assembly name="System.Core"    #>
+<#@ assembly name="System.Data"    #>
+<#@ import namespace="System.Collections.Generic" #>
+<#@ import namespace="System.Data" #>
+<#@ import namespace="System.Linq" #>
+<#@ import namespace="System.IO"   #>
+<#
+	AppDomain.CurrentDomain.AssemblyResolve += (_,args) =>
+	{
+		foreach (var a in Assemblies)
+			if (args.Name.ToLower().IndexOf(a.Key.ToLower()) >= 0)
+				return System.Reflection.Assembly.LoadFile(a.Value);
+	
+		if (DataProviderAssembly != null && args.Name.Split(',')[0] == System.IO.Path.GetFileNameWithoutExtension(DataProviderAssembly))
+			return System.Reflection.Assembly.LoadFile(DataProviderAssembly);
+
+		return null;
+	};
+#><#+
+
+static Dictionary<string,string> Assemblies = new Dictionary<string,string>();
+
+static Action<GeneratedTextTransformation,string> WriteComment        = (tt,s) => tt.WriteLine("//{0}", s);
+static Action<GeneratedTextTransformation,string> WriteSummary        = (tt,s) => 
+{
+	if (!string.IsNullOrWhiteSpace(s))
+	{
+		tt.WriteLine("/// <summary>");
+		tt.WriteLine("/// {0}", s);
+		tt.WriteLine("/// </summary>");
+	}
+};
+static Action<GeneratedTextTransformation,string> WriteUsing          = (tt,s) => tt.WriteLine("using {0};", s);
+static Action<GeneratedTextTransformation,string> WriteBeginNamespace = (tt,s) => { tt.WriteLine("namespace {0}", s); tt.WriteLine("{"); };
+static Action<GeneratedTextTransformation>        WriteEndNamespace   =  tt    => tt.WriteLine("}");
+static Action<GeneratedTextTransformation,string,string> WriteBeginClass = (tt,cl,bc) =>
+{
+	tt.Write("public partial class {0}", cl);
+	if (!string.IsNullOrEmpty(bc))
+		tt.Write(" : {0}", bc);
+	tt.WriteLine("");
+	tt.WriteLine("{");
+};
+static Action<GeneratedTextTransformation>        WriteEndClass       =  tt   => tt.WriteLine("}");
+static Func<string,string,string>                 MakeGenericType     = (c,t) => string.Format("{0}<{1}>", c, t);
+static Func<string,string>                        MakeType            = t     => t;
+
+delegate void WriteTablePropertyAction(GeneratedTextTransformation tt, string name, string pname, int maxlen, int maxplen, string desc);
+
+static WriteTablePropertyAction WriteTableProperty = (tt,name,pname,maxlen,maxplen,desc) =>
+{
+	WriteSummary(tt,desc);
+	tt.WriteLine("public Table<{0}>{1} {2}{3} {{ get {{ return this.GetTable<{0}>();{1} }} }}", name, tt.LenDiff(maxlen, name), pname, tt.LenDiff(maxplen, pname));
+};
+static Action<GeneratedTextTransformation,string> WriteAttribute      = (tt,a) => tt.Write("[{0}]", a);
+static Action<GeneratedTextTransformation>        WriteAttributeLine  =  tt    => tt.WriteLine("");
+
+static string ConnectionString;
+static string ConnectionType;
+static string DataProviderAssembly = null;
+
+string DatabaseName             = null;
+string DataContextName          = null;
+string Namespace                = "DataModel";
+string BaseDataContextClass     = "DbManager";
+string BaseEntityClass          = null;
+string OneToManyAssociationType = "IEnumerable<{0}>";
+
+string OwnerToInclude           = null;
+string[] DatabaseQuote          = null;
+
+bool   RenderField              = false;
+bool   RenderBackReferences     = true;
+bool   RenderForeignKeys        = true;
+
+bool   IsMetadataLoaded;
+
+int MaxColumnTypeLen;
+int MaxColumnMemberLen;
+
+static Action<GeneratedTextTransformation,Column,int[],string[]> RenderColumn = (tt,c,maxLens,attrs) =>
+{
+	WriteSummary(tt,c.Description);
+	
+	if (maxLens.Sum() > 0)
+	{
+		if (attrs.Any(_ => _ != null))
+		{
+			tt.Write("[");
+
+			for (var i = 0; i < attrs.Length; i++)
+			{
+				if (attrs[i] != null)
+				{
+					tt.Write(attrs[i]);
+					tt.WriteSpace(maxLens[i] - attrs[i].Length);
+
+					if (attrs.Skip(i + 1).Any(_ => _ != null))
+						tt.Write(", ");
+					else if (maxLens.Skip(i + 1).Any(_ => _ > 0))
+						tt.WriteSpace(2);
+				}
+				else if (maxLens[i] > 0)
+				{
+					tt.WriteSpace(maxLens[i]);
+					
+					if (maxLens.Skip(i + 1).Any(_ => _ > 0))
+						tt.WriteSpace(2);
+				}
+			}
+
+			tt.Write("] ");
+		}
+		else
+		{
+			tt.WriteSpace(maxLens.Sum() + (maxLens.Where(_ => _ > 0).Count() - 1) * 2 + 3);
+		}
+	}
+
+	tt.Write("public {0}{1} {2}", c.Type, tt.LenDiff(tt.MaxColumnTypeLen, c.Type), c.MemberName);
+
+	if (tt.RenderField)
+	{
+		tt.Write(";");
+		if (c.ColumnType != null)
+			tt.Write(tt.LenDiff(tt.MaxColumnMemberLen, c.MemberName));
+	}
+	else
+		tt.Write("{0} {{ get; set; }}", tt.LenDiff(tt.MaxColumnMemberLen, c.MemberName));
+
+	if (c.ColumnType != null)
+	{
+		tt.Write(" // {0}", c.ColumnType);
+		
+		if (c.Length != 0)
+			tt.Write("({0})", c.Length);
+
+		if (c.Precision != 0)
+		{
+			if (c.Scale == 0)
+				tt.Write("({0})", c.Precision);
+			else
+				tt.Write("({0},{1})", c.Precision, c.Scale);
+		}
+	}
+
+	tt.WriteLine("");
+};
+
+static Action<GeneratedTextTransformation,ForeignKey> RenderForeignKey = (tt,key) =>
+{
+	WriteComment(tt, " " + key.KeyName);
+	tt.WriteLine("[Association(ThisKey=\"{0}\", OtherKey=\"{1}\", CanBeNull={2})]",
+		string.Join(", ", (from c in key.ThisColumns  select c.MemberName).ToArray()),
+		string.Join(", ", (from c in key.OtherColumns select c.MemberName).ToArray()),
+		key.CanBeNull ? "true" : "false");
+
+	if (key.Attributes.Count > 0)
+	{
+		WriteAttribute(tt, string.Join(", ", key.Attributes.Distinct().ToArray()));
+		WriteAttributeLine(tt);
+	}
+
+	tt.Write("public ");
+
+	if (key.AssociationType == AssociationType.OneToMany)
+		tt.Write(tt.OneToManyAssociationType, key.OtherTable.ClassName);
+	else
+		tt.Write(key.OtherTable.ClassName);
+
+	tt.Write(" ");
+	tt.Write(key.MemberName);
+
+	if (tt.RenderField)
+		tt.WriteLine(";");
+	else
+		tt.WriteLine(" { get; set; }");
+};
+
+static Action<GeneratedTextTransformation,Table, bool> RenderTable = (tt,t, renderForeignKeys) =>
+{
+	WriteSummary(tt,t.Description);
+
+	if (t.IsView)
+	{
+		WriteComment(tt, " View");
+	}
+
+	RenderTableAttributes(tt, t);
+
+	WriteBeginClass(tt, t.ClassName, t.BaseClassName);
+	
+	tt.PushIndent("\t");
+
+	if (t.Columns.Count > 0)
+	{
+		tt.MaxColumnTypeLen   = t.Columns.Values.Max(_ => _.Type.Length);
+		tt.MaxColumnMemberLen = t.Columns.Values.Max(_ => _.MemberName.Length);
+
+		var maxLens = new int[]
+		{
+			t.Columns.Values.Max(_ => _.MemberName == _.ColumnName ? 0 : "MapField('')".Length + _.ColumnName.Length),
+			t.Columns.Values.Max(_ => _.IsNullable                 ? "Nullable".Length : _.IsIdentity ? "Identity".Length : 0),
+			t.Columns.Values.Max(_ => _.IsIdentity && _.IsNullable ? "Identity".Length : 0),
+			t.Columns.Values.Max(_ => _.IsPrimaryKey               ? string.Format("PrimaryKey({0})", _.PKIndex).Length : 0),
+			t.Columns.Values.Max(_ => _.Attributes.Count == 0      ? 0 : string.Join(", ", _.Attributes.Distinct().ToArray()).Length),
+		};
+
+		foreach (var c in from c in t.Columns.Values orderby c.ID select c)
+		{
+			var attrs = new string[]
+			{
+				c.MemberName == c.ColumnName ? null : string.Format("MapField(\"{0}\")", c.ColumnName),
+				c.IsNullable                 ? "Nullable" : c.IsIdentity ? "Identity" : null,
+				c.IsIdentity && c.IsNullable ? "Identity" : null,
+				c.IsPrimaryKey               ? string.Format("PrimaryKey({0})", c.PKIndex) : null,
+				c.Attributes.Count == 0      ? null : string.Join(", ", c.Attributes.Distinct().ToArray()),
+			};
+
+			RenderColumn(tt, c, maxLens, attrs);
+		}
+	}
+
+	if (renderForeignKeys && t.ForeignKeys.Count > 0)
+	{
+		foreach (var key in t.ForeignKeys.Values.Where(k => tt.RenderBackReferences || k.BackReference != null))
+		{
+			tt.WriteLine("");
+			RenderForeignKey(tt, key);
+		}
+	}
+
+	tt.PopIndent();
+	WriteEndClass(tt);
+};
+
+static Action<GeneratedTextTransformation,Table> RenderTableAttributes = (tt,t) =>
+{
+	if (t.Attributes.Count > 0)
+	{
+		WriteAttribute(tt, string.Join(", ", t.Attributes.Distinct().ToArray()));
+		WriteAttributeLine(tt);
+	}
+
+	string tbl = "TableName(";
+
+	if (!string.IsNullOrEmpty(tt.DatabaseName))
+		tbl += string.Format("Database=\"{0}\", ", tt.DatabaseName);
+
+	if (!string.IsNullOrEmpty(t.Owner))
+		tbl += string.Format("Owner=\"{0}\", ", t.Owner);
+
+	tbl += string.Format("Name=\"{0}\")", t.TableName);
+
+	WriteAttribute(tt, tbl);
+	WriteAttributeLine(tt);
+};
+
+List<string> Usings = new List<string>()
+{
+	"System",
+	"BLToolkit.Data",
+	"BLToolkit.Data.Linq",
+	"BLToolkit.DataAccess",
+	"BLToolkit.Mapping",
+};
+
+static Action<GeneratedTextTransformation> RenderUsing = tt =>
+{
+	var q =
+		from ns in tt.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(tt, ns);
+
+		tt.WriteLine("");
+	}
+};
+
+Action<GeneratedTextTransformation> BeforeGenerateModel = _ => {};
+Action<GeneratedTextTransformation> AfterGenerateModel  = _ => {};
+
+Action<GeneratedTextTransformation> BeforeWriteTableProperty = _ => {};
+Action<GeneratedTextTransformation> AfterWriteTableProperty  = _ => {};
+
+void GenerateModel()
+{
+	if (ConnectionString != null) ConnectionString = ConnectionString.Trim();
+	if (DataContextName  != null) DataContextName  = DataContextName. Trim();
+
+	if (string.IsNullOrEmpty(ConnectionString)) { Error("ConnectionString cannot be empty."); return; }
+
+	if (string.IsNullOrEmpty(DataContextName))
+		DataContextName = "DataContext";
+
+	LoadMetadata();
+
+	BeforeGenerateModel(this);
+
+	WriteComment(this, "---------------------------------------------------------------------------------------------------");
+	WriteComment(this, " <auto-generated>");
+	WriteComment(this, "    This code was generated by BLToolkit template for T4.");
+	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, "---------------------------------------------------------------------------------------------------");
+
+	RenderUsing(this);
+
+	WriteBeginNamespace(this, Namespace);
+	PushIndent("\t");
+
+	WriteBeginClass(this, DataContextName, BaseDataContextClass);
+
+	var tlist   = (from t in Tables.Values orderby t.TableName select t).ToList();
+	var maxlen  = tlist.Max(_ => _.ClassName.Length);
+	var maxplen = tlist.Max(_ => (_.DataContextPropertyName ?? _.ClassName).Length);
+
+	PushIndent("\t");
+
+	BeforeWriteTableProperty(this);
+
+	foreach (var t in tlist)
+		WriteTableProperty(this, t.ClassName, t.DataContextPropertyName ?? t.ClassName, maxlen, maxplen, t.Description);
+
+	AfterWriteTableProperty(this);
+
+	PopIndent();
+
+	WriteEndClass(this);
+
+	foreach (var t in tlist)
+	{
+		WriteLine("");
+		RenderTable(this, t, RenderForeignKeys);
+	}
+
+	PopIndent();
+	WriteEndNamespace(this);
+
+	AfterGenerateModel(this);
+}
+
+string LenDiff(int max, string str)
+{
+	var s = "";
+
+	while (max-- > str.Length)
+		s += " ";
+
+	return s;
+}
+
+void WriteSpace(int len)
+{
+	while (len-- > 0)
+		Write(" ");
+}
+
+List<T> CreateList<T>(T item)
+{
+	return new List<T>();
+}
+
+Func<System.Data.IDbConnection> GetConnectionObject = () =>
+{
+	Type connType = null;
+
+	if (DataProviderAssembly != null)
+	{
+		try
+		{
+			var assembly = System.Reflection.Assembly.LoadFile(DataProviderAssembly);
+			connType = assembly.GetType(ConnectionType) 
+				?? assembly.GetType(ConnectionType.Substring(0, ConnectionType.IndexOf(",")));
+		}
+		catch
+		{
+		}
+	}
+
+	if (connType == null)
+		connType = Type.GetType(ConnectionType);
+
+	return (System.Data.IDbConnection)Activator.CreateInstance(connType);
+};
+
+System.Data.IDbConnection GetConnection()
+{
+	var conn = GetConnectionObject();
+
+	conn.ConnectionString = ConnectionString;
+	conn.Open();
+
+	return conn;
+}
+
+void LoadMetadata()
+{
+	if (IsMetadataLoaded)
+		return;
+
+	IsMetadataLoaded = true;
+
+	if (!string.IsNullOrEmpty(DataProviderAssembly) && !DataProviderAssembly.Contains(":") && DataProviderAssembly.Contains(".."))
+	{
+		try
+		{
+			string path = this.Host.ResolvePath("");
+			DataProviderAssembly = Path.GetFullPath(Path.Combine(path, DataProviderAssembly));
+		}
+		catch 
+		{
+		}
+	}
+
+	BeforeLoadMetadata(this);
+	LoadServerMetadata();
+
+	if (DatabaseQuote != null)
+	{
+		foreach (var t in Tables.Values)
+		{
+			t.TableName = string.Format("{1}{0}{2}", t.TableName, DatabaseQuote.FirstOrDefault(), DatabaseQuote.Skip(1).FirstOrDefault() ?? DatabaseQuote.FirstOrDefault());
+			foreach (var c in t.Columns.Values)
+			{
+				c.ColumnName = string.Format("{1}{0}{2}", c.ColumnName, DatabaseQuote.FirstOrDefault(), DatabaseQuote.Skip(1).FirstOrDefault() ?? DatabaseQuote.FirstOrDefault());
+			}
+		}
+	}
+
+	foreach (var t in Tables.Values)
+	{
+		if (t.ClassName.Contains(" "))
+		{
+			var ss = t.ClassName.Split(' ').Where(_ => _.Trim().Length > 0).Select(_ => char.ToUpper(_[0]) + _.Substring(1));
+			t.ClassName = string.Join("", ss.ToArray());
+		}
+	}
+
+	foreach (var t in Tables.Values)
+		foreach (var key in t.ForeignKeys.Values.ToList())
+			if (!key.KeyName.EndsWith("_BackReference"))
+				key.OtherTable.ForeignKeys.Add(key.KeyName + "_BackReference", key.BackReference = new ForeignKey
+				{
+					KeyName         = key.KeyName    + "_BackReference",
+					MemberName      = key.MemberName + "_BackReference",
+					AssociationType = AssociationType.Auto,
+					OtherTable      = t,
+					ThisColumns     = key.OtherColumns,
+					OtherColumns    = key.ThisColumns,
+				});
+
+	foreach (var t in Tables.Values)
+	{
+		foreach (var key in t.ForeignKeys.Values)
+		{
+			if (key.BackReference != null && key.AssociationType == AssociationType.Auto)
+			{
+				if (key.ThisColumns.All(_ => _.IsPrimaryKey))
+				{
+					if (t.Columns.Values.Count(_ => _.IsPrimaryKey) == key.ThisColumns.Count)
+						key.AssociationType = AssociationType.OneToOne;
+					else
+						key.AssociationType = AssociationType.ManyToOne;
+				}
+				else
+					key.AssociationType = AssociationType.ManyToOne;
+
+				key.CanBeNull = key.ThisColumns.All(_ => _.IsNullable);
+			}
+		}
+	}
+
+	foreach (var t in Tables.Values)
+	{
+		foreach (var key in t.ForeignKeys.Values)
+		{
+			var name = key.MemberName;
+
+			if (key.BackReference != null && key.ThisColumns.Count == 1 && key.ThisColumns[0].MemberName.ToLower().EndsWith("id"))
+			{
+				name = key.ThisColumns[0].MemberName;
+				name = name.Substring(0, name.Length - "id".Length);
+
+				if (!t.ForeignKeys.Values.Select(_ => _.MemberName).Concat(
+					 t.Columns.    Values.Select(_ => _.MemberName)).Concat(
+					 new[] { t.ClassName }).Any(_ => _ == name))
+				{
+					name = key.MemberName;;
+				}
+			}
+			
+			if (name == key.MemberName)
+			{
+				if (name.StartsWith("FK_"))
+					name = name.Substring(3);
+
+				if (name.EndsWith("_BackReference"))
+					name = name.Substring(0, name.Length - "_BackReference".Length);
+
+				name = string.Join("", name.Split('_').Where(_ => _.Length > 0 && _ != t.TableName).ToArray());
+
+				if (name.Length > 0)
+					name = key.AssociationType == AssociationType.OneToMany ? PluralizeAssociationName(name) : SingularizeAssociationName(name);
+			}
+
+			if (name.Length != 0 &&
+				!t.ForeignKeys.Values.Select(_ => _.MemberName).Concat(
+				 t.Columns.    Values.Select(_ => _.MemberName)).Concat(
+				 new[] { t.ClassName }).Any(_ => _ == name))
+			{
+				key.MemberName = name;
+			}
+		}
+	}
+
+	if (Tables.Values.SelectMany(_ => _.ForeignKeys.Values).Any(_ => _.AssociationType == AssociationType.OneToMany))
+		Usings.Add("System.Collections.Generic");
+
+	var 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"
+	};
+
+	foreach (var t in Tables.Values)
+	{
+		if (keyWords.Contains(t.ClassName))
+			t.ClassName = "@" + t.ClassName;
+
+		if (keyWords.Contains(t.DataContextPropertyName))
+			t.DataContextPropertyName = "@" + t.DataContextPropertyName;
+
+		foreach (var col in t.Columns.Values)
+			if (keyWords.Contains(col.MemberName))
+				col.MemberName = "@" + col.MemberName;
+	}
+
+
+	AfterLoadMetadata(this);
+}
+
+Func<string,string> PluralizeAssociationName   = _ => _ + "s";
+Func<string,string> SingularizeAssociationName = _ => _;
+
+Action<GeneratedTextTransformation> BeforeLoadMetadata = _ => {};
+Action<GeneratedTextTransformation> AfterLoadMetadata  = _ => {};
+
+Dictionary<string,Table> Tables = new Dictionary<string,Table>();
+
+public partial class Table
+{
+	public string       Owner;
+	public string       TableName;
+	public string       ClassName;
+	public string       DataContextPropertyName;
+	public string       BaseClassName;
+	public bool         IsView;
+	public string		Description;
+	public List<string> Attributes = new List<string>();
+
+	public Dictionary<string,Column>     Columns     = new Dictionary<string,Column>();
+	public Dictionary<string,ForeignKey> ForeignKeys = new Dictionary<string,ForeignKey>();
+}
+
+public partial class Column
+{
+	public int          ID;
+	public string       ColumnName; // Column name in database
+	public string       MemberName; // Member name of the generated class
+	public bool         IsNullable;
+	public bool         IsIdentity;
+	public string       Type;       // Type of the generated member
+	public string       ColumnType; // Type of the column in database
+	public bool         IsClass;
+	public DbType       DbType;
+	public SqlDbType    SqlDbType;
+	public long         Length;
+	public int          Precision;
+	public int          Scale;
+	public string		Description;
+
+	public int          PKIndex = -1;
+	public List<string> Attributes = new List<string>();
+
+	public bool IsPrimaryKey { get { return PKIndex >= 0; } }
+}
+
+public enum AssociationType
+{
+	Auto,
+	OneToOne,
+	OneToMany,
+	ManyToOne,
+}
+
+public partial class ForeignKey
+{
+	public string       KeyName;
+	public string       MemberName;
+	public Table        OtherTable;
+	public List<Column> ThisColumns  = new List<Column>();
+	public List<Column> OtherColumns = new List<Column>();
+	public List<string> Attributes   = new List<string>();
+	public bool         CanBeNull    = true;
+	public ForeignKey   BackReference;
+
+	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;
+				}
+			}
+		}
+	}
+}
+
+#>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Templates/BLToolkitConstants.Revision.cs.template	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+// Autogenerated. Do not modify!
+
+namespace BLToolkit
+{
+	partial class BLToolkitConstants
+	{
+		// <summary>
+		// Revision component of version.
+		// <summary>
+		public const string Revision = "$WCREV$";
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Templates/MSSQL.ttinclude	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,424 @@
+<#
+	ConnectionType = typeof(System.Data.SqlClient.SqlConnection).AssemblyQualifiedName;
+#><#+
+private void LoadServerMetadata()
+{
+	var tables  = CreateList(new { ID = "", Table  = new Table() });
+	var columns = CreateList(new { ID = "", Column = new Column() });
+
+	using (var conn = GetConnection())
+	using (var cmd  = conn.CreateCommand())
+	{
+		// Load tables & views.
+		//
+		string s = @"
+			SELECT
+				TABLE_CATALOG + '.' + TABLE_SCHEMA + '.' + TABLE_NAME AS TABLE_FULLNAME,
+				TABLE_SCHEMA,
+				TABLE_NAME,
+				TABLE_TYPE,
+				ISNULL(CONVERT(varchar(8000), x.Value), '') AS TABLE_DESC
+			FROM
+				INFORMATION_SCHEMA.TABLES s
+				LEFT JOIN 
+					sys.tables t 
+				ON 
+					OBJECT_ID(TABLE_CATALOG + '.' + TABLE_SCHEMA + '.' + TABLE_NAME) = t.object_id
+				LEFT JOIN 
+					sys.extended_properties x 
+				ON 
+					OBJECT_ID(TABLE_CATALOG + '.' + TABLE_SCHEMA + '.' + TABLE_NAME) = x.major_id AND 
+					x.minor_id = 0 AND 
+					x.name = 'MS_Description'
+			WHERE {0}
+			(
+				t.object_id IS NULL OR
+				t.is_ms_shipped <> 1 AND
+				(
+					SELECT 
+						major_id 
+					FROM 
+						sys.extended_properties 
+					WHERE
+						major_id = t.object_id and 
+						minor_id = 0           and 
+						class    = 1           and 
+						name     = N'microsoft_database_tools_support'
+					) IS NULL
+			)";
+
+		if (string.IsNullOrWhiteSpace(OwnerToInclude))
+			cmd.CommandText = string.Format(s, "");
+		else
+			cmd.CommandText = string.Format(s, " TABLE_SCHEMA = '" + OwnerToInclude + "' AND ");
+
+		using (var rd = cmd.ExecuteReader())
+		{
+			while (rd.Read())
+			{
+				var t = new
+				{
+					ID    = Convert.ToString(rd[0]),
+					Table = new Table
+					{
+						Owner         = rd[1].ToString(),
+						TableName     = rd[2].ToString(),
+						ClassName     = rd[2].ToString(),
+						IsView        = rd[3].ToString() == "VIEW",
+						BaseClassName = BaseEntityClass,
+						Description   = Convert.ToString(rd[4]),
+					}
+				};
+
+				tables.Add(t);
+			}
+		}
+
+		// Load columns.
+		//
+		s = @"
+			SELECT
+				(TABLE_CATALOG + '.' + TABLE_SCHEMA + '.' + TABLE_NAME) as id,
+				(CASE WHEN IS_NULLABLE = 'YES' THEN 1 ELSE 0 END)         as isNullable,
+				ORDINAL_POSITION         as colid,
+				COLUMN_NAME              as name,
+				c.DATA_TYPE              as dataType,
+				CHARACTER_MAXIMUM_LENGTH as length, 
+				ISNULL(NUMERIC_PRECISION, DATETIME_PRECISION) AS prec,
+				NUMERIC_SCALE            as scale,
+				COLUMNPROPERTY(object_id('[' + TABLE_SCHEMA + '].[' + TABLE_NAME + ']'), COLUMN_NAME, 'IsIdentity') as isIdentity,
+				ISNULL(CONVERT(varchar(8000), x.Value), '') AS COLUMN_DESC
+			FROM
+				INFORMATION_SCHEMA.COLUMNS c
+			  LEFT JOIN 
+				sys.extended_properties x 
+			  ON 
+				OBJECT_ID(TABLE_CATALOG + '.' + TABLE_SCHEMA + '.' + TABLE_NAME) = x.major_id AND 
+				ORDINAL_POSITION = x.minor_id AND 
+				x.name = 'MS_Description'
+			{0}";
+
+		if(string.IsNullOrWhiteSpace(OwnerToInclude))
+			cmd.CommandText = string.Format(s, "");
+		else
+			cmd.CommandText = string.Format(s, "WHERE TABLE_SCHEMA = '" + OwnerToInclude + "' ");
+
+		using (var rd = cmd.ExecuteReader())
+		{
+			while (rd.Read())
+			{
+				var col = new
+				{
+					ID     = Convert.ToString(rd["id"]),
+					Column = new Column
+					{
+						ID         = Convert.ToInt16  (rd["colid"]),
+						ColumnName = Convert.ToString (rd["name"]),
+						MemberName = Convert.ToString (rd["name"]),
+						ColumnType = Convert.ToString (rd["dataType"]),
+						IsNullable = Convert.ToBoolean(rd["isNullable"]),
+						IsIdentity = Convert.ToBoolean(rd["isIdentity"]),
+						Length     = rd.IsDBNull(rd.GetOrdinal("length")) ? 0 : Convert.ToInt64(rd["length"]),
+						Precision  = rd.IsDBNull(rd.GetOrdinal("prec"))   ? 0 : Convert.ToInt32(rd["prec"]),
+						Scale      = rd.IsDBNull(rd.GetOrdinal("scale"))  ? 0 : Convert.ToInt32(rd["scale"]),
+						Description = Convert.ToString(rd["COLUMN_DESC"]),
+					}
+				};
+
+				var c = col.Column;
+
+				switch (c.ColumnType)
+				{
+					case "image"            : c.Type = "byte[]";         c.DbType = DbType.Binary;         c.SqlDbType = SqlDbType.Image;            break;
+					case "text"             : c.Type = "string";         c.DbType = DbType.String;         c.SqlDbType = SqlDbType.Text;             break;
+					case "binary"           : c.Type = "byte[]";         c.DbType = DbType.Binary;         c.SqlDbType = SqlDbType.Binary;           break;
+					case "tinyint"          : c.Type = "byte";           c.DbType = DbType.Byte;           c.SqlDbType = SqlDbType.TinyInt;          break;
+					case "date"             : c.Type = "DateTime";       c.DbType = DbType.Date;           c.SqlDbType = SqlDbType.Date;             break;
+					case "time"             : c.Type = "DateTime";       c.DbType = DbType.Time;           c.SqlDbType = SqlDbType.Time;             break;
+					case "bit"              : c.Type = "bool";           c.DbType = DbType.Boolean;        c.SqlDbType = SqlDbType.Bit;              break;
+					case "smallint"         : c.Type = "short";          c.DbType = DbType.Int16;          c.SqlDbType = SqlDbType.SmallInt;         break;
+					case "decimal"          : c.Type = "decimal";        c.DbType = DbType.Decimal;        c.SqlDbType = SqlDbType.Decimal;          break;
+					case "int"              : c.Type = "int";            c.DbType = DbType.Int32;          c.SqlDbType = SqlDbType.Int;              break;
+					case "smalldatetime"    : c.Type = "DateTime";       c.DbType = DbType.DateTime;       c.SqlDbType = SqlDbType.SmallDateTime;    break;
+					case "real"             : c.Type = "float";          c.DbType = DbType.Single;         c.SqlDbType = SqlDbType.Real;             break;
+					case "money"            : c.Type = "decimal";        c.DbType = DbType.Currency;       c.SqlDbType = SqlDbType.Money;            break;
+					case "datetime"         : c.Type = "DateTime";       c.DbType = DbType.DateTime;       c.SqlDbType = SqlDbType.DateTime;         break;
+					case "float"            : c.Type = "double";         c.DbType = DbType.Double;         c.SqlDbType = SqlDbType.Float;            break;
+					case "numeric"          : c.Type = "decimal";        c.DbType = DbType.Decimal;        c.SqlDbType = SqlDbType.Decimal;          break;
+					case "smallmoney"       : c.Type = "decimal";        c.DbType = DbType.Currency;       c.SqlDbType = SqlDbType.SmallMoney;       break;
+					case "datetime2"        : c.Type = "DateTime";       c.DbType = DbType.DateTime2;      c.SqlDbType = SqlDbType.DateTime2;        break;
+					case "bigint"           : c.Type = "long";           c.DbType = DbType.Int64;          c.SqlDbType = SqlDbType.BigInt;           break;
+					case "varbinary"        : c.Type = "byte[]";         c.DbType = DbType.Binary;         c.SqlDbType = SqlDbType.VarBinary;        break;
+					case "timestamp"        : c.Type = "byte[]";         c.DbType = DbType.Binary;         c.SqlDbType = SqlDbType.Timestamp;        break;
+					case "sysname"          : c.Type = "string";         c.DbType = DbType.String;         c.SqlDbType = SqlDbType.NVarChar;         break;
+					case "nvarchar"         : c.Type = "string";         c.DbType = DbType.String;         c.SqlDbType = SqlDbType.NVarChar;         break;
+					case "varchar"          : c.Type = "string";         c.DbType = DbType.AnsiString;     c.SqlDbType = SqlDbType.VarChar;          break;
+					case "ntext"            : c.Type = "string";         c.DbType = DbType.String;         c.SqlDbType = SqlDbType.NText;            break;
+					case "uniqueidentifier" : c.Type = "Guid";           c.DbType = DbType.Binary;         c.SqlDbType = SqlDbType.UniqueIdentifier; break;
+					case "datetimeoffset"   : c.Type = "DateTimeOffset"; c.DbType = DbType.DateTimeOffset; c.SqlDbType = SqlDbType.DateTimeOffset;   break;
+					case "sql_variant"      : c.Type = "object";         c.DbType = DbType.Binary;         c.SqlDbType = SqlDbType.Variant;          break;
+					case "xml"              : c.Type = "string";         c.DbType = DbType.Xml;            c.SqlDbType = SqlDbType.Xml;              break;
+
+					case "char" :
+						c.Type      = Convert.ToInt32 (rd["length"]) == 1 ? "char" : "string";
+						c.DbType    = DbType.AnsiStringFixedLength;
+						c.SqlDbType = SqlDbType.Char;
+						break;
+
+					case "nchar" :
+						c.Type      = Convert.ToInt32 (rd["length"]) == 1 ? "char" : "string";
+						c.DbType    = DbType.StringFixedLength;
+						c.SqlDbType = SqlDbType.NChar;
+						break;
+
+					//hierarchyid
+					//geometry
+					//geography
+					default                 : c.Type = "byte[]";         c.DbType = DbType.Binary;         c.SqlDbType = SqlDbType.Binary;           break;
+				}
+
+				switch (c.Type)
+				{
+					case "string" :
+					case "object" :
+					case "byte[]" : c.IsClass = true; break;
+				}
+
+				if (c.IsNullable && !c.IsClass)
+					c.Type += "?";
+
+				columns.Add(col);
+			}
+		}
+
+		// Load PKs.
+		//
+		s = @"
+			SELECT
+				(k.TABLE_CATALOG + '.' + k.TABLE_SCHEMA + '.' + k.TABLE_NAME) as id,
+				k.CONSTRAINT_NAME                                             as name,
+				k.COLUMN_NAME                                                 as colname,
+				k.ORDINAL_POSITION                                            as colid
+			FROM
+				INFORMATION_SCHEMA.KEY_COLUMN_USAGE k
+			  JOIN 
+				INFORMATION_SCHEMA.TABLE_CONSTRAINTS c 
+			  ON 
+				k.CONSTRAINT_CATALOG = c.CONSTRAINT_CATALOG AND 
+				k.CONSTRAINT_SCHEMA = c.CONSTRAINT_SCHEMA AND 
+				k.CONSTRAINT_NAME = c.CONSTRAINT_NAME
+			WHERE
+				c.CONSTRAINT_TYPE='PRIMARY KEY' 
+				{0}";
+
+		if (string.IsNullOrWhiteSpace(OwnerToInclude))
+			cmd.CommandText = string.Format(s, "");
+		else
+			cmd.CommandText = string.Format(s, "AND k.TABLE_SCHEMA = '" + OwnerToInclude + "' ");
+
+		using (var rd = cmd.ExecuteReader())
+		{
+			while (rd.Read())
+			{
+				var id      = Convert.ToString(rd["id"]);
+				var colid   = Convert.ToInt32 (rd["colid"]);
+				var colname = Convert.ToString(rd["colname"]);
+
+				columns.Single(_ => _.ID == id && _.Column.ColumnName == colname).Column.PKIndex = colid;
+			}
+		}
+
+		// Load FKs.
+		//
+		s = @"
+			SELECT
+				rc.CONSTRAINT_NAME  as Name, 
+				fk.TABLE_CATALOG + '.' + fk.TABLE_SCHEMA + '.' + fk.TABLE_NAME as ThisTable,
+				fk.COLUMN_NAME      as ThisColumn,
+				pk.TABLE_CATALOG + '.' + pk.TABLE_SCHEMA + '.' + pk.TABLE_NAME as OtherTable,
+				pk.COLUMN_NAME      as OtherColumn,
+				cu.ORDINAL_POSITION as Ordinal
+			FROM
+				INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
+			  JOIN 
+				INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE fk
+					ON
+						rc.CONSTRAINT_CATALOG        = fk.CONSTRAINT_CATALOG AND
+				rc.CONSTRAINT_SCHEMA		 = fk.CONSTRAINT_SCHEMA AND
+						rc.CONSTRAINT_NAME           = fk.CONSTRAINT_NAME
+			  JOIN 
+				INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE pk
+					ON
+						rc.UNIQUE_CONSTRAINT_CATALOG = pk.CONSTRAINT_CATALOG AND
+				rc.UNIQUE_CONSTRAINT_SCHEMA	 = pk.CONSTRAINT_SCHEMA AND
+						rc.UNIQUE_CONSTRAINT_NAME    = pk.CONSTRAINT_NAME
+			  JOIN 
+				INFORMATION_SCHEMA.KEY_COLUMN_USAGE cu
+					ON
+				rc.CONSTRAINT_CATALOG = cu.CONSTRAINT_CATALOG AND
+				rc.CONSTRAINT_SCHEMA = cu.CONSTRAINT_SCHEMA AND
+						rc.CONSTRAINT_NAME = cu.CONSTRAINT_NAME
+			{0}
+			ORDER BY
+				ThisTable,
+				Ordinal";
+
+		if (string.IsNullOrWhiteSpace(OwnerToInclude))
+			cmd.CommandText = string.Format(s, "");
+		else
+			cmd.CommandText = string.Format(s, "WHERE fk.TABLE_SCHEMA = '" + OwnerToInclude + "' ");
+
+		using (var rd = cmd.ExecuteReader())
+		{
+			while (rd.Read())
+			{
+				var name            = Convert.ToString(rd["Name"]);
+				var thisTableID     = Convert.ToString(rd["ThisTable"]);
+				var otherTableID    = Convert.ToString(rd["OtherTable"]);
+				var thisColumnName  = Convert.ToString(rd["ThisColumn"]);
+				var otherColumnName = Convert.ToString(rd["OtherColumn"]);
+
+				var thisTable   = (from t in tables  where t.ID == thisTableID  select t.Table).Single();
+				var otherTable  = (from t in tables  where t.ID == otherTableID select t.Table).Single();
+				var thisColumn  = (from c in columns where c.ID == thisTableID  && c.Column.ColumnName == thisColumnName  select c.Column).Single();
+				var otherColumn = (from c in columns where c.ID == otherTableID && c.Column.ColumnName == otherColumnName select c.Column).Single();
+
+				if (thisTable.ForeignKeys.ContainsKey(name) == false)
+					thisTable.ForeignKeys.Add(name, new ForeignKey { KeyName = name, MemberName = name, OtherTable = otherTable });
+
+				var key = thisTable.ForeignKeys[name];
+
+				key.ThisColumns. Add(thisColumn);
+				key.OtherColumns.Add(otherColumn);
+			}
+		}
+	}
+
+	var qc =
+		from c in columns
+		group c by c.ID into gr
+		join t in tables on gr.Key equals t.ID
+		select new { t.Table, gr };
+
+	foreach (var c in qc)
+	{
+		foreach (var col in from col in c.gr orderby col.Column.ID select col.Column)
+			c.Table.Columns.Add(col.ColumnName, col);
+
+		if (c.Table.Owner == "dbo")
+		{
+			c.Table.Owner = null;
+			Tables.Add(c.Table.TableName, c.Table);
+		}
+		else
+		{
+			Tables.Add(c.Table.Owner + "." + c.Table.TableName, c.Table);
+		}
+	}
+
+	{
+		Usings.Add("System.Collections.Generic");
+		Usings.Add("System.Linq");
+		Usings.Add("System.Linq.Expressions");
+		Usings.Add("System.Reflection");
+		Usings.Add("System.Text");
+		Usings.Add("BLToolkit.Data.DataProvider");
+		Usings.Add("BLToolkit.Data.Sql");
+		Usings.Add("BLToolkit.Data.Sql.SqlProvider");
+
+		var mssqlAfterWriteTableProperty = AfterWriteTableProperty;
+
+		AfterWriteTableProperty = tt =>
+		{
+			mssqlAfterWriteTableProperty(tt);
+
+			tt.WriteLine(@"
+#region FreeTextTable
+
+public class FreeTextKey<T>
+{
+	public T   Key;
+	public int Rank;
+}
+
+class FreeTextTableExpressionAttribute : TableExpressionAttribute
+{
+	public FreeTextTableExpressionAttribute()
+		: base("""")
+	{
+	}
+
+	public override void SetTable(SqlTable table, MemberInfo member, IEnumerable<Expression> expArgs, IEnumerable<ISqlExpression> sqlArgs)
+	{
+		var aargs  = sqlArgs.ToArray();
+		var arr    = ConvertArgs(member, aargs).ToList();
+		var method = (MethodInfo)member;
+		var sp     = new MsSql2008SqlProvider();
+
+		{
+			var ttype  = method.GetGenericArguments()[0];
+			var tbl    = new SqlTable(ttype);
+
+			var database     = tbl.Database     == null ? null : sp.Convert(tbl.Database,     ConvertType.NameToDatabase).  ToString();
+			var owner        = tbl.Owner        == null ? null : sp.Convert(tbl.Owner,        ConvertType.NameToOwner).     ToString();
+			var physicalName = tbl.PhysicalName == null ? null : sp.Convert(tbl.PhysicalName, ConvertType.NameToQueryTable).ToString();
+
+			var name   = sp.BuildTableName(new StringBuilder(), database, owner, physicalName);
+
+			arr.Add(new SqlExpression(name.ToString(), Precedence.Primary));
+		}
+
+		{
+			var field = ((ConstantExpression)expArgs.First()).Value;
+
+			if (field is string)
+			{
+				arr[0] = new SqlExpression(field.ToString(), Precedence.Primary);
+			}
+			else if (field is LambdaExpression)
+			{
+				var body = ((LambdaExpression)field).Body;
+
+				if (body is MemberExpression)
+				{
+					var name = ((MemberExpression)body).Member.Name;
+
+					name = sp.Convert(name, ConvertType.NameToQueryField).ToString();
+
+					arr[0] = new SqlExpression(name, Precedence.Primary);
+				}
+			}
+		}
+
+		table.SqlTableType   = SqlTableType.Expression;
+		table.Name           = ""FREETEXTTABLE({6}, {2}, {3}) {1}"";
+		table.TableArguments = arr.ToArray();
+	}
+}
+
+[FreeTextTableExpressionAttribute]
+public Table<FreeTextKey<TKey>> FreeTextTable<TTable,TKey>(string field, string text)
+{
+	return this.GetTable<FreeTextKey<TKey>>(
+		this,
+		((MethodInfo)(MethodBase.GetCurrentMethod())).MakeGenericMethod(typeof(TTable), typeof(TKey)),
+		field,
+		text);
+}
+
+[FreeTextTableExpressionAttribute]
+public Table<FreeTextKey<TKey>> FreeTextTable<TTable,TKey>(Expression<Func<TTable,string>> fieldSelector, string text)
+{
+	return this.GetTable<FreeTextKey<TKey>>(
+		this,
+		((MethodInfo)(MethodBase.GetCurrentMethod())).MakeGenericMethod(typeof(TTable), typeof(TKey)),
+		fieldSelector,
+		text);
+}
+
+#endregion");
+
+		};
+	}
+}
+#>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Templates/MySql.ttinclude	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,307 @@
+<#
+	ConnectionType = "MySql.Data.MySqlClient.MySqlConnection, MySql.Data";
+#><#+
+
+private void LoadServerMetadata()
+{
+	var tables  = CreateList(new { ID = "", Table  = new Table() });
+	var columns = CreateList(new { ID = "", Column = new Column() });
+
+	using (var conn = GetConnection())
+	using (var cmd  = conn.CreateCommand())
+	{
+		string schemasToSkip = "'information_schema', 'cr_debug', 'mysql'";
+		
+		// Load tables & views.
+		//
+		
+		cmd.CommandText = "SELECT DATABASE()";
+		_databaseName = Convert.ToString(cmd.ExecuteScalar());
+		
+		cmd.CommandText = string.Format(@"
+			SELECT 
+				CONCAT(TABLE_SCHEMA, '.', TABLE_NAME),
+				TABLE_SCHEMA,
+				TABLE_NAME,
+				TABLE_TYPE 
+			FROM
+				INFORMATION_SCHEMA.tables
+			WHERE 
+				TABLE_SCHEMA NOT IN ({0}) AND 
+				TABLE_TYPE IN ('BASE TABLE', 'VIEW')
+				{1}",
+			schemasToSkip,
+			GetDatabaseSqlFilter(""));
+		
+		using (var rd = cmd.ExecuteReader())
+		{
+			while (rd.Read())
+			{
+				var t = new
+				{
+					ID    = Convert.ToString(rd[0]),
+					Table = new Table
+					{
+						Owner         			= null, // there is no concept of table owner in MySql
+						TableName     			= rd[2].ToString(),
+						ClassName     			= rd[2].ToString(),
+						DataContextPropertyName	= rd[2].ToString(),
+						IsView        			= rd[3].ToString() == "VIEW",
+						BaseClassName 			= BaseEntityClass,
+					}
+				};
+
+				tables.Add(t);
+			}
+		}
+
+		cmd.CommandText = "SELECT @@session.sql_mode";
+		string sqlMode = Convert.ToString(cmd.ExecuteScalar());
+		
+		// Load columns.
+		//
+		cmd.CommandText = string.Format(@"
+			SELECT
+				CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)           as id,
+				CASE WHEN IS_NULLABLE = 'YES' THEN 1 ELSE 0 END as isNullable,
+				ORDINAL_POSITION         as colid,
+				COLUMN_NAME              as name,
+				c.DATA_TYPE              as dataType,
+				CHARACTER_MAXIMUM_LENGTH as length, 
+				NUMERIC_PRECISION        as prec,
+				NUMERIC_SCALE            as scale,
+				EXTRA = 'auto_increment' as isIdentity,
+ 				c.COLUMN_TYPE            as columnType,
+				COLUMN_DEFAULT           as columnDefault,
+				EXTRA                    as extra
+			FROM
+				INFORMATION_SCHEMA.COLUMNS c
+			WHERE
+				TABLE_SCHEMA NOT IN ({0})
+				{1}",
+			schemasToSkip,
+			GetDatabaseSqlFilter(""));
+		
+		using (var rd = cmd.ExecuteReader())
+		{
+			while (rd.Read())
+			{
+				var col = new
+				{
+					ID     = Convert.ToString(rd["id"]),
+					Column = new Column
+					{
+						ID            = Convert.ToInt16  (rd["colid"]),
+						ColumnName    = Convert.ToString (rd["name"]),
+						MemberName    = Convert.ToString (rd["name"]),
+						ColumnType    = Convert.ToString (rd["dataType"]),
+						IsNullable    = Convert.ToBoolean(rd["isNullable"]),
+						IsIdentity    = Convert.ToBoolean(rd["isIdentity"]),
+						Length        = rd.IsDBNull(rd.GetOrdinal("length")) ? 0 : Convert.ToInt64(rd["length"]),
+						Precision     = rd.IsDBNull(rd.GetOrdinal("prec"))   ? 0 : Convert.ToInt32(rd["prec"]),
+						Scale         = rd.IsDBNull(rd.GetOrdinal("scale"))  ? 0 : Convert.ToInt32(rd["scale"]),
+						ColumnDefault = Convert.ToString(rd["columnDefault"]),
+						Extra         = Convert.ToString(rd["extra"]).ToUpper()
+					}
+				};
+
+				var c           = col.Column;
+				var columnType  = Convert.ToString(rd["columnType"]).ToLower();
+				var unsigned    = columnType.Contains("unsigned");
+				var realAsFloat = sqlMode.ToLower().Contains("real_as_float");
+
+				switch (c.ColumnType)
+				{
+					case "longtext"   :
+					case "mediumtext" :
+					case "tinytext"   :
+					case "text"       : c.Type = "string";   c.DbType = DbType.String;   c.SqlDbType = SqlDbType.Text;      break;
+					case "binary"     : c.Type = "byte[]";   c.DbType = DbType.Binary;   c.SqlDbType = SqlDbType.Binary;    break;
+					case "date"       : c.Type = "DateTime"; c.DbType = DbType.Date;     c.SqlDbType = SqlDbType.Date;      break;
+					case "time"       : c.Type = "DateTime"; c.DbType = DbType.Time;     c.SqlDbType = SqlDbType.Time;      break;
+					case "bit"        : c.Type = "bool";     c.DbType = DbType.Boolean;  c.SqlDbType = SqlDbType.Bit;       break;
+					case "numeric"    :
+					case "decimal"    :
+					case "dec"        :
+					case "fixed"      : c.Type = "decimal";  c.DbType = DbType.Decimal;  c.SqlDbType = SqlDbType.Decimal;   break;
+					case "datetime"   : c.Type = "DateTime"; c.DbType = DbType.DateTime; c.SqlDbType = SqlDbType.DateTime;  break;
+					case "float"      : c.Type = "float";    c.DbType = DbType.Single;   c.SqlDbType = SqlDbType.Float;     break;
+					case "double"     : c.Type = "double";   c.DbType = DbType.Double;   c.SqlDbType = SqlDbType.Float;     break;
+					case "varbinary"  : c.Type = "byte[]";   c.DbType = DbType.Binary;   c.SqlDbType = SqlDbType.VarBinary; break;
+					case "varchar"    : c.Type = "string";   c.DbType = DbType.String;   c.SqlDbType = SqlDbType.VarChar;   break;
+					case "year"       : c.Type = "DateTime"; c.DbType = DbType.Date;     c.SqlDbType = SqlDbType.Date;      break;
+					case "enum"       :
+					case "set"        : c.Type = "string";   c.DbType = DbType.String;   c.SqlDbType = SqlDbType.VarChar;   break;
+					case "bool"       :
+					case "boolean"    : c.Type = "bool";     c.DbType = DbType.Boolean;  c.SqlDbType = SqlDbType.Bit;       break;
+					case "serial"     : c.Type = "ulong";    c.DbType = DbType.UInt64;   c.SqlDbType = SqlDbType.BigInt;    break;
+					case "mediumblob" :
+					case "longblob"   :
+					case "blob"       : c.Type = "byte[]";   c.DbType = DbType.Binary;   c.SqlDbType = SqlDbType.Image;     break;
+					case "tinyblob"   : c.Type = "byte[]";   c.DbType = DbType.Binary;   c.SqlDbType = SqlDbType.Binary;    break;
+
+					case "smallint"   : c.Type = unsigned    ? "ushort" : "short"; c.DbType = unsigned ?    DbType.UInt16 : DbType.Int16;  c.SqlDbType = SqlDbType.SmallInt; break;
+					case "mediumint"  :
+					case "int"        :
+					case "integer"    : c.Type = unsigned    ? "uint"  : "int";    c.DbType = unsigned    ? DbType.UInt32 : DbType.Int32;  c.SqlDbType = SqlDbType.Int;      break;
+					case "real"       : c.Type = realAsFloat ? "float" : "double"; c.DbType = realAsFloat ? DbType.Single : DbType.Double; c.SqlDbType = SqlDbType.Real;     break;
+					case "bigint"     : c.Type = unsigned    ? "ulong" : "long";   c.DbType = unsigned    ? DbType.UInt64 : DbType.Int64;  c.SqlDbType = SqlDbType.BigInt;   break;
+					case "char"       : c.Type = "string";   c.DbType = DbType.StringFixedLength; c.SqlDbType = SqlDbType.Char; break;
+					case "timestamp"  :
+						c.Type = "DateTime";
+						c.DbType = DbType.DateTime;
+						c.SqlDbType = SqlDbType.Timestamp;
+						
+						if(c.ColumnDefault == "CURRENT_TIMESTAMP" || c.Extra.Contains("ON UPDATE CURRENT_TIMESTAMP"))
+						{
+							c.Attributes.Add(string.Format(
+								"NonUpdatable(OnInsert = {0}, OnUpdate = {1})",
+								c.ColumnDefault == "CURRENT_TIMESTAMP" ? "true" : "false",
+								c.Extra.Contains("ON UPDATE CURRENT_TIMESTAMP") ? "true" : "false"));
+						}
+						break;
+					case "tinyint"    :
+						if(columnType == "tinyint(1)")
+						{
+							c.Type = "bool";
+							c.DbType = DbType.Boolean;
+							c.SqlDbType = SqlDbType.Bit;
+						}
+						else
+						{
+							c.Type = unsigned ? "byte" : "sbyte";
+							c.DbType = unsigned ? DbType.Byte : DbType.SByte;
+							c.SqlDbType = SqlDbType.TinyInt;
+						}
+						break;
+					default           :
+						throw new System.IO.InvalidDataException(string.Format("Unknown column type: {0}.", c.ColumnType));
+				}
+
+				switch (c.Type)
+				{
+					case "string" :
+					case "byte[]" : c.IsClass = true; break;
+				}
+
+				if (c.IsNullable && !c.IsClass)
+					c.Type += "?";
+					
+				columns.Add(col);
+			}
+		}
+
+		// Load PKs.
+		//
+		cmd.CommandText = string.Format(@"
+			SELECT
+				CONCAT(k.TABLE_SCHEMA, '.', k.TABLE_NAME) as id,
+				k.CONSTRAINT_NAME                         as name,
+				k.COLUMN_NAME                             as colname,
+				k.ORDINAL_POSITION                        as colid
+			FROM
+				INFORMATION_SCHEMA.KEY_COLUMN_USAGE k
+					JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS c ON k.CONSTRAINT_NAME = c.CONSTRAINT_NAME
+			WHERE
+				c.CONSTRAINT_TYPE='PRIMARY KEY' AND
+				k.TABLE_SCHEMA NOT IN ({0})
+				{1}
+			GROUP BY id, colid",
+			schemasToSkip,
+			GetDatabaseSqlFilter("k"));
+			
+		using (var rd = cmd.ExecuteReader())
+		{
+			while (rd.Read())
+			{
+				var id      = Convert.ToString(rd["id"]);
+				var colid   = Convert.ToInt32 (rd["colid"]);
+				var colname = Convert.ToString(rd["colname"]);
+
+				columns.Single(_ => _.ID == id && _.Column.ColumnName == colname).Column.PKIndex = colid;
+			}
+		}
+
+		// Load FKs.
+		//
+		cmd.CommandText = string.Format(@"
+			SELECT
+				CONSTRAINT_NAME  as Name, 
+				CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) as ThisTable,
+				COLUMN_NAME      as ThisColumn,
+				CONCAT(REFERENCED_TABLE_SCHEMA, '.', REFERENCED_TABLE_NAME) as OtherTable,
+				REFERENCED_COLUMN_NAME      as OtherColumn,
+				ORDINAL_POSITION as Ordinal
+			FROM
+				INFORMATION_SCHEMA.key_column_usage
+			WHERE 
+				TABLE_SCHEMA NOT IN ({0}) AND
+				REFERENCED_TABLE_NAME IS NOT NULL AND
+    			REFERENCED_COLUMN_NAME IS NOT NULL
+    			{1}
+			ORDER BY
+				ThisTable,
+				Ordinal",
+			schemasToSkip,
+			GetDatabaseSqlFilter(""));
+
+		if(!string.IsNullOrEmpty(DatabaseName))
+			cmd.CommandText += string.Format(" AND TABLE_SCHEMA = '{0}' ", DatabaseName);
+
+		using (var rd = cmd.ExecuteReader())
+		{
+			while (rd.Read())
+			{
+				var name            = Convert.ToString(rd["Name"]);
+				var thisTableID     = Convert.ToString(rd["ThisTable"]);
+				var otherTableID    = Convert.ToString(rd["OtherTable"]);
+				var thisColumnName  = Convert.ToString(rd["ThisColumn"]);
+				var otherColumnName = Convert.ToString(rd["OtherColumn"]);
+
+				var thisTable   = (from t in tables  where t.ID == thisTableID  select t.Table).Single();
+				var otherTable  = (from t in tables  where t.ID == otherTableID select t.Table).Single();
+				var thisColumn  = (from c in columns where c.ID == thisTableID  && c.Column.ColumnName == thisColumnName  select c.Column).Single();
+				var otherColumn = (from c in columns where c.ID == otherTableID && c.Column.ColumnName == otherColumnName select c.Column).Single();
+
+				if (thisTable.ForeignKeys.ContainsKey(name) == false)
+					thisTable.ForeignKeys.Add(name, new ForeignKey { KeyName = name, MemberName = name, OtherTable = otherTable });
+
+				var key = thisTable.ForeignKeys[name];
+
+				key.ThisColumns. Add(thisColumn);
+				key.OtherColumns.Add(otherColumn);
+			}
+		}
+	}
+
+	var qc =
+		from c in columns
+		group c by c.ID into gr
+		join t in tables on gr.Key equals t.ID
+		select new { t.Table, gr };
+
+	foreach (var c in qc)
+	{
+		foreach (var col in from col in c.gr orderby col.Column.ID select col.Column)
+			c.Table.Columns.Add(col.ColumnName, col);
+
+		// there is no concept of table owner in MySql so we just use table name
+		Tables.Add(c.Table.TableName, c.Table);
+	}
+}
+
+private string _databaseName;
+private string GetDatabaseSqlFilter(string optionalTablePrefix)
+{
+	if(string.IsNullOrEmpty(_databaseName)) return "";
+	string tablePrefix = string.IsNullOrEmpty(optionalTablePrefix) ? "" : optionalTablePrefix + ".";
+	return string.Format(" AND {0}TABLE_SCHEMA = '{1}' ", tablePrefix, _databaseName);
+}
+
+public partial class Column
+{
+	public string ColumnDefault;
+	public string Extra;
+}
+
+#>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Templates/PluralSingular.ttinclude	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,556 @@
+<#@ import namespace="System" #>
+<#@ import namespace="System.Collections.Generic" #>
+<#@ import namespace="System.Text" #>
+<#@ import namespace="System.Text.RegularExpressions" #>
+<#
+	{
+		var psPrevAfterLoadMetadata = AfterLoadMetadata;
+
+		AfterLoadMetadata = _ =>
+		{
+			psPrevAfterLoadMetadata(_);
+
+			if (PluralizeDataContextPropertyNames || SingularizeDataContextPropertyNames)
+			{
+				foreach (var t in Tables.Values)
+				{
+					var propName = t.DataContextPropertyName ?? t.ClassName ?? t.TableName;
+					var newName  = PluralizeDataContextPropertyNames ? ToPlural(propName) : ToSingular(propName);
+
+					t.DataContextPropertyName = newName;
+				}
+			}
+
+			if (PluralizeClassNames || SingularizeClassNames)
+			{
+				foreach (var t in Tables.Values)
+				{
+					var className = t.ClassName ?? t.TableName;
+					var newName   = PluralizeClassNames ? ToPlural(className) : ToSingular(className);
+
+					t.ClassName = newName;
+				}
+			}
+		};
+
+		PluralizeAssociationName   = ToPlural;
+		SingularizeAssociationName = ToSingular;
+	}
+
+#><#+
+
+bool PluralizeClassNames                 = false;
+bool SingularizeClassNames               = true;
+bool PluralizeDataContextPropertyNames   = true;
+bool SingularizeDataContextPropertyNames = false;
+
+string ToPlural(string str)
+{
+	var word    = GetLastWord(str);
+	var newWord = Plurals.ToPlural(word);
+
+	if (word != newWord)
+	{
+		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;
+}
+
+string ToSingular(string str)
+{
+	var word    = GetLastWord(str);
+	var newWord = Plurals.ToSingular(word);
+
+	if (word != newWord)
+	{
+		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;
+}
+
+string GetLastWord(string word)
+{
+	if (string.IsNullOrEmpty(word))
+		return word;
+
+	var len = word.Length;
+	var n   = len - 1;
+
+	if (char.IsLower(word[n]))
+	{
+		for (; n > 0 && char.IsLower(word[n]); n--);
+	}
+	else
+	{
+		for (; n > 0 && char.IsUpper(word[n]); n--);
+		if (char.IsLower(word[n]))
+			n++;
+	}
+
+	return n > 0 ? word.Substring(n) : word;
+}
+
+// Shamelessly jacked from http://www.bennysutton.com/C-sharp/Plural-Singular-Words.aspx with little modifications.
+//
+
+//using System;
+//using System.Collections.Generic;
+//using System.Text;
+//using System.Text.RegularExpressions;
+
+/// <summary>
+/// Convert words to and from singulars/plurals
+/// Copyright www.BennySutton.com 2008
+/// You may reuse this code BUT not for sale AND ONLY with credit to www.BennySutton.com
+/// </summary>
+public sealed class Plurals
+{
+	/// <summary>
+	/// Store irregular plurals in a dictionary
+	/// </summary>
+	private static Dictionary<string, string> _dictionary = new Dictionary<string, string>();
+
+	#region Constructors
+	
+	/// <summary>
+	/// The singleton instance (thanks to dotnetpearls.com for help here)
+	/// </summary>
+	static readonly Plurals _instance = new Plurals();
+	/// <summary>
+	/// Get an instance of the structure singleton. This effectively caches the dictionary 
+	/// </summary>
+	public static Plurals Instance
+	{
+		get
+		{
+			// Fastest solution that avoids null check and is thread-safe
+			// because of readonly keyword.
+			return _instance;
+		}
+	}
+	
+	/// <summary>
+	/// Run initialization on this singleton class
+	/// </summary>
+	private Plurals()
+	{
+		Initialize();
+	}
+
+	private void Initialize()
+	{
+		//to test that this class only initializes once uncomment next line
+		//System.Web.HttpContext.Current.Response.Write("initializing singleton <br>");
+		// irregular plurals
+		_dictionary.Add("access",       "accesses");
+		_dictionary.Add("afterlife",    "afterlives");
+		_dictionary.Add("alga",         "algae");
+		_dictionary.Add("alumna",       "alumnae");
+		_dictionary.Add("alumnus",      "alumni");
+		_dictionary.Add("analysis",     "analyses");
+		_dictionary.Add("antenna",      "antennae");
+		_dictionary.Add("appendix",     "appendices");
+		_dictionary.Add("axis",         "axes");
+		_dictionary.Add("bacillus",     "bacilli");
+		_dictionary.Add("basis",        "bases");
+		_dictionary.Add("Bedouin",      "Bedouin");
+		_dictionary.Add("cactus",       "cacti");
+		_dictionary.Add("calf",         "calves");
+		_dictionary.Add("cherub",       "cherubim");
+		_dictionary.Add("child",        "children");
+		_dictionary.Add("cod",          "cod");
+		_dictionary.Add("cookie",       "cookies");
+		_dictionary.Add("criterion",    "criteria");
+		_dictionary.Add("curriculum",   "curricula");
+		_dictionary.Add("data",         "data");
+		_dictionary.Add("deer",         "deer");
+		_dictionary.Add("diagnosis",    "diagnoses");
+		_dictionary.Add("die",          "dice");
+		_dictionary.Add("dormouse",     "dormice");
+		_dictionary.Add("elf",          "elves");
+		_dictionary.Add("elk",          "elk");
+		_dictionary.Add("erratum",      "errata");
+		_dictionary.Add("esophagus",    "esophagi");
+		_dictionary.Add("fauna",        "faunae");
+		_dictionary.Add("fish",         "fish");
+		_dictionary.Add("flora",        "florae");
+		_dictionary.Add("focus",        "foci");
+		_dictionary.Add("foot",         "feet");
+		_dictionary.Add("formula",      "formulae");
+		_dictionary.Add("fundus",       "fundi");
+		_dictionary.Add("fungus",       "fungi");
+		_dictionary.Add("genie",        "genii");
+		_dictionary.Add("genus",        "genera");
+		_dictionary.Add("goose",        "geese");
+		_dictionary.Add("grouse",       "grouse");
+		_dictionary.Add("hake",         "hake");
+		_dictionary.Add("half",         "halves");
+		_dictionary.Add("headquarters", "headquarters");
+		_dictionary.Add("hippo",        "hippos");
+		_dictionary.Add("hippopotamus", "hippopotami");
+		_dictionary.Add("hoof",         "hooves");
+		_dictionary.Add("housewife",    "housewives");
+		_dictionary.Add("hypothesis",   "hypotheses");
+		_dictionary.Add("index",        "indices");
+		_dictionary.Add("jackknife",    "jackknives");
+		_dictionary.Add("knife",        "knives");
+		_dictionary.Add("labium",       "labia");
+		_dictionary.Add("larva",        "larvae");
+		_dictionary.Add("leaf",         "leaves");
+		_dictionary.Add("life",         "lives");
+		_dictionary.Add("loaf",         "loaves");
+		_dictionary.Add("louse",        "lice");
+		_dictionary.Add("magus",        "magi");
+		_dictionary.Add("man",          "men");
+		_dictionary.Add("memorandum",   "memoranda");
+		_dictionary.Add("midwife",      "midwives");
+		_dictionary.Add("millennium",   "millennia");
+		_dictionary.Add("moose",        "moose");
+		_dictionary.Add("mouse",        "mice");
+		_dictionary.Add("nebula",       "nebulae");
+		_dictionary.Add("neurosis",     "neuroses");
+		_dictionary.Add("nova",         "novas");
+		_dictionary.Add("nucleus",      "nuclei");
+		_dictionary.Add("oesophagus",   "oesophagi");
+		_dictionary.Add("offspring",    "offspring");
+		_dictionary.Add("ovum",         "ova");
+		_dictionary.Add("ox",           "oxen");
+		_dictionary.Add("papyrus",      "papyri");
+		_dictionary.Add("passerby",     "passersby");
+		_dictionary.Add("penknife",     "penknives");
+		_dictionary.Add("person",       "people");
+		_dictionary.Add("phenomenon",   "phenomena");
+		_dictionary.Add("placenta",     "placentae");
+		_dictionary.Add("pocketknife",  "pocketknives");
+		_dictionary.Add("process",      "processes");
+		_dictionary.Add("pupa",         "pupae");
+		_dictionary.Add("radius",       "radii");
+		_dictionary.Add("reindeer",     "reindeer");
+		_dictionary.Add("retina",       "retinae");
+		_dictionary.Add("rhinoceros",   "rhinoceros");
+		_dictionary.Add("roe",          "roe");
+		_dictionary.Add("salmon",       "salmon");
+		_dictionary.Add("scarf",        "scarves");
+		_dictionary.Add("self",         "selves");
+		_dictionary.Add("seraph",       "seraphim");
+		_dictionary.Add("series",       "series");
+		_dictionary.Add("sheaf",        "sheaves");
+		_dictionary.Add("sheep",        "sheep");
+		_dictionary.Add("shelf",        "shelves");
+		_dictionary.Add("species",      "species");
+		_dictionary.Add("spectrum",     "spectra");
+		_dictionary.Add("status",       "status");
+		_dictionary.Add("stimulus",     "stimuli");
+		_dictionary.Add("stratum",      "strata");
+		_dictionary.Add("supernova",    "supernovas");
+		_dictionary.Add("swine",        "swine");
+		_dictionary.Add("terminus",     "termini");
+		_dictionary.Add("thesaurus",    "thesauri");
+		_dictionary.Add("thesis",       "theses");
+		_dictionary.Add("thief",        "thieves");
+		_dictionary.Add("trout",        "trout");
+		_dictionary.Add("vulva",        "vulvae");
+		_dictionary.Add("wife",         "wives");
+		_dictionary.Add("wildebeest",   "wildebeest");
+		_dictionary.Add("wolf",         "wolves");
+		_dictionary.Add("woman",        "women");
+		_dictionary.Add("yen",          "yen");
+	}
+	
+	#endregion //Constructors
+
+	#region Methods
+	
+	/// <summary>
+	/// Call this method to get the properly pluralized 
+	/// English version of the word.
+	/// </summary>
+	/// <param name="word">The word needing conditional pluralization.</param>
+	/// <param name="count">The number of items the word refers to.</param>
+	/// <returns>The pluralized word</returns>
+	static public string ToPlural(string word)
+	{
+		word = word.ToLower();
+	
+		if (_dictionary.ContainsKey(word)) 
+		//it's an irregular plural, use the word from the dictionary
+		{
+			return _dictionary[word];
+		}
+		
+		if (TestIsPlural(word) == true)
+		{
+			return word; //it's already a plural
+		}
+		
+		if (word.Length <= 2)
+		{
+			return word; //not a word that can be pluralised!
+		}
+		
+		////1. If the word ends in a consonant plus -y, change the -y into
+		///-ie and add an -s to form the plural 
+		///e.g. enemy--enemies baby--babies
+		switch (word.Substring(word.Length - 2))
+		{
+			case "by":
+			case "cy":
+			case "dy":
+			case "fy":
+			case "gy":
+			case "hy":
+			case "jy":
+			case "ky":
+			case "ly":
+			case "my":
+			case "ny":
+			case "py":
+			case "ry":
+			case "sy":
+			case "ty":
+			case "vy":
+			case "wy":
+			case "xy":
+			case "zy":
+				{
+					return word.Substring(0, word.Length - 1) + "ies";
+				}
+
+			//2. For words that end in -is, change the -is to -es to make the plural form.
+			//synopsis--synopses 
+			//thesis--theses 
+			case "is":
+				{
+					return word.Substring(0, word.Length - 1) + "es";
+				}
+
+			//3. For words that end in a "hissing" sound (s,z,x,ch,sh), add an -es to form the plural.
+			//box--boxes 
+			//church--churches
+			case "ch":
+			case "sh":
+				{
+					return word + "es";
+				}
+			default:
+				{
+					switch (word.Substring(word.Length - 1))
+					{
+						case "s":
+						case "z":
+						case "x":
+							{
+								return word + "es";
+							}
+						default:
+							{
+								//4. Assume add an -s to form the plural of most words.
+								return word + "s";
+							}
+					}
+				}
+		}
+	}
+	
+	/// <summary>
+	/// Call this method to get the singular 
+	/// version of a plural English word.
+	/// </summary>
+	/// <param name="word">The word to turn into a singular</param>
+	/// <returns>The singular word</returns>
+	static public string ToSingular(string word)
+	{
+		word = word.ToLower();
+
+		if (_dictionary.ContainsKey(word))
+			return word;
+
+		if (_dictionary.ContainsValue(word))
+		{
+			foreach (KeyValuePair<string, string> kvp in _dictionary)
+			{
+				if (kvp.Value == word) return kvp.Key;
+			}
+		}
+
+		if (word.Substring(word.Length - 1) != "s")
+		{
+			return word; // not a plural word if it doesn't end in S
+		}
+
+		if (word.Length <= 2)
+		{
+			return word; // not a word that can be made singular if only two letters!
+		}
+
+		if (word.Length >= 4)
+		{
+			// 1. If the word ends in a consonant plus -y, change the -y into -ie and add an -s to form the plural – so reverse engineer it to get the singular
+			// e.g. enemy--enemies baby--babies family--families
+			switch (word.Substring(word.Length - 4))
+			{
+				case "bies":
+				case "cies":
+				case "dies":
+				case "fies":
+				case "gies":
+				case "hies":
+				case "jies":
+				case "kies":
+				case "lies":
+				case "mies":
+				case "nies":
+				case "pies":
+				case "ries":
+				case "sies":
+				case "ties":
+				case "vies":
+				case "wies":
+				case "xies":
+				case "zies":
+					{
+						return word.Substring(0, word.Length - 3) + "y";
+					}
+				//3. For words that end in a "hissing" sound (s,z,x,ch,sh), add an -es to form the plural.
+				//church--churches
+				case "ches":
+				case "shes":
+					{
+						return word.Substring(0, word.Length - 2);
+					}
+			}
+		}
+
+		if (word.Length >= 3)
+		{
+			switch (word.Substring(word.Length - 3))
+			{
+				//box--boxes 
+				case "ses":
+				//NOTE some false positives here - For words that end in -is, change the -is to -es to make the plural form.
+				//synopsis--synopses 
+				//thesis--theses 
+				case "zes":
+				case "xes":
+					{
+						return word.Substring(0, word.Length - 2);
+					}
+			}
+		}
+
+		if (word.Length >= 3)
+		{
+			switch (word.Substring(word.Length - 2))
+			{
+				case "es":
+					{
+						return word.Substring(0, word.Length - 1); // + "is";
+					}
+				//4. Assume add an -s to form the plural of most words.
+				default:
+					{
+						return word.Substring(0, word.Length - 1);
+					}
+			}
+		}
+
+		return word;
+	}
+
+	/// <summary>
+	/// test if a word is plural
+	/// </summary>
+	/// <param name="word">word to test</param>
+	/// <returns>true if a word is plural</returns>
+	static public bool TestIsPlural(string word)
+	{
+		word = word.ToLower();
+
+		if (word.Length <= 2)
+		{
+			return false; // not a word that can be made singular if only two letters!
+		}
+
+		if (_dictionary.ContainsValue(word))
+		{
+			return true; //it's definitely already a plural
+		}
+
+		if (word.Length >= 4)
+		{
+			//1. If the word ends in a consonant plus -y, change the -y into -ie and add an -s to form the plural 
+			// e.g. enemy--enemies baby--babies family--families
+			switch (word.Substring(word.Length - 4))
+			{
+				case "bies":
+				case "cies":
+				case "dies":
+				case "fies":
+				case "gies":
+				case "hies":
+				case "jies":
+				case "kies":
+				case "lies":
+				case "mies":
+				case "nies":
+				case "pies":
+				case "ries":
+				case "sies":
+				case "ties":
+				case "vies":
+				case "wies":
+				case "xies":
+				case "zies":
+				case "ches":
+				case "shes":
+					{
+						return true;
+					}
+			}
+		}
+
+		if (word.Length >= 3)
+		{
+			switch (word.Substring(word.Length - 3))
+			{
+				//box--boxes 
+				case "ses":
+				case "zes":
+				case "xes":
+					{
+						return true;
+					}
+			}
+		}
+
+		if (word.Length >= 3)
+		{
+			switch (word.Substring(word.Length - 2))
+			{
+				case "es":
+					{
+						return true;
+					}
+			}
+		}
+
+		if (word.Substring(word.Length - 1) != "s")
+		{
+			return false; // not a plural word if it doesn't end in S
+		}
+
+		return true;
+	}
+
+	#endregion
+}
+
+#>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Templates/PostgreSQL.ttinclude	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,297 @@
+<#
+	ConnectionType = "Npgsql.NpgsqlConnection, Npgsql";
+#><#+
+private void LoadServerMetadata()
+{
+	var tables  = CreateList(new { ID = 0, Table  = new Table()  });
+	var columns = CreateList(new { ID = 0, Column = new Column() });
+	
+	if (!string.IsNullOrEmpty(DataProviderAssembly)) 
+	{
+		System.Reflection.Assembly.LoadFile(DataProviderAssembly.Replace("Npgsql.dll", "Mono.Security.dll"));
+	}
+
+	using (var conn = GetConnection())
+	using (var cmd  = conn.CreateCommand())
+	{
+		// Load tables & vies.
+		//
+		cmd.CommandText = @"
+			SELECT 
+				pg_class.oid,
+				pg_namespace.nspname,
+				pg_class.relname,
+				pg_class.relkind
+			FROM 
+				pg_class
+				INNER JOIN pg_user ON (pg_class.relowner = pg_user.usesysid)
+				INNER JOIN pg_namespace ON (pg_class.relnamespace = pg_namespace.oid)
+			WHERE
+				pg_class.relkind IN ('r','v')
+				AND pg_namespace.nspname NOT IN ('pg_catalog','information_schema')";
+
+		using (var rd = cmd.ExecuteReader())
+		{
+			while (rd.Read())
+			{
+				var t = new
+				{
+					ID    = Convert.ToInt32(rd[0]),
+					Table = new Table
+					{
+						Owner         = rd[1].ToString(),
+						TableName     = rd[2].ToString(),
+						ClassName     = rd[2].ToString(),
+						IsView        = rd[3].ToString() == "v",
+						BaseClassName = BaseEntityClass,
+					}
+				};
+
+				tables.Add(t);
+			}
+		}
+
+		// Load columns.
+		//
+		cmd.CommandText = @"
+			SELECT 
+				pg_attribute.attrelid as id,
+				pg_attribute.attnum as colid,
+				pg_attribute.attname as name,
+				0 as status,
+				0 as usertype,
+				pg_attribute.atttypid as type,
+				COALESCE(CAST(substring(format_type(pg_attribute.atttypid, pg_attribute.atttypmod) from '[0-9]{1,}') as INTEGER),0) as lenght,
+				CASE WHEN pg_attribute.atttypid = 1700 AND format_type(pg_attribute.atttypid, pg_attribute.atttypmod) != 'numeric' THEN
+					COALESCE(CAST(regexp_replace(regexp_replace(format_type(pg_attribute.atttypid, pg_attribute.atttypmod),'[^,]*,',''),'[)]$','') as INTEGER),0)
+				ELSE
+					0
+				END as prec,
+				format_type(pg_attribute.atttypid, pg_attribute.atttypmod) as typename,
+				CASE WHEN CAST(pg_attribute.atttypid AS TEXT) IN ('17','25','1042','1043') THEN
+					false
+				ELSE
+					NOT pg_attribute.attnotnull
+				END as isnullable,
+				COALESCE(pg_attrdef.adsrc ~* 'nextval',FALSE) as isidentity
+			FROM 
+				pg_attribute
+				LEFT JOIN pg_attrdef ON (pg_attribute.attrelid = pg_attrdef.adrelid AND 
+				pg_attribute.attnum = pg_attrdef.adnum)
+				INNER JOIN pg_class ON (pg_attribute.attrelid = pg_class.oid)
+				INNER JOIN pg_namespace ON (pg_class.relnamespace = pg_namespace.oid)
+			WHERE
+				pg_class.relkind IN ('r','v') AND
+				pg_namespace.nspname NOT IN ('pg_catalog','information_schema') AND
+				pg_attribute.attnum > 0 AND
+				NOT pg_attribute.attisdropped"; 
+
+		bool addNpgsqlTypes = false;
+
+		using (var rd = cmd.ExecuteReader())
+		{
+			while (rd.Read())
+			{
+				var col = new
+				{
+					ID     = Convert.ToInt32(rd["id"]),
+					Column = new Column
+					{
+						ID         = Convert.ToInt16(rd["colid"]),
+						ColumnName = Convert.ToString (rd["name"]),
+						MemberName = Convert.ToString (rd["name"]),
+						ColumnType = Convert.ToString (rd["typename"]),
+						IsNullable = Convert.ToBoolean(rd["isnullable"]),
+						IsIdentity = Convert.ToBoolean(rd["isidentity"]),
+						Length     = rd.IsDBNull(rd.GetOrdinal("lenght")) ? 0 : Convert.ToInt64(rd["lenght"]),
+						Precision  = rd.IsDBNull(rd.GetOrdinal("prec"))   ? 0 : Convert.ToInt32(rd["prec"]),
+						//Scale      = rd.IsDBNull(rd.GetOrdinal("scale"))  ? 0 : Convert.ToInt32(rd["scale"]),
+					}
+				};
+
+				var c   = col.Column;
+				var oid = Convert.ToInt32(rd["type"]);
+
+				c.Type      = "object";
+				c.DbType    = DbType.Object;
+				c.SqlDbType = SqlDbType.Variant;
+
+				switch (oid)
+				{
+					case   16 /* bool                     */ : c.Type = "Boolean";          c.DbType = DbType.Boolean;   c.SqlDbType = SqlDbType.Bit;              break;
+					case   17 /* bytea                    */ : c.Type = "Byte[]";           c.DbType = DbType.Binary;    c.SqlDbType = SqlDbType.Binary;           break;
+					case   20 /* int8                     */ : c.Type = "Int64";            c.DbType = DbType.Int64;     c.SqlDbType = SqlDbType.BigInt;           break;
+					case   21 /* int2                     */ : c.Type = "Int16";            c.DbType = DbType.Int16;     c.SqlDbType = SqlDbType.SmallInt;         break;
+					case   23 /* int4                     */ : c.Type = "Int32";            c.DbType = DbType.Int32;     c.SqlDbType = SqlDbType.Int;              break;
+					case   25 /* text                     */ : c.Type = "String";           c.DbType = DbType.String;    c.SqlDbType = SqlDbType.Text;             break;
+					case  142 /* xml                      */ : c.Type = "String";           c.DbType = DbType.Xml;       c.SqlDbType = SqlDbType.Xml;              break;
+					case  600 /* point                    */ : c.Type = "NpgsqlPoint";      addNpgsqlTypes = true;                                                 break;
+					case  601 /* lseg                     */ : c.Type = "NpgsqlLSeg";       addNpgsqlTypes = true;                                                 break;
+					case  602 /* path                     */ : c.Type = "NpgsqlPath";       addNpgsqlTypes = true;                                                 break;
+					case  603 /* box                      */ : c.Type = "NpgsqlBox";        addNpgsqlTypes = true;                                                 break;
+					case  604 /* polygon                  */ : c.Type = "NpgsqlPolygon";    addNpgsqlTypes = true;                                                 break;
+					case  700 /* float4                   */ : c.Type = "Single";           c.DbType = DbType.Single;    c.SqlDbType = SqlDbType.Real;             break;
+					case  701 /* float8                   */ : c.Type = "Double";           c.DbType = DbType.Double;    c.SqlDbType = SqlDbType.Float;            break;
+					case  718 /* circle                   */ : c.Type = "NpgsqlCircle";     addNpgsqlTypes = true;                                                 break;
+					case  790 /* money                    */ : c.Type = "Decimal";          c.DbType = DbType.Decimal;   c.SqlDbType = SqlDbType.Money;            break;
+					case  829 /* macaddr                  */ : c.Type = "NpgsqlMacAddress"; addNpgsqlTypes = true;                                                 break;
+					case  869 /* inet                     */ : c.Type = "NpgsqlInet";       addNpgsqlTypes = true;                                                 break;
+					case 1042 /* char                     */ : c.Type = "String";           c.DbType = DbType.String;    c.SqlDbType = SqlDbType.Char;             break;
+					case 1043 /* varchar                  */ : c.Type = "String";           c.DbType = DbType.String;    c.SqlDbType = SqlDbType.VarChar;          break;
+					case 1082 /* date                     */ : c.Type = "DateTime";         c.DbType = DbType.Date;      c.SqlDbType = SqlDbType.Date;             break;
+					case 1083 /* time                     */ : c.Type = "DateTime";         c.DbType = DbType.Time;      c.SqlDbType = SqlDbType.Time;             break;
+					case 1114 /* datetime                 */ : c.Type = "DateTime";         c.DbType = DbType.DateTime;  c.SqlDbType = SqlDbType.DateTime;         break;
+					case 1560 /* bit                      */ : c.Type = "BitString";        addNpgsqlTypes = true;                                                 break;
+					case 1700 /* numeric                  */ : c.Type = "Decimal";          c.DbType = DbType.Decimal;   c.SqlDbType = SqlDbType.Decimal;          break;
+					case 1186 /* interval                 */ : c.Type = "NpgsqlInterval";   addNpgsqlTypes = true;                                                 break;
+					case 1184 /* timestamp with time zone */ :
+					case 1266 /* timestamp with time zone */ : c.Type = "DateTime";         c.DbType = DbType.DateTime2; c.SqlDbType = SqlDbType.DateTime2;        break;
+					case 2950 /* Guid                     */ : c.Type = "Guid";             c.DbType = DbType.Binary;    c.SqlDbType = SqlDbType.UniqueIdentifier; break;
+					default:
+						if (oid < 100000)
+							throw new Exception(string.Format("Type '{0}' ({1}) is not expected in PostgreSQL.tt", rd["typename"], rd["type"]));
+						break;
+				}
+
+				switch (c.Type)
+				{
+					case "object" :
+					case "String" :
+					case "byte[]" : c.IsClass = true; break;
+				}
+
+				if (c.IsNullable && !c.IsClass)
+					c.Type += "?";
+
+				columns.Add(col);
+			}
+		}
+
+		if (addNpgsqlTypes)
+			Usings.Add("NpgsqlTypes");
+
+		// Load PKs.
+		//
+		cmd.CommandText = @"
+			SELECT
+				pg_constraint.conrelid as id,
+				pg_constraint.conname as ""name"",
+				(select attname from pg_attribute where attrelid = pg_constraint.conrelid and attnum = pg_constraint.conkey[1]) as colname,
+				pg_constraint.conkey[1] as ""order"",    
+				pg_constraint.conkey[1] as colid
+			FROM
+				pg_constraint
+			WHERE
+			pg_constraint.contype = 'p'";
+
+		using (var rd = cmd.ExecuteReader())
+		{
+			while (rd.Read())
+			{
+				var id    = Convert.ToInt32(rd["id"]);
+				var colid = Convert.ToInt32(rd["colid"]);
+
+				columns.Single(_ => _.ID == id && _.Column.ID == colid).Column.PKIndex = colid;
+			}
+		}
+
+		// Load FKs.
+		//
+		cmd.CommandText = @"
+			SELECT 
+				pg_constraint.conname as ""Name"",
+				pg_constraint.conrelid as ""ThisTable"",
+				pg_constraint.confrelid as ""OtherTable"",
+				(select attname from pg_attribute where attrelid = pg_constraint.conrelid  and attnum = pg_constraint.conkey[01]) as ""ThisColumn1"",
+				(select attname from pg_attribute where attrelid = pg_constraint.conrelid  and attnum = pg_constraint.conkey[02]) as ""ThisColumn2"",
+				(select attname from pg_attribute where attrelid = pg_constraint.conrelid  and attnum = pg_constraint.conkey[03]) as ""ThisColumn3"",
+				(select attname from pg_attribute where attrelid = pg_constraint.conrelid  and attnum = pg_constraint.conkey[04]) as ""ThisColumn4"",
+				(select attname from pg_attribute where attrelid = pg_constraint.conrelid  and attnum = pg_constraint.conkey[05]) as ""ThisColumn5"",
+				(select attname from pg_attribute where attrelid = pg_constraint.conrelid  and attnum = pg_constraint.conkey[06]) as ""ThisColumn6"",
+				(select attname from pg_attribute where attrelid = pg_constraint.conrelid  and attnum = pg_constraint.conkey[07]) as ""ThisColumn7"",
+				(select attname from pg_attribute where attrelid = pg_constraint.conrelid  and attnum = pg_constraint.conkey[08]) as ""ThisColumn8"",
+				(select attname from pg_attribute where attrelid = pg_constraint.conrelid  and attnum = pg_constraint.conkey[09]) as ""ThisColumn9"",
+				(select attname from pg_attribute where attrelid = pg_constraint.conrelid  and attnum = pg_constraint.conkey[10]) as ""ThisColumn10"",
+				(select attname from pg_attribute where attrelid = pg_constraint.conrelid  and attnum = pg_constraint.conkey[11]) as ""ThisColumn11"",
+				(select attname from pg_attribute where attrelid = pg_constraint.conrelid  and attnum = pg_constraint.conkey[12]) as ""ThisColumn12"",
+				(select attname from pg_attribute where attrelid = pg_constraint.conrelid  and attnum = pg_constraint.conkey[13]) as ""ThisColumn13"",
+				(select attname from pg_attribute where attrelid = pg_constraint.conrelid  and attnum = pg_constraint.conkey[14]) as ""ThisColumn14"",
+				(select attname from pg_attribute where attrelid = pg_constraint.conrelid  and attnum = pg_constraint.conkey[15]) as ""ThisColumn15"",
+				(select attname from pg_attribute where attrelid = pg_constraint.conrelid  and attnum = pg_constraint.conkey[16]) as ""ThisColumn16"",
+				(select attname from pg_attribute where attrelid = pg_constraint.confrelid and attnum = pg_constraint.confkey[01]) as ""OtherColumn1"",
+				(select attname from pg_attribute where attrelid = pg_constraint.confrelid and attnum = pg_constraint.confkey[02]) as ""OtherColumn2"",
+				(select attname from pg_attribute where attrelid = pg_constraint.confrelid and attnum = pg_constraint.confkey[03]) as ""OtherColumn3"",
+				(select attname from pg_attribute where attrelid = pg_constraint.confrelid and attnum = pg_constraint.confkey[04]) as ""OtherColumn4"",
+				(select attname from pg_attribute where attrelid = pg_constraint.confrelid and attnum = pg_constraint.confkey[05]) as ""OtherColumn5"",
+				(select attname from pg_attribute where attrelid = pg_constraint.confrelid and attnum = pg_constraint.confkey[06]) as ""OtherColumn6"",
+				(select attname from pg_attribute where attrelid = pg_constraint.confrelid and attnum = pg_constraint.confkey[07]) as ""OtherColumn7"",
+				(select attname from pg_attribute where attrelid = pg_constraint.confrelid and attnum = pg_constraint.confkey[08]) as ""OtherColumn8"",
+				(select attname from pg_attribute where attrelid = pg_constraint.confrelid and attnum = pg_constraint.confkey[09]) as ""OtherColumn9"",
+				(select attname from pg_attribute where attrelid = pg_constraint.confrelid and attnum = pg_constraint.confkey[10]) as ""OtherColumn10"",
+				(select attname from pg_attribute where attrelid = pg_constraint.confrelid and attnum = pg_constraint.confkey[11]) as ""OtherColumn11"",
+				(select attname from pg_attribute where attrelid = pg_constraint.confrelid and attnum = pg_constraint.confkey[12]) as ""OtherColumn12"",
+				(select attname from pg_attribute where attrelid = pg_constraint.confrelid and attnum = pg_constraint.confkey[13]) as ""OtherColumn13"",
+				(select attname from pg_attribute where attrelid = pg_constraint.confrelid and attnum = pg_constraint.confkey[14]) as ""OtherColumn14"",
+				(select attname from pg_attribute where attrelid = pg_constraint.confrelid and attnum = pg_constraint.confkey[15]) as ""OtherColumn15"",
+				(select attname from pg_attribute where attrelid = pg_constraint.confrelid and attnum = pg_constraint.confkey[16]) as ""OtherColumn16""
+			FROM
+				pg_constraint          
+			WHERE
+				pg_constraint.contype = 'f'";
+
+		using (var rd = cmd.ExecuteReader())
+		{
+			while (rd.Read())
+			{
+				var name            = Convert.ToString(rd["Name"]);
+				var thisTableID     = Convert.ToInt32 (rd["ThisTable"]);
+				var otherTableID    = Convert.ToInt32 (rd["OtherTable"]);
+
+				var thisTable   = (from t in tables  where t.ID == thisTableID  select t.Table).Single();
+				var otherTable  = (from t in tables  where t.ID == otherTableID select t.Table).Single();
+
+				thisTable.ForeignKeys.Add(name, new ForeignKey { KeyName = name, MemberName = name, OtherTable = otherTable });
+
+				for (int i = 1; i <= 16; i++)
+				{
+					if (rd.IsDBNull(rd.GetOrdinal("ThisColumn"  + i)))
+						break;
+
+					var thisColumnName  = Convert.ToString(rd["ThisColumn"  + i]);
+					var otherColumnName = Convert.ToString(rd["OtherColumn" + i]);
+
+					var thisColumn  = (from c in columns where c.ID == thisTableID  && c.Column.ColumnName == thisColumnName  select c.Column).Single();
+					var otherColumn = (from c in columns where c.ID == otherTableID && c.Column.ColumnName == otherColumnName select c.Column).Single();
+
+					var key = thisTable.ForeignKeys[name];
+
+					key.ThisColumns. Add(thisColumn);
+					key.OtherColumns.Add(otherColumn);
+				}
+			}
+		}
+	}
+
+	var qc =
+		from c in columns
+		group c by c.ID into gr
+		join t in tables on gr.Key equals t.ID
+		select new { t.Table, gr };
+
+	foreach (var c in qc)
+	{
+		foreach (var col in from col in c.gr orderby col.Column.ID select col.Column)
+			c.Table.Columns.Add(col.ColumnName, col);
+
+		if (c.Table.Owner == "postgres")
+		{
+			c.Table.Owner = null;
+			Tables.Add(c.Table.TableName, c.Table);
+		}
+		else
+		{
+			Tables.Add(c.Table.Owner + "." + c.Table.TableName, c.Table);
+		}
+	}
+}
+#>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Templates/Renamer.ttinclude	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,38 @@
+<#
+//Rename tables and fields according to the .NET style, i.e. "booking_number" to "BookingNumber"
+	{
+		var fieldsPrevBeforeGenerateModel = BeforeGenerateModel;
+
+		Func<string, string> getNetStyleName = (string name) =>
+		{
+			if(!string.IsNullOrEmpty(name))
+			{
+				var chars = new System.Text.StringBuilder(name);
+				for(int i=1; i<chars.Length; i++)
+					if(chars[i-1]=='_') chars[i]=char.ToUpper(chars[i]);
+				chars.Replace("_", null);
+				chars[0]=char.ToUpper(chars[0]);
+				name = chars.ToString();
+			}
+			return name;
+		};
+
+		BeforeGenerateModel = tt =>
+		{
+			fieldsPrevBeforeGenerateModel(tt);
+			Dictionary<string, string> remapper = new Dictionary<string, string>() { { "Exception", "Exceptions" } };
+
+			foreach (var t in Tables.Values)
+			{
+				t.ClassName = getNetStyleName(t.ClassName);
+				string className;
+				if(remapper.TryGetValue(t.ClassName, out className))
+					t.ClassName = className;
+				foreach (var c in t.Columns.Values)
+					c.MemberName = getNetStyleName(c.MemberName);
+			}
+		};
+	}
+
+
+#>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Templates/Sybase.ttinclude	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,444 @@
+<#
+	ConnectionType = "Sybase.Data.AseClient.AseConnection, Sybase.AdoNet2.AseClient";
+#><#+
+
+bool GenerateSybaseSystemTables = false;
+
+private void LoadServerMetadata()
+{
+	var tables  = CreateList(new { ID = 0, Table  = new Table()  });
+	var columns = CreateList(new { ID = 0, Column = new Column() });
+
+	using (var conn = GetConnection())
+	using (var cmd  = conn.CreateCommand())
+	{
+		// Load tables & vies.
+		//
+		cmd.CommandText = @"
+			SELECT
+				id,
+				USER_NAME(uid),
+				name,
+				type
+			FROM
+				sysobjects
+			WHERE
+				type IN ('U','V')";
+
+		using (var rd = cmd.ExecuteReader())
+		{
+			while (rd.Read())
+			{
+				var t = new
+				{
+					ID    = Convert.ToInt32(rd[0]),
+					Table = new Table
+					{
+						Owner         = rd[1].ToString(),
+						TableName     = rd[2].ToString(),
+						ClassName     = rd[2].ToString(),
+						IsView        = rd[3].ToString()[0] == 'V',
+						BaseClassName = BaseEntityClass,
+					}
+				};
+
+				tables.Add(t);
+			}
+		}
+
+		// Load columns.
+		//
+		cmd.CommandText = @"
+			SELECT
+				o.id,
+				c.colid,
+				c.name,
+				c.status,
+				c.usertype,
+				t.type,
+				c.length,
+				c.prec,
+				c.scale,
+				t.name as typename,
+				Convert(bit, c.status & 0x08) isNullable,
+				Convert(bit, c.status & 0x80) isIdentity
+			FROM
+				syscolumns c
+					JOIN sysobjects o ON c.id       = o.id
+					JOIN systypes   t ON c.usertype = t.usertype
+			WHERE
+				o.type IN ('U','V')";
+
+		using (var rd = cmd.ExecuteReader())
+		{
+			while (rd.Read())
+			{
+				var col = new
+				{
+					ID     = Convert.ToInt32(rd["id"]),
+					Column = new Column
+					{
+						ID         = Convert.ToInt16  (rd["colid"]),
+						ColumnName = Convert.ToString (rd["name"]),
+						MemberName = Convert.ToString (rd["name"]),
+						ColumnType = Convert.ToString (rd["typename"]),
+						IsNullable = Convert.ToBoolean(rd["isNullable"]),
+						IsIdentity = Convert.ToBoolean(rd["isIdentity"]),
+						Length     = rd.IsDBNull(rd.GetOrdinal("length")) ? 0 : Convert.ToInt64(rd["length"]),
+						Precision  = rd.IsDBNull(rd.GetOrdinal("prec"))   ? 0 : Convert.ToInt32(rd["prec"]),
+						Scale      = rd.IsDBNull(rd.GetOrdinal("scale"))  ? 0 : Convert.ToInt32(rd["scale"]),
+					}
+				};
+
+				var c = col.Column;
+
+				switch (Convert.ToInt32(rd["type"]))
+				{
+					case  34 /* image         */ : c.Type = "byte[]";   c.DbType = DbType.Binary;    c.SqlDbType = SqlDbType.Image;         break;
+					case  35 /* text          */ : c.Type = "string";   c.DbType = DbType.String;    c.SqlDbType = SqlDbType.Text;          break;
+					case  45 /* binary        */ : c.Type = "byte[]";   c.DbType = DbType.Binary;    c.SqlDbType = SqlDbType.Binary;        break;
+					case  48 /* tinyint       */ : c.Type = "byte";     c.DbType = DbType.Byte;      c.SqlDbType = SqlDbType.TinyInt;       break;
+					case  49 /* date          */ : c.Type = "DateTime"; c.DbType = DbType.Date;      c.SqlDbType = SqlDbType.Date;          break;
+					case  50 /* bit           */ : c.Type = "bool";     c.DbType = DbType.Boolean;   c.SqlDbType = SqlDbType.Bit;           break;
+					case  51 /* time          */ : c.Type = "DateTime"; c.DbType = DbType.Time;      c.SqlDbType = SqlDbType.Time;          break;
+					case  52 /* smallint      */ : c.Type = "short";    c.DbType = DbType.Int16;     c.SqlDbType = SqlDbType.SmallInt;      break;
+					case  55 /* decimal       */ : c.Type = "decimal";  c.DbType = DbType.Decimal;   c.SqlDbType = SqlDbType.Decimal;       break;
+					case  56 /* int           */ : c.Type = "int";      c.DbType = DbType.Int32;     c.SqlDbType = SqlDbType.Int;           break;
+					case  58 /* smalldatetime */ : c.Type = "DateTime"; c.DbType = DbType.DateTime;  c.SqlDbType = SqlDbType.SmallDateTime; break;
+					case  59 /* real          */ : c.Type = "float";    c.DbType = DbType.Single;    c.SqlDbType = SqlDbType.Real;          break;
+					case  60 /* money         */ : c.Type = "decimal";  c.DbType = DbType.Currency;  c.SqlDbType = SqlDbType.Money;         break;
+					case  61 /* datetime      */ : c.Type = "DateTime"; c.DbType = DbType.DateTime;  c.SqlDbType = SqlDbType.DateTime;      break;
+					case  62 /* float         */ : c.Type = "double";   c.DbType = DbType.Double;    c.SqlDbType = SqlDbType.Float;         break;
+					case  63 /* numeric       */ : c.Type = "decimal";  c.DbType = DbType.Decimal;   c.SqlDbType = SqlDbType.Decimal;       break;
+					case  65 /* usmallint     */ : c.Type = "ushort";   c.DbType = DbType.UInt16;    c.SqlDbType = SqlDbType.SmallInt;      break;
+					case  66 /* uint          */ : c.Type = "uint";     c.DbType = DbType.UInt32;    c.SqlDbType = SqlDbType.Int;           break;
+					case  67 /* ubigint       */ : c.Type = "ulong";    c.DbType = DbType.UInt64;    c.SqlDbType = SqlDbType.BigInt;        break;
+					case 122 /* smallmoney    */ : c.Type = "decimal";  c.DbType = DbType.Currency;  c.SqlDbType = SqlDbType.SmallMoney;    break;
+					case 174 /* unitext       */ : c.Type = "string";   c.DbType = DbType.String;    c.SqlDbType = SqlDbType.NText;         break;
+					case 189 /* bigdatetime   */ : c.Type = "DateTime"; c.DbType = DbType.DateTime2; c.SqlDbType = SqlDbType.DateTime2;     break;
+					case 190 /* bigtime       */ : c.Type = "DateTime"; c.DbType = DbType.DateTime2; c.SqlDbType = SqlDbType.DateTime2;     break;
+					case 191 /* bigint        */ : c.Type = "long";     c.DbType = DbType.Int64;     c.SqlDbType = SqlDbType.BigInt;        break;
+
+					case  37 /* varbinary     */
+					         /* timestamp     */ :
+						c.Type      = "byte[]";
+						c.DbType    = DbType.Binary;
+						c.SqlDbType = Convert.ToString(rd["typename"]) == "timestamp" ? SqlDbType.Timestamp : SqlDbType.VarBinary;
+						break;
+
+					case  39 /* sysname       */
+					         /* longsysname   */
+					         /* varchar       */
+					         /* nvarchar      */ :
+
+						c.Type = "string";
+
+						if (Convert.ToString(rd["typename"]) == "nvarchar")
+						{
+							c.DbType    = DbType.String;
+							c.SqlDbType = SqlDbType.NVarChar; 
+						}
+						else
+						{
+							c.DbType    = DbType.AnsiString;
+							c.SqlDbType = SqlDbType.VarChar;
+						}
+
+						break;
+
+					case  47 /* char          */
+					         /* nchar         */ : 
+
+						c.Type      = Convert.ToInt32 (rd["length"])   == 1      ? "char" : "string";
+						c.DbType    = Convert.ToString(rd["typename"]) == "char" ? DbType.AnsiStringFixedLength : DbType.StringFixedLength;
+						c.SqlDbType = Convert.ToString(rd["typename"]) == "char" ? SqlDbType.Char : SqlDbType.NChar;
+						break;
+
+					case 135 /* unichar       */ :
+						c.Type      = Convert.ToInt32 (rd["length"]) == 1 ? "char" : "string";
+						c.DbType    = DbType.StringFixedLength;
+						c.SqlDbType = SqlDbType.NChar;
+						break;
+
+					case 155 /* univarchar    */ :
+						c.Type      = Convert.ToInt32 (rd["length"]) == 1 ? "char" : "string";
+						c.DbType    = DbType.String;
+						c.SqlDbType = SqlDbType.NVarChar;
+						break;
+
+					case  36 /* extended type */ :
+					case  38 /* intn          */ : 
+					case  68 /* uintn         */ : 
+					case 106 /* decimaln      */ : 
+					case 108 /* numericn      */ : 
+					case 109 /* floatn        */ : 
+					case 110 /* moneyn        */ : 
+					case 111 /* datetimn      */ : 
+					case 123 /* daten         */ : 
+					case 147 /* timen         */ : 
+					case 187 /* bigdatetimen  */ : 
+					case 188 /* bigtimen      */ : c.Type = "byte[]";   c.DbType = DbType.Binary;    c.SqlDbType = SqlDbType.Binary;        break;
+				}
+
+				switch (c.Type)
+				{
+					case "string" :
+					case "byte[]" : c.IsClass = true; break;
+				}
+
+				if (c.IsNullable && !c.IsClass)
+					c.Type += "?";
+
+				columns.Add(col);
+			}
+		}
+
+		// Load PKs.
+		//
+		cmd.CommandText = @"
+			SELECT
+				i.id,
+				i.name,
+				INDEX_COL(USER_NAME(o.uid) + '.' + o.name, i.indid, c.colid) AS colname,
+				INDEX_COLORDER(USER_NAME(o.uid) + '.' + o.name, i.indid, c.colid) AS [order],
+				c.colid
+			FROM
+				sysindexes i
+					JOIN sysobjects o ON i.id = o.id
+					JOIN syscolumns c ON i.id = c.id
+			WHERE
+				i.status2 & 2 = 2 AND
+				i.status & 2048 = 2048 AND
+				i.indid > 0 AND
+				c.colid < i.keycnt + CASE WHEN i.indid = 1 THEN 1 ELSE 0 END";
+
+		using (var rd = cmd.ExecuteReader())
+		{
+			while (rd.Read())
+			{
+				var id      = Convert.ToInt32 (rd["id"]);
+				var colid   = Convert.ToInt32 (rd["colid"]);
+				var colname = Convert.ToString(rd["colname"]);
+
+				columns.Single(_ => _.ID == id && _.Column.ColumnName == colname).Column.PKIndex = colid;
+			}
+		}
+
+		// Load FKs.
+		//
+		cmd.CommandText = @"
+			SELECT
+				o.name     as Name,
+				c.tableid  as ThisTable,
+				r.reftabid as OtherTable,
+				COL_NAME(c.tableid, r.fokey1) as ThisColumn1,
+				COL_NAME(c.tableid, r.fokey2) as ThisColumn2,
+				COL_NAME(c.tableid, r.fokey3) as ThisColumn3,
+				COL_NAME(c.tableid, r.fokey4) as ThisColumn4,
+				COL_NAME(c.tableid, r.fokey5) as ThisColumn5,
+				COL_NAME(c.tableid, r.fokey6) as ThisColumn6,
+				COL_NAME(c.tableid, r.fokey7) as ThisColumn7,
+				COL_NAME(c.tableid, r.fokey8) as ThisColumn8,
+				COL_NAME(c.tableid, r.fokey9) as ThisColumn9,
+				COL_NAME(c.tableid, r.fokey10) as ThisColumn10,
+				COL_NAME(c.tableid, r.fokey11) as ThisColumn11,
+				COL_NAME(c.tableid, r.fokey12) as ThisColumn12,
+				COL_NAME(c.tableid, r.fokey13) as ThisColumn13,
+				COL_NAME(c.tableid, r.fokey14) as ThisColumn14,
+				COL_NAME(c.tableid, r.fokey15) as ThisColumn15,
+				COL_NAME(c.tableid, r.fokey16) as ThisColumn16,
+				COL_NAME(r.reftabid, r.refkey1) as OtherColumn1,
+				COL_NAME(r.reftabid, r.refkey2) as OtherColumn2,
+				COL_NAME(r.reftabid, r.refkey3) as OtherColumn3,
+				COL_NAME(r.reftabid, r.refkey4) as OtherColumn4,
+				COL_NAME(r.reftabid, r.refkey5) as OtherColumn5,
+				COL_NAME(r.reftabid, r.refkey6) as OtherColumn6,
+				COL_NAME(r.reftabid, r.refkey7) as OtherColumn7,
+				COL_NAME(r.reftabid, r.refkey8) as OtherColumn8,
+				COL_NAME(r.reftabid, r.refkey9) as OtherColumn9,
+				COL_NAME(r.reftabid, r.refkey10) as OtherColumn10,
+				COL_NAME(r.reftabid, r.refkey11) as OtherColumn11,
+				COL_NAME(r.reftabid, r.refkey12) as OtherColumn12,
+				COL_NAME(r.reftabid, r.refkey13) as OtherColumn13,
+				COL_NAME(r.reftabid, r.refkey14) as OtherColumn14,
+				COL_NAME(r.reftabid, r.refkey15) as OtherColumn15,
+				COL_NAME(r.reftabid, r.refkey16) as OtherColumn16
+			FROM
+				sysreferences r
+					JOIN sysconstraints c ON r.constrid = c.constrid
+						JOIN sysobjects o  ON c.constrid = o.id
+						JOIN sysobjects o3 ON c.tableid  = o3.id
+					LEFT JOIN sysobjects o2 ON r.reftabid = o2.id
+					JOIN sysreferences r2 ON r.constrid = r2.constrid
+						LEFT JOIN sysindexes i ON r2.indexid = i.indid AND r2.reftabid = i.id
+			WHERE
+				c.status = 64";
+
+		using (var rd = cmd.ExecuteReader())
+		{
+			while (rd.Read())
+			{
+				var name            = Convert.ToString(rd["Name"]);
+				var thisTableID     = Convert.ToInt32 (rd["ThisTable"]);
+				var otherTableID    = Convert.ToInt32 (rd["OtherTable"]);
+
+				var thisTable   = (from t in tables  where t.ID == thisTableID  select t.Table).Single();
+				var otherTable  = (from t in tables  where t.ID == otherTableID select t.Table).Single();
+
+				thisTable.ForeignKeys.Add(name, new ForeignKey { KeyName = name, MemberName = name, OtherTable = otherTable });
+
+				for (int i = 1; i <= 16; i++)
+				{
+					if (rd.IsDBNull(rd.GetOrdinal("ThisColumn"  + i)))
+						break;
+
+					var thisColumnName  = Convert.ToString(rd["ThisColumn"  + i]);
+					var otherColumnName = Convert.ToString(rd["OtherColumn" + i]);
+
+					var thisColumn  = (from c in columns where c.ID == thisTableID  && c.Column.ColumnName == thisColumnName  select c.Column).Single();
+					var otherColumn = (from c in columns where c.ID == otherTableID && c.Column.ColumnName == otherColumnName select c.Column).Single();
+
+					var key = thisTable.ForeignKeys[name];
+
+					key.ThisColumns. Add(thisColumn);
+					key.OtherColumns.Add(otherColumn);
+				}
+			}
+		}
+	}
+
+	var qc =
+		from c in columns
+		group c by c.ID into gr
+		join t in tables on gr.Key equals t.ID
+		select new { t.Table, gr };
+
+	foreach (var c in qc)
+	{
+		foreach (var col in from col in c.gr orderby col.Column.ID select col.Column)
+			c.Table.Columns.Add(col.ColumnName, col);
+
+		if (c.Table.Owner == "dbo")
+		{
+			c.Table.Owner = null;
+			Tables.Add(c.Table.TableName, c.Table);
+		}
+		else
+		{
+			Tables.Add(c.Table.Owner + "." + c.Table.TableName, c.Table);
+		}
+	}
+
+	if (GenerateSybaseSystemTables)
+	{
+		Tables.Add("sysobjects", new Table
+		{
+			TableName     = "sysobjects",
+			ClassName     = "SysObject",
+			BaseClassName = BaseEntityClass,
+			Columns       =
+			{
+				{ "name",      new VarCharColumn  { ColumnName = "name", Length = 255 }},
+				{ "id",        new IntColumn      { ColumnName = "id"  }},
+				{ "uid",       new IntColumn      { ColumnName = "uid" }},
+				{ "type",      new Column {
+					ColumnName = "type",
+					Type       = "string",
+					ColumnType = "char",
+					DbType     = DbType.AnsiStringFixedLength,
+					SqlDbType  = SqlDbType.Char,
+					Length     = 2,
+				}},
+				{ "userstat",  new SmallIntColumn { ColumnName = "userstat"  }},
+				{ "sysstat",   new SmallIntColumn { ColumnName = "sysstat"   }},
+				{ "indexdel",  new SmallIntColumn { ColumnName = "indexdel"  }},
+				{ "schemacnt", new SmallIntColumn { ColumnName = "schemacnt" }},
+				{ "sysstat2",  new IntColumn      { ColumnName = "sysstat2"  }},
+				{ "crdate",    new DateTimeColumn { ColumnName = "crdate"    }},
+				{ "expdate",   new DateTimeColumn { ColumnName = "expdate"   }},
+				{ "deltrig",   new IntColumn      { ColumnName = "deltrig"   }},
+				{ "instrig",   new IntColumn      { ColumnName = "instrig"   }},
+				{ "updtrig",   new IntColumn      { ColumnName = "updtrig"   }},
+				{ "seltrig",   new IntColumn      { ColumnName = "seltrig"   }},
+				{ "ckfirst",   new IntColumn      { ColumnName = "ckfirst"   }},
+				{ "cache",     new SmallIntColumn { ColumnName = "cache"     }},
+				{ "audflags",  new IntColumn      { ColumnName = "audflags", IsNullable = true }},
+				{ "objspare",  new IntColumn      { ColumnName = "objspare"  }},
+				{ "versionts", new Column {
+					ColumnName = "versionts",
+					IsNullable = true,
+					Type       = "byte[]",
+					ColumnType = "binary",
+					IsClass    = true,
+					DbType     = DbType.Binary,
+					SqlDbType  = SqlDbType.Binary,
+					Length     = 6,
+				}},
+				{ "loginame", new VarCharColumn   { ColumnName = "loginame", Length = 30 }},
+			}
+		});
+
+		int n = 1;
+
+		foreach (var col in Tables["sysobjects"].Columns)
+		{
+			var c = col.Value;
+
+			c.ID         = n++;
+			c.MemberName = c.ColumnName;
+
+			if (c.IsNullable && !c.IsClass)
+				c.Type = c.Type + "?";
+		}
+	}
+}
+
+class VarCharColumn : Column
+{
+	public VarCharColumn()
+	{
+		Type       = "string";
+		ColumnType = "varchar";
+		IsClass    = true;
+		DbType     = DbType.AnsiString;
+		SqlDbType  = SqlDbType.VarChar;
+	}
+}
+
+class IntColumn : Column
+{
+	public IntColumn()
+	{
+		Type       = "int";
+		ColumnType = "int";
+		DbType     = DbType.Int32;
+		SqlDbType  = SqlDbType.Int;
+		Length     = 4;
+	}
+}
+
+class SmallIntColumn : Column
+{
+	public SmallIntColumn()
+	{
+		Type       = "short";
+		ColumnType = "smallint";
+		DbType     = DbType.Int16;
+		SqlDbType  = SqlDbType.SmallInt;
+		Length     = 2;
+	}
+}
+
+class DateTimeColumn : Column
+{
+	public DateTimeColumn()
+	{
+		Type       = "DateTime";
+		ColumnType = "datetime";
+		DbType     = DbType.DateTime;
+		SqlDbType  = SqlDbType.DateTime;
+		Length     = 8;
+	}
+}
+
+#>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Templates/VB.ttinclude	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,117 @@
+<#
+
+OneToManyAssociationType = OneToManyAssociationType.Replace("<", "(Of ").Replace(">", ")");
+
+WriteComment        = (tt,s) => WriteLine("'{0}", s);
+WriteUsing          = (tt,s) => WriteLine("Imports {0}", s);
+WriteBeginNamespace = (tt,s) => { WriteLine("Namespace {0}", s); WriteLine(""); };
+WriteEndNamespace   =  tt    => { WriteLine(""); WriteLine("End Namespace");    };
+WriteBeginClass     = (tt,cl,bc) =>
+{
+	WriteLine("Public Partial Class {0}", cl);
+	if (!string.IsNullOrEmpty(bc))
+		WriteLine("\tInherits {0}", bc);
+};
+WriteEndClass       =  tt    => WriteLine("End Class");
+MakeGenericType     = (c,t)  => string.Format("{0}(Of {1})", c, t);
+WriteTableProperty  = (tt,name,pname,maxlen,maxplen) =>
+{
+	WriteLine("");
+	WriteLine("Public ReadOnly Property {0}(){1} As Table(Of {2})", pname, LenDiff(maxplen, pname), name);
+	WriteLine("\tGet");
+	WriteLine("\t\tReturn Me.GetTable(Of {0})()", name);
+	WriteLine("\tEnd Get");
+	WriteLine("End Property");
+};
+WriteAttribute      = (tt,a) => WriteLine("<{0}> _", a.Replace("=", ":="));
+WriteAttributeLine  =  tt    => {};
+
+RenderColumn = (tt,c,maxLens,attrs) =>
+{
+	WriteLine("");
+
+	var type = MakeType(c.Type);
+
+	if (!tt.RenderField)
+		WriteLine("Private _{0} As {1}", c.MemberName, type);
+
+	attrs = attrs.Where(_ => _ != null).ToArray();
+
+	if (attrs.Length > 0)
+		WriteLine("<{0}> _", string.Join(", ", attrs).Replace("=", ":="));
+
+	if (tt.RenderField)
+		WriteLine("Public {0} As {1}", c.MemberName, type);
+	else
+	{
+		WriteLine("Public Property {0} As {1}", c.MemberName, type);
+		WriteLine("\tGet");
+		WriteLine("\t\tReturn Me._{0}", c.MemberName);
+		WriteLine("\tEnd Get");
+		WriteLine("\tSet");
+		WriteLine("\t\tMe._{0} = value", c.MemberName);
+		WriteLine("\tEnd Set");
+		WriteLine("End Property");
+	}
+};
+
+RenderForeignKey = (tt,key) =>
+{
+	WriteComment(tt, " " + key.KeyName);
+
+	var type = "" ;
+	if (key.AssociationType == AssociationType.OneToMany)
+		type = string.Format(OneToManyAssociationType, key.OtherTable.ClassName);
+	else
+		type = key.OtherTable.ClassName ;
+
+	if (!RenderField)
+		WriteLine("Private _{0} As {1}", key.MemberName, type);
+
+	WriteLine("<Association(ThisKey:=\"{0}\", OtherKey:=\"{1}\")> _",
+		string.Join(", ", (from c in key.ThisColumns  select c.MemberName).ToArray()),
+		string.Join(", ", (from c in key.OtherColumns select c.MemberName).ToArray()));
+
+	if (RenderField)
+		WriteLine("Public {0} As {1}", key.MemberName, type);
+	else
+	{
+		WriteLine("Public Property {0} As {1}", key.MemberName, type);
+		WriteLine("\tGet");
+		WriteLine("\t\tReturn Me._{0}", key.MemberName);
+		WriteLine("\tEnd Get");
+		WriteLine("\tSet");
+		WriteLine("\t\tMe._{0} = value", key.MemberName);
+		WriteLine("\tEnd Set");
+		WriteLine("End Property");
+	}
+};
+
+MakeType = t =>
+{
+	switch (t)
+	{
+		case "byte[]"   : return "Byte()";
+		case "string"   : return "String";
+		case "byte"     : return "Byte";
+		case "byte?"    : return "Byte?";
+		case "bool"     : return "Boolean";
+		case "bool?"    : return "Boolean?";
+		case "object"   : return "Object";
+		case "short"    : return "Short";
+		case "short?"   : return "Short?";
+		case "decimal"  : return "Decimal";
+		case "decimal?" : return "Decimal?";
+		case "int"      : return "Integer";
+		case "int?"     : return "Integer?";
+		case "float"    : return "Single";
+		case "float?"   : return "Single?";
+		case "double"   : return "Double";
+		case "double?"  : return "Double?";
+		case "long"     : return "Long";
+		case "long?"    : return "Long?";
+	}
+	
+	return t;
+};
+#>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Templates/ValidationAttributes.ttinclude	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,32 @@
+<#
+	{
+		var validationPrevBeforeGenerateModel = BeforeGenerateModel;
+
+		BeforeGenerateModel = tt =>
+		{
+			validationPrevBeforeGenerateModel(tt);
+
+			Usings.Add("BLToolkit.Validation");
+
+			foreach (var t in Tables.Values)
+			{
+				var maxLength = t.Columns.Values
+					.Where (x => x.Type == "string")
+					.Select(x => x.Length)
+					.OrderByDescending(x => x)
+					.FirstOrDefault()
+					// Get exponent slowly
+					.ToString().Length;
+
+				foreach (var c in t.Columns.Values)
+				{
+					if (c.Type == "string" && c.Length > 0)
+						c.Attributes.Add(string.Format("MaxLength({0," + maxLength + "})", c.Length));
+
+					if (!c.IsNullable)
+						c.Attributes.Add("Required");
+				}
+			}
+		};
+	}
+#>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Templates/WCFAttributes.ttinclude	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,25 @@
+<#
+	{
+		var wcfPrevBeforeGenerateModel = BeforeGenerateModel;
+
+		BeforeGenerateModel = tt =>
+		{
+			wcfPrevBeforeGenerateModel(tt);
+
+			Usings.Add("System.Runtime.Serialization");
+
+			foreach (var t in Tables.Values)
+				t.Attributes.AddRange(new[]
+				{
+					"Serializable",
+					"DataContract" + (DataContractNamespace == null ? "" : "(Namespace=\"" + DataContractNamespace + "\")")
+				});
+
+			foreach (var t in Tables.Values)
+				foreach (var c in t.Columns.Values)
+					c.Attributes.Add("DataMember");
+		};
+	}
+#><#+
+string DataContractNamespace = null;
+#>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/AutoImplementInterfaceAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+using System;
+
+namespace BLToolkit.TypeBuilder
+{
+	[AttributeUsage(AttributeTargets.Interface)]
+	public class AutoImplementInterfaceAttribute : Attribute
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/BLToolkitGeneratedAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+using System;
+
+namespace BLToolkit.TypeBuilder
+{
+	[AttributeUsage(AttributeTargets.All)]
+	public sealed class BLToolkitGeneratedAttribute : Attribute
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/Builders/AbstractClassBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,746 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Diagnostics.CodeAnalysis;
+
+namespace BLToolkit.TypeBuilder.Builders
+{
+	using Properties;
+	using Reflection;
+	using Reflection.Emit;
+
+	internal class AbstractClassBuilder : ITypeBuilder
+	{
+		public AbstractClassBuilder(Type sourceType)
+		{
+			_sourceType = sourceType;
+		}
+
+		readonly Type _sourceType;
+
+		public string AssemblyNameSuffix
+		{
+			get { return TypeBuilderConsts.AssemblyNameSuffix; }
+		}
+
+		public Type Build(AssemblyBuilderHelper assemblyBuilder)
+		{
+			_context  = new BuildContext(_sourceType);
+			_builders = new AbstractTypeBuilderList();
+
+			_context.TypeBuilders    = GetBuilderList(_context.Type);
+			_context.AssemblyBuilder = assemblyBuilder;
+
+			_builders.AddRange(_context.TypeBuilders);
+			_builders.Add(_defaultTypeBuilder);
+
+			return Build();
+		}
+
+		internal static string GetTypeFullName(Type type)
+		{
+			var name = type.FullName;
+
+			if (type.IsGenericType)
+			{
+				name = name.Split('`')[0];
+
+				foreach (var t in type.GetGenericArguments())
+					name += "_" + GetTypeFullName(t).Replace('+', '_').Replace('.', '_');
+			}
+
+			return name;
+		}
+
+		internal static string GetTypeShortName(Type type)
+		{
+			var name = type.Name;
+
+			if (type.IsGenericType)
+			{
+				name = name.Split('`')[0];
+
+				foreach (var t in type.GetGenericArguments())
+					name += "_" + GetTypeFullName(t).Replace('+', '_').Replace('.', '_');
+			}
+
+			return name;
+		}
+
+		public string GetTypeName()
+		{
+			var typeFullName  = _sourceType.FullName;
+			var typeShortName = _sourceType.Name;
+
+			if (_sourceType.IsGenericType)
+			{
+				typeFullName  = GetTypeFullName (_sourceType);
+				typeShortName = GetTypeShortName(_sourceType);
+			}
+
+			typeFullName  = typeFullName. Replace('+', '.');
+			typeShortName = typeShortName.Replace('+', '.');
+
+			typeFullName = typeFullName.Substring(0, typeFullName.Length - typeShortName.Length);
+			typeFullName = typeFullName + "BLToolkitExtension." + typeShortName;
+
+			return typeFullName;
+		}
+
+		public Type GetBuildingType()
+		{
+			return _sourceType;
+		}
+
+		private static AbstractTypeBuilderList GetBuilderList(TypeHelper type)
+		{
+			var attrs    = type.GetAttributes(typeof(AbstractTypeBuilderAttribute));
+			var builders = new AbstractTypeBuilderList(attrs.Length);
+
+			foreach (AbstractTypeBuilderAttribute attr in attrs)
+			{
+				var builder = attr.TypeBuilder;
+
+				if (builder != null)
+				{
+					builder.TargetElement = type;
+					builders.Add(builder);
+				}
+			}
+
+			return builders;
+		}
+
+		private static readonly DefaultTypeBuilder _defaultTypeBuilder = new DefaultTypeBuilder();
+
+		private BuildContext            _context;
+		private AbstractTypeBuilderList _builders;
+
+		private Type Build()
+		{
+			DefineNonAbstractType();
+
+			SetID(_builders);
+
+			_context.BuildElement = BuildElement.Type;
+
+			Build(BuildStep.Before, _builders);
+			Build(BuildStep.Build,  _builders);
+
+			var ids = _builders.ToDictionary(builder => builder, builder => builder.ID);
+
+			DefineAbstractProperties();
+			DefineAbstractMethods();
+			OverrideVirtualProperties();
+			OverrideVirtualMethods();
+			DefineInterfaces();
+
+			foreach (var builder in ids.Keys)
+				builder.ID = ids[builder];
+
+			_context.BuildElement = BuildElement.Type;
+
+			Build(BuildStep.After, _builders);
+
+			var initMethod = _context.Type.GetMethod("InitInstance", typeof(InitContext));
+
+			// Finalize constructors.
+			//
+			if (_context.TypeBuilder.IsDefaultConstructorDefined)
+			{
+				if (initMethod != null)
+					_context.TypeBuilder.DefaultConstructor.Emitter
+						.ldarg_0
+						.ldnull
+						.callvirt (initMethod)
+						;
+
+				_context.TypeBuilder.DefaultConstructor.Emitter.ret();
+			}
+
+			if (_context.TypeBuilder.IsInitConstructorDefined)
+			{
+				if (initMethod != null)
+					_context.TypeBuilder.InitConstructor.Emitter
+						.ldarg_0
+						.ldarg_1
+						.callvirt (initMethod)
+						;
+
+				_context.TypeBuilder.InitConstructor.Emitter.ret();
+			}
+
+			if (_context.TypeBuilder.IsTypeInitializerDefined)
+				_context.TypeBuilder.TypeInitializer.Emitter.ret();
+
+			// Create the type.
+			//
+			return _context.TypeBuilder.Create();
+		}
+
+		private static int _idCounter;
+
+		private static void SetID(AbstractTypeBuilderList builders)
+		{
+			foreach (var builder in builders)
+				builder.ID = ++_idCounter;
+		}
+
+		private static void CheckCompatibility(BuildContext context, AbstractTypeBuilderList builders)
+		{
+			for (var i = 0; i < builders.Count; i++)
+			{
+				var cur = builders[i];
+
+				if (cur == null)
+					continue;
+
+				for (var j = 0; j < builders.Count; j++)
+				{
+					var test = builders[j];
+
+					if (i == j || test == null)
+						continue;
+
+					if (cur.IsCompatible(context, test) == false)
+						builders[j] = null;
+				}
+			}
+
+			for (var i = 0; i < builders.Count; i++)
+				if (builders[i] == null)
+					builders.RemoveAt(i--);
+		}
+
+		private void DefineNonAbstractType()
+		{
+			var interfaces = new List<Type>();
+
+			if (_context.Type.IsInterface)
+			{
+				interfaces.Add(_context.Type);
+				_context.InterfaceMap.Add(_context.Type, null);
+			}
+
+			foreach (var tb in _builders)
+			{
+				var types = tb.GetInterfaces();
+
+				if (types != null)
+				{
+					foreach (var t in types)
+					{
+						if (t == null)
+							continue;
+
+						if (!t.IsInterface)
+						{
+							throw new InvalidOperationException(
+								string.Format(Resources.AbstractClassBuilder_TypeIsNotAnInterface, t.FullName));
+						}
+
+						if (interfaces.Contains(t) == false)
+						{
+							interfaces.Add(t);
+							_context.InterfaceMap.Add(t, tb);
+						}
+					}
+				}
+			}
+
+			var typeName = GetTypeName();
+
+			_context.TypeBuilder = _context.AssemblyBuilder.DefineType(
+				typeName,
+				TypeAttributes.Public | TypeAttributes.BeforeFieldInit | (TypeFactory.SealTypes? TypeAttributes.Sealed: 0),
+				_context.Type.IsInterface? typeof(object): (Type)_context.Type,
+				interfaces.ToArray());
+
+			if (_context.Type.IsSerializable)
+				_context.TypeBuilder.SetCustomAttribute(typeof(SerializableAttribute));
+		}
+
+		class BuilderComparer : IComparer<IAbstractTypeBuilder>
+		{
+			public BuilderComparer(BuildContext context)
+			{
+				_context = context;
+			}
+
+			readonly BuildContext _context;
+
+			[SuppressMessage("Microsoft.Design", "CA1062:ValidateArgumentsOfPublicMethods")]
+			public int Compare(IAbstractTypeBuilder x, IAbstractTypeBuilder y)
+			{
+				return y.GetPriority(_context) - x.GetPriority(_context);
+			}
+		}
+
+		private void Build(BuildStep step, AbstractTypeBuilderList builders)
+		{
+			_context.Step = step;
+			_context.TypeBuilders.Clear();
+
+			foreach (var builder in builders)
+				if (builder.IsApplied(_context, builders))
+					_context.TypeBuilders.Add(builder);
+
+			if (_context.IsVirtualMethod || _context.IsVirtualProperty)
+				_context.TypeBuilders.Add(_defaultTypeBuilder);
+
+			if (_context.TypeBuilders.Count == 0)
+				return;
+
+			CheckCompatibility(_context, _context.TypeBuilders);
+
+			_context.TypeBuilders.Sort(new BuilderComparer(_context));
+
+			for (var i = 0; i < _context.TypeBuilders.Count; i++)
+			{
+				var builder = _context.TypeBuilders[i];
+
+				builder.Build(_context);
+			}
+		}
+
+		private void BeginEmitMethod(MethodInfo method)
+		{
+			_context.CurrentMethod = method;
+			_context.MethodBuilder = _context.TypeBuilder.DefineMethod(method);
+
+			var emit = _context.MethodBuilder.Emitter;
+
+			// Label right before return and catch block.
+			//
+			_context.ReturnLabel = emit.DefineLabel();
+
+			// Create return value.
+			//
+			if (method.ReturnType != typeof(void))
+			{
+				_context.ReturnValue = _context.MethodBuilder.Emitter.DeclareLocal(method.ReturnType);
+				emit.Init(_context.ReturnValue);
+			}
+
+			// Initialize out parameters.
+			//
+			var parameters = method.GetParameters();
+
+			if (parameters != null)
+				emit.InitOutParameters(parameters);
+		}
+
+		private void EmitMethod(
+			AbstractTypeBuilderList builders, MethodInfo methdoInfo, BuildElement buildElement)
+		{
+			SetID(builders);
+
+			_context.BuildElement = buildElement;
+
+			var isCatchBlockRequired   = false;
+			var isFinallyBlockRequired = false;
+
+			foreach (var builder in builders)
+			{
+				isCatchBlockRequired   = isCatchBlockRequired   || IsApplied(builder, builders, BuildStep.Catch);
+				isFinallyBlockRequired = isFinallyBlockRequired || IsApplied(builder, builders, BuildStep.Finally);
+			}
+
+			BeginEmitMethod(methdoInfo);
+
+			Build(BuildStep.Begin,  builders);
+
+			var emit        = _context.MethodBuilder.Emitter;
+			var returnLabel = _context.ReturnLabel;
+
+			// Begin catch block.
+			//
+
+			if (isCatchBlockRequired || isFinallyBlockRequired)
+			{
+				_context.ReturnLabel = emit.DefineLabel();
+				emit.BeginExceptionBlock();
+			}
+
+			Build(BuildStep.Before, builders);
+			Build(BuildStep.Build,  builders);
+			Build(BuildStep.After,  builders);
+
+			if (isCatchBlockRequired || isFinallyBlockRequired)
+			{
+				emit.MarkLabel(_context.ReturnLabel);
+				_context.ReturnLabel = returnLabel;
+			}
+
+			// End catch block.
+			//
+			if (isCatchBlockRequired)
+			{
+				emit
+					.BeginCatchBlock(typeof(Exception));
+
+				_context.ReturnLabel = emit.DefineLabel();
+				_context.Exception   = emit.DeclareLocal(typeof(Exception));
+
+				emit
+					.stloc (_context.Exception);
+
+				Build(BuildStep.Catch, builders);
+
+				emit
+					.rethrow
+					.end();
+
+				emit.MarkLabel(_context.ReturnLabel);
+				_context.ReturnLabel = returnLabel;
+				_context.Exception   = null;
+			}
+
+			if (isFinallyBlockRequired)
+			{
+				emit.BeginFinallyBlock();
+				_context.ReturnLabel = emit.DefineLabel();
+
+				Build(BuildStep.Finally, builders);
+
+				emit.MarkLabel(_context.ReturnLabel);
+				_context.ReturnLabel = returnLabel;
+			}
+
+			if (isCatchBlockRequired || isFinallyBlockRequired)
+				emit.EndExceptionBlock();
+
+			Build(BuildStep.End, builders);
+
+			EndEmitMethod();
+		}
+
+		private void EndEmitMethod()
+		{
+			var emit = _context.MethodBuilder.Emitter;
+
+			// Prepare return.
+			//
+			emit.MarkLabel(_context.ReturnLabel);
+
+			if (_context.ReturnValue != null)
+				emit.ldloc(_context.ReturnValue);
+
+			emit.ret();
+
+			// Cleanup the context.
+			//
+			_context.ReturnValue   = null;
+			_context.CurrentMethod = null;
+			_context.MethodBuilder = null;
+		}
+
+		private static AbstractTypeBuilderList GetBuilders(object[] attributes, object target)
+		{
+			var builders = new AbstractTypeBuilderList(attributes.Length);
+
+			foreach (AbstractTypeBuilderAttribute attr in attributes)
+			{
+				var builder = attr.TypeBuilder;
+
+				builder.TargetElement = target;
+				builders.Add(builder);
+			}
+
+			return builders;
+		}
+
+		private static AbstractTypeBuilderList GetBuilders(MemberInfo memberInfo)
+		{
+			return GetBuilders(
+				memberInfo.GetCustomAttributes(typeof(AbstractTypeBuilderAttribute), true), memberInfo);
+		}
+
+		private static AbstractTypeBuilderList GetBuilders(ParameterInfo parameterInfo)
+		{
+			return GetBuilders(
+				parameterInfo.GetCustomAttributes(typeof(AbstractTypeBuilderAttribute), true), parameterInfo);
+		}
+
+		private static AbstractTypeBuilderList GetBuilders(ParameterInfo[] parameters)
+		{
+			var builders = new AbstractTypeBuilderList();
+
+			foreach (var pi in parameters)
+			{
+				var attributes = pi.GetCustomAttributes(typeof(AbstractTypeBuilderAttribute), true);
+
+				foreach (AbstractTypeBuilderAttribute attr in attributes)
+				{
+					var builder = attr.TypeBuilder;
+
+					builder.TargetElement = pi;
+					builders.Add(builder);
+				}
+			}
+
+			return builders;
+		}
+
+		private static AbstractTypeBuilderList Combine(params AbstractTypeBuilderList[] builders)
+		{
+			var list = new AbstractTypeBuilderList();
+
+			foreach (var l in builders)
+				list.AddRange(l);
+
+			return list;
+		}
+
+		private bool IsApplied(IAbstractTypeBuilder builder, AbstractTypeBuilderList builders, BuildStep buildStep)
+		{
+			_context.Step = buildStep;
+			return builder.IsApplied(_context, builders);
+		}
+
+		private bool IsApplied(BuildElement element, AbstractTypeBuilderList builders)
+		{
+			_context.BuildElement = element;
+
+			foreach (var builder in builders)
+			{
+				if (IsApplied(builder, builders, BuildStep.Before))  return true;
+				if (IsApplied(builder, builders, BuildStep.Build))   return true;
+				if (IsApplied(builder, builders, BuildStep.After))   return true;
+				if (IsApplied(builder, builders, BuildStep.Catch))   return true;
+				if (IsApplied(builder, builders, BuildStep.Finally)) return true;
+			}
+
+			return false;
+		}
+
+		private static void GetAbstractProperties(Type type, List<PropertyInfo> props)
+		{
+			if (props.FirstOrDefault(mi => mi.DeclaringType == type) == null)
+			{
+				props.AddRange(
+					type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance));
+
+				if (type.IsInterface)
+					foreach (var t in type.GetInterfaces())
+						GetAbstractProperties(t, props);
+			}
+		}
+
+		private void DefineAbstractProperties()
+		{
+			var props = new List<PropertyInfo>();
+
+			GetAbstractProperties(_context.Type, props);
+
+			foreach (var pi in props)
+			{
+				_context.CurrentProperty = pi;
+
+				var propertyBuilders = GetBuilders(pi);
+
+				var getter = pi.GetGetMethod(true);
+				var setter = pi.GetSetMethod(true);
+
+				if (getter != null && getter.IsAbstract ||
+					setter != null && setter.IsAbstract)
+				{
+					DefineAbstractGetter(pi, getter, propertyBuilders);
+					DefineAbstractSetter(pi, setter, propertyBuilders);
+				}
+			}
+
+			_context.CurrentProperty = null;
+		}
+
+		private void DefineAbstractGetter(
+			PropertyInfo propertyInfo, MethodInfo getter, AbstractTypeBuilderList propertyBuilders)
+		{
+			// Getter can be not defined. We will generate it anyway.
+			//
+			if (getter == null)
+#if SILVERLIGHT
+				return;
+#else
+				getter = new FakeGetter(propertyInfo);
+#endif
+
+			var builders = Combine(
+				GetBuilders(getter.GetParameters()),
+				GetBuilders(getter.ReturnParameter),
+				GetBuilders(getter),
+				propertyBuilders,
+				_builders);
+
+			EmitMethod(builders, getter, BuildElement.AbstractGetter);
+		}
+
+		private void DefineAbstractSetter(
+			PropertyInfo            propertyInfo,
+			MethodInfo              setter,
+			AbstractTypeBuilderList propertyBuilders)
+		{
+			// Setter can be not defined. We will generate it anyway.
+			//
+			if (setter == null)
+#if SILVERLIGHT
+				return;
+#else
+				setter = new FakeSetter(propertyInfo);
+#endif
+
+			var builders = Combine(
+				GetBuilders(setter.GetParameters()),
+				GetBuilders(setter.ReturnParameter),
+				GetBuilders(setter),
+				propertyBuilders,
+				_builders);
+
+			EmitMethod(builders, setter, BuildElement.AbstractSetter);
+		}
+
+		private static void GetAbstractMethods(Type type, List<MethodInfo> methods)
+		{
+			if (!methods.Exists(mi => mi.DeclaringType == type))
+			{
+				methods.AddRange(
+					type.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance));
+
+				if (type.IsInterface)
+					foreach (var t in type.GetInterfaces())
+						GetAbstractMethods(t, methods);
+			}
+		}
+
+		private void DefineAbstractMethods()
+		{
+			var methods = new List<MethodInfo>();
+
+			GetAbstractMethods(_context.Type, methods);
+
+			foreach (var method in methods)
+			{
+				if (method.IsAbstract && (method.Attributes & MethodAttributes.SpecialName) == 0)
+				{
+					var builders = Combine(
+						GetBuilders(method.GetParameters()),
+						GetBuilders(method.ReturnParameter),
+						GetBuilders(method),
+						_builders);
+
+					EmitMethod(builders, method, BuildElement.AbstractMethod);
+				}
+			}
+		}
+
+		private void OverrideVirtualProperties()
+		{
+			var props = _context.Type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
+
+			foreach (var pi in props)
+			{
+				_context.CurrentProperty = pi;
+
+				var propertyBuilders = GetBuilders(pi);
+
+				var getter = pi.GetGetMethod(true);
+
+				if (getter != null && getter.IsVirtual && !getter.IsAbstract && !getter.IsFinal)
+					OverrideGetter(getter, propertyBuilders);
+
+				var setter = pi.GetSetMethod(true);
+
+				if (setter != null && setter.IsVirtual && !setter.IsAbstract && !setter.IsFinal)
+					OverrideSetter(setter, propertyBuilders);
+			}
+
+			_context.CurrentProperty = null;
+		}
+
+		private void OverrideGetter(MethodInfo getter, AbstractTypeBuilderList propertyBuilders)
+		{
+			var builders = Combine(
+				GetBuilders(getter.GetParameters()),
+				GetBuilders(getter.ReturnParameter),
+				GetBuilders(getter),
+				propertyBuilders,
+				_builders);
+
+			if (IsApplied(BuildElement.VirtualGetter, builders))
+				EmitMethod(builders, getter, BuildElement.VirtualGetter);
+		}
+
+		private void OverrideSetter(MethodInfo setter, AbstractTypeBuilderList propertyBuilders)
+		{
+			var builders = Combine(
+				GetBuilders(setter.GetParameters()),
+				GetBuilders(setter.ReturnParameter),
+				GetBuilders(setter),
+				propertyBuilders,
+				_builders);
+
+			if (IsApplied(BuildElement.VirtualSetter, builders))
+				EmitMethod(builders, setter, BuildElement.VirtualSetter);
+		}
+
+		private void OverrideVirtualMethods()
+		{
+			var methods = _context.Type.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
+
+			foreach (var method in methods)
+			{
+				if (method.IsVirtual &&
+					method.IsAbstract == false &&
+					method.IsFinal    == false &&
+					(method.Attributes & MethodAttributes.SpecialName) == 0 &&
+					method.DeclaringType != typeof(object))
+				{
+					var builders = Combine(
+						GetBuilders(method.GetParameters()),
+						GetBuilders(method.ReturnParameter),
+						GetBuilders(method),
+						_builders);
+
+					if (IsApplied(BuildElement.VirtualMethod, builders))
+						EmitMethod(builders, method, BuildElement.VirtualMethod);
+				}
+			}
+		}
+
+		private void DefineInterfaces()
+		{
+			foreach (var de in _context.InterfaceMap)
+			{
+				_context.CurrentInterface = de.Key;
+
+				var interfaceMethods = _context.CurrentInterface.GetMethods();
+
+				foreach (var m in interfaceMethods)
+				{
+					if (_context.TypeBuilder.OverriddenMethods.ContainsKey(m))
+						continue;
+
+					BeginEmitMethod(m);
+
+					// Call builder to build the method.
+					//
+					var builder = de.Value;
+
+					if (builder != null)
+					{
+						builder.ID = ++_idCounter;
+
+						_context.BuildElement = BuildElement.InterfaceMethod;
+						_context.Step         = BuildStep.Build;
+						builder.Build(_context);
+					}
+
+					EndEmitMethod();
+				}
+
+				_context.CurrentInterface = null;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/Builders/AbstractTypeBuilderBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,428 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
+using System.Reflection;
+using System.Reflection.Emit;
+using System.Diagnostics;
+
+using BLToolkit.Reflection;
+using BLToolkit.Reflection.Emit;
+
+namespace BLToolkit.TypeBuilder.Builders
+{
+	public abstract class AbstractTypeBuilderBase : IAbstractTypeBuilder
+	{
+		public virtual Type[] GetInterfaces()
+		{
+			return null;
+		}
+
+		private int _id;
+		public  int  ID
+		{
+			get { return _id;  }
+			set { _id = value; }
+		}
+
+		private object _targetElement;
+		public  object  TargetElement
+		{
+			get { return _targetElement;  }
+			set { _targetElement = value; }
+		}
+
+		private BuildContext _context;
+		public  BuildContext  Context
+		{
+			[DebuggerStepThrough] get { return _context;  }
+			[DebuggerStepThrough] set { _context = value; }
+		}
+
+		public virtual bool IsCompatible(BuildContext context, IAbstractTypeBuilder typeBuilder)
+		{
+			return true;
+		}
+
+		protected bool IsRelative(IAbstractTypeBuilder typeBuilder)
+		{
+			if (typeBuilder == null) throw new ArgumentNullException("typeBuilder");
+
+			return GetType().IsInstanceOfType(typeBuilder) || typeBuilder.GetType().IsInstanceOfType(this);
+		}
+
+		public virtual bool IsApplied(BuildContext context, AbstractTypeBuilderList builders)
+		{
+			return false;
+		}
+
+		public virtual int GetPriority(BuildContext context)
+		{
+			return TypeBuilderConsts.Priority.Normal;
+		}
+
+		public virtual void Build(BuildContext context)
+		{
+			if (context == null) throw new ArgumentNullException("context");
+
+			Context = context;
+
+			switch (context.Step)
+			{
+				case BuildStep.Begin: BeginMethodBuild(); return;
+				case BuildStep.End:   EndMethodBuild();   return;
+			}
+
+			switch (context.BuildElement)
+			{
+				case BuildElement.Type:
+					switch (context.Step)
+					{
+						case BuildStep.Before:   BeforeBuildType(); break;
+						case BuildStep.Build:          BuildType(); break;
+						case BuildStep.After:     AfterBuildType(); break;
+						case BuildStep.Catch:     CatchBuildType(); break;
+						case BuildStep.Finally: FinallyBuildType(); break;
+					}
+
+					break;
+
+				case BuildElement.AbstractGetter:
+					switch (context.Step)
+					{
+						case BuildStep.Before:   BeforeBuildAbstractGetter(); break;
+						case BuildStep.Build:          BuildAbstractGetter(); break;
+						case BuildStep.After:     AfterBuildAbstractGetter(); break;
+						case BuildStep.Catch:     CatchBuildAbstractGetter(); break;
+						case BuildStep.Finally: FinallyBuildAbstractGetter(); break;
+					}
+
+					break;
+
+				case BuildElement.AbstractSetter:
+					switch (context.Step)
+					{
+						case BuildStep.Before:   BeforeBuildAbstractSetter(); break;
+						case BuildStep.Build:          BuildAbstractSetter(); break;
+						case BuildStep.After:     AfterBuildAbstractSetter(); break;
+						case BuildStep.Catch:     CatchBuildAbstractSetter(); break;
+						case BuildStep.Finally: FinallyBuildAbstractSetter(); break;
+					}
+
+					break;
+
+				case BuildElement.AbstractMethod:
+					switch (context.Step)
+					{
+						case BuildStep.Before:   BeforeBuildAbstractMethod(); break;
+						case BuildStep.Build:          BuildAbstractMethod(); break;
+						case BuildStep.After:     AfterBuildAbstractMethod(); break;
+						case BuildStep.Catch:     CatchBuildAbstractMethod(); break;
+						case BuildStep.Finally: FinallyBuildAbstractMethod(); break;
+					}
+
+					break;
+
+				case BuildElement.VirtualGetter:
+					switch (context.Step)
+					{
+						case BuildStep.Before:   BeforeBuildVirtualGetter(); break;
+						case BuildStep.Build:          BuildVirtualGetter(); break;
+						case BuildStep.After:     AfterBuildVirtualGetter(); break;
+						case BuildStep.Catch:     CatchBuildVirtualGetter(); break;
+						case BuildStep.Finally: FinallyBuildVirtualGetter(); break;
+					}
+
+					break;
+
+				case BuildElement.VirtualSetter:
+					switch (context.Step)
+					{
+						case BuildStep.Before:   BeforeBuildVirtualSetter(); break;
+						case BuildStep.Build:          BuildVirtualSetter(); break;
+						case BuildStep.After:     AfterBuildVirtualSetter(); break;
+						case BuildStep.Catch:     CatchBuildVirtualSetter(); break;
+						case BuildStep.Finally: FinallyBuildVirtualSetter(); break;
+					}
+
+					break;
+
+				case BuildElement.VirtualMethod:
+					switch (context.Step)
+					{
+						case BuildStep.Before:   BeforeBuildVirtualMethod(); break;
+						case BuildStep.Build:          BuildVirtualMethod(); break;
+						case BuildStep.After:     AfterBuildVirtualMethod(); break;
+						case BuildStep.Catch:     CatchBuildVirtualMethod(); break;
+						case BuildStep.Finally: FinallyBuildVirtualMethod(); break;
+					}
+
+					break;
+
+				case BuildElement.InterfaceMethod:
+					BuildInterfaceMethod();
+					break;
+			}
+		}
+
+		protected virtual void  BeforeBuildType          () {}
+		protected virtual void        BuildType          () {}
+		protected virtual void   AfterBuildType          () {}
+		protected virtual void   CatchBuildType          () {}
+		protected virtual void FinallyBuildType          () {}
+
+		protected virtual void  BeforeBuildAbstractGetter() {}
+		protected virtual void        BuildAbstractGetter() {}
+		protected virtual void   AfterBuildAbstractGetter() {}
+		protected virtual void   CatchBuildAbstractGetter() {}
+		protected virtual void FinallyBuildAbstractGetter() {}
+
+		protected virtual void  BeforeBuildAbstractSetter() {}
+		protected virtual void        BuildAbstractSetter() {}
+		protected virtual void   AfterBuildAbstractSetter() {}
+		protected virtual void   CatchBuildAbstractSetter() {}
+		protected virtual void FinallyBuildAbstractSetter() {}
+
+		protected virtual void  BeforeBuildAbstractMethod() {}
+		protected virtual void        BuildAbstractMethod() {}
+		protected virtual void   AfterBuildAbstractMethod() {}
+		protected virtual void   CatchBuildAbstractMethod() {}
+		protected virtual void FinallyBuildAbstractMethod() {}
+
+		protected virtual void  BeforeBuildVirtualGetter () {}
+		protected virtual void        BuildVirtualGetter () {}
+		protected virtual void   AfterBuildVirtualGetter () {}
+		protected virtual void   CatchBuildVirtualGetter () {}
+		protected virtual void FinallyBuildVirtualGetter () {}
+
+		protected virtual void  BeforeBuildVirtualSetter () {}
+		protected virtual void        BuildVirtualSetter () {}
+		protected virtual void   AfterBuildVirtualSetter () {}
+		protected virtual void   CatchBuildVirtualSetter () {}
+		protected virtual void FinallyBuildVirtualSetter () {}
+
+		protected virtual void  BeforeBuildVirtualMethod () {}
+		protected virtual void        BuildVirtualMethod () {}
+		protected virtual void   AfterBuildVirtualMethod () {}
+		protected virtual void   CatchBuildVirtualMethod () {}
+		protected virtual void FinallyBuildVirtualMethod () {}
+
+		protected virtual void BuildInterfaceMethod      () {}
+
+		protected virtual void BeginMethodBuild          () {}
+		protected virtual void   EndMethodBuild          () {}
+
+		#region Helpers
+
+		[SuppressMessage("Microsoft.Design", "CA1011:ConsiderPassingBaseTypesAsParameters")]
+		protected bool CallLazyInstanceInsurer(FieldBuilder field)
+		{
+			if (field == null) throw new ArgumentNullException("field");
+
+			MethodBuilderHelper ensurer = Context.GetFieldInstanceEnsurer(field.Name);
+
+			if (ensurer != null)
+			{
+				Context.MethodBuilder.Emitter
+					.ldarg_0
+					.call    (ensurer);
+			}
+
+			return ensurer != null;
+		}
+
+		[SuppressMessage("Microsoft.Performance", "CA1818:DoNotConcatenateStringsInsideLoops")]
+		protected virtual string GetFieldName(PropertyInfo propertyInfo)
+		{
+			string name = propertyInfo.Name;
+
+			if (char.IsUpper(name[0]) && name.Length > 1 && char.IsLower(name[1]))
+				name = char.ToLower(name[0]) + name.Substring(1, name.Length - 1);
+
+			name = "_" + name;
+
+			foreach (ParameterInfo p in propertyInfo.GetIndexParameters())
+				name += "." + p.ParameterType.FullName;//.Replace(".", "_").Replace("+", "_");
+
+			return name;
+		}
+
+		protected string GetFieldName()
+		{
+			return GetFieldName(Context.CurrentProperty);
+		}
+
+		protected FieldBuilder GetPropertyInfoField(PropertyInfo property)
+		{
+			string       fieldName = GetFieldName(property) + "_$propertyInfo";
+			FieldBuilder field     = Context.GetField(fieldName);
+
+			if (field == null)
+			{
+				field = Context.CreatePrivateStaticField(fieldName, typeof(PropertyInfo));
+
+				EmitHelper emit = Context.TypeBuilder.TypeInitializer.Emitter;
+
+				ParameterInfo[] index      = property.GetIndexParameters();
+
+				emit
+					.LoadType (Context.Type)
+					.ldstr    (property.Name)
+					.LoadType (property.PropertyType)
+					;
+
+				if (index.Length == 0)
+				{
+					emit
+						.ldsfld (typeof(Type).GetField("EmptyTypes"))
+						;
+				}
+				else
+				{
+					emit
+						.ldc_i4 (index.Length) 
+						.newarr (typeof(Type))
+						;
+
+					for (int i = 0; i < index.Length; i++)
+						emit
+							.dup
+							.ldc_i4     (i) 
+							.LoadType   (index[i].ParameterType)
+							.stelem_ref
+							.end()
+							;
+				}
+
+				emit
+					.call   (typeof(TypeHelper).GetMethod("GetPropertyInfo"))
+					.stsfld (field)
+					;
+			}
+
+			return field;
+		}
+
+		protected FieldBuilder GetPropertyInfoField()
+		{
+			return GetPropertyInfoField(Context.CurrentProperty);
+		}
+
+		protected FieldBuilder GetParameterField()
+		{
+			string       fieldName = GetFieldName() + "_$parameters";
+			FieldBuilder field     = Context.GetField(fieldName);
+
+			if (field == null)
+			{
+				field = Context.CreatePrivateStaticField(fieldName, typeof(object[]));
+
+				FieldBuilder piField = GetPropertyInfoField();
+				EmitHelper   emit    = Context.TypeBuilder.TypeInitializer.Emitter;
+
+				emit
+					.ldsfld (piField)
+					.call   (typeof(TypeHelper).GetMethod("GetPropertyParameters"))
+					.stsfld (field)
+					;
+			}
+
+			return field;
+		}
+
+		protected FieldBuilder GetTypeAccessorField()
+		{
+			string       fieldName = "_" + GetObjectType().FullName + "_$typeAccessor";
+			FieldBuilder field     = Context.GetField(fieldName);
+
+			if (field == null)
+			{
+				field = Context.CreatePrivateStaticField(fieldName, typeof(TypeAccessor));
+
+				EmitHelper emit = Context.TypeBuilder.TypeInitializer.Emitter;
+
+				emit
+					.LoadType (GetObjectType())
+					.call     (typeof(TypeAccessor), "GetAccessor", typeof(Type))
+					.stsfld   (field)
+					;
+			}
+
+			return field;
+		}
+
+		protected FieldBuilder GetArrayInitializer(Type arrayType)
+		{
+			string       fieldName = "_array_of_$_" + arrayType.FullName;
+			FieldBuilder field     = Context.GetField(fieldName);
+
+			if (field == null)
+			{
+				field = Context.CreatePrivateStaticField(fieldName, arrayType);
+
+				EmitHelper emit = Context.TypeBuilder.TypeInitializer.Emitter;
+
+				int rank = arrayType.GetArrayRank();
+
+				if (rank > 1)
+				{
+					Type[] parameters = new Type[rank];
+
+					for (int i = 0; i < parameters.Length; i++)
+					{
+						parameters[i] = typeof(int);
+						emit.ldc_i4_0.end();
+					}
+
+					ConstructorInfo ci = TypeHelper.GetConstructor(arrayType, parameters);
+
+					emit
+						.newobj (ci)
+						.stsfld (field)
+						;
+				}
+				else
+				{
+					emit
+						.ldc_i4_0
+						.newarr   (arrayType.GetElementType())
+						.stsfld   (field)
+						;
+				}
+			}
+
+			return field;
+		}
+
+		protected FieldBuilder GetArrayInitializer()
+		{
+			return GetArrayInitializer(Context.CurrentProperty.PropertyType);
+		}
+
+		protected virtual Type GetFieldType()
+		{
+			var pi    = Context.CurrentProperty;
+			var index = pi.GetIndexParameters();
+
+			switch (index.Length)
+			{
+				case 0: return pi.PropertyType;
+				case 1: return typeof(Dictionary<object,object>);
+				default:
+					throw new InvalidOperationException();
+			}
+		}
+
+		protected virtual Type GetObjectType()
+		{
+			return GetFieldType();
+		}
+
+		protected virtual bool IsObjectHolder
+		{
+			get { return false; }
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/Builders/AbstractTypeBuilderList.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,16 @@
+using System.Collections.Generic;
+
+namespace BLToolkit.TypeBuilder.Builders
+{
+	public class AbstractTypeBuilderList : List<IAbstractTypeBuilder>
+	{
+		public AbstractTypeBuilderList()
+		{
+		}
+
+		public AbstractTypeBuilderList(int capacity)
+			: base(capacity)
+		{
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/Builders/BuildContext.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,138 @@
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Reflection.Emit;
+using System.Diagnostics;
+
+using BLToolkit.Reflection;
+using BLToolkit.Reflection.Emit;
+
+namespace BLToolkit.TypeBuilder.Builders
+{
+	[DebuggerStepThrough]
+	public class BuildContext
+	{
+		public BuildContext(Type type)
+		{
+			Type  = type;
+			Items = new Dictionary<object,object>(10);
+		}
+
+		public TypeHelper                Type            { get; private set; }
+		public AssemblyBuilderHelper     AssemblyBuilder { get; set; }
+		public TypeBuilderHelper         TypeBuilder     { get; set; }
+		public Dictionary<object,object> Items           { get; private set; }
+
+		public T GetItem<T>(string key)
+		{
+			object value;
+			return Items.TryGetValue(key, out value) ? (T)value : default(T);
+		}
+
+		private Dictionary<PropertyInfo,FieldBuilder> _fields;
+		public  Dictionary<PropertyInfo,FieldBuilder>  Fields
+		{
+			get { return _fields ?? (_fields = new Dictionary<PropertyInfo, FieldBuilder>(10)); }
+		}
+
+		private IDictionary<TypeHelper,IAbstractTypeBuilder> _interfaceMap;
+		public  IDictionary<TypeHelper,IAbstractTypeBuilder>  InterfaceMap
+		{
+			get { return _interfaceMap ?? (_interfaceMap = new Dictionary<TypeHelper,IAbstractTypeBuilder>()); }
+		}
+
+		public TypeHelper          CurrentInterface { get; set; }
+		public MethodBuilderHelper MethodBuilder    { get; set; }
+		public LocalBuilder        ReturnValue      { get; set; }
+		public LocalBuilder        Exception        { get; set; }
+		public Label               ReturnLabel      { get; set; }
+
+		#region BuildElement
+
+		public BuildElement BuildElement { get; set; }
+
+		public bool IsAbstractGetter   { get { return BuildElement == BuildElement.AbstractGetter; } }
+		public bool IsAbstractSetter   { get { return BuildElement == BuildElement.AbstractSetter; } }
+		public bool IsAbstractProperty { get { return IsAbstractGetter || IsAbstractSetter;        } }
+		public bool IsAbstractMethod   { get { return BuildElement == BuildElement.AbstractMethod; } }
+		public bool IsVirtualGetter    { get { return BuildElement == BuildElement.VirtualGetter;  } }
+		public bool IsVirtualSetter    { get { return BuildElement == BuildElement.VirtualSetter;  } }
+		public bool IsVirtualProperty  { get { return IsVirtualGetter  || IsVirtualSetter;         } }
+		public bool IsVirtualMethod    { get { return BuildElement == BuildElement.VirtualMethod;  } }
+		public bool IsGetter           { get { return IsAbstractGetter || IsVirtualGetter;         } }
+		public bool IsSetter           { get { return IsAbstractSetter || IsVirtualSetter;         } }
+		public bool IsProperty         { get { return IsGetter         || IsSetter;                } }
+		public bool IsMethod           { get { return IsAbstractMethod || IsVirtualMethod;         } }
+		public bool IsMethodOrProperty { get { return IsMethod         || IsProperty;              } }
+
+		#endregion
+
+		#region BuildStep
+
+		public BuildStep Step { get; set; }
+
+		public bool IsBeginStep   { get { return Step == BuildStep.Begin;   } }
+		public bool IsBeforeStep  { get { return Step == BuildStep.Before;  } }
+		public bool IsBuildStep   { get { return Step == BuildStep.Build;   } }
+		public bool IsAfterStep   { get { return Step == BuildStep.After;   } }
+		public bool IsCatchStep   { get { return Step == BuildStep.Catch;   } }
+		public bool IsFinallyStep { get { return Step == BuildStep.Finally; } }
+		public bool IsEndStep     { get { return Step == BuildStep.End;     } }
+
+		public bool IsBeforeOrBuildStep
+		{
+			get { return Step == BuildStep.Before || Step == BuildStep.Build; }
+		}
+
+		#endregion
+
+		public AbstractTypeBuilderList TypeBuilders    { get; set; }
+		public PropertyInfo            CurrentProperty { get; set; }
+		public MethodInfo              CurrentMethod   { get; set; }
+
+		#region Internal Methods
+
+		public FieldBuilder GetField(string fieldName)
+		{
+			return GetItem<FieldBuilder>("$BLToolkit.Field." + fieldName);
+		}
+
+		public FieldBuilder CreateField(string fieldName, Type type, FieldAttributes attributes)
+		{
+			var field = TypeBuilder.DefineField(fieldName, type, attributes);
+
+			field.SetCustomAttribute(MethodBuilder.Type.Assembly.BLToolkitAttribute);
+
+			Items.Add("$BLToolkit.Field." + fieldName, field);
+
+			return field;
+		}
+
+		public FieldBuilder CreatePrivateField(string fieldName, Type type)
+		{
+			return CreateField(fieldName, type, FieldAttributes.Private);
+		}
+
+		public FieldBuilder CreatePrivateField(PropertyInfo propertyInfo, string fieldName, Type type)
+		{
+			var field = CreateField(fieldName, type, FieldAttributes.Private);
+
+			if (propertyInfo != null)
+				Fields.Add(propertyInfo, field);
+
+			return field;
+		}
+
+		public FieldBuilder CreatePrivateStaticField(string fieldName, Type type)
+		{
+			return CreateField(fieldName, type, FieldAttributes.Private | FieldAttributes.Static);
+		}
+
+		public MethodBuilderHelper GetFieldInstanceEnsurer(string fieldName)
+		{
+			return GetItem<MethodBuilderHelper>("$BLToolkit.FieldInstanceEnsurer." + fieldName);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/Builders/BuildElement.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,14 @@
+namespace BLToolkit.TypeBuilder.Builders
+{
+	public enum BuildElement
+	{
+		Type,
+		AbstractGetter,
+		AbstractSetter,
+		AbstractMethod,
+		VirtualGetter,
+		VirtualSetter,
+		VirtualMethod,
+		InterfaceMethod
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/Builders/BuildStep.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,13 @@
+namespace BLToolkit.TypeBuilder.Builders
+{
+	public enum BuildStep
+	{
+		Begin,
+		Before,
+		Build,
+		After,
+		Catch,
+		Finally,
+		End
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/Builders/DefaultTypeBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1064 @@
+using System;
+using System.Collections;
+using System.Reflection;
+using System.Reflection.Emit;
+using System.Collections.Generic;
+
+namespace BLToolkit.TypeBuilder.Builders
+{
+	using Properties;
+	using Reflection;
+	using Reflection.Emit;
+
+	public class DefaultTypeBuilder : AbstractTypeBuilderBase
+	{
+		#region Interface Overrides
+
+		public override bool IsCompatible(BuildContext context, IAbstractTypeBuilder typeBuilder)
+		{
+			return IsRelative(typeBuilder) == false;
+		}
+
+		public override bool IsApplied(BuildContext context, AbstractTypeBuilderList builders)
+		{
+			if (context == null) throw new ArgumentNullException("context");
+
+			if (context.IsAbstractProperty && context.IsBeforeOrBuildStep)
+			{
+				return context.CurrentProperty.GetIndexParameters().Length <= 1;
+			}
+
+			return context.BuildElement == BuildElement.Type && context.IsAfterStep;
+		}
+
+		#endregion
+
+		#region Get/Set Implementation
+
+		protected override void BuildAbstractGetter()
+		{
+			var field = GetField();
+			var index = Context.CurrentProperty.GetIndexParameters();
+
+			switch (index.Length)
+			{
+				case 0:
+					Context.MethodBuilder.Emitter
+						.ldarg_0
+						.ldfld   (field)
+						.stloc   (Context.ReturnValue)
+						;
+					break;
+
+				case 1:
+					Context.MethodBuilder.Emitter
+						.ldarg_0
+						.ldfld          (field)
+						.ldarg_1
+						.boxIfValueType (index[0].ParameterType)
+						.callvirt       (typeof(Dictionary<object,object>), "get_Item", typeof(object))
+						.castType       (Context.CurrentProperty.PropertyType)
+						.stloc          (Context.ReturnValue)
+						;
+					break;
+			}
+		}
+
+		protected override void BuildAbstractSetter()
+		{
+			var field = GetField();
+			var index = Context.CurrentProperty.GetIndexParameters();
+
+			switch (index.Length)
+			{
+				case 0:
+					Context.MethodBuilder.Emitter
+						.ldarg_0
+						.ldarg_1
+						.stfld   (field)
+						;
+					//Context.MethodBuilder.Emitter.AddMaxStackSize(6);
+					break;
+
+				case 1:
+					Context.MethodBuilder.Emitter
+						.ldarg_0
+						.ldfld          (field)
+						.ldarg_1
+						.boxIfValueType (index[0].ParameterType)
+						.ldarg_2
+						.boxIfValueType (Context.CurrentProperty.PropertyType)
+						.callvirt       (typeof(Dictionary<object,object>), "set_Item", typeof(object), typeof(object))
+					;
+					break;
+			}
+		}
+
+		#endregion
+
+		#region Call Base Method
+
+		protected override void BuildVirtualGetter()
+		{
+			CallBaseMethod();
+		}
+
+		protected override void BuildVirtualSetter()
+		{
+			CallBaseMethod();
+		}
+
+		protected override void BuildVirtualMethod()
+		{
+			CallBaseMethod();
+		}
+
+		private void CallBaseMethod()
+		{
+			var emit   = Context.MethodBuilder.Emitter;
+			var method = Context.MethodBuilder.OverriddenMethod;
+			var ps     = method.GetParameters();
+
+			emit.ldarg_0.end();
+
+			for (var i = 0; i < ps.Length; i++)
+				emit.ldarg(i + 1);
+
+			emit.call(method);
+
+			if (Context.ReturnValue != null)
+				emit.stloc(Context.ReturnValue);
+		}
+
+		#endregion
+
+		#region Properties
+
+		private   static TypeHelper _initContextType;
+		protected static TypeHelper  InitContextType
+		{
+			get { return _initContextType ?? (_initContextType = new TypeHelper(typeof(InitContext))); }
+		}
+
+		#endregion
+
+		#region Field Initialization
+
+		#region Overrides
+
+		protected override void BeforeBuildAbstractGetter()
+		{
+			CallLazyInstanceInsurer(GetField());
+		}
+
+		protected override void BeforeBuildAbstractSetter()
+		{
+			var field = GetField();
+
+			if (field.FieldType != Context.CurrentProperty.PropertyType)
+				CallLazyInstanceInsurer(field);
+		}
+
+		#endregion
+
+		#region Common
+
+		protected FieldBuilder GetField()
+		{
+			var propertyInfo = Context.CurrentProperty;
+			var fieldName    = GetFieldName();
+			var fieldType    = GetFieldType();
+			var field        = Context.GetField(fieldName);
+
+			if (field == null)
+			{
+				field = Context.CreatePrivateField(propertyInfo, fieldName, fieldType);
+
+				if (TypeAccessor.IsInstanceBuildable(fieldType))
+				{
+					var noInstance = propertyInfo.GetCustomAttributes(typeof(NoInstanceAttribute), true).Length > 0;
+
+					if (IsObjectHolder && noInstance)
+					{
+						BuildHolderInstance(Context.TypeBuilder.DefaultConstructor.Emitter);
+						BuildHolderInstance(Context.TypeBuilder.InitConstructor.Emitter);
+					}
+					else if (!noInstance)
+					{
+						if (fieldType.IsClass && IsLazyInstance(fieldType))
+						{
+							BuildLazyInstanceEnsurer();
+						}
+						else
+						{
+							BuildDefaultInstance();
+							BuildInitContextInstance();
+						}
+					}
+				}
+			}
+
+			return field;
+		}
+
+		#endregion
+
+		#region Build
+
+		private void BuildHolderInstance(EmitHelper emit)
+		{
+			var fieldName  = GetFieldName();
+			var field      = Context.GetField(fieldName);
+			var fieldType  = new TypeHelper(field.FieldType);
+			var objectType = new TypeHelper(GetObjectType());
+
+			var ci = fieldType.GetPublicDefaultConstructor();
+
+			if (ci != null)
+			{
+				emit
+					.ldarg_0
+					.newobj (ci)
+					.stfld  (field)
+					;
+			}
+			else
+			{
+				if (!CheckObjectHolderCtor(fieldType, objectType))
+					return;
+
+				emit
+					.ldarg_0
+					.ldnull
+					.newobj (fieldType, objectType)
+					.stfld  (field)
+					;
+			}
+		}
+
+		private void CreateDefaultInstance(
+			FieldBuilder field, TypeHelper fieldType, TypeHelper objectType, EmitHelper emit)
+		{
+			if (!CheckObjectHolderCtor(fieldType, objectType))
+				return;
+
+			if (objectType.Type == typeof(string))
+			{
+				emit
+					.ldarg_0
+					.LoadInitValue (objectType)
+					;
+			}
+			else if (objectType.IsArray)
+			{
+				var initializer = GetArrayInitializer(objectType);
+
+				emit
+					.ldarg_0
+					.ldsfld  (initializer)
+					;
+			}
+			else
+			{
+				var ci = objectType.GetPublicDefaultConstructor();
+
+				if (ci == null)
+				{
+					if (objectType.Type.IsValueType)
+						return;
+
+					var message = string.Format(
+						Resources.TypeBuilder_PropertyTypeHasNoPublicDefaultCtor,
+						Context.CurrentProperty.Name,
+						Context.Type.FullName,
+						objectType.FullName);
+
+					emit
+						.ldstr  (message)
+						.newobj (typeof(TypeBuilderException), typeof(string))
+						.@throw
+						.end()
+						;
+
+					return;
+				}
+
+				emit
+					.ldarg_0
+					.newobj  (ci)
+					;
+			}
+
+			if (IsObjectHolder)
+			{
+				emit
+					.newobj (fieldType, objectType)
+					;
+			}
+
+			emit
+				.stfld (field)
+				;
+		}
+
+		private void CreateParametrizedInstance(
+			FieldBuilder field, TypeHelper fieldType, TypeHelper objectType, EmitHelper emit, object[] parameters)
+		{
+			if (!CheckObjectHolderCtor(fieldType, objectType))
+				return;
+
+			Stack<ConstructorInfo> genericNestedConstructors;
+			if (parameters.Length == 1)
+			{
+				var o = parameters[0];
+
+				if (o == null)
+				{
+					if (objectType.IsValueType == false)
+						emit
+							.ldarg_0
+							.ldnull
+							.end()
+							;
+
+					if (IsObjectHolder)
+					{
+						emit
+							.newobj (fieldType, objectType)
+							;
+					}
+					else
+					{
+						if (objectType.Type.IsGenericType)
+						{
+							Type nullableType = null;
+							genericNestedConstructors = GetGenericNestedConstructors(
+								objectType,
+								typeHelper =>
+									typeHelper.IsValueType == false ||
+									(typeHelper.Type.IsGenericType && typeHelper.Type.GetGenericTypeDefinition() == typeof (Nullable<>)),
+								typeHelper => { nullableType = typeHelper.Type; },
+								() => nullableType != null);
+
+							if (nullableType == null)
+								throw new Exception("Cannot find nullable type in generic types chain");
+
+							if (nullableType.IsValueType == false)
+							{
+								emit
+									.ldarg_0
+									.ldnull
+									.end()
+									;
+							}
+							else
+							{
+								var nullable = emit.DeclareLocal(nullableType);
+
+								emit
+									.ldloca(nullable)
+									.initobj(nullableType)
+									.ldarg_0
+									.ldloc(nullable)
+									;
+
+								if (genericNestedConstructors != null)
+								{
+									while (genericNestedConstructors.Count != 0)
+									{
+										emit
+											.newobj(genericNestedConstructors.Pop())
+											;
+									}
+								}
+							}
+						}
+					}
+
+					emit
+						.stfld (field)
+						;
+
+					return;
+				}
+				
+				if (objectType.Type == o.GetType())
+				{
+					if (objectType.Type == typeof(string))
+					{
+						emit
+							.ldarg_0
+							.ldstr   ((string)o)
+							.stfld   (field)
+							;
+
+						return;
+					}
+
+					if (objectType.IsValueType)
+					{
+						emit.ldarg_0.end();
+
+						if (emit.LoadWellKnownValue(o) == false)
+						{
+							emit
+								.ldsfld     (GetParameterField())
+								.ldc_i4_0
+								.ldelem_ref
+								.end()
+								;
+						}
+
+						emit.stfld(field);
+
+						return;
+					}
+				}
+			}
+
+			var types = new Type[parameters.Length];
+
+			for (var i = 0; i < parameters.Length; i++)
+			{
+				if (parameters[i] != null)
+				{
+					var t = parameters[i].GetType();
+
+					types[i] = (t.IsEnum) ? Enum.GetUnderlyingType(t) : t;
+				}
+				else
+					types[i] = typeof(object);
+			}
+
+			// Do some heuristics for Nullable<DateTime> and EditableValue<Decimal>
+			//
+			ConstructorInfo objectCtor = null;
+			genericNestedConstructors = GetGenericNestedConstructors(
+				objectType,
+				typeHelper => true,
+				typeHelper => { objectCtor = typeHelper.GetPublicConstructor(types); },
+				() => objectCtor != null);
+
+			if (objectCtor == null)
+			{
+				if (objectType.IsValueType)
+					return;
+
+				throw new TypeBuilderException(
+					string.Format(types.Length == 0?
+							Resources.TypeBuilder_PropertyTypeHasNoPublicDefaultCtor:
+							Resources.TypeBuilder_PropertyTypeHasNoPublicCtor,
+						Context.CurrentProperty.Name,
+						Context.Type.FullName,
+						objectType.FullName));
+			}
+
+			var pi = objectCtor.GetParameters();
+
+			emit.ldarg_0.end();
+
+			for (var i = 0; i < parameters.Length; i++)
+			{
+				var o     = parameters[i];
+				var oType = o.GetType();
+
+				if (emit.LoadWellKnownValue(o))
+				{
+					if (oType.IsValueType)
+					{
+						if (!pi[i].ParameterType.IsValueType)
+							emit.box(oType);
+						else if (Type.GetTypeCode(oType) != Type.GetTypeCode(pi[i].ParameterType))
+							emit.conv(pi[i].ParameterType);
+					}
+				}
+				else
+				{
+					emit
+						.ldsfld         (GetParameterField())
+						.ldc_i4         (i)
+						.ldelem_ref
+						.CastFromObject (types[i])
+						;
+
+					if (oType.IsValueType && !pi[i].ParameterType.IsValueType)
+						emit.box(oType);
+				}
+			}
+
+			emit
+				.newobj (objectCtor)
+				;
+
+			if (genericNestedConstructors != null)
+			{
+				while (genericNestedConstructors.Count != 0)
+				{
+					emit
+						.newobj(genericNestedConstructors.Pop())
+						;
+				}
+			}
+
+			if (IsObjectHolder)
+			{
+				emit
+					.newobj (fieldType, objectType)
+					;
+			}
+
+			emit
+				.stfld  (field)
+				;
+		}
+
+		private Stack<ConstructorInfo> GetGenericNestedConstructors(TypeHelper objectType, 
+			Predicate<TypeHelper> isActionable, 
+			Action<TypeHelper> action, 
+			Func<bool> isBreakCondition)
+		{
+			Stack<ConstructorInfo> genericNestedConstructors = null;
+
+			if (isActionable(objectType))
+				action(objectType);
+
+			while (objectType.Type.IsGenericType && !isBreakCondition())
+			{
+				var typeArgs = objectType.Type.GetGenericArguments();
+
+				if (typeArgs.Length == 1)
+				{
+					var genericCtor = objectType.GetPublicConstructor(typeArgs[0]);
+
+					if (genericCtor != null)
+					{
+						if (genericNestedConstructors == null)
+							genericNestedConstructors = new Stack<ConstructorInfo>();
+
+						genericNestedConstructors.Push(genericCtor);
+						objectType = typeArgs[0];
+
+						if (isActionable(objectType))
+							action(objectType);
+					}
+				}
+				else
+				{
+					throw new TypeBuilderException(
+						string.Format(Resources.TypeBuilder_GenericShouldBeSingleTyped,
+							Context.CurrentProperty.Name,
+							Context.Type.FullName,
+							objectType.FullName));
+				}
+			}
+
+			return genericNestedConstructors;
+		}
+
+		#endregion
+
+		#region Build InitContext Instance
+
+		private void BuildInitContextInstance()
+		{
+			var fieldName  = GetFieldName();
+			var field      = Context.GetField(fieldName);
+			var fieldType  = new TypeHelper(field.FieldType);
+			var objectType = new TypeHelper(GetObjectType());
+
+			var emit = Context.TypeBuilder.InitConstructor.Emitter;
+
+			var parameters = TypeHelper.GetPropertyParameters(Context.CurrentProperty);
+			var ci = objectType.GetPublicConstructor(typeof(InitContext));
+
+			if (ci != null && ci.GetParameters()[0].ParameterType != typeof(InitContext))
+				ci = null;
+
+			if (ci != null || objectType.IsAbstract)
+				CreateAbstractInitContextInstance(field, fieldType, objectType, emit, parameters);
+			else if (parameters == null)
+				CreateDefaultInstance(field, fieldType, objectType, emit);
+			else
+				CreateParametrizedInstance(field, fieldType, objectType, emit, parameters);
+		}
+
+		private void CreateAbstractInitContextInstance(
+			FieldBuilder field, TypeHelper fieldType, TypeHelper objectType, EmitHelper emit, object[] parameters)
+		{
+			if (!CheckObjectHolderCtor(fieldType, objectType))
+				return;
+
+			var memberParams = InitContextType.GetProperty("MemberParameters").GetSetMethod();
+			var parentField  = Context.GetItem<LocalBuilder>("$BLToolkit.InitContext.Parent");
+
+			if (parentField == null)
+			{
+				Context.Items.Add("$BLToolkit.InitContext.Parent", parentField = emit.DeclareLocal(typeof(object)));
+
+				var label = emit.DefineLabel();
+
+				emit
+					.ldarg_1
+					.brtrue_s  (label)
+
+					.newobj    (InitContextType.GetPublicDefaultConstructor())
+					.starg     (1)
+
+					.ldarg_1
+					.ldc_i4_1
+					.callvirt  (InitContextType.GetProperty("IsInternal").GetSetMethod())
+
+					.MarkLabel (label)
+
+					.ldarg_1
+					.callvirt  (InitContextType.GetProperty("Parent").GetGetMethod())
+					.stloc     (parentField)
+					;
+			}
+
+			emit
+				.ldarg_1
+				.ldarg_0
+				.callvirt (InitContextType.GetProperty("Parent").GetSetMethod())
+				;
+
+			var isDirty = Context.GetItem<bool?>("$BLToolkit.InitContext.DirtyParameters");
+
+			if (parameters != null)
+			{
+				emit
+					.ldarg_1
+					.ldsfld   (GetParameterField())
+					.callvirt (memberParams)
+					;
+			}
+			else if (isDirty != null && (bool)isDirty)
+			{
+				emit
+					.ldarg_1
+					.ldnull
+					.callvirt (memberParams)
+					;
+			}
+
+			if (Context.Items.ContainsKey("$BLToolkit.InitContext.DirtyParameters"))
+				Context.Items["$BLToolkit.InitContext.DirtyParameters"] = (bool?)(parameters != null);
+			else
+				Context.Items.Add("$BLToolkit.InitContext.DirtyParameters", (bool?)(parameters != null));
+
+			if (objectType.IsAbstract)
+			{
+				emit
+					.ldarg_0
+					.ldsfld             (GetTypeAccessorField())
+					.ldarg_1
+					.callvirtNoGenerics (typeof(TypeAccessor), "CreateInstanceEx", _initContextType)
+					.isinst             (objectType)
+					;
+			}
+			else
+			{
+				emit
+					.ldarg_0
+					.ldarg_1
+					.newobj  (objectType.GetPublicConstructor(typeof(InitContext)))
+					;
+			}
+
+			if (IsObjectHolder)
+			{
+				emit
+					.newobj (fieldType, objectType)
+					;
+			}
+
+			emit
+				.stfld (field)
+				;
+		}
+
+		#endregion
+
+		#region Build Default Instance
+
+		private void BuildDefaultInstance()
+		{
+			var fieldName  = GetFieldName();
+			var field      = Context.GetField(fieldName);
+			var fieldType  = new TypeHelper(field.FieldType);
+			var objectType = new TypeHelper(GetObjectType());
+
+			var emit = Context.TypeBuilder.DefaultConstructor.Emitter;
+			var ps   = TypeHelper.GetPropertyParameters(Context.CurrentProperty);
+			var ci   = objectType.GetPublicConstructor(typeof(InitContext));
+
+			if (ci != null && ci.GetParameters()[0].ParameterType != typeof(InitContext))
+				ci = null;
+
+			if (ci != null || objectType.IsAbstract)
+				CreateInitContextDefaultInstance(
+					"$BLToolkit.DefaultInitContext.", field, fieldType, objectType, emit, ps);
+			else if (ps == null)
+				CreateDefaultInstance(field, fieldType, objectType, emit);
+			else
+				CreateParametrizedInstance(field, fieldType, objectType, emit, ps);
+		}
+
+		private bool CheckObjectHolderCtor(TypeHelper fieldType, TypeHelper objectType)
+		{
+			if (IsObjectHolder)
+			{
+				var holderCi = fieldType.GetPublicConstructor(objectType);
+
+				if (holderCi == null)
+				{
+					var message = string.Format(
+						Resources.TypeBuilder_PropertyTypeHasNoCtorWithParamType,
+						Context.CurrentProperty.Name,
+						Context.Type.FullName,
+						fieldType.FullName,
+						objectType.FullName);
+
+					Context.TypeBuilder.DefaultConstructor.Emitter
+						.ldstr  (message)
+						.newobj (typeof(TypeBuilderException), typeof(string))
+						.@throw
+						.end()
+						;
+
+					return false;
+				}
+			}
+
+			return true;
+		}
+
+		private void CreateInitContextDefaultInstance(
+			string       initContextName,
+			FieldBuilder field,
+			TypeHelper   fieldType,
+			TypeHelper   objectType,
+			EmitHelper   emit,
+			object[]     parameters)
+		{
+			if (!CheckObjectHolderCtor(fieldType, objectType))
+				return;
+
+			var initField    = GetInitContextBuilder(initContextName, emit);
+			var memberParams = InitContextType.GetProperty("MemberParameters").GetSetMethod();
+
+			if (parameters != null)
+			{
+				emit
+					.ldloc    (initField)
+					.ldsfld   (GetParameterField())
+					.callvirt (memberParams)
+					;
+			}
+			else if ((bool)Context.Items["$BLToolkit.Default.DirtyParameters"])
+			{
+				emit
+					.ldloc    (initField)
+					.ldnull
+					.callvirt (memberParams)
+					;
+			}
+
+			Context.Items["$BLToolkit.Default.DirtyParameters"] = parameters != null;
+
+			if (objectType.IsAbstract)
+			{
+				emit
+					.ldarg_0
+					.ldsfld             (GetTypeAccessorField())
+					.ldloc              (initField)
+					.callvirtNoGenerics (typeof(TypeAccessor), "CreateInstanceEx", _initContextType)
+					.isinst             (objectType)
+					;
+			}
+			else
+			{
+				emit
+					.ldarg_0
+					.ldloc   (initField)
+					.newobj  (objectType.GetPublicConstructor(typeof(InitContext)))
+					;
+			}
+
+			if (IsObjectHolder)
+			{
+				emit
+					.newobj (fieldType, objectType)
+					;
+			}
+
+			emit
+				.stfld (field)
+				;
+		}
+
+		private LocalBuilder GetInitContextBuilder(
+			string initContextName, EmitHelper emit)
+		{
+			var initField = Context.GetItem<LocalBuilder>(initContextName);
+
+			if (initField == null)
+			{
+				Context.Items.Add(initContextName, initField = emit.DeclareLocal(InitContextType));
+
+				emit
+					.newobj   (InitContextType.GetPublicDefaultConstructor())
+
+					.dup
+					.ldarg_0
+					.callvirt (InitContextType.GetProperty("Parent").GetSetMethod())
+
+					.dup
+					.ldc_i4_1
+					.callvirt (InitContextType.GetProperty("IsInternal").GetSetMethod())
+
+					.stloc    (initField)
+					;
+
+				Context.Items.Add("$BLToolkit.Default.DirtyParameters", false);
+			}
+
+			return initField;
+		}
+
+		#endregion
+
+		#region Build Lazy Instance
+
+		private bool IsLazyInstance(Type type)
+		{
+			var attrs = Context.CurrentProperty.GetCustomAttributes(typeof(LazyInstanceAttribute), true);
+
+			if (attrs.Length > 0)
+				return ((LazyInstanceAttribute)attrs[0]).IsLazy;
+
+			attrs = Context.Type.GetAttributes(typeof(LazyInstancesAttribute));
+
+			foreach (LazyInstancesAttribute a in attrs)
+				if (a.Type == typeof(object) || type == a.Type || type.IsSubclassOf(a.Type))
+					return a.IsLazy;
+
+			return false;
+		}
+
+		private void BuildLazyInstanceEnsurer()
+		{
+			var fieldName  = GetFieldName();
+			var field      = Context.GetField(fieldName);
+			var fieldType  = new TypeHelper(field.FieldType);
+			var objectType = new TypeHelper(GetObjectType());
+			var ensurer    = Context.TypeBuilder.DefineMethod(
+				string.Format("$EnsureInstance{0}", fieldName),
+				MethodAttributes.Private | MethodAttributes.HideBySig);
+
+			var emit = ensurer.Emitter;
+			var end  = emit.DefineLabel();
+
+			emit
+				.ldarg_0
+				.ldfld    (field)
+				.brtrue_s (end)
+				;
+
+			var parameters = TypeHelper.GetPropertyParameters(Context.CurrentProperty);
+			var ci         = objectType.GetPublicConstructor(typeof(InitContext));
+
+			if (ci != null || objectType.IsAbstract)
+				CreateInitContextLazyInstance(field, fieldType, objectType, emit, parameters);
+			else if (parameters == null)
+				CreateDefaultInstance(field, fieldType, objectType, emit);
+			else
+				CreateParametrizedInstance(field, fieldType, objectType, emit, parameters);
+
+			emit
+				.MarkLabel(end)
+				.ret()
+				;
+
+			Context.Items.Add("$BLToolkit.FieldInstanceEnsurer." + fieldName, ensurer);
+		}
+
+		private void CreateInitContextLazyInstance(
+			FieldBuilder field,
+			TypeHelper   fieldType,
+			TypeHelper   objectType,
+			EmitHelper   emit,
+			object[]     parameters)
+		{
+			if (!CheckObjectHolderCtor(fieldType, objectType))
+				return;
+
+			var initField = emit.DeclareLocal(InitContextType);
+
+			emit
+				.newobj   (InitContextType.GetPublicDefaultConstructor())
+
+				.dup
+				.ldarg_0
+				.callvirt (InitContextType.GetProperty("Parent").GetSetMethod())
+
+				.dup
+				.ldc_i4_1
+				.callvirt (InitContextType.GetProperty("IsInternal").GetSetMethod())
+
+				.dup
+				.ldc_i4_1
+				.callvirt (InitContextType.GetProperty("IsLazyInstance").GetSetMethod())
+
+				;
+
+			if (parameters != null)
+			{
+				emit
+					.dup
+					.ldsfld   (GetParameterField())
+					.callvirt (InitContextType.GetProperty("MemberParameters").GetSetMethod())
+					;
+			}
+
+			emit
+				.stloc    (initField);
+
+			if (objectType.IsAbstract)
+			{
+				emit
+					.ldarg_0
+					.ldsfld             (GetTypeAccessorField())
+					.ldloc              (initField)
+					.callvirtNoGenerics (typeof(TypeAccessor), "CreateInstanceEx", _initContextType)
+					.isinst             (objectType)
+					;
+			}
+			else
+			{
+				emit
+					.ldarg_0
+					.ldloc   (initField)
+					.newobj  (objectType.GetPublicConstructor(typeof(InitContext)))
+					;
+			}
+
+			if (IsObjectHolder)
+			{
+				emit
+					.newobj (fieldType, objectType)
+					;
+			}
+
+			emit
+				.stfld (field)
+				;
+		}
+
+		#endregion
+
+		#region Finalize Type
+
+		protected override void AfterBuildType()
+		{
+			var isDirty = Context.GetItem<bool?>("$BLToolkit.InitContext.DirtyParameters");
+
+			if (isDirty != null && isDirty.Value)
+			{
+				Context.TypeBuilder.InitConstructor.Emitter
+					.ldarg_1
+					.ldnull
+					.callvirt (InitContextType.GetProperty("MemberParameters").GetSetMethod())
+					;
+			}
+
+			var localBuilder = Context.GetItem<LocalBuilder>("$BLToolkit.InitContext.Parent");
+
+			if (localBuilder != null)
+			{
+				Context.TypeBuilder.InitConstructor.Emitter
+					.ldarg_1
+					.ldloc    (localBuilder)
+					.callvirt (InitContextType.GetProperty("Parent").GetSetMethod())
+					;
+			}
+
+			FinalizeDefaultConstructors();
+			FinalizeInitContextConstructors();
+		}
+
+		private void FinalizeDefaultConstructors()
+		{
+			var ci = Context.Type.GetDefaultConstructor();
+
+			if (ci == null || Context.TypeBuilder.IsDefaultConstructorDefined)
+			{
+				var emit = Context.TypeBuilder.DefaultConstructor.Emitter;
+
+				if (ci != null)
+				{
+					emit.ldarg_0.call(ci);
+				}
+				else
+				{
+					ci = Context.Type.GetConstructor(typeof(InitContext));
+
+					if (ci != null)
+					{
+						var initField = GetInitContextBuilder("$BLToolkit.DefaultInitContext.", emit);
+
+						emit
+							.ldarg_0
+							.ldloc   (initField)
+							.call    (ci);
+					}
+					else
+					{
+						if (Context.Type.GetConstructors().Length > 0)
+							throw new TypeBuilderException(string.Format(
+								Resources.TypeBuilder_NoDefaultCtor,
+								Context.Type.FullName));
+					}
+				}
+			}
+		}
+
+		private void FinalizeInitContextConstructors()
+		{
+			var ci = Context.Type.GetConstructor(typeof(InitContext));
+
+			if (ci != null || Context.TypeBuilder.IsInitConstructorDefined)
+			{
+				var emit = Context.TypeBuilder.InitConstructor.Emitter;
+
+				if (ci != null)
+				{
+					emit
+						.ldarg_0
+						.ldarg_1
+						.call    (ci);
+				}
+				else
+				{
+					ci = Context.Type.GetDefaultConstructor();
+
+					if (ci != null)
+					{
+						emit.ldarg_0.call(ci);
+					}
+					else
+					{
+						if (Context.Type.GetConstructors().Length > 0)
+							throw new TypeBuilderException(
+								string.Format(Resources.TypeBuilder_NoDefaultCtor,
+									Context.Type.FullName));
+					}
+				}
+			}
+		}
+
+		#endregion
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/Builders/DuckTypeBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,282 @@
+using System;
+using System.Reflection;
+using System.Reflection.Emit;
+
+using BLToolkit.Patterns;
+using BLToolkit.Properties;
+using BLToolkit.Reflection.Emit;
+
+namespace BLToolkit.TypeBuilder.Builders
+{
+	class DuckTypeBuilder : ITypeBuilder
+	{
+		public DuckTypeBuilder(MustImplementAttribute defaultAttribute, Type interfaceType, Type[] objectTypes)
+		{
+			_interfaceType    = interfaceType;
+			_objectTypes      = objectTypes;
+			_defaultAttribute = defaultAttribute;
+		}
+
+		private readonly Type                   _interfaceType;
+		private readonly Type[]                 _objectTypes;
+		private          TypeBuilderHelper      _typeBuilder;
+		private readonly MustImplementAttribute _defaultAttribute;
+
+		#region ITypeBuilder Members
+
+		public string AssemblyNameSuffix
+		{
+			get { return "DuckType." + AbstractClassBuilder.GetTypeFullName(_interfaceType).Replace('+', '.'); }
+		}
+
+		public Type Build(AssemblyBuilderHelper assemblyBuilder)
+		{
+			_typeBuilder = assemblyBuilder.DefineType(GetTypeName(), typeof(DuckType), _interfaceType);
+
+			if (!BuildMembers(_interfaceType))
+				return null;
+
+			foreach (Type t in _interfaceType.GetInterfaces())
+				if (!BuildMembers(t))
+					return null;
+
+			return _typeBuilder.Create();
+		}
+
+		public string GetTypeName()
+		{
+			string name = String.Empty;
+
+			foreach (Type t in _objectTypes)
+			{
+				if (t != null)
+					name += AbstractClassBuilder.GetTypeFullName(t).Replace('+', '.');
+				name += "$";
+			}
+
+			return name + AssemblyNameSuffix;
+		}
+
+		public Type GetBuildingType()
+		{
+			return _interfaceType;
+		}
+
+		#endregion
+
+		private static bool CompareMethodSignature(MethodInfo m1, MethodInfo m2)
+		{
+			if (m1 == m2)
+				return true;
+
+			if (m1.Name != m2.Name)
+				return false;
+
+			if (m1.ReturnType != m2.ReturnType)
+				return false;
+
+			ParameterInfo[] ps1 = m1.GetParameters();
+			ParameterInfo[] ps2 = m2.GetParameters();
+
+			if (ps1.Length != ps2.Length)
+				return false;
+
+			for (int i = 0; i < ps1.Length; i++)
+			{
+				ParameterInfo p1 = ps1[i];
+				ParameterInfo p2 = ps2[i];
+
+				if (p1.ParameterType != p2.ParameterType ||
+#if !SILVERLIGHT
+					p1.IsIn != p2.IsIn ||
+#endif
+					p1.IsOut != p2.IsOut)
+					return false;
+			}
+
+			return true;
+		}
+
+		private bool BuildMembers(Type interfaceType)
+		{
+			FieldInfo    objectsField = typeof(DuckType).GetField("_objects", BindingFlags.NonPublic | BindingFlags.Instance);
+			BindingFlags flags        = BindingFlags.Public | BindingFlags.Instance
+				| (DuckTyping.AllowStaticMembers? BindingFlags.Static | BindingFlags.FlattenHierarchy: 0);
+
+			foreach (MethodInfo interfaceMethod in interfaceType.GetMethods(BindingFlags.Public | BindingFlags.Instance))
+			{
+				MethodInfo      targetMethod = null;
+				int             typeIndex    = 0;
+
+				for (; typeIndex < _objectTypes.Length; typeIndex++)
+				{
+					if (_objectTypes[typeIndex] == null)
+						continue;
+
+					foreach (MethodInfo mi in _objectTypes[typeIndex].GetMethods(flags))
+					{
+						if (CompareMethodSignature(interfaceMethod, mi))
+						{
+							targetMethod = mi;
+							break;
+						}
+					}
+
+					if (targetMethod == null)
+					{
+						foreach (Type intf in _objectTypes[typeIndex].GetInterfaces())
+						{
+							if (intf.IsPublic || intf.IsNestedPublic)
+							{
+								foreach (MethodInfo mi in intf.GetMethods(flags))
+								{
+									if (CompareMethodSignature(interfaceMethod, mi))
+									{
+										targetMethod = mi;
+										break;
+									}
+								}
+
+								if (targetMethod != null)
+									break;
+							}
+						}
+					}
+
+					if (targetMethod != null)
+						break;
+				}
+
+				ParameterInfo[]     ips     = interfaceMethod.GetParameters();
+				MethodBuilderHelper builder = _typeBuilder.DefineMethod(interfaceMethod);
+				EmitHelper          emit    = builder.Emitter;
+
+				if (targetMethod != null)
+				{
+					Type targetType = targetMethod.DeclaringType;
+
+					if (!targetMethod.IsStatic)
+					{
+						emit
+							.ldarg_0
+							.ldfld         (objectsField)
+							.ldc_i4        (typeIndex)
+							.ldelem_ref
+							.end()
+							;
+
+						if (targetType.IsValueType)
+						{
+							// For value types we have to use stack.
+							//
+							LocalBuilder obj = emit.DeclareLocal(targetType);
+
+							emit
+								.unbox_any (targetType)
+								.stloc     (obj)
+								.ldloca    (obj)
+								;
+						}
+						else
+							emit
+								.castclass (targetType)
+								;
+					}
+
+					foreach (ParameterInfo p in ips)
+						emit.ldarg(p);
+
+					if (targetMethod.IsStatic || targetMethod.IsFinal || targetMethod.DeclaringType.IsSealed)
+						emit
+							.call     (targetMethod)
+							.ret();
+					else
+						emit
+							.callvirt (targetMethod)
+							.ret();
+				}
+				else
+				{
+					// Method or property was not found.
+					// Insert an empty stub or stub that throws the NotImplementedException.
+					//
+					MustImplementAttribute attr = (MustImplementAttribute)
+						Attribute.GetCustomAttribute(interfaceMethod, typeof (MustImplementAttribute));
+
+					if (attr == null)
+					{
+						attr = (MustImplementAttribute)Attribute.GetCustomAttribute(
+							interfaceMethod.DeclaringType, typeof (MustImplementAttribute));
+						if (attr == null)
+							attr = _defaultAttribute;
+					}
+
+					// When the member is marked as 'Required' throw a build-time exception.
+					//
+					if (attr.Implement)
+					{
+						if (attr.ThrowException)
+						{
+							throw new TypeBuilderException(string.Format(
+								Resources.TypeBuilder_PublicMethodMustBeImplemented,
+								_objectTypes.Length > 0 && _objectTypes[0] != null ? _objectTypes[0].FullName : "???",
+								interfaceMethod));
+						}
+						else
+						{
+							// Implement == true, but ThrowException == false.
+							// In this case the null pointer will be returned.
+							// This mimics the 'as' operator behaviour.
+							//
+							return false;
+						}
+					}
+
+					if (attr.ThrowException)
+					{
+						string message = attr.ExceptionMessage;
+
+						if (message == null)
+						{
+							message = string.Format(Resources.TypeBuilder_PublicMethodNotImplemented,
+								_objectTypes.Length > 0 && _objectTypes[0] != null ? _objectTypes[0].FullName : "???",
+								interfaceMethod);
+						}
+
+						emit
+							.ldstr  (message)
+							.newobj (typeof(InvalidOperationException), typeof(string))
+							.@throw
+							.end();
+					}
+					else
+					{
+						// Emit a 'do nothing' stub.
+						//
+						LocalBuilder returnValue = null;
+
+						if (interfaceMethod.ReturnType != typeof(void))
+						{
+							returnValue = emit.DeclareLocal(interfaceMethod.ReturnType);
+							emit.Init(returnValue);
+						}
+
+						// Initialize out parameters.
+						//
+						ParameterInfo[] parameters = ips;
+
+						if (parameters != null)
+							emit.InitOutParameters(parameters);
+
+						if (returnValue != null)
+							emit.ldloc(returnValue);
+
+						emit.ret();
+					}
+				}
+			}
+
+			return true;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/Builders/FakeGetter.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,28 @@
+using System;
+using System.Reflection;
+
+namespace BLToolkit.TypeBuilder.Builders
+{
+	class FakeGetter : FakeMethodInfo
+	{
+		public FakeGetter(PropertyInfo propertyInfo) 
+			: base(propertyInfo, propertyInfo.GetSetMethod(true))
+		{
+		}
+
+		public override ParameterInfo[] GetParameters()
+		{
+			return _property.GetIndexParameters();
+		}
+
+		public override string Name
+		{
+			get { return "get_" + _property.Name; }
+		}
+
+		public override Type ReturnType
+		{
+			get { return _property.PropertyType; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/Builders/FakeMethodInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,111 @@
+using System;
+using System.Globalization;
+using System.Reflection;
+
+namespace BLToolkit.TypeBuilder.Builders
+{
+	abstract class FakeMethodInfo : MethodInfo
+	{
+		protected FakeMethodInfo(PropertyInfo propertyInfo, MethodInfo pair)
+		{
+			_property = propertyInfo;
+			_pair     = pair;
+		}
+
+		protected MethodInfo   _pair;
+		protected PropertyInfo _property;
+
+		public override MethodAttributes Attributes
+		{
+			get { return _pair.Attributes; }
+		}
+
+		public override CallingConventions CallingConvention
+		{
+			get { return _pair.CallingConvention; }
+		}
+
+		public override Type DeclaringType
+		{
+			get { return _property.DeclaringType; }
+		}
+
+		public override MethodInfo GetBaseDefinition()
+		{
+			return _pair.GetBaseDefinition();
+		}
+
+		public override object[] GetCustomAttributes(bool inherit)
+		{
+			return _property.GetCustomAttributes(inherit);
+		}
+
+		public override object[] GetCustomAttributes(Type attributeType, bool inherit)
+		{
+			return _property.GetCustomAttributes(attributeType, inherit);
+		}
+
+		public override MethodImplAttributes GetMethodImplementationFlags()
+		{
+			return _pair.GetMethodImplementationFlags();
+		}
+
+		public override object Invoke(
+			object obj, BindingFlags invokeAttr, Binder binder, object[] parameters, CultureInfo culture)
+		{
+			return null;
+		}
+
+		public override bool IsDefined(Type attributeType, bool inherit)
+		{
+			return false;
+		}
+
+		public override MemberTypes MemberType
+		{
+			get { return _property.MemberType; }
+		}
+
+		public override RuntimeMethodHandle MethodHandle
+		{
+			get { return new RuntimeMethodHandle(); }
+		}
+
+		public override Type ReflectedType
+		{
+			get { return _property.ReflectedType; }
+		}
+
+		class CustomAttributeProvider : ICustomAttributeProvider
+		{
+			static readonly object[] _object = new object[0];
+
+			public object[] GetCustomAttributes(bool inherit)
+			{
+				return _object;
+			}
+
+			public object[] GetCustomAttributes(Type attributeType, bool inherit)
+			{
+				return _object;
+			}
+
+			public bool IsDefined(Type attributeType, bool inherit)
+			{
+				return false;
+			}
+		}
+
+		static readonly CustomAttributeProvider _customAttributeProvider = new CustomAttributeProvider();
+
+		public override ICustomAttributeProvider ReturnTypeCustomAttributes
+		{
+			get { return _customAttributeProvider; }
+		}
+
+		public override ParameterInfo ReturnParameter
+		{
+			get { return new FakeParameterInfo("ret", ReturnType, this, null); }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/Builders/FakeParameterInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,92 @@
+using System;
+using System.Collections;
+using System.Reflection;
+
+namespace BLToolkit.TypeBuilder.Builders
+{
+	class FakeParameterInfo : ParameterInfo
+	{
+		public FakeParameterInfo(string name, Type type, MemberInfo memberInfo, object[] attributes)
+		{
+			_name       = name;
+			_type       = type;
+			_memberInfo = memberInfo;
+			_attributes = attributes ?? new object[0];
+		}
+
+		public FakeParameterInfo(MethodInfo method) : this(
+			"ret",
+			method.ReturnType,
+			method,
+			method.ReturnTypeCustomAttributes.GetCustomAttributes(true))
+		{
+		}
+
+		public override ParameterAttributes Attributes
+		{
+			get { return ParameterAttributes.Retval; }
+		}
+
+		public override object DefaultValue
+		{
+			get { return DBNull.Value; }
+		}
+
+		private readonly object[] _attributes;
+
+		public override object[] GetCustomAttributes(bool inherit)
+		{
+			return _attributes;
+		}
+
+		public override object[] GetCustomAttributes(Type attributeType, bool inherit)
+		{
+			if (attributeType == null) throw new ArgumentNullException("attributeType");
+
+			if (_attributes.Length == 0)
+				return (object[]) Array.CreateInstance(attributeType, 0);
+
+			ArrayList list = new ArrayList();
+
+			foreach (object o in _attributes)
+				if (o.GetType() == attributeType || attributeType.IsInstanceOfType(o))
+					list.Add(o);
+
+			return (object[]) list.ToArray(attributeType);
+		}
+
+		public override bool IsDefined(Type attributeType, bool inherit)
+		{
+			if (attributeType == null) throw new ArgumentNullException("attributeType");
+
+			foreach (object o in _attributes)
+				if (o.GetType() == attributeType || attributeType.IsInstanceOfType(o))
+					return true;
+
+			return false;
+		}
+
+		private readonly MemberInfo _memberInfo;
+		public  override MemberInfo  Member
+		{
+			get { return _memberInfo; }
+		}
+
+		private readonly string _name;
+		public  override string  Name
+		{
+			get { return _name; }
+		}
+
+		private readonly Type _type;
+		public  override Type  ParameterType
+		{
+			get { return _type; }
+		}
+
+		public override int Position
+		{
+			get { return 0; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/Builders/FakeSetter.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,34 @@
+using System;
+using System.Reflection;
+
+namespace BLToolkit.TypeBuilder.Builders
+{
+	class FakeSetter : FakeMethodInfo
+	{
+		public FakeSetter(PropertyInfo propertyInfo) 
+			: base(propertyInfo, propertyInfo.GetGetMethod(true))
+		{
+		}
+
+		public override ParameterInfo[] GetParameters()
+		{
+			var index = _property.GetIndexParameters();
+			var pi    = new ParameterInfo[index.Length + 1];
+
+			index.CopyTo(pi, 0);
+			pi[index.Length] = new FakeParameterInfo("value", _property.PropertyType, _property, null);
+
+			return pi;
+		}
+
+		public override string Name
+		{
+			get { return "set_" + _property.Name; }
+		}
+
+		public override Type ReturnType
+		{
+			get { return typeof(void); }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/Builders/GeneratedAttributeBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,136 @@
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Reflection.Emit;
+using BLToolkit.Reflection;
+
+namespace BLToolkit.TypeBuilder.Builders
+{
+	internal class GeneratedAttributeBuilder : AbstractTypeBuilderBase
+	{
+		private CustomAttributeBuilder _attributeBuilder;
+
+		public GeneratedAttributeBuilder(Type attributeType, object[] arguments, string[] names, object[] values)
+		{
+			if (attributeType == null)
+				throw new ArgumentNullException("attributeType");
+
+			ConstructorInfo constructor = null;
+
+			if (arguments == null || arguments.Length == 0)
+			{
+				constructor = attributeType.GetConstructor(Type.EmptyTypes);
+				arguments   = Type.EmptyTypes;
+			}
+			else
+			{
+				// Some arguments may be null. We can not infer a type from the null reference.
+				// So we must iterate all of them and got a suitable one.
+				//
+				foreach (ConstructorInfo ci in attributeType.GetConstructors())
+				{
+					if (CheckParameters(ci.GetParameters(), arguments))
+					{
+						constructor = ci;
+						break;
+					}
+				}
+			}
+
+			if (constructor == null)
+				throw new TypeBuilderException(string.Format("No suitable constructors found for the type '{0}'.", attributeType.FullName));
+
+			if (names == null || names.Length == 0)
+			{
+				_attributeBuilder = new CustomAttributeBuilder(constructor, arguments);
+			}
+			else if (values == null || names.Length != values.Length)
+			{
+				throw new TypeBuilderException(string.Format("Named argument names count should match named argument values count."));
+			}
+			else
+			{
+				List<PropertyInfo> namedProperties = new List<PropertyInfo>();
+				List<object>       propertyValues  = new List<object>();
+				List<FieldInfo>    namedFields     = new List<FieldInfo>();
+				List<object>       fieldValues     = new List<object>();
+
+				for (int i = 0; i < names.Length; i++)
+				{
+					string name = names[i];
+					MemberInfo[] mi = attributeType.GetMember(name);
+
+					if (mi.Length == 0)
+						throw new TypeBuilderException(string.Format("The type '{0}' does not have a public member '{1}'.", attributeType.FullName, name));
+
+					if (mi[0].MemberType == MemberTypes.Property)
+					{
+						namedProperties.Add((PropertyInfo)mi[0]);
+						propertyValues.Add(values[i]);
+					}
+					else if (mi[0].MemberType == MemberTypes.Field)
+					{
+						namedFields.Add((FieldInfo)mi[0]);
+						fieldValues.Add(values[i]);
+					}
+					else
+						throw new TypeBuilderException(string.Format("The member '{1}' of the type '{0}' is not a filed nor a property.", name, attributeType.FullName));
+				}
+
+				_attributeBuilder = new CustomAttributeBuilder(constructor, arguments,
+					namedProperties.ToArray(), propertyValues.ToArray(), namedFields.ToArray(), fieldValues.ToArray());
+			}
+		}
+
+		private static bool CheckParameters(ParameterInfo[] argumentTypes, object[] arguments)
+		{
+			if (argumentTypes.Length != arguments.Length)
+				return false;
+
+			for (int i = 0; i < arguments.Length; i++)
+			{
+				if (arguments[i] == null && argumentTypes[i].ParameterType.IsClass)
+					continue;
+
+				if (argumentTypes[i].ParameterType.IsAssignableFrom(arguments[i].GetType()))
+					continue;
+
+				// Bad match
+				//
+				return false;
+			}
+
+			return true;
+		}
+
+		public override bool IsApplied(BuildContext context, AbstractTypeBuilderList builders)
+		{
+			return context.IsAfterStep && context.BuildElement == BuildElement.Type == TargetElement is TypeHelper;
+		}
+
+		public override void Build(BuildContext context)
+		{
+			if (context.BuildElement == BuildElement.Type)
+			{
+				context.TypeBuilder.TypeBuilder.SetCustomAttribute(_attributeBuilder);
+			}
+			else if (TargetElement is MethodInfo)
+			{
+				context.MethodBuilder.MethodBuilder.SetCustomAttribute(_attributeBuilder);
+			}
+			else if (TargetElement is PropertyInfo && context.IsAbstractProperty)
+			{
+				if (_attributeBuilder != null)
+				{
+					var field = context.Fields[(PropertyInfo)TargetElement];
+
+					field.SetCustomAttribute(_attributeBuilder);
+
+					// Suppress multiple instances when the property has both getter and setter.
+					//
+					_attributeBuilder = null;
+				}
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/Builders/IAbstractTypeBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,17 @@
+using System;
+
+namespace BLToolkit.TypeBuilder.Builders
+{
+	public interface IAbstractTypeBuilder
+	{
+		int    ID            { get; set; }
+		object TargetElement { get; set; }
+
+		Type[] GetInterfaces();
+		bool   IsCompatible (BuildContext context, IAbstractTypeBuilder typeBuilder);
+
+		bool   IsApplied    (BuildContext context, AbstractTypeBuilderList builders);
+		int    GetPriority  (BuildContext context);
+		void   Build        (BuildContext context);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/Builders/ITypeBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,14 @@
+using System;
+
+using BLToolkit.Reflection.Emit;
+
+namespace BLToolkit.TypeBuilder.Builders
+{
+	public interface ITypeBuilder
+	{
+		string AssemblyNameSuffix { get; }
+		Type   Build          (AssemblyBuilderHelper assemblyBuilder);
+		string GetTypeName    ();
+		Type   GetBuildingType();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/Builders/ImplementInterfaceBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,212 @@
+using System;
+using System.Reflection.Emit;
+
+namespace BLToolkit.TypeBuilder.Builders
+{
+	using Reflection;
+
+	class ImplementInterfaceBuilder : AbstractTypeBuilderBase
+	{
+		public ImplementInterfaceBuilder(Type type)
+		{
+			_type = type;
+		}
+
+		private readonly Type _type;
+
+		public override Type[] GetInterfaces()
+		{
+			return new[] { _type };
+		}
+
+		public override bool IsApplied(BuildContext context, AbstractTypeBuilderList builders)
+		{
+			if (context == null) throw new ArgumentNullException("context");
+
+			return context.BuildElement == BuildElement.InterfaceMethod;
+		}
+
+		protected override void BuildInterfaceMethod()
+		{
+			var returnIfNonZero = false;
+			var returnIfZero    = false;
+			
+			if (Context.ReturnValue != null)
+			{
+				var attrs = Context.MethodBuilder.OverriddenMethod.ReturnTypeCustomAttributes.GetCustomAttributes(true);
+
+				foreach (var o in attrs)
+				{
+					if      (o is ReturnIfNonZeroAttribute) returnIfNonZero = true;
+					else if (o is ReturnIfZeroAttribute)    returnIfZero    = true;
+				}
+			}
+
+			var interfaceType = Context.CurrentInterface;
+			var emit          = Context.MethodBuilder.Emitter;
+
+			foreach (var de in Context.Fields)
+			{
+				var property = de.Key;
+				var field    = de.Value;
+
+				if (field.FieldType.IsPrimitive || field.FieldType == typeof(string))
+					continue;
+
+				var types = field.FieldType.GetInterfaces();
+
+				foreach (var type in types)
+				{
+					if (type != interfaceType.Type)
+						continue;
+
+					var im = field.FieldType.GetInterfaceMap(type);
+
+					for (var j = 0; j < im.InterfaceMethods.Length; j++)
+					{
+						if (im.InterfaceMethods[j] == Context.MethodBuilder.OverriddenMethod)
+						{
+							var targetMethod = im.TargetMethods[j];
+
+							var label     = new Label();
+							var checkNull = false;
+
+							if (CallLazyInstanceInsurer(field) == false && field.FieldType.IsClass)
+							{
+								// Check if field is null.
+								//
+								checkNull = true;
+
+								label = emit.DefineLabel();
+
+								emit
+									.ldarg_0
+									.ldfld     (field)
+									.brfalse_s (label)
+									;
+							}
+
+							// this.
+							//
+							emit
+								.ldarg_0
+								.end();
+
+							// Load the field and prepare it for interface method call if the method is private.
+							//
+							if (field.FieldType.IsValueType)
+							{
+								if (targetMethod.IsPublic)
+									emit.ldflda (field);
+								else
+									emit
+										.ldfld  (field)
+										.box    (field.FieldType);
+							}
+							else
+							{
+								if (targetMethod.IsPublic)
+									emit.ldfld (field);
+								else
+									emit
+										.ldfld     (field)
+										.castclass (interfaceType);
+							}
+
+							// Check parameter attributes.
+							//
+							var pi = Context.MethodBuilder.OverriddenMethod.GetParameters();
+
+							for (var k = 0; k < pi.Length; k++)
+							{
+								var attrs = pi[k].GetCustomAttributes(true);
+								var stop  = false;
+
+								foreach (var a in attrs)
+								{
+									// Parent - set this.
+									//
+									if (a is ParentAttribute)
+									{
+										emit
+											.ldarg_0
+											.end()
+											;
+
+										if (!TypeHelper.IsSameOrParent(pi[k].ParameterType, Context.Type))
+											emit
+												.castclass (pi[k].ParameterType)
+												;
+
+										stop = true;
+
+										break;
+									}
+
+									// PropertyInfo.
+									//
+									if (a is PropertyInfoAttribute)
+									{
+										var ifb = GetPropertyInfoField(property);
+
+										emit.ldsfld(ifb);
+										stop = true;
+
+										break;
+									}
+								}
+
+								if (stop)
+									continue;
+
+								// Pass argument.
+								//
+								emit.ldarg ((byte)(k + 1));
+							}
+
+							// Call the method.
+							//
+							if (field.FieldType.IsValueType)
+							{
+								if (targetMethod.IsPublic) emit.call     (targetMethod);
+								else                       emit.callvirt (im.InterfaceMethods[j]);
+							}
+							else
+							{
+								if (targetMethod.IsPublic) emit.callvirt (targetMethod);
+								else                       emit.callvirt (im.InterfaceMethods[j]);
+							}
+
+							// Return if appropriated result.
+							//
+							if (Context.ReturnValue != null)
+							{
+								emit.stloc(Context.ReturnValue);
+
+								if (returnIfNonZero)
+								{
+									emit
+										.ldloc  (Context.ReturnValue)
+										.brtrue (Context.ReturnLabel);
+								}
+								else if (returnIfZero)
+								{
+									emit
+										.ldloc   (Context.ReturnValue)
+										.brfalse (Context.ReturnLabel);
+								}
+							}
+
+							if (checkNull)
+								emit.MarkLabel(label);
+
+							break;
+						}
+					}
+
+					break;
+				}
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/Builders/InstanceTypeBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,313 @@
+using System;
+using System.Reflection;
+using System.Reflection.Emit;
+
+using BLToolkit.Properties;
+using BLToolkit.Reflection;
+using BLToolkit.Reflection.Emit;
+
+namespace BLToolkit.TypeBuilder.Builders
+{
+	class InstanceTypeBuilder : DefaultTypeBuilder
+	{
+		public InstanceTypeBuilder(Type instanceType, bool isObjectHolder)
+		{
+			_instanceType   = instanceType;
+			_isObjectHolder = isObjectHolder;
+		}
+
+		public InstanceTypeBuilder(Type propertyType, Type instanceType, bool isObjectHolder)
+		{
+			_propertyType   = propertyType;
+			_instanceType   = instanceType;
+			_isObjectHolder = isObjectHolder;
+		}
+
+		private readonly bool _isObjectHolder;
+
+		private readonly Type _propertyType;
+		public           Type  PropertyType
+		{
+			get { return _propertyType; }
+		}
+
+		private readonly Type _instanceType;
+		public           Type  InstanceType
+		{
+			get { return _instanceType; }
+		}
+
+		public override bool IsApplied(BuildContext context, AbstractTypeBuilderList builders)
+		{
+			if (context == null) throw new ArgumentNullException("context");
+
+			return
+				base.IsApplied(context, builders) &&
+				context.CurrentProperty != null &&
+				context.CurrentProperty.GetIndexParameters().Length == 0 &&
+				(PropertyType == null ||
+				 TypeHelper.IsSameOrParent(PropertyType, context.CurrentProperty.PropertyType));
+		}
+
+		protected override Type GetFieldType()
+		{
+			return InstanceType;
+		}
+
+		protected override Type GetObjectType()
+		{
+			return IsObjectHolder? Context.CurrentProperty.PropertyType: base.GetObjectType();
+		}
+
+		protected override bool IsObjectHolder
+		{
+			get { return _isObjectHolder && Context.CurrentProperty.PropertyType.IsClass; }
+		}
+
+		protected override void BuildAbstractGetter()
+		{
+			var field        = GetField();
+			var emit         = Context.MethodBuilder.Emitter;
+			var propertyType = Context.CurrentProperty.PropertyType;
+			var getter       = GetGetter();
+
+			if (InstanceType.IsValueType) emit.ldarg_0.ldflda(field);
+			else                          emit.ldarg_0.ldfld (field);
+
+			Type memberType;
+
+			if (getter is PropertyInfo)
+			{
+				var pi = ((PropertyInfo)getter);
+
+				if (InstanceType.IsValueType) emit.call    (pi.GetGetMethod());
+				else                          emit.callvirt(pi.GetGetMethod());
+
+				memberType = pi.PropertyType;
+			}
+			else if (getter is FieldInfo)
+			{
+				var fi = (FieldInfo)getter;
+
+				emit.ldfld(fi);
+
+				memberType = fi.FieldType;
+			}
+			else
+			{
+				var mi    = (MethodInfo)getter;
+				var pi = mi.GetParameters();
+
+				for (var k = 0; k < pi.Length; k++)
+				{
+					var p = pi[k];
+
+					if (p.IsDefined(typeof(ParentAttribute), true))
+					{
+						// Parent - set this.
+						//
+						emit.ldarg_0.end();
+
+						if (!TypeHelper.IsSameOrParent(p.ParameterType, Context.Type))
+							emit.castclass(p.ParameterType);
+					}
+					else if (p.IsDefined(typeof (PropertyInfoAttribute), true))
+					{
+						// PropertyInfo.
+						//
+						emit.ldsfld(GetPropertyInfoField()).end();
+					}
+					else
+						throw new TypeBuilderException(string.Format(
+							Resources.TypeBuilder_UnknownParameterType,
+							mi.Name, mi.DeclaringType.FullName, p.Name));
+
+				}
+
+				if (InstanceType.IsValueType) emit.call    (mi);
+				else                          emit.callvirt(mi);
+
+				memberType = mi.ReturnType;
+			}
+
+			if (propertyType.IsValueType)
+			{
+				if (memberType.IsValueType == false)
+					emit.CastFromObject(propertyType);
+			}
+			else
+			{
+				if (memberType != propertyType)
+					emit.castclass(propertyType);
+			}
+
+			emit.stloc(Context.ReturnValue);
+		}
+
+		protected override void BuildAbstractSetter()
+		{
+			var field        = GetField();
+			var emit         = Context.MethodBuilder.Emitter;
+			var propertyType = Context.CurrentProperty.PropertyType;
+			var setter       = GetSetter();
+
+			if (InstanceType.IsValueType) emit.ldarg_0.ldflda(field);
+			else                          emit.ldarg_0.ldfld (field);
+
+			if (setter is PropertyInfo)
+			{
+				var pi = ((PropertyInfo)setter);
+
+				emit.ldarg_1.end();
+
+				if (propertyType.IsValueType && !pi.PropertyType.IsValueType)
+					emit.box(propertyType);
+
+				if (InstanceType.IsValueType) emit.call    (pi.GetSetMethod());
+				else                          emit.callvirt(pi.GetSetMethod());
+			}
+			else if (setter is FieldInfo)
+			{
+				var fi = (FieldInfo)setter;
+
+				emit.ldarg_1.end();
+
+				if (propertyType.IsValueType && !fi.FieldType.IsValueType)
+					emit.box(propertyType);
+
+				emit.stfld(fi);
+			}
+			else
+			{
+				var mi            = (MethodInfo)setter;
+				var pi            = mi.GetParameters();
+				var gotValueParam = false;
+
+				for (var k = 0; k < pi.Length; k++)
+				{
+					var p = pi[k];
+
+					if (p.IsDefined(typeof (ParentAttribute), true))
+					{
+						// Parent - set this.
+						//
+						emit.ldarg_0.end();
+
+						if (!TypeHelper.IsSameOrParent(p.ParameterType, Context.Type))
+							emit.castclass(p.ParameterType);
+					}
+					else if (p.IsDefined(typeof (PropertyInfoAttribute), true))
+					{
+						// PropertyInfo.
+						//
+						emit.ldsfld(GetPropertyInfoField()).end();
+					}
+					else if (!gotValueParam)
+					{
+						// This must be a value.
+						//
+						emit.ldarg_1.end();
+
+						if (propertyType.IsValueType && !p.ParameterType.IsValueType)
+							emit.box(propertyType);
+
+						gotValueParam = true;
+					}
+					else
+						throw new TypeBuilderException(string.Format(
+							Resources.TypeBuilder_UnknownParameterType,
+							mi.Name, mi.DeclaringType.FullName, p.Name));
+				}
+
+				if (InstanceType.IsValueType) emit.call(mi);
+				else                          emit.callvirt(mi);
+			}
+		}
+
+		private MemberInfo GetGetter()
+		{
+			const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance;
+
+			var propertyType = Context.CurrentProperty.PropertyType;
+			var fields       = InstanceType.GetFields(bindingFlags);
+
+			foreach (var field in fields)
+			{
+				var attrs = field.GetCustomAttributes(typeof(GetValueAttribute), true);
+
+				if (attrs.Length > 0 && TypeHelper.IsSameOrParent(field.FieldType, propertyType))
+					return field;
+			}
+
+			var props = InstanceType.GetProperties(bindingFlags);
+
+			foreach (var prop in props)
+			{
+				var attrs = prop.GetCustomAttributes(typeof(GetValueAttribute), true);
+
+				if (attrs.Length > 0 && TypeHelper.IsSameOrParent(prop.PropertyType, propertyType))
+					return prop;
+			}
+
+			foreach (var field in fields)
+				if (field.Name == "Value" && TypeHelper.IsSameOrParent(field.FieldType, propertyType))
+					return field;
+
+			foreach (var prop in props)
+				if (prop.Name == "Value" && TypeHelper.IsSameOrParent(prop.PropertyType, propertyType))
+					return prop;
+
+			var method = TypeHelper.GetMethod(InstanceType, false, "GetValue", bindingFlags);
+
+			if (method != null && TypeHelper.IsSameOrParent(propertyType, method.ReturnType))
+				return method;
+
+			throw new TypeBuilderException(string.Format(
+				Resources.TypeBuilder_CannotGetGetter, InstanceType.FullName,
+				propertyType.FullName, Context.CurrentProperty.Name, Context.Type.FullName));
+		}
+
+		private MemberInfo GetSetter()
+		{
+			const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance;
+
+			var propertyType = Context.CurrentProperty.PropertyType;
+			var fields       = InstanceType.GetFields(bindingFlags);
+
+			foreach (var field in fields)
+			{
+				var attrs = field.GetCustomAttributes(typeof(SetValueAttribute), true);
+
+				if (attrs.Length > 0 && TypeHelper.IsSameOrParent(field.FieldType, propertyType))
+					return field;
+			}
+
+			var props = InstanceType.GetProperties(bindingFlags);
+
+			foreach (var prop in props)
+			{
+				var attrs = prop.GetCustomAttributes(typeof(SetValueAttribute), true);
+
+				if (attrs.Length > 0 && TypeHelper.IsSameOrParent(prop.PropertyType, propertyType))
+					return prop;
+			}
+
+			foreach (var field in fields)
+				if (field.Name == "Value" && TypeHelper.IsSameOrParent(field.FieldType, propertyType))
+					return field;
+
+			foreach (var prop in props)
+				if (prop.Name == "Value" && TypeHelper.IsSameOrParent(prop.PropertyType, propertyType))
+					return prop;
+
+			var method = TypeHelper.GetMethod(InstanceType, false, "SetValue", bindingFlags);
+
+			if (method != null && method.ReturnType == typeof(void))
+				return method;
+
+			throw new TypeBuilderException(string.Format(
+				Resources.TypeBuilder_CannotGetSetter, InstanceType.FullName,
+				propertyType.FullName, Context.CurrentProperty.Name, Context.Type.FullName));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/Builders/PropertyChangedBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,250 @@
+using System;
+using System.Reflection;
+using System.Reflection.Emit;
+using BLToolkit.Reflection;
+using BLToolkit.Reflection.Emit;
+
+namespace BLToolkit.TypeBuilder.Builders
+{
+	public class PropertyChangedBuilder : AbstractTypeBuilderBase
+	{
+		public PropertyChangedBuilder()
+			: this(Common.Configuration.NotifyOnEqualSet, true, true)
+		{
+		}
+
+		public PropertyChangedBuilder(bool notifyOnEqualSet, bool useReferenceEquals, bool skipSetterOnNoChange)
+		{
+			_notifyOnEqualSet     = notifyOnEqualSet;
+			_useReferenceEquals   = useReferenceEquals;
+			_skipSetterOnNoChange = skipSetterOnNoChange;
+		}
+
+		private readonly bool _notifyOnEqualSet;
+		private readonly bool _useReferenceEquals;
+		private readonly bool _skipSetterOnNoChange;
+
+		public override bool IsApplied(BuildContext context, AbstractTypeBuilderList builders)
+		{
+			if (context == null) throw new ArgumentNullException("context");
+
+			return context.IsSetter && (context.IsBeforeStep || context.IsAfterStep);
+		}
+
+		protected override void BeforeBuildAbstractSetter()
+		{
+			if (!_notifyOnEqualSet && Context.CurrentProperty.CanRead)
+				GenerateIsSameValueComparison();
+		}
+
+		protected override void BeforeBuildVirtualSetter()
+		{
+			if (!_notifyOnEqualSet && Context.CurrentProperty.CanRead)
+				GenerateIsSameValueComparison();
+		}
+
+		protected override void AfterBuildAbstractSetter()
+		{
+			BuildSetter();
+		}
+
+		protected override void AfterBuildVirtualSetter()
+		{
+			BuildSetter();
+		}
+
+		public override bool IsCompatible(BuildContext context, IAbstractTypeBuilder typeBuilder)
+		{
+			if (typeBuilder is PropertyChangedBuilder)
+				return false;
+
+			return base.IsCompatible(context, typeBuilder);
+		}
+
+		public override int GetPriority(BuildContext context)
+		{
+			return TypeBuilderConsts.Priority.PropChange;
+		}
+
+		private LocalBuilder _isSameValueBuilder;
+		private Label        _afterNotificationLabel;
+
+		private void GenerateIsSameValueComparison()
+		{
+			EmitHelper emit = Context.MethodBuilder.Emitter;
+
+			if (_skipSetterOnNoChange)
+				_afterNotificationLabel = emit.DefineLabel();
+			else
+				_isSameValueBuilder = emit.DeclareLocal(typeof(bool));
+
+			MethodInfo op_InequalityMethod =
+				Context.CurrentProperty.PropertyType.GetMethod("op_Inequality",
+					new Type[]
+						{
+							Context.CurrentProperty.PropertyType,
+							Context.CurrentProperty.PropertyType
+						});
+
+			if (op_InequalityMethod == null)
+			{
+				if (Context.CurrentProperty.PropertyType.IsValueType)
+				{
+					if (TypeHelper.IsNullableType(Context.CurrentProperty.PropertyType))
+					{
+						// Handled nullable types
+
+						var currentValue      = emit.DeclareLocal(Context.CurrentProperty.PropertyType);
+						var newValue          = emit.DeclareLocal(Context.CurrentProperty.PropertyType);
+						var notEqualLabel     = emit.DefineLabel();
+						var comparedLabel     = emit.DefineLabel();
+						var hasValueGetMethod = Context.CurrentProperty.PropertyType.GetProperty("HasValue").GetGetMethod();
+
+						emit
+							.ldarg_0
+							.callvirt(Context.CurrentProperty.GetGetMethod(true))
+							.stloc(currentValue)
+							.ldarg_1
+							.stloc(newValue)
+							.ldloca(currentValue)
+							.call(Context.CurrentProperty.PropertyType, "GetValueOrDefault")
+							.ldloca(newValue)
+							.call(Context.CurrentProperty.PropertyType, "GetValueOrDefault");
+
+						var nullableUnderlyingType = TypeHelper.GetUnderlyingType(Context.CurrentProperty.PropertyType);
+
+						op_InequalityMethod = nullableUnderlyingType.GetMethod("op_Inequality",
+						                                                       new Type[]
+							                                                       {
+								                                                       nullableUnderlyingType,
+								                                                       nullableUnderlyingType
+							                                                       });
+
+						if (op_InequalityMethod != null)
+						{
+							emit
+								.call(op_InequalityMethod)
+							    .brtrue_s(notEqualLabel);
+						}
+						else
+							emit.bne_un_s(notEqualLabel);
+
+						emit
+							.ldloca(currentValue)
+						    .call(hasValueGetMethod)
+						    .ldloca(newValue)
+						    .call(hasValueGetMethod)
+						    .ceq
+						    .ldc_bool(true)
+						    .ceq
+						    .br(comparedLabel)
+						    .MarkLabel(notEqualLabel)
+						    .ldc_bool(false)
+						    .MarkLabel(comparedLabel)
+						    .end();
+					}
+					else if (!Context.CurrentProperty.PropertyType.IsPrimitive)
+					{
+						// Handle structs without op_Inequality.
+						var currentValue = emit.DeclareLocal(Context.CurrentProperty.PropertyType);
+
+						emit
+							.ldarg_0
+							.callvirt(Context.CurrentProperty.GetGetMethod(true))
+							.stloc(currentValue)
+							.ldloca(currentValue)
+							.ldarg_1
+							.box(Context.CurrentProperty.PropertyType)
+							.constrained(Context.CurrentProperty.PropertyType)
+							.callvirt(typeof(object), "Equals", new [] {typeof(object)})
+							.end();
+					}
+					else
+					{
+						// Primitive value type comparison
+						emit
+							.ldarg_0
+							.callvirt(Context.CurrentProperty.GetGetMethod(true))
+							.ldarg_1
+							.ceq
+							.end();
+					}
+				}
+				else if (!_useReferenceEquals)
+				{
+					// Do not use ReferenceEquals comparison for objects
+					emit
+						.ldarg_0
+						.callvirt(Context.CurrentProperty.GetGetMethod(true))
+						.ldarg_1
+						.ceq
+						.end();
+				}
+				else
+				{
+					// ReferenceEquals comparison for objects
+					emit
+						.ldarg_0
+						.callvirt(Context.CurrentProperty.GetGetMethod(true))
+						.ldarg_1
+						.call(typeof(object), "ReferenceEquals", typeof(object), typeof(object))
+						.end();
+				}
+			}
+			else
+			{
+				// Items compared have op_Inequality operator (!=)
+				emit
+					.ldarg_0
+					.callvirt(Context.CurrentProperty.GetGetMethod(true))
+					.ldarg_1
+					.call(op_InequalityMethod)
+					.ldc_i4_0
+					.ceq
+					.end();
+			}
+
+			if (_skipSetterOnNoChange)
+				emit.brtrue(_afterNotificationLabel);
+			else
+				emit.stloc(_isSameValueBuilder);
+		}
+
+		private void BuildSetter()
+		{
+			InterfaceMapping im   = Context.Type.GetInterfaceMap(typeof(IPropertyChanged));
+			MethodInfo       mi   = im.TargetMethods[0];
+			FieldBuilder     ifb  = GetPropertyInfoField();
+			EmitHelper       emit = Context.MethodBuilder.Emitter;
+
+			if (!_notifyOnEqualSet && Context.CurrentProperty.CanRead && !_skipSetterOnNoChange)
+			{
+				_afterNotificationLabel = emit.DefineLabel();
+				emit
+					.ldloc (_isSameValueBuilder)
+					.brtrue(_afterNotificationLabel);
+			}
+
+			if (mi.IsPublic)
+			{
+				emit
+					.ldarg_0
+					.ldsfld   (ifb)
+					.callvirt (mi)
+					;
+			}
+			else
+			{
+				emit
+					.ldarg_0
+					.castclass (typeof(IPropertyChanged))
+					.ldsfld    (ifb)
+					.callvirt  (im.InterfaceMethods[0])
+					;
+			}
+
+			if (!_notifyOnEqualSet && Context.CurrentProperty.CanRead)
+				emit.MarkLabel(_afterNotificationLabel);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/Builders/TypeAccessorBuilder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,890 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Reflection.Emit;
+using System.Runtime.CompilerServices;
+
+namespace BLToolkit.TypeBuilder.Builders
+{
+	using Mapping;
+	using Reflection;
+	using Reflection.Emit;
+
+	internal class TypeAccessorBuilder : ITypeBuilder
+	{
+		public TypeAccessorBuilder(Type type, Type originalType)
+		{
+			if (type == null) throw new ArgumentNullException("type");
+			if (originalType == null) throw new ArgumentNullException("originalType");
+
+			_type         = type;
+			_originalType = originalType;
+		}
+
+		readonly TypeHelper              _type;
+		readonly TypeHelper              _originalType;
+		readonly TypeHelper              _accessorType   = new TypeHelper(typeof(TypeAccessor));
+		readonly TypeHelper              _memberAccessor = new TypeHelper(typeof(MemberAccessor));
+		readonly List<TypeBuilderHelper> _nestedTypes    = new List<TypeBuilderHelper>();
+		         TypeBuilderHelper       _typeBuilder;
+		         bool                    _friendlyAssembly;
+
+		public string AssemblyNameSuffix
+		{
+			get { return "TypeAccessor"; }
+		}
+
+		public string GetTypeName()
+		{
+			// It's a bad idea to use '.TypeAccessor' here since we got
+			// a class and a namespace with the same full name.
+			// The sgen utility fill fail in such case.
+			//
+			return _type.FullName.Replace('+', '.') + "$TypeAccessor";
+		}
+
+		public Type GetBuildingType()
+		{
+			return _type;
+		}
+
+		public Type Build(AssemblyBuilderHelper assemblyBuilder)
+		{
+			if (assemblyBuilder == null) throw new ArgumentNullException("assemblyBuilder");
+
+			// Check InternalsVisibleToAttributes of the source type's assembly.
+			// Even if the sourceType is public, it may have internal fields and props.
+			//
+			_friendlyAssembly = false;
+
+			// Usually, there is no such attribute in the source assembly.
+			// Therefore we do not cache the result.
+			//
+			var attributes = _originalType.Type.Assembly.GetCustomAttributes(typeof(InternalsVisibleToAttribute), true);
+
+			foreach (InternalsVisibleToAttribute visibleToAttribute in attributes)
+			{
+				var an = new AssemblyName(visibleToAttribute.AssemblyName);
+
+				if (AssemblyName.ReferenceMatchesDefinition(assemblyBuilder.AssemblyName, an))
+				{
+					_friendlyAssembly = true;
+					break;
+				}
+			}
+
+			if (!_originalType.Type.IsVisible && !_friendlyAssembly || 
+				(
+					from p in _originalType.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
+					from a in p.GetCustomAttributes(typeof(MapFieldAttribute), true).Cast<MapFieldAttribute>()
+					where a.Storage != null
+					select a
+				).Any())
+				return typeof (ExprTypeAccessor<,>).MakeGenericType(_type, _originalType);
+
+			var typeName = GetTypeName();
+
+			_typeBuilder = assemblyBuilder.DefineType(typeName, _accessorType);
+
+			_typeBuilder.DefaultConstructor.Emitter
+				.ldarg_0
+				.call    (TypeHelper.GetDefaultConstructor(_accessorType))
+				;
+
+			BuildCreateInstanceMethods();
+			BuildTypeProperties();
+			BuildMembers();
+			BuildObjectFactory();
+
+			_typeBuilder.DefaultConstructor.Emitter
+				.ret()
+				;
+
+			var result = _typeBuilder.Create();
+
+			foreach (TypeBuilderHelper tb in _nestedTypes)
+				tb.Create();
+
+			return result;
+		}
+
+		void BuildCreateInstanceMethods()
+		{
+			var isValueType  = _type.IsValueType;
+			var baseDefCtor  = isValueType? null: _type.GetPublicDefaultConstructor();
+			var baseInitCtor = _type.GetPublicConstructor(typeof(InitContext));
+
+			if (baseDefCtor == null && baseInitCtor == null && !isValueType)
+				return;
+
+			// CreateInstance.
+			//
+			var method = _typeBuilder.DefineMethod(_accessorType.GetMethod(false, "CreateInstance", Type.EmptyTypes));
+
+			if (baseDefCtor != null)
+			{
+				method.Emitter
+					.newobj (baseDefCtor)
+					.ret()
+					;
+			}
+			else if (isValueType)
+			{
+				var locObj = method.Emitter.DeclareLocal(_type);
+				
+				method.Emitter
+					.ldloca  (locObj)
+					.initobj (_type)
+					.ldloc   (locObj)
+					.box     (_type)
+					.ret()
+					;
+			}
+			else
+			{
+				method.Emitter
+					.ldnull
+					.newobj (baseInitCtor)
+					.ret()
+					;
+			}
+
+			// CreateInstance(IniContext).
+			//
+			method = _typeBuilder.DefineMethod(
+				_accessorType.GetMethod(false, "CreateInstance", typeof(InitContext)));
+
+			if (baseInitCtor != null)
+			{
+				method.Emitter
+					.ldarg_1
+					.newobj (baseInitCtor)
+					.ret()
+					;
+			}
+			else if (isValueType)
+			{
+				var locObj = method.Emitter.DeclareLocal(_type);
+				
+				method.Emitter
+					.ldloca  (locObj)
+					.initobj (_type)
+					.ldloc   (locObj)
+					.box     (_type)
+					.ret()
+					;
+			}
+			else
+			{
+				method.Emitter
+					.newobj (baseDefCtor)
+					.ret()
+					;
+			}
+		}
+
+		private void BuildTypeProperties()
+		{
+			// Type.
+			//
+			var method = _typeBuilder.DefineMethod(_accessorType.GetProperty("Type").GetGetMethod());
+
+			method.Emitter
+				.LoadType(_type)
+				.ret()
+				;
+
+			// OriginalType.
+			//
+			method = 
+				_typeBuilder.DefineMethod(_accessorType.GetProperty("OriginalType").GetGetMethod());
+
+			method.Emitter
+				.LoadType(_originalType)
+				.ret()
+				;
+		}
+
+		private void BuildMembers()
+		{
+			var members = new Dictionary<string,MemberInfo>();
+
+			foreach (var fi in _originalType.GetFields(BindingFlags.Instance | BindingFlags.Public))
+				AddMemberToDictionary(members, fi);
+
+			if (_friendlyAssembly)
+			{
+				foreach (var fi in _originalType.GetFields(BindingFlags.Instance | BindingFlags.NonPublic))
+					if (fi.IsAssembly || fi.IsFamilyOrAssembly)
+						AddMemberToDictionary(members, fi);
+			}
+
+			foreach (var pi in _originalType.GetProperties(BindingFlags.Instance | BindingFlags.Public))
+				if (pi.GetIndexParameters().Length == 0)
+					AddMemberToDictionary(members, pi);
+
+			var interfaceMethods = _originalType.Type.IsClass && !_originalType.Type.IsArray ? _originalType.Type.GetInterfaces().SelectMany(ti => _originalType.GetInterfaceMap(ti).TargetMethods).ToList() : new List<MethodInfo>();
+			foreach (var pi in _originalType.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic))
+			{
+				if (pi.GetIndexParameters().Length == 0)
+				{
+					var getter = pi.GetGetMethod(true);
+					var setter = pi.GetSetMethod(true);
+
+					if (getter != null && (getter.IsAbstract || interfaceMethods.Contains(getter))
+						|| setter != null && (setter.IsAbstract || interfaceMethods.Contains(setter)))
+						AddMemberToDictionary(members, pi);
+				}
+			}
+
+			foreach (var mi in members.Values)
+				BuildMember(mi);
+		}
+
+		private static void AddMemberToDictionary(IDictionary<string,MemberInfo> members, MemberInfo mi)
+		{
+			MemberInfo existing;
+
+			var name = mi.Name;
+
+			if (!members.TryGetValue(name, out existing))
+			{
+				members.Add(name, mi);
+			}
+			else if (mi.DeclaringType.IsSubclassOf(existing.DeclaringType))
+			{
+				// mi is a member of the most descendant type.
+				//
+				members[name] = mi;
+			}
+		}
+
+		private void BuildMember(MemberInfo mi)
+		{
+			var isValueType = _originalType.IsValueType;
+			var name        = "Accessor$" + mi.Name.Replace('.', '_').Replace('<', '_').Replace('>', '_');
+			var nestedType  = _typeBuilder.DefineNestedType(name, TypeAttributes.NestedPrivate, typeof(MemberAccessor));
+			var ctorBuilder = BuildNestedTypeConstructor(nestedType);
+
+			BuildGetter    (mi, nestedType);
+			if (!isValueType)
+				BuildSetter(mi, nestedType);
+			BuildInitMember(mi, ctorBuilder);
+
+			var type = mi is FieldInfo ? ((FieldInfo)mi).FieldType : ((PropertyInfo)mi).PropertyType;
+
+			BuildIsNull    (mi, nestedType, type);
+
+			if (type.IsEnum)
+				type = Enum.GetUnderlyingType(type);
+
+			var typedPropertyName = type.Name;
+
+			if (type.IsGenericType)
+			{
+				var underlyingType = Nullable.GetUnderlyingType(type);
+
+				if (underlyingType != null)
+				{
+					BuildTypedGetterForNullable    (mi, nestedType, underlyingType);
+					if (!isValueType)
+						BuildTypedSetterForNullable(mi, nestedType, underlyingType);
+
+					if (underlyingType.IsEnum)
+					{
+						// Note that PEVerify will complain on using Nullable<SomeEnum> as Nullable<Int32>.
+						// It works in the current CLR implementation, bu may not work in future releases.
+						//
+						underlyingType = Enum.GetUnderlyingType(underlyingType);
+						type = typeof(Nullable<>).MakeGenericType(underlyingType);
+					}
+
+					typedPropertyName = "Nullable" + underlyingType.Name;
+				}
+				else
+				{
+					typedPropertyName = null;
+				}
+			}
+
+			if (typedPropertyName != null)
+			{
+				BuildTypedGetter    (mi, nestedType, typedPropertyName);
+				if (!isValueType)
+					BuildTypedSetter(mi, nestedType, type, typedPropertyName);
+			}
+
+			if (!isValueType)
+				BuildCloneValueMethod(mi, nestedType, type);
+
+			// FW 1.1 wants nested types to be created before parent.
+			//
+			_nestedTypes.Add(nestedType);
+		}
+
+		private void BuildInitMember(MemberInfo mi, ConstructorBuilderHelper ctorBuilder)
+		{
+			_typeBuilder.DefaultConstructor.Emitter
+				.ldarg_0
+				.ldarg_0
+				.ldarg_0
+				.ldc_i4  (mi is FieldInfo? 1: 2)
+				.ldstr   (mi.Name)
+				.call    (_accessorType.GetMethod("GetMember", typeof(int), typeof(string)))
+				.newobj  (ctorBuilder)
+				.call    (_accessorType.GetMethod("AddMember", typeof(MemberAccessor)))
+				;
+		}
+
+		/// <summary>
+		/// Figure out is base type method is accessible by extension type method.
+		/// </summary>
+		/// <param name="method">A <see cref="MethodInfo"/> instance.</param>
+		/// <returns>True if the method access is Public or Family and it's assembly is friendly.</returns>
+		private bool IsMethodAccessible(MethodInfo method)
+		{
+			if (method == null) throw new ArgumentNullException("method");
+
+			return method.IsPublic || (_friendlyAssembly && (method.IsAssembly || method.IsFamilyOrAssembly));
+		}
+
+		private void BuildGetter(MemberInfo mi, TypeBuilderHelper nestedType)
+		{
+			var methodType = mi.DeclaringType;
+			var getMethod  = null as MethodInfo;
+
+			if (mi is PropertyInfo)
+			{
+				getMethod = ((PropertyInfo)mi).GetGetMethod();
+
+				if (getMethod == null)
+				{
+					if (_type != _originalType)
+					{
+						getMethod  = _type.GetMethod("get_" + mi.Name);
+						methodType = _type;
+					}
+
+					if (getMethod == null || !IsMethodAccessible(getMethod))
+						return;
+				}
+			}
+
+			var method = nestedType.DefineMethod(_memberAccessor.GetMethod("GetValue", typeof(object)));
+			var emit   = method.Emitter;
+
+			emit
+				.ldarg_1
+				.castType (methodType)
+				.end();
+
+			if (mi is FieldInfo)
+			{
+				var fi = (FieldInfo)mi;
+
+				emit
+					.ldfld          (fi)
+					.boxIfValueType (fi.FieldType)
+					;
+			}
+			else
+			{
+				if (methodType.IsValueType)
+				{
+					var loc = emit.DeclareLocal(methodType);
+
+					emit
+						.stloc      ((byte)loc.LocalIndex)
+						.ldloca_s   ((byte)loc.LocalIndex);
+				}
+
+				var pi = (PropertyInfo)mi;
+
+				emit
+					.callvirt       (getMethod)
+					.boxIfValueType (pi.PropertyType)
+					;
+			}
+
+			emit
+				.ret()
+				;
+
+			nestedType.DefineMethod(_memberAccessor.GetProperty("HasGetter").GetGetMethod()).Emitter
+				.ldc_i4_1
+				.ret()
+				;
+		}
+
+		private void BuildSetter(MemberInfo mi, TypeBuilderHelper nestedType)
+		{
+			var methodType = mi.DeclaringType;
+			var setMethod  = null as MethodInfo;
+
+			if (mi is PropertyInfo)
+			{
+				setMethod = ((PropertyInfo)mi).GetSetMethod();
+
+				if (setMethod == null)
+				{
+					if (_type != _originalType)
+					{
+						setMethod  = _type.GetMethod("set_" + mi.Name);
+						methodType = _type;
+					}
+
+					if (setMethod == null || !IsMethodAccessible(setMethod))
+						return;
+				}
+			}
+			//else if (((FieldInfo)mi).IsLiteral)
+			//	return;
+
+			var method = nestedType.DefineMethod(_memberAccessor.GetMethod("SetValue", typeof(object), typeof(object)));
+			var emit   = method.Emitter;
+
+			emit
+				.ldarg_1
+				.castType (methodType)
+				.ldarg_2
+				.end();
+
+			if (mi is FieldInfo)
+			{
+				var fi = (FieldInfo)mi;
+
+				emit
+					.CastFromObject (fi.FieldType)
+					.stfld          (fi)
+					;
+			}
+			else
+			{
+				var pi = (PropertyInfo)mi;
+
+				emit
+					.CastFromObject (pi.PropertyType)
+					.callvirt       (setMethod)
+					;
+			}
+
+			emit
+				.ret()
+				;
+
+			nestedType.DefineMethod(_memberAccessor.GetProperty("HasSetter").GetGetMethod()).Emitter
+				.ldc_i4_1
+				.ret()
+				;
+		}
+
+		private void BuildIsNull(
+			MemberInfo        mi,
+			TypeBuilderHelper nestedType,
+			Type              memberType)
+		{
+			var methodType = mi.DeclaringType;
+			var getMethod  = null as MethodInfo;
+			var isNullable = TypeHelper.IsNullable(memberType);
+			var isValueType = (!isNullable && memberType.IsValueType);
+
+			if (!isValueType && mi is PropertyInfo)
+			{
+				getMethod = ((PropertyInfo)mi).GetGetMethod();
+
+				if (getMethod == null)
+				{
+					if (_type != _originalType)
+					{
+						getMethod  = _type.GetMethod("get_" + mi.Name);
+						methodType = _type;
+					}
+
+					if (getMethod == null)
+						return;
+				}
+			}
+
+			var methodInfo = _memberAccessor.GetMethod("IsNull");
+
+			if (methodInfo == null)
+				return;
+
+			var method = nestedType.DefineMethod(methodInfo);
+			var emit   = method.Emitter;
+
+			if (isValueType)
+			{
+				emit
+					.ldc_i4_0
+					.end()
+					;
+			}
+			else
+			{
+				LocalBuilder locObj = null;
+
+				if (isNullable)
+					locObj = method.Emitter.DeclareLocal(memberType);
+
+				emit
+					.ldarg_1
+					.castType (methodType)
+					.end();
+
+				if (mi is FieldInfo) emit.ldfld   ((FieldInfo)mi);
+				else                 emit.callvirt(getMethod);
+
+				if (isNullable)
+				{
+					emit
+						.stloc(locObj)
+						.ldloca(locObj)
+						.call(memberType, "get_HasValue")
+						.ldc_i4_0
+						.ceq
+						.end();
+				}
+				else
+				{
+					emit
+						.ldnull
+						.ceq
+						.end();
+				}
+			}
+
+			emit
+				.ret()
+				;
+		}
+
+		private void BuildTypedGetter(
+			MemberInfo        mi,
+			TypeBuilderHelper nestedType,
+			string            typedPropertyName)
+		{
+			var methodType = mi.DeclaringType;
+			var getMethod  = null as MethodInfo;
+
+			if (mi is PropertyInfo)
+			{
+				getMethod = ((PropertyInfo)mi).GetGetMethod();
+
+				if (getMethod == null)
+				{
+					if (_type != _originalType)
+					{
+						getMethod  = _type.GetMethod("get_" + mi.Name);
+						methodType = _type;
+					}
+
+					if (getMethod == null || !IsMethodAccessible(getMethod))
+						return;
+				}
+			}
+
+			var methodInfo = _memberAccessor.GetMethod("Get" + typedPropertyName, typeof(object));
+
+			if (methodInfo == null)
+				return;
+
+			var method = nestedType.DefineMethod(methodInfo);
+			var emit   = method.Emitter;
+
+			emit
+				.ldarg_1
+				.castType (methodType)
+				.end();
+
+			if (mi is FieldInfo) emit.ldfld   ((FieldInfo)mi);
+			else                 emit.callvirt(getMethod);
+
+			emit
+				.ret()
+				;
+		}
+
+		private void BuildTypedSetter(
+			MemberInfo        mi,
+			TypeBuilderHelper nestedType,
+			Type              memberType,
+			string            typedPropertyName)
+		{
+			var methodType = mi.DeclaringType;
+			var setMethod  = null as MethodInfo;
+
+			if (mi is PropertyInfo)
+			{
+				setMethod = ((PropertyInfo)mi).GetSetMethod();
+
+				if (setMethod == null)
+				{
+					if (_type != _originalType)
+					{
+						setMethod  = _type.GetMethod("set_" + mi.Name);
+						methodType = _type;
+					}
+
+					if (setMethod == null || !IsMethodAccessible(setMethod))
+						return;
+				}
+			}
+
+			var methodInfo = _memberAccessor.GetMethod("Set" + typedPropertyName, typeof(object), memberType);
+
+			if (methodInfo == null)
+				return;
+
+			var method = nestedType.DefineMethod(methodInfo);
+			var emit   = method.Emitter;
+
+			emit
+				.ldarg_1
+				.castType (methodType)
+				.ldarg_2
+				.end();
+
+			if (mi is FieldInfo) emit.stfld   ((FieldInfo)mi);
+			else                 emit.callvirt(setMethod);
+
+			emit
+				.ret()
+				;
+		}
+
+		private void BuildCloneValueMethod(
+			MemberInfo        mi,
+			TypeBuilderHelper nestedType,
+			Type              memberType
+			)
+		{
+			var methodType = mi.DeclaringType;
+			var getMethod  = null as MethodInfo;
+			var setMethod  = null as MethodInfo;
+
+			if (mi is PropertyInfo)
+			{
+				getMethod = ((PropertyInfo)mi).GetGetMethod();
+
+				if (getMethod == null)
+				{
+					if (_type != _originalType)
+					{
+						getMethod  = _type.GetMethod("get_" + mi.Name);
+						methodType = _type;
+					}
+
+					if (getMethod == null || !IsMethodAccessible(getMethod))
+						return;
+				}
+
+				setMethod = ((PropertyInfo)mi).GetSetMethod();
+
+				if (setMethod == null)
+				{
+					if (_type != _originalType)
+					{
+						setMethod  = _type.GetMethod("set_" + mi.Name);
+						methodType = _type;
+					}
+
+					if (setMethod == null || !IsMethodAccessible(setMethod))
+						return;
+				}
+			}
+
+			var method = nestedType.DefineMethod(_memberAccessor.GetMethod("CloneValue", typeof(object), typeof(object)));
+			var emit   = method.Emitter;
+
+			emit
+				.ldarg_2
+				.castType (methodType)
+				.ldarg_1
+				.castType (methodType)
+				.end();
+
+			if (mi is FieldInfo)
+				emit.ldfld   ((FieldInfo)mi);
+			else
+				emit.callvirt(getMethod);
+
+			if (typeof(string) != memberType && TypeHelper.IsSameOrParent(typeof(ICloneable), memberType))
+			{
+				if (memberType.IsValueType)
+					emit
+						.box       (memberType)
+						.callvirt  (typeof(ICloneable), "Clone")
+						.unbox_any (memberType)
+						;
+				else
+				{
+					var valueIsNull = emit.DefineLabel();
+
+					emit
+						.dup
+						.brfalse_s (valueIsNull)
+						.callvirt  (typeof(ICloneable), "Clone")
+						.castclass (memberType)
+						.MarkLabel (valueIsNull)
+						;
+				}
+			}
+
+			if (mi is FieldInfo)
+				emit.stfld   ((FieldInfo)mi);
+			else
+				emit.callvirt(setMethod);
+
+			emit
+				.ret()
+				;
+		}
+
+		private void BuildTypedGetterForNullable(
+			MemberInfo        mi,
+			TypeBuilderHelper nestedType,
+			Type              memberType)
+		{
+			var methodType = mi.DeclaringType;
+			var getMethod  = null as MethodInfo;
+
+			if (mi is PropertyInfo)
+			{
+				getMethod = ((PropertyInfo)mi).GetGetMethod();
+
+				if (getMethod == null)
+				{
+					if (_type != _originalType)
+					{
+						getMethod  = _type.GetMethod("get_" + mi.Name);
+						methodType = _type;
+					}
+
+					if (getMethod == null || !IsMethodAccessible(getMethod))
+						return;
+				}
+			}
+
+			var setterType = (memberType.IsEnum ? Enum.GetUnderlyingType(memberType) : memberType);
+			var methodInfo = _memberAccessor.GetMethod("Get" + setterType.Name, typeof(object));
+
+			if (methodInfo == null)
+				return;
+
+			var method       = nestedType.DefineMethod(methodInfo);
+			var nullableType = typeof(Nullable<>).MakeGenericType(memberType);
+			var emit         = method.Emitter;
+
+			emit
+				.ldarg_1
+				.castType (methodType)
+				.end();
+
+			if (mi is FieldInfo)
+			{
+				emit.ldflda  ((FieldInfo)mi);
+			}
+			else
+			{
+				var locNullable = emit.DeclareLocal(nullableType);
+
+				emit
+					.callvirt (getMethod)
+					.stloc    (locNullable)
+					.ldloca   (locNullable)
+					;
+			}
+
+			emit
+				.call(nullableType, "get_Value")
+				.ret()
+				;
+		}
+
+		private void BuildTypedSetterForNullable(
+			MemberInfo        mi,
+			TypeBuilderHelper nestedType,
+			Type              memberType)
+		{
+			var methodType = mi.DeclaringType;
+			var setMethod  = null as MethodInfo;
+
+			if (mi is PropertyInfo)
+			{
+				setMethod = ((PropertyInfo)mi).GetSetMethod();
+
+				if (setMethod == null)
+				{
+					if (_type != _originalType)
+					{
+						setMethod  = _type.GetMethod("set_" + mi.Name);
+						methodType = _type;
+					}
+
+					if (setMethod == null || !IsMethodAccessible(setMethod))
+						return;
+				}
+			}
+
+			var setterType = (memberType.IsEnum ? Enum.GetUnderlyingType(memberType) : memberType);
+			var methodInfo = _memberAccessor.GetMethod("Set" + setterType.Name, typeof(object), setterType);
+
+			if (methodInfo == null)
+				return;
+
+			var method = nestedType.DefineMethod(methodInfo);
+			var emit   = method.Emitter;
+
+			emit
+				.ldarg_1
+				.castType (methodType)
+				.ldarg_2
+				.newobj   (typeof(Nullable<>).MakeGenericType(memberType), memberType)
+				.end();
+
+			if (mi is FieldInfo) emit.stfld   ((FieldInfo)mi);
+			else                 emit.callvirt(setMethod);
+
+			emit
+				.ret()
+				;
+		}
+
+		private static ConstructorBuilderHelper BuildNestedTypeConstructor(TypeBuilderHelper nestedType)
+		{
+			Type[] parameters = { typeof(TypeAccessor), typeof(MemberInfo) };
+
+			var ctorBuilder = nestedType.DefinePublicConstructor(parameters);
+
+			ctorBuilder.Emitter
+				.ldarg_0
+				.ldarg_1
+				.ldarg_2
+				.call    (TypeHelper.GetConstructor(typeof(MemberAccessor), parameters))
+				.ret()
+				;
+
+			return ctorBuilder;
+		}
+
+		private void BuildObjectFactory()
+		{
+			var attr = TypeHelper.GetFirstAttribute(_type, typeof(ObjectFactoryAttribute));
+
+			if (attr != null)
+			{
+				_typeBuilder.DefaultConstructor.Emitter
+					.ldarg_0
+					.LoadType  (_type)
+					.LoadType  (typeof(ObjectFactoryAttribute))
+					.call      (typeof(TypeHelper), "GetFirstAttribute", typeof(Type), typeof(Type))
+					.castclass (typeof(ObjectFactoryAttribute))
+					.call      (typeof(ObjectFactoryAttribute).GetProperty("ObjectFactory").GetGetMethod())
+					.call      (typeof(TypeAccessor).          GetProperty("ObjectFactory").GetSetMethod())
+					;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/Builders/TypeBuilderAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+using System;
+
+namespace BLToolkit.TypeBuilder.Builders
+{
+	public abstract class AbstractTypeBuilderAttribute : Attribute
+	{
+		public abstract IAbstractTypeBuilder TypeBuilder { get; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/Builders/TypeBuilderConsts.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,23 @@
+namespace BLToolkit.TypeBuilder.Builders
+{
+	public static class TypeBuilderConsts
+	{
+		public static class Priority
+		{
+			public const int Low              = int.MinValue / 2;
+			public const int Normal           = 0;
+			public const int High             = int.MaxValue / 2;
+
+			public const int NotNullAspect    = High;
+			public const int OverloadAspect   = High;
+			public const int AsyncAspect      = Normal;
+			public const int ClearCacheAspect = Normal;
+			public const int LoggingAspect    = Normal;
+			public const int CacheAspect      = Low;
+			public const int DataAccessor     = Low;
+			public const int PropChange       = int.MinValue + 1000000;
+		}
+
+		public const string AssemblyNameSuffix = "TypeBuilder";
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/DefaultInstanceTypeAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,13 @@
+using System;
+
+namespace BLToolkit.TypeBuilder
+{
+	[AttributeUsage(AttributeTargets.Property)]
+	public sealed class DefaultInstanceTypeAttribute : Builders.AbstractTypeBuilderAttribute
+	{
+		public override Builders.IAbstractTypeBuilder  TypeBuilder
+		{
+			get { return new Builders.DefaultTypeBuilder(); }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/GenerateAttributeAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,109 @@
+using System;
+
+namespace BLToolkit.TypeBuilder
+{
+	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)]
+	public class GenerateAttributeAttribute: Builders.AbstractTypeBuilderAttribute
+	{
+		public GenerateAttributeAttribute(Type attributeType)
+		{
+			_attributeType = attributeType;
+		}
+
+		public GenerateAttributeAttribute(Type attributeType, params object[] arguments)
+		{
+			_attributeType = attributeType;
+			_arguments     = arguments;
+		}
+
+		private readonly Type _attributeType;
+		public           Type  AttributeType
+		{
+			get { return _attributeType; }
+		}
+
+		private readonly object[] _arguments;
+		public           object[]  Arguments
+		{
+			get { return _arguments; }
+		}
+
+		private string[] _namedArgumentNames;
+		public  string[]  NamedArgumentNames
+		{
+			get { return _namedArgumentNames;  }
+			set { _namedArgumentNames = value; }
+		}
+
+		private object[] _namedArgumentValues;
+		public  object[]  NamedArgumentValues
+		{
+			get { return _namedArgumentValues;  }
+			set { _namedArgumentValues = value; }
+		}
+
+		public object this[string name]
+		{
+			get
+			{
+				if (_namedArgumentNames == null)
+					return null;
+
+				int idx = Array.IndexOf(_namedArgumentNames, name);
+
+				return idx < 0? null: _namedArgumentValues[idx];
+			}
+			set
+			{
+				if (_namedArgumentNames == null)
+				{
+					_namedArgumentNames  = new string[]{ name  };
+					_namedArgumentValues = new object[]{ value };
+					return;
+				}
+
+				int idx = Array.IndexOf(_namedArgumentNames, name);
+				if (idx < 0)
+				{
+					idx = _namedArgumentNames.Length;
+
+					Array.Resize(ref _namedArgumentNames,  idx + 1);
+					Array.Resize(ref _namedArgumentValues, idx + 1);
+
+					_namedArgumentNames [idx] = name;
+					_namedArgumentValues[idx] = value;
+				}
+				else
+				{
+					_namedArgumentValues[idx] = value;
+				}
+			}
+		}
+
+		public T GetValue<T>(string name)
+		{
+			object value = this[name];
+			return value == null? default(T): (T)value;
+		}
+
+		public T GetValue<T>(string name, T defaultValue)
+		{
+			return _namedArgumentNames == null || Array.IndexOf(_namedArgumentNames, name) < 0?
+				defaultValue : GetValue<T>(name);
+		}
+
+		public void SetValue<T>(string name, T value)
+		{
+			this[name] = value;
+		}
+
+		public override Builders.IAbstractTypeBuilder  TypeBuilder
+		{
+			get
+			{
+				return new Builders.GeneratedAttributeBuilder(
+					_attributeType, _arguments, _namedArgumentNames, _namedArgumentValues);
+			}
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/GetValueAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+using System;
+
+namespace BLToolkit.TypeBuilder
+{
+	///<summary>
+	/// Indicates that a field, property or method can be treated as a value getter.
+	///</summary>
+	[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Method)]
+	public sealed class GetValueAttribute : Attribute
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/GlobalInstanceTypeAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,78 @@
+using System;
+using System.Diagnostics.CodeAnalysis;
+
+namespace BLToolkit.TypeBuilder
+{
+	[SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes")]
+	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = true)]
+	public class GlobalInstanceTypeAttribute : InstanceTypeAttribute
+	{
+		public GlobalInstanceTypeAttribute(Type propertyType, Type instanceType)
+			: base(instanceType)
+		{
+			_propertyType = propertyType;
+		}
+
+		public GlobalInstanceTypeAttribute(Type propertyType, Type instanceType, object parameter1)
+			: base(instanceType, parameter1)
+		{
+			_propertyType = propertyType;
+		}
+
+		public GlobalInstanceTypeAttribute(Type propertyType, Type instanceType,
+			object parameter1,
+			object parameter2)
+			: base(instanceType, parameter1, parameter2)
+		{
+			_propertyType = propertyType;
+		}
+
+		public GlobalInstanceTypeAttribute(Type propertyType, Type instanceType,
+			object parameter1,
+			object parameter2,
+			object parameter3)
+			: base(instanceType, parameter1, parameter2, parameter3)
+		{
+			_propertyType = propertyType;
+		}
+
+		public GlobalInstanceTypeAttribute(Type propertyType, Type instanceType,
+			object parameter1,
+			object parameter2,
+			object parameter3,
+			object parameter4)
+			: base(instanceType, parameter1, parameter2, parameter3, parameter4)
+		{
+			_propertyType = propertyType;
+		}
+
+		public GlobalInstanceTypeAttribute(Type propertyType, Type instanceType,
+			object parameter1,
+			object parameter2,
+			object parameter3,
+			object parameter4,
+			object parameter5)
+			: base(instanceType, parameter1, parameter2, parameter3, parameter4, parameter5)
+		{
+			_propertyType = propertyType;
+		}
+
+		private readonly Type _propertyType;
+		public           Type  PropertyType
+		{
+			get { return _propertyType; }
+		}
+
+		private         Builders.IAbstractTypeBuilder _typeBuilder;
+		public override Builders.IAbstractTypeBuilder  TypeBuilder
+		{
+			get 
+			{
+				if (_typeBuilder == null)
+					_typeBuilder = new Builders.InstanceTypeBuilder(_propertyType, InstanceType, IsObjectHolder);
+
+				return _typeBuilder;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/IPropertyChanged.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+using System.Reflection;
+
+namespace BLToolkit.TypeBuilder
+{
+	[PropertyChanged]
+	public interface IPropertyChanged
+	{
+		void OnPropertyChanged(PropertyInfo propertyInfo);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/ISetParent.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+using System.Reflection;
+
+namespace BLToolkit.TypeBuilder
+{
+	public interface ISetParent
+	{
+		void SetParent([Parent]object parent, [PropertyInfo]PropertyInfo propertyInfo);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/ImplementInterfaceAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,28 @@
+using System;
+using System.Diagnostics.CodeAnalysis;
+
+using BLToolkit.TypeBuilder.Builders;
+
+namespace BLToolkit.TypeBuilder
+{
+	[SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes")]
+	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = true)]
+	public class ImplementInterfaceAttribute : AbstractTypeBuilderAttribute
+	{
+		public ImplementInterfaceAttribute(Type type)
+		{
+			_type = type;
+		}
+
+		private readonly Type _type;
+		public           Type  Type
+		{
+			get { return _type;  }
+		}
+
+		public override IAbstractTypeBuilder TypeBuilder
+		{
+			get { return new ImplementInterfaceBuilder(_type); }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/InstanceTypeAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,180 @@
+using System;
+using System.Diagnostics.CodeAnalysis;
+
+using BLToolkit.Reflection;
+
+namespace BLToolkit.TypeBuilder
+{
+	///<summary>
+	/// Specifies a value holder type.
+	///</summary>
+	[SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes")]
+	[AttributeUsage(AttributeTargets.Property)]
+	public class InstanceTypeAttribute : Builders.AbstractTypeBuilderAttribute
+	{
+		///<summary>
+		/// Initializes a new instance of the InstanceTypeAttribute class.
+		///</summary>
+		///<param name="instanceType">The <see cref="System.Type"/> of an instance.</param>
+		public InstanceTypeAttribute(Type instanceType)
+		{
+			_instanceType = instanceType;
+		}
+
+		///<summary>
+		/// Initializes a new instance of the InstanceTypeAttribute class.
+		///</summary>
+		///<param name="instanceType">The <see cref="System.Type"/> of an instance.</param>
+		///<param name="parameter1">An additional parameter.</param>
+		///<seealso cref="Parameters"/>
+		public InstanceTypeAttribute(Type instanceType, object parameter1)
+		{
+			_instanceType = instanceType;
+			SetParameters(parameter1);
+		}
+
+		///<summary>
+		/// Initializes a new instance of the InstanceTypeAttribute class.
+		///</summary>
+		///<param name="instanceType">The <see cref="System.Type"/> of an instance.</param>
+		///<param name="parameter1">An additional parameter.</param>
+		///<param name="parameter2">An additional parameter.</param>
+		///<seealso cref="Parameters"/>
+		public InstanceTypeAttribute(Type instanceType,
+			object parameter1,
+			object parameter2)
+		{
+			_instanceType = instanceType;
+			SetParameters(parameter1, parameter2);
+		}
+
+		///<summary>
+		/// Initializes a new instance of the InstanceTypeAttribute class.
+		///</summary>
+		///<param name="instanceType">The <see cref="System.Type"/> of an instance.</param>
+		///<param name="parameter1">An additional parameter.</param>
+		///<param name="parameter2">An additional parameter.</param>
+		///<param name="parameter3">An additional parameter.</param>
+		///<seealso cref="Parameters"/>
+		public InstanceTypeAttribute(Type instanceType,
+			object parameter1,
+			object parameter2,
+			object parameter3)
+		{
+			_instanceType = instanceType;
+			SetParameters(parameter1, parameter2, parameter3);
+		}
+
+		///<summary>
+		/// Initializes a new instance of the InstanceTypeAttribute class.
+		///</summary>
+		///<param name="instanceType">The <see cref="System.Type"/> of an instance.</param>
+		///<param name="parameter1">An additional parameter.</param>
+		///<param name="parameter2">An additional parameter.</param>
+		///<param name="parameter3">An additional parameter.</param>
+		///<param name="parameter4">An additional parameter.</param>
+		///<seealso cref="Parameters"/>
+		public InstanceTypeAttribute(Type instanceType,
+			object parameter1,
+			object parameter2,
+			object parameter3,
+			object parameter4)
+		{
+			_instanceType = instanceType;
+			SetParameters(parameter1, parameter2, parameter3, parameter4);
+		}
+
+		///<summary>
+		/// Initializes a new instance of the InstanceTypeAttribute class.
+		///</summary>
+		///<param name="instanceType">The <see cref="System.Type"/> of an instance.</param>
+		///<param name="parameter1">An additional parameter.</param>
+		///<param name="parameter2">An additional parameter.</param>
+		///<param name="parameter3">An additional parameter.</param>
+		///<param name="parameter4">An additional parameter.</param>
+		///<param name="parameter5">An additional parameter.</param>
+		///<seealso cref="Parameters"/>
+		public InstanceTypeAttribute(Type instanceType,
+			object parameter1,
+			object parameter2,
+			object parameter3,
+			object parameter4,
+			object parameter5)
+		{
+			_instanceType = instanceType;
+			SetParameters(parameter1, parameter2, parameter3, parameter4, parameter5);
+		}
+
+		///<summary>
+		/// Initializes a new instance of the InstanceTypeAttribute class.
+		///</summary>
+		///<param name="instanceType">The <see cref="System.Type"/> of an instance.</param>
+		///<param name="parameter1">An additional parameter.</param>
+		///<param name="parameters">More additional parameters.</param>
+		///<seealso cref="Parameters"/>
+		public InstanceTypeAttribute(Type instanceType, object parameter1, params object[] parameters)
+		{
+			_instanceType = instanceType;
+
+			// Note: we can not use something like
+			// public InstanceTypeAttribute(Type instanceType, params object[] parameters)
+			// because [InstanceType(typeof(Foo), new object[] {1,2,3})] will be treated as
+			// [InstanceType(typeof(Foo), 1, 2, 3)] so it will be not possible to specify
+			// an instance type with array as the type of the one and only parameter.
+			// An extra parameter of type object made it successul.
+
+			int len = parameters.Length;
+			Array.Resize(ref parameters, len + 1);
+			Array.ConstrainedCopy(parameters, 0, parameters, 1, len);
+			parameters[0] = parameter1;
+
+			SetParameters(parameters);
+		}
+
+		protected void SetParameters(params object[] parameters)
+		{
+			_parameters = parameters;
+		}
+
+		private object[] _parameters;
+		///<summary>
+		/// Any additional parameters passed to a value holder constructor
+		/// with <see cref="InitContext"/> parameter.
+		///</summary>
+		public  object[]  Parameters
+		{
+			get { return _parameters;  }
+		}
+
+		private readonly Type _instanceType;
+		protected        Type  InstanceType
+		{
+			get { return _instanceType; }
+		}
+
+		private bool _isObjectHolder;
+		///<summary>
+		/// False (default value) for holders for scalar types,
+		/// true for holders for complex objects.
+		///</summary>
+		public  bool  IsObjectHolder
+		{
+			get { return _isObjectHolder;  }
+			set { _isObjectHolder = value; }
+		}
+
+		private         Builders.IAbstractTypeBuilder _typeBuilder;
+		///<summary>
+		/// An <see cref="Builders.IAbstractTypeBuilder"/> required for this attribute
+		/// to build an abstract type inheritor.
+		///</summary>
+		public override Builders.IAbstractTypeBuilder  TypeBuilder
+		{
+			get
+			{
+				return _typeBuilder ?? (_typeBuilder = 
+					new Builders.InstanceTypeBuilder(_instanceType, _isObjectHolder));
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/LazyInstanceAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,25 @@
+using System;
+
+namespace BLToolkit.TypeBuilder
+{
+	[AttributeUsage(AttributeTargets.Property)]
+	public sealed class LazyInstanceAttribute : Attribute
+	{
+		public LazyInstanceAttribute()
+		{
+			_isLazy = true;
+		}
+
+		public LazyInstanceAttribute(bool isLazy)
+		{
+			_isLazy = isLazy;
+		}
+
+		private bool _isLazy;
+		public  bool  IsLazy
+		{
+			get { return _isLazy;  }
+			set { _isLazy = value; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/LazyInstancesAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,44 @@
+using System;
+using System.Diagnostics.CodeAnalysis;
+
+namespace BLToolkit.TypeBuilder
+{
+	[SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes")]
+	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface)]
+	public class LazyInstancesAttribute : Attribute
+	{
+		public LazyInstancesAttribute()
+		{
+		}
+
+		public LazyInstancesAttribute(Type type)
+		{
+			_type = type;
+		}
+
+		public LazyInstancesAttribute(bool isLazy)
+		{
+			_isLazy = isLazy;
+		}
+
+		public LazyInstancesAttribute(Type type, bool isLazy)
+		{
+			_type   = type;
+			_isLazy = isLazy;
+		}
+
+		private bool _isLazy = true;
+		public  bool  IsLazy
+		{
+			get { return _isLazy;  }
+			set { _isLazy = value; }
+		}
+
+		private Type _type = typeof(object);
+		public  Type  Type
+		{
+			get { return _type; }
+			set { _type = value ?? typeof(object); }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/NoInstanceAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+using System;
+
+namespace BLToolkit.TypeBuilder
+{
+	[AttributeUsage(AttributeTargets.Property)]
+	public sealed class NoInstanceAttribute : Attribute
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/ParameterAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,65 @@
+using System;
+using System.Diagnostics.CodeAnalysis;
+
+namespace BLToolkit.TypeBuilder
+{
+	[SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes")]
+	[AttributeUsage(AttributeTargets.Property)]
+	public class ParameterAttribute : Attribute
+	{
+		protected ParameterAttribute()
+		{
+			SetParameters();
+		}
+
+		public ParameterAttribute(object parameter1)
+		{
+			SetParameters(parameter1);
+		}
+
+		public ParameterAttribute(
+			object parameter1,
+			object parameter2)
+		{
+			SetParameters(parameter1, parameter2);
+		}
+
+		public ParameterAttribute(
+			object parameter1,
+			object parameter2,
+			object parameter3)
+		{
+			SetParameters(parameter1, parameter2, parameter3);
+		}
+
+		public ParameterAttribute(
+			object parameter1,
+			object parameter2,
+			object parameter3,
+			object parameter4)
+		{
+			SetParameters(parameter1, parameter2, parameter3, parameter4);
+		}
+		
+		public ParameterAttribute(
+			object parameter1,
+			object parameter2,
+			object parameter3,
+			object parameter4,
+			object parameter5)
+		{
+			SetParameters(parameter1, parameter2, parameter3, parameter4, parameter5);
+		}
+
+		protected void SetParameters(params object[] parameters)
+		{
+			_parameters = parameters;
+		}
+
+		private object[] _parameters;
+		public  object[]  Parameters
+		{
+			get { return _parameters;  }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/ParentAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+using System;
+
+namespace BLToolkit.TypeBuilder
+{
+	[AttributeUsage(AttributeTargets.Parameter)]
+	public sealed class ParentAttribute : Attribute
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/PropertyChangedAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,91 @@
+using System;
+using BLToolkit.Common;
+using BLToolkit.TypeBuilder.Builders;
+
+namespace BLToolkit.TypeBuilder
+{
+	/// <summary>
+	/// This attribute allows to control generation of PropertyChanged notification at class level 
+	/// </summary>
+	[AttributeUsage(AttributeTargets.Interface | AttributeTargets.Class)]
+	public sealed class PropertyChangedAttribute : AbstractTypeBuilderAttribute
+	{
+		/// <summary>
+		/// Specifies default generation options should be used for PropertyChanged notification
+		/// </summary>
+		public PropertyChangedAttribute()
+			:this(Common.Configuration.NotifyOnEqualSet)
+		{
+		}
+
+		/// <summary>
+		///	This constructor allows control of PropertyChanged code generation
+		/// </summary>
+		/// <param name="notifyOnEqualSet">See <see cref="NotifyOnEqualSet"/></param>
+		public PropertyChangedAttribute(bool notifyOnEqualSet)
+			:this(notifyOnEqualSet, true)
+		{
+		}
+
+		/// <summary>
+		/// This constructor allows control of PropertyChanged code generation
+		/// </summary>
+		/// <param name="notifyOnEqualSet">See <see cref="NotifyOnEqualSet"/></param>
+		/// <param name="useReferenceEquals">See <see cref="UseReferenceEquals"/></param>
+		public PropertyChangedAttribute(bool notifyOnEqualSet, bool useReferenceEquals)
+			:this(notifyOnEqualSet, useReferenceEquals, true)
+		{
+		}
+
+		/// <summary>
+		/// This constructor allows control of PropertyChanged code generation
+		/// </summary>
+		/// <param name="notifyOnEqualSet">See <see cref="NotifyOnEqualSet"/></param>
+		/// <param name="useReferenceEquals">See <see cref="UseReferenceEquals"/></param>
+		/// <param name="skipSetterOnNoChange">See <see cref="SkipSetterOnNoChange"/></param>
+		public PropertyChangedAttribute(bool notifyOnEqualSet, bool useReferenceEquals, bool skipSetterOnNoChange)
+		{
+			_notifyOnEqualSet     = notifyOnEqualSet;
+			_useReferenceEquals   = useReferenceEquals;
+			_skipSetterOnNoChange = skipSetterOnNoChange;
+		}
+
+		private bool _notifyOnEqualSet;
+		/// <summary>
+		/// Controls whether OnPropertyChanged notifications are sent when current value is same as new one.
+		/// 
+		/// Default value controlled via <see cref="Configuration.NotifyOnEqualSet"/> and by default is set to false
+		/// </summary>
+		public  bool  NotifyOnEqualSet
+		{
+			get { return _notifyOnEqualSet;  }
+			set { _notifyOnEqualSet = value; }
+		}
+
+		private bool _useReferenceEquals;
+		/// <summary>
+		/// Specifies if <see cref="Object.ReferenceEquals">Object.ReferenceEquals</see> should be used for equality comparison of current and new value
+		/// for reference types. If value type implements op_Inequality, UseReferenceEquals is ignored.
+		/// </summary>
+		public  bool  UseReferenceEquals
+		{
+			get { return _useReferenceEquals;  }
+			set { _useReferenceEquals = value; }
+		}
+
+		private bool _skipSetterOnNoChange;
+		/// <summary>
+		/// Specifies whether call to setter is made when current value is same as new one
+		/// </summary>
+		public  bool  SkipSetterOnNoChange
+		{
+			get { return _skipSetterOnNoChange;  }
+			set { _skipSetterOnNoChange = value; }
+		}
+
+		public override IAbstractTypeBuilder TypeBuilder
+		{
+			get { return new PropertyChangedBuilder(_notifyOnEqualSet, _useReferenceEquals, _skipSetterOnNoChange); }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/PropertyInfoAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+using System;
+
+namespace BLToolkit.TypeBuilder
+{
+	[AttributeUsage(AttributeTargets.Parameter)]
+	public sealed class PropertyInfoAttribute : Attribute
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/RefCursorAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,18 @@
+using System;
+using System.Reflection;
+
+namespace BLToolkit.TypeBuilder
+{
+	[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
+	public class RefCursorAttribute : Attribute
+	{
+	}
+
+	public static class RefCursorAttributeHelpers
+	{
+		public static bool IsRefCursor(this ParameterInfo pi)
+		{
+			return pi.GetCustomAttributes(typeof(RefCursorAttribute), false).Length > 0;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/ReturnIfFalseAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+using System;
+
+namespace BLToolkit.TypeBuilder
+{
+	[AttributeUsage(AttributeTargets.ReturnValue)]
+	public sealed class ReturnIfFalseAttribute : ReturnIfZeroAttribute
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/ReturnIfNonZeroAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,11 @@
+using System;
+using System.Diagnostics.CodeAnalysis;
+
+namespace BLToolkit.TypeBuilder
+{
+	[SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes")]
+	[AttributeUsage(AttributeTargets.ReturnValue)]
+	public class ReturnIfNonZeroAttribute : Attribute
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/ReturnIfNotNullAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+using System;
+
+namespace BLToolkit.TypeBuilder
+{
+	[AttributeUsage(AttributeTargets.ReturnValue)]
+	public sealed class ReturnIfNotNullAttribute : ReturnIfNonZeroAttribute
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/ReturnIfNullAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+using System;
+
+namespace BLToolkit.TypeBuilder
+{
+	[AttributeUsage(AttributeTargets.ReturnValue)]
+	public sealed class ReturnIfNullAttribute : ReturnIfZeroAttribute
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/ReturnIfTrueAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+using System;
+
+namespace BLToolkit.TypeBuilder
+{
+	[AttributeUsage(AttributeTargets.ReturnValue)]
+	public sealed class ReturnIfTrueAttribute : ReturnIfNonZeroAttribute
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/ReturnIfZeroAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,11 @@
+using System;
+using System.Diagnostics.CodeAnalysis;
+
+namespace BLToolkit.TypeBuilder
+{
+	[SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes")]
+	[AttributeUsage(AttributeTargets.ReturnValue)]
+	public class ReturnIfZeroAttribute : Attribute
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/SetValueAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+using System;
+
+namespace BLToolkit.TypeBuilder
+{
+	///<summary>
+	/// Indicates that a field, property or method can be treated as a value setter.
+	///</summary>
+	[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Method)]
+	public sealed class SetValueAttribute : Attribute
+	{
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/TypeBuilderException.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,85 @@
+using System;
+using System.Runtime.Serialization;
+
+namespace BLToolkit.TypeBuilder
+{
+	/// <summary>
+	/// Defines the base class for the namespace exceptions.
+	/// </summary>
+	/// <remarks>
+	/// This class is the base class for exceptions that may occur during
+	/// execution of the namespace members.
+	/// </remarks>
+	[Serializable] 
+	public class TypeBuilderException : Exception
+	{
+		/// <summary>
+		/// Initializes a new instance of the <see cref="TypeBuilderException"/> class.
+		/// </summary>
+		/// <remarks>
+		/// This constructor initializes the <see cref="Exception.Message"/>
+		/// property of the new instance such as "A Build Type exception has occurred."
+		/// </remarks>
+		public TypeBuilderException()
+			: base("A Build Type exception has occurred.")
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="TypeBuilderException"/> class 
+		/// with the specified error message.
+		/// </summary>
+		/// <param name="message">The message to display to the client when the
+		/// exception is thrown.</param>
+		/// <seealso cref="Exception.Message"/>
+		public TypeBuilderException(string message)
+			: base(message)
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="TypeBuilderException"/> class 
+		/// with the specified error message and InnerException property.
+		/// </summary>
+		/// <param name="message">The message to display to the client when the
+		/// exception is thrown.</param>
+		/// <param name="innerException">The InnerException, if any, that threw
+		/// the current exception.</param>
+		/// <seealso cref="Exception.Message"/>
+		/// <seealso cref="Exception.InnerException"/>
+		public TypeBuilderException(string message, Exception innerException) 
+			: base(message, innerException)
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="TypeBuilderException"/> class 
+		/// with the specified InnerException property.
+		/// </summary>
+		/// <param name="innerException">The InnerException, if any, that threw
+		/// the current exception.</param>
+		/// <seealso cref="Exception.InnerException"/>
+		public TypeBuilderException(Exception innerException) 
+			: base(innerException.Message, innerException)
+		{
+		}
+
+#if !SILVERLIGHT
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="TypeBuilderException"/> class
+		/// with serialized data.
+		/// </summary>
+		/// <param name="info">The object that holds the serialized object data.</param>
+		/// <param name="context">The contextual information about the source or
+		/// destination.</param>
+		/// <remarks>This constructor is called during deserialization to
+		/// reconstitute the exception object transmitted over a stream.</remarks>
+		protected TypeBuilderException(SerializationInfo info, StreamingContext context) 
+			: base(info, context)
+		{
+		}
+
+#endif
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/TypeBuilder/TypeFactory.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,484 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Diagnostics.CodeAnalysis;
+using System.IO;
+using System.Linq.Expressions;
+using System.Reflection;
+using System.Reflection.Emit;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Security.Permissions;
+
+using JetBrains.Annotations;
+
+using BLToolkit.Reflection;
+using BLToolkit.Reflection.Emit;
+using BLToolkit.TypeBuilder.Builders;
+using BLToolkit.Properties;
+#if !SILVERLIGHT
+using BLToolkit.Configuration;
+#endif
+
+namespace BLToolkit.TypeBuilder
+{
+	public static class TypeFactory
+	{
+		static TypeFactory()
+		{
+			SealTypes = true;
+
+#if !SILVERLIGHT
+
+			var section = BLToolkitSection.Instance;
+
+			if (section != null)
+			{
+				var elm = section.TypeFactory;
+
+				if (elm != null)
+				{
+					SaveTypes = elm.SaveTypes;
+					SealTypes = elm.SealTypes;
+					LoadTypes = elm.LoadTypes;
+
+					SetGlobalAssembly(elm.AssemblyPath, elm.Version, elm.KeyFile);
+				}
+			}
+
+#endif
+
+#if !SILVERLIGHT
+
+			var perm = new SecurityPermission(SecurityPermissionFlag.ControlAppDomain);
+
+#if FW4
+			try
+			{
+				//var permissionSet = new PermissionSet(PermissionState.None);
+				//permissionSet.AddPermission(perm);
+
+				//if (permissionSet.IsSubsetOf(AppDomain.CurrentDomain.PermissionSet))
+					SubscribeAssemblyResolver();
+			}
+			catch
+			{
+			}
+#else
+			if (SecurityManager.IsGranted(perm))
+				SubscribeAssemblyResolver();
+#endif
+
+#endif
+		}
+
+		static void SubscribeAssemblyResolver()
+		{
+#if FW4
+			// This hack allows skipping FW 4.0 security check for partial trusted assemblies.
+			//
+
+			var dm   = new DynamicMethod("SubscribeAssemblyResolverEx", typeof(void), null);
+			var emit = new EmitHelper(dm.GetILGenerator());
+
+			emit
+				.call     (typeof(AppDomain).GetProperty("CurrentDomain").GetGetMethod())
+				.ldnull
+				.ldftn    (typeof(TypeFactory).GetMethod("AssemblyResolver"))
+				.newobj   (typeof(ResolveEventHandler).GetConstructor(new[] { typeof(object), typeof(IntPtr) }))
+				.callvirt (typeof(AppDomain).GetEvent("AssemblyResolve").GetAddMethod())
+				.ret()
+				;
+
+			var setter = (Action)dm.CreateDelegate(typeof(Action));
+
+			setter();
+#else
+			AppDomain.CurrentDomain.AssemblyResolve += AssemblyResolver;
+#endif
+		}
+
+		#region Create Assembly
+
+		private static string                _globalAssemblyPath;
+		private static string                _globalAssemblyKeyFile;
+		private static Version               _globalAssemblyVersion;
+		private static AssemblyBuilderHelper _globalAssembly;
+
+		private static AssemblyBuilderHelper GlobalAssemblyBuilder
+		{
+			get
+			{
+				if (_globalAssembly == null && _globalAssemblyPath != null)
+					_globalAssembly = new AssemblyBuilderHelper(_globalAssemblyPath, _globalAssemblyVersion, _globalAssemblyKeyFile);
+
+				return _globalAssembly;
+			}
+		}
+
+		public static bool SaveTypes { get; set; }
+		public static bool SealTypes { get; set; }
+
+		[SuppressMessage("Microsoft.Design", "CA1062:ValidateArgumentsOfPublicMethods")]
+		public static void SetGlobalAssembly(string path)
+		{
+			SetGlobalAssembly(path, null, null);
+		}
+
+		[SuppressMessage("Microsoft.Design", "CA1062:ValidateArgumentsOfPublicMethods")]
+		public static void SetGlobalAssembly(string path, Version version, string keyFile)
+		{
+			if (_globalAssembly != null)
+				SaveGlobalAssembly();
+
+			if (!string.IsNullOrEmpty(path))
+				_globalAssemblyPath = path;
+
+			_globalAssemblyVersion = version;
+			_globalAssemblyKeyFile = keyFile;
+		}
+
+		public static void SaveGlobalAssembly()
+		{
+			if (_globalAssembly != null)
+			{
+				_globalAssembly.Save();
+
+				WriteDebug("The global assembly saved in '{0}'.", _globalAssembly.Path);
+
+				_globalAssembly        = null;
+				_globalAssemblyPath    = null;
+				_globalAssemblyVersion = null;
+				_globalAssemblyKeyFile = null;
+			}
+		}
+
+		private static AssemblyBuilderHelper GetAssemblyBuilder(Type type, string suffix)
+		{
+			var ab = GlobalAssemblyBuilder;
+
+			if (ab == null)
+			{
+#if SILVERLIGHT
+				var assemblyDir = ".";
+#else
+				var assemblyDir = AppDomain.CurrentDomain.BaseDirectory;
+
+				// Dynamic modules are locationless, so ignore them.
+				// _ModuleBuilder is the base type for both
+				// ModuleBuilder and InternalModuleBuilder classes.
+				//
+				if (!(type.Module is _ModuleBuilder) && type.Module.FullyQualifiedName != null && type.Module.FullyQualifiedName.IndexOf('<') < 0)
+					assemblyDir = Path.GetDirectoryName(type.Module.FullyQualifiedName);
+#endif
+
+				var fullName = type.FullName;
+
+				if (type.IsGenericType)
+					fullName = AbstractClassBuilder.GetTypeFullName(type);
+
+				fullName = fullName.Replace('<', '_').Replace('>', '_');
+
+				ab = new AssemblyBuilderHelper(Path.Combine(assemblyDir, fullName + "." + suffix + ".dll"));
+			}
+
+			return ab;
+		}
+
+		[SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]
+		private static void SaveAssembly(AssemblyBuilderHelper assemblyBuilder, Type type)
+		{
+			if (!SaveTypes || _globalAssembly != null)
+				return;
+			try
+			{
+				assemblyBuilder.Save();
+
+				WriteDebug("The '{0}' type saved in '{1}'.",
+							type.FullName,
+							assemblyBuilder.Path);
+			}
+			catch (Exception ex)
+			{
+				WriteDebug("Can't save the '{0}' assembly for the '{1}' type: {2}.",
+							assemblyBuilder.Path,
+							type.FullName,
+							ex.Message);
+			}
+		}
+
+		#endregion
+
+		#region GetType
+
+		static readonly Dictionary<Type,IDictionary<object,Type>> _builtTypes = new Dictionary<Type,IDictionary<object,Type>>(10);
+		static readonly Dictionary<Assembly,Assembly>             _assemblies = new Dictionary<Assembly, Assembly>(10);
+
+		public static bool LoadTypes { get; set; }
+
+		public static Type GetType(object hashKey, Type sourceType, ITypeBuilder typeBuilder)
+		{
+			if (hashKey     == null) throw new ArgumentNullException("hashKey");
+			if (sourceType  == null) throw new ArgumentNullException("sourceType");
+			if (typeBuilder == null) throw new ArgumentNullException("typeBuilder");
+
+			try
+			{
+				lock (_builtTypes)
+				{
+					Type type;
+					IDictionary<object,Type> builderTable;
+
+					if (_builtTypes.TryGetValue(typeBuilder.GetType(), out builderTable))
+					{
+						if (builderTable.TryGetValue(hashKey, out type))
+							return type;
+					}
+					else
+						_builtTypes.Add(typeBuilder.GetType(), builderTable = new Dictionary<object,Type>());
+
+					if (LoadTypes)
+					{
+						var originalAssembly = sourceType.Assembly;
+
+						Assembly extensionAssembly;
+
+						if (!_assemblies.TryGetValue(originalAssembly, out extensionAssembly))
+						{
+							extensionAssembly = LoadExtensionAssembly(originalAssembly);
+							_assemblies.Add(originalAssembly, extensionAssembly);
+						}
+
+						if (extensionAssembly != null)
+						{
+							type = extensionAssembly.GetType(typeBuilder.GetTypeName());
+
+							if (type != null)
+							{
+								builderTable.Add(hashKey, type);
+								return type;
+							}
+						}
+					}
+
+					var assemblyBuilder = GetAssemblyBuilder(sourceType, typeBuilder.AssemblyNameSuffix);
+
+					type = typeBuilder.Build(assemblyBuilder);
+
+					if (type != null)
+					{
+						builderTable.Add(hashKey, type);
+						SaveAssembly(assemblyBuilder, type);
+					}
+
+					return type;
+				}
+			}
+			catch (TypeBuilderException)
+			{
+				throw;
+			}
+			catch (Exception ex)
+			{
+				// Convert an Exception to TypeBuilderException.
+				//
+				throw new TypeBuilderException(string.Format(Resources.TypeFactory_BuildFailed, sourceType.FullName), ex);
+			}
+		}
+
+		public static Type GetType(Type sourceType)
+		{
+			return
+				TypeHelper.IsScalar(sourceType) || sourceType.IsSealed ||
+						(!sourceType.IsAbstract && sourceType.IsDefined(typeof(BLToolkitGeneratedAttribute), true)) ?
+					sourceType:
+					GetType(sourceType, sourceType, new AbstractClassBuilder(sourceType));
+		}
+
+		static class InstanceCreator<T>
+		{
+			public static readonly Func<T> CreateInstance = Expression.Lambda<Func<T>>(Expression.New(TypeFactory.GetType(typeof(T)))).Compile();
+		}
+
+		public static T CreateInstance<T>() where T: class
+		{
+			return InstanceCreator<T>.CreateInstance();
+		}
+
+		#endregion
+
+		#region Private Helpers
+
+		static Assembly LoadExtensionAssembly(Assembly originalAssembly)
+		{
+#if !SILVERLIGHT
+
+			if (originalAssembly is _AssemblyBuilder)
+			{
+				// This is a generated assembly. Even if it has a valid Location,
+				// there is definitelly no extension assembly at this path.
+				//
+				return null;
+			}
+
+			try
+			{
+				var originalAssemblyLocation  = new Uri(originalAssembly.EscapedCodeBase).LocalPath;
+				var extensionAssemblyLocation = Path.ChangeExtension(
+					originalAssemblyLocation, "BLToolkitExtension.dll");
+
+				if (File.GetLastWriteTime(originalAssemblyLocation) <= File.GetLastWriteTime(extensionAssemblyLocation))
+					return Assembly.LoadFrom(extensionAssemblyLocation);
+
+				Debug.WriteLineIf(File.Exists(extensionAssemblyLocation),
+					string.Format("Extension assembly '{0}' is out of date. Please rebuild.",
+						extensionAssemblyLocation), typeof(TypeAccessor).FullName);
+
+				// Some good man may load this assembly already. Like IIS does it.
+				//
+				var extensionAssemblyName = originalAssembly.GetName(true);
+				extensionAssemblyName.Name += ".BLToolkitExtension";
+
+				foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
+				{
+					// Note that assembly version and strong name are compared too.
+					//
+					if (AssemblyName.ReferenceMatchesDefinition(assembly.GetName(false), extensionAssemblyName))
+						return assembly;
+				}
+			}
+			catch (Exception ex)
+			{
+				// Extension exist, but can't be loaded for some reason.
+				// Switch back to code generation
+				//
+				Debug.WriteLine(ex, typeof(TypeAccessor).FullName);
+			}
+
+#endif
+
+			return null;
+		}
+
+		[Conditional("DEBUG")]
+		private static void WriteDebug(string format, params object[] parameters)
+		{
+			Debug.WriteLine(string.Format(format, parameters));
+		}
+
+		#endregion
+
+		#region Resolve Types
+
+		/// <summary>
+		/// Initializes AssemblyResolve hooks for the current <see cref="AppDomain"/>.
+		/// </summary>
+		public static void Init()
+		{
+			//
+			// The code actually does nothing except an implicit call to the type constructor.
+			//
+		}
+
+		public static Assembly AssemblyResolver(object sender, ResolveEventArgs args)
+		{
+			var name      = args.Name;
+			var nameParts = name.Split(',');
+
+			if (nameParts.Length > 0 && nameParts[0].ToLower().EndsWith(".dll"))
+			{
+				nameParts[0] = nameParts[0].Substring(0, nameParts[0].Length - 4);
+				name         = string.Join(",", nameParts);
+			}
+
+			lock (_builtTypes)
+				foreach (var type in _builtTypes.Keys)
+					if (type.FullName == name)
+						return type.Assembly;
+
+#if !SILVERLIGHT
+
+			var idx = name.IndexOf("." + TypeBuilderConsts.AssemblyNameSuffix);
+
+			if (idx > 0)
+			{
+				var typeName = name.Substring(0, idx);
+				var type     = Type.GetType(typeName);
+
+				if (type == null)
+				{
+					var ass = ((AppDomain)sender).GetAssemblies();
+
+					// CLR can't find an assembly built on previous AssemblyResolve event.
+					//
+					for (var i = ass.Length - 1; i >= 0; i--)
+					{
+						if (string.Compare(ass[i].FullName, name) == 0)
+							return ass[i];
+					}
+
+					for (var i = ass.Length - 1; i >= 0; i--)
+					{
+						var a = ass[i];
+
+						if (!(
+#if FW4
+							a.IsDynamic ||
+#endif
+							a is _AssemblyBuilder) &&
+							(a.CodeBase.IndexOf("Microsoft.NET/Framework") > 0 || a.FullName.StartsWith("System."))) continue;
+
+						type = a.GetType(typeName);
+
+						if (type != null) break;
+
+						foreach (var t in a.GetTypes())
+						{
+							if (!t.IsAbstract)
+								continue;
+
+							if (t.FullName == typeName)
+							{
+								type = t;
+							}
+							else
+							{
+								if (t.FullName.IndexOf('+') > 0)
+								{
+									var s = typeName;
+
+									while (type == null && (idx = s.LastIndexOf(".")) > 0)
+									{
+										s = s.Remove(idx, 1).Insert(idx, "+");
+
+										if (t.FullName == s)
+											type = t;
+									}
+								}
+							}
+
+							if (type != null) break;
+						}
+
+						if (type != null) break;
+					}
+				}
+
+				if (type != null)
+				{
+					var newType = GetType(type);
+
+					if (newType.Assembly.FullName == name)
+						return newType.Assembly;
+				}
+			}
+
+#endif
+
+			return null;
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Validation/FriendlyNameAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,19 @@
+using System;
+
+namespace BLToolkit.Validation
+{
+	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Class)]
+	public class FriendlyNameAttribute : Attribute
+	{
+		public FriendlyNameAttribute(string name)
+		{
+			_name = name;
+		}
+
+		private readonly string _name;
+		public           string  Name
+		{
+			get { return _name; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Validation/IValidatable.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+namespace BLToolkit.Validation
+{
+	public interface IValidatable
+	{
+		void     Validate();
+
+		bool     IsValid         (string fieldName);
+		string[] GetErrorMessages(string fieldName);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Validation/MaxDateValueAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,41 @@
+using System;
+
+namespace BLToolkit.Validation
+{
+	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
+	public class MaxDateValueAttribute : MaxValueAttribute
+	{
+		public MaxDateValueAttribute(int year, int month, int day)
+			: base(new DateTime(year, month, day))
+		{
+		}
+
+		public MaxDateValueAttribute(int year, int month, int day, string errorMessage)
+			: this(year, month, day)
+		{
+			ErrorMessage = errorMessage;
+		}
+
+		public MaxDateValueAttribute(int year, int month, int day, bool isExclusive)
+			: base(new DateTime(year, month, day), isExclusive)
+		{
+		}
+
+		public MaxDateValueAttribute(int year, int month, int day, bool isExclusive, string errorMessage)
+			: this(year, month, day, isExclusive)
+		{
+			ErrorMessage = errorMessage;
+		}
+
+		public override bool IsValid(ValidationContext context)
+		{
+			if (context.IsNull(context))
+				return true;
+
+			DateTime contextValue = Convert.ToDateTime(context.Value);
+			DateTime testValue    = (DateTime)GetValue(context);
+
+			return testValue > contextValue || !IsExclusive && testValue == contextValue;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Validation/MaxLengthAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,41 @@
+using System;
+
+namespace BLToolkit.Validation
+{
+	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
+	public class MaxLengthAttribute : ValidatorBaseAttribute
+	{
+		public MaxLengthAttribute(int maxLength)
+		{
+			_value = maxLength;
+		}
+
+		public MaxLengthAttribute(int maxLength, string errorMessage)
+			: this(maxLength)
+		{
+			ErrorMessage = errorMessage;
+		}
+
+		private readonly int _value;
+		public           int  Value
+		{
+			get { return _value; }
+		}
+	
+		public override bool IsValid(ValidationContext context)
+		{
+			return context.IsNull(context) || context.Value.ToString().Length <= _value;
+		}
+
+		public override string ErrorMessage
+		{
+			get { return base.ErrorMessage ?? "'{0}' maximum length is {1}."; }
+			set { base.ErrorMessage = value; }
+		}
+
+		public override string GetErrorMessage(ValidationContext context)
+		{
+			return string.Format(ErrorMessage, GetPropertyFriendlyName(context), Value);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Validation/MaxValueAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,140 @@
+using System;
+
+namespace BLToolkit.Validation
+{
+	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
+	public class MaxValueAttribute : ValidatorBaseAttribute
+	{
+		public MaxValueAttribute(object maxValue)
+			: this(maxValue, false)
+		{
+		}
+
+		public MaxValueAttribute(object maxValue, string errorMessage)
+			: this(maxValue, false, errorMessage)
+		{
+		}
+
+		public MaxValueAttribute(object maxValue, bool isExclusive)
+		{
+			_value       = maxValue;
+			_isExclusive = isExclusive;
+		}
+
+		public MaxValueAttribute(object maxValue, bool isExclusive, string errorMessage)
+			: this(maxValue, isExclusive)
+		{
+			ErrorMessage = errorMessage;
+		}
+
+		private readonly object _value;
+		public  virtual  object GetValue(ValidationContext context)
+		{
+			return _value;
+		}
+
+		private bool _isExclusive;
+		public  bool  IsExclusive
+		{
+			get { return _isExclusive;  }
+			set { _isExclusive = value; }
+		}
+
+		public override bool IsValid(ValidationContext context)
+		{
+			if (context.IsNull(context))
+				return true;
+
+			object contextValue = context.Value;
+			object testValue    = GetValue(context);
+
+			if (contextValue is Int32)
+			{
+				Int32 tv = Convert.ToInt32(testValue);
+				return tv > (Int32)contextValue || !IsExclusive && tv == (Int32)contextValue;
+			}
+
+			if (contextValue is decimal)
+			{
+				decimal tv = Convert.ToDecimal(testValue);
+				return tv > (decimal)contextValue || !IsExclusive && tv == (decimal)contextValue;
+			}
+
+			if (contextValue is double)
+			{
+				double tv = Convert.ToDouble(testValue);
+				return tv > (double)contextValue || !IsExclusive && tv == (double)contextValue;
+			}
+
+			if (contextValue is float)
+			{
+				float tv = Convert.ToSingle(testValue);
+				return tv > (float)contextValue || !IsExclusive && tv == (float)contextValue;
+			}
+
+			if (contextValue is byte)
+			{
+				byte tv = Convert.ToByte(testValue);
+				return tv > (byte)contextValue || !IsExclusive && tv == (byte)contextValue;
+			}
+
+			if (contextValue is char)
+			{
+				char tv = Convert.ToChar(testValue);
+				return tv > (char)contextValue || !IsExclusive && tv == (char)contextValue;
+			}
+
+			if (contextValue is Int16)
+			{
+				Int16 tv = Convert.ToInt16(testValue);
+				return tv > (Int16)contextValue || !IsExclusive && tv == (Int16)contextValue;
+			}
+
+			if (contextValue is sbyte)
+			{
+				sbyte tv = Convert.ToSByte(testValue);
+				return tv > (sbyte)contextValue || !IsExclusive && tv == (sbyte)contextValue;
+			}
+
+			if (contextValue is UInt16)
+			{
+				UInt16 tv = Convert.ToUInt16(testValue);
+				return tv > (UInt16)contextValue || !IsExclusive && tv == (UInt16)contextValue;
+			}
+
+			if (contextValue is UInt32)
+			{
+				UInt32 tv = Convert.ToUInt32(testValue);
+				return tv > (UInt32)contextValue || !IsExclusive && tv == (UInt32)contextValue;
+			}
+
+			if (contextValue is Int64)
+			{
+				Int64 tv = Convert.ToInt64(testValue);
+				return tv > (Int64)contextValue || !IsExclusive && tv == (Int64)contextValue;
+			}
+
+			if (contextValue is UInt64)
+			{
+				UInt64 tv = Convert.ToUInt64(testValue);
+				return tv > (UInt64)contextValue || !IsExclusive && tv == (UInt64)contextValue;
+			}
+
+			return true;
+		}
+
+		public override string ErrorMessage
+		{
+			get { return base.ErrorMessage ?? "Maximum value for '{0}' is {1}{2}."; }
+			set { base.ErrorMessage = value; }
+		}
+
+		public override string GetErrorMessage(ValidationContext context)
+		{
+			return string.Format(ErrorMessage,
+				GetPropertyFriendlyName(context),
+				GetValue(context),
+				IsExclusive? " exclusive": string.Empty);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Validation/MinDateValueAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,41 @@
+using System;
+
+namespace BLToolkit.Validation
+{
+	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
+	public class MinDateValueAttribute : MinValueAttribute
+	{
+		public MinDateValueAttribute(int year, int month, int day)
+			: base(new DateTime(year, month, day))
+		{
+		}
+
+		public MinDateValueAttribute(int year, int month, int day, string errorMessage)
+			: this(year, month, day)
+		{
+			ErrorMessage = errorMessage;
+		}
+
+		public MinDateValueAttribute(int year, int month, int day, bool isExclusive)
+			: base(new DateTime(year, month, day), isExclusive)
+		{
+		}
+
+		public MinDateValueAttribute(int year, int month, int day, bool isExclusive, string errorMessage)
+			: this(year, month, day, isExclusive)
+		{
+			ErrorMessage = errorMessage;
+		}
+
+		public override bool IsValid(ValidationContext context)
+		{
+			if (context.IsNull(context))
+				return true;
+
+			DateTime contextValue = Convert.ToDateTime(context.Value);
+			DateTime testValue    = (DateTime)GetValue(context);
+
+			return testValue < contextValue || !IsExclusive && testValue == contextValue;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Validation/MinLengthAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,41 @@
+using System;
+
+namespace BLToolkit.Validation
+{
+	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
+	public class MinLengthAttribute : ValidatorBaseAttribute
+	{
+		public MinLengthAttribute(int minLength)
+		{
+			_value = minLength;
+		}
+
+		public MinLengthAttribute(int minLength, string errorMessage)
+			: this(minLength)
+		{
+			ErrorMessage = errorMessage;
+		}
+
+		private readonly int _value;
+		public           int  Value
+		{
+			get { return _value; }
+		}
+	
+		public override bool IsValid(ValidationContext context)
+		{
+			return context.IsNull(context) || context.Value.ToString().Length >= _value;
+		}
+
+		public override string ErrorMessage
+		{
+			get { return base.ErrorMessage ?? "'{0}' minimum length is {1}."; }
+			set { base.ErrorMessage = value; }
+		}
+
+		public override string GetErrorMessage(ValidationContext context)
+		{
+			return string.Format(ErrorMessage, GetPropertyFriendlyName(context), Value);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Validation/MinValueAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,140 @@
+using System;
+
+namespace BLToolkit.Validation
+{
+	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
+	public class MinValueAttribute : ValidatorBaseAttribute
+	{
+		public MinValueAttribute(object minValue)
+			: this(minValue, false)
+		{
+		}
+
+		public MinValueAttribute(object minValue, string errorMessage)
+			: this(minValue, false, errorMessage)
+		{
+		}
+
+		public MinValueAttribute(object minValue, bool isExclusive)
+		{
+			_value       = minValue;
+			_isExclusive = isExclusive;
+		}
+
+		public MinValueAttribute(object minValue, bool isExclusive, string errorMessage)
+			: this(minValue, isExclusive)
+		{
+			ErrorMessage = errorMessage;
+		}
+
+		private readonly object _value;
+		public  virtual  object GetValue(ValidationContext context)
+		{
+			return _value;
+		}
+
+		private bool _isExclusive;
+		public  bool  IsExclusive
+		{
+			get { return _isExclusive;  }
+			set { _isExclusive = value; }
+		}
+
+		public override bool IsValid(ValidationContext context)
+		{
+			if (context.IsNull(context))
+				return true;
+
+			object contextValue = context.Value;
+			object testValue    = GetValue(context);
+
+			if (contextValue is Int32)
+			{
+				Int32 tv = Convert.ToInt32(testValue);
+				return tv < (Int32)contextValue || !IsExclusive && tv == (Int32)contextValue;
+			}
+
+			if (contextValue is decimal)
+			{
+				decimal tv = Convert.ToDecimal(testValue);
+				return tv < (decimal)contextValue || !IsExclusive && tv == (decimal)contextValue;
+			}
+
+			if (contextValue is double)
+			{
+				double tv = Convert.ToDouble(testValue);
+				return tv < (double)contextValue || !IsExclusive && tv == (double)contextValue;
+			}
+
+			if (contextValue is float)
+			{
+				float tv = Convert.ToSingle(testValue);
+				return tv < (float)contextValue || !IsExclusive && tv == (float)contextValue;
+			}
+
+			if (contextValue is byte)
+			{
+				byte tv = Convert.ToByte(testValue);
+				return tv < (byte)contextValue || !IsExclusive && tv == (byte)contextValue;
+			}
+
+			if (contextValue is char)
+			{
+				char tv = Convert.ToChar(testValue);
+				return tv < (char)contextValue || !IsExclusive && tv == (char)contextValue;
+			}
+
+			if (contextValue is Int16)
+			{
+				Int16 tv = Convert.ToInt16(testValue);
+				return tv < (Int16)contextValue || !IsExclusive && tv == (Int16)contextValue;
+			}
+
+			if (contextValue is sbyte)
+			{
+				sbyte tv = Convert.ToSByte(testValue);
+				return tv < (sbyte)contextValue || !IsExclusive && tv == (sbyte)contextValue;
+			}
+
+			if (contextValue is UInt16)
+			{
+				UInt16 tv = Convert.ToUInt16(testValue);
+				return tv < (UInt16)contextValue || !IsExclusive && tv == (UInt16)contextValue;
+			}
+
+			if (contextValue is UInt32)
+			{
+				UInt32 tv = Convert.ToUInt32(testValue);
+				return tv < (UInt32)contextValue || !IsExclusive && tv == (UInt32)contextValue;
+			}
+
+			if (contextValue is Int64)
+			{
+				Int64 tv = Convert.ToInt64(testValue);
+				return tv < (Int64)contextValue || !IsExclusive && tv == (Int64)contextValue;
+			}
+
+			if (contextValue is UInt64)
+			{
+				UInt64 tv = Convert.ToUInt64(testValue);
+				return tv < (UInt64)contextValue || !IsExclusive && tv == (UInt64)contextValue;
+			}
+
+			return true;
+		}
+
+		public override string ErrorMessage
+		{
+			get { return base.ErrorMessage ?? "Minimum value for '{0}' is {1}{2}."; }
+			set { base.ErrorMessage = value; }
+		}
+
+		public override string GetErrorMessage(ValidationContext context)
+		{
+			return string.Format(ErrorMessage,
+				GetPropertyFriendlyName(context),
+				GetValue(context),
+				IsExclusive? " exclusive": string.Empty);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Validation/RegExAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,76 @@
+using System;
+using System.Text.RegularExpressions;
+
+namespace BLToolkit.Validation
+{
+	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
+	public class RegExAttribute : ValidatorBaseAttribute 
+	{
+		public RegExAttribute(string pattern)
+			: this(pattern, RegexOptions.IgnorePatternWhitespace
+#if !SILVERLIGHT
+				| RegexOptions.Compiled
+#endif
+			)
+		{
+		}
+
+		public RegExAttribute(string pattern, RegexOptions options)
+		{
+			_pattern = pattern;
+			_options = options;
+		}
+
+		public RegExAttribute(string pattern, string errorMessage)
+			: this(pattern)
+		{
+			ErrorMessage = errorMessage;
+		}
+
+		public RegExAttribute(string pattern, RegexOptions options, string errorMessage)
+			:this(pattern, options)
+		{
+			ErrorMessage = errorMessage;
+		}
+
+		[Obsolete("Use RegExAttribute.Pattern instead.")]
+		public string Value { get { return Pattern; } }
+
+		private readonly string _pattern;
+		public           string  Pattern { get { return _pattern; } }
+
+		private readonly RegexOptions _options;
+		public           RegexOptions  Options { get { return _options; } }
+
+#if !SILVERLIGHT
+		[NonSerialized]
+#endif
+		private Regex _validator;
+		public  Regex  Validator
+		{
+			get
+			{
+				if (_validator == null)
+					_validator = new Regex(_pattern, _options);
+
+				return _validator;
+			}
+		}
+
+		public override bool IsValid(ValidationContext context)
+		{
+			if (context.IsNull(context))
+				return true;
+
+			Match match = Validator.Match(context.Value.ToString());
+
+			return match.Success && match.Value == context.Value.ToString();
+		}
+
+		public override string ErrorMessage
+		{
+			get { return base.ErrorMessage ?? "'{0}' format is not valid."; }
+			set { base.ErrorMessage = value; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Validation/RequiredAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,28 @@
+using System;
+
+namespace BLToolkit.Validation
+{
+	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
+	public class RequiredAttribute : ValidatorBaseAttribute
+	{
+		public RequiredAttribute()
+		{
+		}
+
+		public RequiredAttribute(string errorMessage)
+			: base(errorMessage)
+		{
+		}
+
+		public override bool IsValid(ValidationContext context)
+		{
+			return context.IsNull(context) == false;
+		}
+
+		public override string ErrorMessage
+		{
+			get { return base.ErrorMessage ?? "'{0}' is required."; }
+			set { base.ErrorMessage = value; }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Validation/ValidatableObjectBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+namespace BLToolkit.Validation
+{
+	public class ValidatableObjectBase
+	{
+		public virtual void Validate()
+		{
+			Validator.Validate(this);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Validation/ValidationContext.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,119 @@
+using System;
+using System.ComponentModel;
+using System.Reflection;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Validation
+{
+	public class ValidationContext
+	{
+		public delegate bool IsNullHandler(ValidationContext context);
+
+		private object _object;
+		public  object  Object
+		{
+			get { return _object;  }
+			set { _object = value; }
+		}
+
+		private TypeAccessor _typeAccessor;
+		public  TypeAccessor  TypeAccessor
+		{
+			get
+			{
+				if (_typeAccessor == null)
+					_typeAccessor = TypeAccessor.GetAccessor(_object.GetType());
+
+				return _typeAccessor;
+			}
+		}
+
+		private PropertyDescriptor _propertyDescriptor;
+		public  PropertyDescriptor  PropertyDescriptor
+		{
+			get { return _propertyDescriptor;  }
+			set { _propertyDescriptor = value; }
+		}
+
+		private IsNullHandler _isNull;
+		public  IsNullHandler  IsNull
+		{
+			get { return _isNull;  }
+			set { _isNull = value; }
+		}
+
+		public  bool IsValueNull
+		{
+			get { return _isNull(this);  }
+		}
+
+		private object _value;
+		public  object  Value
+		{
+			get { return _value;  }
+			set
+			{
+				_value     = value;
+				_nullValue = null;
+			}
+		}
+
+		private MemberAccessor _memberAccessor;
+		public  MemberAccessor  MemberAccessor
+		{
+			get { return _memberAccessor; }
+			set 
+			{
+				_memberAccessor = value;
+				_memberInfo     = value != null? value.MemberInfo: null;
+			}
+		}
+
+		private MemberInfo _memberInfo;
+		public  MemberInfo  MemberInfo
+		{
+			get { return _memberInfo;  }
+		}
+
+		private object _nullValue;
+		public  object  NullValue
+		{
+			get
+			{
+				if (_nullValue == null)
+				{
+					if (_value == null)
+						throw new InvalidOperationException("NullValue is undefined when Value == null");
+
+					ObjectMapper om = Map.GetObjectMapper(Object.GetType());
+					MemberMapper mm = om[MemberName, true];
+
+					_nullValue =
+						mm != null && mm.MapMemberInfo.Nullable && mm.MapMemberInfo.NullValue != null?
+							mm.MapMemberInfo.NullValue:
+							TypeAccessor.GetNullValue(Value.GetType());
+
+					if (_nullValue == null)
+						_nullValue = DBNull.Value;
+				}
+
+				return _nullValue;
+
+			}
+		}
+
+		public string MemberName
+		{
+			get
+			{
+				return
+					_memberInfo         != null? _memberInfo.Name:
+#if !SILVERLIGHT
+					_propertyDescriptor != null? _propertyDescriptor.Name:
+#endif
+						null;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Validation/ValidationException.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,86 @@
+using System;
+using System.Runtime.Serialization;
+
+namespace BLToolkit.Validation
+{
+	/// <summary>
+	/// Defines the base class for the namespace exceptions.
+	/// </summary>
+	/// <remarks>
+	/// This class is the base class for exceptions that may occur during
+	/// execution of the namespace members.
+	/// </remarks>
+	[Serializable] 
+	public class ValidationException : Exception
+	{
+		/// <summary>
+		/// Initializes a new instance of the <see cref="ValidationException"/> class.
+		/// </summary>
+		/// <remarks>
+		/// This constructor initializes the <see cref="Exception.Message"/>
+		/// property of the new instance such as "A Validation exception has occurred."
+		/// </remarks>
+		public ValidationException()
+			: base("A Validation exception has occurred.")
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="ValidationException"/> class 
+		/// with the specified error message.
+		/// </summary>
+		/// <param name="message">The message to display to the client when the
+		/// exception is thrown.</param>
+		/// <seealso cref="Exception.Message"/>
+		public ValidationException(string message)
+			: base(message)
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="ValidationException"/> class 
+		/// with the specified error message and InnerException property.
+		/// </summary>
+		/// <param name="message">The message to display to the client when the
+		/// exception is thrown.</param>
+		/// <param name="innerException">The InnerException, if any, that threw
+		/// the current exception.</param>
+		/// <seealso cref="Exception.Message"/>
+		/// <seealso cref="Exception.InnerException"/>
+		public ValidationException(string message, Exception innerException)
+			: base(message, innerException)
+		{
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="ValidationException"/> class 
+		/// with the specified InnerException property.
+		/// </summary>
+		/// <param name="innerException">The InnerException, if any, that threw
+		/// the current exception.</param>
+		/// <seealso cref="Exception.Message"/>
+		/// <seealso cref="Exception.InnerException"/>
+		public ValidationException(Exception innerException)
+			: base(innerException.Message, innerException)
+		{
+		}
+
+#if !SILVERLIGHT
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="ValidationException"/> class
+		/// with serialized data.
+		/// </summary>
+		/// <param name="info">The object that holds the serialized object data.</param>
+		/// <param name="context">The contextual information about the source or
+		/// destination.</param>
+		/// <remarks>This constructor is called during deserialization to
+		/// reconstitute the exception object transmitted over a stream.</remarks>
+		protected ValidationException(SerializationInfo info, StreamingContext context)
+			: base(info, context)
+		{
+		}
+
+#endif
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Validation/Validator.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,212 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+
+using BLToolkit.Reflection;
+
+namespace BLToolkit.Validation
+{
+	public class Validator
+	{
+		#region Validate
+
+		public static void Validate(ValidationContext context)
+		{
+			foreach (MemberAccessor ma in context.TypeAccessor)
+			{
+				var attrs = ma.GetAttributes<ValidatorBaseAttribute>();
+
+				if (attrs == null)
+					continue;
+
+				context.MemberAccessor = ma;
+				context.Value          = ma.GetValue(context.Object);
+
+				for (var i = 0; i < attrs.Length; i++)
+				{
+					var attr = attrs[i];
+					if (attr.IsValid(context) == false)
+						throw new ValidationException(attr.GetErrorMessage(context));
+				}
+			}
+		}
+
+		public static void Validate(object obj, ValidationContext.IsNullHandler isNull)
+		{
+			Validate(InitContext(null, obj, null, isNull));
+		}
+
+		public static void Validate(object obj)
+		{
+			Validate(obj, null);
+		}
+
+		#endregion
+
+		#region Protected Members
+
+		private static bool IsNullInternal(ValidationContext context)
+		{
+			if (context.Value == null)
+				return true;
+
+			if (context.NullValue is DBNull)
+				return false;
+
+			return context.NullValue.Equals(context.Value);
+		}
+
+		public static ValidationContext InitContext(
+			ValidationContext  context,
+			object             obj,
+			PropertyDescriptor pd,
+			ValidationContext.IsNullHandler isNull)
+		{
+			if (context == null)
+				context = new ValidationContext();
+
+			context.Object = obj;
+			context.IsNull = isNull ?? new ValidationContext.IsNullHandler(IsNullInternal);
+			context.PropertyDescriptor = pd;
+
+			return context;
+		}
+
+		#endregion
+
+		#region IsValid
+
+		public static bool IsValid(ValidationContext context, string fieldName)
+		{
+			ValidatorBaseAttribute[] attrs = null;
+			object                   value = null;
+
+#if !SILVERLIGHT
+
+			if (context.PropertyDescriptor != null)
+			{
+				value = context.PropertyDescriptor.GetValue(context.Object);
+
+				List<ValidatorBaseAttribute> list = null;
+
+				foreach (var o in context.PropertyDescriptor.Attributes)
+				{
+					if (o is ValidatorBaseAttribute)
+					{
+						if (list == null)
+							list = new List<ValidatorBaseAttribute>();
+
+						list.Add((ValidatorBaseAttribute)o);
+					}
+				}
+
+				if (list != null)
+					attrs = list.ToArray();
+			}
+			else
+
+#endif
+
+			{
+				context.MemberAccessor = context.TypeAccessor[fieldName];
+
+				if (context.MemberAccessor != null)
+				{
+					value = context.MemberAccessor.GetValue(context.Object);
+					attrs = context.MemberAccessor.GetAttributes<ValidatorBaseAttribute>();
+				}
+			}
+
+			if (attrs != null)
+			{
+				context.Value = value;
+
+				for (var i = 0; i < attrs.Length; i++)
+				{
+					if (!attrs[i].IsValid(context))
+						return false;
+				}
+			}
+
+			return true;
+		}
+
+		public static bool IsValid(object obj, string fieldName, ValidationContext.IsNullHandler isNull)
+		{
+			return IsValid(InitContext(null, obj, null, isNull), fieldName);
+		}
+
+#if !SILVERLIGHT
+
+		public static bool IsValid(object obj, PropertyDescriptor pd, ValidationContext.IsNullHandler isNull)
+		{
+			return IsValid(InitContext(null, obj, pd, isNull), pd.Name);
+		}
+
+		public static bool IsValid(object obj, PropertyDescriptor pd)
+		{
+			return IsValid(obj, pd, null);
+		}
+
+#endif
+
+		public static bool IsValid(object obj, string fieldName)
+		{
+			return IsValid(obj, fieldName, null);
+		}
+
+		#endregion
+
+		#region GetErrorMessages
+
+		public static string[] GetErrorMessages(ValidationContext context, string fieldName)
+		{
+			context.MemberAccessor = context.TypeAccessor[fieldName];
+
+			if (context.MemberAccessor != null)
+			{
+				var messages = new List<string>();
+				var attrs    = context.MemberAccessor.GetAttributes<ValidatorBaseAttribute>();
+
+				if (attrs != null)
+				{
+					context.Value = context.MemberAccessor.GetValue(context.Object);
+
+					for (var i = 0; i < attrs.Length; i++)
+						messages.Add(attrs[i].GetErrorMessage(context));
+
+					return messages.ToArray();
+				}
+			}
+
+			return new string[0];
+		}
+
+		public static string[] GetErrorMessages(
+			object obj, string fieldName, ValidationContext.IsNullHandler isNull)
+		{
+			return GetErrorMessages(InitContext(null, obj, null, isNull), fieldName);
+		}
+
+#if !SILVERLIGHT
+
+		public static string[] GetErrorMessages(object obj, PropertyDescriptor pd, ValidationContext.IsNullHandler isNull)
+		{
+			return GetErrorMessages(InitContext(null, obj, pd, isNull), pd.Name);
+		}
+
+		public static string[] GetErrorMessages(object obj, PropertyDescriptor pd)
+		{
+			return GetErrorMessages(obj, pd, null);
+		}
+
+#endif
+
+		public static string[] GetErrorMessages(object obj, string fieldName)
+		{
+			return GetErrorMessages(obj, fieldName, null);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Validation/ValidatorBaseAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,69 @@
+using System;
+using System.Reflection;
+using System.ComponentModel;
+
+namespace BLToolkit.Validation
+{
+	public abstract class ValidatorBaseAttribute : Attribute
+	{
+		protected ValidatorBaseAttribute()
+		{
+		}
+
+		protected ValidatorBaseAttribute(string errorMessage)
+		{
+			_errorMessage = errorMessage;
+		}
+
+		private        string _errorMessage;
+		public virtual string  ErrorMessage
+		{
+			get { return _errorMessage;  }
+			set { _errorMessage = value; }
+		}
+
+		public abstract bool IsValid(ValidationContext context);
+
+		public virtual string GetErrorMessage(ValidationContext context)
+		{
+			return string.Format(ErrorMessage, GetPropertyFriendlyName(context));
+		}
+
+		protected virtual string GetPropertyFriendlyName(ValidationContext context)
+		{
+			MemberInfo mi        = context.MemberInfo;
+			string     className = mi.DeclaringType.Name;
+			string     fieldName = mi.Name;
+
+			// Get class name.
+			//
+			object[] attrs = mi.DeclaringType.GetCustomAttributes(typeof(FriendlyNameAttribute), true);
+
+			if (attrs.Length > 0)
+				className = ((FriendlyNameAttribute)attrs[0]).Name;
+			else
+			{
+				attrs = mi.DeclaringType.GetCustomAttributes(typeof(DisplayNameAttribute), true);
+
+				if (attrs.Length > 0)
+					className = ((DisplayNameAttribute)attrs[0]).DisplayName;
+			}
+
+			// Get field name.
+			//
+			attrs = mi.GetCustomAttributes(typeof(FriendlyNameAttribute), true);
+
+			if (attrs.Length > 0)
+				fieldName = ((FriendlyNameAttribute)attrs[0]).Name;
+			else
+			{
+				attrs = mi.GetCustomAttributes(typeof(DisplayNameAttribute), true);
+
+				if (attrs.Length > 0)
+					fieldName = ((DisplayNameAttribute)attrs[0]).DisplayName;
+			}
+
+			return string.IsNullOrEmpty(className)? fieldName: className + "." + fieldName;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Web/UI/Design/WebObjectBinderDesigner.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,160 @@
+using System;
+using System.Web.UI.Design;
+using System.Security.Permissions;
+using System.ComponentModel;
+
+namespace BLToolkit.Web.UI.Design
+{
+	[SecurityPermission(SecurityAction.Demand, Flags=SecurityPermissionFlag.UnmanagedCode)]
+	class  WebObjectBinderDesigner : DataSourceDesigner
+	{
+		private DesignerDataSourceView _view;
+		private WebObjectBinder        _component;
+
+		public override string[] GetViewNames()
+		{
+			return new string[] { "DefaultView" };
+		}
+
+		public override DesignerDataSourceView GetView(string viewName)
+		{
+			if (string.IsNullOrEmpty(viewName))
+				viewName = "DefaultView";
+
+			if (viewName != "DefaultView")
+				return null;
+
+			if (_view == null)
+				_view = new ObjectDesignerDataSourceView(this, viewName);
+
+			return _view;
+		}
+
+		public override void Initialize(IComponent component)
+		{
+			_component = (WebObjectBinder)component;
+
+			base.Initialize(component);
+		}
+
+		public override bool CanConfigure
+		{
+			get { return true; }
+		}
+
+		public override void Configure()
+		{
+		}
+
+		#region ObjectDesignerDataSourceView
+
+		class ObjectDesignerDataSourceView : DesignerDataSourceView
+		{
+			public ObjectDesignerDataSourceView(WebObjectBinderDesigner owner, string viewName)
+				: base(owner, viewName)
+			{
+				_owner = owner;
+			}
+
+			private readonly WebObjectBinderDesigner _owner;
+
+			public override IDataSourceViewSchema Schema
+			{
+				get { return new ObjectViewSchema(_owner); }
+			}
+
+			public override bool CanDelete { get { return _owner._component._objectBinder.AllowRemove; } }
+			public override bool CanInsert { get { return _owner._component._objectBinder.AllowNew;    } }
+			public override bool CanUpdate { get { return _owner._component._objectBinder.AllowEdit;   } }
+			public override bool CanPage   { get { return true;                                        } }
+			public override bool CanSort   { get { return true;                                        } }
+			public override bool CanRetrieveTotalRowCount { get { return true; } }
+
+			class ObjectViewSchema : IDataSourceViewSchema
+			{
+				public ObjectViewSchema(WebObjectBinderDesigner owner)
+				{
+					_owner = owner;
+				}
+
+				private readonly WebObjectBinderDesigner _owner;
+
+				public IDataSourceViewSchema[] GetChildren()
+				{
+					return null;
+				}
+
+				public IDataSourceFieldSchema[] GetFields()
+				{
+					PropertyDescriptorCollection fields =
+						((ITypedList)_owner._component._objectBinder).GetItemProperties(null);
+
+					IDataSourceFieldSchema[] schema = new IDataSourceFieldSchema[fields.Count];
+
+					for (int i = 0; i < schema.Length; i++)
+						schema[i] = new ObjectFieldSchema(fields[i]);
+
+					return schema;
+				}
+
+				public string Name
+				{
+					get
+					{
+						Type type = _owner._component._objectBinder.ItemType;
+
+						return type != null? type.Name: string.Empty;
+					}
+				}
+
+				class ObjectFieldSchema : IDataSourceFieldSchema
+				{
+					public ObjectFieldSchema(PropertyDescriptor propertyDescriptor)
+					{
+						_propertyDescriptor = propertyDescriptor;
+
+						DataObjectFieldAttribute attr =
+							(DataObjectFieldAttribute)_propertyDescriptor.Attributes[typeof(DataObjectFieldAttribute)];
+
+						if (attr != null)
+						{
+							_length     = attr.Length;
+							_primaryKey = attr.PrimaryKey;
+							_isIdentity = attr.IsIdentity;
+							_isNullable = attr.IsNullable;
+						}
+					}
+
+					private readonly PropertyDescriptor _propertyDescriptor;
+					private readonly int                _length = -1;
+					private readonly bool               _isIdentity;
+					private readonly bool               _isNullable;
+					private readonly bool               _primaryKey;
+
+					public Type   DataType   { get { return _propertyDescriptor.PropertyType; } }
+					public bool   Identity   { get { return _isIdentity;                      } }
+					public bool   IsReadOnly { get { return _propertyDescriptor.IsReadOnly;   } }
+					public bool   IsUnique   { get { return false;                            } }
+					public int    Length     { get { return _length;                          } }
+					public string Name       { get { return _propertyDescriptor.Name;         } }
+					public int    Precision  { get { return -1;                               } }
+					public bool   PrimaryKey { get { return _primaryKey;                      } }
+					public int    Scale      { get { return -1;                               } }
+
+					public bool Nullable
+					{
+						get
+						{
+							Type type           = _propertyDescriptor.PropertyType;
+							Type underlyingType = System.Nullable.GetUnderlyingType(type);
+
+							return underlyingType != null? true: _isNullable;
+						}
+					}
+				}
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Web/UI/WebObjectBinder.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,251 @@
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Drawing;
+using System.Drawing.Design;
+using System.Web.Compilation;
+using System.Web.UI;
+
+using BLToolkit.ComponentModel;
+using BLToolkit.ComponentModel.Design;
+using BLToolkit.EditableObjects;
+
+namespace BLToolkit.Web.UI
+{
+	[DefaultProperty("TypeName")]
+	[ToolboxBitmap(typeof(WebObjectBinder))]
+#if !FW4
+	[Designer(typeof(BLToolkit.Web.UI.Design.WebObjectBinderDesigner))]
+#endif
+	[PersistChildren(false)]
+	[ParseChildren(true)]
+	[Description("BLToolkit Web Object Binder")]
+	[DisplayName("Object Binder")]
+	public class WebObjectBinder : DataSourceControl, IListSource
+	{
+		#region Constructors
+
+		public WebObjectBinder()
+		{
+			_objectBinder.ListChanged += _objectBinder_ListChanged;
+		}
+
+		#endregion
+
+		#region Public Members
+
+		[RefreshProperties(RefreshProperties.Repaint)]
+		[DefaultValue(null)]
+		[Category("Data")]
+		[Editor(typeof(TypeNameEditor), typeof(UITypeEditor))]
+		public string TypeName
+		{
+			get
+			{
+				Type type = _objectBinder.ItemType;
+				return type == null ? "(none)" : type.FullName;
+			}
+			set
+			{
+				_objectBinder.ItemType = string.IsNullOrEmpty(value) || value == "(none)"?
+					null: BuildManager.GetType(value, false, true);
+			}
+		}
+
+		[RefreshProperties(RefreshProperties.Repaint)]
+		[DefaultValue(null)]
+		[Category("Data")]
+		[Editor(typeof(ObjectViewTypeNameEditor), typeof(UITypeEditor))]
+		public string ObjectViewTypeName
+		{
+			get
+			{
+				Type type = _objectBinder.ObjectViewType;
+				return type == null ? "(none)" : type.FullName;
+			}
+			set
+			{
+				_objectBinder.ObjectViewType = string.IsNullOrEmpty(value) || value == "(none)"?
+					null: BuildManager.GetType(value, false, true);
+			}
+		}
+
+		[Browsable(false)]
+		[RefreshProperties(RefreshProperties.Repaint)]
+		[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+		public object Object
+		{
+			get { return _objectBinder.Object;  }
+			set { _objectBinder.Object = value; }
+		}
+
+		[Browsable(false)]
+		[RefreshProperties(RefreshProperties.Repaint)]
+		[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+		public IList List
+		{
+			get { return _objectBinder.List;  }
+			set { _objectBinder.List = value; }
+		}
+
+		#endregion
+
+		#region Protected members
+
+		internal ObjectBinder _objectBinder = new ObjectBinder();
+
+		private void _objectBinder_ListChanged(object sender, ListChangedEventArgs e)
+		{
+			switch (e.ListChangedType)
+			{
+				case ListChangedType.PropertyDescriptorAdded:
+				case ListChangedType.PropertyDescriptorChanged:
+				case ListChangedType.PropertyDescriptorDeleted:
+					RaiseDataSourceChangedEvent(e);
+					break;
+			}
+		}
+
+		public override void Dispose()
+		{
+			_objectBinder.Dispose();
+
+			base.Dispose();
+		}
+
+		#endregion
+
+		#region IListSource Members
+
+		bool IListSource.ContainsListCollection
+		{
+			get { return false; }
+		}
+
+		IList IListSource.GetList()
+		{
+			return _objectBinder.List;
+		}
+
+		#endregion
+
+		#region IDataSource Members
+
+		private ObjectDataSourceView _view;
+
+		protected override DataSourceView GetView(string viewName)
+		{
+			if (_view == null)
+				_view = new ObjectDataSourceView(this, "DefaultView");
+
+			return _view;
+		}
+
+		protected override ICollection GetViewNames()
+		{
+			return new string[] { "DefaultView" };
+		}
+
+		#endregion
+
+		#region ObjectDataSourceView
+
+		class ObjectDataSourceView : DataSourceView
+		{
+			public ObjectDataSourceView(WebObjectBinder owner, string viewName)
+				: base(owner, viewName)
+			{
+				_owner = owner;
+			}
+
+			readonly WebObjectBinder _owner;
+
+			protected override IEnumerable ExecuteSelect(DataSourceSelectArguments arguments)
+			{
+				return new ObjectEnumerator(_owner._objectBinder, arguments);
+			}
+
+			public override bool CanDelete { get { return _owner._objectBinder.AllowRemove; } }
+			public override bool CanInsert { get { return _owner._objectBinder.AllowNew;    } }
+			public override bool CanUpdate { get { return _owner._objectBinder.AllowEdit;   } }
+			public override bool CanPage   { get { return true;                             } }
+			public override bool CanSort   { get { return true;                             } }
+			public override bool CanRetrieveTotalRowCount { get { return true; } }
+		}
+
+		#endregion
+
+		#region ObjectEnumerator
+
+		class ObjectEnumerator : ICollection
+		{
+			public ObjectEnumerator(ObjectBinder objectBinder, DataSourceSelectArguments arguments)
+			{
+				_objectBinder = objectBinder;
+				_arguments    = arguments;
+			}
+
+			private readonly ObjectBinder              _objectBinder;
+			private readonly DataSourceSelectArguments _arguments;
+
+			#region ICollection Members
+
+			public void CopyTo(Array array, int index)
+			{
+				_objectBinder.List.CopyTo(array, index);
+			}
+
+			public int Count
+			{
+				get { return _objectBinder.List.Count; }
+			}
+
+			public bool IsSynchronized
+			{
+				get { return _objectBinder.List.IsSynchronized; }
+			}
+
+			public object SyncRoot
+			{
+				get { return _objectBinder.List.SyncRoot; }
+			}
+
+			#endregion
+
+			#region IEnumerable Members
+
+			public IEnumerator GetEnumerator()
+			{
+				_arguments.AddSupportedCapabilities(DataSourceCapabilities.Page);
+				_arguments.AddSupportedCapabilities(DataSourceCapabilities.Sort);
+				_arguments.AddSupportedCapabilities(DataSourceCapabilities.RetrieveTotalRowCount);
+
+				EditableArrayList list = (EditableArrayList)_objectBinder.List;
+
+				_arguments.TotalRowCount = list.Count;
+
+				if (!string.IsNullOrEmpty(_arguments.SortExpression))
+				{
+					list = new EditableArrayList(list.ItemType, list.Count);
+					list.AddRange(_objectBinder.List);
+					list.SortEx(_arguments.SortExpression);
+				}
+
+				int start = _arguments.StartRowIndex >= 0? _arguments.StartRowIndex: 0;
+				int count = _arguments.MaximumRows    > 0?
+					Math.Min(_arguments.MaximumRows, list.Count): list.Count;
+
+				for (int i = 0; i < count; i++)
+				{
+					object o = list[i + start];
+
+					yield return o is ICustomTypeDescriptor? o: new ObjectHolder(o, _objectBinder);
+				}
+			}
+
+			#endregion
+		}
+
+		#endregion
+	}
+}
Binary file Source/Web/UI/WebObjectBinder.ico has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/BLTgen/BLTgen.2005.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,57 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.50727</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{65FC918C-FF12-4C75-96F5-180B552989E5}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLTgen</RootNamespace>
+    <AssemblyName>BLTgen</AssemblyName>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="StringListMapper.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.2.csproj">
+      <Project>{F4DF7358-8EE6-49FD-AB13-EA5145058D79}</Project>
+      <Name>BLToolkit.2</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/BLTgen/BLTgen.2008.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,98 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{65FC918C-FF12-4C75-96F5-180B552989E5}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLTgen</RootNamespace>
+    <AssemblyName>BLTgen</AssemblyName>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="StringListMapper.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.3.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/BLTgen/BLTgen.2010.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{65FC918C-FF12-4C75-96F5-180B552989E5}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLTgen</RootNamespace>
+    <AssemblyName>BLTgen.4</AssemblyName>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkProfile />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\BLTgen.4.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\BLTgen.4.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="StringListMapper.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/BLTgen/Program.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,242 @@
+using System;
+using System.ComponentModel;
+using System.IO;
+using System.Reflection;
+using System.Text.RegularExpressions;
+
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+
+namespace BLTgen
+{
+	public class Arguments
+	{
+		[MapField(""), Description("source assembly location")]
+		public string SourceAssembly;
+
+		[MapField("B"), Description("Base type names to include (default: none). Example: /B:*EntityBase;SomeNamespace.*Base")]
+		public string BaseTypes;
+
+		[MapField("O"), Description("Output directory name (default: target assembly location). Example: /O:C:\\Temp")]
+		public string OutputDirectory;
+
+		[MapField("I"), Description("Type names to include (default: all). Example: /I:*Accessor;SomeNamespace.*;OtherNamespace.*")]
+		public string Include;
+
+		[MapField("X"), Description("Type names to exclude (default: none). Example: /X:SomeNamespace.SomeType")]
+		public string Exclude;
+
+		[MapField("K"), Description("The key pair that is used to create a strong name signature for the output assembly (default: none). Example: /K:C:\\SomePath\\key.snk")]
+		public string KeyPairFile;
+
+		[MapField("V"), Description("The version of the output assembly (same as source assembly by default). Example: /V:1.2.3.4")]
+		public string Version;
+
+		[MapField("D"), Description("Detailed output (default: false). Example: /D")]
+		public string Debug;
+	}
+
+	class Program
+	{
+		public static void Main(string[] args)
+		{
+			var parsedArgs = new Arguments();
+
+			Map.MapSourceToDestination(new StringListMapper(args), args,
+				Map.GetObjectMapper(typeof(Arguments)), parsedArgs);
+
+			WriteBanner();
+
+			if (string.IsNullOrEmpty(parsedArgs.SourceAssembly))
+				Usage();
+			else
+				GenerateExtensionAssembly(parsedArgs);
+		}
+
+		private static void GenerateExtensionAssembly(Arguments parsedArgs)
+		{
+			var verbose                  = parsedArgs.Debug != null;
+			var sourceAsm                = Assembly.LoadFrom(parsedArgs.SourceAssembly);
+			var extensionAssemblyPath    = GetOutputAssemblyLocation(sourceAsm.Location, parsedArgs.OutputDirectory);
+			var extensionAssemblyVersion = parsedArgs.Version != null? new Version(parsedArgs.Version): sourceAsm.GetName().Version;
+			var extensionAssemblyFolder  = Path.GetDirectoryName(extensionAssemblyPath);
+
+			if (verbose)
+				Console.WriteLine("{0} =>{1}{2}", sourceAsm.Location, Environment.NewLine, extensionAssemblyPath);
+
+			if (!string.IsNullOrEmpty(extensionAssemblyFolder) && !Directory.Exists(extensionAssemblyFolder))
+				Directory.CreateDirectory(extensionAssemblyFolder);
+
+			var typesToProcess = sourceAsm.GetExportedTypes();
+
+			typesToProcess = FilterBaseTypes(typesToProcess, parsedArgs.BaseTypes);
+			typesToProcess = FilterTypes(typesToProcess, parsedArgs.Include, true);
+			typesToProcess = FilterTypes(typesToProcess, parsedArgs.Exclude, false);
+
+			if (typesToProcess.Length > 0)
+			{
+				AppDomain.CurrentDomain.AssemblyResolve += delegate(object sender, ResolveEventArgs args)
+				{
+					foreach (var asm in ((AppDomain)sender).GetAssemblies())
+					{
+						if (string.Compare(asm.FullName, args.Name) == 0)
+							return asm;
+					}
+
+					return null;
+				};
+
+				TypeFactory.SaveTypes = true;
+				TypeFactory.SetGlobalAssembly(extensionAssemblyPath, extensionAssemblyVersion, parsedArgs.KeyPairFile);
+
+				foreach (var t in typesToProcess)
+				{
+					if (verbose)
+						Console.Write(GetFullTypeName(t));
+
+					// We cannot create accessors for generic definitions
+					//
+					if (t.IsGenericTypeDefinition)
+					{
+						if (verbose)
+							Console.WriteLine(" - skipping. Generic Definition");
+
+						continue;
+					}
+
+					if (verbose)
+						Console.WriteLine();
+
+					try
+					{
+						TypeAccessor.GetAccessor(t);
+					}
+					catch (Exception e)
+					{
+						if (verbose)
+							Console.WriteLine(e);
+					}
+				}
+
+				TypeFactory.SaveGlobalAssembly();
+			}
+			else if (verbose)
+				Console.WriteLine("No types to process.");
+		}
+
+		private static Type[] FilterBaseTypes(Type[] types, string pattern)
+		{
+			if (string.IsNullOrEmpty(pattern))
+				return types;
+
+			var re = new Regex("^" + Regex.Escape(pattern).Replace("\\*", ".*").Replace(";", "$|") + "$");
+
+			return Array.FindAll(types, delegate(Type t)
+			{
+				for (var bt = t.BaseType; bt != null; bt = bt.BaseType)
+				{
+					if (re.Match(GetFullTypeName(bt)).Success)
+						return true;
+				}
+				return false;
+			});
+		}
+
+		private static Type[] FilterTypes(Type[] types, string pattern, bool include)
+		{
+			if (string.IsNullOrEmpty(pattern))
+				return types;
+
+			var re = new Regex("^" + Regex.Escape(pattern).Replace("\\*", ".*").Replace(";", "$|") + "$");
+
+			return Array.FindAll(types, t => re.Match(GetFullTypeName(t)).Success == include);
+		}
+
+		// System.Type.FullName may be null under some conditions. See
+		// http://blogs.msdn.com/haibo_luo/archive/2006/02/17/534480.aspx
+		//
+		private static string GetFullTypeName(Type t)
+		{
+			var fullName = t.FullName;
+
+			if (fullName != null)
+				return fullName;
+
+			if (t.DeclaringType != null)
+				return GetFullTypeName(t.DeclaringType) + "+" + t.Name;
+
+			fullName = t.Namespace;
+			if (fullName != null)
+				fullName += ".";
+
+			fullName += t.Name;
+
+			return fullName;
+		}
+
+		private static string GetOutputAssemblyLocation(string sourceAssembly, string outputDirectory)
+		{
+			if (string.IsNullOrEmpty(outputDirectory))
+				outputDirectory = Path.GetDirectoryName(sourceAssembly);
+
+			var fileName = Path.ChangeExtension(Path.GetFileName(sourceAssembly), "BLToolkitExtension.dll");
+			return Path.Combine(Path.GetFullPath(outputDirectory), fileName);
+		}
+
+		#region Usage
+
+		private static void WriteBanner()
+		{
+			var asm = Assembly.GetExecutingAssembly();
+			var descriptionAttribute = (AssemblyDescriptionAttribute)
+				Attribute.GetCustomAttribute(asm, typeof (AssemblyDescriptionAttribute));
+			var copyrightAttribute = (AssemblyCopyrightAttribute)
+				Attribute.GetCustomAttribute(asm, typeof(AssemblyCopyrightAttribute));
+
+			Console.WriteLine("{0}, Version {1}", descriptionAttribute.Description, asm.GetName().Version);
+			Console.WriteLine(copyrightAttribute.Copyright);
+			Console.WriteLine();
+		}
+
+		private static string ExecutableName
+		{
+			get { return Path.GetFileName(new Uri(Assembly.GetEntryAssembly().EscapedCodeBase).LocalPath); }
+		}
+
+		private static string GetDescription(MemberMapper mm)
+		{
+			var desc = mm.MemberAccessor.GetAttribute<DescriptionAttribute>();
+
+			return (null != desc) ? desc.Description : string.Empty;
+		}
+
+		private static void Usage()
+		{
+			var om = Map.GetObjectMapper(typeof(Arguments));
+
+			Console.Write("Usage: {0}", ExecutableName);
+
+			foreach (MemberMapper mm in om)
+			{
+				if (0 == mm.Name.Length)
+					Console.Write(" <{0}>", GetDescription(mm));
+				else
+					Console.Write(" /{0}:", mm.Name);
+			}
+
+			Console.WriteLine();
+			Console.WriteLine("Options:");
+
+			foreach (MemberMapper mm in om)
+			{
+				if (0 != mm.Name.Length)
+					Console.WriteLine("\t{0}: {1}", mm.Name, GetDescription(mm));
+			}
+
+			Console.WriteLine();
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/BLTgen/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,29 @@
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("BLTgen")]
+[assembly: AssemblyDescription("Business Logic Toolkit Extension Assembly Generator")]
+[assembly: AssemblyProduct("Business Logic Toolkit")]
+[assembly: AssemblyCopyright("\xA9 2002-2012 www.bltoolkit.net")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("92fdb31a-0bc4-4e4d-a44b-67cbad205bd5")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version
+//      Build Number
+//      Revision
+//
+[assembly: AssemblyVersion    ("4.1")]
+[assembly: AssemblyFileVersion("4.1")]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/BLTgen/StringListMapper.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,75 @@
+using System;
+
+using BLToolkit.Mapping;
+
+namespace BLTgen
+{
+	public class StringListMapper : MapDataSourceBase
+	{
+		string[] _list;
+
+		public StringListMapper(string[] list)
+		{
+			_list = list;
+		}
+
+		#region IMapDataSource
+
+		public override int Count
+		{
+			get { return _list.Length; }
+		}
+
+		public override Type GetFieldType(int index)
+		{
+			return (index > 0 && index < _list.Length)? typeof(string): null;
+		}
+
+		public override string GetName(int index)
+		{
+			return GetNameOrValue(_list[index], true);
+		}
+
+		public override int GetOrdinal(string name)
+		{
+			throw new InvalidOperationException("IMapDataSource.GetOrdinal(string)");
+		}
+
+		public override object GetValue(object o, int index)
+		{
+			return GetNameOrValue(_list[index], false);
+		}
+
+		public override object GetValue(object o, string name)
+		{
+			throw new InvalidOperationException("IMapDataSource.GetValue(object, string)");
+		}
+
+		#endregion
+
+		#region Implementation
+
+		private static string GetNameOrValue(string str, bool name)
+		{
+			if (str.StartsWith("\"") && str.EndsWith("\""))
+				str = str.Substring(1, str.Length - 2);
+
+			// Option
+			//
+			if (str.StartsWith("-") || str.StartsWith("/"))
+			{
+				int colon = str.IndexOfAny(new char[] { ':', '=' }, 1);
+				if (colon > 0)
+					return name ? str.Substring(1, colon - 1) : str.Substring(colon + 1);
+
+				return name ? str.Substring(1) : string.Empty;
+			}
+
+			// Default parameter
+			//
+			return name ? string.Empty : str;
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/BLTgen/app.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<configuration>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/CodeGenerator/CodeGenerator.2.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,68 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.50727</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{E7735874-6552-4B35-A9C1-1279A9E9C8B9}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>CodeGenerator</RootNamespace>
+    <AssemblyName>CodeGenerator.2</AssemblyName>
+    <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
+    <StartupObject>
+    </StartupObject>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <LangVersion>default</LangVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Convert.xml">
+      <Generator>TransformCodeGenerator</Generator>
+      <LastGenOutput>Convert.cs</LastGenOutput>
+      <CustomToolNamespace>BLToolkit.Common</CustomToolNamespace>
+    </Content>
+    <Content Include="Convert.xslt" />
+    <Content Include="ValueMapping.xml">
+      <Generator>TransformCodeGenerator</Generator>
+      <LastGenOutput>ValueMapping.cs</LastGenOutput>
+      <CustomToolNamespace>BLToolkit.Mapping</CustomToolNamespace>
+    </Content>
+    <Content Include="ValueMapping.xslt" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Convert.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Convert.xml</DependentUpon>
+    </Compile>
+    <Compile Include="Convert.Declare.cs" />
+    <Compile Include="ValueMapping.Declare.cs" />
+    <Compile Include="ValueMapping.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>ValueMapping.xml</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/CodeGenerator/CodeGenerator.2008.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,73 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.50727</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{E7735874-6552-4B35-A9C1-1279A9E9C8B9}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>CodeGenerator</RootNamespace>
+    <AssemblyName>CodeGenerator.2</AssemblyName>
+    <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>2.0</OldToolsVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <LangVersion>default</LangVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Convert.xml">
+      <Generator>TransformCodeGenerator</Generator>
+      <LastGenOutput>Convert.cs</LastGenOutput>
+      <CustomToolNamespace>BLToolkit.Common</CustomToolNamespace>
+    </Content>
+    <Content Include="Convert.xslt" />
+    <Content Include="ValueMapping.xml">
+      <Generator>TransformCodeGenerator</Generator>
+      <LastGenOutput>ValueMapping.cs</LastGenOutput>
+      <CustomToolNamespace>BLToolkit.Mapping</CustomToolNamespace>
+    </Content>
+    <Content Include="ValueMapping.xslt" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Convert.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Convert.xml</DependentUpon>
+    </Compile>
+    <Compile Include="Convert.Declare.cs" />
+    <Compile Include="ValueMapping.Declare.cs" />
+    <Compile Include="ValueMapping.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>ValueMapping.xml</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/CodeGenerator/Convert.Declare.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,60 @@
+using System;
+
+[assembly: CLSCompliant(true)]
+
+namespace BLToolkit.Common
+{
+	public class TypeHelper
+	{
+		public static bool IsSameOrParent(Type type,Type type1)
+		{
+			return true;
+		}
+	}
+
+	public interface IConvertible<T,P>
+	{
+		T From(P p);
+	}
+
+	public static partial class Convert<T,P>
+	{
+		public static IConvertible<T,P> Instance = GetConverter();
+
+		private static IConvertible<T,P> GetConverter()
+		{
+			if (TypeHelper.IsSameOrParent(typeof(T), typeof(P)))
+			{
+				return (IConvertible<T,P>)(object)(new ConvertAssignable<P,P>());
+			}
+
+			return new ConvertExplicit<T,P>();
+		}
+	}
+
+	internal class ConvertAssignable<T,P>: IConvertible<T,P> where P: T
+	{
+		T IConvertible<T,P>.From(P p) { return p; }
+	}
+
+	internal class ConvertDefault<T,P>: IConvertible<T,P>
+	{
+		T IConvertible<T,P>.From(P p) { return (T)System.Convert.ChangeType(p, typeof(T)); }
+	}
+
+	internal partial class ConvertPartial<T,P>: ConvertDefault<T,P>
+	{
+	}
+
+	internal partial class ConvertExplicit<T,P>: ConvertPartial<T,P>
+	{
+	}
+}
+
+namespace BLToolkit.Properties
+{
+	public class Resources
+	{
+		public const string Convert_InvalidCast = "{0} {1}";
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/CodeGenerator/Convert.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1832 @@
+<?xml version="1.0" encoding="utf-8"?>
+<code transformer="Convert.xslt">
+
+<<<<<<<<<<<<<<< This crap should not be used anymore.
+
+
+	<using namespace="System"/>
+	<using namespace="System.Data.SqlTypes"/>
+	<using namespace="System.Data.Linq"/>
+	<using namespace="System.Globalization"/>
+	<using namespace="System.IO"/>
+	<using namespace="System.Xml"/>
+	<br/>
+	<using namespace="BLToolkit.Properties"/>
+
+	<type name="SByte"  clscompliant="false"/>
+	<type name="UInt16" clscompliant="false"/>
+	<type name="UInt32" clscompliant="false"/>
+	<type name="UInt64" clscompliant="false"/>
+
+	<type name="DateTimeOffset" condition="FW3"/>
+	<type name="Binary"         condition="FW3"/>
+
+	<template name="Integer Types">
+		<type name="SByte"   />
+		<type name="Int16"   />
+		<type name="Int32"   />
+		<type name="Int64"   />
+		<br/>
+		<type name="Byte"    />
+		<type name="UInt16"  />
+		<type name="UInt32"  />
+		<type name="UInt64"  />
+	</template>
+
+	<template name="Numeric Types">
+		<include template="Integer Types"/>
+		<br/>
+		<type name="Single"  />
+		<type name="Double"  />
+		<br/>
+		<type name="Boolean" />
+		<type name="Decimal" />
+	</template>
+
+	<template name="SqlTypes">
+		<type name="SqlString"/>
+		<br/>
+		<type name="SqlByte"/>
+		<type name="SqlInt16"/>
+		<type name="SqlInt32"/>
+		<type name="SqlInt64"/>
+		<br/>
+		<type name="SqlSingle"/>
+		<type name="SqlDouble"/>
+		<type name="SqlDecimal"/>
+		<type name="SqlMoney"/>
+		<br/>
+		<type name="SqlBoolean"/>
+	</template>
+
+	<region name="Scalar Types">
+		<converter type="String">
+			<group name="Scalar Types.">
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="TimeSpan"/>
+				<from type="DateTime"/>
+				<from type="DateTimeOffset"/>
+				<from type="Guid"/>
+				<default              >return p.ToString();</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="TimeSpan"/>
+				<from type="DateTime"/>
+				<from type="DateTimeOffset"/>
+				<from type="Guid"/>
+				<default              >return p.ToString();</default>
+			</group>
+			<group name="SqlTypes">
+				<include template ="SqlTypes"/>
+				<from type="SqlGuid"/>
+				<from type="SqlChars" >return p.IsNull?  null: p.ToSqlString().Value;</from>
+				<from type="SqlXml"   >return p.IsNull?  null: p.Value;</from>
+				<default              >return p.ToString();</default>
+			</group>
+			<group name="Other Types">
+				<from type="Type"       >return p == null? null: p.FullName;</from>
+				<from type="XmlDocument">return p == null? null: p.InnerXml;</from>
+				<from type="Byte[]"     >return p == null? null: System.Text.Encoding.UTF8.GetString(p);</from>
+				<from type="Binary"     >return p == null? null: System.Text.Encoding.UTF8.GetString(p.ToArray());</from>
+			</group>
+			<default nullvalue="Common.Configuration.NullableValues.String" nothrow="true">
+			if (p is IConvertible) return ((IConvertible)p).ToString(null);
+			if (p is IFormattable) return ((IFormattable)p).ToString(null, null);
+
+			return p.ToString();</default>
+		</converter>
+		<br/>
+		<converter type="SByte"    nullable="false">
+			<group name="Scalar Types.">
+				<from type="String"   >return p == null? (SByte)0: SByte.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Boolean"  >return       (SByte)(p? 1: 0);</from>
+				<from type="Char"/>
+				<default              >return      checked((SByte)p);</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<from type="SByte"    >return p.HasValue?                 p.Value: (SByte)0;</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean"  >return (p.HasValue &amp;&amp; p.Value)?   (SByte)1: (SByte)0;</from>
+				<default              >return p.HasValue? checked((SByte)p.Value): (SByte)0;</default>
+			</group>
+			<group name="SqlTypes">
+				<include template ="SqlTypes"/>
+				<default              >return p.IsNull? (SByte)0:        ToSByte(p.Value);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"   >return p == null || p.Length == 0? (SByte)0: checked((SByte)p[0]);</from>
+				<from type="Binary"   >return p == null || p.Length == 0? (SByte)0: checked((SByte)p.ToArray()[0]);</from>
+			</group>
+			<default nullvalue="Common.Configuration.NullableValues.SByte">
+			if (p is IConvertible) return ((IConvertible)p).ToSByte(null);
+			</default>
+		</converter>
+		<converter type="Int16"    nullable="false">
+			<group name="Scalar Types.">
+				<from type="String"   >return p == null? (Int16)0: Int16.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Boolean"  >return       (Int16)(p? 1: 0);</from>
+				<from type="Char"/>
+				<default              >return      checked((Int16)p);</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<from type="Int16"    >return p.HasValue?                 p.Value: (Int16)0;</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean"  >return (p.HasValue &amp;&amp; p.Value)?   (Int16)1: (Int16)0;</from>
+				<default              >return p.HasValue? checked((Int16)p.Value): (Int16)0;</default>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlInt16" >return p.IsNull? (Int16)0:                p.Value; </from>
+				<include template ="SqlTypes"/>
+				<default              >return p.IsNull? (Int16)0:        ToInt16(p.Value);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"   >return p == null || p.Length == 0? (Int16)0: BitConverter.ToInt16(p, 0);</from>
+				<from type="Binary"   >return p == null || p.Length == 0? (Int16)0: BitConverter.ToInt16(p.ToArray(), 0);</from>
+			</group>
+			<default nullvalue="Common.Configuration.NullableValues.Int16">
+			if (p is IConvertible) return ((IConvertible)p).ToInt16(null);
+			</default>
+		</converter>
+		<converter type="Int32"    nullable="false">
+			<group name="Scalar Types.">
+				<from type="String"   >return p == null? 0: Int32.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Boolean"  >return p? 1: 0;</from>
+				<from type="Char"/>
+				<default              >return checked((Int32)p);</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<from type="Int32"    >return p.HasValue?                 p.Value: 0;</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean"  >return (p.HasValue &amp;&amp; p.Value)?   1: 0;</from>
+				<default              >return p.HasValue? checked((Int32)p.Value): 0;</default>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlInt32" >return p.IsNull? 0:         p.Value; </from>
+				<include template ="SqlTypes"/>
+				<default              >return p.IsNull? 0: ToInt32(p.Value);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"   >return p == null || p.Length == 0? 0: BitConverter.ToInt32(p, 0);</from>
+				<from type="Binary"   >return p == null || p.Length == 0? 0: BitConverter.ToInt32(p.ToArray(), 0);</from>
+			</group>
+			<default nullvalue="Common.Configuration.NullableValues.Int32">
+			if (p is IConvertible) return ((IConvertible)p).ToInt32(null);
+			</default>
+		</converter>
+		<converter type="Int64"    nullable="false">
+			<group name="Scalar Types.">
+				<from type="String"   >return p == null? 0: Int64.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean"  >return p? 1: 0;</from>
+				<from type="DateTime" >return (p - DateTime.MinValue).Ticks;</from>
+				<from type="DateTimeOffset" >return (p - DateTime.MinValue).Ticks;</from>
+				<from type="TimeSpan" >return p.Ticks;</from>
+				<default              >return checked((Int64)p);</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<from type="Int64"    >return p.HasValue?                 p.Value: 0;</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean"  >return (p.HasValue &amp;&amp; p.Value)? 1: 0;</from>
+				<from type="DateTime" >return p.HasValue? (p.Value - DateTime.MinValue).Ticks: 0;</from>
+				<from type="DateTimeOffset" >return p.HasValue? (p.Value - DateTime.MinValue).Ticks: 0;</from>
+				<from type="TimeSpan" >return p.HasValue? p.Value.Ticks: 0;</from>
+				<default              >return p.HasValue? checked((Int64)p.Value): 0;</default>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlInt64" >return p.IsNull? 0:         p.Value; </from>
+				<include template ="SqlTypes"/>
+				<from type="SqlDateTime"/>
+				<default              >return p.IsNull? 0: ToInt64(p.Value);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"   >return p == null || p.Length == 0? 0: BitConverter.ToInt64(p, 0);</from>
+				<from type="Binary"   >return p == null || p.Length == 0? 0: BitConverter.ToInt64(p.ToArray(), 0);</from>
+			</group>
+			<default nullvalue="Common.Configuration.NullableValues.Int64">
+			if (p is IConvertible) return ((IConvertible)p).ToInt64(null);
+			</default>
+		</converter>
+		<br/>
+		<converter type="Byte"    nullable="false">
+			<group name="Scalar Types.">
+				<from type="String"   >return p == null? (Byte)0: Byte.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Boolean"  >return       (Byte)(p? 1: 0);</from>
+				<from type="Char"/>
+				<default              >return      checked((Byte)p);</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<from type="Byte"     >return p.HasValue?               p.Value:  (Byte)0;</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean"  >return (p.HasValue &amp;&amp; p.Value)?   (Byte)1: (Byte)0;</from>
+				<default              >return p.HasValue? checked((Byte)p.Value): (Byte)0;</default>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlByte"  >return p.IsNull? (Byte)0:               p.Value; </from>
+				<include template ="SqlTypes"/>
+				<default              >return p.IsNull? (Byte)0:        ToByte(p.Value);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"   >return p == null || p.Length == 0? (Byte)0: p[0];</from>
+				<from type="Binary"   >return p == null || p.Length == 0? (Byte)0: p.ToArray()[0];</from>
+			</group>
+			<default nullvalue="Common.Configuration.NullableValues.Byte">
+			if (p is IConvertible) return ((IConvertible)p).ToByte(null);
+			</default>
+		</converter>
+		<converter type="UInt16"    nullable="false">
+			<group name="Scalar Types.">
+				<from type="String"   >return p == null? (UInt16)0: UInt16.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Boolean"  >return       (UInt16)(p? 1: 0);</from>
+				<from type="Char"/>
+				<default              >return      checked((UInt16)p);</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<from type="UInt16"    >return p.HasValue?                 p.Value:  (UInt16)0;</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean"  >return (p.HasValue &amp;&amp; p.Value)?   (UInt16)1: (UInt16)0;</from>
+				<default              >return p.HasValue? checked((UInt16)p.Value): (UInt16)0;</default>
+			</group>
+			<group name="SqlTypes">
+				<include template ="SqlTypes"/>
+				<default              >return p.IsNull? (UInt16)0:        ToUInt16(p.Value);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"   >return p == null || p.Length == 0? (UInt16)0: BitConverter.ToUInt16(p, 0);</from>
+				<from type="Binary"   >return p == null || p.Length == 0? (UInt16)0: BitConverter.ToUInt16(p.ToArray(), 0);</from>
+			</group>
+			<default nullvalue="Common.Configuration.NullableValues.UInt16">
+			if (p is IConvertible) return ((IConvertible)p).ToUInt16(null);
+			</default>
+		</converter>
+		<converter type="UInt32"    nullable="false">
+			<group name="Scalar Types.">
+				<from type="String"   >return p == null? 0: UInt32.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Boolean"  >return       (UInt32)(p? 1: 0);</from>
+				<from type="Char"/>
+				<default              >return      checked((UInt32)p);</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<from type="UInt32"    >return p.HasValue?                 p.Value:  0;</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean"  >return (p.HasValue &amp;&amp; p.Value)?   (UInt32)1: 0;</from>
+				<default              >return p.HasValue? checked((UInt32)p.Value): 0;</default>
+			</group>
+			<group name="SqlTypes">
+				<include template ="SqlTypes"/>
+				<default              >return p.IsNull? 0:        ToUInt32(p.Value);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"   >return p == null || p.Length == 0? 0: BitConverter.ToUInt32(p, 0);</from>
+				<from type="Binary"   >return p == null || p.Length == 0? 0: BitConverter.ToUInt32(p.ToArray(), 0);</from>
+			</group>
+			<default nullvalue="Common.Configuration.NullableValues.UInt32">
+			if (p is IConvertible) return ((IConvertible)p).ToUInt32(null);
+			</default>
+		</converter>
+		<converter type="UInt64"    nullable="false">
+			<group name="Scalar Types.">
+				<from type="String"   >return p == null? 0: UInt64.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Boolean"  >return (UInt64)(p? 1: 0);</from>
+				<from type="Char"/>
+				<default              >return checked((UInt64)p);</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<from type="UInt64"    >return p.HasValue?                 p.Value:  0;</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean"  >return (p.HasValue &amp;&amp; p.Value)?   (UInt64)1: 0;</from>
+				<default              >return p.HasValue? checked((UInt64)p.Value): 0;</default>
+			</group>
+			<group name="SqlTypes">
+				<include template ="SqlTypes"/>
+				<default              >return p.IsNull? 0:        ToUInt64(p.Value);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"   >return p == null || p.Length == 0? 0: BitConverter.ToUInt64(p, 0);</from>
+				<from type="Binary"   >return p == null || p.Length == 0? 0: BitConverter.ToUInt64(p.ToArray(), 0);</from>
+			</group>
+			<default nullvalue="Common.Configuration.NullableValues.UInt64">
+			if (p is IConvertible) return ((IConvertible)p).ToUInt64(null);
+			</default>
+		</converter>
+		<br/>
+		<converter type="Char"    nullable="false">
+			<group name="Scalar Types.">
+				<from type="String"   >return p == null? (Char)0: Char.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Boolean"  >return       (Char)(p? 1: 0);</from>
+				<default              >return      checked((Char)p);</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<from type="Char"    >return p.HasValue?                p.Value:  (Char)0;</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Boolean"  >return (p.HasValue &amp;&amp; p.Value)?   (Char)1: (Char)0;</from>
+				<default              >return p.HasValue? checked((Char)p.Value): (Char)0;</default>
+			</group>
+			<group name="SqlTypes">
+				<include template ="SqlTypes"/>
+				<default              >return p.IsNull? (Char)0:        ToChar(p.Value);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"   >return p == null || p.Length == 0? (Char)0: BitConverter.ToChar(p, 0);</from>
+				<from type="Binary"   >return p == null || p.Length == 0? (Char)0: BitConverter.ToChar(p.ToArray(), 0);</from>
+			</group>
+			<default nullvalue="Common.Configuration.NullableValues.Char">
+			if (p is IConvertible) return ((IConvertible)p).ToChar(null);
+			</default>
+		</converter>
+		<converter type="Single"    nullable="false">
+			<group name="Scalar Types.">
+				<from type="String"   >return p == null? 0.0f: Single.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Boolean"  >return      p?      1.0f: 0.0f;</from>
+				<from type="Char"/>
+				<default              >return      checked((Single)p);</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<from type="Single"     >return p.HasValue?                 p.Value:  0.0f;</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean"  >return (p.HasValue &amp;&amp; p.Value)?        1.0f: 0.0f;</from>
+				<default              >return p.HasValue? checked((Single)p.Value): 0.0f;</default>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlSingle">return p.IsNull? 0.0f:                 p.Value; </from>
+				<include template ="SqlTypes"/>
+				<default              >return p.IsNull? 0.0f:        ToSingle(p.Value);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"   >return p == null || p.Length == 0? 0.0f: BitConverter.ToSingle(p, 0);</from>
+				<from type="Binary"   >return p == null || p.Length == 0? 0.0f: BitConverter.ToSingle(p.ToArray(), 0);</from>
+			</group>
+			<default nullvalue="Common.Configuration.NullableValues.Single">
+			if (p is IConvertible) return ((IConvertible)p).ToSingle(null);
+			</default>
+		</converter>
+		<converter type="Double"    nullable="false">
+			<group name="Scalar Types.">
+				<from type="String"   >return p == null? 0.0: Double.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Boolean"  >return      p?      1.0: 0.0;</from>
+				<from type="Char"/>
+				<from type="DateTime" >return (p - DateTime.MinValue).TotalDays;</from>
+				<from type="DateTimeOffset" >return (p - DateTime.MinValue).TotalDays;</from>
+				<from type="TimeSpan" >return p.TotalDays;</from>
+				<default              >return      checked((Double)p);</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<from type="Double"     >return p.HasValue?                 p.Value:  0.0;</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean"  >return (p.HasValue &amp;&amp; p.Value)?         1.0: 0.0;</from>
+				<from type="DateTime" >return p.HasValue? (p.Value - DateTime.MinValue).TotalDays: 0.0;</from>
+				<from type="DateTimeOffset" >return p.HasValue? (p.Value - DateTime.MinValue).TotalDays: 0.0;</from>
+				<from type="TimeSpan" >return p.HasValue? p.Value.TotalDays: 0.0;</from>
+				<default              >return p.HasValue? checked((Double)p.Value):  0.0;</default>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlDouble">return p.IsNull? 0.0:                 p.Value; </from>
+				<include template ="SqlTypes"/>
+				<from type="SqlDateTime"/>
+				<default              >return p.IsNull? 0.0:        ToDouble(p.Value);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"   >return p == null || p.Length == 0? 0.0: BitConverter.ToDouble(p, 0);</from>
+				<from type="Binary"   >return p == null || p.Length == 0? 0.0: BitConverter.ToDouble(p.ToArray(), 0);</from>
+			</group>
+			<default nullvalue="Common.Configuration.NullableValues.Double">
+			if (p is IConvertible) return ((IConvertible)p).ToDouble(null);
+			</default>
+		</converter>
+		<br/>
+		<converter type="Boolean"  nullable="false">
+			<group name="Scalar Types.">
+				<from type="String">return p == null? false : p.Length == 1 ? ToBoolean(p[0]) : Boolean.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<br/>
+				<from type="Char">
+			switch (p)
+			{
+			case (Char)0: return false; // Allow int &lt;=&gt; Char &lt;=&gt; Boolean
+			case     '0': return false;
+			case     'n': return false;
+			case     'N': return false;
+			case     'f': return false;
+			case     'F': return false;
+
+			case (Char)1: return true; // Allow int &lt;=&gt; Char &lt;=&gt; Boolean
+			case     '1': return true;
+			case     'y': return true;
+			case     'Y': return true;
+			case     't': return true;
+			case     'T': return true;
+			}
+
+			throw CreateInvalidCastException(typeof(Char), typeof(Boolean));</from>
+				<default              >return p != 0;</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<from type="Boolean"   >return p.HasValue? p.Value:      false;</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<br/>
+				<from type="Char"      >return p.HasValue? ToBoolean(p.Value): false;</from>
+				<default               >return p.HasValue? p.Value != 0: false;</default>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlBoolean">return p.IsNull? false:           p.Value; </from>
+				<include template ="SqlTypes"/>
+				<default               >return p.IsNull? false: ToBoolean(p.Value);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"    >return p == null || p.Length == 0? false: BitConverter.ToBoolean(p, 0);</from>
+				<from type="Binary"    >return p == null || p.Length == 0? false: BitConverter.ToBoolean(p.ToArray(), 0);</from>
+			</group>
+			<default nullvalue="Common.Configuration.NullableValues.Boolean">
+			if (p is IConvertible) return ((IConvertible)p).ToBoolean(null);
+			</default>
+		</converter>
+		<converter type="Decimal"    nullable="false">
+			<group name="Scalar Types.">
+				<from type="String"   >return p == null? 0.0m: Decimal.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Boolean"  >return      p?      1.0m: 0.0m;</from>
+				<from type="Char"/>
+				<default              >return      checked((Decimal)p);</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<from type="Decimal"     >return p.HasValue?                  p.Value:  0.0m;</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean"  >return (p.HasValue &amp;&amp; p.Value)?         1.0m: 0.0m;</from>
+				<default              >return p.HasValue? checked((Decimal)p.Value): 0.0m;</default>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlDecimal">return p.IsNull? 0.0m:           p.Value; </from>
+				<from type="SqlMoney"  >return p.IsNull? 0.0m:           p.Value; </from>
+				<include template ="SqlTypes"/>
+				<default               >return p.IsNull? 0.0m: ToDecimal(p.Value);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]">
+					if (p == null || p.Length == 0) return 0.0m;
+
+					int[] bits = new int[p.Length / sizeof(int)];
+
+					Buffer.BlockCopy(p, 0, bits, 0, p.Length);
+					return new Decimal(bits);</from>
+				<from type="Binary">
+					if (p == null || p.Length == 0) return 0.0m;
+
+					int[] bits = new int[p.Length / sizeof(int)];
+
+					Buffer.BlockCopy(p.ToArray(), 0, bits, 0, p.Length);
+					return new Decimal(bits);
+				</from>
+			</group>
+			<default nullvalue="Common.Configuration.NullableValues.Decimal">
+			if (p is IConvertible) return ((IConvertible)p).ToDecimal(null);
+			</default>
+		</converter>
+		<converter type="DateTime" nullable="false">
+			<group name="Scalar Types.">
+				<from type="String"   >return p == null? DateTime.MinValue: DateTime.Parse(p, null, DateTimeStyles.NoCurrentDateDefault);</from>
+				<from type="TimeSpan" >return DateTime.MinValue + p;</from>
+				<from type="Int64"    >return DateTime.MinValue + TimeSpan.FromTicks(p);</from>
+				<from type="Double"   >return DateTime.MinValue + TimeSpan.FromDays(p);</from>
+				<from type="DateTimeOffset" >return p.LocalDateTime;</from>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<from type="DateTime"       >return p.HasValue?                                               p.Value:  DateTime.MinValue;</from>
+				<from type="DateTimeOffset" >return p.HasValue?                                   p.Value.LocalDateTime:  DateTime.MinValue;</from>
+				<from type="TimeSpan"       >return p.HasValue? DateTime.MinValue +                           p.Value:  DateTime.MinValue;</from>
+				<from type="Int64"          >return p.HasValue? DateTime.MinValue +        TimeSpan.FromTicks(p.Value): DateTime.MinValue;</from>
+				<from type="Double"         >return p.HasValue? DateTime.MinValue + TimeSpan.FromDays(p.Value): DateTime.MinValue;</from>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlDateTime">return p.IsNull? DateTime.MinValue:                                               p.Value; </from>
+				<from type="SqlString"  >return p.IsNull? DateTime.MinValue:                                    ToDateTime(p.Value);</from>
+				<from type="SqlInt64"   >return p.IsNull? DateTime.MinValue: DateTime.MinValue +        TimeSpan.FromTicks(p.Value);</from>
+				<from type="SqlDouble"  >return p.IsNull? DateTime.MinValue: DateTime.MinValue + TimeSpan.FromDays(p.Value);</from>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"     >return p == null || p.Length == 0? DateTime.MinValue: DateTime.FromBinary(ToInt64(p));</from>
+				<from type="Binary"     >return p == null || p.Length == 0? DateTime.MinValue: DateTime.FromBinary(ToInt64(p.ToArray()));</from>
+			</group>
+			<default nullvalue="Common.Configuration.NullableValues.DateTime">
+			if (p is IConvertible) return ((IConvertible)p).ToDateTime(null);
+			</default>
+		</converter>
+		<converter type="DateTimeOffset" nullable="false">
+			<group name="Scalar Types.">
+				<from type="String"   >return p == null? DateTimeOffset.MinValue: DateTimeOffset.Parse(p);</from>
+				<from type="TimeSpan" >return DateTimeOffset.MinValue + p;</from>
+				<from type="Int64"    >return DateTimeOffset.MinValue + TimeSpan.FromTicks(p);</from>
+				<from type="Double"   >return DateTimeOffset.MinValue + TimeSpan.FromDays(p);</from>
+				<from type="DateTime" >return p;</from>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<from type="DateTimeOffset" >return p.HasValue?                                         p.Value:  DateTimeOffset.MinValue;</from>
+				<from type="DateTime" >return p.HasValue?                                               p.Value:  DateTimeOffset.MinValue;</from>
+				<from type="TimeSpan" >return p.HasValue? DateTimeOffset.MinValue +                           p.Value:  DateTimeOffset.MinValue;</from>
+				<from type="Int64"    >return p.HasValue? DateTimeOffset.MinValue +        TimeSpan.FromTicks(p.Value): DateTimeOffset.MinValue;</from>
+				<from type="Double"   >return p.HasValue? DateTimeOffset.MinValue + TimeSpan.FromDays(p.Value): DateTimeOffset.MinValue;</from>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlDateTime">return p.IsNull? DateTimeOffset.MinValue:                                               p.Value; </from>
+				<from type="SqlString"  >return p.IsNull? DateTimeOffset.MinValue:                                    ToDateTimeOffset(p.Value);</from>
+				<from type="SqlInt64"   >return p.IsNull? DateTimeOffset.MinValue: DateTimeOffset.MinValue +        TimeSpan.FromTicks(p.Value);</from>
+				<from type="SqlDouble"  >return p.IsNull? DateTimeOffset.MinValue: DateTimeOffset.MinValue + TimeSpan.FromDays(p.Value);</from>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"     >return p == null || p.Length == 0? DateTimeOffset.MinValue: new DateTimeOffset(ToDateTime(p));</from>
+				<from type="Binary"     >return p == null || p.Length == 0? DateTimeOffset.MinValue: new DateTimeOffset(ToDateTime(p.ToArray()));</from>
+			</group>
+			<default nullvalue="Common.Configuration.NullableValues.DateTimeOffset">
+			if (p is IConvertible) return ToDateTimeOffset(((IConvertible)p).ToDateTime(null));
+			</default>
+		</converter>
+		<converter type="TimeSpan" nullable="false">
+			<group name="Scalar Types.">
+				<from type="String"     >return p == null? TimeSpan.MinValue: TimeSpan.Parse(p);</from>
+				<from type="DateTime"   >return p - DateTime.MinValue;</from>
+				<from type="DateTimeOffset">return p - DateTimeOffset.MinValue;</from>
+				<from type="Int64"      >return TimeSpan.FromTicks(p);</from>
+				<from type="Double"     >return TimeSpan.FromDays(p);</from>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<from type="TimeSpan"   >return p.HasValue? p.Value:                            TimeSpan.MinValue;</from>
+				<from type="DateTime"   >return p.HasValue? p.Value - DateTime.MinValue:        TimeSpan.MinValue;</from>
+				<from type="DateTimeOffset"   >return p.HasValue? p.Value - DateTimeOffset.MinValue:        TimeSpan.MinValue;</from>
+				<from type="Int64"      >return p.HasValue? TimeSpan.FromTicks(p.Value):        TimeSpan.MinValue;</from>
+				<from type="Double"     >return p.HasValue? TimeSpan.FromDays(p.Value): TimeSpan.MinValue;</from>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlString"  >return p.IsNull? TimeSpan.MinValue: TimeSpan.Parse(p.Value);    </from>
+				<from type="SqlDateTime">return p.IsNull? TimeSpan.MinValue: p.Value - DateTime.MinValue;</from>
+				<from type="SqlInt64"   >return p.IsNull? TimeSpan.MinValue: TimeSpan.FromTicks(p.Value);</from>
+				<from type="SqlDouble"  >return p.IsNull? TimeSpan.MinValue: TimeSpan.FromDays(p.Value);</from>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"     >return p == null || p.Length == 0? TimeSpan.MinValue: TimeSpan.FromTicks(ToInt64(p));</from>
+				<from type="Binary"     >return p == null || p.Length == 0? TimeSpan.MinValue: TimeSpan.FromTicks(ToInt64(p.ToArray()));</from>
+			</group>
+			<default nullvalue="Common.Configuration.NullableValues.TimeSpan"/>
+		</converter>
+		<converter type="Guid"     nullable="false">
+			<group name="Scalar Types.">
+				<from type="String"   >return p == null? Guid.Empty: new Guid(p);</from>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<from type="Guid"    >return p.HasValue? p.Value: Guid.Empty;</from>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlGuid"  >return p.IsNull? Guid.Empty: p.Value;            </from>
+				<from type="SqlString">return p.IsNull? Guid.Empty: new Guid(p.Value);  </from>
+				<from type="SqlBinary">return p.IsNull? Guid.Empty: p.ToSqlGuid().Value;</from>
+			</group>
+			<group name="Other Types.">
+				<from type="Byte[]"   >return p == null? Guid.Empty: new Guid(p);</from>
+				<from type="Binary"   >return p == null? Guid.Empty: new Guid(p.ToArray());</from>
+				<from type="Type"     >return p == null? Guid.Empty: p.GUID;</from>
+			</group>
+			<default nullvalue="Common.Configuration.NullableValues.Guid"/>
+		</converter>
+	</region>
+	<region name="Nullable Types">
+		<converter type="SByte"    nullable="true">
+			<group name="Scalar Types.">
+				<from type="SByte"  >return p;</from>
+				<from type="String" >return p == null? null: (SByte?)SByte.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean">return       (SByte?)(p? 1: 0);</from>
+				<default            >return      checked((SByte?)p);</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean">return p.HasValue? (SByte?)(p.Value? 1: 0):  null;</from>
+				<default            >return p.HasValue? checked((SByte?)p.Value): null;</default>
+			</group>
+			<group name="SqlTypes">
+				<include template ="SqlTypes"/>
+				<default              >return p.IsNull? null: ToNullableSByte(p.Value);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"   >return p == null || p.Length == 0? null: (SByte?)ToSByte(p);</from>
+				<from type="Binary"   >return p == null || p.Length == 0? null: (SByte?)ToSByte(p.ToArray());</from>
+			</group>
+			<default nullvalue="null">
+			if (p is IConvertible) return ((IConvertible)p).ToSByte(null);
+			</default>
+		</converter>
+		<converter type="Int16"    nullable="true">
+			<group name="Scalar Types.">
+				<from type="Int16"  >return p;</from>
+				<from type="String" >return p == null? null: (Int16?)Int16.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean">return       (Int16?)(p? 1: 0);</from>
+				<default            >return      checked((Int16?)p);</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean">return p.HasValue? (Int16?)(p.Value? 1: 0):  null;</from>
+				<default            >return p.HasValue? checked((Int16?)p.Value): null;</default>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlInt16" >return p.IsNull? null:         (Int16?)p.Value; </from>
+				<include template ="SqlTypes"/>
+				<default              >return p.IsNull? null: ToNullableInt16(p.Value);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"   >return p == null || p.Length == 0? null: (Int16?)ToInt16(p);</from>
+				<from type="Binary"   >return p == null || p.Length == 0? null: (Int16?)ToInt16(p.ToArray());</from>
+			</group>
+			<default nullvalue="null">
+			if (p is IConvertible) return ((IConvertible)p).ToInt16(null);
+			</default>
+		</converter>
+		<converter type="Int32"    nullable="true">
+			<group name="Scalar Types.">
+				<from type="Int32"  >return p;</from>
+				<from type="String" >return p == null? null: (Int32?)Int32.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean">return p? 1: 0;</from>
+				<default            >return checked((Int32?)p);</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean">return p.HasValue? (Int32?)(p.Value? 1: 0):  null;</from>
+				<default            >return p.HasValue? checked((Int32?)p.Value): null;</default>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlInt32" >return p.IsNull? null:         (Int32?)p.Value; </from>
+				<include template ="SqlTypes"/>
+				<default              >return p.IsNull? null: ToNullableInt32(p.Value);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"   >return p == null || p.Length == 0? null: (Int32?)ToInt32(p);</from>
+				<from type="Binary"   >return p == null || p.Length == 0? null: (Int32?)ToInt32(p.ToArray());</from>
+			</group>
+			<default nullvalue="null">
+			if (p is IConvertible) return ((IConvertible)p).ToInt32(null);
+			</default>
+		</converter>
+		<converter type="Int64"    nullable="true">
+			<group name="Scalar Types.">
+				<from type="Int64"   >return p;</from>
+				<from type="String"  >return p == null? null: (Int64?)Int64.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean" >return p? 1: 0;</from>
+				<from type="DateTime">return (p - DateTime.MinValue).Ticks;</from>
+				<from type="DateTimeOffset">return (p - DateTimeOffset.MinValue).Ticks;</from>
+				<from type="TimeSpan">return p.Ticks;</from>
+				<default             >return checked((Int64?)p);</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean">return p.HasValue? (Int64?)(p.Value? 1: 0):  null;</from>
+				<from type="DateTime">return p.HasValue? (Int64?)(p.Value - DateTime.MinValue).Ticks: null;</from>
+				<from type="DateTimeOffset">return p.HasValue? (Int64?)(p.Value - DateTimeOffset.MinValue).Ticks: null;</from>
+				<from type="TimeSpan">return p.HasValue? (Int64?)p.Value.Ticks: null;</from>
+				<default             >return p.HasValue? checked((Int64?)p.Value): null;</default>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlInt64">return p.IsNull? null:         (Int64?)p.Value; </from>
+				<include template ="SqlTypes"/>
+				<from type="SqlDateTime"/>
+				<default             >return p.IsNull? null: ToNullableInt64(p.Value);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"  >return p == null || p.Length == 0? null: (Int64?)ToInt64(p);</from>
+				<from type="Binary"  >return p == null || p.Length == 0? null: (Int64?)ToInt64(p.ToArray());</from>
+			</group>
+			<default nullvalue="null">
+			if (p is IConvertible) return ((IConvertible)p).ToInt64(null);
+			</default>
+		</converter>
+		<br/>
+		<converter type="Byte"    nullable="true">
+			<group name="Scalar Types.">
+				<from type="Byte"   >return p;</from>
+				<from type="String" >return p == null? null: (Byte?)Byte.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean">return       (Byte?)(p? 1: 0);</from>
+				<default            >return      checked((Byte?)p);</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean">return p.HasValue? (Byte?)(p.Value? 1: 0):  null;</from>
+				<default            >return p.HasValue? checked((Byte?)p.Value): null;</default>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlByte" >return p.IsNull? null:         (Byte?)p.Value; </from>
+				<include template ="SqlTypes"/>
+				<default             >return p.IsNull? null: ToNullableByte(p.Value);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"  >return p == null || p.Length == 0? null: (Byte?)ToByte(p);</from>
+				<from type="Binary"  >return p == null || p.Length == 0? null: (Byte?)ToByte(p.ToArray());</from>
+			</group>
+			<default nullvalue="null">
+			if (p is IConvertible) return ((IConvertible)p).ToByte(null);
+			</default>
+		</converter>
+		<converter type="UInt16"    nullable="true">
+			<group name="Scalar Types.">
+				<from type="UInt16" >return p;</from>
+				<from type="String" >return p == null? null: (UInt16?)UInt16.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean">return       (UInt16?)(p? 1: 0);</from>
+				<default            >return      checked((UInt16?)p);</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean">return p.HasValue? (UInt16?)(p.Value? 1: 0):  null;</from>
+				<default            >return p.HasValue? checked((UInt16?)p.Value): null;</default>
+			</group>
+			<group name="SqlTypes">
+				<include template ="SqlTypes"/>
+				<default            >return p.IsNull? null: ToNullableUInt16(p.Value);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]" >return p == null || p.Length == 0? null: (UInt16?)ToUInt16(p);</from>
+				<from type="Binary" >return p == null || p.Length == 0? null: (UInt16?)ToUInt16(p.ToArray());</from>
+			</group>
+			<default nullvalue="null">
+			if (p is IConvertible) return ((IConvertible)p).ToUInt16(null);
+			</default>
+		</converter>
+		<converter type="UInt32"    nullable="true">
+			<group name="Scalar Types.">
+				<from type="UInt32" >return p;</from>
+				<from type="String" >return p == null? null: (UInt32?)UInt32.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean">return       (UInt32?)(p? 1: 0);</from>
+				<default            >return      checked((UInt32?)p);</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean">return p.HasValue? (UInt32?)(p.Value? 1: 0):  null;</from>
+				<default            >return p.HasValue? checked((UInt32?)p.Value): null;</default>
+			</group>
+			<group name="SqlTypes">
+				<include template ="SqlTypes"/>
+				<default            >return p.IsNull? null: ToNullableUInt32(p.Value);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]" >return p == null || p.Length == 0? null: (UInt32?)ToUInt32(p);</from>
+				<from type="Binary" >return p == null || p.Length == 0? null: (UInt32?)ToUInt32(p.ToArray());</from>
+			</group>
+			<default nullvalue="null">
+			if (p is IConvertible) return ((IConvertible)p).ToUInt32(null);
+			</default>
+		</converter>
+		<converter type="UInt64"    nullable="true">
+			<group name="Scalar Types.">
+				<from type="UInt64" >return p;</from>
+				<from type="String" >return p == null? null: (UInt64?)UInt64.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean" >return (UInt64?)(p? 1: 0);</from>
+				<default             >return checked((UInt64?)p);</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean" >return p.HasValue? (UInt64?)(p.Value? 1: 0):  null;</from>
+				<default             >return p.HasValue? checked((UInt64?)p.Value): null;</default>
+			</group>
+			<group name="SqlTypes">
+				<include template ="SqlTypes"/>
+				<default             >return p.IsNull? null: ToNullableUInt64(p.Value);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"  >return p == null || p.Length == 0? null: (UInt64?)ToUInt64(p);</from>
+				<from type="Binary"  >return p == null || p.Length == 0? null: (UInt64?)ToUInt64(p.ToArray());</from>
+			</group>
+			<default nullvalue="null">
+			if (p is IConvertible) return ((IConvertible)p).ToUInt64(null);
+			</default>
+		</converter>
+		<br/>
+		<converter type="Char"     nullable="true">
+			<group name="Scalar Types.">
+				<from type="Char"  >return p;</from>
+				<from type="String">return p == null? null: (Char?)Char.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Boolean">return (Char?)(p? 1: 0);</from>
+				<default            >return checked((Char?)p);</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<include template ="Numeric Types"/>
+				<from type="Boolean"  >return p.HasValue?  (Char?)(p.Value? 1: 0): null;</from>
+				<default              >return p.HasValue? checked((Char?)p.Value): null;</default>
+			</group>
+			<group name="SqlTypes">
+				<include template ="SqlTypes"/>
+				<default               >return p.IsNull? null: ToNullableChar(p.Value);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"    >return p == null || p.Length == 0? null: (Char?)ToChar(p);</from>
+				<from type="Binary"    >return p == null || p.Length == 0? null: (Char?)ToChar(p.ToArray());</from>
+			</group>
+			<default nullvalue="null">
+			if (p is IConvertible) return ((IConvertible)p).ToChar(null);
+			</default>
+		</converter>
+		<converter type="Single"    nullable="true">
+			<group name="Scalar Types.">
+				<from type="Single" >return p;</from>
+				<from type="String" >return p == null? null: (Single?)Single.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean">return p? 1.0f: 0.0f;</from>
+				<default            >return checked((Single?)p);</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean">return p.HasValue? (Single?)(p.Value? 1.0f: 0.0f):  null;</from>
+				<default            >return p.HasValue? checked((Single?)p.Value): null;</default>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlSingle" >return p.IsNull? null:         (Single?)p.Value; </from>
+				<include template ="SqlTypes"/>
+				<default             >return p.IsNull? null: ToNullableSingle(p.Value);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"  >return p == null || p.Length == 0? null: (Single?)ToSingle(p);</from>
+				<from type="Binary"  >return p == null || p.Length == 0? null: (Single?)ToSingle(p.ToArray());</from>
+			</group>
+			<default nullvalue="null">
+			if (p is IConvertible) return ((IConvertible)p).ToSingle(null);
+			</default>
+		</converter>
+		<converter type="Double"    nullable="true">
+			<group name="Scalar Types.">
+				<from type="Double"   >return p;</from>
+				<from type="String"   >return p == null? null: (Double?)Double.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean"  >return p? 1.0: 0.0;</from>
+				<from type="DateTime" >return (p - DateTime.MinValue).TotalDays;</from>
+				<from type="DateTimeOffset" >return (p - DateTimeOffset.MinValue).TotalDays;</from>
+				<from type="TimeSpan" >return p.TotalDays;</from>
+				<default              >return checked((Double?)p);</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean"  >return p.HasValue? (Double?)(p.Value? 1.0: 0.0):  null;</from>
+				<from type="DateTime" >return p.HasValue? (Double?)(p.Value - DateTime.MinValue).TotalDays: null;</from>
+				<from type="DateTimeOffset" >return p.HasValue? (Double?)(p.Value - DateTimeOffset.MinValue).TotalDays: null;</from>
+				<from type="TimeSpan" >return p.HasValue? (Double?)p.Value.TotalDays: null;</from>
+				<default              >return p.HasValue? checked((Double?)p.Value): null;</default>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlDouble">return p.IsNull? null:         (Double?)p.Value; </from>
+				<include template ="SqlTypes"/>
+				<from type="SqlDateTime">return p.IsNull? null: (Double?)(p.Value - DateTime.MinValue).TotalDays;</from>
+				<default              >return p.IsNull? null: ToNullableDouble(p.Value);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"   >return p == null || p.Length == 0? null: (Double?)ToDouble(p);</from>
+				<from type="Binary"   >return p == null || p.Length == 0? null: (Double?)ToDouble(p.ToArray());</from>
+			</group>
+			<default nullvalue="null">
+			if (p is IConvertible) return ((IConvertible)p).ToDouble(null);
+			</default>
+		</converter>
+		<br/>
+		<converter type="Boolean"  nullable="true">
+			<group name="Scalar Types.">
+				<from type="Boolean"   >return p;</from>
+				<from type="String"    >return p == null? null: (Boolean?)Boolean.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"     />
+				<default               >return ToBoolean(p);</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<include template ="Numeric Types"/>
+				<from type="Char"     />
+				<default               >return p.HasValue? (Boolean?)ToBoolean(p.Value): null;</default>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlBoolean">return p.IsNull? null: (Boolean?)          p.Value; </from>
+				<include template ="SqlTypes"/>
+				<default               >return p.IsNull? null: (Boolean?)ToBoolean(p.Value);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"    >return p == null || p.Length == 0? null: (Boolean?)ToBoolean(p);</from>
+				<from type="Binary"    >return p == null || p.Length == 0? null: (Boolean?)ToBoolean(p.ToArray());</from>
+			</group>
+			<default nullvalue="null">
+			if (p is IConvertible) return ((IConvertible)p).ToBoolean(null);
+			</default>
+		</converter>
+		<converter type="Decimal"    nullable="true">
+			<group name="Scalar Types.">
+				<from type="Decimal" >return p;</from>
+				<from type="String" >return p == null? null: (Decimal?)Decimal.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean">return p? 1.0m: 0.0m;</from>
+				<default            >return checked((Decimal?)p);</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean">return p.HasValue? (Decimal?)(p.Value? 1.0m: 0.0m):  null;</from>
+				<default            >return p.HasValue? checked((Decimal?)p.Value): null;</default>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlDecimal">return p.IsNull? null:         (Decimal?)p.Value; </from>
+				<from type="SqlMoney"  >return p.IsNull? null:         (Decimal?)p.Value; </from>
+				<include template ="SqlTypes"/>
+				<default               >return p.IsNull? null: ToNullableDecimal(p.Value);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"    >return p == null || p.Length == 0? null: (Decimal?)ToDecimal(p);</from>
+				<from type="Binary"    >return p == null || p.Length == 0? null: (Decimal?)ToDecimal(p.ToArray());</from>
+			</group>
+			<default nullvalue="null">
+			if (p is IConvertible) return ((IConvertible)p).ToDecimal(null);
+			</default>
+		</converter>
+		<converter type="DateTime" nullable="true">
+			<group name="Scalar Types.">
+				<from type="DateTime">return p;</from>
+				<from type="DateTimeOffset">return p.LocalDateTime;</from>
+				<from type="String"  >return p == null? null: (DateTime?)DateTime.Parse(p);</from>
+				<br/>
+				<from type="TimeSpan" >return DateTime.MinValue + p;</from>
+				<from type="Int64"    >return DateTime.MinValue + TimeSpan.FromTicks(p);</from>
+				<from type="Double"   >return DateTime.MinValue + TimeSpan.FromDays(p);</from>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<from type="TimeSpan" >return p.HasValue? DateTime.MinValue +                           p.Value:  (DateTime?)null;</from>
+				<from type="Int64"    >return p.HasValue? DateTime.MinValue +        TimeSpan.FromTicks(p.Value): (DateTime?)null;</from>
+				<from type="Double"   >return p.HasValue? DateTime.MinValue + TimeSpan.FromDays(p.Value): (DateTime?)null;</from>
+				<from type="DateTimeOffset">return p.HasValue? p.Value.LocalDateTime: (DateTime?)null;</from>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlDateTime">return p.IsNull? (DateTime?)null:                                               p.Value; </from>
+				<from type="SqlString"  >return p.IsNull? (DateTime?)null:                                    ToDateTime(p.Value);</from>
+				<from type="SqlInt64"   >return p.IsNull? (DateTime?)null: DateTime.MinValue +        TimeSpan.FromTicks(p.Value);</from>
+				<from type="SqlDouble"  >return p.IsNull? (DateTime?)null: DateTime.MinValue + TimeSpan.FromDays(p.Value);</from>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"     >return p == null || p.Length == 0? null: (DateTime?)ToDateTime(p);</from>
+				<from type="Binary"     >return p == null || p.Length == 0? null: (DateTime?)ToDateTime(p.ToArray());</from>
+			</group>
+			<default nullvalue="null">
+			if (p is IConvertible) return ((IConvertible)p).ToDateTime(null);
+			</default>
+		</converter>
+		<converter type="DateTimeOffset" nullable="true">
+			<group name="Scalar Types.">
+				<from type="DateTime">return p;</from>
+				<from type="DateTimeOffset">return p;</from>
+				<from type="String"  >return p == null? null: (DateTimeOffset?)DateTimeOffset.Parse(p);</from>
+				<br/>
+				<from type="TimeSpan" >return DateTimeOffset.MinValue + p;</from>
+				<from type="Int64"    >return DateTimeOffset.MinValue + TimeSpan.FromTicks(p);</from>
+				<from type="Double"   >return DateTimeOffset.MinValue + TimeSpan.FromDays(p);</from>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<from type="TimeSpan" >return p.HasValue? DateTimeOffset.MinValue +                           p.Value:  (DateTimeOffset?)null;</from>
+				<from type="Int64"    >return p.HasValue? DateTimeOffset.MinValue +        TimeSpan.FromTicks(p.Value): (DateTimeOffset?)null;</from>
+				<from type="Double"   >return p.HasValue? DateTimeOffset.MinValue + TimeSpan.FromDays(p.Value): (DateTimeOffset?)null;</from>
+				<from type="DateTime">return p.HasValue? p: null;</from>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlDateTime">return p.IsNull? (DateTimeOffset?)null:                                               p.Value; </from>
+				<from type="SqlString"  >return p.IsNull? (DateTimeOffset?)null:                                    ToDateTimeOffset(p.Value);</from>
+				<from type="SqlInt64"   >return p.IsNull? (DateTimeOffset?)null: DateTimeOffset.MinValue +        TimeSpan.FromTicks(p.Value);</from>
+				<from type="SqlDouble"  >return p.IsNull? (DateTimeOffset?)null: DateTimeOffset.MinValue + TimeSpan.FromDays(p.Value);</from>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"     >return p == null || p.Length == 0? null: (DateTimeOffset?)ToDateTimeOffset(p);</from>
+				<from type="Binary"     >return p == null || p.Length == 0? null: (DateTimeOffset?)ToDateTimeOffset(p.ToArray());</from>
+			</group>
+			<default nullvalue="null">
+			if (p is IConvertible) return ToDateTimeOffset(((IConvertible)p).ToDateTime(null));
+			</default>
+		</converter>
+		<converter type="TimeSpan" nullable="true">
+			<group name="Scalar Types.">
+				<from type="TimeSpan"   >return p;</from>
+				<from type="String"     >return p == null? null: (TimeSpan?)TimeSpan.Parse(p);</from>
+				<from type="DateTime"   >return p - DateTime.MinValue;</from>
+				<from type="DateTimeOffset">return p - DateTimeOffset.MinValue;</from>
+				<from type="Int64"      >return TimeSpan.FromTicks(p);</from>
+				<from type="Double"     >return TimeSpan.FromDays(p);</from>
+			</group>
+
+			<group name="Nullable Types." nullable="true">
+				<from type="DateTime"   >return p.HasValue? p.Value - DateTime.MinValue: (TimeSpan?)null;</from>
+				<from type="DateTimeOffset"   >return p.HasValue? p.Value - DateTimeOffset.MinValue: (TimeSpan?)null;</from>
+				<from type="Int64"      >return p.HasValue? TimeSpan.FromTicks(p.Value): (TimeSpan?)null;</from>
+				<from type="Double"     >return p.HasValue? TimeSpan.FromDays(p.Value): (TimeSpan?)null;</from>
+			</group>
+
+			<group name="SqlTypes">
+				<from type="SqlString"  >return p.IsNull? (TimeSpan?)null: TimeSpan.Parse(p.Value);    </from>
+				<from type="SqlDateTime">return p.IsNull? (TimeSpan?)null: p.Value - DateTime.MinValue;</from>
+				<from type="SqlInt64"   >return p.IsNull? (TimeSpan?)null: TimeSpan.FromTicks(p.Value);</from>
+				<from type="SqlDouble"  >return p.IsNull? (TimeSpan?)null: TimeSpan.FromDays(p.Value);</from>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"     >return p == null || p.Length == 0? null: (TimeSpan?)ToTimeSpan(p);</from>
+				<from type="Binary"     >return p == null || p.Length == 0? null: (TimeSpan?)ToTimeSpan(p.ToArray());</from>
+			</group>
+			<default nullvalue="null"/>
+		</converter>
+		<converter type="Guid"     nullable="true">
+			<group name="Scalar Types.">
+				<from type="Guid"     >return p;</from>
+				<from type="String"   >return p == null? null: (Guid?)new Guid(p);</from>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlGuid"  >return p.IsNull? null: (Guid?)p.Value;            </from>
+				<from type="SqlString">return p.IsNull? null: (Guid?)new Guid(p.Value);  </from>
+				<from type="SqlBinary">return p.IsNull? null: (Guid?)p.ToSqlGuid().Value;</from>
+			</group>
+			<group name="Other Types.">
+				<from type="Type"     >return p == null? null: (Guid?)p.GUID;</from>
+				<from type="Byte[]"   >return p == null? null: (Guid?)new Guid(p);</from>
+				<from type="Binary"   >return p == null? null: (Guid?)new Guid(p.ToArray());</from>
+			</group>
+			<default nullvalue="null"/>
+		</converter>
+	</region>
+	<region name="SqlTypes">
+		<converter type="SqlString">
+			<group name="Scalar Types.">
+				<from type="String"   >return p ?? SqlString.Null;</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"    />
+				<from type="TimeSpan"/>
+				<from type="DateTime"/>
+				<from type="DateTimeOffset"/>
+				<from type="Guid"    />
+				<from type="Char[]"   >return new String(p);</from>
+				<default              >return p.ToString();</default>
+			</group>
+
+			<group name="Nullable Types." nullable="true">
+				<include template ="Numeric Types"/>
+				<from type="Char"    />
+				<from type="TimeSpan"/>
+				<from type="DateTime"/>
+				<from type="DateTimeOffset"/>
+				<from type="Guid"    />
+				<default              >return p.HasValue? p.ToString(): SqlString.Null;</default>
+			</group>
+
+			<group name="SqlTypes">
+				<include template="SqlTypes"/>
+				<from type="SqlChars"/>
+				<from type="SqlXml">return p.IsNull? SqlString.Null: p.Value;</from>
+				<from type="SqlGuid" />
+				<from type="SqlDateTime"/>
+				<default              >return p.ToSqlString();</default>
+			</group>
+			<group name="Other Types">
+				<from type="Type"       >return p == null? SqlString.Null: p.FullName;</from>
+				<from type="XmlDocument">return p == null? SqlString.Null: p.InnerXml;</from>
+				<from type="Byte[]"     >return p == null || p.Length == 0? SqlString.Null: new SqlString(ToString(p));</from>
+				<from type="Binary"     >return p == null || p.Length == 0? SqlString.Null: new SqlString(ToString(p.ToArray()));</from>
+			</group>
+			<default nullvalue="SqlString.Null" nothrow="true">
+			return ToString(p);</default>
+		</converter>
+		<br/>
+		<converter type="SqlByte">
+			<group name="Scalar Types.">
+				<from type="Byte"     >return p;</from>
+				<from type="String"   >return p == null? SqlByte.Null: SqlByte.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean"  >return (Byte)(p? 1: 0);</from>
+				<default              >return checked((Byte)p);</default>
+			</group>
+
+			<group name="Nullable Types." nullable="true">
+				<from type="Byte"     >return p.HasValue?        p.Value:  SqlByte.Null;</from>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<default              >return p.HasValue? ToByte(p.Value): SqlByte.Null;</default>
+			</group>
+
+			<group name="SqlTypes">
+				<include template="SqlTypes"/>
+				<from type="SqlDateTime">return p.IsNull? SqlByte.Null: ToByte(p.Value);</from>
+				<default              >return p.ToSqlByte();</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"   >return p == null || p.Length == 0? SqlByte.Null: new SqlByte(ToByte(p));</from>
+				<from type="Binary"   >return p == null || p.Length == 0? SqlByte.Null: new SqlByte(ToByte(p.ToArray()));</from>
+			</group>
+			<default nullvalue="SqlByte.Null" nothrow="true">
+			return ToByte(p);</default>
+		</converter>
+		<converter type="SqlInt16">
+			<group name="Scalar Types.">
+				<from type="Int16"    >return p;</from>
+				<from type="String"   >return p == null? SqlInt16.Null: SqlInt16.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean"  >return (Int16)(p? 1: 0);</from>
+				<default              >return checked((Int16)p);</default>
+			</group>
+
+			<group name="Nullable Types." nullable="true">
+				<from type="Int16"   >return p.HasValue?         p.Value:  SqlInt16.Null;</from>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<default             >return p.HasValue? ToInt16(p.Value): SqlInt16.Null;</default>
+			</group>
+
+			<group name="SqlTypes">
+				<include template="SqlTypes"/>
+				<from type="SqlDateTime">return p.IsNull? SqlInt16.Null: ToInt16(p.Value);</from>
+				<default                >return p.ToSqlInt16();</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"     >return p == null || p.Length == 0? SqlInt16.Null: new SqlInt16(ToInt16(p));</from>
+				<from type="Binary"     >return p == null || p.Length == 0? SqlInt16.Null: new SqlInt16(ToInt16(p.ToArray()));</from>
+			</group>
+			<default nullvalue="SqlInt16.Null" nothrow="true">
+			return ToInt16(p);</default>
+		</converter>
+		<converter type="SqlInt32">
+			<group name="Scalar Types.">
+				<from type="Int32"    >return p;</from>
+				<from type="String"   >return p == null? SqlInt32.Null: SqlInt32.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean"  >return p? 1: 0;</from>
+				<default              >return checked((Int32)p);</default>
+			</group>
+
+			<group name="Nullable Types." nullable="true">
+				<from type="Int32"   >return p.HasValue?         p.Value:  SqlInt32.Null;</from>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<default             >return p.HasValue? ToInt32(p.Value): SqlInt32.Null;</default>
+			</group>
+
+			<group name="SqlTypes">
+				<include template="SqlTypes"/>
+				<from type="SqlDateTime">return p.IsNull? SqlInt32.Null: ToInt32(p.Value);</from>
+				<default                >return p.ToSqlInt32();</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"     >return p == null || p.Length == 0? SqlInt32.Null: new SqlInt32(ToInt32(p));</from>
+				<from type="Binary"     >return p == null || p.Length == 0? SqlInt32.Null: new SqlInt32(ToInt32(p.ToArray()));</from>
+			</group>
+			<default nullvalue="SqlInt32.Null" nothrow="true">
+			return ToInt32(p);</default>
+		</converter>
+		<converter type="SqlInt64">
+			<group name="Scalar Types.">
+				<from type="Int64"    >return p;</from>
+				<from type="String"   >return p == null? SqlInt64.Null: SqlInt64.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean"  >return p? 1: 0;</from>
+				<from type="DateTime" >return (p - DateTime.MinValue).Ticks;</from>
+				<from type="DateTimeOffset" >return (p - DateTimeOffset.MinValue).Ticks;</from>
+				<from type="TimeSpan" >return p.Ticks;</from>
+				<default              >return checked((Int64)p);</default>
+			</group>
+
+			<group name="Nullable Types." nullable="true">
+				<from type="Int64"   >return p.HasValue?         p.Value:  SqlInt64.Null;</from>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="DateTime"/>
+				<from type="DateTimeOffset"/>
+				<from type="TimeSpan"/>
+				<default             >return p.HasValue? ToInt64(p.Value): SqlInt64.Null;</default>
+			</group>
+
+			<group name="SqlTypes">
+				<include template="SqlTypes"/>
+				<from type="SqlDateTime">return p.IsNull? SqlInt64.Null: ToInt64(p.Value);</from>
+				<default              >return p.ToSqlInt64();</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"   >return p == null || p.Length == 0? SqlInt64.Null: new SqlInt64(ToInt64(p));</from>
+				<from type="Binary"   >return p == null || p.Length == 0? SqlInt64.Null: new SqlInt64(ToInt64(p.ToArray()));</from>
+			</group>
+			<default nullvalue="SqlInt64.Null" nothrow="true">
+			return ToInt64(p);</default>
+		</converter>
+		<br/>
+		<converter type="SqlSingle">
+			<group name="Scalar Types.">
+				<from type="Single"   >return p;</from>
+				<from type="String"   >return p == null? SqlSingle.Null: SqlSingle.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean"  >return p? 1.0f: 0.0f;</from>
+				<default              >return checked((Single)p);</default>
+			</group>
+
+			<group name="Nullable Types." nullable="true">
+				<from type="Single"  >return p.HasValue?          p.Value:  SqlSingle.Null;</from>
+				<include template ="Numeric Types"/>
+				<default             >return p.HasValue? ToSingle(p.Value): SqlSingle.Null;</default>
+			</group>
+
+			<group name="SqlTypes">
+				<include template="SqlTypes"/>
+				<default              >return p.ToSqlSingle();</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"   >return p == null || p.Length == 0? SqlSingle.Null: new SqlSingle(ToSingle(p));</from>
+				<from type="Binary"   >return p == null || p.Length == 0? SqlSingle.Null: new SqlSingle(ToSingle(p.ToArray()));</from>
+			</group>
+			<default nullvalue="SqlSingle.Null" nothrow="true">
+			return ToSingle(p);</default>
+		</converter>
+		<converter type="SqlDouble">
+			<group name="Scalar Types.">
+				<from type="Double"   >return p;</from>
+				<from type="String"   >return p == null? SqlDouble.Null: SqlDouble.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean"  >return p? 1.0: 0.0;</from>
+				<from type="DateTime" >return (p - DateTime.MinValue).TotalDays;</from>
+				<from type="DateTimeOffset" >return (p - DateTimeOffset.MinValue).TotalDays;</from>
+				<from type="TimeSpan" >return p.TotalDays;</from>
+				<default              >return checked((Double)p);</default>
+			</group>
+
+			<group name="Nullable Types." nullable="true">
+				<from type="Double"  >return p.HasValue?          p.Value:  SqlDouble.Null;</from>
+				<include template ="Numeric Types"/>
+				<from type="DateTime"/>
+				<from type="DateTimeOffset"/>
+				<from type="TimeSpan"/>
+				<default             >return p.HasValue? ToDouble(p.Value): SqlDouble.Null;</default>
+			</group>
+
+			<group name="SqlTypes">
+				<include template="SqlTypes"/>
+				<from type="SqlDateTime">return p.IsNull? SqlDouble.Null: ToDouble(p.Value);</from>
+				<default              >return p.ToSqlDouble();</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"   >return p == null || p.Length == 0? SqlDouble.Null: new SqlDouble(ToDouble(p));</from>
+				<from type="Binary"   >return p == null || p.Length == 0? SqlDouble.Null: new SqlDouble(ToDouble(p.ToArray()));</from>
+			</group>
+			<default nullvalue="SqlDouble.Null" nothrow="true">
+			return ToDouble(p);</default>
+		</converter>
+		<converter type="SqlDecimal">
+			<group name="Scalar Types.">
+				<from type="Decimal"  >return p;</from>
+				<from type="String"   >return p == null? SqlDecimal.Null: SqlDecimal.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean"  >return p? 1.0m: 0.0m;</from>
+				<default              >return checked((Decimal)p);</default>
+			</group>
+
+			<group name="Nullable Types." nullable="true">
+				<from type="Decimal" >return p.HasValue?           p.Value:  SqlDecimal.Null;</from>
+				<include template ="Numeric Types"/>
+				<default             >return p.HasValue? ToDecimal(p.Value): SqlDecimal.Null;</default>
+			</group>
+
+			<group name="SqlTypes">
+				<include template="SqlTypes"/>
+				<default              >return p.ToSqlDecimal();</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"   >return p == null || p.Length == 0? SqlDecimal.Null: new SqlDecimal(ToDecimal(p));</from>
+				<from type="Binary"   >return p == null || p.Length == 0? SqlDecimal.Null: new SqlDecimal(ToDecimal(p.ToArray()));</from>
+			</group>
+			<default nullvalue="SqlDecimal.Null" nothrow="true">
+			return ToDecimal(p);</default>
+		</converter>
+		<converter type="SqlMoney">
+			<group name="Scalar Types.">
+				<from type="Decimal"  >return p;</from>
+				<from type="String"   >return p == null? SqlMoney.Null: SqlMoney.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="Boolean"  >return p? 1.0m: 0.0m;</from>
+				<default              >return checked((Decimal)p);</default>
+			</group>
+
+			<group name="Nullable Types." nullable="true">
+				<from type="Decimal" >return p.HasValue?           p.Value:  SqlMoney.Null;</from>
+				<include template ="Numeric Types"/>
+				<default             >return p.HasValue? ToDecimal(p.Value): SqlMoney.Null;</default>
+			</group>
+
+			<group name="SqlTypes">
+				<include template="SqlTypes"/>
+				<default              >return p.ToSqlMoney();</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"   >return p == null || p.Length == 0? SqlMoney.Null: new SqlMoney(ToDecimal(p));</from>
+				<from type="Binary"   >return p == null || p.Length == 0? SqlMoney.Null: new SqlMoney(ToDecimal(p.ToArray()));</from>
+			</group>
+			<default nullvalue="SqlMoney.Null" nothrow="true">
+			return ToDecimal(p);</default>
+		</converter>
+		<br/>
+		<converter type="SqlBoolean">
+			<group name="Scalar Types.">
+				<from type="Boolean"  >return p;</from>
+				<from type="String"   >return p == null? SqlBoolean.Null: SqlBoolean.Parse(p);</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<default              >return p != 0;</default>
+			</group>
+
+			<group name="Nullable Types." nullable="true">
+				<from type="Boolean" >return p.HasValue?           p.Value:  SqlBoolean.Null;</from>
+				<include template ="Numeric Types"/>
+				<from type="Char"   />
+				<default             >return p.HasValue? ToBoolean(p.Value): SqlBoolean.Null;</default>
+			</group>
+
+			<group name="SqlTypes">
+				<include template="SqlTypes"/>
+				<default              >return p.ToSqlBoolean();</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"   >return p == null || p.Length == 0? SqlBoolean.Null: new SqlBoolean(ToBoolean(p));</from>
+				<from type="Binary"   >return p == null || p.Length == 0? SqlBoolean.Null: new SqlBoolean(ToBoolean(p.ToArray()));</from>
+			</group>
+			<default nullvalue="SqlBoolean.Null" nothrow="true">
+			return ToBoolean(p);</default>
+		</converter>
+		<converter type="SqlDateTime">
+			<group name="Scalar Types.">
+				<from type="String"   >return p == null? SqlDateTime.Null: SqlDateTime.Parse(p);</from>
+				<from type="DateTime" >return p;</from>
+				<from type="DateTimeOffset" >return p.LocalDateTime;</from>
+				<from type="TimeSpan"/>
+				<from type="Int64"/>
+				<from type="Double"/>
+				<default              >return ToDateTime(p);</default>
+			</group>
+
+			<group name="Nullable Types." nullable="true">
+				<from type="DateTime">return p.HasValue?            p.Value:  SqlDateTime.Null;</from>
+				<from type="DateTimeOffset">return p.HasValue?            p.Value.LocalDateTime:  SqlDateTime.Null;</from>
+				<from type="TimeSpan"/>
+				<from type="Int64"/>
+				<from type="Double"/>
+				<default             >return p.HasValue? ToDateTime(p.Value): SqlDateTime.Null;</default>
+			</group>
+
+			<group name="SqlTypes">
+				<from type="SqlString">return p.ToSqlDateTime();</from>
+				<from type="SqlInt64"/>
+				<from type="SqlDouble"/>
+				<default              >return p.IsNull? SqlDateTime.Null: ToDateTime(p);</default>
+			</group>
+			<group name="Other Types">
+				<from type="Byte[]"   >return p == null || p.Length == 0? SqlDateTime.Null: new SqlDateTime(ToDateTime(p));</from>
+				<from type="Binary"   >return p == null || p.Length == 0? SqlDateTime.Null: new SqlDateTime(ToDateTime(p.ToArray()));</from>
+			</group>
+			<default nullvalue="SqlDateTime.Null" nothrow="true">
+			return ToDateTime(p);</default>
+		</converter>
+		<converter type="SqlGuid">
+			<group name="Scalar Types.">
+				<from type="Guid"     >return p;</from>
+				<from type="String"   >return p == null? SqlGuid.Null: SqlGuid.Parse(p);</from>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<from type="Guid"    >return p.HasValue? p.Value: SqlGuid.Null;</from>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlBinary"/>
+				<from type="SqlBytes" >return p.ToSqlBinary().ToSqlGuid();</from>
+				<from type="SqlString"/>
+				<default              >return p.ToSqlGuid();</default>
+			</group>
+			<group name="Other Types.">
+				<from type="Type"         >return p == null? SqlGuid.Null: p.GUID;</from>
+				<from type="Byte[]"       >return p == null? SqlGuid.Null: new SqlGuid(p);</from>
+				<from type="Binary"       >return p == null? SqlGuid.Null: new SqlGuid(p.ToArray());</from>
+			</group>
+			<default nullvalue="SqlGuid.Null" nothrow="true">
+			return ToGuid(p);</default>
+		</converter>
+		<converter type="SqlBinary">
+			<group name="Scalar Types.">
+				<from type="Byte[]"   >return p;</from>
+				<from type="Binary"   >return p.ToArray();</from>
+				<from type="Guid"     >return p == Guid.Empty? SqlBinary.Null: new SqlGuid(p).ToSqlBinary();</from>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<from type="Guid"    >return p.HasValue? new SqlGuid(p.Value).ToSqlBinary(): SqlBinary.Null;</from>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlBytes"/>
+				<from type="SqlGuid"/>
+				<default              >return p.ToSqlBinary();</default>
+			</group>
+			<default nullvalue="SqlBinary.Null" nothrow="true">
+			return ToByteArray(p);</default>
+		</converter>
+		<converter type="SqlBytes">
+			<group name="Scalar Types.">
+				<from type="Byte[]" >return p == null? SqlBytes.Null: new SqlBytes(p);</from>
+				<from type="Binary" >return p == null? SqlBytes.Null: new SqlBytes(p.ToArray());</from>
+				<from type="Stream" >return p == null? SqlBytes.Null: new SqlBytes(p);</from>
+				<from type="Guid"   >return p == Guid.Empty? SqlBytes.Null: new SqlBytes(p.ToByteArray());</from>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<from type="Guid"   >return p.HasValue? new SqlBytes(p.Value.ToByteArray()): SqlBytes.Null;</from>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlBinary">return p.IsNull? SqlBytes.Null: new SqlBytes(p);</from>
+				<from type="SqlGuid"  >return p.IsNull? SqlBytes.Null: new SqlBytes(p.ToByteArray());</from>
+			</group>
+			<default nullvalue="SqlBytes.Null" nothrow="true">
+			return new SqlBytes(ToByteArray(p));</default>
+		</converter>
+		<converter type="SqlChars">
+			<group name="Scalar Types.">
+				<from type="String">return p == null? SqlChars.Null: new SqlChars(p.ToCharArray());</from>
+				<from type="Char[]">return p == null? SqlChars.Null: new SqlChars(p);</from>
+				<from type="Byte[]">return p == null? SqlChars.Null: new SqlChars(ToCharArray(p));</from>
+				<from type="Binary">return p == null? SqlChars.Null: new SqlChars(ToCharArray(p.ToArray()));</from>
+				<br/>
+				<include template ="Numeric Types"/>
+				<from type="Char"/>
+				<from type="TimeSpan"/>
+				<from type="DateTime"/>
+				<from type="DateTimeOffset"/>
+				<from type="Guid"    />
+				<default>return new SqlChars(ToString(p).ToCharArray());</default>
+			</group>
+
+			<group name="Nullable Types." nullable="true">
+				<include template ="Numeric Types"/>
+				<from type="Char"     >return p.HasValue? new SqlChars(new Char[]{p.Value})       : SqlChars.Null;</from>
+				<from type="TimeSpan"/>
+				<from type="DateTime"/>
+				<from type="DateTimeOffset"/>
+				<from type="Guid"    />
+				<default              >return p.HasValue? new SqlChars(p.ToString().ToCharArray()): SqlChars.Null;</default>
+			</group>
+
+			<group name="SqlTypes">
+				<from type="SqlString">return (SqlChars)p;</from>
+				<include template="SqlTypes"/>
+				<from type="SqlGuid" />
+				<from type="SqlDateTime" />
+				<from type="SqlBinary">return p.IsNull? SqlChars.Null: new SqlChars(p.ToString().ToCharArray());</from>
+				<default              >return (SqlChars)p.ToSqlString();</default>
+			</group>
+			<from type="Type"         >return p == null? SqlChars.Null: new SqlChars(p.FullName.ToCharArray());</from>
+			<default nullvalue="SqlChars.Null" nothrow="true">
+			return new SqlChars(ToString(p).ToCharArray());</default>
+		</converter>
+		<converter type="SqlXml">
+			<group name="Scalar Types.">
+				<from type="String"    >return p == null? SqlXml.Null: new SqlXml(new XmlTextReader(new StringReader(p)));</from>
+				<br/>
+				<from type="Stream"   />
+				<from type="XmlReader"/>
+				<from type="XmlDocument">return p == null? SqlXml.Null: new SqlXml(new XmlTextReader(new StringReader(p.InnerXml)));</from>
+				<br/>
+				<from type="Char[]"    >return p == null? SqlXml.Null: new SqlXml(new XmlTextReader(new StringReader(new string(p))));</from>
+				<from type="Byte[]"    >return p == null? SqlXml.Null: new SqlXml(new MemoryStream(p));</from>
+				<from type="Binary"    >return p == null? SqlXml.Null: new SqlXml(new MemoryStream(p.ToArray()));</from>
+				<default               >return p == null? SqlXml.Null: new SqlXml(p);</default>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlString">return p.IsNull? SqlXml.Null: new SqlXml(new XmlTextReader(new StringReader(p.Value)));</from>
+				<from type="SqlChars" >return p.IsNull? SqlXml.Null: new SqlXml(new XmlTextReader(new StringReader(p.ToSqlString().Value)));</from>
+				<from type="SqlBinary">return p.IsNull? SqlXml.Null: new SqlXml(new MemoryStream(p.Value));</from>
+				<from type="SqlBytes" >return p.IsNull? SqlXml.Null: new SqlXml(p.Stream);</from>
+			</group>
+			<default nullvalue="SqlXml.Null"/>
+		</converter>
+	</region>
+	<region name="Other Types">
+		<converter type="Type">
+			<group name="Scalar Types.">
+				<from type="String"   >return p == null?       null: Type.GetType(p);                  </from>
+				<from type="Char[]"   >return p == null?       null: Type.GetType(new string(p));      </from>
+				<from type="Byte[]"   >return p == null?       null: Type.GetTypeFromCLSID(ToGuid(p)); </from>
+				<from type="Binary"   >return p == null?       null: Type.GetTypeFromCLSID(ToGuid(p.ToArray())); </from>
+				<from type="Guid"     >return p == Guid.Empty? null: Type.GetTypeFromCLSID(p);         </from>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<from type="Guid"     >return p.HasValue? Type.GetTypeFromCLSID(p.Value): null;</from>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlString">return p.IsNull       ? null: Type.GetType(p.Value);            </from>
+				<from type="SqlChars" >return p.IsNull       ? null: Type.GetType(new string(p.Value));</from>
+				<from type="SqlGuid"  >return p.IsNull       ? null: Type.GetTypeFromCLSID(p.Value);   </from>
+			</group>
+			<default nullvalue="null"/>
+		</converter>
+		<converter type="Stream">
+			<group name="Scalar Types.">
+				<from type="Guid"     >return p == Guid.Empty? Stream.Null: new MemoryStream(p.ToByteArray());</from>
+				<from type="Byte[]"   >return p == null? Stream.Null: new MemoryStream(p);</from>
+				<from type="Binary"   >return p == null? Stream.Null: new MemoryStream(p.ToArray());</from>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<from type="Guid"     >return p.HasValue? new MemoryStream(p.Value.ToByteArray()): Stream.Null;</from>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlBytes" >return p.IsNull? Stream.Null: p.Stream;                 </from>
+				<from type="SqlBinary">return p.IsNull? Stream.Null: new MemoryStream(p.Value);</from>
+				<from type="SqlGuid"  >return p.IsNull? Stream.Null: new MemoryStream(p.Value.ToByteArray());</from>
+			</group>
+			<default nullvalue="Stream.Null"/>
+		</converter>
+		
+		<converter type="Byte[]" name="ByteArray">
+			<group name="Scalar Types.">
+				<from type="String" >return p == null? null: System.Text.Encoding.UTF8.GetBytes(p);</from>
+				<from type="Byte"   >return new byte[]{p};</from>
+				<from type="SByte"  >return new byte[]{checked((Byte)p)};</from>
+				<from type="Decimal">
+			int[]  bits  = Decimal.GetBits(p);
+			Byte[] bytes = new Byte[Buffer.ByteLength(bits)];
+
+			Buffer.BlockCopy(bits, 0, bytes, 0, bytes.Length);
+			return bytes;</from>
+				<include template="Numeric Types"/>
+				<from type="Char" />
+				<from type="DateTime"   >return ToByteArray(p.ToBinary());</from>
+				<from type="DateTimeOffset"   >return ToByteArray(p.LocalDateTime.ToBinary());</from>
+				<from type="TimeSpan"   >return ToByteArray(p.Ticks);</from>
+				<from type="Stream" >
+			if (p == null)         return null;
+			if (p is MemoryStream) return ((MemoryStream)p).ToArray();
+
+			long   position = p.Seek(0, SeekOrigin.Begin);
+			Byte[] bytes = new Byte[p.Length];
+			p.Read(bytes, 0, bytes.Length);
+			p.Position = position;
+
+			return bytes;</from>
+				<from type="Char[]" >
+			Byte[] bytes = new Byte[Buffer.ByteLength(p)];
+
+			Buffer.BlockCopy(p, 0, bytes, 0, bytes.Length);
+			return bytes;</from>
+				<from type="Guid"   >return p == Guid.Empty? null: p.ToByteArray();</from>
+				<from type="Binary" >return p == null? null: p.ToArray();</from>
+				<default            >return BitConverter.GetBytes(p);</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<include template="Numeric Types"/>
+				<from type="Char" />
+				<from type="DateTime" />
+				<from type="DateTimeOffset" />
+				<from type="TimeSpan" />
+				<from type="Guid"     />
+				<default              >return p.HasValue? ToByteArray(p.Value): null;</default>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlBinary">return p.IsNull? null: p.Value;</from>
+				<from type="SqlBytes" >return p.IsNull? null: p.Value;</from>
+				<from type="SqlGuid"  >return p.IsNull? null: p.ToByteArray();</from>
+				<include template="SqlTypes"/>
+				<default              >return p.IsNull? null: ToByteArray(p.Value);</default>
+			</group>
+			<default nullvalue="null"/>
+		</converter>
+
+		<converter type="Binary" name="LinqBinary">
+			<group name="Scalar Types.">
+				<from type="String" >return p == null? null: new Binary(System.Text.Encoding.UTF8.GetBytes(p));</from>
+				<from type="Byte"   >return new Binary(new byte[]{p});</from>
+				<from type="SByte"  >return new Binary(new byte[]{checked((Byte)p)});</from>
+				<from type="Decimal">
+					int[]  bits  = Decimal.GetBits(p);
+					Byte[] bytes = new Byte[Buffer.ByteLength(bits)];
+
+					Buffer.BlockCopy(bits, 0, bytes, 0, bytes.Length);
+					return new Binary(bytes);
+				</from>
+				<include template="Numeric Types"/>
+				<from type="Char" />
+				<from type="DateTime"   >return new Binary(ToByteArray(p.ToBinary()));</from>
+				<from type="DateTimeOffset"   >return new Binary(ToByteArray(p.LocalDateTime.ToBinary()));</from>
+				<from type="TimeSpan"   >return new Binary(ToByteArray(p.Ticks));</from>
+				<from type="Stream" >
+					if (p == null)         return null;
+					if (p is MemoryStream) return ((MemoryStream)p).ToArray();
+
+					long   position = p.Seek(0, SeekOrigin.Begin);
+					Byte[] bytes = new Byte[p.Length];
+					p.Read(bytes, 0, bytes.Length);
+					p.Position = position;
+
+					return new Binary(bytes);
+				</from>
+				<from type="Char[]" >
+					Byte[] bytes = new Byte[Buffer.ByteLength(p)];
+
+					Buffer.BlockCopy(p, 0, bytes, 0, bytes.Length);
+					return new Binary(bytes);
+				</from>
+				<from type="Guid"   >return p == Guid.Empty? null: new Binary(p.ToByteArray());</from>
+				<from type="Byte[]" >return p == null? null: new Binary(p);</from>
+				<default            >return new Binary(BitConverter.GetBytes(p));</default>
+			</group>
+			<group name="Nullable Types." nullable="true">
+				<include template="Numeric Types"/>
+				<from type="Char" />
+				<from type="DateTime" />
+				<from type="DateTimeOffset" />
+				<from type="TimeSpan" />
+				<from type="Guid"     />
+				<default              >return p.HasValue? new Binary(ToByteArray(p.Value)): null;</default>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlBinary">return p.IsNull? null: new Binary(p.Value);</from>
+				<from type="SqlBytes" >return p.IsNull? null: new Binary(p.Value);</from>
+				<from type="SqlGuid"  >return p.IsNull? null: new Binary(p.ToByteArray());</from>
+				<include template="SqlTypes"/>
+				<default              >return p.IsNull? null: new Binary(ToByteArray(p.Value));</default>
+			</group>
+			<default nullvalue="null"/>
+		</converter>
+
+		<converter type="Char[]" name="CharArray">
+			<group name="Scalar Types.">
+				<from type="String" >return p == null? null: p.ToCharArray();</from>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlString" >return p.IsNull? null: p.Value.ToCharArray();</from>
+				<from type="SqlChars"  >return p.IsNull? null: p.Value;</from>
+			</group>
+			<from type="Byte[]" >
+				if (p == null) return null;
+
+				Char[] chars = new Char[p.Length / sizeof(Char)];
+
+				Buffer.BlockCopy(p, 0, chars, 0, p.Length);
+				return chars;
+			</from>
+			<from type="Binary" >
+				if (p == null) return null;
+
+				Char[] chars = new Char[p.Length / sizeof(Char)];
+
+				Buffer.BlockCopy(p.ToArray(), 0, chars, 0, p.Length);
+				return chars;
+			</from>
+			<default nullvalue="null" nothrow="true">
+			return ToString(p).ToCharArray();</default>
+		</converter>
+		<converter type="XmlReader">
+			<group name="Scalar Types.">
+				<from type="String"    >return p == null? null: new XmlTextReader(new StringReader(p));</from>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlXml"   >return p.IsNull? null: p.CreateReader();</from>
+				<from type="SqlString">return p.IsNull? null: new XmlTextReader(new StringReader(p.Value));</from>
+				<from type="SqlChars" >return p.IsNull? null: new XmlTextReader(new StringReader(p.ToSqlString().Value));</from>
+				<from type="SqlBinary">return p.IsNull? null: new XmlTextReader(new MemoryStream(p.Value));</from>
+				<default              >return p.IsNull? null: new XmlTextReader(p.Value);</default>
+			</group>
+			<group name="Other Types.">
+				<from type="Stream"   />
+				<from type="TextReader" nick="TR"/>
+				<from type="XmlDocument">return p == null? null: new XmlTextReader(new StringReader(p.InnerXml));</from>
+				<br/>
+				<from type="Char[]"     >return p == null? null: new XmlTextReader(new StringReader(new string(p)));</from>
+				<from type="Byte[]"     >return p == null? null: new XmlTextReader(new MemoryStream(p));</from>
+				<from type="Binary"     >return p == null? null: new XmlTextReader(new MemoryStream(p.ToArray()));</from>
+				<default                >return p == null? null: new XmlTextReader(p);</default>
+			</group>
+			<default nullvalue="null"/>
+		</converter>
+		<converter type="XmlDocument">
+			<group name="Scalar Types.">
+				<from type="String"    >
+			if (string.IsNullOrEmpty(p)) return null;
+
+			XmlDocument doc = new XmlDocument();
+			doc.LoadXml(p);
+			return doc;</from>
+			</group>
+			<group name="SqlTypes">
+				<from type="SqlString"/>
+				<from type="SqlXml"   />
+				<from type="SqlChars" >return p.IsNull? null: ToXmlDocument(p.ToSqlString().Value);</from>
+				<from type="SqlBinary">return p.IsNull? null: ToXmlDocument(new MemoryStream(p.Value));</from>
+				<default              >return p.IsNull? null: ToXmlDocument(p.Value);</default>
+			</group>
+			<group name="Other Types.">
+				<from type="Stream"   />
+				<from type="TextReader" nick="TR"/>
+				<from type="XmlReader"/>
+				<br/>
+				<from type="Char[]"     >return p == null || p.Length == 0? null: ToXmlDocument(new string(p));</from>
+				<from type="Byte[]"     >return p == null || p.Length == 0? null: ToXmlDocument(new MemoryStream(p));</from>
+				<from type="Binary"     >return p == null || p.Length == 0? null: ToXmlDocument(new MemoryStream(p.ToArray()));</from>
+				<default                >
+					if (p == null) return null;
+
+					XmlDocument doc = new XmlDocument();
+					doc.Load(p);
+					return doc;
+				</default>
+			</group>
+			<default nullvalue="null"/>
+		</converter>
+	</region>
+</code>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/CodeGenerator/Convert.xslt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,812 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+	<xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>
+
+	<!-- parameters passed in by the TransformCodeGenerator -->
+	<xsl:param name="generator"></xsl:param>
+	<xsl:param name="version"></xsl:param>
+	<xsl:param name="filename"></xsl:param>
+	<xsl:param name="date-created"></xsl:param>
+	<xsl:param name="created-by"></xsl:param>
+	<xsl:param name="namespace"></xsl:param>
+	<xsl:param name="output"></xsl:param>
+
+	<!-- support variables -->
+	<xsl:variable name="lf" xml:space="preserve">&#13;</xsl:variable>
+	<xsl:variable name="t1" xml:space="preserve">&#9;</xsl:variable>
+	<xsl:variable name="t2" xml:space="preserve">&#9;&#9;</xsl:variable>
+	<xsl:variable name="t3" xml:space="preserve">&#9;&#9;&#9;</xsl:variable>
+	<xsl:variable name="t4" xml:space="preserve">&#9;&#9;&#9;&#9;</xsl:variable>
+	<xsl:variable name="t5" xml:space="preserve">&#9;&#9;&#9;&#9;&#9;</xsl:variable>
+	<xsl:variable name="t6" xml:space="preserve">&#9;&#9;&#9;&#9;&#9;&#9;</xsl:variable>
+	<xsl:variable name="t7" xml:space="preserve">&#9;&#9;&#9;&#9;&#9;&#9;&#9;</xsl:variable>
+	<xsl:variable name="t8" xml:space="preserve">&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;</xsl:variable>
+	<xsl:variable name="s1" xml:space="preserve">&#32;</xsl:variable>
+	<xsl:variable name="s2" xml:space="preserve">&#32;&#32;</xsl:variable>
+	<xsl:variable name="s3" xml:space="preserve">&#32;&#32;&#32;</xsl:variable>
+	<xsl:variable name="s4" xml:space="preserve">&#32;&#32;&#32;&#32;</xsl:variable>
+	<xsl:variable name="s5" xml:space="preserve">&#32;&#32;&#32;&#32;&#32;</xsl:variable>
+	<xsl:variable name="s6" xml:space="preserve">&#32;&#32;&#32;&#32;&#32;&#32;</xsl:variable>
+	<xsl:variable name="s7" xml:space="preserve">&#32;&#32;&#32;&#32;&#32;&#32;&#32;</xsl:variable>
+	<xsl:variable name="s8" xml:space="preserve">&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;</xsl:variable>
+
+	<!-- customization -->
+	<xsl:variable name="methodname"     select="'To'"/>
+
+	<xsl:variable name="padding"        select="string-length('DateTimeOffset?')"/>
+	<xsl:variable name="objectpad"      select="$padding - string-length('object')"/>
+
+	<!-- the root of all evil -->
+	<xsl:template match="/">
+		<!--<xsl:call-template name="header-comment"/>-->
+		<xsl:apply-templates select="code"/>
+	</xsl:template>
+
+	<xsl:template name="header-comment">
+		<xsl:value-of select="$lf"/>
+		<xsl:text>#region Generated File</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:text>/*</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:text> * GENERATED FILE -- DO NOT EDIT</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:text> *</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:text> * Generator: </xsl:text>
+		<xsl:value-of select="$generator"/>
+		<xsl:value-of select="$lf"/>
+		<xsl:text> * Version:   </xsl:text>
+		<xsl:value-of select="$version"/>
+		<xsl:value-of select="$lf"/>
+		<xsl:text> *</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:text> *</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:text> * Generated code from "</xsl:text>
+		<xsl:value-of select="$filename"/>
+		<xsl:text>"</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:text> *</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:text> * Created: </xsl:text>
+		<xsl:value-of select="$date-created"/>
+		<xsl:value-of select="$lf"/>
+		<xsl:text> * By:      </xsl:text>
+		<xsl:value-of select="$created-by"/>
+		<xsl:value-of select="$lf"/>
+		<xsl:text> *</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:text> */</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:text>#endregion</xsl:text>
+		<xsl:value-of select="$lf"/>
+	</xsl:template>
+
+	<xsl:template match="code">
+		<xsl:apply-templates select="using|br"/>
+		<xsl:value-of select="$lf"/>
+		<xsl:text>namespace </xsl:text>
+		<xsl:value-of select="$namespace"/>
+		<xsl:value-of select="$lf"/>
+		<xsl:text>{</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:call-template name="class"/>
+		<xsl:text>}</xsl:text>
+		<xsl:value-of select="$lf"/>
+	</xsl:template>
+
+	<xsl:template match="using">
+    <xsl:if test="@condition">
+      <xsl:text>#if </xsl:text>
+      <xsl:value-of select="@condition"/>
+      <xsl:value-of select="$lf"/>
+    </xsl:if>
+    <xsl:text>using </xsl:text>
+		<xsl:value-of select="@namespace"/>
+		<xsl:text>;</xsl:text>
+    <xsl:if test="@condition">
+      <xsl:value-of select="$lf"/>
+      <xsl:text>#endif</xsl:text>
+    </xsl:if>
+    <xsl:value-of select="$lf"/>
+	</xsl:template>
+
+	<!-- the class definition -->
+	<xsl:template name="class">
+		<xsl:value-of select="$t1"/>
+		<xsl:text>/// &lt;summary&gt;Converts a base data type to another base data type.&lt;/summary&gt;</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:value-of select="$t1"/>
+		<xsl:text>public class Convert</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:value-of select="$t1"/>
+		<xsl:text>{</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:value-of select="$lf"/>
+		<xsl:apply-templates select="converter|comment"/>
+		<xsl:apply-templates select="region"/>
+
+		<xsl:value-of select="$lf"/>
+		<xsl:value-of select="$t2"/>
+		<xsl:text>private static Exception CreateInvalidCastException(Type originalType, Type conversionType)</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:value-of select="$t2"/>
+		<xsl:text>{</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:value-of select="$t3"/>
+		<xsl:text>return new InvalidCastException(string.Format(</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:value-of select="$t4"/>
+		<xsl:text>Resources.Convert_InvalidCast, originalType.FullName, conversionType.FullName));</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:value-of select="$t2"/>
+		<xsl:text>}</xsl:text>
+		<xsl:value-of select="$lf"/>
+
+		<xsl:value-of select="$t1"/>
+		<xsl:text>}</xsl:text>
+		<xsl:value-of select="$lf"/>
+	</xsl:template>
+
+	<!-- region -->
+	<xsl:template match="region">
+		<xsl:value-of select="$t2"/>
+		<xsl:text>#region </xsl:text>
+		<xsl:value-of select="@name"/>
+		<xsl:value-of select="$lf"/>
+		<xsl:value-of select="$lf"/>
+		<xsl:apply-templates select="converter|comment"/>
+		<xsl:apply-templates select="region"/>
+		<xsl:value-of select="$t2"/>
+		<xsl:text>#endregion</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:value-of select="$lf"/>
+	</xsl:template>
+
+	<!-- declarations -->
+	<xsl:template match="converter">
+		<xsl:variable name="tonullable" select="@nullable='true'"/>
+		<xsl:variable name="fulltype">
+			<xsl:value-of select="@type"/>
+			<xsl:if test="$tonullable">
+				<xsl:text>?</xsl:text>
+			</xsl:if>
+		</xsl:variable>
+		<xsl:variable name="typepad" select="$padding - string-length($fulltype)"/>
+		<xsl:variable name="notclscompliant" select="/code/type[@name=current()/@type]/@clscompliant='false'"/>
+		<xsl:variable name="condition" select="/code/type[@name=current()/@type]/@condition"/>
+
+		<xsl:if test="$condition">
+			<xsl:value-of select="$t2"/>
+			<xsl:text>#if </xsl:text>
+			<xsl:value-of select="$condition"/>
+			<xsl:value-of select="$lf"/>
+		</xsl:if>
+
+		<xsl:value-of select="$t2"/>
+		<xsl:text>#region </xsl:text>
+		<xsl:value-of select="$fulltype"/>
+		<xsl:value-of select="$lf"/>
+		<xsl:value-of select="$lf"/>
+
+		<xsl:apply-templates select="group|from|comment|br" mode ="body">
+			<xsl:with-param name="totype" select="@type"/>
+			<xsl:with-param name="toname">
+				<xsl:choose>
+					<xsl:when test="@name">
+						<xsl:value-of select="@name"/>
+					</xsl:when>
+					<xsl:otherwise>
+						<xsl:value-of select="@type"/>
+					</xsl:otherwise>
+				</xsl:choose>
+			</xsl:with-param>
+			<xsl:with-param name="tonullable" select="$tonullable"/>
+			<xsl:with-param name="code" select="default/text()"/>
+		</xsl:apply-templates>
+
+		<xsl:value-of select="$t2"/>
+		<xsl:text>/// &lt;summary&gt;Converts the value of a specified object to an equivalent &lt;c&gt;</xsl:text>
+		<xsl:value-of select="$fulltype"/>
+		<xsl:text>&lt;/c&gt; value.&lt;/summary&gt;</xsl:text>
+		<xsl:value-of select="$lf"/>
+
+		<xsl:if test="$notclscompliant">
+			<xsl:value-of select="$t2"/>
+			<xsl:text>[CLSCompliant(false)]</xsl:text>
+			<xsl:value-of select="$lf"/>
+		</xsl:if>
+
+		<xsl:value-of select="$t2"/>
+		<xsl:text>public static </xsl:text>
+		<xsl:value-of select="$fulltype"/>
+		<xsl:value-of select="$s1"/>
+		<xsl:value-of select="$methodname"/>
+		<xsl:if test="$tonullable">
+			<xsl:text>Nullable</xsl:text>
+		</xsl:if>
+		<xsl:choose>
+			<xsl:when test="@name">
+				<xsl:value-of select="@name"/>
+			</xsl:when>
+			<xsl:otherwise>
+				<xsl:value-of select="@type"/>
+			</xsl:otherwise>
+		</xsl:choose>
+		<xsl:text>(object p)</xsl:text>
+		<xsl:call-template name ="writeSpaces">
+			<xsl:with-param name="count" select="$objectpad"/>
+		</xsl:call-template>
+		<xsl:call-template name="writecode">
+			<xsl:with-param name="code">
+				<xsl:apply-templates select="default">
+					<xsl:with-param name="tonullable" select="$tonullable"/>
+				</xsl:apply-templates>
+			</xsl:with-param>
+		</xsl:call-template>
+
+		<xsl:value-of select="$lf"/>
+
+		<xsl:value-of select="$lf"/>
+		<xsl:value-of select="$t2"/>
+		<xsl:text>#endregion</xsl:text>
+		<xsl:value-of select="$lf"/>
+
+		<xsl:if test="$condition">
+			<xsl:value-of select="$lf"/>
+			<xsl:value-of select="$t2"/>
+			<xsl:text>#endif</xsl:text>
+		</xsl:if>
+
+		<xsl:value-of select="$lf"/>
+	</xsl:template>
+
+	<!-- body -->
+	<xsl:template match="group" mode="body">
+		<xsl:param name="totype"/>
+		<xsl:param name="toname"/>
+		<xsl:param name="tonullable"/>
+		<xsl:param name="code"/>
+
+<!--
+		<xsl:if test="@nullable='true'">
+			<xsl:text>#if FW2</xsl:text>
+			<xsl:value-of select="$lf"/>
+		</xsl:if>
+-->
+
+		<xsl:if test="@name">
+			<xsl:value-of select="$t2"/>
+			<xsl:text>// </xsl:text>
+			<xsl:value-of select="@name"/>
+			<xsl:value-of select="$lf"/>
+			<xsl:value-of select="$t2"/>
+			<xsl:text>// </xsl:text>
+			<xsl:value-of select="$lf"/>
+		</xsl:if>
+		<xsl:apply-templates select="group|from|comment|br|include" mode="body">
+			<xsl:with-param name="fromnullable" select="@nullable='true'"/>
+			<xsl:with-param name="totype"       select="$totype"/>
+			<xsl:with-param name="toname"       select="$toname"/>
+			<xsl:with-param name="tonullable"   select="$tonullable"/>
+			<xsl:with-param name="group"        select="."/>
+			<xsl:with-param name="code">
+				<xsl:choose>
+					<xsl:when test ="default/text()">
+						<xsl:value-of select="default/text()"/>
+					</xsl:when>
+					<xsl:otherwise>
+						<xsl:value-of select="$code"/>
+					</xsl:otherwise>
+				</xsl:choose>
+			</xsl:with-param>
+		</xsl:apply-templates>
+		<xsl:value-of select="$lf"/>
+
+<!--
+		<xsl:if test="@nullable='true'">
+			<xsl:text>#endif</xsl:text>
+			<xsl:value-of select="$lf"/>
+		</xsl:if>
+-->
+	</xsl:template>
+
+	<xsl:template match="from" mode="body">
+		<xsl:param name="fromnullable"/>
+		<xsl:param name="totype"/>
+		<xsl:param name="toname"/>
+		<xsl:param name="tonullable"/>
+		<xsl:param name="code"/>
+
+		<xsl:call-template name="frombody">
+			<xsl:with-param name="fromtype"     select="@type"/>
+			<xsl:with-param name="fromnullable" select="$fromnullable"/>
+			<xsl:with-param name="totype"       select="$totype"/>
+			<xsl:with-param name="toname"       select="$toname"/>
+			<xsl:with-param name="tonullable"   select="$tonullable"/>
+			<xsl:with-param name="code"         select="$code"/>
+		</xsl:call-template>
+	</xsl:template>
+
+	<xsl:template match="include" mode="body">
+		<xsl:param name="fromnullable"/>
+		<xsl:param name="totype"/>
+		<xsl:param name="toname"/>
+		<xsl:param name="tonullable"/>
+		<xsl:param name="group"/>
+		<xsl:param name="code"/>
+		<xsl:call-template name="includebody">
+			<xsl:with-param name="fromnullable" select="$fromnullable"/>
+			<xsl:with-param name="totype"       select="$totype"/>
+			<xsl:with-param name="toname"       select="$toname"/>
+			<xsl:with-param name="tonullable"   select="$tonullable"/>
+			<xsl:with-param name="group"        select="$group"/>
+			<xsl:with-param name="code"         select="$code"/>
+			<xsl:with-param name="template"     select="@template"/>
+		</xsl:call-template>
+	</xsl:template>
+
+	<xsl:template match="include" mode="runtime">
+		<xsl:param name="totype"/>
+		<xsl:param name="toname"/>
+		<xsl:param name="tonullable"/>
+		<xsl:param name="fromnullable"/>
+		<xsl:param name="default"/>
+		<xsl:param name="group"/>
+		<xsl:call-template name="includeruntime">
+			<xsl:with-param name="totype"       select="$totype"/>
+			<xsl:with-param name="toname"       select="$toname"/>
+			<xsl:with-param name="tonullable"   select="$tonullable"/>
+			<xsl:with-param name="fromnullable" select="$fromnullable"/>
+			<xsl:with-param name="group"        select="$group"/>
+			<xsl:with-param name="default"      select="$default"/>
+			<xsl:with-param name="template"     select="@template"/>
+		</xsl:call-template>
+	</xsl:template>
+
+	<xsl:template name="includebody">
+		<xsl:param name="fromnullable"/>
+		<xsl:param name="totype"/>
+		<xsl:param name="toname"/>
+		<xsl:param name="tonullable"/>
+		<xsl:param name="group"/>
+		<xsl:param name="code"/>
+		<xsl:param name="template"/>
+		<xsl:for-each select="/code/template[@name=$template]/*">
+			<xsl:choose>
+				<xsl:when test="name()='type'">
+					<xsl:variable name ="fromtype" select="@name"/>
+					<xsl:if test="not($fromtype=$totype and $fromnullable=$tonullable) and not($group/from[@type=$fromtype])">
+						<xsl:call-template name="frombody">
+							<xsl:with-param name="fromtype"     select="$fromtype"/>
+							<xsl:with-param name="fromnullable" select="$fromnullable"/>
+							<xsl:with-param name="totype"       select="$totype"/>
+							<xsl:with-param name="toname"       select="$toname"/>
+							<xsl:with-param name="tonullable"   select="$tonullable"/>
+							<xsl:with-param name="code"         select="$code"/>
+						</xsl:call-template>
+					</xsl:if>
+				</xsl:when>
+				<xsl:when test="name()='include'">
+					<xsl:call-template name="includebody">
+						<xsl:with-param name="fromnullable" select="$fromnullable"/>
+						<xsl:with-param name="totype"       select="$totype"/>
+						<xsl:with-param name="toname"       select="$toname"/>
+						<xsl:with-param name="tonullable"   select="$tonullable"/>
+						<xsl:with-param name="group"        select="$group"/>
+						<xsl:with-param name="code"         select="$code"/>
+						<xsl:with-param name="template"     select="@template"/>
+					</xsl:call-template>
+				</xsl:when>
+				<xsl:when test="name()='br'">
+					<xsl:value-of select="$lf"/>
+				</xsl:when>
+			</xsl:choose>
+		</xsl:for-each>
+	</xsl:template>
+
+	<xsl:template name="includeruntime">
+		<xsl:param name="totype"/>
+		<xsl:param name="toname"/>
+		<xsl:param name="tonullable"/>
+		<xsl:param name="fromnullable"/>
+		<xsl:param name="group"/>
+		<xsl:param name="default"/>
+		<xsl:param name="template"/>
+		<xsl:for-each select="/code/template[@name=$template]/*">
+			<xsl:choose>
+				<xsl:when test="name()='type'">
+					<xsl:variable name ="fromtype" select="@name"/>
+					<xsl:if test="not($fromtype=$totype and $fromnullable=$tonullable) and not($group/from[@type=$fromtype])">
+						<xsl:call-template name="fromruntime">
+							<xsl:with-param name="fromtype"     select="$fromtype"/>
+							<xsl:with-param name="fromnullable" select="$fromnullable"/>
+							<xsl:with-param name="totype"       select="$totype"/>
+							<xsl:with-param name="toname"       select="$toname"/>
+							<xsl:with-param name="tonullable"   select="$tonullable"/>
+							<xsl:with-param name="default"      select="$default"/>
+						</xsl:call-template>
+					</xsl:if>
+				</xsl:when>
+				<xsl:when test="name()='include'">
+					<xsl:call-template name="includeruntime">
+						<xsl:with-param name="fromnullable" select="$fromnullable"/>
+						<xsl:with-param name="totype"       select="$totype"/>
+						<xsl:with-param name="toname"       select="$toname"/>
+						<xsl:with-param name="tonullable"   select="$tonullable"/>
+						<xsl:with-param name="group"        select="$group"/>
+						<xsl:with-param name="default"      select="$default"/>
+						<xsl:with-param name="template"     select="@template"/>
+					</xsl:call-template>
+				</xsl:when>
+				<xsl:when test="name()='br'">
+					<xsl:value-of select="$lf"/>
+				</xsl:when>
+			</xsl:choose>
+		</xsl:for-each>
+	</xsl:template>
+
+	<xsl:template name="frombody">
+		<xsl:param name="fromtype"/>
+		<xsl:param name="fromnullable"/>
+		<xsl:param name="totype"/>
+		<xsl:param name="toname"/>
+		<xsl:param name="tonullable"/>
+		<xsl:param name="code"/>
+
+		<xsl:variable name="notclscompliant" select="/code/type[@name=$totype]/@clscompliant='false' or /code/type[@name=$fromtype]/@clscompliant='false'"/>
+		<xsl:variable name="fromcondition" select="/code/type[@name=$fromtype]/@condition"/>
+		<xsl:variable name="tocondition" select="/code/type[@name=$totype]/@condition"/>
+
+		<xsl:variable name="fromfulltype">
+			<xsl:value-of select="$fromtype"/>
+			<xsl:if test="$fromnullable">
+				<xsl:text>?</xsl:text>
+			</xsl:if>
+		</xsl:variable>
+		<xsl:variable name="fromtypepad" select="$padding - string-length($fromfulltype)"/>
+		<xsl:variable name="tofulltype">
+			<xsl:value-of select="$totype"/>
+			<xsl:if test="$tonullable">
+				<xsl:text>?</xsl:text>
+			</xsl:if>
+		</xsl:variable>
+
+		<xsl:if test="$fromcondition and not ($fromcondition = $tocondition)">
+			<xsl:value-of select="$t2"/>
+			<xsl:text>#if </xsl:text>
+			<xsl:value-of select="$fromcondition"/>
+			<xsl:value-of select="$lf"/>
+		</xsl:if>
+
+		<xsl:value-of select="$t2"/>
+		<xsl:text>/// &lt;summary&gt;Converts the value from &lt;c&gt;</xsl:text>
+		<xsl:value-of select="$fromfulltype"/>
+		<xsl:text>&lt;/c&gt; to an equivalent &lt;c&gt;</xsl:text>
+		<xsl:value-of select="$tofulltype"/>
+		<xsl:text>&lt;/c&gt; value.&lt;/summary&gt;</xsl:text>
+		<xsl:value-of select="$lf"/>
+
+		<xsl:if test="$notclscompliant">
+			<xsl:value-of select="$t2"/>
+			<xsl:text>[CLSCompliant(false)]</xsl:text>
+			<xsl:value-of select="$lf"/>
+		</xsl:if>
+
+		<xsl:value-of select="$t2"/>
+		<xsl:text>public static </xsl:text>
+		<xsl:value-of select="$tofulltype"/>
+		<xsl:value-of select="$s1"/>
+
+		<xsl:value-of select="$methodname"/>
+		<xsl:if test="$tonullable">
+			<xsl:text>Nullable</xsl:text>
+		</xsl:if>
+		<xsl:value-of select="$toname"/>
+		<xsl:text>(</xsl:text>
+		<xsl:value-of select="$fromfulltype"/>
+		<xsl:text> p)</xsl:text>
+		<xsl:call-template name ="writeSpaces">
+			<xsl:with-param name="count" select="$fromtypepad"/>
+		</xsl:call-template>
+		<xsl:call-template name="writecode">
+		<xsl:with-param name="code">
+			<xsl:choose>
+				<xsl:when test ="text()">
+					<xsl:value-of select="text()"/>
+				</xsl:when>
+				<xsl:otherwise>
+					<xsl:value-of select="$code"/>
+				</xsl:otherwise>
+			</xsl:choose>
+		</xsl:with-param>
+		</xsl:call-template>
+		<xsl:if test="$fromcondition and not ($fromcondition = $tocondition)">
+			<xsl:value-of select="$lf"/>
+			<xsl:value-of select="$t2"/>
+			<xsl:text>#endif</xsl:text>
+		</xsl:if>
+		<xsl:value-of select="$lf"/>
+	</xsl:template>
+
+	<xsl:template match="from" mode="runtime">
+		<xsl:param name="totype"/>
+		<xsl:param name="toname"/>
+		<xsl:param name="tonullable"/>
+		<xsl:param name="fromnullable"/>
+		<xsl:param name="default"/>
+		<xsl:call-template name="fromruntime">
+			<xsl:with-param name="fromtype"     select="@type"/>
+			<xsl:with-param name="fromnullable" select="$fromnullable"/>
+			<xsl:with-param name="totype"       select="$totype"/>
+			<xsl:with-param name="toname"       select="$toname"/>
+			<xsl:with-param name="tonullable"   select="$tonullable"/>
+			<xsl:with-param name="template"     select="@template"/>
+			<xsl:with-param name="default"      select="@default"/>
+		</xsl:call-template>
+	</xsl:template>
+
+
+	<!-- runtime -->
+	<xsl:template name="fromruntime">
+		<xsl:param name="fromtype"/>
+		<xsl:param name="totype"/>
+		<xsl:param name="toname"/>
+		<xsl:param name="tonullable"/>
+		<xsl:param name="fromnullable"/>
+		<xsl:param name="default"/>
+		<xsl:variable name="fromfullname">
+			<xsl:value-of select="$fromtype"/>
+			<xsl:if test="$fromnullable">
+				<xsl:text>?</xsl:text>
+			</xsl:if>
+		</xsl:variable>
+
+		<xsl:if test="text() or $default">
+			<xsl:variable name="typepad" select="$padding - string-length($fromfullname)"/>
+			<xsl:variable name="fromcondition" select="/code/type[@name=current()/@type]/@condition"/>
+			<xsl:variable name="tocondition" select="/code/type[@name=$totype]/@condition"/>
+
+			<xsl:if test="$fromcondition and not ($fromcondition = $tocondition)">
+				<xsl:value-of select="$t3"/>
+				<xsl:text>#if </xsl:text>
+				<xsl:value-of select="$fromcondition"/>
+				<xsl:value-of select="$lf"/>
+			</xsl:if>
+			<xsl:value-of select="$t3"/>
+			<xsl:text>if (p is </xsl:text>
+			<xsl:value-of select="$fromfullname"/>
+			<xsl:text>) </xsl:text>
+			<xsl:call-template name ="writeSpaces">
+				<xsl:with-param name="count" select="$typepad"/>
+			</xsl:call-template>
+			<xsl:text>return </xsl:text>
+			<xsl:value-of select="$methodname"/>
+			<xsl:if test="$tonullable">
+				<xsl:text>Nullable</xsl:text>
+			</xsl:if>
+			<xsl:value-of select="$toname"/>
+			<xsl:text>((</xsl:text>
+			<xsl:value-of select="$fromfullname"/>
+			<xsl:text>)p);</xsl:text>
+			<xsl:if test="$fromcondition and not ($fromcondition = $tocondition)">
+				<xsl:value-of select="$lf"/>
+				<xsl:value-of select="$t3"/>
+				<xsl:text>#endif</xsl:text>
+			</xsl:if>
+			<xsl:value-of select="$lf"/>
+		</xsl:if>
+	</xsl:template>
+
+	<xsl:template match="group" mode="runtime">
+		<xsl:param name="totype"/>
+		<xsl:param name="toname"/>
+		<xsl:param name="tonullable"/>
+		<xsl:param name="fromnullable"/>
+		<xsl:param name="default"/>
+		
+		<xsl:variable name="fromnullablelocal" select="@nullable='true' or $fromnullable"/>
+		<xsl:variable name="defaultcode">
+			<xsl:choose>
+				<xsl:when test="default/text()">
+					<xsl:value-of select="default/text()"/>
+				</xsl:when>
+				<xsl:otherwise>
+					<xsl:value-of select="$default"/>
+				</xsl:otherwise>
+			</xsl:choose>
+		</xsl:variable>
+
+		<xsl:if test="not($fromnullablelocal)">
+
+		<xsl:if test="@name">
+			<xsl:value-of select="$lf"/>
+			<xsl:value-of select="$t3"/>
+			<xsl:text>// </xsl:text>
+			<xsl:value-of select="@name"/>
+			<xsl:value-of select="$lf"/>
+			<xsl:value-of select="$t3"/>
+			<xsl:text>//</xsl:text>
+		</xsl:if>
+		<xsl:value-of select="$lf"/>
+		<xsl:apply-templates select="group|from|br|include" mode ="runtime">
+			<xsl:with-param name="totype"       select="$totype"/>
+			<xsl:with-param name="toname"       select="$toname"/>
+			<xsl:with-param name="tonullable"   select="$tonullable"/>
+			<xsl:with-param name="fromnullable" select="$fromnullablelocal"/>
+			<xsl:with-param name="default"      select="$defaultcode"/>
+			<xsl:with-param name="group"        select="."/>
+		</xsl:apply-templates>
+    </xsl:if>
+
+	</xsl:template>
+
+	<!-- default -->
+	<xsl:template match="default">
+		<xsl:param name="tonullable"/>
+		<xsl:if test="@nullvalue">
+			<xsl:value-of select="$lf"/>
+			<xsl:value-of select="$t3"/>
+			<xsl:text>if (p == null || p is DBNull) return </xsl:text>
+			<xsl:value-of select="@nullvalue"/>
+			<xsl:text>;</xsl:text>
+			<xsl:value-of select="$lf"/>
+		</xsl:if>
+    <xsl:value-of select="$lf"/>
+    <xsl:value-of select="$t3"/>
+    <xsl:text>if (p is </xsl:text>
+    <xsl:value-of select="../@type"/>
+    <xsl:text>) return (</xsl:text>
+    <xsl:value-of select="../@type"/>
+    <xsl:text>)p;</xsl:text>
+    <xsl:value-of select="$lf"/>
+    <xsl:if test="not(@noruntime) and @nullvalue">
+			<xsl:apply-templates select="../from|../group|../br|../include" mode="runtime">
+				<xsl:with-param name="totype"     select="../@type"/>
+				<xsl:with-param name="toname">
+					<xsl:choose>
+						<xsl:when test="../@name">
+							<xsl:value-of select="../@name"/>
+						</xsl:when>
+						<xsl:otherwise>
+							<xsl:value-of select="../@type"/>
+						</xsl:otherwise>
+					</xsl:choose>
+				</xsl:with-param>
+				<xsl:with-param name="tonullable" select="$tonullable"/>
+			</xsl:apply-templates>
+		</xsl:if>
+		<xsl:value-of select="text()"/>
+		<xsl:if test="not(@nothrow) and @nullvalue">
+			<xsl:value-of select="$lf"/>
+			<xsl:value-of select="$t3"/>
+			<xsl:text>throw CreateInvalidCastException(p.GetType(), typeof(</xsl:text>
+			<xsl:value-of select="../@type"/>
+			<xsl:if test="$tonullable">
+				<xsl:text>?</xsl:text>
+			</xsl:if>
+			<xsl:text>));</xsl:text>
+		</xsl:if>
+	</xsl:template>
+
+	<!-- comments -->
+	<xsl:template name ="comment">
+		<xsl:if test="text()">
+			<xsl:value-of select="$lf"/>
+			<xsl:value-of select="$t3"/>
+			<xsl:text>// </xsl:text>
+			<xsl:value-of select="text()"/>
+			<xsl:value-of select="$lf"/>
+			<xsl:value-of select="$t3"/>
+			<xsl:text>//</xsl:text>
+		</xsl:if>
+		<xsl:value-of select="$lf"/>
+	</xsl:template>
+
+	<xsl:template match="comment">
+		<xsl:call-template name="comment"/>
+	</xsl:template>
+
+	<xsl:template match="comment" mode ="partial">
+		<xsl:if test="not(@tonullable) or @tonullable!='true'">
+			<xsl:call-template name="comment"/>
+		</xsl:if>
+	</xsl:template>
+
+	<xsl:template match="comment" mode ="nuldef">
+		<xsl:if test="@tonullable='true'">
+			<xsl:call-template name="comment"/>
+		</xsl:if>
+	</xsl:template>
+
+	<xsl:template match="comment" mode ="body">
+		<xsl:if test="not(@tonullable) or @tonullable!='true'">
+			<xsl:call-template name="comment"/>
+		</xsl:if>
+	</xsl:template>
+
+	<xsl:template match="comment" mode ="nulbody">
+		<xsl:if test="@tonullable='true'">
+			<xsl:call-template name="comment"/>
+		</xsl:if>
+	</xsl:template>
+
+	<xsl:template match="br">
+		<xsl:value-of select="$lf"/>
+	</xsl:template>
+
+	<xsl:template match="br" mode="def">
+		<xsl:value-of select="$lf"/>
+	</xsl:template>
+
+	<xsl:template match="br" mode="body">
+		<xsl:value-of select="$lf"/>
+	</xsl:template>
+
+	<xsl:template match="br" mode="runtime">
+		<xsl:value-of select="$lf"/>
+	</xsl:template>
+
+	<!-- support function -->
+	<xsl:template name="writecode">
+		<xsl:param name="code"/>
+		<xsl:choose>
+			<xsl:when test="contains($code, '&#13;')">
+				<!-- multi-line -->
+				<xsl:value-of select="$lf"/>
+				<xsl:value-of select="$t2"/>
+				<xsl:text>{</xsl:text>
+				<xsl:value-of select="$code"/>
+				<xsl:value-of select="$lf"/>
+				<xsl:value-of select="$t2"/>
+				<xsl:text>}</xsl:text>
+			</xsl:when>
+			<xsl:otherwise>
+				<!-- single-line -->
+				<xsl:text> { </xsl:text>
+				<xsl:value-of select="$code"/>
+				<xsl:text> }</xsl:text>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+
+	<!-- support function -->
+	<xsl:template name="writeSpaces">
+		<xsl:param name="count"/>
+		<xsl:choose>
+			<xsl:when test="$count&lt;1"/>
+			<xsl:when test="$count=1">
+				<xsl:value-of select="$s1"/>
+			</xsl:when>
+			<xsl:when test="$count=2">
+				<xsl:value-of select="$s2"/>
+			</xsl:when>
+			<xsl:when test="$count=3">
+				<xsl:value-of select="$s3"/>
+			</xsl:when>
+			<xsl:when test="$count=4">
+				<xsl:value-of select="$s4"/>
+			</xsl:when>
+			<xsl:when test="$count=5">
+				<xsl:value-of select="$s5"/>
+			</xsl:when>
+			<xsl:when test="$count=6">
+				<xsl:value-of select="$s6"/>
+			</xsl:when>
+			<xsl:when test="$count=7">
+				<xsl:value-of select="$s7"/>
+			</xsl:when>
+			<xsl:when test="$count=8">
+				<xsl:value-of select="$s8"/>
+			</xsl:when>
+			<xsl:otherwise>
+				<xsl:value-of select="$s8"/>
+				<xsl:call-template name ="writeSpaces">
+					<xsl:with-param name="count" select="$count - 8"/>
+				</xsl:call-template>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+
+</xsl:stylesheet>
Binary file Tools/CodeGenerator/TransformCodeGenerator.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/CodeGenerator/ValueMapping.Declare.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,255 @@
+using System;
+using System.Data.SqlTypes;
+
+using KeyValue = System.Collections.Generic.KeyValuePair<System.Type, System.Type>;
+using Table    = System.Collections.Generic.Dictionary<System.Collections.Generic.KeyValuePair<System.Type, System.Type>, BLToolkit.Mapping.IValueMapper>;
+
+namespace BLToolkit.Mapping
+{
+	[CLSCompliant(false)]
+	public interface IMapDataSource
+	{
+		int      Count { get; }
+
+		Type     GetFieldType (int index);
+		string   GetName      (int index);
+		int      GetOrdinal   (string name);
+		object   GetValue     (object o, int index);
+		object   GetValue     (object o, string name);
+
+		bool     IsNull       (object o, int index);
+
+		bool     SupportsTypedValues(int index);
+
+		// Simple type getters.
+		//
+		[CLSCompliant(false)]
+		SByte    GetSByte     (object o, int index);
+		Int16    GetInt16     (object o, int index);
+		Int32    GetInt32     (object o, int index);
+		Int64    GetInt64     (object o, int index);
+
+		Byte     GetByte      (object o, int index);
+		[CLSCompliant(false)]
+		UInt16   GetUInt16    (object o, int index);
+		[CLSCompliant(false)]
+		UInt32   GetUInt32    (object o, int index);
+		[CLSCompliant(false)]
+		UInt64   GetUInt64    (object o, int index);
+
+		Boolean  GetBoolean   (object o, int index);
+		Char     GetChar      (object o, int index);
+		Single   GetSingle    (object o, int index);
+		Double   GetDouble    (object o, int index);
+		Decimal  GetDecimal   (object o, int index);
+		DateTime GetDateTime  (object o, int index);
+		Guid     GetGuid      (object o, int index);
+
+#if FW2
+		// Simple type getters.
+		//
+		[CLSCompliant(false)]
+		SByte?    GetNullableSByte   (object o, int index);
+		Int16?    GetNullableInt16   (object o, int index);
+		Int32?    GetNullableInt32   (object o, int index);
+		Int64?    GetNullableInt64   (object o, int index);
+
+		Byte?     GetNullableByte    (object o, int index);
+		[CLSCompliant(false)]
+		UInt16?   GetNullableUInt16  (object o, int index);
+		[CLSCompliant(false)]
+		UInt32?   GetNullableUInt32  (object o, int index);
+		[CLSCompliant(false)]
+		UInt64?   GetNullableUInt64  (object o, int index);
+
+		Boolean?  GetNullableBoolean (object o, int index);
+		Char?     GetNullableChar    (object o, int index);
+		Single?   GetNullableSingle  (object o, int index);
+		Double?   GetNullableDouble  (object o, int index);
+		Decimal?  GetNullableDecimal (object o, int index);
+		DateTime? GetNullableDateTime(object o, int index);
+		Guid?     GetNullableGuid    (object o, int index);
+#endif
+
+		// SQL type getters.
+		//
+		SqlByte     GetSqlByte     (object o, int index);
+		SqlInt16    GetSqlInt16    (object o, int index);
+		SqlInt32    GetSqlInt32    (object o, int index);
+		SqlInt64    GetSqlInt64    (object o, int index);
+		SqlSingle   GetSqlSingle   (object o, int index);
+		SqlBoolean  GetSqlBoolean  (object o, int index);
+		SqlDouble   GetSqlDouble   (object o, int index);
+		SqlDateTime GetSqlDateTime (object o, int index);
+		SqlDecimal  GetSqlDecimal  (object o, int index);
+		SqlMoney    GetSqlMoney    (object o, int index);
+		SqlGuid     GetSqlGuid     (object o, int index);
+		SqlString   GetSqlString   (object o, int index);
+	}
+
+	[CLSCompliant(false)]
+	public interface IMapDataDestination
+	{
+		Type GetFieldType (int index);
+		int  GetOrdinal   (string name);
+		void SetValue     (object o, int index,   object value);
+		void SetValue     (object o, string name, object value);
+
+		void SetNull      (object o, int index);
+
+		bool SupportsTypedValues(int index);
+
+		// Simple type setters.
+		//
+		[CLSCompliant(false)]
+		void SetSByte     (object o, int index, SByte    value);
+		void SetInt16     (object o, int index, Int16    value);
+		void SetInt32     (object o, int index, Int32    value);
+		void SetInt64     (object o, int index, Int64    value);
+
+		void SetByte      (object o, int index, Byte     value);
+		[CLSCompliant(false)]
+		void SetUInt16    (object o, int index, UInt16   value);
+		[CLSCompliant(false)]
+		void SetUInt32    (object o, int index, UInt32   value);
+		[CLSCompliant(false)]
+		void SetUInt64    (object o, int index, UInt64   value);
+
+		void SetBoolean   (object o, int index, Boolean  value);
+		void SetChar      (object o, int index, Char     value);
+		void SetSingle    (object o, int index, Single   value);
+		void SetDouble    (object o, int index, Double   value);
+		void SetDecimal   (object o, int index, Decimal  value);
+		void SetGuid      (object o, int index, Guid     value);
+		void SetDateTime  (object o, int index, DateTime value);
+
+#if FW2
+		// Simple type setters.
+		//
+		[CLSCompliant(false)]
+		void SetNullableSByte     (object o, int index, SByte?    value);
+		void SetNullableInt16     (object o, int index, Int16?    value);
+		void SetNullableInt32     (object o, int index, Int32?    value);
+		void SetNullableInt64     (object o, int index, Int64?    value);
+
+		void SetNullableByte      (object o, int index, Byte?     value);
+		[CLSCompliant(false)]
+		void SetNullableUInt16    (object o, int index, UInt16?   value);
+		[CLSCompliant(false)]
+		void SetNullableUInt32    (object o, int index, UInt32?   value);
+		[CLSCompliant(false)]
+		void SetNullableUInt64    (object o, int index, UInt64?   value);
+
+		void SetNullableBoolean   (object o, int index, Boolean?  value);
+		void SetNullableChar      (object o, int index, Char?     value);
+		void SetNullableSingle    (object o, int index, Single?   value);
+		void SetNullableDouble    (object o, int index, Double?   value);
+		void SetNullableDecimal   (object o, int index, Decimal?  value);
+		void SetNullableGuid      (object o, int index, Guid?     value);
+		void SetNullableDateTime  (object o, int index, DateTime? value);
+#endif
+
+		// SQL type setters.
+		//
+		void SetSqlByte    (object o, int index, SqlByte     value);
+		void SetSqlInt16   (object o, int index, SqlInt16    value);
+		void SetSqlInt32   (object o, int index, SqlInt32    value);
+		void SetSqlInt64   (object o, int index, SqlInt64    value);
+		void SetSqlSingle  (object o, int index, SqlSingle   value);
+		void SetSqlBoolean (object o, int index, SqlBoolean  value);
+		void SetSqlDouble  (object o, int index, SqlDouble   value);
+		void SetSqlDateTime(object o, int index, SqlDateTime value);
+		void SetSqlDecimal (object o, int index, SqlDecimal  value);
+		void SetSqlMoney   (object o, int index, SqlMoney    value);
+		void SetSqlGuid    (object o, int index, SqlGuid     value);
+		void SetSqlString  (object o, int index, SqlString   value);
+	}
+
+	[CLSCompliant(false)]
+	public interface IValueMapper
+	{
+		void Map(
+			IMapDataSource source, object sourceObject, int sourceIndex,
+			IMapDataDestination dest, object destObject, int destIndex);
+	}
+
+	public static partial class ValueMapping
+	{
+		#region Init
+
+		private static Table _mappers = new Table();
+
+		private static void AddSameType(Type type, IValueMapper mapper)
+		{
+			_mappers.Add(new KeyValue(type, type), mapper);
+		}
+
+		#endregion
+
+		#region Default Mapper
+
+		class DefaultValueMapper : IValueMapper
+		{
+			public void Map(
+				IMapDataSource source, object sourceObject, int sourceIndex,
+				IMapDataDestination dest, object destObject, int destIndex)
+			{
+				dest.SetValue(destObject, destIndex, source.GetValue(sourceObject, sourceIndex));
+
+				//object o = source.GetValue(sourceObject, sourceIndex);
+
+				//if (o == null) dest.SetNull (destObject, destIndex);
+				//else           dest.SetValue(destObject, destIndex, o);
+			}
+		}
+
+		private static IValueMapper _defaultMapper = new DefaultValueMapper();
+		[CLSCompliant(false)]
+		public static IValueMapper DefaultMapper
+		{
+			get { return _defaultMapper; }
+			set { _defaultMapper = value; }
+		}
+
+		#endregion
+
+		#region GetMapper
+
+		private static object _sync = new object();
+
+		[CLSCompliant(false)]
+		public static IValueMapper GetMapper(Type t1, Type t2)
+		{
+			lock (_sync)
+			{
+				if (t1 == null) t1 = typeof(object);
+				if (t2 == null) t2 = typeof(object);
+
+				if (t1.IsEnum) t1 = Enum.GetUnderlyingType(t1);
+				if (t2.IsEnum) t2 = Enum.GetUnderlyingType(t2);
+
+				KeyValue key = new KeyValue(t1, t2);
+
+				IValueMapper t;
+
+#if FW2
+				if (_mappers.TryGetValue(key, out t))
+					return t;
+
+#else
+				t = (IValueMapper)_mappers[key];
+
+				if (t != null)
+					return t;
+
+				t = _defaultMapper;
+#endif
+				_mappers.Add(key, t);
+
+				return t;
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/CodeGenerator/ValueMapping.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="utf-8"?>
+<code transformer="ValueMapping.xslt">
+
+	<using namespace="System"/>
+	<using namespace="System.Data.SqlTypes"/>
+
+	<!--
+	Short type names.
+	'A' => Arrays,
+	'N' => Nullable<>,
+	'I' => Integer types,
+	'U' => Unsigned integer types,
+	'R' => Real types,
+	'db' => Sql types.
+	-->
+	<nick type="Object"      name="O"/>
+	<nick type="String"      name="S"/>
+	<nick type="Char"        name="C"/>
+
+	<nick type="SByte"       name="I8"/>
+	<nick type="Int16"       name="I16"/>
+	<nick type="Int32"       name="I32"/>
+	<nick type="Int64"       name="I64"/>
+
+	<nick type="Byte"        name="U8"/>
+	<nick type="UInt16"      name="U16"/>
+	<nick type="UInt32"      name="U32"/>
+	<nick type="UInt64"      name="U64"/>
+
+	<nick type="Single"      name="R4"/>
+	<nick type="Double"      name="R8"/>
+
+	<nick type="Boolean"     name="B"/>
+	<nick type="Decimal"     name="D"/>
+
+	<nick type="Guid"        name="G"/>
+	<nick type="TimeSpan"    name="TS"/>
+	<nick type="DateTime"    name="DT"/>
+
+	<nick type="SqlString"   name="dbS"/>
+
+	<nick type="SqlByte"     name="dbU8"/>
+	<nick type="SqlInt16"    name="dbI16"/>
+	<nick type="SqlInt32"    name="dbI32"/>
+	<nick type="SqlInt64"    name="dbI64"/>
+
+	<nick type="SqlSingle"   name="dbR4"/>
+	<nick type="SqlDouble"   name="dbR8"/>
+	<nick type="SqlDecimal"  name="dbD"/>
+	<nick type="SqlMoney"    name="dbM"/>
+
+	<nick type="SqlBoolean"  name="dbB"/>
+	<nick type="SqlDateTime" name="dbDT"/>
+	<nick type="SqlGuid"     name="dbG"/>
+
+	<nick type="SqlBinary"   name="dbBin"/>
+	<nick type="SqlBytes"    name="dbAU8"/>
+	<nick type="SqlChars"    name="dbAC"/>
+	<nick type="SqlXml"      name="dbXml"/>
+
+	<group name="Scalar Types">
+		<type name="SByte"   />
+		<type name="Int16"   />
+		<type name="Int32"   />
+		<type name="Int64"   />
+		<br/>
+		<type name="Byte"    />
+		<type name="UInt16"  />
+		<type name="UInt32"  />
+		<type name="UInt64"  />
+		<br/>
+		<type name="Boolean" />
+		<type name="Char"    />
+		<type name="Single"  />
+		<type name="Double"  />
+		<type name="Decimal" />
+		<br/>
+	<!--<type name="Guid"    />
+		<type name="DateTime"/>-->
+	</group>
+
+	<group name="Nullable Types" nullable="true">
+		<type name="SByte"   />
+		<type name="Int16"   />
+		<type name="Int32"   />
+		<type name="Int64"   />
+		<br/>
+		<type name="Byte"    />
+		<type name="UInt16"  />
+		<type name="UInt32"  />
+		<type name="UInt64"  />
+		<br/>
+		<type name="Boolean" />
+		<type name="Char"    />
+		<type name="Single"  />
+		<type name="Double"  />
+		<type name="Decimal" />
+		<br/>
+		<!--<type name="Guid"    />
+		<type name="DateTime"/>-->
+	</group>
+
+	<group name="SqlTypes">
+		<type name="SqlString"  />
+		<br/>
+		<type name="SqlByte"    />
+		<type name="SqlInt16"   />
+		<type name="SqlInt32"   />
+		<type name="SqlInt64"   />
+		<br/>
+		<type name="SqlSingle"  />
+		<type name="SqlDouble"  />
+		<type name="SqlDecimal" />
+		<type name="SqlMoney"   />
+		<br/>
+		<type name="SqlBoolean" />
+	<type name="SqlGuid"    />
+		<type name="SqlDateTime"/>
+	</group>
+
+</code>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/CodeGenerator/ValueMapping.xslt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,492 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+	<xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>
+
+	<!-- parameters passed in by the TransformCodeGenerator -->
+	<xsl:param name="generator"></xsl:param>
+	<xsl:param name="version"></xsl:param>
+	<xsl:param name="filename"></xsl:param>
+	<xsl:param name="date-created"></xsl:param>
+	<xsl:param name="created-by"></xsl:param>
+	<xsl:param name="namespace"></xsl:param>
+	<xsl:param name="output"></xsl:param>
+
+	<!-- support variables -->
+	<xsl:variable name="lf" xml:space="preserve">&#13;</xsl:variable>
+	<xsl:variable name="t1" xml:space="preserve">&#9;</xsl:variable>
+	<xsl:variable name="t2" xml:space="preserve">&#9;&#9;</xsl:variable>
+	<xsl:variable name="t3" xml:space="preserve">&#9;&#9;&#9;</xsl:variable>
+	<xsl:variable name="t4" xml:space="preserve">&#9;&#9;&#9;&#9;</xsl:variable>
+	<xsl:variable name="t5" xml:space="preserve">&#9;&#9;&#9;&#9;&#9;</xsl:variable>
+	<xsl:variable name="t6" xml:space="preserve">&#9;&#9;&#9;&#9;&#9;&#9;</xsl:variable>
+	<xsl:variable name="t7" xml:space="preserve">&#9;&#9;&#9;&#9;&#9;&#9;&#9;</xsl:variable>
+	<xsl:variable name="t8" xml:space="preserve">&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;</xsl:variable>
+	<xsl:variable name="s1" xml:space="preserve">&#32;</xsl:variable>
+	<xsl:variable name="s2" xml:space="preserve">&#32;&#32;</xsl:variable>
+	<xsl:variable name="s3" xml:space="preserve">&#32;&#32;&#32;</xsl:variable>
+	<xsl:variable name="s4" xml:space="preserve">&#32;&#32;&#32;&#32;</xsl:variable>
+	<xsl:variable name="s5" xml:space="preserve">&#32;&#32;&#32;&#32;&#32;</xsl:variable>
+	<xsl:variable name="s6" xml:space="preserve">&#32;&#32;&#32;&#32;&#32;&#32;</xsl:variable>
+	<xsl:variable name="s7" xml:space="preserve">&#32;&#32;&#32;&#32;&#32;&#32;&#32;</xsl:variable>
+	<xsl:variable name="s8" xml:space="preserve">&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;</xsl:variable>
+
+	<!-- customization -->
+	<xsl:variable name="baseclassname"  select="'MB'"/>
+	<xsl:variable name="nullableprefix" select="'N'"/>
+	<xsl:variable name="instancename"   select="'I'"/>
+	<xsl:variable name="getmethodspec"  select="'Get(IMapDataSource s, object o, int i'"/>
+	<xsl:variable name="setmethodspec"  select="'Set(IMapDataDestination d, object o, int i'"/>
+	<xsl:variable name="padding"        select="string-length('DateTimeOffset?') + 1"/>
+
+	<!-- the root of all evil -->
+	<xsl:template match="/">
+		<!--<xsl:call-template name="header-comment"/>-->
+		<xsl:apply-templates select="code"/>
+	</xsl:template>
+
+	<xsl:template name="header-comment">
+		<xsl:value-of select="$lf"/>
+		<xsl:text>#region Generated File</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:text>/*</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:text> * GENERATED FILE -- DO NOT EDIT</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:text> *</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:text> * Generator: </xsl:text>
+		<xsl:value-of select="$generator"/>
+		<xsl:value-of select="$lf"/>
+		<xsl:text> * Version:   </xsl:text>
+		<xsl:value-of select="$version"/>
+		<xsl:value-of select="$lf"/>
+		<xsl:text> *</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:text> *</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:text> * Generated code from "</xsl:text>
+		<xsl:value-of select="$filename"/>
+		<xsl:text>"</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:text> *</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:text> * Created: </xsl:text>
+		<xsl:value-of select="$date-created"/>
+		<xsl:value-of select="$lf"/>
+		<xsl:text> * By:      </xsl:text>
+		<xsl:value-of select="$created-by"/>
+		<xsl:value-of select="$lf"/>
+		<xsl:text> *</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:text> */</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:text>#endregion</xsl:text>
+		<xsl:value-of select="$lf"/>
+	</xsl:template>
+
+	<xsl:template match="code">
+		<xsl:apply-templates select="using"/>
+		<xsl:value-of select="$lf"/>
+		<xsl:text>namespace </xsl:text>
+		<xsl:value-of select="$namespace"/>
+		<xsl:value-of select="$lf"/>
+		<xsl:text>{</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:call-template name="class"/>
+		<xsl:text>}</xsl:text>
+		<xsl:value-of select="$lf"/>
+	</xsl:template>
+
+	<xsl:template match="using">
+		<xsl:text>using </xsl:text>
+		<xsl:value-of select="@namespace"/>
+		<xsl:text>;</xsl:text>
+		<xsl:value-of select="$lf"/>
+	</xsl:template>
+
+	<!-- the class definition -->
+	<xsl:template name="class">
+		<xsl:value-of select="$t1"/>
+		<xsl:text>public static partial class ValueMapping</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:value-of select="$t1"/>
+		<xsl:text>{</xsl:text>
+		<xsl:value-of select="$lf"/>
+
+		<xsl:apply-templates select="group|comment|br" mode="to">
+			<xsl:with-param name="mode" select="'select'"/>
+		</xsl:apply-templates>
+		
+		<xsl:text>}</xsl:text>
+		<xsl:value-of select="$lf"/>
+	</xsl:template>
+
+	<!-- group -->
+	<xsl:template match="group" mode="to">
+		
+		<xsl:param name="mode"/>
+
+		<xsl:if test="@nullable='true'">
+			<xsl:text>#if FW2</xsl:text>
+			<xsl:value-of select="$lf"/>
+		</xsl:if>
+
+		<xsl:if test="@name">
+			<xsl:value-of select="$t2"/>
+			<xsl:text>#region </xsl:text>
+			<xsl:value-of select="@name"/>
+			<xsl:value-of select="$lf"/>
+			<xsl:value-of select="$lf"/>
+		</xsl:if>
+		
+		<xsl:apply-templates select="type|comment|br" mode="to">
+			<xsl:with-param name="tonullable" select="@nullable='true'"/>
+			<xsl:with-param name="mode"       select="$mode"/>
+		</xsl:apply-templates>
+
+		<xsl:if test="@name">
+			<xsl:value-of select="$lf"/>
+			<xsl:value-of select="$t2"/>
+			<xsl:text>#endregion </xsl:text>
+			<xsl:value-of select="$lf"/>
+		</xsl:if>
+
+		<xsl:if test="@nullable='true'">
+			<xsl:text>#endif</xsl:text>
+			<xsl:value-of select="$lf"/>
+		</xsl:if>
+
+	</xsl:template>
+
+	<xsl:template match="group" mode="from">
+		<xsl:param name="tonick"/>
+		<xsl:param name="totype"/>
+		<xsl:param name="tonullable"/>
+
+		<xsl:param name="mode"/>
+
+		<xsl:if test="@nullable='true'">
+			<xsl:text>#if FW2</xsl:text>
+			<xsl:value-of select="$lf"/>
+		</xsl:if>
+
+		<xsl:apply-templates select="type|comment|br" mode="from">
+			<xsl:with-param name="fromnullable" select="@nullable='true'"/>
+			<xsl:with-param name="tonick"       select="$tonick"/>
+			<xsl:with-param name="totype"       select="$totype"/>
+			<xsl:with-param name="tonullable"   select="$tonullable"/>
+			<xsl:with-param name="mode"         select="$mode"/>
+		</xsl:apply-templates>
+
+		<xsl:if test="@nullable='true'">
+			<xsl:text>#endif</xsl:text>
+			<xsl:value-of select="$lf"/>
+		</xsl:if>
+
+	</xsl:template>
+
+	<!-- type -->
+	<xsl:template match="type" mode="to">
+		
+		<xsl:param name="tonullable"/>
+		<xsl:param name="mode"/>
+
+		<xsl:variable name="name" select="@name"/>
+		<xsl:variable name="tonullablelocal" select="@nullable='true' or $tonullable"/>
+		<xsl:variable name="tonick">
+			<xsl:if test="$tonullablelocal">
+				<xsl:value-of select="$nullableprefix"/>
+			</xsl:if>
+			<xsl:choose>
+				<xsl:when test="@nick">
+					<xsl:value-of select="@nick"/>
+				</xsl:when>
+				<xsl:when test="/code/nick[@type=$name]">
+					<xsl:value-of select="/code/nick[@type=$name]/@name"/>
+				</xsl:when>
+				<xsl:otherwise>
+					<xsl:value-of select="$name"/>
+				</xsl:otherwise>
+			</xsl:choose>
+		</xsl:variable>
+
+	<xsl:if test="$tonullablelocal">
+			<xsl:text>#if FW2</xsl:text>
+			<xsl:value-of select="$lf"/>
+		</xsl:if>
+
+		<xsl:value-of select="$lf"/>
+		<xsl:value-of select="$t2"/>
+		<xsl:text>private static IValueMapper Get</xsl:text>
+		<xsl:value-of select="$tonick"/>
+		<xsl:text>Mapper(Type t)</xsl:text>
+		<xsl:value-of select="$lf"/>
+		<xsl:value-of select="$t2"/>
+		<xsl:text>{</xsl:text>
+		<xsl:value-of select="$lf"/>
+
+		<xsl:apply-templates select="/code/group|/code/comment|/code/br" mode="from">
+			<xsl:with-param name="tonick"     select="$tonick"/>
+			<xsl:with-param name="totype"     select="@name"/>
+			<xsl:with-param name="tonullable" select="$tonullablelocal"/>
+			<xsl:with-param name="mode"       select="$mode"/>
+		</xsl:apply-templates>
+
+		<xsl:value-of select="$lf"/>
+		<xsl:value-of select="$t3"/>
+		<xsl:text>return null;</xsl:text>
+		<xsl:value-of select="$lf"/>
+
+		<xsl:value-of select="$t2"/>
+		<xsl:text>}</xsl:text>
+		<xsl:value-of select="$lf"/>
+
+		<xsl:if test="$tonullablelocal">
+			<xsl:text>#endif</xsl:text>
+			<xsl:value-of select="$lf"/>
+		</xsl:if>
+
+	</xsl:template>
+
+
+	<xsl:template match="type" mode="from">
+
+		<xsl:param name="fromnullable"/>
+		<xsl:param name="tonick"/>
+		<xsl:param name="totype"/>
+		<xsl:param name="tonullable"/>
+		<xsl:param name="mode"/>
+
+		<xsl:variable name="name" select="@name"/>
+		<xsl:variable name="fromnullablelocal" select="@nullable='true' or $fromnullable"/>
+
+		<xsl:call-template name="generate">
+			<xsl:with-param name="totype"     select="$totype"/>
+			<xsl:with-param name="tonullable" select="$tonullable"/>
+			<xsl:with-param name="tonick"     select="$tonick"/>
+			<xsl:with-param name="fromnick">
+				<xsl:if test="$fromnullablelocal">
+					<xsl:value-of select="$nullableprefix"/>
+				</xsl:if>
+				<xsl:choose>
+					<xsl:when test="@nick">
+						<xsl:value-of select="@nick"/>
+					</xsl:when>
+					<xsl:when test="/code/nick[@type=$name]">
+						<xsl:value-of select="/code/nick[@type=$name]/@name"/>
+					</xsl:when>
+					<xsl:otherwise>
+						<xsl:value-of select="$name"/>
+					</xsl:otherwise>
+				</xsl:choose>
+			</xsl:with-param>
+			<xsl:with-param name="fromtype"     select="@name"/>
+			<xsl:with-param name="fromnullable" select="$fromnullablelocal"/>
+			<xsl:with-param name="mode"         select="$mode"/>
+		</xsl:call-template>
+
+	</xsl:template>
+
+	<xsl:template name="generate">
+		<xsl:param name="tonick"/>
+		<xsl:param name="totype"/>
+		<xsl:param name="tonullable"/>
+		<xsl:param name="fromnick"/>
+		<xsl:param name="fromtype"/>
+		<xsl:param name="fromnullable"/>
+		<xsl:param name="mode"/>
+
+		<xsl:variable name="tofulltype">
+			<xsl:value-of select="$totype"/>
+			<xsl:if test="$tonullable">
+				<xsl:text>?</xsl:text>
+			</xsl:if>
+		</xsl:variable>
+		<xsl:variable name="tolongtype">
+			<xsl:if test="$tonullable">
+				<xsl:text>Nullable</xsl:text>
+			</xsl:if>
+			<xsl:value-of select="$totype"/>
+		</xsl:variable>
+		<xsl:variable name="totypepad" select="$padding - string-length($tofulltype)"/>
+
+		<xsl:variable name="fromfulltype">
+			<xsl:value-of select="$fromtype"/>
+			<xsl:if test="$fromnullable">
+				<xsl:text>?</xsl:text>
+			</xsl:if>
+		</xsl:variable>
+		<xsl:variable name="fromlongtype">
+			<xsl:if test="$fromnullable">
+				<xsl:text>Nullable</xsl:text>
+			</xsl:if>
+			<xsl:value-of select="$fromtype"/>
+		</xsl:variable>
+		<xsl:variable name="fromtypepad" select="$padding - string-length($fromfulltype)"/>
+
+		<xsl:choose>
+			<xsl:when test="$mode='mapper'">
+				<xsl:value-of select="$t1"/>
+				<xsl:text>internal sealed class </xsl:text>
+				<xsl:value-of select="$fromnick"/>
+				<xsl:text>To</xsl:text>
+				<xsl:value-of select="$tonick"/>
+				<xsl:text> : IValueMapper</xsl:text>
+				<xsl:value-of select="$lf"/>
+				<xsl:value-of select="$t1"/>
+				<xsl:text>{</xsl:text>
+				<xsl:value-of select="$lf"/>
+				<xsl:value-of select="$t2"/>
+				<xsl:text>public void Map(</xsl:text>
+				<xsl:value-of select="$lf"/>
+				<xsl:value-of select="$t3"/>
+				<xsl:text>IMapDataSource      source, object sourceObject, int sourceIndex,</xsl:text>
+				<xsl:value-of select="$lf"/>
+				<xsl:value-of select="$t3"/>
+				<xsl:text>IMapDataDestination dest,   object destObject,   int destIndex)</xsl:text>
+				<xsl:value-of select="$lf"/>
+				<xsl:value-of select="$t2"/>
+				<xsl:text>{</xsl:text>
+				<xsl:value-of select="$lf"/>
+				<xsl:value-of select="$t3"/>
+				<xsl:text>if (source.IsNull(sourceObject, sourceIndex))</xsl:text>
+				<xsl:value-of select="$lf"/>
+				<xsl:value-of select="$t4"/>
+				<xsl:text>dest.SetNull(destObject, destIndex);</xsl:text>
+				<xsl:value-of select="$lf"/>
+				<xsl:value-of select="$t3"/>
+				<xsl:text>else</xsl:text>
+				<xsl:value-of select="$lf"/>
+				<xsl:value-of select="$t4"/>
+				<xsl:text>dest.Set</xsl:text>
+				<xsl:value-of select="$tolongtype"/>
+				<xsl:text>(destObject, destIndex,</xsl:text>
+				<xsl:value-of select="$lf"/>
+				<xsl:value-of select="$t5"/>
+
+				<xsl:if test="not($tonick=$fromnick)">
+					<xsl:text>Convert.To</xsl:text>
+					<xsl:value-of select="$tolongtype"/>
+					<xsl:text>(</xsl:text>
+					<xsl:value-of select="$lf"/>
+					<xsl:value-of select="$t6"/>
+				</xsl:if>
+				
+				<xsl:text>source.Get</xsl:text>
+				<xsl:value-of select="$fromlongtype"/>
+				<xsl:text>(sourceObject, sourceIndex))</xsl:text>
+
+				<xsl:if test="not($tonick=$fromnick)">
+					<xsl:text>)</xsl:text>
+				</xsl:if>
+				
+				<xsl:text>;</xsl:text>
+
+				<xsl:value-of select="$lf"/>
+				<xsl:value-of select="$t2"/>
+				<xsl:text>}</xsl:text>
+				<xsl:value-of select="$lf"/>
+				<xsl:value-of select="$t1"/>
+				<xsl:text>}</xsl:text>
+				<xsl:value-of select="$lf"/>
+			</xsl:when>
+			<xsl:when test="$mode='select'">
+				<xsl:value-of select="$t3"/>
+				<xsl:text>if (t == typeof(</xsl:text>
+				<xsl:value-of select="$fromfulltype"/>
+				<xsl:text>))</xsl:text>
+				<xsl:call-template name ="writeSpaces">
+					<xsl:with-param name="count" select="$fromtypepad"/>
+				</xsl:call-template>
+				<xsl:text>return new </xsl:text>
+				<xsl:value-of select="$fromnick"/>
+				<xsl:text>To</xsl:text>
+				<xsl:value-of select="$tonick"/>
+				<xsl:text>();</xsl:text>
+				<xsl:value-of select="$lf"/>
+			</xsl:when>
+		</xsl:choose>
+	</xsl:template>
+
+	<!-- comments -->
+	<xsl:template name ="comment">
+		<xsl:if test="text()">
+			<xsl:value-of select="$lf"/>
+			<xsl:value-of select="$t3"/>
+			<xsl:text>// </xsl:text>
+			<xsl:value-of select="text()"/>
+			<xsl:value-of select="$lf"/>
+			<xsl:value-of select="$t3"/>
+			<xsl:text>//</xsl:text>
+		</xsl:if>
+		<xsl:value-of select="$lf"/>
+	</xsl:template>
+
+	<xsl:template match="comment">
+		<xsl:call-template name="comment"/>
+	</xsl:template>
+
+	<xsl:template match="comment" mode ="to">
+		<xsl:if test="not(@tonullable) or @tonullable!='true'">
+			<xsl:call-template name="comment"/>
+		</xsl:if>
+	</xsl:template>
+
+	<xsl:template match="comment" mode ="from">
+		<xsl:if test="not(@tonullable) or @tonullable!='true'">
+			<xsl:call-template name="comment"/>
+		</xsl:if>
+	</xsl:template>
+	
+	<xsl:template match="br">
+		<xsl:value-of select="$lf"/>
+	</xsl:template>
+
+	<xsl:template match="br" mode="to">
+		<xsl:value-of select="$lf"/>
+	</xsl:template>
+
+	<xsl:template match="br" mode="from">
+		<xsl:value-of select="$lf"/>
+	</xsl:template>
+
+	<!-- support function -->
+	<xsl:template name="writeSpaces">
+		<xsl:param name="count"/>
+		<xsl:choose>
+			<xsl:when test="$count&lt;1"/>
+			<xsl:when test="$count=1">
+				<xsl:value-of select="$s1"/>
+			</xsl:when>
+			<xsl:when test="$count=2">
+				<xsl:value-of select="$s2"/>
+			</xsl:when>
+			<xsl:when test="$count=3">
+				<xsl:value-of select="$s3"/>
+			</xsl:when>
+			<xsl:when test="$count=4">
+				<xsl:value-of select="$s4"/>
+			</xsl:when>
+			<xsl:when test="$count=5">
+				<xsl:value-of select="$s5"/>
+			</xsl:when>
+			<xsl:when test="$count=6">
+				<xsl:value-of select="$s6"/>
+			</xsl:when>
+			<xsl:when test="$count=7">
+				<xsl:value-of select="$s7"/>
+			</xsl:when>
+			<xsl:when test="$count=8">
+				<xsl:value-of select="$s8"/>
+			</xsl:when>
+			<xsl:otherwise>
+				<xsl:value-of select="$s8"/>
+				<xsl:call-template name ="writeSpaces">
+					<xsl:with-param name="count" select="$count - 8"/>
+				</xsl:call-template>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+
+</xsl:stylesheet>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/CodeGenerator/install.bat	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+@if "%DevEnvDir%"=="" goto error_no_DevEnvDir
+
+copy TransformCodeGenerator.dll "%DevEnvDir%\PrivateAssemblies\"
+regasm "%DevEnvDir%\PrivateAssemblies\TransformCodeGenerator.dll"
+
+@goto end
+
+:error_no_DevEnvDir
+@echo ERROR: DevEnvDir variable is not set. 
+@goto end
+
+:end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/ChmGen.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{23AD6408-9310-4D0F-B461-C590EAF82868}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>DocGen</RootNamespace>
+    <AssemblyName>ChmGen</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;CHM</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE;CHM</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Rsdn.Framework.Common, Version=1.0.3006.25300, Culture=neutral, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\Rsdn\Rsdn.Framework.Common.dll</HintPath>
+    </Reference>
+    <Reference Include="Rsdn.Framework.Formatting, Version=1.0.3072.30252, Culture=neutral, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\Rsdn\Rsdn.Framework.Formatting.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Generator.Chm.cs" />
+    <Compile Include="FileAction.cs" />
+    <Compile Include="FileItem.cs" />
+    <Compile Include="Generator.cs" />
+    <Compile Include="IndexItem.cs" />
+    <Compile Include="Program.Chm.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/ChmTemplate.html	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,29 @@
+<html>
+<head>
+	<title>{3}</title>
+	<link href="{1}bltoolkit.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<span class="title"><nobr>Business Logic Toolkit for .NET</nobr></span><br/>
+<span class="homeurl">www.bltoolkit.net</span>
+
+<table width="100%" border="0" cellpadding="0" cellspacing="0">
+<tr><td colspan="3" class="sp"><img width="1" height="1" alt=""/></td></tr>
+<tr><td colspan="3" class="hr"><img width="1" height="1" alt=""/></td></tr>
+<tr><td colspan="3" class="sp"><img width="1" height="1" alt=""/></td></tr>
+<tr><td colspan="3" class="sp"><img width="1" height="1" alt=""/></td></tr>
+<tr><td width="25px">&nbsp;</td><td>{0}</td><td width="25px">&nbsp;</td></tr>
+<tr><td colspan="3" class="sp"><img width="1" height="1" alt=""/></td></tr>
+<tr><td colspan="3" class="sp"><img width="1" height="1" alt=""/></td></tr>
+<tr><td colspan="3" class="hr"><img width="1" height="1" alt=""/></td></tr>
+<tr><td colspan="3" class="sp"><img width="1" height="1" alt=""/></td></tr>
+<tr><td colspan="3">
+<small>
+<nobr>&copy; 2010 www.bltoolkit.net</nobr><br/>
+<nobr><a target=_blank href="mailto:support@bltoolkit.net">support@bltoolkit.net</a></nobr>
+</small>
+</td></tr>
+</table>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Aspects/AsyncAspect.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,45 @@
+[BLToolkitGenerated]
+internal delegate int TestObject$Test$Delegate(int, string);
+
+[BLToolkitGenerated]
+public sealed class AsyncTestObject : HowTo.Aspects.AsyncAspectTest.AsyncTestObject
+{
+	public override IAsyncResult BeginTest(int intVal, string strVal)
+	{
+		AsyncAspectBuilder.InternalAsyncResult r = new AsyncAspectBuilder.InternalAsyncResult();
+
+		r.Delegate    = new TestObject$Test$Delegate(base.Test);
+		r.InnerResult = r.Delegate.BeginInvoke(intVal, strVal, null, null);
+
+		return r;
+	}
+
+	public override IAsyncResult BeginTest(int intVal, string strVal, AsyncCallback callback)
+	{
+		AsyncAspectBuilder.InternalAsyncResult r = new AsyncAspectBuilder.InternalAsyncResult();
+
+		r.Delegate      = new TestObject$Test$Delegate(base.Test);
+		r.AsyncCallback = callback;
+		r.InnerResult   = r.Delegate.BeginInvoke(intVal, strVal, new AsyncCallback(r.CallBack), null);
+
+		return r;
+	}
+
+	public override IAsyncResult BeginTest(int intVal, string strVal, AsyncCallback callback, object state)
+	{
+		AsyncAspectBuilder.InternalAsyncResult r = new AsyncAspectBuilder.InternalAsyncResult();
+
+		r.Delegate      = new TestObject$Test$Delegate(base.Test);
+		r.AsyncCallback = callback;
+		r.InnerResult   = r.Delegate.BeginInvoke(intVal, strVal, new AsyncCallback(r.CallBack), state);
+
+		return r;
+	}
+
+	public override int EndTest(IAsyncResult asyncResult)
+	{
+		AsyncAspectBuilder.InternalAsyncResult r = (AsyncAspectBuilder.InternalAsyncResult)asyncResult;
+
+		return ((TestObject$Test$Delegate)r.Delegate).EndInvoke(r.InnerResult);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Aspects/AsyncAspect.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+<% title # Async aspect %>
+<p class="j">
+This aspect simplifies asynchronous operations.
+Note the AsyncAspect is not compatible with other type builders that generate a method body.
+If you apply them along with the AsyncAspect to an abstract method, they will be igored.
+</p>
+
+AsyncAspect.cs
+<% ..\..\..\HowTo\Aspects\AsyncAspect.cs %>
+
+BLToolkit type builder will generate the following for the class above:
+<% Doc\Aspects\AsyncAspect.cs %>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Aspects/CacheAspect.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,62 @@
+[BLToolkitGenerated]
+public sealed class TestClass : HowTo.Aspects.TestClass
+{
+	private static CallMethodInfo _methodInfo;
+	private static IInterceptor   _interceptor;
+
+	public override int CachedMethod(int p1, int p2)
+	{
+		int returnValue = 0;
+
+		if (_methodInfo == null)
+		{
+			_methodInfo = new CallMethodInfo((MethodInfo)MethodBase.GetCurrentMethod());
+		}
+
+		InterceptCallInfo info = new InterceptCallInfo();
+
+		info.Object             = this;
+		info.CallMethodInfo     = _methodInfo;
+		info.ParameterValues[0] = p1;
+		info.ParameterValues[1] = p2;
+		info.ReturnValue        = returnValue;
+		info.InterceptResult    = InterceptResult.Continue;
+		info.InterceptType      = InterceptType.BeforeCall;
+
+		if (_interceptor == null)
+		{
+			_interceptor = new CacheAspect();
+			_interceptor.Init(_methodInfo, "MaxCacheTime=500;IsWeak=False");
+		}
+
+		// 'BeforeCall' step checks if the method is cached.
+		// If it is and the cache is not expired, the Intercept method populates 
+		// return value and output parameters with the cached values and 
+		// sets info.InterceptResult to InterceptResult.Return.
+		// See the [link][file]Aspects/CacheAspect.cs[/file]CacheAspect.BeforeCall[/link] method for details.
+		//
+		_interceptor.Intercept(info);
+
+		returnValue = (int)info.ReturnValue;
+
+		if (info.InterceptResult != InterceptResult.Return)
+		{
+			// If the method call is not cached, target method is called.
+			//
+			returnValue = base.CachedMethod(p1, p2);
+
+			info.ReturnValue     = returnValue;
+			info.InterceptResult = InterceptResult.Continue;
+			info.InterceptType   = InterceptType.AfterCall;
+
+			// 'AfterCall' step stores parameters and return values in the cache.
+			// See the [link][file]Aspects/CacheAspect.cs[/file]CacheAspect.AfterCall[/link] method for details.
+			//
+			_interceptor.Intercept(info);
+
+			returnValue = (int)info.ReturnValue;
+		}
+
+		return returnValue;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Aspects/CacheAspect.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,16 @@
+<% title # Cache aspect %>
+<% group # Cache aspect %>
+<p class="j">This aspect helps to cache method calls. 
+The aspect uses input method parameters to create a cache key and 
+caches return value and all output (both <i>ref</i> and <i>out</i>) parameters. 
+By default only value types and string type of the method parameters are used 
+to create a cache key. Any other types are ignored. 
+This behavior can be changed by assigning the <b>CacheAspect.IsCacheableParameterType</b> property
+to a delegate providing custom logic.
+</p>
+
+CacheAspect.cs
+<% ..\..\..\HowTo\Aspects\CacheAspect.cs %>
+
+If we decompile the actual emitted TestClass class, we may see something like the following:
+<% Doc\Aspects\CacheAspect.cs %>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Aspects/ClearCacheAspect.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,84 @@
+[BLToolkitGenerated]
+public sealed class TestClass : ClearCacheAspect.TestClass
+{
+	private static MethodInfo _methodInfo1;
+	private static MethodInfo _methodInfo2;
+	private static Type       _type3;
+	private static Type       _type4;
+
+	public override int CachedMethod(int p1, int p2)
+	{
+		// Method implementation.
+	}
+
+	public override void ClearCache()
+	{
+		try
+		{
+			// Here should be main method implementation.
+			// It is empty as this method does nothing.
+		}
+		finally
+		{
+			if (_methodInfo1 == null)
+			{
+				_methodInfo1 = 
+					ClearCacheAspect.GetMethodInfo(this, null, "CachedMethod", null);
+			}
+
+			CacheAspect.ClearCache(_methodInfo1);
+		}
+	}
+
+	public override void ClearCache2()
+	{
+		try
+		{
+		}
+		finally
+		{
+			if (_methodInfo2 == null)
+			{
+				_methodInfo2 = ClearCacheAspect.GetMethodInfo(
+					this,
+					null,
+					"CachedMethod",
+					new Type[] { typeof(int), typeof(int) });
+			}
+
+			CacheAspect.ClearCache(_methodInfo2);
+		}
+	}
+
+	public override void ClearAll()
+	{
+		try
+		{
+		}
+		finally
+		{
+			if (_type3 == null)
+			{
+				_type3 = ClearCacheAspect.GetType(this, typeof(TestClass));
+			}
+
+			CacheAspect.ClearCache(_type3);
+		}
+	}
+
+	public override void ClearAll2()
+	{
+		try
+		{
+		}
+		finally
+		{
+			if (_type4 == null)
+			{
+				_type4 = ClearCacheAspect.GetType(this, null);
+			}
+
+			CacheAspect.ClearCache(_type4);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Aspects/ClearCacheAspect.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,11 @@
+<% title # ClearCache aspect %>
+<% group # Cache aspect %>
+<p class="j">
+The <b>ClearCache</b> attribute clears cached data for the provided method.
+</p>
+
+ClearCacheAspect.cs
+<% ..\..\..\HowTo\Aspects\ClearCacheAspect.cs %>
+
+BLToolkit type builder will generate the following for the class above:
+<% Doc\Aspects\ClearCacheAspect.cs %>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Aspects/CounterAspect.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,68 @@
+[BLToolkitGenerated]
+public sealed class TestClass : CounterAspectTest.TestClass
+{
+	private static CallMethodInfo _methodInfo;
+	private static IInterceptor   _interceptor;
+
+	public override void TestMethod()
+	{
+		if (_methodInfo == null)
+		{
+			_methodInfo = new CallMethodInfo((MethodInfo)MethodBase.GetCurrentMethod());
+		}
+
+		InterceptCallInfo info = new InterceptCallInfo();
+
+		try
+		{
+			info.Object          = this;
+			info.CallMethodInfo  = _methodInfo;
+			info.InterceptResult = InterceptResult.Continue;
+			info.InterceptType   = InterceptType.BeforeCall;
+
+			if (_interceptor == null)
+			{
+				_interceptor = new CounterAspect();
+				_interceptor.Init(_methodInfo, null);
+			}
+
+			// 'BeforeCall' creates or gets a counter for the method and 
+			// registers the current call.
+			// See the [link][file]Aspects/CounterAspect.cs[/file]CounterAspect.BeforeCall[/link] method for details.
+			//
+			_interceptor.Intercept(info);
+
+			if (info.InterceptResult != InterceptResult.Return)
+			{
+				// Target method call.
+				//
+				base.TestMethod();
+			}
+		}
+		catch (Exception exception)
+		{
+			info.Exception       = exception;
+			info.InterceptResult = InterceptResult.Continue;
+			info.InterceptType   = InterceptType.OnCatch;
+
+			// 'OnCatch' is required to count calls with exceptions.
+			//
+			_interceptor.Intercept(info);
+
+			if (info.InterceptResult != InterceptResult.Return)
+			{
+				throw;
+			}
+		}
+		finally
+		{
+			info.InterceptResult = InterceptResult.Continue;
+			info.InterceptType   = InterceptType.OnFinally;
+
+			// 'OnFinally' step adds statistic to the method counter.
+			// See the [link][file]Aspects/CounterAspect.cs[/file]CounterAspect.OnFinally[/link] method for details.
+			//
+			_interceptor.Intercept(info);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Aspects/CounterAspect.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+<% title # Counter aspect %>
+<p class="j">This aspect helps to collect statistical information for the members it is applied to.</p>
+
+CounterAspect.cs
+<% ..\..\..\HowTo\Aspects\CounterAspect.cs %>
+
+BLToolkit type builder will generate the following for the class above:
+<% Doc\Aspects\CounterAspect.cs %>
+
+<p class="j">The following picture shows the information collected for data accessors
+of the <i>BLToolkit.Demo.Asp.Net</i> project.</p>
+<img src='counters.png' />
\ No newline at end of file
Binary file Tools/DocGen/Content/Doc/Aspects/Counters.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Aspects/LoggingAspect.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,18 @@
+<% title # Logging aspect %>
+<p class="j">This aspect allows logging some diagnostic information with minimum efforts. 
+All you need to do is to decorate your class with the Log attribute. 
+If you have a class hierarchy you can decorate only your base class. 
+Diagnostic information will be logged for all virtual and abstract members 
+of your abstract class.</p>
+
+LoggingAspect.cs
+<% ..\..\..\HowTo\Aspects\LoggingAspect.cs %>
+
+<p class="j">Here is the logging output.</p>
+
+<% txt #
+4/20/2008 11:19:44 PM: HowTo.Aspects.LoggingAspectTest.BLToolkitExtension.TestClass.Test1(1) - 105 ms.
+
+4/20/2008 11:19:46 PM: HowTo.Aspects.LoggingAspectTest.BLToolkitExtension.TestClass.Test3("3") - 1507 ms
+                       with exception 'System.ApplicationException' - "Test exception.".
+%>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Aspects/MixinAspect.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,26 @@
+[BLToolkitGenerated]
+public sealed class TestClass : MixinAspectTest.TestClass, MixinAspectTest.ITestInterface1, MixinAspectTest.ITestInterface2
+{
+	int MixinAspectTest.ITestInterface1.TestMethod(int value)
+	{
+		if (base._testInterface1 == null)
+			throw new InvalidOperationException("'ITestInterface1._testInterface1' is not initialized.");
+
+		return base._testInterface1.TestMethod(value);
+	}
+
+	int MixinAspectTest.ITestInterface2.TestMethod1(int value)
+	{
+		// The [link][file]Aspects/MixinOverrideAttribute.cs[/file]MixinOverride[/link] attribute enforces direct method call.
+		//
+		return base.TestMethod1(value);
+	}
+
+	int MixinAspectTest.ITestInterface2.TestMethod2(int value)
+	{
+		if (base.TestInterface2 == null)
+			throw new InvalidOperationException("'ITestInterface2.TestInterface2' is null.");
+
+		return base.TestInterface2.TestMethod2(value);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Aspects/MixinAspect.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+<% title # Mixin aspect %>
+<p class="j">A mixin is a... well, <a href='http://en.wikipedia.org/wiki/Mixin'>Wiki</a> describes it much better.</p>
+
+MixinAspect.cs
+<% ..\..\..\HowTo\Aspects\MixinAspect.cs %>
+
+BLToolkit type builder will generate the following for the class above:
+<% Doc\Aspects\MixinAspect.cs %>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Aspects/NoCacheAttribute.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+<% title # NoCache attribute %>
+<% group # Cache aspect %>
+<p class="j">Cache aspect can be applied to entire class. 
+In this case all virtual and abstract member calls will be cached. 
+However you can use the <b>NoCache</b> attribute to exclude particular members from caching.</p>
+
+NoCache.cs
+<% ..\..\..\HowTo\Aspects\NoCache.cs %>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Aspects/NotNull.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,24 @@
+[BLToolkitGenerated]
+public sealed class TestObject : NotNullTest.TestObject
+{
+	public override void Foo1(string str1, string str2, string str3)
+	{
+		if (str2 == null) throw new ArgumentNullException("str2");
+
+		base.Foo1(str1, str2, str3);
+	}
+
+	public override void Foo2(string str1, string str2, string str3)
+	{
+		if (str2 == null) throw new ArgumentNullException("str2", "Null");
+
+		base.Foo2(str1, str2, str3);
+	}
+
+	public override void Foo3(string str1, string str2, string str3)
+	{
+		if (str2 == null) throw new ArgumentNullException("str2", "Null: str2");
+
+		base.Foo3(str1, str2, str3);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Aspects/NotNullAttribute.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+<% title # NotNull attribute %>
+<p class="j">This attribute allows checking a virtual or abstract method parameter if it is null at runtime. 
+BLToolkit type builder will override methods with NotNull parameters and 
+emit code for checking null value at the beginning of the method.</p>
+
+NotNull.cs
+<% ..\..\..\HowTo\Aspects\NotNull.cs %>
+
+BLToolkit type builder will generate the following for the class above:
+<% Doc\Aspects\NotNull.cs %>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Aspects/OverloadAspect.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,21 @@
+[BLToolkitGenerated]
+public sealed class OverloadTestObject : OverloadTestObject
+{
+    [BLToolkitGenerated]
+    public override int Test(int intVal)
+    {
+        return this.Test(intVal, string.Empty);
+    }
+
+    [BLToolkitGenerated]
+    public override int Test(string strVal)
+    {
+        return this.Test(0x0, strVal);
+    }
+
+    [BLToolkitGenerated]
+    public override int Test(int intVal, string strVal, bool boolVal)
+    {
+        return this.Test(intVal, strVal);
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Aspects/OverloadAspect.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+<% title # Async aspect %>
+<p class="j">
+This aspect simplifies method overloading.
+Note the OverloadAspect is not compatible with other type builders that generate a method body.
+If you apply them along with the OverloadAspect to an abstract method, they will be igored.
+</p>
+
+OverloadAspect.cs
+<% ..\..\..\HowTo\Aspects\OverloadAspect.cs %>
+
+BLToolkit type builder will generate the following for the class above:
+<% Doc\Aspects\OverloadAspect.cs %>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Aspects/index.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+<p class="j">All BLToolkit aspects are implemented as attributes and have to be applied to 
+abstract or virtual members of an abstract class. 
+You need to use <b>TypeAccessor&lt;T&gt;.CreateInstance()</b> method to create an instance of the class. 
+BLToolkit class builder creates an actual class and applies aspects to abstract and virtual members 
+by overriding the members and emitting (see <b>System.Reflection.Emit</b> namespace) 
+additional code around them.
+</p>
+<ct_table>
+<ct_hr>
+<ct_item link='AsyncAspect.htm'       label='Async aspect'      /><ct_hr>
+<ct_text>Cache aspect</ct_text>
+<ct_item link='CacheAspect.htm'       label='Cache aspect'      />
+<ct_item link='NoCacheAttribute.htm'  label='NoCache attribute' />
+<ct_item link='ClearCacheAspect.htm'  label='ClearCache aspect' /><ct_hr>
+<ct_item link='CounterAspect.htm'     label='Counter aspect'    /><ct_hr>
+<ct_item link='LoggingAspect.htm'     label='Logging aspect'    /><ct_hr>
+<ct_item link='MixinAspect.htm'       label='Mixin aspect'      /><ct_hr>
+<ct_item link='NotNullAttribute.htm'  label='NotNull attribute' /><ct_hr>
+<ct_item link='OverloadAspect.htm'    label='Overload aspect'   /><ct_hr>
+</ct_table>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/ComponentModel/ObjectBinder.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,25 @@
+<p class="j">
+The <b>ObjectBinder</b> component has been designed to simplify binding controls on a form to objects for FW 1.x.
+Since Microsoft has released FW 2.0 we can use the <b>BindingSource</b> component to bind controls to objects.
+However the <b>ObjectBinder</b> still can be useful as it supports a few features which are not available for the <b>BindingSource</b>.
+Those features are:
+</p>
+
+<ul>
+<li><p class="j">Support for field binding along with property binding.</p></li>
+<li><p class="j">Support for inner class field and property binding such as <i>Order.Address.Line1</i>.</p></li>
+<li><p class="j">Support for the <i>ObjectView</i> feature which is available by assigning an object view type to the 
+<b>ObjectBinder.ObjectViewType</b> property. An object view is an object that implements the <b>IObjectView</b> interface.
+This interface includes only one property - <i>object <b>Object</b> { get; set; }</i>.
+An object view can implement additional properties based on the assosiated object.
+The <b>ObjectBinder</b> will combine all of these properties with main object properties and create a single <b>PropertyDescriptor</b> collection.
+This feature can be used to separate UI presentation logic from business model objects and to keep them clean.
+ObjectView should be a stateless, lightweight object as its single instance can be assigned to many assosiated objects.</p></li>
+<li><p class="j">The <b>ObjectBinder</b> is optimized for high performance applications such real-time multithreaded message processing and
+distribution banking systems. So it does not use reflection to access objects.
+The standard way (which is used by the <b>BindingSource</b>) is to call the <b>TypeDescriptor.GetProperties</b> method
+to get a <b>PropertyDescriptor</b> collection. This method creates property descriptors that access object properties by reflection.
+The <b>ObjectBinder</b> has its own mechanism to avoid unnessasy reflection and boxing/unboxing operations.</p></li>
+</ul>
+
+<p class="j">The dev version of BLToolkit contains a demo project (Demo\WinForms) showing the use of the <b>ObjectBinder</b>.</p>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/ComponentModel/index.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+<% noindex # ObjectBinder component %>
+<p class="j"></p>
+<ct_table>
+<ct_hr>
+<ct_item link="ObjectBinder.htm" label="ObjectBinder"/>
+<ct_hr>
+</ct_table>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/App.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+	<appSettings>
+		<add
+			key   = "ConnectionString"
+			value = "Server=.;Database=BLToolkitData;Integrated Security=SSPI"/>
+	</appSettings>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/App1.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+	<connectionStrings>
+		<add
+			name             = "DemoConnection"
+			connectionString = "Server=.;Database=BLToolkitData;Integrated Security=SSPI"
+			providerName     = "System.Data.SqlClient" />
+	</connectionStrings>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/App2.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+	<appSettings>
+		<!-- MySql configuration -->
+		<add
+			key   = "ConnectionString./*[a]*/MySql/*[/a]*/"
+			value = "..."/>
+		<add
+			key   = "/*[a]*/BLToolkit.DefaultConfiguration/*[/a]*/"
+			value = "/*[a]*/MySql/*[/a]*/"/>
+	</appSettings>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/Close.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,7 @@
+<% group # Methods %>
+<% order # 50 %>
+Close.cs
+<% ..\..\..\HowTo\Data\Close.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/CreateSql.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,3 @@
+<% order # 1111 %>
+Create.sql
+<% ..\..\..\Data\Create Scripts\MsSql.sql %>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/DataProvider/App.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+	<appSettings>
+		<add
+			key   = "/*[a]*/BLToolkit.DataProviders/*[/a]*/"
+			value = "/*[a]*/BLToolkit.Data.DataProvider.OracleDataProvider, SomeAssembly/*[/a]*/"/>
+	</appSettings>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/DataProvider/index.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,54 @@
+<% order # 20 %>
+<p class="j">
+The <b>BLToolkit.DbManager</b> component is a data provider independent wrapper for ADO.NET.
+It means that the <b>DbManager</b> does not use any specific data source classes such as <b>SqlConnection</b>,
+<b>SqlCommand</b>, etc. It uses common classes and interfaces instead.
+All data source specific logic is encapsulated in special classes called <b>DataProviders</b>.
+</p>
+<p class="j">
+The following table lists providers available with <b>BLToolkit</b>:
+</p>
+
+<table class='data'>
+<tr><th>Class</th>                                                                                         <th>Provider Name</th><th>Namespace</th>                      <th>Vendor</th></tr>
+<tr><td><a href='..\..\..\Source\Data\DataProvider\AccessDataProvider.cs.htm'   >AccessDataProvider</a></td>   <td>Access</td>   <td>System.Data.OleDb</td>              <td>Microsoft</td></tr>
+<tr><td><a href='..\..\..\Source\Data\DataProvider\OdbcDataProvider.cs.htm'     >OdbcDataProvider</a></td>     <td>Odbc</td>     <td>System.Data.Odbc</td>               <td>Microsoft</td></tr>
+<tr><td><a href='..\..\..\Source\Data\DataProvider\OleDbDataProvider.cs.htm'    >OleDbDataProvider</a></td>    <td>OleDb</td>    <td>System.Data.OleDb</td>              <td>Microsoft</td></tr>
+<tr><td><a href='..\..\..\Source\Data\DataProvider\OracleDataProvider.cs.htm'   >OracleDataProvider</a></td>   <td>Oracle</td>   <td>System.Data.OracleClient</td>       <td>Microsoft</td></tr>
+<tr><td><a href='..\..\..\Source\Data\DataProvider\SqlDataProvider.cs.htm'      >SqlDataProvider</a></td>      <td>Sql</td>      <td>System.Data.SqlClient</td>          <td>Microsoft</td></tr>
+<tr><td colspan='4' class='hr' style='padding:0'><img width='1' height='1' alt=''/></td></tr>
+<tr><td><a href='..\..\..\Source\Data\DataProvider\DB2DataProvider.cs.htm'      >DB2DataProvider</a></td>      <td>DB2</td>      <td>IBM.Data.DB2</td>                   <td><a href='http://www.ibm.com/software/data/db2/ad/dotnet.html'>IBM</a></td></tr>
+<tr><td><a href='..\..\..\Source\Data\DataProvider\FdpDataProvider.cs.htm'      >FdpDataProvider</a></td>      <td>Fdp</td>      <td>FirebirdSql.Data.FirebirdClient</td><td><a href='http://www.firebirdsql.org/'>Firebird</a></td></tr>
+<tr><td><a href='..\..\..\Source\Data\DataProvider\InformixDataProvider.cs.htm' >InformixDataProvider</a></td> <td>Informix</td> <td>IBM.Data.Informix</td>              <td><a href='http://www.informix.com'>IBM</a></td></tr>
+<tr><td><a href='..\..\..\Source\Data\DataProvider\MySqlDataProvider.cs.htm'    >MySqlDataProvider</a></td>    <td>MySql</td>    <td>MySql.Data.MySqlClient</td>         <td><a href='http://www.mysql.com/'>Sun Microsystems</a></td></tr>
<tr><td><a href='..\..\..\Source\Data\DataProvider\OdpDataProvider.cs.htm'      >OdpDataProvider</a></td>      <td>ODP</td>      <td>Oracle.DataAccess.Client</td>       <td><a href='http://www.oracle.com/technology/tech/windows/odpnet/index.html'>Oracle</a></td></tr>
+<tr><td><a href='..\..\..\Source\Data\DataProvider\SqlCeDataProvider.cs.htm'    >SqlCeDataProvider</a></td>    <td>SqlCe</td>    <td>System.Data.SqlServerCe</td>        <td><a href='http://www.microsoft.com/sql/editions/compact/default.mspx'>Microsoft</a></td></tr>
+<tr><td><a href='..\..\..\Source\Data\DataProvider\SQLiteDataProvider.cs.htm'   >SQLiteDataProvider</a></td>   <td>SQLite</td>   <td>System.Data.SQLite</td>             <td><a href='http://sqlite.phxsoftware.com/'>SQLite.org</a></td></tr>
+<tr><td><a href='..\..\..\Source\Data\DataProvider\SybaseAdoDataProvider.cs.htm'>SybaseAdoDataProvider</a></td><td>SybaseAdo</td><td>System.Data.OleDb</td>              <td>Support for <a href='http://www.datadirect.com/products/ado/index.ssp'>DataDirect Sybase ADO Provider</a></td></tr>
+<tr><td><a href='..\..\..\Source\Data\DataProvider\SybaseDataProvider.cs.htm'   >SybaseDataProvider</a></td>   <td>Sybase</td>   <td>Sybase.Data.AseClient</td>          <td><a href='http://www.sybase.com/products/allproductsa-z/softwaredeveloperkit'>Sybase</a></td></tr>
+<tr><td colspan='4' class='hr' style='padding:0'><img width='1' height='1' alt=''/></td></tr>
+</table>
+
+<p class="j">
+The first five providers are preregistered in the library and are ready to use. 
+The remaining providers need additional configuration as they require references to 3rd party components.
+</p>
+
+<p class="j">
+You can add a listed above or your own data provider into your project and register it as shown below:
+</p>
+
+AddDataProvider.cs
+<% ..\..\..\HowTo\Data\DataProvider\AddDataProvider.cs %>
+
+<p class="j">
+Also a data provider can be registered by configuration file:
+</p>
+
+App.config
+<% Doc\Data\DataProvider\App.config %>
+
+Also you can use BLToolkit config section.
+
+<% ..\..\..\UnitTests\Linq\App.config %>
+
+Here <i>UnitTests.Linq</i> assembly name should be replaces by your own.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/DbManagerVsAdo.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,17 @@
+<% title # Compare DbManager with ADO.NET %>
+<% order # 1 %>
+<p class="j">
+This example contains two demos to demonstrate the difference between <b>ADO.NET</b> and <b>BLToolkit</b>.
+The <b>AdoDemo</b> represents a typical data access method which takes one parameter and
+returns a list of objects. All routine mapping work is done manually inside the method.
+</p>
+AdoDemo.cs
+<% ..\..\..\HowTo\Data\AdoDemo.cs %>
+<p class="j">
+The <b>DbManagerDemo</b> does the same work performed by <b>BLToolkit.DbManager</b>.
+</p>
+DbManagerDemo.cs
+<% ..\..\..\HowTo\Data\DbManagerDemo.cs %>
+App.config
+<% Doc\Data\App1.config %>
+<a href="CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/ExecuteDataSet.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,7 @@
+<% group # Execute Methods %>
+<% order # 100 %>
+ExecuteDataSet.cs
+<% ..\..\..\HowTo\Data\ExecuteDataSet.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/ExecuteDataTable.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,6 @@
+<% group # Execute Methods %>
+ExecuteDataTable.cs
+<% ..\..\..\HowTo\Data\ExecuteDataTable.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/ExecuteDictionary.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,11 @@
+<% group # Execute Methods %>
+ExecuteDictionary.cs
+<% ..\..\..\HowTo\Data\ExecuteDictionary.cs %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/ExecuteForEach.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,16 @@
+<% group # Execute Methods %>
+<p class='j'>
+The <b>ExecuteForEach</b> method executes an SQL statement for every item in the provided collection
+and returns the number of rows affected.
+</p>
+
+ExecuteForEach.cs
+<% ..\..\..\HowTo\Data\ExecuteForEach.cs %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/ExecuteList.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,6 @@
+<% group # Execute Methods %>
+ExecuteList.cs
+<% ..\..\..\HowTo\Data\ExecuteList.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/ExecuteNonQuery.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+<% group # Execute Methods %>
+<p class='j'>
+The <b>ExecuteNonQuery</b> executes an SQL statement and returns the number of rows affected.
+</p>
+
+ExecuteNonQuery.cs
+<% ..\..\..\HowTo\Data\ExecuteNonQuery.cs %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/ExecuteObject.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,6 @@
+<% group # Execute Methods %>
+ExecuteObject.cs
+<% ..\..\..\HowTo\Data\ExecuteObject.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/ExecuteReader.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,6 @@
+<% group # Execute Methods %>
+ExecuteReader.cs
+<% ..\..\..\HowTo\Data\ExecuteReader.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/ExecuteResultSet.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,6 @@
+<% group # Execute Methods %>
+ComplexMapping.cs
+<% ..\..\..\HowTo\Data\ComplexMapping.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/ExecuteScalar.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,6 @@
+<% group # Execute Methods %>
+ExecuteScalar.cs
+<% ..\..\..\HowTo\Data\ExecuteScalar.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/ExecuteScalarDictionary.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+<% group # Execute Methods %>
+<p class='j'>
+The <b>ExecuteScalarDictionary</b> method executes the query, and returns the dictionary.
+The keys are loaded from a column specified by the <i>keyField</i> parameter and
+values are loaded from a column specified by the <i>valueField</i>. Other columns are ignored.
+</p>
+
+ExecuteScalarDictionary.cs
+<% ..\..\..\HowTo\Data\ExecuteScalarDictionary.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/ExecuteScalarList.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+<% group # Execute Methods %>
+<p class='j'>
+The <b>ExecuteScalarList</b> method executes the query and returns a list of values of the
+specified column of the every row in the resultset returned by the query.
+Other columns are ignored.
+</p>
+
+ExecuteScalarList.cs
+<% ..\..\..\HowTo\Data\ExecuteScalarList.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/Linq.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,35 @@
+<p class='j'>Data providers supported.</p>
+
+<table class='data'>
+<tr><th>Data Provider</th>    <th>Provider Name</th>  <th>Namespace</th>                       <th>Vendor</th></tr>
+<tr><td>AccessDataProvider</td>   <td>Access</td>     <td>System.Data.OleDb</td>               <td>Microsoft</td></tr>
+<tr><td>DB2DataProvider</td>      <td>DB2</td>        <td>IBM.Data.DB2</td>                    <td><a href='http://www.ibm.com/software/data/db2/ad/dotnet.html'>IBM</a></td></tr>
+<tr><td>InformixDataProvider</td> <td>Informix</td>   <td>IBM.Data.Informix</td>               <td><a href='http://www.informix.com'>IBM</a></td></tr>
+<tr><td>FdpDataProvider</td>      <td>Fdp</td>        <td>FirebirdSql.Data.FirebirdClient</td> <td><a href='http://www.firebirdsql.org/'>Firebird</a></td></tr>
+<tr><td>MySqlDataProvider</td>    <td>MySql</td>      <td>MySql.Data.MySqlClient</td>          <td><a href='http://www.mysql.com/'>Sun Microsystems</a></td></tr>
<tr><td>OdpDataProvider</td>      <td>ODP</td>        <td>Oracle.DataAccess.Client</td>        <td><a href='http://www.oracle.com/technology/tech/windows/odpnet/index.html'>Oracle</a></td></tr>
+<tr><td>PostgreSQLProvider</td>   <td>PostgreSQL</td> <td>Npgsql</td>                          <td><a href='http://npgsql.projects.postgresql.org/'>PostgreSQL.org</a></td></tr>
+<tr><td>SqlCeDataProvider</td>    <td>SqlCe</td>      <td>System.Data.SqlServerCe</td>         <td><a href='http://www.microsoft.com/sql/editions/compact/default.mspx'>Microsoft</a></td></tr>
+<tr><td>SQLiteDataProvider</td>   <td>SQLite</td>     <td>System.Data.SQLite</td>              <td><a href='http://sqlite.phxsoftware.com/'>SQLite.org</a></td></tr>
+<tr><td>SqlDataProvider</td>      <td>Sql</td>        <td>System.Data.SqlClient</td>           <td>Microsoft</td></tr>
+<tr><td>SybaseDataProvider</td>   <td>Sybase</td>     <td>Sybase.Data.AseClient</td>           <td><a href='http://www.sybase.com/products/allproductsa-z/softwaredeveloperkit'>Sybase</a></td></tr>
+<tr><td colspan='4' class='hr' style='padding:0'><img width='1' height='1' alt=''/></td></tr>
+</table>
+
+<p class='j'>Operators.</p>
+<% table # Doc\Data\LinqOperators.txt %>
+
+<p class='j'>Core string functions.<br>
+<% table # Doc\Data\LinqStringCoreFunctions.txt %>
+
+<p class='j'>Extended Linq string functions.</p>
+<i>To support methods listed below provider must implement all used functions.</i></p>
+<% table # Doc\Data\LinqStringFunctions.txt %>
+
+<p class='j'>Core datetime functions.<br>
+<% table # Doc\Data\LinqDateTimeCoreFunctions.txt %>
+
+<p class='j'>Extended Linq datetime functions.</p>
+<% table # Doc\Data\LinqDateTimeFunctions.txt %>
+
+<p class='j'>SQL transformations.</p>
+<% table # Doc\Data\LinqSqlTransformations.txt %>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/LinqDateTimeCoreFunctions.txt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,47 @@
+*
+| Current Timestamp | Sql.CurrentTimestamp | CURRENT_TIMESTAMP
+| Current Timestamp | Sql.GetDate()        | CURRENT_TIMESTAMP
+
+* DB2
+| Current Timestamp | Sql.CurrentTimestamp | CURRENT_TIMESTAMP
+| Current Timestamp | Sql.GetDate()        | CURRENT_TIMESTAMP
+
+* Informix
+| Current Timestamp | Sql.CurrentTimestamp | CURRENT
+| Current Timestamp | Sql.GetDate()        | CURRENT
+
+* Oracle
+| Current Timestamp | Sql.CurrentTimestamp | CURRENT_TIMESTAMP
+| Current Timestamp | Sql.GetDate()        | CURRENT_TIMESTAMP
+
+* Firebird
+| Current Timestamp | Sql.CurrentTimestamp | CURRENT_TIMESTAMP
+| Current Timestamp | Sql.GetDate()        | CURRENT_TIMESTAMP
+
+* PostgreSQL
+| Current Timestamp | Sql.CurrentTimestamp | CURRENT_TIMESTAMP
+| Current Timestamp | Sql.GetDate()        | CURRENT_TIMESTAMP
+
+* MySql
+| Current Timestamp | Sql.CurrentTimestamp | CURRENT_TIMESTAMP
+| Current Timestamp | Sql.GetDate()        | CURRENT_TIMESTAMP
+
+* MS SQL
+| Current Timestamp | Sql.CurrentTimestamp | CURRENT_TIMESTAMP
+| Current Timestamp | Sql.GetDate()        | CURRENT_TIMESTAMP
+
+* SqlCe
+| Current Timestamp | Sql.CurrentTimestamp | GetDate()
+| Current Timestamp | Sql.GetDate()        | GetDate()
+
+* Sybase
+| Current Timestamp | Sql.CurrentTimestamp | GetDate()
+| Current Timestamp | Sql.GetDate()        | GetDate()
+
+* SQLite
+| Current Timestamp | Sql.CurrentTimestamp | CURRENT_TIMESTAMP
+| Current Timestamp | Sql.GetDate()        | CURRENT_TIMESTAMP
+
+* Access
+| Current Timestamp | Sql.CurrentTimestamp | Now
+| Current Timestamp | Sql.GetDate()        | Now
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/LinqDateTimeFunctions.txt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,2 @@
+* All data providers
+| Current Timestamp | DateTime.Now | Sql.CurrentTimestamp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/LinqOperators.txt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,117 @@
+* DB2
+| Modulo        | a % b             | Mod(a, b)
+| Bitwise AND   | a & b             | BitAnd(a, b)
+| Bitwise OR    | a || b            | BitOr(a, b)
+| Bitwise XOR   | a ^ b             | BitXor(a, b)
+| Coalesce      | a ?? b            | Coalesce(a, b)
+| Coalesce      | a ?? b ?? c       | Coalesce(a, b, c)
+| Conditional   | a ? b : c         | CASE WHEN a THEN b ELSE c END
+| Conditional   | a ? b : c ? d : e | CASE WHEN a THEN b WHEN c THEN d ELSE e END
+| Concatenation | a + b + c         | a || b || c
+
+* Informix
+| Modulo        | a % b             | Mod(a, b)
+| Bitwise AND   | a & b             | BitAnd(a, b)
+| Bitwise OR    | a || b            | BitOr(a, b)
+| Bitwise XOR   | a ^ b             | BitXor(a, b)
+| Coalesce      | a ?? b            | Nvl(a, b)
+| Coalesce      | a ?? b ?? c       | Nvl(a, b, c)
+| Conditional   | a ? b : c         | CASE WHEN a THEN b ELSE c END
+| Conditional   | a ? b : c ? d : e | CASE WHEN a THEN b WHEN c THEN d ELSE e END
+| Concatenation | a + b + c         | a || b || c
+
+* Oracle
+| Modulo        | a % b             | Mod(a, b)
+| Bitwise AND   | a & b             | BitAnd(a, b)
+| Bitwise OR    | a || b            | (a + b) - BitAnd(a, b)
+| Bitwise XOR   | a ^ b             | (a + b) - BitAnd(a, b) * 2
+| Coalesce      | a ?? b            | Nvl(a, b)
+| Coalesce      | a ?? b ?? c       | Nvl(a, b, c)
+| Conditional   | a ? b : c         | CASE WHEN a THEN b ELSE c END
+| Conditional   | a ? b : c ? d : e | CASE WHEN a THEN b WHEN c THEN d ELSE e END
+| Concatenation | a + b + c         | a || b || c
+
+* Firebird
+| Modulo        | a % b             | Mod(a, b)
+| Bitwise AND   | a & b             | Bin_And(a, b)
+| Bitwise OR    | a || b            | Bin_Or(a, b)
+| Bitwise XOR   | a ^ b             | Bin_Xor(a, b)
+| Coalesce      | a ?? b            | Coalesce(a, b)
+| Coalesce      | a ?? b ?? c       | Coalesce(a, b, c)
+| Conditional   | a ? b : c         | CASE WHEN a THEN b ELSE c END
+| Conditional   | a ? b : c ? d : e | CASE WHEN a THEN b WHEN c THEN d ELSE e END
+| Concatenation | a + b + c         | a || b || c
+
+* PostgreSQL
+| Modulo        | a % b             | a % b
+| Bitwise AND   | a & b             | a & b
+| Bitwise OR    | a || b            | a || b
+| Bitwise XOR   | a ^ b             | a # b
+| Coalesce      | a ?? b            | Coalesce(a, b)
+| Coalesce      | a ?? b ?? c       | Coalesce(a, b, c)
+| Conditional   | a ? b : c         | CASE WHEN a THEN b ELSE c END
+| Conditional   | a ? b : c ? d : e | CASE WHEN a THEN b WHEN c THEN d ELSE e END
+| Concatenation | a + b + c         | a || b || c
+
+* MySql
+| Modulo        | a % b             | a % b
+| Bitwise AND   | a & b             | a & b
+| Bitwise OR    | a || b            | a || b
+| Bitwise XOR   | a ^ b             | a ^ b
+| Coalesce      | a ?? b            | Coalesce(a, b)
+| Coalesce      | a ?? b ?? c       | Coalesce(a, b, c)
+| Conditional   | a ? b : c         | CASE WHEN a THEN b ELSE c END
+| Conditional   | a ? b : c ? d : e | CASE WHEN a THEN b WHEN c THEN d ELSE e END
+| Concatenation | a + b + c         | Concat(a, b, c)
+
+* MS SQL
+| Modulo        | a % b             | a % b
+| Bitwise AND   | a & b             | a & b
+| Bitwise OR    | a || b            | a || b
+| Bitwise XOR   | a ^ b             | a ^ b
+| Coalesce      | a ?? b            | Coalesce(a, b)
+| Coalesce      | a ?? b ?? c       | Coalesce(a, b, c)
+| Conditional   | a ? b : c         | CASE WHEN a THEN b ELSE c END
+| Conditional   | a ? b : c ? d : e | CASE WHEN a THEN b WHEN c THEN d ELSE e END
+| Concatenation | a + b + c         | a + b + c
+
+* SqlCe
+| Modulo        | a % b             | a % b
+| Bitwise AND   | a & b             | a & b
+| Bitwise OR    | a || b            | a || b
+| Bitwise XOR   | a ^ b             | a ^ b
+| Coalesce      | a ?? b            | Coalesce(a, b)
+| Coalesce      | a ?? b ?? c       | Coalesce(a, b, c)
+| Conditional   | a ? b : c         | CASE WHEN a THEN b ELSE c END
+| Conditional   | a ? b : c ? d : e | CASE WHEN a THEN b WHEN c THEN d ELSE e END
+| Concatenation | a + b + c         | a + b + c
+
+* Sybase
+| Modulo        | a % b             | a % b
+| Bitwise AND   | a & b             | a & b
+| Bitwise OR    | a || b            | a || b
+| Bitwise XOR   | a ^ b             | a ^ b
+| Coalesce      | a ?? b            | Coalesce(a, b)
+| Coalesce      | a ?? b ?? c       | Coalesce(a, b, c)
+| Conditional   | a ? b : c         | CASE WHEN a THEN b ELSE c END
+| Conditional   | a ? b : c ? d : e | CASE WHEN a THEN b WHEN c THEN d ELSE e END
+| Concatenation | a + b + c         | a + b + c
+
+* SQLite
+| Modulo        | a % b             | a % b
+| Bitwise AND   | a & b             | a & b
+| Bitwise OR    | a || b            | a || b
+| Bitwise XOR   | a ^ b             | (a + b) - (a & b) * 2
+| Coalesce      | a ?? b            | Coalesce(a, b)
+| Coalesce      | a ?? b ?? c       | Coalesce(a, b, c)
+| Conditional   | a ? b : c         | CASE WHEN a THEN b ELSE c END
+| Conditional   | a ? b : c ? d : e | CASE WHEN a THEN b WHEN c THEN d ELSE e END
+| Concatenation | a + b + c         | a || b || c
+
+* Access
+| Modulo        | a % b             | a MOD b
+| Coalesce      | a ?? b            | Iif(a IS NULL, b, a)
+| Coalesce      | a ?? b ?? c       | Iif(a IS NULL, Iif(b IS NULL, c, b), a)
+| Conditional   | a ? b : c         | Iif(a, b, c)
+| Conditional   | a ? b : c ? d : e | Iif(a, b, Iif(c, d, e))
+| Concatenation | a + b + c         | a + b + c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/LinqSqlTransformations.txt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,42 @@
+* DB2
+| SELECT x | db.Select(() => x) | #sql SELECT x \nFROM SYSIBM.SYSDUMMY1 \nFETCH FIRST 1 ROW ONLY
+| TAKE x   | query.Take(x)      | #sql ... FETCH FIRST x ROWS ONLY
+
+* Informix
+| SELECT x | db.Select(() => x) | #sql SELECT FIRST 1 x\nFROM SYSTABLES
+| TAKE x   | query.Take(x)      | #sql SELECT FIRST x
+
+* Oracle
+| SELECT x | db.Select(() => x) | #sql SELECT x \nFROM SYS.DUAL
+| TAKE x   | query.Take(x)      | #sql ... WHERE rownum <= x
+
+* Firebird
+| SELECT x | db.Select(() => x) | #sql SELECT x \nFROM rdb$database
+| TAKE x   | query.Take(x)      | #sql SELECT FIRST x
+
+* PostgreSQL
+| SELECT x | db.Select(() => x) | #sql SELECT x
+| TAKE x   | query.Take(x)      | #sql ... LIMIT x
+
+* MySql
+| SELECT x | db.Select(() => x) | #sql SELECT x
+| TAKE x   | query.Take(x)      | #sql ... LIMIT x
+
+* MS SQL
+| SELECT x | db.Select(() => x) | #sql SELECT x
+| TAKE x   | query.Take(x)      | #sql SELECT TOP x
+
+* SqlCe
+| SELECT x | db.Select(() => x) | #sql SELECT x
+
+* Sybase
+| SELECT x | db.Select(() => x) | #sql SELECT x
+| TAKE x   | query.Take(x)      | #sql SELECT TOP x
+
+* SQLite
+| SELECT x | db.Select(() => x) | #sql SELECT x
+| TAKE x   | query.Take(x)      | #sql ... LIMIT x
+
+* Access
+| SELECT x | db.Select(() => x) | #sql SELECT x
+| TAKE x   | query.Take(x)      | #sql SELECT TOP x
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/LinqStringCoreFunctions.txt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,166 @@
+*
+| LIKE      | s.Contains("abc")               | s LIKE '%abc%'
+| LIKE      | s.Contains("a%b")               | s LIKE '%a~%b%' ESCAPE '~'
+| LIKE      | s.Contains(str)                 | s LIKE @str ESCAPE '~'
+| LIKE      | !s.Contains(a)                  | s NOT LIKE a
+| LIKE      | s.StartsWith("abc")             | s LIKE 'abc%'
+| LIKE      | s.EndsWith("abc")               | s LIKE '%abc'
+| LIKE      | SqlMethods.Like(s, "%abc%")     | s LIKE '%abc%'
+| LIKE      | SqlMethods.Like(s, "a~%b", '~') | s LIKE "a~%b" ESCAPE '~'
+| LIKE      | Sql.Like(s, "%abc%")            | s LIKE '%abc%'
+| LIKE      | Sql.Like(s, "a~%b", '~')        | s LIKE "a~%b" ESCAPE '~'
+| Length    | Sql.Length(s)                   | Length(s)
+| Trim      | Sql.Trim(s)                     | Trim(s)
+| Trim      | Sql.TrimLeft(s)                 | LTrim(s)
+| Trim      | Sql.TrimRight(s)                | RTrim(s)
+| Case      | Sql.Lower(s)                    | Lower(s)
+| Case      | Sql.Upper(s)                    | Upper(s)
+
+* DB2
+| CharIndex | Sql.CharIndex(a, s)             | Locate(a, s)
+| CharIndex | Sql.CharIndex(a, s, b)          | Locate(a, s, b)
+| Substring | Sql.Substring(s, a, b)          | Substr(s, a, b)
+| Substring | Sql.Left(s, a)                  | Left(s, a)
+| Substring | Sql.Right(s, a)                 | Right(s, a)
+| Stuff     | Sql.Stuff(s, a, b, c)           | Substring(s, 1, a-1) + c + Substring(s, a+b, Length(s)-a-b+1))
+| Space     | Sql.Space(a)                    | VarChar(<br>&nbsp;Repeat(' ', a), 1000)
+| Pad       | Sql.PadRight(s, a, b)           | s || VarChar(Repeat(<br>&nbsp;b, a-Length(s)), 1000)
+| Pad       | Sql.PadLeft(s, a, b)            | VarChar(Repeat(b,<br>&nbsp;a-Length(s)), 1000) || s
+| Replace   | Sql.Replace(s, a, b)            | Replace(s, a, b)
+
+* Informix
+| LIKE      | !s.Contains(a)                  | NOT s LIKE a
+| Substring | Sql.Substring(s, a, b)          | Substr(s, a, b)
+| Substring | Sql.Left(s, a)                  | Substr(s, 1, a)
+| Substring | Sql.Right(s, a)                 | Substr(s,<br>&nbsp;&nbsp;Length(s)-a+1, a)
+| Stuff     | Sql.Stuff(s, a, b, c)           | Substring(s, 1, a-1) + c + Substring(s, a+b, Length(s)-a-b+1))
+| Space     | Sql.Space(a)                    | RPad(' ', a, ' ')
+| Pad       | Sql.PadRight(s, a, b)           | RPad(s, a, b)
+| Pad       | Sql.PadLeft(s, a, b)            | LPad(s, a, b)
+| Replace   | Sql.Replace(s, a, b)            | Replace(s, a, b)
+
+* Oracle
+| CharIndex | Sql.CharIndex(a, s)             | InStr(s, a)
+| CharIndex | Sql.CharIndex(a, s, b)          | InStr(s, a, b)
+| Substring | Sql.Substring(s, a, b)          | Substr(s, a, b)
+| Substring | Sql.Left(s, a)                  | Substr(s, 1, a)
+| Substring | Sql.Right(s, a)                 | Substr(s,<br>&nbsp;&nbsp;Length(s)-a+1, a)
+| Reverse   | Sql.Reverse(s)                  | Reverse(s)
+| Stuff     | Sql.Stuff(s, a, b, c)           | Substring(s, 1, a-1) + c + Substring(s, a+b, Length(s)-a-b+1))
+| Space     | Sql.Space(a)                    | RPad(' ', a, ' ')
+| Pad       | Sql.PadRight(s, a, b)           | RPad(s, a, b)
+| Pad       | Sql.PadLeft(s, a, b)            | LPad(s, a, b)
+| Replace   | Sql.Replace(s, a, b)            | Replace(s, a, b)
+
+* Firebird
+| Length    | Sql.Length(s)                   | Char_Length(s)
+| Substring | Sql.Substring(s, a, b)          | Substring(<br>&nbsp;s from a for b)
+| Substring | Sql.Left(s, a)                  | Left(s, a)
+| Substring | Sql.Right(s, a)                 | Right(s, a)
+| Reverse   | Sql.Reverse(s)                  | Reverse(s)
+| Stuff     | Sql.Stuff(s, a, b, c)           | Substring(s, 1, a-1) + c + Substring(s, a+b, Length(s)-a-b+1))
+| Space     | Sql.Space(a)                    | RPad(' ', a, ' ')
+| Pad       | Sql.PadRight(s, a, b)           | RPad(s, a, b)
+| Pad       | Sql.PadLeft(s, a, b)            | LPad(s, a, b)
+| Replace   | Sql.Replace(s, a, b)            | Replace(s, a, b)
+
+* PostgreSQL
+| CharIndex | Sql.CharIndex(a, s)             | Position(a in s)
+| CharIndex | Sql.CharIndex(a, s, b)          | Position(a in Substring(s, b, <br>&nbsp;&nbsp;Length(s)-b)) + b-1
+| Substring | Sql.Substring(s, a, b)          | Substring(s, a, b)
+| Substring | Sql.Left(s, a)                  | Substring(s, 1, a)
+| Substring | Sql.Right(s, a)                 | Substring(s, Length(s)-a+1, a)
+| Reverse   | Sql.Reverse(s)                  | Reverse(s) -- <i>implemented as UDF<i>
+| Stuff     | Sql.Stuff(s, a, b, c)           | Substring(s, 1, a-1) + c + Substring(s, a+b, Length(s)-a-b+1))
+| Space     | Sql.Space(a)                    | Repeat(' ', a)
+| Pad       | Sql.PadRight(s, a, b)           | RPad(s, a, b)
+| Pad       | Sql.PadLeft(s, a, b)            | LPad(s, a, b)
+| Replace   | Sql.Replace(s, a, b)            | Replace(s, a, b)
+
+* MySql
+| CharIndex | Sql.CharIndex(a, s)             | Locate(a, s)
+| CharIndex | Sql.CharIndex(a, s, b)          | Locate(a, s, b)
+| Substring | Sql.Substring(s, a, b)          | Substring(s, a, b)
+| Substring | Sql.Left(s, a)                  | Left(s, a)
+| Substring | Sql.Right(s, a)                 | Right(s, a)
+| Reverse   | Sql.Reverse(s)                  | Reverse(s)
+| Stuff     | Sql.Stuff(s, a, b, c)           | Substring(s, 1, a-1) + c + Substring(s, a+b, Length(s)-a-b+1))
+| Space     | Sql.Space(a)                    | Space(a)
+| Pad       | Sql.PadRight(s, a, b)           | RPad(s, a, b)
+| Pad       | Sql.PadLeft(s, a, b)            | LPad(s, a, b)
+| Replace   | Sql.Replace(s, a, b)            | Replace(s, a, b)
+
+* MS SQL
+| Length    | Sql.Length(s)                   | Len(s)
+| CharIndex | Sql.CharIndex(a, s)             | CharIndex(a, s)
+| CharIndex | Sql.CharIndex(a, s, b)          | CharIndex(a, s, b)
+| Substring | Sql.Substring(s, a, b)          | Substring(s, a, b)
+| Substring | Sql.Left(s, a)                  | Left(s, a)
+| Substring | Sql.Right(s, a)                 | Right(s, a)
+| Reverse   | Sql.Reverse(s)                  | Reverse(s)
+| Stuff     | Sql.Stuff(s, a, b, c)           | Stuff(s, a, b, c)
+| Space     | Sql.Space(a)                    | Space(a)
+| Pad       | Sql.PadRight(s, a, b)           | s + Replicate(b, a - Len(s))
+| Pad       | Sql.PadLeft(s, a, b)            | Replicate(b, a - Len(s)) + s
+| Replace   | Sql.Replace(s, a, b)            | Replace(s, a, b)
+| Trim      | Sql.Trim(s)                     | LTrim(RTrim(s))
+
+* SqlCe
+| Length    | Sql.Length(s)                   | Len(s)
+| CharIndex | Sql.CharIndex(a, s)             | CharIndex(a, s)
+| CharIndex | Sql.CharIndex(a, s, b)          | CharIndex(a, s, b)
+| Substring | Sql.Substring(s, a, b)          | Substring(s, a, b)
+| Substring | Sql.Left(s, a)                  | Substring(s, 1, a)
+| Substring | Sql.Right(s, a)                 | Substring(s,<br>&nbsp;&nbsp;Len(s)-a+1, a)
+| Stuff     | Sql.Stuff(s, a, b, c)           | Stuff(s, a, b, c)
+| Space     | Sql.Space(a)                    | Space(a)
+| Pad       | Sql.PadRight(s, a, b)           | s + Replicate(b, a - Len(s))
+| Pad       | Sql.PadLeft(s, a, b)            | Replicate(b, a - Len(s)) + s
+| Replace   | Sql.Replace(s, a, b)            | Replace(s, a, b)
+| Trim      | Sql.Trim(s)                     | LTrim(RTrim(s))
+
+* Sybase
+| Length    | Sql.Length(s)                   | Len(s)
+| CharIndex | Sql.CharIndex(a, s)             | CharIndex(a, s)
+| CharIndex | Sql.CharIndex(a, s, b)          | CharIndex(a,Substring(<br>&nbsp;&nbsp;s, b, Len(s)-b)) + b - 1
+| Substring | Sql.Substring(s, a, b)          | Substring(s, a, b)
+| Substring | Sql.Left(s, a)                  | Left(s, a)
+| Substring | Sql.Right(s, a)                 | Right(s, a)
+| Reverse   | Sql.Reverse(s)                  | Reverse(s)
+| Stuff     | Sql.Stuff(s, a, b, c)           | Stuff(s, a, b, c)
+| Space     | Sql.Space(a)                    | Space(a)
+| Pad       | Sql.PadRight(s, a, b)           | s + Replicate(b, a - Len(s))
+| Pad       | Sql.PadLeft(s, a, b)            | Replicate(b, a - Len(s)) + s
+| Replace   | Sql.Replace(s, a, b)            | Str_Replace(s, a, b)
+| Trim      | Sql.Trim(s)                     | LTrim(RTrim(s))
+
+* SQLite
+| CharIndex | Sql.CharIndex(a, s)             | CharIndex(a, s)
+| CharIndex | Sql.CharIndex(a, s, b)          | CharIndex(a, s, b)
+| Substring | Sql.Substring(s, a, b)          | Substr(s, a, b)
+| Substring | Sql.Left(s, a)                  | LeftStr(s, a)
+| Substring | Sql.Right(s, a)                 | RigthStr(s, a)
+| Reverse   | Sql.Reverse(s)                  | Reverse(s)
+| Stuff     | Sql.Stuff(s, a, b, c)           | Substring(s, 1, a-1) + c +<br>Substring(s, a+b, Length(s)-a-b+1))
+| Space     | Sql.Space(a)                    | PadR(' ', a)
+| Pad       | Sql.PadRight(s, a, b)           | s + Replicate(b, a - Len(s))
+| Pad       | Sql.PadLeft(s, a, b)            | Replicate(b, a - Len(s)) + s
+| Replace   | Sql.Replace(s, a, b)            | Replace(s, a, b)
+
+* Access
+| LIKE      | s.Contains("a%b")               | s LIKE "%a[%]b%"
+| LIKE      | s.Contains(str)                 | s LIKE @str
+| LIKE      | SqlMethods.Like(s, "a~%b", '~') | s LIKE "a[%]b"
+| LIKE      | Sql.Like(s, "a~%b", '~')        | s LIKE "a[%]b"
+| Length    | Sql.Length(s)                   | Len(s)
+| CharIndex | Sql.CharIndex(a, s)             | InStr(1, s, a, 1)
+| CharIndex | Sql.CharIndex(a, s, b)          | InStr(b, s, a, 1)
+| Substring | Sql.Substring(s, a, b)          | Mid(s, a, b)
+| Substring | Sql.Left(s, a)                  | Left(s, a)
+| Substring | Sql.Right(s, a)                 | Right(s, a)
+| Stuff     | Sql.Stuff(s, a, b, c)           | Substring(s, 1, a-1) + c +<br>Substring(s, a+b, Length(s)-a-b+1))
+| Space     | Sql.Space(a)                    | Space(a)
+| Pad       | Sql.PadRight(s, a, b)           | s + String(a-Len(s), b))
+| Pad       | Sql.PadLeft(s, a, b)            | String(a-Len(s), b)) + s
+| Case      | Sql.Lower(s)                    | LCase(s)
+| Case      | Sql.Upper(s)                    | UCase(s)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/LinqStringFunctions.txt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,24 @@
+* All data providers
+| Length      | s.Length               | Sql.Length(s)
+| Substring   | s.Substring  (a)       | Sql.Substring(s, a + 1, Sql.Length(s) - a)
+| Substring   | s.Substring  (a, b)    | Sql.Substring(s, a + 1, b)
+| IndexOf     | s.IndexOf    (a)       | Sql.Length(a) == 0 ? 0  : (Sql.CharIndex(a, s) ?? 0) - 1
+| IndexOf     | s.IndexOf    (a, b)    | Sql.Length(a) == 0 && Sql.Length(s) > b ? b : (Sql.CharIndex(a, s, b + 1) ?? 0) - 1
+| IndexOf     | s.IndexOf    (a, b, c) | Sql.Length(a) == 0 && Sql.Length(s) > b ? b : (Sql.CharIndex(a, Sql.Left(s, c), b) ?? 0) - 1
+| LastIndexOf | s.LastIndexOf(a)       | Sql.Length(a) == 0 ? Sql.Length(s) - 1 :<br>(Sql.CharIndex(a, s) ?? 0) == 0 ? -1 :<br>&nbsp;&nbsp;Sql.Length(s) - (Sql.CharIndex(Sql.Reverse(a), Sql.Reverse(s)) ?? 0) - Sql.Length(a) + 1
+| LastIndexOf | s.LastIndexOf(a, b)    | Sql.Length(a) == 0 ? b :<br>(Sql.CharIndex(a, s, b + 1) ?? 0) == 0 ? -1 :<br>&nbsp;&nbsp;Sql.Length(s) - (Sql.CharIndex(Sql.Reverse(a), Sql.Reverse(Sql.Substring(s, b + 1, Sql.Length(s) - b))) ?? 0) - Sql.Length(a) + 1
+| LastIndexOf | s.LastIndexOf(a, b, c) | Sql.Length(a) == 0 ? b :<br>(Sql.CharIndex(a, Sql.Left(s, b + c), b + 1) ?? 0) == 0 ? -1 :<br>&nbsp;&nbsp;b + c - (Sql.CharIndex(Sql.Reverse(a), Sql.Reverse(Sql.Substring(s, b + 1, c))) ?? 0) - Sql.Length(a) + 1
+| Insert      | s.Insert     (a, b)    | Sql.Length(s) == a ? s + b : Sql.Stuff(s, a + 1, 0, b)
+| Remove      | s.Remove     (a)       | Sql.Left(s, a)
+| Remove      | s.Remove     (a, b)    | Sql.Stuff(s, a + 1, b, "")
+| Pad         | s.PadLeft    (a)       | Sql.PadLeft(s, a, ' ')
+| Pad         | s.PadLeft    (a, b)    | Sql.PadLeft(s, a, b)
+| Pad         | s.PadRight   (a)       | Sql.PadRight(s, a, ' ')
+| Pad         | s.PadRight   (a, b)    | Sql.PadRight(s, a, b)
+| Replace     | s.Replace    (a, b)    | Sql.Replace(s, a, b)
+| Trim        | s.Trim       ()        | Sql.Trim(s)
+| Trim        | s.TrimEnd    ()        | Sql.TrimRight(s)
+| Trim        | s.TrimStart  ()        | Sql.TrimLeft(s)
+| Case        | s.ToLower    ()        | Sql.Lower(s)
+| Case        | s.ToUpper    ()        | Sql.Upper(s)
+| Compare     | s.CompareTo  (a)       | s > a ? 1 : s == 0 ? 0 : -1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/OpenConfig1.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,46 @@
+<% title # Configure using app.config %>
+<% group # Configuration %>
+<% order # 10 %>
+<p class='j'>
+Since Microsoft has released FW 2.0 and the <b>&lt;connectionStrings&gt;</b> section of
+configuration file is available, it should be used. This configuration method is preferable.
+The following method demonstrates this ability.
+</p>
+OpenConfig1FW2.cs
+<% ..\..\..\HowTo\Data\OpenConfig1FW2.cs %>
+App.config
+<% Doc\Data\App1.config %>
+
+<p class='j'>
+In addition <b>BLToolkit</b> supports an alternative way which uses the <b>&lt;appSettings&gt;</b> section.
+At the bottom of this page you can find a demo <a href='#cfg'>App.config</a> file with a few examples.
+</p>
+<p class='j'>
+<b>BLToolkit</b> recognizes configuration strings in the <b>&lt;appSettings&gt;</b> section 
+by looking for a <b>ConnectionString</b> key prefix. Actual key value can be the following:
+
+<table class='data'>
+<tr><th>key value</th><th>Provider</th><th>Configuration</th></tr>
+<tr><td><span class='kw'>key</span>=<span class='str'>"ConnectionString"</span></td><td align='right'>default provider</td><td align='right'>default configuration</td></tr>
+<tr><td><span class='kw'>key</span>=<span class='str'>"ConnectionString.Foo.Bar"</span></td><td align='right'>'Foo' provider</td><td align='right'>'Bar' configuration</td></tr>
+<tr><td><span class='kw'>key</span>=<span class='str'>"ConnectionString.Foo."</span></td><td align='right'>'Foo' provider</td><td align='right'>default configuration</td></tr>
+<tr><td><span class='kw'>key</span>=<span class='str'>"ConnectionString.Foo"</span></td><td align='right'>default provider</td><td align='right'>'Foo' configuration</td></tr>
+<tr><td align='right'>or</td><td align='right'>'Foo' provider</td><td align='right'>default configuration</td></tr>
+<tr><td><span class='kw'>key</span>=<span class='str'>"ConnectionString..Foo"</span></td><td align='right'>default provider</td><td align='right'>'Foo' configuration</td></tr>
+<tr><td><span class='kw'>key</span>=<span class='str'>"ConnectionString..Foo.Bar"</span></td><td align='right'>default provider</td><td align='right'>'Foo.Bar' configuration</td></tr>
+</table>
+
+Default provider is <b>SqlDataProvider</b>.
+See also <a href='DataProvider/index.htm'>Data Providers</a>.
+</p>
+
+OpenConfig1.cs
+<% ..\..\..\HowTo\Data\OpenConfig1.cs %>
+<a name='cfg'/>App.config
+<% ..\..\..\UnitTests\All\App.config %>
+
+<p class='j'>The default configuration can be set by a configuration file:</p>
+App.config
+<% Doc\Data\App2.config %>
+
+<a href="CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/OpenConfig2.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,11 @@
+<% title # Configure programmatically %>
+<% group # Configuration %>
+<% order # 11 %>
+<p class='j'>
+Connection string can be also assigned programmatically.
+The <b>DbManager.AddConnectionString</b> method can be used for this.
+You should do it once when your application starts.
+</p>
+OpenConfig2.cs
+<% ..\..\..\HowTo\Data\OpenConfig2.cs %>
+<a href="CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/OpenConfig3.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,6 @@
+<% title # Configure by passing objects %>
+<% group # Configuration %>
+<% order # 12 %>
+OpenConfig3.cs
+<% ..\..\..\HowTo\Data\OpenConfig3.cs %>
+<a href="CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/Parameter.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,16 @@
+<% group # Methods %>
+<% order # 3 %>
+<p class='j'>
+The <b>DbManager</b>.<b>Parameter</b> method allows assigning parameters to an SQL query,
+setting parameter values before query, and getting return/out values after.
+</p>
+Parameter.cs
+<% ..\..\..\HowTo\Data\Parameter.cs %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/Prepare.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,16 @@
+<% group # Methods %>
+<% order # 4 %>
+<p class='j'>
+The <b>Prepare</b> method can be useful if you need to execute the same command multiple times.
+</p>
+
+Prepare.cs
+<% ..\..\..\HowTo\Data\Prepare.cs %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/SetCommand.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,23 @@
+<% group # Methods %>
+<% order # 1 %>
+<p class='j'>
+Typical scenario of using <b>DbManager</b> includes the following steps:
+<ul>
+<li>Create a <b>DbManager</b> class instance.
+<li>Set an SQL command or a stored procedure name.
+<li>Call an <b>ExecuteXXX</b> method.
+</ul>
+The <b>SetCommand</b> method is used to set an SQL statement and to provide command parameters, if any.
+</p>
+
+SetCommand.cs
+<% ..\..\..\HowTo\Data\SetCommand.cs %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="CreateSql.htm">Create.sql script</a>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/SetSpCommand.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,22 @@
+<% group # Methods %>
+<% order # 2 %>
+<p class='j'>
+Typical scenario of using <b>DbManager</b> includes the following steps:
+<ul>
+<li>Create a <b>DbManager</b> class instance.
+<li>Set an SQL command or a stored procedure name.
+<li>Call an <b>ExecuteXXX</b> method.
+</ul>
+The <b>SetSpCommand</b> method is used to set a stored procedure name and to provide command parameters, if any.
+</p>
+
+SetSpCommand.cs
+<% ..\..\..\HowTo\Data\SetSpCommand.cs %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/Transaction.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,7 @@
+<% group # Methods %>
+<% order # 5 %>
+Transaction.cs
+<% ..\..\..\HowTo\Data\Transaction.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Data/index.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,34 @@
+<% noindex # %>
+<p class="j">The <b>DbManager</b> class is a high-level, data provider independent wrapper for <b>ADO.NET</b>.
+It has been designed to simplify working with database and encapsulates most of <b>ADO.NET</b> objects
+such as <b>Connection</b>, <b>Transaction</b>, <b>Command</b>, and <b>Parameter</b> in one single object.
+</p>
+<ct_table>
+<ct_hr>
+<ct_item link="DbManagerVsAdo.htm"          label="Compare DbManager with ADO.NET" /><ct_hr>
+<ct_text>How to configure</ct_text>
+<ct_item link="OpenConfig1.htm"             label="Method 1">using app.config.</ct_item>
+<ct_item link="OpenConfig2.htm"             label="Method 2">programmatically.</ct_item>
+<ct_item link="OpenConfig3.htm"             label="Method 3">by passing DataProvider, Connection or Transaction object.</ct_item>
+<ct_hr>
+<ct_item link="DataProvider/index.htm"      label="Data Providers"          /><ct_hr>
+<ct_item link="SetCommand.htm"              label="SetCommand"              >Using SQL statements</ct_item>
+<ct_item link="SetSpCommand.htm"            label="SetSpCommand"            >Using stored procedures</ct_item>
+<ct_item link="Parameter.htm"               label="Parameters"              />
+<ct_item link="Prepare.htm"                 label="Prepare"                 />
+<ct_item link="Transaction.htm"             label="Transactions"            />
+<ct_item link="Close.htm"                   label="Close"                   /><ct_hr>
+<ct_item link="ExecuteDataSet.htm"          label="ExecuteDataSet"          />
+<ct_item link="ExecuteDataTable.htm"        label="ExecuteDataTable"        />
+<ct_item link="ExecuteDictionary.htm"       label="ExecuteDictionary"       />
+<ct_item link="ExecuteForEach.htm"          label="ExecuteForEach"          />
+<ct_item link="ExecuteList.htm"             label="ExecuteList"             />
+<ct_item link="ExecuteNonQuery.htm"         label="ExecuteNonQuery"         />
+<ct_item link="ExecuteObject.htm"           label="ExecuteObject"           />
+<ct_item link="ExecuteReader.htm"           label="ExecuteReader"           />
+<ct_item link="ExecuteResultSet.htm"        label="ExecuteResultSet"        >Complex mapping</ct_item>
+<ct_item link="ExecuteScalar.htm"           label="ExecuteScalar"           />
+<ct_item link="ExecuteScalarDictionary.htm" label="ExecuteScalarDictionary" />
+<ct_item link="ExecuteScalarList.htm"       label="ExecuteScalarList"       />
+<ct_hr>
+</ct_table>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/AbstractAccessor.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,37 @@
+<% group # Abstract accessors %>
+<% order # 20 %>
+
+<p class="j">The following example demonstrates how to create and use an abstract data accessor class.
+All abstract methods of the class are generated at run-time depending on each method declaration.
+Every part of the method declaration is important.
+Method's return value specifies one of the Execute methods in the following way:
+<table class='data'>
+<tr><th>Return Type</th><th>Execute Method</th></tr>
+<tr><td><i>IDataReader</i> interface</td><td>ExecuteReader</td></tr>
+<tr><td>Subclass of <i>DataSet</i></td><td>ExecuteDataSet</td></tr>
+<tr><td>Subclass of <i>DataTable</i></td><td>ExecuteDataTable</td></tr>
+<tr><td>Class implementing the <i>IList</i> interface</td><td><a href="ExecuteList.htm">ExecuteList</a> or <a href="ExecuteList.htm">ExecuteScalarList</a></td></tr>
+<tr><td>Class implementing the <i>IDictionary</i> interface</td><td><a href="ExecuteDictionary.htm">ExecuteDictionary</a> or <a href="ExecuteDictionary.htm">ExecuteScalarDictionary</a></td></tr>
+<tr><td><i>void</i></td><td>ExecuteNonQuery</td></tr>
+<tr><td><i>string</i>, <i>byte[]</i> or value type</td><td><a href="ExecuteScalar.htm">ExecuteScalar</a></td></tr>
+<tr><td>In any other case</td><td><a href="ExecuteObject.htm">ExecuteObject</a></td></tr>
+</table>
+Method name explicitly defines action name which is converted to stored procedure name.<br/>
+Type, sequential order, and name of the method parameters is mapped to the command parameters.
+Exceptions from this rule are:
+<br>
+<div style="margin:-10px 0px -10px -10px"><ul compact="compact">
+<li>a parameter of <a href="../Data/index.htm"><i>DbManager</i></a> type. In this case generator uses provided <a href="../Data/index.htm"><i>DbManager</i></a> to call the command.</li>
+<li>parameters decorated with attribute <i>FormatAttribute</i>.</li>
+</ul></div>
+</p>
+AbstractAccessor.cs
+<% ..\..\..\HowTo\DataAccess\AbstractAccessor.cs %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/ActionName.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+<% group # Abstract accessor attributes %>
+<% order # 50 %>
+
+<p class='j'>
+<b>ActionName</b> is a logical name of an operation. By default a method name is an action name,
+but <b>ActionNameAttribute</b> allows overriding this behavior.
+Actual stored procedure name will be built depending on naming convention which is defined in the
+<a href='Introduction.htm#GetDefaultSpName'>GetDefaultSpName</a> method.
+</p>
+
+ActionName.cs
+<% ..\..\..\HowTo\DataAccess\ActionName.cs %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/ActionSprocName.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+<% group # Abstract accessor attributes %>
+
+<p class='j'>
+The <b>ActionSprocName</b> attribute is applied to a business object (NOT to data accessor class) and
+associates <i>ActionName</i> with stored procedure name.
+</p>
+
+ActionSprocName.cs
+<% ..\..\..\HowTo\DataAccess\ActionSprocName.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/ActualType.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+<% group # Abstract accessor attributes %>
+
+<p class='j'>
+The <b>ActualType</b> attribute associates an actual type with the type returned by an abstract method.
+Note the <b>ObjectType</b> attribute has higher priority.
+</p>
+
+ActualType.cs
+<% ..\..\..\HowTo\DataAccess\ActualType.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/CommandBehavior.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,11 @@
+<% group # Abstract accessor attributes %>
+
+<p class='j'>
+The <b>CommandBehavior</b> attribute provides a description of the results of the query and its effect on the database.
+</p>
+
+CommandBehavior.cs
+<% ..\..\..\HowTo\DataAccess\CommandBehavior.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/CustomSqlQuery1.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,18 @@
+<% title # SqlQuery customization 1 %>
+<% group # Abstract accessor attributes %>
+
+<p class='j'>
+This example demonstrates how to create a custom attribute 
+which allows specifying more than one SQL query for different data providers.
+</p>
+
+CustomSqlQuery1.cs
+<% ..\..\..\HowTo\DataAccess\CustomSqlQuery1.cs %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/CustomSqlQuery2.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,24 @@
+<% title # SqlQuery customization 2 %>
+<% group # Abstract accessor attributes %>
+
+<p class='j'>
+This example demonstrates how to specify SQL query for different data providers by using XML.
+</p>
+
+CustomSqlQuery2.cs
+<% ..\..\..\HowTo\DataAccess\CustomSqlQuery2.cs %>
+
+Sql.xml    <% ..\..\..\HowTo\DataAccess\Sql\Sql.xml    %>
+Access.xml <% ..\..\..\HowTo\DataAccess\Sql\Access.xml %>
+Oracle.xml <% ..\..\..\HowTo\DataAccess\Sql\Oracle.xml %>
+Fdp.xml    <% ..\..\..\HowTo\DataAccess\Sql\Fdp.xml    %>
+SQLite.xml <% ..\..\..\HowTo\DataAccess\Sql\SQLite.xml %>
+
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/DataSetTable.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+<% group # Abstract accessor attributes %>
+
+<p class='j'>
+The <b>DataSetTable</b> attribute specifies table to be populated 
+by the method in destination or returning dataset.
+</p>
+
+DataSetTable.cs
+<% ..\..\..\HowTo\DataAccess\DataSetTable.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/Delete.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+<% group # Basic CRUDL operations and stored procedures %>
+<% order # 204 %>
+
+Delete.cs
+<% ..\..\..\HowTo\DataAccess\Delete.cs %>
+Both <i>DataAccessor.DeleteByKey</i> and <i>DataAccessor.Delete</i> methods generate and execute the following SQL statement:
+<% sql # exec Person_Delete @PersonID=2 %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/DeleteSql.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+<% group # Basic CRUDL operations and SQL text generation %>
+<% order # 154 %>
+
+DeleteSql.cs
+<% ..\..\..\HowTo\DataAccess\DeleteSql.cs %>
+Both <i>DataAccessor.DeleteByKeySql</i> and <i>DataAccessor.DeleteSql</i> methods generate and execute the following SQL statement:
+<% sql #
+DELETE FROM
+	[Person]
+WHERE
+	[PersonID] = @PersonID
+%>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/Destination.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+<% group # Abstract accessor attributes %>
+
+<p class='j'>
+Return value of an abstract method defines a result that this method returns.
+The <b>Destination</b> attribute allows specifying one of the method parameters as the result.
+</p>
+
+Destination.cs
+<% ..\..\..\HowTo\DataAccess\Destination.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/Direction.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,25 @@
+<% group # Abstract accessor attributes %>
+
+<p class='j'>
+The <b>Direction</b> attributes allow controlling mapping from/to a business object.
+The following table contains brief description of the direction attributes:
+
+<table class='data'>
+<tr><th>Attribute</th><th>Description</th></tr>
+<tr><td>Output</td>     <td>Provided members are output parameters of the query.</td></tr>
+<tr><td>InputOutput</td><td>Provided members are input/output parameters of the query.</td></tr>
+<tr><td>Ignore</td>     <td>Provided members are excluded from mapping.</td></tr>
+<tr><td>ReturnValue</td><td>Provided member is mapped to return value.</td></tr>
+</table>
+</p>
+
+Direction.cs
+<% ..\..\..\HowTo\DataAccess\Direction.cs %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/DiscoverParameters.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+<% group # Abstract accessor attributes %>
+
+<p class='j'>
+By default, BLToolkit expects method parameter names to match stored procedure 
+parameter names. The sequential order of parameters is not important in this 
+case. The <b>DiscoverParameters</b> attribute enforces BLToolkit to retrieve parameter
+information from the sproc and to assign method parameters in the order they go.
+Parameter names are ignored.
+</p>
+
+DiscoverParameters.cs
+<% ..\..\..\HowTo\DataAccess\DiscoverParameters.cs %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/ExecuteDictionary.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+<% group # Abstract accessors %>
+<% index # ExecuteDictionary method %>
+
+ExecuteDictionary.cs
+<% ..\..\..\HowTo\DataAccess\ExecuteDictionary.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/ExecuteList.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,13 @@
+<% group # Abstract accessors %>
+<% index # ExecuteList method %>
+
+ExecuteList.cs
+<% ..\..\..\HowTo\DataAccess\ExecuteList.cs %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/ExecuteObject.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,13 @@
+<% group # Abstract accessors %>
+<% index # ExecuteObject method %>
+
+ExecuteObject.cs
+<% ..\..\..\HowTo\DataAccess\ExecuteObject.cs %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/ExecuteScalar.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,13 @@
+<% group # Abstract accessors %>
+<% index # ExecuteScalar method %>
+
+ExecuteScalar.cs
+<% ..\..\..\HowTo\DataAccess\ExecuteScalar.cs %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/Format.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,16 @@
+<% group # Abstract accessor attributes %>
+
+<p class='j'>
+The <b>Format</b> indicates that the specified parameter is used to construct the stored procedure name or SQL statement:
+</p>
+
+Format.cs
+<% ..\..\..\HowTo\DataAccess\Format.cs %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/IndexAttribute.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+<% group # Abstract accessor attributes %>
+<% title # Index %>
+
+ExecuteDictionary.cs
+<% ..\..\..\HowTo\DataAccess\ExecuteDictionary.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/Insert.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+<% group # Basic CRUDL operations and stored procedures %>
+<% order # 202 %>
+
+Insert.cs
+<% ..\..\..\HowTo\DataAccess\Insert.cs %>
+<i>DataAccessor.Insert</i> method generates and executes the following SQL statement:
+<% sql # exec Person_Insert @FirstName='Crazy', @LastName='Frog', @MiddleName=NULL, @Gender='U' %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/InsertSql.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,27 @@
+<% group # Basic CRUDL operations and SQL text generation %>
+<% order # 152 %>
+
+InsertSql.cs
+<% ..\..\..\HowTo\DataAccess\InsertSql.cs %>
+<i>DataAccessor.InsertSql</i> method generates and executes the following SQL statement:
+<% sql #
+INSERT INTO [Person] (
+	[MiddleName],
+	[Gender],
+	[LastName],
+	[FirstName]
+) VALUES (
+	@MiddleName,
+	@Gender,
+	@LastName,
+	@FirstName
+)
+%>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/Introduction.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,629 @@
+<% title # Introduction to abstract data accessors %>
+<% order # 1 %>
+<h4>Introduction</h4>
+
+<p class='j'>
+Before we start talking about the data accessors, let us create a few examples of 
+typical data accessor methods.
+</p>
+<p class='j'>
+The following table contains three stored procedures and 
+three data access methods implementing the stored procedure calls.
+</p>
+
+<table width='100%'>
+<tr><th>Stored procedure</th><th>Data access method</th></tr>
+<tr><td colspan=2 style='padding-top:7px'>
+The first stored procedure takes filter and page parameters and returns recordset from the Person table.
+</td></tr>
+<tr>
+<td width=50% height=100%><% sql #
+CREATE Procedure GetPersonListByName(
+	@firstName  varchar(50),
+	@lastName   varchar(50),
+	@pageNumber int,
+	@pageSize   int)
+AS
+	-- stored procedure implementation
+	--
+%></td>
+<td width=50%><% cs #
+public List<Person> GetPersonListByName(
+	string firstName,
+	string lastName,
+	int    pageNumber,
+	int    pageSize)
+{
+	// method implementation.
+}
+%></td>
+</tr>
+<tr><td colspan=2>
+Second example will return single <b>Person</b> record by <b>id</b>.
+</td></tr>
+<tr>
+<td width=50% height=100%><% sql #
+CREATE Procedure GetPersonByID(@id int)
+AS
+	-- stored procedure implementation
+	--
+%>
+</td>
+<td width=50%><% cs #
+public Person GetPersonByID(int id)
+{
+    // method implementation.
+}
+%></td>
+</tr>
+<tr><td colspan=2>
+The last example will delete a record from the database by <b>id</b>.
+</td></tr>
+<tr>
+<td width=50% height=100%><% sql #
+CREATE Procedure DeletePersonByID(@id int)
+AS
+	-- stored procedure implementation
+	--
+%></td>
+<td width=50%><% cs #
+public void DeletePersonByID(int id)
+{
+    // method implementation.
+}
+%></td>
+</tr>
+</table>
+
+<p class='j'>Now lets see what we can say if we compare the stored procedure and C# method signatures. 
+<ol>
+<li>Stored procedure and method names match up.</li>
+<li>Sequential order, method parameter types and names correspond to stored procedure parameters.</li>
+<li>Methods' return values can give us an idea what <b>Execute</b> method we 
+should utilize and what object type has to be used to map data from recordset if needed.</li>
+</ol>
+</p>
+
+<p class='j'>
+As demonstrated above method definition contains all the information we need 
+to implement the method body. Actually, by defining the method signatures, we 
+completed the most intelligent part of data accessor development. The rest of 
+work is definitely a monkey's job. Honestly, I got bored of being just a coding 
+machine writing the same data access code over and over again, especially 
+understanding that this process can be automated.
+</p>
+<p class='j'>
+This introduction shows how to avoid the implementation step of data access 
+development and how to reduce this routine process to the method declaration.
+</p>
+
+<h4>Abstract classes</h4>
+
+<p class='j'>
+Unfortunately, mainstream .NET languages still do not have a compile-time 
+transformation system like some functional or <a href="http://nemerle.org/Macros">hybrid</a> languages do.
+All we have today is pre-compile- and run-time code generation.
+</p>
+<p class='j'>
+This introduction concentrates on run-time code generation and its support by
+<a href="http://www.bltoolkit.net/">Business Logic Toolkit for .NET</a>.
+</p>
+<p class='j'>
+Let us step back and bring the methods from the previous examples together in one class.
+Ideally, this data accessor class could look like the following:
+</p>
+<% cs #
+using System;
+using System.Collections.Generic;
+
+public class PersonAccessor
+{
+	public List<Person> GetPersonListByName(
+		string firstName, string lastName, int pageNumber, int pageSize);
+
+	public Person GetPersonByID   (int id);
+	public void   DeletePersonByID(int id);
+}
+%>
+
+<p class='j'>
+The bad news about this sample is that we cannot use such syntax as the 
+compiler expects the method's body implementation.
+</p>
+<p class='j'>
+The good news is we can use abstract classes and methods that give us quite 
+similar, compilable source code.
+</p>
+<% cs #
+using System;
+using System.Collections.Generic;
+
+public /*[a]*/abstract/*[/a]*/ class PersonAccessor
+{
+	public /*[a]*/abstract/*[/a]*/ List<Person> GetPersonListByName(
+		string firstName, string lastName, int pageNumber, int pageSize);
+
+	public /*[a]*/abstract/*[/a]*/ Person GetPersonByID   (int id);
+	public /*[a]*/abstract/*[/a]*/ void   DeletePersonByID(int id);
+}
+%>
+
+<p class='j'>This code is 100% valid and our next step is to make it workable.</p>
+
+<H4>Abstract DataAccessor</H4>
+
+<p class='j'>
+Business Logic Toolkit provides the <b>DataAccessor</b> class, which is 
+used as a base class to develop data accessor classes. If we add 
+<b>DataAccessor</b> to our previous example, it will look like the following:
+</p>
+<% cs #
+using System;
+using System.Collections.Generic;
+
+public abstract class PersonAccessor : /*[a]*/DataAccessor/*[/a]*/
+{
+	public abstract List<Person> GetPersonListByName(
+		string firstName, string lastName, int pageNumber, int pageSize);
+
+	public abstract Person GetPersonByID   (int id);
+	public abstract void   DeletePersonByID(int id);
+}
+%>
+
+<p class='j'>That's it! Now this class is complete and fully functional. The code below shows how to use it:</p>
+
+<% cs #
+using System;
+using System.Collections.Generic;
+
+using BLToolkit.Reflection;
+
+namespace DataAccess
+{
+	class Program
+	{
+		static void Main(string[] args)
+		{
+			PersonAccessor pa = /*[a]*/TypeAccessor/*[/a]*/<PersonAccessor>./*[a]*/CreateInstance/*[/a]*/();
+
+			List<Person> list = pa.GetPersonListByName("Crazy", "Frog", 0, 20);
+
+			foreach (Person p in list)
+				Console.Write("{0} {1}", p.FirstName, p.LastName);
+		}
+	}
+}
+%>
+
+<p class='j'>
+The only magic here is the <b>TypeAccessor.CreateInstance</b> method. First of all this 
+method creates a new class inherited from the <b>PersonAccessor</b> class and 
+then generates abstract method bodies depending on each method declaration.
+If we wrote those methods manually, we could get something like the following:
+</p>
+<% cs #
+using System;
+using System.Collections.Generic;
+
+using BLToolkit.Data;
+
+namespace Example.BLToolkitExtension
+{
+	public sealed class PersonAccessor : Example.PersonAccessor
+	{
+		public override List<Person> GetPersonListByName(
+			string firstName,
+			string lastName,
+			int    pageNumber,
+			int    pageSize)
+		{
+			using (DbManager db = GetDbManager())
+			{
+				return db
+					.SetSpCommand("GetPersonListByName",
+						db.Parameter("@firstName",  firstName),
+						db.Parameter("@lastName",   lastName),
+						db.Parameter("@pageNumber", pageNumber),
+						db.Parameter("@pageSize",   pageSize))
+					.ExecuteList<Person>();
+			}
+		}
+
+		public override Person GetPersonByID(int id)
+		{
+			using (DbManager db = GetDbManager())
+			{
+				return db
+					.SetSpCommand("GetPersonByID", db.Parameter("@id", id))
+					.ExecuteObject<Person>();
+			}
+		}
+
+		public override void DeletePersonByID(int id)
+		{
+			using (DbManager db = GetDbManager())
+			{
+				db
+					.SetSpCommand("DeletePersonByID", db.Parameter("@id", id))
+					.ExecuteNonQuery();
+			}
+		}
+	}
+}
+%>
+
+<p class='j'>
+(The <a href='..\Data\index.htm'>DbManager</a> class is another BLToolkit class used for 'low-level' database access).
+</p>
+
+<p class="j">
+Every part of the method declaration is important.
+Method's return value specifies one of the Execute methods in the following way:
+<table class='data'>
+<tr><th>Return Type</th><th>Execute Method</th></tr>
+<tr><td><i>IDataReader</i> interface</td><td>ExecuteReader</td></tr>
+<tr><td>Subclass of <i>DataSet</i></td><td>ExecuteDataSet</td></tr>
+<tr><td>Subclass of <i>DataTable</i></td><td>ExecuteDataTable</td></tr>
+<tr><td>Class implementing the <i>IList</i> interface</td><td><a href="ExecuteList.htm">ExecuteList</a> or <a href="ExecuteList.htm">ExecuteScalarList</a></td></tr>
+<tr><td>Class implementing the <i>IDictionary</i> interface</td><td><a href="ExecuteDictionary.htm">ExecuteDictionary</a> or <a href="ExecuteDictionary.htm">ExecuteScalarDictionary</a></td></tr>
+<tr><td><i>void</i></td><td>ExecuteNonQuery</td></tr>
+<tr><td><i>string</i>, <i>byte[]</i> or value type</td><td><a href="ExecuteScalar.htm">ExecuteScalar</a></td></tr>
+<tr><td>In any other case</td><td><a href="ExecuteObject.htm">ExecuteObject</a></td></tr>
+</table>
+The method name explicitly defines the action name, which is converted to the stored procedure name.
+Type, sequential order, and name of the method parameters are mapped to the command parameters.
+Exceptions from this rule are:
+<br>
+<div style='margin:-10px 0px -0px -10px'><ul compact="compact">
+<li>a parameter of <a href="../Data/index.htm"><i>DbManager</i></a> type. In this case generator uses provided <a href="../Data/index.htm"><i>DbManager</i></a> to call the command.</li>
+<li>parameters decorated with attribute <a href='#FormatAttribute'>FormatAttribute</a>, <a href='#DestinationAttribute'>DestinationAttribute</a>.</li>
+</ul></div>
+</p>
+
+<h4>Generating process control</h4>
+
+<p class='j'>
+The <b>PersonAccessor</b> class above is a very simple example and, of 
+course, it seems too ideal to be real. In real life, we need more flexibility 
+and more control over the generated code. BLToolkit contains a bunch of 
+attributes to control DataAccessor generation in addition to <b>DataAccessor</b> virtual members.
+</p>
+
+<h5>Method CreateDbManager</h5>
+
+<% cs #
+protected virtual DbManager CreateDbManager()
+{
+    return new DbManager();
+}
+%>
+
+<p class='j'>
+By default, this method creates a new instance of <b>DbManager</b> that uses default database configuration.
+You can change this behavior by overriding this method. For example:
+</p>
+<% cs #
+public abstract class OracleDataAccessor : DataAccessor
+{
+	protected override DbManager CreateDbManager()
+	{
+		return new DbManager("Oracle", "Production");
+	}
+}
+%>
+
+<p class='j'>
+This code will use the <i>Oracle</i> data provider and <i>Production</i> configuration.
+</p>
+
+<a name='GetDefaultSpName'></a><h5>Method GetDefaultSpName</h5>
+
+<% cs #
+protected virtual string GetDefaultSpName(string typeName, string actionName)
+{
+	return typeName == null?
+		actionName:
+		string.Format("{0}_{1}", typeName, actionName);
+}
+%>
+
+<p class='j'>
+As I mentioned, the method name explicitly defines the so-called action name.
+The final stored procedure name is created by the <b>GetDefaultSpName</b>
+method. The default implementation uses the following naming convention:
+</p>
+
+<ul>
+<li>
+If type name is provided, the method constructs the stored proc name by 
+concatenating the type and action names. Thus, if the type name is "Person" and 
+the action name is "GetAll", the resulting sproc name will be "Person_GetAll".
+</li>
+<li>
+If the type name is NOT provided, the stored procedure name will equal the 
+action name.</li>
+</ul>
+
+<p class='j'>
+You can easily change this behavior. For example, for the naming convention "p_Person_GetAll",
+the method implementation can be the following:
+</p>
+<% cs #
+public abstract class MyBaseDataAccessor<T,A> : DataAccessor<T,A>
+    where A : DataAccessor<T,A>
+{
+    protected override string GetDefaultSpName(string typeName, string actionName)
+    {
+        return string.Format("p_{0}_{1}", typeName, actionName);
+    }
+}
+%>
+
+<h5>Method GetTableName</h5>
+
+<% cs #
+protected virtual string GetTableName(Type type)
+{
+    // ...
+    return type.Name;
+}
+%>
+
+<p class='j'>
+By default, the table name is the associated object type name (<i>Person</i> in our examples).
+There are two ways to associate an object type with an accessor. By providing generic parameter:
+</p>
+ <% cs #
+public abstract class PersonAccessor : DataAccessor<Person>
+{
+}
+%>
+
+<p class='j'>
+And by the <b>ObjectType</b> attribute:
+</p>
+<% cs #
+[ObjectType(typeof(Person))]
+public abstract class PersonAccessor : DataAccessor
+{
+}
+%>
+
+<p class='j'>
+If you want to have different table and type names in your application, you may override the <b>GetTableName</b> method:
+</p>
+<% cs #
+public abstract class OracleDataAccessor<T,A> : DataAccessor<T,A>
+	where A : DataAccessor<T,A>
+{
+	protected override string GetTableName(Type type)
+	{
+		return base.GetTableName(type).ToUpper();
+	}
+}
+%>
+
+<h5>TableNameAttribute</h5>
+
+<p class='j'>
+Also, you can change the table name for a particular object type by decorating this object
+with the <b>TableNameAttribute</b> attribute:
+</p>
+<% cs #
+[TableName("PERSON")]
+public class Person
+{
+	public int    ID;
+	public string FirstName;
+	public string LastName;
+}
+%>
+
+<h5>ActionNameAttribute</h5>
+
+<p class='j'>
+This attribute allows changing the action name.
+</p>
+<% cs #
+public abstract class PersonAccessor : DataAccessor<Person, PersonAccessor>
+{
+	[ActionName("GetByID")]
+	protected abstract IDataReader GetByIDInternal(DbManager db, int id);
+
+	public Person GetByID(int id)
+	{
+		using (DbManager   db = GetDbManager())
+		using (IDataReader rd = GetByIDInternal(db, id))
+		{
+			Person p = new Person();
+
+			// do something complicated.
+
+			return p;
+		}
+	}
+}
+%>
+
+<h5>ActionSprocNameAttribute</h5>
+
+<p class='j'>
+This attribute associates the action name with a stored procedure name:
+</p>
+<% cs#
+[ActionSprocName("Insert", sp_Person_Insert")]
+public abstract class PersonAccessor : DataAccessor<Person, PersonAccessor>
+{
+	public abstract void Insert(Person p);
+}
+%>
+
+<p class='j'>
+This attribute can be useful when you need to reassign a stored procedure name for a method defined in your base class.
+</p>
+
+<h5>SprocNameAttribute</h5>
+
+<p class='j'>
+The regular way to assign deferent from default sproc name for a method is the <b>SprocName</b> attribute.
+</p>
+<% cs #
+public abstract class PersonAccessor : DataAccessor<Person, PersonAccessor>
+{
+	[SprocName("sp_Person_Insert")]
+	public abstract void Insert(Person p);
+}
+%>
+
+<a name='DestinationAttribute'></a><h5>DestinationAttribute</h5>
+
+<p class='j'>
+By default, the DataAccessor generator uses method's return value to determine which <i>Execute</i> method
+should be used to perform the current operation.
+The <b>DestinationAttribute</b> indicates that target object is a parameter decorated with this attribute:
+</p>
+<% cs #
+public abstract class PersonAccessor : DataAccessor<Person, PersonAccessor>
+{
+	public abstract void GetAll([Destination] List<Person> list);
+}
+%>
+
+<h5>DirectionAttributes</h5>
+
+<p class='j'>
+<i>DataAccessor</i> generator can map provided business object to stored 
+procedure parameters. <b>Direction</b> attributes allow controlling this process more precisely.
+</p>
+<% cs #
+public abstract class PersonAccessor : DataAccessor<Person, PersonAccessor>
+{
+	public abstract void Insert(
+		[Direction.Output("ID"), Direction.Ignore("LastName")] Person person);
+}
+%>
+
+<p class='j'>
+In addition, BLToolkit provides two more direction attributes: 
+<b>Direction.InputOutputAttribute</b> and <b>Direction.ReturnValueAttribute</b>.
+</p>
+
+<h5>DiscoverParametersAttribute</h5>
+<p class='j'>
+By default, BLToolkit expects method parameter names to match stored procedure 
+parameter names. The sequential order of parameters is not important in this 
+case. This attribute enforces BLToolkit to retrieve parameter information from 
+the sproc and to assign method parameters in the order they go. Parameter names 
+are ignored.
+</p>
+
+<a name='FormatAttribute'></a><h5>FormatAttribute</h5>
+
+<p class='j'>
+This attribute indicates that the specified parameter is used to construct the stored procedure name or SQL statement:
+</p>
+<% cs #
+public abstract class PersonAccessor : DataAccessor<Person, PersonAccessor>
+{
+	[SqlQuery("SELECT {0} FROM {1} WHERE {2}")]
+	public abstract List<string> GetStrings(
+		[Format(0)] string fieldName,
+		[Format(1)] string tableName,
+		[Format(2)] string whereClause);
+}
+%>
+
+<h5>IndexAttribute</h5>
+
+<p class='j'>
+If you want your method to return a dictionary, you will have to specify fields to build the dictionary key.
+The Index attribute allows you to do that:
+</p>
+<% cs #
+public abstract class PersonAccessor : DataAccessor<Person, PersonAccessor>
+{
+	[SqlQuery("SELECT * FROM Person")]
+	[Index("ID")]
+	public abstract Dictionary<int, Person>           SelectAll1();
+
+	[SqlQuery("SELECT * FROM Person")]
+	[Index("@PersonID", "LastName")]
+	public abstract Dictionary<CompoundValue, Person> SelectAll2();
+}
+%>
+<p class='j'>Note: if your key has more than one field, the type of this key should be <b>CompoundValue</b>.</p>
+<p class='j'>If the field name starts from '@' symbol, BLToolkit reads the field value from data source, 
+otherwise from an object property/field.</p>
+
+<h5>ParamNameAttribute</h5>
+
+<p class='j'>
+By default, the method parameter name should match the stored procedure parameter name.
+This attribute specifies the sproc parameter name explicitly.
+</p>
+<% cs #
+public abstract class PersonAccessor : DataAccessor<Person, PersonAccessor>
+{
+	public abstract Person SelectByName(
+		[ParamName("FirstName")] string name1,
+		[ParamName("@LastName")] string name2);
+}
+%>
+
+<h5>ScalarFieldNameAttribute</h5>
+
+<p class='j'>
+If your method returns a dictionary of scalar values, you will have to specify the name or index of the field
+used to populate the scalar list. The <b>ScalarFieldName</b> attribute allows you to do that:
+</p>
+<% cs #
+public abstract class PersonAccessor : DataAccessor<Person, PersonAccessor>
+{
+	[SqlQuery("SELECT * FROM Person")]
+	[Index("@PersonID")]
+	[ScalarFieldName("FirstName")]
+	public abstract Dictionary<int, string>           SelectAll1();
+
+	[SqlQuery("SELECT * FROM Person")]
+	[Index("PersonID", "LastName")]
+	[ScalarFieldName("FirstName")]
+	public abstract Dictionary<CompoundValue, string> SelectAll2();
+}
+%>
+
+<h5>ScalarSourceAttribute</h5>
+
+<p class='j'>
+If a method returns a scalar value, this attribute can be used to specify how database returns this value.
+The <b>ScalarSource</b> attribute take a parameter of the <b>ScalarSourceType</b> type:
+</p>
+
+<table class='data'>
+<tr><th>ScalarSourceType</th><th>Description</th></tr>
+<tr><td>DataReader</td><td>Calls the <b>DbManager.ExecuteReader</b> method, and then calls <b>IDataReader.GetValue</b> method to read the value.</td></tr>
+<tr><td>OutputParameter</td><td>Calls the <b>DbManager.ExecuteNonQuery</b> method, and then reads value from the <b>IDbDataParameter.Value</b> property.</td></tr>
+<tr><td>ReturnValue</td><td>Calls the <b>DbManager.ExecuteNonQuery</b> method, and then reads return value from command parameter collection.</td></tr>
+<tr><td>AffectedRows</td><td>Calls the <b>DbManager.ExecuteNonQuery</b> method, and then returns its return value.</td></tr>
+</table>
+
+<h5>SqlQueryAttribute</h5>
+
+<p class='j'>
+This attribute allows specifying SQL statement.
+</p>
+<% cs # public abstract class PersonAccessor : DataAccessor<Person, PersonAccessor>
+{
+    [SqlQuery("SELECT * FROM Person WHERE PersonID = @id")]
+    public abstract Person GetByID(int @id);
+}
+%>
+
+<h4>Conclusion</h4>
+
+<p class='j'>
+I hope this brief tutorial demonstrates one of the simplest, quickest and 
+most low-maintenance ways to develop your data access layer. In addition, you 
+will get one more benefit, which is incredible object mapping performance. But 
+that is a topic we will discuss later. 
+</p>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/NonUpdatable.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,25 @@
+<% group # SQL text generation control attributes %>
+
+<p class="j">
+The <b>NonUpdatable</b> attribute indicates the field that should not be updated by <i>UPDATE</i> or <i>INSERT</i> SQL statements.
+</p>
+
+NonUpdatable.cs
+<% ..\..\..\HowTo\DataAccess\NonUpdatable.cs %>
+<i>DataAccessor.Insert</i> method generates and executes the following SQL statement:
+<% sql #
+INSERT INTO [Person] (
+	[MiddleName],
+	[Gender],
+	[LastName],
+	[FirstName]
+) VALUES (
+	@MiddleName,
+	@Gender,
+	@LastName,
+	@FirstName
+)
+%>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/ObjectType.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+<% group # Abstract accessor attributes %>
+
+<p class='j'>
+The <b>ObjectType</b> attribute associates an actual type with the type returned by an abstract method.
+Note the <b>ActualType</b> attribute has lower priority.
+</p>
+
+ActualType.cs
+<% ..\..\..\HowTo\DataAccess\ActualType.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/OpenConfig.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+<% title # Open and Configure %>
+<% group # Abstract accessors %>
+
+OpenConfig.cs
+<% ..\..\..\HowTo\DataAccess\OpenConfig.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/OpenConfigQuery.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,13 @@
+<% group # SqlQuery & SprocQuery %>
+<% title # Open and Configure %>
+<% order # 100 %>
+<p class="j">
+The <b>SqlQuery</b> and <b>SprocQuery</b> classes can be used to perform simple CRUDL operations
+such as <b>SelectByKey</b>, <b>SelectAll</b>, <b>Insert</b>, <b>Update</b>, and <b>Delete</b>.
+</p>
+
+OpenConfigQuery.cs
+<% ..\..\..\HowTo\DataAccess\OpenConfigQuery.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/ParamDbType.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,11 @@
+<% group # Abstract accessor attributes %>
+
+<p class='j'>
+The <b>ParamDbType</b> can be used to specify parameter DbType.
+</p>
+
+Param.cs
+<% ..\..\..\HowTo\DataAccess\Param.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/ParamName.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,17 @@
+<% group # Abstract accessor attributes %>
+
+<p class='j'>
+By default, the method parameter name should match the stored procedure parameter name.
+The <b>ParamName</b> specifies the sproc parameter name explicitly.
+</p>
+
+ParamName.cs
+<% ..\..\..\HowTo\DataAccess\ParamName.cs %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/ParamNullValue.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,16 @@
+<% group # Abstract accessor attributes %>
+
+<p class='j'>
+The <b>ParamNullValue</b> specifies the parameter value replaced with NULL.
+</p>
+
+ParamNullValue.cs
+<% ..\..\..\HowTo\DataAccess\ParamNullValue.cs %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/ParamSize.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,11 @@
+<% group # Abstract accessor attributes %>
+
+<p class='j'>
+The <b>ParamSize</b> can be used to specify db parameter size.
+</p>
+
+Param.cs
+<% ..\..\..\HowTo\DataAccess\Param.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/PrimaryKey.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,37 @@
+<% group # SQL text generation control attributes %>
+<p class='j'>
+The <b>PrimaryKey</b> attribute indicates the field that is a part of a primary key.
+</p>
+
+PrimaryKey.cs
+<% ..\..\..\HowTo\DataAccess\PrimaryKey.cs %>
+<i>DataAccessor.SelectByKeySql</i> method generates and executes the following SQL statement:
+<% sql #
+SELECT
+	[MiddleName],
+	[PersonID],
+	[LastName],
+	[FirstName]
+FROM
+	[Person]
+WHERE
+	[PersonID] = @PersonID
+%>
+MultiplePrimaryKey.cs
+<% ..\..\..\HowTo\DataAccess\MultiplePrimaryKey.cs %>
+In this case <i>DataAccessor.SelectByKeySql</i> method generates and executes the following SQL statement:
+<% sql #
+SELECT
+	[MiddleName],
+	[PersonID],
+	[LastName],
+	[FirstName]
+FROM
+	[Person]
+WHERE
+	[FirstName] = @FirstName AND
+	[LastName] = @LastName
+%>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/ScalarFieldName.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,17 @@
+<% group # Abstract accessor attributes %>
+
+<p class='j'>
+If your method returns a dictionary of scalar values, you will have to specify the name or index of the field
+used to populate the scalar list. The <b>ScalarFieldName</b> attribute allows you to do that.
+</p>
+
+ScalarFieldName.cs
+<% ..\..\..\HowTo\DataAccess\ScalarFieldName.cs %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/ScalarSource.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+<% group # Abstract accessor attributes %>
+
+<p class='j'>
+If a method returns a scalar value, this attribute can be used to specify how database returns this value.
+The <b>ScalarSource</b> attribute take a parameter of the <b>ScalarSourceType</b> type:
+
+<table class='data'>
+<tr><th>ScalarSourceType</th><th>Description</th></tr>
+<tr><td>DataReader</td><td>Calls the <b>DbManager.ExecuteReader</b> method, and then calls <b>IDataReader.GetValue</b> method to read the value.</td></tr>
+<tr><td>OutputParameter</td><td>Calls the <b>DbManager.ExecuteNonQuery</b> method, and then reads value from the <b>IDbDataParameter.Value</b> property.</td></tr>
+<tr><td>ReturnValue</td><td>Calls the <b>DbManager.ExecuteNonQuery</b> method, and then reads return value from command parameter collection.</td></tr>
+<tr><td>AffectedRows</td><td>Calls the <b>DbManager.ExecuteNonQuery</b> method, and then returns its return value.</td></tr>
+</table>
+</p>
+
+ScalarSource.cs
+<% ..\..\..\HowTo\DataAccess\ScalarSource.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/SelectAll.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+<% group # Basic CRUDL operations and stored procedures %>
+<% order # 201 %>
+
+SelectAll.cs
+<% ..\..\..\HowTo\DataAccess\SelectAll.cs %>
+<i>DataAccessor.SelectAll</i> method generates and executes the following SQL statement:
+<% sql # exec Person_SelectAll %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/SelectAllSql.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,23 @@
+<% group # Basic CRUDL operations and SQL text generation %>
+<% order # 151 %>
+
+SelectAllSql.cs
+<% ..\..\..\HowTo\DataAccess\SelectAllSql.cs %>
+<i>DataAccessor.SelectAllSql</i> method generates and executes the following SQL statement:
+<% sql #
+SELECT
+	[MiddleName],
+	[PersonID],
+	[LastName],
+	[FirstName]
+FROM
+	[Person]
+%>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/SelectByKey.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+<% group # Basic CRUDL operations and stored procedures %>
+<% order # 200 %>
+
+SelectByKey.cs
+<% ..\..\..\HowTo\DataAccess\SelectByKey.cs %>
+<i>DataAccessor.SelectByKet</i> method generates and executes the following SQL statement:
+<% sql # exec Person_SelectByKey @id=1 %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/SelectByKeySql.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,25 @@
+<% group # Basic CRUDL operations and SQL text generation %>
+<% order # 150 %>
+
+SelectByKeySql.cs
+<% ..\..\..\HowTo\DataAccess\SelectByKeySql.cs %>
+<i>DataAccessor.SelectByKetSql</i> method generates and executes the following SQL statement:
+<% sql #
+SELECT
+	[MiddleName],
+	[PersonID],
+	[LastName],
+	[FirstName]
+FROM
+	[Person]
+WHERE
+	[PersonID] = @PersonID
+%>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/SprocName.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,16 @@
+<% group # Abstract accessor attributes %>
+
+<p class='j'>
+The <b>SprocName</b> attribute allows assigning a stored procedure name explicitly.
+</p>
+
+SprocName.cs
+<% ..\..\..\HowTo\DataAccess\SprocName.cs %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/SqlQuery.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,16 @@
+<% group # Abstract accessor attributes %>
+
+<p class='j'>
+The <b>SqlQuery</b> attribute allows specifying SQL statement.
+</p>
+
+SqlQuery.cs
+<% ..\..\..\HowTo\DataAccess\SqlQuery.cs %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/TableName.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,26 @@
+<% group # SQL text generation control attributes %>
+<p class='j'>
+The <b>TableName</b> attribute specifies a name of the table represented by the decorated object.
+</p>
+
+TableName.cs
+<% ..\..\..\HowTo\DataAccess\TableName.cs %>
+<i>DataAccessor.SelectByKeySql</i> and <i>DataAccessor.SelectByKey</i> methods generate and execute the following SQL statement:
+<% sql #
+-- SelectByKeySql
+SELECT
+	[MiddleName],
+	[PersonID],
+	[LastName],
+	[FirstName]
+FROM
+	[Person]
+WHERE
+	[PersonID] = @PersonID
+
+-- SelectByKey
+exec Person_SelectByKey @id=1
+%>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/Transaction.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,13 @@
+<% title # Transactions %>
+<% group # Abstract accessors %>
+
+Transaction.cs
+<% ..\..\..\HowTo\DataAccess\Transaction.cs %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/Update.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+<% group # Basic CRUDL operations and stored procedures %>
+<% order # 203 %>
+
+Update.cs
+<% ..\..\..\HowTo\DataAccess\Update.cs %>
+<i>DataAccessor.Update</i> method generates and executes the following SQL statement:
+<% sql # exec Person_Update @PersonID=2, @FirstName='Crazy', @LastName='Frog', @MiddleName='', @Gender='O' %>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/UpdateSql.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,25 @@
+<% group # Basic CRUDL operations and SQL text generation %>
+<% order # 153 %>
+
+UpdateSql.cs
+<% ..\..\..\HowTo\DataAccess\UpdateSql.cs %>
+<i>DataAccessor.UpdateSql</i> method generates and executes the following SQL statement:
+<% sql #
+UPDATE
+	[Person]
+SET
+	[MiddleName] = @MiddleName,
+	[Gender]     = @Gender,
+	[LastName]   = @LastName,
+	[FirstName]  = @FirstName
+WHERE
+	[PersonID]   = @PersonID
+%>
+<a name='Person'></a>
+Person.cs
+<% ..\..\..\HowTo\DataAccess\Person.cs %>
+Gender.cs
+<% ..\..\..\HowTo\DataAccess\Gender.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/XmlExtension.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,26 @@
+<% group # SQL text generation control attributes %>
+<p class='j'>
+BLToolkit supports different ways to provide metadata information for business objects.
+One of the ways is using attributes. Another one is XmlExtension.
+XmlExtension is a simple xml file where you can specify a type and its attributes.
+</p>
+
+XmlExtension.cs
+<% ..\..\..\HowTo\DataAccess\XmlExtension.cs %>
+XmlExtension.xml
+<% ..\..\..\HowTo\DataAccess\XmlExtension.xml %>
+<i>DataAccessor.SelectByKetSql</i> method generates and executes the following SQL statement:
+<% sql #
+SELECT
+	[MiddleName],
+	[PersonID],
+	[LastName],
+	[FirstName]
+FROM
+	[Person]
+WHERE
+	[PersonID] = @PersonID
+%>
+App.config
+<% Doc\Data\App.config %>
+<a href="../Data/CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/DataAccess/index.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,47 @@
+<ct_table>
+<ct_hr>
+<ct_item link="Introduction.htm"       label="Introduction" />
+<ct_hr>
+<ct_text>Abstract accessors.</ct_text>
+<ct_item link="OpenConfig.htm"         label="Open and Configure">How to open and configure data accessors.</ct_item>
+<ct_item link="Transaction.htm"        label="Transactions" />
+<ct_hr>
+<ct_item link="AbstractAccessor.htm"   label="AbstractAccessor"  >Abstract accessor example.</ct_item>
+<ct_item link="ExecuteList.htm"        label="ExecuteList"       >DataAccessor + List.</ct_item>
+<ct_item link="ExecuteDictionary.htm"  label="ExecuteDictionary" >DataAccessor + Dictionary.</ct_item>
+<ct_item link="ExecuteObject.htm"      label="ExecuteObject"     >DataAccessor + business objects.</ct_item>
+<ct_item link="ExecuteScalar.htm"      label="ExecuteScalar"     >DataAccessor + scalar values.</ct_item>
+<ct_hr>
+<ct_text>Abstract accessor attributes.</ct_text>
+<ct_item3 link1="ActionName.htm"       label1="ActionName"      link2="ActionSprocName.htm"    label2="ActionSprocName"    link3="ActualType.htm"      label3="ActualType" />
+<ct_item3 link1="CommandBehavior.htm"  label1="CommandBehavior" link2="DataSetTable.htm"       label2="DataSetTable"       link3="Destination.htm"     label3="Destination" />
+<ct_item3 link1="Direction.htm"        label1="Direction"       link2="DiscoverParameters.htm" label2="DiscoverParameters" link3="Format.htm"          label3="Format" />
+<ct_item3 link1="IndexAttribute.htm"   label1="Index"           link2="ObjectType.htm"         label2="ObjectType"         link3="ParamDbType.htm"     label3="ParamDbType" />
+<ct_item3 link1="ParamName.htm"        label1="ParamName"       link2="ParamNullValue.htm"     label2="ParamNullValue"     link3="ParamSize.htm"       label3="ParamSize" />
+<ct_item3 link1="ScalarFieldName.htm"  label1="ScalarFieldName" link2="ScalarSource.htm"       label2="ScalarSource"       link3="SprocName.htm"       label3="SprocName" />
+<ct_item3 link1="SqlQuery.htm"         label1="SqlQuery"        link2="CustomSqlQuery1.htm"    label2="Custom SqlQuery 1"  link3="CustomSqlQuery2.htm" label3="Custom SqlQuery 2" />
+<ct_hr>
+<ct_text>SqlQuery &amp; SprocQuery</ct_text>
+<ct_item link="OpenConfigQuery.htm"    label="Open and Configure">How to open and configure SqlQuery &amp; SprocQuery.</ct_item>
+<ct_hr>
+<ct_text>Basic CRUDL operations and SQL text generation.</ct_text>
+<ct_item link="SelectByKeySql.htm"     label="SelectByKeySql"    >Reads a record by Primary Key.</ct_item>
+<ct_item link="SelectAllSql.htm"       label="SelectAllSql"      >Reads all records from specified table.</ct_item>
+<ct_item link="InsertSql.htm"          label="InsertSql"         >Inserts a new record.</ct_item>
+<ct_item link="UpdateSql.htm"          label="UpdateSql"         >Updates a record.</ct_item>
+<ct_item link="DeleteSql.htm"          label="DeleteSql"         >Deletes a record either by Primary Key or by provided object.</ct_item>
+<ct_hr>
+<ct_text>Basic CRUDL operations and stored procedures.</ct_text>
+<ct_item link="SelectByKey.htm"        label="SelectByKey"       >Reads a record by Primary Key.</ct_item>
+<ct_item link="SelectAll.htm"          label="SelectAll"         >Reads all records from specified table.</ct_item>
+<ct_item link="Insert.htm"             label="Insert"            >Inserts a new record.</ct_item>
+<ct_item link="Update.htm"             label="Update"            >Updates a record.</ct_item>
+<ct_item link="Delete.htm"             label="Delete"            >Deletes a record either by Primary Key or by provided object.</ct_item>
+<ct_hr>
+<ct_text>SQL text generation control attributes.</ct_text>
+<ct_item link="TableName.htm"          label="TableName" />
+<ct_item link="PrimaryKey.htm"         label="PrimaryKey" />
+<ct_item link="NonUpdatable.htm"       label="NonUpdatable" />
+<ct_item link="XmlExtension.htm"       label="XmlExtension" />
+<ct_hr>
+</ct_table>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/EditableObjects/AcceptRejectChanges.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,11 @@
+<% title # Accept and Reject changes %>
+<% order # 2 %>
+<p class="j">
+After verifying the accuracy of changes made to the object, you can accept the changes
+using the <b>AcceptChanges</b> method of the object, which will set the <b>Current</b> field values
+to be the <b>Original</b> values. The <b>RejectChanges</b> method rejects all changes made to the object
+since <b>AcceptChanges</b> was last called.
+</p>
+
+AcceptRejectChanges.cs
+<% ..\..\..\HowTo\EditableObjects\AcceptRejectChanges.cs %>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/EditableObjects/EditableObject.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,119 @@
+[BLToolkitGenerated]
+public sealed class TestObject : EditableObjectTest.TestObject, IEditable, IMemberwiseEditable, IPrintDebugState
+{
+	// Note that the internal representation of the properties is EditableValue<string>.
+	// The EditableValue class provides a mechanism to keep and control the field value state.
+	//
+	private /*[a]*/EditableValue<string>/*[/a]*/ _firstName;
+	private /*[a]*/EditableValue<string>/*[/a]*/ _lastName;
+
+	// PropertyInfo is used for internal purposes.
+	//
+	private static PropertyInfo _firstName_propertyInfo =
+		TypeHelper.GetPropertyInfo(typeof(EditableObjectTest.TestObject), "FirstName", typeof(string), Type.EmptyTypes);
+	private static PropertyInfo _lastName_propertyInfo  =
+		TypeHelper.GetPropertyInfo(typeof(EditableObjectTest.TestObject), "LastName",  typeof(string), Type.EmptyTypes);
+
+	// Constructors.
+	//
+	public TestObject()
+	{
+		this._firstName = new EditableValue<string>("");
+		this._lastName  = new EditableValue<string>("");
+	}
+
+	public TestObject(InitContext ctx)
+	{
+		this._firstName = new EditableValue<string>("");
+		this._lastName  = new EditableValue<string>("");
+	}
+
+	// Abstract property implementation.
+	//
+	public override string FirstName
+	{
+		get
+		{
+			return _firstName./*[a]*/Value/*[/a]*/;
+		}
+
+		set
+		{
+			_firstName./*[a]*/Value/*[/a]*/ = value;
+
+			// The PropertyChanged event support.
+			//
+			((IPropertyChanged)this)./*[a]*/OnPropertyChanged/*[/a]*/(_firstName_propertyInfo);
+		}
+	}
+
+	public override string LastName
+	{
+		get
+		{
+			return _lastName./*[a]*/Value/*[/a]*/;
+		}
+
+		set
+		{
+			_lastName./*[a]*/Value/*[/a]*/ = value;
+			((IPropertyChanged)this)./*[a]*/OnPropertyChanged/*[/a]*/(_lastName_propertyInfo);
+		}
+	}
+
+	// The IEditable interface implementation.
+	//
+	bool IEditable.IsDirty
+	{
+		get { return _firstName.IsDirty || _lastName.IsDirty; }
+	}
+
+	void IEditable.AcceptChanges()
+	{
+		this._firstName.AcceptChanges();
+		this._lastName. AcceptChanges();
+	}
+
+	void IEditable.RejectChanges()
+	{
+		this._firstName.RejectChanges();
+		this._lastName. RejectChanges();
+	}
+
+	// The IMemberwiseEditable interface implementation.
+	//
+	bool IMemberwiseEditable.AcceptMemberChanges(PropertyInfo propertyInfo, string memberName)
+	{
+		return
+			_firstName.AcceptMemberChanges(_firstName_propertyInfo, memberName) ||
+			_lastName. AcceptMemberChanges(_lastName_propertyInfo,  memberName);
+	}
+
+	void IMemberwiseEditable.GetDirtyMembers(PropertyInfo propertyInfo, ArrayList list)
+	{
+		_firstName.GetDirtyMembers(_firstName_propertyInfo, list);
+		_lastName. GetDirtyMembers(_lastName_propertyInfo,  list);
+	}
+
+	bool IMemberwiseEditable.IsDirtyMember(PropertyInfo propertyInfo, string memberName, ref bool isDirty)
+	{
+		return
+			_firstName.IsDirtyMember(_firstName_propertyInfo, memberName, ref isDirty) ||
+			_lastName. IsDirtyMember(_lastName_propertyInfo,  memberName, ref isDirty);
+	}
+
+	bool IMemberwiseEditable.RejectMemberChanges(PropertyInfo propertyInfo, string memberName)
+	{
+		return
+			_firstName.RejectMemberChanges(_firstName_propertyInfo, memberName) ||
+			_lastName. RejectMemberChanges(_lastName_propertyInfo,  memberName);
+	}
+
+	// The IPrintDebugState interface implementation.
+	//
+	void IPrintDebugState.PrintDebugState(PropertyInfo propertyInfo, ref string str)
+	{
+		_firstName.PrintDebugState(_firstName_propertyInfo, ref str);
+		_lastName. PrintDebugState(_lastName_propertyInfo,  ref str);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/EditableObjects/EditableObject.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,26 @@
+<% title # EditableObject class %>
+<% order # 1 %>
+<p class="j">
+<b>EditableObject</b> is an object that provides functionality to commit and rollback changes to itself.
+After verifying the accuracy of changes made to the object, you can accept the changes
+using the <b>AcceptChanges</b> method of the object, which will set the <b>Current</b> field values
+to be the <b>Original</b> values. The <b>RejectChanges</b> method rejects all changes made to the object
+since <b>AcceptChanges</b> was last called. The <b>IsDirty</b> property gets a value that indicates
+whether the object has changed.
+</p>
+<p class="j">
+If we wrote an editable object manually, we could get the following code just for two editable properties:
+</p>
+<% Doc\EditableObjects\ManualEditableObject.cs %>
+
+<p class='j'>
+BLToolkit allows implementing the same functionality by inheriting your object
+from the BLToolkit <b>EditableObject</b> base class and replacing editable members with abstract properties.
+</p>
+EditableObjectTest.cs
+<% ..\..\..\HowTo\EditableObjects\EditableObjectTest.cs %>
+
+<p class='j'>
+BLToolkit type builder will generate the following for the class above:
+</p>
+<% Doc\EditableObjects\EditableObject.cs %>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/EditableObjects/IsDirty.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+<% title # IsDirty flag %>
+<% order # 3 %>
+<p class="j">
+The <b>IsDirty</b> property gets a value that indicates whether the object has changed.
+</p>
+
+IsDirty.cs
+<% ..\..\..\HowTo\EditableObjects\IsDirty.cs %>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/EditableObjects/ManualEditableObject.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,108 @@
+public class TestObject : INotifyPropertyChanged
+{
+	// The FirstName editable property.
+	//
+	private string _originalFirstName;
+	private string _currentFirstName;
+
+	public override string FirstName
+	{
+		get { return _currentFirstName; }
+		set
+		{
+			_currentFirstName = value;
+			OnPropertyChanged("FirstName");
+		}
+	}
+
+	bool IsFirstNameDirty
+	{
+		get { return _currentFirstName != _originalFirstName; }
+	}
+
+	void AcceptFirstNameChange()
+	{
+		if (IsFirstNameDirty)
+		{
+			_originalFirstName = _currentFirstName;
+			OnPropertyChanged("FirstName");
+		}
+	}
+
+	void RejectFirstNameChange()
+	{
+		if (IsFirstNameDirty)
+		{
+			_currentFirstName = _originalFirstName;
+			OnPropertyChanged("FirstName");
+		}
+	}
+
+	// The LastName editable property.
+	//
+	private string _originalLastName;
+	private string _currentLastName;
+
+	public override string LastName
+	{
+		get { return _currentLastName; }
+		set
+		{
+			_currentLastName = value;
+			OnPropertyChanged("LastName");
+		}
+	}
+
+	bool IsLastNameDirty
+	{
+		get { return _currentLastName != _originalLastName; }
+	}
+
+	void AcceptLastNameChange()
+	{
+		if (IsLastNameDirty)
+		{
+			_originalLastName = _currentLastName;
+			OnPropertyChanged("LastName");
+		}
+	}
+
+	void RejectLastNameChange()
+	{
+		if (IsLastNameDirty)
+		{
+			_currentLastName = _originalLastName;
+			OnPropertyChanged("LastName");
+		}
+	}
+
+	// Common members.
+	//
+	public bool IsDirty
+	{
+		get
+		{
+			return IsFirstNameChange || IsLastNameChange;
+		}
+	}
+
+	public void AcceptChanges()
+	{
+		AcceptFirstNameChange();
+		AcceptLastNameChange();
+	}
+
+	public void RejectChanges()
+	{
+		RejectFirstNameChange();
+		RejectLastNameChange();
+	}
+
+	public virtual event PropertyChangedEventHandler PropertyChanged;
+
+	protected virtual void OnPropertyChanged(string propertyName)
+	{
+		if (PropertyChanged != null)
+			PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/EditableObjects/index.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,32 @@
+<p class='j'>
+The EditableObjects namespace contains classes that can help you to make your object model editable.
+That means your objects will support the following list of standard and BLToolkit interfaces:
+
+<table class='data'>
+<tr><td colspan='2' style="padding:0 0 10 0">for business objects</td></tr>
+<tr><th>namespace</th><th>interface</th></tr>
+<tr><td>System.ComponentModel</td><td>IEditableObject</td></tr>
+<tr><td>System.ComponentModel</td><td>INotifyPropertyChanged</td></tr>
+<tr><td>System.ComponentModel</td><td>ICustomTypeDescriptor</td></tr>
+<tr><td>System</td><td>ICloneable</td></tr>
+<tr><td>BLToolkit.ComponentModel</td><td>INotifyObjectEdit</td></tr>
+<tr><td>BLToolkit.EditableObjects</td><td>IEditable</td></tr>
+<tr><td>BLToolkit.Validation</td><td>IValidatable</td></tr>
+<tr><td colspan='2' style="padding:10 0 10 0">for collections</td></tr>
+<tr><th>namespace</th><th>interface</th></tr>
+<tr><td>System.ComponentModel</td><td>ITypedList</td></tr>
+<tr><td>System.ComponentModel</td><td>IBindingList</td></tr>
+<tr><td>System.ComponentModel</td><td>IBindingListView</td></tr>
+<tr><td>System.ComponentModel</td><td>ICancelAddNew</td></tr>
+<tr><td>BLToolkit.ComponentModel</td><td>ISortable</td></tr>
+<tr><td>BLToolkit.EditableObjects</td><td>IEditable</td></tr>
+</table>
+</p>
+
+<ct_table>
+<ct_hr>
+<ct_item link="EditableObject.htm"      label="EditableObject" />
+<ct_item link="AcceptRejectChanges.htm" label="Accept and Reject changes" />
+<ct_item link="IsDirty.htm"             label="IsDirty flag" />
+<ct_hr>
+</ct_table>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Mapping/EnumToValue.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,2 @@
+EnumToValue.cs
+<% ..\..\..\HowTo\Mapping\EnumToValue.cs %>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Mapping/MapFieldAttribute.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+Note that the mapper tries to convert the source values to their destination types.<br>
+<br/>
+ObjectToObject.cs
+<% ..\..\..\HowTo\Mapping\ObjectToObject.cs %>
+To map data to inner objects the MapField attribute can be used in the following way:
+<br/>
+<br/>
+MapFieldAttribute.cs
+<% ..\..\..\HowTo\Mapping\MapFieldAttribute.cs %>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Mapping/MapToJson.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,2 @@
+MapToJson.cs
+<% ..\..\..\HowTo\Mapping\MapToJson.cs %>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Mapping/MapValueAttribute.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4 @@
+MapValueAttribute1.cs
+<% ..\..\..\HowTo\Mapping\MapValueAttribute1.cs %>
+MapValueAttribute2.cs
+<% ..\..\..\HowTo\Mapping\MapValueAttribute2.cs %>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Mapping/ObjectToObject.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4 @@
+Note that the mapper tries to convert the source values to their destination types.<br>
+<br/>
+ObjectToObject.cs
+<% ..\..\..\HowTo\Mapping\ObjectToObject.cs %>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Mapping/ValueToEnum.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,2 @@
+ValueToEnum.cs
+<% ..\..\..\HowTo\Mapping\ValueToEnum.cs %>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Mapping/index.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,17 @@
+<ct_table>
+<ct_hr>
+<ct_item link="../Data/ExecuteObject.htm" label="ExecuteObject" >How to map DB source to object.</ct_item>
+<ct_item link="ObjectToObject.htm"        label="ObjectToObject">How to map object to object.</ct_item>
+<ct_hr>
+<ct_text>Enumerator mapping.</ct_text>
+<ct_item link="EnumToValue.htm"           label="EnumToValue"   >How to map enumerator to value.</ct_item>
+<ct_item link="ValueToEnum.htm"           label="ValueToEnum"   >How to map value to enumerator.</ct_item>
+<ct_hr>
+<ct_text>Mapping attributes.</ct_text>
+<ct_item link="MapFieldAttribute.htm"     label="MapFieldAttribute" />
+<ct_item link="MapValueAttribute.htm"     label="MapValueAttribute" />
+<ct_hr>
+<ct_text>Custom mapping.</ct_text>
+<ct_item link="MapToJson.htm"             label="MapToJson" />
+<ct_hr>
+</ct_table>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Reflection/Emit/HelloWorld.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,27 @@
+<p>The <b>System.Reflection.Emit</b> namespace provides classes to create dynamic assemblies at runtime.
+It allows compilers and tools to emit <b>MSIL</b>, execute it and store it to a disk.
+Although <b>Emit</b> is a powerful tool, it is also extremely hard to use.</p>
+<p>Let us take a look at the following example, which demonstrates the "normal" way of emit programming:</p>
+
+HelloWorld.cs
+<% ..\..\..\Examples\CS\Reflection.Emit\HelloWorldnormal.cs %>
+
+<p>Note that the Emit method takes one parameter as an OpCode and optionally another one,
+which does not depend on the current operation context. So, this way is not entirely type safe.</p>
+
+<p>Fortunately, there is an alternative way. BLToolkit provides a helper class, 
+<a href='/Source/Reflection/Emit/EmitHelper.cs.htm'>EmitHelper</a>,
+which can make your life a little bit easy.
+It contains typed wrapper methods for almost all emit commands and allows writing source code
+that looks similar to <b>MSIL</b>.</p>
+<p>The following examples show how to use the EmitHelper class with C#, VB.NET, and C++/CLI.</p>
+
+HelloWorld.cs
+<% ..\..\..\Examples\CS\Reflection.Emit\HelloWorld.cs %>
+Cool!!! Isn't it?<br><br>
+
+HelloWorld.vb
+<% ..\..\..\Examples\VB\Reflection.Emit\HelloWorld.vb %>
+
+HelloWorld.cpp
+<% ..\..\..\Examples\Cpp\HelloWorld.cpp %>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Reflection/Emit/index.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,5 @@
+<ct_table>
+<ct_hr>
+<ct_item link="HelloWorld.htm" label="Hello, World!"><i>EmitHelper</i> in action.</ct_item>
+<ct_hr>
+</ct_table>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Reflection/ObjectFactory.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,19 @@
+<p class="j">
+The following example shows how to create objects of different types coming from the same data source.
+</p>
+<p class="j">
+Typically, to create an object, BLToolkit calls the <i>TypeAccessor.CreateInstanceEx</i> method.
+First of all, this method verifies if there is an object factory (<i>ObjectFactory</i> property)
+associated with the creating objects type.
+If the property value is not null, it is used to create an object.
+</p>
+<p class="j">
+The <i>ObjectFactory</i> property can be assigned explicitly at any time or 
+by decorating the target class with the <i>ObjectFactory</i> attribute.
+</p>
+
+ObjectFactory.cs
+<% ..\..\..\HowTo\Reflection\ObjectFactory.cs %>
+App.config
+<% Doc\Data\App.config %>
+<a href="..\Data\CreateSql.htm">Create.sql script</a>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Reflection/index.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,7 @@
+<ct_table>
+<ct_hr>
+<ct_item link="Emit/index.htm" label="Emit" />
+<ct_hr>
+<ct_item link="ObjectFactory.htm" label="ObjectFactory" />
+<ct_hr>
+</ct_table>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/TypeBuilder/InitialValues.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,2 @@
+InitialValues.cs
+<% ..\..\..\HowTo\TypeBuilder\InitialValues.cs %>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/TypeBuilder/InternalTypes.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,2 @@
+InternalTypes.cs
+<% ..\..\..\HowTo\TypeBuilder\InternalTypes.cs %>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/TypeBuilder/XmlSerialization.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,2 @@
+XmlSerialization.cs
+<% ..\..\..\HowTo\TypeBuilder\XmlSerialization.cs %>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/TypeBuilder/index.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+<ct_table>
+<ct_hr>
+<ct_text>Abstract types.</ct_text>
+<ct_item link="InitialValues.htm" label="InitialValues">How to specify initial value for an abstract property.</ct_item>
+<ct_item link="InternalTypes.htm" label="InternalTypes">How to use internal abstract types.</ct_item>
+<ct_item link="XmlSerialization.htm" label="XmlSerialization">How to serialize an abstract type to xml.</ct_item>
+<ct_hr>
+</ct_table>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/Validation/index.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1 @@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Doc/index.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,14 @@
+<% title # Documentation %>
+<ct_table>
+<ct_hr>
+<ct_item link="Aspects/index.htm" label="Aspects" />
+<ct_item link="ComponentModel/index.htm" label="ComponentModel" />
+<ct_item link="Data/index.htm" label="Data" />
+<ct_item link="DataAccess/index.htm" label="DataAccess" />
+<ct_item link="EditableObjects/index.htm" label="EditableObjects" />
+<ct_item link="Mapping/index.htm" label="Mapping" />
+<ct_item link="Reflection/index.htm" label="Reflection" />
+<ct_item link="TypeBuilder/index.htm" label="TypeBuilder" />
+<ct_item link="Validation/index.htm" label="Validation" />
+<ct_hr>
+</ct_table>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Download.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,28 @@
+<p class="j">
+Download one of the following zip-files. Unzip it. Add either BLToolkit.2.csproj (FW 2.0: VS 2005, VS 2008) or 
+BLToolkit.3.csproj (FW 3.5: VS 2008) project into your solution. Add project references where you need it.
+Compile. Enjoy.
+</p>
+
+<ct_table>
+<ct_hr>
+<ct_text>Version 3.1</ct_text>
+<ct_item link="/download/bltoolkit.3.1.zip"     label="BLToolkit 3.1"    >Source code</ct_item>
+<ct_item link="/download/bltoolkit.3.1.dev.zip" label="BLToolkit 3.1 Dev">Full dev version</ct_item>
+<ct_hr>
+<ct_text>Current SVN working copy</ct_text>
+<ct_item link="http://bl-toolkit.googlecode.com/svn/trunk/Source/" label="BLToolkit"    >SVN checkout source code</ct_item>
+<ct_item link="http://bl-toolkit.googlecode.com/svn/trunk/"        label="BLToolkit Dev">SVN checkout full dev version</ct_item>
+<ct_hr>
+<ct_text>Current SVN snapshot</ct_text>
+<ct_item link="/download/bltoolkit.zip"      label="bltoolkit.zip"    >Source code</ct_item>
+<ct_item link="/download/bltoolkit_dev.zip"  label="bltoolkit_dev.zip">Full dev version</ct_item>
+<ct_item link="/download/bltoolkit_bin.zip"  label="bltoolkit_bin.zip">Binaries</ct_item>
+<ct_hr>
+</ct_table>
+
+<br>
+ChangeLog.txt
+<pre>
+<% ..\..\..\Source\Doc\ChangeLog.txt %>
+</pre>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/Home.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,29 @@
+<p class="j">
+Business Logic Toolkit is a set of components to simplify .NET application development.
+BLToolkit is provided as <a href="http://www.bltoolkit.net/Source/index.htm">source code</a> that you can use "as is"
+or customize for your applications.
+It is written in C# and compatible with .NET Framework 2.0, 3.0, and 3.5.
+</p>
+
+<ct_table>
+<ct_hr>
+<ct_text>Version 3.1</ct_text>
+<ct_item link="http://www.bltoolkit.net/download/bltoolkit.3.1.zip"     label="BLToolkit 3.1"    >Source code</ct_item>
+<ct_item link="http://www.bltoolkit.net/download/bltoolkit.3.1.dev.zip" label="BLToolkit 3.1 Dev">Full dev version</ct_item>
+<ct_hr>
+<ct_text>Current SVN working copy</ct_text>
+<ct_item link="http://bl-toolkit.googlecode.com/svn/trunk/Source/" label="BLToolkit"    >SVN checkout source code</ct_item>
+<ct_item link="http://bl-toolkit.googlecode.com/svn/trunk/"        label="BLToolkit Dev">SVN checkout full dev version</ct_item>
+<ct_hr>
+<ct_text>Current SVN snapshot</ct_text>
+<ct_item link="http://www.bltoolkit.net/download/bltoolkit.zip"      label="bltoolkit.zip"    >Source code</ct_item>
+<ct_item link="http://www.bltoolkit.net/download/bltoolkit_dev.zip"  label="bltoolkit_dev.zip">Full dev version</ct_item>
+<ct_item link="http://www.bltoolkit.net/download/bltoolkit_bin.zip"  label="bltoolkit_bin.zip">Binaries</ct_item>
+<ct_hr>
+</ct_table>
+
+<br>
+ChangeLog.txt
+<pre>
+<% ..\..\..\Source\Doc\ChangeLog.txt %>
+</pre>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/License.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,25 @@
+<p class='j'>BLToolkit is licensed under <a href='http://en.wikipedia.org/wiki/MIT_License'>MIT License</a>:</p>
+
+<table width='100%' class='code'><tr><td style="padding:7px">
+<font size="2" face="Courier New">
+<p>Copyright &copy; 2010 www.bltoolkit.net</p>
+
+<p class="j">Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:</p>
+
+<p class="j">The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.</p>
+
+<p class="j">THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.</p>
+</font>
+</td></tr></table>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/WebTemplate.html	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,57 @@
+<html>
+<head>
+    <title>{3}Business Logic Toolkit for .NET</title>
+    <link href="{1}bltoolkit.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<span class="title"><nobr>Business Logic Toolkit for .NET</nobr></span><br/>
+<span class="homeurl">www.bltoolkit.net</span>
+<table width="100%" border="0" cellpadding="0" cellspacing="0">
+<tr><td class="sp"><img width="1" height="1" alt=""/></td></tr>
+<tr><td class="hr"><img width="1" height="1" alt=""/></td></tr>
+<tr><td class="sp"><img width="1" height="1" alt=""/></td></tr>
+</table>
+<font face="Arial"><nobr>
+|&nbsp;&nbsp;<a class="m" href="{1}index.htm">Home</a>&nbsp;&nbsp;
+|&nbsp;&nbsp;<a class="m" href="{1}download.htm">Download</a>&nbsp;&nbsp;
+|&nbsp;&nbsp;<a class="m" href="{1}doc/index.htm">Documentation</a>&nbsp;&nbsp;
+|&nbsp;&nbsp;<a class="m" href="http://groups.google.com/group/bltoolkit">Discussions</a>&nbsp;&nbsp;
+|&nbsp;&nbsp;<a class="m" href="{1}license.htm">License</a>&nbsp;&nbsp;
+|
+</nobr></font>
+<br/>{2}
+<br/>
+<table width="100%" border="0" cellpadding="0" cellspacing="0"><tr>
+<td width="100px">&nbsp;</td>
+<td>
+{0}
+</td>
+<td width="50px">&nbsp;</td>
+</tr>
+
+<tr valign="bottom" align="right"><td colspan="3">
+<table border="0" cellpadding="0" cellspacing="0">
+<tr><td class="sp"><img width="1" height="1" alt=""/></td></tr>
+<tr><td class="hr"><img width="1" height="1" alt=""/></td></tr>
+<tr><td class="sp"><img width="1" height="1" alt=""/></td></tr>
+<tr><td align="right">
+<small>
+<nobr>&copy; 2010 www.bltoolkit.net</nobr><br/>
+<nobr><a href="mailto:support@bltoolkit.net">support@bltoolkit.net</a></nobr>
+</small>
+</td></tr></table>
+
+</td></tr></table>
+
+
+<script type="text/javascript">
+var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
+document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
+</script>
+<script type="text/javascript">
+var pageTracker = _gat._getTracker("UA-1276305-2");
+pageTracker._initData();
+pageTracker._trackPageview();
+</script>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/bltoolkit.css	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,190 @@
+body 
+{
+	background  : White;
+	font-family : Verdana;
+	font-size   : .80em;
+}
+
+a:link    { text-decoration: none;      color : #338899; }
+a:visited { text-decoration: none;      color : #55AABB; }
+a:hover   { text-decoration: underline; color : #338899; }
+
+a.m:link    { text-decoration: underline; color : Black; }
+a.m:visited { text-decoration: underline; color : Black; }
+a.m:hover   { text-decoration: underline; color : Black; }
+
+.title
+{
+	font-size   : 1.75em;
+	color       : #116677;
+	font-family : Arial;
+}
+
+.homeurl
+{
+	color     : #338899;
+}
+
+.hr
+{
+	height           : 1px;
+	background-color : #338899;
+}
+
+.sp
+{
+	height : 7px;
+}
+
+th
+{
+	font-size        : .80em;
+	vertical-align   : top;
+	background-color : #EEEEEE;
+	text-align       : center;
+}
+
+td
+{
+	font-size      : .80em;
+	vertical-align : top;
+}
+
+td.p
+{
+	font-size      : .80em;
+	vertical-align : top;
+	padding-top    : 7px;
+}
+
+td.pj
+{
+	font-size      : .80em;
+	vertical-align : top;
+	padding-top    : 7px;
+	text-align     : justify;
+}
+
+.j
+{
+	text-align : justify;
+}
+
+.kw
+{
+	color : blue;
+}
+
+.com
+{
+	color : green;
+}
+
+.str
+{
+	color : DarkCyan;
+}
+
+.a
+{
+	color           : DarkRed;
+	font-weight     : bold;
+	text-decoration : underline;
+}
+
+table.code
+{
+	border-color     : #116677;
+	border-style     : solid;
+	border-width     : 1px;
+	margin-top       : .6em;
+	margin-bottom    : .6em;
+	background-color : #F7F7F7;
+}
+
+pre.code
+{
+	font    : 120% Consolas, Monospace, Courier New, Courier;
+	margin  : 0;
+	padding : 5px;
+}
+
+.j pre.code, .pj pre.code
+{
+	font      : 80% Consolas, Monospace, Courier New, Courier;
+	margin    : 0;
+	padding   : 3px;
+}
+
+.j table.code, .pj table.code
+{
+	margin-top       : .4em;
+	margin-bottom    : .0em;
+}
+
+a.rss
+{
+	color            : White;
+	background-color : DarkOrange;
+	font-weight      : bold;
+	font-size        : .80em;
+	font-family      : Arial;
+}
+
+table.data
+{
+	margin: 10px 7px 10px 7px;
+}
+
+.data td, .data th
+{
+	padding: 2px 5px 2px 5px;
+}
+
+.bordered td, .bordered th
+{
+	border-color: #AAAAAA;
+	border-style: solid;
+	border-width: 1px;
+}
+
+.nowrappable td, .nowrappable th
+{
+	white-space: nowrap;
+}
+
+a.rss:link    { text-decoration: none; color : White; }
+a.rss:visited { text-decoration: none; color : White; }
+a.rss:hover   { text-decoration: nonr; color : White; }
+
+h4, h5
+{
+	font-family : Verdana;
+	color       : #338899;
+}
+
+.data table.code
+{
+	border-style : none;
+	margin       : 0;
+	padding      : 0;
+	background   : #FFFFFF;
+}
+
+.data pre.code
+{
+	padding : 0;
+	padding : 0;
+}
+
+.code td, .code th
+{
+	border-style: none;
+}
+
+td.nosup
+{
+	font-weight: bold;
+	color      : Red;
+	text-align : center;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/index.htm	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,113 @@
+<div class="j">
+Business Logic Toolkit is a set of components to simplify .NET application development.
+BLToolkit is provided as <a href="Source/index.htm">source code</a> that you can use "as is" or customize for your applications.
+It is written in C# and compatible with .NET Framework 2.0, 3.0, and 3.5.<br/><br/>
+</div>
+<table border="0" cellpadding="0" cellspacing="0">
+<tr>
+<td>
+<% rss # rss.xml %>
+<br>
+<a class="rss" href="rss.xml">&nbsp;&nbsp;RSS&nbsp;&nbsp;</a>
+</td>
+<td nowrap>&nbsp;&nbsp;&nbsp;&nbsp;</td>
+<td>
+<ct_table>
+<ct_item link="Doc/Aspects/index.htm"         label="Aspects"        >
+CacheAspect, CounterAspect, LoggingAspect, MixinAttribute. All of these are available now in C# (well, with one little limitation).
+<% cs #
+[/*[a]*/Counter/*[/a]*/, /*[a]*/Log/*[/a]*/]
+public /*[a]*/abstract/*[/a]*/ class MyClass
+{
+	[/*[a]*/Cache/*[/a]*/]
+	public /*[a]*/virtual/*[/a]*/ int MyMethod(int p1, int p2)
+	{
+%>
+</ct_item>
+<mt_item link="Doc/ComponentModel/index.htm"  label="ComponentModel" >Object Binder. Add Business Objects' native purity and flexibility to your ASP.NET and WinForms applications.</mt_item>
+<mt_item link="Doc/Data/index.htm"            label="Data"           >
+High-level, data provider independent wrapper for ADO.NET.
+<% cs #
+using (DbManager db = new DbManager())
+{
+	return db
+		.SetCommand("SELECT * FROM Person")
+		.ExecuteList<Person>();
+%>
+</mt_item>
+<mt_item link="Doc/DataAccess/index.htm"      label="DataAccess"     >
+Data Access Layer. Got bored of writing the same data access code over and over again? Now you are saved from being just a coding machine!
+<% cs #
+public /*[a]*/abstract/*[/a]*/ class PersonAccessor : /*[a]*/DataAccessor/*[/a]*/
+{
+	[/*[a]*/SqlText/*[/a]*/(@"SELECT * FROM Person WHERE FirstName = @firstName")]
+	public /*[a]*/abstract/*[/a]*/ List<Person> GetPersonListByFirstName(string @firstName);
+
+	[/*[a]*/SprocName/*[/a]*/("sp_GetPersonListByLastName")]
+	public /*[a]*/abstract/*[/a]*/ List<Person> GetPersonListByLastName(string @lastName);
+%>
+</mt_item>
+<mt_item link="Doc/EditableObjects/index.htm" label="EditableObjects">
+Set of base classes to build custom object hierarchies. The <i>EditableObject</i> and <i>EditableList</i> classes support such methods as <i>AcceptChanges</i>, <i>RejectChanges</i>, flag <i>IsDirty</i>, and event <i>PropertyChanged</i>.
+<% cs #
+public /*[a]*/abstract/*[/a]*/ class TestObject : /*[a]*/EditableObject/*[/a]*/<TestObject>
+{
+	public /*[a]*/abstract/*[/a]*/ string FirstName { get; set; }
+	public /*[a]*/abstract/*[/a]*/ string LastName  { get; set; }
+}
+
+...
+
+TestObject obj = TestObject./*[a]*/CreateInstance/*[/a]*/();
+obj.FirstName = "Tester";
+obj.AcceptChanges();
+%>
+</mt_item>
+<mt_item link="Doc/Mapping/index.htm"         label="Mapping"        >High performance object mapper will help you build your own ORM.</mt_item>
+<mt_item link="Doc/Reflection/index.htm"      label="Reflection"     >The <i>TypeAccessor</i> class allows to avoid slowness of Reflection and gain incredible performance of applications working with types dynamically.</mt_item>
+<mt_item link="Doc/Reflection/Emit/index.htm" label="Reflection.Emit">
+The <i>EmitHelper</i> class - emit with a human face.
+<% cs #
+emit
+	// string.Format("Hello, {0}!", toWhom)
+	//
+	./*[a]*/ldstr/*[/a]*/   ("Hello, {0}!")
+	./*[a]*/ldarg_1/*[/a]*/
+	./*[a]*/call/*[/a]*/    (typeof(string), "Format", typeof(string), typeof(object))
+
+	// Console.WriteLine("Hello, World!");
+	//
+	./*[a]*/call/*[/a]*/    (typeof(Console), "WriteLine", typeof(string))
+	./*[a]*/ret/*[/a]*/()
+	;
+%>
+</mt_item>
+<mt_item link="Doc/TypeBuilder/index.htm"     label="TypeBuilder"    >Extensible run-time class generator.</mt_item>
+<mt_item link="Doc/Validation/index.htm"      label="Validation"     >Simple way to do a complex thing.</mt_item>
+
+<tr><td colspan="3" nowrap>
+<br>
+<br>
+<!-- Search Google -->
+<FORM method=GET action=http://www.google.com/custom>
+<TABLE bgcolor=#FFFFFF cellspacing=0 border=0>
+<tr valign=top><td>
+<A HREF=http://www.google.com/search>
+<IMG SRC=http://www.google.com/logos/Logo_40wht.gif border=0 ALT=Google align=middle></A>
+</td>
+<td>
+<INPUT TYPE=text name=q size=31 maxlength=255 value="">
+<INPUT type=submit name=sa VALUE="Google Search">
+<INPUT type=hidden name=cof VALUE="S:http://www.bltoolkit.com;VLC:#55AABB;AH:center;LC:#338899;ALC:#338899;AWFID:f21e212400fdbd32;">
+<input type=hidden name=domains value="bltoolkit.net"><br><input type=radio name=sitesearch value=""> Search WWW <input type=radio name=sitesearch value="bltoolkit.net" checked> Search bltoolkit.net 
+</td></tr></TABLE>
+</FORM>
+<!-- Search Google -->
+</td></tr>
+
+</ct_table>
+
+</td>
+</tr>
+</table>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/robots.txt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,3 @@
+User-Agent: *
+Disallow: /Source/
+Allow: /
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Content/rss.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<rss version="2.0">
+	<channel>
+		<title>Business Logic Toolkit for .NET</title>
+		<link>http://www.bltoolkit.net</link>
+		<description />
+		<lastBuildDate>2009-01-11</lastBuildDate>
+		<item>
+			<title>Version 3.1 released</title>
+			<link>http://www.bltoolkit.net/Download.htm</link>
+			<description>See &lt;a href="http://www.bltoolkit.net/Download.htm"&gt;change log&lt;/a&gt;</description>
+			<pubDate>2009-01-11</pubDate>
+		</item>
+		<item>
+			<title>Version 3.0 released</title>
+			<link>http://www.bltoolkit.net/Download.htm</link>
+			<description>See &lt;a href="http://www.bltoolkit.net/Download.htm"&gt;change log&lt;/a&gt;</description>
+			<pubDate>2008-05-21</pubDate>
+		</item>
+		<item>
+			<title>New examples</title>
+			<link>http://www.bltoolkit.net/Doc/</link>
+			<description>See the following &lt;a href="http://www.bltoolkit.net/Doc/"&gt;link&lt;/a&gt;</description>
+			<pubDate>2008-05-10</pubDate>
+		</item>
+		<item>
+			<title>Version 2.0.7 released</title>
+			<link>http://www.bltoolkit.net/Download.htm</link>
+			<description>See &lt;a href="http://www.bltoolkit.net/Download.htm"&gt;change log&lt;/a&gt;</description>
+			<pubDate>2008-02-12</pubDate>
+		</item>
+		<item>
+			<title>New web demo project</title>
+			<link>http://www.bltoolkit.net/Download.htm</link>
+			<description>MS PetShop 4.0 powered by BLToolkit. See the dev version of the project.</description>
+			<pubDate>2007-07-21</pubDate>
+		</item>
+		<item>
+			<title>Version 2.0.6 released</title>
+			<link>http://www.bltoolkit.net/Download.htm</link>
+			<description>See &lt;a href="http://www.bltoolkit.net/Download.htm"&gt;change log&lt;/a&gt;</description>
+			<pubDate>2007-07-21</pubDate>
+		</item>
+		<item>
+			<title>How to map into internal object</title>
+			<link>http://www.bltoolkit.net/Doc/Mapping/MapFieldAttribute.htm</link>
+			<description>
+				&lt;a href="http://www.bltoolkit.net/Doc/Mapping/MapFieldAttribute.htm"&gt;Map.MapFieldAttribute&lt;/a&gt;
+			</description>
+			<category>Examples</category>
+			<pubDate>2007-06-05</pubDate>
+		</item>
+		<item>
+			<title>Version 2.0.5 released</title>
+			<link>http://www.bltoolkit.net/Download.htm</link>
+			<description>See &lt;a href="http://www.bltoolkit.net/Download.htm"&gt;change log&lt;/a&gt;</description>
+			<pubDate>2007-05-17</pubDate>
+		</item>
+		<item>
+			<title>Version 2.0.4 released</title>
+			<link>http://www.bltoolkit.net/Download.htm</link>
+			<description>See &lt;a href="http://www.bltoolkit.net/Download.htm"&gt;change log&lt;/a&gt;</description>
+			<pubDate>2007-02-12</pubDate>
+		</item>
+		<item>
+			<title>Version 2.0.3 released</title>
+			<link>http://www.bltoolkit.net/Download.htm</link>
+			<description>See &lt;a href="http://www.bltoolkit.net/Download.htm"&gt;change log&lt;/a&gt;</description>
+			<pubDate>2006-10-22</pubDate>
+		</item>
+		<item>
+			<title>Version 2.0.1 released</title>
+			<link>http://www.bltoolkit.net/Download.htm</link>
+			<description></description>
+			<pubDate>2006-08-27</pubDate>
+		</item>
+		<item>
+			<title>How to map one object to another</title>
+			<link>http://www.bltoolkit.net/Doc/Mapping/ObjectToObject.htm</link>
+			<description>
+				&lt;a href="http://www.bltoolkit.net/Doc/Mapping/ObjectToObject.htm"&gt;Map.ObjectToObject&lt;/a&gt;
+			</description>
+			<category>Examples</category>
+			<pubDate>2006-05-21</pubDate>
+		</item>
+		<item>
+			<title>How to emit with BLToolkit</title>
+			<link>http://www.bltoolkit.net/Doc/Reflection/Emit/HelloWorld.htm</link>
+			<description>
+				&lt;a href="http://www.bltoolkit.net/Doc/Reflection/Emit/HelloWorld.htm"&gt;Hello, World!&lt;/a&gt;
+			</description>
+			<category>Examples</category>
+			<pubDate>2006-05-10</pubDate>
+		</item>
+		<item>
+			<title>DataAccessor examples</title>
+			<link>http://www.bltoolkit.net/Doc/DataAccess/index.htm</link>
+			<description>
+				&lt;a href="http://www.bltoolkit.net/Doc/DataAccess/ExecuteList.htm"&gt;ExecuteList&lt;/a&gt;&lt;br&gt;
+				&lt;a href="http://www.bltoolkit.net/Doc/DataAccess/ExecuteDictionary.htm"&gt;ExecuteDictionary&lt;/a&gt;&lt;br&gt;
+				&lt;a href="http://www.bltoolkit.net/Doc/DataAccess/ExecuteObject.htm"&gt;ExecuteObject&lt;/a&gt;&lt;br&gt;
+				&lt;a href="http://www.bltoolkit.net/Doc/DataAccess/ExecuteScalar.htm"&gt;ExecuteScalar&lt;/a&gt;
+			</description>
+			<category>Examples</category>
+			<pubDate>2006-04-30</pubDate>
+		</item>
+		<item>
+			<title>IDictionary support for abstract accessors</title>
+			<link>http://www.bltoolkit.net/Doc/DataAccess/ExecuteDictionary.htm</link>
+			<description>Now abstract accessor can return an object that implemens IDictionary interface.</description>
+			<category>Features</category>
+			<pubDate>2006-04-26</pubDate>
+		</item>
+	</channel>
+</rss>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/DocGen.sln	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,30 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebGen", "WebGen.csproj", "{06353283-C802-4706-BB18-5BBC49B03D59}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChmGen", "ChmGen.csproj", "{23AD6408-9310-4D0F-B461-C590EAF82868}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "_Content", "_Content.csproj", "{DE11BCB2-94A1-4691-9192-5FC8E0323E2E}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{06353283-C802-4706-BB18-5BBC49B03D59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{06353283-C802-4706-BB18-5BBC49B03D59}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{06353283-C802-4706-BB18-5BBC49B03D59}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{06353283-C802-4706-BB18-5BBC49B03D59}.Release|Any CPU.Build.0 = Release|Any CPU
+		{23AD6408-9310-4D0F-B461-C590EAF82868}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{23AD6408-9310-4D0F-B461-C590EAF82868}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{23AD6408-9310-4D0F-B461-C590EAF82868}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{23AD6408-9310-4D0F-B461-C590EAF82868}.Release|Any CPU.Build.0 = Release|Any CPU
+		{DE11BCB2-94A1-4691-9192-5FC8E0323E2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{DE11BCB2-94A1-4691-9192-5FC8E0323E2E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/FileAction.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,11 @@
+using System;
+
+namespace DocGen
+{
+	enum FileAction
+	{
+		Skip,
+		Copy,
+		Process
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/FileItem.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,121 @@
+using System;
+using System.Collections.Generic;
+
+namespace DocGen
+{
+	class FileItem
+	{
+		public bool           IsFile;
+		public string         Name;
+		public List<FileItem> Items;
+		public FileItem       Parent;
+		public string         Group;
+		public List<string>   Indexes   = new List<string>();
+		public List<string>   NoIndexes = new List<string>();
+		public bool           NoIndex;
+
+		private string _title;
+		public  string  Title
+		{
+			get { return _title ?? System.IO.Path.GetFileNameWithoutExtension(Name); }
+			set { _title = value; }
+		}
+
+		private int _sortOrder;
+		public  int  SortOrder
+		{
+			get
+			{
+				if (_sortOrder == 0 && Items != null)
+					return Items[0].SortOrder;
+
+				return _sortOrder;
+			}
+
+			set { _sortOrder = value; }
+		}
+
+		public string Path
+		{
+			get
+			{
+				return Name.Replace(Program.destPath, "").Replace("\\", "/");
+			}
+		}
+
+		public IEnumerable<FileItem> GetFiles()
+		{
+			if (Items != null)
+			{
+				foreach (var item in Items)
+				{
+					if (item.IsFile)
+						yield return item;
+
+					if (item.Items != null)
+						foreach (var i in item.GetFiles())
+							yield return i;
+				}
+			}
+		}
+
+		public void Add(FileItem item)
+		{
+			item.Parent = this;
+
+			if (Items == null)
+				Items = new List<FileItem>();
+
+			Items.Add(item);
+		}
+
+		public void Prepare()
+		{
+			if (Items != null)
+			{
+				var groups = new List<FileItem>();
+
+				for (var i = 0; i < Items.Count; i++)
+				{
+					var item = Items[i];
+
+					if (item.Group != null && item.Group != Name)
+					{
+						var group = groups.Find(file => file.Name == item.Group);
+
+						if (group == null)
+							groups.Add(group = new FileItem { Name = item.Group, SortOrder = item.SortOrder });
+
+						group.Add(item);
+						Items.RemoveAt(i);
+
+						i--;
+					}
+				}
+
+				Items.AddRange(groups);
+
+				foreach (var item in Items)
+					item.Prepare();
+
+				Items.Sort((x, y) =>
+				{
+					var xname = x.Title.ToLower();
+					var yname = y.Title.ToLower();
+
+					if (xname == yname)                         return  0;
+					if (x.Name.ToLower().EndsWith("index.htm")) return -1;
+					if (y.Name.ToLower().EndsWith("index.htm")) return  1;
+
+					if (x.SortOrder != 0 && y.SortOrder != 0)
+						return x.SortOrder - y.SortOrder;
+
+					if (x.SortOrder != 0) return -1;
+					if (y.SortOrder != 0) return  1;
+
+					return string.Compare(xname, yname);
+				});
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Generator.Chm.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+using System;
+
+namespace DocGen
+{
+	partial class Generator
+	{
+		const bool _addDashToTitle    = false;
+		const bool _modifySourceLinks = true;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Generator.Web.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+using System;
+
+namespace DocGen
+{
+	partial class Generator
+	{
+		const bool _addDashToTitle    = true;
+		const bool _modifySourceLinks = false;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Generator.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,663 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Text.RegularExpressions;
+using System.Xml;
+
+using Rsdn.Framework.Formatting;
+
+namespace DocGen
+{
+	delegate FileAction FileActionHandler(string ext);
+
+	partial class Generator
+	{
+		string            _sourcePath;
+		string            _destFolder;
+		FileActionHandler _fileAction;
+
+		public void Generate(
+			FileItem          createdFiles,
+			string            templateFileName,
+			string[]          path,
+			string            destFolder,
+			string            sourcePath,
+			bool              cleanUp,
+			bool              createIndex,
+			FileActionHandler fileAction)
+		{
+			_sourcePath = Path.GetFullPath(sourcePath);
+			_destFolder = Path.GetFullPath(destFolder);
+			_fileAction = fileAction;
+
+			if (cleanUp)
+				CleanUp();
+
+			CreateDestFolder();
+
+			var template = File.ReadAllText(templateFileName);
+
+			GenerateContent(createdFiles, template, path, createIndex);
+		}
+
+		private void CreateDestFolder()
+		{
+			if (Directory.Exists(_destFolder) == false)
+				Directory.CreateDirectory(_destFolder);
+		}
+
+		private void CleanUp()
+		{
+			if (Directory.Exists(_destFolder) == false)
+				return;
+
+			Action<string> clean = null; clean = delegate(string path)
+			{
+				foreach (var file in Directory.GetFiles(path))
+					if (Path.GetExtension(file).ToLower() != ".zip")
+						try { File.Delete(file); } catch {}
+
+				foreach (var dir in Directory.GetDirectories(path))
+				{
+					clean(dir);
+					try { Directory.Delete(dir); } catch {}
+				}
+			};
+
+			clean(_destFolder);
+		}
+
+		static readonly Regex ct_item1 = new Regex(@"<ct_item\s*link\=(?<link>.*?)\s*label=['""](?<label>.*?)['""]\s*/>");
+		static readonly Regex ct_item2 = new Regex(@"<ct_item\s*link\=(?<link>.*?)\s*label=['""](?<label>.*?)['""]\s*>(?<text>.*?)</ct_item>", RegexOptions.Singleline);
+		static readonly Regex ct_item3 = new Regex(@"<mt_item\s*link\=(?<link>.*?)\s*label=['""](?<label>.*?)['""]\s*>(?<text>.*?)</mt_item>", RegexOptions.Singleline);
+		static readonly Regex ct_item4 = new Regex(@"<ct_item2\s*link1\=(?<link1>.*?)\s*label1=['""](?<label1>.*?)['""]\s*link2\=(?<link2>.*?)\s*label2=['""](?<label2>.*?)['""]\s*/>", RegexOptions.Singleline);
+		static readonly Regex ct_item5 = new Regex(@"<ct_item3\s*link1\=(?<link1>.*?)\s*label1=['""](?<label1>.*?)['""]\s*link2\=(?<link2>.*?)\s*label2=['""](?<label2>.*?)['""]\s*link3\=(?<link3>.*?)\s*label3=['""](?<label3>.*?)['""]\s*/>", RegexOptions.Singleline);
+
+		private bool GenerateContent(
+			FileItem createdFiles, string template, string[] path, bool createIndex)
+		{
+			var folder     = string.Join("/", path);
+			var destFolder = Path.Combine(_destFolder, folder);
+			var backPath   = "";
+
+			for (var i = 0; i < path.Length; i++)
+				backPath += "../";
+
+			var sourcePath  = Path.Combine(_sourcePath, folder);
+			var sourceFiles = Directory.GetFiles(sourcePath);
+
+			var files   = new List<string>();
+			var folders = new List<string>();
+
+			foreach (var fileName in sourceFiles)
+			{
+				var backLinks = GeneratePath(path, backPath, fileName);
+
+				var destName  = Path.Combine(destFolder, Path.GetFileName(fileName));
+				var ext       = Path.GetExtension(destName).ToLower();
+
+				Console.WriteLine(destName);
+
+				switch (_fileAction(fileName))
+				{
+					case FileAction.Skip:
+						break;
+
+					case FileAction.Copy:
+						File.Copy(fileName, destName, true);
+						break;
+
+					case FileAction.Process:
+						if (Directory.Exists(destFolder) == false)
+							Directory.CreateDirectory(destFolder);
+
+						switch (ext)
+						{
+							case ".htm":
+							case ".html":
+								using (var sw = File.CreateText(destName))
+								using (var sr = File.OpenText(fileName))
+								{
+									var item = new FileItem { IsFile = true, Name = destName };
+									createdFiles.Add(item);
+
+									var source = sr.ReadToEnd();
+
+									source = source
+										.Replace("<ct_table>",  "<table border='0' cellpadding='0' cellspacing='0'>")
+										.Replace("<ct_hr>",     "<ct_mg><tr><td colspan='5' class='hr'><img width='1' height='1' alt=''/></td></tr><ct_mg>")
+										.Replace("<ct_text>",   "<tr><td colspan='5'>")
+										.Replace("</ct_text>",  "</td></tr><ct_mg>")
+										.Replace("<ct_mg>",     "<tr><td colspan='5' class='sp'><img width='1' height='1' alt=''/></td></tr>")
+										.Replace("</ct_table>", "</table>")
+										;
+
+									source = ct_item1.Replace(source, @"<tr><td nowrap colspan='5'>&#8226; <a href=${link}>${label}</a></td></tr>");
+									source = ct_item2.Replace(source, @"<tr><td nowrap>&#8226; <a href=${link}>${label}</a></td><td>&nbsp;&nbsp;&nbsp;</td><td class='j' colspan='3'>${text}</td></tr>");
+									source = ct_item3.Replace(source, @"<tr><td nowrap class='p'>&#8226; <a href=${link}>${label}</a></td><td></td><td class='pj' colspan='3'>${text}</td></tr>");
+									source = ct_item4.Replace(source, @"<tr><td nowrap>&#8226; <a href=${link1}>${label1}</a></td><td>&nbsp;&nbsp;&nbsp;</td><td nowrap colspan='3'>&#8226; <a href=${link2}>${label2}</a></td></tr>");
+									source = ct_item5.Replace(source, @"<tr><td nowrap>&#8226; <a href=${link1}>${label1}</a></td><td>&nbsp;&nbsp;&nbsp;</td><td nowrap>&#8226; <a href=${link2}>${label2}</a></td><td>&nbsp;&nbsp;&nbsp;</td><td nowrap>&#8226; <a href=${link3}>${label3}</a></td></tr>");
+
+									if (_modifySourceLinks)
+									{
+										source = source
+											.Replace("href=\"..\\..\\..\\Source\\", "target=_blank href=\"/Source/")
+											.Replace("href='..\\..\\..\\Source\\",  "target=_blank href='/Source/")
+											.Replace("<a href=\"http://", "<a target=_blank href=\"http://")
+											.Replace("<a href='http://",  "<a target=_blank href='http://")
+											;
+									}
+
+									var title  = item.Title;
+
+									if (title == "index")
+									{
+										title = Path.GetFileName(Path.GetDirectoryName(fileName));
+
+										if (title != "content")
+											item.Title = title;
+									}
+
+									source = GenerateSource(source, item);
+									title  = item.Title;
+
+									if (title.Length > 0 && _addDashToTitle)
+										title += " - ";
+
+									sw.WriteLine(string.Format(
+										template,
+										source,
+										backPath,
+										backLinks,
+										title));
+
+									if (item.NoIndex == false)
+									{
+										source = source
+											.Replace("<span class='a'>", "")
+											.Replace("</span>", "")
+											.Replace("&lt;", "<")
+											.Replace("&gt;", ">")
+											;
+
+										foreach (var index in IndexItem.Index)
+											if (!item.NoIndexes.Contains(index.Name))
+												foreach (var s in index.Text)
+													if (source.IndexOf(s) >= 0)
+													{
+														index.Files.Add(item);
+														break;
+													}
+
+										foreach (var s in item.Indexes)
+										{
+											var index = IndexItem.Index.Find(i => i.Name == s);
+
+											if (index == null)
+												IndexItem.Index.Add(new IndexItem(s));
+
+											if (index.Files.Contains(item) == false)
+												index.Files.Add(item);
+										}
+									}
+								}
+
+								break;
+
+							case ".cs":
+								using (var sw = File.CreateText(destName + ".htm"))
+								{
+									createdFiles.Add(new FileItem { IsFile = true, Name = destName + ".htm" });
+
+									var source = GenerateSource("<% " + fileName + " %>", null);
+
+									sw.WriteLine(string.Format(
+										template,
+										source,
+										backPath,
+										backLinks,
+										Path.GetFileNameWithoutExtension(fileName) + " - "));
+								}
+								break;
+						}
+
+						files.Add(fileName);
+
+						break;
+				}
+			}
+
+			var dirs    = Directory.GetDirectories(sourcePath);
+			var newPath = new string[path.Length + 1];
+
+			path.CopyTo(newPath, 0);
+
+			foreach (var dir in dirs)
+			{
+				var dirList = dir.Split('/', '\\');
+				var dirName = dirList[dirList.Length - 1];
+
+				// Skip Subversion folders.
+				//
+				if (dirName == "_svn" || dirName == ".svn")
+					continue;
+
+				newPath[path.Length] = dirName;
+
+				var item = new FileItem { IsFile = false, Name = dirName};
+
+				createdFiles.Add(item);
+
+				if (GenerateContent(item, template, newPath, createIndex))
+					folders.Add(dir);
+			}
+
+			if (files.Count > 0 || folders.Count > 0)
+			{
+				var indexName = destFolder + "/index.htm";
+
+				if (createIndex && File.Exists(indexName) == false)
+				{
+					var str = "";
+
+					folders.Sort();
+
+					foreach (var s in folders)
+						str += string.Format("&#8226; <a href='{0}/index.htm'>{0}</a><br>\n",
+							Path.GetFileName(s));
+
+					if (str.Length > 0)
+						str += "<br>";
+
+					files.Sort();
+
+					foreach (var s in files)
+						str += string.Format(
+							s.EndsWith(".htm",  true, CultureInfo.CurrentCulture) ||
+							s.EndsWith(".html", true, CultureInfo.CurrentCulture)?
+								"&#8226; <a href='{0}'>{0}</a><br>":
+								"&#8226; <a href='{0}.htm'>{0}</a><br>\n",
+							Path.GetFileName(s));
+
+					_fileAction(indexName);
+
+					using (var sw = File.CreateText(indexName))
+					{
+						createdFiles.Add(new FileItem { IsFile = true, Name = indexName });
+
+						sw.WriteLine(string.Format(
+							template,
+							str,
+							backPath,
+							GeneratePath(path, backPath, "@@@").Replace(".@@@", ""),
+							Path.GetFileNameWithoutExtension(destFolder) + " - "));
+					}
+				}
+
+				return true;
+			}
+
+			return false;
+		}
+
+		private string GenerateSource(string text, FileItem item)
+		{
+			for (int
+				 idx = text.IndexOf("<%"),
+				 end = text.IndexOf("%>", idx + 2);
+				 idx >= 0 &&
+				 end >= 0;
+				 idx = text.IndexOf("<%", idx + 2),
+				 end = text.IndexOf("%>", idx + 2))
+			{
+				var startSource = text.Substring(0, idx);
+				var source      = text.Substring(idx + 2, end - idx - 2).Trim();
+				var command     = "source";
+
+				var cmdIdx = source.IndexOf('#');
+
+				if (cmdIdx >= 0)
+				{
+					command = source.Substring(0, cmdIdx).Trim().ToLower();
+					source  = source.Substring(cmdIdx+1).Trim();
+				}
+
+				switch (command)
+				{
+					case "source"  : source = GetSourceCodeFromPath(Path.Combine(_sourcePath, source), text); break;
+					case "rss"     : source = GetNews              (Path.Combine(_sourcePath, source));       break;
+					case "txt"     :
+					case "cs"      :
+					case "sql"     : source = GetSourceCode(source, "." + command, text);                     break;
+					case "title"   : item.Title     = source;            source = "";                         break;
+					case "order"   : item.SortOrder = int.Parse(source); source = "";                         break;
+					case "group"   : item.Group     = source;            source = "";                         break;
+					case "index"   : item.Indexes.Add(source);           source = "";                         break;
+					case "table"   : source = GetTable(Path.Combine(_sourcePath, source));                    break;
+					case "noindex" :
+						if (source.Length == 0)
+							item.NoIndex = true;
+						else
+							item.NoIndexes.Add(source);
+							
+						source = "";
+						break;
+
+					default        : throw new InvalidOperationException();
+				}
+
+				text = startSource + source + text.Substring(end + 2);
+			}
+
+			return text
+				.Replace(@"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=DBHost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XE)));User Id=TestUser;Password=TestPassword;", "...");
+		}
+
+		private static string GetNews(string sourcePath)
+		{
+			var doc = new XmlDocument();
+
+			doc.Load(sourcePath);
+
+			var html   = "<table border='0' cellpadding='0' cellspacing='0'>";
+			var @class = "";
+			var i      = 0;
+
+			foreach (XmlNode item in doc.SelectNodes("rss/channel/item"))
+			{
+				html += string.Format(@"
+<tr><td{0} colspan='2'><nobr><b>{1:MM/dd/yy}</nobr></b> <a href='{2}'>{3}</a></td></tr>
+<tr><td>&nbsp;&nbsp;</td><td class='j'>{4}</td></tr>
+",
+					@class,
+					DateTime.Parse(item.SelectSingleNode("pubDate").InnerText),
+					item.SelectSingleNode("link").       InnerText,
+					item.SelectSingleNode("title").      InnerText,
+					item.SelectSingleNode("description").InnerText);
+
+				@class = " class='p'";
+
+				if (++i == 20)
+					break;
+			}
+
+			html += "</table>";
+
+			return html;
+		}
+
+		private static string GetSourceCode(string code, string ext, string source)
+		{
+			switch (ext)
+			{
+				case ".cpp":    code = "[c]"    + code + "[/c]";    break;
+				case ".cs":     code = "[c#]"   + code + "[/c#]";   break;
+				case ".vb":     code = "[vb]"   + code + "[/vb]";   break;
+				case ".xml":
+				case ".config": code = "[xml]"  + code + "[/xml]";  break;
+				case ".sql":    code = "[sql]"  + code + "[/sql]";  break;
+				default   :     code = "[code]" + code + "[/code]"; break;
+			}
+
+			code = code
+				.Replace("/*[", "[")
+				.Replace("]*/", "]")
+				;
+
+			code = new TextFormatter().Format(code, false);
+
+			if (source.IndexOf("<a name='Person'></a>") >= 0)
+				code = code
+					.Replace("&lt;Person&gt;", "&lt;<a class=m href=#Person>Person</a>&gt;")
+					.Replace(", Person&gt;",   ", <a class=m href=#Person>Person</a>&gt;")
+					.Replace("  Person ",      "  <a class='m' href=#Person>Person</a> ")
+					.Replace(" Person()",      " <a class='m' href=#Person>Person</a>()")
+					.Replace("(Person ",       "(<a class='m' href=#Person>Person</a> ")
+					;
+
+			return code
+				.Replace("\n",      "\r\n")
+				.Replace("\r\r\n",  "\r\n")
+				.Replace("<table width='96%'>", "<table width='100%' class='code'>")
+				.Replace("<pre>",   "<pre class='code'>")
+				.Replace("[a]",     "<span class='a'>")
+				.Replace("[/a]",    "</span>")
+				.Replace("[link]",  "<a ")
+				.Replace("[/link]", "</a>")
+				.Replace("[file]",  "href='/Source/")
+				.Replace("[/file]", ".htm'>")
+				.Replace("&lt;!--", "<span class='com'>&lt;!--")
+				.Replace("--&gt;",  "--&gt;</span>")
+				;
+		}
+
+		private static string GetSourceCodeFromPath(string sourcePath, string source)
+		{
+			var code = "";
+
+			using (var sr = File.OpenText(sourcePath))
+				for (var s = sr.ReadLine(); s != null; s = sr.ReadLine())
+					if (!s.StartsWith("//@") && !s.StartsWith("''@"))
+						code += s + "\n";
+
+			return GetSourceCode(code, Path.GetExtension(sourcePath).ToLower(), source);
+		}
+
+		private static string GeneratePath(string[] path, string backPath, string fileName)
+		{
+			if (path.Length == 0)
+				return "";
+
+			var backLinks = "";
+			var parent    = "";
+			var name      = Path.GetFileNameWithoutExtension(fileName);
+
+			switch (path[0])
+			{
+				case "Doc":
+					backLinks += string.Format(
+						"<br><nobr>&nbsp;&nbsp;<small><a class='m' href='{0}Doc/index.htm'>Doc</a>",
+						backPath);
+
+					for (var i = 1; i < path.Length; i++)
+					{
+						parent = "";
+
+						for (var j = i + 1; j < path.Length; j++)
+							parent += "../";
+
+						backLinks += string.Format(".<a class='m' href='{0}index.htm'>{1}</a>", parent, path[i]);
+					}
+
+					if (name.ToLower() != "index")
+					{
+						backLinks += string.Format(".<a class='m' href='{0}{1}'>{2}</a>",
+							parent, Path.GetFileName(fileName), name);
+					}
+
+					backLinks += "<small></nobr></br>";
+
+					break;
+
+				case "Source":
+					backLinks += string.Format(
+						"<br><nobr>&nbsp;&nbsp;<small><a class='m' href='{0}Source/index.htm'>Source</a>",
+						backPath);
+
+					for (var i = 1; i < path.Length; i++)
+					{
+						parent = "";
+
+						for (var j = i + 1; j < path.Length; j++)
+							parent += "../";
+
+						backLinks += string.Format(".<a class='m' href='{0}index.htm'>{1}</a>", parent, path[i]);
+					}
+
+					if (name.ToLower() != "@@@")
+					{
+						backLinks += string.Format(".<a class='m' href='{0}{1}.htm'>{1}</a>",
+							parent, Path.GetFileName(fileName));
+					}
+
+					backLinks += "<small></nobr></br>";
+
+					break;
+			}
+
+			return backLinks;
+		}
+
+		class TableItem
+		{
+			public string Provider;
+			public string Feature;
+			public string Linq;
+			public string Implementation;
+		}
+
+		static string _providerName;
+
+		static TableItem GetTableItem(string line)
+		{
+			if (line.StartsWith("*"))
+			{
+				_providerName = line.Substring(1).Trim();
+				return null;
+			}
+
+			var ss = line.Replace("||", "$$$$$").Split('|');
+
+			if (ss.Length != 4)
+				throw new InvalidOperationException(line);
+
+			var impl = ss[3].Trim().Replace("$$$$$", "||");
+
+			if (impl.StartsWith("#"))
+			{
+				impl = impl.Substring(impl.IndexOf(' ')).Replace("\\n", "\n").Replace("\\t", "\t").Trim();
+				impl = GetSourceCode(impl, ".sql", "");
+			}
+
+			return new TableItem
+			{
+				Provider       = _providerName,
+				Feature        = ss[1].Trim().Replace("$$$$$", "||"),
+				Linq           = ss[2].Trim().Replace("$$$$$", "||"),
+				Implementation = impl
+			};
+		}
+
+		static string GetTable(string sourcePath)
+		{
+			Console.WriteLine("table {0}", sourcePath);
+
+			var lines     = File.ReadAllLines(sourcePath);
+			var items     = (from l in lines where l.Trim().Length > 0 select GetTableItem(l)).Where(i => i != null).ToList();
+			var providers = (from i in items where i.Provider.Length > 0 group i by i.Provider into g select g.Key).ToList();
+			var forall    = (from i in items where i.Provider.Length == 0 select i).ToList();
+
+			foreach (var p in providers)
+			{
+				items.AddRange(from a in forall select new TableItem
+				{
+					Provider       = p,
+					Feature        = a.Feature,
+					Linq           = a.Linq,
+					Implementation = a.Implementation
+				});
+			}
+
+			foreach (var i in forall)
+				items.Remove(i);
+
+			var features  = (
+				from i in items
+				group i by new { i.Feature, i.Linq } into g
+				orderby g.Key.Feature, g.Key.Linq
+				select new
+				{
+					g.Key.Feature,
+					g.Key.Linq,
+					Providers = new string[providers.Count()]
+				}
+			).ToList();
+
+			foreach (var f in features)
+			{
+				for (var i = 0; i < providers.Count; i++)
+				{
+					f.Providers[i] = (
+						from it in items
+						where it.Provider == providers[i] && it.Feature == f.Feature && it.Linq == f.Linq
+						select it.Implementation
+					).FirstOrDefault();
+				}
+			}
+
+			var s = "<table class='data bordered nowrappable'>\n<tr><th>&nbsp;</th><th>Linq</th>";
+
+			foreach (var p in providers)
+				s += "<th>" + p + "</th>";
+
+			s += "</tr>";
+
+			var byFeature = from f in features group f by f.Feature;
+
+			foreach (var f in byFeature)
+			{
+				bool first = true;
+
+				foreach (var l in f)
+				{
+					s += "<tr>";
+
+					if (first)
+					{
+						s += f.Count() == 1? "<td>": "<td rowspan=" + f.Count() + ">";
+						s += f.Key + "</td>";
+						first = false;
+					}
+
+					s += "<td>" + l.Linq + "</td>";
+
+					var    n = 0;
+					string p = null;
+
+					for (var i = 0; i < l.Providers.Count(); i++)
+					{
+						if (l.Providers[i] == p)
+							n++;
+						else
+						{
+							if (n > 0)
+							{
+								s += n == 1? "<td": "<td colspan=" + n;
+								s += p == null ? " class=nosup>" : ">";
+								s += p ?? "X";
+								s += "</td>";
+							}
+
+							p = l.Providers[i];
+							n = 1;
+						}
+					}
+
+					if (n > 0)
+					{
+						s += n == 1? "<td": "<td colspan=" + n;
+						s += p == null ? " class=nosup>" : ">";
+						s += p ?? "X";
+						s += "</td>";
+					}
+
+					s += "</tr>\n";
+				}
+			}
+
+			return s + "</table>";
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/IndexItem.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,149 @@
+using System;
+using System.Collections.Generic;
+
+namespace DocGen
+{
+	class IndexItem
+	{
+		public IndexItem(string name)
+		{
+			Name = name;
+
+			var ss = name.Split(' ');
+
+			if (ss.Length > 1)
+			{
+				switch (ss[1])
+				{
+					case "attribute" :
+					case "aspect"    : Text.Add("[" + ss[0]);
+					                   Text.Add(", " + ss[0]);      break;
+					case "method"    : Text.Add("." + ss[0] + "(");
+					                   Text.Add("." + ss[0] + "<");
+					                   Text.Add(" " + ss[0] + "(");
+					                   Text.Add(" " + ss[0] + "<"); break;
+					case "class"     :
+					case "enum"      :
+					case "component" : Text.Add("new " + ss[0]);
+					                   Text.Add(": " + ss[0]);
+					                   Text.Add("<" + ss[0] + ">");
+					                   Text.Add("<" + ss[0] + ",");
+					                   Text.Add(" " + ss[0] + ".");
+					                   Text.Add(" " + ss[0] + "<");
+					                   Text.Add("(" + ss[0] + ".");
+					                   Text.Add("(" + ss[0] + "<"); break;
+					case "property"  : Text.Add(ss[0] + " =");      break;
+					default          : Text.Add(ss[0]);             break;
+				}
+			}
+			else
+			{
+				Text.Add(ss[0]);
+			}
+		}
+
+		public IndexItem(string name, params string[] text)
+		{
+			Name = name;
+			Array.ForEach(text, Text.Add);
+		}
+
+		public string         Name;
+		public List<string>   Text  = new List<string>();
+		public List<FileItem> Files = new List<FileItem>();
+
+		public static List<IndexItem> Index;
+
+		static IndexItem()
+		{
+			Index = new List<IndexItem>
+			{
+				new IndexItem("Async aspect"),
+				new IndexItem("Cache aspect"),
+				new IndexItem("ClearCache aspect"),
+				new IndexItem("NoCache attribute"),
+				new IndexItem("Counter aspect"),
+				new IndexItem("Logging aspect",         "[Log"),
+				new IndexItem("Mixin aspect"),
+				new IndexItem("NotNull attribute"),
+
+				new IndexItem("ObjectBinder component", "ObjectBinder"),
+				new IndexItem("DbManager component"),
+				new IndexItem("DataProvider class",     "DataProvider"),
+				new IndexItem("MapResultSet class"),
+				new IndexItem("ScalarSourceType enum"),
+				new IndexItem("AddRelation method"),
+				new IndexItem("AddConnectionString method"),
+				new IndexItem("AddDataProvider method"),
+				new IndexItem("AssignParameterValues method"),
+				new IndexItem("CreateParameters method"),
+				new IndexItem("SetCommand method"),
+				new IndexItem("SetSpCommand method"),
+				new IndexItem("Parameter method"),
+				new IndexItem("OutputParameter method"),
+				new IndexItem("Prepare method"),
+				new IndexItem("Close method"),
+				new IndexItem("ExecuteDataSet method"),
+				new IndexItem("ExecuteDataTable method"),
+				new IndexItem("ExecuteDictionary method"),
+				new IndexItem("ExecuteForEach method"),
+				new IndexItem("ExecuteList method"),
+				new IndexItem("ExecuteNonQuery method"),
+				new IndexItem("ExecuteObject method"),
+				new IndexItem("ExecuteReader method"),
+				new IndexItem("ExecuteResultSet method"),
+				new IndexItem("ExecuteScalar method"),
+				new IndexItem("ExecuteScalarDictionary method"),
+				new IndexItem("ExecuteScalarList method"),
+
+				new IndexItem("DataAccessor class"),
+				new IndexItem("Abstract accessors", "DataAccessor"),
+				new IndexItem("SqlQuery class"),
+				new IndexItem("SprocQuery class"),
+				new IndexItem("BeginTransaction method"),
+				new IndexItem("CommitTransaction method"),
+				new IndexItem("CreateDbManager method"),
+				new IndexItem("DataAccessor class"),
+				new IndexItem("GetDefaultSpName method"),
+				new IndexItem("GetTableName method"),
+				new IndexItem("Insert method"),
+				new IndexItem("PrepareSqlQuery method"),
+				new IndexItem("SelectByKey method"),
+				new IndexItem("SelectAll method"),
+				new IndexItem("TableName attribute"),
+				new IndexItem("ActionName attribute"),
+				new IndexItem("ActionSprocName attribute"),
+				new IndexItem("ActualType attribute"),
+				new IndexItem("CommandBehavior attribute"),
+				new IndexItem("Destination attribute"),
+				new IndexItem("Direction attribute"),
+				new IndexItem("DiscoverParameters attribute"),
+				new IndexItem("DataSetTable  attribute"),
+				new IndexItem("Format attribute"),
+				new IndexItem("Index attribute"),
+				new IndexItem("ObjectType attribute"),
+				new IndexItem("NonUpdatable attribute"),
+				new IndexItem("ParamDbType attribute"),
+				new IndexItem("ParamName attribute"),
+				new IndexItem("ParamNullValue attribute"),
+				new IndexItem("ParamSize attribute"),
+				new IndexItem("PrimaryKey attribute"),
+				new IndexItem("ScalarFieldName attribute"),
+				new IndexItem("ScalarSource attribute"),
+				new IndexItem("SprocName attribute"),
+				new IndexItem("TableName attribute"),
+
+				new IndexItem("EditableObject class"),
+
+				new IndexItem("IsDynamic property"),
+				new IndexItem("Extensions property"),
+
+				new IndexItem("CompoundValue class"),
+				new IndexItem("TypeAccessor class"),
+				new IndexItem("TypeExtension class"),
+				new IndexItem("CreateInstance method"),
+				new IndexItem("GetExtensions method")
+			};
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Program.Chm.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,204 @@
+using System;
+using System.Diagnostics;
+using System.IO;
+
+namespace DocGen
+{
+	partial class Program
+	{
+		static readonly string _template = Path.GetFullPath(@"..\..\content\ChmTemplate.html");
+
+		static FileAction FilterFile(string fileName)
+		{
+			var name = Path.GetFileName(fileName).ToLower();
+
+			switch (name)
+			{
+				case "download.htm" :
+				case "robots.txt"   : return FileAction.Skip;
+				default             :
+					if (fileName.ToLower().EndsWith("\\content\\index.htm"))
+						return FileAction.Skip;
+					
+					return FileAction.Process;
+			}
+		}
+
+		static void CreateTarget(FileItem root)
+		{
+			CreateProjectFile(root);
+			CreateIndexFile  ();
+			CreateContentFile(root);
+
+			var hcc = ProgramFilesx86() + @"\HTML Help Workshop\hhc.exe";
+
+			Process.Start(hcc, destPath + "BLToolkit.hhp").WaitForExit();
+			Process.Start(Path.GetFullPath(@"..\..\..\..\Source\Doc\") + "BLToolkit.chm");
+		}
+
+		static string ProgramFilesx86()
+		{
+			if (IntPtr.Size == 8 || !String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432")))
+				return Environment.GetEnvironmentVariable("ProgramFiles(x86)");
+
+			return Environment.GetEnvironmentVariable("ProgramFiles");
+		}
+
+		static void CreateProjectFile(FileItem root)
+		{
+			using (var sw = File.CreateText(destPath + "BLToolkit.hhp"))
+			{
+				sw.WriteLine("[FILES]");
+
+				foreach (var file in root.GetFiles())
+				{
+					var s = file.Path;
+					sw.WriteLine(s);
+				}
+
+				var path = Path.GetFullPath(@"..\..\..\..\Source\Doc\");
+
+				sw.WriteLine(@"
+[OPTIONS]
+Title=BLToolkit
+Auto Index=Yes
+Compatibility=1.1 or later
+Compiled file={0}BLToolkit.chm
+Default Window=MsdnHelp
+Default topic=Home.htm
+Display compile progress=No
+Error log file=BLToolkit.log
+Full-text search=Yes
+Index file=BLToolkit.hhk
+Language=0x409 English (United States)
+Contents file=BLToolkit.hhc
+
+[WINDOWS]
+MsdnHelp=""Business Logic Toolkit for .NET Help"",""BLToolkit.hhc"",""BLToolkit.hhk"",""Home.htm"",""Home.htm"",,,,,0x63520,250,0x387e,[50,25,850,625],0x1020000,,,,,,0
+
+[INFOTYPES]
+",
+					path);
+			}
+		}
+
+		private static void CreateIndexFile()
+		{
+			using (var sw = File.CreateText(destPath + "BLToolkit.hhk"))
+			{
+				sw.WriteLine("<HTML><HEAD></HEAD><BODY><UL>");
+
+				foreach (var index in IndexItem.Index)
+				{
+					sw.WriteLine(
+						@"<LI><OBJECT type=""text/sitemap""><param name=""Name"" value=""{0}"">",
+						index.Name);
+
+					if (index.Files.Count == 0)
+						throw new InvalidDataException(string.Format("Index '{0}' is empty.", index.Name));
+
+					foreach (var file in index.Files)
+					{
+						if (file.Path == "Home.htm")
+							continue;
+
+						sw.WriteLine(@"
+	<param name=""Name"" value=""{0}"">
+	<param name=""Local"" value=""{1}"">",
+							file.Title, file.Path);
+					}
+
+					sw.WriteLine("</OBJECT>");
+				}
+
+				sw.WriteLine("</UL></BODY></HTML>");
+			}
+		}
+
+		private static void CreateContent(FileItem dir, TextWriter sw)
+		{
+			if (dir.Items == null)
+				return;
+
+			var index = dir.Items.Find(i => i.Name.ToLower().EndsWith("index.htm"));
+
+			if (index == null)
+			{
+				sw.WriteLine(
+					@"
+<LI><OBJECT type=""text/sitemap"">
+	<param name=""Name"" value=""{0}"">
+	</OBJECT>
+<UL>",
+					dir.Title);
+			}
+			else
+			{
+				sw.WriteLine(
+					@"
+<LI><OBJECT type=""text/sitemap"">
+	<param name=""Name"" value=""{0}"">
+	<param name=""Local"" value=""{1}"">
+	</OBJECT>
+<UL>",
+					index.Title, index.Name);
+			}
+
+			foreach (var file in dir.Items)
+			{
+				if (file.Name.ToLower().EndsWith("index.htm"))
+					continue;
+
+				if (file.IsFile)
+				{
+					sw.WriteLine(@"
+<LI><OBJECT type=""text/sitemap"">
+	<param name=""Name"" value=""{0}"">
+	<param name=""Local"" value=""{1}"">
+	</OBJECT>",
+					             file.Title, file.Name);
+
+				}
+				else
+					CreateContent(file, sw);
+			}
+
+			sw.WriteLine("</UL>");
+		}
+
+		private static void CreateContentFile(FileItem root)
+		{
+			using (var sw = File.CreateText(destPath + "BLToolkit.hhc"))
+			{
+				sw.WriteLine(@"
+<HTML>
+<HEAD>
+</HEAD><BODY>
+<UL>
+	<LI> <OBJECT type=""text/sitemap"">
+		<param name=""Name"" value=""Home"">
+		<param name=""Local"" value=""Home.htm"">
+		</OBJECT>
+	<LI> <OBJECT type=""text/sitemap"">
+		<param name=""Name"" value=""License"">
+		<param name=""Local"" value=""License.htm"">
+		</OBJECT>");
+
+				foreach (var file in root.Items)
+				{
+					if (!file.IsFile && file.Name == "Doc")
+					{
+						file.Title = "Documentation";
+						CreateContent(file, sw);
+						break;
+					}
+				}
+
+				sw.WriteLine(@"
+</UL>
+</BODY></HTML>
+");
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Program.Web.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,79 @@
+using System;
+using System.IO;
+
+namespace DocGen
+{
+	partial class Program
+	{
+		static readonly string _template = Path.GetFullPath(@"..\..\content\WebTemplate.html");
+
+		static FileAction FilterFile(string fileName)
+		{
+			var name = Path.GetFileName(fileName).ToLower();
+
+			switch (name)
+			{
+				case "home.htm" : return FileAction.Skip;
+				default         : return FileAction.Process;
+			}
+		}
+
+		static void CreateTarget(FileItem files)
+		{
+			new Generator().Generate(
+				new FileItem(),
+				_template, new[] { "Source" }, destPath, @"..\..\..\..\", false, true,
+				fileName =>
+				{
+					var name = Path.GetFileName(fileName).ToLower();
+
+					if (name == "assemblyinfo.cs")
+						return FileAction.Skip;
+
+					var ext = Path.GetExtension(fileName).ToLower();
+
+					switch (ext)
+					{
+						case ".cs": return FileAction.Process;
+						default   : return FileAction.Skip;
+					}
+				});
+
+			CreateSitemap(files);
+		}
+
+		static void CreateSitemap(FileItem files)
+		{
+			var sm = "";
+
+			foreach (var file in files.GetFiles())
+			{
+				var s = file.Name.Replace(destPath, "http://www.bltoolkit.net/").Replace("\\", "/");
+
+				if (s == "http://www.bltoolkit.net/index.htm")
+					continue;
+
+				sm += string.Format(@"
+	<url>
+		<loc>{0}</loc>
+		<lastmod>{1:yyyy-MM-dd}</lastmod>
+		<changefreq>weekly</changefreq>
+	</url>",
+					s, DateTime.Now);
+			}
+
+			using (var sw = File.CreateText(destPath + "sitemap.xml"))
+			{
+				sw.WriteLine(string.Format(@"<?xml version=""1.0"" encoding=""UTF-8""?>
+<urlset xmlns=""http://www.google.com/schemas/sitemap/0.84"">
+	<url>
+		<loc>http://www.bltoolkit.net/</loc>
+		<lastmod>{0:yyyy-MM-dd}</lastmod>
+		<changefreq>weekly</changefreq>
+	</url>{1}
+</urlset>",
+					DateTime.Now, sm));
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Program.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,52 @@
+using System;
+using System.IO;
+
+namespace DocGen
+{
+	partial class Program
+	{
+		public static string rss      = Path.GetFullPath(@"..\..\content\rss.xml");
+		public static string destPath = @"c:\temp\bltoolkit\";
+
+		static void Main()
+		{
+			var root = new FileItem();
+
+			new Generator().Generate(
+				root,
+				_template, new string[] {}, destPath, @"..\..\content", true, false,
+				fileName =>
+				{
+					var name = Path.GetFileName(fileName).ToLower();
+
+					switch (name)
+					{
+						case "rss.xml"         : return FileAction.Copy;
+						case "chmtemplate.html": return FileAction.Skip;
+						case "webtemplate.html": return FileAction.Skip;
+					}
+
+					var fileAction = FilterFile(fileName);
+
+					if (fileAction != FileAction.Process)
+						return fileAction;
+
+					var ext = Path.GetExtension(fileName).ToLower();
+
+					switch (ext)
+					{
+						case ".cs":
+						case ".config":
+						case ".xml":
+						case ".sql": return FileAction.Skip;
+						case ".htm": return FileAction.Process;
+						default    : return FileAction.Copy;
+					}
+				});
+
+			root.Prepare();
+
+			CreateTarget(root);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,31 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("WebGen")]
+[assembly: AssemblyDescription("Business Logic Toolkit Web content Generator")]
+[assembly: AssemblyProduct("Business Logic Toolkit")]
+[assembly: AssemblyCopyright("\xA9 2002-2010 www.bltoolkit.net")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("9d91a08f-a6e3-4a55-96c5-4852366b3cd2")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+[assembly: AssemblyVersion("3.2.0.0")]
+[assembly: AssemblyFileVersion("3.2.0.0")]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/WebGen.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,73 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{06353283-C802-4706-BB18-5BBC49B03D59}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>DocGen</RootNamespace>
+    <AssemblyName>WebGen</AssemblyName>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;WEB</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE;WEB</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Rsdn.Framework.Common, Version=1.0.3006.25300, Culture=neutral, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\Rsdn\Rsdn.Framework.Common.dll</HintPath>
+    </Reference>
+    <Reference Include="Rsdn.Framework.Formatting, Version=1.0.3072.30252, Culture=neutral, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\Rsdn\Rsdn.Framework.Formatting.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="FileAction.cs" />
+    <Compile Include="FileItem.cs" />
+    <Compile Include="Generator.cs" />
+    <Compile Include="Generator.Web.cs" />
+    <Compile Include="IndexItem.cs" />
+    <Compile Include="Program.Web.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/DocGen/_Content.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,208 @@
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{DE11BCB2-94A1-4691-9192-5FC8E0323E2E}</ProjectGuid>
+    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Content</RootNamespace>
+    <AssemblyName>Content</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Content Include="Content\bltoolkit.css" />
+    <Content Include="Content\Doc\Aspects\AsyncAspect.htm" />
+    <Content Include="Content\Doc\Aspects\CacheAspect.htm" />
+    <Content Include="Content\Doc\Aspects\ClearCacheAspect.htm" />
+    <Content Include="Content\Doc\Aspects\CounterAspect.htm" />
+    <Content Include="Content\Doc\Aspects\Counters.png" />
+    <Content Include="Content\Doc\Aspects\index.htm" />
+    <Content Include="Content\Doc\Aspects\LoggingAspect.htm" />
+    <Content Include="Content\Doc\Aspects\MixinAspect.htm" />
+    <Content Include="Content\Doc\Aspects\NoCacheAttribute.htm" />
+    <Content Include="Content\Doc\Aspects\NotNullAttribute.htm" />
+    <Content Include="Content\Doc\ComponentModel\index.htm" />
+    <Content Include="Content\Doc\ComponentModel\ObjectBinder.htm" />
+    <Content Include="Content\Doc\DataAccess\AbstractAccessor.htm" />
+    <Content Include="Content\Doc\DataAccess\ActionName.htm" />
+    <Content Include="Content\Doc\DataAccess\ActionSprocName.htm" />
+    <Content Include="Content\Doc\DataAccess\ActualType.htm" />
+    <Content Include="Content\Doc\DataAccess\CommandBehavior.htm" />
+    <Content Include="Content\Doc\DataAccess\CustomSqlQuery1.htm" />
+    <Content Include="Content\Doc\DataAccess\CustomSqlQuery2.htm" />
+    <Content Include="Content\Doc\DataAccess\DataSetTable.htm" />
+    <Content Include="Content\Doc\DataAccess\Delete.htm" />
+    <Content Include="Content\Doc\DataAccess\DeleteSql.htm" />
+    <Content Include="Content\Doc\DataAccess\Destination.htm" />
+    <Content Include="Content\Doc\DataAccess\Direction.htm" />
+    <Content Include="Content\Doc\DataAccess\DiscoverParameters.htm" />
+    <Content Include="Content\Doc\DataAccess\ExecuteDictionary.htm" />
+    <Content Include="Content\Doc\DataAccess\ExecuteList.htm" />
+    <Content Include="Content\Doc\DataAccess\ExecuteObject.htm" />
+    <Content Include="Content\Doc\DataAccess\ExecuteScalar.htm" />
+    <Content Include="Content\Doc\DataAccess\Format.htm" />
+    <Content Include="Content\Doc\DataAccess\index.htm" />
+    <Content Include="Content\Doc\DataAccess\IndexAttribute.htm" />
+    <Content Include="Content\Doc\DataAccess\Insert.htm" />
+    <Content Include="Content\Doc\DataAccess\InsertSql.htm" />
+    <Content Include="Content\Doc\DataAccess\Introduction.htm" />
+    <Content Include="Content\Doc\DataAccess\NonUpdatable.htm" />
+    <Content Include="Content\Doc\DataAccess\ObjectType.htm" />
+    <Content Include="Content\Doc\DataAccess\OpenConfig.htm" />
+    <Content Include="Content\Doc\DataAccess\OpenConfigQuery.htm" />
+    <Content Include="Content\Doc\DataAccess\ParamDbType.htm" />
+    <Content Include="Content\Doc\DataAccess\ParamName.htm" />
+    <Content Include="Content\Doc\DataAccess\ParamNullValue.htm" />
+    <Content Include="Content\Doc\DataAccess\ParamSize.htm" />
+    <Content Include="Content\Doc\DataAccess\PrimaryKey.htm" />
+    <Content Include="Content\Doc\DataAccess\ScalarFieldName.htm" />
+    <Content Include="Content\Doc\DataAccess\ScalarSource.htm" />
+    <Content Include="Content\Doc\DataAccess\SelectAll.htm" />
+    <Content Include="Content\Doc\DataAccess\SelectAllSql.htm" />
+    <Content Include="Content\Doc\DataAccess\SelectByKey.htm" />
+    <Content Include="Content\Doc\DataAccess\SelectByKeySql.htm" />
+    <Content Include="Content\Doc\DataAccess\SprocName.htm" />
+    <Content Include="Content\Doc\DataAccess\SqlQuery.htm" />
+    <Content Include="Content\Doc\DataAccess\TableName.htm" />
+    <Content Include="Content\Doc\DataAccess\Transaction.htm" />
+    <Content Include="Content\Doc\DataAccess\Update.htm" />
+    <Content Include="Content\Doc\DataAccess\UpdateSql.htm" />
+    <Content Include="Content\Doc\DataAccess\XmlExtension.htm" />
+    <Content Include="Content\Doc\Data\Close.htm" />
+    <Content Include="Content\Doc\Data\CreateSql.htm" />
+    <Content Include="Content\Doc\Data\DataProvider\index.htm" />
+    <Content Include="Content\Doc\Data\DbManagerVsAdo.htm" />
+    <Content Include="Content\Doc\Data\ExecuteDataSet.htm" />
+    <Content Include="Content\Doc\Data\ExecuteDataTable.htm" />
+    <Content Include="Content\Doc\Data\ExecuteDictionary.htm" />
+    <Content Include="Content\Doc\Data\ExecuteForEach.htm" />
+    <Content Include="Content\Doc\Data\ExecuteList.htm" />
+    <Content Include="Content\Doc\Data\ExecuteNonQuery.htm" />
+    <Content Include="Content\Doc\Data\ExecuteObject.htm" />
+    <Content Include="Content\Doc\Data\ExecuteReader.htm" />
+    <Content Include="Content\Doc\Data\ExecuteResultSet.htm" />
+    <Content Include="Content\Doc\Data\ExecuteScalar.htm" />
+    <Content Include="Content\Doc\Data\ExecuteScalarDictionary.htm" />
+    <Content Include="Content\Doc\Data\ExecuteScalarList.htm" />
+    <Content Include="Content\Doc\Data\index.htm" />
+    <Content Include="Content\Doc\Data\OpenConfig1.htm" />
+    <Content Include="Content\Doc\Data\OpenConfig2.htm" />
+    <Content Include="Content\Doc\Data\OpenConfig3.htm" />
+    <Content Include="Content\Doc\Data\Parameter.htm" />
+    <Content Include="Content\Doc\Data\Prepare.htm" />
+    <Content Include="Content\Doc\Data\SetCommand.htm" />
+    <Content Include="Content\Doc\Data\SetSpCommand.htm" />
+    <Content Include="Content\Doc\Data\Transaction.htm" />
+    <Content Include="Content\Doc\EditableObjects\index.htm" />
+    <Content Include="Content\Doc\index.htm" />
+    <Content Include="Content\Doc\Mapping\EnumToValue.htm" />
+    <Content Include="Content\Doc\Mapping\index.htm" />
+    <Content Include="Content\Doc\Mapping\MapFieldAttribute.htm" />
+    <Content Include="Content\Doc\Mapping\MapToJson.htm" />
+    <Content Include="Content\Doc\Mapping\MapValueAttribute.htm" />
+    <Content Include="Content\Doc\Mapping\ObjectToObject.htm" />
+    <Content Include="Content\Doc\Mapping\ValueToEnum.htm" />
+    <Content Include="Content\Doc\Reflection\Emit\HelloWorld.htm" />
+    <Content Include="Content\Doc\Reflection\Emit\index.htm" />
+    <Content Include="Content\Doc\Reflection\index.htm" />
+    <Content Include="Content\Doc\Reflection\ObjectFactory.htm" />
+    <Content Include="Content\Doc\TypeBuilder\index.htm" />
+    <Content Include="Content\Doc\TypeBuilder\InternalTypes.htm" />
+    <Content Include="Content\Doc\Validation\index.htm" />
+    <Content Include="Content\Download.htm" />
+    <Content Include="Content\index.htm" />
+    <Content Include="Content\License.htm" />
+    <Content Include="Content\robots.txt" />
+    <Content Include="Content\rss.xml" />
+    <Content Include="Content\WebTemplate.html" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Content\Doc\Aspects\AsyncAspect.cs" />
+    <Content Include="Content\Doc\Aspects\CacheAspect.cs" />
+    <Content Include="Content\Doc\Aspects\ClearCacheAspect.cs" />
+    <Content Include="Content\Doc\Aspects\CounterAspect.cs" />
+    <Content Include="Content\Doc\Aspects\MixinAspect.cs" />
+    <Content Include="Content\Doc\Aspects\NotNull.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Content\ChmTemplate.html" />
+    <Content Include="Content\Doc\EditableObjects\EditableObject.htm" />
+    <Content Include="Content\Home.htm" />
+    <Content Include="Content\Doc\Data\App.config" />
+    <Content Include="Content\Doc\Data\App1.config" />
+    <Content Include="Content\Doc\Data\App2.config" />
+    <Content Include="Content\Doc\Data\DataProvider\App.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Content\Doc\EditableObjects\EditableObject.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Content\Doc\Aspects\OverloadAspect.htm" />
+    <Content Include="Content\Doc\Data\LinqDateTimeFunctions.txt" />
+    <Content Include="Content\Doc\Data\LinqDateTimeCoreFunctions.txt" />
+    <Content Include="Content\Doc\Data\LinqStringCoreFunctions.txt" />
+    <Content Include="Content\Doc\Data\Linq.htm" />
+    <Content Include="Content\Doc\Data\LinqOperators.txt" />
+    <Content Include="Content\Doc\Data\LinqSqlTransformations.txt" />
+    <Content Include="Content\Doc\Data\LinqStringFunctions.txt" />
+    <Content Include="Content\Doc\EditableObjects\AcceptRejectChanges.htm" />
+    <Content Include="Content\Doc\EditableObjects\IsDirty.htm" />
+    <Content Include="Content\Doc\EditableObjects\ManualEditableObject.cs" />
+    <Content Include="Content\Doc\TypeBuilder\InitialValues.htm" />
+    <Content Include="Content\Doc\TypeBuilder\XmlSerialization.htm" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Content\Doc\Aspects\OverloadAspect.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="Properties\" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v9.0\WebApplications\Microsoft.WebApplication.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <ProjectExtensions>
+    <VisualStudio>
+      <FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
+        <WebProjectProperties>
+          <UseIIS>False</UseIIS>
+          <AutoAssignPort>True</AutoAssignPort>
+          <DevelopmentServerPort>20832</DevelopmentServerPort>
+          <DevelopmentServerVPath>/</DevelopmentServerVPath>
+          <IISUrl>
+          </IISUrl>
+          <NTLMAuthentication>False</NTLMAuthentication>
+          <UseCustomServer>False</UseCustomServer>
+          <CustomServerUrl>
+          </CustomServerUrl>
+          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
+        </WebProjectProperties>
+      </FlavorProperties>
+    </VisualStudio>
+  </ProjectExtensions>
+</Project>
\ No newline at end of file
Binary file Tools/ExampleGenerator/App.ico has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/ExampleGenerator/ExampleGenerator.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,54 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.21022</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{DE735B24-E20B-4440-BBBB-35AECC3F1124}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>ExampleGenerator</RootNamespace>
+    <AssemblyName>ExampleGenerator</AssemblyName>
+    <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Generator.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PostBuildEvent>"$(TargetPath)" /path:"$(SolutionDir)Examples\CS\Reflection.Emit" /xml:"$(SolutionDir)Source\Reflection\Emit\Examples.CS.xml"
+"$(TargetPath)" /path:"$(SolutionDir)Examples\VB\Reflection.Emit" /xml:"$(SolutionDir)Source\Reflection\Emit\Examples.VB.xml"</PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/ExampleGenerator/Generator.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,119 @@
+using System;
+using System.IO;
+
+namespace ExampleGenerator
+{
+	class Generator
+	{
+		class Lang
+		{
+			public Lang(string name, string extension, string comment)
+			{
+				Name      = name;
+				Extension = extension;
+				Comment   = comment;
+			}
+
+			public string Name;
+			public string Extension;
+			public string Comment;
+		}
+
+		static void ProcessFile(StreamWriter sw, string fileName, Lang lang)
+		{
+			using (StreamReader sr = File.OpenText(fileName))
+			{
+				string ln = sr.ReadLine();
+
+				if (ln.StartsWith(lang.Comment + " example:"))
+				{
+					Console.WriteLine("{0}", fileName);
+
+					string[] path = sr.ReadLine().Split(new char[]{' '});
+
+					sw.WriteLine("<{0} name=\"{1}\">", path[1], path[2]);
+					sw.WriteLine("<example>");
+
+					ln = sr.ReadLine();
+
+					if (ln.StartsWith(lang.Comment + " comment:"))
+					{
+						for (ln = sr.ReadLine(); ln.StartsWith(lang.Comment); ln = sr.ReadLine())
+						{
+							ln = ln.Substring(3);
+
+							if (ln.Length > 0 && ln[0] == ' ')
+								ln = ln.Substring(1);
+
+							sw.WriteLine(ln);
+						}
+					}
+
+					ln += "\n" + sr.ReadToEnd();
+					ln.Trim();
+
+					while (ln.Length > 0 && (ln[ln.Length-1] == '\r' || ln[ln.Length-1] == '\n'))
+						ln = ln.Substring(0, ln.Length - 1).TrimEnd();
+
+					ln = ln.Replace("<", "&lt;").Replace(">", "&gt;");
+
+					sw.WriteLine("<code lang=\"{0}\">", lang.Name);
+					sw.WriteLine(ln);
+					sw.WriteLine("</code>");
+					sw.WriteLine("</example>");
+					sw.WriteLine("</{0}>", path[1]);
+					sw.WriteLine();
+				}
+			}
+		}
+
+		static void ScanDirectory(StreamWriter sw, string path, Lang lang)
+		{
+			string[] files = Directory.GetFiles(path, lang.Extension);
+
+			foreach (string file in files)
+				ProcessFile(sw, file, lang);
+
+			string[] dirs = Directory.GetDirectories(path);
+
+			foreach (string dir in dirs)
+				ScanDirectory(sw, dir, lang);
+		}
+
+		[STAThread]
+		static void Main(string[] args)
+		{
+			string path = null;
+			string xml  = null;
+
+			foreach (string arg in args)
+			{
+				if (arg.ToLower().StartsWith("/path:"))
+					path = arg.Substring(6);
+
+				if (arg.ToLower().StartsWith("/xml:"))
+					xml = arg.Substring(5);
+			}
+
+			//Console.WriteLine("/path:{0} /xml:{1}", path, xml);
+
+			if (path == null || xml == null)
+			{
+				Console.WriteLine(@"Use: ExampleGenerator /path:..\Examples /xml:..\Source\Examples.xml");
+			}
+
+			using (StreamWriter sw = File.CreateText(xml))
+			{
+				sw.WriteLine(@"<?xml version=""1.0"" encoding=""utf-8"" ?>");
+				sw.WriteLine(@"<examples>");
+				sw.WriteLine();
+
+				ScanDirectory(sw, path, new Lang("C#", "*.cs", "//@"));
+				ScanDirectory(sw, path, new Lang("VB", "*.vb", "''@"));
+
+				sw.WriteLine();
+				sw.WriteLine(@"</examples>");
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/ExampleGenerator/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,26 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+//
+[assembly: AssemblyTitle("ExampleGenerator")]
+[assembly: AssemblyDescription("Business Logic Toolkit Example Generator")]
+[assembly: AssemblyProduct("Business Logic Toolkit")]
+[assembly: AssemblyCopyright("\xA9 2002-2010 www.bltoolkit.net")]
+[assembly: AssemblyCulture("")]
+
+//
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("4.0.0.0")]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/NUnitAddin/Class1.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,32 @@
+using System;
+using System.Reflection;
+
+using NUnit.Core.Extensibility;
+
+namespace NUnitAddin
+{
+	[NUnitAddin]
+	public class AssemblyResolverAddin : IAddin
+	{
+		public bool Install(IExtensionHost host)
+		{
+			AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
+			{
+				var dir = Environment.CurrentDirectory;
+
+				if (args.Name.IndexOf("Sybase.AdoNet2.AseClient") >= 0)
+					return Assembly.LoadFrom(@"..\..\..\..\Redist\Sybase\Sybase.AdoNet2.AseClient.dll");
+				if (args.Name.IndexOf("Oracle.DataAccess") >= 0)
+					return Assembly.LoadFrom(@"..\..\..\..\Redist\Oracle\Oracle.DataAccess.dll");
+				if (args.Name.IndexOf("IBM.Data.DB2") >= 0)
+					return Assembly.LoadFrom(@"..\..\..\..\Redist\IBM\IBM.Data.DB2.dll");
+				if (args.Name.IndexOf("Mono.Security") >= 0)
+					return Assembly.LoadFrom(@"..\..\..\..\Redist\PostgreSql\Mono.Security.dll");
+
+				return null;
+			};
+
+			return true;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/NUnitAddin/NUnitAddin.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{B951C0DA-943C-4B04-BCAF-8180DD5829C2}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>NUnitAddin</RootNamespace>
+    <AssemblyName>NUnitAddin</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\NUnit\addins\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\NUnit\addins\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.core.interfaces, Version=2.5.3.9345, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\NUnit\lib\nunit.core.interfaces.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Class1.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/NUnitAddin/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("NUnitAddin")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("NUnitAddin")]
+[assembly: AssemblyCopyright("Copyright © Microsoft 2010")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("4f756060-9f64-4e03-bc2c-790537544be9")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Binary file Tools/Rsdn/Rsdn.Framework.Common.dll has changed
Binary file Tools/Rsdn/Rsdn.Framework.Formatting.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/Templates.VB/DataModel.generated.vb	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1069 @@
+'---------------------------------------------------------------------------------------------------
+' <auto-generated>
+'    This code was generated by BLToolkit template for T4.
+'    Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
+' </auto-generated>
+'---------------------------------------------------------------------------------------------------
+Imports System
+Imports System.Collections.Generic
+Imports System.Linq
+Imports System.Linq.Expressions
+Imports System.Reflection
+Imports System.Runtime.Serialization
+Imports System.Text
+
+Imports BLToolkit.Common
+Imports BLToolkit.Data
+Imports BLToolkit.Data.DataProvider
+Imports BLToolkit.Data.Linq
+Imports BLToolkit.Data.Sql
+Imports BLToolkit.Data.Sql.SqlProvider
+Imports BLToolkit.DataAccess
+Imports BLToolkit.Mapping
+
+Namespace Templates.VB
+
+	Public Partial Class DataModel
+		Inherits DbManager
+
+		Public ReadOnly Property AlphabeticalListOfProducts() As Table(Of AlphabeticalListOfProducts)
+			Get
+				Return Me.GetTable(Of AlphabeticalListOfProducts)()
+			End Get
+		End Property
+
+		Public ReadOnly Property Categories()                 As Table(Of Categories)
+			Get
+				Return Me.GetTable(Of Categories)()
+			End Get
+		End Property
+
+		Public ReadOnly Property CategorySalesFor1997()       As Table(Of CategorySalesFor1997)
+			Get
+				Return Me.GetTable(Of CategorySalesFor1997)()
+			End Get
+		End Property
+
+		Public ReadOnly Property CurrentProductList()         As Table(Of CurrentProductList)
+			Get
+				Return Me.GetTable(Of CurrentProductList)()
+			End Get
+		End Property
+
+		Public ReadOnly Property CustomerAndSuppliersByCity() As Table(Of CustomerAndSuppliersByCity)
+			Get
+				Return Me.GetTable(Of CustomerAndSuppliersByCity)()
+			End Get
+		End Property
+
+		Public ReadOnly Property CustomerCustomerDemo()       As Table(Of CustomerCustomerDemo)
+			Get
+				Return Me.GetTable(Of CustomerCustomerDemo)()
+			End Get
+		End Property
+
+		Public ReadOnly Property CustomerDemographics()       As Table(Of CustomerDemographics)
+			Get
+				Return Me.GetTable(Of CustomerDemographics)()
+			End Get
+		End Property
+
+		Public ReadOnly Property Customers()                  As Table(Of Customers)
+			Get
+				Return Me.GetTable(Of Customers)()
+			End Get
+		End Property
+
+		Public ReadOnly Property Employees()                  As Table(Of Employees)
+			Get
+				Return Me.GetTable(Of Employees)()
+			End Get
+		End Property
+
+		Public ReadOnly Property EmployeeTerritories()        As Table(Of EmployeeTerritories)
+			Get
+				Return Me.GetTable(Of EmployeeTerritories)()
+			End Get
+		End Property
+
+		Public ReadOnly Property Invoices()                   As Table(Of Invoices)
+			Get
+				Return Me.GetTable(Of Invoices)()
+			End Get
+		End Property
+
+		Public ReadOnly Property OrderDetails()               As Table(Of OrderDetails)
+			Get
+				Return Me.GetTable(Of OrderDetails)()
+			End Get
+		End Property
+
+		Public ReadOnly Property OrderDetailsExtended()       As Table(Of OrderDetailsExtended)
+			Get
+				Return Me.GetTable(Of OrderDetailsExtended)()
+			End Get
+		End Property
+
+		Public ReadOnly Property OrderSubtotals()             As Table(Of OrderSubtotals)
+			Get
+				Return Me.GetTable(Of OrderSubtotals)()
+			End Get
+		End Property
+
+		Public ReadOnly Property Orders()                     As Table(Of Orders)
+			Get
+				Return Me.GetTable(Of Orders)()
+			End Get
+		End Property
+
+		Public ReadOnly Property OrdersQry()                  As Table(Of OrdersQry)
+			Get
+				Return Me.GetTable(Of OrdersQry)()
+			End Get
+		End Property
+
+		Public ReadOnly Property ProductSalesFor1997()        As Table(Of ProductSalesFor1997)
+			Get
+				Return Me.GetTable(Of ProductSalesFor1997)()
+			End Get
+		End Property
+
+		Public ReadOnly Property Products()                   As Table(Of Products)
+			Get
+				Return Me.GetTable(Of Products)()
+			End Get
+		End Property
+
+		Public ReadOnly Property ProductsAboveAveragePrice()  As Table(Of ProductsAboveAveragePrice)
+			Get
+				Return Me.GetTable(Of ProductsAboveAveragePrice)()
+			End Get
+		End Property
+
+		Public ReadOnly Property ProductsByCategory()         As Table(Of ProductsByCategory)
+			Get
+				Return Me.GetTable(Of ProductsByCategory)()
+			End Get
+		End Property
+
+		Public ReadOnly Property QuarterlyOrders()            As Table(Of QuarterlyOrders)
+			Get
+				Return Me.GetTable(Of QuarterlyOrders)()
+			End Get
+		End Property
+
+		Public ReadOnly Property Region()                     As Table(Of Region)
+			Get
+				Return Me.GetTable(Of Region)()
+			End Get
+		End Property
+
+		Public ReadOnly Property SalesByCategory()            As Table(Of SalesByCategory)
+			Get
+				Return Me.GetTable(Of SalesByCategory)()
+			End Get
+		End Property
+
+		Public ReadOnly Property SalesTotalsByAmount()        As Table(Of SalesTotalsByAmount)
+			Get
+				Return Me.GetTable(Of SalesTotalsByAmount)()
+			End Get
+		End Property
+
+		Public ReadOnly Property Shippers()                   As Table(Of Shippers)
+			Get
+				Return Me.GetTable(Of Shippers)()
+			End Get
+		End Property
+
+		Public ReadOnly Property SummaryOfSalesByQuarter()    As Table(Of SummaryOfSalesByQuarter)
+			Get
+				Return Me.GetTable(Of SummaryOfSalesByQuarter)()
+			End Get
+		End Property
+
+		Public ReadOnly Property SummaryOfSalesByYear()       As Table(Of SummaryOfSalesByYear)
+			Get
+				Return Me.GetTable(Of SummaryOfSalesByYear)()
+			End Get
+		End Property
+
+		Public ReadOnly Property Suppliers()                  As Table(Of Suppliers)
+			Get
+				Return Me.GetTable(Of Suppliers)()
+			End Get
+		End Property
+
+		Public ReadOnly Property Territories()                As Table(Of Territories)
+			Get
+				Return Me.GetTable(Of Territories)()
+			End Get
+		End Property
+		
+    End Class
+
+    'View
+    <Serializable(), DataContract()> _
+    <TableName(Name:="Alphabetical list of products")> _
+    Partial Public Class AlphabeticalListOfProducts
+        Inherits EntityBase(Of AlphabeticalListOfProducts)
+
+        <DataMember()> _
+        Public ProductID As Integer
+
+        <DataMember()> _
+        Public ProductName As String
+
+        <Nullable(), DataMember()> _
+        Public SupplierID As Integer?
+
+        <Nullable(), DataMember()> _
+        Public CategoryID As Integer?
+
+        <Nullable(), DataMember()> _
+        Public QuantityPerUnit As String
+
+        <Nullable(), DataMember()> _
+        Public UnitPrice As Decimal?
+
+        <Nullable(), DataMember()> _
+        Public UnitsInStock As Short?
+
+        <Nullable(), DataMember()> _
+        Public UnitsOnOrder As Short?
+
+        <Nullable(), DataMember()> _
+        Public ReorderLevel As Short?
+
+        <DataMember()> _
+        Public Discontinued As Boolean
+
+        <DataMember()> _
+        Public CategoryName As String
+    End Class
+
+    <Serializable(), DataContract()> _
+    <TableName(Name:="Categories")> _
+    Partial Public Class Categories
+        Inherits EntityBase(Of Categories)
+
+        <Identity(), PrimaryKey(1), DataMember()> _
+        Public CategoryID As Integer
+
+        <DataMember()> _
+        Public CategoryName As String
+
+        <Nullable(), DataMember()> _
+        Public Description As String
+
+        <Nullable(), DataMember()> _
+        Public Picture As Byte()
+
+        ' FK_Products_Categories_BackReference
+        <Association(ThisKey:="CategoryID", OtherKey:="CategoryID")> _
+        Public Productss As IEnumerable(Of Products)
+    End Class
+
+    'View
+    <Serializable(), DataContract()> _
+    <TableName(Name:="Category Sales for 1997")> _
+    Partial Public Class CategorySalesFor1997
+        Inherits EntityBase(Of CategorySalesFor1997)
+
+        <DataMember()> _
+        Public CategoryName As String
+
+        <Nullable(), DataMember()> _
+        Public CategorySales As Decimal?
+    End Class
+
+    'View
+    <Serializable(), DataContract()> _
+    <TableName(Name:="Current Product List")> _
+    Partial Public Class CurrentProductList
+        Inherits EntityBase(Of CurrentProductList)
+
+        <Identity(), DataMember()> _
+        Public ProductID As Integer
+
+        <DataMember()> _
+        Public ProductName As String
+    End Class
+
+    'View
+    <Serializable(), DataContract()> _
+    <TableName(Name:="Customer and Suppliers by City")> _
+    Partial Public Class CustomerAndSuppliersByCity
+        Inherits EntityBase(Of CustomerAndSuppliersByCity)
+
+        <Nullable(), DataMember()> _
+        Public City As String
+
+        <DataMember()> _
+        Public CompanyName As String
+
+        <Nullable(), DataMember()> _
+        Public ContactName As String
+
+        <DataMember()> _
+        Public Relationship As String
+    End Class
+
+    <Serializable(), DataContract()> _
+    <TableName(Name:="CustomerCustomerDemo")> _
+    Partial Public Class CustomerCustomerDemo
+        Inherits EntityBase(Of CustomerCustomerDemo)
+
+        <PrimaryKey(1), DataMember()> _
+        Public CustomerID As String
+
+        <PrimaryKey(2), DataMember()> _
+        Public CustomerTypeID As String
+
+        ' FK_CustomerCustomerDemo
+        <Association(ThisKey:="CustomerTypeID", OtherKey:="CustomerTypeID")> _
+        Public FK_CustomerCustomerDemo As IEnumerable(Of CustomerDemographics)
+
+        ' FK_CustomerCustomerDemo_Customers
+        <Association(ThisKey:="CustomerID", OtherKey:="CustomerID")> _
+        Public Customers As IEnumerable(Of Customers)
+    End Class
+
+    <Serializable(), DataContract()> _
+    <TableName(Name:="CustomerDemographics")> _
+    Partial Public Class CustomerDemographics
+        Inherits EntityBase(Of CustomerDemographics)
+
+        <PrimaryKey(1), DataMember()> _
+        Public CustomerTypeID As String
+
+        <Nullable(), DataMember()> _
+        Public CustomerDesc As String
+
+        ' FK_CustomerCustomerDemo_BackReference
+        <Association(ThisKey:="CustomerTypeID", OtherKey:="CustomerTypeID")> _
+        Public CustomerCustomerDemos As IEnumerable(Of CustomerCustomerDemo)
+    End Class
+
+    <Serializable(), DataContract()> _
+    <TableName(Name:="Customers")> _
+    Partial Public Class Customers
+        Inherits EntityBase(Of Customers)
+
+        <PrimaryKey(1), DataMember()> _
+        Public CustomerID As String
+
+        <DataMember()> _
+        Public CompanyName As String
+
+        <Nullable(), DataMember()> _
+        Public ContactName As String
+
+        <Nullable(), DataMember()> _
+        Public ContactTitle As String
+
+        <Nullable(), DataMember()> _
+        Public Address As String
+
+        <Nullable(), DataMember()> _
+        Public City As String
+
+        <Nullable(), DataMember()> _
+        Public Region As String
+
+        <Nullable(), DataMember()> _
+        Public PostalCode As String
+
+        <Nullable(), DataMember()> _
+        Public Country As String
+
+        <Nullable(), DataMember()> _
+        Public Phone As String
+
+        <Nullable(), DataMember()> _
+        Public Fax As String
+
+        ' FK_Orders_Customers_BackReference
+        <Association(ThisKey:="CustomerID", OtherKey:="CustomerID")> _
+        Public Orderss As IEnumerable(Of Orders)
+
+        ' FK_CustomerCustomerDemo_Customers_BackReference
+        <Association(ThisKey:="CustomerID", OtherKey:="CustomerID")> _
+        Public CustomerCustomerDemos As IEnumerable(Of CustomerCustomerDemo)
+    End Class
+
+    <Serializable(), DataContract()> _
+    <TableName(Name:="Employees")> _
+    Partial Public Class Employees
+        Inherits EntityBase(Of Employees)
+
+        <Identity(), PrimaryKey(1), DataMember()> _
+        Public EmployeeID As Integer
+
+        <DataMember()> _
+        Public LastName As String
+
+        <DataMember()> _
+        Public FirstName As String
+
+        <Nullable(), DataMember()> _
+        Public Title As String
+
+        <Nullable(), DataMember()> _
+        Public TitleOfCourtesy As String
+
+        <Nullable(), DataMember()> _
+        Public BirthDate As DateTime?
+
+        <Nullable(), DataMember()> _
+        Public HireDate As DateTime?
+
+        <Nullable(), DataMember()> _
+        Public Address As String
+
+        <Nullable(), DataMember()> _
+        Public City As String
+
+        <Nullable(), DataMember()> _
+        Public Region As String
+
+        <Nullable(), DataMember()> _
+        Public PostalCode As String
+
+        <Nullable(), DataMember()> _
+        Public Country As String
+
+        <Nullable(), DataMember()> _
+        Public HomePhone As String
+
+        <Nullable(), DataMember()> _
+        Public Extension As String
+
+        <Nullable(), DataMember()> _
+        Public Photo As Byte()
+
+        <Nullable(), DataMember()> _
+        Public Notes As String
+
+        <Nullable(), DataMember()> _
+        Public ReportsTo As Integer?
+
+        <Nullable(), DataMember()> _
+        Public PhotoPath As String
+
+        ' FK_Employees_Employees
+        <Association(ThisKey:="ReportsTo", OtherKey:="EmployeeID")> _
+        Public ReportsToEmployee As IEnumerable(Of Employees)
+
+        ' FK_Orders_Employees_BackReference
+        <Association(ThisKey:="EmployeeID", OtherKey:="EmployeeID")> _
+        Public Orderss As IEnumerable(Of Orders)
+
+        ' FK_EmployeeTerritories_Employees_BackReference
+        <Association(ThisKey:="EmployeeID", OtherKey:="EmployeeID")> _
+        Public EmployeeTerritoriess As IEnumerable(Of EmployeeTerritories)
+
+        ' FK_Employees_Employees_BackReference
+        <Association(ThisKey:="EmployeeID", OtherKey:="ReportsTo")> _
+        Public FK_Employees_Employees_BackReference As IEnumerable(Of Employees)
+    End Class
+
+    <Serializable(), DataContract()> _
+    <TableName(Name:="EmployeeTerritories")> _
+    Partial Public Class EmployeeTerritories
+        Inherits EntityBase(Of EmployeeTerritories)
+
+        <PrimaryKey(1), DataMember()> _
+        Public EmployeeID As Integer
+
+        <PrimaryKey(2), DataMember()> _
+        Public TerritoryID As String
+
+        ' FK_EmployeeTerritories_Employees
+        <Association(ThisKey:="EmployeeID", OtherKey:="EmployeeID")> _
+        Public Employees As IEnumerable(Of Employees)
+
+        ' FK_EmployeeTerritories_Territories
+        <Association(ThisKey:="TerritoryID", OtherKey:="TerritoryID")> _
+        Public Territories As IEnumerable(Of Territories)
+    End Class
+
+    'View
+    <Serializable(), DataContract()> _
+    <TableName(Name:="Invoices")> _
+    Partial Public Class Invoices
+        Inherits EntityBase(Of Invoices)
+
+        <Nullable(), DataMember()> _
+        Public ShipName As String
+
+        <Nullable(), DataMember()> _
+        Public ShipAddress As String
+
+        <Nullable(), DataMember()> _
+        Public ShipCity As String
+
+        <Nullable(), DataMember()> _
+        Public ShipRegion As String
+
+        <Nullable(), DataMember()> _
+        Public ShipPostalCode As String
+
+        <Nullable(), DataMember()> _
+        Public ShipCountry As String
+
+        <Nullable(), DataMember()> _
+        Public CustomerID As String
+
+        <DataMember()> _
+        Public CustomerName As String
+
+        <Nullable(), DataMember()> _
+        Public Address As String
+
+        <Nullable(), DataMember()> _
+        Public City As String
+
+        <Nullable(), DataMember()> _
+        Public Region As String
+
+        <Nullable(), DataMember()> _
+        Public PostalCode As String
+
+        <Nullable(), DataMember()> _
+        Public Country As String
+
+        <DataMember()> _
+        Public Salesperson As String
+
+        <DataMember()> _
+        Public OrderID As Integer
+
+        <Nullable(), DataMember()> _
+        Public OrderDate As DateTime?
+
+        <Nullable(), DataMember()> _
+        Public RequiredDate As DateTime?
+
+        <Nullable(), DataMember()> _
+        Public ShippedDate As DateTime?
+
+        <DataMember()> _
+        Public ShipperName As String
+
+        <DataMember()> _
+        Public ProductID As Integer
+
+        <DataMember()> _
+        Public ProductName As String
+
+        <DataMember()> _
+        Public UnitPrice As Decimal
+
+        <DataMember()> _
+        Public Quantity As Short
+
+        <DataMember()> _
+        Public Discount As Single
+
+        <Nullable(), DataMember()> _
+        Public ExtendedPrice As Decimal?
+
+        <Nullable(), DataMember()> _
+        Public Freight As Decimal?
+    End Class
+
+    <Serializable(), DataContract()> _
+    <TableName(Name:="Order Details")> _
+    Partial Public Class OrderDetails
+        Inherits EntityBase(Of OrderDetails)
+
+        <PrimaryKey(1), DataMember()> _
+        Public OrderID As Integer
+
+        <PrimaryKey(2), DataMember()> _
+        Public ProductID As Integer
+
+        <DataMember()> _
+        Public UnitPrice As Decimal
+
+        <DataMember()> _
+        Public Quantity As Short
+
+        <DataMember()> _
+        Public Discount As Single
+
+        ' FK_Order_Details_Orders
+        <Association(ThisKey:="OrderID", OtherKey:="OrderID")> _
+        Public OrderDetailsOrders As IEnumerable(Of Orders)
+
+        ' FK_Order_Details_Products
+        <Association(ThisKey:="ProductID", OtherKey:="ProductID")> _
+        Public OrderDetailsProducts As IEnumerable(Of Products)
+    End Class
+
+    'View
+    <Serializable(), DataContract()> _
+    <TableName(Name:="Order Details Extended")> _
+    Partial Public Class OrderDetailsExtended
+        Inherits EntityBase(Of OrderDetailsExtended)
+
+        <DataMember()> _
+        Public OrderID As Integer
+
+        <DataMember()> _
+        Public ProductID As Integer
+
+        <DataMember()> _
+        Public ProductName As String
+
+        <DataMember()> _
+        Public UnitPrice As Decimal
+
+        <DataMember()> _
+        Public Quantity As Short
+
+        <DataMember()> _
+        Public Discount As Single
+
+        <Nullable(), DataMember()> _
+        Public ExtendedPrice As Decimal?
+    End Class
+
+    'View
+    <Serializable(), DataContract()> _
+    <TableName(Name:="Order Subtotals")> _
+    Partial Public Class OrderSubtotals
+        Inherits EntityBase(Of OrderSubtotals)
+
+        <DataMember()> _
+        Public OrderID As Integer
+
+        <Nullable(), DataMember()> _
+        Public Subtotal As Decimal?
+    End Class
+
+    <Serializable(), DataContract()> _
+    <TableName(Name:="Orders")> _
+    Partial Public Class Orders
+        Inherits EntityBase(Of Orders)
+
+        <Identity(), PrimaryKey(1), DataMember()> _
+        Public OrderID As Integer
+
+        <Nullable(), DataMember()> _
+        Public CustomerID As String
+
+        <Nullable(), DataMember()> _
+        Public EmployeeID As Integer?
+
+        <Nullable(), DataMember()> _
+        Public OrderDate As DateTime?
+
+        <Nullable(), DataMember()> _
+        Public RequiredDate As DateTime?
+
+        <Nullable(), DataMember()> _
+        Public ShippedDate As DateTime?
+
+        <Nullable(), DataMember()> _
+        Public ShipVia As Integer?
+
+        <Nullable(), DataMember()> _
+        Public Freight As Decimal?
+
+        <Nullable(), DataMember()> _
+        Public ShipName As String
+
+        <Nullable(), DataMember()> _
+        Public ShipAddress As String
+
+        <Nullable(), DataMember()> _
+        Public ShipCity As String
+
+        <Nullable(), DataMember()> _
+        Public ShipRegion As String
+
+        <Nullable(), DataMember()> _
+        Public ShipPostalCode As String
+
+        <Nullable(), DataMember()> _
+        Public ShipCountry As String
+
+        ' FK_Orders_Customers
+        <Association(ThisKey:="CustomerID", OtherKey:="CustomerID")> _
+        Public Customers As IEnumerable(Of Customers)
+
+        ' FK_Orders_Employees
+        <Association(ThisKey:="EmployeeID", OtherKey:="EmployeeID")> _
+        Public Employees As IEnumerable(Of Employees)
+
+        ' FK_Orders_Shippers
+        <Association(ThisKey:="ShipVia", OtherKey:="ShipperID")> _
+        Public Shippers As IEnumerable(Of Shippers)
+
+        ' FK_Order_Details_Orders_BackReference
+        <Association(ThisKey:="OrderID", OtherKey:="OrderID")> _
+        Public OrderDetailss As IEnumerable(Of OrderDetails)
+    End Class
+
+    'View
+    <Serializable(), DataContract()> _
+    <TableName(Name:="Orders Qry")> _
+    Partial Public Class OrdersQry
+        Inherits EntityBase(Of OrdersQry)
+
+        <DataMember()> _
+        Public OrderID As Integer
+
+        <Nullable(), DataMember()> _
+        Public CustomerID As String
+
+        <Nullable(), DataMember()> _
+        Public EmployeeID As Integer?
+
+        <Nullable(), DataMember()> _
+        Public OrderDate As DateTime?
+
+        <Nullable(), DataMember()> _
+        Public RequiredDate As DateTime?
+
+        <Nullable(), DataMember()> _
+        Public ShippedDate As DateTime?
+
+        <Nullable(), DataMember()> _
+        Public ShipVia As Integer?
+
+        <Nullable(), DataMember()> _
+        Public Freight As Decimal?
+
+        <Nullable(), DataMember()> _
+        Public ShipName As String
+
+        <Nullable(), DataMember()> _
+        Public ShipAddress As String
+
+        <Nullable(), DataMember()> _
+        Public ShipCity As String
+
+        <Nullable(), DataMember()> _
+        Public ShipRegion As String
+
+        <Nullable(), DataMember()> _
+        Public ShipPostalCode As String
+
+        <Nullable(), DataMember()> _
+        Public ShipCountry As String
+
+        <DataMember()> _
+        Public CompanyName As String
+
+        <Nullable(), DataMember()> _
+        Public Address As String
+
+        <Nullable(), DataMember()> _
+        Public City As String
+
+        <Nullable(), DataMember()> _
+        Public Region As String
+
+        <Nullable(), DataMember()> _
+        Public PostalCode As String
+
+        <Nullable(), DataMember()> _
+        Public Country As String
+    End Class
+
+    'View
+    <Serializable(), DataContract()> _
+    <TableName(Name:="Product Sales for 1997")> _
+    Partial Public Class ProductSalesFor1997
+        Inherits EntityBase(Of ProductSalesFor1997)
+
+        <DataMember()> _
+        Public CategoryName As String
+
+        <DataMember()> _
+        Public ProductName As String
+
+        <Nullable(), DataMember()> _
+        Public ProductSales As Decimal?
+    End Class
+
+    <Serializable(), DataContract()> _
+    <TableName(Name:="Products")> _
+    Partial Public Class Products
+        Inherits EntityBase(Of Products)
+
+        <Identity(), PrimaryKey(1), DataMember()> _
+        Public ProductID As Integer
+
+        <DataMember()> _
+        Public ProductName As String
+
+        <Nullable(), DataMember()> _
+        Public SupplierID As Integer?
+
+        <Nullable(), DataMember()> _
+        Public CategoryID As Integer?
+
+        <Nullable(), DataMember()> _
+        Public QuantityPerUnit As String
+
+        <Nullable(), DataMember()> _
+        Public UnitPrice As Decimal?
+
+        <Nullable(), DataMember()> _
+        Public UnitsInStock As Short?
+
+        <Nullable(), DataMember()> _
+        Public UnitsOnOrder As Short?
+
+        <Nullable(), DataMember()> _
+        Public ReorderLevel As Short?
+
+        <DataMember()> _
+        Public Discontinued As Boolean
+
+        ' FK_Products_Categories
+        <Association(ThisKey:="CategoryID", OtherKey:="CategoryID")> _
+        Public Categories As IEnumerable(Of Categories)
+
+        ' FK_Products_Suppliers
+        <Association(ThisKey:="SupplierID", OtherKey:="SupplierID")> _
+        Public Suppliers As IEnumerable(Of Suppliers)
+
+        ' FK_Order_Details_Products_BackReference
+        <Association(ThisKey:="ProductID", OtherKey:="ProductID")> _
+        Public OrderDetailss As IEnumerable(Of OrderDetails)
+    End Class
+
+    'View
+    <Serializable(), DataContract()> _
+    <TableName(Name:="Products Above Average Price")> _
+    Partial Public Class ProductsAboveAveragePrice
+        Inherits EntityBase(Of ProductsAboveAveragePrice)
+
+        <DataMember()> _
+        Public ProductName As String
+
+        <Nullable(), DataMember()> _
+        Public UnitPrice As Decimal?
+    End Class
+
+    'View
+    <Serializable(), DataContract()> _
+    <TableName(Name:="Products by Category")> _
+    Partial Public Class ProductsByCategory
+        Inherits EntityBase(Of ProductsByCategory)
+
+        <DataMember()> _
+        Public CategoryName As String
+
+        <DataMember()> _
+        Public ProductName As String
+
+        <Nullable(), DataMember()> _
+        Public QuantityPerUnit As String
+
+        <Nullable(), DataMember()> _
+        Public UnitsInStock As Short?
+
+        <DataMember()> _
+        Public Discontinued As Boolean
+    End Class
+
+    'View
+    <Serializable(), DataContract()> _
+    <TableName(Name:="Quarterly Orders")> _
+    Partial Public Class QuarterlyOrders
+        Inherits EntityBase(Of QuarterlyOrders)
+
+        <Nullable(), DataMember()> _
+        Public CustomerID As String
+
+        <Nullable(), DataMember()> _
+        Public CompanyName As String
+
+        <Nullable(), DataMember()> _
+        Public City As String
+
+        <Nullable(), DataMember()> _
+        Public Country As String
+    End Class
+
+    <Serializable(), DataContract()> _
+    <TableName(Name:="Region")> _
+    Partial Public Class Region
+        Inherits EntityBase(Of Region)
+
+        <MapField("RegionID"), PrimaryKey(1), DataMember()> _
+        Public ID As Integer
+
+        <DataMember()> _
+        Public RegionDescription As String
+
+        ' FK_Territories_Region_BackReference
+        <Association(ThisKey:="ID", OtherKey:="RegionID")> _
+        Public Territoriess As IEnumerable(Of Territories)
+    End Class
+
+    'View
+    <Serializable(), DataContract()> _
+    <TableName(Name:="Sales by Category")> _
+    Partial Public Class SalesByCategory
+        Inherits EntityBase(Of SalesByCategory)
+
+        <DataMember()> _
+        Public CategoryID As Integer
+
+        <DataMember()> _
+        Public CategoryName As String
+
+        <DataMember()> _
+        Public ProductName As String
+
+        <Nullable(), DataMember()> _
+        Public ProductSales As Decimal?
+    End Class
+
+    'View
+    <Serializable(), DataContract()> _
+    <TableName(Name:="Sales Totals by Amount")> _
+    Partial Public Class SalesTotalsByAmount
+        Inherits EntityBase(Of SalesTotalsByAmount)
+
+        <Nullable(), DataMember()> _
+        Public SaleAmount As Decimal?
+
+        <DataMember()> _
+        Public OrderID As Integer
+
+        <DataMember()> _
+        Public CompanyName As String
+
+        <Nullable(), DataMember()> _
+        Public ShippedDate As DateTime?
+    End Class
+
+    <Serializable(), DataContract()> _
+    <TableName(Name:="Shippers")> _
+    Partial Public Class Shippers
+        Inherits EntityBase(Of Shippers)
+
+        <Identity(), PrimaryKey(1), DataMember()> _
+        Public ShipperID As Integer
+
+        <DataMember()> _
+        Public CompanyName As String
+
+        <Nullable(), DataMember()> _
+        Public Phone As String
+
+        ' FK_Orders_Shippers_BackReference
+        <Association(ThisKey:="ShipperID", OtherKey:="ShipVia")> _
+        Public Orderss As IEnumerable(Of Orders)
+    End Class
+
+    'View
+    <Serializable(), DataContract()> _
+    <TableName(Name:="Summary of Sales by Quarter")> _
+    Partial Public Class SummaryOfSalesByQuarter
+        Inherits EntityBase(Of SummaryOfSalesByQuarter)
+
+        <Nullable(), DataMember()> _
+        Public ShippedDate As DateTime?
+
+        <DataMember()> _
+        Public OrderID As Integer
+
+        <Nullable(), DataMember()> _
+        Public Subtotal As Decimal?
+    End Class
+
+    'View
+    <Serializable(), DataContract()> _
+    <TableName(Name:="Summary of Sales by Year")> _
+    Partial Public Class SummaryOfSalesByYear
+        Inherits EntityBase(Of SummaryOfSalesByYear)
+
+        <Nullable(), DataMember()> _
+        Public ShippedDate As DateTime?
+
+        <DataMember()> _
+        Public OrderID As Integer
+
+        <Nullable(), DataMember()> _
+        Public Subtotal As Decimal?
+    End Class
+
+    <Serializable(), DataContract()> _
+    <TableName(Name:="Suppliers")> _
+    Partial Public Class Suppliers
+        Inherits EntityBase(Of Suppliers)
+
+        <Identity(), PrimaryKey(1), DataMember()> _
+        Public SupplierID As Integer
+
+        <DataMember()> _
+        Public CompanyName As String
+
+        <Nullable(), DataMember()> _
+        Public ContactName As String
+
+        <Nullable(), DataMember()> _
+        Public ContactTitle As String
+
+        <Nullable(), DataMember()> _
+        Public Address As String
+
+        <Nullable(), DataMember()> _
+        Public City As String
+
+        <Nullable(), DataMember()> _
+        Public Region As String
+
+        <Nullable(), DataMember()> _
+        Public PostalCode As String
+
+        <Nullable(), DataMember()> _
+        Public Country As String
+
+        <Nullable(), DataMember()> _
+        Public Phone As String
+
+        <Nullable(), DataMember()> _
+        Public Fax As String
+
+        <Nullable(), DataMember()> _
+        Public HomePage As String
+
+        ' FK_Products_Suppliers_BackReference
+        <Association(ThisKey:="SupplierID", OtherKey:="SupplierID")> _
+        Public Productss As IEnumerable(Of Products)
+    End Class
+
+    <Serializable(), DataContract()> _
+    <TableName(Name:="Territories")> _
+    Partial Public Class Territories
+        Inherits EntityBase(Of Territories)
+
+        <PrimaryKey(1), DataMember()> _
+        Public TerritoryID As String
+
+        <DataMember()> _
+        Public TerritoryDescription As String
+
+        <DataMember()> _
+        Public RegionID As Integer
+
+        ' FK_Territories_Region
+        <Association(ThisKey:="RegionID", OtherKey:="ID")> _
+        Public Region As IEnumerable(Of Region)
+
+        ' FK_EmployeeTerritories_Territories_BackReference
+        <Association(ThisKey:="TerritoryID", OtherKey:="TerritoryID")> _
+        Public EmployeeTerritoriess As IEnumerable(Of EmployeeTerritories)
+    End Class
+
+End Namespace
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/Templates.VB/DataModel.tt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,39 @@
+<#@ template language="C#" debug="True" hostspecific="True" #>
+<#@ output extension=".generated.vb" #>
+<#@ include file="$(SolutionDir)\Source\Templates\BLToolkit.ttinclude"     #>
+<#@ include file="$(SolutionDir)\Source\Templates\BLT4Toolkit.ttinclude"   #>
+<#@ include file="$(SolutionDir)\Source\Templates\MSSQL.ttinclude"         #>
+<#@ include file="$(SolutionDir)\Source\Templates\WCFAttributes.ttinclude" #>
+<#@ include file="$(SolutionDir)\Source\Templates\VB.ttinclude"            #>
+<#
+	//ConnectionString     = "Data Source=DBHost;Port=5000;Database=BLToolkitData;Uid=sa";
+	//DataProviderAssembly = @"E:\Projects\SVN\BLToolkit\trunk\Redist\Sybase\Sybase.AdoNet2.AseClient.dll";
+
+	//ConnectionString     = "Server=.;Database=BLToolkitData;Integrated Security=SSPI";
+	ConnectionString     = "Server=.;Database=Northwind;Integrated Security=SSPI";
+
+	//Namespace       = "Templates";
+	//DataContextName = "Test";
+
+	BaseEntityClass = "EntityBase";
+
+	RenderField = true;
+
+	LoadMetadata();
+
+	//Tables["BinaryData"].Columns["BinaryDataID"].MemberName = "ID";
+
+	Tables["Employees"].ForeignKeys["FK_Employees_Employees"].MemberName = "ReportsToEmployee";
+
+	foreach (var t in Tables.Values)
+		foreach (var c in t.Columns.Values)
+			if (c.IsPrimaryKey && t.TableName + "ID" == c.ColumnName)
+				c.MemberName = "ID";
+
+	foreach (var t in Tables.Values)
+		t.BaseClassName = "EntityBase(Of " + t.ClassName + ")";
+
+	Usings.Add("BLToolkit.Common");
+
+	GenerateModel();
+#>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/Templates.VB/My Project/Application.Designer.vb	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,13 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.1
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/Templates.VB/My Project/Application.myapp	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<MyApplicationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <MySubMain>false</MySubMain>
+  <SingleInstance>false</SingleInstance>
+  <ShutdownMode>0</ShutdownMode>
+  <EnableVisualStyles>true</EnableVisualStyles>
+  <AuthenticationMode>0</AuthenticationMode>
+  <ApplicationType>1</ApplicationType>
+  <SaveMySettingsOnExit>true</SaveMySettingsOnExit>
+</MyApplicationData>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/Templates.VB/My Project/AssemblyInfo.vb	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,35 @@
+Imports System
+Imports System.Reflection
+Imports System.Runtime.InteropServices
+
+' General Information about an assembly is controlled through the following 
+' set of attributes. Change these attribute values to modify the information
+' associated with an assembly.
+
+' Review the values of the assembly attributes
+
+<Assembly: AssemblyTitle("Templates.VB")> 
+<Assembly: AssemblyDescription("")> 
+<Assembly: AssemblyCompany("Microsoft")> 
+<Assembly: AssemblyProduct("Templates.VB")> 
+<Assembly: AssemblyCopyright("\xA9 2002-2011 www.bltoolkit.net")> 
+<Assembly: AssemblyTrademark("")> 
+
+<Assembly: ComVisible(False)>
+
+'The following GUID is for the ID of the typelib if this project is exposed to COM
+<Assembly: Guid("55272c3f-292c-468e-a1aa-fbbd2fbf56c2")> 
+
+' Version information for an assembly consists of the following four values:
+'
+'      Major Version
+'      Minor Version 
+'      Build Number
+'      Revision
+'
+' You can specify all the values or you can default the Build and Revision Numbers 
+' by using the '*' as shown below:
+' <Assembly: AssemblyVersion("1.0.*")> 
+
+<Assembly: AssemblyVersion("1.0.0.0")> 
+<Assembly: AssemblyFileVersion("1.0.0.0")> 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/Templates.VB/My Project/Resources.Designer.vb	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,63 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.1
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+Imports System
+
+Namespace My.Resources
+    
+    'This class was auto-generated by the StronglyTypedResourceBuilder
+    'class via a tool like ResGen or Visual Studio.
+    'To add or remove a member, edit your .ResX file then rerun ResGen
+    'with the /str option, or rebuild your VS project.
+    '''<summary>
+    '''  A strongly-typed resource class, for looking up localized strings, etc.
+    '''</summary>
+    <Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0"),  _
+     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _
+     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(),  _
+     Global.Microsoft.VisualBasic.HideModuleNameAttribute()>  _
+    Friend Module Resources
+        
+        Private resourceMan As Global.System.Resources.ResourceManager
+        
+        Private resourceCulture As Global.System.Globalization.CultureInfo
+        
+        '''<summary>
+        '''  Returns the cached ResourceManager instance used by this class.
+        '''</summary>
+        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)>  _
+        Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
+            Get
+                If Object.ReferenceEquals(resourceMan, Nothing) Then
+                    Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("Templates.VB.Resources", GetType(Resources).Assembly)
+                    resourceMan = temp
+                End If
+                Return resourceMan
+            End Get
+        End Property
+        
+        '''<summary>
+        '''  Overrides the current thread's CurrentUICulture property for all
+        '''  resource lookups using this strongly typed resource class.
+        '''</summary>
+        <Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)>  _
+        Friend Property Culture() As Global.System.Globalization.CultureInfo
+            Get
+                Return resourceCulture
+            End Get
+            Set
+                resourceCulture = value
+            End Set
+        End Property
+    End Module
+End Namespace
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/Templates.VB/My Project/Resources.resx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/Templates.VB/My Project/Settings.Designer.vb	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,83 @@
+'------------------------------------------------------------------------------
+' <auto-generated>
+'     This code was generated by a tool.
+'     Runtime Version:4.0.30319.1
+'
+'     Changes to this file may cause incorrect behavior and will be lost if
+'     the code is regenerated.
+' </auto-generated>
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+
+Namespace My
+    
+    <Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(),  _
+     Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0"),  _
+     Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)>  _
+    Partial Friend NotInheritable Class MySettings
+        Inherits Global.System.Configuration.ApplicationSettingsBase
+        
+        Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings)
+        
+#Region "My.Settings Auto-Save Functionality"
+#If _MyType = "WindowsForms" Then
+    Private Shared addedHandler As Boolean
+
+    Private Shared addedHandlerLockObject As New Object
+
+    <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
+    Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs)
+        If My.Application.SaveMySettingsOnExit Then
+            My.Settings.Save()
+        End If
+    End Sub
+#End If
+#End Region
+        
+        Public Shared ReadOnly Property [Default]() As MySettings
+            Get
+                
+#If _MyType = "WindowsForms" Then
+               If Not addedHandler Then
+                    SyncLock addedHandlerLockObject
+                        If Not addedHandler Then
+                            AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
+                            addedHandler = True
+                        End If
+                    End SyncLock
+                End If
+#End If
+                Return defaultInstance
+            End Get
+        End Property
+        
+        <Global.System.Configuration.ApplicationScopedSettingAttribute(),  _
+         Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _
+         Global.System.Configuration.SpecialSettingAttribute(Global.System.Configuration.SpecialSetting.ConnectionString),  _
+         Global.System.Configuration.DefaultSettingValueAttribute("Data Source=DADDY;Initial Catalog=Northwind;Integrated Security=True")>  _
+        Public ReadOnly Property NorthwindConnectionString() As String
+            Get
+                Return CType(Me("NorthwindConnectionString"),String)
+            End Get
+        End Property
+    End Class
+End Namespace
+
+Namespace My
+    
+    <Global.Microsoft.VisualBasic.HideModuleNameAttribute(),  _
+     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _
+     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute()>  _
+    Friend Module MySettingsProperty
+        
+        <Global.System.ComponentModel.Design.HelpKeywordAttribute("My.Settings")>  _
+        Friend ReadOnly Property Settings() As Global.Templates.VB.My.MySettings
+            Get
+                Return Global.Templates.VB.My.MySettings.Default
+            End Get
+        End Property
+    End Module
+End Namespace
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/Templates.VB/My Project/Settings.settings	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,14 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="My" GeneratedClassName="MySettings" UseMySettingsClassName="true">
+  <Profiles />
+  <Settings>
+    <Setting Name="NorthwindConnectionString" Type="(Connection string)" Scope="Application">
+      <DesignTimeValue Profile="(Default)">&lt;?xml version="1.0" encoding="utf-16"?&gt;
+&lt;SerializableConnectionString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
+  &lt;ConnectionString&gt;Data Source=DADDY;Initial Catalog=Northwind;Integrated Security=True&lt;/ConnectionString&gt;
+  &lt;ProviderName&gt;System.Data.SqlClient&lt;/ProviderName&gt;
+&lt;/SerializableConnectionString&gt;</DesignTimeValue>
+      <Value Profile="(Default)">Data Source=DADDY;Initial Catalog=Northwind;Integrated Security=True</Value>
+    </Setting>
+  </Settings>
+</SettingsFile>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/Templates.VB/Templates.VB.vbproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,209 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{F2B014F7-3807-4938-8F02-3CF8247C47DC}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <RootNamespace>Templates.VB</RootNamespace>
+    <AssemblyName>Templates.VB</AssemblyName>
+    <FileAlignment>512</FileAlignment>
+    <MyType>Windows</MyType>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <OptionExplicit>On</OptionExplicit>
+    <OptionCompare>Binary</OptionCompare>
+    <OptionStrict>Off</OptionStrict>
+    <OptionInfer>On</OptionInfer>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <DefineDebug>true</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DocumentationFile>Templates.VB.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022,42353,42354,42355</NoWarn>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <DefineDebug>false</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DocumentationFile>Templates.VB.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022,42353,42354,42355</NoWarn>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <DefineDebug>true</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DocumentationFile>Templates.VB.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022,42353,42354,42355</NoWarn>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\Templates.VB.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.vb</CodeAnalysisModuleSuppressionsFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <DefineTrace>true</DefineTrace>
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DocumentationFile>Templates.VB.xml</DocumentationFile>
+    <Optimize>true</Optimize>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022,42353,42354,42355</NoWarn>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\Templates.VB.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.vb</CodeAnalysisModuleSuppressionsFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Data.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Runtime.Serialization">
+      <RequiredTargetFramework>3.0</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Import Include="Microsoft.VisualBasic" />
+    <Import Include="System" />
+    <Import Include="System.Collections" />
+    <Import Include="System.Collections.Generic" />
+    <Import Include="System.Data" />
+    <Import Include="System.Diagnostics" />
+    <Import Include="System.Linq" />
+    <Import Include="System.Xml.Linq" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="DataModel.generated.vb">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>DataModel.tt</DependentUpon>
+    </Compile>
+    <Compile Include="My Project\AssemblyInfo.vb" />
+    <Compile Include="My Project\Application.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Application.myapp</DependentUpon>
+    </Compile>
+    <Compile Include="My Project\Resources.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="My Project\Settings.Designer.vb">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="My Project\Resources.resx">
+      <Generator>VbMyResourcesResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.vb</LastGenOutput>
+      <CustomToolNamespace>My.Resources</CustomToolNamespace>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config" />
+    <None Include="DataModel.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>DataModel.generated.vb</LastGenOutput>
+    </None>
+    <None Include="My Project\Application.myapp">
+      <Generator>MyApplicationCodeGenerator</Generator>
+      <LastGenOutput>Application.Designer.vb</LastGenOutput>
+    </None>
+    <None Include="My Project\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <CustomToolNamespace>My</CustomToolNamespace>
+      <LastGenOutput>Settings.Designer.vb</LastGenOutput>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{3259AA49-8AA1-44D3-9025-A0B520596A8C}" />
+    <Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
+    <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/Templates.VB/app.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<configuration>
+    <configSections>
+    </configSections>
+    <connectionStrings>
+        <add name="Templates.VB.My.MySettings.NorthwindConnectionString" connectionString="Data Source=DADDY;Initial Catalog=Northwind;Integrated Security=True" providerName="System.Data.SqlClient"/>
+    </connectionStrings>
+    <system.diagnostics>
+        <sources>
+            <!-- This section defines the logging configuration for My.Application.Log -->
+            <source name="DefaultSource" switchName="DefaultSwitch">
+                <listeners>
+                    <add name="FileLog"/>
+                    <!-- Uncomment the below section to write to the Application Event Log -->
+                    <!--<add name="EventLog"/>-->
+                </listeners>
+            </source>
+        </sources>
+        <switches>
+            <add name="DefaultSwitch" value="Information"/>
+        </switches>
+        <sharedListeners>
+            <add name="FileLog" type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" initializeData="FileLogWriter"/>
+            <!-- Uncomment the below section and replace APPLICATION_NAME with the name of your application to write to the Application Event Log -->
+            <!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
+        </sharedListeners>
+    </system.diagnostics>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/Templates/MSSqlDataModel.generated.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,648 @@
+//---------------------------------------------------------------------------------------------------
+// <auto-generated>
+//    This code was generated by BLToolkit template for T4.
+//    Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
+// </auto-generated>
+//---------------------------------------------------------------------------------------------------
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+using System.Runtime.Serialization;
+using System.Text;
+
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using BLToolkit.Data.Sql;
+using BLToolkit.Data.Sql.SqlProvider;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+using BLToolkit.Validation;
+
+namespace MSSqlDataModel
+{
+	public partial class MSSqlDataContext : DataContext
+	{
+		public Table<AlphabeticalListOfProduct>  AlphabeticalListOfProducts   { get { return this.GetTable<AlphabeticalListOfProduct>();  } }
+		/// <summary>
+		/// Description for Categories table.
+		/// </summary>
+		public Table<Category>                   Categories                   { get { return this.GetTable<Category>();                   } }
+		public Table<CategorySalesFor1997>       CategorySalesFor1997         { get { return this.GetTable<CategorySalesFor1997>();       } }
+		public Table<CurrentProductList>         CurrentProductLists          { get { return this.GetTable<CurrentProductList>();         } }
+		public Table<CustomerAndSuppliersByCity> CustomerAndSuppliersByCities { get { return this.GetTable<CustomerAndSuppliersByCity>(); } }
+		public Table<CustomerCustomerDemo>       CustomerCustomerDemos        { get { return this.GetTable<CustomerCustomerDemo>();       } }
+		public Table<CustomerDemographic>        CustomerDemographics         { get { return this.GetTable<CustomerDemographic>();        } }
+		/// <summary>
+		/// Description of Customers table.
+		/// </summary>
+		public Table<Customer>                   Customers                    { get { return this.GetTable<Customer>();                   } }
+		public Table<Employee>                   Employees                    { get { return this.GetTable<Employee>();                   } }
+		public Table<EmployeeTerritory>          EmployeeTerritories          { get { return this.GetTable<EmployeeTerritory>();          } }
+		public Table<Invoice>                    Invoices                     { get { return this.GetTable<Invoice>();                    } }
+		public Table<OrderDetail>                OrderDetails                 { get { return this.GetTable<OrderDetail>();                } }
+		public Table<OrderDetailsExtended>       OrderDetailsExtendeds        { get { return this.GetTable<OrderDetailsExtended>();       } }
+		public Table<OrderSubtotal>              OrderSubtotals               { get { return this.GetTable<OrderSubtotal>();              } }
+		public Table<Order>                      Orders                       { get { return this.GetTable<Order>();                      } }
+		public Table<OrdersQry>                  OrdersQries                  { get { return this.GetTable<OrdersQry>();                  } }
+		public Table<ProductSalesFor1997>        ProductSalesFor1997          { get { return this.GetTable<ProductSalesFor1997>();        } }
+		public Table<Product>                    Products                     { get { return this.GetTable<Product>();                    } }
+		public Table<ProductsAboveAveragePrice>  ProductsAboveAveragePrices   { get { return this.GetTable<ProductsAboveAveragePrice>();  } }
+		public Table<ProductsByCategory>         ProductsByCategories         { get { return this.GetTable<ProductsByCategory>();         } }
+		public Table<QuarterlyOrder>             QuarterlyOrders              { get { return this.GetTable<QuarterlyOrder>();             } }
+		public Table<Region>                     Regions                      { get { return this.GetTable<Region>();                     } }
+		public Table<SalesByCategory>            SalesByCategories            { get { return this.GetTable<SalesByCategory>();            } }
+		public Table<SalesTotalsByAmount>        SalesTotalsByAmounts         { get { return this.GetTable<SalesTotalsByAmount>();        } }
+		public Table<Shipper>                    Shippers                     { get { return this.GetTable<Shipper>();                    } }
+		public Table<SummaryOfSalesByQuarter>    SummaryOfSalesByQuarters     { get { return this.GetTable<SummaryOfSalesByQuarter>();    } }
+		public Table<SummaryOfSalesByYear>       SummaryOfSalesByYears        { get { return this.GetTable<SummaryOfSalesByYear>();       } }
+		public Table<Supplier>                   Suppliers                    { get { return this.GetTable<Supplier>();                   } }
+		public Table<Territory>                  Territories                  { get { return this.GetTable<Territory>();                  } }
+		
+		#region FreeTextTable
+		
+		public class FreeTextKey<T>
+		{
+			public T   Key;
+			public int Rank;
+		}
+		
+		class FreeTextTableExpressionAttribute : TableExpressionAttribute
+		{
+			public FreeTextTableExpressionAttribute()
+				: base("")
+			{
+			}
+		
+			public override void SetTable(SqlTable table, MemberInfo member, IEnumerable<Expression> expArgs, IEnumerable<ISqlExpression> sqlArgs)
+			{
+				var aargs  = sqlArgs.ToArray();
+				var arr    = ConvertArgs(member, aargs).ToList();
+				var method = (MethodInfo)member;
+				var sp     = new MsSql2008SqlProvider();
+		
+				{
+					var ttype  = method.GetGenericArguments()[0];
+					var tbl    = new SqlTable(ttype);
+		
+					var database     = tbl.Database     == null ? null : sp.Convert(tbl.Database,     ConvertType.NameToDatabase).  ToString();
+					var owner        = tbl.Owner        == null ? null : sp.Convert(tbl.Owner,        ConvertType.NameToOwner).     ToString();
+					var physicalName = tbl.PhysicalName == null ? null : sp.Convert(tbl.PhysicalName, ConvertType.NameToQueryTable).ToString();
+		
+					var name   = sp.BuildTableName(new StringBuilder(), database, owner, physicalName);
+		
+					arr.Add(new SqlExpression(name.ToString(), Precedence.Primary));
+				}
+		
+				{
+					var field = ((ConstantExpression)expArgs.First()).Value;
+		
+					if (field is string)
+					{
+						arr[0] = new SqlExpression(field.ToString(), Precedence.Primary);
+					}
+					else if (field is LambdaExpression)
+					{
+						var body = ((LambdaExpression)field).Body;
+		
+						if (body is MemberExpression)
+						{
+							var name = ((MemberExpression)body).Member.Name;
+		
+							name = sp.Convert(name, ConvertType.NameToQueryField).ToString();
+		
+							arr[0] = new SqlExpression(name, Precedence.Primary);
+						}
+					}
+				}
+		
+				table.SqlTableType   = SqlTableType.Expression;
+				table.Name           = "FREETEXTTABLE({6}, {2}, {3}) {1}";
+				table.TableArguments = arr.ToArray();
+			}
+		}
+		
+		[FreeTextTableExpressionAttribute]
+		public Table<FreeTextKey<TKey>> FreeTextTable<TTable,TKey>(string field, string text)
+		{
+			return this.GetTable<FreeTextKey<TKey>>(
+				this,
+				((MethodInfo)(MethodBase.GetCurrentMethod())).MakeGenericMethod(typeof(TTable), typeof(TKey)),
+				field,
+				text);
+		}
+		
+		[FreeTextTableExpressionAttribute]
+		public Table<FreeTextKey<TKey>> FreeTextTable<TTable,TKey>(Expression<Func<TTable,string>> fieldSelector, string text)
+		{
+			return this.GetTable<FreeTextKey<TKey>>(
+				this,
+				((MethodInfo)(MethodBase.GetCurrentMethod())).MakeGenericMethod(typeof(TTable), typeof(TKey)),
+				fieldSelector,
+				text);
+		}
+		
+		#endregion
+	}
+
+	// View
+	[Serializable, DataContract]
+	[TableName(Name="Alphabetical list of products")]
+	public partial class AlphabeticalListOfProduct
+	{
+		[          DataMember, Required               ] public int      ProductID       { get; set; } // int(10)
+		[          DataMember, MaxLength(40), Required] public string   ProductName     { get; set; } // nvarchar(40)
+		[Nullable, DataMember                         ] public int?     SupplierID      { get; set; } // int(10)
+		[Nullable, DataMember                         ] public int?     CategoryID      { get; set; } // int(10)
+		[Nullable, DataMember, MaxLength(20)          ] public string   QuantityPerUnit { get; set; } // nvarchar(20)
+		[Nullable, DataMember                         ] public decimal? UnitPrice       { get; set; } // money(19,4)
+		[Nullable, DataMember                         ] public short?   UnitsInStock    { get; set; } // smallint(5)
+		[Nullable, DataMember                         ] public short?   UnitsOnOrder    { get; set; } // smallint(5)
+		[Nullable, DataMember                         ] public short?   ReorderLevel    { get; set; } // smallint(5)
+		[          DataMember, Required               ] public bool     Discontinued    { get; set; } // bit
+		[          DataMember, MaxLength(15), Required] public string   CategoryName    { get; set; } // nvarchar(15)
+	}
+
+	/// <summary>
+	/// Description for Categories table.
+	/// </summary>
+	[Serializable, DataContract]
+	[TableName(Name="Categories")]
+	public partial class Category
+	{
+		/// <summary>
+		/// Description of Categories.CategoryID field.
+		/// </summary>
+		[Identity, PrimaryKey(1), DataMember, Required                       ] public int    CategoryID   { get; set; } // int(10)
+		[                         DataMember, MaxLength(        15), Required] public string CategoryName { get; set; } // nvarchar(15)
+		[Nullable,                DataMember, MaxLength(1073741823)          ] public string Description  { get; set; } // ntext(1073741823)
+		[Nullable,                DataMember                                 ] public byte[] Picture      { get; set; } // image(2147483647)
+
+		// FK_Products_Categories_BackReference
+		[Association(ThisKey="CategoryID", OtherKey="CategoryID", CanBeNull=true)]
+		public IEnumerable<Product> Products { get; set; }
+	}
+
+	// View
+	[Serializable, DataContract]
+	[TableName(Name="Category Sales for 1997")]
+	public partial class CategorySalesFor1997
+	{
+		[          DataMember, MaxLength(15), Required] public string   CategoryName  { get; set; } // nvarchar(15)
+		[Nullable, DataMember                         ] public decimal? CategorySales { get; set; } // money(19,4)
+	}
+
+	// View
+	[Serializable, DataContract]
+	[TableName(Name="Current Product List")]
+	public partial class CurrentProductList
+	{
+		[Identity, DataMember, Required               ] public int    ProductID   { get; set; } // int(10)
+		[          DataMember, MaxLength(40), Required] public string ProductName { get; set; } // nvarchar(40)
+	}
+
+	// View
+	[Serializable, DataContract]
+	[TableName(Name="Customer and Suppliers by City")]
+	public partial class CustomerAndSuppliersByCity
+	{
+		[Nullable, DataMember, MaxLength(15)          ] public string City         { get; set; } // nvarchar(15)
+		[          DataMember, MaxLength(40), Required] public string CompanyName  { get; set; } // nvarchar(40)
+		[Nullable, DataMember, MaxLength(30)          ] public string ContactName  { get; set; } // nvarchar(30)
+		[          DataMember, MaxLength( 9), Required] public string Relationship { get; set; } // varchar(9)
+	}
+
+	[Serializable, DataContract]
+	[TableName(Name="CustomerCustomerDemo")]
+	public partial class CustomerCustomerDemo
+	{
+		[PrimaryKey(1), DataMember, MaxLength( 5), Required] public string CustomerID     { get; set; } // nchar(5)
+		[PrimaryKey(2), DataMember, MaxLength(10), Required] public string CustomerTypeID { get; set; } // nchar(10)
+
+		// FK_CustomerCustomerDemo
+		[Association(ThisKey="CustomerTypeID", OtherKey="CustomerTypeID", CanBeNull=false)]
+		public CustomerDemographic FK_CustomerCustomerDemo { get; set; }
+
+		// FK_CustomerCustomerDemo_Customers
+		[Association(ThisKey="CustomerID", OtherKey="CustomerID", CanBeNull=false)]
+		public Customer Customer { get; set; }
+	}
+
+	[Serializable, DataContract]
+	[TableName(Name="CustomerDemographics")]
+	public partial class CustomerDemographic
+	{
+		[          PrimaryKey(1), DataMember, MaxLength(        10), Required] public string CustomerTypeID { get; set; } // nchar(10)
+		[Nullable,                DataMember, MaxLength(1073741823)          ] public string CustomerDesc   { get; set; } // ntext(1073741823)
+
+		// FK_CustomerCustomerDemo_BackReference
+		[Association(ThisKey="CustomerTypeID", OtherKey="CustomerTypeID", CanBeNull=true)]
+		public IEnumerable<CustomerCustomerDemo> CustomerCustomerDemos { get; set; }
+	}
+
+	/// <summary>
+	/// Description of Customers table.
+	/// </summary>
+	[Serializable, DataContract]
+	[TableName(Name="Customers")]
+	public partial class Customer
+	{
+		/// <summary>
+		/// Just ID.
+		/// </summary>
+		[          PrimaryKey(1), DataMember, MaxLength( 5), Required] public string CustomerID   { get; set; } // nchar(5)
+		/// <summary>
+		/// Name of the Company.
+		/// </summary>
+		[                         DataMember, MaxLength(40), Required] public string CompanyName  { get; set; } // nvarchar(40)
+		[Nullable,                DataMember, MaxLength(30)          ] public string ContactName  { get; set; } // nvarchar(30)
+		[Nullable,                DataMember, MaxLength(30)          ] public string ContactTitle { get; set; } // nvarchar(30)
+		[Nullable,                DataMember, MaxLength(60)          ] public string Address      { get; set; } // nvarchar(60)
+		[Nullable,                DataMember, MaxLength(15)          ] public string City         { get; set; } // nvarchar(15)
+		[Nullable,                DataMember, MaxLength(15)          ] public string Region       { get; set; } // nvarchar(15)
+		[Nullable,                DataMember, MaxLength(10)          ] public string PostalCode   { get; set; } // nvarchar(10)
+		[Nullable,                DataMember, MaxLength(15)          ] public string Country      { get; set; } // nvarchar(15)
+		[Nullable,                DataMember, MaxLength(24)          ] public string Phone        { get; set; } // nvarchar(24)
+		[Nullable,                DataMember, MaxLength(24)          ] public string Fax          { get; set; } // nvarchar(24)
+
+		// FK_Orders_Customers_BackReference
+		[Association(ThisKey="CustomerID", OtherKey="CustomerID", CanBeNull=true)]
+		public IEnumerable<Order> Orders { get; set; }
+
+		// FK_CustomerCustomerDemo_Customers_BackReference
+		[Association(ThisKey="CustomerID", OtherKey="CustomerID", CanBeNull=true)]
+		public IEnumerable<CustomerCustomerDemo> CustomerCustomerDemos { get; set; }
+	}
+
+	[Serializable, DataContract]
+	[TableName(Name="Employees")]
+	public partial class Employee
+	{
+		[Identity, PrimaryKey(1), DataMember, Required                       ] public int       EmployeeID      { get; set; } // int(10)
+		[                         DataMember, MaxLength(        20), Required] public string    LastName        { get; set; } // nvarchar(20)
+		[                         DataMember, MaxLength(        10), Required] public string    FirstName       { get; set; } // nvarchar(10)
+		[Nullable,                DataMember, MaxLength(        30)          ] public string    Title           { get; set; } // nvarchar(30)
+		[Nullable,                DataMember, MaxLength(        25)          ] public string    TitleOfCourtesy { get; set; } // nvarchar(25)
+		[Nullable,                DataMember                                 ] public DateTime? BirthDate       { get; set; } // datetime(3)
+		[Nullable,                DataMember                                 ] public DateTime? HireDate        { get; set; } // datetime(3)
+		[Nullable,                DataMember, MaxLength(        60)          ] public string    Address         { get; set; } // nvarchar(60)
+		[Nullable,                DataMember, MaxLength(        15)          ] public string    City            { get; set; } // nvarchar(15)
+		[Nullable,                DataMember, MaxLength(        15)          ] public string    Region          { get; set; } // nvarchar(15)
+		[Nullable,                DataMember, MaxLength(        10)          ] public string    PostalCode      { get; set; } // nvarchar(10)
+		[Nullable,                DataMember, MaxLength(        15)          ] public string    Country         { get; set; } // nvarchar(15)
+		[Nullable,                DataMember, MaxLength(        24)          ] public string    HomePhone       { get; set; } // nvarchar(24)
+		[Nullable,                DataMember, MaxLength(         4)          ] public string    Extension       { get; set; } // nvarchar(4)
+		[Nullable,                DataMember                                 ] public byte[]    Photo           { get; set; } // image(2147483647)
+		[Nullable,                DataMember, MaxLength(1073741823)          ] public string    Notes           { get; set; } // ntext(1073741823)
+		[Nullable,                DataMember                                 ] public int?      ReportsTo       { get; set; } // int(10)
+		[Nullable,                DataMember, MaxLength(       255)          ] public string    PhotoPath       { get; set; } // nvarchar(255)
+
+		// FK_Employees_Employees
+		[Association(ThisKey="ReportsTo", OtherKey="EmployeeID", CanBeNull=true)]
+		public Employee FK_Employees_Employees { get; set; }
+
+		// FK_Orders_Employees_BackReference
+		[Association(ThisKey="EmployeeID", OtherKey="EmployeeID", CanBeNull=true)]
+		public IEnumerable<Order> Orders { get; set; }
+
+		// FK_EmployeeTerritories_Employees_BackReference
+		[Association(ThisKey="EmployeeID", OtherKey="EmployeeID", CanBeNull=true)]
+		public IEnumerable<EmployeeTerritory> EmployeeTerritories { get; set; }
+
+		// FK_Employees_Employees_BackReference
+		[Association(ThisKey="EmployeeID", OtherKey="ReportsTo", CanBeNull=true)]
+		public IEnumerable<Employee> FK_Employees_Employees_BackReference { get; set; }
+	}
+
+	[Serializable, DataContract]
+	[TableName(Name="EmployeeTerritories")]
+	public partial class EmployeeTerritory
+	{
+		[PrimaryKey(1), DataMember, Required               ] public int    EmployeeID  { get; set; } // int(10)
+		[PrimaryKey(2), DataMember, MaxLength(20), Required] public string TerritoryID { get; set; } // nvarchar(20)
+
+		// FK_EmployeeTerritories_Employees
+		[Association(ThisKey="EmployeeID", OtherKey="EmployeeID", CanBeNull=false)]
+		public Employee Employee { get; set; }
+
+		// FK_EmployeeTerritories_Territories
+		[Association(ThisKey="TerritoryID", OtherKey="TerritoryID", CanBeNull=false)]
+		public Territory Territory { get; set; }
+	}
+
+	// View
+	[Serializable, DataContract]
+	[TableName(Name="Invoices")]
+	public partial class Invoice
+	{
+		[Nullable, DataMember, MaxLength(40)          ] public string    ShipName       { get; set; } // nvarchar(40)
+		[Nullable, DataMember, MaxLength(60)          ] public string    ShipAddress    { get; set; } // nvarchar(60)
+		[Nullable, DataMember, MaxLength(15)          ] public string    ShipCity       { get; set; } // nvarchar(15)
+		[Nullable, DataMember, MaxLength(15)          ] public string    ShipRegion     { get; set; } // nvarchar(15)
+		[Nullable, DataMember, MaxLength(10)          ] public string    ShipPostalCode { get; set; } // nvarchar(10)
+		[Nullable, DataMember, MaxLength(15)          ] public string    ShipCountry    { get; set; } // nvarchar(15)
+		[Nullable, DataMember, MaxLength( 5)          ] public string    CustomerID     { get; set; } // nchar(5)
+		[          DataMember, MaxLength(40), Required] public string    CustomerName   { get; set; } // nvarchar(40)
+		[Nullable, DataMember, MaxLength(60)          ] public string    Address        { get; set; } // nvarchar(60)
+		[Nullable, DataMember, MaxLength(15)          ] public string    City           { get; set; } // nvarchar(15)
+		[Nullable, DataMember, MaxLength(15)          ] public string    Region         { get; set; } // nvarchar(15)
+		[Nullable, DataMember, MaxLength(10)          ] public string    PostalCode     { get; set; } // nvarchar(10)
+		[Nullable, DataMember, MaxLength(15)          ] public string    Country        { get; set; } // nvarchar(15)
+		[          DataMember, MaxLength(31), Required] public string    Salesperson    { get; set; } // nvarchar(31)
+		[          DataMember, Required               ] public int       OrderID        { get; set; } // int(10)
+		[Nullable, DataMember                         ] public DateTime? OrderDate      { get; set; } // datetime(3)
+		[Nullable, DataMember                         ] public DateTime? RequiredDate   { get; set; } // datetime(3)
+		[Nullable, DataMember                         ] public DateTime? ShippedDate    { get; set; } // datetime(3)
+		[          DataMember, MaxLength(40), Required] public string    ShipperName    { get; set; } // nvarchar(40)
+		[          DataMember, Required               ] public int       ProductID      { get; set; } // int(10)
+		[          DataMember, MaxLength(40), Required] public string    ProductName    { get; set; } // nvarchar(40)
+		[          DataMember, Required               ] public decimal   UnitPrice      { get; set; } // money(19,4)
+		[          DataMember, Required               ] public short     Quantity       { get; set; } // smallint(5)
+		[          DataMember, Required               ] public float     Discount       { get; set; } // real(24)
+		[Nullable, DataMember                         ] public decimal?  ExtendedPrice  { get; set; } // money(19,4)
+		[Nullable, DataMember                         ] public decimal?  Freight        { get; set; } // money(19,4)
+	}
+
+	[Serializable, DataContract]
+	[TableName(Name="Order Details")]
+	public partial class OrderDetail
+	{
+		[PrimaryKey(1), DataMember, Required] public int     OrderID   { get; set; } // int(10)
+		[PrimaryKey(2), DataMember, Required] public int     ProductID { get; set; } // int(10)
+		[               DataMember, Required] public decimal UnitPrice { get; set; } // money(19,4)
+		[               DataMember, Required] public short   Quantity  { get; set; } // smallint(5)
+		[               DataMember, Required] public float   Discount  { get; set; } // real(24)
+
+		// FK_Order_Details_Orders
+		[Association(ThisKey="OrderID", OtherKey="OrderID", CanBeNull=false)]
+		public Order OrderDetailsOrder { get; set; }
+
+		// FK_Order_Details_Products
+		[Association(ThisKey="ProductID", OtherKey="ProductID", CanBeNull=false)]
+		public Product OrderDetailsProduct { get; set; }
+	}
+
+	// View
+	[Serializable, DataContract]
+	[TableName(Name="Order Details Extended")]
+	public partial class OrderDetailsExtended
+	{
+		[          DataMember, Required               ] public int      OrderID       { get; set; } // int(10)
+		[          DataMember, Required               ] public int      ProductID     { get; set; } // int(10)
+		[          DataMember, MaxLength(40), Required] public string   ProductName   { get; set; } // nvarchar(40)
+		[          DataMember, Required               ] public decimal  UnitPrice     { get; set; } // money(19,4)
+		[          DataMember, Required               ] public short    Quantity      { get; set; } // smallint(5)
+		[          DataMember, Required               ] public float    Discount      { get; set; } // real(24)
+		[Nullable, DataMember                         ] public decimal? ExtendedPrice { get; set; } // money(19,4)
+	}
+
+	// View
+	[Serializable, DataContract]
+	[TableName(Name="Order Subtotals")]
+	public partial class OrderSubtotal
+	{
+		[          DataMember, Required] public int      OrderID  { get; set; } // int(10)
+		[Nullable, DataMember          ] public decimal? Subtotal { get; set; } // money(19,4)
+	}
+
+	[Serializable, DataContract]
+	[TableName(Name="Orders")]
+	public partial class Order
+	{
+		[Identity, PrimaryKey(1), DataMember, Required     ] public int       OrderID        { get; set; } // int(10)
+		[Nullable,                DataMember, MaxLength( 5)] public string    CustomerID     { get; set; } // nchar(5)
+		[Nullable,                DataMember               ] public int?      EmployeeID     { get; set; } // int(10)
+		[Nullable,                DataMember               ] public DateTime? OrderDate      { get; set; } // datetime(3)
+		[Nullable,                DataMember               ] public DateTime? RequiredDate   { get; set; } // datetime(3)
+		[Nullable,                DataMember               ] public DateTime? ShippedDate    { get; set; } // datetime(3)
+		[Nullable,                DataMember               ] public int?      ShipVia        { get; set; } // int(10)
+		[Nullable,                DataMember               ] public decimal?  Freight        { get; set; } // money(19,4)
+		[Nullable,                DataMember, MaxLength(40)] public string    ShipName       { get; set; } // nvarchar(40)
+		[Nullable,                DataMember, MaxLength(60)] public string    ShipAddress    { get; set; } // nvarchar(60)
+		[Nullable,                DataMember, MaxLength(15)] public string    ShipCity       { get; set; } // nvarchar(15)
+		[Nullable,                DataMember, MaxLength(15)] public string    ShipRegion     { get; set; } // nvarchar(15)
+		[Nullable,                DataMember, MaxLength(10)] public string    ShipPostalCode { get; set; } // nvarchar(10)
+		[Nullable,                DataMember, MaxLength(15)] public string    ShipCountry    { get; set; } // nvarchar(15)
+
+		// FK_Orders_Shippers
+		[Association(ThisKey="ShipVia", OtherKey="ShipperID", CanBeNull=true)]
+		public Shipper Shipper { get; set; }
+
+		// FK_Orders_Employees
+		[Association(ThisKey="EmployeeID", OtherKey="EmployeeID", CanBeNull=true)]
+		public Employee Employee { get; set; }
+
+		// FK_Orders_Customers
+		[Association(ThisKey="CustomerID", OtherKey="CustomerID", CanBeNull=true)]
+		public Customer Customer { get; set; }
+
+		// FK_Order_Details_Orders_BackReference
+		[Association(ThisKey="OrderID", OtherKey="OrderID", CanBeNull=true)]
+		public IEnumerable<OrderDetail> OrderDetails { get; set; }
+	}
+
+	// View
+	[Serializable, DataContract]
+	[TableName(Name="Orders Qry")]
+	public partial class OrdersQry
+	{
+		[          DataMember, Required               ] public int       OrderID        { get; set; } // int(10)
+		[Nullable, DataMember, MaxLength( 5)          ] public string    CustomerID     { get; set; } // nchar(5)
+		[Nullable, DataMember                         ] public int?      EmployeeID     { get; set; } // int(10)
+		[Nullable, DataMember                         ] public DateTime? OrderDate      { get; set; } // datetime(3)
+		[Nullable, DataMember                         ] public DateTime? RequiredDate   { get; set; } // datetime(3)
+		[Nullable, DataMember                         ] public DateTime? ShippedDate    { get; set; } // datetime(3)
+		[Nullable, DataMember                         ] public int?      ShipVia        { get; set; } // int(10)
+		[Nullable, DataMember                         ] public decimal?  Freight        { get; set; } // money(19,4)
+		[Nullable, DataMember, MaxLength(40)          ] public string    ShipName       { get; set; } // nvarchar(40)
+		[Nullable, DataMember, MaxLength(60)          ] public string    ShipAddress    { get; set; } // nvarchar(60)
+		[Nullable, DataMember, MaxLength(15)          ] public string    ShipCity       { get; set; } // nvarchar(15)
+		[Nullable, DataMember, MaxLength(15)          ] public string    ShipRegion     { get; set; } // nvarchar(15)
+		[Nullable, DataMember, MaxLength(10)          ] public string    ShipPostalCode { get; set; } // nvarchar(10)
+		[Nullable, DataMember, MaxLength(15)          ] public string    ShipCountry    { get; set; } // nvarchar(15)
+		[          DataMember, MaxLength(40), Required] public string    CompanyName    { get; set; } // nvarchar(40)
+		[Nullable, DataMember, MaxLength(60)          ] public string    Address        { get; set; } // nvarchar(60)
+		[Nullable, DataMember, MaxLength(15)          ] public string    City           { get; set; } // nvarchar(15)
+		[Nullable, DataMember, MaxLength(15)          ] public string    Region         { get; set; } // nvarchar(15)
+		[Nullable, DataMember, MaxLength(10)          ] public string    PostalCode     { get; set; } // nvarchar(10)
+		[Nullable, DataMember, MaxLength(15)          ] public string    Country        { get; set; } // nvarchar(15)
+	}
+
+	// View
+	[Serializable, DataContract]
+	[TableName(Name="Product Sales for 1997")]
+	public partial class ProductSalesFor1997
+	{
+		[          DataMember, MaxLength(15), Required] public string   CategoryName { get; set; } // nvarchar(15)
+		[          DataMember, MaxLength(40), Required] public string   ProductName  { get; set; } // nvarchar(40)
+		[Nullable, DataMember                         ] public decimal? ProductSales { get; set; } // money(19,4)
+	}
+
+	[Serializable, DataContract]
+	[TableName(Name="Products")]
+	public partial class Product
+	{
+		[Identity, PrimaryKey(1), DataMember, Required               ] public int      ProductID       { get; set; } // int(10)
+		[                         DataMember, MaxLength(40), Required] public string   ProductName     { get; set; } // nvarchar(40)
+		[Nullable,                DataMember                         ] public int?     SupplierID      { get; set; } // int(10)
+		[Nullable,                DataMember                         ] public int?     CategoryID      { get; set; } // int(10)
+		[Nullable,                DataMember, MaxLength(20)          ] public string   QuantityPerUnit { get; set; } // nvarchar(20)
+		[Nullable,                DataMember                         ] public decimal? UnitPrice       { get; set; } // money(19,4)
+		[Nullable,                DataMember                         ] public short?   UnitsInStock    { get; set; } // smallint(5)
+		[Nullable,                DataMember                         ] public short?   UnitsOnOrder    { get; set; } // smallint(5)
+		[Nullable,                DataMember                         ] public short?   ReorderLevel    { get; set; } // smallint(5)
+		[                         DataMember, Required               ] public bool     Discontinued    { get; set; } // bit
+
+		// FK_Products_Suppliers
+		[Association(ThisKey="SupplierID", OtherKey="SupplierID", CanBeNull=true)]
+		public Supplier Supplier { get; set; }
+
+		// FK_Products_Categories
+		[Association(ThisKey="CategoryID", OtherKey="CategoryID", CanBeNull=true)]
+		public Category Category { get; set; }
+
+		// FK_Order_Details_Products_BackReference
+		[Association(ThisKey="ProductID", OtherKey="ProductID", CanBeNull=true)]
+		public IEnumerable<OrderDetail> OrderDetails { get; set; }
+	}
+
+	// View
+	[Serializable, DataContract]
+	[TableName(Name="Products Above Average Price")]
+	public partial class ProductsAboveAveragePrice
+	{
+		[          DataMember, MaxLength(40), Required] public string   ProductName { get; set; } // nvarchar(40)
+		[Nullable, DataMember                         ] public decimal? UnitPrice   { get; set; } // money(19,4)
+	}
+
+	// View
+	[Serializable, DataContract]
+	[TableName(Name="Products by Category")]
+	public partial class ProductsByCategory
+	{
+		[          DataMember, MaxLength(15), Required] public string CategoryName    { get; set; } // nvarchar(15)
+		[          DataMember, MaxLength(40), Required] public string ProductName     { get; set; } // nvarchar(40)
+		[Nullable, DataMember, MaxLength(20)          ] public string QuantityPerUnit { get; set; } // nvarchar(20)
+		[Nullable, DataMember                         ] public short? UnitsInStock    { get; set; } // smallint(5)
+		[          DataMember, Required               ] public bool   Discontinued    { get; set; } // bit
+	}
+
+	// View
+	[Serializable, DataContract]
+	[TableName(Name="Quarterly Orders")]
+	public partial class QuarterlyOrder
+	{
+		[Nullable, DataMember, MaxLength( 5)] public string CustomerID  { get; set; } // nchar(5)
+		[Nullable, DataMember, MaxLength(40)] public string CompanyName { get; set; } // nvarchar(40)
+		[Nullable, DataMember, MaxLength(15)] public string City        { get; set; } // nvarchar(15)
+		[Nullable, DataMember, MaxLength(15)] public string Country     { get; set; } // nvarchar(15)
+	}
+
+	[Serializable, DataContract]
+	[TableName(Name="Region")]
+	public partial class Region
+	{
+		[PrimaryKey(1), DataMember, Required               ] public int    RegionID          { get; set; } // int(10)
+		[               DataMember, MaxLength(50), Required] public string RegionDescription { get; set; } // nchar(50)
+
+		// FK_Territories_Region_BackReference
+		[Association(ThisKey="RegionID", OtherKey="RegionID", CanBeNull=true)]
+		public IEnumerable<Territory> Territories { get; set; }
+	}
+
+	// View
+	[Serializable, DataContract]
+	[TableName(Name="Sales by Category")]
+	public partial class SalesByCategory
+	{
+		[          DataMember, Required               ] public int      CategoryID   { get; set; } // int(10)
+		[          DataMember, MaxLength(15), Required] public string   CategoryName { get; set; } // nvarchar(15)
+		[          DataMember, MaxLength(40), Required] public string   ProductName  { get; set; } // nvarchar(40)
+		[Nullable, DataMember                         ] public decimal? ProductSales { get; set; } // money(19,4)
+	}
+
+	// View
+	[Serializable, DataContract]
+	[TableName(Name="Sales Totals by Amount")]
+	public partial class SalesTotalsByAmount
+	{
+		[Nullable, DataMember                         ] public decimal?  SaleAmount  { get; set; } // money(19,4)
+		[          DataMember, Required               ] public int       OrderID     { get; set; } // int(10)
+		[          DataMember, MaxLength(40), Required] public string    CompanyName { get; set; } // nvarchar(40)
+		[Nullable, DataMember                         ] public DateTime? ShippedDate { get; set; } // datetime(3)
+	}
+
+	[Serializable, DataContract]
+	[TableName(Name="Shippers")]
+	public partial class Shipper
+	{
+		[Identity, PrimaryKey(1), DataMember, Required               ] public int    ShipperID   { get; set; } // int(10)
+		[                         DataMember, MaxLength(40), Required] public string CompanyName { get; set; } // nvarchar(40)
+		[Nullable,                DataMember, MaxLength(24)          ] public string Phone       { get; set; } // nvarchar(24)
+
+		// FK_Orders_Shippers_BackReference
+		[Association(ThisKey="ShipperID", OtherKey="ShipVia", CanBeNull=true)]
+		public IEnumerable<Order> Orders { get; set; }
+	}
+
+	// View
+	[Serializable, DataContract]
+	[TableName(Name="Summary of Sales by Quarter")]
+	public partial class SummaryOfSalesByQuarter
+	{
+		[Nullable, DataMember          ] public DateTime? ShippedDate { get; set; } // datetime(3)
+		[          DataMember, Required] public int       OrderID     { get; set; } // int(10)
+		[Nullable, DataMember          ] public decimal?  Subtotal    { get; set; } // money(19,4)
+	}
+
+	// View
+	[Serializable, DataContract]
+	[TableName(Name="Summary of Sales by Year")]
+	public partial class SummaryOfSalesByYear
+	{
+		[Nullable, DataMember          ] public DateTime? ShippedDate { get; set; } // datetime(3)
+		[          DataMember, Required] public int       OrderID     { get; set; } // int(10)
+		[Nullable, DataMember          ] public decimal?  Subtotal    { get; set; } // money(19,4)
+	}
+
+	[Serializable, DataContract]
+	[TableName(Name="Suppliers")]
+	public partial class Supplier
+	{
+		[Identity, PrimaryKey(1), DataMember, Required                       ] public int    SupplierID   { get; set; } // int(10)
+		[                         DataMember, MaxLength(        40), Required] public string CompanyName  { get; set; } // nvarchar(40)
+		[Nullable,                DataMember, MaxLength(        30)          ] public string ContactName  { get; set; } // nvarchar(30)
+		[Nullable,                DataMember, MaxLength(        30)          ] public string ContactTitle { get; set; } // nvarchar(30)
+		[Nullable,                DataMember, MaxLength(        60)          ] public string Address      { get; set; } // nvarchar(60)
+		[Nullable,                DataMember, MaxLength(        15)          ] public string City         { get; set; } // nvarchar(15)
+		[Nullable,                DataMember, MaxLength(        15)          ] public string Region       { get; set; } // nvarchar(15)
+		[Nullable,                DataMember, MaxLength(        10)          ] public string PostalCode   { get; set; } // nvarchar(10)
+		[Nullable,                DataMember, MaxLength(        15)          ] public string Country      { get; set; } // nvarchar(15)
+		[Nullable,                DataMember, MaxLength(        24)          ] public string Phone        { get; set; } // nvarchar(24)
+		[Nullable,                DataMember, MaxLength(        24)          ] public string Fax          { get; set; } // nvarchar(24)
+		[Nullable,                DataMember, MaxLength(1073741823)          ] public string HomePage     { get; set; } // ntext(1073741823)
+
+		// FK_Products_Suppliers_BackReference
+		[Association(ThisKey="SupplierID", OtherKey="SupplierID", CanBeNull=true)]
+		public IEnumerable<Product> Products { get; set; }
+	}
+
+	[Serializable, DataContract]
+	[TableName(Name="Territories")]
+	public partial class Territory
+	{
+		[PrimaryKey(1), DataMember, MaxLength(20), Required] public string TerritoryID          { get; set; } // nvarchar(20)
+		[               DataMember, MaxLength(50), Required] public string TerritoryDescription { get; set; } // nchar(50)
+		[               DataMember, Required               ] public int    RegionID             { get; set; } // int(10)
+
+		// FK_Territories_Region
+		[Association(ThisKey="RegionID", OtherKey="RegionID", CanBeNull=false)]
+		public Region Region { get; set; }
+
+		// FK_EmployeeTerritories_Territories_BackReference
+		[Association(ThisKey="TerritoryID", OtherKey="TerritoryID", CanBeNull=true)]
+		public IEnumerable<EmployeeTerritory> EmployeeTerritories { get; set; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/Templates/MSSqlDataModel.tt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,16 @@
+<#@ template language="C#" debug="True" hostspecific="True" #>
+<#@ output extension=".generated.cs" #>
+<#@ include file="$(SolutionDir)\Source\Templates\BLToolkit.ttinclude"            #>
+<#@ include file="$(SolutionDir)\Source\Templates\WCFAttributes.ttinclude"        #>
+<#@ include file="$(SolutionDir)\Source\Templates\MSSql.ttinclude"                #>
+<#@ include file="$(SolutionDir)\Source\Templates\PluralSingular.ttinclude"       #>
+<#@ include file="$(SolutionDir)\Source\Templates\ValidationAttributes.ttinclude" #>
+<#
+	ConnectionString = "Server=.;Database=Northwind;Integrated Security=SSPI";
+
+	DataContextName      = "MSSqlDataContext";
+	BaseDataContextClass = "DataContext";
+	Namespace            = "MSSqlDataModel";
+
+	GenerateModel();
+#>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/Templates/MySqlDataModel.generated.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,180 @@
+//---------------------------------------------------------------------------------------------------
+// <auto-generated>
+//    This code was generated by BLToolkit template for T4.
+//    Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
+// </auto-generated>
+//---------------------------------------------------------------------------------------------------
+using System;
+
+using BLToolkit.Data;
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+using BLToolkit.Validation;
+
+namespace MySqlDataModel
+{
+	public partial class MySqlDataContext : DbManager
+	{
+		public Table<alltypes>      alltypes      { get { return this.GetTable<alltypes>();      } }
+		public Table<binarydata>    binarydata    { get { return this.GetTable<binarydata>();    } }
+		public Table<child>         child         { get { return this.GetTable<child>();         } }
+		public Table<datatypetest>  datatypetest  { get { return this.GetTable<datatypetest>();  } }
+		public Table<doctor>        doctor        { get { return this.GetTable<doctor>();        } }
+		public Table<grandchild>    grandchild    { get { return this.GetTable<grandchild>();    } }
+		public Table<linqdatatypes> linqdatatypes { get { return this.GetTable<linqdatatypes>(); } }
+		public Table<parent>        parent        { get { return this.GetTable<parent>();        } }
+		public Table<patient>       patient       { get { return this.GetTable<patient>();       } }
+		public Table<person>        person        { get { return this.GetTable<person>();        } }
+		public Table<testidentity>  testidentity  { get { return this.GetTable<testidentity>();  } }
+	}
+
+	[TableName(Name="alltypes")]
+	public partial class alltypes
+	{
+		[Identity, PrimaryKey(1), Required        ] public int       ID                { get; set; } // int(10)
+		[Nullable                                 ] public long?     bigintDataType    { get; set; } // bigint(19)
+		[Nullable                                 ] public short?    smallintDataType  { get; set; } // smallint(5)
+		[Nullable                                 ] public sbyte?    tinyintDataType   { get; set; } // tinyint(3)
+		[Nullable                                 ] public int?      mediumintDataType { get; set; } // mediumint(7)
+		[Nullable                                 ] public int?      intDataType       { get; set; } // int(10)
+		[Nullable                                 ] public decimal?  numericDataType   { get; set; } // decimal(10)
+		[Nullable                                 ] public decimal?  decimalDataType   { get; set; } // decimal(10)
+		[Nullable                                 ] public double?   doubleDataType    { get; set; } // double(22)
+		[Nullable                                 ] public float?    floatDataType     { get; set; } // float(12)
+		[Nullable                                 ] public DateTime? dateDataType      { get; set; } // date
+		[Nullable                                 ] public DateTime? datetimeDataType  { get; set; } // datetime
+		[Nullable                                 ] public DateTime? timestampDataType { get; set; } // timestamp
+		[Nullable                                 ] public DateTime? timeDataType      { get; set; } // time
+		[Nullable                                 ] public DateTime? yearDataType      { get; set; } // year
+		[Nullable                                 ] public DateTime? year2DataType     { get; set; } // year
+		[Nullable                                 ] public DateTime? year4DataType     { get; set; } // year
+		[Nullable,                MaxLength(    1)] public string    charDataType      { get; set; } // char(1)
+		[Nullable,                MaxLength(   20)] public string    varcharDataType   { get; set; } // varchar(20)
+		[Nullable,                MaxLength(65535)] public string    textDataType      { get; set; } // text(65535)
+		[Nullable                                 ] public byte[]    binaryDataType    { get; set; } // binary(3)
+		[Nullable                                 ] public byte[]    varbinaryDataType { get; set; } // varbinary(5)
+		[Nullable                                 ] public byte[]    blobDataType      { get; set; } // blob(65535)
+		[Nullable                                 ] public bool?     bitDataType       { get; set; } // bit(3)
+		[Nullable,                MaxLength(    5)] public string    enumDataType      { get; set; } // enum(5)
+		[Nullable,                MaxLength(    7)] public string    setDataType       { get; set; } // set(7)
+	}
+
+	[TableName(Name="binarydata")]
+	public partial class binarydata
+	{
+		[Identity, PrimaryKey(1), Required                                                ] public int      BinaryDataID { get; set; } // int(10)
+		[                         NonUpdatable(OnInsert = true, OnUpdate = true), Required] public DateTime Stamp        { get; set; } // timestamp
+		[                         Required                                                ] public byte[]   Data         { get; set; } // varbinary(1024)
+	}
+
+	[TableName(Name="child")]
+	public partial class child
+	{
+		[Nullable] public int? ParentID { get; set; } // int(10)
+		[Nullable] public int? ChildID  { get; set; } // int(10)
+	}
+
+	[TableName(Name="datatypetest")]
+	public partial class datatypetest
+	{
+		[Identity, PrimaryKey(1), Required       ] public int       DataTypeID { get; set; } // int(10)
+		[Nullable                                ] public byte[]    Binary_    { get; set; } // binary(50)
+		[                         Required       ] public bool      Boolean_   { get; set; } // bit(1)
+		[Nullable                                ] public sbyte?    Byte_      { get; set; } // tinyint(3)
+		[Nullable                                ] public byte[]    Bytes_     { get; set; } // varbinary(50)
+		[Nullable,                MaxLength(   1)] public string    Char_      { get; set; } // char(1)
+		[Nullable                                ] public DateTime? DateTime_  { get; set; } // datetime
+		[Nullable                                ] public decimal?  Decimal_   { get; set; } // decimal(20,2)
+		[Nullable                                ] public float?    Double_    { get; set; } // float(12)
+		[Nullable                                ] public byte[]    Guid_      { get; set; } // varbinary(50)
+		[Nullable                                ] public short?    Int16_     { get; set; } // smallint(5)
+		[Nullable                                ] public int?      Int32_     { get; set; } // int(10)
+		[Nullable                                ] public long?     Int64_     { get; set; } // bigint(19)
+		[Nullable                                ] public decimal?  Money_     { get; set; } // decimal(20,4)
+		[Nullable                                ] public sbyte?    SByte_     { get; set; } // tinyint(3)
+		[Nullable                                ] public double?   Single_    { get; set; } // double(22)
+		[Nullable                                ] public byte[]    Stream_    { get; set; } // varbinary(50)
+		[Nullable,                MaxLength(  50)] public string    String_    { get; set; } // varchar(50)
+		[Nullable                                ] public short?    UInt16_    { get; set; } // smallint(5)
+		[Nullable                                ] public int?      UInt32_    { get; set; } // int(10)
+		[Nullable                                ] public long?     UInt64_    { get; set; } // bigint(19)
+		[Nullable,                MaxLength(1000)] public string    Xml_       { get; set; } // varchar(1000)
+	}
+
+	[TableName(Name="doctor")]
+	public partial class doctor
+	{
+		[PrimaryKey(1), Required               ] public int    PersonID { get; set; } // int(10)
+		[               MaxLength(50), Required] public string Taxonomy { get; set; } // varchar(50)
+
+		// FK_Doctor_Person
+		[Association(ThisKey="PersonID", OtherKey="PersonID", CanBeNull=false)]
+		public person DoctorPerson { get; set; }
+	}
+
+	[TableName(Name="grandchild")]
+	public partial class grandchild
+	{
+		[Nullable] public int? ParentID     { get; set; } // int(10)
+		[Nullable] public int? ChildID      { get; set; } // int(10)
+		[Nullable] public int? GrandChildID { get; set; } // int(10)
+	}
+
+	[TableName(Name="linqdatatypes")]
+	public partial class linqdatatypes
+	{
+		[Nullable               ] public int?      ID             { get; set; } // int(10)
+		[Nullable               ] public decimal?  MoneyValue     { get; set; } // decimal(10,4)
+		[Nullable               ] public DateTime? DateTimeValue  { get; set; } // datetime
+		[Nullable               ] public DateTime? DateTimeValue2 { get; set; } // datetime
+		[Nullable               ] public bool?     BoolValue      { get; set; } // tinyint(3)
+		[Nullable, MaxLength(36)] public string    GuidValue      { get; set; } // char(36)
+		[Nullable               ] public byte[]    BinaryValue    { get; set; } // varbinary(5000)
+		[Nullable               ] public short?    SmallIntValue  { get; set; } // smallint(5)
+		[Nullable               ] public int?      IntValue       { get; set; } // int(10)
+		[Nullable               ] public long?     BigIntValue    { get; set; } // bigint(19)
+	}
+
+	[TableName(Name="parent")]
+	public partial class parent
+	{
+		[Nullable] public int? ParentID { get; set; } // int(10)
+		[Nullable] public int? Value1   { get; set; } // int(10)
+	}
+
+	[TableName(Name="patient")]
+	public partial class patient
+	{
+		[PrimaryKey(1), Required                ] public int    PersonID  { get; set; } // int(10)
+		[               MaxLength(256), Required] public string Diagnosis { get; set; } // varchar(256)
+
+		// FK_Patient_Person
+		[Association(ThisKey="PersonID", OtherKey="PersonID", CanBeNull=false)]
+		public person PatientPerson { get; set; }
+	}
+
+	[TableName(Name="person")]
+	public partial class person
+	{
+		[Identity, PrimaryKey(1), Required               ] public int    PersonID   { get; set; } // int(10)
+		[                         MaxLength(50), Required] public string FirstName  { get; set; } // varchar(50)
+		[                         MaxLength(50), Required] public string LastName   { get; set; } // varchar(50)
+		[Nullable,                MaxLength(50)          ] public string MiddleName { get; set; } // varchar(50)
+		[                         MaxLength( 1), Required] public string Gender     { get; set; } // char(1)
+
+		// FK_Doctor_Person_BackReference
+		[Association(ThisKey="PersonID", OtherKey="PersonID", CanBeNull=true)]
+		public doctor DoctorPerson { get; set; }
+
+		// FK_Patient_Person_BackReference
+		[Association(ThisKey="PersonID", OtherKey="PersonID", CanBeNull=true)]
+		public patient PatientPerson { get; set; }
+	}
+
+	[TableName(Name="testidentity")]
+	public partial class testidentity
+	{
+		[Identity, PrimaryKey(1), Required] public int ID { get; set; } // int(10)
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/Templates/MySqlDataModel.tt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+<#@ template language="C#" debug="True" hostspecific="True" #>
+<#@ output extension=".generated.cs" #>
+<#@ assembly name="$(SolutionDir)\packages\MySql.Data.6.6.4\lib\Net40\MySql.Data.dll" #>
+<#@ include file="$(SolutionDir)\Source\Templates\BLToolkit.ttinclude" #>
+<#@ include file="$(SolutionDir)\Source\Templates\MySql.ttinclude"     #>
+<#@ include file="$(SolutionDir)\Source\Templates\ValidationAttributes.ttinclude" #>
+<#
+	GetConnectionObject = () => new MySql.Data.MySqlClient.MySqlConnection();
+	ConnectionString    = "Server=DBHost;Port=3306;Database=testdata;Uid=root;Pwd=TestPassword;charset=utf8;";
+
+	DataContextName     = "MySqlDataContext";
+	Namespace           = "MySqlDataModel";
+
+	GenerateModel();
+#>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/Templates/PostgreSQLDataModel.generated.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,165 @@
+//---------------------------------------------------------------------------------------------------
+// <auto-generated>
+//    This code was generated by BLToolkit template for T4.
+//    Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
+// </auto-generated>
+//---------------------------------------------------------------------------------------------------
+using System;
+
+using BLToolkit.Data;
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+using BLToolkit.Validation;
+
+using NpgsqlTypes;
+
+namespace PostgreSqlDataModel
+{
+	public partial class PostgreSqlDataContext : DbManager
+	{
+		public Table<alltypes>      alltypes      { get { return this.GetTable<alltypes>();      } }
+		public Table<Child>         Child         { get { return this.GetTable<Child>();         } }
+		public Table<Doctor>        Doctor        { get { return this.GetTable<Doctor>();        } }
+		public Table<entity>        entity        { get { return this.GetTable<entity>();        } }
+		public Table<GrandChild>    GrandChild    { get { return this.GetTable<GrandChild>();    } }
+		public Table<LinqDataTypes> LinqDataTypes { get { return this.GetTable<LinqDataTypes>(); } }
+		public Table<Parent>        Parent        { get { return this.GetTable<Parent>();        } }
+		public Table<Patient>       Patient       { get { return this.GetTable<Patient>();       } }
+		public Table<Person>        Person        { get { return this.GetTable<Person>();        } }
+		public Table<SequenceTest1> SequenceTest1 { get { return this.GetTable<SequenceTest1>(); } }
+		public Table<SequenceTest2> SequenceTest2 { get { return this.GetTable<SequenceTest2>(); } }
+		public Table<SequenceTest3> SequenceTest3 { get { return this.GetTable<SequenceTest3>(); } }
+		public Table<TestIdentity>  TestIdentity  { get { return this.GetTable<TestIdentity>();  } }
+	}
+
+	[TableName(Owner="public", Name="alltypes")]
+	public partial class alltypes
+	{
+		[Identity, PrimaryKey(1), Required] public Int32             id                  { get; set; } // integer
+		[Nullable                         ] public Int64?            bigintdatatype      { get; set; } // bigint
+		[Nullable                         ] public Decimal?          numericdatatype     { get; set; } // numeric
+		[Nullable                         ] public Int16?            smallintdatatype    { get; set; } // smallint
+		[Nullable                         ] public Int32?            intdatatype         { get; set; } // integer
+		[Nullable                         ] public Decimal?          moneydatatype       { get; set; } // money
+		[Nullable                         ] public Double?           doubledatatype      { get; set; } // double precision
+		[Nullable                         ] public Single?           realdatatype        { get; set; } // real
+		[Nullable                         ] public DateTime?         timestampdatatype   { get; set; } // timestamp without time zone
+		[Nullable                         ] public DateTime?         timestamptzdatatype { get; set; } // timestamp with time zone
+		[Nullable                         ] public DateTime?         datedatatype        { get; set; } // date
+		[Nullable                         ] public DateTime?         timedatatype        { get; set; } // time without time zone
+		[Nullable                         ] public DateTime?         timetzdatatype      { get; set; } // time with time zone
+		[Nullable                         ] public NpgsqlInterval?   intervaldatatype    { get; set; } // interval
+		[                         Required] public String            chardatatype        { get; set; } // character(1)(1)
+		[                         Required] public String            varchardatatype     { get; set; } // character varying(20)(20)
+		[                         Required] public String            textdatatype        { get; set; } // text
+		[                         Required] public Byte[]            binarydatatype      { get; set; } // bytea
+		[Nullable                         ] public Guid?             uuiddatatype        { get; set; } // uuid
+		[Nullable                         ] public BitString?        bitdatatype         { get; set; } // bit(3)(3)
+		[Nullable                         ] public Boolean?          booleandatatype     { get; set; } // boolean
+		[Nullable                         ] public object            colordatatype       { get; set; } // color
+		[Nullable                         ] public NpgsqlPoint?      pointdatatype       { get; set; } // point
+		[Nullable                         ] public NpgsqlLSeg?       lsegdatatype        { get; set; } // lseg
+		[Nullable                         ] public NpgsqlBox?        boxdatatype         { get; set; } // box
+		[Nullable                         ] public NpgsqlPath?       pathdatatype        { get; set; } // path
+		[Nullable                         ] public NpgsqlPolygon?    polygondatatype     { get; set; } // polygon
+		[Nullable                         ] public NpgsqlCircle?     circledatatype      { get; set; } // circle
+		[Nullable                         ] public NpgsqlInet?       inetdatatype        { get; set; } // inet
+		[Nullable                         ] public NpgsqlMacAddress? macaddrdatatype     { get; set; } // macaddr
+		[Nullable                         ] public String            xmldatatype         { get; set; } // xml
+	}
+
+	[TableName(Owner="public", Name="Child")]
+	public partial class Child
+	{
+		[Nullable] public Int32? ParentID { get; set; } // integer
+		[Nullable] public Int32? ChildID  { get; set; } // integer
+	}
+
+	[TableName(Owner="public", Name="Doctor")]
+	public partial class Doctor
+	{
+		[Required] public Int32  PersonID { get; set; } // integer
+		[Required] public String Taxonomy { get; set; } // character varying(50)(50)
+	}
+
+	[TableName(Owner="public", Name="entity")]
+	public partial class entity
+	{
+		[Required] public String the_name { get; set; } // character varying(255)(255)
+	}
+
+	[TableName(Owner="public", Name="GrandChild")]
+	public partial class GrandChild
+	{
+		[Nullable] public Int32? ParentID     { get; set; } // integer
+		[Nullable] public Int32? ChildID      { get; set; } // integer
+		[Nullable] public Int32? GrandChildID { get; set; } // integer
+	}
+
+	[TableName(Owner="public", Name="LinqDataTypes")]
+	public partial class LinqDataTypes
+	{
+		[Nullable          ] public Int32?    ID             { get; set; } // integer
+		[Nullable          ] public Decimal?  MoneyValue     { get; set; } // numeric(10,4)(10)(4)
+		[Nullable          ] public DateTime? DateTimeValue  { get; set; } // timestamp without time zone
+		[Nullable          ] public DateTime? DateTimeValue2 { get; set; } // timestamp without time zone
+		[Nullable          ] public Boolean?  BoolValue      { get; set; } // boolean
+		[Nullable          ] public Guid?     GuidValue      { get; set; } // uuid
+		[          Required] public Byte[]    BinaryValue    { get; set; } // bytea
+		[Nullable          ] public Int16?    SmallIntValue  { get; set; } // smallint
+		[Nullable          ] public Int32?    IntValue       { get; set; } // integer
+		[Nullable          ] public Int64?    BigIntValue    { get; set; } // bigint
+	}
+
+	[TableName(Owner="public", Name="Parent")]
+	public partial class Parent
+	{
+		[Nullable] public Int32? ParentID { get; set; } // integer
+		[Nullable] public Int32? Value1   { get; set; } // integer
+	}
+
+	[TableName(Owner="public", Name="Patient")]
+	public partial class Patient
+	{
+		[Required] public Int32  PersonID  { get; set; } // integer
+		[Required] public String Diagnosis { get; set; } // character varying(256)(256)
+	}
+
+	[TableName(Owner="public", Name="Person")]
+	public partial class Person
+	{
+		[Identity, PrimaryKey(1), Required] public Int32  PersonID   { get; set; } // integer
+		[                         Required] public String FirstName  { get; set; } // character varying(50)(50)
+		[                         Required] public String LastName   { get; set; } // character varying(50)(50)
+		[                         Required] public String MiddleName { get; set; } // character varying(50)(50)
+		[                         Required] public String Gender     { get; set; } // character(1)(1)
+	}
+
+	[TableName(Owner="public", Name="SequenceTest1")]
+	public partial class SequenceTest1
+	{
+		[PrimaryKey(1), Required] public Int32  ID    { get; set; } // integer
+		[               Required] public String Value { get; set; } // character varying(50)(50)
+	}
+
+	[TableName(Owner="public", Name="SequenceTest2")]
+	public partial class SequenceTest2
+	{
+		[Identity, PrimaryKey(1), Required] public Int32  ID    { get; set; } // integer
+		[                         Required] public String Value { get; set; } // character varying(50)(50)
+	}
+
+	[TableName(Owner="public", Name="SequenceTest3")]
+	public partial class SequenceTest3
+	{
+		[Identity, PrimaryKey(1), Required] public Int32  ID    { get; set; } // integer
+		[                         Required] public String Value { get; set; } // character varying(50)(50)
+	}
+
+	[TableName(Owner="public", Name="TestIdentity")]
+	public partial class TestIdentity
+	{
+		[Identity, PrimaryKey(1), Required] public Int32 ID { get; set; } // integer
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/Templates/PostgreSQLDataModel.tt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+<#@ template language="C#" debug="True" hostspecific="True" #>
+<#@ output extension=".generated.cs" #>
+<#@ assembly name="$(SolutionDir)\packages\Npgsql.2.0.12.1\lib\Net40\Npgsql.dll"  #>
+<#@ include file="$(SolutionDir)\Source\Templates\BLToolkit.ttinclude"            #>
+<#@ include file="$(SolutionDir)\Source\Templates\PostgreSql.ttinclude"           #>
+<#@ include file="$(SolutionDir)\Source\Templates\ValidationAttributes.ttinclude" #>
+<#
+	GetConnectionObject = () => new Npgsql.NpgsqlConnection();
+	ConnectionString    = "Server=DBHost;Port=5432;Database=TestData;User Id=postgres;Password=TestPassword;";
+
+	DataContextName     = "PostgreSqlDataContext";
+	Namespace           = "PostgreSqlDataModel";
+
+	GenerateModel();
+#>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/Templates/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Templates")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("Templates")]
+[assembly: AssemblyCopyright("\xA9 2002-2012 www.bltoolkit.net")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("a6378835-de00-495e-ab62-640cf33414ea")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/Templates/SybaseDataModel.generated.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,175 @@
+//---------------------------------------------------------------------------------------------------
+// <auto-generated>
+//    This code was generated by BLToolkit template for T4.
+//    Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
+// </auto-generated>
+//---------------------------------------------------------------------------------------------------
+using System;
+
+using BLToolkit.Data;
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+using BLToolkit.Validation;
+
+namespace SybaseDataModel
+{
+	public partial class SybaseDataContext : DbManager
+	{
+		public Table<BinaryData>      BinaryData      { get { return this.GetTable<BinaryData>();      } }
+		public Table<Child>           Child           { get { return this.GetTable<Child>();           } }
+		public Table<DataTypeTest>    DataTypeTest    { get { return this.GetTable<DataTypeTest>();    } }
+		public Table<Doctor>          Doctor          { get { return this.GetTable<Doctor>();          } }
+		public Table<GrandChild>      GrandChild      { get { return this.GetTable<GrandChild>();      } }
+		public Table<LinqDataTypes>   LinqDataTypes   { get { return this.GetTable<LinqDataTypes>();   } }
+		public Table<Parent>          Parent          { get { return this.GetTable<Parent>();          } }
+		public Table<Patient>         Patient         { get { return this.GetTable<Patient>();         } }
+		public Table<Person>          Person          { get { return this.GetTable<Person>();          } }
+		public Table<sysquerymetrics> sysquerymetrics { get { return this.GetTable<sysquerymetrics>(); } }
+		public Table<TestIdentity>    TestIdentity    { get { return this.GetTable<TestIdentity>();    } }
+	}
+
+	[TableName(Name="BinaryData")]
+	public partial class BinaryData
+	{
+		[Identity, PrimaryKey(1), Required] public int    BinaryDataID { get; set; } // int(4)
+		[                         Required] public byte[] Stamp        { get; set; } // timestamp(8)
+		[                         Required] public byte[] Data         { get; set; } // varbinary(1024)
+	}
+
+	[TableName(Name="Child")]
+	public partial class Child
+	{
+		[Required] public int ParentID { get; set; } // int(4)
+		[Required] public int ChildID  { get; set; } // int(4)
+	}
+
+	[TableName(Name="DataTypeTest")]
+	public partial class DataTypeTest
+	{
+		[Identity, PrimaryKey(1), Required       ] public int       DataTypeID { get; set; } // int(4)
+		[Nullable                                ] public byte[]    Binary_    { get; set; } // binary(50)
+		[                         Required       ] public bool      Boolean_   { get; set; } // bit(1)
+		[Nullable                                ] public byte?     Byte_      { get; set; } // tinyint(1)
+		[Nullable                                ] public byte[]    Bytes_     { get; set; } // varbinary(50)
+		[Nullable                                ] public char?     Char_      { get; set; } // char(1)
+		[Nullable                                ] public DateTime? DateTime_  { get; set; } // datetime(8)
+		[Nullable                                ] public decimal?  Decimal_   { get; set; } // decimal(10)(20,2)
+		[Nullable                                ] public double?   Double_    { get; set; } // float(8)
+		[Nullable                                ] public byte[]    Guid_      { get; set; } // varbinary(16)
+		[Nullable                                ] public short?    Int16_     { get; set; } // smallint(2)
+		[Nullable                                ] public int?      Int32_     { get; set; } // int(4)
+		[Nullable                                ] public long?     Int64_     { get; set; } // bigint(8)
+		[Nullable                                ] public decimal?  Money_     { get; set; } // money(8)
+		[Nullable                                ] public byte?     SByte_     { get; set; } // tinyint(1)
+		[Nullable                                ] public float?    Single_    { get; set; } // real(4)
+		[Nullable                                ] public byte[]    Stream_    { get; set; } // varbinary(50)
+		[Nullable,                MaxLength(  50)] public string    String_    { get; set; } // nvarchar(50)
+		[Nullable                                ] public short?    UInt16_    { get; set; } // smallint(2)
+		[Nullable                                ] public int?      UInt32_    { get; set; } // int(4)
+		[Nullable                                ] public long?     UInt64_    { get; set; } // bigint(8)
+		[Nullable,                MaxLength(1000)] public string    Xml_       { get; set; } // nvarchar(1000)
+	}
+
+	[TableName(Name="Doctor")]
+	public partial class Doctor
+	{
+		[PrimaryKey(1), Required               ] public int    PersonID { get; set; } // int(4)
+		[               MaxLength(50), Required] public string Taxonomy { get; set; } // nvarchar(50)
+
+		// FK_Doctor_Person
+		[Association(ThisKey="PersonID", OtherKey="PersonID", CanBeNull=false)]
+		public Person Person { get; set; }
+	}
+
+	[TableName(Name="GrandChild")]
+	public partial class GrandChild
+	{
+		[Required] public int ParentID     { get; set; } // int(4)
+		[Required] public int ChildID      { get; set; } // int(4)
+		[Required] public int GrandChildID { get; set; } // int(4)
+	}
+
+	[TableName(Name="LinqDataTypes")]
+	public partial class LinqDataTypes
+	{
+		[          Required     ] public int       ID             { get; set; } // int(4)
+		[Nullable               ] public decimal?  MoneyValue     { get; set; } // decimal(6)(10,4)
+		[Nullable               ] public DateTime? DateTimeValue  { get; set; } // datetime(8)
+		[Nullable               ] public DateTime? DateTimeValue2 { get; set; } // datetime(8)
+		[          Required     ] public bool      BoolValue      { get; set; } // bit(1)
+		[Nullable, MaxLength(36)] public string    GuidValue      { get; set; } // char(36)
+		[Nullable               ] public byte[]    BinaryValue    { get; set; } // binary(500)
+		[Nullable               ] public short?    SmallIntValue  { get; set; } // smallint(2)
+		[Nullable               ] public int?      IntValue       { get; set; } // int(4)
+		[Nullable               ] public long?     BigIntValue    { get; set; } // bigint(8)
+	}
+
+	[TableName(Name="Parent")]
+	public partial class Parent
+	{
+		[          Required] public int  ParentID { get; set; } // int(4)
+		[Nullable          ] public int? Value1   { get; set; } // int(4)
+	}
+
+	[TableName(Name="Patient")]
+	public partial class Patient
+	{
+		[PrimaryKey(1), Required                ] public int    PersonID  { get; set; } // int(4)
+		[               MaxLength(256), Required] public string Diagnosis { get; set; } // nvarchar(256)
+
+		// FK_Patient_Person
+		[Association(ThisKey="PersonID", OtherKey="PersonID", CanBeNull=false)]
+		public Person Person { get; set; }
+	}
+
+	[TableName(Name="Person")]
+	public partial class Person
+	{
+		[Identity, PrimaryKey(1), Required               ] public int    PersonID   { get; set; } // int(4)
+		[                         MaxLength(50), Required] public string FirstName  { get; set; } // nvarchar(50)
+		[                         MaxLength(50), Required] public string LastName   { get; set; } // nvarchar(50)
+		[Nullable,                MaxLength(50)          ] public string MiddleName { get; set; } // nvarchar(50)
+		[                         Required               ] public char   Gender     { get; set; } // char(1)
+
+		// FK_Doctor_Person_BackReference
+		[Association(ThisKey="PersonID", OtherKey="PersonID", CanBeNull=true)]
+		public Doctor Doctor { get; set; }
+
+		// FK_Patient_Person_BackReference
+		[Association(ThisKey="PersonID", OtherKey="PersonID", CanBeNull=true)]
+		public Patient Patient { get; set; }
+	}
+
+	// View
+	[TableName(Name="sysquerymetrics")]
+	public partial class sysquerymetrics
+	{
+		[          Required      ] public int    uid       { get; set; } // int(4)
+		[          Required      ] public int    gid       { get; set; } // int(4)
+		[          Required      ] public int    hashkey   { get; set; } // int(4)
+		[          Required      ] public int    id        { get; set; } // int(4)
+		[          Required      ] public short  sequence  { get; set; } // smallint(2)
+		[Nullable                ] public int?   exec_min  { get; set; } // int(4)
+		[Nullable                ] public int?   exec_max  { get; set; } // int(4)
+		[Nullable                ] public int?   exec_avg  { get; set; } // int(4)
+		[Nullable                ] public int?   elap_min  { get; set; } // int(4)
+		[Nullable                ] public int?   elap_max  { get; set; } // int(4)
+		[Nullable                ] public int?   elap_avg  { get; set; } // int(4)
+		[Nullable                ] public int?   lio_min   { get; set; } // int(4)
+		[Nullable                ] public int?   lio_max   { get; set; } // int(4)
+		[Nullable                ] public int?   lio_avg   { get; set; } // int(4)
+		[Nullable                ] public int?   pio_min   { get; set; } // int(4)
+		[Nullable                ] public int?   pio_max   { get; set; } // int(4)
+		[Nullable                ] public int?   pio_avg   { get; set; } // int(4)
+		[Nullable                ] public int?   cnt       { get; set; } // int(4)
+		[Nullable                ] public int?   abort_cnt { get; set; } // int(4)
+		[Nullable, MaxLength(255)] public string qtext     { get; set; } // varchar(255)
+	}
+
+	[TableName(Name="TestIdentity")]
+	public partial class TestIdentity
+	{
+		[Identity, PrimaryKey(1), Required] public int ID { get; set; } // int(4)
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/Templates/SybaseDataModel.tt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+<#@ template language="C#" debug="True" hostspecific="True" #>
+<#@ output extension=".generated.cs" #>
+<#@ assembly name="$(SolutionDir)\Redist\Sybase\Sybase.AdoNet2.AseClient.dll" #>
+<#@ include file="$(SolutionDir)\Source\Templates\BLToolkit.ttinclude" #>
+<#@ include file="$(SolutionDir)\Source\Templates\Sybase.ttinclude"    #>
+<#@ include file="$(SolutionDir)\Source\Templates\ValidationAttributes.ttinclude" #>
+<#
+	GetConnectionObject = () => new Sybase.Data.AseClient.AseConnection();
+	ConnectionString    = "Data Source=DBHost2008;Port=5000;Database=TestData;Uid=sa;Password=TestPassword";
+
+	DataContextName     = "SybaseDataContext";
+	Namespace           = "SybaseDataModel";
+
+	GenerateModel();
+#>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/Templates/Templates.2008.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Templates</RootNamespace>
+    <AssemblyName>Templates</AssemblyName>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Npgsql, Version=2.0.12.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\Npgsql.2.0.12.1\lib\net35\Npgsql.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Runtime.Serialization">
+      <RequiredTargetFramework>3.0</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="MSSqlDataModel.generated.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>MSSqlDataModel.tt</DependentUpon>
+    </Compile>
+    <Compile Include="PostgreSQLDataModel.generated.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>PostgreSQLDataModel.tt</DependentUpon>
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="SybaseDataModel.generated.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>SybaseDataModel.tt</DependentUpon>
+      <SubType>Component</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\..\Source\Templates\BLT4Toolkit.ttinclude">
+      <Link>BLT4Toolkit.ttinclude</Link>
+    </None>
+    <None Include="..\..\Source\Templates\BLToolkit.ttinclude">
+      <Link>BLToolkit.ttinclude</Link>
+    </None>
+    <None Include="..\..\Source\Templates\MSSQL.ttinclude">
+      <Link>MSSQL.ttinclude</Link>
+    </None>
+    <None Include="..\..\Source\Templates\PluralSingular.ttinclude">
+      <Link>PluralSingular.ttinclude</Link>
+    </None>
+    <None Include="..\..\Source\Templates\PostgreSQL.ttinclude">
+      <Link>PostgreSQL.ttinclude</Link>
+    </None>
+    <None Include="..\..\Source\Templates\Sybase.ttinclude">
+      <Link>Sybase.ttinclude</Link>
+    </None>
+    <None Include="..\..\Source\Templates\WCFAttributes.ttinclude">
+      <Link>WCFAttributes.ttinclude</Link>
+    </None>
+    <None Include="PostgreSQLDataModel.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>PostgreSQLDataModel.generated.cs</LastGenOutput>
+      <CustomToolNamespace>Templates.PostgreSQL</CustomToolNamespace>
+    </None>
+    <None Include="SybaseDataModel.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>SybaseDataModel.generated.cs</LastGenOutput>
+      <CustomToolNamespace>Templates.Sybase</CustomToolNamespace>
+    </None>
+    <None Include="MSSqlDataModel.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>MSSqlDataModel.generated.cs</LastGenOutput>
+      <CustomToolNamespace>Templates.MSSql</CustomToolNamespace>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.3.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/Templates/Templates.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{6E0C5565-F9A3-441C-9CB2-8B1878A800EF}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Templates</RootNamespace>
+    <AssemblyName>Templates</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <TargetFrameworkProfile />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\Templates.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\Templates.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Mono.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\Npgsql.2.0.14.3\lib\net40\Mono.Security.dll</HintPath>
+    </Reference>
+    <Reference Include="Npgsql, Version=2.0.14.3, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\Npgsql.2.0.14.3\lib\net40\Npgsql.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="MySqlDataModel.generated.cs">
+      <DependentUpon>MySqlDataModel.tt</DependentUpon>
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="MSSqlDataModel.generated.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>MSSqlDataModel.tt</DependentUpon>
+    </Compile>
+    <Compile Include="PostgreSQLDataModel.generated.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>PostgreSQLDataModel.tt</DependentUpon>
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="SybaseDataModel.generated.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>SybaseDataModel.tt</DependentUpon>
+      <SubType>Component</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
+    <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="MySqlDataModel.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>MySqlDataModel.generated.cs</LastGenOutput>
+    </None>
+    <None Include="MSSqlDataModel.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>MSSqlDataModel.generated.cs</LastGenOutput>
+    </None>
+    <None Include="packages.config" />
+    <None Include="PostgreSQLDataModel.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>PostgreSQLDataModel.generated.cs</LastGenOutput>
+    </None>
+    <None Include="SybaseDataModel.tt">
+      <Generator>TextTemplatingFileGenerator</Generator>
+      <LastGenOutput>SybaseDataModel.generated.cs</LastGenOutput>
+    </None>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tools/Templates/packages.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="Npgsql" version="2.0.14.3" targetFramework="net40" />
+</packages>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/All/App.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<configuration>
+	<connectionStrings>
+		<add name="DemoConnection" connectionString="Server=.;Database=BLToolkitData;Integrated Security=SSPI" providerName="System.Data.SqlClient"/>
+	</connectionStrings>
+	<appSettings>
+		<!-- Default configuration -->
+		<add key="ConnectionString" value="Server=.;Database=BLToolkitData;Integrated Security=SSPI"/>
+		<!-- SQL Server Development configuration -->
+		<add key="ConnectionString.Development" value="Server=.;Database=BLToolkitData;Integrated Security=SSPI"/>
+		<!-- SQL Server Production configuration -->
+		<add key="ConnectionString.Production" value="Server=.;Database=BLToolkitData;Integrated Security=SSPI"/>
+		<!-- SQL Server configuration -->
+		<add key="ConnectionString.Sql" value="Server=.;Database=BLToolkitData;Integrated Security=SSPI"/>
+		<!-- OLEDB configuration -->
+		<add key="ConnectionString.OleDb" value="Provider=SQLOLEDB;Data Source=.;Integrated Security=SSPI;Initial Catalog=BLToolkitData"/>
+		<!-- OLEDB Development configuration -->
+		<add key="ConnectionString.OleDb.Development" value="Provider=SQLOLEDB;Data Source=.;Integrated Security=SSPI;Initial Catalog=BLToolkitData"/>
+		<!-- OLEDB Production configuration -->
+		<add key="ConnectionString.OleDb.Production" value="Provider=SQLOLEDB;Data Source=.;Integrated Security=SSPI;Initial Catalog=BLToolkitData"/>
+	</appSettings>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/All/GetValueTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,44 @@
+using System;
+
+using BLToolkit.Aspects;
+
+using NUnit.Framework;
+
+namespace UnitTests.All
+{
+	//[TestFixture]
+	public class GetValueTest
+	{
+		[ExpectedException(typeof(ApplicationException))]
+		public void Test()
+		{
+			try
+			{
+				var info = new InterceptCallInfo();
+
+				info.ParameterValues = new object[2];
+				info.ParameterValues[0] = "123";
+				info.ParameterValues[1] = 123;
+
+				throw new ApplicationException();
+			}
+			catch (Exception ex)
+			{
+				Console.WriteLine(ex);
+				Console.WriteLine(ex);
+				throw;
+			}
+		}
+
+		public void Test(out int i3, out decimal d4)
+		{
+			object o = (decimal)123;
+
+			d4 = (decimal)o;
+
+			o = (int)123;
+
+			i3 = (int)o;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/All/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+using System.Reflection;
+
+[assembly: AssemblyTitle("UnitTests.All")]
+[assembly: AssemblyDescription("Business Logic Toolkit unit tests")]
+[assembly: AssemblyProduct("Business Logic Toolkit")]
+[assembly: AssemblyCopyright("\xA9 2002-2012 www.bltoolkit.net")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/All/UnitTests.All.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{6AE74A35-B337-4B17-8092-E1B98DEF06AF}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>UnitTests.All</RootNamespace>
+    <AssemblyName>UnitTests.All</AssemblyName>
+    <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\UnitTests.All.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\UnitTests.All.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework, Version=2.6.3.13283, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\NUnit.2.6.3\lib\nunit.framework.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="GetValueTest.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\CS\UnitTests.CS.csproj">
+      <Project>{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}</Project>
+      <Name>UnitTests.CS</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+    <None Include="packages.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PostBuildEvent>copy "$(ProjectDir)App.config" "$(ProjectDir)$(OutDir)"
+copy "$(ProjectDir)App.config" "$(ProjectDir)$(OutDir)UnitTests.CS.dll.config"
+copy "$(ProjectDir)App.config" "$(ProjectDir)$(OutDir)HowTo.dll.config"</PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/All/packages.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="NUnit" version="2.6.3" targetFramework="net40" />
+</packages>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/BLToolkit.Linq.nunit	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+<NUnitProject>
+	<Settings activeconfig="Debug" />
+	<Config name="Debug" configfile="Linq\App.config" binpathtype="Auto">
+		<assembly path="Linq\bin\Debug\UnitTests.Linq.dll" />
+	</Config>
+	<Config name="Release" configfile="Linq\App.config" binpathtype="Auto">
+		<assembly path="Linq\bin\Release\UnitTests.Linq.dll" />
+	</Config>
+</NUnitProject>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/BLToolkit.nunit	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+<NUnitProject>
+	<Settings activeconfig="Release" />
+	<Config name="Debug" configfile="All\App.config" binpathtype="Auto">
+		<assembly path="All\bin\Debug\HowTo.dll" />
+		<assembly path="All\bin\Debug\UnitTests.CS.dll" />
+		<assembly path="All\bin\Debug\Examples.CS.dll" />
+		<assembly path="All\bin\Debug\Examples.VB.dll" />
+	</Config>
+	<Config name="Release" configfile="All\App.config" binpathtype="Auto">
+		<assembly path="All\bin\Release\HowTo.dll" />
+		<assembly path="All\bin\Release\UnitTests.CS.dll" />
+		<assembly path="All\bin\Release\Examples.CS.dll" />
+		<assembly path="All\bin\Release\Examples.VB.dll" />
+	</Config>
+</NUnitProject>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Aspects/AsyncAndDataAccessorTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,32 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Aspects;
+using BLToolkit.DataAccess;
+using BLToolkit.Reflection;
+
+namespace Aspects
+{
+	[TestFixture]
+	public class AsyncAndDataAccessorTest
+	{
+		public abstract class TestObject : DataAccessor
+		{
+			[SqlQuery("SELECT @intVal")]
+			public abstract int Test(int @intVal);
+
+			[Async] public abstract IAsyncResult BeginTest(int intVal);
+			[Async] public abstract int          EndTest(IAsyncResult asyncResult);
+		}
+
+		[Test]
+		public void Test()
+		{
+			TestObject o = TypeAccessor<TestObject>.CreateInstance();
+
+			IAsyncResult ar = o.BeginTest(42);
+			Assert.AreEqual(42, o.EndTest(ar));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Aspects/AsyncAspectTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,125 @@
+using System;
+using System.Diagnostics;
+
+using NUnit.Framework;
+
+using BLToolkit.Aspects;
+using BLToolkit.Reflection;
+
+namespace Aspects
+{
+	[TestFixture]
+	public class AsyncAspectTest
+	{
+		private const int ExecutionTime = 200;
+
+		public abstract class TestObject
+		{
+			public int Test(int intVal, string strVal)
+			{
+				System.Threading.Thread.Sleep(ExecutionTime + 30);
+				return intVal;
+			}
+
+			[Async] public abstract IAsyncResult BeginTest(int intVal, string strVal);
+			[Async] public abstract IAsyncResult BeginTest(int intVal, string strVal, AsyncCallback callback);
+			[Async] public abstract IAsyncResult BeginTest(int intVal, string strVal, AsyncCallback callback, object state);
+			[Async] public abstract int EndTest(IAsyncResult asyncResult);
+
+			[Async("Test")]
+			public abstract IAsyncResult AnyName(int intVal, string strVal, AsyncCallback callback, object state);
+			[Async("Test", typeof(int), typeof(string))]
+			public abstract int AnyName(IAsyncResult asyncResult);
+		}
+
+		public abstract class TestObject<T>
+		{
+			public T Test(T intVal)
+			{
+				System.Threading.Thread.Sleep(ExecutionTime + 30);
+				return intVal;
+			}
+
+			[Async] public abstract IAsyncResult BeginTest(T intVal);
+			[Async] public abstract T EndTest(IAsyncResult asyncResult);
+		}
+
+		[Test]
+		public void AsyncTest()
+		{
+			var o = TypeAccessor<TestObject>.CreateInstanceEx();
+			var sw = Stopwatch.StartNew();
+
+			Assert.AreEqual(1, o.Test(1, null));
+			var mss = sw.ElapsedMilliseconds;
+			Assert.IsTrue(mss >= ExecutionTime);
+
+			sw.Reset();
+			sw.Start();
+
+			var ar = o.BeginTest(2, "12");
+			mss = sw.ElapsedMilliseconds;
+			Assert.IsTrue(mss <= ExecutionTime);
+
+			Assert.AreEqual(2, o.EndTest(ar));
+			mss = sw.ElapsedMilliseconds;
+			Assert.IsTrue(mss >= ExecutionTime);
+		}
+
+		[Test]
+		public void GenericTest()
+		{
+			var o   = TypeAccessor<TestObject<DateTime>>.CreateInstanceEx();
+			var now = DateTime.Now;
+			var ar  = o.BeginTest(now);
+
+			Assert.AreEqual(now, o.EndTest(ar));
+		}
+
+		private static void CallBack(IAsyncResult ar)
+		{
+			var o = (TestObject) ar.AsyncState;
+			Console.WriteLine("Callback");
+			o.EndTest(ar);
+		}
+
+		[Test]
+		public void CallbackTest()
+		{
+			var o = TypeAccessor<TestObject>.CreateInstanceEx();
+
+			o.BeginTest(2, null, CallBack, o);
+		}
+
+		[Test]
+		public void NoStateTest()
+		{
+			var o = TypeAccessor<TestObject>.CreateInstanceEx();
+
+			Assert.AreEqual(1, o.Test(1, null));
+
+			var ar = o.BeginTest(2, null, null);
+			Assert.AreEqual(2, o.EndTest(ar));
+		}
+
+		[Test]
+		public void NoCallbackTest()
+		{
+			var o = TypeAccessor<TestObject>.CreateInstanceEx();
+
+			Assert.AreEqual(1, o.Test(1, null));
+
+			var ar = o.BeginTest(2, "1234");
+			Assert.AreEqual(2, o.EndTest(ar));
+		}
+
+		[Test]
+		public void AnyNameTest()
+		{
+			var o = TypeAccessor<TestObject>.CreateInstanceEx();
+
+			var ar = o.AnyName(2, null, null, null);
+			Assert.AreEqual(2, o.AnyName(ar));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Aspects/CacheAspectTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,157 @@
+using System;
+using System.Collections;
+using BLToolkit.Aspects;
+using BLToolkit.Reflection;
+
+using NUnit.Framework;
+
+namespace Aspects
+{
+	[TestFixture]
+	public class CacheAspectTest
+	{
+		[Log]
+		public abstract class TestClass
+		{
+			public static int Value;
+
+			[Cache(500, false)]
+			public virtual int Test(int i1, int i2)
+			{
+				return Value;
+			}
+
+			[InstanceCache]
+			public virtual int InstanceTest(int i1, int i2)
+			{
+				return Value;
+			}
+		}
+
+		[Test]
+		public void Test()
+		{
+			TestClass t = TypeAccessor.CreateInstance<TestClass>();
+
+			DateTime begin = DateTime.Now;
+
+			for (TestClass.Value = 777; t.Test(2, 2) == 777; TestClass.Value++)
+				continue;
+
+			Assert.IsTrue((DateTime.Now - begin).TotalMilliseconds >= 500);
+
+			TestClass.Value = 1; Assert.AreEqual(1, t.Test(1, 1));
+			TestClass.Value = 2; Assert.AreEqual(1, t.Test(1, 1));
+			TestClass.Value = 3; Assert.AreEqual(3, t.Test(2, 1));
+
+			CacheAspect.ClearCache(typeof(TestClass), "Test", typeof(int), typeof(int));
+			TestClass.Value = 4; Assert.AreEqual(4, t.Test(2, 1));
+
+			CacheAspect.ClearCache(t.GetType(), "Test", typeof(int), typeof(int));
+			TestClass.Value = 5; Assert.AreEqual(5, t.Test(2, 1));
+
+			CacheAspect.ClearCache();
+			TestClass.Value = 6; Assert.AreEqual(6, t.Test(2, 1));
+		}
+
+		[Test]
+		public void InstanceTest()
+		{
+			TestClass t = TypeAccessor.CreateInstance<TestClass>();
+
+			TestClass.Value = 1; Assert.AreEqual(1, t.InstanceTest(1, 1));
+			TestClass.Value = 2; Assert.AreEqual(1, t.InstanceTest(1, 1));
+			TestClass.Value = 3; Assert.AreEqual(3, t.InstanceTest(2, 1));
+			TestClass.Value = 4;
+
+			t = TypeAccessor.CreateInstance<TestClass>();
+
+			Assert.AreNotEqual(1, t.InstanceTest(1, 1));
+			Assert.AreNotEqual(3, t.InstanceTest(2, 1));
+		}
+
+		public class CustomCacheAspect : CacheAspect
+		{
+			private static IDictionary _methodcache = new Hashtable();
+			public  static IDictionary  MethodCache
+			{
+				get { return _methodcache; }
+			}
+
+			protected override IDictionary CreateCache()
+			{
+				return MethodCache;
+			}
+		}
+
+		[Log]
+		public abstract class CustomTestClass
+		{
+			public static int Value;
+
+			[Cache(typeof(CustomCacheAspect), MaxCacheTime = 500)]
+			public virtual int Test(int i1, int i2)
+			{
+				return Value;
+			}
+		}
+
+		[Test]
+		public void CustomCacheAspectTest()
+		{
+			CustomTestClass t = (CustomTestClass)TypeAccessor.CreateInstance(typeof(CustomTestClass));
+
+			CustomTestClass.Value = 1; Assert.AreEqual(1, t.Test(1, 1));
+			CustomTestClass.Value = 2; Assert.AreEqual(1, t.Test(1, 1));
+			CustomTestClass.Value = 3; Assert.AreEqual(3, t.Test(2, 1));
+
+			CustomCacheAspect.MethodCache.Clear();
+			CustomTestClass.Value = 4; Assert.AreEqual(4, t.Test(2, 1));
+		}
+
+		public abstract class GenericClass<T>
+			where T : new()
+		{
+			[Cache]
+			public virtual T GetT(int i)
+			{
+				return new T();
+			}
+		}
+
+		[Test]
+		public void GenericClassTest()
+		{
+			TypeAccessor<GenericClass<int>>.     CreateInstance().GetT(0);
+			TypeAccessor<GenericClass<DateTime>>.CreateInstance().GetT(0);
+		}
+
+		public abstract class TestClass1
+		{
+			[Cache]
+			public virtual T Get<T>()
+				where T : new()
+			{
+				return new T();
+			}
+
+			[Cache]
+			public virtual T Get<T>(int i)
+			{
+				if (typeof(T) == typeof(int)) return (T)(object)10;
+
+				return (T)(object)new DateTime();
+			}
+		}
+
+		//[Test]
+		public void GenericMethodTest()
+		{
+			var i = TypeAccessor<TestClass1>.CreateInstance().Get<int>     ();
+			var d = TypeAccessor<TestClass1>.CreateInstance().Get<DateTime>();
+
+			i = TypeAccessor<TestClass1>.CreateInstance().Get<int>     (0);
+			d = TypeAccessor<TestClass1>.CreateInstance().Get<DateTime>(0);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Aspects/ClearCacheAspect.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,199 @@
+using NUnit.Framework;
+
+using BLToolkit.Aspects;
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+
+namespace Aspects
+{
+	[TestFixture]
+	public class ClearCacheAspect
+	{
+		public abstract class TestClass
+		{
+			int _value;
+
+			[Cache]
+			public virtual int Test1()
+			{
+				return _value++;
+			}
+
+			[ClearCache("Test1")]
+			public abstract void ClearTest1();
+
+			[Cache]
+			public virtual int Test2()
+			{
+				return _value++;
+			}
+
+			[Cache]
+			public virtual int Test2(int i)
+			{
+				return _value++;
+			}
+
+			[ClearCache("Test2")]
+			public abstract void ClearTest2();
+
+			[ClearCache("Test2", typeof(int))]
+			public abstract void ClearTest2a();
+
+			[ClearCache("Test2"), ClearCache("Test2", typeof(int))]
+			public abstract void ClearTest2b();
+		}
+
+		public abstract class TestClass1
+		{
+			[ClearCache(typeof(TestClass), "Test2")]
+			public abstract void ClearTest();
+
+			[ClearCache(typeof(TestClass), "Test2", typeof(int))]
+			public abstract void ClearTest1();
+
+			protected abstract int Test();
+
+			[ClearCache("Test")]
+			public abstract void ClearTest3();
+
+			[ClearCache(typeof(TestClass))]
+			public abstract void ClearTest4();
+
+			[ClearCache]
+			public abstract void ClearTest5();
+		}
+
+		[Test]
+		public void Test1()
+		{
+			TestClass tc = TypeFactory.CreateInstance<TestClass>();
+
+			int value1 = tc.Test1();
+			int value2 = tc.Test1();
+
+			Assert.AreEqual(value1, value2);
+
+			tc.ClearTest1();
+
+			Assert.AreNotEqual(value1, tc.Test1());
+		}
+
+		[Test]
+		public void Test2()
+		{
+			TestClass tc = TypeFactory.CreateInstance<TestClass>();
+
+			tc.ClearTest2();
+
+			int value1 = tc.Test2();
+			int value2 = tc.Test2();
+
+			Assert.AreEqual(value1, value2);
+
+			tc.ClearTest2();
+
+			Assert.AreNotEqual(value1, tc.Test2());
+		}
+
+		[Test]
+		public void Test2a()
+		{
+			TestClass tc = TypeFactory.CreateInstance<TestClass>();
+
+			tc.ClearTest2a();
+
+			int value1 = tc.Test2(1);
+			int value2 = tc.Test2(1);
+
+			Assert.AreEqual(value1, value2);
+
+			tc.ClearTest2a();
+
+			Assert.AreNotEqual(value1, tc.Test2(1));
+		}
+
+		[Test]
+		public void Test2b()
+		{
+			TestClass tc = TypeFactory.CreateInstance<TestClass>();
+
+			tc.ClearTest2b();
+
+			int value1 = tc.Test2();
+			int value2 = tc.Test2();
+			int value3 = tc.Test2(1);
+			int value4 = tc.Test2(1);
+
+			Assert.AreEqual(value1, value2);
+			Assert.AreEqual(value3, value4);
+
+			tc.ClearTest2b();
+
+			Assert.AreNotEqual(value1, tc.Test2());
+			Assert.AreNotEqual(value3, tc.Test2(1));
+		}
+
+		[Test]
+		public void Test3()
+		{
+			TestClass  tc1 = TypeAccessor<TestClass>. CreateInstance();
+			TestClass1 tc2 = TypeAccessor<TestClass1>.CreateInstance();
+
+			tc1.ClearTest2b();
+
+			int value1 = tc1.Test2();
+			int value2 = tc1.Test2();
+			int value3 = tc1.Test2(1);
+			int value4 = tc1.Test2(1);
+
+			Assert.AreEqual(value1, value2);
+			Assert.AreEqual(value3, value4);
+
+			tc2.ClearTest();
+			tc2.ClearTest1();
+
+			Assert.AreNotEqual(value1, tc1.Test2());
+			Assert.AreNotEqual(value3, tc1.Test2(1));
+		}
+
+		[Test]
+		public void Test4()
+		{
+			TestClass1 tc = TypeAccessor<TestClass1>.CreateInstance();
+
+			tc.ClearTest3();
+		}
+
+		[Test]
+		public void Test5()
+		{
+			TestClass  tc1 = TypeAccessor<TestClass>. CreateInstance();
+			TestClass1 tc2 = TypeAccessor<TestClass1>.CreateInstance();
+
+			tc1.ClearTest2b();
+
+			int value1 = tc1.Test2();
+			int value2 = tc1.Test2();
+			int value3 = tc1.Test2(1);
+			int value4 = tc1.Test2(1);
+
+			Assert.AreEqual(value1, value2);
+			Assert.AreEqual(value3, value4);
+
+			tc2.ClearTest();
+			tc2.ClearTest4();
+
+			Assert.AreNotEqual(value1, tc1.Test2());
+			Assert.AreNotEqual(value3, tc1.Test2(1));
+		}
+
+		[Test]
+		public void Test6()
+		{
+			TestClass1 tc = TypeAccessor<TestClass1>.CreateInstance();
+
+			tc.ClearTest5();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Aspects/CounterAspectTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,89 @@
+using System;
+using System.Security.Principal;
+using System.Threading;
+
+using BLToolkit.Aspects;
+using BLToolkit.Reflection;
+
+using NUnit.Framework;
+
+namespace Aspects
+{
+	[TestFixture]
+	public class CounterAspectTest
+	{
+		[Log]
+		public abstract class TestClass
+		{
+			[Counter]
+			public virtual void Test()
+			{
+			}
+
+			[Counter]
+			public virtual void LongTest()
+			{
+				Thread.Sleep(100);
+			}
+		}
+
+		[Test]
+		public void Test()
+		{
+			TestClass t = (TestClass)TypeAccessor.CreateInstance(typeof(TestClass));
+
+			for (int i = 0; i < 10; i++)
+				t.Test();
+
+			MethodCallCounter counter = CounterAspect.GetCounter(typeof(TestClass).GetMethod("Test"));
+
+			Assert.AreEqual(10, counter.TotalCount);
+
+			Console.WriteLine(counter.TotalTime);
+
+			new Thread(new ThreadStart(t.LongTest)).Start();
+			Thread.Sleep(20);
+
+			lock (CounterAspect.Counters.SyncRoot) foreach (MethodCallCounter c in CounterAspect.Counters)
+			{
+				Console.WriteLine("{0}.{1,-10} | {2,2} | {3,2} | {4}",
+					c.MethodInfo.DeclaringType.Name,
+					c.MethodInfo.Name,
+					c.TotalCount,
+					c.CurrentCalls.Count,
+					c.TotalTime);
+
+				lock (c.CurrentCalls.SyncRoot) for (int i = 0; i < c.CurrentCalls.Count; i++)
+				{
+					InterceptCallInfo ci = (InterceptCallInfo)c.CurrentCalls[i];
+					IPrincipal        pr = ci.CurrentPrincipal;
+
+					Console.WriteLine("{0,15} | {1}",
+						pr == null? "***" : pr.Identity.Name,
+						DateTime.Now - ci.BeginCallTime);
+				}
+			}
+		}
+
+		public abstract class TestClass2
+		{
+			[Counter]
+			public virtual void Test()
+			{
+			}
+		}
+
+		[Test]
+		public void Test2()
+		{
+			// custom create counter delegate returns null
+			CounterAspect.CreateCounter = mi => null;
+
+			var t = (TestClass2)TypeAccessor.CreateInstance(typeof(TestClass2));
+
+			// interceptor should fallback to default counter implementation
+			t.Test();
+		}
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Aspects/InterceptorAspectTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,70 @@
+using System;
+using System.Reflection;
+
+using BLToolkit.Aspects;
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+using BLToolkit.TypeBuilder.Builders;
+
+using NUnit.Framework;
+
+namespace Aspects
+{
+	[TestFixture]
+	public class InterceptorAspectTest
+	{
+		public class TestInterceptor : IInterceptor
+		{
+			public void Init(CallMethodInfo info, string configString)
+			{
+			}
+
+			public void Intercept(InterceptCallInfo info)
+			{
+				if (info.CallMethodInfo.MethodInfo.ReturnType == typeof(int))
+					info.ReturnValue = 10;
+			}
+		}
+
+		[Interceptor(typeof(TestInterceptor), InterceptType.BeforeCall | InterceptType.OnCatch)]
+		public abstract class TestClass
+		{
+			public abstract int Test(int i1, ref int i2, out int i3, out decimal d4);
+
+			[NoInterception(typeof(TestInterceptor), InterceptType.BeforeCall | InterceptType.OnCatch)]
+			public abstract int TestNo();
+
+			public class PropInterceptor : Interceptor
+			{
+				protected override void BeforeCall(InterceptCallInfo info)
+				{
+					info.Items["ReturnValue"] = info.ReturnValue;
+				}
+
+				protected override void AfterCall(InterceptCallInfo info)
+				{
+					info.ReturnValue = (int)info.ReturnValue + (int)info.Items["ReturnValue"];
+				}
+			}
+
+			[Interceptor(
+				typeof(PropInterceptor), InterceptType.BeforeCall | InterceptType.AfterCall,
+				TypeBuilderConsts.Priority.Normal - 100)]
+			public virtual int Prop { get { return 50; } }
+		}
+
+		[Test]
+		public void Test()
+		{
+			TestClass t = (TestClass)TypeAccessor.CreateInstance(typeof(TestClass));
+
+			int     i2 = 2;
+			int     i3;
+			decimal d4;
+
+			Assert.AreEqual(10, t.Test(1, ref i2, out i3, out d4));
+			Assert.AreEqual(0,  t.TestNo());
+			Assert.AreEqual(60, t.Prop);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Aspects/LoggingAspectTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,48 @@
+using System;
+using System.Collections;
+
+using BLToolkit.Aspects;
+using BLToolkit.Reflection;
+
+using NUnit.Framework;
+
+namespace Aspects
+{
+	[TestFixture]
+	public class LoggingAspectTest
+	{
+		[Log]
+		public abstract class TestClass
+		{
+			public abstract int Test();
+
+			[Log("LogParameters=true")]
+			public virtual void Test(ArrayList list, int i, string s, char c)
+			{
+			}
+
+			[Log("LogParameters=true")]
+			public virtual void Test(int i)
+			{
+				throw new ApplicationException("test exception");
+			}
+		}
+
+		[Test]
+		public void Test1()
+		{
+			TestClass t = (TestClass)TypeAccessor.CreateInstance(typeof(TestClass));
+
+			t.Test();
+			t.Test(new ArrayList(), 567, "876", 'X');
+		}
+
+		[Test, ExpectedException(typeof(ApplicationException))]
+		public void Test2()
+		{
+			TestClass t = (TestClass)TypeAccessor.CreateInstance(typeof(TestClass));
+
+			t.Test(123);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Aspects/MixinAspectTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,104 @@
+using System;
+using System.ComponentModel;
+using System.Data.SqlTypes;
+
+using NUnit.Framework;
+
+using BLToolkit.Aspects;
+using BLToolkit.ComponentModel;
+using BLToolkit.Reflection;
+
+namespace Aspects
+{
+	[TestFixture]
+	public class MixinAspectTest
+	{
+		public interface ITestInterface
+		{
+			int    Test1(ref int    value);
+			object Test2(ref object value);
+
+			int    Test3(string p);
+			int    Test4(double p);
+			int    Test5 { get; }
+			int    Test6 { get; }
+		}
+
+		public class TestInterfaceImpl : ITestInterface, INullable
+		{
+			int    ITestInterface.Test1(ref int    value) { return value; }
+			object ITestInterface.Test2(ref object value) { return value; }
+
+			int    ITestInterface.Test3(string p) { return 10; }
+			int    ITestInterface.Test4(double p) { return 20; }
+
+			int    ITestInterface.Test5 { get { return 30; } }
+			int    ITestInterface.Test6 { get { return 40; } }
+
+			bool   INullable.IsNull     { get { return true; } }
+		}
+
+		[Mixin(typeof(ICustomTypeDescriptor), "_typeDescriptor")]
+		[Mixin(typeof(ITestInterface),        "TestInterface", "'{0}.{1}' is null.")]
+		[Mixin(typeof(INullable),             "TestInterface", "'{0}.{1}' is null.")]
+		public abstract class TestClass
+		{
+			public TestClass()
+			{
+				_typeDescriptor = new CustomTypeDescriptorImpl(GetType());
+			}
+
+			protected object _typeDescriptor;
+
+			private ITestInterface _testInterface;
+			public  ITestInterface  TestInterface
+			{
+				get
+				{
+					if (_testInterface == null)
+						_testInterface = new TestInterfaceImpl();
+					return _testInterface;
+				}
+			}
+
+			public string Code = "code";
+
+			[MixinOverride]
+			protected int Test3(string p) { return 15; }
+			[MixinOverride(typeof(IDisposable))]
+			protected int Test4(double p) { return 25; }
+
+			protected int Test5 { [MixinOverride] get { return 35; } }
+		}
+
+		[Test]
+		public void Test1()
+		{
+			TestClass             tc = (TestClass)TypeAccessor.CreateInstance(typeof(TestClass));
+			ICustomTypeDescriptor td = (ICustomTypeDescriptor)tc;
+
+			PropertyDescriptorCollection col = td.GetProperties();
+
+			Assert.AreNotEqual(0, col.Count);
+		}
+
+		[Test]
+		public void Test2()
+		{
+			TestClass      tc = (TestClass)TypeAccessor.CreateInstance(typeof(TestClass));
+			ITestInterface ti = (ITestInterface)tc;
+			INullable      tn = (INullable)tc;
+
+			int    n = 10;
+			object o = new object();
+
+			Assert.AreEqual(10, ti.Test1(ref n));
+			Assert.AreSame (o,  ti.Test2(ref o));
+			Assert.AreEqual(15, ti.Test3(null));
+			Assert.AreEqual(20, ti.Test4(0));
+			Assert.AreEqual(35, ti.Test5);
+			Assert.AreEqual(40, ti.Test6);
+			Assert.That(tn.IsNull, Is.True);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Aspects/NotNullAspectTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,47 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Aspects;
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+
+namespace Aspects
+{
+	[TestFixture]
+	public class NotNullAspectTest
+	{
+		public abstract class TestObject1
+		{
+			public virtual void Foo1(string str1, [NotNull] string str2, string str3) {}
+			public virtual void Foo2(string str1, [NotNull("Null")] string str2, string str3) { }
+			public virtual void Foo3(string str1, [NotNull("Null: {0}")] string str2, string str3) { }
+		}
+
+		[Test, ExpectedException(typeof(ArgumentNullException))] // Error message is localized by framework.
+		public void Test1()
+		{
+			TestObject1 o = (TestObject1)TypeAccessor.CreateInstance(typeof(TestObject1));
+
+			o.Foo1("str1", null, "str3");
+		}
+
+		[Test]
+		[ExpectedException(typeof(ArgumentNullException), ExpectedMessage="Null")]
+		public void Test2()
+		{
+			TestObject1 o = (TestObject1)TypeAccessor.CreateInstance(typeof(TestObject1));
+
+			o.Foo2("str1", null, "str3");
+		}
+
+		[Test]
+		[ExpectedException(typeof(ArgumentNullException), ExpectedMessage="Null: str2")]
+		public void Test3()
+		{
+			TestObject1 o = (TestObject1)TypeAccessor.CreateInstance(typeof(TestObject1));
+
+			o.Foo3("str1", null, "str3");
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Aspects/OverloadAspectTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,267 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Aspects;
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+
+namespace Aspects
+{
+	[TestFixture]
+	public class OverloadAspectTest
+	{
+		public abstract class TestObject<T>
+		{
+			public T Test(T inVal, out T outVal)
+			{
+				outVal = inVal;
+				return inVal;
+			}
+
+			public string Test(DateTime dateVal, string inVal)
+			{
+				return inVal.ToUpper();
+			}
+
+			[Overload] abstract public T Test(T inVal);
+			[Overload] abstract public T Test(T inVal, out T outVal, ref T refVal);
+			[Overload] abstract public T Test(T inVal, DateTime dateVal);
+		}
+
+		public abstract class TestObject
+		{
+			public int    IntValue;
+			public string StrValue;
+			public Guid   GuidValue;
+
+			public void Test(int intVal, Guid guidVal)
+			{
+				IntValue  = intVal;
+				GuidValue = guidVal;
+				StrValue  = "(default)";
+			}
+
+			public void Test(int intVal, string strVal)
+			{
+				IntValue  = intVal;
+				StrValue  = strVal;
+				GuidValue = Guid.Empty;
+			}
+
+			public void OutRefTest(int inVal, out int outVal, ref int refVal)
+			{
+				outVal = inVal;
+				refVal += inVal;
+			}
+
+			public void OutRefStructTest(int? inVal, out int? outVal, ref int? refVal)
+			{
+				outVal = inVal;
+				refVal += inVal;
+			}
+
+			protected static int StaticMethod(int intVal, ref Guid guidVal)
+			{
+				return intVal;
+			}
+
+			public T Generic<T>(T inVal, out T outVal)
+			{
+				outVal = inVal;
+				return inVal;
+			}
+
+			// Becomes
+			// public override void Test(Guid guidVal)
+			// {
+			//   Test(default(int), guidVal);
+			// }
+			//
+			[Overload] public abstract void Test(Guid guidVal);
+
+			// Becomes
+			// public override void Test(Guid guidVal, int intVal)
+			// {
+			//   Test(intVal, guidVal);
+			// }
+			//
+			[Overload] public abstract void Test(Guid guidVal, int intVal);
+
+			// Becomes
+			// public override void Test(string strVal)
+			// {
+			//   Test(default(int), strVal);
+			// }
+			//
+			[Overload]
+			public abstract void Test(string strVal);
+
+			// Overload method name may be altered.
+			//
+			[Overload("Test")]
+			public abstract void GuidTest(Guid guidVal, DateTime dateVal);
+
+			// Parameter types of the method to overload.
+			//
+			[Overload(typeof(int), typeof(Guid))]
+			public abstract void Test(DateTime strVal);
+
+			// There may be more or less parameters in the overloaded method.
+			//
+			[Overload] public abstract void OutRefTest(int inVal, out int outVal, ref int refVal, out string strVal);
+			[Overload] public abstract void OutRefTest(int inVal);
+
+			// Value types and ref value types also works.
+			//
+			[Overload] public abstract void OutRefStructTest(int? inVal, out int? outVal, ref int? refVal, out Guid guidVal);
+			[Overload] public abstract void OutRefStructTest(int? inVal);
+
+			// We can overload static methods.
+			//
+			[Overload] public abstract int StaticMethod(int intVal);
+
+			// We can overload methods declared in a base type.
+			//
+			[Overload] public abstract string ToString(int intVal);
+
+			// A generic method can be overloaded by an other generic method.
+			//
+			[Overload] public abstract T Generic<T>(T inVal);
+		}
+
+		[Test]
+		public void OverloadTest()
+		{
+			TestObject o = TypeAccessor<TestObject>.CreateInstance();
+
+			o.Test(12345, "str");
+
+			Assert.AreEqual(12345, o.IntValue);
+			Assert.AreEqual("str", o.StrValue);
+			Assert.AreEqual(Guid.Empty, o.GuidValue);
+
+			o.Test(Guid.NewGuid(), 123);
+
+			Assert.AreEqual(123, o.IntValue);
+			Assert.AreEqual("(default)", o.StrValue);
+			Assert.AreNotEqual(Guid.Empty, o.GuidValue);
+
+			o.Test("foo");
+
+			Assert.AreEqual(0, o.IntValue);
+			Assert.AreEqual("foo", o.StrValue);
+			Assert.AreEqual(Guid.Empty, o.GuidValue);
+
+			o.Test(Guid.NewGuid());
+
+			Assert.AreEqual(0, o.IntValue);
+			Assert.AreEqual("(default)", o.StrValue);
+			Assert.AreNotEqual(Guid.Empty, o.GuidValue);
+
+			Assert.AreEqual(1, o.Generic(1));
+		}
+
+		[Test]
+		public void AnyNameTest()
+		{
+			TestObject o = TypeAccessor<TestObject>.CreateInstance();
+
+			o.GuidTest(Guid.NewGuid(), DateTime.Now);
+
+			Assert.AreEqual(0, o.IntValue);
+			Assert.AreEqual("(default)", o.StrValue);
+			Assert.AreNotEqual(Guid.Empty, o.GuidValue);
+		}
+
+		[Test]
+		public void ExplicitParameterTypesTest()
+		{
+			TestObject o = TypeAccessor<TestObject>.CreateInstance();
+
+			o.Test(DateTime.Now);
+
+			Assert.AreEqual(0, o.IntValue);
+			Assert.AreEqual("(default)", o.StrValue);
+			Assert.AreEqual(Guid.Empty, o.GuidValue);
+		}
+
+		[Test]
+		public void StaticMethodTest()
+		{
+			TestObject o = TypeAccessor<TestObject>.CreateInstance();
+
+			int intVal = o.StaticMethod(123);
+
+			Assert.AreEqual(123, intVal);
+		}
+
+		[Test]
+		public void BaseTypeMethodTest()
+		{
+			TestObject o = TypeAccessor<TestObject>.CreateInstance();
+
+			Assert.AreEqual(o.ToString(), o.ToString(123));
+		}
+
+		[Test]
+		public void OutRefTest()
+		{
+			TestObject o = TypeAccessor<TestObject>.CreateInstance();
+
+			const int inVal = 123;
+			int refVal = 99;
+			int outVal;
+			string strVal;
+			o.OutRefTest(inVal, out outVal, ref refVal, out strVal);
+
+			Assert.AreEqual(inVal, outVal);
+			Assert.AreEqual(222, refVal);
+			Assert.AreEqual(string.Empty, strVal);
+
+			o.OutRefTest(inVal);
+		}
+
+		[Test]
+		public void OutRefStructTest()
+		{
+			TestObject o = TypeAccessor<TestObject>.CreateInstance();
+
+			int? inVal = 123;
+			int? refVal = 99;
+			int? outVal;
+			Guid guidVal;
+			o.OutRefStructTest(inVal, out outVal, ref refVal, out guidVal);
+
+			Assert.AreEqual(inVal, outVal);
+			Assert.AreEqual(222, refVal);
+			Assert.AreEqual(Guid.Empty, guidVal);
+
+			o.OutRefStructTest(inVal);
+		}
+
+		[Test]
+		public void GenericTypeTest()
+		{
+			TestObject<int?> o = TypeAccessor<TestObject<int?>>.CreateInstance();
+
+			int? inVal = 123;
+			int? refVal = 99;
+			int? outVal;
+			o.Test(inVal, out outVal, ref refVal);
+
+			Assert.AreEqual(inVal, outVal);
+			Assert.AreEqual(refVal, 99);
+
+			Assert.AreEqual(inVal, o.Test(inVal));
+			Assert.AreEqual(12, o.Test(12, DateTime.Now));
+
+			TestObject<string> o2 = TypeAccessor<TestObject<string>>.CreateInstance();
+
+			// When T is a string, method Test(DateTime, string) becomes the best match.
+			//
+			Assert.AreEqual("STR", o2.Test("str", DateTime.Now));
+		}
+
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Common/ConvertTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,237 @@
+using System;
+#if ORACLE
+using Oracle.DataAccess.Types;
+#endif
+using System.Reflection;
+using BLToolkit.Common;
+using BLToolkit.Reflection;
+
+using NUnit.Framework;
+
+using Convert = BLToolkit.Common.Convert;
+
+namespace Common
+{
+	[TestFixture]
+	public class ConvertTest
+	{
+		[Test]
+		public void StringTest()
+		{
+			string testStr = "123";
+
+			Assert.AreEqual(123, Convert.ToSByte(testStr));
+			Assert.AreEqual(123, Convert.ToInt16(testStr));
+			Assert.AreEqual(123, Convert.ToInt32(testStr));
+			Assert.AreEqual(123, Convert.ToInt64(testStr));
+
+			Assert.AreEqual(123, Convert.ToByte(testStr));
+			Assert.AreEqual(123, Convert.ToUInt16(testStr));
+			Assert.AreEqual(123, Convert.ToUInt32(testStr));
+			Assert.AreEqual(123, Convert.ToUInt64(testStr));
+
+			Assert.AreEqual(123.0m, Convert.ToDecimal(testStr));
+			Assert.AreEqual(123.0f, Convert.ToSingle(testStr));
+			Assert.AreEqual(123.0,  Convert.ToDouble(testStr));
+
+			string zeroStr = "0";
+
+			Assert.AreEqual(0, Convert.ToSByte((string)null));
+			Assert.AreEqual(0, Convert.ToSByte(zeroStr));
+			Assert.AreEqual(0, Convert.ToInt16(zeroStr));
+			Assert.AreEqual(0, Convert.ToInt32(zeroStr));
+			Assert.AreEqual(0, Convert.ToInt64(zeroStr));
+
+			Assert.AreEqual(0, Convert.ToByte(zeroStr));
+			Assert.AreEqual(0, Convert.ToUInt16(zeroStr));
+			Assert.AreEqual(0, Convert.ToUInt32(zeroStr));
+			Assert.AreEqual(0, Convert.ToUInt64(zeroStr));
+
+			Assert.AreEqual(0.0m, Convert.ToDecimal(zeroStr));
+			Assert.AreEqual(0.0f, Convert.ToSingle(zeroStr));
+			Assert.AreEqual(0.0,  Convert.ToDouble(zeroStr));
+
+			Assert.IsTrue(Convert.ToBoolean("True"));
+			Assert.IsTrue(Convert.ToBoolean("true"));
+
+			Assert.IsFalse(Convert.ToBoolean("false"));
+			Assert.IsFalse(Convert.ToBoolean("FALSE"));
+			Assert.IsFalse(Convert.ToBoolean((string)null));
+
+			Assert.AreEqual('T', Convert.ToChar("T"));
+			Assert.AreEqual(0, Convert.ToChar((string)null));
+
+			Assert.AreEqual(DateTime.Today, Convert.ToDateTime(DateTime.Today.ToString()));
+			Assert.AreEqual(DateTime.MinValue, Convert.ToDateTime((string)null));
+
+			Assert.AreEqual(TimeSpan.FromDays(123.0), Convert.ToTimeSpan("123"));
+			Assert.AreEqual(TimeSpan.MinValue, Convert.ToTimeSpan((string)null));
+
+			Assert.AreEqual(typeof(int).GUID, Convert.ToGuid(typeof(int).GUID.ToString()));
+			Assert.AreEqual(Guid.Empty, Convert.ToGuid((string)null));
+
+			Assert.AreEqual(typeof(int), Convert.ToType("System.Int32, mscorlib"));
+			Assert.IsNull(Convert.ToType((string)null));
+		}
+
+		private static readonly Type[] NumericTypes =
+		{
+            typeof(SByte),
+            typeof(Byte),
+            typeof(Int16),
+            typeof(UInt16),
+            typeof(Int32),
+            typeof(UInt32),
+            typeof(Int64),
+            typeof(UInt64),
+            typeof(Single),
+            typeof(Double),
+            typeof(Decimal),
+        };
+
+		private const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Static;
+
+		[Test]
+		public void NumericTest()
+		{
+			TypeHelper helper = new TypeHelper(typeof(Convert));
+			IConvertible src  = 123;
+
+			// All types from SByte to Decimal can convert to each other
+			//
+			for (int from = 0; from < NumericTypes.Length; ++from)
+			{
+				Type typeFrom = NumericTypes[from];
+				object   test = src.ToType(typeFrom, null);
+
+				for (int to = 0; to < NumericTypes.Length; ++to)
+				{
+					if (from == to)
+						continue;
+
+					Type   typeTo = NumericTypes[to];
+					MethodInfo mi = helper.GetMethod("To" + typeTo.Name, bindingFlags, typeFrom);
+
+					Assert.IsNotNull(mi, string.Format("Missed To{0}({1})", typeTo.Name, typeFrom.Name));
+					Assert.AreEqual(123, mi.Invoke(null, new object[] { test }));
+				}
+			}
+		}
+
+		[Test]
+		public void DateTimeTest()
+		{
+			Assert.AreEqual(DateTime.MinValue + TimeSpan.FromDays(1), Convert.ToDateTime(1.0));
+			Assert.AreEqual(TimeSpan.FromDays(1), Convert.ToTimeSpan(1.0));
+
+			Assert.AreEqual(DateTime.MinValue + TimeSpan.FromTicks(1), Convert.ToDateTime(1L));
+			Assert.AreEqual(TimeSpan.FromTicks(1), Convert.ToTimeSpan(1L));
+		}
+
+		[Test]
+		public void InterfaceTest()
+		{
+			Assert.AreEqual(123, ConvertTo<IConvertible>.From(123).ToByte(null));
+		}
+
+		[Test]
+		public void EnumTest()
+		{
+			// Enum-to-enum.
+			//
+			Assert.AreEqual(BindingFlags.DeclaredOnly,
+				ConvertTo<BindingFlags>.From(CallingConventions.VarArgs));
+
+			// Enum-to-nullable byte.
+			//
+			Assert.AreEqual((byte?)BindingFlags.DeclaredOnly,
+				ConvertTo<byte?>.From(BindingFlags.DeclaredOnly));
+
+			// Nullable Enum-to-nullable enum.
+			//
+			Assert.AreEqual((CallingConventions?)CallingConventions.VarArgs,
+				ConvertTo<CallingConventions?>.From((BindingFlags?)BindingFlags.DeclaredOnly));
+
+			// Integer-to-enum.
+			//
+			Assert.AreEqual(BindingFlags.DeclaredOnly,
+				ConvertTo<BindingFlags>.From((int)BindingFlags.DeclaredOnly));
+
+			// Integer-to-nullable enum.
+			//
+			Assert.AreEqual(BindingFlags.DeclaredOnly,
+				ConvertTo<BindingFlags?>.From((int)BindingFlags.DeclaredOnly));
+
+		}
+
+		[Test]
+		public void ByteArrayTest()
+		{
+			Byte[] bytes;
+			object value;
+
+			bytes = new byte[] {123};
+			value = (byte)123;
+			Assert.AreEqual(bytes, Convert.ToByteArray(value));
+			Assert.AreEqual(value, Convert.ToByte(bytes));
+
+			bytes = new byte[] {123, 0};
+			value = (short)123;
+			Assert.AreEqual(bytes, Convert.ToByteArray(value));
+			Assert.AreEqual(value, Convert.ToInt16(bytes));
+
+			bytes = new byte[] {210, 2, 150, 73};
+			value = 1234567890;
+			Assert.AreEqual(bytes, Convert.ToByteArray(value));
+			Assert.AreEqual(value, Convert.ToInt32(bytes));
+
+			bytes = new byte[] {(byte) 't', (byte) 's', (byte) 't'};
+			value = "tst";
+			Assert.AreEqual(bytes, Convert.ToByteArray(value));
+			Assert.AreEqual(value, Convert.ToString(bytes));
+
+			bytes = new byte[] {12, 0, 0, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70};
+			value = typeof(System.Runtime.InteropServices.ComTypes.IStream).GUID;
+			Assert.AreEqual(bytes, Convert.ToByteArray(value));
+			Assert.AreEqual(value, Convert.ToGuid(bytes));
+
+			bytes = new byte[] {210, 10, 31, 235, 140, 169, 84, 171, 0, 0, 0, 0, 0, 0, 0, 0};
+			value = 12345678901234567890m;
+			Assert.AreEqual(bytes, Convert.ToByteArray(value));
+			Assert.AreEqual(value, Convert.ToDecimal(bytes));
+
+			bytes = new byte[] {121, 233, 246, 66};
+			value = 123.456f;
+			Assert.AreEqual(bytes, Convert.ToByteArray(value));
+			Assert.AreEqual(value, Convert.ToSingle(bytes));
+
+			bytes = new byte[] {119, 190, 159, 26, 47, 221, 94, 64};
+			value = 123.456;
+			Assert.AreEqual(bytes, Convert.ToByteArray(value));
+			Assert.AreEqual(value, Convert.ToDouble(bytes));
+		}
+
+		[Test]
+		public void ConvertT()
+		{
+			decimal d = ConvertTo<decimal>.From(123);
+			Assert.AreEqual(123.0m, d);
+		}
+
+#if ORACLE
+		[Test]
+		public void TypeCast()
+		{
+			// Note that method BLToolkit.Common.Convert.ToDecimal(OracleNumber p) does not exist.
+			//
+			decimal d = ConvertTo<decimal>.From(new OracleDecimal(123));
+			Assert.AreEqual(123.0m, d);
+
+			// Method BLToolkit.Common.Convert.ToOracleString(string p) does not exist too.
+			//
+			OracleString s = ConvertTo<OracleString>.From("test");
+			Assert.AreEqual("test", s.Value);
+		}
+#endif
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Common/NameOrIndexParameterTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,131 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Common;
+
+namespace Common
+{
+	[TestFixture]
+	public class NameOrIndexParameterTest
+	{
+		[Test]
+		public void DefaultValueTest()
+		{
+			int expectedValue = 0;
+			NameOrIndexParameter nip = new NameOrIndexParameter();
+			Assert.IsFalse(nip.ByName);
+			Assert.AreEqual(nip.Index, expectedValue);
+		}
+
+		[Test]
+		public void StringTest()
+		{
+			string expectedValue = "54321";
+			NameOrIndexParameter nip = "54321";
+			Assert.IsTrue(nip.ByName);
+			Assert.AreEqual(nip.Name, expectedValue);
+		}
+
+		[Test]
+		public void IntTest()
+		{
+			int expectedValue = 12345;
+			NameOrIndexParameter nip = 12345;
+			Assert.IsFalse(nip.ByName);
+			Assert.AreEqual(nip.Index, expectedValue);
+		}
+
+		[Test]
+		public void ArrayTest()
+		{
+			NameOrIndexParameter[] nips = new NameOrIndexParameter[]{ 12345, "54321" };
+			Assert.AreEqual(nips[0].Index, 12345);
+			Assert.AreEqual(nips[1].Name, "54321");
+		}
+
+		[Test]
+		public void StringArrayTest()
+		{
+			NameOrIndexParameter[] nips = NameOrIndexParameter.FromStringArray(new string[] { "98765", "54321" });
+			Assert.AreEqual(nips[0].Name, "98765");
+			Assert.AreEqual(nips[1].Name, "54321");
+		}
+
+		[Test]
+		public void IntArrayTest()
+		{
+			NameOrIndexParameter[] nips = NameOrIndexParameter.FromIndexArray(new int[] { 12345, 56789 });
+			Assert.AreEqual(nips[0].Index, 12345);
+			Assert.AreEqual(nips[1].Index, 56789);
+		}
+		
+		[Test, ExpectedException(typeof(ArgumentNullException))]
+		public void IllegalStringTest()
+		{
+			NameOrIndexParameter nip = null;
+		}
+
+		[Test, ExpectedException(typeof(ArgumentException))]
+		public void IllegalStringTest2()
+		{
+			NameOrIndexParameter nip = string.Empty;
+		}
+		
+		[Test, ExpectedException(typeof(ArgumentException))]
+		public void IllegalIntTest()
+		{
+			NameOrIndexParameter nip = -12345;
+		}
+
+		[Test, ExpectedException(typeof(InvalidOperationException))]
+		public void IllegalAccessTest()
+		{
+			// Init by index
+			NameOrIndexParameter nip = 12345;
+			Assert.IsFalse(nip.ByName);
+
+			// Exception here
+			string value = nip.Name;
+		}
+
+		[Test, ExpectedException(typeof(InvalidOperationException))]
+		public void IllegalAccessTest2()
+		{
+			// Init by name
+			NameOrIndexParameter nip = "54321";
+			Assert.IsTrue(nip.ByName);
+
+			// Exception here
+			int value = nip.Index;
+		}
+
+		public static object SomeFunc(NameOrIndexParameter nip)
+		{
+			if (nip.ByName)
+			{
+				return nip.Name;
+			}
+			else
+			{
+				return nip.Index;
+			}
+		}
+
+		[Test]
+		public void FunctionTest()
+		{
+			int expectedValue = 12345;
+			object o = SomeFunc(12345);
+			Assert.AreEqual(o, expectedValue);
+		}
+		
+		[Test]
+		public void FunctionTest2()
+		{
+			string expectedValue = "54321";
+			object o = SomeFunc("54321");
+			Assert.AreEqual(o, expectedValue);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Common/OperatorTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,96 @@
+using System;
+#if ORACLE
+using Oracle.DataAccess.Types;
+#endif
+using NUnit.Framework;
+
+using BLToolkit.Common;
+
+namespace Common
+{
+	[TestFixture]
+	public class OperatorTest
+	{
+		[Test]
+		public void StringTest()
+		{
+			Assert.AreEqual("123456", Operator<string>.Addition("123", "456"));
+
+			Assert.IsTrue(Operator<string>.Equality("123", "123"));
+		}
+
+		[Test]
+		public void IntTest()
+		{
+			Assert.AreEqual(579,   Operator<int>.Addition   (123, 456));
+			Assert.AreEqual(-333,  Operator<int>.Subtraction(123, 456));
+
+			Assert.AreEqual(56088, Operator<int>.Multiply(123, 456));
+			Assert.AreEqual(0,     Operator<int>.Division(123, 456));
+			Assert.AreEqual(123,   Operator<int>.Modulus (123, 456));
+
+
+			Assert.AreEqual(72,    Operator<int>.BitwiseAnd (123, 456));
+			Assert.AreEqual(507,   Operator<int>.BitwiseOr  (123, 456));
+			Assert.AreEqual(435,   Operator<int>.ExclusiveOr(123, 456));
+
+			Assert.AreEqual(-123,  Operator<int>.UnaryNegation (123));
+			Assert.AreEqual(-124,  Operator<int>.OnesComplement(123));
+
+			Assert.IsTrue(Operator<int>.Equality          (123, 123));
+			Assert.IsTrue(Operator<int>.Inequality        (123, 456));
+			Assert.IsTrue(Operator<int>.GreaterThan       (123, -56));
+			Assert.IsTrue(Operator<int>.GreaterThanOrEqual(123, 123));
+			Assert.IsTrue(Operator<int>.LessThan          (123, 456));
+			Assert.IsTrue(Operator<int>.LessThanOrEqual   (-23, 123));
+		}
+
+#if ORACLE
+		private class OracleDecimalOp : IOperable<OracleDecimal>
+		{
+			public OracleDecimal Addition         (OracleDecimal op1, OracleDecimal op2) { return (op1 + op2); }
+			public OracleDecimal Subtraction      (OracleDecimal op1, OracleDecimal op2) { return (op1 - op2); }
+			public OracleDecimal Multiply         (OracleDecimal op1, OracleDecimal op2) { return (op1 * op2); }
+			public OracleDecimal Division         (OracleDecimal op1, OracleDecimal op2) { return (op1 / op2); }
+			public OracleDecimal Modulus          (OracleDecimal op1, OracleDecimal op2) { return (op1 % op2); }
+
+			public OracleDecimal BitwiseAnd       (OracleDecimal op1, OracleDecimal op2) { throw new InvalidOperationException(); }
+			public OracleDecimal BitwiseOr        (OracleDecimal op1, OracleDecimal op2) { throw new InvalidOperationException(); }
+			public OracleDecimal ExclusiveOr      (OracleDecimal op1, OracleDecimal op2) { throw new InvalidOperationException(); }
+
+			public OracleDecimal UnaryNegation    (OracleDecimal op)             { return (-op); }
+			public OracleDecimal OnesComplement   (OracleDecimal op)             { throw new InvalidOperationException(); }
+
+			public bool Equality          (OracleDecimal op1, OracleDecimal op2) { return op1 == op2; }
+			public bool Inequality        (OracleDecimal op1, OracleDecimal op2) { return op1 != op2; }
+			public bool GreaterThan       (OracleDecimal op1, OracleDecimal op2) { return op1 >  op2; }
+			public bool GreaterThanOrEqual(OracleDecimal op1, OracleDecimal op2) { return op1 >= op2; }
+			public bool LessThan          (OracleDecimal op1, OracleDecimal op2) { return op1 <  op2; }
+			public bool LessThanOrEqual   (OracleDecimal op1, OracleDecimal op2) { return op1 <= op2; }
+		}
+
+		[Test]
+		public void ExtensionTest()
+		{
+			Operator<OracleDecimal>.Op = new OracleDecimalOp();
+
+			Assert.AreEqual((OracleDecimal)579,   Operator<OracleDecimal>.Addition   (123, 456));
+			Assert.AreEqual((OracleDecimal)(-333),Operator<OracleDecimal>.Subtraction(123, 456));
+
+			Assert.AreEqual((OracleDecimal)56088, Operator<OracleDecimal>.Multiply(123, 456));
+			Assert.AreEqual((OracleDecimal)41,    Operator<OracleDecimal>.Division(123, 3));
+			Assert.AreEqual((OracleDecimal)123,   Operator<OracleDecimal>.Modulus (123, 456));
+
+
+			Assert.AreEqual(-(OracleDecimal)123,  Operator<OracleDecimal>.UnaryNegation (123));
+
+			Assert.IsTrue(Operator<OracleDecimal>.Equality          (123, 123));
+			Assert.IsTrue(Operator<OracleDecimal>.Inequality        (123, 456));
+			Assert.IsTrue(Operator<OracleDecimal>.GreaterThan       (123, (-5)));
+			Assert.IsTrue(Operator<OracleDecimal>.GreaterThanOrEqual(123, 123));
+			Assert.IsTrue(Operator<OracleDecimal>.LessThan          (123, 456));
+			Assert.IsTrue(Operator<OracleDecimal>.LessThanOrEqual   (123, 123));
+		}
+#endif
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/ComponenetModel/ObjectBinderTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,29 @@
+using System;
+using System.ComponentModel;
+
+using BLToolkit.ComponentModel;
+
+using NUnit.Framework;
+
+namespace UnitTests.CS.ComponenetModel
+{
+	[TestFixture]
+	public class ObjectBinderTest
+	{
+		[Test]
+		public void GetItemPropertiesTest()
+		{
+			ObjectBinder binder = new ObjectBinder();
+
+			binder.ListChanged += delegate(object sender, ListChangedEventArgs e)
+			{
+				PropertyDescriptorCollection properties = ((ITypedList)sender).GetItemProperties(null);
+
+				Assert.That(properties, Is.Not.Null);
+				Assert.That(properties, Is.Not.Empty);
+			};
+
+			binder.ItemType = typeof(string);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/BinaryTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,99 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+
+namespace Data
+{
+	[TestFixture]
+	public class BinaryTest
+	{
+		public class BinaryData
+		{
+			public int    BinaryDataID;
+			public byte[] Stamp;
+			public byte[] Data;
+		}
+
+		[Test]
+		public void Test()
+		{
+			using (DbManager db = new DbManager())
+			{
+				object id;
+#if ORACLE
+				id = db
+					.SetCommand("INSERT INTO BinaryData (Data) VALUES (:pData) RETURNING BinaryDataID INTO :pID",
+						db.Parameter("pData", new byte[] { 1, 2, 3, 4, 5}),
+						db.OutputParameter("pID", System.Data.DbType.Int32)
+						)
+					.ExecuteScalar(ScalarSourceType.OutputParameter, "ID");
+#elif MSSQL
+				id = db
+					.SetCommand("INSERT INTO BinaryData (Data) VALUES (@Data)\nSELECT Cast(SCOPE_IDENTITY() as int)",
+						db.Parameter("@Data", new byte[] { 1, 2, 3, 4, 5}))
+					.ExecuteScalar();
+#elif FIREBIRD
+				db
+					.SetCommand("INSERT INTO BinaryData (Data) VALUES (@Data)",
+						db.Parameter("@Data", new byte[] { 1, 2, 3, 4, 5}))
+					.ExecuteNonQuery();
+
+				id = db
+					.SetCommand("SELECT GEN_ID(PersonID, 0) FROM dual")
+					.ExecuteScalar();
+#elif ACCESS || SQLCE
+				db
+					.SetCommand("INSERT INTO BinaryData (Data) VALUES (@Data)",
+						db.Parameter("@Data", new byte[] { 1, 2, 3, 4, 5}))
+					.ExecuteNonQuery();
+
+				id = db
+					.SetCommand("SELECT @@IDENTITY")
+					.ExecuteScalar();
+#elif SQLITE
+				db
+					.SetCommand("INSERT INTO BinaryData (Stamp, Data) VALUES (datetime('now'), @Data)",
+						db.Parameter("@Data", new byte[] { 1, 2, 3, 4, 5}))
+					.ExecuteNonQuery();
+
+				id = db
+					.SetCommand("SELECT last_insert_rowid()")
+					.ExecuteScalar();
+#else
+				Assert.Fail("Unknown DB type.");
+#endif
+
+				BinaryData bd = (BinaryData)db
+					.SetCommand(
+						"SELECT * FROM BinaryData WHERE BinaryDataID = " + db.DataProvider.Convert("id", ConvertType.NameToQueryParameter),
+					db.Parameter("id", id))
+					.ExecuteObject(typeof(BinaryData));
+
+				Assert.IsNotNull(bd);
+				Assert.AreEqual(5, bd.Data. Length);
+#if FIREBIRD
+				// Stamps are integers in Firebird.
+				//
+				Assert.AreEqual(4, bd.Stamp.Length);
+#elif ACCESS || SQLCE
+				// Not supported in MS Access
+				//
+				Assert.IsNull(bd.Stamp);
+#else
+				Assert.AreEqual(8, bd.Stamp.Length);
+#endif
+
+				db
+#if FIREBIRD || ACCESS || SQLCE || SQLITE
+					.SetCommand("DELETE FROM BinaryData")
+#else
+					.SetCommand("TRUNCATE TABLE BinaryData")
+#endif
+					.ExecuteNonQuery();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/ComplexMappingTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,222 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+using BLToolkit.EditableObjects;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection.MetadataProvider;
+using BLToolkit.Reflection;
+
+namespace Data
+{
+	[TestFixture]
+	public class ComplexMappingTest
+	{
+		private const string _parentChildquery = @"
+			SELECT       1 AS ParentId
+			UNION SELECT 2 AS ParentId
+
+			SELECT       1 AS ChildId, 1 AS ParentId
+			UNION SELECT 2 AS ChildId, 1 AS ParentId
+			UNION SELECT 3 AS ChildId, 2 AS ParentId
+			UNION SELECT 4 AS ChildId, 2 AS ParentId";
+
+		public abstract class Parent : EditableObject
+		{
+			[MapField("ParentId"), PrimaryKey]
+			public abstract int         Id       { get; set; }
+			[Relation(typeof(Child))]
+			public abstract List<Child> Children { get; set; }
+		}
+
+		[MapField("ParentId", "Parent.Id")]
+		public abstract class Child : EditableObject
+		{
+			[MapField("ChildId"), PrimaryKey]
+			public abstract int    Id     { get; set; }
+			[Relation]
+			public abstract Parent Parent { get; set; }
+		}
+
+		[Test]
+		public void Test1()
+		{
+			List<Parent> parents = new List<Parent>();
+			MapResultSet[] sets = new MapResultSet[2];
+
+			sets[0] = new MapResultSet(typeof(Parent), parents);
+			sets[1] = new MapResultSet(typeof(Child));
+
+			sets[0].AddRelation(sets[1], "ParentID", "ParentID", "Children");
+			sets[1].AddRelation(sets[0], "ParentID", "ParentID", "Parent");
+
+			using (DbManager db = new DbManager())
+			{
+				db
+					.SetCommand(_parentChildquery)
+					.ExecuteResultSet(sets);
+			}
+
+			foreach (Parent p in parents)
+			{
+				Assert.That(p.IsDirty == false);
+
+				foreach (Child c in p.Children)
+					Assert.That(c.IsDirty == false);
+			}
+		}
+
+		[Test]
+		public void RelationAttributeTest1()
+		{
+			bool isSet;
+			List<MapRelationBase> relations
+				 = Map.DefaultSchema.MetadataProvider.GetRelations(Map.DefaultSchema, 
+							Map.DefaultSchema.Extensions, typeof(Parent), typeof(Child), out isSet);
+
+			Assert.That(isSet);
+			Assert.That(relations.Count == 1);
+
+			Assert.That(relations[0].ContainerName == "Children");
+			Assert.That(relations[0].SlaveIndex.Fields[0].Name == "ParentId");
+
+			relations
+				 = Map.DefaultSchema.MetadataProvider.GetRelations(Map.DefaultSchema, 
+							Map.DefaultSchema.Extensions, typeof(Child), typeof(Parent), out isSet);
+
+			Assert.That(isSet);
+			Assert.That(relations.Count == 1);
+
+			Assert.That(relations[0].ContainerName == "Parent");
+			Assert.That(relations[0].SlaveIndex.Fields[0].Name == "ParentId");
+		}
+	
+		public abstract class Master
+		{
+			[PrimaryKey, Nullable]
+			public abstract int          MasterId {get; set;}
+			[Relation(typeof(Detail))]
+			public abstract List<Detail> Details  {get; set;}
+			public abstract string       Name     {get; set;}
+		}
+
+		[MapField("MasterId", "Master.MasterId")]
+		public abstract class Detail
+		{
+			[PrimaryKey, MapField("Id"), Nullable]
+			public abstract int             DetailId   {get; set;}
+
+			[Relation]
+			public abstract Master          Master     {get; set;}
+
+			[Relation(typeof(SubDetail), "DetailId", "Id")]
+			public abstract List<SubDetail> SubDetails {get; set;}
+		}
+
+		[MapField("DetailId", "Master.DetailId")]
+		public abstract class SubDetail
+		{
+			[PrimaryKey]
+			public abstract int             SubDetailId {get; set;}
+
+			[Relation("Id", "DetailId"), Nullable]
+			public abstract Detail          Master      {get; set;}
+		}
+
+		[Test]
+		public void RelationAttributeTest2()
+		{
+			MappingSchema        ms = Map.DefaultSchema;
+			MetadataProviderBase mp = ms.MetadataProvider;
+			bool                 isSet;
+
+			List<MapRelationBase> relations = mp.GetRelations(ms, ms.Extensions, typeof(Master), typeof(Detail), out isSet);
+			
+			//sets[0] = new MapResultSet(typeof(Master),    masters);
+			//sets[1] = new MapResultSet(typeof(Detail),    details);
+			//sets[2] = new MapResultSet(typeof(SubDetail), subdetails);
+
+			//sets[0].AddRelation(sets[1], "MasterId", "MasterId", "Details");
+			//sets[1].AddRelation(sets[0], "MasterId", "MasterId", "Master");
+			//sets[1].AddRelation(sets[2], "DetailId",       "Id", "SubDetails");
+			//sets[2].AddRelation(sets[1], "Id",       "DetailId", "Master");
+
+
+			Assert.That(isSet);
+			Assert.That(relations.Count == 1);
+			Assert.AreEqual("MasterId", relations[0].MasterIndex.Fields[0].Name);
+			Assert.AreEqual("MasterId", relations[0].SlaveIndex.Fields[0].Name);
+			Assert.AreEqual("Details",  relations[0].ContainerName);
+
+			relations = mp.GetRelations(ms, ms.Extensions, typeof(Detail), typeof(Master), out isSet);
+			
+			Assert.That(isSet);
+			Assert.That(relations.Count == 1);
+			Assert.AreEqual("MasterId", relations[0].MasterIndex.Fields[0].Name);
+			Assert.AreEqual("MasterId", relations[0].SlaveIndex.Fields[0].Name);
+			Assert.AreEqual("Master",   relations[0].ContainerName);
+
+			relations = mp.GetRelations(ms, ms.Extensions, typeof(Detail), typeof(SubDetail), out isSet);
+			
+			Assert.That(isSet);
+			Assert.That(relations.Count == 1);
+			Assert.AreEqual("Id",         relations[0].MasterIndex.Fields[0].Name);
+			Assert.AreEqual("DetailId",   relations[0].SlaveIndex.Fields[0].Name);
+			Assert.AreEqual("SubDetails", relations[0].ContainerName );
+
+			relations = mp.GetRelations(ms, ms.Extensions, typeof(SubDetail), typeof(Detail), out isSet);
+			
+			Assert.That(isSet);
+			Assert.That(relations.Count == 1);
+			Assert.AreEqual("DetailId", relations[0].MasterIndex.Fields[0].Name);
+			Assert.AreEqual("Id",       relations[0].SlaveIndex.Fields[0].Name);
+			Assert.AreEqual("Master",   relations[0].ContainerName);
+		}
+		
+		[Test]
+		public void RelationAttributeTest3()
+		{
+			MappingSchema        ms = Map.DefaultSchema;
+			MetadataProviderBase mp = ms.MetadataProvider;
+			bool                 isSet;
+
+			List<MapRelationBase> relations = mp.GetRelations(ms, ms.Extensions, typeof(Detail), null, out isSet);
+
+			Assert.That(relations.Count == 2);
+
+		}
+
+		[Test]
+		public void NullKeyTest()
+		{
+			Master m = TypeAccessor.CreateInstance<Master>();
+			Detail d = TypeAccessor.CreateInstance<Detail>();
+			
+			List<Master> masters = new List<Master>();
+			List<Detail> details = new List<Detail>();
+
+			masters.Add(m);
+			details.Add(d);
+
+			Map.ResultSets(new MapResultSet[] { new MapResultSet(typeof(Master), masters), 
+												new MapResultSet(typeof(Detail), details) });
+
+			Assert.IsFalse (object.ReferenceEquals(d.Master, m));
+			Assert.AreEqual(0, m.Details.Count);
+
+			m.MasterId = 1;
+			d.DetailId = 1;
+			d.Master.MasterId = 1;
+
+			Map.ResultSets(new MapResultSet[] { new MapResultSet(typeof(Master), masters), 
+												new MapResultSet(typeof(Detail), details) });
+
+			
+			Assert.IsTrue  (object.ReferenceEquals(d.Master, m));
+			Assert.AreEqual(1, m.Details.Count);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/CompositeKeyTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,38 @@
+using System;
+using System.Data;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.Mapping;
+
+namespace Data
+{
+	[TestFixture]
+	public class CompositeKeyTest
+	{
+		public class CompositeKey
+		{
+			public int Id;
+			public int Revision;
+		}
+
+		[MapField("Id",       "Key.Id")]
+		[MapField("Revision", "Key.Revision")]
+		public class Entity
+		{
+			public CompositeKey Key = new CompositeKey();
+			public string       Name;
+		}
+
+		[Test]
+		public void CompositeObjectTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				IDbDataParameter[] prms = db.CreateParameters(new Entity());
+				Assert.AreEqual(3, prms.Length);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/DbManagerTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,484 @@
+using System;
+using System.Collections;
+using System.Data;
+using System.Data.SqlClient;
+using System.Data.SqlTypes;
+using System.IO;
+using System.Linq;
+using System.Xml;
+using BLToolkit.Data.DataProvider;
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.EditableObjects;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+
+namespace Data
+{
+	[TestFixture]
+	public class DbManagerTest
+	{
+		public enum Gender
+		{
+			[MapValue("F")] Female,
+			[MapValue("M")] Male,
+			[MapValue("U")] Unknown,
+			[MapValue("O")] Other
+		}
+
+		public class Person
+		{
+			[MapField("PersonID")]
+			public int    ID;
+			public string FirstName;
+			public string MiddleName;
+			public string LastName;
+			public Gender Gender;
+		}
+
+		public class DataTypeTest
+		{
+			[MapField("DataTypeID")]
+			public int       ID;
+			[MapIgnore(false)]
+			public Byte[]    Binary_;
+#if !ORACLE
+			// Oracle does not know boolean nor guid.
+			//
+			public Boolean   Boolean_;
+			public Guid      Guid_;
+#endif
+			public Byte      Byte_;
+			[MapIgnore(false)]
+			public Byte[]    Bytes_;
+			public DateTime  DateTime_;
+			public Decimal   Decimal_;
+			public Double    Double_;
+			public Int16     Int16_;
+			public Int32     Int32_;
+			public Int64     Int64_;
+			public Decimal   Money_;
+			public Single    Single_;
+			public String    String_;
+
+			public Char      Char_;
+			public SByte     SByte_;
+			public UInt16    UInt16_;
+			public UInt32    UInt32_;
+			public UInt64    UInt64_;
+#if !SQLCE
+			[MapIgnore(false)]
+			public Stream    Stream_;
+			[MapIgnore]
+			public XmlReader Xml_;
+			[MapField("Xml_")]
+			public XmlDocument XmlDoc_;
+#endif
+		}
+
+		public class DataTypeSqlTest
+		{
+			[MapField("DataTypeID")]
+			public int ID;
+			public SqlBinary   Binary_;
+			public SqlBoolean  Boolean_;
+			public SqlByte     Byte_;
+			public SqlDateTime DateTime_;
+			public SqlDecimal  Decimal_;
+			public SqlDouble   Double_;
+			public SqlGuid     Guid_;
+			public SqlInt16    Int16_;
+			public SqlInt32    Int32_;
+			public SqlInt64    Int64_;
+			public SqlMoney    Money_;
+			public SqlSingle   Single_;
+			public SqlString   String_;
+#if !SQLCE
+			[MapIgnore(false)]
+			public SqlBytes    Bytes_;
+			[MapIgnore(false)]
+			public SqlChars    Chars_;
+			[MapIgnore(false)]
+			public SqlXml      Xml_;
+#endif
+		}
+
+		[Test]
+		public void ExecuteList1()
+		{
+			using (DbManager db = new DbManager())
+			{
+				ArrayList list = db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteList(typeof(Person));
+				
+				Assert.IsNotEmpty(list);
+			}
+		}
+
+		[Test]
+		public void ExecuteList2()
+		{
+			using (DbManager db = new DbManager())
+			{
+				IList list = db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteList(new EditableArrayList(typeof(Person)), typeof(Person));
+				
+				Assert.IsNotEmpty(list);
+			}
+		}
+
+		[Test]
+		public void ExecuteObject()
+		{
+			using (DbManager db = new DbManager())
+			{
+				Person p = (Person)db
+					.SetCommand("SELECT * FROM Person WHERE PersonID = " + db.DataProvider.Convert("id", ConvertType.NameToQueryParameter),
+					db.Parameter("id", 1))
+					.ExecuteObject(typeof(Person));
+
+				TypeAccessor.WriteConsole(p);
+			}
+		}
+
+		[Test]
+		public void ExecuteObject2()
+		{
+			using (DbManager db = new DbManager())
+			{
+				DataTypeTest dt = (DataTypeTest)db
+					.SetCommand("SELECT * FROM DataTypeTest WHERE DataTypeID = " + db.DataProvider.Convert("id", ConvertType.NameToQueryParameter),
+					db.Parameter("id", 2))
+					.ExecuteObject(typeof(DataTypeTest));
+
+				TypeAccessor.WriteConsole(dt);
+			}
+		}
+
+#if !ORACLE
+		[Test]
+#endif
+		public void ExecuteObject2Sql()
+		{
+			using (DbManager db = new DbManager())
+			{
+				DataTypeSqlTest dt = (DataTypeSqlTest)db
+					.SetCommand("SELECT * FROM DataTypeTest WHERE DataTypeID = " + db.DataProvider.Convert("id", ConvertType.NameToQueryParameter),
+					db.Parameter("id", 2))
+					.ExecuteObject(typeof(DataTypeSqlTest));
+
+				TypeAccessor.WriteConsole(dt);
+			}
+		}
+
+#if MSSQL
+		[Test]
+#endif
+		public void NativeConnection()
+		{
+			string connectionString = DbManager.GetConnectionString(null);
+
+			using (DbManager db = new DbManager(new SqlConnection(connectionString)))
+			{
+				db
+					.SetSpCommand ("Person_SelectByName",
+						db.Parameter("@firstName", "John"),
+						db.Parameter("@lastName",  "Pupkin"))
+					.ExecuteScalar();
+			}
+		}
+
+		public class OutRefTest
+		{
+			public int    ID             = 5;
+			public int    outputID;
+			public int    inputOutputID  = 10;
+			public string str            = "5";
+			public string outputStr;
+			public string inputOutputStr = "10";
+		}
+
+#if !ACCESS && !SQLCE && !SQLITE
+		[Test]
+		public void MapOutput()
+		{
+			OutRefTest o = new OutRefTest();
+
+			using (DbManager db = new DbManager())
+			{
+				db
+					.SetSpCommand("OutRefTest", db.CreateParameters(o,
+						new string[] {      "outputID",      "outputStr" },
+						new string[] { "inputOutputID", "inputOutputStr" },
+						null))
+					.ExecuteNonQuery(o);
+			}
+
+			Assert.AreEqual(5,     o.outputID);
+			Assert.AreEqual(15,    o.inputOutputID);
+			Assert.AreEqual("5",   o.outputStr);
+			Assert.AreEqual("510", o.inputOutputStr);
+		}
+
+		public class ReturnParameter
+		{
+			public int Value;
+		}
+
+		[Test]
+		public void MapReturnValue()
+		{
+			ReturnParameter e = new ReturnParameter();
+
+			using (DbManager db = new DbManager())
+			{
+				db
+					.SetSpCommand("Scalar_ReturnParameter")
+					.ExecuteNonQuery("Value", e);
+			}
+
+			Assert.AreEqual(12345, e.Value);
+		}
+
+		[Test]
+		public void InsertAndMapBack()
+		{
+			Person e = new Person();
+			e.FirstName = "Crazy";
+			e.LastName  = "Frog";
+			e.Gender    =  Gender.Other;
+
+			using (DbManager db = new DbManager())
+			{
+				db
+					.SetSpCommand("Person_Insert", db.CreateParameters(e, new string[] { "PersonID" }, null, null))
+					.ExecuteObject(e);
+
+				Assert.IsTrue(e.ID > 0);
+
+				// Cleanup.
+				//
+				db
+					.SetSpCommand("Person_Delete", db.CreateParameters(e))
+					.ExecuteNonQuery();
+			}
+		}
+
+		[Test]
+		public void MapDataRow()
+		{
+			DataTable dataTable = new DataTable();
+			dataTable.Columns.Add("ID",             typeof(int));
+			dataTable.Columns.Add("outputID",       typeof(int));
+			dataTable.Columns.Add("inputOutputID",  typeof(int));
+			dataTable.Columns.Add("str",            typeof(string));
+			dataTable.Columns.Add("outputStr",      typeof(string));
+			dataTable.Columns.Add("inputOutputStr", typeof(string));
+
+			DataRow dataRow = dataTable.Rows.Add(new object[]{5, 0, 10, "5", null, "10"});
+
+			using (DbManager db = new DbManager())
+			{
+				db
+					.SetSpCommand("OutRefTest", db.CreateParameters(dataRow,
+						new string[] {      "outputID",      "outputStr" },
+						new string[] { "inputOutputID", "inputOutputStr" },
+						null))
+					.ExecuteNonQuery(dataRow);
+			}
+
+			Assert.AreEqual(5,     dataRow["outputID"]);
+			Assert.AreEqual(15,    dataRow["inputOutputID"]);
+			Assert.AreEqual("5",   dataRow["outputStr"]);
+			Assert.AreEqual("510", dataRow["inputOutputStr"]);
+		}
+#endif
+		
+		[Test]
+		public void CreateParametersTest()
+		{
+			using (var db = new DbManager())
+			{
+				var dt = new DataTypeTest
+				{
+					ID        = 12345,
+					Binary_   = new byte[2] {1, 2},
+#if !ORACLE
+					Boolean_  = true,
+					Guid_     = Guid.Empty,
+#endif
+					Byte_     = 250,
+					Bytes_    = new byte[] { 2, 1 },
+					DateTime_ = DateTime.Now,
+					Decimal_  = 9876543210.0m,
+					Double_   = 12345.67890,
+					Int16_    = 12345,
+					Int32_    = 1234567890,
+					Int64_    = 1234567890123456789,
+					Money_    = 99876543210.0m,
+					Single_   = 1234.0f,
+					String_   = "Crazy Frog",
+
+					Char_     = 'F',
+					SByte_    = 123,
+					//UInt16_   = 65432,
+					//UInt32_   = 4000000000,
+					//UInt64_   = 12345678901234567890,
+#if !SQLCE
+					Stream_   = new MemoryStream(5),
+					Xml_      = new XmlTextReader(new StringReader("<xml/>")),
+					XmlDoc_   = new XmlDocument(),
+#endif
+				};
+
+				dt.XmlDoc_.LoadXml("<xmldoc/>");
+
+				var parameters = db.CreateParameters(dt);
+
+				Assert.IsNotNull(parameters);
+				Assert.AreEqual(ObjectMapper<DataTypeTest>.Instance.Count, parameters.Length);
+
+				foreach (MemberMapper mm in ObjectMapper<DataTypeTest>.Instance)
+				{
+					var paramName = (string)db.DataProvider.Convert(mm.Name, db.GetConvertTypeToParameter());
+					var p         = parameters.First(obj => obj.ParameterName == paramName);
+
+					Assert.IsNotNull(p);
+					Assert.AreEqual(mm.GetValue(dt), p.Value);
+				}
+			}
+		}
+
+#if!ORACLE
+		[Test]
+#endif
+		public void CreateParametersSqlTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				DataTypeSqlTest dt = new DataTypeSqlTest();
+				
+				dt.ID        = 12345;
+				dt.Binary_   = new SqlBinary(new byte[2] {1, 2});
+				dt.Boolean_  = new SqlBoolean(1);
+				dt.Byte_     = new SqlByte(250);
+				dt.DateTime_ = new SqlDateTime(DateTime.Now);
+				dt.Decimal_  = new SqlDecimal(9876543210.0m);
+				dt.Double_   = new SqlDouble(12345.67890);
+				dt.Guid_     = new SqlGuid(Guid.Empty);
+				dt.Int16_    = new SqlInt16(12345);
+				dt.Int32_    = new SqlInt32(1234567890);
+				dt.Int64_    = new SqlInt64(1234567890123456789);
+				dt.Money_    = new SqlMoney(99876543210.0m);
+				dt.Single_   = new SqlSingle(1234.0f);
+				dt.String_   = new SqlString("Crazy Frog");
+
+#if !SQLCE
+				dt.Bytes_    = new SqlBytes(new byte[2] {2, 1});
+				dt.Chars_    = new SqlChars(new char[2] {'B', 'L'});
+				dt.Xml_      = new SqlXml(new XmlTextReader(new StringReader("<xml/>")));
+#endif
+
+				var parameters = db.CreateParameters(dt);
+
+				Assert.IsNotNull(parameters);
+				Assert.AreEqual(ObjectMapper<DataTypeSqlTest>.Instance.Count, parameters.Length);
+
+				foreach (MemberMapper mm in ObjectMapper<DataTypeSqlTest>.Instance)
+				{
+					var pName = (string)db.DataProvider.Convert(mm.Name, db.GetConvertTypeToParameter());
+					var p     = Array.Find(parameters, obj => obj.ParameterName == pName);
+
+					Assert.IsNotNull(p);
+					Assert.AreEqual(mm.GetValue(dt), p.Value);
+				}
+			}
+		}
+
+		public struct DBInfo
+		{
+			public DateTime TimeValue;
+		}
+		
+		[Test]
+		public void CreateParametersStructTest()
+		{
+			var dbInfo = new DBInfo { TimeValue = DateTime.Now };
+
+			using (var db = new DbManager())
+			{
+				var parameters = db.CreateParameters(dbInfo);
+				
+				Assert.IsNotNull(parameters);
+				Assert.AreEqual(1, parameters.Length);
+				Assert.AreEqual(dbInfo.TimeValue, parameters[0].Value);
+				
+			}
+		}
+
+		public class FirstPart
+		{
+			public string FirstName;
+		}
+
+		public class SecondPart
+		{
+			public string LastName;
+		}
+
+#if !SQLITE && !SQLCE
+		[Test]
+#endif
+		public void CreateManyParametersTest()
+		{
+			FirstPart  f = new FirstPart();
+			SecondPart s = new SecondPart();
+
+			f.FirstName = "John";
+			s.LastName = "Pupkin";
+
+			using (DbManager db = new DbManager())
+			{
+				Person p = (Person)db
+					.SetSpCommand ("Person_SelectByName", db.CreateParameters(f), db.CreateParameters(s))
+					.ExecuteObject(typeof(Person));
+				
+				Assert.IsNotNull(p);
+				Assert.AreEqual(f.FirstName, p.FirstName);
+				Assert.AreEqual(s.LastName,  p.LastName);
+			}
+		}
+
+		[Test]
+		public void EnumExecuteScalarTest1()
+		{
+			using (var dbm = new DbManager())
+			{
+				var gender = dbm.SetCommand(CommandType.Text, "select 'M'")
+								.ExecuteScalar<Gender>();
+
+				Assert.That(gender, Is.EqualTo(Gender.Male));
+			}
+		}
+
+		public enum ABType
+		{
+			Error = -1,
+			A = 0,
+			B,
+		}
+
+		[Test]
+		public void EnumExecuteScalarTest2()
+		{
+			using (var db = new DbManager())
+			{
+				var type = db.SetCommand("select 1 where 1 = 2").ExecuteScalar<ABType>();
+				Assert.That(type, Is.EqualTo(ABType.A));
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/EventsTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,64 @@
+using System;
+using NUnit.Framework;
+using BLToolkit.Data;
+
+namespace Data
+{
+	[TestFixture]
+	public class EventsTest
+	{
+		[Test]
+		public void BeforeAfterInitTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				db.BeforeOperation += HandleBeforeOperation;
+				db.AfterOperation  += HandleAfterOperation;
+				db.InitCommand     += HandleInitCommand;
+
+				db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteDataSet();
+			}
+		}
+
+		private static void HandleBeforeOperation(object sender, OperationTypeEventArgs ea)
+		{
+			Console.WriteLine("Before operation: " + ea.Operation);
+		}
+
+		private static void HandleAfterOperation(object sender, OperationTypeEventArgs ea)
+		{
+			Console.WriteLine("After operation:  " + ea.Operation);
+		}
+
+		private static void HandleInitCommand(object sender, InitCommandEventArgs ea)
+		{
+			Console.WriteLine("Init command:  " + ea.Command.CommandText);
+		}
+
+		[Test, ExpectedException(typeof(DataException))]
+		public void ExceptionTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				db.OperationException += HandleOperationException;
+
+				db
+					.SetCommand("SELECT * FROM NoSuchTableEverExist")
+					.ExecuteDataSet();
+			}
+		}
+
+		private static void HandleOperationException(object sender, OperationExceptionEventArgs ea)
+		{
+			Assert.That(ea, Is.Not.Null);
+			Assert.That(ea.Exception, Is.Not.Null);
+			Assert.That(ea.Exception.Number, Is.Not.Null);
+
+			Console.WriteLine("Operation:    " + ea.Operation);
+			Console.WriteLine("Error number: " + ea.Exception.Number);
+			Console.WriteLine("Exception:    " + ea.Exception.GetBaseException().Message);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/ExecuteDictionaryTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,278 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Common;
+using BLToolkit.Data;
+using BLToolkit.Mapping;
+
+namespace Data
+{
+	[TestFixture]
+	public class ExecuteDictionaryTest
+	{
+
+#if ORACLE
+		private const decimal _id = 1m;
+#elif SQLITE
+		private const long    _id = 1;
+#else
+		private const int     _id = 1;
+#endif
+
+		public enum Gender
+		{
+			[MapValue("F")] Female,
+			[MapValue("M")] Male,
+			[MapValue("U")] Unknown,
+			[MapValue("O")] Other
+		}
+
+		public class Person
+		{
+			[MapField("PersonID")]
+			public int    ID;
+			public string FirstName;
+			public string MiddleName;
+			public string LastName;
+			public Gender Gender;
+		}
+		
+		[Test]
+		public void DictionaryTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				Hashtable table = db
+#if SQLITE || SQLCE
+					.SetCommand("SELECT * FROM Person")
+#else
+					.SetSpCommand("Person_SelectAll")
+#endif
+					.ExecuteDictionary("ID", typeof(Person));
+
+				Assert.IsNotNull(table);
+				Assert.IsTrue(table.Count > 0);
+
+				Person actualValue = (Person)table[1];
+				Assert.IsNotNull(actualValue);
+				Assert.AreEqual("John", actualValue.FirstName);
+			}
+		}
+
+		[Test]
+		public void DictionaryTest2()
+		{
+			using (DbManager db = new DbManager())
+			{
+				Hashtable table = new Hashtable();
+				db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteDictionary(table, "@PersonID", typeof(Person));
+
+				Assert.IsNotNull(table);
+				Assert.IsTrue(table.Count > 0);
+
+				Person actualValue = (Person)table[_id];
+				Assert.IsNotNull(actualValue);
+				Assert.AreEqual("John", actualValue.FirstName);
+			}
+		}
+
+		[Test]
+		public void DictionaryTest3()
+		{
+			using (DbManager db = new DbManager())
+			{
+				Hashtable table = db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteDictionary(0, typeof(Person));
+
+				Assert.IsNotNull(table);
+				Assert.IsTrue(table.Count > 0);
+
+				Person actualValue = (Person)table[1];
+				Assert.IsNotNull(actualValue);
+				Assert.AreEqual("John", actualValue.FirstName);
+			}
+		}
+
+		[Test]
+		public void DictionaryMapIndexTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				Hashtable table = new Hashtable();
+					db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteDictionary(table, new MapIndex("ID"), typeof(Person));
+
+				Assert.IsNotNull(table);
+				Assert.IsTrue(table.Count > 0);
+
+				Person actualValue = (Person)table[new CompoundValue(1)];
+				Assert.IsNotNull(actualValue);
+				Assert.AreEqual("John", actualValue.FirstName);
+			}
+		}
+
+		[Test]
+		public void DictionaryMapIndexTest2()
+		{
+			using (DbManager db = new DbManager())
+			{
+				Hashtable table = db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteDictionary(new MapIndex(0), typeof(Person));
+
+				Assert.IsNotNull(table);
+				Assert.IsTrue(table.Count > 0);
+
+				Person actualValue = (Person)table[new CompoundValue(1)];
+				Assert.IsNotNull(actualValue);
+				Assert.AreEqual("John", actualValue.FirstName);
+			}
+		}
+
+
+		[Test]
+		public void DictionaryMapIndexTest3()
+		{
+			using (DbManager db = new DbManager())
+			{
+				Hashtable table = new Hashtable();
+				db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteDictionary(table,
+					new MapIndex("@PersonID", 2, 3), typeof(Person));
+
+				Assert.IsNotNull(table);
+				Assert.IsTrue(table.Count > 0);
+
+				Person actualValue = (Person)table[new CompoundValue(_id, "", "Pupkin")];
+				Assert.IsNotNull(actualValue);
+				Assert.AreEqual("John", actualValue.FirstName);
+			}
+		}
+
+		[Test]
+		public void GenericsDictionaryTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				Dictionary<int, Person> dic = db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteDictionary<int, Person>("ID");
+
+				Assert.IsNotNull(dic);
+				Assert.IsTrue(dic.Count > 0);
+
+				Person actualValue = dic[1];
+				Assert.IsNotNull(actualValue);
+				Assert.AreEqual("John", actualValue.FirstName);
+			}
+		}
+
+		[Test]
+		public void GenericsDictionaryTest2()
+		{
+			using (DbManager db = new DbManager())
+			{
+#if ORACLE
+				Dictionary<decimal, Person> dic = new Dictionary<decimal, Person>();
+#elif SQLITE
+				Dictionary<long, Person> dic = new Dictionary<long, Person>();
+#else
+				Dictionary<int, Person> dic = new Dictionary<int, Person>();
+#endif
+					db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteDictionary(dic, "@PersonID");
+
+				Assert.IsNotNull(dic);
+				Assert.IsTrue(dic.Count > 0);
+
+				Person actualValue = dic[_id];
+				Assert.IsNotNull(actualValue);
+				Assert.AreEqual("John", actualValue.FirstName);
+			}
+		}
+
+		[Test]
+		public void GenericsDictionaryTest3()
+		{
+			using (DbManager db = new DbManager())
+			{
+				Dictionary<int, Person> dic = db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteDictionary<int, Person>(0);
+
+				Assert.IsNotNull(dic);
+				Assert.IsTrue(dic.Count > 0);
+
+				Person actualValue = dic[1];
+				Assert.IsNotNull(actualValue);
+				Assert.AreEqual("John", actualValue.FirstName);
+			}
+		}
+
+		[Test]
+		public void GenericsDictionaryMapIndexTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				Dictionary<CompoundValue, Person> dic = db
+					.SetCommand("SELECT * FROM Person WHERE PersonID < 3")
+					.ExecuteDictionary<Person>(new MapIndex("LastName"));
+
+				Assert.IsNotNull(dic);
+				Assert.IsTrue(dic.Count > 0);
+
+				Person actualValue = dic[new CompoundValue("Pupkin")];
+				Assert.IsNotNull(actualValue);
+				Assert.AreEqual("John", actualValue.FirstName);
+			}
+		}
+
+		[Test]
+		public void GenericsDictionaryMapIndexTest2()
+		{
+			using (DbManager db = new DbManager())
+			{
+				Dictionary<CompoundValue, Person> dic = new Dictionary<CompoundValue, Person>();
+					db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteDictionary(dic, new MapIndex(0));
+
+				Assert.IsNotNull(dic);
+				Assert.IsTrue(dic.Count > 0);
+
+				Person actualValue = dic[new CompoundValue(1)]; ;
+				Assert.IsNotNull(actualValue);
+				Assert.AreEqual("John", actualValue.FirstName);
+			}
+		}
+
+		[Test]
+		public void GenericsDictionaryMapIndexTest3()
+		{
+			using (DbManager db = new DbManager())
+			{
+				Dictionary<CompoundValue, Person> dic = new Dictionary<CompoundValue, Person>();
+					db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteDictionary(dic, new MapIndex("@PersonID", 2, 3));
+
+				Assert.IsNotNull(dic);
+				Assert.IsTrue(dic.Count > 0);
+
+				Person actualValue = dic[new CompoundValue(_id, "", "Pupkin")];
+				Assert.IsNotNull(actualValue);
+				Assert.AreEqual("John", actualValue.FirstName);
+				
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/ExecuteForEach.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,126 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+
+namespace Data
+{
+	[TestFixture]
+	public class ExecuteForEach
+	{
+		public class TypeWrapper<T>
+		{
+			public TypeWrapper(T value)
+			{
+				_value = value;
+			}
+
+			private T _value;
+			public  T  Value
+			{
+				get { return _value;  }
+				set { _value = value; }
+			}
+		}
+
+		[Test]
+		public void TestFixedTypes()
+		{
+			RunTest(new int[] { 1, 2, 3, 4 });
+			RunTest(new bool[] { true, false });
+			RunTest(new DateTime[] { DateTime.Now, DateTime.Today });
+			RunTest(new double[] { 1, 2, 3, 4 });
+		}
+
+		[Test]
+		public void TestVarTypes()
+		{
+			RunTest(new byte[][] { new byte[] { 1, 2 }, new byte[] { 3, 4 } });
+			RunTest(new char[][] { new char[] { '1', '2' }, new char[] { '3', '4' } });
+		}
+
+		[Test]
+		public void TestDecimal()
+		{
+			RunTest(new decimal[] { 1, 2, 3, 4 });
+		}
+
+		[Test]
+		public void TestString()
+		{
+			RunTest(new string[] { "1", "2", "3", "4" });
+		}
+
+		public class Item
+		{
+			public int    Length;
+			public string Name;
+
+			public Item(string s)
+			{
+				Length = s.Length;
+				Name = s;
+			}
+
+			public Item()
+			{
+				Name = string.Empty;
+			}
+		}
+
+		[Test]
+		public void TestStringWithDiffLength()
+		{
+			List<Item> test = new List<Item>();
+			test.Add(new Item("aaaa"));
+			test.Add(new Item("bb"));
+			test.Add(new Item("ccccccc"));
+
+			using (DbManager db = new DbManager())
+			{
+				db
+					.BeginTransaction()
+					.SetCommand(
+					@"if exists (select 1 from  sysobjects where  id = object_id('_tmp'))
+							drop table _tmp
+					create table _tmp ( Length int, name varchar(50) )")
+					.ExecuteNonQuery();
+
+
+				db
+					.SetCommand(CommandType.Text,
+						"insert into _tmp ( [Length], [name] ) VALUES ( @Length, @name )")
+					.ExecuteForEach<Item>(test);
+
+				List<Item> actial = db
+					.SetCommand("select [Length], [name] from _tmp order by [Name]")
+					.ExecuteList<Item>();
+
+				Assert.AreEqual(test.Count, actial.Count);
+
+				for (int i = 0; i < test.Count; ++i)
+				{
+					Assert.AreEqual(test[i].Length, actial[i].Length);
+					Assert.AreEqual(test[i].Name,   actial[i].Name);
+				}
+			}
+		}
+
+		private static void RunTest<T>(T[] args)
+		{
+			List<TypeWrapper<T>> col = new List<TypeWrapper<T>>();
+
+			col.AddRange(Array.ConvertAll<T, TypeWrapper<T>>(args, delegate(T val) { return new TypeWrapper<T>(val); }));
+
+			using (DbManager db = new DbManager())
+			{
+				db
+					.SetCommand(@"SELECT @Value as 'value'")
+					.ExecuteForEach<TypeWrapper<T>>(col);
+			}
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/ExecuteListT.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,85 @@
+using System.Collections.Generic;
+using BLToolkit.Reflection;
+using NUnit.Framework;
+
+using BLToolkit.Data;
+
+namespace Data
+{
+	[TestFixture]
+	public class ExecuteListT
+	{
+		public class SimpleObject
+		{
+			public SimpleObject()
+			{
+			}
+
+			public SimpleObject(InitContext context)
+			{
+				if (context.Parameters != null)
+				{
+					Assert.AreEqual(2, context.Parameters.Length);
+					Assert.AreEqual("123", context.Parameters[0]);
+					Assert.AreEqual("456", context.Parameters[1]);
+				}
+			}
+
+			private int    _key;   public int    Key   { get { return _key;   } set { _key   = value; } }
+			private string _value; public string Value { get { return _value; } set { _value = value; } }
+		}
+
+		[Test]
+		public void Test()
+		{
+			using (DbManager db = new DbManager())
+			{
+				List<SimpleObject> list = new List<SimpleObject>();
+
+				db
+#if MSSQL || SQLCE
+					.SetCommand(@"
+						SELECT 0 as [Key], 'value0' as Value UNION
+						SELECT 1 as [Key], 'value1' as Value UNION
+						SELECT 2 as [Key], 'value2' as Value")
+
+#else // ORACLE || FIREBIRD || ACCESS
+
+					.SetCommand(@"
+						SELECT 0 as ""Key"", 'value0' as ""Value"" FROM Dual UNION
+						SELECT 1 as ""Key"", 'value1' as ""Value"" FROM Dual UNION
+						SELECT 2 as ""Key"", 'value2' as ""Value"" FROM Dual")
+#endif
+					.ExecuteList<SimpleObject>(list);
+
+				Assert.IsTrue(list.Count > 0);
+			}
+		}
+
+		[Test]
+		public void ParamsTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				List<SimpleObject> list = db
+#if MSSQL || SQLCE
+					.SetCommand(@"
+						SELECT 0 as [Key], 'value0' as Value UNION
+						SELECT 1 as [Key], 'value1' as Value UNION
+						SELECT 2 as [Key], 'value2' as Value")
+
+#else // ORACLE || FIREBIRD || ACCESS
+
+					.SetCommand(@"
+						SELECT 0 as ""Key"", 'value0' as ""Value"" FROM Dual UNION
+						SELECT 1 as ""Key"", 'value1' as ""Value"" FROM Dual UNION
+						SELECT 2 as ""Key"", 'value2' as ""Value"" FROM Dual")
+#endif
+					.ExecuteList<SimpleObject>("123", "456");
+
+				Assert.IsNotEmpty(list);
+				Assert.IsInstanceOf(typeof(SimpleObject), list[0]);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/ExecuteObjectTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,109 @@
+using System;
+using NUnit.Framework;
+using BLToolkit.Reflection;
+using BLToolkit.Mapping;
+using BLToolkit.Data;
+using System.Collections.Generic;
+
+namespace UnitTests.CS.Data
+{
+	[TestFixture]
+	public class ExecuteObjectTest
+	{
+		const string _query = @"  SELECT 1 AS PersonId, '1' AS FirstName, '1' AS MiddleName, '1' AS LastName
+							UNION SELECT 2 AS PersonId, '2' AS FirstName, '2' AS MiddleName, '2' AS LastName
+							UNION SELECT 3 AS PersonId, '3' AS FirstName, '3' AS MiddleName, '3' AS LastName
+							UNION SELECT 4 AS PersonId, '4' AS FirstName, '0' AS MiddleName, '4' AS LastName
+							UNION SELECT 5 AS PersonId, '5' AS FirstName, '1' AS MiddleName, '5' AS LastName
+							UNION SELECT 6 AS PersonId, '6' AS FirstName, '2' AS MiddleName, '6' AS LastName
+							UNION SELECT 7 AS PersonId, '7' AS FirstName, '3' AS MiddleName, '7' AS LastName
+							UNION SELECT 8 AS PersonId, '8' AS FirstName, '0' AS MiddleName, '8' AS LastName";
+
+		[ObjectFactory(typeof(Person.Factory))]
+		public class Person
+		{
+			public class Factory : IObjectFactory
+			{
+				public static Type GetType(int id)
+				{
+					int r = id % 4;
+
+					switch (r)
+					{
+						case 0:
+							return typeof(Person);
+						case 1:
+							return typeof(Person1);
+						case 2:
+							return typeof(Person2);
+						default:
+							return typeof(Person3);
+					}
+				}
+
+				#region IObjectFactory Members
+
+				public object CreateInstance(TypeAccessor typeAccessor, InitContext context)
+				{
+					int id = context.DataSource.GetInt32(context.SourceObject,
+						context.DataSource.GetOrdinal("PersonId"));
+					
+					context.ObjectMapper = context.MappingSchema.GetObjectMapper(Factory.GetType(id));
+
+					return context.ObjectMapper.TypeAccessor.CreateInstance(context);
+				}
+
+				#endregion
+			}
+
+			public int    PersonId;
+			public string FirstName;
+		}
+
+		public class Person1 : Person 
+		{ 
+			public string MiddleName;
+		}
+
+		public class Person2 : Person
+		{
+			public string LastName;
+		}
+
+		public class Person3 : Person 
+		{ 
+			public string MiddleName;
+			public string LastName;
+		}
+
+		[Test]
+		public void PerfomanceTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+
+				List<Person> list = db.SetCommand(_query)
+					.ExecuteList<Person>();
+
+				foreach (Person a in list)
+				{
+					Assert.AreEqual(Person.Factory.GetType(a.PersonId), a.GetType());
+
+					Assert.AreEqual(a.PersonId.ToString(), a.FirstName);
+
+					if (a is Person2)
+						Assert.AreEqual(a.PersonId.ToString(), (a as Person2).LastName);
+
+					if (a is Person1)
+						Assert.AreEqual((a.PersonId % 4).ToString(), (a as Person1).MiddleName);
+
+					if (a is Person3)
+					{
+						Assert.AreEqual(a.PersonId.ToString(),       (a as Person3).LastName);
+						Assert.AreEqual((a.PersonId % 4).ToString(), (a as Person3).MiddleName);
+					}
+				}
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/ExecuteScalarDictionaryTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,370 @@
+using System.Collections;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Common;
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace Data
+{
+	[TestFixture]
+	public class ExecuteScalarDictionaryTest
+	{
+		public class Person
+		{
+			[MapField("PersonID"), PrimaryKey]
+			public int    ID;
+			public string LastName;
+			public string FirstName;
+			public string MiddleName;
+		}
+
+		[TestFixtureSetUp]
+		public void SetUp()
+		{
+			var da = new SqlQuery();
+
+			foreach (Person p in da.SelectAll(typeof(Person)))
+				if (p.ID > 10 || p.FirstName == "Crazy")
+					da.DeleteByKey(typeof(Person), p.ID);
+		}
+
+		[Test]
+		public void ScalarDictionaryTest()
+		{
+			using (var db = new DbManager())
+			{
+				var table = db
+#if SQLITE || SQLCE
+					.SetCommand("SELECT * FROM Person")
+#else
+					.SetSpCommand("Person_SelectAll")
+#endif
+					.ExecuteScalarDictionary("PersonID", typeof(int),
+						"FirstName", typeof(string));
+
+				Assert.IsNotNull(table);
+				Assert.IsTrue(table.Count > 0);
+			}
+		}
+
+		[Test]
+		public void ScalarDictionaryTest2()
+		{
+			using (var db = new DbManager())
+			{
+				var table = new Hashtable();
+					db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteScalarDictionary(table,
+						"PersonID", typeof(int), "FirstName", typeof(string));
+
+				Assert.IsNotNull(table);
+				Assert.IsTrue(table.Count > 0);
+			}
+		}
+
+		[Test]
+		public void ScalarDictionaryTest3()
+		{
+			using (var db = new DbManager())
+			{
+				var table = db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteScalarDictionary(0, typeof(int), 1, typeof(string));
+
+				Assert.IsNotNull(table);
+				Assert.IsTrue(table.Count > 0);
+			}
+		}
+
+		[Test]
+		public void ScalarDictionaryTest4()
+		{
+			using (var db = new DbManager())
+			{
+				var table = new Hashtable();
+					db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteScalarDictionary(table,0, typeof(int), 1, typeof(string));
+
+				Assert.IsNotNull(table);
+				Assert.IsTrue(table.Count > 0);
+			}
+		}
+
+		[Test]
+		public void ScalarDictionaryMapIndexTest()
+		{
+			using (var db = new DbManager())
+			{
+				var table = db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteScalarDictionary(new MapIndex("PersonID"),
+						"FirstName", typeof(string));
+
+				Assert.IsNotNull(table);
+				Assert.IsTrue(table.Count > 0);
+			}
+		}
+
+		[Test]
+		public void ScalarDictionaryMapIndexTest2()
+		{
+			using (var db = new DbManager())
+			{
+				var table = new Hashtable();
+				db
+					.SetCommand("SELECT * FROM Person")
+				.ExecuteScalarDictionary(table,
+					new MapIndex("PersonID"), 1, typeof(string));
+
+				Assert.IsNotNull(table);
+				Assert.IsTrue(table.Count > 0);
+			}
+		}
+
+		[Test]
+		public void ScalarDictionaryMapIndexTest3()
+		{
+			using (var db = new DbManager())
+			{
+				var table = db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteScalarDictionary(new MapIndex(0),
+						"FirstName", typeof(string));
+
+				Assert.IsNotNull(table);
+				Assert.IsTrue(table.Count > 0);
+			}
+		}
+
+		[Test]
+		public void ScalarDictionaryMapIndexTest4()
+		{
+			using (var db = new DbManager())
+			{
+				var table = new Hashtable();
+				db
+					.SetCommand("SELECT * FROM Person")
+				.ExecuteScalarDictionary(table,
+					new MapIndex("PersonID"), 1, typeof(string));
+
+				Assert.IsNotNull(table);
+				Assert.IsTrue(table.Count > 0);
+			}
+		}
+
+		[Test]
+		public void ScalarDictionaryMapIndexTest5()
+		{
+			using (var db = new DbManager())
+			{
+				var table = new Hashtable();
+				db
+					.SetCommand("SELECT * FROM Person")
+				.ExecuteScalarDictionary(table,
+					new MapIndex(0, 1, 2), 1, typeof(string));
+
+				Assert.IsNotNull(table);
+				Assert.IsTrue(table.Count > 0);
+			}
+		}
+
+		[Test]
+		public void ScalarDictionaryMapIndexTest6()
+		{
+			using (var db = new DbManager())
+			{
+				var table = new Hashtable();
+				db
+					.SetCommand("SELECT * FROM Person")
+				.ExecuteScalarDictionary(table,
+					new MapIndex("PersonID", "FirstName", "LastName"), 1, typeof(string));
+
+				Assert.IsNotNull(table);
+				Assert.IsTrue(table.Count > 0);
+			}
+		}
+
+		[Test]
+		public void ScalarDictionaryMapIndexTest7()
+		{
+			using (var db = new DbManager())
+			{
+				var table = new Hashtable();
+				db
+					.SetCommand("SELECT * FROM Person")
+				.ExecuteScalarDictionary(table,
+					new MapIndex("PersonID", 2, 3), 1, typeof(string));
+
+				Assert.IsNotNull(table);
+				Assert.IsTrue(table.Count > 0);
+			}
+		}
+
+		[Test]
+		public void GenericsScalarDictionaryTest()
+		{
+			using (var db = new DbManager())
+			{
+				var dic = db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteScalarDictionary<int, string>("PersonID", "FirstName");
+
+				Assert.IsNotNull(dic);
+				Assert.IsTrue(dic.Count > 0);
+			}
+		}
+
+		[Test]
+		public void GenericsScalarDictionaryTest2()
+		{
+			using (var db = new DbManager())
+			{
+				var dic = new Dictionary<int, string>();
+				db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteScalarDictionary(dic, "PersonID", "FirstName");
+
+				Assert.IsNotNull(dic);
+				Assert.IsTrue(dic.Count > 0);
+			}
+		}
+
+		[Test]
+		public void GenericsScalarDictionaryTest3()
+		{
+			using (var db = new DbManager())
+			{
+				var dic = db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteScalarDictionary<int, string>(0, 1);
+
+				Assert.IsNotNull(dic);
+				Assert.IsTrue(dic.Count > 0);
+			}
+		}
+
+		[Test]
+		public void GenericsScalarDictionaryTest4()
+		{
+			using (var db = new DbManager())
+			{
+				var dic = new Dictionary<int, string>();
+					db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteScalarDictionary(dic, 0, 1);
+
+				Assert.IsNotNull(dic);
+				Assert.IsTrue(dic.Count > 0);
+			}
+		}
+
+		[Test]
+		public void GenericsScalarDictionaryMapIndexTest()
+		{
+			using (var db = new DbManager())
+			{
+				var dic = db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteScalarDictionary<string>(new MapIndex("LastName"), "FirstName");
+
+				Assert.IsNotNull(dic);
+				Assert.IsTrue(dic.Count > 0);
+			}
+		}
+
+		[Test]
+		public void GenericsScalarDictionaryMapIndexTest2()
+		{
+			using (var db = new DbManager())
+			{
+				var dic = new Dictionary<CompoundValue, string>();
+					db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteScalarDictionary(dic, new MapIndex("LastName"), 1);
+
+				Assert.IsNotNull(dic);
+				Assert.IsTrue(dic.Count > 0);
+			}
+		}
+
+		[Test]
+		public void GenericsScalarDictionaryMapIndexTest3()
+		{
+			using (var db = new DbManager())
+			{
+				var dic = db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteScalarDictionary<string>(new MapIndex(2), "FirstName");
+
+				Assert.IsNotNull(dic);
+				Assert.IsTrue(dic.Count > 0);
+			}
+		}
+
+		[Test]
+		public void GenericsScalarDictionaryMapIndexTest4()
+		{
+			using (var db = new DbManager())
+			{
+				var dic = new Dictionary<CompoundValue, string>();
+				db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteScalarDictionary(dic, new MapIndex(0), 2);
+
+				Assert.IsNotNull(dic);
+				Assert.IsTrue(dic.Count > 0);
+			}
+		}
+
+		[Test]
+		public void GenericsScalarDictionaryMapIndexTest5()
+		{
+			using (var db = new DbManager())
+			{
+				var dic = new Dictionary<CompoundValue, string>();
+				db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteScalarDictionary(dic, new MapIndex(0, 1, 2), 2);
+
+				Assert.IsNotNull(dic);
+				Assert.IsTrue(dic.Count > 0);
+			}
+		}
+
+		[Test]
+		public void GenericsScalarDictionaryMapIndexTest6()
+		{
+			using (var db = new DbManager())
+			{
+				var dic = new Dictionary<CompoundValue, string>();
+				db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteScalarDictionary(dic, new MapIndex("PersonID", "FirstName", "LastName"), 2);
+
+				Assert.IsNotNull(dic);
+				Assert.IsTrue(dic.Count > 0);
+			}
+		}
+
+		[Test]
+		public void GenericsScalarDictionaryMapIndexTest7()
+		{
+			using (var db = new DbManager())
+			{
+				var dic = new Dictionary<CompoundValue, string>();
+				db
+					.SetCommand("SELECT * FROM Person")
+					.ExecuteScalarDictionary(dic, new MapIndex("PersonID", 2, 3), "LastName");
+
+				Assert.IsNotNull(dic);
+				Assert.IsTrue(dic.Count > 0);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/ExecuteScalarListTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,318 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Data.SqlTypes;
+using System.IO;
+using System.Xml;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+
+namespace Data
+{
+	[TestFixture]
+	public class ExecuteScalarListTest
+	{
+		//[TestFixtureSetUp]
+		public void SetUp()
+		{
+			using (var db = new DbManager())
+			{
+				var query = "INSERT INTO Person(FirstName, LastName, Gender) SELECT FirstName, LastName, Gender FROM Person";
+
+				db.SetCommand(query).ExecuteNonQuery(); // 4
+				db.SetCommand(query).ExecuteNonQuery(); // 8
+				db.SetCommand(query).ExecuteNonQuery(); // 16
+				db.SetCommand(query).ExecuteNonQuery(); // 32
+				db.SetCommand(query).ExecuteNonQuery(); // 64
+				db.SetCommand(query).ExecuteNonQuery(); // 128
+				db.SetCommand(query).ExecuteNonQuery(); // 256
+				db.SetCommand(query).ExecuteNonQuery(); // 512
+				db.SetCommand(query).ExecuteNonQuery(); // 1024
+				db.SetCommand(query).ExecuteNonQuery(); // 2048
+				db.SetCommand(query).ExecuteNonQuery(); // 4096
+				db.SetCommand(query).ExecuteNonQuery(); // 8192
+				db.SetCommand(query).ExecuteNonQuery(); // 16384
+				db.SetCommand(query).ExecuteNonQuery(); // 32768
+				db.SetCommand(query).ExecuteNonQuery(); // 65536
+				db.SetCommand(query).ExecuteNonQuery(); // 128k
+				db.SetCommand(query).ExecuteNonQuery(); // 256k
+				db.SetCommand(query).ExecuteNonQuery(); // 512k
+				db.SetCommand(query).ExecuteNonQuery(); // 1m
+			}
+		}
+
+		//[TestFixtureTearDown]
+		public void TearDown()
+		{
+			using (var db = new DbManager())
+			{
+				db.SetCommand("DELETE FROM Person WHERE PersonID > 2").ExecuteNonQuery();
+			}
+		}
+
+		[Test]
+		public void ScalarListTest()
+		{
+			using (var db = new DbManager())
+			{
+				var array = db
+#if SQLITE || SQLCE || SQLCE
+					.SetCommand("SELECT * FROM Person")
+#else
+					.SetSpCommand("Person_SelectAll")
+#endif
+					.ExecuteScalarList(typeof(int));
+
+				Assert.IsNotNull(array);
+				Assert.IsTrue(array.Count > 0);
+			}
+		}
+
+		[Test]
+		public void ScalarListTest2()
+		{
+			using (var db = new DbManager())
+			{
+				var array = new ArrayList();
+
+				db.SetCommand("SELECT * FROM Person").ExecuteScalarList(array, typeof(int));
+
+				Assert.IsNotNull(array);
+				Assert.IsTrue(array.Count > 0);
+			}
+		}
+
+		[Test]
+		public void ScalarListTest3()
+		{
+			using (var db = new DbManager())
+			{
+				var array = db.SetCommand("SELECT * FROM Person").ExecuteScalarList(typeof(string),1);
+
+				Assert.IsNotNull(array);
+				Assert.IsTrue(array.Count > 0);
+			}
+		}
+
+		[Test]
+		public void ScalarListTest4()
+		{
+			using (var db = new DbManager())
+			{
+				var array = new ArrayList();
+
+				db.SetCommand("SELECT * FROM Person").ExecuteScalarList(array, typeof(string), "LastName");
+
+				Assert.IsNotNull(array);
+				Assert.IsTrue(array.Count > 0);
+			}
+		}
+
+		[Test]
+		public void GenericsScalarListTest()
+		{
+			var cmd = "SELECT PersonID FROM Person UNION ALL SELECT NULL";
+#if !MSSQL && !SQLCE
+			cmd += " FROM dual";
+#endif
+
+			using (var db = new DbManager())
+			{
+				var array = db.SetCommand(cmd).ExecuteScalarList<int?>();
+
+				Assert.IsNotNull(array);
+				Assert.IsTrue(array.Count > 0);
+				Assert.IsNull(array[array.Count - 1]);
+			}
+		}
+
+		[Test]
+		public void GenericsScalarListTest2()
+		{
+			var cmd = "SELECT PersonID FROM Person UNION ALL SELECT NULL";
+#if !MSSQL && !SQLCE
+			cmd += " FROM dual";
+#endif
+			using (var db = new DbManager())
+			{
+				var array = new List<int>();
+
+				db.SetCommand(cmd).ExecuteScalarList(array);
+
+				Assert.IsNotNull(array);
+				Assert.IsTrue(array.Count > 0);
+				Console.WriteLine("Records processed: {0}", array.Count);
+			}
+		}
+
+		[Test]
+		public void GenericsScalarListTest3()
+		{
+			using (var db = new DbManager())
+			{
+				var array = db.SetCommand("SELECT * FROM Person").ExecuteScalarList<string>(1);
+
+				Assert.IsNotNull(array);
+				Assert.IsTrue(array.Count > 0);
+			}
+		}
+
+		[Test]
+		public void GenericsScalarListTest4()
+		{
+			using (var db = new DbManager())
+			{
+				var array = new List<string>();
+
+				db.SetCommand("SELECT * FROM Person").ExecuteScalarList(array, "LastName");
+
+				Assert.IsNotNull(array);
+				Assert.IsTrue(array.Count > 0);
+			}
+		}
+
+		[Test]
+		public void GenericsScalarListTest5()
+		{
+			using (var db = new DbManager())
+			{
+				var cmd = "SELECT PersonID FROM Person UNION ALL SELECT NULL";
+#if !MSSQL && !SQLCE
+				cmd += " FROM dual";
+#endif
+				var array = db.SetCommand(cmd).ExecuteScalarList<uint?>();
+
+				Assert.IsNotNull(array);
+				Assert.IsTrue(array.Count > 0);
+				Assert.IsNull(array[array.Count - 1]);
+			}
+		}
+
+		[Test]
+		public void GenericsScalarListTest6()
+		{
+			using (var db = new DbManager())
+			{
+				var array = new List<uint>();
+
+				db.SetCommand("SELECT * FROM Person").ExecuteScalarList(array);
+
+				Assert.IsNotNull(array);
+				Assert.IsTrue(array.Count > 0);
+			}
+		}
+
+		private List<T> TestType<T>(DbManager db, string columnName) where T : class
+		{
+			var array = db
+				.SetCommand(string.Format("SELECT {0} FROM DataTypeTest ORDER BY DataTypeID", columnName))
+				.ExecuteScalarList<T>();
+
+			Assert.IsNotNull(array);
+			Assert.IsTrue   (array.Count > 1);
+			Assert.IsNotNull(array[1]);
+
+			return array;
+		}
+
+		private List<T?> TestNullableType<T>(DbManager db, string columnName) where T : struct
+		{
+			List<T?> array = db
+				.SetCommand(string.Format("SELECT {0} FROM DataTypeTest ORDER BY DataTypeID", columnName))
+				.ExecuteScalarList<T?>();
+
+			Assert.IsNotNull(array);
+			Assert.IsTrue   (array.Count > 1);
+			Assert.IsNull   (array[0]);
+			Assert.IsTrue   (array[1].HasValue);
+
+			return array;
+		}
+
+		private List<T?> TestINullableType<T>(DbManager db, string columnName) where T : struct, INullable
+		{
+			var array = db
+				.SetCommand(string.Format("SELECT {0} FROM DataTypeTest ORDER BY DataTypeID", columnName))
+				.ExecuteScalarList<T?>();
+
+			Assert.IsNotNull(array);
+			Assert.IsTrue(array.Count > 1);
+			Assert.IsTrue(array[0].HasValue);
+			Assert.IsTrue(array[0].Value.IsNull);
+			Assert.IsTrue(array[1].HasValue);
+
+			return array;
+		}
+
+		[Test]
+		public void GenericsScalarListDataTypesTest()
+		{
+			using (var db = new DbManager())
+			{
+				// Base types
+				//
+				TestNullableType<Boolean>   (db, "Boolean_");
+				TestNullableType<Byte>      (db, "Byte_");
+				TestNullableType<Char>      (db, "Char_");
+				TestNullableType<DateTime>  (db, "DateTime_");
+				TestNullableType<Decimal>   (db, "Decimal_");
+				TestNullableType<Double>    (db, "Double_");
+				TestNullableType<Guid>      (db, "Guid_");
+				TestNullableType<Int16>     (db, "Int16_");
+				TestNullableType<Int32>     (db, "Int32_");
+				TestNullableType<Int64>     (db, "Int64_");
+				TestNullableType<SByte>     (db, "SByte_");
+				TestNullableType<Single>    (db, "Single_");
+				TestType<String>            (db, "String_");
+				TestNullableType<UInt16>    (db, "UInt16_");
+				TestNullableType<UInt32>    (db, "UInt32_");
+				TestNullableType<UInt64>    (db, "UInt64_");
+
+#if !ORACLE
+				// Sql types
+				//
+				TestINullableType<SqlBinary>  (db, "Binary_");
+				TestINullableType<SqlBoolean> (db, "Boolean_");
+				TestINullableType<SqlByte>    (db, "Byte_");
+				TestType<SqlBytes>            (db, "Bytes_");
+				TestType<SqlChars>            (db, "String_");
+				TestINullableType<SqlDateTime>(db, "DateTime_");
+				TestINullableType<SqlDecimal> (db, "Decimal_");
+				TestINullableType<SqlDouble>  (db, "Double_");
+#if !ACCESS
+				TestINullableType<SqlGuid>    (db, "Bytes_");
+#endif
+				TestINullableType<SqlGuid>    (db, "Guid_");
+				TestINullableType<SqlInt16>   (db, "Int16_");
+				TestINullableType<SqlInt32>   (db, "Int32_");
+				TestINullableType<SqlInt64>   (db, "Int64_");
+				TestINullableType<SqlMoney>   (db, "Money_");
+				TestINullableType<SqlString>  (db, "String_");
+				TestINullableType<SqlSingle>  (db, "Single_");
+				TestType<SqlXml>              (db, "Xml_");
+#endif
+				// BLToolkit extension
+				var arrays  = TestType<Byte[]>(db, "Binary_");
+				Console.WriteLine("{0}", arrays[1][0]);
+
+				var streams = TestType<Stream>(db, "Bytes_");
+				Console.WriteLine("{0}", streams[1].ReadByte());
+
+				var symbols = TestType<Char[]>(db, "String_");
+				Assert.AreEqual(symbols[1][0], 's');
+
+				var xmlReaders = TestType<XmlReader>(db, "Xml_");
+				xmlReaders[1].MoveToContent();
+				Assert.IsTrue(xmlReaders[1].ReadToDescendant("element"));
+				Console.WriteLine("{0}", xmlReaders[1].GetAttribute("strattr"));
+
+				var xmlDocs = TestType<XmlDocument>(db, "Xml_");
+				Assert.IsNotNull(xmlDocs[1]);
+				Assert.IsNotNull(xmlDocs[1].DocumentElement);
+				Console.WriteLine("{0}", xmlDocs[1].DocumentElement.GetAttribute("strattr"));
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/ExecuteScalarTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,233 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+
+namespace Data
+{
+	[TestFixture]
+	public class ExecuteScalarTest
+	{
+		[Test]
+		public void RegressionTest()
+		{
+			using (var db = new DbManager())
+			{
+				var expectedValue = 12345;
+				var actualValue   = db.MappingSchema.ConvertToInt32(
+					db
+#if SQLITE || SQLCE
+						.SetCommand("SELECT 12345")
+#else
+						.SetSpCommand("Scalar_DataReader")
+#endif
+						.ExecuteScalar());
+
+				Assert.AreEqual(expectedValue, actualValue);
+			}
+		}
+
+		[Test]
+		public void DataReaderTest()
+		{
+			using (var db = new DbManager())
+			{
+				var expectedValue = 12345;
+				var actualValue   = db.MappingSchema.ConvertToInt32(
+					db
+#if SQLITE || SQLCE
+						.SetCommand("SELECT 12345")
+#else
+						.SetSpCommand("Scalar_DataReader")
+#endif
+						.ExecuteScalar(ScalarSourceType.DataReader));
+				
+				Assert.AreEqual(expectedValue, actualValue);
+			}
+		}
+
+		[Test]
+		public void DataReader2Test()
+		{
+			using (var db = new DbManager())
+			{
+				var expectedValue = "54321";
+				var actualValue   = db.MappingSchema.ConvertToString(
+					db
+#if SQLITE || SQLCE
+						.SetCommand("SELECT 12345, '54321'")
+#else
+						.SetSpCommand("Scalar_DataReader")
+#endif
+						.ExecuteScalar(ScalarSourceType.DataReader, 1));
+
+				Assert.AreEqual(expectedValue, actualValue);
+			}
+		}
+
+		[Test]
+		public void DataReader3Test()
+		{
+			using (var db = new DbManager())
+			{
+				var expectedValue = "54321";
+				var actualValue   = db.MappingSchema.ConvertToString(
+					db
+#if SQLITE || SQLCE
+						.SetCommand("SELECT 12345 intField, '54321' stringField")
+#else
+						.SetSpCommand("Scalar_DataReader")
+#endif
+						.ExecuteScalar(ScalarSourceType.DataReader, "stringField"));
+
+				Assert.AreEqual(expectedValue, actualValue);
+			}
+		}
+		
+#if !ACCESS && !SQLITE && !SQLCE
+		[Test]
+		public void OutputParameterTest()
+		{
+			using (var db = new DbManager())
+			{
+				var expectedValue = 12345;
+				var actualValue   = db.MappingSchema.ConvertToInt32(db
+					.SetSpCommand("Scalar_OutputParameter")
+					.ExecuteScalar(ScalarSourceType.OutputParameter));
+
+				Assert.AreEqual(expectedValue, actualValue);
+			}
+		}
+
+		[Test]
+		public void OutputParameter2Test()
+		{
+			using (var db = new DbManager())
+			{
+				var expectedValue = "54321";
+				var actualValue   = db.MappingSchema.ConvertToString(db
+					.SetSpCommand("Scalar_OutputParameter")
+					.ExecuteScalar(ScalarSourceType.OutputParameter, 1));
+
+				Assert.AreEqual(expectedValue, actualValue);
+			}
+		}
+
+		[Test]
+		public void OutputParameter3Test()
+		{
+			using (var db = new DbManager())
+			{
+				var expectedValue = "54321";
+				var actualValue   = db.MappingSchema.ConvertToString(db
+					.SetSpCommand("Scalar_OutputParameter")
+					.ExecuteScalar(ScalarSourceType.OutputParameter, "outputString"));
+
+				Assert.AreEqual(expectedValue, actualValue);
+			}
+		}
+		
+		[Test]
+		public void ReturnParameterTest()
+		{
+			using (var db = new DbManager())
+			{
+				var expectedValue = 12345;
+				var actualValue   = db.MappingSchema.ConvertToInt32(db
+					.SetSpCommand("Scalar_ReturnParameter")
+					.ExecuteScalar(ScalarSourceType.ReturnValue));
+
+				Assert.AreEqual(expectedValue, actualValue);
+			}
+		}
+#endif
+
+		[Test]
+		public void AffectedRowsTest()
+		{
+			using (var db = new DbManager())
+			{
+#if ACCESS || SQLITE
+				var expectedValue = 0;
+#else
+				var expectedValue = -1;
+#endif
+				var actualValue   = db.MappingSchema.ConvertToInt32(
+					db
+#if SQLITE || SQLCE
+						.SetCommand("SELECT 12345")
+#else
+						.SetSpCommand("Scalar_DataReader")
+#endif
+						.ExecuteScalar(ScalarSourceType.AffectedRows));
+
+				Assert.AreEqual(expectedValue, actualValue);
+			}
+		}
+
+		[Test]
+		public void GenericsRegressionTest()
+		{
+			using (var db = new DbManager())
+			{
+				var expectedValue = 12345;
+				var actualValue   = db
+#if SQLITE || SQLCE
+					.SetCommand("SELECT 12345")
+#else
+					.SetSpCommand("Scalar_DataReader")
+#endif
+					.ExecuteScalar<int>();
+
+				Assert.AreEqual(expectedValue, actualValue);
+			}
+		}
+
+		[Test]
+		public void GenericsDataReaderTest()
+		{
+			using (var db = new DbManager())
+			{
+				var expectedValue = 12345;
+				var actualValue   = db
+#if SQLITE || SQLCE
+					.SetCommand("SELECT 12345")
+#else
+					.SetSpCommand("Scalar_DataReader")
+#endif
+					.ExecuteScalar<int>(ScalarSourceType.DataReader);
+
+				Assert.AreEqual(expectedValue, actualValue);
+			}
+		}
+
+		[Test]
+		public void GenericsDataReader2Test()
+		{
+			using (var db = new DbManager())
+			{
+				var expectedValue = "54321";
+				var actualValue   = db
+#if SQLITE || SQLCE
+					.SetCommand("SELECT 12345, '54321'")
+#else
+					.SetSpCommand("Scalar_DataReader")
+#endif
+					.ExecuteScalar<string>(ScalarSourceType.DataReader, 1);
+
+				Assert.AreEqual(expectedValue, actualValue);
+			}
+		}
+
+		[Test]
+		public void NoResult()
+		{
+			using (var db = new DbManager())
+			{
+				var actualValue = db.SetCommand("SELECT FirstName FROM Person WHERE PersonID = -1").ExecuteScalar<string>();
+				Assert.AreEqual("", actualValue);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/InnerTypesTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,172 @@
+using System;
+using System.Data;
+
+using NUnit.Framework;
+
+using BLToolkit.Reflection;
+using BLToolkit.Data;
+using BLToolkit.Mapping;
+
+#pragma warning disable 0252
+
+namespace Data
+{
+	[TestFixture]
+	public class InnerTypesTest
+	{
+		public class TypeMapper: MemberMapper
+		{
+			public override object GetValue(object o)
+			{
+				var value = (Type)MemberAccessor.GetValue(o);
+				return (null != value && MapMemberInfo.NullValue != value)? value.FullName: null;
+			}
+
+			public override void SetValue(object o, object value)
+			{
+				MemberAccessor.SetValue(o, (null != value)?
+					Type.GetType((string)value, true, true): MapMemberInfo.NullValue);
+			}
+		}
+
+		public class First
+		{
+			public string Name;
+		}
+
+		public abstract class Last
+		{
+			public          string Name;
+			public abstract string Suffix { get; set; }
+
+			// Inner type of the inner type
+			//
+			[MapField("FirstName", "Name")]
+			public abstract First First { get; set; }
+
+			// This reference type field will be ignored
+			//
+			public          Type   Type;
+		}
+
+		[MapField("FirstName",     "First.Name")]
+		[MapField("LastName",      "Last.Name")]
+		[MapField("LastSuffix",    "Last.Suffix")]
+		[MapField("LastFirstName", "Last.First.Name")]
+		public abstract class Person
+		{
+			[MapField("PersonID")]
+			public          int    ID;
+			public          First  First = new First();
+			public abstract Last   Last { get; set; }
+			public          string Name;
+			[MemberMapper(typeof(TypeMapper))]
+			public          Type   Type;
+		}
+
+		public abstract class Person2
+		{
+			[MapField("PersonID")]
+			public          int    ID;
+
+			[MapField("FirstName",  "Name")]
+			public          First  First = new First();
+
+			[MapField(Format="Last{0}")]
+			public abstract Last   Last { get; set; }
+
+			public          string Name;
+			public          string Type;
+		}
+
+		[Test]
+		public void MapFieldTest()
+		{
+			var p = (Person)TypeAccessor.CreateInstance(typeof(Person));
+
+			p.ID              = 12345;
+			p.First.Name      = "Crazy";
+			p.Last.Name       = "Frog";
+			p.Last.Suffix     = "Jr";
+			p.Last.Type       = typeof(DbManager);
+			p.Last.First.Name = "Crazy Frog";
+			p.Name            = "Froggy";
+			p.Type            = typeof(DbManager);
+
+			var p2 = (Person2)Map.ObjectToObject(p, typeof(Person2));
+
+			Assert.AreEqual(p.ID,              p2.ID);
+			Assert.AreEqual(p.First.Name,      p2.First.Name);
+			Assert.AreEqual(p.Last.Name,       p2.Last.Name);
+			Assert.AreEqual(p.Last.Suffix,     p2.Last.Suffix);
+			Assert.AreEqual(p.Last.First.Name, p2.Last.First.Name);
+			Assert.AreEqual(p.Name,            p2.Name);
+			Assert.AreEqual(p.Type.FullName,   p2.Type);
+
+			// The 'Last.Type' field should be ignored by mapping process.
+			//
+			Assert.IsNull(p2.Last.Type);
+		}
+
+		[Test]
+		public void CreateParametersTest()
+		{
+			IDbDataParameter[] parameters;
+			var p = (Person)TypeAccessor.CreateInstance(typeof(Person));
+			p.ID         = 12345;
+			p.First.Name = "Crazy";
+			p.Last.Name  = "Frog";
+			p.Name       = "Froggy";
+			p.Type       = typeof(DbManager);
+
+			using (var db = new DbManager())
+			{
+				parameters = db.CreateParameters(p);
+			}
+
+			Assert.IsNotNull(parameters);
+			Assert.AreEqual(7, parameters.Length);
+
+			foreach (var parameter in parameters)
+				Console.WriteLine("{0}: {1}", parameter.ParameterName, parameter.Value);
+		}
+
+		public abstract class Template2
+		{
+			public abstract int    ID          { get; set; }
+			public abstract string DisplayName { get; set; }
+		}
+
+		[MapField("TPL_ID",          "tpl.ID")]
+		[MapField("TPL_DisplayName", "tpl.DisplayName")]
+		public abstract class Template1
+		{
+			public abstract int       ID          { get; set; }
+			public abstract string    DisplayName { get; set; }
+
+			public abstract Template2 tpl         { get; set; }
+		}
+
+		[Test]
+		public void TemplateTest()
+		{
+			using (var db = new DbManager())
+			{
+				var cmd = @"
+					SELECT
+						1   as ID,
+						'2' as DisplayName,
+						3   as TPL_ID, 
+						'4' as TPL_DisplayName";
+#if ORACLE || FIREBIRD
+				cmd += " FROM dual";
+#endif
+				var list = db
+					.SetCommand(cmd)
+					.ExecuteList(typeof(Template1));
+
+				Assert.IsNotNull(list);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/Linq/LinqTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,59 @@
+using System;
+using System.Linq;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.Data.Linq;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class LinqTest
+	{
+		class TestManager : DbManager
+		{
+			public Table<Person> Person
+			{
+				get { return GetTable<Person>(); }
+			}
+		}
+
+		[Test]
+		public void Test()
+		{
+			using (TestManager db = new TestManager())
+			{
+				var query = db.Person.Select(p => p);
+
+				var list = query.ToList();
+			}
+		}
+
+		Func<int, int> f;
+
+		void Func(System.Linq.Expressions.Expression<Func<int, int>> func, int n)
+		{
+			if (f == null)
+				f = func.Compile();
+
+			n = f(n);
+
+			Console.WriteLine(n);
+		}
+
+		void Foo(int i)
+		{
+			Func((n) => n + 2, i);
+		}
+
+		[Test]
+		public void Test2()
+		{
+			Foo(0);
+			Foo(1);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/Model/BinaryData.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+using System;
+using System.Data.Linq;
+
+namespace Data.Model
+{
+	public class BinaryData
+	{
+		public int    BinaryDataID;
+		public Binary Stamp;
+		public Binary Data;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/Model/DataTypeTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,32 @@
+using System;
+using System.Data.Linq;
+using System.Xml.Linq;
+
+namespace Data.Model
+{
+	public class DataTypeTest
+	{
+		public int       DataTypeID;
+		public Binary    Binary_;
+		public bool?     Boolean_;
+		public byte?     Byte_;
+		public Binary    Bytes_;
+		public char?     Char_;
+		public DateTime? DateTime_;
+		public decimal?  Decimal_;
+		public double?   Double_;
+		public Guid?     Guid_;
+		public short?    Int16_;
+		public int?      Int32_;
+		public long?     Int64_;
+		public decimal?  Money_;
+		public byte?     SByte_;
+		public float?    Single_;
+		public Binary    Stream_;
+		public string    String_;
+		public short?    UInt16_;
+		public int?      UInt32_;
+		public long?     UInt64_;
+		public XElement  Xml_;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/Model/Doctor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+using System;
+
+namespace Data.Model
+{
+	public class Doctor
+	{
+		public int    PersonID;
+		public string Taxonomy;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/Model/Patient.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+using System;
+
+namespace Data.Model
+{
+	public class Patient
+	{
+		public int    PersonID;
+		public string Diagnosis;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/Model/Person.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,13 @@
+using System;
+
+namespace Data.Model
+{
+	public class Person
+	{
+		public int    PersonID;
+		public string FirstName;
+		public string LastName;
+		public string MiddleName;
+		public char   Gender;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/NullableParameter.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,50 @@
+using System;
+using System.Data;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.Mapping;
+
+namespace Data
+{
+	[TestFixture]
+	public class NullableParameter
+	{
+		public class NullableInt
+		{
+			[NullValue(-1)]
+			public int I;
+			public int II;
+		}
+
+		[Test]
+		public void Test()
+		{
+			const int testValue = 0;
+
+			NullableInt ni = new NullableInt();
+
+			ni.I  = testValue;
+			ni.II = testValue;
+			
+			using (DbManager db = new DbManager())
+			{
+				IDbDataParameter[] ps = db.CreateParameters(ni);
+
+				foreach (IDbDataParameter p in ps)
+				{
+					switch (p.ParameterName)
+					{
+						case "@I":
+							Assert.AreEqual(testValue, p.Value);
+							break;
+						case "@II":
+							Assert.AreEqual(testValue, p.Value);
+							break;
+					}
+				}
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/OutputParameter.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,53 @@
+using System;
+using System.Data;
+
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.DataAccess;
+
+using NUnit.Framework;
+
+namespace Data
+{
+	[TestFixture]
+	public class OutputParameter
+	{
+		[Test]
+		public void DirectTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				string paramName = (string) db.DataProvider.Convert("name",      ConvertType.NameToQueryParameter);
+				string fieldName = (string) db.DataProvider.Convert("FirstName", ConvertType.NameToQueryField);
+
+				db.SetCommand(string.Format("SELECT {0} = {1} FROM Person WHERE PersonID = 1", paramName, fieldName)
+						, db.OutputParameter(paramName, DbType.String, 50))
+					.ExecuteNonQuery();
+				Assert.AreEqual("John", db.Parameter(paramName).Value);
+			}
+		}
+
+		public abstract class TestAccessor : DataAccessor
+		{
+			[SqlQuery("SELECT {0} = {1} FROM Person WHERE PersonID = 1")]
+			public abstract void SelectJohn([ParamSize(50), ParamDbType(DbType.String)] out string name, [Format] string paramName, [Format] string FieldName);
+		}
+
+		[Test]
+		public void AccessorTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				string paramName = (string)db.DataProvider.Convert("name",      ConvertType.NameToQueryParameter);
+				string fieldName = (string)db.DataProvider.Convert("FirstName", ConvertType.NameToQueryField);
+
+				TestAccessor ta = (TestAccessor)TestAccessor.CreateInstance(typeof(TestAccessor), db);
+
+				string actual;
+				ta.SelectJohn(out actual, paramName, fieldName);
+
+				Assert.AreEqual("John", actual);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/Sql/DefinitionData.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<Types>
+	<Type Name="Order">
+		<Member Name="ID" MapField="OrderID" />
+
+		<Join TableName="OrderItem"><On Field="ID" OtherField="OrderID"/></Join>
+	</Type>
+
+	<Type Name="OrderItem" Alias="oi">
+		<Member Name="OrderID" />
+		<Member Name="ID" MapField="OrderItemID" />
+	</Type>
+
+	<Type Name="Order2" BaseExtension="Order" />
+
+	<Type Name="Order3" BaseType="Data.Sql.DefinitionTest+Types+Order, UnitTests.CS">
+		<Join TableName="OrderItem"><On Field="ID" OtherField="OrderID"/></Join>
+	</Type>
+</Types>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/Sql/DefinitionTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,131 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Data.Sql;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection.Extension;
+
+namespace Data.Sql
+{
+	[TestFixture]
+	public class DefinitionTest
+	{
+		#region Table definition
+
+		static class Tables
+		{
+			public static readonly SqlTable Order = new SqlTable
+			{
+				Name         = "Order",
+				PhysicalName = "Order",
+				Fields       =
+				{
+					new SqlField { Name = "ID", PhysicalName = "OrderID" }
+				},
+				Joins  =
+				{
+					new Join
+					{
+						TableName = "OrderItem",
+						JoinOns   = { new JoinOn { Field = "ID", OtherField = "OrderID" } }
+					}
+				}
+			};
+
+			public static readonly SqlTable OrderItem = new SqlTable
+			{
+				Name         = "OrderItem",
+				PhysicalName = "OrderItem",
+				Alias        = "oi",
+				Fields       =
+				{
+					new SqlField { Name = "OrderID" },
+					new SqlField { Name = "ID", PhysicalName = "OrderItemID" }
+				}
+			};
+		}
+
+		static class Xml
+		{
+			static readonly ExtensionList _ext = TypeExtension.GetExtensions("DefinitionData.xml");
+
+			public static readonly SqlTable Order     = new SqlTable(_ext, "Order");
+			public static readonly SqlTable Order2    = new SqlTable(_ext, "Order2") { Name = "Order", PhysicalName = "Order" };
+			public static readonly SqlTable Order3    = new SqlTable(_ext, "Order3") { Name = "Order", PhysicalName = "Order" };
+			public static readonly SqlTable OrderItem = new SqlTable(_ext, "OrderItem");
+		}
+
+		public class Types
+		{
+			public class Order
+			{
+				[MapField("OrderID")] public int ID;
+			}
+
+			public class OrderItem
+			{
+				                          public int OrderID;
+				[MapField("OrderItemID")] public int ID;
+			}
+
+			public static SqlTable OrderTable = new SqlTable<Order>
+			{
+				Joins =
+				{
+					new Join
+					{
+						TableName = "OrderItem",
+						JoinOns   = { new JoinOn { Field = "ID", OtherField = "OrderID" } }
+					}
+				}
+			};
+			public static SqlTable OrderItemTable = new SqlTable<OrderItem> { Alias = "oi" };
+		}
+
+		#endregion
+
+		static void CompareTables(SqlTable t1, SqlTable t2)
+		{
+			Assert.AreEqual(t1.Name,         t2.Name);
+			Assert.AreEqual(t1.PhysicalName, t2.PhysicalName);
+			Assert.AreEqual(t1.Alias,        t2.Alias);
+			Assert.AreEqual(t1.Database,     t2.Database);
+			Assert.AreEqual(t1.Fields.Count, t2.Fields.Count);
+			Assert.AreEqual(t1.Joins. Count, t2.Joins. Count);
+
+			foreach (var field in t1.Fields.Values)
+			{
+				Assert.AreEqual(field.PhysicalName, t2[field.Name].PhysicalName);
+			}
+
+			for (var i = 0; i < t1.Joins.Count; i++)
+			{
+				var j1 = t1.Joins[i];
+				var j2 = t2.Joins[i];
+
+				Assert.AreEqual(j1.TableName,     j2.TableName);
+				Assert.AreEqual(j1.Alias,         j2.Alias);
+				Assert.AreEqual(j1.JoinOns.Count, j2.JoinOns.Count);
+
+				for (var j = 0; j < j1.JoinOns.Count; j++)
+				{
+					Assert.AreEqual(j1.JoinOns[j].Field,      j2.JoinOns[j].Field);
+					Assert.AreEqual(j1.JoinOns[j].OtherField, j2.JoinOns[j].OtherField);
+					Assert.AreEqual(j1.JoinOns[j].Expression, j2.JoinOns[j].Expression);
+				}
+			}
+		}
+
+		[Test]
+		public void Test()
+		{
+			CompareTables(Tables.Order,     Xml.Order);
+			CompareTables(Tables.Order,     Xml.Order2);
+			CompareTables(Tables.Order,     Xml.Order3);
+			CompareTables(Tables.OrderItem, Xml.OrderItem);
+			CompareTables(Tables.Order,     Types.OrderTable);
+			CompareTables(Tables.OrderItem, Types.OrderItemTable);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/Sql/FromTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,85 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Data.Sql;
+
+namespace Data.Sql
+{
+	[TestFixture]
+	public class FromTest
+	{
+		public static SqlTable Order = new SqlTable
+		{
+			Name   = "Order",
+			Fields = { new SqlField { Name = "ID" }, new SqlField { Name = "Number" } }
+		};
+
+		public static SqlTable OrderItem = new SqlTable
+		{
+			Name   = "OrderItem",
+			Fields = { new SqlField { Name = "ID" }, new SqlField { Name = "OrderID" } }
+		};
+
+		public static SqlTable OrderItem2 = new SqlTable(OrderItem);
+		public static SqlTable OrderItem3 = new SqlTable(OrderItem);
+		public static SqlTable OrderItem4 = new SqlTable(OrderItem);
+		public static SqlTable OrderItem5 = new SqlTable(OrderItem);
+
+		[Test]
+		public void Test1()
+		{
+			var sb = new SqlQuery();
+
+			sb
+				.Select
+					.Field(Order["ID"])
+					.Field(Order["Number"])
+				.From
+					.Table(Order)
+				;
+
+			sb.FinalizeAndValidate(true, true);
+
+			Assert.AreEqual(1, sb.From.Tables.Count);
+			Assert.AreEqual(0, sb.From.Tables[0].Joins.Count);
+		}
+
+		[Test]
+		public void Test2()
+		{
+			var sb = new SqlQuery();
+
+			sb
+				.Select
+					.Field(Order["ID"])
+					.Field(OrderItem.All)
+					.Field(OrderItem4["ID"])
+				.From
+					.Table(Order,
+						OrderItem. Join    ().Field(Order["ID"]).Equal.Field(OrderItem["OrderID"]),
+						OrderItem2.WeakJoin(),
+						OrderItem3.WeakJoin(
+							OrderItem5.WeakLeftJoin(),
+							OrderItem4.LeftJoin    ().Field(OrderItem4["ID"]).Equal.Field(OrderItem3["ID"]))
+						)
+				.Where
+					.Not.Field(Order["ID"]).Like("1234").Or
+					.Field(Order["ID"]).Equal.Value("!%")
+				.GroupBy
+					.Field(Order["ID"])
+				.OrderBy
+					.Field(Order["ID"])
+				;
+
+			Assert.AreEqual(1, sb.From.Tables.Count);
+			Assert.AreEqual(3, sb.From.Tables[0].Joins.Count);
+			Assert.AreEqual(2, sb.From.Tables[0].Joins[2].Table.Joins.Count);
+
+			sb.FinalizeAndValidate(true, true);
+
+			Assert.AreEqual(2, sb.From.Tables[0].Joins.Count);
+			Assert.AreEqual(1, sb.From.Tables[0].Joins[1].Table.Joins.Count);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Data/Sql/SelectTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,61 @@
+using System;
+using NUnit.Framework;
+using BLToolkit.Data.Sql;
+
+namespace Data.Sql
+{
+	[TestFixture]
+	public class SelectTest
+	{
+		public static SqlTable Order = new SqlTable
+		{
+			Name   = "Order",
+			Fields = { new SqlField { Name = "ID" }, new SqlField { Name = "Number" } }
+		};
+
+		[Test]
+		public void Test1()
+		{
+			var sb = new SqlQuery();
+
+			sb
+				.Select
+					.Field(Order["ID"])
+					.Field(Order["Number"])
+				;
+
+			Assert.AreEqual(2, sb.Select.Columns.Count);
+		}
+
+		[Test]
+		public void Test2()
+		{
+			var sb = new SqlQuery();
+
+			sb
+				.Select
+					.Field(Order["ID"])
+					.Field(Order["Number"])
+					.Field(Order["ID"])
+				;
+
+			Assert.AreEqual(2, sb.Select.Columns.Count);
+		}
+
+		[Test]
+		public void Test3()
+		{
+			var sb = new SqlQuery();
+
+			sb
+				.Select
+					.Field(Order["ID"], "id1")
+					.Field(Order["ID"])
+					.Expr("{0} + {1}", Order["Number"], Order["Number"])
+					.Expr(new SqlExpression("{0} + {1}", Order["Number"], Order["Number"]))
+				;
+
+			Assert.AreEqual(2, sb.Select.Columns.Count);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/DataAccess/ActualTypeAttributeTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,119 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+using BLToolkit.Reflection;
+
+namespace DataAccess
+{
+	[TestFixture]
+	public class ActualTypeAttributeTest
+	{
+		public interface IName
+		{
+			string Name { get; }
+		}
+
+		public class NameBase : IName
+		{
+			private string _name;
+			public  string  Name { get { return _name; } set { _name = value; } }
+		}
+
+		public class Name1 : NameBase {}
+		public class Name2 : NameBase {}
+
+		public interface IValue
+		{
+			string Value { get; }
+		}
+
+		public class MyValue : IValue
+		{
+			private string _value;
+			public  string  Value { get { return _value; } set { _value = value; } }
+		}
+
+		[ActualType(typeof(IName),  typeof(Name1))]
+		[ActualType(typeof(IValue), typeof(MyValue))]
+		public abstract class TestAccessor : DataAccessor
+		{
+			[SqlQuery("SELECT 'John' as Name")]
+			public abstract IName GetName();
+
+			[SqlQuery("SELECT 'John' as Name"), ObjectType(typeof(Name2))]
+			public abstract IName GetName2();
+
+			[SqlQuery("SELECT 'John' as Name")]
+			public abstract IList<IName> GetNameList();
+
+			[SqlQuery("SELECT 'John' as Name"), ObjectType(typeof(Name2))]
+			public abstract IList<IName> GetName2List();
+
+			[SqlQuery("SELECT 1 as ID, 'John' as Name"), Index("@ID")]
+			public abstract IDictionary<int, IName> GetNameDictionary();
+
+			[SqlQuery("SELECT 1 as ID, 'John' as Name"), Index("@ID"), ObjectType(typeof(Name2))]
+			public abstract IDictionary<int, IName> GetName2Dictionary();
+
+			[SqlQuery("SELECT 'John' as Value")]
+			public abstract IValue GetValue();
+		}
+
+		TestAccessor Accessor
+		{
+			get { return TypeAccessor.CreateInstance<TestAccessor>(); }
+		}
+
+		[Test]
+		public void TestName()
+		{
+			IName name = Accessor.GetName();
+			Assert.IsTrue(name is Name1);
+		}
+
+		[Test]
+		public void TestName2()
+		{
+			IName name = Accessor.GetName2();
+			Assert.IsTrue(name is Name2);
+		}
+
+		[Test]
+		public void TestNameList()
+		{
+			IList<IName> list = Accessor.GetNameList();
+			Assert.IsTrue(list[0] is Name1);
+		}
+
+		[Test]
+		public void TestName2List()
+		{
+			IList<IName> list = Accessor.GetName2List();
+			Assert.IsTrue(list[0] is Name2);
+		}
+
+		[Test]
+		public void TestNameDictionary()
+		{
+			IDictionary<int, IName> dic = Accessor.GetNameDictionary();
+			Assert.IsTrue(dic[1] is Name1);
+		}
+
+		[Test]
+		public void TestName2Dictionary()
+		{
+			IDictionary<int, IName> dic = Accessor.GetName2Dictionary();
+			Assert.IsTrue(dic[1] is Name2);
+		}
+
+		[Test]
+		public void TestValue()
+		{
+			IValue value = Accessor.GetValue();
+			Assert.AreEqual(value.Value, "John");
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/DataAccess/ArrayTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,143 @@
+#if ORACLE
+using BLToolkit.Data;
+#else
+using System.Collections.Generic;
+#endif
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+using BLToolkit.TypeBuilder;
+
+namespace DataAccess
+{
+	[TestFixture]
+	public class ArrayTest
+	{
+		public ArrayTest()
+		{
+			TypeFactory.SaveTypes = true;
+		}
+
+#if ORACLE
+		public abstract class TestAccessor : DataAccessor
+		{
+			public abstract void ArrayTest(
+				int[]    @intArray, out int[]    @outputIntArray, ref int[]    @inputOutputIntArray,
+				string[] @strArray, out string[] @outputStrArray, ref string[] @inputOutputStrArray);
+
+			[ScalarSource(ScalarSourceType.OutputParameter)]
+			public abstract int[] ScalarArray();
+
+			[SqlQuery(@"
+DECLARE
+	intArray DBMS_UTILITY.NUMBER_ARRAY;
+BEGIN
+	intArray := :intArray;
+	FOR i IN intArray.FIRST..intArray.LAST LOOP
+		:inputOutputIntArray(i) := intArray(i);
+	END LOOP;
+END;"
+			)]
+			public abstract void Query(int[] @intArray, ref int[] @inputOutputIntArray);
+
+			public abstract void ArrayTest(
+				int?[]   @intArray, out int?[]   @outputIntArray, ref int?[]   @inputOutputIntArray,
+				string[] @strArray, out string[] @outputStrArray, ref string[] @inputOutputStrArray);
+
+			[ScalarSource(ScalarSourceType.OutputParameter), SprocName("ScalarArray")]
+			public abstract int?[] NullableScalarArray();
+		}
+
+		[Test]
+		public void Test()
+		{
+			int[]    @outputIntArray;
+			int[]    @inputOutputIntArray = new int[]    {1,2,3,4,5};
+			string[] @outputStrArray;
+			string[] @inputOutputStrArray = new string[] {"9","8","7","6","5"};
+
+			((TestAccessor)DataAccessor.CreateInstance(typeof(TestAccessor))).ArrayTest(
+				new int[]    {1,2,3,4,5},            out @outputIntArray, ref @inputOutputIntArray,
+				new string[] {"5","4","3","2","1"},  out @outputStrArray, ref @inputOutputStrArray);
+
+			Assert.AreEqual(new int[] {1,2,3,4,5},                @outputIntArray);
+			Assert.AreEqual(new int[] {2,4,6,8,10},               @inputOutputIntArray);
+			Assert.AreEqual(new string[] { "5","4","3","2","1"},      @outputStrArray);
+			Assert.AreEqual(new string[] { "95","84","73","62","51"}, @inputOutputStrArray);
+		}
+
+		[Test]
+		public void ScalarTest()
+		{
+			int[] @outputIntArray = ((TestAccessor)DataAccessor.CreateInstance(typeof(TestAccessor))).ScalarArray();
+
+			Assert.AreEqual(new int[] { 1, 2, 3, 4, 5 }, @outputIntArray);
+		}
+
+		[Test]
+		public void NullableTest()
+		{
+			int?[]   @outputIntArray;
+			int?[]   @inputOutputIntArray = new int?[]   {1,2,3,4,5};
+			string[] @outputStrArray;
+			string[] @inputOutputStrArray = new string[] {"9","8","7","6","5"};
+
+			((TestAccessor)DataAccessor.CreateInstance(typeof(TestAccessor))).ArrayTest(
+				new int?[]    {1,null,3,4,5},        out @outputIntArray, ref @inputOutputIntArray,
+				new string[] {"5","4","3","2","1"},  out @outputStrArray, ref @inputOutputStrArray);
+
+			Assert.AreEqual(new int?[] {1,0,3,4,5},                   @outputIntArray);
+			Assert.AreEqual(new int?[] {2,0,6,8,10},                  @inputOutputIntArray);
+			Assert.AreEqual(new string[] { "5","4","3","2","1"},      @outputStrArray);
+			Assert.AreEqual(new string[] { "95","84","73","62","51"}, @inputOutputStrArray);
+		}
+
+		[Test]
+		public void NullableScalarTest()
+		{
+			int?[] @outputIntArray = ((TestAccessor)DataAccessor.CreateInstance(typeof(TestAccessor))).NullableScalarArray();
+
+			Assert.AreEqual(new int?[] { 1, 2, 3, 4, 5 }, @outputIntArray);
+		}
+
+		[Test]
+		public void QueryTest()
+		{
+			int[] intArray            = new int[]{1,2,3,4,5};
+			int[] inputOutputIntArray = new int[5];
+
+			((TestAccessor)DataAccessor.CreateInstance(typeof(TestAccessor))).Query(
+				intArray, ref inputOutputIntArray);
+
+			Assert.AreEqual(intArray, inputOutputIntArray);
+		}
+
+
+#elif MSSQL
+
+		public abstract class TestAccessor : DataAccessor
+		{
+			[SprocName("ArrayTest")]
+			public abstract IList<int> SprocTest(int[] @inputIntArray);
+			[SqlQuery("SELECT Num * 3 FROM @inputIntArray")]
+			public abstract IList<int> QueryTest([ParamTypeName("IntArray")] int[] @inputIntArray);
+		}
+
+		[Test]
+		public void Test()
+		{
+			int[] intArray = { 1, 2, 3, 4, 5 };
+
+			TestAccessor a = TypeFactory.CreateInstance<TestAccessor>();
+			IList<int> list;
+
+			list = a.SprocTest(intArray);
+			for (int i = 0; i < list.Count; i++)
+				Assert.That(list[i], Is.EqualTo(intArray[i]*2));
+			list = a.QueryTest(intArray);
+			for (int i = 0; i < list.Count; i++)
+				Assert.That(list[i], Is.EqualTo(intArray[i]*3));
+		}
+#endif
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/DataAccess/CreateEntityTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,59 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Reflection;
+using BLToolkit.DataAccess;
+using BLToolkit.Data;
+using BLToolkit.TypeBuilder;
+
+namespace DataAccess
+{
+	[TestFixture]
+	public class CreateEntityTest
+	{
+		public abstract class Entity
+		{
+			public abstract int    Id   { get; set; }
+			public abstract String Name { get; set; }
+
+			public static Entity CreateInstance() { return TypeAccessor<Entity>.CreateInstanceEx(); }
+		}
+
+		public abstract class EntityAccessor : DataAccessor<Entity>
+		{
+#if SQLITE || SQLCE
+			[SqlQuery("SELECT * FROM Person")]
+#else
+			[SprocName("Person_SelectAll")]
+#endif
+			public abstract int Insert(Entity entity);
+
+			public static EntityAccessor CreateInstance(DbManager dbManager)
+			{
+				return DataAccessor.CreateInstance<EntityAccessor>(dbManager);
+			}
+		}
+
+		[Test]
+		public void Test()
+		{
+			TypeFactory.SetGlobalAssembly("CreateEntityTest.dll");
+
+			DbManager db = new DbManager();
+
+			try
+			{
+				Entity entity = Entity.CreateInstance();
+				EntityAccessor accessor = EntityAccessor.CreateInstance(db);
+
+				accessor.Insert(entity);
+			}
+			finally
+			{
+				db.Dispose();
+				TypeFactory.SaveGlobalAssembly();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/DataAccess/DataAccessorBuilderTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,172 @@
+using System;
+using System.Collections;
+using System.Data;
+using System.Reflection;
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+using BLToolkit.TypeBuilder;
+
+namespace DataAccess
+{
+	[TestFixture]
+	public class DataAccessorBuilderTest : MarshalByRefObject
+	{
+		DataAccessorBuilderTest _localTest;
+		AppDomain               _localDomain;
+
+		public struct Person
+		{
+		}
+
+		[TestFixtureSetUp]
+		public void SetUp()
+		{
+			string path = new Uri(Assembly.GetExecutingAssembly().EscapedCodeBase).LocalPath;
+
+			_localDomain = AppDomain.CreateDomain("NewDomain");
+			_localDomain.Load(typeof(DataAccessor).Assembly.GetName());
+			_localTest = (DataAccessorBuilderTest)_localDomain.CreateInstanceFromAndUnwrap(path, GetType().FullName);
+		}
+
+		[TestFixtureTearDown]
+		public void TearDown()
+		{
+			AppDomain.Unload(_localDomain);
+		}
+
+		public abstract class TypelessAccessor : DataAccessor
+		{
+			[SqlQuery("SELECT * FROM Person WHERE PersonID < 3")]
+			public abstract Hashtable Typeless();
+		}
+
+		private void Typeless()
+		{
+			// Can not determine object type for the method 'TypelessAccessor.Typeless'
+			//
+			DataAccessor.CreateInstance(typeof(TypelessAccessor));
+		}
+
+		[Test, ExpectedException(typeof(TypeBuilderException))]
+		public void TypelessTest()
+		{
+			AppDomain.CurrentDomain.DoCallBack(_localTest.Typeless);
+		}
+
+		public abstract class TypelessAccessor2 : DataAccessor
+		{
+			[SprocName("Person_SelectAll")]
+			public abstract ArrayList Typeless();
+		}
+
+		private void Typeless2()
+		{
+			// Can not determine object type for the method 'TypelessAccessor2.Typeless'
+			//
+			DataAccessor.CreateInstance(typeof(TypelessAccessor2));
+		}
+
+		[Test, ExpectedException(typeof(TypeBuilderException))]
+		public void Gen_SelectAllListException()
+		{
+			AppDomain.CurrentDomain.DoCallBack(_localTest.Typeless2);
+		}
+
+		public abstract class MultiDestinationAccessor : DataAccessor
+		{
+			[ObjectType(typeof(Person))]
+			public abstract IList SelectAll([Destination] IList list1, [Destination] IList list2);
+		}
+
+		private void MultiDestinationException()
+		{
+			// More then one parameter is marked as destination.
+			//
+			DataAccessor.CreateInstance(typeof(MultiDestinationAccessor));
+		}
+
+		[Test, ExpectedException(typeof(TypeBuilderException))]
+		public void MultiDestinationExceptionTest()
+		{
+			AppDomain.CurrentDomain.DoCallBack(_localTest.MultiDestinationException);
+		}
+
+		public abstract class ScalarDestinationAccessor : DataAccessor
+		{
+			[ObjectType(typeof(Person))]
+			public abstract int SelectAll([Destination] int p);
+		}
+
+		private void ScalarDestinationException()
+		{
+			// ExecuteScalar destination must be an out or a ref parameter
+			//
+			DataAccessor.CreateInstance(typeof(ScalarDestinationAccessor));
+		}
+
+		[Test, ExpectedException(typeof(TypeBuilderException))]
+		public void ScalarDestinationExceptionTest()
+		{
+			AppDomain.CurrentDomain.DoCallBack(_localTest.ScalarDestinationException);
+		}
+
+		public abstract class IncompatibleScalarDestinationAccessor : DataAccessor
+		{
+			[ObjectType(typeof(Person))]
+			public abstract int SelectAll([Destination] out string p);
+		}
+
+		private void IncompatibleScalarDestinationException()
+		{
+			// The return type 'System.Int32' of the method 'SelectAll'
+			// is incompatible with the destination parameter type 'System.String'
+			//
+			DataAccessor.CreateInstance(typeof(IncompatibleScalarDestinationAccessor));
+		}
+
+		[Test, ExpectedException(typeof(TypeBuilderException))]
+		public void IncompatibleScalarDestinationExceptionTest()
+		{
+			AppDomain.CurrentDomain.DoCallBack(_localTest.IncompatibleScalarDestinationException);
+		}
+
+		public abstract class VoidDestinationAccessor : DataAccessor
+		{
+			[ObjectType(typeof(Person))]
+			public abstract void SelectAll([Destination] int p);
+		}
+
+		private void VoidDestinationException()
+		{
+			// ExecuteNonQuery does not support the Destination attribute
+			//
+			DataAccessor.CreateInstance(typeof(VoidDestinationAccessor));
+		}
+
+		[Test, ExpectedException(typeof(TypeBuilderException))]
+		public void VoidDestinationExceptionTest()
+		{
+			AppDomain.CurrentDomain.DoCallBack(_localTest.VoidDestinationException);
+		}
+
+		public abstract class IllegalDataSetTableAccessor : DataAccessor
+		{
+			[DataSetTable(12345)]
+			public abstract DataTable SelectAll();
+		}
+
+		private void IllegalDataSetTable()
+		{
+			// DataSetTable attribute may not be an index
+			//
+			DataAccessor.CreateInstance(typeof(IllegalDataSetTableAccessor));
+		}
+
+		[Test, ExpectedException(typeof(TypeBuilderException))]
+		public void IllegalDataSetTableTest()
+		{
+			AppDomain.CurrentDomain.DoCallBack(_localTest.IllegalDataSetTable);
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/DataAccess/DataAccessorTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,969 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+using BLToolkit.EditableObjects;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+using BLToolkit.Validation;
+
+using PersonDataSet = DataAccessTest.PersonDataSet2;
+
+namespace DataAccess
+{
+	namespace Other
+	{
+		public abstract class Person : DataAccessorTest.Person
+		{
+			[MaxLength(256), Required]
+			public abstract string Diagnosis { get; set; }
+		}
+	}
+
+	[TestFixture]
+	public class DataAccessorTest
+	{
+		public enum Gender
+		{
+			[MapValue("F")] Female,
+			[MapValue("M")] Male,
+			[MapValue("U")] Unknown,
+			[MapValue("O")] Other
+		}
+
+		public interface IPerson
+		{
+			int    ID          { get; set; }
+			string LastName    { get; set; }
+			string FirstName   { get; set; }
+			string MiddleName  { get; set; }
+			IList  Territories { get; set; }
+		}
+
+		[TableName("Person")]
+		public abstract class Person : EditableObject, IPerson
+		{
+			[PrimaryKey, NonUpdatable]
+			[MapField("PersonID")]         public abstract int    ID         { get; set; }
+			[MaxLength(50), Required]      public abstract string FirstName  { get; set; }
+			[MaxLength(50), NullValue("")] public abstract string MiddleName { get; set; }
+			[MaxLength(50), Required]      public abstract string LastName   { get; set; }
+			[Required]                     public abstract Gender Gender     { get; set; }
+
+			public abstract IList Territories { get; set; }
+		}
+
+		public abstract class PersonAccessor : DataAccessor
+		{
+			public abstract int    Person_SelectAll();
+			public abstract void   Person_SelectAll(DbManager db);
+			public abstract Person SelectByName(string firstName, string lastName);
+
+			[SprocName("Person_SelectByName"), DiscoverParameters]
+			public abstract Person AnySprocName(string anyParameterName, string otherParameterName);
+
+			[ActionName("SelectByName")]
+			public abstract Person AnyActionName(string firstName, string lastName);
+
+			[ActionName("SelectByName")]
+			public abstract Person AnyParamName(
+				[ParamName("FirstName")] string name1,
+#if ORACLE
+				[ParamName("LastName")] string name2
+#else
+				[ParamName("@LastName")] string name2
+#endif
+				);
+
+			[ActionName("SelectByName"), ObjectType(typeof(Person))]
+			public abstract IPerson SelectByNameReturnInterface(string firstName, string lastName);
+
+			[ActionName("SelectByName"), ObjectType(typeof(Person))]
+			public abstract void SelectByNameReturnVoid(string firstName, string lastName, [Destination] object p);
+
+			public abstract IPerson SelectByName(string firstName, string lastName, [Destination] Person p);
+			
+			public abstract Person Insert([Destination(NoMap = false)] Person e);
+
+			[SprocName("Person_Insert_OutputParameter")]
+			public abstract void Insert_OutputParameter([Direction.Output("PERSONID")] Person e);
+
+			[SprocName("Scalar_ReturnParameter")]
+			public abstract void Insert_ReturnParameter([Direction.ReturnValue("@PersonID"),
+				Direction.Ignore("PersonID", "FirstName", "LastName", "MiddleName", "Gender")] Person e);
+
+			[SprocName("Scalar_ReturnParameter")]
+			public abstract void Insert_ReturnParameter2([Direction.ReturnValue("ID"),
+				Direction.Ignore("PersonID", "FirstName", "LastName", "MiddleName", "Gender")] Person e);
+
+			[ActionName("SelectAll"), ObjectType(typeof(Person))]
+			public abstract ArrayList SameTypeName();
+
+			[ActionName("SelectAll"), ObjectType(typeof(Person))]
+			public abstract IList SelectAllAsIList();
+
+			[ActionName("SelectByName")]
+			public abstract Person SameTypeName(string firstName, string lastName);
+
+			[ActionName("SelectByKey")]
+			public abstract Person ParamNullID    ([ParamNullValue(1)] int id);
+
+			[NoInstance]
+			public abstract Person this[DbManager db, int id]
+			{
+				[ActionName("SelectByKey")]
+				get;
+				[ActionName("Update")]
+				[ObjectType(typeof(Person))]
+				set;
+			}
+
+			[ActionName("SelectByKey")]
+			public abstract Person ParamNullableID([ParamNullValue(1)] int? id);
+
+			[ActionName("SelectByKey")]
+			public abstract Person ParamNullableID2([ParamNullValue("1")] int? id);
+
+			[ActionName("SelectAll")]
+			public abstract IList<Person> SelectAllAsIListT();
+
+			[ActionName("SelectByName")]
+			public abstract Person ParamNullString([ParamNullValue("John")] string firstName, string lastName);
+
+			public abstract Person ParamNullGuid  ([ParamNullValue("49F74716-C6DE-4b3e-A753-E40CFE6C6EA0")] Guid guid);
+			public abstract Person ParamNullEnum  ([ParamNullValue(Gender.Unknown)] Gender gender);
+
+			#region IDataReader
+
+			[SprocName("Person_SelectAll")]
+			public abstract IDataReader   SelectAllIDataReader(DbManager db);
+
+			[SprocName("Person_SelectAll"), CommandBehavior(CommandBehavior.SchemaOnly)]
+			public abstract IDataReader   SelectAllIDataReaderSchemaOnly(DbManager db);
+
+			#endregion
+
+			#region DataSet
+
+			[SprocName("Person_SelectAll")]
+			public abstract DataSet       SelectAllDataSet();
+
+			[SprocName("Person_SelectAll")]
+			public abstract IListSource   SelectAllDataSetWithDestination([Destination] DataSet ds);
+
+			[SprocName("Person_SelectAll")]
+			public abstract void          SelectAllDataSetReturnVoid     ([Destination] DataSet ds);
+
+			[SprocName("Person_SelectAll")]
+			public abstract PersonDataSet SelectAllTypedDataSet();
+
+			[SprocName("Person_SelectAll")]
+			public abstract object        SelectAllTypedDataSetWithDestination([Destination] PersonDataSet ds);
+
+			[SprocName("Person_SelectAll")]
+			public abstract void          SelectAllTypedDataSetReturnVoid     ([Destination] PersonDataSet ds);
+
+			[ObjectType(typeof(Person)), ActionName("SelectAll"), DataSetTable("First")]
+			public abstract void          SelectFirstTable  ([Destination] DataSet ds);
+
+			[SprocName("Person_SelectAll"), DataSetTable("Second")]
+			public abstract void          SelectSecondTable ([Destination] DataSet ds);
+
+			[ObjectType(typeof(Person)), ActionName("SelectAll"), DataSetTable(0)]
+			public abstract void          SelectFirstTable2 ([Destination] PersonDataSet ds);
+
+			[SprocName("Person_SelectAll"), DataSetTable("Second")]
+			public abstract void          SelectSecondTable2([Destination] PersonDataSet ds);
+
+			#endregion
+
+			#region DataTable
+
+			[SprocName("Person_SelectAll")]
+			public abstract DataTable     SelectAllDataTable();
+
+			[SprocName("Person_SelectAll")]
+			public abstract DataTable     SelectAllDataTableWithDestination([Destination] DataTable dt);
+
+			[SprocName("Person_SelectAll")]
+			public abstract void          SelectAllDataTableReturnVoid     ([Destination] DataTable dt);
+
+			[SprocName("Person_SelectAll"), DataSetTable("Person")]
+			public abstract DataTable     SelectAllToTablePerson();
+
+			[SprocName("Person_SelectAll")]
+			public abstract PersonDataSet.PersonDataTable SelectAllTypedDataTable();
+
+			[SprocName("Person_SelectAll")]
+			public abstract void          SelectAllTypedDataTableReturnVoid     ([Destination] PersonDataSet.PersonDataTable dt);
+
+			#endregion
+
+			#region List
+
+			[ActionName("SelectAll"), ObjectType(typeof(Person))]
+			public abstract ArrayList SelectAllList();
+
+			[ActionName("SelectAll"), ObjectType(typeof(Person))]
+			public abstract IList SelectAllListWithDestination([Destination] IList list);
+
+			[ActionName("SelectAll"), ObjectType(typeof(Person))]
+			public abstract void SelectAllListReturnVoid      ([Destination] IList list);
+
+			[ActionName("SelectAll")]
+			public abstract List<Person> SelectAllListT();
+
+			[ActionName("SelectAll"), ObjectType(typeof(Person))]
+			public abstract List<IPerson> SelectAllListTWithObjectType();
+
+			[ActionName("SelectAll"), ObjectType(typeof(Person))]
+			public abstract List<IPerson> SelectAllListTWithDestination([Destination] IList list);
+
+			[ActionName("SelectAll"), ObjectType(typeof(Person))]
+			public abstract void SelectAllListTWithObjectTypeReturnVoid([Destination] IList list);
+
+			[ActionName("SelectAll")]
+			public abstract void SelectAllListTReturnVoid              ([Destination] IList<Person> list);
+
+			#endregion
+
+			#region IEnumerable
+
+			[ActionName("SelectAll"), ObjectType(typeof(Person))]
+			public abstract IEnumerable SelectAllEnumerable();
+
+			[ActionName("SelectAll")]
+			public abstract IEnumerable<Person> SelectAllEnumerableT();
+
+			[ActionName("SelectAll"), ObjectType(typeof(Person))]
+			public abstract IEnumerable<IPerson> SelectAllEnumerableTWithObjectType();
+
+			#endregion
+		}
+
+		public abstract class PersonDataAccessor1 : PersonAccessor
+		{
+			public DataSet SelectByName()
+			{
+				using (DbManager db = GetDbManager())
+				{
+					DataSet ds = new DataSet();
+
+					db.SetSpCommand("Person_SelectAll");
+
+					if (ds.Tables.Count > 0)
+						db.ExecuteDataSet(ds, ds.Tables[0].TableName);
+					else
+						db.ExecuteDataSet(ds);
+
+					return ds;
+				}
+			}
+
+			[ActionName("SelectAll"), ObjectType(typeof(Other.Person))]
+			public abstract ArrayList SameTypeName1();
+
+			[ActionName("SelectByName")]
+			public abstract Other.Person SameTypeName1(string firstName, string lastName);
+
+			protected override string GetDefaultSpName(string typeName, string actionName)
+			{
+				return "Patient_" + actionName;
+			}
+		}
+
+		public class PersonList : ArrayList
+		{
+			public new Person this[int idx]
+			{
+				get { return (Person)base[idx]; }
+				set { base[idx] = value;        }
+			}
+		}
+
+		private PersonAccessor _da;
+		private SprocQuery     _sproc = new SprocQuery();
+		private SqlQuery       _sql   = new SqlQuery();
+
+		public DataAccessorTest()
+		{
+			object o = TypeAccessor.CreateInstance(typeof(Person));
+			Assert.IsInstanceOf(typeof(Person), o);
+
+			_da = (PersonAccessor)DataAccessor.CreateInstance(typeof(PersonAccessor));
+			Assert.IsInstanceOf(typeof(PersonAccessor), _da);
+		}
+
+		[Test]
+		public void Sql_Select()
+		{
+			Person e = (Person)_sql.SelectByKey(typeof(Person), 1);
+
+			Assert.IsNotNull(e);
+			Assert.AreEqual(1, e.ID);
+		}
+
+		[Test]
+		public void Sql_SelectAll()
+		{
+			ArrayList list = _sql.SelectAll(typeof(Person));
+
+			Console.WriteLine(list.Count);
+		}
+
+		[Test]
+		public void Sql_Insert()
+		{
+			ArrayList list = _sql.SelectAll(typeof(Person));
+			Hashtable tbl  = new Hashtable();
+
+			foreach (Person e in list)
+				tbl[e.ID] = e;
+
+			Person em = (Person)Map.CreateInstance(typeof(Person));
+
+			em.FirstName = "1";
+			em.LastName  = "2";
+
+			_sql.Insert(em);
+
+			list = _sql.SelectAll(typeof(Person));
+
+			foreach (Person e in list)
+				if (tbl.ContainsKey(e.ID) == false)
+					_sql.Delete(e);
+		}
+
+		[Test]
+		public void Sql_Update()
+		{
+			Person e = (Person)_sql.SelectByKey(typeof(Person), 1);
+
+			int n = _sql.Update(e);
+
+			Assert.AreEqual(1, n);
+		}
+
+		[Test]
+		public void Sql_DeleteByKey()
+		{
+			ArrayList list = _sql.SelectAll(typeof(Person));
+			Hashtable tbl = new Hashtable();
+
+			foreach (Person e in list)
+				tbl[e.ID] = e;
+
+			Person em = (Person)Map.CreateInstance(typeof(Person));
+
+			em.FirstName = "1";
+			em.LastName  = "2";
+
+			_sql.Insert(em);
+
+			list = _sql.SelectAll(typeof(Person));
+
+			foreach (Person e in list)
+				if (tbl.ContainsKey(e.ID) == false)
+					_sql.DeleteByKey(typeof(Person), e.ID);
+		}
+
+		[Test]
+		public void Sproc_SelectAll()
+		{
+			ArrayList list = _sproc.SelectAll(typeof(Person));
+			Console.WriteLine(list.Count);
+		}
+
+		[Test]
+		public void Gen_Person_SelectAll()
+		{
+			int n = _da.Person_SelectAll();
+			Console.WriteLine(n);
+		}
+
+		[Test]
+		public void Gen_Person_SelectAll_DbManager()
+		{
+			using (DbManager db = _da.GetDbManager())
+				_da.Person_SelectAll(db);
+		}
+
+		[Test]
+		public void Gen_SelectByName()
+		{
+			Person e = _da.SelectByName("John", "Pupkin");
+			Assert.AreEqual(1, e.ID);
+		}
+
+		[Test]
+		public void Gen_SelectByNameReturnInterface()
+		{
+			IPerson i = _da.SelectByNameReturnInterface("John", "Pupkin");
+
+			Assert.IsNotNull(i);
+			Assert.AreEqual (1, i.ID);
+		}
+
+		[Test]
+		public void Gen_SelectByNameReturnVoid()
+		{
+			Person e = (Person)TypeAccessor.CreateInstance(typeof (Person));
+			Assert.IsNotNull(e);
+
+			_da.SelectByNameReturnVoid("John", "Pupkin", e);
+			Assert.AreEqual (1, e.ID);
+		}
+
+		[Test]
+		public void Gen_SelectByNameWithDestination()
+		{
+			Person e = (Person)TypeAccessor.CreateInstance(typeof (Person));
+			IPerson i = _da.SelectByName("John", "Pupkin", e);
+
+			Assert.AreSame (i, e);
+			Assert.AreEqual(1, i.ID);
+		}
+
+#if !ACCESS
+#if !FIREBIRD
+		[Test]
+		public void Gen_InsertGetID()
+		{
+			Person    e = (Person)TypeAccessor.CreateInstance(typeof(Person));
+			e.FirstName = "Crazy";
+			e.LastName  = "Frog";
+			e.Gender    = Gender.Other;
+
+			_da.Insert(e);
+
+			// If you got an assertion here, make sure your Person_Insert sproc looks like
+			//
+			// INSERT INTO Person( LastName,  FirstName,  MiddleName,  Gender)
+			// VALUES            (@LastName, @FirstName, @MiddleName, @Gender)
+			//
+			// SELECT Cast(SCOPE_IDENTITY() as int) PersonID
+			// ^==important                         ^==important
+			//
+			Assert.IsTrue(e.ID > 0);
+			_sproc.Delete(e);
+		}
+#endif
+		[Test]
+		public void Gen_InsertGetIDReturnParameter()
+		{
+			Person e = (Person)TypeAccessor.CreateInstance(typeof(Person));
+
+			_da.Insert_ReturnParameter(e);
+
+			Assert.AreEqual(12345, e.ID);
+		}
+
+
+		[Test]
+		public void Gen_InsertGetIDReturnParameter2()
+		{
+			Person e = (Person)TypeAccessor.CreateInstance(typeof(Person));
+
+			_da.Insert_ReturnParameter2(e);
+
+			Assert.AreEqual(12345, e.ID);
+		}
+
+		[Test]
+		public void Gen_InsertGetIDOutputParameter()
+		{
+			Person    e = (Person)TypeAccessor.CreateInstance(typeof(Person));
+			e.FirstName = "Crazy";
+			e.LastName  = "Frog";
+			e.Gender    = Gender.Other;
+
+			_da.Insert_OutputParameter(e);
+
+			Assert.IsTrue(e.ID > 0);
+			_sproc.Delete(e);
+		}
+#endif
+
+#if !FIREBIRD
+		// Firebird is incomatible with DiscoverParameters due to In/Out parameters emulation.
+		//
+		[Test]
+#endif
+		public void Gen_SprocName()
+		{
+			Person e = _da.AnySprocName("John", "Pupkin");
+			Assert.AreEqual(1, e.ID);
+		}
+
+		[Test]
+		public void Gen_ActionName()
+		{
+			Person e = _da.AnyActionName("John", "Pupkin");
+			Assert.AreEqual(1, e.ID);
+		}
+
+		[Test]
+		public void Gen_ParamName()
+		{
+			Person e = _da.AnyParamName("John", "Pupkin");
+			Assert.AreEqual(1, e.ID);
+		}
+
+		[Test]
+		public void Gen_SameTypeName()
+		{
+			Person e = _da.SameTypeName("Tester", "Testerson");
+			Assert.IsInstanceOf(typeof(Person), e);
+			Assert.AreEqual(2, e.ID);
+
+			ArrayList list = _da.SameTypeName();
+			Assert.AreNotEqual(0, list.Count);
+			Assert.IsInstanceOf(typeof(Person), list[0]);
+
+			PersonDataAccessor1 da1 = (PersonDataAccessor1)DataAccessor.CreateInstance(typeof(PersonDataAccessor1));
+			Other.Person         e1 = da1.SameTypeName1("Tester", "Testerson");
+
+			Assert.IsInstanceOf(typeof(Other.Person), e1);
+			Assert.IsNotEmpty(e1.Diagnosis);
+
+			list = da1.SameTypeName1();
+			Assert.AreNotEqual(0, list.Count);
+			Assert.IsInstanceOf(typeof(Other.Person), list[0]);
+		}
+
+		[Test]
+		public void ParamNullValueIDTest()
+		{
+			// Parameter id == 1 will be replaced with NULL
+			//
+			Person e1 = _da.ParamNullID(1);
+			Assert.IsNull(e1);
+
+			// Parameter id == 2 will be send as is
+			//
+			Person e2 = _da.ParamNullID(2);
+			Assert.IsNotNull(e2);
+		}
+
+		[Test]
+		public void ParamNullValueNullableIDTest()
+		{
+			// Parameter id == 1 will be replaced with NULL
+			//
+			Person e1 = _da.ParamNullableID(1);
+			Assert.IsNull(e1);
+			e1  = _da.ParamNullableID2(1);
+			Assert.IsNull(e1);
+
+			// Parameter id == 2 will be send as is
+			//
+			Person e2 = _da.ParamNullableID(2);
+			Assert.IsNotNull(e2);
+		}
+
+		[Test]
+		public void ParamNullValueStrTest()
+		{
+			// Parameter firstName == 'John' will be replaced with NULL
+			//
+			Person e1 = _da.ParamNullString("John", "Pupkin");
+			Assert.IsNull(e1);
+
+			// Parameter firstName == 'Tester' will be send as is
+			//
+			Person e2 = _da.ParamNullString("Tester", "Testerson");
+			Assert.IsNotNull(e2);
+		}
+
+		[Test]
+		public void AbstractIndexerTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				Person p = _da[db, 1];
+				Assert.AreEqual("John", p.FirstName);
+
+				p.FirstName = "Frog";
+				_da[db, 1] = p;
+
+				p = _da[db, 1];
+				Assert.AreEqual("Frog", p.FirstName);
+
+				p.FirstName = "John";
+				_da[db, 1] = p;
+			}
+		}
+
+
+		#region IDataReader
+
+		[Test]
+		public void Gen_SelectAllIDataReader()
+		{
+			// Keep connection open for IDataReader
+			//
+			using (DbManager db = _da.GetDbManager())
+			{
+				IDataReader dr = _da.SelectAllIDataReader(db);
+
+				Assert.IsNotNull(dr);
+				Assert.AreNotEqual(0, dr.FieldCount);
+				Assert.IsTrue(dr.Read());
+#if ORACLE
+				Assert.AreNotEqual(0, dr.GetDecimal(dr.GetOrdinal("PersonID")));
+#else
+				Assert.AreNotEqual(0, dr.GetInt32(dr.GetOrdinal("PersonID")));
+#endif
+			}
+		}
+
+#if !ACCESS
+		[Test]
+		public void Gen_SelectAllIDataReaderSchemaOnly()
+		{
+			// Keep connection open for IDataReader
+			//
+			using (DbManager db = _da.GetDbManager())
+			{
+				IDataReader dr = _da.SelectAllIDataReaderSchemaOnly(db);
+
+				Assert.IsNotNull(dr);
+				Assert.AreNotEqual(0, dr.FieldCount);
+				Assert.IsFalse(dr.Read());
+			}
+		}
+#endif
+
+		#endregion
+
+		#region DataSet
+
+		[Test]
+		public void Gen_SelectAllDataSet()
+		{
+			DataSet ds = _da.SelectAllDataSet();
+			Assert.AreNotEqual(0, ds.Tables[0].Rows.Count);
+		}
+
+		[Test]
+		public void Gen_SelectAllDataSetWithDestination()
+		{
+			IListSource ls = _da.SelectAllDataSetWithDestination(new DataSet());
+			Assert.AreNotEqual(0, ls.GetList().Count);
+		}
+
+		[Test]
+		public void Gen_SelectAllDataSetReturnVoid()
+		{
+			DataSet ds = new DataSet();
+			_da.SelectAllDataSetReturnVoid(ds);
+			Assert.AreNotEqual(0, ds.Tables[0].Rows.Count);
+		}
+
+		[Test]
+		public void Gen_SelectAllTypedDataSet()
+		{
+			PersonDataSet ds = _da.SelectAllTypedDataSet();
+			Assert.AreNotEqual(0, ds.Person.Rows.Count);
+		}
+
+		[Test]
+		public void Gen_SelectAllTypedDataSetWithObjectType()
+		{
+			object o = _da.SelectAllTypedDataSetWithDestination(new PersonDataSet());
+			Assert.IsInstanceOf(typeof(PersonDataSet), o);
+
+			PersonDataSet ds = (PersonDataSet)o;
+			Assert.AreNotEqual(0, ds.Person.Rows.Count);
+		}
+
+		[Test]
+		public void Gen_SelectAllTypedDataSetReturnVoid()
+		{
+			PersonDataSet ds = new PersonDataSet();
+			_da.SelectAllTypedDataSetReturnVoid(ds);
+
+			Assert.AreNotEqual(0, ds.Person.Rows.Count);
+		}
+
+		[Test]
+		public void DataSetTableAttributeTest()
+		{
+			DataSet ds = new DataSet();
+
+			_da.SelectFirstTable (ds);
+			_da.SelectSecondTable(ds);
+
+			Assert.IsTrue (ds.Tables.Contains("First"),  "Table 'First'  not found");
+			Assert.IsTrue (ds.Tables.Contains("Second"), "Table 'Second' not found");
+			Assert.IsFalse(ds.Tables.Contains("Table"),  "Table 'Table'  was found");
+		}
+
+		[Test]
+		public void DataSetTableAttributeTest2()
+		{
+			PersonDataSet ds = new PersonDataSet();
+
+			_da.SelectFirstTable2 (ds);
+			_da.SelectSecondTable2(ds);
+
+			// Table 'Person' is dataset own table.
+			//
+			Assert.IsTrue (ds.Tables.Contains("Person"), "Table 'Person' not found");
+			Assert.IsTrue (ds.Tables.Contains("Second"), "Table 'Second' not found");
+			Assert.IsFalse(ds.Tables.Contains("Table"),  "Table 'Table'  was found");
+		}
+
+		#endregion
+
+		#region DataTable
+
+		[Test]
+		public void Gen_SelectAllDataTable()
+		{
+			DataTable dt = _da.SelectAllDataTable();
+			Assert.AreNotEqual(0, dt.Rows.Count);
+		}
+
+		[Test]
+		public void Gen_SelectAllDataTableWithDestination()
+		{
+			DataTable dt = _da.SelectAllDataTableWithDestination(new DataTable());
+			Assert.AreNotEqual(0, dt.Rows.Count);
+		}
+
+		[Test]
+		public void Gen_SelectAllDataTableReturnVoid()
+		{
+			DataTable dt = new DataTable();
+			_da.SelectAllDataTableReturnVoid(dt);
+			Assert.AreNotEqual(0, dt.Rows.Count);
+		}
+
+		[Test]
+		public void DataSetTableAttributeTest3()
+		{
+			DataTable dt = _da.SelectAllToTablePerson();
+
+			Assert.AreEqual("Person", dt.TableName);
+			Assert.AreNotEqual(0, dt.Rows.Count);
+		}
+
+		[Test]
+		public void Gen_SelectAllTypedDataTable()
+		{
+			PersonDataSet.PersonDataTable dt = _da.SelectAllTypedDataTable();
+			Assert.AreNotEqual(0, dt.Rows.Count);
+		}
+
+		[Test]
+		public void Gen_SelectAllTypedDataTableReturnVoid()
+		{
+			PersonDataSet.PersonDataTable dt = new PersonDataSet.PersonDataTable();
+
+			_da.SelectAllTypedDataTableReturnVoid(dt);
+			Assert.AreNotEqual(0, dt.Rows.Count);
+		}
+
+		#endregion
+
+		#region List
+
+		[Test]
+		public void Gen_SelectAllList()
+		{
+			ArrayList list = _da.SelectAllList();
+			Assert.AreNotEqual(0, list.Count);
+		}
+
+		[Test]
+		public void Gen_SelectAllListWithDestination()
+		{
+			IList list = _da.SelectAllListWithDestination(new ArrayList());
+			Assert.AreNotEqual(0, list.Count);
+		}
+
+		[Test]
+		public void Gen_SelectAllListReturnVoid()
+		{
+			ArrayList list = new ArrayList();
+			_da.SelectAllListReturnVoid(list);
+			Assert.AreNotEqual(0, list.Count);
+		}
+
+		[Test]
+		public void Gen_SelectAllIList()
+		{
+			IList list = _da.SelectAllAsIList();
+			Assert.IsNotEmpty(list);
+		}
+
+		[Test]
+		public void Gen_SelectAllListT()
+		{
+			List<Person> list = _da.SelectAllListT();
+			Assert.AreNotEqual(0, list.Count);
+		}
+
+		[Test]
+		public void Gen_SelectAllListTWithObjectType()
+		{
+			List<IPerson> list = _da.SelectAllListTWithObjectType();
+			Assert.AreNotEqual(0, list.Count);
+		}
+
+		[Test]
+		public void Gen_SelectAllListTReturnVoid()
+		{
+			List<Person> list = new List<Person>();
+			_da.SelectAllListTReturnVoid(list);
+			Assert.AreNotEqual(0, list.Count);
+		}
+
+		[Test]
+		public void Gen_SelectAllListTWithObjectTypeReturnVoid()
+		{
+			List<IPerson> list = new List<IPerson>();
+			_da.SelectAllListTWithObjectTypeReturnVoid(list);
+			Assert.AreNotEqual(0, list.Count);
+		}
+
+		[Test]
+		public void Gen_SelectAllListTWithDestination()
+		{
+			List<IPerson> list = _da.SelectAllListTWithDestination(new List<IPerson>());
+			Assert.AreNotEqual(0, list.Count);
+		}
+
+		[Test]
+		public void Gen_SelectAllIListT()
+		{
+			IList<Person> list = _da.SelectAllAsIListT();
+			Assert.IsNotEmpty((ICollection)list);
+		}
+
+		#endregion
+
+		#region PrepareParameters
+
+		public abstract class MyAssessorBase : DataAccessor
+		{
+			// This method will inject an additional parameter into each sproc call
+			//
+			protected override IDbDataParameter[] PrepareParameters(
+				DbManager db,
+				object[]  parameters)
+			{
+				ArrayList retParams;
+				if (parameters != null && parameters.Length != 0)
+				{
+					parameters = base.PrepareParameters(db, parameters);
+					retParams = new ArrayList(parameters.Length + 1);
+					retParams.AddRange(parameters);
+				}
+				else
+					retParams = new ArrayList(1);
+
+				retParams.Add(db.Parameter((string)db.DataProvider.Convert("ID", db.GetConvertTypeToParameter()), 1));
+
+				return (IDbDataParameter[]) retParams.ToArray(typeof(IDbDataParameter));
+			}
+		}
+
+		public abstract class MyAssessor : MyAssessorBase
+		{
+			public abstract Person SelectByKey();
+		}
+
+		[Test]
+		public void PrepareParametersTest()
+		{
+			IPerson i = ((MyAssessor)TypeAccessor
+				.CreateInstance(typeof (MyAssessor)))
+				.SelectByKey();
+
+			Assert.IsNotNull(i);
+			Assert.AreEqual("John", i.FirstName);
+			Assert.AreEqual("Pupkin", i.LastName);
+		}
+		#endregion
+
+		#region IEnumerable
+
+		[Test]
+		public void Gen_SelectAllEnumerable()
+		{
+			List<Person> list = new List<Person>();
+
+			foreach (Person p in _da.SelectAllEnumerable())
+				list.Add(p);
+
+			Assert.AreNotEqual(0, list.Count);
+		}
+
+		[Test]
+		public void Gen_SelectAllEnumerableT()
+		{
+			List<Person> list = new List<Person>();
+
+			foreach (Person p in _da.SelectAllEnumerableT())
+				list.Add(p);
+
+			Assert.AreNotEqual(0, list.Count);
+		}
+
+		[Test]
+		public void Gen_SelectAllEnumerableTWithObjectType()
+		{
+			List<Person> list = new List<Person>();
+
+			foreach (Person p in _da.SelectAllEnumerableTWithObjectType())
+				list.Add(p);
+
+			Assert.AreNotEqual(0, list.Count);
+		}
+
+		#endregion
+
+		#region Pull Request 121
+
+		public class Whatever
+		{
+			public string Name { get; set; }
+			public int Age { get; set; }
+		}
+
+		public class Whatever2
+		{
+			public bool IsFoo { get; set; }
+		}
+
+		public abstract class SomeDA : DataAccessor<Whatever2>
+		{
+			[SqlQuery("select 'Gogi' as Name, 10 as Age")]
+			public abstract Whatever GetWhatever();
+		}
+
+		[Test]
+		public void TestIssue121()
+		{
+			using (var dbm = new DbManager())
+			{
+				var da  = DataAccessor.CreateInstance<SomeDA>(dbm);
+				var foo = da.GetWhatever();
+
+				Assert.That(foo, Is.InstanceOf<Whatever>());
+			}
+		}
+
+		#endregion
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/DataAccess/DataTypeTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,169 @@
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Data;
+using System.Data.SqlTypes;
+using System.IO;
+using System.Text;
+using System.Xml;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Reflection.Extension;
+using NUnit.Framework;
+
+#if FW2
+using System.Collections.Generic;
+using PersonDataSet = DataAccessTest.PersonDataSet2;
+#else
+using PersonDataSet = DataAccessTest.PersonDataSet;
+#endif
+
+using BLToolkit.EditableObjects;
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+using BLToolkit.Validation;
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+
+namespace DataAccess
+{
+	[TestFixture]
+	public class DataTypeTest
+	{
+		[TableName("DataTypeTest")]
+		public abstract class ScalarData
+		{
+			[MapField("DataTypeID"), PrimaryKey, NonUpdatable]
+			public abstract int       ID        { get; set; }
+			[MapIgnore(false)]
+			public abstract Byte[]    Binary_   { get; set; }
+			public abstract Boolean   Boolean_  { get; set; }
+			public abstract Byte      Byte_     { get; set; }
+			[MapIgnore(false)]
+			public abstract Byte[]    Bytes_    { get; set; }
+			[NullDateTime]
+			public abstract DateTime  DateTime_ { get; set; }
+			public abstract Decimal   Decimal_  { get; set; }
+			public abstract Double    Double_   { get; set; }
+			public abstract Guid      Guid_     { get; set; }
+			public abstract Int16     Int16_    { get; set; }
+			public abstract Int32     Int32_    { get; set; }
+			public abstract Int64     Int64_    { get; set; }
+			public abstract Decimal   Money_    { get; set; }
+			public abstract Single    Single_   { get; set; }
+			public abstract String    String_   { get; set; }
+#if FW2
+			public abstract Char      Char_     { get; set; }
+//			public abstract SByte     SByte_    { get; set; }
+//			[MapIgnore(false)]
+//			public abstract Stream    Stream_   { get; set; }
+//			public abstract UInt16    UInt16_   { get; set; }
+//			public abstract UInt32    UInt32_   { get; set; }
+//			public abstract UInt64    UInt64_   { get; set; }
+//			public abstract XmlReader Xml_      { get; set; }
+#endif
+		}
+
+		[TableName("DataTypeTest")]
+		public class SqlData
+		{
+			[MapField("DataTypeID"), PrimaryKey, NonUpdatable]
+			public int         ID;
+			public SqlBinary   Binary_;
+/*			public SqlBoolean  Boolean_;
+			public SqlByte     Byte_;
+			public SqlDateTime DateTime_;
+			public SqlDecimal  Decimal_;
+			public SqlDouble   Double_;
+			public SqlGuid     Guid_;
+			public SqlInt16    Int16_;
+			public SqlInt32    Int32_;
+			public SqlInt64    Int64_;
+			public SqlMoney    Money_;
+			public SqlSingle   Single_;
+			public SqlString   String_;
+#if FW2
+			[MapIgnore(false)]
+			public SqlBytes    Bytes_;
+			[MapIgnore(false)]
+			public SqlChars    Char_;
+			[MapIgnore(false)]
+			public SqlXml      Xml_;
+#endif
+*/		}
+
+
+		public abstract class DataTypeAccessor : DataAccessor
+		{
+			public abstract void   Insert([Direction.Output("@DataTypeID")] ScalarData data);
+		}
+
+		private DataTypeAccessor _da;
+		private SprocQuery       _sproc = new SprocQuery();
+		private SqlQuery         _sql   = new SqlQuery();
+
+		public DataTypeTest()
+		{
+			TypeFactory.SaveTypes = true;
+
+			object o = TypeAccessor.CreateInstance(typeof(ScalarData));
+			Assert.IsInstanceOfType(typeof(ScalarData), o);
+			
+			_da = (DataTypeAccessor)DataAccessor.CreateInstance(typeof(DataTypeAccessor));
+			Assert.IsInstanceOfType(typeof(DataTypeAccessor), _da);
+		}
+
+		[Test]
+		public void Sql_Scalar_InsertDeleteTest()
+		{
+			ArrayList list = _sql.SelectAll(typeof(ScalarData));
+			Hashtable tbl  = new Hashtable();
+
+			foreach (ScalarData d in list)
+				tbl[d.ID] = d;
+
+			ScalarData data = (ScalarData) TypeAccessor.CreateInstance(typeof(ScalarData));
+
+			_sql.Insert(data);
+
+			list = _sql.SelectAll(typeof(ScalarData));
+
+			foreach (ScalarData d in list)
+				if (tbl.ContainsKey(d.ID) == false)
+					_sql.Delete(d);
+		}
+
+		[Test]
+		public void Sql_SqlTypes_InsertDeleteTest()
+		{
+			ArrayList list = _sql.SelectAll(typeof(SqlData));
+			Hashtable tbl  = new Hashtable();
+
+			foreach (SqlData d in list)
+				tbl[d.ID] = d;
+
+			SqlData data = (SqlData) TypeAccessor.CreateInstance(typeof(SqlData));
+
+			_sql.Insert(data);
+
+			list = _sql.SelectAll(typeof(SqlData));
+
+			foreach (SqlData d in list)
+				if (tbl.ContainsKey(d.ID) == false)
+					_sql.Delete(d);
+		}
+
+		[Test]
+		public void SunsetByHands()
+		{
+			using (DbManager db = new DbManager())
+			{
+				db
+					.SetCommand(@"INSERT INTO DataTypeTest (Binary_) VALUES (@Binary)", db.Parameter("@Binary", SqlBinary.Null))
+					.ExecuteNonQuery()
+					;
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/DataAccess/DictionaryTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,562 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Common;
+using BLToolkit.DataAccess;
+using BLToolkit.TypeBuilder;
+using BLToolkit.Mapping;
+
+namespace DataAccess
+{
+	[TestFixture]
+	public class DictionaryTest
+	{
+		public class Person
+		{
+			[MapField("PersonID"), PrimaryKey]
+			public int ID;
+			public string LastName;
+			public string FirstName;
+			public string MiddleName;
+		}
+
+		public class Derived : Person
+		{
+			[MapIgnore]
+			public string Ignore;
+			public DateTime Date;
+		}
+
+		// Same as Person, but does not have any primary keys.
+		public class PersonNoPK
+		{
+			[MapField("PersonID")]
+			public int ID;
+			public string LastName;
+			public string FirstName;
+			public string MiddleName;
+		}
+
+		// Same as Person, but has a number of primary keys.
+		public class PersonMultiPK
+		{
+			[MapField("PersonID"), PrimaryKey]
+			public int ID;
+			[PrimaryKey(22)]
+			public string LastName;
+			public string FirstName;
+			public string MiddleName;
+		}
+		
+		[ObjectType(typeof(Person))]
+		public abstract class TestAccessor : DataAccessor
+		{
+			private const string TEST_QUERY = "SELECT * FROM Person WHERE PersonID < 3";
+
+			[SqlQuery("SELECT * FROM Person")]
+			[Index("ID")]
+			public abstract Hashtable   SelectAll1();
+
+			[NoInstance]
+			public abstract Hashtable Persons
+			{
+				[SqlQuery("SELECT * FROM Person")]
+				[Index("ID")]
+				get;
+			}
+
+			[SqlQuery(TEST_QUERY)]
+			[Index("@PersonID", "LastName")]
+			public abstract Hashtable   SelectAll2();
+
+			[SqlQuery(TEST_QUERY)]
+			[Index("@PersonID")]
+			[ScalarFieldName("FirstName")]
+			[ObjectType(typeof(string))]
+			public abstract Hashtable   SelectAll3();
+
+			[SqlQuery(TEST_QUERY)]
+			[Index("PersonID", "LastName")]
+			[ScalarFieldName("FirstName")]
+			[ObjectType(typeof(string))]
+			public abstract Hashtable   SelectAll4();
+
+			[SqlQuery(TEST_QUERY)]
+			[Index("PersonID", "LastName")]
+			[ScalarFieldName(1)]
+			[ObjectType(typeof(string))]
+			public abstract Hashtable   SelectAll5();
+
+			[SqlQuery(TEST_QUERY)]
+			[Index("PersonID", "LastName")]
+			[ScalarFieldName(1)]
+			[ObjectType(typeof(string))]
+			public abstract IDictionary   SelectAllAsIDictionary();
+
+			// Primary Key(s) => scalar filed. This will fail, since
+			// we can not figure out both key type and scalar object type.
+			// Note that version with generics works just fine.
+			//
+			[SqlQuery(TEST_QUERY)]
+			[ScalarFieldName("FirstName"), ObjectType(typeof(string))]
+			public abstract Hashtable   ScalarDictionaryByPK();
+
+			[SqlQuery(TEST_QUERY)]
+			[ObjectType(typeof(PersonNoPK))]
+			public abstract Hashtable   Keyless();
+
+			[SqlQuery(TEST_QUERY)]
+			[ObjectType(typeof(PersonMultiPK))]
+			public abstract Hashtable   MultiPK();
+
+			[SqlQuery(TEST_QUERY)]
+			[ObjectType(typeof(PersonMultiPK))]
+			public abstract void        MultiPKReturnVoid([Destination] Hashtable dictionary);
+
+			[SqlQuery(TEST_QUERY)]
+			public abstract Hashtable   DictionaryByPK();
+
+			[SqlQuery(TEST_QUERY)]
+			[Index("@PersonID")]
+			public abstract Hashtable   DictionaryByIndex();
+
+			[SqlQuery(TEST_QUERY)]
+			[Index(0, 1)]
+			public abstract Hashtable   DictionaryByMapIndex();
+
+			[SqlQuery(TEST_QUERY)]
+			[Index(0, 1)]
+			public abstract IDictionary DictionaryByMapIndexWithDestination([Destination] Hashtable dictionary);
+
+			[SqlQuery(TEST_QUERY)]
+			[Index(0), ScalarFieldName(1)]
+			public abstract void                              GenericsScalarDictionaryByIndexReturnVoid1([Destination] IDictionary<int, string> dictionary);
+
+			[SqlQuery("SELECT * FROM Person")]
+			[Index(new string[] { "ID" })]
+			public abstract Dictionary<int, Person>           SelectAllT1();
+
+			[SqlQuery("SELECT * FROM Person")]
+			[Index("@PersonID", "LastName")]
+			public abstract Dictionary<CompoundValue, Person> SelectAllT2();
+
+			[SqlQuery("SELECT * FROM Person")]
+			[Index("@PersonID")]
+			[ScalarFieldName("FirstName")]
+			public abstract Dictionary<int, string>           SelectAllT3();
+
+			[SqlQuery("SELECT * FROM Person")]
+			[Index("PersonID", "LastName")]
+			[ScalarFieldName("FirstName")]
+			public abstract Dictionary<CompoundValue, string> SelectAllT4();
+
+			[SqlQuery("SELECT * FROM Person")]
+			[Index("PersonID", "LastName")]
+			[ScalarFieldName(1)]
+			public abstract Dictionary<CompoundValue, string> SelectAllT5();
+
+			[SqlQuery("SELECT * FROM Person")]
+			[Index("PersonID", "LastName")]
+			[ScalarFieldName(1)]
+			public abstract IDictionary<CompoundValue, string> SelectAllAsIDictionaryT();
+
+			[SqlQuery(TEST_QUERY)]
+			[ScalarFieldName("FirstName")]
+			public abstract Dictionary<object, string>        GenericsScalarDictionaryByPK();
+
+			[SqlQuery(TEST_QUERY)]
+			[ScalarFieldName(1)] // Index from Db table Person, not type Person!
+			public abstract Dictionary<int, string>           GenericsScalarDictionaryByPK2();
+
+			[SqlQuery(TEST_QUERY)]
+			[Index(0), ScalarFieldName(1)]
+			public abstract Dictionary<int, string>           GenericsScalarDictionaryByIndex();
+
+			[SqlQuery(TEST_QUERY)]
+			[Index(0), ScalarFieldName(1)]
+			public abstract void                              GenericsScalarDictionaryByIndexReturnVoid([Destination] IDictionary<int, string> dictionary);
+
+			[SqlQuery(TEST_QUERY)]
+			[Index(0, 1), ScalarFieldName(1)]
+			public abstract Dictionary<CompoundValue, string> GenericsScalarDictionaryByMapIndex();
+
+			[SqlQuery(TEST_QUERY)]
+			[Index(0)]
+			public abstract Dictionary<int, PersonNoPK>       GenericsScalarDictionaryByPKWithCustomType();
+
+			[SqlQuery(TEST_QUERY)]
+			[ObjectType(typeof(Person))]
+			public abstract Dictionary<int, object>           GenericsScalarDictionaryByPKWithObjectType();
+
+#if SQLITE || SQLCE
+			[SqlQuery("SELECT * FROM Person")]
+#else
+			[ActionName("SelectAll")]
+#endif
+			[Index("ID")]
+			public abstract Dictionary<uint, Person> SelectAllT7();
+
+#if SQLITE || SQLCE
+			[SqlQuery("SELECT * FROM Person")]
+#else
+			[ActionName("SelectAll")]
+#endif
+			public abstract Dictionary<long, Person> SelectAllT8();
+
+#if SQLITE || SQLCE
+			[SqlQuery("SELECT * FROM Person")]
+#else
+			[SprocName("Person_SelectAll")]
+#endif
+			public abstract Dictionary<long, Derived> SelectAllDerived();
+
+#if SQLITE || SQLCE
+			[SqlQuery("SELECT * FROM Person")]
+#else
+			[SprocName("Person_SelectAll")]
+#endif
+			public abstract Dictionary<CompoundValue, PersonMultiPK> SelectAllT9();
+		}
+
+		private TestAccessor _da;
+
+#if ORACLE
+		private const decimal _id = 1m;
+#elif SQLITE
+		private const long    _id = 1;
+#else
+		private const int     _id = 1;
+#endif
+
+		public DictionaryTest()
+		{
+			_da = (TestAccessor)DataAccessor.CreateInstance(typeof(TestAccessor));
+		}
+
+		[Test]
+		public void Test()
+		{
+			Hashtable dic1 = _da.SelectAll1();
+			Assert.AreEqual("John", ((Person)dic1[1]).FirstName);
+
+			Hashtable dic2 = _da.SelectAll2();
+			Assert.AreEqual("John", ((Person)dic2[new CompoundValue(_id, "Pupkin")]).FirstName);
+
+			Hashtable dic3 = _da.SelectAll3();
+			Assert.AreEqual("John", dic3[_id]);
+
+			Hashtable dic4 = _da.SelectAll4();
+			Assert.AreEqual("John", dic4[new CompoundValue(_id, "Pupkin")]);
+
+			Hashtable dic5 = _da.SelectAll5();
+			Assert.AreEqual("John", dic5[new CompoundValue(_id, "Pupkin")]);
+
+			IDictionary dic6 = _da.SelectAllAsIDictionary();
+			Assert.AreEqual("John", dic6[new CompoundValue(_id, "Pupkin")]);
+
+			Dictionary<int, Person> dict1 = _da.SelectAllT1();
+			Assert.AreEqual("John", dict1[1].FirstName);
+
+			Dictionary<CompoundValue, Person> dict2 = _da.SelectAllT2();
+			Assert.AreEqual("John", dict2[new CompoundValue(_id, "Pupkin")].FirstName);
+
+			Dictionary<int, string> dict3 = _da.SelectAllT3();
+			Assert.AreEqual("John", dict3[1]);
+
+			Dictionary<CompoundValue, string> dict4 = _da.SelectAllT4();
+			Assert.AreEqual("John", dict4[new CompoundValue(_id, "Pupkin")]);
+
+			Dictionary<CompoundValue, string> dict5 = _da.SelectAllT5();
+			Assert.AreEqual("John", dict5[new CompoundValue(_id, "Pupkin")]);
+
+			IDictionary<CompoundValue, string> dict6 = _da.SelectAllAsIDictionaryT();
+			Assert.AreEqual("John", dict6[new CompoundValue(_id, "Pupkin")]);
+		}
+
+		[Test]
+		public void AbstractGetterTest()
+		{
+			Hashtable dic = _da.Persons;
+			Assert.AreEqual("John", ((Person)dic[1]).FirstName);
+		}
+
+		[Test, ExpectedException(typeof(DataAccessException))]
+		public void KeylessTest()
+		{
+			TestAccessor da = (TestAccessor)DataAccessor.CreateInstance(typeof(TestAccessor));
+
+			// Exception here:
+			// Index is not defined for the method 'TestAccessor.Keyless'
+			da.Keyless();
+		}
+
+		[Test]
+		public void DictionaryByPKTest()
+		{
+			TestAccessor da = (TestAccessor)DataAccessor.CreateInstance(typeof(TestAccessor));
+
+			Hashtable persons = da.DictionaryByPK();
+
+			Assert.IsNotNull(persons);
+			Assert.IsTrue(persons.Count > 0);
+			Assert.IsNull(persons[-1]);
+
+			Person actualValue = (Person)persons[1];
+			Assert.IsNotNull(actualValue);
+			Assert.AreEqual("John", actualValue.FirstName);
+		}
+
+		[Test]
+		public void DictionaryByIndexTest()
+		{
+			TestAccessor da = (TestAccessor)DataAccessor.CreateInstance(typeof(TestAccessor));
+
+			Hashtable persons = da.DictionaryByIndex();
+
+			Assert.IsNotNull(persons);
+			Assert.IsTrue(persons.Count > 0);
+			Assert.IsNull(persons[-1]);
+
+			Person actualValue = (Person)persons[_id];
+			Assert.IsNotNull(actualValue);
+			Assert.AreEqual("John", actualValue.FirstName);
+		}
+
+		[Test]
+		public void DictionaryByMapIndexTest()
+		{
+			TestAccessor da = (TestAccessor)DataAccessor.CreateInstance(typeof(TestAccessor));
+
+			Hashtable persons = da.DictionaryByMapIndex();
+
+			Assert.IsNotNull(persons);
+			Assert.IsTrue(persons.Count > 0);
+			Assert.IsNull(persons[-1]);
+
+			Person actualValue = (Person)persons[new CompoundValue(1, "Pupkin")];
+			Assert.IsNotNull(actualValue);
+			Assert.AreEqual("John", actualValue.FirstName);
+		}
+
+		[Test]
+		public void DictionaryByMapIndexTestWithDestination()
+		{
+			TestAccessor da = (TestAccessor)DataAccessor.CreateInstance(typeof(TestAccessor));
+
+			IDictionary persons = da.DictionaryByMapIndexWithDestination(new Hashtable());
+
+			Assert.IsNotNull(persons);
+			Assert.IsTrue(persons.Count > 0);
+			Assert.IsNull(persons[-1]);
+
+			Person actualValue = (Person)persons[new CompoundValue(1, "Pupkin")];
+			Assert.IsNotNull(actualValue);
+			Assert.AreEqual("John", actualValue.FirstName);
+		}
+
+		[Test, ExpectedException(typeof(DataAccessException))]
+		public void ScalarDictionaryByPKTest()
+		{
+			TestAccessor da = (TestAccessor)DataAccessor.CreateInstance(typeof(TestAccessor));
+
+			// Exception here:
+			// Index is not defined for the method 'TestAccessor.ScalarDictionaryByPK'
+			da.ScalarDictionaryByPK();
+		}
+
+		[Test]
+		public void MultiPKTest()
+		{
+			TestAccessor da = (TestAccessor)DataAccessor.CreateInstance(typeof(TestAccessor));
+
+			Hashtable persons =  da.MultiPK();
+			
+			Assert.IsNotNull(persons);
+			Assert.IsTrue(persons.Count > 0);
+			Assert.IsNull(persons[new CompoundValue(-1, "NoSuchPerson")]);
+
+			PersonMultiPK actualValue = (PersonMultiPK)persons[new CompoundValue(1, "Pupkin")];
+			Assert.IsNotNull(actualValue);
+			Assert.AreEqual("John", actualValue.FirstName);
+		}
+		
+		[Test]
+		public void MultiPKTestReturnVoid()
+		{
+			TestAccessor da = (TestAccessor)DataAccessor.CreateInstance(typeof(TestAccessor));
+
+			Hashtable persons = new Hashtable();
+			da.MultiPKReturnVoid(persons);
+			
+			Assert.IsNotNull(persons);
+			Assert.IsTrue(persons.Count > 0);
+			Assert.IsNull(persons[new CompoundValue(-1, "NoSuchPerson")]);
+
+			PersonMultiPK actualValue = (PersonMultiPK)persons[new CompoundValue(1, "Pupkin")];
+			Assert.IsNotNull(actualValue);
+			Assert.AreEqual("John", actualValue.FirstName);
+		}
+
+		[Test]
+		public void GenericsScalarDictionaryByPKTest()
+		{
+			TestAccessor da = DataAccessor.CreateInstance<TestAccessor>();
+
+			Dictionary<object, string> persons = da.GenericsScalarDictionaryByPK();
+
+			Assert.IsNotNull(persons);
+			Assert.IsTrue(persons.Count > 0);
+
+			string actualValue = persons[_id];
+			Assert.IsNotNull(actualValue);
+			Assert.AreEqual("John", actualValue);
+		}
+
+		[Test]
+		public void GenericsScalarDictionaryByPKTest2()
+		{
+			TestAccessor da = DataAccessor.CreateInstance<TestAccessor>();
+
+			Dictionary<int, string> persons = da.GenericsScalarDictionaryByPK2();
+
+			Assert.IsNotNull(persons);
+			Assert.IsTrue(persons.Count > 0);
+
+			string actualValue = persons[1];
+			Assert.IsNotNull(actualValue);
+			Assert.AreEqual("John", actualValue);
+		}
+
+		[Test]
+		public void GenericsScalarDictionaryByIndexTest()
+		{
+			TestAccessor da = DataAccessor.CreateInstance<TestAccessor>();
+
+			Dictionary<int, string> persons = da.GenericsScalarDictionaryByIndex();
+
+			Assert.IsNotNull(persons);
+			Assert.IsTrue(persons.Count > 0);
+
+			string actualValue = persons[1];
+			Assert.IsNotNull(actualValue);
+			Assert.AreEqual("John", actualValue);
+		}
+
+		[Test]
+		public void GenericsScalarDictionaryByIndexReturnVoidTest()
+		{
+			TestAccessor da = DataAccessor.CreateInstance<TestAccessor>();
+
+			IDictionary<int, string> persons = new Dictionary<int, string>();
+			da.GenericsScalarDictionaryByIndexReturnVoid(persons);
+
+			Assert.IsNotNull(persons);
+			Assert.IsTrue(persons.Count > 0);
+
+			string actualValue = persons[1];
+			Assert.IsNotNull(actualValue);
+			Assert.AreEqual("John", actualValue);
+		}
+
+		[Test]
+		public void GenericsScalarDictionaryByMapIndexTest()
+		{
+			TestAccessor da = DataAccessor.CreateInstance<TestAccessor>();
+			Dictionary<CompoundValue, string> persons = da.GenericsScalarDictionaryByMapIndex();
+
+			Assert.IsNotNull(persons);
+			Assert.IsTrue(persons.Count > 0);
+
+			string actualValue = persons[new CompoundValue(_id, "John")];
+			Assert.IsNotNull(actualValue);
+			Assert.AreEqual("John", actualValue);
+		}
+
+		[Test]
+		public void GenericsScalarDictionaryByPKWithCustomTypeTest()
+		{
+			TestAccessor da = DataAccessor.CreateInstance<TestAccessor>();
+			Dictionary<int, PersonNoPK> persons = da.GenericsScalarDictionaryByPKWithCustomType();
+
+			Assert.IsNotNull(persons);
+			Assert.IsTrue(persons.Count > 0);
+
+			PersonNoPK actualValue = persons[1];
+			Assert.IsNotNull(actualValue);
+			Assert.AreEqual("John", actualValue.FirstName);
+		}
+
+		[Test]
+		public void GenericsScalarDictionaryByPKWithObjectTypeTest()
+		{
+			TestAccessor da = DataAccessor.CreateInstance<TestAccessor>();
+			Dictionary<int, object> persons = da.GenericsScalarDictionaryByPKWithObjectType();
+
+			Assert.IsNotNull(persons);
+			Assert.IsTrue(persons.Count > 0);
+
+			Person actualValue = (Person) persons[1];
+			Assert.IsNotNull(actualValue);
+			Assert.AreEqual("John", actualValue.FirstName);
+		}
+
+		[Test]
+		public void GenericsDictionaryMismatchKeyTypeTest()
+		{
+			TestAccessor da = DataAccessor.CreateInstance<TestAccessor>();
+			Dictionary<uint, Person> persons = da.SelectAllT7();
+
+			Assert.IsNotNull(persons);
+			Assert.IsTrue(persons.Count > 0);
+
+			Person actualValue = persons[1];
+			Assert.IsNotNull(actualValue);
+			Assert.AreEqual("John", actualValue.FirstName);
+		}
+
+		[Test]
+		public void GenericsDictionaryMismatchKeyTypeTest2()
+		{
+			TestAccessor da = DataAccessor.CreateInstance<TestAccessor>();
+			Dictionary<long, Person> persons = da.SelectAllT8();
+
+			Assert.IsNotNull(persons);
+			Assert.IsTrue(persons.Count > 0);
+
+			Person actualValue = persons[1];
+			Assert.IsNotNull(actualValue);
+			Assert.AreEqual("John", actualValue.FirstName);
+		}
+
+		[Test]
+		public void GenericsDictionaryMismatchKeyTypeWithHierarchyTest()
+		{
+			TestAccessor da = DataAccessor.CreateInstance<TestAccessor>();
+			Dictionary<long, Derived> persons = da.SelectAllDerived();
+
+			Assert.IsNotNull(persons);
+			Assert.IsTrue(persons.Count > 0);
+
+			Person actualValue = persons[1];
+			Assert.IsNotNull(actualValue);
+			Assert.AreEqual("John", actualValue.FirstName);
+		}
+
+		[Test]
+		public void GenericsDictionaryMismatchKeyTypeCompoundValueTest()
+		{
+			TestAccessor da = DataAccessor.CreateInstance<TestAccessor>();
+			Dictionary<CompoundValue, PersonMultiPK> persons = da.SelectAllT9();
+
+			Assert.IsNotNull(persons);
+			Assert.IsTrue(persons.Count > 0);
+
+			PersonMultiPK actualValue = persons[new CompoundValue(1, "Pupkin")];
+			Assert.IsNotNull(actualValue);
+			Assert.AreEqual("John", actualValue.FirstName);
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/DataAccess/DynamicSqlQueryTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,57 @@
+using System;
+using System.Runtime.CompilerServices;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+using BLToolkit.Reflection;
+
+namespace DataAccess
+{
+	[TestFixture]
+	public class DynamicSqlQueryTest
+	{
+		public abstract class DynamicSqlQueryAccessor : DataAccessor
+		{
+			class DynamicSqlQueryAttribute : SqlQueryAttribute
+			{
+				public override string GetSqlText(DataAccessor accessor, DbManager dbManager)
+				{
+					return SqlText + 1;
+				}
+			}
+
+			[DynamicSqlQuery(SqlText="SELECT ", IsDynamic=true)]
+			public abstract int GetID1();
+
+			[SqlQuery("SELECT ", ID = 2)]
+			public abstract int GetID2();
+
+			protected override string PrepareSqlQuery(
+				DbManager db, int queryID, int uniqueQueryID, string sqlQuery)
+			{
+				switch (queryID)
+				{
+					case 2: return sqlQuery + queryID;
+				}
+
+				return base.PrepareSqlQuery(db, queryID, uniqueQueryID, sqlQuery);
+			}
+		}
+
+		[Test]
+		public void DynamicQueryTest()
+		{
+			DynamicSqlQueryAccessor da = TypeAccessor<DynamicSqlQueryAccessor>.CreateInstance();
+			Assert.AreEqual(da.GetID1(), 1);
+		}
+
+		[Test]
+		public void QueryIDTest()
+		{
+			DynamicSqlQueryAccessor da = TypeAccessor<DynamicSqlQueryAccessor>.CreateInstance();
+			Assert.AreEqual(da.GetID2(), 2);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/DataAccess/EnumTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,87 @@
+using System;
+using BLToolkit.Data;
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace DataAccess
+{
+	[TestFixture]
+	public class EnumTest
+	{
+		public enum Gender
+		{
+			[MapValue("F")] E_Female,
+			[MapValue("M")] E_Male,
+			[MapValue("U")] E_Unknown,
+			[MapValue("O")] E_Other
+		}
+
+		public enum RefEnum
+		{
+			[MapValue("A")]  E_A,
+			[MapValue("B")]  E_B,
+			[MapValue("BB")] E_BB
+		}
+
+		public abstract class TestAccessor : DataAccessor
+		{
+#if SQLITE || SQLCE
+			[SqlQuery(@"INSERT INTO Person(FirstName, MiddleName, LastName, Gender)
+						VALUES(@FirstName, @MiddleName, @LastName, @Gender)")]
+#endif
+			public abstract int Person_Insert(
+				string @FirstName, string @MiddleName, string @LastName, Gender @Gender);
+
+#if ACCESS || SQLITE || SQLCE
+#if SQLITE || SQLCE
+			[SqlQuery(@"SELECT * FROM Person WHERE FirstName = @FirstName AND LastName = @LastName")]
+#endif
+			public abstract int Person_SelectByName(
+				string @FirstName, string @LastName	);
+#endif
+
+#if SQLITE || SQLCE
+			[SqlQuery(@"DELETE FROM Person WHERE PersonID = @PersonID")]
+#endif
+			public abstract void Person_Delete(int @personID);
+
+			public abstract void OutRefEnumTest(
+				string @str, out RefEnum @outputStr, ref RefEnum @inputOutputStr);
+
+		}
+
+		[Test]
+		public void Test()
+		{
+			TestAccessor ta = (TestAccessor)DataAccessor.CreateInstance(typeof(TestAccessor));
+
+			int id = ta.Person_Insert("Crazy", null, "Frog", Gender.E_Unknown);
+
+#if ACCESS || SQLITE || SQLCE
+			Assert.AreEqual(0, id);
+			id = ta.Person_SelectByName("Crazy", "Frog");
+#endif
+
+			Assert.IsTrue(id > 0);
+			ta.Person_Delete(id);
+		}
+
+#if !ACCESS && !SQLITE && !SQLCE
+		[Test]
+		public void RefTest()
+		{
+			TestAccessor ta = (TestAccessor)DataAccessor.CreateInstance(typeof(TestAccessor));
+
+			RefEnum a;
+			RefEnum b = RefEnum.E_B;
+
+			ta.OutRefEnumTest("B", out a, ref b);
+
+			Assert.AreEqual(RefEnum.E_B,  a);
+			Assert.AreEqual(RefEnum.E_BB, b);
+		}
+#endif
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/DataAccess/OutRefTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,155 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+using BLToolkit.TypeBuilder;
+
+namespace DataAccess
+{
+	[TestFixture]
+	public class OutRefTest
+	{
+		public class Entity
+		{
+			public int    ID             = 5;
+			public int    outputID;
+			public int    inputOutputID  = 10;
+			public string str            = "5";
+			public string outputStr;
+			public string inputOutputStr = "10";
+		}
+
+		public abstract class TestAccessor : DataAccessor
+		{
+			public abstract void OutRefTest(
+				int    @ID,  out int    @outputID,  ref int    @inputOutputID,
+				string @str, out string @outputStr, ref string @inputOutputStr);
+
+			[SprocName("OutRefTest")]
+			public abstract void OutRefTest2(
+				[ParamNullValue(-1)]      int               ID,
+				[ParamNullValue(-2)]  out int         outputID,
+				[ParamNullValue(-3)]  ref int    inputOutputID,
+				[ParamNullValue("A")]     string            str,
+				[ParamNullValue("B")] out string      outputStr,
+				[ParamNullValue("C")] ref string inputOutputStr);
+
+			public abstract void OutRefTest(out int outputID,
+				[Direction.InputOutput("inputOutputID", "inputOutputStr"), Direction.Output("outputStr", "outputID")] Entity entity,
+				ref string inputOutputStr);
+		}
+
+		[Test]
+		public void Test1()
+		{
+			int    @outputID;
+			int    @inputOutputID = 10;
+			string @outputStr;
+			string @inputOutputStr = "10";
+
+			((TestAccessor)DataAccessor.CreateInstance(typeof(TestAccessor)))
+				.OutRefTest(5,  out @outputID,  ref @inputOutputID,
+				           "5", out @outputStr, ref @inputOutputStr);
+
+			Assert.AreEqual(5,     @outputID);
+			Assert.AreEqual(15,    @inputOutputID);
+			Assert.AreEqual("5",   @outputStr);
+			Assert.AreEqual("510", @inputOutputStr);
+		}
+
+		[Test]
+		public void Test2()
+		{
+			Entity e = new Entity();
+			int    @outputID;
+			string @inputOutputStr = "20";
+
+			((TestAccessor)DataAccessor.CreateInstance(typeof(TestAccessor)))
+				.OutRefTest(out @outputID, e, ref @inputOutputStr);
+
+			Assert.AreEqual(5,     e.outputID);
+			Assert.AreEqual(5,     @outputID);
+			Assert.AreEqual(15,    e.inputOutputID);
+			Assert.AreEqual("5",   e.outputStr);
+			Assert.AreEqual("510", e.inputOutputStr);
+			Assert.AreEqual("510", @inputOutputStr);
+		}
+
+		[Test] 
+		public void NullValueTest()
+		{
+			int    @outputID;
+			int    @inputOutputID = 10;
+			string @outputStr;
+			string @inputOutputStr = "C";
+
+			((TestAccessor)DataAccessor.CreateInstance(typeof(TestAccessor)))
+				.OutRefTest2(-1, out @outputID,  ref @inputOutputID,
+				            "A", out @outputStr, ref @inputOutputStr);
+
+			Assert.AreEqual(-2,        @outputID);
+			Assert.AreEqual(-3,   @inputOutputID);
+			Assert.AreEqual("B",      @outputStr);
+			Assert.AreEqual("C", @inputOutputStr);
+		}
+
+		public class NullableEntity
+		{
+			public int?   ID             = null;
+			public int?   outputID;
+			public int?   inputOutputID  = 20;
+			public string str            = null;
+			public string outputStr;
+			public string inputOutputStr = "40";
+		}
+
+		public abstract class TestNullableAccessor : DataAccessor
+		{
+			public abstract void OutRefTest(
+				int?   @ID,  out int?   @outputID,  ref int?   @inputOutputID,
+				string @str, out string @outputStr, ref string @inputOutputStr);
+
+			public abstract void OutRefTest(
+				out int? @outputID,
+				[Direction.InputOutput("inputOutputID", "inputOutputStr"), Direction.Output("outputStr", "outputID")] NullableEntity entity,
+				ref string @inputOutputStr);
+
+		}
+
+		[Test]
+		public void TestNullable1()
+		{
+			int?   @outputID;
+			int?   @inputOutputID = 10;
+			string @outputStr;
+			string @inputOutputStr = "";
+
+			DataAccessor.CreateInstance<TestNullableAccessor>()
+				.OutRefTest(null, out @outputID,  ref @inputOutputID,
+				            null, out @outputStr, ref @inputOutputStr);
+
+			Assert.IsNull (@outputID);
+			Assert.IsNull (@inputOutputID);
+			Assert.IsEmpty(@outputStr);
+			Assert.IsEmpty(@inputOutputStr);
+		}
+
+		[Test]
+		public void TestNullable2()
+		{
+			NullableEntity e = new NullableEntity();
+			int?   @outputID;
+			string @inputOutputStr = "20";
+			e.str = "20";
+
+			DataAccessor.CreateInstance<TestNullableAccessor>()
+				.OutRefTest(out @outputID, e, ref @inputOutputStr);
+
+			Assert.IsNull  (@outputID);
+			Assert.AreEqual("20", e.outputStr);
+			Assert.IsNull  (e.inputOutputID);
+			Assert.AreEqual("2040", @inputOutputStr);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/DataAccess/PersonDataSet2.Designer.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1106 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.1
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+#pragma warning disable 1591
+
+namespace DataAccessTest {
+    
+    
+    /// <summary>
+    ///Represents a strongly typed in-memory cache of data.
+    ///</summary>
+    [global::System.Serializable()]
+    [global::System.ComponentModel.DesignerCategoryAttribute("code")]
+    [global::System.ComponentModel.ToolboxItem(true)]
+    [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedDataSetSchema")]
+    [global::System.Xml.Serialization.XmlRootAttribute("PersonDataSet2")]
+    [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.DataSet")]
+    public partial class PersonDataSet2 : global::System.Data.DataSet {
+        
+        private PersonDataTable tablePerson;
+        
+        private global::System.Data.SchemaSerializationMode _schemaSerializationMode = global::System.Data.SchemaSerializationMode.IncludeSchema;
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        public PersonDataSet2() {
+            this.BeginInit();
+            this.InitClass();
+            global::System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler = new global::System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);
+            base.Tables.CollectionChanged += schemaChangedHandler;
+            base.Relations.CollectionChanged += schemaChangedHandler;
+            this.EndInit();
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        protected PersonDataSet2(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) : 
+                base(info, context, false) {
+            if ((this.IsBinarySerialized(info, context) == true)) {
+                this.InitVars(false);
+                global::System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler1 = new global::System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);
+                this.Tables.CollectionChanged += schemaChangedHandler1;
+                this.Relations.CollectionChanged += schemaChangedHandler1;
+                return;
+            }
+            string strSchema = ((string)(info.GetValue("XmlSchema", typeof(string))));
+            if ((this.DetermineSchemaSerializationMode(info, context) == global::System.Data.SchemaSerializationMode.IncludeSchema)) {
+                global::System.Data.DataSet ds = new global::System.Data.DataSet();
+                ds.ReadXmlSchema(new global::System.Xml.XmlTextReader(new global::System.IO.StringReader(strSchema)));
+                if ((ds.Tables["Person"] != null)) {
+                    base.Tables.Add(new PersonDataTable(ds.Tables["Person"]));
+                }
+                this.DataSetName = ds.DataSetName;
+                this.Prefix = ds.Prefix;
+                this.Namespace = ds.Namespace;
+                this.Locale = ds.Locale;
+                this.CaseSensitive = ds.CaseSensitive;
+                this.EnforceConstraints = ds.EnforceConstraints;
+                this.Merge(ds, false, global::System.Data.MissingSchemaAction.Add);
+                this.InitVars();
+            }
+            else {
+                this.ReadXmlSchema(new global::System.Xml.XmlTextReader(new global::System.IO.StringReader(strSchema)));
+            }
+            this.GetSerializationData(info, context);
+            global::System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler = new global::System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);
+            base.Tables.CollectionChanged += schemaChangedHandler;
+            this.Relations.CollectionChanged += schemaChangedHandler;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        [global::System.ComponentModel.Browsable(false)]
+        [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)]
+        public PersonDataTable Person {
+            get {
+                return this.tablePerson;
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        [global::System.ComponentModel.BrowsableAttribute(true)]
+        [global::System.ComponentModel.DesignerSerializationVisibilityAttribute(global::System.ComponentModel.DesignerSerializationVisibility.Visible)]
+        public override global::System.Data.SchemaSerializationMode SchemaSerializationMode {
+            get {
+                return this._schemaSerializationMode;
+            }
+            set {
+                this._schemaSerializationMode = value;
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        [global::System.ComponentModel.DesignerSerializationVisibilityAttribute(global::System.ComponentModel.DesignerSerializationVisibility.Hidden)]
+        public new global::System.Data.DataTableCollection Tables {
+            get {
+                return base.Tables;
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        [global::System.ComponentModel.DesignerSerializationVisibilityAttribute(global::System.ComponentModel.DesignerSerializationVisibility.Hidden)]
+        public new global::System.Data.DataRelationCollection Relations {
+            get {
+                return base.Relations;
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        protected override void InitializeDerivedDataSet() {
+            this.BeginInit();
+            this.InitClass();
+            this.EndInit();
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        public override global::System.Data.DataSet Clone() {
+            PersonDataSet2 cln = ((PersonDataSet2)(base.Clone()));
+            cln.InitVars();
+            cln.SchemaSerializationMode = this.SchemaSerializationMode;
+            return cln;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        protected override bool ShouldSerializeTables() {
+            return false;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        protected override bool ShouldSerializeRelations() {
+            return false;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        protected override void ReadXmlSerializable(global::System.Xml.XmlReader reader) {
+            if ((this.DetermineSchemaSerializationMode(reader) == global::System.Data.SchemaSerializationMode.IncludeSchema)) {
+                this.Reset();
+                global::System.Data.DataSet ds = new global::System.Data.DataSet();
+                ds.ReadXml(reader);
+                if ((ds.Tables["Person"] != null)) {
+                    base.Tables.Add(new PersonDataTable(ds.Tables["Person"]));
+                }
+                this.DataSetName = ds.DataSetName;
+                this.Prefix = ds.Prefix;
+                this.Namespace = ds.Namespace;
+                this.Locale = ds.Locale;
+                this.CaseSensitive = ds.CaseSensitive;
+                this.EnforceConstraints = ds.EnforceConstraints;
+                this.Merge(ds, false, global::System.Data.MissingSchemaAction.Add);
+                this.InitVars();
+            }
+            else {
+                this.ReadXml(reader);
+                this.InitVars();
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        protected override global::System.Xml.Schema.XmlSchema GetSchemaSerializable() {
+            global::System.IO.MemoryStream stream = new global::System.IO.MemoryStream();
+            this.WriteXmlSchema(new global::System.Xml.XmlTextWriter(stream, null));
+            stream.Position = 0;
+            return global::System.Xml.Schema.XmlSchema.Read(new global::System.Xml.XmlTextReader(stream), null);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        internal void InitVars() {
+            this.InitVars(true);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        internal void InitVars(bool initTable) {
+            this.tablePerson = ((PersonDataTable)(base.Tables["Person"]));
+            if ((initTable == true)) {
+                if ((this.tablePerson != null)) {
+                    this.tablePerson.InitVars();
+                }
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        private void InitClass() {
+            this.DataSetName = "PersonDataSet2";
+            this.Prefix = "";
+            this.Namespace = "http://tempuri.org/PersonDataSet2.xsd";
+            this.EnforceConstraints = true;
+            this.SchemaSerializationMode = global::System.Data.SchemaSerializationMode.IncludeSchema;
+            this.tablePerson = new PersonDataTable();
+            base.Tables.Add(this.tablePerson);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        private bool ShouldSerializePerson() {
+            return false;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        private void SchemaChanged(object sender, global::System.ComponentModel.CollectionChangeEventArgs e) {
+            if ((e.Action == global::System.ComponentModel.CollectionChangeAction.Remove)) {
+                this.InitVars();
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        public static global::System.Xml.Schema.XmlSchemaComplexType GetTypedDataSetSchema(global::System.Xml.Schema.XmlSchemaSet xs) {
+            PersonDataSet2 ds = new PersonDataSet2();
+            global::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType();
+            global::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence();
+            global::System.Xml.Schema.XmlSchemaAny any = new global::System.Xml.Schema.XmlSchemaAny();
+            any.Namespace = ds.Namespace;
+            sequence.Items.Add(any);
+            type.Particle = sequence;
+            global::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable();
+            if (xs.Contains(dsSchema.TargetNamespace)) {
+                global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream();
+                global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream();
+                try {
+                    global::System.Xml.Schema.XmlSchema schema = null;
+                    dsSchema.Write(s1);
+                    for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) {
+                        schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current));
+                        s2.SetLength(0);
+                        schema.Write(s2);
+                        if ((s1.Length == s2.Length)) {
+                            s1.Position = 0;
+                            s2.Position = 0;
+                            for (; ((s1.Position != s1.Length) 
+                                        && (s1.ReadByte() == s2.ReadByte())); ) {
+                                ;
+                            }
+                            if ((s1.Position == s1.Length)) {
+                                return type;
+                            }
+                        }
+                    }
+                }
+                finally {
+                    if ((s1 != null)) {
+                        s1.Close();
+                    }
+                    if ((s2 != null)) {
+                        s2.Close();
+                    }
+                }
+            }
+            xs.Add(dsSchema);
+            return type;
+        }
+        
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        public delegate void PersonRowChangeEventHandler(object sender, PersonRowChangeEvent e);
+        
+        /// <summary>
+        ///Represents the strongly named DataTable class.
+        ///</summary>
+        [global::System.Serializable()]
+        [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedTableSchema")]
+        public partial class PersonDataTable : global::System.Data.TypedTableBase<PersonRow> {
+            
+            private global::System.Data.DataColumn columnPersonID;
+            
+            private global::System.Data.DataColumn columnFirstName;
+            
+            private global::System.Data.DataColumn columnLastName;
+            
+            private global::System.Data.DataColumn columnMiddleName;
+            
+            private global::System.Data.DataColumn columnGender;
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public PersonDataTable() {
+                this.TableName = "Person";
+                this.BeginInit();
+                this.InitClass();
+                this.EndInit();
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            internal PersonDataTable(global::System.Data.DataTable table) {
+                this.TableName = table.TableName;
+                if ((table.CaseSensitive != table.DataSet.CaseSensitive)) {
+                    this.CaseSensitive = table.CaseSensitive;
+                }
+                if ((table.Locale.ToString() != table.DataSet.Locale.ToString())) {
+                    this.Locale = table.Locale;
+                }
+                if ((table.Namespace != table.DataSet.Namespace)) {
+                    this.Namespace = table.Namespace;
+                }
+                this.Prefix = table.Prefix;
+                this.MinimumCapacity = table.MinimumCapacity;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected PersonDataTable(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) : 
+                    base(info, context) {
+                this.InitVars();
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn PersonIDColumn {
+                get {
+                    return this.columnPersonID;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn FirstNameColumn {
+                get {
+                    return this.columnFirstName;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn LastNameColumn {
+                get {
+                    return this.columnLastName;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn MiddleNameColumn {
+                get {
+                    return this.columnMiddleName;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataColumn GenderColumn {
+                get {
+                    return this.columnGender;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            [global::System.ComponentModel.Browsable(false)]
+            public int Count {
+                get {
+                    return this.Rows.Count;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public PersonRow this[int index] {
+                get {
+                    return ((PersonRow)(this.Rows[index]));
+                }
+            }
+            
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public event PersonRowChangeEventHandler PersonRowChanging;
+            
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public event PersonRowChangeEventHandler PersonRowChanged;
+            
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public event PersonRowChangeEventHandler PersonRowDeleting;
+            
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public event PersonRowChangeEventHandler PersonRowDeleted;
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void AddPersonRow(PersonRow row) {
+                this.Rows.Add(row);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public PersonRow AddPersonRow(string FirstName, string LastName, string MiddleName, string Gender) {
+                PersonRow rowPersonRow = ((PersonRow)(this.NewRow()));
+                object[] columnValuesArray = new object[] {
+                        null,
+                        FirstName,
+                        LastName,
+                        MiddleName,
+                        Gender};
+                rowPersonRow.ItemArray = columnValuesArray;
+                this.Rows.Add(rowPersonRow);
+                return rowPersonRow;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public PersonRow FindByPersonID(int PersonID) {
+                return ((PersonRow)(this.Rows.Find(new object[] {
+                            PersonID})));
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public override global::System.Data.DataTable Clone() {
+                PersonDataTable cln = ((PersonDataTable)(base.Clone()));
+                cln.InitVars();
+                return cln;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override global::System.Data.DataTable CreateInstance() {
+                return new PersonDataTable();
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            internal void InitVars() {
+                this.columnPersonID = base.Columns["PersonID"];
+                this.columnFirstName = base.Columns["FirstName"];
+                this.columnLastName = base.Columns["LastName"];
+                this.columnMiddleName = base.Columns["MiddleName"];
+                this.columnGender = base.Columns["Gender"];
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            private void InitClass() {
+                this.columnPersonID = new global::System.Data.DataColumn("PersonID", typeof(int), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnPersonID);
+                this.columnFirstName = new global::System.Data.DataColumn("FirstName", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnFirstName);
+                this.columnLastName = new global::System.Data.DataColumn("LastName", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnLastName);
+                this.columnMiddleName = new global::System.Data.DataColumn("MiddleName", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnMiddleName);
+                this.columnGender = new global::System.Data.DataColumn("Gender", typeof(string), null, global::System.Data.MappingType.Element);
+                base.Columns.Add(this.columnGender);
+                this.Constraints.Add(new global::System.Data.UniqueConstraint("Constraint1", new global::System.Data.DataColumn[] {
+                                this.columnPersonID}, true));
+                this.columnPersonID.AutoIncrement = true;
+                this.columnPersonID.AllowDBNull = false;
+                this.columnPersonID.ReadOnly = true;
+                this.columnPersonID.Unique = true;
+                this.columnFirstName.AllowDBNull = false;
+                this.columnFirstName.MaxLength = 50;
+                this.columnLastName.AllowDBNull = false;
+                this.columnLastName.MaxLength = 50;
+                this.columnMiddleName.MaxLength = 50;
+                this.columnGender.AllowDBNull = false;
+                this.columnGender.MaxLength = 1;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public PersonRow NewPersonRow() {
+                return ((PersonRow)(this.NewRow()));
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override global::System.Data.DataRow NewRowFromBuilder(global::System.Data.DataRowBuilder builder) {
+                return new PersonRow(builder);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override global::System.Type GetRowType() {
+                return typeof(PersonRow);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override void OnRowChanged(global::System.Data.DataRowChangeEventArgs e) {
+                base.OnRowChanged(e);
+                if ((this.PersonRowChanged != null)) {
+                    this.PersonRowChanged(this, new PersonRowChangeEvent(((PersonRow)(e.Row)), e.Action));
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override void OnRowChanging(global::System.Data.DataRowChangeEventArgs e) {
+                base.OnRowChanging(e);
+                if ((this.PersonRowChanging != null)) {
+                    this.PersonRowChanging(this, new PersonRowChangeEvent(((PersonRow)(e.Row)), e.Action));
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override void OnRowDeleted(global::System.Data.DataRowChangeEventArgs e) {
+                base.OnRowDeleted(e);
+                if ((this.PersonRowDeleted != null)) {
+                    this.PersonRowDeleted(this, new PersonRowChangeEvent(((PersonRow)(e.Row)), e.Action));
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            protected override void OnRowDeleting(global::System.Data.DataRowChangeEventArgs e) {
+                base.OnRowDeleting(e);
+                if ((this.PersonRowDeleting != null)) {
+                    this.PersonRowDeleting(this, new PersonRowChangeEvent(((PersonRow)(e.Row)), e.Action));
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void RemovePersonRow(PersonRow row) {
+                this.Rows.Remove(row);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public static global::System.Xml.Schema.XmlSchemaComplexType GetTypedTableSchema(global::System.Xml.Schema.XmlSchemaSet xs) {
+                global::System.Xml.Schema.XmlSchemaComplexType type = new global::System.Xml.Schema.XmlSchemaComplexType();
+                global::System.Xml.Schema.XmlSchemaSequence sequence = new global::System.Xml.Schema.XmlSchemaSequence();
+                PersonDataSet2 ds = new PersonDataSet2();
+                global::System.Xml.Schema.XmlSchemaAny any1 = new global::System.Xml.Schema.XmlSchemaAny();
+                any1.Namespace = "http://www.w3.org/2001/XMLSchema";
+                any1.MinOccurs = new decimal(0);
+                any1.MaxOccurs = decimal.MaxValue;
+                any1.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
+                sequence.Items.Add(any1);
+                global::System.Xml.Schema.XmlSchemaAny any2 = new global::System.Xml.Schema.XmlSchemaAny();
+                any2.Namespace = "urn:schemas-microsoft-com:xml-diffgram-v1";
+                any2.MinOccurs = new decimal(1);
+                any2.ProcessContents = global::System.Xml.Schema.XmlSchemaContentProcessing.Lax;
+                sequence.Items.Add(any2);
+                global::System.Xml.Schema.XmlSchemaAttribute attribute1 = new global::System.Xml.Schema.XmlSchemaAttribute();
+                attribute1.Name = "namespace";
+                attribute1.FixedValue = ds.Namespace;
+                type.Attributes.Add(attribute1);
+                global::System.Xml.Schema.XmlSchemaAttribute attribute2 = new global::System.Xml.Schema.XmlSchemaAttribute();
+                attribute2.Name = "tableTypeName";
+                attribute2.FixedValue = "PersonDataTable";
+                type.Attributes.Add(attribute2);
+                type.Particle = sequence;
+                global::System.Xml.Schema.XmlSchema dsSchema = ds.GetSchemaSerializable();
+                if (xs.Contains(dsSchema.TargetNamespace)) {
+                    global::System.IO.MemoryStream s1 = new global::System.IO.MemoryStream();
+                    global::System.IO.MemoryStream s2 = new global::System.IO.MemoryStream();
+                    try {
+                        global::System.Xml.Schema.XmlSchema schema = null;
+                        dsSchema.Write(s1);
+                        for (global::System.Collections.IEnumerator schemas = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator(); schemas.MoveNext(); ) {
+                            schema = ((global::System.Xml.Schema.XmlSchema)(schemas.Current));
+                            s2.SetLength(0);
+                            schema.Write(s2);
+                            if ((s1.Length == s2.Length)) {
+                                s1.Position = 0;
+                                s2.Position = 0;
+                                for (; ((s1.Position != s1.Length) 
+                                            && (s1.ReadByte() == s2.ReadByte())); ) {
+                                    ;
+                                }
+                                if ((s1.Position == s1.Length)) {
+                                    return type;
+                                }
+                            }
+                        }
+                    }
+                    finally {
+                        if ((s1 != null)) {
+                            s1.Close();
+                        }
+                        if ((s2 != null)) {
+                            s2.Close();
+                        }
+                    }
+                }
+                xs.Add(dsSchema);
+                return type;
+            }
+        }
+        
+        /// <summary>
+        ///Represents strongly named DataRow class.
+        ///</summary>
+        public partial class PersonRow : global::System.Data.DataRow {
+            
+            private PersonDataTable tablePerson;
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            internal PersonRow(global::System.Data.DataRowBuilder rb) : 
+                    base(rb) {
+                this.tablePerson = ((PersonDataTable)(this.Table));
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public int PersonID {
+                get {
+                    return ((int)(this[this.tablePerson.PersonIDColumn]));
+                }
+                set {
+                    this[this.tablePerson.PersonIDColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string FirstName {
+                get {
+                    return ((string)(this[this.tablePerson.FirstNameColumn]));
+                }
+                set {
+                    this[this.tablePerson.FirstNameColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string LastName {
+                get {
+                    return ((string)(this[this.tablePerson.LastNameColumn]));
+                }
+                set {
+                    this[this.tablePerson.LastNameColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string MiddleName {
+                get {
+                    try {
+                        return ((string)(this[this.tablePerson.MiddleNameColumn]));
+                    }
+                    catch (global::System.InvalidCastException e) {
+                        throw new global::System.Data.StrongTypingException("The value for column \'MiddleName\' in table \'Person\' is DBNull.", e);
+                    }
+                }
+                set {
+                    this[this.tablePerson.MiddleNameColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public string Gender {
+                get {
+                    return ((string)(this[this.tablePerson.GenderColumn]));
+                }
+                set {
+                    this[this.tablePerson.GenderColumn] = value;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public bool IsMiddleNameNull() {
+                return this.IsNull(this.tablePerson.MiddleNameColumn);
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public void SetMiddleNameNull() {
+                this[this.tablePerson.MiddleNameColumn] = global::System.Convert.DBNull;
+            }
+        }
+        
+        /// <summary>
+        ///Row event argument class
+        ///</summary>
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        public class PersonRowChangeEvent : global::System.EventArgs {
+            
+            private PersonRow eventRow;
+            
+            private global::System.Data.DataRowAction eventAction;
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public PersonRowChangeEvent(PersonRow row, global::System.Data.DataRowAction action) {
+                this.eventRow = row;
+                this.eventAction = action;
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public PersonRow Row {
+                get {
+                    return this.eventRow;
+                }
+            }
+            
+            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+            public global::System.Data.DataRowAction Action {
+                get {
+                    return this.eventAction;
+                }
+            }
+        }
+    }
+}
+namespace DataAccessTest.PersonDataSet2TableAdapters {
+    
+    
+    /// <summary>
+    ///Represents the connection and commands used to retrieve and save data.
+    ///</summary>
+    [global::System.ComponentModel.DesignerCategoryAttribute("code")]
+    [global::System.ComponentModel.ToolboxItem(true)]
+    [global::System.ComponentModel.DataObjectAttribute(true)]
+    [global::System.ComponentModel.DesignerAttribute("Microsoft.VSDesigner.DataSource.Design.TableAdapterDesigner, Microsoft.VSDesigner" +
+        ", Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
+    [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
+    public partial class PersonTableAdapter : global::System.ComponentModel.Component {
+        
+        private global::System.Data.SqlClient.SqlDataAdapter _adapter;
+        
+        private global::System.Data.SqlClient.SqlConnection _connection;
+        
+        private global::System.Data.SqlClient.SqlCommand[] _commandCollection;
+        
+        private bool _clearBeforeFill;
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        public PersonTableAdapter() {
+            this.ClearBeforeFill = true;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        private global::System.Data.SqlClient.SqlDataAdapter Adapter {
+            get {
+                if ((this._adapter == null)) {
+                    this.InitAdapter();
+                }
+                return this._adapter;
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        internal global::System.Data.SqlClient.SqlConnection Connection {
+            get {
+                if ((this._connection == null)) {
+                    this.InitConnection();
+                }
+                return this._connection;
+            }
+            set {
+                this._connection = value;
+                if ((this.Adapter.InsertCommand != null)) {
+                    this.Adapter.InsertCommand.Connection = value;
+                }
+                if ((this.Adapter.DeleteCommand != null)) {
+                    this.Adapter.DeleteCommand.Connection = value;
+                }
+                if ((this.Adapter.UpdateCommand != null)) {
+                    this.Adapter.UpdateCommand.Connection = value;
+                }
+                for (int i = 0; (i < this.CommandCollection.Length); i = (i + 1)) {
+                    if ((this.CommandCollection[i] != null)) {
+                        ((global::System.Data.SqlClient.SqlCommand)(this.CommandCollection[i])).Connection = value;
+                    }
+                }
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        protected global::System.Data.SqlClient.SqlCommand[] CommandCollection {
+            get {
+                if ((this._commandCollection == null)) {
+                    this.InitCommandCollection();
+                }
+                return this._commandCollection;
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        public bool ClearBeforeFill {
+            get {
+                return this._clearBeforeFill;
+            }
+            set {
+                this._clearBeforeFill = value;
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        private void InitAdapter() {
+            this._adapter = new global::System.Data.SqlClient.SqlDataAdapter();
+            global::System.Data.Common.DataTableMapping tableMapping = new global::System.Data.Common.DataTableMapping();
+            tableMapping.SourceTable = "Table";
+            tableMapping.DataSetTable = "Person";
+            tableMapping.ColumnMappings.Add("PersonID", "PersonID");
+            tableMapping.ColumnMappings.Add("FirstName", "FirstName");
+            tableMapping.ColumnMappings.Add("LastName", "LastName");
+            tableMapping.ColumnMappings.Add("MiddleName", "MiddleName");
+            tableMapping.ColumnMappings.Add("Gender", "Gender");
+            this._adapter.TableMappings.Add(tableMapping);
+            this._adapter.DeleteCommand = new global::System.Data.SqlClient.SqlCommand();
+            this._adapter.DeleteCommand.Connection = this.Connection;
+            this._adapter.DeleteCommand.CommandText = @"DELETE FROM [dbo].[Person] WHERE (([PersonID] = @Original_PersonID) AND ([FirstName] = @Original_FirstName) AND ([LastName] = @Original_LastName) AND ((@IsNull_MiddleName = 1 AND [MiddleName] IS NULL) OR ([MiddleName] = @Original_MiddleName)) AND ([Gender] = @Original_Gender))";
+            this._adapter.DeleteCommand.CommandType = global::System.Data.CommandType.Text;
+            this._adapter.DeleteCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Original_PersonID", global::System.Data.SqlDbType.Int, 0, global::System.Data.ParameterDirection.Input, 0, 0, "PersonID", global::System.Data.DataRowVersion.Original, false, null, "", "", ""));
+            this._adapter.DeleteCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Original_FirstName", global::System.Data.SqlDbType.NVarChar, 0, global::System.Data.ParameterDirection.Input, 0, 0, "FirstName", global::System.Data.DataRowVersion.Original, false, null, "", "", ""));
+            this._adapter.DeleteCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Original_LastName", global::System.Data.SqlDbType.NVarChar, 0, global::System.Data.ParameterDirection.Input, 0, 0, "LastName", global::System.Data.DataRowVersion.Original, false, null, "", "", ""));
+            this._adapter.DeleteCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@IsNull_MiddleName", global::System.Data.SqlDbType.Int, 0, global::System.Data.ParameterDirection.Input, 0, 0, "MiddleName", global::System.Data.DataRowVersion.Original, true, null, "", "", ""));
+            this._adapter.DeleteCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Original_MiddleName", global::System.Data.SqlDbType.NVarChar, 0, global::System.Data.ParameterDirection.Input, 0, 0, "MiddleName", global::System.Data.DataRowVersion.Original, false, null, "", "", ""));
+            this._adapter.DeleteCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Original_Gender", global::System.Data.SqlDbType.Char, 0, global::System.Data.ParameterDirection.Input, 0, 0, "Gender", global::System.Data.DataRowVersion.Original, false, null, "", "", ""));
+            this._adapter.InsertCommand = new global::System.Data.SqlClient.SqlCommand();
+            this._adapter.InsertCommand.Connection = this.Connection;
+            this._adapter.InsertCommand.CommandText = "INSERT INTO [dbo].[Person] ([FirstName], [LastName], [MiddleName], [Gender]) VALU" +
+                "ES (@FirstName, @LastName, @MiddleName, @Gender);\r\nSELECT PersonID, FirstName, L" +
+                "astName, MiddleName, Gender FROM Person WHERE (PersonID = SCOPE_IDENTITY())";
+            this._adapter.InsertCommand.CommandType = global::System.Data.CommandType.Text;
+            this._adapter.InsertCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@FirstName", global::System.Data.SqlDbType.NVarChar, 0, global::System.Data.ParameterDirection.Input, 0, 0, "FirstName", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
+            this._adapter.InsertCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@LastName", global::System.Data.SqlDbType.NVarChar, 0, global::System.Data.ParameterDirection.Input, 0, 0, "LastName", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
+            this._adapter.InsertCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@MiddleName", global::System.Data.SqlDbType.NVarChar, 0, global::System.Data.ParameterDirection.Input, 0, 0, "MiddleName", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
+            this._adapter.InsertCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Gender", global::System.Data.SqlDbType.Char, 0, global::System.Data.ParameterDirection.Input, 0, 0, "Gender", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
+            this._adapter.UpdateCommand = new global::System.Data.SqlClient.SqlCommand();
+            this._adapter.UpdateCommand.Connection = this.Connection;
+            this._adapter.UpdateCommand.CommandText = @"UPDATE [dbo].[Person] SET [FirstName] = @FirstName, [LastName] = @LastName, [MiddleName] = @MiddleName, [Gender] = @Gender WHERE (([PersonID] = @Original_PersonID) AND ([FirstName] = @Original_FirstName) AND ([LastName] = @Original_LastName) AND ((@IsNull_MiddleName = 1 AND [MiddleName] IS NULL) OR ([MiddleName] = @Original_MiddleName)) AND ([Gender] = @Original_Gender));
+SELECT PersonID, FirstName, LastName, MiddleName, Gender FROM Person WHERE (PersonID = @PersonID)";
+            this._adapter.UpdateCommand.CommandType = global::System.Data.CommandType.Text;
+            this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@FirstName", global::System.Data.SqlDbType.NVarChar, 0, global::System.Data.ParameterDirection.Input, 0, 0, "FirstName", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
+            this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@LastName", global::System.Data.SqlDbType.NVarChar, 0, global::System.Data.ParameterDirection.Input, 0, 0, "LastName", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
+            this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@MiddleName", global::System.Data.SqlDbType.NVarChar, 0, global::System.Data.ParameterDirection.Input, 0, 0, "MiddleName", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
+            this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Gender", global::System.Data.SqlDbType.Char, 0, global::System.Data.ParameterDirection.Input, 0, 0, "Gender", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
+            this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Original_PersonID", global::System.Data.SqlDbType.Int, 0, global::System.Data.ParameterDirection.Input, 0, 0, "PersonID", global::System.Data.DataRowVersion.Original, false, null, "", "", ""));
+            this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Original_FirstName", global::System.Data.SqlDbType.NVarChar, 0, global::System.Data.ParameterDirection.Input, 0, 0, "FirstName", global::System.Data.DataRowVersion.Original, false, null, "", "", ""));
+            this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Original_LastName", global::System.Data.SqlDbType.NVarChar, 0, global::System.Data.ParameterDirection.Input, 0, 0, "LastName", global::System.Data.DataRowVersion.Original, false, null, "", "", ""));
+            this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@IsNull_MiddleName", global::System.Data.SqlDbType.Int, 0, global::System.Data.ParameterDirection.Input, 0, 0, "MiddleName", global::System.Data.DataRowVersion.Original, true, null, "", "", ""));
+            this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Original_MiddleName", global::System.Data.SqlDbType.NVarChar, 0, global::System.Data.ParameterDirection.Input, 0, 0, "MiddleName", global::System.Data.DataRowVersion.Original, false, null, "", "", ""));
+            this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@Original_Gender", global::System.Data.SqlDbType.Char, 0, global::System.Data.ParameterDirection.Input, 0, 0, "Gender", global::System.Data.DataRowVersion.Original, false, null, "", "", ""));
+            this._adapter.UpdateCommand.Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@PersonID", global::System.Data.SqlDbType.Int, 4, global::System.Data.ParameterDirection.Input, 0, 0, "PersonID", global::System.Data.DataRowVersion.Current, false, null, "", "", ""));
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        private void InitConnection() {
+            this._connection = new global::System.Data.SqlClient.SqlConnection();
+            this._connection.ConnectionString = global::UnitTests.CS.Properties.Settings.Default.BLToolkitDataConnectionString;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        private void InitCommandCollection() {
+            this._commandCollection = new global::System.Data.SqlClient.SqlCommand[1];
+            this._commandCollection[0] = new global::System.Data.SqlClient.SqlCommand();
+            this._commandCollection[0].Connection = this.Connection;
+            this._commandCollection[0].CommandText = "SELECT PersonID, FirstName, LastName, MiddleName, Gender FROM dbo.Person";
+            this._commandCollection[0].CommandType = global::System.Data.CommandType.Text;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
+        [global::System.ComponentModel.DataObjectMethodAttribute(global::System.ComponentModel.DataObjectMethodType.Fill, true)]
+        public virtual int Fill(PersonDataSet2.PersonDataTable dataTable) {
+            this.Adapter.SelectCommand = this.CommandCollection[0];
+            if ((this.ClearBeforeFill == true)) {
+                dataTable.Clear();
+            }
+            int returnValue = this.Adapter.Fill(dataTable);
+            return returnValue;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
+        [global::System.ComponentModel.DataObjectMethodAttribute(global::System.ComponentModel.DataObjectMethodType.Select, true)]
+        public virtual PersonDataSet2.PersonDataTable GetData() {
+            this.Adapter.SelectCommand = this.CommandCollection[0];
+            PersonDataSet2.PersonDataTable dataTable = new PersonDataSet2.PersonDataTable();
+            this.Adapter.Fill(dataTable);
+            return dataTable;
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
+        public virtual int Update(PersonDataSet2.PersonDataTable dataTable) {
+            return this.Adapter.Update(dataTable);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
+        public virtual int Update(PersonDataSet2 dataSet) {
+            return this.Adapter.Update(dataSet, "Person");
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
+        public virtual int Update(global::System.Data.DataRow dataRow) {
+            return this.Adapter.Update(new global::System.Data.DataRow[] {
+                        dataRow});
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
+        public virtual int Update(global::System.Data.DataRow[] dataRows) {
+            return this.Adapter.Update(dataRows);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
+        [global::System.ComponentModel.DataObjectMethodAttribute(global::System.ComponentModel.DataObjectMethodType.Delete, true)]
+        public virtual int Delete(int Original_PersonID, string Original_FirstName, string Original_LastName, string Original_MiddleName, string Original_Gender) {
+            this.Adapter.DeleteCommand.Parameters[0].Value = ((int)(Original_PersonID));
+            if ((Original_FirstName == null)) {
+                throw new global::System.ArgumentNullException("Original_FirstName");
+            }
+            else {
+                this.Adapter.DeleteCommand.Parameters[1].Value = ((string)(Original_FirstName));
+            }
+            if ((Original_LastName == null)) {
+                throw new global::System.ArgumentNullException("Original_LastName");
+            }
+            else {
+                this.Adapter.DeleteCommand.Parameters[2].Value = ((string)(Original_LastName));
+            }
+            if ((Original_MiddleName == null)) {
+                this.Adapter.DeleteCommand.Parameters[3].Value = ((object)(1));
+                this.Adapter.DeleteCommand.Parameters[4].Value = global::System.DBNull.Value;
+            }
+            else {
+                this.Adapter.DeleteCommand.Parameters[3].Value = ((object)(0));
+                this.Adapter.DeleteCommand.Parameters[4].Value = ((string)(Original_MiddleName));
+            }
+            if ((Original_Gender == null)) {
+                throw new global::System.ArgumentNullException("Original_Gender");
+            }
+            else {
+                this.Adapter.DeleteCommand.Parameters[5].Value = ((string)(Original_Gender));
+            }
+            global::System.Data.ConnectionState previousConnectionState = this.Adapter.DeleteCommand.Connection.State;
+            if (((this.Adapter.DeleteCommand.Connection.State & global::System.Data.ConnectionState.Open) 
+                        != global::System.Data.ConnectionState.Open)) {
+                this.Adapter.DeleteCommand.Connection.Open();
+            }
+            try {
+                int returnValue = this.Adapter.DeleteCommand.ExecuteNonQuery();
+                return returnValue;
+            }
+            finally {
+                if ((previousConnectionState == global::System.Data.ConnectionState.Closed)) {
+                    this.Adapter.DeleteCommand.Connection.Close();
+                }
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
+        [global::System.ComponentModel.DataObjectMethodAttribute(global::System.ComponentModel.DataObjectMethodType.Insert, true)]
+        public virtual int Insert(string FirstName, string LastName, string MiddleName, string Gender) {
+            if ((FirstName == null)) {
+                throw new global::System.ArgumentNullException("FirstName");
+            }
+            else {
+                this.Adapter.InsertCommand.Parameters[0].Value = ((string)(FirstName));
+            }
+            if ((LastName == null)) {
+                throw new global::System.ArgumentNullException("LastName");
+            }
+            else {
+                this.Adapter.InsertCommand.Parameters[1].Value = ((string)(LastName));
+            }
+            if ((MiddleName == null)) {
+                this.Adapter.InsertCommand.Parameters[2].Value = global::System.DBNull.Value;
+            }
+            else {
+                this.Adapter.InsertCommand.Parameters[2].Value = ((string)(MiddleName));
+            }
+            if ((Gender == null)) {
+                throw new global::System.ArgumentNullException("Gender");
+            }
+            else {
+                this.Adapter.InsertCommand.Parameters[3].Value = ((string)(Gender));
+            }
+            global::System.Data.ConnectionState previousConnectionState = this.Adapter.InsertCommand.Connection.State;
+            if (((this.Adapter.InsertCommand.Connection.State & global::System.Data.ConnectionState.Open) 
+                        != global::System.Data.ConnectionState.Open)) {
+                this.Adapter.InsertCommand.Connection.Open();
+            }
+            try {
+                int returnValue = this.Adapter.InsertCommand.ExecuteNonQuery();
+                return returnValue;
+            }
+            finally {
+                if ((previousConnectionState == global::System.Data.ConnectionState.Closed)) {
+                    this.Adapter.InsertCommand.Connection.Close();
+                }
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
+        [global::System.ComponentModel.DataObjectMethodAttribute(global::System.ComponentModel.DataObjectMethodType.Update, true)]
+        public virtual int Update(string FirstName, string LastName, string MiddleName, string Gender, int Original_PersonID, string Original_FirstName, string Original_LastName, string Original_MiddleName, string Original_Gender, int PersonID) {
+            if ((FirstName == null)) {
+                throw new global::System.ArgumentNullException("FirstName");
+            }
+            else {
+                this.Adapter.UpdateCommand.Parameters[0].Value = ((string)(FirstName));
+            }
+            if ((LastName == null)) {
+                throw new global::System.ArgumentNullException("LastName");
+            }
+            else {
+                this.Adapter.UpdateCommand.Parameters[1].Value = ((string)(LastName));
+            }
+            if ((MiddleName == null)) {
+                this.Adapter.UpdateCommand.Parameters[2].Value = global::System.DBNull.Value;
+            }
+            else {
+                this.Adapter.UpdateCommand.Parameters[2].Value = ((string)(MiddleName));
+            }
+            if ((Gender == null)) {
+                throw new global::System.ArgumentNullException("Gender");
+            }
+            else {
+                this.Adapter.UpdateCommand.Parameters[3].Value = ((string)(Gender));
+            }
+            this.Adapter.UpdateCommand.Parameters[4].Value = ((int)(Original_PersonID));
+            if ((Original_FirstName == null)) {
+                throw new global::System.ArgumentNullException("Original_FirstName");
+            }
+            else {
+                this.Adapter.UpdateCommand.Parameters[5].Value = ((string)(Original_FirstName));
+            }
+            if ((Original_LastName == null)) {
+                throw new global::System.ArgumentNullException("Original_LastName");
+            }
+            else {
+                this.Adapter.UpdateCommand.Parameters[6].Value = ((string)(Original_LastName));
+            }
+            if ((Original_MiddleName == null)) {
+                this.Adapter.UpdateCommand.Parameters[7].Value = ((object)(1));
+                this.Adapter.UpdateCommand.Parameters[8].Value = global::System.DBNull.Value;
+            }
+            else {
+                this.Adapter.UpdateCommand.Parameters[7].Value = ((object)(0));
+                this.Adapter.UpdateCommand.Parameters[8].Value = ((string)(Original_MiddleName));
+            }
+            if ((Original_Gender == null)) {
+                throw new global::System.ArgumentNullException("Original_Gender");
+            }
+            else {
+                this.Adapter.UpdateCommand.Parameters[9].Value = ((string)(Original_Gender));
+            }
+            this.Adapter.UpdateCommand.Parameters[10].Value = ((int)(PersonID));
+            global::System.Data.ConnectionState previousConnectionState = this.Adapter.UpdateCommand.Connection.State;
+            if (((this.Adapter.UpdateCommand.Connection.State & global::System.Data.ConnectionState.Open) 
+                        != global::System.Data.ConnectionState.Open)) {
+                this.Adapter.UpdateCommand.Connection.Open();
+            }
+            try {
+                int returnValue = this.Adapter.UpdateCommand.ExecuteNonQuery();
+                return returnValue;
+            }
+            finally {
+                if ((previousConnectionState == global::System.Data.ConnectionState.Closed)) {
+                    this.Adapter.UpdateCommand.Connection.Close();
+                }
+            }
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
+        [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")]
+        [global::System.ComponentModel.DataObjectMethodAttribute(global::System.ComponentModel.DataObjectMethodType.Update, true)]
+        public virtual int Update(string FirstName, string LastName, string MiddleName, string Gender, int Original_PersonID, string Original_FirstName, string Original_LastName, string Original_MiddleName, string Original_Gender) {
+            return this.Update(FirstName, LastName, MiddleName, Gender, Original_PersonID, Original_FirstName, Original_LastName, Original_MiddleName, Original_Gender, Original_PersonID);
+        }
+    }
+}
+
+#pragma warning restore 1591
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/DataAccess/PersonDataSet2.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,7 @@
+namespace DataAccessTest {
+
+
+	partial class PersonDataSet2
+	{
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/DataAccess/PersonDataSet2.xsc	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--<autogenerated>
+     This code was generated by a tool.
+     Changes to this file may cause incorrect behavior and will be lost if
+     the code is regenerated.
+</autogenerated>-->
+<DataSetUISetting Version="1.00" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+  <TableUISettings>
+  </TableUISettings>
+</DataSetUISetting>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/DataAccess/PersonDataSet2.xsd	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema id="PersonDataSet2" targetNamespace="http://tempuri.org/PersonDataSet2.xsd" xmlns:mstns="http://tempuri.org/PersonDataSet2.xsd" xmlns="http://tempuri.org/PersonDataSet2.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:msprop="urn:schemas-microsoft-com:xml-msprop" attributeFormDefault="qualified" elementFormDefault="qualified">
+  <xs:annotation>
+    <xs:appinfo source="urn:schemas-microsoft-com:xml-msdatasource">
+      <DataSource DefaultConnectionIndex="0" FunctionsComponentName="QueriesTableAdapter" Modifier="AutoLayout, AnsiClass, Class, Public" SchemaSerializationMode="IncludeSchema" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+        <Connections>
+          <Connection AppSettingsObjectName="Settings" AppSettingsPropertyName="BLToolkitDataConnectionString" ConnectionStringObject="" IsAppSettingsProperty="true" Modifier="Assembly" Name="BLToolkitDataConnectionString (Settings)" ParameterPrefix="@" PropertyReference="ApplicationSettings.UnitTests.CS.Properties.Settings.GlobalReference.Default.BLToolkitDataConnectionString" Provider="System.Data.SqlClient" />
+        </Connections>
+        <Tables>
+          <TableAdapter BaseClass="System.ComponentModel.Component" DataAccessorModifier="AutoLayout, AnsiClass, Class, Public" DataAccessorName="PersonTableAdapter" GeneratorDataComponentClassName="PersonTableAdapter" Name="Person" UserDataComponentName="PersonTableAdapter">
+            <MainSource>
+              <DbSource ConnectionRef="BLToolkitDataConnectionString (Settings)" DbObjectName="BLToolkitData.dbo.Person" DbObjectType="Table" FillMethodModifier="Public" FillMethodName="Fill" GenerateMethods="Both" GenerateShortCommands="true" GeneratorGetMethodName="GetData" GeneratorSourceName="Fill" GetMethodModifier="Public" GetMethodName="GetData" QueryType="Rowset" ScalarCallRetval="System.Object, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" UseOptimisticConcurrency="true" UserGetMethodName="GetData" UserSourceName="Fill">
+                <DeleteCommand>
+                  <DbCommand CommandType="Text" ModifiedByUser="false">
+                    <CommandText>DELETE FROM [dbo].[Person] WHERE (([PersonID] = @Original_PersonID) AND ([FirstName] = @Original_FirstName) AND ([LastName] = @Original_LastName) AND ((@IsNull_MiddleName = 1 AND [MiddleName] IS NULL) OR ([MiddleName] = @Original_MiddleName)) AND ([Gender] = @Original_Gender))</CommandText>
+                    <Parameters>
+                      <Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@Original_PersonID" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="PersonID" SourceColumnNullMapping="false" SourceVersion="Original" />
+                      <Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@Original_FirstName" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="FirstName" SourceColumnNullMapping="false" SourceVersion="Original" />
+                      <Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@Original_LastName" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="LastName" SourceColumnNullMapping="false" SourceVersion="Original" />
+                      <Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@IsNull_MiddleName" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="MiddleName" SourceColumnNullMapping="true" SourceVersion="Original" />
+                      <Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@Original_MiddleName" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="MiddleName" SourceColumnNullMapping="false" SourceVersion="Original" />
+                      <Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="AnsiStringFixedLength" Direction="Input" ParameterName="@Original_Gender" Precision="0" ProviderType="Char" Scale="0" Size="0" SourceColumn="Gender" SourceColumnNullMapping="false" SourceVersion="Original" />
+                    </Parameters>
+                  </DbCommand>
+                </DeleteCommand>
+                <InsertCommand>
+                  <DbCommand CommandType="Text" ModifiedByUser="false">
+                    <CommandText>INSERT INTO [dbo].[Person] ([FirstName], [LastName], [MiddleName], [Gender]) VALUES (@FirstName, @LastName, @MiddleName, @Gender);
+SELECT PersonID, FirstName, LastName, MiddleName, Gender FROM Person WHERE (PersonID = SCOPE_IDENTITY())</CommandText>
+                    <Parameters>
+                      <Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@FirstName" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="FirstName" SourceColumnNullMapping="false" SourceVersion="Current" />
+                      <Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@LastName" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="LastName" SourceColumnNullMapping="false" SourceVersion="Current" />
+                      <Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@MiddleName" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="MiddleName" SourceColumnNullMapping="false" SourceVersion="Current" />
+                      <Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="AnsiStringFixedLength" Direction="Input" ParameterName="@Gender" Precision="0" ProviderType="Char" Scale="0" Size="0" SourceColumn="Gender" SourceColumnNullMapping="false" SourceVersion="Current" />
+                    </Parameters>
+                  </DbCommand>
+                </InsertCommand>
+                <SelectCommand>
+                  <DbCommand CommandType="Text" ModifiedByUser="false">
+                    <CommandText>SELECT PersonID, FirstName, LastName, MiddleName, Gender FROM dbo.Person</CommandText>
+                    <Parameters />
+                  </DbCommand>
+                </SelectCommand>
+                <UpdateCommand>
+                  <DbCommand CommandType="Text" ModifiedByUser="false">
+                    <CommandText>UPDATE [dbo].[Person] SET [FirstName] = @FirstName, [LastName] = @LastName, [MiddleName] = @MiddleName, [Gender] = @Gender WHERE (([PersonID] = @Original_PersonID) AND ([FirstName] = @Original_FirstName) AND ([LastName] = @Original_LastName) AND ((@IsNull_MiddleName = 1 AND [MiddleName] IS NULL) OR ([MiddleName] = @Original_MiddleName)) AND ([Gender] = @Original_Gender));
+SELECT PersonID, FirstName, LastName, MiddleName, Gender FROM Person WHERE (PersonID = @PersonID)</CommandText>
+                    <Parameters>
+                      <Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@FirstName" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="FirstName" SourceColumnNullMapping="false" SourceVersion="Current" />
+                      <Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@LastName" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="LastName" SourceColumnNullMapping="false" SourceVersion="Current" />
+                      <Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@MiddleName" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="MiddleName" SourceColumnNullMapping="false" SourceVersion="Current" />
+                      <Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="AnsiStringFixedLength" Direction="Input" ParameterName="@Gender" Precision="0" ProviderType="Char" Scale="0" Size="0" SourceColumn="Gender" SourceColumnNullMapping="false" SourceVersion="Current" />
+                      <Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@Original_PersonID" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="PersonID" SourceColumnNullMapping="false" SourceVersion="Original" />
+                      <Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@Original_FirstName" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="FirstName" SourceColumnNullMapping="false" SourceVersion="Original" />
+                      <Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@Original_LastName" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="LastName" SourceColumnNullMapping="false" SourceVersion="Original" />
+                      <Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="Int32" Direction="Input" ParameterName="@IsNull_MiddleName" Precision="0" ProviderType="Int" Scale="0" Size="0" SourceColumn="MiddleName" SourceColumnNullMapping="true" SourceVersion="Original" />
+                      <Parameter AllowDbNull="true" AutogeneratedName="" DataSourceName="" DbType="String" Direction="Input" ParameterName="@Original_MiddleName" Precision="0" ProviderType="NVarChar" Scale="0" Size="0" SourceColumn="MiddleName" SourceColumnNullMapping="false" SourceVersion="Original" />
+                      <Parameter AllowDbNull="false" AutogeneratedName="" DataSourceName="" DbType="AnsiStringFixedLength" Direction="Input" ParameterName="@Original_Gender" Precision="0" ProviderType="Char" Scale="0" Size="0" SourceColumn="Gender" SourceColumnNullMapping="false" SourceVersion="Original" />
+                      <Parameter AllowDbNull="false" AutogeneratedName="PersonID" ColumnName="PersonID" DataSourceName="" DataTypeServer="int" DbType="Int32" Direction="Input" ParameterName="@PersonID" Precision="0" ProviderType="Int" Scale="0" Size="4" SourceColumn="PersonID" SourceColumnNullMapping="false" SourceVersion="Current" />
+                    </Parameters>
+                  </DbCommand>
+                </UpdateCommand>
+              </DbSource>
+            </MainSource>
+            <Mappings>
+              <Mapping SourceColumn="PersonID" DataSetColumn="PersonID" />
+              <Mapping SourceColumn="FirstName" DataSetColumn="FirstName" />
+              <Mapping SourceColumn="LastName" DataSetColumn="LastName" />
+              <Mapping SourceColumn="MiddleName" DataSetColumn="MiddleName" />
+              <Mapping SourceColumn="Gender" DataSetColumn="Gender" />
+            </Mappings>
+            <Sources />
+          </TableAdapter>
+        </Tables>
+        <Sources />
+      </DataSource>
+    </xs:appinfo>
+  </xs:annotation>
+  <xs:element name="PersonDataSet2" msdata:IsDataSet="true" msdata:UseCurrentLocale="true" msprop:Generator_UserDSName="PersonDataSet2" msprop:Generator_DataSetName="PersonDataSet2">
+    <xs:complexType>
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element name="Person" msprop:Generator_UserTableName="Person" msprop:Generator_RowDeletedName="PersonRowDeleted" msprop:Generator_RowChangedName="PersonRowChanged" msprop:Generator_RowClassName="PersonRow" msprop:Generator_RowChangingName="PersonRowChanging" msprop:Generator_RowEvArgName="PersonRowChangeEvent" msprop:Generator_RowEvHandlerName="PersonRowChangeEventHandler" msprop:Generator_TableClassName="PersonDataTable" msprop:Generator_TableVarName="tablePerson" msprop:Generator_RowDeletingName="PersonRowDeleting" msprop:Generator_TablePropName="Person">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:element name="PersonID" msdata:ReadOnly="true" msdata:AutoIncrement="true" msprop:Generator_UserColumnName="PersonID" msprop:Generator_ColumnVarNameInTable="columnPersonID" msprop:Generator_ColumnPropNameInRow="PersonID" msprop:Generator_ColumnPropNameInTable="PersonIDColumn" type="xs:int" />
+              <xs:element name="FirstName" msprop:Generator_UserColumnName="FirstName" msprop:Generator_ColumnVarNameInTable="columnFirstName" msprop:Generator_ColumnPropNameInRow="FirstName" msprop:Generator_ColumnPropNameInTable="FirstNameColumn">
+                <xs:simpleType>
+                  <xs:restriction base="xs:string">
+                    <xs:maxLength value="50" />
+                  </xs:restriction>
+                </xs:simpleType>
+              </xs:element>
+              <xs:element name="LastName" msprop:Generator_UserColumnName="LastName" msprop:Generator_ColumnVarNameInTable="columnLastName" msprop:Generator_ColumnPropNameInRow="LastName" msprop:Generator_ColumnPropNameInTable="LastNameColumn">
+                <xs:simpleType>
+                  <xs:restriction base="xs:string">
+                    <xs:maxLength value="50" />
+                  </xs:restriction>
+                </xs:simpleType>
+              </xs:element>
+              <xs:element name="MiddleName" msprop:Generator_UserColumnName="MiddleName" msprop:Generator_ColumnVarNameInTable="columnMiddleName" msprop:Generator_ColumnPropNameInRow="MiddleName" msprop:Generator_ColumnPropNameInTable="MiddleNameColumn" minOccurs="0">
+                <xs:simpleType>
+                  <xs:restriction base="xs:string">
+                    <xs:maxLength value="50" />
+                  </xs:restriction>
+                </xs:simpleType>
+              </xs:element>
+              <xs:element name="Gender" msprop:Generator_UserColumnName="Gender" msprop:Generator_ColumnVarNameInTable="columnGender" msprop:Generator_ColumnPropNameInRow="Gender" msprop:Generator_ColumnPropNameInTable="GenderColumn">
+                <xs:simpleType>
+                  <xs:restriction base="xs:string">
+                    <xs:maxLength value="1" />
+                  </xs:restriction>
+                </xs:simpleType>
+              </xs:element>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+      </xs:choice>
+    </xs:complexType>
+    <xs:unique name="Constraint1" msdata:PrimaryKey="true">
+      <xs:selector xpath=".//mstns:Person" />
+      <xs:field xpath="mstns:PersonID" />
+    </xs:unique>
+  </xs:element>
+</xs:schema>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/DataAccess/PersonDataSet2.xss	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--<autogenerated>
+     This code was generated by a tool to store the dataset designer's layout information.
+     Changes to this file may cause incorrect behavior and will be lost if
+     the code is regenerated.
+</autogenerated>-->
+<DiagramLayout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ex:showrelationlabel="False" ViewPortX="0" ViewPortY="0" xmlns:ex="urn:schemas-microsoft-com:xml-msdatasource-layout-extended" xmlns="urn:schemas-microsoft-com:xml-msdatasource-layout">
+  <Shapes>
+    <Shape ID="DesignTable:Person" ZOrder="1" X="214" Y="166" Height="172" Width="202" AdapterExpanded="true" DataTableExpanded="true" OldAdapterHeight="0" OldDataTableHeight="0" SplitterPosition="121" />
+  </Shapes>
+  <Connectors />
+</DiagramLayout>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/DataAccess/PersonDataSet2.xsx	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--This file is auto-generated by the XML Schema Designer. It holds layout information for components on the designer surface.-->
+<XSDDesignerLayout Style="LeftRight" />
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/DataAccess/PrimaryKeyAttributeTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,110 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace DataAccess
+{
+	[TestFixture]
+	public class PrimaryKeyAttributeTest : SqlQuery
+	{
+		public class Base
+		{
+			[PrimaryKey]
+			public int ID;
+		}
+
+		public class Derived : Base
+		{
+			public new int ID
+			{
+				get { return base.ID;  }
+				set { base.ID = value; }
+			}
+		}
+
+
+		[Test]
+		public void PrimaryKeyOverrideTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				MemberMapper[] personPrimaryKeys = GetKeyFieldList(db, typeof (Base));
+				Assert.IsNotNull(personPrimaryKeys);
+				Assert.AreEqual(1, personPrimaryKeys.Length);
+				Assert.AreEqual("ID", personPrimaryKeys[0].MemberName);
+
+				MemberMapper[] derivedPrimaryKeys = GetKeyFieldList(db, typeof (Derived));
+				Assert.IsNotNull(derivedPrimaryKeys);
+				Assert.AreEqual(0, derivedPrimaryKeys.Length);
+			}
+		}
+
+		public class Base2
+		{
+			protected      int _ID;
+
+			[PrimaryKey]
+			public virtual int  ID
+			{
+				get { return _ID;  }
+				set { _ID = value; }
+			}
+		}
+
+		public class Derived2 : Base2
+		{
+			public override int ID
+			{
+				get { return _ID;  }
+				set { _ID = value; }
+			}
+		}
+
+		[Test]
+		public void PrimaryKeyOverrideTest2()
+		{
+			using (DbManager db = new DbManager())
+			{
+				MemberMapper[] personPrimaryKeys = GetKeyFieldList(db, typeof (Base2));
+				Assert.IsNotNull(personPrimaryKeys);
+				Assert.AreEqual(1, personPrimaryKeys.Length);
+				Assert.AreEqual("ID", personPrimaryKeys[0].MemberName);
+
+				MemberMapper[] derivedPrimaryKeys = GetKeyFieldList(db, typeof (Derived2));
+				Assert.IsNotNull(derivedPrimaryKeys);
+				Assert.AreEqual(0, derivedPrimaryKeys.Length);
+			}
+		}
+
+		public class Base3
+		{
+			[PrimaryKey]
+			public int ID;
+		}
+
+		public class Derived3 : Base3
+		{
+			public new int ID;
+		}
+
+		[Test]
+		public void PrimaryKeyOverrideTest3()
+		{
+			using (DbManager db = new DbManager())
+			{
+				MemberMapper[] personPrimaryKeys = GetKeyFieldList(db, typeof (Base3));
+				Assert.IsNotNull(personPrimaryKeys);
+				Assert.AreEqual(1, personPrimaryKeys.Length);
+				Assert.AreEqual("ID", personPrimaryKeys[0].MemberName);
+
+				MemberMapper[] derivedPrimaryKeys = GetKeyFieldList(db, typeof (Derived3));
+				Assert.IsNotNull(derivedPrimaryKeys);
+				Assert.AreEqual(0, derivedPrimaryKeys.Length);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/DataAccess/ScalarListTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,160 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+
+namespace DataAccess
+{
+	[TestFixture]
+	public class ScalarListTest
+	{
+		public abstract class TestAccessor : DataAccessor
+		{
+			[SprocName("Person_SelectAll")]
+			[ObjectType(typeof(int))]
+			public abstract ArrayList SelectIDs       (DbManager db);
+
+			[SprocName("Person_SelectAll")]
+			[ObjectType(typeof(string)), ScalarFieldName(1)]
+			public abstract ArrayList SelectFirstNames(DbManager db);
+
+			[SprocName("Person_SelectAll")]
+			[ObjectType(typeof(string)), ScalarFieldName("LastName")]
+			public abstract ArrayList SelectLastNames (DbManager db);
+
+			[SprocName("Person_SelectAll")]
+			public abstract List<int>          GenericsSelectIDs              (DbManager db);
+
+			[SprocName("Person_SelectAll")]
+			[ScalarFieldName(1)]
+			public abstract List<string>       GenericsSelectFirstNames       (DbManager db);
+
+			[SprocName("Person_SelectAll")]
+			[ScalarFieldName("LastName")]
+			public abstract List<string>       GenericsSelectLastNames        (DbManager db);
+
+			[SprocName("Person_SelectAll"), ObjectType(typeof(int))]
+			public abstract List<IConvertible> GenericsSelectIDsAsIConvertible(DbManager db);
+
+			[SprocName("Person_SelectAll")]
+			public abstract void               GenericsSelectIDsReturnVoid    (DbManager db, [Destination] List<int> list);
+
+			public static TestAccessor CreateInstance()
+			{
+				return (TestAccessor)CreateInstance(typeof(TestAccessor));
+			}
+		}
+
+		[Test]
+		public void SelectIDsTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				TestAccessor ta = TestAccessor.CreateInstance();
+				ArrayList list = ta.SelectIDs(db);
+
+				Assert.IsNotNull (list);
+				Assert.IsNotEmpty(list);
+				Assert.IsTrue(list[0] is int);
+			}
+		}
+
+		[Test]
+		public void SelectFirstNamesTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				TestAccessor ta = TestAccessor.CreateInstance();
+				ArrayList list = ta.SelectFirstNames(db);
+
+				Assert.IsNotNull (list);
+				Assert.IsNotEmpty(list);
+				Assert.IsTrue(list[0] is string);
+			}
+		}
+
+		[Test]
+		public void SelectLastNamesTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				TestAccessor ta = TestAccessor.CreateInstance();
+				ArrayList list = ta.SelectLastNames(db);
+
+				Assert.IsNotNull (list);
+				Assert.IsNotEmpty(list);
+				Assert.IsTrue(list[0] is string);
+			}
+		}
+
+		[Test]
+		public void GenericsSelectIDsTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				TestAccessor ta = TestAccessor.CreateInstance();
+				List<int> list = ta.GenericsSelectIDs(db);
+
+				Assert.IsNotNull (list);
+				Assert.IsNotEmpty(list);
+			}
+		}
+
+		[Test]
+		public void GenericsSelectIDsAsIConvertibleTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				TestAccessor ta = TestAccessor.CreateInstance();
+				List<IConvertible> list = ta.GenericsSelectIDsAsIConvertible(db);
+
+				Assert.IsNotNull (list);
+				Assert.IsNotEmpty(list);
+			}
+		}
+
+		[Test]
+		public void GenericsSelectIDsReturnVoidTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				TestAccessor ta = TestAccessor.CreateInstance();
+				List<int> list = new List<int>();
+				ta.GenericsSelectIDsReturnVoid(db, list);
+
+				Assert.IsNotNull (list);
+				Assert.IsNotEmpty(list);
+			}
+		}
+
+		[Test]
+		public void GenericsSelectFirstNamesTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				TestAccessor ta = TestAccessor.CreateInstance();
+				List<string> list = ta.GenericsSelectFirstNames(db);
+
+				Assert.IsNotNull (list);
+				Assert.IsNotEmpty(list);
+			}
+		}
+
+		[Test]
+		public void GenericsSelectLastNamesTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				TestAccessor ta = TestAccessor.CreateInstance();
+				List<string> list = ta.GenericsSelectLastNames(db);
+
+				Assert.IsNotNull (list);
+				Assert.IsNotEmpty(list);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/DataAccess/ScalarTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,372 @@
+using System;
+using System.IO;
+using System.Xml;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+using BLToolkit.Reflection;
+
+namespace DataAccess
+{
+	[TestFixture]
+	public class ScalarTest
+	{
+		public enum TestEnum
+		{
+			Null  = 0,
+			Value = 12345,
+		}
+
+		public abstract class TestAccessor : DataAccessor
+		{
+			[ActionName("Scalar_DataReader")]
+			public abstract int Scalar_Regression(DbManager db);
+			
+			[ScalarSource(ScalarSourceType.DataReader)]
+			public abstract int Scalar_DataReader(DbManager db);
+
+			[ActionName("Scalar_DataReader")]
+			[ScalarSource(ScalarSourceType.DataReader, 1)]
+			public abstract string Scalar_DataReader2(DbManager db);
+
+			[ActionName("Scalar_DataReader")]
+			[ScalarSource(ScalarSourceType.DataReader, "stringField")]
+			public abstract string Scalar_DataReader3(DbManager db);
+
+			[ActionName("Scalar_OutputParameter")]
+			public abstract void Scalar_OutputParameterRegression(
+				DbManager db, out int outputInt, out string outputString);
+
+			[ScalarSource(ScalarSourceType.OutputParameter)]
+			public abstract int Scalar_OutputParameter(DbManager db);
+
+			[ActionName("Scalar_OutputParameter")]
+			[ScalarSource(ScalarSourceType.OutputParameter, 1)]
+			public abstract string Scalar_OutputParameter2(DbManager db);
+
+			[ActionName("Scalar_OutputParameter")]
+			[ScalarSource(ScalarSourceType.OutputParameter, "outputString")]
+			public abstract string Scalar_OutputParameter3(DbManager db);
+
+			[ScalarSource(ScalarSourceType.ReturnValue)]
+			public abstract int Scalar_ReturnParameter(DbManager db);
+
+			[ActionName("Scalar_DataReader")]
+			[ScalarSource(ScalarSourceType.AffectedRows)]
+			public abstract int Scalar_AffectedRows(DbManager db);
+
+			[TestQuery(
+				SqlText    = "SELECT Stream_ FROM DataTypeTest WHERE DataTypeID = @id",
+				OracleText = "SELECT Stream_ FROM DataTypeTest WHERE DataTypeID = :id")]
+			public abstract Stream GetStream(DbManager db, int id);
+
+			[TestQuery(
+				SqlText    = "SELECT Xml_ FROM DataTypeTest WHERE DataTypeID = @id",
+				OracleText = "SELECT Xml_ FROM DataTypeTest WHERE DataTypeID = :id")]
+			public abstract XmlReader GetXml(DbManager db, int id);
+
+			[TestQuery(
+				SqlText    = "SELECT Xml_ FROM DataTypeTest WHERE DataTypeID = @id",
+				OracleText = "SELECT Xml_ FROM DataTypeTest WHERE DataTypeID = :id")]
+			public abstract XmlDocument GetXmlDoc(DbManager db, int id);
+
+			[SprocName("Scalar_DataReader")]
+			public abstract int    ScalarDestination1([Destination] out int id);
+
+			[SprocName("Scalar_DataReader")]
+			public abstract void   ScalarDestination2([Destination] out int id);
+
+			[SprocName("Scalar_DataReader")]
+			public abstract object ScalarDestination3([Destination] out int id);
+
+			[SprocName("Scalar_DataReader")]
+			public abstract int    ScalarDestination4([Destination] ref int id);
+
+			[SprocName("Scalar_DataReader")]
+			public abstract void   ScalarDestination5([Destination] ref int id);
+
+			[SprocName("Scalar_DataReader")]
+			public abstract object ScalarDestination6([Destination] ref int id);
+
+			[SprocName("Scalar_DataReader")]
+			public abstract int? ScalarNullableDestination([Destination] ref int? id);
+
+			[SprocName("Scalar_DataReader")]
+			public abstract TestEnum ScalarEnumDestination([Destination] ref TestEnum value);
+
+			[SprocName("Scalar_DataReader")]
+			public abstract TestEnum? ScalarNullableEnumDestination([Destination] ref TestEnum? value);
+
+			public static TestAccessor CreateInstance()
+			{
+				return (TestAccessor)CreateInstance(typeof(TestAccessor));
+			}
+		}
+
+		[Test]
+		public void RegressionTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				TestAccessor ta = TestAccessor.CreateInstance();
+
+				int expectedValue = 12345;
+				int actualValue = ta.Scalar_Regression(db);
+
+				Assert.AreEqual(expectedValue, actualValue);
+			}
+		}
+
+		[Test]
+		public void DataReaderTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				TestAccessor ta = TestAccessor.CreateInstance();
+
+				int expectedValue = 12345;
+				int actualValue = ta.Scalar_DataReader(db);
+
+				Assert.AreEqual(expectedValue, actualValue);
+			}
+		}
+
+		[Test]
+		public void DataReader2Test()
+		{
+			using (DbManager db = new DbManager())
+			{
+				TestAccessor ta = TestAccessor.CreateInstance();
+
+				string expectedValue = "54321";
+				string actualValue = ta.Scalar_DataReader2(db);
+
+				Assert.AreEqual(expectedValue, actualValue);
+			}
+		}
+
+		[Test]
+		public void DataReader3Test()
+		{
+			using (DbManager db = new DbManager())
+			{
+				TestAccessor ta = TestAccessor.CreateInstance();
+
+				string expectedValue = "54321";
+				string actualValue = ta.Scalar_DataReader3(db);
+
+				Assert.AreEqual(expectedValue, actualValue);
+			}
+		}
+
+#if !ACCESS && !SQLITE
+		[Test]
+		public void OutputParameterRegressionTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				TestAccessor ta = TestAccessor.CreateInstance();
+
+				int expectedIntValue = 12345;
+				int actualIntValue;
+				string expectedStringValue = "54321";
+				string actualStringValue;
+
+				ta.Scalar_OutputParameterRegression(db,
+					out actualIntValue, out actualStringValue);
+
+				Assert.AreEqual(expectedIntValue, actualIntValue);
+				Assert.AreEqual(expectedStringValue, actualStringValue);
+			}
+		}
+
+		[Test]
+		public void OutputParameterTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				TestAccessor ta = TestAccessor.CreateInstance();
+
+				int expectedValue = 12345;
+				int actualValue = ta.Scalar_OutputParameter(db);
+
+				Assert.AreEqual(expectedValue, actualValue);
+			}
+		}
+
+		[Test]
+		public void OutputParameter2Test()
+		{
+			using (DbManager db = new DbManager())
+			{
+				TestAccessor ta = TestAccessor.CreateInstance();
+
+				string expectedValue = "54321";
+				string actualValue = ta.Scalar_OutputParameter2(db);
+
+				Assert.AreEqual(expectedValue, actualValue);
+			}
+		}
+
+		[Test]
+		public void OutputParameter3Test()
+		{
+			using (DbManager db = new DbManager())
+			{
+				TestAccessor ta = TestAccessor.CreateInstance();
+
+				string expectedValue = "54321";
+				string actualValue = ta.Scalar_OutputParameter3(db);
+
+				Assert.AreEqual(expectedValue, actualValue);
+			}
+		}
+
+		[Test]
+		public void ReturnParameterTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				TestAccessor ta = TestAccessor.CreateInstance();
+
+				int expectedValue = 12345;
+				int actualValue = ta.Scalar_ReturnParameter(db);
+
+				Assert.AreEqual(expectedValue, actualValue);
+			}
+		}
+#endif
+
+		[Test]
+		public void AffectedRowsTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				TestAccessor ta = TestAccessor.CreateInstance();
+
+#if ACCESS
+				int expectedValue = 0;
+#else
+ 				int expectedValue = -1;
+#endif
+				int actualValue = ta.Scalar_AffectedRows(db);
+
+				Assert.AreEqual(expectedValue, actualValue);
+			}
+		}
+
+		[Test]
+		public void StreamTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				TestAccessor ta = TestAccessor.CreateInstance();
+
+				Stream s = ta.GetStream(db, 2);
+				Byte[] bytes = new byte[16];
+
+				Assert.IsNotNull(s);
+				Assert.AreEqual(s.Length, bytes.Length);
+
+				Assert.AreEqual(s.Read(bytes, 0, bytes.Length), bytes.Length);
+				TypeAccessor.WriteConsole(bytes);
+			}
+		}
+
+		[Test]
+		public void ScalarDestinationTest()
+		{
+			TestAccessor ta = TestAccessor.CreateInstance();
+
+			int id1;
+			int id2;
+
+			id1 = ta.ScalarDestination1(out id2);
+			Assert.AreEqual(id1, 12345);
+			Assert.AreEqual(id2, 12345);
+
+			ta.ScalarDestination2(out id2);
+			Assert.AreEqual(id2, 12345);
+
+			id1 = (int)ta.ScalarDestination3(out id2);
+			Assert.AreEqual(id1, 12345);
+			Assert.AreEqual(id2, 12345);
+
+			id2 = 0;
+			id1 = ta.ScalarDestination4(ref id2);
+			Assert.AreEqual(id1, 12345);
+			Assert.AreEqual(id2, 12345);
+
+			id2 = 0;
+			ta.ScalarDestination5(ref id2);
+			Assert.AreEqual(id2, 12345);
+
+			id2 = 0;
+			id1 = (int)ta.ScalarDestination6(ref id2);
+			Assert.AreEqual(id1, 12345);
+			Assert.AreEqual(id2, 12345);
+		}
+
+		[Test]
+		public void XmlTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				TestAccessor ta = TestAccessor.CreateInstance();
+
+				XmlReader xml = ta.GetXml(db, 2);
+				xml.MoveToContent();
+				Assert.IsTrue(xml.ReadToDescendant("element"));
+				Assert.AreEqual("strvalue", xml.GetAttribute("strattr"));
+			}
+		}
+
+		public void XmlDocTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				TestAccessor ta = TestAccessor.CreateInstance();
+
+				XmlDocument xmlDocument= ta.GetXmlDoc(db, 2);
+				Assert.IsNotNull(xmlDocument);
+				Assert.IsNotNull(xmlDocument.DocumentElement);
+				Assert.AreEqual("strvalue", xmlDocument.DocumentElement.GetAttribute("strattr"));
+			}
+		}
+
+		[Test]
+		public void ScalarNullableDestinationTest()
+		{
+			TestAccessor ta = TestAccessor.CreateInstance();
+
+			int? id1;
+			int? id2 = -1;
+			id1 = ta.ScalarNullableDestination(ref id2);
+			Assert.AreEqual(id1, id2);
+		}
+
+		[Test]
+		public void ScalarEnumDestinationTest()
+		{
+			TestAccessor ta = TestAccessor.CreateInstance();
+
+			TestEnum refVal = TestEnum.Null;
+			TestEnum outVal = ta.ScalarEnumDestination(ref refVal);
+			Assert.That(outVal, Is.EqualTo(TestEnum.Value));
+			Assert.That(refVal, Is.EqualTo(TestEnum.Value));
+		}
+
+		[Test]
+		public void ScalarNullableEnumDestinationTest()
+		{
+			TestAccessor ta = TestAccessor.CreateInstance();
+
+			TestEnum? refVal = null;
+			TestEnum? outVal = ta.ScalarNullableEnumDestination(ref refVal);
+			Assert.That(outVal, Is.EqualTo(TestEnum.Value));
+			Assert.That(refVal, Is.EqualTo(TestEnum.Value));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/DataAccess/SqlQueryTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,70 @@
+using System;
+using System.Collections;
+
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+
+namespace DataAccess
+{
+	[TestFixture]
+	public class SqlQueryTest
+	{
+		public class Person
+		{
+			public int    ID;
+			public string LastName;
+			public string FirstName;
+			public string MiddleName;
+		}
+
+		[ObjectType(typeof(Person))]
+		public abstract class PersonAccessor : DataAccessor
+		{
+			[TestQuery(
+				SqlText    = "SELECT * FROM Person WHERE LastName = @lastName",
+				OracleText = "SELECT * FROM Person WHERE LastName = :lastName")]
+			public abstract ArrayList SelectByLastName(string lastName);
+
+			[TestQuery(
+				SqlText    = "SELECT * FROM Person WHERE {0} = @value",
+				OracleText = "SELECT * FROM Person WHERE {0} = :value")]
+			public abstract ArrayList SelectBy([Format] string fieldName, string value);
+
+			[TestQuery(
+				SqlText    = "SELECT TOP ({0}) * FROM Person WHERE LastName = @lastName",
+				AccessText = "SELECT TOP {0} * FROM Person WHERE LastName = @lastName",
+				OracleText = "SELECT * FROM Person WHERE LastName = :lastName AND rownum <= {0}",
+				FbText     = "SELECT FIRST {0} * FROM Person WHERE LastName = @lastName",
+				SQLiteText = "SELECT * FROM Person WHERE LastName = @lastName LIMIT {0}")]
+			public abstract ArrayList SelectByLastName(string lastName, [Format(0)] int top);
+		}
+
+		[Test]
+		public void Test1()
+		{
+			var da   = (PersonAccessor)DataAccessor.CreateInstance(typeof(PersonAccessor));
+			var list = da.SelectByLastName("Pupkin");
+
+			Assert.AreNotEqual(0, list.Count);
+		}
+
+		[Test]
+		public void Test2()
+		{
+			var da   = (PersonAccessor)DataAccessor.CreateInstance(typeof(PersonAccessor));
+			var list = da.SelectBy("FirstName", "John");
+
+			Assert.AreNotEqual(0, list.Count);
+		}
+
+		[Test]
+		public void Test3()
+		{
+			var da   = (PersonAccessor)DataAccessor.CreateInstance(typeof(PersonAccessor));
+			var list = da.SelectByLastName("Pupkin", 1);
+
+			Assert.AreNotEqual(0, list.Count);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/DataAccess/SqlQueryTest2.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,86 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+
+namespace DataAccess
+{
+	[TestFixture]
+	public class SqlQueryTest2
+	{
+		public class Person
+		{
+			public int    ID;
+			public string LastName;
+			public string FirstName;
+			public string MiddleName;
+		}
+
+		public abstract class PersonAccessor : DataAccessor<Person>
+		{
+			[TestQuery(
+				SqlText    = "SELECT * FROM Person WHERE LastName = @lastName",
+				OracleText = "SELECT * FROM Person WHERE LastName = :lastName")]
+			public abstract List<Person> SelectByLastName(string lastName);
+
+			[TestQuery(
+				SqlText    = "SELECT * FROM Person WHERE {0} = @value",
+				OracleText = "SELECT * FROM Person WHERE {0} = :value")]
+			public abstract List<Person> SelectBy([Format] string fieldName, string value);
+
+			[TestQuery(
+				SqlText    = "SELECT TOP ({0}) * FROM Person WHERE LastName = @lastName",
+				AccessText = "SELECT TOP {0} * FROM Person WHERE LastName = @lastName",
+				OracleText = "SELECT * FROM Person WHERE LastName = :lastName AND rownum <= {0}",
+				FbText     = "SELECT FIRST {0} * FROM Person WHERE LastName = @lastName",
+				SQLiteText = "SELECT * FROM Person WHERE LastName = @lastName LIMIT {0}")]
+			public abstract List<Person> SelectByLastName(string lastName, [Format(0)] int top);
+
+			[TestQuery(
+				SqlText    = "SELECT @id as ID",
+				OracleText = "SELECT :id ID FROM Dual",
+				FbText     = "SELECT CAST(@id AS INTEGER) ID FROM Dual")]
+			public abstract List<Person> SelectID(int @id);
+		}
+
+		[Test]
+		public void Test1()
+		{
+			var da   = DataAccessor.CreateInstance<PersonAccessor>();
+			var list = da.SelectByLastName("Pupkin");
+
+			Assert.AreNotEqual(0, list.Count);
+		}
+
+		[Test]
+		public void Test2()
+		{
+			var da   = DataAccessor.CreateInstance<PersonAccessor>();
+			var list = da.SelectBy("FirstName", "John");
+
+			Assert.AreNotEqual(0, list.Count);
+		}
+
+		[Test]
+		public void Test3()
+		{
+			var da   = DataAccessor.CreateInstance<PersonAccessor>();
+			var list = da.SelectByLastName("Pupkin", 1);
+
+			Assert.AreNotEqual(0, list.Count);
+		}
+
+#if !SQLCE // Works in Query window but not here???
+		[Test]
+#endif
+		public void Test4()
+		{
+			var da   = DataAccessor.CreateInstance<PersonAccessor>();
+			var list = da.SelectID(42);
+
+			Assert.AreEqual(42, list[0].ID);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/DataAccess/SqlTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,235 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+using System.Linq;
+
+namespace DataAccess
+{
+	[TestFixture]
+	public class SqlTest
+	{
+		public class Name
+		{
+			public string LastName;
+			public string FirstName;
+			public string MiddleName;
+		}
+
+		public class Person
+		{
+			[MapField("PersonID"), PrimaryKey]
+			public int  ID;
+			[MapField(Format="{0}")]
+			public Name Name = new Name();
+
+			[SqlIgnore]
+			public string Gender;
+		}
+
+		[Test]
+		public void Test()
+		{
+			var da = new SqlQuery();
+			var p  = (Person)da.SelectByKey(typeof(Person), 1);
+
+			Assert.AreEqual("Pupkin", p.Name.LastName);
+		}
+
+		[Test]
+		public void GetFieldListTest()
+		{
+			var da = new SqlQuery();
+
+			using (var db = new DbManager())
+			{
+				var info = da.GetSqlQueryInfo(db, typeof (Person),        "SelectAll");
+
+				Console.WriteLine(info.QueryText);
+				Assert.That(info.QueryText.Contains("\t" + db.DataProvider.Convert("PersonID", ConvertType.NameToQueryField)));
+				Assert.That(info.QueryText.Contains("\t" + db.DataProvider.Convert("LastName", ConvertType.NameToQueryField)));
+				Assert.That(info.QueryText, Is.Not.Contains("\t" + db.DataProvider.Convert("Name", ConvertType.NameToQueryField)));
+			}
+		}
+
+		[MapField("InnerId", "InnerObject.Id")]
+		public class TestObject
+		{
+			public int        Id;
+			public TestObject InnerObject;
+		}
+
+		[Test]
+		public void RecursiveTest()
+		{
+			var query = new SqlQuery<TestObject>();
+			var info  = query.GetSqlQueryInfo(new DbManager(), "SelectAll");
+
+			Console.WriteLine(info.QueryText);
+			Assert.That(info.QueryText.Contains("InnerId"));
+			Assert.That(info.QueryText, Is.Not.Contains("InnerObject"));
+		}
+
+		[Test]
+		public void SqlIgnoreAttributeTest()
+		{
+			var da = new SqlQuery();
+			var p  = (Person)da.SelectByKey(typeof(Person), 1);
+
+			Assert.IsNull(p.Gender);
+		}
+
+		public class TestCategory
+		{
+			[PrimaryKey, NonUpdatable]
+			public int    Id;
+			public string Name;
+		}
+
+		[MapField("CategoryId", "Category.Id")]
+		public class TestObject2
+		{
+			[PrimaryKey, NonUpdatable]
+			public int          Id;
+			public TestCategory Category;
+		}
+
+		[Test]
+		public void NonUpdatableTest()
+		{
+			var da = new SqlQuery();
+
+			using (var db = new DbManager())
+			{
+				var update = da.GetSqlQueryInfo<TestCategory>(db, "Update");
+				var insert = da.GetSqlQueryInfo<TestCategory>(db, "Insert");
+
+				Assert.That(update.QueryText, Is.Not.Contains(
+					"\t" + db.DataProvider.Convert("Id", ConvertType.NameToQueryField) + " = " + db.DataProvider.Convert("Id", db.GetConvertTypeToParameter()) + "\n"),
+					"Update");
+				Assert.That(insert.QueryText, Is.Not.Contains("Id"), "Insert");
+			}
+		}
+
+		[Test]
+		public void ComplexMapperNonUpdatableTest()
+		{
+			var da = new SqlQuery();
+
+			using (var db = new DbManager())
+			{
+				var update = da.GetSqlQueryInfo<TestObject2>(db, "Update");
+				var insert = da.GetSqlQueryInfo<TestObject2>(db, "Insert");
+
+				Assert.That(update.QueryText.Contains("CategoryId"), "Update");
+				Assert.That(insert.QueryText.Contains("CategoryId"), "Insert");
+			}
+		}
+
+		[TableName("DataTypeTest")]
+		class UpdateTest
+		{
+			[PrimaryKey] public Guid Guid_;
+
+			public UpdateTest(Guid guid)
+			{
+				Guid_ = guid;
+			}
+		}
+
+		[Test, ExpectedException(typeof(DataAccessException))]
+		public void UpdateGuid()
+		{
+			new SqlQuery<UpdateTest>().Update(new UpdateTest(Guid.NewGuid()));
+		}
+
+		[TableName("Person")]
+		public class Person1
+		{
+			[Identity, PrimaryKey]         public int    PersonID;
+			                               public string FirstName;
+			                               public string LastName;
+			[NonUpdatable(OnInsert=false)] public string MiddleName;
+			                               public char   Gender;
+		}
+
+		[Test]
+		public void NonUpdatableOnUpdate()
+		{
+			using (var db = new DbManager())
+			{
+				db.BeginTransaction();
+
+				var person = new Person1
+				{
+					FirstName  = "TestOnInsert",
+					LastName   = "",
+					MiddleName = "1",
+					Gender     = 'M'
+				};
+
+				var sqlQuery = new SqlQuery<Person1>();
+
+				sqlQuery.Insert(db, person);
+
+				var p = db.GetTable<Person1>().Single(_ => _.FirstName == "TestOnInsert");
+
+				Assert.AreEqual(person.MiddleName, p.MiddleName);
+
+				person.PersonID   = p.PersonID;
+				person.MiddleName = "should not be updated";
+
+				sqlQuery.Update(db, person);
+
+				p = db.GetTable<Person1>().Single(_ => _.FirstName == "TestOnInsert");
+
+				Assert.AreNotEqual(person.MiddleName, p.MiddleName);
+				
+				db.RollbackTransaction();
+			}
+		}
+
+		[TableName("Person")]
+		[Identity(FieldName = "PersonID")]
+		[NonUpdatable(OnInsert = false, FieldName = "MiddleName")]
+		public class Person2
+		{
+			[PrimaryKey]                     public int    PersonID;
+			[NonUpdatable(OnUpdate = false)] public string FirstName;
+			                                 public string MiddleName;
+			                                 public string Gender;
+		}
+
+		[Test]
+		public void NonUpdatableOnClass()
+		{
+			var da = new SqlQuery();
+
+			using (var db = new DbManager())
+			{
+				var update = da.GetSqlQueryInfo<Person2>(db, "Update");
+				var insert = da.GetSqlQueryInfo<Person2>(db, "Insert");
+
+				var personID   = "\t" + db.DataProvider.Convert("PersonID",   ConvertType.NameToQueryField).ToString();
+				var middleName = "\t" + db.DataProvider.Convert("MiddleName", ConvertType.NameToQueryField).ToString();
+				var firstName  = "\t" + db.DataProvider.Convert("FirstName",  ConvertType.NameToQueryField).ToString();
+
+				var personID_P   = " = " + db.DataProvider.Convert("PersonID_P",   ConvertType.NameToQueryParameter).ToString();
+				var middleName_P = " = " + db.DataProvider.Convert("MiddleName_P", ConvertType.NameToQueryParameter).ToString();
+				var firstName_P  = " = " + db.DataProvider.Convert("FirstName_P",  ConvertType.NameToQueryParameter).ToString();
+
+				Assert.That(update.QueryText, Is.Not.Contains(personID   + personID_P),   "personId\n"   + update.QueryText);
+				Assert.That(update.QueryText, Is.Not.Contains(middleName + middleName_P), "middleName\n" + update.QueryText);
+				Assert.That(update.QueryText.Contains(firstName          + firstName_P),  "firstName\n"  + update.QueryText);
+
+				Assert.That(insert.QueryText, Is.Not.Contains(personID),  "personId\n"   + insert.QueryText);
+				Assert.That(insert.QueryText, Is.Not.Contains(firstName), "firstName\n"  + insert.QueryText);
+				Assert.That(insert.QueryText.Contains(middleName),        "middleName\n" + insert.QueryText);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/DataAccess/TestQueryAttribute.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,63 @@
+using System;
+
+using BLToolkit.Data.DataProvider;
+using BLToolkit.DataAccess;
+
+namespace DataAccess
+{
+	public class TestQueryAttribute : SqlQueryAttribute
+	{
+		public TestQueryAttribute()
+		{
+			IsDynamic = true;
+		}
+
+		private string _accessText;
+		public  string  AccessText
+		{
+			get { return _accessText;  }
+			set { _accessText = value; }
+		}
+
+		private string _oracleText;
+		public  string  OracleText
+		{
+			get { return _oracleText;  }
+			set { _oracleText = value; }
+		}
+
+		private string _fbText;
+		public  string  FbText
+		{
+			get { return _fbText;  }
+			set { _fbText = value; }
+		}
+
+		private string _SQLiteText;
+		public  string  SQLiteText
+		{
+			get { return _SQLiteText;  }
+			set { _SQLiteText = value; }
+		}
+
+		public override string GetSqlText(DataAccessor accessor, BLToolkit.Data.DbManager dbManager)
+		{
+			switch (dbManager.DataProvider.Name)
+			{
+				case ProviderName.MsSql   :
+				case ProviderName.SqlCe   : return SqlText;
+
+				case ProviderName.Access  : return AccessText ?? SqlText;
+	
+				case "Oracle":
+				case ProviderName.Oracle  : return OracleText ?? SqlText;
+
+				case ProviderName.Firebird: return FbText     ?? SqlText;
+
+				case ProviderName.SQLite  : return SQLiteText ?? SqlText;
+			}
+
+			throw new ApplicationException(string.Format("Unknown data provider '{0}'", dbManager.DataProvider.Name));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/DataAccess/XmlExtension.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,50 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection.Extension;
+using BLToolkit.Data;
+
+namespace DataAccess
+{
+	[TestFixture]
+	public class XmlExtension
+	{
+		public class Person1
+		{
+			[MapField("PersonID")]  public int    ID;
+			[MapField("FirstName")] public string Name;
+		}
+
+		[Test]
+		public void Test()
+		{
+			using (DbManager db = new DbManager())
+			{
+				SqlQuery          sq = new SqlQuery(db);
+				sq.Extensions = TypeExtension.GetExtensions(@"XmlExtension.xml");
+				Assert.IsNotNull(sq.Extensions["Person1"]);
+
+				Person1           ps = (Person1)sq.SelectByKey(typeof(Person1), 1);
+				Assert.IsNotNull(ps);
+			}
+		}
+
+		[Test]
+		public void GenericsTest()
+		{
+			using (DbManager db = new DbManager())
+			{
+				SqlQuery<Person1> sq = new SqlQuery<Person1>(db);
+				sq.Extensions = TypeExtension.GetExtensions(@"XmlExtension.xml");
+				Assert.IsNotNull(sq.Extensions["Person1"]);
+
+				Person1           ps = sq.SelectByKey(1);
+				Assert.IsNotNull(ps);
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/DataAccess/XmlExtension.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<Types
+	xmlns    = "urn:schemas-bltoolkit-net:typeext"
+	xmlns:da = "urn:schemas-bltoolkit-net:dataaccess">
+
+	<Type Name="Person1" da:TableName="Person">
+		<Member Name="ID" da:PrimaryKey="1" da:NonUpdatable="1"/>
+		<Member Name="Name"/>
+	</Type>
+</Types>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/DataAccess/XmlTypeTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,48 @@
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace DataAccess
+{
+	[TestFixture]
+	public class XmlTypeTest
+	{
+		public class TestObject
+		{
+			[MapField("DataTypeID")]
+			public int       ID;
+
+			[MapField("Xml_")]
+			public string    Xml;
+		}
+
+		public abstract class TestAccessor : DataAccessor
+		{
+			[SqlQuery("Select * FROM DataTypeTest")]
+			public abstract List<TestObject> LoadAll();
+
+			[TestQuery(
+				SqlText    = "SELECT * FROM DataTypeTest WHERE DataTypeID=@ID",
+				OracleText = "SELECT * FROM DataTypeTest WHERE DataTypeID=:ID")]
+			public abstract TestObject       LoadById(int ID); 
+
+		}
+
+		[Test]
+		public void Test()
+		{
+			TestAccessor ta = (TestAccessor)DataAccessor.CreateInstance(typeof(TestAccessor));
+			TestObject   o  = ta.LoadById(2);
+
+			Assert.IsNotNull(o);
+			Assert.IsNotNull(o.Xml);
+
+			List<TestObject> lst = ta.LoadAll();
+			Assert.IsNotEmpty(lst);
+			Assert.IsNotNull(lst[0].Xml);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/EditableObjects/EditableArrayListTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,623 @@
+using System;
+using System.ComponentModel;
+using System.IO;
+using System.Runtime.Serialization.Formatters.Binary;
+using System.Windows.Forms;
+
+using NUnit.Framework;
+
+using BLToolkit.EditableObjects;
+using BLToolkit.Reflection;
+
+namespace EditableObjects
+{
+	[Serializable]
+	public abstract class SerializableObject : EditableObject
+	{
+		public abstract int    ID   { get; set; }
+		public abstract Guid   UUID { get; set; }
+		public abstract string Name { get; set; }
+
+		public abstract EditableList<string> Array { get; set; }
+	}
+
+	[TestFixture]
+	public class EditableArrayListTest
+	{
+		public abstract class EditableTestObject : EditableObject
+		{
+			public abstract int    ID      { get; set; }
+			public abstract string Name    { get; set; }
+			public abstract int    Seconds { get; set; }
+
+			public static EditableTestObject CreateInstance()
+			{
+				return (EditableTestObject)TypeAccessor.CreateInstance(typeof(EditableTestObject));
+			}
+			
+			public static EditableTestObject CreateInstance(int id, string name, int seconds)
+			{
+				var instance = CreateInstance();
+
+				instance.ID = id;
+				instance.Name = name;
+				instance.Seconds = seconds;
+				
+				return instance;
+			}
+
+			public override string ToString()
+			{
+				return string.Format("EditableTestObject - ID:({0}) Name: ({1}) Seconds({2})", ID, Name, Seconds);
+			}
+		}
+		
+		private static readonly EditableTestObject[] _testObjects = new EditableTestObject[]
+			{
+				EditableTestObject.CreateInstance(0, "Smith",  24),
+				EditableTestObject.CreateInstance(1, "John",   22),
+				EditableTestObject.CreateInstance(2, "Anna",   48),
+				EditableTestObject.CreateInstance(3, "Tim",    56),
+				EditableTestObject.CreateInstance(4, "Xiniu",  39),
+				EditableTestObject.CreateInstance(5, "Kirill", 30)
+			};
+		
+		public EditableArrayListTest()
+		{
+			_testList = new EditableArrayList(typeof(EditableTestObject));
+			_testList.ListChanged += TestList_ListChanged;
+		}
+
+		private readonly EditableArrayList _testList;
+		
+		private void TestList_ListChanged(object sender, ListChangedEventArgs e)
+		{
+			var array = sender as EditableArrayList;
+			
+			Assert.IsNotNull(array);
+			if (e.ListChangedType != ListChangedType.Reset)
+				Assert.That(array.IsDirty);
+
+			if(e.ListChangedType == ListChangedType.ItemAdded)
+			{
+				var o = array[e.NewIndex];
+
+				Assert.IsNotNull(o);
+				Assert.That(array.NewItems.Contains(o));
+			}
+
+			if (e.ListChangedType != ListChangedType.ItemDeleted && e.ListChangedType != ListChangedType.Reset)
+				Console.WriteLine("ListChanged (ID:{3}). Type: {0}, OldIndex: {1}, NewIndex: {2}", e.ListChangedType, e.OldIndex, e.NewIndex, (e.NewIndex >= 0 && e.NewIndex < _testList.Count) ? ((EditableTestObject)_testList[e.NewIndex]).ID : -1);
+			else
+				Console.WriteLine("ListChanged (ID:???). Type: {0}, OldIndex: {1}, NewIndex: {2}", e.ListChangedType, e.OldIndex, e.NewIndex);
+		}
+		
+		[Test]
+		public void TestAdd()
+		{
+			Console.WriteLine("--- TestAdd ---");
+			_testList.Clear();
+			_testList.RemoveSort();
+
+			for (var i = 0; i < 3; i++)
+				_testList.Add(_testObjects[i]);
+			
+			Assert.AreEqual(_testList.Count, 3);
+			Assert.AreEqual(_testList[0], _testObjects[0]);
+			Assert.AreEqual(_testList[1], _testObjects[1]);
+			Assert.AreEqual(_testList[2], _testObjects[2]);
+			
+			var _subArray = new EditableTestObject[3];
+
+			for (var i = 3; i < _testObjects.Length; i++)
+				_subArray[i-3] = _testObjects[i];
+
+			_testList.AddRange(_subArray);
+			Assert.AreEqual(_testList.Count, 6);
+			
+			for (var i = 3; i < _testObjects.Length; i++)
+				Assert.AreEqual(_subArray[i - 3], _testObjects[i]);
+
+			PrintList();
+			
+			_testList.Clear();
+		}
+
+		[Test]
+		public void TestAddNew()
+		{
+			var list = new EditableList<EditableTestObject>();
+			var listChangedFired = false;
+
+			list.ListChanged += (sender, args) => listChangedFired = true;
+
+			list.AddNew();
+			Assert.That(listChangedFired);
+			Assert.AreEqual(1, list.Count);
+			Assert.AreEqual(1, list.NewItems.Count);
+
+			listChangedFired = false;
+			list.CancelNew(0);
+			Assert.That(listChangedFired);
+			Assert.IsEmpty(list);
+			Assert.IsEmpty(list.NewItems);
+		}
+
+		[Test]
+		public void TestInsert()
+		{
+			Console.WriteLine("--- TestInsert ---");
+			_testList.Clear();
+			_testList.RemoveSort();
+
+			for (var i = 0; i < 3; i++)
+				_testList.Insert(0, _testObjects[i]);
+
+			Assert.AreEqual(_testList.Count, 3);
+			Assert.AreEqual(_testList[0], _testObjects[2]);
+			Assert.AreEqual(_testList[1], _testObjects[1]);
+			Assert.AreEqual(_testList[2], _testObjects[0]);
+
+			var _subArray = new EditableTestObject[3];
+
+			for (var i = 3; i < _testObjects.Length; i++)
+				_subArray[i-3] = _testObjects[i];
+
+			_testList.InsertRange(0, _subArray);
+			Assert.AreEqual(_testList.Count, 6);
+
+			Assert.AreEqual(_testList[0], _testObjects[3]);
+			Assert.AreEqual(_testList[1], _testObjects[4]);
+			Assert.AreEqual(_testList[2], _testObjects[5]);
+
+			PrintList();
+
+			_testList.Clear();
+		}
+		
+		[Test]
+		public void TestRemove()
+		{
+			Console.WriteLine("--- TestRemove ---");
+
+			_testList.Clear();
+			_testList.RemoveSort();
+			_testList.AddRange(_testObjects);
+
+			_testList.RemoveAt(2);
+			Assert.AreEqual(_testList.Count, 5);
+			Assert.IsEmpty(_testList.DelItems);
+
+			_testList.AcceptChanges();
+			Assert.IsEmpty(_testList.NewItems);
+
+			_testList.Remove(_testList[0]);
+			Assert.AreEqual(_testList.Count, 4);
+			Assert.IsNotEmpty(_testList.DelItems);
+
+			_testList.Clear();
+			Assert.AreEqual(_testList.Count, 0);
+		}
+
+		[Test]
+		public void TestRemoveRange()
+		{
+			Console.WriteLine("--- TestRemoveRange ---");
+
+			_testList.Clear();
+			_testList.RemoveSort();
+			_testList.AcceptChanges();
+			_testList.AddRange(_testObjects);
+
+			Assert.AreEqual(6, _testList.Count);
+			Assert.AreEqual(6, _testList.NewItems.Count);
+			Assert.AreEqual(0, _testList.DelItems.Count);
+
+			_testList.RemoveRange(1, 3);
+
+			Assert.AreEqual(3, _testList.Count);
+			Assert.AreEqual(3, _testList.NewItems.Count);
+			Assert.AreEqual(0, _testList.DelItems.Count);
+			Assert.AreEqual(0, ((EditableTestObject)_testList[0]).ID);
+			Assert.AreEqual(4, ((EditableTestObject)_testList[1]).ID);
+
+			_testList.AcceptChanges();
+
+			Assert.AreEqual(3, _testList.Count);
+			Assert.AreEqual(0, _testList.NewItems.Count);
+			Assert.AreEqual(0, _testList.DelItems.Count);
+
+			_testList.RemoveRange(0, 1);
+
+			Assert.AreEqual(2, _testList.Count);
+			Assert.AreEqual(0, _testList.NewItems.Count);
+			Assert.AreEqual(1, _testList.DelItems.Count);
+			
+			_testList.Clear();
+
+			Assert.AreEqual(0, _testList.Count);
+			Assert.AreEqual(0, _testList.NewItems.Count);
+			Assert.AreEqual(3, _testList.DelItems.Count);
+			
+			_testList.AcceptChanges();
+
+			Assert.AreEqual(0, _testList.Count);
+			Assert.AreEqual(0, _testList.NewItems.Count);
+			Assert.AreEqual(0, _testList.DelItems.Count);
+		}
+
+		[Test]
+		public void TestSortedAdd()
+		{
+			Console.WriteLine("--- TestSortedAdd ---");
+			_testList.Clear();
+			_testList.RemoveSort();
+			_testList.ApplySort(_testList.GetItemProperties(null)["Seconds"], ListSortDirection.Descending);
+
+			for (var i = 0; i < 3; i++)
+				_testList.Add(_testObjects[i]);
+
+			Assert.AreEqual(_testList.Count, 3);
+			Assert.AreEqual(_testList[1], _testObjects[0]);
+			Assert.AreEqual(_testList[2], _testObjects[1]);
+			Assert.AreEqual(_testList[0], _testObjects[2]);
+
+			var _subArray = new EditableTestObject[3];
+
+			for (var i = 3; i < _testObjects.Length; i++)
+				_subArray[i-3] = _testObjects[i];
+
+			_testList.AddRange(_subArray);
+			Assert.AreEqual(_testList.Count, 6);
+
+			Assert.AreEqual(_testList[0], _testObjects[3]);
+			Assert.AreEqual(_testList[2], _testObjects[4]);
+			Assert.AreEqual(_testList[3], _testObjects[5]);
+
+			PrintList();
+
+			_testList.Clear();
+			Assert.AreEqual(_testList.Count, 0);
+
+			_testList.ApplySort(_testList.GetItemProperties(null)["Seconds"], ListSortDirection.Ascending);
+
+			for (var i = 0; i < 3; i++)
+				_testList.Add(_testObjects[i]);
+
+			Assert.AreEqual(_testList.Count, 3);
+			Assert.AreEqual(_testList[1], _testObjects[0]);
+			Assert.AreEqual(_testList[0], _testObjects[1]);
+			Assert.AreEqual(_testList[2], _testObjects[2]);
+
+			_testList.AddRange(_subArray);
+			Assert.AreEqual(_testList.Count, 6);
+
+			Assert.AreEqual(_testList[5], _testObjects[3]);
+			Assert.AreEqual(_testList[3], _testObjects[4]);
+			Assert.AreEqual(_testList[2], _testObjects[5]);
+
+			PrintList();
+
+			_testList.Clear();
+		}
+		
+		[Test]
+		public void TestSortedInsert()
+		{
+			Console.WriteLine("--- TestSortedInsert ---");
+			_testList.Clear();
+			_testList.RemoveSort();
+			_testList.ApplySort(_testList.GetItemProperties(null)["Seconds"], ListSortDirection.Descending);
+
+			for (var i = 0; i < 3; i++)
+				_testList.Insert(0, _testObjects[i]);
+
+			Assert.AreEqual(_testList.Count, 3);
+			Assert.AreEqual(_testList[0], _testObjects[2]);
+			Assert.AreEqual(_testList[1], _testObjects[0]);
+			Assert.AreEqual(_testList[2], _testObjects[1]);
+
+			var _subArray = new EditableTestObject[3];
+
+			for (var i = 3; i < _testObjects.Length; i++)
+				_subArray[i-3] = _testObjects[i];
+
+			_testList.InsertRange(0, _subArray);
+			Assert.AreEqual(_testList.Count, 6);
+
+			Assert.AreEqual(_testList[0], _testObjects[3]);
+			Assert.AreEqual(_testList[2], _testObjects[4]);
+			Assert.AreEqual(_testList[3], _testObjects[5]);
+
+			PrintList();
+
+			_testList.Clear();
+			Assert.AreEqual(_testList.Count, 0);
+
+			_testList.ApplySort(_testList.GetItemProperties(null)["Seconds"], ListSortDirection.Ascending);
+
+			for (var i = 0; i < 3; i++)
+				_testList.Insert(0, _testObjects[i]);
+
+			Assert.AreEqual(_testList.Count, 3);
+			Assert.AreEqual(_testList[0], _testObjects[1]);
+			Assert.AreEqual(_testList[1], _testObjects[0]);
+			Assert.AreEqual(_testList[2], _testObjects[2]);
+
+			_testList.InsertRange(0, _subArray);
+			Assert.AreEqual(_testList.Count, 6);
+
+			Assert.AreEqual(_testList[2], _testObjects[5]);
+			Assert.AreEqual(_testList[3], _testObjects[4]);
+			Assert.AreEqual(_testList[5], _testObjects[3]);
+
+			PrintList();
+
+			_testList.Clear();
+		}
+		
+		[Test]
+		public void TestSortedPropertyChange()
+		{
+			Console.WriteLine("--- TestSortedPropertyChange ---");
+			_testList.Clear();
+			_testList.RemoveSort();
+			_testList.ApplySort(_testList.GetItemProperties(null)["Seconds"], ListSortDirection.Descending);
+			_testList.AddRange(_testObjects);
+
+			var eto = EditableTestObject.CreateInstance(6, "Dummy", 10);
+
+			_testList.Add(eto);
+			Assert.AreEqual(_testList.Count, 7);
+			Assert.AreEqual(_testList[6], eto);
+
+			eto.Seconds = 20;
+			Assert.AreEqual(_testList[6], eto);
+
+			eto.Seconds = 23;
+			Assert.AreEqual(_testList[5], eto);
+
+			eto.Seconds = 30;
+			Assert.AreEqual(_testList[4], eto);
+
+			eto.Seconds = 40;
+			Assert.AreEqual(_testList[2], eto);
+
+			eto.Seconds = 50;
+			Assert.AreEqual(_testList[1], eto);
+
+			eto.Seconds = 60;
+			Assert.AreEqual(_testList[0], eto);
+		}
+		
+		private void PrintList()
+		{
+			Console.WriteLine("--- Print List ---");
+			foreach (EditableTestObject o in _testList)
+				Console.WriteLine(o);
+		}
+
+		[Test]
+		public void SerializationTest()
+		{
+			//Configuration.NotifyOnEqualSet = true;
+
+			var test   = TypeAccessor<SerializableObject>.CreateInstance();
+			var stream = new MemoryStream();
+			var bf     = new BinaryFormatter();
+
+			bf.Serialize(stream, test);
+
+			//Configuration.NotifyOnChangesOnly = false;
+		}
+
+		//////[Test] Resharpe 8 issue
+		public void SerializationTest2()
+		{
+			//Configuration.NotifyOnChangesOnly = true;
+
+			var list = new EditableList<SerializableObject> { TypeAccessor<SerializableObject>.CreateInstance() };
+
+			var formatter = new BinaryFormatter();
+
+			using (var stream = new MemoryStream())
+			{
+				formatter.Serialize(stream, list);
+				stream.Position = 0;
+
+				var result = formatter.Deserialize(stream);
+
+				Assert.IsNotNull(result);
+
+				var eal = (EditableList<SerializableObject>)result;
+
+				Console.WriteLine(eal.Count);
+
+				eal.ListChanged += eal_ListChanged;
+
+				eal[0].ID = 0;
+				_notificationCount = 0;
+				eal[0].ID = -100;
+				eal[0].ID = -100;
+				eal[0].ID = -100;
+				eal[0].ID = -100;
+				eal[0].ID = -100;
+				eal[0].ID = -100;
+
+				Console.WriteLine(eal.Count);
+
+				//Assert.AreEqual(_notificationCount, 1);
+			}
+
+			//Configuration.NotifyOnChangesOnly = false;
+		}
+
+		private static int _notificationCount;
+
+		static void eal_ListChanged(object sender, ListChangedEventArgs e)
+		{
+			Console.WriteLine(e.ListChangedType);
+			_notificationCount++;
+		}
+
+		[Test]
+		public void SortTest()
+		{
+			var dataList = new EditableList<EditableTestObject>
+			{
+				EditableTestObject.CreateInstance(1, "John",   60),
+				EditableTestObject.CreateInstance(1, "John",   60),
+				EditableTestObject.CreateInstance(1, "John",   60),
+				EditableTestObject.CreateInstance(2, "Tester", 70),
+				EditableTestObject.CreateInstance(2, "Tester", 70),
+				EditableTestObject.CreateInstance(2, "Tester", 70),
+				EditableTestObject.CreateInstance(3, "Tester", 70),
+				EditableTestObject.CreateInstance(3, "Tester", 70),
+				EditableTestObject.CreateInstance(3, "Tester", 70)
+			};
+
+			var bindingSource = new BindingSource(dataList, null) { Sort = "ID" };
+			var prev          = 0;
+
+			foreach (var o in dataList)
+			{
+				Assert.IsTrue(o.ID >= prev);
+				prev = o.ID;
+			}
+
+			bindingSource[0] = EditableTestObject.CreateInstance(2, "John", 60);
+
+			prev = 0;
+
+			foreach (var o in dataList)
+			{
+				Assert.IsTrue(o.ID >= prev);
+				prev = o.ID;
+			}
+		}
+
+		public class DerivedEditableList<T> : EditableList<T>
+		{
+			public event EventHandler OnListChangedCalled;
+
+			protected void OnOnListChangedCalled()
+			{
+				if (OnListChangedCalled != null)
+					OnListChangedCalled(this, EventArgs.Empty);
+			}
+
+			protected override void OnListChanged(ListChangedEventArgs e)
+			{
+				OnOnListChangedCalled();
+				base.OnListChanged(e);
+			}
+		}
+
+
+		[Test]
+		public void DerivedOnListChanged()
+		{
+			var called = false;
+			var list   = new DerivedEditableList<int>();
+
+			list.OnListChangedCalled += (sender, args) => called = true;
+
+			list.Add(1);
+
+			Assert.IsTrue(called);
+			Assert.AreEqual(1, list.NewItems.Count);
+			Assert.AreEqual(1, list.Count);
+			Assert.AreEqual(0, list.DelItems.Count);
+
+			called = false;
+			list.RemoveAt(0);
+			
+			Assert.IsTrue(called);
+			Assert.AreEqual(0, list.NewItems.Count);
+			Assert.AreEqual(0, list.Count);
+			Assert.AreEqual(0, list.DelItems.Count);
+		}
+
+		[Test]
+		public void CloneTest()
+		{
+			var src   = new EditableList<int> { 1, 2, 3 };
+			var clone = (EditableList<int>)src.Clone();
+
+			Assert.AreEqual(src.Count,          clone.Count);
+			Assert.AreEqual(src.NewItems.Count, clone.NewItems.Count);
+			Assert.AreEqual(src.DelItems.Count, clone.DelItems.Count);
+
+			src.AcceptChanges();
+
+			clone = (EditableList<int>)src.Clone();
+			
+			Assert.AreEqual(src.Count,          clone.Count);
+			Assert.AreEqual(src.NewItems.Count, clone.NewItems.Count);
+			Assert.AreEqual(src.DelItems.Count, clone.DelItems.Count);
+
+			src.RemoveAt(1);
+
+			clone = (EditableList<int>)src.Clone();
+			
+			Assert.AreEqual(src.Count,          clone.Count);
+			Assert.AreEqual(src.NewItems.Count, clone.NewItems.Count);
+			Assert.AreEqual(src.DelItems.Count, clone.DelItems.Count);
+		}
+
+		[Test]
+		public void CreateCleanTest()
+		{
+			var list = new EditableList<int>(new[] { 1, 2, 3 });
+
+			Assert.IsFalse(list.IsDirty);
+
+			Assert.AreEqual(3, list.Count);
+			Assert.AreEqual(0, list.NewItems.Count);
+			Assert.AreEqual(0, list.DelItems.Count);
+			
+			list = new EditableList<int>(new int[] { });
+
+			Assert.IsFalse(list.IsDirty);
+
+			Assert.AreEqual(0, list.Count);
+			Assert.AreEqual(0, list.NewItems.Count);
+			Assert.AreEqual(0, list.DelItems.Count);		
+		}
+
+		[Test]
+		public void IsDirtyTest()
+		{
+			var list = new EditableList<EditableTestObject>();
+
+			list.AddNew();
+			list.AddNew();
+
+			Assert.IsTrue(list.IsDirty);
+
+			list.AcceptChanges();
+
+			Assert.IsFalse(list.IsDirty);
+
+			list[1].ID = 101;
+
+			Assert.IsTrue(list[1].IsDirty);
+			Assert.IsTrue(list.IsDirty);
+		}
+
+		[Test]
+		public void CreateWithDirtyTest()
+		{
+			var to = EditableTestObject.CreateInstance();
+
+			to.ID = 10;
+
+			Assert.IsTrue(to.IsDirty);
+
+			var list = new EditableList<EditableTestObject>(new[] { to });
+
+			Assert.IsTrue(to.IsDirty);
+			Assert.IsTrue(list.IsDirty);
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/EditableObjects/EditableList_AcceptChanges.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,62 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+using BLToolkit.EditableObjects;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+
+namespace A.EditableObjects
+{
+	//[TestFixture]
+	public class EditableList_AcceptChanges
+	{
+		public static bool IsAcceptChangesCallForPersonPhone = false;
+
+		public abstract class _DomainObject : EditableObject
+		{
+			[PrimaryKey(0), NonUpdatable]
+			[NullValue()]
+			public abstract int ID { get; set; }
+
+			public override void AcceptChanges()
+			{
+				base.AcceptChanges();
+
+				if (typeof(_PersonPhone).IsAssignableFrom(GetType()))
+					IsAcceptChangesCallForPersonPhone = true;
+			}
+		}
+
+		public abstract class _PersonPhone : _DomainObject, IEditable
+		{
+			public abstract string Number_PersonPhone { get; set; }
+		}
+
+		public abstract class _Person : _DomainObject
+		{
+			public abstract EditableList<_PersonPhone> Phones { get; set; }
+		}
+
+		//[Test]
+		public void Test_EditableList_AcceptChanges()
+		{
+			_Person person = TypeAccessor<_Person>.CreateInstance();
+
+			person.Phones.AddRange(new _PersonPhone[]
+			{
+				TypeAccessor<_PersonPhone>.CreateInstanceEx(),
+				TypeAccessor<_PersonPhone>.CreateInstanceEx()
+			});
+
+			person.Phones[1].Number_PersonPhone = "222-22-22";
+
+			person.AcceptChanges();
+
+			Assert.IsFalse(person.IsDirty);
+			Assert.IsTrue(IsAcceptChangesCallForPersonPhone);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/EditableObjects/EditableObjectT.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,69 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.EditableObjects;
+using BLToolkit.TypeBuilder;
+
+namespace EditableObjects
+{
+	[TestFixture]
+	public class EditableObjectT
+	{
+		public abstract class TestObject: EditableObject<TestObject>
+		{
+			public abstract int         ID    { get; set; }
+			public abstract string      Name  { get; set; }
+			public abstract InnerObject Inner { get; set; }
+
+			public abstract class InnerObject: EditableObject<InnerObject>
+			{
+				public abstract int     Some  { get; set; }
+			}
+		}
+
+		[Test]
+		public void CloneTest()
+		{
+			TestObject o = TestObject.CreateInstance();
+
+			o.ID   = 1;
+			o.Name = "str";
+			o.Inner.Some = 2;
+
+			TestObject clone = o.Clone();
+
+			// Make sure this one is cloned, not copied.
+			//
+			o.Inner.Some = 3;
+
+			Assert.AreEqual(o.ID, clone.ID);
+			Assert.AreEqual(o.Name, clone.Name);
+
+			Assert.AreNotEqual(o.Inner.Some, clone.Inner.Some);
+			Assert.IsFalse(o.Equals(clone));
+
+			// Now make it the same as original value.
+			//
+			clone.Inner = o.Inner.Clone();
+
+			Assert.AreEqual(o.Inner.Some, clone.Inner.Some);
+		}
+
+		[Test]
+		public void IsDirtyTest()
+		{
+			TestObject o = TestObject.CreateInstance();
+
+			o.ID   = 1;
+			o.Name = "str";
+			o.Inner.Some = 2;
+			o.AcceptChanges();
+
+			TestObject clone = o.Clone();
+
+			Assert.IsFalse(o.IsDirty);
+			Assert.IsFalse(clone.IsDirty);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/EditableObjects/EditableObjectTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,331 @@
+using System;
+using System.Reflection;
+using System.Xml;
+
+using NUnit.Framework;
+
+using BLToolkit.EditableObjects;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+
+namespace EditableObjects
+{
+	[TestFixture]
+	public class EditableObjectTest
+	{
+		public class Source
+		{
+			public int         ID   = 10;
+			public string      Name = "20";
+			public XmlDocument Xml;
+		
+			public Source()
+			{
+				Xml = new XmlDocument();
+				Xml.LoadXml("<test/>");
+			}
+		}
+
+		public abstract class Dest: EditableObject
+		{
+			public string ChangedPropertyName;
+
+			public abstract int         ID   { get; set; }
+			public abstract string      Name { get; set; }
+			public abstract XmlDocument Xml  { get; set; }
+
+			protected override void OnPropertyChanged(string propertyName)
+			{
+				ChangedPropertyName = propertyName;
+				if (propertyName == "ID")
+					Assert.That(ID, Is.Not.EqualTo(0));
+				else if (propertyName == "Xml")
+					Assert.That(Xml.InnerXml, Is.Not.EqualTo("<test />"));
+
+			}
+		}
+
+		[Test]
+		public void Notification()
+		{
+			Dest o = Map.ObjectToObject<Dest>(new Source());
+
+			Assert.AreEqual("", o.ChangedPropertyName);
+
+			o.ID = 1;
+			Assert.AreEqual("ID", o.ChangedPropertyName);
+
+			o.Xml.DocumentElement.AppendChild(o.Xml.CreateElement("el"));
+			Assert.AreEqual("Xml", o.ChangedPropertyName);
+		}
+
+		public abstract class Object1: EditableObject<Object1>
+		{
+			[MapField("ObjectId")]
+			public abstract int         ID       { get; }
+			public abstract short       Field1   { get; set; }
+
+			[MapValue(true,  "Y")]
+			[MapValue(false, "N")]
+			public abstract bool        Field2   { get; set; }
+			[Parameter(2, 2, 2)]
+			public abstract DateTime?   Field3   { get; set; }
+			[Parameter(2L)]
+			public abstract long        Field4   { get; set; }
+			public abstract byte        Field5   { get; set; }
+			public abstract char        Field6   { get; set; }
+			public abstract ushort      Field7   { get; set; }
+			public abstract uint        Field8   { get; set; }
+			public abstract ulong       Field9   { get; set; }
+			public abstract sbyte       Field10  { get; set; }
+			public abstract float       Field11  { get; set; }
+			public abstract double      Field12  { get; set; }
+			[Parameter(3.08)]
+			public abstract decimal?    Field13  { get; set; }
+			public abstract string      Field14  { get; set; }
+			public abstract Guid        Field15  { get; set; }
+			public abstract DayOfWeek   Field16  { get; set; }
+			public abstract ulong?      Field17  { get; set; }
+			public abstract XmlDocument XmlField { get; set; }
+		}
+
+		[Test]
+		public void TestCreate()
+		{
+			Object1 o = Object1.CreateInstance();
+
+			Assert.That(o.Field4,  Is.EqualTo(2L));
+			Assert.That(o.Field3,  Is.EqualTo(new DateTime(2,2,2)));
+			Assert.That(o.Field13, Is.EqualTo(3.08m));
+
+			Assert.IsFalse(o.IsDirty);
+
+			TypeAccessor<Object1>.Instance["ID"].SetValue(o, 1);
+
+			Assert.AreEqual(1, o.ID);
+			Assert.IsTrue  (o.IsDirty);
+			Assert.IsTrue  (o.IsDirtyMember("ID"));
+			o.AcceptChanges();
+			Assert.IsFalse (o.IsDirty);
+
+			o.Field16 = DayOfWeek.Saturday;
+
+			Assert.AreEqual(DayOfWeek.Saturday, o.Field16);
+			Assert.IsTrue  (o.IsDirty);
+			Assert.IsTrue  (o.IsDirtyMember("Field16"));
+			o.AcceptChanges();
+			Assert.IsFalse (o.IsDirty);
+
+			o.Field17 = 5;
+
+			Assert.AreEqual(5, o.Field17);
+			Assert.IsTrue  (o.IsDirty);
+			Assert.IsTrue  (o.IsDirtyMember("Field17"));
+			o.AcceptChanges();
+			Assert.IsFalse (o.IsDirty);
+
+			o.XmlField.LoadXml(@"<root><element attribute=""value""/></root>");
+			Assert.IsTrue  (o.IsDirty);
+			o.AcceptChanges();
+
+			o.XmlField.SelectSingleNode("/root/element/@attribute").Value = "changed";
+			Assert.IsTrue  (o.IsDirty);
+			Assert.IsTrue  (o.IsDirtyMember("XmlField"));
+			o.AcceptChanges();
+			Assert.IsFalse (o.IsDirty);
+
+			o.XmlField.SelectSingleNode("/root/element/@attribute").Value = "once again";
+			o.XmlField = new XmlDocument();
+			Assert.IsTrue  (o.IsDirty);
+		}
+
+
+		[Test]
+		public void TestRejectChangesNotification()
+		{
+			Object1 o = Object1.CreateInstance();
+
+			Console.WriteLine("o is dirty: " + o.IsDirty);
+
+			o.PropertyChanged += object_PropertyChanged;
+
+			Console.WriteLine("Changing 3 fields");
+
+			o.Field1 = 10;
+			o.Field2 = !o.Field2;
+			o.Field3 = DateTime.Now;
+			o.XmlField.LoadXml("<root foo=\"bar\"/>");
+			o.XmlField.DocumentElement.Attributes.RemoveAll();
+			o.XmlField.DocumentElement.Attributes.Append(o.XmlField.CreateAttribute("attr"));
+
+			Console.WriteLine("Dirty Members");
+
+			PropertyInfo[] dirtyMembers = o.GetDirtyMembers();
+
+			Assert.AreEqual(4, dirtyMembers.Length);
+
+			foreach (PropertyInfo dirtyMember in dirtyMembers)
+				Console.WriteLine(dirtyMember.Name);
+
+			Console.WriteLine("Rejecting field 1");
+
+			o.RejectMemberChanges("Field1");
+			o.RejectMemberChanges("XmlField");
+
+			Console.WriteLine("Dirty Members");
+
+			dirtyMembers = o.GetDirtyMembers();
+			Assert.AreEqual(2, dirtyMembers.Length);
+
+			foreach (PropertyInfo dirtyMember in dirtyMembers)
+				Console.WriteLine(dirtyMember.Name);
+
+			Console.WriteLine("Rejecting all changes");
+
+			o.RejectChanges();
+
+			Console.WriteLine("Dirty Members");
+
+			dirtyMembers = o.GetDirtyMembers();
+			Assert.AreEqual(dirtyMembers.Length, 0);
+
+			foreach (PropertyInfo dirtyMember in dirtyMembers)
+				Console.WriteLine(dirtyMember.Name);
+		}
+
+		private static void object_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
+		{
+			Console.WriteLine("Property Changed: " + e.PropertyName);
+		}
+
+		[Test]
+		public void IsDirtyTest()
+		{
+			Object1 o = Object1.CreateInstance();
+
+			o.Field1 = 10;
+			o.Field2 = !o.Field2;
+			o.Field3 = DateTime.Now;
+			o.AcceptChanges();
+
+			Object1 c = (Object1)((ICloneable)o).Clone();
+
+			Assert.IsFalse(o.IsDirty);
+			Assert.IsFalse(c.IsDirty);
+
+			o.Field1 = 100;
+			c = (Object1)((ICloneable)o).Clone();
+
+			Assert.IsTrue(o.IsDirty);
+			Assert.IsTrue(c.IsDirty);
+
+			Assert.IsTrue(o.IsDirtyMember("Field1"));
+			Assert.IsTrue(c.IsDirtyMember("Field1"));
+
+			Assert.IsFalse(o.IsDirtyMember("Field2"));
+			Assert.IsFalse(c.IsDirtyMember("Field2"));
+		}
+
+		public class TestClass
+		{
+			public int    ID;
+			public string Str;
+		}
+
+		public struct TestStruct
+		{
+			public int    ID;
+			public string Str;
+		}
+
+		public abstract class TestEditableObject : EditableObject
+		{
+			public abstract int ID { get; set; }
+
+			public static TestEditableObject CreateInstance()
+			{
+				return (TestEditableObject)
+					TypeAccessor.CreateInstanceEx(typeof(TestEditableObject), null);
+			}
+		}
+
+		[Test]
+		public void EqualsTest()
+		{
+			TestClass classInst1 = new TestClass();
+			TestClass classInst2 = new TestClass();
+
+			TestStruct structInst1 = new TestStruct();
+			TestStruct structInst2 = new TestStruct();
+
+			TestEditableObject editableInst1 = TestEditableObject.CreateInstance();
+			TestEditableObject editableInst2 = TestEditableObject.CreateInstance();
+			TestEditableObject editableInst3 = editableInst1;
+
+			classInst1   .ID = classInst2   .ID = 1;
+			structInst1  .ID = structInst2  .ID = 1;
+			editableInst1.ID = editableInst2.ID = 1;
+
+			TestStruct structInst3 = structInst1;
+			TestClass   classInst3 = classInst1;
+
+			Assert.IsTrue(Equals(structInst1,   structInst2));
+			Assert.IsTrue(Equals(structInst1,   structInst3));
+			Assert.IsTrue(Equals(structInst2,   structInst3));
+
+			Assert.IsFalse(Equals(classInst1,    classInst2));
+			Assert.IsFalse(Equals(editableInst1, editableInst2));
+
+			Assert.IsTrue (Equals(classInst1,    classInst3));
+			Assert.IsTrue (Equals(editableInst1, editableInst3));
+
+			Assert.IsFalse(Equals(classInst2,    classInst3));
+			Assert.IsFalse(Equals(editableInst2, editableInst3));
+		}
+
+		[Test]
+		public void EqualsSpeedTest()
+		{
+			TestClass eo1Inst1 = new TestClass();
+			TestClass eo1Inst3 = eo1Inst1;
+
+			TestEditableObject eo2Inst1 = TestEditableObject.CreateInstance();
+			TestEditableObject eo2Inst3 = eo2Inst1;
+
+			eo1Inst1.ID = 1; eo1Inst1.Equals(eo1Inst3);
+			eo2Inst1.ID = 1; eo2Inst1.Equals(eo2Inst3);
+
+			long startTicks = DateTime.Now.Ticks;
+			for (int i = 0; i < 100000; i++)
+				eo1Inst1.Equals(eo1Inst3);
+			Console.WriteLine(".NET: {0}", DateTime.Now.Ticks - startTicks);
+
+			startTicks = DateTime.Now.Ticks;
+			for (int i = 0; i < 100000; i++)
+				eo2Inst1.Equals(eo2Inst3);
+			Console.WriteLine("BLT: {0}", DateTime.Now.Ticks - startTicks);
+		}
+
+		[Test]
+		public void GetHashCodeSpeedTest()
+		{
+			TestClass eo1Inst1 = new TestClass();
+			TestEditableObject eo2Inst1 = TestEditableObject.CreateInstance();
+
+			eo1Inst1.ID = 1; eo1Inst1.GetHashCode();
+			eo2Inst1.ID = 1; eo2Inst1.GetHashCode();
+
+			long startTicks = DateTime.Now.Ticks;
+			for (int i = 0; i < 100000; i++)
+				eo1Inst1.GetHashCode();
+			Console.WriteLine(".NET: {0}", DateTime.Now.Ticks - startTicks);
+
+			startTicks = DateTime.Now.Ticks;
+			for (int i = 0; i < 100000; i++)
+				eo2Inst1.GetHashCode();
+			Console.WriteLine("BLT: {0}", DateTime.Now.Ticks - startTicks);
+		}
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/EditableObjects/InnerObjectTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,40 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.EditableObjects;
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+
+namespace EditableObjects
+{
+	[TestFixture]
+	public class InnerObjectTest
+	{
+		public abstract class TestClass : EditableObject
+		{
+			public abstract TestClass1 Test1 { get; set; }
+		}
+
+		public abstract class TestClass1 : EditableObject
+		{
+			public TestClass1() {}
+			public TestClass1(InitContext ctx) : base() {}
+
+			[NoInstance]
+			public abstract TestClass2 Test2 { get; set; }
+		}
+
+		public abstract class TestClass2 : EditableObject
+		{
+		}
+
+		[Test]
+		public void Test()
+		{
+			TestClass test = (TestClass)TypeAccessor.CreateInstance(typeof(TestClass));
+
+			Assert.IsNull(test.Test1.Test2);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/EditableObjects/NestedObjectTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,76 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.EditableObjects;
+using BLToolkit.TypeBuilder;
+using BLToolkit.Reflection;
+
+namespace EditableObjects
+{
+	[TestFixture]
+	public class NestedObjectTest
+	{
+		public abstract class AbstractNestedObject : EditableObject
+		{
+			public AbstractNestedObject(InitContext ic)
+			{
+				if (ic.MemberParameters != null && ic.MemberParameters.Length > 0)
+					ID = Convert.ToInt32(ic.MemberParameters[0]);
+			}
+
+			public abstract int ID { get; set; }
+		}
+
+		public class NestedObject : EditableObject
+		{
+			public NestedObject()
+			{
+			}
+
+			public NestedObject(int n)
+			{
+				ID = n;
+			}
+
+			public int ID;
+		}
+
+		public abstract class MasterObject : EditableObject
+		{
+			public abstract int                  ID      { get; set; }
+			public abstract AbstractNestedObject Object1 { get; set; }
+			public abstract NestedObject         Object2 { get; set; }
+
+			[Parameter(100)]
+			public abstract AbstractNestedObject Object3 { get; set; }
+			[Parameter(200)]
+			public abstract NestedObject         Object4 { get; set; }
+
+			public string ChangedProperty;
+
+			protected override void OnPropertyChanged(string propertyName)
+			{
+				base.OnPropertyChanged(propertyName);
+
+				ChangedProperty = propertyName;
+			}
+		}
+
+		[Test]
+		public void Test()
+		{
+			MasterObject obj = (MasterObject)TypeAccessor.CreateInstance(typeof(MasterObject));
+
+			Assert.IsNotNull(obj.Object1);
+			Assert.IsNotNull(obj.Object2);
+
+			Assert.AreEqual(100, obj.Object3.ID);
+			Assert.AreEqual(200, obj.Object4.ID);
+
+			obj.Object1.ID = 50;
+
+			Assert.AreEqual("Object1.ID", obj.ChangedProperty);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/EditableObjects/NotifyCollectionChangeTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,523 @@
+using System;
+using System.Collections.Specialized;
+using System.ComponentModel;
+using System.IO;
+using System.Runtime.Serialization.Formatters.Binary;
+using System.Windows.Forms;
+using BLToolkit.EditableObjects;
+using BLToolkit.Reflection;
+using NUnit.Framework;
+
+namespace EditableObjects
+{
+	[TestFixture]
+	public class NotifyCollectionChangeTest
+	{
+		public abstract class EditableTestObject : EditableObject
+		{
+			public abstract int    ID      { get; set; }
+			public abstract string Name    { get; set; }
+			public abstract int    Seconds { get; set; }
+
+			public static EditableTestObject CreateInstance()
+			{
+				return TypeAccessor<EditableTestObject>.CreateInstance();
+			}
+			
+			public static EditableTestObject CreateInstance(int id, string name, int seconds)
+			{
+				EditableTestObject instance = CreateInstance();
+
+				instance.ID = id;
+				instance.Name = name;
+				instance.Seconds = seconds;
+				
+				return instance;
+			}
+
+			public override string ToString()
+			{
+				return string.Format("EditableTestObject - ID:({0}) Name: ({1}) Seconds({2})", ID, Name, Seconds);
+			}
+		}
+		
+		private static readonly EditableTestObject[] _testObjects = new EditableTestObject[6]
+		{
+			EditableTestObject.CreateInstance(0, "Smith",  24),
+			EditableTestObject.CreateInstance(1, "John",   22),
+			EditableTestObject.CreateInstance(2, "Anna",   48),
+			EditableTestObject.CreateInstance(3, "Tim",    56),
+			EditableTestObject.CreateInstance(4, "Xiniu",  39),
+			EditableTestObject.CreateInstance(5, "Kirill", 30)
+		};
+		
+		public NotifyCollectionChangeTest()
+		{
+			_testList = new EditableList<EditableTestObject>();
+			_testList.CollectionChanged += TestList_CollectionChanged;
+		}
+
+		private readonly EditableArrayList _testList;
+
+		private void TestList_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
+		{
+			EditableArrayList array = sender as EditableArrayList;
+			
+			Assert.IsNotNull(array);
+			if (e.Action != NotifyCollectionChangedAction.Reset)
+				Assert.That(array.IsDirty);
+
+			EditableTestObject o = (EditableTestObject)(e.NewItems != null? e.NewItems[0]:
+									e.OldItems != null ? e.OldItems[0]: null);
+
+			Console.WriteLine("CollectionChanged (ID:{3}). Type: {0}, OldIndex: {1}, NewIndex: {2}",
+				e.Action, e.OldStartingIndex, e.NewStartingIndex, o != null? o.ID: -1);
+		}
+		
+		[Test]
+		public void TestAdd()
+		{
+			Console.WriteLine("--- TestAdd ---");
+			_testList.Clear();
+			_testList.RemoveSort();
+
+			for (int i = 0; i < 3; i++)
+				_testList.Add(_testObjects[i]);
+			
+			Assert.AreEqual(_testList.Count, 3);
+			Assert.AreEqual(_testList[0], _testObjects[0]);
+			Assert.AreEqual(_testList[1], _testObjects[1]);
+			Assert.AreEqual(_testList[2], _testObjects[2]);
+			
+			EditableTestObject[] subArray = new EditableTestObject[3];
+
+			for (int i = 3; i < _testObjects.Length; i++)
+				subArray[i-3] = _testObjects[i];
+
+			_testList.AddRange(subArray);
+			Assert.AreEqual(_testList.Count, 6);
+			
+			for (int i = 3; i < _testObjects.Length; i++)
+				Assert.AreEqual(subArray[i - 3], _testObjects[i]);
+
+			PrintList();
+			
+			_testList.Clear();
+		}
+
+		[Test]
+		public void TestAddNew()
+		{
+			EditableList<EditableTestObject> list = new EditableList<EditableTestObject>();
+			bool collectionChangedFired = false;
+			list.CollectionChanged += delegate { collectionChangedFired = true; };
+
+			list.AddNew();
+			Assert.That(collectionChangedFired);
+			Assert.AreEqual(1, list.Count);
+			Assert.AreEqual(1, list.NewItems.Count);
+			Assert.AreEqual(0, list.DelItems.Count);
+
+			collectionChangedFired = false;
+			list.CancelNew(0);
+			Assert.That(collectionChangedFired);
+			Assert.IsEmpty(list);
+			Assert.IsEmpty(list.NewItems);
+			Assert.IsEmpty(list.DelItems);
+		}
+
+		[Test]
+		public void TestInsert()
+		{
+			Console.WriteLine("--- TestInsert ---");
+			_testList.Clear();
+			_testList.RemoveSort();
+
+			for (int i = 0; i < 3; i++)
+				_testList.Insert(0, _testObjects[i]);
+
+			Assert.AreEqual(_testList.Count, 3);
+			Assert.AreEqual(_testList[0], _testObjects[2]);
+			Assert.AreEqual(_testList[1], _testObjects[1]);
+			Assert.AreEqual(_testList[2], _testObjects[0]);
+
+			EditableTestObject[] _subArray = new EditableTestObject[3];
+
+			for (int i = 3; i < _testObjects.Length; i++)
+				_subArray[i-3] = _testObjects[i];
+
+			_testList.InsertRange(0, _subArray);
+			Assert.AreEqual(_testList.Count, 6);
+
+			Assert.AreEqual(_testList[0], _testObjects[3]);
+			Assert.AreEqual(_testList[1], _testObjects[4]);
+			Assert.AreEqual(_testList[2], _testObjects[5]);
+
+			PrintList();
+
+			_testList.Clear();
+		}
+		
+		[Test]
+		public void TestRemove()
+		{
+			Console.WriteLine("--- TestRemove ---");
+
+			_testList.Clear();
+			_testList.RemoveSort();
+			_testList.AddRange(_testObjects);
+			
+			_testList.RemoveAt(2);
+			Assert.AreEqual(_testList.Count, 5);
+			_testList.Remove(_testList[0]);
+			Assert.AreEqual(_testList.Count, 4);
+			_testList.Clear();
+			Assert.AreEqual(_testList.Count, 0);
+		}
+
+		[Test]
+		public void TestRemoveRange()
+		{
+			Console.WriteLine("--- TestRemoveRange ---");
+
+			_testList.Clear();
+			_testList.RemoveSort();
+			_testList.AcceptChanges();
+			_testList.AddRange(_testObjects);
+
+			Assert.AreEqual(6, _testList.Count);
+			Assert.AreEqual(6, _testList.NewItems.Count);
+			Assert.AreEqual(0, _testList.DelItems.Count);
+
+			_testList.RemoveRange(1, 3);
+
+			Assert.AreEqual(3, _testList.Count);
+			Assert.AreEqual(3, _testList.NewItems.Count);
+			Assert.AreEqual(0, _testList.DelItems.Count);
+			Assert.AreEqual(0, ((EditableTestObject)_testList[0]).ID);
+			Assert.AreEqual(4, ((EditableTestObject)_testList[1]).ID);
+
+			_testList.AcceptChanges();
+
+			Assert.AreEqual(3, _testList.Count);
+			Assert.AreEqual(0, _testList.NewItems.Count);
+			Assert.AreEqual(0, _testList.DelItems.Count);
+
+			_testList.RemoveRange(0, 1);
+
+			Assert.AreEqual(2, _testList.Count);
+			Assert.AreEqual(0, _testList.NewItems.Count);
+			Assert.AreEqual(1, _testList.DelItems.Count);
+			
+			_testList.Clear();
+
+			Assert.AreEqual(0, _testList.Count);
+			Assert.AreEqual(0, _testList.NewItems.Count);
+			Assert.AreEqual(3, _testList.DelItems.Count);
+			
+			_testList.AcceptChanges();
+
+			Assert.AreEqual(0, _testList.Count);
+			Assert.AreEqual(0, _testList.NewItems.Count);
+			Assert.AreEqual(0, _testList.DelItems.Count);
+		}
+
+		[Test]
+		public void TestSortedAdd()
+		{
+			Console.WriteLine("--- TestSortedAdd ---");
+			_testList.Clear();
+			_testList.RemoveSort();
+			_testList.ApplySort(_testList.GetItemProperties(null)["Seconds"], ListSortDirection.Descending);
+
+			for (int i = 0; i < 3; i++)
+				_testList.Add(_testObjects[i]);
+
+			Assert.AreEqual(_testList.Count, 3);
+			Assert.AreEqual(_testList[1], _testObjects[0]);
+			Assert.AreEqual(_testList[2], _testObjects[1]);
+			Assert.AreEqual(_testList[0], _testObjects[2]);
+
+			EditableTestObject[] _subArray = new EditableTestObject[3];
+
+			for (int i = 3; i < _testObjects.Length; i++)
+				_subArray[i-3] = _testObjects[i];
+
+			_testList.AddRange(_subArray);
+			Assert.AreEqual(_testList.Count, 6);
+
+			Assert.AreEqual(_testList[0], _testObjects[3]);
+			Assert.AreEqual(_testList[2], _testObjects[4]);
+			Assert.AreEqual(_testList[3], _testObjects[5]);
+
+			PrintList();
+
+			_testList.Clear();
+			Assert.AreEqual(_testList.Count, 0);
+
+			_testList.ApplySort(_testList.GetItemProperties(null)["Seconds"], ListSortDirection.Ascending);
+
+			for (int i = 0; i < 3; i++)
+				_testList.Add(_testObjects[i]);
+
+			Assert.AreEqual(_testList.Count, 3);
+			Assert.AreEqual(_testList[1], _testObjects[0]);
+			Assert.AreEqual(_testList[0], _testObjects[1]);
+			Assert.AreEqual(_testList[2], _testObjects[2]);
+
+			_testList.AddRange(_subArray);
+			Assert.AreEqual(_testList.Count, 6);
+
+			Assert.AreEqual(_testList[5], _testObjects[3]);
+			Assert.AreEqual(_testList[3], _testObjects[4]);
+			Assert.AreEqual(_testList[2], _testObjects[5]);
+
+			PrintList();
+
+			_testList.Clear();
+		}
+		
+		[Test]
+		public void TestSortedInsert()
+		{
+			Console.WriteLine("--- TestSortedInsert ---");
+			_testList.Clear();
+			_testList.RemoveSort();
+			_testList.ApplySort(_testList.GetItemProperties(null)["Seconds"], ListSortDirection.Descending);
+
+			for (int i = 0; i < 3; i++)
+				_testList.Insert(0, _testObjects[i]);
+
+			Assert.AreEqual(_testList.Count, 3);
+			Assert.AreEqual(_testList[0], _testObjects[2]);
+			Assert.AreEqual(_testList[1], _testObjects[0]);
+			Assert.AreEqual(_testList[2], _testObjects[1]);
+
+			EditableTestObject[] _subArray = new EditableTestObject[3];
+
+			for (int i = 3; i < _testObjects.Length; i++)
+				_subArray[i-3] = _testObjects[i];
+
+			_testList.InsertRange(0, _subArray);
+			Assert.AreEqual(_testList.Count, 6);
+
+			Assert.AreEqual(_testList[0], _testObjects[3]);
+			Assert.AreEqual(_testList[2], _testObjects[4]);
+			Assert.AreEqual(_testList[3], _testObjects[5]);
+
+			PrintList();
+
+			_testList.Clear();
+			Assert.AreEqual(_testList.Count, 0);
+
+			_testList.ApplySort(_testList.GetItemProperties(null)["Seconds"], ListSortDirection.Ascending);
+
+			for (int i = 0; i < 3; i++)
+				_testList.Insert(0, _testObjects[i]);
+
+			Assert.AreEqual(_testList.Count, 3);
+			Assert.AreEqual(_testList[0], _testObjects[1]);
+			Assert.AreEqual(_testList[1], _testObjects[0]);
+			Assert.AreEqual(_testList[2], _testObjects[2]);
+
+			_testList.InsertRange(0, _subArray);
+			Assert.AreEqual(_testList.Count, 6);
+
+			Assert.AreEqual(_testList[2], _testObjects[5]);
+			Assert.AreEqual(_testList[3], _testObjects[4]);
+			Assert.AreEqual(_testList[5], _testObjects[3]);
+
+			PrintList();
+
+			_testList.Clear();
+		}
+		
+		[Test]
+		public void TestSortedPropertyChange()
+		{
+			Console.WriteLine("--- TestSortedPropertyChange ---");
+			_testList.Clear();
+			_testList.RemoveSort();
+			_testList.ApplySort(_testList.GetItemProperties(null)["Seconds"], ListSortDirection.Descending);
+			_testList.AddRange(_testObjects);
+
+			EditableTestObject eto = EditableTestObject.CreateInstance(6, "Dummy", 10);
+
+			_testList.Add(eto);
+			Assert.AreEqual(_testList.Count, 7);
+			Assert.AreEqual(_testList[6], eto);
+
+			eto.Seconds = 20;
+			Assert.AreEqual(_testList[6], eto);
+
+			eto.Seconds = 23;
+			Assert.AreEqual(_testList[5], eto);
+
+			eto.Seconds = 30;
+			Assert.AreEqual(_testList[4], eto);
+
+			eto.Seconds = 40;
+			Assert.AreEqual(_testList[2], eto);
+
+			eto.Seconds = 50;
+			Assert.AreEqual(_testList[1], eto);
+
+			eto.Seconds = 60;
+			Assert.AreEqual(_testList[0], eto);
+		}
+		
+		private void PrintList()
+		{
+			Console.WriteLine("--- Print List ---");
+			foreach (EditableTestObject o in _testList)
+				Console.WriteLine(o);
+		}
+
+		[Test]
+		public void SerializationTest()
+		{
+			//Configuration.NotifyOnEqualSet = true;
+
+			SerializableObject test = TypeAccessor<SerializableObject>.CreateInstance();
+
+			MemoryStream    stream = new MemoryStream();
+			BinaryFormatter bf     = new BinaryFormatter();
+
+			bf.Serialize(stream, test);
+
+			//Configuration.NotifyOnChangesOnly = false;
+		}
+
+		//////[Test] Resharpe 8 issue
+		public void SerializationTest2()
+		{
+			//Configuration.NotifyOnChangesOnly = true;
+
+			EditableList<SerializableObject> list = new EditableList<SerializableObject>();
+
+			list.Add(TypeAccessor<SerializableObject>.CreateInstance());
+
+			BinaryFormatter formatter = new BinaryFormatter();
+
+			using (MemoryStream stream = new MemoryStream())
+			{
+				formatter.Serialize(stream, list);
+				stream.Position = 0;
+
+				object result = formatter.Deserialize(stream);
+
+				Assert.IsNotNull(result);
+
+				EditableList<SerializableObject> eal = (EditableList<SerializableObject>)result;
+
+				Console.WriteLine(eal.Count);
+
+				eal.CollectionChanged += eal_CollectionChanged;
+
+				eal[0].ID = 0;
+				_notificationCount = 0;
+				eal[0].ID = -100;
+				eal[0].ID = -100;
+				eal[0].ID = -100;
+				eal[0].ID = -100;
+				eal[0].ID = -100;
+				eal[0].ID = -100;
+
+				Console.WriteLine(eal.Count);
+
+				//Assert.AreEqual(_notificationCount, 1);
+			}
+
+			//Configuration.NotifyOnChangesOnly = false;
+		}
+
+		private static int _notificationCount = 0;
+
+		static void eal_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
+		{
+			Console.WriteLine(e.Action);
+			_notificationCount++;
+		}
+
+		[Test]
+		public void SortTest()
+		{
+			EditableList<EditableTestObject> dataList = new EditableList<EditableTestObject>();
+
+			dataList.Add(EditableTestObject.CreateInstance(1, "John", 60));
+			dataList.Add(EditableTestObject.CreateInstance(1, "John", 60));
+			dataList.Add(EditableTestObject.CreateInstance(1, "John", 60));
+			dataList.Add(EditableTestObject.CreateInstance(2, "Tester", 70));
+			dataList.Add(EditableTestObject.CreateInstance(2, "Tester", 70));
+			dataList.Add(EditableTestObject.CreateInstance(2, "Tester", 70));
+			dataList.Add(EditableTestObject.CreateInstance(3, "Tester", 70));
+			dataList.Add(EditableTestObject.CreateInstance(3, "Tester", 70));
+			dataList.Add(EditableTestObject.CreateInstance(3, "Tester", 70));
+
+			BindingSource bindingSource = new BindingSource(dataList, null);
+			bindingSource.Sort = "ID";
+
+			int prev = 0;
+			foreach (EditableTestObject o in dataList)
+			{
+				Assert.IsTrue(o.ID >= prev);
+				prev = o.ID;
+			}
+
+			bindingSource[0] = EditableTestObject.CreateInstance(2, "John", 60);
+
+			prev = 0;
+			foreach (EditableTestObject o in dataList)
+			{
+				Assert.IsTrue(o.ID >= prev);
+				prev = o.ID;
+			}
+		}
+
+		public class DerivedEditableList<T> : EditableList<T>
+		{
+			public event EventHandler OnListChangedCalled;
+
+			protected void OnOnListChangedCalled()
+			{
+				if (OnListChangedCalled != null)
+					OnListChangedCalled(this, EventArgs.Empty);
+			}
+
+			protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
+			{
+				OnOnListChangedCalled();
+				base.OnCollectionChanged(e);
+			}
+		}
+
+
+		[Test]
+		public void DerivedOnListChanged()
+		{
+			bool called = false;
+
+			DerivedEditableList<int> list = new DerivedEditableList<int>();
+			list.OnListChangedCalled += delegate
+			{
+				called = true;
+			};
+
+			list.Add(1);
+
+			Assert.IsTrue(called);
+			Assert.AreEqual(1, list.NewItems.Count);
+			Assert.AreEqual(1, list.Count);
+			Assert.AreEqual(0, list.DelItems.Count);
+
+			called = false;
+			list.RemoveAt(0);
+
+			Assert.IsTrue(called);
+			Assert.AreEqual(0, list.NewItems.Count);
+			Assert.AreEqual(0, list.Count);
+			Assert.AreEqual(0, list.DelItems.Count);
+		}
+
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/EditableObjects/NotifyPropertyChangedTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,58 @@
+using System;
+using System.ComponentModel;
+using System.Reflection;
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+using NUnit.Framework;
+
+namespace EditableObjects
+{
+	[TestFixture]
+	public class NotifyPropertyChangedTest
+	{
+		[PropertyChanged]
+		public abstract class ObservableObject : INotifyPropertyChanged, IPropertyChanged
+		{
+			#region Implementation of IPropertyChanged
+
+			public event PropertyChangedEventHandler PropertyChanged;
+
+			#endregion
+
+			public abstract int ID { get; set; }
+			public abstract string Name { get; set; }
+			public abstract int Seconds { get; set; }
+
+			public static ObservableObject CreateInstance()
+			{
+				return TypeAccessor<ObservableObject>.CreateInstance();
+			}
+
+			#region Implementation of IPropertyChanged
+
+			void IPropertyChanged.OnPropertyChanged(PropertyInfo propertyInfo)
+			{
+				OnPropertyChanged(propertyInfo.Name);
+			}
+
+			#endregion
+
+			protected internal virtual void OnPropertyChanged(string propertyName)
+			{
+				if (PropertyChanged != null)
+					PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+
+		[Test]
+		public void TestPropertyChangedFired()
+		{
+			ObservableObject obj = ObservableObject.CreateInstance();
+			bool propertyChangedFired = false;
+			obj.PropertyChanged += delegate { propertyChangedFired = true; };
+
+			obj.Name = "this should fire PropertyChanged event";
+			Assert.That(propertyChangedFired);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/JointureTests/Artist.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace UnitTests.CS.JointureTests
+{
+    [TableName(Name = "ARTIST", Owner = Consts.Owner)]
+    public class Artist
+    {
+        [MapField("ID_ARTIST"), PrimaryKey, NonUpdatable]
+        public long Id { get; set; }
+
+        [MapField("ARTIST")]
+        public string Name { get; set; }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/JointureTests/Artist2.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,21 @@
+using System.Collections.Generic;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+using BLToolkit.TypeBuilder;
+
+namespace UnitTests.CS.JointureTests
+{
+    [TableName(Name = "ARTIST", Owner = Consts.Owner)]
+    public class Artist2
+    {
+        [MapField("ID_ARTIST"), PrimaryKey, NonUpdatable]
+        public long Id { get; set; }
+
+        [MapField("ARTIST")]
+        public string Name { get; set; }
+
+        [LazyInstance(true)]
+        [Association(ThisKey = "Id", OtherKey = "ArtistID", CanBeNull = false)]
+        public virtual List<Title> Titles { get; set; }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/JointureTests/AssociationTests.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,102 @@
+using System.Collections.Generic;
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+using NUnit.Framework;
+
+namespace UnitTests.CS.JointureTests
+{
+    //[TestFixture]
+    internal class AssociationTests
+    {
+        [TestFixtureSetUp]
+        public void Setup()
+        {
+            DataProviderBase provider = new OdpDataProvider();
+            DbManager.AddDataProvider(provider);
+            DbManager.AddConnectionString(provider.Name,
+                                          string.Format(
+                                              "data source={0};User Id={1};Password={2};Incr Pool Size=1;Max Pool Size=3; Connection Timeout=15; pooling=false",
+                                              "MUSICFR01.TEST", "scurutchet", "kisscool12"));
+        }
+
+        //[Test]
+        public void SelectAllArtistsIgnoreLazyLoading()
+        {
+            using (var db = new MusicDB())
+            {
+                var query2  = new FullSqlQuery(db, true); //loading is automatic
+                var artist2 = (Artist2) query2.SelectByKey(typeof (Artist2), 2643);
+                var titles2 = artist2.Titles;
+
+                var query  = new FullSqlQuery(db); // Dont ignore lazyloading
+                var artist = (Artist2) query.SelectByKey(typeof (Artist2), 2643);
+                var titles = artist.Titles;
+                Assert.AreEqual(titles2.Count, titles.Count);
+            }
+        }
+
+        //[Test]
+        public void SelectAllArtistsLazyLoading()
+        {
+//            using (var db = new MusicDB())
+//            {
+//                var dbCmd = db.SetCommand("SELECT ID_ARTIST FROM PITAFR01.Artist where date_creation > sysdate - 200");
+//
+//                dbCmd.MappingSchema = new FullMappingSchema();
+//
+//                var art     = dbCmd.ExecuteList<Artist2>();
+//                var titles  = art[0].Titles;
+//                var query2  = new FullSqlQueryT<Artist2>(db);
+//                var artists = query2.SelectAll();
+//                var artist2 = artists[0];
+//                var titles2 = artist2.Titles;
+//            }
+        }
+
+        //[Test]
+        public void SelectAllTitlesFull()
+        {
+            using (var db = new MusicDB())
+            {
+                var query = new FullSqlQueryT<Title>(db);
+                var titles1 = query.SelectAll<List<Title>>();
+                List<Title> titles2 = query.SelectAll();
+            }
+        }
+
+        //[Test]
+        public void SelectAllTitlesFull2()
+        {
+            using (var db = new MusicDB())
+            {
+                var query2 = new FullSqlQuery(db);
+                var titles = query2.SelectAll<Title>();
+                var title  = (Title) query2.SelectByKey(typeof (Title), 137653);
+            }
+        }
+
+        //[Test]
+        public void SelectArtistFullWithLazyLoadingTitles()
+        {
+            using (var db = new MusicDB())
+            {
+                var query2 = new FullSqlQueryT<Artist2>(db);
+                var artist = query2.SelectByKey(2643);
+                var titles = artist.Titles;
+            }
+        }
+
+        //[Test]
+        public void SelectTitleFull()
+        {
+            using (var db = new MusicDB())
+            {
+                var query2    = new FullSqlQueryT<Title>(db);
+                var title     = query2.SelectByKey(137653);
+                var titleName = title.Name;
+            }
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/JointureTests/Consts.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,7 @@
+namespace UnitTests.CS.JointureTests
+{
+    public static class Consts
+    {
+        public const string Owner = "PITAFR01";
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/JointureTests/MusicDB.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,11 @@
+using BLToolkit.Data;
+using BLToolkit.Data.Linq;
+
+namespace UnitTests.CS.JointureTests
+{
+    public class MusicDB : DbManager
+    {
+        public Table<Title> Title { get { return GetTable<Title>(); } }
+        public Table<Artist2> Artist2 { get { return GetTable<Artist2>(); } }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/JointureTests/Title.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,21 @@
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace UnitTests.CS.JointureTests
+{
+    [TableName(Name = "TRACK", Owner = Consts.Owner)]
+    public class Title
+    {
+        [MapField("ID_TRACK"), PrimaryKey, NonUpdatable]
+        public long Id { get; set; }
+
+        [MapField("TRACK")]
+        public string Name { get; set; }
+
+        [MapField("ID_ARTIST")]
+        public long? ArtistID { get; set; }
+
+        [Association(ThisKey = "ArtistID", OtherKey = "Id", CanBeNull = false)]
+        public Artist Artist { get; set; }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Mapping/BltMapTests.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,115 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+
+using NUnit.Framework;
+
+namespace Mapping
+{
+	[TestFixture]
+	public class BltMapTests
+	{
+		#region Types
+
+		public class TestStep
+		{
+			public string Step { get; set; }
+		}
+
+		internal class Test_Int
+		{
+			private BindingList<TestStep> _steps;
+
+			public Test_Int()
+			{
+				InitializeStepsList();
+			}
+
+			public bool NotNullSetterCalled = false;
+
+			private void InitializeStepsList(IList<TestStep> init = null)
+			{
+				_steps = new BindingList<TestStep>(init ?? new List<TestStep>());
+				if (init != null) NotNullSetterCalled = true;
+			}
+
+			[MapField(Storage = "Steps")]
+			public IList<TestStep> Steps
+			{
+				get { return _steps; }
+				private set { InitializeStepsList(value); }
+			}
+		}
+
+		public class Test_Pub
+		{
+			private BindingList<TestStep> _steps;
+
+			public Test_Pub()
+			{
+				InitializeStepsList();
+			}
+
+			public bool NotNullSetterCalled = false;
+
+			private void InitializeStepsList(IList<TestStep> init = null)
+			{
+				_steps = new BindingList<TestStep>(init ?? new List<TestStep>());
+				if (init != null) NotNullSetterCalled = true;
+			}
+
+			[MapField(Storage = "Steps")]
+			public IList<TestStep> Steps
+			{
+				get { return _steps; }
+				private set { InitializeStepsList(value); }
+			}
+		}
+
+		public class TestStepRecord
+		{
+			public string Step { get; set; }
+		}
+
+		public class TestRecord
+		{
+			//[MapField]
+			public List<TestStepRecord> Steps;
+		}
+
+		#endregion
+
+		[Test]
+		public void TestExpressionMapper_Int()
+		{
+			//Arrange
+			var em = new ExpressionMapper<TestRecord, Test_Int>();
+			var tr = new TestRecord { Steps = new List<TestStepRecord> { new TestStepRecord {Step = "Test" } } };
+
+			//Act
+			var t = em.GetMapper()(tr);
+
+			//Assert
+			Assert.IsTrue(t.Steps.Count == 1);
+			Assert.IsTrue(t.NotNullSetterCalled);
+		}
+
+		[Test]
+		public void TestExpressionMapper_Pub()
+		{
+			//Arrange
+			var em = new ExpressionMapper<TestRecord, Test_Pub>();
+			var tr = new TestRecord { Steps = new List<TestStepRecord> { new TestStepRecord { Step = "Test" } } };
+
+			//Act
+			var t = em.GetMapper()(tr);
+
+			//Assert
+			Assert.IsTrue(t.Steps.Count == 1);
+			Assert.IsTrue(t.NotNullSetterCalled);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Mapping/DefaultValueAttributeTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,114 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Mapping;
+
+namespace Mapping
+{
+	[TestFixture]
+	public class DefaultValueAttributeTest
+	{
+		[MapValue(Enum1.Value1, "1")]
+		[MapValue(Enum1.Value3, "3")]
+		[DefaultValue(Enum1.Value3)]
+		public enum Enum1
+		{
+			Value1,
+			[MapValue("2")] Value2,
+			Value3
+		}
+
+		public class Object1
+		{
+			public Enum1 Enum1;
+			[DefaultValue(Enum1.Value1)]
+			public Enum1 Enum2;
+		}
+
+		[Test]
+		public void TestEnum1()
+		{
+			ObjectMapper om = Map.GetObjectMapper(typeof(Object1));
+
+			Object1 o = (Object1)om.CreateInstance();
+
+			om.SetValue(o, "Enum1", "55");
+			om.SetValue(o, "Enum2", "66");
+
+			Assert.AreEqual(Enum1.Value3, o.Enum1);
+			Assert.AreEqual(Enum1.Value1, o.Enum2);
+
+			Assert.AreEqual("3",  om.GetValue(o, "Enum1"));
+			Assert.AreEqual("1",  om.GetValue(o, "Enum2"));
+		}
+
+		[MapValue(Enum2.Value1, "1")]
+		[MapValue(Enum2.Value3, "3")]
+		public enum Enum2
+		{
+			Value1,
+			[MapValue("2")] Value2,
+			[DefaultValue]  Value3
+		}
+
+		public class Object2
+		{
+			public Enum2 Enum1;
+		}
+
+		[Test]
+		public void TestEnum2()
+		{
+			ObjectMapper om = Map.GetObjectMapper(typeof(Object2));
+
+			Object2 o = (Object2)om.CreateInstance();
+
+			om.SetValue(o, "Enum1", "55");
+
+			Assert.AreEqual(Enum2.Value3, o.Enum1);
+
+			Assert.AreEqual("3",  om.GetValue(o, "Enum1"));
+		}
+
+		[DefaultValue(typeof(Enum2), Enum2.Value2)]
+		public class Object3
+		{
+			public Enum2 Enum1;
+		}
+
+		[Test]
+		public void TestEnum3()
+		{
+			ObjectMapper om = Map.GetObjectMapper(typeof(Object3));
+
+			Object3 o = (Object3)om.CreateInstance();
+
+			om.SetValue(o, "Enum1", "55");
+
+			Assert.AreEqual(Enum2.Value2, o.Enum1);
+
+			Assert.AreEqual("2",  om.GetValue(o, "Enum1"));
+		}
+
+		[DefaultValue(Enum2.Value2)]
+		public class Object4
+		{
+			public Enum2 Enum1;
+		}
+
+		[Test]
+		public void TestEnum4()
+		{
+			ObjectMapper om = Map.GetObjectMapper(typeof(Object4));
+
+			Object4 o = (Object4)om.CreateInstance();
+
+			om.SetValue(o, "Enum1", "55");
+
+			Assert.AreEqual(Enum2.Value2, o.Enum1);
+
+			Assert.AreEqual("2",  om.GetValue(o, "Enum1"));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Mapping/EnumExtension.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,78 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Mapping;
+using BLToolkit.Reflection.Extension;
+
+namespace Mapping
+{
+	[TestFixture]
+	public class EnumExtension
+	{
+		public enum CountryCodeEnum
+		{
+			AF,
+			AL,
+			DZ,
+			AS,
+			AD
+		}
+
+		public enum OtherEnum
+		{
+			EnumValue1,
+			EnumValue2
+		}
+
+		[Test]
+		public void Test1()
+		{
+			Map.Extensions = TypeExtension.GetExtensions("Map.xml");
+
+			Assert.AreEqual("AL", Map.EnumToValue(CountryCodeEnum.AL));
+			Assert.AreEqual(101,  Map.EnumToValue(OtherEnum.EnumValue2));
+		}
+
+		public class TestObj
+		{
+			[MapField("country_code")] public CountryCodeEnum1 Country { get; set; }
+			[MapField("other")]        public OtherEnum1       Other   { get; set; }
+		}
+
+		public enum CountryCodeEnum1
+		{
+			[MapValue("AFA")] AF,
+			[MapValue("ALA")] AL,
+			[MapValue("DZA")] DZ,
+			[MapValue("ASA")] AS,
+			[MapValue("ADA")] AD
+		}
+
+		public enum OtherEnum1
+		{
+			[MapValue("v1")] EnumValue1,
+			[MapValue("v2")] EnumValue2
+		}
+
+		[Test]
+		public void EnumToValueTest()
+		{
+			Map.Extensions = TypeExtension.GetExtensions("Map.xml");
+
+			Assert.AreEqual("AL", Map.EnumToValue(CountryCodeEnum1.AL));
+			Assert.AreEqual(101,  Map.EnumToValue(OtherEnum1.EnumValue2));
+		}
+
+		//[Test]
+		public void ObjToDicTest()
+		{
+			var obj  = new TestObj { Country = CountryCodeEnum1.DZ, Other = OtherEnum1.EnumValue2 };
+			var sh   = new MappingSchema { Extensions = TypeExtension.GetExtensions("Map.xml") };
+			var pars = sh.MapObjectToDictionary(obj);
+
+			Assert.AreEqual("DZ", pars["country_code"]);
+			Assert.AreEqual(101,  pars["other"]);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Mapping/ExpressionMapperTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,444 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+
+using NUnit.Framework;
+
+using BLToolkit.Common;
+using BLToolkit.Mapping;
+
+namespace Mapping
+{
+	[TestFixture]
+	public class ExpressionMapperTest
+	{
+		[Test]
+		public void MapIntToString()
+		{
+			var mapper = Map.GetObjectMapper<int,string>();
+			var dest   = mapper(42);
+
+			Assert.AreEqual("42", dest);
+		}
+
+		[Test]
+		public void MapStringToInt()
+		{
+			var mapper = Map.GetObjectMapper<string,int>();
+			var dest   = mapper("42");
+
+			Assert.AreEqual(42, dest);
+		}
+
+		[Test]
+		public void MapGenderToString()
+		{
+			var mapper = Map.GetObjectMapper<Gender,string>();
+			var dest   = mapper(Gender.Male);
+
+			Assert.AreEqual("M", dest);
+		}
+
+		[Test]
+		public void MapStringToGender()
+		{
+			var mapper = Map.GetObjectMapper<string,Gender>();
+			var dest   = mapper("M");
+
+			Assert.AreEqual(Gender.Male, dest);
+		}
+
+		public enum Gender
+		{
+			[MapValue("F")] Female,
+			[MapValue("M")] Male,
+			[MapValue("U")] Unknown,
+			[MapValue("O")] Other
+		}
+
+		public enum Enum1
+		{
+			Value1 = 10,
+			Value2,
+			Value3,
+			Value4,
+		}
+
+		public enum Enum2
+		{
+			Value1,
+			Value2 = 10,
+			Value3,
+			Value4,
+		}
+
+		public class Dest
+		{
+			                     public int    Field1;
+			[MapField("Field2")] public float  Field3;
+			                     public int    Field4;
+			                     public int?   Field6;
+			                     public int    Field7;
+			                     public int    Field8;
+			                     public int    Field9;
+			                     public string Field10;
+			                     public int    Field11;
+			[NullValue(12)]      public int    Field12;
+			[NullValue(13)]      public int    Field13;
+			[NullValue(14)]      public int    Field14;
+			                     public Gender Field15;
+			                     public string Field16;
+			                     public Enum2  Field17;
+		}
+
+		public class Source
+		{
+			                     public int      Field1  = 1;
+			                     public int      Field2  = 2;
+			[MapField("Field4")] public float    Field5  = 5;
+			                     public int      Field6  = 6;
+			                     public int?     Field7  = 7;
+			                     public int?     Field8;
+			                     public decimal? Field9  = 9m;
+			                     public int      Field10 = 10;
+			                     public string   Field11 = "11";
+			                     public string   Field12 { get; set; }
+			                     public int?     Field13;
+			                     public decimal? Field14;
+			                     public string   Field15 = "F";
+			                     public Gender   Field16 = Gender.Male;
+			                     public Enum1    Field17 = Enum1.Value1;
+		}
+
+		void Clone(Expression<Func<Source,Dest>> mapper)
+		{
+		/*
+		 Expression.Lambda<Func<Source, Dest>>(
+			Expression.MemberInit(
+				Expression.New((ConstructorInfo) methodof(Dest..ctor), new Expression[0]),
+				new MemberBinding[]
+				{
+					Expression.Bind(
+						fieldof(Dest.Field1),
+						Expression.Field(CS$0$0000 = Expression.Parameter(typeof(Source), "s"), fieldof(Source.Field1))),
+					Expression.Bind(
+						fieldof(Dest.Field2),
+						Expression.Convert(Expression.Field(CS$0$0000, fieldof(Source.Field2)), typeof(float)))
+					}), new ParameterExpression[] { CS$0$0000 });
+		*/
+		}
+
+		[Test]
+		public void MapObjects()
+		{
+			var c = Convert<float,int>.From;
+
+			//Clone(s => new Dest { Field1 = s.Field1, Field10 = s.Field10.ToString() });
+
+			//Map.ObjectToObject(new Source(), typeof(Dest));
+
+			var mapper = Map.GetObjectMapper<Source,Dest>();
+			var src    = new Source();
+			var dest   = mapper(src);
+
+			Assert.AreEqual(1,                      dest.Field1);
+			Assert.AreEqual(2,                      dest.Field3);
+			Assert.AreEqual(src.Field5,             dest.Field4);
+			Assert.AreEqual(src.Field6,             dest.Field6.Value);
+			Assert.AreEqual(src.Field7.Value,       dest.Field7);
+			Assert.AreEqual(src.Field8 ?? 0,        dest.Field8);
+			Assert.AreEqual(src.Field9 ?? 0,        dest.Field9);
+			Assert.AreEqual(src.Field10.ToString(), dest.Field10);
+			Assert.AreEqual(src.Field11,            dest.Field11.ToString());
+			Assert.AreEqual(12,                     dest.Field12);
+			Assert.AreEqual(13,                     dest.Field13);
+			Assert.AreEqual(14,                     dest.Field14);
+			Assert.AreEqual(Gender.Female,          dest.Field15);
+			Assert.AreEqual("M",                    dest.Field16);
+			Assert.AreEqual(Enum2.Value2,           dest.Field17);
+		}
+
+		[Test]
+		public void MapObject()
+		{
+			var mapper = Map.GetObjectMapper<Source,Source>();
+			var src    = new Source();
+			var dest   = mapper(src);
+
+			Assert.AreNotSame(src,         dest);
+			Assert.AreEqual  (src.Field1,  dest.Field1);
+			Assert.AreEqual  (src.Field2,  dest.Field2);
+			Assert.AreEqual  (src.Field5,  dest.Field5);
+			Assert.AreEqual  (src.Field6,  dest.Field6);
+			Assert.AreEqual  (src.Field7,  dest.Field7);
+			Assert.AreEqual  (src.Field8,  dest.Field8);
+			Assert.AreEqual  (src.Field9,  dest.Field9);
+			Assert.AreEqual  (src.Field10, dest.Field10);
+			Assert.AreEqual  (src.Field11, dest.Field11);
+			Assert.AreEqual  (src.Field12, dest.Field12);
+			Assert.AreEqual  (src.Field13, dest.Field13);
+			Assert.AreEqual  (src.Field14, dest.Field14);
+			Assert.AreEqual  (src.Field15, dest.Field15);
+			Assert.AreEqual  (src.Field16, dest.Field16);
+			Assert.AreEqual  (src.Field17, dest.Field17);
+		}
+
+		class Class1 { public int Field = 1; }
+		class Class2 { public int Field = 2; }
+		class Class3 { public Class1 Class = new Class1(); }
+		class Class4 { public Class2 Class = new Class2(); }
+
+		[Test]
+		public void MapInnerObject1()
+		{
+			var mapper = Map.GetObjectMapper<Class3,Class4>();
+			var src    = new Class3();
+			var dest   = mapper(src);
+
+			Assert.AreEqual(src.Class.Field, dest.Class.Field);
+		}
+
+		class Class5 { public Class1 Class1 = new Class1(); public Class1 Class2; }
+		class Class6 { public Class2 Class1 = new Class2(); public Class2 Class2 = null; }
+
+		[Test]
+		public void MapInnerObject2()
+		{
+			var mapper = Map.GetObjectMapper<Class5,Class6>();
+			var src    = new Class5();
+
+			src.Class2 = src.Class1;
+
+			var dest = mapper(src);
+
+			Assert.IsNotNull(dest.Class1);
+			Assert.AreSame(dest.Class1, dest.Class2);
+		}
+
+		class Class7  { public Class9  Class; }
+		class Class8  { public Class10 Class = null; }
+		class Class9  { public Class7  Class = new Class7(); }
+		class Class10 { public Class8  Class = new Class8(); }
+
+		[Test]
+		public void SelfReference1()
+		{
+			var mapper = Map.GetObjectMapper<Class9,Class10>();
+			var src    = new Class9();
+
+			src.Class.Class = src;
+
+			var dest = mapper(src);
+
+			Assert.AreSame(dest, dest.Class.Class);
+		}
+
+		class Class11 { public Class9  Class = new Class9();  }
+		class Class12 { public Class10 Class = new Class10(); }
+
+		[Test]
+		public void SelfReference2()
+		{
+			var mapper = Map.GetObjectMapper<Class11,Class12>();
+			var src    = new Class11();
+
+			src.Class.Class.Class = src.Class;
+
+			var dest = mapper(src);
+
+			Assert.AreSame(dest.Class, dest.Class.Class.Class);
+		}
+
+		class Class13 { public Class1 Class = new Class1();  }
+		class Class14 { public Class1 Class = new Class1();  }
+
+		[Test]
+		public void DeepCopy1()
+		{
+			var mapper = Map.GetObjectMapper<Class13,Class14>();
+			var src    = new Class13();
+
+			var dest = mapper(src);
+
+			Assert.AreNotSame(src.Class, dest.Class);
+		}
+
+		[Test]
+		public void DeepCopy2()
+		{
+			var mapper = Map.GetObjectMapper<Class13,Class14>(false);
+			var src    = new Class13();
+
+			var dest = mapper(src);
+
+			Assert.AreSame(src.Class, dest.Class);
+		}
+
+		class Class15 { public List<Class1> List = new List<Class1> { new Class1(), new Class1() }; }
+		class Class16 { public List<Class2> List = null; }
+
+		[Test]
+		public void ObjectList()
+		{
+			var mapper = Map.GetObjectMapper<Class15,Class16>();
+			var src    = new Class15();
+
+			src.List.Add(src.List[0]);
+
+			var dest = mapper(src);
+
+			Assert.AreEqual  (3, dest.List.Count);
+			Assert.IsNotNull (dest.List[0]);
+			Assert.IsNotNull (dest.List[1]);
+			Assert.IsNotNull (dest.List[2]);
+			Assert.AreNotSame(dest.List[0], dest.List[1]);
+			Assert.AreSame   (dest.List[0], dest.List[2]);
+		}
+
+		[Test]
+		public void ScalarList()
+		{
+			var mapper = Map.GetObjectMapper<List<int>,IList<string>>();
+			var dest = mapper(new List<int> { 1, 2, 3});
+
+			Assert.AreEqual("1", dest[0]);
+			Assert.AreEqual("2", dest[1]);
+			Assert.AreEqual("3", dest[2]);
+		}
+
+		[Test]
+		public void ScalarArray()
+		{
+			var mapper = Map.GetObjectMapper<int[],string[]>();
+			var dest = mapper(new[] { 1, 2, 3});
+
+			Assert.AreEqual("1", dest[0]);
+			Assert.AreEqual("2", dest[1]);
+			Assert.AreEqual("3", dest[2]);
+		}
+
+		class Class17
+		{
+			public IEnumerable<Class9> Arr { get { return GetEnumerable(); }}
+
+			static IEnumerable<Class9> GetEnumerable()
+			{
+				var c = new Class9();
+
+				yield return c;
+				yield return new Class9();
+				yield return c;
+			}
+		}
+
+		class Class18 { public Class9[] Arr = null; }
+
+		[Test]
+		public void ObjectArray1()
+		{
+			var mapper = Map.GetObjectMapper<Class17,Class18>();
+			var dest = mapper(new Class17());
+
+			Assert.AreEqual  (3, dest.Arr.Length);
+			Assert.IsNotNull (dest.Arr[0]);
+			Assert.IsNotNull (dest.Arr[1]);
+			Assert.IsNotNull (dest.Arr[2]);
+			Assert.AreNotSame(dest.Arr[0], dest.Arr[1]);
+			Assert.AreSame   (dest.Arr[0], dest.Arr[2]);
+		}
+
+		class Class19
+		{
+			public Class9[] Arr { get { return new Class17().Arr.ToArray();  }}
+		}
+
+		[Test]
+		public void ObjectArray2()
+		{
+			var mapper = Map.GetObjectMapper<Class19,Class18>();
+			var dest = mapper(new Class19());
+
+			Assert.AreEqual  (3, dest.Arr.Length);
+			Assert.IsNotNull (dest.Arr[0]);
+			Assert.IsNotNull (dest.Arr[1]);
+			Assert.IsNotNull (dest.Arr[2]);
+			Assert.AreNotSame(dest.Arr[0], dest.Arr[1]);
+			Assert.AreSame   (dest.Arr[0], dest.Arr[2]);
+		}
+
+		class Class20 { public Source Class1 = new Source(); public Source Class2; }
+		class Class21 { public Dest   Class1 = null;         public Dest   Class2 = null; }
+
+		[Test]
+		public void NoCrossRef()
+		{
+			var mapper = new ExpressionMapper<Class20,Class21> { HandleBackReferences = false }.GetMapper();
+			var source = new Class20();
+
+			source.Class2 = source.Class1;
+
+			var dest = mapper(source);
+
+			Assert.IsNotNull (dest.Class1);
+			Assert.IsNotNull (dest.Class2);
+			Assert.AreNotSame(dest.Class1, dest.Class2);
+		}
+
+		class Object1
+		{
+			public int Field1;
+			[ExpressionMapIgnore]
+			public int Field2;
+		}
+
+		class Object2
+		{
+			public int Field1;
+			public int Field2;
+		}
+
+		[Test]
+		public void ExpressionMapIgnoreTest()
+		{
+			var mapper1  = Map.GetObjectMapper<Object1,Object2>();
+			var object2 = mapper1(new Object1 { Field1 = 1, Field2 = 2 });
+
+			Assert.That(object2.Field2, Is.Not.EqualTo(2));
+
+			var mapper2 = Map.GetObjectMapper<Object2,Object1>();
+			var object1 = mapper2(new Object2 { Field1 = 1, Field2 = 2 });
+
+			Assert.That(object1.Field2, Is.Not.EqualTo(2));
+		}
+
+		[MapField("SomethingColumnInDB", "MyInnerClass.Something")]
+		class MyClass
+		{
+			public int          ID;
+			public string       Name;
+			public MyInnerClass MyInnerClass;
+		}
+
+		class MyInnerClass
+		{
+			public string Something;
+		}
+
+		[Test]
+		public void MapFieldTest()
+		{
+			var entity = new MyClass 
+			{ 
+				ID           = 1,
+				Name         = "Test",
+				MyInnerClass = new MyInnerClass { Something = "Something" } 
+			};
+
+			var mapper = Map.GetObjectMapper<MyClass,MyClass>(true, true);
+			var clone = mapper(entity);
+
+			Assert.That(clone.MyInnerClass, Is.Not.Null);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Mapping/ISupportMappingTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,134 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+
+namespace Mapping
+{
+	[TestFixture, Category("Mapping")]
+	public class ISupportMappingTest
+	{
+		public class SourceObject
+		{
+			public int Int1 = 10;
+			public int Int2 = 20;
+			public int Int3 = 30;
+		}
+
+		public class Object1 : ISupportMapping
+		{
+			public Object1(InitContext initContext)
+			{
+				if (initContext != null)
+					Int11 = (int)initContext.Parameters[0];
+
+				if (Int11 == 77)
+					initContext.StopMapping = true;
+			}
+
+			public int Int11;
+			public int Int22;
+			public int Int3;
+			public int Int44;
+
+			public void BeginMapping(InitContext initContext)
+			{
+				Int22 = (int)initContext.Parameters[1];
+
+				if (Int22 == 66)
+					initContext.StopMapping = true;
+			}
+
+			public void EndMapping(InitContext initContext)
+			{
+				Int44 = (int)initContext.Parameters[2];
+			}
+		}
+
+		[Test]
+		public void Test1()
+		{
+			Object1 o = (Object1)Map.ObjectToObject(new SourceObject(), typeof(Object1), 11, 22, 44);
+
+			Assert.AreEqual(11, o.Int11);
+			Assert.AreEqual(22, o.Int22);
+			Assert.AreEqual(30, o.Int3);
+			Assert.AreEqual(44, o.Int44);
+		}
+
+		[Test]
+		public void Test2()
+		{
+			Object1 o = new Object1(null);
+
+			Map.ObjectToObject(new SourceObject(), o, 11, 22, 44);
+
+			Assert.AreEqual(0,  o.Int11);
+			Assert.AreEqual(22, o.Int22);
+			Assert.AreEqual(30, o.Int3);
+			Assert.AreEqual(44, o.Int44);
+		}
+
+		[Test]
+		public void Test3()
+		{
+			Object1 o = (Object1)Map.ObjectToObject(new SourceObject(), typeof(Object1), 77, 66, 44);
+
+			Assert.AreEqual(77, o.Int11);
+			Assert.AreEqual(0,  o.Int22);
+			Assert.AreEqual(0,  o.Int3);
+			Assert.AreEqual(0,  o.Int44);
+		}
+
+		[Test]
+		public void Test4()
+		{
+			Object1 o = (Object1)Map.ObjectToObject(new SourceObject(), typeof(Object1), 11, 66, 44);
+
+			Assert.AreEqual(11, o.Int11);
+			Assert.AreEqual(66, o.Int22);
+			Assert.AreEqual(0,  o.Int3);
+			Assert.AreEqual(0,  o.Int44);
+		}
+
+		public abstract class Object5 : ISupportMapping
+		{
+			public Object5(InitContext initContext)
+			{
+				Int11 = (int)initContext.Parameters[0];
+			}
+
+			[Parameter(77)]
+			public abstract int   Int00 { get; set; }
+			public abstract int   Int11 { get; set; }
+			public abstract int   Int22 { get; set; }
+			public abstract short Int3  { get; set; }
+			public abstract int   Int44 { get; set; }
+
+			public void BeginMapping(InitContext initContext)
+			{
+				Int22 = (int)initContext.Parameters[1];
+			}
+
+			public void EndMapping(InitContext initContext)
+			{
+				Int44 = (int)initContext.Parameters[2];
+			}
+		}
+
+		[Test]
+		public void Test5()
+		{
+			Object5 o = (Object5)Map.ObjectToObject(new SourceObject(), typeof(Object5), 11, 22, 44);
+
+			Assert.AreEqual(77, o.Int00);
+			Assert.AreEqual(11, o.Int11);
+			Assert.AreEqual(22, o.Int22);
+			Assert.AreEqual(30, o.Int3);
+			Assert.AreEqual(44, o.Int44);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Mapping/Map.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<Types
+	xmlns   = "urn:schemas-bltoolkit-net:typeext"
+	xmlns:m = "urn:schemas-bltoolkit-net:mapping">
+
+	<Type Name="Object5">
+		<m:MapField MapName="fld1" OrigName="Object3.Object2.Field1" />
+		<m:MapField MapName="fld2" OrigName="Object3.Object4.Str1" />
+	</Type>
+
+	<Type Name='CountryCodeEnum'>
+		<Member Name='AF' MapValue='AF' MapValue-Type='System.String'/>
+		<Member Name='AL' MapValue='AL' MapValue-Type='System.String'/>
+		<Member Name='DZ' MapValue='DZ' MapValue-Type='System.String'/>
+		<Member Name='AS' MapValue='AS' MapValue-Type='System.String'/>
+		<Member Name='AD' MapValue='AD' MapValue-Type='System.String'/>
+	</Type>
+
+	<Type Name='OtherEnum'>
+		<Member Name='EnumValue1' MapValue='100' MapValue-Type='System.Int32' />
+		<Member Name='EnumValue2' MapValue='101' MapValue-Type='System.Int32' />
+	</Type>
+
+	<Type Name='CountryCodeEnum1'>
+		<Member Name='AF' MapValue='AF' MapValue-Type='System.String'/>
+		<Member Name='AL' MapValue='AL' MapValue-Type='System.String'/>
+		<Member Name='DZ' MapValue='DZ' MapValue-Type='System.String'/>
+		<Member Name='AS' MapValue='AS' MapValue-Type='System.String'/>
+		<Member Name='AD' MapValue='AD' MapValue-Type='System.String'/>
+	</Type>
+
+	<Type Name='OtherEnum1'>
+		<Member Name='EnumValue1' MapValue='100' MapValue-Type='System.Int32' />
+		<Member Name='EnumValue2' MapValue='101' MapValue-Type='System.Int32' />
+	</Type>
+</Types>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Mapping/MapFieldAttributeTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,196 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection.Extension;
+
+namespace Mapping
+{
+	[TestFixture, Category("Mapping")]
+	public class MapFieldAttributeTest
+	{
+		[MapField("MapName", "Field1")]
+		public class Object1
+		{
+			public int Field1;
+			[MapField("intfld")]
+			public int Field2;
+		}
+
+		[Test]
+		public void Test1()
+		{
+			ObjectMapper om = Map.GetObjectMapper(typeof(Object1));
+
+			Object1 o = (Object1)om.CreateInstance();
+
+			om.SetValue(o, "mapname", 123);
+			om.SetValue(o, "intfld",  234);
+
+			Assert.AreEqual(123, o.Field1);
+			Assert.AreEqual(234, o.Field2);
+		}
+
+		[MapValue(true,  "Y")]
+		[MapValue(false, "N")]
+		public class Object2
+		{
+			public bool Field1;
+			public int  Field2;
+		}
+
+		public class Object3
+		{
+			public Object2 Object2 = new Object2();
+			public Object4 Object4;
+		}
+
+		[MapField("fld1", "Object3.Object2.Field1")]
+		[MapField("fld2", "Object3.Object4.Str1")]
+		public class Object4
+		{
+			public Object3 Object3 = new Object3();
+			public string  Str1;
+		}
+
+		[Test]
+		public void Test2()
+		{
+			ObjectMapper om = Map.GetObjectMapper(typeof(Object4));
+
+			Object4 o = (Object4)om.CreateInstance();
+
+			om.SetValue(o, "fld1", "Y");
+			om.SetValue(o, "Object3.Object2.Field2", 123);
+			om.SetValue(o, "fld2", "str");
+
+			Assert.AreEqual(true, o.Object3.Object2.Field1);
+			Assert.AreEqual(123,  o.Object3.Object2.Field2);
+			Assert.IsNull  (      o.Object3.Object4);
+
+			Assert.AreEqual("Y", om.GetValue(o, "fld1"));
+			Assert.AreEqual(123, om.GetValue(o, "Object3.Object2.Field2"));
+			Assert.IsNull  (     om.GetValue(o, "fld2"));
+		}
+
+		[Test]
+		public void Test3()
+		{
+			ObjectMapper om = Map.GetObjectMapper(typeof(Object4));
+			MemberMapper mm = om["Object3.Object2.Field1", true];
+
+			Assert.IsNotNull(mm);
+		}
+
+		[MapField("fld2", "Object3.Object4.Str1")]
+		[TypeExtension(FileName="Map.xml")]
+		public class Object5
+		{
+			public Object3 Object3 = new Object3();
+			public string  Str1;
+		}
+
+		[Test]
+		public void Test4()
+		{
+			ObjectMapper om  = Map.GetObjectMapper(typeof(Object5));
+			MemberMapper mm1 = om["Object3.Object2.Field1", true];
+			MemberMapper mm2 = om["Object3.Object4.Str1", true];
+
+			Assert.IsNotNull(mm1);
+			Assert.IsNotNull(mm2);
+		}
+
+		public class Entity
+		{
+			[PrimaryKey]
+			public int Id;
+		}
+
+		public class Name
+		{
+			public string LastName;
+			public string FirstName;
+			public string MiddleName;
+		}
+
+		[MapField("PhoneId", "Id")]
+		public class PhoneEntity : Entity
+		{
+			public string Phone;
+		}
+
+		[MapField("PhoneId",    "Phone.Id")]
+		[MapField("LastName",   "Name.LastName")]
+		[MapField("FirstName",  "Name.FirstName")]
+		[MapField("MiddleName", "Name.MiddleName")]
+		public class PersonEntity : Entity
+		{
+			public PhoneEntity Phone;
+			public Name        Name   = new Name();
+		}
+
+		[Test]
+		public void InnerTest1()
+		{
+			ObjectMapper om = ObjectMapper<PersonEntity>.Instance;
+			List<string> list = new List<MemberMapper>(om)
+				.ConvertAll<string>(delegate(MemberMapper mm) { return mm.Name; });
+
+			Assert.That(list.Count == 5);
+			Assert.That(list.Contains("PhoneId"));
+			Assert.That(list.Contains("Phone"), Is.False);
+			Assert.That(list.Contains("LastName"));
+			Assert.That(list.Contains("Name"), Is.False);
+		}
+
+		[MapField("PhoneId", "Phone.Id")]
+		public class PersonEntity2 : Entity
+		{
+			[MapIgnore]
+			public PhoneEntity Phone = new PhoneEntity();
+			[MapField(Format="{0}")]
+			public Name        Name  = new Name();
+		}
+
+		[Test]
+		public void InnerTest2()
+		{
+			ObjectMapper om = ObjectMapper<PersonEntity2>.Instance;
+			List<string> list = new List<MemberMapper>(om)
+				.ConvertAll<string>(delegate(MemberMapper mm) { return mm.Name; });
+
+			Assert.That(list.Count == 5);
+			Assert.That(list.Contains("PhoneId"));
+			Assert.That(list.Contains("Phone"), Is.False);
+			Assert.That(list.Contains("LastName"));
+			Assert.That(list.Contains("Name"), Is.False);
+		}
+
+		[MapField("PhoneId", "Phone.Id")]
+		[MapField("Name", Format="{0}")]
+		public class PersonEntity3 : Entity
+		{
+			[MapIgnore]
+			public PhoneEntity Phone = new PhoneEntity();
+			public Name        Name  = new Name();
+		}
+
+		[Test]
+		public void InnerTest3()
+		{
+			ObjectMapper om = ObjectMapper<PersonEntity3>.Instance;
+			List<string> list = new List<MemberMapper>(om)
+				.ConvertAll<string>(delegate(MemberMapper mm) { return mm.Name; });
+
+			Assert.That(list.Count == 5);
+			Assert.That(list.Contains("PhoneId"));
+			Assert.That(list.Contains("Phone"), Is.False);
+			Assert.That(list.Contains("LastName"));
+			Assert.That(list.Contains("Name"), Is.False);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Mapping/MapTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,563 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.SqlTypes;
+using System.Globalization;
+using BLToolkit.Common;
+using BLToolkit.Reflection;
+using NUnit.Framework;
+
+using BLToolkit.Mapping;
+
+namespace Mapping
+{
+	[TestFixture, Category("Mapping")]
+	public class MapTest : TestFixtureBase
+	{
+		#region Enum To Int
+
+		public class EnumClass
+		{
+			public enum Enum
+			{
+				Value1 = 1,
+				Value2 = 2
+			}
+
+			public Enum          Value = Enum.Value1;
+			public Enum? NullableValue = Enum.Value2;
+		}
+
+		public class IntClass
+		{
+			public int          Value;
+			public int? NullableValue;
+		}
+
+		[Test]
+		public void EnumToInt()
+		{
+			var list1 = new ArrayList();
+
+			list1.Add(new EnumClass());
+
+			var list2 = Map.ListToList(list1, typeof(IntClass));
+
+			Assert.AreEqual(1, ((IntClass)list2[0]).Value);
+			Assert.AreEqual(2, ((IntClass)list2[0]).NullableValue);
+		}
+
+		#endregion
+
+		#region ToEnum, FromEnum
+
+		[DefaultValue(Enum1.Value3)]
+		[MapValue(Enum1.Value2, "2")]
+		public enum Enum1
+		{
+			[MapValue("1")] Value1,
+			[NullValue]     Value2,
+			[MapValue("3")] Value3
+		}
+
+		[Test]
+		public void ToEnum()
+		{
+			Assert.AreEqual(Enum1.Value1, Map.ValueToEnum("1",    typeof(Enum1)));
+			Assert.AreEqual(Enum1.Value2, Map.ValueToEnum(null,   typeof(Enum1)));
+			Assert.AreEqual(Enum1.Value3, Map.ValueToEnum("2727", typeof(Enum1)));
+		}
+
+		[Test]
+		public void FromEnum()
+		{
+			Assert.AreEqual("1", Map.EnumToValue(Enum1.Value1));
+			Assert.IsNull  (     Map.EnumToValue(Enum1.Value2));
+			Assert.AreEqual("3", Map.EnumToValue(Enum1.Value3));
+		}
+
+		public enum Enum2 : short
+		{
+			Value1 = 1,
+			[NullValue] Value2,
+			[DefaultValue]Value3
+		}
+
+		[Test]
+		public void ToShortEnum()
+		{
+			Assert.AreEqual(Enum2.Value1, Map.ValueToEnum(1,    typeof(Enum2)));
+			Assert.AreEqual(Enum2.Value2, Map.ValueToEnum(null, typeof(Enum2)));
+			Assert.AreEqual(Enum2.Value3, Map.ValueToEnum(3,    typeof(Enum2)));
+			Assert.AreEqual(Enum2.Value3, Map.ValueToEnum(2727, typeof(Enum2)));
+
+			// DateTime.Now can't converted to Enum2.
+			// Expected result in this case is default value.
+			//
+			Assert.AreEqual(Enum2.Value3, Map.ValueToEnum(DateTime.Now, typeof(Enum2)));
+		}
+
+		public enum Enum3 : long
+		{
+			Value1 = 1,
+		}
+
+		[Test, ExpectedException(typeof(InvalidCastException))]
+		public void ToEnumWithIncompatibleValue()
+		{
+			// An object can't be converted to Enum3.
+			// Expected result is an exception, since Enum3 does not have
+			// a default value defined.
+			//
+			Map.ValueToEnum(new object(), typeof(Enum3));
+		}
+
+		[Test]
+		public void ToEnumWithCompatibleValue()
+		{
+			// 123 is not defined for this enum, but can be converted to.
+			// Enum3 does not have a default value defined, so just cast 123 to Enum3
+			//
+			Assert.AreEqual((Enum3)123, Map.ValueToEnum(123, typeof(Enum3)));
+
+			// DateTime.Now also can be converted to Enum3 (as ticks).
+			//
+			Map.ValueToEnum(DateTime.Now, typeof(Enum3));
+		}
+		#endregion
+
+		#region ObjectToObject
+
+		public class SourceObject
+		{
+			public int    Field1 = 10;
+			public string Field2 = "20";
+			public double Field3 = 30.0;
+		}
+
+		public class Object1
+		{
+			public int Field1;
+			public int Field2;
+			public int Field3;
+		}
+
+		[Test]
+		public void ObjectToObjectOO()
+		{
+			SourceObject so = new SourceObject();
+			Object1      o  = new Object1();
+ 
+			Map.ObjectToObject(so, o);
+
+			Assert.AreEqual(10, o.Field1);
+			Assert.AreEqual(20, o.Field2);
+			Assert.AreEqual(30, o.Field3);
+		}
+
+		[Test]
+		public void ObjectToObjectOT()
+		{
+			SourceObject so = new SourceObject();
+			Object1      o  = (Object1)Map.ObjectToObject(so, typeof(Object1));
+
+			Assert.AreEqual(10, o.Field1);
+			Assert.AreEqual(20, o.Field2);
+			Assert.AreEqual(30, o.Field3);
+		}
+
+		[Test]
+		public void ObjectToObjectTO()
+		{
+			SourceObject so = new SourceObject();
+			Object1      o  = Map.ObjectToObject<Object1>(so);
+
+			Assert.AreEqual(10, o.Field1);
+			Assert.AreEqual(20, o.Field2);
+			Assert.AreEqual(30, o.Field3);
+		}
+
+		public class DefaultNullType
+		{
+			[NullValue(-1)]
+			public int NullableInt;
+		}
+
+		#endregion
+
+		#region DataRowToObject
+
+		[Test]
+		public void DataRowToObjectD()
+		{
+			DataTable table = new DataTable();
+
+			table.Columns.Add("NullableInt", typeof(int));
+
+			table.Rows.Add(new object[] { DBNull.Value });
+			table.Rows.Add(new object[] { 1 });
+			table.AcceptChanges();
+
+			DefaultNullType dn = (DefaultNullType)Map.DataRowToObject(table.Rows[0], typeof(DefaultNullType));
+
+			Assert.AreEqual(-1, dn.NullableInt);
+
+			Map.DataRowToObject(table.Rows[1], DataRowVersion.Current, dn);
+
+			Assert.AreEqual(1, dn.NullableInt);
+		}
+
+		#endregion
+
+		#region ObjectToDictionary
+
+		[Test]
+		public void ObjectToDictionary()
+		{
+			SourceObject so = new SourceObject();
+			Hashtable    ht = new Hashtable();
+ 
+			Map.ObjectToDictionary(so, ht);
+
+			Assert.AreEqual(10,   ht["Field1"]);
+			Assert.AreEqual("20", ht["Field2"]);
+			Assert.AreEqual(30,   ht["Field3"]);
+		}
+
+		#endregion
+
+		#region DictionaryToObject
+
+		[Test]
+		public void DictionaryToObject()
+		{
+			var so = new SourceObject();
+			var ht = Map.ObjectToDictionary(so);
+			var o1 = (Object1)Map.DictionaryToObject(ht, typeof(Object1));
+
+			Assert.AreEqual(10, o1.Field1);
+			Assert.AreEqual(20, o1.Field2);
+			Assert.AreEqual(30, o1.Field3);
+		}
+
+		#endregion
+
+		#region DataRowToDictionary
+
+		[Test]
+		public void DataRowToDictionary()
+		{
+			DataTable table = GetDataTable();
+			Hashtable hash  = Map.DataRowToDictionary(table.Rows[0]);
+
+			Assert.AreEqual(table.Rows[0]["ID"],   hash["ID"]);
+			Assert.AreEqual(table.Rows[0]["Name"], hash["Name"]);
+			Assert.AreEqual(table.Rows[0]["Date"], hash["Date"]);
+		}
+
+		#endregion
+
+		#region DictionaryToDataRow
+
+		[Test]
+		public void DictionaryToDataRow()
+		{
+			DataTable table1 = GetDataTable();
+			Hashtable hash   = Map.DataRowToDictionary(table1.Rows[0]);
+			DataTable table2 = new DataTable();
+
+			Map.DictionaryToDataRow(hash, table2);
+
+			Assert.AreEqual(table1.Rows[0]["ID"],   table2.Rows[0]["ID"]);
+			Assert.AreEqual(table1.Rows[0]["Name"], table2.Rows[0]["Name"]);
+			Assert.AreEqual(table1.Rows[0]["Date"], table2.Rows[0]["Date"]);
+		}
+
+		#endregion
+
+		#region SqlTypes
+
+		public class SqlTypeTypes
+		{
+			public class SourceObject
+			{
+				public string    s1 = "123";
+				public SqlString s2 = "1234";
+				public int       i1 = 123;
+				public SqlInt32  i2 = 1234;
+
+				public DateTime    d1 = DateTime.Now;
+				public SqlDateTime d2 = DateTime.Now;
+			}
+
+			public class Object1
+			{
+				public SqlString s1;
+				public string    s2;
+				public SqlInt32  i1;
+				public int       i2;
+
+				public SqlDateTime d1;
+				public DateTime    d2;
+			}
+		}
+
+		[Test]
+		public void SqlTypes()
+		{
+			SqlTypeTypes.SourceObject so = new SqlTypeTypes.SourceObject();
+			SqlTypeTypes.Object1      o  = (SqlTypeTypes.Object1)Map.ObjectToObject(so, typeof(SqlTypeTypes.Object1));
+
+			Console.WriteLine(o.s1); Assert.AreEqual("123",  o.s1.Value);
+			Console.WriteLine(o.s2); Assert.AreEqual("1234", o.s2);
+
+			Console.WriteLine(o.i1); Assert.IsTrue(o.i1.Value == 123);
+			Console.WriteLine(o.i2); Assert.IsTrue(o.i2 == 1234);
+
+			Console.WriteLine("{0} - {1}", so.d2, o.d2); Assert.AreEqual(o.d2, so.d2.Value);
+			//Console.WriteLine("{0} - {1}", s.d1, d.d1); Assert.IsTrue(d.d1.Value == s.d1);
+		}
+
+		#endregion
+
+		#region Arrays
+
+		public class ArrayTypes
+		{
+			public class SourceObject
+			{
+				public int[,]   DimArray = new int[2, 2] { {1,2}, {3,4} };
+				public string[] StrArray = new string[]  {"5","4","3","2","1"};
+				public int[]    IntArray = new int[]     {1,2,3,4,5};
+				public Enum1[]  EnmArray = new Enum1[]   {Enum1.Value1,Enum1.Value2,Enum1.Value3};
+
+				public byte[][,][][,] ComplexArray = InitComplexArray();
+				public static byte[][,][][,] InitComplexArray()
+				{
+					byte[][,][][,] ret = new byte[1][,][][,];
+					ret[0]             = new byte[1,1][][,];
+					ret[0][0,0]        = new byte[1][,];
+					ret[0][0,0][0]     = new byte[,] { {1,2}, {3,4} };
+
+					return ret;
+				}
+			}
+
+			public class DestObject
+			{
+				public float[,] DimArray;
+				public string[] StrArray;
+				public string[] IntArray;
+				public string[] EnmArray;
+				public sbyte[][,][][,] ComplexArray;
+			}
+
+			public class IncompatibleObject
+			{
+				public int[][] DimArray;
+			}
+		}
+
+		[Test]
+		public void ArrayTypesTest()
+		{
+			ArrayTypes.SourceObject so = new ArrayTypes.SourceObject();
+			ArrayTypes.DestObject o = (ArrayTypes.DestObject)Map.ObjectToObject(so, typeof(ArrayTypes.DestObject));
+
+			Console.WriteLine(o.DimArray); Assert.AreEqual(so.DimArray[0,0], (int)o.DimArray[0,0]);
+			Console.WriteLine(o.StrArray); Assert.AreEqual(so.StrArray, o.StrArray);
+			Console.WriteLine(o.IntArray); Assert.AreEqual(so.IntArray[0].ToString(), o.IntArray[0]);
+
+			Console.WriteLine(o.ComplexArray); Assert.IsTrue(o.ComplexArray[0][0,0][0][1,1] == 4);
+		}
+
+		[Test, ExpectedException(typeof(InvalidCastException))]
+		public void IncompatibleArrayTypesTest()
+		{
+			ArrayTypes.SourceObject so = new ArrayTypes.SourceObject();
+			Map.ObjectToObject(so, typeof(ArrayTypes.IncompatibleObject));
+		}
+		
+		#endregion
+
+		#region SourceListToDestList
+
+		[Test]
+		public void ListToList()
+		{
+			DataTable table = GetDataTable();
+			ArrayList list1 = Map.DataTableToList(table, typeof(TestObject));
+			ArrayList list2 = new ArrayList();
+
+			Map.ListToList(list1, list2, typeof(TestObject));
+
+			CompareLists(table, list2);
+		}
+
+		[Test]
+		public void TableToList()
+		{
+			DataTable table = GetDataTable();
+			ArrayList list  = Map.DataTableToList(table, typeof(TestObject));
+
+			CompareLists(table, list);
+		}
+
+		[Test]
+		public void ListToTable1()
+		{
+			DataTable table1 = GetDataTable();
+			ArrayList list   = Map.DataTableToList(table1, typeof(TestObject));
+			DataTable table2 = Map.ListToDataTable(list);
+
+			table2.AcceptChanges();
+
+			CompareLists(table1, table2);
+		}
+
+		[Test]
+		public void ListToTable2()
+		{
+			DataTable table1 = GetDataTable();
+			ArrayList list   = Map.DataTableToList(table1, typeof(TestObject));
+			DataTable table2 = table1.Clone();
+
+			Map.ListToDataTable(list, table2);
+
+			table2.AcceptChanges();
+
+			CompareLists(table1, table2);
+		}
+
+		[Test]
+		public void TableToTable1()
+		{
+			DataTable table1 = GetDataTable();
+			DataTable table2 = Map.DataTableToDataTable(table1);
+
+			table2.AcceptChanges();
+
+			CompareLists(table1, table2);
+		}
+
+		[Test]
+		public void TableToTable2()
+		{
+			DataTable table1 = GetDataTable();
+			DataTable table2 = new DataTable();
+				
+			Map.DataTableToDataTable(table1, table2);
+
+			table2.AcceptChanges();
+
+			CompareLists(table1, table2);
+		}
+
+		[Test]
+		public void TableToDictionary()
+		{
+			DataTable   table = GetDataTable();
+			IDictionary dic   = Map.DataTableToDictionary(table, new SortedList(), "ID", typeof(TestObject));
+
+			CompareLists(table, Map.ListToList(dic.Values, typeof(TestObject)));
+		}
+
+		[Test]
+		public void ListToDictionary()
+		{
+			DataTable   table = GetDataTable();
+			ArrayList   list  = Map.DataTableToList     (table, typeof(TestObject));
+			IDictionary dic   = Map.ListToDictionary(list, new SortedList(), "ID", typeof(TestObject));
+
+			CompareLists(table, Map.ListToList(dic.Values, typeof(TestObject)));
+		}
+
+		[Test]
+		public void DictionaryToDictionary()
+		{
+			DataTable   table = GetDataTable();
+			ArrayList   list  = Map.DataTableToList           (table, typeof(TestObject));
+			IDictionary dic1  = Map.ListToDictionary      (list, new SortedList(), "ID",  typeof(TestObject));
+			IDictionary dic2  = Map.DictionaryToDictionary(dic1, new SortedList(), "@ID", typeof(TestObject));
+
+			CompareLists(table, Map.ListToList(dic2.Values, typeof(TestObject)));
+		}
+
+		#endregion
+
+		#region ObjectToDataRow
+
+		public class DataRowTestType
+		{
+			public Int32      Int32Column  = 12345;
+			public String    StringColumn  = "string";
+			public Byte[] ByteArrayColumn  = new Byte[]{1,2,3,4,5};
+			//public Byte[] ByteArrayColumn2 = null;
+		}
+
+		[Test]
+		public void ObjectToDataRowTest()
+		{
+			DataTable       table = new DataTable();
+			DataRowTestType obj   = new DataRowTestType();
+
+			Map.ObjectToDataRow(obj, table);
+
+			Assert.IsNotEmpty(table.Rows);
+			DataRow dr      = table.Rows[0];
+
+			Assert.AreEqual(table.Columns["Int32Column"]     .DataType, typeof(Int32));
+			Assert.AreEqual(table.Columns["StringColumn"]    .DataType, typeof(String));
+			Assert.AreEqual(table.Columns["ByteArrayColumn"] .DataType, typeof(Byte[]));
+			//Assert.AreEqual(table.Columns["ByteArrayColumn2"].DataType, typeof(Byte[]));
+
+			Assert.AreEqual(obj.Int32Column,      dr["Int32Column"]);
+			Assert.AreEqual(obj.StringColumn,     dr["StringColumn"]);
+			Assert.AreEqual(obj.ByteArrayColumn,  dr["ByteArrayColumn"]);
+			//Assert.AreEqual(obj.ByteArrayColumn2, dr["ByteArrayColumn2"]);
+		}
+
+		#endregion
+
+		class ObjectStr1
+		{
+			public string Field;
+		}
+
+		class ObjectDateTime1
+		{
+			public DateTime Field = DateTime.Now;
+		}
+
+		[Test]
+		public void TestConverter()
+		{
+			var prev = Convert<DateTime,string>.From;
+
+			Convert<DateTime,string>.From = str =>
+				DateTime.ParseExact(str, new[] { "yyyymmdd" }, CultureInfo.InvariantCulture, DateTimeStyles.None);
+
+			var map = Map.GetObjectMapper<List<ObjectStr1>,List<ObjectDateTime1>>();
+			var obj = map(new List<ObjectStr1> { new ObjectStr1 { Field = "20110102" } });
+
+			Assert.That(obj.Count,         Is.EqualTo(1));
+			Assert.That(obj[0].Field.Year, Is.EqualTo(2011));
+
+			Convert<DateTime,string>.From = prev;
+		}
+
+		public abstract class Test
+		{
+			public abstract int Id { get; set; }
+		}
+
+		[Test]
+		public void AccessorTest()
+		{
+			var test     = TypeAccessor<Test>.CreateInstance();
+			var mapper   = Map.GetObjectMapper<Test,Test>();
+			var testCopy = mapper(test);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Mapping/MapValueAttributeTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,200 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Mapping;
+
+namespace Mapping
+{
+	[TestFixture]
+	public class MapValueAttributeTest
+	{
+		public class Object1
+		{
+			[MapValue(true,  "Y")]
+			[MapValue(false, "N")]
+			public bool Bool1;
+
+			[MapValue(true,  "Y", "Yes")]
+			[MapValue(false, "N", "No")]
+			public bool Bool2;
+		}
+
+		[Test]
+		public void BoolTest1()
+		{
+			ObjectMapper om = Map.GetObjectMapper(typeof(Object1));
+
+			Object1 o = (Object1)om.CreateInstance();
+
+			om.SetValue(o, "Bool1", "Y");
+			om.SetValue(o, "Bool2", "Yes");
+
+			Assert.AreEqual(true, o.Bool1);
+			Assert.AreEqual(true, o.Bool2);
+
+			Assert.AreEqual("Y", om.GetValue(o, "Bool1"));
+			Assert.AreEqual("Y", om.GetValue(o, "Bool2"));
+		}
+
+		[MapValue(true,  "Y")]
+		[MapValue(false, "N")]
+		public class Object2
+		{
+			public bool Bool1;
+
+			[MapValue(true,  "Y", "Yes")]
+			[MapValue(false, "N", "No")]
+			public bool Bool2;
+		}
+
+		[Test]
+		public void BoolTest2()
+		{
+			ObjectMapper om = Map.GetObjectMapper(typeof(Object2));
+
+			Object2 o = (Object2)om.CreateInstance();
+
+			om.SetValue(o, "Bool1", "Y");
+			om.SetValue(o, "Bool2", "Yes");
+
+			Assert.AreEqual(true, o.Bool1);
+			Assert.AreEqual(true, o.Bool2);
+
+			Assert.AreEqual("Y", om.GetValue(o, "Bool1"));
+			Assert.AreEqual("Y", om.GetValue(o, "Bool2"));
+		}
+
+		[MapValue(Enum1.Value1, "1")]
+		[MapValue(Enum1.Value3, "3")]
+		public enum Enum1
+		{
+			                Value1,
+			[MapValue("2")] Value2,
+			                Value3,
+			[NullValue]     Value4
+		}
+
+		public class Object3
+		{
+			public Enum1 Enum1;
+			public Enum1 Enum2;
+
+			[MapValue(Enum1.Value1, "10")]
+			[MapValue(Enum1.Value2, "20")]
+			[MapValue(Enum1.Value3, "30")]
+			[MapValue(Enum1.Value3, "32")]
+			[MapValue(Enum1.Value3, "31")]
+			public Enum1 Enum3;
+			public Enum1 Enum4;
+		}
+
+		[Test]
+		public void EnumTest1()
+		{
+			ObjectMapper om = Map.GetObjectMapper(typeof(Object3));
+
+			Object3 o = (Object3)om.CreateInstance();
+
+			om.SetValue(o, "Enum1", "1");
+			om.SetValue(o, "Enum2", "2");
+			om.SetValue(o, "Enum3", "30");
+			om.SetValue(o, "Enum4", null);
+
+			Assert.AreEqual(Enum1.Value1, o.Enum1);
+			Assert.AreEqual(Enum1.Value2, o.Enum2);
+			Assert.AreEqual(Enum1.Value3, o.Enum3);
+			Assert.AreEqual(Enum1.Value4, o.Enum4);
+
+			om.SetValue(o, "Enum3", "31");
+			Assert.AreEqual(Enum1.Value3, o.Enum3);
+
+			om.SetValue(o, "Enum3", "32");
+			Assert.AreEqual(Enum1.Value3, o.Enum3);
+
+			Assert.AreEqual("1",                     om.GetValue(o, "Enum1"));
+			Assert.AreEqual("2",                     om.GetValue(o, "Enum2"));
+			Assert.Contains(om.GetValue(o, "Enum3"), new[] {"30", "31", "32", "3"});
+			Assert.IsNull  (                         om.GetValue(o, "Enum4"));
+		}
+
+		[MapValue(typeof(DayOfWeek), DayOfWeek.Monday, "M")]
+		[MapValue(                   DayOfWeek.Friday, "F")]
+		public class Object4
+		{
+			public DayOfWeek Dow1;
+			public DayOfWeek Dow2;
+		}
+
+		[Test]
+		public void DayOfWeekTest1()
+		{
+			ObjectMapper om = Map.GetObjectMapper(typeof(Object4));
+
+			Object4 o = (Object4)om.CreateInstance();
+
+			om.SetValue(o, "Dow1", "M");
+			om.SetValue(o, "Dow2", "F");
+
+			Assert.AreEqual(DayOfWeek.Monday, o.Dow1);
+			Assert.AreEqual(DayOfWeek.Friday, o.Dow2);
+
+			Assert.AreEqual("M", om.GetValue(o, "Dow1"));
+			Assert.AreEqual("F", om.GetValue(o, "Dow2"));
+		}
+
+		// http://www.rsdn.ru/Forum/?mid=1809157
+		//
+		public enum StringAlignment
+		{
+			Far,
+			Near,
+			Center
+		}
+
+		public class SourceObject
+		{
+			public string test = "Near";
+		}
+
+		public class DestObject
+		{
+			[MapValue(StringAlignment.Near,   "Near")]
+			[MapValue(StringAlignment.Far,    "Far")]
+			[MapValue(StringAlignment.Center, "Center")]
+			public StringAlignment test;
+		}
+
+		[Test]
+		public void EnumTest()
+		{
+			SourceObject so = new SourceObject();
+			DestObject o = (DestObject)Map.ObjectToObject(so, typeof(DestObject));
+
+			Assert.AreEqual(StringAlignment.Near, o.test);
+		}
+
+		#region Nullable Enum
+
+		public enum Enum2
+		{
+			[MapValue("Near")] Value1,
+		}
+
+		public class Object5
+		{
+			public Enum2? test;
+		}
+
+		[Test]
+		public void NullableEnumTest()
+		{
+			SourceObject so = new SourceObject();
+
+			Object5 b = Map.ObjectToObject<Object5>(so);
+			Assert.AreEqual(Enum2.Value1, b.test);
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Mapping/MapperMemberAttributeTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,230 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+using BLToolkit.Reflection.Extension;
+using BLToolkit.Reflection.MetadataProvider;
+
+namespace Mapping
+{
+	[TestFixture]
+	public class MapperMemberAttributeTest
+	{
+		class MemberMapper1 : MemberMapper
+		{
+			public override object GetValue(object o)
+			{
+				return 45;
+			}
+		}
+
+		public class Object1
+		{
+			// MapIgnore set to false
+			//
+			[MemberMapper(typeof(MemberMapper1))]
+			public int Int;
+
+			// MapIgnore set to DebugSwitch value
+			//
+			[MapIgnore(DebugSwitch), MemberMapper(typeof(MemberMapper1))]
+			public int MapIgnore;
+
+			// MapIgnore set to true
+			//
+			[MemberMapper(typeof(MemberMapper1)), MapIgnore]
+			public int MapIgnore2;
+
+			[MapIgnore(false), MemberMapper(typeof(MemberMapper1))]
+			public int MapNotIgnore;
+
+			private const bool DebugSwitch = true;
+		}
+
+		[Test]
+		public void Test1()
+		{
+			ObjectMapper om = Map.GetObjectMapper(typeof(Object1));
+
+			Object1 o = new Object1();
+
+			om.SetValue(o, "Int",      456);
+
+			Assert.AreEqual(456, o.Int);
+			Assert.AreEqual(45,  om.GetValue(o, "Int"));
+
+			Assert.IsNull(om["MapIgnore"]);
+			Assert.IsNull(om["MapIgnore2"]);
+			Assert.IsNotNull(om["MapNotIgnore"]);
+		}
+
+		[MemberMapper(typeof(int), typeof(MemberMapper1))]
+		public class Object2
+		{
+			public int Int;
+		}
+
+		[Test]
+		public void Test2()
+		{
+			ObjectMapper om = Map.GetObjectMapper(typeof(Object2));
+
+			Object2 o = new Object2();
+
+			om.SetValue(o, "Int", 456);
+
+			Assert.AreEqual(456, o.Int);
+			Assert.AreEqual(45,  om.GetValue(o, "Int"));
+		}
+
+		[MemberMapper(typeof(CustomNum.Mapper))]
+		public class CustomNum
+		{
+			public int Num;
+
+			public CustomNum(int num)
+			{
+				Num = num;
+			}
+
+			public CustomNum()
+			{
+			}
+
+			public class Mapper : MemberMapper
+			{
+				public override object GetValue(object o)
+				{
+					object value = MemberAccessor.GetValue(o);
+					return value is CustomNum? ((CustomNum)value).Num: 0;
+				}
+
+				public override void SetValue(object o, object value)
+				{
+					value = (value is int)? new CustomNum((int)value) : new CustomNum();
+					MemberAccessor.SetValue(o, value);
+				}
+			}
+		}
+
+		public class Object3
+		{
+			public CustomNum Num;
+		}
+
+		[Test]
+		public void TestNumberString()
+		{
+			ObjectMapper om = Map.GetObjectMapper(typeof(Object3));
+			Object3      o  = new Object3();
+
+			om.SetValue(o, "Num", 123);
+
+			Assert.AreEqual(123, o.Num.Num);
+		}
+
+		#region Custom mapping schema test
+
+		public class CustomString
+		{
+			public string Str;
+
+			public CustomString(string str)
+			{
+				Str = str;
+			}
+
+			public CustomString()
+			{
+				Str = string.Empty;
+			}
+
+			public class Mapper : MemberMapper
+			{
+				public override object GetValue(object o)
+				{
+					object value = MemberAccessor.GetValue(o);
+					return value is CustomString? ((CustomString)value).Str: null;
+				}
+
+				public override void SetValue(object o, object value)
+				{
+					value = (value is string)? new CustomString((string)value) : new CustomString();
+					MemberAccessor.SetValue(o, value);
+				}
+			}
+		}
+
+		public class Object4
+		{
+			public CustomString Str;
+		}
+
+		public class TestMappingSchema : MappingSchema
+		{
+			private class TestMapMetadataProvider : MetadataProviderBase
+			{
+				public override bool GetMapIgnore(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+				{
+					if (member.Type == typeof(CustomString))
+					{
+						isSet = true;
+						return false;
+					}
+
+					return base.GetMapIgnore(typeExtension, member, out isSet);
+				}
+			}
+
+			private class TestObjectMapper : ObjectMapper
+			{
+				protected override  MemberMapper CreateMemberMapper(MapMemberInfo mapMemberInfo)
+				{
+					if (mapMemberInfo.Type == typeof(CustomString))
+					{
+						MemberMapper mm = new CustomString.Mapper();
+						mm.Init(mapMemberInfo);
+						return mm;
+					}
+
+					return base.CreateMemberMapper(mapMemberInfo);
+				}
+
+				protected override MetadataProviderBase CreateMetadataProvider()
+				{
+					MetadataProviderBase provider = base.CreateMetadataProvider();
+					provider.AddProvider(new TestMapMetadataProvider());
+					return provider;
+				}
+
+			}
+
+			protected override ObjectMapper CreateObjectMapperInstance(Type type)
+			{
+				return new TestObjectMapper();
+			}
+		}
+
+		[Test]
+		public void TestCustomString()
+		{
+			MappingSchema save = Map.DefaultSchema;
+
+			Map.DefaultSchema = new TestMappingSchema();
+			
+			ObjectMapper om = Map.GetObjectMapper(typeof(Object4));
+
+			Object4 o = new Object4();
+
+			om.SetValue(o, "Str", "Test");
+
+			Assert.AreEqual("Test", o.Str.Str);
+			
+			Map.DefaultSchema = save;
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Mapping/MemberMapperDefaultMappersTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using BLToolkit.Mapping;
+using BLToolkit.Mapping.MemberMappers;
+
+using NUnit.Framework;
+
+namespace Mapping
+{
+	[TestFixture]
+	public class MemberMapperDefaultMappersTest
+	{
+		public class Object1
+		{
+			[MemberMapper(typeof(XMLSerialisationMapper))]
+			public List<object> Lst1;
+			[MemberMapper(typeof(BinarySerialisationMapper))]
+			public List<object> Lst2;
+			[MemberMapper(typeof(BinarySerialisationToBase64StringMapper))]
+			public List<object> Lst3;
+			[MemberMapper(typeof(JSONSerialisationMapper))]
+			public List<object> Lst4;
+		}
+
+		[Test]
+		public void DefaultMemberMapperTest()
+		{
+			ObjectMapper om = Map.GetObjectMapper(typeof(Object1));
+
+			Object1 o = new Object1();
+
+			o.Lst1 = new List<object>() { "Hello", "this", "is", "a", "test", 1, 2, 3 };
+			o.Lst2 = o.Lst1;
+			o.Lst3 = o.Lst1;
+			o.Lst4 = o.Lst1;
+
+			var xml = om.GetValue(o, "Lst1");
+			var bytearr = om.GetValue(o, "Lst2");
+			var base64 = om.GetValue(o, "Lst3");
+			var json = om.GetValue(o, "Lst4");
+
+			var o2 = new Object1();
+			om.SetValue(o2, "Lst1", xml);
+			om.SetValue(o2, "Lst2", bytearr);
+			om.SetValue(o2, "Lst3", base64);
+			om.SetValue(o2, "Lst4", json);
+
+			Assert.IsTrue(o.Lst1.SequenceEqual(o2.Lst1));
+			Assert.IsTrue(o.Lst2.SequenceEqual(o2.Lst2));
+			Assert.IsTrue(o.Lst3.SequenceEqual(o2.Lst3));
+			Assert.IsTrue(o.Lst4.SequenceEqual(o2.Lst4));   
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Mapping/MemberMapperTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,205 @@
+using System;
+using System.Data;
+using System.Data.SqlTypes;
+using System.Globalization;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.Mapping;
+
+namespace Mapping
+{
+	[TestFixture]
+	public class MemberMapperTest
+	{
+		public class Object1
+		{
+			public int       Int32;
+			public float     Float;
+			public DayOfWeek Dow1;
+			public DayOfWeek Dow2;
+		}
+
+		[Test]
+		public void PrimitiveMemberTest()
+		{
+			ObjectMapper om = Map.GetObjectMapper(typeof(Object1));
+
+			Object1 o = new Object1();
+
+			DayOfWeek de = DayOfWeek.Thursday;
+			short     di = (short)de;
+
+			om.SetValue(o, "Int32", 123.56);
+			om.SetValue(o, "Float", 123.57.ToString());
+			om.SetValue(o, "Dow1",  de);
+			om.SetValue(o, "Dow2",  di);
+
+			Assert.AreEqual(123,    om.GetValue(o, "Int32"));
+			Assert.AreEqual(de,     om.GetValue(o, "Dow1"));
+			Assert.AreEqual(de,     om.GetValue(o, "Dow2"));
+			Assert.IsTrue  (Math.Abs(123.57 - (float)om.GetValue(o, "Float")) < 0.0001);
+
+			Assert.IsNull(om.GetValue(o, "blah-blah-blah"));
+		}
+
+		public class AnsiStringObject
+		{
+			[MemberMapper(typeof(AnsiStringNumberMapper))]
+			public string ansi;
+			public string unicode;
+		}
+
+		internal class AnsiStringNumberMapper : MemberMapper
+		{
+			public override void Init(MapMemberInfo mapMemberInfo)
+			{
+				mapMemberInfo.DbType = DbType.AnsiString;
+				base.Init(mapMemberInfo);
+			}
+		}
+
+#if !SQLCE
+		[Test]
+#endif
+		public void ProvideCustomDBTypeTest()
+		{
+			AnsiStringObject obj = new AnsiStringObject();
+			obj.ansi    = "ansi";
+			obj.unicode = "unicode";
+
+			IDbDataParameter[] parametrs = new DbManager().CreateParameters( obj );
+
+			Assert.AreEqual(2, parametrs.Length);
+			Assert.AreEqual(DbType.String,     parametrs[1].DbType);
+
+#if !FIREBIRD
+			// AnsiString is not supported by FB.
+			//
+			Assert.AreEqual(DbType.AnsiString, parametrs[0].DbType);
+#endif
+		}
+
+		public class Object2
+		{
+			public short?     Int16;
+			public int?       Int32;
+			public long?      Int64;
+			public float?     Float;
+			public Guid?      Guid;
+			public DayOfWeek? Dow1;
+			public DayOfWeek? Dow2;
+		}
+
+		[Test]
+		public void NullableMemberTest()
+		{
+			Object2 o = new Object2();
+
+			short?    s  = 125;
+			Guid      g  = Guid.NewGuid();
+			DayOfWeek de = DayOfWeek.Thursday;
+			int       di = (int)de;
+
+			ObjectMapper<Object2>.SetValue(o, "Int16", s);
+			ObjectMapper<Object2>.SetValue(o, "Int32", 123.56);
+			ObjectMapper<Object2>.SetValue(o, "Int64", null);
+			ObjectMapper<Object2>.SetValue(o, "Float", 123.57.ToString());
+			ObjectMapper<Object2>.SetValue(o, "Guid",  (Guid?)g);
+			ObjectMapper<Object2>.SetValue(o, "Guid",  g);
+			ObjectMapper<Object2>.SetValue(o, "Dow1",  de);
+			ObjectMapper<Object2>.SetValue(o, "Dow1",  (DayOfWeek?)de);
+			ObjectMapper<Object2>.SetValue(o, "Dow2",  di);
+
+			Assert.AreEqual(125, o.Int16);
+			Assert.AreEqual(123, o.Int32);
+			Assert.IsNull  (     o.Int64);
+			Assert.AreEqual(g,   o.Guid);
+			Assert.AreEqual(de,  o.Dow1);
+			Assert.AreEqual(de,  o.Dow2);
+			Assert.IsTrue  (Math.Abs(123.57 - o.Float.Value) < 0.0001);
+
+			Assert.AreEqual(125,    ObjectMapper<Object2>.GetValue(o, "Int16"));
+			Assert.AreEqual(123,    ObjectMapper<Object2>.GetValue(o, "Int32"));
+			Assert.IsNull  (        ObjectMapper<Object2>.GetValue(o, "Int64"));
+			Assert.AreEqual(g,      ObjectMapper<Object2>.GetValue(o, "Guid"));
+			Assert.AreEqual(de,     ObjectMapper<Object2>.GetValue(o, "Dow1"));
+			Assert.AreEqual(de,     ObjectMapper<Object2>.GetValue(o, "Dow2"));
+			Assert.IsTrue  (Math.Abs(123.57 - (float)ObjectMapper<Object2>.GetValue(o, "Float")) < 0.0001);
+		}
+
+		public class Object3
+		{
+			public SqlInt32  Int32;
+			public SqlSingle Single;
+		}
+
+
+		[Test]
+		// fixes test fail due to use of "," vs "." in numbers parsing for some cultures
+		[SetCulture("")]
+		public void SqlTypeMemberTest()
+		{
+			ObjectMapper om = Map.GetObjectMapper(typeof(Object3));
+
+			Object3 o = new Object3();
+
+			om.SetValue(o, "Int32",  123.56);
+			om.SetValue(o, "Single", 123.57.ToString(CultureInfo.InvariantCulture));
+
+			Assert.AreEqual(123,     o.Int32. Value);
+			Assert.AreEqual(123.57f, o.Single.Value);
+
+			Assert.AreEqual(123,     om.GetValue(o, "Int32"));
+			Assert.AreEqual(123.57f, om.GetValue(o, "Single"));
+		}
+
+		public interface IClassInterface
+		{
+			IClassInterface classInterface { get; set;}
+		}
+
+		public class ClassInterface : IClassInterface
+		{
+			private IClassInterface _ici;
+
+			[MapIgnore(false)]
+			public IClassInterface classInterface
+			{
+				get { return _ici; }
+				set { _ici = value; }
+			}
+		}
+
+		[Test]
+		public void DerivedTypeTest()
+		{
+			IClassInterface ici = new ClassInterface();
+			ObjectMapper om = Map.GetObjectMapper(ici.GetType());
+			MemberMapper mm = om["classInterface"];
+			mm.SetValue(ici, new ClassInterface());
+		}
+
+		public class Class1
+		{
+			int _int32 = 0;
+			[MapField(Storage = "_int32")]
+			public int Int32
+			{
+				get { return _int32; }
+			}
+		}
+
+		[Test]
+		public void MapToStorageTest()
+		{
+			Class1 o  = new Class1();
+			ObjectMapper om = Map.GetObjectMapper(o.GetType());
+			MemberMapper mm = om["Int32"];
+			mm.SetValue(o, 5);
+
+			Assert.AreEqual(5, o.Int32);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Mapping/MetadataProvider/MetadataProviderTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,78 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.Reflection;
+using BLToolkit.Reflection.Extension;
+using BLToolkit.Reflection.MetadataProvider;
+
+namespace Mapping.MetadataProvider
+{
+	[TestFixture]
+	public class MetadataProviderTest
+	{
+		class CustomMetadataProvider : MetadataProviderBase
+		{
+			public override string GetFieldName(TypeExtension typeExtension, MemberAccessor member, out bool isSet)
+			{
+				string name = string.Empty;
+
+				foreach (char c in member.Name)
+				{
+					if (char.IsUpper(c))
+					{
+						if (name.Length > 0)
+							name += '_';
+						name += c;
+					}
+					else
+					{
+						name += char.ToUpper(c);
+					}
+				}
+
+				isSet = true;
+
+				return name;
+			}
+		}
+
+		public class Person
+		{
+			public string FirstName;
+			public string LastName;
+		}
+
+		static void MapMetadataProvider_OnCreateProvider(MetadataProviderBase parentProvider)
+		{
+			parentProvider.AddProvider(new CustomMetadataProvider());
+		}
+
+		[Test]
+		public void Test()
+		{
+			MetadataProviderBase.OnCreateProvider += MapMetadataProvider_OnCreateProvider;
+
+			string cmd = "SELECT '1' as FIRST_NAME, '2' as LAST_NAME";
+#if ORACLE || FIREBIRD
+			cmd += " FROM dual";
+#endif
+			using (DbManager db = new DbManager())
+			{
+				Person p = (Person)db
+					.SetCommand(cmd)
+					.ExecuteObject(typeof(Person));
+
+				Assert.AreEqual("1", p.FirstName);
+				Assert.AreEqual("2", p.LastName);
+			}
+		}
+
+		[TearDown]
+		public void TearDown()
+		{
+			MetadataProviderBase.OnCreateProvider -= MapMetadataProvider_OnCreateProvider;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Mapping/NullableAttributeTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,198 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Mapping;
+
+namespace Mapping
+{
+	[TestFixture]
+	public class NullableAttributeTest
+	{
+		public abstract class Object1
+		{
+			[NotNull]                   public abstract string Str1 { get; set; }
+			[Nullable]                  public abstract string Str2 { get; set; }
+			[NullValue("(null)")]       public abstract string Str3 { get; set; }
+			[NullValue(typeof(DBNull))] public abstract string Str4 { get; set; }
+		}
+
+		[Test]
+		public void TestString1()
+		{
+			var om = Map.GetObjectMapper(typeof(Object1));
+			var o  = (Object1)om.CreateInstance();
+
+			om.SetValue(o, "Str1", null);
+			om.SetValue(o, "Str2", null);
+			om.SetValue(o, "Str3", null);
+			om.SetValue(o, "Str4", null);
+
+			Assert.AreEqual("",       o.Str1);
+			Assert.AreEqual("",       o.Str2);
+			Assert.AreEqual("(null)", o.Str3);
+			Assert.IsNull  (o.Str4);
+
+			Assert.IsNotNull(om.GetValue(o, "Str1"));
+			Assert.IsNull   (om.GetValue(o, "Str2"));
+			Assert.IsNull   (om.GetValue(o, "Str3"));
+			Assert.IsNull   (om.GetValue(o, "Str4"));
+		}
+
+		[NullValue(typeof(string), "(null)")]
+		[NullValue(typeof(bool),   false)]
+		public abstract class Object2
+		{
+			[Nullable(false)]
+			public abstract string Str1 { get; set; }
+			[NullValue("")]
+			public abstract string Str2 { get; set; }
+			public abstract string Str3 { get; set; }
+			[NullValue(typeof(DBNull))]
+			public abstract string Str4 { get; set; }
+		}
+
+		[Test]
+		public void TestString2()
+		{
+			ObjectMapper om = Map.GetObjectMapper(typeof(Object2));
+
+			Object2 o = (Object2)om.CreateInstance();
+
+			om.SetValue(o, "Str1", null);
+			om.SetValue(o, "Str2", null);
+			om.SetValue(o, "Str3", null);
+			om.SetValue(o, "Str4", null);
+
+			Assert.AreEqual("",       o.Str1);
+			Assert.AreEqual("",       o.Str2);
+			Assert.AreEqual("(null)", o.Str3);
+			Assert.IsNull  (o.Str4);
+
+			Assert.IsNotNull(om.GetValue(o, "Str1"));
+			Assert.IsNull   (om.GetValue(o, "Str2"));
+			Assert.IsNull   (om.GetValue(o, "Str3"));
+			Assert.IsNull   (om.GetValue(o, "Str4"));
+		}
+
+		[Nullable(typeof(string))]
+		public abstract class Object3
+		{
+			[Nullable(false)]
+			public abstract string Str1 { get; set; }
+			public abstract string Str2 { get; set; }
+			[NullValue("(null)")]
+			public abstract string Str3 { get; set; }
+			[NullValue(typeof(DBNull))]
+			public abstract string Str4 { get; set; }
+		}
+
+		[Test]
+		public void TestString3()
+		{
+			ObjectMapper om = Map.GetObjectMapper(typeof(Object3));
+
+			Object3 o = (Object3)om.CreateInstance();
+
+			om.SetValue(o, "Str1", null);
+			om.SetValue(o, "Str2", null);
+			om.SetValue(o, "Str3", null);
+			om.SetValue(o, "Str4", null);
+
+			Assert.AreEqual("",       o.Str1);
+			Assert.AreEqual("",       o.Str2);
+			Assert.AreEqual("(null)", o.Str3);
+			Assert.IsNull  (o.Str4);
+
+			Assert.IsNotNull(om.GetValue(o, "Str1"));
+			Assert.IsNull   (om.GetValue(o, "Str2"));
+			Assert.IsNull   (om.GetValue(o, "Str3"));
+			Assert.IsNull   (om.GetValue(o, "Str4"));
+		}
+
+		[NullValue("(null)")]
+		public abstract class Object4
+		{
+			[Nullable(false)]
+			public abstract string Str1 { get; set; }
+			[NullValue("")]
+			public abstract string Str2 { get; set; }
+			public abstract string Str3 { get; set; }
+			[NullValue(typeof(DBNull))]
+			public abstract string Str4 { get; set; }
+		}
+
+		[Test]
+		public void TestString4()
+		{
+			ObjectMapper om = Map.GetObjectMapper(typeof(Object2));
+
+			Object2 o = (Object2)om.CreateInstance();
+
+			om.SetValue(o, "Str1", null);
+			om.SetValue(o, "Str2", "2");
+			om.SetValue(o, "Str3", null);
+			om.SetValue(o, "Str4", null);
+
+			Assert.AreEqual("",       o.Str1);
+			Assert.AreEqual("2",      o.Str2);
+			Assert.AreEqual("(null)", o.Str3);
+			Assert.IsNull  (o.Str4);
+
+			Assert.IsNotNull(     om.GetValue(o, "Str1"));
+			Assert.AreEqual ("2", om.GetValue(o, "Str2"));
+			Assert.IsNull   (     om.GetValue(o, "Str3"));
+			Assert.IsNull   (     om.GetValue(o, "Str4"));
+		}
+
+		public class Object5
+		{
+			public int Int1;
+			[Nullable]
+			public int Int2;
+			[NullValue(int.MinValue)]
+			public int Int3;
+		}
+
+		[Test]
+		public void TestPrimitive()
+		{
+			ObjectMapper om = Map.GetObjectMapper(typeof(Object5));
+
+			Object5 o = (Object5)om.CreateInstance();
+
+			om.SetValue(o, "Int1", null);
+			om.SetValue(o, "Int2", null);
+			om.SetValue(o, "Int3", null);
+
+			Assert.AreEqual(0,            o.Int1);
+			Assert.AreEqual(0,            o.Int2);
+			Assert.AreEqual(int.MinValue, o.Int3);
+
+			Assert.IsNotNull(om.GetValue(o, "Int1"));
+			Assert.IsNull   (om.GetValue(o, "Int2"));
+			Assert.IsNull   (om.GetValue(o, "Int3"));
+		}
+
+		[NullValue("(null)")]
+		public class Object6
+		{
+			public string String1;
+		}
+
+		[NullValue("(derived null)")]
+		public class Object6Derived : Object6
+		{
+		}
+
+		[Test]
+		public void TestDerivedNull()
+		{
+			ObjectMapper   om = Map.GetObjectMapper(typeof(Object6Derived));
+			Object6Derived o = (Object6Derived) om.CreateInstance();
+
+			om.SetValue(o, "String1", null);
+			Console.WriteLine(o.String1);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Mapping/NullableEnum.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,102 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Mapping;
+using BLToolkit.Reflection.Extension;
+
+namespace Mapping
+{
+	[TestFixture]
+	public class NullableEnum
+	{
+		public class Source
+		{
+			public Source(string value)
+			{
+				Field = value;
+			}
+
+			public string Field;
+		}
+
+		public enum StrEnum
+		{
+			[MapValue("str")]  Str,
+			[MapValue("str1")] Str1
+		}
+
+		public class StrDest1
+		{
+			public StrEnum? Field;
+		}
+
+		[Test]
+		public void Test1()
+		{
+			StrDest1 sd = Map.ObjectToObject<StrDest1>(new Source("str"));
+
+			Assert.AreEqual(StrEnum.Str, sd.Field);
+		}
+
+		[Test]
+		public void Test2()
+		{
+			StrDest1 sd = Map.ObjectToObject<StrDest1>(new Source(null));
+
+			Assert.IsNull(sd.Field);
+		}
+
+		public class StrDest2
+		{
+			public Mapping.EnumExtension.CountryCodeEnum? Field;
+		}
+
+		[Test]
+		public void Test3()
+		{
+			Map.Extensions = TypeExtension.GetExtensions("Map.xml");
+
+			StrDest2 sd = Map.ObjectToObject<StrDest2>(new Source("AL"));
+
+			Assert.AreEqual(Mapping.EnumExtension.CountryCodeEnum.AL, sd.Field);
+		}
+
+		[Test]
+		public void Test4()
+		{
+			Map.Extensions = TypeExtension.GetExtensions("Map.xml");
+
+			StrDest2 sd = Map.ObjectToObject<StrDest2>(new Source(null));
+
+			Assert.IsNull(sd.Field);
+		}
+
+		public enum IntEnum
+		{
+			Str  = 1,
+			Str1 = 2
+		}
+
+		public class StrDest3
+		{
+			public IntEnum? Field;
+		}
+
+		[Test]
+		public void Test5()
+		{
+			StrDest3 sd = Map.ObjectToObject<StrDest3>(new Source("1"));
+
+			Assert.AreEqual(IntEnum.Str, sd.Field);
+		}
+
+		[Test]
+		public void Test6()
+		{
+			StrDest3 sd = Map.ObjectToObject<StrDest3>(new Source(null));
+
+			Assert.IsNull(sd.Field);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Mapping/ObjectMapperAttributeTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,29 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Mapping;
+
+namespace Mapping
+{
+	[TestFixture, Category("Mapping")]
+	public class ObjectMapperAttributeTest
+	{
+		class TestMapper : ObjectMapper
+		{
+		}
+
+		[ObjectMapper(typeof(TestMapper))]
+		public class TestObject
+		{
+		}
+
+		[Test]
+		public void Test()
+		{
+			ObjectMapper om = Map.GetObjectMapper(typeof(TestObject));
+
+			Assert.AreEqual(typeof(TestMapper), om.GetType());
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Mapping/ObjectMapperTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,113 @@
+using System;
+using System.Data;
+using BLToolkit.EditableObjects;
+using NUnit.Framework;
+
+using BLToolkit.Mapping;
+
+namespace Mapping
+{
+	[TestFixture]
+	public class ObjectMapperTest
+	{
+		public class Object1
+		{
+			[MapField("col2")]
+			public int Col1 { get; set; }
+		}
+
+
+		[Test]
+		public void NameTest1()
+		{
+			var dt = new DataTable();
+
+			dt.Columns.Add("col1", typeof(int));
+			dt.Columns.Add("col2", typeof(int));
+			dt.Rows.Add(1, 2);
+
+			var o = Map.DataRowToObject<Object1>(dt.Rows[0]);
+
+			Assert.AreEqual(2, o.Col1);
+		}
+
+		[Test]
+		public void NameTest2()
+		{
+			var dt = new DataTable();
+
+			dt.Columns.Add("col2", typeof(int));
+			dt.Columns.Add("col1", typeof(int));
+			dt.Rows.Add(2, 1);
+
+			var o = Map.DataRowToObject<Object1>(dt.Rows[0]);
+
+			Assert.AreEqual(2, o.Col1);
+		}
+
+		[Test]
+		public void GetMemberMapperByNameAliasTest()
+		{
+			var om = Map.GetObjectMapper(typeof(Object1));
+
+			Assert.IsNotNull(om["col2"]);
+			Assert.IsNull   (om["Col1"]);
+			Assert.IsNotNull(om["Col1", true]);
+			Assert.IsNull   (om["col1", true]);
+		}
+
+		public interface ICheckOut
+		{
+			DateTime DateCheckOut { get; }
+		}
+
+		public class Test : ICheckOut
+		{
+			public int    ID    { get; set; }
+			public string Value { get; set; }
+
+			DateTime ICheckOut.DateCheckOut
+			{
+				get { return DateTime.Now; }
+			}
+		}
+
+		[Test]
+		public void MapObjectToObject()
+		{
+			var s1 = new Test { ID = 1, Value = "123" };
+			var s2 = new Test();
+
+			Map.ObjectToObject(s1, s2, null);
+		}
+
+		public abstract class BizEntityTest : EditableObject<BizEntityTest>
+		{
+			public abstract int                ID                 { get; set; }
+			public abstract string             Name               { get; set; }
+			public abstract BizEntityTestInner BizEntityTestInner { get; set; }
+		}
+
+		public abstract class BizEntityTestInner : EditableObject<BizEntityTestInner>
+		{
+			public abstract int    ID   { get; set; }
+			public abstract string Name { get; set; }
+		}
+
+		[Test]
+		public void DestabilizeTest()
+		{
+			var bet = BizEntityTest.CreateInstance();
+
+			bet.ID                      = 1;
+			bet.Name                    = "BizEntityTest";
+			bet.BizEntityTestInner      = BizEntityTestInner.CreateInstance();
+			bet.BizEntityTestInner.ID   = 111;
+			bet.BizEntityTestInner.Name = "BizEntityTestInner";
+
+			var mapper = Map.GetObjectMapper<BizEntityTest, BizEntityTest>(true);
+
+			var bet2 = mapper(bet);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Mapping/Person.mapping.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,39 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.Reflection.Extension;
+
+namespace Mapping
+{
+	[TestFixture]
+	public class PersonMappingTest
+	{
+		[TypeExtension(FileName="Person.mapping.xml")]
+		public abstract class Person : BLToolkit.EditableObjects.EditableObject
+		{
+			public abstract string FirstName { get; set; }
+			public abstract string LastName  { get; set; }
+		}
+
+		[Test]
+		public void Test()
+		{
+			string cmd = "SELECT '1' as FIRST_NAME, '2' as LAST_NAME";
+#if ORACLE || FIREBIRD
+			cmd += " FROM dual";
+#endif
+
+			using (DbManager db = new DbManager())
+			{
+				Person p = (Person)db
+					.SetCommand(cmd)
+					.ExecuteObject(typeof(Person));
+
+				Assert.AreEqual("1", p.FirstName);
+				Assert.AreEqual("2", p.LastName);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Mapping/Person.mapping.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<Types>
+
+	<Type Name="Mapping.PersonMappingTest+Person">
+		<Member Name="FirstName" MapField="FIRST_NAME" />
+		<Member Name="LastName"  MapField="LAST_NAME" />
+	</Type>
+
+</Types>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Mapping/ResultSetTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,170 @@
+using System;
+using System.Collections;
+using System.Data;
+using BLToolkit.Data;
+using BLToolkit.Mapping;
+
+using NUnit.Framework;
+
+namespace Mapping
+{
+	[TestFixture]
+	public class ResultSetTest
+	{
+		public class Master
+		{
+			[MapField("MasterID")]
+			public int ID;
+
+			public ArrayList Slaves = new ArrayList();
+		}
+
+		public class Slave
+		{
+			[MapField("SlaveID")]
+			public int ID;
+
+			public int MasterID;
+		}
+
+		const string SqlResultSet = @"
+			SELECT       1 as MasterID
+			UNION SELECT 2 as MasterID
+
+			SELECT       4 SlaveID, 1 as MasterID
+			UNION SELECT 5 SlaveID, 2 as MasterID
+			UNION SELECT 6 SlaveID, 2 as MasterID
+			UNION SELECT 7 SlaveID, 1 as MasterID";
+
+		[Test]
+		public void TestResultSet()
+		{
+			MapResultSet[] sets = new MapResultSet[2];
+
+			sets[0] = new MapResultSet(typeof(Master));
+			sets[1] = new MapResultSet(typeof(Slave));
+
+			sets[0].AddRelation(sets[1], "MasterID", "MasterID", "Slaves");
+
+			using (DbManager db = new DbManager())
+			{
+				db
+#if ORACLE
+					.SetSpCommand("ResultSetTest")
+#else
+					.SetCommand(SqlResultSet)
+#endif
+					.ExecuteResultSet(sets);
+			}
+
+			Assert.AreEqual(7, ((Slave)(((Master)sets[0].List[0]).Slaves[1])).ID);
+		}
+
+		[Test]
+		[ExpectedException(typeof(MappingException))]
+		public void TestFailResultSet1()
+		{
+			MapResultSet[] sets = new MapResultSet[2];
+
+			sets[0] = new MapResultSet(typeof(Master));
+			sets[1] = new MapResultSet(typeof(Slave));
+
+			sets[0].AddRelation(sets[1], "MasterID", "ID", "Slaves");
+
+			using (DbManager db = new DbManager())
+			{
+				db
+#if ORACLE
+					.SetSpCommand("ResultSetTest")
+#else
+					.SetCommand(SqlResultSet)
+#endif
+					.ExecuteResultSet(sets);
+			}
+		}
+
+		[Test]
+		[ExpectedException(typeof(MappingException))]
+		public void TestFailResultSet2()
+		{
+			MapResultSet[] sets = new MapResultSet[2];
+
+			sets[0] = new MapResultSet(typeof(Master));
+			sets[1] = new MapResultSet(typeof(Slave));
+
+			sets[0].AddRelation(sets[1], "Master", "MasterID", "Slaves");
+
+			using (DbManager db = new DbManager())
+			{
+				db
+#if ORACLE
+					.SetSpCommand("ResultSetTest")
+#else
+					.SetCommand(SqlResultSet)
+#endif
+					.ExecuteResultSet(sets);
+			}
+		}
+
+		[Test]
+		[ExpectedException(typeof(MappingException))]
+		public void TestFailResultSet3()
+		{
+			MapResultSet[] sets = new MapResultSet[2];
+
+			sets[0] = new MapResultSet(typeof(Master));
+			sets[1] = new MapResultSet(typeof(Slave));
+
+			sets[0].AddRelation(sets[1], "MasterID", "MasterID", "Slave");
+
+			using (DbManager db = new DbManager())
+			{
+				db
+#if ORACLE
+					.SetSpCommand("ResultSetTest")
+#else
+					.SetCommand(SqlResultSet)
+#endif
+					.ExecuteResultSet(sets);
+			}
+		}
+
+		[Test]
+		public void TestNextResult()
+		{
+			using (DbManager db = new DbManager())
+			{
+				MapResultSet[] sets = db
+#if ORACLE
+					.SetSpCommand("ResultSetTest")
+#else
+					.SetCommand(SqlResultSet)
+#endif
+					.ExecuteResultSet(typeof(Master),
+						new MapNextResult(typeof(Slave), "MasterID", "MasterID", "Slaves"));
+
+				Assert.AreEqual(7, ((Slave)(((Master)sets[0].List[0]).Slaves[1])).ID);
+			}
+		}
+
+		[Test]
+		public void TestDataSet()
+		{
+			using (DbManager db = new DbManager())
+			{
+				DataSet set = db
+#if ORACLE
+					.SetSpCommand("ResultSetTest")
+#else
+					.SetCommand(SqlResultSet)
+#endif
+					.ExecuteDataSet();
+
+				Assert.IsNotNull(set);
+				Assert.AreEqual(2, set.Tables.Count);
+			}
+
+		}
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Mapping/TestFluentNullable.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,42 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using BLToolkit.Mapping;
+using BLToolkit.Mapping.Fluent;
+using NUnit.Framework;
+
+namespace UnitTests.CS.Mapping
+{
+	[TestFixture]
+	public class TestFluentNullable
+	{
+		public class TestObject
+		{
+			public string NullableString { get; set; }
+		}
+
+		public class TestObjectMap : FluentMap<TestObject>
+		{
+			public TestObjectMap ()
+			{
+				NullValue (x => x.NullableString, null).Nullable ();
+			} 
+		}
+
+		[Test]
+		public void TestFluentNullValue ()
+		{
+			var schema = new MappingSchema ();
+			FluentConfig.Configure (schema).MapingFromType<TestObjectMap> ();
+			var om = schema.GetObjectMapper (typeof (TestObject));
+			var instance = new TestObject () { NullableString = "SOMEVALUE" };
+			om.SetValue (instance, "NullableString", null);
+			Assert.AreEqual (null, instance.NullableString);
+		}
+
+
+		
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Mapping/TrimmableAttributeTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,38 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Mapping;
+
+namespace Mapping
+{
+	[TestFixture, Category("Mapping")]
+	public class TrimmableAttributeTest
+	{
+		[Trimmable]
+		interface Interface1
+		{
+		}
+
+		public class TestObject : Interface1
+		{
+			[Trimmable(false)]
+			public string Str1;
+			public string Str2;
+		}
+
+		[Test]
+		public void Test()
+		{
+			ObjectMapper om = Map.GetObjectMapper(typeof(TestObject));
+
+			TestObject o = new TestObject();
+
+			om.SetValue(o, "Str1", "1  ");
+			om.SetValue(o, "Str2", "2  ");
+
+			Assert.AreEqual("1  ", o.Str1);
+			Assert.AreEqual("2",   o.Str2);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Mapping/XmlMap.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,43 @@
+using System;
+using System.Data;
+
+using NUnit.Framework;
+
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection.Extension;
+
+namespace Mapping
+{
+	[TestFixture]
+	public class XmlMap
+	{
+		public class Person
+		{
+			[PrimaryKey]
+			[MapField("PersonID")]  public int    ID;
+			[MapField("FirstName")] public string FName;
+			[MapField("LastName")]  public string LName;
+		}
+
+		[Test]
+		public void Test()
+		{
+			Person p = (Person)new SqlQuery().SelectByKey(typeof(Person), 1);
+
+			Assert.AreEqual(1,        p.ID);
+			Assert.AreEqual("John",   p.FName);
+			Assert.AreEqual("Pupkin", p.LName);
+
+			MappingSchema map = new MappingSchema();
+
+			map.Extensions = TypeExtension.GetExtensions("XmlMap.xml");
+
+			DataRow dr = map.MapObjectToDataRow(p, new DataTable());
+
+			Assert.AreEqual(1,        dr["PERSON_ID"]);
+			Assert.AreEqual("John",   dr["FIRST_NAME"]);
+			Assert.AreEqual("Pupkin", dr["LAST_NAME"]);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Mapping/XmlMap.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<Types>
+
+	<Type Name="Person">
+		<Member Name="ID"    MapField="PERSON_ID" />
+		<Member Name="FName" MapField="FIRST_NAME" />
+		<Member Name="LName" MapField="LAST_NAME" />
+	</Type>
+
+</Types>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Patterns/DuckTypingTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,327 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Patterns;
+
+namespace Patterns
+{
+	[TestFixture]
+	public class DuckTypingTest
+	{
+		public interface TestInterface
+		{
+			int  Method(int value);
+			void Method(int v1, out int v2);
+
+			int Prop { get; }
+
+			event EventHandler Event;
+
+			void CallEvent();
+		}
+
+		public interface TestInterface2
+		{
+			int  Method(int value);
+			void I2Method(int v1, out int v2);
+		}
+
+		public class TestClass
+		{
+			public static int Field;
+
+			public int Method(int value)
+			{
+				return value + 2;
+			}
+
+			public void Method(int v1, out int v2)
+			{
+				v2 = v1;
+			}
+
+			public void I2Method(int v1, out int v2)
+			{
+				v2 = v1;
+			}
+
+			public int Prop
+			{
+				get { return 22; }
+			}
+
+			public event EventHandler Event;
+
+			public void CallEvent()
+			{
+				Event(this, EventArgs.Empty);
+			}
+		}
+
+		[Test]
+		public void Test()
+		{
+			var duck  = DuckTyping.Implement<TestInterface> (new TestClass());
+			var same  = DuckTyping.Implement<TestInterface> (duck);
+			var duck2 = DuckTyping.Implement<TestInterface2>(same);
+
+			Assert.AreSame(duck, same);
+
+			int value;
+			duck.Method(33, out value);
+
+			Assert.AreEqual(33, value);
+			Assert.AreEqual(42, duck.Method(40));
+			Assert.AreEqual(22, duck.Prop);
+
+			duck.Event += duck_Event;
+
+			duck.CallEvent();
+
+			Assert.AreEqual(55, eventValue);
+
+			duck2.I2Method(33, out value);
+
+			Assert.AreEqual(33, value);
+			Assert.AreEqual(42, duck2.Method(40));
+		}
+
+		int eventValue;
+
+		void duck_Event(object sender, EventArgs e)
+		{
+			eventValue = 55;
+		}
+
+		public class Child1 : TestClass
+		{
+			public new int Method(int value)
+			{
+				return value + 5;
+			}
+		}
+
+		public class Child2 : TestClass
+		{
+			public new int Method(int value)
+			{
+				return value + 10;
+			}
+		}
+
+		[Test]
+		public void BulkTest()
+		{
+			var ducks  = DuckTyping.Implement<TestInterface,TestClass>(new Child1(), new Child2());
+
+			Assert.IsNotEmpty(ducks);
+			Assert.AreEqual(42, ducks[0].Method(40));
+			Assert.AreEqual(42, ducks[1].Method(40));
+		}
+
+		[Test]
+		public void BulkTest2()
+		{
+			var ducks = DuckTyping.Implement<TestInterface>(new Child1(), new Child2());
+
+			Assert.IsNotEmpty(ducks);
+			Assert.AreEqual(45, ducks[0].Method(40));
+			Assert.AreEqual(50, ducks[1].Method(40));
+		}
+		
+		[Test]
+		public void InheritanceTest()
+		{
+			var duck1 = DuckTyping.Implement<TestInterface>(new Child1());
+			var duck2 = DuckTyping.Implement<TestInterface>(new Child2());
+
+			Assert.AreNotSame(duck1, duck2);
+			Assert.AreEqual(45, duck1.Method(40));
+			Assert.AreEqual(50, duck2.Method(40));
+		}
+
+		[Test]
+		public void InheritanceTest2()
+		{
+			var duck1 = DuckTyping.Implement<TestInterface,TestClass>(new Child1());
+			var duck2 = DuckTyping.Implement<TestInterface,TestClass>(new Child2());
+
+			Assert.AreNotSame(duck1, duck2);
+			Assert.AreEqual(42, duck1.Method(40));
+			Assert.AreEqual(42, duck2.Method(40));
+		}
+
+		public class StaticClass
+		{
+			public static int Method(int value)
+			{
+				return value + 3;
+			}
+		}
+
+		[Test]
+		public void StaticTest()
+		{
+			DuckTyping.AllowStaticMembers = true;
+
+			var duck = DuckTyping.Implement<TestInterface,StaticClass>(new StaticClass());
+
+			Assert.AreEqual(43, duck.Method(40));
+		}
+
+		public struct TestStruct
+		{
+			public int Method(int value)
+			{
+				return value + 3;
+			}
+		}
+
+		[Test]
+		public void StructTest()
+		{
+			DuckTyping.AllowStaticMembers = true;
+
+			var duck = DuckTyping.Implement<TestInterface>(new TestStruct());
+
+			Assert.AreEqual(43, duck.Method(40));
+		}
+
+
+		public interface GenericInterface<T>
+		{
+			T Method(T value);
+		}
+
+		public class GenericClass<T>
+		{
+			public T Method(T value)
+			{
+				return value;
+			}
+
+			public void I2Method(int v1, out int v2)
+			{
+				v2 = v1 + 2;
+			}
+		}
+
+		[Test]
+		public void GenericInterfaceTest()
+		{
+			var o     = new GenericClass<int>();
+			var duck  = DuckTyping.Implement<GenericInterface<int>>(o);
+			var duck2 = DuckTyping.Implement<TestInterface2> (o);
+
+			Assert.AreEqual(40, duck .Method(40));
+			Assert.AreEqual(40, duck2.Method(40));
+
+			int value;
+			duck2.I2Method (33, out value);
+			Assert.AreEqual(35, value);
+		}
+
+		[Test, ExpectedException(typeof(ArgumentNullException))]
+		public void InvalidArgTest1()
+		{
+			TestInterface o = null;
+
+			var duck1 = DuckTyping.Implement<TestInterface>(o);
+			var duck2 = (TestInterface)DuckTyping.Implement(typeof(TestInterface), o);
+		}
+
+		interface NonPublicInterface
+		{
+		}
+
+		[Test, ExpectedException(typeof(ArgumentException))]
+		public void InvalidArgTest2()
+		{
+			var duck  = (NonPublicInterface)DuckTyping.Implement(typeof(NonPublicInterface), new TestClass());
+		}
+
+		[Test, ExpectedException(typeof(ArgumentException))]
+		public void InvalidArgTest3()
+		{
+			var duck  = (Child1)DuckTyping.Implement(typeof(Child1), new Child2());
+		}
+
+		[Test, ExpectedException(typeof(ArgumentException))]
+		public void InvalidArgTest4()
+		{
+			var duck  = (TestInterface)DuckTyping.Implement(typeof(TestInterface), typeof(TestInterface), new TestClass());
+		}
+
+		#region Aggregate
+
+		public interface IAggregatable
+		{
+			int Method1();
+			int Method2();
+		}
+
+		public interface IClass1
+		{
+			int Method1();
+			int Method3();
+		}
+
+		public interface IClass2
+		{
+			int Method2();
+		}
+
+		public class AggregateClass1: IClass1
+		{
+			public int Method1() { return 1; }
+			public int Method3() { return 3; }
+		}
+
+		public class AggregateClass2: IClass2
+		{
+			public int Method2() { return 2; }
+		}
+
+		[Test]
+		public void AggregateTest()
+		{
+			var duck  = DuckTyping.Aggregate<IAggregatable>(new AggregateClass1(), new AggregateClass2());
+
+			Assert.IsNotNull(duck);
+
+			Assert.AreEqual(1, duck.Method1());
+			Assert.AreEqual(2, duck.Method2());
+
+			// It is still possible to get access
+			// to an interface of an underlying object.
+			//
+			var cls2 = DuckTyping.Implement<IClass2>(duck);
+
+			Assert.IsNotNull(cls2);
+			Assert.AreEqual(2, cls2.Method2());
+
+			// Even to switch from one aggregated object to another
+			//
+			var cls1 = DuckTyping.Implement<IClass1>(cls2);
+
+			Assert.IsNotNull(cls1);
+			Assert.AreEqual(1, cls1.Method1());
+			Assert.AreEqual(3, cls1.Method3());
+		}
+
+		[Test]
+		public void MissedMethodsAggregateTest()
+		{
+			var duck = DuckTyping.Aggregate<IClass1>(new Version(1,0), Guid.NewGuid());
+
+			Assert.That(duck, Is.Not.Null);
+
+			// Neither System.Guid nor System.Version will ever have Method1.
+			//
+			Assert.That(duck.Method1(), Is.EqualTo(0));
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Patterns/MustImplementAttributeTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,141 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Patterns;
+using BLToolkit.TypeBuilder;
+
+namespace Patterns
+{
+	[TestFixture]
+	public class MustImplementAttributeTest
+	{
+		[MustImplement]
+		public interface IRequiredInterface
+		{
+			int RequiredMethod();
+			[MustImplement(false)]
+			int SameMethodName();
+			[MustImplement(false)]
+			int OptionalMethod();
+		}
+
+		public interface ISameMethodNameInterface
+		{
+			[MustImplement]
+			int SameMethodName();
+		}
+
+		public interface IIntermediateInterface : IRequiredInterface, ISameMethodNameInterface
+		{
+			[MustImplement(false, ThrowException = true)]
+			new int OptionalMethod();
+		}
+
+		public interface IOptionalInterface : IIntermediateInterface
+		{
+		}
+
+		[MustImplement(false, ThrowException = false)]
+		public interface IOptionalInterfaceNoException : IRequiredInterface
+		{
+			int OtherOptionalMethod();
+		}
+
+		[MustImplement(true, ThrowException = false)]
+		public interface IOtherOptionalInterface
+		{
+			int SameMethodName();
+		}
+
+		public struct TestClass
+		{
+			public int RequiredMethod()
+			{
+				return 1;
+			}
+
+			public int SameMethodName()
+			{
+				return 2;
+			}
+		}
+
+		public class EmptyClass
+		{
+		}
+
+		[Test]
+		public void Test()
+		{
+			var duck = DuckTyping.Implement<IOptionalInterfaceNoException> (new TestClass());
+
+			Assert.AreEqual(1, duck.RequiredMethod());
+			Assert.AreEqual(0, duck.OtherOptionalMethod());
+			Assert.AreEqual(2, duck.SameMethodName());
+
+			duck = DuckTyping.Aggregate<IOptionalInterfaceNoException>(new TestClass(), string.Empty, Guid.Empty);
+
+			Assert.AreEqual(1, duck.RequiredMethod());
+			Assert.AreEqual(0, duck.OtherOptionalMethod());
+			Assert.AreEqual(2, duck.SameMethodName());
+		}
+
+		[Test, ExpectedException(typeof(InvalidOperationException))]
+		public void RuntimeExceptionTest()
+		{
+			var duck = DuckTyping.Implement<IOptionalInterface>(new TestClass());
+
+			Assert.AreEqual(1, duck.RequiredMethod());
+
+			// Exception here.
+			//
+			duck.OptionalMethod();
+		}
+
+		[Test, ExpectedException(typeof(InvalidOperationException))]
+		public void RuntimeAggregateExceptionTest()
+		{
+			var duck = DuckTyping.Aggregate<IOptionalInterface>(new TestClass(), new EmptyClass());
+
+			Assert.AreEqual(1, duck.RequiredMethod());
+
+			// Exception here.
+			//
+			duck.OptionalMethod();
+		}
+
+		[Test, ExpectedException(typeof(TypeBuilderException))]
+		public void BuildtimeExceptionTest()
+		{
+			// Exception here.
+			//
+			var duck1 = DuckTyping.Implement<IOptionalInterface> (string.Empty);
+		}
+
+		[Test, ExpectedException(typeof(TypeBuilderException))]
+		public void BuildtimeAggregateExceptionTest()
+		{
+			// Exception here.
+			//
+			var duck1 = DuckTyping.Aggregate<IOptionalInterface>(string.Empty, Guid.Empty);
+		}
+
+		[Test]
+		public void AsLikeBehaviourTest()
+		{
+			var duck = DuckTyping.Implement<IOtherOptionalInterface>(new TestClass());
+
+			Assert.IsNotNull(duck);
+
+			duck = DuckTyping.Implement<IOtherOptionalInterface>(new EmptyClass());
+			Assert.IsNull(duck);
+
+			duck = DuckTyping.Implement<IOtherOptionalInterface>(new EmptyClass());
+			Assert.IsNull   (duck);
+
+			duck = DuckTyping.Aggregate<IOtherOptionalInterface>(new EmptyClass(), string.Empty);
+			Assert.IsNull   (duck);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,31 @@
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("UnitTests.CS.2")]
+[assembly: AssemblyDescription("Business Logic Toolkit Unit tests")]
+[assembly: AssemblyProduct("Business Logic Toolkit")]
+[assembly: AssemblyCopyright("\xA9 2002-2012 www.bltoolkit.net")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM componenets.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("03fc8b70-85d3-4331-a695-2c64f1f6c6dd")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion    ("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Properties/Settings.Designer.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,36 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.1
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace UnitTests.CS.Properties {
+    
+    
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+        
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+        
+        public static Settings Default {
+            get {
+                return defaultInstance;
+            }
+        }
+        
+        [global::System.Configuration.ApplicationScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.ConnectionString)]
+        [global::System.Configuration.DefaultSettingValueAttribute("Data Source=(local);Initial Catalog=BLToolkitData;Integrated Security=True")]
+        public string BLToolkitDataConnectionString {
+            get {
+                return ((string)(this["BLToolkitDataConnectionString"]));
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Properties/Settings.settings	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,14 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="UnitTests.CS.Properties" GeneratedClassName="Settings">
+  <Profiles />
+  <Settings>
+    <Setting Name="BLToolkitDataConnectionString" Type="(Connection string)" Scope="Application">
+      <DesignTimeValue Profile="(Default)">&lt;?xml version="1.0" encoding="utf-16"?&gt;
+&lt;SerializableConnectionString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
+  &lt;ConnectionString&gt;Data Source=(local);Initial Catalog=BLToolkitData;Integrated Security=True&lt;/ConnectionString&gt;
+  &lt;ProviderName&gt;System.Data.SqlClient&lt;/ProviderName&gt;
+&lt;/SerializableConnectionString&gt;</DesignTimeValue>
+      <Value Profile="(Default)">Data Source=(local);Initial Catalog=BLToolkitData;Integrated Security=True</Value>
+    </Setting>
+  </Settings>
+</SettingsFile>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Reflection/Emit/MethodBuilderHelperTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,86 @@
+using System;
+using System.Reflection;
+
+using NUnit.Framework;
+
+using BLToolkit.Reflection.Emit;
+
+namespace Reflection.Emit
+{
+	[TestFixture]
+	public class MethodBuilderHelperTest
+	{
+		public abstract class TestObject
+		{
+			public    abstract int Property { get; }
+			protected abstract int Method1(float f);
+			public    abstract int Method2(float f);
+
+			public int Method3(float f) { return Method1(f); }
+		}
+
+		[Test]
+		public void Test()
+		{
+			TypeBuilderHelper typeBuilder = 
+				new AssemblyBuilderHelper("HelloWorld.dll").DefineType("Test", typeof(TestObject));
+
+			// Property
+			//
+			PropertyInfo        propertyInfo  = typeof(TestObject).GetProperty("Property");
+			MethodBuilderHelper methodBuilder = typeBuilder.DefineMethod(propertyInfo.GetGetMethod());
+			EmitHelper          emit          = methodBuilder.Emitter;
+
+			emit
+				.ldc_i4(10)
+				.ret()
+				;
+
+			// Method1
+			//
+			MethodInfo methodInfo = typeof(TestObject).GetMethod(
+				"Method1", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
+
+			methodBuilder = typeBuilder.DefineMethod(methodInfo);
+			emit          = methodBuilder.Emitter;
+
+			emit
+				.ldc_i4(10)
+				.ret()
+				;
+
+			// Method2
+			//
+			methodInfo = typeof(TestObject).GetMethod("Method2", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
+
+			methodBuilder = typeBuilder.DefineMethod(
+				"Method2",
+				MethodAttributes.Virtual |
+				MethodAttributes.Public |
+				MethodAttributes.HideBySig	|
+				MethodAttributes.PrivateScope |
+				MethodAttributes.VtableLayoutMask,
+				typeof(int),
+				new Type[] { typeof(float) });
+
+			typeBuilder.TypeBuilder.DefineMethodOverride(methodBuilder, methodInfo);
+
+			emit = methodBuilder.Emitter;
+
+			emit
+				.ldc_i4(10)
+				.ret()
+				;
+
+			// Create type.
+			//
+			Type type = typeBuilder.Create();
+
+			TestObject obj = (TestObject)Activator.CreateInstance(type);
+
+			Assert.AreEqual(10, obj.Property);
+			Assert.AreEqual(10, obj.Method3(0));
+			Assert.AreEqual(10, obj.Method2(0));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Reflection/ExtendedPropertyDescriptorTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,48 @@
+using System;
+using System.ComponentModel;
+
+using NUnit.Framework;
+
+using BLToolkit.Reflection;
+
+namespace Reflection
+{
+	[TestFixture]
+	public class ExtendedPropertyDescriptorTest
+	{
+		public class RootType
+		{
+			private Type1 _type1 = new Type1();
+			public  Type1  Type1 { get { return _type1; } }
+		}
+
+		public class Type1
+		{
+			private Type2 _type2 = new Type2();
+			public  Type2  Type2 { get { return _type2; } }
+		}
+
+		public class Type2
+		{
+			public string Name
+			{
+				get { return "test";  }
+			}
+		}
+
+		[Test]
+		public void Test()
+		{
+			TypeAccessor ta = TypeAccessor.GetAccessor(typeof(RootType));
+
+			PropertyDescriptorCollection col  = ta.CreateExtendedPropertyDescriptors(null, null);
+			PropertyDescriptor           prop = col["Type1+Type2+Name"];
+
+			RootType obj = new RootType();
+
+			object value = prop.GetValue(obj);
+
+			Assert.AreEqual("test", value);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Reflection/Extension/DefaultValueTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,117 @@
+using System;
+using System.IO;
+
+using NUnit.Framework;
+
+using BLToolkit.Mapping;
+using BLToolkit.Reflection.Extension;
+
+namespace Reflection.Extension
+{
+	[TestFixture]
+	public class DefaultValueTest
+	{
+		[SetUp]
+		public void SetUp()
+		{
+			Map.DefaultSchema = new DefaultMappingSchema();
+
+			using (StreamWriter sw = File.CreateText("Mapping.xml"))
+			{
+				sw.WriteLine(@"<?xml version='1.0' encoding='utf-8' ?>
+<Types xmlns='urn:schemas-bltoolkit-net:typeext'>
+    <Type Name='Enum3'>
+        <Member Name='Value1' MapValue='1' MapValue-Type='System.String' />
+        <Member Name='Value2' MapValue='3' MapValue-Type='System.String' DefaultValue=''/>
+    </Type>
+    <Type Name='Enum4'>
+        <Member Name='Value1' MapValue='1' MapValue-Type='System.String' />
+        <Member Name='Value2' MapValue='3' MapValue-Type='System.String' DefaultValue=''/>
+    </Type>
+    <Type Name='Dest'>
+        <Member Name='Field2'>
+            <MapValue Value='1' OrigValue='Value1' />
+            <MapValue Value='2' OrigValue='Value2' />
+            <DefaultValue Value='Value1' />
+        </Member>
+        <Member Name='Field3' DefaultValue='Value1'>
+            <MapValue Value='1' OrigValue='Value1' />
+            <MapValue Value='2' OrigValue='Value2' />
+        </Member>
+    </Type>
+</Types>");
+			}
+		}
+
+		[TearDown]
+		public void TearDown()
+		{
+			File.Delete("Mapping.xml");
+		}
+
+		public enum Enum1
+		{
+			[MapValue("1")]               Value1 = 11,
+			[MapValue("2"), DefaultValue] Value2 = 12
+		}
+
+		[MapValue(Enum2.Value1, "1")]
+		[MapValue(Enum2.Value2, "2")]
+		[DefaultValue(Enum2.Value2)]
+		public enum Enum2
+		{
+			Value1,
+			Value2
+		}
+
+		public enum Enum3
+		{
+			Value1,
+			Value2
+		}
+
+		public enum Enum4
+		{
+			[MapValue("1")]               Value1,
+			[MapValue("2"), DefaultValue] Value2
+		}
+
+		public class Source
+		{
+			public string Field1 = "11";
+			public string Field2 = "22";
+			public string Field3 = "33";
+		}
+
+		public class Dest
+		{
+			public Enum1 Field1;
+			public Enum1 Field2;
+			public Enum2 Field3;
+		}
+
+		[Test]
+		public void Test1()
+		{
+			Map.Extensions = TypeExtension.GetExtensions("Mapping.xml");
+
+			Enum1 e1 = (Enum1)Map.ValueToEnum("3", typeof(Enum1));
+			Assert.AreEqual(Enum1.Value2, e1);
+
+			Enum2 e2 = (Enum2)Map.ValueToEnum("3", typeof(Enum2));
+			Assert.AreEqual(Enum2.Value2, e2);
+
+			Enum3 e3 = (Enum3)Map.ValueToEnum("4", typeof(Enum3));
+			Assert.AreEqual(Enum3.Value2, e3);
+
+			Enum4 e4 = (Enum4)Map.ValueToEnum("4", typeof(Enum4));
+			Assert.AreEqual(Enum4.Value2, e4);
+
+			Dest o = (Dest)Map.ObjectToObject(new Source(), typeof(Dest));
+
+			Assert.AreEqual(Enum1.Value2, o.Field1);
+			Assert.AreEqual(Enum1.Value1, o.Field2);
+			Assert.AreEqual(Enum2.Value1, o.Field3);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Reflection/Extension/ExtensionTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,130 @@
+using System.IO;
+
+using NUnit.Framework;
+
+using BLToolkit.Mapping;
+using BLToolkit.Reflection.Extension;
+using System.Collections.Generic;
+using System.Xml;
+
+namespace Reflection.Extension
+{
+	[TestFixture]
+	public class ExtensionTestTest
+	{
+		[SetUp]
+		public void SetUp()
+		{
+			Map.DefaultSchema = new DefaultMappingSchema();
+
+			using (StreamWriter sw = File.CreateText("Mapping.xml"))
+			{
+				sw.WriteLine(@"<?xml version='1.0' encoding='utf-8' ?>
+<Types xmlns='urn:schemas-bltoolkit-net:typeext'>
+    <Type Name='Dest'>
+        <Member Name='Field3'>
+            <MapValue Value='-1-' OrigValue='1' OrigValue-Type='System.Double' />
+            <MapValue Value='-2-' OrigValue='2' OrigValue-Type='System.Double' />
+        </Member>
+    </Type>
+    <Type Name='TriState'>
+        <Member Name='Yes'           MapValue='yes'   MapValue-Type='System.String' />
+        <Member Name='No'>
+            <MapValue Value='no' Type='System.String' />
+            <MapValue Type='System.String'>N</MapValue>
+        </Member>
+        <Member Name='Maybe'         MapValue='xz'    MapValue-Type='System.String' />
+        <Member Name='NotApplicable' MapValue-Type='System.String' MapValue='(n/a)' DefaultValue='' />
+    </Type>
+    <Type Name='System.Double'>
+        <MapValue OrigValue='1' OrigValue-Type='System.Double' Value='One' Type='System.String' />
+        <MapValue OrigValue='2' Value='Two' Type='System.String' />
+        <DefaultValue Value='54' />
+    </Type>
+    <Type Name='TestType'>
+        <Member Name='SomeRelation'>
+            <Relation>
+                <MasterIndex Name='MasterIndex1'/>
+                <MasterIndex Name='MasterIndex2'/>
+                <SlaveIndex  Name='SlaveIndex1'/>
+                <SlaveIndex  Name='SlaveIndex2'/>
+           </Relation>
+        </Member>
+    </Type>
+</Types>");
+			}
+		}
+
+		[TypeExtension("TriState")]
+		public enum TriState { Yes, No, NotApplicable };
+
+		public class Source
+		{
+			public string Field1 = "no";
+			public string Field2 = "One";
+			public string Field3 = "-2-";
+			public string Field4 = "***";
+		}
+
+		[TypeExtension("Dest")]
+		public class Dest
+		{
+			private TriState _field1 = TriState.NotApplicable;
+			public  TriState  Field1
+			{
+				get { return _field1;  }
+				set { _field1 = value; }
+			}
+
+			public double Field2;
+			public double Field3;
+			public double Field4;
+		}
+
+		[Test]
+		public void Test()
+		{
+			Map.Extensions = TypeExtension.GetExtensions("Mapping.xml");
+
+			object o = Map.Extensions["TriState"]["Yes"]["MapValue"].Value;
+
+			Assert.AreEqual("yes", o);
+
+			Source  s = new Source();
+			Dest    d = (Dest)Map.ObjectToObject(s, typeof(Dest));
+
+			Assert.AreEqual(TriState.No,            d.Field1);
+			Assert.AreEqual( 1,                     d.Field2);
+			Assert.AreEqual( 2,                     d.Field3);
+			Assert.AreEqual(54,                     d.Field4);
+			Assert.AreEqual(TriState.NotApplicable, Map.ValueToEnum("1234", typeof(TriState)));
+		}
+
+		public class TestType
+		{
+			public object SomeRelation;
+		}
+
+		[Test]
+		public void MultiKeyRelationTest()
+		{
+			MappingSchema ms = new MappingSchema();
+			ms.Extensions = TypeExtension.GetExtensions("Mapping.xml");
+
+			bool isSet = false;
+
+			List<MapRelationBase> relations = ms.MetadataProvider.GetRelations(ms, ms.Extensions, typeof(TestType), null, out isSet);
+
+			Assert.IsTrue(isSet);
+			Assert.AreEqual(1, relations.Count);
+			Assert.AreEqual(2, relations[0].MasterIndex.Fields.Length);
+			Assert.AreEqual(2, relations[0].SlaveIndex .Fields.Length);
+		}
+
+		[TearDown]
+		public void TearDown()
+		{
+			File.Delete("Mapping.xml");
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Reflection/ObjectFactoryAttributeTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,121 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Reflection;
+using System.Reflection;
+using System.Collections.Generic;
+using BLToolkit.Mapping;
+
+namespace Reflection
+{
+	[TestFixture]
+	public class ObjectFactoryAttributeTest
+	{
+		[ObjectFactory(typeof(TestObject.Factory))]
+		public class TestObject
+		{
+			public TestObject()
+			{
+				throw new InvalidOperationException();
+			}
+
+			private TestObject(int n)
+			{
+				Number = n;
+			}
+
+			public int Number;
+
+			public class Factory : IObjectFactory
+			{
+				object IObjectFactory.CreateInstance(TypeAccessor typeAccessor, InitContext context)
+				{
+					return new TestObject(53);
+				}
+			}
+		}
+
+		[Test]
+		public void Test()
+		{
+			TestObject o = (TestObject)TypeAccessor.CreateInstanceEx(typeof(TestObject));
+
+			Assert.AreEqual(53, o.Number);
+		}
+
+		[ObjectFactory(typeof(Record.Factory))]
+		public class Record
+		{
+			public class Factory : IObjectFactory
+			{
+				#region IObjectFactory Members
+
+				public object CreateInstance(TypeAccessor typeAccessor, InitContext context)
+				{
+					Type t = typeAccessor.Type;
+
+					ConstructorInfo[] ctis = t.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
+					ConstructorInfo   constructor = ctis[0];
+
+					foreach (ConstructorInfo ci in ctis)
+					{
+						if (constructor.GetParameters().Length < ci.GetParameters().Length)
+							constructor = ci;
+					}
+					
+					ParameterInfo[] pis   = constructor.GetParameters();
+					object[]        param = new object[pis.Length];
+
+					for(int i = 0; i < pis.Length; i++)
+					{
+						ParameterInfo pi      = pis[i];
+						Type          pType   = pi.ParameterType;
+						string        pName   = pi.Name;
+						int           ordinal = context.DataSource.GetOrdinal(pName);
+
+						if (ordinal >= 0)
+						{
+							param[i] = context.MappingSchema.ConvertChangeType(
+								context.DataSource.GetValue(context.SourceObject, ordinal),
+								pType);
+						}
+						else
+							param[i] = context.MappingSchema.GetDefaultValue(pType);
+					}
+
+					context.StopMapping = true;
+
+					return constructor.Invoke(param);
+
+				}
+
+				#endregion
+			}
+
+			public Record(string name, int value)
+			{
+				_name = name;
+				_value = value;
+			}
+
+			private string _name;
+			public  string  Name { get { return _name; } }
+
+			private int _value;
+			public  int  Value { get { return _value; } }
+		}
+
+		[Test]
+		public void RecordFactoryTest()
+		{
+			Record s = new Record("Elvis", 101);
+			Record r = Map.ObjectToObject<Record>(s);
+
+			Assert.IsNotNull(r);
+
+			Assert.AreEqual(s.Value, r.Value);
+			Assert.AreEqual(s.Name,  r.Name);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Reflection/TypeAccessorTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,243 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Windows;
+
+using NUnit.Framework;
+
+using BLToolkit.Reflection;
+
+using Expression = System.Linq.Expressions.Expression;
+
+namespace Reflection
+{
+	[TestFixture]
+	public class TypeAccessorTest
+	{
+		public class TestObject1
+		{
+			public int    IntField = 10;
+			public string StrField = "10";
+
+			public int    IntProperty
+			{
+				get { return IntField * 2;  }
+				set { IntField = value / 2; }
+			}
+			public string StrProperty { get { return StrField + "2"; } }
+
+			public int    SetProperty { set {} }
+
+			protected int ProtectedProperty
+			{
+				get { return IntField * 2;  }
+				set { IntField = value / 2; }
+			}
+
+			public int    ProtectedSetter
+			{
+				          get { return IntField; }
+				protected set { IntField = value;}
+			}
+		}
+
+		[Test]
+		public void HasGetter()
+		{
+			var ta = TypeAccessor.GetAccessor(typeof(TestObject1));
+
+			Assert.IsTrue (ta["IntField"].   HasGetter);
+			Assert.IsTrue (ta["IntProperty"].HasGetter);
+			Assert.IsTrue (ta["StrField"].   HasGetter);
+			Assert.IsTrue (ta["StrProperty"].HasGetter);
+			
+			Assert.IsFalse(ta["SetProperty"].HasGetter);
+			Assert.IsNull (ta["ProtectedProperty"]);
+			Assert.IsTrue (ta["ProtectedSetter"].HasGetter);
+		}
+
+		[Test]
+		public void HasSetter()
+		{
+			var ta = TypeAccessor.GetAccessor(typeof(TestObject1));
+
+			Assert.IsTrue (ta["IntField"].   HasSetter);
+			Assert.IsTrue (ta["IntProperty"].HasSetter);
+			Assert.IsTrue (ta["StrField"].   HasSetter);
+			Assert.IsFalse(ta["StrProperty"].HasSetter);
+			
+			Assert.IsTrue (ta["SetProperty"].HasSetter);
+			Assert.IsNull (ta["ProtectedProperty"]);
+			Assert.IsFalse(ta["ProtectedSetter"].HasSetter);
+		}
+
+		[Test]
+		public void GetValue()
+		{
+			var ta = TypeAccessor.GetAccessor(typeof(TestObject1));
+			var o  = (TestObject1)ta.CreateInstance();
+
+			Assert.AreEqual(10,    ta["IntField"].   GetValue(o));
+			Assert.AreEqual(20,    ta["IntProperty"].GetValue(o));
+			Assert.AreEqual("10",  ta["StrField"].   GetValue(o));
+			Assert.AreEqual("102", ta["StrProperty"].GetValue(o));
+		}
+
+		public abstract class TestObject2
+		{
+			public int IntField = 10;
+
+			public abstract int    IntProperty { get; set; }
+			public abstract string StrProperty { get; set; }
+			public abstract int    SetProperty {      set; }
+			public abstract int    GetProperty { get;      }
+
+			protected int          ProtField;
+			protected int          ProtProperty1 { get { return 0; } }
+			protected abstract int ProtProperty2 { get; set; }
+		}
+
+		[Test]
+		public void HasAbstractGetter()
+		{
+			var ta = TypeAccessor.GetAccessor(typeof(TestObject2));
+
+			Assert.IsTrue(ta["IntField"].     HasGetter);
+			Assert.IsTrue(ta["IntProperty"].  HasGetter);
+			Assert.IsTrue(ta["StrProperty"].  HasGetter);
+			Assert.IsTrue(ta["SetProperty"].  HasGetter);
+			Assert.IsTrue(ta["ProtProperty2"].HasGetter);
+		}
+
+		[Test]
+		public void GetAbstractValue()
+		{
+			var ta = TypeAccessor.GetAccessor(typeof(TestObject2));
+			var o  = (TestObject2)ta.CreateInstance();
+
+			o.IntProperty = 20;
+			o.StrProperty = "10";
+			o.SetProperty = 30;
+
+			Assert.AreEqual(20,   ta["IntProperty"].GetValue(o));
+			Assert.AreEqual("10", ta["StrProperty"].GetValue(o));
+			Assert.AreEqual(30,   ta["SetProperty"].GetValue(o));
+		}
+
+		[Test]
+		public void HasAbstractSetter()
+		{
+			var ta = TypeAccessor.GetAccessor(typeof(TestObject2));
+
+			Assert.IsTrue(ta["IntField"].     HasSetter);
+			Assert.IsTrue(ta["IntProperty"].  HasSetter);
+			Assert.IsTrue(ta["StrProperty"].  HasSetter);
+			Assert.IsTrue(ta["GetProperty"].  HasSetter);
+			Assert.IsTrue(ta["ProtProperty2"].HasSetter);
+		}
+
+		[Test]
+		public void SetAbstractValue()
+		{
+			var ta = TypeAccessor.GetAccessor(typeof(TestObject2));
+			var o  = (TestObject2)ta.CreateInstance();
+
+			ta["IntField"].     SetValue(o, 10);
+			ta["IntProperty"].  SetValue(o, 20);
+			ta["StrProperty"].  SetValue(o, "30");
+			ta["GetProperty"].  SetValue(o, 40);
+			ta["ProtProperty2"].SetValue(o, 50);
+
+			Assert.AreEqual(10,   ta["IntField"].     GetValue(o));
+			Assert.AreEqual(20,   ta["IntProperty"].  GetValue(o));
+			Assert.AreEqual("30", ta["StrProperty"].  GetValue(o));
+			Assert.AreEqual(40,   ta["GetProperty"].  GetValue(o));
+			Assert.AreEqual(50,   ta["ProtProperty2"].GetValue(o));
+		}
+
+		[Test]
+		public void ProtectedMembers()
+		{
+			var ta = TypeAccessor.GetAccessor(typeof(TestObject2));
+
+			Assert.IsNull   (ta["ProtField"]);
+			Assert.IsNull   (ta["ProtProperty1"]);
+			Assert.IsNotNull(ta["ProtProperty2"]);
+		}
+
+		public class TestObject3
+		{
+			public int       IntField    = 10;
+			public string    StringField = "256";
+			public ArrayList ListField   = new ArrayList();
+			public ArrayList NullField   = null;
+		}
+
+		[Test]
+		public void Write()
+		{
+			var o = new TestObject3();
+
+			TypeAccessor.WriteConsole(o);
+			TypeAccessor.WriteDebug  (o);
+		}
+
+		[Test]
+		public void AccessMember()
+		{
+			var ta  = TypeAccessor.GetAccessor<TestObject3>();
+			var ma  = ta["IntField"];
+			var obj = new TestObject3();
+			var val = ma.GetInt32(obj);
+
+			Assert.AreEqual(obj.IntField, val);
+		}
+
+		static class MemberAccessors<TObject,TValue>
+		{
+			public static readonly Dictionary<string,Func<TObject,TValue>> Accessor = new Dictionary<string,Func<TObject,TValue>>();
+		}
+
+		static Func<TObject,TValue> GetAccessor<TObject,TValue>(string name)
+		{
+			Func<TObject,TValue> func;
+
+			if (!MemberAccessors<TObject,TValue>.Accessor.TryGetValue(name, out func))
+			{
+				var param = Expression.Parameter(typeof(TObject), "obj");
+
+				func = Expression.Lambda<Func<TObject,TValue>>(Expression.PropertyOrField(param, name), param).Compile();
+
+				MemberAccessors<TObject,TValue>.Accessor.Add(name, func);
+			}
+
+			return func;
+		}
+
+		[Test]
+		public void AccessMember2()
+		{
+			var accessor = GetAccessor<TestObject3, int>("IntField");
+
+			var obj = new TestObject3();
+
+			Assert.AreEqual(obj.IntField, accessor(obj));
+		}
+
+		[Test]
+		public void PointTest()
+		{
+			var p = new Point();
+
+			foreach (MemberAccessor memberAccessor in TypeAccessor.GetAccessor(typeof(Point)))
+			{
+				memberAccessor.GetValue(p);
+			}
+		}
+
+		public object GetValue(object o)
+		{
+			return ((Point)o).X;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Reflection/TypeAccessorTest2.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,47 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Reflection;
+using BLToolkit.EditableObjects;
+
+namespace Reflection
+{
+	[TestFixture]
+	public class TypeAccessorTest2
+	{
+		public class TestObject
+		{
+			public int Field;
+		}
+
+		[Test]
+		public void Test()
+		{
+			TestObject o1 = TypeAccessor<TestObject>.CreateInstance();
+			TestObject o2 = TypeAccessor.CreateInstance<TestObject>();
+		}
+
+		public class TestObject1
+		{
+			public int?                             IntField;
+			public Dictionary<int?, List<decimal?>> ListField = new Dictionary<int?, List<decimal?>>();
+		}
+
+		[Test]
+		public void Write()
+		{
+			TestObject1 o = new TestObject1();
+
+			TypeAccessor.WriteConsole(o);
+			TypeAccessor.WriteDebug(o);
+		}
+
+		[Test]
+		public void TestLongName()
+		{
+			EditableList<TestObject> o = TypeAccessor<EditableList<TestObject>>.CreateInstance();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Reflection/TypeAccessorTest3.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,104 @@
+using System;
+using System.Collections.Generic;
+
+using BLToolkit.ComponentModel;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+
+using NUnit.Framework;
+
+namespace Reflection
+{
+	[TestFixture]
+	public class TypeAccessorTest3
+	{
+		class TestObject
+		{
+			private int _field = 15;
+			public  int  Field
+			{
+				get { return _field; }
+			}
+		}
+
+		[Test]
+		public void Test()
+		{
+			var o  = TypeAccessor<TestObject>.CreateInstance();
+			var ma = ExprMemberAccessor.GetMemberAccessor(TypeAccessor<TestObject>.Instance, "_field");
+
+			ma.SetInt32(o, 5);
+
+			Assert.AreEqual(5, o.Field);
+		}
+
+		[Test]
+		public void TestAnonymous()
+		{
+			var o = new { Field1 = 1 };
+			var a = TypeAccessor.GetAccessor(o);
+
+			Assert.AreEqual(1, a["Field1"].GetInt32(o));
+		}
+
+		[MapField("MasterId", "Master.MasterId")]
+		public interface IMaster2
+		{
+			[Relation]
+			Master2 Master
+			{
+				get;
+				set;
+			}
+		}
+
+		[TableName("Master")]
+		public abstract class Master2
+		{
+			[PrimaryKey]
+			public abstract int           MasterId  { get; set; }
+			//[Relation(Destination=typeof(Detail2))]
+			public abstract List<Detail2> Details   { get; set; }
+			public abstract string        Name      { get; set; }
+		}
+
+		[TableName("Detail")]
+		public abstract class Detail2 : IMaster2
+		{
+			[PrimaryKey, MapField("Id")]
+			public abstract int           DetailId  { get; set; }
+			public abstract Master2       Master    { get; set; }
+		}
+
+		[Test]
+		public void InterfaceTest()
+		{
+			var ta  = TypeAccessor<IMaster2>.Instance;
+			var ta2 = TypeAccessor<Detail2>.Instance;
+			var d2  = TypeAccessor<Detail2>.CreateInstance();
+
+			var m = ta2["Master"].GetValue(d2); // OK
+			Assert.IsNotNull(m);
+
+			m = ta["Master"].GetValue(d2); // Exception 
+			Assert.IsNotNull(m);
+		}
+
+		[Test]
+		public void TestITypeDescriptionProviderGetAttributes()
+		{
+			var ta = TypeAccessor<Detail2>.Instance;
+			var typeDescriptionProvider = ta as ITypeDescriptionProvider;
+			Assert.IsNotNull(typeDescriptionProvider);
+
+			typeDescriptionProvider.GetAttributes();
+		}
+
+		[Test]
+		public void ListTest()
+		{
+			var t = TypeAccessor.CreateInstanceEx<List<int>>();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Reflection/TypeHelperTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,239 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Reflection;
+
+using NUnit.Framework;
+
+using BLToolkit.Reflection;
+using BLToolkit.EditableObjects;
+
+namespace Reflection
+{
+	[TestFixture]
+	public class TypeHelperTest
+	{
+		public class Attribute1 : Attribute {}
+		public class Attribute2 : Attribute {}
+		public class Attribute3 : Attribute {}
+		public class Attribute4 : Attribute {}
+
+		public class Attribute5 : Attribute2
+		{
+			public Attribute5(int n)
+			{
+				_n = n;
+			}
+
+			int _n;
+
+			public override string ToString()
+			{
+				return base.ToString() + ":" + _n;
+			}
+		}
+
+		[Attribute1]
+		[Attribute5(2)]
+		public interface IBase1
+		{
+			void Method1();
+		}
+
+		[Attribute5(1)]
+		public interface IBase2
+		{
+			void Method2();
+		}
+
+		[Attribute2]
+		[Attribute5(0)]
+		public class Base : IBase1, IBase2
+		{
+			public void Method1() {}
+			public void Method2() {}
+		}
+
+		[Attribute3]
+		public interface IObject1 : IBase1
+		{
+		}
+
+		[Attribute4]
+		public interface IObject2 : IBase1, IBase2
+		{
+		}
+
+		[Attribute5(2)]
+		public class TestObject : Base, IObject2, IObject1, IBase2
+		{
+			public new void Method2() {}
+		}
+
+		public struct TestStruct<T,V>
+		{
+			public T _t;
+			public V _v;
+		}
+
+		public class TestObject<T> : TestObject
+		{
+			public T Method2(T value)
+			{
+				 return value;
+			}
+
+			public V Method2<V>()
+			{
+				 return default(V);
+			}
+			
+			public V Method3<V>(V value)
+				where V : IConvertible, IFormattable, new()
+			{
+				 return value;
+			}
+
+			public V Method3<V>(Nullable<V> value)
+				where V : struct, IFormattable
+			{
+				 return value.Value;
+			}
+
+			public V Method3<V, Q>(TestStruct<Nullable<V>, Q> value)
+				where V : struct
+				where Q : IFormattable
+			{
+				return default(V);
+			}
+
+			public V Method4<V, Q>(TestStruct<V, Q> value)
+			{
+				return default(V);
+			}
+		}
+
+		[Test]
+		public void GetAttributes()
+		{
+			object[] attrs = new TypeHelper(typeof(TestObject)).GetAttributes();
+
+			for (int i = 0; i < attrs.Length; i++)
+			{
+				object attr = attrs[i];
+				Console.WriteLine("{0}: {1} {2}", i, attr, attr.GetHashCode());
+			}
+
+			Assert.AreEqual(typeof(Attribute5), attrs[0].GetType());
+			Assert.AreEqual(typeof(Attribute5), attrs[1].GetType());
+			Assert.AreEqual(typeof(Attribute4), attrs[2].GetType());
+			Assert.AreEqual(typeof(Attribute3), attrs[3].GetType());
+
+			Assert.IsTrue(
+				typeof(Attribute2) == attrs[4].GetType() && typeof(Attribute5) == attrs[5].GetType() ||
+				typeof(Attribute2) == attrs[5].GetType() && typeof(Attribute5) == attrs[4].GetType());
+
+			Assert.IsTrue(
+				typeof(Attribute1) == attrs[6].GetType() && typeof(Attribute5) == attrs[7].GetType() ||
+				typeof(Attribute1) == attrs[7].GetType() && typeof(Attribute5) == attrs[6].GetType());
+
+			Assert.AreEqual(typeof(Attribute5), attrs[8].GetType());
+		}
+
+		[Test]
+		public void GetAttributes_ByType()
+		{
+			object[] attrs = new TypeHelper(typeof(TestObject)).GetAttributes(typeof(Attribute2));
+
+			foreach (object attr in attrs)
+				Console.WriteLine("{0} {1}", attr, attr.GetHashCode());
+
+			Assert.AreEqual(typeof(Attribute5), attrs[0].GetType());
+			Assert.AreEqual(typeof(Attribute5), attrs[1].GetType());
+
+			Assert.IsTrue(
+				typeof(Attribute2) == attrs[2].GetType() && typeof(Attribute5) == attrs[3].GetType() ||
+				typeof(Attribute2) == attrs[3].GetType() && typeof(Attribute5) == attrs[2].GetType());
+		}
+
+		[Test]
+		public void UnderlyingTypeTest()
+		{
+			Type type;
+
+			type = TypeHelper.GetUnderlyingType(typeof(int?));
+			Assert.AreEqual(typeof(int), type);
+
+			type = TypeHelper.GetUnderlyingType(typeof(DayOfWeek?));
+			Assert.AreEqual(typeof(int), type);
+
+			type = TypeHelper.GetUnderlyingType(typeof(IComparable<int>));
+			Assert.AreEqual(typeof(IComparable<int>), type);
+
+		}
+
+		[Test]
+		public void GenericsTest()
+		{
+			Type testType = typeof (TestObject<int>);
+			TypeHelper helper = new TypeHelper(testType);
+
+			Assert.IsNotNull(helper.GetMethod(true,  "Method2")); // Generic
+			Assert.IsNotNull(helper.GetMethod(false, "Method2")); // Non-generic
+
+			// TestObject<T>.Method2<V>() is a generic method
+			Assert.IsNotNull(helper.GetMethod(true,  "Method2", Type.EmptyTypes));
+			// TestObject.Method2() is not
+			Assert.IsNotNull(helper.GetMethod(false, "Method2", Type.EmptyTypes));
+			// TestObject<T>.Method2(T value) is neither!
+			Assert.IsNotNull(helper.GetMethod(false, "Method2", testType.GetGenericArguments()[0]));
+			// typeof(int) is same as testType.GetGenericArguments()[0]
+			Assert.IsNotNull(helper.GetMethod(false, "Method2", typeof(int)));
+			// Get TestObject<T>.Method3<V>() with constraint type hack
+			Assert.IsNotNull(helper.GetMethod(true,  "Method3", typeof(int)));
+			// Get TestObject<T>.Method3<V>() with constraint violation will fail.
+			Assert.IsNull   (helper.GetMethod(true,  "Method3", typeof(object)));
+			// Get TestObject<T>.Method3<V>() with no types will fail
+			Assert.IsNull   (helper.GetMethod(true,  "Method3", Type.EmptyTypes));
+			// Nullable<> violates IFormattable constraint
+			Assert.IsNull   (helper.GetMethod(true,  "Method3", typeof(Nullable<>)));
+			// Method4 does not define a costraint
+			Assert.IsNotNull(helper.GetMethod(true,  "Method4", typeof(TestStruct<,>)));
+
+			Assert.IsNotNull(helper.GetMethod(true,  "Method3", typeof(Nullable<int>)));
+			Assert.IsNotNull(helper.GetMethod(true,  "Method3", typeof(TestStruct<Nullable<int>, int>)));
+			Assert.IsNull   (helper.GetMethod(true,  "Method3", typeof(TestStruct<Nullable<int>, object>)));
+			Assert.IsNull   (helper.GetMethod(true,  "Method3", typeof(TestStruct<int, int>)));
+
+			Assert.AreEqual (15, helper.GetMethods(     ).Length);  // 15 total
+			Assert.AreEqual (5,  helper.GetMethods(true ).Length);  //  5 generic
+			Assert.AreEqual (10, helper.GetMethods(false).Length); // 10 non-generics
+
+		}
+
+		[Test, ExpectedException(typeof(AmbiguousMatchException))]
+		public void GenericsAmbiguousMatchTest()
+		{
+			// There are more then one Method2 in the TestObject<T> class
+			new TypeHelper(typeof (TestObject<int>)).GetMethod("Method2");
+		}
+
+		public class MyArrayList : ArrayList
+		{
+			public new TestObject this[int i]
+			{
+				get { return (TestObject)base[i]; }
+			}
+		}
+
+		[Test]
+		public void GetListItemType()
+		{
+			Assert.AreEqual(typeof(TestObject), TypeHelper.GetListItemType(new EditableArrayList(typeof(TestObject))));
+			Assert.AreEqual(typeof(TestObject), TypeHelper.GetListItemType(new TestObject[0]));
+			Assert.AreEqual(typeof(TestObject), TypeHelper.GetListItemType(new MyArrayList()));
+			Assert.AreEqual(typeof(TestObject), TypeHelper.GetListItemType(new List<TestObject>()));
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/TestFixtureBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,55 @@
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Data;
+
+using NUnit.Framework;
+
+using BLToolkit.Mapping;
+
+public class TestFixtureBase
+{
+	public static DataTable GetDataTable()
+	{
+		var table = new DataTable();
+
+		table.Columns.Add("ID",   typeof(int));
+		table.Columns.Add("Name", typeof(string));
+		table.Columns.Add("Date", typeof(DateTime));
+		
+		table.Rows.Add(new object[] { 1, "John Pupkin", DateTime.Now });
+		table.Rows.Add(new object[] { 2, "Goblin",      DBNull.Value });
+
+		table.AcceptChanges();
+
+		return table;
+	}
+
+	public static void CompareLists(object obj1, object obj2)
+	{
+		var list1 = obj1 is IListSource? ((IListSource)obj1).GetList(): (IList)obj1;
+		var list2 = obj2 is IListSource? ((IListSource)obj2).GetList(): (IList)obj2;
+
+		Assert.AreEqual(list1.Count, list2.Count);
+
+		for (var i = 0; i < list1.Count; i++)
+		{
+			var o1 = Map.DefaultSchema.GetDataSource(list1[i]);
+			var o2 = Map.DefaultSchema.GetDataSource(list2[i]);
+
+			for (var j = 0; j < o1.Count; j++)
+			{
+				var name = o1.GetName(j);
+
+				for (var k = 0; k < o1.Count; k++)
+				{
+					if (name == o2.GetName(k))
+					{
+						Assert.AreEqual(o1.GetValue(list1[i], j), o2.GetValue(list2[i], k));
+						break;
+					}
+				}
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/TestObject.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,16 @@
+using System;
+
+using BLToolkit.Mapping;
+
+public abstract class TestObject
+{
+	public abstract int      ID   { get; set; }
+	public abstract string   Name { get; set; }
+	[Nullable]
+	public abstract DateTime Date { get; set; }
+
+	public static ObjectMapper ObjectMapper
+	{
+		get { return Map.GetObjectMapper(typeof(TestObject)); }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/TypeBuilder/Builders/ArrayBuilderTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,70 @@
+using NUnit.Framework;
+
+using BLToolkit.TypeBuilder;
+using BLToolkit.Reflection;
+
+namespace TypeBuilder.Builders
+{
+	[TestFixture]
+	public class ArrayBuilderTest
+	{
+		public abstract class TestObject
+		{
+			public abstract int[]    IntArray1 { get; set; }
+			[LazyInstance]
+			public abstract int[]    IntArray2 { get; set; }
+			public abstract byte[][] ByteArray { get; set; }
+
+			// There is a b_u_g in the CLR.
+			// In the file "Rotor2\sscli\clr\src\bcl\system\reflection\emit\signaturehelper.cs" we have:
+			//
+			// else if (clsArgument.IsArray)
+			// {
+			//   if (clsArgument.IsSzArray)
+			//   {
+			//     AddElementType(ELEMENT_TYPE_SZARRAY);
+			//
+			//     AddOneArgTypeHelper(clsArgument.GetElementType());
+			//   }
+			//   else
+			//   {
+			//     AddElementType(ELEMENT_TYPE_ARRAY);
+			//
+			//     AddOneArgTypeHelper(clsArgument.GetElementType());
+			//
+			//     // put the rank information
+			//     AddData(clsArgument.GetArrayRank());
+			//
+			//     AddData(0);
+			//     AddData(0);
+			//   }
+			// }
+			//
+			// As we can see, there is NO record for bounds. And we can do nothing with it.
+			//
+			// To bite this CLR b_u_g we need to do the sunset by our own hands.
+			//
+			private int[,]          _dimArray = new int[1,1];
+			public  int[,]           DimArray
+			{
+				get { return _dimArray;  }
+				set
+				{
+					 _dimArray = value;
+					// IsDirty = true;
+				}
+			}
+		}
+
+		[Test]
+		public void AbstractProperties()
+		{
+			TestObject o = (TestObject)TypeAccessor.CreateInstance(typeof(TestObject));
+
+			Assert.IsNotNull(o.IntArray1);
+			Assert.AreSame(o.IntArray1, o.IntArray2);
+
+			Assert.IsNotNull(o.ByteArray);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/TypeBuilder/Builders/AutoImplementInterfaceTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,190 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+
+namespace TypeBuilder.Builders
+{
+	[TestFixture]
+	public class AutoImplementInterfaceTest
+	{
+		#region Test
+
+		[AutoImplementInterface]
+		public interface Test1
+		{
+			string Name { get; }
+		}
+
+		[Test]
+		public void Test()
+		{
+			TypeAccessor ta = TypeAccessor.GetAccessor(typeof(Test1));
+			Test1 t = (Test1)ta.CreateInstance();
+
+			Dictionary<string, object> dic = new Dictionary<string,object>();
+
+			dic.Add("Name", "John");
+
+			Map.MapSourceToDestination(
+				Map.DefaultSchema.CreateDictionaryMapper(dic), dic,
+				Map.GetObjectMapper(t.GetType()), t);
+
+			Assert.AreEqual("John", t.Name);
+		}
+
+		#endregion
+
+		#region TestException
+
+		public interface Test2
+		{
+			string Name { get; }
+		}
+
+		[Test, ExpectedException(typeof(TypeBuilderException))]
+		public void TestException()
+		{
+			TypeAccessor ta = TypeAccessor.GetAccessor(typeof(Test2));
+			Test2 t = (Test2)ta.CreateInstance();
+		}
+
+		#endregion
+
+		#region TestMemberImpl
+
+		[AutoImplementInterface]
+		public interface Test3
+		{
+			string Name { get; set; }
+		}
+
+		[AutoImplementInterface]
+		public interface Test4
+		{
+			Test3 Test { get; }
+		}
+
+		[Test]
+		public void TestMemberImpl()
+		{
+			Test4 t = TypeAccessor<Test4>.CreateInstance();
+
+			t.Test.Name = "John";
+
+			Assert.AreEqual("John", t.Test.Name);
+		}
+
+		#endregion
+
+		#region Inheritance
+
+		public interface InterfaceBase
+		{
+			string Name { get; set; }
+		}
+
+		public interface Interface1 : InterfaceBase
+		{
+			void Foo();
+		}
+
+		[AutoImplementInterface]
+		public interface Interface2 : Interface1, InterfaceBase
+		{
+			void Bar();
+		}
+
+		[Test]
+		public void TestInheritance()
+		{
+			//TypeFactory.SaveTypes = true;
+
+			Interface2 i2 = TypeAccessor<Interface2>.CreateInstance();
+			Interface1 i1 = i2;
+
+			i1.Foo();
+			i2.Foo();
+			i2.Bar();
+
+			i1.Name = "John";
+
+			Assert.AreEqual("John", i1.Name);
+			Assert.AreEqual("John", i2.Name);
+		}
+
+		#endregion
+
+		#region AssociateTypeTest
+
+		public class MyClass : Interface1
+		{
+			public void Foo() {}
+
+			private string _name;
+			public  string  Name
+			{
+				get { return _name;  }
+				set { _name = value; }
+			}
+
+			public string Address;
+		}
+
+		[Test]
+		public void AssociateTypeTest()
+		{
+			TypeAccessor.AssociateType(typeof(Interface1), typeof(MyClass));
+
+			Interface1 i1 = TypeAccessor<Interface1>.CreateInstance();
+
+			i1.Name = "John";
+
+			Assert.AreEqual("John", i1.Name);
+			Assert.AreEqual("John", TypeAccessor<Interface1>.Instance["Name"].GetValue(i1).ToString());
+		}
+
+		#endregion
+		
+		#region AssociateTypeHandlerTest
+
+		public interface IMy
+		{
+			string Name { get; set; }
+		}
+
+		public class MyImpl : IMy
+		{
+			private string _name;
+			public  string  Name
+			{
+				get { return _name;  }
+				set { _name = value; }
+			}
+		}
+
+
+		[Test]
+		public void AssociateTypeHandlerTest()
+		{
+			TypeAccessor.AssociatedTypeHandler += delegate(Type parent)
+			{
+				if (parent == typeof(IMy)) return typeof(MyImpl);
+				return null;
+			};
+
+			IMy i = TypeAccessor<IMy>.CreateInstance();
+
+			i.Name = "John";
+
+			Assert.AreEqual("John", i.Name);
+			Assert.AreEqual("John", TypeAccessor<IMy>.Instance["Name"].GetValue(i).ToString());
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/TypeBuilder/Builders/DefaultTypeBuilderTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,203 @@
+using System;
+using System.Collections;
+
+using NUnit.Framework;
+
+using BLToolkit.Reflection;
+using BLToolkit.Reflection.Emit;
+using BLToolkit.TypeBuilder;
+using BLToolkit.TypeBuilder.Builders;
+
+namespace TypeBuilder.Builders
+{
+	[TestFixture]
+	public class DefaultTypeBuilderTest
+	{
+		public abstract class TestObject
+		{
+			public    abstract int       Int       { get; set; }
+			public    abstract double    Double    { get; set; }
+			public    abstract DateTime  DateTime  { get; set; }
+			public    abstract ArrayList ArrayList { get; set; }
+
+			protected abstract string this[int i]    { get; set; }
+			protected abstract int    this[string i] { get; set; }
+
+			protected abstract int    Method1(float f);
+			public    abstract int    Method2(float f);
+		}
+
+		[Test]
+		public void AbstractProperties()
+		{
+			TestObject o = (TestObject)TypeAccessor.CreateInstance(typeof(TestObject));
+
+			o.Int    = 100; Assert.AreEqual(100, o.Int);
+			o.Double = 200; Assert.AreEqual(200, o.Double);
+
+			ArrayList list = new ArrayList();
+
+			o.ArrayList = list;
+			Assert.AreSame(list, o.ArrayList);
+		}
+
+		public class AbstractTypeBuilder : AbstractTypeBuilderBase
+		{
+			public override bool IsApplied(BuildContext context, AbstractTypeBuilderList builders)
+			{
+				return context.IsVirtualMethod && context.Step == BuildStep.After;
+			}
+
+			protected override void AfterBuildVirtualMethod()
+			{
+				Context.MethodBuilder.Emitter
+					.ldc_i4 (25)
+					.stloc  (Context.ReturnValue);
+			}
+
+			protected override void BuildType()
+			{
+				ConstructorBuilderHelper cb = Context.TypeBuilder.DefaultConstructor;
+
+				cb = Context.TypeBuilder.TypeInitializer;
+				cb = Context.TypeBuilder.InitConstructor;
+			}
+		}
+
+		public class TestTypeBuilderAttribute : AbstractTypeBuilderAttribute
+		{
+			public override IAbstractTypeBuilder TypeBuilder
+			{
+				get { return new AbstractTypeBuilder(); }
+			}
+		}
+
+		[TestTypeBuilder]
+		public abstract class VirtObject
+		{
+			public virtual int Foo(int i, ref int ii, DateTime d, string s)
+			{
+				ii = i;
+				return 50;
+			}
+		}
+
+		[Test]
+		public void AbstractMethod()
+		{
+			VirtObject o = (VirtObject)TypeAccessor.CreateInstance(typeof(VirtObject));
+
+			int i = 0;
+			int r = o.Foo(10, ref i, DateTime.Now, "");
+
+			Assert.AreEqual(10, i);
+			Assert.AreEqual(25, r);
+		}
+
+		public abstract class DefCtorObject1
+		{
+			protected DefCtorObject1()
+			{
+				Value = 10;
+			}
+
+			public int Value;
+		}
+
+		[Test]
+		public void DefCtorTest1()
+		{
+			DefCtorObject1 o = (DefCtorObject1)TypeAccessor.CreateInstance(typeof(DefCtorObject1));
+
+			Assert.AreEqual(10, o.Value);
+		}
+
+		public abstract class DefCtorObject2
+		{
+			protected DefCtorObject2()
+			{
+				Value = 10;
+			}
+
+			[Parameter(20)]
+			public abstract int Value { get; set; }
+
+		}
+
+		[Test]
+		public void DefCtorTest2()
+		{
+			DefCtorObject2 o = (DefCtorObject2)TypeAccessor.CreateInstance(typeof(DefCtorObject2));
+
+			Assert.AreEqual(10, o.Value);
+		}
+
+		public abstract class InitCtorObject1
+		{
+			protected InitCtorObject1(InitContext init)
+			{
+				Value = 10;
+			}
+
+			public int Value;
+		}
+
+		[Test]
+		public void InitCtorTest1()
+		{
+			InitCtorObject1 o = (InitCtorObject1)TypeAccessor.CreateInstance(typeof(InitCtorObject1));
+
+			Assert.AreEqual(10, o.Value);
+		}
+
+		public abstract class InitCtorObject2
+		{
+			protected InitCtorObject2(InitContext init)
+			{
+				Value = 10;
+			}
+
+			[Parameter(20)]
+			public abstract int Value { get; set; }
+
+			public abstract InitCtorObject1 InitCtor { get; set; }
+
+		}
+
+		[Test]
+		public void InitCtorTest2()
+		{
+			InitCtorObject2 o = (InitCtorObject2)TypeAccessor.CreateInstance(typeof(InitCtorObject2));
+
+			Assert.AreEqual(10, o.Value);
+		}
+
+		public abstract class TestObject2
+		{
+			public abstract int  Int1 { get; set; }
+			public abstract int? Int2 { get; set; }
+
+			private int _Int3;
+			public  virtual int  Int3 { get { return _Int3; } set { _Int3 = value; } }
+
+			private int? _Int4;
+			public virtual int? Int4
+			{
+				get { return _Int4;  }
+				set { _Int4 = value; }
+			}
+		}
+
+		[Test]
+		public void Test()
+		{
+			TestObject2 o = TypeAccessor<TestObject2>.CreateInstance();
+
+			int  i  = o.Int1;
+			int? i2 = o.Int2;
+
+			o.Int1 = 5;
+			o.Int2 = 6;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/TypeBuilder/Builders/IAbstractTypeBuilderTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,129 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Reflection;
+using BLToolkit.Reflection.Emit;
+using BLToolkit.TypeBuilder;
+using BLToolkit.TypeBuilder.Builders;
+
+namespace TypeBuilder.Builders
+{
+	[TestFixture]
+	public class IAbstractTypeBuilderTest
+	{
+		public interface ITest
+		{
+			void      Method();
+			Type      PropertyType      { get; }
+			DateTime  PropertyDateTime  { get; }
+			DayOfWeek PropertyDayOfWeek { get; }
+			int       PropertyInt       { get; set; }
+			void      InitOut(
+				out bool      pbool,
+				out byte      pbyte,
+				out sbyte     psbyte, 
+				out char      pchar,
+				out decimal   pdecimal,
+				out double    pdouble,
+				out float     pfloat,
+				out int       pint,
+				ref uint      puint,
+				out long      plong,
+				out ulong     pulong,
+				out object    pobject,
+				out short     pshort,
+				out ushort    pushort,
+				out string    pstring,
+				out DateTime  pDateTime,
+				out Guid      pGuid,
+				out Type      pType,
+				out DayOfWeek pDayOfWeek);
+		}
+
+		public class AbstractTypeBuilder : AbstractTypeBuilderBase
+		{
+			public override Type[] GetInterfaces() 
+			{
+				return new Type[] { typeof(ITest) };
+			}
+
+			protected override void BuildType()
+			{
+				ConstructorBuilderHelper cb = Context.TypeBuilder.DefaultConstructor;
+
+				cb = Context.TypeBuilder.TypeInitializer;
+				cb = Context.TypeBuilder.InitConstructor;
+			}
+		}
+
+		public class TestTypeBuilderAttribute : AbstractTypeBuilderAttribute
+		{
+			public override BLToolkit.TypeBuilder.Builders.IAbstractTypeBuilder TypeBuilder
+			{
+				get { return new AbstractTypeBuilder(); }
+			}
+		}
+
+		[TestTypeBuilder]
+		public abstract class TestObject
+		{
+			protected abstract string this[int i]    { get; set; }
+			protected abstract int    this[string i] { get; set; }
+		}
+
+		[Test]
+		public void Test()
+		{
+			ITest test = (ITest)TypeAccessor.CreateInstance(typeof(TestObject));
+
+			bool      pbool;
+			byte      pbyte;
+			sbyte     psbyte;
+			char      pchar;
+			decimal   pdecimal;
+			double    pdouble;
+			float     pfloat;
+			int       pint;
+			uint      puint = 15;
+			long      plong;
+			ulong     pulong = 20;
+			object    pobject;
+			short     pshort;
+			ushort    pushort;
+			string    pstring;
+			DateTime  pDateTime;
+			Guid      pGuid;
+			Type      pType;
+			DayOfWeek pDayOfWeek;
+
+			test.InitOut(out pbool, out pbyte, out psbyte, out pchar, out pdecimal, out pdouble,
+				out pfloat, out pint, ref puint, out plong, out pulong, out pobject, out pshort,
+				out pushort, out pstring, out pDateTime, out pGuid, out pType, out pDayOfWeek);
+
+			Console.WriteLine("bool     : {0}", pbool);
+			Console.WriteLine("byte     : {0}", pbyte);
+			Console.WriteLine("sbyte    : {0}", psbyte);
+			//Console.WriteLine("char     : {0}", pchar);
+			Console.WriteLine("decimal  : {0}", pdecimal);
+			Console.WriteLine("double   : {0}", pdouble);
+			Console.WriteLine("float    : {0}", pfloat);
+			Console.WriteLine("int      : {0}", pint);
+			Console.WriteLine("uint     : {0}", puint);
+			Console.WriteLine("long     : {0}", plong);
+			Console.WriteLine("ulong    : {0}", pulong);
+			Console.WriteLine("object   : {0}", pobject);
+			Console.WriteLine("short    : {0}", pshort);
+			Console.WriteLine("ushort   : {0}", pushort);
+			Console.WriteLine("string   : {0}", pstring);
+			Console.WriteLine("DateTime : {0}", pDateTime);
+			Console.WriteLine("Guid     : {0}", pGuid);
+			Console.WriteLine("Type     : {0}", pType);
+			Console.WriteLine("DayOfWeek: {0}", pDayOfWeek);
+
+			Assert.AreEqual(15, puint);
+			Assert.AreEqual(0,  pulong);
+			Assert.AreEqual(DayOfWeek.Sunday, test.PropertyDayOfWeek);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/TypeBuilder/Builders/ImplemetInterfaceBuilderTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,301 @@
+using System;
+using System.Reflection;
+
+using NUnit.Framework;
+
+using BLToolkit.TypeBuilder;
+using BLToolkit.Reflection;
+
+namespace TypeBuilder.Builders
+{
+	namespace Test1
+	{
+		public interface IInterface1
+		{
+			void DoAction();
+		}
+	}
+
+	namespace Test2
+	{
+		public interface IInterface1
+		{
+			void DoAction();
+		}
+	}
+
+	[TestFixture]
+	public class ImplementInterfaceBuilderTest
+	{
+
+		public interface IInterface2
+		{
+			void DoAction();
+			void DoAction(int p1, [Parent] EntityBase entity);
+			bool Property { get; }
+		}
+
+		public interface ISetInfo
+		{
+			void SetInfo(int i, [PropertyInfo] PropertyInfo info, byte b);
+		}
+
+		public struct MyInt : IInterface2
+		{
+			public int Value;
+
+			public void DoAction()
+			{
+				Value = 123;
+			}
+			
+			public void DoAction(int p1, EntityBase entity)
+			{
+				Value = p1;
+				entity.CallCounter++;
+			}
+
+			public bool Property 
+			{
+				get { return true; } 
+			}
+		}
+
+		public struct MyString : Test2.IInterface1, Test1.IInterface1, ISetInfo
+		{
+			public string Value;
+
+			public void DoAction()
+			{
+				Value = "Test1.IAction1.DoAction";
+			}
+
+			void Test2.IInterface1.DoAction()
+			{
+				Value = "Test2.IAction1.DoAction";
+			}
+		
+			public void SetInfo(int i, PropertyInfo info, byte b)
+			{
+				Value = info.Name;
+			}
+		}
+
+		public class MyDateTime : IInterface2
+		{
+			public DateTime Value;
+
+			public static DateTime TestDate1 = new DateTime(2000, 10, 10);
+			public static DateTime TestDate2 = new DateTime(2001, 11, 11);
+
+			public void DoAction()
+			{
+				Value = TestDate1;
+			}
+			
+			void IInterface2.DoAction(int p1, EntityBase entity)
+			{
+				Value = TestDate2;
+				entity.CallCounter++;
+			}
+
+			bool IInterface2.Property 
+			{
+				get { return true; } 
+			}
+		}
+
+		[ImplementInterface(typeof(Test2.IInterface1))]
+		[ImplementInterface(typeof(Test1.IInterface1))]
+		[GlobalInstanceType(typeof(int),    typeof(MyInt))]
+		[GlobalInstanceType(typeof(string), typeof(MyString))]
+		public abstract class EntityBase
+		{
+			public int CallCounter = 0;
+		}
+
+		[ImplementInterface(typeof(IInterface2))]
+		[ImplementInterface(typeof(ISetInfo))]
+		[GlobalInstanceType(typeof(DateTime), typeof(MyDateTime))]
+		public abstract class Entity : EntityBase
+		{
+			public abstract int      Int  { get; set; }
+			[LazyInstance]
+			public abstract DateTime Date { get; set; }
+			public abstract string   Str  { get; set; }
+		}
+
+		[Test]
+		public void Test()
+		{
+			Entity e = (Entity)TypeAccessor.CreateInstance(typeof(Entity));
+
+			Test2.IInterface1 t2a = (Test2.IInterface1)e;
+			t2a.DoAction();
+			// because of boxing  :(
+			Assert.AreEqual(null /*"Test2.IAction1.DoAction"*/, e.Str); 
+
+			Test1.IInterface1 t1a = (Test1.IInterface1)e;
+			t1a.DoAction();
+			Assert.AreEqual("Test1.IAction1.DoAction", e.Str); 
+
+			IInterface2 a2 = (IInterface2)e;
+			a2.DoAction();
+			Assert.AreEqual(123,                  e.Int); 
+			Assert.AreEqual(MyDateTime.TestDate1, e.Date);
+
+			a2.DoAction(456, null);
+			Assert.AreEqual(456,                  e.Int); 
+			Assert.AreEqual(MyDateTime.TestDate2, e.Date);
+			Assert.AreEqual(2,                    e.CallCounter);
+
+			ISetInfo si = (ISetInfo)e;
+			si.SetInfo(1, null, 2);
+			Assert.AreEqual("Str", e.Str); 
+		}
+
+		public interface IReturnTrueInterface
+		{
+			bool IsDirty { [return: ReturnIfTrue] get; }
+		}
+
+		public interface IReturnFalseInterface
+		{
+			[return: ReturnIfFalse] bool DoFalse();
+		}
+
+		public interface IReturnNullInterface
+		{
+			[return: ReturnIfNull] object DoNull();
+		}
+
+		public struct Value1 : IReturnTrueInterface, IReturnFalseInterface, IReturnNullInterface
+		{
+			public int Value;
+
+			public bool IsDirty
+			{
+				get { Value = 100; return false; } 
+			}
+
+			public bool DoFalse()
+			{
+				Value = 200;
+				return true;
+			}
+
+			public object DoNull()
+			{
+				Value = 300;
+				return null;
+			}
+		}
+
+		public class Value2 : IReturnTrueInterface, IReturnFalseInterface, IReturnNullInterface
+		{
+			public decimal Value;
+
+			public bool IsDirty 
+			{
+				get { Value = 100; return true; } 
+			}
+
+			public bool DoFalse()
+			{
+				Value = 200;
+				return true;
+			}
+
+			public object DoNull()
+			{
+				Value = 300;
+				return null;
+			}
+		}
+
+		public class Value3 : IReturnTrueInterface, IReturnFalseInterface, IReturnNullInterface
+		{
+			public string Value;
+
+			public bool IsDirty 
+			{
+				get { Value = "100"; return true; } 
+			}
+
+			public bool DoFalse()
+			{
+				Value = "200";
+				return false;
+			}
+		
+			public object DoNull()
+			{
+				Value = "300";
+				return null;
+			}
+		}
+
+		[ImplementInterface(typeof(IReturnTrueInterface))]
+		[ImplementInterface(typeof(IReturnFalseInterface))]
+		[ImplementInterface(typeof(IReturnNullInterface))]
+		public abstract class ReturnEntity
+		{
+			[InstanceType(typeof(Value1))] public abstract int     Value1 { get; set; }
+			[InstanceType(typeof(Value2))] public abstract decimal Value2 { get; set; }
+			[InstanceType(typeof(Value3))] public abstract string  Value3 { get; set; }
+		}
+
+		[Test]
+		public void TestTrueReturn()
+		{
+			ReturnEntity e = (ReturnEntity)TypeAccessor.CreateInstance(typeof(ReturnEntity));
+
+			bool b = ((IReturnTrueInterface)e).IsDirty;
+
+			Assert.AreEqual(100,  e.Value1);
+			Assert.AreEqual(100M, e.Value2);
+			Assert.AreEqual(null, e.Value3);
+		}
+
+		[Test]
+		public void TestFalseReturn()
+		{
+			ReturnEntity e = (ReturnEntity)TypeAccessor.CreateInstance(typeof(ReturnEntity));
+
+			((IReturnFalseInterface)e).DoFalse();
+
+			Assert.AreEqual(200,   e.Value1);
+			Assert.AreEqual(200M,  e.Value2);
+			Assert.AreEqual("200", e.Value3);
+		}
+
+		[Test]
+		public void TestNullReturn()
+		{
+			ReturnEntity e = (ReturnEntity)TypeAccessor.CreateInstance(typeof(ReturnEntity));
+
+			((IReturnNullInterface)e).DoNull();
+
+			Assert.AreEqual(300,  e.Value1);
+			Assert.AreEqual(0M,   e.Value2);
+			Assert.AreEqual(null, e.Value3);
+		}
+
+		[ImplementInterface(typeof(IReturnNullInterface))]
+		public abstract class NullValue
+		{
+			public abstract Value2 Value { get; set; }
+		}
+
+		[Test]
+		public void TestNull()
+		{
+			NullValue v = (NullValue)TypeAccessor.CreateInstance(typeof(NullValue));
+
+			v.Value = null;
+
+			((IReturnNullInterface)v).DoNull();
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/TypeBuilder/Builders/PropertyChangeBuilderTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,212 @@
+using System.Reflection;
+using BLToolkit.EditableObjects;
+using NUnit.Framework;
+
+using BLToolkit.TypeBuilder;
+using BLToolkit.Reflection;
+
+namespace TypeBuilder.Builders
+{
+	[TestFixture]
+	public class PropertyChangeBuilderTest
+	{
+		public abstract class TestObject1 : IPropertyChanged
+		{
+			public string NotifiedName;
+
+			public abstract int    ID   { get; set; }
+			public abstract string Name { get; set; }
+
+			public void OnPropertyChanged(PropertyInfo pi)
+			{
+				NotifiedName = pi.Name;
+			}
+		}
+
+		[Test]
+		public void TestPublic()
+		{
+			//Configuration.NotifyOnEqualSet = true;
+
+			TestObject1 o = (TestObject1)TypeAccessor.CreateInstance(typeof(TestObject1));
+
+			o.ID = 1;
+
+			Assert.AreEqual("ID", o.NotifiedName);
+
+			//Configuration.NotifyOnChangesOnly = false;
+		}
+
+		public abstract class TestObject2 : IPropertyChanged
+		{
+			public string NotifiedName;
+
+			public abstract int    ID   { get; set; }
+			public abstract string Name { get; set; }
+
+			void IPropertyChanged.OnPropertyChanged(PropertyInfo pi)
+			{
+				NotifiedName = pi.Name;
+			}
+		}
+
+		[Test]
+		public void TestPrivate()
+		{
+			TestObject2 o = (TestObject2)TypeAccessor.CreateInstance(typeof(TestObject2));
+
+			o.ID = 1;
+
+			Assert.AreEqual("ID", o.NotifiedName);
+		}
+
+		[PropertyChanged()]
+		public abstract class TestObject_Notification : IPropertyChanged
+		{
+			public abstract int ID { get; set; }
+			public abstract string Name { get; set; }
+			public abstract object Info { get; set; }
+
+			void IPropertyChanged.OnPropertyChanged(PropertyInfo propertyInfo)
+			{
+			}
+		}
+
+		[PropertyChanged(false)]
+		public abstract class TestObject_NoNotification : IPropertyChanged
+		{
+			public abstract int ID { get; set; }
+			public abstract string Name { get; set; }
+			public abstract object Info { get; set; }
+
+			void IPropertyChanged.OnPropertyChanged(PropertyInfo propertyInfo)
+			{
+			}
+		}
+
+		[PropertyChanged(false, false)]
+		public abstract class TestObject_NoNotificationEquals : IPropertyChanged
+		{
+			public abstract int ID { get; set; }
+			public abstract string Name { get; set; }
+			public abstract object Info { get; set; }
+
+			void IPropertyChanged.OnPropertyChanged(PropertyInfo propertyInfo)
+			{
+			}
+		}
+
+		[PropertyChanged(false, false, false)]
+		public abstract class TestObject_NoNotificationEqualsNoSkip : IPropertyChanged
+		{
+			public abstract int ID { get; set; }
+			public abstract string Name { get; set; }
+			public abstract object Info { get; set; }
+
+			protected abstract decimal Dec { get; set; }
+
+			void IPropertyChanged.OnPropertyChanged(PropertyInfo propertyInfo)
+			{
+			}
+		}
+
+		public abstract class Derived_TONNENS : TestObject_NoNotificationEqualsNoSkip
+		{
+			public abstract decimal NewVal { get; set; }
+		}
+
+		[Test]
+		public void TestGeneration()
+		{
+			TestObject_Notification ton = (TestObject_Notification) TypeAccessor.CreateInstance(typeof(TestObject_Notification));
+			TestObject_NoNotification tonn = (TestObject_NoNotification) TypeAccessor.CreateInstance(typeof(TestObject_NoNotification));
+			TestObject_NoNotificationEquals tonne = (TestObject_NoNotificationEquals) TypeAccessor.CreateInstance(typeof(TestObject_NoNotificationEquals));
+			TestObject_NoNotificationEqualsNoSkip tonnes = (TestObject_NoNotificationEqualsNoSkip) TypeAccessor.CreateInstance(typeof(TestObject_NoNotificationEqualsNoSkip));
+
+			Derived_TONNENS derived_TONNENS = (Derived_TONNENS) TypeAccessor.CreateInstance(typeof(Derived_TONNENS));
+		}
+
+		[PropertyChanged(false)]
+		public abstract class NullableFieldNoEqualsSetTest : IPropertyChanged
+		{
+			public string NotifiedName = "";
+
+			public abstract bool? NullableBool { get; set; }
+			public abstract int? NullableInt { get; set; }
+			public abstract decimal? NullableDecimal { get; set; }
+			public abstract float? NullableFloat { get; set; }
+
+			void IPropertyChanged.OnPropertyChanged(PropertyInfo propertyInfo)
+			{
+				NotifiedName = propertyInfo.Name;
+			}
+		}
+
+		[Test]
+		public void TestNullableGeneration()
+		{
+			TypeFactory.SaveTypes = true;
+
+			var testObject = TypeFactory.CreateInstance<NullableFieldNoEqualsSetTest>();
+
+			testObject.NotifiedName = "";
+			testObject.NullableInt = null;
+			Assert.AreEqual("", testObject.NotifiedName);
+			testObject.NullableInt = 10;
+			Assert.AreEqual("NullableInt", testObject.NotifiedName);
+			testObject.NotifiedName = "";
+			testObject.NullableInt = 10;
+			Assert.AreEqual("", testObject.NotifiedName);
+			testObject.NullableInt = null;
+			Assert.AreEqual("NullableInt", testObject.NotifiedName);
+
+			testObject.NotifiedName = "";
+			testObject.NullableBool = null;
+			Assert.AreEqual("", testObject.NotifiedName);
+			testObject.NullableBool = true;
+			Assert.AreEqual("NullableBool", testObject.NotifiedName);
+			testObject.NotifiedName = "";
+			testObject.NullableBool = true;
+			Assert.AreEqual("", testObject.NotifiedName);
+			testObject.NullableBool = null;
+			Assert.AreEqual("NullableBool", testObject.NotifiedName);
+
+			testObject.NotifiedName = "";
+			testObject.NullableDecimal = null;
+			Assert.AreEqual("", testObject.NotifiedName);
+			testObject.NullableDecimal = 10m;
+			Assert.AreEqual("NullableDecimal", testObject.NotifiedName);
+			testObject.NotifiedName = "";
+			testObject.NullableDecimal = 10m;
+			Assert.AreEqual("", testObject.NotifiedName);
+			testObject.NullableDecimal = null;
+			Assert.AreEqual("NullableDecimal", testObject.NotifiedName);
+
+			testObject.NotifiedName = "";
+			testObject.NullableFloat = null;
+			Assert.AreEqual("", testObject.NotifiedName);
+			testObject.NullableFloat = 0.1f;
+			Assert.AreEqual("NullableFloat", testObject.NotifiedName);
+			testObject.NotifiedName = "";
+			testObject.NullableFloat = 0.1f;
+			Assert.AreEqual("", testObject.NotifiedName);
+			testObject.NullableFloat = null;
+			Assert.AreEqual("NullableFloat", testObject.NotifiedName);
+
+		}
+
+		public struct UserClass { }
+
+		[PropertyChanged(false)]
+		public abstract class UserConfig : EditableObject
+		{
+			public abstract UserClass Range { get; set; }
+		}
+
+		[Test]
+		public void TestStructPropertyChangedGeneration()
+		{
+			TypeAccessor.CreateInstance<UserConfig>().Range = new UserClass();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/TypeBuilder/Builders/TypeAccessorBuilderTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,204 @@
+using System;
+using System.Xml;
+using NUnit.Framework;
+
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+
+namespace TypeBuilder.Builders
+{
+	[TestFixture]
+	public class TypeAccessorBuilderTest
+	{
+		public class TestObject1
+		{
+			public TestObject1()
+			{
+				Value = 10;
+			}
+
+			public TestObject1(InitContext init)
+			{
+				Value = init == null || init.Parameters == null? 20: (int)init.Parameters[0];
+			}
+
+			public int Value;
+		}
+
+		[Test]
+		public void Test1()
+		{
+			TestObject1 o = (TestObject1)TypeAccessor.CreateInstance(typeof(TestObject1));
+			Assert.AreEqual(10, o.Value);
+
+			o = (TestObject1)TypeAccessor.CreateInstance(typeof(TestObject1), null);
+			Assert.AreEqual(20, o.Value);
+
+			InitContext ic = new InitContext();
+			ic.Parameters = new object[] { 30 };
+			o = (TestObject1)TypeAccessor.CreateInstance(typeof(TestObject1), ic);
+			Assert.AreEqual(30, o.Value);
+		}
+
+		public class TestObject2
+		{
+			public TestObject2()
+			{
+				Value = 10;
+			}
+
+			public int Value;
+		}
+
+		[Test]
+		public void Test2()
+		{
+			TestObject2 o = (TestObject2)TypeAccessor.CreateInstance(typeof(TestObject2));
+			Assert.AreEqual(10, o.Value);
+
+			o = (TestObject2)TypeAccessor.CreateInstance(typeof(TestObject2), null);
+			Assert.AreEqual(10, o.Value);
+
+			InitContext ic = new InitContext();
+			ic.Parameters = new object[] { 30 };
+			o = (TestObject2)TypeAccessor.CreateInstance(typeof(TestObject2), ic);
+			Assert.AreEqual(10, o.Value);
+		}
+
+		public class TestObject3
+		{
+			public TestObject3(InitContext init)
+			{
+				Value = init == null || init.Parameters == null ? 20 : (int)init.Parameters[0];
+			}
+
+			public int Value;
+		}
+
+		[Test]
+		public void Test3()
+		{
+			TestObject3 o = (TestObject3)TypeAccessor.CreateInstance(typeof(TestObject3));
+			Assert.AreEqual(20, o.Value);
+
+			o = (TestObject3)TypeAccessor.CreateInstance(typeof(TestObject3), null);
+			Assert.AreEqual(20, o.Value);
+
+			InitContext ic = new InitContext();
+			ic.Parameters = new object[] { 30 };
+			o = (TestObject3)TypeAccessor.CreateInstance(typeof(TestObject3), ic);
+			Assert.AreEqual(30, o.Value);
+		}
+
+		public abstract class TestObject4
+		{
+			protected TestObject4(InitContext init)
+			{
+				Value = init == null || init.Parameters == null ? 20 : (int)init.Parameters[0];
+			}
+
+			class ParamAttribute : ParameterAttribute
+			{
+				public ParamAttribute() : base(new object()) { }
+			}
+
+			public class InnerObject
+			{
+				public InnerObject(object param) { }
+			}
+
+			[Param]
+			public abstract InnerObject ObjValue { get; set; }
+
+			public abstract int Value { get; set; }
+		}
+
+		[Test]
+		public void Test4()
+		{
+			TestObject4 o = (TestObject4)TypeAccessor.CreateInstance(typeof(TestObject4));
+			Assert.AreEqual(20, o.Value);
+
+			o = (TestObject4)TypeAccessor.CreateInstance(typeof(TestObject4), null);
+			Assert.AreEqual(20, o.Value);
+
+			InitContext ic = new InitContext();
+			ic.Parameters = new object[] { 30 };
+			o = (TestObject4)TypeAccessor.CreateInstance(typeof(TestObject4), ic);
+			Assert.AreEqual(30, o.Value);
+		}
+
+		public struct TestStruct1
+		{
+			public string Name;
+		}
+
+		public class TestObject5
+		{
+			public TestStruct1 Value;
+		}
+
+		[Test]
+		public void StructCreateInstanceTest()
+		{
+			TestStruct1 s = (TestStruct1)TypeAccessor.CreateInstance(typeof(TestStruct1));
+			Assert.IsNotNull(s);
+			
+			TestObject5 o = (TestObject5)TypeAccessor.CreateInstance(typeof(TestObject5));
+			Assert.IsNotNull(o);
+		}
+
+		[Test]
+		public void PrimitiveCreateInstanceTest()
+		{
+			int i = (int)TypeAccessor.CreateInstance(typeof(int));
+			Assert.IsNotNull(i);
+		}
+
+		public class CloneTestObject
+		{
+			public struct CloneableStruct : ICloneable
+			{
+				public int         Value;
+
+				public object Clone()
+				{
+					return this;
+				}
+			}
+
+			public struct SimpleStruct
+			{
+				public int         Value;
+			}
+
+			public int             IntValue;
+			public string          StrValue;
+			public XmlDocument     XmlValue;
+			public SimpleStruct    SimpleValue;
+			public CloneableStruct CloneableValue;
+		}
+
+		[Test]
+		public void CloneValueTest()
+		{
+			CloneTestObject o      = new CloneTestObject();
+			CloneTestObject c      = new CloneTestObject();
+			o.IntValue             = 12345;
+			o.StrValue             = "str";
+			o.XmlValue             = new XmlDocument(); o.XmlValue.LoadXml("<root/>");
+			o.SimpleValue.Value    = 321;
+			o.CloneableValue.Value = 123;
+
+			foreach (MemberAccessor ma in TypeAccessor<CloneTestObject>.Instance)
+				ma.CloneValue(o, c);
+
+			Assert.AreEqual(o.IntValue,             c.IntValue);
+			Assert.AreEqual(o.StrValue,             c.StrValue);
+			Assert.AreEqual(o.XmlValue.InnerXml,    c.XmlValue.InnerXml);
+			Assert.AreEqual(o.SimpleValue.Value,    c.SimpleValue.Value);
+			Assert.AreEqual(o.CloneableValue.Value, c.CloneableValue.Value);
+		}
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/TypeBuilder/GenerateAtributeTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,166 @@
+using System;
+using System.Reflection;
+
+using NUnit.Framework;
+
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+
+namespace TypeBuilder
+{
+	[TestFixture]
+	public class GenerateAttributeTest
+	{
+		[AttributeUsage(AttributeTargets.All, Inherited = false)]
+		public class NonInheritedAttribute: Attribute
+		{
+			public NonInheritedAttribute()
+			{
+			}
+
+			public NonInheritedAttribute(Type type, string str)
+			{
+				_type = type;
+			}
+
+			public NonInheritedAttribute(Type type, string str, int i, AttributeTargets e):
+				this(type, str)
+			{
+			}
+
+			private string _namedArgument;
+			public  string  NamedArgument
+			{
+				get { return _namedArgument;  }
+				set { _namedArgument = value; }
+			}
+
+			private Type _type;
+			public  Type  Type
+			{
+				get { return _type;  }
+				set { _type = value; }
+			}
+		}
+
+		public abstract class TestObject
+		{
+			[NonInherited]
+			public abstract void Method1();
+
+			[GenerateAttribute(typeof (NonInheritedAttribute))]
+			public abstract void Method2();
+
+			[GenerateAttribute(typeof (NonInheritedAttribute), typeof(TestObject), "str", 123, AttributeTargets.Field)]
+			public abstract void Method3();
+
+			[GenerateAttribute(typeof (NonInheritedAttribute))]
+			public virtual void Method4(){}
+
+			[GenerateAttribute(typeof(NonInheritedAttribute),
+				NamedArgumentNames  = new string[] { "NamedArgument"},
+				NamedArgumentValues = new object[] { "SomeValue"})]
+			public virtual void Method5() { }
+
+			public abstract int Prop1
+			{
+				[GenerateAttribute(typeof(NonInheritedAttribute))] get;
+				[GenerateAttribute(typeof(NonInheritedAttribute))] set;
+			}
+
+			private        int _prop2;
+			public virtual int  Prop2
+			{
+				[GenerateAttribute(typeof(NonInheritedAttribute))] get { return _prop2; }
+				[GenerateAttribute(typeof(NonInheritedAttribute))] set { _prop2 = value; }
+			}
+
+			// This affects the underlying field, not the property itself.
+			//
+			[GenerateAttribute(typeof(NonInheritedAttribute))]
+			public abstract int Prop3 { get; set; }
+		}
+
+		[Test]
+		public void MainTest()
+		{
+			TestObject o = (TestObject)TypeAccessor.CreateInstance(typeof(TestObject));
+			Type    type = o.GetType();
+
+			Assert.IsNull   (Attribute.GetCustomAttribute(type.GetMethod("Method1"), typeof(NonInheritedAttribute)));
+
+			Assert.IsNotNull(Attribute.GetCustomAttribute(type.GetMethod("Method2"), typeof(NonInheritedAttribute)));
+			Assert.IsNotNull(Attribute.GetCustomAttribute(type.GetMethod("Method3"), typeof(NonInheritedAttribute)));
+			Assert.IsNotNull(Attribute.GetCustomAttribute(type.GetMethod("Method4"), typeof(NonInheritedAttribute)));
+
+			Assert.IsNotNull(Attribute.GetCustomAttribute(type.GetProperty("Prop1").GetGetMethod(), typeof(NonInheritedAttribute)));
+			Assert.IsNotNull(Attribute.GetCustomAttribute(type.GetProperty("Prop1").GetSetMethod(), typeof(NonInheritedAttribute)));
+			Assert.IsNotNull(Attribute.GetCustomAttribute(type.GetProperty("Prop2").GetGetMethod(), typeof(NonInheritedAttribute)));
+			Assert.IsNotNull(Attribute.GetCustomAttribute(type.GetProperty("Prop2").GetSetMethod(), typeof(NonInheritedAttribute)));
+
+			Assert.IsNotNull(Attribute.GetCustomAttribute(type.GetField("_prop3", BindingFlags.Instance | BindingFlags.NonPublic), typeof(NonInheritedAttribute)));
+
+			NonInheritedAttribute attribute = (NonInheritedAttribute)
+				Attribute.GetCustomAttribute(type.GetMethod("Method5"), typeof(NonInheritedAttribute));
+
+			Assert.IsNotNull(attribute);
+			Assert.AreEqual("SomeValue", attribute.NamedArgument);
+		}
+
+		public abstract class BadObject
+		{
+			[GenerateAttribute(typeof (NonInheritedAttribute), "str")]
+			public abstract void Method();
+		}
+
+		[Test, ExpectedException(typeof(TypeBuilderException))]
+		public void MismatchedAgsTest()
+		{
+			TypeAccessor.CreateInstance(typeof(BadObject));
+		}
+
+		// In FW1.1 an attribute argument may not be null, as stated in 17.2:
+		// "An attribute argument must be a constant expression,
+		// typeof expression or one-dimensional array creation expression."
+
+		public abstract class NullArgObject
+		{
+			[GenerateAttribute(typeof(NonInheritedAttribute), null, null)]
+			public abstract void Method();
+		}
+
+		[Test]
+		public void NullArgTest()
+		{
+			TypeAccessor.CreateInstance(typeof(NullArgObject));
+		}
+
+		public class CustomGenerateAttribute: GenerateAttributeAttribute
+		{
+			public CustomGenerateAttribute(): base(typeof(NonInheritedAttribute))
+			{
+				this["NamedArgument"] = "NamedValue";
+				this["Type"]          = Type.GetType("System.Int32");
+			}
+		}
+
+		[CustomGenerate]
+		public abstract class CustomObject
+		{
+		}
+
+		[Test]
+		public void CustomGenerateTest()
+		{
+			CustomObject o = TypeAccessor<CustomObject>.CreateInstanceEx();
+			Type    type = o.GetType();
+
+			NonInheritedAttribute attr = (NonInheritedAttribute)
+				Attribute.GetCustomAttribute(type, typeof(NonInheritedAttribute));
+
+			Assert.That(attr,               Is.Not.Null);
+			Assert.That(attr.Type,          Is.EqualTo(typeof(int)));
+			Assert.That(attr.NamedArgument, Is.EqualTo("NamedValue"));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/TypeBuilder/GenericMethodTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,58 @@
+using System;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using BLToolkit.Aspects;
+using BLToolkit.Reflection;
+
+namespace TypeBuilder
+{
+	[TestFixture]
+	public class GenericMethodTest
+	{
+		public abstract class TestObject
+		{
+			public virtual T GetValue<T>([NotNull] T value) where T : class, ICloneable
+			{
+				return value;
+			}
+
+			public abstract T Abstract<T>(T value) where T : struct, IFormattable;
+			public abstract T Abstract2<T>(T value) where T : new();
+			public abstract T Abstract3<T>(T value);
+		}
+
+		[Test, ExpectedException(typeof(ArgumentNullException))]
+		public void Test()
+		{
+			// If you got an 'Invalid executable format' exception here
+			// you need to install .Net Framework 2.0 SP1 or later.
+			//
+			TestObject t = TypeAccessor<TestObject>.CreateInstance();
+			Assert.AreEqual("123", t.GetValue("123"));
+			Assert.AreEqual(0, t.Abstract(123));
+			Assert.AreEqual(0, t.Abstract2(123));
+			Assert.AreEqual(0, t.Abstract3(123));
+
+			// Throws ArgumentNullException
+			//
+			t.GetValue<string>(null);
+		}
+
+		public abstract class TestClass<T>
+		{
+			public abstract L SelectAll<L>() where L : IList<T>, new();
+		}
+
+		// Works only with Mono.
+		// See https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=282829
+		//
+		//[Test]
+		public void GenericMixTest()
+		{
+			TestClass<int> t = TypeAccessor.CreateInstance<TestClass<int>>();
+			Assert.That(t, Is.Not.Null);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/TypeBuilder/GetSetValueAttributeTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,147 @@
+using System;
+using System.Reflection;
+
+using NUnit.Framework;
+
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+
+namespace TypeBuilder
+{
+	[TestFixture]
+	public class GetSetValueAttributeTest
+	{
+		public class Value
+		{
+			public Value(int value)
+			{
+				IntValue = value;
+			}
+
+			[SetValue, GetValue] public int IntValue;
+
+			public Value(float value)
+			{
+				FloatValue = value;
+			}
+
+			[SetValue, GetValue] public float FloatValue;
+
+			public Value(string value)
+			{
+				StrValue = value;
+			}
+
+			object _value;
+
+			[SetValue, GetValue]
+			public string StrValue
+			{
+				get { return (string)_value; }
+				set { _value = value; }
+			}
+
+			public Value(DayOfWeek value)
+			{
+				DayValue = value;
+			}
+
+			[SetValue, GetValue]
+			public DayOfWeek DayValue
+			{
+				get { return (DayOfWeek)_value; }
+				set { _value = value; }
+			}
+		}
+
+		public abstract class TestObject1
+		{
+			[InstanceType(typeof(Value), 55)]        public abstract int    IntValue   { get; set; }
+			[InstanceType(typeof(Value), (float)16)] public abstract float  FloatValue { get; set; }
+			[InstanceType(typeof(Value), "test1")]   public abstract string StrValue   { get; set; }
+
+			[InstanceType(typeof(Value), DayOfWeek.Saturday)]
+			public abstract DayOfWeek DayValue { get; set; }
+		}
+
+		[Test]
+		public void Test()
+		{
+			TestObject1 o = (TestObject1)TypeAccessor.CreateInstance(typeof(TestObject1));
+
+			Assert.AreEqual(55, o.IntValue);
+			o.IntValue += 1;
+			Assert.AreEqual(56, o.IntValue);
+
+			Assert.AreEqual(16, o.FloatValue);
+			o.FloatValue += 1;
+			Assert.AreEqual(17, o.FloatValue);
+
+			Assert.AreEqual("test1", o.StrValue);
+			o.StrValue = "test2";
+			Assert.AreEqual("test2", o.StrValue);
+
+			Assert.AreEqual(DayOfWeek.Saturday, o.DayValue);
+			o.DayValue = DayOfWeek.Thursday;
+			Assert.AreEqual(DayOfWeek.Thursday, o.DayValue);
+		}
+
+		public struct ValueBox<T>
+		{
+			public ValueBox(InitContext ctx)
+			{
+				_value = (T)ctx.MemberParameters[0];
+			}
+
+			private T _value;
+
+			[GetValue] public T    GetValue()        { return _value;  }
+			[SetValue] public void SetValue(T value) { _value = value; }
+		}
+
+		public struct ValueBox2<T>
+		{
+			private T _value;
+
+			[GetValue] public T    GetValue([Parent] TestObject2 parent)     { return _value;  }
+			[SetValue] public void SetValue(T value, [Parent] object parent) { _value = value; }
+		}
+
+		public struct ValueBox3<T>
+		{
+			private T _value;
+
+			[GetValue] public T    GetValue([Parent] object parent, [PropertyInfo] PropertyInfo pi) { return _value; }
+			[SetValue] public void SetValue(T value, [PropertyInfo] PropertyInfo pi) { _value = value; }
+		}
+
+		public abstract class TestObject2
+		{
+			[InstanceType(typeof(ValueBox<int>), 27)]
+			public abstract int    IntValue   { get; set; }
+			[InstanceType(typeof(ValueBox2<float>))]
+			public abstract float  FloatValue { get; set; }
+			[InstanceType(typeof(ValueBox3<string>))]
+			public abstract string StrValue   { get; set; }
+		}
+
+		[Test]
+		public void MethodTest()
+		{
+			TestObject2 o = TypeAccessor.CreateInstance<TestObject2>();
+
+			Assert.AreEqual(27, o.IntValue);
+			o.IntValue += 8;
+			Assert.AreEqual(35, o.IntValue);
+
+			o.FloatValue = 0.1f;
+			o.FloatValue *= 2.0f;
+			Assert.AreEqual(0.2f, o.FloatValue);
+
+			o.StrValue = "foo";
+			o.StrValue += "Bar";
+			Assert.AreEqual("fooBar", o.StrValue);
+		}
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/TypeBuilder/InstanceTypeAttributeTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,249 @@
+using System;
+using System.Collections;
+
+using NUnit.Framework;
+
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+
+namespace TypeBuilder
+{
+	[TestFixture]
+	public class InstanceTypeAttributeTest
+	{
+		public class TestClass
+		{
+			public class IntFieldInstance
+			{
+				public int Value;
+			}
+
+			public class IntPropertyInstance
+			{
+				private int _value;
+				public  int  Value
+				{
+					get { return _value * 2; }
+					set { _value = value; }
+				}
+			}
+
+			public class ObjFieldInstance
+			{
+				public object Value;
+			}
+
+			public class ObjPropertyInstance
+			{
+				private object _value;
+				public  object  Value
+				{
+					get { return _value is int? (int)_value * 3: _value; }
+					set { _value = value; }
+				}
+			}
+
+			public abstract class TestObject1
+			{
+				[InstanceType(typeof(IntFieldInstance))]    public abstract int       IntField  { get; set; }
+				[InstanceType(typeof(IntPropertyInstance))] public abstract int       IntProp   { get; set; }
+				[InstanceType(typeof(ObjFieldInstance))]    public abstract int       ObjField  { get; set; }
+				[InstanceType(typeof(ObjPropertyInstance))] public abstract int       ObjProp   { get; set; }
+				[InstanceType(typeof(IntFieldInstance))]    public abstract DayOfWeek DowField  { get; set; }
+				[InstanceType(typeof(IntPropertyInstance))] public abstract DayOfWeek DowProp   { get; set; }
+				[InstanceType(typeof(ObjFieldInstance))]    public abstract DateTime  DateField { get; set; }
+				[InstanceType(typeof(ObjPropertyInstance))] public abstract DateTime  DateProp  { get; set; }
+				[InstanceType(typeof(ObjFieldInstance))]    public abstract ArrayList ArrField  { get; set; }
+				[InstanceType(typeof(ObjPropertyInstance))] public abstract ArrayList ArrProp   { get; set; }
+			}
+
+			public static void Test()
+			{
+				TestObject1 o = (TestObject1)TypeAccessor.CreateInstance(typeof(TestObject1));
+
+				o.IntField = 10;
+				o.IntProp  = 11;
+				o.ObjField = 12;
+				o.ObjProp  = 13;
+
+				Assert.AreEqual(10, o.IntField);
+				Assert.AreEqual(22, o.IntProp);
+				Assert.AreEqual(12, o.ObjField);
+				Assert.AreEqual(39, o.ObjProp);
+
+				DateTime  testDate  = new DateTime(2000, 1, 1);
+
+				o.DowField  = DayOfWeek.Monday;
+				o.DowProp   = DayOfWeek.Sunday;
+				o.DateField = testDate;
+				o.DateProp  = testDate;
+
+				Assert.AreEqual(DayOfWeek.Monday, o.DowField);
+				Assert.AreEqual(DayOfWeek.Sunday, o.DowProp);
+				Assert.AreEqual(testDate,         o.DateField);
+				Assert.AreEqual(testDate,         o.DateProp);
+
+				o.ArrField = new ArrayList(17);
+				o.ArrProp  = new ArrayList(21);
+
+				Assert.AreEqual(17, o.ArrField.Capacity);
+				Assert.AreEqual(21, o.ArrProp. Capacity);
+			}
+		}
+
+		[Test]
+		public void InstanceClassTest()
+		{
+			TestClass.Test();
+		}
+
+		public class TestStruct
+		{
+			public struct IntFieldInstance
+			{
+				public int Value;
+			}
+
+			public struct IntPropertyInstance
+			{
+				private int _value;
+				public  int  Value
+				{
+					get { return _value * 2; }
+					set { _value = value; }
+				}
+			}
+
+			public struct ObjFieldInstance
+			{
+				public object Value;
+			}
+
+			public struct ObjPropertyInstance
+			{
+				private object _value;
+				public  object  Value
+				{
+					get { return _value is int? (int)_value * 3: _value; }
+					set { _value = value; }
+				}
+			}
+
+			public abstract class TestObject1
+			{
+				[InstanceType(typeof(IntFieldInstance))]    public abstract int       IntField  { get; set; }
+				[InstanceType(typeof(IntPropertyInstance))] public abstract int       IntProp   { get; set; }
+				[InstanceType(typeof(ObjFieldInstance))]    public abstract int       ObjField  { get; set; }
+				[InstanceType(typeof(ObjPropertyInstance))] public abstract int       ObjProp   { get; set; }
+				[InstanceType(typeof(IntFieldInstance))]    public abstract DayOfWeek DowField  { get; set; }
+				[InstanceType(typeof(IntPropertyInstance))] public abstract DayOfWeek DowProp   { get; set; }
+				[InstanceType(typeof(ObjFieldInstance))]    public abstract DateTime  DateField { get; set; }
+				[InstanceType(typeof(ObjPropertyInstance))] public abstract DateTime  DateProp  { get; set; }
+				[InstanceType(typeof(ObjFieldInstance))]    public abstract ArrayList ArrField  { get; set; }
+				[InstanceType(typeof(ObjPropertyInstance))] public abstract ArrayList ArrProp   { get; set; }
+			}
+
+			public static void Test()
+			{
+				TestObject1 o = (TestObject1)TypeAccessor.CreateInstance(typeof(TestObject1));
+
+				o.IntField = 10;
+				o.IntProp  = 11;
+				o.ObjField = 12;
+				o.ObjProp  = 13;
+
+				Assert.AreEqual(10, o.IntField);
+				Assert.AreEqual(22, o.IntProp);
+				Assert.AreEqual(12, o.ObjField);
+				Assert.AreEqual(39, o.ObjProp);
+
+				DateTime  testDate  = new DateTime(2000, 1, 1);
+
+				o.DowField  = DayOfWeek.Monday;
+				o.DowProp   = DayOfWeek.Sunday;
+				o.DateField = testDate;
+				o.DateProp  = testDate;
+
+				Assert.AreEqual(DayOfWeek.Monday, o.DowField);
+				Assert.AreEqual(DayOfWeek.Sunday, o.DowProp);
+				Assert.AreEqual(testDate,         o.DateField);
+				Assert.AreEqual(testDate,         o.DateProp);
+
+				o.ArrField = new ArrayList(17);
+				o.ArrProp  = new ArrayList(21);
+
+				Assert.AreEqual(17, o.ArrField.Capacity);
+				Assert.AreEqual(21, o.ArrProp. Capacity);
+			}
+		}
+
+		[Test]
+		public void InstanceStructTest()
+		{
+			TestStruct.Test();
+		}
+
+		public struct IntParamInstance
+		{
+			public IntParamInstance(int value)
+			{
+				Value = value;
+			}
+
+			public int Value;
+		}
+
+		public abstract class TestObject1
+		{
+			[InstanceType(typeof(IntParamInstance), 58)] public abstract int IntField { get; set; }
+		}
+
+		[Test]
+		public void ParamTest()
+		{
+			TestObject1 o = (TestObject1)TypeAccessor.CreateInstance(typeof(TestObject1));
+
+			Assert.AreEqual(58, o.IntField);
+		}
+
+		public class Instance2
+		{
+			public Instance2(int n)
+			{
+				_n = n;
+			}
+
+			private int _n;
+
+			private int _value;
+			public  int  Value
+			{
+				get { return _value * _n; }
+				set { _value = value; }
+			}
+		}
+
+		[GlobalInstanceType(typeof(int), typeof(Instance2), 3)]
+		public abstract class Object2
+		{
+			[InstanceType(typeof(Instance2), 5)] 
+			public abstract int   Int1   { get; set; }
+			public abstract int   Int2   { get; set; }
+			public abstract short Short1 { get; set; }
+		}
+
+		[Test]
+		public void GlobalParamTest()
+		{
+			Object2 o = (Object2)TypeAccessor.CreateInstance(typeof(Object2));
+
+			o.Int1   = 5;
+			o.Int2   = 5;
+			o.Short1 = 10;
+
+			Assert.AreEqual(25, o.Int1);
+			Assert.AreEqual(15, o.Int2);
+			Assert.AreEqual(10, o.Short1);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/TypeBuilder/InternalTypesTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,66 @@
+using System;
+using System.Runtime.CompilerServices;
+
+using NUnit.Framework;
+
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+
+[assembly: InternalsVisibleTo("InternalTypesTest, PublicKey=00240000048000009400000006020000002400005253413100040000010001001d9a12fa5826334c27adac46b64048c08dc48a37113586f0b315baefeecad081ce1d907ef8879ea1dcea6decb9f0d87840ff60fc5bd2a3919469284481b6ae7b73ebb327503cd16c9ecd95b6ed9decc80116dfbe680dc1ad83c5aa89af3e48f5f9f94444901168e58a782f0831d88f6e00f47cd9eb209c40064fb5b002ef79be")]
+
+namespace TypeBuilder
+{
+	[TestFixture]
+	public class InternalTypesTest
+	{
+		internal abstract class InternalObject
+		{
+			public abstract string PublicValue { get; set; }
+		}
+
+		public abstract class PublicObject
+		{
+			internal                    string InternalField;
+			internal           abstract string InternalValue          { get; set; }
+			internal protected abstract string ProtectedInternalValue { get; set; }
+			public             abstract string PublicValue            { get; internal set; }
+			public                      string NonAbstractValue
+			{
+				         get { return InternalField;  }
+				internal set { InternalField = value; }
+			}
+		}
+
+		[Test]
+		public void Test()
+		{
+			TypeFactory.SetGlobalAssembly("InternalTypesTest.dll", new Version(1,2,3,4), "TypeBuilder/InternalTypesTest.snk");
+
+			var o = TypeAccessor.CreateInstance<InternalObject>();
+			Assert.IsNotNull(o);
+
+			var o2 = TypeAccessor.CreateInstance<PublicObject>();
+			Assert.IsNotNull(o2);
+
+			TypeFactory.SaveGlobalAssembly();
+
+			var ta = TypeAccessor<PublicObject>.Instance;
+
+			Assert.IsNotNull(ta["InternalField"]);
+			Assert.IsTrue   (ta["InternalField"].HasGetter);
+			Assert.IsTrue   (ta["InternalField"].HasSetter);
+			Assert.IsNotNull(ta["PublicValue"]);
+			Assert.IsTrue   (ta["PublicValue"].HasGetter);
+			Assert.IsTrue   (ta["PublicValue"].HasSetter);
+			Assert.IsNotNull(ta["InternalValue"]);
+			Assert.IsTrue   (ta["InternalValue"].HasGetter);
+			Assert.IsTrue   (ta["InternalValue"].HasSetter);
+			Assert.IsNotNull(ta["ProtectedInternalValue"]);
+			Assert.IsTrue   (ta["ProtectedInternalValue"].HasGetter);
+			Assert.IsTrue   (ta["ProtectedInternalValue"].HasSetter);
+			Assert.IsNotNull(ta["NonAbstractValue"]);
+			Assert.IsTrue   (ta["NonAbstractValue"].HasGetter);
+			Assert.IsTrue   (ta["NonAbstractValue"].HasSetter);
+		}
+	}
+}
Binary file UnitTests/CS/TypeBuilder/InternalTypesTest.snk has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/TypeBuilder/LazyInstanceAttributeTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,202 @@
+using System;
+using System.Collections;
+
+using NUnit.Framework;
+
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+
+namespace TypeBuilder
+{
+	[TestFixture]
+	public class LazyInstanceAttributeTest
+	{
+		public abstract class AbstractObject
+		{
+			public AbstractObject(InitContext init)
+			{
+				if (init.MemberParameters != null && init.MemberParameters.Length == 1)
+					Field = (int)init.MemberParameters[0];
+				else
+					Field = 77;
+			}
+
+			public int Field;
+		}
+
+		public class InnerObject
+		{
+			public InnerObject(InitContext init)
+			{
+				if (init.MemberParameters != null && init.MemberParameters.Length == 1)
+					Field = (int)init.MemberParameters[0];
+				else
+					Field = 44;
+			}
+
+			public int Field;
+		}
+
+		public class TestField
+		{
+			public TestField()
+			{
+				Value = 10;
+			}
+
+			public TestField(int p1, float p2)
+			{
+				Value = p1 + (int)p2;
+			}
+
+			public TestField(TestField p1)
+			{
+				Value = 77;
+			}
+
+			public int Value;
+		}
+
+		public abstract class TestObject1
+		{
+			[LazyInstance]
+			public abstract ArrayList List { get; set; }
+
+			[LazyInstance]
+			public abstract string    Str { get; set; }
+
+			[LazyInstance]
+			public abstract string this[int i] { get; set; }
+
+			[LazyInstance]
+			public abstract TestField Field { get; set; }
+
+			[LazyInstance]
+			public abstract InnerObject InnerObject { get; set; }
+
+			[LazyInstance]
+			public abstract AbstractObject AbstractObject { get; set; }
+		}
+
+		[Test]
+		public void NoParamTest()
+		{
+			TestObject1 o = (TestObject1)TypeAccessor.CreateInstance(typeof(TestObject1));
+
+			Assert.IsNotNull(o.List);
+			Assert.AreEqual("", o.Str);
+			Assert.AreEqual(10, o.Field.Value);
+			Assert.AreEqual(44, o.InnerObject.Field);
+		}
+
+		[AttributeUsage(AttributeTargets.Property)]
+		public class TestParameterAttribute : ParameterAttribute
+		{
+			public TestParameterAttribute()
+				: base(new TestField())
+			{
+			}
+		}
+
+		public abstract class TestObject2
+		{
+			[LazyInstance, Parameter(10)]
+			public abstract ArrayList List { get; set; }
+
+			[LazyInstance, Parameter("test")]
+			public abstract string Str { get; set; }
+
+			[LazyInstance, Parameter(20)]
+			public abstract string this[int i] { get; set; }
+
+			[LazyInstance, Parameter(20, 30)]
+			public abstract TestField Field1 { get; set; }
+
+			[LazyInstance, TestParameter]
+			public abstract TestField Field2 { get; set; }
+
+			[LazyInstance, Parameter(55)]
+			public abstract InnerObject InnerObject { get; set; }
+
+			[LazyInstance, Parameter(88)]
+			public abstract AbstractObject AbstractObject { get; set; }
+		}
+
+		[Test]
+		public void ParamTest()
+		{
+			TestObject2 o = (TestObject2)TypeAccessor.CreateInstance(typeof(TestObject2));
+
+			Assert.AreEqual(10,     o.List.Capacity);
+			Assert.AreEqual("test", o.Str);
+			Assert.AreEqual(50,     o.Field1.Value);
+			Assert.AreEqual(77,     o.Field2.Value);
+			Assert.AreEqual(55,     o.InnerObject.Field);
+		}
+
+		[LazyInstances]
+		public abstract class TestObject3
+		{
+			public abstract string Str1 { get; set; }
+			[LazyInstance(false), Parameter("")]
+			public abstract string Str2 { get; set; }
+		}
+
+		[Test]
+		public void LazyInstancesTest()
+		{
+			TestObject3 o = (TestObject3)TypeAccessor.CreateInstance(typeof(TestObject3));
+
+			Assert.AreEqual("", o.Str1);
+			Assert.AreEqual("", o.Str2);
+
+			o.Str1 = null;
+			o.Str2 = null;
+
+			Assert.AreEqual("",   o.Str1);
+			Assert.AreEqual(null, o.Str2);
+		}
+
+		[LazyInstances(false)]
+		public abstract class TestObject4 : TestObject3
+		{
+		}
+
+		[Test]
+		public void LazyInstancesFalseTest()
+		{
+			TestObject4 o = (TestObject4)TypeAccessor.CreateInstance(typeof(TestObject4));
+
+			Assert.AreEqual("", o.Str1);
+			Assert.AreEqual("", o.Str2);
+
+			o.Str1 = null;
+			o.Str2 = null;
+
+			Assert.AreEqual(null, o.Str1);
+			Assert.AreEqual(null, o.Str2);
+		}
+
+		[LazyInstances(typeof(string))]
+		public abstract class TestObject5
+		{
+			public abstract string    Str  { get; set; }
+			public abstract ArrayList List { get; set; }
+		}
+
+		[Test]
+		public void LazyInstancesTypeTest()
+		{
+			TestObject5 o = (TestObject5)TypeAccessor.CreateInstance(typeof(TestObject5));
+
+			Assert.IsNotNull(o.Str);
+			Assert.IsNotNull(o.List);
+
+			o.Str  = null;
+			o.List = null;
+
+			Assert.IsNotNull(o.Str);
+			Assert.AreEqual (null, o.List);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/TypeBuilder/NoInstanceAttributeTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,35 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+
+namespace TypeBuilder
+{
+	[TestFixture]
+	public class NoInstanceAttributeTest
+	{
+		public abstract class PersonCitizenship
+		{
+		}
+
+		public abstract class Person
+		{
+			[NoInstance]
+			public abstract PersonCitizenship Citizenship { get; set; }
+		}
+
+		[Test]
+		public void Text()
+		{
+			Person person = (Person)TypeAccessor.CreateInstance(typeof(Person));
+
+			Assert.IsNull(person.Citizenship);
+
+			person.Citizenship = (PersonCitizenship)TypeAccessor.CreateInstance(typeof(PersonCitizenship));
+
+			Assert.IsNotNull(person.Citizenship);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/TypeBuilder/NoInstanceAttributeTest2.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,34 @@
+using NUnit.Framework;
+
+using BLToolkit.EditableObjects;
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+
+namespace TypeBuilder
+{
+	[TestFixture]
+	public class NoInstanceAttributeTest2
+	{
+		public abstract class PersonCitizenship : EditableObject
+		{
+		}
+
+		public abstract class Person : EditableObject
+		{
+			[NoInstance]
+			public abstract PersonCitizenship Citizenship { get; set; }
+		}
+
+		[Test]
+		public void Text()
+		{
+			Person person = (Person)TypeAccessor.CreateInstance(typeof(Person));
+
+			Assert.IsNull(person.Citizenship);
+
+			person.Citizenship = (PersonCitizenship)TypeAccessor.CreateInstance(typeof(PersonCitizenship));
+
+			Assert.IsNotNull(person.Citizenship);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/TypeBuilder/ParameterAttributeTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,155 @@
+using System;
+using System.Collections;
+using System.Diagnostics.CodeAnalysis;
+using BLToolkit.EditableObjects;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+
+using NUnit.Framework;
+
+namespace TypeBuilder
+{
+	[TestFixture]
+	public class ParameterAttributeTest
+	{
+		public abstract class AbstractObject
+		{
+			public AbstractObject(InitContext init)
+			{
+				if (init.MemberParameters != null && init.MemberParameters.Length == 1)
+					Field = (int)init.MemberParameters[0];
+				else
+					Field = 77;
+			}
+
+			public int Field;
+		}
+
+		public class InnerObject
+		{
+			public InnerObject(InitContext init)
+			{
+				if (init.MemberParameters != null && init.MemberParameters.Length == 1)
+					Field = (int)init.MemberParameters[0];
+				else
+					Field = 44;
+			}
+
+			public int Field;
+		}
+
+		public class TestField
+		{
+			public TestField()
+			{
+				Value = 10;
+			}
+
+			public TestField(int p1, float p2)
+			{
+				Value = p1 + (int)p2;
+			}
+
+			public TestField(TestField p1)
+			{
+				Value = 77;
+			}
+
+			public int Value;
+		}
+
+		[AttributeUsage(AttributeTargets.Property)]
+		public class TestParameterAttribute : ParameterAttribute
+		{
+			public TestParameterAttribute() : base(new TestField())
+			{
+			}
+		}
+
+		public abstract class TestObject1
+		{
+			[Parameter(10)]     public abstract ArrayList   List         { get; set; }
+			[Parameter("t")]    public abstract string      Str          { get; set; }
+			[Parameter(20)]     public abstract string      this[int i]  { get; set; }
+			[Parameter(20, 30)] public abstract TestField   Field1       { get; set; }
+			[TestParameter]     public abstract TestField   Field2       { get; set; }
+			[Parameter(55)]     public abstract InnerObject InnerObject1 { get; set; }
+			[Parameter(54)]     public abstract int?        Int1         { get; set; }
+			[Parameter(null)]   public abstract int?        Int2         { get; set; }
+			
+			[Parameter(2,2,2)]  public abstract DateTime    Date         { get; set; }
+			[Parameter(222L)]   public abstract Decimal     Decimal1     { get; set; }
+			[Parameter(1, 0, 0, true, (byte)2)]
+			                    public abstract Decimal?    Decimal2     { get; set; }
+			[Parameter(new int[]{2, 0, 0, 0})]
+			                    public abstract Decimal     Decimal3     { get; set; }
+			[Parameter(22.05)]  public abstract Decimal     Decimal4     { get; set; }
+			[Parameter(null)]   public abstract Decimal?    Decimal5     { get; set; }
+		}
+
+		[Test]
+		public void ParamTest()
+		{
+			TestObject1 o = (TestObject1)TypeAccessor.CreateInstance(typeof(TestObject1));
+
+			Assert.That(o.List.Capacity,      Is.EqualTo(10));
+			Assert.That(o.Str,                Is.EqualTo("t"));
+			Assert.That(o.Field1.Value,       Is.EqualTo(50));
+			Assert.That(o.Field2.Value,       Is.EqualTo(77));
+			Assert.That(o.InnerObject1.Field, Is.EqualTo(55));
+			Assert.That(o.Int1,               Is.EqualTo(54));
+			Assert.That(o.Int2,               Is.EqualTo(null));
+			Assert.That(o.Date,               Is.EqualTo(new DateTime(2,2,2)));
+			Assert.That(o.Decimal1,           Is.EqualTo(222m));
+			Assert.That(o.Decimal2,           Is.EqualTo(-0.01m));
+			Assert.That(o.Decimal3,           Is.EqualTo(2m));
+			Assert.That(o.Decimal4,           Is.EqualTo(22.05m));
+			Assert.That(o.Decimal5,           Is.EqualTo(null));
+		}
+
+		public abstract class TestObject2 : EditableObject
+		{
+			protected TestObject2() {}
+			protected TestObject2(InitContext context) {}
+
+			[Parameter(10)]     public abstract ArrayList   List         { get; set; }
+			[Parameter("t")]    public abstract string      Str          { get; set; }
+			[Parameter(20)]     public abstract string      this[int i]  { get; set; }
+			[Parameter(20, 30)] public abstract TestField   Field1       { get; set; }
+			[TestParameter]     public abstract TestField   Field2       { get; set; }
+			[Parameter(55)]     public abstract InnerObject InnerObject1 { get; set; }
+			[Parameter(54)]     public abstract int?        Int1         { get; set; }
+			[Parameter(null)]   public abstract int?        Int2         { get; set; }
+			
+			[Parameter(2,2,2)]  public abstract DateTime    Date         { get; set; }
+			[Parameter(222L)]   public abstract Decimal     Decimal1     { get; set; }
+			[Parameter(1, 0, 0, true, (byte)2)]
+			                    public abstract Decimal?    Decimal2     { get; set; }
+			[Parameter(new int[]{2, 0, 0, 0})]
+			                    public abstract Decimal     Decimal3     { get; set; }
+			[Parameter(22.05)]  public abstract Decimal     Decimal4     { get; set; }
+			[Parameter(null)]   public abstract Decimal?    Decimal5     { get; set; }
+		}
+
+		[Test]
+		public void EditablObjectParamTest()
+		{
+			TestObject2 o = (TestObject2)TypeAccessor.CreateInstance(typeof(TestObject2), new InitContext());
+
+			Assert.That(o.List.Capacity,      Is.EqualTo(10));
+			Assert.That(o.Str,                Is.EqualTo("t"));
+			Assert.That(o.Field1.Value,       Is.EqualTo(50));
+			Assert.That(o.Field2.Value,       Is.EqualTo(77));
+			Assert.That(o.InnerObject1.Field, Is.EqualTo(55));
+			Assert.That(o.Int1,               Is.EqualTo(54));
+			Assert.That(o.Int2,               Is.EqualTo(null));
+			Assert.That(o.Date,               Is.EqualTo(new DateTime(2,2,2)));
+			Assert.That(o.Decimal1,           Is.EqualTo(222m));
+			Assert.That(o.Decimal2,           Is.EqualTo(-0.01m));
+			Assert.That(o.Decimal3,           Is.EqualTo(2m));
+			Assert.That(o.Decimal4,           Is.EqualTo(22.05m));
+			Assert.That(o.Decimal5,           Is.EqualTo(null));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/TypeBuilder/TypeFactoryTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,62 @@
+using System;
+using System.IO;
+
+using NUnit.Framework;
+
+using BLToolkit.Reflection;
+using BLToolkit.TypeBuilder;
+
+namespace TypeBuilder
+{
+	[TestFixture]
+	public class TypeFactoryTest : MarshalByRefObject
+	{
+		public TypeFactoryTest()
+		{
+			// Force call to TypeFactory .cctor
+			//
+			TypeFactory.SealTypes = true;
+
+			Console.WriteLine("Domain name: {0}", AppDomain.CurrentDomain.FriendlyName);
+		}
+
+		[Serializable]
+		public abstract class TestObject
+		{
+			public abstract int Number { get; set; }
+		}
+
+		public int GetNumber(TestObject o)
+		{
+			return o.Number;
+		}
+
+		[Test]
+		public void AssemblyResolver()
+		{
+			var setup = new AppDomainSetup();
+			var basePath = GetType().Assembly.GetName(false).CodeBase;
+
+			basePath = basePath.Replace("file:///", "");
+			basePath = Path.GetDirectoryName(basePath);
+
+			setup.ApplicationBase = "file:///" + basePath;
+
+			var appDomain = AppDomain.CreateDomain("NewDomain", null, setup);
+
+			basePath = GetType().Assembly.GetName(false).CodeBase;
+			basePath = Path.GetFileName(basePath).ToLower().Replace(".dll", "");
+
+			var test = (TypeFactoryTest)appDomain.CreateInstanceAndUnwrap(basePath, GetType().FullName);
+			var o    = (TestObject)TypeAccessor.CreateInstance(typeof(TestObject));
+
+			o.Number = 23;
+
+			var n = test.GetNumber(o);
+
+			AppDomain.Unload(appDomain);
+
+			Assert.AreEqual(23, n);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/UnitTests.CS.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,343 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>UnitTests.CS</RootNamespace>
+    <AssemblyName>UnitTests.CS</AssemblyName>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;MSSQL;FW3</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE;MSSQL;FW3</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;MSSQL;FW3</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\UnitTests.CS.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE;MSSQL;FW3</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\UnitTests.CS.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework, Version=2.6.3.13283, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\NUnit.2.6.3\lib\nunit.framework.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="WindowsBase">
+      <RequiredTargetFramework>3.0</RequiredTargetFramework>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Aspects\AsyncAndDataAccessorTest.cs" />
+    <Compile Include="Aspects\CacheAspectTest.cs" />
+    <Compile Include="Aspects\AsyncAspectTest.cs" />
+    <Compile Include="Aspects\ClearCacheAspect.cs" />
+    <Compile Include="Aspects\CounterAspectTest.cs" />
+    <Compile Include="Aspects\InterceptorAspectTest.cs" />
+    <Compile Include="Aspects\LoggingAspectTest.cs" />
+    <Compile Include="Aspects\MixinAspectTest.cs" />
+    <Compile Include="Aspects\NotNullAspectTest.cs" />
+    <Compile Include="Aspects\OverloadAspectTest.cs" />
+    <Compile Include="Common\ConvertTest.cs" />
+    <Compile Include="Common\OperatorTest.cs" />
+    <Compile Include="Common\NameOrIndexParameterTest.cs" />
+    <Compile Include="ComponenetModel\ObjectBinderTest.cs" />
+    <Compile Include="DataAccess\ActualTypeAttributeTest.cs" />
+    <Compile Include="DataAccess\ArrayTest.cs" />
+    <Compile Include="DataAccess\DynamicSqlQueryTest.cs" />
+    <Compile Include="DataAccess\TestQueryAttribute.cs" />
+    <Compile Include="DataAccess\XmlTypeTest.cs" />
+    <Compile Include="DataAccess\DataAccessorBuilderTest.cs" />
+    <Compile Include="DataAccess\PrimaryKeyAttributeTest.cs" />
+    <Compile Include="DataAccess\ScalarListTest.cs" />
+    <Compile Include="DataAccess\CreateEntityTest.cs" />
+    <Compile Include="DataAccess\DataAccessorTest.cs" />
+    <Compile Include="DataAccess\DictionaryTest.cs" />
+    <Compile Include="DataAccess\EnumTest.cs" />
+    <Compile Include="DataAccess\ScalarTest.cs" />
+    <Compile Include="DataAccess\OutRefTest.cs" />
+    <Compile Include="DataAccess\PersonDataSet2.cs">
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="DataAccess\PersonDataSet2.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+    </Compile>
+    <Compile Include="DataAccess\SqlQueryTest.cs" />
+    <Compile Include="DataAccess\SqlQueryTest2.cs" />
+    <Compile Include="DataAccess\SqlTest.cs" />
+    <Compile Include="DataAccess\XmlExtension.cs" />
+    <Compile Include="Data\BinaryTest.cs" />
+    <Compile Include="Data\ComplexMappingTest.cs" />
+    <Compile Include="Data\CompositeKeyTest.cs" />
+    <Compile Include="Data\EventsTest.cs" />
+    <Compile Include="Data\ExecuteForEach.cs" />
+    <Compile Include="Data\ExecuteObjectTest.cs" />
+    <Compile Include="Data\InnerTypesTest.cs" />
+    <Compile Include="Data\ExecuteDictionaryTest.cs" />
+    <Compile Include="Data\ExecuteScalarDictionaryTest.cs" />
+    <Compile Include="Data\ExecuteScalarListTest.cs" />
+    <Compile Include="Data\DbManagerTest.cs" />
+    <Compile Include="Data\ExecuteListT.cs" />
+    <Compile Include="Data\ExecuteScalarTest.cs" />
+    <Compile Include="Data\NullableParameter.cs" />
+    <Compile Include="Data\OutputParameter.cs" />
+    <Compile Include="Data\Sql\DefinitionTest.cs" />
+    <Compile Include="Data\Sql\FromTest.cs" />
+    <Compile Include="Data\Sql\SelectTest.cs" />
+    <Compile Include="EditableObjects\EditableObjectT.cs" />
+    <Compile Include="EditableObjects\EditableArrayListTest.cs" />
+    <Compile Include="EditableObjects\EditableList_AcceptChanges.cs" />
+    <Compile Include="EditableObjects\EditableObjectTest.cs" />
+    <Compile Include="EditableObjects\InnerObjectTest.cs" />
+    <Compile Include="EditableObjects\NestedObjectTest.cs" />
+    <Compile Include="EditableObjects\NotifyCollectionChangeTest.cs" />
+    <Compile Include="EditableObjects\NotifyPropertyChangedTest.cs" />
+    <Compile Include="JointureTests\Artist.cs" />
+    <Compile Include="JointureTests\Artist2.cs" />
+    <Compile Include="JointureTests\AssociationTests.cs" />
+    <Compile Include="JointureTests\Consts.cs" />
+    <Compile Include="JointureTests\MusicDB.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="JointureTests\Title.cs" />
+    <Compile Include="Mapping\BltMapTests.cs" />
+    <Compile Include="Mapping\MemberMapperDefaultMappersTest.cs" />
+    <Compile Include="Mapping\ExpressionMapperTest.cs" />
+    <Compile Include="Mapping\NullableEnum.cs" />
+    <Compile Include="Mapping\DefaultValueAttributeTest.cs" />
+    <Compile Include="Mapping\EnumExtension.cs" />
+    <Compile Include="Mapping\ISupportMappingTest.cs" />
+    <Compile Include="Mapping\MapFieldAttributeTest.cs" />
+    <Compile Include="Mapping\MapperMemberAttributeTest.cs" />
+    <Compile Include="Mapping\MapTest.cs" />
+    <Compile Include="Mapping\MapValueAttributeTest.cs" />
+    <Compile Include="Mapping\MemberMapperTest.cs" />
+    <Compile Include="Mapping\MetadataProvider\MetadataProviderTest.cs" />
+    <Compile Include="Mapping\NullableAttributeTest.cs" />
+    <Compile Include="Mapping\ObjectMapperAttributeTest.cs" />
+    <Compile Include="Mapping\ObjectMapperTest.cs" />
+    <Compile Include="Mapping\ResultSetTest.cs" />
+    <Compile Include="Mapping\TestFluentNullable.cs" />
+    <Compile Include="Mapping\TrimmableAttributeTest.cs" />
+    <Compile Include="Mapping\XmlMap.cs" />
+    <Compile Include="Patterns\MustImplementAttributeTest.cs" />
+    <Compile Include="Patterns\DuckTypingTest.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+      <DependentUpon>Settings.settings</DependentUpon>
+    </Compile>
+    <Compile Include="Reflection\TypeAccessorTest3.cs" />
+    <Compile Include="Reflection\Emit\MethodBuilderHelperTest.cs" />
+    <Compile Include="Reflection\Extension\DefaultValueTest.cs" />
+    <Compile Include="Mapping\Person.mapping.cs" />
+    <Compile Include="TypeBuilder\Builders\AutoImplementInterfaceTest.cs" />
+    <Compile Include="Reflection\ObjectFactoryAttributeTest.cs" />
+    <Compile Include="Reflection\ExtendedPropertyDescriptorTest.cs" />
+    <Compile Include="Reflection\TypeAccessorTest.cs" />
+    <Compile Include="Reflection\TypeAccessorTest2.cs" />
+    <Compile Include="Reflection\TypeHelperTest.cs" />
+    <Compile Include="TestFixtureBase.cs" />
+    <Compile Include="TestObject.cs" />
+    <Compile Include="TypeBuilder\Builders\ArrayBuilderTest.cs" />
+    <Compile Include="TypeBuilder\Builders\IAbstractTypeBuilderTest.cs" />
+    <Compile Include="TypeBuilder\Builders\DefaultTypeBuilderTest.cs" />
+    <Compile Include="TypeBuilder\Builders\ImplemetInterfaceBuilderTest.cs" />
+    <Compile Include="TypeBuilder\Builders\TypeAccessorBuilderTest.cs" />
+    <Compile Include="TypeBuilder\GenerateAtributeTest.cs" />
+    <Compile Include="TypeBuilder\GenericMethodTest.cs" />
+    <Compile Include="TypeBuilder\InternalTypesTest.cs" />
+    <Compile Include="TypeBuilder\GetSetValueAttributeTest.cs" />
+    <Compile Include="TypeBuilder\InstanceTypeAttributeTest.cs" />
+    <Compile Include="TypeBuilder\LazyInstanceAttributeTest.cs" />
+    <Compile Include="TypeBuilder\NoInstanceAttributeTest.cs" />
+    <Compile Include="TypeBuilder\NoInstanceAttributeTest2.cs" />
+    <Compile Include="TypeBuilder\ParameterAttributeTest.cs" />
+    <Compile Include="TypeBuilder\Builders\PropertyChangeBuilderTest.cs" />
+    <Compile Include="TypeBuilder\TypeFactoryTest.cs" />
+    <Compile Include="Reflection\Extension\ExtensionTest.cs" />
+    <Compile Include="Validation\MinValue.cs" />
+    <Compile Include="Validation\NullValue.cs" />
+    <Compile Include="Validation\RegExValidationTest.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config">
+      <SubType>Designer</SubType>
+    </None>
+    <None Include="DataAccess\PersonDataSet2.xsc">
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+    </None>
+    <None Include="DataAccess\PersonDataSet2.xsd">
+      <SubType>Designer</SubType>
+      <Generator>MSDataSetGenerator</Generator>
+      <LastGenOutput>PersonDataSet2.Designer.cs</LastGenOutput>
+      <CustomToolNamespace>DataAccessTest</CustomToolNamespace>
+    </None>
+    <None Include="DataAccess\PersonDataSet2.xss">
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+    </None>
+    <None Include="DataAccess\PersonDataSet2.xsx">
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+    </None>
+    <None Include="packages.config" />
+    <None Include="Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+    <None Include="TypeBuilder\InternalTypesTest.snk">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Mapping\Map.xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="DataAccess\XmlExtension.xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Mapping\Person.mapping.xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Mapping\XmlMap.xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Data\Sql\DefinitionData.xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\DataProviders\MySql\BLToolkit.Data.DataProvider.MySql.4.csproj">
+      <Project>{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}</Project>
+      <Name>BLToolkit.Data.DataProvider.MySql.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\DataProviders\Oracle\BLToolkit.Data.DataProvider.Oracle.4.csproj">
+      <Project>{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}</Project>
+      <Name>BLToolkit.Data.DataProvider.Oracle.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\Extensions\JointureAddOn\BLToolkit.4.JointureAddOn.csproj">
+      <Project>{9FD2722C-1E6C-4061-8AC0-32EE28808FC0}</Project>
+      <Name>BLToolkit.4.JointureAddOn</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/UnitTests.CS.csproj.DotSettings	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,2 @@
+<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
+	<s:String x:Key="/Default/CodeEditing/Localization/Localizable/@EntryValue">No</s:String></wpf:ResourceDictionary>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/UnitTests.CS.csproj.ReSharper	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,3 @@
+<Configuration>
+  <Localizable>No</Localizable>
+</Configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Validation/MinValue.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,35 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Validation;
+
+namespace Validation
+{
+	[TestFixture]
+	public class MinValue
+	{
+		class Entity
+		{
+			[MinValue(1), Required]
+			public float Test { get; set; }
+		}
+
+		[Test]
+		public void Test()
+		{
+			/*
+			var nullValue = TypeAccessor.GetNullValue;
+			TypeAccessor.GetNullValue = type =>
+			{
+				if (type == typeof(float)) 
+					return float.MinValue;
+				else return nullValue(type);
+			};
+			*/
+
+			var foo = new Entity();
+			Assert.AreEqual(false, Validator.IsValid(foo, "Test"));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Validation/NullValue.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,56 @@
+using System;
+using BLToolkit.EditableObjects;
+using BLToolkit.Reflection;
+using NUnit.Framework;
+
+using BLToolkit.Validation;
+using BLToolkit.Mapping;
+
+namespace Validation
+{
+	[TestFixture]
+	public class NullValue
+	{
+		public class Entity : EditableObject
+		{
+			private byte timeStart;
+
+			[Required("Time Start is required")]
+			[NullValue(typeof(byte), 99)]
+			public byte TimeStart
+			{
+				get { return timeStart;  }
+				set { timeStart = value; }
+			}
+		}
+
+		[Test]
+		public void Test()
+		{
+			Entity test = new Entity();
+
+			test.TimeStart = 0;
+			test.Validate();
+		}
+
+		public abstract class PersonDoc : EditableObject
+		{
+			[MapField("Series_PersonDoc"), MaxLength(50), Required]
+			public abstract string Series_PersonDoc { get; set; }
+
+			[MapField("BegDate_PersonDoc"), Required]
+			[NullDateTime()]
+			public abstract DateTime BegDate_PersonDoc { get; set; }
+		}
+
+
+		[Test, ExpectedException(typeof(ValidationException))]
+		public void Test2()
+		{
+			PersonDoc doc = TypeAccessor<PersonDoc>.CreateInstance();
+
+			doc.Series_PersonDoc = "PersonDoc";
+			doc.Validate();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/Validation/RegExValidationTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,30 @@
+using BLToolkit.EditableObjects;
+using BLToolkit.Reflection;
+using BLToolkit.Validation;
+using NUnit.Framework;
+
+namespace Validation
+{
+	[TestFixture]
+	public class RegExValidationTest
+	{
+		public abstract class Entity : EditableObject
+		{
+			[RegEx("[a-zA-Z0-9]*")]
+			public string AlphaNumeric;
+		}
+
+		[Test]
+		public void Test()
+		{
+			Entity entity = (Entity)TypeAccessor.CreateInstance(typeof(Entity));
+
+			entity.AlphaNumeric = null; Assert.IsTrue(entity.IsValid("AlphaNumeric"));
+			entity.AlphaNumeric = ""; Assert.IsTrue(entity.IsValid("AlphaNumeric"));
+			entity.AlphaNumeric = "abAB01"; Assert.IsTrue(entity.IsValid("AlphaNumeric"));
+			entity.AlphaNumeric = "01ABab"; Assert.IsTrue(entity.IsValid("AlphaNumeric"));
+			entity.AlphaNumeric = "ab_AB.01"; Assert.IsFalse(entity.IsValid("AlphaNumeric"));
+			entity.AlphaNumeric = "33###"; Assert.IsFalse(entity.IsValid("AlphaNumeric"));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/app.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,41 @@
+<?xml version="1.0"?>
+<configuration>
+	<configSections>
+		<section name="bltoolkit" type="BLToolkit.Configuration.BLToolkitSection, BLToolkit.4"/>
+	</configSections>
+	<appSettings>
+		<!-- Default configuration -->
+		<add key="ConnectionString" value="Server=.;Database=BLToolkitData;Integrated Security=SSPI"/>
+		<!-- SQL Server Development configuration -->
+		<add key="ConnectionString.Development" value="Server=.;Database=BLToolkitData;Integrated Security=SSPI"/>
+		<!-- SQL Server Production configuration -->
+		<add key="ConnectionString.Production" value="Server=.;Database=BLToolkitData;Integrated Security=SSPI"/>
+		<!-- SQL Server configuration -->
+		<add key="ConnectionString.Sql" value="Server=.;Database=BLToolkitData;Integrated Security=SSPI"/>
+		<!-- Oracle configuration -->
+		<add key="ConnectionString.Oracle" value="User Id=/;Data Source=BLToolkitData"/>
+		<!-- OLEDB configuration -->
+		<add key="ConnectionString.OleDb" value="Provider=SQLOLEDB;Data Source=.;Integrated Security=SSPI;Initial Catalog=BLToolkitData"/>
+		<!-- OLEDB Development configuration -->
+		<add key="ConnectionString.OleDb.Development" value="Provider=SQLOLEDB;Data Source=.;Integrated Security=SSPI;Initial Catalog=BLToolkitData"/>
+		<!-- OLEDB Production configuration -->
+		<add key="ConnectionString.OleDb.Production" value="Provider=SQLOLEDB;Data Source=.;Integrated Security=SSPI;Initial Catalog=BLToolkitData"/>
+		<!-- MySql configuration -->
+		<add key="ConnectionString.MySql" value="Server=DBHost;Port=3306;Database=bltoolkitdata;Uid=root;Pwd=TestPassword;"/>
+		<!-- Additional data providers -->
+		<add key="BLToolkit.DataProviders" value="BLToolkit.Data.DataProvider.MySqlDataProvider, BLToolkit.Data.DataProvider.MySql.4"/>
+		<add key="BLToolkit.DataProviders" value="BLToolkit.Data.DataProvider.OdpDataProvider,   BLToolkit.Data.DataProvider.Oracle.4"/>
+
+		<!-- Samples
+		<add
+			key   = "BLToolkit.DataProviders"
+			value = "BLToolkit.Data.DataProvider.OracleDataProvider;SomeNamespace.SomeType, SomeAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1234567890ABCDEF"/>
+		<add
+			key   = "BLToolkit.DefaultConfiguration"
+			value = "Oracle"/>
+		-->
+	</appSettings>
+	<bltoolkit>
+		<typeFactory saveTypes="true"/>
+	</bltoolkit>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/CS/packages.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="NUnit" version="2.6.3" targetFramework="net40" />
+</packages>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/DataProvider/Access/App.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+	<configSections>
+		<section name="bltoolkit" type="BLToolkit.Configuration.BLToolkitSection, BLToolkit.3"/>
+	</configSections>
+	<connectionStrings>
+		<add name="Access" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\..\..\..\Data\BLToolkitData.mdb;Persist Security Info=True"/>
+	</connectionStrings>
+	<bltoolkit defaultConfiguration="Access">
+		<typeFactory saveTypes="true" />
+	</bltoolkit>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/DataProvider/Access/UnitTests.Access.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,394 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>UnitTests.CS</RootNamespace>
+    <AssemblyName>UnitTests.Access</AssemblyName>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <PublishUrl>http://localhost/UnitTests.CS.2.Access/</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Web</InstallFrom>
+    <UpdateEnabled>true</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>true</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\bin\Debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;ACCESS;OLEDB;FW3</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>3021</NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\bin\Release\</OutputPath>
+    <DefineConstants>TRACE;ACCESS;OLEDB;FW3</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>3021</NoWarn>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework, Version=2.4.6.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\Tools\NUnit\nunit.framework.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+    <Reference Include="WindowsBase">
+      <RequiredTargetFramework>3.0</RequiredTargetFramework>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CS\Aspects\CacheAspectTest.cs">
+      <Link>Aspects\CacheAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\CounterAspectTest.cs">
+      <Link>Aspects\CounterAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\InterceptorAspectTest.cs">
+      <Link>Aspects\InterceptorAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\LoggingAspectTest.cs">
+      <Link>Aspects\LoggingAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\MixinAspectTest.cs">
+      <Link>Aspects\MixinAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\NotNullAspectTest.cs">
+      <Link>Aspects\NotNullAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Common\ConvertTest.cs">
+      <Link>Common\ConvertTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Common\NameOrIndexParameterTest.cs">
+      <Link>Common\NameOrIndexParameterTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\PersonDataSet2.Designer.cs">
+      <Link>Mapping\PersonDataSet2.Designer.cs</Link>
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\TestQueryAttribute.cs">
+      <Link>DataAccess\TestQueryAttribute.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\XmlTypeTest.cs">
+      <Link>DataAccess\XmlTypeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\DataAccessorBuilderTest.cs">
+      <Link>DataAccess\DataAccessorBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\PrimaryKeyAttributeTest.cs">
+      <Link>DataAccess\PrimaryKeyAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\ScalarListTest.cs">
+      <Link>DataAccess\ScalarListTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\CreateEntityTest.cs">
+      <Link>DataAccess\CreateEntityTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\DataAccessorTest.cs">
+      <Link>DataAccess\DataAccessorTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\DictionaryTest.cs">
+      <Link>DataAccess\DictionaryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\EnumTest.cs">
+      <Link>DataAccess\EnumTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\ScalarTest.cs">
+      <Link>DataAccess\ScalarTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\PersonDataSet2.cs">
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+      <SubType>Component</SubType>
+      <Link>Mapping\PersonDataSet2.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\SqlQueryTest.cs">
+      <Link>DataAccess\SqlQueryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\SqlQueryTest2.cs">
+      <Link>DataAccess\SqlQueryTest2.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\SqlTest.cs">
+      <Link>DataAccess\SqlTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\XmlExtension.cs">
+      <Link>DataAccess\XmlExtension.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\BinaryTest.cs">
+      <Link>Data\BinaryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\CompositeKeyTest.cs">
+      <Link>Data\CompositeKeyTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\InnerTypesTest.cs">
+      <Link>Data\InnerTypesTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\ExecuteDictionaryTest.cs">
+      <Link>Data\ExecuteDictionaryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\ExecuteScalarDictionaryTest.cs">
+      <Link>Data\ExecuteScalarDictionaryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\ExecuteScalarListTest.cs">
+      <Link>Data\ExecuteScalarListTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\DbManagerTest.cs">
+      <Link>Data\DbManagerTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\ExecuteListT.cs">
+      <Link>Data\ExecuteListT.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\ExecuteScalarTest.cs">
+      <Link>Data\ExecuteScalarTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\NullableParameter.cs">
+      <Link>Data\NullableParameter.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\EditableObjects\EditableArrayListTest.cs">
+      <Link>EditableObjects\EditableArrayListTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\EditableObjects\EditableList_AcceptChanges.cs">
+      <Link>EditableObjects\EditableList_AcceptChanges.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\EditableObjects\EditableObjectTest.cs">
+      <Link>EditableObjects\EditableObjectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\EditableObjects\InnerObjectTest.cs">
+      <Link>EditableObjects\InnerObjectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\EditableObjects\NestedObjectTest.cs">
+      <Link>EditableObjects\NestedObjectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\DefaultValueAttributeTest.cs">
+      <Link>Mapping\DefaultValueAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\EnumExtension.cs">
+      <Link>Mapping\EnumExtension.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\ISupportMappingTest.cs">
+      <Link>Mapping\ISupportMappingTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MapFieldAttributeTest.cs">
+      <Link>Mapping\MapFieldAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MapperMemberAttributeTest.cs">
+      <Link>Mapping\MapperMemberAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MapTest.cs">
+      <Link>Mapping\MapTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MapValueAttributeTest.cs">
+      <Link>Mapping\MapValueAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MemberMapperTest.cs">
+      <Link>Mapping\MemberMapperTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MetadataProvider\MetadataProviderTest.cs">
+      <Link>Mapping\MetadataProviderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\NullableAttributeTest.cs">
+      <Link>Mapping\NullableAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\ObjectMapperAttributeTest.cs">
+      <Link>Mapping\ObjectMapperAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\TrimmableAttributeTest.cs">
+      <Link>Mapping\TrimmableAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\XmlMap.cs">
+      <Link>Mapping\XmlMap.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Patterns\MustImplementAttributeTest.cs">
+      <Link>Patterns\MustImplementAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Patterns\DuckTypingTest.cs">
+      <Link>Patterns\DuckTypingTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Properties\AssemblyInfo.cs">
+      <Link>Properties\AssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Properties\Settings.Designer.cs">
+      <Link>Properties\Settings.Designer.cs</Link>
+      <AutoGen>True</AutoGen>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+      <DependentUpon>Settings.settings</DependentUpon>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\Emit\MethodBuilderHelperTest.cs">
+      <Link>Reflection\MethodBuilderHelperTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\Extension\DefaultValueTest.cs">
+      <Link>Reflection\DefaultValueTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\Person.mapping.cs">
+      <Link>Mapping\Person.mapping.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\ObjectFactoryAttributeTest.cs">
+      <Link>Reflection\ObjectFactoryAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\ExtendedPropertyDescriptorTest.cs">
+      <Link>Reflection\ExtendedPropertyDescriptorTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\TypeAccessorTest.cs">
+      <Link>Reflection\TypeAccessorTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\TypeAccessorTest2.cs">
+      <Link>Reflection\TypeAccessorTest2.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\TypeHelperTest.cs">
+      <Link>Reflection\TypeHelperTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\ArrayBuilderTest.cs">
+      <Link>TypeBuilder\ArrayBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\IAbstractTypeBuilderTest.cs">
+      <Link>TypeBuilder\IAbstractTypeBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\DefaultTypeBuilderTest.cs">
+      <Link>TypeBuilder\DefaultTypeBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\ImplemetInterfaceBuilderTest.cs">
+      <Link>TypeBuilder\ImplemetInterfaceBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\TypeAccessorBuilderTest.cs">
+      <Link>TypeBuilder\TypeAccessorBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\GetSetValueAttributeTest.cs">
+      <Link>TypeBuilder\GetSetValueAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\InstanceTypeAttributeTest.cs">
+      <Link>TypeBuilder\InstanceTypeAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\LazyInstanceAttributeTest.cs">
+      <Link>TypeBuilder\LazyInstanceAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\NoInstanceAttributeTest.cs">
+      <Link>TypeBuilder\NoInstanceAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\NoInstanceAttributeTest2.cs">
+      <Link>TypeBuilder\NoInstanceAttributeTest2.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\ParameterAttributeTest.cs">
+      <Link>TypeBuilder\ParameterAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\PropertyChangeBuilderTest.cs">
+      <Link>TypeBuilder\PropertyChangeBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\TypeFactoryTest.cs">
+      <Link>TypeBuilder\TypeFactoryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\Extension\ExtensionTest.cs">
+      <Link>Reflection\ExtensionTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Validation\NullValue.cs">
+      <Link>Validation\NullValue.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TestFixtureBase.cs" />
+    <Compile Include="..\..\CS\TestObject.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+    <None Include="..\..\CS\DataAccess\PersonDataSet2.xsc">
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+      <Link>Mapping\PersonDataSet2.xsc</Link>
+    </None>
+    <None Include="..\..\CS\DataAccess\PersonDataSet2.xsd">
+      <SubType>Designer</SubType>
+      <Generator>MSDataSetGenerator</Generator>
+      <LastGenOutput>PersonDataSet2.Designer.cs</LastGenOutput>
+      <CustomToolNamespace>DataAccessTest</CustomToolNamespace>
+      <Link>Mapping\PersonDataSet2.xsd</Link>
+    </None>
+    <None Include="..\..\CS\DataAccess\PersonDataSet2.xss">
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+      <Link>Mapping\PersonDataSet2.xss</Link>
+    </None>
+    <None Include="..\..\CS\DataAccess\PersonDataSet2.xsx">
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+      <Link>Mapping\PersonDataSet2.xsx</Link>
+    </None>
+    <None Include="..\..\CS\Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+      <Link>Properties\Settings.settings</Link>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="..\..\CS\Mapping\Map.xml">
+      <Link>Mapping\Map.xml</Link>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="..\..\CS\DataAccess\XmlExtension.xml">
+      <Link>DataAccess\XmlExtension.xml</Link>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="..\..\CS\Mapping\Person.mapping.xml">
+      <Link>Mapping\Person.mapping.xml</Link>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="..\..\CS\Mapping\XmlMap.xml">
+      <Link>Mapping\XmlMap.xml</Link>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\Source\BLToolkit.3.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/DataProvider/FireBird/App.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+	<configSections>
+		<section name="bltoolkit" type="BLToolkit.Configuration.BLToolkitSection, BLToolkit.3"/>
+	</configSections>
+	<connectionStrings>
+		<add name="Fdp" connectionString="DataSource=DBHost;Database=C:\Data\BLToolkitData.fb2;User Id=SYSDBA;Password=masterkey"/>
+	</connectionStrings>
+	<bltoolkit>
+		<dataProviders>
+			<add type="BLToolkit.Data.DataProvider.FdpDataProvider, UnitTests.Firebird" default="true"/>
+		</dataProviders>
+		<typeFactory saveTypes="true" />
+	</bltoolkit>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/DataProvider/FireBird/CreateDatabase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,63 @@
+using System;
+using System.Configuration;
+using System.IO;
+using BLToolkit.Data;
+using FirebirdSql.Data.FirebirdClient;
+using NUnit.Framework;
+
+namespace UnitTests.CS
+{
+	[TestFixture, Explicit, Category("DB setup")]
+	public class CreateDatabase
+	{
+		[Test]
+		public void Test()
+		{
+			FbConnection.CreateDatabase(ConfigurationManager.AppSettings.Get("ConnectionString.Fdp"), true);
+
+			const string path = @"..\..\..\..\Data\Create Scripts\Firebird2.sql";
+
+			using (DbManager db = new DbManager())
+			{
+				string cmd = string.Empty;
+				string term = ";";
+
+				foreach (string s in File.ReadAllLines(path))
+				{
+					string line = s.TrimEnd();
+					if (!line.EndsWith(term))
+					{
+						cmd += line + Environment.NewLine;
+						continue;
+					}
+
+					line = line.Substring(0, line.Length - term.Length).Trim();
+
+					if (line.ToUpperInvariant().StartsWith("SET TERM "))
+					{
+						term = line.Substring("SET TERM ".Length).Trim();
+						continue;
+					}
+					
+					if (line.ToUpperInvariant().StartsWith("COMMIT"))
+					{
+						continue;
+					}
+
+					Console.WriteLine("Executing script:");
+					Console.WriteLine(cmd + line);
+
+					db
+						.SetCommand(cmd + line)
+						.ExecuteNonQuery()
+						;
+
+					Console.WriteLine("Succeeded.");
+
+					cmd = string.Empty;
+				}
+	
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/DataProvider/FireBird/UnitTests.Firebird.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,402 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{ACD42369-6C01-44FA-B53C-685E6A01894E}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>UnitTests.CS</RootNamespace>
+    <AssemblyName>UnitTests.Firebird</AssemblyName>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <PublishUrl>http://localhost/UnitTests.CS.2.Fdp/</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Web</InstallFrom>
+    <UpdateEnabled>true</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>true</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\bin\Debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;FIREBIRD;FW3</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>3021</NoWarn>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\bin\Release\</OutputPath>
+    <DefineConstants>TRACE;FIREBIRD;FW3</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>3021</NoWarn>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="FirebirdSql.Data.FirebirdClient, Version=2.1.0.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\Redist\Firebird\FirebirdSql.Data.FirebirdClient.dll</HintPath>
+    </Reference>
+    <Reference Include="nunit.framework, Version=2.4.6.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\Tools\NUnit\nunit.framework.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.configuration" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+    <Reference Include="WindowsBase">
+      <RequiredTargetFramework>3.0</RequiredTargetFramework>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CS\Aspects\CacheAspectTest.cs">
+      <Link>Aspects\CacheAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\CounterAspectTest.cs">
+      <Link>Aspects\CounterAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\InterceptorAspectTest.cs">
+      <Link>Aspects\InterceptorAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\LoggingAspectTest.cs">
+      <Link>Aspects\LoggingAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\MixinAspectTest.cs">
+      <Link>Aspects\MixinAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\NotNullAspectTest.cs">
+      <Link>Aspects\NotNullAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Common\ConvertTest.cs">
+      <Link>Common\ConvertTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Common\NameOrIndexParameterTest.cs">
+      <Link>Common\NameOrIndexParameterTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\TestQueryAttribute.cs">
+      <Link>DataAccess\TestQueryAttribute.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\XmlTypeTest.cs">
+      <Link>DataAccess\XmlTypeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\DataAccessorBuilderTest.cs">
+      <Link>DataAccess\DataAccessorBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\PrimaryKeyAttributeTest.cs">
+      <Link>DataAccess\PrimaryKeyAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\ScalarListTest.cs">
+      <Link>DataAccess\ScalarListTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\CreateEntityTest.cs">
+      <Link>DataAccess\CreateEntityTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\DataAccessorTest.cs">
+      <Link>DataAccess\DataAccessorTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\DictionaryTest.cs">
+      <Link>DataAccess\DictionaryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\EnumTest.cs">
+      <Link>DataAccess\EnumTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\ScalarTest.cs">
+      <Link>DataAccess\ScalarTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\OutRefTest.cs">
+      <Link>DataAccess\OutRefTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\PersonDataSet2.cs">
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+      <SubType>Component</SubType>
+      <Link>Mapping\PersonDataSet2.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\PersonDataSet2.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+      <Link>Mapping\PersonDataSet2.Designer.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\SqlQueryTest.cs">
+      <Link>DataAccess\SqlQueryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\SqlQueryTest2.cs">
+      <Link>DataAccess\SqlQueryTest2.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\SqlTest.cs">
+      <Link>DataAccess\SqlTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\XmlExtension.cs">
+      <Link>DataAccess\XmlExtension.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\BinaryTest.cs">
+      <Link>Data\BinaryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\CompositeKeyTest.cs">
+      <Link>Common\CompositeKeyTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\InnerTypesTest.cs">
+      <Link>Data\InnerTypesTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\ExecuteDictionaryTest.cs">
+      <Link>Data\ExecuteDictionaryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\ExecuteScalarDictionaryTest.cs">
+      <Link>Data\ExecuteScalarDictionaryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\ExecuteScalarListTest.cs">
+      <Link>Data\ExecuteScalarListTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\DbManagerTest.cs">
+      <Link>Data\DbManagerTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\ExecuteListT.cs">
+      <Link>Data\ExecuteListT.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\ExecuteScalarTest.cs">
+      <Link>Data\ExecuteScalarTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\NullableParameter.cs">
+      <Link>Data\NullableParameter.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\EditableObjects\EditableArrayListTest.cs">
+      <Link>EditableObjects\EditableArrayListTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\EditableObjects\EditableList_AcceptChanges.cs">
+      <Link>EditableObjects\EditableList_AcceptChanges.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\EditableObjects\EditableObjectTest.cs">
+      <Link>EditableObjects\EditableObjectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\EditableObjects\InnerObjectTest.cs">
+      <Link>EditableObjects\InnerObjectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\EditableObjects\NestedObjectTest.cs">
+      <Link>EditableObjects\NestedObjectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\DefaultValueAttributeTest.cs">
+      <Link>Mapping\DefaultValueAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\EnumExtension.cs">
+      <Link>Mapping\EnumExtension.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\ISupportMappingTest.cs">
+      <Link>Mapping\ISupportMappingTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MapFieldAttributeTest.cs">
+      <Link>Mapping\MapFieldAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MapperMemberAttributeTest.cs">
+      <Link>Mapping\MapperMemberAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MapTest.cs">
+      <Link>Mapping\MapTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MapValueAttributeTest.cs">
+      <Link>Mapping\MapValueAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MemberMapperTest.cs">
+      <Link>Mapping\MemberMapperTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MetadataProvider\MetadataProviderTest.cs">
+      <Link>Mapping\MetadataProviderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\NullableAttributeTest.cs">
+      <Link>Mapping\NullableAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\ObjectMapperAttributeTest.cs">
+      <Link>Mapping\ObjectMapperAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\TrimmableAttributeTest.cs">
+      <Link>Mapping\TrimmableAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\XmlMap.cs">
+      <Link>Mapping\XmlMap.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Patterns\MustImplementAttributeTest.cs">
+      <Link>Patterns\MustImplementAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Patterns\DuckTypingTest.cs">
+      <Link>Patterns\DuckTypingTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Properties\AssemblyInfo.cs">
+      <Link>Properties\AssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <Link>Properties\Settings.Designer.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\Emit\MethodBuilderHelperTest.cs">
+      <Link>Reflection\MethodBuilderHelperTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\Extension\DefaultValueTest.cs">
+      <Link>Reflection\DefaultValueTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\Person.mapping.cs">
+      <Link>Mapping\Person.mapping.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\ObjectFactoryAttributeTest.cs">
+      <Link>Reflection\ObjectFactoryAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\ExtendedPropertyDescriptorTest.cs">
+      <Link>Reflection\ExtendedPropertyDescriptorTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\TypeAccessorTest.cs">
+      <Link>Reflection\TypeAccessorTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\TypeAccessorTest2.cs">
+      <Link>Reflection\TypeAccessorTest2.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\TypeHelperTest.cs">
+      <Link>Reflection\TypeHelperTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\ArrayBuilderTest.cs">
+      <Link>TypeBuilder\ArrayBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\IAbstractTypeBuilderTest.cs">
+      <Link>TypeBuilder\IAbstractTypeBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\DefaultTypeBuilderTest.cs">
+      <Link>TypeBuilder\DefaultTypeBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\ImplemetInterfaceBuilderTest.cs">
+      <Link>TypeBuilder\ImplemetInterfaceBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\TypeAccessorBuilderTest.cs">
+      <Link>TypeBuilder\TypeAccessorBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\GetSetValueAttributeTest.cs">
+      <Link>TypeBuilder\GetSetValueAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\InstanceTypeAttributeTest.cs">
+      <Link>TypeBuilder\InstanceTypeAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\LazyInstanceAttributeTest.cs">
+      <Link>TypeBuilder\LazyInstanceAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\NoInstanceAttributeTest.cs">
+      <Link>TypeBuilder\NoInstanceAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\NoInstanceAttributeTest2.cs">
+      <Link>TypeBuilder\NoInstanceAttributeTest2.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\ParameterAttributeTest.cs">
+      <Link>TypeBuilder\ParameterAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\PropertyChangeBuilderTest.cs">
+      <Link>TypeBuilder\PropertyChangeBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\TypeFactoryTest.cs">
+      <Link>TypeBuilder\TypeFactoryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\Extension\ExtensionTest.cs">
+      <Link>Reflection\ExtensionTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Validation\NullValue.cs">
+      <Link>Validation\NullValue.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TestFixtureBase.cs" />
+    <Compile Include="..\..\CS\TestObject.cs" />
+    <Compile Include="..\..\..\Source\Data\DataProvider\FdpDataProvider.cs" />
+    <Compile Include="CreateDatabase.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+    <None Include="..\..\CS\DataAccess\PersonDataSet2.xsc">
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+      <Link>Mapping\PersonDataSet2.xsc</Link>
+    </None>
+    <None Include="..\..\CS\DataAccess\PersonDataSet2.xsd">
+      <SubType>Designer</SubType>
+      <Generator>MSDataSetGenerator</Generator>
+      <LastGenOutput>PersonDataSet2.Designer.cs</LastGenOutput>
+      <CustomToolNamespace>DataAccessTest</CustomToolNamespace>
+      <Link>Mapping\PersonDataSet2.xsd</Link>
+    </None>
+    <None Include="..\..\CS\DataAccess\PersonDataSet2.xss">
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+      <Link>Mapping\PersonDataSet2.xss</Link>
+    </None>
+    <None Include="..\..\CS\DataAccess\PersonDataSet2.xsx">
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+      <Link>Mapping\PersonDataSet2.xsx</Link>
+    </None>
+    <None Include="..\..\CS\Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+      <Link>Properties\Settings.settings</Link>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="..\..\CS\Mapping\Map.xml">
+      <Link>Mapping\Map.xml</Link>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="..\..\CS\DataAccess\XmlExtension.xml">
+      <Link>DataAccess\XmlExtension.xml</Link>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="..\..\CS\Mapping\Person.mapping.xml">
+      <Link>Mapping\Person.mapping.xml</Link>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="..\..\CS\Mapping\XmlMap.xml">
+      <Link>Mapping\XmlMap.xml</Link>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\Source\BLToolkit.3.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/DataProvider/Oracle/App.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+	<configSections>
+		<section name="bltoolkit" type="BLToolkit.Configuration.BLToolkitSection, BLToolkit.3"/>
+	</configSections>
+	<bltoolkit>
+		<dataProviders>
+			<add type="BLToolkit.Data.DataProvider.OdpDataProvider, UnitTests.Oracle" default="true" />
+		</dataProviders>
+	</bltoolkit>
+	<connectionStrings>
+    <add name="Oracle" connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=DBHost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XE)));User Id=TestUser;Password=TestPassword;" providerName="Oracle.DataAccess.Client"/>
+	</connectionStrings>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/DataProvider/Oracle/UnitTests.Oracle.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,413 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{67230804-0438-46FB-BACE-AF334A6E4986}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>UnitTests.CS</RootNamespace>
+    <AssemblyName>UnitTests.Oracle</AssemblyName>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <PublishUrl>http://localhost/UnitTests.CS.2.Odp/</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Web</InstallFrom>
+    <UpdateEnabled>true</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>true</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\bin\Debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;ORACLE;FW3</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>3021</NoWarn>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\bin\Release\</OutputPath>
+    <DefineConstants>TRACE;ORACLE;FW3</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>3021</NoWarn>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework, Version=2.4.6.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\Tools\NUnit\nunit.framework.dll</HintPath>
+    </Reference>
+    <Reference Include="Oracle.DataAccess, Version=2.111.7.20, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\Redist\Oracle\Oracle.DataAccess.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Configuration" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Web.Extensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+    <Reference Include="WindowsBase">
+      <RequiredTargetFramework>3.0</RequiredTargetFramework>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\CS\Aspects\CacheAspectTest.cs">
+      <Link>Aspects\CacheAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\CounterAspectTest.cs">
+      <Link>Aspects\CounterAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\InterceptorAspectTest.cs">
+      <Link>Aspects\InterceptorAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\LoggingAspectTest.cs">
+      <Link>Aspects\LoggingAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\MixinAspectTest.cs">
+      <Link>Aspects\MixinAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\NotNullAspectTest.cs">
+      <Link>Aspects\NotNullAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Common\ConvertTest.cs">
+      <Link>Common\ConvertTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Common\OperatorTest.cs">
+      <Link>Common\OperatorTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Common\NameOrIndexParameterTest.cs">
+      <Link>Common\NameOrIndexParameterTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\ArrayTest.cs">
+      <Link>DataAccess\ArrayTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\TestQueryAttribute.cs">
+      <Link>DataAccess\TestQueryAttribute.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\XmlTypeTest.cs">
+      <Link>DataAccess\XmlTypeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\DataAccessorBuilderTest.cs">
+      <Link>DataAccess\DataAccessorBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\PrimaryKeyAttributeTest.cs">
+      <Link>DataAccess\PrimaryKeyAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\ScalarListTest.cs">
+      <Link>DataAccess\ScalarListTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\CreateEntityTest.cs">
+      <Link>DataAccess\CreateEntityTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\DataAccessorTest.cs">
+      <Link>DataAccess\DataAccessorTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\DictionaryTest.cs">
+      <Link>DataAccess\DictionaryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\EnumTest.cs">
+      <Link>DataAccess\EnumTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\ScalarTest.cs">
+      <Link>DataAccess\ScalarTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\OutRefTest.cs">
+      <Link>DataAccess\OutRefTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\PersonDataSet2.cs">
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+      <SubType>Component</SubType>
+      <Link>Mapping\PersonDataSet2.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\PersonDataSet2.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+      <Link>Mapping\PersonDataSet2.Designer.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\SqlQueryTest.cs">
+      <Link>DataAccess\SqlQueryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\SqlQueryTest2.cs">
+      <Link>DataAccess\SqlQueryTest2.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\SqlTest.cs">
+      <Link>DataAccess\SqlTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\XmlExtension.cs">
+      <Link>DataAccess\XmlExtension.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\BinaryTest.cs">
+      <Link>Data\BinaryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\CompositeKeyTest.cs">
+      <Link>Data\CompositeKeyTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\InnerTypesTest.cs">
+      <Link>Data\InnerTypesTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\ExecuteDictionaryTest.cs">
+      <Link>Data\ExecuteDictionaryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\ExecuteScalarDictionaryTest.cs">
+      <Link>Data\ExecuteScalarDictionaryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\ExecuteScalarListTest.cs">
+      <Link>Data\ExecuteScalarListTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\DbManagerTest.cs">
+      <Link>Data\DbManagerTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\ExecuteListT.cs">
+      <Link>Data\ExecuteListT.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\ExecuteScalarTest.cs">
+      <Link>Data\ExecuteScalarTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\NullableParameter.cs">
+      <Link>Data\NullableParameter.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\EditableObjects\EditableArrayListTest.cs">
+      <Link>EditableObjects\EditableArrayListTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\EditableObjects\EditableList_AcceptChanges.cs">
+      <Link>EditableObjects\EditableList_AcceptChanges.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\EditableObjects\EditableObjectTest.cs">
+      <Link>EditableObjects\EditableObjectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\EditableObjects\InnerObjectTest.cs">
+      <Link>EditableObjects\InnerObjectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\EditableObjects\NestedObjectTest.cs">
+      <Link>EditableObjects\NestedObjectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\DefaultValueAttributeTest.cs">
+      <Link>Mapping\DefaultValueAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\EnumExtension.cs">
+      <Link>Mapping\EnumExtension.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\ISupportMappingTest.cs">
+      <Link>Mapping\ISupportMappingTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MapFieldAttributeTest.cs">
+      <Link>Mapping\MapFieldAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MapperMemberAttributeTest.cs">
+      <Link>Mapping\MapperMemberAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MapTest.cs">
+      <Link>Mapping\MapTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MapValueAttributeTest.cs">
+      <Link>Mapping\MapValueAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MemberMapperTest.cs">
+      <Link>Mapping\MemberMapperTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MetadataProvider\MetadataProviderTest.cs">
+      <Link>Mapping\MetadataProviderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\NullableAttributeTest.cs">
+      <Link>Mapping\NullableAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\ObjectMapperAttributeTest.cs">
+      <Link>Mapping\ObjectMapperAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\ResultSetTest.cs">
+      <Link>Mapping\ResultSetTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\TrimmableAttributeTest.cs">
+      <Link>Mapping\TrimmableAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\XmlMap.cs">
+      <Link>Mapping\XmlMap.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Patterns\MustImplementAttributeTest.cs">
+      <Link>Patterns\MustImplementAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Patterns\DuckTypingTest.cs">
+      <Link>Patterns\DuckTypingTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Properties\AssemblyInfo.cs">
+      <Link>Properties\AssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <Link>Properties\Settings.Designer.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\Emit\MethodBuilderHelperTest.cs">
+      <Link>Reflection\MethodBuilderHelperTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\Extension\DefaultValueTest.cs">
+      <Link>Reflection\DefaultValueTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\Person.mapping.cs">
+      <Link>Mapping\Person.mapping.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\ObjectFactoryAttributeTest.cs">
+      <Link>Reflection\ObjectFactoryAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\ExtendedPropertyDescriptorTest.cs">
+      <Link>Reflection\ExtendedPropertyDescriptorTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\TypeAccessorTest.cs">
+      <Link>Reflection\TypeAccessorTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\TypeAccessorTest2.cs">
+      <Link>Reflection\TypeAccessorTest2.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\TypeHelperTest.cs">
+      <Link>Reflection\TypeHelperTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\ArrayBuilderTest.cs">
+      <Link>TypeBuilder\ArrayBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\IAbstractTypeBuilderTest.cs">
+      <Link>TypeBuilder\IAbstractTypeBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\DefaultTypeBuilderTest.cs">
+      <Link>TypeBuilder\DefaultTypeBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\ImplemetInterfaceBuilderTest.cs">
+      <Link>TypeBuilder\ImplemetInterfaceBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\TypeAccessorBuilderTest.cs">
+      <Link>TypeBuilder\TypeAccessorBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\GetSetValueAttributeTest.cs">
+      <Link>TypeBuilder\GetSetValueAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\InstanceTypeAttributeTest.cs">
+      <Link>TypeBuilder\InstanceTypeAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\LazyInstanceAttributeTest.cs">
+      <Link>TypeBuilder\LazyInstanceAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\NoInstanceAttributeTest.cs">
+      <Link>TypeBuilder\NoInstanceAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\NoInstanceAttributeTest2.cs">
+      <Link>TypeBuilder\NoInstanceAttributeTest2.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\ParameterAttributeTest.cs">
+      <Link>TypeBuilder\ParameterAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\PropertyChangeBuilderTest.cs">
+      <Link>TypeBuilder\PropertyChangeBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\TypeFactoryTest.cs">
+      <Link>Reflection\TypeFactoryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\Extension\ExtensionTest.cs">
+      <Link>Reflection\ExtensionTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Validation\NullValue.cs">
+      <Link>Validation\NullValue.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TestFixtureBase.cs" />
+    <Compile Include="..\..\CS\TestObject.cs" />
+    <Compile Include="..\..\..\Source\Data\DataProvider\OdpDataProvider.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+    <None Include="..\..\CS\DataAccess\PersonDataSet2.xsc">
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+      <Link>Mapping\PersonDataSet2.xsc</Link>
+    </None>
+    <None Include="..\..\CS\DataAccess\PersonDataSet2.xsd">
+      <SubType>Designer</SubType>
+      <Generator>MSDataSetGenerator</Generator>
+      <LastGenOutput>PersonDataSet2.Designer.cs</LastGenOutput>
+      <CustomToolNamespace>DataAccessTest</CustomToolNamespace>
+      <Link>Mapping\PersonDataSet2.xsd</Link>
+    </None>
+    <None Include="..\..\CS\DataAccess\PersonDataSet2.xss">
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+      <Link>Mapping\PersonDataSet2.xss</Link>
+    </None>
+    <None Include="..\..\CS\DataAccess\PersonDataSet2.xsx">
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+      <Link>Mapping\PersonDataSet2.xsx</Link>
+    </None>
+    <None Include="..\..\CS\Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+      <Link>Properties\Settings.settings</Link>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="..\..\CS\Mapping\Map.xml">
+      <Link>Mapping\Map.xml</Link>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="..\..\CS\DataAccess\XmlExtension.xml">
+      <Link>DataAccess\XmlExtension.xml</Link>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="..\..\CS\Mapping\Person.mapping.xml">
+      <Link>Mapping\Person.mapping.xml</Link>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="..\..\CS\Mapping\XmlMap.xml">
+      <Link>Mapping\XmlMap.xml</Link>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\Source\BLToolkit.3.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/DataProvider/SQLite/App.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+	<configSections>
+		<section name="bltoolkit" type="BLToolkit.Configuration.BLToolkitSection, BLToolkit.3"/>
+	</configSections>
+	<connectionStrings>
+		<add name="SQLite" connectionString="Data Source=..\..\..\..\Data\BLToolkitData.sqlite"/>
+	</connectionStrings>
+	<bltoolkit defaultConfiguration="SQLite">
+		<dataProviders>
+			<add type="BLToolkit.Data.DataProvider.SQLiteDataProvider, UnitTests.SQLite" default="true"/>
+		</dataProviders>
+		<typeFactory saveTypes="true" />
+	</bltoolkit>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/DataProvider/SQLite/UnitTests.SQLite.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,389 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{3293F570-DDFC-4449-9442-BAC6DDFE8184}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>UnitTests.CS</RootNamespace>
+    <AssemblyName>UnitTests.SQLite</AssemblyName>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <Install>true</Install>
+    <InstallFrom>Web</InstallFrom>
+    <UpdateEnabled>true</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>true</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\bin\Debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;SQLITE;FW3</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>3021</NoWarn>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\bin\Release\</OutputPath>
+    <DefineConstants>TRACE;SQLITE;FW3</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>3021</NoWarn>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework, Version=2.4.6.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\Tools\NUnit\nunit.framework.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.SQLite, Version=1.0.60.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\Redist\SQLite\System.Data.SQLite.DLL</HintPath>
+    </Reference>
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+    <Reference Include="WindowsBase">
+      <RequiredTargetFramework>3.0</RequiredTargetFramework>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\..\Source\Data\DataProvider\SQLiteDataProvider.cs">
+      <Link>SQLiteDataProvider.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\CacheAspectTest.cs">
+      <Link>Aspects\CacheAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\CounterAspectTest.cs">
+      <Link>Aspects\CounterAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\InterceptorAspectTest.cs">
+      <Link>Aspects\InterceptorAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\LoggingAspectTest.cs">
+      <Link>Aspects\LoggingAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\MixinAspectTest.cs">
+      <Link>Aspects\MixinAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\NotNullAspectTest.cs">
+      <Link>Aspects\NotNullAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Common\ConvertTest.cs">
+      <Link>Common\ConvertTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Common\NameOrIndexParameterTest.cs">
+      <Link>Common\NameOrIndexParameterTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\PersonDataSet2.Designer.cs">
+      <Link>Mapping\PersonDataSet2.Designer.cs</Link>
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\TestQueryAttribute.cs">
+      <Link>DataAccess\TestQueryAttribute.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\XmlTypeTest.cs">
+      <Link>DataAccess\XmlTypeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\DataAccessorBuilderTest.cs">
+      <Link>DataAccess\DataAccessorBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\PrimaryKeyAttributeTest.cs">
+      <Link>DataAccess\PrimaryKeyAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\CreateEntityTest.cs">
+      <Link>DataAccess\CreateEntityTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\DictionaryTest.cs">
+      <Link>DataAccess\DictionaryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\EnumTest.cs">
+      <Link>DataAccess\EnumTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\PersonDataSet2.cs">
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+      <SubType>Component</SubType>
+      <Link>Mapping\PersonDataSet2.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\SqlQueryTest.cs">
+      <Link>DataAccess\SqlQueryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\SqlQueryTest2.cs">
+      <Link>DataAccess\SqlQueryTest2.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\SqlTest.cs">
+      <Link>DataAccess\SqlTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\XmlExtension.cs">
+      <Link>DataAccess\XmlExtension.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\BinaryTest.cs">
+      <Link>Data\BinaryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\CompositeKeyTest.cs">
+      <Link>Data\CompositeKeyTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\InnerTypesTest.cs">
+      <Link>Data\InnerTypesTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\ExecuteDictionaryTest.cs">
+      <Link>Data\ExecuteDictionaryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\ExecuteScalarDictionaryTest.cs">
+      <Link>Data\ExecuteScalarDictionaryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\ExecuteScalarListTest.cs">
+      <Link>Data\ExecuteScalarListTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\DbManagerTest.cs">
+      <Link>Data\DbManagerTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\ExecuteListT.cs">
+      <Link>Data\ExecuteListT.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\ExecuteScalarTest.cs">
+      <Link>Data\ExecuteScalarTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\NullableParameter.cs">
+      <Link>Data\NullableParameter.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\EditableObjects\EditableArrayListTest.cs">
+      <Link>EditableObjects\EditableArrayListTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\EditableObjects\EditableList_AcceptChanges.cs">
+      <Link>EditableObjects\EditableList_AcceptChanges.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\EditableObjects\EditableObjectTest.cs">
+      <Link>EditableObjects\EditableObjectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\EditableObjects\InnerObjectTest.cs">
+      <Link>EditableObjects\InnerObjectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\EditableObjects\NestedObjectTest.cs">
+      <Link>EditableObjects\NestedObjectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\DefaultValueAttributeTest.cs">
+      <Link>Mapping\DefaultValueAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\EnumExtension.cs">
+      <Link>Mapping\EnumExtension.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\ISupportMappingTest.cs">
+      <Link>Mapping\ISupportMappingTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MapFieldAttributeTest.cs">
+      <Link>Mapping\MapFieldAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MapperMemberAttributeTest.cs">
+      <Link>Mapping\MapperMemberAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MapTest.cs">
+      <Link>Mapping\MapTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MapValueAttributeTest.cs">
+      <Link>Mapping\MapValueAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MemberMapperTest.cs">
+      <Link>Mapping\MemberMapperTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MetadataProvider\MetadataProviderTest.cs">
+      <Link>Mapping\MetadataProviderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\NullableAttributeTest.cs">
+      <Link>Mapping\NullableAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\ObjectMapperAttributeTest.cs">
+      <Link>Mapping\ObjectMapperAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\TrimmableAttributeTest.cs">
+      <Link>Mapping\TrimmableAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\XmlMap.cs">
+      <Link>Mapping\XmlMap.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Patterns\MustImplementAttributeTest.cs">
+      <Link>Patterns\MustImplementAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Patterns\DuckTypingTest.cs">
+      <Link>Patterns\DuckTypingTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Properties\AssemblyInfo.cs">
+      <Link>Properties\AssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Properties\Settings.Designer.cs">
+      <Link>Properties\Settings.Designer.cs</Link>
+      <AutoGen>True</AutoGen>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+      <DependentUpon>Settings.settings</DependentUpon>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\Emit\MethodBuilderHelperTest.cs">
+      <Link>Reflection\MethodBuilderHelperTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\Extension\DefaultValueTest.cs">
+      <Link>Reflection\DefaultValueTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\Person.mapping.cs">
+      <Link>Mapping\Person.mapping.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\ObjectFactoryAttributeTest.cs">
+      <Link>Reflection\ObjectFactoryAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\ExtendedPropertyDescriptorTest.cs">
+      <Link>Reflection\ExtendedPropertyDescriptorTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\TypeAccessorTest.cs">
+      <Link>Reflection\TypeAccessorTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\TypeAccessorTest2.cs">
+      <Link>Reflection\TypeAccessorTest2.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\TypeHelperTest.cs">
+      <Link>Reflection\TypeHelperTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\ArrayBuilderTest.cs">
+      <Link>TypeBuilder\ArrayBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\IAbstractTypeBuilderTest.cs">
+      <Link>TypeBuilder\IAbstractTypeBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\DefaultTypeBuilderTest.cs">
+      <Link>TypeBuilder\DefaultTypeBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\ImplemetInterfaceBuilderTest.cs">
+      <Link>TypeBuilder\ImplemetInterfaceBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\TypeAccessorBuilderTest.cs">
+      <Link>TypeBuilder\TypeAccessorBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\GetSetValueAttributeTest.cs">
+      <Link>TypeBuilder\GetSetValueAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\InstanceTypeAttributeTest.cs">
+      <Link>TypeBuilder\InstanceTypeAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\LazyInstanceAttributeTest.cs">
+      <Link>TypeBuilder\LazyInstanceAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\NoInstanceAttributeTest.cs">
+      <Link>TypeBuilder\NoInstanceAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\NoInstanceAttributeTest2.cs">
+      <Link>TypeBuilder\NoInstanceAttributeTest2.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\ParameterAttributeTest.cs">
+      <Link>TypeBuilder\ParameterAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\PropertyChangeBuilderTest.cs">
+      <Link>TypeBuilder\PropertyChangeBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\TypeFactoryTest.cs">
+      <Link>TypeBuilder\TypeFactoryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\Extension\ExtensionTest.cs">
+      <Link>Reflection\ExtensionTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Validation\NullValue.cs">
+      <Link>Validation\NullValue.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TestFixtureBase.cs" />
+    <Compile Include="..\..\CS\TestObject.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+    <None Include="..\..\CS\DataAccess\PersonDataSet2.xsc">
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+      <Link>Mapping\PersonDataSet2.xsc</Link>
+    </None>
+    <None Include="..\..\CS\DataAccess\PersonDataSet2.xsd">
+      <SubType>Designer</SubType>
+      <Generator>MSDataSetGenerator</Generator>
+      <LastGenOutput>PersonDataSet2.Designer.cs</LastGenOutput>
+      <CustomToolNamespace>DataAccessTest</CustomToolNamespace>
+      <Link>Mapping\PersonDataSet2.xsd</Link>
+    </None>
+    <None Include="..\..\CS\DataAccess\PersonDataSet2.xss">
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+      <Link>Mapping\PersonDataSet2.xss</Link>
+    </None>
+    <None Include="..\..\CS\DataAccess\PersonDataSet2.xsx">
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+      <Link>Mapping\PersonDataSet2.xsx</Link>
+    </None>
+    <None Include="..\..\CS\Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+      <Link>Properties\Settings.settings</Link>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="..\..\CS\Mapping\Map.xml">
+      <Link>Mapping\Map.xml</Link>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="..\..\CS\DataAccess\XmlExtension.xml">
+      <Link>DataAccess\XmlExtension.xml</Link>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="..\..\CS\Mapping\Person.mapping.xml">
+      <Link>Mapping\Person.mapping.xml</Link>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="..\..\CS\Mapping\XmlMap.xml">
+      <Link>Mapping\XmlMap.xml</Link>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\Source\BLToolkit.3.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/DataProvider/SqlCe/App.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+	<configSections>
+		<section name="bltoolkit" type="BLToolkit.Configuration.BLToolkitSection, BLToolkit.3"/>
+	</configSections>
+	<connectionStrings>
+		<add name="SqlCe" connectionString="Data Source=..\..\..\..\Data\BLToolkitData.sdf"/>
+	</connectionStrings>
+	<bltoolkit>
+		<dataProviders>
+			<add type="BLToolkit.Data.DataProvider.SqlCeDataProvider, UnitTests.SqlCe" default="true"/>
+		</dataProviders>
+		<typeFactory saveTypes="true" />
+	</bltoolkit>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/DataProvider/SqlCe/CreateDatabase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,49 @@
+using System;
+using System.IO;
+using BLToolkit.Data;
+
+using NUnit.Framework;
+
+namespace UnitTests.CS
+{
+	[TestFixture, Explicit, Category("DB setup")]
+	public class CreateDatabase
+	{
+		[Test]
+		public void Test()
+		{
+			const string path = @"..\..\..\..\Data\Create Scripts\SqlCe.sql";
+
+			using (DbManager db = new DbManager())
+			{
+				string cmd  = string.Empty;
+				string term = "GO";
+
+				foreach (string s in File.ReadAllLines(path))
+				{
+					string line = s.TrimEnd();
+
+					if (!line.EndsWith(term))
+					{
+						cmd += line + Environment.NewLine;
+						continue;
+					}
+
+					line = line.Substring(0, line.Length - term.Length).Trim();
+
+					Console.WriteLine("Executing script:");
+					Console.WriteLine(cmd + line);
+
+					db
+						.SetCommand(cmd + line)
+						.ExecuteNonQuery()
+						;
+
+					Console.WriteLine("Succeeded.");
+
+					cmd = string.Empty;
+				}
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/DataProvider/SqlCe/UnitTests.SqlCe.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,389 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{025F6CC1-A017-4A31-8382-EC743057CB9D}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>UnitTests.CS</RootNamespace>
+    <AssemblyName>UnitTests.SqlCe</AssemblyName>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <Install>true</Install>
+    <InstallFrom>Web</InstallFrom>
+    <UpdateEnabled>true</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>true</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\bin\Debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;SQLCE;FW3</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>3021</NoWarn>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\bin\Release\</OutputPath>
+    <DefineConstants>TRACE;SQLCE;FW3</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <NoWarn>3021</NoWarn>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework, Version=2.4.6.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\Tools\NUnit\nunit.framework.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.SqlServerCe">
+      <SpecificVersion>False</SpecificVersion>
+    </Reference>
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+    <Reference Include="WindowsBase">
+      <RequiredTargetFramework>3.0</RequiredTargetFramework>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\..\Source\Data\DataProvider\SqlCeDataProvider.cs">
+      <Link>SqlCeDataProvider.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\CacheAspectTest.cs">
+      <Link>Aspects\CacheAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\CounterAspectTest.cs">
+      <Link>Aspects\CounterAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\InterceptorAspectTest.cs">
+      <Link>Aspects\InterceptorAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\LoggingAspectTest.cs">
+      <Link>Aspects\LoggingAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\MixinAspectTest.cs">
+      <Link>Aspects\MixinAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Aspects\NotNullAspectTest.cs">
+      <Link>Aspects\NotNullAspectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Common\ConvertTest.cs">
+      <Link>Common\ConvertTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Common\NameOrIndexParameterTest.cs">
+      <Link>Common\NameOrIndexParameterTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\PersonDataSet2.Designer.cs">
+      <Link>Mapping\PersonDataSet2.Designer.cs</Link>
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\TestQueryAttribute.cs">
+      <Link>DataAccess\TestQueryAttribute.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\XmlTypeTest.cs">
+      <Link>DataAccess\XmlTypeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\DataAccessorBuilderTest.cs">
+      <Link>DataAccess\DataAccessorBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\PrimaryKeyAttributeTest.cs">
+      <Link>DataAccess\PrimaryKeyAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\CreateEntityTest.cs">
+      <Link>DataAccess\CreateEntityTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\DictionaryTest.cs">
+      <Link>DataAccess\DictionaryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\EnumTest.cs">
+      <Link>DataAccess\EnumTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\PersonDataSet2.cs">
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+      <SubType>Component</SubType>
+      <Link>Mapping\PersonDataSet2.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\SqlQueryTest.cs">
+      <Link>DataAccess\SqlQueryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\SqlQueryTest2.cs">
+      <Link>DataAccess\SqlQueryTest2.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\SqlTest.cs">
+      <Link>DataAccess\SqlTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\DataAccess\XmlExtension.cs">
+      <Link>DataAccess\XmlExtension.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\BinaryTest.cs">
+      <Link>Data\BinaryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\CompositeKeyTest.cs">
+      <Link>Data\CompositeKeyTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\InnerTypesTest.cs">
+      <Link>Data\InnerTypesTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\ExecuteDictionaryTest.cs">
+      <Link>Data\ExecuteDictionaryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\ExecuteScalarDictionaryTest.cs">
+      <Link>Data\ExecuteScalarDictionaryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\ExecuteScalarListTest.cs">
+      <Link>Data\ExecuteScalarListTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\DbManagerTest.cs">
+      <Link>Data\DbManagerTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\ExecuteListT.cs">
+      <Link>Data\ExecuteListT.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\ExecuteScalarTest.cs">
+      <Link>Data\ExecuteScalarTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Data\NullableParameter.cs">
+      <Link>Data\NullableParameter.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\EditableObjects\EditableArrayListTest.cs">
+      <Link>EditableObjects\EditableArrayListTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\EditableObjects\EditableList_AcceptChanges.cs">
+      <Link>EditableObjects\EditableList_AcceptChanges.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\EditableObjects\EditableObjectTest.cs">
+      <Link>EditableObjects\EditableObjectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\EditableObjects\InnerObjectTest.cs">
+      <Link>EditableObjects\InnerObjectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\EditableObjects\NestedObjectTest.cs">
+      <Link>EditableObjects\NestedObjectTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\DefaultValueAttributeTest.cs">
+      <Link>Mapping\DefaultValueAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\EnumExtension.cs">
+      <Link>Mapping\EnumExtension.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\ISupportMappingTest.cs">
+      <Link>Mapping\ISupportMappingTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MapFieldAttributeTest.cs">
+      <Link>Mapping\MapFieldAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MapperMemberAttributeTest.cs">
+      <Link>Mapping\MapperMemberAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MapTest.cs">
+      <Link>Mapping\MapTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MapValueAttributeTest.cs">
+      <Link>Mapping\MapValueAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MemberMapperTest.cs">
+      <Link>Mapping\MemberMapperTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\MetadataProvider\MetadataProviderTest.cs">
+      <Link>Mapping\MetadataProviderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\NullableAttributeTest.cs">
+      <Link>Mapping\NullableAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\ObjectMapperAttributeTest.cs">
+      <Link>Mapping\ObjectMapperAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\TrimmableAttributeTest.cs">
+      <Link>Mapping\TrimmableAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\XmlMap.cs">
+      <Link>Mapping\XmlMap.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Patterns\MustImplementAttributeTest.cs">
+      <Link>Patterns\MustImplementAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Patterns\DuckTypingTest.cs">
+      <Link>Patterns\DuckTypingTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Properties\AssemblyInfo.cs">
+      <Link>Properties\AssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Properties\Settings.Designer.cs">
+      <Link>Properties\Settings.Designer.cs</Link>
+      <AutoGen>True</AutoGen>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+      <DependentUpon>Settings.settings</DependentUpon>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\Emit\MethodBuilderHelperTest.cs">
+      <Link>Reflection\MethodBuilderHelperTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\Extension\DefaultValueTest.cs">
+      <Link>Reflection\DefaultValueTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Mapping\Person.mapping.cs">
+      <Link>Mapping\Person.mapping.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\ObjectFactoryAttributeTest.cs">
+      <Link>Reflection\ObjectFactoryAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\ExtendedPropertyDescriptorTest.cs">
+      <Link>Reflection\ExtendedPropertyDescriptorTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\TypeAccessorTest.cs">
+      <Link>Reflection\TypeAccessorTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\TypeAccessorTest2.cs">
+      <Link>Reflection\TypeAccessorTest2.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\TypeHelperTest.cs">
+      <Link>Reflection\TypeHelperTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\ArrayBuilderTest.cs">
+      <Link>TypeBuilder\ArrayBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\IAbstractTypeBuilderTest.cs">
+      <Link>TypeBuilder\IAbstractTypeBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\DefaultTypeBuilderTest.cs">
+      <Link>TypeBuilder\DefaultTypeBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\ImplemetInterfaceBuilderTest.cs">
+      <Link>TypeBuilder\ImplemetInterfaceBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\TypeAccessorBuilderTest.cs">
+      <Link>TypeBuilder\TypeAccessorBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\GetSetValueAttributeTest.cs">
+      <Link>TypeBuilder\GetSetValueAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\InstanceTypeAttributeTest.cs">
+      <Link>TypeBuilder\InstanceTypeAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\LazyInstanceAttributeTest.cs">
+      <Link>TypeBuilder\LazyInstanceAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\NoInstanceAttributeTest.cs">
+      <Link>TypeBuilder\NoInstanceAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\NoInstanceAttributeTest2.cs">
+      <Link>TypeBuilder\NoInstanceAttributeTest2.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\ParameterAttributeTest.cs">
+      <Link>TypeBuilder\ParameterAttributeTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\Builders\PropertyChangeBuilderTest.cs">
+      <Link>TypeBuilder\PropertyChangeBuilderTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TypeBuilder\TypeFactoryTest.cs">
+      <Link>TypeBuilder\TypeFactoryTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Reflection\Extension\ExtensionTest.cs">
+      <Link>Reflection\ExtensionTest.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\Validation\NullValue.cs">
+      <Link>Validation\NullValue.cs</Link>
+    </Compile>
+    <Compile Include="..\..\CS\TestFixtureBase.cs" />
+    <Compile Include="..\..\CS\TestObject.cs" />
+    <Compile Include="CreateDatabase.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+    <None Include="..\..\CS\DataAccess\PersonDataSet2.xsc">
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+      <Link>Mapping\PersonDataSet2.xsc</Link>
+    </None>
+    <None Include="..\..\CS\DataAccess\PersonDataSet2.xsd">
+      <SubType>Designer</SubType>
+      <Generator>MSDataSetGenerator</Generator>
+      <LastGenOutput>PersonDataSet2.Designer.cs</LastGenOutput>
+      <CustomToolNamespace>DataAccessTest</CustomToolNamespace>
+      <Link>Mapping\PersonDataSet2.xsd</Link>
+    </None>
+    <None Include="..\..\CS\DataAccess\PersonDataSet2.xss">
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+      <Link>Mapping\PersonDataSet2.xss</Link>
+    </None>
+    <None Include="..\..\CS\DataAccess\PersonDataSet2.xsx">
+      <DependentUpon>PersonDataSet2.xsd</DependentUpon>
+      <Link>Mapping\PersonDataSet2.xsx</Link>
+    </None>
+    <None Include="..\..\CS\Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+      <Link>Properties\Settings.settings</Link>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="..\..\CS\Mapping\Map.xml">
+      <Link>Mapping\Map.xml</Link>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="..\..\CS\DataAccess\XmlExtension.xml">
+      <Link>DataAccess\XmlExtension.xml</Link>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="..\..\CS\Mapping\Person.mapping.xml">
+      <Link>Mapping\Person.mapping.xml</Link>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="..\..\CS\Mapping\XmlMap.xml">
+      <Link>Mapping\XmlMap.xml</Link>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\Source\BLToolkit.3.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/DataProvider/UnitTests.DataProviders.sln	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,50 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests.Access", "Access\UnitTests.Access.csproj", "{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLToolkit.3", "..\..\Source\BLToolkit.3.csproj", "{0C325F5D-E50E-4340-8724-D29896CCC583}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests.Firebird", "FireBird\UnitTests.Firebird.csproj", "{ACD42369-6C01-44FA-B53C-685E6A01894E}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests.Oracle", "Oracle\UnitTests.Oracle.csproj", "{67230804-0438-46FB-BACE-AF334A6E4986}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests.SQLite", "SQLite\UnitTests.SQLite.csproj", "{3293F570-DDFC-4449-9442-BAC6DDFE8184}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests.SqlCe", "SqlCe\UnitTests.SqlCe.csproj", "{025F6CC1-A017-4A31-8382-EC743057CB9D}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{2BB4AD77-190F-4D7E-A83E-7B254A0A1FCA}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0C325F5D-E50E-4340-8724-D29896CCC583}.Release|Any CPU.Build.0 = Release|Any CPU
+		{ACD42369-6C01-44FA-B53C-685E6A01894E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{ACD42369-6C01-44FA-B53C-685E6A01894E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{ACD42369-6C01-44FA-B53C-685E6A01894E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{ACD42369-6C01-44FA-B53C-685E6A01894E}.Release|Any CPU.Build.0 = Release|Any CPU
+		{67230804-0438-46FB-BACE-AF334A6E4986}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{67230804-0438-46FB-BACE-AF334A6E4986}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{67230804-0438-46FB-BACE-AF334A6E4986}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{67230804-0438-46FB-BACE-AF334A6E4986}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3293F570-DDFC-4449-9442-BAC6DDFE8184}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3293F570-DDFC-4449-9442-BAC6DDFE8184}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3293F570-DDFC-4449-9442-BAC6DDFE8184}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3293F570-DDFC-4449-9442-BAC6DDFE8184}.Release|Any CPU.Build.0 = Release|Any CPU
+		{025F6CC1-A017-4A31-8382-EC743057CB9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{025F6CC1-A017-4A31-8382-EC743057CB9D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{025F6CC1-A017-4A31-8382-EC743057CB9D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{025F6CC1-A017-4A31-8382-EC743057CB9D}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Fluent/AssertExceptionEx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,62 @@
+using System;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace BLToolkit.Fluent.Test
+{
+    /// <summary>
+    /// Класс для работы с асертами обладающий дополнительными методами
+    /// </summary>
+    public static class AssertExceptionEx
+    {
+        /// <summary>
+        /// Проверка на обязательность исключения
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="action"></param>
+        /// <param name="message"></param>
+        public static void AreException<T>(Action action, string message)
+        {
+            bool isOk = false;
+            try
+            {
+                action();
+            }
+            catch (Exception e)
+            {
+                if (e is T)
+                {
+                    isOk = true;
+                }
+            }
+            if (!isOk)
+            {
+                Assert.Fail(message);
+            }
+        }
+        /// <summary>
+        /// Проверка на обязательность отсутсвия исключения
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="action"></param>
+        /// <param name="message"></param>
+        public static void AreNotException<T>(Action action, string message)
+        {
+            bool isOk = true;
+            try
+            {
+                action();
+            }
+            catch (Exception e)
+            {
+                if (e is T)
+                {
+                    isOk = false;
+                }
+            }
+            if (!isOk)
+            {
+                Assert.Fail(message);
+            }
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Fluent/FluentConfigTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,60 @@
+using BLToolkit.Data;
+using BLToolkit.Mapping.Fluent;
+using BLToolkit.Reflection.Extension;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace BLToolkit.Fluent.Test
+{
+	/// <summary>
+	/// Test for FluentConfig
+	/// </summary>
+	[TestClass]
+	public class FluentConfigTest
+	{
+		/// <summary>
+		/// Test configure mapping
+		/// </summary>
+		[TestMethod]
+		public void ShouldConfigMapping()
+		{
+			ExtensionList extensions = new ExtensionList();
+			FluentConfig.Configure(extensions)
+				.MapingFromAssemblyOf<FluentConfigTest>();
+
+			Assert.IsTrue(extensions.ContainsKey(typeof(Dbo1).FullName), "Not mapping");
+			Assert.IsFalse(extensions.ContainsKey(typeof(Dbo2).FullName), "Fail mapping for abstract");
+			Assert.IsFalse(extensions.ContainsKey(typeof(Dbo3).FullName), "Fail mapping for generic");
+		}
+
+		public class Dbo1
+		{
+		}
+		public class Dbo2
+		{
+		}
+		public class Dbo3
+		{
+		}
+		public class Dbo1Map : FluentMap<Dbo1>
+		{
+			public Dbo1Map()
+			{
+				TableName("t1");
+			}
+		}
+		public abstract class Dbo2Map : FluentMap<Dbo1>
+		{
+			public Dbo2Map()
+			{
+				TableName("t2");
+			}
+		}
+		public class Dbo3Map<T> : FluentMap<Dbo1>
+		{
+			public Dbo3Map()
+			{
+				TableName("t3");
+			}
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Fluent/FluentMapAttributesTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,53 @@
+using System.Collections.Generic;
+
+using BLToolkit.Data;
+using BLToolkit.Mapping.Fluent;
+using BLToolkit.Mapping.MemberMappers;
+using BLToolkit.Reflection.Extension;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace BLToolkit.Fluent.Test
+{
+	/// <summary>
+	/// Test for FluentConfig
+	/// </summary>
+	[TestClass]
+    public class FluentMapAttributesTest
+	{
+		/// <summary>
+		/// Test configure mapping
+		/// </summary>
+		[TestMethod]
+		public void ShouldConfigMapping()
+		{
+			ExtensionList extensions = new ExtensionList();
+            FluentConfig.Configure(extensions).MapingFromAssemblyOf<FluentMapAttributesTest>();
+
+		    var key = extensions[typeof(DboFluentMapAttributesTest).FullName];
+		    var mem1 = key["Id"];
+            Assert.IsTrue(mem1.Attributes.ContainsKey("Identity"));
+		    
+            var mem2 = key["Test"];
+            Assert.IsTrue(mem2.Attributes.ContainsKey("MemberMapper"));
+            Assert.IsTrue(mem2.Attributes.ContainsKey("DbType"));            
+		}
+
+        public class DboFluentMapAttributesTest
+		{
+            public int Id { get; set; }
+            public List<string> Test { get; set; }
+		}
+
+        public class DboFluentMapAttributesTestMap : FluentMap<DboFluentMapAttributesTest>
+		{
+            public DboFluentMapAttributesTestMap()
+			{
+				TableName("t1");
+
+			    MapField(x => x.Id).Identity();
+			    MapField(x => x.Test).MapIgnore(false).MemberMapper(typeof(BinarySerialisationMapper)).DbType(System.Data.DbType.Binary);
+			}
+		}
+		
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Fluent/FluentMapTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1220 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using BLToolkit.Data;
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+using BLToolkit.Fluent.Test.MockDataBase;
+using BLToolkit.Mapping;
+using BLToolkit.Mapping.Fluent;
+using BLToolkit.Reflection.Extension;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace BLToolkit.Fluent.Test
+{
+	/// <summary>
+	/// Тестирование FluentMap
+	/// </summary>
+	[TestClass]
+	public class FluentMapTest
+	{
+		[TestInitialize]
+		public void Initialize()
+		{
+			DbManager.AddDataProvider(typeof(MockDataProvider));
+		}
+
+		/// <summary>
+		/// TableName mapping
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapTableName()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewReader("Field1")
+					.NewRow(1);
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+				// fluent config
+				new FluentMap<TableNameDbo>()
+					.TableName("TableNameDboT1")
+					.MapTo(db);
+
+				// when
+				db.GetTable<TableNameDbo>().ToArray();
+
+				// then
+				conn.Commands[0]
+					.Assert().AreTable("TableNameDboT1", "Fail mapping");
+			}
+		}
+
+		/// <summary>
+		/// TableName mapping fro child
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapTableNameForChild()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewReader("Field1")
+					.NewRow(1);
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+				// fluent config
+				new FluentMap<TableNameDbo>()
+					.TableName("TableNameDboT1")
+					.MapTo(db);
+
+				// when
+				db.GetTable<TableNameChildDbo>().ToArray();
+
+				// then
+				conn.Commands[0]
+					.Assert().AreTable("TableNameDboT1", "Fail mapping");
+			}
+		}
+
+		/// <summary>
+		/// MapField mapping
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapField()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewNonQuery();
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+				// fluent config
+				new FluentMap<MapFieldDbo>()
+					.MapField(_ => _.Field1, "f1")
+					.MapTo(db);
+
+				// when
+				db.GetTable<MapFieldDbo>().Insert(() => new MapFieldDbo { Field1 = 1 });
+
+				// then
+				conn.Commands[0]
+					.Assert().AreField("f1", "Fail mapping");
+			}
+		}
+
+		/// <summary>
+		/// MapField mapping for child
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapFieldforChild()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewNonQuery();
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+				// fluent config
+				new FluentMap<MapFieldDbo>()
+					.MapField(_ => _.Field1, "f1")
+					.MapTo(db);
+
+				// when
+				db.GetTable<MapFieldChild1Dbo>().Insert(() => new MapFieldChild1Dbo { Field1 = 1 });
+
+				// then
+				conn.Commands[0]
+					.Assert().AreField("f1", "Fail mapping");
+			}
+		}
+
+		/// <summary>
+		/// MapField mapping for child override
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapFieldforChildOverride()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewNonQuery();
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+				// fluent config
+				new FluentMap<MapFieldDbo>()
+					.MapField(_ => _.Field1, "f1")
+					.MapTo(db);
+				new FluentMap<MapFieldChild2Dbo>()
+					.MapField(_ => _.Field1, "fc1")
+					.MapTo(db);
+
+				// when
+				db.GetTable<MapFieldChild2Dbo>().Insert(() => new MapFieldChild2Dbo { Field1 = 1 });
+
+				// then
+				conn.Commands[0]
+					.Assert().AreField("fc1", "Fail mapping");
+			}
+		}
+
+		/// <summary>
+		/// PrimaryKey mapping
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapPrimaryKey()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewReader("Field1", "Field2")
+					.NewRow(1, 2);
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+				// fluent config
+				new FluentMap<PrimaryKeyDbo>()
+					.PrimaryKey(_ => _.Field2)
+					.MapTo(db);
+
+				// when
+				AssertExceptionEx.AreNotException<Exception>(() => new SqlQuery<PrimaryKeyDbo>(db).SelectByKey(1)
+					, "Fail query");
+
+				// then
+				Assert.AreEqual(1, conn.Commands[0].Parameters.Count, "Fail params");
+				conn.Commands[0]
+					.Assert().AreField("Field2", 2, "Not where part");
+			}
+		}
+
+		/// <summary>
+		/// PrimaryKey mapping for child
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapPrimaryKeyForChild()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewReader("Field1", "Field2")
+					.NewRow(1, 2);
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+				// fluent config
+				new FluentMap<PrimaryKeyDbo>()
+					.PrimaryKey(_ => _.Field2)
+					.MapTo(db);
+
+				// when
+				AssertExceptionEx.AreNotException<Exception>(() => new SqlQuery<PrimaryKeyChildDbo>(db).SelectByKey(1)
+					, "Fail query");
+
+				// then
+				Assert.AreEqual(1, conn.Commands[0].Parameters.Count, "Fail params");
+				conn.Commands[0]
+					.Assert().AreField("Field2", 2, "Not where part");
+			}
+		}
+
+		/// <summary>
+		/// NonUpdatable use
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapNonUpdatable()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewNonQuery();
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+				// fluent config
+				new FluentMap<NonUpdatableDbo>()
+					.NonUpdatable(_ => _.Field1)
+					.MapTo(db);
+
+				// when
+				new SqlQuery<NonUpdatableDbo>(db).Insert(new NonUpdatableDbo { Field1 = 10, Field2 = 1 });
+
+				// then
+				Assert.AreEqual(1, conn.Commands[0].Parameters.Count, "Fail params");
+			}
+		}
+
+		/// <summary>
+		/// NonUpdatable use for child
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapNonUpdatableForChild()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewNonQuery();
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+				// fluent config
+				new FluentMap<NonUpdatableDbo>()
+					.NonUpdatable(_ => _.Field1)
+					.MapTo(db);
+
+				// when
+				new SqlQuery<NonUpdatableChildDbo>(db).Insert(new NonUpdatableChildDbo { Field1 = 10, Field2 = 1 });
+
+				// then
+				Assert.AreEqual(1, conn.Commands[0].Parameters.Count, "Fail params");
+			}
+		}
+
+		/// <summary>
+		/// SqlIgnore mapping on insert
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapSqlIgnoreInsert()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewNonQuery();
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+				// fluent config
+				new FluentMap<SqlIgnoreInsertDbo>()
+					.SqlIgnore(_ => _.Field2)
+					.MapTo(db);
+
+				// when / then
+				new SqlQuery<SqlIgnoreInsertDbo>(db).Insert(new SqlIgnoreInsertDbo { Field1 = 20, Field2 = 2 });
+				AssertExceptionEx.AreException<LinqException>(
+					() => db.GetTable<SqlIgnoreInsertDbo>().Insert(() => new SqlIgnoreInsertDbo { Field1 = 10, Field2 = 1 })
+					, "Fail for linq");
+
+				// then
+				conn.Commands[0]
+					.Assert().AreNotField("Field2", "Field exists");
+				Assert.AreEqual(1, conn.Commands[0].Parameters.Count, "Fail params");
+			}
+		}
+
+		/// <summary>
+		/// SqlIgnore mapping on select
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapSqlIgnoreSelect()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewReader("Field1")
+					.NewRow(10);
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+				// fluent config
+				new FluentMap<SqlIgnoreSelectDbo>()
+					.SqlIgnore(_ => _.Field2)
+					.MapTo(db);
+
+				var table = db.GetTable<SqlIgnoreSelectDbo>();
+
+				// when
+				(from t in table where t.Field1 == 10 select t).First();
+
+				// then
+				conn.Commands[0]
+					.Assert().AreNotField("Field2", "Field exists");
+			}
+		}
+
+		/// <summary>
+		/// SqlIgnore mapping for child
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapSqlIgnoreForChild()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewReader("Field1")
+					.NewRow(10);
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+				// fluent config
+				new FluentMap<SqlIgnoreSelectDbo>()
+					.SqlIgnore(_ => _.Field2)
+					.MapTo(db);
+
+				var table = db.GetTable<SqlIgnoreChildDbo>();
+
+				// when
+				(from t in table where t.Field1 == 10 select t).First();
+
+				// then
+				conn.Commands[0]
+					.Assert().AreNotField("Field2", "Field exists");
+			}
+		}
+
+		/// <summary>
+		/// MapIgnore mapping on insert
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapIgnoreInsert()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewNonQuery();
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+				// fluent config
+				new FluentMap<MapIgnoreInsertDbo>()
+					.MapIgnore(_ => _.Field2)
+					.MapTo(db);
+
+				// when / then
+				new SqlQuery<MapIgnoreInsertDbo>(db).Insert(new MapIgnoreInsertDbo { Field1 = 20, Field2 = 2 });
+
+				AssertExceptionEx.AreException<LinqException>(
+					() => db.GetTable<MapIgnoreInsertDbo>().Insert(() => new MapIgnoreInsertDbo { Field1 = 10, Field2 = 1 })
+					, "Fail for linq");
+
+				// then
+				conn.Commands[0]
+					.Assert().AreNotField("Field2", "Field exists");
+				Assert.AreEqual(1, conn.Commands[0].Parameters.Count, "Fail params");
+			}
+		}
+
+		/// <summary>
+		/// MapIgnore mapping on select
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapIgnoreSelect()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewReader("Field1")
+					.NewRow(10, 1);
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+				// fluent config
+				new FluentMap<MapIgnoreSelectDbo>()
+					.MapIgnore(_ => _.Field2)
+					.MapTo(db);
+
+				var table = db.GetTable<MapIgnoreSelectDbo>();
+
+				// when
+				(from t in table where t.Field1 == 10 select t).First();
+
+				// then
+				conn.Commands[0]
+					.Assert().AreNotField("Field2", "Field exists");
+			}
+		}
+
+		/// <summary>
+		/// MapIgnore mapping for child
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapIgnoreForChild()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewReader("Field1")
+					.NewRow(10, 1);
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+				// fluent config
+				new FluentMap<MapIgnoreSelectDbo>()
+					.MapIgnore(_ => _.Field2)
+					.MapTo(db);
+
+				var table = db.GetTable<MapIgnoreChildDbo>();
+
+				// when
+				(from t in table where t.Field1 == 10 select t).First();
+
+				// then
+				conn.Commands[0]
+					.Assert().AreNotField("Field2", "Field exists");
+			}
+		}
+
+		/// <summary>
+		/// Trimmable mapping
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapTrimmable()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewReader("Field1")
+					.NewRow("test     ");
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+				// fluent config
+				new FluentMap<TrimmableDbo>()
+					.Trimmable(_ => _.Field1)
+					.MapTo(db);
+
+				var table = db.GetTable<TrimmableDbo>();
+
+				// when
+				var dbo = (from t in table select t).First();
+
+				// then
+				Assert.AreEqual("test", dbo.Field1, "Not trimmable");
+			}
+		}
+
+		/// <summary>
+		/// Trimmable mapping for child
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapTrimmableForChild()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewReader("Field1")
+					.NewRow("test     ");
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+				// fluent config
+				new FluentMap<TrimmableDbo>()
+					.Trimmable(_ => _.Field1)
+					.MapTo(db);
+
+				var table = db.GetTable<TrimmableChildDbo>();
+
+				// when
+				var dbo = (from t in table select t).First();
+
+				// then
+				Assert.AreEqual("test", dbo.Field1, "Not trimmable");
+			}
+		}
+
+		/// <summary>
+		/// MapValue mapping for member
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapValueForMember()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewReader("Field1", "Field2")
+					.NewRow(true, false);
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+#warning bug for maping TO db
+				// fluent config
+				new FluentMap<MapValueMemberDbo>()
+					.MapField(_ => _.Field1)
+						.MapValue("result true", true)
+						.MapValue("result false", false)
+					.MapField(_ => _.Field2)
+						.MapValue("value true", true)
+						.MapValue("value false", false)
+					.MapTo(db);
+
+				var table = db.GetTable<MapValueMemberDbo>();
+
+				// when
+				var dbo = (from t in table select t).First();
+
+				// then
+				Assert.AreEqual("result true", dbo.Field1, "Not map from value1");
+				Assert.AreEqual("value false", dbo.Field2, "Not map from value2");
+			}
+		}
+
+		/// <summary>
+		/// MapValue mapping for member for child
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapValueForMemberForChild()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewReader("Field1", "Field2")
+					.NewRow(true, false);
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+#warning bug for maping TO db
+				// fluent config
+				new FluentMap<MapValueMemberDbo>()
+					.MapField(_ => _.Field1)
+						.MapValue("result true", true)
+						.MapValue("result false", false)
+					.MapField(_ => _.Field2)
+						.MapValue("value true", true)
+						.MapValue("value false", false)
+					.MapTo(db);
+
+				var table = db.GetTable<MapValueMemberChildDbo>();
+
+				// when
+				var dbo = (from t in table select t).First();
+
+				// then
+				Assert.AreEqual("result true", dbo.Field1, "Not map from value1");
+				Assert.AreEqual("value false", dbo.Field2, "Not map from value2");
+			}
+		}
+
+		/// <summary>
+		/// MapValue mapping for enum
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapValueForEnum()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewReader("Field1", "Field2", "Field3", "Field4")
+					.NewRow("ok", "super", "yes", 10);
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+#warning bug for maping TO db
+				// fluent config
+				new FluentMap<MapValueEnumDbo>()
+					.MapValue(MapValueEnum.Value1, "ok", "yes")
+					.MapValue(MapValueEnum.Value2, "super")
+					.MapTo(db);
+
+				var table = db.GetTable<MapValueEnumDbo>();
+
+				// when
+				var dbo = (from t in table select t).First();
+
+				// then
+				Assert.AreEqual(MapValueEnum.Value1, dbo.Field1, "Not map from value1");
+				Assert.AreEqual(MapValueEnum.Value2, dbo.Field2, "Not map from value2");
+				Assert.AreEqual(MapValueEnum.Value1, dbo.Field3, "Not map from value3");
+			}
+		}
+
+		/// <summary>
+		/// MapValue mapping for enum for child
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapValueForEnumForChild()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewReader("Field1", "Field2", "Field3", "Field4")
+					.NewRow("ok", "super", "yes", 10);
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+#warning bug for maping TO db
+				// fluent config
+				new FluentMap<MapValueEnumDbo>()
+					.MapValue(MapValueEnum.Value1, "ok", "yes")
+					.MapValue(MapValueEnum.Value2, "super")
+					.MapTo(db);
+
+				var table = db.GetTable<MapValueEnumChildDbo>();
+
+				// when
+				var dbo = (from t in table select t).First();
+
+				// then
+				Assert.AreEqual(MapValueEnum.Value1, dbo.Field1, "Not map from value1");
+				Assert.AreEqual(MapValueEnum.Value2, dbo.Field2, "Not map from value2");
+				Assert.AreEqual(MapValueEnum.Value1, dbo.Field3, "Not map from value3");
+			}
+		}
+
+		/// <summary>
+		/// MapValue mapping for type
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapValueForType()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewReader("Field1", "Field2", "Field3")
+					.NewRow("one", "two", true);
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+#warning bug for property any different types
+#warning bug for maping TO db
+				// fluent config
+				new FluentMap<MapValueTypeDbo>()
+					.MapValue(1, "one", "1")
+					.MapValue(2, "two")
+					.MapValue(3, true)
+					.MapTo(db);
+
+				var table = db.GetTable<MapValueTypeDbo>();
+
+				// when
+				var dbo = (from t in table select t).First();
+
+				// then
+				Assert.AreEqual(1, dbo.Field1, "Not map from value1");
+				Assert.AreEqual(2, dbo.Field2, "Not map from value2");
+				Assert.AreEqual(3, dbo.Field3, "Not map from value3");
+			}
+		}
+
+		/// <summary>
+		/// MapValue mapping for type for child
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapValueForTypeForChild()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewReader("Field1", "Field2", "Field3")
+					.NewRow("one", "two", true);
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+#warning bug for property any different types
+#warning bug for maping TO db
+				// fluent config
+				new FluentMap<MapValueTypeDbo>()
+					.MapValue(1, "one", "1")
+					.MapValue(2, "two")
+					.MapValue(3, true)
+					.MapTo(db);
+
+				var table = db.GetTable<MapValueTypeChildDbo>();
+
+				// when
+				var dbo = (from t in table select t).First();
+
+				// then
+				Assert.AreEqual(1, dbo.Field1, "Not map from value1");
+				Assert.AreEqual(2, dbo.Field2, "Not map from value2");
+				Assert.AreEqual(3, dbo.Field3, "Not map from value3");
+			}
+		}
+
+		/// <summary>
+		/// InheritanceMapping mapping
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapInheritanceMapping()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewReader("Field1", "Field2")
+					.NewRow(1, 1)
+					.NewRow(2, 2);
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+				// fluent config
+				new FluentMap<InheritanceMappingDbo>()
+					.InheritanceMapping<InheritanceMappingDbo1>(1)
+					.InheritanceMapping<InheritanceMappingDbo2>(2)
+					.InheritanceField(_ => _.Field2)
+					.MapTo(db);
+
+				var table = db.GetTable<InheritanceMappingDbo>();
+
+				// when
+				var dbos = (from t in table select t).ToArray();
+
+				// then
+				Assert.IsInstanceOfType(dbos[0], typeof(InheritanceMappingDbo1), "Invalid type1");
+				Assert.IsInstanceOfType(dbos[1], typeof(InheritanceMappingDbo2), "Invalid type2");
+			}
+		}
+
+		/// <summary>
+		/// InheritanceMapping mapping select only child
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapInheritanceMappingSelectChild()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewReader("Field1", "Field2")
+					.NewRow(1, 1);
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+				// fluent config
+				new FluentMap<InheritanceMappingChDbo>()
+					.TableName("tt")
+					.InheritanceMapping<InheritanceMappingChDbo1>(11111)
+					.InheritanceMapping<InheritanceMappingChDbo2>(22222)
+					.InheritanceField(_ => _.Field2)
+					.MapTo(db);
+
+				var table = db.GetTable<InheritanceMappingChDbo1>();
+
+				// when
+				var dbos = (from t in table select t).ToArray();
+
+				// then
+				Assert.IsInstanceOfType(dbos[0], typeof(InheritanceMappingChDbo1), "Invalid type");
+				Assert.IsTrue(conn.Commands[0].CommandText.ToLower().Contains("where"), "Not condition");
+				Assert.IsTrue(conn.Commands[0].CommandText.ToLower().Contains("11111"), "Fail condition value");
+				conn.Commands[0]
+					.Assert().AreField("Field2", 2, "Not in where part");
+			}
+		}
+
+		/// <summary>
+		/// Association mapping to many
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapAssociationToMany()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewReader("Field4")
+					.NewRow("TestMany");
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+				// fluent config
+				new FluentMap<AssociationThis1Dbo>()
+					.MapField(_ => _.FieldThis1, "ThisId")
+					.MapField(_ => _.FieldThis2)
+						.Association(_ => _.FieldThis1).ToMany((AssociationOtherDbo _) => _.FieldOther2)
+					.MapTo(db);
+
+				var table = db.GetTable<AssociationThis1Dbo>();
+
+				// when
+				var dbo = (from t in table select t.FieldThis2.First().FieldOther4).First();
+
+				// then
+				Assert.AreEqual("TestMany", dbo, "Fail result for many");
+				conn.Commands[0]
+					.Assert().AreField("ThisId", "Fail this key");
+				conn.Commands[0]
+					.Assert().AreField("FieldOther2", "Fail other key");
+				conn.Commands[0]
+					.Assert().AreField("FieldOther4", "Fail other result");
+				Assert.AreEqual(3, conn.Commands[0].Fields.Count, "More fields");
+			}
+		}
+
+		/// <summary>
+		/// Association mapping to one
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapAssociationToOne()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewReader("Field4")
+					.NewRow("TestOne");
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+				// fluent config
+				new FluentMap<AssociationThis2Dbo>()
+					.MapField(_ => _.FieldThis1, "ThisId")
+					.MapField(_ => _.FieldThis3)
+						.Association(_ => _.FieldThis1).ToOne(_ => _.FieldOther3)
+					.MapTo(db);
+
+				var table = db.GetTable<AssociationThis2Dbo>();
+
+				// when
+				var dbo = (from t in table select t.FieldThis3.FieldOther4).First();
+
+				// then
+				Assert.AreEqual("TestOne", dbo, "Fail result for many");
+				conn.Commands[0]
+					.Assert().AreField("ThisId", "Fail this key");
+				conn.Commands[0]
+					.Assert().AreField("FieldOther3", "Fail other key");
+				conn.Commands[0]
+					.Assert().AreField("FieldOther4", "Fail other result");
+				Assert.AreEqual(3, conn.Commands[0].Fields.Count, "More fields");
+			}
+		}
+
+		/// <summary>
+		/// Association mapping for child
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapAssociationForChild()
+		{
+			// db config
+			var conn = new MockDb()
+				.NewReader("Field4")
+					.NewRow("TestOne");
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+				// fluent config
+				new FluentMap<AssociationThis2Dbo>()
+					.MapField(_ => _.FieldThis1, "ThisId")
+					.MapField(_ => _.FieldThis3)
+						.Association(_ => _.FieldThis1).ToOne(_ => _.FieldOther3)
+					.MapTo(db);
+
+				var table = db.GetTable<AssociationThis2ChildDbo>();
+
+				// when
+				var dbo = (from t in table select t.FieldThis3.FieldOther4).First();
+
+				// then
+				Assert.AreEqual("TestOne", dbo, "Fail result for many");
+				conn.Commands[0]
+					.Assert().AreField("ThisId", "Fail this key");
+				conn.Commands[0]
+					.Assert().AreField("FieldOther3", "Fail other key");
+				conn.Commands[0]
+					.Assert().AreField("FieldOther4", "Fail other result");
+				Assert.AreEqual(3, conn.Commands[0].Fields.Count, "More fields");
+			}
+		}
+
+		/// <summary>
+		/// Relation mapping
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapRelation()
+		{
+			// given
+			List<Parent> parents = new List<Parent>();
+			MapResultSet[] sets = new MapResultSet[3];
+
+			sets[0] = new MapResultSet(typeof(Parent), parents);
+			sets[1] = new MapResultSet(typeof(Child));
+			sets[2] = new MapResultSet(typeof(Grandchild));
+
+			// db config
+			var conn = new MockDb()
+				.NewReader("ParentID")
+					.NewRow(1)
+					.NewRow(2)
+					.NextResult("ChildID", "ParentID")
+					.NewRow(4, 1)
+					.NewRow(5, 2)
+					.NewRow(6, 2)
+					.NewRow(7, 1)
+					.NextResult("GrandchildID", "ChildID")
+					.NewRow(1, 4)
+					.NewRow(2, 4)
+					.NewRow(3, 5)
+					.NewRow(4, 5)
+					.NewRow(5, 6)
+					.NewRow(6, 6)
+					.NewRow(7, 7)
+					.NewRow(8, 7);
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+				// fluent config
+				new FluentMap<Parent>()
+					.MapField(_ => _.ID, "ParentID").PrimaryKey()
+					.MapField(_ => _.Children).Relation()
+					.MapTo(db);
+				new FluentMap<Child>()
+					.MapField(_ => _.Parent.ID, "ParentID")
+					.MapField(_ => _.ID, "ChildID").PrimaryKey()
+					.MapField(_ => _.Parent).Relation()
+					.MapField(_ => _.Grandchildren).Relation()
+					.MapTo(db);
+				new FluentMap<Grandchild>()
+					.MapField(_ => _.Child.ID, "ChildID")
+					.MapField(_ => _.ID, "GrandchildID").PrimaryKey()
+					.MapField(_ => _.Child).Relation()
+					.MapTo(db);
+
+				// when
+				db.SetCommand("select *").ExecuteResultSet(sets);
+			}
+
+			// then
+			Assert.IsTrue(parents.Any());
+
+			foreach (Parent parent in parents)
+			{
+				Assert.IsNotNull(parent);
+				Assert.IsTrue(parent.Children.Any());
+
+				foreach (Child child in parent.Children)
+				{
+					Assert.AreEqual(parent, child.Parent);
+					Assert.IsTrue(child.Grandchildren.Any());
+
+					foreach (Grandchild grandchild in child.Grandchildren)
+					{
+						Assert.AreEqual(child, grandchild.Child);
+						Assert.AreEqual(parent, grandchild.Child.Parent);
+					}
+				}
+			}
+		}
+
+		/// <summary>
+		/// Relation mapping for child
+		/// </summary>
+		[TestMethod]
+		public void ShouldMapRelationForChild()
+		{
+			// given
+			List<Parent2Child> parents = new List<Parent2Child>();
+			MapResultSet[] sets = new MapResultSet[2];
+
+			sets[0] = new MapResultSet(typeof(Parent2Child), parents);
+			sets[1] = new MapResultSet(typeof(Child2));
+
+			// db config
+			var conn = new MockDb()
+				.NewReader("ParentID")
+					.NewRow(1)
+					.NewRow(2)
+					.NextResult("ChildID", "ParentID")
+					.NewRow(4, 1)
+					.NewRow(5, 2)
+					.NewRow(6, 2)
+					.NewRow(7, 1);
+
+			using (conn)
+			using (var db = new DbManager(conn))
+			{
+				// fluent config
+				new FluentMap<Parent2>()
+					.MapField(_ => _.ID, "ParentID").PrimaryKey()
+					.MapField(_ => _.Children).Relation()
+					.MapTo(db);
+				new FluentMap<Child2>()
+					.MapField(_ => _.Parent.ID, "ParentID")
+					.MapField(_ => _.ID, "ChildID").PrimaryKey()
+					.MapField(_ => _.Parent).Relation()
+					.MapTo(db);
+
+				// when
+				db.SetCommand("select *").ExecuteResultSet(sets);
+			}
+
+			// then
+			Assert.IsTrue(parents.Any());
+
+			foreach (Parent2Child parent in parents)
+			{
+				Assert.IsNotNull(parent);
+				Assert.IsTrue(parent.Children.Any());
+
+				foreach (Child2 child in parent.Children)
+				{
+					Assert.AreEqual(parent, child.Parent);
+				}
+			}
+		}
+
+		#region Dbo
+		public class TableNameDbo
+		{
+			public int Field1 { get; set; }
+		}
+		public class TableNameChildDbo : TableNameDbo
+		{
+		}
+		public class MapFieldDbo
+		{
+			public int Field1 { get; set; }
+		}
+		public class MapFieldChild1Dbo : MapFieldDbo
+		{
+		}
+		public class MapFieldChild2Dbo : MapFieldDbo
+		{
+		}
+		public class PrimaryKeyDbo
+		{
+			public int Field1 { get; set; }
+			public int Field2 { get; set; }
+		}
+		public class PrimaryKeyChildDbo : PrimaryKeyDbo
+		{
+		}
+		public class NonUpdatableDbo
+		{
+			public int Field1 { get; set; }
+			public int Field2 { get; set; }
+		}
+		public class NonUpdatableChildDbo : NonUpdatableDbo
+		{
+		}
+		public class SqlIgnoreInsertDbo
+		{
+			public int Field1 { get; set; }
+			public int Field2 { get; set; }
+		}
+		public class SqlIgnoreSelectDbo
+		{
+			public int Field1 { get; set; }
+			public int Field2 { get; set; }
+		}
+		public class SqlIgnoreChildDbo : SqlIgnoreSelectDbo
+		{
+		}
+		public class MapIgnoreInsertDbo
+		{
+			public int Field1 { get; set; }
+			public int Field2 { get; set; }
+		}
+		public class MapIgnoreSelectDbo
+		{
+			public int Field1 { get; set; }
+			public int Field2 { get; set; }
+		}
+		public class MapIgnoreChildDbo : MapIgnoreSelectDbo
+		{
+		}
+		public class TrimmableDbo
+		{
+			public string Field1 { get; set; }
+		}
+		public class TrimmableChildDbo : TrimmableDbo
+		{
+		}
+		public class MapValueMemberDbo
+		{
+			public string Field1 { get; set; }
+			public string Field2 { get; set; }
+		}
+		public class MapValueMemberChildDbo : MapValueMemberDbo
+		{
+		}
+		public class MapValueEnumDbo
+		{
+			public MapValueEnum Field1 { get; set; }
+			public MapValueEnum Field2 { get; set; }
+			public MapValueEnum Field3 { get; set; }
+			public int Field4 { get; set; }
+		}
+		public class MapValueEnumChildDbo : MapValueEnumDbo
+		{
+		}
+		public enum MapValueEnum
+		{
+			Value1,
+			Value2
+		}
+		public class MapValueTypeDbo
+		{
+			public int Field1 { get; set; }
+			public int Field2 { get; set; }
+			public int Field3 { get; set; }
+		}
+		public class MapValueTypeChildDbo : MapValueTypeDbo
+		{
+		}
+		public abstract class InheritanceMappingDbo
+		{
+			public int Field1 { get; set; }
+			public int Field2 { get; set; }
+		}
+		public class InheritanceMappingDbo1 : InheritanceMappingDbo
+		{
+		}
+		public class InheritanceMappingDbo2 : InheritanceMappingDbo
+		{
+		}
+		public abstract class InheritanceMappingChDbo
+		{
+			public int Field1 { get; set; }
+			public int Field2 { get; set; }
+		}
+		public class InheritanceMappingChDbo1 : InheritanceMappingChDbo
+		{
+		}
+		public class InheritanceMappingChDbo2 : InheritanceMappingChDbo
+		{
+		}
+		public class AssociationThis1Dbo
+		{
+			public int FieldThis1 { get; set; }
+			public List<AssociationOtherDbo> FieldThis2 { get; set; }
+		}
+		public class AssociationThis2Dbo
+		{
+			public int FieldThis1 { get; set; }
+			public AssociationOtherDbo FieldThis3 { get; set; }
+		}
+		public class AssociationThis2ChildDbo : AssociationThis2Dbo
+		{
+		}
+		public class AssociationOtherDbo
+		{
+			public int FieldOther1 { get; set; }
+			public int FieldOther2 { get; set; }
+			public int FieldOther3 { get; set; }
+			public string FieldOther4 { get; set; }
+		}
+		public class Parent
+		{
+			public int ID;
+			public List<Child> Children = new List<Child>();
+		}
+		public class Child
+		{
+			public int ID;
+			public Parent Parent = new Parent();
+			public List<Grandchild> Grandchildren = new List<Grandchild>();
+		}
+		public class Grandchild
+		{
+			public int ID;
+			public Child Child = new Child();
+		}
+		public class Parent2
+		{
+			public int ID;
+			public List<Child2> Children = new List<Child2>();
+		}
+		public class Parent2Child : Parent2
+		{
+		}
+		public class Child2
+		{
+			public int ID;
+			public Parent2Child Parent = new Parent2Child();
+		}
+		#endregion
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Fluent/MockDataBase/AssertCommandData.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,46 @@
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace BLToolkit.Fluent.Test.MockDataBase
+{
+	public class AssertCommandData
+	{
+		private readonly MockCommandData _data;
+
+		public AssertCommandData(MockCommandData data)
+		{
+			_data = data;
+		}
+
+		public void AreField(string fieldName, int? count = null, string message = null)
+		{
+			int fCount = _data.Fields.TryGetValue(fieldName, out fCount) ? fCount : 0;
+			if ((null == count) && (0 < fCount))
+			{
+				return;
+			}
+			if ((null != count) && (count.Value == fCount))
+			{
+				return;
+			}
+			Assert.Fail(message ?? string.Format("Fail field '{0}'", fieldName));
+		}
+
+		public void AreField(string fieldName, string message = null)
+		{
+			AreField(fieldName, null, message);
+		}
+
+		public void AreNotField(string fieldName, string message = null)
+		{
+			AreField(fieldName, 0, message);
+		}
+
+		public void AreTable(string tableName, string message = null)
+		{
+			if (!_data.Tables.Contains(tableName))
+			{
+				Assert.Fail(message ?? string.Format("Fail table '{0}'", tableName));
+			}
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Fluent/MockDataBase/AssertDb.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,23 @@
+using System.Linq;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace BLToolkit.Fluent.Test.MockDataBase
+{
+	public class AssertDb
+	{
+		private readonly MockDb _db;
+
+		public AssertDb(MockDb db)
+		{
+			_db = db;
+		}
+
+		public void AreAll(string message = null)
+		{
+			if (_db.Commands.Any(c => !c.IsUsing))
+			{
+				Assert.Fail(message ?? "Fail all queries");
+			}
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Fluent/MockDataBase/AssertMockDataBaseEx.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+namespace BLToolkit.Fluent.Test.MockDataBase
+{
+	public static class AssertMockDataBaseEx
+	{
+		 public static AssertDb Assert(this MockDb db)
+		 {
+		 	return new AssertDb(db);
+		 }
+
+		 public static AssertCommandData Assert(this MockCommandData data)
+		 {
+		 	return new AssertCommandData(data);
+		 }
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Fluent/MockDataBase/MockCommand.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,165 @@
+using System.Collections;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.Text.RegularExpressions;
+
+namespace BLToolkit.Fluent.Test.MockDataBase
+{
+	public partial class MockDb
+	{
+		/// <summary>
+		/// IDbCommand
+		/// </summary>
+		private partial class MockCommand : IDbCommand
+		{
+			private readonly MockDb _db;
+			private readonly Regex _findTableRx = new Regex(MockSqlProvider.TableMarker + @"(\w+)");
+			private readonly Regex _findFieldRx = new Regex(MockSqlProvider.FieldMarker + @"(\w+)");
+
+			public MockCommand(MockDb db)
+			{
+				_db = db;
+				Parameters = new DataParameterCollection();
+			}
+
+			public void Dispose()
+			{
+			}
+
+			public void Prepare()
+			{
+			}
+
+			public void Cancel()
+			{
+			}
+
+			public IDbDataParameter CreateParameter()
+			{
+				return new MockDbDataParameter();
+			}
+
+			public int ExecuteNonQuery()
+			{
+				return MockCommandData().NonQueryResult;
+			}
+
+			public IDataReader ExecuteReader()
+			{
+				return new MockReader(MockCommandData(false));
+			}
+
+			public IDataReader ExecuteReader(CommandBehavior behavior)
+			{
+				return ExecuteReader();
+			}
+
+			public object ExecuteScalar()
+			{
+				return MockCommandData().ScalarResult;
+			}
+
+			public IDbConnection Connection { get; set; }
+
+			public IDbTransaction Transaction { get; set; }
+
+			public string CommandText { get; set; }
+
+			public int CommandTimeout { get; set; }
+
+			public CommandType CommandType { get; set; }
+
+			public IDataParameterCollection Parameters { get; private set; }
+
+			public UpdateRowSource UpdatedRowSource { get; set; }
+
+			private MockCommandData MockCommandData(bool isUsing = true)
+			{
+				Dictionary<string, int> fields;
+				List<string> tables;
+				FindFields(CommandText, out fields);
+				FindTables(CommandText, out tables);
+				CommandText = ClearMockMarkers(CommandText);
+
+				var cmd = _db.NextCommand();
+				cmd.CommandText = CommandText;
+				cmd.Parameters = Parameters.Cast<MockDbDataParameter>().ToList();
+				cmd.Fields = fields;
+				cmd.Tables = tables;
+				cmd.IsUsing = isUsing;
+				return cmd;
+			}
+
+			private string ClearMockMarkers(string commandText)
+			{
+				return commandText
+					.Replace(MockSqlProvider.FieldMarker, "")
+					.Replace(MockSqlProvider.TableMarker, "");
+			}
+
+			private void FindTables(string commandText, out List<string> tables)
+			{
+				tables = (from Match match in _findTableRx.Matches(commandText) select match.Groups[1].Value)
+					.Distinct().ToList();
+			}
+
+			private void FindFields(string commandText, out Dictionary<string, int> fields)
+			{
+				fields = (from Match match in _findFieldRx.Matches(commandText) select match.Groups[1].Value)
+					.GroupBy(s => s, (s, ss) => new { Key = s, Value = ss.Count() })
+					.ToDictionary(kv => kv.Key, kv => kv.Value);
+			}
+
+			private class DataParameterCollection : List<MockDbDataParameter>, IDataParameterCollection
+			{
+				public bool Contains(string parameterName)
+				{
+					return this.Any(p => p.ParameterName == parameterName);
+				}
+
+				public int IndexOf(string parameterName)
+				{
+					for (int i = 0; i < Count; i++)
+					{
+						if (this[i].ParameterName == parameterName)
+						{
+							return i;
+						}
+					}
+					return -1;
+				}
+
+				public void RemoveAt(string parameterName)
+				{
+					var data = this.FirstOrDefault(p => p.ParameterName == parameterName);
+					if (null != data)
+					{
+						Remove(data);
+					}
+				}
+
+				public object this[string parameterName]
+				{
+					get
+					{
+						var data = this.FirstOrDefault(p => p.ParameterName == parameterName);
+						return null == data ? null : data.Value;
+					}
+					set
+					{
+						var data = this.FirstOrDefault(p => p.ParameterName == parameterName);
+						if (null == data)
+						{
+							Add(new MockDbDataParameter { ParameterName = parameterName, Value = value });
+						}
+						else
+						{
+							data.Value = value;
+						}
+					}
+				}
+			}
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Fluent/MockDataBase/MockCommandData.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,23 @@
+using System.Collections.Generic;
+
+namespace BLToolkit.Fluent.Test.MockDataBase
+{
+	public class MockCommandData
+	{
+		public int NonQueryResult { get; set; }
+
+		public MockReaderData ReaderResult { get; set; }
+
+		public object ScalarResult { get; set; }
+
+		public string CommandText { get; set; }
+
+		public bool IsUsing { get; set; }
+
+		public List<MockDbDataParameter> Parameters { get; set; }
+
+		public Dictionary<string, int> Fields { get; set; }
+
+		public List<string> Tables { get; set; }
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Fluent/MockDataBase/MockDataProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,44 @@
+using System;
+using System.Data;
+using System.Data.Common;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Sql.SqlProvider;
+
+namespace BLToolkit.Fluent.Test.MockDataBase
+{
+	/// <summary>
+	/// For BLToolkit
+	/// </summary>
+	public class MockDataProvider : DataProviderBase
+	{
+		public override IDbConnection CreateConnectionObject()
+		{
+			throw new NotImplementedException();
+		}
+
+		public override DbDataAdapter CreateDataAdapterObject()
+		{
+			throw new NotImplementedException();
+		}
+
+		public override bool DeriveParameters(IDbCommand command)
+		{
+			throw new NotImplementedException();
+		}
+
+		public override ISqlProvider CreateSqlProvider()
+		{
+			return new MockSqlProvider();
+		}
+
+		public override Type ConnectionType
+		{
+			get { return typeof(MockDb); }
+		}
+
+		public override string Name
+		{
+			get { return "Mock"; }
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Fluent/MockDataBase/MockDb.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,71 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace BLToolkit.Fluent.Test.MockDataBase
+{
+	/// <summary>
+	/// DB configure start point
+	/// </summary>
+	public partial class MockDb : IDbConnection
+	{
+		private int _cmdIndex = -1;
+		private readonly List<MockCommandData> _commands = new List<MockCommandData>();
+
+		public List<MockCommandData> Commands { get { return _commands; } }
+
+		private MockCommandData NextCommand()
+		{
+			_cmdIndex++;
+			if (_cmdIndex == _commands.Count)
+			{
+				Assert.Fail("Command not define");
+			}
+			return _commands[_cmdIndex];
+		}
+
+		/// <summary>
+		/// New IDataReader query
+		/// </summary>
+		/// <param name="fields"></param>
+		/// <returns></returns>
+		public MockDb NewReader(params string[] fields)
+		{
+			CurrentSetupCommandData = new MockCommandData { ReaderResult = new MockReaderData() };
+			return NextResult(fields);
+		}
+
+		/// <summary>
+		/// Next result into current IDataReader context
+		/// </summary>
+		/// <param name="fields"></param>
+		/// <returns></returns>
+		public MockDb NextResult(params string[] fields)
+		{
+			var data = new MockReaderResultData();
+			data.SetNames(fields);
+			CurrentSetupCommandData.ReaderResult.CurrentResult = data;
+			return this;
+		}
+
+		public MockDb NewRow(params object[] values)
+		{
+			CurrentSetupCommandData.ReaderResult.CurrentResult.Values.Add(values);
+			return this;
+		}
+
+		private MockCommandData CurrentSetupCommandData
+		{
+			get { return _commands.LastOrDefault(); }
+			set { _commands.Add(value); }
+		}
+
+		public MockDb NewNonQuery(int value = 1)
+		{
+			CurrentSetupCommandData = new MockCommandData { NonQueryResult = value };
+			return this;
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Fluent/MockDataBase/MockDbConnection.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,63 @@
+using System.Data;
+
+namespace BLToolkit.Fluent.Test.MockDataBase
+{
+	/// <summary>
+	/// IDbConnection
+	/// </summary>
+	public partial class MockDb : IDbConnection
+	{
+		private ConnectionState _state;
+
+		IDbTransaction IDbConnection.BeginTransaction(IsolationLevel il)
+		{
+			throw new System.NotImplementedException();
+		}
+
+		IDbTransaction IDbConnection.BeginTransaction()
+		{
+			throw new System.NotImplementedException();
+		}
+
+		void IDbConnection.ChangeDatabase(string databaseName)
+		{
+			throw new System.NotImplementedException();
+		}
+
+		void IDbConnection.Close()
+		{
+			_state = ConnectionState.Closed;
+		}
+
+		string IDbConnection.ConnectionString { get; set; }
+
+		int IDbConnection.ConnectionTimeout
+		{
+			get { throw new System.NotImplementedException(); }
+		}
+
+		IDbCommand IDbConnection.CreateCommand()
+		{
+			return new MockCommand(this);
+		}
+
+		string IDbConnection.Database
+		{
+			get { throw new System.NotImplementedException(); }
+		}
+
+		void IDbConnection.Open()
+		{
+			_state = ConnectionState.Open;
+		}
+
+		ConnectionState IDbConnection.State
+		{
+			get { return _state; }
+		}
+
+		void System.IDisposable.Dispose()
+		{
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Fluent/MockDataBase/MockDbDataParameter.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,33 @@
+using System.Data;
+
+namespace BLToolkit.Fluent.Test.MockDataBase
+{
+	/// <summary>
+	/// IDbDataParameter
+	/// </summary>
+	public class MockDbDataParameter : IDbDataParameter
+	{
+		public DbType DbType { get; set; }
+
+		public ParameterDirection Direction { get; set; }
+
+		public bool IsNullable
+		{
+			get { throw new System.NotImplementedException(); }
+		}
+
+		public string ParameterName { get; set; }
+
+		public string SourceColumn { get; set; }
+
+		public DataRowVersion SourceVersion { get; set; }
+
+		public object Value { get; set; }
+
+		public byte Precision { get; set; }
+
+		public byte Scale { get; set; }
+
+		public int Size { get; set; }
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Fluent/MockDataBase/MockReader.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,205 @@
+using System;
+using System.Data;
+using System.Linq;
+
+namespace BLToolkit.Fluent.Test.MockDataBase
+{
+	public partial class MockDb
+	{
+		private partial class MockCommand : IDbCommand
+		{
+			/// <summary>
+			/// IDataReader
+			/// </summary>
+			private class MockReader : IDataReader
+			{
+				private readonly MockReaderData _data;
+				private int _rowIndex = -1;
+				private int _resultIndex = 0;
+				private MockCommandData _cmd;
+
+				public MockReader(MockCommandData data)
+				{
+					_cmd = data;
+					_data = data.ReaderResult;
+				}
+
+				public void Dispose()
+				{
+				}
+
+				public string GetName(int i)
+				{
+					return _data.Results[_resultIndex].Names[i];
+				}
+
+				public string GetDataTypeName(int i)
+				{
+					throw new NotImplementedException();
+				}
+
+				public Type GetFieldType(int i)
+				{
+					Type type = _data.Results[_resultIndex].Types[i];
+					if (null == type)
+					{
+						object o = _data.Results[_resultIndex].Values.First()[i];
+						if (null == o)
+						{
+							throw new ArgumentException();
+						}
+						type = o.GetType();
+					}
+					return type;
+				}
+
+				public object GetValue(int i)
+				{
+					return _data.Results[_resultIndex].Values[_rowIndex][i];
+				}
+
+				public int GetValues(object[] values)
+				{
+					_data.Results[_resultIndex].Values[_rowIndex].CopyTo(values, 0);
+					return Math.Min(_data.Results[_resultIndex].Values[_rowIndex].Length, values.Length);
+				}
+
+				public int GetOrdinal(string name)
+				{
+					throw new NotImplementedException();
+				}
+
+				public bool GetBoolean(int i)
+				{
+					return Convert.ToBoolean(_data.Results[_resultIndex].Values[_rowIndex][i]);
+				}
+
+				public byte GetByte(int i)
+				{
+					return Convert.ToByte(_data.Results[_resultIndex].Values[_rowIndex][i]);
+				}
+
+				public long GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length)
+				{
+					throw new NotImplementedException();
+				}
+
+				public char GetChar(int i)
+				{
+					return Convert.ToChar(_data.Results[_resultIndex].Values[_rowIndex][i]);
+				}
+
+				public long GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length)
+				{
+					throw new NotImplementedException();
+				}
+
+				public Guid GetGuid(int i)
+				{
+					throw new NotImplementedException();
+				}
+
+				public short GetInt16(int i)
+				{
+					return Convert.ToInt16(_data.Results[_resultIndex].Values[_rowIndex][i]);
+				}
+
+				public int GetInt32(int i)
+				{
+					return Convert.ToInt32(_data.Results[_resultIndex].Values[_rowIndex][i]);
+				}
+
+				public long GetInt64(int i)
+				{
+					return Convert.ToInt64(_data.Results[_resultIndex].Values[_rowIndex][i]);
+				}
+
+				public float GetFloat(int i)
+				{
+					throw new NotImplementedException();
+				}
+
+				public double GetDouble(int i)
+				{
+					return Convert.ToDouble(_data.Results[_resultIndex].Values[_rowIndex][i]);
+				}
+
+				public string GetString(int i)
+				{
+					return Convert.ToString(_data.Results[_resultIndex].Values[_rowIndex][i]);
+				}
+
+				public decimal GetDecimal(int i)
+				{
+					return Convert.ToDecimal(_data.Results[_resultIndex].Values[_rowIndex][i]);
+				}
+
+				public DateTime GetDateTime(int i)
+				{
+					return Convert.ToDateTime(_data.Results[_resultIndex].Values[_rowIndex][i]);
+				}
+
+				public IDataReader GetData(int i)
+				{
+					throw new NotImplementedException();
+				}
+
+				public bool IsDBNull(int i)
+				{
+					return null == _data.Results[_resultIndex].Values[_rowIndex][i];
+				}
+
+				public int FieldCount
+				{
+					get { return _data.Results[_resultIndex].Names.Count; }
+				}
+
+				object IDataRecord.this[int i]
+				{
+					get { throw new NotImplementedException(); }
+				}
+
+				object IDataRecord.this[string name]
+				{
+					get { throw new NotImplementedException(); }
+				}
+
+				public void Close()
+				{
+					IsClosed = true;
+				}
+
+				public DataTable GetSchemaTable()
+				{
+					throw new NotImplementedException();
+				}
+
+				public bool NextResult()
+				{
+					_rowIndex = -1;
+					_resultIndex += 1;
+					return _data.Results.Count > _resultIndex;
+				}
+
+				public bool Read()
+				{
+					_cmd.IsUsing = true;
+					_rowIndex++;
+					return _data.Results[_resultIndex].Values.Count > _rowIndex;
+				}
+
+				public int Depth
+				{
+					get { throw new NotImplementedException(); }
+				}
+
+				public bool IsClosed { get; set; }
+
+				public int RecordsAffected
+				{
+					get { return _rowIndex + 1; }
+				}
+			}
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Fluent/MockDataBase/MockReaderData.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace BLToolkit.Fluent.Test.MockDataBase
+{
+	public class MockReaderData
+	{
+		public MockReaderData()
+		{
+			Results = new List<MockReaderResultData>();
+		}
+
+		public List<MockReaderResultData> Results { get; private set; }
+
+		public MockReaderResultData CurrentResult
+		{
+			get { return Results.LastOrDefault(); }
+			set { Results.Add(value); }
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Fluent/MockDataBase/MockReaderResultData.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace BLToolkit.Fluent.Test.MockDataBase
+{
+	public class MockReaderResultData
+	{
+		public MockReaderResultData()
+		{
+			Names = new List<string>();
+			Types = new List<Type>();
+			Values = new List<object[]>();
+		}
+
+		public List<string> Names { get; private set; }
+
+		public List<Type> Types { get; private set; }
+
+		public List<object[]> Values { get; private set; }
+
+		public void SetNames(string[] fields)
+		{
+			Names.Clear();
+			Names.AddRange(fields);
+			Types = Types.Take(Math.Min(Types.Count, Names.Count)).ToList();
+			for (int i = Types.Count; i < Names.Count; i++)
+			{
+				Types.Add(null);
+			}
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Fluent/MockDataBase/MockSqlProvider.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,32 @@
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Sql.SqlProvider;
+
+namespace BLToolkit.Fluent.Test.MockDataBase
+{
+	/// <summary>
+	/// For BLToolkit
+	/// </summary>
+	public class MockSqlProvider : BasicSqlProvider
+	{
+		public const string FieldMarker = "{D02ADC4A-7838-4FA8-8AD7-1DCE93C8098E}";
+		public const string TableMarker = "{A96D8597-A829-496C-AA71-0ED995E184CE}";
+
+		protected override ISqlProvider CreateSqlProvider()
+		{
+			return new MockSqlProvider();
+		}
+
+		public override object Convert(object value, ConvertType convertType)
+		{
+			if (ConvertType.NameToQueryField == convertType)
+			{
+				return FieldMarker + value;
+			}
+			if (ConvertType.NameToQueryTable == convertType)
+			{
+				return TableMarker + value;
+			}
+			return base.Convert(value, convertType);
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Fluent/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,35 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("BLToolkit.Fluent.Test")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("BLToolkit.Fluent.Test")]
+[assembly: AssemblyCopyright("Copyright © Microsoft 2012")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("c44cb6d7-7888-4613-88bb-933012101efa")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Fluent/UnitTests.Fluent.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>
+    </ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{527300F8-9F04-434C-8239-4FE5E174FF6B}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>BLToolkit.Fluent.Test</RootNamespace>
+    <AssemblyName>BLToolkit.Fluent.Test</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+      <Visible>False</Visible>
+    </CodeAnalysisDependentAssemblyPaths>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AssertExceptionEx.cs" />
+    <Compile Include="FluentMapAttributesTest.cs" />
+    <Compile Include="FluentConfigTest.cs" />
+    <Compile Include="FluentMapTest.cs" />
+    <Compile Include="MockDataBase\AssertCommandData.cs" />
+    <Compile Include="MockDataBase\AssertDb.cs" />
+    <Compile Include="MockDataBase\MockDbConnection.cs" />
+    <Compile Include="MockDataBase\AssertMockDataBaseEx.cs" />
+    <Compile Include="MockDataBase\MockDbDataParameter.cs" />
+    <Compile Include="MockDataBase\MockCommand.cs" />
+    <Compile Include="MockDataBase\MockCommandData.cs" />
+    <Compile Include="MockDataBase\MockDataProvider.cs" />
+    <Compile Include="MockDataBase\MockDb.cs" />
+    <Compile Include="MockDataBase\MockReader.cs" />
+    <Compile Include="MockDataBase\MockReaderData.cs" />
+    <Compile Include="MockDataBase\MockReaderResultData.cs" />
+    <Compile Include="MockDataBase\MockSqlProvider.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0c325f5d-e50e-4340-8724-d29896ccc583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/App.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+  <!--
+	<configSections>
+		<section name="bltoolkit" type="BLToolkit.Configuration.BLToolkitSection, BLToolkit.4"/>
+	</configSections>
+	<bltoolkit>
+		<dataProviders>
+			<add type="BLToolkit.Data.DataProvider.DB2DataProvider,        BLToolkit.Data.DataProvider.DB2.4"/>
+			<add type="BLToolkit.Data.DataProvider.FdpDataProvider,        BLToolkit.Data.DataProvider.Firebird.4"/>
+			<add type="BLToolkit.Data.DataProvider.InformixDataProvider,   BLToolkit.Data.DataProvider.Informix.4"/>
+			<add type="BLToolkit.Data.DataProvider.MySqlDataProvider,      BLToolkit.Data.DataProvider.MySql.4"/>
+			<add type="BLToolkit.Data.DataProvider.OdpDataProvider,        BLToolkit.Data.DataProvider.Oracle.4"/>
+			<add type="BLToolkit.Data.DataProvider.PostgreSQLDataProvider, BLToolkit.Data.DataProvider.PostgreSQL.4"/>
+			<add type="BLToolkit.Data.DataProvider.SqlCeDataProvider,      BLToolkit.Data.DataProvider.SqlCe.4"/>
+			<add type="BLToolkit.Data.DataProvider.SQLiteDataProvider,     BLToolkit.Data.DataProvider.SQLite.4"/>
+			<add type="BLToolkit.Data.DataProvider.SybaseDataProvider,     BLToolkit.Data.DataProvider.Sybase.4"/>
+		</dataProviders>
+	</bltoolkit>
+	-->
+  <!--
+	<system.diagnostics>
+		<sources>
+			<source name="System.ServiceModel.MessageLogging">
+				<listeners>
+					<add
+						name="messages"
+						type="System.Diagnostics.XmlWriterTraceListener"
+						initializeData="messages.svclog" />
+				</listeners>
+			</source>
+		</sources>
+	</system.diagnostics>
+
+	<system.serviceModel>
+		<diagnostics>
+			<messageLogging
+				logEntireMessage="true"
+				logMalformedMessages="true"
+				logMessagesAtServiceLevel="true"
+				logMessagesAtTransportLevel="false"
+				maxMessagesToLog="1000"
+				maxSizeOfMessageToLog="100000"/>
+		</diagnostics>
+	</system.serviceModel>
+	-->
+	<connectionStrings>
+		<add name="Access" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=BLToolkitData.mdb;Locale Identifier=1033;Jet OLEDB:Engine Type=5;Persist Security Info=True" />
+		<add name="Access.Data" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\..\..\..\Data\BLToolkitData.mdb;Locale Identifier=1033;Jet OLEDB:Engine Type=5;Persist Security Info=True" />
+		<add name="DB2" connectionString="Server=DBHost:50000;Database=TESTDATA;UID=Administrator;PWD=TestPassword;" providerName="IBM.Data.DB2" />
+		<add name="Fdp" connectionString="DataSource=DBHost;Database=C:\Data\TestData.fdb;User Id=SYSDBA;Password=masterkey" />
+		<add name="Informix" connectionString="Host=DBHost;Service=9088;Server=ol_informix1170;Protocol=onsoctcp;Database=TestData;UID=informix;PWD=TestPassword;" providerName="IBM.Data.Informix" />
+		<add name="MySql" connectionString="Server=DBHost;Port=3306;Database=testdata;Uid=root;Pwd=TestPassword;charset=utf8;" providerName="MySql.Data.MySqlClient" />
+		<add name="Oracle" connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=DBHost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=TestData)));User Id=TestUser;Password=TestPassword;" providerName="Oracle.DataAccess.Client" />
+		<add name="DevartOracle" connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=DBHost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=TestData)));User Id=TestUser;Password=TestPassword;" providerName="Devart.Data.Oracle" />
+		<!--
+		<add name="ManagedOracle"   connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=DBHost1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XE)));User Id=TestUser;Password=TestPassword;" providerName="Oracle.ManagedDataAccess.Client"/>
+		-->
+		<add name="PostgreSQL" connectionString="Server=DBHost;Port=5432;Database=TestData;User Id=postgres;Password=TestPassword;Pooling=true;MinPoolSize=10;MaxPoolSize=100;Protocol=3;" providerName="Npgsql" />
+		<add name="Sql2012" connectionString="Server=DBHost\SQLSERVER2012;Database=TestData;User Id=sa;Password=TestPassword;" providerName="System.Data.SqlClient" />
+		<add name="Sql2008" connectionString="Server=DBHost\SQLSERVER2008;Database=TestData;User Id=sa;Password=TestPassword;" providerName="System.Data.SqlClient" />
+		<add name="Sql2005" connectionString="Server=DBHost\SQLSERVER2005;Database=TestData;User Id=sa;Password=TestPassword;" providerName="System.Data.SqlClient" />
+		<add name="Sql2000" connectionString="Server=DBHost2008\SQLSERVER2000;Database=TestData;User Id=sa;Password=TestPassword;" providerName="System.Data.SqlClient" />
+		<add name="SqlCe" connectionString="Data Source=BLToolkitData.sdf" />
+		<add name="SqlCe.Data" connectionString="Data Source=..\..\..\..\Data\BLToolkitData.sdf" />
+		<add name="SQLite" connectionString="Data Source=.\BLToolkitData.sqlite" />
+		<add name="SQLite.Data" connectionString="Data Source=..\..\..\..\Data\BLToolkitData.sqlite" />
+		<add name="Sybase" connectionString="Data Source=DBHost2008;Port=5000;Database=TestData;Uid=sa;Password=TestPassword" providerName="Sybase.Data.AseClient" />
+		<add name="Northwind" connectionString="Server=DBHost\SQLSERVER2012;Database=Northwind;User Id=sa;Password=TestPassword;" providerName="System.Data.SqlClient" />
+	</connectionStrings>
+	<startup>
+		<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
+	</startup>
+	
+	
+<system.data> 
+    <DbProviderFactories> 
+      <add name="dotConnect for Oracle" invariant="Devart.Data.Oracle" description="Devart dotConnect for Oracle" type="Devart.Data.Oracle.OracleProviderFactory, Devart.Data.Oracle, Version=8.1.36.0, Culture=neutral, PublicKeyToken=09af7300eec23701" />
+    </DbProviderFactories> 
+  </system.data></configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/AssociationTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,427 @@
+using System;
+using System.Linq;
+
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class AssociationTest : TestBase
+	{
+		[Test]
+		public void Test1()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in    Child where ch.ParentID == 1 select new { ch, ch.Parent },
+				from ch in db.Child where ch.ParentID == 1 select new { ch, ch.Parent }));
+		}
+
+		[Test]
+		public void Test2()
+		{
+			var expected =
+				from p  in Parent
+				from ch in p.Children
+				where ch.ParentID < 4 || ch.ParentID >= 4
+				select new { p.ParentID, ch.ChildID };
+
+			ForEachProvider(db => AreEqual(expected,
+				from p  in db.Parent
+				from ch in p.Children
+				where ch.ParentID < 4 || ch.ParentID >= 4
+				select new { p.ParentID, ch.ChildID }));
+		}
+
+		[Test]
+		public void Test3()
+		{
+			var expected =
+				from p  in Parent
+				from ch in p.Children
+				where p.ParentID < 4 || p.ParentID >= 4
+				select new { p.ParentID };
+
+			ForEachProvider(db => AreEqual(expected,
+				from p  in db.Parent
+				from ch in p.Children
+				where p.ParentID < 4 || p.ParentID >= 4
+				select new { p.ParentID }));
+		}
+
+		[Test]
+		public void Test4()
+		{
+			var expected =
+				from p  in Parent
+				from ch in p.Children
+				where p.ParentID < 4 || p.ParentID >= 4
+				select new { p.ParentID, ch.ChildID };
+
+			ForEachProvider(db => AreEqual(expected,
+				from p  in db.Parent
+				from ch in p.Children
+				where p.ParentID < 4 || p.ParentID >= 4
+				select new { p.ParentID, ch.ChildID }));
+		}
+
+		[Test]
+		public void Test5()
+		{
+			var expected =
+				from p  in Parent
+				from ch in p.Children2
+				where ch.ParentID < 4 || ch.ParentID >= 4
+				select new { p.ParentID, ch.ChildID };
+
+			ForEachProvider(db => AreEqual(expected,
+				from p  in db.Parent
+				from ch in p.Children2
+				where ch.ParentID < 4 || ch.ParentID >= 4
+				select new { p.ParentID, ch.ChildID }));
+		}
+
+		[Test]
+		public void SelectMany1()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.SelectMany(p => p.Children.Select(ch => p)),
+				db.Parent.SelectMany(p => p.Children.Select(ch => p))));
+		}
+
+		[Test]
+		public void SelectMany2()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.SelectMany(p =>    Child.Select(ch => p)),
+				db.Parent.SelectMany(p => db.Child.Select(ch => p))));
+		}
+
+		[Test]
+		public void SelectMany3()
+		{
+			ForEachProvider(new[] { ProviderName.Access }, db => AreEqual(
+				Child
+					.GroupBy(ch => ch.Parent)
+					.Where(g => g.Count() > 2)
+					.SelectMany(g => g.Select(ch => ch.Parent)),
+				db.Child
+					.GroupBy(ch => ch.Parent)
+					.Where(g => g.Count() > 2)
+					.SelectMany(g => g.Select(ch => ch.Parent))));
+		}
+
+        [Test]
+		public void SelectMany4()
+		{
+			ForEachProvider(new[] { ProviderName.Access }, db => AreEqual(
+				Child
+					.GroupBy(ch => ch.Parent)
+					.Where(g => g.Count() > 2)
+					.SelectMany(g => g.Select(ch => ch.Parent.ParentID)),
+				db.Child
+					.GroupBy(ch => ch.Parent)
+					.Where(g => g.Count() > 2)
+					.SelectMany(g => g.Select(ch => ch.Parent.ParentID))));
+		}
+
+		[Test]
+		public void SelectMany5()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.SelectMany(p => p.Children.Select(ch => p.ParentID)),
+				db.Parent.SelectMany(p => p.Children.Select(ch => p.ParentID))));
+		}
+
+		[Test]
+		public void LeftJoin1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent from c in p.Children.DefaultIfEmpty() where p.ParentID >= 4 select new { p, c },
+				from p in db.Parent from c in p.Children.DefaultIfEmpty() where p.ParentID >= 4 select new { p, c }));
+		}
+
+		[Test]
+		public void LeftJoin2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent from c in p.Children.DefaultIfEmpty() where p.ParentID >= 4 select new { c, p },
+				from p in db.Parent from c in p.Children.DefaultIfEmpty() where p.ParentID >= 4 select new { c, p }));
+		}
+
+		[Test]
+		public void GroupBy1()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in    Child group ch by ch.Parent into g select g.Key,
+				from ch in db.Child group ch by ch.Parent into g select g.Key));
+		}
+
+		[Test]
+		public void GroupBy2()
+		{
+			ForEachProvider(db => AreEqual(
+				(from ch in    Child group ch by ch.Parent1).ToList().Select(g => g.Key),
+				(from ch in db.Child group ch by ch.Parent1).ToList().Select(g => g.Key)));
+		}
+
+		[Test]
+		public void GroupBy3()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent group p by p.Types.DateTimeValue.Year into g select g.Key,
+				from p in db.Parent group p by p.Types.DateTimeValue.Year into g select g.Key));
+		}
+
+		[Test]
+		public void GroupBy4()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Types group p by p.DateTimeValue.Year into g select g.Key,
+				from p in db.Types group p by p.DateTimeValue.Year into g select g.Key));
+		}
+
+		[Test]
+		public void EqualsNull1([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+				AreEqual(
+					from employee in    Employee where employee.ReportsToEmployee != null select employee.EmployeeID,
+					from employee in db.Employee where employee.ReportsToEmployee != null select employee.EmployeeID);
+		}
+
+		[Test]
+		public void EqualsNull2([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+				AreEqual(
+					from employee in    Employee where employee.ReportsToEmployee != null select employee, 
+					from employee in db.Employee where employee.ReportsToEmployee != null select employee);
+		}
+
+		[Test]
+		public void EqualsNull3([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+				AreEqual(
+					from employee in    Employee where employee.ReportsToEmployee != null select new { employee.ReportsToEmployee, employee },
+					from employee in db.Employee where employee.ReportsToEmployee != null select new { employee.ReportsToEmployee, employee });
+		}
+
+		[Test]
+		public void StackOverflow1([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+				Assert.AreEqual(
+					(from employee in    Employee where employee.Employees.Count > 0 select employee).FirstOrDefault(),
+					(from employee in db.Employee where employee.Employees.Count > 0 select employee).FirstOrDefault());
+		}
+
+		[Test]
+		public void StackOverflow2()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
+				from p in    Parent5 where p.Children.Count != 0 select p,
+				from p in db.Parent5 where p.Children.Count != 0 select p));
+		}
+
+		[Test]
+		public void StackOverflow3()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe },
+				db => AreEqual(
+					from p in    Parent5 where p.Children.Count() != 0 select p,
+					from p in db.Parent5 where p.Children.Count() != 0 select p));
+		}
+
+		[Test]
+		public void StackOverflow4()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
+				from p in    Parent5 select new { p.Children.Count },
+				from p in db.Parent5 select new { p.Children.Count }));
+		}
+
+		[Test]
+		public void DoubleJoin()
+		{
+			ForEachProvider(db => AreEqual(
+				from g in    GrandChild where g.Child.Parent.Value1 == 1 select g,
+				from g in db.GrandChild where g.Child.Parent.Value1 == 1 select g));
+		}
+
+		[Test]
+		public void Projection1()
+		{
+			ForEachProvider(db => AreEqual(
+				from c in
+					from c in Child
+					where c.Parent.ParentID == 2
+					select c
+				join g in GrandChild on c.ParentID equals g.ParentID
+				where g.ChildID == 22
+				select new { c.Parent, c },
+				from c in
+					from c in db.Child
+					where c.Parent.ParentID == 2
+					select c
+				join g in db.GrandChild on c.ParentID equals g.ParentID
+				where g.ChildID == 22
+				select new { c.Parent, c }));
+		}
+
+		[TableName("Parent")]
+		public class Top
+		{
+			public int  ParentID;
+			public int? Value1;
+
+			[Association(ThisKey = "ParentID", OtherKey = "ParentID", CanBeNull = true)]
+			public Middle Middle { get; set; }
+		}
+
+		[TableName("Child")]
+		public class Middle
+		{
+			[PrimaryKey] public int ParentID;
+			[PrimaryKey] public int ChildID;
+
+			[Association(ThisKey = "ChildID", OtherKey = "ChildID", CanBeNull = false)]
+			public Bottom Bottom { get; set; }
+
+			[Association(ThisKey = "ChildID", OtherKey = "ChildID", CanBeNull = true)]
+			public Bottom Bottom1 { get; set; }
+		}
+
+		[TableName("GrandChild")]
+		public class Bottom
+		{
+			public int ParentID;
+			public int ChildID;
+			public int GrandChildID;
+		}
+
+		[Test]
+		public void TestTernary1([DataContexts(ProviderName.SQLite, ProviderName.Access)] string context)
+		{
+			var ids = new[] { 1, 5 };
+
+			using (var db = GetDataContext(context))
+			{
+				var q =
+					from t in db.GetTable<Top>()
+					where ids.Contains(t.ParentID)
+					orderby t.ParentID
+					select t.Middle == null ? null : t.Middle.Bottom;
+
+				var list = q.ToList();
+
+				Assert.NotNull(list[0]);
+				Assert.Null   (list[1]);
+			}
+		}
+
+		[Test]
+		public void TestTernary2()
+		{
+			var ids = new[] { 1, 5 };
+
+			ForEachProvider(
+				new[] { ProviderName.SQLite, ProviderName.Access },
+				db =>
+				{
+					var q =
+						from t in db.GetTable<Top>()
+						where ids.Contains(t.ParentID)
+						orderby t.ParentID
+						select t.Middle.Bottom;
+
+					var list = q.ToList();
+
+					Assert.NotNull(list[0]);
+					Assert.Null   (list[1]);
+				});
+		}
+
+		[Test]
+		public void TestTernary3()
+		{
+			var ids = new[] { 1, 5 };
+
+			ForEachProvider(db =>
+			{
+				var q =
+					from t in db.GetTable<Top>()
+					where ids.Contains(t.ParentID)
+					orderby t.ParentID
+					select t.Middle.Bottom1;
+
+				var list = q.ToList();
+
+				Assert.NotNull(list[0]);
+				Assert.Null   (list[1]);
+			});
+		}
+
+		[TableName("Child")]
+		[InheritanceMapping(Code = 1, IsDefault = true, Type = typeof(ChildForHeirarhy))]
+		public class ChildBaseForHeirarhy
+		{
+			[MapField(IsInheritanceDiscriminator = true)]
+			public int ChildID { get; set; }
+		}
+
+		public class ChildForHeirarhy : ChildBaseForHeirarhy
+		{
+			public int ParentID { get; set; }
+			[Association(ThisKey = "ParentID", OtherKey = "ParentID", CanBeNull = true)]
+			public Parent Parent { get; set; }
+		}
+
+		[Test]
+		public void AssociationInHeirarhy()
+		{
+			ForEachProvider(db =>
+			{
+				db.GetTable<ChildBaseForHeirarhy>()
+					.OfType<ChildForHeirarhy>()
+					.Select(ch => new ChildForHeirarhy { Parent = ch.Parent })
+					.ToList();
+			});
+		}
+
+		[Test]
+		public void LetTest1()
+		{
+			ForEachProvider(db =>
+				AreEqual(
+					from p in Parent
+					let chs = p.Children
+					select new { p.ParentID, Count = chs.Count() },
+					from p in db.Parent
+					let chs = p.Children
+					select new { p.ParentID, Count = chs.Count() }));
+		}
+
+		[Test]
+		public void LetTest2()
+		{
+			ForEachProvider(db =>
+				AreEqual(
+					from p in Parent
+					select new { p } into p
+					let chs = p.p.Children
+					select new { p.p.ParentID, Count = chs.Count() },
+					from p in db.Parent
+					select new { p } into p
+					let chs = p.p.Children
+					select new { p.p.ParentID, Count = chs.Count() }));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/BatchTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,87 @@
+using System;
+using BLToolkit.Data;
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+using Data.Linq;
+using Data.Linq.Model;
+
+using NUnit.Framework;
+
+namespace Update
+{
+	[TestFixture]
+	public class BatchTest : TestBase
+	{
+		[Test]
+		public void Transaction([DataContexts(ExcludeLinqService = true)] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				var list = new[]
+				{
+					new Parent { ParentID = 1111, Value1 = 1111 },
+					new Parent { ParentID = 2111, Value1 = 2111 },
+					new Parent { ParentID = 3111, Value1 = 3111 },
+					new Parent { ParentID = 4111, Value1 = 4111 },
+				};
+
+				foreach (var parent in list)
+					db.Parent.Delete(p => p.ParentID == parent.ParentID);
+
+				db.BeginTransaction();
+				db.InsertBatch(list);
+				db.CommitTransaction();
+
+				foreach (var parent in list)
+					db.Parent.Delete(p => p.ParentID == parent.ParentID);
+			}
+		}
+
+		[Test]
+		public void NoTransaction([DataContexts(ExcludeLinqService=true)] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				var list = new[]
+				{
+					new Parent { ParentID = 1111, Value1 = 1111 },
+					new Parent { ParentID = 2111, Value1 = 2111 },
+					new Parent { ParentID = 3111, Value1 = 3111 },
+					new Parent { ParentID = 4111, Value1 = 4111 },
+				};
+
+				foreach (var parent in list)
+					db.Parent.Delete(p => p.ParentID == parent.ParentID);
+
+				db.InsertBatch(list);
+
+				foreach (var parent in list)
+					db.Parent.Delete(p => p.ParentID == parent.ParentID);
+			}
+		}
+
+		[TableName(Database="KanoonIr", Name="Area")]
+		public class Area
+		{
+			[          PrimaryKey(1)] public int    AreaCode  { get; set; }
+			                          public string AreaName  { get; set; }
+			                          public int    StateCode { get; set; }
+			[          PrimaryKey(2)] public int    CityCode  { get; set; }
+			                          public string Address   { get; set; }
+			                          public string Tels      { get; set; }
+			[Nullable               ] public string WebSite   { get; set; }
+			                          public bool   IsActive  { get; set; }
+		}
+
+		[Test, ExpectedException(typeof(InvalidOperationException), ExpectedMessage="Cannot access destination table '[KanoonIr]..[Area]'.")]
+		public void Issue260([IncludeDataContexts("Sql2005")] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				((DbManager)db).InsertBatch(new[] { new Area { AreaCode = 1 } });
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Common.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,461 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+
+using BLToolkit.Data;
+using BLToolkit.Data.Linq;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class Common : TestBase
+	{
+		[Test]
+		public void AsQueryable()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent from ch in    Child               select p,
+				from p in db.Parent from ch in db.Child.AsQueryable() select p));
+		}
+
+		[Test]
+		public void Convert()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent from ch in                         Child                select p,
+				from p in db.Parent from ch in ((IEnumerable<Child>)db.Child).AsQueryable() select p));
+		}
+
+		[Test]
+		public void NewCondition()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select new { Value = p.Value1 != null ? p.Value1 : 100 },
+				from p in db.Parent select new { Value = p.Value1 != null ? p.Value1 : 100 }));
+		}
+
+		[Test]
+		public void NewCoalesce()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select new { Value = p.Value1 ?? 100 },
+				from p in db.Parent select new { Value = p.Value1 ?? 100 }));
+		}
+
+		[Test]
+		public void CoalesceNew()
+		{
+			Child ch = null;
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select ch ?? new Child { ParentID = p.ParentID },
+				from p in db.Parent select ch ?? new Child { ParentID = p.ParentID }));
+		}
+
+		[Test]
+		public void ScalarCondition()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select p.Value1 != null ? p.Value1 : 100,
+				from p in db.Parent select p.Value1 != null ? p.Value1 : 100));
+		}
+
+		[Test]
+		public void ScalarCoalesce()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select p.Value1 ?? 100,
+				from p in db.Parent select p.Value1 ?? 100));
+		}
+
+		[Test]
+		public void ExprCoalesce()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select (p.Value1 ?? 100) + 50,
+				from p in db.Parent select (p.Value1 ?? 100) + 50));
+		}
+
+		static int GetDefault1()
+		{
+			return 100;
+		}
+
+		[Test]
+		public void ClientCoalesce1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select p.Value1 ?? GetDefault1(),
+				from p in db.Parent select p.Value1 ?? GetDefault1()));
+		}
+
+		static int GetDefault2(int n)
+		{
+			return n;
+		}
+
+		[Test]
+		public void ClientCoalesce2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select p.Value1 ?? GetDefault2(p.ParentID),
+				from p in db.Parent select p.Value1 ?? GetDefault2(p.ParentID)));
+		}
+
+		[Test]
+		public void CoalesceLike([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+				AreEqual(
+					from p in    Person
+					where
+						(p.FirstName == null ? (bool?)null : (bool?)p.FirstName.StartsWith("Jo")) == null ?
+							false :
+							(p.FirstName == null ? (bool?)null : p.FirstName.StartsWith("Jo")).Value
+					select p,
+					from p in db.Person
+					where
+						(p.FirstName == null ? (bool?)null : (bool?)p.FirstName.StartsWith("Jo")) == null ?
+							false :
+							(p.FirstName == null ? (bool?)null : p.FirstName.StartsWith("Jo")).Value
+					select p);
+		}
+
+		[Test]
+		public void PreferServerFunc1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Person select p.FirstName.Length,
+				from p in db.Person select p.FirstName.Length));
+		}
+
+		[Test]
+		public void PreferServerFunc2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Person select p.FirstName.Length + "".Length,
+				from p in db.Person select p.FirstName.Length + "".Length));
+		}
+
+		class Test
+		{
+			class Entity
+			{
+				public Test TestField = null;
+			}
+
+			public Test TestClosure(ITestDataContext db)
+			{
+				return db.Person.Select(_ => new Entity { TestField = this }).First().TestField;
+			}
+		}
+
+		[Test]
+		public void ClosureTest()
+		{
+			ForEachProvider(db => Assert.AreNotEqual(
+				new Test().TestClosure(db),
+				new Test().TestClosure(db)));
+		}
+
+		[Test]
+		public void ExecuteTest([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+			{
+				var emp = db.Employee;
+
+				Expression<Func<int>> m = () => emp.Count();
+
+				var exp = Expression.Call(((MethodCallExpression)m.Body).Method, emp.Expression);
+
+				var results = (int)((IQueryable)emp).Provider.Execute(exp);
+			}
+		}
+
+		class MyClass
+		{
+			public int ID;
+
+			public override bool Equals(object obj)
+			{
+				return ((MyClass)obj).ID == ID;
+			}
+
+			public override int GetHashCode()
+			{
+				return ID;
+			}
+		}
+
+		[Test]
+		public void NewObjectTest1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				select new { ID = new MyClass { ID = p.ParentID } } into p1
+				where p1.ID.ID == 1
+				select p1,
+				from p in db.Parent
+				select new { ID = new MyClass { ID = p.ParentID } } into p1
+				where p1.ID.ID == 1
+				select p1));
+		}
+
+		[Test]
+		public void NewObjectTest2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				select new { ID = new MyClass { ID = p.ParentID } } into p
+				join j in
+					from c in Child
+					select new { ID = new MyClass { ID = c.ParentID } }
+				on p.ID.ID equals j.ID.ID
+				where p.ID.ID == 1
+				select p,
+				from p in db.Parent
+				select new { ID = new MyClass { ID = p.ParentID } } into p
+				join j in
+					from c in db.Child
+					select new { ID = new MyClass { ID = c.ParentID } }
+				on p.ID.ID equals j.ID.ID
+				where p.ID.ID == 1
+				select p));
+		}
+
+		public Table<Person> People2(DbManager db)
+		{
+			return db.GetTable<Person>();
+		}
+
+		[Test]
+		public void TableAsMethod()
+		{
+			using (var db = new TestDbManager())
+			{
+				var q =
+					from d in db.Patient
+					from p in People2(db)
+					select p;
+
+				q.ToList();
+
+				q =
+					from d in db.Patient
+					from p in People2(db)
+					select p;
+
+				q.ToList();
+			}
+		}
+
+		[Test]
+		public void TableAsExtensionMethod()
+		{
+			using (var db = new TestDbManager())
+			{
+				var q =
+					from d in db.Patient
+					from p in db.People()
+					select p;
+
+				q.ToList();
+			}
+		}
+
+		[Test]
+		public void Condition1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Person select new { Name = !string.IsNullOrEmpty(p.FirstName) ? p.FirstName : !string.IsNullOrEmpty(p.MiddleName) ? p.MiddleName : p.LastName },
+				from p in db.Person select new { Name = !string.IsNullOrEmpty(p.FirstName) ? p.FirstName : !string.IsNullOrEmpty(p.MiddleName) ? p.MiddleName : p.LastName }));
+		}
+
+		[Test]
+		public void Condition2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Person select new { Name = !p.FirstName.IsNullOrEmpty() ? p.FirstName : !p.MiddleName.IsNullOrEmpty() ? p.MiddleName : p.LastName },
+				from p in db.Person select new { Name = !p.FirstName.IsNullOrEmpty() ? p.FirstName : !p.MiddleName.IsNullOrEmpty() ? p.MiddleName : p.LastName }));
+		}
+
+		enum PersonID
+		{
+			Person1 = 1,
+			Person2 = 2
+		}
+
+		[Test]
+		public void ConvertEnum1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Person where p.ID == (int)PersonID.Person1 select p,
+				from p in db.Person where p.ID == (int)PersonID.Person1 select p));
+		}
+
+		[Test]
+		public void ConvertEnum2()
+		{
+			var id = PersonID.Person1;
+
+			ForEachProvider(db => AreEqual(
+				from p in    Person where p.ID == (int)id select p,
+				from p in db.Person where p.ID == (int)id select p));
+		}
+
+		[Test]
+		public void GroupByUnion1()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in (
+					from c in Child
+					where c.ParentID < 4
+					select new { c.ParentID, ID = c.ChildID })
+				.Concat(
+					from g in GrandChild
+					where g.ParentID >= 4
+					select new { ParentID = g.ParentID ?? 0, ID = g.GrandChildID ?? 0 })
+				group t by t.ParentID into gr
+				select new { ParentID = gr.Key, Sum = gr.Sum(i => i.ID) } into tt
+				where tt.Sum != 0
+				select tt
+				,
+				from t in (
+					from c in db.Child
+					where c.ParentID < 4
+					select new { c.ParentID, ID = c.ChildID })
+				.Concat(
+					from g in db.GrandChild
+					where g.ParentID >= 4
+					select new { ParentID = g.ParentID ?? 0, ID = g.GrandChildID ?? 0 })
+				group t by t.ParentID into gr
+				select new { ParentID = gr.Key, Sum = gr.Sum(i => i.ID) } into tt
+				where tt.Sum != 0
+				select tt
+			));
+		}
+
+		[Test]
+		public void GroupByUnion2()
+		{
+			ForEachProvider(db =>
+			{
+				var qe1 =
+					from t in (
+						from c in Child
+						where c.ParentID < 4
+						select new { c.ParentID, ID = c.ChildID })
+					.Concat(
+						from g in GrandChild
+						where g.ParentID >= 4
+						select new { ParentID = g.ParentID ?? 0, ID = g.GrandChildID ?? 0 })
+					group t by t.ParentID into gr
+					select new { ParentID = gr.Key, Sum = gr.Sum(i => i.ID) } into tt
+					where tt.Sum != 0
+					select tt;
+
+				var qe2 =
+					from p in Parent
+						join tt in qe1 on p.ParentID equals tt.ParentID into gr
+						from tt in gr.DefaultIfEmpty()
+					select new { p.ParentID };
+
+				var qr1 =
+					from t in (
+						from c in db.Child
+						where c.ParentID < 4
+						select new { c.ParentID, ID = c.ChildID })
+					.Concat(
+						from g in db.GrandChild
+						where g.ParentID >= 4
+						select new { ParentID = g.ParentID ?? 0, ID = g.GrandChildID ?? 0 })
+					group t by t.ParentID into gr
+					select new { ParentID = gr.Key, Sum = gr.Sum(i => i.ID) } into tt
+					where tt.Sum != 0
+					select tt;
+
+				var qr2 =
+					from p in db.Parent
+						join tt in qr1 on p.ParentID equals tt.ParentID into gr
+						from tt in gr.DefaultIfEmpty()
+					select new { p.ParentID };
+
+				AreEqual(qe2, qr2);
+			});
+		}
+
+		[Test]
+		public void GroupByLeftJoin1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+					join tt in
+						from t in Child
+						group t by t.ParentID into gr
+						select new { ParentID = gr.Key, Sum = gr.Sum(i => i.ChildID) } into tt
+						where tt.Sum != 0
+						select tt
+					on p.ParentID equals tt.ParentID into gr
+					from tt in gr.DefaultIfEmpty()
+				select p.ParentID,
+				from p in db.Parent
+					join tt in
+						from t in db.Child
+						group t by t.ParentID into gr
+						select new { ParentID = gr.Key, Sum = gr.Sum(i => i.ChildID) } into tt
+						where tt.Sum != 0
+						select tt
+					on p.ParentID equals tt.ParentID into gr
+					from tt in gr.DefaultIfEmpty()
+				select p.ParentID));
+		}
+
+		void ProcessItem(ITestDataContext db, int id)
+		{
+			var hashQuery1 = Parent.Where(t => t.ParentID == id);
+
+			var groups1 = Child
+				.Where(p => hashQuery1.Any(e => e.ParentID == p.ParentID))
+				.GroupBy(e => e.ParentID)
+				.Select(g => g.Key);
+
+			var hashQuery2 = db.Parent.Where(t => t.ParentID == id);
+
+			var groups2 = db.Child
+				.Where(p => hashQuery2.Any(e => e.ParentID == p.ParentID))
+				.GroupBy(e => e.ParentID)
+				.Select(g => g.Key);
+
+			AreEqual(groups1, groups2);
+		}
+
+		[Test]
+		public void ParameterTest1()
+		{
+			ForEachProvider(db =>
+			{
+				ProcessItem(db, 1);
+				ProcessItem(db, 2);
+			});
+		}
+	}
+
+	static class Extender
+	{
+		public static Table<Person> People(this DbManager db)
+		{
+			return db.GetTable<Person>();
+		}
+
+		public static bool IsNullOrEmpty(this string value)
+		{
+			return string.IsNullOrEmpty(value);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/CompileTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,191 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using NUnit.Framework;
+
+using BLToolkit.Data.Linq;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class CompileTest : TestBase
+	{
+		[Test]
+		public void CompiledTest1()
+		{
+			var query = CompiledQuery.Compile((ITestDataContext db, string n1, int n2) =>
+				n1 + n2);
+
+			ForEachProvider(db =>
+			{
+				Assert.AreEqual("11", query(db, "1", 1));
+				Assert.AreEqual("22", query(db, "2", 2));
+			});
+		}
+
+		[Test]
+		public void CompiledTest2([DataContexts] string context)
+		{
+			var query = CompiledQuery.Compile((ITestDataContext db, int n) =>
+				db.Child.Where(c => c.ParentID == n).Take(n));
+
+			using (var db = GetDataContext(context))
+			{
+				Assert.AreEqual(1, query(db, 1).ToList().Count());
+				Assert.AreEqual(2, query(db, 2).ToList().Count());
+			}
+		}
+
+		[Test]
+		public void CompiledTest3()
+		{
+			var query = CompiledQuery.Compile((ITestDataContext db, int n) =>
+				db.GetTable<Child>().Where(c => c.ParentID == n).Take(n));
+
+			ForEachProvider(db =>
+			{
+				Assert.AreEqual(1, query(db, 1).ToList().Count());
+				Assert.AreEqual(2, query(db, 2).ToList().Count());
+			});
+		}
+
+		[Test]
+		public void CompiledTest4()
+		{
+			var query = CompiledQuery.Compile((ITestDataContext db, int[] n) =>
+				db.GetTable<Child>().Where(c => n.Contains(c.ParentID)));
+
+			ForEachProvider(db =>
+				Assert.AreEqual(3, query(db, new[] { 1, 2 }).ToList().Count()));
+		}
+
+		[Test]
+		public void CompiledTest5()
+		{
+			var query = CompiledQuery.Compile((ITestDataContext db, object[] ps) => 
+				db.Parent.Where(p => p.ParentID == (int)ps[0] && p.Value1 == (int?)ps[1]));
+
+			ForEachProvider(db =>
+			{
+				Assert.AreEqual(1, query(db, new object[] { 1, 1    }).ToList().Count());
+				Assert.AreEqual(1, query(db, new object[] { 2, null }).ToList().Count());
+			});
+		}
+
+		[Test]
+		public void CompiledTable1()
+		{
+			var query = CompiledQuery.Compile((ITestDataContext db) =>
+				db.Child);
+
+			ForEachProvider(db => query(db).ToList().Count());
+		}
+
+		[Test]
+		public void CompiledTable2()
+		{
+			var query = CompiledQuery.Compile((ITestDataContext db) =>
+				db.GetTable<Child>());
+
+			ForEachProvider(db => query(db).ToList().Count());
+		}
+
+		[Test]
+		public void ConcurentTest1()
+		{
+			var query = CompiledQuery.Compile((ITestDataContext db, int n) =>
+				db.GetTable<Parent>().Where(p => p.ParentID == n).First().ParentID);
+
+			const int count = 100;
+
+			var threads = new Thread[count];
+			var results = new int   [count, 2];
+
+			for (var i = 0; i < count; i++)
+			{
+				var n = i;
+
+				threads[i] = new Thread(() =>
+				{
+					using (var db = new TestDbManager())
+					{
+						var id = (n % 6) + 1;
+						results[n,0] = id;
+						results[n,1] = query(db, id);
+					}
+				});
+			}
+
+			for (var i = 0; i < count; i++)
+				threads[i].Start();
+
+			for (var i = 0; i < count; i++)
+				threads[i].Join();
+
+			for (var i = 0; i < count; i++)
+				Assert.AreEqual(results[i,0], results[i,1]);
+		}
+
+		[Test]
+		public void ConcurentTest2()
+		{
+			var threads = new Thread[100];
+			var results = new int   [100,2];
+
+			for (var i = 0; i < 100; i++)
+			{
+				var n = i;
+
+				threads[i] = new Thread(() =>
+				{
+					using (var db = new TestDbManager())
+					{
+						var id = (n % 6) + 1;
+						results[n,0] = id;
+						results[n,1] = db.Parent.Where(p => p.ParentID == id).First().ParentID;
+					}
+				});
+			}
+
+			for (var i = 0; i < 100; i++)
+				threads[i].Start();
+
+			for (var i = 0; i < 100; i++)
+				threads[i].Join();
+
+			for (var i = 0; i < 100; i++)
+				Assert.AreEqual(results[i,0], results[i,1]);
+		}
+
+		[Test]
+		public void ParamTest1()
+		{
+			var query = CompiledQuery.Compile<ITestDataContext,int,IEnumerable<Child>>((db, id) =>
+				from c in db.Child
+				where c.ParentID == id
+				select new Child
+				{
+					ParentID = id,
+					ChildID  = c.ChildID
+				});
+
+			ForEachProvider(db => Assert.AreEqual(2, query(db, 2).ToList().Count()));
+		}
+
+		[Test]
+		public void ElementTest1()
+		{
+			var query = CompiledQuery.Compile((ITestDataContext db, int n) =>
+				db.Child.Where(c => c.ParentID == n).First());
+
+			ForEachProvider(db =>
+			{
+				Assert.AreEqual(1, query(db, 1).ParentID);
+				Assert.AreEqual(2, query(db, 2).ParentID);
+			});
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/CompilerServices.vb	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,9 @@
+Imports Data.Linq.Model
+
+Public Module CompilerServices
+
+    Public Function CompareString(ByVal db As ITestDataContext) As IEnumerable(Of Person)
+        Return From p In db.Person Where p.FirstName = "John" Select p
+    End Function
+
+End Module
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/ComplexTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,434 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+
+using BLToolkit.Data.DataProvider;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class ComplexTest : TestBase
+	{
+		[Test]
+		public void Contains1()
+		{
+			var q1 =
+				from gc1 in GrandChild
+					join max in
+						from gch in GrandChild
+						group gch by gch.ChildID into g
+						select g.Max(c => c.GrandChildID)
+					on gc1.GrandChildID equals max
+				select gc1;
+
+			var expected =
+				from ch in Child
+					join p   in Parent on ch.ParentID equals p.ParentID
+					join gc2 in q1     on p.ParentID  equals gc2.ParentID into g
+					from gc3 in g.DefaultIfEmpty()
+				where gc3 == null || !new[] { 111, 222 }.Contains(gc3.GrandChildID.Value)
+				select new { p.ParentID, gc3 };
+
+			ForEachProvider(new [] { ProviderName.Firebird, ProviderName.Access }, db =>
+			{
+				var q2 =
+					from gc1 in db.GrandChild
+						join max in
+							from gch in db.GrandChild
+							group gch by gch.ChildID into g
+							select g.Max(c => c.GrandChildID)
+						on gc1.GrandChildID equals max
+					select gc1;
+
+				var result =
+					from ch in db.Child
+						join p   in db.Parent on ch.ParentID equals p.ParentID
+						join gc2 in q2        on p.ParentID  equals gc2.ParentID into g
+						from gc3 in g.DefaultIfEmpty()
+				where gc3 == null || !new[] { 111, 222 }.Contains(gc3.GrandChildID.Value)
+				select new { p.ParentID, gc3 };
+
+				AreEqual(expected, result);
+			});
+		}
+
+		[Test]
+		public void Contains2()
+		{
+			var q1 =
+				from gc in GrandChild
+					join max in
+						from gch in GrandChild
+						group gch by gch.ChildID into g
+						select g.Max(c => c.GrandChildID)
+					on gc.GrandChildID equals max
+				select gc;
+
+			var expected =
+				from ch in Child
+					join p  in Parent on ch.ParentID equals p.ParentID
+					join gc in q1     on p.ParentID  equals gc.ParentID into g
+					from gc in g.DefaultIfEmpty()
+				where gc == null || gc.GrandChildID != 111 && gc.GrandChildID != 222
+				select new
+				{
+					Parent       = p,
+					GrandChildID = gc,
+					Value        = GetValue(gc != null ? gc.ChildID : int.MaxValue)
+				};
+
+			ForEachProvider(new [] { ProviderName.Firebird, ProviderName.Access }, db =>
+			{
+				var q2 =
+					from gc in db.GrandChild
+						join max in
+							from gch in db.GrandChild
+							group gch by gch.ChildID into g
+							select g.Max(c => c.GrandChildID)
+						on gc.GrandChildID equals max
+					select gc;
+
+				var result =
+					from ch in db.Child
+						join p  in db.Parent on ch.ParentID equals p.ParentID
+						join gc in q2        on p.ParentID  equals gc.ParentID into g
+						from gc in g.DefaultIfEmpty()
+				where gc == null || gc.GrandChildID != 111 && gc.GrandChildID != 222
+				select new
+				{
+					Parent       = p,
+					GrandChildID = gc,
+					Value        = GetValue(gc != null ? gc.ChildID : int.MaxValue)
+				};
+
+				AreEqual(expected, result);
+			});
+		}
+
+		static int GetValue(int? value)
+		{
+			return value ?? 777;
+		}
+
+		[Test]
+		public void Contains3()
+		{
+			var q1 =
+				from gc in GrandChild1
+					join max in
+						from gch in GrandChild1
+						group gch by gch.ChildID into g
+						select g.Max(c => c.GrandChildID)
+					on gc.GrandChildID equals max
+				select gc;
+
+			var expected =
+				from ch in Child
+					join p  in Parent on ch.ParentID equals p.ParentID
+					join gc in q1     on p.ParentID  equals gc.ParentID into g
+					from gc in g.DefaultIfEmpty()
+				where gc == null || !new[] { 111, 222 }.Contains(gc.GrandChildID.Value)
+				select new { p.ParentID, gc };
+
+			ForEachProvider(new [] { ProviderName.SQLite, ProviderName.Access }, db =>
+			{
+				var q2 =
+					from gc in db.GrandChild1
+						join max in
+							from gch in db.GrandChild1
+							group gch by gch.ChildID into g
+							select g.Max(c => c.GrandChildID)
+						on gc.GrandChildID equals max
+					select gc;
+
+				var result =
+					from ch in db.Child
+						join p  in db.Parent on ch.ParentID equals p.ParentID
+						join gc in q2     on p.ParentID  equals gc.ParentID into g
+						from gc in g.DefaultIfEmpty()
+					where gc == null || !new[] { 111, 222 }.Contains(gc.GrandChildID.Value)
+					select new { p.ParentID, gc };
+
+				AreEqual(expected, result);
+			});
+		}
+
+		[Test]
+		public void Contains4()
+		{
+			var q1 =
+				from gc in GrandChild1
+					join max in
+						from gch in GrandChild1
+						group gch by gch.ChildID into g
+						select g.Max(c => c.GrandChildID)
+					on gc.GrandChildID equals max
+				select gc;
+
+			var expected =
+				from ch in Child
+					join gc in q1 on ch.Parent.ParentID equals gc.ParentID into g
+					from gc in g.DefaultIfEmpty()
+				where gc == null || !new[] { 111, 222 }.Contains(gc.GrandChildID.Value)
+				select new { ch.Parent, gc };
+
+			ForEachProvider(new [] { ProviderName.SQLite, ProviderName.Access }, db =>
+			{
+				var q2 =
+					from gc in db.GrandChild1
+						join max in
+							from gch in db.GrandChild1
+							group gch by gch.ChildID into g
+							select g.Max(c => c.GrandChildID)
+						on gc.GrandChildID equals max
+					select gc;
+
+				var result =
+					from ch in db.Child
+						join gc in q2 on ch.Parent.ParentID equals gc.ParentID into g
+						from gc in g.DefaultIfEmpty()
+				where gc == null || !new[] { 111, 222 }.Contains(gc.GrandChildID.Value)
+				select new { ch.Parent, gc };
+
+				AreEqual(expected, result);
+			});
+		}
+
+		[Test]
+		public void Join1()
+		{
+			var q1 =
+				from p in Parent
+					join c in Child      on p.ParentID equals c.ParentID
+					join g in GrandChild on p.ParentID equals g.ParentID
+				select new { p, c, g };
+
+			var expected =
+				from x in q1
+				where
+				(
+					(x.c.ParentID == 2 || x.c.ParentID == 3) && x.g.ChildID != 21 && x.g.ChildID != 33
+				) || (
+					x.g.ParentID == 3 && x.g.ChildID == 32
+				) || (
+					x.g.ChildID == 11
+				)
+				select x;
+
+			ForEachProvider(db =>
+			{
+				var q2 =
+					from p in db.Parent
+						join c in db.Child      on p.ParentID equals c.ParentID
+						join g in db.GrandChild on p.ParentID equals g.ParentID
+					select new { p, c, g };
+
+				var result =
+					from x in q2
+					where
+					(
+						(x.c.ParentID == 2 || x.c.ParentID == 3) && x.g.ChildID != 21 && x.g.ChildID != 33
+					) || (
+						x.g.ParentID == 3 && x.g.ChildID == 32
+					) || (
+						x.g.ChildID == 11
+					)
+					select x;
+
+					AreEqual(expected, result);
+			});
+		}
+
+		public class MyObject
+		{
+			public Parent Parent;
+			public Child  Child;
+		}
+
+		IQueryable<MyObject> GetData(ITestDataContext db, int id)
+		{
+			var q =
+				from p in db.Parent
+				join c in db.Child on p.ParentID equals c.ChildID
+				where p.ParentID == id && c.ChildID > 0
+				select new MyObject { Parent = p, Child = c };
+
+			return q;
+		}
+
+		[Test]
+		public void Join2()
+		{
+			ForEachProvider(db =>
+			{
+				var q =
+					from o in GetData(db, 1)
+					from g in o.Parent.GrandChildren
+					select new { o, g };
+
+				var list = q.ToList();
+			});
+		}
+
+		[Test]
+		public void ExpressionTest1([IncludeDataContexts("Northwind")] string context)
+		{
+			Expression<Func<Northwind.Customer,bool>> pred1 = cust=>cust.Country=="UK";
+			Expression<Func<Northwind.Customer,bool>> pred2 = cust=>cust.Country=="France";
+
+			var param = Expression.Parameter(typeof(Northwind.Customer), "x");
+			var final = Expression.Lambda<Func<Northwind.Customer,bool>>(
+				Expression.OrElse(
+					Expression.Invoke(pred1, param),
+					Expression.Invoke(pred2, param)
+				), param);
+
+			using (var db = new NorthwindDB())
+			{
+				var count = db.Customer.Count(final);
+			}
+		}
+
+		[Test]
+		public void ExpressionTest2()
+		{
+			Expression<Func<Parent,bool>> pred1 = _=>_.ParentID == 1;
+			Expression<Func<Parent,bool>> pred2 = _=>_.Value1   == 1 || _.Value1 == null;
+
+			var param = Expression.Parameter(typeof(Parent), "x");
+			var final = Expression.Lambda<Func<Parent,bool>>(
+				Expression.AndAlso(
+					Expression.Invoke(pred1, param),
+					Expression.Invoke(pred2, param)
+				), param);
+
+			using (var db = new TestDbManager())
+			{
+				Assert.AreEqual(1, db.Parent.Count(final));
+			}
+		}
+
+		#region IEnumerableTest
+
+		public class Entity
+		{
+			public int Id { get; set; }
+		}
+
+		public enum TestEntityType : byte { Type1, Type2 }
+
+		[TableName("GrandChild")]
+		[MapField("GrandChildID", "Id")]
+		[MapField("ChildID", "InnerEnity.Id")]
+		[MapField("ParentID", "InnerEntityType")]
+		public class LookupEntity : Entity
+		{
+			public Entity         InnerEnity      { get; set; }
+			public TestEntityType InnerEntityType { get; set; }
+		}
+
+		[TableName("GrandChild")]
+		[MapField("GrandChildID", "Id")]
+		[MapField("ChildID",   "Owner.Id")]
+		[MapField("ParentID", "EntityType")]
+		public class TestEntityBase : Entity
+		{
+			public TestEntityType EntityType { get; set; }
+			public SuperAccount   Owner      { get; set; }
+		}
+
+		public class TestEntity : TestEntityBase, IEnumerable<object>
+		{
+			#region IEnumerable<object> Members
+
+			public IEnumerator<object> GetEnumerator()
+			{
+				throw new NotImplementedException();
+			}
+
+			#endregion
+
+			#region IEnumerable Members
+
+			IEnumerator IEnumerable.GetEnumerator()
+			{
+				throw new NotImplementedException();
+			}
+
+			#endregion
+		}
+
+		public class TestEntity2 : TestEntityBase
+		{
+		}
+
+		public enum SuperAccountType { Client, Organization }
+	    
+		[TableName("GrandChild")]
+		[MapField("GrandChildID", "Id")]
+		[MapField("ParentID", "Type")]
+		public class SuperAccount : Entity, IEnumerable<object>
+		{
+			public List<Entity>     InnerAccounts { get; set; }
+			public SuperAccountType Type          { get; set; }
+
+
+			#region IEnumerable<object> Members
+
+			public IEnumerator<object> GetEnumerator()
+			{
+				throw new NotImplementedException();
+			}
+
+			#endregion
+
+			#region IEnumerable Members
+
+			IEnumerator IEnumerable.GetEnumerator()
+			{
+				throw new NotImplementedException();
+			}
+
+			#endregion
+		}
+
+		[Test]
+		public void IEnumerableTest1()
+		{
+			using (var db = new TestDbManager())
+			{
+				var res =
+					from rc in db.GetTable<TestEntity>()
+					join li in db.GetTable<LookupEntity>() on rc.Id equals li.InnerEnity.Id
+					where rc.EntityType == TestEntityType.Type1
+					select rc;
+
+				res.ToList();
+			}
+		}
+
+		[Test]
+		public void IEnumerableTest2()
+		{
+			using (var db = new TestDbManager())
+			{
+				var zones =
+					from z in db.GetTable<TestEntity2>()
+					join o in db.GetTable<SuperAccount>() on z.Owner.Id equals o.Id
+					select z;
+
+				zones.ToList();
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/ConcatUnionTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,633 @@
+using System;
+using System.Linq;
+
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class ConcatUnionTest : TestBase
+	{
+		[Test]
+		public void Concat1()
+		{
+			var expected =
+				(from p in Parent where p.ParentID == 1 select p).Concat(
+				(from p in Parent where p.ParentID == 2 select p));
+
+			ForEachProvider(db => AreEqual(expected, 
+				(from p in db.Parent where p.ParentID == 1 select p).Concat(
+				(from p in db.Parent where p.ParentID == 2 select p))));
+		}
+
+		[Test]
+		public void Concat11()
+		{
+			ForEachProvider(db => AreEqual(
+				(from ch in    Child where ch.ParentID == 1 select ch.Parent).Concat(
+				(from ch in    Child where ch.ParentID == 2 select ch.Parent)),
+				(from ch in db.Child where ch.ParentID == 1 select ch.Parent).Concat(
+				(from ch in db.Child where ch.ParentID == 2 select ch.Parent))));
+		}
+
+		[Test]
+		public void Concat12()
+		{
+			ForEachProvider(db => AreEqual(
+				(from p  in    Parent where p.ParentID  == 1 select p).Concat(
+				(from ch in    Child  where ch.ParentID == 2 select ch.Parent)),
+				(from p  in db.Parent where p.ParentID  == 1 select p).Concat(
+				(from ch in db.Child  where ch.ParentID == 2 select ch.Parent))));
+		}
+
+		[Test]
+		public void Concat2()
+		{
+			var expected =
+				(from p in Parent where p.ParentID == 1 select p).Concat(
+				(from p in Parent where p.ParentID == 2 select p)).Concat(
+				(from p in Parent where p.ParentID == 4 select p));
+
+			ForEachProvider(db => AreEqual(expected, 
+				(from p in db.Parent where p.ParentID == 1 select p).Concat(
+				(from p in db.Parent where p.ParentID == 2 select p)).Concat(
+				(from p in db.Parent where p.ParentID == 4 select p))));
+		}
+
+		[Test]
+		public void Concat3()
+		{
+			var expected =
+				(from p in Parent where p.ParentID == 1 select p).Concat(
+				(from p in Parent where p.ParentID == 2 select p).Concat(
+				(from p in Parent where p.ParentID == 4 select p)));
+
+			ForEachProvider(db => AreEqual(expected, 
+				(from p in db.Parent where p.ParentID == 1 select p).Concat(
+				(from p in db.Parent where p.ParentID == 2 select p).Concat(
+				(from p in db.Parent where p.ParentID == 4 select p)))));
+		}
+
+		[Test]
+		public void Concat4()
+		{
+			var expected =
+				(from c in Child where c.ParentID == 1 select c).Concat(
+				(from c in Child where c.ParentID == 3 select new Child { ParentID = c.ParentID, ChildID = c.ChildID + 1000 }).
+				Where(c => c.ChildID != 1032));
+
+			ForEachProvider(db => AreEqual(expected, 
+				(from c in db.Child where c.ParentID == 1 select c).Concat(
+				(from c in db.Child where c.ParentID == 3 select new Child { ParentID = c.ParentID, ChildID = c.ChildID + 1000 })).
+				Where(c => c.ChildID != 1032)));
+		}
+
+		[Test]
+		public void Concat401()
+		{
+			var expected =
+				(from c in Child where c.ParentID == 1 select c).Concat(
+				(from c in Child where c.ParentID == 3 select new Child { ChildID = c.ChildID + 1000, ParentID = c.ParentID }).
+				Where(c => c.ChildID != 1032));
+
+			ForEachProvider(db => AreEqual(expected, 
+				(from c in db.Child where c.ParentID == 1 select c).Concat(
+				(from c in db.Child where c.ParentID == 3 select new Child { ChildID = c.ChildID + 1000, ParentID = c.ParentID })).
+				Where(c => c.ChildID != 1032)));
+		}
+
+		[Test]
+		public void Concat5()
+		{
+			ForEachProvider(
+				new[] { ProviderName.DB2, ProviderName.Informix },
+				db => AreEqual(
+					(from c in Child where c.ParentID == 1 select c).Concat(
+					(from c in Child where c.ParentID == 3 select new Child { ChildID = c.ChildID + 1000 }).
+					Where(c => c.ChildID != 1032)), 
+					(from c in db.Child where c.ParentID == 1 select c).Concat(
+					(from c in db.Child where c.ParentID == 3 select new Child { ChildID = c.ChildID + 1000 })).
+					Where(c => c.ChildID != 1032)));
+		}
+
+		[Test]
+		public void Concat501()
+		{
+			ForEachProvider(new[] { ProviderName.DB2, ProviderName.Informix },
+				db => AreEqual(
+					(from c in    Child where c.ParentID == 1 select new Child { ParentID = c.ParentID }).Concat(
+					(from c in    Child where c.ParentID == 3 select new Child { ChildID  = c.ChildID + 1000 }).
+					Where(c => c.ParentID == 1)),
+					(from c in db.Child where c.ParentID == 1 select new Child { ParentID = c.ParentID }).Concat(
+					(from c in db.Child where c.ParentID == 3 select new Child { ChildID  = c.ChildID + 1000 })).
+					Where(c => c.ParentID == 1)));
+		}
+
+		[Test]
+		public void Concat502()
+		{
+			ForEachProvider(new[] { ProviderName.DB2, ProviderName.Informix },
+				db => AreEqual(
+					(from c in    Child where c.ParentID == 1 select c.Parent).Concat(
+					(from c in    Child where c.ParentID == 3 select c.Parent).
+					Where(p => p.Value1.Value != 2)),
+					(from c in db.Child where c.ParentID == 1 select c.Parent).Concat(
+					(from c in db.Child where c.ParentID == 3 select c.Parent)).
+					Where(p => p.Value1.Value != 2)));
+		}
+
+		[Test]
+		public void Concat6()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe },
+				db => AreEqual(
+					   Child.Where(c => c.GrandChildren.Count == 2).Concat(   Child.Where(c => c.GrandChildren.Count() == 3)),
+					db.Child.Where(c => c.GrandChildren.Count == 2).Concat(db.Child.Where(c => c.GrandChildren.Count() == 3))));
+		}
+
+		[Test]
+		public void Concat7([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+				AreEqual(
+					   Customer.Where(c => c.Orders.Count <= 1).Concat(   Customer.Where(c => c.Orders.Count > 1)),
+					db.Customer.Where(c => c.Orders.Count <= 1).Concat(db.Customer.Where(c => c.Orders.Count > 1)));
+		}
+
+		[Test]
+		public void Concat81()
+		{
+			ForEachProvider(
+				db => AreEqual(
+					   Parent.Select(c => new { ID1 = c.ParentID, ID2 = c.ParentID, }).Concat(
+					   Child. Select(c => new { ID1 = c.ParentID, ID2 = c.ChildID,  })),
+					db.Parent.Select(c => new { ID1 = c.ParentID, ID2 = c.ParentID, }).Concat(
+					db.Child. Select(c => new { ID1 = c.ParentID, ID2 = c.ChildID,  }))));
+		}
+
+		[Test]
+		public void Concat82()
+		{
+			ForEachProvider(
+				db => AreEqual(
+					   Child. Select(c => new { ID1 = c.ParentID, ID2 = c.ChildID,  }).Concat(
+					   Parent.Select(c => new { ID1 = c.ParentID, ID2 = c.ParentID, })),
+					db.Child. Select(c => new { ID1 = c.ParentID, ID2 = c.ChildID,  }).Concat(
+					db.Parent.Select(c => new { ID1 = c.ParentID, ID2 = c.ParentID, }))));
+		}
+
+		[Test]
+		public void Concat83()
+		{
+			ForEachProvider(
+				db => AreEqual(
+					   Parent.Select(c => new { ID1 = c.ParentID, ID2 = c.ParentID, ID3 = c.Value1 ?? 0,  }).Concat(
+					   Child. Select(c => new { ID1 = c.ParentID, ID2 = c.ChildID,  ID3 = c.ParentID + 1, })),
+					db.Parent.Select(c => new { ID1 = c.ParentID, ID2 = c.ParentID, ID3 = c.Value1 ?? 0,  }).Concat(
+					db.Child. Select(c => new { ID1 = c.ParentID, ID2 = c.ChildID,  ID3 = c.ParentID + 1, }))));
+		}
+
+		[Test]
+		public void Concat84()
+		{
+			ForEachProvider(
+				db => AreEqual(
+					   Child. Select(c => new { ID1 = c.ParentID, ID2 = c.ChildID,  ID3 = c.ParentID + 1, }).Concat(
+					   Parent.Select(c => new { ID1 = c.ParentID, ID2 = c.ParentID, ID3 = c.Value1 ?? 0,  })),
+					db.Child. Select(c => new { ID1 = c.ParentID, ID2 = c.ChildID,  ID3 = c.ParentID + 1, }).Concat(
+					db.Parent.Select(c => new { ID1 = c.ParentID, ID2 = c.ParentID, ID3 = c.Value1 ?? 0,  }))));
+		}
+
+		[Test]
+		public void Concat85()
+		{
+			ForEachProvider(
+				db => AreEqual(
+					   Parent.Select(c => new { ID1 = c.ParentID, ID2 = c.Value1 ?? 0,  ID3 = c.ParentID, }).Concat(
+					   Child. Select(c => new { ID1 = c.ParentID, ID2 = c.ParentID + 1, ID3 = c.ChildID,  })),
+					db.Parent.Select(c => new { ID1 = c.ParentID, ID2 = c.Value1 ?? 0,  ID3 = c.ParentID, }).Concat(
+					db.Child. Select(c => new { ID1 = c.ParentID, ID2 = c.ParentID + 1, ID3 = c.ChildID,  }))));
+		}
+
+		[Test]
+		public void Concat851()
+		{
+			ForEachProvider(
+				db => AreEqual(
+					   Parent.Select(c => new { ID1 = c.ParentID, ID2 = c.ParentID,     ID3 = c.ParentID, }).Concat(
+					   Child. Select(c => new { ID1 = c.ParentID, ID2 = c.ParentID + 1, ID3 = c.ChildID,  })),
+					db.Parent.Select(c => new { ID1 = c.ParentID, ID2 = c.ParentID,     ID3 = c.ParentID, }).Concat(
+					db.Child. Select(c => new { ID1 = c.ParentID, ID2 = c.ParentID + 1, ID3 = c.ChildID,  }))));
+		}
+
+		[Test]
+		public void Concat86()
+		{
+			ForEachProvider(
+				db => AreEqual(
+					   Child. Select(c => new { ID1 = c.ParentID, ID2 = c.ParentID + 1, ID3 = c.ChildID,  }).Concat(
+					   Parent.Select(c => new { ID1 = c.ParentID, ID2 = c.Value1 ?? 0,  ID3 = c.ParentID, })),
+					db.Child. Select(c => new { ID1 = c.ParentID, ID2 = c.ParentID + 1, ID3 = c.ChildID,  }).Concat(
+					db.Parent.Select(c => new { ID1 = c.ParentID, ID2 = c.Value1 ?? 0,  ID3 = c.ParentID, }))));
+		}
+
+		[Test]
+		public void Concat87()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Informix },
+				db => AreEqual(
+					   Child. Select(c => new Parent { ParentID = c.ParentID }).Concat(
+					   Parent.Select(c => new Parent { Value1   = c.Value1   })),
+					db.Child. Select(c => new Parent { ParentID = c.ParentID }).Concat(
+					db.Parent.Select(c => new Parent { Value1   = c.Value1   }))));
+		}
+
+		[Test]
+		public void Concat871()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Informix },
+				db => AreEqual(
+					   Parent.Select(c => new Parent { Value1   = c.Value1   }).Concat(
+					   Child. Select(c => new Parent { ParentID = c.ParentID })),
+					db.Parent.Select(c => new Parent { Value1   = c.Value1   }).Concat(
+					db.Child. Select(c => new Parent { ParentID = c.ParentID }))));
+		}
+
+		[Test]
+		public void Concat88()
+		{
+			ForEachProvider(
+				db => AreEqual(
+					   Child. Select(c => new Parent { Value1   = c.ChildID,  ParentID = c.ParentID }).Concat(
+					   Parent.Select(c => new Parent { ParentID = c.ParentID, Value1   = c.Value1   })),
+					db.Child. Select(c => new Parent { Value1   = c.ChildID,  ParentID = c.ParentID }).Concat(
+					db.Parent.Select(c => new Parent { ParentID = c.ParentID, Value1   = c.Value1   }))));
+		}
+
+		[Test]
+		public void Concat89()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Informix },
+				db => AreEqual(
+					   Child. Select(c => new Parent { Value1   = c.ParentID, ParentID = c.ParentID }).Concat(
+					   Parent.Select(c => new Parent { ParentID = c.ParentID                        })),
+					db.Child. Select(c => new Parent { Value1   = c.ParentID, ParentID = c.ParentID }).Concat(
+					db.Parent.Select(c => new Parent { ParentID = c.ParentID                        }))));
+		}
+
+		[Test]
+		public void Union1()
+		{
+			ForEachProvider(db => AreEqual(
+				(from g  in    GrandChild join ch in    Child  on g.ChildID   equals ch.ChildID select ch).Union(
+				(from ch in    Child      join p  in    Parent on ch.ParentID equals p.ParentID select ch)),
+				(from g  in db.GrandChild join ch in db.Child  on g.ChildID   equals ch.ChildID select ch).Union(
+				(from ch in db.Child      join p  in db.Parent on ch.ParentID equals p.ParentID select ch))));
+		}
+
+		[Test]
+		public void Union2()
+		{
+			ForEachProvider(db => AreEqual(
+				from r  in
+					(from g  in GrandChild join ch in Child  on g.ChildID   equals ch.ChildID select ch.ChildID).Union(
+					(from ch in Child      join p  in Parent on ch.ParentID equals p.ParentID select ch.ChildID))
+				join child in Child on r equals child.ChildID
+				select child,
+				from r in
+					(from g  in db.GrandChild join ch in db.Child  on g.ChildID   equals ch.ChildID select ch.ChildID).Union(
+					(from ch in db.Child      join p  in db.Parent on ch.ParentID equals p.ParentID select ch.ChildID))
+				join child in db.Child on r equals child.ChildID
+				select child));
+		}
+
+		[Test]
+		public void Union3()
+		{
+			ForEachProvider(db => AreEqual(
+				(from p  in    Parent select new { id = p.ParentID,  val = true }).Union(
+				(from ch in    Child  select new { id = ch.ParentID, val = false })),
+				(from p  in db.Parent select new { id = p.ParentID,  val = true }).Union(
+				(from ch in db.Child  select new { id = ch.ParentID, val = false }))));
+		}
+
+		[Test]
+		public void Union4()
+		{
+			ForEachProvider(db => AreEqual(
+				(from p  in    Parent select new { id = p.ParentID,  val = true }).Union(
+				(from ch in    Child  select new { id = ch.ParentID, val = false }))
+				.Select(p => new { p.id, p.val }),
+				(from p  in db.Parent select new { id = p.ParentID,  val = true }).Union(
+				(from ch in db.Child  select new { id = ch.ParentID, val = false }))
+				.Select(p => new { p.id, p.val })));
+		}
+
+		[Test]
+		public void Union41()
+		{
+			ForEachProvider(db => AreEqual(
+				(from p  in    Parent select new { id = p.ParentID,  val = true }).Union(
+				(from ch in    Child  select new { id = ch.ParentID, val = false }))
+				.Select(p => p),
+				(from p  in db.Parent select new { id = p.ParentID,  val = true }).Union(
+				(from ch in db.Child  select new { id = ch.ParentID, val = false }))
+				.Select(p => p)));
+		}
+
+		[Test]
+		public void Union42()
+		{
+			ForEachProvider(db => AreEqual(
+				(from p  in    Parent select new { id = p. ParentID, val = true  }).Union(
+				(from ch in    Child  select new { id = ch.ParentID, val = false }))
+				.Select(p => p.val),
+				(from p  in db.Parent select new { id = p. ParentID, val = true  }).Union(
+				(from ch in db.Child  select new { id = ch.ParentID, val = false }))
+				.Select(p => p.val)));
+		}
+
+		[Test]
+		public void Union421()
+		{
+			ForEachProvider(db => AreEqual(
+				(from p  in    Parent select new { id = p. ParentID, val = true  }).Union(
+				(from p  in    Parent select new { id = p. ParentID, val = false }).Union(
+				(from ch in    Child  select new { id = ch.ParentID, val = false })))
+				.Select(p => p.val),
+				(from p  in db.Parent select new { id = p. ParentID, val = true  }).Union(
+				(from p  in db.Parent select new { id = p. ParentID, val = false }).Union(
+				(from ch in db.Child  select new { id = ch.ParentID, val = false })))
+				.Select(p => p.val)));
+		}
+
+		[Test]
+		public void Union5()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Informix },
+				db => AreEqual(
+					(from p1 in    Parent select p1).Union(
+					(from p2 in    Parent select new Parent { ParentID = p2.ParentID }))
+					.Select(p => new Parent { ParentID = p.ParentID, Value1 = p.Value1 }),
+					(from p1 in db.Parent select p1).Union(
+					(from p2 in db.Parent select new Parent { ParentID = p2.ParentID }))
+					.Select(p => new Parent { ParentID = p.ParentID, Value1 = p.Value1 })));
+		}
+
+		[Test]
+		public void Union51()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Informix },
+				db => AreEqual(
+					(from p1  in   Parent select p1).Union(
+					(from p2 in    Parent select new Parent { ParentID = p2.ParentID })),
+					(from p1 in db.Parent select p1).Union(
+					(from p2 in db.Parent select new Parent { ParentID = p2.ParentID }))));
+		}
+
+		[Test]
+		public void Union52()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Access, ProviderName.Informix },
+				db => AreEqual(
+					(from p1 in    Parent select new Parent { ParentID = p1.ParentID }).Union(
+					(from p2 in    Parent select p2)),
+					(from p1 in db.Parent select new Parent { ParentID = p1.ParentID }).Union(
+					(from p2 in db.Parent select p2))));
+		}
+
+		[Test]
+		public void Union521()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Access, ProviderName.Informix },
+				db => AreEqual(
+					(from p1 in    Parent select new Parent { ParentID = p1.ParentID }).Union(
+					(from p2 in    Parent select p2))
+					.Select(p => p.Value1),
+					(from p1 in db.Parent select new Parent { ParentID = p1.ParentID }).Union(
+					(from p2 in db.Parent select p2))
+					.Select(p => p.Value1)));
+		}
+
+		[Test]
+		public void Union522()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Access, ProviderName.Informix },
+				db => AreEqual(
+					(from p1 in    Parent select new Parent { Value1 = p1.Value1 }).Union(
+					(from p2 in    Parent select p2)),
+					(from p1 in db.Parent select new Parent { Value1 = p1.Value1 }).Union(
+					(from p2 in db.Parent select p2))));
+		}
+
+		[Test]
+		public void Union523()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Access, ProviderName.Informix },
+				db => AreEqual(
+					(from p1 in    Parent select new Parent { ParentID = p1.ParentID }).Union(
+					(from p2 in    Parent select p2)),
+					(from p1 in db.Parent select new Parent { ParentID = p1.ParentID }).Union(
+					(from p2 in db.Parent select p2))));
+		}
+
+		[Test]
+		public void Union53()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Access, ProviderName.Informix },
+				db => AreEqual(
+					(from p1 in    Parent select new Parent { ParentID = p1.ParentID }).Union(
+					(from p2 in    Parent select new Parent { Value1   = p2.Value1   })),
+					(from p1 in db.Parent select new Parent { ParentID = p1.ParentID }).Union(
+					(from p2 in db.Parent select new Parent { Value1   = p2.Value1   }))));
+		}
+
+		//[Test]
+		public void Union54()
+		{
+			ForEachProvider(
+				//new[] { ProviderName.Access, ProviderName.Informix },
+				db => AreEqual(
+					(from p1 in    Parent select new { ParentID = p1.ParentID,    p = p1,           ch = (Child)null }).Union(
+					(from p2 in    Parent select new { ParentID = p2.Value1 ?? 0, p = (Parent)null, ch = p2.Children.First() })),
+					(from p1 in db.Parent select new { ParentID = p1.ParentID,    p = p1,           ch = (Child)null }).Union(
+					(from p2 in db.Parent select new { ParentID = p2.Value1 ?? 0, p = (Parent)null, ch = p2.Children.First() }))));
+		}
+
+		//[Test]
+		public void Union541()
+		{
+			ForEachProvider(
+				//new[] { ProviderName.Access, ProviderName.Informix },
+				db => AreEqual(
+					(from p1 in    Parent select new { ParentID = p1.ParentID,    p = p1,           ch = (Child)null }).Union(
+					(from p2 in    Parent select new { ParentID = p2.Value1 ?? 0, p = (Parent)null, ch = p2.Children.First() }))
+					.Select(p => new { p.ParentID, p.p, p.ch }),
+					(from p1 in db.Parent select new { ParentID = p1.ParentID,    p = p1,           ch = (Child)null }).Union(
+					(from p2 in db.Parent select new { ParentID = p2.Value1 ?? 0, p = (Parent)null, ch = p2.Children.First() }))
+					.Select(p => new { p.ParentID, p.p, p.ch })));
+		}
+
+		[TableName("Parent")]
+		public abstract class AbstractParent
+		{
+			public abstract int  ParentID { get; set; }
+			public abstract int? Value1   { get; set; }
+		}
+
+		[Test]
+		public void UnionAbstract1([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				var list = db.GetTable<AbstractParent>().Union(db.GetTable<AbstractParent>()).ToList();
+				Assert.AreEqual(Parent.Count(), list.Count);
+			}
+		}
+
+		[Test]
+		public void ObjectUnion1([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+				AreEqual(
+					(from p1 in    Parent where p1.ParentID >  3 select p1).Union(
+					(from p2 in    Parent where p2.ParentID <= 3 select p2)),
+					(from p1 in db.Parent where p1.ParentID >  3 select p1).Union(
+					(from p2 in db.Parent where p2.ParentID <= 3 select p2)));
+		}
+
+		//////[Test]
+		public void ObjectUnion2([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+				AreEqual(
+					(from p1 in    Parent where p1.ParentID >  3 select p1).Union(
+					(from p2 in    Parent where p2.ParentID <= 3 select (Parent)null)),
+					(from p1 in db.Parent where p1.ParentID >  3 select p1).Union(
+					(from p2 in db.Parent where p2.ParentID <= 3 select (Parent)null)));
+		}
+
+		[Test]
+		public void ObjectUnion3([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+				AreEqual(
+					(from p1 in    Parent where p1.ParentID >  3 select new { p = p1 }).Union(
+					(from p2 in    Parent where p2.ParentID <= 3 select new { p = p2 })),
+					(from p1 in db.Parent where p1.ParentID >  3 select new { p = p1 }).Union(
+					(from p2 in db.Parent where p2.ParentID <= 3 select new { p = p2 })));
+		}
+
+		//////[Test]
+		public void ObjectUnion4([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+				AreEqual(
+					(from p1 in    Parent where p1.ParentID >  3 select new { p = new { p = p1, p1.ParentID } }).Union(
+					(from p2 in    Parent where p2.ParentID <= 3 select new { p = new { p = p2, p2.ParentID } })),
+					(from p1 in db.Parent where p1.ParentID >  3 select new { p = new { p = p1, p1.ParentID } }).Union(
+					(from p2 in db.Parent where p2.ParentID <= 3 select new { p = new { p = p2, p2.ParentID } })));
+		}
+
+		//////[Test]
+		public void ObjectUnion5([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+				AreEqual(
+					(from p1 in    Parent where p1.ParentID >  3 select new { p = new { p = p1, ParentID = p1.ParentID + 1 } }).Union(
+					(from p2 in    Parent where p2.ParentID <= 3 select new { p = new { p = p2, ParentID = p2.ParentID + 1 } })),
+					(from p1 in db.Parent where p1.ParentID >  3 select new { p = new { p = p1, ParentID = p1.ParentID + 1 } }).Union(
+					(from p2 in db.Parent where p2.ParentID <= 3 select new { p = new { p = p2, ParentID = p2.ParentID + 1 } })));
+		}
+
+		[Test]
+		public void ObjectUnion()
+		{
+			using (var db = new NorthwindDB())
+			{
+				var q1 =
+					from p in db.Product
+					join c in db.Category on p.CategoryID equals c.CategoryID into g
+					from c in g.DefaultIfEmpty()
+					select new
+					{
+						p,
+						c.CategoryName,
+						p.ProductName
+					};
+
+				var q2 =
+					from p in db.Product
+					join c in db.Category on p.CategoryID equals c.CategoryID into g
+					from c in g.DefaultIfEmpty()
+					select new
+					{
+						p,
+						c.CategoryName,
+						p.ProductName
+					};
+
+				var q = q1.Union(q2).Take(5);
+
+				foreach (var item in q)
+				{
+					Console.WriteLine(item);
+				}
+			}
+		}
+
+		public class TestEntity1 { public int Id; public string Field1; }
+		public class TestEntity2 { public int Id; public string Field1; }
+
+		[Test]
+		public void Concat90()
+		{
+			using(var context = new TestDbManager())
+			{
+				var join1 =
+					from t1 in context.GetTable<TestEntity1>()
+					join t2 in context.GetTable<TestEntity2>()
+						on t1.Id equals t2.Id
+					into tmp
+					from t2 in tmp.DefaultIfEmpty()
+					select new { t1, t2 };
+
+				var join1Sql = join1.ToString();
+				Assert.IsNotNull(join1Sql);
+
+				var join2 =
+					from t2 in context.GetTable<TestEntity2>()
+					join t1 in context.GetTable<TestEntity1>()
+						on t2.Id equals t1.Id
+					into tmp
+					from t1 in tmp.DefaultIfEmpty()
+					where t1 == null
+					select new { t1, t2 };
+
+				var join2Sql = join2.ToString();
+				Assert.IsNotNull(join2Sql);
+
+				var fullJoin = join1.Concat(join2);
+
+				var fullJoinSql = fullJoin.ToString(); // BLToolkit.Data.Linq.LinqException : Types in Concat are constructed incompatibly.
+				Assert.IsNotNull(fullJoinSql);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/ConvertExpression.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,515 @@
+using System;
+using System.Linq;
+
+using BLToolkit.Data.DataProvider;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	[TestFixture]
+	public class ConvertExpression : TestBase
+	{
+		[Test]
+		public void Select1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				let children = p.Children.Where(c => c.ParentID > 1)
+				select children.Sum(c => c.ChildID),
+				from p in db.Parent
+				let children = p.Children.Where(c => c.ParentID > 1)
+				select children.Sum(c => c.ChildID)));
+		}
+
+		[Test]
+		public void Select2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				let children1 = p.Children.Where(c => c.ParentID > 1)
+				let children2 = children1.Where(c => c.ParentID < 10)
+				select children2.Sum(c => c.ChildID),
+				from p in db.Parent
+				let children1 = p.Children.Where(c => c.ParentID > 1)
+				let children2 = children1.Where(c => c.ParentID < 10)
+				select children2.Sum(c => c.ChildID)));
+		}
+
+		[Test]
+		public void Select3()
+		{
+			ForEachProvider(db => AreEqual(
+				Parent
+					.Select(p => new { children1 = p.Children. Where(c => c.ParentID > 1)  })
+					.Select(t => new { children2 = t.children1.Where(c => c.ParentID < 10) })
+					.Select(t => t.children2.Sum(c => c.ChildID)),
+				db.Parent
+					.Select(p => new { children1 = p.Children. Where(c => c.ParentID > 1)  })
+					.Select(t => new { children2 = t.children1.Where(c => c.ParentID < 10) })
+					.Select(t => t.children2.Sum(c => c.ChildID))));
+		}
+
+		[Test]
+		public void Select4()
+		{
+			ForEachProvider(db => AreEqual(
+				Parent
+					.Select(p => p.Children. Where(c => c.ParentID > 1))
+					.Select(t => t.Where(c => c.ParentID < 10))
+					.Select(t => t.Sum(c => c.ChildID)),
+				db.Parent
+					.Select(p => p.Children. Where(c => c.ParentID > 1))
+					.Select(t => t.Where(c => c.ParentID < 10))
+					.Select(t => t.Sum(c => c.ChildID))));
+		}
+
+		[Test]
+		public void Where1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				let children1 = p.Children.Where(c => c.ParentID > 1)
+				let children2 = children1.Where(c => c.ParentID < 10)
+				where children1.Any()
+				select children2.Sum(c => c.ChildID),
+				from p in db.Parent
+				let children1 = p.Children.Where(c => c.ParentID > 1)
+				let children2 = children1.Where(c => c.ParentID < 10)
+				where children1.Any()
+				select children2.Sum(c => c.ChildID)));
+		}
+
+		[Test]
+		public void Where2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				let children1 = p.Children.Where(c => c.ParentID > 1)
+				where children1.Any()
+				let children2 = children1.Where(c => c.ParentID < 10)
+				select children2.Sum(c => c.ChildID),
+				from p in db.Parent
+				let children1 = p.Children.Where(c => c.ParentID > 1)
+				where children1.Any()
+				let children2 = children1.Where(c => c.ParentID < 10)
+				select children2.Sum(c => c.ChildID)));
+		}
+
+		[Test]
+		public void Where3()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				let children1 = p.Children.Where(c => c.ParentID > 1)
+				let children2 = children1.Where(c => c.ParentID < 10)
+				where children2.Any()
+				select children2.Sum(c => c.ChildID),
+				from p in db.Parent
+				let children1 = p.Children.Where(c => c.ParentID > 1)
+				let children2 = children1.Where(c => c.ParentID < 10)
+				where children2.Any()
+				select children2.Sum(c => c.ChildID)));
+		}
+
+		//[Test]
+		public void Where4()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent
+					.Select(p => new { p, children1 = p.Children. Where(c => c.ParentID > 1)  })
+					.Where (t => t.children1.Any()),
+				db.Parent
+					.Select(p => new { p, children1 = p.Children. Where(c => c.ParentID > 1)  })
+					.Where (t => t.children1.Any())));
+		}
+
+		//[Test]
+		public void Where5()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent
+					.Select(p => new { children1 = p.Children. Where(c => c.ParentID > 1)  })
+					.Where (t => t.children1.Any()),
+				db.Parent
+					.Select(p => new { children1 = p.Children. Where(c => c.ParentID > 1)  })
+					.Where (t => t.children1.Any())));
+		}
+
+		//[Test]
+		public void Where6()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent
+					.Select(p => p.Children. Where(c => c.ParentID > 1))
+					.Where (t => t.Any()),
+				db.Parent
+					.Select(p => p.Children. Where(c => c.ParentID > 1))
+					.Where (t => t.Any())));
+		}
+
+		[Test]
+		public void Any1()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				   Parent
+					.Select(p => new { p, children1 = p.Children.Where(c => c.ParentID > 1) })
+					.Any(p => p.children1.Any()),
+				db.Parent
+					.Select(p => new { p, children1 = p.Children.Where(c => c.ParentID > 1) })
+					.Any(p => p.children1.Any())));
+		}
+
+		[Test]
+		public void Any2()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				   Parent
+					.Select(p => p.Children.Where(c => c.ParentID > 1))
+					.Any(p => p.Any()),
+				db.Parent
+					.Select(p => p.Children.Where(c => c.ParentID > 1))
+					.Any(p => p.Any())));
+		}
+
+		[Test]
+		public void Any3()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				   Parent
+					.Select(p => new { p, children1 = p.Children.Where(c => c.ParentID > 1) })
+					.Where(p => p.children1.Any())
+					.Any(),
+				db.Parent
+					.Select(p => new { p, children1 = p.Children.Where(c => c.ParentID > 1) })
+					.Where(p => p.children1.Any())
+					.Any()));
+		}
+
+		//[Test]
+		public void Any4()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				   Parent
+					.Select(p => new { children1 = p.Children.Where(c => c.ParentID > 1) })
+					.Where(p => p.children1.Any())
+					.Any(),
+				db.Parent
+					.Select(p => new { children1 = p.Children.Where(c => c.ParentID > 1) })
+					.Where(p => p.children1.Any())
+					.Any()));
+		}
+
+
+		[Test]
+		public void LetTest1([DataContexts(ProviderName.SqlCe, ProviderName.Informix, ProviderName.Sybase)] string context)
+		{
+			using (var db = GetDataContext(context))
+				AreEqual(
+					from p in Parent
+					let ch = p.Children
+					where ch.FirstOrDefault() != null
+					select ch.FirstOrDefault().ParentID
+					,
+					from p in db.Parent
+					let ch = p.Children
+					where ch.FirstOrDefault() != null
+					select ch.FirstOrDefault().ParentID);
+		}
+
+		[Test]
+		public void LetTest2()
+		{
+			ForEachProvider(
+				new[] { ProviderName.SqlCe, ProviderName.Informix, ProviderName.Sybase },
+				db => AreEqual(
+					from p in Parent
+					let ch = p.Children
+					where ch.FirstOrDefault() != null
+					select p
+					,
+					from p in db.Parent
+					let ch = p.Children
+					where ch.FirstOrDefault() != null
+					select p));
+		}
+
+		[Test]
+		public void LetTest3()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Informix, ProviderName.Sybase },
+				db => AreEqual(
+					from p in Parent
+					let ch = Child
+					select ch.FirstOrDefault().ParentID
+					,
+					from p in db.Parent
+					let ch = db.Child
+					select ch.FirstOrDefault().ParentID));
+		}
+
+		[Test]
+		public void LetTest4()
+		{
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true;
+
+			ForEachProvider(
+				new[] { ProviderName.Informix, ProviderName.Sybase },
+				db => AreEqual(
+					from p in Parent
+					let ch1 = Child.Where(c => c.ParentID == p.ParentID)
+					let ch2 = ch1.Where(c => c.ChildID > -100)
+					select new
+					{
+						Any    = ch2.Any(),
+						Count  = ch2.Count(),
+						First1 = ch2.FirstOrDefault(c => c.ParentID > 0),
+						First2 = ch2.FirstOrDefault()
+					}
+					,
+					from p in db.Parent
+					let ch1 = db.Child.Where(c => c.ParentID == p.ParentID)
+					let ch2 = ch1.Where(c => c.ChildID > -100)
+					select new
+					{
+						Any    = ch2.Any(),
+						Count  = ch2.Count(),
+						First1 = ch2.FirstOrDefault(c => c.ParentID > 0),
+						First2 = ch2.FirstOrDefault()
+					}));
+
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false;
+		}
+
+		[Test]
+		public void LetTest5()
+		{
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true;
+
+			ForEachProvider(
+				new[] { ProviderName.Informix, ProviderName.Sybase },
+				db => AreEqual(
+					from p in Parent
+					let ch1 = Child.Where(c => c.ParentID == p.ParentID)
+					let ch2 = ch1.Where(c => c.ChildID > -100)
+					select new
+					{
+						Any    = ch2.Any(),
+						Count  = ch2.Count(),
+						First1 = ch2.FirstOrDefault(c => c.ParentID > 0) == null ? 0 : ch2.FirstOrDefault(c => c.ParentID > 0).ParentID,
+						First2 = ch2.FirstOrDefault()
+					}
+					,
+					from p in db.Parent
+					let ch1 = db.Child.Where(c => c.ParentID == p.ParentID)
+					let ch2 = ch1.Where(c => c.ChildID > -100)
+					select new
+					{
+						Any    = ch2.Any(),
+						Count  = ch2.Count(),
+						First1 = ch2.FirstOrDefault(c => c.ParentID > 0).ParentID,
+						First2 = ch2.FirstOrDefault()
+					}));
+
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false;
+		}
+
+		[Test]
+		public void LetTest6()
+		{
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery     = true;
+			//BLToolkit.Common.Configuration.Linq.GenerateExpressionTest = true;
+
+			ForEachProvider(
+				new[] { ProviderName.Informix, ProviderName.Sybase },
+				db => AreEqual(
+					(
+						from p in Parent
+						let ch1 = Child.Where(c => c.ParentID == p.ParentID)
+						let ch2 = ch1.Where(c => c.ChildID > -100)
+						select new
+						{
+							p.ParentID,
+							Any    = ch2.Any(),
+							Count  = ch2.Count(),
+							First1 = ch2.FirstOrDefault(c => c.ParentID > 0) == null ? 0 : ch2.FirstOrDefault(c => c.ParentID > 0).ParentID,
+							First2 = ch2.FirstOrDefault()
+						}
+					).Where(t => t.ParentID > 0)
+					,
+					(
+						from p in db.Parent
+						let ch1 = db.Child.Where(c => c.ParentID == p.ParentID)
+						let ch2 = ch1.Where(c => c.ChildID > -100)
+						select new
+						{
+							p.ParentID,
+							Any    = ch2.Any(),
+							Count  = ch2.Count(),
+							First1 = ch2.FirstOrDefault(c => c.ParentID > 0).ParentID,
+							First2 = ch2.FirstOrDefault()
+						}
+					).Where(t => t.ParentID > 0)));
+
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false;
+		}
+
+		[Test]
+		public void LetTest7()
+		{
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true;
+
+			ForEachProvider(
+				new[] { ProviderName.Informix, ProviderName.Sybase },
+				db => AreEqual(
+					(
+						from p in Parent
+						let ch1 = Child.Where(c => c.ParentID == p.ParentID)
+						let ch2 = ch1.Where(c => c.ChildID > -100)
+						select new
+						{
+							p.ParentID,
+							Any    = ch2.Any(),
+							Count  = ch2.Count(),
+							First1 = ch2.FirstOrDefault(c => c.ParentID > 0) == null ? 0 : ch2.FirstOrDefault(c => c.ParentID > 0).ParentID,
+							First2 = ch2.FirstOrDefault()
+						}
+					).Where(t => t.ParentID > 0).Take(5000)
+					,
+					(
+						from p in db.Parent
+						let ch1 = db.Child.Where(c => c.ParentID == p.ParentID)
+						let ch2 = ch1.Where(c => c.ChildID > -100)
+						select new
+						{
+							p.ParentID,
+							Any    = ch2.Any(),
+							Count  = ch2.Count(),
+							First1 = ch2.FirstOrDefault(c => c.ParentID > 0).ParentID,
+							First2 = ch2.FirstOrDefault()
+						}
+					).Where(t => t.ParentID > 0).Take(5000)));
+
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false;
+		}
+
+		[Test]
+		public void LetTest8()
+		{
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true;
+
+			ForEachProvider(
+				db => AreEqual(
+					from p in Parent
+					let ch1 = Child.Where(c => c.ParentID == p.ParentID)
+					let ch2 = ch1.Where(c => c.ChildID > -100)
+					let ch3	= ch2.FirstOrDefault(c => c.ParentID > 0)
+					select new
+					{
+						First1 = ch3 == null ? 0 : ch3.ParentID,
+						Any    = ch2.Any(),
+						Count  = ch2.Count(),
+						First2 = ch2.FirstOrDefault()
+					}
+					,
+					from p in db.Parent
+					let ch1 = db.Child.Where(c => c.ParentID == p.ParentID)
+					let ch2 = ch1.Where(c => c.ChildID > -100)
+					let ch3	= ch2.FirstOrDefault(c => c.ParentID > 0)
+					select new
+					{
+						First1 = ch3 == null ? 0 : ch3.ParentID,
+						Any    = ch2.Any(),
+						Count  = ch2.Count(),
+						First2 = ch2.FirstOrDefault()
+					}));
+
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false;
+		}
+
+		[Test]
+		public void LetTest9()
+		{
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true;
+
+			ForEachProvider(
+				db => AreEqual(
+					(
+						from p in Parent
+						let ch1 = Child.Where(c => c.ParentID == p.ParentID)
+						select new
+						{
+							First = ch1.FirstOrDefault()
+						}
+					).Take(10)
+					,
+					(
+						from p in db.Parent
+						let ch1 = db.Child.Where(c => c.ParentID == p.ParentID)
+						select new
+						{
+							First = ch1.FirstOrDefault()
+						}
+					).Take(10)));
+
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false;
+		}
+
+		[Test]
+		public void LetTest10()
+		{
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true;
+
+			ForEachProvider(
+				db => Assert.AreEqual(
+					(
+						from p in Parent
+						let ch1 = Child.Where(c => c.ParentID == p.ParentID)
+						select new
+						{
+							First = ch1.FirstOrDefault()
+						}
+					).Any()
+					,
+					(
+						from p in db.Parent
+						let ch1 = db.Child.Where(c => c.ParentID == p.ParentID)
+						select new
+						{
+							First = ch1.FirstOrDefault()
+						}
+					).Any()));
+
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false;
+		}
+
+		[Test]
+		public void LetTest11([DataContexts] string context)
+		{
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true;
+
+			using (var db = GetDataContext(context))
+				AreEqual(
+					from p in Parent
+					let ch1 = Child.FirstOrDefault(c => c.ParentID > 0)
+					let ch2 = Child.Where(c => c.ChildID > -100)
+					select new
+					{
+						First1 = ch1 == null ? 0 : ch1.ParentID,
+						First2 = ch2.FirstOrDefault()
+					}
+					,
+					from p in db.Parent
+					let ch1 = db.Child.FirstOrDefault(c => c.ParentID > 0)
+					let ch2 = Child.Where(c => c.ChildID > -100)
+					select new
+					{
+						First1 = ch1 == null ? 0 : ch1.ParentID,
+						First2 = ch2.FirstOrDefault()
+					});
+
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/ConvertTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,532 @@
+using System;
+using System.Linq;
+
+using NUnit.Framework;
+
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+
+namespace Data.Linq
+{
+	[TestFixture]
+	public class ConvertTest : TestBase
+	{
+		[Test]
+		public void Test1()
+		{
+			ForEachProvider(new[] { ProviderName.SQLite },
+				db => Assert.AreEqual(1, (from t in db.Types where t.MoneyValue * t.ID == 1.11m  select t).Single().ID));
+		}
+
+		#region Int
+
+		[Test]
+		public void ToInt1()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select              Sql.ConvertTo<int>.From(t.MoneyValue),
+				from t in db.Types select Sql.AsSql(Sql.ConvertTo<int>.From(t.MoneyValue))));
+		}
+
+		[Test]
+		public void ToInt2()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select              Sql.Convert<int,decimal>(t.MoneyValue),
+				from t in db.Types select Sql.AsSql(Sql.Convert<int,decimal>(t.MoneyValue))));
+		}
+
+		[Test]
+		public void ToBigInt()
+		{
+			ForEachProvider(new[] { ProviderName.MySql }, db => AreEqual(
+				from t in    Types select Sql.Convert(Sql.BigInt, t.MoneyValue),
+				from t in db.Types select Sql.Convert(Sql.BigInt, t.MoneyValue)));
+		}
+
+		[Test]
+		public void ToInt64()
+		{
+			ForEachProvider(new[] { ProviderName.MySql }, db => AreEqual(
+				from p in from t in    Types select (Int64)t.MoneyValue where p > 0 select p,
+				from p in from t in db.Types select (Int64)t.MoneyValue where p > 0 select p));
+		}
+
+		[Test]
+		public void ConvertToInt64()
+		{
+			ForEachProvider(new[] { ProviderName.MySql }, db => AreEqual(
+				from p in from t in    Types select Convert.ToInt64(t.MoneyValue) where p > 0 select p,
+				from p in from t in db.Types select Convert.ToInt64(t.MoneyValue) where p > 0 select p));
+		}
+
+		[Test]
+		public void ToInt()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select Sql.Convert(Sql.Int, t.MoneyValue),
+				from t in db.Types select Sql.Convert(Sql.Int, t.MoneyValue)));
+		}
+
+		[Test]
+		public void ToInt32()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in from t in    Types select (Int32)t.MoneyValue where p > 0 select p,
+				from p in from t in db.Types select (Int32)t.MoneyValue where p > 0 select p));
+		}
+
+		[Test]
+		public void ConvertToInt32()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in from t in    Types select Convert.ToInt32(t.MoneyValue) where p > 0 select p,
+				from p in from t in db.Types select Convert.ToInt32(t.MoneyValue) where p > 0 select p));
+		}
+
+		[Test]
+		public void ToSmallInt()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select Sql.Convert(Sql.SmallInt, t.MoneyValue),
+				from t in db.Types select Sql.Convert(Sql.SmallInt, t.MoneyValue)));
+		}
+
+		[Test]
+		public void ToInt16()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in from t in    Types select (Int16)t.MoneyValue where p > 0 select p,
+				from p in from t in db.Types select (Int16)t.MoneyValue where p > 0 select p));
+		}
+
+		[Test]
+		public void ConvertToInt16()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in from t in    Types select Convert.ToInt16(t.MoneyValue) where p > 0 select p,
+				from p in from t in db.Types select Convert.ToInt16(t.MoneyValue) where p > 0 select p));
+		}
+
+		[Test]
+		public void ToTinyInt()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select Sql.Convert(Sql.TinyInt, t.MoneyValue),
+				from t in db.Types select Sql.Convert(Sql.TinyInt, t.MoneyValue)));
+		}
+
+		[Test]
+		public void ToSByte()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in from t in    Types select (sbyte)t.MoneyValue where p > 0 select p,
+				from p in from t in db.Types select (sbyte)t.MoneyValue where p > 0 select p));
+		}
+
+		[Test]
+		public void ConvertToSByte()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in from t in    Types select Convert.ToSByte(t.MoneyValue) where p > 0 select p,
+				from p in from t in db.Types select Convert.ToSByte(t.MoneyValue) where p > 0 select p));
+		}
+
+		#endregion
+
+		#region UInts
+
+		[Test]
+		public void ToUInt1()
+		{
+			ForEachProvider(new[] { ProviderName.MySql }, db => AreEqual(
+				from t in    Types select              Sql.ConvertTo<uint>.From(t.MoneyValue),
+				from t in db.Types select Sql.AsSql(Sql.ConvertTo<uint>.From(t.MoneyValue))));
+		}
+
+		[Test]
+		public void ToUInt2()
+		{
+			ForEachProvider(new[] { ProviderName.MySql }, db => AreEqual(
+				from t in    Types select              Sql.Convert<uint,decimal>(t.MoneyValue),
+				from t in db.Types select Sql.AsSql(Sql.Convert<uint,decimal>(t.MoneyValue))));
+		}
+
+		[Test]
+		public void ToUInt64()
+		{
+			ForEachProvider(new[] { ProviderName.MySql }, db => AreEqual(
+				from p in from t in    Types select (UInt64)t.MoneyValue where p > 0 select p,
+				from p in from t in db.Types select (UInt64)t.MoneyValue where p > 0 select p));
+		}
+
+		[Test]
+		public void ConvertToUInt64()
+		{
+			ForEachProvider(new[] { ProviderName.MySql }, db => AreEqual(
+				from p in from t in    Types select Convert.ToUInt64(t.MoneyValue) where p > 0 select p,
+				from p in from t in db.Types select Convert.ToUInt64(t.MoneyValue) where p > 0 select p));
+		}
+
+		[Test]
+		public void ToUInt32()
+		{
+			ForEachProvider(new[] { ProviderName.MySql }, db => AreEqual(
+				from p in from t in    Types select (UInt32)t.MoneyValue where p > 0 select p,
+				from p in from t in db.Types select (UInt32)t.MoneyValue where p > 0 select p));
+		}
+
+		[Test]
+		public void ConvertToUInt32()
+		{
+			ForEachProvider(new[] { ProviderName.MySql }, db => AreEqual(
+				from p in from t in    Types select Convert.ToUInt32(t.MoneyValue) where p > 0 select p,
+				from p in from t in db.Types select Convert.ToUInt32(t.MoneyValue) where p > 0 select p));
+		}
+
+		[Test]
+		public void ToUInt16()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in from t in    Types select (UInt16)t.MoneyValue where p > 0 select p,
+				from p in from t in db.Types select (UInt16)t.MoneyValue where p > 0 select p));
+		}
+
+		[Test]
+		public void ConvertToUInt16()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in from t in    Types select Convert.ToUInt16(t.MoneyValue) where p > 0 select p,
+				from p in from t in db.Types select Convert.ToUInt16(t.MoneyValue) where p > 0 select p));
+		}
+
+		[Test]
+		public void ToByte()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in from t in    Types select (byte)t.MoneyValue where p > 0 select p,
+				from p in from t in db.Types select (byte)t.MoneyValue where p > 0 select p));
+		}
+
+		[Test]
+		public void ConvertToByte([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+				AreEqual(
+					from p in from t in    Types select Convert.ToByte(t.MoneyValue) where p > 0 select p,
+					from p in from t in db.Types select Convert.ToByte(t.MoneyValue) where p > 0 select p);
+		}
+
+		#endregion
+
+		#region Floats
+
+		[Test]
+		public void ToDefaultDecimal()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select Sql.Convert(Sql.DefaultDecimal, t.MoneyValue * 1000),
+				from t in db.Types select Sql.Convert(Sql.DefaultDecimal, t.MoneyValue * 1000)));
+		}
+
+		[Test]
+		public void ToDecimal1()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select Sql.Convert(Sql.Decimal(10), t.MoneyValue * 1000),
+				from t in db.Types select Sql.Convert(Sql.Decimal(10), t.MoneyValue * 1000)));
+		}
+
+		[Test]
+		public void ToDecimal2()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select Sql.Convert(Sql.Decimal(10,4), t.MoneyValue),
+				from t in db.Types select Sql.Convert(Sql.Decimal(10,4), t.MoneyValue)));
+		}
+
+		[Test]
+		public void ToDecimal3()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in from t in    Types select (Decimal)t.MoneyValue where p > 0 select p,
+				from p in from t in db.Types select (Decimal)t.MoneyValue where p > 0 select p));
+		}
+
+		[Test]
+		public void ConvertToDecimal()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in from t in    Types select Convert.ToDecimal(t.MoneyValue) where p > 0 select p,
+				from p in from t in db.Types select Convert.ToDecimal(t.MoneyValue) where p > 0 select p));
+		}
+
+		[Test]
+		public void ToMoney()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select (int)Sql.Convert(Sql.Money, t.MoneyValue),
+				from t in db.Types select (int)Sql.Convert(Sql.Money, t.MoneyValue)));
+		}
+
+		[Test]
+		public void ToSmallMoney()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select (decimal)Sql.Convert(Sql.SmallMoney, t.MoneyValue),
+				from t in db.Types select (decimal)Sql.Convert(Sql.SmallMoney, t.MoneyValue)));
+		}
+
+		[Test]
+		public void ToSqlFloat()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select (int)Sql.Convert(Sql.Float, t.MoneyValue),
+				from t in db.Types select (int)Sql.Convert(Sql.Float, t.MoneyValue)));
+		}
+
+		[Test]
+		public void ToDouble()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in from t in    Types select (int)(Double)t.MoneyValue where p > 0 select p,
+				from p in from t in db.Types select (int)(Double)t.MoneyValue where p > 0 select p));
+		}
+
+		[Test]
+		public void ConvertToDouble()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in from t in    Types select Convert.ToDouble(t.MoneyValue) where p > 0 select (int)p,
+				from p in from t in db.Types select Convert.ToDouble(t.MoneyValue) where p > 0 select (int)p));
+		}
+
+		[Test]
+		public void ToSqlReal()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select (int)Sql.Convert(Sql.Real, t.MoneyValue),
+				from t in db.Types select (int)Sql.Convert(Sql.Real, t.MoneyValue)));
+		}
+
+		[Test]
+		public void ToSingle()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in from t in    Types select (Single)t.MoneyValue where p > 0 select p,
+				from p in from t in db.Types select (Single)t.MoneyValue where p > 0 select p));
+		}
+
+		[Test]
+		public void ConvertToSingle()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in from t in    Types select Convert.ToSingle(t.MoneyValue) where p > 0 select (int)p,
+				from p in from t in db.Types select Convert.ToSingle(t.MoneyValue) where p > 0 select (int)p));
+		}
+
+		#endregion
+
+		#region DateTime
+
+		[Test]
+		public void ToSqlDateTime()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select Sql.Convert(Sql.DateTime, t.DateTimeValue.Year + "-01-01 00:20:00"),
+				from t in db.Types select Sql.Convert(Sql.DateTime, t.DateTimeValue.Year + "-01-01 00:20:00")));
+		}
+
+		[Test]
+		public void ToSqlDateTime2()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select Sql.Convert(Sql.DateTime2, t.DateTimeValue.Year + "-01-01 00:20:00"),
+				from t in db.Types select Sql.Convert(Sql.DateTime2, t.DateTimeValue.Year + "-01-01 00:20:00")));
+		}
+
+		[Test]
+		public void ToSqlSmallDateTime()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select Sql.Convert(Sql.SmallDateTime, t.DateTimeValue.Year + "-01-01 00:20:00"),
+				from t in db.Types select Sql.Convert(Sql.SmallDateTime, t.DateTimeValue.Year + "-01-01 00:20:00")));
+		}
+
+		[Test]
+		public void ToSqlDate()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select Sql.Convert(Sql.Date, t.DateTimeValue.Year + "-01-01"),
+				from t in db.Types select Sql.Convert(Sql.Date, t.DateTimeValue.Year + "-01-01")));
+		}
+
+		[Test]
+		public void ToSqlTime([DataContexts(ProviderName.SQLite)] string context)
+		{
+			using (var db = GetDataContext(context))
+				AreEqual(
+					from t in    Types select Sql.Convert(Sql.Time, t.DateTimeValue.Hour + ":01:01"),
+					from t in db.Types select Sql.Convert(Sql.Time, t.DateTimeValue.Hour + ":01:01"));
+		}
+
+		DateTime ToDateTime(DateTimeOffset dto)
+		{
+			return new DateTime(dto.Year, dto.Month, dto.Day, dto.Hour, dto.Minute, dto.Second);
+		}
+
+		[Test]
+		public void ToSqlDateTimeOffset()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select ToDateTime(Sql.Convert(Sql.DateTimeOffset, t.DateTimeValue.Year + "-01-01 00:20:00")),
+				from t in db.Types select ToDateTime(Sql.Convert(Sql.DateTimeOffset, t.DateTimeValue.Year + "-01-01 00:20:00"))));
+		}
+
+		[Test]
+		public void ToDateTime()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in from t in    Types select DateTime.Parse(t.DateTimeValue.Year + "-01-01 00:00:00") where p.Day > 0 select p,
+				from p in from t in db.Types select DateTime.Parse(t.DateTimeValue.Year + "-01-01 00:00:00") where p.Day > 0 select p));
+		}
+
+		[Test]
+		public void ConvertToDateTime()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in from t in    Types select Convert.ToDateTime(t.DateTimeValue.Year + "-01-01 00:00:00") where p.Day > 0 select p,
+				from p in from t in db.Types select Convert.ToDateTime(t.DateTimeValue.Year + "-01-01 00:00:00") where p.Day > 0 select p));
+		}
+
+		#endregion
+
+		#region String
+
+		[Test]
+		public void ToChar()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select Sql.Convert(Sql.Char(20), t.MoneyValue).Trim(' ', '0', '.'),
+				from t in db.Types select Sql.Convert(Sql.Char(20), t.MoneyValue).Trim(' ', '0', '.')));
+		}
+
+		[Test]
+		public void ToDefaultChar()
+		{
+			ForEachProvider(new[] { "Oracle", "DevartOracle", ProviderName.Firebird, ProviderName.PostgreSQL }, db => AreEqual(
+				from t in    Types select Sql.Convert(Sql.DefaultChar, t.MoneyValue).Trim(' ', '0', '.'),
+				from t in db.Types select Sql.Convert(Sql.DefaultChar, t.MoneyValue).Trim(' ', '0', '.')));
+		}
+
+		[Test]
+		public void ToVarChar()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select Sql.Convert(Sql.VarChar(20), t.MoneyValue).Trim(' ', '0', '.'),
+				from t in db.Types select Sql.Convert(Sql.VarChar(20), t.MoneyValue).Trim(' ', '0', '.')));
+		}
+
+		[Test]
+		public void ToDefaultVarChar()
+		{
+			ForEachProvider(new[] { "Oracle", "DevartOracle", ProviderName.Firebird, ProviderName.PostgreSQL }, db => AreEqual(
+				from t in    Types select Sql.Convert(Sql.DefaultVarChar, t.MoneyValue).Trim(' ', '0', '.'),
+				from t in db.Types select Sql.Convert(Sql.DefaultVarChar, t.MoneyValue).Trim(' ', '0', '.')));
+		}
+
+		[Test]
+		public void ToNChar()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select Sql.Convert(Sql.NChar(20), t.MoneyValue).Trim(' ', '0', '.'),
+				from t in db.Types select Sql.Convert(Sql.NChar(20), t.MoneyValue).Trim(' ', '0', '.')));
+		}
+
+		[Test]
+		public void ToDefaultNChar()
+		{
+			ForEachProvider(new[] { "Oracle", "DevartOracle", ProviderName.Firebird, ProviderName.PostgreSQL }, db => AreEqual(
+				from t in    Types select Sql.Convert(Sql.DefaultNChar, t.MoneyValue).Trim(' ', '0', '.'),
+				from t in db.Types select Sql.Convert(Sql.DefaultNChar, t.MoneyValue).Trim(' ', '0', '.')));
+		}
+
+		[Test]
+		public void ToNVarChar()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select Sql.Convert(Sql.NVarChar(20), t.MoneyValue).Trim(' ', '0', '.'),
+				from t in db.Types select Sql.Convert(Sql.NVarChar(20), t.MoneyValue).Trim(' ', '0', '.')));
+		}
+
+		[Test]
+		public void ToDefaultNVarChar()
+		{
+			ForEachProvider(new[] { "Oracle", "DevartOracle", ProviderName.Firebird, ProviderName.PostgreSQL }, db => AreEqual(
+				from t in    Types select Sql.Convert(Sql.DefaultNVarChar, t.MoneyValue).Trim(' ', '0', '.'),
+				from t in db.Types select Sql.Convert(Sql.DefaultNVarChar, t.MoneyValue).Trim(' ', '0', '.')));
+		}
+
+		[Test]
+		public void DecimalToString()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in from t in    Types select Convert.ToString(t.MoneyValue) where p.Length > 0 select p.Replace(',', '.').TrimEnd('0', '.'),
+				from p in from t in db.Types select Convert.ToString(t.MoneyValue) where p.Length > 0 select p.Replace(',', '.').TrimEnd('0', '.')));
+		}
+
+		[Test]
+		public void ByteToString()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in from t in    Types select ((byte)t.ID).ToString() where p.Length > 0 select p,
+				from p in from t in db.Types select ((byte)t.ID).ToString() where p.Length > 0 select p));
+		}
+
+		[Test]
+		public void GuidToString()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types where Sql.ConvertTo<string>.From(t.GuidValue) == "febe3eca-cb5f-40b2-ad39-2979d312afca" select t.GuidValue,
+				from t in db.Types where Sql.ConvertTo<string>.From(t.GuidValue) == "febe3eca-cb5f-40b2-ad39-2979d312afca" select t.GuidValue));
+		}
+
+		#endregion
+
+		#region Boolean
+
+		[Test]
+		public void ToBit1()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from t in    Types where Sql.Convert(Sql.Bit, t.MoneyValue) select t select t,
+				from t in from t in db.Types where Sql.Convert(Sql.Bit, t.MoneyValue) select t select t));
+		}
+
+		[Test]
+		public void ToBit2()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from t in    Types where !Sql.Convert(Sql.Bit, t.MoneyValue - 4.5m) select t select t,
+				from t in from t in db.Types where !Sql.Convert(Sql.Bit, t.MoneyValue - 4.5m) select t select t));
+		}
+
+		[Test]
+		public void ConvertToBoolean1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in from t in    Types select Convert.ToBoolean(t.MoneyValue) where p == true select p,
+				from p in from t in db.Types select Convert.ToBoolean(t.MoneyValue) where p == true select p));
+		}
+
+		[Test]
+		public void ConvertToBoolean2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in from t in    Types select Convert.ToBoolean(t.MoneyValue - 4.5m) where !p select p,
+				from p in from t in db.Types select Convert.ToBoolean(t.MoneyValue - 4.5m) where !p select p));
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/CountTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,596 @@
+using System;
+using System.Linq;
+
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	[TestFixture]
+	public class CountTest : TestBase
+	{
+		[Test]
+		public void Count1()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				   Parent.Count(),
+				db.Parent.Count()));
+		}
+
+		[Test]
+		public void Count2()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				   Parent.Count(p => p.ParentID > 2),
+				db.Parent.Count(p => p.ParentID > 2)));
+		}
+
+		[Test]
+		public void Count3()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select p.Children.Count(),
+				from p in db.Parent select p.Children.Count()));
+		}
+
+		[Test]
+		public void Count4()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select    Child.Count(),
+				from p in db.Parent select db.Child.Count()));
+		}
+
+		[Test]
+		public void Count5()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				(from ch in    Child group ch by ch.ParentID).Count(),
+				(from ch in db.Child group ch by ch.ParentID).Count()));
+		}
+
+		[Test]
+		public void Count6()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				(from ch in    Child group ch by ch.ParentID).Count(g => g.Key > 2),
+				(from ch in db.Child group ch by ch.ParentID).Count(g => g.Key > 2)));
+		}
+
+		[Test]
+		public void Count7()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
+				from p in    Parent where p.Children.Count > 2 select p,
+				from p in db.Parent where p.Children.Count > 2 select p));
+		}
+
+		[Test]
+		public void SubQueryCount([IncludeDataContexts("Sql2008", "Sql2012")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				AreEqual(
+					from p in Parent
+					select Parent.Where(t => t.ParentID == p.ParentID).Count()
+					,
+					from p in db.Parent
+					//select Sql.AsSql(db.Parent.Count()));
+					select Sql.AsSql(db.GetParentByID(p.ParentID).Count()));
+			}
+		}
+
+		[Test]
+		public void GroupBy1()
+		{
+			var expected =
+				from ch in Child
+				group ch by ch.ParentID into g
+				select g.Count(ch => ch.ChildID > 20);
+
+			ForEachProvider(db => AreEqual(expected,
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				select g.Count(ch => ch.ChildID > 20)));
+		}
+
+		[Test]
+		public void GroupBy101()
+		{
+			var expected =
+				from ch in Child
+				group ch by ch.ParentID into g
+				select g.Count();
+
+			ForEachProvider(db => AreEqual(expected,
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				select g.Count()));
+		}
+
+		[Test]
+		public void GroupBy102()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
+				from ch in Child
+				group ch by ch.ParentID into g
+				select new
+				{
+					ID1 = g.Max  (ch => ch.ChildID),
+					ID2 = g.Count(ch => ch.ChildID > 20) + 1,
+					ID3 = g.Count(ch => ch.ChildID > 20),
+					ID4 = g.Count(ch => ch.ChildID > 10),
+				},
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				select new
+				{
+					ID1 = g.Max  (ch => ch.ChildID),
+					ID2 = g.Count(ch => ch.ChildID > 20) + 1,
+					ID3 = g.Count(ch => ch.ChildID > 20),
+					ID4 = g.Count(ch => ch.ChildID > 10),
+				}));
+		}
+
+		[Test]
+		public void GroupBy103()
+		{
+			var expected =
+				from ch in Child
+				group ch by new { Parent = ch.ParentID, ch.ChildID } into g
+				select g.Count(ch => ch.ChildID > 20);
+
+			ForEachProvider(db => AreEqual(expected,
+				from ch in db.Child
+				group ch by new { Parent = ch.ParentID, ch.ChildID } into g
+				select g.Count(ch => ch.ChildID > 20)));
+		}
+
+
+		[Test]
+		public void GroupBy21([DataContexts] string context)
+		{
+			var n = 1;
+
+			using (var db = GetDataContext(context))
+				AreEqual(
+					from ch in
+						from ch in Child select new { ParentID = ch.ParentID + 1, ch.ChildID }
+					where ch.ParentID + 1 > n
+					group ch by ch into g
+					select g.Count(p => p.ParentID < 3),
+					from ch in
+						from ch in db.Child select new { ParentID = ch.ParentID + 1, ch.ChildID }
+					where ch.ParentID + 1 > n
+					group ch by ch into g
+					select g.Count(p => p.ParentID < 3));
+		}
+
+		[Test]
+		public void GroupBy22()
+		{
+			var n = 1;
+
+			var expected =
+				from ch in
+					from ch in Child select new { ParentID = ch.ParentID + 1, ch.ChildID }
+				where ch.ParentID + 1 > n
+				group ch by new { ch.ParentID } into g
+				select g.Count(p => p.ParentID < 3);
+
+			ForEachProvider(db => AreEqual(expected,
+				from ch in
+					from ch in db.Child select new { ParentID = ch.ParentID + 1, ch.ChildID }
+				where ch.ParentID + 1 > n
+				group ch by new { ch.ParentID } into g
+				select g.Count(p => p.ParentID < 3)));
+		}
+
+		[Test]
+		public void GroupBy23()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe, "Oracle", "DevartOracle", "Sql2000", ProviderName.Sybase, ProviderName.Access }, db => AreEqual(
+				from p in
+					from p in Parent select new { ParentID = p.ParentID + 1, p.Value1 }
+				where p.ParentID + 1 > 1
+				group p by new { p.Value1 } into g
+				select g.Count(p => p.ParentID < 3),
+				from p in
+					from p in db.Parent select new { ParentID = p.ParentID + 1, p.Value1 }
+				where p.ParentID + 1 > 1
+				group p by new { p.Value1 } into g
+				select g.Count(p => p.ParentID < 3)));
+		}
+
+		[Test]
+		public void GroupBy3()
+		{
+			var expected =
+				from ch in
+					from ch in Child select new { ParentID = ch.ParentID + 1, ch.ChildID }
+				where ch.ParentID - 1 > 0
+				group ch by new { ch.ParentID } into g
+				select new
+				{
+					g.Key.ParentID,
+					ChildMin   = g.Min(p => p.ChildID),
+					ChildCount = g.Count(p => p.ChildID > 25)
+				};
+
+			ForEachProvider(db => AreEqual(expected,
+				from ch in
+					from ch in db.Child select new { ParentID = ch.ParentID + 1, ch.ChildID }
+				where ch.ParentID - 1 > 0
+				group ch by new { ch.ParentID } into g
+				select new
+				{
+					g.Key.ParentID,
+					ChildMin   = g.Min(p => p.ChildID),
+					ChildCount = g.Count(p => p.ChildID > 25)
+				}));
+		}
+
+		[Test]
+		public void GroupBy4()
+		{
+			var expected = Child.Count();
+
+			ForEachProvider(db =>
+			{
+				var result = db.Child.Count();
+				Assert.AreEqual(expected, result);
+			});
+		}
+
+		[Test]
+		public void GroupBy5()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
+				from ch in Child
+				group ch by ch.ParentID into g
+				select new
+				{
+					ID1 = g.Max  (ch => ch.ChildID),
+					ID2 = g.Count(ch => ch.ChildID > 20) + 1,
+					ID3 = g.Count(ch => ch.ChildID > 20),
+					ID4 = g.Count(ch => ch.ChildID > 10),
+				},
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				select new
+				{
+					ID1 = g.Max  (ch => ch.ChildID),
+					ID2 = g.Count(ch => ch.ChildID > 20) + 1,
+					ID3 = g.Count(ch => ch.ChildID > 20),
+					ID4 = g.Count(ch => ch.ChildID > 10),
+				}));
+		}
+
+		[Test]
+		public void GroupBy6()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				(from ch in    Child group ch by ch.ParentID).Count(),
+				(from ch in db.Child group ch by ch.ParentID).Count()));
+		}
+
+		[Test]
+		public void GroupBy7()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in Child
+				group ch by ch.ParentID into g
+				select new
+				{
+					ID1 = g.Count(),
+					ID2 = g.Max  (ch => ch.ChildID),
+				},
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				select new
+				{
+					ID1 = g.Count(),
+					ID2 = g.Max  (ch => ch.ChildID),
+				}));
+		}
+
+		[Test]
+		public void GroupByWhere()
+		{
+			var expected = Child.Count(ch => ch.ChildID > 20);
+			Assert.AreNotEqual(0, expected);
+
+			ForEachProvider(db =>
+			{
+				var result = db.Child.Count(ch => ch.ChildID > 20);
+				Assert.AreEqual(expected, result);
+			});
+		}
+
+		[Test]
+		public void GroupByWhere1()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in Child
+				group ch by ch.ParentID into g
+				where g.Key > 2
+				select g.Key,
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				where g.Key > 2
+				select g.Key));
+		}
+
+		[Test]
+		public void GroupByWhere2()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in Child
+				group ch by ch.ParentID into g
+				where g.Count() > 2
+				select g.Key,
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				where g.Count() > 2
+				select g.Key));
+		}
+
+		[Test]
+		public void GroupByWhere201()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
+				from ch in Child
+				group ch by ch.ParentID into g
+				where g.Count(ch => ch.ChildID > 20) > 2
+				select g.Key,
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				where g.Count(ch => ch.ChildID > 20) > 2
+				select g.Key));
+		}
+
+		[Test]
+		public void GroupByWhere202()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
+				from ch in Child
+				group ch by ch.ParentID into g
+				where g.Count(ch => ch.ChildID > 20) > 2 || g.Count(ch => ch.ChildID == 20) > 2
+				select g.Key,
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				where g.Count(ch => ch.ChildID > 20) > 2 || g.Count(ch => ch.ChildID == 20) > 2
+				select g.Key));
+		}
+
+		[Test]
+		public void GroupByWhere203()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
+				from ch in Child
+				group ch by ch.ParentID into g
+				where g.Count(ch => ch.ChildID > 20) > 2 || g.Key > 2
+				select g.Key,
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				where g.Count(ch => ch.ChildID > 20) > 2 || g.Key > 2
+				select g.Key));
+		}
+
+		[Test]
+		public void GroupByWhere3()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in Child
+				group ch by ch.ParentID into g
+				where g.Count() > 2 && g.Key < 5
+				select g.Key,
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				where g.Count() > 2 && g.Key < 5
+				select g.Key));
+		}
+
+		[Test]
+		public void GroupByWhere301()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in Child
+				group ch by ch.ParentID into g
+				where g.Count() > 3 || g.Key == 1
+				select g.Key,
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				where g.Count() > 3 || g.Key == 1
+				select g.Key));
+		}
+
+		[Test]
+		public void GroupByWhere4()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in GrandChild1
+				group ch by ch.Parent into g
+				where g.Count() > 2
+				select g.Key.ParentID
+				,
+				from ch in db.GrandChild1
+				group ch by ch.Parent into g
+				where g.Count() > 2
+				select g.Key.ParentID));
+		}
+
+		[Test]
+		public void SubQuery1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				where p.ParentID != 5
+				select new { p.ParentID, Count = p.Children.Where(c => c.ParentID == p.ParentID && c.ChildID != 0m).Count() },
+				from p in db.Parent
+				where p.ParentID != 5
+				select new { p.ParentID, Count = p.Children.Where(c => c.ParentID == p.ParentID && c.ChildID != 0m).Count() }));
+		}
+
+		[Test]
+		public void SubQuery2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				where p.ParentID != 5
+				select new { Count = p.Value1 == null ? p.Children.Count : p.Children.Count(c => c.ParentID == p.ParentID) },
+				from p in db.Parent
+				where p.ParentID != 5
+				select new { Count = p.Value1 == null ? p.Children.Count : p.Children.Count(c => c.ParentID == p.ParentID) }));
+		}
+
+		[Test]
+		public void SubQuery3()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				where p.ParentID != 5
+				select new { Count = p.Value1 == null ? p.Children.Count() : p.Children.Count(c => c.ParentID == p.ParentID) },
+				from p in db.Parent
+				where p.ParentID != 5
+				select new { Count = p.Value1 == null ? p.Children.Count() : p.Children.Count(c => c.ParentID == p.ParentID) }));
+		}
+
+		[Test]
+		public void SubQuery4()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select new { Count =    Parent.Count(p1 => p1.ParentID == p.ParentID) },
+				from p in db.Parent select new { Count = db.Parent.Count(p1 => p1.ParentID == p.ParentID) }));
+		}
+
+		[Test]
+		public void SubQuery5()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select new { Count =    Parent.Where(p1 => p1.ParentID == p.ParentID).Count() },
+				from p in db.Parent select new { Count = db.Parent.Where(p1 => p1.ParentID == p.ParentID).Count() }));
+		}
+
+		[Test]
+		public void SubQuery6()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe, ProviderName.SQLite, ProviderName.Sybase }, db => AreEqual(
+				   Parent.Take(5).OrderByDescending(p => p.ParentID).Select(p => p.Children.Count()),
+				db.Parent.Take(5).OrderByDescending(p => p.ParentID).Select(p => p.Children.Count())));
+		}
+
+		[Test]
+		public void SubQuery7()
+		{
+			ForEachProvider(
+				new[] { ProviderName.SqlCe, "Oracle", ProviderName.Sybase, ProviderName.Access }, ///// Fix It
+				db => AreEqual(
+					from p in    Parent select    Child.Count(c => c.Parent == p),
+					from p in db.Parent select db.Child.Count(c => c.Parent == p)));
+		}
+
+		[Test]
+		public void SubQueryMax1()
+		{
+			ForEachProvider(
+				db => Assert.AreEqual(
+					   Parent.Max(p =>    Child.Count(c => c.Parent.ParentID == p.ParentID)),
+					db.Parent.Max(p => db.Child.Count(c => c.Parent.ParentID == p.ParentID))));
+		}
+
+		[Test]
+		public void SubQueryMax2()
+		{
+			ForEachProvider(
+				db => Assert.AreEqual(
+					   Parent.Max(p => p.Children.Count()),
+					db.Parent.Max(p => p.Children.Count())));
+		}
+
+		[Test]
+		public void GroupJoin1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				join c in Child on p.ParentID equals c.ParentID into gc
+				join g in GrandChild on p.ParentID equals g.ParentID into gg
+				select new
+				{
+					Count1 = gc.Count(),
+					Count2 = gg.Count()
+				},
+				from p in db.Parent
+				join c in db.Child on p.ParentID equals c.ParentID into gc
+				join g in db.GrandChild on p.ParentID equals g.ParentID into gg
+				select new
+				{
+					Count1 = gc.Count(),
+					Count2 = gg.Count()
+				}));
+		}
+
+		[Test]
+		public void GroupJoin2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				join c in Child on p.ParentID equals c.ParentID into gc
+				join g in GrandChild on p.ParentID equals g.ParentID into gg
+				let gc1 = gc
+				let gg1 = gg
+				select new
+				{
+					Count1 = gc1.Count(),
+					Count2 = gg1.Count()
+				} ,
+				from p in db.Parent
+				join c in db.Child on p.ParentID equals c.ParentID into gc
+				join g in db.GrandChild on p.ParentID equals g.ParentID into gg
+				let gc1 = gc
+				let gg1 = gg
+				select new
+				{
+					Count1 = gc.Count(),
+					Count2 = gg.Count()
+				}));
+		}
+
+		[Test]
+		public void GroupJoin3()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				join c in Child on p.ParentID equals c.ParentID into gc
+				select new
+				{
+					Count1 = gc.Count(),
+				},
+				from p in db.Parent
+				join c in db.Child on p.ParentID equals c.ParentID into gc
+				select new
+				{
+					Count1 = gc.Count(),
+				}));
+		}
+
+		[Test]
+		public void GroupJoin4()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				join c in Child on p.ParentID equals c.ParentID into gc
+				select new
+				{
+					Count1 = gc.Count() + gc.Count(),
+				},
+				from p in db.Parent
+				join c in db.Child on p.ParentID equals c.ParentID into gc
+				select new
+				{
+					Count1 = gc.Count() + gc.Count(),
+				}));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/CreateData.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,159 @@
+using System;
+using System.IO;
+
+using NUnit.Framework;
+
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+
+using Data.Linq;
+using Data.Linq.Model;
+
+namespace Create
+{
+	[TestFixture]
+	public class CreateData : TestBase
+	{
+		static void RunScript(string configString, string divider, string name)
+		{
+			Console.WriteLine("=== " + name + " === \n");
+
+			var text = File.ReadAllText(@"..\..\..\..\Data\Create Scripts\" + name + ".sql");
+
+			while (true)
+			{
+				var idx = text.IndexOf("SKIP " + configString + " BEGIN");
+
+				if (idx >= 0)
+					text = text.Substring(0, idx) + text.Substring(text.IndexOf("SKIP " + configString + " END", idx));
+				else
+					break;
+			}
+
+			var cmds = text.Replace("\r", "").Replace(divider, "\x1").Split('\x1');
+
+			Exception exception = null;
+
+			using (var db = new TestDbManager(configString))
+			{
+				foreach (var cmd in cmds)
+				{
+					var command = cmd.Trim();
+
+					if (command.Length == 0)
+						continue;
+
+					try 
+					{
+						Console.WriteLine(command);
+						db.SetCommand(command).ExecuteNonQuery();
+						Console.WriteLine("\nOK\n");
+					}
+					catch (Exception ex)
+					{
+						Console.WriteLine(ex.Message);
+						Console.WriteLine("\nFAILED\n");
+
+						if (exception == null)
+							exception = ex;
+					}
+				}
+
+				if (exception != null)
+					throw exception;
+
+				db.InsertBatch(new[]
+				{
+					new LinqDataTypes { ID =  1, MoneyValue =  1.11m, DateTimeValue = new DateTime(2001,  1,  11,  1, 11, 21, 100), BoolValue = true,  GuidValue = new Guid("ef129165-6ffe-4df9-bb6b-bb16e413c883"), SmallIntValue =  1 },
+					new LinqDataTypes { ID =  2, MoneyValue =  2.49m, DateTimeValue = new DateTime(2005,  5,  15,  5, 15, 25, 500), BoolValue = false, GuidValue = new Guid("bc663a61-7b40-4681-ac38-f9aaf55b706b"), SmallIntValue =  2 },
+					new LinqDataTypes { ID =  3, MoneyValue =  3.99m, DateTimeValue = new DateTime(2009,  9,  19,  9, 19, 29,  90), BoolValue = true,  GuidValue = new Guid("d2f970c0-35ac-4987-9cd5-5badb1757436"), SmallIntValue =  3 },
+					new LinqDataTypes { ID =  4, MoneyValue =  4.50m, DateTimeValue = new DateTime(2009,  9,  20,  9, 19, 29,  90), BoolValue = false, GuidValue = new Guid("40932fdb-1543-4e4a-ac2c-ca371604fb4b"), SmallIntValue =  4 },
+					new LinqDataTypes { ID =  5, MoneyValue =  5.50m, DateTimeValue = new DateTime(2009,  9,  21,  9, 19, 29,  90), BoolValue = true,  GuidValue = new Guid("febe3eca-cb5f-40b2-ad39-2979d312afca"), SmallIntValue =  5 },
+					new LinqDataTypes { ID =  6, MoneyValue =  6.55m, DateTimeValue = new DateTime(2009,  9,  22,  9, 19, 29,  90), BoolValue = false, GuidValue = new Guid("8d3c5d1d-47db-4730-9fe7-968f6228a4c0"), SmallIntValue =  6 },
+					new LinqDataTypes { ID =  7, MoneyValue =  7.00m, DateTimeValue = new DateTime(2009,  9,  23,  9, 19, 29,  90), BoolValue = true,  GuidValue = new Guid("48094115-83af-46dd-a906-bff26ee21ee2"), SmallIntValue =  7 },
+					new LinqDataTypes { ID =  8, MoneyValue =  8.99m, DateTimeValue = new DateTime(2009,  9,  24,  9, 19, 29,  90), BoolValue = false, GuidValue = new Guid("c1139f1f-1335-4cd4-937e-92602f732dd3"), SmallIntValue =  8 },
+					new LinqDataTypes { ID =  9, MoneyValue =  9.63m, DateTimeValue = new DateTime(2009,  9,  25,  9, 19, 29,  90), BoolValue = true,  GuidValue = new Guid("46c5c512-3d4b-4cf7-b4e7-1de080789e5d"), SmallIntValue =  9 },
+					new LinqDataTypes { ID = 10, MoneyValue = 10.77m, DateTimeValue = new DateTime(2009,  9,  26,  9, 19, 29,  90), BoolValue = false, GuidValue = new Guid("61b2bc55-147f-4b40-93ed-a4aa83602fee"), SmallIntValue = 10 },
+					new LinqDataTypes { ID = 11, MoneyValue = 11.45m, DateTimeValue = new DateTime(2009,  9,  27,  9, 19, 29,  90), BoolValue = true,  GuidValue = new Guid("d3021d18-97f0-4dc0-98d0-f0c7df4a1230"), SmallIntValue = 11 },
+					new LinqDataTypes { ID = 12, MoneyValue = 11.45m, DateTimeValue = new DateTime(2012, 11,   7, 19, 19, 29,  90), BoolValue = true,  GuidValue = new Guid("03021d18-97f0-4dc0-98d0-f0c7df4a1230"), SmallIntValue = 12 },
+				});
+
+				db.InsertBatch(new[]
+				{
+					new Parent { ParentID = 1, Value1 = 1    },
+					new Parent { ParentID = 2, Value1 = null },
+					new Parent { ParentID = 3, Value1 = 3    },
+					new Parent { ParentID = 4, Value1 = null },
+					new Parent { ParentID = 5, Value1 = 5    },
+					new Parent { ParentID = 6, Value1 = 6    },
+					new Parent { ParentID = 7, Value1 = 1    },
+				});
+
+				db.InsertBatch(new[]
+				{
+					new Child { ParentID = 1, ChildID = 11 },
+					new Child { ParentID = 2, ChildID = 21 },
+					new Child { ParentID = 2, ChildID = 22 },
+					new Child { ParentID = 3, ChildID = 31 },
+					new Child { ParentID = 3, ChildID = 32 },
+					new Child { ParentID = 3, ChildID = 33 },
+					new Child { ParentID = 4, ChildID = 41 },
+					new Child { ParentID = 4, ChildID = 42 },
+					new Child { ParentID = 4, ChildID = 43 },
+					new Child { ParentID = 4, ChildID = 44 },
+					new Child { ParentID = 6, ChildID = 61 },
+					new Child { ParentID = 6, ChildID = 62 },
+					new Child { ParentID = 6, ChildID = 63 },
+					new Child { ParentID = 6, ChildID = 64 },
+					new Child { ParentID = 6, ChildID = 65 },
+					new Child { ParentID = 6, ChildID = 66 },
+					new Child { ParentID = 7, ChildID = 77 },
+				});
+
+				db.InsertBatch(new[]
+				{
+					new GrandChild { ParentID = 1, ChildID = 11, GrandChildID = 111 },
+					new GrandChild { ParentID = 2, ChildID = 21, GrandChildID = 211 },
+					new GrandChild { ParentID = 2, ChildID = 21, GrandChildID = 212 },
+					new GrandChild { ParentID = 2, ChildID = 22, GrandChildID = 221 },
+					new GrandChild { ParentID = 2, ChildID = 22, GrandChildID = 222 },
+					new GrandChild { ParentID = 3, ChildID = 31, GrandChildID = 311 },
+					new GrandChild { ParentID = 3, ChildID = 31, GrandChildID = 312 },
+					new GrandChild { ParentID = 3, ChildID = 31, GrandChildID = 313 },
+					new GrandChild { ParentID = 3, ChildID = 32, GrandChildID = 321 },
+					new GrandChild { ParentID = 3, ChildID = 32, GrandChildID = 322 },
+					new GrandChild { ParentID = 3, ChildID = 32, GrandChildID = 323 },
+					new GrandChild { ParentID = 3, ChildID = 33, GrandChildID = 331 },
+					new GrandChild { ParentID = 3, ChildID = 33, GrandChildID = 332 },
+					new GrandChild { ParentID = 3, ChildID = 33, GrandChildID = 333 },
+					new GrandChild { ParentID = 4, ChildID = 41, GrandChildID = 411 },
+					new GrandChild { ParentID = 4, ChildID = 41, GrandChildID = 412 },
+					new GrandChild { ParentID = 4, ChildID = 41, GrandChildID = 413 },
+					new GrandChild { ParentID = 4, ChildID = 41, GrandChildID = 414 },
+					new GrandChild { ParentID = 4, ChildID = 42, GrandChildID = 421 },
+					new GrandChild { ParentID = 4, ChildID = 42, GrandChildID = 422 },
+					new GrandChild { ParentID = 4, ChildID = 42, GrandChildID = 423 },
+					new GrandChild { ParentID = 4, ChildID = 42, GrandChildID = 424 },
+				});
+			}
+		}
+
+		[Test] public void DB2       ([IncludeDataContexts(ProviderName.DB2       )] string context) { RunScript(context,           "\nGO\n",  "DB2");        }
+		[Test] public void Informix  ([IncludeDataContexts(ProviderName.Informix  )] string context) { RunScript(context,           "\nGO\n",  "Informix");   }
+		[Test] public void Oracle    ([IncludeDataContexts("Oracle"               )] string context) { RunScript(context,           "\n/\n",   "Oracle");     }
+		[Test] public void Firebird  ([IncludeDataContexts(ProviderName.Firebird  )] string context) { RunScript(context,           "COMMIT;", "Firebird2");  }
+		[Test] public void PostgreSQL([IncludeDataContexts(ProviderName.PostgreSQL)] string context) { RunScript(context,           "\nGO\n",  "PostgreSQL"); }
+		[Test] public void MySql     ([IncludeDataContexts(ProviderName.MySql     )] string context) { RunScript(context,           "\nGO\n",  "MySql");      }
+		[Test] public void Sql2000   ([IncludeDataContexts("Sql2000"              )] string context) { RunScript(context,           "\nGO\n",  "MsSql2000");  }
+		[Test] public void Sql2005   ([IncludeDataContexts("Sql2005"              )] string context) { RunScript(context,           "\nGO\n",  "MsSql");      }
+		[Test] public void Sql2008   ([IncludeDataContexts("Sql2008"              )] string context) { RunScript(context,           "\nGO\n",  "MsSql");      }
+		[Test] public void Sql2012   ([IncludeDataContexts("Sql2012"              )] string context) { RunScript(context,           "\nGO\n",  "MsSql");      }
+		[Test] public void SqlCe     ([IncludeDataContexts(ProviderName.SqlCe     )] string context) { RunScript(context,           "\nGO\n",  "SqlCe");      }
+		[Test] public void SqlCeData ([IncludeDataContexts(ProviderName.SqlCe     )] string context) { RunScript(context + ".Data", "\nGO\n",  "SqlCe");      }
+		[Test] public void SQLite    ([IncludeDataContexts(ProviderName.SQLite    )] string context) { RunScript(context,           "\nGO\n",  "SQLite");     }
+		[Test] public void SQLiteData([IncludeDataContexts(ProviderName.SQLite    )] string context) { RunScript(context + ".Data", "\nGO\n",  "SQLite");     }
+		[Test] public void Access    ([IncludeDataContexts(ProviderName.Access    )] string context) { RunScript(context,           "\nGO\n",  "Access");     }
+		[Test] public void AccessData([IncludeDataContexts(ProviderName.Access    )] string context) { RunScript(context + ".Data", "\nGO\n",  "Access");     }
+		[Test] public void Sybase    ([IncludeDataContexts(ProviderName.Sybase    )] string context) { RunScript(context,           "\nGO\n",  "Sybase");     }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/DataContextTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,58 @@
+using System;
+using System.Linq;
+
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class DataContextTest
+	{
+		[Test]
+		public void TestContext()
+		{
+			var ctx = new DataContext(ProviderName.Access);
+
+			ctx.GetTable<Person>().ToList();
+
+			ctx.KeepConnectionAlive = true;
+
+			ctx.GetTable<Person>().ToList();
+			ctx.GetTable<Person>().ToList();
+
+			ctx.KeepConnectionAlive = false;
+
+			using (var tran = new DataContextTransaction(ctx))
+			{
+				ctx.GetTable<Person>().ToList();
+
+				tran.BeginTransaction();
+
+				ctx.GetTable<Person>().ToList();
+				ctx.GetTable<Person>().ToList();
+
+				tran.CommitTransaction();
+			}
+		}
+
+		[Test]
+		public void TestContextToString()
+		{
+			using (var ctx = new DataContext(ProviderName.Access))
+			{
+				Console.WriteLine(ctx.GetTable<Person>().ToString());
+
+				var q =
+					from s in ctx.GetTable<Person>()
+					select s.FirstName;
+
+				Console.WriteLine(q.ToString());
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/DataServiceTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,22 @@
+using System;
+using System.Data.Services.Providers;
+
+using BLToolkit.ServiceModel;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class DataServiceTest
+	{
+		[Test]
+		public void Test1()
+		{
+			var ds = new DataService<NorthwindDB>();
+			var mp = ds.GetService(typeof(IDataServiceMetadataProvider));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/DateTimeFunctions.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,601 @@
+using System;
+using System.Linq;
+
+using NUnit.Framework;
+
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+
+namespace Data.Linq
+{
+	[TestFixture]
+	public class DateTimeFunctions : TestBase
+	{
+		[Test]
+		public void GetDate()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where p.ID == 1 select new { Now = Sql.AsSql(Sql.GetDate()) };
+				Assert.AreEqual(DateTime.Now.Year, q.ToList().First().Now.Year);
+			});
+		}
+
+		[Test]
+		public void CurrentTimestamp()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where p.ID == 1 select new { Now = Sql.CurrentTimestamp };
+				Assert.AreEqual(DateTime.Now.Year, q.ToList().First().Now.Year);
+			});
+		}
+
+		[Test]
+		public void Now()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where p.ID == 1 select new { DateTime.Now };
+				Assert.AreEqual(DateTime.Now.Year, q.ToList().First().Now.Year);
+			});
+		}
+
+		[Test]
+		public void Parse1()
+		{
+			ForEachProvider(db => AreEqual(
+				from d in from t in    Types select DateTime.Parse(Sql.ConvertTo<string>.From(t.DateTimeValue)) where d.Day > 0 select d.Date,
+				from d in from t in db.Types select DateTime.Parse(Sql.ConvertTo<string>.From(t.DateTimeValue)) where d.Day > 0 select d.Date));
+		}
+
+		[Test]
+		public void Parse2()
+		{
+			ForEachProvider(db => AreEqual(
+				from d in from t in    Types select           DateTime.Parse(t.DateTimeValue.Year + "-02-24 00:00:00")  where d.Day > 0 select d,
+				from d in from t in db.Types select Sql.AsSql(DateTime.Parse(t.DateTimeValue.Year + "-02-24 00:00:00")) where d.Day > 0 select d));
+		}
+
+		#region DatePart
+
+		[Test]
+		public void DatePartYear()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           Sql.DatePart(Sql.DateParts.Year, t.DateTimeValue),
+				from t in db.Types select Sql.AsSql(Sql.DatePart(Sql.DateParts.Year, t.DateTimeValue))));
+		}
+
+		[Test]
+		public void DatePartQuarter()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           Sql.DatePart(Sql.DateParts.Quarter, t.DateTimeValue),
+				from t in db.Types select Sql.AsSql(Sql.DatePart(Sql.DateParts.Quarter, t.DateTimeValue))));
+		}
+
+		[Test]
+		public void DatePartMonth()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           Sql.DatePart(Sql.DateParts.Month, t.DateTimeValue),
+				from t in db.Types select Sql.AsSql(Sql.DatePart(Sql.DateParts.Month, t.DateTimeValue))));
+		}
+
+		[Test]
+		public void DatePartDayOfYear()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           Sql.DatePart(Sql.DateParts.DayOfYear, t.DateTimeValue),
+				from t in db.Types select Sql.AsSql(Sql.DatePart(Sql.DateParts.DayOfYear, t.DateTimeValue))));
+		}
+
+		[Test]
+		public void DatePartDay()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           Sql.DatePart(Sql.DateParts.Day, t.DateTimeValue),
+				from t in db.Types select Sql.AsSql(Sql.DatePart(Sql.DateParts.Day, t.DateTimeValue))));
+		}
+
+		[Test]
+		public void DatePartWeek()
+		{
+			ForEachProvider(db => 
+				(from t in db.Types select Sql.AsSql(Sql.DatePart(Sql.DateParts.Week, t.DateTimeValue))).ToList());
+		}
+
+		[Test]
+		public void DatePartWeekDay()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           Sql.DatePart(Sql.DateParts.WeekDay, t.DateTimeValue),
+				from t in db.Types select Sql.AsSql(Sql.DatePart(Sql.DateParts.WeekDay, t.DateTimeValue))));
+		}
+
+		[Test]
+		public void DatePartHour()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           Sql.DatePart(Sql.DateParts.Hour, t.DateTimeValue),
+				from t in db.Types select Sql.AsSql(Sql.DatePart(Sql.DateParts.Hour, t.DateTimeValue))));
+		}
+
+		[Test]
+		public void DatePartMinute()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           Sql.DatePart(Sql.DateParts.Minute, t.DateTimeValue),
+				from t in db.Types select Sql.AsSql(Sql.DatePart(Sql.DateParts.Minute, t.DateTimeValue))));
+		}
+
+		[Test]
+		public void DatePartSecond()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           Sql.DatePart(Sql.DateParts.Second, t.DateTimeValue),
+				from t in db.Types select Sql.AsSql(Sql.DatePart(Sql.DateParts.Second, t.DateTimeValue))));
+		}
+
+		[Test]
+		public void DatePartMillisecond()
+		{
+			ForEachProvider(new[] { ProviderName.Informix, ProviderName.MySql, ProviderName.Access }, db => AreEqual(
+				from t in    Types select           Sql.DatePart(Sql.DateParts.Millisecond, t.DateTimeValue),
+				from t in db.Types select Sql.AsSql(Sql.DatePart(Sql.DateParts.Millisecond, t.DateTimeValue))));
+		}
+
+		[Test]
+		public void Year()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           t.DateTimeValue.Year,
+				from t in db.Types select Sql.AsSql(t.DateTimeValue.Year)));
+		}
+
+		[Test]
+		public void Month()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           t.DateTimeValue.Month,
+				from t in db.Types select Sql.AsSql(t.DateTimeValue.Month)));
+		}
+
+		[Test]
+		public void DayOfYear()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           t.DateTimeValue.DayOfYear,
+				from t in db.Types select Sql.AsSql(t.DateTimeValue.DayOfYear)));
+		}
+
+		[Test]
+		public void Day()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           t.DateTimeValue.Day,
+				from t in db.Types select Sql.AsSql(t.DateTimeValue.Day)));
+		}
+
+		[Test]
+		public void DayOfWeek()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           t.DateTimeValue.DayOfWeek,
+				from t in db.Types select Sql.AsSql(t.DateTimeValue.DayOfWeek)));
+		}
+
+		[Test]
+		public void Hour()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           t.DateTimeValue.Hour,
+				from t in db.Types select Sql.AsSql(t.DateTimeValue.Hour)));
+		}
+
+		[Test]
+		public void Minute()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           t.DateTimeValue.Minute,
+				from t in db.Types select Sql.AsSql(t.DateTimeValue.Minute)));
+		}
+
+		[Test]
+		public void Second()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           t.DateTimeValue.Second,
+				from t in db.Types select Sql.AsSql(t.DateTimeValue.Second)));
+		}
+
+		[Test]
+		public void Millisecond()
+		{
+			ForEachProvider(new[] { ProviderName.Informix, ProviderName.MySql, ProviderName.Access }, db => AreEqual(
+				from t in    Types select           t.DateTimeValue.Millisecond,
+				from t in db.Types select Sql.AsSql(t.DateTimeValue.Millisecond)));
+		}
+
+		[Test]
+		public void Date()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select Sql.AsSql(t.DateTimeValue.Date),
+				from t in db.Types select Sql.AsSql(t.DateTimeValue.Date)));
+		}
+
+		static TimeSpan TruncMiliseconds(TimeSpan ts)
+		{
+			return new TimeSpan(ts.Hours, ts.Minutes, ts.Seconds);
+		}
+
+		[Test]
+		public void TimeOfDay([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				AreEqual(
+					from t in    Types select TruncMiliseconds(Sql.AsSql(t.DateTimeValue.TimeOfDay)),
+					from t in db.Types select TruncMiliseconds(Sql.AsSql(t.DateTimeValue.TimeOfDay)));
+			}
+		}
+
+		#endregion
+
+		#region DateAdd
+
+		[Test]
+		public void DateAddYear()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           Sql.DateAdd(Sql.DateParts.Year, 1, t.DateTimeValue). Value.Date,
+				from t in db.Types select Sql.AsSql(Sql.DateAdd(Sql.DateParts.Year, 1, t.DateTimeValue)).Value.Date));
+		}
+
+		[Test]
+		public void DateAddQuarter()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           Sql.DateAdd(Sql.DateParts.Quarter, -1, t.DateTimeValue). Value.Date,
+				from t in db.Types select Sql.AsSql(Sql.DateAdd(Sql.DateParts.Quarter, -1, t.DateTimeValue)).Value.Date));
+		}
+
+		[Test]
+		public void DateAddMonth()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           Sql.DateAdd(Sql.DateParts.Month, 2, t.DateTimeValue). Value.Date,
+				from t in db.Types select Sql.AsSql(Sql.DateAdd(Sql.DateParts.Month, 2, t.DateTimeValue)).Value.Date));
+		}
+
+		[Test]
+		public void DateAddDayOfYear()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           Sql.DateAdd(Sql.DateParts.DayOfYear, 3, t.DateTimeValue). Value.Date,
+				from t in db.Types select Sql.AsSql(Sql.DateAdd(Sql.DateParts.DayOfYear, 3, t.DateTimeValue)).Value.Date));
+		}
+
+		[Test]
+		public void DateAddDay()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           Sql.DateAdd(Sql.DateParts.Day, 5, t.DateTimeValue). Value.Date,
+				from t in db.Types select Sql.AsSql(Sql.DateAdd(Sql.DateParts.Day, 5, t.DateTimeValue)).Value.Date));
+		}
+
+		[Test]
+		public void DateAddWeek()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           Sql.DateAdd(Sql.DateParts.Week, -1, t.DateTimeValue). Value.Date,
+				from t in db.Types select Sql.AsSql(Sql.DateAdd(Sql.DateParts.Week, -1, t.DateTimeValue)).Value.Date));
+		}
+
+		[Test]
+		public void DateAddWeekDay()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           Sql.DateAdd(Sql.DateParts.WeekDay, 1, t.DateTimeValue). Value.Date,
+				from t in db.Types select Sql.AsSql(Sql.DateAdd(Sql.DateParts.WeekDay, 1, t.DateTimeValue)).Value.Date));
+		}
+
+		[Test]
+		public void DateAddHour()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           Sql.DateAdd(Sql.DateParts.Hour, 1, t.DateTimeValue). Value.Hour,
+				from t in db.Types select Sql.AsSql(Sql.DateAdd(Sql.DateParts.Hour, 1, t.DateTimeValue)).Value.Hour));
+		}
+
+		[Test]
+		public void DateAddMinute()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           Sql.DateAdd(Sql.DateParts.Minute, 5, t.DateTimeValue). Value.Minute,
+				from t in db.Types select Sql.AsSql(Sql.DateAdd(Sql.DateParts.Minute, 5, t.DateTimeValue)).Value.Minute));
+		}
+
+		[Test]
+		public void DateAddSecond()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           Sql.DateAdd(Sql.DateParts.Second, 41, t.DateTimeValue). Value.Second,
+				from t in db.Types select Sql.AsSql(Sql.DateAdd(Sql.DateParts.Second, 41, t.DateTimeValue)).Value.Second));
+		}
+
+		[Test]
+		public void DateAddMillisecond()
+		{
+			ForEachProvider(new[] { ProviderName.Informix, ProviderName.MySql, ProviderName.Access },
+				db => (from t in db.Types select Sql.AsSql(Sql.DateAdd(Sql.DateParts.Millisecond, 41, t.DateTimeValue))).ToList());
+		}
+
+		[Test]
+		public void AddYears()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           t.DateTimeValue.AddYears(1). Date,
+				from t in db.Types select Sql.AsSql(t.DateTimeValue.AddYears(1)).Date));
+		}
+
+		[Test]
+		public void AddMonths()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           t.DateTimeValue.AddMonths(-2). Date,
+				from t in db.Types select Sql.AsSql(t.DateTimeValue.AddMonths(-2)).Date));
+		}
+
+		[Test]
+		public void AddDays()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           t.DateTimeValue.AddDays(5). Date,
+				from t in db.Types select Sql.AsSql(t.DateTimeValue.AddDays(5)).Date));
+		}
+
+		[Test]
+		public void AddHours()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           t.DateTimeValue.AddHours(22). Hour,
+				from t in db.Types select Sql.AsSql(t.DateTimeValue.AddHours(22)).Hour));
+		}
+
+		[Test]
+		public void AddMinutes()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           t.DateTimeValue.AddMinutes(-8). Minute,
+				from t in db.Types select Sql.AsSql(t.DateTimeValue.AddMinutes(-8)).Minute));
+		}
+
+		[Test]
+		public void AddSeconds()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types select           t.DateTimeValue.AddSeconds(-35). Second,
+				from t in db.Types select Sql.AsSql(t.DateTimeValue.AddSeconds(-35)).Second));
+		}
+
+		[Test]
+		public void AddMilliseconds()
+		{
+			ForEachProvider(new[] { ProviderName.Informix, ProviderName.MySql, ProviderName.Access },
+				db => (from t in db.Types select Sql.AsSql(t.DateTimeValue.AddMilliseconds(221))).ToList());
+		}
+
+		#endregion
+
+		#region DateDiff
+
+		[Test]
+		public void SubDateDay()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Informix, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.SQLite, ProviderName.Access },
+				db => AreEqual(
+					from t in    Types select           (int)(t.DateTimeValue.AddHours(100) - t.DateTimeValue).TotalDays,
+					from t in db.Types select (int)Sql.AsSql((t.DateTimeValue.AddHours(100) - t.DateTimeValue).TotalDays)));
+		}
+
+		[Test]
+		public void DateDiffDay()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Informix, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.SQLite, ProviderName.Access },
+				db => AreEqual(
+					from t in    Types select           Sql.DateDiff(Sql.DateParts.Day, t.DateTimeValue, t.DateTimeValue.AddHours(100)),
+					from t in db.Types select Sql.AsSql(Sql.DateDiff(Sql.DateParts.Day, t.DateTimeValue, t.DateTimeValue.AddHours(100)))));
+		}
+
+		[Test]
+		public void SubDateHour()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Informix, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.SQLite, ProviderName.Access },
+				db => AreEqual(
+					from t in    Types select           (int)(t.DateTimeValue.AddHours(100) - t.DateTimeValue).TotalHours,
+					from t in db.Types select (int)Sql.AsSql((t.DateTimeValue.AddHours(100) - t.DateTimeValue).TotalHours)));
+		}
+
+		[Test]
+		public void DateDiffHour()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Informix, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.SQLite, ProviderName.Access },
+				db => AreEqual(
+					from t in    Types select           Sql.DateDiff(Sql.DateParts.Hour, t.DateTimeValue, t.DateTimeValue.AddHours(100)),
+					from t in db.Types select Sql.AsSql(Sql.DateDiff(Sql.DateParts.Hour, t.DateTimeValue, t.DateTimeValue.AddHours(100)))));
+		}
+
+		[Test]
+		public void SubDateMinute()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Informix, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.SQLite, ProviderName.Access },
+				db => AreEqual(
+					from t in    Types select           (int)(t.DateTimeValue.AddMinutes(100) - t.DateTimeValue).TotalMinutes,
+					from t in db.Types select (int)Sql.AsSql((t.DateTimeValue.AddMinutes(100) - t.DateTimeValue).TotalMinutes)));
+		}
+
+		[Test]
+		public void DateDiffMinute()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Informix, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.SQLite, ProviderName.Access },
+				db => AreEqual(
+					from t in    Types select           Sql.DateDiff(Sql.DateParts.Minute, t.DateTimeValue, t.DateTimeValue.AddMinutes(100)),
+					from t in db.Types select Sql.AsSql(Sql.DateDiff(Sql.DateParts.Minute, t.DateTimeValue, t.DateTimeValue.AddMinutes(100)))));
+		}
+
+		[Test]
+		public void SubDateSecond()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Informix, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.SQLite, ProviderName.Access },
+				db => AreEqual(
+					from t in    Types select           (int)(t.DateTimeValue.AddMinutes(100) - t.DateTimeValue).TotalSeconds,
+					from t in db.Types select (int)Sql.AsSql((t.DateTimeValue.AddMinutes(100) - t.DateTimeValue).TotalSeconds)));
+		}
+
+		[Test]
+		public void DateDiffSecond()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Informix, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.SQLite, ProviderName.Access },
+				db => AreEqual(
+					from t in    Types select           Sql.DateDiff(Sql.DateParts.Second, t.DateTimeValue, t.DateTimeValue.AddMinutes(100)),
+					from t in db.Types select Sql.AsSql(Sql.DateDiff(Sql.DateParts.Second, t.DateTimeValue, t.DateTimeValue.AddMinutes(100)))));
+		}
+
+		[Test]
+		public void SubDateMillisecond()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Informix, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.SQLite, ProviderName.Access },
+				db => AreEqual(
+					from t in    Types select           (int)(t.DateTimeValue.AddSeconds(1) - t.DateTimeValue).TotalMilliseconds,
+					from t in db.Types select (int)Sql.AsSql((t.DateTimeValue.AddSeconds(1) - t.DateTimeValue).TotalMilliseconds)));
+		}
+
+		[Test]
+		public void DateDiffMillisecond()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Informix, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.SQLite, ProviderName.Access },
+				db => AreEqual(
+					from t in    Types select           Sql.DateDiff(Sql.DateParts.Millisecond, t.DateTimeValue, t.DateTimeValue.AddSeconds(1)),
+					from t in db.Types select Sql.AsSql(Sql.DateDiff(Sql.DateParts.Millisecond, t.DateTimeValue, t.DateTimeValue.AddSeconds(1)))));
+		}
+
+		#endregion
+
+		#region MakeDateTime
+
+		[Test]
+		public void MakeDateTime()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Sql.MakeDateTime(2010, p.ID, 1) where t.Value.Year == 2010 select t,
+				from t in from p in db.Types select Sql.MakeDateTime(2010, p.ID, 1) where t.Value.Year == 2010 select t));
+		}
+
+		[Test]
+		public void NewDateTime1()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select new DateTime(p.DateTimeValue.Year, 10, 1) where t.Month == 10 select t,
+				from t in from p in db.Types select new DateTime(p.DateTimeValue.Year, 10, 1) where t.Month == 10 select t));
+		}
+
+		[Test]
+		public void NewDateTime2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Types select new DateTime(p.DateTimeValue.Year, 10, 1),
+				from p in db.Types select new DateTime(p.DateTimeValue.Year, 10, 1)));
+		}
+
+		[Test]
+		public void MakeDateTime2()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Sql.MakeDateTime(2010, p.ID, 1, 20, 35, 44) where t.Value.Year == 2010 select t,
+				from t in from p in db.Types select Sql.MakeDateTime(2010, p.ID, 1, 20, 35, 44) where t.Value.Year == 2010 select t));
+		}
+
+		[Test]
+		public void NewDateTime3()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select new DateTime(p.DateTimeValue.Year, 10, 1, 20, 35, 44) where t.Month == 10 select t,
+				from t in from p in db.Types select new DateTime(p.DateTimeValue.Year, 10, 1, 20, 35, 44) where t.Month == 10 select t));
+		}
+
+		[Test]
+		public void NewDateTime4()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Types select new DateTime(p.DateTimeValue.Year, 10, 1, 20, 35, 44),
+				from p in db.Types select new DateTime(p.DateTimeValue.Year, 10, 1, 20, 35, 44)));
+		}
+
+		[Test]
+		public void NewDateTime5()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select new DateTime(p.DateTimeValue.Year + 1, 10, 1) where t.Month == 10 select t,
+				from t in from p in db.Types select new DateTime(p.DateTimeValue.Year + 1, 10, 1) where t.Month == 10 select t));
+		}
+
+		#endregion
+
+		[Test]
+		public void GetDateTest1()
+		{
+			ForEachProvider(
+				new[] { ProviderName.PostgreSQL },
+				db =>
+				{
+					var dates =
+						from v in db.Parent
+							join s in db.Child on v.ParentID equals s.ParentID
+						where v.Value1 > 0
+						select Sql.GetDate().Date;
+
+					var countByDates =
+						from v in dates
+						group v by v into g
+						select new { g.Key, Count = g.Count() };
+
+					countByDates.Take(5).ToList();
+				});
+		}
+
+		[Test]
+		public void GetDateTest2()
+		{
+			ForEachProvider(
+				//new[] { ProviderName.PostgreSQL },
+				db =>
+				{
+					var dates =
+						from v in db.Parent
+							join s in db.Child on v.ParentID equals s.ParentID
+						where v.Value1 > 0
+						select Sql.CurrentTimestamp.Date;
+
+					var countByDates =
+						from v in dates
+						group v by v into g
+						select new { g.Key, Count = g.Count() };
+
+					countByDates.Take(5).ToList();
+				});
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/DefaultDataProviders.txt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,19 @@
+-- This file defines data providers loaded by default for all users.
+-- Copy this file as UserDataProviders.txt and uncomment providers you need to work on.
+-- UserDataProviders.txt is in .gitignore and it is not committed to the repository.
+
+Access
+SqlCe
+SQLite
+--DB2
+--Fdp
+--Informix
+--Sql2000
+--Sql2005
+--Sql2008
+--Sql2012
+--MySql
+--Oracle
+--PostgreSQL
+--Sybase
+--Northwind
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/DeleteTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,272 @@
+using System;
+using System.Linq;
+
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+
+using NUnit.Framework;
+
+using Data.Linq;
+using Data.Linq.Model;
+
+#region ReSharper disable
+// ReSharper disable ConvertToConstant.Local
+// ReSharper disable CheckNamespace
+#endregion
+
+namespace Update
+{
+	[TestFixture]
+	public class DeleteTest : TestBase
+	{
+		[Test]
+		public void Delete1()
+		{
+			ForEachProvider(db =>
+			{
+				var parent = new Parent1 { ParentID = 1001, Value1 = 1001 };
+
+				db.Delete(parent);
+
+				try
+				{
+					db.Insert(parent);
+
+					Assert.AreEqual(1, db.Parent.Count (p => p.ParentID == parent.ParentID));
+					Assert.AreEqual(1, db.Parent.Delete(p => p.ParentID == parent.ParentID));
+					Assert.AreEqual(0, db.Parent.Count (p => p.ParentID == parent.ParentID));
+				}
+				finally
+				{
+					db.Delete(parent);
+				}
+			});
+		}
+
+		[Test]
+		public void Delete2()
+		{
+			ForEachProvider(db =>
+			{
+				var parent = new Parent1 { ParentID = 1001, Value1 = 1001 };
+
+				db.Delete(parent);
+
+				try
+				{
+					db.Insert(parent);
+
+					Assert.AreEqual(1, db.Parent.Count(p => p.ParentID == parent.ParentID));
+					Assert.AreEqual(1, db.Parent.Where(p => p.ParentID == parent.ParentID).Delete());
+					Assert.AreEqual(0, db.Parent.Count(p => p.ParentID == parent.ParentID));
+				}
+				finally
+				{
+					db.Delete(parent);
+				}
+			});
+		}
+
+		[Test]
+		public void Delete3()
+		{
+			ForEachProvider(new[] { ProviderName.Informix }, db =>
+			{
+				db.Child.Delete(c => new[] { 1001, 1002 }.Contains(c.ChildID));
+
+				try
+				{
+					db.Child.Insert(() => new Child { ParentID = 1, ChildID = 1001 });
+					db.Child.Insert(() => new Child { ParentID = 1, ChildID = 1002 });
+
+					Assert.AreEqual(3, db.Child.Count(c => c.ParentID == 1));
+					Assert.AreEqual(2, db.Child.Where(c => c.Parent.ParentID == 1 && new[] { 1001, 1002 }.Contains(c.ChildID)).Delete());
+					Assert.AreEqual(1, db.Child.Count(c => c.ParentID == 1));
+				}
+				finally
+				{
+					db.Child.Delete(c => new[] { 1001, 1002 }.Contains(c.ChildID));
+				}
+			});
+		}
+
+		[Test]
+		public void Delete4()
+		{
+			ForEachProvider(new[] { ProviderName.Informix }, db =>
+			{
+				db.GrandChild1.Delete(gc => new[] { 1001, 1002 }.Contains(gc.GrandChildID.Value));
+
+				try
+				{
+					db.GrandChild.Insert(() => new GrandChild { ParentID = 1, ChildID = 1, GrandChildID = 1001 });
+					db.GrandChild.Insert(() => new GrandChild { ParentID = 1, ChildID = 2, GrandChildID = 1002 });
+
+					Assert.AreEqual(3, db.GrandChild1.Count(gc => gc.ParentID == 1));
+					Assert.AreEqual(2, db.GrandChild1.Where(gc => gc.Parent.ParentID == 1 && new[] { 1001, 1002 }.Contains(gc.GrandChildID.Value)).Delete());
+					Assert.AreEqual(1, db.GrandChild1.Count(gc => gc.ParentID == 1));
+				}
+				finally
+				{
+					db.GrandChild1.Delete(gc => new[] { 1001, 1002 }.Contains(gc.GrandChildID.Value));
+				}
+			});
+		}
+
+		[Test]
+		public void Delete5()
+		{
+			ForEachProvider(db =>
+			{
+				var values = new[] { 1001, 1002 };
+
+				db.Parent.Delete(_ => _.ParentID > 1000);
+
+				try
+				{
+					db.Parent.Insert(() => new Parent { ParentID = values[0], Value1 = 1 });
+					db.Parent.Insert(() => new Parent { ParentID = values[1], Value1 = 1 });
+
+					Assert.AreEqual(2, db.Parent.Count(_ => _.ParentID > 1000));
+					Assert.AreEqual(2, db.Parent.Delete(_ => values.Contains(_.ParentID)));
+					Assert.AreEqual(0, db.Parent.Count(_ => _.ParentID > 1000));
+				}
+				finally
+				{
+					db.Parent.Delete(_ => _.ParentID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void AlterDelete([DataContexts(ProviderName.Informix, ExcludeLinqService=true)] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				var q =
+					from p in db.Parent
+						join ch in db.Child on p.ParentID equals ch.ParentID into lj1
+						from ch in lj1.DefaultIfEmpty()
+					where ch != null && ch.ParentID == -1 || ch == null && p.ParentID == -1
+					select p;
+
+				q.Delete();
+
+				var sql = ((TestDbManager)db).LastQuery;
+
+				if (sql.Contains("EXISTS"))
+					Assert.That(sql.IndexOf("(("), Is.GreaterThan(0));
+			}
+		}
+
+		[Test]
+		public void DeleteMany1([DataContexts(
+			ProviderName.Access, ProviderName.DB2, ProviderName.Informix, "Oracle",
+			ProviderName.PostgreSQL, ProviderName.SqlCe, ProviderName.SQLite, ProviderName.Firebird
+			)] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				db.Parent.Insert(() => new Parent { ParentID = 1001 });
+				db.Child. Insert(() => new Child  { ParentID = 1001, ChildID = 1 });
+				db.Child. Insert(() => new Child  { ParentID = 1001, ChildID = 2 });
+
+				try
+				{
+					var q =
+						from p in db.Parent
+						where p.ParentID >= 1000
+						select p;
+
+					var n = q.SelectMany(p => p.Children).Delete();
+
+					Assert.That(n, Is.GreaterThanOrEqualTo(2));
+				}
+				finally
+				{
+					db.Child. Delete(c => c.ParentID >= 1000);
+					db.Parent.Delete(c => c.ParentID >= 1000);
+				}
+			}
+		}
+
+		[Test]
+		public void DeleteMany2([DataContexts(
+			ProviderName.Access, ProviderName.DB2, ProviderName.Informix, "Oracle",
+			ProviderName.PostgreSQL, ProviderName.SqlCe, ProviderName.SQLite, ProviderName.Firebird
+			)] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				db.Parent.    Insert(() => new Parent     { ParentID = 1001 });
+				db.Child.     Insert(() => new Child      { ParentID = 1001, ChildID = 1 });
+				db.GrandChild.Insert(() => new GrandChild { ParentID = 1001, ChildID = 1, GrandChildID = 1});
+				db.GrandChild.Insert(() => new GrandChild { ParentID = 1001, ChildID = 1, GrandChildID = 2});
+				db.GrandChild.Insert(() => new GrandChild { ParentID = 1001, ChildID = 1, GrandChildID = 3});
+				db.Child.     Insert(() => new Child      { ParentID = 1001, ChildID = 2 });
+				db.GrandChild.Insert(() => new GrandChild { ParentID = 1001, ChildID = 2, GrandChildID = 1});
+				db.GrandChild.Insert(() => new GrandChild { ParentID = 1001, ChildID = 2, GrandChildID = 2});
+				db.GrandChild.Insert(() => new GrandChild { ParentID = 1001, ChildID = 2, GrandChildID = 3});
+
+				try
+				{
+					var q =
+						from p in db.Parent
+						where p.ParentID >= 1000
+						select p;
+
+					var n1 = q.SelectMany(p => p.Children.SelectMany(c => c.GrandChildren)).Delete();
+					var n2 = q.SelectMany(p => p.Children).                                 Delete();
+
+					Assert.That(n1, Is.EqualTo(6));
+					Assert.That(n2, Is.EqualTo(2));
+				}
+				finally
+				{
+					db.GrandChild.Delete(c => c.ParentID >= 1000);
+					db.Child.     Delete(c => c.ParentID >= 1000);
+					db.Parent.    Delete(c => c.ParentID >= 1000);
+				}
+			}
+		}
+
+		[Test]
+		public void DeleteMany3([DataContexts(
+			ProviderName.Access, ProviderName.DB2, ProviderName.Informix, "Oracle",
+			ProviderName.PostgreSQL, ProviderName.SqlCe, ProviderName.SQLite, ProviderName.Firebird
+			)] string context)
+		{
+			var ids = new[] { 1001 };
+
+			using (var db = GetDataContext(context))
+			{
+				db.GrandChild.Delete(c => c.ParentID >= 1000);
+				db.Child.     Delete(c => c.ParentID >= 1000);
+				db.Parent.    Delete(c => c.ParentID >= 1000);
+
+				db.Parent.    Insert(() => new Parent     { ParentID = 1001 });
+				db.Child.     Insert(() => new Child      { ParentID = 1001, ChildID = 1 });
+				db.GrandChild.Insert(() => new GrandChild { ParentID = 1001, ChildID = 1, GrandChildID = 1});
+				db.GrandChild.Insert(() => new GrandChild { ParentID = 1001, ChildID = 1, GrandChildID = 2});
+
+				try
+				{
+					var q =
+						from p in db.Parent
+						where ids.Contains(p.ParentID)
+						select p;
+
+					var n1 = q.SelectMany(p => p.Children).SelectMany(gc => gc.GrandChildren).Delete();
+
+					Assert.That(n1, Is.EqualTo(2));
+				}
+				finally
+				{
+					db.GrandChild.Delete(c => c.ParentID >= 1000);
+					db.Child.     Delete(c => c.ParentID >= 1000);
+					db.Parent.    Delete(c => c.ParentID >= 1000);
+				}
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Distinct.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,118 @@
+using System;
+using System.Linq;
+
+using NUnit.Framework;
+
+using BLToolkit.Data.DataProvider;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class DistinctTest : TestBase
+	{
+		[Test]
+		public void Distinct1()
+		{
+			ForEachProvider(db => AreEqual(
+				(from ch in    Child select ch.ParentID).Distinct(),
+				(from ch in db.Child select ch.ParentID).Distinct()));
+		}
+
+		[Test]
+		public void Distinct2()
+		{
+			ForEachProvider(db => AreEqual(
+				(from p in    Parent select p.Value1 ?? p.ParentID % 2).Distinct(),
+				(from p in db.Parent select p.Value1 ?? p.ParentID % 2).Distinct()));
+		}
+
+		[Test]
+		public void Distinct3()
+		{
+			ForEachProvider(db => AreEqual(
+				(from p in    Parent select new { Value = p.Value1 ?? p.ParentID % 2, p.Value1 }).Distinct(),
+				(from p in db.Parent select new { Value = p.Value1 ?? p.ParentID % 2, p.Value1 }).Distinct()));
+		}
+
+		[Test]
+		public void Distinct4()
+		{
+			ForEachProvider(db => AreEqual(
+				(from p in    Parent select new Parent { ParentID = p.Value1 ?? p.ParentID % 2, Value1 = p.Value1 }).Distinct(),
+				(from p in db.Parent select new Parent { ParentID = p.Value1 ?? p.ParentID % 2, Value1 = p.Value1 }).Distinct()));
+		}
+
+		[Test]
+		public void Distinct5()
+		{
+			var id = 2;
+
+			ForEachProvider(db => AreEqual(
+				(from p in    Parent select new Parent { ParentID = p.Value1 ?? p.ParentID % 2, Value1 = id + 1 }).Distinct(),
+				(from p in db.Parent select new Parent { ParentID = p.Value1 ?? p.ParentID % 2, Value1 = id + 1 }).Distinct()));
+		}
+
+		[Test]
+		public void Distinct6()
+		{
+			var id = 2;
+
+			ForEachProvider(new[] { ProviderName.Informix }, db => AreEqual(
+				(from p in    Parent select new Parent { ParentID = p.Value1 ?? p.ParentID + id % 2, Value1 = id + 1 }).Distinct(),
+				(from p in db.Parent select new Parent { ParentID = p.Value1 ?? p.ParentID + id % 2, Value1 = id + 1 }).Distinct()));
+		}
+
+		[Test]
+		public void DistinctCount()
+		{
+			var expected =
+				from p in Parent
+					join c in Child on p.ParentID equals c.ParentID
+				where c.ChildID > 20
+				select p;
+
+			ForEachProvider(db =>
+			{
+				var result =
+					from p in db.Parent
+						join c in db.Child on p.ParentID equals c.ParentID
+					where c.ChildID > 20
+					select p;
+
+				Assert.AreEqual(expected.Distinct().Count(), result.Distinct().Count());
+			});
+		}
+
+		[Test]
+		public void DistinctMax()
+		{
+			var expected =
+				from p in Parent
+					join c in Child on p.ParentID equals c.ParentID
+				where c.ChildID > 20
+				select p;
+
+			ForEachProvider(db =>
+			{
+				var result =
+					from p in db.Parent
+						join c in db.Child on p.ParentID equals c.ParentID
+					where c.ChildID > 20
+					select p;
+
+				Assert.AreEqual(expected.Distinct().Max(p => p.ParentID), result.Distinct().Max(p => p.ParentID));
+			});
+		}
+
+		[Test]
+		public void TakeDistinct()
+		{
+			ForEachProvider(new[] { ProviderName.Sybase, ProviderName.SQLite },
+				db => AreEqual(
+					(from ch in    Child orderby ch.ParentID select ch.ParentID).Take(4).Distinct(),
+					(from ch in db.Child orderby ch.ParentID select ch.ParentID).Take(4).Distinct()));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/ElementOperationTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,223 @@
+using System.Linq;
+
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class ElementOperationTest : TestBase
+	{
+		[Test]
+		public void First()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				   Parent.OrderByDescending(p => p.ParentID).First().ParentID,
+				db.Parent.OrderByDescending(p => p.ParentID).First().ParentID));
+		}
+
+		[Test]
+		public void FirstWhere()
+		{
+			ForEachProvider(db => Assert.AreEqual(2, db.Parent.First(p => p.ParentID == 2).ParentID));
+		}
+
+		[Test]
+		public void FirstOrDefault()
+		{
+			ForEachProvider(db => Assert.IsNull((from p in db.Parent where p.ParentID == 100 select p).FirstOrDefault()));
+		}
+
+		[Test]
+		public void FirstOrDefaultWhere()
+		{
+			ForEachProvider(db => Assert.AreEqual(2, db.Parent.FirstOrDefault(p => p.ParentID == 2).ParentID));
+		}
+
+		[Test]
+		public void Single()
+		{
+			ForEachProvider(db => Assert.AreEqual(1, db.Parent.Where(p => p.ParentID == 1).Single().ParentID));
+		}
+
+		[Test]
+		public void SingleWhere()
+		{
+			ForEachProvider(db => Assert.AreEqual(2, db.Parent.Single(p => p.ParentID == 2).ParentID));
+		}
+
+		[Test]
+		public void SingleOrDefault()
+		{
+			ForEachProvider(db => Assert.IsNull((from p in db.Parent where p.ParentID == 100 select p).SingleOrDefault()));
+		}
+
+		[Test]
+		public void SingleOrDefaultWhere()
+		{
+			ForEachProvider(db => Assert.AreEqual(2, db.Parent.SingleOrDefault(p => p.ParentID == 2).ParentID));
+		}
+
+		[Test]
+		public void FirstOrDefaultScalar()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				   Parent.OrderBy(p => p.ParentID).FirstOrDefault().ParentID,
+				db.Parent.OrderBy(p => p.ParentID).FirstOrDefault().ParentID));
+		}
+
+		[Test]
+		public void NestedFirstOrDefaultScalar1()
+		{
+			ForEachProvider(new[] { ProviderName.Informix, ProviderName.Sybase }, db => AreEqual(
+				from p in    Parent select    Child.FirstOrDefault().ChildID,
+				from p in db.Parent select db.Child.FirstOrDefault().ChildID));
+		}
+
+		[Test]
+		public void NestedFirstOrDefaultScalar2()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Informix, "Oracle", "DevartOracle", ProviderName.Sybase }, db =>
+				AreEqual(
+					from p in Parent
+					select new
+					{
+						p.ParentID,
+						MaxChild =
+							Child
+								.Where(c => c.Parent == p)
+								.OrderByDescending(c => c.ChildID * c.ParentID)
+								.FirstOrDefault() == null ?
+							0 :
+							Child
+								.Where(c => c.Parent == p)
+								.OrderByDescending(c => c.ChildID * c.ParentID)
+								.FirstOrDefault()
+								.ChildID
+					},
+					from p in db.Parent
+					select new
+					{
+						p.ParentID,
+						MaxChild = db.Child
+							.Where(c => c.Parent == p)
+							.OrderByDescending(c => c.ChildID * c.ParentID)
+							.FirstOrDefault()
+							.ChildID
+					}));
+		}
+
+		[Test]
+		public void NestedFirstOrDefault1()
+		{
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true;
+
+			ForEachProvider(
+				db => AreEqual(
+					from p in    Parent select    Child.FirstOrDefault(),
+					from p in db.Parent select db.Child.FirstOrDefault()));
+
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false;
+		}
+
+		[Test]
+		public void NestedFirstOrDefault2()
+		{
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true;
+
+			ForEachProvider(
+				db => AreEqual(
+					from p in    Parent select p.Children.FirstOrDefault(),
+					from p in db.Parent select p.Children.FirstOrDefault()));
+
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false;
+		}
+
+		[Test]
+		public void NestedFirstOrDefault3()
+		{
+			ForEachProvider(
+				// Can be fixed.
+				new[] { ProviderName.Informix, ProviderName.Firebird },
+				db => AreEqual(
+					from p in    Parent select p.Children.Select(c => c.ParentID).Distinct().FirstOrDefault(),
+					from p in db.Parent select p.Children.Select(c => c.ParentID).Distinct().FirstOrDefault()));
+		}
+
+		[Test]
+		public void NestedFirstOrDefault4()
+		{
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true;
+
+			ForEachProvider(
+				// Can be fixed.
+				new[] { ProviderName.Informix, ProviderName.Firebird, ProviderName.PostgreSQL },
+				db => AreEqual(
+					from p in    Parent select p.Children.Where(c => c.ParentID > 0).Distinct().FirstOrDefault(),
+					from p in db.Parent select p.Children.Where(c => c.ParentID > 0).Distinct().FirstOrDefault()));
+
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false;
+		}
+
+		[Test]
+		public void NestedFirstOrDefault5()
+		{
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true;
+
+			ForEachProvider(
+				db => AreEqual(
+					from p in    GrandChild select p.Child.Parent.Children.FirstOrDefault(),
+					from p in db.GrandChild select p.Child.Parent.Children.FirstOrDefault()));
+
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false;
+		}
+
+		[Test]
+		public void NestedSingleOrDefault1()
+		{
+			ForEachProvider(
+				db => AreEqual(
+					from p in    Parent select p.Children.Select(c => c.ParentID).Distinct().SingleOrDefault(),
+					from p in db.Parent select p.Children.Select(c => c.ParentID).Distinct().SingleOrDefault()));
+		}
+
+		[Test]
+		public void FirstOrDefaultEntitySet([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+			{
+				AreEqual(
+					   Customer.Select(c => c.Orders.FirstOrDefault()),
+					db.Customer.Select(c => c.Orders.FirstOrDefault()));
+			}
+		}
+
+		[Test]
+		public void NestedSingleOrDefaultTest([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+			{
+				AreEqual(
+					   Customer.Select(c => c.Orders.Take(1).SingleOrDefault()),
+					db.Customer.Select(c => c.Orders.Take(1).SingleOrDefault()));
+			}
+		}
+
+		[Test]
+		public void MultipleQuery([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+			{
+				var q =
+					from p in db.Product
+					select db.Category.Select(zrp => zrp.CategoryName).FirstOrDefault();
+
+				q.ToList();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/EnumMapping.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1534 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	[TestFixture, Category("MapValue")]
+	public class EnumMapping : TestBase
+	{
+		enum TestEnum1
+		{
+			[MapValue(11L)] Value1 = 3,
+			[MapValue(12L)] Value2,
+		}
+		enum TestEnum2
+		{
+			Value1 = 3,
+			Value2,
+		}
+		enum TestEnum3
+		{
+			Value1 = 3,
+			Value2,
+		}
+
+		[TableName("LinqDataTypes")]
+		class TestTable1
+		{
+			[PrimaryKey, MapField("ID")] public int Id;
+			[MapField("BigIntValue")]    public TestEnum1 TestField;
+		}
+
+		[MapValue(TestEnum2.Value2, 12L)]
+		[TableName("LinqDataTypes")]
+		class TestTable2
+		{
+			[PrimaryKey, MapField("ID")]
+			public int Id;
+
+			[MapValue(TestEnum2.Value1, 11L)]
+			[MapField("BigIntValue")]
+			public TestEnum2 TestField;
+
+			[MapField("IntValue")]
+			public TestEnum3 Int32Field;
+		}
+
+		[TableName("LinqDataTypes")]
+		class NullableTestTable1
+		{
+			[PrimaryKey, MapField("ID")]
+			public int? Id;
+
+			[MapField("BigIntValue")]
+			public TestEnum1? TestField;
+		}
+
+		[MapValue(TestEnum2.Value2, 12L)]
+		[TableName("LinqDataTypes")]
+		class NullableTestTable2
+		{
+			[PrimaryKey, MapField("ID")]
+			public int? Id;
+
+			[MapValue(TestEnum2.Value1, 11L)]
+			[MapField("BigIntValue")]
+			public TestEnum2? TestField;
+
+			[MapField("IntValue")]
+			public TestEnum3? Int32Field;
+		}
+
+		[TableName("LinqDataTypes")]
+		class RawTable
+		{
+			[PrimaryKey, MapField("ID")]
+			public int Id;
+
+			[MapField("BigIntValue")]
+			public long TestField;
+
+			[MapField("IntValue")]
+			public int Int32Field;
+		}
+
+		class Cleaner : IDisposable
+		{
+			readonly ITestDataContext _db;
+
+			public Cleaner(ITestDataContext db)
+			{
+				_db = db;
+				Clean();
+			}
+
+			private void Clean()
+			{
+				_db.GetTable<RawTable>().Where(r => r.Id == RID).Delete();
+			}
+
+			public void Dispose()
+			{
+				try
+				{
+					// rollback emulation for WCF
+					Clean();
+				}
+				catch (Exception)
+				{
+				}
+			}
+		}
+
+		const long VAL2 = 12;
+		const long VAL1 = 11;
+		const int  RID  = 101;
+
+		[Test]
+		public void EnumMapInsert1()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<TestTable1>().Insert(() => new TestTable1
+					{
+						Id = RID,
+						TestField = TestEnum1.Value2
+					});
+
+					Assert.AreEqual(1, db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL2).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapInsert2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<TestTable2>().Insert(() => new TestTable2
+					{
+						Id = RID,
+						TestField = TestEnum2.Value2
+					});
+
+					Assert.AreEqual(1, db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL2).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapInsert3()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<NullableTestTable1>().Insert(() => new NullableTestTable1
+					{
+						Id = RID,
+						TestField = TestEnum1.Value2
+					});
+
+					Assert.AreEqual(1, db.GetTable<RawTable>()
+						.Where(r => r.Id == RID && r.TestField == VAL2).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapInsert4()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<NullableTestTable2>().Insert(() => new NullableTestTable2
+					{
+						Id = RID,
+						TestField = TestEnum2.Value2
+					});
+
+					Assert.AreEqual(1, db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL2).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapWhere1()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var result = db.GetTable<TestTable1>().Where(r => r.Id == RID && r.TestField == TestEnum1.Value2).Select(r => r.TestField).FirstOrDefault();
+					Assert.True(result == TestEnum1.Value2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapWhere2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var result = db.GetTable<TestTable2>().Where(r => r.Id == RID && r.TestField == TestEnum2.Value2).Select(r => r.TestField).FirstOrDefault();
+					Assert.True(result == TestEnum2.Value2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapWhere3()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var result = db.GetTable<NullableTestTable1>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum1.Value2)
+						.Select(r => r.TestField).FirstOrDefault();
+					Assert.True(result == TestEnum1.Value2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapWhere4()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var result = db.GetTable<NullableTestTable2>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum2.Value2)
+						.Select(r => r.TestField).FirstOrDefault();
+					Assert.True(result == TestEnum2.Value2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapUpdate1()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL1
+					});
+
+					db.GetTable<TestTable1>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum1.Value1)
+						.Update(r => new TestTable1 { TestField = TestEnum1.Value2 });
+
+					var result = db.GetTable<RawTable>()
+						.Where(r => r.Id == RID && r.TestField == VAL2)
+						.Select(r => r.TestField)
+						.FirstOrDefault();
+
+					Assert.True(result == VAL2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapUpdate2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL1
+					});
+
+					db.GetTable<TestTable2>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum2.Value1)
+						.Update(r => new TestTable2 { TestField = TestEnum2.Value2 });
+
+					var result = db.GetTable<RawTable>()
+						.Where(r => r.Id == RID && r.TestField == VAL2)
+						.Select(r => r.TestField)
+						.FirstOrDefault();
+
+					Assert.True(result == VAL2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapUpdate3()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL1
+					});
+
+					db.GetTable<NullableTestTable1>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum1.Value1)
+						.Update(r => new NullableTestTable1 { TestField = TestEnum1.Value2 });
+
+					var result = db.GetTable<RawTable>()
+						.Where(r => r.Id == RID && r.TestField == VAL2)
+						.Select(r => r.TestField)
+						.FirstOrDefault();
+
+					Assert.True(result == VAL2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapUpdate4()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL1
+					});
+
+					db.GetTable<NullableTestTable2>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum2.Value1)
+						.Update(r => new NullableTestTable2 { TestField = TestEnum2.Value2 });
+
+					var result = db.GetTable<RawTable>()
+						.Where(r => r.Id == RID && r.TestField == VAL2)
+						.Select(r => r.TestField)
+						.FirstOrDefault();
+
+					Assert.True(result == VAL2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapSelectAnon1([DataContexts] string context)
+		{
+			using (var db  = GetDataContext(context))
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var result = db.GetTable<TestTable1>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum1.Value2)
+						.Select(r => new { r.TestField })
+						.FirstOrDefault();
+
+					Assert.NotNull(result);
+					Assert.That(result.TestField, Is.EqualTo(TestEnum1.Value2));
+				}
+			}
+		}
+
+		[Test]
+		public void EnumMapSelectAnon2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var result = db.GetTable<TestTable2>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum2.Value2)
+						.Select(r => new { r.TestField })
+						.FirstOrDefault();
+
+					Assert.NotNull(result);
+					Assert.True(result.TestField == TestEnum2.Value2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapSelectAnon3()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var result = db.GetTable<NullableTestTable1>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum1.Value2)
+						.Select(r => new { r.TestField })
+						.FirstOrDefault();
+
+					Assert.NotNull(result);
+					Assert.True(result.TestField == TestEnum1.Value2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapSelectAnon4()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var result = db.GetTable<NullableTestTable2>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum2.Value2)
+						.Select(r => new { r.TestField })
+						.FirstOrDefault();
+
+					Assert.NotNull(result);
+					Assert.True(result.TestField == TestEnum2.Value2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapDelete1()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.True(1 == db.GetTable<TestTable1>().Delete(r => r.Id == RID && r.TestField == TestEnum1.Value2));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapDelete2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.True(1 == db.GetTable<TestTable2>().Delete(r => r.Id == RID && r.TestField == TestEnum2.Value2));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapDelete3()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.True(1 == db.GetTable<NullableTestTable1>()
+						.Delete(r => r.Id == RID && r.TestField == TestEnum1.Value2));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapDelete4()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.True(1 == db.GetTable<NullableTestTable2>()
+						.Delete(r => r.Id == RID && r.TestField == TestEnum2.Value2));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapSet1()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL1
+					});
+
+					db.GetTable<TestTable1>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum1.Value1)
+						.Set(r => r.TestField, TestEnum1.Value2).Update();
+					var result = db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL2).Select(r => r.TestField).FirstOrDefault();
+					Assert.True(result == VAL2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapSet2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL1
+					});
+
+					db.GetTable<TestTable2>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum2.Value1)
+						.Set(r => r.TestField, TestEnum2.Value2).Update();
+					var result = db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL2).Select(r => r.TestField).FirstOrDefault();
+					Assert.True(result == VAL2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapSet3()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						Int32Field = 3
+					});
+
+					db.GetTable<TestTable2>()
+						.Where(r => r.Id == RID && r.Int32Field == TestEnum3.Value1)
+						.Set(r => r.Int32Field, () => TestEnum3.Value2).Update();
+					Assert.True(1 == db.GetTable<RawTable>().Where(r => r.Id == RID && r.Int32Field == 4).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapSet4()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL1
+					});
+
+					db.GetTable<NullableTestTable1>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum1.Value1)
+						.Set(r => r.TestField, TestEnum1.Value2).Update();
+					var result = db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL2).Select(r => r.TestField).FirstOrDefault();
+					Assert.True(result == VAL2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapSet5()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL1
+					});
+
+					db.GetTable<NullableTestTable2>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum2.Value1)
+						.Set(r => r.TestField, TestEnum2.Value2).Update();
+					var result = db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL2).Select(r => r.TestField).FirstOrDefault();
+					Assert.True(result == VAL2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapSet6()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						Int32Field = 3
+					});
+
+					db.GetTable<NullableTestTable2>()
+						.Where(r => r.Id == RID && r.Int32Field == TestEnum3.Value1)
+						.Set(r => r.Int32Field, () => TestEnum3.Value2).Update();
+					Assert.True(1 == db.GetTable<RawTable>().Where(r => r.Id == RID && r.Int32Field == 4).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapContains1([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.True(1 == db.GetTable<TestTable1>()
+						.Where(r => r.Id == RID && new[] { TestEnum1.Value2 }.Contains(r.TestField)).Count());
+				}
+			}
+		}
+
+		[Test]
+		public void EnumMapContains2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.That(db.GetTable<TestTable2>().Where(r => r.Id == RID && new[] { TestEnum2.Value2 }.Contains(r.TestField)).Count(), Is.EqualTo(1));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapContains3()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.True(1 == db.GetTable<NullableTestTable1>()
+						.Where(r => r.Id == RID && new[] { (TestEnum1?)TestEnum1.Value2 }.Contains(r.TestField)).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapContains4()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.True(1 == db.GetTable<NullableTestTable2>()
+						.Where(r => r.Id == RID && new[] { (TestEnum2?)TestEnum2.Value2 }.Contains(r.TestField)).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapSelectNull1()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID
+					});
+
+					var result = db.GetTable<NullableTestTable1>()
+						.Where(r => r.Id == RID)
+						.Select(r => new { r.TestField })
+						.FirstOrDefault();
+
+					Assert.NotNull(result);
+					Assert.True(result.TestField == null);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapSelectNull2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID
+					});
+
+					var result = db.GetTable<NullableTestTable2>()
+						.Where(r => r.Id == RID)
+						.Select(r => new { r.TestField })
+						.FirstOrDefault();
+
+					Assert.NotNull(result);
+					Assert.True(result.TestField == null);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapWhereNull1()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID
+					});
+
+					var result = db.GetTable<NullableTestTable1>()
+						.Where(r => r.Id == RID && r.TestField == null)
+						.Select(r => new { r.TestField }).FirstOrDefault();
+					Assert.NotNull(result);
+					Assert.Null(result.TestField);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapWhereNull2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID
+					});
+
+					var result = db.GetTable<NullableTestTable2>()
+						.Where(r => r.Id == RID && r.TestField == null)
+						.Select(r => new { r.TestField }).FirstOrDefault();
+					Assert.NotNull(result);
+					Assert.Null(result.TestField);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapInsertObject1()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.Insert(new TestTable1
+					{
+						Id = RID,
+						TestField = TestEnum1.Value2
+					});
+
+					Assert.AreEqual(1, db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL2).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapInsertObject2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.Insert(new TestTable2
+					{
+						Id = RID,
+						TestField = TestEnum2.Value2
+					});
+
+					Assert.AreEqual(1, db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL2).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapInsertObject3()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.Insert(new NullableTestTable1
+					{
+						Id = RID,
+						TestField = TestEnum1.Value2
+					});
+
+					Assert.AreEqual(1, db.GetTable<RawTable>()
+						.Where(r => r.Id == RID && r.TestField == VAL2).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapInsertObject4()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.Insert(new NullableTestTable2
+					{
+						Id = RID,
+						TestField = TestEnum2.Value2
+					});
+
+					Assert.AreEqual(1, db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL2).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapInsertFromSelectWithParam1()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var param = TestEnum1.Value1;
+
+					var result = db.GetTable<TestTable1>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum1.Value2)
+						.Select(r => new TestTable1
+						{
+							Id = r.Id,
+							TestField = param
+						})
+						.Insert(db.GetTable<TestTable1>(), r => r);
+
+					Assert.AreEqual(1, result);
+					Assert.AreEqual(1, db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL1).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapInsertFromSelectWithParam2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var param = TestEnum2.Value1;
+
+					var result = db.GetTable<TestTable2>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum2.Value2)
+						.Select(r => new TestTable2
+						{
+							Id = r.Id,
+							TestField = param
+						})
+						.Insert(db.GetTable<TestTable2>(), r => r);
+
+					Assert.AreEqual(1, result);
+					Assert.AreEqual(1, db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL1).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapInsertFromSelectWithParam3()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var param = TestEnum1.Value1;
+
+					var result = db.GetTable<NullableTestTable1>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum1.Value2)
+						.Select(r => new NullableTestTable1
+						{
+							Id = r.Id,
+							TestField = param
+						})
+						.Insert(db.GetTable<NullableTestTable1>(), r => r);
+
+					Assert.AreEqual(1, result);
+					Assert.AreEqual(1, db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL1).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapInsertFromSelectWithParam4()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var param = TestEnum2.Value1;
+
+					var result = db.GetTable<NullableTestTable2>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum2.Value2)
+						.Select(r => new NullableTestTable2
+						{
+							Id = r.Id,
+							TestField = param
+						})
+						.Insert(db.GetTable<NullableTestTable2>(), r => r);
+
+					Assert.AreEqual(1, result);
+					Assert.AreEqual(1, db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL1).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapDeleteEquals1()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.True(1 == db.GetTable<TestTable1>().Delete(r => r.Id == RID && r.TestField.Equals(TestEnum1.Value2)));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapDeleteEquals2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.True(1 == db.GetTable<TestTable2>().Delete(r => r.Id == RID && r.TestField.Equals(TestEnum2.Value2)));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapDeleteEquals3()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.True(1 == db.GetTable<NullableTestTable1>()
+						.Delete(r => r.Id == RID && r.TestField.Equals(TestEnum1.Value2)));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapDeleteEquals4()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.True(1 == db.GetTable<NullableTestTable2>()
+						.Delete(r => r.Id == RID && r.TestField.Equals(TestEnum2.Value2)));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapCustomPredicate1([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var entityParameter = Expression.Parameter(typeof(TestTable1), "entity"); // parameter name required for BLToolkit
+					var filterExpression = Expression.Equal(Expression.Field(entityParameter, "TestField"), Expression.Constant(TestEnum1.Value2));
+					var filterPredicate = Expression.Lambda<Func<TestTable1, bool>>(filterExpression, entityParameter);
+					var result = db.GetTable<TestTable1>().Where(filterPredicate).ToList();
+
+					Assert.AreEqual(1, result.Count);
+				}
+			}
+		}
+
+		[Test]
+		public void EnumMapCustomPredicate2([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var entityParameter = Expression.Parameter(typeof(TestTable2), "entity"); // parameter name required for BLToolkit
+					var filterExpression = Expression.Equal(Expression.Field(entityParameter, "TestField"), Expression.Constant(TestEnum2.Value2));
+					var filterPredicate = Expression.Lambda<Func<TestTable2, bool>>(filterExpression, entityParameter);
+					var result = db.GetTable<TestTable2>().Where(filterPredicate).ToList();
+
+					Assert.AreEqual(1, result.Count);
+				}
+			}
+		}
+
+		[TableName("LinqDataTypes")]
+		class TestTable3
+		{
+			[PrimaryKey]
+			public int ID;
+			
+			[MapField("BigIntValue")]
+			public TestEnum1? TargetType;
+
+			[MapField("IntValue")]
+			public int? TargetID;
+		}
+
+		struct ObjectReference
+		{
+			public TestEnum1 TargetType;
+			public int TargetID;
+			public ObjectReference(TestEnum1 targetType, int tagetId)
+			{
+				TargetType = targetType;
+				TargetID = tagetId;
+			}
+		}
+
+		[Test]
+		public void Test_4_1_18_Regression1()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable()
+					{
+						Id = RID,
+						TestField = VAL2,
+						Int32Field = 10
+					});
+
+					var result = db.GetTable<TestTable3>().Where(r => r.ID == RID).Select(_ => new
+					{
+						Target = _.TargetType != null && _.TargetID != null
+						  ? new ObjectReference(_.TargetType.Value, _.TargetID.Value)
+						  : default(ObjectReference?)
+					})
+					.ToArray();
+
+					Assert.AreEqual(1, result.Length);
+					Assert.NotNull(result[0].Target);
+					Assert.AreEqual(10, result[0].Target.Value.TargetID);
+					Assert.AreEqual(TestEnum1.Value2, result[0].Target.Value.TargetType);
+				}
+			});
+		}
+
+		[TableName("LinqDataTypes")]
+		class TestTable4
+		{
+			[PrimaryKey]
+			public int ID;
+
+			[MapField("BigIntValue")]
+			public TestEnum2? TargetType;
+
+			[MapField("IntValue")]
+			public int? TargetID;
+		}
+
+		struct ObjectReference2
+		{
+			public TestEnum2 TargetType;
+			public int TargetID;
+			public ObjectReference2(TestEnum2 targetType, int tagetId)
+			{
+				TargetType = targetType;
+				TargetID = tagetId;
+			}
+		}
+
+		[Test]
+		public void Test_4_1_18_Regression2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable()
+					{
+						Id = RID,
+						TestField = (long)TestEnum2.Value2,
+						Int32Field = 10
+					});
+
+					var result = db.GetTable<TestTable4>().Where(r => r.ID == RID).Select(_ => new
+					{
+						Target = _.TargetType != null && _.TargetID != null
+						  ? new ObjectReference2(_.TargetType.Value, _.TargetID.Value)
+						  : default(ObjectReference2?)
+					})
+					.ToArray();
+
+					Assert.AreEqual(1, result.Length);
+					Assert.NotNull(result[0].Target);
+					Assert.AreEqual(10, result[0].Target.Value.TargetID);
+					Assert.AreEqual(TestEnum2.Value2, result[0].Target.Value.TargetType);
+				}
+			});
+		}
+
+		class NullableResult
+		{
+			public TestEnum1? Value;
+		}
+
+		[Test]
+		public void EnumMapSelectNull([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID
+					});
+
+					var result = db.GetTable<TestTable1>()
+						.Where(r => r.Id == RID)
+						.Select(r => new NullableResult {Value = r.TestField })
+						.FirstOrDefault();
+
+					Assert.NotNull(result);
+					Assert.Null(result.Value);
+				}
+			}
+		}
+
+		private TestEnum1 Convert(TestEnum1 val)
+		{
+			return val;
+		}
+
+		[Test]
+		public void EnumMapSelectNull_Regression([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var result = db.GetTable<TestTable1>()
+						.Where(r => r.Id == RID)
+						.Select(r => new NullableResult { Value = Convert(r.TestField) })
+						.FirstOrDefault();
+
+					Assert.NotNull(result);
+					Assert.That(result.Value, Is.EqualTo(TestEnum1.Value2));
+				}
+			}
+		}
+
+		[Flags]
+		enum TestFlag
+		{
+			Value1 = 0x1,
+			Value2 = 0x2
+		}
+
+		[TableName("LinqDataTypes")]
+		class TestTable5
+		{
+			public int      ID;
+			public TestFlag IntValue;
+		}
+
+		[Test]
+		public void TestFlagEnum([DataContexts(ProviderName.Access)] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				var result =
+					from t in db.GetTable<TestTable5>()
+					where (t.IntValue & TestFlag.Value1) != 0
+					select t;
+
+				var sql = result.ToString();
+
+				Assert.That(sql, Is.Not.Contains("Convert"));
+			}
+		}
+
+		[Test]
+		public void EnumMapContainsList1()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var set = new HashSet<TestEnum1>();
+					set.Add(TestEnum1.Value2);
+
+					Assert.That(db.GetTable<TestTable1>()
+						.Where(r => r.Id == RID && set.Contains(r.TestField)).Count(), Is.EqualTo(1));
+					Assert.That(db.GetTable<TestTable1>()
+						.Where(r => r.Id == RID && !set.Contains(r.TestField)).Count(), Is.EqualTo(0));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapContainsList2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var set = new HashSet<TestEnum2>();
+					set.Add(TestEnum2.Value2);
+
+					Assert.That(db.GetTable<TestTable2>().Where(r => r.Id == RID && set.Contains(r.TestField)).Count(), Is.EqualTo(1));
+					Assert.That(db.GetTable<TestTable2>().Where(r => r.Id == RID && !set.Contains(r.TestField)).Count(), Is.EqualTo(0));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapContainsList3()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var set = new HashSet<TestEnum1?>();
+					set.Add(TestEnum1.Value2);
+
+					Assert.That(db.GetTable<NullableTestTable1>()
+						.Where(r => r.Id == RID && set.Contains(r.TestField)).Count(), Is.EqualTo(1));
+					Assert.That(db.GetTable<NullableTestTable1>()
+						.Where(r => r.Id == RID && !set.Contains(r.TestField)).Count(), Is.EqualTo(0));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapContainsList4()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var set = new HashSet<TestEnum2?>();
+					set.Add(TestEnum2.Value2);
+
+					Assert.That(db.GetTable<NullableTestTable2>()
+						.Where(r => r.Id == RID && set.Contains(r.TestField)).Count(), Is.EqualTo(1));
+					Assert.That(db.GetTable<NullableTestTable2>()
+						.Where(r => r.Id == RID && !set.Contains(r.TestField)).Count(), Is.EqualTo(0));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapIntermediateObject1()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.That(
+						db.GetTable<TestTable1>()
+						.Select(r => new {r.Id, r.TestField})
+						.Where(r => r.Id == RID && r.TestField == TestEnum1.Value2).Count(), Is.EqualTo(1));
+				}
+			});
+		}
+
+		//////[Test]
+		public void EnumMapIntermediateObject2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.That(
+						db.GetTable<TestTable2>()
+						.Select(r => new { r.Id, r.TestField })
+						.Where(r => r.Id == RID && r.TestField == TestEnum2.Value2).Count(), Is.EqualTo(1));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapIntermediateObject3()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.That(
+						db.GetTable<NullableTestTable1>()
+						.Select(r => new { r.Id, r.TestField })
+						.Where(r => r.Id == RID && r.TestField == TestEnum1.Value2).Count(), Is.EqualTo(1));
+				}
+			});
+		}
+
+		//////[Test]
+		public void EnumMapIntermediateObject4()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.That(
+						db.GetTable<NullableTestTable2>()
+						.Select(r => new { r.Id, r.TestField })
+						.Where(r => r.Id == RID && r.TestField == TestEnum2.Value2).Count(), Is.EqualTo(1));
+				}
+			});
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Exceptions/Aggregation.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,47 @@
+using System;
+using System.Linq;
+
+using NUnit.Framework;
+
+namespace Data.Exceptions
+{
+	using Linq;
+
+	[TestFixture]
+	public class Aggregtion : TestBase
+	{
+		[Test, ExpectedException(typeof(InvalidOperationException))]
+		public void NonNullableMax1()
+		{
+			ForEachProvider(typeof(InvalidOperationException), db =>
+			{
+				var value = db.Parent.Where(_ => _.ParentID < 0).Max(_ => _.ParentID);
+			});
+		}
+
+		[Test]
+		public void NonNullableMax2()
+		{
+			ForEachProvider(db =>
+			{
+				var q =
+					from p in db.Parent
+					select new
+					{
+						max = p.Children.Where(_ => _.ParentID < 0).Max(_ => _.ParentID)
+					};
+
+				Assert.Catch<InvalidOperationException>(() => q.ToList());
+			});
+		}
+
+		[Test, ExpectedException(typeof(InvalidOperationException))]
+		public void NonNullableAverage()
+		{
+			ForEachProvider(typeof(InvalidOperationException), db =>
+			{
+				var value = db.Parent.Where(_ => _.ParentID < 0).Average(_ => _.ParentID);
+			});
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Exceptions/Common.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,93 @@
+using System;
+using System.Collections.Generic;
+
+using BLToolkit.Common;
+using BLToolkit.Data;
+using BLToolkit.Data.Linq;
+using BLToolkit.Data.Sql;
+
+using NUnit.Framework;
+
+namespace Data.Exceptions
+{
+	using Linq;
+	using Linq.Model;
+
+	[TestFixture]
+	public class Common : TestBase
+	{
+		class MyDbManager : TestDbManager
+		{
+			public MyDbManager() : base("Sql2008") {}
+
+			protected override SqlQuery ProcessQuery(SqlQuery sqlQuery)
+			{
+				if (sqlQuery.IsInsert && sqlQuery.Insert.Into.Name == "Parent")
+				{
+					var expr =
+						new QueryVisitor().Find(sqlQuery.Insert, e =>
+						{
+							if (e.ElementType == QueryElementType.SetExpression)
+							{
+								var se = (SqlQuery.SetExpression)e;
+								return ((SqlField)se.Column).Name == "ParentID";
+							}
+
+							return false;
+						}) as SqlQuery.SetExpression;
+
+					if (expr != null)
+					{
+						var value = ConvertTo<int>.From(((IValueContainer)expr.Expression).Value);
+
+						if (value == 555)
+						{
+							var tableName = "Parent1";
+							var dic       = new Dictionary<IQueryElement,IQueryElement>();
+
+							sqlQuery = new QueryVisitor().Convert(sqlQuery, e =>
+							{
+								if (e.ElementType == QueryElementType.SqlTable)
+								{
+									var oldTable = (SqlTable)e;
+
+									if (oldTable.Name == "Parent")
+									{
+										var newTable = new SqlTable(oldTable) { Name = tableName, PhysicalName = tableName };
+
+										foreach (var field in oldTable.Fields.Values)
+											dic.Add(field, newTable.Fields[field.Name]);
+
+										return newTable;
+									}
+								}
+
+								IQueryElement ex;
+								return dic.TryGetValue(e, out ex) ? ex : null;
+							});
+						}
+					}
+				}
+
+				return sqlQuery;
+			}
+		}
+
+		[Test, ExpectedException(typeof(DataException), ExpectedMessage = "Invalid object name 'Parent1'.")]
+		public void ReplaceTableTest([IncludeDataContexts("Sql2008", "Sql2012")] string context)
+		{
+			using (var db = new MyDbManager())
+			{
+				var n = 555;
+
+				db.Parent.Insert(() => new Parent
+				{
+					ParentID = n,
+					Value1   = n
+				});
+
+				db.Parent.Delete(p => p.ParentID == n);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Exceptions/DataExceptionTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,31 @@
+using System;
+using System.Linq;
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+
+using NUnit.Framework;
+
+namespace Data.Linq.Exceptions
+{
+	using Model;
+
+	[TestFixture]
+	public class DataExceptionTest
+	{
+		[Test]
+		public void ParameterPrefixTest()
+		{
+			try
+			{
+				using (var db = new DbManager(new MySqlDataProvider(), "Server=DBHost;Port=3306;Database=nodatabase;Uid=bltoolkit;Pwd=TestPassword;"))
+				{
+					db.GetTable<Person>().ToList();
+				}
+			}
+			catch (DataException ex)
+			{
+				var number = ex.Number;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Exceptions/DmlTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,61 @@
+using System;
+using BLToolkit.Data.Linq;
+
+using NUnit.Framework;
+
+namespace Data.Exceptions
+{
+	using Linq;
+	using Linq.Model;
+
+	[TestFixture]
+	public class DmlTest : TestBase
+	{
+		[Test, ExpectedException(typeof(LinqException))]
+		public void InsertOrUpdate1()
+		{
+			try
+			{
+				ForEachProvider(db =>
+					db.Doctor.InsertOrUpdate(
+						() => new Doctor
+						{
+							PersonID  = 10,
+							Taxonomy = "....",
+						},
+						p => new Doctor
+						{
+							Taxonomy = "...",
+						}));
+			}
+			catch (Exception ex)
+			{
+				Assert.IsTrue(ex.Message.StartsWith("InsertOrUpdate method requires the 'Doctor' table to have a primary key."));
+				throw;
+			}
+		}
+
+		[Test, ExpectedException(typeof(LinqException))]
+		public void InsertOrUpdate2()
+		{
+			try
+			{
+				ForEachProvider(db =>
+					db.Patient.InsertOrUpdate(
+						() => new Patient
+						{
+							Diagnosis = "....",
+						},
+						p => new Patient
+						{
+							Diagnosis = "...",
+						}));
+			}
+			catch (Exception ex)
+			{
+				Assert.IsTrue(ex.Message.StartsWith("InsertOrUpdate method requires the 'Patient.PersonID' field to be included in the insert setter."));
+				throw;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Exceptions/ElementOperationTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,24 @@
+using System;
+using System.Linq;
+using Data.Linq;
+
+using NUnit.Framework;
+
+namespace Data.Exceptions
+{
+	[TestFixture]
+	public class ElementOperationTest : TestBase
+	{
+		[Test, ExpectedException(typeof(InvalidOperationException))]
+		public void First()
+		{
+			ForEachProvider(typeof(InvalidOperationException), db => db.Parent.First(p => p.ParentID == 100));
+		}
+
+		[Test, ExpectedException(typeof(InvalidOperationException))]
+		public void Single()
+		{
+			ForEachProvider(typeof(InvalidOperationException), db => db.Parent.Single());
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Exceptions/Inheritance.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,25 @@
+using System;
+using System.Linq;
+
+using NUnit.Framework;
+
+using BLToolkit.Data.Linq;
+
+namespace Data.Exceptions
+{
+	using Linq;
+
+	[TestFixture]
+	public class Inheritance : TestBase
+	{
+		[Test, ExpectedException(typeof(LinqException))]
+		public void Test1()
+		{
+			ForEachProvider(typeof(LinqException), db =>
+			{
+				var q = from p in db.ParentInheritance2 select p;
+				q.ToList();
+			});
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Exceptions/JoinTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,30 @@
+using System;
+using System.Linq;
+
+using NUnit.Framework;
+
+using BLToolkit.Data.Linq;
+
+namespace Data.Exceptions
+{
+	using Linq;
+	using Linq.Model;
+
+	[TestFixture]
+	public class JoinTest : TestBase
+	{
+		[Test, ExpectedException(typeof(LinqException))]
+		public void InnerJoin()
+		{
+			ForEachProvider(typeof(NotSupportedException), db =>
+			{
+				var q =
+					from p1 in db.Person
+						join p2 in db.Person on new Person { FirstName = "", ID = p1.ID } equals new Person { ID = p2.ID }
+					where p1.ID == 1
+					select new Person { ID = p1.ID, FirstName = p2.FirstName };
+				q.ToList();
+			});
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Exceptions/Mapping.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,41 @@
+using System;
+using System.Linq;
+
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+using NUnit.Framework;
+
+namespace Data.Exceptions
+{
+	using Linq;
+
+	[TestFixture]
+	public class Mapping : TestBase
+	{
+		[Test, ExpectedException(typeof(LinqException))]
+		public void MapIgnore1()
+		{
+			ForEachProvider(typeof(LinqException), db =>
+			{
+				var q = from p in db.Person where p.Name == "123" select p;
+				q.ToList();
+			});
+		}
+
+		[TableName("Person")]
+		public class TestPerson1
+		{
+			            public int    PersonID;
+			[MapIgnore] public string FirstName;
+		}
+
+		[Test, ExpectedException(typeof(LinqException))]
+		public void MapIgnore2()
+		{
+			ForEachProvider(typeof(LinqException), db =>
+				db.GetTable<TestPerson1>().FirstOrDefault(_ => _.FirstName == null));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/ExplicitInterfaceTests.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,121 @@
+using System;
+using System.Linq;
+
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	[TestFixture]
+	public class ExplicitInterfaceTests : TestBase
+	{
+		interface IDate
+		{
+			DateTime? Date { get; }
+		}
+
+		interface IDate2
+		{
+			DateTime? Date { get; set; }
+		}
+
+		[TableName("LinqDataTypes")]
+		class TestTable : IDate
+		{
+			[MapField("GuidValue")]
+			Guid? GuidValue { get; set; }
+
+			[MapField("BoolValue")]
+			public bool? Bit { get; set; }
+
+			private DateTime? _date;
+
+			[MapField("DateTimeValue", Storage = "_date")]
+			DateTime? IDate.Date
+			{
+				get
+				{
+					return _date;
+				}
+			}
+		}
+
+		[TableName("LinqDataTypes")]
+		public class TestTable2 : IDate
+		{
+			[MapField("GuidValue")]
+			Guid? GuidValue { get; set; }
+
+			[MapField("BoolValue")]
+			public bool? Bit { get; set; }
+
+			private DateTime? _date;
+
+			[MapField("DateTimeValue", Storage = "_date")]
+			DateTime? IDate.Date
+			{
+				get
+				{
+					return _date;
+				}
+			}
+		}
+
+		[TableName("LinqDataTypes")]
+		public class TestTable3 : IDate2
+		{
+			[MapField("GuidValue")]
+			Guid? GuidValue { get; set; }
+
+			[MapField("BoolValue")]
+			public bool? Bit { get; set; }
+
+			[MapField("DateTimeValue")]
+			DateTime? IDate2.Date
+			{
+				get;
+				set;
+			}
+		}
+
+		static IQueryable<T> SelectNoDate<T>(IQueryable<T> items) where T : IDate
+		{
+			return items.Where(i => i.Date == null);
+		}
+
+		static IQueryable<T> SelectNoDate2<T>(IQueryable<T> items) where T : IDate2
+		{
+			return items.Where(i => i.Date == null);
+		}
+
+		[Test]
+		public void ExplicitInterface1()
+		{
+			using (var db = new TestDbManager())
+			{
+				var result = SelectNoDate(db.GetTable<TestTable>()).ToList();
+			}
+		}
+
+		[Test]
+		public void ExplicitInterface2()
+		{
+			using (var db = new TestDbManager())
+			{
+				var result = SelectNoDate(db.GetTable<TestTable2>()).ToList();
+			}
+		}
+
+		[Test]
+		public void ExplicitInterface3()
+		{
+			using (var db = new TestDbManager())
+			{
+				var result = SelectNoDate2(db.GetTable<TestTable3>()).ToList();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/ExpressionsTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,288 @@
+using System;
+using System.Linq;
+using System.Linq.Expressions;
+
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class ExpressionsTest : TestBase
+	{
+		static int Count1(Parent p) { return p.Children.Count(c => c.ChildID > 0); }
+
+		[Test]
+		public void MapMember1()
+		{
+			Expressions.MapMember<Parent,int>(p => Count1(p), p => p.Children.Count(c => c.ChildID > 0));
+
+			ForEachProvider(db => AreEqual(Parent.Select(p => Count1(p)), db.Parent.Select(p => Count1(p))));
+		}
+
+		static int Count2(Parent p, int id) { return p.Children.Count(c => c.ChildID > id); }
+
+		[Test]
+		public void MapMember2()
+		{
+			Expressions.MapMember<Parent,int,int>((p,id) => Count2(p, id), (p, id) => p.Children.Count(c => c.ChildID > id));
+
+			ForEachProvider(db => AreEqual(Parent.Select(p => Count2(p, 1)), db.Parent.Select(p => Count2(p, 1))));
+		}
+
+		static int Count3(Parent p, int id) { return p.Children.Count(c => c.ChildID > id) + 2; }
+
+		[Test]
+		public void MapMember3()
+		{
+			Expressions.MapMember<Parent,int,int>((p,id) => Count3(p, id), (p, id) => p.Children.Count(c => c.ChildID > id) + 2);
+
+			var n = 2;
+
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(Parent.Select(p => Count3(p, n)), db.Parent.Select(p => Count3(p, n))));
+		}
+
+		[MethodExpression("Count4Expression")]
+		static int Count4(Parent p, int id, int n)
+		{
+			return (_count4Expression ?? (_count4Expression = Count4Expression().Compile()))(p, id, n);
+		}
+
+		static Func<Parent,int,int,int> _count4Expression;
+
+		static Expression<Func<Parent,int,int,int>> Count4Expression()
+		{
+			return (p, id, n) => p.Children.Count(c => c.ChildID > id) + n;
+		}
+
+		[Test]
+		public void MethodExpression4()
+		{
+			var n = 3;
+
+			ForEachProvider(db => AreEqual(
+				   Parent.Select(p => Count4(p, n, 4)),
+				db.Parent.Select(p => Count4(p, n, 4))));
+		}
+
+		[MethodExpression("Count5Expression")]
+		static int Count5(ITestDataContext db, Parent p, int n)
+		{
+			return (_count5Expression ?? (_count5Expression = Count5Expression().Compile()))(db, p, n);
+		}
+
+		static Func<ITestDataContext,Parent,int,int> _count5Expression;
+
+		static Expression<Func<ITestDataContext,Parent,int,int>> Count5Expression()
+		{
+			return (db, p, n) => Sql.AsSql(db.Child.Where(c => c.ParentID == p.ParentID).Count() + n);
+		}
+
+		[Test]
+		public void MethodExpression5()
+		{
+			var n = 2;
+
+			ForEachProvider(new[] { ProviderName.SqlCe, ProviderName.Firebird }, db => AreEqual(
+				   Parent.Select(p => Child.Where(c => c.ParentID == p.ParentID).Count() + n),
+				db.Parent.Select(p => Count5(db, p, n))));
+		}
+
+		[MethodExpression("Count6Expression")]
+		static int Count6(Table<Child> c, Parent p)
+		{
+			return (_count6Expression ?? (_count6Expression = Count6Expression().Compile()))(c, p);
+		}
+
+		static Func<Table<Child>,Parent,int> _count6Expression;
+
+		static Expression<Func<Table<Child>,Parent,int>> Count6Expression()
+		{
+			return (ch, p) => ch.Where(c => c.ParentID == p.ParentID).Count();
+		}
+
+		[Test]
+		public void MethodExpression6()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.Select(p => Child.Where(c => c.ParentID == p.ParentID).Count()),
+				db.Parent.Select(p => Count6(db.Child, p))));
+		}
+
+		[MethodExpression("Count7Expression")]
+		static int Count7(Table<Child> ch, Parent p, int n)
+		{
+			return (_count7Expression ?? (_count7Expression = Count7Expression().Compile()))(ch, p, n);
+		}
+
+		static Func<Table<Child>,Parent,int,int> _count7Expression;
+
+		static Expression<Func<Table<Child>,Parent,int,int>> Count7Expression()
+		{
+			return (ch, p, n) => Sql.AsSql(ch.Where(c => c.ParentID == p.ParentID).Count() + n);
+		}
+
+		[Test]
+		public void MethodExpression7()
+		{
+			var n = 2;
+
+			ForEachProvider(new[] { ProviderName.SqlCe, ProviderName.Firebird }, db => AreEqual(
+				   Parent.Select(p => Child.Where(c => c.ParentID == p.ParentID).Count() + n),
+				db.Parent.Select(p => Count7(db.Child, p, n))));
+		}
+
+		[MethodExpression("Expression8")]
+		static IQueryable<Parent> GetParent(ITestDataContext db, Child ch)
+		{
+			throw new InvalidOperationException();
+		}
+
+		static Expression<Func<ITestDataContext,Child,IQueryable<Parent>>> Expression8()
+		{
+			return (db,ch) =>
+				from p in db.Parent
+				where p.ParentID == (int)Math.Floor(ch.ChildID / 10.0)
+				select p;
+		}
+
+		[Test]
+		public void MethodExpression8()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in Child
+				from p  in
+					from p in Parent
+					where p.ParentID == ch.ChildID / 10
+					select p
+				where ch.ParentID == p.ParentID
+				select ch
+				,
+				from ch in db.Child
+				from p  in GetParent(db, ch)
+				where ch.ParentID == p.ParentID
+				select ch));
+		}
+
+		[Test]
+		public void MethodExpression9()
+		{
+			using (var db = new TestDbManager())
+				AreEqual(
+					from ch in Child
+					from p  in
+						from p in Parent
+						where p.ParentID == ch.ChildID / 10
+						select p
+					where ch.ParentID == p.ParentID
+					select ch
+					,
+					from ch in db.Child
+					from p  in TestDbManager.GetParent9(db, ch)
+					where ch.ParentID == p.ParentID
+					select ch);
+		}
+
+		[Test]
+		public void MethodExpression10()
+		{
+			using (var db = new TestDbManager())
+				AreEqual(
+					from ch in Child
+					from p  in
+						from p in Parent
+						where p.ParentID == ch.ChildID / 10
+						select p
+					where ch.ParentID == p.ParentID
+					select ch
+					,
+					from ch in db.Child
+					from p  in db.GetParent10(ch)
+					where ch.ParentID == p.ParentID
+					select ch);
+		}
+
+		[MethodExpression("GetBoolExpression1")]
+		static bool GetBool1<T>(T obj)
+		{
+			throw new InvalidOperationException();
+		}
+
+		static Expression<Func<T,bool>> GetBoolExpression1<T>()
+			where T : class
+		{
+			return obj => obj != null;
+		}
+
+		[Test]
+		public void TestGenerics1()
+		{
+			using (var db = new TestDbManager())
+			{
+				var q =
+					from ch in db.Child
+					where GetBool1(ch.Parent)
+					select ch;
+
+				q.ToList();
+			}
+		}
+
+		[MethodExpression("GetBoolExpression2_{0}")]
+		static bool GetBool2<T>(T obj)
+		{
+			throw new InvalidOperationException();
+		}
+
+		static Expression<Func<Parent,bool>> GetBoolExpression2_Parent()
+		{
+			return obj => obj != null;
+		}
+
+		[Test]
+		public void TestGenerics2()
+		{
+			using (var db = new TestDbManager())
+			{
+				var q =
+					from ch in db.Child
+					where GetBool2(ch.Parent)
+					select ch;
+
+				q.ToList();
+			}
+		}
+
+		class TestClass<T>
+		{
+			[MethodExpression("GetBoolExpression3")]
+			public static bool GetBool3(Parent obj)
+			{
+				throw new InvalidOperationException();
+			}
+
+			static Expression<Func<Parent,bool>> GetBoolExpression3()
+			{
+				return obj => obj != null;
+			}
+		}
+
+		[Test]
+		public void TestGenerics3()
+		{
+			using (var db = new TestDbManager())
+			{
+				var q =
+					from ch in db.Child
+					where TestClass<int>.GetBool3(ch.Parent)
+					select ch;
+
+				q.ToList();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/ExtensionTests.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,53 @@
+using System;
+using System.Linq;
+
+using BLToolkit.Data.Linq;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class ExtensionTests : TestBase
+	{
+		public class ParenTable
+		{
+			public int  ParentID;
+			public int? Value1;
+		}
+
+		[Test]
+		public void TableName([IncludeDataContexts("Sql2008", "Sql2012")] string context)
+		{
+			using (var db = new TestDbManager(context))
+				db.GetTable<ParenTable>().TableName("Parent").ToList();
+		}
+
+		[Test]
+		public void DatabaseName([IncludeDataContexts("Sql2008")] string context)
+		{
+			using (var db = new TestDbManager(context))
+				db.GetTable<Parent>().DatabaseName("TestData").ToList();
+		}
+
+		[Test]
+		public void OwnerName([IncludeDataContexts("Sql2008", "Sql2012")] string context)
+		{
+			using (var db = new TestDbManager(context))
+				db.GetTable<Parent>().OwnerName("dbo").ToList();
+		}
+
+		[Test]
+		public void AllNames([IncludeDataContexts("Sql2008")] string context)
+		{
+			using (var db = new TestDbManager(context))
+				db.GetTable<ParenTable>()
+					.DatabaseName("TestData")
+					.OwnerName("dbo")
+					.TableName("Parent")
+					.ToList();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Functions.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,349 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+
+using NUnit.Framework;
+
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class Functions : TestBase
+	{
+		[Test]
+		public void Contains1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where new[] { 1, 2 }.Contains(p.ParentID) select p,
+				from p in db.Parent where new[] { 1, 2 }.Contains(p.ParentID) select p));
+		}
+
+		[Test]
+		public void Contains2()
+		{
+			var arr = new[] { 1, 2 };
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where arr.Contains(p.ParentID) select p,
+				from p in db.Parent where arr.Contains(p.ParentID) select p));
+		}
+
+		[Test]
+		public void Contains3()
+		{
+			var n = 2;
+
+			var expected =
+				from p in Parent
+				where new[] { 1, n }.Contains(p.ParentID)
+				select p;
+
+			ForEachProvider(data => AreEqual(expected, CompiledQuery.Compile<ITestDataContext,IQueryable<Parent>>(db =>
+				from p in db.Parent
+				where new[] { 1, n }.Contains(p.ParentID)
+				select p)(data)));
+		}
+
+		[Test]
+		public void Contains4()
+		{
+			var arr = new[] { 1, 2 };
+
+			var expected =
+				from p in Parent
+				where arr.Contains(p.ParentID)
+				select p;
+
+			ForEachProvider(data => AreEqual(expected, CompiledQuery.Compile<ITestDataContext,IQueryable<Parent>>(db =>
+				from p in db.Parent
+				where arr.Contains(p.ParentID)
+				select p)(data)));
+		}
+
+		[Test]
+		public void Contains5()
+		{
+			var arr1 = new[] { 1, 2 };
+			var arr2 = new[] { 1, 2, 4 };
+
+			var expected1 = from p in Parent where arr1.Contains(p.ParentID) select p;
+			var expected2 = from p in Parent where arr2.Contains(p.ParentID) select p;
+
+			ForEachProvider(data =>
+			{
+				var cq = CompiledQuery.Compile<ITestDataContext,int[],IQueryable<Parent>>((db,a) =>
+					from p in db.Parent
+					where a.Contains(p.ParentID)
+					select p);
+
+				AreEqual(expected1, cq(data, arr1));
+				AreEqual(expected2, cq(data, arr2));
+			});
+		}
+
+		[Test]
+		public void Contains6()
+		{
+			var arr = new List<int> { 1, 2 };
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where arr.Contains(p.ParentID) select p,
+				from p in db.Parent where arr.Contains(p.ParentID) select p));
+		}
+
+		[Test]
+		public void Contains7()
+		{
+			IEnumerable<int> arr = new[] { 1, 2 };
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where arr.Contains(p.ParentID) select p,
+				from p in db.Parent where arr.Contains(p.ParentID) select p));
+		}
+
+		[Test]
+		public void ContainsKey1()
+		{
+			var arr = new Dictionary<int,int>
+			{
+				{ 1, 1 },
+				{ 2, 2 },
+			};
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where arr.Keys.Contains(p.ParentID) select p,
+				from p in db.Parent where arr.Keys.Contains(p.ParentID) select p));
+		}
+
+		[Test]
+		public void ContainsKey2()
+		{
+			var arr = new Dictionary<int,int>
+			{
+				{ 1, 1 },
+				{ 2, 2 },
+			};
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where arr.ContainsKey(p.ParentID) select p,
+				from p in db.Parent where arr.ContainsKey(p.ParentID) select p));
+		}
+
+		[Test]
+		public void ContainsValue1()
+		{
+			var arr = new Dictionary<int,int>
+			{
+				{ 1, 1 },
+				{ 2, 2 },
+			};
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where arr.Values.Contains(p.ParentID) select p,
+				from p in db.Parent where arr.Values.Contains(p.ParentID) select p));
+		}
+
+		[Test]
+		public void ContainsValue2()
+		{
+			var arr = new Dictionary<int,int>
+			{
+				{ 1, 1 },
+				{ 2, 2 },
+			};
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where arr.ContainsValue(p.ParentID) select p,
+				from p in db.Parent where arr.ContainsValue(p.ParentID) select p));
+		}
+
+		[Test]
+		public void ContainsHashSet1()
+		{
+			var arr = new HashSet<int> { 1, 2 };
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where arr.Contains(p.ParentID) select p,
+				from p in db.Parent where arr.Contains(p.ParentID) select p));
+		}
+
+		[Test]
+		public void EmptyContains1()
+		{
+			var expected =
+				from p in Parent
+				where new int[0].Contains(p.ParentID) || p.ParentID == 2
+				select p;
+
+			ForEachProvider(db => AreEqual(expected,
+				from p in db.Parent
+				where new int[0].Contains(p.ParentID) || p.ParentID == 2
+				select p));
+		}
+
+		[Test]
+		public void ContainsString11()
+		{
+			var arr = new List<string> { "John" };
+
+			ForEachProvider(db => AreEqual(
+				from p in    Person where arr.Contains(p.FirstName) select p,
+				from p in db.Person where arr.Contains(p.FirstName) select p));
+		}
+
+		[Test]
+		public void ContainsString12()
+		{
+			var nm = "John";
+
+			ForEachProvider(db => AreEqual(
+				from p in    Person where new List<string> { nm }.Contains(p.FirstName) select p,
+				from p in db.Person where new List<string> { nm }.Contains(p.FirstName) select p));
+		}
+
+		[Test]
+		public void ContainsString13()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Person where new List<string> { "John" }.Contains(p.FirstName) select p,
+				from p in db.Person where new List<string> { "John" }.Contains(p.FirstName) select p));
+		}
+
+		[Test]
+		public void ContainsString21()
+		{
+			var arr = new[] { "John" };
+
+			ForEachProvider(db => AreEqual(
+				from p in    Person where arr.Contains(p.FirstName) select p,
+				from p in db.Person where arr.Contains(p.FirstName) select p));
+		}
+
+		[Test]
+		public void ContainsString22()
+		{
+			var nm = "John";
+
+			ForEachProvider(db => AreEqual(
+				from p in    Person where new[] { nm }.Contains(p.FirstName) select p,
+				from p in db.Person where new[] { nm }.Contains(p.FirstName) select p));
+		}
+
+		[Test]
+		public void ContainsString23()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Person where new[] { "John" }.Contains(p.FirstName) select p,
+				from p in db.Person where new[] { "John" }.Contains(p.FirstName) select p));
+		}
+
+		[Test]
+		public void Equals1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where p.ParentID.Equals(2) select p,
+				from p in db.Parent where p.ParentID.Equals(2) select p));
+		}
+
+		[Test]
+		public void Equals2()
+		{
+			var child    = (from ch in Child where ch.ParentID == 2 select ch).First();
+			var expected = from ch in Child where !ch.Equals(child) select ch;
+
+			ForEachProvider(db => AreEqual(expected, from ch in db.Child where !ch.Equals(child) select ch));
+		}
+
+		[Test]
+		public void Equals3()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where p.Value1.Equals(null) select p,
+				from p in db.Parent where p.Value1.Equals(null) select p));
+		}
+
+		[Test]
+		public void Equals4([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+				AreEqual(
+					   Customer.Where(c => !c.Address.Equals(null)),
+					db.Customer.Where(c => !c.Address.Equals(null)));
+		}
+
+		[Test]
+		public void NewGuid1()
+		{
+			ForEachProvider(new[] { ProviderName.DB2, ProviderName.Informix, ProviderName.PostgreSQL, ProviderName.SQLite, ProviderName.Access }, db => AreEqual(
+				from p in    Types where p.GuidValue != Sql.NewGuid() select p.GuidValue,
+				from p in db.Types where p.GuidValue != Sql.NewGuid() select p.GuidValue));
+		}
+
+		[Test]
+		public void NewGuid2()
+		{
+			ForEachProvider(new[] { ProviderName.DB2, ProviderName.Informix, ProviderName.PostgreSQL, ProviderName.SQLite, ProviderName.Access }, db =>
+				Assert.AreNotEqual(Guid.Empty, (from p in db.Types select Sql.NewGuid()).First()));
+		}
+
+		[Test]
+		public void CustomFunc()
+		{
+			Expressions.MapMember<Person>(p => p.FullName(), (Expression<Func<Person,string>>)(p => p.LastName + ", " + p.FirstName));
+
+			ForEachProvider(db => AreEqual(
+				from p in    Person where p.FullName() == "Pupkin, John" select p.FullName(),
+				from p in db.Person where p.FullName() == "Pupkin, John" select p.FullName()));
+		}
+
+		[Test]
+		public void Count1()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				   Child.Count(c => c.ParentID == 1),
+				db.Child.Count(c => c.ParentID == 1)));
+		}
+
+		[Test]
+		public void Sum1()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				   Child.Sum(c => c.ParentID),
+				db.Child.Sum(c => c.ParentID)));
+		}
+
+		[MethodExpression("ChildCountExpression")]
+		public static int ChildCount(Parent parent)
+		{
+			throw new NotSupportedException();
+		}
+
+		static Expression ChildCountExpression()
+		{
+			return
+				(Expression<Func<Parent, int>>)
+				(p => p.Children.Where(c => c.ParentID > 2).Sum(c => c.ParentID * c.ChildID));
+		}
+
+		[Test]
+		public void Sum2()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.Select(p => p.Children.Where(c => c.ParentID > 2).Sum(c => c.ParentID * c.ChildID)),
+				db.Parent.Select(p => ChildCount(p))));
+		}
+	}
+
+	public static class PersonExtension
+	{
+		static public string FullName(this Person person)
+		{
+			return person.LastName + ", " + person.FirstName;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/GenerateTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,32 @@
+using System;
+using System.Linq;
+using System.Linq.Expressions;
+
+using NUnit.Framework;
+
+using BLToolkit.Linq;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class GenerateTest : TestBase
+	{
+		[Test]
+		public void GeneratePredicate()
+		{
+			Expression<Func<Person,bool>> a = x => x.FirstName == "John";
+			Expression<Func<Person,bool>> b = x => x.LastName  == "Pupkin";
+
+			var bBody     = b.Body.Convert(e => e == b.Parameters[0] ? a.Parameters[0] : e);
+			var predicate = Expression.Lambda<Func<Person,bool>>(Expression.AndAlso(a.Body, bBody), a.Parameters[0]);
+
+			using (var db = new TestDbManager())
+			{
+				var q = db.Person.Where(predicate);
+				var p = q.First();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/GroupByTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1535 @@
+using System;
+using System.Linq;
+
+using NUnit.Framework;
+
+using BLToolkit.Data.DataProvider;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class GroupByTest : TestBase
+	{
+		[Test]
+		public void Simple1()
+		{
+			BLToolkit.Common.Configuration.Linq.PreloadGroups = true;
+
+			ForEachProvider(db =>
+			{
+				var q =
+					from ch in db.Child
+					group ch by ch.ParentID;
+
+				var list = q.ToList().Where(n => n.Key < 6).OrderBy(n => n.Key).ToList();
+
+				Assert.AreEqual(4, list.Count);
+
+				for (var i = 0; i < list.Count; i++)
+				{
+					var values = list[i].OrderBy(c => c.ChildID).ToList();
+
+					Assert.AreEqual(i + 1, list[i].Key);
+					Assert.AreEqual(i + 1, values.Count);
+
+					for (var j = 0; j < values.Count; j++)
+						Assert.AreEqual((i + 1) * 10 + j + 1, values[j].ChildID);
+				}
+			});
+		}
+
+		[Test]
+		public void Simple2()
+		{
+			BLToolkit.Common.Configuration.Linq.PreloadGroups = false;
+
+			ForEachProvider(db =>
+			{
+				var q =
+					from ch in db.GrandChild
+					group ch by new { ch.ParentID, ch.ChildID };
+
+				var list = q.ToList();
+
+				Assert.AreEqual   (8, list.Count);
+				Assert.AreNotEqual(0, list.OrderBy(c => c.Key.ParentID).First().ToList().Count);
+			});
+		}
+
+		[Test]
+		public void Simple3()
+		{
+			ForEachProvider(db =>
+			{
+				var q =
+					from ch in db.Child
+					group ch by ch.ParentID into g
+					select g.Key;
+
+				var list = q.ToList().Where(n => n < 6).OrderBy(n => n).ToList();
+
+				Assert.AreEqual(4, list.Count);
+				for (var i = 0; i < list.Count; i++) Assert.AreEqual(i + 1, list[i]);
+			});
+		}
+
+		[Test]
+		public void Simple4()
+		{
+			ForEachProvider(db =>
+			{
+				var q =
+					from ch in db.Child
+					group ch by ch.ParentID into g
+					orderby g.Key
+					select g.Key;
+
+				var list = q.ToList().Where(n => n < 6).ToList();
+
+				Assert.AreEqual(4, list.Count);
+				for (var i = 0; i < list.Count; i++) Assert.AreEqual(i + 1, list[i]);
+			});
+		}
+
+		[Test]
+		public void Simple5()
+		{
+			var expected =
+				from ch in GrandChild
+				group ch by new { ch.ParentID, ch.ChildID } into g
+				group g  by new { g.Key.ParentID }          into g
+				select g.Key;
+
+			ForEachProvider(db => AreEqual(expected,
+				from ch in db.GrandChild
+				group ch by new { ch.ParentID, ch.ChildID } into g
+				group g  by new { g.Key.ParentID }          into g
+				select g.Key));
+		}
+
+		[Test]
+		public void Simple6()
+		{
+			ForEachProvider(db =>
+			{
+				var q    = db.GrandChild.GroupBy(ch => new { ch.ParentID, ch.ChildID }, ch => ch.GrandChildID);
+				var list = q.ToList();
+
+				Assert.AreNotEqual(0, list[0].Count());
+				Assert.AreEqual   (8, list.Count);
+			});
+		}
+
+		[Test]
+		public void Simple7()
+		{
+			ForEachProvider(db =>
+			{
+				var q = db.GrandChild
+					.GroupBy(ch => new { ch.ParentID, ch.ChildID }, ch => ch.GrandChildID)
+					.Select (gr => new { gr.Key.ParentID, gr.Key.ChildID });
+
+				var list = q.ToList();
+				Assert.AreEqual(8, list.Count);
+			});
+		}
+
+		[Test]
+		public void Simple8()
+		{
+			ForEachProvider(db =>
+			{
+				var q = db.GrandChild.GroupBy(ch => new { ch.ParentID, ch.ChildID }, (g,ch) => g.ChildID);
+
+				var list = q.ToList();
+				Assert.AreEqual(8, list.Count);
+			});
+		}
+
+		[Test]
+		public void Simple9()
+		{
+			ForEachProvider(db =>
+			{
+				var q    = db.GrandChild.GroupBy(ch => new { ch.ParentID, ch.ChildID }, ch => ch.GrandChildID,  (g,ch) => g.ChildID);
+				var list = q.ToList();
+
+				Assert.AreEqual(8, list.Count);
+			});
+		}
+
+		[Test]
+		public void Simple10()
+		{
+			var expected = (from ch in Child group ch by ch.ParentID into g select g).ToList().OrderBy(p => p.Key).ToList();
+
+			ForEachProvider(db =>
+			{
+				var result = (from ch in db.Child group ch by ch.ParentID into g select g).ToList().OrderBy(p => p.Key).ToList();
+
+				AreEqual(expected[0], result[0]);
+				AreEqual(expected.Select(p => p.Key), result.Select(p => p.Key));
+				AreEqual(expected[0].ToList(), result[0].ToList());
+			});
+		}
+
+		[Test]
+		public void Simple11()
+		{
+			ForEachProvider(db =>
+			{
+				var q1 = GrandChild
+					.GroupBy(ch => new { ParentID = ch.ParentID + 1, ch.ChildID }, ch => ch.ChildID);
+
+				var q2 = db.GrandChild
+					.GroupBy(ch => new { ParentID = ch.ParentID + 1, ch.ChildID }, ch => ch.ChildID);
+
+				var list1 = q1.AsEnumerable().OrderBy(_ => _.Key.ChildID).ToList();
+				var list2 = q2.AsEnumerable().OrderBy(_ => _.Key.ChildID).ToList();
+
+				Assert.AreEqual(list1.Count,       list2.Count);
+				Assert.AreEqual(list1[0].ToList(), list2[0].ToList());
+			});
+		}
+
+		[Test]
+		public void Simple12()
+		{
+			ForEachProvider(db =>
+			{
+				var q = db.GrandChild
+					.GroupBy(ch => new { ParentID = ch.ParentID + 1, ch.ChildID }, (g,ch) => g.ChildID);
+
+				var list = q.ToList();
+				Assert.AreEqual(8, list.Count);
+			});
+		}
+
+		[Test]
+		public void Simple13()
+		{
+			ForEachProvider(db =>
+			{
+				var q = db.GrandChild
+					.GroupBy(ch => new { ParentID = ch.ParentID + 1, ch.ChildID }, ch => ch.ChildID, (g,ch) => g.ChildID);
+
+				var list = q.ToList();
+				Assert.AreEqual(8, list.Count);
+			});
+		}
+
+		//[Test]
+		public void Simple14()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent
+				select
+					from c in p.Children
+					group c by c.ParentID into g
+					select g.Key,
+				from p in db.Parent
+				select
+					from c in p.Children
+					group c by c.ParentID into g
+					select g.Key));
+		}
+
+		[Test]
+		public void MemberInit1()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in Child
+				group ch by new Child { ParentID = ch.ParentID } into g
+				select g.Key,
+				from ch in db.Child
+				group ch by new Child { ParentID = ch.ParentID } into g
+				select g.Key));
+		}
+
+		class GroupByInfo
+		{
+			public GroupByInfo Prev;
+			public object      Field;
+
+			public override bool Equals(object obj)
+			{
+				return Equals(obj as GroupByInfo);
+			}
+
+			public bool Equals(GroupByInfo other)
+			{
+				if (ReferenceEquals(null, other)) return false;
+				if (ReferenceEquals(this, other)) return true;
+				return Equals(other.Prev, Prev) && Equals(other.Field, Field);
+			}
+
+			public override int GetHashCode()
+			{
+				unchecked
+				{
+					return ((Prev != null ? Prev.GetHashCode() : 0) * 397) ^ (Field != null ? Field.GetHashCode() : 0);
+				}
+			}
+		}
+
+		[Test]
+		public void MemberInit2()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in Child
+				group ch by new GroupByInfo { Prev = new GroupByInfo { Field = ch.ParentID }, Field = ch.ChildID } into g
+				select g.Key,
+				from ch in db.Child
+				group ch by new GroupByInfo { Prev = new GroupByInfo { Field = ch.ParentID }, Field = ch.ChildID } into g
+				select g.Key));
+		}
+
+		[Test]
+		public void MemberInit3()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in Child
+				group ch by new { Prev = new { Field = ch.ParentID }, Field = ch.ChildID } into g
+				select g.Key,
+				from ch in db.Child
+				group ch by new { Prev = new { Field = ch.ParentID }, Field = ch.ChildID } into g
+				select g.Key));
+		}
+
+		[Test]
+		public void SubQuery1()
+		{
+			var n = 1;
+
+			var expected =
+				from ch in
+					from ch in Child select ch.ParentID + 1
+				where ch + 1 > n
+				group ch by ch into g
+				select g.Key;
+
+			ForEachProvider(db => AreEqual(expected,
+				from ch in
+					from ch in db.Child select ch.ParentID + 1
+				where ch > n
+				group ch by ch into g
+				select g.Key));
+		}
+
+		[Test]
+		public void SubQuery2()
+		{
+			var n = 1;
+
+			var expected =
+				from ch in Child select new { ParentID = ch.ParentID + 1 } into ch
+				where ch.ParentID > n
+				group ch by ch into g
+				select g.Key;
+
+			ForEachProvider(db => AreEqual(expected,
+				from ch in db.Child select new { ParentID = ch.ParentID + 1 } into ch
+				where ch.ParentID > n
+				group ch by ch into g
+				select g.Key));
+		}
+
+		[Test]
+		public void SubQuery3()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in
+					from ch in Child
+					select new { ch, n = ch.ChildID + 1 }
+				group ch by ch.n into g
+				select new
+				{
+					g.Key,
+					Sum = g.Sum(_ => _.ch.ParentID)
+				},
+				from ch in
+					from ch in db.Child
+					select new { ch, n = ch.ChildID + 1 }
+				group ch by ch.n into g
+				select new
+				{
+					g.Key,
+					Sum = g.Sum(_ => _.ch.ParentID)
+				}));
+		}
+
+		[Test]
+		public void SubQuery31()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in
+					from ch in Child
+					select new { ch, n = ch.ChildID + 1 }
+				group ch.ch by ch.n into g
+				select new
+				{
+					g.Key,
+					Sum = g.Sum(_ => _.ParentID)
+				},
+				from ch in
+					from ch in db.Child
+					select new { ch, n = ch.ChildID + 1 }
+				group ch.ch by ch.n into g
+				select new
+				{
+					g.Key,
+					Sum = g.Sum(_ => _.ParentID)
+				}));
+		}
+
+		[Test]
+		public void SubQuery32()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in
+					from ch in Child
+					select new { ch, n = ch.ChildID + 1 }
+				group ch.ch.ParentID by ch.n into g
+				select new
+				{
+					g.Key,
+					Sum = g.Sum(_ => _)
+				},
+				from ch in
+					from ch in db.Child
+					select new { ch, n = ch.ChildID + 1 }
+				group ch.ch.ParentID by ch.n into g
+				select new
+				{
+					g.Key,
+					Sum = g.Sum(_ => _)
+				}));
+		}
+
+		[Test]
+		public void SubQuery4()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in Child
+				group ch by new { n = ch.ChildID + 1 } into g
+				select new
+				{
+					g.Key,
+					Sum = g.Sum(_ => _.ParentID)
+				},
+				from ch in db.Child
+				group ch by new { n = ch.ChildID + 1 } into g
+				select new
+				{
+					g.Key,
+					Sum = g.Sum(_ => _.ParentID)
+				}));
+		}
+
+		[Test]
+		public void SubQuery5()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in Child
+				join p in Parent on ch.ParentID equals p.ParentID into pg
+				from p in pg.DefaultIfEmpty()
+				group ch by ch.ChildID into g
+				select g.Sum(_ => _.ParentID),
+				from ch in db.Child
+				join p in db.Parent on ch.ParentID equals p.ParentID into pg
+				from p in pg.DefaultIfEmpty()
+				group ch by ch.ChildID into g
+				select g.Sum(_ => _.ParentID)));
+		}
+
+		[Test]
+		public void SubQuery6()
+		{
+			var expected =
+				from ch in Child select new { ParentID = ch.ParentID + 1 } into ch
+				group ch.ParentID by ch into g
+				select g.Key;
+
+			ForEachProvider(db => AreEqual(expected,
+				from ch in db.Child select new { ParentID = ch.ParentID + 1 } into ch
+				group ch.ParentID by ch into g
+				select g.Key));
+		}
+
+		[Test]
+		public void SubQuery7()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				join c in 
+					from c in Child
+					where c.ParentID == 1
+					select c
+				on p.ParentID equals c.ParentID into g
+				from c in g.DefaultIfEmpty()
+				group p by c == null ? 0 : c.ChildID into gg
+				select new { gg.Key },
+				from p in db.Parent
+				join c in 
+					from c in db.Child
+					where c.ParentID == 1
+					select c
+				on p.ParentID equals c.ParentID into g
+				from c in g.DefaultIfEmpty()
+				group p by c.ChildID into gg
+				select new { gg.Key }));
+		}
+
+		[Test]
+		public void Calculated1()
+		{
+			var expected = 
+				(
+					from ch in Child
+					group ch by ch.ParentID > 2 ? ch.ParentID > 3 ? "1" : "2" : "3"
+					into g select g
+				).ToList().OrderBy(p => p.Key).ToList();
+
+			ForEachProvider(db =>
+			{
+				var result =
+					(
+						from ch in db.Child
+						group ch by ch.ParentID > 2 ? ch.ParentID > 3 ? "1" : "2" : "3"
+						into g select g
+					).ToList().OrderBy(p => p.Key).ToList();
+
+				AreEqual(expected[0], result[0]);
+				AreEqual(expected.Select(p => p.Key), result.Select(p => p.Key));
+			});
+		}
+
+		[Test]
+		public void Calculated2()
+		{
+			var expected =
+				from p in
+					from ch in
+						from ch in Child
+						group ch by ch.ParentID > 2 ? ch.ParentID > 3 ? "1" : "2" : "3"
+						into g select g
+					select ch.Key + "2"
+				where p == "22"
+				select p;
+
+			ForEachProvider(db => AreEqual(expected,
+				from p in
+					from ch in
+						from ch in db.Child
+						group ch by ch.ParentID > 2 ? ch.ParentID > 3 ? "1" : "2" : "3"
+						into g select g
+					select ch.Key + "2"
+				where p == "22"
+				select p));
+		}
+
+		[Test]
+		public void GroupBy1()
+		{
+			ForEachProvider(db => AreEqual(
+				   Child.GroupBy(ch => ch.ParentID).GroupBy(ch => ch).GroupBy(ch => ch).Select(p => p.Key.Key.Key),
+				db.Child.GroupBy(ch => ch.ParentID).GroupBy(ch => ch).GroupBy(ch => ch).Select(p => p.Key.Key.Key)));
+		}
+
+		[Test]
+		public void GroupBy2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				join c in Child on p.ParentID equals c.ParentID
+				group p by new
+				{
+					ID = p.Value1 ?? c.ChildID
+				} into gr
+				select new
+				{
+					gr.Key.ID,
+					ID1 = gr.Key.ID + 1,
+				},
+				from p in db.Parent
+				join c in db.Child on p.ParentID equals c.ParentID
+				group p by new
+				{
+					ID = p.Value1 ?? c.ChildID
+				} into gr
+				select new
+				{
+					gr.Key.ID,
+					ID1 = gr.Key.ID + 1,
+				}));
+		}
+
+		[Test]
+		public void GroupBy3()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				join c in Child on p.ParentID equals c.ParentID
+				group p by p.Value1 ?? c.ChildID into gr
+				select new
+				{
+					gr.Key
+				},
+				from p in db.Parent
+				join c in db.Child on p.ParentID equals c.ParentID
+				group p by p.Value1 ?? c.ChildID into gr
+				select new
+				{
+					gr.Key
+				}));
+		}
+
+		[Test]
+		public void Sum1()
+		{
+			var expected =
+				from ch in Child
+				group ch by ch.ParentID into g
+				select g.Sum(p => p.ChildID);
+
+			ForEachProvider(db => AreEqual(expected,
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				select g.Sum(p => p.ChildID)));
+		}
+
+		[Test]
+		public void Sum2()
+		{
+			var expected =
+				from ch in Child
+				group ch by ch.ParentID into g
+				select new { Sum = g.Sum(p => p.ChildID) };
+
+			ForEachProvider(db => AreEqual(expected,
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				select new { Sum = g.Sum(p => p.ChildID) }));
+		}
+
+		[Test]
+		public void Sum3()
+		{
+			ForEachProvider(
+				new[] { ProviderName.SqlCe },
+				db => AreEqual(
+					from ch in Child
+					group ch by ch.Parent into g
+					select g.Key.Children.Sum(p => p.ChildID),
+					from ch in db.Child
+					group ch by ch.Parent into g
+					select g.Key.Children.Sum(p => p.ChildID)));
+		}
+
+		[Test]
+		public void SumSubQuery1()
+		{
+			var n = 1;
+
+			var expected =
+				from ch in
+					from ch in Child select new { ParentID = ch.ParentID + 1, ch.ChildID }
+				where ch.ParentID + 1 > n group ch by ch into g
+				select g.Sum(p => p.ParentID - 3);
+
+			ForEachProvider(db => AreEqual(expected,
+				from ch in
+					from ch in db.Child select new { ParentID = ch.ParentID + 1, ch.ChildID }
+				where ch.ParentID + 1 > n group ch by ch into g
+				select g.Sum(p => p.ParentID - 3)));
+		}
+
+		[Test]
+		public void GroupByMax()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in    Child group ch.ParentID by ch.ChildID into g select new { Max = g.Max() },
+				from ch in db.Child group ch.ParentID by ch.ChildID into g select new { Max = g.Max() }));
+		}
+
+		[Test]
+		public void Aggregates1()
+		{
+			ForEachProvider(db => AreEqual(
+				from  ch in Child
+				group ch by ch.ParentID into g
+				select new
+				{
+					Cnt = g.Count(),
+					Sum = g.Sum(c => c.ChildID),
+					Min = g.Min(c => c.ChildID),
+					Max = g.Max(c => c.ChildID),
+					Avg = (int)g.Average(c => c.ChildID),
+				},
+				from  ch in db.Child
+				group ch by ch.ParentID into g
+				select new
+				{
+					Cnt = g.Count(),
+					Sum = g.Sum(c => c.ChildID),
+					Min = g.Min(c => c.ChildID),
+					Max = g.Max(c => c.ChildID),
+					Avg = (int)g.Average(c => c.ChildID),
+				}));
+		}
+
+		[Test]
+		public void Aggregates2()
+		{
+			ForEachProvider(db => AreEqual(
+				from  ch in Child
+				group ch by ch.ParentID into g
+				select new
+				{
+					Sum = g.Select(c => c.ChildID).Sum(),
+					Min = g.Select(c => c.ChildID).Min(),
+					Max = g.Select(c => c.ChildID).Max(),
+					Avg = (int)g.Select(c => c.ChildID).Average(),
+					Cnt = g.Count()
+				},
+				from  ch in db.Child
+				group ch by ch.ParentID into g
+				select new
+				{
+					Sum = g.Select(c => c.ChildID).Sum(),
+					Min = g.Select(c => c.ChildID).Min(),
+					Max = g.Select(c => c.ChildID).Max(),
+					Avg = (int)g.Select(c => c.ChildID).Average(),
+					Cnt = g.Count()
+				}));
+		}
+
+		[Test]
+		public void Aggregates3()
+		{
+			ForEachProvider(
+				new[] { ProviderName.SqlCe },
+				db => AreEqual(
+					from  ch in Child
+					where ch.ChildID > 30
+					group ch by ch.ParentID into g
+					select new
+					{
+						Sum =      g.Select(c => c.ChildID).Where(_ => _ > 30).Sum(),
+						Min =      g.Select(c => c.ChildID).Where(_ => _ > 30).Min(),
+						Max =      g.Select(c => c.ChildID).Where(_ => _ > 30).Max(),
+						Avg = (int)g.Select(c => c.ChildID).Where(_ => _ > 30).Average(),
+					},
+					from  ch in db.Child
+					where ch.ChildID > 30
+					group ch by ch.ParentID into g
+					select new
+					{
+						Sum =      g.Select(c => c.ChildID).Where(_ => _ > 30).Sum(),
+						Min =      g.Select(c => c.ChildID).Where(_ => _ > 30).Min(),
+						Max =      g.Select(c => c.ChildID).Where(_ => _ > 30).Max(),
+						Avg = (int)g.Select(c => c.ChildID).Where(_ => _ > 30).Average(),
+					}));
+		}
+
+		[Test]
+		public void Aggregates4()
+		{
+			ForEachProvider(
+				new[] { ProviderName.SqlCe },
+				db => AreEqual(
+					from  ch in Child
+					group ch by ch.ParentID into g
+					select new
+					{
+						Count = g.Count(_ => _.ChildID > 30),
+						Sum   = g.Where(_ => _.ChildID > 30).Sum(c => c.ChildID),
+					},
+					from  ch in db.Child
+					group ch by ch.ParentID into g
+					select new
+					{
+						Count = g.Count(_ => _.ChildID > 30),
+						Sum   = g.Where(_ => _.ChildID > 30).Sum(c => c.ChildID),
+					}));
+		}
+
+		[Test]
+		public void SelectMax()
+		{
+			var expected =
+				from ch in Child
+				group ch by ch.ParentID into g
+				select g.Max(c => c.ChildID);
+
+			ForEachProvider(db => AreEqual(expected,
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				select g.Max(c => c.ChildID)));
+		}
+
+		[Test]
+		public void JoinMax()
+		{
+			var expected =
+				from ch in Child
+					join max in
+						from ch in Child
+						group ch by ch.ParentID into g
+						select g.Max(c => c.ChildID)
+					on ch.ChildID equals max
+				select ch;
+
+			ForEachProvider(db => AreEqual(expected,
+				from ch in db.Child
+					join max in
+						from ch in db.Child
+						group ch by ch.ParentID into g
+						select g.Max(c => c.ChildID)
+					on ch.ChildID equals max
+				select ch));
+		}
+
+		[Test]
+		public void Min1()
+		{
+			var expected = Child.Min(c => c.ChildID);
+			ForEachProvider(db => Assert.AreEqual(expected, db.Child.Min(c => c.ChildID)));
+		}
+
+		[Test]
+		public void Min2()
+		{
+			var expected = Child.Select(c => c.ChildID).Min();
+			ForEachProvider(db => Assert.AreEqual(expected, db.Child.Select(c => c.ChildID).Min()));
+		}
+
+		[Test]
+		public void Max1()
+		{
+			var expected = Child.Max(c => c.ChildID);
+			Assert.AreNotEqual(0, expected);
+			ForEachProvider(db => Assert.AreEqual(expected, db.Child.Max(c => c.ChildID)));
+		}
+
+		[Test]
+		public void Max11()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				   Child.Max(c => c.ChildID > 20),
+				db.Child.Max(c => c.ChildID > 20)));
+		}
+
+		[Test]
+		public void Max12()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				   Child.Max(c => (bool?)(c.ChildID > 20)),
+				db.Child.Max(c => (bool?)(c.ChildID > 20))));
+		}
+
+		[Test]
+		public void Max2()
+		{
+			var expected =
+				from p in Parent
+					join c in Child on p.ParentID equals c.ParentID
+				where c.ChildID > 20
+				select p;
+
+			ForEachProvider(db =>
+			{
+				var result =
+					from p in db.Parent
+						join c in db.Child on p.ParentID equals c.ParentID
+					where c.ChildID > 20
+					select p;
+
+				Assert.AreEqual(expected.Max(p => p.ParentID), result.Max(p => p.ParentID));
+			});
+		}
+
+		[Test]
+		public void Max3()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				Child.Select(c => c.ChildID).Max(),
+				db.Child.Select(c => c.ChildID).Max()));
+		}
+
+		[Test]
+		public void Max4()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				from t1 in Types
+				join t2 in
+					from sub in Types
+					where
+						sub.ID == 1 &&
+						sub.DateTimeValue <= DateTime.Today
+					group sub by new
+					{
+						sub.ID
+					} into g
+					select new
+					{
+						g.Key.ID,
+						DateTimeValue = g.Max( p => p.DateTimeValue )
+					}
+				on new { t1.ID, t1.DateTimeValue } equals new { t2.ID, t2.DateTimeValue }
+				select t1.MoneyValue,
+				from t1 in db.Types
+				join t2 in
+					from sub in db.Types
+					where
+						sub.ID == 1 &&
+						sub.DateTimeValue <= DateTime.Today
+					group sub by new
+					{
+						sub.ID
+					} into g
+					select new
+					{
+						g.Key.ID,
+						DateTimeValue = g.Max( p => p.DateTimeValue )
+					}
+				on new { t1.ID, t1.DateTimeValue } equals new { t2.ID, t2.DateTimeValue }
+				select t1.MoneyValue
+				));
+		}
+
+		[Test]
+		public void Average1()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				(int)db.Child.Average(c => c.ChildID),
+				(int)   Child.Average(c => c.ChildID)));
+		}
+
+		[Test]
+		public void Average2()
+		{
+			var expected = Child.Select(c => c.ChildID).Average();
+			ForEachProvider(db => Assert.AreEqual((int)expected, (int)db.Child.Select(c => c.ChildID).Average()));
+		}
+
+		[Test]
+		public void GrooupByAssociation1()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in GrandChild1
+				group ch by ch.Parent into g
+				where g.Count() > 2
+				select g.Key.Value1
+				,
+				from ch in db.GrandChild1
+				group ch by ch.Parent into g
+				where g.Count() > 2
+				select g.Key.Value1));
+		}
+
+		[Test]
+		public void GrooupByAssociation101()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in GrandChild1
+				group ch by ch.Parent into g
+				where g.Max(_ => _.ParentID) > 2
+				select g.Key.Value1
+				,
+				from ch in db.GrandChild1
+				group ch by ch.Parent into g
+				where g.Max(_ => _.ParentID) > 2
+				select g.Key.Value1));
+		}
+
+		[Test]
+		public void GrooupByAssociation102()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Informix },
+				db => AreEqual(
+					from ch in GrandChild1
+					group ch by ch.Parent into g
+					where g.Count(_ => _.ChildID >= 20) > 2
+					select g.Key.Value1
+					,
+					from ch in db.GrandChild1
+					group ch by ch.Parent into g
+					where g.Count(_ => _.ChildID >= 20) > 2
+					select g.Key.Value1));
+		}
+
+		[Test]
+		public void GrooupByAssociation1022()
+		{
+			ForEachProvider(
+				new[] { ProviderName.SqlCe, ProviderName.Access, ProviderName.Informix }, // Can be fixed.
+					db => AreEqual(
+					from ch in GrandChild1
+					group ch by ch.Parent into g
+					where g.Count(_ => _.ChildID >= 20) > 2 && g.Where(_ => _.ChildID >= 19).Sum(p => p.ParentID) > 0
+					select g.Key.Value1
+					,
+					from ch in db.GrandChild1
+					group ch by ch.Parent into g
+					where g.Count(_ => _.ChildID >= 20) > 2 && g.Where(_ => _.ChildID >= 19).Sum(p => p.ParentID) > 0
+					select g.Key.Value1));
+		}
+
+		[Test]
+		public void GrooupByAssociation1023()
+		{
+			ForEachProvider(
+				new[] { ProviderName.SqlCe, ProviderName.Access, ProviderName.Informix }, // Can be fixed.
+				db => AreEqual(
+					from ch in GrandChild1
+					group ch by ch.Parent into g
+					where
+						g.Count(_ => _.ChildID >= 20) > 2 &&
+						g.Where(_ => _.ChildID >= 19).Sum(p => p.ParentID) > 0 &&
+						g.Where(_ => _.ChildID >= 19).Max(p => p.ParentID) > 0
+					select g.Key.Value1
+					,
+					from ch in db.GrandChild1
+					group ch by ch.Parent into g
+					where
+						g.Count(_ => _.ChildID >= 20) > 2 &&
+						g.Where(_ => _.ChildID >= 19).Sum(p => p.ParentID) > 0 &&
+						g.Where(_ => _.ChildID >= 19).Max(p => p.ParentID) > 0
+					select g.Key.Value1));
+		}
+
+		[Test]
+		public void GrooupByAssociation1024()
+		{
+			ForEachProvider(
+				new[] { ProviderName.SqlCe, ProviderName.Access, ProviderName.Informix }, // Can be fixed.
+				db => AreEqual(
+					from ch in GrandChild1
+					group ch by ch.Parent into g
+					where
+						g.Count(_ => _.ChildID >= 20) > 2 &&
+						g.Where(_ => _.ChildID >= 19).Sum(p => p.ParentID) > 0 &&
+						g.Where(_ => _.ChildID >= 19).Max(p => p.ParentID) > 0 &&
+						g.Where(_ => _.ChildID >= 18).Max(p => p.ParentID) > 0
+					select g.Key.Value1
+					,
+					from ch in db.GrandChild1
+					group ch by ch.Parent into g
+					where
+						g.Count(_ => _.ChildID >= 20) > 2 &&
+						g.Where(_ => _.ChildID >= 19).Sum(p => p.ParentID) > 0 &&
+						g.Where(_ => _.ChildID >= 19).Max(p => p.ParentID) > 0 &&
+						g.Where(_ => _.ChildID >= 18).Max(p => p.ParentID) > 0
+					select g.Key.Value1));
+		}
+
+		[Test]
+		public void GrooupByAssociation2()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in GrandChild1
+				group ch by ch.Parent into g
+				where g.Count() > 2 && g.Key.ParentID != 1
+				select g.Key.Value1
+				,
+				from ch in db.GrandChild1
+				group ch by ch.Parent into g
+				where g.Count() > 2 && g.Key.ParentID != 1
+				select g.Key.Value1));
+		}
+
+		[Test]
+		public void GrooupByAssociation3([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+			{
+				var result = 
+					from p in db.Product
+					group p by p.Category into g
+					where g.Count() == 12
+					select g.Key.CategoryName;
+
+				var list = result.ToList();
+				Assert.AreEqual(3, list.Count);
+			}
+		}
+
+		[Test]
+		public void GrooupByAssociation4([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+			{
+				var result = 
+					from p in db.Product
+					group p by p.Category into g
+					where g.Count() == 12
+					select g.Key.CategoryID;
+
+				var list = result.ToList();
+				Assert.AreEqual(3, list.Count);
+			}
+		}
+
+		[Test]
+		public void GroupByAggregate1()
+		{
+			var expected =
+				from p in Parent
+				group p by p.Children.Count > 0 && p.Children.Average(c => c.ParentID) > 3 into g
+				select g.Key;
+
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(expected,
+				from p in db.Parent
+				group p by p.Children.Average(c => c.ParentID) > 3 into g
+				select g.Key));
+		}
+
+		[Test]
+		public void GroupByAggregate11()
+		{
+			var expected =
+				from p in Parent
+				where p.Children.Count > 0
+				group p by p.Children.Average(c => c.ParentID) > 3 into g
+				select g.Key;
+
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(expected,
+				from p in db.Parent
+				where p.Children.Count > 0
+				group p by p.Children.Average(c => c.ParentID) > 3 into g
+				select g.Key));
+		}
+
+		[Test]
+		public void GroupByAggregate12()
+		{
+			var expected =
+				from p in Parent
+				group p by p.Children.Count > 0 && p.Children.Average(c => c.ParentID) > 3 into g
+				select g.Key;
+
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(expected,
+				from p in db.Parent
+				group p by p.Children.Count > 0 && p.Children.Average(c => c.ParentID) > 3 into g
+				select g.Key));
+		}
+
+		[Test]
+		public void GroupByAggregate2([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+				AreEqual(
+					(
+						from c in Customer
+						group c by c.Orders.Count > 0 && c.Orders.Average(o => o.Freight) >= 80
+					).ToList().Select(k => k.Key),
+					(
+						from c in db.Customer
+						group c by c.Orders.Average(o => o.Freight) >= 80
+					).ToList().Select(k => k.Key));
+		}
+
+		[Test]
+		public void GroupByAggregate3()
+		{
+			var expected =
+				(
+					from p in Parent
+					group p by p.Children.Count > 0 && p.Children.Average(c => c.ParentID) > 3
+				).ToList().First(g => !g.Key);
+
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(expected,
+				(
+					from p in db.Parent
+					group p by p.Children.Average(c => c.ParentID) > 3
+				).ToList().First(g => !g.Key)));
+		}
+
+		[Test]
+		public void ByJoin()
+		{
+			ForEachProvider(db => AreEqual(
+				from c1 in Child
+				join c2 in Child on c1.ChildID equals c2.ChildID + 1
+				group c2 by c1.ParentID into g
+				select g.Sum(_ => _.ChildID),
+				from c1 in db.Child
+				join c2 in db.Child on c1.ChildID equals c2.ChildID + 1
+				group c2 by c1.ParentID into g
+				select g.Sum(_ => _.ChildID)));
+		}
+
+		[Test]
+		public void SelectMany()
+		{
+			ForEachProvider(db => AreEqual(
+				   Child.GroupBy(ch => ch.ParentID).SelectMany(g => g),
+				db.Child.GroupBy(ch => ch.ParentID).SelectMany(g => g)));
+		}
+
+		[Test]
+		public void Scalar1()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
+				(from ch in Child
+				 group ch by ch.ParentID into g
+				 select g.Select(ch => ch.ChildID).Max()),
+				(from ch in db.Child
+				 group ch by ch.ParentID into g
+				 select g.Select(ch => ch.ChildID).Max())));
+		}
+
+		[Test]
+		public void Scalar101()
+		{
+			ForEachProvider(db => AreEqual(
+				(from ch in Child
+				 select ch.ChildID into id
+				 group id by id into g
+				 select g.Max()),
+				(from ch in db.Child
+				 select ch.ChildID into id
+				 group id by id into g
+				 select g.Max())));
+		}
+
+		[Test]
+		public void Scalar2()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
+				(from ch in Child
+				 group ch by ch.ParentID into g
+				 select new
+					 {
+						 Max1 = g.Select(ch => ch.ChildID              ).Max(),
+						 Max2 = g.Select(ch => ch.ChildID + ch.ParentID).Max()
+					 }),
+				(from ch in db.Child
+				 group ch by ch.ParentID into g
+				 select new
+					 {
+						 Max1 = g.Select(ch => ch.ChildID              ).Max(),
+						 Max2 = g.Select(ch => ch.ChildID + ch.ParentID).Max()
+					 })));
+		}
+
+		[Test]
+		public void Scalar3()
+		{
+			ForEachProvider(
+				new[] { ProviderName.SqlCe },
+				db => AreEqual(
+					(from ch in Child
+					 group ch by ch.ParentID into g
+					 select g.Select(ch => ch.ChildID).Where(id => id > 0).Max()),
+					(from ch in db.Child
+					 group ch by ch.ParentID into g
+					 select g.Select(ch => ch.ChildID).Where(id => id > 0).Max())));
+		}
+
+		[Test]
+		public void Scalar4()
+		{
+			ForEachProvider(
+				new[] { ProviderName.SqlCe, ProviderName.Access, ProviderName.Informix },
+				db => AreEqual(
+					from ch in Child
+					group ch by ch.ParentID into g
+					where g.Where(ch => ch.ParentID > 2).Select(ch => (int?)ch.ChildID).Min() != null
+					select g.Where(ch => ch.ParentID > 2).Select(ch => ch.ChildID).Min()
+					,
+					from ch in db.Child
+					group ch by ch.ParentID into g
+					where g.Where(ch => ch.ParentID > 2).Select(ch => (int?)ch.ChildID).Min() != null
+					select g.Where(ch => ch.ParentID > 2).Select(ch => ch.ChildID).Min()));
+		}
+
+		[Test]
+		public void Scalar41()
+		{
+			ForEachProvider(
+				new[] { ProviderName.SqlCe, ProviderName.Access, ProviderName.Informix },
+				db => AreEqual(
+					from ch in Child
+					group ch by ch.ParentID into g
+					select new { g } into g
+					where g.g.Where(ch => ch.ParentID > 2).Select(ch => (int?)ch.ChildID).Min() != null
+					select g.g.Where(ch => ch.ParentID > 2).Select(ch => ch.ChildID).Min()
+					,
+					from ch in db.Child
+					group ch by ch.ParentID into g
+					select new { g } into g
+					where g.g.Where(ch => ch.ParentID > 2).Select(ch => (int?)ch.ChildID).Min() != null
+					select g.g.Where(ch => ch.ParentID > 2).Select(ch => ch.ChildID).Min()));
+		}
+
+		[Test]
+		public void Scalar5()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in Child
+				select ch.ParentID into id
+				group id by id into g
+				select g.Max()
+				,
+				from ch in db.Child
+				select ch.ParentID into id
+				group id by id into g
+				select g.Max()));
+		}
+
+		//[Test]
+		public void Scalar51()
+		{
+			ForEachProvider(db => AreEqual(
+				from ch in Child
+				group ch by ch.ParentID into g
+				select g.Max()
+				,
+				from ch in db.Child
+				group ch by ch.ParentID into g
+				select g.Max()));
+		}
+
+		[Test]
+		public void Scalar6()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
+				(from ch in Child
+				 where ch.ParentID < 3
+				 group ch by ch.ParentID into g
+				 select g.Where(ch => ch.ParentID < 3).Max(ch => ch.ChildID)),
+				(from ch in db.Child
+				 where ch.ParentID < 3
+				 group ch by ch.ParentID into g
+				 select g.Where(ch => ch.ParentID < 3).Max(ch => ch.ChildID))));
+		}
+
+		[Test]
+		public void Scalar7()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
+				(from ch in Child
+				 group ch by ch.ParentID into g
+				 select new { max = g.Select(ch => ch.ChildID).Max()}).Select(id => id.max),
+				(from ch in db.Child
+				 group ch by ch.ParentID into g
+				 select new { max = g.Select(ch => ch.ChildID).Max()}).Select(id => id.max)));
+		}
+
+		[Test]
+		public void Scalar8()
+		{
+			ForEachProvider(db => AreEqual(
+				(from ch in Child
+				group ch by ch.ParentID into g
+				select new { max = g.Max(ch => ch.ChildID)}).Select(id => id.max),
+				(from ch in db.Child
+				group ch by ch.ParentID into g
+				select new { max = g.Max(ch => ch.ChildID)}).Select(id => id.max)));
+		}
+
+		[Test]
+		public void Scalar9()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
+				(from ch in Child
+				 group ch by ch.ParentID into g
+				 select g.Select(ch => ch.ChildID).Where(id => id < 30).Count()),
+				(from ch in db.Child
+				 group ch by ch.ParentID into g
+				 select g.Select(ch => ch.ChildID).Where(id => id < 30).Count())));
+		}
+
+		[Test]
+		public void Scalar10()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
+				(from ch in Child
+				 group ch by ch.ParentID into g
+				 select g.Select(ch => ch.ChildID).Where(id => id < 30).Count(id => id >= 20)),
+				(from ch in db.Child
+				 group ch by ch.ParentID into g
+				 select g.Select(ch => ch.ChildID).Where(id => id < 30).Count(id => id >= 20))));
+		}
+
+		[Test, Category("MySql")]
+		public void GroupByExtraFieldBugTest([IncludeDataContexts(ProviderName.MySql)] string context)
+		{
+			// https://github.com/igor-tkachev/bltoolkit/issues/42
+			// extra field is generated in the GROUP BY clause, for example:
+			// GROUP BY p.LastName, p.LastName <--- the second one is redundant
+
+			using (var db = new TestDbManager(context))
+			{
+				var q =
+					from d in db.Doctor
+					join p in db.Person on d.PersonID equals p.ID
+					group d by p.LastName into g
+					select g.Key;
+
+				q.ToList();
+
+				const string fieldName = "LastName";
+
+				var lastQuery  = db.LastQuery;
+				var groupByPos = lastQuery.IndexOf("GROUP BY");
+				var fieldPos   = lastQuery.IndexOf(fieldName, groupByPos);
+				
+				// check that our field does not present in the GROUP BY clause second time
+				Assert.AreEqual(-1, lastQuery.IndexOf(fieldName, fieldPos + 1));
+			}
+		}
+
+		[Test]
+		public void DoubleGroupBy1()
+		{
+			ForEachProvider(
+				db => AreEqual(
+					from t in
+						from p in Parent
+						where p.Value1 != null
+						group p by p.ParentID into g
+						select new
+						{
+							ID  = g.Key,
+							Max = g.Max(t => t.Value1)
+						}
+					group t by t.ID into g
+					select new
+					{
+						g.Key,
+						Sum = g.Sum(t => t.Max)
+					},
+					from t in
+						from p in db.Parent
+						where p.Value1 != null
+						group p by p.ParentID into g
+						select new
+						{
+							ID  = g.Key,
+							Max = g.Max(t => t.Value1)
+						}
+					group t by t.ID into g
+					select new
+					{
+						g.Key,
+						Sum = g.Sum(t => t.Max)
+					}));
+			
+		}
+
+		[Test]
+		public void DoubleGroupBy2()
+		{
+			ForEachProvider(
+				db => AreEqual(
+					from p in Parent
+					where p.Value1 != null
+					group p by p.ParentID into g
+					select new
+					{
+						ID  = g.Key,
+						Max = g.Max(t => t.Value1)
+					} into t
+					group t by t.ID into g
+					select new
+					{
+						g.Key,
+						Sum = g.Sum(t => t.Max)
+					},
+					from p in db.Parent
+					where p.Value1 != null
+					group p by p.ParentID into g
+					select new
+					{
+						ID  = g.Key,
+						Max = g.Max(t => t.Value1)
+					} into t
+					group t by t.ID into g
+					select new
+					{
+						g.Key,
+						Sum = g.Sum(t => t.Max)
+					}));
+			
+		}
+
+		[Test]
+		public void InnerQuery([DataContexts(ProviderName.SqlCe)] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				AreEqual(
+					   Doctor.GroupBy(s => s.PersonID).Select(s => s.Select(d => d.Taxonomy).First()),
+					db.Doctor.GroupBy(s => s.PersonID).Select(s => s.Select(d => d.Taxonomy).First()));
+			}
+		}
+
+		[Test]
+		public void CalcMember([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				AreEqual(
+					from parent in Parent
+					from child  in Person
+					where child.ID == parent.ParentID
+					let data = new
+					{
+						parent.Value1,
+						Value = child.FirstName == "John" ? child.FirstName : "a"
+					}
+					group data by data.Value into groupedData
+					select new
+					{
+						groupedData.Key,
+						Count = groupedData.Count()
+					},
+					from parent in db.Parent
+					from child  in db.Person
+					where child.ID == parent.ParentID
+					let data = new
+					{
+						parent.Value1,
+						Value = child.FirstName == "John" ? child.FirstName : "a"
+					}
+					group data by data.Value into groupedData
+					select new
+					{
+						groupedData.Key,
+						Count = groupedData.Count()
+					});
+			}
+		}
+
+		[Test]
+		public void GroupByDate([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				AreEqual(
+					from t in Types2
+					group t by new { t.DateTimeValue.Value.Month, t.DateTimeValue.Value.Year } into grp
+					select new
+					{
+						Total = grp.Sum(_ => _.MoneyValue),
+						year  = grp.Key.Year,
+						month = grp.Key.Month
+					},
+					from t in db.Types2
+					group t by new { t.DateTimeValue.Value.Month, t.DateTimeValue.Value.Year } into grp
+					select new
+					{
+						Total = grp.Sum(_ => _.MoneyValue),
+						year  = grp.Key.Year,
+						month = grp.Key.Month
+					});
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/ITestDataContext.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,32 @@
+using System;
+
+using BLToolkit.Data.Linq;
+
+namespace Data.Linq
+{
+	using Model;
+
+	public interface ITestDataContext : IDataContext
+	{
+		Table<Person>                 Person                 { get; }
+		Table<Patient>                Patient                { get; }
+		Table<Doctor>                 Doctor                 { get; }
+		Table<Parent>                 Parent                 { get; }
+		Table<Parent1>                Parent1                { get; }
+		Table<IParent>                Parent2                { get; }
+		Table<Parent4>                Parent4                { get; }
+		Table<Parent5>                Parent5                { get; }
+		Table<ParentInheritanceBase>  ParentInheritance      { get; }
+		Table<ParentInheritanceBase2> ParentInheritance2     { get; }
+		Table<ParentInheritanceBase3> ParentInheritance3     { get; }
+		Table<ParentInheritanceBase4> ParentInheritance4     { get; }
+		Table<ParentInheritance1>     ParentInheritance1     { get; }
+		Table<ParentInheritanceValue> ParentInheritanceValue { get; }
+		Table<Child>                  Child                  { get; }
+		Table<GrandChild>             GrandChild             { get; }
+		Table<GrandChild1>            GrandChild1            { get; }
+		Table<LinqDataTypes>          Types                  { get; }
+		Table<LinqDataTypes2>         Types2                 { get; }
+		Table<TestIdentity>           TestIdentity           { get; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/IdlTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1016 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using BLToolkit.Data.Sql.SqlProvider;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+using Data.Linq.Model;
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+    [TestFixture]
+    public partial class IdlTest : TestBase
+    {
+        class IdlProvidersAttribute : IncludeDataContextsAttribute
+        {
+            public IdlProvidersAttribute()
+                : base(ProviderName.SQLite, ProviderName.MySql, "Sql2005", "Sql2008")
+            {
+            }
+        }
+
+        private void ForProvider(string providerName, Action<ITestDataContext> func)
+        {
+            ForEachProvider(Providers.Select(p => p.Name).Except(new[] { providerName }).ToArray(), func);
+        }
+
+        private void ForMySqlProvider(Action<ITestDataContext> func)
+        {
+            ForEachProvider(Providers.Select(p => p.Name).Except(new[] { ProviderName.MySql }).ToArray(), func);
+        }
+
+        #region PersonWithId
+
+        public interface IHasID
+        {
+            int ID { get; set; }
+        }
+
+        [TableName(Name = "Person")]
+        public class PersonWithId : IHasID
+        {
+            public PersonWithId()
+            {
+            }
+
+            public PersonWithId(int id)
+            {
+                ID = id;
+            }
+
+            public PersonWithId(int id, string firstName)
+            {
+                ID = id;
+                FirstName = firstName;
+            }
+
+            [Identity, PrimaryKey]
+            [SequenceName("Firebird", "PersonID")]
+            [MapField("PersonID")]
+            public int ID { get; set; }
+            public string FirstName { get; set; }
+            public string LastName;
+            [Nullable] public string MiddleName;
+            public Gender Gender;
+
+            [MapIgnore]
+            public string Name
+            {
+                get { return FirstName + " " + LastName; }
+            }
+
+            public override bool Equals(object obj)
+            {
+                return Equals(obj as PersonWithId);
+            }
+
+            public bool Equals(PersonWithId other)
+            {
+                if (ReferenceEquals(null, other)) return false;
+                if (ReferenceEquals(this, other)) return true;
+                return
+                    other.ID == ID &&
+                        Equals(other.LastName, LastName) &&
+                        Equals(other.MiddleName, MiddleName) &&
+                        other.Gender == Gender &&
+                        Equals(other.FirstName, FirstName);
+            }
+
+            public override int GetHashCode()
+            {
+                unchecked
+                {
+                    var result = ID;
+                    result = (result * 397) ^ (LastName != null ? LastName.GetHashCode() : 0);
+                    result = (result * 397) ^ (MiddleName != null ? MiddleName.GetHashCode() : 0);
+                    result = (result * 397) ^ Gender.GetHashCode();
+                    result = (result * 397) ^ (FirstName != null ? FirstName.GetHashCode() : 0);
+                    return result;
+                }
+            }
+        }
+
+        #endregion
+
+        #region ObjectId
+
+        public interface IHasObjectId2
+        {
+            ObjectId Id { get; set; }
+        }
+
+        public interface IHasObjectId1
+        {
+            ObjectId Id { get; set; }
+        }
+
+        public struct ObjectId
+        {
+            public ObjectId(int value)
+            {
+                m_value = value;
+            }
+
+            private int m_value;
+
+            public int Value
+            {
+                get { return m_value; }
+                set { m_value = value; }
+            }
+
+            public static implicit operator int(ObjectId val)
+            {
+                return val.m_value;
+            }
+        }
+
+        public class WithObjectIdBase : IHasObjectId1
+        {
+            public ObjectId Id { get; set; }
+        }
+
+        public class PersonWithObjectId : WithObjectIdBase, IHasObjectId2
+        {
+            public string FistName { get; set; }
+        }
+
+        public struct NullableObjectId
+        {
+            public NullableObjectId(int? value)
+            {
+                m_value = value;
+            }
+
+            private int? m_value;
+
+            public int? Value
+            {
+                get { return m_value; }
+                set { m_value = value; }
+            }
+
+            public static implicit operator int?(NullableObjectId val)
+            {
+                return val.m_value;
+            }
+        }
+
+        #endregion
+
+        [Test]
+        public void TestComplexExpression([IdlProviders] string providerName)
+        {
+            // failed with BLToolkit.Data.Linq.LinqException : 'new StationObjectId() {Value = ConvertNullable(child.ChildID)}' 
+            //   cannot be converted to SQL.
+            ForProvider(
+                providerName,
+                db =>
+                    {
+                        var source = from child in db.GrandChild
+                                     select
+                                         new
+                                             {
+                                                 NullableId = new NullableObjectId { Value = child.ChildID }
+                                             };
+
+                        var query = from e in source where e.NullableId == 1 select e;
+
+                        var result = query.ToArray();
+                        Assert.That(result, Is.Not.Null);
+                    });
+        }
+
+        [Test]
+        public void TestJoin([IdlProviders] string providerName)
+        {
+            // failed with System.ArgumentOutOfRangeException : Index was out of range. Must be non-negative and less than 
+            //   the size of the collection.
+            // Parameter name: index
+            ForProvider(
+                providerName,
+                db =>
+                    {
+                        var source = from p1 in db.Person
+                                     join p2 in db.Person on p1.ID equals p2.ID
+                                     select
+                                         new { ID1 = new ObjectId { Value = p1.ID }, FirstName2 = p2.FirstName, };
+
+                        var query = from p1 in source select p1.ID1.Value;
+
+                        var result = query.ToArray();
+                        Assert.That(result, Is.Not.Null);
+                    });
+        }
+
+        [Test]
+        public void TestNullableExpression([IdlProviders] string providerName)
+        {
+            // failed with System.NullReferenceException : Object reference not set to an instance of an object.
+            ForProvider(
+                providerName,
+                db =>
+                    {
+                        var source = from obj in db.Person select new { Id = obj.ID, };
+
+                        // fails for bool?, double?, int32?, int64?, string
+                        // works for byte?, int16?, DateTime? 
+                        double? @p1 = null;
+
+                        var r = from c in source where @p1 != null select c;
+
+                        Assert.That(r.ToArray(), Is.Not.Null);
+                    });
+        }
+
+        [Test]
+        public void TestLookupWithInterfaceProperty([IdlProviders] string providerName)
+        {
+            ForProvider(
+                providerName,
+                db =>
+                    {
+                        var r = GetById<PersonWithId>(db, 1).SingleOrDefault();
+                        Assert.That(r, Is.Not.Null);
+                    });
+        }
+
+        #region ObjectExt
+
+        public abstract class ObjectWithId
+        {
+            public ObjectId Id;
+        }
+
+        public class ParentEx : ObjectWithId
+        {
+            public int? Value1;
+        }
+
+        #endregion
+
+        [Test]
+        public void TestForObjectExt([IdlProviders] string providerName)
+        {
+            ForProvider(
+                providerName,
+                db =>
+                    {
+                        var r = from p in db.Parent
+                                select new ParentEx
+                                    {
+                                        Id = new ObjectId { Value = p.ParentID },
+                                        Value1 = p.Value1,
+                                    };
+                        Assert.That(r.ToArray(), Is.Not.Null);
+                    });
+        }
+
+        private void getData(ITestDataContext db, IEnumerable<int?> d, IEnumerable<int?> compareWith)
+        {
+            var r1 = db.GrandChild
+                .Where(x => d.Contains(x.ParentID))
+                .GroupBy(x => x.ChildID, x => x.GrandChildID)
+                .ToList();
+            foreach (var group in r1)
+            {
+                Assert.That(compareWith.Any(x => group.Contains(x)), Is.True);
+            }
+        }
+
+        [Test]
+        public void TestForGroupBy([IdlProviders] string providerName)
+        {
+            ForProvider(
+                providerName,
+                db =>
+                    {
+                        /* no error in first call */
+                        getData(db, new List<int?> { 2 }, new List<int?> { 211, 212, 221, 222 });
+
+                        /* error in second and more calls */
+                        /*
+                     * GROUP BY select clause is correct
+                        SELECT x.ChildID FROM GrandChild x WHERE x.ParentID IN (3) GROUP BY x.ChildID
+
+                     * But next SELECT clause contains "x.ParentID IN (2)" instead "x.ParentID IN (3)"
+                        -- DECLARE ?p1 Int32
+                        -- SET ?p1 = 31
+                        SELECT x.GrandChildID FROM GrandChild x WHERE x.ParentID IN (2) AND x.ChildID = ?p1
+                     */
+                        getData(db, new List<int?> { 3 }, new List<int?> { 311, 312, 313, 321, 333 });
+                    });
+        }
+
+        [Test]
+        public void TestLinqMax([IdlProviders] string providerName)
+        {
+            ForProvider(
+                providerName,
+                db =>
+                    {
+                        Assert.That(db.Patient.Where(x => x.PersonID < 0).Select(x => (int?)x.PersonID).Max(), Is.Null);
+                        Assert.That(db.Patient.Where(x => x.PersonID < 0).Max(x => (int?)x.PersonID), Is.Null);
+                        Assert.Catch<InvalidOperationException>(
+                            () => db.Patient.Where(x => x.PersonID < 0).Select(x => x.PersonID).Max());
+                        Assert.Catch<InvalidOperationException>(
+                            () => db.Patient.Where(x => x.PersonID < 0).Max(x => x.PersonID));
+                    });
+        }
+
+        [Test]
+        public void TestConvertFunction([IdlProviders] string providerName)
+        {
+            ForProvider(
+                providerName,
+                db =>
+                    {
+                        var ds = new IdlPatientSource(db);
+                        var r1 = ds.Patients().ToList();
+                        var r2 = ds.Persons().ToList();
+
+                        Assert.That(r1, Is.Not.Empty);
+                        Assert.That(r2, Is.Not.Empty);
+
+                        var r3 = ds.Patients().ToIdlPatientEx(ds);
+                        var r4 = r3.ToList();
+                        Assert.That(r4, Is.Not.Empty);
+                    });
+        }
+
+        [Test]
+        public void TestJoinOrder([IdlProviders] string providerName)
+        {
+            ForProvider(
+                providerName,
+                db =>
+                    {
+                        var source = new IdlPatientSource(db);
+
+                        // Success when use result from second JOIN
+                        var query1 = from p1 in source.GrandChilds()
+                                     join p2 in source.Persons() on p1.ParentID equals p2.Id
+                                     join p3 in source.Persons() on p1.ChildID equals p3.Id
+                                     select
+                                         new
+                                             {
+                                                 p1.ChildID,
+                                                 p1.ParentID,
+                                                 //Parent = p2,
+                                                 Child = p3,
+                                             };
+                        var data1 = query1.ToList();
+
+                        // Fail when use result from first JOIN
+                        var query2 = from p1 in source.GrandChilds()
+                                     join p2 in source.Persons() on p1.ParentID equals p2.Id
+                                     join p3 in source.Persons() on p1.ChildID equals p3.Id
+                                     select
+                                         new
+                                             {
+                                                 p1.ChildID,
+                                                 p1.ParentID,
+                                                 Parent = p2,
+                                                 //Child = p3,
+                                             };
+                        var data2 = query2.ToList();
+                    });
+        }
+
+        [Test]
+        public void TestDistinctWithGroupBy([IdlProviders] string providerName)
+        {
+            ForProvider(
+                providerName,
+                db =>
+                    {
+                        const int parentId = 10000;
+                        db.Parent.Insert(() => new Parent { ParentID = parentId, Value1 = 1 });
+                        db.Parent.Insert(() => new Parent { ParentID = parentId, Value1 = 1 });
+
+                        try
+                        {
+                            var source = db.Parent.ToList();
+
+                            // Success when query is executed in memory
+                            TestDistinctWithGroupBy(source.AsQueryable());
+
+                            // Failed when query is executed on sql server
+                            TestDistinctWithGroupBy(db.Parent);
+                        }
+                        finally
+                        {
+                            db.Parent.Delete(x => x.ParentID == parentId);
+                        }
+                    });
+        }
+
+        private static void TestDistinctWithGroupBy(IQueryable<Parent> source)
+        {
+            const int score = 4;
+            var q = source.Select(x => new { Key = x.Value1, MatchScore = score })
+                .Distinct();
+            var qq = q.GroupBy(
+                x => x.Key,
+                (key, x) => new { Id = key, MatchScore = x.Sum(y => y.MatchScore) })
+                .Select(x => new { x.Id, x.MatchScore });
+
+            var result = qq.ToList();
+            Assert.That(result.Select(x => x.MatchScore), Is.All.EqualTo(score));
+        }
+
+        private static IQueryable<T> GetById<T>(ITestDataContext db, int id) where T : class, IHasID
+        {
+            return db.GetTable<T>().Where(obj => obj.ID == id);
+        }
+
+        [Test]
+        public void ImplicitCastTest([IdlProviders] string providerName)
+        {
+            ForProvider(
+                providerName,
+                db =>
+                    {
+                        var people =
+                            from p in db.Person
+                            select new IdlPerson
+                                {
+                                    Id = new ObjectId { Value = p.ID },
+                                    Name = p.FirstName
+                                };
+
+                        var sql1 = (from p in people where p.Id == 1 select p).ToString();
+                        var sql2 = (from p in people where p.Id.Value == 1 select p).ToString();
+
+                        Assert.That(sql1, Is.EqualTo(sql2));
+                    });
+        }
+
+        [Test]
+        public void ListvsArrayTest([IdlProviders] string providerName)
+        {
+            ForProvider(
+                providerName,
+                db =>
+                    {
+                        var st = "John";
+
+                        //SQL - x.FirstName IN ('John')
+                        var queryList = from x in db.Person
+                                        where new List<string> { st }.Contains(x.FirstName)
+                                        select x.ID;
+
+                        //SQL - x.FirstName IN ('J', 'o', 'h', 'n')
+                        var queryArray = from x in db.Person
+                                         where new[] { st }.Contains(x.FirstName)
+                                         select x.ID;
+
+                        Assert.That(queryList.ToList(), Is.EqualTo(queryArray.ToList()));
+                    });
+        }
+
+        [Test]
+        public void ConcatJoinOrderByTest([IdlProviders] string providerName)
+        {
+            ForProvider(
+                providerName,
+                db =>
+                    {
+                        var query = from y in
+                            ((from pat in db.Patient
+                              where pat.Diagnosis == "a"
+                              select pat)
+                                .Concat
+                                (
+                                    from pat in db.Patient
+                                    where pat.Diagnosis == "b"
+                                    select pat))
+                                    join person in db.Person on y.PersonID equals person.ID
+                                    orderby person.ID
+                                    select new { Id = person.ID, Id2 = y.PersonID };
+
+                        Assert.That(query.ToList(), Is.Not.Null);
+                    });
+        }
+
+        [Test]
+        public void TestIsContainedInArrayOfEnumValues([IdlProviders] string providerName)
+        {
+            var types2 = new[] { TypeValue.Value2, TypeValue.Value3, TypeValue.Value4 };
+
+            ForProvider(
+                providerName,
+                db =>
+                    {
+                        var result = (from x in db.Parent4 where types2.Contains(x.Value1) select x)
+                            .ToList();
+
+                        Assert.That(result, Is.Not.Null);
+                    });
+        }
+
+        [Test]
+        public void TestQueryWithInterface([IdlProviders] string providerName)
+        {
+            ForProvider(
+                providerName,
+                db =>
+                    {
+                        var persons =
+                            from x in db.Person
+                            select new PersonWithObjectId
+                                {
+                                    Id = new ObjectId { Value = x.ID },
+                                    FistName = x.FirstName,
+                                };
+
+                        // this works
+                        var r1 = FilterSourceByIdDefinedInBaseClass(persons, 5).ToArray();
+                        Assert.That(r1, Is.Not.Null);
+
+                        // and this works
+                        var r2 = FilterSourceByIdDefinedInInterface1(persons, 5).ToArray();
+                        Assert.That(r2, Is.Not.Null);
+
+                        // but this fails
+                        var r3 = FilterSourceByIdDefinedInInterface2(persons, 5).ToArray();
+                        Assert.That(r3, Is.Not.Null);
+                    });
+        }
+
+        [Test]
+        public void TestBugCountWithOrderBy([IdlProviders] string providerName)
+        {
+            ForProvider(
+                providerName,
+                db =>
+                    {
+                        var q1 = db.Person.OrderBy(x => x.ID);
+
+                        var q2 = from p in q1
+                                 join p2 in db.Person on p.ID equals p2.ID
+                                 select p2;
+
+                        Assert.DoesNotThrow(() => q2.Max(x => x.ID));
+                        Assert.DoesNotThrow(() => q2.Count());
+                    });
+        }
+
+        [Test]
+        public void TestUpdateWithTargetByAssociationProperty([IdlProviders] string providerName)
+        {
+            TestUpdateByAssociationProperty(providerName, true);
+        }
+
+        [Test]
+        public void TestSetUpdateWithoutTargetByAssociationProperty([IdlProviders] string providerName)
+        {
+            TestUpdateByAssociationProperty(providerName, false);
+        }
+
+        private void TestUpdateByAssociationProperty(string providerName, bool useUpdateWithTarget)
+        {
+            ForProvider(
+                providerName,
+                db =>
+                    {
+                        const int childId = 10000;
+                        const int parentId = 20000;
+
+                        try
+                        {
+                            db.Parent.Insert(() => new Parent { ParentID = parentId });
+                            db.Child.Insert(() => new Child { ChildID = childId, ParentID = parentId });
+
+                            var parents = from child in db.Child
+                                          where child.ChildID == childId
+                                          select child.Parent;
+
+                            if (useUpdateWithTarget)
+                            {
+                                // this failed for MySql and SQLite but works with MS SQL
+                                Assert.DoesNotThrow(() => parents.Update(db.Parent, x => new Parent { Value1 = 5 }));
+                            }
+                            else
+                            {
+                                // this works with MySql but failed for SQLite and MS SQL
+                                Assert.DoesNotThrow(() => parents.Set(x => x.Value1, 5).Update());
+                            }
+                        }
+                        finally
+                        {
+                            db.Child.Delete(x => x.ChildID == childId);
+                            db.Parent.Delete(x => x.ParentID == parentId);
+                        }
+                    });
+        }
+
+
+        private IQueryable<T> FilterSourceByIdDefinedInBaseClass<T>(IQueryable<T> source, int id)
+            where T : WithObjectIdBase
+        {
+            return from x in source where x.Id == id select x;
+        }
+
+        private IQueryable<T> FilterSourceByIdDefinedInInterface1<T>(IQueryable<T> source, int id)
+            where T : IHasObjectId1
+        {
+            return from x in source where x.Id == id select x;
+        }
+
+        private IQueryable<T> FilterSourceByIdDefinedInInterface2<T>(IQueryable<T> source, int id)
+            where T : IHasObjectId2
+        {
+            return from x in source where x.Id == id select x;
+        }
+
+        [Test]
+        public void TestComparePropertyOfEnumTypeToVaribleInSubquery([IdlProviders] string providerName)
+        {
+            ForProvider(
+                providerName,
+                db =>
+                    {
+                        var gender = Gender.Other;
+                        var q = from x in db.Patient
+                                join y in db.Person.Where(x => x.Gender == gender) on x.PersonID equals y.ID
+                                select x;
+
+                        var r = q.ToList();
+                        Assert.That(r, Is.Not.Null);
+                    });
+        }
+
+        [Test]
+        public void ConcatOrderByTest([IdlProviders] string providerName)
+        {
+            ForProvider(
+                providerName,
+                db =>
+                    {
+                        var q = from p in db.Person
+                                where p.ID < 0
+                                select new { Rank = 0, FirstName = (string)null, LastName = (string)null };
+                        var q2 =
+                            q.Concat(
+                                from p in db.Person
+                                select new { Rank = p.ID, p.FirstName, p.LastName });
+
+                        var resultquery = (from x in q2 orderby x.Rank, x.FirstName, x.LastName select x).ToString();
+
+                        var rqr = resultquery.LastIndexOf(
+                            "ORDER BY", System.StringComparison.InvariantCultureIgnoreCase);
+                        var rqp =
+                            (resultquery.Substring(rqr + "ORDER BY".Length).Split(',')).Select(p => p.Trim()).ToArray();
+
+                        Assert.That(rqp.Count(), Is.EqualTo(3));
+                    });
+        }
+
+        [Test]
+        public void TestContainsForNullableDateTimeWithOnlyNullValue1([IdlProviders] string providerName)
+        {
+            ForProvider(
+                providerName,
+                db =>
+                    {
+                        var dates = new DateTime?[] { null };
+
+                        // Ensures that  the query works properly in memory
+                        // ReSharper disable RemoveToList.2
+                        var resultCount = db.Types2.ToList().Count(x => dates.Contains(x.DateTimeValue2));
+                        // ReSharper restore RemoveToList.2
+                        Assert.That(resultCount, Is.GreaterThan(0));
+
+                        var result = db.Types2.Count(x => dates.Contains(x.DateTimeValue2));
+                        Assert.That(result, Is.EqualTo(resultCount));
+                    });
+        }
+
+        [Test]
+        public void TestContainsForNullableDateTimeWithOnlyNullValue2([IdlProviders] string providerName)
+        {
+            ForProvider(
+                providerName,
+                db =>
+                    {
+                        // Ensures that  the query works properly in memory
+                        // ReSharper disable RemoveToList.2
+                        var resultCount = db.Types2.ToList().Count(x => new DateTime?[] { null }.Contains(x.DateTimeValue2));
+                        // ReSharper restore RemoveToList.2
+                        Assert.That(resultCount, Is.GreaterThan(0));
+
+                        var result = db.Types2.Count(x => new DateTime?[] { null }.Contains(x.DateTimeValue2));
+                        Assert.That(result, Is.EqualTo(resultCount));
+                    });
+        }
+
+        [Test]
+        public void TestContainsForNullableDateTimeWithNullAndNotNullValues1([IdlProviders] string providerName)
+        {
+            ForProvider(
+                providerName,
+                db =>
+                    {
+                        var date  = new DateTime(2009,  9,  24,  9, 19, 29,  90);
+                        var dates = new DateTime?[] { null, date };
+
+                        // Ensures that  the query works properly in memory
+                        // ReSharper disable RemoveToList.2
+                        var resultCount = db.Types2.ToList().Count(x => dates.Contains(x.DateTimeValue2));
+                        // ReSharper restore RemoveToList.2
+                        Assert.That(resultCount, Is.GreaterThan(0));
+
+                        var result = db.Types2.Count(x => dates.Contains(x.DateTimeValue2));
+                        Assert.That(result, Is.EqualTo(resultCount));
+                    });
+        }
+
+        [Test]
+        public void TestContainsForNullableDateTimeWithNullAndNotNullValues2([IdlProviders] string providerName)
+        {
+            ForProvider(
+                providerName,
+                db =>
+                    {
+                        // Ensures that  the query works properly in memory
+                        // ReSharper disable RemoveToList.2
+                        var resultCount = db.Types2.ToList().Count(x => new DateTime?[] { null, new DateTime(2009,  9,  24,  9, 19, 29,  90) }.Contains(x.DateTimeValue2));
+                        // ReSharper restore RemoveToList.2
+                        Assert.That(resultCount, Is.GreaterThan(0));
+
+                        var result = db.Types2.Count(x => new DateTime?[] { null, new DateTime(2009,  9,  24,  9, 19, 29,  90) }.Contains(x.DateTimeValue2));
+                        Assert.That(result, Is.EqualTo(resultCount));
+                    });
+        }
+
+        #region GenericQuery classes
+
+        public abstract partial class GenericQueryBase
+        {
+            private readonly IdlPatientSource m_ds;
+
+            protected GenericQueryBase(ITestDataContext ds)
+            {
+                m_ds = new IdlPatientSource(ds);
+            }
+
+            #region Object sources
+
+            protected IQueryable<IdlPerson> AllPersons
+            {
+                get { return m_ds.Persons(); }
+            }
+
+            protected IQueryable<IdlPatient> AllPatients
+            {
+                get { return m_ds.Patients(); }
+            }
+
+            protected IQueryable<IdlGrandChild> AllGrandChilds
+            {
+                get { return m_ds.GrandChilds(); }
+            }
+
+            #endregion
+
+            public abstract IEnumerable<object> Query();
+        }
+
+        public class GenericConcatQuery : GenericQueryBase
+        {
+            private String @p1;
+            private Int32 @p2;
+
+            public GenericConcatQuery(ITestDataContext ds, object[] args)
+                : base(ds)
+            {
+                @p1 = (String)args[0];
+                @p2 = (Int32)args[1];
+            }
+
+            public override IEnumerable<object> Query()
+            {
+                return (from y in AllPersons
+                        select y.Name)
+                    .Concat(
+                        from x in AllPersons
+                        from z in AllPatients
+                        where (x.Name == @p1 || z.Id == new ObjectId { Value = @p2 })
+                        select x.Name
+                    );
+            }
+        }
+
+        public class GenericConcatJoinOrderQuery : GenericQueryBase
+        {
+            private String @p1;
+            private Int32 @p2;
+
+            public GenericConcatJoinOrderQuery(ITestDataContext ds, object[] args)
+                : base(ds)
+            {
+                @p1 = (String)args[0];
+                @p2 = (Int32)args[1];
+            }
+
+            public override IEnumerable<object> Query()
+            {
+                return (from j in
+                    (from y in AllPersons
+                     select new { FirstName = y.Name })
+                        .Concat(
+                            from x in AllPersons
+                            from z in AllPatients
+                            where (x.Name == @p1 || z.Id == new ObjectId { Value = @p2 })
+                            select new { FirstName = x.Name }
+                        )
+                        join g in AllGrandChilds on j.FirstName equals @p1
+                        orderby g.ParentID.Value
+                        select new { FirstName = g.ParentID.Value.ToString() });
+            }
+        }
+
+        #endregion
+
+        [Test]
+        public void TestMono01()
+        {
+            ForMySqlProvider(
+                db =>
+                    {
+                        var ds = new IdlPatientSource(db);
+                        var t = "A";
+                        var query =
+                            (from y in ds.Persons()
+                             select y.Name)
+                                .Concat(
+                                    from x in ds.Persons()
+                                    where x.Name == t
+                                    select x.Name
+                                );
+
+                        Assert.That(query.ToList(), Is.Not.Null);
+                    });
+        }
+
+        [Test]
+        public void TestMono03()
+        {
+            ForMySqlProvider(
+                db => Assert.That(new GenericConcatQuery(db, new object[] { "A", 1 }).Query().ToList(), Is.Not.Null));
+        }
+
+        [Test]
+        public void TestMono04()
+        {
+            ForMySqlProvider(
+                db =>
+                    Assert.That(
+                        new GenericConcatJoinOrderQuery(db, new object[] { "A", 1 }).Query().ToList(), Is.Not.Null));
+        }
+
+        public static IQueryable<TSource> Concat2<TSource>(IQueryable<TSource> source1, IEnumerable<TSource> source2)
+        {
+            return source1.Provider.CreateQuery<TSource>(
+                Expression.Call(
+                    null,
+                    typeof (Queryable).GetMethod("Concat").MakeGenericMethod(typeof (TSource)),
+                    new[] { source1.Expression, Expression.Constant(source2, typeof (IEnumerable<TSource>)) }));
+        }
+
+        [Test]
+        public void TestMonoConcat()
+        {
+            ForMySqlProvider(
+                db =>
+                    {
+                        var ds = new IdlPatientSource(db);
+                        var t = "A";
+                        var query = Concat2(
+                            from y in ds.Persons() select y.Name,
+                            from x in ds.Persons() where x.Name == t select x.Name);
+
+                        Assert.That(query.ToList(), Is.Not.Null);
+                    });
+        }
+
+        [Test]
+        public void TestMonoConcat2()
+        {
+            ForMySqlProvider(
+                db =>
+                    {
+                        var ds = new IdlPatientSource(db);
+                        var t = "A";
+                        var query1 = Concat2(
+                            from y in ds.Persons() select y.Name,
+                            from x in ds.Persons() where x.Name == t select x.Name);
+
+                        Assert.That(query1.ToList(), Is.Not.Null);
+                    });
+
+            ForMySqlProvider(
+                db =>
+                    {
+                        var ds = new IdlPatientSource(db);
+                        var t = "A";
+                        var query2 = Concat2(
+                            from y in ds.Persons() select y.Name,
+                            from x in ds.Persons() where x.Name == t select x.Name);
+
+                        Assert.That(query2.ToList(), Is.Not.Null);
+                    });
+        }
+    }
+
+    #region TestConvertFunction classes
+
+    public class IdlPatient
+    {
+        public IdlTest.ObjectId Id { get; set; }
+    }
+
+    public class IdlPerson
+    {
+        public IdlTest.ObjectId Id { get; set; }
+        public string Name { get; set; }
+    }
+
+    public class IdlGrandChild
+    {
+        public IdlTest.ObjectId ParentID { get; set; }
+        public IdlTest.ObjectId ChildID { get; set; }
+        public IdlTest.ObjectId GrandChildID { get; set; }
+    }
+
+    public class IdlPatientEx : IdlPatient
+    {
+        public IdlPerson Person { get; set; }
+    }
+
+    public class IdlPatientSource
+    {
+        private readonly ITestDataContext m_dc;
+
+        public IdlPatientSource(ITestDataContext dc)
+        {
+            m_dc = dc;
+        }
+
+        public IQueryable<IdlGrandChild> GrandChilds()
+        {
+            return m_dc.GrandChild.Select(
+                x => new IdlGrandChild
+                    {
+                        ChildID = new IdlTest.ObjectId { Value = x.ChildID.Value },
+                        GrandChildID = new IdlTest.ObjectId { Value = x.GrandChildID.Value },
+                        ParentID = new IdlTest.ObjectId { Value = x.ParentID.Value }
+                    });
+        }
+
+        public IQueryable<IdlPatient> Patients()
+        {
+            return m_dc.Patient.Select(x => new IdlPatient { Id = new IdlTest.ObjectId { Value = x.PersonID }, });
+        }
+
+        public IQueryable<IdlPerson> Persons()
+        {
+            return
+                m_dc.Person.Select(
+                    x => new IdlPerson { Id = new IdlTest.ObjectId { Value = x.ID }, Name = x.FirstName, });
+        }
+    }
+
+    public static class IdlPersonConverterExtensions
+    {
+        public static IEnumerable<IdlPatientEx> ToIdlPatientEx(
+            this IQueryable<IdlPatient> list, IdlPatientSource source)
+        {
+            return from x in list
+                   join person in source.Persons() on x.Id.Value equals person.Id.Value
+                   select new IdlPatientEx
+                       {
+                           Id = x.Id,
+                           Person =
+                               new IdlPerson { Id = new IdlTest.ObjectId { Value = person.Id }, Name = person.Name, },
+                       };
+        }
+    }
+
+    #endregion
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/IdlTest.mono.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,86 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	partial class IdlTest
+	{
+		partial class GenericQueryBase
+		{
+			protected IQueryable<IdlPatient> AllPatients2
+			{
+				get { return m_ds.Patients(); }
+			}
+		}
+
+		public class GenericConcatQuery1 : GenericQueryBase
+		{
+			private String @p1;
+			private Int32  @p2;
+
+			public GenericConcatQuery1(ITestDataContext ds, object[] args)
+				: base(ds)
+			{
+				@p1 = (String)args[0];
+				@p2 = (Int32) args[1];
+			}
+
+			public override IEnumerable<object> Query()
+			{
+				//return Queryable.Concat(
+				return Concat2(
+					from y in AllPersons select y.Name,
+					from x in AllPersons
+					from z in AllPatients
+					where (x.Name == @p1 || z.Id == new ObjectId { Value = @p2 })
+					select x.Name);
+			}
+		}
+
+		[Test]
+		public void TestMono03Mono()
+		{
+			ForMySqlProvider(
+				db => Assert.That(new GenericConcatQuery1(db, new object[] { "A", 1 }).Query().ToList(), Is.Not.Null));
+		}
+
+		public class GenericConcatJoinOrderQuery1 : GenericQueryBase
+		{
+			private String @p1;
+			private Int32 @p2;
+
+			public GenericConcatJoinOrderQuery1(ITestDataContext ds, object[] args)
+				: base(ds)
+			{
+				@p1 = (System.String)args[0];
+				@p2 = (System.Int32)args[1];
+			}
+
+			public override IEnumerable<object> Query()
+			{
+				return (from j in
+							//Queryable.Concat(
+							Concat2(
+								from y in AllPersons
+								select new { FirstName = y.Name },
+								from x in AllPersons
+								from z in AllPatients
+								where (x.Name == @p1 || z.Id == new ObjectId { Value = @p2 })
+								select new { FirstName = x.Name })
+						join g in AllGrandChilds on j.FirstName equals @p1
+						orderby g.ParentID.Value
+						select new { FirstName = g.ParentID.Value.ToString() });
+			}
+		}
+
+		[Test]
+		public void TestMono04Mono()
+		{
+			ForMySqlProvider(
+				db => Assert.That(new GenericConcatJoinOrderQuery1(db, new object[] { "A", 1 }).Query().ToList(), Is.Not.Null));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Inheritance.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,544 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using BLToolkit.Data.Sql.SqlProvider;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class Inheritance : TestBase
+	{
+		[Test]
+		public void Test1()
+		{
+			ForEachProvider(db => AreEqual(ParentInheritance, db.ParentInheritance));
+		}
+
+		[Test]
+		public void Test2()
+		{
+			ForEachProvider(db => AreEqual(ParentInheritance, db.ParentInheritance.Select(p => p)));
+		}
+
+		[Test]
+		public void Test3()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    ParentInheritance where p is ParentInheritance1 select p,
+				from p in db.ParentInheritance where p is ParentInheritance1 select p));
+		}
+
+		[Test]
+		public void Test4()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    ParentInheritance where !(p is ParentInheritanceNull) select p,
+				from p in db.ParentInheritance where !(p is ParentInheritanceNull) select p));
+		}
+
+		[Test]
+		public void Test5()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    ParentInheritance where p is ParentInheritanceValue select p,
+				from p in db.ParentInheritance where p is ParentInheritanceValue select p));
+		}
+
+		[Test]
+		public void Test6()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.ParentInheritance2 where p is ParentInheritance12 select p;
+				q.ToList();
+			});
+		}
+
+		[Test]
+		public void Test7()
+		{
+#pragma warning disable 183
+			var expected = from p in ParentInheritance where p is ParentInheritanceBase select p;
+			ForEachProvider(db => AreEqual(expected, from p in db.ParentInheritance where p is ParentInheritanceBase select p));
+#pragma warning restore 183
+		}
+
+		[Test]
+		public void Test8()
+		{
+			ForEachProvider(db => AreEqual(
+				   ParentInheritance.OfType<ParentInheritance1>(),
+				db.ParentInheritance.OfType<ParentInheritance1>()));
+		}
+
+		[Test]
+		public void Test9()
+		{
+			ForEachProvider(db =>
+				AreEqual(
+					   ParentInheritance
+						.Where(p => p.ParentID == 1 || p.ParentID == 2 || p.ParentID == 4)
+						.OfType<ParentInheritanceNull>(),
+					db.ParentInheritance
+						.Where(p => p.ParentID == 1 || p.ParentID == 2 || p.ParentID == 4)
+						.OfType<ParentInheritanceNull>()));
+		}
+
+		[Test]
+		public void Test10()
+		{
+			var expected = ParentInheritance.OfType<ParentInheritanceValue>();
+			ForEachProvider(db => AreEqual(expected, db.ParentInheritance.OfType<ParentInheritanceValue>()));
+		}
+
+		[Test]
+		public void Test11()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.ParentInheritance3 where p is ParentInheritance13 select p;
+				q.ToList();
+			});
+		}
+
+		[Test]
+		public void Test12()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    ParentInheritance1 where p.ParentID == 1 select p,
+				from p in db.ParentInheritance1 where p.ParentID == 1 select p));
+		}
+
+		//[Test]
+		public void Test13()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    ParentInheritance4
+				join c in    Child on p.ParentID equals c.ParentID
+				select p,
+				from p in db.ParentInheritance4
+				join c in db.Child on p.ParentID equals c.ParentID
+				select p));
+		}
+
+		[Test]
+		public void TypeCastAsTest1([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+				AreEqual(
+					   DiscontinuedProduct.ToList()
+						.Select(p => p as Northwind.Product)
+						.Select(p => p == null ? "NULL" : p.ProductName),
+					db.DiscontinuedProduct
+						.Select(p => p as Northwind.Product)
+						.Select(p => p == null ? "NULL" : p.ProductName));
+		}
+
+		[Test]
+		public void TypeCastAsTest11([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+				AreEqual(
+					   DiscontinuedProduct.ToList()
+						.Select(p => new { p = p as Northwind.Product })
+						.Select(p => p.p == null ? "NULL" : p.p.ProductName),
+					db.DiscontinuedProduct
+						.Select(p => new { p = p as Northwind.Product })
+						.Select(p => p.p == null ? "NULL" : p.p.ProductName));
+		}
+
+		[Test]
+		public void TypeCastAsTest2([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+				AreEqual(
+					   Product.ToList()
+						.Select(p => p as Northwind.DiscontinuedProduct)
+						.Select(p => p == null ? "NULL" : p.ProductName),
+					db.Product
+						.Select(p => p as Northwind.DiscontinuedProduct)
+						.Select(p => p == null ? "NULL" : p.ProductName));
+		}
+
+		[Test]
+		public void FirstOrDefault([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+				Assert.AreEqual(
+					   DiscontinuedProduct.FirstOrDefault().ProductID,
+					db.DiscontinuedProduct.FirstOrDefault().ProductID);
+		}
+
+		[Test]
+		public void Cast1()
+		{
+			ForEachProvider(db => AreEqual(
+				   ParentInheritance.OfType<ParentInheritance1>().Cast<ParentInheritanceBase>(),
+				db.ParentInheritance.OfType<ParentInheritance1>().Cast<ParentInheritanceBase>()));
+		}
+
+		class ParentEx : Parent
+		{
+			[MapIgnore]
+			protected bool Field1;
+
+			public static void Test(Inheritance inheritance)
+			{
+				inheritance.ForEachProvider(db => inheritance.AreEqual(
+					inheritance.Parent.Select(p => new ParentEx { Field1 = true, ParentID = p.ParentID, Value1 = p.Value1 }).Cast<Parent>(),
+							 db.Parent.Select(p => new ParentEx { Field1 = true, ParentID = p.ParentID, Value1 = p.Value1 }).Cast<Parent>()));
+			}
+		}
+
+		[Test]
+		public void Cast2()
+		{
+			ParentEx.Test(this);
+		}
+
+		[TableName("Person")]
+		class PersonEx : Person
+		{
+		}
+
+		[Test]
+		public void SimplTest()
+		{
+			using (var db = new TestDbManager())
+				Assert.AreEqual(1, db.GetTable<PersonEx>().Where(_ => _.FirstName == "John").Select(_ => _.ID).Single());
+		}
+
+		[InheritanceMapping(Code = 1, Type = typeof(Parent222))]
+		[TableName("Parent")]
+		public class Parent111
+		{
+			[MapField(IsInheritanceDiscriminator = true)]
+			public int ParentID;
+		}
+
+		[MapField("Value1", "Value.ID")]
+		public class Parent222 : Parent111
+		{
+			[MapIgnore]
+			public Value111 Value;
+		}
+
+		public class Value111
+		{
+			public int ID;
+		}
+
+		[Test]
+		public void InheritanceMappingIssueTest()
+		{
+			using (var db = new TestDbManager())
+			{
+				var q1 = db.GetTable<Parent222>();
+				var q  = q1.Where(_ => _.Value.ID == 1);
+
+				var sql = ((ExpressionQuery<Parent222>)q).SqlText;
+				Assert.IsNotEmpty(sql);
+			}
+		}
+
+		[Test]
+		public void ReferenceNavigation([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+			{
+				var result =
+					from od in db.OrderDetail
+					where od.Product.Category.CategoryName == "Seafood"
+					select new { od.Order, od.Product };
+				
+				var list = result.ToList();
+
+				Assert.AreEqual(330, list.Count);
+
+				foreach (var item in list)
+				{
+					Assert.IsNotNull(item);
+					Assert.IsNotNull(item.Order);
+					Assert.IsNotNull(item.Product);
+					Assert.IsTrue(
+						 item.Product.Discontinued && item.Product is Northwind.DiscontinuedProduct ||
+						!item.Product.Discontinued && item.Product is Northwind.ActiveProduct);
+				}
+			}
+		}
+
+		[Test]
+		public void TypeCastIsChildConditional1([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+			{
+				var result   = db.Product.         Select(x => x is Northwind.DiscontinuedProduct ? x : null);
+				var expected = db.Product.ToList().Select(x => x is Northwind.DiscontinuedProduct ? x : null);
+
+				var list = result.ToList();
+
+				Assert.Greater(list.Count, 0);
+				Assert.AreEqual(expected.Count(), list.Count);
+				Assert.IsTrue(list.Except(expected).Count() == 0);
+				Assert.IsTrue(list.Contains(null));
+			}
+		}
+
+		[Test]
+		public void TypeCastIsChildConditional2([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+			{
+				var result   = db.Product.         Select(x => x is Northwind.DiscontinuedProduct);
+				var expected = db.Product.ToList().Select(x => x is Northwind.DiscontinuedProduct);
+
+				var list = result.ToList();
+
+				Assert.Greater(list.Count, 0);
+				Assert.AreEqual(expected.Count(), list.Count);
+				Assert.IsTrue(list.Except(expected).Count() == 0);
+			}
+		}
+
+		[Test]
+		public void TypeCastIsChild([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+			{
+				var result   = db.Product.Where(x => x is Northwind.DiscontinuedProduct).ToList();
+				var expected =    Product.Where(x => x is Northwind.DiscontinuedProduct).ToList();
+
+				Assert.Greater(result.Count, 0);
+				Assert.AreEqual(result.Count, expected.Count);
+			}
+		}
+
+		#region Models for Test14
+
+		interface IChildTest14
+		{
+			int ChildID { get; set; }
+		}
+
+		[TableName("Child")]
+		class ChildTest14 : IChildTest14
+		{
+			[PrimaryKey]
+			public int ChildID { get; set; }
+
+		}
+
+		T FindById<T>(IQueryable<T> queryable, int id)
+			where T : IChildTest14
+		{
+			return queryable.Where(x => x.ChildID == id).FirstOrDefault();
+		}
+
+		#endregion
+
+		[Test]
+		public void Test14()
+		{
+			ForEachProvider(db =>
+			{
+				var q = db.GetTable<ChildTest14>().Select(c => new ChildTest14() { ChildID = c.ChildID });
+				FindById(q, 10);
+			});
+		}
+
+		[Test]
+		public void Test15([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+			{
+				var result   = db.DiscontinuedProduct.Select(p => p).ToList();
+				var expected =    DiscontinuedProduct.Select(p => p).ToList();
+
+				Assert.That(result.Count, Is.Not.EqualTo(0).And.EqualTo(expected.Count));
+			}
+		}
+
+		[Test]
+		public void Test16([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+			{
+				var result   = db.DiscontinuedProduct.ToList();
+				var expected =    DiscontinuedProduct.ToList();
+
+				Assert.That(result.Count, Is.Not.EqualTo(0).And.EqualTo(expected.Count));
+			}
+		}
+
+		public enum TypeCodeEnum
+		{
+			Base,
+			A,
+			A1,
+			A2,
+		}
+
+		[TableName("LinqDataTypes")]
+		public abstract class InheritanceBase
+		{
+			public Guid GuidValue { get; set; }
+
+			[MapField("ID")]
+			public virtual TypeCodeEnum TypeCode
+			{
+				get { return TypeCodeEnum.Base; }
+			}
+		}
+
+		[InheritanceMapping(Code = TypeCodeEnum.A1, Type = typeof(InheritanceA1), IsDefault = false)]
+		[InheritanceMapping(Code = TypeCodeEnum.A2, Type = typeof(InheritanceA2), IsDefault = true)]
+		public abstract class InheritanceA : InheritanceBase
+		{
+			[Association(CanBeNull = true, ThisKey = "GuidValue", OtherKey = "GuidValue")]
+			public List<InheritanceB> Bs { get; set; }
+
+			[MapField("ID", IsInheritanceDiscriminator = true)]
+			public override TypeCodeEnum TypeCode
+			{
+				get { return TypeCodeEnum.A; }
+			}
+		}
+
+		class InheritanceA1 : InheritanceA
+		{
+			[MapField("ID", IsInheritanceDiscriminator = true)]
+			public override TypeCodeEnum TypeCode
+			{
+				get { return TypeCodeEnum.A1; }
+			}
+		}
+
+		class InheritanceA2 : InheritanceA
+		{
+			[MapField("ID", IsInheritanceDiscriminator = true)]
+			public override TypeCodeEnum TypeCode
+			{
+				get { return TypeCodeEnum.A2; }
+			}
+		}
+
+		public class InheritanceB : InheritanceBase
+		{
+		}
+
+		[Test]
+		public void GuidTest()
+		{
+			using (var db = new TestDbManager())
+			{
+				var list = db.GetTable<InheritanceA>().Where(a => a.Bs.Any()).ToList();
+			}
+		}
+
+		[Test]
+		public void QuerySyntaxSimpleTest()
+		{
+			ForEachProvider(db =>
+			{
+				// db.GetTable<Parent111>().OfType<Parent222>().ToList(); - it's work!!!
+				(from p in db.GetTable<Parent111>().OfType<Parent222>() select p).ToList();
+			});
+		}
+
+		[TableName("Person")]
+		[InheritanceMapping(Code = 1, Type = typeof(Test17John))]
+		[InheritanceMapping(Code = 2, Type = typeof(Test17Tester))]
+		public class Test17Person
+		{
+			[MapField(IsInheritanceDiscriminator = true)]
+			public int PersonID { get; set; }
+		}
+
+		public class Test17John : Test17Person
+		{
+			public string FirstName { get; set; }
+		}
+
+		public class Test17Tester : Test17Person
+		{
+			public string LastName { get; set; }
+		}
+
+		[Test]
+		public void Test17()
+		{
+			ForEachProvider(context =>
+			{
+				if (context is TestDbManager)
+				{
+					var db = (TestDbManager)context;
+					db.GetTable<Test17Person>().OfType<Test17John>().ToList();
+					Assert.False(db.LastQuery.ToLowerInvariant().Contains("lastname"), "Why select LastName field??");
+				}
+			});
+		}
+
+		[TableName("Person")]
+		[InheritanceMapping(Code = Gender.Male,   Type = typeof(Test18Male))]
+		[InheritanceMapping(Code = Gender.Female, Type = typeof(Test18Female))]
+		public class Test18Person
+		{
+			[PrimaryKey, NonUpdatable(IsIdentity = true, OnInsert = true, OnUpdate = true), SequenceName("PERSONID")]
+			public int    PersonID { get; set; }
+			[MapField(IsInheritanceDiscriminator = true)]
+			public Gender Gender   { get; set; }
+		}
+
+		public class Test18Male : Test18Person
+		{
+			public string FirstName { get; set; }
+		}
+
+		public class Test18Female : Test18Person
+		{
+			public string FirstName { get; set; }
+			public string LastName  { get; set; }
+		}
+
+		[Test]
+		public void Test18()
+		{
+			ForEachProvider(db =>
+			{
+				var ids = Enumerable.Range(0, 10).ToList();
+				var q   =
+					from p1 in db.GetTable<Test18Person>()
+					where ids.Contains(p1.PersonID)
+					join p2 in db.GetTable<Test18Person>() on p1.PersonID equals p2.PersonID
+					select p1;
+
+				var list = q.Distinct().OfType<Test18Female>().ToList();
+			});
+		}
+
+		[Test]
+		public void Test19()
+		{
+			ForEachProvider(db =>
+			{
+				var ids = Enumerable.Range(0, 10).ToList();
+				var q   =
+					from p1 in db.GetTable<Test18Person>()
+					where ids.Contains(p1.PersonID)
+					join p2 in db.GetTable<Test18Person>() on p1.PersonID equals p2.PersonID
+					select p1;
+
+				IQueryable iq   = q.Distinct();
+				var        list = iq.OfType<Test18Female>().ToList();
+			});
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/InsertTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1012 @@
+using System;
+using System.Linq;
+
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using BLToolkit.Data.Sql.SqlProvider;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+using NUnit.Framework;
+
+using Data.Linq;
+using Data.Linq.Model;
+
+#region ReSharper disable
+// ReSharper disable ConvertToConstant.Local
+#endregion
+
+namespace Update
+{
+	[TestFixture]
+	public class InsertTest : TestBase
+	{
+		[Test]
+		public void DistinctInsert1()
+		{
+			ForEachProvider(new[] { ProviderName.DB2, ProviderName.Informix, ProviderName.PostgreSQL, ProviderName.SQLite, ProviderName.Access }, db =>
+			{
+				try
+				{
+					db.Types.Delete(c => c.ID > 1000);
+
+					Assert.AreEqual(
+						Types.Select(_ => _.ID / 3).Distinct().Count(),
+						db
+							.Types
+							.Select(_ => Math.Floor(_.ID / 3.0))
+							.Distinct()
+							.Insert(db.Types, _ => new LinqDataTypes
+							{
+								ID        = (int)(_ + 1001),
+								GuidValue = Sql.NewGuid(),
+								BoolValue = true
+							}));
+				}
+				finally
+				{
+					db.Types.Delete(c => c.ID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void DistinctInsert2()
+		{
+			ForEachProvider(new[] { ProviderName.DB2, ProviderName.Informix, ProviderName.PostgreSQL, ProviderName.SQLite, ProviderName.Access }, db =>
+			{
+				try
+				{
+					db.Types.Delete(c => c.ID > 1000);
+
+					Assert.AreEqual(
+						Types.Select(_ => _.ID / 3).Distinct().Count(),
+						db.Types
+							.Select(_ => Math.Floor(_.ID / 3.0))
+							.Distinct()
+							.Into(db.Types)
+								.Value(t => t.ID,        t => (int)(t + 1001))
+								.Value(t => t.GuidValue, t => Sql.NewGuid())
+								.Value(t => t.BoolValue, t => true)
+							.Insert());
+				}
+				finally
+				{
+					db.Types.Delete(c => c.ID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Insert1()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Child.Delete(c => c.ChildID > 1000);
+
+					Assert.AreEqual(1,
+						db.Child
+						.Insert(() => new Child
+						{
+							ParentID = 1,
+							ChildID  = id
+						}));
+
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id));
+				}
+				finally
+				{
+					db.Child.Delete(c => c.ChildID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Insert2()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Child.Delete(c => c.ChildID > 1000);
+
+					Assert.AreEqual(1,
+						db
+							.Into(db.Child)
+								.Value(c => c.ParentID, () => 1)
+								.Value(c => c.ChildID,  () => id)
+							.Insert());
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id));
+				}
+				finally
+				{
+					db.Child.Delete(c => c.ChildID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Insert3()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Child.Delete(c => c.ChildID > 1000);
+
+					Assert.AreEqual(1,
+						db.Child
+							.Where(c => c.ChildID == 11)
+							.Insert(db.Child, c => new Child
+							{
+								ParentID = c.ParentID,
+								ChildID  = id
+							}));
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id));
+				}
+				finally
+				{
+					db.Child.Delete(c => c.ChildID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Insert31()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Child.Delete(c => c.ChildID > 1000);
+
+					Assert.AreEqual(1,
+						db.Child
+							.Where(c => c.ChildID == 11)
+							.Select(c => new Child
+							{
+								ParentID = c.ParentID,
+								ChildID  = id
+							})
+							.Insert(db.Child, c => c));
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id));
+				}
+				finally
+				{
+					db.Child.Delete(c => c.ChildID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Insert4()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Child.Delete(c => c.ChildID > 1000);
+
+					Assert.AreEqual(1,
+						db.Child
+							.Where(c => c.ChildID == 11)
+							.Into(db.Child)
+								.Value(c => c.ParentID, c  => c.ParentID)
+								.Value(c => c.ChildID,  () => id)
+							.Insert());
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id));
+				}
+				finally
+				{
+					db.Child.Delete(c => c.ChildID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Insert5()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Child.Delete(c => c.ChildID > 1000);
+
+					Assert.AreEqual(1,
+						db.Child
+							.Where(c => c.ChildID == 11)
+							.Into(db.Child)
+								.Value(c => c.ParentID, c => c.ParentID)
+								.Value(c => c.ChildID,  id)
+							.Insert());
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id));
+				}
+				finally
+				{
+					db.Child.Delete(c => c.ChildID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Insert6()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					db.Parent.Delete(p => p.Value1 == 11);
+
+					Assert.AreEqual(1,
+						db.Child
+							.Where(c => c.ChildID == 11)
+							.Into(db.Parent)
+								.Value(p => p.ParentID, c => c.ParentID)
+								.Value(p => p.Value1,   c => (int?)c.ChildID)
+							.Insert());
+					Assert.AreEqual(1, db.Parent.Count(p => p.Value1 == 11));
+				}
+				finally
+				{
+					db.Parent.Delete(p => p.Value1 == 11);
+				}
+			});
+		}
+
+		[Test]
+		public void Insert7()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Child.Delete(c => c.ChildID > 1000);
+
+					Assert.AreEqual(1,
+						db
+							.Child
+								.Value(c => c.ChildID,  () => id)
+								.Value(c => c.ParentID, 1)
+							.Insert());
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id));
+				}
+				finally
+				{
+					db.Child.Delete(c => c.ChildID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Insert8()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Child.Delete(c => c.ChildID > 1000);
+
+					Assert.AreEqual(1,
+						db
+							.Child
+								.Value(c => c.ParentID, 1)
+								.Value(c => c.ChildID,  () => id)
+							.Insert());
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id));
+				}
+				finally
+				{
+					db.Child.Delete(c => c.ChildID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Insert9()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Child. Delete(c => c.ParentID > 1000);
+					db.Parent.Delete(p => p.ParentID > 1000);
+
+					db.Insert(new Parent { ParentID = id, Value1 = id });
+		
+					Assert.AreEqual(1,
+						db.Parent
+							.Where(p => p.ParentID == id)
+							.Insert(db.Child, p => new Child
+							{
+								ParentID = p.ParentID,
+								ChildID  = p.ParentID,
+							}));
+					Assert.AreEqual(1, db.Child.Count(c => c.ParentID == id));
+				}
+				finally
+				{
+					db.Child. Delete(c => c.ParentID > 1000);
+					db.Parent.Delete(p => p.ParentID > 1000);
+				}
+			});
+		}
+
+		[TableName("LinqDataTypes")]
+		public class LinqDataTypesArrayTest
+		{
+			public int      ID;
+			public decimal  MoneyValue;
+			public DateTime DateTimeValue;
+			public bool     BoolValue;
+			public Guid     GuidValue;
+			public byte[]   BinaryValue;
+			public short    SmallIntValue;
+		}
+
+		[Test]
+		public void InsertArray1()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					var types = db.GetTable<LinqDataTypesArrayTest>();
+
+					types.Delete(t => t.ID > 1000);
+					types.Insert(() => new LinqDataTypesArrayTest { ID = 1001, BoolValue = true, BinaryValue = null });
+
+					Assert.IsNull(types.Single(t => t.ID == 1001).BinaryValue);
+				}
+				finally
+				{
+					db.GetTable<LinqDataTypesArrayTest>().Delete(t => t.ID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void InsertArray2()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					var types = db.GetTable<LinqDataTypesArrayTest>();
+
+					types.Delete(t => t.ID > 1000);
+
+					byte[] arr = null;
+
+					types.Insert(() => new LinqDataTypesArrayTest { ID = 1001, BoolValue = true, BinaryValue = arr });
+
+					var res = types.Single(t => t.ID == 1001).BinaryValue;
+
+					Assert.IsNull(res);
+				}
+				finally
+				{
+					db.GetTable<LinqDataTypesArrayTest>().Delete(t => t.ID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void InsertUnion1()
+		{
+			Child.Count();
+
+			ForEachProvider(
+				db =>
+				{
+					db.Parent.Delete(p => p.ParentID > 1000);
+
+					try
+					{
+						var q =
+							db.Child.     Select(c => new Parent { ParentID = c.ParentID,      Value1 = (int) Math.Floor(c.ChildID / 10.0) }).Union(
+							db.GrandChild.Select(c => new Parent { ParentID = c.ParentID ?? 0, Value1 = (int?)Math.Floor((c.GrandChildID ?? 0) / 100.0) }));
+
+						q.Insert(db.Parent, p => new Parent
+						{
+							ParentID = p.ParentID + 1000,
+							Value1   = p.Value1
+						});
+
+						Assert.AreEqual(
+							Child.     Select(c => new { ParentID = c.ParentID      }).Union(
+							GrandChild.Select(c => new { ParentID = c.ParentID ?? 0 })).Count(),
+							db.Parent.Count(c => c.ParentID > 1000));
+					}
+					finally
+					{
+						db.Parent.Delete(p => p.ParentID > 1000);
+					}
+				});
+		}
+
+		[Test]
+		public void InsertEnum1()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Parent4.Delete(_ => _.ParentID > 1000);
+
+					var p = new Parent4
+					{
+						ParentID = id,
+						Value1   = TypeValue.Value2
+					};
+
+					Assert.AreEqual(1,
+						db.Parent4
+						.Insert(() => new Parent4
+						{
+							ParentID = 1001,
+							Value1   = p.Value1
+						}));
+
+					Assert.AreEqual(1, db.Parent4.Count(_ => _.ParentID == id && _.Value1 == p.Value1));
+				}
+				finally
+				{
+					db.Parent4.Delete(_ => _.ParentID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void InsertEnum2()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Parent4.Delete(_ => _.ParentID > 1000);
+
+					Assert.AreEqual(1,
+						db.Parent4
+							.Value(_ => _.ParentID, id)
+							.Value(_ => _.Value1,   TypeValue.Value1)
+						.Insert());
+
+					Assert.AreEqual(1, db.Parent4.Count(_ => _.ParentID == id));
+				}
+				finally
+				{
+					db.Parent4.Delete(_ => _.ParentID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void InsertEnum3()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Parent4.Delete(_ => _.ParentID > 1000);
+
+					Assert.AreEqual(1,
+						db.Parent4
+							.Value(_ => _.ParentID, id)
+							.Value(_ => _.Value1,   () => TypeValue.Value1)
+						.Insert());
+
+					Assert.AreEqual(1, db.Parent4.Count(_ => _.ParentID == id));
+				}
+				finally
+				{
+					db.Parent4.Delete(_ => _.ParentID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void InsertNull()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					db.Parent.Delete(p => p.ParentID == 1001);
+
+					Assert.AreEqual(1,
+						db
+							.Into(db.Parent)
+								.Value(p => p.ParentID, 1001)
+								.Value(p => p.Value1,   (int?)null)
+							.Insert());
+					Assert.AreEqual(1, db.Parent.Count(p => p.ParentID == 1001));
+				}
+				finally
+				{
+					db.Parent.Delete(p => p.Value1 == 1001);
+				}
+			});
+		}
+
+		[Test]
+		public void InsertWithIdentity1()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					db.Person.Delete(p => p.ID > 2);
+
+					var id =
+						db.Person
+							.InsertWithIdentity(() => new Person
+							{
+								FirstName = "John",
+								LastName  = "Shepard",
+								Gender    = Gender.Male
+							});
+
+					Assert.NotNull(id);
+
+					var john = db.Person.Single(p => p.FirstName == "John" && p.LastName == "Shepard");
+
+					Assert.NotNull (john);
+					Assert.AreEqual(id, john.ID);
+				}
+				finally
+				{
+					db.Person.Delete(p => p.ID > 2);
+				}
+			});
+		}
+
+		[Test]
+		public void InsertWithIdentity2()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					db.Person.Delete(p => p.ID > 2);
+
+					var id = db
+						.Into(db.Person)
+							.Value(p => p.FirstName, () => "John")
+							.Value(p => p.LastName,  () => "Shepard")
+							.Value(p => p.Gender,    () => Gender.Male)
+						.InsertWithIdentity();
+
+					Assert.NotNull(id);
+
+					var john = db.Person.Single(p => p.FirstName == "John" && p.LastName == "Shepard");
+
+					Assert.NotNull (john);
+					Assert.AreEqual(id, john.ID);
+				}
+				finally
+				{
+					db.Person.Delete(p => p.ID > 2);
+				}
+			});
+		}
+
+		[Test]
+		public void InsertWithIdentity3()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					db.Person.Delete(p => p.ID > 2);
+
+					var id = db
+						.Into(db.Person)
+							.Value(p => p.FirstName, "John")
+							.Value(p => p.LastName,  "Shepard")
+							.Value(p => p.Gender,    Gender.Male)
+						.InsertWithIdentity();
+
+					Assert.NotNull(id);
+
+					var john = db.Person.Single(p => p.FirstName == "John" && p.LastName == "Shepard");
+
+					Assert.NotNull (john);
+					Assert.AreEqual(id, john.ID);
+				}
+				finally
+				{
+					db.Person.Delete(p => p.ID > 2);
+				}
+			});
+		}
+
+		[Test]
+		public void InsertWithIdentity4()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					for (var i = 0; i < 2; i++)
+					{
+						db.Person.Delete(p => p.ID > 2);
+
+						var id = db.InsertWithIdentity(
+							new Person
+							{
+								FirstName = "John" + i,
+								LastName  = "Shepard",
+								Gender    = Gender.Male
+							});
+
+						Assert.NotNull(id);
+
+						var john = db.Person.Single(p => p.FirstName == "John" + i && p.LastName == "Shepard");
+
+						Assert.NotNull (john);
+						Assert.AreEqual(id, john.ID);
+					}
+				}
+				finally
+				{
+					db.Person.Delete(p => p.ID > 2);
+				}
+			});
+		}
+
+		[Test]
+		public void InsertWithIdentity5()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					for (var i = 0; i < 2; i++)
+					{
+						db.Person.Delete(p => p.ID > 2);
+
+						var person = new Person
+						{
+							FirstName = "John" + i,
+							LastName  = "Shepard",
+							Gender    = Gender.Male
+						};
+
+						var id = db.InsertWithIdentity(person);
+
+						Assert.NotNull(id);
+
+						var john = db.Person.Single(p => p.FirstName == "John" + i && p.LastName == "Shepard");
+
+						Assert.NotNull (john);
+						Assert.AreEqual(id, john.ID);
+					}
+				}
+				finally
+				{
+					db.Person.Delete(p => p.ID > 2);
+				}
+			});
+		}
+
+		[Test]
+		public void InsertOrUpdate1()
+		{
+			ForEachProvider(db =>
+			{
+				var id = 0;
+
+				try
+				{
+					id = Convert.ToInt32(db.Person.InsertWithIdentity(() => new Person
+					{
+						FirstName = "John",
+						LastName  = "Shepard",
+						Gender    = Gender.Male
+					}));
+
+					for (var i = 0; i < 3; i++)
+					{
+						db.Patient.InsertOrUpdate(
+							() => new Patient
+							{
+								PersonID  = id,
+								Diagnosis = "abc",
+							},
+							p => new Patient
+							{
+								Diagnosis = (p.Diagnosis.Length + i).ToString(),
+							});
+					}
+
+					Assert.AreEqual("3", db.Patient.Single(p => p.PersonID == id).Diagnosis);
+				}
+				finally
+				{
+					db.Patient.Delete(p => p.PersonID == id);
+					db.Person. Delete(p => p.ID       == id);
+				}
+			});
+		}
+
+		[Test]
+		public void InsertOrReplace1()
+		{
+			ForEachProvider(db =>
+			{
+				var id = 0;
+
+				try
+				{
+					id = Convert.ToInt32(db.Person.InsertWithIdentity(() => new Person
+					{
+						FirstName = "John",
+						LastName  = "Shepard",
+						Gender    = Gender.Male
+					}));
+
+					for (var i = 0; i < 3; i++)
+					{
+						db.InsertOrReplace(new Patient
+						{
+							PersonID  = id,
+							Diagnosis = ("abc" + i).ToString(),
+						});
+					}
+
+					Assert.AreEqual("abc2", db.Patient.Single(p => p.PersonID == id).Diagnosis);
+				}
+				finally
+				{
+					db.Patient.Delete(p => p.PersonID == id);
+					db.Person. Delete(p => p.ID       == id);
+				}
+			});
+		}
+
+		[Test]
+		public void InsertOrUpdate3()
+		{
+			ForEachProvider(db =>
+			{
+				var id = 0;
+
+				try
+				{
+					id = Convert.ToInt32(db.Person.InsertWithIdentity(() => new Person
+					{
+						FirstName = "John",
+						LastName  = "Shepard",
+						Gender    = Gender.Male
+					}));
+
+					var diagnosis = "abc";
+
+					for (var i = 0; i < 3; i++)
+					{
+						db.Patient.InsertOrUpdate(
+							() => new Patient
+							{
+								PersonID  = id,
+								Diagnosis = "abc",
+							},
+							p => new Patient
+							{
+								Diagnosis = (p.Diagnosis.Length + i).ToString(),
+							},
+							() => new Patient
+							{
+								PersonID  = id,
+								//Diagnosis = diagnosis,
+							});
+
+						diagnosis = (diagnosis.Length + i).ToString();
+					}
+
+					Assert.AreEqual("3", db.Patient.Single(p => p.PersonID == id).Diagnosis);
+				}
+				finally
+				{
+					db.Patient.Delete(p => p.PersonID == id);
+					db.Person. Delete(p => p.ID       == id);
+				}
+			});
+		}
+
+		[Test]
+		public void InsertBatch1()
+		{
+			ForEachProvider(new[] { ProviderName.PostgreSQL }, db =>
+			{
+				if (db is DbManager && ((DbManager)db).ConfigurationString == "Oracle")
+				{
+					db.Types2.Delete(_ => _.ID > 1000);
+
+					((DbManager)db).InsertBatch(1, new[]
+					{
+						new LinqDataTypes2 { ID = 1003, MoneyValue = 0m, DateTimeValue = null,         BoolValue = true,  GuidValue = new Guid("ef129165-6ffe-4df9-bb6b-bb16e413c883"), SmallIntValue =  null, IntValue = null },
+						new LinqDataTypes2 { ID = 1004, MoneyValue = 0m, DateTimeValue = DateTime.Now, BoolValue = false, GuidValue = null,                                             SmallIntValue =  2,    IntValue = 1532334 },
+					});
+
+					db.Types2.Delete(_ => _.ID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void InsertBatch2([IncludeDataContexts("Sql2008", "Sql2012")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				db.Types2.Delete(_ => _.ID > 1000);
+
+				db.InsertBatch(100, new[]
+				{
+					new LinqDataTypes2 { ID = 1003, MoneyValue = 0m, DateTimeValue = null,         BoolValue = true,  GuidValue = new Guid("ef129165-6ffe-4df9-bb6b-bb16e413c883"), SmallIntValue =  null, IntValue = null },
+					new LinqDataTypes2 { ID = 1004, MoneyValue = 0m, DateTimeValue = DateTime.Now, BoolValue = false, GuidValue = null,                                             SmallIntValue =  2,    IntValue = 1532334 },
+				});
+
+				db.Types2.Delete(_ => _.ID > 1000);
+			}
+		}
+
+		[TableName("Parent")]
+		public class  NullableFieldTestObject
+		{
+			public int ParentID;
+			[BLToolkit.Mapping.Nullable] public int Value1;
+		}
+
+		[Test]
+		public void NullableFieldTest()
+		{
+			ForEachProvider(db =>
+			{
+				db.Parent.Delete(p => p.ParentID == 1100);
+
+				db.Insert(new NullableFieldTestObject { ParentID = 1100 });
+
+				var parent = db.Parent.Single(p => p.ParentID == 1100);
+
+				Assert.IsNull(parent.Value1);
+			});
+		}
+
+		public class FullName
+		{
+			           public string FirstName     { get; set; }
+			           public string LastName;
+			[Nullable] public string MiddleName;
+		}
+
+		[TableName("Person")]
+		[MapField("FirstName",  "Name.FirstName")]
+		[MapField("LastName",   "Name.LastName")]
+		[MapField("MiddleName", "Name.MiddleName")]
+		public class TestPerson1
+		{
+			[Identity, PrimaryKey]
+			//[SequenceName("PostgreSQL", "Seq")]
+			[SequenceName("Firebird", "PersonID")]
+			[MapField("PersonID")]
+			public int ID;
+
+			public string Gender;
+
+			public FullName Name;
+		}
+
+		[Test]
+		public void Insert11()
+		{
+			var p = new TestPerson1 { Name = new FullName { FirstName = "fn", LastName = "ln" }, Gender = "M" };
+
+			ForEachProvider(db => db.Insert(p));
+		}
+
+		[Test]
+		public void Insert12()
+		{
+			ForEachProvider(db => db
+				.Into(db.GetTable<TestPerson1>())
+					.Value(_ => _.Name.FirstName, "FirstName")
+					.Value(_ => _.Name.LastName, () => "LastName")
+					.Value(_ => _.Gender,         "F")
+				.Insert());
+
+		}
+
+		[Test]
+		public void Insert13()
+		{
+			ForEachProvider(db => db.GetTable<TestPerson1>()
+				.Insert(() => new TestPerson1
+				{
+					Name = new FullName
+					{
+						FirstName = "FirstName",
+						LastName  = "LastName"
+					},
+					Gender = "M",
+				}));
+		}
+
+		[Test]
+		public void Insert14()
+		{
+			ForEachProvider(
+				new [] { ProviderName.SqlCe, ProviderName.Access, "Sql2000", "Sql2005", ProviderName.Sybase },
+				db =>
+				{
+					try
+					{
+						db.Person.Delete(p => p.FirstName.StartsWith("Insert14"));
+
+						Assert.AreEqual(1,
+							db.Person
+							.Insert(() => new Person
+							{
+								FirstName = "Insert14" + db.Person.Where(p => p.ID == 1).Select(p => p.FirstName).FirstOrDefault(),
+								LastName  = "Shepard",
+								Gender = Gender.Male
+							}));
+
+						Assert.AreEqual(1, db.Person.Count(p => p.FirstName.StartsWith("Insert14")));
+					}
+					finally
+					{
+						db.Person.Delete(p => p.FirstName.StartsWith("Insert14"));
+					}
+				});
+		}
+
+		[Test]
+		public void InsertSingleIdentity()
+		{
+			ForEachProvider(
+				new [] { ProviderName.Informix, ProviderName.SqlCe },
+				db =>
+				{
+					try
+					{
+						db.TestIdentity.Delete();
+
+						var id = db.TestIdentity.InsertWithIdentity(() => new TestIdentity {});
+
+						Assert.NotNull(id);
+					}
+					finally
+					{
+						db.TestIdentity.Delete();
+					}
+				});
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/JoinTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,814 @@
+using System;
+using System.Linq;
+
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class JoinTest : TestBase
+	{
+		[Test]
+		public void InnerJoin1()
+		{
+			TestJohn(db =>
+				from p1 in db.Person
+					join p2 in db.Person on p1.ID equals p2.ID
+				where p1.ID == 1
+				select new Person { ID = p1.ID, FirstName = p2.FirstName });
+		}
+
+		[Test]
+		public void InnerJoin2()
+		{
+			TestJohn(db =>
+				from p1 in db.Person
+					join p2 in db.Person on new { p1.ID, p1.FirstName } equals new { p2.ID, p2.FirstName }
+				where p1.ID == 1
+				select new Person { ID = p1.ID, FirstName = p2.FirstName });
+		}
+
+		[Test]
+		public void InnerJoin3()
+		{
+			TestJohn(db =>
+				from p1 in db.Person
+					join p2 in
+						from p2 in db.Person join p3 in db.Person on new { p2.ID, p2.LastName } equals new { p3.ID, p3.LastName } select new { p2, p3 }
+					on new { p1.ID, p1.FirstName } equals new { p2.p2.ID, p2.p2.FirstName }
+				where p1.ID == 1
+				select new Person { ID = p1.ID, FirstName = p2.p2.FirstName, LastName = p2.p3.LastName });
+		}
+
+		[Test]
+		public void InnerJoin4()
+		{
+			TestJohn(db =>
+				from p1 in db.Person
+					join p2 in db.Person on new { p1.ID, p1.FirstName } equals new { p2.ID, p2.FirstName }
+						join p3 in db.Person on new { p2.ID, p2.LastName } equals new { p3.ID, p3.LastName }
+				where p1.ID == 1
+				select new Person { ID = p1.ID, FirstName = p2.FirstName, LastName = p3.LastName });
+		}
+
+		[Test]
+		public void InnerJoin5()
+		{
+			TestJohn(db =>
+				from p1 in db.Person
+				join p2 in db.Person on new { p1.ID, p1.FirstName } equals new { p2.ID, p2.FirstName }
+				join p3 in db.Person on new { p1.ID, p2.LastName  } equals new { p3.ID, p3.LastName  }
+				where p1.ID == 1
+				select new Person { ID = p1.ID, FirstName = p2.FirstName, LastName = p3.LastName });
+		}
+
+		[Test]
+		public void InnerJoin6()
+		{
+			TestJohn(db =>
+				from p1 in db.Person
+					join p2 in from p3 in db.Person select new { ID = p3.ID + 1, p3.FirstName } on p1.ID equals p2.ID - 1
+				where p1.ID == 1
+				select new Person { ID = p1.ID, FirstName = p2.FirstName });
+		}
+
+		[Test]
+		public void InnerJoin7()
+		{
+			var expected =
+				from t in
+					from ch in Child
+						join p in Parent on ch.ParentID equals p.ParentID
+					select ch.ParentID + p.ParentID
+				where t > 2
+				select t;
+
+			ForEachProvider(db => AreEqual(expected,
+				from t in
+					from ch in db.Child
+						join p in db.Parent on ch.ParentID equals p.ParentID
+					select ch.ParentID + p.ParentID
+				where t > 2
+				select t));
+		}
+
+		[Test]
+		public void InnerJoin8()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in
+					from ch in Child
+						join p in Parent on ch.ParentID equals p.ParentID
+					select new { ID = ch.ParentID + p.ParentID }
+				where t.ID > 2
+				select t,
+				from t in
+					from ch in db.Child
+						join p in db.Parent on ch.ParentID equals p.ParentID
+					select new { ID = ch.ParentID + p.ParentID }
+				where t.ID > 2
+				select t));
+		}
+
+		[Test]
+		public void InnerJoin9()
+		{
+			ForEachProvider(new[] { ProviderName.Access }, db => AreEqual(
+				from g in GrandChild
+				join p in Parent4 on g.Child.ParentID equals p.ParentID
+				where g.ParentID < 10 && p.Value1 == TypeValue.Value3
+				select g,
+				from g in db.GrandChild
+				join p in db.Parent4 on g.Child.ParentID equals p.ParentID
+				where g.ParentID < 10 && p.Value1 == TypeValue.Value3
+				select g));
+		}
+
+		[Test]
+		public void InnerJoin10()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent
+				join g in    GrandChild on p.ParentID equals g.ParentID into q
+				from q1 in q
+				select new { p.ParentID, q1.GrandChildID },
+				from p in db.Parent
+				join g in db.GrandChild on p.ParentID equals g.ParentID into q
+				from q1 in q
+				select new { p.ParentID, q1.GrandChildID }));
+		}
+
+		[Test]
+		public void GroupJoin1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+					join ch in Child on p.ParentID equals ch.ParentID into lj1
+				where p.ParentID == 1
+				select p,
+				from p in db.Parent
+					join ch in db.Child on p.ParentID equals ch.ParentID into lj1
+				where p.ParentID == 1
+				select p));
+		}
+
+		[Test]
+		public void GroupJoin2()
+		{
+			ForEachProvider(db =>
+			{
+				var q = 
+					from p in db.Parent
+						join c in db.Child on p.ParentID equals c.ParentID into lj
+					where p.ParentID == 1
+					select new { p, lj };
+
+				var list = q.ToList();
+
+				Assert.AreEqual(1, list.Count);
+				Assert.AreEqual(1, list[0].p.ParentID);
+				Assert.AreEqual(1, list[0].lj.Count());
+
+				var ch = list[0].lj.ToList();
+
+				Assert.AreEqual( 1, ch[0].ParentID);
+				Assert.AreEqual(11, ch[0].ChildID);
+			});
+		}
+
+		[Test]
+		public void GroupJoin3()
+		{
+			var q1 = Parent
+				.GroupJoin(
+					Child,
+					p  => p.ParentID,
+					ch => ch.ParentID,
+					(p, lj1) => new { p, lj1 = new { lj1 } }
+				)
+				.Where (t => t.p.ParentID == 2)
+				.Select(t => new { t.p, t.lj1 });
+
+			var list1 = q1.ToList();
+
+			ForEachProvider(db =>
+			{
+				var q2 = db.Parent
+					.GroupJoin(
+						db.Child,
+						p  => p.ParentID,
+						ch => ch.ParentID,
+						(p, lj1) => new { p, lj1 = new { lj1 } }
+					)
+					.Where (t => t.p.ParentID == 2)
+					.Select(t => new { t.p, t.lj1 });
+
+				var list2 = q2.ToList();
+
+				Assert.AreEqual(list1.Count,              list2.Count);
+				Assert.AreEqual(list1[0].p.ParentID,      list2[0].p.ParentID);
+				Assert.AreEqual(list1[0].lj1.lj1.Count(), list2[0].lj1.lj1.Count());
+			});
+		}
+
+		[Test]
+		public void GroupJoin4()
+		{
+			var q1 =
+				from p in Parent
+					join ch in
+						from c in Child select new { c.ParentID, c.ChildID }
+					on p.ParentID equals ch.ParentID into lj1
+				where p.ParentID == 3
+				select new { p, lj1 };
+
+			var list1 = q1.ToList();
+
+			ForEachProvider(db =>
+			{
+				var q2 =
+					from p in db.Parent
+						join ch in
+							from c in db.Child select new { c.ParentID, c.ChildID }
+						on p.ParentID equals ch.ParentID into lj1
+					where p.ParentID == 3
+					select new { p, lj1 };
+
+				var list2 = q2.ToList();
+
+				Assert.AreEqual(list1.Count,          list2.Count);
+				Assert.AreEqual(list1[0].p.ParentID,  list2[0].p.ParentID);
+				Assert.AreEqual(list1[0].lj1.Count(), list2[0].lj1.Count());
+			});
+		}
+
+		[Test]
+		public void GroupJoin5()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+					join ch in Child on p.ParentID equals ch.ParentID into lj1
+				where p.ParentID == 1
+				select lj1.First(),
+				from p in db.Parent
+					join ch in db.Child on p.ParentID equals ch.ParentID into lj1
+				where p.ParentID == 1
+				select lj1.First()));
+		}
+
+		[Test]
+		public void GroupJoin51()
+		{
+			var expected =
+			(
+				from p in Parent
+					join ch in Child on p.ParentID equals ch.ParentID into lj1
+				where p.ParentID == 1
+				select new { p1 = lj1, p2 = lj1.First() }
+			).ToList();
+
+			ForEachProvider(db =>
+			{
+				var result =
+				(
+					from p in db.Parent
+						join ch in db.Child on p.ParentID equals ch.ParentID into lj1
+					where p.ParentID == 1
+					select new { p1 = lj1, p2 = lj1.First() }
+				).ToList();
+
+				Assert.AreEqual(expected.Count, result.Count);
+				AreEqual(expected[0].p1, result[0].p1);
+			});
+		}
+
+		[Test]
+		public void GroupJoin52()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+					join ch in Child on p.ParentID equals ch.ParentID into lj1
+				where p.ParentID == 1
+				select lj1.First().ParentID,
+				from p in db.Parent
+					join ch in db.Child on p.ParentID equals ch.ParentID into lj1
+				where p.ParentID == 1
+				select lj1.First().ParentID));
+		}
+
+		[Test]
+		public void GroupJoin53()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+					join ch in Child on p.ParentID equals ch.ParentID into lj1
+				where p.ParentID == 1
+				select lj1.Select(_ => _.ParentID).First(),
+				from p in db.Parent
+					join ch in db.Child on p.ParentID equals ch.ParentID into lj1
+				where p.ParentID == 1
+				select lj1.Select(_ => _.ParentID).First()));
+		}
+
+		[Test]
+		public void GroupJoin54()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+					join ch in Child on p.ParentID equals ch.ParentID into lj1
+				where p.ParentID == 1
+				select new { p1 = lj1.Count(), p2 = lj1.First() },
+				from p in db.Parent
+					join ch in db.Child on p.ParentID equals ch.ParentID into lj1
+				where p.ParentID == 1
+				select new { p1 = lj1.Count(), p2 = lj1.First() }));
+		}
+
+		[Test]
+		public void GroupJoin6()
+		{
+			var n = 1;
+
+			var q1 =
+				from p in Parent
+					join c in Child on p.ParentID + n equals c.ParentID into lj
+				where p.ParentID == 1
+				select new { p, lj };
+
+			var list1 = q1.ToList();
+			var ch1   = list1[0].lj.ToList();
+
+			ForEachProvider(db =>
+			{
+				var q2 =
+					from p in db.Parent
+						join c in db.Child on p.ParentID + n equals c.ParentID into lj
+					where p.ParentID == 1
+					select new { p, lj };
+
+				var list2 = q2.ToList();
+
+				Assert.AreEqual(list1.Count,         list2.Count);
+				Assert.AreEqual(list1[0].p.ParentID, list2[0].p.ParentID);
+				Assert.AreEqual(list1[0].lj.Count(), list2[0].lj.Count());
+
+				var ch2 = list2[0].lj.ToList();
+
+				Assert.AreEqual(ch1[0].ParentID, ch2[0].ParentID);
+				Assert.AreEqual(ch1[0].ChildID,  ch2[0].ChildID);
+			});
+		}
+
+		[Test]
+		public void GroupJoin7()
+		{
+			var n = 1;
+
+			var q1 = 
+				from p in Parent
+					join c in Child on new { id = p.ParentID } equals new { id = c.ParentID - n } into j
+				where p.ParentID == 1
+				select new { p, j };
+
+			var list1 = q1.ToList();
+			var ch1   = list1[0].j.ToList();
+
+			ForEachProvider(
+				new[] { ProviderName.Firebird },
+				db =>
+				{
+					var q2 = 
+						from p in db.Parent
+							join c in db.Child on new { id = p.ParentID } equals new { id = c.ParentID - n } into j
+						where p.ParentID == 1
+						select new { p, j };
+
+					var list2 = q2.ToList();
+
+					Assert.AreEqual(list1.Count,         list2.Count);
+					Assert.AreEqual(list1[0].p.ParentID, list2[0].p.ParentID);
+					Assert.AreEqual(list1[0].j.Count(),  list2[0].j.Count());
+
+					var ch2 = list2[0].j.ToList();
+
+					Assert.AreEqual(ch1[0].ParentID, ch2[0].ParentID);
+					Assert.AreEqual(ch1[0].ChildID,  ch2[0].ChildID);
+				});
+		}
+
+		[Test]
+		public void GroupJoin8()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				join c in Child on p.ParentID equals c.ParentID into g
+				select new
+				{
+					Child = g.FirstOrDefault()
+				},
+				from p in db.Parent
+				join c in db.Child on p.ParentID equals c.ParentID into g
+				select new
+				{
+					Child = g.FirstOrDefault()
+				}
+				));
+		}
+
+		[Test]
+		public void GroupJoin9()
+		{
+			ForEachProvider(db => AreEqual(
+				Parent
+					.GroupJoin(
+						Parent,
+						x => new { Id = x.ParentID },
+						y => new { Id = y.ParentID },
+						(xid, yid) => new { xid, yid }
+					)
+					.SelectMany(
+						y => y.yid.DefaultIfEmpty(),
+						(x1, y) => new { x1.xid, y }
+					)
+					.GroupJoin(
+						Parent,
+						x => new { Id = x.xid.ParentID },
+						y => new { Id = y.ParentID     },
+						(x2, y) => new { x2.xid, x2.y, h = y }
+					)
+					.SelectMany(
+						a => a.h.DefaultIfEmpty(),
+						(x3, a) => new { x3.xid, x3.y, a }
+					)
+					.GroupJoin(
+						Parent,
+						x => new { Id = x.xid.ParentID },
+						y => new { Id = y.ParentID     },
+						(x4, y) => new { x4.xid, x4.y, x4.a, p = y }
+					)
+					.SelectMany(
+						z => z.p.DefaultIfEmpty(),
+						(x5, z) => new { x5.xid, z, x5.y, x5.a }
+					)
+					.GroupJoin(
+						Parent,
+						x => new { Id = x.xid.ParentID },
+						y => new { Id = y.Value1 ?? 1 },
+						(x6, y) => new { x6.xid, xy = x6.y, x6.a, x6.z, y }
+					)
+					.SelectMany(
+						z => z.y.DefaultIfEmpty(),
+						(x7, z) => new { x7.xid, z, x7.xy, x7.a, xz = x7.z }
+					)
+					.GroupJoin(
+						Parent,
+						x => new { Id = x.xid.ParentID },
+						y => new { Id = y.ParentID     },
+						(x8, y) => new { x8.xid, x8.z, x8.xy, x8.a, x8.xz, y }
+					)
+					.SelectMany(
+						a => a.y.DefaultIfEmpty(),
+						(x9, a) => new { x9.xid, x9.z, x9.xy, xa = x9.a, x9.xz, a }
+					),
+				db.Parent
+					.GroupJoin(
+						db.Parent,
+						x => new { Id = x.ParentID },
+						y => new { Id = y.ParentID },
+						(xid, yid) => new { xid, yid }
+					)
+					.SelectMany(
+						y => y.yid.DefaultIfEmpty(),
+						(x1, y) => new { x1.xid, y }
+					)
+					.GroupJoin(
+						db.Parent,
+						x => new { Id = x.xid.ParentID },
+						y => new { Id = y.ParentID     },
+						(x2, y) => new { x2.xid, x2.y, h = y }
+					)
+					.SelectMany(
+						a => a.h.DefaultIfEmpty(),
+						(x3, a) => new { x3.xid, x3.y, a }
+					)
+					.GroupJoin(
+						db.Parent,
+						x => new { Id = x.xid.ParentID },
+						y => new { Id = y.ParentID     },
+						(x4, y) => new { x4.xid, x4.y, x4.a, p = y }
+					)
+					.SelectMany(
+						z => z.p.DefaultIfEmpty(),
+						(x5, z) => new { x5.xid, z, x5.y, x5.a }
+					)
+					.GroupJoin(
+						db.Parent,
+						x => new { Id = x.xid.ParentID },
+						y => new { Id = y.Value1 ?? 1 },
+						(x6, y) => new { x6.xid, xy = x6.y, x6.a, x6.z, y }
+					)
+					.SelectMany(
+						z => z.y.DefaultIfEmpty(),
+						(x7, z) => new { x7.xid, z, x7.xy, x7.a, xz = x7.z }
+					)
+					.GroupJoin(
+						db.Parent,
+						x => new { Id = x.xid.ParentID },
+						y => new { Id = y.ParentID     },
+						(x8, y) => new { x8.xid, x8.z, x8.xy, x8.a, x8.xz, y }
+					)
+					.SelectMany(
+						a => a.y.DefaultIfEmpty(),
+						(x9, a) => new { x9.xid, x9.z, x9.xy, xa = x9.a, x9.xz, a }
+					)));
+		}
+
+		[Test]
+		public void LeftJoin1()
+		{
+			var expected =
+				from p in Parent
+					join ch in Child on p.ParentID equals ch.ParentID into lj1
+					from ch in lj1.DefaultIfEmpty()
+				where p.ParentID >= 4
+				select new { p, ch };
+
+			ForEachProvider(db => AreEqual(expected,
+				from p in db.Parent
+					join ch in db.Child on p.ParentID equals ch.ParentID into lj1
+					from ch in lj1.DefaultIfEmpty()
+				where p.ParentID >= 4
+				select new { p, ch }));
+		}
+
+		[Test]
+		public void LeftJoin2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+					join ch in Child on p.ParentID equals ch.ParentID into lj1
+					from ch in lj1.DefaultIfEmpty()
+				select new { p, ch },
+				from p in db.Parent
+					join ch in db.Child on p.ParentID equals ch.ParentID into lj1
+					from ch in lj1.DefaultIfEmpty()
+				select new { p, ch }));
+		}
+
+		[Test]
+		public void LeftJoin3()
+		{
+			ForEachProvider(db => AreEqual(
+				from c in    Child select c.Parent,
+				from c in db.Child select c.Parent));
+		}
+
+		[Test]
+		public void LeftJoin4()
+		{
+			ForEachProvider(db => AreEqual(
+				Parent
+					.GroupJoin(Child,
+						x => new { x.ParentID, x.Value1 },
+						y => new { y.ParentID, Value1 = (int?)y.ParentID },
+						(x, y) => new { Parent = x, Child = y })
+					.SelectMany(
+						y => y.Child.DefaultIfEmpty(),
+						(x, y) => new { x.Parent, Child = x.Child.FirstOrDefault() })
+					.Where(x => x.Parent.ParentID == 1 && x.Parent.Value1 != null)
+					.OrderBy(x => x.Parent.ParentID),
+				db.Parent
+					.GroupJoin(db.Child,
+						x => new { x.ParentID, x.Value1 },
+						y => new { y.ParentID, Value1 = (int?)y.ParentID },
+						(x, y) => new { Parent = x, Child = y })
+					.SelectMany(
+						y => y.Child.DefaultIfEmpty(),
+						(x, y) => new { x.Parent, Child = x.Child.FirstOrDefault() })
+					.Where(x => x.Parent.ParentID == 1 && x.Parent.Value1 != null)
+					.OrderBy(x => x.Parent.ParentID)));
+		}
+
+		public enum EnumInt
+		{
+			[MapValue(1)] One
+		}
+
+		[TableName("Child")]
+		public class EnumChild
+		{
+			public int     ParentID;
+			public EnumInt ChildID;
+		}
+
+		[Test]
+		public void LeftJoin5()
+		{
+			ForEachProvider(db =>
+			{
+				var q =
+					from p in db.Parent
+						join ch in new Table<EnumChild>(db) on p.ParentID equals ch.ParentID into lj1
+						from ch in lj1.DefaultIfEmpty()
+					where ch == null
+					select new { p, ch };
+
+				var list = q.ToList();
+				list.ToString();
+			});
+		}
+
+		[Test]
+		public void SubQueryJoin()
+		{
+			var expected =
+				from p in Parent
+					join ch in 
+						from c in Child
+						where c.ParentID > 0
+						select new { c.ParentID, c.ChildID }
+					on p.ParentID equals ch.ParentID into lj1
+					from ch in lj1.DefaultIfEmpty()
+				select p;
+
+			ForEachProvider(db => AreEqual(expected,
+				from p in db.Parent
+					join ch in 
+						from c in db.Child
+						where c.ParentID > 0
+						select new { c.ParentID, c.ChildID }
+					on p.ParentID equals ch.ParentID into lj1
+					from ch in lj1.DefaultIfEmpty()
+				select p));
+		}
+
+		[Test]
+		public void ReferenceJoin1()
+		{
+			ForEachProvider(new[] { ProviderName.Access }, db => AreEqual(
+				from c in    Child join g in    GrandChild on c equals g.Child select new { c.ParentID, g.GrandChildID },
+				from c in db.Child join g in db.GrandChild on c equals g.Child select new { c.ParentID, g.GrandChildID }));
+		}
+
+		[Test]
+		public void ReferenceJoin2()
+		{
+			ForEachProvider(new[] { ProviderName.Access }, db => AreEqual(
+				from g in    GrandChild
+					join c in    Child on g.Child equals c
+				select new { c.ParentID, g.GrandChildID },
+				from g in db.GrandChild
+					join c in db.Child on g.Child equals c
+				select new { c.ParentID, g.GrandChildID }));
+		}
+
+		[Test]
+		public void JoinByAnonymousTest()
+		{
+			ForEachProvider(new[] { ProviderName.Access }, db => AreEqual(
+				from p in    Parent
+				join c in    Child on new { Parent = p, p.ParentID } equals new { c.Parent, c.ParentID }
+				select new { p.ParentID, c.ChildID },
+				from p in db.Parent
+				join c in db.Child on new { Parent = p, p.ParentID } equals new { c.Parent, c.ParentID }
+				select new { p.ParentID, c.ChildID }));
+		}
+
+		[Test]
+		public void FourTableJoin()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				join c1 in Child      on p.ParentID  equals c1.ParentID
+				join c2 in GrandChild on c1.ParentID equals c2.ParentID
+				join c3 in GrandChild on c2.ParentID equals c3.ParentID
+				select new { p, c1Key = c1.ChildID, c2Key = c2.GrandChildID, c3Key = c3.GrandChildID },
+				from p in db.Parent
+				join c1 in db.Child      on p.ParentID  equals c1.ParentID
+				join c2 in db.GrandChild on c1.ParentID equals c2.ParentID
+				join c3 in db.GrandChild on c2.ParentID equals c3.ParentID
+				select new { p, c1Key = c1.ChildID, c2Key = c2.GrandChildID, c3Key = c3.GrandChildID }));
+		}
+
+		[Test]
+		public void ProjectionTest1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p1 in Person
+				join p2 in Person on p1.ID equals p2.ID
+				select new { ID1 = new { Value = p1.ID }, FirstName2 = p2.FirstName, } into p1
+				select p1.ID1.Value,
+				from p1 in db.Person
+				join p2 in db.Person on p1.ID equals p2.ID
+				select new { ID1 = new { Value = p1.ID }, FirstName2 = p2.FirstName, } into p1
+				select p1.ID1.Value));
+		}
+
+		[Test]
+		public void LeftJoinTest()
+		{
+			// Reproduces the problem described here: http://rsdn.ru/forum/prj.rfd/4221837.flat.aspx
+			ForEachProvider(
+				//Providers.Select(p => p.Name).Except(new[] { ProviderName.SQLite }).ToArray(),
+				db =>
+				{
+					var q = 
+						from p1 in db.Person
+						join p2 in db.Person on p1.ID equals p2.ID into g
+						from p2 in g.DefaultIfEmpty() // yes I know the join will always succeed and it'll never be null, but just for test's sake :)
+						select new { p1, p2 };
+
+					var list = q.ToList(); // NotImplementedException? :(
+					Assert.That(list, Is.Not.Empty);
+				});
+		}
+
+		[Test]
+		public void LeftJoinTest2()
+		{
+			// THIS TEST MUST BE RUN IN RELEASE CONFIGURATION (BECAUSE IT PASSES UNDER DEBUG CONFIGURATION)
+			// Reproduces the problem described here: http://rsdn.ru/forum/prj.rfd/4221837.flat.aspx
+
+			ForEachProvider(
+				Providers.Select(p => p.Name).Except(new[] { ProviderName.SQLite }).ToArray(),
+				db =>
+				{
+					var q =
+						from p1 in db.Patient
+						join p2 in db.Patient on p1.Diagnosis equals p2.Diagnosis into g
+						from p2 in g.DefaultIfEmpty() // yes I know the join will always succeed and it'll never be null, but just for test's sake :)
+						join p3 in db.Person on p2.PersonID equals p3.ID
+						select new { p1, p2, p3 };
+
+					var arr = q.ToArray(); // NotImplementedException? :(
+					Assert.That(arr, Is.Not.Empty);
+				});
+		}
+
+		[Test]
+		public void StackOverflow([IncludeDataContexts("Sql2008", "Sql2012")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				var q =
+					from c in db.Child
+					join p in db.Parent on c.ParentID equals p.ParentID
+					select new { p, c };
+
+				for (var i = 0; i < 100; i++)
+				{
+					q =
+						from c in q
+						join p in db.Parent on c.p.ParentID equals p.ParentID
+						select new { p, c.c };
+				}
+
+				var list = q.ToList();
+			}
+		}
+
+		[Test]
+		public void ApplyJoin([IncludeDataContexts("Sql2008")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				var q =
+					from ch in db.Child
+					from p in new Model.Functions(db).GetParentByID(ch.Parent.ParentID)
+					select p;
+
+				q.ToList();
+			}
+		}
+
+		[Test]
+		public void Issue257([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				var q =
+					from m in db.Types
+						join p in db.Parent on m.ID equals p.ParentID
+					group m by new
+					{
+						m.DateTimeValue.Date
+					}
+					into b
+					select new
+					{
+						QualiStatusByDate = b.Key,
+						Count             = b.Count()
+					};
+
+				q.ToList();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/L2SAttributes.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,56 @@
+using System;
+using System.Data.Linq.Mapping;
+
+using NUnit.Framework;
+
+using BLToolkit.Common;
+using BLToolkit.Data.Linq;
+
+namespace Data.Linq
+{
+	[Table(Name = "Person")]
+	public class L2SPersons
+	{
+		private int _personID;
+
+		[Column(
+			Storage       = "_personID",
+			Name          = "PersonID",
+			DbType        = "integer(32,0)",
+			IsPrimaryKey  = true,
+			IsDbGenerated = true,
+			AutoSync      = AutoSync.Never,
+			CanBeNull     = false)]
+		public int PersonID
+		{
+			get { return _personID;  }
+			set { _personID = value; }
+		}
+		[Column] public string FirstName { get; set; }
+		[Column] public string LastName;
+		[Column] public string MiddleName;
+		[Column] public string Gender;
+	}
+
+	[TestFixture]
+	public class L2SAttributes : TestBase
+	{
+		[Test]
+		public void IsDbGeneratedTest([IncludeDataContexts("Sql2008", "Sql2012")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				db.BeginTransaction();
+
+				var id = db.InsertWithIdentity(new L2SPersons
+				{
+					FirstName = "Test",
+					LastName  = "Test",
+					Gender    = "M"
+				});
+
+				db.GetTable<L2SPersons>().Delete(p => p.PersonID == ConvertTo<int>.From(id));
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Mapping.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,446 @@
+using System;
+using System.Linq;
+
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+using BLToolkit.EditableObjects;
+using BLToolkit.Mapping;
+using BLToolkit.Reflection;
+using NUnit.Framework;
+
+using Convert = System.Convert;
+
+#pragma warning disable 0649
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class Mapping : TestBase
+	{
+		[Test]
+		public void Enum1()
+		{
+			var expected = from p in Person where new[] { Gender.Male }.Contains(p.Gender) select p;
+			ForEachProvider(db => AreEqual(expected, from p in db.Person where new[] { Gender.Male }.Contains(p.Gender) select p));
+		}
+
+		[Test]
+		public void Enum2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Person where p.Gender == Gender.Male select p,
+				from p in db.Person where p.Gender == Gender.Male select p));
+		}
+
+		[Test]
+		public void Enum21()
+		{
+			var gender = Gender.Male;
+
+			ForEachProvider(db => AreEqual(
+				from p in    Person where p.Gender == gender select p,
+				from p in db.Person where p.Gender == gender select p));
+		}
+
+		[Test]
+		public void Enum3()
+		{
+			var fm = Gender.Female;
+
+			var expected = from p in Person where p.Gender != fm select p;
+			ForEachProvider(db => AreEqual(expected, from p in db.Person where p.Gender != fm select p));
+		}
+
+		[Test]
+		public void Enum4()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent4 where p.Value1 == TypeValue.Value1 select p,
+				from p in db.Parent4 where p.Value1 == TypeValue.Value1 select p));
+		}
+
+		[Test]
+		public void Enum5()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent4 where p.Value1 == TypeValue.Value3 select p,
+				from p in db.Parent4 where p.Value1 == TypeValue.Value3 select p));
+		}
+
+		[Test]
+		public void Enum6()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent4
+				join c in Child on p.ParentID equals c.ParentID
+				where p.Value1 == TypeValue.Value1 select p,
+				from p in db.Parent4
+				join c in db.Child on p.ParentID equals c.ParentID
+				where p.Value1 == TypeValue.Value1 select p));
+		}
+
+		[Test]
+		public void Enum7()
+		{
+			var v1 = TypeValue.Value1;
+
+			ForEachProvider(db => db.Parent4.Update(p => p.Value1 == v1, p => new Parent4 { Value1 = v1 }));
+		}
+
+		enum TestValue
+		{
+			Value1 = 1,
+		}
+
+		[TableName("Parent")]
+		class TestParent
+		{
+			public int       ParentID;
+			public TestValue Value1;
+		}
+
+		[Test]
+		public void Enum81()
+		{
+			ForEachProvider(db => db.GetTable<TestParent>().Where(p => p.Value1 == TestValue.Value1).ToList());
+		}
+
+		[Test]
+		public void Enum82()
+		{
+			var testValue = TestValue.Value1;
+			ForEachProvider(db => db.GetTable<TestParent>().Where(p => p.Value1 == testValue).ToList());
+		}
+
+		public enum Gender9
+		{
+			[MapValue('M')] Male,
+			[MapValue('F')] Female,
+			[MapValue('U')] Unknown,
+			[MapValue('O')] Other,
+		}
+
+		[TableName("Person")]
+		public class Person9
+		{
+			public int     PersonID;
+			public string  FirstName;
+			public string  LastName;
+			public string  MiddleName;
+			public Gender9 Gender;
+		}
+
+		[Test]
+		public void Enum9()
+		{
+			ForEachProvider(db =>
+				db.GetTable<Person9>().Where(p => p.PersonID == 1 && p.Gender == Gender9.Male).ToList());
+		}
+
+		[Test]
+		public void EditableObject()
+		{
+			ForEachProvider(db =>
+			{
+				var e = (from p in db.GetTable<EditableParent>() where p.ParentID == 1 select p).First();
+				Assert.AreEqual(1, e.ParentID);
+				Assert.AreEqual(1, e.Value1);
+			});
+		}
+
+		[TableName("Parent")]
+		[MapField("Value1", "Value.Value1")]
+		public class ParentObject
+		{
+			public int   ParentID;
+			public Inner Value = new Inner();
+
+			public class Inner
+			{
+				public int? Value1;
+			}
+		}
+
+		[Test]
+		public void Inner1()
+		{
+			ForEachProvider(db =>
+			{
+				var e = db.GetTable<ParentObject>().First(p => p.ParentID == 1);
+				Assert.AreEqual(1, e.ParentID);
+				Assert.AreEqual(1, e.Value.Value1);
+			});
+		}
+
+		[Test]
+		public void Inner2()
+		{
+			ForEachProvider(db =>
+			{
+				var e = db.GetTable<ParentObject>().First(p => p.ParentID == 1 && p.Value.Value1 == 1);
+				Assert.AreEqual(1, e.ParentID);
+				Assert.AreEqual(1, e.Value.Value1);
+			});
+		}
+
+		[TableName("Child")]
+		public class ChildObject
+		{
+			public int ParentID;
+			public int ChildID;
+
+			[Association(ThisKey="ParentID", OtherKey="ParentID")]
+			public ParentObject Parent;
+		}
+
+		[Test]
+		public void Inner3()
+		{
+			ForEachProvider(db =>
+			{
+				var e = db.GetTable<ChildObject>().First(c => c.Parent.Value.Value1 == 1);
+				Assert.AreEqual(1, e.ParentID);
+			});
+		}
+
+		[TableName("Parent")]
+		public class ParentObject2
+		{
+			class IntToDateMemberMapper : MemberMapper
+			{
+				public override void SetValue(object o, object value)
+				{
+					((ParentObject2)o).Value1 = new DateTime(2010, 1, Convert.ToInt32(value));
+				}
+			}
+
+			public int      ParentID;
+			[MemberMapper(typeof(IntToDateMemberMapper))]
+			public DateTime Value1;
+		}
+
+		[Test]
+		public void MemberMapperTest1()
+		{
+			ForEachProvider(db =>
+			{
+				var q =
+					from p in db.GetTable<ParentObject2>()
+					where p.ParentID == 1
+					select p;
+
+				Assert.AreEqual(new DateTime(2010, 1, 1), q.First().Value1);
+			});
+		}
+
+		//[Test]
+		public void MemberMapperTest2()
+		{
+			ForEachProvider(db =>
+			{
+				var q =
+					from p in db.GetTable<ParentObject2>()
+					where p.ParentID == 1
+					select p.Value1;
+
+				Assert.AreEqual(new DateTime(2010, 1, 1), q.First());
+			});
+		}
+
+		struct MyInt
+		{
+			public int MyValue;
+		}
+
+		[TableName("Parent")]
+		class MyParent
+		{
+			public MyInt ParentID;
+			public int?  Value1;
+		}
+
+		class MyMappingSchema : MappingSchema
+		{
+			public override object ConvertChangeType(object value, Type conversionType, bool isNullable)
+			{
+				if (conversionType == typeof(MyInt))
+					return new MyInt { MyValue = Convert.ToInt32(value) };
+
+				if (value is MyInt)
+					value = ((MyInt)value).MyValue;
+
+				return base.ConvertChangeType(value, conversionType, isNullable);
+			}
+
+			public override object ConvertParameterValue(object value, Type systemType)
+			{
+				return value is MyInt ? ((MyInt)value).MyValue : value;
+			}
+		}
+
+		static readonly MyMappingSchema _myMappingSchema = new MyMappingSchema();
+
+		[Test]
+		public void MyType1()
+		{
+			using (var db = new TestDbManager { MappingSchema = _myMappingSchema })
+			{
+				var list = db.GetTable<MyParent>().ToList();
+			}
+		}
+
+		[Test]
+		public void MyType2()
+		{
+			using (var db = new TestDbManager { MappingSchema = _myMappingSchema })
+			{
+				var list = db.GetTable<MyParent>()
+					.Select(t => new MyParent { ParentID = t.ParentID, Value1 = t.Value1 })
+					.ToList();
+			}
+		}
+
+		[Test]
+		public void MyType3()
+		{
+			using (var db = new TestDbManager { MappingSchema = _myMappingSchema })
+			{
+				db.BeginTransaction();
+				db.Insert(new MyParent { ParentID = new MyInt { MyValue = 1001 }, Value1 = 1001 });
+				db.Parent.Delete(p => p.ParentID >= 1000);
+			}
+		}
+
+		[TableName("Parent")]
+		class MyParent1
+		{
+			public int  ParentID;
+			public int? Value1;
+
+			[MapIgnore]
+			public string Value2 { get { return "1"; } }
+
+			public int GetValue() { return 2;}
+		}
+
+		[Test]
+		public void MapIgnore1()
+		{
+			ForEachProvider(db => AreEqual(
+				              Parent    .Select(p => new { p.ParentID, Value2 = "1" }),
+				db.GetTable<MyParent1>().Select(p => new { p.ParentID, p.Value2 })));
+		}
+
+		[Test]
+		public void MapIgnore2()
+		{
+			ForEachProvider(db => AreEqual(
+				              Parent    .Select(p => new { p.ParentID, Length = 1      }),
+				db.GetTable<MyParent1>().Select(p => new { p.ParentID, p.Value2.Length })));
+		}
+
+		[Test]
+		public void MapIgnore3()
+		{
+			ForEachProvider(db => AreEqual(
+				              Parent    .Select(p => new { p.ParentID, Value = 2            }),
+				db.GetTable<MyParent1>().Select(p => new { p.ParentID, Value = p.GetValue() })));
+		}
+
+		[TableName("Parent")]
+		public abstract class AbsParent : EditableObject
+		{
+			public abstract int  ParentID { get; set; }
+			public abstract int? Value1   { get; set; }
+		}
+
+		[TableName("Child")]
+		public abstract class AbsChild : EditableObject
+		{
+			public abstract int ParentID { get; set; }
+			public abstract int ChildID  { get; set; }
+
+			[Association(ThisKey = "ParentID", OtherKey = "ParentID", CanBeNull = false)]
+			public AbsParent Parent;
+		}
+
+		[Test]
+		public void MapAbstract()
+		{
+			using (var db = new TestDbManager())
+			{
+				var q = from a in db.GetTable<AbsChild>()
+				select new { a.ChildID, a.Parent.Value1 };
+
+				var ql = q.ToList();
+			}
+		}
+
+		public class     Entity    { public int Id { get; set; } }
+		public interface IDocument { int Id { get; set; } }
+		public class     Document : Entity, IDocument { }
+
+		[Test]
+		public void TestMethod()
+		{
+			using (var db = new TestDbManager())
+			{
+				IQueryable<IDocument> query = db.GetTable<Document>();
+				var idsQuery = query.Select(s => s.Id);
+				var str = idsQuery.ToString(); // Exception
+				Assert.IsNotNull(str);
+			}
+		}
+
+		[TableName("Parent")]
+		public abstract class ParentX
+		{
+			[MapField("ParentID")]
+			public abstract int  ParentID { get; set; }
+			[MapField("Value1")]
+			public abstract int? Value1 { get; set; }
+		}
+
+		[TableName("Child")]
+		[MapField("ParentID", "Parent.ParentID")]
+		public abstract class ChildX
+		{
+			[MapField("ChildID")]
+			public abstract int     ChildID { get; set; }
+			public abstract ParentX Parent  { get; set; }
+		}
+
+		[Test]
+		public void Test4([DataContexts] string contexts)
+		{
+			using (var db = GetDataContext(contexts))
+			{
+				db.Child. Delete(p => p.ParentID == 1001);
+				db.Parent.Delete(p => p.ParentID == 1001);
+
+				try
+				{
+					var child  = TypeAccessor.CreateInstance<ChildX>();
+					var parent = TypeAccessor.CreateInstance<ParentX>();
+
+					parent.ParentID = 1001;
+					parent.Value1   = 1;
+
+					db.Insert(parent);
+
+					child.ChildID = 1001;
+					child.Parent  = parent;
+
+					db.Insert(child);
+				}
+				finally
+				{
+					db.Child. Delete(p => p.ParentID == 1001);
+					db.Parent.Delete(p => p.ParentID == 1001);
+				}
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/MathFunctions.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,343 @@
+using System;
+using System.Linq;
+using BLToolkit.Data.Linq;
+using NUnit.Framework;
+
+using BLToolkit.Data.DataProvider;
+
+namespace Data.Linq
+{
+	[TestFixture]
+	public class MathFunctions : TestBase
+	{
+		[Test]
+		public void Abs()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Abs(p.MoneyValue) where t > 0 select t,
+				from t in from p in db.Types select Math.Abs(p.MoneyValue) where t > 0 select t));
+		}
+
+        [Test]
+		public void Acos()
+		{
+			ForEachProvider(new[] { ProviderName.Access }, db => AreEqual(
+				from t in from p in    Types select Math.Floor(Math.Acos((double)p.MoneyValue / 15) * 15) where t != 0.1 select t,
+				from t in from p in db.Types select Math.Floor(Math.Acos((double)p.MoneyValue / 15) * 15) where t != 0.1 select t));
+		}
+
+        [Test]
+		public void Asin()
+		{
+			ForEachProvider(new[] { ProviderName.Access }, db => AreEqual(
+				from t in from p in    Types select Math.Floor(Math.Asin((double)p.MoneyValue / 15) * 15) where t != 0.1 select t,
+				from t in from p in db.Types select Math.Floor(Math.Asin((double)p.MoneyValue / 15) * 15) where t != 0.1 select t));
+		}
+
+		[Test]
+		public void Atan()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Floor(Math.Atan((double)p.MoneyValue / 15) * 15) where t != 0.1 select t,
+				from t in from p in db.Types select Math.Floor(Math.Atan((double)p.MoneyValue / 15) * 15) where t != 0.1 select t));
+		}
+
+        [Test]
+		public void Atan2()
+		{
+			ForEachProvider(new[] { ProviderName.Access }, db => AreEqual(
+				from t in from p in    Types select Math.Floor(Math.Atan2((double)p.MoneyValue / 15, 0) * 15) where t != 0.1 select t,
+				from t in from p in db.Types select Math.Floor(Math.Atan2((double)p.MoneyValue / 15, 0) * 15) where t != 0.1 select t));
+		}
+
+		[Test]
+		public void Ceiling1()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Ceiling(-(p.MoneyValue + 1)) where t != 0 select t,
+				from t in from p in db.Types select Math.Ceiling(-(p.MoneyValue + 1)) where t != 0 select t));
+		}
+
+		[Test]
+		public void Ceiling2()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Ceiling(p.MoneyValue) where t != 0 select t,
+				from t in from p in db.Types select Math.Ceiling(p.MoneyValue) where t != 0 select t));
+		}
+
+		[Test]
+		public void Cos()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Floor(Math.Cos((double)p.MoneyValue / 15) * 15) where t != 0.1 select t,
+				from t in from p in db.Types select Math.Floor(Math.Cos((double)p.MoneyValue / 15) * 15) where t != 0.1 select t));
+		}
+
+		[Test]
+		public void Cosh()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Floor(Math.Cosh((double)p.MoneyValue / 15) * 15) where t != 0.1 select t,
+				from t in from p in db.Types select Math.Floor(Math.Cosh((double)p.MoneyValue / 15) * 15) where t != 0.1 select t));
+		}
+
+		[Test]
+		public void Cot()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Floor(Sql.Cot((double)p.MoneyValue / 15).Value * 15) where t != 0.1 select t,
+				from t in from p in db.Types select Math.Floor(Sql.Cot((double)p.MoneyValue / 15).Value * 15) where t != 0.1 select t));
+		}
+
+		[Test]
+		public void Deegrees1()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Floor(Sql.Degrees(p.MoneyValue).Value) where t != 0.1m select t,
+				from t in from p in db.Types select Math.Floor(Sql.Degrees(p.MoneyValue).Value) where t != 0.1m select t));
+		}
+
+		[Test]
+		public void Deegrees2()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Sql.Degrees((double)p.MoneyValue).Value where t != 0.1 select Math.Floor(t),
+				from t in from p in db.Types select Sql.Degrees((double)p.MoneyValue).Value where t != 0.1 select Math.Floor(t)));
+		}
+
+		[Test]
+		public void Deegrees3()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Sql.Degrees((int)p.MoneyValue).Value where t != 0.1 select t,
+				from t in from p in db.Types select Sql.Degrees((int)p.MoneyValue).Value where t != 0.1 select t));
+		}
+
+		[Test]
+		public void Exp()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Floor(Math.Exp((double)p.MoneyValue)) where t != 0.1 select t,
+				from t in from p in db.Types select Math.Floor(Math.Exp((double)p.MoneyValue)) where t != 0.1 select t));
+		}
+
+		[Test]
+		public void Floor()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Floor(-(p.MoneyValue + 1)) where t != 0 select t,
+				from t in from p in db.Types select Math.Floor(-(p.MoneyValue + 1)) where t != 0 select t));
+		}
+
+		[Test]
+		public void Log()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Floor(Math.Log((double)p.MoneyValue)) where t != 0.1 select t,
+				from t in from p in db.Types select Math.Floor(Math.Log((double)p.MoneyValue)) where t != 0.1 select t));
+		}
+
+		[Test]
+		public void Log2()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Floor(Math.Log((double)p.MoneyValue, 2)) where t != 0.1 select t,
+				from t in from p in db.Types select Math.Floor(Math.Log((double)p.MoneyValue, 2)) where t != 0.1 select t));
+		}
+
+		[Test]
+		public void Log10()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Floor(Math.Log10((double)p.MoneyValue)) where t != 0.1 select t,
+				from t in from p in db.Types select Math.Floor(Math.Log10((double)p.MoneyValue)) where t != 0.1 select t));
+		}
+
+		[Test]
+		public void Max()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Max(p.MoneyValue, 5) where t != 0 select t,
+				from t in from p in db.Types select Math.Max(p.MoneyValue, 5) where t != 0 select t));
+		}
+
+		[Test]
+		public void Min()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Min(p.MoneyValue, 5) where t != 0 select t,
+				from t in from p in db.Types select Math.Min(p.MoneyValue, 5) where t != 0 select t));
+		}
+
+		[Test]
+		public void Pow()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Floor(Math.Pow((double)p.MoneyValue, 3)) where t != 0 select t,
+				from t in from p in db.Types select Math.Floor(Math.Pow((double)p.MoneyValue, 3)) where t != 0 select t));
+		}
+
+		[Test]
+		public void Round1()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Round(p.MoneyValue) where t != 0 select t,
+				from t in from p in db.Types select Math.Round(p.MoneyValue) where t != 0 select t));
+		}
+
+		[Test]
+		public void Round2()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Round((double)p.MoneyValue) where t != 0 select t,
+				from t in from p in db.Types select Math.Round((double)p.MoneyValue) where t != 0 select t));
+		}
+
+		[Test]
+		public void Round3()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Round(p.MoneyValue, 1) where t != 0 && t != 7 select t,
+				from t in from p in db.Types select Math.Round(p.MoneyValue, 1) where t != 0 && t != 7 select t));
+		}
+
+		[Test]
+		public void Round4()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Round((double)p.MoneyValue, 1) where t != 0 select Math.Round(t, 5),
+				from t in from p in db.Types select Math.Round((double)p.MoneyValue, 1) where t != 0 select Math.Round(t, 5)));
+		}
+
+		[Test]
+		public void Round5()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Round(p.MoneyValue, MidpointRounding.AwayFromZero) where t != 0 select t,
+				from t in from p in db.Types select Math.Round(p.MoneyValue, MidpointRounding.AwayFromZero) where t != 0 select t));
+		}
+
+		[Test]
+		public void Round6()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Round((double)p.MoneyValue, MidpointRounding.AwayFromZero) where t != 0 select t,
+				from t in from p in db.Types select Math.Round((double)p.MoneyValue, MidpointRounding.AwayFromZero) where t != 0 select t));
+		}
+
+		[Test]
+		public void Round7()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Round(p.MoneyValue, MidpointRounding.ToEven) where t != 0 select t,
+				from t in from p in db.Types select Math.Round(p.MoneyValue, MidpointRounding.ToEven) where t != 0 select t));
+		}
+
+		[Test]
+		public void Round8()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Round((double)p.MoneyValue, MidpointRounding.ToEven) where t != 0 select t,
+				from t in from p in db.Types select Math.Round((double)p.MoneyValue, MidpointRounding.ToEven) where t != 0 select t));
+		}
+
+		[Test]
+		public void Round9()
+		{
+			ForEachProvider(new[] { ProviderName.SQLite }, db => AreEqual(
+				from t in from p in    Types select Math.Round(p.MoneyValue, 1, MidpointRounding.AwayFromZero) where t != 0 select t,
+				from t in from p in db.Types select Math.Round(p.MoneyValue, 1, MidpointRounding.AwayFromZero) where t != 0 select t));
+		}
+
+		[Test]
+		public void Round10()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Round(p.MoneyValue, 1, MidpointRounding.ToEven) where t != 0 && t != 7 select t,
+				from t in from p in db.Types select Math.Round(p.MoneyValue, 1, MidpointRounding.ToEven) where t != 0 && t != 7 select t));
+		}
+
+		[Test]
+		public void Round11()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Round((double)p.MoneyValue, 1, MidpointRounding.ToEven) where t != 0 select Math.Round(t, 5),
+				from t in from p in db.Types select Math.Round((double)p.MoneyValue, 1, MidpointRounding.ToEven) where t != 0 select Math.Round(t, 5)));
+		}
+
+		[Test]
+		public void Round12()
+		{
+			var mp = MidpointRounding.AwayFromZero;
+
+			ForEachProvider(new[] { ProviderName.SQLite }, db => AreEqual(
+				from t in from p in    Types select Math.Round(p.MoneyValue, 1, mp) where t != 0 && t != 7 select t,
+				from t in from p in db.Types select Math.Round(p.MoneyValue, 1, mp) where t != 0 && t != 7 select t));
+		}
+
+		[Test]
+		public void Sign()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Sign(p.MoneyValue) where t != 0 select t,
+				from t in from p in db.Types select Math.Sign(p.MoneyValue) where t != 0 select t));
+		}
+
+		[Test]
+		public void Sin()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Floor(Math.Sin((double)p.MoneyValue / 15) * 15) where t != 0.1 select t,
+				from t in from p in db.Types select Math.Floor(Math.Sin((double)p.MoneyValue / 15) * 15) where t != 0.1 select t));
+		}
+
+		[Test]
+		public void Sinh()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Floor(Math.Sinh((double)p.MoneyValue / 15) * 15) where t != 0.1 select t,
+				from t in from p in db.Types select Math.Floor(Math.Sinh((double)p.MoneyValue / 15) * 15) where t != 0.1 select t));
+		}
+
+		[Test]
+		public void Sqrt()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Floor(Math.Sqrt((double)p.MoneyValue / 15) * 15) where t != 0.1 select t,
+				from t in from p in db.Types select Math.Floor(Math.Sqrt((double)p.MoneyValue / 15) * 15) where t != 0.1 select t));
+		}
+
+		[Test]
+		public void Tan()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Floor(Math.Tan((double)p.MoneyValue / 15) * 15) where t != 0.1 select t,
+				from t in from p in db.Types select Math.Floor(Math.Tan((double)p.MoneyValue / 15) * 15) where t != 0.1 select t));
+		}
+
+		[Test]
+		public void Tanh()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Floor(Math.Tanh((double)p.MoneyValue / 15) * 15) where t != 0.1 select t,
+				from t in from p in db.Types select Math.Floor(Math.Tanh((double)p.MoneyValue / 15) * 15) where t != 0.1 select t));
+		}
+
+		[Test]
+		public void Truncate1()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Truncate(p.MoneyValue) where t != 0.1m select t,
+				from t in from p in db.Types select Math.Truncate(p.MoneyValue) where t != 0.1m select t));
+		}
+
+		[Test]
+		public void Truncate2()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in from p in    Types select Math.Truncate((double)-p.MoneyValue) where t != 0.1 select t,
+				from t in from p in db.Types select Math.Truncate((double)-p.MoneyValue) where t != 0.1 select t));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Model/BinaryData.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12 @@
+using System;
+using System.Data.Linq;
+
+namespace Data.Linq.Model
+{
+	public class BinaryData
+	{
+		public int    BinaryDataID;
+		public Binary Stamp;
+		public Binary Data;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Model/DataTypeTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,32 @@
+using System;
+using System.Data.Linq;
+using System.Xml.Linq;
+
+namespace Data.Linq.Model
+{
+	public class DataTypeTest
+	{
+		public int       DataTypeID;
+		public Binary    Binary_;
+		public bool?     Boolean_;
+		public byte?     Byte_;
+		public Binary    Bytes_;
+		public char?     Char_;
+		public DateTime? DateTime_;
+		public decimal?  Decimal_;
+		public double?   Double_;
+		public Guid?     Guid_;
+		public short?    Int16_;
+		public int?      Int32_;
+		public long?     Int64_;
+		public decimal?  Money_;
+		public byte?     SByte_;
+		public float?    Single_;
+		public Binary    Stream_;
+		public string    String_;
+		public short?    UInt16_;
+		public int?      UInt32_;
+		public long?     UInt64_;
+		public XElement  Xml_;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Model/Doctor.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+using System;
+
+namespace Data.Linq.Model
+{
+	public class Doctor
+	{
+		public int    PersonID;
+		public string Taxonomy;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Model/EditableParent.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,14 @@
+using System;
+
+using BLToolkit.DataAccess;
+using BLToolkit.EditableObjects;
+
+namespace Data.Linq.Model
+{
+	[TableName("Parent")]
+	public abstract class EditableParent : EditableObject<EditableParent>
+	{
+		public abstract int  ParentID { get; set; }
+		public abstract int? Value1   { get; set; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Model/FirebirdSpecific.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+using System;
+
+using BLToolkit.Data.Sql.SqlProvider;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace UnitTests.Linq.Interface.Model
+{
+	public class FirebirdSpecific
+	{
+		public class SequenceTest
+		{
+			[Identity, SequenceName("SequenceTestSeq")]
+			public int    ID;
+
+			[MapField("VALUE_")] // 'Value' reserved by firebird
+			public string Value;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Model/Gender.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,14 @@
+using System;
+
+using BLToolkit.Mapping;
+
+namespace Data.Linq.Model
+{
+	public enum Gender
+	{
+		[MapValue("M")] Male,
+		[MapValue("F")] Female,
+		[MapValue("U")] Unknown,
+		[MapValue("O")] Other,
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Model/LinqDataTypes.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,126 @@
+using System;
+using System.Data;
+using System.Data.Linq;
+
+using BLToolkit.DataAccess;
+
+namespace Data.Linq.Model
+{
+	public class LinqDataTypes : IEquatable<LinqDataTypes>, IComparable
+	{
+		public int      ID;
+		public decimal  MoneyValue;
+		public DateTime DateTimeValue;
+		public bool     BoolValue;
+		public Guid     GuidValue;
+		public Binary   BinaryValue;
+		public short    SmallIntValue;
+
+		public override bool Equals(object obj)
+		{
+			return Equals(obj as LinqDataTypes);
+		}
+
+		public bool Equals(LinqDataTypes other)
+		{
+			if (ReferenceEquals(null, other)) return false;
+			if (ReferenceEquals(this, other)) return true;
+			return
+				other.ID                   == ID            &&
+				other.MoneyValue           == MoneyValue    &&
+				other.BoolValue            == BoolValue     &&
+				other.GuidValue            == GuidValue     &&
+				other.SmallIntValue        == SmallIntValue &&
+				other.DateTimeValue.Date   == DateTimeValue.Date &&
+				other.DateTimeValue.Hour   == DateTimeValue.Hour &&
+				other.DateTimeValue.Minute == DateTimeValue.Minute &&
+				other.DateTimeValue.Second == DateTimeValue.Second;
+		}
+
+		public override int GetHashCode()
+		{
+			return ID;
+		}
+
+		public int CompareTo(object obj)
+		{
+			return ID - ((LinqDataTypes)obj).ID;
+		}
+
+		public static bool operator == (LinqDataTypes left, LinqDataTypes right)
+		{
+			return Equals(left, right);
+		}
+
+		public static bool operator != (LinqDataTypes left, LinqDataTypes right)
+		{
+			return !Equals(left, right);
+		}
+
+		public override string ToString()
+		{
+			return string.Format("{{{0,2}, {1,7}, {2}, {3,5}, {4}, {5}}}", ID, MoneyValue, DateTimeValue, BoolValue, GuidValue, SmallIntValue);
+		}
+	}
+
+	[TableName("LinqDataTypes")]
+	public class LinqDataTypes2 : IEquatable<LinqDataTypes2>, IComparable
+	{
+		[PrimaryKey]
+		public int       ID;
+		public decimal   MoneyValue;
+		public DateTime? DateTimeValue;
+		[DbType(DbType.DateTime2)]
+		public DateTime? DateTimeValue2;
+		public bool?     BoolValue;
+		public Guid?     GuidValue;
+		public short?    SmallIntValue;
+		public int?      IntValue;
+		public long?     BigIntValue;
+
+		public override bool Equals(object obj)
+		{
+			return Equals(obj as LinqDataTypes2);
+		}
+
+		public bool Equals(LinqDataTypes2 other)
+		{
+			if (ReferenceEquals(null, other)) return false;
+			if (ReferenceEquals(this, other)) return true;
+			return
+				other.ID                         == ID            &&
+				other.MoneyValue                 == MoneyValue    &&
+				other.BoolValue                  == BoolValue     &&
+				other.GuidValue                  == GuidValue     &&
+				other.DateTimeValue.Value.Date   == DateTimeValue.Value.Date &&
+				other.DateTimeValue.Value.Hour   == DateTimeValue.Value.Hour &&
+				other.DateTimeValue.Value.Minute == DateTimeValue.Value.Minute &&
+				other.DateTimeValue.Value.Second == DateTimeValue.Value.Second;
+		}
+
+		public override int GetHashCode()
+		{
+			return ID;
+		}
+
+		public int CompareTo(object obj)
+		{
+			return ID - ((LinqDataTypes2)obj).ID;
+		}
+
+		public static bool operator ==(LinqDataTypes2 left, LinqDataTypes2 right)
+		{
+			return Equals(left, right);
+		}
+
+		public static bool operator !=(LinqDataTypes2 left, LinqDataTypes2 right)
+		{
+			return !Equals(left, right);
+		}
+
+		public override string ToString()
+		{
+			return string.Format("{{{0,2}, {1,7}, {2}, {3,5}, {4}}}", ID, MoneyValue, DateTimeValue, BoolValue, GuidValue);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Model/Northwind.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,254 @@
+using System;
+using System.Collections.Generic;
+using System.Data.Linq;
+
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace Data.Linq.Model
+{
+	public class Northwind
+	{
+		public abstract class EntityBase<T>
+		{
+			protected abstract T Key { get; }
+
+			public override bool Equals(object obj)
+			{
+				return GetType() == obj.GetType() && Key.Equals(((EntityBase<T>)obj).Key);
+			}
+
+			public override int GetHashCode()
+			{
+				return Key.GetHashCode();
+			}
+		}
+
+		[TableName("Categories")]
+		public class Category
+		{
+			[PrimaryKey, NonUpdatable] public int    CategoryID;
+			[NotNull]                  public string CategoryName;
+			                           public string Description;
+			                           public Binary Picture;
+
+			[Association(ThisKey="CategoryID", OtherKey="CategoryID")]
+			public List<Product> Products;
+		}
+
+		[TableName("CustomerCustomerDemo")]
+		public class CustomerCustomerDemo
+		{
+			[PrimaryKey, NotNull] public string CustomerID;
+			[PrimaryKey, NotNull] public string CustomerTypeID;
+
+			[Association(ThisKey="CustomerTypeID", OtherKey="CustomerTypeID")]
+			public CustomerDemographic CustomerDemographics;
+
+			[Association(ThisKey="CustomerID", OtherKey="CustomerID")]
+			public Customer Customers;
+		}
+
+		[TableName("CustomerDemographics")]
+		public class CustomerDemographic
+		{
+			[PrimaryKey, NotNull] public string CustomerTypeID;
+			                      public string CustomerDesc;
+			
+			[Association(ThisKey="CustomerTypeID", OtherKey="CustomerTypeID")]
+			public List<CustomerCustomerDemo> CustomerCustomerDemos;
+		}
+
+		[TableName("Customers")]
+		public class Customer : EntityBase<string>
+		{
+			[PrimaryKey] public string CustomerID;
+			[NotNull]    public string CompanyName;
+			             public string ContactName;
+			             public string ContactTitle;
+			             public string Address;
+			             public string City;
+			             public string Region;
+			             public string PostalCode;
+			             public string Country;
+			             public string Phone;
+			             public string Fax;
+
+			[Association(ThisKey="CustomerID", OtherKey="CustomerID")]
+			public List<CustomerCustomerDemo> CustomerCustomerDemos;
+
+			[Association(ThisKey="CustomerID", OtherKey="CustomerID")]
+			public List<Order> Orders;
+
+			protected override string Key
+			{
+				get { return CustomerID; }
+			}
+		}
+
+		[TableName("Employees")]
+		public class Employee : EntityBase<int>
+		{
+			[PrimaryKey, NonUpdatable] public int       EmployeeID;
+			[NotNull]                  public string    LastName;
+			[NotNull]                  public string    FirstName;
+			                           public string    Title;
+			                           public string    TitleOfCourtesy;
+			                           public DateTime? BirthDate;
+			                           public DateTime? HireDate;
+			                           public string    Address;
+			                           public string    City;
+			                           public string    Region;
+			                           public string    PostalCode;
+			                           public string    Country;
+			                           public string    HomePhone;
+			                           public string    Extension;
+			                           public Binary    Photo;
+			                           public string    Notes;
+			                           public int?      ReportsTo;
+			                           public string    PhotoPath;
+
+			[Association(ThisKey="EmployeeID", OtherKey="ReportsTo")]  public List<Employee>          Employees;
+			[Association(ThisKey="EmployeeID", OtherKey="EmployeeID")] public List<EmployeeTerritory> EmployeeTerritories;
+			[Association(ThisKey="EmployeeID", OtherKey="EmployeeID")] public List<Order>             Orders;
+			[Association(ThisKey="ReportsTo",  OtherKey="EmployeeID")] public Employee                ReportsToEmployee;
+
+			//[MapIgnore]
+			protected override int Key
+			{
+				get { return EmployeeID; }
+			}
+		}
+
+		[TableName("EmployeeTerritories")]
+		public class EmployeeTerritory
+		{
+			[PrimaryKey]          public int    EmployeeID;
+			[PrimaryKey, NotNull] public string TerritoryID;
+
+			[Association(ThisKey="EmployeeID",  OtherKey="EmployeeID")]  public Employee  Employee;
+			[Association(ThisKey="TerritoryID", OtherKey="TerritoryID")] public Territory Territory;
+		}
+
+		[TableName("Order Details")]
+		public class OrderDetail
+		{
+			[PrimaryKey] public int     OrderID;
+			[PrimaryKey] public int     ProductID;
+			             public decimal UnitPrice;
+			             public short   Quantity;
+			             public float   Discount;
+
+			[Association(ThisKey="OrderID",   OtherKey="OrderID")]   public Order   Order;
+			[Association(ThisKey="ProductID", OtherKey="ProductID")] public Product Product;
+		}
+
+		[TableName("Orders")]
+		public class Order : EntityBase<int>
+		{
+			[PrimaryKey, NonUpdatable] public int       OrderID;
+			                           public string    CustomerID;
+			                           public int?      EmployeeID;
+			                           public DateTime? OrderDate;
+			                           public DateTime? RequiredDate;
+			                           public DateTime? ShippedDate;
+			                           public int?      ShipVia;
+			                           public decimal   Freight;
+			                           public string    ShipName;
+			                           public string    ShipAddress;
+			                           public string    ShipCity;
+			                           public string    ShipRegion;
+			                           public string    ShipPostalCode;
+			                           public string    ShipCountry;
+
+			[Association(ThisKey="OrderID",    OtherKey="OrderID")]                     public List<OrderDetail> OrderDetails;
+			[Association(ThisKey="CustomerID", OtherKey="CustomerID", CanBeNull=false)] public Customer          Customer;
+			[Association(ThisKey="EmployeeID", OtherKey="EmployeeID")]                  public Employee          Employee;
+			[Association(ThisKey="ShipVia",    OtherKey="ShipperID")]                   public Shipper           Shipper;
+
+			protected override int Key
+			{
+				get { return OrderID; }
+			}
+		}
+
+		[TableName("Products")]
+		[InheritanceMapping(Code=true,  Type=typeof(DiscontinuedProduct))]
+		[InheritanceMapping(Code=false, Type=typeof(ActiveProduct))]
+		public abstract class Product
+		{
+			[PrimaryKey, NonUpdatable]                  public int      ProductID;
+			[NotNull]                                   public string   ProductName;
+			                                            public int?     SupplierID;
+			                                            public int?     CategoryID;
+			                                            public string   QuantityPerUnit;
+			                                            public decimal? UnitPrice;
+			                                            public short?   UnitsInStock;
+			                                            public short?   UnitsOnOrder;
+			                                            public short?   ReorderLevel;
+			[MapField(IsInheritanceDiscriminator=true)] public bool     Discontinued;
+
+			[Association(ThisKey="ProductID",  OtherKey="ProductID")]  public List<OrderDetail> OrderDetails;
+			[Association(ThisKey="CategoryID", OtherKey="CategoryID")] public Category          Category;
+			[Association(ThisKey="SupplierID", OtherKey="SupplierID")] public Supplier          Supplier;
+		}
+
+		public class ActiveProduct       : Product {}
+		public class DiscontinuedProduct : Product {}
+
+		[TableName("Region")]
+		public class Region
+		{
+			[PrimaryKey] public int    RegionID;
+			[NotNull]    public string RegionDescription;
+
+			[Association(ThisKey="RegionID", OtherKey="RegionID")]
+			public List<Territory> Territories;
+		}
+
+		[TableName("Shippers")]
+		public class Shipper
+		{
+			[PrimaryKey, NonUpdatable] public int    ShipperID;
+			[NotNull]                  public string CompanyName;
+			                           public string Phone;
+
+			[Association(ThisKey="ShipperID", OtherKey="ShipVia")]
+			public List<Order> Orders;
+		}
+
+		[TableName("Suppliers")]
+		public class Supplier
+		{
+			[PrimaryKey, NonUpdatable] public int    SupplierID;
+			[NotNull]                  public string CompanyName;
+			                           public string ContactName;
+			                           public string ContactTitle;
+			                           public string Address;
+			                           public string City;
+			                           public string Region;
+			                           public string PostalCode;
+			                           public string Country;
+			                           public string Phone;
+			                           public string Fax;
+			                           public string HomePage;
+
+			[Association(ThisKey="SupplierID", OtherKey="SupplierID")]
+			public List<Product> Products;
+		}
+
+		[TableName("Territories")]
+		public class Territory
+		{
+			[PrimaryKey, NotNull] public string TerritoryID;
+			[NotNull]             public string TerritoryDescription;
+			                      public int    RegionID;
+
+			[Association(ThisKey="TerritoryID", OtherKey="TerritoryID")]
+			public List<EmployeeTerritory> EmployeeTerritories;
+
+			[Association(ThisKey="RegionID", OtherKey="RegionID")]
+			public Region Region;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Model/NorthwindDB.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,119 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+using System.Text;
+
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using BLToolkit.Data.Sql;
+using BLToolkit.Data.Sql.SqlProvider;
+
+namespace Data.Linq.Model
+{
+	public class NorthwindDB : DbManager
+	{
+		public NorthwindDB() : base("Northwind")
+		{
+		}
+
+		public Table<Northwind.Category>            Category            { get { return GetTable<Northwind.Category>();            } }
+		public Table<Northwind.Customer>            Customer            { get { return GetTable<Northwind.Customer>();            } }
+		public Table<Northwind.Employee>            Employee            { get { return GetTable<Northwind.Employee>();            } }
+		public Table<Northwind.EmployeeTerritory>   EmployeeTerritory   { get { return GetTable<Northwind.EmployeeTerritory>();   } }
+		public Table<Northwind.OrderDetail>         OrderDetail         { get { return GetTable<Northwind.OrderDetail>();         } }
+		public Table<Northwind.Order>               Order               { get { return GetTable<Northwind.Order>();               } }
+		public Table<Northwind.Product>             Product             { get { return GetTable<Northwind.Product>();             } }
+		public Table<Northwind.ActiveProduct>       ActiveProduct       { get { return GetTable<Northwind.ActiveProduct>();       } }
+		public Table<Northwind.DiscontinuedProduct> DiscontinuedProduct { get { return GetTable<Northwind.DiscontinuedProduct>(); } }
+		public Table<Northwind.Region>              Region              { get { return GetTable<Northwind.Region>();              } }
+		public Table<Northwind.Shipper>             Shipper             { get { return GetTable<Northwind.Shipper>();             } }
+		public Table<Northwind.Supplier>            Supplier            { get { return GetTable<Northwind.Supplier>();            } }
+		public Table<Northwind.Territory>           Territory           { get { return GetTable<Northwind.Territory>();           } }
+		
+#if !MONO
+		
+		public class FreeTextKey<T>
+		{
+			public T   Key;
+			public int Rank;
+		}
+
+		class FreeTextTableExpressionAttribute : TableExpressionAttribute
+		{
+			public FreeTextTableExpressionAttribute()
+				: base("")
+			{
+			}
+
+			public override void SetTable(SqlTable table, MemberInfo member, IEnumerable<Expression> expArgs, IEnumerable<ISqlExpression> sqlArgs)
+			{
+				var aargs  = sqlArgs.ToArray();
+				var arr    = ConvertArgs(member, aargs).ToList();
+				var method = (MethodInfo)member;
+				var sp     = new MsSql2008SqlProvider();
+
+				{
+					var ttype  = method.GetGenericArguments()[0];
+					var tbl    = new SqlTable(ttype);
+
+					var database     = tbl.Database     == null ? null : sp.Convert(tbl.Database,     ConvertType.NameToDatabase).  ToString();
+					var owner        = tbl.Owner        == null ? null : sp.Convert(tbl.Owner,        ConvertType.NameToOwner).     ToString();
+					var physicalName = tbl.PhysicalName == null ? null : sp.Convert(tbl.PhysicalName, ConvertType.NameToQueryTable).ToString();
+
+					var name   = sp.BuildTableName(new StringBuilder(), database, owner, physicalName);
+
+					arr.Add(new SqlExpression(name.ToString(), Precedence.Primary));
+				}
+
+				{
+					var field = ((ConstantExpression)expArgs.First()).Value;
+
+					if (field is string)
+						arr[0] = new SqlExpression(field.ToString(), Precedence.Primary);
+					else if (field is LambdaExpression)
+					{
+						var body = ((LambdaExpression)field).Body;
+
+						if (body is MemberExpression)
+						{
+							var name = ((MemberExpression)body).Member.Name;
+
+							name = sp.Convert(name, ConvertType.NameToQueryField).ToString();
+
+							arr[0] = new SqlExpression(name, Precedence.Primary);
+						}
+					}
+				}
+
+				table.SqlTableType   = SqlTableType.Expression;
+				table.Name           = "FREETEXTTABLE({6}, {2}, {3}) {1}";
+				table.TableArguments = arr.ToArray();
+			}
+		}
+
+		[FreeTextTableExpressionAttribute]
+		public Table<FreeTextKey<TKey>> FreeTextTable<TTable,TKey>(string field, string text)
+		{
+			return GetTable<FreeTextKey<TKey>>(
+				this,
+				((MethodInfo)(MethodBase.GetCurrentMethod())).MakeGenericMethod(typeof(TTable), typeof(TKey)),
+				field,
+				text);
+		}
+
+		[FreeTextTableExpressionAttribute]
+		public Table<FreeTextKey<TKey>> FreeTextTable<TTable,TKey>(Expression<Func<TTable,string>> fieldSelector, string text)
+		{
+			return GetTable<FreeTextKey<TKey>>(
+				this,
+				((MethodInfo)(MethodBase.GetCurrentMethod())).MakeGenericMethod(typeof(TTable), typeof(TKey)),
+				fieldSelector,
+				text);
+		}
+		
+#endif
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Model/OracleSpecific.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,17 @@
+using System;
+
+using BLToolkit.Data.Sql.SqlProvider;
+using BLToolkit.DataAccess;
+
+namespace UnitTests.Linq.Interface.Model
+{
+	public class OracleSpecific
+	{
+		public class SequenceTest
+		{
+			[Identity, SequenceName("SequenceTestSeq")]
+			public int    ID;
+			public string Value;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Model/ParentChild.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,510 @@
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace Data.Linq.Model
+{
+	#region Parent/Child/GrandChild
+
+	public interface IParent
+	{
+		int  ParentID { get; }
+		int? Value1   { get; }
+	}
+
+	public class Parent : IEquatable<Parent>, IComparable
+	{
+		public int  ParentID;
+		public int? Value1;
+
+		[Association(ThisKey = "ParentID", OtherKey = "ParentID")]
+		public List<Child> Children;
+
+		[Association(ThisKey = "ParentID", OtherKey = "ParentID")]
+		public List<GrandChild> GrandChildren;
+
+		[Association(ThisKey = "ParentID", OtherKey = "ParentID")]
+		public IEnumerable<Child> Children2
+		{
+			get { return Children; }
+		}
+
+		public override bool Equals(object obj)
+		{
+			if (obj.GetType() != typeof(Parent)) return false;
+			return Equals((Parent)obj);
+		}
+
+		public bool Equals(Parent other)
+		{
+			if (ReferenceEquals(null, other)) return false;
+			if (ReferenceEquals(this, other)) return true;
+			return other.ParentID == ParentID && other.Value1.Equals(Value1);
+		}
+
+		public override int GetHashCode()
+		{
+			unchecked { return (ParentID * 397) ^ (Value1 ?? 0); }
+		}
+
+		public int CompareTo(object obj)
+		{
+			return ParentID - ((Parent)obj).ParentID;
+		}
+
+		[Association(ThisKey = "ParentID", OtherKey = "ID")]
+		public LinqDataTypes Types;
+	}
+
+	public class Child
+	{
+		[PrimaryKey] public int ParentID;
+		[PrimaryKey] public int ChildID;
+
+		[Association(ThisKey = "ParentID", OtherKey = "ParentID")]
+		public Parent  Parent;
+
+		[Association(ThisKey = "ParentID", OtherKey = "ParentID", CanBeNull = false)]
+		public Parent1 Parent1;
+
+		[Association(ThisKey = "ParentID", OtherKey = "ParentID2", CanBeNull = false)]
+		public Parent3 ParentID2;
+
+		[Association(ThisKey = "ParentID, ChildID", OtherKey = "ParentID, ChildID")]
+		public List<GrandChild> GrandChildren;
+
+		public override bool Equals(object obj)
+		{
+			return Equals(obj as Child);
+		}
+
+		public bool Equals(Child other)
+		{
+			if (ReferenceEquals(null, other)) return false;
+			if (ReferenceEquals(this, other)) return true;
+
+			return other.ParentID == ParentID && other.ChildID == ChildID;
+		}
+
+		public override int GetHashCode()
+		{
+			unchecked { return (ParentID * 397) ^ ChildID; }
+		}
+	}
+
+	public class GrandChild : IEquatable<GrandChild>
+	{
+		public GrandChild()
+		{
+			
+		}
+
+		public int? ParentID;
+		public int? ChildID;
+		public int? GrandChildID;
+
+		[Association(ThisKey = "ParentID, ChildID", OtherKey = "ParentID, ChildID")]
+		public Child Child;
+
+		public override bool Equals(object obj)
+		{
+			if (ReferenceEquals(null, obj)) return false;
+			if (ReferenceEquals(this, obj)) return true;
+			if (obj.GetType() != typeof (GrandChild)) return false;
+
+			return Equals((GrandChild)obj);
+		}
+
+		public bool Equals(GrandChild other)
+		{
+			if (ReferenceEquals(null, other)) return false;
+			if (ReferenceEquals(this, other)) return true;
+
+			return other.ParentID.Equals(ParentID) && other.ChildID.Equals(ChildID) && other.GrandChildID.Equals(GrandChildID);
+		}
+
+		public override int GetHashCode()
+		{
+			unchecked
+			{
+				var result = ParentID.HasValue ? ParentID.Value : 0;
+
+				result = (result * 397) ^ (ChildID.     HasValue ? ChildID.     Value : 0);
+				result = (result * 397) ^ (GrandChildID.HasValue ? GrandChildID.Value : 0);
+
+				return result;
+			}
+		}
+	}
+
+	[TableName("Parent")]
+	public class Parent3 : IEquatable<Parent3>, IComparable
+	{
+		[MapField("ParentID")]
+		public int  ParentID2 { get; set; }
+		public int? Value1    { get; set; }
+
+		public override bool Equals(object obj)
+		{
+			if (obj.GetType() != typeof (Parent3)) return false;
+			return Equals((Parent3)obj);
+		}
+
+		public bool Equals(Parent3 other)
+		{
+			if (ReferenceEquals(null, other)) return false;
+			if (ReferenceEquals(this, other)) return true;
+			return other.ParentID2 == ParentID2 && other.Value1.Equals(Value1);
+		}
+
+		public override int GetHashCode()
+		{
+			unchecked { return (ParentID2 * 397) ^ (Value1 ?? 0); }
+		}
+
+		public int CompareTo(object obj)
+		{
+			return ParentID2 - ((Parent3)obj).ParentID2;
+		}
+	}
+
+	[TableName("Parent")]
+	public class Parent4 : IEquatable<Parent4>, IComparable
+	{
+		public int       ParentID;
+		public TypeValue Value1;
+
+		public override bool Equals(object obj)
+		{
+			if (obj.GetType() != typeof (Parent4)) return false;
+			return Equals((Parent4)obj);
+		}
+
+		public bool Equals(Parent4 other)
+		{
+			if (ReferenceEquals(null, other)) return false;
+			if (ReferenceEquals(this, other)) return true;
+			return other.ParentID == ParentID && other.Value1.Equals(Value1);
+		}
+
+		public override int GetHashCode()
+		{
+			unchecked { return (ParentID * 397) ^ (int)Value1; }
+		}
+
+		public int CompareTo(object obj)
+		{
+			return ParentID - ((Parent4)obj).ParentID;
+		}
+	}
+
+	[TableName("Parent")]
+	public class Parent5 : IEquatable<Parent5>, IComparable
+	{
+		public int  ParentID;
+		public int? Value1;
+
+		[Association(ThisKey = "ParentID", OtherKey = "Value1", CanBeNull = true)]
+		public List<Parent5> Children;
+
+		public override bool Equals(object obj)
+		{
+			if (obj.GetType() != typeof(Parent5)) return false;
+			return Equals((Parent5)obj);
+		}
+
+		public bool Equals(Parent5 other)
+		{
+			if (ReferenceEquals(null, other)) return false;
+			if (ReferenceEquals(this, other)) return true;
+			return other.ParentID == ParentID && other.Value1.Equals(Value1);
+		}
+
+		public override int GetHashCode()
+		{
+			unchecked { return (ParentID * 397) ^ (int)Value1; }
+		}
+
+		public int CompareTo(object obj)
+		{
+			return ParentID - ((Parent5)obj).ParentID;
+		}
+	}
+
+	#endregion
+
+	#region Parent1/GrandChild1
+
+	[TableName("Parent")]
+	public class Parent1 : IEquatable<Parent1>, IComparable
+	{
+		[PrimaryKey]
+		public int  ParentID;
+		public int? Value1;
+
+		[Association(ThisKey = "ParentID", OtherKey = "ParentID")]
+		public List<Child> Children;
+
+		public override bool Equals(object obj)
+		{
+			if (obj.GetType() != typeof (Parent1)) return false;
+			return Equals((Parent1)obj);
+		}
+
+		public bool Equals(Parent1 other)
+		{
+			if (ReferenceEquals(null, other)) return false;
+			if (ReferenceEquals(this, other)) return true;
+			return other.ParentID == ParentID;
+		}
+
+		public override int GetHashCode()
+		{
+			unchecked { return ParentID * 397; }
+		}
+
+		public int CompareTo(object obj)
+		{
+			return ParentID - ((Parent1)obj).ParentID;
+		}
+	}
+
+	[TableName("GrandChild")]
+	public class GrandChild1 : IEquatable<GrandChild1>
+	{
+		public int  ParentID;
+		public int? ChildID;
+		public int? GrandChildID;
+
+		[Association(ThisKey = "ParentID, ChildID", OtherKey = "ParentID, ChildID")]
+		public Child Child;
+
+		[Association(ThisKey = "ParentID", OtherKey = "ParentID", CanBeNull = false)]
+		public Parent1 Parent;
+
+		public override bool Equals(object obj)
+		{
+			if (ReferenceEquals(null, obj)) return false;
+			if (ReferenceEquals(this, obj)) return true;
+			if (obj.GetType() != typeof (GrandChild1)) return false;
+
+			return Equals((GrandChild1)obj);
+		}
+
+		public bool Equals(GrandChild1 other)
+		{
+			if (ReferenceEquals(null, other)) return false;
+			if (ReferenceEquals(this, other)) return true;
+
+			return other.ParentID.Equals(ParentID) && other.ChildID.Equals(ChildID) && other.GrandChildID.Equals(GrandChildID);
+		}
+
+		public override int GetHashCode()
+		{
+			unchecked
+			{
+				var result = ParentID;
+
+				result = (result * 397) ^ (ChildID.     HasValue ? ChildID.     Value : 0);
+				result = (result * 397) ^ (GrandChildID.HasValue ? GrandChildID.Value : 0);
+
+				return result;
+			}
+		}
+	}
+
+	#endregion
+
+	#region Inheritance
+
+	[TableName("Parent")]
+	[InheritanceMapping(Code = null, Type = typeof(ParentInheritanceNull))]
+	[InheritanceMapping(Code = 1,    Type = typeof(ParentInheritance1))]
+	[InheritanceMapping(             Type = typeof(ParentInheritanceValue), IsDefault = true)]
+	public abstract class ParentInheritanceBase : IEquatable<ParentInheritanceBase>, IComparable
+	{
+		[PrimaryKey]
+		public int ParentID;
+
+		[Association(ThisKey = "ParentID", OtherKey = "ParentID")]
+		public List<Child> Children;
+
+		public override bool Equals(object obj)
+		{
+			if (obj.GetType() != GetType()) return false;
+			return Equals((ParentInheritanceBase)obj);
+		}
+
+		public bool Equals(ParentInheritanceBase other)
+		{
+			if (ReferenceEquals(null, other)) return false;
+			if (ReferenceEquals(this, other)) return true;
+			return other.ParentID == ParentID;
+		}
+
+		public override int GetHashCode()
+		{
+			return ParentID;
+		}
+
+		public int CompareTo(object obj)
+		{
+			return ParentID - ((Parent)obj).ParentID;
+		}
+	}
+
+	public class ParentInheritanceNull : ParentInheritanceBase
+	{
+	}
+
+	public class ParentInheritance1 : ParentInheritanceBase, IEquatable<ParentInheritance1>
+	{
+		[MapField(IsInheritanceDiscriminator = true)]
+		public int Value1;
+
+		public override bool Equals(object obj)
+		{
+			var ret = base.Equals(obj) && Equals((ParentInheritance1)obj);
+			return ret;
+		}
+
+		public bool Equals(ParentInheritance1 other)
+		{
+			return base.Equals(other) && other.Value1.Equals(Value1);
+		}
+
+		public override int GetHashCode()
+		{
+			unchecked { return (ParentID * 397) ^ Value1; }
+		}
+	}
+
+	public class ParentInheritanceValue : ParentInheritanceBase
+	{
+		[MapField(IsInheritanceDiscriminator = true)]
+		public int Value1;
+
+		public override bool Equals(object obj)
+		{
+			return base.Equals(obj) && Equals((ParentInheritanceValue)obj);
+		}
+
+		public bool Equals(ParentInheritanceValue other)
+		{
+			return base.Equals(other) && other.Value1.Equals(Value1);
+		}
+
+		public override int GetHashCode()
+		{
+			unchecked { return (ParentID * 397) ^ Value1; }
+		}
+	}
+
+	#endregion
+
+	#region Inheritance2
+
+	[TableName("Parent")]
+	[InheritanceMapping(Code = null, Type = typeof(ParentInheritanceBase2))]
+	[InheritanceMapping(Code = 1,    Type = typeof(ParentInheritance12))]
+	[InheritanceMapping(Code = 2,    Type = typeof(ParentInheritance12))]
+	public abstract class ParentInheritanceBase2
+	{
+		[PrimaryKey]
+		public int ParentID;
+
+		[Association(ThisKey = "ParentID", OtherKey = "ParentID")]
+		public List<Child> Children;
+	}
+
+	public class ParentInheritance12 : ParentInheritanceBase2
+	{
+		[MapField(IsInheritanceDiscriminator = true)]
+		public int Value1;
+	}
+
+	#endregion
+
+	#region Inheritance3
+
+	[TableName("Parent")]
+	[InheritanceMapping(Code = null, Type = typeof(ParentInheritanceBase3))]
+	[InheritanceMapping(Code = 1,    Type = typeof(ParentInheritance13))]
+	[InheritanceMapping(Code = 2,    Type = typeof(ParentInheritance13))]
+	public abstract class ParentInheritanceBase3
+	{
+		[PrimaryKey]
+		public int ParentID;
+
+		[Association(ThisKey = "ParentID", OtherKey = "ParentID")]
+		public List<Child> Children;
+	}
+
+	public class ParentInheritance13 : ParentInheritanceBase3
+	{
+		[MapField("Value1", IsInheritanceDiscriminator = true)]
+		public int Value;
+	}
+
+	#endregion
+
+	#region Inheritance4
+
+	public enum Parent4Type
+	{
+		Value1 = 1,
+		Value2 = 2
+	}
+
+	[TableName("Parent")]
+	[InheritanceMapping(Code = (int)Parent4Type.Value1, Type = typeof(ParentInheritance14))]
+	[InheritanceMapping(Code = (int)Parent4Type.Value2, Type = typeof(ParentInheritance24))]
+	public abstract class ParentInheritanceBase4
+	{
+		[PrimaryKey]
+		public int ParentID;
+
+		public abstract Parent4Type Value1 { get; }
+	}
+
+	public class ParentInheritance14 : ParentInheritanceBase4
+	{
+		[MapField(IsInheritanceDiscriminator = true)]
+		public override Parent4Type Value1 { get { return Parent4Type.Value1; } }
+	}
+
+	public class ParentInheritance24 : ParentInheritanceBase4
+	{
+		[MapField(IsInheritanceDiscriminator = true)]
+		public override Parent4Type Value1 { get { return Parent4Type.Value2; } }
+	}
+
+	#endregion
+
+	public class Functions
+	{
+		private readonly IDataContext _ctx;
+
+		public Functions(IDataContext ctx)
+		{
+			_ctx = ctx;
+		}
+
+		[TableFunction(Name="GetParentByID")]
+		public Table<Parent> GetParentByID(int? id)
+		{
+			return _ctx.GetTable<Parent>(this, (MethodInfo)(MethodBase.GetCurrentMethod()), id);
+		}
+
+		[TableExpression("{0} {1} WITH (TABLOCK)")]
+		public Table<T> WithTabLock<T>()
+			where T : class 
+		{
+			return _ctx.GetTable<T>(this, ((MethodInfo)(MethodBase.GetCurrentMethod())).MakeGenericMethod(typeof(T)));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Model/Patient.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,39 @@
+using System;
+
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+namespace Data.Linq.Model
+{
+	public class Patient
+	{
+		[PrimaryKey]
+		public int    PersonID;
+		public string Diagnosis;
+
+		[Association(ThisKey = "PersonID", OtherKey = "ID", CanBeNull = false)]
+		public Person Person;
+
+		public override bool Equals(object obj)
+		{
+			return Equals(obj as Patient);
+		}
+
+		public bool Equals(Patient other)
+		{
+			if (ReferenceEquals(null, other)) return false;
+			if (ReferenceEquals(this, other)) return true;
+			return other.PersonID == PersonID && Equals(other.Diagnosis,  Diagnosis);
+		}
+
+		public override int GetHashCode()
+		{
+			unchecked
+			{
+				var result = PersonID;
+				result = (result * 397) ^ (Diagnosis != null ? Diagnosis.GetHashCode() : 0);
+				return result;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Model/Person.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,70 @@
+using System;
+
+using BLToolkit.Data.Sql.SqlProvider;
+using BLToolkit.Mapping;
+using BLToolkit.DataAccess;
+
+namespace Data.Linq.Model
+{
+	public class Person
+	{
+		public Person()
+		{
+		}
+
+		public Person(int id)
+		{
+			ID = id;
+		}
+
+		public Person(int id, string firstName)
+		{
+			ID        = id;
+			FirstName = firstName;
+		}
+
+		[Identity, PrimaryKey]
+		//[SequenceName("PostgreSQL", "Seq")]
+		[SequenceName("Firebird",   "PersonID")]
+		[MapField("PersonID")] public int    ID;
+		                       public string FirstName { get; set; }
+		                       public string LastName;
+		[Nullable]             public string MiddleName;
+		                       public Gender Gender;
+
+		[MapIgnore]            public string Name { get { return FirstName + " " + LastName; }}
+
+		[Association(ThisKey = "ID", OtherKey = "PersonID", CanBeNull = true)]
+		public Patient Patient;
+
+		public override bool Equals(object obj)
+		{
+			return Equals(obj as Person);
+		}
+
+		public bool Equals(Person other)
+		{
+			if (ReferenceEquals(null, other)) return false;
+			if (ReferenceEquals(this, other)) return true;
+			return
+				other.ID == ID &&
+				Equals(other.LastName,   LastName) &&
+				Equals(other.MiddleName, MiddleName) &&
+				other.Gender == Gender &&
+				Equals(other.FirstName,  FirstName);
+		}
+
+		public override int GetHashCode()
+		{
+			unchecked
+			{
+				var result = ID;
+				result = (result * 397) ^ (LastName   != null ? LastName.GetHashCode()   : 0);
+				result = (result * 397) ^ (MiddleName != null ? MiddleName.GetHashCode() : 0);
+				result = (result * 397) ^ Gender.GetHashCode();
+				result = (result * 397) ^ (FirstName  != null ? FirstName.GetHashCode()  : 0);
+				return result;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Model/PostgreSQLSpecific.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,31 @@
+using System;
+
+using BLToolkit.Data.Sql.SqlProvider;
+using BLToolkit.DataAccess;
+
+namespace UnitTests.Linq.Interface.Model
+{
+	public class PostgreSQLSpecific
+	{
+		public class SequenceTest1
+		{
+			[Identity, SequenceName("SequenceTestSeq")]
+			public int    ID;
+			public string Value;
+		}
+
+		public class SequenceTest2
+		{
+			[Identity]
+			public int    ID;
+			public string Value;
+		}
+
+		public class SequenceTest3
+		{
+			[Identity, SequenceName("SequenceTestSeq")]
+			public int    ID;
+			public string Value;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Model/TestIdentity.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+using System;
+
+using BLToolkit.DataAccess;
+
+namespace Data.Linq.Model
+{
+	public class TestIdentity
+	{
+		[Identity, PrimaryKey]
+		//[SequenceName(ProviderName.PostgreSQL, "Seq")]
+		//[SequenceName(ProviderName.Firebird,   "PersonID")]
+		//[SequenceName("ID")]
+		public int ID;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Model/TypeValue.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,18 @@
+using System;
+
+using BLToolkit.Mapping;
+
+namespace Data.Linq.Model
+{
+	public enum TypeValue
+	{
+		[NullValue]
+		Value0 = 0,
+		[MapValue(1)] Value1 = 10,
+		Value2 = 2,
+		Value3 = 3,
+		Value4 = 4,
+		Value5 = 5,
+		Value6 = 6
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/MultipleQuery.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,72 @@
+using System;
+using System.Linq;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	[TestFixture]
+	public class MultipleQuery : TestBase
+	{
+		//[Test]
+		public void Test1()
+		{
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true;
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select p.Children,
+				from p in db.Parent select p.Children));
+
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false;
+		}
+
+		//[Test]
+		public void Test2()
+		{
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true;
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select p.Children.ToList(),
+				from p in db.Parent select p.Children.ToList()));
+
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false;
+		}
+
+		[Test]
+		public void Test3()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select    Child,
+				from p in db.Parent select db.Child));
+		}
+
+		//[Test]
+		public void Test4()
+		{
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true;
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select p.Children.Select(c => c.ChildID),
+				from p in db.Parent select p.Children.Select(c => c.ChildID)));
+
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false;
+		}
+
+		[Test]
+		public void Test5()
+		{
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true;
+
+			ForEachProvider(db =>
+				AreEqual(
+					from ch in    Child
+					orderby ch.ChildID
+					select    Parent.Where(p => p.ParentID == ch.Parent.ParentID).Select(p => p),
+					from ch in db.Child
+					orderby ch.ChildID
+					select db.Parent.Where(p => p.ParentID == ch.Parent.ParentID).Select(p => p)));
+
+			BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/OrderByTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,332 @@
+using System;
+using System.Linq;
+
+using NUnit.Framework;
+
+using BLToolkit.Data.DataProvider;
+
+// ReSharper disable ReturnValueOfPureMethodIsNotUsed
+
+namespace Data.Linq
+{
+	[TestFixture]
+	public class OrderByTest : TestBase
+	{
+		[Test]
+		public void OrderBy1()
+		{
+			var expected =
+				from ch in Child
+				orderby ch.ParentID descending, ch.ChildID ascending
+				select ch;
+
+			ForEachProvider(db =>
+			{
+				var result =
+					from ch in db.Child
+					orderby ch.ParentID descending, ch.ChildID ascending
+					select ch;
+
+				Assert.IsTrue(result.ToList().SequenceEqual(expected));
+			});
+		}
+
+		[Test]
+		public void OrderBy2()
+		{
+			var expected =
+				from ch in Child
+				orderby ch.ParentID descending, ch.ChildID ascending
+				select ch;
+
+			ForEachProvider(db =>
+			{
+				var result = 
+					from ch in db.Child
+					orderby ch.ParentID descending, ch.ChildID ascending
+					select ch;
+
+				Assert.IsTrue(result.ToList().SequenceEqual(expected));
+			});
+		}
+
+		[Test]
+		public void OrderBy3()
+		{
+			var expected =
+				from ch in
+					from ch in Child
+					orderby ch.ParentID descending
+					select ch
+				orderby ch.ParentID descending , ch.ChildID
+				select ch;
+
+			ForEachProvider(db =>
+			{
+				var result =
+					from ch in
+						from ch in db.Child
+						orderby ch.ParentID descending
+						select ch
+					orderby ch.ParentID descending , ch.ChildID
+					select ch;
+
+				Assert.IsTrue(result.ToList().SequenceEqual(expected));
+			});
+		}
+
+		[Test]
+		public void OrderBy4()
+		{
+			var expected =
+				from ch in
+					from ch in Child
+					orderby ch.ParentID descending
+					select ch
+				orderby ch.ParentID descending, ch.ChildID, ch.ParentID + 1 descending
+				select ch;
+
+			ForEachProvider(db =>
+			{
+				var result =
+					from ch in
+						from ch in db.Child
+						orderby ch.ParentID descending
+						select ch
+					orderby ch.ParentID descending, ch.ChildID, ch.ParentID + 1 descending
+					select ch;
+
+				Assert.IsTrue(result.ToList().SequenceEqual(expected));
+			});
+		}
+
+		[Test]
+		public void OrderBy5()
+		{
+			var expected =
+				from ch in Child
+				orderby ch.ChildID % 2, ch.ChildID
+				select ch;
+
+			ForEachProvider(db =>
+			{
+				var result =
+					from ch in db.Child
+					orderby ch.ChildID % 2, ch.ChildID
+					select ch;
+
+				Assert.IsTrue(result.ToList().SequenceEqual(expected));
+			});
+		}
+
+		[Test]
+		public void OrderBy6([DataContexts(ExcludeLinqService = true)] string context)
+		{
+			using (var dataContext = GetDataContext(context))
+			{
+				if (!(dataContext is TestDbManager)) return;
+				var db = (TestDbManager)dataContext;
+
+				var q =
+					from person in db.Person
+					join patient in db.Patient on person.ID equals patient.PersonID into g
+					from patient in g.DefaultIfEmpty()
+					orderby person.MiddleName // if comment this line then "Diagnosis" is not selected.
+					select new { person.ID, PatientID = patient != null ? (int?)patient.PersonID : null };
+
+				q.ToList();
+
+				Assert.IsFalse(db.LastQuery.Contains("Diagnosis"), "Why do we select Patient.Diagnosis??");
+
+			};
+		}
+
+		[Test]
+		public void ConditionOrderBy()
+		{
+			var expected =
+				from ch in Child
+				orderby ch.ParentID > 0 && ch.ChildID != ch.ParentID descending, ch.ChildID
+				select ch;
+
+			ForEachProvider(db =>
+			{
+				var result =
+					from ch in db.Child
+					orderby ch.ParentID > 0 && ch.ChildID != ch.ParentID descending, ch.ChildID
+					select ch;
+
+				Assert.IsTrue(result.ToList().SequenceEqual(expected));
+			});
+		}
+
+		[Test]
+		public void OrderBySelf1()
+		{
+			var expected = from p in Parent orderby p select p;
+
+			ForEachProvider(db =>
+			{
+				var result = from p in db.Parent orderby p select p;
+				Assert.IsTrue(result.ToList().SequenceEqual(expected));
+			});
+		}
+
+		[Test]
+		public void OrderBySelf2()
+		{
+			var expected = from p in Parent1 orderby p select p;
+
+			ForEachProvider(db =>
+			{
+				var result = from p in db.Parent1 orderby p select p;
+				Assert.IsTrue(result.ToList().SequenceEqual(expected));
+			});
+		}
+
+		[Test]
+		public void OrderBySelectMany1()
+		{
+			var expected =
+				from p in Parent.OrderBy(p => p.ParentID)
+				from c in Child. OrderBy(c => c.ChildID)
+				where p == c.Parent
+				select new { p.ParentID, c.ChildID };
+
+			ForEachProvider(new[] { ProviderName.Access }, db =>
+			{
+				var result =
+					from p in db.Parent.OrderBy(p => p.ParentID)
+					from c in db.Child. OrderBy(c => c.ChildID)
+					where p == c.Parent
+					select new { p.ParentID, c.ChildID };
+
+				Assert.IsTrue(result.ToList().SequenceEqual(expected));
+			});
+		}
+
+		[Test]
+		public void OrderBySelectMany2()
+		{
+			var expected =
+				from p in Parent1.OrderBy(p => p.ParentID)
+				from c in Child.  OrderBy(c => c.ChildID)
+				where p.ParentID == c.Parent1.ParentID
+				select new { p.ParentID, c.ChildID };
+
+			ForEachProvider(db =>
+			{
+				var result =
+					from p in db.Parent1.OrderBy(p => p.ParentID)
+					from c in db.Child.  OrderBy(c => c.ChildID)
+					where p == c.Parent1
+					select new { p.ParentID, c.ChildID };
+
+				Assert.IsTrue(result.ToList().SequenceEqual(expected));
+			});
+		}
+
+		[Test]
+		public void OrderBySelectMany3()
+		{
+			var expected =
+				from p in Parent.OrderBy(p => p.ParentID)
+				from c in Child. OrderBy(c => c.ChildID)
+				where c.Parent == p
+				select new { p.ParentID, c.ChildID };
+
+			ForEachProvider(new[] { ProviderName.Access }, db =>
+			{
+				var result =
+					from p in db.Parent.OrderBy(p => p.ParentID)
+					from c in db.Child. OrderBy(c => c.ChildID)
+					where c.Parent == p
+					select new { p.ParentID, c.ChildID };
+
+				Assert.IsTrue(result.ToList().SequenceEqual(expected));
+			});
+		}
+
+		[Test]
+		public void OrderAscDesc()
+		{
+			var expected = Parent.OrderBy(p => p.ParentID).OrderByDescending(p => p.ParentID);
+
+			ForEachProvider(db =>
+			{
+				var result = db.Parent.OrderBy(p => p.ParentID).OrderByDescending(p => p.ParentID);
+				Assert.IsTrue(result.ToList().SequenceEqual(expected));
+			});
+		}
+
+		[Test]
+		public void Count1()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				   Parent.OrderBy(p => p.ParentID).Count(),
+				db.Parent.OrderBy(p => p.ParentID).Count()));
+		}
+
+		[Test]
+		public void Count2()
+		{
+			ForEachProvider(new[] { ProviderName.Sybase }, db => Assert.AreEqual(
+				   Parent.OrderBy(p => p.ParentID).Take(3).Count(),
+				db.Parent.OrderBy(p => p.ParentID).Take(3).Count()));
+		}
+
+		[Test]
+		public void Min1()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				   Parent.OrderBy(p => p.ParentID).Min(p => p.ParentID),
+				db.Parent.OrderBy(p => p.ParentID).Min(p => p.ParentID)));
+		}
+
+		[Test]
+		public void Min2()
+		{
+			ForEachProvider(new[] { ProviderName.Sybase }, db => Assert.AreEqual(
+				   Parent.OrderBy(p => p.ParentID).Take(3).Min(p => p.ParentID),
+				db.Parent.OrderBy(p => p.ParentID).Take(3).Min(p => p.ParentID)));
+		}
+
+		[Test]
+		public void Min3()
+		{
+			ForEachProvider(new[] { ProviderName.Sybase, ProviderName.Informix }, db => Assert.AreEqual(
+				   Parent.OrderBy(p => p.Value1).Take(3).Min(p => p.ParentID),
+				db.Parent.OrderBy(p => p.Value1).Take(3).Min(p => p.ParentID)));
+		}
+
+		[Test]
+		public void Distinct()
+		{
+			ForEachProvider(db => AreEqual(
+				(from p in Parent
+				join c in Child on p.ParentID equals c.ParentID
+				join g in GrandChild on c.ChildID equals  g.ChildID
+				select p).Distinct().OrderBy(p => p.ParentID),
+				(from p in db.Parent
+				join c in db.Child on p.ParentID equals c.ParentID
+				join g in db.GrandChild on c.ChildID equals  g.ChildID
+				select p).Distinct().OrderBy(p => p.ParentID)));
+		}
+
+		[Test]
+		public void Take()
+		{
+			ForEachProvider(db =>
+			{
+				var q =
+					(from p in db.Parent
+					 join c in db.Child on p.ParentID equals c.ParentID
+					 join g in db.GrandChild on c.ChildID equals g.ChildID
+					 select p).Take(3).OrderBy(p => p.ParentID);
+
+				Assert.AreEqual(3, q.AsEnumerable().Count());
+			});
+		}
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/ParserTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,966 @@
+using System;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+
+using BLToolkit.Data.Linq;
+using BLToolkit.Data.Linq.Builder;
+using BLToolkit.Data.Sql;
+
+using Data.Linq.Model;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	[TestFixture]
+	public class ParserTest : TestBase
+	{
+		static ParserTest()
+		{
+			ExpressionBuilder.AddBuilder(new ContextParser());
+		}
+
+		#region IsExpressionTable
+
+		[Test]
+		public void IsExpressionTable1()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (p1 => p1.ParentID)
+					.GetContext();
+
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Association).Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Object).     Result);
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Field).      Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Expression). Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.SubQuery).   Result);
+			}
+		}
+
+		[Test]
+		public void IsExpressionTable2()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (p1 => p1.ParentID + 1)
+					.GetContext();
+
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Association).Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Object).     Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Field).      Result);
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Expression). Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.SubQuery).   Result);
+			}
+		}
+
+		[Test]
+		public void IsExpressionTable3()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (p1 => p1)
+					.GetContext();
+
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Association).Result);
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Object).     Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Field).      Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Expression). Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.SubQuery).   Result);
+			}
+		}
+
+		#endregion
+
+		#region IsExpressionScalar
+
+		[Test]
+		public void IsExpressionScalar1()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (p1 => p1.ParentID)
+					.Select    (p2 => p2)
+					.GetContext();
+
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Association).Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Object).     Result);
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Field).      Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Expression). Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.SubQuery).   Result);
+			}
+		}
+
+		[Test]
+		public void IsExpressionScalar2()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (p1 => p1.ParentID + 1)
+					.Select    (p2 => p2)
+					.GetContext();
+
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Association).Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Object).     Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Field).      Result);
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Expression). Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.SubQuery).   Result);
+			}
+		}
+
+		[Test]
+		public void IsExpressionScalar3()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (p1 => p1)
+					.Select    (p2 => p2)
+					.GetContext();
+
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Association).Result);
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Object).     Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Field).      Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Expression). Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.SubQuery).   Result);
+			}
+		}
+
+		[Test]
+		public void IsExpressionScalar4()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (p1 => p1.ParentID + 1)
+					.Where     (p3 => p3 == 1)
+					.Select    (p2 => p2)
+					.GetContext();
+
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Association).Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Object).     Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Field).      Result);
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Expression). Result);
+				//Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.SubQuery));
+			}
+		}
+
+		[Test]
+		public void IsExpressionScalar5()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (p1 => p1)
+					.Select    (p2 => p2.ParentID)
+					.GetContext();
+
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Association).Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Object).     Result);
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Field).      Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Expression). Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.SubQuery).   Result);
+			}
+		}
+
+		[Test]
+		public void IsExpressionScalar6()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Child
+					.Select    (p => p.Parent)
+					.Select    (p => p)
+					.GetContext();
+
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Association).Result);
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Object).     Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Field).      Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Expression). Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.SubQuery).   Result);
+			}
+		}
+
+		[Test]
+		public void IsExpressionScalar7()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Child
+					.Select    (p => p)
+					.Select    (p => p)
+					.Select    (p => p.Parent)
+					.GetContext();
+
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Association).Result);
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Object).     Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Field).      Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Expression). Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.SubQuery).   Result);
+			}
+		}
+
+		[Test]
+		public void IsExpressionScalar8()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Child
+					.Select    (p  => p)
+					.Select    (p3 => new { p1 = new { p2 = new { p = p3 } } })
+					.Select    (p  => p.p1.p2.p.Parent)
+					.GetContext();
+
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Association).Result);
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Object).     Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Field).      Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Expression). Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.SubQuery).   Result);
+			}
+		}
+
+		[Test]
+		public void IsExpressionScalar9()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Child
+					.Select    (p  => p)
+					.Select    (p3 => new { p1 = new { p2 = new { p = p3.Parent } } })
+					.Select    (p  => p.p1.p2.p)
+					.GetContext();
+
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Association).Result);
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Object).     Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Field).      Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Expression). Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.SubQuery).   Result);
+			}
+		}
+
+
+		[Test]
+		public void IsExpressionScalar10()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Child
+					.Select    (p => p)
+					.Select    (p => new { p = new { p } })
+					.Select    (p => p.p)
+					.GetContext();
+
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Association).Result);
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Object).     Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Field).      Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Expression). Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.SubQuery).   Result);
+			}
+		}
+
+		[Test]
+		public void IsExpressionScalar11()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Child
+					.Select    (p => p)
+					.Select    (p => new { p = new Child { ChildID = p.ChildID } })
+					.Select    (p => p.p)
+					.GetContext();
+
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Association).Result);
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Object).     Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Field).      Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Expression). Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.SubQuery).   Result);
+			}
+		}
+
+		#endregion
+
+		#region IsExpressionSelect
+
+		[Test]
+		public void IsExpressionSelect1()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (p1 => new { p1.ParentID })
+					.Select    (p2 => p2.ParentID)
+					.GetContext();
+
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Association).Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Object).     Result);
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Field).      Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Expression). Result);
+			}
+		}
+
+		[Test]
+		public void IsExpressionSelect2()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (p1 => new { p = p1.ParentID + 1 })
+					.Select    (p2 => p2.p)
+					.GetContext();
+
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Association).Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Object).     Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Field).      Result);
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Expression). Result);
+			}
+		}
+
+		[Test]
+		public void IsExpressionSelect3()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (p1 => new { p1 })
+					.Select    (p2 => p2.p1)
+					.GetContext();
+
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Association).Result);
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Object).     Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Field).      Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Expression). Result);
+			}
+		}
+
+		[Test]
+		public void IsExpressionSelect4()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (p1 => new { p = p1.ParentID + 1 })
+					.Where     (p3 => p3.p == 1)
+					.Select    (p2 => p2.p)
+					.GetContext();
+
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Association).Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Object).     Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Field).      Result);
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Expression). Result);
+			}
+		}
+
+		[Test]
+		public void IsExpressionSelect42()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (p1 => new { p = p1.ParentID + 1 })
+					.Where     (p3 => p3.p == 1)
+					.Select    (p2 => p2)
+					.GetContext();
+
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Association).Result);
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Object).     Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Field).      Result);
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Expression). Result);
+			}
+		}
+
+		[Test]
+		public void IsExpressionSelect5()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (p1 => new { p1 })
+					.Select    (p2 => p2.p1.ParentID)
+					.GetContext();
+
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Association).Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Object).     Result);
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Field).      Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Expression). Result);
+			}
+		}
+
+		[Test]
+		public void IsExpressionSelect6()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (p => new { p })
+					.Select    (p => p)
+					.GetContext();
+
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Association).Result);
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Object).     Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Field).      Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Expression). Result);
+			}
+		}
+
+		[Test]
+		public void IsExpressionSelect7()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Child
+					.Select    (p => new { p, p.Parent })
+					.Select    (p => new { p.Parent, p.p.ChildID })
+					.Select    (p => p.Parent)
+					.GetContext();
+
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Association).Result);
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Object).     Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Field).      Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Expression). Result);
+			}
+		}
+
+		[Test]
+		public void IsExpressionSelect8()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Child
+					.Select    (p => new { p, p.Parent })
+					.Select    (p => new { p.Parent.ParentID, p.p.ChildID })
+					.Select    (p => p.ParentID)
+					.GetContext();
+
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Association).Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Object).     Result);
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Field).      Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Expression). Result);
+			}
+		}
+
+		[Test]
+		public void IsExpressionSelect9()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.GrandChild
+					.Select    (p => new { p, p.Child })
+					.Select    (p => new { p.Child.Parent.ParentID, p.p.ChildID })
+					.Select    (p => p.ParentID)
+					.GetContext();
+
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Association).Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Object).     Result);
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Field).      Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Expression). Result);
+			}
+		}
+
+		[Test]
+		public void IsExpressionSelect10()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (p => p.Children.Max(c => (int?)c.ChildID) ?? p.Value1)
+					.Select    (p => p)
+					.GetContext();
+
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Association).Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Object).     Result);
+				Assert.IsFalse(ctx.IsExpression(null, 0, RequestFor.Field).      Result);
+				Assert.IsTrue (ctx.IsExpression(null, 0, RequestFor.Expression). Result);
+			}
+		}
+
+		#endregion
+
+		#region ConvertToIndexTable
+
+		[Test]
+		public void ConvertToIndexTable1()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent1
+					.Select    (t => t)
+					.GetContext();
+
+				Assert.AreEqual(new[] { 0, 1 }, ctx.ConvertToIndex(null, 0, ConvertFlags.All).Select(_ => _.Index).ToArray());
+				Assert.AreEqual(new[] { 0    }, ctx.ConvertToIndex(null, 0, ConvertFlags.Key).Select(_ => _.Index).ToArray());
+			}
+		}
+
+		[Test]
+		public void ConvertToIndexTable2()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (t => t)
+					.GetContext();
+
+				Assert.AreEqual(new[] { 0, 1 }, ctx.ConvertToIndex(null, 0, ConvertFlags.All).Select(_ => _.Index).ToArray());
+				Assert.AreEqual(new[] { 0, 1 }, ctx.ConvertToIndex(null, 0, ConvertFlags.Key).Select(_ => _.Index).ToArray());
+			}
+		}
+
+		[Test]
+		public void ConvertToIndexTable3()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (t => t.ParentID)
+					.GetContext();
+
+				Assert.AreEqual(new[] { 0 }, ctx.ConvertToIndex(null, 0, ConvertFlags.Field).Select(_ => _.Index).ToArray());
+			}
+		}
+
+		[Test]
+		public void ConvertToIndexTable4()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (t => t.Value1)
+					.GetContext();
+
+				Assert.AreEqual(new[] { 0 }, ctx.ConvertToIndex(null, 0, ConvertFlags.Field).Select(_ => _.Index).ToArray());
+			}
+		}
+
+		[Test]
+		public void ConvertToIndexTable5()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (t => new { t = new { t } })
+					.Select    (t => t.t.t.ParentID)
+					.Select    (t => t)
+					.GetContext();
+
+				Assert.AreEqual(new[] { 0 }, ctx.ConvertToIndex(null, 0, ConvertFlags.Field).Select(_ => _.Index).ToArray());
+			}
+		}
+
+		#endregion
+
+		#region ConvertToIndex
+
+		[Test]
+		public void ConvertToIndexScalar1()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (p1 => p1.ParentID)
+					.Select    (p2 => p2)
+					.GetContext();
+
+				Assert.AreEqual(new[] { 0 }, ctx.ConvertToIndex(null, 0, ConvertFlags.Field).Select(_ => _.Index).ToArray());
+			}
+		}
+
+		[Test]
+		public void ConvertToIndexScalar2()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (p1 => p1.ParentID + 1)
+					.Select    (p2 => p2)
+					.GetContext();
+
+				Assert.AreEqual(new[] { 0 }, ctx.ConvertToIndex(null, 0, ConvertFlags.Field).Select(_ => _.Index).ToArray());
+			}
+		}
+
+		[Test]
+		public void ConvertToIndexScalar3()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (p1 => p1.ParentID + 1)
+					.Where     (p3 => p3 == 1)
+					.Select    (p2 => p2)
+					.GetContext();
+
+				Assert.AreEqual(new[] { 0 }, ctx.ConvertToIndex(null, 0, ConvertFlags.Field).Select(_ => _.Index).ToArray());
+			}
+		}
+
+		[Test]
+		public void ConvertToIndexScalar4()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (p1 => new { p = new { p = p1.ParentID } })
+					.Select    (p2 => p2.p.p)
+					.GetContext();
+
+				Assert.AreEqual(new[] { 0 }, ctx.ConvertToIndex(null, 0, ConvertFlags.Field).Select(_ => _.Index).ToArray());
+			}
+		}
+
+		[Test]
+		public void ConvertToIndexJoin1()
+		{
+			using (var db = new TestDbManager())
+			{
+				var q2 =
+					from gc1 in db.GrandChild
+						join max in
+							from gch in db.GrandChild
+							group gch by gch.ChildID into g
+							select g.Max(c => c.GrandChildID)
+						on gc1.GrandChildID equals max
+					select gc1;
+
+				var result =
+					from ch in db.Child
+						join p   in db.Parent on ch.ParentID equals p.ParentID
+						join gc2 in q2        on p.ParentID  equals gc2.ParentID into g
+						from gc3 in g.DefaultIfEmpty()
+				select gc3;
+
+				var ctx = result.GetContext();
+				var idx = ctx.ConvertToIndex(null, 0, ConvertFlags.Key);
+
+				Assert.AreEqual(new[] { 0, 1, 2 }, idx.Select(_ => _.Index).ToArray());
+			}
+		}
+
+		[Test]
+		public void ConvertToIndexJoin2()
+		{
+			using (var db = new TestDbManager())
+			{
+				var result =
+					from ch in db.Child
+						join gc2 in db.GrandChild on ch.ParentID  equals gc2.ParentID into g
+						from gc3 in g.DefaultIfEmpty()
+					select gc3;
+
+				var ctx = result.GetContext();
+				var idx = ctx.ConvertToIndex(null, 0, ConvertFlags.Key);
+
+				Assert.AreEqual(new[] { 0, 1, 2 }, idx.Select(_ => _.Index).ToArray());
+
+				idx = ctx.ConvertToIndex(null, 0, ConvertFlags.All);
+
+				Assert.AreEqual(new[] { 0, 1, 2 }, idx.Select(_ => _.Index).ToArray());
+			}
+		}
+
+		#endregion
+
+		#region ConvertToSql
+
+		[Test]
+		public void ConvertToSql1()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (p1 => new { p1.ParentID })
+					.Select    (p2 => p2.ParentID)
+					.GetContext();
+
+				var sql = ctx.ConvertToSql(null, 0, ConvertFlags.Field);
+
+				Assert.AreEqual        (1, sql.Length);
+				Assert.IsAssignableFrom(typeof(SqlField), sql[0].Sql);
+				Assert.AreEqual        ("ParentID", ((SqlField)sql[0].Sql).Name);
+			}
+		}
+
+		[Test]
+		public void ConvertToSql2()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (p1 => new { p = p1.ParentID + 1 })
+					.Select    (p2 => p2.p)
+					.GetContext();
+
+				var sql = ctx.ConvertToSql(null, 0, ConvertFlags.Field);
+
+				Assert.AreEqual        (1, sql.Length);
+				Assert.IsAssignableFrom(typeof(SqlBinaryExpression), sql[0].Sql);
+			}
+		}
+
+		[Test]
+		public void ConvertToSql3()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (p1 => new { p = p1.ParentID + 1 })
+					.Where     (p3 => p3.p == 1)
+					.Select    (p2 => p2.p)
+					.GetContext();
+
+				var sql = ctx.ConvertToSql(null, 0, ConvertFlags.Field);
+
+				Assert.AreEqual        (1, sql.Length);
+				Assert.IsAssignableFrom(typeof(SqlQuery.Column), sql[0].Sql);
+			}
+		}
+
+		[Test]
+		public void ConvertToSql4()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Parent
+					.Select    (p1 => new { p1 })
+					.Select    (p2 => p2.p1.ParentID)
+					.GetContext();
+
+				var sql = ctx.ConvertToSql(null, 0, ConvertFlags.Field);
+
+				Assert.AreEqual        (1, sql.Length);
+				Assert.IsAssignableFrom(typeof(SqlField), sql[0].Sql);
+				Assert.AreEqual        ("ParentID", ((SqlField)sql[0].Sql).Name);
+			}
+		}
+
+		[Test]
+		public void ConvertToSql5()
+		{
+			using (var db = new TestDbManager())
+			{
+				var ctx = db.Child
+					.Select    (p => new { p, p.Parent })
+					.Select    (p => new { p.Parent.ParentID, p.p.ChildID })
+					.Select    (p => p.ParentID)
+					.GetContext();
+
+				var sql = ctx.ConvertToSql(null, 0, ConvertFlags.Field);
+
+				Assert.AreEqual        (1, sql.Length);
+				Assert.IsAssignableFrom(typeof(SqlField), sql[0].Sql);
+				Assert.AreEqual        ("ParentID", ((SqlField)sql[0].Sql).Name);
+			}
+		}
+
+		#endregion
+
+		#region SqlTest
+
+		[Test]
+		public void Join1()
+		{
+			using (var db = new TestDbManager())
+			{
+				var q =
+					from t in
+						from ch in db.Child
+							join p in db.Parent on ch.ParentID equals p.ParentID
+						select ch.ParentID + p.ParentID
+					where t > 2
+					select t;
+
+				var ctx = q.GetContext();
+				ctx.BuildExpression(null, 0);
+
+				Assert.AreEqual(1, ctx.SqlQuery.Select.Columns.Count);
+			}
+		}
+
+		[Test]
+		public void Join2()
+		{
+			using (var db = new TestDbManager())
+			{
+				var q =
+					from t in
+						from ch in db.Child
+							join p in db.Parent on ch.ParentID equals p.ParentID
+						select new { ID = ch.ParentID + p.ParentID }
+					where t.ID > 2
+					select t;
+
+				var ctx = q.GetContext();
+				ctx.BuildExpression(null, 0);
+
+				Assert.AreEqual(2, ctx.SqlQuery.Select.Columns.Count);
+			}
+		}
+
+		public class MyClass
+		{
+			public int ID;
+		}
+
+		[Test]
+		public void Join3()
+		{
+			using (var db = new TestDbManager())
+			{
+				var q =
+					from p in db.Parent
+					join j in db.Child on p.ParentID equals j.ParentID
+					select p;
+
+				var ctx = q.GetContext();
+				ctx.BuildExpression(null, 0);
+
+				Assert.AreEqual(2, ctx.SqlQuery.Select.Columns.Count);
+			}
+		}
+
+		[Test]
+		public void Join4()
+		{
+			using (var db = new TestDbManager())
+			{
+				var q =
+					from p in db.Parent
+					select new { ID = new MyClass { ID = p.ParentID } }
+					into p
+					join j in
+						from c in db.Child
+						select new { ID = new MyClass { ID = c.ParentID } }
+						on p.ID.ID equals j.ID.ID
+					where p.ID.ID == 1
+					select p;
+
+				var ctx = q.GetContext();
+				ctx.BuildExpression(null, 0);
+
+				Assert.AreEqual(1, ctx.SqlQuery.Select.Columns.Count);
+			}
+		}
+
+		[Test]
+		public void Join5()
+		{
+			using (var db = new TestDbManager())
+			{
+				var q =
+					from p in db.Parent
+						join c in db.Child      on p.ParentID equals c.ParentID
+						join g in db.GrandChild on p.ParentID equals g.ParentID
+					select new { p, c, g } into x
+					select x.c.ParentID;
+
+				var ctx = q.GetContext();
+				var sql = ctx.ConvertToSql(null, 0, ConvertFlags.All);
+
+				Assert.AreEqual(1, sql.Length);
+			}
+		}
+
+		[Test]
+		public void Join6([IncludeDataContexts("Sql2008", "Sql2012")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				var q =
+					from g in db.GrandChild
+					join p in db.Parent4 on g.Child.ParentID equals p.ParentID
+					select g;
+
+				var ctx = q.GetContext();
+
+				ctx.BuildExpression(null, 0);
+
+				var sql = db.GetSqlText(ctx.SqlQuery);
+
+				CompareSql(sql, @"
+					SELECT
+						[g].[ParentID],
+						[g].[ChildID],
+						[g].[GrandChildID]
+					FROM
+						[GrandChild] [g]
+							LEFT JOIN [Child] [t1] ON [g].[ParentID] = [t1].[ParentID] AND [g].[ChildID] = [t1].[ChildID]
+							INNER JOIN [Parent] [p] ON [t1].[ParentID] = [p].[ParentID]");
+			}
+		}
+
+		#endregion
+	}
+
+	class ContextParser : ISequenceBuilder
+	{
+		public int BuildCounter { get; set; }
+
+		public bool CanBuild(ExpressionBuilder builder, BuildInfo buildInfo)
+		{
+			var call = buildInfo.Expression as MethodCallExpression;
+			return call != null && call.Method.Name == "GetContext";
+		}
+
+		public IBuildContext BuildSequence(ExpressionBuilder builder, BuildInfo buildInfo)
+		{
+			var call = (MethodCallExpression)buildInfo.Expression;
+			return new Context(builder.BuildSequence(new BuildInfo(buildInfo, call.Arguments[0])));
+		}
+
+		public SequenceConvertInfo Convert(ExpressionBuilder builder, BuildInfo buildInfo, ParameterExpression param)
+		{
+			return null;
+		}
+
+		public bool IsSequence(ExpressionBuilder builder, BuildInfo buildInfo)
+		{
+			return builder.IsSequence(new BuildInfo(buildInfo, ((MethodCallExpression)buildInfo.Expression).Arguments[0]));
+		}
+
+		public class Context : PassThroughContext
+		{
+			public Context(IBuildContext context) : base(context)
+			{
+			}
+
+			public override void BuildQuery<T>(Query<T> query, ParameterExpression queryParameter)
+			{
+				query.GetElement = (ctx,db,expr,ps) => this;
+			}
+		}
+	}
+
+	static class Extensions
+	{
+		public static ContextParser.Context GetContext<T>(this IQueryable<T> source)
+		{
+			if (source == null) throw new ArgumentNullException("source");
+
+			return source.Provider.Execute<ContextParser.Context>(
+				Expression.Call(
+					null,
+					((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(new[] { typeof(T) }),
+					new[] { source.Expression }));
+		}
+
+		static public Expression Unwrap(this Expression ex)
+		{
+			if (ex == null)
+				return null;
+
+			switch (ex.NodeType)
+			{
+				case ExpressionType.Quote          :
+				case ExpressionType.Convert        :
+				case ExpressionType.ConvertChecked : return ((UnaryExpression)ex).Operand.Unwrap();
+			}
+
+			return ex;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Properties/AssemblyInfo.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,32 @@
+using System;
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("UnitTests.Linq")]
+[assembly: AssemblyProduct("UnitTests.Linq")]
+[assembly: AssemblyCopyright("\xA9 2002-2012 www.bltoolkit.net")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("c70ce8cf-7383-4dd5-87fc-d3bb40eaeccb")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/ProviderSpecific/Access.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,33 @@
+using System;
+
+using NUnit.Framework;
+
+using BLToolkit.Data.DataProvider;
+
+namespace Data.Linq.ProviderSpecific
+{
+	[TestFixture]
+	public class Access : TestBase
+	{
+		[Test]
+		public void SqlTest()
+		{
+			using (var db = new TestDbManager(ProviderName.Access))
+			{
+				var res = db
+					.SetCommand(@"
+						UPDATE
+							[Child] [c]
+								LEFT JOIN [Parent] [t1] ON [c].[ParentID] = [t1].[ParentID]
+						SET
+							[ChildID] = @id
+						WHERE
+							[c].[ChildID] = @id1 AND [t1].[Value1] = 1
+",
+						db.Parameter("@id1", 1001),
+						db.Parameter("@id", 1002))
+					.ExecuteNonQuery();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/ProviderSpecific/Firebird.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,50 @@
+using System;
+using System.Linq;
+
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+
+using NUnit.Framework;
+
+using UnitTests.Linq.Interface.Model;
+
+namespace Data.Linq.ProviderSpecific
+{
+	[TestFixture, Category("Firebird")]
+	public class Firebird : TestBase
+	{
+		[Test]
+		public void SequenceInsert([IncludeDataContexts(ProviderName.Firebird)] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				db.GetTable<FirebirdSpecific.SequenceTest>().Where(_ => _.Value == "SeqValue").Delete();
+				db.Insert(new FirebirdSpecific.SequenceTest { Value = "SeqValue" });
+
+				var id = db.GetTable<FirebirdSpecific.SequenceTest>().Single(_ => _.Value == "SeqValue").ID;
+
+				db.GetTable<FirebirdSpecific.SequenceTest>().Where(_ => _.ID == id).Delete();
+
+				Assert.AreEqual(0, db.GetTable<FirebirdSpecific.SequenceTest>().Count(_ => _.Value == "SeqValue"));
+			}
+		}
+
+		[Test]
+		public void SequenceInsertWithIdentity([IncludeDataContexts(ProviderName.Firebird)] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				db.GetTable<FirebirdSpecific.SequenceTest>().Where(_ => _.Value == "SeqValue").Delete();
+
+				var id1 = Convert.ToInt32(db.InsertWithIdentity(new FirebirdSpecific.SequenceTest { Value = "SeqValue" }));
+				var id2 = db.GetTable<FirebirdSpecific.SequenceTest>().Single(_ => _.Value == "SeqValue").ID;
+
+				Assert.AreEqual(id1, id2);
+
+				db.GetTable<FirebirdSpecific.SequenceTest>().Where(_ => _.ID == id1).Delete();
+
+				Assert.AreEqual(0, db.GetTable<FirebirdSpecific.SequenceTest>().Count(_ => _.Value == "SeqValue"));
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/ProviderSpecific/MsSql2008s.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,49 @@
+using System;
+using System.Linq;
+using BLToolkit.Data.Linq;
+using NUnit.Framework;
+
+namespace Data.Linq.ProviderSpecific
+{
+	[TestFixture]
+	public class MsSql2008 : TestBase
+	{
+		[Test]
+		public void SqlTest([IncludeDataContexts("Sql2008", "Sql2012")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			using (var rd = db.SetCommand(@"
+				SELECT
+					DateAdd(Hour, 1, [t].[DateTimeValue]) - [t].[DateTimeValue]
+				FROM
+					[LinqDataTypes] [t]")
+				.ExecuteReader())
+			{
+				if (rd.Read())
+				{
+					var value = rd.GetValue(0);
+				}
+			}
+		}
+
+		[Test]
+		public void SqlTypeTest([IncludeDataContexts("Sql2008", "Sql2012")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				var q =
+					from p in db.Parent
+					join c in db.Child on p.ParentID equals c.ParentID into g
+					from c in g.DefaultIfEmpty()
+					select new {p, b = Sql.AsSql((int?)c.ParentID) };
+
+				var list = q.ToList();
+
+
+				var value = db.SetCommand(@"SELECT SmallIntValue FROM LinqDataTypes WHERE ID = 1").ExecuteScalar<short>();
+
+				db.SetCommand(@"UPDATE LinqDataTypes SET SmallIntValue = @value WHERE ID = 1", db.Parameter("value", (ushort)value)).ExecuteNonQuery();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/ProviderSpecific/MySqlSprocParameterPrefixTests.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,183 @@
+using System;
+
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+
+using NUnit.Framework;
+
+namespace Data.Linq.ProviderSpecific
+{
+	using Model;
+
+	[TestFixture]
+	[Category("MySql")]
+	public class MySqlSprocParameterPrefixTests : TestBase
+	{
+		[Test]
+		public void ParameterPrefixTest([IncludeDataContexts(ProviderName.MySql)] string context)
+		{
+			var oldPrefix = MySqlDataProvider.SprocParameterPrefix;
+			MySqlDataProvider.SprocParameterPrefix = "_";
+
+			try
+			{
+				using (var db = new TestDbManager(context))
+				{
+					var person = db.SetSpCommand("GetPersonById", db.Parameter("?ID", 1)).ExecuteObject<Person>();
+					Assert.IsNotNull(person);
+
+					var person2 = db.SetSpCommand("GetPersonByName", db.CreateParameters(person)).ExecuteObject<Person>();
+					Assert.IsNotNull(person2);
+
+					Assert.AreEqual(person, person2);
+				}
+			}
+			finally
+			{
+				MySqlDataProvider.SprocParameterPrefix = oldPrefix;
+			}
+		}
+
+		[Test]
+		public void SetCommandWorksCorrectlyWithSprocParameterPrefixSet([IncludeDataContexts(ProviderName.MySql)] string context)
+		{
+			var oldPrefix = MySqlDataProvider.SprocParameterPrefix;
+			MySqlDataProvider.SprocParameterPrefix = "_";
+
+			try
+			{
+				using (var db = new DbManager(context))
+				{
+					var person = db.SetCommand(
+							"SELECT * FROM Person WHERE PersonID = ?PersonID",
+							db.Parameter("?PersonID", 1))
+						.ExecuteObject<Person>();
+
+					Assert.IsNotNull(person);
+					Assert.AreEqual(1, person.ID);
+
+					var person2 = db.SetCommand(
+							"SELECT * FROM Person WHERE FirstName = ?firstName AND LastName = ?lastName",
+							db.CreateParameters(person))
+						.ExecuteObject<Person>();
+
+					Assert.IsNotNull(person2);
+					Assert.AreEqual(person, person2);
+				}
+			}
+			finally
+			{
+				MySqlDataProvider.SprocParameterPrefix = oldPrefix;
+			}
+		}
+
+		[Test]
+		public void SprocParameterPrefixShouldBeSpecifiedManuallyWhenItIsNotSet([IncludeDataContexts(ProviderName.MySql)] string context)
+		{
+			using (var db = new DbManager(context))
+			{
+				var person = db.SetSpCommand("GetPersonById", db.Parameter("?_ID", 1)).ExecuteObject<Person>();
+				Assert.IsNotNull(person);
+
+				var person2 = db.SetSpCommand(
+						"GetPersonByName", 
+						db.Parameter("?_lastName", person.LastName),
+						db.Parameter("?_firstName", person.FirstName))
+					.ExecuteObject<Person>();
+				Assert.IsNotNull(person2);
+			}
+		}
+
+		[Test]
+		public void ParameterSymbolMayBeOmitedForSpCommand([IncludeDataContexts(ProviderName.MySql)] string context)
+		{
+			// I am not sure this is a good thing though
+			// Maybe we need to be more strict on syntax and on the library users
+			// and do not allow different syntax (omiting parameter symbol)?
+
+			using (var db = new DbManager(context))
+			{
+				var person = db.SetSpCommand("GetPersonById", db.Parameter("_ID", 1)).ExecuteObject<Person>();
+				Assert.IsNotNull(person);
+
+				var person2 = db.SetSpCommand(
+						"GetPersonByName",
+						db.Parameter("_lastName", person.LastName),
+						db.Parameter("_firstName", person.FirstName))
+					.ExecuteObject<Person>();
+				Assert.IsNotNull(person2);
+				Assert.AreEqual(person, person2);
+
+				var oldPrefix = MySqlDataProvider.SprocParameterPrefix;
+				MySqlDataProvider.SprocParameterPrefix = "_";
+
+				try
+				{
+					var person3 = db.SetSpCommand("GetPersonById", db.Parameter("ID", 1)).ExecuteObject<Person>();
+					Assert.AreEqual(person, person3);
+				}
+				finally
+				{
+					MySqlDataProvider.SprocParameterPrefix = oldPrefix;
+				}
+			}
+		}
+
+		[Test]
+		public void SpecifyingParameterPrefixManuallyIsAlsoOk([IncludeDataContexts(ProviderName.MySql)] string context)
+		{
+			var oldPrefix = MySqlDataProvider.SprocParameterPrefix;
+			MySqlDataProvider.SprocParameterPrefix = "_";
+
+			try
+			{
+				using (var db = new DbManager(context))
+				{
+					// we specify parameter name with a prefix, though SprocParameterPrefix is specified
+					// in this case additional parameter prefix will not be added, so everything will be ok
+					var person = db.SetSpCommand("GetPersonById", db.Parameter("?_ID", 1)).ExecuteObject<Person>();
+					Assert.IsNotNull(person);
+				}
+			}
+			finally
+			{
+				MySqlDataProvider.SprocParameterPrefix = oldPrefix;
+			}
+		}
+
+		[Test]
+		public void PrefixIsAddedWhenRetrievingParameterFromDbManager([IncludeDataContexts(ProviderName.MySql)] string context)
+		{
+			var oldPrefix = MySqlDataProvider.SprocParameterPrefix;
+			MySqlDataProvider.SprocParameterPrefix = "_";
+
+			try
+			{
+				using (var db = new DbManager(context))
+				{
+					db.SetSpCommand("GetPersonById", db.Parameter("?ID", 1)).Prepare();
+
+					foreach (var personID in new[] { 1, 2 })
+					{
+						// prefix is not specified but it will be added internally before retrieving parameter from
+						// command parameters
+						db.Parameter("?ID").Value = personID;
+						var person = db.ExecuteObject<Person>();
+						Assert.IsNotNull(person);
+						Assert.AreEqual(personID, person.ID);
+
+						// specifying prefix is also ok
+						db.Parameter("?_ID").Value = personID;
+						person = db.ExecuteObject<Person>();
+						Assert.IsNotNull(person);
+						Assert.AreEqual(personID, person.ID);
+					}
+				}
+			}
+			finally
+			{
+				MySqlDataProvider.SprocParameterPrefix = oldPrefix;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/ProviderSpecific/Oracle.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,163 @@
+using System;
+using System.Data.Linq.Mapping;
+using System.Linq;
+
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+using NUnit.Framework;
+
+using UnitTests.Linq.Interface.Model;
+
+namespace Data.Linq.ProviderSpecific
+{
+	using Model;
+
+    [TestFixture, Category("Oracle")]
+	public class Oracle : TestBase
+	{
+		#region Sequence
+
+		[Test]
+		public void SequenceInsert([IncludeDataContexts("Oracle")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				db.GetTable<OracleSpecific.SequenceTest>().Where(_ => _.Value == "SeqValue").Delete();
+				db.Insert(new OracleSpecific.SequenceTest { Value = "SeqValue" });
+
+				var id = db.GetTable<OracleSpecific.SequenceTest>().Single(_ => _.Value == "SeqValue").ID;
+
+				db.GetTable<OracleSpecific.SequenceTest>().Where(_ => _.ID == id).Delete();
+
+				Assert.AreEqual(0, db.GetTable<OracleSpecific.SequenceTest>().Count(_ => _.Value == "SeqValue"));
+			}
+		}
+
+		[Test]
+		public void SequenceInsertWithIdentity([IncludeDataContexts("Oracle")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				db.GetTable<OracleSpecific.SequenceTest>().Where(_ => _.Value == "SeqValue").Delete();
+
+				var id1 = Convert.ToInt32(db.InsertWithIdentity(new OracleSpecific.SequenceTest { Value = "SeqValue" }));
+				var id2 = db.GetTable<OracleSpecific.SequenceTest>().Single(_ => _.Value == "SeqValue").ID;
+
+				Assert.AreEqual(id1, id2);
+
+				db.GetTable<OracleSpecific.SequenceTest>().Where(_ => _.ID == id1).Delete();
+
+				Assert.AreEqual(0, db.GetTable<OracleSpecific.SequenceTest>().Count(_ => _.Value == "SeqValue"));
+			}
+		}
+
+		#endregion
+
+		#region InsertBatch
+
+		[Table(Name = "stg_trade_information")]
+		public class Trade
+		{
+			[MapField("STG_TRADE_ID")]          public int       ID             { get; set; }
+			[MapField("STG_TRADE_VERSION")]     public int       Version        { get; set; }
+			[MapField("INFORMATION_TYPE_ID")]   public int       TypeID         { get; set; }
+			[MapField("INFORMATION_TYPE_NAME")] public string    TypeName       { get; set; }
+			[MapField("value")]                 public string    Value          { get; set; }
+			[MapField("value_as_integer")]      public int?      ValueAsInteger { get; set; }
+			[MapField("value_as_date")]         public DateTime? ValueAsDate    { get; set; }
+		}
+
+		[Test]
+		public void InsertBatch1([IncludeDataContexts("Oracle")] string context)
+		{
+			var data = new[]
+			{
+				new Trade { ID = 375, Version = 1, TypeID = 20224, TypeName = "Gas Month",     },
+				new Trade { ID = 328, Version = 1, TypeID = 20224, TypeName = "Gas Month",     },
+				new Trade { ID = 348, Version = 1, TypeID = 20224, TypeName = "Gas Month",     },
+				new Trade { ID = 357, Version = 1, TypeID = 20224, TypeName = "Gas Month",     },
+				new Trade { ID = 371, Version = 1, TypeID = 20224, TypeName = "Gas Month",     },
+				new Trade { ID = 333, Version = 1, TypeID = 20224, TypeName = "Gas Month",     ValueAsInteger = 1,          ValueAsDate = new DateTime(2011, 1, 5) },
+				new Trade { ID = 353, Version = 1, TypeID = 20224, TypeName = "Gas Month",     ValueAsInteger = 1000000000,                                        },
+				new Trade { ID = 973, Version = 1, TypeID = 20160, TypeName = "EU Allowances", },
+			};
+
+			using (var db = new TestDbManager(context))
+			{
+				db.InsertBatch(5, data);
+			}
+		}
+
+		[Test]
+		public void InsertBatch2([IncludeDataContexts("Oracle")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				db.Types2.Delete(_ => _.ID > 1000);
+
+				db.InsertBatch(2, new[]
+				{
+					new LinqDataTypes2 { ID = 1003, MoneyValue = 0m, DateTimeValue = null,         BoolValue = true,  GuidValue = new Guid("ef129165-6ffe-4df9-bb6b-bb16e413c883"), SmallIntValue = null, IntValue = null },
+					new LinqDataTypes2 { ID = 1004, MoneyValue = 0m, DateTimeValue = DateTime.Now, BoolValue = false, GuidValue = null,                                             SmallIntValue = 2,    IntValue = 1532334 },
+					new LinqDataTypes2 { ID = 1005, MoneyValue = 1m, DateTimeValue = DateTime.Now, BoolValue = false, GuidValue = null,                                             SmallIntValue = 5,    IntValue = null },
+					new LinqDataTypes2 { ID = 1006, MoneyValue = 2m, DateTimeValue = DateTime.Now, BoolValue = false, GuidValue = null,                                             SmallIntValue = 6,    IntValue = 153     },
+				});
+
+				db.Types2.Delete(_ => _.ID > 1000);
+			}
+		}
+
+		#endregion
+
+		#region Transaction
+
+		[TableName("demo_product_info")]
+		public new class Product
+		{
+			[MapField("PRODUCT_ID"), PrimaryKey, NonUpdatable]
+			public int Id;
+
+			[MapField("PRODUCT_NAME")]
+			public string Name;
+
+			[MapField("PRODUCT_DESCRIPTION")]
+			public string Description;
+		}
+
+		public abstract class ProductEntityAccesor : DataAccessor<Product>
+		{
+			public abstract int Insert(Product product);
+			public abstract void Delete(int id);
+			public abstract Product SelectByKey(int id);
+			public abstract Product SelectByKey(DbManager db, int id);
+		}
+
+		//[Test]
+		public void CanInsertProductWithAccessorTest([IncludeDataContexts("Oracle")] string context)
+		{
+			using (var dbManager = new TestDbManager(context))
+			{
+				var productEntityAccesor = DataAccessor.CreateInstance<ProductEntityAccesor>(dbManager);
+
+				productEntityAccesor.BeginTransaction();
+
+				var id = productEntityAccesor.Insert(new Product { Name = "product name test", Description = "product description test" });
+				//This assert fails bacause id == 0 and it does not insert until the CommitTransaction is called.
+				Assert.AreNotEqual(0, id);
+
+				Product product = productEntityAccesor.SelectByKey(id);
+				Assert.IsNotNull(product);
+
+				productEntityAccesor.Delete(id);
+
+				productEntityAccesor.CommitTransaction();
+			}
+		}
+
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/ProviderSpecific/PostgreSQL.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,141 @@
+using System;
+using System.Linq;
+
+using BLToolkit.Data.Linq;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+using NUnit.Framework;
+
+using UnitTests.Linq.Interface.Model;
+
+namespace Data.Linq.ProviderSpecific
+{
+    [TestFixture, Category("PostgreSQL")]
+	public class PostgreSQL : TestBase
+	{
+		[TableName(Owner="public", Name="entity")]
+		public class Entity
+		{
+			[MapField("the_name") ] public string TheName { get; set; }
+		}
+
+		[Test]
+		public void SqlTest1([IncludeDataContexts(ProviderName.PostgreSQL)] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				db.BeginTransaction();
+
+				db
+					.SetSpCommand("add_if_not_exists", db.Parameter("p_name", "one"))
+					.ExecuteNonQuery();
+
+				db.Insert(new Entity { TheName = "two" });
+			}
+		}
+
+		[Test]
+		public void SequenceInsert1([IncludeDataContexts(ProviderName.PostgreSQL)] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				db.GetTable<PostgreSQLSpecific.SequenceTest1>().Where(_ => _.Value == "SeqValue").Delete();
+				db.Insert(new PostgreSQLSpecific.SequenceTest1 { Value = "SeqValue" });
+
+				var id = db.GetTable<PostgreSQLSpecific.SequenceTest1>().Single(_ => _.Value == "SeqValue").ID;
+
+				db.GetTable<PostgreSQLSpecific.SequenceTest1>().Where(_ => _.ID == id).Delete();
+
+				Assert.AreEqual(0, db.GetTable<PostgreSQLSpecific.SequenceTest1>().Count(_ => _.Value == "SeqValue"));
+			}
+		}
+
+		[Test]
+		public void SequenceInsert2([IncludeDataContexts(ProviderName.PostgreSQL)] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				db.GetTable<PostgreSQLSpecific.SequenceTest2>().Where(_ => _.Value == "SeqValue").Delete();
+				db.Insert(new PostgreSQLSpecific.SequenceTest2 { Value = "SeqValue" });
+
+				var id = db.GetTable<PostgreSQLSpecific.SequenceTest2>().Single(_ => _.Value == "SeqValue").ID;
+
+				db.GetTable<PostgreSQLSpecific.SequenceTest2>().Where(_ => _.ID == id).Delete();
+
+				Assert.AreEqual(0, db.GetTable<PostgreSQLSpecific.SequenceTest2>().Count(_ => _.Value == "SeqValue"));
+			}
+		}
+
+		[Test]
+		public void SequenceInsert3([IncludeDataContexts(ProviderName.PostgreSQL)] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				db.GetTable<PostgreSQLSpecific.SequenceTest3>().Where(_ => _.Value == "SeqValue").Delete();
+				db.Insert(new PostgreSQLSpecific.SequenceTest3 { Value = "SeqValue" });
+
+				var id = db.GetTable<PostgreSQLSpecific.SequenceTest3>().Single(_ => _.Value == "SeqValue").ID;
+
+				db.GetTable<PostgreSQLSpecific.SequenceTest3>().Where(_ => _.ID == id).Delete();
+
+				Assert.AreEqual(0, db.GetTable<PostgreSQLSpecific.SequenceTest3>().Count(_ => _.Value == "SeqValue"));
+			}
+		}
+
+		[Test]
+		public void SequenceInsertWithIdentity1([IncludeDataContexts(ProviderName.PostgreSQL)] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				db.GetTable<PostgreSQLSpecific.SequenceTest1>().Where(_ => _.Value == "SeqValue").Delete();
+
+				var id1 = Convert.ToInt32(db.InsertWithIdentity(new PostgreSQLSpecific.SequenceTest1 { Value = "SeqValue" }));
+				var id2 = db.GetTable<PostgreSQLSpecific.SequenceTest1>().Single(_ => _.Value == "SeqValue").ID;
+
+				Assert.AreEqual(id1, id2);
+
+				db.GetTable<PostgreSQLSpecific.SequenceTest1>().Where(_ => _.ID == id1).Delete();
+
+				Assert.AreEqual(0, db.GetTable<PostgreSQLSpecific.SequenceTest1>().Count(_ => _.Value == "SeqValue"));
+			}
+		}
+
+			[Test]
+		public void SequenceInsertWithIdentity2([IncludeDataContexts(ProviderName.PostgreSQL)] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				db.GetTable<PostgreSQLSpecific.SequenceTest2>().Where(_ => _.Value == "SeqValue").Delete();
+
+				var id1 = Convert.ToInt32(db.InsertWithIdentity(new PostgreSQLSpecific.SequenceTest2 { Value = "SeqValue" }));
+				var id2 = db.GetTable<PostgreSQLSpecific.SequenceTest2>().Single(_ => _.Value == "SeqValue").ID;
+
+				Assert.AreEqual(id1, id2);
+
+				db.GetTable<PostgreSQLSpecific.SequenceTest2>().Where(_ => _.ID == id1).Delete();
+
+				Assert.AreEqual(0, db.GetTable<PostgreSQLSpecific.SequenceTest2>().Count(_ => _.Value == "SeqValue"));
+			}
+		}
+
+		[Test]
+		public void SequenceInsertWithIdentity3([IncludeDataContexts(ProviderName.PostgreSQL)] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				db.GetTable<PostgreSQLSpecific.SequenceTest3>().Where(_ => _.Value == "SeqValue").Delete();
+
+				var id1 = Convert.ToInt32(db.InsertWithIdentity(new PostgreSQLSpecific.SequenceTest3 { Value = "SeqValue" }));
+				var id2 = db.GetTable<PostgreSQLSpecific.SequenceTest3>().Single(_ => _.Value == "SeqValue").ID;
+
+				Assert.AreEqual(id1, id2);
+
+				db.GetTable<PostgreSQLSpecific.SequenceTest3>().Where(_ => _.ID == id1).Delete();
+
+				Assert.AreEqual(0, db.GetTable<PostgreSQLSpecific.SequenceTest3>().Count(_ => _.Value == "SeqValue"));
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/ProviderSpecific/SqlCe.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,41 @@
+using System;
+using System.Data;
+
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+using NUnit.Framework;
+
+using BLToolkit.Data.DataProvider;
+
+namespace Data.Linq.ProviderSpecific
+{
+	[TestFixture]
+	public class SqlCe : TestBase
+	{
+		[TableName("LinqDataTypes")]
+		class Test
+		{
+			public int ID;
+			[MapField("DateTimeValue"), DbType(DbType.DateTime2)]
+			public DateTime? Data;
+		}
+
+		[Test]
+		public void DateTime2Test([IncludeDataContexts(ProviderName.SqlCe)] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				try
+				{
+					new SqlQuery<Test>().Insert(db, new Test { ID = 100001, Data = DateTime.Now });
+				}
+				finally
+				{
+					db.GetTable<Test>().Delete(t => t.ID > 10000);
+				}
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Providers.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,23 @@
+using System;
+using System.Collections;
+using System.Linq;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	public class ProvidersAttribute : TestCaseSourceAttribute
+	{
+		public ProvidersAttribute() : base(typeof(ProviderFactory), "All")
+		{
+		}
+	}
+
+	class ProviderFactory
+	{
+		public static IEnumerable All
+		{
+			get { return TestBase.Providers.Select(provider => provider.Name); }
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/SelectManyTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,696 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+
+using BLToolkit.Data.DataProvider;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class SelectManyTest : TestBase
+	{
+		[Test]
+		public void Basic1()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.SelectMany(p =>    Child),
+				db.Parent.SelectMany(p => db.Child)));
+		}
+
+		[Test]
+		public void Basic1_1()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.SelectMany(p =>    Child.SelectMany(t =>    GrandChild)),
+				db.Parent.SelectMany(p => db.Child.SelectMany(t => db.GrandChild))));
+		}
+
+		[Test]
+		public void Basic2()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.SelectMany(p =>    Child.Select(_ => _.ParentID + 1)),
+				db.Parent.SelectMany(p => db.Child.Select(_ => _.ParentID + 1))));
+		}
+
+		[Test]
+		public void Basic3()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.SelectMany(p =>    Child.Select(_ => _.ParentID + 1).Where(_ => _ > 1)),
+				db.Parent.SelectMany(p => db.Child.Select(_ => _.ParentID + 1).Where(_ => _ > 1))));
+		}
+
+		[Test]
+		public void Basic4()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.SelectMany(p =>    Child.Select(_ => _.ParentID + 1).Where(_ => p.ParentID == _)),
+				db.Parent.SelectMany(p => db.Child.Select(_ => _.ParentID + 1).Where(_ => p.ParentID == _))));
+		}
+
+        [Test]
+		public void Basic5()
+		{
+			ForEachProvider(new[] { ProviderName.Access }, db => AreEqual(
+				   Child.SelectMany(t => t.Parent.GrandChildren),
+				db.Child.SelectMany(t => t.Parent.GrandChildren)));
+		}
+
+		[Test]
+		public void Basic6()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.SelectMany(p => p.Children.Select(_ => _.ParentID + 1).Where(_ => _ > 1)),
+				db.Parent.SelectMany(p => p.Children.Select(_ => _.ParentID + 1).Where(_ => _ > 1))));
+		}
+
+		[Test]
+		public void Basic61()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.SelectMany(p => p.Children.Select(_ => _.ParentID + 1).Where(_ => _ > 1 || _ > 2)).Where(_ => _ > 0 || _ > 3),
+				db.Parent.SelectMany(p => p.Children.Select(_ => _.ParentID + 1).Where(_ => _ > 1 || _ > 2)).Where(_ => _ > 0 || _ > 3)));
+		}
+
+        [Test]
+		public void Basic62()
+		{
+			ForEachProvider(new[] { ProviderName.Access },
+				db => AreEqual(
+					   Parent.SelectMany(p => p.Children.Select(_ => _.ParentID + p.ParentID).Where(_ => _ > 1)),
+					db.Parent.SelectMany(p => p.Children.Select(_ => _.ParentID + p.ParentID).Where(_ => _ > 1))));
+		}
+
+		[Test]
+		public void Basic7()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.SelectMany(p => p.Children),
+				db.Parent.SelectMany(p => p.Children)));
+		}
+
+		[Test]
+		public void Basic8()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.SelectMany(p => p.Children.SelectMany(t => t.GrandChildren)),
+				db.Parent.SelectMany(p => p.Children.SelectMany(t => t.GrandChildren))));
+		}
+
+		[Test]
+		public void Basic9()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.SelectMany(p => p.Children.SelectMany(t => p.GrandChildren)),
+				db.Parent.SelectMany(p => p.Children.SelectMany(t => p.GrandChildren))));
+		}
+
+        [Test]
+		public void Basic10()
+		{
+			ForEachProvider(new[] { ProviderName.Access }, db => AreEqual(
+				   Child.GroupBy(o => o.ParentID2).SelectMany(g => g.Select(o => o.Parent)),
+				db.Child.GroupBy(o => o.ParentID2).SelectMany(g => g.Select(o => o.Parent))));
+		}
+
+        [Test]
+		public void Basic11()
+		{
+			ForEachProvider(new[] { ProviderName.Access }, db => AreEqual(
+				   Child
+					.GroupBy(o => o.ParentID2)
+					.SelectMany(g => g.Select(o => o.ParentID)),
+				db.Child
+					.GroupBy(o => o.ParentID2)
+					.SelectMany(g => db.Child.Where(o => o.ParentID2 == g.Key).Select(o => o.ParentID))));
+		}
+
+		[Test]
+		public void Test1()
+		{
+			TestJohn(db =>
+			{
+				var q = db.Person.Select(p => p);
+
+				return db.Person
+					.SelectMany(p1 => q, (p1, p2) => new { p1, p2 })
+					.Where     (t => t.p1.ID == t.p2.ID && t.p1.ID == 1)
+					.Select    (t => new Person { ID = t.p1.ID, FirstName = t.p2.FirstName });
+			});
+		}
+
+		[Test]
+		public void Test11()
+		{
+			TestJohn(db => db.Person
+				.SelectMany(p1 => db.Person.Select(p => p), (p1, p2) => new { p1, p2 })
+				.Where     (t => t.p1.ID == t.p2.ID && t.p1.ID == 1)
+				.Select    (t => new Person { ID = t.p1.ID, FirstName = t.p2.FirstName }));
+		}
+
+		[Test]
+		public void Test21()
+		{
+			TestJohn(db =>
+				from p1 in from p in db.Person select new { ID1 = p.ID, p.LastName  }
+				from p2 in from p in db.Person select new { ID2 = p.ID, p.FirstName }
+				from p3 in from p in db.Person select new { ID3 = p.ID, p.LastName  }
+				where p1.ID1 == p2.ID2 && p1.LastName == p3.LastName && p1.ID1 == 1
+				select new Person { ID = p1.ID1, FirstName = p2.FirstName, LastName = p3.LastName } );
+		}
+
+		[Test]
+		public void Test22()
+		{
+			TestJohn(db =>
+				from p1 in from p in db.Person select p
+				from p2 in from p in db.Person select p
+				from p3 in from p in db.Person select p
+				where p1.ID == p2.ID && p1.LastName == p3.LastName && p1.ID == 1
+				select new Person { ID = p1.ID, FirstName = p2.FirstName, LastName = p3.LastName } );
+		}
+
+		[Test]
+		public void Test31()
+		{
+			TestJohn(db =>
+				from p in
+					from p in
+						from p in db.Person
+						where p.ID == 1
+						select new { p, ID = p.ID + 1 }
+					where p.ID == 2
+					select new { p, ID = p.ID + 1 }
+				where p.ID == 3
+				select p.p.p);
+		}
+
+		[Test]
+		public void Test32()
+		{
+			ForEachProvider(db =>
+			{
+				var q =
+					from p in
+						from p in
+							from p in db.Person
+							where p.ID == 1
+							select new { p, ID = p.ID + 1 }
+						where p.ID == 2
+						select new { p, ID = p.ID + 1 }
+					where p.ID == 3
+					select new { p.p.p };
+
+				var list = q.ToList();
+
+				Assert.AreEqual(1, list.Count);
+
+				var person = list[0].p;
+
+				Assert.AreEqual(1,      person.ID);
+				Assert.AreEqual("John", person.FirstName);
+			});
+		}
+
+		[Test]
+		public void SubQuery1()
+		{
+			TestJohn(db =>
+			{
+				var id = 1;
+				var q  = from p in db.Person where p.ID == id select p;
+
+				return 
+					from p1 in db.Person
+					from p2 in q
+					where p1.ID == p2.ID
+					select new Person { ID = p1.ID, FirstName = p2.FirstName };
+			});
+		}
+
+		public void SubQuery2(ITestDataContext db)
+		{
+			var q1 = from p in db.Person where p.ID == 1 || p.ID == 2 select p;
+			var q2 = from p in db.Person where !(p.ID == 2) select p;
+
+			var q = 
+				from p1 in q1
+				from p2 in q2
+				where p1.ID == p2.ID
+				select new Person { ID = p1.ID, FirstName = p2.FirstName };
+
+			foreach (var person in q)
+			{
+				Assert.AreEqual(1,      person.ID);
+				Assert.AreEqual("John", person.FirstName);
+			}
+		}
+
+		[Test]
+		public void SubQuery2()
+		{
+			ForEachProvider(db =>
+			{
+				SubQuery2(db);
+				SubQuery2(db);
+			});
+		}
+
+		IQueryable<Person> GetPersonQuery(ITestDataContext db, int id)
+		{
+			return from p in db.Person where p.ID == id select new Person { ID = p.ID + 1, FirstName = p.FirstName };
+		}
+
+		[Test]
+		public void SubQuery3()
+		{
+			TestJohn(db =>
+			{
+				var q = GetPersonQuery(db, 1);
+
+				return
+					from p1 in db.Person
+					from p2 in q
+					where p1.ID == p2.ID - 1
+					select new Person { ID = p1.ID, FirstName = p2.FirstName };
+			});
+		}
+
+		[Test]
+		public void OneParam1()
+		{
+			TestJohn(db => db.Person.SelectMany(p => db.Person).Where(t => t.ID == 1).Select(t => t));
+		}
+
+		[Test]
+		public void OneParam2()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.SelectMany(p => p.Children).Where(t => t.ParentID == 1).Select(t => t),
+				db.Parent.SelectMany(p => p.Children).Where(t => t.ParentID == 1).Select(t => t)));
+		}
+
+        [Test]
+		public void OneParam3()
+		{
+			ForEachProvider(new[] { ProviderName.Access }, db => AreEqual(
+				   Child.SelectMany(p => p.Parent.GrandChildren).Where(t => t.ParentID == 1).Select(t => t),
+				db.Child.SelectMany(p => p.Parent.GrandChildren).Where(t => t.ParentID == 1).Select(t => t)));
+		}
+
+		[Test]
+		public void ScalarQuery()
+		{
+			TestJohn(db =>
+				from p1 in db.Person
+				from p2 in (from p in db.Person select p.ID)
+				where p1.ID == p2
+				select new Person { ID = p2, FirstName = p1.FirstName }
+			);
+		}
+
+		[Test]
+		public void SelectManyLeftJoin1()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				(from p in Parent
+				from c in p.Children.Select(o => new { o.ChildID, p.ParentID }).DefaultIfEmpty()
+				select new { p.Value1, o = c }).Count(),
+				(from p in db.Parent
+				from c in p.Children.Select(o => new { o.ChildID, p.ParentID }).DefaultIfEmpty()
+				select new { p.Value1, o = c }).AsEnumerable().Count()));
+		}
+
+		[Test]
+		public void SelectManyLeftJoin2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent
+				from ch in (from c in    Child where p.ParentID == c.ParentID select c).DefaultIfEmpty()
+				select ch,
+				from p in db.Parent
+				from ch in (from c in db.Child where p.ParentID == c.ParentID select c).DefaultIfEmpty()
+				select ch));
+		}
+
+        [Test]
+		public void SelectManyLeftJoin3()
+		{
+			ForEachProvider(new[] { ProviderName.Access }, db => AreEqual(
+				from p in Parent
+				from ch in Child.DefaultIfEmpty()
+				where p.ParentID == ch.ParentID
+				select ch,
+				from p in db.Parent
+				from ch in db.Child.DefaultIfEmpty()
+				where p.ParentID == ch.ParentID
+				select ch));
+		}
+
+		[Test]
+		public void SelectManyLeftJoin4()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				from ch in (from c in    Child where p.ParentID == c.ParentID select c).DefaultIfEmpty()
+				select new { p.ParentID, ch },
+				from p in db.Parent
+				from ch in (from c in db.Child where p.ParentID == c.ParentID select c).DefaultIfEmpty()
+				select new { p.ParentID, ch }));
+		}
+
+		[Test]
+		public void SelectManyLeftJoinCount()
+		{
+			var expected =
+				from p in Parent
+				from c in p.Children.Select(o => new { o.ChildID, p.ParentID }).DefaultIfEmpty()
+				select new { p.Value1, o = c };
+
+			ForEachProvider(db => Assert.AreEqual(expected.Count(),
+				(from p in db.Parent
+				from c in p.Children.Select(o => new { o.ChildID, p.ParentID }).DefaultIfEmpty()
+				select new { p.Value1, n = c.ChildID + 1, o = c }).Count()));
+		}
+
+		[Test]
+		public void TestJoin1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in 
+					from p in Parent
+					from g in p.GrandChildren
+					join c in Child on g.ChildID equals c.ChildID
+					join t in Types on c.ParentID equals t.ID
+					select c
+				join t in Person on p.ParentID equals t.ID
+				select p,
+				from p in 
+					from p in db.Parent
+					from g in p.GrandChildren
+					join c in db.Child on g.ChildID equals c.ChildID
+					join t in db.Types on c.ParentID equals t.ID
+					select c
+				join t in db.Person on p.ParentID equals t.ID
+				select p));
+		}
+
+        [Test]
+		public void Test3()
+		{
+			ForEachProvider(new[] { ProviderName.Access }, db => Assert.AreEqual(
+				(from p in Parent
+				 from g in p.GrandChildren
+				 from t in Person
+				 let c = g.Child
+				 select c).Count(),
+				(from p in db.Parent
+				 from g in p.GrandChildren
+				 from t in db.Person
+				 let c = g.Child
+				 select c).Count()));
+		}
+
+		[Test]
+		public void Test4()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				(from p in Parent
+				from g in p.GrandChildren
+				join c in db.Child on g.ChildID equals c.ChildID
+				join t in db.Types on c.ParentID equals t.ID
+				select c).Count(),
+				(from p in db.Parent
+				from g in p.GrandChildren
+				join c in db.Child on g.ChildID equals c.ChildID
+				join t in db.Types on c.ParentID equals t.ID
+				select c).Count()));
+		}
+
+        [Test]
+		public void Test5()
+		{
+			ForEachProvider(new[] { ProviderName.Access }, db =>
+			{
+				var q3 =
+					from p in db.Parent
+					from g in db.GrandChild
+					from c in db.Parent2
+					select g.Child;
+
+				q3.ToList();
+			});
+		}
+
+        [Test]
+		public void Test6()
+		{
+			ForEachProvider(new[] { ProviderName.Access }, db =>
+			{
+				var q3 =
+					from p in db.Parent
+					from g in db.GrandChild
+					from c in db.Parent2
+					let r = g.Child
+					select g.Child;
+
+				q3.ToList();
+			});
+		}
+
+        [Test]
+		public void Test7()
+		{
+			ForEachProvider(new[] { ProviderName.Access }, db => AreEqual(
+				from p in db.Parent
+				from g in p.GrandChildren
+				from c in db.Parent2
+				let r = g.Child
+				where p.ParentID == g.ParentID
+				select r,
+				from p in db.Parent
+				from g in p.GrandChildren
+				from c in db.Parent2
+				let r = g.Child
+				where p.ParentID == g.ParentID
+				select r));
+		}
+
+        [Test]
+		public void Test8()
+		{
+			ForEachProvider(new[] { ProviderName.Access }, db =>
+			{
+				var q2 =
+					from p in
+						from p in db.Parent
+						join c in db.GrandChild on p.ParentID equals c.ParentID
+						select p
+					from g in p.GrandChildren
+					from c in db.Parent2
+					let r = g.Child
+					where
+						p.ParentID == g.ParentID
+					select r;
+
+				q2.ToList();
+			});
+		}
+
+		[Test]
+		public void Test81()
+		{
+			ForEachProvider(db =>
+			{
+				var q2 =
+					from p in
+						from p in db.Parent
+						join c in db.GrandChild on p.ParentID equals c.ParentID
+						select p
+					from g in p.GrandChildren
+					//from c in db.Parent2
+					let r = g.Child
+					where
+						p.ParentID == g.ParentID
+					select r;
+
+				q2.ToList();
+			});
+		}
+
+        [Test]
+		public void Test9()
+		{
+			ForEachProvider(new[] { ProviderName.Access }, db =>
+			{
+				var q1 = db.Types.Where(_ => _.ID > 1).Where(_ => _.ID > 2);
+
+				var q2 =
+					from p in db.Parent
+					join c in db.GrandChild on p.ParentID equals c.ParentID
+					join t in q1            on c.ParentID equals t.ID
+					where p.ParentID == 1
+					select p;
+
+				q2 = q2.Distinct().OrderBy(_ => _.ParentID);
+
+				var q3 =
+					from p in q2
+					from g in p.GrandChildren
+					from c in db.Parent2
+					let r = g.Child
+					where
+						p.ParentID == g.ParentID && g.ParentID == c.ParentID
+					select r;
+
+				q3 = q3.Where(_ => _.ChildID == 1);
+
+				q3.ToList();
+			});
+		}
+
+        [Test]
+		public void Test91()
+		{
+			ForEachProvider(new[] { ProviderName.Access }, db =>
+			{
+				var q2 =
+					from p in db.Parent
+					join c in db.GrandChild on p.ParentID equals c.ParentID
+					where p.ParentID == 1
+					select p;
+
+				q2 = q2.Distinct();
+
+				var q3 =
+					from p in q2
+					from g in p.GrandChildren
+					let r = g.Child
+					where
+						p.ParentID == g.ParentID
+					select r;
+
+				q3.ToList();
+			});
+		}
+
+		/////[Test]
+		public void Test92()
+		{
+			ForEachProvider(db => AreEqual(
+				db.Parent
+					.SelectMany(c => c.Children, (c, p) => new { c, p, })
+					.Select(_ => new { _.c, p = new Child { ParentID = _.c.ParentID, ChildID = _.p.ChildID } })
+					.SelectMany(ch => ch.p.GrandChildren, (ch, t) => new { t, ch }),
+				db.Parent
+					.SelectMany(c => c.Children, (c, p) => new { c, p, })
+					.Select(_ => new { _.c, p = new Child { ParentID = _.c.ParentID, ChildID = _.p.ChildID } })
+					.SelectMany(ch => ch.p.GrandChildren, (ch, t) => new { t, ch })));
+		}
+
+		[Test]
+		public void DoubleConntectionTest()
+		{
+			ForEachProvider(db =>
+			{
+				var p1 = 1;
+				var p2 = 1;
+
+				var q1 = db.Parent
+					.GroupJoin(
+						db.Child,
+						x => new { x.ParentID },
+						y => new { y.ParentID },
+						(x,y) => new { Parent = x, Child = y })
+					.SelectMany(
+						y => y.Child.DefaultIfEmpty(),
+						(x,y) => new { x.Parent, Child = x.Child.FirstOrDefault() })
+					.Where(x => x.Parent.Value1 > p1 && x.Parent.ParentID > p2)
+					.OrderBy(x => x.Parent.Value1);
+
+				var q2 =
+					from x in db.Parent
+					join y in db.Child on new { x.ParentID } equals new { y.ParentID } into g
+					from y in g.DefaultIfEmpty()
+					where x.Value1 > p1 && x.ParentID > p2
+					orderby x.Value1
+					select new
+					{
+						x, y
+					};
+
+				var q3 = db.Parent
+					.GroupJoin(
+						db.Child,
+						x => new { x.ParentID },
+						y => new { y.ParentID },
+						(x,y) => new { Parent = x, Child = y })
+					.SelectMany(
+						y => y.Child.DefaultIfEmpty(),
+						(x,y) => new { x.Parent, Child = y })
+					.Where  (x => x.Parent.Value1 > p1 && x.Parent.ParentID > p2)
+					.OrderBy(x => x.Parent.Value1)
+					/*.Select (x => new
+					{
+						x.Parent,
+						x.Child
+					})*/;
+
+				var q4 =
+					from x in db.Parent
+					where x.Value1 > p1 && x.ParentID > p2
+					orderby x.Value1
+					select new
+					{
+						x, y = x.Children.FirstOrDefault()
+					};
+
+				foreach (var item in q1)
+				{
+				}
+			});
+		}
+
+		void Foo(Expression<Func<object[],object>> func)
+		{
+			/*
+				ParameterExpression ps;
+				Expression.Lambda<Func<object[],object>>(
+					Expression.Add(
+						Expression.Convert(
+							Expression.ArrayIndex(
+								ps = Expression.Parameter(typeof(object[]), "p"),
+								Expression.Constant(0, typeof(int))),
+							typeof(string)),
+						Expression.Convert(
+							Expression.Convert(
+								Expression.ArrayIndex(
+									ps,
+									Expression.Constant(1, typeof(int))),
+								typeof(int)),
+							typeof(object)),
+						(MethodInfo)methodof(string.Concat)),
+					new ParameterExpression[] { ps });
+			*/
+		}
+
+		Dictionary<string,string> _dic = new Dictionary<string,string>();
+
+		void Bar()
+		{
+			Foo(p => (string)p[0] + (int)p[1]);
+		}
+
+		//[Test]
+		public void Test___()
+		{
+			Bar();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/SelectScalar.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,218 @@
+using System;
+using System.Linq;
+
+using BLToolkit.Data.Linq;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class SelectScalar : TestBase
+	{
+		[Test]
+		public void Parameter1()
+		{
+			var p = 1;
+			ForEachProvider(db => Assert.AreEqual(p, db.Select(() => p)));
+		}
+
+		[Test]
+		public void Parameter2()
+		{
+			ForEachProvider(db =>
+			{
+				var p = 1;
+				Assert.AreEqual(p, db.Select(() => new { p }).p);
+			});
+		}
+
+		[Test]
+		public void Constant1()
+		{
+			ForEachProvider(db => Assert.AreEqual(1, db.Select(() => 1)));
+		}
+
+		[Test]
+		public void Constant2()
+		{
+			ForEachProvider(db => Assert.AreEqual(1, db.Select(() => new { p = 1 }).p));
+		}
+
+		[Test]
+		public void Constant3()
+		{
+			ForEachProvider(db => Assert.AreEqual(1, db.Select(() => new Person { ID = 1, FirstName = "John" }).ID));
+		}
+
+		[Test]
+		public void StrLen()
+		{
+			ForEachProvider(db => Assert.AreEqual("1".Length, db.Select(() => "1".Length)));
+		}
+
+		[Test]
+		public void IntMaxValue()
+		{
+			ForEachProvider(db => Assert.AreEqual(int.MaxValue, db.Select(() => int.MaxValue)));
+		}
+
+		[Test]
+		public void Substring()
+		{
+			const string s = "123";
+			ForEachProvider(db => Assert.AreEqual(s.Substring(1), db.Select(() => s.Substring(1))));
+		}
+
+		[Test]
+		public void Add()
+		{
+			const string s = "123";
+			ForEachProvider(db => Assert.AreEqual(s.Substring(1).Length + 3, db.Select(() => s.Substring(1).Length + 3)));
+		}
+
+		[Test]
+		public void Scalar1()
+		{
+			ForEachProvider(db =>
+			{
+				var q = (from p in db.Person select new { p } into p1 select p1.p).ToList().Where(p => p.ID == 1).First();
+				Assert.AreEqual(1, q.ID);
+			});
+		}
+
+		[Test]
+		public void Scalar11()
+		{
+			ForEachProvider(db =>
+			{
+				var n = (from p in db.Person select p.ID).ToList().Where(id => id == 1).First();
+				Assert.AreEqual(1, n);
+			});
+		}
+
+		[Test]
+		public void Scalar2()
+		{
+			ForEachProvider(db =>
+			{
+				var q = (from p in db.Person select new { p }).ToList().Where(p => p.p.ID == 1).First();
+				Assert.AreEqual(1, q.p.ID);
+			});
+		}
+
+		[Test]
+		public void Scalar21()
+		{
+			ForEachProvider(db =>
+			{
+				var n = (from p in db.Person select p.FirstName.Length).ToList().Where(len => len == 4).First();
+				Assert.AreEqual(4, n);
+			});
+		}
+
+		[Test]
+		public void Scalar22()
+		{
+			var expected =
+				from p in Person
+				select new { p1 = p, p2 = p }
+				into p1
+					where p1.p1.ID == 1 && p1.p2.ID == 1
+					select p1;
+
+			ForEachProvider(db =>
+			{
+				var result =
+					from p in db.Person
+					select new { p1 = p, p2 = p }
+					into p1
+						where p1.p1.ID == 1 && p1.p2.ID == 1
+						select p1;
+
+				Assert.IsTrue(result.ToList().SequenceEqual(expected));
+			});
+		}
+
+		[Test]
+		public void Scalar23()
+		{
+			var expected =
+				from p in Person
+				select p.ID
+				into p1
+					where p1 == 1
+					select new { p1 };
+
+			ForEachProvider(db =>
+			{
+				var result =
+					from p in db.Person
+					select p.ID
+					into p1
+						where p1 == 1
+						select new { p1 };
+
+				Assert.IsTrue(result.ToList().SequenceEqual(expected));
+			});
+		}
+
+		[Test]
+		public void Scalar3()
+		{
+			var expected = from p in Person where p.ID == 1 select 1;
+
+			ForEachProvider(db =>
+			{
+				var result = from p in db.Person where p.ID == 1 select 1;
+				Assert.IsTrue(result.ToList().SequenceEqual(expected));
+			});
+		}
+
+		[Test]
+		public void Scalar31()
+		{
+			var n = 1;
+			var expected = from p in Person where p.ID == 1 select n;
+
+			ForEachProvider(db =>
+			{
+				var result = from p in db.Person where p.ID == 1 select n;
+				Assert.IsTrue(result.ToList().SequenceEqual(expected));
+			});
+		}
+
+		[Test]
+		public void Scalar4()
+		{
+			var expected =
+				from p in Parent
+					join c in Child on p.ParentID equals c.ParentID
+				where c.ChildID > 20
+				select p;
+
+			ForEachProvider(db =>
+			{
+				var result =
+					from p in db.Parent
+						join c in db.Child on p.ParentID equals c.ParentID
+					where c.ChildID > 20
+					select p;
+
+				Assert.AreEqual(expected.Where(p => p.ParentID == 3).First(), result.Where(p => p.ParentID == 3).First());
+			});
+		}
+
+		[Test]
+		public void Function()
+		{
+			var text = "123";
+
+			ForEachProvider(db => Assert.AreEqual(
+				   Child.Select(c => string.Format("{0},{1}", c.ChildID, text)).FirstOrDefault(),
+				db.Child.Select(c => string.Format("{0},{1}", c.ChildID, text)).FirstOrDefault()));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/SelectTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,573 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Forms;
+
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+using BLToolkit.Reflection;
+using BLToolkit.Mapping;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class SelectTest : TestBase
+	{
+		[Test]
+		public void SimpleDirect()
+		{
+			TestJohn(db => db.Person);
+		}
+
+		[Test]
+		public void Simple()
+		{
+			TestJohn(db => from p in db.Person select p);
+		}
+
+		[Test]
+		public void SimpleDouble()
+		{
+			TestJohn(db => db.Person.Select(p => p).Select(p => p));
+		}
+
+		[Test]
+		public void New()
+		{
+			var expected = from p in Person select new { p.ID, p.FirstName };
+
+			ForEachProvider(db =>
+			{
+				var result = from p in db.Person select new { p.ID, p.FirstName };
+				Assert.IsTrue(result.ToList().SequenceEqual(expected));
+			});
+		}
+
+		void NewParam(IQueryable<Person> table, int i)
+		{
+			var expected = from p in Person select new { i, p.ID, p.FirstName };
+			var result   = from p in table  select new { i, p.ID, p.FirstName };
+
+			Assert.IsTrue(result.ToList().SequenceEqual(expected));
+		}
+
+		[Test]
+		public void NewParam()
+		{
+			ForEachProvider(db => { for (var i = 0; i < 5; i++) NewParam(db.Person, i); });
+		}
+
+		[Test]
+		public void InitObject()
+		{
+			TestJohn(db => from p in db.Person select new Person { ID = p.ID, FirstName = p.FirstName });
+		}
+
+		[Test]
+		public void NewObject()
+		{
+			TestJohn(db => from p in db.Person select new Person(p.ID, p.FirstName));
+		}
+
+		[Test]
+		public void NewInitObject()
+		{
+			TestJohn(db => from p in db.Person select new Person(p.ID) { FirstName = p.FirstName });
+		}
+
+		[Test]
+		public void NewWithExpr()
+		{
+			TestPerson(1, "John1", db => from p in db.Person select new Person(p.ID) { FirstName = (p.FirstName + "1\r\r\r").TrimEnd('\r') });
+		}
+
+		[Test]
+		public void MultipleSelect1()
+		{
+			TestJohn(db => db.Person
+				.Select(p => new { PersonID = p.ID, Name = p.FirstName })
+				.Select(p => new Person(p.PersonID) { FirstName = p.Name }));
+		}
+
+		[Test]
+		public void MultipleSelect2()
+		{
+			TestJohn(db => 
+				from p in db.Person
+				select new { PersonID = p.ID, Name = p.FirstName } into pp
+				select new Person(pp.PersonID) { FirstName = pp.Name });
+		}
+
+		[Test]
+		public void MultipleSelect3()
+		{
+			TestJohn(db => db.Person
+				.Select(p => new        { PersonID = p.ID,       Name      = p.FirstName })
+				.Select(p => new Person { ID       = p.PersonID, FirstName = p.Name      })
+				.Select(p => new        { PersonID = p.ID,       Name      = p.FirstName })
+				.Select(p => new Person { ID       = p.PersonID, FirstName = p.Name      }));
+		}
+
+		[Test]
+		public void MultipleSelect4()
+		{
+			TestJohn(db => db.Person
+				.Select(p1 => new        { p1 })
+				.Select(p2 => new        { p2 })
+				.Select(p3 => new Person { ID = p3.p2.p1.ID, FirstName = p3.p2.p1.FirstName }));
+		}
+
+		[Test]
+		public void MultipleSelect5()
+		{
+			TestJohn(db => db.Person
+				.Select(p1 => new        { p1 })
+				.Select(p2 => new Person { ID = p2.p1.ID, FirstName = p2.p1.FirstName })
+				.Select(p3 => new        { p3 })
+				.Select(p4 => new Person { ID = p4.p3.ID, FirstName = p4.p3.FirstName }));
+		}
+
+		[Test]
+		public void MultipleSelect6()
+		{
+			TestJohn(db => db.Person
+				.Select(p1 => new        { p1 })
+				.Select(p2 => new Person { ID = p2.p1.ID, FirstName = p2.p1.FirstName })
+				.Select(p3 => p3)
+				.Select(p4 => new Person { ID = p4.ID,    FirstName = p4.FirstName }));
+		}
+
+		[Test]
+		public void MultipleSelect7()
+		{
+			TestJohn(db => db.Person
+				.Select(p1 => new        { ID = p1.ID + 1, p1.FirstName })
+				.Select(p2 => new Person { ID = p2.ID - 1, FirstName = p2.FirstName }));
+		}
+
+		[Test]
+		public void MultipleSelect8()
+		{
+			ForEachProvider(db =>
+			{
+				var person = (
+
+					db.Person
+						.Select(p1 => new Person { ID = p1.ID * 2,           FirstName = p1.FirstName })
+						.Select(p2 => new        { ID = p2.ID / "22".Length, p2.FirstName })
+
+				).ToList().Where(p => p.ID == 1).First();
+				Assert.AreEqual(1,      person.ID);
+				Assert.AreEqual("John", person.FirstName);
+			});
+		}
+
+		[Test]
+		public void MultipleSelect9()
+		{
+			TestJohn(db => db.Person
+				.Select(p1 => new        { ID = p1.ID - 1, p1.FirstName })
+				.Select(p2 => new Person { ID = p2.ID + 1, FirstName = p2.FirstName })
+				.Select(p3 => p3)
+				.Select(p4 => new        { ID = p4.ID * "22".Length, p4.FirstName })
+				.Select(p5 => new Person { ID = p5.ID / 2, FirstName = p5.FirstName }));
+		}
+
+		[Test]
+		public void MultipleSelect10()
+		{
+			TestJohn(db => db.Person
+				.Select(p1 => new        { p1.ID, p1 })
+				.Select(p2 => new        { p2.ID, p2.p1, p2 })
+				.Select(p3 => new        { p3.ID, p3.p1.FirstName, p11 = p3.p2.p1, p3 })
+				.Select(p4 => new Person { ID = p4.p11.ID, FirstName = p4.p3.p1.FirstName }));
+		}
+
+		[Test]
+		public void MultipleSelect11([IncludeDataContexts("Sql2008", "Sql2012")] string context)
+		{
+			var dt = DateTime.Now;
+
+			using (var db = new TestDbManager(context))
+			{
+				var q =
+					from p in db.Parent
+					from  g1 in p.GrandChildren.DefaultIfEmpty()
+					let   c1 = g1.Child.ChildID
+					where c1 == 1
+					from  g2 in p.GrandChildren.DefaultIfEmpty()
+					let   c2 = g2.Child.ChildID
+					where c2 == 2
+					from  g3 in p.GrandChildren.DefaultIfEmpty()
+					let   c3 = g3.Child.ChildID
+					where c3 == 3
+					from  g4 in p.GrandChildren.DefaultIfEmpty()
+					let   c4 = g4.Child.ChildID
+					where c4 == 4
+					from  g5 in p.GrandChildren.DefaultIfEmpty()
+					let   c5 = g5.Child.ChildID
+					where c5 == 5
+					from  g6 in p.GrandChildren.DefaultIfEmpty()
+					let   c6 = g6.Child.ChildID
+					where c6 == 6
+					from  g7 in p.GrandChildren.DefaultIfEmpty()
+					let   c7 = g7.Child.ChildID
+					where c7 == 7
+					from  g8 in p.GrandChildren.DefaultIfEmpty()
+					let   c8 = g8.Child.ChildID
+					where c8 == 8
+					from  g9 in p.GrandChildren.DefaultIfEmpty()
+					let   c9 = g9.Child.ChildID
+					where c9 == 9
+					from  g10 in p.GrandChildren.DefaultIfEmpty()
+					let   c10 = g10.Child.ChildID
+					where c10 == 10
+					from  g11 in p.GrandChildren.DefaultIfEmpty()
+					let   c11 = g11.Child.ChildID
+					where c11 == 11
+					from  g12 in p.GrandChildren.DefaultIfEmpty()
+					let   c12 = g12.Child.ChildID
+					where c12 == 12
+					from  g13 in p.GrandChildren.DefaultIfEmpty()
+					let   c13 = g13.Child.ChildID
+					where c13 == 13
+					from  g14 in p.GrandChildren.DefaultIfEmpty()
+					let   c14 = g14.Child.ChildID
+					where c14 == 14
+					from  g15 in p.GrandChildren.DefaultIfEmpty()
+					let   c15 = g15.Child.ChildID
+					where c15 == 15
+					from  g16 in p.GrandChildren.DefaultIfEmpty()
+					let   c16 = g16.Child.ChildID
+					where c16 == 16
+					from  g17 in p.GrandChildren.DefaultIfEmpty()
+					let   c17 = g17.Child.ChildID
+					where c17 == 17
+					from  g18 in p.GrandChildren.DefaultIfEmpty()
+					let   c18 = g18.Child.ChildID
+					where c18 == 18
+					from  g19 in p.GrandChildren.DefaultIfEmpty()
+					let   c19 = g19.Child.ChildID
+					where c19 == 19
+					from  g20 in p.GrandChildren.DefaultIfEmpty()
+					let   c20 = g20.Child.ChildID
+					where c20 == 20
+					orderby c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16, c17, c18, c19, c20
+					select new
+					{
+						p,
+						cs = new [] { c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16, c17, c18, c19, c20 }
+					};
+
+				q.ToList();
+			}
+
+			Assert.IsTrue((DateTime.Now - dt).TotalSeconds < 30);
+		}
+
+		[Test]
+		public void MutiplySelect12([DataContexts(ExcludeLinqService = true)] string context)
+		{
+			using (var db = (TestDbManager)GetDataContext(context))
+			{
+				var q =
+					from grandChild in db.GrandChild
+					from child in db.Child
+					where grandChild.ChildID.HasValue
+					select grandChild;
+				q.ToList();
+
+				var selectCount = db.LastQuery.Split(' ', '\t', '\n', '\r').Count(s => s.Equals("select", StringComparison.InvariantCultureIgnoreCase));
+				Assert.AreEqual(1, selectCount, "Why do we need \"select from select\"??");
+			}
+		}
+
+		[Test]
+		public void Coalesce()
+		{
+			ForEachProvider(db =>
+			{
+				var q = (
+
+					from p in db.Person
+					where p.ID == 1
+					select new
+					{
+						p.ID,
+						FirstName  = p.FirstName  ?? "None",
+						MiddleName = p.MiddleName ?? "None"
+					}
+
+				).ToList().First();
+
+				Assert.AreEqual(1,      q.ID);
+				Assert.AreEqual("John", q.FirstName);
+				Assert.AreEqual("None", q.MiddleName);
+			});
+		}
+
+		[Test]
+		public void Coalesce2()
+		{
+			ForEachProvider(db =>
+			{
+				var q = (
+
+					from p in db.Person
+					where p.ID == 1
+					select new
+					{
+						p.ID,
+						FirstName  = p.MiddleName ?? p.FirstName  ?? "None",
+						LastName   = p.LastName   ?? p.FirstName  ?? "None",
+						MiddleName = p.MiddleName ?? p.MiddleName ?? "None"
+					}
+
+				).ToList().First();
+
+				Assert.AreEqual(1,        q.ID);
+				Assert.AreEqual("John",   q.FirstName);
+				Assert.AreEqual("Pupkin", q.LastName);
+				Assert.AreEqual("None",   q.MiddleName);
+			});
+		}
+
+		class MyMapSchema : MappingSchema
+		{
+			public override void InitNullValues()
+			{
+				base.InitNullValues();
+				DefaultStringNullValue = null;
+			}
+		}
+
+		static readonly MyMapSchema _myMapSchema = new MyMapSchema();
+
+		[Test]
+		public void Coalesce3()
+		{
+			ForEachProvider(db =>
+			{
+				if (db is DbManager)
+				{
+					((DbManager)db).MappingSchema = _myMapSchema;
+
+					var q = (
+
+						from p in db.Person
+						where p.ID == 1
+						select new
+						{
+							p.ID,
+							FirstName  = p.MiddleName ?? p.FirstName  ?? "None",
+							LastName   = p.LastName   ?? p.FirstName  ?? "None",
+							MiddleName = p.MiddleName ?? p.MiddleName ?? "None"
+						}
+
+					).ToList().First();
+
+					Assert.AreEqual(1,        q.ID);
+					Assert.AreEqual("John",   q.FirstName);
+					Assert.AreEqual("Pupkin", q.LastName);
+					Assert.AreEqual("None",   q.MiddleName);
+				}
+			});
+		}
+
+		[Test]
+		public void Coalesce4()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
+				from c in    Child
+				select Sql.AsSql((from ch in    Child where ch.ChildID == c.ChildID select ch.Parent.Value1).FirstOrDefault() ?? c.ChildID),
+				from c in db.Child
+				select Sql.AsSql((from ch in db.Child where ch.ChildID == c.ChildID select ch.Parent.Value1).FirstOrDefault() ?? c.ChildID)));
+		}
+
+		[Test]
+		public void Coalesce5()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
+				from p in    Parent select Sql.AsSql(p.Children.Max(c => (int?)c.ChildID) ?? p.Value1),
+				from p in db.Parent select Sql.AsSql(p.Children.Max(c => (int?)c.ChildID) ?? p.Value1)));
+		}
+
+		[Test]
+		public void Concatenation()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where p.ID == 1 select new { p.ID, FirstName  = "123" + p.FirstName + "456" };
+				var f = q.Where(p => p.FirstName == "123John456").ToList().First();
+				Assert.AreEqual(1, f.ID);
+			});
+		}
+
+		IEnumerable<int> GetList(int i)
+		{
+			yield return i;
+		}
+
+		[Test]
+		public void SelectEnumerable()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select new { Max = GetList(p.ParentID).Max() },
+				from p in db.Parent select new { Max = GetList(p.ParentID).Max() }));
+		}
+
+		[Test]
+		public void ConstractClass()
+		{
+			ForEachProvider(db =>
+				db.Parent.Select(f =>
+					new ListViewItem(new[] { "", f.ParentID.ToString(), f.Value1.ToString() })
+					{
+						Checked    = true,
+						ImageIndex = 0,
+						Tag        = f.ParentID
+					}).ToList());
+		}
+
+		static string ConvertString(string s, int? i, bool b, int n)
+		{
+			return s + "." + i + "." + b + "." + n;
+		}
+
+		[Test]
+		public void Index()
+		{
+			ForEachProvider(db =>
+			{
+				var q =
+					db.Child
+						.OrderByDescending(m => m.ChildID)
+						.Where(m => m.Parent != null && m.ParentID > 0);
+
+				var lines =
+					q.Select(
+						(m, i) =>
+							ConvertString(m.Parent.ParentID.ToString(), m.ChildID, i % 2 == 0, i)).ToArray();
+
+				Assert.AreEqual("7.77.True.0", lines[0]);
+
+				q =
+					db.Child
+						.OrderByDescending(m => m.ChildID)
+						.Where(m => m.Parent != null && m.ParentID > 0);
+
+				lines =
+					q.Select(
+						(m, i) =>
+							ConvertString(m.Parent.ParentID.ToString(), m.ChildID, i % 2 == 0, i)).ToArray();
+
+				Assert.AreEqual("7.77.True.0", lines[0]);
+			});
+		}
+
+		[Test]
+		public void InterfaceTest()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Parent2 select new { p.ParentID, p.Value1 };
+				q.ToList();
+			});
+		}
+
+		[Test]
+		public void ProjectionTest1()
+		{
+			ForEachProvider(db => AreEqual(
+				from c in    Child select new { c.ChildID, ID = 0, ID1 = c.ParentID2.ParentID2, c.ParentID2.Value1, ID2 = c.ParentID },
+				from c in db.Child select new { c.ChildID, ID = 0, ID1 = c.ParentID2.ParentID2, c.ParentID2.Value1, ID2 = c.ParentID }));
+		}
+
+		[TableName("Person")]
+		[ObjectFactory(typeof(Factory))]
+		public class TestPersonObject
+		{
+			public class Factory : IObjectFactory
+			{
+				#region IObjectFactory Members
+
+				public object CreateInstance(TypeAccessor typeAccessor, InitContext context)
+				{
+					if (context == null)
+						throw new Exception("InitContext is null while mapping from DataReader!");
+
+					return typeAccessor.CreateInstance();
+				}
+
+				#endregion
+			}
+
+			public int    PersonID;
+			public string FirstName;
+		}
+
+		[Test]
+		public void ObjectFactoryTest()
+		{
+			ForEachProvider(db => db.GetTable<TestPersonObject>().ToList());
+		}
+
+		[Test]
+		public void ProjectionTest2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Person select p.Patient,
+				from p in db.Person select p.Patient));
+		}
+
+		[Test]
+		public void EqualTest1()
+		{
+			ForEachProvider(db =>
+			{
+				var q = (from p in db.Parent select new { p1 = p, p2 = p }).First();
+				Assert.AreSame(q.p1, q.p2);
+			});
+		}
+
+		[Test]
+		public void SelectEnumOnClient()
+		{
+			ForEachProvider(context =>
+			{
+				var arr = new List<Person> { new Person() };
+				var p = context.Person.Select(person => new { person.ID, Arr = arr.Take(1) }).FirstOrDefault();
+
+				p.Arr.Single();
+			});
+		}
+
+		[TableName("Parent")]
+		public class TestParent
+		{
+			[MapField("ParentID")] public int  ParentID_;
+			[MapField("Value1")]   public int? Value1_;
+		}
+
+		[Test]
+		public void SelectField()
+		{
+			using (var db = new TestDbManager())
+			{
+				var q =
+					from p in db.GetTable<TestParent>()
+					select p.Value1_;
+
+				var sql = q.ToString();
+
+				Assert.That(sql.IndexOf("ParentID_"), Is.LessThan(0));
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/SelectTest.cs.orig	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,428 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Forms;
+using BLToolkit.DataAccess;
+using BLToolkit.Reflection;
+using NUnit.Framework;
+
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using BLToolkit.Mapping;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class SelectTest : TestBase
+	{
+		[Test]
+		public void SimpleDirect()
+		{
+			TestJohn(db => db.Person);
+		}
+
+		[Test]
+		public void Simple()
+		{
+			TestJohn(db => from p in db.Person select p);
+		}
+
+		[Test]
+		public void SimpleDouble()
+		{
+			TestJohn(db => db.Person.Select(p => p).Select(p => p));
+		}
+
+		[Test]
+		public void New()
+		{
+			var expected = from p in Person select new { p.ID, p.FirstName };
+
+			ForEachProvider(db =>
+			{
+				var result = from p in db.Person select new { p.ID, p.FirstName };
+				Assert.IsTrue(result.ToList().SequenceEqual(expected));
+			});
+		}
+
+		void NewParam(IQueryable<Person> table, int i)
+		{
+			var expected = from p in Person select new { i, p.ID, p.FirstName };
+			var result   = from p in table  select new { i, p.ID, p.FirstName };
+
+			Assert.IsTrue(result.ToList().SequenceEqual(expected));
+		}
+
+		[Test]
+		public void NewParam()
+		{
+			ForEachProvider(db => { for (int i = 0; i < 5; i++) NewParam(db.Person, i); });
+		}
+
+		[Test]
+		public void InitObject()
+		{
+			TestJohn(db => from p in db.Person select new Person { ID = p.ID, FirstName = p.FirstName });
+		}
+
+		[Test]
+		public void NewObject()
+		{
+			TestJohn(db => from p in db.Person select new Person(p.ID, p.FirstName));
+		}
+
+		[Test]
+		public void NewInitObject()
+		{
+			TestJohn(db => from p in db.Person select new Person(p.ID) { FirstName = p.FirstName });
+		}
+
+		[Test]
+		public void NewWithExpr()
+		{
+			TestPerson(1, "John1", db => from p in db.Person select new Person(p.ID) { FirstName = (p.FirstName + "1\r\r\r").TrimEnd('\r') });
+		}
+
+		[Test]
+		public void MultipleSelect1()
+		{
+			TestJohn(db => db.Person
+				.Select(p => new { PersonID = p.ID, Name = p.FirstName })
+				.Select(p => new Person(p.PersonID) { FirstName = p.Name }));
+		}
+
+		[Test]
+		public void MultipleSelect2()
+		{
+			TestJohn(db => 
+				from p in db.Person
+				select new { PersonID = p.ID, Name = p.FirstName } into pp
+				select new Person(pp.PersonID) { FirstName = pp.Name });
+		}
+
+		[Test]
+		public void MultipleSelect3()
+		{
+			TestJohn(db => db.Person
+				.Select(p => new        { PersonID = p.ID,       Name      = p.FirstName })
+				.Select(p => new Person { ID       = p.PersonID, FirstName = p.Name      })
+				.Select(p => new        { PersonID = p.ID,       Name      = p.FirstName })
+				.Select(p => new Person { ID       = p.PersonID, FirstName = p.Name      }));
+		}
+
+		[Test]
+		public void MultipleSelect4()
+		{
+			TestJohn(db => db.Person
+				.Select(p1 => new        { p1 })
+				.Select(p2 => new        { p2 })
+				.Select(p3 => new Person { ID = p3.p2.p1.ID, FirstName = p3.p2.p1.FirstName }));
+		}
+
+		[Test]
+		public void MultipleSelect5()
+		{
+			TestJohn(db => db.Person
+				.Select(p1 => new        { p1 })
+				.Select(p2 => new Person { ID = p2.p1.ID, FirstName = p2.p1.FirstName })
+				.Select(p3 => new        { p3 })
+				.Select(p4 => new Person { ID = p4.p3.ID, FirstName = p4.p3.FirstName }));
+		}
+
+		[Test]
+		public void MultipleSelect6()
+		{
+			TestJohn(db => db.Person
+				.Select(p1 => new        { p1 })
+				.Select(p2 => new Person { ID = p2.p1.ID, FirstName = p2.p1.FirstName })
+				.Select(p3 => p3)
+				.Select(p4 => new Person { ID = p4.ID,    FirstName = p4.FirstName }));
+		}
+
+		[Test]
+		public void MultipleSelect7()
+		{
+			TestJohn(db => db.Person
+				.Select(p1 => new        { ID = p1.ID + 1, p1.FirstName })
+				.Select(p2 => new Person { ID = p2.ID - 1, FirstName = p2.FirstName }));
+		}
+
+		[Test]
+		public void MultipleSelect8()
+		{
+			ForEachProvider(db =>
+			{
+				var person = (
+
+					db.Person
+						.Select(p1 => new Person { ID = p1.ID * 2,           FirstName = p1.FirstName })
+						.Select(p2 => new        { ID = p2.ID / "22".Length, p2.FirstName })
+
+				).ToList().Where(p => p.ID == 1).First();
+				Assert.AreEqual(1,      person.ID);
+				Assert.AreEqual("John", person.FirstName);
+			});
+		}
+
+		[Test]
+		public void MultipleSelect9()
+		{
+			TestJohn(db => db.Person
+				.Select(p1 => new        { ID = p1.ID - 1, p1.FirstName })
+				.Select(p2 => new Person { ID = p2.ID + 1, FirstName = p2.FirstName })
+				.Select(p3 => p3)
+				.Select(p4 => new        { ID = p4.ID * "22".Length, p4.FirstName })
+				.Select(p5 => new Person { ID = p5.ID / 2, FirstName = p5.FirstName }));
+		}
+
+		[Test]
+		public void MultipleSelect10()
+		{
+			TestJohn(db => db.Person
+				.Select(p1 => new        { p1.ID, p1 })
+				.Select(p2 => new        { p2.ID, p2.p1, p2 })
+				.Select(p3 => new        { p3.ID, p3.p1.FirstName, p11 = p3.p2.p1, p3 })
+				.Select(p4 => new Person { ID = p4.p11.ID, FirstName = p4.p3.p1.FirstName }));
+		}
+
+		[Test]
+		public void Coalesce()
+		{
+			ForEachProvider(db =>
+			{
+				var q = (
+
+					from p in db.Person
+					where p.ID == 1
+					select new
+					{
+						p.ID,
+						FirstName  = p.FirstName  ?? "None",
+						MiddleName = p.MiddleName ?? "None"
+					}
+
+				).ToList().First();
+
+				Assert.AreEqual(1,      q.ID);
+				Assert.AreEqual("John", q.FirstName);
+				Assert.AreEqual("None", q.MiddleName);
+			});
+		}
+
+		[Test]
+		public void Coalesce2()
+		{
+			ForEachProvider(db =>
+			{
+				var q = (
+
+					from p in db.Person
+					where p.ID == 1
+					select new
+					{
+						p.ID,
+						FirstName  = p.MiddleName ?? p.FirstName  ?? "None",
+						LastName   = p.LastName   ?? p.FirstName  ?? "None",
+						MiddleName = p.MiddleName ?? p.MiddleName ?? "None"
+					}
+
+				).ToList().First();
+
+				Assert.AreEqual(1,        q.ID);
+				Assert.AreEqual("John",   q.FirstName);
+				Assert.AreEqual("Pupkin", q.LastName);
+				Assert.AreEqual("None",   q.MiddleName);
+			});
+		}
+
+		class MyMapSchema : MappingSchema
+		{
+			public override void InitNullValues()
+			{
+				base.InitNullValues();
+				DefaultStringNullValue = null;
+			}
+		}
+
+		static readonly MyMapSchema _myMapSchema = new MyMapSchema();
+
+		[Test]
+		public void Coalesce3()
+		{
+			ForEachProvider(db =>
+			{
+				if (db is DbManager)
+				{
+					((DbManager)db).MappingSchema = _myMapSchema;
+
+					var q = (
+
+						from p in db.Person
+						where p.ID == 1
+						select new
+						{
+							p.ID,
+							FirstName  = p.MiddleName ?? p.FirstName  ?? "None",
+							LastName   = p.LastName   ?? p.FirstName  ?? "None",
+							MiddleName = p.MiddleName ?? p.MiddleName ?? "None"
+						}
+
+					).ToList().First();
+
+					Assert.AreEqual(1,        q.ID);
+					Assert.AreEqual("John",   q.FirstName);
+					Assert.AreEqual("Pupkin", q.LastName);
+					Assert.AreEqual("None",   q.MiddleName);
+				}
+			});
+		}
+
+		[Test]
+		public void Coalesce4()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
+				from c in    Child
+				select Sql.AsSql((from ch in    Child where ch.ChildID == c.ChildID select ch.Parent.Value1).FirstOrDefault() ?? c.ChildID),
+				from c in db.Child
+				select Sql.AsSql((from ch in db.Child where ch.ChildID == c.ChildID select ch.Parent.Value1).FirstOrDefault() ?? c.ChildID)));
+		}
+
+		[Test]
+		public void Coalesce5()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(
+				from p in    Parent select Sql.AsSql(p.Children.Max(c => (int?)c.ChildID) ?? p.Value1),
+				from p in db.Parent select Sql.AsSql(p.Children.Max(c => (int?)c.ChildID) ?? p.Value1)));
+		}
+
+		[Test]
+		public void Concatenation()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where p.ID == 1 select new { p.ID, FirstName  = "123" + p.FirstName + "456" };
+				var f = q.Where(p => p.FirstName == "123John456").ToList().First();
+				Assert.AreEqual(1, f.ID);
+			});
+		}
+
+		IEnumerable<int> GetList(int i)
+		{
+			yield return i;
+		}
+
+		[Test]
+		public void SelectEnumerable()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select new { Max = GetList(p.ParentID).Max() },
+				from p in db.Parent select new { Max = GetList(p.ParentID).Max() }));
+		}
+
+		[Test]
+		public void ConstractClass()
+		{
+			ForEachProvider(db =>
+				db.Parent.Select(f =>
+					new ListViewItem(new[] { "", f.ParentID.ToString(), f.Value1.ToString() })
+					{
+						Checked    = true,
+						ImageIndex = 0,
+						Tag        = f.ParentID
+					}).ToList());
+		}
+
+		static string ConvertString(string s, int? i, bool b, int n)
+		{
+			return s + "." + i + "." + b + "." + n;
+		}
+
+		[Test]
+		public void Index()
+		{
+			ForEachProvider(db =>
+			{
+				var q =
+					db.Child
+						.OrderByDescending(m => m.ChildID)
+						.Where(m => m.Parent != null && m.ParentID > 0);
+
+				var lines =
+					q.Select(
+						(m, i) =>
+							ConvertString(m.Parent.ParentID.ToString(), m.ChildID, i % 2 == 0, i)).ToArray();
+
+				Assert.AreEqual("7.77.True.0", lines[0]);
+			});
+		}
+
+		[Test]
+		public void InterfaceTest()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Parent2 select new { p.ParentID, p.Value1 };
+				q.ToList();
+			});
+		}
+
+		[Test]
+		public void ProjectionTest1()
+		{
+			ForEachProvider(db => AreEqual(
+				from c in    Child select new { c.ChildID, ID = 0, ID1 = c.ParentID2.ParentID2, c.ParentID2.Value1, ID2 = c.ParentID },
+				from c in db.Child select new { c.ChildID, ID = 0, ID1 = c.ParentID2.ParentID2, c.ParentID2.Value1, ID2 = c.ParentID }));
+		}
+
+<<<<<<< HEAD
+		[TableName("Person")]
+		[ObjectFactory(typeof(TestPersonObject.Factory))]
+		public class  TestPersonObject
+		{
+			public class  Factory : IObjectFactory
+			{
+				#region IObjectFactory Members
+
+				public object CreateInstance(TypeAccessor typeAccessor, InitContext context)
+				{
+					if (context == null)
+						throw new Exception("InitContext is null while mapping from DataReader!");
+
+					return typeAccessor.CreateInstance();
+				}
+
+				#endregion
+			}
+			public int    PersonID;
+			public string FirstName;
+		}
+
+		[Test]
+		public void ObjectFactoryTest()
+		{
+			ForEachProvider(db =>
+							db.GetTable<TestPersonObject>().ToList());
+=======
+		[Test]
+		public void ProjectionTest2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Person select p.Patient,
+				from p in db.Person select p.Patient));
+		}
+
+		[Test]
+		public void EqualTest1()
+		{
+			ForEachProvider(db =>
+			{
+				var q = (from p in db.Parent select new { p1 = p, p2 = p }).First();
+				Assert.AreSame(q.p1, q.p2);
+			});
+>>>>>>> 5ec55e61b6c00e47619c1399483bd531f161f93a
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/SetTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,579 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+
+using BLToolkit.Data.Linq;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class SetTest : TestBase
+	{
+		[Test]
+		public void Except1()
+		{
+			ForEachProvider(db => AreEqual(
+				   Child.Except(   Child.Where(p => p.ParentID == 3)),
+				db.Child.Except(db.Child.Where(p => p.ParentID == 3))));
+		}
+
+		//[Test]
+		public void Except2()
+		{
+			var ids = new[] { 1, 2 };
+
+			ForEachProvider(db => Assert.AreEqual(
+				   Child.Where(c => c.GrandChildren.Select(_ => _.ParentID ?? 0).Except(ids).Count() == 0),
+				db.Child.Where(c => c.GrandChildren.Select(_ => _.ParentID ?? 0).Except(ids).Count() == 0)));
+		}
+
+		[Test]
+		public void Intersect()
+		{
+			ForEachProvider(db => AreEqual(
+				   Child.Intersect(   Child.Where(p => p.ParentID == 3)),
+				db.Child.Intersect(db.Child.Where(p => p.ParentID == 3))));
+		}
+
+		[Test]
+		public void Any1()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.Where(p =>    Child.Where(c => c.ParentID == p.ParentID).Any(c => c.ParentID > 3)),
+				db.Parent.Where(p => db.Child.Where(c => c.ParentID == p.ParentID).Any(c => c.ParentID > 3))));
+		}
+
+		[Test]
+		public void Any2()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.Where(p =>    Child.Where(c => c.ParentID == p.ParentID).Any()),
+				db.Parent.Where(p => db.Child.Where(c => c.ParentID == p.ParentID).Any())));
+		}
+
+		[Test]
+		public void Any3()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.Where(p => p.Children.Any(c => c.ParentID > 3)),
+				db.Parent.Where(p => p.Children.Any(c => c.ParentID > 3))));
+		}
+
+		[Test]
+		public void Any31()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.Where(p => p.ParentID > 0 && p.Children.Any(c => c.ParentID > 0 && c.ParentID > 3)),
+				db.Parent.Where(p => p.ParentID > 0 && p.Children.Any(c => c.ParentID > 0 && c.ParentID > 3))));
+		}
+
+		[MethodExpression("SelectAnyExpression")]
+		static bool SelectAny(Parent p)
+		{
+			return p.Children.Any(c => c.ParentID > 0 && c.ParentID > 3);
+		}
+
+		static Expression<Func<Parent,bool>> SelectAnyExpression()
+		{
+			return p => p.Children.Any(c => c.ParentID > 0 && c.ParentID > 3);
+		}
+
+		[Test]
+		public void Any32()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.Where(p => p.ParentID > 0 && SelectAny(p)),
+				db.Parent.Where(p => p.ParentID > 0 && SelectAny(p))));
+		}
+
+		[Test]
+		public void Any4()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.Where(p => p.Children.Any()),
+				db.Parent.Where(p => p.Children.Any())));
+		}
+
+		[Test]
+		public void Any5()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.Where(p => p.Children.Any(c => c.GrandChildren.Any(g => g.ParentID > 3))),
+				db.Parent.Where(p => p.Children.Any(c => c.GrandChildren.Any(g => g.ParentID > 3)))));
+		}
+
+		[Test]
+		public void Any6()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				   Child.Any(c => c.ParentID > 3),
+				db.Child.Any(c => c.ParentID > 3)));
+		}
+
+		[Test]
+		public void Any61([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+				Assert.AreEqual(
+					            Child.   Any(c => c.ParentID > 3),
+					db.GetTable<Child>().Any(c => c.ParentID > 3));
+		}
+
+		[Test]
+		public void Any7()
+		{
+			ForEachProvider(db => Assert.AreEqual(Child.Any(), db.Child.Any()));
+		}
+
+		[Test]
+		public void Any8()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select    Child.Select(c => c.Parent).Any(c => c == p),
+				from p in db.Parent select db.Child.Select(c => c.Parent).Any(c => c == p)));
+		}
+
+		[Test]
+		public void Any9()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in 
+					from p in Parent
+					from g in p.GrandChildren
+					join c in Child on g.ChildID equals c.ChildID
+					select c
+				where !p.GrandChildren.Any(x => x.ParentID < 0)
+				select p,
+				from p in 
+					from p in db.Parent
+					from g in p.GrandChildren
+					join c in db.Child on g.ChildID equals c.ChildID
+					select c
+				where !p.GrandChildren.Any(x => x.ParentID < 0)
+				select p));
+		}
+
+		[Test]
+		public void Any10()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in 
+					from p in Parent
+					from g in p.GrandChildren
+					join c in Child on g.ChildID equals c.ChildID
+					select p
+				where !p.GrandChildren.Any(x => x.ParentID < 0)
+				select p,
+				from p in 
+					from p in db.Parent
+					from g in p.GrandChildren
+					join c in db.Child on g.ChildID equals c.ChildID
+					select p
+				where !p.GrandChildren.Any(x => x.ParentID < 0)
+				select p));
+		}
+
+		[Test]
+		public void Any11()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in 
+					from p in Parent
+					from g in p.GrandChildren
+					join c in Child on g.ChildID equals c.ChildID
+					join t in Types on c.ParentID equals t.ID
+					select c
+				where !p.GrandChildren.Any(x => x.ParentID < 0)
+				select p,
+				from p in 
+					from p in db.Parent
+					from g in p.GrandChildren
+					join c in db.Child on g.ChildID equals c.ChildID
+					join t in db.Types on c.ParentID equals t.ID
+					select c
+				where !p.GrandChildren.Any(x => x.ParentID < 0)
+				select p));
+		}
+
+		[Test]
+		public void Any12()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in             Parent    where             Child.   Any(c => p.ParentID == c.ParentID && c.ChildID > 3) select p,
+				from p in db.GetTable<Parent>() where db.GetTable<Child>().Any(c => p.ParentID == c.ParentID && c.ChildID > 3) select p));
+		}
+
+		[Test]
+		public void All1()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.Where(p =>    Child.Where(c => c.ParentID == p.ParentID).All(c => c.ParentID > 3)),
+				db.Parent.Where(p => db.Child.Where(c => c.ParentID == p.ParentID).All(c => c.ParentID > 3))));
+		}
+
+		[Test]
+		public void All2()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.Where(p => p.Children.All(c => c.ParentID > 3)),
+				db.Parent.Where(p => p.Children.All(c => c.ParentID > 3))));
+		}
+
+		[Test]
+		public void All3()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.Where(p => p.Children.All(c => c.GrandChildren.All(g => g.ParentID > 3))),
+				db.Parent.Where(p => p.Children.All(c => c.GrandChildren.All(g => g.ParentID > 3)))));
+		}
+
+		[Test]
+		public void All4()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				   Child.All(c => c.ParentID > 3),
+				db.Child.All(c => c.ParentID > 3)));
+		}
+
+		[Test]
+		public void All5()
+		{
+			int n = 3;
+
+			ForEachProvider(db => Assert.AreEqual(
+				   Child.All(c => c.ParentID > n),
+				db.Child.All(c => c.ParentID > n)));
+		}
+
+		[Test]
+		public void SubQueryAllAny()
+		{
+			ForEachProvider(db => AreEqual(
+				from c in    Parent
+				where    Child.Where(o => o.Parent == c).All(o =>    Child.Where(e => o == e).Any(e => e.ChildID > 10))
+				select c,
+				from c in db.Parent
+				where db.Child.Where(o => o.Parent == c).All(o => db.Child.Where(e => o == e).Any(e => e.ChildID > 10))
+				select c));
+		}
+
+		[Test]
+		public void AllNestedTest([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+				AreEqual(
+					from c in    Customer
+					where    Order.Where(o => o.Customer == c).All(o =>    Employee.Where(e => o.Employee == e).Any(e => e.FirstName.StartsWith("A")))
+					select c,
+					from c in db.Customer
+					where db.Order.Where(o => o.Customer == c).All(o => db.Employee.Where(e => o.Employee == e).Any(e => e.FirstName.StartsWith("A")))
+					select c);
+		}
+
+		[Test]
+		public void ComplexAllTest([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+				AreEqual(
+					from o in Order
+					where
+						Customer.Where(c => c == o.Customer).All(c => c.CompanyName.StartsWith("A")) ||
+						Employee.Where(e => e == o.Employee).All(e => e.FirstName.EndsWith("t"))
+					select o,
+					from o in db.Order
+					where
+						db.Customer.Where(c => c == o.Customer).All(c => c.CompanyName.StartsWith("A")) ||
+						db.Employee.Where(e => e == o.Employee).All(e => e.FirstName.EndsWith("t"))
+					select o);
+		}
+
+		[Test]
+		public void Contains1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select    Child.Select(c => c.Parent).Contains(p),
+				from p in db.Parent select db.Child.Select(c => c.Parent).Contains(p)));
+		}
+
+		[Test]
+		public void Contains2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select    Child.Select(c => c.ParentID).Contains(p.ParentID),
+				from p in db.Parent select db.Child.Select(c => c.ParentID).Contains(p.ParentID)));
+		}
+
+		[Test]
+		public void Contains201()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select    Child.Select(c => c.ParentID).Contains(p.ParentID - 1),
+				from p in db.Parent select db.Child.Select(c => c.ParentID).Contains(p.ParentID - 1)));
+		}
+
+		[Test]
+		public void Contains3()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where    Child.Select(c => c.Parent).Contains(p) select p,
+				from p in db.Parent where db.Child.Select(c => c.Parent).Contains(p) select p));
+		}
+
+		[Test]
+		public void Contains4()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where    Child.Select(c => c.ParentID).Contains(p.ParentID) select p,
+				from p in db.Parent where db.Child.Select(c => c.ParentID).Contains(p.ParentID) select p));
+		}
+
+		[Test]
+		public void Contains5()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where    Child.Select(c => c.ParentID).Contains(p.ParentID + 1) select p,
+				from p in db.Parent where db.Child.Select(c => c.ParentID).Contains(p.ParentID + 1) select p));
+		}
+
+		[Test]
+		public void Contains6()
+		{
+			var n = 1;
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where    Child.Select(c => c.ParentID).Contains(p.ParentID + n) select p,
+				from p in db.Parent where db.Child.Select(c => c.ParentID).Contains(p.ParentID + n) select p));
+		}
+
+		[Test]
+		public void Contains7()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				   Child.Select(c => c.ParentID).Contains(11),
+				db.Child.Select(c => c.ParentID).Contains(11)));
+		}
+
+		[Test]
+		public void Contains701()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				   Child.Select(c => c.Parent).Contains(new Parent { ParentID = 11, Value1 = 11}),
+				db.Child.Select(c => c.Parent).Contains(new Parent { ParentID = 11, Value1 = 11})));
+		}
+
+		[Test]
+		public void Contains8()
+		{
+			var arr = new[] { GrandChild.ElementAt(0), GrandChild.ElementAt(1) };
+
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				join ch in Child on p.ParentID equals ch.ParentID
+				join gc in GrandChild on ch.ChildID equals gc.ChildID
+				where arr.Contains(gc)
+				select p,
+				from p in db.Parent
+				join ch in db.Child on p.ParentID equals ch.ParentID
+				join gc in db.GrandChild on ch.ChildID equals gc.ChildID
+				where arr.Contains(gc)
+				select p));
+		}
+
+		[Test]
+		public void Contains801()
+		{
+			var arr = new[] { GrandChild.ElementAt(0), GrandChild.ElementAt(1) };
+
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				join ch in Child      on p.ParentID equals ch.ParentID
+				join gc in GrandChild on ch.ChildID equals gc.ChildID
+				select new GrandChild { ParentID = 2, ChildID = ch.ChildID, GrandChildID = gc.GrandChildID } into gc
+				where arr.Contains(gc)
+				select gc,
+				from p in db.Parent
+				join ch in db.Child      on p.ParentID equals ch.ParentID
+				join gc in db.GrandChild on ch.ChildID equals gc.ChildID
+				select new GrandChild { ParentID = 2, ChildID = ch.ChildID, GrandChildID = gc.GrandChildID } into gc
+				where arr.Contains(gc)
+				select gc));
+		}
+
+		[Test]
+		public void Contains802()
+		{
+			var arr = new[] { GrandChild.ElementAt(0), GrandChild.ElementAt(1) };
+
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				join ch in Child on p.ParentID equals ch.ParentID
+				join gc in GrandChild on ch.ChildID equals gc.ChildID
+				where arr.Contains(new GrandChild { ParentID = p.ParentID, ChildID = ch.ChildID, GrandChildID = gc.GrandChildID })
+				select p,
+				from p in db.Parent
+				join ch in db.Child on p.ParentID equals ch.ParentID
+				join gc in db.GrandChild on ch.ChildID equals gc.ChildID
+				where arr.Contains(new GrandChild { ParentID = p.ParentID, ChildID = ch.ChildID, GrandChildID = gc.GrandChildID })
+				select p));
+		}
+
+		[Test]
+		public void Contains803()
+		{
+			var arr = new[] { GrandChild.ElementAt(0), GrandChild.ElementAt(1) };
+
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				join ch in Child on p.ParentID equals ch.ParentID
+				join gc in GrandChild on ch.ChildID equals gc.ChildID
+				where arr.Contains(new GrandChild { ParentID = 1, ChildID = ch.ChildID, GrandChildID = gc.GrandChildID })
+				select p,
+				from p in db.Parent
+				join ch in db.Child on p.ParentID equals ch.ParentID
+				join gc in db.GrandChild on ch.ChildID equals gc.ChildID
+				where arr.Contains(new GrandChild { ParentID = 1, ChildID = ch.ChildID, GrandChildID = gc.GrandChildID })
+				select p));
+		}
+
+		[Test]
+		public void Contains9()
+		{
+			var arr = Parent1.Take(2).ToArray();
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent1 where arr.Contains(p) select p,
+				from p in db.Parent1 where arr.Contains(p) select p));
+		}
+
+		[Test]
+		public void Contains10([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+			{
+				var arr = new[]
+				{
+					new Northwind.Order { OrderID = 11000 },
+					new Northwind.Order { OrderID = 11001 },
+					new Northwind.Order { OrderID = 11002 }
+				};
+
+				var q =
+					from e in db.Employee
+					from o in e.Orders
+					where arr.Contains(o)
+					select new
+					{
+						e.FirstName,
+						o.OrderID,
+					};
+
+				q.ToList();
+			}
+		}
+
+		[Test]
+		public void Contains11([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+			{
+				var q =
+					from e in db.EmployeeTerritory
+					group e by e.Employee into g
+					where g.Key.EmployeeTerritories.Count() > 1
+					select new
+					{
+						g.Key.LastName,
+						cnt = g.Where(t => t.Employee.FirstName.Contains("an")).Count(),
+					};
+
+				q.ToList();
+			}
+		}
+
+		[Test]
+		public void Contains12([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+			{
+				var q =
+					from e in db.EmployeeTerritory
+					group e by e.Employee into g
+					where g.Key.EmployeeTerritories.Count() > 1 && g.Count() > 2
+					select new
+					{
+						g.Key.LastName,
+						//cnt = g.Where(t => t.Employee.FirstName.Contains("an")).Count(),
+					};
+
+				q.ToList();
+			}
+		}
+
+		[Test]
+		public void Contains13([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+			{
+				var arr = new[]
+				{
+					new Northwind.EmployeeTerritory { EmployeeID = 1, TerritoryID = "01581" },
+					new Northwind.EmployeeTerritory { EmployeeID = 1, TerritoryID = "02116" },
+					new Northwind.EmployeeTerritory { EmployeeID = 1, TerritoryID = "31406" }
+				};
+
+				var q =
+					from e in db.EmployeeTerritory
+					group e by e.EmployeeID into g
+					select new
+					{
+						g.Key,
+						cnt = g.Count(t => arr.Contains(t)),
+					};
+
+				q.ToList();
+			}
+		}
+
+		void TestContains(ITestDataContext db, Parent1 parent)
+		{
+			Assert.AreEqual(
+				   Parent1.Where(p => p.ParentID == 1).Contains(parent),
+				db.Parent1.Where(p => p.ParentID == 1).Contains(parent));
+		}
+
+		[Test]
+		public void Contains14()
+		{
+			var ps = Parent1.OrderBy(p => p.ParentID).Take(2).ToArray();
+
+			ForEachProvider(db => Array.ForEach(ps, p => TestContains(db, p)));
+		}
+
+		static void GetData(ITestDataContext db, IEnumerable<int?> d)
+		{
+			var r1 = db.GrandChild
+				.Where(x => d.Contains(x.ParentID))
+				.ToList();
+
+			foreach (var g in r1)
+			{
+				Assert.AreEqual(d.First().Value, g.ParentID);
+			}
+		}
+
+		[Test]
+		public void TestForGroupBy()
+		{
+			ForEachProvider(db =>
+			{
+				GetData(db, new List<int?> { 2 });
+				GetData(db, new List<int?> { 3 });
+			});
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/StringFunctions.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,788 @@
+using System;
+using System.Data.Linq.SqlClient;
+using System.Linq;
+
+using NUnit.Framework;
+
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class StringFunctions : TestBase
+	{
+		[Test]
+		public void Length()
+		{
+			ForEachProvider(db => 
+			{
+				var q = from p in db.Person where p.FirstName.Length == "John".Length && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void ContainsConstant()
+		{
+			ForEachProvider(db => 
+			{
+				var q = from p in db.Person where p.FirstName.Contains("oh") && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void ContainsConstant2()
+		{
+			ForEachProvider(db => 
+			{
+				var q = from p in db.Person where !p.FirstName.Contains("o%h") && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void ContainsConstant3([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				var arr = new[] { "oh", "oh'", "oh\\" };
+
+				var q = from p in db.Person where  arr.Contains(p.FirstName) select p;
+				Assert.AreEqual(0, q.Count());
+			}
+		}
+
+		[Test]
+		public void ContainsParameter1()
+		{
+			var str = "oh";
+
+			ForEachProvider(db => 
+			{
+				var q = from p in db.Person where p.FirstName.Contains(str) && p.ID == 1 select new { p, str };
+				var r = q.ToList().First();
+				Assert.AreEqual(1,   r.p.ID);
+				Assert.AreEqual(str, r.str);
+			});
+		}
+
+		[Test]
+		public void ContainsParameter2()
+		{
+			var str = "o%h";
+
+			ForEachProvider(db => 
+			{
+				var q = from p in db.Person where !p.FirstName.Contains(str) && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void ContainsParameter3()
+		{
+			var str = "o";
+
+			using (var db = new TestDbManager())
+			{
+				var q =
+					from d in db.Doctor
+					join p in db.Person.Where(p => p.FirstName.Contains(str))
+					on d.PersonID equals p.ID
+					select p;
+
+				Assert.AreEqual(1, q.ToList().First().ID);
+			}
+		}
+
+		[Test]
+		public void ContainsParameter4()
+		{
+			ForEachProvider(db =>
+				AreEqual(
+					from p in Person
+					select new
+					{
+						p,
+						Field1 = p.FirstName.Contains("Jo")
+					} into p
+					where p.Field1
+					orderby p.Field1
+					select p,
+					from p in db.Person
+					select new
+					{
+						p,
+						Field1 = p.FirstName.Contains("Jo")
+					} into p
+					where p.Field1
+					orderby p.Field1
+					select p));
+		}
+
+		[Test]
+		public void StartsWith1()
+		{
+			ForEachProvider(db => 
+			{
+				var q = from p in db.Person where p.FirstName.StartsWith("Jo") && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void StartsWith2()
+		{
+			ForEachProvider(
+				new[] { ProviderName.DB2, ProviderName.Access },
+				db => AreEqual(
+					from p in    Person where "John123".StartsWith(p.FirstName) select p,
+					from p in db.Person where "John123".StartsWith(p.FirstName) select p));
+		}
+
+		[Test]
+		public void StartsWith3()
+		{
+			var str = "John123";
+
+			ForEachProvider(
+				new[] { ProviderName.DB2, ProviderName.Access },
+				db => AreEqual(
+					from p in    Person where str.StartsWith(p.FirstName) select p,
+					from p in db.Person where str.StartsWith(p.FirstName) select p));
+		}
+
+		[Test]
+		public void StartsWith4()
+		{
+			ForEachProvider(
+				new[] { ProviderName.DB2, ProviderName.Access },
+				db => AreEqual(
+					from p1 in    Person
+					from p2 in    Person
+					where p1.ID == p2.ID && p1.FirstName.StartsWith(p2.FirstName)
+					select p1,
+					from p1 in db.Person
+					from p2 in db.Person
+					where p1.ID == p2.ID && 
+						Sql.Like(p1.FirstName, p2.FirstName.Replace("%", "~%"), '~')
+					select p1));
+		}
+
+		[Test]
+		public void StartsWith5()
+		{
+			ForEachProvider(
+				new[] { ProviderName.DB2, ProviderName.Access },
+				db => AreEqual(
+					from p1 in    Person
+					from p2 in    Person
+					where p1.ID == p2.ID && p1.FirstName.Replace("J", "%").StartsWith(p2.FirstName.Replace("J", "%"))
+					select p1,
+					from p1 in db.Person
+					from p2 in db.Person
+					where p1.ID == p2.ID && p1.FirstName.Replace("J", "%").StartsWith(p2.FirstName.Replace("J", "%"))
+					select p1));
+		}
+
+		[Test]
+		public void EndsWith()
+		{
+			ForEachProvider(db => 
+			{
+				var q = from p in db.Person where p.FirstName.EndsWith("hn") && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void Like11()
+		{
+			ForEachProvider(db => 
+			{
+				var q = from p in db.Person where SqlMethods.Like(p.FirstName, "%hn%") && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void Like12()
+		{
+			ForEachProvider(db => 
+			{
+				var q = from p in db.Person where !SqlMethods.Like(p.FirstName, @"%h~%n%", '~') && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void Like21()
+		{
+			ForEachProvider(db => 
+			{
+				var q = from p in db.Person where Sql.Like(p.FirstName, "%hn%") && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void Like22()
+		{
+			ForEachProvider(db => 
+			{
+				var q = from p in db.Person where !Sql.Like(p.FirstName, @"%h~%n%", '~') && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void IndexOf11()
+		{
+			ForEachProvider(new[] { ProviderName.Firebird, ProviderName.Informix }, db => 
+			{
+				var q = from p in db.Person where p.FirstName.IndexOf("oh") == 1 && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void IndexOf12()
+		{
+			ForEachProvider(new[] { ProviderName.Firebird, ProviderName.Informix }, db => 
+			{
+				var q = from p in db.Person where p.FirstName.IndexOf("") == 0 && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void IndexOf2()
+		{
+			ForEachProvider(new[] { ProviderName.Firebird, ProviderName.Informix }, db => 
+			{
+				var q = from p in db.Person where p.LastName.IndexOf("e", 2) == 4 && p.ID == 2 select p;
+				Assert.AreEqual(2, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void IndexOf3([DataContexts(
+			ProviderName.DB2, ProviderName.Firebird, ProviderName.Informix, ProviderName.SqlCe, ProviderName.Sybase, ProviderName.Access)] string context)
+		{
+			var s = "e";
+			var n1 = 2;
+			var n2 = 5;
+
+			using (var db = GetDataContext(context))
+			{
+				var q = from p in db.Person where p.LastName.IndexOf(s, n1, n2) == 1 && p.ID == 2 select p;
+				Assert.AreEqual(2, q.ToList().First().ID);
+			}
+		}
+
+		static readonly string[] _lastIndexExcludeList = new[]
+		{
+			ProviderName.DB2, ProviderName.Firebird, ProviderName.Informix, ProviderName.SqlCe, ProviderName.Access
+		};
+
+		[Test]
+		public void LastIndexOf1()
+		{
+			ForEachProvider(_lastIndexExcludeList, db =>
+			{
+				var q = from p in db.Person where p.LastName.LastIndexOf("p") == 2 && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void LastIndexOf2()
+		{
+			ForEachProvider(_lastIndexExcludeList, db => 
+			{
+				var q = from p in db.Person where p.ID == 1 select new { p.ID, FirstName = "123" + p.FirstName + "012345" };
+				q = q.Where(p => p.FirstName.LastIndexOf("123", 5) == 8);
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void LastIndexOf3()
+		{
+			ForEachProvider(_lastIndexExcludeList, db => 
+			{
+				var q = from p in db.Person where p.ID == 1 select new { p.ID, FirstName = "123" + p.FirstName + "0123451234" };
+				q = q.Where(p => p.FirstName.LastIndexOf("123", 5, 6) == 8);
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void CharIndex1()
+		{
+			ForEachProvider(new[] { ProviderName.Firebird, ProviderName.Informix }, db => 
+			{
+				var q = from p in db.Person where Sql.CharIndex("oh", p.FirstName) == 2 && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void CharIndex2()
+		{
+			ForEachProvider(new[] { ProviderName.Firebird, ProviderName.Informix }, db => 
+			{
+				var q = from p in db.Person where Sql.CharIndex("p", p.LastName, 2) == 3 && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void Left()
+		{
+			ForEachProvider(db => 
+			{
+				var q = from p in db.Person where Sql.Left(p.FirstName, 2) == "Jo" && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void Right()
+		{
+			ForEachProvider(db => 
+			{
+				var q = from p in db.Person where Sql.Right(p.FirstName, 3) == "ohn" && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void Substring1()
+		{
+			ForEachProvider(db => 
+			{
+				var q = from p in db.Person where p.FirstName.Substring(1) == "ohn" && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void Substring2()
+		{
+			ForEachProvider(db => 
+			{
+				var q = from p in db.Person where p.FirstName.Substring(1, 2) == "oh" && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void Reverse()
+		{
+			ForEachProvider(new[] { ProviderName.DB2, ProviderName.Informix, ProviderName.SqlCe, ProviderName.Access }, db =>
+			{
+				var q = from p in db.Person where Sql.Reverse(p.FirstName) == "nhoJ" && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void Stuff()
+		{
+			ForEachProvider(db => 
+			{
+				var q = from p in db.Person where Sql.Stuff(p.FirstName, 3, 1, "123") == "Jo123n" && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void Insert()
+		{
+			ForEachProvider(db => 
+			{
+				var q = from p in db.Person where p.FirstName.Insert(2, "123") == "Jo123hn" && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void Remove1()
+		{
+			ForEachProvider(db => 
+			{
+				var q = from p in db.Person where p.FirstName.Remove(2) == "Jo" && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void Remove2()
+		{
+			ForEachProvider(db => 
+			{
+				var q = from p in db.Person where p.FirstName.Remove(1, 2) == "Jn" && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void Space()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where p.FirstName + Sql.Space(p.ID + 1) + "123" == "John  123" && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void PadRight()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where Sql.PadRight(p.FirstName, 6, ' ') + "123" == "John  123" && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void PadRight1()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where p.FirstName.PadRight(6) + "123" == "John  123" && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void PadRight2()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where p.FirstName.PadRight(6, '*') + "123" == "John**123" && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void PadLeft()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where "123" + Sql.PadLeft(p.FirstName, 6, ' ') == "123  John" && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void PadLeft1()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where "123" + p.FirstName.PadLeft(6) == "123  John" && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void PadLeft2()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where "123" + p.FirstName.PadLeft(6, '*') == "123**John" && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+        [Test]
+		public void Replace()
+		{
+			ForEachProvider(new[] { ProviderName.Access }, db =>
+			{
+				var q = from p in db.Person where p.FirstName.Replace("hn", "lie") == "Jolie" && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void Trim()
+		{
+			ForEachProvider(db =>
+			{
+				var q = 
+					from p in db.Person where p.ID == 1 select new { p.ID, Name = "  " + p.FirstName + " " } into pp
+					where pp.Name.Trim() == "John" select pp;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void TrimLeft()
+		{
+			ForEachProvider(db =>
+			{
+				var q = 
+					from p in db.Person where p.ID == 1 select new { p.ID, Name = "  " + p.FirstName + " " } into pp
+					where pp.Name.TrimStart() == "John " select pp;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void TrimRight()
+		{
+			ForEachProvider(db =>
+			{
+				var q = 
+					from p in db.Person where p.ID == 1 select new { p.ID, Name = "  " + p.FirstName + " " } into pp
+					where pp.Name.TrimEnd() == "  John" select pp;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void ToLower()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where p.FirstName.ToLower() == "john" && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void ToUpper()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where p.FirstName.ToUpper() == "JOHN" && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void CompareTo()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where p.FirstName.CompareTo("John") == 0 && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void CompareToNotEqual1()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where p.FirstName.CompareTo("Jo") != 0 && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void CompareToNotEqual2()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where 0 != p.FirstName.CompareTo("Jo") && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void CompareTo1()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where p.FirstName.CompareTo("Joh") > 0 && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void CompareTo2()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where p.FirstName.CompareTo("Johnn") < 0 && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void CompareTo21()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where p.FirstName.CompareTo("Johnn") <= 0 && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void CompareTo22()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where 0 >= p.FirstName.CompareTo("Johnn") && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void CompareTo3()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where p.FirstName.CompareTo(55) > 0 && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void CompareTo31()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where p.FirstName.CompareTo(55) >= 0 && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void CompareTo32()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where 0 <= p.FirstName.CompareTo(55) && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void CompareOrdinal1()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where string.CompareOrdinal(p.FirstName, "Joh") > 0 && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void CompareOrdinal2()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where string.CompareOrdinal(p.FirstName, 1, "Joh", 1, 2) == 0 && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void Compare1()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where string.Compare(p.FirstName, "Joh") > 0 && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void Compare2()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where string.Compare(p.FirstName, "joh", true) > 0 && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void Compare3()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where string.Compare(p.FirstName, 1, "Joh", 1, 2) == 0 && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void Compare4()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where string.Compare(p.FirstName, 1, "Joh", 1, 2, true) == 0 && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void IsNullOrEmpty1()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where !string.IsNullOrEmpty(p.FirstName) && p.ID == 1 select p;
+				Assert.AreEqual(1, q.ToList().First().ID);
+			});
+		}
+
+		[Test]
+		public void IsNullOrEmpty2()
+		{
+			ForEachProvider(db =>
+			{
+				var q = from p in db.Person where p.ID == 1 select string.IsNullOrEmpty(p.FirstName);
+				Assert.AreEqual(false, q.ToList().First());
+			});
+		}
+
+		//[Test]
+		public void Test()
+		{
+			using (var db = new TestDbManager(ProviderName.Firebird))
+			{
+				var p = db
+					.SetCommand(@"
+						SELECT
+							t1.ParentID,
+							t1.Value1
+						FROM
+							Parent t1
+								LEFT JOIN (
+									SELECT
+										t3.ParentID as ParentID1,
+										Coalesce(t3.ParentID, 1) as c1
+									FROM
+										Child t3
+								) t2 ON t1.ParentID = t2.ParentID1
+						WHERE
+							t2.c1 IS NULL")
+					.ExecuteList<Parent>();
+
+				var p1 = p.First();
+				Assert.AreEqual(1, p1.ParentID);
+
+
+				var da = new SqlQuery();
+				var pr  = (Person)da.SelectByKey(typeof(Person), 1);
+
+				Assert.AreEqual("Pupkin", pr.LastName);
+
+
+				//Assert.AreEqual(1, p.ID);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/SubQuery.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,616 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using BLToolkit.Data.DataProvider;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class SubQuery : TestBase
+	{
+		[Test]
+		public void Test1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				where p.ParentID != 5
+				select (from ch in Child where ch.ParentID == p.ParentID select ch.ChildID).Max(),
+				from p in db.Parent
+				where p.ParentID != 5
+				select (from ch in db.Child where ch.ParentID == p.ParentID select ch.ChildID).Max()));
+		}
+
+		[Test]
+		public void Test2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				where p.ParentID != 5
+				select (from ch in Child where ch.ParentID == p.ParentID && ch.ChildID > 1 select ch.ChildID).Max(),
+				from p in db.Parent
+				where p.ParentID != 5
+				select (from ch in db.Child where ch.ParentID == p.ParentID && ch.ChildID > 1 select ch.ChildID).Max()));
+		}
+
+		[Test]
+		public void Test3()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				where p.ParentID != 5
+				select (from ch in Child where ch.ParentID == p.ParentID && ch.ChildID == ch.ParentID * 10 + 1 select ch.ChildID).SingleOrDefault(),
+				from p in db.Parent
+				where p.ParentID != 5
+				select (from ch in db.Child where ch.ParentID == p.ParentID && ch.ChildID == ch.ParentID * 10 + 1 select ch.ChildID).SingleOrDefault()));
+		}
+
+		[Test]
+		public void Test4()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				where p.ParentID != 5
+				select (from ch in Child where ch.ParentID == p.ParentID && ch.ChildID == ch.ParentID * 10 + 1 select ch.ChildID).FirstOrDefault(),
+				from p in db.Parent
+				where p.ParentID != 5
+				select (from ch in db.Child where ch.ParentID == p.ParentID && ch.ChildID == ch.ParentID * 10 + 1 select ch.ChildID).FirstOrDefault()));
+		}
+
+		static int _testValue = 3;
+
+		[Test]
+		public void Test5()
+		{
+			IEnumerable<int> ids = new[] { 1, 2 };
+
+			var eids = Parent
+				.Where(p => ids.Contains(p.ParentID))
+				.Select(p => p.Value1 == null ? p.ParentID : p.ParentID + 1)
+				.Distinct();
+
+			var expected = eids.Select(id =>
+				new 
+				{
+					id,
+					Count1 = Child.Where(p => p.ParentID == id).Count(),
+					Count2 = Child.Where(p => p.ParentID == id && p.ParentID == _testValue).Count(),
+				});
+
+			ForEachProvider(db =>
+			{
+				var rids   = db.Parent
+					.Where(p => ids.Contains(p.ParentID))
+					.Select(p => p.Value1 == null ? p.ParentID : p.ParentID + 1)
+					.Distinct();
+
+				var result = rids.Select(id =>
+					new
+					{
+						id,
+						Count1 = db.Child.Where(p => p.ParentID == id).Count(),
+						Count2 = db.Child.Where(p => p.ParentID == id && p.ParentID == _testValue).Count(),
+					});
+
+				AreEqual(expected, result);
+			});
+		}
+
+		[Test]
+		public void Test6()
+		{
+			var id = 2;
+			var b  = false;
+
+			var q = Child.Where(c => c.ParentID == id).OrderBy(c => c.ChildID);
+			q = b
+				? q.OrderBy(m => m.ParentID)
+				: q.OrderByDescending(m => m.ParentID);
+
+			var gc = GrandChild;
+			var expected = q.Select(c => new
+			{
+				ID     = c.ChildID,
+				c.ParentID,
+				Sum    = gc.Where(g => g.ChildID == c.ChildID && g.GrandChildID > 0).Sum(g => (int)g.ChildID * g.GrandChildID),
+				Count1 = gc.Count(g => g.ChildID == c.ChildID && g.GrandChildID > 0)
+			});
+
+			ForEachProvider(db =>
+			{
+				var r = db.Child.Where(c => c.ParentID == id).OrderBy(c => c.ChildID);
+				r = b
+					? r.OrderBy(m => m.ParentID)
+					: r.OrderByDescending(m => m.ParentID);
+
+				var rgc = db.GrandChild;
+				var result = r.Select(c => new
+				{
+					ID     = c.ChildID,
+					c.ParentID,
+					Sum    = rgc.Where(g => g.ChildID == c.ChildID && g.GrandChildID > 0).Sum(g => (int)g.ChildID * g.GrandChildID),
+					Count1 = rgc.Count(g => g.ChildID == c.ChildID && g.GrandChildID > 0),
+				});
+
+				AreEqual(expected, result);
+			});
+		}
+
+		[Test]
+		public void Test7()
+		{
+			ForEachProvider(db => AreEqual(
+				from c in    Child select new { Count =    GrandChild.Where(g => g.ChildID == c.ChildID).Count(), },
+				from c in db.Child select new { Count = db.GrandChild.Where(g => g.ChildID == c.ChildID).Count(), }));
+		}
+
+		[Test]
+		public void Test8()
+		{
+			ForEachProvider(db =>
+			{
+				var parent  =
+					from p in db.Parent
+					where p.ParentID == 1
+					select p.ParentID;
+
+				var chilren =
+					from c in db.Child
+					where parent.Contains(c.ParentID)
+					select c;
+
+				var chs1 = chilren.ToList();
+
+				parent  =
+					from p in db.Parent
+					where p.ParentID == 2
+					select p.ParentID;
+
+				chilren =
+					from c in db.Child
+					where parent.Contains(c.ParentID)
+					select c;
+
+				var chs2 = chilren.ToList();
+
+				Assert.AreEqual(chs2.Count, chs2.Except(chs1).Count());
+			});
+		}
+
+        [Test]
+		public void ObjectCompare()
+		{
+			ForEachProvider(new[] { ProviderName.Access }, db => AreEqual(
+				from p in Parent
+				from c in
+					from c in
+						from c in Child select new Child { ParentID = c.ParentID, ChildID = c.ChildID + 1, Parent = c.Parent }
+					where c.ChildID > 0
+					select c
+				where p == c.Parent
+				select new { p.ParentID, c.ChildID },
+				from p in db.Parent
+				from c in
+					from c in
+						from c in db.Child select new Child { ParentID = c.ParentID, ChildID = c.ChildID + 1, Parent = c.Parent }
+					where c.ChildID > 0
+					select c
+				where p == c.Parent
+				select new { p.ParentID, c.ChildID }));
+		}
+
+		[Test]
+		public void Contains1()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Informix, ProviderName.MySql, ProviderName.Sybase },
+				db => AreEqual(
+					from p in Parent
+					where (from p1 in    Parent where p1.Value1 == p.Value1 select p.ParentID).Take(3).Contains(p.ParentID)
+					select p,
+					from p in db.Parent
+					where (from p1 in db.Parent where p1.Value1 == p.Value1 select p.ParentID).Take(3).Contains(p.ParentID)
+					select p));
+		}
+
+		[Test]
+		public void Contains2()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Informix, ProviderName.MySql, ProviderName.Sybase },
+				db => AreEqual(
+					from p in Parent
+					where (from p1 in    Parent where p1.Value1 == p.Value1 select p1.ParentID).Take(3).Contains(p.ParentID)
+					select p,
+					from p in db.Parent
+					where (from p1 in db.Parent where p1.Value1 == p.Value1 select p1.ParentID).Take(3).Contains(p.ParentID)
+					select p));
+		}
+
+		[Test]
+		public void SubSub1()
+		{
+			ForEachProvider(
+				new[] { ProviderName.SqlCe, ProviderName.Access, ProviderName.DB2, "Oracle", ProviderName.MySql, ProviderName.Sybase },
+				db => AreEqual(
+					from p1 in
+						from p2 in Parent
+						select new { p2, ID = p2.ParentID + 1 }
+					where p1.ID > 0
+					select new
+					{
+						Count =
+						(
+							from c in p1.p2.Children
+							select new { c, ID = c.ParentID + 1 } into c
+							where c.ID < p1.ID
+							select c
+						).Count()
+					},
+					from p1 in
+						from p2 in db.Parent
+						select new { p2, ID = p2.ParentID + 1 }
+					where p1.ID > 0
+					select new
+					{
+						Count =
+						(
+							from c in p1.p2.Children
+							select new { c, ID = c.ParentID + 1 } into c
+							where c.ID < p1.ID
+							select c
+						).Count()
+					}));
+		}
+
+		[Test]
+		public void SubSub2()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Access, ProviderName.DB2, "Oracle", "DevartOracle", "Sql2000", ProviderName.MySql, ProviderName.Sybase, ProviderName.Informix },
+				db => AreEqual(
+					from p1 in
+						from p2 in Parent
+						select new { p2, ID = p2.ParentID + 1 } into p3
+						where p3.ID > 0
+						select new { p2 = p3, ID = p3.ID + 1 }
+					where p1.ID > 0
+					select new
+					{
+						Count =
+						(
+							from c in p1.p2.p2.Children
+							select new { c, ID = c.ParentID + 1 } into c
+							where c.ID < p1.ID
+							select c.c.ParentID + 1 into c
+							where c < p1.ID
+							select c
+						).FirstOrDefault()
+					},
+					from p1 in
+						from p2 in db.Parent
+						select new { p2, ID = p2.ParentID + 1 } into p3
+						where p3.ID > 0
+						select new { p2 = p3, ID = p3.ID + 1 }
+					where p1.ID > 0
+					select new
+					{
+						Count =
+						(
+							from c in p1.p2.p2.Children
+							select new { c, ID = c.ParentID + 1 } into c
+							where c.ID < p1.ID
+							select c.c.ParentID + 1 into c
+							where c < p1.ID
+							select c
+						).FirstOrDefault()
+					}));
+		}
+
+		//[Test]
+		public void SubSub201()
+		{
+			ForEachProvider(
+				//new[] { ProviderName.SqlCe, ProviderName.Access, ProviderName.DB2, "Oracle", ProviderName.MySql, ProviderName.Sybase },
+				db => AreEqual(
+					from p1 in
+						from p2 in Parent
+						select new { p2, ID = p2.ParentID + 1 } into p3
+						where p3.ID > 0
+						select new { p2 = p3, ID = p3.ID + 1 }
+					where p1.ID > 0
+					select new
+					{
+						Count =
+						(
+							from c in p1.p2.p2.Children
+							select new { c, ID = c.ParentID + 1 } into c
+							where c.ID < p1.ID
+							select new { c.c, ID = c.c.ParentID + 1 } into c
+							where c.ID < p1.ID
+							select c
+						).FirstOrDefault()
+					},
+					from p1 in
+						from p2 in db.Parent
+						select new { p2, ID = p2.ParentID + 1 } into p3
+						where p3.ID > 0
+						select new { p2 = p3, ID = p3.ID + 1 }
+					where p1.ID > 0
+					select new
+					{
+						Count =
+						(
+							from c in p1.p2.p2.Children
+							select new { c, ID = c.ParentID + 1 } into c
+							where c.ID < p1.ID
+							select new { c.c, ID = c.c.ParentID + 1 } into c
+							where c.ID < p1.ID
+							select c
+						).FirstOrDefault()
+					}));
+		}
+
+		[Test]
+		public void SubSub21()
+		{
+			ForEachProvider(
+				new[] { ProviderName.SqlCe, ProviderName.DB2, "Oracle", ProviderName.MySql, ProviderName.Sybase, ProviderName.Access },
+				db => AreEqual(
+				from p1 in
+					from p2 in Parent
+					select new { p2, ID = p2.ParentID + 1 } into p3
+					where p3.ID > 0
+					select new { p2 = p3, ID = p3.ID + 1 }
+				where p1.ID > 0
+				select new
+				{
+					Count =
+					(
+						from c in p1.p2.p2.Children
+						select new { c, ID = c.ParentID + 1 } into c
+						where c.ID < p1.ID
+						select new { c.c, ID = c.c.ParentID + 1 } into c
+						where c.ID < p1.ID
+						select c
+					).Count()
+				},
+				from p1 in
+					from p2 in db.Parent
+					select new { p2, ID = p2.ParentID + 1 } into p3
+					where p3.ID > 0
+					select new { p2 = p3, ID = p3.ID + 1 }
+				where p1.ID > 0
+				select new
+				{
+					Count =
+					(
+						from c in p1.p2.p2.Children
+						select new { c, ID = c.ParentID + 1 } into c
+						where c.ID < p1.ID
+						select new { c.c, ID = c.c.ParentID + 1 } into c
+						where c.ID < p1.ID
+						select c
+					).Count()
+				}));
+		}
+
+		[Test]
+		public void SubSub211()
+		{
+			ForEachProvider(
+				new[] { ProviderName.SqlCe, ProviderName.Access, ProviderName.DB2, "Oracle", ProviderName.MySql, ProviderName.Sybase },
+				db => AreEqual(
+					from p1 in
+						from p2 in Parent
+						select new { p2, ID = p2.ParentID + 1 } into p3
+						where p3.ID > 0
+						select new { p2 = p3, ID = p3.ID + 1 }
+					where p1.ID > 0
+					select new
+					{
+						Count =
+						(
+							from c in p1.p2.p2.Children
+							from g in c.GrandChildren
+							select new { g, ID = g.ParentID + 1 } into c
+							where c.ID < p1.ID
+							select new { c.g, ID = c.g.ParentID + 1 } into c
+							where c.ID < p1.ID
+							select c
+						).Count()
+					},
+					from p1 in
+						from p2 in db.Parent
+						select new { p2, ID = p2.ParentID + 1 } into p3
+						where p3.ID > 0
+						select new { p2 = p3, ID = p3.ID + 1 }
+					where p1.ID > 0
+					select new
+					{
+						Count =
+						(
+							from c in p1.p2.p2.Children
+							from g in c.GrandChildren
+							select new { g, ID = g.ParentID + 1 } into c
+							where c.ID < p1.ID
+							select new { c.g, ID = c.g.ParentID + 1 } into c
+							where c.ID < p1.ID
+							select c
+						).Count()
+					}));
+		}
+
+		[Test]
+		public void SubSub212()
+		{
+			ForEachProvider(
+				new[] { ProviderName.SqlCe, ProviderName.Access, ProviderName.DB2, "Oracle", ProviderName.MySql, ProviderName.Sybase },
+				db => AreEqual(
+					from p1 in
+						from p2 in Child
+						select new { p2, ID = p2.ParentID + 1 } into p3
+						where p3.ID > 0
+						select new { p2 = p3, ID = p3.ID + 1 }
+					where p1.ID > 0
+					select new
+					{
+						Count =
+						(
+							from c in p1.p2.p2.Parent.GrandChildren
+							select new { c, ID = c.ParentID + 1 } into c
+							where c.ID < p1.ID
+							select new { c.c, ID = c.c.ParentID + 1 } into c
+							where c.ID < p1.ID
+							select c
+						).Count()
+					},
+					from p1 in
+						from p2 in db.Child
+						select new { p2, ID = p2.ParentID + 1 } into p3
+						where p3.ID > 0
+						select new { p2 = p3, ID = p3.ID + 1 }
+					where p1.ID > 0
+					select new
+					{
+						Count =
+						(
+							from c in p1.p2.p2.Parent.GrandChildren
+							select new { c, ID = c.ParentID + 1 } into c
+							where c.ID < p1.ID
+							select new { c.c, ID = c.c.ParentID + 1 } into c
+							where c.ID < p1.ID
+							select c
+						).Count()
+					}));
+		}
+
+		[Test]
+		public void SubSub22()
+		{
+			ForEachProvider(
+				new[] { ProviderName.SqlCe, ProviderName.Access, ProviderName.DB2, "Oracle", ProviderName.MySql, ProviderName.Sybase },
+				db => AreEqual(
+					from p1 in
+						from p2 in Parent
+						select new { p2, ID = p2.ParentID + 1 } into p3
+						where p3.ID > 0
+						select new { p2 = p3, ID = p3.ID + 1 }
+					where p1.ID > 0
+					select new
+					{
+						Count =
+						(
+							from c in Child
+							where p1.p2.p2.ParentID == c.ParentID
+							select new { c, ID = c.ParentID + 1 } into c
+							where c.ID < p1.ID
+							select new { c.c, ID = c.c.ParentID + 1 } into c
+							where c.ID < p1.ID
+							select c
+						).Count()
+					},
+					from p1 in
+						from p2 in db.Parent
+						select new { p2, ID = p2.ParentID + 1 } into p3
+						where p3.ID > 0
+						select new { p2 = p3, ID = p3.ID + 1 }
+					where p1.ID > 0
+					select new
+					{
+						Count =
+						(
+							from c in db.Child
+							where p1.p2.p2.ParentID == c.ParentID
+							select new { c, ID = c.ParentID + 1 } into c
+							where c.ID < p1.ID
+							select new { c.c, ID = c.c.ParentID + 1 } into c
+							where c.ID < p1.ID
+							select c
+						).Count()
+					}));
+		}
+
+		[Test]
+		public void Count1()
+		{
+			ForEachProvider(
+				new[] { ProviderName.SqlCe },
+				db => AreEqual(
+					from p in
+						from p in Parent
+						select new
+						{
+							p.ParentID,
+							Sum = p.Children.Where(t => t.ParentID > 0).Sum(t => t.ParentID) / 2,
+						}
+					where p.Sum > 1
+					select p,
+					from p in
+						from p in db.Parent
+						select new
+						{
+							p.ParentID,
+							Sum = p.Children.Where(t => t.ParentID > 0).Sum(t => t.ParentID) / 2,
+						}
+					where p.Sum > 1
+					select p));
+		}
+
+		[Test]
+		public void Count2()
+		{
+			ForEachProvider(
+				new[] { ProviderName.SqlCe },
+				db => AreEqual(
+					from p in
+						from p in Parent
+						select new Parent
+						{
+							ParentID = p.ParentID,
+							Value1   = p.Children.Where(t => t.ParentID > 0).Sum(t => t.ParentID) / 2,
+						}
+					where p.Value1 > 1
+					select p,
+					from p in
+						from p in db.Parent
+						select new Parent
+						{
+							ParentID = p.ParentID,
+							Value1   = p.Children.Where(t => t.ParentID > 0).Sum(t => t.ParentID) / 2,
+						}
+					where p.Value1 > 1
+					select p));
+		}
+
+		[Test]
+		public void Count3()
+		{
+			ForEachProvider(
+				new[] { ProviderName.SqlCe },
+				db => AreEqual(
+					from p in
+						from p in Parent
+						select new
+						{
+							p.ParentID,
+							Sum = p.Children.Sum(t => t.ParentID) / 2,
+						}
+					where p.Sum > 1
+					select p,
+					from p in
+						from p in db.Parent
+						select new
+						{
+							p.ParentID,
+							Sum = p.Children.Sum(t => t.ParentID) / 2,
+						}
+					where p.Sum > 1
+					select p));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/TableFunctionTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,141 @@
+using System;
+using System.Linq;
+
+using BLToolkit.Data;
+using BLToolkit.Data.Linq;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class TableFunctionTest : TestBase
+	{
+		[Test]
+		public void Func1([IncludeDataContexts("Sql2008", "Sql2012")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				var q =
+					from p in new Model.Functions(db).GetParentByID(1)
+					select p;
+
+				q.ToList();
+			}
+		}
+
+		[Test]
+		public void Func2([IncludeDataContexts("Sql2008", "Sql2012")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				var q =
+					from c in db.Child
+					from p in db.GetParentByID(2)
+					select p;
+
+				q.ToList();
+			}
+		}
+
+		[Test]
+		public void Func3([IncludeDataContexts("Sql2008", "Sql2012")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				var q =
+					from c in db.Child
+					from p in db.GetParentByID(c.ParentID)
+					select p;
+
+				q.ToList();
+			}
+		}
+
+		readonly Func<DbManager,int,IQueryable<Parent>> _f1 = CompiledQuery.Compile(
+			(DbManager db, int id) => from p in new Model.Functions(db).GetParentByID(id) select p);
+
+		[Test]
+		public void CompiledFunc1([IncludeDataContexts("Sql2008", "Sql2012")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				var q = _f1(db, 1);
+				q.ToList();
+			}
+		}
+
+		readonly Func<TestDbManager,int,IQueryable<Parent>> _f2 = CompiledQuery.Compile(
+			(TestDbManager db, int id) => from c in db.Child from p in db.GetParentByID(id) select p);
+
+		[Test]
+		public void CompiledFunc2([IncludeDataContexts("Sql2008", "Sql2012")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				var q = _f2(db, 1);
+				q.ToList();
+			}
+		}
+
+		[Test]
+		public void WithTabLock([IncludeDataContexts("Sql2008", "Sql2012")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				var q =
+					from p in new Model.Functions(db).WithTabLock<Parent>()
+					select p;
+
+				q.ToList();
+			}
+		}
+
+		[Test, Category("FULLTEXT")]
+		public void FreeText1([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+			{
+				var q =
+					from c in db.Category
+					join t in db.FreeTextTable<Northwind.Category,int>("[Description]", "sweetest candy bread and dry meat")
+					on c.CategoryID equals t.Key
+					select c;
+
+				q.ToList();
+			}
+		}
+
+		[Test, Category("FULLTEXT")]
+		public void FreeText2([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+			{
+				var q =
+					from c in db.Category
+					join t in db.FreeTextTable<Northwind.Category,int>(c => c.Description, "sweetest candy bread and dry meat")
+					on c.CategoryID equals t.Key
+					select c;
+
+				q.ToList();
+			}
+		}
+
+		[Test, Category("FULLTEXT")]
+		public void FreeText3([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+			{
+				var q =
+					from t in db.FreeTextTable<Northwind.Category,int>(c => c.Description, "sweetest candy bread and dry meat")
+					join c in db.Category
+					on t.Key equals c.CategoryID
+					select c;
+
+				q.ToList();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/TakeSkipTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,324 @@
+using System;
+using System.Linq;
+
+using NUnit.Framework;
+
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class TakeSkipTest : TestBase
+	{
+		[Test]
+		public void Take1()
+		{
+			ForEachProvider(db =>
+			{
+				for (var i = 2; i <= 3; i++)
+					Assert.AreEqual(i, (from ch in db.Child select ch).Take(i).ToList().Count);
+			});
+		}
+
+		static void TakeParam(ITestDataContext db, int n)
+		{
+			Assert.AreEqual(n, (from ch in db.Child select ch).Take(n).ToList().Count);
+		}
+
+		[Test]
+		public void Take2()
+		{
+			ForEachProvider(db => TakeParam(db, 1));
+		}
+
+		[Test]
+		public void Take3()
+		{
+			ForEachProvider(db =>
+				Assert.AreEqual(3, (from ch in db.Child where ch.ChildID > 3 || ch.ChildID < 4 select ch).Take(3).ToList().Count));
+		}
+
+		[Test]
+		public void Take4()
+		{
+			ForEachProvider(db =>
+				Assert.AreEqual(3, (from ch in db.Child where ch.ChildID >= 0 && ch.ChildID <= 100 select ch).Take(3).ToList().Count));
+		}
+
+		[Test]
+		public void Take5()
+		{
+			ForEachProvider(db => Assert.AreEqual(3, db.Child.Take(3).ToList().Count));
+		}
+
+		[Test]
+		public void Take6()
+		{
+			var expected = Child.OrderBy(c => c.ChildID).Take(3);
+
+			ForEachProvider(db =>
+			{
+				var result = db.Child.OrderBy(c => c.ChildID).Take(3);
+				Assert.IsTrue(result.ToList().SequenceEqual(expected));
+			});
+		}
+
+		[Test]
+		public void Take7()
+		{
+			ForEachProvider(db => Assert.AreEqual(3, db.Child.Take(() => 3).ToList().Count));
+		}
+
+		[Test]
+		public void Take8()
+		{
+			var n = 3;
+			ForEachProvider(db => Assert.AreEqual(3, db.Child.Take(() => n).ToList().Count));
+		}
+
+		[Test]
+		public void TakeCount()
+		{
+			ForEachProvider(new[] { ProviderName.Sybase }, db => Assert.AreEqual(
+				   Child.Take(5).Count(),
+				db.Child.Take(5).Count()));
+		}
+
+		[Test]
+		public void Skip1()
+		{
+			ForEachProvider(db => AreEqual(Child.Skip(3), db.Child.Skip(3)));
+		}
+
+		[Test]
+		public void Skip2()
+		{
+			var expected = (from ch in Child where ch.ChildID > 3 || ch.ChildID < 4 select ch).Skip(3);
+			ForEachProvider(db => AreEqual(expected, (from ch in db.Child where ch.ChildID > 3 || ch.ChildID < 4 select ch).Skip(3)));
+		}
+
+		[Test]
+		public void Skip3()
+		{
+			var expected = (from ch in Child where ch.ChildID >= 0 && ch.ChildID <= 100 select ch).Skip(3);
+			ForEachProvider(db => AreEqual(expected, (from ch in db.Child where ch.ChildID >= 0 && ch.ChildID <= 100 select ch).Skip(3)));
+		}
+
+		[Test]
+		public void Skip4()
+		{
+			var expected = Child.OrderByDescending(c => c.ChildID).Skip(3);
+
+			ForEachProvider(db =>
+			{
+				var result = db.Child.OrderByDescending(c => c.ChildID).Skip(3);
+				Assert.IsTrue(result.ToList().SequenceEqual(expected));
+			});
+		}
+
+		[Test]
+		public void Skip5()
+		{
+			var expected = Child.OrderByDescending(c => c.ChildID).ThenBy(c => c.ParentID + 1).Skip(3);
+			ForEachProvider(db => AreEqual(expected, db.Child.OrderByDescending(c => c.ChildID).ThenBy(c => c.ParentID + 1).Skip(3)));
+		}
+
+		[Test]
+		public void Skip6()
+		{
+			ForEachProvider(db => AreEqual(Child.Skip(3), db.Child.Skip(() => 3)));
+		}
+
+		[Test]
+		public void Skip7()
+		{
+			var n = 3;
+			ForEachProvider(db => AreEqual(Child.Skip(n), db.Child.Skip(() => n)));
+		}
+
+		[Test]
+		public void SkipCount()
+		{
+			ForEachProvider(new[] { "Sql2000", ProviderName.Sybase, ProviderName.SQLite, ProviderName.Access }, db => Assert.AreEqual(
+				   Child.Skip(2).Count(),
+				db.Child.Skip(2).Count()));
+		}
+
+		[Test]
+		public void SkipTake1()
+		{
+			var expected = Child.OrderByDescending(c => c.ChildID).Skip(2).Take(5);
+			ForEachProvider(db =>
+			{
+				var result = db.Child.OrderByDescending(c => c.ChildID).Skip(2).Take(5);
+				Assert.IsTrue(result.ToList().SequenceEqual(expected));
+			});
+		}
+
+		[Test]
+		public void SkipTake2()
+		{
+			var expected = Child.OrderByDescending(c => c.ChildID).Take(7).Skip(2);
+			ForEachProvider(db =>
+			{
+				var result = db.Child.OrderByDescending(c => c.ChildID).Take(7).Skip(2);
+				Assert.IsTrue(result.ToList().SequenceEqual(expected));
+			});
+		}
+
+		[Test]
+		public void SkipTake3()
+		{
+			var expected = Child.OrderBy(c => c.ChildID).Skip(1).Take(7).Skip(2);
+			ForEachProvider(db =>
+			{
+				var result = db.Child.OrderBy(c => c.ChildID).Skip(1).Take(7).Skip(2);
+				Assert.IsTrue(result.ToList().SequenceEqual(expected));
+			});
+		}
+
+		[Test]
+		public void SkipTake4()
+		{
+			var expected = Child.OrderByDescending(c => c.ChildID).Skip(1).Take(7).OrderBy(c => c.ChildID).Skip(2);
+			ForEachProvider(new[] { "Sql2000", ProviderName.SQLite, ProviderName.Sybase, ProviderName.Access }, db =>
+			{
+				var result = db.Child.OrderByDescending(c => c.ChildID).Skip(1).Take(7).OrderBy(c => c.ChildID).Skip(2);
+				Assert.IsTrue(result.ToList().SequenceEqual(expected));
+			});
+		}
+
+		[Test]
+		public void SkipTake5()
+		{
+			ForEachProvider(db =>
+			{
+				var list = db.Child.Skip(2).Take(5).ToList();
+				Assert.AreEqual(5, list.Count);
+			});
+		}
+
+		void SkipTake6(ITestDataContext db, bool doSkip)
+		{
+			var q1 = from g in db.GrandChild select g;
+
+			if (doSkip)
+				q1 = q1.Skip(12);
+			q1 = q1.Take(3);
+
+			var q2 =
+				from c in db.Child
+				from p in q1
+				where c.ParentID == p.ParentID
+				select c;
+
+			var q3 = from g in GrandChild select g;
+
+			if (doSkip)
+				q3 = q3.Skip(12);
+			q3 = q3.Take(3);
+
+			var q4 =
+				from c in Child
+				from p in q3
+				where c.ParentID == p.ParentID
+				select c;
+
+			AreEqual(q4, q2);
+		}
+
+		[Test]
+		public void SkipTake6()
+		{
+			ForEachProvider(
+				new[] { "Sql2000", ProviderName.SqlCe, ProviderName.SQLite, ProviderName.Access, ProviderName.Sybase },
+				db =>
+				{
+					SkipTake6(db, false);
+					SkipTake6(db, true);
+				});
+		}
+
+		[Test]
+		public void SkipTakeCount()
+		{
+			ForEachProvider(new[] { "Sql2000", ProviderName.SqlCe, ProviderName.Sybase, ProviderName.SQLite, ProviderName.Access }, db => Assert.AreEqual(
+				   Child.Skip(2).Take(5).Count(),
+				db.Child.Skip(2).Take(5).Count()));
+		}
+
+		[Test]
+		public void SkipFirst()
+		{
+			var expected = (from p in Parent where p.ParentID > 1 select p).Skip(1).First();
+
+			ForEachProvider(db =>
+			{
+				var result = from p in db.GetTable<Parent>() select p;
+				result = from p in result where p.ParentID > 1 select p;
+				var b = result.Skip(1).First();
+
+				Assert.AreEqual(expected, b);
+			});
+		}
+
+		[Test]
+		public void ElementAt1([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+				Assert.AreEqual(
+					(from p in    Parent where p.ParentID > 1 select p).ElementAt(3),
+					(from p in db.Parent where p.ParentID > 1 select p).ElementAt(3));
+		}
+
+		[Test]
+		public void ElementAt2()
+		{
+			var n = 3;
+			ForEachProvider(db => Assert.AreEqual(
+				(from p in    Parent where p.ParentID > 1 select p).ElementAt(n),
+				(from p in db.Parent where p.ParentID > 1 select p).ElementAt(() => n)));
+		}
+
+		[Test]
+		public void ElementAtDefault1()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				(from p in    Parent where p.ParentID > 1 select p).ElementAtOrDefault(3),
+				(from p in db.Parent where p.ParentID > 1 select p).ElementAtOrDefault(3)));
+		}
+
+		[Test]
+		public void ElementAtDefault2()
+		{
+			ForEachProvider(db => Assert.IsNull((from p in db.Parent where p.ParentID > 1 select p).ElementAtOrDefault(300000)));
+		}
+
+		[Test]
+		public void ElementAtDefault3()
+		{
+			var n = 3;
+			ForEachProvider(db => Assert.AreEqual(
+				(from p in    Parent where p.ParentID > 1 select p).ElementAtOrDefault(n),
+				(from p in db.Parent where p.ParentID > 1 select p).ElementAtOrDefault(() => n)));
+		}
+
+		[Test]
+		public void ElementAtDefault4()
+		{
+			var n = 300000;
+			ForEachProvider(db => Assert.IsNull((from p in db.Parent where p.ParentID > 1 select p).ElementAtOrDefault(() => n)));
+		}
+
+		[Test]
+		public void ElementAtDefault5()
+		{
+			ForEachProvider(db => Assert.AreEqual(
+				   Person.ElementAtOrDefault(3),
+				db.Person.ElementAtOrDefault(3)));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/TestAK107.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,188 @@
+using System;
+
+using BLToolkit.Data.Linq;
+using BLToolkit.Data.Sql.SqlProvider;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	[TestFixture, Category("Oracle")]
+	public class TestAK107 : TestBase
+	{
+		[TableName(Name = "t_test_user")]
+		public sealed class User
+		{
+			[PrimaryKey, Identity]
+			[SequenceName("sq_test_user")]
+			[MapField("user_id")]
+			public long Id { get; set; }
+
+			[NotNull, NonUpdatable(OnInsert = false)]
+			[MapField("name")]
+			public string Name { get; set; }
+		}
+
+		[TableName(Name = "t_test_user_contract")]
+		public sealed class Contract
+		{
+			[PrimaryKey, Identity]
+			[SequenceName("sq_test_user_contract")]
+			[MapField("user_contract_id")]
+			public long Id { get; set; }
+
+			[NotNull, NonUpdatable(OnInsert = false)]
+			[MapField("user_id")]
+			public long UserId { get; set; }
+
+			[Association(ThisKey = "UserId", OtherKey = "Id", CanBeNull = false)]
+			public User User { get; set; }
+
+			[NotNull, NonUpdatable(OnInsert = false)]
+			[MapField("contract_no")]
+			public long ContractNo { get; set; }
+
+			[NotNull]
+			[MapField("name")]
+			public string Name { get; set; }
+		}
+
+		[Test]
+		public void UserInsert([IncludeDataContexts("Oracle")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				db.BeginTransaction();
+				db.Insert(new User { Name = "user" });
+			}
+		}
+
+		[Test]
+		public void UserInsertWithIdentity([IncludeDataContexts("Oracle")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				db.BeginTransaction();
+				db.InsertWithIdentity(new User { Name = "user" });
+			}
+		}
+
+		[Test]
+		public void UserLinqInsert([IncludeDataContexts("Oracle")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				db.BeginTransaction();
+				db.GetTable<User>().Insert(() => new User { Name = "user" });
+			}
+		}
+
+		[Test]
+		public void UserLinqInsertWithIdentity([IncludeDataContexts("Oracle")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				db.BeginTransaction();
+				db.GetTable<User>().InsertWithIdentity(() => new User { Name = "user" });
+			}
+		}
+
+		[Test]
+		public void ContractInsert([IncludeDataContexts("Oracle")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				db.BeginTransaction();
+
+				var user = new User { Name = "user" };
+				user.Id = Convert.ToInt64(db.InsertWithIdentity(user));
+
+				db.Insert(new Contract { UserId = user.Id, ContractNo = 1, Name = "contract1" });
+			}
+		}
+
+		[Test]
+		public void ContractInsertWithIdentity([IncludeDataContexts("Oracle")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				db.BeginTransaction();
+
+				var user = new User { Name = "user" };
+				user.Id = Convert.ToInt64(db.InsertWithIdentity(user));
+
+				db.InsertWithIdentity(new Contract { UserId = user.Id, ContractNo = 1, Name = "contract" });
+			}
+		}
+
+		[SqlExpression("sq_test_user_contract.nextval")]
+		static long ContractSequence { get; set;  }
+
+		[Test]
+		public void ContractLinqInsert([IncludeDataContexts("Oracle")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				db.BeginTransaction();
+
+				var user = new User { Name = "user" };
+				user.Id = Convert.ToInt64(db.InsertWithIdentity(user));
+
+				db.GetTable<Contract>().Insert(() => new Contract
+				{
+					Id         = ContractSequence,
+					UserId     = user.Id,
+					ContractNo = 1,
+					Name       = "contract"
+				});
+			}
+		}
+
+		[Test]
+		public void ContractLinqInsertWithIdentity([IncludeDataContexts("Oracle")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				db.BeginTransaction();
+
+				var user = new User { Name = "user" };
+				user.Id = Convert.ToInt64(db.InsertWithIdentity(user));
+
+				db.GetTable<Contract>().InsertWithIdentity(() => new Contract { UserId = user.Id, ContractNo = 1, Name = "contract" });
+			}
+		}
+
+		[Test]
+		public void ContractLinqManyInsert([IncludeDataContexts("Oracle")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				db.BeginTransaction();
+
+				var user = new User { Name = "user" };
+				user.Id = Convert.ToInt64(db.InsertWithIdentity(user));
+
+				db.GetTable<User>().Insert(db.GetTable<Contract>(), x => new Contract { UserId = x.Id, ContractNo = 1, Name = "contract" });
+			}
+		}
+
+		//[Test]
+		public void ContractLinqManyInsertWithIdentity([IncludeDataContexts("Oracle")] string context)
+		{
+			using (var db = new TestDbManager(context))
+			{
+				db.BeginTransaction();
+
+				var user = new User { Name = "user" };
+				user.Id = Convert.ToInt64(db.InsertWithIdentity(user));
+
+				db.GetTable<User>().InsertWithIdentity(db.GetTable<Contract>(), x => new Contract
+				{
+					UserId = x.Id, ContractNo = 1, Name = "contract"
+				});
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/TestBase.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,898 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.ServiceModel;
+using System.ServiceModel.Description;
+
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Common;
+using BLToolkit.Data;
+using BLToolkit.Data.Linq;
+using BLToolkit.Data.Sql.SqlProvider;
+using BLToolkit.Mapping;
+using BLToolkit.ServiceModel;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	using Model;
+
+	// fix for failing tests due to use of "," vs "." in numbers parsing for some cultures
+	[SetCulture("")]
+	public class TestBase
+	{
+		static TestBase()
+		{
+			var providerListFile =
+				File.Exists(@"..\..\UserDataProviders.txt") ?
+					@"..\..\UserDataProviders.txt" :
+					@"..\..\DefaultDataProviders.txt";
+
+			UserProviders.AddRange(
+				File.ReadAllLines(providerListFile)
+					.Select(s => s.Trim())
+					.Where (s => s.Length > 0 && !s.StartsWith("--")));
+
+			AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
+			{
+				string assembly;
+
+				     if (args.Name.IndexOf("Sybase.AdoNet2.AseClient")  >= 0) assembly = @"Sybase\Sybase.AdoNet2.AseClient.dll";
+				else if (args.Name.IndexOf("Oracle.DataAccess")         >= 0) assembly = @"Oracle\Oracle.DataAccess.dll";
+				else if (args.Name.IndexOf("IBM.Data.DB2")              >= 0) assembly = @"IBM\IBM.Data.DB2.dll";
+				else if (args.Name.IndexOf("Npgsql.resources")          >= 0) return null;
+				else if (args.Name.IndexOf("Npgsql")                    >= 0) assembly = @"PostgreSql\Npgsql.dll";
+				else if (args.Name.IndexOf("Mono.Security")             >= 0) assembly = @"PostgreSql\Mono.Security.dll";
+				else if (args.Name.IndexOf("System.Data.SqlServerCe,")  >= 0) assembly = @"SqlCe\System.Data.SqlServerCe.dll";
+				else
+					return null;
+
+				assembly = @"..\..\..\..\Redist\" + assembly;
+
+				if (!File.Exists(assembly))
+					assembly = @"..\..\" + assembly;
+
+				return Assembly.LoadFrom(assembly);
+			};
+
+			DbManager.TurnTraceSwitchOn();
+
+			PostgreSQLSqlProvider.QuoteIdentifiers = true;
+
+			var path = Path.GetDirectoryName(typeof(DbManager).Assembly.CodeBase.Replace("file:///", ""));
+
+			foreach (var info in Providers)
+			{
+				try
+				{
+					Type type;
+
+					if (info.Assembly == null)
+					{
+						type = typeof(DbManager).Assembly.GetType(info.Type, true);
+					}
+					else
+					{
+#if FW4
+						var fileName = info.Assembly + ".4.dll";
+#else
+						var fileName = info.Assembly + ".3.dll";
+#endif
+
+						var assembly = Assembly.LoadFile(Path.Combine(path, fileName));
+
+						type = assembly.GetType(info.Type, true);
+					}
+
+					DbManager.AddDataProvider(type);
+
+					info.Loaded = true;
+				}
+				catch (Exception)
+				{
+					info.Loaded = false;
+				}
+			}
+
+			LinqService.TypeResolver = str =>
+			{
+				switch (str)
+				{
+					//case "Data.Linq.Model.Gender" : return typeof(Gender);
+					case "Data.Linq.Model.Person": return typeof(Person);
+					default                       : return null;
+				}
+			};
+		}
+
+		const  int StartIP = 12345;
+		static int _lastIP = StartIP;
+
+		static int GetIP(string config)
+		{
+			int ip;
+
+			if (_ips.TryGetValue(config, out ip))
+				return ip;
+
+			_lastIP++;
+
+			var host = new ServiceHost(new LinqService(config) { AllowUpdates = true }, new Uri("net.tcp://localhost:" + _lastIP));
+
+			host.Description.Behaviors.Add(new ServiceMetadataBehavior());
+			host.Description.Behaviors.Find<ServiceDebugBehavior>().IncludeExceptionDetailInFaults = true;
+			host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex");
+			host.AddServiceEndpoint(
+				typeof(ILinqService),
+				new NetTcpBinding(SecurityMode.None)
+				{
+					MaxReceivedMessageSize = 10000000,
+					MaxBufferPoolSize      = 10000000,
+					MaxBufferSize          = 10000000,
+					CloseTimeout           = new TimeSpan(00, 01, 00),
+					OpenTimeout            = new TimeSpan(00, 01, 00),
+					ReceiveTimeout         = new TimeSpan(00, 10, 00),
+					SendTimeout            = new TimeSpan(00, 10, 00),
+				},
+				"LinqOverWCF");
+
+			host.Open();
+
+			_ips.Add(config, _lastIP);
+
+			return _lastIP;
+		}
+
+		public class ProviderInfo
+		{
+			public ProviderInfo(string name, string assembly, string type)
+			{
+				Name     = name;
+				Assembly = assembly;
+				Type     = type;
+			}
+
+			public readonly string Name;
+			public readonly string Assembly;
+			public readonly string Type;
+			public          bool   Loaded;
+			public          int    IP;
+			public          bool   Skip;
+		}
+
+		public static readonly List<string>       UserProviders = new List<string>();
+		public static readonly List<ProviderInfo> Providers = new List<ProviderInfo>
+		{
+			new ProviderInfo("Sql2008",               null,                                          "BLToolkit.Data.DataProvider.Sql2008DataProvider"),
+			new ProviderInfo("Sql2012",               null,                                          "BLToolkit.Data.DataProvider.Sql2012DataProvider"),
+			new ProviderInfo(ProviderName.SqlCe,      "BLToolkit.Data.DataProvider.SqlCe",           "BLToolkit.Data.DataProvider.SqlCeDataProvider"),
+			new ProviderInfo(ProviderName.SQLite,     "BLToolkit.Data.DataProvider.SQLite",          "BLToolkit.Data.DataProvider.SQLiteDataProvider"),
+			new ProviderInfo(ProviderName.Access,     null,                                          "BLToolkit.Data.DataProvider.AccessDataProvider"),
+			new ProviderInfo("Sql2000",               null,                                          "BLToolkit.Data.DataProvider.Sql2000DataProvider"),
+			new ProviderInfo("Sql2005",               null,                                          "BLToolkit.Data.DataProvider.SqlDataProvider"),
+			new ProviderInfo(ProviderName.DB2,        "BLToolkit.Data.DataProvider.DB2",             "BLToolkit.Data.DataProvider.DB2DataProvider"),
+			new ProviderInfo(ProviderName.Informix,   "BLToolkit.Data.DataProvider.Informix",        "BLToolkit.Data.DataProvider.InformixDataProvider"),
+			new ProviderInfo(ProviderName.Firebird,   "BLToolkit.Data.DataProvider.Firebird",        "BLToolkit.Data.DataProvider.FdpDataProvider"),
+			new ProviderInfo("Oracle",                "BLToolkit.Data.DataProvider.Oracle",          "BLToolkit.Data.DataProvider.OdpDataProvider"),
+			new ProviderInfo("DevartOracle",          "BLToolkit.Data.DataProvider.DevartOracle",    "BLToolkit.Data.DataProvider.DevartOracleDataProvider"),
+			//new ProviderInfo("Oracle",                "BLToolkit.Data.DataProvider.OracleManaged",   "BLToolkit.Data.DataProvider.OdpManagedDataProvider"),
+			new ProviderInfo(ProviderName.PostgreSQL, "BLToolkit.Data.DataProvider.PostgreSQL",      "BLToolkit.Data.DataProvider.PostgreSQLDataProvider"),
+			new ProviderInfo(ProviderName.MySql,      "BLToolkit.Data.DataProvider.MySql",           "BLToolkit.Data.DataProvider.MySqlDataProvider"),
+			new ProviderInfo(ProviderName.Sybase,     "BLToolkit.Data.DataProvider.Sybase",          "BLToolkit.Data.DataProvider.SybaseDataProvider"),
+		};
+
+		static IEnumerable<ITestDataContext> GetProviders(IEnumerable<string> exceptList)
+		{
+			var list = UserProviders.Concat(UserProviders.Select(p => p + ".LinqService"));
+
+			foreach (var info in Providers.Where(p => list.Contains(p.Name)))
+			{
+				if (exceptList.Contains(info.Name))
+					continue;
+
+				Debug.WriteLine(info.Name, "Provider ");
+
+				if (!info.Loaded)
+					continue;
+
+				yield return new TestDbManager(info.Name);
+
+				var ip = GetIP(info.Name);
+				var dx = new TestServiceModelDataContext(ip);
+
+				Debug.WriteLine(((IDataContext)dx).ContextID, "Provider ");
+
+				yield return dx;
+			}
+		}
+
+		[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)]
+		public class DataContextsAttribute : ValuesAttribute
+		{
+			public DataContextsAttribute(params string[] except)
+			{
+				Except = except;
+			}
+
+			const bool IncludeLinqService = true;
+
+			public string[] Except             { get; set; }
+			public string[] Include            { get; set; }
+			public bool     ExcludeLinqService { get; set; }
+
+			public override IEnumerable GetData(ParameterInfo parameter)
+			{
+				if (Include != null)
+				{
+					var list = Include.Intersect(
+						IncludeLinqService ? 
+							UserProviders.Concat(UserProviders.Select(p => p + ".LinqService")) :
+							UserProviders).
+						ToArray();
+
+					return list;
+				}
+
+				var providers = new List<string>();
+
+				foreach (var info in Providers)
+				{
+					if (info.Skip && Include == null)
+						continue;
+
+					if (Except != null && Except.Contains(info.Name))
+						continue;
+
+					if (!UserProviders.Contains(info.Name))
+						continue;
+
+					providers.Add(info.Name);
+
+					if (IncludeLinqService && !ExcludeLinqService)
+					{
+						providers.Add(info.Name + ".LinqService");
+					}
+				}
+
+				return providers.ToArray();
+			}
+		}
+
+		public class IncludeDataContextsAttribute : DataContextsAttribute
+		{
+			public IncludeDataContextsAttribute(params string[] include)
+			{
+				Include = include;
+			}
+		}
+
+		static readonly Dictionary<string,int> _ips = new Dictionary<string,int>();
+
+		protected ITestDataContext GetDataContext(string configuration)
+		{
+			if (configuration.EndsWith(".LinqService"))
+			{
+				var str = configuration.Substring(0, configuration.Length - ".LinqService".Length);
+				var ip  = GetIP(str);
+				var dx  = new TestServiceModelDataContext(ip);
+
+				Debug.WriteLine(((IDataContext)dx).ContextID, "Provider ");
+
+				return dx;
+			}
+
+			Debug.WriteLine(configuration, "Provider ");
+
+			return new TestDbManager(configuration);
+		}
+
+		protected void ForEachProvider(Type expectedException, string[] exceptList, Action<ITestDataContext> func)
+		{
+			Exception ex = null;
+
+			foreach (var db in GetProviders(exceptList))
+			{
+				try
+				{
+					if (db is DbManager)
+						((DbManager)db).BeginTransaction();
+
+					func(db);
+				}
+				catch (Exception e)
+				{
+					if (expectedException == null || e.GetType() != expectedException)
+						throw;
+
+					ex = e;
+				}
+				finally
+				{
+					db.Dispose();
+				}
+			}
+
+			if (ex != null)
+				throw ex;
+		}
+
+		protected void ForEachProvider(string[] exceptList, Action<ITestDataContext> func)
+		{
+			ForEachProvider(null, exceptList, func);
+		}
+
+		protected void ForEachProvider(Action<ITestDataContext> func)
+		{
+			ForEachProvider(Array<string>.Empty, func);
+		}
+
+		protected void ForEachProvider(Type expectedException, Action<ITestDataContext> func)
+		{
+			ForEachProvider(expectedException, Array<string>.Empty, func);
+		}
+
+		protected void Not0ForEachProvider(Func<ITestDataContext, int> func)
+		{
+			ForEachProvider(db => Assert.Less(0, func(db)));
+		}
+
+		protected void TestPerson(int id, string firstName, Func<ITestDataContext,IQueryable<Person>> func)
+		{
+			ForEachProvider(db =>
+			{
+				var person = func(db).ToList().Where(p => p.ID == id).First();
+
+				Assert.AreEqual(id,        person.ID);
+				Assert.AreEqual(firstName, person.FirstName);
+			});
+		}
+
+		protected void TestJohn(Func<ITestDataContext,IQueryable<Person>> func)
+		{
+			TestPerson(1, "John", func);
+		}
+
+		protected void TestOnePerson(string[] exceptList, int id, string firstName, Func<ITestDataContext,IQueryable<Person>> func)
+		{
+			ForEachProvider(exceptList, db =>
+			{
+				var list = func(db).ToList();
+
+				Assert.AreEqual(1, list.Count);
+
+				var person = list[0];
+
+				Assert.AreEqual(id,        person.ID);
+				Assert.AreEqual(firstName, person.FirstName);
+			});
+		}
+
+		protected void TestOnePerson(int id, string firstName, Func<ITestDataContext,IQueryable<Person>> func)
+		{
+			TestOnePerson(Array<string>.Empty, id, firstName, func);
+		}
+
+		protected void TestOneJohn(string[] exceptList, Func<ITestDataContext,IQueryable<Person>> func)
+		{
+			TestOnePerson(exceptList, 1, "John", func);
+		}
+
+		protected void TestOneJohn(Func<ITestDataContext,IQueryable<Person>> func)
+		{
+			TestOnePerson(Array<string>.Empty, 1, "John", func);
+		}
+
+		private   List<LinqDataTypes> _types;
+		protected IEnumerable<LinqDataTypes>  Types
+		{
+			get
+			{
+				if (_types == null)
+					using (var db = new TestDbManager())
+						_types = db.Types.ToList();
+
+				foreach (var type in _types)
+					yield return type;
+			}
+		}
+
+		private   List<LinqDataTypes2> _types2;
+		protected List<LinqDataTypes2>  Types2
+		{
+			get
+			{
+				if (_types2 == null)
+					using (var db = new TestDbManager())
+						_types2 = db.Types2.ToList();
+				return _types2;
+			}
+		}
+
+		private          List<Person> _person;
+		protected IEnumerable<Person>  Person
+		{
+			get
+			{
+				if (_person == null)
+				{
+					using (var db = new TestDbManager())
+						_person = db.Person.ToList();
+
+					foreach (var p in _person)
+						p.Patient = Patient.SingleOrDefault(ps => p.ID == ps.PersonID);
+				}
+
+				foreach (var item in _person)
+					yield return item;
+			}
+		}
+
+		private   List<Patient> _patient;
+		protected List<Patient>  Patient
+		{
+			get
+			{
+				if (_patient == null)
+				{
+					using (var db = new TestDbManager())
+						_patient = db.Patient.ToList();
+
+					foreach (var p in _patient)
+						p.Person = Person.Single(ps => ps.ID == p.PersonID);
+				}
+
+				return _patient;
+			}
+		}
+
+		private   List<Doctor> _doctor;
+		protected List<Doctor>  Doctor
+		{
+			get
+			{
+				if (_doctor == null)
+				{
+					using (var db = new TestDbManager())
+						_doctor = db.Doctor.ToList();
+				}
+
+				return _doctor;
+			}
+		}
+
+		#region Parent/Child Model
+
+		private          List<Parent> _parent;
+		protected IEnumerable<Parent>  Parent
+		{
+			get
+			{
+				if (_parent == null)
+					using (var db = new TestDbManager())
+					{
+						db.Parent.Delete(c => c.ParentID >= 1000);
+						_parent = db.Parent.ToList();
+						db.Close();
+
+						foreach (var p in _parent)
+						{
+							p.Children      = Child.     Where(c => c.ParentID == p.ParentID).ToList();
+							p.GrandChildren = GrandChild.Where(c => c.ParentID == p.ParentID).ToList();
+							p.Types         = Types.First(t => t.ID == p.ParentID);
+						}
+					}
+
+				foreach (var parent in _parent)
+					yield return parent;
+			}
+		}
+
+		private          List<Parent1> _parent1;
+		protected IEnumerable<Parent1>  Parent1
+		{
+			get
+			{
+				if (_parent1 == null)
+					_parent1 = Parent.Select(p => new Parent1 { ParentID = p.ParentID, Value1 = p.Value1 }).ToList();
+
+				foreach (var parent in _parent1)
+					yield return parent;
+			}
+		}
+
+		private   List<Parent4> _parent4;
+		protected List<Parent4>  Parent4
+		{
+			get
+			{
+				return _parent4 ?? (_parent4 = Parent.Select(p => new Parent4 { ParentID = p.ParentID, Value1 = Map.ToEnum<TypeValue>(p.Value1) }).ToList());
+			}
+		}
+
+		private   List<Parent5> _parent5;
+		protected List<Parent5>  Parent5
+		{
+			get
+			{
+				if (_parent5 == null)
+				{
+					_parent5 = Parent.Select(p => new Parent5 { ParentID = p.ParentID, Value1 = p.Value1}).ToList();
+
+					foreach (var p in _parent5)
+						p.Children = _parent5.Where(c => c.Value1 == p.ParentID).ToList();
+				}
+
+				return _parent5;
+			}
+		}
+
+		private          List<ParentInheritanceBase> _parentInheritance;
+		protected IEnumerable<ParentInheritanceBase>  ParentInheritance
+		{
+			get
+			{
+				if (_parentInheritance == null)
+					_parentInheritance = Parent.Select(p =>
+						p.Value1       == null ? new ParentInheritanceNull  { ParentID = p.ParentID } :
+						p.Value1.Value == 1    ? new ParentInheritance1     { ParentID = p.ParentID, Value1 = p.Value1.Value } :
+						 (ParentInheritanceBase) new ParentInheritanceValue { ParentID = p.ParentID, Value1 = p.Value1.Value }
+					).ToList();
+
+				foreach (var item in _parentInheritance)
+					yield return item;
+			}
+		}
+
+		private   List<ParentInheritanceValue> _parentInheritanceValue;
+		protected List<ParentInheritanceValue>  ParentInheritanceValue
+		{
+			get
+			{
+				return _parentInheritanceValue ?? (_parentInheritanceValue =
+					ParentInheritance.Where(p => p is ParentInheritanceValue).Cast<ParentInheritanceValue>().ToList());
+			}
+		}
+
+		private   List<ParentInheritance1> _parentInheritance1;
+		protected List<ParentInheritance1>  ParentInheritance1
+		{
+			get
+			{
+				return _parentInheritance1 ?? (_parentInheritance1 =
+					ParentInheritance.Where(p => p is ParentInheritance1).Cast<ParentInheritance1>().ToList());
+			}
+		}
+
+		private   List<ParentInheritanceBase4> _parentInheritance4;
+		protected List<ParentInheritanceBase4>  ParentInheritance4
+		{
+			get
+			{
+				return _parentInheritance4 ?? (_parentInheritance4 = Parent
+					.Where(p => p.Value1.HasValue && (new[] { 1, 2 }.Contains(p.Value1.Value)))
+					.Select(p => p.Value1 == 1 ?
+						(ParentInheritanceBase4)new ParentInheritance14 { ParentID = p.ParentID } :
+						(ParentInheritanceBase4)new ParentInheritance24 { ParentID = p.ParentID }
+				).ToList());
+			}
+		}
+
+		private          List<Child> _child;
+		protected IEnumerable<Child>  Child
+		{
+			get
+			{
+				if (_child == null)
+					using (var db = new TestDbManager())
+					{
+						db.Child.Delete(c => c.ParentID >= 1000);
+						_child = db.Child.ToList();
+						db.Clone();
+
+						foreach (var ch in _child)
+						{
+							ch.Parent        = Parent. Single(p => p.ParentID == ch.ParentID);
+							ch.Parent1       = Parent1.Single(p => p.ParentID == ch.ParentID);
+							ch.ParentID2     = new Parent3 { ParentID2 = ch.Parent.ParentID, Value1 = ch.Parent.Value1 };
+							ch.GrandChildren = GrandChild.Where(c => c.ParentID == ch.ParentID && c.ChildID == ch.ChildID).ToList();
+						}
+					}
+
+				foreach (var child in _child)
+					yield return child;
+			}
+		}
+
+		private          List<GrandChild> _grandChild;
+		protected IEnumerable<GrandChild>  GrandChild
+		{
+			get
+			{
+				if (_grandChild == null)
+					using (var db = new TestDbManager())
+					{
+						_grandChild = db.GrandChild.ToList();
+						db.Close();
+
+						foreach (var ch in _grandChild)
+							ch.Child = Child.Single(c => c.ParentID == ch.ParentID && c.ChildID == ch.ChildID);
+					}
+
+				foreach (var grandChild in _grandChild)
+					yield return grandChild;
+			}
+		}
+
+		private          List<GrandChild1> _grandChild1;
+		protected IEnumerable<GrandChild1>  GrandChild1
+		{
+			get
+			{
+				if (_grandChild1 == null)
+					using (var db = new TestDbManager())
+					{
+						_grandChild1 = db.GrandChild1.ToList();
+
+						foreach (var ch in _grandChild1)
+						{
+							ch.Parent = Parent1.Single(p => p.ParentID == ch.ParentID);
+							ch.Child  = Child.  Single(c => c.ParentID == ch.ParentID && c.ChildID == ch.ChildID);
+						}
+					}
+
+				foreach (var grandChild in _grandChild1)
+					yield return grandChild;
+			}
+		}
+
+		#endregion
+
+		#region Northwind
+
+		private List<Northwind.Category> _category;
+		public  List<Northwind.Category>  Category
+		{
+			get
+			{
+				if (_category == null)
+					using (var db = new NorthwindDB())
+						_category = db.Category.ToList();
+				return _category;
+			}
+		}
+
+		private List<Northwind.Customer> _customer;
+		public  List<Northwind.Customer>  Customer
+		{
+			get
+			{
+				if (_customer == null)
+				{
+					using (var db = new NorthwindDB())
+						_customer = db.Customer.ToList();
+
+					foreach (var c in _customer)
+						c.Orders = (from o in Order where o.CustomerID == c.CustomerID select o).ToList();
+				}
+
+				return _customer;
+			}
+		}
+
+		private List<Northwind.Employee> _employee;
+		public  List<Northwind.Employee>  Employee
+		{
+			get
+			{
+				if (_employee == null)
+				{
+					using (var db = new NorthwindDB())
+					{
+						_employee = db.Employee.ToList();
+
+						foreach (var employee in _employee)
+						{
+							employee.Employees         = (from e in _employee where e.ReportsTo  == employee.EmployeeID select e).ToList();
+							employee.ReportsToEmployee = (from e in _employee where e.EmployeeID == employee.ReportsTo  select e).SingleOrDefault();
+						}
+					}
+				}
+
+				return _employee;
+			}
+		}
+
+		private List<Northwind.EmployeeTerritory> _employeeTerritory;
+		public  List<Northwind.EmployeeTerritory>  EmployeeTerritory
+		{
+			get
+			{
+				if (_employeeTerritory == null)
+					using (var db = new NorthwindDB())
+						_employeeTerritory = db.EmployeeTerritory.ToList();
+				return _employeeTerritory;
+			}
+		}
+
+		private List<Northwind.OrderDetail> _orderDetail;
+		public  List<Northwind.OrderDetail>  OrderDetail
+		{
+			get
+			{
+				if (_orderDetail == null)
+					using (var db = new NorthwindDB())
+						_orderDetail = db.OrderDetail.ToList();
+				return _orderDetail;
+			}
+		}
+
+		private List<Northwind.Order> _order;
+		public  List<Northwind.Order>  Order
+		{
+			get
+			{
+				if (_order == null)
+				{
+					using (var db = new NorthwindDB())
+						_order = db.Order.ToList();
+
+					foreach (var o in _order)
+					{
+						o.Customer = Customer.Single(c => o.CustomerID == c.CustomerID);
+						o.Employee = Employee.Single(e => o.EmployeeID == e.EmployeeID);
+					}
+				}
+
+				return _order;
+			}
+		}
+
+		private IEnumerable<Northwind.Product> _product;
+		public  IEnumerable<Northwind.Product>  Product
+		{
+			get
+			{
+				if (_product == null)
+					using (var db = new NorthwindDB())
+						_product = db.Product.ToList();
+
+				foreach (var product in _product)
+					yield return product;
+			}
+		}
+
+		private List<Northwind.ActiveProduct> _activeProduct;
+		public  List<Northwind.ActiveProduct>  ActiveProduct
+		{
+			get { return _activeProduct ?? (_activeProduct = Product.OfType<Northwind.ActiveProduct>().ToList()); }
+		}
+
+		public  IEnumerable<Northwind.DiscontinuedProduct>  DiscontinuedProduct
+		{
+			get { return Product.OfType<Northwind.DiscontinuedProduct>(); }
+		}
+
+		private List<Northwind.Region> _region;
+		public  List<Northwind.Region>  Region
+		{
+			get
+			{
+				if (_region == null)
+					using (var db = new NorthwindDB())
+						_region = db.Region.ToList();
+				return _region;
+			}
+		}
+
+		private List<Northwind.Shipper> _shipper;
+		public  List<Northwind.Shipper>  Shipper
+		{
+			get
+			{
+				if (_shipper == null)
+					using (var db = new NorthwindDB())
+						_shipper = db.Shipper.ToList();
+				return _shipper;
+			}
+		}
+
+		private List<Northwind.Supplier> _supplier;
+		public  List<Northwind.Supplier>  Supplier
+		{
+			get
+			{
+				if (_supplier == null)
+					using (var db = new NorthwindDB())
+						_supplier = db.Supplier.ToList();
+				return _supplier;
+			}
+		}
+
+		private List<Northwind.Territory> _territory;
+		public  List<Northwind.Territory>  Territory
+		{
+			get
+			{
+				if (_territory == null)
+					using (var db = new NorthwindDB())
+						_territory = db.Territory.ToList();
+				return _territory;
+			}
+		}
+
+		#endregion
+
+		protected void AreEqual<T>(IEnumerable<T> expected, IEnumerable<T> result)
+		{
+			var resultList   = result.  ToList();
+			var expectedList = expected.ToList();
+
+			Assert.AreNotEqual(0, expectedList.Count);
+			Assert.AreEqual(expectedList.Count, resultList.Count, "Expected and result lists are different. Lenght: ");
+
+			var exceptExpectedList = resultList.  Except(expectedList).ToList();
+			var exceptResultList   = expectedList.Except(resultList).  ToList();
+
+			var exceptExpected = exceptExpectedList.Count;
+			var exceptResult   = exceptResultList.  Count;
+
+			if (exceptResult != 0 || exceptExpected != 0)
+				for (var i = 0; i < resultList.Count; i++)
+					Debug.WriteLine("{0} {1} --- {2}", Equals(expectedList[i], resultList[i]) ? " " : "-", expectedList[i], resultList[i]);
+
+			Assert.AreEqual(0, exceptExpected);
+			Assert.AreEqual(0, exceptResult);
+		}
+
+		protected void AreEqual<T>(IEnumerable<IEnumerable<T>> expected, IEnumerable<IEnumerable<T>> result)
+		{
+			var resultList   = result.  ToList();
+			var expectedList = expected.ToList();
+
+			Assert.AreNotEqual(0, expectedList.Count);
+			Assert.AreEqual(expectedList.Count, resultList.Count, "Expected and result lists are different. Lenght: ");
+
+			for (var i = 0; i < resultList.Count; i++)
+			{
+				var elist = expectedList[i].ToList();
+				var rlist = resultList  [i].ToList();
+
+				if (elist.Count > 0 || rlist.Count > 0)
+					AreEqual(elist, rlist);
+			}
+		}
+
+		protected void AreSame<T>(IEnumerable<T> expected, IEnumerable<T> result)
+		{
+			var resultList   = result.  ToList();
+			var expectedList = expected.ToList();
+
+			Assert.AreNotEqual(0, expectedList.Count);
+			Assert.AreEqual(expectedList.Count, resultList.Count);
+
+			var b = expectedList.SequenceEqual(resultList);
+
+			if (!b)
+				for (var i = 0; i < resultList.Count; i++)
+					Debug.WriteLine(string.Format("{0} {1} --- {2}", Equals(expectedList[i], resultList[i]) ? " " : "-", expectedList[i], resultList[i]));
+
+			Assert.IsTrue(b);
+		}
+
+		protected void CompareSql(string result, string expected)
+		{
+			var ss = expected.Trim('\r', '\n').Split('\n');
+
+			while (ss.All(_ => _.Length > 0 && _[0] == '\t'))
+				for (var i = 0; i < ss.Length; i++)
+					ss[i] = ss[i].Substring(1);
+
+			Assert.AreEqual(string.Join("\n", ss), result.Trim('\r', '\n'));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/TestDbManager.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,101 @@
+using System;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Reflection;
+using System.Text;
+
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using BLToolkit.Data.Sql;
+
+namespace Data.Linq
+{
+	using Model;
+
+	public class TestDbManager : DbManager, ITestDataContext
+	{
+		public TestDbManager(string configString)
+			: base(configString)
+		{
+		}
+
+		public TestDbManager()
+			: base(ProviderName.Access)
+		{
+		}
+
+		public Table<Person>                 Person                 { get { return GetTable<Person>();                 } }
+		public Table<Patient>                Patient                { get { return GetTable<Patient>();                } }
+		public Table<Doctor>                 Doctor                 { get { return GetTable<Doctor>();                 } }
+		public Table<Parent>                 Parent                 { get { return GetTable<Parent>();                 } }
+		public Table<Parent1>                Parent1                { get { return GetTable<Parent1>();                } }
+		public Table<IParent>                Parent2                { get { return GetTable<IParent>();                } }
+		public Table<Parent4>                Parent4                { get { return GetTable<Parent4>();                } }
+		public Table<Parent5>                Parent5                { get { return GetTable<Parent5>();                } }
+		public Table<ParentInheritanceBase>  ParentInheritance      { get { return GetTable<ParentInheritanceBase>();  } }
+		public Table<ParentInheritanceBase2> ParentInheritance2     { get { return GetTable<ParentInheritanceBase2>(); } }
+		public Table<ParentInheritanceBase3> ParentInheritance3     { get { return GetTable<ParentInheritanceBase3>(); } }
+		public Table<ParentInheritanceBase4> ParentInheritance4     { get { return GetTable<ParentInheritanceBase4>(); } }
+		public Table<ParentInheritance1>     ParentInheritance1     { get { return GetTable<ParentInheritance1>();     } }
+		public Table<ParentInheritanceValue> ParentInheritanceValue { get { return GetTable<ParentInheritanceValue>(); } }
+		public Table<Child>                  Child                  { get { return GetTable<Child>();                  } }
+		public Table<GrandChild>             GrandChild             { get { return GetTable<GrandChild>();             } }
+		public Table<GrandChild1>            GrandChild1            { get { return GetTable<GrandChild1>();            } }
+		public Table<LinqDataTypes>          Types                  { get { return GetTable<LinqDataTypes>();          } }
+		public Table<LinqDataTypes2>         Types2                 { get { return GetTable<LinqDataTypes2>();         } }
+		public Table<TestIdentity>           TestIdentity           { get { return GetTable<TestIdentity>();           } }
+
+		[TableFunction(Name="GetParentByID")]
+		public Table<Parent> GetParentByID(int? id)
+		{
+			return GetTable<Parent>(this, (MethodInfo)MethodBase.GetCurrentMethod(), id);
+		}
+
+		public string GetSqlText(SqlQuery sql)
+		{
+			var provider = ((IDataContext)this).CreateSqlProvider();
+
+			//provider.SqlQuery = sql;
+
+			sql = provider.Finalize(sql);
+
+			var cc = provider.CommandCount(sql);
+			var sb = new StringBuilder();
+
+			var commands = new string[cc];
+
+			for (var i = 0; i < cc; i++)
+			{
+				sb.Length = 0;
+
+				provider.BuildSql(i, sql, sb, 0, 0, false);
+				commands[i] = sb.ToString();
+			}
+
+			return string.Join("\n\n", commands);
+		}
+		
+#if !MONO		
+		[MethodExpression("Expression9")]
+		static public IQueryable<Parent> GetParent9(ITestDataContext db, Child ch)
+		{
+			throw new InvalidOperationException();
+		}
+
+		[MethodExpression("Expression9")]
+		public IQueryable<Parent> GetParent10(Child ch)
+		{
+			throw new InvalidOperationException();
+		}
+
+		static Expression<Func<ITestDataContext,Child,IQueryable<Parent>>> Expression9()
+		{
+			return (db,ch) =>
+				from p in db.Parent
+				where p.ParentID == (int)Math.Floor(ch.ChildID / 10.0)
+				select p;
+		}
+#endif		
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/TestServiceModelDataContext.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,50 @@
+using System;
+using System.ServiceModel;
+
+using BLToolkit.Data.Linq;
+using BLToolkit.ServiceModel;
+
+namespace Data.Linq
+{
+	using Model;
+
+	public class TestServiceModelDataContext : ServiceModelDataContext, ITestDataContext
+	{
+		public TestServiceModelDataContext(int ip) : base(
+			new NetTcpBinding(SecurityMode.None)
+			{
+				MaxReceivedMessageSize = 10000000,
+				MaxBufferPoolSize      = 10000000,
+				MaxBufferSize          = 10000000,
+				CloseTimeout           = new TimeSpan(00, 01, 00),
+				OpenTimeout            = new TimeSpan(00, 01, 00),
+				ReceiveTimeout         = new TimeSpan(00, 10, 00),
+				SendTimeout            = new TimeSpan(00, 10, 00),
+			},
+			new EndpointAddress("net.tcp://localhost:" + ip + "/LinqOverWCF"))
+		{
+			((NetTcpBinding)Binding).ReaderQuotas.MaxStringContentLength = 1000000;
+		}
+
+		public Table<Person>                 Person                 { get { return this.GetTable<Person>();                 } }
+		public Table<Patient>                Patient                { get { return this.GetTable<Patient>();                } }
+		public Table<Doctor>                 Doctor                 { get { return this.GetTable<Doctor>();                 } }
+		public Table<Parent>                 Parent                 { get { return this.GetTable<Parent>();                 } }
+		public Table<Parent1>                Parent1                { get { return this.GetTable<Parent1>();                } }
+		public Table<IParent>                Parent2                { get { return this.GetTable<IParent>();                } }
+		public Table<Parent4>                Parent4                { get { return this.GetTable<Parent4>();                } }
+		public Table<Parent5>                Parent5                { get { return this.GetTable<Parent5>();                } }
+		public Table<ParentInheritanceBase>  ParentInheritance      { get { return this.GetTable<ParentInheritanceBase>();  } }
+		public Table<ParentInheritanceBase2> ParentInheritance2     { get { return this.GetTable<ParentInheritanceBase2>(); } }
+		public Table<ParentInheritanceBase3> ParentInheritance3     { get { return this.GetTable<ParentInheritanceBase3>(); } }
+		public Table<ParentInheritanceBase4> ParentInheritance4     { get { return this.GetTable<ParentInheritanceBase4>(); } }
+		public Table<ParentInheritance1>     ParentInheritance1     { get { return this.GetTable<ParentInheritance1>();     } }
+		public Table<ParentInheritanceValue> ParentInheritanceValue { get { return this.GetTable<ParentInheritanceValue>(); } }
+		public Table<Child>                  Child                  { get { return this.GetTable<Child>();                  } }
+		public Table<GrandChild>             GrandChild             { get { return this.GetTable<GrandChild>();             } }
+		public Table<GrandChild1>            GrandChild1            { get { return this.GetTable<GrandChild1>();            } }
+		public Table<LinqDataTypes>          Types                  { get { return this.GetTable<LinqDataTypes>();          } }
+		public Table<LinqDataTypes2>         Types2                 { get { return this.GetTable<LinqDataTypes2>();         } }
+		public Table<TestIdentity>           TestIdentity           { get { return this.GetTable<TestIdentity>();           } }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/Types.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,726 @@
+using System;
+using System.Collections.Generic;
+using System.Data.Linq;
+using System.Globalization;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Threading;
+
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class Types : TestBase
+	{
+		[Test]
+		public void Bool1()
+		{
+			var value = true;
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where p.ParentID > 2 && value && true && !false select p,
+				from p in db.Parent where p.ParentID > 2 && value && true && !false select p));
+		}
+
+		[Test]
+		public void Bool2()
+		{
+			var value = true;
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where p.ParentID > 2 && value || true && !false select p,
+				from p in db.Parent where p.ParentID > 2 && value || true && !false select p));
+		}
+
+		[Test]
+		public void Bool3()
+		{
+			var values = new int[0];
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where values.Contains(p.ParentID) && !false || p.ParentID > 2 select p,
+				from p in db.Parent where values.Contains(p.ParentID) && !false || p.ParentID > 2 select p));
+		}
+
+		[Test]
+		public void BoolField1()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types where t.BoolValue select t.MoneyValue,
+				from t in db.Types where t.BoolValue select t.MoneyValue));
+		}
+
+		[Test]
+		public void BoolField2()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types where !t.BoolValue select t.MoneyValue,
+				from t in db.Types where !t.BoolValue select t.MoneyValue));
+		}
+
+		[Test]
+		public void BoolField3()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types where t.BoolValue == true select t.MoneyValue,
+				from t in db.Types where t.BoolValue == true select t.MoneyValue));
+		}
+
+		[Test]
+		public void BoolField4()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types where t.BoolValue == false select t.MoneyValue,
+				from t in db.Types where t.BoolValue == false select t.MoneyValue));
+		}
+
+		[Test]
+		public void BoolField5()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in from t in    Types select new { t.MoneyValue, b = !t.BoolValue } where p.b == false select p.MoneyValue,
+				from p in from t in db.Types select new { t.MoneyValue, b = !t.BoolValue } where p.b == false select p.MoneyValue));
+		}
+
+		[Test]
+		public void BoolField6()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in from t in    Types select new { t.MoneyValue, b = !t.BoolValue } where p.b select p.MoneyValue,
+				from p in from t in db.Types select new { t.MoneyValue, b = !t.BoolValue } where p.b select p.MoneyValue));
+		}
+
+		[Test]
+		public void BoolResult1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Person select new { p.Patient, IsPatient = p.Patient != null },
+				from p in db.Person select new { p.Patient, IsPatient = p.Patient != null }));
+		}
+
+		[Test]
+		public void BoolResult2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Person select new { IsPatient = Sql.AsSql(p.Patient != null) },
+				from p in db.Person select new { IsPatient = Sql.AsSql(p.Patient != null) }));
+		}
+
+		[Test]
+		public void BoolResult3()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Person select Sql.AsSql(p.ID == 1),
+				from p in db.Person select Sql.AsSql(p.ID == 1)));
+		}
+
+		[Test]
+		public void GuidNew()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Types where p.GuidValue != Guid.NewGuid() select p.GuidValue,
+				from p in db.Types where p.GuidValue != Guid.NewGuid() select p.GuidValue));
+		}
+
+		[Test]
+		public void Guid1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Types where p.GuidValue == new Guid("D2F970C0-35AC-4987-9CD5-5BADB1757436") select p.GuidValue,
+				from p in db.Types where p.GuidValue == new Guid("D2F970C0-35AC-4987-9CD5-5BADB1757436") select p.GuidValue));
+		}
+
+		[Test]
+		public void Guid2()
+		{
+			var guid3 = new Guid("D2F970C0-35AC-4987-9CD5-5BADB1757436");
+			var guid4 = new Guid("40932fdb-1543-4e4a-ac2c-ca371604fb4b");
+
+			var parm = Expression.Parameter(typeof(LinqDataTypes), "p");
+
+			ForEachProvider(db =>
+				Assert.AreNotEqual(
+					db.Types
+						.Where(
+							Expression.Lambda<Func<LinqDataTypes,bool>>(
+								Expression.Equal(
+									Expression.PropertyOrField(parm, "GuidValue"),
+									Expression.Constant(guid3),
+									false,
+									typeof(Guid).GetMethod("op_Equality")),
+								new[] { parm }))
+						.Single().GuidValue,
+					db.Types
+						.Where(
+							Expression.Lambda<Func<LinqDataTypes,bool>>(
+								Expression.Equal(
+									Expression.PropertyOrField(parm, "GuidValue"),
+									Expression.Constant(guid4),
+									false,
+									typeof(Guid).GetMethod("op_Equality")),
+								new[] { parm }))
+						.Single().GuidValue)
+			);
+		}
+
+		[Test]
+		public void ContainsGuid()
+		{
+			var ids = new [] { new Guid("D2F970C0-35AC-4987-9CD5-5BADB1757436") };
+
+			ForEachProvider(db => AreEqual(
+				from p in    Types where ids.Contains(p.GuidValue) select p.GuidValue,
+				from p in db.Types where ids.Contains(p.GuidValue) select p.GuidValue));
+		}
+
+		[Test]
+		public void NewGuid()
+		{
+			ForEachProvider(
+				new[] { ProviderName.DB2, ProviderName.Informix, ProviderName.Firebird, ProviderName.PostgreSQL, ProviderName.SQLite, ProviderName.Access },
+				db =>
+				{
+					db.Types.Delete(_ => _.ID > 1000);
+					db.Types.Insert(() => new LinqDataTypes
+					{
+						ID            = 1001,
+						MoneyValue    = 1001,
+						DateTimeValue = Sql.CurrentTimestamp,
+						BoolValue     = true,
+						GuidValue     = Sql.NewGuid(),
+						BinaryValue   = new Binary(new byte[] { 1 }),
+						SmallIntValue = 1001
+					});
+
+					var guid = db.Types.Single(_ => _.ID == 1001).GuidValue;
+
+					Assert.AreEqual(1001, db.Types.Single(_ => _.GuidValue == guid).ID);
+
+					db.Types.Delete(_ => _.ID > 1000);
+				});
+		}
+
+        [Test]
+		public void BinaryLength()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Access },
+				db =>
+				{
+					db.Types
+						.Where(t => t.ID == 1)
+						.Set(t => t.BinaryValue, new Binary(new byte[] { 1, 2, 3, 4, 5 }))
+						.Update();
+
+					Assert.That(
+						(from t in db.Types where t.ID == 1 select t.BinaryValue.Length).First(),
+						Is.EqualTo(5));
+
+					db.Types
+						.Where(t => t.ID == 1)
+						.Set(t => t.BinaryValue, (Binary)null)
+						.Update();
+				});
+		}
+
+		[Test]
+		public void InsertBinary1()
+		{
+			ForEachProvider(
+				new[] { ProviderName.DB2, ProviderName.Informix, ProviderName.Firebird, ProviderName.PostgreSQL, ProviderName.SQLite, ProviderName.Access },
+				db =>
+				{
+					Binary data = null;
+
+					db.Types.Delete(_ => _.ID > 1000);
+					db.Types.Insert(() => new LinqDataTypes
+					{
+						ID          = 1001,
+						BinaryValue = data,
+						BoolValue   = true,
+					});
+					db.Types.Delete(_ => _.ID > 1000);
+				});
+		}
+
+		[Test]
+		public void UpdateBinary1()
+		{
+			ForEachProvider(db =>
+			{
+				db.Types
+					.Where(t => t.ID == 1)
+					.Set(t => t.BinaryValue, new Binary(new byte[] { 1, 2, 3, 4, 5 }))
+					.Update();
+
+				var g = from t in db.Types where t.ID == 1 select t.BinaryValue;
+
+				foreach (var binary in g)
+				{
+				}
+			});
+		}
+
+		[Test]
+		public void UpdateBinary2()
+		{
+			ForEachProvider(new[] { ProviderName.SqlCe }, db =>
+			{
+				var ints     = new[] { 1, 2 };
+				var binaries = new[] { new byte[] { 1, 2, 3, 4, 5 }, new byte[] { 5, 4, 3, 2, 1 } };
+
+				for (var i = 1; i <= 2; i++)
+				{
+					db.Types
+						.Where(t => t.ID == ints[i - 1])
+						.Set(t => t.BinaryValue, binaries[i - 1])
+						.Update();
+				}
+
+				var g = from t in db.Types where new[] { 1, 2 }.Contains(t.ID) select t;
+
+				foreach (var binary in g)
+					Assert.AreEqual(binaries[binary.ID - 1], binary.BinaryValue.ToArray());
+			});
+		}
+
+		[Test]
+		public void DateTime1()
+		{
+			var dt = Types2[3].DateTimeValue;
+
+			ForEachProvider(db => AreEqual(
+				from t in    Types2 where t.DateTimeValue.Value.Date > dt.Value.Date select t,
+				from t in db.Types2 where t.DateTimeValue.Value.Date > dt.Value.Date select t));
+		}
+
+		[Test]
+		public void DateTime21([DataContexts(ProviderName.SQLite)] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				var pdt = db.Types2.First(t => t.ID == 1).DateTimeValue;
+				var dt  = DateTime.Parse("2010-12-14T05:00:07.4250141Z");
+
+				db.Types2.Update(t => t.ID == 1, t => new LinqDataTypes2 { DateTimeValue = dt });
+
+				var dt2 = db.Types2.First(t => t.ID == 1).DateTimeValue;
+
+				db.Types2.Update(t => t.ID == 1, t => new LinqDataTypes2 { DateTimeValue = pdt });
+
+				Assert.AreNotEqual(dt.Ticks, dt2.Value.Ticks);
+			}
+		}
+
+		[Test]
+		public void DateTime22()
+		{
+			ForEachProvider(
+				new[]
+				{
+					ProviderName.SqlCe, ProviderName.Access, "Sql2000", "Sql2005", ProviderName.DB2, ProviderName.Informix,
+					ProviderName.Firebird, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.Sybase
+				},
+				db =>
+				{
+					var pdt = db.Types2.First(t => t.ID == 1).DateTimeValue2;
+					var dt  = DateTime.Parse("2010-12-14T05:00:07.4250141Z");
+
+					db.Types2.Update(t => t.ID == 1, t => new LinqDataTypes2 { DateTimeValue2 = dt });
+
+					var dt2 = db.Types2.First(t => t.ID == 1).DateTimeValue2;
+
+					db.Types2.Update(t => t.ID == 1, t => new LinqDataTypes2 { DateTimeValue2 = pdt });
+
+					Assert.AreEqual(dt, dt2);
+				});
+		}
+
+		[Test]
+		public void DateTime23()
+		{
+			ForEachProvider(
+				new[]
+				{
+					ProviderName.SqlCe, ProviderName.Access, "Sql2000", "Sql2005", ProviderName.DB2, ProviderName.Informix,
+					ProviderName.Firebird, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.Sybase
+				},
+				db =>
+				{
+					var pdt = db.Types2.First(t => t.ID == 1).DateTimeValue2;
+					var dt  = DateTime.Parse("2010-12-14T05:00:07.4250141Z");
+
+					db.Types2
+						.Where(t => t.ID == 1)
+						.Set  (_ => _.DateTimeValue2, dt)
+						.Update();
+
+					var dt2 = db.Types2.First(t => t.ID == 1).DateTimeValue2;
+
+					db.Types2.Update(t => t.ID == 1, t => new LinqDataTypes2 { DateTimeValue2 = pdt });
+
+					Assert.AreEqual(dt, dt2);
+				});
+		}
+
+		[Test]
+		public void DateTime24()
+		{
+			ForEachProvider(
+				new[]
+				{
+					ProviderName.SqlCe, ProviderName.Access, "Sql2000", "Sql2005", ProviderName.DB2, ProviderName.Informix,
+					ProviderName.Firebird, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.Sybase
+				},
+				db =>
+				{
+					var pdt = db.Types2.First(t => t.ID == 1).DateTimeValue2;
+					var dt  = DateTime.Parse("2010-12-14T05:00:07.4250141Z");
+					var tt  = db.Types2.First(t => t.ID == 1);
+
+					tt.DateTimeValue2 = dt;
+
+					db.Update(tt);
+
+					var dt2 = db.Types2.First(t => t.ID == 1).DateTimeValue2;
+
+					db.Types2.Update(t => t.ID == 1, t => new LinqDataTypes2 { DateTimeValue2 = pdt });
+
+					Assert.AreEqual(dt, dt2);
+				});
+		}
+
+		[Test]
+		public void DateTimeArray1()
+		{
+			ForEachProvider(db =>
+				AreEqual(
+					from t in    Types2 where new DateTime?[] { new DateTime(2001, 1, 11, 1, 11, 21, 100) }.Contains(t.DateTimeValue) select t,
+					from t in db.Types2 where new DateTime?[] { new DateTime(2001, 1, 11, 1, 11, 21, 100) }.Contains(t.DateTimeValue) select t));
+		}
+
+        [Test]
+		public void DateTimeArray2()
+		{
+			var arr = new DateTime?[] { new DateTime(2001, 1, 11, 1, 11, 21, 100), new DateTime(2012, 11, 7, 19, 19, 29, 90) };
+
+			ForEachProvider(
+				new[] { ProviderName.Access },
+				db =>
+					AreEqual(
+						from t in    Types2 where arr.Contains(t.DateTimeValue) select t,
+						from t in db.Types2 where arr.Contains(t.DateTimeValue) select t));
+		}
+
+        [Test]
+		public void DateTimeArray3()
+		{
+			var arr = new List<DateTime?> { new DateTime(2001, 1, 11, 1, 11, 21, 100) };
+
+			ForEachProvider(
+				new[] { ProviderName.Access },
+				db =>
+					AreEqual(
+						from t in    Types2 where arr.Contains(t.DateTimeValue) select t,
+						from t in db.Types2 where arr.Contains(t.DateTimeValue) select t));
+		}
+
+		[Test]
+		public void DateTimeParams()
+		{
+			var arr = new List<DateTime?>
+			{
+				new DateTime(1992, 1, 11, 1, 11, 21, 100),
+				new DateTime(1993, 1, 11, 1, 11, 21, 100)
+			};
+
+			ForEachProvider(
+				db =>
+				{
+					foreach (var dateTime in arr)
+					{
+						var dt = DateTimeParams(db, dateTime);
+						Assert.AreEqual(dateTime, dt);
+					}
+				});
+		}
+
+		static DateTime DateTimeParams(ITestDataContext db, DateTime? dateTime)
+		{
+			var q =
+				from t in db.Types2
+				where t.DateTimeValue > dateTime
+				select new
+					{
+						t.DateTimeValue,
+						dateTime.Value
+					};
+
+			return q.First().Value;
+		}
+
+		[Test]
+		public void Nullable()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent select new { Value = p.Value1.GetValueOrDefault() },
+				from p in db.Parent select new { Value = p.Value1.GetValueOrDefault() }));
+		}
+
+		[Test]
+		public void Unicode()
+		{
+			ForEachProvider(new[] { "DevartOracle", ProviderName.Informix, ProviderName.Firebird, ProviderName.Sybase }, db =>
+			{
+				try
+				{
+					db.Person.Delete(p => p.ID > 2);
+
+					var id =
+						db.Person
+							.InsertWithIdentity(() => new Person
+							{
+								FirstName = "擊敗奴隸",
+								LastName  = "Юникодкин",
+								Gender    = Gender.Male
+							});
+
+					Assert.NotNull(id);
+
+					var person = db.Person.Single(p => p.FirstName == "擊敗奴隸" && p.LastName == "Юникодкин");
+
+					Assert.NotNull (person);
+					Assert.AreEqual(id, person.ID);
+					Assert.AreEqual("擊敗奴隸", person.FirstName);
+					Assert.AreEqual("Юникодкин", person.LastName);
+				}
+				finally
+				{
+					db.Person.Delete(p => p.ID > 2);
+				}
+			});
+		}
+
+		[Test]
+		public void TestCultureInfo([DataContexts] string context)
+		{
+			var current = Thread.CurrentThread.CurrentCulture;
+
+			Thread.CurrentThread.CurrentCulture = new CultureInfo("ru-RU");
+
+			using (var db = GetDataContext(context))
+				AreEqual(
+					from t in    Types where t.MoneyValue > 0.5m select t,
+					from t in db.Types where t.MoneyValue > 0.5m select t);
+
+			Thread.CurrentThread.CurrentCulture = current;
+		}
+
+		[Test]
+		public void SmallInt()
+		{
+			ForEachProvider(db => AreEqual(
+				from t1 in Types
+				join t2 in Types on t1.SmallIntValue equals t2.ID
+				select t1,
+				from t1 in db.Types
+				join t2 in db.Types on t1.SmallIntValue equals t2.ID
+				select t1)
+			);
+		}
+
+		[TableName("Person")]
+		public class PersonCharTest
+		{
+			public int    PersonID;
+			public string FirstName;
+			public string LastName;
+			public string MiddleName;
+			public char   Gender;
+		}
+
+		[Test]
+		public void CharTest1()
+		{
+			List<PersonCharTest> list;
+
+			using (var db = new TestDbManager())
+				list = db.GetTable<PersonCharTest>().ToList();
+
+			ForEachProvider(db => AreEqual(
+				from p in list                          where p.Gender == 'M' select p.PersonID,
+				from p in db.GetTable<PersonCharTest>() where p.Gender == 'M' select p.PersonID));
+		}
+
+		[Test]
+		public void CharTest2()
+		{
+			List<PersonCharTest> list;
+
+			using (var db = new TestDbManager())
+				list = db.GetTable<PersonCharTest>().ToList();
+
+			ForEachProvider(db => AreEqual(
+				from p in list                          where 'M' == p.Gender select p.PersonID,
+				from p in db.GetTable<PersonCharTest>() where 'M' == p.Gender select p.PersonID));
+		}
+
+		[TableName("Person")]
+		public class PersonBoolTest
+		{
+			public int    PersonID;
+			public string FirstName;
+			public string LastName;
+			public string MiddleName;
+			[MapField("Gender"), MapValue(true, "M"), MapValue(false, "F")]
+			public bool   IsMale;
+		}
+
+		//[Test]
+		public void BoolTest1()
+		{
+			List<PersonBoolTest> list;
+
+			using (var db = new TestDbManager())
+				list = db.GetTable<PersonBoolTest>().ToList();
+
+			ForEachProvider(db => AreEqual(
+				from p in list                          where p.IsMale select p.PersonID,
+				from p in db.GetTable<PersonBoolTest>() where p.IsMale select p.PersonID));
+		}
+
+		//[Test]
+		public void BoolTest2()
+		{
+			List<PersonBoolTest> list;
+
+			using (var db = new TestDbManager())
+				list = db.GetTable<PersonBoolTest>().ToList();
+
+			ForEachProvider(db => AreEqual(
+				from p in list                          where p.IsMale == true select p.PersonID,
+				from p in db.GetTable<PersonBoolTest>() where p.IsMale == true select p.PersonID));
+		}
+
+		[Test]
+		public void BoolTest31()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types2 where (t.BoolValue ?? false) select t,
+				from t in db.Types2 where t.BoolValue.Value      select t));
+		}
+
+		[Test]
+		public void BoolTest32()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types2 where (t.BoolValue ?? false) select t,
+				from t in db.Types2 where t.BoolValue == true    select t));
+		}
+
+		[Test]
+		public void BoolTest33()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types2 where (t.BoolValue ?? false) select t,
+				from t in db.Types2 where true == t.BoolValue    select t));
+		}
+
+		[Test]
+		public void LongTest1()
+		{
+			ForEachProvider(db =>
+			{
+				uint value = 0;
+
+				var q =
+					from t in db.Types2
+					where t.BigIntValue == value
+					select t;
+
+				q.ToList();
+			});
+		}
+
+		[Test]
+		public void CompareNullableInt()
+		{
+			int? param = null;
+
+			ForEachProvider(db => AreEqual(
+				from t in    Parent where param == null || t.Value1 == param select t,
+				from t in db.Parent where param == null || t.Value1 == param select t));
+
+			param = 1;
+
+			ForEachProvider(db => AreEqual(
+				from t in    Parent where param == null || t.Value1 == param select t,
+				from t in db.Parent where param == null || t.Value1 == param select t));
+		}
+
+		[Test]
+		public void CompareNullableBoolean1()
+		{
+			bool? param = null;
+
+			ForEachProvider(db => AreEqual(
+				from t in    Types where param == null || t.BoolValue == param select t,
+				from t in db.Types where param == null || t.BoolValue == param select t));
+
+			param = true;
+
+			ForEachProvider(db => AreEqual(
+				from t in    Types where param == null || t.BoolValue == param select t,
+				from t in db.Types where param == null || t.BoolValue == param select t));
+		}
+
+		[Test]
+		public void CompareNullableBoolean2()
+		{
+			short? param1 = null;
+			bool?  param2 = null;
+
+			ForEachProvider(db => AreEqual(
+				from t1 in    Types
+				join t2 in    Types on t1.ID equals t2.ID
+				where (param1 == null || t1.SmallIntValue == param1) && (param2 == null || t1.BoolValue == param2)
+				select t1,
+				from t1 in db.Types
+				join t2 in db.Types on t1.ID equals t2.ID
+				where (param1 == null || t1.SmallIntValue == param1) && (param2 == null || t1.BoolValue == param2)
+				select t1));
+
+			//param1 = null;
+			param2 = false;
+
+			ForEachProvider(db => AreEqual(
+				from t1 in    Types
+				join t2 in    Types on t1.ID equals t2.ID
+				where (param1 == null || t1.SmallIntValue == param1) && (param2 == null || t1.BoolValue == param2)
+				select t1,
+				from t1 in db.Types
+				join t2 in db.Types on t1.ID equals t2.ID
+				where (param1 == null || t1.SmallIntValue == param1) && (param2 == null || t1.BoolValue == param2)
+				select t1));
+		}
+
+		[Test]
+		public void CompareNullableBoolean3()
+		{
+			short? param1 = null;
+			bool?  param2 = false;
+
+			ForEachProvider(db => AreEqual(
+				from t in    Types where (param1 == null || t.SmallIntValue == param1) && (param2 == null || t.BoolValue == param2) select t,
+				from t in db.Types where (param1 == null || t.SmallIntValue == param1) && (param2 == null || t.BoolValue == param2) select t));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/UnitTests.Linq.Interface.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,185 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{D527524F-EC92-465E-9CAE-86278121675A}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>UnitTests.Linq.Interface</RootNamespace>
+    <AssemblyName>UnitTests.Linq.Interface</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug FW 3.5|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\Debug FW 3.5\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\UnitTests.Linq.Interface.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <WarningLevel>4</WarningLevel>
+    <Optimize>false</Optimize>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;MONO</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\UnitTests.Linq.Interface.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+    <WarningLevel>4</WarningLevel>
+    <Optimize>false</Optimize>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\UnitTests.Linq.Interface.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+    </Reference>
+    <Reference Include="System.Core">
+    </Reference>
+    <Reference Include="System.Data.Linq">
+    </Reference>
+    <Reference Include="System.Runtime.Serialization">
+    </Reference>
+    <Reference Include="System.ServiceModel">
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+    </Reference>
+    <Reference Include="System.Data">
+    </Reference>
+    <Reference Include="System.Xml">
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="ITestDataContext.cs" />
+    <Compile Include="Model\BinaryData.cs" />
+    <Compile Include="Model\PostgreSQLSpecific.cs" />
+    <Compile Include="Model\DataTypeTest.cs" />
+    <Compile Include="Model\Doctor.cs" />
+    <Compile Include="Model\EditableParent.cs" />
+    <Compile Include="Model\FirebirdSpecific.cs" />
+    <Compile Include="Model\Gender.cs" />
+    <Compile Include="Model\LinqDataTypes.cs" />
+    <Compile Include="Model\Northwind.cs" />
+    <Compile Include="Model\NorthwindDB.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Model\OracleSpecific.cs" />
+    <Compile Include="Model\ParentChild.cs" />
+    <Compile Include="Model\Patient.cs" />
+    <Compile Include="Model\Person.cs" />
+    <Compile Include="Model\TestIdentity.cs" />
+    <Compile Include="Model\TypeValue.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="TestDbManager.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="TestServiceModelDataContext.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/UnitTests.Linq.VisualBasic.vbproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,178 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <RootNamespace>Data.Linq</RootNamespace>
+    <AssemblyName>UnitTests.Linq.VisualBasic</AssemblyName>
+    <FileAlignment>512</FileAlignment>
+    <MyType>Windows</MyType>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <OptionExplicit>On</OptionExplicit>
+    <OptionCompare>Binary</OptionCompare>
+    <OptionStrict>Off</OptionStrict>
+    <OptionInfer>On</OptionInfer>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <DefineDebug>true</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DocumentationFile>UnitTests.Linq.VisualBasic.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022,42353,42354,42355</NoWarn>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <DefineDebug>false</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DocumentationFile>UnitTests.Linq.VisualBasic.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022,42353,42354,42355</NoWarn>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug FW 3.5|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <DefineDebug>true</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <OutputPath>bin\Debug FW 3.5\</OutputPath>
+    <DocumentationFile>UnitTests.Linq.VisualBasic.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022,42353,42354,42355</NoWarn>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\UnitTests.Linq.VisualBasic.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.vb</CodeAnalysisModuleSuppressionsFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <DefineDebug>true</DefineDebug>
+    <DefineTrace>true</DefineTrace>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DocumentationFile>UnitTests.Linq.VisualBasic.xml</DocumentationFile>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022,42353,42354,42355</NoWarn>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\UnitTests.Linq.VisualBasic.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.vb</CodeAnalysisModuleSuppressionsFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <DefineTrace>true</DefineTrace>
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DocumentationFile>UnitTests.Linq.VisualBasic.xml</DocumentationFile>
+    <Optimize>true</Optimize>
+    <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022,42353,42354,42355</NoWarn>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\UnitTests.Linq.VisualBasic.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.vb</CodeAnalysisModuleSuppressionsFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Import Include="Microsoft.VisualBasic" />
+    <Import Include="System" />
+    <Import Include="System.Collections" />
+    <Import Include="System.Collections.Generic" />
+    <Import Include="System.Data" />
+    <Import Include="System.Diagnostics" />
+    <Import Include="System.Linq" />
+    <Import Include="System.Xml.Linq" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="VisualBasicCommon.vb" />
+    <Compile Include="CompilerServices.vb" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="UnitTests.Linq.Interface.csproj">
+      <Project>{D527524F-EC92-465E-9CAE-86278121675A}</Project>
+      <Name>UnitTests.Linq.Interface</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="My Project\" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/UnitTests.Linq.csproj	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,386 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{07997A18-86D3-47AC-A514-AB1B03E6AEC8}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Data.Linq</RootNamespace>
+    <AssemblyName>UnitTests.Linq</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <TargetFrameworkProfile />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;FW4;MOBILE1</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <NoWarn>649</NoWarn>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE;FW4</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug FW 3.5|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\Debug FW 3.5\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\UnitTests.Linq.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DebugMono|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\DebugMono\</OutputPath>
+    <DefineConstants>TRACE;DEBUG;FW4</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\UnitTests.Linq.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'ReleaseMono|AnyCPU'">
+    <OutputPath>bin\ReleaseMono\</OutputPath>
+    <DefineConstants>TRACE;FW4</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\UnitTests.Linq.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Accessibility" />
+    <Reference Include="Devart.Data, Version=5.0.828.0, Culture=neutral, PublicKeyToken=09af7300eec23701, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\dotConnect.Express.for.Oracle.8.1.36\lib\Devart.Data.dll</HintPath>
+    </Reference>
+    <Reference Include="Devart.Data.Oracle, Version=8.1.36.0, Culture=neutral, PublicKeyToken=09af7300eec23701, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\dotConnect.Express.for.Oracle.8.1.36\lib\Devart.Data.Oracle.dll</HintPath>
+    </Reference>
+    <Reference Include="FirebirdSql.Data.FirebirdClient, Version=4.0.0.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\FirebirdSql.Data.FirebirdClient.4.0.0.0\lib\net40-client\FirebirdSql.Data.FirebirdClient.dll</HintPath>
+    </Reference>
+    <Reference Include="IBM.Data.DB2, Version=9.0.0.2, Culture=neutral, PublicKeyToken=7c307b91aa13d208, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\Redist\IBM\IBM.Data.DB2.dll</HintPath>
+    </Reference>
+    <Reference Include="IBM.Data.Informix, Version=3.0.0.2, Culture=neutral, PublicKeyToken=7c307b91aa13d208, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\Redist\IBM\IBM.Data.Informix.dll</HintPath>
+    </Reference>
+    <Reference Include="Mono.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\Npgsql.2.0.14.3\lib\net40\Mono.Security.dll</HintPath>
+    </Reference>
+    <Reference Include="MySql.Data, Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\MySql.Data.6.8.3\lib\net40\MySql.Data.dll</HintPath>
+    </Reference>
+    <Reference Include="Npgsql, Version=2.0.14.3, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\Npgsql.2.0.14.3\lib\net40\Npgsql.dll</HintPath>
+    </Reference>
+    <Reference Include="nunit.framework, Version=2.6.3.13283, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\NUnit.2.6.3\lib\nunit.framework.dll</HintPath>
+    </Reference>
+    <Reference Include="Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86">
+      <Private>True</Private>
+      <HintPath>..\..\packages\odp.net.x86.112.3.20\lib\net40\Oracle.DataAccess.dll</HintPath>
+    </Reference>
+    <Reference Include="Oracle.ManagedDataAccess">
+      <HintPath>..\..\Redist\Oracle\Oracle.ManagedDataAccess.dll</HintPath>
+    </Reference>
+    <Reference Include="Sybase.AdoNet2.AseClient, Version=1.15.192.0, Culture=neutral, PublicKeyToken=95d94fac46c88e1e, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\Redist\Sybase\Sybase.AdoNet2.AseClient.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Configuration" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.Services" />
+    <Reference Include="System.Data.SQLite, Version=1.0.90.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\System.Data.SQLite.1.0.90.0\lib\net40\System.Data.SQLite.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Data.SQLite.Linq, Version=1.0.90.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\System.Data.SQLite.1.0.90.0\lib\net40\System.Data.SQLite.Linq.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
+      <Private>True</Private>
+      <HintPath>..\..\packages\Microsoft.SqlServer.Compact.4.0.8876.1\lib\net40\System.Data.SqlServerCe.dll</HintPath>
+    </Reference>
+    <Reference Include="System.ServiceModel" />
+    <Reference Include="System.Transactions" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="UpdateTest.cs" />
+    <Compile Include="DeleteTest.cs" />
+    <Compile Include="EnumMapping.cs" />
+    <Compile Include="Exceptions\DataExceptionTest.cs" />
+    <Compile Include="ExplicitInterfaceTests.cs" />
+    <Compile Include="TestAK107.cs" />
+    <Compile Include="BatchTest.cs" />
+    <Compile Include="Common.cs" />
+    <Compile Include="ConvertTest.cs" />
+    <Compile Include="CompileTest.cs" />
+    <Compile Include="ComplexTest.cs" />
+    <Compile Include="AssociationTest.cs" />
+    <Compile Include="ConvertExpression.cs" />
+    <Compile Include="ConcatUnionTest.cs" />
+    <Compile Include="IdlTest.mono.cs" />
+    <Compile Include="MultipleQuery.cs" />
+    <Compile Include="CountTest.cs" />
+    <Compile Include="DataContextTest.cs" />
+    <Compile Include="DataServiceTest.cs" />
+    <Compile Include="Exceptions\Common.cs" />
+    <Compile Include="Exceptions\Aggregation.cs" />
+    <Compile Include="Exceptions\DmlTest.cs" />
+    <Compile Include="ExtensionTests.cs" />
+    <Compile Include="GenerateTest.cs" />
+    <Compile Include="IdlTest.cs" />
+    <Compile Include="L2SAttributes.cs" />
+    <Compile Include="ParserTest.cs" />
+    <Compile Include="Providers.cs" />
+    <Compile Include="ProviderSpecific\PostgreSQL.cs" />
+    <Compile Include="ProviderSpecific\Firebird.cs" />
+    <Compile Include="ProviderSpecific\MySqlSprocParameterPrefixTests.cs" />
+    <Compile Include="ProviderSpecific\Oracle.cs" />
+    <Compile Include="TableFunctionTest.cs" />
+    <Compile Include="UserTests\CompareNullableChars.cs" />
+    <Compile Include="UserTests\FirstOrDefaultNullReferenceExceptionTest.cs" />
+    <Compile Include="UserTests\GroupBySubqueryTest.cs" />
+    <Compile Include="UserTests\LetTest.cs" />
+    <Compile Include="UserTests\MultiPartIdentifierTest.cs" />
+    <Compile Include="UserTests\SelectManyUpdateTest.cs" />
+    <Compile Include="UserTests\SelectManyDeleteTest.cs" />
+    <Compile Include="UserTests\UnknownSqlTest.cs" />
+    <Compile Include="UserTests\UnnecessaryInnerJoinTest.cs" />
+    <Compile Include="VisualBasicTest.cs" />
+    <Compile Include="InsertTest.cs" />
+    <Compile Include="ExpressionsTest.cs" />
+    <Compile Include="MathFunctions.cs" />
+    <Compile Include="Exceptions\Inheritance.cs" />
+    <Compile Include="Inheritance.cs" />
+    <Compile Include="ProviderSpecific\Access.cs" />
+    <Compile Include="ProviderSpecific\MsSql2008s.cs" />
+    <Compile Include="ProviderSpecific\SqlCe.cs" />
+    <Compile Include="SetTest.cs" />
+    <Compile Include="SubQuery.cs" />
+    <Compile Include="Types.cs" />
+    <Compile Include="Exceptions\Mapping.cs" />
+    <Compile Include="Functions.cs" />
+    <Compile Include="Distinct.cs" />
+    <Compile Include="ElementOperationTest.cs" />
+    <Compile Include="Exceptions\ElementOperationTest.cs" />
+    <Compile Include="Mapping.cs" />
+    <Compile Include="TakeSkipTest.cs" />
+    <Compile Include="OrderByTest.cs" />
+    <Compile Include="CreateData.cs" />
+    <Compile Include="GroupByTest.cs" />
+    <Compile Include="Exceptions\JoinTest.cs" />
+    <Compile Include="JoinTest.cs" />
+    <Compile Include="DateTimeFunctions.cs" />
+    <Compile Include="SelectManyTest.cs" />
+    <Compile Include="StringFunctions.cs" />
+    <Compile Include="SelectTest.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="SelectScalar.cs" />
+    <Compile Include="TestBase.cs" />
+    <Compile Include="WhereTest.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="..\..\Data\BLToolkitData.sqlite">
+      <Link>BLToolkitData.sqlite</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="DefaultDataProviders.txt" />
+    <Content Include="x64\SQLite.Interop.dll">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="x86\SQLite.Interop.dll">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <None Include="App.config">
+      <SubType>Designer</SubType>
+    </None>
+    <None Include="packages.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\DataProviders\DB2\BLToolkit.Data.DataProvider.DB2.4.csproj">
+      <Project>{86BF4F10-3606-4016-9919-84C3335813B6}</Project>
+      <Name>BLToolkit.Data.DataProvider.DB2.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\DataProviders\DevartOraclePro\BLToolkit.Data.DataProvider.DevartOracle.4.csproj">
+      <Project>{cb303f0b-0aa3-4589-850a-95e985a09492}</Project>
+      <Name>BLToolkit.Data.DataProvider.DevartOracle.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\DataProviders\Firebird\BLToolkit.Data.DataProvider.Firebird.4.csproj">
+      <Project>{C1F8C201-BBD9-44F4-884C-CFF8CC960B68}</Project>
+      <Name>BLToolkit.Data.DataProvider.Firebird.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\DataProviders\Informix\BLToolkit.Data.DataProvider.Informix.4.csproj">
+      <Project>{B1DEA25C-7667-471B-BBAD-64D017FDD104}</Project>
+      <Name>BLToolkit.Data.DataProvider.Informix.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\DataProviders\MySql\BLToolkit.Data.DataProvider.MySql.4.csproj">
+      <Project>{3578AF4C-CBFF-4A38-88F5-E86AC990AFBD}</Project>
+      <Name>BLToolkit.Data.DataProvider.MySql.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\DataProviders\Oracle\BLToolkit.Data.DataProvider.Oracle.4.csproj">
+      <Project>{2B5287F2-A6AC-4D5A-B0A8-01C06144824D}</Project>
+      <Name>BLToolkit.Data.DataProvider.Oracle.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\DataProviders\Oracle\BLToolkit.Data.DataProvider.OracleManaged.4.csproj">
+      <Project>{785ce174-0a91-465f-9e41-65e6e05a0ec9}</Project>
+      <Name>BLToolkit.Data.DataProvider.OracleManaged.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\DataProviders\PostgreSQL\BLToolkit.Data.DataProvider.PostgreSQL.4.csproj">
+      <Project>{5A556D57-0D68-433B-AD78-02849583582B}</Project>
+      <Name>BLToolkit.Data.DataProvider.PostgreSQL.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\DataProviders\SqlCe\BLToolkit.Data.DataProvider.SqlCe.4.csproj">
+      <Project>{85E90F57-8DE1-4912-8414-28578F4D71CD}</Project>
+      <Name>BLToolkit.Data.DataProvider.SqlCe.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\DataProviders\SQLite\BLToolkit.Data.DataProvider.SQLite.4.csproj">
+      <Project>{3E414663-B673-47A8-AB59-0E08FE43DA86}</Project>
+      <Name>BLToolkit.Data.DataProvider.SQLite.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\DataProviders\Sybase\BLToolkit.Data.DataProvider.Sybase.4.csproj">
+      <Project>{6CD8CC3D-643D-4D09-8660-A26085C44FBC}</Project>
+      <Name>BLToolkit.Data.DataProvider.Sybase.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\Source\BLToolkit.4.csproj">
+      <Project>{0C325F5D-E50E-4340-8724-D29896CCC583}</Project>
+      <Name>BLToolkit.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="UnitTests.Linq.Interface.csproj">
+      <Project>{D527524F-EC92-465E-9CAE-86278121675A}</Project>
+      <Name>UnitTests.Linq.Interface</Name>
+    </ProjectReference>
+    <ProjectReference Include="UnitTests.Linq.VisualBasic.vbproj">
+      <Project>{D11617AB-9F88-4C74-8ABD-F8580DB4B01B}</Project>
+      <Name>UnitTests.Linq.VisualBasic</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.SQL.Server.Compact.3.5">
+      <Visible>False</Visible>
+      <ProductName>SQL Server Compact 3.5 SP2</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="..\..\Data\BLToolkitData.mdb">
+      <Link>BLToolkitData.mdb</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="..\..\Data\BLToolkitData.sdf">
+      <Link>BLToolkitData.sdf</Link>
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
+  <ItemGroup />
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PostBuildEvent>
+    if not exist "$(TargetDir)x86" md "$(TargetDir)x86"
+    xcopy /s /y "$(SolutionDir)packages\Microsoft.SqlServer.Compact.4.0.8876.1\NativeBinaries\x86\*.*" "$(TargetDir)x86"
+    if not exist "$(TargetDir)amd64" md "$(TargetDir)amd64"
+    xcopy /s /y "$(SolutionDir)packages\Microsoft.SqlServer.Compact.4.0.8876.1\NativeBinaries\amd64\*.*" "$(TargetDir)amd64"</PostBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/UpdateTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,545 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using BLToolkit.Data;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+using NUnit.Framework;
+
+using Data.Linq;
+using Data.Linq.Model;
+
+#region ReSharper disable
+// ReSharper disable ConvertToConstant.Local
+#endregion
+
+namespace Update
+{
+	[TestFixture]
+	public class UpdateTest : TestBase
+	{
+		[Test]
+		public void Update1()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					var parent = new Parent1 { ParentID = 1001, Value1 = 1001 };
+
+					db.Parent.Delete(p => p.ParentID > 1000);
+					db.Insert(parent);
+
+					Assert.AreEqual(1, db.Parent.Count (p => p.ParentID == parent.ParentID));
+					Assert.AreEqual(1, db.Parent.Update(p => p.ParentID == parent.ParentID, p => new Parent { ParentID = p.ParentID + 1 }));
+					Assert.AreEqual(1, db.Parent.Count (p => p.ParentID == parent.ParentID + 1));
+				}
+				finally
+				{
+					db.Child.Delete(c => c.ChildID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Update2()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					var parent = new Parent1 { ParentID = 1001, Value1 = 1001 };
+
+					db.Parent.Delete(p => p.ParentID > 1000);
+					db.Insert(parent);
+
+					Assert.AreEqual(1, db.Parent.Count(p => p.ParentID == parent.ParentID));
+					Assert.AreEqual(1, db.Parent.Where(p => p.ParentID == parent.ParentID).Update(p => new Parent { ParentID = p.ParentID + 1 }));
+					Assert.AreEqual(1, db.Parent.Count(p => p.ParentID == parent.ParentID + 1));
+				}
+				finally
+				{
+					db.Child.Delete(c => c.ChildID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Update3()
+		{
+			ForEachProvider(new[] { ProviderName.Informix }, db =>
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Child.Delete(c => c.ChildID > 1000);
+					db.Child.Insert(() => new Child { ParentID = 1, ChildID = id});
+
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id));
+					Assert.AreEqual(1, db.Child.Where(c => c.ChildID == id && c.Parent.Value1 == 1).Update(c => new Child { ChildID = c.ChildID + 1 }));
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id + 1));
+				}
+				finally
+				{
+					db.Child.Delete(c => c.ChildID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Update4()
+		{
+			ForEachProvider(new[] { ProviderName.Informix }, db =>
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Child.Delete(c => c.ChildID > 1000);
+					db.Child.Insert(() => new Child { ParentID = 1, ChildID = id});
+
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id));
+					Assert.AreEqual(1,
+						db.Child
+							.Where(c => c.ChildID == id && c.Parent.Value1 == 1)
+								.Set(c => c.ChildID, c => c.ChildID + 1)
+							.Update());
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id + 1));
+				}
+				finally
+				{
+					db.Child.Delete(c => c.ChildID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Update5()
+		{
+			ForEachProvider(new[] { ProviderName.Informix }, db =>
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Child.Delete(c => c.ChildID > 1000);
+					db.Child.Insert(() => new Child { ParentID = 1, ChildID = id});
+
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id));
+					Assert.AreEqual(1,
+						db.Child
+							.Where(c => c.ChildID == id && c.Parent.Value1 == 1)
+								.Set(c => c.ChildID, () => id + 1)
+							.Update());
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id + 1));
+				}
+				finally
+				{
+					db.Child.Delete(c => c.ChildID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Update6()
+		{
+			ForEachProvider(new[] { ProviderName.Informix }, db =>
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Parent4.Delete(p => p.ParentID > 1000);
+					db.Insert(new Parent4 { ParentID = id, Value1 = TypeValue.Value1 });
+
+					Assert.AreEqual(1, db.Parent4.Count(p => p.ParentID == id && p.Value1 == TypeValue.Value1));
+					Assert.AreEqual(1,
+						db.Parent4
+							.Where(p => p.ParentID == id)
+								.Set(p => p.Value1, () => TypeValue.Value2)
+							.Update());
+					Assert.AreEqual(1, db.Parent4.Count(p => p.ParentID == id && p.Value1 == TypeValue.Value2));
+				}
+				finally
+				{
+					db.Parent4.Delete(p => p.ParentID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Update7()
+		{
+			ForEachProvider(new[] { ProviderName.Informix }, db =>
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Parent4.Delete(p => p.ParentID > 1000);
+					db.Insert(new Parent4 { ParentID = id, Value1 = TypeValue.Value1 });
+
+					Assert.AreEqual(1, db.Parent4.Count(p => p.ParentID == id && p.Value1 == TypeValue.Value1));
+					Assert.AreEqual(1,
+						db.Parent4
+							.Where(p => p.ParentID == id)
+								.Set(p => p.Value1, TypeValue.Value2)
+							.Update());
+					Assert.AreEqual(1, db.Parent4.Count(p => p.ParentID == id && p.Value1 == TypeValue.Value2));
+
+					Assert.AreEqual(1,
+						db.Parent4
+							.Where(p => p.ParentID == id)
+								.Set(p => p.Value1, TypeValue.Value3)
+							.Update());
+					Assert.AreEqual(1, db.Parent4.Count(p => p.ParentID == id && p.Value1 == TypeValue.Value3));
+				}
+				finally
+				{
+					db.Parent4.Delete(p => p.ParentID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Update8()
+		{
+			ForEachProvider(db =>
+			{
+				try
+				{
+					var parent = new Parent1 { ParentID = 1001, Value1 = 1001 };
+
+					db.Parent.Delete(p => p.ParentID > 1000);
+					db.Insert(parent);
+
+					parent.Value1++;
+
+					db.Update(parent);
+
+					Assert.AreEqual(1002, db.Parent.Single(p => p.ParentID == parent.ParentID).Value1);
+				}
+				finally
+				{
+					db.Child.Delete(c => c.ChildID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Update9()
+		{
+			ForEachProvider(new[] { ProviderName.Informix, ProviderName.SqlCe, ProviderName.DB2, ProviderName.Firebird, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.SQLite, ProviderName.Access }, db =>
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Child.Delete(c => c.ChildID > 1000);
+					db.Child.Insert(() => new Child { ParentID = 1, ChildID = id});
+
+					var q =
+						from c in db.Child
+						join p in db.Parent on c.ParentID equals p.ParentID
+						where c.ChildID == id && c.Parent.Value1 == 1
+						select new { c, p };
+
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id));
+					Assert.AreEqual(1, q.Update(db.Child, _ => new Child { ChildID = _.c.ChildID + 1, ParentID = _.p.ParentID }));
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id + 1));
+				}
+				finally
+				{
+					db.Child.Delete(c => c.ChildID > 1000);
+				}
+			});
+		}
+
+		[Test]
+		public void Update10()
+		{
+			ForEachProvider(new[] { ProviderName.Informix, ProviderName.SqlCe, ProviderName.DB2, ProviderName.Firebird, "Oracle", "DevartOracle", ProviderName.PostgreSQL, ProviderName.MySql, ProviderName.SQLite, ProviderName.Access }, db =>
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Child.Delete(c => c.ChildID > 1000);
+					db.Child.Insert(() => new Child { ParentID = 1, ChildID = id});
+
+					var q =
+						from p in db.Parent
+						join c in db.Child on p.ParentID equals c.ParentID
+						where c.ChildID == id && c.Parent.Value1 == 1
+						select new { c, p };
+
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id));
+					Assert.AreEqual(1, q.Update(db.Child, _ => new Child { ChildID = _.c.ChildID + 1, ParentID = _.p.ParentID }));
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id + 1));
+				}
+				finally
+				{
+					db.Child.Delete(c => c.ChildID > 1000);
+				}
+			});
+		}
+
+		//[Test]
+		public void Update11()
+		{
+			ForEachProvider(db =>
+			{
+				var q = db.GetTable<LinqDataTypes2>().Union(db.GetTable<LinqDataTypes2>());
+
+				//db.GetTable<LinqDataTypes2>().Update(_ => q.Contains(_), _ => new LinqDataTypes2 { GuidValue = _.GuidValue });
+
+				q.Update(_ => new LinqDataTypes2 { GuidValue = _.GuidValue });
+			});
+		}
+
+		[Test]
+		public void UpdateAssociation1([DataContexts(ProviderName.Sybase, ProviderName.Informix)] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				const int childId  = 10000;
+				const int parentId = 20000;
+
+				try
+				{
+					db.Child. Delete(x => x.ChildID  == childId);
+					db.Parent.Delete(x => x.ParentID == parentId);
+
+					db.Parent.Insert(() => new Parent { ParentID = parentId, Value1 = parentId });
+					db.Child. Insert(() => new Child  { ChildID = childId, ParentID = parentId });
+
+					var parents =
+						from child in db.Child
+						where child.ChildID == childId
+						select child.Parent;
+
+					Assert.AreEqual(1, parents.Update(db.Parent, x => new Parent { Value1 = 5 }));
+				}
+				finally
+				{
+					db.Child. Delete(x => x.ChildID  == childId);
+					db.Parent.Delete(x => x.ParentID == parentId);
+				}
+			}
+		}
+
+		[Test]
+		public void UpdateAssociation2([DataContexts(ProviderName.Sybase, ProviderName.Informix)] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				const int childId  = 10000;
+				const int parentId = 20000;
+
+				try
+				{
+					db.Child. Delete(x => x.ChildID  == childId);
+					db.Parent.Delete(x => x.ParentID == parentId);
+
+					db.Parent.Insert(() => new Parent { ParentID = parentId, Value1 = parentId });
+					db.Child. Insert(() => new Child  { ChildID = childId, ParentID = parentId });
+
+					var parents =
+						from child in db.Child
+						where child.ChildID == childId
+						select child.Parent;
+
+					Assert.AreEqual(1, parents.Update(x => new Parent { Value1 = 5 }));
+				}
+				finally
+				{
+					db.Child. Delete(x => x.ChildID  == childId);
+					db.Parent.Delete(x => x.ParentID == parentId);
+				}
+			}
+		}
+
+		[Test]
+		public void UpdateAssociation3([DataContexts(ProviderName.Sybase, ProviderName.Informix)] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				const int childId  = 10000;
+				const int parentId = 20000;
+
+				try
+				{
+					db.Child. Delete(x => x.ChildID  == childId);
+					db.Parent.Delete(x => x.ParentID == parentId);
+
+					db.Parent.Insert(() => new Parent { ParentID = parentId, Value1 = parentId });
+					db.Child. Insert(() => new Child  { ChildID = childId, ParentID = parentId });
+
+					var parents =
+						from child in db.Child
+						where child.ChildID == childId
+						select child.Parent;
+
+					Assert.AreEqual(1, parents.Update(x => x.ParentID > 0, x => new Parent { Value1 = 5 }));
+				}
+				finally
+				{
+					db.Child. Delete(x => x.ChildID  == childId);
+					db.Parent.Delete(x => x.ParentID == parentId);
+				}
+			}
+		}
+
+		[Test]
+		public void UpdateAssociation4([DataContexts(ProviderName.Sybase, ProviderName.Informix)] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				const int childId  = 10000;
+				const int parentId = 20000;
+
+				try
+				{
+					db.Child. Delete(x => x.ChildID  == childId);
+					db.Parent.Delete(x => x.ParentID == parentId);
+
+					db.Parent.Insert(() => new Parent { ParentID = parentId, Value1 = parentId });
+					db.Child. Insert(() => new Child  { ChildID = childId, ParentID = parentId });
+
+					var parents =
+						from child in db.Child
+						where child.ChildID == childId
+						select child.Parent;
+
+					Assert.AreEqual(1, parents.Set(x => x.Value1, 5).Update());
+				}
+				finally
+				{
+					db.Child. Delete(x => x.ChildID  == childId);
+					db.Parent.Delete(x => x.ParentID == parentId);
+				}
+			}
+		}
+
+		static readonly Func<TestDbManager,int,string,int> _updateQuery =
+			CompiledQuery.Compile   <TestDbManager,int,string,int>((ctx,key,value) =>
+				ctx.Person
+					.Where(_ => _.ID == key)
+					.Set(_ => _.FirstName, value)
+					.Update());
+
+		[Test]
+		public void CompiledUpdate()
+		{
+			using (var ctx = new TestDbManager())
+			{
+				_updateQuery(ctx, 12345, "54321");
+			}
+		}
+
+		[TableName("LinqDataTypes")]
+		class Table1
+		{
+			public int  ID;
+			public bool BoolValue;
+
+			[Association(ThisKey = "ID", OtherKey = "ParentID", CanBeNull = false)]
+			public List<Table2> Tables2;
+		}
+
+		[TableName("Parent")]
+		class Table2
+		{
+			public int  ParentID;
+			public bool Value1;
+
+			[Association(ThisKey = "ParentID", OtherKey = "ID", CanBeNull = false)]
+			public Table1 Table1;
+		}
+
+		[Test]
+		public void UpdateAssociation5([DataContexts(
+			ProviderName.Access, ProviderName.DB2, ProviderName.Firebird, ProviderName.Informix, "Oracle", ProviderName.PostgreSQL, ProviderName.SqlCe, ProviderName.SQLite,
+			ExcludeLinqService=true)] string context)
+		{
+			using (var db = new DbManager(context))
+			{
+				var ids = new[] { 10000, 20000 };
+
+				db.GetTable<Table2>()
+					.Where (x => ids.Contains(x.ParentID))
+					.Select(x => x.Table1)
+					.Distinct()
+					.Set(y => y.BoolValue, y => y.Tables2.All(x => x.Value1))
+					.Update();
+
+				var idx = db.LastQuery.IndexOf("INNER JOIN");
+
+				Assert.That(idx, Is.Not.EqualTo(-1));
+
+				idx = db.LastQuery.IndexOf("INNER JOIN", idx + 1);
+
+				Assert.That(idx, Is.EqualTo(-1));
+			}
+		}
+
+		[Test]
+		public void AsUpdatableTest([DataContexts(ProviderName.Informix)] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				try
+				{
+					var id = 1001;
+
+					db.Child.Delete(c => c.ChildID > 1000);
+					db.Child.Insert(() => new Child { ParentID = 1, ChildID = id});
+
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id));
+
+					var q  = db.Child.Where(c => c.ChildID == id && c.Parent.Value1 == 1);
+					var uq = q.AsUpdatable();
+
+					uq = uq.Set(c => c.ChildID, c => c.ChildID + 1);
+
+					Assert.AreEqual(1, uq.Update());
+					Assert.AreEqual(1, db.Child.Count(c => c.ChildID == id + 1));
+				}
+				finally
+				{
+					db.Child.Delete(c => c.ChildID > 1000);
+				}
+			}
+		}
+
+		[TableName("GrandChild")]
+		class Table3
+		{
+			[PrimaryKey(1)] public int? ParentID;
+			[PrimaryKey(2)] public int? ChildID;
+			                public int? GrandChildID;
+		}
+
+		[Test]
+		public void UpdateNullablePrimaryKey([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				db.Update(new Table3 { ParentID = 10000, ChildID = null, GrandChildID = 1000 });
+
+				if (db is DbManager)
+					Assert.IsTrue(((DbManager)db).LastQuery.Contains("IS NULL"));
+
+				db.Update(new Table3 { ParentID = 10000, ChildID = 111, GrandChildID = 1000 });
+
+				if (db is DbManager)
+					Assert.IsFalse(((DbManager)db).LastQuery.Contains("IS NULL"));
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/UserTests/CompareNullableChars.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,47 @@
+using System;
+using System.Linq;
+
+using BLToolkit.Data;
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+using NUnit.Framework;
+
+namespace Data.Linq.UserTests
+{
+	[TestFixture]
+	public class CompareNullableChars : TestBase
+	{
+		class Table1
+		{
+			[PrimaryKey(1)]
+			[Identity] public Int64 Field1 { get; set; }
+			[Nullable] public Char? Foeld2 { get; set; }
+		}
+
+		class Repository : DbManager
+		{
+			public Repository(string configurationString) : base(configurationString)
+			{
+			}
+
+			public Table<Table1> Table1 { get { return this.GetTable<Table1>(); } }
+		}
+
+		[Test]
+		public void Test([DataContexts(ExcludeLinqService=true)] string context)
+		{
+			using (var db = new Repository(context))
+			{
+				var q =
+					from current  in db.Table1
+					from previous in db.Table1
+					where current.Foeld2 == previous.Foeld2
+					select new { current.Field1, Field2 = previous.Field1 };
+
+				var sql = q.ToString();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/UserTests/FirstOrDefaultNullReferenceExceptionTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,70 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+using NUnit.Framework;
+
+namespace Data.Linq.UserTests
+{
+	[TestFixture]
+	public class FirstOrDefaultNullReferenceExceptionTest : TestBase
+	{
+		[TableName("GrandChild")]
+		class Table1
+		{
+			public int ChildID;
+		}
+
+		[TableName("Child")]
+		class Table2
+		{
+			public int ChildID;
+			public int ParentID;
+
+			[Association(ThisKey = "ChildID", OtherKey = "ChildID", CanBeNull = true)]
+			public List<Table1> GrandChildren { get; set; }
+		}
+
+		[TableName("Parent")]
+		class Table3
+		{
+			public int ParentID { get; set; }
+
+			[Association(ThisKey = "ParentID", OtherKey = "ParentID", CanBeNull = true)]
+			public List<Table2> Children { get; set; }
+		}
+
+		[Test]
+		public void Test()
+		{
+			using (var db = new TestDbManager())
+			{
+				/*
+				var query =
+					from t3 in db.Parent
+					//let t1 = t3.Children.SelectMany(x => x.GrandChildren)
+					//let t2 = t3.Table2s.SelectMany(x => x.Table1s)
+					select new
+					{
+						//c2 = t1.Count(),
+						c1 = t3.Children.SelectMany(x => x.GrandChildren),
+					};
+				 */
+
+				var query =
+					from t3 in db.GetTable<Table3>()
+					let t1 = t3.Children.SelectMany(x => x.GrandChildren)
+					//let t2 = t3.Table2s.SelectMany(x => x.Table1s)
+					select new
+					{
+						c2 = t1.Count(),
+						c1 = t3.Children.SelectMany(x => x.GrandChildren).Count(),
+					};
+
+				query.FirstOrDefault(p => p.c1 > 10);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/UserTests/GroupBySubqueryTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,104 @@
+using System;
+using System.Linq;
+
+using BLToolkit.Mapping;
+
+using NUnit.Framework;
+
+namespace Data.Linq.UserTests
+{
+	[TestFixture]
+	public class GroupBySubqueryTest : TestBase
+	{
+		class Table1
+		{
+			public long Field1 { get; set; }
+			public int  Field2 { get; set; }
+
+			[Nullable]
+			public int? Field3 { get; set; }
+
+			[Association(ThisKey = "Field1", OtherKey = "Field1", CanBeNull = false)]
+			public Table3 Ref1 { get; set; }
+
+			[Association(ThisKey = "Field3", OtherKey = "Field3", CanBeNull = true)]
+			public Table5 Ref2 { get; set; }
+
+			[Association(ThisKey = "Field2", OtherKey = "Field2", CanBeNull = true)]
+			public Table2 Ref3 { get; set; }
+		}
+
+		class Table2
+		{
+			public int    Field2 { get; set; }
+			public string Field4 { get; set; }
+		}
+
+		class Table3
+		{
+			public int  Field5 { get; set; }
+			public long Field1 { get; set; }
+
+			[AssociationAttribute(ThisKey = "Field5", OtherKey = "Field5", CanBeNull = false)]
+			public Table4 Ref4 { get; set; }
+		}
+
+		class Table4
+		{
+			public int Field5 { get; set; }
+			public int Field6 { get; set; }
+		}
+
+		public class Table5
+		{
+			[Nullable]
+			public int? Field3 { get; set; }
+			public int  Field7 { get; set; }
+
+			[Association(ThisKey = "Field7", OtherKey = "Field7", CanBeNull = true)]
+			public Table6 Ref5 { get; set; }
+		}
+
+		public class Table6
+		{
+			public int    Field7 { get; set; }
+			public string Field8 { get; set; }
+		}
+
+		[Test]
+		public void Test()
+		{
+			using (var db = new TestDbManager())
+			{
+				var q = (
+					from t1 in db.GetTable<Table1>()
+					where t1.Field3 != null
+					select new
+					{
+						t1.Ref1.Ref4.Field6, t1.Ref3.Field4,
+						Field1 = t1.Ref2.Ref5.Field8 ?? string.Empty
+					}
+				).Distinct();
+
+				var sql1 = q.ToString();
+
+				var q2 =
+					from t3 in q
+					group t3 by new { t3.Field6, t3.Field4 }
+					into g
+					where g.Count() > 1
+					select new { g.Key.Field6, EngineeringCircuitNumber = g.Key.Field4, Count = g.Count() };
+
+				var sql2 = q2.ToString();
+
+				var idx = sql2.IndexOf("DISTINCT");
+
+				Assert.That(idx, Is.GreaterThanOrEqualTo(0));
+
+				idx = sql2.IndexOf("Field8", idx);
+
+				Assert.That(idx, Is.GreaterThanOrEqualTo(0));
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/UserTests/LetTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,96 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+
+using BLToolkit.Data.Linq;
+using BLToolkit.Mapping;
+
+using NUnit.Framework;
+
+namespace Data.Linq.UserTests
+{
+	[TestFixture]
+	public class LetTest : TestBase
+	{
+		class Table1
+		{
+			public int  Field3;
+			public int? Field5;
+
+			[Association(ThisKey="Field5", OtherKey="Field3", CanBeNull=true)]
+			public Table1 Ref1 { get; set; }
+
+			[Association(ThisKey="Field3", OtherKey="Field3", CanBeNull=true)]
+			public List<Table3> Ref2 { get; set; }
+		}
+
+		class Table2
+		{
+			public int? Field6;
+
+			[Association(ThisKey = "Field6", OtherKey = "Field6", CanBeNull = true)]
+			public Table3 Ref3 { get; set; }
+		}
+
+		class Table3
+		{
+			public int? Field6;
+			public int  Field3;
+			public int  Field4;
+
+			[Association(ThisKey="Field3", OtherKey="Field3", CanBeNull=true)]
+			public Table1 Ref4 { get; set; }
+
+			[Association(ThisKey="Field4", OtherKey="Field4", CanBeNull=true)]
+			public Table7 Ref5 { get; set; }
+
+			[Association(ThisKey = "Field6", OtherKey = "Field6", CanBeNull = true)]
+			public List<Table2> Ref9 { get; set; }
+		}
+
+		class Table7
+		{
+			public int    Field4;
+			public string Field8;
+		}
+
+		[Test]
+		public void LetTest1()
+		{
+			using (var repository = new TestDbManager())
+			{
+				var q =
+					from t1 in repository.GetTable<Table2>()
+					from t2 in 
+						from t5 in t1.Ref3.Ref4.Ref1.Ref2
+						let  t3 = t1.Ref3
+						where t3.Ref5.Field8 == t5.Ref5.Field8
+						from t4 in t5.Ref9
+						select t4
+					select t1;
+
+				var linqResult = q.ToString();
+			}
+		}
+
+		[Test]
+		public void LetTest2()
+		{
+			using (var repository = new TestDbManager())
+			{
+				var q =
+					from t1 in repository.GetTable<Table2>()
+					from t2 in 
+						from t5 in t1.Ref3.Ref4.Ref1.Ref2
+						let  t3 = t1.Ref3
+						where t3.Ref5 == t5.Ref5
+						from t4 in t5.Ref9
+						select t4
+					select t1;
+
+				var linqResult = q.ToString();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/UserTests/LetTest1.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,217 @@
+//---------------------------------------------------------------------------------------------------
+// This code was generated by BLToolkit.
+//---------------------------------------------------------------------------------------------------
+using System;
+using System.Linq;
+using System.Linq.Expressions;
+using BLToolkit.Data.Linq;
+using LightStation.API;
+using LightStation.Storage.Relational;
+using NUnit.Framework;
+
+namespace LightStation.API
+{
+	public interface IStationObjectID
+	{
+	}
+}
+
+namespace LightStation.API
+{
+	[SerializableAttribute()]
+	public class MachineIdentifier : LightStation.API.StationObject, LightStation.Utils.Validation.IValidatable
+	{
+		public LightStation.API.StationObjectID OrganizationId { get; set; }
+
+		public string Value { get; set; }
+
+		public LightStation.API.StationObjectID SymbolId { get; set; }
+
+		public DateTime StartDate { get; set; }
+
+		public DateTime? EndDate { get; set; }
+	}
+
+	[SerializableAttribute()]
+	public struct NullableStationObjectID : IStationObjectID
+	{
+		public NullableStationObjectID(int? value)
+		{
+			throw new NotImplementedException();
+		}
+
+		public int? Value { get; set; }
+	}
+
+	[System.SerializableAttribute()]
+	public abstract class StationObject : Utils.Validation.IValidatable
+	{
+		public StationObjectID Id { get; set; }
+	}
+
+	[System.SerializableAttribute()]
+	public struct StationObjectID : IStationObjectID
+	{
+		public StationObjectID(int value)
+		{
+		}
+
+		public int Value { get; set; }
+	}
+
+	[Serializable]
+	public class Symbol : LightStation.API.StationObject, LightStation.Utils.Validation.IValidatable
+	{
+		public string UniqueId { get; set; }
+
+		public string TypeName { get; set; }
+
+		public bool IsActive { get; set; }
+
+		public DateTime StartDate { get; set; }
+
+		public DateTime? EndDate { get; set; }
+
+		public string Description { get; set; }
+
+		public string Extra { get; set; }
+
+		public LightStation.API.NullableStationObjectID DataProvenanceId { get; set; }
+
+		public LightStation.API.NullableStationObjectID CountryId { get; set; }
+
+		public LightStation.API.NullableStationObjectID CurrencyId { get; set; }
+
+		public LightStation.API.NullableStationObjectID DataProviderAccountId { get; set; }
+
+		public LightStation.API.NullableStationObjectID PrimaryExchangeId { get; set; }
+
+		public LightStation.API.NullableStationObjectID CompositeExchangeId { get; set; }
+
+		public string Name { get; set; }
+
+		public string PrimaryTicker { get; set; }
+
+		public DateTime AsOfDate { get; set; }
+	}
+}
+
+namespace LightStation.Storage.Relational
+{
+	//[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+	//class <>c__DisplayClass3
+	//{
+	//	public LightStation.Storage.Relational.IGenericQueryDataSource ds;
+	//
+	//	public Nullable<DateTime> asOfDate;
+	//}
+
+	public interface IGenericQueryDataSource
+	{
+		System.Linq.IQueryable<LightStation.API.MachineIdentifier> MachineIdentifiers { get; set; }
+	}
+
+	public interface IHasDbId<I>
+	{
+	}
+
+	[BLToolkit.DataAccess.TableNameAttribute(Name = "ls_exchange")]
+	public class ls_exchange : LightStation.Storage.Relational.IHasDbId<int>
+	{
+		public int organization_id { get; set; }
+	}
+
+	[BLToolkit.DataAccess.TableNameAttribute(Name = "ls_symbol")]
+	public class ls_symbol : LightStation.Storage.Relational.IHasDbId<int>
+	{
+		[BLToolkit.DataAccess.PrimaryKeyAttribute((Int32)1)]
+		[BLToolkit.DataAccess.IdentityAttribute()]
+		public int id { get; set; }
+
+		public string unique_id { get; set; }
+
+		public bool is_active { get; set; }
+
+		[BLToolkit.Mapping.NullableAttribute()]
+		public string type_name { get; set; }
+
+		public DateTime start_date { get; set; }
+
+		[BLToolkit.Mapping.NullableAttribute()]
+		public Nullable<DateTime> end_date { get; set; }
+
+		[BLToolkit.Mapping.NullableAttribute()]
+		public Nullable<int> data_provenance_id { get; set; }
+
+		[BLToolkit.Mapping.NullableAttribute()]
+		public Nullable<int> country_id { get; set; }
+
+		[BLToolkit.Mapping.NullableAttribute()]
+		public Nullable<int> currency_id { get; set; }
+
+		[BLToolkit.Mapping.NullableAttribute()]
+		public Nullable<int> data_provider_account_id { get; set; }
+
+		[BLToolkit.Mapping.NullableAttribute()]
+		public Nullable<int> primary_exchange_id { get; set; }
+
+		[BLToolkit.Mapping.NullableAttribute()]
+		public Nullable<int> composite_exchange_id { get; set; }
+
+		[BLToolkit.Mapping.NullableAttribute()]
+		public string description { get; set; }
+
+		[BLToolkit.Mapping.NullableAttribute()]
+		public string extra { get; set; }
+
+		[BLToolkit.Mapping.AssociationAttribute(ThisKey = "primary_exchange_id", OtherKey = "id", CanBeNull = true)]
+		public LightStation.Storage.Relational.ls_exchange symbolexchangeprimary { get; set; }
+	}
+}
+
+namespace LightStation.Storage.Relational.Tests.IRelationalStorageTests
+{
+	//[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+	//class <>c__DisplayClassa5
+	//{
+	//	public LightStation.API.Symbol symbol;
+	//}
+}
+
+namespace LightStation.Utils.Validation
+{
+	public interface IValidatable
+	{
+	}
+}
+
+namespace Data.Linq
+{
+	[TestFixture]
+	public class UserTest : TestBase
+	{
+		[Test]
+		public void Test()
+		{
+			// Table(ls_symbol).Select(symbol => new <>f__AnonymousType1`2(symbol = symbol, ids = value(LightStation.Storage.Relational.RelationalDbToBusinessObjectConverterExtensions+<>c__DisplayClass3).ds.MachineIdentifiers.Where(identifier => (((Convert(identifier.StartDate) <= value(LightStation.Storage.Relational.RelationalDbToBusinessObjectConverterExtensions+<>c__DisplayClass3).asOfDate) AndAlso ((identifier.EndDate == Convert(null)) OrElse (identifier.EndDate >= value(LightStation.Storage.Relational.RelationalDbToBusinessObjectConverterExtensions+<>c__DisplayClass3).asOfDate))) AndAlso (identifier.SymbolId.Value == symbol.id))))).Select(<>h__TransparentIdentifier0 => new <>f__AnonymousType2`2(<>h__TransparentIdentifier0 = <>h__TransparentIdentifier0, name = <>h__TransparentIdentifier0.ids.Where(x => (Convert(x.OrganizationId) == Convert(Organization.SelfId))).Select(x => x.Value).FirstOrDefault())).Select(<>h__TransparentIdentifier1 => new <>f__AnonymousType3`2(<>h__TransparentIdentifier1 = <>h__TransparentIdentifier1, primaryTicker = <>h__TransparentIdentifier1.<>h__TransparentIdentifier0.ids.Where(x => (Convert(x.OrganizationId) == <>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.symbolexchangeprimary.organization_id)).Select(x => x.Value).FirstOrDefault())).Select(<>h__TransparentIdentifier2 => new Symbol() {Id = new StationObjectID() {Value = <>h__TransparentIdentifier2.<>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.id}, UniqueId = <>h__TransparentIdentifier2.<>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.unique_id, TypeName = <>h__TransparentIdentifier2.<>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.type_name, IsActive = <>h__TransparentIdentifier2.<>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.is_active, StartDate = <>h__TransparentIdentifier2.<>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.start_date, EndDate = <>h__TransparentIdentifier2.<>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.end_date, Description = <>h__TransparentIdentifier2.<>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.description, Extra = <>h__TransparentIdentifier2.<>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.extra, DataProvenanceId = new NullableStationObjectID() {Value = <>h__TransparentIdentifier2.<>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.data_provenance_id}, CountryId = new NullableStationObjectID() {Value = <>h__TransparentIdentifier2.<>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.country_id}, CurrencyId = new NullableStationObjectID() {Value = <>h__TransparentIdentifier2.<>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.currency_id}, DataProviderAccountId = new NullableStationObjectID() {Value = <>h__TransparentIdentifier2.<>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.data_provider_account_id}, PrimaryExchangeId = new NullableStationObjectID() {Value = <>h__TransparentIdentifier2.<>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.primary_exchange_id}, CompositeExchangeId = new NullableStationObjectID() {Value = <>h__TransparentIdentifier2.<>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.composite_exchange_id}, Name = <>h__TransparentIdentifier2.<>h__TransparentIdentifier1.name, PrimaryTicker = <>h__TransparentIdentifier2.primaryTicker, AsOfDate = value(LightStation.Storage.Relational.RelationalDbToBusinessObjectConverterExtensions+<>c__DisplayClass3).asOfDate.Value}).First(x => (Convert(x.Id) == Convert(value(LightStation.Storage.Relational.Tests.IRelationalStorageTests.SymbolTests+<>c__DisplayClassa5).symbol.Id)))
+			ForEachProvider(db =>
+				db.GetTable<ls_symbol>()
+					.Select(
+						// Unknown expression.
+						symbol => new { symbol = symbol, ids = value(LightStation.Storage.Relational.RelationalDbToBusinessObjectConverterExtensions+<>c__DisplayClass3).ds.MachineIdentifiers.Where(identifier => (((Convert(identifier.StartDate) <= value(LightStation.Storage.Relational.RelationalDbToBusinessObjectConverterExtensions+<>c__DisplayClass3).asOfDate) AndAlso ((identifier.EndDate == Convert(null)) OrElse (identifier.EndDate >= value(LightStation.Storage.Relational.RelationalDbToBusinessObjectConverterExtensions+<>c__DisplayClass3).asOfDate))) AndAlso (identifier.SymbolId.Value == symbol.id)))))
+					.Select(
+						// Unknown expression.
+						tp0 => new { tp0 = tp0, name = tp0.ids.Where(x => (Convert(x.OrganizationId) == Convert(Organization.SelfId))).Select(x => x.Value).FirstOrDefault()) }
+					.}Select(
+						// Unknown expression.
+						tp1 => new <>f__AnonymousType3`2(tp1 = tp1, primaryTicker = tp1.tp0.ids.Where(x => (Convert(x.OrganizationId) == tp1.tp0.symbol.symbolexchangeprimary.organization_id)).Select(x => x.Value).FirstOrDefault()))
+					.Select(
+						// Unknown expression.
+						tp2 => new Symbol() {Id = new StationObjectID() {Value = tp2.tp1.tp0.symbol.id}, UniqueId = tp2.tp1.tp0.symbol.unique_id, TypeName = tp2.tp1.tp0.symbol.type_name, IsActive = tp2.tp1.tp0.symbol.is_active, StartDate = tp2.tp1.tp0.symbol.start_date, EndDate = tp2.tp1.tp0.symbol.end_date, Description = tp2.tp1.tp0.symbol.description, Extra = tp2.tp1.tp0.symbol.extra, DataProvenanceId = new NullableStationObjectID() {Value = tp2.tp1.tp0.symbol.data_provenance_id}, CountryId = new NullableStationObjectID() {Value = tp2.tp1.tp0.symbol.country_id}, CurrencyId = new NullableStationObjectID() {Value = tp2.tp1.tp0.symbol.currency_id}, DataProviderAccountId = new NullableStationObjectID() {Value = tp2.tp1.tp0.symbol.data_provider_account_id}, PrimaryExchangeId = new NullableStationObjectID() {Value = tp2.tp1.tp0.symbol.primary_exchange_id}, CompositeExchangeId = new NullableStationObjectID() {Value = tp2.tp1.tp0.symbol.composite_exchange_id}, Name = tp2.tp1.name, PrimaryTicker = tp2.primaryTicker, AsOfDate = value(LightStation.Storage.Relational.RelationalDbToBusinessObjectConverterExtensions+<>c__DisplayClass3).asOfDate.Value})
+					.First<LightStation.API.Symbol>(
+						// Unknown expression.
+						x => (Convert(x.Id) == Convert(value(LightStation.Storage.Relational.Tests.IRelationalStorageTests.SymbolTests+<>c__DisplayClassa5).symbol.Id))));
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/UserTests/LetTest2.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,223 @@
+//---------------------------------------------------------------------------------------------------
+// This code was generated by BLToolkit.
+//---------------------------------------------------------------------------------------------------
+using System;
+using System.Linq.Expressions;
+/*
+using NUnit.Framework;
+
+namespace LightStation.API
+{
+	public interface IStationObjectID
+	{
+	}
+}
+
+namespace LightStation.API
+{
+	[System.SerializableAttribute()]
+	public class MachineIdentifier : LightStation.API.StationObject, LightStation.Utils.Validation.IValidatable
+	{
+		public LightStation.API.StationObjectID OrganizationId { get; set; }
+
+		public string Value { get; set; }
+
+		public LightStation.API.StationObjectID SymbolId { get; set; }
+	}
+}
+
+namespace LightStation.API
+{
+	[System.SerializableAttribute()]
+	public struct NullableStationObjectID : ValueType, LightStation.API.IStationObjectID
+	{
+		public NullableStationObjectID(Nullable<int> value)
+		{
+		}
+
+		public Nullable<int> Value { get; set; }
+	}
+}
+
+namespace LightStation.API
+{
+	[System.SerializableAttribute()]
+	public abstract class StationObject : LightStation.Utils.Validation.IValidatable
+	{
+		public LightStation.API.StationObjectID Id { get; set; }
+	}
+}
+
+namespace LightStation.API
+{
+	[System.SerializableAttribute()]
+	public struct StationObjectID : ValueType, LightStation.API.IStationObjectID
+	{
+		public StationObjectID(int value)
+		{
+		}
+
+		public int Value { get; set; }
+	}
+}
+
+namespace LightStation.API
+{
+	[System.SerializableAttribute()]
+	public class Symbol : LightStation.API.StationObject, LightStation.Utils.Validation.IValidatable
+	{
+		public string UniqueId { get; set; }
+
+		public string TypeName { get; set; }
+
+		public bool IsActive { get; set; }
+
+		public DateTime StartDate { get; set; }
+
+		public Nullable<DateTime> EndDate { get; set; }
+
+		public string Description { get; set; }
+
+		public string Extra { get; set; }
+
+		public LightStation.API.NullableStationObjectID DataProvenanceId { get; set; }
+
+		public LightStation.API.NullableStationObjectID CountryId { get; set; }
+
+		public LightStation.API.NullableStationObjectID CurrencyId { get; set; }
+
+		public LightStation.API.NullableStationObjectID DataProviderAccountId { get; set; }
+
+		public LightStation.API.NullableStationObjectID PrimaryExchangeId { get; set; }
+
+		public LightStation.API.NullableStationObjectID CompositeExchangeId { get; set; }
+
+		public string Name { get; set; }
+
+		public string PrimaryTicker { get; set; }
+
+		public DateTime AsOfDate { get; set; }
+	}
+}
+
+namespace LightStation.Storage.Relational
+{
+	[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+	class <>c__DisplayClass2
+	{
+		public System.Linq.IQueryable<LightStation.API.MachineIdentifier> dateIdentifiers;
+
+		public Nullable<DateTime> asOfDate;
+	}
+}
+
+namespace LightStation.Storage.Relational
+{
+	public interface IHasDbId<I>
+	{
+	}
+}
+
+namespace LightStation.Storage.Relational
+{
+	[BLToolkit.DataAccess.TableNameAttribute(Name = "ls_exchange")]
+	public class ls_exchange : LightStation.Storage.Relational.IHasDbId<int>
+	{
+		public int organization_id { get; set; }
+	}
+}
+
+namespace LightStation.Storage.Relational
+{
+	[BLToolkit.DataAccess.TableNameAttribute(Name = "ls_symbol")]
+	public class ls_symbol : LightStation.Storage.Relational.IHasDbId<int>
+	{
+		[BLToolkit.DataAccess.PrimaryKeyAttribute((Int32)1)]
+		[BLToolkit.DataAccess.IdentityAttribute()]
+		public int id { get; set; }
+
+		public string unique_id { get; set; }
+
+		public bool is_active { get; set; }
+
+		[BLToolkit.Mapping.NullableAttribute()]
+		public string type_name { get; set; }
+
+		public DateTime start_date { get; set; }
+
+		[BLToolkit.Mapping.NullableAttribute()]
+		public Nullable<DateTime> end_date { get; set; }
+
+		[BLToolkit.Mapping.NullableAttribute()]
+		public Nullable<int> data_provenance_id { get; set; }
+
+		[BLToolkit.Mapping.NullableAttribute()]
+		public Nullable<int> country_id { get; set; }
+
+		[BLToolkit.Mapping.NullableAttribute()]
+		public Nullable<int> currency_id { get; set; }
+
+		[BLToolkit.Mapping.NullableAttribute()]
+		public Nullable<int> data_provider_account_id { get; set; }
+
+		[BLToolkit.Mapping.NullableAttribute()]
+		public Nullable<int> primary_exchange_id { get; set; }
+
+		[BLToolkit.Mapping.NullableAttribute()]
+		public Nullable<int> composite_exchange_id { get; set; }
+
+		[BLToolkit.Mapping.NullableAttribute()]
+		public string description { get; set; }
+
+		[BLToolkit.Mapping.NullableAttribute()]
+		public string extra { get; set; }
+
+		[BLToolkit.Mapping.AssociationAttribute(ThisKey = "primary_exchange_id", OtherKey = "id", CanBeNull = True)]
+		public LightStation.Storage.Relational.ls_exchange symbolexchangeprimary { get; set; }
+	}
+}
+
+namespace LightStation.Storage.Relational.Tests.IRelationalStorageTests
+{
+	[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+	class <>c__DisplayClassa5
+	{
+		public LightStation.API.Symbol symbol;
+	}
+}
+
+namespace LightStation.Utils.Validation
+{
+	public interface IValidatable
+	{
+	}
+}
+
+namespace Data.Linq
+{
+	[TestFixture]
+	public class UserTest : TestBase
+	{
+		[Test]
+		public void Test()
+		{
+			// Table(ls_symbol).Select(symbol => new <>f__AnonymousType1`2(symbol = symbol, name = value(LightStation.Storage.Relational.RelationalDbToBusinessObjectConverterExtensions+<>c__DisplayClass2).dateIdentifiers.Where(x => ((Convert(x.OrganizationId) == Convert(Organization.SelfId)) AndAlso (x.SymbolId.Value == symbol.id))).Select(x => x.Value))).Select(<>h__TransparentIdentifier0 => new <>f__AnonymousType2`2(<>h__TransparentIdentifier0 = <>h__TransparentIdentifier0, primaryTicker = value(LightStation.Storage.Relational.RelationalDbToBusinessObjectConverterExtensions+<>c__DisplayClass2).dateIdentifiers.Where(x => ((Convert(x.OrganizationId) == <>h__TransparentIdentifier0.symbol.symbolexchangeprimary.organization_id) AndAlso (x.SymbolId.Value == <>h__TransparentIdentifier0.symbol.id))).Select(x => x.Value).FirstOrDefault())).Select(<>h__TransparentIdentifier1 => new Symbol() {Id = new StationObjectID() {Value = <>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.id}, UniqueId = <>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.unique_id, TypeName = <>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.type_name, IsActive = <>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.is_active, StartDate = <>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.start_date, EndDate = <>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.end_date, Description = <>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.description, Extra = <>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.extra, DataProvenanceId = new NullableStationObjectID() {Value = <>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.data_provenance_id}, CountryId = new NullableStationObjectID() {Value = <>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.country_id}, CurrencyId = new NullableStationObjectID() {Value = <>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.currency_id}, DataProviderAccountId = new NullableStationObjectID() {Value = <>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.data_provider_account_id}, PrimaryExchangeId = new NullableStationObjectID() {Value = <>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.primary_exchange_id}, CompositeExchangeId = new NullableStationObjectID() {Value = <>h__TransparentIdentifier1.<>h__TransparentIdentifier0.symbol.composite_exchange_id}, Name = <>h__TransparentIdentifier1.<>h__TransparentIdentifier0.name.FirstOrDefault(), PrimaryTicker = <>h__TransparentIdentifier1.primaryTicker, AsOfDate = value(LightStation.Storage.Relational.RelationalDbToBusinessObjectConverterExtensions+<>c__DisplayClass2).asOfDate.Value}).First(x => (Convert(x.Id) == Convert(value(LightStation.Storage.Relational.Tests.IRelationalStorageTests.SymbolTests+<>c__DisplayClassa5).symbol.Id)))
+			ForEachProvider(db =>
+				Table(ls_symbol)
+					.Select(
+						// Unknown expression.
+						symbol => new <>f__AnonymousType1`2(symbol = symbol, name = value(LightStation.Storage.Relational.RelationalDbToBusinessObjectConverterExtensions+<>c__DisplayClass2).dateIdentifiers.Where(x => ((Convert(x.OrganizationId) == Convert(Organization.SelfId)) AndAlso (x.SymbolId.Value == symbol.id))).Select(x => x.Value)))
+					.Select(
+						// Unknown expression.
+						tp0 => new <>f__AnonymousType2`2(tp0 = tp0, primaryTicker = value(LightStation.Storage.Relational.RelationalDbToBusinessObjectConverterExtensions+<>c__DisplayClass2).dateIdentifiers.Where(x => ((Convert(x.OrganizationId) == tp0.symbol.symbolexchangeprimary.organization_id) AndAlso (x.SymbolId.Value == tp0.symbol.id))).Select(x => x.Value).FirstOrDefault()))
+					.Select(
+						// Unknown expression.
+						tp1 => new Symbol() {Id = new StationObjectID() {Value = tp1.tp0.symbol.id}, UniqueId = tp1.tp0.symbol.unique_id, TypeName = tp1.tp0.symbol.type_name, IsActive = tp1.tp0.symbol.is_active, StartDate = tp1.tp0.symbol.start_date, EndDate = tp1.tp0.symbol.end_date, Description = tp1.tp0.symbol.description, Extra = tp1.tp0.symbol.extra, DataProvenanceId = new NullableStationObjectID() {Value = tp1.tp0.symbol.data_provenance_id}, CountryId = new NullableStationObjectID() {Value = tp1.tp0.symbol.country_id}, CurrencyId = new NullableStationObjectID() {Value = tp1.tp0.symbol.currency_id}, DataProviderAccountId = new NullableStationObjectID() {Value = tp1.tp0.symbol.data_provider_account_id}, PrimaryExchangeId = new NullableStationObjectID() {Value = tp1.tp0.symbol.primary_exchange_id}, CompositeExchangeId = new NullableStationObjectID() {Value = tp1.tp0.symbol.composite_exchange_id}, Name = tp1.tp0.name.FirstOrDefault(), PrimaryTicker = tp1.primaryTicker, AsOfDate = value(LightStation.Storage.Relational.RelationalDbToBusinessObjectConverterExtensions+<>c__DisplayClass2).asOfDate.Value})
+					.First<LightStation.API.Symbol>(
+						// Unknown expression.
+						x => (Convert(x.Id) == Convert(value(LightStation.Storage.Relational.Tests.IRelationalStorageTests.SymbolTests+<>c__DisplayClassa5).symbol.Id))));
+		}
+	}
+}
+
+*/
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/UserTests/MultiPartIdentifierTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,106 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+using NUnit.Framework;
+
+// ReSharper disable ClassNeverInstantiated.Local
+
+namespace Data.Linq.UserTests
+{
+	[TestFixture]
+	public class MultiPartIdentifierTest : TestBase
+	{
+		class Table1
+		{
+			public long Field1;
+			public long Field2;
+			public int? Field3;
+
+			[Association(ThisKey = "Field2", OtherKey = "Field2", CanBeNull = false)]
+			public Table2 Table2Ref { get; set; }
+
+			[Association(ThisKey = "Field3", OtherKey = "Field3", CanBeNull = true)]
+			public Table4 Table4Ref { get; set; }
+		}
+
+		class Table2
+		{
+			public long Field2 { get; set; }
+			public int  Field4 { get; set; }
+
+			[Association(ThisKey = "Field2", OtherKey = "Field2", CanBeNull = false)]
+			public List<Table1> Table1s { get; set; }
+
+			[Association(ThisKey="Field4", OtherKey="Field4", CanBeNull=false)]
+			public Table3 Table3Ref { get; set; }
+		}
+
+		class Table3
+		{
+			public int Field4;
+
+			[Association(ThisKey="Field4", OtherKey="Field4", CanBeNull=true)]
+			public List<Table2> Table2s { get; set; }
+		}
+
+		class Table4
+		{
+			public int Field3 { get; set; }
+			public int Field4 { get; set; }
+
+			[Association(ThisKey = "Field3", OtherKey = "Field3", CanBeNull = true)]
+			public List<Table1> Table1s { get; set; }
+
+			[Association(ThisKey="Field4", OtherKey="ProblematicalField", CanBeNull=false)]
+			public Table5 Table5Ref { get; set; }
+		}
+
+		class Table5
+		{
+			public int? Field5;
+			public int  ProblematicalField;
+
+			[Association(ThisKey = "Field5", OtherKey = "ProblematicalField", CanBeNull = true)]
+			public Table5 Table5Ref { get; set; }
+
+			[Association(ThisKey = "ProblematicalField", OtherKey = "Field4", CanBeNull = true)]
+			public List<Table4> Table4s { get; set; }
+		}
+
+		[Test]
+		public void Test([IncludeDataContexts("Sql2008")] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				var q =
+					from t1 in db.GetTable<Table5>()
+					from t2 in
+						(from t3 in t1.Table4s.SelectMany(x => x.Table1s)
+						 from t4 in
+							from t5 in t3.Table4Ref.Table5Ref.Table5Ref.Table4s
+							from t6 in t5.Table1s
+							select t6
+						 select t4.Field1)
+					from t7 in
+						(from t8 in t1.Table5Ref.Table4s.SelectMany(x => x.Table1s)
+						 from t9 in
+							from t10 in t8.Table2Ref.Table3Ref.Table2s
+							from t11 in t10.Table1s
+							select t11
+						 select t9.Field1)
+					where t2 == t7
+					select t7;
+
+				var sql = q.ToString();
+				var idx = sql.IndexOf(",");
+
+				Assert.That(idx, Is.EqualTo(-1));
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/UserTests/SelectManyDeleteTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,62 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+using NUnit.Framework;
+
+namespace Data.Linq.UserTests
+{
+	[TestFixture]
+	public class SelectManyDeleteTest : TestBase
+	{
+		[TableName(Name = "GrandChild")]
+		public new class GrandChild
+		{
+			public int ChildID { get; set; }
+		}
+
+		[TableName(Name = "Child")]
+		public new class Child
+		{
+			public int ParentID { get; set; }
+			public int ChildID  { get; set; }
+
+			[Association(ThisKey = "ChildID", OtherKey = "ChildID", CanBeNull = false)]
+			public List<GrandChild> GrandChildren { get; set; }
+		}
+
+		[TableName(Name = "Parent")]
+		public new class Parent
+		{
+			[Identity, PrimaryKey(1)]
+			public int ParentID { get; set; }
+
+			[Association(ThisKey = "ParentID", OtherKey = "ParentID", CanBeNull = true)]
+			public List<Child> Children { get; set; }
+		}
+
+		[Test]
+		public void Test([DataContexts(
+			ProviderName.Access, ProviderName.DB2, ProviderName.Informix, "Oracle",
+			ProviderName.PostgreSQL, ProviderName.SqlCe, ProviderName.SQLite, ProviderName.Firebird
+			)] string context)
+		{
+			var harnessIds = new int[2];
+
+			using (var db = GetDataContext(context))
+			{
+				db.GetTable<Parent>()
+					.Where     (x => harnessIds.Contains(x.ParentID))
+					.SelectMany(x => x.Children)
+					.SelectMany(x => x.GrandChildren)
+					.Delete();
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/UserTests/SelectManyUpdateTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,65 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+using NUnit.Framework;
+
+namespace Data.Linq.UserTests
+{
+	[TestFixture]
+	public class SelectManyUpdateTest : TestBase
+	{
+		public new class Child
+		{
+			[Identity, PrimaryKey(1)] public int  ParentID { get; set; }
+			[Nullable]                public int? ChildID { get; set; }
+
+			[AssociationAttribute(ThisKey = "ParentID", OtherKey = "ChildID", CanBeNull = true)]
+			public List<Child> Children { get; set; }
+		}
+
+		public new class Parent
+		{
+			[Identity, PrimaryKey(1)] public int  ParentID { get; set; }
+			[Nullable]                public int? Value1   { get; set; }
+
+			[AssociationAttribute(ThisKey = "ParentID", OtherKey = "Value1", CanBeNull = true)]
+			public List<Parent> Values { get; set; }
+
+			[AssociationAttribute(ThisKey = "ParentID", OtherKey = "ParentID", CanBeNull = true)]
+			public List<Child> Children { get; set; }
+		}
+
+		[Test]
+		public void Test1([DataContexts(ProviderName.Access, ProviderName.Informix, ProviderName.MySql)] string context)
+		{
+			var harnessIds = new int[2];
+
+			using (var db = GetDataContext(context))
+				db.GetTable<Parent>()
+					.Where     (x => harnessIds.Contains(x.ParentID))
+					.SelectMany(x => x.Values)
+					.Set       (x => x.Value1, (long?)null)
+					.Update();
+		}
+
+		[Test]
+		public void Test2([DataContexts(ProviderName.Access, ProviderName.Informix, ProviderName.MySql)] string context)
+		{
+			var harnessIds = new int[2];
+
+			using (var db = GetDataContext(context))
+				db.GetTable<Parent>()
+					.Where     (x => harnessIds.Contains(x.ParentID))
+					.SelectMany(x => x.Children)
+					.SelectMany(x => x.Children)
+					.Set       (x => x.ChildID, 10)
+					.Update();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/UserTests/UnknownSqlTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,42 @@
+using System;
+using System.Linq;
+
+using BLToolkit.Data.Linq;
+
+using NUnit.Framework;
+
+namespace Data.Linq.UserTests
+{
+	[TestFixture]
+	public class UnknownSqlTest : TestBase
+	{
+		enum ColumnDataType
+		{
+			Unknown = 0,
+			Text    = 1,
+		}
+
+		class CustomTableColumn
+		{
+			public int? DataTypeID { get; set; }
+		}
+
+		[Test]
+		public void Test()
+		{
+			using (var db = new TestDbManager())
+			{
+				var q = db.GetTable<CustomTableColumn>()
+					.Select(
+						x => new
+						{
+							DataType = Sql.AsSql(ColumnDataType.Unknown),
+						});
+
+				var sql = q.ToString();
+
+				Assert.That(sql, Is.Not.Contains("Unknown"));
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/UserTests/UnnecessaryInnerJoinTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,52 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using BLToolkit.Data;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+
+using NUnit.Framework;
+
+namespace Data.Linq.UserTests
+{
+	[TestFixture]
+	public class UnnecessaryInnerJoinTest : TestBase
+	{
+		class Table1
+		{
+			[PrimaryKey(1)]
+			[Identity]
+			public Int64 Field1 { get; set; }
+			public Int64 Field2 { get; set; }
+		}
+
+		class Table2
+		{
+			[PrimaryKey(1)]
+			[Identity]
+			public Int64 Field2 { get; set; }
+
+			[Association(ThisKey = "Field2", OtherKey = "Field2", CanBeNull = false)]
+			public List<Table1> Field3 { get; set; }
+		}
+
+		[Test]
+		public void Test([DataContextsAttribute(ExcludeLinqService=true)] string context)
+		{
+			var ids = new long[] { 1, 2, 3 };
+
+			using (var db = new DbManager(context))
+			{
+				var q =
+					from t1 in db.GetTable<Table2>()
+					where t1.Field3.Any(x => ids.Contains(x.Field1))
+					select new { t1.Field2 };
+
+				var sql = q.ToString();
+
+				Assert.That(sql.IndexOf("INNER JOIN"), Is.LessThan(0));
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/VisualBasicCommon.vb	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,25 @@
+Imports Data.Linq.Model
+
+Public Module VisualBasicCommon
+
+    Public Function ParamenterName(ByVal db As ITestDataContext) As IEnumerable(Of Parent)
+        Dim id As Integer
+        id = 1
+        Return From p In db.Parent Where p.ParentID = id Select p
+    End Function
+
+    Public Function SearchCondition1(ByVal db As ITestDataContext) As IEnumerable(Of LinqDataTypes)
+        Return _
+            From t In db.Types _
+            Where Not t.BoolValue And (t.SmallIntValue = 5 Or t.SmallIntValue = 7 Or (t.SmallIntValue Or 2) = 10) _
+            Select t
+    End Function
+
+    Public Function SearchCondition2(ByVal db As NorthwindDB) As IEnumerable(Of String)
+        Return _
+            From cust In db.Customer _
+            Where cust.Orders.Count > 0 And cust.CompanyName.StartsWith("H") _
+            Select cust.CustomerID
+    End Function
+
+End Module
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/VisualBasicTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,66 @@
+using System;
+using System.Linq;
+
+using BLToolkit.Data.DataProvider;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	using Model;
+
+	[TestFixture]
+	public class VisualBasicTest : TestBase
+	{
+		[Test]
+		public void CompareString()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in db.Person where p.FirstName == "John" select p,
+				CompilerServices.CompareString(db)));
+		}
+
+		[Test]
+		public void CompareString1()
+		{
+			ForEachProvider(db =>
+			{
+				var str = CompilerServices.CompareString(db).ToString();
+				Assert.That(str.IndexOf("CASE"), Is.EqualTo(-1));
+			});
+		}
+
+		[Test]
+		public void ParameterName()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent where p.ParentID == 1 select p,
+				VisualBasicCommon.ParamenterName(db)));
+		}
+
+        [Test]
+		public void SearchCondition1()
+		{
+			ForEachProvider(
+				new[] { ProviderName.Access },
+				db => AreEqual(
+					from t in Types
+					where !t.BoolValue && (t.SmallIntValue == 5 || t.SmallIntValue == 7 || (t.SmallIntValue | 2) == 10)
+					select t,
+					VisualBasicCommon.SearchCondition1(db)));
+		}
+
+		[Test]
+		public void SearchCondition2([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+			{
+				AreEqual(
+					from cust in Customer
+					where cust.Orders.Count > 0 && cust.CompanyName.StartsWith("H")
+					select cust.CustomerID,
+					VisualBasicCommon.SearchCondition2(db));
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/WhereTest.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,949 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Mapping;
+
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	using Model;
+	using BLToolkit.Data.Linq;
+
+	[TestFixture]
+	public class WhereTest : TestBase
+	{
+		[Test]
+		public void MakeSubQuery()
+		{
+			TestOneJohn(db => 
+				from p in db.Person
+				select new { PersonID = p.ID + 1, p.FirstName } into p
+				where p.PersonID == 2
+				select new Person(p.PersonID - 1) { FirstName = p.FirstName });
+		}
+
+		[Test]
+		public void MakeSubQueryWithParam()
+		{
+			var n = 1;
+
+			TestOneJohn(new[] { "Fdp" }, db => 
+				from p in db.Person
+				select new { PersonID = p.ID + n, p.FirstName } into p
+				where p.PersonID == 2
+				select new Person(p.PersonID - 1) { FirstName = p.FirstName });
+		}
+
+		[Test]
+		public void DoNotMakeSubQuery()
+		{
+			TestOneJohn(db => 
+				from p1 in db.Person
+				select new { p1.ID, Name = p1.FirstName + "\r\r\r" } into p2
+				where p2.ID == 1
+				select new Person(p2.ID) { FirstName = p2.Name.TrimEnd('\r') });
+		}
+
+		[Test]
+		public void EqualsConst()
+		{
+			TestOneJohn(db => from p in db.Person where p.ID == 1 select p);
+		}
+
+		[Test]
+		public void EqualsConsts()
+		{
+			TestOneJohn(db => from p in db.Person where p.ID == 1 && p.FirstName == "John" select p);
+		}
+
+		[Test]
+		public void EqualsConsts2()
+		{
+			TestOneJohn(db =>
+				from p in db.Person
+				where (p.FirstName == "John" || p.FirstName == "John's") && p.ID > 0 && p.ID < 2 && p.LastName != "123"
+				select p);
+		}
+
+		[Test]
+		public void EqualsParam()
+		{
+			var id = 1;
+			TestOneJohn(db => from p in db.Person where p.ID == id select p);
+		}
+
+		[Test]
+		public void EqualsParams()
+		{
+			var id   = 1;
+			var name = "John";
+			TestOneJohn(db => from p in db.Person where p.ID == id && p.FirstName == name select p);
+		}
+
+		[Test]
+		public void NullParam1()
+		{
+			var    id   = 1;
+			string name = null;
+			TestOneJohn(db => from p in db.Person where p.ID == id && p.MiddleName == name select p);
+		}
+
+		[Test]
+		public void NullParam2()
+		{
+			var    id   = 1;
+			string name = null;
+			TestOneJohn(db =>
+			{
+				      (from p in db.Person where p.ID == id && p.MiddleName == name select p).ToList();
+				return from p in db.Person where p.ID == id && p.MiddleName == name select p;
+			});
+		}
+
+		int TestMethod()
+		{
+			return 1;
+		}
+
+		[Test]
+		public void MethodParam()
+		{
+			TestOneJohn(db => from p in db.Person where p.ID == TestMethod() select p);
+		}
+
+		static int StaticTestMethod()
+		{
+			return 1;
+		}
+
+		[Test]
+		public void StaticMethodParam()
+		{
+			TestOneJohn(db => from p in db.Person where p.ID == StaticTestMethod() select p);
+		}
+
+		class TestMethodClass
+		{
+			private readonly int _n;
+
+			public TestMethodClass(int n)
+			{
+				_n = n;
+			}
+
+			public int TestMethod()
+			{
+				return _n;
+			}
+		}
+
+		public void MethodParam(int n)
+		{
+			var t = new TestMethodClass(n);
+
+			ForEachProvider(db =>
+			{
+				var id = (from p in db.Person where p.ID == t.TestMethod() select new { p.ID }).ToList().First();
+				Assert.AreEqual(n, id.ID);
+			});
+		}
+
+		[Test]
+		public void MethodParam2()
+		{
+			MethodParam(1);
+			MethodParam(2);
+		}
+
+		static IQueryable<Person> TestDirectParam(ITestDataContext db, int id)
+		{
+			var name = "John";
+			return from p in db.Person where p.ID == id && p.FirstName == name select p;
+		}
+
+		[Test]
+		public void DirectParams()
+		{
+			TestOneJohn(db => TestDirectParam(db, 1));
+		}
+
+		[Test]
+		public void BinaryAdd()
+		{
+			TestOneJohn(db => from p in db.Person where p.ID + 1 == 2 select p);
+		}
+
+		[Test]
+		public void BinaryDivide()
+		{
+			TestOneJohn(db => from p in db.Person where (p.ID + 9) / 10 == 1 && p.ID == 1 select p);
+		}
+
+		[Test]
+		public void BinaryModulo()
+		{
+			TestOneJohn(db => from p in db.Person where p.ID % 2 == 1 && p.ID == 1 select p);
+		}
+
+		[Test]
+		public void BinaryMultiply()
+		{
+			TestOneJohn(db => from p in db.Person where p.ID * 10 - 9 == 1 select p);
+		}
+
+        [Test]
+		public void BinaryXor()
+		{
+			TestOneJohn(new[] { ProviderName.Access }, db => from p in db.Person where (p.ID ^ 2) == 3 select p);
+		}
+
+        [Test]
+		public void BinaryAnd()
+		{
+			TestOneJohn(new[] { ProviderName.Access }, db => from p in db.Person where (p.ID & 3) == 1 select p);
+		}
+
+        [Test]
+		public void BinaryOr()
+		{
+			TestOneJohn(new[] { ProviderName.Access }, db => from p in db.Person where (p.ID | 2) == 3 select p);
+		}
+
+		[Test]
+		public void BinarySubtract()
+		{
+			TestOneJohn(db => from p in db.Person where p.ID - 1 == 0 select p);
+		}
+
+		[Test]
+		public void EqualsNull()
+		{
+			TestOneJohn(db => from p in db.Person where p.ID == 1 && p.MiddleName == null select p);
+		}
+
+		[Test]
+		public void EqualsNull2()
+		{
+			TestOneJohn(db => from p in db.Person where p.ID == 1 && null == p.MiddleName select p);
+		}
+
+		[Test]
+		public void NotEqualNull()
+		{
+			TestOneJohn(db => from p in db.Person where p.ID == 1 && p.FirstName != null select p);
+		}
+
+		[Test]
+		public void NotEqualNull2()
+		{
+			TestOneJohn(db => from p in db.Person where p.ID == 1 && null != p.FirstName select p);
+		}
+
+		[Test]
+		public void NotTest()
+		{
+			TestOneJohn(db => from p in db.Person where p.ID == 1 && !(p.MiddleName != null) select p);
+		}
+
+		[Test]
+		public void NotTest2()
+		{
+			int n = 2;
+			TestOneJohn(db => from p in db.Person where p.ID == 1 && !(p.MiddleName != null && p.ID == n) select p);
+		}
+
+		[Test]
+		public void Coalesce1()
+		{
+			TestOneJohn(db =>
+
+				from p in db.Person
+				where
+					p.ID == 1 &&
+					(p.MiddleName ?? "None") == "None" &&
+					(p.FirstName  ?? "None") == "John"
+				select p
+
+			);
+		}
+
+		[Test]
+		public void Coalesce2()
+		{
+			ForEachProvider(db => Assert.AreEqual(1, (from p in db.Parent where p.ParentID == 1 ? true : false select p).ToList().Count));
+		}
+
+		[Test]
+		public void Coalesce3()
+		{
+			ForEachProvider(db => Assert.AreEqual(1, (from p in db.Parent where p.ParentID != 1 ? false: true select p).ToList().Count));
+		}
+
+		[Test]
+		public void Coalesce4()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where p.ParentID == 1 ? false: true select p,
+				from p in db.Parent where p.ParentID == 1 ? false: true select p));
+		}
+
+		[Test]
+		public void Coalesce5()
+		{
+			ForEachProvider(db => Assert.AreEqual(2,
+				(from p in db.Parent where (p.Value1 == 1 ? 10 : 20) == 10 select p).ToList().Count));
+		}
+
+		[Test]
+		public void Coalesce6()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where (p.Value1 == 1 ? 10 : 20) == 20 select p,
+				from p in db.Parent where (p.Value1 == 1 ? 10 : 20) == 20 select p));
+		}
+
+		[Test]
+		public void Coalesce7()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where (p.ParentID == 1 ? 10 : 20) == 20 select p,
+				from p in db.Parent where (p.ParentID == 1 ? 10 : 20) == 20 select p));
+		}
+
+		[Test]
+		public void Conditional()
+		{
+			TestOneJohn(db =>
+
+				from p in db.Person
+				where
+					p.ID == 1 &&
+					(p.MiddleName == null ? 1 : 2) == 1 &&
+					(p.FirstName  != null ? 1 : 2) == 1
+				select p
+
+			);
+		}
+
+		[Test]
+		public void Conditional2()
+		{
+			TestOneJohn(db =>
+
+				from p in db.Person
+				where
+					p.ID == 1 &&
+					(p.MiddleName != null ? 3 : p.MiddleName == null? 1 : 2) == 1 &&
+					(p.FirstName  == null ? 3 : p.FirstName  != null? 1 : 2) == 1
+				select p
+
+			);
+		}
+
+		[Test]
+		public void Conditional3()
+		{
+			TestOneJohn(db =>
+
+				from p in db.Person
+				where
+					p.ID == 1 &&
+					(p.MiddleName != null ? 3 : p.ID == 2 ? 2 : p.MiddleName != null ? 0 : 1) == 1 &&
+					(p.FirstName  == null ? 3 : p.ID == 2 ? 2 : p.FirstName  == null ? 0 : 1) == 1
+				select p
+
+			);
+		}
+
+		[Test]
+		public void MultipleQuery1()
+		{
+			ForEachProvider(db =>
+			{
+				var id = 1;
+				var q  = from p in db.Person where p.ID == id select p;
+
+				var list = q.ToList();
+				Assert.AreEqual(1, list[0].ID);
+
+				id = 2;
+				list = q.ToList();
+				Assert.AreEqual(2, list[0].ID);
+			});
+		}
+
+		[Test]
+		public void MultipleQuery2()
+		{
+			ForEachProvider(db =>
+			{
+				string str = null;
+				var    q   = from p in db.Person where p.MiddleName == str select p;
+
+				var list = q.ToList();
+				Assert.AreNotEqual(0, list.Count);
+
+				str  = "123";
+				list = q.ToList();
+				Assert.AreEqual(0, list.Count);
+			});
+		}
+
+		[Test]
+		public void HasValue1()
+		{
+			var expected = from p in Parent where p.Value1.HasValue select p;
+			ForEachProvider(db => AreEqual(expected, from p in db.Parent where p.Value1.HasValue select p));
+		}
+
+		[Test]
+		public void HasValue2()
+		{
+			ForEachProvider(db => Assert.AreEqual(2, (from p in db.Parent where !p.Value1.HasValue select p).ToList().Count));
+		}
+
+		[Test]
+		public void Value()
+		{
+			ForEachProvider(db => Assert.AreEqual(2, (from p in db.Parent where p.Value1.Value == 1 select p).ToList().Count));
+		}
+
+		[Test]
+		public void CompareNullable1()
+		{
+			ForEachProvider(db => Assert.AreEqual(2, (from p in db.Parent where p.Value1 == 1 select p).ToList().Count));
+		}
+
+		[Test]
+		public void CompareNullable2()
+		{
+			ForEachProvider(db => Assert.AreEqual(1, (from p in db.Parent where p.ParentID == p.Value1 && p.Value1 == 1 select p).ToList().Count));
+		}
+
+		[Test]
+		public void CompareNullable3()
+		{
+			ForEachProvider(db => Assert.AreEqual(1, (from p in db.Parent where p.Value1 == p.ParentID && p.Value1 == 1 select p).ToList().Count));
+		}
+
+		[Test]
+		public void SubQuery()
+		{
+			var expected =
+				from t in
+					from ch in Child
+					select ch.ParentID * 1000
+				where t > 2000
+				select t / 1000;
+
+			ForEachProvider(db => AreEqual(expected,
+				from t in
+					from ch in db.Child
+					select ch.ParentID * 1000
+				where t > 2000
+				select t / 1000));
+		}
+
+		[Test]
+		public void AnonymousEqual1()
+		{
+			var child    = new { ParentID = 2, ChildID = 21 };
+			var expected =
+				from ch in Child
+				where ch.ParentID == child.ParentID && ch.ChildID == child.ChildID
+				select ch;
+
+			ForEachProvider(db => AreEqual(expected,
+				from ch in db.Child
+				where new { ch.ParentID, ch.ChildID } == child
+				select ch));
+		}
+
+		[Test]
+		public void AnonymousEqual2()
+		{
+			var child    = new { ParentID = 2, ChildID = 21 };
+			var expected =
+				from ch in Child
+				where !(ch.ParentID == child.ParentID && ch.ChildID == child.ChildID) && ch.ParentID > 0
+				select ch;
+
+			ForEachProvider(db => AreEqual(expected,
+				from ch in db.Child
+				where child != new { ch.ParentID, ch.ChildID } && ch.ParentID > 0
+				select ch));
+		}
+
+		[Test]
+		public void AnonymousEqual3()
+		{
+			var expected =
+				from ch in Child
+				where ch.ParentID == 2 && ch.ChildID == 21
+				select ch;
+
+			ForEachProvider(db => AreEqual(expected,
+				from ch in db.Child
+				where new { ch.ParentID, ch.ChildID } == new { ParentID = 2, ChildID = 21 }
+				select ch));
+		}
+
+		[Test]
+		public void AnonymousEqual4()
+		{
+			var parent   = new { ParentID = 2, Value1 = (int?)null };
+			var expected =
+				from p in Parent
+				where p.ParentID == parent.ParentID && p.Value1 == parent.Value1
+				select p;
+
+			ForEachProvider(db => AreEqual(expected,
+				from p in db.Parent
+				where new { p.ParentID, p.Value1 } == parent
+				select p));
+		}
+
+		[Test]
+		public void AnonymousEqual5()
+		{
+			var parent   = new { ParentID = 3, Value1 = (int?)3 };
+			var expected =
+				from p in Parent
+				where p.ParentID == parent.ParentID && p.Value1 == parent.Value1
+				select p;
+
+			ForEachProvider(db => AreEqual(expected,
+				from p in db.Parent
+				where new { p.ParentID, p.Value1 } == parent
+				select p));
+		}
+
+		[Test]
+		public void CheckLeftJoin1()
+		{
+			var expected =
+				from p in Parent
+					join ch in Child on p.ParentID equals ch.ParentID into lj1
+					from ch in lj1.DefaultIfEmpty()
+				where ch == null
+				select p;
+
+			ForEachProvider(db => AreEqual(expected,
+				from p in db.Parent
+					join ch in db.Child on p.ParentID equals ch.ParentID into lj1
+					from ch in lj1.DefaultIfEmpty()
+				where ch == null
+				select p));
+		}
+
+		[Test]
+		public void CheckLeftJoin2()
+		{
+			var expected =
+				from p in Parent
+					join ch in Child on p.ParentID equals ch.ParentID into lj1
+					from ch in lj1.DefaultIfEmpty()
+				where ch != null
+				select p;
+
+			ForEachProvider(data => AreEqual(expected, CompiledQuery.Compile<ITestDataContext,IQueryable<Parent>>(db =>
+				from p in db.Parent
+					join ch in db.Child on p.ParentID equals ch.ParentID into lj1
+					from ch in lj1.DefaultIfEmpty()
+				where null != ch
+				select p)(data)));
+		}
+
+		[Test]
+		public void CheckLeftJoin3()
+		{
+			var expected =
+				from p in Parent
+					join ch in 
+						from c in GrandChild
+						where c.ParentID > 0
+						select new { ParentID = 1 + c.ParentID, c.ChildID }
+					on p.ParentID equals ch.ParentID into lj1
+					from ch in lj1.DefaultIfEmpty()
+				where ch == null && ch == null
+				select p;
+
+			ForEachProvider(new[] { ProviderName.Firebird, ProviderName.Sybase, ProviderName.Access }, db => AreEqual(expected,
+				from p in db.Parent
+					join ch in 
+						from c in db.GrandChild
+						where c.ParentID > 0
+						select new { ParentID = 1 + c.ParentID, c.ChildID }
+					on p.ParentID equals ch.ParentID into lj1
+					from ch in lj1.DefaultIfEmpty()
+				where ch == null && ch == null
+				select p));
+		}
+
+		[Test]
+		public void CheckLeftJoin4()
+		{
+			var expected =
+				from p in Parent
+					join ch in 
+						from c in Child
+						where c.ParentID > 0
+						select new { c.ParentID, c.ChildID }
+					on p.ParentID equals ch.ParentID into lj1
+					from ch in lj1.DefaultIfEmpty()
+				where ch == null
+				select p;
+
+			ForEachProvider(db => AreEqual(expected,
+				from p in db.Parent
+					join ch in 
+						from c in db.Child
+						where c.ParentID > 0
+						select new { c.ParentID, c.ChildID }
+					on p.ParentID equals ch.ParentID into lj1
+					from ch in lj1.DefaultIfEmpty()
+				where ch == null
+				select p));
+		}
+
+		[Test]
+		public void CheckNull1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where p != null select p,
+				from p in db.Parent where p != null select p));
+		}
+
+		[Test]
+		public void CheckNull2()
+		{
+			int? n = null;
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where n != null || p.ParentID > 1 select p,
+				from p in db.Parent where n != null || p.ParentID > 1 select p));
+		}
+
+		[Test]
+		public void CheckNull3()
+		{
+			int? n = 1;
+
+			ForEachProvider(new[] { ProviderName.SqlCe, ProviderName.Firebird }, db => AreEqual(
+				from p in    Parent where n != null || p.ParentID > 1 select p,
+				from p in db.Parent where n != null || p.ParentID > 1 select p));
+		}
+
+		[Test]
+		public void CheckCondition1()
+		{
+			var expected =
+				from p in Parent
+				where p.ParentID == 1 && p.Value1 == 1 || p.ParentID == 2 && p.Value1.HasValue
+				select p;
+
+			ForEachProvider(db => AreEqual(expected,
+				from p in db.Parent
+				where p.ParentID == 1 && p.Value1 == 1 || p.ParentID == 2 && p.Value1.HasValue
+				select p));
+		}
+
+		[Test]
+		public void CheckCondition2()
+		{
+			var expected =
+				from p in Parent
+				where p.ParentID == 1 && p.Value1 == 1 || p.ParentID == 2 && (p.ParentID != 3 || p.ParentID == 4) && p.Value1.HasValue
+				select p;
+
+			ForEachProvider(db => AreEqual(expected,
+				from p in db.Parent
+				where p.ParentID == 1 && p.Value1 == 1 || p.ParentID == 2 && (p.ParentID != 3 || p.ParentID == 4) && p.Value1.HasValue
+				select p));
+		}
+
+		[Test]
+		public void CompareObject1()
+		{
+			var child    = (from ch in Child where ch.ParentID == 2 select ch).First();
+			var expected = from ch in Child where ch == child select ch;
+
+			ForEachProvider(db => AreEqual(expected, from ch in db.Child where ch == child select ch));
+		}
+
+		[Test]
+		public void CompareObject2()
+		{
+			var parent   = (from p in Parent where p.ParentID == 2 select p).First();
+			var expected = from p in Parent where parent == p select p;
+
+			ForEachProvider(db => AreEqual(expected, from p in db.Parent where parent == p select p));
+		}
+
+		[Test]
+		public void CompareObject3()
+		{
+			var child    = (from ch in Child where ch.ParentID == 2 select ch).First();
+			var expected = from ch in Child where ch != child select ch;
+
+			ForEachProvider(db => AreEqual(expected, from ch in db.Child where ch != child select ch));
+		}
+
+		[Test]
+		public void OrAnd()
+		{
+			var expected =
+				from c in Child
+				where (c.ParentID == 2 || c.ParentID == 3) && c.ChildID != 21
+				select c;
+
+			ForEachProvider(db => AreEqual(expected,
+				from c in db.Child
+				where (c.ParentID == 2 || c.ParentID == 3) && c.ChildID != 21
+				select c));
+		}
+
+		[Test]
+		public void NotOrAnd()
+		{
+			var expected =
+				from c in Child
+				where !(c.ParentID == 2 || c.ParentID == 3) && c.ChildID != 44
+				select c;
+
+			ForEachProvider(db => AreEqual(expected,
+				from c in db.Child
+				where !(c.ParentID == 2 || c.ParentID == 3) && c.ChildID != 44
+				select c));
+		}
+
+		[Test]
+		public void AndOr()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				where p.ParentID == 1 || (p.ParentID == 2 || p.ParentID == 3) && (p.ParentID == 3 || p.ParentID == 1)
+				select p,
+				from p in db.Parent
+				where p.ParentID == 1 || (p.ParentID == 2 || p.ParentID == 3) && (p.ParentID == 3 || p.ParentID == 1)
+				select p));
+		}
+
+		[Test]
+		public void Contains1()
+		{
+			var words = new [] { "John", "Pupkin" };
+
+			var expected =
+				from p in Person
+				where words.Contains(p.FirstName) || words.Contains(p.LastName)
+				select p;
+
+			ForEachProvider(db => AreEqual(expected,
+				from p in db.Person
+				where words.Contains(p.FirstName) || words.Contains(p.LastName)
+				select p));
+		}
+
+		[Test]
+		public void Contains2()
+		{
+			IEnumerable<int> ids = new [] { 2, 3 };
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where ids.Contains(p.ParentID) select p,
+				from p in db.Parent where ids.Contains(p.ParentID) select p));
+		}
+
+		static IEnumerable<int> GetIds()
+		{
+			yield return 1;
+			yield return 2;
+		}
+
+		[Test]
+		public void Contains3()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where GetIds().Contains(p.ParentID) select p,
+				from p in db.Parent where GetIds().Contains(p.ParentID) select p));
+		}
+
+		static IEnumerable<int> GetIds(int start, int n)
+		{
+			for (int i = 0; i < n; i++)
+				yield return start + i;
+		}
+
+		[Test]
+		public void Contains4()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where GetIds(1, 2).Contains(p.ParentID) || GetIds(3, 0).Contains(p.ParentID) select p,
+				from p in db.Parent where GetIds(1, 2).Contains(p.ParentID) || GetIds(3, 0).Contains(p.ParentID) select p));
+		}
+
+		[Test]
+		public void Contains5()
+		{
+			IEnumerable<int> ids = new int[0];
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where !ids.Contains(p.ParentID) select p,
+				from p in db.Parent where !ids.Contains(p.ParentID) select p));
+		}
+
+		[Test]
+		public void AliasTest1()
+		{
+			int user = 3;
+
+			ForEachProvider(db => AreEqual(
+				from p in    Parent where p.ParentID == user select p,
+				from p in db.Parent where p.ParentID == user select p));
+		}
+
+		[Test]
+		public void AliasTest2()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.Where(_ => _.ParentID == 3),
+				db.Parent.Where(_ => _.ParentID == 3)));
+		}
+
+		[Test]
+		public void AliasTest3()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.Where(_p => _p.ParentID == 3),
+				db.Parent.Where(_p => _p.ParentID == 3)));
+		}
+
+		[Test]
+		public void AliasTest4()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.Where(тбл => тбл.ParentID == 3),
+				db.Parent.Where(тбл => тбл.ParentID == 3)));
+		}
+
+		[Test]
+		public void AliasTest5()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.Where(p_ => p_.ParentID == 3),
+				db.Parent.Where(p_ => p_.ParentID == 3)));
+		}
+
+		[Test]
+		public void SelectNestedCalculatedTest([IncludeDataContexts("Northwind")] string context)
+		{
+			using (var db = new NorthwindDB())
+				AreEqual(
+					from r in from o in    Order select o.Freight * 1000 where r > 100000 select r / 1000,
+					from r in from o in db.Order select o.Freight * 1000 where r > 100000 select r / 1000);
+		}
+
+		[Test]
+		public void CheckField1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				select new { p } into p
+				where p.p.ParentID == 1
+				select p.p,
+				from p in db.Parent
+				select new { p } into p
+				where p.p.ParentID == 1
+				select p.p));
+		}
+
+		[Test]
+		public void CheckField2()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				select new { p } into p
+				where p.p.ParentID == 1
+				select new { p.p.Value1, p },
+				from p in db.Parent
+				select new { p } into p
+				where p.p.ParentID == 1
+				select new { p.p.Value1, p }));
+		}
+
+		[Test]
+		public void CheckField3()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Parent
+				select new { p } into p
+				where p.p.ParentID == 1
+				select new { p.p.Value1, p.p },
+				from p in db.Parent
+				select new { p } into p
+				where p.p.ParentID == 1
+				select new { p.p.Value1, p.p }));
+		}
+
+		[Test]
+		public void CheckField4()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.Select(p => new { p }).Where(p => p.p.ParentID == 1),
+				db.Parent.Select(p => new { p }).Where(p => p.p.ParentID == 1)));
+		}
+
+		[Test]
+		public void CheckField5()
+		{
+			ForEachProvider(db => AreEqual(
+				   Parent.Select(p => new { Value = p.Value1 + 1, p }).Where(p => p.Value == 2 && p.p.ParentID == 1),
+				db.Parent.Select(p => new { Value = p.Value1 + 1, p }).Where(p => p.Value == 2 && p.p.ParentID == 1)));
+		}
+
+		[Test]
+		public void CheckField6()
+		{
+			ForEachProvider(db => AreEqual(
+				from p1 in    Parent
+				select new { p1, Value = p1.Value1 * 100 } into p
+				where p.p1.ParentID == 1 && p.Value > 0
+				select new { p, p.p1.Value1, p.Value, p.p1 },
+
+				from p1 in db.Parent
+				select new { p1, Value = p1.Value1 * 100 } into p
+				where p.p1.ParentID == 1 && p.Value > 0
+				select new { p, p.p1.Value1, p.Value, p.p1 }));
+		}
+
+		[Test]
+		public void SubQuery1()
+		{
+			ForEachProvider(db => AreEqual(
+				from p in Types
+				select new { Value = Math.Round(p.MoneyValue, 2) } into pp
+				where pp.Value != 0 && pp.Value != 7
+				select pp.Value,
+				from p in db.Types
+				select new { Value = Math.Round(p.MoneyValue, 2) } into pp
+				where pp.Value != 0 && pp.Value != 7
+				select pp.Value));
+		}
+
+		[Test]
+		public void SearchCondition1()
+		{
+			ForEachProvider(db => AreEqual(
+				from t in    Types
+				where !t.BoolValue && t.MoneyValue > 1 && (t.SmallIntValue == 5 || t.SmallIntValue == 7 || t.SmallIntValue == 8)
+				select t,
+				from t in db.Types
+				where !t.BoolValue && t.MoneyValue > 1 && (t.SmallIntValue == 5 || t.SmallIntValue == 7 || t.SmallIntValue == 8)
+				select t));
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/packages.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="dotConnect.Express.for.Oracle" version="8.1.36" targetFramework="net40" />
+  <package id="FirebirdSql.Data.FirebirdClient" version="4.0.0.0" targetFramework="net40" />
+  <package id="Microsoft.SqlServer.Compact" version="4.0.8876.1" targetFramework="net40" />
+  <package id="MySql.Data" version="6.8.3" targetFramework="net40" />
+  <package id="Npgsql" version="2.0.14.3" targetFramework="net40" />
+  <package id="NUnit" version="2.6.3" targetFramework="net40" />
+  <package id="odp.net.x86" version="112.3.20" targetFramework="net40" />
+  <package id="System.Data.SQLite" version="1.0.90.0" targetFramework="net40" />
+</packages>
\ No newline at end of file
Binary file UnitTests/Linq/x64/SQLite.Interop.dll has changed
Binary file UnitTests/Linq/x86/SQLite.Interop.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/Castle.Core.3.2.1/ASL - Apache Software Foundation License.txt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,57 @@
+Apache License, Version 2.0
+
+Apache License
+Version 2.0, January 2004
+http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
+
+"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
+
+"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
+
+"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
+
+"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
+
+"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
+
+"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
+
+   1. You must give any other recipients of the Work or Derivative Works a copy of this License; and
+
+   2. You must cause any modified files to carry prominent notices stating that You changed the files; and
+
+   3. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
+
+   4. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
+
+You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/Castle.Core.3.2.1/BreakingChanges.txt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,71 @@
+=== version 3.0
+================================================================================================
+change - Removed overloads of logging methods that were taking format string from ILogger and
+	ILogger and IExtendedLogger and didn't have word Format in their name.
+	For example:
+	void Error(string format, params object[] args); // was removed
+	void ErrorFormat(string format, params object[] args); //use this one instead
+
+
+impact - low
+fixability - medium
+revision - 
+
+description - To minimize confusion and duplication those methods were removed.
+
+fix - Use methods that have explicit "Format" word in their name and same signature.
+================================================================================================
+change - Removed WebLogger and WebLoggerFactory
+
+impact - low
+fixability - medium
+revision - 
+
+description - To minimize management overhead the classes were removed so that only single 
+	Client Profile version of Castle.Core can be distributed.
+
+fix - You can use NLog or Log4Net web logger integration, or reuse implementation of existing
+	web logger and use it as a custom logger.
+
+================================================================================================
+change - Removed obsolete overload of ProxyGenerator.CreateClassProxy
+
+impact - low
+fixability - trivial
+revision - 
+
+description - Deprecated overload of ProxyGenerator.CreateClassProxy was removed to keep the
+	method consistent with other methods and to remove confusion
+
+fix - whenever removed overload was used, use one of the other overloads.
+
+================================================================================================
+change - IProxyGenerationHook.NonVirtualMemberNotification method was renamed
+
+impact - high
+fixability - easy
+revision - 
+
+description - to accommodate class proxies with target method NonVirtualMemberNotification on
+	IProxyGenerationHook type was renamed to more accurate NonProxyableMemberNotification
+	since for class proxies with target not just methods but also fields and other member that
+	break the abstraction will be passed to this method.
+
+fix - whenever NonVirtualMemberNotification is used/implemented change the method name to
+	NonProxyableMemberNotification. Implementors should also accommodate possibility that not
+	only MethodInfos will be passed as method's second parameter.
+	
+================================================================================================
+change - DynamicProxy will now allow to intercept members of System.Object
+
+impact - very low
+fixability - easy
+revision - 
+
+description - to allow scenarios like mocking of System.Object members, DynamicProxy will not
+	disallow proxying of these methods anymore. AllMethodsHook (default IProxyGenerationHook)
+	will still filter them out though.
+
+fix - whenever custom IProxyGenerationHook is used, user should account for System.Object's
+	members being now passed to ShouldInterceptMethod and NonVirtualMemberNotification methods
+	and if neccessary update the code to handle them appropriately.
Binary file packages/Castle.Core.3.2.1/Castle.Core.3.2.1.nupkg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/Castle.Core.3.2.1/Castle.Core.3.2.1.nuspec	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
+  <metadata>
+    <id>Castle.Core</id>
+    <version>3.2.1</version>
+    <authors>Castle Project Contributors</authors>
+    <owners>Castle Project Contributors</owners>
+    <licenseUrl>http://www.apache.org/licenses/LICENSE-2.0.html</licenseUrl>
+    <projectUrl>http://www.castleproject.org/</projectUrl>
+    <iconUrl>http://docs.castleproject.org/GetFile.aspx?File=/castleLogo100px.png</iconUrl>
+    <requireLicenseAcceptance>false</requireLicenseAcceptance>
+    <description>Castle Project Core, including DynamicProxy, Logging Abstractions and DictionaryAdapter</description>
+    <summary>Castle Project Core, including DynamicProxy, Logging Abstractions and DictionaryAdapter</summary>
+    <copyright>Copyright 2004-2013 Castle Project - http://www.castleproject.org/</copyright>
+    <tags>castle dynamicproxy dynamic proxy dynamicproxy2 dictionaryadapter emailsender</tags>
+  </metadata>
+</package>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/Castle.Core.3.2.1/Changes.txt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,207 @@
+3.2.1 (2013-10-06)
+==================
+- fixed #32 - Improve configuration of SmtpClient in sync sending - contributed by Artur Dorochowicz (@ArturDorochowicz)
+- fixed #31 - [DynamicProxy] Preserve DefaultValues of proxied method's parameters (in .NET 4.5)
+- fixed #30 - tailoring InternalsVisibleTo message based on assembly of inaccessible type - contributed by Blair Conrad (@blairconrad)
+- fixed #27 - Allow dynamic proxy of generic interfaces which have generic methods, under Mono 2.10.8 and Mono 3.0.6 - contributed by Iain Ballard (@i-e-b)
+- fixed #26 - Proxy of COM class issue, reference count incremented - contributed by Jean-Claude Viau (@jcviau)
+- fixed DYNPROXY-188 - CreateInterfaceProxyWithoutTarget fails with interface containing member with 'ref UIntPtr' - contributed by Pier Janssen (@Pjanssen)
+- fixed DYNPROXY-186 - .Net remoting (transparent proxy) cannot be proxied - contributed by Jean-Claude Viau (@jcviau)
+- fixed DYNPROXY-185 - ProxyUtil.GetUnproxiedInstance returns proxy object for ClassProxyWithTarget instead of its target - contributed by Dmitry Xlestkov (@d-s-x)
+
+3.2.0 (2013-02-16)
+==================
+- fixed DYNPROXY-179 - Exception when creating a generic proxy (from cache)
+- fixed DYNPROXY-175 - invalid CompositionInvocation type used when code uses interface proxies with and without InterceptorSelector
+
+3.1.0 (2012-08-05)
+==================
+- fixed DYNPROXY-174 - Unable to cast object of type 'System.Collections.ObjectModel.ReadOnlyCollection`1[System.Reflection.CustomAttributeTypedArgument]' to type 'System.Array'
+
+3.1.0 RC (2012-07-08)
+==================
+- support multiple inheritance of DA attributes on interfaces.
+- BREAKING CHANGE: removed propogate child notifications as it violated INotifyPropertyChanged contract
+- improved DictionaryAdapter performance
+- generalized IBindingList support for DictionaryAdapters
+- added reference support to XmlAdapter
+- BRAKING CHANGE: refactored XPathAdapter into XmlAdapter with much more flexibility to support other input like XLinq
+
+- implemented CORE-43 - Add option to skip configuring log4net/nlog
+
+- fixed CORE-44 - NLog logger does not preserver call site info
+- fixed DYNPROXY-171 - PEVerify error on generic method definition
+- fixed DYNPROXY-170 - Calls to properties inside non-intercepted methods are not forwarded to target object (regression from v2.5)
+- fixed DYNPROXY-169 - Support IChangeProxyTarget on additional interfaces and mixins when using CreateInterfaceProxyWithTargetInterface
+
+3.0.0 (2011-12-13)
+==================
+no major changes since RC
+
+3.0.0 RC 1 (2011-11-20)
+==================
+- Applied Jeff Sharps patch that refactored Xml DictionaryAdapter to improve maintainability and enable more complete functionality
+
+- fixed DYNPROXY-165 - Object.GetType() and Object.MemberwiseClone() should be ignored and not reported as non-interceptable to IProxyGenerationHook
+- fixed DYNPROXY-164 - Invalid Proxy type generated when there are more than one base class generic constraints
+- fixed DYNPROXY-162 - ref or out parameters can not be passed back if proxied method throw an exception
+
+3.0.0 beta 1 (2011-08-14)
+==================
+- fixed CORE-37 - TAB characters in the XML Configuration of a component parameter is read as String.Empty
+- fixed DYNPROXY-161 - Strong Named DynamicProxy Assembly Not Available in Silverligh
+- fixed DYNPROXY-159 - Sorting MemberInfo array for serialization has side effects
+- fixed DYNPROXY-158 - Can't create class proxy with target and without target in same ProxyGenerator
+- fixed DYNPROXY-153 - When proxying a generic interface which has an interface as GenericType . No proxy can be created
+- fixed DYNPROXY-151 - Cast error when using attributes 
+
+- implemented CORE-33 - Add lazy logging
+- implemented DYNPROXY-156 - Provide mechanism for interceptors to implement retry logic
+
+- removed obsolete members from ILogger and its implementations
+
+2.5.2 (2010-11-15)
+==================
+- fixed DYNPROXY-150 - Finalizer should not be proxied
+- implemented DYNPROXY-149 - Make AllMethodsHook members virtual so it can be used as a base class
+- fixed DYNPROXY-147 - Can't crete class proxies with two non-public methods having same argument types but different return type
+- fixed DYNPROXY-145 Unable to proxy System.Threading.SynchronizationContext (.NET 4.0)
+- fixed DYNPROXY-144 - params argument not supported in constructor
+- fixed DYNPROXY-143 - Permit call to reach "non-proxied" methods of inherited interfaces
+- implemented DYNPROXY-139 - Better error message 
+- fixed DYNPROXY-133 - Debug assertion in ClassProxyInstanceContributor fails when proxying ISerializable with an explicit implementation of GetObjectData
+- fixed CORE-32 - Determining if permission is granted via PermissionUtil does not work in .NET 4
+- applied patch by Alwin Meijs - ExtendedLog4netFactory can be configured with a stream from for example an embedded log4net xml config
+- Upgraded NLog to 2.0 Beta 1
+- Added DefaultXmlSerializer to bridge XPathAdapter with standard Xml Serialization.
+- XPathAdapter for DictionaryAdapter added IXPathSerializer to provide hooks for custom serialization.
+
+2.5.1 (2010-09-21)
+==================
+- Interface proxy with target Interface now accepts null as a valid target value (which can be replaced at a later stage).
+- DictionaryAdapter behavior overrides are now ordered with all other behaviors
+- BREAKING CHANGE: removed web logger so that by default Castle.Core works in .NET 4 client profile
+- added paramter to ModuleScope disabling usage of signed modules. This is to workaround issue DYNPROXY-134. Also a descriptive exception message is being thrown now when the issue is detected.
+- Added IDictionaryBehaviorBuilder to allow grouping behaviors
+- Added GenericDictionaryAdapter to simplify generic value sources
+- fixed issue DYNPROXY-138 - Error message missing space
+- fixed false positive where DynamicProxy would not let you proxy interface with target interface when target object was a COM object.
+- fixed ReflectionBasedDictionaryAdapter when using indexed properties
+
+2.5.0 (2010-08-21)
+==================
+- DynamicProxy will now not replicate non-public attribute types
+- Applied patch from Kenneth Siewers Mller which adds parameterless constructor to DefaultSmtpSender implementation, to be able to configure the inner SmtpClient from the application configuration file (system.net.smtp).
+- added support for .NET 4 and Silverlight 4, updated solution to VisualStudio 2010
+- Removed obsolete overload of CreateClassProxy
+- Added class proxy with taget
+- Added ability to intercept explicitly implemented generic interface methods on class proxy.
+- DynamicProxy does not disallow intercepting members of System.Object anymore. AllMethodsHook will still filter them out though.
+- Added ability to intercept explicitly implemented interface members on class proxy. Does not support generic members.
+- Merged DynamicProxy into Core binary
+- fixed DYNPROXY-ISSUE-132 - "MetaProperty equals implementation incorrect"
+- Fixed bug in DiagnosticsLoggerTestCase, where when running as non-admin, the teardown will throw SecurityException (contributed by maxild)
+- Split IoC specific classes into Castle.Windsor project
+- Merged logging services solution
+- Merged DynamicProxy project
+
+1.2.0 (2010-01-11)
+==================
+
+- Added IEmailSender interface and its default implementation
+
+1.2.0 beta (2009-12-04)
+==================
+
+- BREAKING CHANGE - added ChangeProxyTarget method to IChangeProxyTarget interface
+- added docs to IChangeProxyTarget methods
+- Fixed DYNPROXY-ISSUE-108 - Obtaining replicated custom attributes on proxy may fail when property setter throws exception on default value
+- Moved custom attribute replication from CustomAttributeUtil to new interface - IAttributeDisassembler
+- Exposed IAttributeDisassembler via ProxyGenerationOptions, so that users can plug their implementation for some convoluted scenarios. (for Silverlight)
+- Moved IInterceptorSelector from Dynamic Proxy to Core (IOC-ISSUE-156)
+
+1.1.0 (2009-05-04)
+==================
+
+- Applied Eric Hauser's patch fixing CORE-ISSUE-22
+  "Support for environment variables in resource URI"
+
+- Applied Gauthier Segay's patch fixing CORE-ISSUE-20
+  "Castle.Core.Tests won't build via nant because it use TraceContext without referencing System.Web.dll"
+
+- Added simple interface to ComponentModel to make optional properties required. 
+
+- Applied Mark's -- <mwatts42@gmail.com> -- patch that changes 
+  the Core to support being compiled for Silverlight 2
+
+- Applied Louis DeJardin's patch adding TraceLogger as a new logger implementation
+
+- Applied Chris Bilson's patch fixing CORE-15
+  "WebLogger Throws When Logging Outside of an HttpContext"
+
+Release Candidate 3
+===================
+
+- Added IServiceProviderEx which extends IServiceProvider
+
+- Added Pair<T,S> class. 
+
+- Applied Bill Pierce's patch fixing CORE-9 
+  "Allow CastleComponent Attribute to Specify Lifestyle in Constructor"
+
+- Added UseSingleInterfaceProxy to CompomentModel to control the proxying
+  behavior while maintaining backward compatibility.
+  Added the corresponding ComponentProxyBehaviorAttribute.
+
+- Made NullLogger and IExtnededLogger
+
+- Enabled a new format on ILogger interface, with 6 overloads for each method:
+    Debug(string)
+    Debug(string, Exception)
+    Debug(string, params object[])
+    DebugFormat(string, params object[])
+    DebugFormat(Exception, string, params object[])
+    DebugFormat(IFormatProvider, string, params object[])
+    DebugFormat(IFormatProvider, Exception, string, params object[])
+
+  The "FatalError" overloads where marked as [Obsolete], replaced by "Fatal" and "FatalFormat".
+
+0.0.1.0
+=======
+
+- Included IProxyTargetAccessor
+
+- Removed IMethodInterceptor and IMethodInvocation, that have been replaced
+  by IInterceptor and IInvocation
+
+- Added FindByPropertyInfo to PropertySetCollection
+
+- Made the DependencyModel.IsOptional property writable
+
+- Applied Curtis Schlak's patch fixing IOC-27
+  "assembly resource format only works for resources where the assemblies name and default namespace are the same."
+  
+  Quoting:
+
+  "I chose to preserve backwards compatibility by implementing the code in the 
+  reverse order as suggested by the reporter. Given the following URI for a resource:
+
+  assembly://my.cool.assembly/context/moo/file.xml
+
+  It will initially look for an embedded resource with the manifest name of 
+  "my.cool.assembly.context.moo.file.xml" in the loaded assembly my.cool.assembly.dll. 
+  If it does not find it, then it looks for the embedded resource with the manifest name 
+  of "context.moo.file.xml".
+
+- IServiceEnabledComponent Introduced to be used across the project as
+  a standard way to have access to common services, for example, logger factories
+
+- Added missing log factories
+
+- Refactor StreamLogger and DiagnosticLogger to be more consistent behavior-wise
+
+- Refactored WebLogger to extend LevelFilteredLogger (removed duplication)
+
+- Refactored LoggerLevel order
+
+- Project started
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/Castle.Core.3.2.1/License.txt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,14 @@
+Copyright 2004-2013 Castle Project - http://www.castleproject.org/
+ 
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+ 
+     http://www.apache.org/licenses/LICENSE-2.0
+ 
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
Binary file packages/Castle.Core.3.2.1/lib/net35/Castle.Core.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/Castle.Core.3.2.1/lib/net35/Castle.Core.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4754 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>Castle.Core</name>
+    </assembly>
+    <members>
+        <member name="T:Castle.Components.DictionaryAdapter.ReferenceAttribute">
+            <summary>
+            Specifies assignment by reference rather than by copying.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IfExistsAttribute">
+            <summary>
+            Suppresses any on-demand behaviors.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.RemoveIfEmptyAttribute">
+            <summary>
+            Removes a property if null or empty string, guid or collection.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.RemoveIfAttribute">
+            <summary>
+            Removes a property if matches value.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.DictionaryBehaviorAttribute">
+            <summary>
+            Assigns a specific dictionary key.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryBehavior">
+            <summary>
+            Defines the contract for customizing dictionary access.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryBehavior.Copy">
+            <summary>
+            Copies the dictionary behavior.
+            </summary>
+            <returns>null if should not be copied.  Otherwise copy.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.IDictionaryBehavior.ExecutionOrder">
+            <summary>
+            Determines relative order to apply related behaviors.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryPropertySetter">
+            <summary>
+            Defines the contract for updating dictionary values.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryPropertySetter.SetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object@,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Sets the stored dictionary value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="value">The stored value.</param>
+            <param name="property">The property.</param>
+            <returns>true if the property should be stored.</returns>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.ICondition">
+            <summary>
+            Contract for value matching.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.VolatileAttribute">
+            <summary>
+            Indicates that underlying values are changeable and should not be cached.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryInitializer">
+            <summary>
+             Contract for dictionary initialization.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryInitializer.Initialize(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.Object[])">
+            <summary>
+            Performs any initialization of the <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/>
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="behaviors">The dictionary behaviors.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapterVisitor">
+            <summary>
+            Abstract implementation of <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapterVisitor"/>.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryAdapterVisitor">
+            <summary>
+            Conract for traversing a <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/>.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryCreate">
+            <summary>
+            Contract for creating additional Dictionary adapters.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter">
+            <summary>
+            Contract for manipulating the Dictionary adapter.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryEdit">
+            <summary>
+            Contract for editing the Dictionary adapter.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryNotify">
+            <summary>
+            Contract for managing Dictionary adapter notifications.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryValidate">
+            <summary>
+            Contract for validating Dictionary adapter.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryBehaviorBuilder">
+            <summary>
+            Defines the contract for building <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryBehavior"/>s.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryBehaviorBuilder.BuildBehaviors">
+            <summary>
+            Builds the dictionary behaviors.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter">
+            <summary>
+            Abstract adapter for the <see cref="T:System.Collections.IDictionary"/> support
+            needed by the <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory"/>
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Add(System.Object,System.Object)">
+            <summary>
+            Adds an element with the provided key and value to the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <param name="key">The <see cref="T:System.Object"></see> to use as the key of the element to add.</param>
+            <param name="value">The <see cref="T:System.Object"></see> to use as the value of the element to add.</param>
+            <exception cref="T:System.ArgumentException">An element with the same key already exists in the <see cref="T:System.Collections.IDictionary"></see> object. </exception>
+            <exception cref="T:System.ArgumentNullException">key is null. </exception>
+            <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.IDictionary"></see> is read-only.-or- The <see cref="T:System.Collections.IDictionary"></see> has a fixed size. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Clear">
+            <summary>
+            Removes all elements from the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.IDictionary"></see> object is read-only. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Contains(System.Object)">
+            <summary>
+            Determines whether the <see cref="T:System.Collections.IDictionary"></see> object contains an element with the specified key.
+            </summary>
+            <param name="key">The key to locate in the <see cref="T:System.Collections.IDictionary"></see> object.</param>
+            <returns>
+            true if the <see cref="T:System.Collections.IDictionary"></see> contains an element with the key; otherwise, false.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">key is null. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.GetEnumerator">
+            <summary>
+            Returns an <see cref="T:System.Collections.IDictionaryEnumerator"></see> object for the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <returns>
+            An <see cref="T:System.Collections.IDictionaryEnumerator"></see> object for the <see cref="T:System.Collections.IDictionary"></see> object.
+            </returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Remove(System.Object)">
+            <summary>
+            Removes the element with the specified key from the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <param name="key">The key of the element to remove.</param>
+            <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.IDictionary"></see> object is read-only.-or- The <see cref="T:System.Collections.IDictionary"></see> has a fixed size. </exception>
+            <exception cref="T:System.ArgumentNullException">key is null. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.CopyTo(System.Array,System.Int32)">
+            <summary>
+            Copies the elements of the <see cref="T:System.Collections.ICollection"></see> to an <see cref="T:System.Array"></see>, starting at a particular <see cref="T:System.Array"></see> index.
+            </summary>
+            <param name="array">The one-dimensional <see cref="T:System.Array"></see> that is the destination of the elements copied from <see cref="T:System.Collections.ICollection"></see>. The <see cref="T:System.Array"></see> must have zero-based indexing.</param>
+            <param name="index">The zero-based index in array at which copying begins.</param>
+            <exception cref="T:System.ArgumentNullException">array is null. </exception>
+            <exception cref="T:System.ArgumentException">The type of the source <see cref="T:System.Collections.ICollection"></see> cannot be cast automatically to the type of the destination array. </exception>
+            <exception cref="T:System.ArgumentOutOfRangeException">index is less than zero. </exception>
+            <exception cref="T:System.ArgumentException">array is multidimensional.-or- index is equal to or greater than the length of array.-or- The number of elements in the source <see cref="T:System.Collections.ICollection"></see> is greater than the available space from index to the end of the destination array. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.System#Collections#IEnumerable#GetEnumerator">
+            <summary>
+            Returns an enumerator that iterates through a collection.
+            </summary>
+            <returns>
+            An <see cref="T:System.Collections.IEnumerator"></see> object that can be used to iterate through the collection.
+            </returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.IsFixedSize">
+            <summary>
+            Gets a value indicating whether the <see cref="T:System.Collections.IDictionary"></see> object has a fixed size.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref="T:System.Collections.IDictionary"></see> object has a fixed size; otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.IsReadOnly">
+            <summary>
+            Gets a value indicating whether the <see cref="T:System.Collections.IDictionary"></see> object is read-only.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref="T:System.Collections.IDictionary"></see> object is read-only; otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Keys">
+            <summary>
+            Gets an <see cref="T:System.Collections.ICollection"></see> object containing the keys of the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <value></value>
+            <returns>An <see cref="T:System.Collections.ICollection"></see> object containing the keys of the <see cref="T:System.Collections.IDictionary"></see> object.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Values">
+            <summary>
+            Gets an <see cref="T:System.Collections.ICollection"></see> object containing the values in the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <value></value>
+            <returns>An <see cref="T:System.Collections.ICollection"></see> object containing the values in the <see cref="T:System.Collections.IDictionary"></see> object.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Item(System.Object)">
+            <summary>
+            Gets or sets the <see cref="T:System.Object"/> with the specified key.
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Count">
+            <summary>
+            Gets the number of elements contained in the <see cref="T:System.Collections.ICollection"></see>.
+            </summary>
+            <value></value>
+            <returns>The number of elements contained in the <see cref="T:System.Collections.ICollection"></see>.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.IsSynchronized">
+            <summary>
+            Gets a value indicating whether access to the <see cref="T:System.Collections.ICollection"></see> is synchronized (thread safe).
+            </summary>
+            <value></value>
+            <returns>true if access to the <see cref="T:System.Collections.ICollection"></see> is synchronized (thread safe); otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.SyncRoot">
+            <summary>
+            Gets an object that can be used to synchronize access to the <see cref="T:System.Collections.ICollection"></see>.
+            </summary>
+            <value></value>
+            <returns>An object that can be used to synchronize access to the <see cref="T:System.Collections.ICollection"></see>.</returns>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.BindingList`1">
+            <summary>
+              Provides a generic collection that supports data binding.
+            </summary>
+            <remarks>
+              This class wraps the CLR <see cref="T:System.ComponentModel.BindingList`1"/>
+              in order to implement the Castle-specific <see cref="T:Castle.Components.DictionaryAdapter.IBindingList`1"/>.
+            </remarks>
+            <typeparam name="T">The type of elements in the list.</typeparam>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.BindingList`1.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.BindingList`1"/> class
+              using default values.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.BindingList`1.#ctor(System.Collections.Generic.IList{`0})">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.BindingList`1"/> class
+              with the specified list.
+            </summary>
+            <param name="list">
+              An <see cref="T:System.Collections.Generic.IList`1"/> of items
+              to be contained in the <see cref="T:Castle.Components.DictionaryAdapter.BindingList`1"/>.
+            </param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.BindingList`1.#ctor(System.ComponentModel.BindingList{`0})">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.BindingList`1"/> class
+              wrapping the specified <see cref="T:System.ComponentModel.BindingList`1"/> instance.
+            </summary>
+            <param name="list">
+              A <see cref="T:System.ComponentModel.BindingList`1"/>
+              to be wrapped by the <see cref="T:Castle.Components.DictionaryAdapter.BindingList`1"/>.
+            </param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryPropertyGetter">
+            <summary>
+            Defines the contract for retrieving dictionary values.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryPropertyGetter.GetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object,Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Boolean)">
+            <summary>
+            Gets the effective dictionary value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="storedValue">The stored value.</param>
+            <param name="property">The property.</param>
+            <param name="ifExists">true if return only existing.</param>
+            <returns>The effective property value.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.Xml.XmlAdapter.#ctor(Castle.Components.DictionaryAdapter.Xml.IXmlNode,Castle.Components.DictionaryAdapter.Xml.XmlReferenceManager)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.Xml.XmlAdapter"/> class
+            that represents a child object in a larger object graph.
+            </summary>
+            <param name="node"></param>
+            <param name="references"></param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryMetaInitializer">
+            <summary>
+             Contract for dictionary meta-data initialization.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryMetaInitializer.Initialize(Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory,Castle.Components.DictionaryAdapter.DictionaryAdapterMeta)">
+            <summary>
+            	Initializes the given <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> object.
+            </summary>
+            <param name="factory">The dictionary adapter factory.</param>
+            <param name="dictionaryMeta">The dictionary adapter meta.</param>
+            
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryMetaInitializer.ShouldHaveBehavior(System.Object)">
+            <summary>
+            	Determines whether the given behavior should be included in a new
+            	<see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> object.
+            </summary>
+            <param name="behavior">A dictionary behavior or annotation.</param>
+            <returns>True if the behavior should be included; otherwise, false.</returns>
+            <remarks>
+            	<see cref="T:Castle.Components.DictionaryAdapter.IDictionaryMetaInitializer"/> behaviors are always included,
+            	regardless of the result of this method.
+            </remarks>
+            
+        </member>
+        <member name="M:Castle.Core.Internal.CollectionExtensions.IsNullOrEmpty(System.Collections.IEnumerable)">
+            <summary>
+              Checks whether or not collection is null or empty. Assumes colleciton can be safely enumerated multiple times.
+            </summary>
+            <param name = "this"></param>
+            <returns></returns>
+        </member>
+        <member name="F:Castle.Core.Internal.InternalsVisible.ToCastleCore">
+            <summary>
+              Constant to use when making assembly internals visible to Castle.Core 
+              <c>[assembly: InternalsVisibleTo(CoreInternalsVisible.ToCastleCore)]</c>
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Internal.InternalsVisible.ToDynamicProxyGenAssembly2">
+            <summary>
+              Constant to use when making assembly internals visible to proxy types generated by DynamicProxy. Required when proxying internal types.
+              <c>[assembly: InternalsVisibleTo(CoreInternalsVisible.ToDynamicProxyGenAssembly2)]</c>
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.ComponentAttribute">
+            <summary>
+            Identifies a property should be represented as a nested component.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryKeyBuilder">
+            <summary>
+            Defines the contract for building typed dictionary keys.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryKeyBuilder.GetKey(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Builds the specified key.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The current key.</param>
+            <param name="property">The property.</param>
+            <returns>The updated key</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.ComponentAttribute.NoPrefix">
+            <summary>
+            Applies no prefix.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.ComponentAttribute.Prefix">
+            <summary>
+            Gets or sets the prefix.
+            </summary>
+            <value>The prefix.</value>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.DictionaryAdapterAttribute">
+            <summary>
+            Identifies the dictionary adapter types.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.FetchAttribute">
+            <summary>
+            Identifies an interface or property to be pre-fetched.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.FetchAttribute.#ctor">
+            <summary>
+            Instructs fetching to occur.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.FetchAttribute.#ctor(System.Boolean)">
+            <summary>
+            Instructs fetching according to <paramref name="fetch"/>
+            </summary>
+            <param name="fetch"></param>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.FetchAttribute.Fetch">
+            <summary>
+            Gets whether or not fetching should occur.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.GroupAttribute">
+            <summary>
+            Assigns a property to a group.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.GroupAttribute.#ctor(System.Object)">
+            <summary>
+            Constructs a group assignment.
+            </summary>
+            <param name="group">The group name.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.GroupAttribute.#ctor(System.Object[])">
+            <summary>
+            Constructs a group assignment.
+            </summary>
+            <param name="group">The group name.</param>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.GroupAttribute.Group">
+            <summary>
+            Gets the group the property is assigned to.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.KeyAttribute">
+            <summary>
+            Assigns a specific dictionary key.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeyAttribute.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeyAttribute"/> class.
+            </summary>
+            <param name="key">The key.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeyAttribute.#ctor(System.String[])">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeyAttribute"/> class.
+            </summary>
+            <param name="keys">The compound key.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.KeyPrefixAttribute">
+            <summary>
+            Assigns a prefix to the keyed properties of an interface.
+            </summary>
+            <remarks>
+            Key prefixes are not inherited by sub-interfaces.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeyPrefixAttribute.#ctor">
+            <summary>
+            Initializes a default instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeyPrefixAttribute"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeyPrefixAttribute.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeyPrefixAttribute"/> class.
+            </summary>
+            <param name="keyPrefix">The prefix for the keyed properties of the interface.</param>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.KeyPrefixAttribute.KeyPrefix">
+            <summary>
+            Gets the prefix key added to the properties of the interface.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.KeySubstitutionAttribute">
+            <summary>
+            Substitutes part of key with another string.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeySubstitutionAttribute.#ctor(System.String,System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeySubstitutionAttribute"/> class.
+            </summary>
+            <param name="oldValue">The old value.</param>
+            <param name="newValue">The new value.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.MultiLevelEditAttribute">
+            <summary>
+            Requests support for multi-level editing.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.NewGuidAttribute">
+            <summary>
+            Generates a new GUID on demand.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.OnDemandAttribute">
+            <summary>
+            Support for on-demand value resolution.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.StringFormatAttribute">
+            <summary>
+            Provides simple string formatting from existing properties.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.StringFormatAttribute.Format">
+            <summary>
+            Gets the string format.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.StringFormatAttribute.Properties">
+            <summary>
+            Gets the format properties.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.StringListAttribute">
+            <summary>
+            Identifies a property should be represented as a delimited string value.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.StringListAttribute.Separator">
+            <summary>
+            Gets the separator.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.StringValuesAttribute">
+            <summary>
+            Converts all properties to strings.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.StringValuesAttribute.Format">
+            <summary>
+            Gets or sets the format.
+            </summary>
+            <value>The format.</value>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.SuppressNotificationsAttribute">
+            <summary>
+            Suppress property change notifications.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IPropertyDescriptorInitializer">
+            <summary>
+             Contract for property descriptor initialization.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IPropertyDescriptorInitializer.Initialize(Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Object[])">
+            <summary>
+            Performs any initialization of the <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <param name="propertyDescriptor">The property descriptor.</param>
+            <param name="behaviors">The property behaviors.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.TypeKeyPrefixAttribute">
+            <summary>
+            Assigns a prefix to the keyed properties using the interface name.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.DefaultPropertyGetter">
+            <summary>
+            Manages conversion between property values.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DefaultPropertyGetter.#ctor(System.ComponentModel.TypeConverter)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.DefaultPropertyGetter"/> class.
+            </summary>
+            <param name="converter">The converter.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DefaultPropertyGetter.GetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object,Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Boolean)">
+            <summary>
+            Gets the effective dictionary value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="storedValue">The stored value.</param>
+            <param name="property">The property.</param>
+            <param name="ifExists">true if return only existing.</param>
+            <returns>The effective property value.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.DefaultPropertyGetter.ExecutionOrder">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory">
+            <summary>
+            Uses Reflection.Emit to expose the properties of a dictionary
+            through a dynamic implementation of a typed interface.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory">
+            <summary>
+            Defines the contract for building typed dictionary adapters.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter``1(System.Collections.IDictionary)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Collections.IDictionary"/>.
+            </summary>
+            <typeparam name="T">The typed interface.</typeparam>
+            <param name="dictionary">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the dictionary.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.IDictionary)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Collections.IDictionary"/>.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="dictionary">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the dictionary.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.IDictionary,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Collections.IDictionary"/>.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="dictionary">The underlying source of properties.</param>
+            <param name="descriptor">The property descriptor.</param>
+            <returns>An implementation of the typed interface bound to the dictionary.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter``1(System.Collections.Specialized.NameValueCollection)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Collections.Specialized.NameValueCollection"/>.
+            </summary>
+            <typeparam name="T">The typed interface.</typeparam>
+            <param name="nameValues">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the namedValues.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.Specialized.NameValueCollection)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Collections.Specialized.NameValueCollection"/>.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="nameValues">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the namedValues.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter``1(System.Xml.XmlNode)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Xml.XmlNode"/>.
+            </summary>
+            <typeparam name="T">The typed interface.</typeparam>
+            <param name="xmlNode">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the <see cref="T:System.Xml.XmlNode"/>.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter(System.Type,System.Xml.XmlNode)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Xml.XmlNode"/>.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="xmlNode">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the <see cref="T:System.Xml.XmlNode"/>.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapterMeta(System.Type)">
+            <summary>
+            Gets the <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> associated with the type.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <returns>The adapter meta-data.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapterMeta(System.Type,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Gets the <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> associated with the type.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="descriptor">The property descriptor.</param>
+            <returns>The adapter meta-data.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapterMeta(System.Type,Castle.Components.DictionaryAdapter.DictionaryAdapterMeta)">
+            <summary>
+            Gets the <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> associated with the type.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="other">Another <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> from which to copy behaviors.</param>
+            <returns>The adapter meta-data.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter``1(System.Collections.IDictionary)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.IDictionary)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.IDictionary,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter``2(System.Collections.Generic.IDictionary{System.String,``1})">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter``1(System.Type,System.Collections.Generic.IDictionary{System.String,``0})">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter``1(System.Collections.Specialized.NameValueCollection)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.Specialized.NameValueCollection)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter``1(System.Xml.XmlNode)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter(System.Type,System.Xml.XmlNode)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapterMeta(System.Type)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapterMeta(System.Type,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapterMeta(System.Type,Castle.Components.DictionaryAdapter.DictionaryAdapterMeta)">
+            <inheritdoc />
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryValidator">
+            <summary>
+            Contract for dictionary validation.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryValidator.IsValid(Castle.Components.DictionaryAdapter.IDictionaryAdapter)">
+            <summary>
+            Determines if <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/> is valid.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <returns>true if valid.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryValidator.Validate(Castle.Components.DictionaryAdapter.IDictionaryAdapter)">
+            <summary>
+            Validates the <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/>.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <returns>The error summary information.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryValidator.Validate(Castle.Components.DictionaryAdapter.IDictionaryAdapter,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Validates the <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/> for a property.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="property">The property to validate.</param>
+            <returns>The property summary information.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryValidator.Invalidate(Castle.Components.DictionaryAdapter.IDictionaryAdapter)">
+            <summary>
+            Invalidates any results cached by the validator.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter.#ctor(System.Collections.Specialized.NameValueCollection)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter"/> class.
+            </summary>
+            <param name="nameValues">The name values.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter.Contains(System.Object)">
+            <summary>
+            Determines whether the <see cref="T:System.Collections.IDictionary"></see> object contains an element with the specified key.
+            </summary>
+            <param name="key">The key to locate in the <see cref="T:System.Collections.IDictionary"></see> object.</param>
+            <returns>
+            true if the <see cref="T:System.Collections.IDictionary"></see> contains an element with the key; otherwise, false.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">key is null. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter.Adapt(System.Collections.Specialized.NameValueCollection)">
+            <summary>
+            Adapts the specified name values.
+            </summary>
+            <param name="nameValues">The name values.</param>
+            <returns></returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter.IsReadOnly">
+            <summary>
+            Gets a value indicating whether the <see cref="T:System.Collections.IDictionary"></see> object is read-only.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref="T:System.Collections.IDictionary"></see> object is read-only; otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter.Item(System.Object)">
+            <summary>
+            Gets or sets the <see cref="T:System.Object"/> with the specified key.
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.PropertyDescriptor">
+            <summary>
+            Describes a dictionary property.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.#ctor">
+            <summary>
+            Initializes an empty <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.#ctor(System.Reflection.PropertyInfo,System.Object[])">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/> class.
+            </summary>
+            <param name="property">The property.</param>
+            <param name="annotations">The annotations.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.#ctor(System.Object[])">
+            <summary>
+            Initializes a new instance <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.#ctor(Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Boolean)">
+            <summary>
+             Copies an existinginstance of the <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/> class.
+            </summary>
+            <param name="source"></param>
+            <param name="copyBehaviors"></param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.GetKey(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Gets the key.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="descriptor">The descriptor.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.GetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object,Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Boolean)">
+            <summary>
+            Gets the property value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="storedValue">The stored value.</param>
+            <param name="descriptor">The descriptor.</param>
+            <param name="ifExists">true if return only existing.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.SetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object@,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Sets the property value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="value">The value.</param>
+            <param name="descriptor">The descriptor.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.AddBehavior(Castle.Components.DictionaryAdapter.IDictionaryBehavior)">
+            <summary>
+            Adds a single behavior.
+            </summary>
+            <param name="behavior">The behavior.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.AddBehaviors(Castle.Components.DictionaryAdapter.IDictionaryBehavior[])">
+            <summary>
+            Adds the behaviors.
+            </summary>
+            <param name="behaviors">The behaviors.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.AddBehaviors(System.Collections.Generic.IEnumerable{Castle.Components.DictionaryAdapter.IDictionaryBehavior})">
+            <summary>
+            Adds the behaviors.
+            </summary>
+            <param name="behaviors">The behaviors.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.CopyBehaviors(Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Copies the behaviors to the other <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <param name="other"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.Copy">
+            <summary>
+            Copies the <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.ExecutionOrder">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.PropertyName">
+            <summary>
+            Gets the property name.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.PropertyType">
+            <summary>
+            Gets the property type.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Property">
+            <summary>
+            Gets the property.
+            </summary>
+            <value>The property.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.IsDynamicProperty">
+            <summary>
+            Returns true if the property is dynamic.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.State">
+            <summary>
+            Gets additional state.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Fetch">
+            <summary>
+            Determines if property should be fetched.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.IfExists">
+            <summary>
+            Determines if property must exist first.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.SuppressNotifications">
+            <summary>
+            Determines if notifications should occur.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Annotations">
+            <summary>
+            Gets the property behaviors.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.TypeConverter">
+            <summary>
+            Gets the type converter.
+            </summary>
+            <value>The type converter.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.ExtendedProperties">
+            <summary>
+            Gets the extended properties.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Behaviors">
+            <summary>
+            Gets the setter.
+            </summary>
+            <value>The setter.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.KeyBuilders">
+            <summary>
+            Gets the key builders.
+            </summary>
+            <value>The key builders.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Setters">
+            <summary>
+            Gets the setter.
+            </summary>
+            <value>The setter.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Getters">
+            <summary>
+            Gets the getter.
+            </summary>
+            <value>The getter.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Initializers">
+            <summary>
+            Gets the initializers.
+            </summary>
+            <value>The initializers.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.MetaInitializers">
+            <summary>
+            Gets the meta-data initializers.
+            </summary>
+            <value>The meta-data initializers.</value>
+        </member>
+        <member name="T:Castle.Core.Internal.AttributesUtil">
+            <summary>
+              Helper class for retrieving attributes.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetAttribute``1(System.Reflection.ICustomAttributeProvider)">
+            <summary>
+              Gets the attribute.
+            </summary>
+            <param name = "member">The member.</param>
+            <returns>The member attribute.</returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetAttributes``1(System.Reflection.ICustomAttributeProvider)">
+            <summary>
+              Gets the attributes. Does not consider inherited attributes!
+            </summary>
+            <param name = "member">The member.</param>
+            <returns>The member attributes.</returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetTypeAttribute``1(System.Type)">
+            <summary>
+              Gets the type attribute.
+            </summary>
+            <param name = "type">The type.</param>
+            <returns>The type attribute.</returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetTypeAttributes``1(System.Type)">
+            <summary>
+              Gets the type attributes.
+            </summary>
+            <param name = "type">The type.</param>
+            <returns>The type attributes.</returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetTypeConverter(System.Reflection.MemberInfo)">
+            <summary>
+              Gets the type converter.
+            </summary>
+            <param name = "member">The member.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.HasAttribute``1(System.Reflection.ICustomAttributeProvider)">
+            <summary>
+              Gets the attribute.
+            </summary>
+            <param name = "member">The member.</param>
+            <returns>The member attribute.</returns>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDynamicValue`1">
+            <summary>
+            Contract for typed dynamic value resolution.
+            </summary>
+            <typeparam name="T"></typeparam>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDynamicValue">
+            <summary>
+            Contract for dynamic value resolution.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.LoggerLevel">
+            <summary>
+              Supporting Logger levels.
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Off">
+            <summary>
+              Logging will be off
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Fatal">
+            <summary>
+              Fatal logging level
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Error">
+            <summary>
+              Error logging level
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Warn">
+            <summary>
+              Warn logging level
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Info">
+            <summary>
+              Info logging level
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Debug">
+            <summary>
+              Debug logging level
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.IInvocation">
+            <summary>
+              Encapsulates an invocation of a proxied method.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.GetArgumentValue(System.Int32)">
+            <summary>
+              Gets the value of the argument at the specified <paramref name = "index" />.
+            </summary>
+            <param name = "index">The index.</param>
+            <returns>The value of the argument at the specified <paramref name = "index" />.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.GetConcreteMethod">
+            <summary>
+              Returns the concrete instantiation of the <see cref="P:Castle.DynamicProxy.IInvocation.Method"/> on the proxy, with any generic
+              parameters bound to real types.
+            </summary>
+            <returns>
+              The concrete instantiation of the <see cref="P:Castle.DynamicProxy.IInvocation.Method"/> on the proxy, or the <see cref="P:Castle.DynamicProxy.IInvocation.Method"/> if
+              not a generic method.
+            </returns>
+            <remarks>
+              Can be slower than calling <see cref="P:Castle.DynamicProxy.IInvocation.Method"/>.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.GetConcreteMethodInvocationTarget">
+            <summary>
+              Returns the concrete instantiation of <see cref="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget"/>, with any
+              generic parameters bound to real types.
+              For interface proxies, this will point to the <see cref="T:System.Reflection.MethodInfo"/> on the target class.
+            </summary>
+            <returns>The concrete instantiation of <see cref="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget"/>, or
+              <see cref="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget"/> if not a generic method.</returns>
+            <remarks>
+              In debug builds this can be slower than calling <see cref="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget"/>.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.Proceed">
+            <summary>
+              Proceeds the call to the next interceptor in line, and ultimately to the target method.
+            </summary>
+            <remarks>
+              Since interface proxies without a target don't have the target implementation to proceed to,
+              it is important, that the last interceptor does not call this method, otherwise a
+              <see cref="T:System.NotImplementedException"/> will be thrown.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.SetArgumentValue(System.Int32,System.Object)">
+            <summary>
+              Overrides the value of an argument at the given <paramref name="index"/> with the
+              new <paramref name="value"/> provided.
+            </summary>
+            <remarks>
+              This method accepts an <see cref="T:System.Object"/>, however the value provided must be compatible
+              with the type of the argument defined on the method, otherwise an exception will be thrown.
+            </remarks>
+            <param name="index">The index of the argument to override.</param>
+            <param name="value">The new value for the argument.</param>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.Arguments">
+            <summary>
+              Gets the arguments that the <see cref="P:Castle.DynamicProxy.IInvocation.Method"/> has been invoked with.
+            </summary>
+            <value>The arguments the method was invoked with.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.GenericArguments">
+            <summary>
+              Gets the generic arguments of the method.
+            </summary>
+            <value>The generic arguments, or null if not a generic method.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.InvocationTarget">
+            <summary>
+              Gets the object on which the invocation is performed. This is different from proxy object
+              because most of the time this will be the proxy target object.
+            </summary>
+            <seealso cref="T:Castle.DynamicProxy.IChangeProxyTarget"/>
+            <value>The invocation target.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.Method">
+            <summary>
+              Gets the <see cref="T:System.Reflection.MethodInfo"/> representing the method being invoked on the proxy.
+            </summary>
+            <value>The <see cref="T:System.Reflection.MethodInfo"/> representing the method being invoked.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget">
+            <summary>
+              For interface proxies, this will point to the <see cref="T:System.Reflection.MethodInfo"/> on the target class.
+            </summary>
+            <value>The method invocation target.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.Proxy">
+            <summary>
+              Gets the proxy object on which the intercepted method is invoked.
+            </summary>
+            <value>Proxy object on which the intercepted method is invoked.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.ReturnValue">
+            <summary>
+              Gets or sets the return value of the method.
+            </summary>
+            <value>The return value of the method.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.TargetType">
+            <summary>
+              Gets the type of the target object for the intercepted method.
+            </summary>
+            <value>The type of the target object.</value>
+        </member>
+        <member name="T:Castle.DynamicProxy.IProxyGenerationHook">
+            <summary>
+              Used during the target type inspection process. Implementors have a chance to customize the
+              proxy generation process.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyGenerationHook.MethodsInspected">
+            <summary>
+              Invoked by the generation process to notify that the whole process has completed.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyGenerationHook.NonProxyableMemberNotification(System.Type,System.Reflection.MemberInfo)">
+            <summary>
+              Invoked by the generation process to notify that a member was not marked as virtual.
+            </summary>
+            <param name = "type">The type which declares the non-virtual member.</param>
+            <param name = "memberInfo">The non-virtual member.</param>
+            <remarks>
+              This method gives an opportunity to inspect any non-proxyable member of a type that has 
+              been requested to be proxied, and if appropriate - throw an exception to notify the caller.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyGenerationHook.ShouldInterceptMethod(System.Type,System.Reflection.MethodInfo)">
+            <summary>
+              Invoked by the generation process to determine if the specified method should be proxied.
+            </summary>
+            <param name = "type">The type which declares the given method.</param>
+            <param name = "methodInfo">The method to inspect.</param>
+            <returns>True if the given method should be proxied; false otherwise.</returns>
+        </member>
+        <member name="T:Castle.DynamicProxy.Contributors.ITypeContributor">
+            <summary>
+              Interface describing elements composing generated type
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Contributors.MembersCollector.AcceptMethod(System.Reflection.MethodInfo,System.Boolean,Castle.DynamicProxy.IProxyGenerationHook)">
+            <summary>
+              Performs some basic screening and invokes the <see cref="T:Castle.DynamicProxy.IProxyGenerationHook"/>
+              to select methods.
+            </summary>
+            <param name="method"></param>
+            <param name="onlyVirtuals"></param>
+            <param name="hook"></param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.DynamicProxy.IAttributeDisassembler">
+            <summary>
+              Provides functionality for disassembling instances of attributes to CustomAttributeBuilder form, during the process of emiting new types by Dynamic Proxy.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IAttributeDisassembler.Disassemble(System.Attribute)">
+            <summary>
+              Disassembles given attribute instance back to corresponding CustomAttributeBuilder.
+            </summary>
+            <param name="attribute">An instance of attribute to disassemble</param>
+            <returns><see cref="T:System.Reflection.Emit.CustomAttributeBuilder"/> corresponding 1 to 1 to given attribute instance, or null reference.</returns>
+            <remarks>
+              Implementers should return <see cref="T:System.Reflection.Emit.CustomAttributeBuilder"/> that corresponds to given attribute instance 1 to 1,
+              that is after calling specified constructor with specified arguments, and setting specified properties and fields with values specified
+              we should be able to get an attribute instance identical to the one passed in <paramref name="attribute"/>. Implementer can return null
+              if it wishes to opt out of replicating the attribute. Notice however, that for some cases, like attributes passed explicitly by the user
+              it is illegal to return null, and doing so will result in exception.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.AttributeDisassembler.HandleError(System.Type,System.Exception)">
+            <summary>
+              Handles error during disassembly process
+            </summary>
+            <param name = "attributeType">Type of the attribute being disassembled</param>
+            <param name = "exception">Exception thrown during the process</param>
+            <returns>usually null, or (re)throws the exception</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.AttributeDisassembler.InitializeConstructorArgs(System.Type,System.Attribute,System.Reflection.ParameterInfo[])">
+            <summary>
+              Here we try to match a constructor argument to its value.
+              Since we can't get the values from the assembly, we use some heuristics to get it.
+              a/ we first try to match all the properties on the attributes by name (case insensitive) to the argument
+              b/ if we fail we try to match them by property type, with some smarts about convertions (i,e: can use Guid for string).
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.AttributeDisassembler.ReplaceIfBetterMatch(System.Reflection.ParameterInfo,System.Reflection.PropertyInfo,System.Reflection.PropertyInfo)">
+            <summary>
+              We have the following rules here.
+              Try to find a matching type, failing that, if the parameter is string, get the first property (under the assumption that
+              we can convert it.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.AttributeDisassembler.ConvertValue(System.Object,System.Type)">
+            <summary>
+              Attributes can only accept simple types, so we return null for null,
+              if the value is passed as string we call to string (should help with converting), 
+              otherwise, we use the value as is (enums, integer, etc).
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.TypeUtil.GetAllInterfaces(System.Type[])">
+            <summary>
+              Returns list of all unique interfaces implemented given types, including their base interfaces.
+            </summary>
+            <param name="types"> </param>
+            <returns> </returns>
+        </member>
+        <member name="T:Castle.DynamicProxy.Serialization.CacheMappingsAttribute">
+            <summary>
+              Applied to the assemblies saved by <see cref="T:Castle.DynamicProxy.ModuleScope"/> in order to persist the cache data included in the persisted assembly.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.BaseProxyGenerator">
+            <summary>
+              Base class that exposes the common functionalities
+              to proxy generation.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.BaseProxyGenerator.AddMappingNoCheck(System.Type,Castle.DynamicProxy.Contributors.ITypeContributor,System.Collections.Generic.IDictionary{System.Type,Castle.DynamicProxy.Contributors.ITypeContributor})">
+            <summary>
+              It is safe to add mapping (no mapping for the interface exists)
+            </summary>
+            <param name = "implementer"></param>
+            <param name = "interface"></param>
+            <param name = "mapping"></param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.BaseProxyGenerator.GenerateParameterlessConstructor(Castle.DynamicProxy.Generators.Emitters.ClassEmitter,System.Type,Castle.DynamicProxy.Generators.Emitters.SimpleAST.FieldReference)">
+            <summary>
+              Generates a parameters constructor that initializes the proxy
+              state with <see cref="T:Castle.DynamicProxy.StandardInterceptor"/> just to make it non-null.
+              <para>
+                This constructor is important to allow proxies to be XML serializable
+              </para>
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.InvocationTypeGenerator.GetBaseCtorArguments(System.Type,Castle.DynamicProxy.ProxyGenerationOptions,System.Reflection.ConstructorInfo@)">
+            <summary>
+              Generates the constructor for the class that extends
+              <see cref="T:Castle.DynamicProxy.AbstractInvocation"/>
+            </summary>
+            <param name="targetFieldType"></param>
+            <param name="proxyGenerationOptions"></param>
+            <param name="baseConstructor"></param>
+        </member>
+        <member name="T:Castle.DynamicProxy.DefaultProxyBuilder">
+            <summary>
+              Default implementation of <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> interface producing in-memory proxy assemblies.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.IProxyBuilder">
+            <summary>
+              Abstracts the implementation of proxy type construction.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyBuilder.CreateClassProxyType(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates a proxy type for given <paramref name="classToProxy"/>, implementing <paramref name="additionalInterfacesToProxy"/>, using <paramref name="options"/> provided.
+            </summary>
+            <param name="classToProxy">The class type to proxy.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types to proxy.</param>
+            <param name="options">The proxy generation options.</param>
+            <returns>The generated proxy type.</returns>
+            <remarks>
+              Implementers should return a proxy type for the specified class and interfaces.
+              Additional interfaces should be only 'mark' interfaces, that is, they should work like interface proxy without target. (See <see cref="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)"/> method.)
+            </remarks>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is not public.
+              Note that to avoid this exception, you can mark offending type internal, and define <see cref="T:System.Runtime.CompilerServices.InternalsVisibleToAttribute"/> 
+              pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate.</exception>
+            <seealso cref="T:Castle.DynamicProxy.Generators.ClassProxyGenerator"/>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithTarget(System.Type,System.Type[],System.Type,Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates a proxy type that proxies calls to <paramref name="interfaceToProxy"/> members on <paramref name="targetType"/>, implementing <paramref name="additionalInterfacesToProxy"/>, using <paramref name="options"/> provided.
+            </summary>
+            <param name="interfaceToProxy">The interface type to proxy.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types to proxy.</param>
+            <param name="targetType">Type implementing <paramref name="interfaceToProxy"/> on which calls to the interface members should be intercepted.</param>
+            <param name="options">The proxy generation options.</param>
+            <returns>The generated proxy type.</returns>
+            <remarks>
+              Implementers should return a proxy type for the specified interface that 'proceeds' executions to the specified target.
+              Additional interfaces should be only 'mark' interfaces, that is, they should work like interface proxy without target. (See <see cref="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)"/> method.)
+            </remarks>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is not public.
+              Note that to avoid this exception, you can mark offending type internal, and define <see cref="T:System.Runtime.CompilerServices.InternalsVisibleToAttribute"/> 
+              pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate.</exception>
+            <seealso cref="T:Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator"/>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithTargetInterface(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates a proxy type for given <paramref name="interfaceToProxy"/> and <parmaref name="additionalInterfacesToProxy"/> that delegates all calls to the provided interceptors and allows interceptors to switch the actual target of invocation.
+            </summary>
+            <param name="interfaceToProxy">The interface type to proxy.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types to proxy.</param>
+            <param name="options">The proxy generation options.</param>
+            <returns>The generated proxy type.</returns>
+            <remarks>
+              Implementers should return a proxy type for the specified interface(s) that delegate all executions to the specified interceptors
+              and uses an instance of the interface as their targets (i.e. <see cref="P:Castle.DynamicProxy.IInvocation.InvocationTarget"/>), rather than a class. All <see cref="T:Castle.DynamicProxy.IInvocation"/> classes should then implement <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface,
+              to allow interceptors to switch invocation target with instance of another type implementing called interface.
+            </remarks>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is not public.
+              Note that to avoid this exception, you can mark offending type internal, and define <see cref="T:System.Runtime.CompilerServices.InternalsVisibleToAttribute"/> 
+              pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate.</exception>
+            <seealso cref="T:Castle.DynamicProxy.Generators.InterfaceProxyWithTargetInterfaceGenerator"/>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates a proxy type for given <paramref name="interfaceToProxy"/> that delegates all calls to the provided interceptors.
+            </summary>
+            <param name="interfaceToProxy">The interface type to proxy.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types to proxy.</param>
+            <param name="options">The proxy generation options.</param>
+            <returns>The generated proxy type.</returns>
+            <remarks>
+              Implementers should return a proxy type for the specified interface and additional interfaces that delegate all executions to the specified interceptors.
+            </remarks>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is not public.
+              Note that to avoid this exception, you can mark offending type internal, and define <see cref="T:System.Runtime.CompilerServices.InternalsVisibleToAttribute"/> 
+              pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate.</exception>
+            <seealso cref="T:Castle.DynamicProxy.Generators.InterfaceProxyWithoutTargetGenerator"/>
+        </member>
+        <member name="P:Castle.DynamicProxy.IProxyBuilder.Logger">
+            <summary>
+              Gets or sets the <see cref="T:Castle.Core.Logging.ILogger"/> that this <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> logs to.
+            </summary>
+        </member>
+        <member name="P:Castle.DynamicProxy.IProxyBuilder.ModuleScope">
+            <summary>
+              Gets the <see cref="P:Castle.DynamicProxy.IProxyBuilder.ModuleScope"/> associated with this builder.
+            </summary>
+            <value>The module scope associated with this builder.</value>
+        </member>
+        <member name="M:Castle.DynamicProxy.DefaultProxyBuilder.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.DefaultProxyBuilder"/> class with new <see cref="P:Castle.DynamicProxy.DefaultProxyBuilder.ModuleScope"/>.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.DefaultProxyBuilder.#ctor(Castle.DynamicProxy.ModuleScope)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.DefaultProxyBuilder"/> class.
+            </summary>
+            <param name="scope">The module scope for generated proxy types.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.AttributeUtil.AddDisassembler``1(Castle.DynamicProxy.IAttributeDisassembler)">
+            <summary>
+              Registers custom disassembler to handle disassembly of specified type of attributes.
+            </summary>
+            <typeparam name="TAttribute">Type of attributes to handle</typeparam>
+            <param name="disassembler">Disassembler converting existing instances of Attributes to CustomAttributeBuilders</param>
+            <remarks>
+              When disassembling an attribute Dynamic Proxy will first check if an custom disassembler has been registered to handle attributes of that type, 
+              and if none is found, it'll use the <see cref="P:Castle.DynamicProxy.Internal.AttributeUtil.FallbackDisassembler"/>.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.AttributeUtil.ShouldSkipAttributeReplication(System.Type)">
+            <summary>
+              Attributes should be replicated if they are non-inheritable,
+              but there are some special cases where the attributes means
+              something to the CLR, where they should be skipped.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.CacheKey.#ctor(System.Reflection.MemberInfo,System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.Generators.CacheKey"/> class.
+            </summary>
+            <param name="target">Target element. This is either target type or target method for invocation types.</param>
+            <param name="type">The type of the proxy. This is base type for invocation types.</param>
+            <param name="interfaces">The interfaces.</param>
+            <param name="options">The options.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.CacheKey.#ctor(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.Generators.CacheKey"/> class.
+            </summary>
+            <param name="target">Type of the target.</param>
+            <param name="interfaces">The interfaces.</param>
+            <param name="options">The options.</param>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.LdcOpCodesDictionary">
+            <summary>
+              s
+              Provides appropriate Ldc.X opcode for the type of primitive value to be loaded.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.LdindOpCodesDictionary">
+            <summary>
+              Provides appropriate Ldind.X opcode for 
+              the type of primitive value to be loaded indirectly.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.Emitters.OpCodeUtil.EmitLoadIndirectOpCodeForType(System.Reflection.Emit.ILGenerator,System.Type)">
+            <summary>
+              Emits a load indirect opcode of the appropriate type for a value or object reference.
+              Pops a pointer off the evaluation stack, dereferences it and loads
+              a value of the specified type.
+            </summary>
+            <param name = "gen"></param>
+            <param name = "type"></param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.Emitters.OpCodeUtil.EmitLoadOpCodeForConstantValue(System.Reflection.Emit.ILGenerator,System.Object)">
+            <summary>
+              Emits a load opcode of the appropriate kind for a constant string or
+              primitive value.
+            </summary>
+            <param name = "gen"></param>
+            <param name = "value"></param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.Emitters.OpCodeUtil.EmitLoadOpCodeForDefaultValueOfType(System.Reflection.Emit.ILGenerator,System.Type)">
+            <summary>
+              Emits a load opcode of the appropriate kind for the constant default value of a
+              type, such as 0 for value types and null for reference types.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.Emitters.OpCodeUtil.EmitStoreIndirectOpCodeForType(System.Reflection.Emit.ILGenerator,System.Type)">
+            <summary>
+              Emits a store indirectopcode of the appropriate type for a value or object reference.
+              Pops a value of the specified type and a pointer off the evaluation stack, and
+              stores the value.
+            </summary>
+            <param name = "gen"></param>
+            <param name = "type"></param>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.PropertiesCollection">
+            <summary>
+              Summary description for PropertiesCollection.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.SimpleAST.IndirectReference">
+            <summary>
+              Wraps a reference that is passed 
+              ByRef and provides indirect load/store support.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.SimpleAST.NewArrayExpression">
+            <summary>
+              Summary description for NewArrayExpression.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.SimpleAST.ReferencesToObjectArrayExpression">
+            <summary>
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.StindOpCodesDictionary">
+            <summary>
+              Provides appropriate Stind.X opcode 
+              for the type of primitive value to be stored indirectly.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.MetaEvent.#ctor(System.String,System.Type,System.Type,Castle.DynamicProxy.Generators.MetaMethod,Castle.DynamicProxy.Generators.MetaMethod,System.Reflection.EventAttributes)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.Generators.MetaEvent"/> class.
+            </summary>
+            <param name="name">The name.</param>
+            <param name="declaringType">Type declaring the original event being overriten, or null.</param>
+            <param name="eventDelegateType"></param>
+            <param name="adder">The add method.</param>
+            <param name="remover">The remove method.</param>
+            <param name="attributes">The attributes.</param>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.INamingScope">
+            <summary>
+              Represents the scope of uniquenes of names for types and their members
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.INamingScope.GetUniqueName(System.String)">
+            <summary>
+              Gets a unique name based on <paramref name="suggestedName"/>
+            </summary>
+            <param name="suggestedName">Name suggested by the caller</param>
+            <returns>Unique name based on <paramref name="suggestedName"/>.</returns>
+            <remarks>
+              Implementers should provide name as closely resembling <paramref name="suggestedName"/> as possible.
+              Generally if no collision occurs it is suggested to return suggested name, otherwise append sequential suffix.
+              Implementers must return deterministic names, that is when <see cref="M:Castle.DynamicProxy.Generators.INamingScope.GetUniqueName(System.String)"/> is called twice 
+              with the same suggested name, the same returned name should be provided each time. Non-deterministic return
+              values, like appending random suffices will break serialization of proxies.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.INamingScope.SafeSubScope">
+            <summary>
+              Returns new, disposable naming scope. It is responsibilty of the caller to make sure that no naming collision
+              with enclosing scope, or other subscopes is possible.
+            </summary>
+            <returns>New naming scope.</returns>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.MethodFinder">
+            <summary>
+              Returns the methods implemented by a type. Use this instead of Type.GetMethods() to work around a CLR issue
+              where duplicate MethodInfos are returned by Type.GetMethods() after a token of a generic type's method was loaded.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.InternalsUtil.IsInternal(System.Reflection.MethodBase)">
+            <summary>
+              Determines whether the specified method is internal.
+            </summary>
+            <param name = "method">The method.</param>
+            <returns>
+              <c>true</c> if the specified method is internal; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.InternalsUtil.IsInternalToDynamicProxy(System.Reflection.Assembly)">
+            <summary>
+              Determines whether this assembly has internals visible to dynamic proxy.
+            </summary>
+            <param name = "asm">The assembly to inspect.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.InternalsUtil.IsAccessible(System.Reflection.MethodBase)">
+            <summary>
+              Checks if the method is public or protected.
+            </summary>
+            <param name = "method"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.MixinData.#ctor(System.Collections.Generic.IEnumerable{System.Object})">
+            <summary>
+              Because we need to cache the types based on the mixed in mixins, we do the following here:
+              - Get all the mixin interfaces
+              - Sort them by full name
+              - Return them by position
+            
+            The idea is to have reproducible behavior for the case that mixins are registered in different orders.
+            This method is here because it is required 
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.ModuleScope">
+            <summary>
+              Summary description for ModuleScope.
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.ModuleScope.DEFAULT_FILE_NAME">
+            <summary>
+              The default file name used when the assembly is saved using <see cref="F:Castle.DynamicProxy.ModuleScope.DEFAULT_FILE_NAME"/>.
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.ModuleScope.DEFAULT_ASSEMBLY_NAME">
+            <summary>
+              The default assembly (simple) name used for the assemblies generated by a <see cref="T:Castle.DynamicProxy.ModuleScope"/> instance.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class; assemblies created by this instance will not be saved.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor(System.Boolean)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class, allowing to specify whether the assemblies generated by this instance
+              should be saved.
+            </summary>
+            <param name="savePhysicalAssembly">If set to <c>true</c> saves the generated module.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor(System.Boolean,System.Boolean)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class, allowing to specify whether the assemblies generated by this instance
+              should be saved.
+            </summary>
+            <param name="savePhysicalAssembly">If set to <c>true</c> saves the generated module.</param>
+            <param name="disableSignedModule">If set to <c>true</c> disables ability to generate signed module. This should be used in cases where ran under constrained permissions.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor(System.Boolean,System.Boolean,System.String,System.String,System.String,System.String)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class, allowing to specify whether the assemblies generated by this instance
+              should be saved and what simple names are to be assigned to them.
+            </summary>
+            <param name="savePhysicalAssembly">If set to <c>true</c> saves the generated module.</param>
+            <param name="disableSignedModule">If set to <c>true</c> disables ability to generate signed module. This should be used in cases where ran under constrained permissions.</param>
+            <param name="strongAssemblyName">The simple name of the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="strongModulePath">The path and file name of the manifest module of the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="weakAssemblyName">The simple name of the weak-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="weakModulePath">The path and file name of the manifest module of the weak-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor(System.Boolean,System.Boolean,Castle.DynamicProxy.Generators.INamingScope,System.String,System.String,System.String,System.String)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class, allowing to specify whether the assemblies generated by this instance
+              should be saved and what simple names are to be assigned to them.
+            </summary>
+            <param name="savePhysicalAssembly">If set to <c>true</c> saves the generated module.</param>
+            <param name="disableSignedModule">If set to <c>true</c> disables ability to generate signed module. This should be used in cases where ran under constrained permissions.</param>
+            <param name="namingScope">Naming scope used to provide unique names to generated types and their members (usually via sub-scopes).</param>
+            <param name="strongAssemblyName">The simple name of the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="strongModulePath">The path and file name of the manifest module of the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="weakAssemblyName">The simple name of the weak-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="weakModulePath">The path and file name of the manifest module of the weak-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.GetFromCache(Castle.DynamicProxy.Generators.CacheKey)">
+            <summary>
+              Returns a type from this scope's type cache, or null if the key cannot be found.
+            </summary>
+            <param name = "key">The key to be looked up in the cache.</param>
+            <returns>The type from this scope's type cache matching the key, or null if the key cannot be found</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.RegisterInCache(Castle.DynamicProxy.Generators.CacheKey,System.Type)">
+            <summary>
+              Registers a type in this scope's type cache.
+            </summary>
+            <param name = "key">The key to be associated with the type.</param>
+            <param name = "type">The type to be stored in the cache.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.GetKeyPair">
+            <summary>
+              Gets the key pair used to sign the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.ObtainDynamicModule(System.Boolean)">
+            <summary>
+              Gets the specified module generated by this scope, creating a new one if none has yet been generated.
+            </summary>
+            <param name = "isStrongNamed">If set to true, a strong-named module is returned; otherwise, a weak-named module is returned.</param>
+            <returns>A strong-named or weak-named module generated by this scope, as specified by the <paramref
+               name = "isStrongNamed" /> parameter.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.ObtainDynamicModuleWithStrongName">
+            <summary>
+              Gets the strong-named module generated by this scope, creating a new one if none has yet been generated.
+            </summary>
+            <returns>A strong-named module generated by this scope.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.ObtainDynamicModuleWithWeakName">
+            <summary>
+              Gets the weak-named module generated by this scope, creating a new one if none has yet been generated.
+            </summary>
+            <returns>A weak-named module generated by this scope.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.SaveAssembly">
+            <summary>
+              Saves the generated assembly with the name and directory information given when this <see cref="T:Castle.DynamicProxy.ModuleScope"/> instance was created (or with
+              the <see cref="F:Castle.DynamicProxy.ModuleScope.DEFAULT_FILE_NAME"/> and current directory if none was given).
+            </summary>
+            <remarks>
+              <para>
+                This method stores the generated assembly in the directory passed as part of the module information specified when this instance was
+                constructed (if any, else the current directory is used). If both a strong-named and a weak-named assembly
+                have been generated, it will throw an exception; in this case, use the <see cref="M:Castle.DynamicProxy.ModuleScope.SaveAssembly(System.Boolean)"/> overload.
+              </para>
+              <para>
+                If this <see cref="T:Castle.DynamicProxy.ModuleScope"/> was created without indicating that the assembly should be saved, this method does nothing.
+              </para>
+            </remarks>
+            <exception cref="T:System.InvalidOperationException">Both a strong-named and a weak-named assembly have been generated.</exception>
+            <returns>The path of the generated assembly file, or null if no file has been generated.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.SaveAssembly(System.Boolean)">
+            <summary>
+              Saves the specified generated assembly with the name and directory information given when this <see cref="T:Castle.DynamicProxy.ModuleScope"/> instance was created
+              (or with the <see cref="F:Castle.DynamicProxy.ModuleScope.DEFAULT_FILE_NAME"/> and current directory if none was given).
+            </summary>
+            <param name="strongNamed">True if the generated assembly with a strong name should be saved (see <see cref="P:Castle.DynamicProxy.ModuleScope.StrongNamedModule"/>);
+              false if the generated assembly without a strong name should be saved (see <see cref="P:Castle.DynamicProxy.ModuleScope.WeakNamedModule"/>.</param>
+            <remarks>
+              <para>
+                This method stores the specified generated assembly in the directory passed as part of the module information specified when this instance was
+                constructed (if any, else the current directory is used).
+              </para>
+              <para>
+                If this <see cref="T:Castle.DynamicProxy.ModuleScope"/> was created without indicating that the assembly should be saved, this method does nothing.
+              </para>
+            </remarks>
+            <exception cref="T:System.InvalidOperationException">No assembly has been generated that matches the <paramref name="strongNamed"/> parameter.
+            </exception>
+            <returns>The path of the generated assembly file, or null if no file has been generated.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.LoadAssemblyIntoCache(System.Reflection.Assembly)">
+            <summary>
+              Loads the generated types from the given assembly into this <see cref="T:Castle.DynamicProxy.ModuleScope"/>'s cache.
+            </summary>
+            <param name="assembly">The assembly to load types from. This assembly must have been saved via <see cref="M:Castle.DynamicProxy.ModuleScope.SaveAssembly(System.Boolean)"/> or
+              <see cref="M:Castle.DynamicProxy.ModuleScope.SaveAssembly"/>, or it must have the <see cref="T:Castle.DynamicProxy.Serialization.CacheMappingsAttribute"/> manually applied.</param>
+            <remarks>
+              This method can be used to load previously generated and persisted proxy types from disk into this scope's type cache, eg. in order
+              to avoid the performance hit associated with proxy generation.
+            </remarks>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.Lock">
+            <summary>
+              Users of this <see cref="T:Castle.DynamicProxy.ModuleScope"/> should use this lock when accessing the cache.
+            </summary>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.StrongNamedModule">
+            <summary>
+              Gets the strong-named module generated by this scope, or <see langword = "null" /> if none has yet been generated.
+            </summary>
+            <value>The strong-named module generated by this scope, or <see langword = "null" /> if none has yet been generated.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.StrongNamedModuleName">
+            <summary>
+              Gets the file name of the strongly named module generated by this scope.
+            </summary>
+            <value>The file name of the strongly named module generated by this scope.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.StrongNamedModuleDirectory">
+            <summary>
+              Gets the directory where the strongly named module generated by this scope will be saved, or <see langword="null"/> if the current directory
+              is used.
+            </summary>
+            <value>The directory where the strongly named module generated by this scope will be saved when <see cref="M:Castle.DynamicProxy.ModuleScope.SaveAssembly"/> is called
+              (if this scope was created to save modules).</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.WeakNamedModule">
+            <summary>
+              Gets the weak-named module generated by this scope, or <see langword = "null" /> if none has yet been generated.
+            </summary>
+            <value>The weak-named module generated by this scope, or <see langword = "null" /> if none has yet been generated.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.WeakNamedModuleName">
+            <summary>
+              Gets the file name of the weakly named module generated by this scope.
+            </summary>
+            <value>The file name of the weakly named module generated by this scope.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.WeakNamedModuleDirectory">
+            <summary>
+              Gets the directory where the weakly named module generated by this scope will be saved, or <see langword="null"/> if the current directory
+              is used.
+            </summary>
+            <value>The directory where the weakly named module generated by this scope will be saved when <see cref="M:Castle.DynamicProxy.ModuleScope.SaveAssembly"/> is called
+              (if this scope was created to save modules).</value>
+        </member>
+        <member name="T:Castle.DynamicProxy.PersistentProxyBuilder">
+            <summary>
+              ProxyBuilder that persists the generated type.
+            </summary>
+            <remarks>
+              The saved assembly contains just the last generated type.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.PersistentProxyBuilder.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.PersistentProxyBuilder"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.PersistentProxyBuilder.SaveAssembly">
+            <summary>
+              Saves the generated assembly to a physical file. Note that this renders the <see cref="T:Castle.DynamicProxy.PersistentProxyBuilder"/> unusable.
+            </summary>
+            <returns>The path of the generated assembly file, or null if no assembly has been generated.</returns>
+            <remarks>
+              This method does not support saving multiple files. If both a signed and an unsigned module have been generated, use the 
+              respective methods of the <see cref="T:Castle.DynamicProxy.ModuleScope"/>.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerationOptions.#ctor(Castle.DynamicProxy.IProxyGenerationHook)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerationOptions"/> class.
+            </summary>
+            <param name="hook">The hook.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerationOptions.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerationOptions"/> class.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.ProxyGenerator">
+            <summary>
+              Provides proxy objects for classes and interfaces.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.#ctor(Castle.DynamicProxy.IProxyBuilder)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> class.
+            </summary>
+            <param name="builder">Proxy types builder.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.#ctor(System.Boolean)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> class.
+            </summary>
+            <param name="disableSignedModule">If <c>true</c> forces all types to be generated into an unsigned module.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget``1(``0,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface implemented by <paramref name="target"/> which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>Object proxying calls to members of <typeparamref name="TInterface"/> on <paramref name="target"/> object.</returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/>is not an interface type.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface``1(``0,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget``1(``0,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface implemented by <paramref name="target"/> which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/>is not an interface type.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface``1(``0,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Object,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types  on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Type[],System.Object,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface``1(``0,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface implemented by <paramref name="target"/> which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> type on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface``1(``0,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface implemented by <paramref name="target"/> which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> type on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Type[],System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget``1(Castle.DynamicProxy.IInterceptor)">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on target object generated at runtime with given <paramref name="interceptor"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface which will be proxied.</typeparam>
+            <param name="interceptor">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptor"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              As a result of that also at least one <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementation must be provided.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget``1(Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface which will be proxied.</typeparam>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              As a result of that also at least one <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementation must be provided.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget``1(Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface which will be proxied.</typeparam>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              As a result of that also at least one <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementation must be provided.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,Castle.DynamicProxy.IInterceptor)">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptor"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="interceptor">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptor"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/>  is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of <paramref name="additionalInterfacesToProxy"/> to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget``1(``0,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <typeparamref name="TClass"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TClass">Type of class which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <typeparamref name="TClass"/> proxying calls to virtual members of <typeparamref name="TClass"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TClass"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <typeparamref name="TClass"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <typeparamref name="TClass"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget``1(``0,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <typeparamref name="TClass"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TClass">Type of class which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <typeparamref name="TClass"/> proxying calls to virtual members of <typeparamref name="TClass"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TClass"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <typeparamref name="TClass"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <typeparamref name="TClass"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Object,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no parameterless constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy``1(Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <typeparamref name="TClass"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TClass">Type of class which will be proxied.</typeparam>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <typeparamref name="TClass"/> proxying calls to virtual members of <typeparamref name="TClass"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TClass"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <typeparamref name="TClass"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <typeparamref name="TClass"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy``1(Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <typeparamref name="TClass"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TClass">Type of class which will be proxied.</typeparam>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <typeparamref name="TClass"/> proxying calls to virtual members of <typeparamref name="TClass"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TClass"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <typeparamref name="TClass"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <typeparamref name="TClass"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,System.Type[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,Castle.DynamicProxy.ProxyGenerationOptions,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no parameterless constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyType(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates the proxy type for class proxy with given <paramref name="classToProxy"/> class, implementing given <paramref name="additionalInterfacesToProxy"/> and using provided <paramref name="options"/>.
+            </summary>
+            <param name="classToProxy">The base class for proxy type.</param>
+            <param name="additionalInterfacesToProxy">The interfaces that proxy type should implement.</param>
+            <param name="options">The options for proxy generation process.</param>
+            <returns><see cref="T:System.Type"/> of proxy.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyTypeWithTarget(System.Type,System.Type[],System.Type,Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates the proxy type for interface proxy with target for given <paramref name="interfaceToProxy"/> interface, implementing given <paramref name="additionalInterfacesToProxy"/> on given <paramref name="targetType"/> and using provided <paramref name="options"/>.
+            </summary>
+            <param name="interfaceToProxy">The interface proxy type should implement.</param>
+            <param name="additionalInterfacesToProxy">The additional interfaces proxy type should implement.</param>
+            <param name="targetType">Actual type that the proxy type will encompass.</param>
+            <param name="options">The options for proxy generation process.</param>
+            <returns><see cref="T:System.Type"/> of proxy.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyTypeWithTargetInterface(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates the proxy type for interface proxy with target interface for given <paramref name="interfaceToProxy"/> interface, implementing given <paramref name="additionalInterfacesToProxy"/> on given <paramref name="interfaceToProxy"/> and using provided <paramref name="options"/>.
+            </summary>
+            <param name="interfaceToProxy">The interface proxy type should implement.</param>
+            <param name="additionalInterfacesToProxy">The additional interfaces proxy type should implement.</param>
+            <param name="options">The options for proxy generation process.</param>
+            <returns><see cref="T:System.Type"/> of proxy.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyTypeWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates the proxy type for interface proxy without target for given <paramref name="interfaceToProxy"/> interface, implementing given <paramref name="additionalInterfacesToProxy"/> and using provided <paramref name="options"/>.
+            </summary>
+            <param name="interfaceToProxy">The interface proxy type should implement.</param>
+            <param name="additionalInterfacesToProxy">The additional interfaces proxy type should implement.</param>
+            <param name="options">The options for proxy generation process.</param>
+            <returns><see cref="T:System.Type"/> of proxy.</returns>
+        </member>
+        <member name="P:Castle.DynamicProxy.ProxyGenerator.Logger">
+            <summary>
+              Gets or sets the <see cref="T:Castle.Core.Logging.ILogger"/> that this <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> log to.
+            </summary>
+        </member>
+        <member name="P:Castle.DynamicProxy.ProxyGenerator.ProxyBuilder">
+            <summary>
+              Gets the proxy builder instance used to generate proxy types.
+            </summary>
+            <value>The proxy builder.</value>
+        </member>
+        <member name="M:Castle.DynamicProxy.Serialization.RemotableInvocation.Proceed">
+            <summary>
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="P:Castle.DynamicProxy.Serialization.RemotableInvocation.Method">
+            <summary>
+            </summary>
+        </member>
+        <member name="P:Castle.DynamicProxy.Serialization.RemotableInvocation.MethodInvocationTarget">
+            <summary>
+              For interface proxies, this will point to the
+              <see cref="T:System.Reflection.MethodInfo"/> on the target class
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Serialization.ProxyObjectReference">
+            <summary>
+              Handles the deserialization of proxies.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Serialization.ProxyObjectReference.ResetScope">
+            <summary>
+              Resets the <see cref="P:Castle.DynamicProxy.Serialization.ProxyObjectReference.ModuleScope"/> used for deserialization to a new scope.
+            </summary>
+            <remarks>
+              This is useful for test cases.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.Serialization.ProxyObjectReference.SetScope(Castle.DynamicProxy.ModuleScope)">
+            <summary>
+              Resets the <see cref="P:Castle.DynamicProxy.Serialization.ProxyObjectReference.ModuleScope"/> used for deserialization to a given <paramref name="scope"/>.
+            </summary>
+            <param name="scope"> The scope to be used for deserialization. </param>
+            <remarks>
+              By default, the deserialization process uses a different scope than the rest of the application, which can lead to multiple proxies
+              being generated for the same type. By explicitly setting the deserialization scope to the application's scope, this can be avoided.
+            </remarks>
+        </member>
+        <member name="P:Castle.DynamicProxy.Serialization.ProxyObjectReference.ModuleScope">
+            <summary>
+              Gets the <see cref="P:Castle.DynamicProxy.Serialization.ProxyObjectReference.ModuleScope"/> used for deserialization.
+            </summary>
+            <value> As <see cref="T:Castle.DynamicProxy.Serialization.ProxyObjectReference"/> has no way of automatically determining the scope used by the application (and the application might use more than one scope at the same time), <see cref="T:Castle.DynamicProxy.Serialization.ProxyObjectReference"/> uses a dedicated scope instance for deserializing proxy types. This instance can be reset and set to a specific value via <see cref="M:Castle.DynamicProxy.Serialization.ProxyObjectReference.ResetScope"/> and <see cref="M:Castle.DynamicProxy.Serialization.ProxyObjectReference.SetScope(Castle.DynamicProxy.ModuleScope)"/> . </value>
+        </member>
+        <member name="T:Castle.DynamicProxy.Tokens.InvocationMethods">
+            <summary>
+              Holds <see cref="T:System.Reflection.MethodInfo"/> objects representing methods of <see cref="T:Castle.DynamicProxy.AbstractInvocation"/> class.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Tokens.SerializationInfoMethods">
+            <summary>
+              Holds <see cref="T:System.Reflection.MethodInfo"/> objects representing methods of <see cref="T:System.Runtime.Serialization.SerializationInfo"/> class.
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.Tokens.SerializationInfoMethods.AddValue_Bool">
+            <summary>
+              <see cref="M:System.Runtime.Serialization.SerializationInfo.AddValue(System.String,System.Boolean)"/>
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.Tokens.SerializationInfoMethods.AddValue_Int32">
+            <summary>
+              <see cref="M:System.Runtime.Serialization.SerializationInfo.AddValue(System.String,System.Int32)"/>
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.Tokens.SerializationInfoMethods.AddValue_Object">
+            <summary>
+              <see cref="M:System.Runtime.Serialization.SerializationInfo.AddValue(System.String,System.Object)"/>
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.Tokens.SerializationInfoMethods.GetValue">
+            <summary>
+              <see cref="M:System.Runtime.Serialization.SerializationInfo.GetValue(System.String,System.Type)"/>
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.Tokens.SerializationInfoMethods.SetType">
+            <summary>
+              <see cref="M:System.Runtime.Serialization.SerializationInfo.SetType(System.Type)"/>
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.IInterceptorSelector">
+            <summary>
+              Provides an extension point that allows proxies to choose specific interceptors on
+              a per method basis.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInterceptorSelector.SelectInterceptors(System.Type,System.Reflection.MethodInfo,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Selects the interceptors that should intercept calls to the given <paramref name="method"/>.
+            </summary>
+            <param name="type">The type declaring the method to intercept.</param>
+            <param name="method">The method that will be intercepted.</param>
+            <param name="interceptors">All interceptors registered with the proxy.</param>
+            <returns>An array of interceptors to invoke upon calling the <paramref name="method"/>.</returns>
+            <remarks>
+              This method is called only once per proxy instance, upon the first call to the
+              <paramref name="method"/>. Either an empty array or null are valid return values to indicate
+              that no interceptor should intercept calls to the method. Although it is not advised, it is
+              legal to return other <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations than these provided in
+              <paramref name="interceptors"/>.
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.Internal.Lock.Create">
+            <summary>
+            Creates a new lock.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.IServiceProviderExAccessor">
+            <summary>
+            This interface should be implemented by classes
+            that are available in a bigger context, exposing
+            the container to different areas in the same application.
+            <para>
+            For example, in Web application, the (global) HttpApplication
+            subclasses should implement this interface to expose 
+            the configured container
+            </para>
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.IChangeProxyTarget">
+            <summary>
+              Exposes means to change target objects of proxies and invocations
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IChangeProxyTarget.ChangeInvocationTarget(System.Object)">
+            <summary>
+              Changes the target object (<see cref="P:Castle.DynamicProxy.IInvocation.InvocationTarget"/>) of current <see cref="T:Castle.DynamicProxy.IInvocation"/>.
+            </summary>
+            <param name="target">The new value of target of invocation.</param>
+            <remarks>
+              Although the method takes <see cref="T:System.Object"/> the actual instance must be of type assignable to <see cref="P:Castle.DynamicProxy.IInvocation.TargetType"/>, otherwise an <see cref="T:System.InvalidCastException"/> will be thrown.
+              Also while it's technically legal to pass null reference (Nothing in Visual Basic) as <paramref name="target"/>, for obvious reasons Dynamic Proxy will not be able to call the intercepted method on such target.
+              In this case last interceptor in the pipeline mustn't call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/> or a <see cref="T:System.NotImplementedException"/> will be throws.
+              Also while it's technically legal to pass proxy itself as <paramref name="target"/>, this would create stack overflow.
+              In this case last interceptor in the pipeline mustn't call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/> or a <see cref="T:System.InvalidOperationException"/> will be throws.
+            </remarks>
+            <exception cref="T:System.InvalidCastException">Thrown when <paramref name="target"/> is not assignable to the proxied type.</exception>
+        </member>
+        <member name="M:Castle.DynamicProxy.IChangeProxyTarget.ChangeProxyTarget(System.Object)">
+            <summary>
+              Permanently changes the target object of the proxy. This does not affect target of the current invocation.
+            </summary>
+            <param name="target">The new value of target of the proxy.</param>
+            <remarks>
+              Although the method takes <see cref="T:System.Object"/> the actual instance must be of type assignable to proxy's target type, otherwise an <see cref="T:System.InvalidCastException"/> will be thrown.
+              Also while it's technically legal to pass null reference (Nothing in Visual Basic) as <paramref name="target"/>, for obvious reasons Dynamic Proxy will not be able to call the intercepted method on such target.
+              In this case last interceptor in the pipeline mustn't call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/> or a <see cref="T:System.NotImplementedException"/> will be throws.
+              Also while it's technically legal to pass proxy itself as <paramref name="target"/>, this would create stack overflow.
+              In this case last interceptor in the pipeline mustn't call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/> or a <see cref="T:System.InvalidOperationException"/> will be throws.
+            </remarks>
+            <exception cref="T:System.InvalidCastException">Thrown when <paramref name="target"/> is not assignable to the proxied type.</exception>
+        </member>
+        <member name="T:Castle.DynamicProxy.IInterceptor">
+            <summary>
+              New interface that is going to be used by DynamicProxy 2
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyTargetAccessor.DynProxyGetTarget">
+            <summary>
+              Get the proxy target (note that null is a valid target!)
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyTargetAccessor.GetInterceptors">
+            <summary>
+              Gets the interceptors for the proxy
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.IServiceEnabledComponent">
+            <summary>
+            Defines that the implementation wants a 
+            <see cref="T:System.IServiceProvider"/> in order to 
+            access other components. The creator must be aware
+            that the component might (or might not) implement 
+            the interface.
+            </summary>
+            <remarks>
+            Used by Castle Project components to, for example, 
+            gather logging factories
+            </remarks>
+        </member>
+        <member name="T:Castle.Core.IServiceProviderEx">
+            <summary>
+            Increments <c>IServiceProvider</c> with a generic service resolution operation.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.IExtendedLoggerFactory">
+            <summary>
+              Provides a factory that can produce either <see cref="T:Castle.Core.Logging.ILogger"/> or
+              <see cref="T:Castle.Core.Logging.IExtendedLogger"/> classes.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.ILoggerFactory">
+            <summary>
+              Manages the instantiation of <see cref="T:Castle.Core.Logging.ILogger"/>s.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ILoggerFactory.Create(System.Type)">
+            <summary>
+              Creates a new logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ILoggerFactory.Create(System.String)">
+            <summary>
+              Creates a new logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ILoggerFactory.Create(System.Type,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ILoggerFactory.Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.IExtendedLoggerFactory.Create(System.Type)">
+            <summary>
+              Creates a new extended logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.IExtendedLoggerFactory.Create(System.String)">
+            <summary>
+              Creates a new extended logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.IExtendedLoggerFactory.Create(System.Type,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new extended logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.IExtendedLoggerFactory.Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new extended logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Create(System.Type)">
+            <summary>
+              Creates a new extended logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Create(System.String)">
+            <summary>
+              Creates a new extended logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Create(System.Type,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new extended logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new extended logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Castle#Core#Logging#ILoggerFactory#Create(System.Type)">
+            <summary>
+              Creates a new logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Castle#Core#Logging#ILoggerFactory#Create(System.String)">
+            <summary>
+              Creates a new logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Castle#Core#Logging#ILoggerFactory#Create(System.Type,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Castle#Core#Logging#ILoggerFactory#Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.GetConfigFile(System.String)">
+            <summary>
+              Gets the configuration file.
+            </summary>
+            <param name = "fileName">i.e. log4net.config</param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.Logging.TraceLoggerFactory">
+            <summary>
+              Used to create the TraceLogger implementation of ILogger interface. See <see cref="T:Castle.Core.Logging.TraceLogger"/>.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractLoggerFactory.GetConfigFile(System.String)">
+            <summary>
+              Gets the configuration file.
+            </summary>
+            <param name = "fileName">i.e. log4net.config</param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.Logging.IContextProperties">
+            <summary>
+              Interface for Context Properties implementations
+            </summary>
+            <remarks>
+              <para>
+                This interface defines a basic property get set accessor.
+              </para>
+              <para>
+                Based on the ContextPropertiesBase of log4net, by Nicko Cadell.
+              </para>
+            </remarks>
+        </member>
+        <member name="P:Castle.Core.Logging.IContextProperties.Item(System.String)">
+            <summary>
+              Gets or sets the value of a property
+            </summary>
+            <value>
+              The value for the property with the specified key
+            </value>
+            <remarks>
+              <para>
+                Gets or sets the value of a property
+              </para>
+            </remarks>
+        </member>
+        <member name="T:Castle.Core.Logging.NullLogFactory">
+            <summary>
+            NullLogFactory used when logging is turned off.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogFactory.Create(System.String)">
+            <summary>
+              Creates an instance of ILogger with the specified name.
+            </summary>
+            <param name = "name">Name.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogFactory.Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates an instance of ILogger with the specified name and LoggerLevel.
+            </summary>
+            <param name = "name">Name.</param>
+            <param name = "level">Level.</param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.Logging.StreamLoggerFactory">
+            <summary>
+              Creates <see cref="T:Castle.Core.Logging.StreamLogger"/> outputing 
+              to files. The name of the file is derived from the log name
+              plus the 'log' extension.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.IExtendedLogger">
+            <summary>
+              Provides an interface that supports <see cref="T:Castle.Core.Logging.ILogger"/> and
+              allows the storage and retrieval of Contexts. These are supported in
+              both log4net and NLog.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.ILogger">
+            <summary>
+              Manages logging.
+            </summary>
+            <remarks>
+              This is a facade for the different logging subsystems.
+              It offers a simplified interface that follows IOC patterns
+              and a simplified priority/level/severity abstraction.
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.CreateChildLogger(System.String)">
+            <summary>
+              Create a new child logger.
+              The name of the child logger is [current-loggers-name].[passed-in-name]
+            </summary>
+            <param name="loggerName">The Subname of this logger.</param>
+            <returns>The New ILogger instance.</returns>
+            <exception cref="T:System.ArgumentException">If the name has an empty element name.</exception>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Debug(System.String)">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Debug(System.Func{System.String})">
+            <summary>
+              Logs a debug message with lazily constructed message. The message will be constructed only if the <see cref="P:Castle.Core.Logging.ILogger.IsDebugEnabled"/> is true.
+            </summary>
+            <param name="messageFactory"></param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Debug(System.String,System.Exception)">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.DebugFormat(System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.DebugFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.DebugFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.DebugFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Error(System.String)">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Error(System.Func{System.String})">
+            <summary>
+              Logs an error message with lazily constructed message. The message will be constructed only if the <see cref="P:Castle.Core.Logging.ILogger.IsErrorEnabled"/> is true.
+            </summary>
+            <param name="messageFactory"></param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Error(System.String,System.Exception)">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.ErrorFormat(System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.ErrorFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.ErrorFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.ErrorFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Fatal(System.String)">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Fatal(System.Func{System.String})">
+            <summary>
+              Logs a fatal message with lazily constructed message. The message will be constructed only if the <see cref="P:Castle.Core.Logging.ILogger.IsFatalEnabled"/> is true.
+            </summary>
+            <param name="messageFactory"></param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Fatal(System.String,System.Exception)">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalFormat(System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Info(System.String)">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Info(System.Func{System.String})">
+            <summary>
+              Logs a info message with lazily constructed message. The message will be constructed only if the <see cref="P:Castle.Core.Logging.ILogger.IsInfoEnabled"/> is true.
+            </summary>
+            <param name="messageFactory"></param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Info(System.String,System.Exception)">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.InfoFormat(System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.InfoFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.InfoFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.InfoFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Warn(System.String)">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Warn(System.Func{System.String})">
+            <summary>
+              Logs a warn message with lazily constructed message. The message will be constructed only if the <see cref="P:Castle.Core.Logging.ILogger.IsWarnEnabled"/> is true.
+            </summary>
+            <param name="messageFactory"></param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Warn(System.String,System.Exception)">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.WarnFormat(System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.WarnFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.WarnFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.WarnFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsDebugEnabled">
+            <summary>
+              Determines if messages of priority "debug" will be logged.
+            </summary>
+            <value>True if "debug" messages will be logged.</value>
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsErrorEnabled">
+            <summary>
+              Determines if messages of priority "error" will be logged.
+            </summary>
+            <value>True if "error" messages will be logged.</value>
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsFatalEnabled">
+            <summary>
+              Determines if messages of priority "fatal" will be logged.
+            </summary>
+            <value>True if "fatal" messages will be logged.</value>
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsInfoEnabled">
+            <summary>
+              Determines if messages of priority "info" will be logged.
+            </summary>
+            <value>True if "info" messages will be logged.</value>
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsWarnEnabled">
+            <summary>
+              Determines if messages of priority "warn" will be logged.
+            </summary>
+            <value>True if "warn" messages will be logged.</value>
+        </member>
+        <member name="P:Castle.Core.Logging.IExtendedLogger.GlobalProperties">
+            <summary>
+              Exposes the Global Context of the extended logger.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.IExtendedLogger.ThreadProperties">
+            <summary>
+              Exposes the Thread Context of the extended logger.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.IExtendedLogger.ThreadStacks">
+            <summary>
+              Exposes the Thread Stack of the extended logger.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.ConsoleLogger">
+            <summary>
+            The Logger sending everything to the standard output streams.
+            This is mainly for the cases when you have a utility that
+            does not have a logger to supply.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.LevelFilteredLogger">
+            <summary>
+            The Level Filtered Logger class.  This is a base clase which
+            provides a LogLevel attribute and reroutes all functions into
+            one Log method.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.#ctor">
+            <summary>
+              Creates a new <c>LevelFilteredLogger</c>.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InitializeLifetimeService">
+            <summary>
+            Keep the instance alive in a remoting scenario
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Debug(System.String)">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Debug(System.String,System.Exception)">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.DebugFormat(System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.DebugFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.DebugFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.DebugFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Info(System.String)">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Info(System.String,System.Exception)">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InfoFormat(System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InfoFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InfoFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InfoFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Warn(System.String)">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Warn(System.String,System.Exception)">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.WarnFormat(System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.WarnFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.WarnFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.WarnFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Error(System.String)">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Error(System.String,System.Exception)">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.ErrorFormat(System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.ErrorFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.ErrorFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.ErrorFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Fatal(System.String)">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Fatal(System.String,System.Exception)">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalFormat(System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Log(Castle.Core.Logging.LoggerLevel,System.String,System.String,System.Exception)">
+            <summary>
+              Implementors output the log content by implementing this method only.
+              Note that exception can be null
+            </summary>
+            <param name = "loggerLevel"></param>
+            <param name = "loggerName"></param>
+            <param name = "message"></param>
+            <param name = "exception"></param>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.Level">
+            <value>
+              The <c>LoggerLevel</c> that this logger
+              will be using. Defaults to <c>LoggerLevel.Off</c>
+            </value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.Name">
+            <value>
+              The name that this logger will be using. 
+              Defaults to <c>String.Empty</c>
+            </value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsDebugEnabled">
+            <summary>
+              Determines if messages of priority "debug" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Debug"/> bit</value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsInfoEnabled">
+            <summary>
+              Determines if messages of priority "info" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Info"/> bit</value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsWarnEnabled">
+            <summary>
+              Determines if messages of priority "warn" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Warn"/> bit</value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsErrorEnabled">
+            <summary>
+              Determines if messages of priority "error" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Error"/> bit</value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsFatalEnabled">
+            <summary>
+              Determines if messages of priority "fatal" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Fatal"/> bit</value>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.#ctor">
+            <summary>
+              Creates a new ConsoleLogger with the <c>Level</c>
+              set to <c>LoggerLevel.Debug</c> and the <c>Name</c>
+              set to <c>String.Empty</c>.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.#ctor(Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new ConsoleLogger with the <c>Name</c>
+              set to <c>String.Empty</c>.
+            </summary>
+            <param name = "logLevel">The logs Level.</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.#ctor(System.String)">
+            <summary>
+              Creates a new ConsoleLogger with the <c>Level</c>
+              set to <c>LoggerLevel.Debug</c>.
+            </summary>
+            <param name = "name">The logs Name.</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.#ctor(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new ConsoleLogger.
+            </summary>
+            <param name = "name">The logs Name.</param>
+            <param name = "logLevel">The logs Level.</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.Log(Castle.Core.Logging.LoggerLevel,System.String,System.String,System.Exception)">
+            <summary>
+              A Common method to log.
+            </summary>
+            <param name = "loggerLevel">The level of logging</param>
+            <param name = "loggerName">The name of the logger</param>
+            <param name = "message">The Message</param>
+            <param name = "exception">The Exception</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.CreateChildLogger(System.String)">
+            <summary>
+              Returns a new <c>ConsoleLogger</c> with the name
+              added after this loggers name, with a dot in between.
+            </summary>
+            <param name = "loggerName">The added hierarchical name.</param>
+            <returns>A new <c>ConsoleLogger</c>.</returns>
+        </member>
+        <member name="T:Castle.Core.Logging.DiagnosticsLogger">
+            <summary>
+              The Logger using standart Diagnostics namespace.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.DiagnosticsLogger.#ctor(System.String)">
+            <summary>
+              Creates a logger based on <see cref="T:System.Diagnostics.EventLog"/>.
+            </summary>
+            <param name="logName"><see cref="P:System.Diagnostics.EventLog.Log"/></param>
+        </member>
+        <member name="M:Castle.Core.Logging.DiagnosticsLogger.#ctor(System.String,System.String)">
+            <summary>
+              Creates a logger based on <see cref="T:System.Diagnostics.EventLog"/>.
+            </summary>
+            <param name="logName"><see cref="P:System.Diagnostics.EventLog.Log"/></param>
+            <param name="source"><see cref="P:System.Diagnostics.EventLog.Source"/></param>
+        </member>
+        <member name="M:Castle.Core.Logging.DiagnosticsLogger.#ctor(System.String,System.String,System.String)">
+            <summary>
+              Creates a logger based on <see cref="T:System.Diagnostics.EventLog"/>.
+            </summary>
+            <param name="logName"><see cref="P:System.Diagnostics.EventLog.Log"/></param>
+            <param name="machineName"><see cref="P:System.Diagnostics.EventLog.MachineName"/></param>
+            <param name="source"><see cref="P:System.Diagnostics.EventLog.Source"/></param>
+        </member>
+        <member name="T:Castle.Core.Logging.NullLogger">
+            <summary>
+              The Null Logger class.  This is useful for implementations where you need
+              to provide a logger to a utility class, but do not want any output from it.
+              It also helps when you have a utility that does not have a logger to supply.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.CreateChildLogger(System.String)">
+            <summary>
+              Returns this <c>NullLogger</c>.
+            </summary>
+            <param name = "loggerName">Ignored</param>
+            <returns>This ILogger instance.</returns>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Debug(System.String)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Debug(System.String,System.Exception)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.DebugFormat(System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.DebugFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.DebugFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.DebugFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Error(System.String)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Error(System.String,System.Exception)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.ErrorFormat(System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.ErrorFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.ErrorFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.ErrorFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Fatal(System.String)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Fatal(System.String,System.Exception)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalFormat(System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Info(System.String)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Info(System.String,System.Exception)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.InfoFormat(System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.InfoFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.InfoFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.InfoFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Warn(System.String)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Warn(System.String,System.Exception)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.WarnFormat(System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.WarnFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.WarnFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.WarnFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.GlobalProperties">
+            <summary>
+              Returns empty context properties.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.ThreadProperties">
+            <summary>
+              Returns empty context properties.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.ThreadStacks">
+            <summary>
+              Returns empty context stacks.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsDebugEnabled">
+            <summary>
+              No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsErrorEnabled">
+            <summary>
+              No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsFatalEnabled">
+            <summary>
+              No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsInfoEnabled">
+            <summary>
+              No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsWarnEnabled">
+            <summary>
+              No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="T:Castle.Core.Logging.StreamLogger">
+            <summary>
+            The Stream Logger class.  This class can stream log information
+            to any stream, it is suitable for storing a log file to disk,
+            or to a <c>MemoryStream</c> for testing your components.
+            </summary>
+            <remarks>
+            This logger is not thread safe.
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.Logging.StreamLogger.#ctor(System.String,System.IO.Stream)">
+            <summary>
+              Creates a new <c>StreamLogger</c> with default encoding 
+              and buffer size. Initial Level is set to Debug.
+            </summary>
+            <param name = "name">
+              The name of the log.
+            </param>
+            <param name = "stream">
+              The stream that will be used for logging,
+              seeking while the logger is alive 
+            </param>
+        </member>
+        <member name="M:Castle.Core.Logging.StreamLogger.#ctor(System.String,System.IO.Stream,System.Text.Encoding)">
+            <summary>
+              Creates a new <c>StreamLogger</c> with default buffer size.
+              Initial Level is set to Debug.
+            </summary>
+            <param name="name">
+              The name of the log.
+            </param>
+            <param name="stream">
+              The stream that will be used for logging,
+              seeking while the logger is alive 
+            </param>
+            <param name="encoding">
+              The encoding that will be used for this stream.
+              <see cref="T:System.IO.StreamWriter"/>
+            </param>
+        </member>
+        <member name="M:Castle.Core.Logging.StreamLogger.#ctor(System.String,System.IO.Stream,System.Text.Encoding,System.Int32)">
+            <summary>
+              Creates a new <c>StreamLogger</c>. 
+              Initial Level is set to Debug.
+            </summary>
+            <param name="name">
+              The name of the log.
+            </param>
+            <param name="stream">
+              The stream that will be used for logging,
+              seeking while the logger is alive 
+            </param>
+            <param name="encoding">
+              The encoding that will be used for this stream.
+              <see cref="T:System.IO.StreamWriter"/>
+            </param>
+            <param name="bufferSize">
+              The buffer size that will be used for this stream.
+              <see cref="T:System.IO.StreamWriter"/>
+            </param>
+        </member>
+        <member name="M:Castle.Core.Logging.StreamLogger.#ctor(System.String,System.IO.StreamWriter)">
+            <summary>
+              Creates a new <c>StreamLogger</c> with 
+              Debug as default Level.
+            </summary>
+            <param name = "name">The name of the log.</param>
+            <param name = "writer">The <c>StreamWriter</c> the log will write to.</param>
+        </member>
+        <member name="T:Castle.Core.Logging.TraceLogger">
+            <summary>
+              The TraceLogger sends all logging to the System.Diagnostics.TraceSource
+              built into the .net framework.
+            </summary>
+            <remarks>
+              Logging can be configured in the system.diagnostics configuration 
+              section. 
+            
+              If logger doesn't find a source name with a full match it will
+              use source names which match the namespace partially. For example you can
+              configure from all castle components by adding a source name with the
+              name "Castle". 
+            
+              If no portion of the namespace matches the source named "Default" will
+              be used.
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.Logging.TraceLogger.#ctor(System.String)">
+            <summary>
+            Build a new trace logger based on the named TraceSource
+            </summary>
+            <param name="name">The name used to locate the best TraceSource. In most cases comes from the using type's fullname.</param>
+        </member>
+        <member name="M:Castle.Core.Logging.TraceLogger.#ctor(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+            Build a new trace logger based on the named TraceSource
+            </summary>
+            <param name="name">The name used to locate the best TraceSource. In most cases comes from the using type's fullname.</param>
+            <param name="level">The default logging level at which this source should write messages. In almost all cases this
+            default value will be overridden in the config file. </param>
+        </member>
+        <member name="M:Castle.Core.Logging.TraceLogger.CreateChildLogger(System.String)">
+            <summary>
+            Create a new child logger.
+            The name of the child logger is [current-loggers-name].[passed-in-name]
+            </summary>
+            <param name="loggerName">The Subname of this logger.</param>
+            <returns>The New ILogger instance.</returns> 
+        </member>
+        <member name="T:Castle.Core.Configuration.AbstractConfiguration">
+            <summary>
+              This is an abstract <see cref="T:Castle.Core.Configuration.IConfiguration"/> implementation
+              that deals with methods that can be abstracted away
+              from underlying implementations.
+            </summary>
+            <remarks>
+              <para><b>AbstractConfiguration</b> makes easier to implementers 
+                to create a new version of <see cref="T:Castle.Core.Configuration.IConfiguration"/></para>
+            </remarks>
+        </member>
+        <member name="T:Castle.Core.Configuration.IConfiguration">
+            <summary>
+            <see cref="T:Castle.Core.Configuration.IConfiguration"/> is a interface encapsulating a configuration node
+            used to retrieve configuration values.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.IConfiguration.GetValue(System.Type,System.Object)">
+            <summary>
+            Gets the value of the node and converts it 
+            into specified <see cref="T:System.Type"/>.
+            </summary>
+            <param name="type">The <see cref="T:System.Type"/></param>
+            <param name="defaultValue">
+            The Default value returned if the conversion fails.
+            </param>
+            <returns>The Value converted into the specified type.</returns>
+        </member>
+        <member name="P:Castle.Core.Configuration.IConfiguration.Name">
+            <summary>
+            Gets the name of the node.
+            </summary>
+            <value>
+            The Name of the node.
+            </value> 
+        </member>
+        <member name="P:Castle.Core.Configuration.IConfiguration.Value">
+            <summary>
+            Gets the value of the node.
+            </summary>
+            <value>
+            The Value of the node.
+            </value> 
+        </member>
+        <member name="P:Castle.Core.Configuration.IConfiguration.Children">
+            <summary>
+            Gets an <see cref="T:Castle.Core.Configuration.ConfigurationCollection"/> of <see cref="T:Castle.Core.Configuration.IConfiguration"/>
+            elements containing all node children.
+            </summary>
+            <value>The Collection of child nodes.</value>
+        </member>
+        <member name="P:Castle.Core.Configuration.IConfiguration.Attributes">
+            <summary>
+            Gets an <see cref="T:System.Collections.IDictionary"/> of the configuration attributes.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.AbstractConfiguration.GetValue(System.Type,System.Object)">
+            <summary>
+              Gets the value of the node and converts it
+              into specified <see cref="T:System.Type"/>.
+            </summary>
+            <param name="type">The <see cref="T:System.Type"/></param>
+            <param name="defaultValue">
+              The Default value returned if the conversion fails.
+            </param>
+            <returns>The Value converted into the specified type.</returns>
+        </member>
+        <member name="P:Castle.Core.Configuration.AbstractConfiguration.Attributes">
+            <summary>
+              Gets node attributes.
+            </summary>
+            <value>
+              All attributes of the node.
+            </value>
+        </member>
+        <member name="P:Castle.Core.Configuration.AbstractConfiguration.Children">
+            <summary>
+              Gets all child nodes.
+            </summary>
+            <value>The <see cref="T:Castle.Core.Configuration.ConfigurationCollection"/> of child nodes.</value>
+        </member>
+        <member name="P:Castle.Core.Configuration.AbstractConfiguration.Name">
+            <summary>
+              Gets the name of the <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </summary>
+            <value>
+              The Name of the <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </value>
+        </member>
+        <member name="P:Castle.Core.Configuration.AbstractConfiguration.Value">
+            <summary>
+              Gets the value of <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </summary>
+            <value>
+              The Value of the <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </value>
+        </member>
+        <member name="T:Castle.Core.Configuration.ConfigurationCollection">
+            <summary>
+            A collection of <see cref="T:Castle.Core.Configuration.IConfiguration"/> objects.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.ConfigurationCollection.#ctor">
+            <summary>
+            Creates a new instance of <c>ConfigurationCollection</c>.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.ConfigurationCollection.#ctor(System.Collections.Generic.IEnumerable{Castle.Core.Configuration.IConfiguration})">
+            <summary>
+            Creates a new instance of <c>ConfigurationCollection</c>.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Configuration.MutableConfiguration">
+            <summary>
+            Summary description for MutableConfiguration.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.MutableConfiguration.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Core.Configuration.MutableConfiguration"/> class.
+            </summary>
+            <param name="name">The name.</param>
+        </member>
+        <member name="P:Castle.Core.Configuration.MutableConfiguration.Value">
+            <summary>
+            Gets the value of <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </summary>
+            <value>
+            The Value of the <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </value>
+        </member>
+        <member name="M:Castle.Core.Configuration.Xml.XmlConfigurationDeserializer.Deserialize(System.Xml.XmlNode)">
+            <summary>
+              Deserializes the specified node into an abstract representation of configuration.
+            </summary>
+            <param name = "node">The node.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Configuration.Xml.XmlConfigurationDeserializer.GetConfigValue(System.String)">
+            <summary>
+              If a config value is an empty string we return null, this is to keep
+              backward compatibility with old code
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Pair`2">
+            <summary>
+            General purpose class to represent a standard pair of values. 
+            </summary>
+            <typeparam name="TFirst">Type of the first value</typeparam>
+            <typeparam name="TSecond">Type of the second value</typeparam>
+        </member>
+        <member name="M:Castle.Core.Pair`2.#ctor(`0,`1)">
+            <summary>
+            Constructs a pair with its values
+            </summary>
+            <param name="first"></param>
+            <param name="second"></param>
+        </member>
+        <member name="T:Castle.Core.ProxyServices">
+            <summary>
+            List of utility methods related to dynamic proxy operations
+            </summary>
+        </member>
+        <member name="M:Castle.Core.ProxyServices.IsDynamicProxy(System.Type)">
+            <summary>
+            Determines whether the specified type is a proxy generated by
+            DynamicProxy (1 or 2).
+            </summary>
+            <param name="type">The type.</param>
+            <returns>
+            	<c>true</c> if it is a proxy; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="T:Castle.Core.ReflectionBasedDictionaryAdapter">
+            <summary>
+            Readonly implementation of <see cref="T:System.Collections.IDictionary"/> which uses an anonymous object as its source. Uses names of properties as keys, and property values as... well - values. Keys are not case sensitive.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.#ctor(System.Object)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.Core.ReflectionBasedDictionaryAdapter"/> class.
+            </summary>
+            <param name="target">The target.</param>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Add(System.Object,System.Object)">
+            <summary>
+              Adds an element with the provided key and value to the <see cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <param name = "key">The <see cref = "T:System.Object" /> to use as the key of the element to add.</param>
+            <param name = "value">The <see cref = "T:System.Object" /> to use as the value of the element to add.</param>
+            <exception cref = "T:System.ArgumentNullException">
+              <paramref name = "key" /> is null. </exception>
+            <exception cref = "T:System.ArgumentException">An element with the same key already exists in the <see
+               cref = "T:System.Collections.IDictionary" /> object. </exception>
+            <exception cref = "T:System.NotSupportedException">The <see cref = "T:System.Collections.IDictionary" /> is read-only.-or- The <see
+               cref = "T:System.Collections.IDictionary" /> has a fixed size. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Clear">
+            <summary>
+              Removes all elements from the <see cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <exception cref = "T:System.NotSupportedException">The <see cref = "T:System.Collections.IDictionary" /> object is read-only. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Contains(System.Object)">
+            <summary>
+              Determines whether the <see cref = "T:System.Collections.IDictionary" /> object contains an element with the specified key.
+            </summary>
+            <param name = "key">The key to locate in the <see cref = "T:System.Collections.IDictionary" /> object.</param>
+            <returns>
+              true if the <see cref = "T:System.Collections.IDictionary" /> contains an element with the key; otherwise, false.
+            </returns>
+            <exception cref = "T:System.ArgumentNullException">
+              <paramref name = "key" /> is null. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Remove(System.Object)">
+            <summary>
+              Removes the element with the specified key from the <see cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <param name = "key">The key of the element to remove.</param>
+            <exception cref = "T:System.ArgumentNullException">
+              <paramref name = "key" /> is null. </exception>
+            <exception cref = "T:System.NotSupportedException">The <see cref = "T:System.Collections.IDictionary" /> object is read-only.-or- The <see
+               cref = "T:System.Collections.IDictionary" /> has a fixed size. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.GetEnumerator">
+            <summary>
+              Returns an enumerator that iterates through a collection.
+            </summary>
+            <returns>
+              An <see cref = "T:System.Collections.IEnumerator" /> object that can be used to iterate through the collection.
+            </returns>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.System#Collections#ICollection#CopyTo(System.Array,System.Int32)">
+            <summary>
+              Copies the elements of the <see cref = "T:System.Collections.ICollection" /> to an <see cref = "T:System.Array" />, starting at a particular <see
+               cref = "T:System.Array" /> index.
+            </summary>
+            <param name = "array">The one-dimensional <see cref = "T:System.Array" /> that is the destination of the elements copied from <see
+               cref = "T:System.Collections.ICollection" />. The <see cref = "T:System.Array" /> must have zero-based indexing.</param>
+            <param name = "index">The zero-based index in <paramref name = "array" /> at which copying begins.</param>
+            <exception cref = "T:System.ArgumentNullException">
+              <paramref name = "array" /> is null. </exception>
+            <exception cref = "T:System.ArgumentOutOfRangeException">
+              <paramref name = "index" /> is less than zero. </exception>
+            <exception cref = "T:System.ArgumentException">
+              <paramref name = "array" /> is multidimensional.-or- <paramref name = "index" /> is equal to or greater than the length of <paramref
+               name = "array" />.-or- The number of elements in the source <see cref = "T:System.Collections.ICollection" /> is greater than the available space from <paramref
+               name = "index" /> to the end of the destination <paramref name = "array" />. </exception>
+            <exception cref = "T:System.ArgumentException">The type of the source <see cref = "T:System.Collections.ICollection" /> cannot be cast automatically to the type of the destination <paramref
+               name = "array" />. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.System#Collections#IDictionary#GetEnumerator">
+            <summary>
+              Returns an <see cref = "T:System.Collections.IDictionaryEnumerator" /> object for the <see
+               cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <returns>
+              An <see cref = "T:System.Collections.IDictionaryEnumerator" /> object for the <see
+               cref = "T:System.Collections.IDictionary" /> object.
+            </returns>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Read(System.Collections.IDictionary,System.Object)">
+            <summary>
+              Reads values of properties from <paramref name = "valuesAsAnonymousObject" /> and inserts them into <paramref
+               name = "targetDictionary" /> using property names as keys.
+            </summary>
+            <param name = "targetDictionary"></param>
+            <param name = "valuesAsAnonymousObject"></param>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.Count">
+            <summary>
+              Gets the number of elements contained in the <see cref = "T:System.Collections.ICollection" />.
+            </summary>
+            <value></value>
+            <returns>The number of elements contained in the <see cref = "T:System.Collections.ICollection" />.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.IsSynchronized">
+            <summary>
+              Gets a value indicating whether access to the <see cref = "T:System.Collections.ICollection" /> is synchronized (thread safe).
+            </summary>
+            <value></value>
+            <returns>true if access to the <see cref = "T:System.Collections.ICollection" /> is synchronized (thread safe); otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.SyncRoot">
+            <summary>
+              Gets an object that can be used to synchronize access to the <see cref = "T:System.Collections.ICollection" />.
+            </summary>
+            <value></value>
+            <returns>An object that can be used to synchronize access to the <see cref = "T:System.Collections.ICollection" />.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.IsReadOnly">
+            <summary>
+              Gets a value indicating whether the <see cref = "T:System.Collections.IDictionary" /> object is read-only.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref = "T:System.Collections.IDictionary" /> object is read-only; otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.Item(System.Object)">
+            <summary>
+              Gets or sets the <see cref="T:System.Object"/> with the specified key.
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.Keys">
+            <summary>
+              Gets an <see cref = "T:System.Collections.ICollection" /> object containing the keys of the <see
+               cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <value></value>
+            <returns>An <see cref = "T:System.Collections.ICollection" /> object containing the keys of the <see
+               cref = "T:System.Collections.IDictionary" /> object.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.Values">
+            <summary>
+              Gets an <see cref = "T:System.Collections.ICollection" /> object containing the values in the <see
+               cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <value></value>
+            <returns>An <see cref = "T:System.Collections.ICollection" /> object containing the values in the <see
+               cref = "T:System.Collections.IDictionary" /> object.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.System#Collections#IDictionary#IsFixedSize">
+            <summary>
+              Gets a value indicating whether the <see cref = "T:System.Collections.IDictionary" /> object has a fixed size.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref = "T:System.Collections.IDictionary" /> object has a fixed size; otherwise, false.</returns>
+        </member>
+        <member name="T:Castle.Core.Resource.IResource">
+            <summary>
+            Represents a 'streamable' resource. Can
+            be a file, a resource in an assembly.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Resource.IResource.GetStreamReader">
+            <summary>
+            Returns a reader for the stream
+            </summary>
+            <remarks>
+            It's up to the caller to dispose the reader.
+            </remarks>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Resource.IResource.GetStreamReader(System.Text.Encoding)">
+            <summary>
+            Returns a reader for the stream
+            </summary>
+            <remarks>
+            It's up to the caller to dispose the reader.
+            </remarks>
+            <param name="encoding"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Resource.IResource.CreateRelative(System.String)">
+            <summary>
+            Returns an instance of <see cref="T:Castle.Core.Resource.IResource"/>
+            created according to the <c>relativePath</c>
+            using itself as the root.
+            </summary>
+            <param name="relativePath"></param>
+            <returns></returns>
+        </member>
+        <member name="P:Castle.Core.Resource.IResource.FileBasePath">
+            <summary>
+            
+            </summary>
+            <remarks>
+            Only valid for resources that
+            can be obtained through relative paths
+            </remarks>
+        </member>
+        <member name="T:Castle.Core.Resource.AbstractStreamResource">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Resource.AbstractStreamResource.createStream">
+            <summary>
+            This returns a new stream instance each time it is called.
+            It is the responsibility of the caller to dispose of this stream
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Resource.IResourceFactory">
+            <summary>
+            Depicts the contract for resource factories.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Resource.IResourceFactory.Accept(Castle.Core.Resource.CustomUri)">
+            <summary>
+            Used to check whether the resource factory
+            is able to deal with the given resource
+            identifier.
+            </summary>
+            <remarks>
+            Implementors should return <c>true</c>
+            only if the given identifier is supported
+            by the resource factory
+            </remarks>
+            <param name="uri"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Resource.IResourceFactory.Create(Castle.Core.Resource.CustomUri)">
+            <summary>
+            Creates an <see cref="T:Castle.Core.Resource.IResource"/> instance
+            for the given resource identifier
+            </summary>
+            <param name="uri"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Resource.IResourceFactory.Create(Castle.Core.Resource.CustomUri,System.String)">
+            <summary>
+            Creates an <see cref="T:Castle.Core.Resource.IResource"/> instance
+            for the given resource identifier
+            </summary>
+            <param name="uri"></param>
+            <param name="basePath"></param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.Resource.FileResource">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Resource.FileResourceFactory">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Resource.StaticContentResource">
+            <summary>
+            Adapts a static string content as an <see cref="T:Castle.Core.Resource.IResource"/>
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Resource.UncResource">
+            <summary>
+            Enable access to files on network shares
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Smtp.IEmailSender">
+            <summary>
+            Email sender abstraction.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Smtp.IEmailSender.Send(System.String,System.String,System.String,System.String)">
+            <summary>
+            Sends a mail message.
+            </summary>
+            <param name="from">From field</param>
+            <param name="to">To field</param>
+            <param name="subject">E-mail's subject</param>
+            <param name="messageText">message's body</param>
+        </member>
+        <member name="M:Castle.Core.Smtp.IEmailSender.Send(System.Net.Mail.MailMessage)">
+            <summary>
+            Sends a <see cref="T:System.Net.Mail.MailMessage">message</see>. 
+            </summary>
+            <param name="message"><see cref="T:System.Net.Mail.MailMessage">Message</see> instance</param>
+        </member>
+        <member name="M:Castle.Core.Smtp.IEmailSender.Send(System.Collections.Generic.IEnumerable{System.Net.Mail.MailMessage})">
+            <summary>
+            Sends multiple <see cref="T:System.Net.Mail.MailMessage">messages</see>. 
+            </summary>
+            <param name="messages">List of <see cref="T:System.Net.Mail.MailMessage">messages</see></param>
+        </member>
+        <member name="T:Castle.Core.Smtp.DefaultSmtpSender">
+            <summary>
+            Default <see cref="T:Castle.Core.Smtp.IEmailSender"/> implementation.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Smtp.DefaultSmtpSender.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Core.Smtp.DefaultSmtpSender"/> class based on the <see cref="T:System.Net.Mail.SmtpClient"/> configuration provided in the application configuration file.
+            </summary>
+            <remarks>
+            This constructor is based on the default <see cref="T:System.Net.Mail.SmtpClient"/> configuration in the application configuration file.
+            </remarks> 
+        </member>
+        <member name="M:Castle.Core.Smtp.DefaultSmtpSender.#ctor(System.String)">
+            <summary>
+            This service implementation
+            requires a host name in order to work
+            </summary>
+            <param name="hostname">The smtp server name</param>
+        </member>
+        <member name="M:Castle.Core.Smtp.DefaultSmtpSender.Send(System.String,System.String,System.String,System.String)">
+            <summary>
+            Sends a message. 
+            </summary>
+            <exception cref="T:System.ArgumentNullException">If any of the parameters is null</exception>
+            <param name="from">From field</param>
+            <param name="to">To field</param>
+            <param name="subject">e-mail's subject</param>
+            <param name="messageText">message's body</param>
+        </member>
+        <member name="M:Castle.Core.Smtp.DefaultSmtpSender.Send(System.Net.Mail.MailMessage)">
+            <summary>
+            Sends a message. 
+            </summary>
+            <exception cref="T:System.ArgumentNullException">If the message is null</exception>
+            <param name="message">Message instance</param>
+        </member>
+        <member name="M:Castle.Core.Smtp.DefaultSmtpSender.Configure(System.Net.Mail.SmtpClient)">
+            <summary>
+            Configures the sender
+            with port information and eventual credential
+            informed
+            </summary>
+            <param name="smtpClient">Message instance</param>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.Port">
+            <summary>
+            Gets or sets the port used to 
+            access the SMTP server
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.Hostname">
+            <summary>
+            Gets the hostname.
+            </summary>
+            <value>The hostname.</value>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.AsyncSend">
+            <summary>
+            Gets or sets a value which is used to 
+            configure if emails are going to be sent asynchronously or not.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.Timeout">
+            <summary>
+            Gets or sets a value that specifies 
+            the amount of time after which a synchronous Send call times out.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.UseSsl">
+            <summary>
+            Gets or sets a value indicating whether the email should be sent using 
+            a secure communication channel.
+            </summary>
+            <value><c>true</c> if should use SSL; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.Domain">
+            <summary>
+            Gets or sets the domain.
+            </summary>
+            <value>The domain.</value>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.UserName">
+            <summary>
+            Gets or sets the name of the user.
+            </summary>
+            <value>The name of the user.</value>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.Password">
+            <summary>
+            Gets or sets the password.
+            </summary>
+            <value>The password.</value>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.HasCredentials">
+            <summary>
+            Gets a value indicating whether credentials were informed.
+            </summary>
+            <value>
+            <see langword="true"/> if this instance has credentials; otherwise, <see langword="false"/>.
+            </value>
+        </member>
+    </members>
+</doc>
Binary file packages/Castle.Core.3.2.1/lib/net40-client/Castle.Core.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/Castle.Core.3.2.1/lib/net40-client/Castle.Core.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4754 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>Castle.Core</name>
+    </assembly>
+    <members>
+        <member name="T:Castle.Components.DictionaryAdapter.ReferenceAttribute">
+            <summary>
+            Specifies assignment by reference rather than by copying.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IfExistsAttribute">
+            <summary>
+            Suppresses any on-demand behaviors.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.RemoveIfEmptyAttribute">
+            <summary>
+            Removes a property if null or empty string, guid or collection.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.RemoveIfAttribute">
+            <summary>
+            Removes a property if matches value.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.DictionaryBehaviorAttribute">
+            <summary>
+            Assigns a specific dictionary key.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryBehavior">
+            <summary>
+            Defines the contract for customizing dictionary access.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryBehavior.Copy">
+            <summary>
+            Copies the dictionary behavior.
+            </summary>
+            <returns>null if should not be copied.  Otherwise copy.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.IDictionaryBehavior.ExecutionOrder">
+            <summary>
+            Determines relative order to apply related behaviors.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryPropertySetter">
+            <summary>
+            Defines the contract for updating dictionary values.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryPropertySetter.SetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object@,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Sets the stored dictionary value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="value">The stored value.</param>
+            <param name="property">The property.</param>
+            <returns>true if the property should be stored.</returns>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.ICondition">
+            <summary>
+            Contract for value matching.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.VolatileAttribute">
+            <summary>
+            Indicates that underlying values are changeable and should not be cached.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryInitializer">
+            <summary>
+             Contract for dictionary initialization.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryInitializer.Initialize(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.Object[])">
+            <summary>
+            Performs any initialization of the <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/>
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="behaviors">The dictionary behaviors.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapterVisitor">
+            <summary>
+            Abstract implementation of <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapterVisitor"/>.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryAdapterVisitor">
+            <summary>
+            Conract for traversing a <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/>.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryCreate">
+            <summary>
+            Contract for creating additional Dictionary adapters.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter">
+            <summary>
+            Contract for manipulating the Dictionary adapter.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryEdit">
+            <summary>
+            Contract for editing the Dictionary adapter.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryNotify">
+            <summary>
+            Contract for managing Dictionary adapter notifications.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryValidate">
+            <summary>
+            Contract for validating Dictionary adapter.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryBehaviorBuilder">
+            <summary>
+            Defines the contract for building <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryBehavior"/>s.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryBehaviorBuilder.BuildBehaviors">
+            <summary>
+            Builds the dictionary behaviors.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter">
+            <summary>
+            Abstract adapter for the <see cref="T:System.Collections.IDictionary"/> support
+            needed by the <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory"/>
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Add(System.Object,System.Object)">
+            <summary>
+            Adds an element with the provided key and value to the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <param name="key">The <see cref="T:System.Object"></see> to use as the key of the element to add.</param>
+            <param name="value">The <see cref="T:System.Object"></see> to use as the value of the element to add.</param>
+            <exception cref="T:System.ArgumentException">An element with the same key already exists in the <see cref="T:System.Collections.IDictionary"></see> object. </exception>
+            <exception cref="T:System.ArgumentNullException">key is null. </exception>
+            <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.IDictionary"></see> is read-only.-or- The <see cref="T:System.Collections.IDictionary"></see> has a fixed size. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Clear">
+            <summary>
+            Removes all elements from the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.IDictionary"></see> object is read-only. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Contains(System.Object)">
+            <summary>
+            Determines whether the <see cref="T:System.Collections.IDictionary"></see> object contains an element with the specified key.
+            </summary>
+            <param name="key">The key to locate in the <see cref="T:System.Collections.IDictionary"></see> object.</param>
+            <returns>
+            true if the <see cref="T:System.Collections.IDictionary"></see> contains an element with the key; otherwise, false.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">key is null. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.GetEnumerator">
+            <summary>
+            Returns an <see cref="T:System.Collections.IDictionaryEnumerator"></see> object for the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <returns>
+            An <see cref="T:System.Collections.IDictionaryEnumerator"></see> object for the <see cref="T:System.Collections.IDictionary"></see> object.
+            </returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Remove(System.Object)">
+            <summary>
+            Removes the element with the specified key from the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <param name="key">The key of the element to remove.</param>
+            <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.IDictionary"></see> object is read-only.-or- The <see cref="T:System.Collections.IDictionary"></see> has a fixed size. </exception>
+            <exception cref="T:System.ArgumentNullException">key is null. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.CopyTo(System.Array,System.Int32)">
+            <summary>
+            Copies the elements of the <see cref="T:System.Collections.ICollection"></see> to an <see cref="T:System.Array"></see>, starting at a particular <see cref="T:System.Array"></see> index.
+            </summary>
+            <param name="array">The one-dimensional <see cref="T:System.Array"></see> that is the destination of the elements copied from <see cref="T:System.Collections.ICollection"></see>. The <see cref="T:System.Array"></see> must have zero-based indexing.</param>
+            <param name="index">The zero-based index in array at which copying begins.</param>
+            <exception cref="T:System.ArgumentNullException">array is null. </exception>
+            <exception cref="T:System.ArgumentException">The type of the source <see cref="T:System.Collections.ICollection"></see> cannot be cast automatically to the type of the destination array. </exception>
+            <exception cref="T:System.ArgumentOutOfRangeException">index is less than zero. </exception>
+            <exception cref="T:System.ArgumentException">array is multidimensional.-or- index is equal to or greater than the length of array.-or- The number of elements in the source <see cref="T:System.Collections.ICollection"></see> is greater than the available space from index to the end of the destination array. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.System#Collections#IEnumerable#GetEnumerator">
+            <summary>
+            Returns an enumerator that iterates through a collection.
+            </summary>
+            <returns>
+            An <see cref="T:System.Collections.IEnumerator"></see> object that can be used to iterate through the collection.
+            </returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.IsFixedSize">
+            <summary>
+            Gets a value indicating whether the <see cref="T:System.Collections.IDictionary"></see> object has a fixed size.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref="T:System.Collections.IDictionary"></see> object has a fixed size; otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.IsReadOnly">
+            <summary>
+            Gets a value indicating whether the <see cref="T:System.Collections.IDictionary"></see> object is read-only.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref="T:System.Collections.IDictionary"></see> object is read-only; otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Keys">
+            <summary>
+            Gets an <see cref="T:System.Collections.ICollection"></see> object containing the keys of the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <value></value>
+            <returns>An <see cref="T:System.Collections.ICollection"></see> object containing the keys of the <see cref="T:System.Collections.IDictionary"></see> object.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Values">
+            <summary>
+            Gets an <see cref="T:System.Collections.ICollection"></see> object containing the values in the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <value></value>
+            <returns>An <see cref="T:System.Collections.ICollection"></see> object containing the values in the <see cref="T:System.Collections.IDictionary"></see> object.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Item(System.Object)">
+            <summary>
+            Gets or sets the <see cref="T:System.Object"/> with the specified key.
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Count">
+            <summary>
+            Gets the number of elements contained in the <see cref="T:System.Collections.ICollection"></see>.
+            </summary>
+            <value></value>
+            <returns>The number of elements contained in the <see cref="T:System.Collections.ICollection"></see>.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.IsSynchronized">
+            <summary>
+            Gets a value indicating whether access to the <see cref="T:System.Collections.ICollection"></see> is synchronized (thread safe).
+            </summary>
+            <value></value>
+            <returns>true if access to the <see cref="T:System.Collections.ICollection"></see> is synchronized (thread safe); otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.SyncRoot">
+            <summary>
+            Gets an object that can be used to synchronize access to the <see cref="T:System.Collections.ICollection"></see>.
+            </summary>
+            <value></value>
+            <returns>An object that can be used to synchronize access to the <see cref="T:System.Collections.ICollection"></see>.</returns>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.BindingList`1">
+            <summary>
+              Provides a generic collection that supports data binding.
+            </summary>
+            <remarks>
+              This class wraps the CLR <see cref="T:System.ComponentModel.BindingList`1"/>
+              in order to implement the Castle-specific <see cref="T:Castle.Components.DictionaryAdapter.IBindingList`1"/>.
+            </remarks>
+            <typeparam name="T">The type of elements in the list.</typeparam>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.BindingList`1.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.BindingList`1"/> class
+              using default values.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.BindingList`1.#ctor(System.Collections.Generic.IList{`0})">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.BindingList`1"/> class
+              with the specified list.
+            </summary>
+            <param name="list">
+              An <see cref="T:System.Collections.Generic.IList`1"/> of items
+              to be contained in the <see cref="T:Castle.Components.DictionaryAdapter.BindingList`1"/>.
+            </param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.BindingList`1.#ctor(System.ComponentModel.BindingList{`0})">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.BindingList`1"/> class
+              wrapping the specified <see cref="T:System.ComponentModel.BindingList`1"/> instance.
+            </summary>
+            <param name="list">
+              A <see cref="T:System.ComponentModel.BindingList`1"/>
+              to be wrapped by the <see cref="T:Castle.Components.DictionaryAdapter.BindingList`1"/>.
+            </param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryPropertyGetter">
+            <summary>
+            Defines the contract for retrieving dictionary values.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryPropertyGetter.GetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object,Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Boolean)">
+            <summary>
+            Gets the effective dictionary value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="storedValue">The stored value.</param>
+            <param name="property">The property.</param>
+            <param name="ifExists">true if return only existing.</param>
+            <returns>The effective property value.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.Xml.XmlAdapter.#ctor(Castle.Components.DictionaryAdapter.Xml.IXmlNode,Castle.Components.DictionaryAdapter.Xml.XmlReferenceManager)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.Xml.XmlAdapter"/> class
+            that represents a child object in a larger object graph.
+            </summary>
+            <param name="node"></param>
+            <param name="references"></param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryMetaInitializer">
+            <summary>
+             Contract for dictionary meta-data initialization.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryMetaInitializer.Initialize(Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory,Castle.Components.DictionaryAdapter.DictionaryAdapterMeta)">
+            <summary>
+            	Initializes the given <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> object.
+            </summary>
+            <param name="factory">The dictionary adapter factory.</param>
+            <param name="dictionaryMeta">The dictionary adapter meta.</param>
+            
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryMetaInitializer.ShouldHaveBehavior(System.Object)">
+            <summary>
+            	Determines whether the given behavior should be included in a new
+            	<see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> object.
+            </summary>
+            <param name="behavior">A dictionary behavior or annotation.</param>
+            <returns>True if the behavior should be included; otherwise, false.</returns>
+            <remarks>
+            	<see cref="T:Castle.Components.DictionaryAdapter.IDictionaryMetaInitializer"/> behaviors are always included,
+            	regardless of the result of this method.
+            </remarks>
+            
+        </member>
+        <member name="M:Castle.Core.Internal.CollectionExtensions.IsNullOrEmpty(System.Collections.IEnumerable)">
+            <summary>
+              Checks whether or not collection is null or empty. Assumes colleciton can be safely enumerated multiple times.
+            </summary>
+            <param name = "this"></param>
+            <returns></returns>
+        </member>
+        <member name="F:Castle.Core.Internal.InternalsVisible.ToCastleCore">
+            <summary>
+              Constant to use when making assembly internals visible to Castle.Core 
+              <c>[assembly: InternalsVisibleTo(CoreInternalsVisible.ToCastleCore)]</c>
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Internal.InternalsVisible.ToDynamicProxyGenAssembly2">
+            <summary>
+              Constant to use when making assembly internals visible to proxy types generated by DynamicProxy. Required when proxying internal types.
+              <c>[assembly: InternalsVisibleTo(CoreInternalsVisible.ToDynamicProxyGenAssembly2)]</c>
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.ComponentAttribute">
+            <summary>
+            Identifies a property should be represented as a nested component.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryKeyBuilder">
+            <summary>
+            Defines the contract for building typed dictionary keys.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryKeyBuilder.GetKey(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Builds the specified key.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The current key.</param>
+            <param name="property">The property.</param>
+            <returns>The updated key</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.ComponentAttribute.NoPrefix">
+            <summary>
+            Applies no prefix.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.ComponentAttribute.Prefix">
+            <summary>
+            Gets or sets the prefix.
+            </summary>
+            <value>The prefix.</value>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.DictionaryAdapterAttribute">
+            <summary>
+            Identifies the dictionary adapter types.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.FetchAttribute">
+            <summary>
+            Identifies an interface or property to be pre-fetched.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.FetchAttribute.#ctor">
+            <summary>
+            Instructs fetching to occur.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.FetchAttribute.#ctor(System.Boolean)">
+            <summary>
+            Instructs fetching according to <paramref name="fetch"/>
+            </summary>
+            <param name="fetch"></param>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.FetchAttribute.Fetch">
+            <summary>
+            Gets whether or not fetching should occur.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.GroupAttribute">
+            <summary>
+            Assigns a property to a group.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.GroupAttribute.#ctor(System.Object)">
+            <summary>
+            Constructs a group assignment.
+            </summary>
+            <param name="group">The group name.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.GroupAttribute.#ctor(System.Object[])">
+            <summary>
+            Constructs a group assignment.
+            </summary>
+            <param name="group">The group name.</param>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.GroupAttribute.Group">
+            <summary>
+            Gets the group the property is assigned to.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.KeyAttribute">
+            <summary>
+            Assigns a specific dictionary key.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeyAttribute.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeyAttribute"/> class.
+            </summary>
+            <param name="key">The key.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeyAttribute.#ctor(System.String[])">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeyAttribute"/> class.
+            </summary>
+            <param name="keys">The compound key.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.KeyPrefixAttribute">
+            <summary>
+            Assigns a prefix to the keyed properties of an interface.
+            </summary>
+            <remarks>
+            Key prefixes are not inherited by sub-interfaces.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeyPrefixAttribute.#ctor">
+            <summary>
+            Initializes a default instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeyPrefixAttribute"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeyPrefixAttribute.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeyPrefixAttribute"/> class.
+            </summary>
+            <param name="keyPrefix">The prefix for the keyed properties of the interface.</param>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.KeyPrefixAttribute.KeyPrefix">
+            <summary>
+            Gets the prefix key added to the properties of the interface.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.KeySubstitutionAttribute">
+            <summary>
+            Substitutes part of key with another string.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeySubstitutionAttribute.#ctor(System.String,System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeySubstitutionAttribute"/> class.
+            </summary>
+            <param name="oldValue">The old value.</param>
+            <param name="newValue">The new value.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.MultiLevelEditAttribute">
+            <summary>
+            Requests support for multi-level editing.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.NewGuidAttribute">
+            <summary>
+            Generates a new GUID on demand.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.OnDemandAttribute">
+            <summary>
+            Support for on-demand value resolution.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.StringFormatAttribute">
+            <summary>
+            Provides simple string formatting from existing properties.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.StringFormatAttribute.Format">
+            <summary>
+            Gets the string format.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.StringFormatAttribute.Properties">
+            <summary>
+            Gets the format properties.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.StringListAttribute">
+            <summary>
+            Identifies a property should be represented as a delimited string value.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.StringListAttribute.Separator">
+            <summary>
+            Gets the separator.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.StringValuesAttribute">
+            <summary>
+            Converts all properties to strings.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.StringValuesAttribute.Format">
+            <summary>
+            Gets or sets the format.
+            </summary>
+            <value>The format.</value>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.SuppressNotificationsAttribute">
+            <summary>
+            Suppress property change notifications.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IPropertyDescriptorInitializer">
+            <summary>
+             Contract for property descriptor initialization.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IPropertyDescriptorInitializer.Initialize(Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Object[])">
+            <summary>
+            Performs any initialization of the <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <param name="propertyDescriptor">The property descriptor.</param>
+            <param name="behaviors">The property behaviors.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.TypeKeyPrefixAttribute">
+            <summary>
+            Assigns a prefix to the keyed properties using the interface name.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.DefaultPropertyGetter">
+            <summary>
+            Manages conversion between property values.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DefaultPropertyGetter.#ctor(System.ComponentModel.TypeConverter)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.DefaultPropertyGetter"/> class.
+            </summary>
+            <param name="converter">The converter.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DefaultPropertyGetter.GetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object,Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Boolean)">
+            <summary>
+            Gets the effective dictionary value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="storedValue">The stored value.</param>
+            <param name="property">The property.</param>
+            <param name="ifExists">true if return only existing.</param>
+            <returns>The effective property value.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.DefaultPropertyGetter.ExecutionOrder">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory">
+            <summary>
+            Uses Reflection.Emit to expose the properties of a dictionary
+            through a dynamic implementation of a typed interface.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory">
+            <summary>
+            Defines the contract for building typed dictionary adapters.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter``1(System.Collections.IDictionary)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Collections.IDictionary"/>.
+            </summary>
+            <typeparam name="T">The typed interface.</typeparam>
+            <param name="dictionary">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the dictionary.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.IDictionary)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Collections.IDictionary"/>.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="dictionary">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the dictionary.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.IDictionary,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Collections.IDictionary"/>.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="dictionary">The underlying source of properties.</param>
+            <param name="descriptor">The property descriptor.</param>
+            <returns>An implementation of the typed interface bound to the dictionary.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter``1(System.Collections.Specialized.NameValueCollection)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Collections.Specialized.NameValueCollection"/>.
+            </summary>
+            <typeparam name="T">The typed interface.</typeparam>
+            <param name="nameValues">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the namedValues.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.Specialized.NameValueCollection)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Collections.Specialized.NameValueCollection"/>.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="nameValues">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the namedValues.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter``1(System.Xml.XmlNode)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Xml.XmlNode"/>.
+            </summary>
+            <typeparam name="T">The typed interface.</typeparam>
+            <param name="xmlNode">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the <see cref="T:System.Xml.XmlNode"/>.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter(System.Type,System.Xml.XmlNode)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Xml.XmlNode"/>.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="xmlNode">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the <see cref="T:System.Xml.XmlNode"/>.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapterMeta(System.Type)">
+            <summary>
+            Gets the <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> associated with the type.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <returns>The adapter meta-data.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapterMeta(System.Type,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Gets the <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> associated with the type.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="descriptor">The property descriptor.</param>
+            <returns>The adapter meta-data.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapterMeta(System.Type,Castle.Components.DictionaryAdapter.DictionaryAdapterMeta)">
+            <summary>
+            Gets the <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> associated with the type.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="other">Another <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> from which to copy behaviors.</param>
+            <returns>The adapter meta-data.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter``1(System.Collections.IDictionary)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.IDictionary)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.IDictionary,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter``2(System.Collections.Generic.IDictionary{System.String,``1})">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter``1(System.Type,System.Collections.Generic.IDictionary{System.String,``0})">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter``1(System.Collections.Specialized.NameValueCollection)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.Specialized.NameValueCollection)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter``1(System.Xml.XmlNode)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter(System.Type,System.Xml.XmlNode)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapterMeta(System.Type)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapterMeta(System.Type,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapterMeta(System.Type,Castle.Components.DictionaryAdapter.DictionaryAdapterMeta)">
+            <inheritdoc />
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryValidator">
+            <summary>
+            Contract for dictionary validation.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryValidator.IsValid(Castle.Components.DictionaryAdapter.IDictionaryAdapter)">
+            <summary>
+            Determines if <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/> is valid.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <returns>true if valid.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryValidator.Validate(Castle.Components.DictionaryAdapter.IDictionaryAdapter)">
+            <summary>
+            Validates the <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/>.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <returns>The error summary information.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryValidator.Validate(Castle.Components.DictionaryAdapter.IDictionaryAdapter,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Validates the <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/> for a property.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="property">The property to validate.</param>
+            <returns>The property summary information.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryValidator.Invalidate(Castle.Components.DictionaryAdapter.IDictionaryAdapter)">
+            <summary>
+            Invalidates any results cached by the validator.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter.#ctor(System.Collections.Specialized.NameValueCollection)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter"/> class.
+            </summary>
+            <param name="nameValues">The name values.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter.Contains(System.Object)">
+            <summary>
+            Determines whether the <see cref="T:System.Collections.IDictionary"></see> object contains an element with the specified key.
+            </summary>
+            <param name="key">The key to locate in the <see cref="T:System.Collections.IDictionary"></see> object.</param>
+            <returns>
+            true if the <see cref="T:System.Collections.IDictionary"></see> contains an element with the key; otherwise, false.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">key is null. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter.Adapt(System.Collections.Specialized.NameValueCollection)">
+            <summary>
+            Adapts the specified name values.
+            </summary>
+            <param name="nameValues">The name values.</param>
+            <returns></returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter.IsReadOnly">
+            <summary>
+            Gets a value indicating whether the <see cref="T:System.Collections.IDictionary"></see> object is read-only.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref="T:System.Collections.IDictionary"></see> object is read-only; otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter.Item(System.Object)">
+            <summary>
+            Gets or sets the <see cref="T:System.Object"/> with the specified key.
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.PropertyDescriptor">
+            <summary>
+            Describes a dictionary property.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.#ctor">
+            <summary>
+            Initializes an empty <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.#ctor(System.Reflection.PropertyInfo,System.Object[])">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/> class.
+            </summary>
+            <param name="property">The property.</param>
+            <param name="annotations">The annotations.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.#ctor(System.Object[])">
+            <summary>
+            Initializes a new instance <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.#ctor(Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Boolean)">
+            <summary>
+             Copies an existinginstance of the <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/> class.
+            </summary>
+            <param name="source"></param>
+            <param name="copyBehaviors"></param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.GetKey(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Gets the key.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="descriptor">The descriptor.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.GetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object,Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Boolean)">
+            <summary>
+            Gets the property value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="storedValue">The stored value.</param>
+            <param name="descriptor">The descriptor.</param>
+            <param name="ifExists">true if return only existing.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.SetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object@,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Sets the property value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="value">The value.</param>
+            <param name="descriptor">The descriptor.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.AddBehavior(Castle.Components.DictionaryAdapter.IDictionaryBehavior)">
+            <summary>
+            Adds a single behavior.
+            </summary>
+            <param name="behavior">The behavior.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.AddBehaviors(Castle.Components.DictionaryAdapter.IDictionaryBehavior[])">
+            <summary>
+            Adds the behaviors.
+            </summary>
+            <param name="behaviors">The behaviors.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.AddBehaviors(System.Collections.Generic.IEnumerable{Castle.Components.DictionaryAdapter.IDictionaryBehavior})">
+            <summary>
+            Adds the behaviors.
+            </summary>
+            <param name="behaviors">The behaviors.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.CopyBehaviors(Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Copies the behaviors to the other <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <param name="other"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.Copy">
+            <summary>
+            Copies the <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.ExecutionOrder">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.PropertyName">
+            <summary>
+            Gets the property name.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.PropertyType">
+            <summary>
+            Gets the property type.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Property">
+            <summary>
+            Gets the property.
+            </summary>
+            <value>The property.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.IsDynamicProperty">
+            <summary>
+            Returns true if the property is dynamic.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.State">
+            <summary>
+            Gets additional state.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Fetch">
+            <summary>
+            Determines if property should be fetched.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.IfExists">
+            <summary>
+            Determines if property must exist first.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.SuppressNotifications">
+            <summary>
+            Determines if notifications should occur.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Annotations">
+            <summary>
+            Gets the property behaviors.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.TypeConverter">
+            <summary>
+            Gets the type converter.
+            </summary>
+            <value>The type converter.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.ExtendedProperties">
+            <summary>
+            Gets the extended properties.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Behaviors">
+            <summary>
+            Gets the setter.
+            </summary>
+            <value>The setter.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.KeyBuilders">
+            <summary>
+            Gets the key builders.
+            </summary>
+            <value>The key builders.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Setters">
+            <summary>
+            Gets the setter.
+            </summary>
+            <value>The setter.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Getters">
+            <summary>
+            Gets the getter.
+            </summary>
+            <value>The getter.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Initializers">
+            <summary>
+            Gets the initializers.
+            </summary>
+            <value>The initializers.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.MetaInitializers">
+            <summary>
+            Gets the meta-data initializers.
+            </summary>
+            <value>The meta-data initializers.</value>
+        </member>
+        <member name="T:Castle.Core.Internal.AttributesUtil">
+            <summary>
+              Helper class for retrieving attributes.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetAttribute``1(System.Reflection.ICustomAttributeProvider)">
+            <summary>
+              Gets the attribute.
+            </summary>
+            <param name = "member">The member.</param>
+            <returns>The member attribute.</returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetAttributes``1(System.Reflection.ICustomAttributeProvider)">
+            <summary>
+              Gets the attributes. Does not consider inherited attributes!
+            </summary>
+            <param name = "member">The member.</param>
+            <returns>The member attributes.</returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetTypeAttribute``1(System.Type)">
+            <summary>
+              Gets the type attribute.
+            </summary>
+            <param name = "type">The type.</param>
+            <returns>The type attribute.</returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetTypeAttributes``1(System.Type)">
+            <summary>
+              Gets the type attributes.
+            </summary>
+            <param name = "type">The type.</param>
+            <returns>The type attributes.</returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetTypeConverter(System.Reflection.MemberInfo)">
+            <summary>
+              Gets the type converter.
+            </summary>
+            <param name = "member">The member.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.HasAttribute``1(System.Reflection.ICustomAttributeProvider)">
+            <summary>
+              Gets the attribute.
+            </summary>
+            <param name = "member">The member.</param>
+            <returns>The member attribute.</returns>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDynamicValue`1">
+            <summary>
+            Contract for typed dynamic value resolution.
+            </summary>
+            <typeparam name="T"></typeparam>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDynamicValue">
+            <summary>
+            Contract for dynamic value resolution.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.LoggerLevel">
+            <summary>
+              Supporting Logger levels.
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Off">
+            <summary>
+              Logging will be off
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Fatal">
+            <summary>
+              Fatal logging level
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Error">
+            <summary>
+              Error logging level
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Warn">
+            <summary>
+              Warn logging level
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Info">
+            <summary>
+              Info logging level
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Debug">
+            <summary>
+              Debug logging level
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.IInvocation">
+            <summary>
+              Encapsulates an invocation of a proxied method.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.GetArgumentValue(System.Int32)">
+            <summary>
+              Gets the value of the argument at the specified <paramref name = "index" />.
+            </summary>
+            <param name = "index">The index.</param>
+            <returns>The value of the argument at the specified <paramref name = "index" />.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.GetConcreteMethod">
+            <summary>
+              Returns the concrete instantiation of the <see cref="P:Castle.DynamicProxy.IInvocation.Method"/> on the proxy, with any generic
+              parameters bound to real types.
+            </summary>
+            <returns>
+              The concrete instantiation of the <see cref="P:Castle.DynamicProxy.IInvocation.Method"/> on the proxy, or the <see cref="P:Castle.DynamicProxy.IInvocation.Method"/> if
+              not a generic method.
+            </returns>
+            <remarks>
+              Can be slower than calling <see cref="P:Castle.DynamicProxy.IInvocation.Method"/>.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.GetConcreteMethodInvocationTarget">
+            <summary>
+              Returns the concrete instantiation of <see cref="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget"/>, with any
+              generic parameters bound to real types.
+              For interface proxies, this will point to the <see cref="T:System.Reflection.MethodInfo"/> on the target class.
+            </summary>
+            <returns>The concrete instantiation of <see cref="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget"/>, or
+              <see cref="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget"/> if not a generic method.</returns>
+            <remarks>
+              In debug builds this can be slower than calling <see cref="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget"/>.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.Proceed">
+            <summary>
+              Proceeds the call to the next interceptor in line, and ultimately to the target method.
+            </summary>
+            <remarks>
+              Since interface proxies without a target don't have the target implementation to proceed to,
+              it is important, that the last interceptor does not call this method, otherwise a
+              <see cref="T:System.NotImplementedException"/> will be thrown.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.SetArgumentValue(System.Int32,System.Object)">
+            <summary>
+              Overrides the value of an argument at the given <paramref name="index"/> with the
+              new <paramref name="value"/> provided.
+            </summary>
+            <remarks>
+              This method accepts an <see cref="T:System.Object"/>, however the value provided must be compatible
+              with the type of the argument defined on the method, otherwise an exception will be thrown.
+            </remarks>
+            <param name="index">The index of the argument to override.</param>
+            <param name="value">The new value for the argument.</param>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.Arguments">
+            <summary>
+              Gets the arguments that the <see cref="P:Castle.DynamicProxy.IInvocation.Method"/> has been invoked with.
+            </summary>
+            <value>The arguments the method was invoked with.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.GenericArguments">
+            <summary>
+              Gets the generic arguments of the method.
+            </summary>
+            <value>The generic arguments, or null if not a generic method.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.InvocationTarget">
+            <summary>
+              Gets the object on which the invocation is performed. This is different from proxy object
+              because most of the time this will be the proxy target object.
+            </summary>
+            <seealso cref="T:Castle.DynamicProxy.IChangeProxyTarget"/>
+            <value>The invocation target.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.Method">
+            <summary>
+              Gets the <see cref="T:System.Reflection.MethodInfo"/> representing the method being invoked on the proxy.
+            </summary>
+            <value>The <see cref="T:System.Reflection.MethodInfo"/> representing the method being invoked.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget">
+            <summary>
+              For interface proxies, this will point to the <see cref="T:System.Reflection.MethodInfo"/> on the target class.
+            </summary>
+            <value>The method invocation target.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.Proxy">
+            <summary>
+              Gets the proxy object on which the intercepted method is invoked.
+            </summary>
+            <value>Proxy object on which the intercepted method is invoked.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.ReturnValue">
+            <summary>
+              Gets or sets the return value of the method.
+            </summary>
+            <value>The return value of the method.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.TargetType">
+            <summary>
+              Gets the type of the target object for the intercepted method.
+            </summary>
+            <value>The type of the target object.</value>
+        </member>
+        <member name="T:Castle.DynamicProxy.IProxyGenerationHook">
+            <summary>
+              Used during the target type inspection process. Implementors have a chance to customize the
+              proxy generation process.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyGenerationHook.MethodsInspected">
+            <summary>
+              Invoked by the generation process to notify that the whole process has completed.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyGenerationHook.NonProxyableMemberNotification(System.Type,System.Reflection.MemberInfo)">
+            <summary>
+              Invoked by the generation process to notify that a member was not marked as virtual.
+            </summary>
+            <param name = "type">The type which declares the non-virtual member.</param>
+            <param name = "memberInfo">The non-virtual member.</param>
+            <remarks>
+              This method gives an opportunity to inspect any non-proxyable member of a type that has 
+              been requested to be proxied, and if appropriate - throw an exception to notify the caller.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyGenerationHook.ShouldInterceptMethod(System.Type,System.Reflection.MethodInfo)">
+            <summary>
+              Invoked by the generation process to determine if the specified method should be proxied.
+            </summary>
+            <param name = "type">The type which declares the given method.</param>
+            <param name = "methodInfo">The method to inspect.</param>
+            <returns>True if the given method should be proxied; false otherwise.</returns>
+        </member>
+        <member name="T:Castle.DynamicProxy.Contributors.ITypeContributor">
+            <summary>
+              Interface describing elements composing generated type
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Contributors.MembersCollector.AcceptMethod(System.Reflection.MethodInfo,System.Boolean,Castle.DynamicProxy.IProxyGenerationHook)">
+            <summary>
+              Performs some basic screening and invokes the <see cref="T:Castle.DynamicProxy.IProxyGenerationHook"/>
+              to select methods.
+            </summary>
+            <param name="method"></param>
+            <param name="onlyVirtuals"></param>
+            <param name="hook"></param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.DynamicProxy.IAttributeDisassembler">
+            <summary>
+              Provides functionality for disassembling instances of attributes to CustomAttributeBuilder form, during the process of emiting new types by Dynamic Proxy.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IAttributeDisassembler.Disassemble(System.Attribute)">
+            <summary>
+              Disassembles given attribute instance back to corresponding CustomAttributeBuilder.
+            </summary>
+            <param name="attribute">An instance of attribute to disassemble</param>
+            <returns><see cref="T:System.Reflection.Emit.CustomAttributeBuilder"/> corresponding 1 to 1 to given attribute instance, or null reference.</returns>
+            <remarks>
+              Implementers should return <see cref="T:System.Reflection.Emit.CustomAttributeBuilder"/> that corresponds to given attribute instance 1 to 1,
+              that is after calling specified constructor with specified arguments, and setting specified properties and fields with values specified
+              we should be able to get an attribute instance identical to the one passed in <paramref name="attribute"/>. Implementer can return null
+              if it wishes to opt out of replicating the attribute. Notice however, that for some cases, like attributes passed explicitly by the user
+              it is illegal to return null, and doing so will result in exception.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.AttributeDisassembler.HandleError(System.Type,System.Exception)">
+            <summary>
+              Handles error during disassembly process
+            </summary>
+            <param name = "attributeType">Type of the attribute being disassembled</param>
+            <param name = "exception">Exception thrown during the process</param>
+            <returns>usually null, or (re)throws the exception</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.AttributeDisassembler.InitializeConstructorArgs(System.Type,System.Attribute,System.Reflection.ParameterInfo[])">
+            <summary>
+              Here we try to match a constructor argument to its value.
+              Since we can't get the values from the assembly, we use some heuristics to get it.
+              a/ we first try to match all the properties on the attributes by name (case insensitive) to the argument
+              b/ if we fail we try to match them by property type, with some smarts about convertions (i,e: can use Guid for string).
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.AttributeDisassembler.ReplaceIfBetterMatch(System.Reflection.ParameterInfo,System.Reflection.PropertyInfo,System.Reflection.PropertyInfo)">
+            <summary>
+              We have the following rules here.
+              Try to find a matching type, failing that, if the parameter is string, get the first property (under the assumption that
+              we can convert it.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.AttributeDisassembler.ConvertValue(System.Object,System.Type)">
+            <summary>
+              Attributes can only accept simple types, so we return null for null,
+              if the value is passed as string we call to string (should help with converting), 
+              otherwise, we use the value as is (enums, integer, etc).
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.TypeUtil.GetAllInterfaces(System.Type[])">
+            <summary>
+              Returns list of all unique interfaces implemented given types, including their base interfaces.
+            </summary>
+            <param name="types"> </param>
+            <returns> </returns>
+        </member>
+        <member name="T:Castle.DynamicProxy.Serialization.CacheMappingsAttribute">
+            <summary>
+              Applied to the assemblies saved by <see cref="T:Castle.DynamicProxy.ModuleScope"/> in order to persist the cache data included in the persisted assembly.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.BaseProxyGenerator">
+            <summary>
+              Base class that exposes the common functionalities
+              to proxy generation.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.BaseProxyGenerator.AddMappingNoCheck(System.Type,Castle.DynamicProxy.Contributors.ITypeContributor,System.Collections.Generic.IDictionary{System.Type,Castle.DynamicProxy.Contributors.ITypeContributor})">
+            <summary>
+              It is safe to add mapping (no mapping for the interface exists)
+            </summary>
+            <param name = "implementer"></param>
+            <param name = "interface"></param>
+            <param name = "mapping"></param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.BaseProxyGenerator.GenerateParameterlessConstructor(Castle.DynamicProxy.Generators.Emitters.ClassEmitter,System.Type,Castle.DynamicProxy.Generators.Emitters.SimpleAST.FieldReference)">
+            <summary>
+              Generates a parameters constructor that initializes the proxy
+              state with <see cref="T:Castle.DynamicProxy.StandardInterceptor"/> just to make it non-null.
+              <para>
+                This constructor is important to allow proxies to be XML serializable
+              </para>
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.InvocationTypeGenerator.GetBaseCtorArguments(System.Type,Castle.DynamicProxy.ProxyGenerationOptions,System.Reflection.ConstructorInfo@)">
+            <summary>
+              Generates the constructor for the class that extends
+              <see cref="T:Castle.DynamicProxy.AbstractInvocation"/>
+            </summary>
+            <param name="targetFieldType"></param>
+            <param name="proxyGenerationOptions"></param>
+            <param name="baseConstructor"></param>
+        </member>
+        <member name="T:Castle.DynamicProxy.DefaultProxyBuilder">
+            <summary>
+              Default implementation of <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> interface producing in-memory proxy assemblies.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.IProxyBuilder">
+            <summary>
+              Abstracts the implementation of proxy type construction.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyBuilder.CreateClassProxyType(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates a proxy type for given <paramref name="classToProxy"/>, implementing <paramref name="additionalInterfacesToProxy"/>, using <paramref name="options"/> provided.
+            </summary>
+            <param name="classToProxy">The class type to proxy.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types to proxy.</param>
+            <param name="options">The proxy generation options.</param>
+            <returns>The generated proxy type.</returns>
+            <remarks>
+              Implementers should return a proxy type for the specified class and interfaces.
+              Additional interfaces should be only 'mark' interfaces, that is, they should work like interface proxy without target. (See <see cref="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)"/> method.)
+            </remarks>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is not public.
+              Note that to avoid this exception, you can mark offending type internal, and define <see cref="T:System.Runtime.CompilerServices.InternalsVisibleToAttribute"/> 
+              pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate.</exception>
+            <seealso cref="T:Castle.DynamicProxy.Generators.ClassProxyGenerator"/>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithTarget(System.Type,System.Type[],System.Type,Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates a proxy type that proxies calls to <paramref name="interfaceToProxy"/> members on <paramref name="targetType"/>, implementing <paramref name="additionalInterfacesToProxy"/>, using <paramref name="options"/> provided.
+            </summary>
+            <param name="interfaceToProxy">The interface type to proxy.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types to proxy.</param>
+            <param name="targetType">Type implementing <paramref name="interfaceToProxy"/> on which calls to the interface members should be intercepted.</param>
+            <param name="options">The proxy generation options.</param>
+            <returns>The generated proxy type.</returns>
+            <remarks>
+              Implementers should return a proxy type for the specified interface that 'proceeds' executions to the specified target.
+              Additional interfaces should be only 'mark' interfaces, that is, they should work like interface proxy without target. (See <see cref="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)"/> method.)
+            </remarks>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is not public.
+              Note that to avoid this exception, you can mark offending type internal, and define <see cref="T:System.Runtime.CompilerServices.InternalsVisibleToAttribute"/> 
+              pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate.</exception>
+            <seealso cref="T:Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator"/>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithTargetInterface(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates a proxy type for given <paramref name="interfaceToProxy"/> and <parmaref name="additionalInterfacesToProxy"/> that delegates all calls to the provided interceptors and allows interceptors to switch the actual target of invocation.
+            </summary>
+            <param name="interfaceToProxy">The interface type to proxy.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types to proxy.</param>
+            <param name="options">The proxy generation options.</param>
+            <returns>The generated proxy type.</returns>
+            <remarks>
+              Implementers should return a proxy type for the specified interface(s) that delegate all executions to the specified interceptors
+              and uses an instance of the interface as their targets (i.e. <see cref="P:Castle.DynamicProxy.IInvocation.InvocationTarget"/>), rather than a class. All <see cref="T:Castle.DynamicProxy.IInvocation"/> classes should then implement <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface,
+              to allow interceptors to switch invocation target with instance of another type implementing called interface.
+            </remarks>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is not public.
+              Note that to avoid this exception, you can mark offending type internal, and define <see cref="T:System.Runtime.CompilerServices.InternalsVisibleToAttribute"/> 
+              pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate.</exception>
+            <seealso cref="T:Castle.DynamicProxy.Generators.InterfaceProxyWithTargetInterfaceGenerator"/>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates a proxy type for given <paramref name="interfaceToProxy"/> that delegates all calls to the provided interceptors.
+            </summary>
+            <param name="interfaceToProxy">The interface type to proxy.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types to proxy.</param>
+            <param name="options">The proxy generation options.</param>
+            <returns>The generated proxy type.</returns>
+            <remarks>
+              Implementers should return a proxy type for the specified interface and additional interfaces that delegate all executions to the specified interceptors.
+            </remarks>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is not public.
+              Note that to avoid this exception, you can mark offending type internal, and define <see cref="T:System.Runtime.CompilerServices.InternalsVisibleToAttribute"/> 
+              pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate.</exception>
+            <seealso cref="T:Castle.DynamicProxy.Generators.InterfaceProxyWithoutTargetGenerator"/>
+        </member>
+        <member name="P:Castle.DynamicProxy.IProxyBuilder.Logger">
+            <summary>
+              Gets or sets the <see cref="T:Castle.Core.Logging.ILogger"/> that this <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> logs to.
+            </summary>
+        </member>
+        <member name="P:Castle.DynamicProxy.IProxyBuilder.ModuleScope">
+            <summary>
+              Gets the <see cref="P:Castle.DynamicProxy.IProxyBuilder.ModuleScope"/> associated with this builder.
+            </summary>
+            <value>The module scope associated with this builder.</value>
+        </member>
+        <member name="M:Castle.DynamicProxy.DefaultProxyBuilder.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.DefaultProxyBuilder"/> class with new <see cref="P:Castle.DynamicProxy.DefaultProxyBuilder.ModuleScope"/>.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.DefaultProxyBuilder.#ctor(Castle.DynamicProxy.ModuleScope)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.DefaultProxyBuilder"/> class.
+            </summary>
+            <param name="scope">The module scope for generated proxy types.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.AttributeUtil.AddDisassembler``1(Castle.DynamicProxy.IAttributeDisassembler)">
+            <summary>
+              Registers custom disassembler to handle disassembly of specified type of attributes.
+            </summary>
+            <typeparam name="TAttribute">Type of attributes to handle</typeparam>
+            <param name="disassembler">Disassembler converting existing instances of Attributes to CustomAttributeBuilders</param>
+            <remarks>
+              When disassembling an attribute Dynamic Proxy will first check if an custom disassembler has been registered to handle attributes of that type, 
+              and if none is found, it'll use the <see cref="P:Castle.DynamicProxy.Internal.AttributeUtil.FallbackDisassembler"/>.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.AttributeUtil.ShouldSkipAttributeReplication(System.Type)">
+            <summary>
+              Attributes should be replicated if they are non-inheritable,
+              but there are some special cases where the attributes means
+              something to the CLR, where they should be skipped.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.CacheKey.#ctor(System.Reflection.MemberInfo,System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.Generators.CacheKey"/> class.
+            </summary>
+            <param name="target">Target element. This is either target type or target method for invocation types.</param>
+            <param name="type">The type of the proxy. This is base type for invocation types.</param>
+            <param name="interfaces">The interfaces.</param>
+            <param name="options">The options.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.CacheKey.#ctor(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.Generators.CacheKey"/> class.
+            </summary>
+            <param name="target">Type of the target.</param>
+            <param name="interfaces">The interfaces.</param>
+            <param name="options">The options.</param>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.LdcOpCodesDictionary">
+            <summary>
+              s
+              Provides appropriate Ldc.X opcode for the type of primitive value to be loaded.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.LdindOpCodesDictionary">
+            <summary>
+              Provides appropriate Ldind.X opcode for 
+              the type of primitive value to be loaded indirectly.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.Emitters.OpCodeUtil.EmitLoadIndirectOpCodeForType(System.Reflection.Emit.ILGenerator,System.Type)">
+            <summary>
+              Emits a load indirect opcode of the appropriate type for a value or object reference.
+              Pops a pointer off the evaluation stack, dereferences it and loads
+              a value of the specified type.
+            </summary>
+            <param name = "gen"></param>
+            <param name = "type"></param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.Emitters.OpCodeUtil.EmitLoadOpCodeForConstantValue(System.Reflection.Emit.ILGenerator,System.Object)">
+            <summary>
+              Emits a load opcode of the appropriate kind for a constant string or
+              primitive value.
+            </summary>
+            <param name = "gen"></param>
+            <param name = "value"></param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.Emitters.OpCodeUtil.EmitLoadOpCodeForDefaultValueOfType(System.Reflection.Emit.ILGenerator,System.Type)">
+            <summary>
+              Emits a load opcode of the appropriate kind for the constant default value of a
+              type, such as 0 for value types and null for reference types.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.Emitters.OpCodeUtil.EmitStoreIndirectOpCodeForType(System.Reflection.Emit.ILGenerator,System.Type)">
+            <summary>
+              Emits a store indirectopcode of the appropriate type for a value or object reference.
+              Pops a value of the specified type and a pointer off the evaluation stack, and
+              stores the value.
+            </summary>
+            <param name = "gen"></param>
+            <param name = "type"></param>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.PropertiesCollection">
+            <summary>
+              Summary description for PropertiesCollection.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.SimpleAST.IndirectReference">
+            <summary>
+              Wraps a reference that is passed 
+              ByRef and provides indirect load/store support.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.SimpleAST.NewArrayExpression">
+            <summary>
+              Summary description for NewArrayExpression.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.SimpleAST.ReferencesToObjectArrayExpression">
+            <summary>
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.StindOpCodesDictionary">
+            <summary>
+              Provides appropriate Stind.X opcode 
+              for the type of primitive value to be stored indirectly.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.MetaEvent.#ctor(System.String,System.Type,System.Type,Castle.DynamicProxy.Generators.MetaMethod,Castle.DynamicProxy.Generators.MetaMethod,System.Reflection.EventAttributes)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.Generators.MetaEvent"/> class.
+            </summary>
+            <param name="name">The name.</param>
+            <param name="declaringType">Type declaring the original event being overriten, or null.</param>
+            <param name="eventDelegateType"></param>
+            <param name="adder">The add method.</param>
+            <param name="remover">The remove method.</param>
+            <param name="attributes">The attributes.</param>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.INamingScope">
+            <summary>
+              Represents the scope of uniquenes of names for types and their members
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.INamingScope.GetUniqueName(System.String)">
+            <summary>
+              Gets a unique name based on <paramref name="suggestedName"/>
+            </summary>
+            <param name="suggestedName">Name suggested by the caller</param>
+            <returns>Unique name based on <paramref name="suggestedName"/>.</returns>
+            <remarks>
+              Implementers should provide name as closely resembling <paramref name="suggestedName"/> as possible.
+              Generally if no collision occurs it is suggested to return suggested name, otherwise append sequential suffix.
+              Implementers must return deterministic names, that is when <see cref="M:Castle.DynamicProxy.Generators.INamingScope.GetUniqueName(System.String)"/> is called twice 
+              with the same suggested name, the same returned name should be provided each time. Non-deterministic return
+              values, like appending random suffices will break serialization of proxies.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.INamingScope.SafeSubScope">
+            <summary>
+              Returns new, disposable naming scope. It is responsibilty of the caller to make sure that no naming collision
+              with enclosing scope, or other subscopes is possible.
+            </summary>
+            <returns>New naming scope.</returns>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.MethodFinder">
+            <summary>
+              Returns the methods implemented by a type. Use this instead of Type.GetMethods() to work around a CLR issue
+              where duplicate MethodInfos are returned by Type.GetMethods() after a token of a generic type's method was loaded.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.InternalsUtil.IsInternal(System.Reflection.MethodBase)">
+            <summary>
+              Determines whether the specified method is internal.
+            </summary>
+            <param name = "method">The method.</param>
+            <returns>
+              <c>true</c> if the specified method is internal; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.InternalsUtil.IsInternalToDynamicProxy(System.Reflection.Assembly)">
+            <summary>
+              Determines whether this assembly has internals visible to dynamic proxy.
+            </summary>
+            <param name = "asm">The assembly to inspect.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.InternalsUtil.IsAccessible(System.Reflection.MethodBase)">
+            <summary>
+              Checks if the method is public or protected.
+            </summary>
+            <param name = "method"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.MixinData.#ctor(System.Collections.Generic.IEnumerable{System.Object})">
+            <summary>
+              Because we need to cache the types based on the mixed in mixins, we do the following here:
+              - Get all the mixin interfaces
+              - Sort them by full name
+              - Return them by position
+            
+            The idea is to have reproducible behavior for the case that mixins are registered in different orders.
+            This method is here because it is required 
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.ModuleScope">
+            <summary>
+              Summary description for ModuleScope.
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.ModuleScope.DEFAULT_FILE_NAME">
+            <summary>
+              The default file name used when the assembly is saved using <see cref="F:Castle.DynamicProxy.ModuleScope.DEFAULT_FILE_NAME"/>.
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.ModuleScope.DEFAULT_ASSEMBLY_NAME">
+            <summary>
+              The default assembly (simple) name used for the assemblies generated by a <see cref="T:Castle.DynamicProxy.ModuleScope"/> instance.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class; assemblies created by this instance will not be saved.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor(System.Boolean)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class, allowing to specify whether the assemblies generated by this instance
+              should be saved.
+            </summary>
+            <param name="savePhysicalAssembly">If set to <c>true</c> saves the generated module.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor(System.Boolean,System.Boolean)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class, allowing to specify whether the assemblies generated by this instance
+              should be saved.
+            </summary>
+            <param name="savePhysicalAssembly">If set to <c>true</c> saves the generated module.</param>
+            <param name="disableSignedModule">If set to <c>true</c> disables ability to generate signed module. This should be used in cases where ran under constrained permissions.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor(System.Boolean,System.Boolean,System.String,System.String,System.String,System.String)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class, allowing to specify whether the assemblies generated by this instance
+              should be saved and what simple names are to be assigned to them.
+            </summary>
+            <param name="savePhysicalAssembly">If set to <c>true</c> saves the generated module.</param>
+            <param name="disableSignedModule">If set to <c>true</c> disables ability to generate signed module. This should be used in cases where ran under constrained permissions.</param>
+            <param name="strongAssemblyName">The simple name of the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="strongModulePath">The path and file name of the manifest module of the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="weakAssemblyName">The simple name of the weak-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="weakModulePath">The path and file name of the manifest module of the weak-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor(System.Boolean,System.Boolean,Castle.DynamicProxy.Generators.INamingScope,System.String,System.String,System.String,System.String)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class, allowing to specify whether the assemblies generated by this instance
+              should be saved and what simple names are to be assigned to them.
+            </summary>
+            <param name="savePhysicalAssembly">If set to <c>true</c> saves the generated module.</param>
+            <param name="disableSignedModule">If set to <c>true</c> disables ability to generate signed module. This should be used in cases where ran under constrained permissions.</param>
+            <param name="namingScope">Naming scope used to provide unique names to generated types and their members (usually via sub-scopes).</param>
+            <param name="strongAssemblyName">The simple name of the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="strongModulePath">The path and file name of the manifest module of the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="weakAssemblyName">The simple name of the weak-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="weakModulePath">The path and file name of the manifest module of the weak-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.GetFromCache(Castle.DynamicProxy.Generators.CacheKey)">
+            <summary>
+              Returns a type from this scope's type cache, or null if the key cannot be found.
+            </summary>
+            <param name = "key">The key to be looked up in the cache.</param>
+            <returns>The type from this scope's type cache matching the key, or null if the key cannot be found</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.RegisterInCache(Castle.DynamicProxy.Generators.CacheKey,System.Type)">
+            <summary>
+              Registers a type in this scope's type cache.
+            </summary>
+            <param name = "key">The key to be associated with the type.</param>
+            <param name = "type">The type to be stored in the cache.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.GetKeyPair">
+            <summary>
+              Gets the key pair used to sign the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.ObtainDynamicModule(System.Boolean)">
+            <summary>
+              Gets the specified module generated by this scope, creating a new one if none has yet been generated.
+            </summary>
+            <param name = "isStrongNamed">If set to true, a strong-named module is returned; otherwise, a weak-named module is returned.</param>
+            <returns>A strong-named or weak-named module generated by this scope, as specified by the <paramref
+               name = "isStrongNamed" /> parameter.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.ObtainDynamicModuleWithStrongName">
+            <summary>
+              Gets the strong-named module generated by this scope, creating a new one if none has yet been generated.
+            </summary>
+            <returns>A strong-named module generated by this scope.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.ObtainDynamicModuleWithWeakName">
+            <summary>
+              Gets the weak-named module generated by this scope, creating a new one if none has yet been generated.
+            </summary>
+            <returns>A weak-named module generated by this scope.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.SaveAssembly">
+            <summary>
+              Saves the generated assembly with the name and directory information given when this <see cref="T:Castle.DynamicProxy.ModuleScope"/> instance was created (or with
+              the <see cref="F:Castle.DynamicProxy.ModuleScope.DEFAULT_FILE_NAME"/> and current directory if none was given).
+            </summary>
+            <remarks>
+              <para>
+                This method stores the generated assembly in the directory passed as part of the module information specified when this instance was
+                constructed (if any, else the current directory is used). If both a strong-named and a weak-named assembly
+                have been generated, it will throw an exception; in this case, use the <see cref="M:Castle.DynamicProxy.ModuleScope.SaveAssembly(System.Boolean)"/> overload.
+              </para>
+              <para>
+                If this <see cref="T:Castle.DynamicProxy.ModuleScope"/> was created without indicating that the assembly should be saved, this method does nothing.
+              </para>
+            </remarks>
+            <exception cref="T:System.InvalidOperationException">Both a strong-named and a weak-named assembly have been generated.</exception>
+            <returns>The path of the generated assembly file, or null if no file has been generated.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.SaveAssembly(System.Boolean)">
+            <summary>
+              Saves the specified generated assembly with the name and directory information given when this <see cref="T:Castle.DynamicProxy.ModuleScope"/> instance was created
+              (or with the <see cref="F:Castle.DynamicProxy.ModuleScope.DEFAULT_FILE_NAME"/> and current directory if none was given).
+            </summary>
+            <param name="strongNamed">True if the generated assembly with a strong name should be saved (see <see cref="P:Castle.DynamicProxy.ModuleScope.StrongNamedModule"/>);
+              false if the generated assembly without a strong name should be saved (see <see cref="P:Castle.DynamicProxy.ModuleScope.WeakNamedModule"/>.</param>
+            <remarks>
+              <para>
+                This method stores the specified generated assembly in the directory passed as part of the module information specified when this instance was
+                constructed (if any, else the current directory is used).
+              </para>
+              <para>
+                If this <see cref="T:Castle.DynamicProxy.ModuleScope"/> was created without indicating that the assembly should be saved, this method does nothing.
+              </para>
+            </remarks>
+            <exception cref="T:System.InvalidOperationException">No assembly has been generated that matches the <paramref name="strongNamed"/> parameter.
+            </exception>
+            <returns>The path of the generated assembly file, or null if no file has been generated.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.LoadAssemblyIntoCache(System.Reflection.Assembly)">
+            <summary>
+              Loads the generated types from the given assembly into this <see cref="T:Castle.DynamicProxy.ModuleScope"/>'s cache.
+            </summary>
+            <param name="assembly">The assembly to load types from. This assembly must have been saved via <see cref="M:Castle.DynamicProxy.ModuleScope.SaveAssembly(System.Boolean)"/> or
+              <see cref="M:Castle.DynamicProxy.ModuleScope.SaveAssembly"/>, or it must have the <see cref="T:Castle.DynamicProxy.Serialization.CacheMappingsAttribute"/> manually applied.</param>
+            <remarks>
+              This method can be used to load previously generated and persisted proxy types from disk into this scope's type cache, eg. in order
+              to avoid the performance hit associated with proxy generation.
+            </remarks>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.Lock">
+            <summary>
+              Users of this <see cref="T:Castle.DynamicProxy.ModuleScope"/> should use this lock when accessing the cache.
+            </summary>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.StrongNamedModule">
+            <summary>
+              Gets the strong-named module generated by this scope, or <see langword = "null" /> if none has yet been generated.
+            </summary>
+            <value>The strong-named module generated by this scope, or <see langword = "null" /> if none has yet been generated.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.StrongNamedModuleName">
+            <summary>
+              Gets the file name of the strongly named module generated by this scope.
+            </summary>
+            <value>The file name of the strongly named module generated by this scope.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.StrongNamedModuleDirectory">
+            <summary>
+              Gets the directory where the strongly named module generated by this scope will be saved, or <see langword="null"/> if the current directory
+              is used.
+            </summary>
+            <value>The directory where the strongly named module generated by this scope will be saved when <see cref="M:Castle.DynamicProxy.ModuleScope.SaveAssembly"/> is called
+              (if this scope was created to save modules).</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.WeakNamedModule">
+            <summary>
+              Gets the weak-named module generated by this scope, or <see langword = "null" /> if none has yet been generated.
+            </summary>
+            <value>The weak-named module generated by this scope, or <see langword = "null" /> if none has yet been generated.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.WeakNamedModuleName">
+            <summary>
+              Gets the file name of the weakly named module generated by this scope.
+            </summary>
+            <value>The file name of the weakly named module generated by this scope.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.WeakNamedModuleDirectory">
+            <summary>
+              Gets the directory where the weakly named module generated by this scope will be saved, or <see langword="null"/> if the current directory
+              is used.
+            </summary>
+            <value>The directory where the weakly named module generated by this scope will be saved when <see cref="M:Castle.DynamicProxy.ModuleScope.SaveAssembly"/> is called
+              (if this scope was created to save modules).</value>
+        </member>
+        <member name="T:Castle.DynamicProxy.PersistentProxyBuilder">
+            <summary>
+              ProxyBuilder that persists the generated type.
+            </summary>
+            <remarks>
+              The saved assembly contains just the last generated type.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.PersistentProxyBuilder.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.PersistentProxyBuilder"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.PersistentProxyBuilder.SaveAssembly">
+            <summary>
+              Saves the generated assembly to a physical file. Note that this renders the <see cref="T:Castle.DynamicProxy.PersistentProxyBuilder"/> unusable.
+            </summary>
+            <returns>The path of the generated assembly file, or null if no assembly has been generated.</returns>
+            <remarks>
+              This method does not support saving multiple files. If both a signed and an unsigned module have been generated, use the 
+              respective methods of the <see cref="T:Castle.DynamicProxy.ModuleScope"/>.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerationOptions.#ctor(Castle.DynamicProxy.IProxyGenerationHook)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerationOptions"/> class.
+            </summary>
+            <param name="hook">The hook.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerationOptions.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerationOptions"/> class.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.ProxyGenerator">
+            <summary>
+              Provides proxy objects for classes and interfaces.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.#ctor(Castle.DynamicProxy.IProxyBuilder)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> class.
+            </summary>
+            <param name="builder">Proxy types builder.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.#ctor(System.Boolean)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> class.
+            </summary>
+            <param name="disableSignedModule">If <c>true</c> forces all types to be generated into an unsigned module.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget``1(``0,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface implemented by <paramref name="target"/> which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>Object proxying calls to members of <typeparamref name="TInterface"/> on <paramref name="target"/> object.</returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/>is not an interface type.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface``1(``0,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget``1(``0,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface implemented by <paramref name="target"/> which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/>is not an interface type.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface``1(``0,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Object,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types  on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Type[],System.Object,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface``1(``0,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface implemented by <paramref name="target"/> which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> type on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface``1(``0,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface implemented by <paramref name="target"/> which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> type on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Type[],System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget``1(Castle.DynamicProxy.IInterceptor)">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on target object generated at runtime with given <paramref name="interceptor"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface which will be proxied.</typeparam>
+            <param name="interceptor">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptor"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              As a result of that also at least one <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementation must be provided.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget``1(Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface which will be proxied.</typeparam>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              As a result of that also at least one <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementation must be provided.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget``1(Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface which will be proxied.</typeparam>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              As a result of that also at least one <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementation must be provided.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,Castle.DynamicProxy.IInterceptor)">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptor"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="interceptor">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptor"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/>  is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of <paramref name="additionalInterfacesToProxy"/> to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget``1(``0,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <typeparamref name="TClass"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TClass">Type of class which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <typeparamref name="TClass"/> proxying calls to virtual members of <typeparamref name="TClass"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TClass"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <typeparamref name="TClass"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <typeparamref name="TClass"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget``1(``0,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <typeparamref name="TClass"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TClass">Type of class which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <typeparamref name="TClass"/> proxying calls to virtual members of <typeparamref name="TClass"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TClass"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <typeparamref name="TClass"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <typeparamref name="TClass"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Object,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no parameterless constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy``1(Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <typeparamref name="TClass"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TClass">Type of class which will be proxied.</typeparam>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <typeparamref name="TClass"/> proxying calls to virtual members of <typeparamref name="TClass"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TClass"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <typeparamref name="TClass"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <typeparamref name="TClass"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy``1(Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <typeparamref name="TClass"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TClass">Type of class which will be proxied.</typeparam>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <typeparamref name="TClass"/> proxying calls to virtual members of <typeparamref name="TClass"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TClass"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <typeparamref name="TClass"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <typeparamref name="TClass"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,System.Type[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,Castle.DynamicProxy.ProxyGenerationOptions,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no parameterless constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyType(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates the proxy type for class proxy with given <paramref name="classToProxy"/> class, implementing given <paramref name="additionalInterfacesToProxy"/> and using provided <paramref name="options"/>.
+            </summary>
+            <param name="classToProxy">The base class for proxy type.</param>
+            <param name="additionalInterfacesToProxy">The interfaces that proxy type should implement.</param>
+            <param name="options">The options for proxy generation process.</param>
+            <returns><see cref="T:System.Type"/> of proxy.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyTypeWithTarget(System.Type,System.Type[],System.Type,Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates the proxy type for interface proxy with target for given <paramref name="interfaceToProxy"/> interface, implementing given <paramref name="additionalInterfacesToProxy"/> on given <paramref name="targetType"/> and using provided <paramref name="options"/>.
+            </summary>
+            <param name="interfaceToProxy">The interface proxy type should implement.</param>
+            <param name="additionalInterfacesToProxy">The additional interfaces proxy type should implement.</param>
+            <param name="targetType">Actual type that the proxy type will encompass.</param>
+            <param name="options">The options for proxy generation process.</param>
+            <returns><see cref="T:System.Type"/> of proxy.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyTypeWithTargetInterface(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates the proxy type for interface proxy with target interface for given <paramref name="interfaceToProxy"/> interface, implementing given <paramref name="additionalInterfacesToProxy"/> on given <paramref name="interfaceToProxy"/> and using provided <paramref name="options"/>.
+            </summary>
+            <param name="interfaceToProxy">The interface proxy type should implement.</param>
+            <param name="additionalInterfacesToProxy">The additional interfaces proxy type should implement.</param>
+            <param name="options">The options for proxy generation process.</param>
+            <returns><see cref="T:System.Type"/> of proxy.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyTypeWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates the proxy type for interface proxy without target for given <paramref name="interfaceToProxy"/> interface, implementing given <paramref name="additionalInterfacesToProxy"/> and using provided <paramref name="options"/>.
+            </summary>
+            <param name="interfaceToProxy">The interface proxy type should implement.</param>
+            <param name="additionalInterfacesToProxy">The additional interfaces proxy type should implement.</param>
+            <param name="options">The options for proxy generation process.</param>
+            <returns><see cref="T:System.Type"/> of proxy.</returns>
+        </member>
+        <member name="P:Castle.DynamicProxy.ProxyGenerator.Logger">
+            <summary>
+              Gets or sets the <see cref="T:Castle.Core.Logging.ILogger"/> that this <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> log to.
+            </summary>
+        </member>
+        <member name="P:Castle.DynamicProxy.ProxyGenerator.ProxyBuilder">
+            <summary>
+              Gets the proxy builder instance used to generate proxy types.
+            </summary>
+            <value>The proxy builder.</value>
+        </member>
+        <member name="M:Castle.DynamicProxy.Serialization.RemotableInvocation.Proceed">
+            <summary>
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="P:Castle.DynamicProxy.Serialization.RemotableInvocation.Method">
+            <summary>
+            </summary>
+        </member>
+        <member name="P:Castle.DynamicProxy.Serialization.RemotableInvocation.MethodInvocationTarget">
+            <summary>
+              For interface proxies, this will point to the
+              <see cref="T:System.Reflection.MethodInfo"/> on the target class
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Serialization.ProxyObjectReference">
+            <summary>
+              Handles the deserialization of proxies.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Serialization.ProxyObjectReference.ResetScope">
+            <summary>
+              Resets the <see cref="P:Castle.DynamicProxy.Serialization.ProxyObjectReference.ModuleScope"/> used for deserialization to a new scope.
+            </summary>
+            <remarks>
+              This is useful for test cases.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.Serialization.ProxyObjectReference.SetScope(Castle.DynamicProxy.ModuleScope)">
+            <summary>
+              Resets the <see cref="P:Castle.DynamicProxy.Serialization.ProxyObjectReference.ModuleScope"/> used for deserialization to a given <paramref name="scope"/>.
+            </summary>
+            <param name="scope"> The scope to be used for deserialization. </param>
+            <remarks>
+              By default, the deserialization process uses a different scope than the rest of the application, which can lead to multiple proxies
+              being generated for the same type. By explicitly setting the deserialization scope to the application's scope, this can be avoided.
+            </remarks>
+        </member>
+        <member name="P:Castle.DynamicProxy.Serialization.ProxyObjectReference.ModuleScope">
+            <summary>
+              Gets the <see cref="P:Castle.DynamicProxy.Serialization.ProxyObjectReference.ModuleScope"/> used for deserialization.
+            </summary>
+            <value> As <see cref="T:Castle.DynamicProxy.Serialization.ProxyObjectReference"/> has no way of automatically determining the scope used by the application (and the application might use more than one scope at the same time), <see cref="T:Castle.DynamicProxy.Serialization.ProxyObjectReference"/> uses a dedicated scope instance for deserializing proxy types. This instance can be reset and set to a specific value via <see cref="M:Castle.DynamicProxy.Serialization.ProxyObjectReference.ResetScope"/> and <see cref="M:Castle.DynamicProxy.Serialization.ProxyObjectReference.SetScope(Castle.DynamicProxy.ModuleScope)"/> . </value>
+        </member>
+        <member name="T:Castle.DynamicProxy.Tokens.InvocationMethods">
+            <summary>
+              Holds <see cref="T:System.Reflection.MethodInfo"/> objects representing methods of <see cref="T:Castle.DynamicProxy.AbstractInvocation"/> class.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Tokens.SerializationInfoMethods">
+            <summary>
+              Holds <see cref="T:System.Reflection.MethodInfo"/> objects representing methods of <see cref="T:System.Runtime.Serialization.SerializationInfo"/> class.
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.Tokens.SerializationInfoMethods.AddValue_Bool">
+            <summary>
+              <see cref="M:System.Runtime.Serialization.SerializationInfo.AddValue(System.String,System.Boolean)"/>
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.Tokens.SerializationInfoMethods.AddValue_Int32">
+            <summary>
+              <see cref="M:System.Runtime.Serialization.SerializationInfo.AddValue(System.String,System.Int32)"/>
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.Tokens.SerializationInfoMethods.AddValue_Object">
+            <summary>
+              <see cref="M:System.Runtime.Serialization.SerializationInfo.AddValue(System.String,System.Object)"/>
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.Tokens.SerializationInfoMethods.GetValue">
+            <summary>
+              <see cref="M:System.Runtime.Serialization.SerializationInfo.GetValue(System.String,System.Type)"/>
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.Tokens.SerializationInfoMethods.SetType">
+            <summary>
+              <see cref="M:System.Runtime.Serialization.SerializationInfo.SetType(System.Type)"/>
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.IInterceptorSelector">
+            <summary>
+              Provides an extension point that allows proxies to choose specific interceptors on
+              a per method basis.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInterceptorSelector.SelectInterceptors(System.Type,System.Reflection.MethodInfo,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Selects the interceptors that should intercept calls to the given <paramref name="method"/>.
+            </summary>
+            <param name="type">The type declaring the method to intercept.</param>
+            <param name="method">The method that will be intercepted.</param>
+            <param name="interceptors">All interceptors registered with the proxy.</param>
+            <returns>An array of interceptors to invoke upon calling the <paramref name="method"/>.</returns>
+            <remarks>
+              This method is called only once per proxy instance, upon the first call to the
+              <paramref name="method"/>. Either an empty array or null are valid return values to indicate
+              that no interceptor should intercept calls to the method. Although it is not advised, it is
+              legal to return other <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations than these provided in
+              <paramref name="interceptors"/>.
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.Internal.Lock.Create">
+            <summary>
+            Creates a new lock.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.IServiceProviderExAccessor">
+            <summary>
+            This interface should be implemented by classes
+            that are available in a bigger context, exposing
+            the container to different areas in the same application.
+            <para>
+            For example, in Web application, the (global) HttpApplication
+            subclasses should implement this interface to expose 
+            the configured container
+            </para>
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.IChangeProxyTarget">
+            <summary>
+              Exposes means to change target objects of proxies and invocations
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IChangeProxyTarget.ChangeInvocationTarget(System.Object)">
+            <summary>
+              Changes the target object (<see cref="P:Castle.DynamicProxy.IInvocation.InvocationTarget"/>) of current <see cref="T:Castle.DynamicProxy.IInvocation"/>.
+            </summary>
+            <param name="target">The new value of target of invocation.</param>
+            <remarks>
+              Although the method takes <see cref="T:System.Object"/> the actual instance must be of type assignable to <see cref="P:Castle.DynamicProxy.IInvocation.TargetType"/>, otherwise an <see cref="T:System.InvalidCastException"/> will be thrown.
+              Also while it's technically legal to pass null reference (Nothing in Visual Basic) as <paramref name="target"/>, for obvious reasons Dynamic Proxy will not be able to call the intercepted method on such target.
+              In this case last interceptor in the pipeline mustn't call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/> or a <see cref="T:System.NotImplementedException"/> will be throws.
+              Also while it's technically legal to pass proxy itself as <paramref name="target"/>, this would create stack overflow.
+              In this case last interceptor in the pipeline mustn't call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/> or a <see cref="T:System.InvalidOperationException"/> will be throws.
+            </remarks>
+            <exception cref="T:System.InvalidCastException">Thrown when <paramref name="target"/> is not assignable to the proxied type.</exception>
+        </member>
+        <member name="M:Castle.DynamicProxy.IChangeProxyTarget.ChangeProxyTarget(System.Object)">
+            <summary>
+              Permanently changes the target object of the proxy. This does not affect target of the current invocation.
+            </summary>
+            <param name="target">The new value of target of the proxy.</param>
+            <remarks>
+              Although the method takes <see cref="T:System.Object"/> the actual instance must be of type assignable to proxy's target type, otherwise an <see cref="T:System.InvalidCastException"/> will be thrown.
+              Also while it's technically legal to pass null reference (Nothing in Visual Basic) as <paramref name="target"/>, for obvious reasons Dynamic Proxy will not be able to call the intercepted method on such target.
+              In this case last interceptor in the pipeline mustn't call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/> or a <see cref="T:System.NotImplementedException"/> will be throws.
+              Also while it's technically legal to pass proxy itself as <paramref name="target"/>, this would create stack overflow.
+              In this case last interceptor in the pipeline mustn't call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/> or a <see cref="T:System.InvalidOperationException"/> will be throws.
+            </remarks>
+            <exception cref="T:System.InvalidCastException">Thrown when <paramref name="target"/> is not assignable to the proxied type.</exception>
+        </member>
+        <member name="T:Castle.DynamicProxy.IInterceptor">
+            <summary>
+              New interface that is going to be used by DynamicProxy 2
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyTargetAccessor.DynProxyGetTarget">
+            <summary>
+              Get the proxy target (note that null is a valid target!)
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyTargetAccessor.GetInterceptors">
+            <summary>
+              Gets the interceptors for the proxy
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.IServiceEnabledComponent">
+            <summary>
+            Defines that the implementation wants a 
+            <see cref="T:System.IServiceProvider"/> in order to 
+            access other components. The creator must be aware
+            that the component might (or might not) implement 
+            the interface.
+            </summary>
+            <remarks>
+            Used by Castle Project components to, for example, 
+            gather logging factories
+            </remarks>
+        </member>
+        <member name="T:Castle.Core.IServiceProviderEx">
+            <summary>
+            Increments <c>IServiceProvider</c> with a generic service resolution operation.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.IExtendedLoggerFactory">
+            <summary>
+              Provides a factory that can produce either <see cref="T:Castle.Core.Logging.ILogger"/> or
+              <see cref="T:Castle.Core.Logging.IExtendedLogger"/> classes.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.ILoggerFactory">
+            <summary>
+              Manages the instantiation of <see cref="T:Castle.Core.Logging.ILogger"/>s.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ILoggerFactory.Create(System.Type)">
+            <summary>
+              Creates a new logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ILoggerFactory.Create(System.String)">
+            <summary>
+              Creates a new logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ILoggerFactory.Create(System.Type,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ILoggerFactory.Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.IExtendedLoggerFactory.Create(System.Type)">
+            <summary>
+              Creates a new extended logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.IExtendedLoggerFactory.Create(System.String)">
+            <summary>
+              Creates a new extended logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.IExtendedLoggerFactory.Create(System.Type,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new extended logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.IExtendedLoggerFactory.Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new extended logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Create(System.Type)">
+            <summary>
+              Creates a new extended logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Create(System.String)">
+            <summary>
+              Creates a new extended logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Create(System.Type,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new extended logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new extended logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Castle#Core#Logging#ILoggerFactory#Create(System.Type)">
+            <summary>
+              Creates a new logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Castle#Core#Logging#ILoggerFactory#Create(System.String)">
+            <summary>
+              Creates a new logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Castle#Core#Logging#ILoggerFactory#Create(System.Type,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Castle#Core#Logging#ILoggerFactory#Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.GetConfigFile(System.String)">
+            <summary>
+              Gets the configuration file.
+            </summary>
+            <param name = "fileName">i.e. log4net.config</param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.Logging.TraceLoggerFactory">
+            <summary>
+              Used to create the TraceLogger implementation of ILogger interface. See <see cref="T:Castle.Core.Logging.TraceLogger"/>.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractLoggerFactory.GetConfigFile(System.String)">
+            <summary>
+              Gets the configuration file.
+            </summary>
+            <param name = "fileName">i.e. log4net.config</param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.Logging.IContextProperties">
+            <summary>
+              Interface for Context Properties implementations
+            </summary>
+            <remarks>
+              <para>
+                This interface defines a basic property get set accessor.
+              </para>
+              <para>
+                Based on the ContextPropertiesBase of log4net, by Nicko Cadell.
+              </para>
+            </remarks>
+        </member>
+        <member name="P:Castle.Core.Logging.IContextProperties.Item(System.String)">
+            <summary>
+              Gets or sets the value of a property
+            </summary>
+            <value>
+              The value for the property with the specified key
+            </value>
+            <remarks>
+              <para>
+                Gets or sets the value of a property
+              </para>
+            </remarks>
+        </member>
+        <member name="T:Castle.Core.Logging.NullLogFactory">
+            <summary>
+            NullLogFactory used when logging is turned off.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogFactory.Create(System.String)">
+            <summary>
+              Creates an instance of ILogger with the specified name.
+            </summary>
+            <param name = "name">Name.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogFactory.Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates an instance of ILogger with the specified name and LoggerLevel.
+            </summary>
+            <param name = "name">Name.</param>
+            <param name = "level">Level.</param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.Logging.StreamLoggerFactory">
+            <summary>
+              Creates <see cref="T:Castle.Core.Logging.StreamLogger"/> outputing 
+              to files. The name of the file is derived from the log name
+              plus the 'log' extension.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.IExtendedLogger">
+            <summary>
+              Provides an interface that supports <see cref="T:Castle.Core.Logging.ILogger"/> and
+              allows the storage and retrieval of Contexts. These are supported in
+              both log4net and NLog.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.ILogger">
+            <summary>
+              Manages logging.
+            </summary>
+            <remarks>
+              This is a facade for the different logging subsystems.
+              It offers a simplified interface that follows IOC patterns
+              and a simplified priority/level/severity abstraction.
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.CreateChildLogger(System.String)">
+            <summary>
+              Create a new child logger.
+              The name of the child logger is [current-loggers-name].[passed-in-name]
+            </summary>
+            <param name="loggerName">The Subname of this logger.</param>
+            <returns>The New ILogger instance.</returns>
+            <exception cref="T:System.ArgumentException">If the name has an empty element name.</exception>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Debug(System.String)">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Debug(System.Func{System.String})">
+            <summary>
+              Logs a debug message with lazily constructed message. The message will be constructed only if the <see cref="P:Castle.Core.Logging.ILogger.IsDebugEnabled"/> is true.
+            </summary>
+            <param name="messageFactory"></param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Debug(System.String,System.Exception)">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.DebugFormat(System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.DebugFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.DebugFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.DebugFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Error(System.String)">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Error(System.Func{System.String})">
+            <summary>
+              Logs an error message with lazily constructed message. The message will be constructed only if the <see cref="P:Castle.Core.Logging.ILogger.IsErrorEnabled"/> is true.
+            </summary>
+            <param name="messageFactory"></param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Error(System.String,System.Exception)">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.ErrorFormat(System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.ErrorFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.ErrorFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.ErrorFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Fatal(System.String)">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Fatal(System.Func{System.String})">
+            <summary>
+              Logs a fatal message with lazily constructed message. The message will be constructed only if the <see cref="P:Castle.Core.Logging.ILogger.IsFatalEnabled"/> is true.
+            </summary>
+            <param name="messageFactory"></param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Fatal(System.String,System.Exception)">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalFormat(System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Info(System.String)">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Info(System.Func{System.String})">
+            <summary>
+              Logs a info message with lazily constructed message. The message will be constructed only if the <see cref="P:Castle.Core.Logging.ILogger.IsInfoEnabled"/> is true.
+            </summary>
+            <param name="messageFactory"></param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Info(System.String,System.Exception)">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.InfoFormat(System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.InfoFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.InfoFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.InfoFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Warn(System.String)">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Warn(System.Func{System.String})">
+            <summary>
+              Logs a warn message with lazily constructed message. The message will be constructed only if the <see cref="P:Castle.Core.Logging.ILogger.IsWarnEnabled"/> is true.
+            </summary>
+            <param name="messageFactory"></param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Warn(System.String,System.Exception)">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.WarnFormat(System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.WarnFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.WarnFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.WarnFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsDebugEnabled">
+            <summary>
+              Determines if messages of priority "debug" will be logged.
+            </summary>
+            <value>True if "debug" messages will be logged.</value>
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsErrorEnabled">
+            <summary>
+              Determines if messages of priority "error" will be logged.
+            </summary>
+            <value>True if "error" messages will be logged.</value>
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsFatalEnabled">
+            <summary>
+              Determines if messages of priority "fatal" will be logged.
+            </summary>
+            <value>True if "fatal" messages will be logged.</value>
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsInfoEnabled">
+            <summary>
+              Determines if messages of priority "info" will be logged.
+            </summary>
+            <value>True if "info" messages will be logged.</value>
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsWarnEnabled">
+            <summary>
+              Determines if messages of priority "warn" will be logged.
+            </summary>
+            <value>True if "warn" messages will be logged.</value>
+        </member>
+        <member name="P:Castle.Core.Logging.IExtendedLogger.GlobalProperties">
+            <summary>
+              Exposes the Global Context of the extended logger.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.IExtendedLogger.ThreadProperties">
+            <summary>
+              Exposes the Thread Context of the extended logger.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.IExtendedLogger.ThreadStacks">
+            <summary>
+              Exposes the Thread Stack of the extended logger.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.ConsoleLogger">
+            <summary>
+            The Logger sending everything to the standard output streams.
+            This is mainly for the cases when you have a utility that
+            does not have a logger to supply.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.LevelFilteredLogger">
+            <summary>
+            The Level Filtered Logger class.  This is a base clase which
+            provides a LogLevel attribute and reroutes all functions into
+            one Log method.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.#ctor">
+            <summary>
+              Creates a new <c>LevelFilteredLogger</c>.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InitializeLifetimeService">
+            <summary>
+            Keep the instance alive in a remoting scenario
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Debug(System.String)">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Debug(System.String,System.Exception)">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.DebugFormat(System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.DebugFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.DebugFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.DebugFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Info(System.String)">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Info(System.String,System.Exception)">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InfoFormat(System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InfoFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InfoFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InfoFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Warn(System.String)">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Warn(System.String,System.Exception)">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.WarnFormat(System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.WarnFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.WarnFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.WarnFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Error(System.String)">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Error(System.String,System.Exception)">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.ErrorFormat(System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.ErrorFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.ErrorFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.ErrorFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Fatal(System.String)">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Fatal(System.String,System.Exception)">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalFormat(System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Log(Castle.Core.Logging.LoggerLevel,System.String,System.String,System.Exception)">
+            <summary>
+              Implementors output the log content by implementing this method only.
+              Note that exception can be null
+            </summary>
+            <param name = "loggerLevel"></param>
+            <param name = "loggerName"></param>
+            <param name = "message"></param>
+            <param name = "exception"></param>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.Level">
+            <value>
+              The <c>LoggerLevel</c> that this logger
+              will be using. Defaults to <c>LoggerLevel.Off</c>
+            </value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.Name">
+            <value>
+              The name that this logger will be using. 
+              Defaults to <c>String.Empty</c>
+            </value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsDebugEnabled">
+            <summary>
+              Determines if messages of priority "debug" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Debug"/> bit</value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsInfoEnabled">
+            <summary>
+              Determines if messages of priority "info" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Info"/> bit</value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsWarnEnabled">
+            <summary>
+              Determines if messages of priority "warn" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Warn"/> bit</value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsErrorEnabled">
+            <summary>
+              Determines if messages of priority "error" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Error"/> bit</value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsFatalEnabled">
+            <summary>
+              Determines if messages of priority "fatal" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Fatal"/> bit</value>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.#ctor">
+            <summary>
+              Creates a new ConsoleLogger with the <c>Level</c>
+              set to <c>LoggerLevel.Debug</c> and the <c>Name</c>
+              set to <c>String.Empty</c>.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.#ctor(Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new ConsoleLogger with the <c>Name</c>
+              set to <c>String.Empty</c>.
+            </summary>
+            <param name = "logLevel">The logs Level.</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.#ctor(System.String)">
+            <summary>
+              Creates a new ConsoleLogger with the <c>Level</c>
+              set to <c>LoggerLevel.Debug</c>.
+            </summary>
+            <param name = "name">The logs Name.</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.#ctor(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new ConsoleLogger.
+            </summary>
+            <param name = "name">The logs Name.</param>
+            <param name = "logLevel">The logs Level.</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.Log(Castle.Core.Logging.LoggerLevel,System.String,System.String,System.Exception)">
+            <summary>
+              A Common method to log.
+            </summary>
+            <param name = "loggerLevel">The level of logging</param>
+            <param name = "loggerName">The name of the logger</param>
+            <param name = "message">The Message</param>
+            <param name = "exception">The Exception</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.CreateChildLogger(System.String)">
+            <summary>
+              Returns a new <c>ConsoleLogger</c> with the name
+              added after this loggers name, with a dot in between.
+            </summary>
+            <param name = "loggerName">The added hierarchical name.</param>
+            <returns>A new <c>ConsoleLogger</c>.</returns>
+        </member>
+        <member name="T:Castle.Core.Logging.DiagnosticsLogger">
+            <summary>
+              The Logger using standart Diagnostics namespace.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.DiagnosticsLogger.#ctor(System.String)">
+            <summary>
+              Creates a logger based on <see cref="T:System.Diagnostics.EventLog"/>.
+            </summary>
+            <param name="logName"><see cref="P:System.Diagnostics.EventLog.Log"/></param>
+        </member>
+        <member name="M:Castle.Core.Logging.DiagnosticsLogger.#ctor(System.String,System.String)">
+            <summary>
+              Creates a logger based on <see cref="T:System.Diagnostics.EventLog"/>.
+            </summary>
+            <param name="logName"><see cref="P:System.Diagnostics.EventLog.Log"/></param>
+            <param name="source"><see cref="P:System.Diagnostics.EventLog.Source"/></param>
+        </member>
+        <member name="M:Castle.Core.Logging.DiagnosticsLogger.#ctor(System.String,System.String,System.String)">
+            <summary>
+              Creates a logger based on <see cref="T:System.Diagnostics.EventLog"/>.
+            </summary>
+            <param name="logName"><see cref="P:System.Diagnostics.EventLog.Log"/></param>
+            <param name="machineName"><see cref="P:System.Diagnostics.EventLog.MachineName"/></param>
+            <param name="source"><see cref="P:System.Diagnostics.EventLog.Source"/></param>
+        </member>
+        <member name="T:Castle.Core.Logging.NullLogger">
+            <summary>
+              The Null Logger class.  This is useful for implementations where you need
+              to provide a logger to a utility class, but do not want any output from it.
+              It also helps when you have a utility that does not have a logger to supply.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.CreateChildLogger(System.String)">
+            <summary>
+              Returns this <c>NullLogger</c>.
+            </summary>
+            <param name = "loggerName">Ignored</param>
+            <returns>This ILogger instance.</returns>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Debug(System.String)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Debug(System.String,System.Exception)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.DebugFormat(System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.DebugFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.DebugFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.DebugFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Error(System.String)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Error(System.String,System.Exception)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.ErrorFormat(System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.ErrorFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.ErrorFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.ErrorFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Fatal(System.String)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Fatal(System.String,System.Exception)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalFormat(System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Info(System.String)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Info(System.String,System.Exception)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.InfoFormat(System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.InfoFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.InfoFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.InfoFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Warn(System.String)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Warn(System.String,System.Exception)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.WarnFormat(System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.WarnFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.WarnFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.WarnFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.GlobalProperties">
+            <summary>
+              Returns empty context properties.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.ThreadProperties">
+            <summary>
+              Returns empty context properties.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.ThreadStacks">
+            <summary>
+              Returns empty context stacks.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsDebugEnabled">
+            <summary>
+              No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsErrorEnabled">
+            <summary>
+              No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsFatalEnabled">
+            <summary>
+              No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsInfoEnabled">
+            <summary>
+              No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsWarnEnabled">
+            <summary>
+              No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="T:Castle.Core.Logging.StreamLogger">
+            <summary>
+            The Stream Logger class.  This class can stream log information
+            to any stream, it is suitable for storing a log file to disk,
+            or to a <c>MemoryStream</c> for testing your components.
+            </summary>
+            <remarks>
+            This logger is not thread safe.
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.Logging.StreamLogger.#ctor(System.String,System.IO.Stream)">
+            <summary>
+              Creates a new <c>StreamLogger</c> with default encoding 
+              and buffer size. Initial Level is set to Debug.
+            </summary>
+            <param name = "name">
+              The name of the log.
+            </param>
+            <param name = "stream">
+              The stream that will be used for logging,
+              seeking while the logger is alive 
+            </param>
+        </member>
+        <member name="M:Castle.Core.Logging.StreamLogger.#ctor(System.String,System.IO.Stream,System.Text.Encoding)">
+            <summary>
+              Creates a new <c>StreamLogger</c> with default buffer size.
+              Initial Level is set to Debug.
+            </summary>
+            <param name="name">
+              The name of the log.
+            </param>
+            <param name="stream">
+              The stream that will be used for logging,
+              seeking while the logger is alive 
+            </param>
+            <param name="encoding">
+              The encoding that will be used for this stream.
+              <see cref="T:System.IO.StreamWriter"/>
+            </param>
+        </member>
+        <member name="M:Castle.Core.Logging.StreamLogger.#ctor(System.String,System.IO.Stream,System.Text.Encoding,System.Int32)">
+            <summary>
+              Creates a new <c>StreamLogger</c>. 
+              Initial Level is set to Debug.
+            </summary>
+            <param name="name">
+              The name of the log.
+            </param>
+            <param name="stream">
+              The stream that will be used for logging,
+              seeking while the logger is alive 
+            </param>
+            <param name="encoding">
+              The encoding that will be used for this stream.
+              <see cref="T:System.IO.StreamWriter"/>
+            </param>
+            <param name="bufferSize">
+              The buffer size that will be used for this stream.
+              <see cref="T:System.IO.StreamWriter"/>
+            </param>
+        </member>
+        <member name="M:Castle.Core.Logging.StreamLogger.#ctor(System.String,System.IO.StreamWriter)">
+            <summary>
+              Creates a new <c>StreamLogger</c> with 
+              Debug as default Level.
+            </summary>
+            <param name = "name">The name of the log.</param>
+            <param name = "writer">The <c>StreamWriter</c> the log will write to.</param>
+        </member>
+        <member name="T:Castle.Core.Logging.TraceLogger">
+            <summary>
+              The TraceLogger sends all logging to the System.Diagnostics.TraceSource
+              built into the .net framework.
+            </summary>
+            <remarks>
+              Logging can be configured in the system.diagnostics configuration 
+              section. 
+            
+              If logger doesn't find a source name with a full match it will
+              use source names which match the namespace partially. For example you can
+              configure from all castle components by adding a source name with the
+              name "Castle". 
+            
+              If no portion of the namespace matches the source named "Default" will
+              be used.
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.Logging.TraceLogger.#ctor(System.String)">
+            <summary>
+            Build a new trace logger based on the named TraceSource
+            </summary>
+            <param name="name">The name used to locate the best TraceSource. In most cases comes from the using type's fullname.</param>
+        </member>
+        <member name="M:Castle.Core.Logging.TraceLogger.#ctor(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+            Build a new trace logger based on the named TraceSource
+            </summary>
+            <param name="name">The name used to locate the best TraceSource. In most cases comes from the using type's fullname.</param>
+            <param name="level">The default logging level at which this source should write messages. In almost all cases this
+            default value will be overridden in the config file. </param>
+        </member>
+        <member name="M:Castle.Core.Logging.TraceLogger.CreateChildLogger(System.String)">
+            <summary>
+            Create a new child logger.
+            The name of the child logger is [current-loggers-name].[passed-in-name]
+            </summary>
+            <param name="loggerName">The Subname of this logger.</param>
+            <returns>The New ILogger instance.</returns> 
+        </member>
+        <member name="T:Castle.Core.Configuration.AbstractConfiguration">
+            <summary>
+              This is an abstract <see cref="T:Castle.Core.Configuration.IConfiguration"/> implementation
+              that deals with methods that can be abstracted away
+              from underlying implementations.
+            </summary>
+            <remarks>
+              <para><b>AbstractConfiguration</b> makes easier to implementers 
+                to create a new version of <see cref="T:Castle.Core.Configuration.IConfiguration"/></para>
+            </remarks>
+        </member>
+        <member name="T:Castle.Core.Configuration.IConfiguration">
+            <summary>
+            <see cref="T:Castle.Core.Configuration.IConfiguration"/> is a interface encapsulating a configuration node
+            used to retrieve configuration values.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.IConfiguration.GetValue(System.Type,System.Object)">
+            <summary>
+            Gets the value of the node and converts it 
+            into specified <see cref="T:System.Type"/>.
+            </summary>
+            <param name="type">The <see cref="T:System.Type"/></param>
+            <param name="defaultValue">
+            The Default value returned if the conversion fails.
+            </param>
+            <returns>The Value converted into the specified type.</returns>
+        </member>
+        <member name="P:Castle.Core.Configuration.IConfiguration.Name">
+            <summary>
+            Gets the name of the node.
+            </summary>
+            <value>
+            The Name of the node.
+            </value> 
+        </member>
+        <member name="P:Castle.Core.Configuration.IConfiguration.Value">
+            <summary>
+            Gets the value of the node.
+            </summary>
+            <value>
+            The Value of the node.
+            </value> 
+        </member>
+        <member name="P:Castle.Core.Configuration.IConfiguration.Children">
+            <summary>
+            Gets an <see cref="T:Castle.Core.Configuration.ConfigurationCollection"/> of <see cref="T:Castle.Core.Configuration.IConfiguration"/>
+            elements containing all node children.
+            </summary>
+            <value>The Collection of child nodes.</value>
+        </member>
+        <member name="P:Castle.Core.Configuration.IConfiguration.Attributes">
+            <summary>
+            Gets an <see cref="T:System.Collections.IDictionary"/> of the configuration attributes.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.AbstractConfiguration.GetValue(System.Type,System.Object)">
+            <summary>
+              Gets the value of the node and converts it
+              into specified <see cref="T:System.Type"/>.
+            </summary>
+            <param name="type">The <see cref="T:System.Type"/></param>
+            <param name="defaultValue">
+              The Default value returned if the conversion fails.
+            </param>
+            <returns>The Value converted into the specified type.</returns>
+        </member>
+        <member name="P:Castle.Core.Configuration.AbstractConfiguration.Attributes">
+            <summary>
+              Gets node attributes.
+            </summary>
+            <value>
+              All attributes of the node.
+            </value>
+        </member>
+        <member name="P:Castle.Core.Configuration.AbstractConfiguration.Children">
+            <summary>
+              Gets all child nodes.
+            </summary>
+            <value>The <see cref="T:Castle.Core.Configuration.ConfigurationCollection"/> of child nodes.</value>
+        </member>
+        <member name="P:Castle.Core.Configuration.AbstractConfiguration.Name">
+            <summary>
+              Gets the name of the <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </summary>
+            <value>
+              The Name of the <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </value>
+        </member>
+        <member name="P:Castle.Core.Configuration.AbstractConfiguration.Value">
+            <summary>
+              Gets the value of <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </summary>
+            <value>
+              The Value of the <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </value>
+        </member>
+        <member name="T:Castle.Core.Configuration.ConfigurationCollection">
+            <summary>
+            A collection of <see cref="T:Castle.Core.Configuration.IConfiguration"/> objects.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.ConfigurationCollection.#ctor">
+            <summary>
+            Creates a new instance of <c>ConfigurationCollection</c>.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.ConfigurationCollection.#ctor(System.Collections.Generic.IEnumerable{Castle.Core.Configuration.IConfiguration})">
+            <summary>
+            Creates a new instance of <c>ConfigurationCollection</c>.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Configuration.MutableConfiguration">
+            <summary>
+            Summary description for MutableConfiguration.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.MutableConfiguration.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Core.Configuration.MutableConfiguration"/> class.
+            </summary>
+            <param name="name">The name.</param>
+        </member>
+        <member name="P:Castle.Core.Configuration.MutableConfiguration.Value">
+            <summary>
+            Gets the value of <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </summary>
+            <value>
+            The Value of the <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </value>
+        </member>
+        <member name="M:Castle.Core.Configuration.Xml.XmlConfigurationDeserializer.Deserialize(System.Xml.XmlNode)">
+            <summary>
+              Deserializes the specified node into an abstract representation of configuration.
+            </summary>
+            <param name = "node">The node.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Configuration.Xml.XmlConfigurationDeserializer.GetConfigValue(System.String)">
+            <summary>
+              If a config value is an empty string we return null, this is to keep
+              backward compatibility with old code
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Pair`2">
+            <summary>
+            General purpose class to represent a standard pair of values. 
+            </summary>
+            <typeparam name="TFirst">Type of the first value</typeparam>
+            <typeparam name="TSecond">Type of the second value</typeparam>
+        </member>
+        <member name="M:Castle.Core.Pair`2.#ctor(`0,`1)">
+            <summary>
+            Constructs a pair with its values
+            </summary>
+            <param name="first"></param>
+            <param name="second"></param>
+        </member>
+        <member name="T:Castle.Core.ProxyServices">
+            <summary>
+            List of utility methods related to dynamic proxy operations
+            </summary>
+        </member>
+        <member name="M:Castle.Core.ProxyServices.IsDynamicProxy(System.Type)">
+            <summary>
+            Determines whether the specified type is a proxy generated by
+            DynamicProxy (1 or 2).
+            </summary>
+            <param name="type">The type.</param>
+            <returns>
+            	<c>true</c> if it is a proxy; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="T:Castle.Core.ReflectionBasedDictionaryAdapter">
+            <summary>
+            Readonly implementation of <see cref="T:System.Collections.IDictionary"/> which uses an anonymous object as its source. Uses names of properties as keys, and property values as... well - values. Keys are not case sensitive.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.#ctor(System.Object)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.Core.ReflectionBasedDictionaryAdapter"/> class.
+            </summary>
+            <param name="target">The target.</param>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Add(System.Object,System.Object)">
+            <summary>
+              Adds an element with the provided key and value to the <see cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <param name = "key">The <see cref = "T:System.Object" /> to use as the key of the element to add.</param>
+            <param name = "value">The <see cref = "T:System.Object" /> to use as the value of the element to add.</param>
+            <exception cref = "T:System.ArgumentNullException">
+              <paramref name = "key" /> is null. </exception>
+            <exception cref = "T:System.ArgumentException">An element with the same key already exists in the <see
+               cref = "T:System.Collections.IDictionary" /> object. </exception>
+            <exception cref = "T:System.NotSupportedException">The <see cref = "T:System.Collections.IDictionary" /> is read-only.-or- The <see
+               cref = "T:System.Collections.IDictionary" /> has a fixed size. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Clear">
+            <summary>
+              Removes all elements from the <see cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <exception cref = "T:System.NotSupportedException">The <see cref = "T:System.Collections.IDictionary" /> object is read-only. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Contains(System.Object)">
+            <summary>
+              Determines whether the <see cref = "T:System.Collections.IDictionary" /> object contains an element with the specified key.
+            </summary>
+            <param name = "key">The key to locate in the <see cref = "T:System.Collections.IDictionary" /> object.</param>
+            <returns>
+              true if the <see cref = "T:System.Collections.IDictionary" /> contains an element with the key; otherwise, false.
+            </returns>
+            <exception cref = "T:System.ArgumentNullException">
+              <paramref name = "key" /> is null. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Remove(System.Object)">
+            <summary>
+              Removes the element with the specified key from the <see cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <param name = "key">The key of the element to remove.</param>
+            <exception cref = "T:System.ArgumentNullException">
+              <paramref name = "key" /> is null. </exception>
+            <exception cref = "T:System.NotSupportedException">The <see cref = "T:System.Collections.IDictionary" /> object is read-only.-or- The <see
+               cref = "T:System.Collections.IDictionary" /> has a fixed size. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.GetEnumerator">
+            <summary>
+              Returns an enumerator that iterates through a collection.
+            </summary>
+            <returns>
+              An <see cref = "T:System.Collections.IEnumerator" /> object that can be used to iterate through the collection.
+            </returns>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.System#Collections#ICollection#CopyTo(System.Array,System.Int32)">
+            <summary>
+              Copies the elements of the <see cref = "T:System.Collections.ICollection" /> to an <see cref = "T:System.Array" />, starting at a particular <see
+               cref = "T:System.Array" /> index.
+            </summary>
+            <param name = "array">The one-dimensional <see cref = "T:System.Array" /> that is the destination of the elements copied from <see
+               cref = "T:System.Collections.ICollection" />. The <see cref = "T:System.Array" /> must have zero-based indexing.</param>
+            <param name = "index">The zero-based index in <paramref name = "array" /> at which copying begins.</param>
+            <exception cref = "T:System.ArgumentNullException">
+              <paramref name = "array" /> is null. </exception>
+            <exception cref = "T:System.ArgumentOutOfRangeException">
+              <paramref name = "index" /> is less than zero. </exception>
+            <exception cref = "T:System.ArgumentException">
+              <paramref name = "array" /> is multidimensional.-or- <paramref name = "index" /> is equal to or greater than the length of <paramref
+               name = "array" />.-or- The number of elements in the source <see cref = "T:System.Collections.ICollection" /> is greater than the available space from <paramref
+               name = "index" /> to the end of the destination <paramref name = "array" />. </exception>
+            <exception cref = "T:System.ArgumentException">The type of the source <see cref = "T:System.Collections.ICollection" /> cannot be cast automatically to the type of the destination <paramref
+               name = "array" />. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.System#Collections#IDictionary#GetEnumerator">
+            <summary>
+              Returns an <see cref = "T:System.Collections.IDictionaryEnumerator" /> object for the <see
+               cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <returns>
+              An <see cref = "T:System.Collections.IDictionaryEnumerator" /> object for the <see
+               cref = "T:System.Collections.IDictionary" /> object.
+            </returns>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Read(System.Collections.IDictionary,System.Object)">
+            <summary>
+              Reads values of properties from <paramref name = "valuesAsAnonymousObject" /> and inserts them into <paramref
+               name = "targetDictionary" /> using property names as keys.
+            </summary>
+            <param name = "targetDictionary"></param>
+            <param name = "valuesAsAnonymousObject"></param>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.Count">
+            <summary>
+              Gets the number of elements contained in the <see cref = "T:System.Collections.ICollection" />.
+            </summary>
+            <value></value>
+            <returns>The number of elements contained in the <see cref = "T:System.Collections.ICollection" />.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.IsSynchronized">
+            <summary>
+              Gets a value indicating whether access to the <see cref = "T:System.Collections.ICollection" /> is synchronized (thread safe).
+            </summary>
+            <value></value>
+            <returns>true if access to the <see cref = "T:System.Collections.ICollection" /> is synchronized (thread safe); otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.SyncRoot">
+            <summary>
+              Gets an object that can be used to synchronize access to the <see cref = "T:System.Collections.ICollection" />.
+            </summary>
+            <value></value>
+            <returns>An object that can be used to synchronize access to the <see cref = "T:System.Collections.ICollection" />.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.IsReadOnly">
+            <summary>
+              Gets a value indicating whether the <see cref = "T:System.Collections.IDictionary" /> object is read-only.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref = "T:System.Collections.IDictionary" /> object is read-only; otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.Item(System.Object)">
+            <summary>
+              Gets or sets the <see cref="T:System.Object"/> with the specified key.
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.Keys">
+            <summary>
+              Gets an <see cref = "T:System.Collections.ICollection" /> object containing the keys of the <see
+               cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <value></value>
+            <returns>An <see cref = "T:System.Collections.ICollection" /> object containing the keys of the <see
+               cref = "T:System.Collections.IDictionary" /> object.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.Values">
+            <summary>
+              Gets an <see cref = "T:System.Collections.ICollection" /> object containing the values in the <see
+               cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <value></value>
+            <returns>An <see cref = "T:System.Collections.ICollection" /> object containing the values in the <see
+               cref = "T:System.Collections.IDictionary" /> object.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.System#Collections#IDictionary#IsFixedSize">
+            <summary>
+              Gets a value indicating whether the <see cref = "T:System.Collections.IDictionary" /> object has a fixed size.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref = "T:System.Collections.IDictionary" /> object has a fixed size; otherwise, false.</returns>
+        </member>
+        <member name="T:Castle.Core.Resource.IResource">
+            <summary>
+            Represents a 'streamable' resource. Can
+            be a file, a resource in an assembly.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Resource.IResource.GetStreamReader">
+            <summary>
+            Returns a reader for the stream
+            </summary>
+            <remarks>
+            It's up to the caller to dispose the reader.
+            </remarks>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Resource.IResource.GetStreamReader(System.Text.Encoding)">
+            <summary>
+            Returns a reader for the stream
+            </summary>
+            <remarks>
+            It's up to the caller to dispose the reader.
+            </remarks>
+            <param name="encoding"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Resource.IResource.CreateRelative(System.String)">
+            <summary>
+            Returns an instance of <see cref="T:Castle.Core.Resource.IResource"/>
+            created according to the <c>relativePath</c>
+            using itself as the root.
+            </summary>
+            <param name="relativePath"></param>
+            <returns></returns>
+        </member>
+        <member name="P:Castle.Core.Resource.IResource.FileBasePath">
+            <summary>
+            
+            </summary>
+            <remarks>
+            Only valid for resources that
+            can be obtained through relative paths
+            </remarks>
+        </member>
+        <member name="T:Castle.Core.Resource.AbstractStreamResource">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Resource.AbstractStreamResource.createStream">
+            <summary>
+            This returns a new stream instance each time it is called.
+            It is the responsibility of the caller to dispose of this stream
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Resource.IResourceFactory">
+            <summary>
+            Depicts the contract for resource factories.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Resource.IResourceFactory.Accept(Castle.Core.Resource.CustomUri)">
+            <summary>
+            Used to check whether the resource factory
+            is able to deal with the given resource
+            identifier.
+            </summary>
+            <remarks>
+            Implementors should return <c>true</c>
+            only if the given identifier is supported
+            by the resource factory
+            </remarks>
+            <param name="uri"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Resource.IResourceFactory.Create(Castle.Core.Resource.CustomUri)">
+            <summary>
+            Creates an <see cref="T:Castle.Core.Resource.IResource"/> instance
+            for the given resource identifier
+            </summary>
+            <param name="uri"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Resource.IResourceFactory.Create(Castle.Core.Resource.CustomUri,System.String)">
+            <summary>
+            Creates an <see cref="T:Castle.Core.Resource.IResource"/> instance
+            for the given resource identifier
+            </summary>
+            <param name="uri"></param>
+            <param name="basePath"></param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.Resource.FileResource">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Resource.FileResourceFactory">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Resource.StaticContentResource">
+            <summary>
+            Adapts a static string content as an <see cref="T:Castle.Core.Resource.IResource"/>
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Resource.UncResource">
+            <summary>
+            Enable access to files on network shares
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Smtp.IEmailSender">
+            <summary>
+            Email sender abstraction.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Smtp.IEmailSender.Send(System.String,System.String,System.String,System.String)">
+            <summary>
+            Sends a mail message.
+            </summary>
+            <param name="from">From field</param>
+            <param name="to">To field</param>
+            <param name="subject">E-mail's subject</param>
+            <param name="messageText">message's body</param>
+        </member>
+        <member name="M:Castle.Core.Smtp.IEmailSender.Send(System.Net.Mail.MailMessage)">
+            <summary>
+            Sends a <see cref="T:System.Net.Mail.MailMessage">message</see>. 
+            </summary>
+            <param name="message"><see cref="T:System.Net.Mail.MailMessage">Message</see> instance</param>
+        </member>
+        <member name="M:Castle.Core.Smtp.IEmailSender.Send(System.Collections.Generic.IEnumerable{System.Net.Mail.MailMessage})">
+            <summary>
+            Sends multiple <see cref="T:System.Net.Mail.MailMessage">messages</see>. 
+            </summary>
+            <param name="messages">List of <see cref="T:System.Net.Mail.MailMessage">messages</see></param>
+        </member>
+        <member name="T:Castle.Core.Smtp.DefaultSmtpSender">
+            <summary>
+            Default <see cref="T:Castle.Core.Smtp.IEmailSender"/> implementation.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Smtp.DefaultSmtpSender.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Core.Smtp.DefaultSmtpSender"/> class based on the <see cref="T:System.Net.Mail.SmtpClient"/> configuration provided in the application configuration file.
+            </summary>
+            <remarks>
+            This constructor is based on the default <see cref="T:System.Net.Mail.SmtpClient"/> configuration in the application configuration file.
+            </remarks> 
+        </member>
+        <member name="M:Castle.Core.Smtp.DefaultSmtpSender.#ctor(System.String)">
+            <summary>
+            This service implementation
+            requires a host name in order to work
+            </summary>
+            <param name="hostname">The smtp server name</param>
+        </member>
+        <member name="M:Castle.Core.Smtp.DefaultSmtpSender.Send(System.String,System.String,System.String,System.String)">
+            <summary>
+            Sends a message. 
+            </summary>
+            <exception cref="T:System.ArgumentNullException">If any of the parameters is null</exception>
+            <param name="from">From field</param>
+            <param name="to">To field</param>
+            <param name="subject">e-mail's subject</param>
+            <param name="messageText">message's body</param>
+        </member>
+        <member name="M:Castle.Core.Smtp.DefaultSmtpSender.Send(System.Net.Mail.MailMessage)">
+            <summary>
+            Sends a message. 
+            </summary>
+            <exception cref="T:System.ArgumentNullException">If the message is null</exception>
+            <param name="message">Message instance</param>
+        </member>
+        <member name="M:Castle.Core.Smtp.DefaultSmtpSender.Configure(System.Net.Mail.SmtpClient)">
+            <summary>
+            Configures the sender
+            with port information and eventual credential
+            informed
+            </summary>
+            <param name="smtpClient">Message instance</param>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.Port">
+            <summary>
+            Gets or sets the port used to 
+            access the SMTP server
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.Hostname">
+            <summary>
+            Gets the hostname.
+            </summary>
+            <value>The hostname.</value>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.AsyncSend">
+            <summary>
+            Gets or sets a value which is used to 
+            configure if emails are going to be sent asynchronously or not.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.Timeout">
+            <summary>
+            Gets or sets a value that specifies 
+            the amount of time after which a synchronous Send call times out.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.UseSsl">
+            <summary>
+            Gets or sets a value indicating whether the email should be sent using 
+            a secure communication channel.
+            </summary>
+            <value><c>true</c> if should use SSL; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.Domain">
+            <summary>
+            Gets or sets the domain.
+            </summary>
+            <value>The domain.</value>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.UserName">
+            <summary>
+            Gets or sets the name of the user.
+            </summary>
+            <value>The name of the user.</value>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.Password">
+            <summary>
+            Gets or sets the password.
+            </summary>
+            <value>The password.</value>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.HasCredentials">
+            <summary>
+            Gets a value indicating whether credentials were informed.
+            </summary>
+            <value>
+            <see langword="true"/> if this instance has credentials; otherwise, <see langword="false"/>.
+            </value>
+        </member>
+    </members>
+</doc>
Binary file packages/Castle.Core.3.2.1/lib/net45/Castle.Core.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/Castle.Core.3.2.1/lib/net45/Castle.Core.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4754 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>Castle.Core</name>
+    </assembly>
+    <members>
+        <member name="T:Castle.Components.DictionaryAdapter.ReferenceAttribute">
+            <summary>
+            Specifies assignment by reference rather than by copying.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IfExistsAttribute">
+            <summary>
+            Suppresses any on-demand behaviors.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.RemoveIfEmptyAttribute">
+            <summary>
+            Removes a property if null or empty string, guid or collection.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.RemoveIfAttribute">
+            <summary>
+            Removes a property if matches value.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.DictionaryBehaviorAttribute">
+            <summary>
+            Assigns a specific dictionary key.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryBehavior">
+            <summary>
+            Defines the contract for customizing dictionary access.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryBehavior.Copy">
+            <summary>
+            Copies the dictionary behavior.
+            </summary>
+            <returns>null if should not be copied.  Otherwise copy.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.IDictionaryBehavior.ExecutionOrder">
+            <summary>
+            Determines relative order to apply related behaviors.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryPropertySetter">
+            <summary>
+            Defines the contract for updating dictionary values.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryPropertySetter.SetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object@,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Sets the stored dictionary value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="value">The stored value.</param>
+            <param name="property">The property.</param>
+            <returns>true if the property should be stored.</returns>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.ICondition">
+            <summary>
+            Contract for value matching.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.VolatileAttribute">
+            <summary>
+            Indicates that underlying values are changeable and should not be cached.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryInitializer">
+            <summary>
+             Contract for dictionary initialization.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryInitializer.Initialize(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.Object[])">
+            <summary>
+            Performs any initialization of the <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/>
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="behaviors">The dictionary behaviors.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapterVisitor">
+            <summary>
+            Abstract implementation of <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapterVisitor"/>.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryAdapterVisitor">
+            <summary>
+            Conract for traversing a <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/>.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryCreate">
+            <summary>
+            Contract for creating additional Dictionary adapters.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter">
+            <summary>
+            Contract for manipulating the Dictionary adapter.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryEdit">
+            <summary>
+            Contract for editing the Dictionary adapter.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryNotify">
+            <summary>
+            Contract for managing Dictionary adapter notifications.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryValidate">
+            <summary>
+            Contract for validating Dictionary adapter.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryBehaviorBuilder">
+            <summary>
+            Defines the contract for building <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryBehavior"/>s.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryBehaviorBuilder.BuildBehaviors">
+            <summary>
+            Builds the dictionary behaviors.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter">
+            <summary>
+            Abstract adapter for the <see cref="T:System.Collections.IDictionary"/> support
+            needed by the <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory"/>
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Add(System.Object,System.Object)">
+            <summary>
+            Adds an element with the provided key and value to the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <param name="key">The <see cref="T:System.Object"></see> to use as the key of the element to add.</param>
+            <param name="value">The <see cref="T:System.Object"></see> to use as the value of the element to add.</param>
+            <exception cref="T:System.ArgumentException">An element with the same key already exists in the <see cref="T:System.Collections.IDictionary"></see> object. </exception>
+            <exception cref="T:System.ArgumentNullException">key is null. </exception>
+            <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.IDictionary"></see> is read-only.-or- The <see cref="T:System.Collections.IDictionary"></see> has a fixed size. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Clear">
+            <summary>
+            Removes all elements from the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.IDictionary"></see> object is read-only. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Contains(System.Object)">
+            <summary>
+            Determines whether the <see cref="T:System.Collections.IDictionary"></see> object contains an element with the specified key.
+            </summary>
+            <param name="key">The key to locate in the <see cref="T:System.Collections.IDictionary"></see> object.</param>
+            <returns>
+            true if the <see cref="T:System.Collections.IDictionary"></see> contains an element with the key; otherwise, false.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">key is null. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.GetEnumerator">
+            <summary>
+            Returns an <see cref="T:System.Collections.IDictionaryEnumerator"></see> object for the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <returns>
+            An <see cref="T:System.Collections.IDictionaryEnumerator"></see> object for the <see cref="T:System.Collections.IDictionary"></see> object.
+            </returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Remove(System.Object)">
+            <summary>
+            Removes the element with the specified key from the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <param name="key">The key of the element to remove.</param>
+            <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.IDictionary"></see> object is read-only.-or- The <see cref="T:System.Collections.IDictionary"></see> has a fixed size. </exception>
+            <exception cref="T:System.ArgumentNullException">key is null. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.CopyTo(System.Array,System.Int32)">
+            <summary>
+            Copies the elements of the <see cref="T:System.Collections.ICollection"></see> to an <see cref="T:System.Array"></see>, starting at a particular <see cref="T:System.Array"></see> index.
+            </summary>
+            <param name="array">The one-dimensional <see cref="T:System.Array"></see> that is the destination of the elements copied from <see cref="T:System.Collections.ICollection"></see>. The <see cref="T:System.Array"></see> must have zero-based indexing.</param>
+            <param name="index">The zero-based index in array at which copying begins.</param>
+            <exception cref="T:System.ArgumentNullException">array is null. </exception>
+            <exception cref="T:System.ArgumentException">The type of the source <see cref="T:System.Collections.ICollection"></see> cannot be cast automatically to the type of the destination array. </exception>
+            <exception cref="T:System.ArgumentOutOfRangeException">index is less than zero. </exception>
+            <exception cref="T:System.ArgumentException">array is multidimensional.-or- index is equal to or greater than the length of array.-or- The number of elements in the source <see cref="T:System.Collections.ICollection"></see> is greater than the available space from index to the end of the destination array. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.System#Collections#IEnumerable#GetEnumerator">
+            <summary>
+            Returns an enumerator that iterates through a collection.
+            </summary>
+            <returns>
+            An <see cref="T:System.Collections.IEnumerator"></see> object that can be used to iterate through the collection.
+            </returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.IsFixedSize">
+            <summary>
+            Gets a value indicating whether the <see cref="T:System.Collections.IDictionary"></see> object has a fixed size.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref="T:System.Collections.IDictionary"></see> object has a fixed size; otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.IsReadOnly">
+            <summary>
+            Gets a value indicating whether the <see cref="T:System.Collections.IDictionary"></see> object is read-only.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref="T:System.Collections.IDictionary"></see> object is read-only; otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Keys">
+            <summary>
+            Gets an <see cref="T:System.Collections.ICollection"></see> object containing the keys of the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <value></value>
+            <returns>An <see cref="T:System.Collections.ICollection"></see> object containing the keys of the <see cref="T:System.Collections.IDictionary"></see> object.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Values">
+            <summary>
+            Gets an <see cref="T:System.Collections.ICollection"></see> object containing the values in the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <value></value>
+            <returns>An <see cref="T:System.Collections.ICollection"></see> object containing the values in the <see cref="T:System.Collections.IDictionary"></see> object.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Item(System.Object)">
+            <summary>
+            Gets or sets the <see cref="T:System.Object"/> with the specified key.
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Count">
+            <summary>
+            Gets the number of elements contained in the <see cref="T:System.Collections.ICollection"></see>.
+            </summary>
+            <value></value>
+            <returns>The number of elements contained in the <see cref="T:System.Collections.ICollection"></see>.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.IsSynchronized">
+            <summary>
+            Gets a value indicating whether access to the <see cref="T:System.Collections.ICollection"></see> is synchronized (thread safe).
+            </summary>
+            <value></value>
+            <returns>true if access to the <see cref="T:System.Collections.ICollection"></see> is synchronized (thread safe); otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.SyncRoot">
+            <summary>
+            Gets an object that can be used to synchronize access to the <see cref="T:System.Collections.ICollection"></see>.
+            </summary>
+            <value></value>
+            <returns>An object that can be used to synchronize access to the <see cref="T:System.Collections.ICollection"></see>.</returns>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.BindingList`1">
+            <summary>
+              Provides a generic collection that supports data binding.
+            </summary>
+            <remarks>
+              This class wraps the CLR <see cref="T:System.ComponentModel.BindingList`1"/>
+              in order to implement the Castle-specific <see cref="T:Castle.Components.DictionaryAdapter.IBindingList`1"/>.
+            </remarks>
+            <typeparam name="T">The type of elements in the list.</typeparam>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.BindingList`1.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.BindingList`1"/> class
+              using default values.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.BindingList`1.#ctor(System.Collections.Generic.IList{`0})">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.BindingList`1"/> class
+              with the specified list.
+            </summary>
+            <param name="list">
+              An <see cref="T:System.Collections.Generic.IList`1"/> of items
+              to be contained in the <see cref="T:Castle.Components.DictionaryAdapter.BindingList`1"/>.
+            </param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.BindingList`1.#ctor(System.ComponentModel.BindingList{`0})">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.BindingList`1"/> class
+              wrapping the specified <see cref="T:System.ComponentModel.BindingList`1"/> instance.
+            </summary>
+            <param name="list">
+              A <see cref="T:System.ComponentModel.BindingList`1"/>
+              to be wrapped by the <see cref="T:Castle.Components.DictionaryAdapter.BindingList`1"/>.
+            </param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryPropertyGetter">
+            <summary>
+            Defines the contract for retrieving dictionary values.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryPropertyGetter.GetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object,Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Boolean)">
+            <summary>
+            Gets the effective dictionary value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="storedValue">The stored value.</param>
+            <param name="property">The property.</param>
+            <param name="ifExists">true if return only existing.</param>
+            <returns>The effective property value.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.Xml.XmlAdapter.#ctor(Castle.Components.DictionaryAdapter.Xml.IXmlNode,Castle.Components.DictionaryAdapter.Xml.XmlReferenceManager)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.Xml.XmlAdapter"/> class
+            that represents a child object in a larger object graph.
+            </summary>
+            <param name="node"></param>
+            <param name="references"></param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryMetaInitializer">
+            <summary>
+             Contract for dictionary meta-data initialization.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryMetaInitializer.Initialize(Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory,Castle.Components.DictionaryAdapter.DictionaryAdapterMeta)">
+            <summary>
+            	Initializes the given <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> object.
+            </summary>
+            <param name="factory">The dictionary adapter factory.</param>
+            <param name="dictionaryMeta">The dictionary adapter meta.</param>
+            
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryMetaInitializer.ShouldHaveBehavior(System.Object)">
+            <summary>
+            	Determines whether the given behavior should be included in a new
+            	<see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> object.
+            </summary>
+            <param name="behavior">A dictionary behavior or annotation.</param>
+            <returns>True if the behavior should be included; otherwise, false.</returns>
+            <remarks>
+            	<see cref="T:Castle.Components.DictionaryAdapter.IDictionaryMetaInitializer"/> behaviors are always included,
+            	regardless of the result of this method.
+            </remarks>
+            
+        </member>
+        <member name="M:Castle.Core.Internal.CollectionExtensions.IsNullOrEmpty(System.Collections.IEnumerable)">
+            <summary>
+              Checks whether or not collection is null or empty. Assumes colleciton can be safely enumerated multiple times.
+            </summary>
+            <param name = "this"></param>
+            <returns></returns>
+        </member>
+        <member name="F:Castle.Core.Internal.InternalsVisible.ToCastleCore">
+            <summary>
+              Constant to use when making assembly internals visible to Castle.Core 
+              <c>[assembly: InternalsVisibleTo(CoreInternalsVisible.ToCastleCore)]</c>
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Internal.InternalsVisible.ToDynamicProxyGenAssembly2">
+            <summary>
+              Constant to use when making assembly internals visible to proxy types generated by DynamicProxy. Required when proxying internal types.
+              <c>[assembly: InternalsVisibleTo(CoreInternalsVisible.ToDynamicProxyGenAssembly2)]</c>
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.ComponentAttribute">
+            <summary>
+            Identifies a property should be represented as a nested component.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryKeyBuilder">
+            <summary>
+            Defines the contract for building typed dictionary keys.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryKeyBuilder.GetKey(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Builds the specified key.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The current key.</param>
+            <param name="property">The property.</param>
+            <returns>The updated key</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.ComponentAttribute.NoPrefix">
+            <summary>
+            Applies no prefix.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.ComponentAttribute.Prefix">
+            <summary>
+            Gets or sets the prefix.
+            </summary>
+            <value>The prefix.</value>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.DictionaryAdapterAttribute">
+            <summary>
+            Identifies the dictionary adapter types.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.FetchAttribute">
+            <summary>
+            Identifies an interface or property to be pre-fetched.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.FetchAttribute.#ctor">
+            <summary>
+            Instructs fetching to occur.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.FetchAttribute.#ctor(System.Boolean)">
+            <summary>
+            Instructs fetching according to <paramref name="fetch"/>
+            </summary>
+            <param name="fetch"></param>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.FetchAttribute.Fetch">
+            <summary>
+            Gets whether or not fetching should occur.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.GroupAttribute">
+            <summary>
+            Assigns a property to a group.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.GroupAttribute.#ctor(System.Object)">
+            <summary>
+            Constructs a group assignment.
+            </summary>
+            <param name="group">The group name.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.GroupAttribute.#ctor(System.Object[])">
+            <summary>
+            Constructs a group assignment.
+            </summary>
+            <param name="group">The group name.</param>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.GroupAttribute.Group">
+            <summary>
+            Gets the group the property is assigned to.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.KeyAttribute">
+            <summary>
+            Assigns a specific dictionary key.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeyAttribute.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeyAttribute"/> class.
+            </summary>
+            <param name="key">The key.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeyAttribute.#ctor(System.String[])">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeyAttribute"/> class.
+            </summary>
+            <param name="keys">The compound key.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.KeyPrefixAttribute">
+            <summary>
+            Assigns a prefix to the keyed properties of an interface.
+            </summary>
+            <remarks>
+            Key prefixes are not inherited by sub-interfaces.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeyPrefixAttribute.#ctor">
+            <summary>
+            Initializes a default instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeyPrefixAttribute"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeyPrefixAttribute.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeyPrefixAttribute"/> class.
+            </summary>
+            <param name="keyPrefix">The prefix for the keyed properties of the interface.</param>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.KeyPrefixAttribute.KeyPrefix">
+            <summary>
+            Gets the prefix key added to the properties of the interface.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.KeySubstitutionAttribute">
+            <summary>
+            Substitutes part of key with another string.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeySubstitutionAttribute.#ctor(System.String,System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeySubstitutionAttribute"/> class.
+            </summary>
+            <param name="oldValue">The old value.</param>
+            <param name="newValue">The new value.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.MultiLevelEditAttribute">
+            <summary>
+            Requests support for multi-level editing.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.NewGuidAttribute">
+            <summary>
+            Generates a new GUID on demand.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.OnDemandAttribute">
+            <summary>
+            Support for on-demand value resolution.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.StringFormatAttribute">
+            <summary>
+            Provides simple string formatting from existing properties.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.StringFormatAttribute.Format">
+            <summary>
+            Gets the string format.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.StringFormatAttribute.Properties">
+            <summary>
+            Gets the format properties.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.StringListAttribute">
+            <summary>
+            Identifies a property should be represented as a delimited string value.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.StringListAttribute.Separator">
+            <summary>
+            Gets the separator.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.StringValuesAttribute">
+            <summary>
+            Converts all properties to strings.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.StringValuesAttribute.Format">
+            <summary>
+            Gets or sets the format.
+            </summary>
+            <value>The format.</value>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.SuppressNotificationsAttribute">
+            <summary>
+            Suppress property change notifications.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IPropertyDescriptorInitializer">
+            <summary>
+             Contract for property descriptor initialization.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IPropertyDescriptorInitializer.Initialize(Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Object[])">
+            <summary>
+            Performs any initialization of the <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <param name="propertyDescriptor">The property descriptor.</param>
+            <param name="behaviors">The property behaviors.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.TypeKeyPrefixAttribute">
+            <summary>
+            Assigns a prefix to the keyed properties using the interface name.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.DefaultPropertyGetter">
+            <summary>
+            Manages conversion between property values.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DefaultPropertyGetter.#ctor(System.ComponentModel.TypeConverter)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.DefaultPropertyGetter"/> class.
+            </summary>
+            <param name="converter">The converter.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DefaultPropertyGetter.GetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object,Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Boolean)">
+            <summary>
+            Gets the effective dictionary value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="storedValue">The stored value.</param>
+            <param name="property">The property.</param>
+            <param name="ifExists">true if return only existing.</param>
+            <returns>The effective property value.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.DefaultPropertyGetter.ExecutionOrder">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory">
+            <summary>
+            Uses Reflection.Emit to expose the properties of a dictionary
+            through a dynamic implementation of a typed interface.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory">
+            <summary>
+            Defines the contract for building typed dictionary adapters.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter``1(System.Collections.IDictionary)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Collections.IDictionary"/>.
+            </summary>
+            <typeparam name="T">The typed interface.</typeparam>
+            <param name="dictionary">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the dictionary.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.IDictionary)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Collections.IDictionary"/>.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="dictionary">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the dictionary.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.IDictionary,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Collections.IDictionary"/>.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="dictionary">The underlying source of properties.</param>
+            <param name="descriptor">The property descriptor.</param>
+            <returns>An implementation of the typed interface bound to the dictionary.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter``1(System.Collections.Specialized.NameValueCollection)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Collections.Specialized.NameValueCollection"/>.
+            </summary>
+            <typeparam name="T">The typed interface.</typeparam>
+            <param name="nameValues">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the namedValues.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.Specialized.NameValueCollection)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Collections.Specialized.NameValueCollection"/>.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="nameValues">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the namedValues.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter``1(System.Xml.XmlNode)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Xml.XmlNode"/>.
+            </summary>
+            <typeparam name="T">The typed interface.</typeparam>
+            <param name="xmlNode">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the <see cref="T:System.Xml.XmlNode"/>.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter(System.Type,System.Xml.XmlNode)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Xml.XmlNode"/>.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="xmlNode">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the <see cref="T:System.Xml.XmlNode"/>.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapterMeta(System.Type)">
+            <summary>
+            Gets the <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> associated with the type.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <returns>The adapter meta-data.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapterMeta(System.Type,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Gets the <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> associated with the type.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="descriptor">The property descriptor.</param>
+            <returns>The adapter meta-data.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapterMeta(System.Type,Castle.Components.DictionaryAdapter.DictionaryAdapterMeta)">
+            <summary>
+            Gets the <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> associated with the type.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="other">Another <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> from which to copy behaviors.</param>
+            <returns>The adapter meta-data.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter``1(System.Collections.IDictionary)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.IDictionary)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.IDictionary,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter``2(System.Collections.Generic.IDictionary{System.String,``1})">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter``1(System.Type,System.Collections.Generic.IDictionary{System.String,``0})">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter``1(System.Collections.Specialized.NameValueCollection)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.Specialized.NameValueCollection)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter``1(System.Xml.XmlNode)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter(System.Type,System.Xml.XmlNode)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapterMeta(System.Type)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapterMeta(System.Type,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapterMeta(System.Type,Castle.Components.DictionaryAdapter.DictionaryAdapterMeta)">
+            <inheritdoc />
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryValidator">
+            <summary>
+            Contract for dictionary validation.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryValidator.IsValid(Castle.Components.DictionaryAdapter.IDictionaryAdapter)">
+            <summary>
+            Determines if <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/> is valid.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <returns>true if valid.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryValidator.Validate(Castle.Components.DictionaryAdapter.IDictionaryAdapter)">
+            <summary>
+            Validates the <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/>.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <returns>The error summary information.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryValidator.Validate(Castle.Components.DictionaryAdapter.IDictionaryAdapter,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Validates the <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/> for a property.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="property">The property to validate.</param>
+            <returns>The property summary information.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryValidator.Invalidate(Castle.Components.DictionaryAdapter.IDictionaryAdapter)">
+            <summary>
+            Invalidates any results cached by the validator.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter.#ctor(System.Collections.Specialized.NameValueCollection)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter"/> class.
+            </summary>
+            <param name="nameValues">The name values.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter.Contains(System.Object)">
+            <summary>
+            Determines whether the <see cref="T:System.Collections.IDictionary"></see> object contains an element with the specified key.
+            </summary>
+            <param name="key">The key to locate in the <see cref="T:System.Collections.IDictionary"></see> object.</param>
+            <returns>
+            true if the <see cref="T:System.Collections.IDictionary"></see> contains an element with the key; otherwise, false.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">key is null. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter.Adapt(System.Collections.Specialized.NameValueCollection)">
+            <summary>
+            Adapts the specified name values.
+            </summary>
+            <param name="nameValues">The name values.</param>
+            <returns></returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter.IsReadOnly">
+            <summary>
+            Gets a value indicating whether the <see cref="T:System.Collections.IDictionary"></see> object is read-only.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref="T:System.Collections.IDictionary"></see> object is read-only; otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.NameValueCollectionAdapter.Item(System.Object)">
+            <summary>
+            Gets or sets the <see cref="T:System.Object"/> with the specified key.
+            </summary>
+            <value></value>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.PropertyDescriptor">
+            <summary>
+            Describes a dictionary property.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.#ctor">
+            <summary>
+            Initializes an empty <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.#ctor(System.Reflection.PropertyInfo,System.Object[])">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/> class.
+            </summary>
+            <param name="property">The property.</param>
+            <param name="annotations">The annotations.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.#ctor(System.Object[])">
+            <summary>
+            Initializes a new instance <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.#ctor(Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Boolean)">
+            <summary>
+             Copies an existinginstance of the <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/> class.
+            </summary>
+            <param name="source"></param>
+            <param name="copyBehaviors"></param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.GetKey(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Gets the key.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="descriptor">The descriptor.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.GetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object,Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Boolean)">
+            <summary>
+            Gets the property value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="storedValue">The stored value.</param>
+            <param name="descriptor">The descriptor.</param>
+            <param name="ifExists">true if return only existing.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.SetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object@,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Sets the property value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="value">The value.</param>
+            <param name="descriptor">The descriptor.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.AddBehavior(Castle.Components.DictionaryAdapter.IDictionaryBehavior)">
+            <summary>
+            Adds a single behavior.
+            </summary>
+            <param name="behavior">The behavior.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.AddBehaviors(Castle.Components.DictionaryAdapter.IDictionaryBehavior[])">
+            <summary>
+            Adds the behaviors.
+            </summary>
+            <param name="behaviors">The behaviors.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.AddBehaviors(System.Collections.Generic.IEnumerable{Castle.Components.DictionaryAdapter.IDictionaryBehavior})">
+            <summary>
+            Adds the behaviors.
+            </summary>
+            <param name="behaviors">The behaviors.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.CopyBehaviors(Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Copies the behaviors to the other <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <param name="other"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.Copy">
+            <summary>
+            Copies the <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.ExecutionOrder">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.PropertyName">
+            <summary>
+            Gets the property name.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.PropertyType">
+            <summary>
+            Gets the property type.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Property">
+            <summary>
+            Gets the property.
+            </summary>
+            <value>The property.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.IsDynamicProperty">
+            <summary>
+            Returns true if the property is dynamic.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.State">
+            <summary>
+            Gets additional state.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Fetch">
+            <summary>
+            Determines if property should be fetched.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.IfExists">
+            <summary>
+            Determines if property must exist first.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.SuppressNotifications">
+            <summary>
+            Determines if notifications should occur.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Annotations">
+            <summary>
+            Gets the property behaviors.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.TypeConverter">
+            <summary>
+            Gets the type converter.
+            </summary>
+            <value>The type converter.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.ExtendedProperties">
+            <summary>
+            Gets the extended properties.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Behaviors">
+            <summary>
+            Gets the setter.
+            </summary>
+            <value>The setter.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.KeyBuilders">
+            <summary>
+            Gets the key builders.
+            </summary>
+            <value>The key builders.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Setters">
+            <summary>
+            Gets the setter.
+            </summary>
+            <value>The setter.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Getters">
+            <summary>
+            Gets the getter.
+            </summary>
+            <value>The getter.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Initializers">
+            <summary>
+            Gets the initializers.
+            </summary>
+            <value>The initializers.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.MetaInitializers">
+            <summary>
+            Gets the meta-data initializers.
+            </summary>
+            <value>The meta-data initializers.</value>
+        </member>
+        <member name="T:Castle.Core.Internal.AttributesUtil">
+            <summary>
+              Helper class for retrieving attributes.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetAttribute``1(System.Reflection.ICustomAttributeProvider)">
+            <summary>
+              Gets the attribute.
+            </summary>
+            <param name = "member">The member.</param>
+            <returns>The member attribute.</returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetAttributes``1(System.Reflection.ICustomAttributeProvider)">
+            <summary>
+              Gets the attributes. Does not consider inherited attributes!
+            </summary>
+            <param name = "member">The member.</param>
+            <returns>The member attributes.</returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetTypeAttribute``1(System.Type)">
+            <summary>
+              Gets the type attribute.
+            </summary>
+            <param name = "type">The type.</param>
+            <returns>The type attribute.</returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetTypeAttributes``1(System.Type)">
+            <summary>
+              Gets the type attributes.
+            </summary>
+            <param name = "type">The type.</param>
+            <returns>The type attributes.</returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetTypeConverter(System.Reflection.MemberInfo)">
+            <summary>
+              Gets the type converter.
+            </summary>
+            <param name = "member">The member.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.HasAttribute``1(System.Reflection.ICustomAttributeProvider)">
+            <summary>
+              Gets the attribute.
+            </summary>
+            <param name = "member">The member.</param>
+            <returns>The member attribute.</returns>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDynamicValue`1">
+            <summary>
+            Contract for typed dynamic value resolution.
+            </summary>
+            <typeparam name="T"></typeparam>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDynamicValue">
+            <summary>
+            Contract for dynamic value resolution.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.LoggerLevel">
+            <summary>
+              Supporting Logger levels.
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Off">
+            <summary>
+              Logging will be off
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Fatal">
+            <summary>
+              Fatal logging level
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Error">
+            <summary>
+              Error logging level
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Warn">
+            <summary>
+              Warn logging level
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Info">
+            <summary>
+              Info logging level
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Debug">
+            <summary>
+              Debug logging level
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.IInvocation">
+            <summary>
+              Encapsulates an invocation of a proxied method.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.GetArgumentValue(System.Int32)">
+            <summary>
+              Gets the value of the argument at the specified <paramref name = "index" />.
+            </summary>
+            <param name = "index">The index.</param>
+            <returns>The value of the argument at the specified <paramref name = "index" />.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.GetConcreteMethod">
+            <summary>
+              Returns the concrete instantiation of the <see cref="P:Castle.DynamicProxy.IInvocation.Method"/> on the proxy, with any generic
+              parameters bound to real types.
+            </summary>
+            <returns>
+              The concrete instantiation of the <see cref="P:Castle.DynamicProxy.IInvocation.Method"/> on the proxy, or the <see cref="P:Castle.DynamicProxy.IInvocation.Method"/> if
+              not a generic method.
+            </returns>
+            <remarks>
+              Can be slower than calling <see cref="P:Castle.DynamicProxy.IInvocation.Method"/>.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.GetConcreteMethodInvocationTarget">
+            <summary>
+              Returns the concrete instantiation of <see cref="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget"/>, with any
+              generic parameters bound to real types.
+              For interface proxies, this will point to the <see cref="T:System.Reflection.MethodInfo"/> on the target class.
+            </summary>
+            <returns>The concrete instantiation of <see cref="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget"/>, or
+              <see cref="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget"/> if not a generic method.</returns>
+            <remarks>
+              In debug builds this can be slower than calling <see cref="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget"/>.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.Proceed">
+            <summary>
+              Proceeds the call to the next interceptor in line, and ultimately to the target method.
+            </summary>
+            <remarks>
+              Since interface proxies without a target don't have the target implementation to proceed to,
+              it is important, that the last interceptor does not call this method, otherwise a
+              <see cref="T:System.NotImplementedException"/> will be thrown.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.SetArgumentValue(System.Int32,System.Object)">
+            <summary>
+              Overrides the value of an argument at the given <paramref name="index"/> with the
+              new <paramref name="value"/> provided.
+            </summary>
+            <remarks>
+              This method accepts an <see cref="T:System.Object"/>, however the value provided must be compatible
+              with the type of the argument defined on the method, otherwise an exception will be thrown.
+            </remarks>
+            <param name="index">The index of the argument to override.</param>
+            <param name="value">The new value for the argument.</param>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.Arguments">
+            <summary>
+              Gets the arguments that the <see cref="P:Castle.DynamicProxy.IInvocation.Method"/> has been invoked with.
+            </summary>
+            <value>The arguments the method was invoked with.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.GenericArguments">
+            <summary>
+              Gets the generic arguments of the method.
+            </summary>
+            <value>The generic arguments, or null if not a generic method.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.InvocationTarget">
+            <summary>
+              Gets the object on which the invocation is performed. This is different from proxy object
+              because most of the time this will be the proxy target object.
+            </summary>
+            <seealso cref="T:Castle.DynamicProxy.IChangeProxyTarget"/>
+            <value>The invocation target.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.Method">
+            <summary>
+              Gets the <see cref="T:System.Reflection.MethodInfo"/> representing the method being invoked on the proxy.
+            </summary>
+            <value>The <see cref="T:System.Reflection.MethodInfo"/> representing the method being invoked.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget">
+            <summary>
+              For interface proxies, this will point to the <see cref="T:System.Reflection.MethodInfo"/> on the target class.
+            </summary>
+            <value>The method invocation target.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.Proxy">
+            <summary>
+              Gets the proxy object on which the intercepted method is invoked.
+            </summary>
+            <value>Proxy object on which the intercepted method is invoked.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.ReturnValue">
+            <summary>
+              Gets or sets the return value of the method.
+            </summary>
+            <value>The return value of the method.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.TargetType">
+            <summary>
+              Gets the type of the target object for the intercepted method.
+            </summary>
+            <value>The type of the target object.</value>
+        </member>
+        <member name="T:Castle.DynamicProxy.IProxyGenerationHook">
+            <summary>
+              Used during the target type inspection process. Implementors have a chance to customize the
+              proxy generation process.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyGenerationHook.MethodsInspected">
+            <summary>
+              Invoked by the generation process to notify that the whole process has completed.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyGenerationHook.NonProxyableMemberNotification(System.Type,System.Reflection.MemberInfo)">
+            <summary>
+              Invoked by the generation process to notify that a member was not marked as virtual.
+            </summary>
+            <param name = "type">The type which declares the non-virtual member.</param>
+            <param name = "memberInfo">The non-virtual member.</param>
+            <remarks>
+              This method gives an opportunity to inspect any non-proxyable member of a type that has 
+              been requested to be proxied, and if appropriate - throw an exception to notify the caller.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyGenerationHook.ShouldInterceptMethod(System.Type,System.Reflection.MethodInfo)">
+            <summary>
+              Invoked by the generation process to determine if the specified method should be proxied.
+            </summary>
+            <param name = "type">The type which declares the given method.</param>
+            <param name = "methodInfo">The method to inspect.</param>
+            <returns>True if the given method should be proxied; false otherwise.</returns>
+        </member>
+        <member name="T:Castle.DynamicProxy.Contributors.ITypeContributor">
+            <summary>
+              Interface describing elements composing generated type
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Contributors.MembersCollector.AcceptMethod(System.Reflection.MethodInfo,System.Boolean,Castle.DynamicProxy.IProxyGenerationHook)">
+            <summary>
+              Performs some basic screening and invokes the <see cref="T:Castle.DynamicProxy.IProxyGenerationHook"/>
+              to select methods.
+            </summary>
+            <param name="method"></param>
+            <param name="onlyVirtuals"></param>
+            <param name="hook"></param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.DynamicProxy.IAttributeDisassembler">
+            <summary>
+              Provides functionality for disassembling instances of attributes to CustomAttributeBuilder form, during the process of emiting new types by Dynamic Proxy.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IAttributeDisassembler.Disassemble(System.Attribute)">
+            <summary>
+              Disassembles given attribute instance back to corresponding CustomAttributeBuilder.
+            </summary>
+            <param name="attribute">An instance of attribute to disassemble</param>
+            <returns><see cref="T:System.Reflection.Emit.CustomAttributeBuilder"/> corresponding 1 to 1 to given attribute instance, or null reference.</returns>
+            <remarks>
+              Implementers should return <see cref="T:System.Reflection.Emit.CustomAttributeBuilder"/> that corresponds to given attribute instance 1 to 1,
+              that is after calling specified constructor with specified arguments, and setting specified properties and fields with values specified
+              we should be able to get an attribute instance identical to the one passed in <paramref name="attribute"/>. Implementer can return null
+              if it wishes to opt out of replicating the attribute. Notice however, that for some cases, like attributes passed explicitly by the user
+              it is illegal to return null, and doing so will result in exception.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.AttributeDisassembler.HandleError(System.Type,System.Exception)">
+            <summary>
+              Handles error during disassembly process
+            </summary>
+            <param name = "attributeType">Type of the attribute being disassembled</param>
+            <param name = "exception">Exception thrown during the process</param>
+            <returns>usually null, or (re)throws the exception</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.AttributeDisassembler.InitializeConstructorArgs(System.Type,System.Attribute,System.Reflection.ParameterInfo[])">
+            <summary>
+              Here we try to match a constructor argument to its value.
+              Since we can't get the values from the assembly, we use some heuristics to get it.
+              a/ we first try to match all the properties on the attributes by name (case insensitive) to the argument
+              b/ if we fail we try to match them by property type, with some smarts about convertions (i,e: can use Guid for string).
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.AttributeDisassembler.ReplaceIfBetterMatch(System.Reflection.ParameterInfo,System.Reflection.PropertyInfo,System.Reflection.PropertyInfo)">
+            <summary>
+              We have the following rules here.
+              Try to find a matching type, failing that, if the parameter is string, get the first property (under the assumption that
+              we can convert it.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.AttributeDisassembler.ConvertValue(System.Object,System.Type)">
+            <summary>
+              Attributes can only accept simple types, so we return null for null,
+              if the value is passed as string we call to string (should help with converting), 
+              otherwise, we use the value as is (enums, integer, etc).
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.TypeUtil.GetAllInterfaces(System.Type[])">
+            <summary>
+              Returns list of all unique interfaces implemented given types, including their base interfaces.
+            </summary>
+            <param name="types"> </param>
+            <returns> </returns>
+        </member>
+        <member name="T:Castle.DynamicProxy.Serialization.CacheMappingsAttribute">
+            <summary>
+              Applied to the assemblies saved by <see cref="T:Castle.DynamicProxy.ModuleScope"/> in order to persist the cache data included in the persisted assembly.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.BaseProxyGenerator">
+            <summary>
+              Base class that exposes the common functionalities
+              to proxy generation.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.BaseProxyGenerator.AddMappingNoCheck(System.Type,Castle.DynamicProxy.Contributors.ITypeContributor,System.Collections.Generic.IDictionary{System.Type,Castle.DynamicProxy.Contributors.ITypeContributor})">
+            <summary>
+              It is safe to add mapping (no mapping for the interface exists)
+            </summary>
+            <param name = "implementer"></param>
+            <param name = "interface"></param>
+            <param name = "mapping"></param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.BaseProxyGenerator.GenerateParameterlessConstructor(Castle.DynamicProxy.Generators.Emitters.ClassEmitter,System.Type,Castle.DynamicProxy.Generators.Emitters.SimpleAST.FieldReference)">
+            <summary>
+              Generates a parameters constructor that initializes the proxy
+              state with <see cref="T:Castle.DynamicProxy.StandardInterceptor"/> just to make it non-null.
+              <para>
+                This constructor is important to allow proxies to be XML serializable
+              </para>
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.InvocationTypeGenerator.GetBaseCtorArguments(System.Type,Castle.DynamicProxy.ProxyGenerationOptions,System.Reflection.ConstructorInfo@)">
+            <summary>
+              Generates the constructor for the class that extends
+              <see cref="T:Castle.DynamicProxy.AbstractInvocation"/>
+            </summary>
+            <param name="targetFieldType"></param>
+            <param name="proxyGenerationOptions"></param>
+            <param name="baseConstructor"></param>
+        </member>
+        <member name="T:Castle.DynamicProxy.DefaultProxyBuilder">
+            <summary>
+              Default implementation of <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> interface producing in-memory proxy assemblies.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.IProxyBuilder">
+            <summary>
+              Abstracts the implementation of proxy type construction.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyBuilder.CreateClassProxyType(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates a proxy type for given <paramref name="classToProxy"/>, implementing <paramref name="additionalInterfacesToProxy"/>, using <paramref name="options"/> provided.
+            </summary>
+            <param name="classToProxy">The class type to proxy.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types to proxy.</param>
+            <param name="options">The proxy generation options.</param>
+            <returns>The generated proxy type.</returns>
+            <remarks>
+              Implementers should return a proxy type for the specified class and interfaces.
+              Additional interfaces should be only 'mark' interfaces, that is, they should work like interface proxy without target. (See <see cref="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)"/> method.)
+            </remarks>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is not public.
+              Note that to avoid this exception, you can mark offending type internal, and define <see cref="T:System.Runtime.CompilerServices.InternalsVisibleToAttribute"/> 
+              pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate.</exception>
+            <seealso cref="T:Castle.DynamicProxy.Generators.ClassProxyGenerator"/>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithTarget(System.Type,System.Type[],System.Type,Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates a proxy type that proxies calls to <paramref name="interfaceToProxy"/> members on <paramref name="targetType"/>, implementing <paramref name="additionalInterfacesToProxy"/>, using <paramref name="options"/> provided.
+            </summary>
+            <param name="interfaceToProxy">The interface type to proxy.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types to proxy.</param>
+            <param name="targetType">Type implementing <paramref name="interfaceToProxy"/> on which calls to the interface members should be intercepted.</param>
+            <param name="options">The proxy generation options.</param>
+            <returns>The generated proxy type.</returns>
+            <remarks>
+              Implementers should return a proxy type for the specified interface that 'proceeds' executions to the specified target.
+              Additional interfaces should be only 'mark' interfaces, that is, they should work like interface proxy without target. (See <see cref="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)"/> method.)
+            </remarks>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is not public.
+              Note that to avoid this exception, you can mark offending type internal, and define <see cref="T:System.Runtime.CompilerServices.InternalsVisibleToAttribute"/> 
+              pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate.</exception>
+            <seealso cref="T:Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator"/>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithTargetInterface(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates a proxy type for given <paramref name="interfaceToProxy"/> and <parmaref name="additionalInterfacesToProxy"/> that delegates all calls to the provided interceptors and allows interceptors to switch the actual target of invocation.
+            </summary>
+            <param name="interfaceToProxy">The interface type to proxy.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types to proxy.</param>
+            <param name="options">The proxy generation options.</param>
+            <returns>The generated proxy type.</returns>
+            <remarks>
+              Implementers should return a proxy type for the specified interface(s) that delegate all executions to the specified interceptors
+              and uses an instance of the interface as their targets (i.e. <see cref="P:Castle.DynamicProxy.IInvocation.InvocationTarget"/>), rather than a class. All <see cref="T:Castle.DynamicProxy.IInvocation"/> classes should then implement <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface,
+              to allow interceptors to switch invocation target with instance of another type implementing called interface.
+            </remarks>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is not public.
+              Note that to avoid this exception, you can mark offending type internal, and define <see cref="T:System.Runtime.CompilerServices.InternalsVisibleToAttribute"/> 
+              pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate.</exception>
+            <seealso cref="T:Castle.DynamicProxy.Generators.InterfaceProxyWithTargetInterfaceGenerator"/>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates a proxy type for given <paramref name="interfaceToProxy"/> that delegates all calls to the provided interceptors.
+            </summary>
+            <param name="interfaceToProxy">The interface type to proxy.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types to proxy.</param>
+            <param name="options">The proxy generation options.</param>
+            <returns>The generated proxy type.</returns>
+            <remarks>
+              Implementers should return a proxy type for the specified interface and additional interfaces that delegate all executions to the specified interceptors.
+            </remarks>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is not public.
+              Note that to avoid this exception, you can mark offending type internal, and define <see cref="T:System.Runtime.CompilerServices.InternalsVisibleToAttribute"/> 
+              pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate.</exception>
+            <seealso cref="T:Castle.DynamicProxy.Generators.InterfaceProxyWithoutTargetGenerator"/>
+        </member>
+        <member name="P:Castle.DynamicProxy.IProxyBuilder.Logger">
+            <summary>
+              Gets or sets the <see cref="T:Castle.Core.Logging.ILogger"/> that this <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> logs to.
+            </summary>
+        </member>
+        <member name="P:Castle.DynamicProxy.IProxyBuilder.ModuleScope">
+            <summary>
+              Gets the <see cref="P:Castle.DynamicProxy.IProxyBuilder.ModuleScope"/> associated with this builder.
+            </summary>
+            <value>The module scope associated with this builder.</value>
+        </member>
+        <member name="M:Castle.DynamicProxy.DefaultProxyBuilder.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.DefaultProxyBuilder"/> class with new <see cref="P:Castle.DynamicProxy.DefaultProxyBuilder.ModuleScope"/>.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.DefaultProxyBuilder.#ctor(Castle.DynamicProxy.ModuleScope)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.DefaultProxyBuilder"/> class.
+            </summary>
+            <param name="scope">The module scope for generated proxy types.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.AttributeUtil.AddDisassembler``1(Castle.DynamicProxy.IAttributeDisassembler)">
+            <summary>
+              Registers custom disassembler to handle disassembly of specified type of attributes.
+            </summary>
+            <typeparam name="TAttribute">Type of attributes to handle</typeparam>
+            <param name="disassembler">Disassembler converting existing instances of Attributes to CustomAttributeBuilders</param>
+            <remarks>
+              When disassembling an attribute Dynamic Proxy will first check if an custom disassembler has been registered to handle attributes of that type, 
+              and if none is found, it'll use the <see cref="P:Castle.DynamicProxy.Internal.AttributeUtil.FallbackDisassembler"/>.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.AttributeUtil.ShouldSkipAttributeReplication(System.Type)">
+            <summary>
+              Attributes should be replicated if they are non-inheritable,
+              but there are some special cases where the attributes means
+              something to the CLR, where they should be skipped.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.CacheKey.#ctor(System.Reflection.MemberInfo,System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.Generators.CacheKey"/> class.
+            </summary>
+            <param name="target">Target element. This is either target type or target method for invocation types.</param>
+            <param name="type">The type of the proxy. This is base type for invocation types.</param>
+            <param name="interfaces">The interfaces.</param>
+            <param name="options">The options.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.CacheKey.#ctor(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.Generators.CacheKey"/> class.
+            </summary>
+            <param name="target">Type of the target.</param>
+            <param name="interfaces">The interfaces.</param>
+            <param name="options">The options.</param>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.LdcOpCodesDictionary">
+            <summary>
+              s
+              Provides appropriate Ldc.X opcode for the type of primitive value to be loaded.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.LdindOpCodesDictionary">
+            <summary>
+              Provides appropriate Ldind.X opcode for 
+              the type of primitive value to be loaded indirectly.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.Emitters.OpCodeUtil.EmitLoadIndirectOpCodeForType(System.Reflection.Emit.ILGenerator,System.Type)">
+            <summary>
+              Emits a load indirect opcode of the appropriate type for a value or object reference.
+              Pops a pointer off the evaluation stack, dereferences it and loads
+              a value of the specified type.
+            </summary>
+            <param name = "gen"></param>
+            <param name = "type"></param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.Emitters.OpCodeUtil.EmitLoadOpCodeForConstantValue(System.Reflection.Emit.ILGenerator,System.Object)">
+            <summary>
+              Emits a load opcode of the appropriate kind for a constant string or
+              primitive value.
+            </summary>
+            <param name = "gen"></param>
+            <param name = "value"></param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.Emitters.OpCodeUtil.EmitLoadOpCodeForDefaultValueOfType(System.Reflection.Emit.ILGenerator,System.Type)">
+            <summary>
+              Emits a load opcode of the appropriate kind for the constant default value of a
+              type, such as 0 for value types and null for reference types.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.Emitters.OpCodeUtil.EmitStoreIndirectOpCodeForType(System.Reflection.Emit.ILGenerator,System.Type)">
+            <summary>
+              Emits a store indirectopcode of the appropriate type for a value or object reference.
+              Pops a value of the specified type and a pointer off the evaluation stack, and
+              stores the value.
+            </summary>
+            <param name = "gen"></param>
+            <param name = "type"></param>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.PropertiesCollection">
+            <summary>
+              Summary description for PropertiesCollection.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.SimpleAST.IndirectReference">
+            <summary>
+              Wraps a reference that is passed 
+              ByRef and provides indirect load/store support.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.SimpleAST.NewArrayExpression">
+            <summary>
+              Summary description for NewArrayExpression.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.SimpleAST.ReferencesToObjectArrayExpression">
+            <summary>
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.StindOpCodesDictionary">
+            <summary>
+              Provides appropriate Stind.X opcode 
+              for the type of primitive value to be stored indirectly.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.MetaEvent.#ctor(System.String,System.Type,System.Type,Castle.DynamicProxy.Generators.MetaMethod,Castle.DynamicProxy.Generators.MetaMethod,System.Reflection.EventAttributes)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.Generators.MetaEvent"/> class.
+            </summary>
+            <param name="name">The name.</param>
+            <param name="declaringType">Type declaring the original event being overriten, or null.</param>
+            <param name="eventDelegateType"></param>
+            <param name="adder">The add method.</param>
+            <param name="remover">The remove method.</param>
+            <param name="attributes">The attributes.</param>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.INamingScope">
+            <summary>
+              Represents the scope of uniquenes of names for types and their members
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.INamingScope.GetUniqueName(System.String)">
+            <summary>
+              Gets a unique name based on <paramref name="suggestedName"/>
+            </summary>
+            <param name="suggestedName">Name suggested by the caller</param>
+            <returns>Unique name based on <paramref name="suggestedName"/>.</returns>
+            <remarks>
+              Implementers should provide name as closely resembling <paramref name="suggestedName"/> as possible.
+              Generally if no collision occurs it is suggested to return suggested name, otherwise append sequential suffix.
+              Implementers must return deterministic names, that is when <see cref="M:Castle.DynamicProxy.Generators.INamingScope.GetUniqueName(System.String)"/> is called twice 
+              with the same suggested name, the same returned name should be provided each time. Non-deterministic return
+              values, like appending random suffices will break serialization of proxies.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.INamingScope.SafeSubScope">
+            <summary>
+              Returns new, disposable naming scope. It is responsibilty of the caller to make sure that no naming collision
+              with enclosing scope, or other subscopes is possible.
+            </summary>
+            <returns>New naming scope.</returns>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.MethodFinder">
+            <summary>
+              Returns the methods implemented by a type. Use this instead of Type.GetMethods() to work around a CLR issue
+              where duplicate MethodInfos are returned by Type.GetMethods() after a token of a generic type's method was loaded.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.InternalsUtil.IsInternal(System.Reflection.MethodBase)">
+            <summary>
+              Determines whether the specified method is internal.
+            </summary>
+            <param name = "method">The method.</param>
+            <returns>
+              <c>true</c> if the specified method is internal; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.InternalsUtil.IsInternalToDynamicProxy(System.Reflection.Assembly)">
+            <summary>
+              Determines whether this assembly has internals visible to dynamic proxy.
+            </summary>
+            <param name = "asm">The assembly to inspect.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.InternalsUtil.IsAccessible(System.Reflection.MethodBase)">
+            <summary>
+              Checks if the method is public or protected.
+            </summary>
+            <param name = "method"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.MixinData.#ctor(System.Collections.Generic.IEnumerable{System.Object})">
+            <summary>
+              Because we need to cache the types based on the mixed in mixins, we do the following here:
+              - Get all the mixin interfaces
+              - Sort them by full name
+              - Return them by position
+            
+            The idea is to have reproducible behavior for the case that mixins are registered in different orders.
+            This method is here because it is required 
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.ModuleScope">
+            <summary>
+              Summary description for ModuleScope.
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.ModuleScope.DEFAULT_FILE_NAME">
+            <summary>
+              The default file name used when the assembly is saved using <see cref="F:Castle.DynamicProxy.ModuleScope.DEFAULT_FILE_NAME"/>.
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.ModuleScope.DEFAULT_ASSEMBLY_NAME">
+            <summary>
+              The default assembly (simple) name used for the assemblies generated by a <see cref="T:Castle.DynamicProxy.ModuleScope"/> instance.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class; assemblies created by this instance will not be saved.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor(System.Boolean)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class, allowing to specify whether the assemblies generated by this instance
+              should be saved.
+            </summary>
+            <param name="savePhysicalAssembly">If set to <c>true</c> saves the generated module.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor(System.Boolean,System.Boolean)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class, allowing to specify whether the assemblies generated by this instance
+              should be saved.
+            </summary>
+            <param name="savePhysicalAssembly">If set to <c>true</c> saves the generated module.</param>
+            <param name="disableSignedModule">If set to <c>true</c> disables ability to generate signed module. This should be used in cases where ran under constrained permissions.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor(System.Boolean,System.Boolean,System.String,System.String,System.String,System.String)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class, allowing to specify whether the assemblies generated by this instance
+              should be saved and what simple names are to be assigned to them.
+            </summary>
+            <param name="savePhysicalAssembly">If set to <c>true</c> saves the generated module.</param>
+            <param name="disableSignedModule">If set to <c>true</c> disables ability to generate signed module. This should be used in cases where ran under constrained permissions.</param>
+            <param name="strongAssemblyName">The simple name of the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="strongModulePath">The path and file name of the manifest module of the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="weakAssemblyName">The simple name of the weak-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="weakModulePath">The path and file name of the manifest module of the weak-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor(System.Boolean,System.Boolean,Castle.DynamicProxy.Generators.INamingScope,System.String,System.String,System.String,System.String)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class, allowing to specify whether the assemblies generated by this instance
+              should be saved and what simple names are to be assigned to them.
+            </summary>
+            <param name="savePhysicalAssembly">If set to <c>true</c> saves the generated module.</param>
+            <param name="disableSignedModule">If set to <c>true</c> disables ability to generate signed module. This should be used in cases where ran under constrained permissions.</param>
+            <param name="namingScope">Naming scope used to provide unique names to generated types and their members (usually via sub-scopes).</param>
+            <param name="strongAssemblyName">The simple name of the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="strongModulePath">The path and file name of the manifest module of the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="weakAssemblyName">The simple name of the weak-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="weakModulePath">The path and file name of the manifest module of the weak-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.GetFromCache(Castle.DynamicProxy.Generators.CacheKey)">
+            <summary>
+              Returns a type from this scope's type cache, or null if the key cannot be found.
+            </summary>
+            <param name = "key">The key to be looked up in the cache.</param>
+            <returns>The type from this scope's type cache matching the key, or null if the key cannot be found</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.RegisterInCache(Castle.DynamicProxy.Generators.CacheKey,System.Type)">
+            <summary>
+              Registers a type in this scope's type cache.
+            </summary>
+            <param name = "key">The key to be associated with the type.</param>
+            <param name = "type">The type to be stored in the cache.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.GetKeyPair">
+            <summary>
+              Gets the key pair used to sign the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.ObtainDynamicModule(System.Boolean)">
+            <summary>
+              Gets the specified module generated by this scope, creating a new one if none has yet been generated.
+            </summary>
+            <param name = "isStrongNamed">If set to true, a strong-named module is returned; otherwise, a weak-named module is returned.</param>
+            <returns>A strong-named or weak-named module generated by this scope, as specified by the <paramref
+               name = "isStrongNamed" /> parameter.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.ObtainDynamicModuleWithStrongName">
+            <summary>
+              Gets the strong-named module generated by this scope, creating a new one if none has yet been generated.
+            </summary>
+            <returns>A strong-named module generated by this scope.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.ObtainDynamicModuleWithWeakName">
+            <summary>
+              Gets the weak-named module generated by this scope, creating a new one if none has yet been generated.
+            </summary>
+            <returns>A weak-named module generated by this scope.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.SaveAssembly">
+            <summary>
+              Saves the generated assembly with the name and directory information given when this <see cref="T:Castle.DynamicProxy.ModuleScope"/> instance was created (or with
+              the <see cref="F:Castle.DynamicProxy.ModuleScope.DEFAULT_FILE_NAME"/> and current directory if none was given).
+            </summary>
+            <remarks>
+              <para>
+                This method stores the generated assembly in the directory passed as part of the module information specified when this instance was
+                constructed (if any, else the current directory is used). If both a strong-named and a weak-named assembly
+                have been generated, it will throw an exception; in this case, use the <see cref="M:Castle.DynamicProxy.ModuleScope.SaveAssembly(System.Boolean)"/> overload.
+              </para>
+              <para>
+                If this <see cref="T:Castle.DynamicProxy.ModuleScope"/> was created without indicating that the assembly should be saved, this method does nothing.
+              </para>
+            </remarks>
+            <exception cref="T:System.InvalidOperationException">Both a strong-named and a weak-named assembly have been generated.</exception>
+            <returns>The path of the generated assembly file, or null if no file has been generated.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.SaveAssembly(System.Boolean)">
+            <summary>
+              Saves the specified generated assembly with the name and directory information given when this <see cref="T:Castle.DynamicProxy.ModuleScope"/> instance was created
+              (or with the <see cref="F:Castle.DynamicProxy.ModuleScope.DEFAULT_FILE_NAME"/> and current directory if none was given).
+            </summary>
+            <param name="strongNamed">True if the generated assembly with a strong name should be saved (see <see cref="P:Castle.DynamicProxy.ModuleScope.StrongNamedModule"/>);
+              false if the generated assembly without a strong name should be saved (see <see cref="P:Castle.DynamicProxy.ModuleScope.WeakNamedModule"/>.</param>
+            <remarks>
+              <para>
+                This method stores the specified generated assembly in the directory passed as part of the module information specified when this instance was
+                constructed (if any, else the current directory is used).
+              </para>
+              <para>
+                If this <see cref="T:Castle.DynamicProxy.ModuleScope"/> was created without indicating that the assembly should be saved, this method does nothing.
+              </para>
+            </remarks>
+            <exception cref="T:System.InvalidOperationException">No assembly has been generated that matches the <paramref name="strongNamed"/> parameter.
+            </exception>
+            <returns>The path of the generated assembly file, or null if no file has been generated.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.LoadAssemblyIntoCache(System.Reflection.Assembly)">
+            <summary>
+              Loads the generated types from the given assembly into this <see cref="T:Castle.DynamicProxy.ModuleScope"/>'s cache.
+            </summary>
+            <param name="assembly">The assembly to load types from. This assembly must have been saved via <see cref="M:Castle.DynamicProxy.ModuleScope.SaveAssembly(System.Boolean)"/> or
+              <see cref="M:Castle.DynamicProxy.ModuleScope.SaveAssembly"/>, or it must have the <see cref="T:Castle.DynamicProxy.Serialization.CacheMappingsAttribute"/> manually applied.</param>
+            <remarks>
+              This method can be used to load previously generated and persisted proxy types from disk into this scope's type cache, eg. in order
+              to avoid the performance hit associated with proxy generation.
+            </remarks>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.Lock">
+            <summary>
+              Users of this <see cref="T:Castle.DynamicProxy.ModuleScope"/> should use this lock when accessing the cache.
+            </summary>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.StrongNamedModule">
+            <summary>
+              Gets the strong-named module generated by this scope, or <see langword = "null" /> if none has yet been generated.
+            </summary>
+            <value>The strong-named module generated by this scope, or <see langword = "null" /> if none has yet been generated.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.StrongNamedModuleName">
+            <summary>
+              Gets the file name of the strongly named module generated by this scope.
+            </summary>
+            <value>The file name of the strongly named module generated by this scope.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.StrongNamedModuleDirectory">
+            <summary>
+              Gets the directory where the strongly named module generated by this scope will be saved, or <see langword="null"/> if the current directory
+              is used.
+            </summary>
+            <value>The directory where the strongly named module generated by this scope will be saved when <see cref="M:Castle.DynamicProxy.ModuleScope.SaveAssembly"/> is called
+              (if this scope was created to save modules).</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.WeakNamedModule">
+            <summary>
+              Gets the weak-named module generated by this scope, or <see langword = "null" /> if none has yet been generated.
+            </summary>
+            <value>The weak-named module generated by this scope, or <see langword = "null" /> if none has yet been generated.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.WeakNamedModuleName">
+            <summary>
+              Gets the file name of the weakly named module generated by this scope.
+            </summary>
+            <value>The file name of the weakly named module generated by this scope.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.WeakNamedModuleDirectory">
+            <summary>
+              Gets the directory where the weakly named module generated by this scope will be saved, or <see langword="null"/> if the current directory
+              is used.
+            </summary>
+            <value>The directory where the weakly named module generated by this scope will be saved when <see cref="M:Castle.DynamicProxy.ModuleScope.SaveAssembly"/> is called
+              (if this scope was created to save modules).</value>
+        </member>
+        <member name="T:Castle.DynamicProxy.PersistentProxyBuilder">
+            <summary>
+              ProxyBuilder that persists the generated type.
+            </summary>
+            <remarks>
+              The saved assembly contains just the last generated type.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.PersistentProxyBuilder.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.PersistentProxyBuilder"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.PersistentProxyBuilder.SaveAssembly">
+            <summary>
+              Saves the generated assembly to a physical file. Note that this renders the <see cref="T:Castle.DynamicProxy.PersistentProxyBuilder"/> unusable.
+            </summary>
+            <returns>The path of the generated assembly file, or null if no assembly has been generated.</returns>
+            <remarks>
+              This method does not support saving multiple files. If both a signed and an unsigned module have been generated, use the 
+              respective methods of the <see cref="T:Castle.DynamicProxy.ModuleScope"/>.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerationOptions.#ctor(Castle.DynamicProxy.IProxyGenerationHook)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerationOptions"/> class.
+            </summary>
+            <param name="hook">The hook.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerationOptions.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerationOptions"/> class.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.ProxyGenerator">
+            <summary>
+              Provides proxy objects for classes and interfaces.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.#ctor(Castle.DynamicProxy.IProxyBuilder)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> class.
+            </summary>
+            <param name="builder">Proxy types builder.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.#ctor(System.Boolean)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> class.
+            </summary>
+            <param name="disableSignedModule">If <c>true</c> forces all types to be generated into an unsigned module.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget``1(``0,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface implemented by <paramref name="target"/> which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>Object proxying calls to members of <typeparamref name="TInterface"/> on <paramref name="target"/> object.</returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/>is not an interface type.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface``1(``0,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget``1(``0,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface implemented by <paramref name="target"/> which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/>is not an interface type.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface``1(``0,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Object,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types  on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Type[],System.Object,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface``1(``0,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface implemented by <paramref name="target"/> which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> type on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface``1(``0,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface implemented by <paramref name="target"/> which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> type on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Type[],System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget``1(Castle.DynamicProxy.IInterceptor)">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on target object generated at runtime with given <paramref name="interceptor"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface which will be proxied.</typeparam>
+            <param name="interceptor">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptor"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              As a result of that also at least one <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementation must be provided.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget``1(Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface which will be proxied.</typeparam>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              As a result of that also at least one <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementation must be provided.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget``1(Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface which will be proxied.</typeparam>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              As a result of that also at least one <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementation must be provided.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,Castle.DynamicProxy.IInterceptor)">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptor"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="interceptor">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptor"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/>  is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of <paramref name="additionalInterfacesToProxy"/> to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget``1(``0,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <typeparamref name="TClass"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TClass">Type of class which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <typeparamref name="TClass"/> proxying calls to virtual members of <typeparamref name="TClass"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TClass"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <typeparamref name="TClass"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <typeparamref name="TClass"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget``1(``0,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <typeparamref name="TClass"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TClass">Type of class which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <typeparamref name="TClass"/> proxying calls to virtual members of <typeparamref name="TClass"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TClass"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <typeparamref name="TClass"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <typeparamref name="TClass"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Object,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no parameterless constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy``1(Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <typeparamref name="TClass"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TClass">Type of class which will be proxied.</typeparam>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <typeparamref name="TClass"/> proxying calls to virtual members of <typeparamref name="TClass"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TClass"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <typeparamref name="TClass"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <typeparamref name="TClass"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy``1(Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <typeparamref name="TClass"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TClass">Type of class which will be proxied.</typeparam>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <typeparamref name="TClass"/> proxying calls to virtual members of <typeparamref name="TClass"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TClass"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <typeparamref name="TClass"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <typeparamref name="TClass"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,System.Type[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,Castle.DynamicProxy.ProxyGenerationOptions,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no parameterless constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyType(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates the proxy type for class proxy with given <paramref name="classToProxy"/> class, implementing given <paramref name="additionalInterfacesToProxy"/> and using provided <paramref name="options"/>.
+            </summary>
+            <param name="classToProxy">The base class for proxy type.</param>
+            <param name="additionalInterfacesToProxy">The interfaces that proxy type should implement.</param>
+            <param name="options">The options for proxy generation process.</param>
+            <returns><see cref="T:System.Type"/> of proxy.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyTypeWithTarget(System.Type,System.Type[],System.Type,Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates the proxy type for interface proxy with target for given <paramref name="interfaceToProxy"/> interface, implementing given <paramref name="additionalInterfacesToProxy"/> on given <paramref name="targetType"/> and using provided <paramref name="options"/>.
+            </summary>
+            <param name="interfaceToProxy">The interface proxy type should implement.</param>
+            <param name="additionalInterfacesToProxy">The additional interfaces proxy type should implement.</param>
+            <param name="targetType">Actual type that the proxy type will encompass.</param>
+            <param name="options">The options for proxy generation process.</param>
+            <returns><see cref="T:System.Type"/> of proxy.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyTypeWithTargetInterface(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates the proxy type for interface proxy with target interface for given <paramref name="interfaceToProxy"/> interface, implementing given <paramref name="additionalInterfacesToProxy"/> on given <paramref name="interfaceToProxy"/> and using provided <paramref name="options"/>.
+            </summary>
+            <param name="interfaceToProxy">The interface proxy type should implement.</param>
+            <param name="additionalInterfacesToProxy">The additional interfaces proxy type should implement.</param>
+            <param name="options">The options for proxy generation process.</param>
+            <returns><see cref="T:System.Type"/> of proxy.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyTypeWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates the proxy type for interface proxy without target for given <paramref name="interfaceToProxy"/> interface, implementing given <paramref name="additionalInterfacesToProxy"/> and using provided <paramref name="options"/>.
+            </summary>
+            <param name="interfaceToProxy">The interface proxy type should implement.</param>
+            <param name="additionalInterfacesToProxy">The additional interfaces proxy type should implement.</param>
+            <param name="options">The options for proxy generation process.</param>
+            <returns><see cref="T:System.Type"/> of proxy.</returns>
+        </member>
+        <member name="P:Castle.DynamicProxy.ProxyGenerator.Logger">
+            <summary>
+              Gets or sets the <see cref="T:Castle.Core.Logging.ILogger"/> that this <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> log to.
+            </summary>
+        </member>
+        <member name="P:Castle.DynamicProxy.ProxyGenerator.ProxyBuilder">
+            <summary>
+              Gets the proxy builder instance used to generate proxy types.
+            </summary>
+            <value>The proxy builder.</value>
+        </member>
+        <member name="M:Castle.DynamicProxy.Serialization.RemotableInvocation.Proceed">
+            <summary>
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="P:Castle.DynamicProxy.Serialization.RemotableInvocation.Method">
+            <summary>
+            </summary>
+        </member>
+        <member name="P:Castle.DynamicProxy.Serialization.RemotableInvocation.MethodInvocationTarget">
+            <summary>
+              For interface proxies, this will point to the
+              <see cref="T:System.Reflection.MethodInfo"/> on the target class
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Serialization.ProxyObjectReference">
+            <summary>
+              Handles the deserialization of proxies.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Serialization.ProxyObjectReference.ResetScope">
+            <summary>
+              Resets the <see cref="P:Castle.DynamicProxy.Serialization.ProxyObjectReference.ModuleScope"/> used for deserialization to a new scope.
+            </summary>
+            <remarks>
+              This is useful for test cases.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.Serialization.ProxyObjectReference.SetScope(Castle.DynamicProxy.ModuleScope)">
+            <summary>
+              Resets the <see cref="P:Castle.DynamicProxy.Serialization.ProxyObjectReference.ModuleScope"/> used for deserialization to a given <paramref name="scope"/>.
+            </summary>
+            <param name="scope"> The scope to be used for deserialization. </param>
+            <remarks>
+              By default, the deserialization process uses a different scope than the rest of the application, which can lead to multiple proxies
+              being generated for the same type. By explicitly setting the deserialization scope to the application's scope, this can be avoided.
+            </remarks>
+        </member>
+        <member name="P:Castle.DynamicProxy.Serialization.ProxyObjectReference.ModuleScope">
+            <summary>
+              Gets the <see cref="P:Castle.DynamicProxy.Serialization.ProxyObjectReference.ModuleScope"/> used for deserialization.
+            </summary>
+            <value> As <see cref="T:Castle.DynamicProxy.Serialization.ProxyObjectReference"/> has no way of automatically determining the scope used by the application (and the application might use more than one scope at the same time), <see cref="T:Castle.DynamicProxy.Serialization.ProxyObjectReference"/> uses a dedicated scope instance for deserializing proxy types. This instance can be reset and set to a specific value via <see cref="M:Castle.DynamicProxy.Serialization.ProxyObjectReference.ResetScope"/> and <see cref="M:Castle.DynamicProxy.Serialization.ProxyObjectReference.SetScope(Castle.DynamicProxy.ModuleScope)"/> . </value>
+        </member>
+        <member name="T:Castle.DynamicProxy.Tokens.InvocationMethods">
+            <summary>
+              Holds <see cref="T:System.Reflection.MethodInfo"/> objects representing methods of <see cref="T:Castle.DynamicProxy.AbstractInvocation"/> class.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Tokens.SerializationInfoMethods">
+            <summary>
+              Holds <see cref="T:System.Reflection.MethodInfo"/> objects representing methods of <see cref="T:System.Runtime.Serialization.SerializationInfo"/> class.
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.Tokens.SerializationInfoMethods.AddValue_Bool">
+            <summary>
+              <see cref="M:System.Runtime.Serialization.SerializationInfo.AddValue(System.String,System.Boolean)"/>
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.Tokens.SerializationInfoMethods.AddValue_Int32">
+            <summary>
+              <see cref="M:System.Runtime.Serialization.SerializationInfo.AddValue(System.String,System.Int32)"/>
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.Tokens.SerializationInfoMethods.AddValue_Object">
+            <summary>
+              <see cref="M:System.Runtime.Serialization.SerializationInfo.AddValue(System.String,System.Object)"/>
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.Tokens.SerializationInfoMethods.GetValue">
+            <summary>
+              <see cref="M:System.Runtime.Serialization.SerializationInfo.GetValue(System.String,System.Type)"/>
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.Tokens.SerializationInfoMethods.SetType">
+            <summary>
+              <see cref="M:System.Runtime.Serialization.SerializationInfo.SetType(System.Type)"/>
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.IInterceptorSelector">
+            <summary>
+              Provides an extension point that allows proxies to choose specific interceptors on
+              a per method basis.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInterceptorSelector.SelectInterceptors(System.Type,System.Reflection.MethodInfo,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Selects the interceptors that should intercept calls to the given <paramref name="method"/>.
+            </summary>
+            <param name="type">The type declaring the method to intercept.</param>
+            <param name="method">The method that will be intercepted.</param>
+            <param name="interceptors">All interceptors registered with the proxy.</param>
+            <returns>An array of interceptors to invoke upon calling the <paramref name="method"/>.</returns>
+            <remarks>
+              This method is called only once per proxy instance, upon the first call to the
+              <paramref name="method"/>. Either an empty array or null are valid return values to indicate
+              that no interceptor should intercept calls to the method. Although it is not advised, it is
+              legal to return other <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations than these provided in
+              <paramref name="interceptors"/>.
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.Internal.Lock.Create">
+            <summary>
+            Creates a new lock.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.IServiceProviderExAccessor">
+            <summary>
+            This interface should be implemented by classes
+            that are available in a bigger context, exposing
+            the container to different areas in the same application.
+            <para>
+            For example, in Web application, the (global) HttpApplication
+            subclasses should implement this interface to expose 
+            the configured container
+            </para>
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.IChangeProxyTarget">
+            <summary>
+              Exposes means to change target objects of proxies and invocations
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IChangeProxyTarget.ChangeInvocationTarget(System.Object)">
+            <summary>
+              Changes the target object (<see cref="P:Castle.DynamicProxy.IInvocation.InvocationTarget"/>) of current <see cref="T:Castle.DynamicProxy.IInvocation"/>.
+            </summary>
+            <param name="target">The new value of target of invocation.</param>
+            <remarks>
+              Although the method takes <see cref="T:System.Object"/> the actual instance must be of type assignable to <see cref="P:Castle.DynamicProxy.IInvocation.TargetType"/>, otherwise an <see cref="T:System.InvalidCastException"/> will be thrown.
+              Also while it's technically legal to pass null reference (Nothing in Visual Basic) as <paramref name="target"/>, for obvious reasons Dynamic Proxy will not be able to call the intercepted method on such target.
+              In this case last interceptor in the pipeline mustn't call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/> or a <see cref="T:System.NotImplementedException"/> will be throws.
+              Also while it's technically legal to pass proxy itself as <paramref name="target"/>, this would create stack overflow.
+              In this case last interceptor in the pipeline mustn't call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/> or a <see cref="T:System.InvalidOperationException"/> will be throws.
+            </remarks>
+            <exception cref="T:System.InvalidCastException">Thrown when <paramref name="target"/> is not assignable to the proxied type.</exception>
+        </member>
+        <member name="M:Castle.DynamicProxy.IChangeProxyTarget.ChangeProxyTarget(System.Object)">
+            <summary>
+              Permanently changes the target object of the proxy. This does not affect target of the current invocation.
+            </summary>
+            <param name="target">The new value of target of the proxy.</param>
+            <remarks>
+              Although the method takes <see cref="T:System.Object"/> the actual instance must be of type assignable to proxy's target type, otherwise an <see cref="T:System.InvalidCastException"/> will be thrown.
+              Also while it's technically legal to pass null reference (Nothing in Visual Basic) as <paramref name="target"/>, for obvious reasons Dynamic Proxy will not be able to call the intercepted method on such target.
+              In this case last interceptor in the pipeline mustn't call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/> or a <see cref="T:System.NotImplementedException"/> will be throws.
+              Also while it's technically legal to pass proxy itself as <paramref name="target"/>, this would create stack overflow.
+              In this case last interceptor in the pipeline mustn't call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/> or a <see cref="T:System.InvalidOperationException"/> will be throws.
+            </remarks>
+            <exception cref="T:System.InvalidCastException">Thrown when <paramref name="target"/> is not assignable to the proxied type.</exception>
+        </member>
+        <member name="T:Castle.DynamicProxy.IInterceptor">
+            <summary>
+              New interface that is going to be used by DynamicProxy 2
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyTargetAccessor.DynProxyGetTarget">
+            <summary>
+              Get the proxy target (note that null is a valid target!)
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyTargetAccessor.GetInterceptors">
+            <summary>
+              Gets the interceptors for the proxy
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.IServiceEnabledComponent">
+            <summary>
+            Defines that the implementation wants a 
+            <see cref="T:System.IServiceProvider"/> in order to 
+            access other components. The creator must be aware
+            that the component might (or might not) implement 
+            the interface.
+            </summary>
+            <remarks>
+            Used by Castle Project components to, for example, 
+            gather logging factories
+            </remarks>
+        </member>
+        <member name="T:Castle.Core.IServiceProviderEx">
+            <summary>
+            Increments <c>IServiceProvider</c> with a generic service resolution operation.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.IExtendedLoggerFactory">
+            <summary>
+              Provides a factory that can produce either <see cref="T:Castle.Core.Logging.ILogger"/> or
+              <see cref="T:Castle.Core.Logging.IExtendedLogger"/> classes.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.ILoggerFactory">
+            <summary>
+              Manages the instantiation of <see cref="T:Castle.Core.Logging.ILogger"/>s.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ILoggerFactory.Create(System.Type)">
+            <summary>
+              Creates a new logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ILoggerFactory.Create(System.String)">
+            <summary>
+              Creates a new logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ILoggerFactory.Create(System.Type,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ILoggerFactory.Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.IExtendedLoggerFactory.Create(System.Type)">
+            <summary>
+              Creates a new extended logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.IExtendedLoggerFactory.Create(System.String)">
+            <summary>
+              Creates a new extended logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.IExtendedLoggerFactory.Create(System.Type,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new extended logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.IExtendedLoggerFactory.Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new extended logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Create(System.Type)">
+            <summary>
+              Creates a new extended logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Create(System.String)">
+            <summary>
+              Creates a new extended logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Create(System.Type,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new extended logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new extended logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Castle#Core#Logging#ILoggerFactory#Create(System.Type)">
+            <summary>
+              Creates a new logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Castle#Core#Logging#ILoggerFactory#Create(System.String)">
+            <summary>
+              Creates a new logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Castle#Core#Logging#ILoggerFactory#Create(System.Type,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Castle#Core#Logging#ILoggerFactory#Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.GetConfigFile(System.String)">
+            <summary>
+              Gets the configuration file.
+            </summary>
+            <param name = "fileName">i.e. log4net.config</param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.Logging.TraceLoggerFactory">
+            <summary>
+              Used to create the TraceLogger implementation of ILogger interface. See <see cref="T:Castle.Core.Logging.TraceLogger"/>.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractLoggerFactory.GetConfigFile(System.String)">
+            <summary>
+              Gets the configuration file.
+            </summary>
+            <param name = "fileName">i.e. log4net.config</param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.Logging.IContextProperties">
+            <summary>
+              Interface for Context Properties implementations
+            </summary>
+            <remarks>
+              <para>
+                This interface defines a basic property get set accessor.
+              </para>
+              <para>
+                Based on the ContextPropertiesBase of log4net, by Nicko Cadell.
+              </para>
+            </remarks>
+        </member>
+        <member name="P:Castle.Core.Logging.IContextProperties.Item(System.String)">
+            <summary>
+              Gets or sets the value of a property
+            </summary>
+            <value>
+              The value for the property with the specified key
+            </value>
+            <remarks>
+              <para>
+                Gets or sets the value of a property
+              </para>
+            </remarks>
+        </member>
+        <member name="T:Castle.Core.Logging.NullLogFactory">
+            <summary>
+            NullLogFactory used when logging is turned off.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogFactory.Create(System.String)">
+            <summary>
+              Creates an instance of ILogger with the specified name.
+            </summary>
+            <param name = "name">Name.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogFactory.Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates an instance of ILogger with the specified name and LoggerLevel.
+            </summary>
+            <param name = "name">Name.</param>
+            <param name = "level">Level.</param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.Logging.StreamLoggerFactory">
+            <summary>
+              Creates <see cref="T:Castle.Core.Logging.StreamLogger"/> outputing 
+              to files. The name of the file is derived from the log name
+              plus the 'log' extension.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.IExtendedLogger">
+            <summary>
+              Provides an interface that supports <see cref="T:Castle.Core.Logging.ILogger"/> and
+              allows the storage and retrieval of Contexts. These are supported in
+              both log4net and NLog.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.ILogger">
+            <summary>
+              Manages logging.
+            </summary>
+            <remarks>
+              This is a facade for the different logging subsystems.
+              It offers a simplified interface that follows IOC patterns
+              and a simplified priority/level/severity abstraction.
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.CreateChildLogger(System.String)">
+            <summary>
+              Create a new child logger.
+              The name of the child logger is [current-loggers-name].[passed-in-name]
+            </summary>
+            <param name="loggerName">The Subname of this logger.</param>
+            <returns>The New ILogger instance.</returns>
+            <exception cref="T:System.ArgumentException">If the name has an empty element name.</exception>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Debug(System.String)">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Debug(System.Func{System.String})">
+            <summary>
+              Logs a debug message with lazily constructed message. The message will be constructed only if the <see cref="P:Castle.Core.Logging.ILogger.IsDebugEnabled"/> is true.
+            </summary>
+            <param name="messageFactory"></param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Debug(System.String,System.Exception)">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.DebugFormat(System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.DebugFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.DebugFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.DebugFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Error(System.String)">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Error(System.Func{System.String})">
+            <summary>
+              Logs an error message with lazily constructed message. The message will be constructed only if the <see cref="P:Castle.Core.Logging.ILogger.IsErrorEnabled"/> is true.
+            </summary>
+            <param name="messageFactory"></param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Error(System.String,System.Exception)">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.ErrorFormat(System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.ErrorFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.ErrorFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.ErrorFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Fatal(System.String)">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Fatal(System.Func{System.String})">
+            <summary>
+              Logs a fatal message with lazily constructed message. The message will be constructed only if the <see cref="P:Castle.Core.Logging.ILogger.IsFatalEnabled"/> is true.
+            </summary>
+            <param name="messageFactory"></param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Fatal(System.String,System.Exception)">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalFormat(System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Info(System.String)">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Info(System.Func{System.String})">
+            <summary>
+              Logs a info message with lazily constructed message. The message will be constructed only if the <see cref="P:Castle.Core.Logging.ILogger.IsInfoEnabled"/> is true.
+            </summary>
+            <param name="messageFactory"></param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Info(System.String,System.Exception)">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.InfoFormat(System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.InfoFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.InfoFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.InfoFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Warn(System.String)">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Warn(System.Func{System.String})">
+            <summary>
+              Logs a warn message with lazily constructed message. The message will be constructed only if the <see cref="P:Castle.Core.Logging.ILogger.IsWarnEnabled"/> is true.
+            </summary>
+            <param name="messageFactory"></param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Warn(System.String,System.Exception)">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.WarnFormat(System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.WarnFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.WarnFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.WarnFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsDebugEnabled">
+            <summary>
+              Determines if messages of priority "debug" will be logged.
+            </summary>
+            <value>True if "debug" messages will be logged.</value>
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsErrorEnabled">
+            <summary>
+              Determines if messages of priority "error" will be logged.
+            </summary>
+            <value>True if "error" messages will be logged.</value>
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsFatalEnabled">
+            <summary>
+              Determines if messages of priority "fatal" will be logged.
+            </summary>
+            <value>True if "fatal" messages will be logged.</value>
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsInfoEnabled">
+            <summary>
+              Determines if messages of priority "info" will be logged.
+            </summary>
+            <value>True if "info" messages will be logged.</value>
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsWarnEnabled">
+            <summary>
+              Determines if messages of priority "warn" will be logged.
+            </summary>
+            <value>True if "warn" messages will be logged.</value>
+        </member>
+        <member name="P:Castle.Core.Logging.IExtendedLogger.GlobalProperties">
+            <summary>
+              Exposes the Global Context of the extended logger.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.IExtendedLogger.ThreadProperties">
+            <summary>
+              Exposes the Thread Context of the extended logger.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.IExtendedLogger.ThreadStacks">
+            <summary>
+              Exposes the Thread Stack of the extended logger.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.ConsoleLogger">
+            <summary>
+            The Logger sending everything to the standard output streams.
+            This is mainly for the cases when you have a utility that
+            does not have a logger to supply.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.LevelFilteredLogger">
+            <summary>
+            The Level Filtered Logger class.  This is a base clase which
+            provides a LogLevel attribute and reroutes all functions into
+            one Log method.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.#ctor">
+            <summary>
+              Creates a new <c>LevelFilteredLogger</c>.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InitializeLifetimeService">
+            <summary>
+            Keep the instance alive in a remoting scenario
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Debug(System.String)">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Debug(System.String,System.Exception)">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.DebugFormat(System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.DebugFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.DebugFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.DebugFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Info(System.String)">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Info(System.String,System.Exception)">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InfoFormat(System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InfoFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InfoFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InfoFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Warn(System.String)">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Warn(System.String,System.Exception)">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.WarnFormat(System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.WarnFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.WarnFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.WarnFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Error(System.String)">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Error(System.String,System.Exception)">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.ErrorFormat(System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.ErrorFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.ErrorFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.ErrorFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Fatal(System.String)">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Fatal(System.String,System.Exception)">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalFormat(System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Log(Castle.Core.Logging.LoggerLevel,System.String,System.String,System.Exception)">
+            <summary>
+              Implementors output the log content by implementing this method only.
+              Note that exception can be null
+            </summary>
+            <param name = "loggerLevel"></param>
+            <param name = "loggerName"></param>
+            <param name = "message"></param>
+            <param name = "exception"></param>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.Level">
+            <value>
+              The <c>LoggerLevel</c> that this logger
+              will be using. Defaults to <c>LoggerLevel.Off</c>
+            </value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.Name">
+            <value>
+              The name that this logger will be using. 
+              Defaults to <c>String.Empty</c>
+            </value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsDebugEnabled">
+            <summary>
+              Determines if messages of priority "debug" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Debug"/> bit</value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsInfoEnabled">
+            <summary>
+              Determines if messages of priority "info" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Info"/> bit</value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsWarnEnabled">
+            <summary>
+              Determines if messages of priority "warn" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Warn"/> bit</value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsErrorEnabled">
+            <summary>
+              Determines if messages of priority "error" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Error"/> bit</value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsFatalEnabled">
+            <summary>
+              Determines if messages of priority "fatal" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Fatal"/> bit</value>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.#ctor">
+            <summary>
+              Creates a new ConsoleLogger with the <c>Level</c>
+              set to <c>LoggerLevel.Debug</c> and the <c>Name</c>
+              set to <c>String.Empty</c>.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.#ctor(Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new ConsoleLogger with the <c>Name</c>
+              set to <c>String.Empty</c>.
+            </summary>
+            <param name = "logLevel">The logs Level.</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.#ctor(System.String)">
+            <summary>
+              Creates a new ConsoleLogger with the <c>Level</c>
+              set to <c>LoggerLevel.Debug</c>.
+            </summary>
+            <param name = "name">The logs Name.</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.#ctor(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new ConsoleLogger.
+            </summary>
+            <param name = "name">The logs Name.</param>
+            <param name = "logLevel">The logs Level.</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.Log(Castle.Core.Logging.LoggerLevel,System.String,System.String,System.Exception)">
+            <summary>
+              A Common method to log.
+            </summary>
+            <param name = "loggerLevel">The level of logging</param>
+            <param name = "loggerName">The name of the logger</param>
+            <param name = "message">The Message</param>
+            <param name = "exception">The Exception</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.CreateChildLogger(System.String)">
+            <summary>
+              Returns a new <c>ConsoleLogger</c> with the name
+              added after this loggers name, with a dot in between.
+            </summary>
+            <param name = "loggerName">The added hierarchical name.</param>
+            <returns>A new <c>ConsoleLogger</c>.</returns>
+        </member>
+        <member name="T:Castle.Core.Logging.DiagnosticsLogger">
+            <summary>
+              The Logger using standart Diagnostics namespace.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.DiagnosticsLogger.#ctor(System.String)">
+            <summary>
+              Creates a logger based on <see cref="T:System.Diagnostics.EventLog"/>.
+            </summary>
+            <param name="logName"><see cref="P:System.Diagnostics.EventLog.Log"/></param>
+        </member>
+        <member name="M:Castle.Core.Logging.DiagnosticsLogger.#ctor(System.String,System.String)">
+            <summary>
+              Creates a logger based on <see cref="T:System.Diagnostics.EventLog"/>.
+            </summary>
+            <param name="logName"><see cref="P:System.Diagnostics.EventLog.Log"/></param>
+            <param name="source"><see cref="P:System.Diagnostics.EventLog.Source"/></param>
+        </member>
+        <member name="M:Castle.Core.Logging.DiagnosticsLogger.#ctor(System.String,System.String,System.String)">
+            <summary>
+              Creates a logger based on <see cref="T:System.Diagnostics.EventLog"/>.
+            </summary>
+            <param name="logName"><see cref="P:System.Diagnostics.EventLog.Log"/></param>
+            <param name="machineName"><see cref="P:System.Diagnostics.EventLog.MachineName"/></param>
+            <param name="source"><see cref="P:System.Diagnostics.EventLog.Source"/></param>
+        </member>
+        <member name="T:Castle.Core.Logging.NullLogger">
+            <summary>
+              The Null Logger class.  This is useful for implementations where you need
+              to provide a logger to a utility class, but do not want any output from it.
+              It also helps when you have a utility that does not have a logger to supply.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.CreateChildLogger(System.String)">
+            <summary>
+              Returns this <c>NullLogger</c>.
+            </summary>
+            <param name = "loggerName">Ignored</param>
+            <returns>This ILogger instance.</returns>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Debug(System.String)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Debug(System.String,System.Exception)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.DebugFormat(System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.DebugFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.DebugFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.DebugFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Error(System.String)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Error(System.String,System.Exception)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.ErrorFormat(System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.ErrorFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.ErrorFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.ErrorFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Fatal(System.String)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Fatal(System.String,System.Exception)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalFormat(System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Info(System.String)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Info(System.String,System.Exception)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.InfoFormat(System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.InfoFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.InfoFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.InfoFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Warn(System.String)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Warn(System.String,System.Exception)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.WarnFormat(System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.WarnFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.WarnFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.WarnFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.GlobalProperties">
+            <summary>
+              Returns empty context properties.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.ThreadProperties">
+            <summary>
+              Returns empty context properties.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.ThreadStacks">
+            <summary>
+              Returns empty context stacks.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsDebugEnabled">
+            <summary>
+              No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsErrorEnabled">
+            <summary>
+              No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsFatalEnabled">
+            <summary>
+              No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsInfoEnabled">
+            <summary>
+              No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsWarnEnabled">
+            <summary>
+              No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="T:Castle.Core.Logging.StreamLogger">
+            <summary>
+            The Stream Logger class.  This class can stream log information
+            to any stream, it is suitable for storing a log file to disk,
+            or to a <c>MemoryStream</c> for testing your components.
+            </summary>
+            <remarks>
+            This logger is not thread safe.
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.Logging.StreamLogger.#ctor(System.String,System.IO.Stream)">
+            <summary>
+              Creates a new <c>StreamLogger</c> with default encoding 
+              and buffer size. Initial Level is set to Debug.
+            </summary>
+            <param name = "name">
+              The name of the log.
+            </param>
+            <param name = "stream">
+              The stream that will be used for logging,
+              seeking while the logger is alive 
+            </param>
+        </member>
+        <member name="M:Castle.Core.Logging.StreamLogger.#ctor(System.String,System.IO.Stream,System.Text.Encoding)">
+            <summary>
+              Creates a new <c>StreamLogger</c> with default buffer size.
+              Initial Level is set to Debug.
+            </summary>
+            <param name="name">
+              The name of the log.
+            </param>
+            <param name="stream">
+              The stream that will be used for logging,
+              seeking while the logger is alive 
+            </param>
+            <param name="encoding">
+              The encoding that will be used for this stream.
+              <see cref="T:System.IO.StreamWriter"/>
+            </param>
+        </member>
+        <member name="M:Castle.Core.Logging.StreamLogger.#ctor(System.String,System.IO.Stream,System.Text.Encoding,System.Int32)">
+            <summary>
+              Creates a new <c>StreamLogger</c>. 
+              Initial Level is set to Debug.
+            </summary>
+            <param name="name">
+              The name of the log.
+            </param>
+            <param name="stream">
+              The stream that will be used for logging,
+              seeking while the logger is alive 
+            </param>
+            <param name="encoding">
+              The encoding that will be used for this stream.
+              <see cref="T:System.IO.StreamWriter"/>
+            </param>
+            <param name="bufferSize">
+              The buffer size that will be used for this stream.
+              <see cref="T:System.IO.StreamWriter"/>
+            </param>
+        </member>
+        <member name="M:Castle.Core.Logging.StreamLogger.#ctor(System.String,System.IO.StreamWriter)">
+            <summary>
+              Creates a new <c>StreamLogger</c> with 
+              Debug as default Level.
+            </summary>
+            <param name = "name">The name of the log.</param>
+            <param name = "writer">The <c>StreamWriter</c> the log will write to.</param>
+        </member>
+        <member name="T:Castle.Core.Logging.TraceLogger">
+            <summary>
+              The TraceLogger sends all logging to the System.Diagnostics.TraceSource
+              built into the .net framework.
+            </summary>
+            <remarks>
+              Logging can be configured in the system.diagnostics configuration 
+              section. 
+            
+              If logger doesn't find a source name with a full match it will
+              use source names which match the namespace partially. For example you can
+              configure from all castle components by adding a source name with the
+              name "Castle". 
+            
+              If no portion of the namespace matches the source named "Default" will
+              be used.
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.Logging.TraceLogger.#ctor(System.String)">
+            <summary>
+            Build a new trace logger based on the named TraceSource
+            </summary>
+            <param name="name">The name used to locate the best TraceSource. In most cases comes from the using type's fullname.</param>
+        </member>
+        <member name="M:Castle.Core.Logging.TraceLogger.#ctor(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+            Build a new trace logger based on the named TraceSource
+            </summary>
+            <param name="name">The name used to locate the best TraceSource. In most cases comes from the using type's fullname.</param>
+            <param name="level">The default logging level at which this source should write messages. In almost all cases this
+            default value will be overridden in the config file. </param>
+        </member>
+        <member name="M:Castle.Core.Logging.TraceLogger.CreateChildLogger(System.String)">
+            <summary>
+            Create a new child logger.
+            The name of the child logger is [current-loggers-name].[passed-in-name]
+            </summary>
+            <param name="loggerName">The Subname of this logger.</param>
+            <returns>The New ILogger instance.</returns> 
+        </member>
+        <member name="T:Castle.Core.Configuration.AbstractConfiguration">
+            <summary>
+              This is an abstract <see cref="T:Castle.Core.Configuration.IConfiguration"/> implementation
+              that deals with methods that can be abstracted away
+              from underlying implementations.
+            </summary>
+            <remarks>
+              <para><b>AbstractConfiguration</b> makes easier to implementers 
+                to create a new version of <see cref="T:Castle.Core.Configuration.IConfiguration"/></para>
+            </remarks>
+        </member>
+        <member name="T:Castle.Core.Configuration.IConfiguration">
+            <summary>
+            <see cref="T:Castle.Core.Configuration.IConfiguration"/> is a interface encapsulating a configuration node
+            used to retrieve configuration values.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.IConfiguration.GetValue(System.Type,System.Object)">
+            <summary>
+            Gets the value of the node and converts it 
+            into specified <see cref="T:System.Type"/>.
+            </summary>
+            <param name="type">The <see cref="T:System.Type"/></param>
+            <param name="defaultValue">
+            The Default value returned if the conversion fails.
+            </param>
+            <returns>The Value converted into the specified type.</returns>
+        </member>
+        <member name="P:Castle.Core.Configuration.IConfiguration.Name">
+            <summary>
+            Gets the name of the node.
+            </summary>
+            <value>
+            The Name of the node.
+            </value> 
+        </member>
+        <member name="P:Castle.Core.Configuration.IConfiguration.Value">
+            <summary>
+            Gets the value of the node.
+            </summary>
+            <value>
+            The Value of the node.
+            </value> 
+        </member>
+        <member name="P:Castle.Core.Configuration.IConfiguration.Children">
+            <summary>
+            Gets an <see cref="T:Castle.Core.Configuration.ConfigurationCollection"/> of <see cref="T:Castle.Core.Configuration.IConfiguration"/>
+            elements containing all node children.
+            </summary>
+            <value>The Collection of child nodes.</value>
+        </member>
+        <member name="P:Castle.Core.Configuration.IConfiguration.Attributes">
+            <summary>
+            Gets an <see cref="T:System.Collections.IDictionary"/> of the configuration attributes.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.AbstractConfiguration.GetValue(System.Type,System.Object)">
+            <summary>
+              Gets the value of the node and converts it
+              into specified <see cref="T:System.Type"/>.
+            </summary>
+            <param name="type">The <see cref="T:System.Type"/></param>
+            <param name="defaultValue">
+              The Default value returned if the conversion fails.
+            </param>
+            <returns>The Value converted into the specified type.</returns>
+        </member>
+        <member name="P:Castle.Core.Configuration.AbstractConfiguration.Attributes">
+            <summary>
+              Gets node attributes.
+            </summary>
+            <value>
+              All attributes of the node.
+            </value>
+        </member>
+        <member name="P:Castle.Core.Configuration.AbstractConfiguration.Children">
+            <summary>
+              Gets all child nodes.
+            </summary>
+            <value>The <see cref="T:Castle.Core.Configuration.ConfigurationCollection"/> of child nodes.</value>
+        </member>
+        <member name="P:Castle.Core.Configuration.AbstractConfiguration.Name">
+            <summary>
+              Gets the name of the <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </summary>
+            <value>
+              The Name of the <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </value>
+        </member>
+        <member name="P:Castle.Core.Configuration.AbstractConfiguration.Value">
+            <summary>
+              Gets the value of <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </summary>
+            <value>
+              The Value of the <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </value>
+        </member>
+        <member name="T:Castle.Core.Configuration.ConfigurationCollection">
+            <summary>
+            A collection of <see cref="T:Castle.Core.Configuration.IConfiguration"/> objects.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.ConfigurationCollection.#ctor">
+            <summary>
+            Creates a new instance of <c>ConfigurationCollection</c>.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.ConfigurationCollection.#ctor(System.Collections.Generic.IEnumerable{Castle.Core.Configuration.IConfiguration})">
+            <summary>
+            Creates a new instance of <c>ConfigurationCollection</c>.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Configuration.MutableConfiguration">
+            <summary>
+            Summary description for MutableConfiguration.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.MutableConfiguration.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Core.Configuration.MutableConfiguration"/> class.
+            </summary>
+            <param name="name">The name.</param>
+        </member>
+        <member name="P:Castle.Core.Configuration.MutableConfiguration.Value">
+            <summary>
+            Gets the value of <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </summary>
+            <value>
+            The Value of the <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </value>
+        </member>
+        <member name="M:Castle.Core.Configuration.Xml.XmlConfigurationDeserializer.Deserialize(System.Xml.XmlNode)">
+            <summary>
+              Deserializes the specified node into an abstract representation of configuration.
+            </summary>
+            <param name = "node">The node.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Configuration.Xml.XmlConfigurationDeserializer.GetConfigValue(System.String)">
+            <summary>
+              If a config value is an empty string we return null, this is to keep
+              backward compatibility with old code
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Pair`2">
+            <summary>
+            General purpose class to represent a standard pair of values. 
+            </summary>
+            <typeparam name="TFirst">Type of the first value</typeparam>
+            <typeparam name="TSecond">Type of the second value</typeparam>
+        </member>
+        <member name="M:Castle.Core.Pair`2.#ctor(`0,`1)">
+            <summary>
+            Constructs a pair with its values
+            </summary>
+            <param name="first"></param>
+            <param name="second"></param>
+        </member>
+        <member name="T:Castle.Core.ProxyServices">
+            <summary>
+            List of utility methods related to dynamic proxy operations
+            </summary>
+        </member>
+        <member name="M:Castle.Core.ProxyServices.IsDynamicProxy(System.Type)">
+            <summary>
+            Determines whether the specified type is a proxy generated by
+            DynamicProxy (1 or 2).
+            </summary>
+            <param name="type">The type.</param>
+            <returns>
+            	<c>true</c> if it is a proxy; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="T:Castle.Core.ReflectionBasedDictionaryAdapter">
+            <summary>
+            Readonly implementation of <see cref="T:System.Collections.IDictionary"/> which uses an anonymous object as its source. Uses names of properties as keys, and property values as... well - values. Keys are not case sensitive.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.#ctor(System.Object)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.Core.ReflectionBasedDictionaryAdapter"/> class.
+            </summary>
+            <param name="target">The target.</param>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Add(System.Object,System.Object)">
+            <summary>
+              Adds an element with the provided key and value to the <see cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <param name = "key">The <see cref = "T:System.Object" /> to use as the key of the element to add.</param>
+            <param name = "value">The <see cref = "T:System.Object" /> to use as the value of the element to add.</param>
+            <exception cref = "T:System.ArgumentNullException">
+              <paramref name = "key" /> is null. </exception>
+            <exception cref = "T:System.ArgumentException">An element with the same key already exists in the <see
+               cref = "T:System.Collections.IDictionary" /> object. </exception>
+            <exception cref = "T:System.NotSupportedException">The <see cref = "T:System.Collections.IDictionary" /> is read-only.-or- The <see
+               cref = "T:System.Collections.IDictionary" /> has a fixed size. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Clear">
+            <summary>
+              Removes all elements from the <see cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <exception cref = "T:System.NotSupportedException">The <see cref = "T:System.Collections.IDictionary" /> object is read-only. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Contains(System.Object)">
+            <summary>
+              Determines whether the <see cref = "T:System.Collections.IDictionary" /> object contains an element with the specified key.
+            </summary>
+            <param name = "key">The key to locate in the <see cref = "T:System.Collections.IDictionary" /> object.</param>
+            <returns>
+              true if the <see cref = "T:System.Collections.IDictionary" /> contains an element with the key; otherwise, false.
+            </returns>
+            <exception cref = "T:System.ArgumentNullException">
+              <paramref name = "key" /> is null. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Remove(System.Object)">
+            <summary>
+              Removes the element with the specified key from the <see cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <param name = "key">The key of the element to remove.</param>
+            <exception cref = "T:System.ArgumentNullException">
+              <paramref name = "key" /> is null. </exception>
+            <exception cref = "T:System.NotSupportedException">The <see cref = "T:System.Collections.IDictionary" /> object is read-only.-or- The <see
+               cref = "T:System.Collections.IDictionary" /> has a fixed size. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.GetEnumerator">
+            <summary>
+              Returns an enumerator that iterates through a collection.
+            </summary>
+            <returns>
+              An <see cref = "T:System.Collections.IEnumerator" /> object that can be used to iterate through the collection.
+            </returns>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.System#Collections#ICollection#CopyTo(System.Array,System.Int32)">
+            <summary>
+              Copies the elements of the <see cref = "T:System.Collections.ICollection" /> to an <see cref = "T:System.Array" />, starting at a particular <see
+               cref = "T:System.Array" /> index.
+            </summary>
+            <param name = "array">The one-dimensional <see cref = "T:System.Array" /> that is the destination of the elements copied from <see
+               cref = "T:System.Collections.ICollection" />. The <see cref = "T:System.Array" /> must have zero-based indexing.</param>
+            <param name = "index">The zero-based index in <paramref name = "array" /> at which copying begins.</param>
+            <exception cref = "T:System.ArgumentNullException">
+              <paramref name = "array" /> is null. </exception>
+            <exception cref = "T:System.ArgumentOutOfRangeException">
+              <paramref name = "index" /> is less than zero. </exception>
+            <exception cref = "T:System.ArgumentException">
+              <paramref name = "array" /> is multidimensional.-or- <paramref name = "index" /> is equal to or greater than the length of <paramref
+               name = "array" />.-or- The number of elements in the source <see cref = "T:System.Collections.ICollection" /> is greater than the available space from <paramref
+               name = "index" /> to the end of the destination <paramref name = "array" />. </exception>
+            <exception cref = "T:System.ArgumentException">The type of the source <see cref = "T:System.Collections.ICollection" /> cannot be cast automatically to the type of the destination <paramref
+               name = "array" />. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.System#Collections#IDictionary#GetEnumerator">
+            <summary>
+              Returns an <see cref = "T:System.Collections.IDictionaryEnumerator" /> object for the <see
+               cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <returns>
+              An <see cref = "T:System.Collections.IDictionaryEnumerator" /> object for the <see
+               cref = "T:System.Collections.IDictionary" /> object.
+            </returns>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Read(System.Collections.IDictionary,System.Object)">
+            <summary>
+              Reads values of properties from <paramref name = "valuesAsAnonymousObject" /> and inserts them into <paramref
+               name = "targetDictionary" /> using property names as keys.
+            </summary>
+            <param name = "targetDictionary"></param>
+            <param name = "valuesAsAnonymousObject"></param>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.Count">
+            <summary>
+              Gets the number of elements contained in the <see cref = "T:System.Collections.ICollection" />.
+            </summary>
+            <value></value>
+            <returns>The number of elements contained in the <see cref = "T:System.Collections.ICollection" />.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.IsSynchronized">
+            <summary>
+              Gets a value indicating whether access to the <see cref = "T:System.Collections.ICollection" /> is synchronized (thread safe).
+            </summary>
+            <value></value>
+            <returns>true if access to the <see cref = "T:System.Collections.ICollection" /> is synchronized (thread safe); otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.SyncRoot">
+            <summary>
+              Gets an object that can be used to synchronize access to the <see cref = "T:System.Collections.ICollection" />.
+            </summary>
+            <value></value>
+            <returns>An object that can be used to synchronize access to the <see cref = "T:System.Collections.ICollection" />.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.IsReadOnly">
+            <summary>
+              Gets a value indicating whether the <see cref = "T:System.Collections.IDictionary" /> object is read-only.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref = "T:System.Collections.IDictionary" /> object is read-only; otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.Item(System.Object)">
+            <summary>
+              Gets or sets the <see cref="T:System.Object"/> with the specified key.
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.Keys">
+            <summary>
+              Gets an <see cref = "T:System.Collections.ICollection" /> object containing the keys of the <see
+               cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <value></value>
+            <returns>An <see cref = "T:System.Collections.ICollection" /> object containing the keys of the <see
+               cref = "T:System.Collections.IDictionary" /> object.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.Values">
+            <summary>
+              Gets an <see cref = "T:System.Collections.ICollection" /> object containing the values in the <see
+               cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <value></value>
+            <returns>An <see cref = "T:System.Collections.ICollection" /> object containing the values in the <see
+               cref = "T:System.Collections.IDictionary" /> object.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.System#Collections#IDictionary#IsFixedSize">
+            <summary>
+              Gets a value indicating whether the <see cref = "T:System.Collections.IDictionary" /> object has a fixed size.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref = "T:System.Collections.IDictionary" /> object has a fixed size; otherwise, false.</returns>
+        </member>
+        <member name="T:Castle.Core.Resource.IResource">
+            <summary>
+            Represents a 'streamable' resource. Can
+            be a file, a resource in an assembly.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Resource.IResource.GetStreamReader">
+            <summary>
+            Returns a reader for the stream
+            </summary>
+            <remarks>
+            It's up to the caller to dispose the reader.
+            </remarks>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Resource.IResource.GetStreamReader(System.Text.Encoding)">
+            <summary>
+            Returns a reader for the stream
+            </summary>
+            <remarks>
+            It's up to the caller to dispose the reader.
+            </remarks>
+            <param name="encoding"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Resource.IResource.CreateRelative(System.String)">
+            <summary>
+            Returns an instance of <see cref="T:Castle.Core.Resource.IResource"/>
+            created according to the <c>relativePath</c>
+            using itself as the root.
+            </summary>
+            <param name="relativePath"></param>
+            <returns></returns>
+        </member>
+        <member name="P:Castle.Core.Resource.IResource.FileBasePath">
+            <summary>
+            
+            </summary>
+            <remarks>
+            Only valid for resources that
+            can be obtained through relative paths
+            </remarks>
+        </member>
+        <member name="T:Castle.Core.Resource.AbstractStreamResource">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Resource.AbstractStreamResource.createStream">
+            <summary>
+            This returns a new stream instance each time it is called.
+            It is the responsibility of the caller to dispose of this stream
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Resource.IResourceFactory">
+            <summary>
+            Depicts the contract for resource factories.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Resource.IResourceFactory.Accept(Castle.Core.Resource.CustomUri)">
+            <summary>
+            Used to check whether the resource factory
+            is able to deal with the given resource
+            identifier.
+            </summary>
+            <remarks>
+            Implementors should return <c>true</c>
+            only if the given identifier is supported
+            by the resource factory
+            </remarks>
+            <param name="uri"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Resource.IResourceFactory.Create(Castle.Core.Resource.CustomUri)">
+            <summary>
+            Creates an <see cref="T:Castle.Core.Resource.IResource"/> instance
+            for the given resource identifier
+            </summary>
+            <param name="uri"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Resource.IResourceFactory.Create(Castle.Core.Resource.CustomUri,System.String)">
+            <summary>
+            Creates an <see cref="T:Castle.Core.Resource.IResource"/> instance
+            for the given resource identifier
+            </summary>
+            <param name="uri"></param>
+            <param name="basePath"></param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.Resource.FileResource">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Resource.FileResourceFactory">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Resource.StaticContentResource">
+            <summary>
+            Adapts a static string content as an <see cref="T:Castle.Core.Resource.IResource"/>
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Resource.UncResource">
+            <summary>
+            Enable access to files on network shares
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Smtp.IEmailSender">
+            <summary>
+            Email sender abstraction.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Smtp.IEmailSender.Send(System.String,System.String,System.String,System.String)">
+            <summary>
+            Sends a mail message.
+            </summary>
+            <param name="from">From field</param>
+            <param name="to">To field</param>
+            <param name="subject">E-mail's subject</param>
+            <param name="messageText">message's body</param>
+        </member>
+        <member name="M:Castle.Core.Smtp.IEmailSender.Send(System.Net.Mail.MailMessage)">
+            <summary>
+            Sends a <see cref="T:System.Net.Mail.MailMessage">message</see>. 
+            </summary>
+            <param name="message"><see cref="T:System.Net.Mail.MailMessage">Message</see> instance</param>
+        </member>
+        <member name="M:Castle.Core.Smtp.IEmailSender.Send(System.Collections.Generic.IEnumerable{System.Net.Mail.MailMessage})">
+            <summary>
+            Sends multiple <see cref="T:System.Net.Mail.MailMessage">messages</see>. 
+            </summary>
+            <param name="messages">List of <see cref="T:System.Net.Mail.MailMessage">messages</see></param>
+        </member>
+        <member name="T:Castle.Core.Smtp.DefaultSmtpSender">
+            <summary>
+            Default <see cref="T:Castle.Core.Smtp.IEmailSender"/> implementation.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Smtp.DefaultSmtpSender.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Core.Smtp.DefaultSmtpSender"/> class based on the <see cref="T:System.Net.Mail.SmtpClient"/> configuration provided in the application configuration file.
+            </summary>
+            <remarks>
+            This constructor is based on the default <see cref="T:System.Net.Mail.SmtpClient"/> configuration in the application configuration file.
+            </remarks> 
+        </member>
+        <member name="M:Castle.Core.Smtp.DefaultSmtpSender.#ctor(System.String)">
+            <summary>
+            This service implementation
+            requires a host name in order to work
+            </summary>
+            <param name="hostname">The smtp server name</param>
+        </member>
+        <member name="M:Castle.Core.Smtp.DefaultSmtpSender.Send(System.String,System.String,System.String,System.String)">
+            <summary>
+            Sends a message. 
+            </summary>
+            <exception cref="T:System.ArgumentNullException">If any of the parameters is null</exception>
+            <param name="from">From field</param>
+            <param name="to">To field</param>
+            <param name="subject">e-mail's subject</param>
+            <param name="messageText">message's body</param>
+        </member>
+        <member name="M:Castle.Core.Smtp.DefaultSmtpSender.Send(System.Net.Mail.MailMessage)">
+            <summary>
+            Sends a message. 
+            </summary>
+            <exception cref="T:System.ArgumentNullException">If the message is null</exception>
+            <param name="message">Message instance</param>
+        </member>
+        <member name="M:Castle.Core.Smtp.DefaultSmtpSender.Configure(System.Net.Mail.SmtpClient)">
+            <summary>
+            Configures the sender
+            with port information and eventual credential
+            informed
+            </summary>
+            <param name="smtpClient">Message instance</param>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.Port">
+            <summary>
+            Gets or sets the port used to 
+            access the SMTP server
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.Hostname">
+            <summary>
+            Gets the hostname.
+            </summary>
+            <value>The hostname.</value>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.AsyncSend">
+            <summary>
+            Gets or sets a value which is used to 
+            configure if emails are going to be sent asynchronously or not.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.Timeout">
+            <summary>
+            Gets or sets a value that specifies 
+            the amount of time after which a synchronous Send call times out.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.UseSsl">
+            <summary>
+            Gets or sets a value indicating whether the email should be sent using 
+            a secure communication channel.
+            </summary>
+            <value><c>true</c> if should use SSL; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.Domain">
+            <summary>
+            Gets or sets the domain.
+            </summary>
+            <value>The domain.</value>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.UserName">
+            <summary>
+            Gets or sets the name of the user.
+            </summary>
+            <value>The name of the user.</value>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.Password">
+            <summary>
+            Gets or sets the password.
+            </summary>
+            <value>The password.</value>
+        </member>
+        <member name="P:Castle.Core.Smtp.DefaultSmtpSender.HasCredentials">
+            <summary>
+            Gets a value indicating whether credentials were informed.
+            </summary>
+            <value>
+            <see langword="true"/> if this instance has credentials; otherwise, <see langword="false"/>.
+            </value>
+        </member>
+    </members>
+</doc>
Binary file packages/Castle.Core.3.2.1/lib/sl4/Castle.Core.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/Castle.Core.3.2.1/lib/sl4/Castle.Core.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4223 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>Castle.Core</name>
+    </assembly>
+    <members>
+        <member name="T:Castle.Components.DictionaryAdapter.ReferenceAttribute">
+            <summary>
+            Specifies assignment by reference rather than by copying.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IfExistsAttribute">
+            <summary>
+            Suppresses any on-demand behaviors.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.RemoveIfEmptyAttribute">
+            <summary>
+            Removes a property if null or empty string, guid or collection.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.RemoveIfAttribute">
+            <summary>
+            Removes a property if matches value.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.DictionaryBehaviorAttribute">
+            <summary>
+            Assigns a specific dictionary key.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryBehavior">
+            <summary>
+            Defines the contract for customizing dictionary access.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryBehavior.Copy">
+            <summary>
+            Copies the dictionary behavior.
+            </summary>
+            <returns>null if should not be copied.  Otherwise copy.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.IDictionaryBehavior.ExecutionOrder">
+            <summary>
+            Determines relative order to apply related behaviors.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryPropertySetter">
+            <summary>
+            Defines the contract for updating dictionary values.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryPropertySetter.SetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object@,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Sets the stored dictionary value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="value">The stored value.</param>
+            <param name="property">The property.</param>
+            <returns>true if the property should be stored.</returns>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.ICondition">
+            <summary>
+            Contract for value matching.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.VolatileAttribute">
+            <summary>
+            Indicates that underlying values are changeable and should not be cached.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryInitializer">
+            <summary>
+             Contract for dictionary initialization.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryInitializer.Initialize(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.Object[])">
+            <summary>
+            Performs any initialization of the <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/>
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="behaviors">The dictionary behaviors.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapterVisitor">
+            <summary>
+            Abstract implementation of <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapterVisitor"/>.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryAdapterVisitor">
+            <summary>
+            Conract for traversing a <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/>.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryCreate">
+            <summary>
+            Contract for creating additional Dictionary adapters.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter">
+            <summary>
+            Contract for manipulating the Dictionary adapter.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryEdit">
+            <summary>
+            Contract for editing the Dictionary adapter.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryNotify">
+            <summary>
+            Contract for managing Dictionary adapter notifications.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryValidate">
+            <summary>
+            Contract for validating Dictionary adapter.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryBehaviorBuilder">
+            <summary>
+            Defines the contract for building <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryBehavior"/>s.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryBehaviorBuilder.BuildBehaviors">
+            <summary>
+            Builds the dictionary behaviors.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter">
+            <summary>
+            Abstract adapter for the <see cref="T:System.Collections.IDictionary"/> support
+            needed by the <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory"/>
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Add(System.Object,System.Object)">
+            <summary>
+            Adds an element with the provided key and value to the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <param name="key">The <see cref="T:System.Object"></see> to use as the key of the element to add.</param>
+            <param name="value">The <see cref="T:System.Object"></see> to use as the value of the element to add.</param>
+            <exception cref="T:System.ArgumentException">An element with the same key already exists in the <see cref="T:System.Collections.IDictionary"></see> object. </exception>
+            <exception cref="T:System.ArgumentNullException">key is null. </exception>
+            <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.IDictionary"></see> is read-only.-or- The <see cref="T:System.Collections.IDictionary"></see> has a fixed size. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Clear">
+            <summary>
+            Removes all elements from the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.IDictionary"></see> object is read-only. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Contains(System.Object)">
+            <summary>
+            Determines whether the <see cref="T:System.Collections.IDictionary"></see> object contains an element with the specified key.
+            </summary>
+            <param name="key">The key to locate in the <see cref="T:System.Collections.IDictionary"></see> object.</param>
+            <returns>
+            true if the <see cref="T:System.Collections.IDictionary"></see> contains an element with the key; otherwise, false.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">key is null. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.GetEnumerator">
+            <summary>
+            Returns an <see cref="T:System.Collections.IDictionaryEnumerator"></see> object for the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <returns>
+            An <see cref="T:System.Collections.IDictionaryEnumerator"></see> object for the <see cref="T:System.Collections.IDictionary"></see> object.
+            </returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Remove(System.Object)">
+            <summary>
+            Removes the element with the specified key from the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <param name="key">The key of the element to remove.</param>
+            <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.IDictionary"></see> object is read-only.-or- The <see cref="T:System.Collections.IDictionary"></see> has a fixed size. </exception>
+            <exception cref="T:System.ArgumentNullException">key is null. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.CopyTo(System.Array,System.Int32)">
+            <summary>
+            Copies the elements of the <see cref="T:System.Collections.ICollection"></see> to an <see cref="T:System.Array"></see>, starting at a particular <see cref="T:System.Array"></see> index.
+            </summary>
+            <param name="array">The one-dimensional <see cref="T:System.Array"></see> that is the destination of the elements copied from <see cref="T:System.Collections.ICollection"></see>. The <see cref="T:System.Array"></see> must have zero-based indexing.</param>
+            <param name="index">The zero-based index in array at which copying begins.</param>
+            <exception cref="T:System.ArgumentNullException">array is null. </exception>
+            <exception cref="T:System.ArgumentException">The type of the source <see cref="T:System.Collections.ICollection"></see> cannot be cast automatically to the type of the destination array. </exception>
+            <exception cref="T:System.ArgumentOutOfRangeException">index is less than zero. </exception>
+            <exception cref="T:System.ArgumentException">array is multidimensional.-or- index is equal to or greater than the length of array.-or- The number of elements in the source <see cref="T:System.Collections.ICollection"></see> is greater than the available space from index to the end of the destination array. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.System#Collections#IEnumerable#GetEnumerator">
+            <summary>
+            Returns an enumerator that iterates through a collection.
+            </summary>
+            <returns>
+            An <see cref="T:System.Collections.IEnumerator"></see> object that can be used to iterate through the collection.
+            </returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.IsFixedSize">
+            <summary>
+            Gets a value indicating whether the <see cref="T:System.Collections.IDictionary"></see> object has a fixed size.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref="T:System.Collections.IDictionary"></see> object has a fixed size; otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.IsReadOnly">
+            <summary>
+            Gets a value indicating whether the <see cref="T:System.Collections.IDictionary"></see> object is read-only.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref="T:System.Collections.IDictionary"></see> object is read-only; otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Keys">
+            <summary>
+            Gets an <see cref="T:System.Collections.ICollection"></see> object containing the keys of the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <value></value>
+            <returns>An <see cref="T:System.Collections.ICollection"></see> object containing the keys of the <see cref="T:System.Collections.IDictionary"></see> object.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Values">
+            <summary>
+            Gets an <see cref="T:System.Collections.ICollection"></see> object containing the values in the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <value></value>
+            <returns>An <see cref="T:System.Collections.ICollection"></see> object containing the values in the <see cref="T:System.Collections.IDictionary"></see> object.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Item(System.Object)">
+            <summary>
+            Gets or sets the <see cref="T:System.Object"/> with the specified key.
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Count">
+            <summary>
+            Gets the number of elements contained in the <see cref="T:System.Collections.ICollection"></see>.
+            </summary>
+            <value></value>
+            <returns>The number of elements contained in the <see cref="T:System.Collections.ICollection"></see>.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.IsSynchronized">
+            <summary>
+            Gets a value indicating whether access to the <see cref="T:System.Collections.ICollection"></see> is synchronized (thread safe).
+            </summary>
+            <value></value>
+            <returns>true if access to the <see cref="T:System.Collections.ICollection"></see> is synchronized (thread safe); otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.SyncRoot">
+            <summary>
+            Gets an object that can be used to synchronize access to the <see cref="T:System.Collections.ICollection"></see>.
+            </summary>
+            <value></value>
+            <returns>An object that can be used to synchronize access to the <see cref="T:System.Collections.ICollection"></see>.</returns>
+        </member>
+        <member name="M:Castle.Core.Internal.CollectionExtensions.IsNullOrEmpty(System.Collections.IEnumerable)">
+            <summary>
+              Checks whether or not collection is null or empty. Assumes colleciton can be safely enumerated multiple times.
+            </summary>
+            <param name = "this"></param>
+            <returns></returns>
+        </member>
+        <member name="F:Castle.Core.Internal.InternalsVisible.ToCastleCore">
+            <summary>
+              Constant to use when making assembly internals visible to Castle.Core 
+              <c>[assembly: InternalsVisibleTo(CoreInternalsVisible.ToCastleCore)]</c>
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Internal.InternalsVisible.ToDynamicProxyGenAssembly2">
+            <summary>
+              Constant to use when making assembly internals visible to proxy types generated by DynamicProxy. Required when proxying internal types.
+              <c>[assembly: InternalsVisibleTo(CoreInternalsVisible.ToDynamicProxyGenAssembly2)]</c>
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.ComponentAttribute">
+            <summary>
+            Identifies a property should be represented as a nested component.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryKeyBuilder">
+            <summary>
+            Defines the contract for building typed dictionary keys.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryKeyBuilder.GetKey(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Builds the specified key.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The current key.</param>
+            <param name="property">The property.</param>
+            <returns>The updated key</returns>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryPropertyGetter">
+            <summary>
+            Defines the contract for retrieving dictionary values.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryPropertyGetter.GetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object,Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Boolean)">
+            <summary>
+            Gets the effective dictionary value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="storedValue">The stored value.</param>
+            <param name="property">The property.</param>
+            <param name="ifExists">true if return only existing.</param>
+            <returns>The effective property value.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.ComponentAttribute.NoPrefix">
+            <summary>
+            Applies no prefix.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.ComponentAttribute.Prefix">
+            <summary>
+            Gets or sets the prefix.
+            </summary>
+            <value>The prefix.</value>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.DictionaryAdapterAttribute">
+            <summary>
+            Identifies the dictionary adapter types.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.FetchAttribute">
+            <summary>
+            Identifies an interface or property to be pre-fetched.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.FetchAttribute.#ctor">
+            <summary>
+            Instructs fetching to occur.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.FetchAttribute.#ctor(System.Boolean)">
+            <summary>
+            Instructs fetching according to <paramref name="fetch"/>
+            </summary>
+            <param name="fetch"></param>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.FetchAttribute.Fetch">
+            <summary>
+            Gets whether or not fetching should occur.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.GroupAttribute">
+            <summary>
+            Assigns a property to a group.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.GroupAttribute.#ctor(System.Object)">
+            <summary>
+            Constructs a group assignment.
+            </summary>
+            <param name="group">The group name.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.GroupAttribute.#ctor(System.Object[])">
+            <summary>
+            Constructs a group assignment.
+            </summary>
+            <param name="group">The group name.</param>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.GroupAttribute.Group">
+            <summary>
+            Gets the group the property is assigned to.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.KeyAttribute">
+            <summary>
+            Assigns a specific dictionary key.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeyAttribute.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeyAttribute"/> class.
+            </summary>
+            <param name="key">The key.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeyAttribute.#ctor(System.String[])">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeyAttribute"/> class.
+            </summary>
+            <param name="keys">The compound key.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.KeyPrefixAttribute">
+            <summary>
+            Assigns a prefix to the keyed properties of an interface.
+            </summary>
+            <remarks>
+            Key prefixes are not inherited by sub-interfaces.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeyPrefixAttribute.#ctor">
+            <summary>
+            Initializes a default instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeyPrefixAttribute"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeyPrefixAttribute.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeyPrefixAttribute"/> class.
+            </summary>
+            <param name="keyPrefix">The prefix for the keyed properties of the interface.</param>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.KeyPrefixAttribute.KeyPrefix">
+            <summary>
+            Gets the prefix key added to the properties of the interface.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.KeySubstitutionAttribute">
+            <summary>
+            Substitutes part of key with another string.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeySubstitutionAttribute.#ctor(System.String,System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeySubstitutionAttribute"/> class.
+            </summary>
+            <param name="oldValue">The old value.</param>
+            <param name="newValue">The new value.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.MultiLevelEditAttribute">
+            <summary>
+            Requests support for multi-level editing.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.NewGuidAttribute">
+            <summary>
+            Generates a new GUID on demand.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.OnDemandAttribute">
+            <summary>
+            Support for on-demand value resolution.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.StringFormatAttribute">
+            <summary>
+            Provides simple string formatting from existing properties.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.StringFormatAttribute.Format">
+            <summary>
+            Gets the string format.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.StringFormatAttribute.Properties">
+            <summary>
+            Gets the format properties.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.StringListAttribute">
+            <summary>
+            Identifies a property should be represented as a delimited string value.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.StringListAttribute.Separator">
+            <summary>
+            Gets the separator.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.StringValuesAttribute">
+            <summary>
+            Converts all properties to strings.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.StringValuesAttribute.Format">
+            <summary>
+            Gets or sets the format.
+            </summary>
+            <value>The format.</value>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.SuppressNotificationsAttribute">
+            <summary>
+            Suppress property change notifications.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IPropertyDescriptorInitializer">
+            <summary>
+             Contract for property descriptor initialization.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IPropertyDescriptorInitializer.Initialize(Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Object[])">
+            <summary>
+            Performs any initialization of the <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <param name="propertyDescriptor">The property descriptor.</param>
+            <param name="behaviors">The property behaviors.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.TypeKeyPrefixAttribute">
+            <summary>
+            Assigns a prefix to the keyed properties using the interface name.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.DefaultPropertyGetter">
+            <summary>
+            Manages conversion between property values.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DefaultPropertyGetter.#ctor(System.ComponentModel.TypeConverter)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.DefaultPropertyGetter"/> class.
+            </summary>
+            <param name="converter">The converter.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DefaultPropertyGetter.GetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object,Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Boolean)">
+            <summary>
+            Gets the effective dictionary value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="storedValue">The stored value.</param>
+            <param name="property">The property.</param>
+            <param name="ifExists">true if return only existing.</param>
+            <returns>The effective property value.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.DefaultPropertyGetter.ExecutionOrder">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory">
+            <summary>
+            Uses Reflection.Emit to expose the properties of a dictionary
+            through a dynamic implementation of a typed interface.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory">
+            <summary>
+            Defines the contract for building typed dictionary adapters.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter``1(System.Collections.IDictionary)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Collections.IDictionary"/>.
+            </summary>
+            <typeparam name="T">The typed interface.</typeparam>
+            <param name="dictionary">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the dictionary.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.IDictionary)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Collections.IDictionary"/>.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="dictionary">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the dictionary.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.IDictionary,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Collections.IDictionary"/>.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="dictionary">The underlying source of properties.</param>
+            <param name="descriptor">The property descriptor.</param>
+            <returns>An implementation of the typed interface bound to the dictionary.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapterMeta(System.Type)">
+            <summary>
+            Gets the <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> associated with the type.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <returns>The adapter meta-data.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapterMeta(System.Type,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Gets the <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> associated with the type.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="descriptor">The property descriptor.</param>
+            <returns>The adapter meta-data.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapterMeta(System.Type,Castle.Components.DictionaryAdapter.DictionaryAdapterMeta)">
+            <summary>
+            Gets the <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> associated with the type.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="other">Another <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> from which to copy behaviors.</param>
+            <returns>The adapter meta-data.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter``1(System.Collections.IDictionary)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.IDictionary)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.IDictionary,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter``2(System.Collections.Generic.IDictionary{System.String,``1})">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter``1(System.Type,System.Collections.Generic.IDictionary{System.String,``0})">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapterMeta(System.Type)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapterMeta(System.Type,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapterMeta(System.Type,Castle.Components.DictionaryAdapter.DictionaryAdapterMeta)">
+            <inheritdoc />
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryMetaInitializer">
+            <summary>
+             Contract for dictionary meta-data initialization.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryMetaInitializer.Initialize(Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory,Castle.Components.DictionaryAdapter.DictionaryAdapterMeta)">
+            <summary>
+            	Initializes the given <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> object.
+            </summary>
+            <param name="factory">The dictionary adapter factory.</param>
+            <param name="dictionaryMeta">The dictionary adapter meta.</param>
+            
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryMetaInitializer.ShouldHaveBehavior(System.Object)">
+            <summary>
+            	Determines whether the given behavior should be included in a new
+            	<see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> object.
+            </summary>
+            <param name="behavior">A dictionary behavior or annotation.</param>
+            <returns>True if the behavior should be included; otherwise, false.</returns>
+            <remarks>
+            	<see cref="T:Castle.Components.DictionaryAdapter.IDictionaryMetaInitializer"/> behaviors are always included,
+            	regardless of the result of this method.
+            </remarks>
+            
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryValidator">
+            <summary>
+            Contract for dictionary validation.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryValidator.IsValid(Castle.Components.DictionaryAdapter.IDictionaryAdapter)">
+            <summary>
+            Determines if <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/> is valid.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <returns>true if valid.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryValidator.Validate(Castle.Components.DictionaryAdapter.IDictionaryAdapter)">
+            <summary>
+            Validates the <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/>.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <returns>The error summary information.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryValidator.Validate(Castle.Components.DictionaryAdapter.IDictionaryAdapter,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Validates the <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/> for a property.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="property">The property to validate.</param>
+            <returns>The property summary information.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryValidator.Invalidate(Castle.Components.DictionaryAdapter.IDictionaryAdapter)">
+            <summary>
+            Invalidates any results cached by the validator.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.PropertyDescriptor">
+            <summary>
+            Describes a dictionary property.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.#ctor">
+            <summary>
+            Initializes an empty <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.#ctor(System.Reflection.PropertyInfo,System.Object[])">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/> class.
+            </summary>
+            <param name="property">The property.</param>
+            <param name="annotations">The annotations.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.#ctor(System.Object[])">
+            <summary>
+            Initializes a new instance <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.#ctor(Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Boolean)">
+            <summary>
+             Copies an existinginstance of the <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/> class.
+            </summary>
+            <param name="source"></param>
+            <param name="copyBehaviors"></param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.GetKey(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Gets the key.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="descriptor">The descriptor.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.GetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object,Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Boolean)">
+            <summary>
+            Gets the property value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="storedValue">The stored value.</param>
+            <param name="descriptor">The descriptor.</param>
+            <param name="ifExists">true if return only existing.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.SetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object@,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Sets the property value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="value">The value.</param>
+            <param name="descriptor">The descriptor.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.AddBehavior(Castle.Components.DictionaryAdapter.IDictionaryBehavior)">
+            <summary>
+            Adds a single behavior.
+            </summary>
+            <param name="behavior">The behavior.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.AddBehaviors(Castle.Components.DictionaryAdapter.IDictionaryBehavior[])">
+            <summary>
+            Adds the behaviors.
+            </summary>
+            <param name="behaviors">The behaviors.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.AddBehaviors(System.Collections.Generic.IEnumerable{Castle.Components.DictionaryAdapter.IDictionaryBehavior})">
+            <summary>
+            Adds the behaviors.
+            </summary>
+            <param name="behaviors">The behaviors.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.CopyBehaviors(Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Copies the behaviors to the other <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <param name="other"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.Copy">
+            <summary>
+            Copies the <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.ExecutionOrder">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.PropertyName">
+            <summary>
+            Gets the property name.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.PropertyType">
+            <summary>
+            Gets the property type.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Property">
+            <summary>
+            Gets the property.
+            </summary>
+            <value>The property.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.IsDynamicProperty">
+            <summary>
+            Returns true if the property is dynamic.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.State">
+            <summary>
+            Gets additional state.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Fetch">
+            <summary>
+            Determines if property should be fetched.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.IfExists">
+            <summary>
+            Determines if property must exist first.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.SuppressNotifications">
+            <summary>
+            Determines if notifications should occur.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Annotations">
+            <summary>
+            Gets the property behaviors.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.TypeConverter">
+            <summary>
+            Gets the type converter.
+            </summary>
+            <value>The type converter.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.ExtendedProperties">
+            <summary>
+            Gets the extended properties.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Behaviors">
+            <summary>
+            Gets the setter.
+            </summary>
+            <value>The setter.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.KeyBuilders">
+            <summary>
+            Gets the key builders.
+            </summary>
+            <value>The key builders.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Setters">
+            <summary>
+            Gets the setter.
+            </summary>
+            <value>The setter.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Getters">
+            <summary>
+            Gets the getter.
+            </summary>
+            <value>The getter.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Initializers">
+            <summary>
+            Gets the initializers.
+            </summary>
+            <value>The initializers.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.MetaInitializers">
+            <summary>
+            Gets the meta-data initializers.
+            </summary>
+            <value>The meta-data initializers.</value>
+        </member>
+        <member name="T:Castle.Core.Internal.AttributesUtil">
+            <summary>
+              Helper class for retrieving attributes.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetAttribute``1(System.Reflection.ICustomAttributeProvider)">
+            <summary>
+              Gets the attribute.
+            </summary>
+            <param name = "member">The member.</param>
+            <returns>The member attribute.</returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetAttributes``1(System.Reflection.ICustomAttributeProvider)">
+            <summary>
+              Gets the attributes. Does not consider inherited attributes!
+            </summary>
+            <param name = "member">The member.</param>
+            <returns>The member attributes.</returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetTypeAttribute``1(System.Type)">
+            <summary>
+              Gets the type attribute.
+            </summary>
+            <param name = "type">The type.</param>
+            <returns>The type attribute.</returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetTypeAttributes``1(System.Type)">
+            <summary>
+              Gets the type attributes.
+            </summary>
+            <param name = "type">The type.</param>
+            <returns>The type attributes.</returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetTypeConverter(System.Reflection.MemberInfo)">
+            <summary>
+              Gets the type converter.
+            </summary>
+            <param name = "member">The member.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.HasAttribute``1(System.Reflection.ICustomAttributeProvider)">
+            <summary>
+              Gets the attribute.
+            </summary>
+            <param name = "member">The member.</param>
+            <returns>The member attribute.</returns>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDynamicValue`1">
+            <summary>
+            Contract for typed dynamic value resolution.
+            </summary>
+            <typeparam name="T"></typeparam>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDynamicValue">
+            <summary>
+            Contract for dynamic value resolution.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.LoggerLevel">
+            <summary>
+              Supporting Logger levels.
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Off">
+            <summary>
+              Logging will be off
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Fatal">
+            <summary>
+              Fatal logging level
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Error">
+            <summary>
+              Error logging level
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Warn">
+            <summary>
+              Warn logging level
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Info">
+            <summary>
+              Info logging level
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Debug">
+            <summary>
+              Debug logging level
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.IInvocation">
+            <summary>
+              Encapsulates an invocation of a proxied method.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.GetArgumentValue(System.Int32)">
+            <summary>
+              Gets the value of the argument at the specified <paramref name = "index" />.
+            </summary>
+            <param name = "index">The index.</param>
+            <returns>The value of the argument at the specified <paramref name = "index" />.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.GetConcreteMethod">
+            <summary>
+              Returns the concrete instantiation of the <see cref="P:Castle.DynamicProxy.IInvocation.Method"/> on the proxy, with any generic
+              parameters bound to real types.
+            </summary>
+            <returns>
+              The concrete instantiation of the <see cref="P:Castle.DynamicProxy.IInvocation.Method"/> on the proxy, or the <see cref="P:Castle.DynamicProxy.IInvocation.Method"/> if
+              not a generic method.
+            </returns>
+            <remarks>
+              Can be slower than calling <see cref="P:Castle.DynamicProxy.IInvocation.Method"/>.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.GetConcreteMethodInvocationTarget">
+            <summary>
+              Returns the concrete instantiation of <see cref="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget"/>, with any
+              generic parameters bound to real types.
+              For interface proxies, this will point to the <see cref="T:System.Reflection.MethodInfo"/> on the target class.
+            </summary>
+            <returns>The concrete instantiation of <see cref="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget"/>, or
+              <see cref="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget"/> if not a generic method.</returns>
+            <remarks>
+              In debug builds this can be slower than calling <see cref="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget"/>.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.Proceed">
+            <summary>
+              Proceeds the call to the next interceptor in line, and ultimately to the target method.
+            </summary>
+            <remarks>
+              Since interface proxies without a target don't have the target implementation to proceed to,
+              it is important, that the last interceptor does not call this method, otherwise a
+              <see cref="T:System.NotImplementedException"/> will be thrown.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.SetArgumentValue(System.Int32,System.Object)">
+            <summary>
+              Overrides the value of an argument at the given <paramref name="index"/> with the
+              new <paramref name="value"/> provided.
+            </summary>
+            <remarks>
+              This method accepts an <see cref="T:System.Object"/>, however the value provided must be compatible
+              with the type of the argument defined on the method, otherwise an exception will be thrown.
+            </remarks>
+            <param name="index">The index of the argument to override.</param>
+            <param name="value">The new value for the argument.</param>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.Arguments">
+            <summary>
+              Gets the arguments that the <see cref="P:Castle.DynamicProxy.IInvocation.Method"/> has been invoked with.
+            </summary>
+            <value>The arguments the method was invoked with.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.GenericArguments">
+            <summary>
+              Gets the generic arguments of the method.
+            </summary>
+            <value>The generic arguments, or null if not a generic method.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.InvocationTarget">
+            <summary>
+              Gets the object on which the invocation is performed. This is different from proxy object
+              because most of the time this will be the proxy target object.
+            </summary>
+            <seealso cref="T:Castle.DynamicProxy.IChangeProxyTarget"/>
+            <value>The invocation target.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.Method">
+            <summary>
+              Gets the <see cref="T:System.Reflection.MethodInfo"/> representing the method being invoked on the proxy.
+            </summary>
+            <value>The <see cref="T:System.Reflection.MethodInfo"/> representing the method being invoked.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget">
+            <summary>
+              For interface proxies, this will point to the <see cref="T:System.Reflection.MethodInfo"/> on the target class.
+            </summary>
+            <value>The method invocation target.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.Proxy">
+            <summary>
+              Gets the proxy object on which the intercepted method is invoked.
+            </summary>
+            <value>Proxy object on which the intercepted method is invoked.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.ReturnValue">
+            <summary>
+              Gets or sets the return value of the method.
+            </summary>
+            <value>The return value of the method.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.TargetType">
+            <summary>
+              Gets the type of the target object for the intercepted method.
+            </summary>
+            <value>The type of the target object.</value>
+        </member>
+        <member name="T:Castle.DynamicProxy.IProxyGenerationHook">
+            <summary>
+              Used during the target type inspection process. Implementors have a chance to customize the
+              proxy generation process.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyGenerationHook.MethodsInspected">
+            <summary>
+              Invoked by the generation process to notify that the whole process has completed.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyGenerationHook.NonProxyableMemberNotification(System.Type,System.Reflection.MemberInfo)">
+            <summary>
+              Invoked by the generation process to notify that a member was not marked as virtual.
+            </summary>
+            <param name = "type">The type which declares the non-virtual member.</param>
+            <param name = "memberInfo">The non-virtual member.</param>
+            <remarks>
+              This method gives an opportunity to inspect any non-proxyable member of a type that has 
+              been requested to be proxied, and if appropriate - throw an exception to notify the caller.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyGenerationHook.ShouldInterceptMethod(System.Type,System.Reflection.MethodInfo)">
+            <summary>
+              Invoked by the generation process to determine if the specified method should be proxied.
+            </summary>
+            <param name = "type">The type which declares the given method.</param>
+            <param name = "methodInfo">The method to inspect.</param>
+            <returns>True if the given method should be proxied; false otherwise.</returns>
+        </member>
+        <member name="T:Castle.DynamicProxy.Contributors.ITypeContributor">
+            <summary>
+              Interface describing elements composing generated type
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Contributors.MembersCollector.AcceptMethod(System.Reflection.MethodInfo,System.Boolean,Castle.DynamicProxy.IProxyGenerationHook)">
+            <summary>
+              Performs some basic screening and invokes the <see cref="T:Castle.DynamicProxy.IProxyGenerationHook"/>
+              to select methods.
+            </summary>
+            <param name="method"></param>
+            <param name="onlyVirtuals"></param>
+            <param name="hook"></param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.DynamicProxy.IAttributeDisassembler">
+            <summary>
+              Provides functionality for disassembling instances of attributes to CustomAttributeBuilder form, during the process of emiting new types by Dynamic Proxy.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IAttributeDisassembler.Disassemble(System.Attribute)">
+            <summary>
+              Disassembles given attribute instance back to corresponding CustomAttributeBuilder.
+            </summary>
+            <param name="attribute">An instance of attribute to disassemble</param>
+            <returns><see cref="T:System.Reflection.Emit.CustomAttributeBuilder"/> corresponding 1 to 1 to given attribute instance, or null reference.</returns>
+            <remarks>
+              Implementers should return <see cref="T:System.Reflection.Emit.CustomAttributeBuilder"/> that corresponds to given attribute instance 1 to 1,
+              that is after calling specified constructor with specified arguments, and setting specified properties and fields with values specified
+              we should be able to get an attribute instance identical to the one passed in <paramref name="attribute"/>. Implementer can return null
+              if it wishes to opt out of replicating the attribute. Notice however, that for some cases, like attributes passed explicitly by the user
+              it is illegal to return null, and doing so will result in exception.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.AttributeDisassembler.HandleError(System.Type,System.Exception)">
+            <summary>
+              Handles error during disassembly process
+            </summary>
+            <param name = "attributeType">Type of the attribute being disassembled</param>
+            <param name = "exception">Exception thrown during the process</param>
+            <returns>usually null, or (re)throws the exception</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.AttributeDisassembler.InitializeConstructorArgs(System.Type,System.Attribute,System.Reflection.ParameterInfo[])">
+            <summary>
+              Here we try to match a constructor argument to its value.
+              Since we can't get the values from the assembly, we use some heuristics to get it.
+              a/ we first try to match all the properties on the attributes by name (case insensitive) to the argument
+              b/ if we fail we try to match them by property type, with some smarts about convertions (i,e: can use Guid for string).
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.AttributeDisassembler.ReplaceIfBetterMatch(System.Reflection.ParameterInfo,System.Reflection.PropertyInfo,System.Reflection.PropertyInfo)">
+            <summary>
+              We have the following rules here.
+              Try to find a matching type, failing that, if the parameter is string, get the first property (under the assumption that
+              we can convert it.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.AttributeDisassembler.ConvertValue(System.Object,System.Type)">
+            <summary>
+              Attributes can only accept simple types, so we return null for null,
+              if the value is passed as string we call to string (should help with converting), 
+              otherwise, we use the value as is (enums, integer, etc).
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.TypeUtil.GetAllInterfaces(System.Type[])">
+            <summary>
+              Returns list of all unique interfaces implemented given types, including their base interfaces.
+            </summary>
+            <param name="types"> </param>
+            <returns> </returns>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.BaseProxyGenerator">
+            <summary>
+              Base class that exposes the common functionalities
+              to proxy generation.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.BaseProxyGenerator.AddMappingNoCheck(System.Type,Castle.DynamicProxy.Contributors.ITypeContributor,System.Collections.Generic.IDictionary{System.Type,Castle.DynamicProxy.Contributors.ITypeContributor})">
+            <summary>
+              It is safe to add mapping (no mapping for the interface exists)
+            </summary>
+            <param name = "implementer"></param>
+            <param name = "interface"></param>
+            <param name = "mapping"></param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.BaseProxyGenerator.GenerateParameterlessConstructor(Castle.DynamicProxy.Generators.Emitters.ClassEmitter,System.Type,Castle.DynamicProxy.Generators.Emitters.SimpleAST.FieldReference)">
+            <summary>
+              Generates a parameters constructor that initializes the proxy
+              state with <see cref="T:Castle.DynamicProxy.StandardInterceptor"/> just to make it non-null.
+              <para>
+                This constructor is important to allow proxies to be XML serializable
+              </para>
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.InvocationTypeGenerator.GetBaseCtorArguments(System.Type,Castle.DynamicProxy.ProxyGenerationOptions,System.Reflection.ConstructorInfo@)">
+            <summary>
+              Generates the constructor for the class that extends
+              <see cref="T:Castle.DynamicProxy.AbstractInvocation"/>
+            </summary>
+            <param name="targetFieldType"></param>
+            <param name="proxyGenerationOptions"></param>
+            <param name="baseConstructor"></param>
+        </member>
+        <member name="T:Castle.DynamicProxy.DefaultProxyBuilder">
+            <summary>
+              Default implementation of <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> interface producing in-memory proxy assemblies.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.IProxyBuilder">
+            <summary>
+              Abstracts the implementation of proxy type construction.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyBuilder.CreateClassProxyType(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates a proxy type for given <paramref name="classToProxy"/>, implementing <paramref name="additionalInterfacesToProxy"/>, using <paramref name="options"/> provided.
+            </summary>
+            <param name="classToProxy">The class type to proxy.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types to proxy.</param>
+            <param name="options">The proxy generation options.</param>
+            <returns>The generated proxy type.</returns>
+            <remarks>
+              Implementers should return a proxy type for the specified class and interfaces.
+              Additional interfaces should be only 'mark' interfaces, that is, they should work like interface proxy without target. (See <see cref="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)"/> method.)
+            </remarks>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is not public.
+              Note that to avoid this exception, you can mark offending type internal, and define <see cref="T:System.Runtime.CompilerServices.InternalsVisibleToAttribute"/> 
+              pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate.</exception>
+            <seealso cref="T:Castle.DynamicProxy.Generators.ClassProxyGenerator"/>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithTarget(System.Type,System.Type[],System.Type,Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates a proxy type that proxies calls to <paramref name="interfaceToProxy"/> members on <paramref name="targetType"/>, implementing <paramref name="additionalInterfacesToProxy"/>, using <paramref name="options"/> provided.
+            </summary>
+            <param name="interfaceToProxy">The interface type to proxy.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types to proxy.</param>
+            <param name="targetType">Type implementing <paramref name="interfaceToProxy"/> on which calls to the interface members should be intercepted.</param>
+            <param name="options">The proxy generation options.</param>
+            <returns>The generated proxy type.</returns>
+            <remarks>
+              Implementers should return a proxy type for the specified interface that 'proceeds' executions to the specified target.
+              Additional interfaces should be only 'mark' interfaces, that is, they should work like interface proxy without target. (See <see cref="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)"/> method.)
+            </remarks>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is not public.
+              Note that to avoid this exception, you can mark offending type internal, and define <see cref="T:System.Runtime.CompilerServices.InternalsVisibleToAttribute"/> 
+              pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate.</exception>
+            <seealso cref="T:Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator"/>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithTargetInterface(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates a proxy type for given <paramref name="interfaceToProxy"/> and <parmaref name="additionalInterfacesToProxy"/> that delegates all calls to the provided interceptors and allows interceptors to switch the actual target of invocation.
+            </summary>
+            <param name="interfaceToProxy">The interface type to proxy.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types to proxy.</param>
+            <param name="options">The proxy generation options.</param>
+            <returns>The generated proxy type.</returns>
+            <remarks>
+              Implementers should return a proxy type for the specified interface(s) that delegate all executions to the specified interceptors
+              and uses an instance of the interface as their targets (i.e. <see cref="P:Castle.DynamicProxy.IInvocation.InvocationTarget"/>), rather than a class. All <see cref="T:Castle.DynamicProxy.IInvocation"/> classes should then implement <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface,
+              to allow interceptors to switch invocation target with instance of another type implementing called interface.
+            </remarks>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is not public.
+              Note that to avoid this exception, you can mark offending type internal, and define <see cref="T:System.Runtime.CompilerServices.InternalsVisibleToAttribute"/> 
+              pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate.</exception>
+            <seealso cref="T:Castle.DynamicProxy.Generators.InterfaceProxyWithTargetInterfaceGenerator"/>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates a proxy type for given <paramref name="interfaceToProxy"/> that delegates all calls to the provided interceptors.
+            </summary>
+            <param name="interfaceToProxy">The interface type to proxy.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types to proxy.</param>
+            <param name="options">The proxy generation options.</param>
+            <returns>The generated proxy type.</returns>
+            <remarks>
+              Implementers should return a proxy type for the specified interface and additional interfaces that delegate all executions to the specified interceptors.
+            </remarks>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is not public.
+              Note that to avoid this exception, you can mark offending type internal, and define <see cref="T:System.Runtime.CompilerServices.InternalsVisibleToAttribute"/> 
+              pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate.</exception>
+            <seealso cref="T:Castle.DynamicProxy.Generators.InterfaceProxyWithoutTargetGenerator"/>
+        </member>
+        <member name="P:Castle.DynamicProxy.IProxyBuilder.Logger">
+            <summary>
+              Gets or sets the <see cref="T:Castle.Core.Logging.ILogger"/> that this <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> logs to.
+            </summary>
+        </member>
+        <member name="P:Castle.DynamicProxy.IProxyBuilder.ModuleScope">
+            <summary>
+              Gets the <see cref="P:Castle.DynamicProxy.IProxyBuilder.ModuleScope"/> associated with this builder.
+            </summary>
+            <value>The module scope associated with this builder.</value>
+        </member>
+        <member name="M:Castle.DynamicProxy.DefaultProxyBuilder.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.DefaultProxyBuilder"/> class with new <see cref="P:Castle.DynamicProxy.DefaultProxyBuilder.ModuleScope"/>.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.DefaultProxyBuilder.#ctor(Castle.DynamicProxy.ModuleScope)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.DefaultProxyBuilder"/> class.
+            </summary>
+            <param name="scope">The module scope for generated proxy types.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.AttributeUtil.AddDisassembler``1(Castle.DynamicProxy.IAttributeDisassembler)">
+            <summary>
+              Registers custom disassembler to handle disassembly of specified type of attributes.
+            </summary>
+            <typeparam name="TAttribute">Type of attributes to handle</typeparam>
+            <param name="disassembler">Disassembler converting existing instances of Attributes to CustomAttributeBuilders</param>
+            <remarks>
+              When disassembling an attribute Dynamic Proxy will first check if an custom disassembler has been registered to handle attributes of that type, 
+              and if none is found, it'll use the <see cref="P:Castle.DynamicProxy.Internal.AttributeUtil.FallbackDisassembler"/>.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.AttributeUtil.ShouldSkipAttributeReplication(System.Type)">
+            <summary>
+              Attributes should be replicated if they are non-inheritable,
+              but there are some special cases where the attributes means
+              something to the CLR, where they should be skipped.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.CacheKey.#ctor(System.Reflection.MemberInfo,System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.Generators.CacheKey"/> class.
+            </summary>
+            <param name="target">Target element. This is either target type or target method for invocation types.</param>
+            <param name="type">The type of the proxy. This is base type for invocation types.</param>
+            <param name="interfaces">The interfaces.</param>
+            <param name="options">The options.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.CacheKey.#ctor(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.Generators.CacheKey"/> class.
+            </summary>
+            <param name="target">Type of the target.</param>
+            <param name="interfaces">The interfaces.</param>
+            <param name="options">The options.</param>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.LdcOpCodesDictionary">
+            <summary>
+              s
+              Provides appropriate Ldc.X opcode for the type of primitive value to be loaded.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.LdindOpCodesDictionary">
+            <summary>
+              Provides appropriate Ldind.X opcode for 
+              the type of primitive value to be loaded indirectly.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.Emitters.OpCodeUtil.EmitLoadIndirectOpCodeForType(System.Reflection.Emit.ILGenerator,System.Type)">
+            <summary>
+              Emits a load indirect opcode of the appropriate type for a value or object reference.
+              Pops a pointer off the evaluation stack, dereferences it and loads
+              a value of the specified type.
+            </summary>
+            <param name = "gen"></param>
+            <param name = "type"></param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.Emitters.OpCodeUtil.EmitLoadOpCodeForConstantValue(System.Reflection.Emit.ILGenerator,System.Object)">
+            <summary>
+              Emits a load opcode of the appropriate kind for a constant string or
+              primitive value.
+            </summary>
+            <param name = "gen"></param>
+            <param name = "value"></param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.Emitters.OpCodeUtil.EmitLoadOpCodeForDefaultValueOfType(System.Reflection.Emit.ILGenerator,System.Type)">
+            <summary>
+              Emits a load opcode of the appropriate kind for the constant default value of a
+              type, such as 0 for value types and null for reference types.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.Emitters.OpCodeUtil.EmitStoreIndirectOpCodeForType(System.Reflection.Emit.ILGenerator,System.Type)">
+            <summary>
+              Emits a store indirectopcode of the appropriate type for a value or object reference.
+              Pops a value of the specified type and a pointer off the evaluation stack, and
+              stores the value.
+            </summary>
+            <param name = "gen"></param>
+            <param name = "type"></param>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.PropertiesCollection">
+            <summary>
+              Summary description for PropertiesCollection.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.SimpleAST.IndirectReference">
+            <summary>
+              Wraps a reference that is passed 
+              ByRef and provides indirect load/store support.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.SimpleAST.NewArrayExpression">
+            <summary>
+              Summary description for NewArrayExpression.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.SimpleAST.ReferencesToObjectArrayExpression">
+            <summary>
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.StindOpCodesDictionary">
+            <summary>
+              Provides appropriate Stind.X opcode 
+              for the type of primitive value to be stored indirectly.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.MetaEvent.#ctor(System.String,System.Type,System.Type,Castle.DynamicProxy.Generators.MetaMethod,Castle.DynamicProxy.Generators.MetaMethod,System.Reflection.EventAttributes)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.Generators.MetaEvent"/> class.
+            </summary>
+            <param name="name">The name.</param>
+            <param name="declaringType">Type declaring the original event being overriten, or null.</param>
+            <param name="eventDelegateType"></param>
+            <param name="adder">The add method.</param>
+            <param name="remover">The remove method.</param>
+            <param name="attributes">The attributes.</param>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.INamingScope">
+            <summary>
+              Represents the scope of uniquenes of names for types and their members
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.INamingScope.GetUniqueName(System.String)">
+            <summary>
+              Gets a unique name based on <paramref name="suggestedName"/>
+            </summary>
+            <param name="suggestedName">Name suggested by the caller</param>
+            <returns>Unique name based on <paramref name="suggestedName"/>.</returns>
+            <remarks>
+              Implementers should provide name as closely resembling <paramref name="suggestedName"/> as possible.
+              Generally if no collision occurs it is suggested to return suggested name, otherwise append sequential suffix.
+              Implementers must return deterministic names, that is when <see cref="M:Castle.DynamicProxy.Generators.INamingScope.GetUniqueName(System.String)"/> is called twice 
+              with the same suggested name, the same returned name should be provided each time. Non-deterministic return
+              values, like appending random suffices will break serialization of proxies.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.INamingScope.SafeSubScope">
+            <summary>
+              Returns new, disposable naming scope. It is responsibilty of the caller to make sure that no naming collision
+              with enclosing scope, or other subscopes is possible.
+            </summary>
+            <returns>New naming scope.</returns>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.MethodFinder">
+            <summary>
+              Returns the methods implemented by a type. Use this instead of Type.GetMethods() to work around a CLR issue
+              where duplicate MethodInfos are returned by Type.GetMethods() after a token of a generic type's method was loaded.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.InternalsUtil.IsInternal(System.Reflection.MethodBase)">
+            <summary>
+              Determines whether the specified method is internal.
+            </summary>
+            <param name = "method">The method.</param>
+            <returns>
+              <c>true</c> if the specified method is internal; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.InternalsUtil.IsInternalToDynamicProxy(System.Reflection.Assembly)">
+            <summary>
+              Determines whether this assembly has internals visible to dynamic proxy.
+            </summary>
+            <param name = "asm">The assembly to inspect.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.InternalsUtil.IsAccessible(System.Reflection.MethodBase)">
+            <summary>
+              Checks if the method is public or protected.
+            </summary>
+            <param name = "method"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.MixinData.#ctor(System.Collections.Generic.IEnumerable{System.Object})">
+            <summary>
+              Because we need to cache the types based on the mixed in mixins, we do the following here:
+              - Get all the mixin interfaces
+              - Sort them by full name
+              - Return them by position
+            
+            The idea is to have reproducible behavior for the case that mixins are registered in different orders.
+            This method is here because it is required 
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.ModuleScope">
+            <summary>
+              Summary description for ModuleScope.
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.ModuleScope.DEFAULT_FILE_NAME">
+            <summary>
+              The default file name used when the assembly is saved using <see cref="F:Castle.DynamicProxy.ModuleScope.DEFAULT_FILE_NAME"/>.
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.ModuleScope.DEFAULT_ASSEMBLY_NAME">
+            <summary>
+              The default assembly (simple) name used for the assemblies generated by a <see cref="T:Castle.DynamicProxy.ModuleScope"/> instance.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class; assemblies created by this instance will not be saved.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor(System.Boolean)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class, allowing to specify whether the assemblies generated by this instance
+              should be saved.
+            </summary>
+            <param name="savePhysicalAssembly">If set to <c>true</c> saves the generated module.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor(System.Boolean,System.Boolean)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class, allowing to specify whether the assemblies generated by this instance
+              should be saved.
+            </summary>
+            <param name="savePhysicalAssembly">If set to <c>true</c> saves the generated module.</param>
+            <param name="disableSignedModule">If set to <c>true</c> disables ability to generate signed module. This should be used in cases where ran under constrained permissions.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor(System.Boolean,System.Boolean,System.String,System.String,System.String,System.String)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class, allowing to specify whether the assemblies generated by this instance
+              should be saved and what simple names are to be assigned to them.
+            </summary>
+            <param name="savePhysicalAssembly">If set to <c>true</c> saves the generated module.</param>
+            <param name="disableSignedModule">If set to <c>true</c> disables ability to generate signed module. This should be used in cases where ran under constrained permissions.</param>
+            <param name="strongAssemblyName">The simple name of the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="strongModulePath">The path and file name of the manifest module of the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="weakAssemblyName">The simple name of the weak-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="weakModulePath">The path and file name of the manifest module of the weak-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor(System.Boolean,System.Boolean,Castle.DynamicProxy.Generators.INamingScope,System.String,System.String,System.String,System.String)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class, allowing to specify whether the assemblies generated by this instance
+              should be saved and what simple names are to be assigned to them.
+            </summary>
+            <param name="savePhysicalAssembly">If set to <c>true</c> saves the generated module.</param>
+            <param name="disableSignedModule">If set to <c>true</c> disables ability to generate signed module. This should be used in cases where ran under constrained permissions.</param>
+            <param name="namingScope">Naming scope used to provide unique names to generated types and their members (usually via sub-scopes).</param>
+            <param name="strongAssemblyName">The simple name of the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="strongModulePath">The path and file name of the manifest module of the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="weakAssemblyName">The simple name of the weak-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="weakModulePath">The path and file name of the manifest module of the weak-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.GetFromCache(Castle.DynamicProxy.Generators.CacheKey)">
+            <summary>
+              Returns a type from this scope's type cache, or null if the key cannot be found.
+            </summary>
+            <param name = "key">The key to be looked up in the cache.</param>
+            <returns>The type from this scope's type cache matching the key, or null if the key cannot be found</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.RegisterInCache(Castle.DynamicProxy.Generators.CacheKey,System.Type)">
+            <summary>
+              Registers a type in this scope's type cache.
+            </summary>
+            <param name = "key">The key to be associated with the type.</param>
+            <param name = "type">The type to be stored in the cache.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.GetKeyPair">
+            <summary>
+              Gets the key pair used to sign the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.ObtainDynamicModule(System.Boolean)">
+            <summary>
+              Gets the specified module generated by this scope, creating a new one if none has yet been generated.
+            </summary>
+            <param name = "isStrongNamed">If set to true, a strong-named module is returned; otherwise, a weak-named module is returned.</param>
+            <returns>A strong-named or weak-named module generated by this scope, as specified by the <paramref
+               name = "isStrongNamed" /> parameter.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.ObtainDynamicModuleWithStrongName">
+            <summary>
+              Gets the strong-named module generated by this scope, creating a new one if none has yet been generated.
+            </summary>
+            <returns>A strong-named module generated by this scope.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.ObtainDynamicModuleWithWeakName">
+            <summary>
+              Gets the weak-named module generated by this scope, creating a new one if none has yet been generated.
+            </summary>
+            <returns>A weak-named module generated by this scope.</returns>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.Lock">
+            <summary>
+              Users of this <see cref="T:Castle.DynamicProxy.ModuleScope"/> should use this lock when accessing the cache.
+            </summary>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.StrongNamedModule">
+            <summary>
+              Gets the strong-named module generated by this scope, or <see langword = "null" /> if none has yet been generated.
+            </summary>
+            <value>The strong-named module generated by this scope, or <see langword = "null" /> if none has yet been generated.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.StrongNamedModuleName">
+            <summary>
+              Gets the file name of the strongly named module generated by this scope.
+            </summary>
+            <value>The file name of the strongly named module generated by this scope.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.WeakNamedModule">
+            <summary>
+              Gets the weak-named module generated by this scope, or <see langword = "null" /> if none has yet been generated.
+            </summary>
+            <value>The weak-named module generated by this scope, or <see langword = "null" /> if none has yet been generated.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.WeakNamedModuleName">
+            <summary>
+              Gets the file name of the weakly named module generated by this scope.
+            </summary>
+            <value>The file name of the weakly named module generated by this scope.</value>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerationOptions.#ctor(Castle.DynamicProxy.IProxyGenerationHook)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerationOptions"/> class.
+            </summary>
+            <param name="hook">The hook.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerationOptions.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerationOptions"/> class.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.ProxyGenerator">
+            <summary>
+              Provides proxy objects for classes and interfaces.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.#ctor(Castle.DynamicProxy.IProxyBuilder)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> class.
+            </summary>
+            <param name="builder">Proxy types builder.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.#ctor(System.Boolean)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> class.
+            </summary>
+            <param name="disableSignedModule">If <c>true</c> forces all types to be generated into an unsigned module.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget``1(``0,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface implemented by <paramref name="target"/> which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>Object proxying calls to members of <typeparamref name="TInterface"/> on <paramref name="target"/> object.</returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/>is not an interface type.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface``1(``0,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget``1(``0,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface implemented by <paramref name="target"/> which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/>is not an interface type.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface``1(``0,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Object,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types  on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Type[],System.Object,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface``1(``0,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface implemented by <paramref name="target"/> which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> type on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface``1(``0,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface implemented by <paramref name="target"/> which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> type on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Type[],System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget``1(Castle.DynamicProxy.IInterceptor)">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on target object generated at runtime with given <paramref name="interceptor"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface which will be proxied.</typeparam>
+            <param name="interceptor">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptor"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              As a result of that also at least one <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementation must be provided.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget``1(Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface which will be proxied.</typeparam>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              As a result of that also at least one <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementation must be provided.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget``1(Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface which will be proxied.</typeparam>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              As a result of that also at least one <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementation must be provided.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,Castle.DynamicProxy.IInterceptor)">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptor"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="interceptor">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptor"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/>  is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of <paramref name="additionalInterfacesToProxy"/> to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget``1(``0,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <typeparamref name="TClass"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TClass">Type of class which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <typeparamref name="TClass"/> proxying calls to virtual members of <typeparamref name="TClass"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TClass"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <typeparamref name="TClass"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <typeparamref name="TClass"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget``1(``0,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <typeparamref name="TClass"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TClass">Type of class which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <typeparamref name="TClass"/> proxying calls to virtual members of <typeparamref name="TClass"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TClass"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <typeparamref name="TClass"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <typeparamref name="TClass"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Object,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no parameterless constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy``1(Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <typeparamref name="TClass"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TClass">Type of class which will be proxied.</typeparam>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <typeparamref name="TClass"/> proxying calls to virtual members of <typeparamref name="TClass"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TClass"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <typeparamref name="TClass"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <typeparamref name="TClass"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy``1(Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <typeparamref name="TClass"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TClass">Type of class which will be proxied.</typeparam>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <typeparamref name="TClass"/> proxying calls to virtual members of <typeparamref name="TClass"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TClass"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <typeparamref name="TClass"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <typeparamref name="TClass"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,System.Type[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,Castle.DynamicProxy.ProxyGenerationOptions,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no parameterless constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyType(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates the proxy type for class proxy with given <paramref name="classToProxy"/> class, implementing given <paramref name="additionalInterfacesToProxy"/> and using provided <paramref name="options"/>.
+            </summary>
+            <param name="classToProxy">The base class for proxy type.</param>
+            <param name="additionalInterfacesToProxy">The interfaces that proxy type should implement.</param>
+            <param name="options">The options for proxy generation process.</param>
+            <returns><see cref="T:System.Type"/> of proxy.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyTypeWithTarget(System.Type,System.Type[],System.Type,Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates the proxy type for interface proxy with target for given <paramref name="interfaceToProxy"/> interface, implementing given <paramref name="additionalInterfacesToProxy"/> on given <paramref name="targetType"/> and using provided <paramref name="options"/>.
+            </summary>
+            <param name="interfaceToProxy">The interface proxy type should implement.</param>
+            <param name="additionalInterfacesToProxy">The additional interfaces proxy type should implement.</param>
+            <param name="targetType">Actual type that the proxy type will encompass.</param>
+            <param name="options">The options for proxy generation process.</param>
+            <returns><see cref="T:System.Type"/> of proxy.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyTypeWithTargetInterface(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates the proxy type for interface proxy with target interface for given <paramref name="interfaceToProxy"/> interface, implementing given <paramref name="additionalInterfacesToProxy"/> on given <paramref name="interfaceToProxy"/> and using provided <paramref name="options"/>.
+            </summary>
+            <param name="interfaceToProxy">The interface proxy type should implement.</param>
+            <param name="additionalInterfacesToProxy">The additional interfaces proxy type should implement.</param>
+            <param name="options">The options for proxy generation process.</param>
+            <returns><see cref="T:System.Type"/> of proxy.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyTypeWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates the proxy type for interface proxy without target for given <paramref name="interfaceToProxy"/> interface, implementing given <paramref name="additionalInterfacesToProxy"/> and using provided <paramref name="options"/>.
+            </summary>
+            <param name="interfaceToProxy">The interface proxy type should implement.</param>
+            <param name="additionalInterfacesToProxy">The additional interfaces proxy type should implement.</param>
+            <param name="options">The options for proxy generation process.</param>
+            <returns><see cref="T:System.Type"/> of proxy.</returns>
+        </member>
+        <member name="P:Castle.DynamicProxy.ProxyGenerator.Logger">
+            <summary>
+              Gets or sets the <see cref="T:Castle.Core.Logging.ILogger"/> that this <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> log to.
+            </summary>
+        </member>
+        <member name="P:Castle.DynamicProxy.ProxyGenerator.ProxyBuilder">
+            <summary>
+              Gets the proxy builder instance used to generate proxy types.
+            </summary>
+            <value>The proxy builder.</value>
+        </member>
+        <member name="M:Castle.DynamicProxy.SilverlightExtensions.Extensions.IsNested(System.Type)">
+            <summary>
+            The silverlight System.Type is missing the IsNested property so this exposes similar functionality.
+            </summary>
+            <param name="type"></param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.DynamicProxy.Tokens.InvocationMethods">
+            <summary>
+              Holds <see cref="T:System.Reflection.MethodInfo"/> objects representing methods of <see cref="T:Castle.DynamicProxy.AbstractInvocation"/> class.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.IInterceptorSelector">
+            <summary>
+              Provides an extension point that allows proxies to choose specific interceptors on
+              a per method basis.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInterceptorSelector.SelectInterceptors(System.Type,System.Reflection.MethodInfo,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Selects the interceptors that should intercept calls to the given <paramref name="method"/>.
+            </summary>
+            <param name="type">The type declaring the method to intercept.</param>
+            <param name="method">The method that will be intercepted.</param>
+            <param name="interceptors">All interceptors registered with the proxy.</param>
+            <returns>An array of interceptors to invoke upon calling the <paramref name="method"/>.</returns>
+            <remarks>
+              This method is called only once per proxy instance, upon the first call to the
+              <paramref name="method"/>. Either an empty array or null are valid return values to indicate
+              that no interceptor should intercept calls to the method. Although it is not advised, it is
+              legal to return other <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations than these provided in
+              <paramref name="interceptors"/>.
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.Internal.Lock.Create">
+            <summary>
+            Creates a new lock.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.IServiceProviderExAccessor">
+            <summary>
+            This interface should be implemented by classes
+            that are available in a bigger context, exposing
+            the container to different areas in the same application.
+            <para>
+            For example, in Web application, the (global) HttpApplication
+            subclasses should implement this interface to expose 
+            the configured container
+            </para>
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.IChangeProxyTarget">
+            <summary>
+              Exposes means to change target objects of proxies and invocations
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IChangeProxyTarget.ChangeInvocationTarget(System.Object)">
+            <summary>
+              Changes the target object (<see cref="P:Castle.DynamicProxy.IInvocation.InvocationTarget"/>) of current <see cref="T:Castle.DynamicProxy.IInvocation"/>.
+            </summary>
+            <param name="target">The new value of target of invocation.</param>
+            <remarks>
+              Although the method takes <see cref="T:System.Object"/> the actual instance must be of type assignable to <see cref="P:Castle.DynamicProxy.IInvocation.TargetType"/>, otherwise an <see cref="T:System.InvalidCastException"/> will be thrown.
+              Also while it's technically legal to pass null reference (Nothing in Visual Basic) as <paramref name="target"/>, for obvious reasons Dynamic Proxy will not be able to call the intercepted method on such target.
+              In this case last interceptor in the pipeline mustn't call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/> or a <see cref="T:System.NotImplementedException"/> will be throws.
+              Also while it's technically legal to pass proxy itself as <paramref name="target"/>, this would create stack overflow.
+              In this case last interceptor in the pipeline mustn't call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/> or a <see cref="T:System.InvalidOperationException"/> will be throws.
+            </remarks>
+            <exception cref="T:System.InvalidCastException">Thrown when <paramref name="target"/> is not assignable to the proxied type.</exception>
+        </member>
+        <member name="M:Castle.DynamicProxy.IChangeProxyTarget.ChangeProxyTarget(System.Object)">
+            <summary>
+              Permanently changes the target object of the proxy. This does not affect target of the current invocation.
+            </summary>
+            <param name="target">The new value of target of the proxy.</param>
+            <remarks>
+              Although the method takes <see cref="T:System.Object"/> the actual instance must be of type assignable to proxy's target type, otherwise an <see cref="T:System.InvalidCastException"/> will be thrown.
+              Also while it's technically legal to pass null reference (Nothing in Visual Basic) as <paramref name="target"/>, for obvious reasons Dynamic Proxy will not be able to call the intercepted method on such target.
+              In this case last interceptor in the pipeline mustn't call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/> or a <see cref="T:System.NotImplementedException"/> will be throws.
+              Also while it's technically legal to pass proxy itself as <paramref name="target"/>, this would create stack overflow.
+              In this case last interceptor in the pipeline mustn't call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/> or a <see cref="T:System.InvalidOperationException"/> will be throws.
+            </remarks>
+            <exception cref="T:System.InvalidCastException">Thrown when <paramref name="target"/> is not assignable to the proxied type.</exception>
+        </member>
+        <member name="T:Castle.DynamicProxy.IInterceptor">
+            <summary>
+              New interface that is going to be used by DynamicProxy 2
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyTargetAccessor.DynProxyGetTarget">
+            <summary>
+              Get the proxy target (note that null is a valid target!)
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyTargetAccessor.GetInterceptors">
+            <summary>
+              Gets the interceptors for the proxy
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.IServiceEnabledComponent">
+            <summary>
+            Defines that the implementation wants a 
+            <see cref="T:System.IServiceProvider"/> in order to 
+            access other components. The creator must be aware
+            that the component might (or might not) implement 
+            the interface.
+            </summary>
+            <remarks>
+            Used by Castle Project components to, for example, 
+            gather logging factories
+            </remarks>
+        </member>
+        <member name="T:Castle.Core.IServiceProviderEx">
+            <summary>
+            Increments <c>IServiceProvider</c> with a generic service resolution operation.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.IExtendedLoggerFactory">
+            <summary>
+              Provides a factory that can produce either <see cref="T:Castle.Core.Logging.ILogger"/> or
+              <see cref="T:Castle.Core.Logging.IExtendedLogger"/> classes.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.ILoggerFactory">
+            <summary>
+              Manages the instantiation of <see cref="T:Castle.Core.Logging.ILogger"/>s.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ILoggerFactory.Create(System.Type)">
+            <summary>
+              Creates a new logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ILoggerFactory.Create(System.String)">
+            <summary>
+              Creates a new logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ILoggerFactory.Create(System.Type,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ILoggerFactory.Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.IExtendedLoggerFactory.Create(System.Type)">
+            <summary>
+              Creates a new extended logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.IExtendedLoggerFactory.Create(System.String)">
+            <summary>
+              Creates a new extended logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.IExtendedLoggerFactory.Create(System.Type,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new extended logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.IExtendedLoggerFactory.Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new extended logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Create(System.Type)">
+            <summary>
+              Creates a new extended logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Create(System.String)">
+            <summary>
+              Creates a new extended logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Create(System.Type,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new extended logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new extended logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Castle#Core#Logging#ILoggerFactory#Create(System.Type)">
+            <summary>
+              Creates a new logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Castle#Core#Logging#ILoggerFactory#Create(System.String)">
+            <summary>
+              Creates a new logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Castle#Core#Logging#ILoggerFactory#Create(System.Type,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Castle#Core#Logging#ILoggerFactory#Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.GetConfigFile(System.String)">
+            <summary>
+              Gets the configuration file.
+            </summary>
+            <param name = "fileName">i.e. log4net.config</param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.Logging.IContextProperties">
+            <summary>
+              Interface for Context Properties implementations
+            </summary>
+            <remarks>
+              <para>
+                This interface defines a basic property get set accessor.
+              </para>
+              <para>
+                Based on the ContextPropertiesBase of log4net, by Nicko Cadell.
+              </para>
+            </remarks>
+        </member>
+        <member name="P:Castle.Core.Logging.IContextProperties.Item(System.String)">
+            <summary>
+              Gets or sets the value of a property
+            </summary>
+            <value>
+              The value for the property with the specified key
+            </value>
+            <remarks>
+              <para>
+                Gets or sets the value of a property
+              </para>
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractLoggerFactory.GetConfigFile(System.String)">
+            <summary>
+              Gets the configuration file.
+            </summary>
+            <param name = "fileName">i.e. log4net.config</param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.Logging.NullLogFactory">
+            <summary>
+            NullLogFactory used when logging is turned off.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogFactory.Create(System.String)">
+            <summary>
+              Creates an instance of ILogger with the specified name.
+            </summary>
+            <param name = "name">Name.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogFactory.Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates an instance of ILogger with the specified name and LoggerLevel.
+            </summary>
+            <param name = "name">Name.</param>
+            <param name = "level">Level.</param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.Logging.IExtendedLogger">
+            <summary>
+              Provides an interface that supports <see cref="T:Castle.Core.Logging.ILogger"/> and
+              allows the storage and retrieval of Contexts. These are supported in
+              both log4net and NLog.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.ILogger">
+            <summary>
+              Manages logging.
+            </summary>
+            <remarks>
+              This is a facade for the different logging subsystems.
+              It offers a simplified interface that follows IOC patterns
+              and a simplified priority/level/severity abstraction.
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.CreateChildLogger(System.String)">
+            <summary>
+              Create a new child logger.
+              The name of the child logger is [current-loggers-name].[passed-in-name]
+            </summary>
+            <param name="loggerName">The Subname of this logger.</param>
+            <returns>The New ILogger instance.</returns>
+            <exception cref="T:System.ArgumentException">If the name has an empty element name.</exception>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Debug(System.String)">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Debug(System.Func{System.String})">
+            <summary>
+              Logs a debug message with lazily constructed message. The message will be constructed only if the <see cref="P:Castle.Core.Logging.ILogger.IsDebugEnabled"/> is true.
+            </summary>
+            <param name="messageFactory"></param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Debug(System.String,System.Exception)">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.DebugFormat(System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.DebugFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.DebugFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.DebugFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Error(System.String)">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Error(System.Func{System.String})">
+            <summary>
+              Logs an error message with lazily constructed message. The message will be constructed only if the <see cref="P:Castle.Core.Logging.ILogger.IsErrorEnabled"/> is true.
+            </summary>
+            <param name="messageFactory"></param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Error(System.String,System.Exception)">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.ErrorFormat(System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.ErrorFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.ErrorFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.ErrorFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Fatal(System.String)">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Fatal(System.Func{System.String})">
+            <summary>
+              Logs a fatal message with lazily constructed message. The message will be constructed only if the <see cref="P:Castle.Core.Logging.ILogger.IsFatalEnabled"/> is true.
+            </summary>
+            <param name="messageFactory"></param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Fatal(System.String,System.Exception)">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalFormat(System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Info(System.String)">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Info(System.Func{System.String})">
+            <summary>
+              Logs a info message with lazily constructed message. The message will be constructed only if the <see cref="P:Castle.Core.Logging.ILogger.IsInfoEnabled"/> is true.
+            </summary>
+            <param name="messageFactory"></param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Info(System.String,System.Exception)">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.InfoFormat(System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.InfoFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.InfoFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.InfoFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Warn(System.String)">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Warn(System.Func{System.String})">
+            <summary>
+              Logs a warn message with lazily constructed message. The message will be constructed only if the <see cref="P:Castle.Core.Logging.ILogger.IsWarnEnabled"/> is true.
+            </summary>
+            <param name="messageFactory"></param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Warn(System.String,System.Exception)">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.WarnFormat(System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.WarnFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.WarnFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.WarnFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsDebugEnabled">
+            <summary>
+              Determines if messages of priority "debug" will be logged.
+            </summary>
+            <value>True if "debug" messages will be logged.</value>
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsErrorEnabled">
+            <summary>
+              Determines if messages of priority "error" will be logged.
+            </summary>
+            <value>True if "error" messages will be logged.</value>
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsFatalEnabled">
+            <summary>
+              Determines if messages of priority "fatal" will be logged.
+            </summary>
+            <value>True if "fatal" messages will be logged.</value>
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsInfoEnabled">
+            <summary>
+              Determines if messages of priority "info" will be logged.
+            </summary>
+            <value>True if "info" messages will be logged.</value>
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsWarnEnabled">
+            <summary>
+              Determines if messages of priority "warn" will be logged.
+            </summary>
+            <value>True if "warn" messages will be logged.</value>
+        </member>
+        <member name="P:Castle.Core.Logging.IExtendedLogger.GlobalProperties">
+            <summary>
+              Exposes the Global Context of the extended logger.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.IExtendedLogger.ThreadProperties">
+            <summary>
+              Exposes the Thread Context of the extended logger.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.IExtendedLogger.ThreadStacks">
+            <summary>
+              Exposes the Thread Stack of the extended logger.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.ConsoleLogger">
+            <summary>
+            The Logger sending everything to the standard output streams.
+            This is mainly for the cases when you have a utility that
+            does not have a logger to supply.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.LevelFilteredLogger">
+            <summary>
+            The Level Filtered Logger class.  This is a base clase which
+            provides a LogLevel attribute and reroutes all functions into
+            one Log method.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.#ctor">
+            <summary>
+              Creates a new <c>LevelFilteredLogger</c>.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Debug(System.String)">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Debug(System.String,System.Exception)">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.DebugFormat(System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.DebugFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.DebugFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.DebugFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Info(System.String)">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Info(System.String,System.Exception)">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InfoFormat(System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InfoFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InfoFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InfoFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Warn(System.String)">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Warn(System.String,System.Exception)">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.WarnFormat(System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.WarnFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.WarnFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.WarnFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Error(System.String)">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Error(System.String,System.Exception)">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.ErrorFormat(System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.ErrorFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.ErrorFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.ErrorFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Fatal(System.String)">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Fatal(System.String,System.Exception)">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalFormat(System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Log(Castle.Core.Logging.LoggerLevel,System.String,System.String,System.Exception)">
+            <summary>
+              Implementors output the log content by implementing this method only.
+              Note that exception can be null
+            </summary>
+            <param name = "loggerLevel"></param>
+            <param name = "loggerName"></param>
+            <param name = "message"></param>
+            <param name = "exception"></param>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.Level">
+            <value>
+              The <c>LoggerLevel</c> that this logger
+              will be using. Defaults to <c>LoggerLevel.Off</c>
+            </value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.Name">
+            <value>
+              The name that this logger will be using. 
+              Defaults to <c>String.Empty</c>
+            </value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsDebugEnabled">
+            <summary>
+              Determines if messages of priority "debug" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Debug"/> bit</value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsInfoEnabled">
+            <summary>
+              Determines if messages of priority "info" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Info"/> bit</value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsWarnEnabled">
+            <summary>
+              Determines if messages of priority "warn" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Warn"/> bit</value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsErrorEnabled">
+            <summary>
+              Determines if messages of priority "error" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Error"/> bit</value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsFatalEnabled">
+            <summary>
+              Determines if messages of priority "fatal" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Fatal"/> bit</value>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.#ctor">
+            <summary>
+              Creates a new ConsoleLogger with the <c>Level</c>
+              set to <c>LoggerLevel.Debug</c> and the <c>Name</c>
+              set to <c>String.Empty</c>.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.#ctor(Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new ConsoleLogger with the <c>Name</c>
+              set to <c>String.Empty</c>.
+            </summary>
+            <param name = "logLevel">The logs Level.</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.#ctor(System.String)">
+            <summary>
+              Creates a new ConsoleLogger with the <c>Level</c>
+              set to <c>LoggerLevel.Debug</c>.
+            </summary>
+            <param name = "name">The logs Name.</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.#ctor(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new ConsoleLogger.
+            </summary>
+            <param name = "name">The logs Name.</param>
+            <param name = "logLevel">The logs Level.</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.Log(Castle.Core.Logging.LoggerLevel,System.String,System.String,System.Exception)">
+            <summary>
+              A Common method to log.
+            </summary>
+            <param name = "loggerLevel">The level of logging</param>
+            <param name = "loggerName">The name of the logger</param>
+            <param name = "message">The Message</param>
+            <param name = "exception">The Exception</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.CreateChildLogger(System.String)">
+            <summary>
+              Returns a new <c>ConsoleLogger</c> with the name
+              added after this loggers name, with a dot in between.
+            </summary>
+            <param name = "loggerName">The added hierarchical name.</param>
+            <returns>A new <c>ConsoleLogger</c>.</returns>
+        </member>
+        <member name="T:Castle.Core.Logging.NullLogger">
+            <summary>
+              The Null Logger class.  This is useful for implementations where you need
+              to provide a logger to a utility class, but do not want any output from it.
+              It also helps when you have a utility that does not have a logger to supply.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.CreateChildLogger(System.String)">
+            <summary>
+              Returns this <c>NullLogger</c>.
+            </summary>
+            <param name = "loggerName">Ignored</param>
+            <returns>This ILogger instance.</returns>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Debug(System.String)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Debug(System.String,System.Exception)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.DebugFormat(System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.DebugFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.DebugFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.DebugFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Error(System.String)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Error(System.String,System.Exception)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.ErrorFormat(System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.ErrorFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.ErrorFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.ErrorFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Fatal(System.String)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Fatal(System.String,System.Exception)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalFormat(System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Info(System.String)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Info(System.String,System.Exception)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.InfoFormat(System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.InfoFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.InfoFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.InfoFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Warn(System.String)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Warn(System.String,System.Exception)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.WarnFormat(System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.WarnFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.WarnFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.WarnFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.GlobalProperties">
+            <summary>
+              Returns empty context properties.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.ThreadProperties">
+            <summary>
+              Returns empty context properties.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.ThreadStacks">
+            <summary>
+              Returns empty context stacks.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsDebugEnabled">
+            <summary>
+              No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsErrorEnabled">
+            <summary>
+              No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsFatalEnabled">
+            <summary>
+              No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsInfoEnabled">
+            <summary>
+              No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsWarnEnabled">
+            <summary>
+              No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="T:Castle.Core.Logging.StreamLogger">
+            <summary>
+            The Stream Logger class.  This class can stream log information
+            to any stream, it is suitable for storing a log file to disk,
+            or to a <c>MemoryStream</c> for testing your components.
+            </summary>
+            <remarks>
+            This logger is not thread safe.
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.Logging.StreamLogger.#ctor(System.String,System.IO.Stream)">
+            <summary>
+              Creates a new <c>StreamLogger</c> with default encoding 
+              and buffer size. Initial Level is set to Debug.
+            </summary>
+            <param name = "name">
+              The name of the log.
+            </param>
+            <param name = "stream">
+              The stream that will be used for logging,
+              seeking while the logger is alive 
+            </param>
+        </member>
+        <member name="M:Castle.Core.Logging.StreamLogger.#ctor(System.String,System.IO.Stream,System.Text.Encoding)">
+            <summary>
+              Creates a new <c>StreamLogger</c> with default buffer size.
+              Initial Level is set to Debug.
+            </summary>
+            <param name="name">
+              The name of the log.
+            </param>
+            <param name="stream">
+              The stream that will be used for logging,
+              seeking while the logger is alive 
+            </param>
+            <param name="encoding">
+              The encoding that will be used for this stream.
+              <see cref="T:System.IO.StreamWriter"/>
+            </param>
+        </member>
+        <member name="M:Castle.Core.Logging.StreamLogger.#ctor(System.String,System.IO.Stream,System.Text.Encoding,System.Int32)">
+            <summary>
+              Creates a new <c>StreamLogger</c>. 
+              Initial Level is set to Debug.
+            </summary>
+            <param name="name">
+              The name of the log.
+            </param>
+            <param name="stream">
+              The stream that will be used for logging,
+              seeking while the logger is alive 
+            </param>
+            <param name="encoding">
+              The encoding that will be used for this stream.
+              <see cref="T:System.IO.StreamWriter"/>
+            </param>
+            <param name="bufferSize">
+              The buffer size that will be used for this stream.
+              <see cref="T:System.IO.StreamWriter"/>
+            </param>
+        </member>
+        <member name="M:Castle.Core.Logging.StreamLogger.#ctor(System.String,System.IO.StreamWriter)">
+            <summary>
+              Creates a new <c>StreamLogger</c> with 
+              Debug as default Level.
+            </summary>
+            <param name = "name">The name of the log.</param>
+            <param name = "writer">The <c>StreamWriter</c> the log will write to.</param>
+        </member>
+        <member name="T:Castle.Core.Configuration.AbstractConfiguration">
+            <summary>
+              This is an abstract <see cref="T:Castle.Core.Configuration.IConfiguration"/> implementation
+              that deals with methods that can be abstracted away
+              from underlying implementations.
+            </summary>
+            <remarks>
+              <para><b>AbstractConfiguration</b> makes easier to implementers 
+                to create a new version of <see cref="T:Castle.Core.Configuration.IConfiguration"/></para>
+            </remarks>
+        </member>
+        <member name="T:Castle.Core.Configuration.IConfiguration">
+            <summary>
+            <see cref="T:Castle.Core.Configuration.IConfiguration"/> is a interface encapsulating a configuration node
+            used to retrieve configuration values.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.IConfiguration.GetValue(System.Type,System.Object)">
+            <summary>
+            Gets the value of the node and converts it 
+            into specified <see cref="T:System.Type"/>.
+            </summary>
+            <param name="type">The <see cref="T:System.Type"/></param>
+            <param name="defaultValue">
+            The Default value returned if the conversion fails.
+            </param>
+            <returns>The Value converted into the specified type.</returns>
+        </member>
+        <member name="P:Castle.Core.Configuration.IConfiguration.Name">
+            <summary>
+            Gets the name of the node.
+            </summary>
+            <value>
+            The Name of the node.
+            </value> 
+        </member>
+        <member name="P:Castle.Core.Configuration.IConfiguration.Value">
+            <summary>
+            Gets the value of the node.
+            </summary>
+            <value>
+            The Value of the node.
+            </value> 
+        </member>
+        <member name="P:Castle.Core.Configuration.IConfiguration.Children">
+            <summary>
+            Gets an <see cref="T:Castle.Core.Configuration.ConfigurationCollection"/> of <see cref="T:Castle.Core.Configuration.IConfiguration"/>
+            elements containing all node children.
+            </summary>
+            <value>The Collection of child nodes.</value>
+        </member>
+        <member name="P:Castle.Core.Configuration.IConfiguration.Attributes">
+            <summary>
+            Gets an <see cref="T:System.Collections.IDictionary"/> of the configuration attributes.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.AbstractConfiguration.GetValue(System.Type,System.Object)">
+            <summary>
+              Gets the value of the node and converts it
+              into specified <see cref="T:System.Type"/>.
+            </summary>
+            <param name="type">The <see cref="T:System.Type"/></param>
+            <param name="defaultValue">
+              The Default value returned if the conversion fails.
+            </param>
+            <returns>The Value converted into the specified type.</returns>
+        </member>
+        <member name="P:Castle.Core.Configuration.AbstractConfiguration.Attributes">
+            <summary>
+              Gets node attributes.
+            </summary>
+            <value>
+              All attributes of the node.
+            </value>
+        </member>
+        <member name="P:Castle.Core.Configuration.AbstractConfiguration.Children">
+            <summary>
+              Gets all child nodes.
+            </summary>
+            <value>The <see cref="T:Castle.Core.Configuration.ConfigurationCollection"/> of child nodes.</value>
+        </member>
+        <member name="P:Castle.Core.Configuration.AbstractConfiguration.Name">
+            <summary>
+              Gets the name of the <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </summary>
+            <value>
+              The Name of the <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </value>
+        </member>
+        <member name="P:Castle.Core.Configuration.AbstractConfiguration.Value">
+            <summary>
+              Gets the value of <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </summary>
+            <value>
+              The Value of the <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </value>
+        </member>
+        <member name="T:Castle.Core.Configuration.ConfigurationCollection">
+            <summary>
+            A collection of <see cref="T:Castle.Core.Configuration.IConfiguration"/> objects.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.ConfigurationCollection.#ctor">
+            <summary>
+            Creates a new instance of <c>ConfigurationCollection</c>.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.ConfigurationCollection.#ctor(System.Collections.Generic.IEnumerable{Castle.Core.Configuration.IConfiguration})">
+            <summary>
+            Creates a new instance of <c>ConfigurationCollection</c>.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Configuration.MutableConfiguration">
+            <summary>
+            Summary description for MutableConfiguration.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.MutableConfiguration.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Core.Configuration.MutableConfiguration"/> class.
+            </summary>
+            <param name="name">The name.</param>
+        </member>
+        <member name="P:Castle.Core.Configuration.MutableConfiguration.Value">
+            <summary>
+            Gets the value of <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </summary>
+            <value>
+            The Value of the <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </value>
+        </member>
+        <member name="T:Castle.Core.Pair`2">
+            <summary>
+            General purpose class to represent a standard pair of values. 
+            </summary>
+            <typeparam name="TFirst">Type of the first value</typeparam>
+            <typeparam name="TSecond">Type of the second value</typeparam>
+        </member>
+        <member name="M:Castle.Core.Pair`2.#ctor(`0,`1)">
+            <summary>
+            Constructs a pair with its values
+            </summary>
+            <param name="first"></param>
+            <param name="second"></param>
+        </member>
+        <member name="T:Castle.Core.ProxyServices">
+            <summary>
+            List of utility methods related to dynamic proxy operations
+            </summary>
+        </member>
+        <member name="M:Castle.Core.ProxyServices.IsDynamicProxy(System.Type)">
+            <summary>
+            Determines whether the specified type is a proxy generated by
+            DynamicProxy (1 or 2).
+            </summary>
+            <param name="type">The type.</param>
+            <returns>
+            	<c>true</c> if it is a proxy; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="T:Castle.Core.ReflectionBasedDictionaryAdapter">
+            <summary>
+            Readonly implementation of <see cref="T:System.Collections.IDictionary"/> which uses an anonymous object as its source. Uses names of properties as keys, and property values as... well - values. Keys are not case sensitive.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.#ctor(System.Object)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.Core.ReflectionBasedDictionaryAdapter"/> class.
+            </summary>
+            <param name="target">The target.</param>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Add(System.Object,System.Object)">
+            <summary>
+              Adds an element with the provided key and value to the <see cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <param name = "key">The <see cref = "T:System.Object" /> to use as the key of the element to add.</param>
+            <param name = "value">The <see cref = "T:System.Object" /> to use as the value of the element to add.</param>
+            <exception cref = "T:System.ArgumentNullException">
+              <paramref name = "key" /> is null. </exception>
+            <exception cref = "T:System.ArgumentException">An element with the same key already exists in the <see
+               cref = "T:System.Collections.IDictionary" /> object. </exception>
+            <exception cref = "T:System.NotSupportedException">The <see cref = "T:System.Collections.IDictionary" /> is read-only.-or- The <see
+               cref = "T:System.Collections.IDictionary" /> has a fixed size. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Clear">
+            <summary>
+              Removes all elements from the <see cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <exception cref = "T:System.NotSupportedException">The <see cref = "T:System.Collections.IDictionary" /> object is read-only. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Contains(System.Object)">
+            <summary>
+              Determines whether the <see cref = "T:System.Collections.IDictionary" /> object contains an element with the specified key.
+            </summary>
+            <param name = "key">The key to locate in the <see cref = "T:System.Collections.IDictionary" /> object.</param>
+            <returns>
+              true if the <see cref = "T:System.Collections.IDictionary" /> contains an element with the key; otherwise, false.
+            </returns>
+            <exception cref = "T:System.ArgumentNullException">
+              <paramref name = "key" /> is null. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Remove(System.Object)">
+            <summary>
+              Removes the element with the specified key from the <see cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <param name = "key">The key of the element to remove.</param>
+            <exception cref = "T:System.ArgumentNullException">
+              <paramref name = "key" /> is null. </exception>
+            <exception cref = "T:System.NotSupportedException">The <see cref = "T:System.Collections.IDictionary" /> object is read-only.-or- The <see
+               cref = "T:System.Collections.IDictionary" /> has a fixed size. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.GetEnumerator">
+            <summary>
+              Returns an enumerator that iterates through a collection.
+            </summary>
+            <returns>
+              An <see cref = "T:System.Collections.IEnumerator" /> object that can be used to iterate through the collection.
+            </returns>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.System#Collections#ICollection#CopyTo(System.Array,System.Int32)">
+            <summary>
+              Copies the elements of the <see cref = "T:System.Collections.ICollection" /> to an <see cref = "T:System.Array" />, starting at a particular <see
+               cref = "T:System.Array" /> index.
+            </summary>
+            <param name = "array">The one-dimensional <see cref = "T:System.Array" /> that is the destination of the elements copied from <see
+               cref = "T:System.Collections.ICollection" />. The <see cref = "T:System.Array" /> must have zero-based indexing.</param>
+            <param name = "index">The zero-based index in <paramref name = "array" /> at which copying begins.</param>
+            <exception cref = "T:System.ArgumentNullException">
+              <paramref name = "array" /> is null. </exception>
+            <exception cref = "T:System.ArgumentOutOfRangeException">
+              <paramref name = "index" /> is less than zero. </exception>
+            <exception cref = "T:System.ArgumentException">
+              <paramref name = "array" /> is multidimensional.-or- <paramref name = "index" /> is equal to or greater than the length of <paramref
+               name = "array" />.-or- The number of elements in the source <see cref = "T:System.Collections.ICollection" /> is greater than the available space from <paramref
+               name = "index" /> to the end of the destination <paramref name = "array" />. </exception>
+            <exception cref = "T:System.ArgumentException">The type of the source <see cref = "T:System.Collections.ICollection" /> cannot be cast automatically to the type of the destination <paramref
+               name = "array" />. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.System#Collections#IDictionary#GetEnumerator">
+            <summary>
+              Returns an <see cref = "T:System.Collections.IDictionaryEnumerator" /> object for the <see
+               cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <returns>
+              An <see cref = "T:System.Collections.IDictionaryEnumerator" /> object for the <see
+               cref = "T:System.Collections.IDictionary" /> object.
+            </returns>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Read(System.Collections.IDictionary,System.Object)">
+            <summary>
+              Reads values of properties from <paramref name = "valuesAsAnonymousObject" /> and inserts them into <paramref
+               name = "targetDictionary" /> using property names as keys.
+            </summary>
+            <param name = "targetDictionary"></param>
+            <param name = "valuesAsAnonymousObject"></param>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.Count">
+            <summary>
+              Gets the number of elements contained in the <see cref = "T:System.Collections.ICollection" />.
+            </summary>
+            <value></value>
+            <returns>The number of elements contained in the <see cref = "T:System.Collections.ICollection" />.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.IsSynchronized">
+            <summary>
+              Gets a value indicating whether access to the <see cref = "T:System.Collections.ICollection" /> is synchronized (thread safe).
+            </summary>
+            <value></value>
+            <returns>true if access to the <see cref = "T:System.Collections.ICollection" /> is synchronized (thread safe); otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.SyncRoot">
+            <summary>
+              Gets an object that can be used to synchronize access to the <see cref = "T:System.Collections.ICollection" />.
+            </summary>
+            <value></value>
+            <returns>An object that can be used to synchronize access to the <see cref = "T:System.Collections.ICollection" />.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.IsReadOnly">
+            <summary>
+              Gets a value indicating whether the <see cref = "T:System.Collections.IDictionary" /> object is read-only.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref = "T:System.Collections.IDictionary" /> object is read-only; otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.Item(System.Object)">
+            <summary>
+              Gets or sets the <see cref="T:System.Object"/> with the specified key.
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.Keys">
+            <summary>
+              Gets an <see cref = "T:System.Collections.ICollection" /> object containing the keys of the <see
+               cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <value></value>
+            <returns>An <see cref = "T:System.Collections.ICollection" /> object containing the keys of the <see
+               cref = "T:System.Collections.IDictionary" /> object.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.Values">
+            <summary>
+              Gets an <see cref = "T:System.Collections.ICollection" /> object containing the values in the <see
+               cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <value></value>
+            <returns>An <see cref = "T:System.Collections.ICollection" /> object containing the values in the <see
+               cref = "T:System.Collections.IDictionary" /> object.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.System#Collections#IDictionary#IsFixedSize">
+            <summary>
+              Gets a value indicating whether the <see cref = "T:System.Collections.IDictionary" /> object has a fixed size.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref = "T:System.Collections.IDictionary" /> object has a fixed size; otherwise, false.</returns>
+        </member>
+        <member name="T:Castle.Core.Resource.IResource">
+            <summary>
+            Represents a 'streamable' resource. Can
+            be a file, a resource in an assembly.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Resource.IResource.GetStreamReader">
+            <summary>
+            Returns a reader for the stream
+            </summary>
+            <remarks>
+            It's up to the caller to dispose the reader.
+            </remarks>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Resource.IResource.GetStreamReader(System.Text.Encoding)">
+            <summary>
+            Returns a reader for the stream
+            </summary>
+            <remarks>
+            It's up to the caller to dispose the reader.
+            </remarks>
+            <param name="encoding"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Resource.IResource.CreateRelative(System.String)">
+            <summary>
+            Returns an instance of <see cref="T:Castle.Core.Resource.IResource"/>
+            created according to the <c>relativePath</c>
+            using itself as the root.
+            </summary>
+            <param name="relativePath"></param>
+            <returns></returns>
+        </member>
+        <member name="P:Castle.Core.Resource.IResource.FileBasePath">
+            <summary>
+            
+            </summary>
+            <remarks>
+            Only valid for resources that
+            can be obtained through relative paths
+            </remarks>
+        </member>
+        <member name="T:Castle.Core.Resource.AbstractStreamResource">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Resource.AbstractStreamResource.createStream">
+            <summary>
+            This returns a new stream instance each time it is called.
+            It is the responsibility of the caller to dispose of this stream
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Resource.IResourceFactory">
+            <summary>
+            Depicts the contract for resource factories.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Resource.IResourceFactory.Accept(Castle.Core.Resource.CustomUri)">
+            <summary>
+            Used to check whether the resource factory
+            is able to deal with the given resource
+            identifier.
+            </summary>
+            <remarks>
+            Implementors should return <c>true</c>
+            only if the given identifier is supported
+            by the resource factory
+            </remarks>
+            <param name="uri"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Resource.IResourceFactory.Create(Castle.Core.Resource.CustomUri)">
+            <summary>
+            Creates an <see cref="T:Castle.Core.Resource.IResource"/> instance
+            for the given resource identifier
+            </summary>
+            <param name="uri"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Resource.IResourceFactory.Create(Castle.Core.Resource.CustomUri,System.String)">
+            <summary>
+            Creates an <see cref="T:Castle.Core.Resource.IResource"/> instance
+            for the given resource identifier
+            </summary>
+            <param name="uri"></param>
+            <param name="basePath"></param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.Resource.FileResource">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Resource.StaticContentResource">
+            <summary>
+            Adapts a static string content as an <see cref="T:Castle.Core.Resource.IResource"/>
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Resource.UncResource">
+            <summary>
+            Enable access to files on network shares
+            </summary>
+        </member>
+    </members>
+</doc>
Binary file packages/Castle.Core.3.2.1/lib/sl5/Castle.Core.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/Castle.Core.3.2.1/lib/sl5/Castle.Core.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4223 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>Castle.Core</name>
+    </assembly>
+    <members>
+        <member name="T:Castle.Components.DictionaryAdapter.ReferenceAttribute">
+            <summary>
+            Specifies assignment by reference rather than by copying.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IfExistsAttribute">
+            <summary>
+            Suppresses any on-demand behaviors.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.RemoveIfEmptyAttribute">
+            <summary>
+            Removes a property if null or empty string, guid or collection.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.RemoveIfAttribute">
+            <summary>
+            Removes a property if matches value.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.DictionaryBehaviorAttribute">
+            <summary>
+            Assigns a specific dictionary key.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryBehavior">
+            <summary>
+            Defines the contract for customizing dictionary access.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryBehavior.Copy">
+            <summary>
+            Copies the dictionary behavior.
+            </summary>
+            <returns>null if should not be copied.  Otherwise copy.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.IDictionaryBehavior.ExecutionOrder">
+            <summary>
+            Determines relative order to apply related behaviors.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryPropertySetter">
+            <summary>
+            Defines the contract for updating dictionary values.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryPropertySetter.SetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object@,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Sets the stored dictionary value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="value">The stored value.</param>
+            <param name="property">The property.</param>
+            <returns>true if the property should be stored.</returns>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.ICondition">
+            <summary>
+            Contract for value matching.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.VolatileAttribute">
+            <summary>
+            Indicates that underlying values are changeable and should not be cached.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryInitializer">
+            <summary>
+             Contract for dictionary initialization.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryInitializer.Initialize(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.Object[])">
+            <summary>
+            Performs any initialization of the <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/>
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="behaviors">The dictionary behaviors.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapterVisitor">
+            <summary>
+            Abstract implementation of <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapterVisitor"/>.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryAdapterVisitor">
+            <summary>
+            Conract for traversing a <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/>.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryCreate">
+            <summary>
+            Contract for creating additional Dictionary adapters.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter">
+            <summary>
+            Contract for manipulating the Dictionary adapter.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryEdit">
+            <summary>
+            Contract for editing the Dictionary adapter.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryNotify">
+            <summary>
+            Contract for managing Dictionary adapter notifications.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryValidate">
+            <summary>
+            Contract for validating Dictionary adapter.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryBehaviorBuilder">
+            <summary>
+            Defines the contract for building <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryBehavior"/>s.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryBehaviorBuilder.BuildBehaviors">
+            <summary>
+            Builds the dictionary behaviors.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter">
+            <summary>
+            Abstract adapter for the <see cref="T:System.Collections.IDictionary"/> support
+            needed by the <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory"/>
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Add(System.Object,System.Object)">
+            <summary>
+            Adds an element with the provided key and value to the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <param name="key">The <see cref="T:System.Object"></see> to use as the key of the element to add.</param>
+            <param name="value">The <see cref="T:System.Object"></see> to use as the value of the element to add.</param>
+            <exception cref="T:System.ArgumentException">An element with the same key already exists in the <see cref="T:System.Collections.IDictionary"></see> object. </exception>
+            <exception cref="T:System.ArgumentNullException">key is null. </exception>
+            <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.IDictionary"></see> is read-only.-or- The <see cref="T:System.Collections.IDictionary"></see> has a fixed size. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Clear">
+            <summary>
+            Removes all elements from the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.IDictionary"></see> object is read-only. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Contains(System.Object)">
+            <summary>
+            Determines whether the <see cref="T:System.Collections.IDictionary"></see> object contains an element with the specified key.
+            </summary>
+            <param name="key">The key to locate in the <see cref="T:System.Collections.IDictionary"></see> object.</param>
+            <returns>
+            true if the <see cref="T:System.Collections.IDictionary"></see> contains an element with the key; otherwise, false.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">key is null. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.GetEnumerator">
+            <summary>
+            Returns an <see cref="T:System.Collections.IDictionaryEnumerator"></see> object for the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <returns>
+            An <see cref="T:System.Collections.IDictionaryEnumerator"></see> object for the <see cref="T:System.Collections.IDictionary"></see> object.
+            </returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Remove(System.Object)">
+            <summary>
+            Removes the element with the specified key from the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <param name="key">The key of the element to remove.</param>
+            <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.IDictionary"></see> object is read-only.-or- The <see cref="T:System.Collections.IDictionary"></see> has a fixed size. </exception>
+            <exception cref="T:System.ArgumentNullException">key is null. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.CopyTo(System.Array,System.Int32)">
+            <summary>
+            Copies the elements of the <see cref="T:System.Collections.ICollection"></see> to an <see cref="T:System.Array"></see>, starting at a particular <see cref="T:System.Array"></see> index.
+            </summary>
+            <param name="array">The one-dimensional <see cref="T:System.Array"></see> that is the destination of the elements copied from <see cref="T:System.Collections.ICollection"></see>. The <see cref="T:System.Array"></see> must have zero-based indexing.</param>
+            <param name="index">The zero-based index in array at which copying begins.</param>
+            <exception cref="T:System.ArgumentNullException">array is null. </exception>
+            <exception cref="T:System.ArgumentException">The type of the source <see cref="T:System.Collections.ICollection"></see> cannot be cast automatically to the type of the destination array. </exception>
+            <exception cref="T:System.ArgumentOutOfRangeException">index is less than zero. </exception>
+            <exception cref="T:System.ArgumentException">array is multidimensional.-or- index is equal to or greater than the length of array.-or- The number of elements in the source <see cref="T:System.Collections.ICollection"></see> is greater than the available space from index to the end of the destination array. </exception>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.System#Collections#IEnumerable#GetEnumerator">
+            <summary>
+            Returns an enumerator that iterates through a collection.
+            </summary>
+            <returns>
+            An <see cref="T:System.Collections.IEnumerator"></see> object that can be used to iterate through the collection.
+            </returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.IsFixedSize">
+            <summary>
+            Gets a value indicating whether the <see cref="T:System.Collections.IDictionary"></see> object has a fixed size.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref="T:System.Collections.IDictionary"></see> object has a fixed size; otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.IsReadOnly">
+            <summary>
+            Gets a value indicating whether the <see cref="T:System.Collections.IDictionary"></see> object is read-only.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref="T:System.Collections.IDictionary"></see> object is read-only; otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Keys">
+            <summary>
+            Gets an <see cref="T:System.Collections.ICollection"></see> object containing the keys of the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <value></value>
+            <returns>An <see cref="T:System.Collections.ICollection"></see> object containing the keys of the <see cref="T:System.Collections.IDictionary"></see> object.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Values">
+            <summary>
+            Gets an <see cref="T:System.Collections.ICollection"></see> object containing the values in the <see cref="T:System.Collections.IDictionary"></see> object.
+            </summary>
+            <value></value>
+            <returns>An <see cref="T:System.Collections.ICollection"></see> object containing the values in the <see cref="T:System.Collections.IDictionary"></see> object.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Item(System.Object)">
+            <summary>
+            Gets or sets the <see cref="T:System.Object"/> with the specified key.
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.Count">
+            <summary>
+            Gets the number of elements contained in the <see cref="T:System.Collections.ICollection"></see>.
+            </summary>
+            <value></value>
+            <returns>The number of elements contained in the <see cref="T:System.Collections.ICollection"></see>.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.IsSynchronized">
+            <summary>
+            Gets a value indicating whether access to the <see cref="T:System.Collections.ICollection"></see> is synchronized (thread safe).
+            </summary>
+            <value></value>
+            <returns>true if access to the <see cref="T:System.Collections.ICollection"></see> is synchronized (thread safe); otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.AbstractDictionaryAdapter.SyncRoot">
+            <summary>
+            Gets an object that can be used to synchronize access to the <see cref="T:System.Collections.ICollection"></see>.
+            </summary>
+            <value></value>
+            <returns>An object that can be used to synchronize access to the <see cref="T:System.Collections.ICollection"></see>.</returns>
+        </member>
+        <member name="M:Castle.Core.Internal.CollectionExtensions.IsNullOrEmpty(System.Collections.IEnumerable)">
+            <summary>
+              Checks whether or not collection is null or empty. Assumes colleciton can be safely enumerated multiple times.
+            </summary>
+            <param name = "this"></param>
+            <returns></returns>
+        </member>
+        <member name="F:Castle.Core.Internal.InternalsVisible.ToCastleCore">
+            <summary>
+              Constant to use when making assembly internals visible to Castle.Core 
+              <c>[assembly: InternalsVisibleTo(CoreInternalsVisible.ToCastleCore)]</c>
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Internal.InternalsVisible.ToDynamicProxyGenAssembly2">
+            <summary>
+              Constant to use when making assembly internals visible to proxy types generated by DynamicProxy. Required when proxying internal types.
+              <c>[assembly: InternalsVisibleTo(CoreInternalsVisible.ToDynamicProxyGenAssembly2)]</c>
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.ComponentAttribute">
+            <summary>
+            Identifies a property should be represented as a nested component.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryKeyBuilder">
+            <summary>
+            Defines the contract for building typed dictionary keys.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryKeyBuilder.GetKey(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Builds the specified key.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The current key.</param>
+            <param name="property">The property.</param>
+            <returns>The updated key</returns>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryPropertyGetter">
+            <summary>
+            Defines the contract for retrieving dictionary values.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryPropertyGetter.GetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object,Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Boolean)">
+            <summary>
+            Gets the effective dictionary value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="storedValue">The stored value.</param>
+            <param name="property">The property.</param>
+            <param name="ifExists">true if return only existing.</param>
+            <returns>The effective property value.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.ComponentAttribute.NoPrefix">
+            <summary>
+            Applies no prefix.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.ComponentAttribute.Prefix">
+            <summary>
+            Gets or sets the prefix.
+            </summary>
+            <value>The prefix.</value>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.DictionaryAdapterAttribute">
+            <summary>
+            Identifies the dictionary adapter types.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.FetchAttribute">
+            <summary>
+            Identifies an interface or property to be pre-fetched.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.FetchAttribute.#ctor">
+            <summary>
+            Instructs fetching to occur.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.FetchAttribute.#ctor(System.Boolean)">
+            <summary>
+            Instructs fetching according to <paramref name="fetch"/>
+            </summary>
+            <param name="fetch"></param>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.FetchAttribute.Fetch">
+            <summary>
+            Gets whether or not fetching should occur.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.GroupAttribute">
+            <summary>
+            Assigns a property to a group.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.GroupAttribute.#ctor(System.Object)">
+            <summary>
+            Constructs a group assignment.
+            </summary>
+            <param name="group">The group name.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.GroupAttribute.#ctor(System.Object[])">
+            <summary>
+            Constructs a group assignment.
+            </summary>
+            <param name="group">The group name.</param>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.GroupAttribute.Group">
+            <summary>
+            Gets the group the property is assigned to.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.KeyAttribute">
+            <summary>
+            Assigns a specific dictionary key.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeyAttribute.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeyAttribute"/> class.
+            </summary>
+            <param name="key">The key.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeyAttribute.#ctor(System.String[])">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeyAttribute"/> class.
+            </summary>
+            <param name="keys">The compound key.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.KeyPrefixAttribute">
+            <summary>
+            Assigns a prefix to the keyed properties of an interface.
+            </summary>
+            <remarks>
+            Key prefixes are not inherited by sub-interfaces.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeyPrefixAttribute.#ctor">
+            <summary>
+            Initializes a default instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeyPrefixAttribute"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeyPrefixAttribute.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeyPrefixAttribute"/> class.
+            </summary>
+            <param name="keyPrefix">The prefix for the keyed properties of the interface.</param>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.KeyPrefixAttribute.KeyPrefix">
+            <summary>
+            Gets the prefix key added to the properties of the interface.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.KeySubstitutionAttribute">
+            <summary>
+            Substitutes part of key with another string.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.KeySubstitutionAttribute.#ctor(System.String,System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.KeySubstitutionAttribute"/> class.
+            </summary>
+            <param name="oldValue">The old value.</param>
+            <param name="newValue">The new value.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.MultiLevelEditAttribute">
+            <summary>
+            Requests support for multi-level editing.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.NewGuidAttribute">
+            <summary>
+            Generates a new GUID on demand.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.OnDemandAttribute">
+            <summary>
+            Support for on-demand value resolution.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.StringFormatAttribute">
+            <summary>
+            Provides simple string formatting from existing properties.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.StringFormatAttribute.Format">
+            <summary>
+            Gets the string format.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.StringFormatAttribute.Properties">
+            <summary>
+            Gets the format properties.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.StringListAttribute">
+            <summary>
+            Identifies a property should be represented as a delimited string value.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.StringListAttribute.Separator">
+            <summary>
+            Gets the separator.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.StringValuesAttribute">
+            <summary>
+            Converts all properties to strings.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.StringValuesAttribute.Format">
+            <summary>
+            Gets or sets the format.
+            </summary>
+            <value>The format.</value>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.SuppressNotificationsAttribute">
+            <summary>
+            Suppress property change notifications.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IPropertyDescriptorInitializer">
+            <summary>
+             Contract for property descriptor initialization.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IPropertyDescriptorInitializer.Initialize(Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Object[])">
+            <summary>
+            Performs any initialization of the <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <param name="propertyDescriptor">The property descriptor.</param>
+            <param name="behaviors">The property behaviors.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.TypeKeyPrefixAttribute">
+            <summary>
+            Assigns a prefix to the keyed properties using the interface name.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.DefaultPropertyGetter">
+            <summary>
+            Manages conversion between property values.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DefaultPropertyGetter.#ctor(System.ComponentModel.TypeConverter)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.DefaultPropertyGetter"/> class.
+            </summary>
+            <param name="converter">The converter.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DefaultPropertyGetter.GetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object,Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Boolean)">
+            <summary>
+            Gets the effective dictionary value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="storedValue">The stored value.</param>
+            <param name="property">The property.</param>
+            <param name="ifExists">true if return only existing.</param>
+            <returns>The effective property value.</returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.DefaultPropertyGetter.ExecutionOrder">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory">
+            <summary>
+            Uses Reflection.Emit to expose the properties of a dictionary
+            through a dynamic implementation of a typed interface.
+            </summary>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory">
+            <summary>
+            Defines the contract for building typed dictionary adapters.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter``1(System.Collections.IDictionary)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Collections.IDictionary"/>.
+            </summary>
+            <typeparam name="T">The typed interface.</typeparam>
+            <param name="dictionary">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the dictionary.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.IDictionary)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Collections.IDictionary"/>.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="dictionary">The underlying source of properties.</param>
+            <returns>An implementation of the typed interface bound to the dictionary.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.IDictionary,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Gets a typed adapter bound to the <see cref="T:System.Collections.IDictionary"/>.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="dictionary">The underlying source of properties.</param>
+            <param name="descriptor">The property descriptor.</param>
+            <returns>An implementation of the typed interface bound to the dictionary.</returns>
+            <remarks>
+            The type represented by T must be an interface with properties.
+            </remarks>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapterMeta(System.Type)">
+            <summary>
+            Gets the <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> associated with the type.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <returns>The adapter meta-data.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapterMeta(System.Type,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Gets the <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> associated with the type.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="descriptor">The property descriptor.</param>
+            <returns>The adapter meta-data.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory.GetAdapterMeta(System.Type,Castle.Components.DictionaryAdapter.DictionaryAdapterMeta)">
+            <summary>
+            Gets the <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> associated with the type.
+            </summary>
+            <param name="type">The typed interface.</param>
+            <param name="other">Another <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> from which to copy behaviors.</param>
+            <returns>The adapter meta-data.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter``1(System.Collections.IDictionary)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.IDictionary)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter(System.Type,System.Collections.IDictionary,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter``2(System.Collections.Generic.IDictionary{System.String,``1})">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapter``1(System.Type,System.Collections.Generic.IDictionary{System.String,``0})">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapterMeta(System.Type)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapterMeta(System.Type,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <inheritdoc />
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.DictionaryAdapterFactory.GetAdapterMeta(System.Type,Castle.Components.DictionaryAdapter.DictionaryAdapterMeta)">
+            <inheritdoc />
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryMetaInitializer">
+            <summary>
+             Contract for dictionary meta-data initialization.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryMetaInitializer.Initialize(Castle.Components.DictionaryAdapter.IDictionaryAdapterFactory,Castle.Components.DictionaryAdapter.DictionaryAdapterMeta)">
+            <summary>
+            	Initializes the given <see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> object.
+            </summary>
+            <param name="factory">The dictionary adapter factory.</param>
+            <param name="dictionaryMeta">The dictionary adapter meta.</param>
+            
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryMetaInitializer.ShouldHaveBehavior(System.Object)">
+            <summary>
+            	Determines whether the given behavior should be included in a new
+            	<see cref="T:Castle.Components.DictionaryAdapter.DictionaryAdapterMeta"/> object.
+            </summary>
+            <param name="behavior">A dictionary behavior or annotation.</param>
+            <returns>True if the behavior should be included; otherwise, false.</returns>
+            <remarks>
+            	<see cref="T:Castle.Components.DictionaryAdapter.IDictionaryMetaInitializer"/> behaviors are always included,
+            	regardless of the result of this method.
+            </remarks>
+            
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDictionaryValidator">
+            <summary>
+            Contract for dictionary validation.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryValidator.IsValid(Castle.Components.DictionaryAdapter.IDictionaryAdapter)">
+            <summary>
+            Determines if <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/> is valid.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <returns>true if valid.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryValidator.Validate(Castle.Components.DictionaryAdapter.IDictionaryAdapter)">
+            <summary>
+            Validates the <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/>.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <returns>The error summary information.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryValidator.Validate(Castle.Components.DictionaryAdapter.IDictionaryAdapter,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Validates the <see cref="T:Castle.Components.DictionaryAdapter.IDictionaryAdapter"/> for a property.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="property">The property to validate.</param>
+            <returns>The property summary information.</returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.IDictionaryValidator.Invalidate(Castle.Components.DictionaryAdapter.IDictionaryAdapter)">
+            <summary>
+            Invalidates any results cached by the validator.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.PropertyDescriptor">
+            <summary>
+            Describes a dictionary property.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.#ctor">
+            <summary>
+            Initializes an empty <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.#ctor(System.Reflection.PropertyInfo,System.Object[])">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/> class.
+            </summary>
+            <param name="property">The property.</param>
+            <param name="annotations">The annotations.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.#ctor(System.Object[])">
+            <summary>
+            Initializes a new instance <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.#ctor(Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Boolean)">
+            <summary>
+             Copies an existinginstance of the <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/> class.
+            </summary>
+            <param name="source"></param>
+            <param name="copyBehaviors"></param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.GetKey(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Gets the key.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="descriptor">The descriptor.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.GetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object,Castle.Components.DictionaryAdapter.PropertyDescriptor,System.Boolean)">
+            <summary>
+            Gets the property value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="storedValue">The stored value.</param>
+            <param name="descriptor">The descriptor.</param>
+            <param name="ifExists">true if return only existing.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.SetPropertyValue(Castle.Components.DictionaryAdapter.IDictionaryAdapter,System.String,System.Object@,Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Sets the property value.
+            </summary>
+            <param name="dictionaryAdapter">The dictionary adapter.</param>
+            <param name="key">The key.</param>
+            <param name="value">The value.</param>
+            <param name="descriptor">The descriptor.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.AddBehavior(Castle.Components.DictionaryAdapter.IDictionaryBehavior)">
+            <summary>
+            Adds a single behavior.
+            </summary>
+            <param name="behavior">The behavior.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.AddBehaviors(Castle.Components.DictionaryAdapter.IDictionaryBehavior[])">
+            <summary>
+            Adds the behaviors.
+            </summary>
+            <param name="behaviors">The behaviors.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.AddBehaviors(System.Collections.Generic.IEnumerable{Castle.Components.DictionaryAdapter.IDictionaryBehavior})">
+            <summary>
+            Adds the behaviors.
+            </summary>
+            <param name="behaviors">The behaviors.</param>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.CopyBehaviors(Castle.Components.DictionaryAdapter.PropertyDescriptor)">
+            <summary>
+            Copies the behaviors to the other <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <param name="other"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Components.DictionaryAdapter.PropertyDescriptor.Copy">
+            <summary>
+            Copies the <see cref="T:Castle.Components.DictionaryAdapter.PropertyDescriptor"/>
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.ExecutionOrder">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.PropertyName">
+            <summary>
+            Gets the property name.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.PropertyType">
+            <summary>
+            Gets the property type.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Property">
+            <summary>
+            Gets the property.
+            </summary>
+            <value>The property.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.IsDynamicProperty">
+            <summary>
+            Returns true if the property is dynamic.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.State">
+            <summary>
+            Gets additional state.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Fetch">
+            <summary>
+            Determines if property should be fetched.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.IfExists">
+            <summary>
+            Determines if property must exist first.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.SuppressNotifications">
+            <summary>
+            Determines if notifications should occur.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Annotations">
+            <summary>
+            Gets the property behaviors.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.TypeConverter">
+            <summary>
+            Gets the type converter.
+            </summary>
+            <value>The type converter.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.ExtendedProperties">
+            <summary>
+            Gets the extended properties.
+            </summary>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Behaviors">
+            <summary>
+            Gets the setter.
+            </summary>
+            <value>The setter.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.KeyBuilders">
+            <summary>
+            Gets the key builders.
+            </summary>
+            <value>The key builders.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Setters">
+            <summary>
+            Gets the setter.
+            </summary>
+            <value>The setter.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Getters">
+            <summary>
+            Gets the getter.
+            </summary>
+            <value>The getter.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.Initializers">
+            <summary>
+            Gets the initializers.
+            </summary>
+            <value>The initializers.</value>
+        </member>
+        <member name="P:Castle.Components.DictionaryAdapter.PropertyDescriptor.MetaInitializers">
+            <summary>
+            Gets the meta-data initializers.
+            </summary>
+            <value>The meta-data initializers.</value>
+        </member>
+        <member name="T:Castle.Core.Internal.AttributesUtil">
+            <summary>
+              Helper class for retrieving attributes.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetAttribute``1(System.Reflection.ICustomAttributeProvider)">
+            <summary>
+              Gets the attribute.
+            </summary>
+            <param name = "member">The member.</param>
+            <returns>The member attribute.</returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetAttributes``1(System.Reflection.ICustomAttributeProvider)">
+            <summary>
+              Gets the attributes. Does not consider inherited attributes!
+            </summary>
+            <param name = "member">The member.</param>
+            <returns>The member attributes.</returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetTypeAttribute``1(System.Type)">
+            <summary>
+              Gets the type attribute.
+            </summary>
+            <param name = "type">The type.</param>
+            <returns>The type attribute.</returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetTypeAttributes``1(System.Type)">
+            <summary>
+              Gets the type attributes.
+            </summary>
+            <param name = "type">The type.</param>
+            <returns>The type attributes.</returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.GetTypeConverter(System.Reflection.MemberInfo)">
+            <summary>
+              Gets the type converter.
+            </summary>
+            <param name = "member">The member.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Internal.AttributesUtil.HasAttribute``1(System.Reflection.ICustomAttributeProvider)">
+            <summary>
+              Gets the attribute.
+            </summary>
+            <param name = "member">The member.</param>
+            <returns>The member attribute.</returns>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDynamicValue`1">
+            <summary>
+            Contract for typed dynamic value resolution.
+            </summary>
+            <typeparam name="T"></typeparam>
+        </member>
+        <member name="T:Castle.Components.DictionaryAdapter.IDynamicValue">
+            <summary>
+            Contract for dynamic value resolution.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.LoggerLevel">
+            <summary>
+              Supporting Logger levels.
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Off">
+            <summary>
+              Logging will be off
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Fatal">
+            <summary>
+              Fatal logging level
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Error">
+            <summary>
+              Error logging level
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Warn">
+            <summary>
+              Warn logging level
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Info">
+            <summary>
+              Info logging level
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Logging.LoggerLevel.Debug">
+            <summary>
+              Debug logging level
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.IInvocation">
+            <summary>
+              Encapsulates an invocation of a proxied method.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.GetArgumentValue(System.Int32)">
+            <summary>
+              Gets the value of the argument at the specified <paramref name = "index" />.
+            </summary>
+            <param name = "index">The index.</param>
+            <returns>The value of the argument at the specified <paramref name = "index" />.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.GetConcreteMethod">
+            <summary>
+              Returns the concrete instantiation of the <see cref="P:Castle.DynamicProxy.IInvocation.Method"/> on the proxy, with any generic
+              parameters bound to real types.
+            </summary>
+            <returns>
+              The concrete instantiation of the <see cref="P:Castle.DynamicProxy.IInvocation.Method"/> on the proxy, or the <see cref="P:Castle.DynamicProxy.IInvocation.Method"/> if
+              not a generic method.
+            </returns>
+            <remarks>
+              Can be slower than calling <see cref="P:Castle.DynamicProxy.IInvocation.Method"/>.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.GetConcreteMethodInvocationTarget">
+            <summary>
+              Returns the concrete instantiation of <see cref="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget"/>, with any
+              generic parameters bound to real types.
+              For interface proxies, this will point to the <see cref="T:System.Reflection.MethodInfo"/> on the target class.
+            </summary>
+            <returns>The concrete instantiation of <see cref="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget"/>, or
+              <see cref="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget"/> if not a generic method.</returns>
+            <remarks>
+              In debug builds this can be slower than calling <see cref="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget"/>.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.Proceed">
+            <summary>
+              Proceeds the call to the next interceptor in line, and ultimately to the target method.
+            </summary>
+            <remarks>
+              Since interface proxies without a target don't have the target implementation to proceed to,
+              it is important, that the last interceptor does not call this method, otherwise a
+              <see cref="T:System.NotImplementedException"/> will be thrown.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInvocation.SetArgumentValue(System.Int32,System.Object)">
+            <summary>
+              Overrides the value of an argument at the given <paramref name="index"/> with the
+              new <paramref name="value"/> provided.
+            </summary>
+            <remarks>
+              This method accepts an <see cref="T:System.Object"/>, however the value provided must be compatible
+              with the type of the argument defined on the method, otherwise an exception will be thrown.
+            </remarks>
+            <param name="index">The index of the argument to override.</param>
+            <param name="value">The new value for the argument.</param>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.Arguments">
+            <summary>
+              Gets the arguments that the <see cref="P:Castle.DynamicProxy.IInvocation.Method"/> has been invoked with.
+            </summary>
+            <value>The arguments the method was invoked with.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.GenericArguments">
+            <summary>
+              Gets the generic arguments of the method.
+            </summary>
+            <value>The generic arguments, or null if not a generic method.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.InvocationTarget">
+            <summary>
+              Gets the object on which the invocation is performed. This is different from proxy object
+              because most of the time this will be the proxy target object.
+            </summary>
+            <seealso cref="T:Castle.DynamicProxy.IChangeProxyTarget"/>
+            <value>The invocation target.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.Method">
+            <summary>
+              Gets the <see cref="T:System.Reflection.MethodInfo"/> representing the method being invoked on the proxy.
+            </summary>
+            <value>The <see cref="T:System.Reflection.MethodInfo"/> representing the method being invoked.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.MethodInvocationTarget">
+            <summary>
+              For interface proxies, this will point to the <see cref="T:System.Reflection.MethodInfo"/> on the target class.
+            </summary>
+            <value>The method invocation target.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.Proxy">
+            <summary>
+              Gets the proxy object on which the intercepted method is invoked.
+            </summary>
+            <value>Proxy object on which the intercepted method is invoked.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.ReturnValue">
+            <summary>
+              Gets or sets the return value of the method.
+            </summary>
+            <value>The return value of the method.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.IInvocation.TargetType">
+            <summary>
+              Gets the type of the target object for the intercepted method.
+            </summary>
+            <value>The type of the target object.</value>
+        </member>
+        <member name="T:Castle.DynamicProxy.IProxyGenerationHook">
+            <summary>
+              Used during the target type inspection process. Implementors have a chance to customize the
+              proxy generation process.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyGenerationHook.MethodsInspected">
+            <summary>
+              Invoked by the generation process to notify that the whole process has completed.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyGenerationHook.NonProxyableMemberNotification(System.Type,System.Reflection.MemberInfo)">
+            <summary>
+              Invoked by the generation process to notify that a member was not marked as virtual.
+            </summary>
+            <param name = "type">The type which declares the non-virtual member.</param>
+            <param name = "memberInfo">The non-virtual member.</param>
+            <remarks>
+              This method gives an opportunity to inspect any non-proxyable member of a type that has 
+              been requested to be proxied, and if appropriate - throw an exception to notify the caller.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyGenerationHook.ShouldInterceptMethod(System.Type,System.Reflection.MethodInfo)">
+            <summary>
+              Invoked by the generation process to determine if the specified method should be proxied.
+            </summary>
+            <param name = "type">The type which declares the given method.</param>
+            <param name = "methodInfo">The method to inspect.</param>
+            <returns>True if the given method should be proxied; false otherwise.</returns>
+        </member>
+        <member name="T:Castle.DynamicProxy.Contributors.ITypeContributor">
+            <summary>
+              Interface describing elements composing generated type
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Contributors.MembersCollector.AcceptMethod(System.Reflection.MethodInfo,System.Boolean,Castle.DynamicProxy.IProxyGenerationHook)">
+            <summary>
+              Performs some basic screening and invokes the <see cref="T:Castle.DynamicProxy.IProxyGenerationHook"/>
+              to select methods.
+            </summary>
+            <param name="method"></param>
+            <param name="onlyVirtuals"></param>
+            <param name="hook"></param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.DynamicProxy.IAttributeDisassembler">
+            <summary>
+              Provides functionality for disassembling instances of attributes to CustomAttributeBuilder form, during the process of emiting new types by Dynamic Proxy.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IAttributeDisassembler.Disassemble(System.Attribute)">
+            <summary>
+              Disassembles given attribute instance back to corresponding CustomAttributeBuilder.
+            </summary>
+            <param name="attribute">An instance of attribute to disassemble</param>
+            <returns><see cref="T:System.Reflection.Emit.CustomAttributeBuilder"/> corresponding 1 to 1 to given attribute instance, or null reference.</returns>
+            <remarks>
+              Implementers should return <see cref="T:System.Reflection.Emit.CustomAttributeBuilder"/> that corresponds to given attribute instance 1 to 1,
+              that is after calling specified constructor with specified arguments, and setting specified properties and fields with values specified
+              we should be able to get an attribute instance identical to the one passed in <paramref name="attribute"/>. Implementer can return null
+              if it wishes to opt out of replicating the attribute. Notice however, that for some cases, like attributes passed explicitly by the user
+              it is illegal to return null, and doing so will result in exception.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.AttributeDisassembler.HandleError(System.Type,System.Exception)">
+            <summary>
+              Handles error during disassembly process
+            </summary>
+            <param name = "attributeType">Type of the attribute being disassembled</param>
+            <param name = "exception">Exception thrown during the process</param>
+            <returns>usually null, or (re)throws the exception</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.AttributeDisassembler.InitializeConstructorArgs(System.Type,System.Attribute,System.Reflection.ParameterInfo[])">
+            <summary>
+              Here we try to match a constructor argument to its value.
+              Since we can't get the values from the assembly, we use some heuristics to get it.
+              a/ we first try to match all the properties on the attributes by name (case insensitive) to the argument
+              b/ if we fail we try to match them by property type, with some smarts about convertions (i,e: can use Guid for string).
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.AttributeDisassembler.ReplaceIfBetterMatch(System.Reflection.ParameterInfo,System.Reflection.PropertyInfo,System.Reflection.PropertyInfo)">
+            <summary>
+              We have the following rules here.
+              Try to find a matching type, failing that, if the parameter is string, get the first property (under the assumption that
+              we can convert it.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.AttributeDisassembler.ConvertValue(System.Object,System.Type)">
+            <summary>
+              Attributes can only accept simple types, so we return null for null,
+              if the value is passed as string we call to string (should help with converting), 
+              otherwise, we use the value as is (enums, integer, etc).
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.TypeUtil.GetAllInterfaces(System.Type[])">
+            <summary>
+              Returns list of all unique interfaces implemented given types, including their base interfaces.
+            </summary>
+            <param name="types"> </param>
+            <returns> </returns>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.BaseProxyGenerator">
+            <summary>
+              Base class that exposes the common functionalities
+              to proxy generation.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.BaseProxyGenerator.AddMappingNoCheck(System.Type,Castle.DynamicProxy.Contributors.ITypeContributor,System.Collections.Generic.IDictionary{System.Type,Castle.DynamicProxy.Contributors.ITypeContributor})">
+            <summary>
+              It is safe to add mapping (no mapping for the interface exists)
+            </summary>
+            <param name = "implementer"></param>
+            <param name = "interface"></param>
+            <param name = "mapping"></param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.BaseProxyGenerator.GenerateParameterlessConstructor(Castle.DynamicProxy.Generators.Emitters.ClassEmitter,System.Type,Castle.DynamicProxy.Generators.Emitters.SimpleAST.FieldReference)">
+            <summary>
+              Generates a parameters constructor that initializes the proxy
+              state with <see cref="T:Castle.DynamicProxy.StandardInterceptor"/> just to make it non-null.
+              <para>
+                This constructor is important to allow proxies to be XML serializable
+              </para>
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.InvocationTypeGenerator.GetBaseCtorArguments(System.Type,Castle.DynamicProxy.ProxyGenerationOptions,System.Reflection.ConstructorInfo@)">
+            <summary>
+              Generates the constructor for the class that extends
+              <see cref="T:Castle.DynamicProxy.AbstractInvocation"/>
+            </summary>
+            <param name="targetFieldType"></param>
+            <param name="proxyGenerationOptions"></param>
+            <param name="baseConstructor"></param>
+        </member>
+        <member name="T:Castle.DynamicProxy.DefaultProxyBuilder">
+            <summary>
+              Default implementation of <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> interface producing in-memory proxy assemblies.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.IProxyBuilder">
+            <summary>
+              Abstracts the implementation of proxy type construction.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyBuilder.CreateClassProxyType(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates a proxy type for given <paramref name="classToProxy"/>, implementing <paramref name="additionalInterfacesToProxy"/>, using <paramref name="options"/> provided.
+            </summary>
+            <param name="classToProxy">The class type to proxy.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types to proxy.</param>
+            <param name="options">The proxy generation options.</param>
+            <returns>The generated proxy type.</returns>
+            <remarks>
+              Implementers should return a proxy type for the specified class and interfaces.
+              Additional interfaces should be only 'mark' interfaces, that is, they should work like interface proxy without target. (See <see cref="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)"/> method.)
+            </remarks>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is not public.
+              Note that to avoid this exception, you can mark offending type internal, and define <see cref="T:System.Runtime.CompilerServices.InternalsVisibleToAttribute"/> 
+              pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate.</exception>
+            <seealso cref="T:Castle.DynamicProxy.Generators.ClassProxyGenerator"/>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithTarget(System.Type,System.Type[],System.Type,Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates a proxy type that proxies calls to <paramref name="interfaceToProxy"/> members on <paramref name="targetType"/>, implementing <paramref name="additionalInterfacesToProxy"/>, using <paramref name="options"/> provided.
+            </summary>
+            <param name="interfaceToProxy">The interface type to proxy.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types to proxy.</param>
+            <param name="targetType">Type implementing <paramref name="interfaceToProxy"/> on which calls to the interface members should be intercepted.</param>
+            <param name="options">The proxy generation options.</param>
+            <returns>The generated proxy type.</returns>
+            <remarks>
+              Implementers should return a proxy type for the specified interface that 'proceeds' executions to the specified target.
+              Additional interfaces should be only 'mark' interfaces, that is, they should work like interface proxy without target. (See <see cref="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)"/> method.)
+            </remarks>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is not public.
+              Note that to avoid this exception, you can mark offending type internal, and define <see cref="T:System.Runtime.CompilerServices.InternalsVisibleToAttribute"/> 
+              pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate.</exception>
+            <seealso cref="T:Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator"/>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithTargetInterface(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates a proxy type for given <paramref name="interfaceToProxy"/> and <parmaref name="additionalInterfacesToProxy"/> that delegates all calls to the provided interceptors and allows interceptors to switch the actual target of invocation.
+            </summary>
+            <param name="interfaceToProxy">The interface type to proxy.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types to proxy.</param>
+            <param name="options">The proxy generation options.</param>
+            <returns>The generated proxy type.</returns>
+            <remarks>
+              Implementers should return a proxy type for the specified interface(s) that delegate all executions to the specified interceptors
+              and uses an instance of the interface as their targets (i.e. <see cref="P:Castle.DynamicProxy.IInvocation.InvocationTarget"/>), rather than a class. All <see cref="T:Castle.DynamicProxy.IInvocation"/> classes should then implement <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface,
+              to allow interceptors to switch invocation target with instance of another type implementing called interface.
+            </remarks>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is not public.
+              Note that to avoid this exception, you can mark offending type internal, and define <see cref="T:System.Runtime.CompilerServices.InternalsVisibleToAttribute"/> 
+              pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate.</exception>
+            <seealso cref="T:Castle.DynamicProxy.Generators.InterfaceProxyWithTargetInterfaceGenerator"/>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyBuilder.CreateInterfaceProxyTypeWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates a proxy type for given <paramref name="interfaceToProxy"/> that delegates all calls to the provided interceptors.
+            </summary>
+            <param name="interfaceToProxy">The interface type to proxy.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types to proxy.</param>
+            <param name="options">The proxy generation options.</param>
+            <returns>The generated proxy type.</returns>
+            <remarks>
+              Implementers should return a proxy type for the specified interface and additional interfaces that delegate all executions to the specified interceptors.
+            </remarks>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:Castle.DynamicProxy.Generators.GeneratorException">Thrown when <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is not public.
+              Note that to avoid this exception, you can mark offending type internal, and define <see cref="T:System.Runtime.CompilerServices.InternalsVisibleToAttribute"/> 
+              pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate.</exception>
+            <seealso cref="T:Castle.DynamicProxy.Generators.InterfaceProxyWithoutTargetGenerator"/>
+        </member>
+        <member name="P:Castle.DynamicProxy.IProxyBuilder.Logger">
+            <summary>
+              Gets or sets the <see cref="T:Castle.Core.Logging.ILogger"/> that this <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> logs to.
+            </summary>
+        </member>
+        <member name="P:Castle.DynamicProxy.IProxyBuilder.ModuleScope">
+            <summary>
+              Gets the <see cref="P:Castle.DynamicProxy.IProxyBuilder.ModuleScope"/> associated with this builder.
+            </summary>
+            <value>The module scope associated with this builder.</value>
+        </member>
+        <member name="M:Castle.DynamicProxy.DefaultProxyBuilder.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.DefaultProxyBuilder"/> class with new <see cref="P:Castle.DynamicProxy.DefaultProxyBuilder.ModuleScope"/>.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.DefaultProxyBuilder.#ctor(Castle.DynamicProxy.ModuleScope)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.DefaultProxyBuilder"/> class.
+            </summary>
+            <param name="scope">The module scope for generated proxy types.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.AttributeUtil.AddDisassembler``1(Castle.DynamicProxy.IAttributeDisassembler)">
+            <summary>
+              Registers custom disassembler to handle disassembly of specified type of attributes.
+            </summary>
+            <typeparam name="TAttribute">Type of attributes to handle</typeparam>
+            <param name="disassembler">Disassembler converting existing instances of Attributes to CustomAttributeBuilders</param>
+            <remarks>
+              When disassembling an attribute Dynamic Proxy will first check if an custom disassembler has been registered to handle attributes of that type, 
+              and if none is found, it'll use the <see cref="P:Castle.DynamicProxy.Internal.AttributeUtil.FallbackDisassembler"/>.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.AttributeUtil.ShouldSkipAttributeReplication(System.Type)">
+            <summary>
+              Attributes should be replicated if they are non-inheritable,
+              but there are some special cases where the attributes means
+              something to the CLR, where they should be skipped.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.CacheKey.#ctor(System.Reflection.MemberInfo,System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.Generators.CacheKey"/> class.
+            </summary>
+            <param name="target">Target element. This is either target type or target method for invocation types.</param>
+            <param name="type">The type of the proxy. This is base type for invocation types.</param>
+            <param name="interfaces">The interfaces.</param>
+            <param name="options">The options.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.CacheKey.#ctor(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.Generators.CacheKey"/> class.
+            </summary>
+            <param name="target">Type of the target.</param>
+            <param name="interfaces">The interfaces.</param>
+            <param name="options">The options.</param>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.LdcOpCodesDictionary">
+            <summary>
+              s
+              Provides appropriate Ldc.X opcode for the type of primitive value to be loaded.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.LdindOpCodesDictionary">
+            <summary>
+              Provides appropriate Ldind.X opcode for 
+              the type of primitive value to be loaded indirectly.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.Emitters.OpCodeUtil.EmitLoadIndirectOpCodeForType(System.Reflection.Emit.ILGenerator,System.Type)">
+            <summary>
+              Emits a load indirect opcode of the appropriate type for a value or object reference.
+              Pops a pointer off the evaluation stack, dereferences it and loads
+              a value of the specified type.
+            </summary>
+            <param name = "gen"></param>
+            <param name = "type"></param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.Emitters.OpCodeUtil.EmitLoadOpCodeForConstantValue(System.Reflection.Emit.ILGenerator,System.Object)">
+            <summary>
+              Emits a load opcode of the appropriate kind for a constant string or
+              primitive value.
+            </summary>
+            <param name = "gen"></param>
+            <param name = "value"></param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.Emitters.OpCodeUtil.EmitLoadOpCodeForDefaultValueOfType(System.Reflection.Emit.ILGenerator,System.Type)">
+            <summary>
+              Emits a load opcode of the appropriate kind for the constant default value of a
+              type, such as 0 for value types and null for reference types.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.Emitters.OpCodeUtil.EmitStoreIndirectOpCodeForType(System.Reflection.Emit.ILGenerator,System.Type)">
+            <summary>
+              Emits a store indirectopcode of the appropriate type for a value or object reference.
+              Pops a value of the specified type and a pointer off the evaluation stack, and
+              stores the value.
+            </summary>
+            <param name = "gen"></param>
+            <param name = "type"></param>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.PropertiesCollection">
+            <summary>
+              Summary description for PropertiesCollection.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.SimpleAST.IndirectReference">
+            <summary>
+              Wraps a reference that is passed 
+              ByRef and provides indirect load/store support.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.SimpleAST.NewArrayExpression">
+            <summary>
+              Summary description for NewArrayExpression.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.SimpleAST.ReferencesToObjectArrayExpression">
+            <summary>
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.Emitters.StindOpCodesDictionary">
+            <summary>
+              Provides appropriate Stind.X opcode 
+              for the type of primitive value to be stored indirectly.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.MetaEvent.#ctor(System.String,System.Type,System.Type,Castle.DynamicProxy.Generators.MetaMethod,Castle.DynamicProxy.Generators.MetaMethod,System.Reflection.EventAttributes)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.Generators.MetaEvent"/> class.
+            </summary>
+            <param name="name">The name.</param>
+            <param name="declaringType">Type declaring the original event being overriten, or null.</param>
+            <param name="eventDelegateType"></param>
+            <param name="adder">The add method.</param>
+            <param name="remover">The remove method.</param>
+            <param name="attributes">The attributes.</param>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.INamingScope">
+            <summary>
+              Represents the scope of uniquenes of names for types and their members
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.INamingScope.GetUniqueName(System.String)">
+            <summary>
+              Gets a unique name based on <paramref name="suggestedName"/>
+            </summary>
+            <param name="suggestedName">Name suggested by the caller</param>
+            <returns>Unique name based on <paramref name="suggestedName"/>.</returns>
+            <remarks>
+              Implementers should provide name as closely resembling <paramref name="suggestedName"/> as possible.
+              Generally if no collision occurs it is suggested to return suggested name, otherwise append sequential suffix.
+              Implementers must return deterministic names, that is when <see cref="M:Castle.DynamicProxy.Generators.INamingScope.GetUniqueName(System.String)"/> is called twice 
+              with the same suggested name, the same returned name should be provided each time. Non-deterministic return
+              values, like appending random suffices will break serialization of proxies.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.Generators.INamingScope.SafeSubScope">
+            <summary>
+              Returns new, disposable naming scope. It is responsibilty of the caller to make sure that no naming collision
+              with enclosing scope, or other subscopes is possible.
+            </summary>
+            <returns>New naming scope.</returns>
+        </member>
+        <member name="T:Castle.DynamicProxy.Generators.MethodFinder">
+            <summary>
+              Returns the methods implemented by a type. Use this instead of Type.GetMethods() to work around a CLR issue
+              where duplicate MethodInfos are returned by Type.GetMethods() after a token of a generic type's method was loaded.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.InternalsUtil.IsInternal(System.Reflection.MethodBase)">
+            <summary>
+              Determines whether the specified method is internal.
+            </summary>
+            <param name = "method">The method.</param>
+            <returns>
+              <c>true</c> if the specified method is internal; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.InternalsUtil.IsInternalToDynamicProxy(System.Reflection.Assembly)">
+            <summary>
+              Determines whether this assembly has internals visible to dynamic proxy.
+            </summary>
+            <param name = "asm">The assembly to inspect.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.Internal.InternalsUtil.IsAccessible(System.Reflection.MethodBase)">
+            <summary>
+              Checks if the method is public or protected.
+            </summary>
+            <param name = "method"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.MixinData.#ctor(System.Collections.Generic.IEnumerable{System.Object})">
+            <summary>
+              Because we need to cache the types based on the mixed in mixins, we do the following here:
+              - Get all the mixin interfaces
+              - Sort them by full name
+              - Return them by position
+            
+            The idea is to have reproducible behavior for the case that mixins are registered in different orders.
+            This method is here because it is required 
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.ModuleScope">
+            <summary>
+              Summary description for ModuleScope.
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.ModuleScope.DEFAULT_FILE_NAME">
+            <summary>
+              The default file name used when the assembly is saved using <see cref="F:Castle.DynamicProxy.ModuleScope.DEFAULT_FILE_NAME"/>.
+            </summary>
+        </member>
+        <member name="F:Castle.DynamicProxy.ModuleScope.DEFAULT_ASSEMBLY_NAME">
+            <summary>
+              The default assembly (simple) name used for the assemblies generated by a <see cref="T:Castle.DynamicProxy.ModuleScope"/> instance.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class; assemblies created by this instance will not be saved.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor(System.Boolean)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class, allowing to specify whether the assemblies generated by this instance
+              should be saved.
+            </summary>
+            <param name="savePhysicalAssembly">If set to <c>true</c> saves the generated module.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor(System.Boolean,System.Boolean)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class, allowing to specify whether the assemblies generated by this instance
+              should be saved.
+            </summary>
+            <param name="savePhysicalAssembly">If set to <c>true</c> saves the generated module.</param>
+            <param name="disableSignedModule">If set to <c>true</c> disables ability to generate signed module. This should be used in cases where ran under constrained permissions.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor(System.Boolean,System.Boolean,System.String,System.String,System.String,System.String)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class, allowing to specify whether the assemblies generated by this instance
+              should be saved and what simple names are to be assigned to them.
+            </summary>
+            <param name="savePhysicalAssembly">If set to <c>true</c> saves the generated module.</param>
+            <param name="disableSignedModule">If set to <c>true</c> disables ability to generate signed module. This should be used in cases where ran under constrained permissions.</param>
+            <param name="strongAssemblyName">The simple name of the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="strongModulePath">The path and file name of the manifest module of the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="weakAssemblyName">The simple name of the weak-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="weakModulePath">The path and file name of the manifest module of the weak-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.#ctor(System.Boolean,System.Boolean,Castle.DynamicProxy.Generators.INamingScope,System.String,System.String,System.String,System.String)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ModuleScope"/> class, allowing to specify whether the assemblies generated by this instance
+              should be saved and what simple names are to be assigned to them.
+            </summary>
+            <param name="savePhysicalAssembly">If set to <c>true</c> saves the generated module.</param>
+            <param name="disableSignedModule">If set to <c>true</c> disables ability to generate signed module. This should be used in cases where ran under constrained permissions.</param>
+            <param name="namingScope">Naming scope used to provide unique names to generated types and their members (usually via sub-scopes).</param>
+            <param name="strongAssemblyName">The simple name of the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="strongModulePath">The path and file name of the manifest module of the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="weakAssemblyName">The simple name of the weak-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+            <param name="weakModulePath">The path and file name of the manifest module of the weak-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.GetFromCache(Castle.DynamicProxy.Generators.CacheKey)">
+            <summary>
+              Returns a type from this scope's type cache, or null if the key cannot be found.
+            </summary>
+            <param name = "key">The key to be looked up in the cache.</param>
+            <returns>The type from this scope's type cache matching the key, or null if the key cannot be found</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.RegisterInCache(Castle.DynamicProxy.Generators.CacheKey,System.Type)">
+            <summary>
+              Registers a type in this scope's type cache.
+            </summary>
+            <param name = "key">The key to be associated with the type.</param>
+            <param name = "type">The type to be stored in the cache.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.GetKeyPair">
+            <summary>
+              Gets the key pair used to sign the strong-named assembly generated by this <see cref="T:Castle.DynamicProxy.ModuleScope"/>.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.ObtainDynamicModule(System.Boolean)">
+            <summary>
+              Gets the specified module generated by this scope, creating a new one if none has yet been generated.
+            </summary>
+            <param name = "isStrongNamed">If set to true, a strong-named module is returned; otherwise, a weak-named module is returned.</param>
+            <returns>A strong-named or weak-named module generated by this scope, as specified by the <paramref
+               name = "isStrongNamed" /> parameter.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.ObtainDynamicModuleWithStrongName">
+            <summary>
+              Gets the strong-named module generated by this scope, creating a new one if none has yet been generated.
+            </summary>
+            <returns>A strong-named module generated by this scope.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ModuleScope.ObtainDynamicModuleWithWeakName">
+            <summary>
+              Gets the weak-named module generated by this scope, creating a new one if none has yet been generated.
+            </summary>
+            <returns>A weak-named module generated by this scope.</returns>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.Lock">
+            <summary>
+              Users of this <see cref="T:Castle.DynamicProxy.ModuleScope"/> should use this lock when accessing the cache.
+            </summary>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.StrongNamedModule">
+            <summary>
+              Gets the strong-named module generated by this scope, or <see langword = "null" /> if none has yet been generated.
+            </summary>
+            <value>The strong-named module generated by this scope, or <see langword = "null" /> if none has yet been generated.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.StrongNamedModuleName">
+            <summary>
+              Gets the file name of the strongly named module generated by this scope.
+            </summary>
+            <value>The file name of the strongly named module generated by this scope.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.WeakNamedModule">
+            <summary>
+              Gets the weak-named module generated by this scope, or <see langword = "null" /> if none has yet been generated.
+            </summary>
+            <value>The weak-named module generated by this scope, or <see langword = "null" /> if none has yet been generated.</value>
+        </member>
+        <member name="P:Castle.DynamicProxy.ModuleScope.WeakNamedModuleName">
+            <summary>
+              Gets the file name of the weakly named module generated by this scope.
+            </summary>
+            <value>The file name of the weakly named module generated by this scope.</value>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerationOptions.#ctor(Castle.DynamicProxy.IProxyGenerationHook)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerationOptions"/> class.
+            </summary>
+            <param name="hook">The hook.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerationOptions.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerationOptions"/> class.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.ProxyGenerator">
+            <summary>
+              Provides proxy objects for classes and interfaces.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.#ctor(Castle.DynamicProxy.IProxyBuilder)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> class.
+            </summary>
+            <param name="builder">Proxy types builder.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.#ctor">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> class.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.#ctor(System.Boolean)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> class.
+            </summary>
+            <param name="disableSignedModule">If <c>true</c> forces all types to be generated into an unsigned module.</param>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget``1(``0,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface implemented by <paramref name="target"/> which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>Object proxying calls to members of <typeparamref name="TInterface"/> on <paramref name="target"/> object.</returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/>is not an interface type.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface``1(``0,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget``1(``0,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface implemented by <paramref name="target"/> which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/>is not an interface type.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface``1(``0,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Object,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types  on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Type[],System.Object,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on <paramref name="target"/> object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method generates new proxy type for each type of <paramref name="target"/>, which affects performance. If you don't want to proxy types differently depending on the type of the target
+              use <see cref="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])"/> method.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface``1(``0,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface implemented by <paramref name="target"/> which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> type on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface``1(``0,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface implemented by <paramref name="target"/> which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> type on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Type[],System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithTargetInterface(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on <paramref name="target"/> object with given <paramref name="interceptors"/>.
+              Interceptors can use <see cref="T:Castle.DynamicProxy.IChangeProxyTarget"/> interface to provide other target for method invocation than default <paramref name="target"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface implemented by <paramref name="target"/> which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on <paramref name="target"/> object or alternative implementation swapped at runtime by an interceptor.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="target"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="target"/> does not implement <paramref name="interfaceToProxy"/> interface.</exception>
+            <exception cref="T:System.MissingMethodException">Thrown when no default constructor exists on actual type of <paramref name="target"/> object.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of actual type of <paramref name="target"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget``1(Castle.DynamicProxy.IInterceptor)">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on target object generated at runtime with given <paramref name="interceptor"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface which will be proxied.</typeparam>
+            <param name="interceptor">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptor"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              As a result of that also at least one <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementation must be provided.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget``1(Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface which will be proxied.</typeparam>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              As a result of that also at least one <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementation must be provided.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget``1(Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <typeparamref name="TInterface"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TInterface">Type of the interface which will be proxied.</typeparam>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <typeparamref name="TInterface"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TInterface"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              As a result of that also at least one <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementation must be provided.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,Castle.DynamicProxy.IInterceptor)">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptor"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="interceptor">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptor"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> type on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/>  is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to members of interface <paramref name="interfaceToProxy"/> on target object generated at runtime with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="interfaceToProxy">Type of the interface which will be proxied.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              Object proxying calls to members of <paramref name="interfaceToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types on generated target object.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interfaceToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="interceptors"/> array is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="interfaceToProxy"/> is not an interface type.</exception>
+            <remarks>
+              Since this method uses an empty-shell implementation of <paramref name="additionalInterfacesToProxy"/> to proxy generated at runtime, the actual implementation of proxied methods must be provided by given <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations.
+              They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/>, since there's no actual implementation to proceed with.
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget``1(``0,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <typeparamref name="TClass"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TClass">Type of class which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <typeparamref name="TClass"/> proxying calls to virtual members of <typeparamref name="TClass"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TClass"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <typeparamref name="TClass"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <typeparamref name="TClass"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget``1(``0,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <typeparamref name="TClass"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TClass">Type of class which will be proxied.</typeparam>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <typeparamref name="TClass"/> proxying calls to virtual members of <typeparamref name="TClass"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TClass"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <typeparamref name="TClass"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <typeparamref name="TClass"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Object,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no parameterless constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyWithTarget(System.Type,System.Type[],System.Object,Castle.DynamicProxy.ProxyGenerationOptions,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="target">The target object, calls to which will be intercepted.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy``1(Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <typeparamref name="TClass"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TClass">Type of class which will be proxied.</typeparam>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <typeparamref name="TClass"/> proxying calls to virtual members of <typeparamref name="TClass"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TClass"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <typeparamref name="TClass"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <typeparamref name="TClass"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy``1(Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <typeparamref name="TClass"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <typeparam name="TClass">Type of class which will be proxied.</typeparam>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <typeparamref name="TClass"/> proxying calls to virtual members of <typeparamref name="TClass"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentException">Thrown when given <typeparamref name="TClass"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <typeparamref name="TClass"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <typeparamref name="TClass"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,System.Type[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,Castle.DynamicProxy.ProxyGenerationOptions,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no parameterless constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> type.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no default constructor exists on type <paramref name="classToProxy"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when default constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions,System.Object[],Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Creates proxy object intercepting calls to virtual members of type <paramref name="classToProxy"/> on newly created instance of that type with given <paramref name="interceptors"/>.
+            </summary>
+            <param name="classToProxy">Type of class which will be proxied.</param>
+            <param name="additionalInterfacesToProxy">Additional interface types. Calls to their members will be proxied as well.</param>
+            <param name="options">The proxy generation options used to influence generated proxy type and object.</param>
+            <param name="constructorArguments">Arguments of constructor of type <paramref name="classToProxy"/> which should be used to create a new instance of that type.</param>
+            <param name="interceptors">The interceptors called during the invocation of proxied methods.</param>
+            <returns>
+              New object of type <paramref name="classToProxy"/> proxying calls to virtual members of <paramref name="classToProxy"/> and <paramref name="additionalInterfacesToProxy"/> types.
+            </returns>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="classToProxy"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentNullException">Thrown when given <paramref name="options"/> object is a null reference (Nothing in Visual Basic).</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> or any of <paramref name="additionalInterfacesToProxy"/> is a generic type definition.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when given <paramref name="classToProxy"/> is not a class type.</exception>
+            <exception cref="T:System.ArgumentException">Thrown when no constructor exists on type <paramref name="classToProxy"/> with parameters matching <paramref name="constructorArguments"/>.</exception>
+            <exception cref="T:System.Reflection.TargetInvocationException">Thrown when constructor of type <paramref name="classToProxy"/> throws an exception.</exception>
+            <remarks>
+              This method uses <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation to generate a proxy type.
+              As such caller should expect any type of exception that given <see cref="T:Castle.DynamicProxy.IProxyBuilder"/> implementation may throw.
+            </remarks>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateClassProxyType(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates the proxy type for class proxy with given <paramref name="classToProxy"/> class, implementing given <paramref name="additionalInterfacesToProxy"/> and using provided <paramref name="options"/>.
+            </summary>
+            <param name="classToProxy">The base class for proxy type.</param>
+            <param name="additionalInterfacesToProxy">The interfaces that proxy type should implement.</param>
+            <param name="options">The options for proxy generation process.</param>
+            <returns><see cref="T:System.Type"/> of proxy.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyTypeWithTarget(System.Type,System.Type[],System.Type,Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates the proxy type for interface proxy with target for given <paramref name="interfaceToProxy"/> interface, implementing given <paramref name="additionalInterfacesToProxy"/> on given <paramref name="targetType"/> and using provided <paramref name="options"/>.
+            </summary>
+            <param name="interfaceToProxy">The interface proxy type should implement.</param>
+            <param name="additionalInterfacesToProxy">The additional interfaces proxy type should implement.</param>
+            <param name="targetType">Actual type that the proxy type will encompass.</param>
+            <param name="options">The options for proxy generation process.</param>
+            <returns><see cref="T:System.Type"/> of proxy.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyTypeWithTargetInterface(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates the proxy type for interface proxy with target interface for given <paramref name="interfaceToProxy"/> interface, implementing given <paramref name="additionalInterfacesToProxy"/> on given <paramref name="interfaceToProxy"/> and using provided <paramref name="options"/>.
+            </summary>
+            <param name="interfaceToProxy">The interface proxy type should implement.</param>
+            <param name="additionalInterfacesToProxy">The additional interfaces proxy type should implement.</param>
+            <param name="options">The options for proxy generation process.</param>
+            <returns><see cref="T:System.Type"/> of proxy.</returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyTypeWithoutTarget(System.Type,System.Type[],Castle.DynamicProxy.ProxyGenerationOptions)">
+            <summary>
+              Creates the proxy type for interface proxy without target for given <paramref name="interfaceToProxy"/> interface, implementing given <paramref name="additionalInterfacesToProxy"/> and using provided <paramref name="options"/>.
+            </summary>
+            <param name="interfaceToProxy">The interface proxy type should implement.</param>
+            <param name="additionalInterfacesToProxy">The additional interfaces proxy type should implement.</param>
+            <param name="options">The options for proxy generation process.</param>
+            <returns><see cref="T:System.Type"/> of proxy.</returns>
+        </member>
+        <member name="P:Castle.DynamicProxy.ProxyGenerator.Logger">
+            <summary>
+              Gets or sets the <see cref="T:Castle.Core.Logging.ILogger"/> that this <see cref="T:Castle.DynamicProxy.ProxyGenerator"/> log to.
+            </summary>
+        </member>
+        <member name="P:Castle.DynamicProxy.ProxyGenerator.ProxyBuilder">
+            <summary>
+              Gets the proxy builder instance used to generate proxy types.
+            </summary>
+            <value>The proxy builder.</value>
+        </member>
+        <member name="M:Castle.DynamicProxy.SilverlightExtensions.Extensions.IsNested(System.Type)">
+            <summary>
+            The silverlight System.Type is missing the IsNested property so this exposes similar functionality.
+            </summary>
+            <param name="type"></param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.DynamicProxy.Tokens.InvocationMethods">
+            <summary>
+              Holds <see cref="T:System.Reflection.MethodInfo"/> objects representing methods of <see cref="T:Castle.DynamicProxy.AbstractInvocation"/> class.
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.IInterceptorSelector">
+            <summary>
+              Provides an extension point that allows proxies to choose specific interceptors on
+              a per method basis.
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IInterceptorSelector.SelectInterceptors(System.Type,System.Reflection.MethodInfo,Castle.DynamicProxy.IInterceptor[])">
+            <summary>
+              Selects the interceptors that should intercept calls to the given <paramref name="method"/>.
+            </summary>
+            <param name="type">The type declaring the method to intercept.</param>
+            <param name="method">The method that will be intercepted.</param>
+            <param name="interceptors">All interceptors registered with the proxy.</param>
+            <returns>An array of interceptors to invoke upon calling the <paramref name="method"/>.</returns>
+            <remarks>
+              This method is called only once per proxy instance, upon the first call to the
+              <paramref name="method"/>. Either an empty array or null are valid return values to indicate
+              that no interceptor should intercept calls to the method. Although it is not advised, it is
+              legal to return other <see cref="T:Castle.DynamicProxy.IInterceptor"/> implementations than these provided in
+              <paramref name="interceptors"/>.
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.Internal.Lock.Create">
+            <summary>
+            Creates a new lock.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.IServiceProviderExAccessor">
+            <summary>
+            This interface should be implemented by classes
+            that are available in a bigger context, exposing
+            the container to different areas in the same application.
+            <para>
+            For example, in Web application, the (global) HttpApplication
+            subclasses should implement this interface to expose 
+            the configured container
+            </para>
+            </summary>
+        </member>
+        <member name="T:Castle.DynamicProxy.IChangeProxyTarget">
+            <summary>
+              Exposes means to change target objects of proxies and invocations
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IChangeProxyTarget.ChangeInvocationTarget(System.Object)">
+            <summary>
+              Changes the target object (<see cref="P:Castle.DynamicProxy.IInvocation.InvocationTarget"/>) of current <see cref="T:Castle.DynamicProxy.IInvocation"/>.
+            </summary>
+            <param name="target">The new value of target of invocation.</param>
+            <remarks>
+              Although the method takes <see cref="T:System.Object"/> the actual instance must be of type assignable to <see cref="P:Castle.DynamicProxy.IInvocation.TargetType"/>, otherwise an <see cref="T:System.InvalidCastException"/> will be thrown.
+              Also while it's technically legal to pass null reference (Nothing in Visual Basic) as <paramref name="target"/>, for obvious reasons Dynamic Proxy will not be able to call the intercepted method on such target.
+              In this case last interceptor in the pipeline mustn't call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/> or a <see cref="T:System.NotImplementedException"/> will be throws.
+              Also while it's technically legal to pass proxy itself as <paramref name="target"/>, this would create stack overflow.
+              In this case last interceptor in the pipeline mustn't call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/> or a <see cref="T:System.InvalidOperationException"/> will be throws.
+            </remarks>
+            <exception cref="T:System.InvalidCastException">Thrown when <paramref name="target"/> is not assignable to the proxied type.</exception>
+        </member>
+        <member name="M:Castle.DynamicProxy.IChangeProxyTarget.ChangeProxyTarget(System.Object)">
+            <summary>
+              Permanently changes the target object of the proxy. This does not affect target of the current invocation.
+            </summary>
+            <param name="target">The new value of target of the proxy.</param>
+            <remarks>
+              Although the method takes <see cref="T:System.Object"/> the actual instance must be of type assignable to proxy's target type, otherwise an <see cref="T:System.InvalidCastException"/> will be thrown.
+              Also while it's technically legal to pass null reference (Nothing in Visual Basic) as <paramref name="target"/>, for obvious reasons Dynamic Proxy will not be able to call the intercepted method on such target.
+              In this case last interceptor in the pipeline mustn't call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/> or a <see cref="T:System.NotImplementedException"/> will be throws.
+              Also while it's technically legal to pass proxy itself as <paramref name="target"/>, this would create stack overflow.
+              In this case last interceptor in the pipeline mustn't call <see cref="M:Castle.DynamicProxy.IInvocation.Proceed"/> or a <see cref="T:System.InvalidOperationException"/> will be throws.
+            </remarks>
+            <exception cref="T:System.InvalidCastException">Thrown when <paramref name="target"/> is not assignable to the proxied type.</exception>
+        </member>
+        <member name="T:Castle.DynamicProxy.IInterceptor">
+            <summary>
+              New interface that is going to be used by DynamicProxy 2
+            </summary>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyTargetAccessor.DynProxyGetTarget">
+            <summary>
+              Get the proxy target (note that null is a valid target!)
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.DynamicProxy.IProxyTargetAccessor.GetInterceptors">
+            <summary>
+              Gets the interceptors for the proxy
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.IServiceEnabledComponent">
+            <summary>
+            Defines that the implementation wants a 
+            <see cref="T:System.IServiceProvider"/> in order to 
+            access other components. The creator must be aware
+            that the component might (or might not) implement 
+            the interface.
+            </summary>
+            <remarks>
+            Used by Castle Project components to, for example, 
+            gather logging factories
+            </remarks>
+        </member>
+        <member name="T:Castle.Core.IServiceProviderEx">
+            <summary>
+            Increments <c>IServiceProvider</c> with a generic service resolution operation.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.IExtendedLoggerFactory">
+            <summary>
+              Provides a factory that can produce either <see cref="T:Castle.Core.Logging.ILogger"/> or
+              <see cref="T:Castle.Core.Logging.IExtendedLogger"/> classes.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.ILoggerFactory">
+            <summary>
+              Manages the instantiation of <see cref="T:Castle.Core.Logging.ILogger"/>s.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ILoggerFactory.Create(System.Type)">
+            <summary>
+              Creates a new logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ILoggerFactory.Create(System.String)">
+            <summary>
+              Creates a new logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ILoggerFactory.Create(System.Type,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ILoggerFactory.Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.IExtendedLoggerFactory.Create(System.Type)">
+            <summary>
+              Creates a new extended logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.IExtendedLoggerFactory.Create(System.String)">
+            <summary>
+              Creates a new extended logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.IExtendedLoggerFactory.Create(System.Type,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new extended logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.IExtendedLoggerFactory.Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new extended logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Create(System.Type)">
+            <summary>
+              Creates a new extended logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Create(System.String)">
+            <summary>
+              Creates a new extended logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Create(System.Type,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new extended logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new extended logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Castle#Core#Logging#ILoggerFactory#Create(System.Type)">
+            <summary>
+              Creates a new logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Castle#Core#Logging#ILoggerFactory#Create(System.String)">
+            <summary>
+              Creates a new logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Castle#Core#Logging#ILoggerFactory#Create(System.Type,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new logger, getting the logger name from the specified type.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.Castle#Core#Logging#ILoggerFactory#Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new logger.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractExtendedLoggerFactory.GetConfigFile(System.String)">
+            <summary>
+              Gets the configuration file.
+            </summary>
+            <param name = "fileName">i.e. log4net.config</param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.Logging.IContextProperties">
+            <summary>
+              Interface for Context Properties implementations
+            </summary>
+            <remarks>
+              <para>
+                This interface defines a basic property get set accessor.
+              </para>
+              <para>
+                Based on the ContextPropertiesBase of log4net, by Nicko Cadell.
+              </para>
+            </remarks>
+        </member>
+        <member name="P:Castle.Core.Logging.IContextProperties.Item(System.String)">
+            <summary>
+              Gets or sets the value of a property
+            </summary>
+            <value>
+              The value for the property with the specified key
+            </value>
+            <remarks>
+              <para>
+                Gets or sets the value of a property
+              </para>
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.Logging.AbstractLoggerFactory.GetConfigFile(System.String)">
+            <summary>
+              Gets the configuration file.
+            </summary>
+            <param name = "fileName">i.e. log4net.config</param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.Logging.NullLogFactory">
+            <summary>
+            NullLogFactory used when logging is turned off.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogFactory.Create(System.String)">
+            <summary>
+              Creates an instance of ILogger with the specified name.
+            </summary>
+            <param name = "name">Name.</param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogFactory.Create(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates an instance of ILogger with the specified name and LoggerLevel.
+            </summary>
+            <param name = "name">Name.</param>
+            <param name = "level">Level.</param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.Logging.IExtendedLogger">
+            <summary>
+              Provides an interface that supports <see cref="T:Castle.Core.Logging.ILogger"/> and
+              allows the storage and retrieval of Contexts. These are supported in
+              both log4net and NLog.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.ILogger">
+            <summary>
+              Manages logging.
+            </summary>
+            <remarks>
+              This is a facade for the different logging subsystems.
+              It offers a simplified interface that follows IOC patterns
+              and a simplified priority/level/severity abstraction.
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.CreateChildLogger(System.String)">
+            <summary>
+              Create a new child logger.
+              The name of the child logger is [current-loggers-name].[passed-in-name]
+            </summary>
+            <param name="loggerName">The Subname of this logger.</param>
+            <returns>The New ILogger instance.</returns>
+            <exception cref="T:System.ArgumentException">If the name has an empty element name.</exception>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Debug(System.String)">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Debug(System.Func{System.String})">
+            <summary>
+              Logs a debug message with lazily constructed message. The message will be constructed only if the <see cref="P:Castle.Core.Logging.ILogger.IsDebugEnabled"/> is true.
+            </summary>
+            <param name="messageFactory"></param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Debug(System.String,System.Exception)">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.DebugFormat(System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.DebugFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.DebugFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.DebugFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Error(System.String)">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Error(System.Func{System.String})">
+            <summary>
+              Logs an error message with lazily constructed message. The message will be constructed only if the <see cref="P:Castle.Core.Logging.ILogger.IsErrorEnabled"/> is true.
+            </summary>
+            <param name="messageFactory"></param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Error(System.String,System.Exception)">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.ErrorFormat(System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.ErrorFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.ErrorFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.ErrorFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Fatal(System.String)">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Fatal(System.Func{System.String})">
+            <summary>
+              Logs a fatal message with lazily constructed message. The message will be constructed only if the <see cref="P:Castle.Core.Logging.ILogger.IsFatalEnabled"/> is true.
+            </summary>
+            <param name="messageFactory"></param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Fatal(System.String,System.Exception)">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalFormat(System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.FatalFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Info(System.String)">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Info(System.Func{System.String})">
+            <summary>
+              Logs a info message with lazily constructed message. The message will be constructed only if the <see cref="P:Castle.Core.Logging.ILogger.IsInfoEnabled"/> is true.
+            </summary>
+            <param name="messageFactory"></param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Info(System.String,System.Exception)">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.InfoFormat(System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.InfoFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.InfoFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.InfoFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Warn(System.String)">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Warn(System.Func{System.String})">
+            <summary>
+              Logs a warn message with lazily constructed message. The message will be constructed only if the <see cref="P:Castle.Core.Logging.ILogger.IsWarnEnabled"/> is true.
+            </summary>
+            <param name="messageFactory"></param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.Warn(System.String,System.Exception)">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.WarnFormat(System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.WarnFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.WarnFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ILogger.WarnFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsDebugEnabled">
+            <summary>
+              Determines if messages of priority "debug" will be logged.
+            </summary>
+            <value>True if "debug" messages will be logged.</value>
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsErrorEnabled">
+            <summary>
+              Determines if messages of priority "error" will be logged.
+            </summary>
+            <value>True if "error" messages will be logged.</value>
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsFatalEnabled">
+            <summary>
+              Determines if messages of priority "fatal" will be logged.
+            </summary>
+            <value>True if "fatal" messages will be logged.</value>
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsInfoEnabled">
+            <summary>
+              Determines if messages of priority "info" will be logged.
+            </summary>
+            <value>True if "info" messages will be logged.</value>
+        </member>
+        <member name="P:Castle.Core.Logging.ILogger.IsWarnEnabled">
+            <summary>
+              Determines if messages of priority "warn" will be logged.
+            </summary>
+            <value>True if "warn" messages will be logged.</value>
+        </member>
+        <member name="P:Castle.Core.Logging.IExtendedLogger.GlobalProperties">
+            <summary>
+              Exposes the Global Context of the extended logger.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.IExtendedLogger.ThreadProperties">
+            <summary>
+              Exposes the Thread Context of the extended logger.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.IExtendedLogger.ThreadStacks">
+            <summary>
+              Exposes the Thread Stack of the extended logger.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.ConsoleLogger">
+            <summary>
+            The Logger sending everything to the standard output streams.
+            This is mainly for the cases when you have a utility that
+            does not have a logger to supply.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Logging.LevelFilteredLogger">
+            <summary>
+            The Level Filtered Logger class.  This is a base clase which
+            provides a LogLevel attribute and reroutes all functions into
+            one Log method.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.#ctor">
+            <summary>
+              Creates a new <c>LevelFilteredLogger</c>.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Debug(System.String)">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Debug(System.String,System.Exception)">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.DebugFormat(System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.DebugFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.DebugFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.DebugFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a debug message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Info(System.String)">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Info(System.String,System.Exception)">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InfoFormat(System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InfoFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InfoFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.InfoFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an info message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Warn(System.String)">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Warn(System.String,System.Exception)">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.WarnFormat(System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.WarnFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.WarnFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.WarnFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a warn message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Error(System.String)">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Error(System.String,System.Exception)">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.ErrorFormat(System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.ErrorFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.ErrorFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.ErrorFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs an error message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Fatal(System.String)">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Fatal(System.String,System.Exception)">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "message">The message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalFormat(System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.FatalFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              Logs a fatal message.
+            </summary>
+            <param name = "exception">The exception to log</param>
+            <param name = "formatProvider">The format provider to use</param>
+            <param name = "format">Format string for the message to log</param>
+            <param name = "args">Format arguments for the message to log</param>
+        </member>
+        <member name="M:Castle.Core.Logging.LevelFilteredLogger.Log(Castle.Core.Logging.LoggerLevel,System.String,System.String,System.Exception)">
+            <summary>
+              Implementors output the log content by implementing this method only.
+              Note that exception can be null
+            </summary>
+            <param name = "loggerLevel"></param>
+            <param name = "loggerName"></param>
+            <param name = "message"></param>
+            <param name = "exception"></param>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.Level">
+            <value>
+              The <c>LoggerLevel</c> that this logger
+              will be using. Defaults to <c>LoggerLevel.Off</c>
+            </value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.Name">
+            <value>
+              The name that this logger will be using. 
+              Defaults to <c>String.Empty</c>
+            </value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsDebugEnabled">
+            <summary>
+              Determines if messages of priority "debug" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Debug"/> bit</value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsInfoEnabled">
+            <summary>
+              Determines if messages of priority "info" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Info"/> bit</value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsWarnEnabled">
+            <summary>
+              Determines if messages of priority "warn" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Warn"/> bit</value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsErrorEnabled">
+            <summary>
+              Determines if messages of priority "error" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Error"/> bit</value>
+        </member>
+        <member name="P:Castle.Core.Logging.LevelFilteredLogger.IsFatalEnabled">
+            <summary>
+              Determines if messages of priority "fatal" will be logged.
+            </summary>
+            <value><c>true</c> if log level flags include the <see cref="F:Castle.Core.Logging.LoggerLevel.Fatal"/> bit</value>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.#ctor">
+            <summary>
+              Creates a new ConsoleLogger with the <c>Level</c>
+              set to <c>LoggerLevel.Debug</c> and the <c>Name</c>
+              set to <c>String.Empty</c>.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.#ctor(Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new ConsoleLogger with the <c>Name</c>
+              set to <c>String.Empty</c>.
+            </summary>
+            <param name = "logLevel">The logs Level.</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.#ctor(System.String)">
+            <summary>
+              Creates a new ConsoleLogger with the <c>Level</c>
+              set to <c>LoggerLevel.Debug</c>.
+            </summary>
+            <param name = "name">The logs Name.</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.#ctor(System.String,Castle.Core.Logging.LoggerLevel)">
+            <summary>
+              Creates a new ConsoleLogger.
+            </summary>
+            <param name = "name">The logs Name.</param>
+            <param name = "logLevel">The logs Level.</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.Log(Castle.Core.Logging.LoggerLevel,System.String,System.String,System.Exception)">
+            <summary>
+              A Common method to log.
+            </summary>
+            <param name = "loggerLevel">The level of logging</param>
+            <param name = "loggerName">The name of the logger</param>
+            <param name = "message">The Message</param>
+            <param name = "exception">The Exception</param>
+        </member>
+        <member name="M:Castle.Core.Logging.ConsoleLogger.CreateChildLogger(System.String)">
+            <summary>
+              Returns a new <c>ConsoleLogger</c> with the name
+              added after this loggers name, with a dot in between.
+            </summary>
+            <param name = "loggerName">The added hierarchical name.</param>
+            <returns>A new <c>ConsoleLogger</c>.</returns>
+        </member>
+        <member name="T:Castle.Core.Logging.NullLogger">
+            <summary>
+              The Null Logger class.  This is useful for implementations where you need
+              to provide a logger to a utility class, but do not want any output from it.
+              It also helps when you have a utility that does not have a logger to supply.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.CreateChildLogger(System.String)">
+            <summary>
+              Returns this <c>NullLogger</c>.
+            </summary>
+            <param name = "loggerName">Ignored</param>
+            <returns>This ILogger instance.</returns>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Debug(System.String)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Debug(System.String,System.Exception)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.DebugFormat(System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.DebugFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.DebugFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.DebugFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Error(System.String)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Error(System.String,System.Exception)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.ErrorFormat(System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.ErrorFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.ErrorFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.ErrorFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Fatal(System.String)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Fatal(System.String,System.Exception)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalFormat(System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.FatalFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Info(System.String)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Info(System.String,System.Exception)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.InfoFormat(System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.InfoFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.InfoFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.InfoFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Warn(System.String)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.Warn(System.String,System.Exception)">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "message">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.WarnFormat(System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.WarnFormat(System.Exception,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.WarnFormat(System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="M:Castle.Core.Logging.NullLogger.WarnFormat(System.Exception,System.IFormatProvider,System.String,System.Object[])">
+            <summary>
+              No-op.
+            </summary>
+            <param name = "exception">Ignored</param>
+            <param name = "formatProvider">Ignored</param>
+            <param name = "format">Ignored</param>
+            <param name = "args">Ignored</param>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.GlobalProperties">
+            <summary>
+              Returns empty context properties.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.ThreadProperties">
+            <summary>
+              Returns empty context properties.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.ThreadStacks">
+            <summary>
+              Returns empty context stacks.
+            </summary>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsDebugEnabled">
+            <summary>
+              No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsErrorEnabled">
+            <summary>
+              No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsFatalEnabled">
+            <summary>
+              No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsInfoEnabled">
+            <summary>
+              No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="P:Castle.Core.Logging.NullLogger.IsWarnEnabled">
+            <summary>
+              No-op.
+            </summary>
+            <value>false</value>
+        </member>
+        <member name="T:Castle.Core.Logging.StreamLogger">
+            <summary>
+            The Stream Logger class.  This class can stream log information
+            to any stream, it is suitable for storing a log file to disk,
+            or to a <c>MemoryStream</c> for testing your components.
+            </summary>
+            <remarks>
+            This logger is not thread safe.
+            </remarks>
+        </member>
+        <member name="M:Castle.Core.Logging.StreamLogger.#ctor(System.String,System.IO.Stream)">
+            <summary>
+              Creates a new <c>StreamLogger</c> with default encoding 
+              and buffer size. Initial Level is set to Debug.
+            </summary>
+            <param name = "name">
+              The name of the log.
+            </param>
+            <param name = "stream">
+              The stream that will be used for logging,
+              seeking while the logger is alive 
+            </param>
+        </member>
+        <member name="M:Castle.Core.Logging.StreamLogger.#ctor(System.String,System.IO.Stream,System.Text.Encoding)">
+            <summary>
+              Creates a new <c>StreamLogger</c> with default buffer size.
+              Initial Level is set to Debug.
+            </summary>
+            <param name="name">
+              The name of the log.
+            </param>
+            <param name="stream">
+              The stream that will be used for logging,
+              seeking while the logger is alive 
+            </param>
+            <param name="encoding">
+              The encoding that will be used for this stream.
+              <see cref="T:System.IO.StreamWriter"/>
+            </param>
+        </member>
+        <member name="M:Castle.Core.Logging.StreamLogger.#ctor(System.String,System.IO.Stream,System.Text.Encoding,System.Int32)">
+            <summary>
+              Creates a new <c>StreamLogger</c>. 
+              Initial Level is set to Debug.
+            </summary>
+            <param name="name">
+              The name of the log.
+            </param>
+            <param name="stream">
+              The stream that will be used for logging,
+              seeking while the logger is alive 
+            </param>
+            <param name="encoding">
+              The encoding that will be used for this stream.
+              <see cref="T:System.IO.StreamWriter"/>
+            </param>
+            <param name="bufferSize">
+              The buffer size that will be used for this stream.
+              <see cref="T:System.IO.StreamWriter"/>
+            </param>
+        </member>
+        <member name="M:Castle.Core.Logging.StreamLogger.#ctor(System.String,System.IO.StreamWriter)">
+            <summary>
+              Creates a new <c>StreamLogger</c> with 
+              Debug as default Level.
+            </summary>
+            <param name = "name">The name of the log.</param>
+            <param name = "writer">The <c>StreamWriter</c> the log will write to.</param>
+        </member>
+        <member name="T:Castle.Core.Configuration.AbstractConfiguration">
+            <summary>
+              This is an abstract <see cref="T:Castle.Core.Configuration.IConfiguration"/> implementation
+              that deals with methods that can be abstracted away
+              from underlying implementations.
+            </summary>
+            <remarks>
+              <para><b>AbstractConfiguration</b> makes easier to implementers 
+                to create a new version of <see cref="T:Castle.Core.Configuration.IConfiguration"/></para>
+            </remarks>
+        </member>
+        <member name="T:Castle.Core.Configuration.IConfiguration">
+            <summary>
+            <see cref="T:Castle.Core.Configuration.IConfiguration"/> is a interface encapsulating a configuration node
+            used to retrieve configuration values.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.IConfiguration.GetValue(System.Type,System.Object)">
+            <summary>
+            Gets the value of the node and converts it 
+            into specified <see cref="T:System.Type"/>.
+            </summary>
+            <param name="type">The <see cref="T:System.Type"/></param>
+            <param name="defaultValue">
+            The Default value returned if the conversion fails.
+            </param>
+            <returns>The Value converted into the specified type.</returns>
+        </member>
+        <member name="P:Castle.Core.Configuration.IConfiguration.Name">
+            <summary>
+            Gets the name of the node.
+            </summary>
+            <value>
+            The Name of the node.
+            </value> 
+        </member>
+        <member name="P:Castle.Core.Configuration.IConfiguration.Value">
+            <summary>
+            Gets the value of the node.
+            </summary>
+            <value>
+            The Value of the node.
+            </value> 
+        </member>
+        <member name="P:Castle.Core.Configuration.IConfiguration.Children">
+            <summary>
+            Gets an <see cref="T:Castle.Core.Configuration.ConfigurationCollection"/> of <see cref="T:Castle.Core.Configuration.IConfiguration"/>
+            elements containing all node children.
+            </summary>
+            <value>The Collection of child nodes.</value>
+        </member>
+        <member name="P:Castle.Core.Configuration.IConfiguration.Attributes">
+            <summary>
+            Gets an <see cref="T:System.Collections.IDictionary"/> of the configuration attributes.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.AbstractConfiguration.GetValue(System.Type,System.Object)">
+            <summary>
+              Gets the value of the node and converts it
+              into specified <see cref="T:System.Type"/>.
+            </summary>
+            <param name="type">The <see cref="T:System.Type"/></param>
+            <param name="defaultValue">
+              The Default value returned if the conversion fails.
+            </param>
+            <returns>The Value converted into the specified type.</returns>
+        </member>
+        <member name="P:Castle.Core.Configuration.AbstractConfiguration.Attributes">
+            <summary>
+              Gets node attributes.
+            </summary>
+            <value>
+              All attributes of the node.
+            </value>
+        </member>
+        <member name="P:Castle.Core.Configuration.AbstractConfiguration.Children">
+            <summary>
+              Gets all child nodes.
+            </summary>
+            <value>The <see cref="T:Castle.Core.Configuration.ConfigurationCollection"/> of child nodes.</value>
+        </member>
+        <member name="P:Castle.Core.Configuration.AbstractConfiguration.Name">
+            <summary>
+              Gets the name of the <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </summary>
+            <value>
+              The Name of the <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </value>
+        </member>
+        <member name="P:Castle.Core.Configuration.AbstractConfiguration.Value">
+            <summary>
+              Gets the value of <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </summary>
+            <value>
+              The Value of the <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </value>
+        </member>
+        <member name="T:Castle.Core.Configuration.ConfigurationCollection">
+            <summary>
+            A collection of <see cref="T:Castle.Core.Configuration.IConfiguration"/> objects.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.ConfigurationCollection.#ctor">
+            <summary>
+            Creates a new instance of <c>ConfigurationCollection</c>.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.ConfigurationCollection.#ctor(System.Collections.Generic.IEnumerable{Castle.Core.Configuration.IConfiguration})">
+            <summary>
+            Creates a new instance of <c>ConfigurationCollection</c>.
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Configuration.MutableConfiguration">
+            <summary>
+            Summary description for MutableConfiguration.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Configuration.MutableConfiguration.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Castle.Core.Configuration.MutableConfiguration"/> class.
+            </summary>
+            <param name="name">The name.</param>
+        </member>
+        <member name="P:Castle.Core.Configuration.MutableConfiguration.Value">
+            <summary>
+            Gets the value of <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </summary>
+            <value>
+            The Value of the <see cref="T:Castle.Core.Configuration.IConfiguration"/>.
+            </value>
+        </member>
+        <member name="T:Castle.Core.Pair`2">
+            <summary>
+            General purpose class to represent a standard pair of values. 
+            </summary>
+            <typeparam name="TFirst">Type of the first value</typeparam>
+            <typeparam name="TSecond">Type of the second value</typeparam>
+        </member>
+        <member name="M:Castle.Core.Pair`2.#ctor(`0,`1)">
+            <summary>
+            Constructs a pair with its values
+            </summary>
+            <param name="first"></param>
+            <param name="second"></param>
+        </member>
+        <member name="T:Castle.Core.ProxyServices">
+            <summary>
+            List of utility methods related to dynamic proxy operations
+            </summary>
+        </member>
+        <member name="M:Castle.Core.ProxyServices.IsDynamicProxy(System.Type)">
+            <summary>
+            Determines whether the specified type is a proxy generated by
+            DynamicProxy (1 or 2).
+            </summary>
+            <param name="type">The type.</param>
+            <returns>
+            	<c>true</c> if it is a proxy; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="T:Castle.Core.ReflectionBasedDictionaryAdapter">
+            <summary>
+            Readonly implementation of <see cref="T:System.Collections.IDictionary"/> which uses an anonymous object as its source. Uses names of properties as keys, and property values as... well - values. Keys are not case sensitive.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.#ctor(System.Object)">
+            <summary>
+              Initializes a new instance of the <see cref="T:Castle.Core.ReflectionBasedDictionaryAdapter"/> class.
+            </summary>
+            <param name="target">The target.</param>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Add(System.Object,System.Object)">
+            <summary>
+              Adds an element with the provided key and value to the <see cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <param name = "key">The <see cref = "T:System.Object" /> to use as the key of the element to add.</param>
+            <param name = "value">The <see cref = "T:System.Object" /> to use as the value of the element to add.</param>
+            <exception cref = "T:System.ArgumentNullException">
+              <paramref name = "key" /> is null. </exception>
+            <exception cref = "T:System.ArgumentException">An element with the same key already exists in the <see
+               cref = "T:System.Collections.IDictionary" /> object. </exception>
+            <exception cref = "T:System.NotSupportedException">The <see cref = "T:System.Collections.IDictionary" /> is read-only.-or- The <see
+               cref = "T:System.Collections.IDictionary" /> has a fixed size. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Clear">
+            <summary>
+              Removes all elements from the <see cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <exception cref = "T:System.NotSupportedException">The <see cref = "T:System.Collections.IDictionary" /> object is read-only. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Contains(System.Object)">
+            <summary>
+              Determines whether the <see cref = "T:System.Collections.IDictionary" /> object contains an element with the specified key.
+            </summary>
+            <param name = "key">The key to locate in the <see cref = "T:System.Collections.IDictionary" /> object.</param>
+            <returns>
+              true if the <see cref = "T:System.Collections.IDictionary" /> contains an element with the key; otherwise, false.
+            </returns>
+            <exception cref = "T:System.ArgumentNullException">
+              <paramref name = "key" /> is null. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Remove(System.Object)">
+            <summary>
+              Removes the element with the specified key from the <see cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <param name = "key">The key of the element to remove.</param>
+            <exception cref = "T:System.ArgumentNullException">
+              <paramref name = "key" /> is null. </exception>
+            <exception cref = "T:System.NotSupportedException">The <see cref = "T:System.Collections.IDictionary" /> object is read-only.-or- The <see
+               cref = "T:System.Collections.IDictionary" /> has a fixed size. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.GetEnumerator">
+            <summary>
+              Returns an enumerator that iterates through a collection.
+            </summary>
+            <returns>
+              An <see cref = "T:System.Collections.IEnumerator" /> object that can be used to iterate through the collection.
+            </returns>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.System#Collections#ICollection#CopyTo(System.Array,System.Int32)">
+            <summary>
+              Copies the elements of the <see cref = "T:System.Collections.ICollection" /> to an <see cref = "T:System.Array" />, starting at a particular <see
+               cref = "T:System.Array" /> index.
+            </summary>
+            <param name = "array">The one-dimensional <see cref = "T:System.Array" /> that is the destination of the elements copied from <see
+               cref = "T:System.Collections.ICollection" />. The <see cref = "T:System.Array" /> must have zero-based indexing.</param>
+            <param name = "index">The zero-based index in <paramref name = "array" /> at which copying begins.</param>
+            <exception cref = "T:System.ArgumentNullException">
+              <paramref name = "array" /> is null. </exception>
+            <exception cref = "T:System.ArgumentOutOfRangeException">
+              <paramref name = "index" /> is less than zero. </exception>
+            <exception cref = "T:System.ArgumentException">
+              <paramref name = "array" /> is multidimensional.-or- <paramref name = "index" /> is equal to or greater than the length of <paramref
+               name = "array" />.-or- The number of elements in the source <see cref = "T:System.Collections.ICollection" /> is greater than the available space from <paramref
+               name = "index" /> to the end of the destination <paramref name = "array" />. </exception>
+            <exception cref = "T:System.ArgumentException">The type of the source <see cref = "T:System.Collections.ICollection" /> cannot be cast automatically to the type of the destination <paramref
+               name = "array" />. </exception>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.System#Collections#IDictionary#GetEnumerator">
+            <summary>
+              Returns an <see cref = "T:System.Collections.IDictionaryEnumerator" /> object for the <see
+               cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <returns>
+              An <see cref = "T:System.Collections.IDictionaryEnumerator" /> object for the <see
+               cref = "T:System.Collections.IDictionary" /> object.
+            </returns>
+        </member>
+        <member name="M:Castle.Core.ReflectionBasedDictionaryAdapter.Read(System.Collections.IDictionary,System.Object)">
+            <summary>
+              Reads values of properties from <paramref name = "valuesAsAnonymousObject" /> and inserts them into <paramref
+               name = "targetDictionary" /> using property names as keys.
+            </summary>
+            <param name = "targetDictionary"></param>
+            <param name = "valuesAsAnonymousObject"></param>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.Count">
+            <summary>
+              Gets the number of elements contained in the <see cref = "T:System.Collections.ICollection" />.
+            </summary>
+            <value></value>
+            <returns>The number of elements contained in the <see cref = "T:System.Collections.ICollection" />.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.IsSynchronized">
+            <summary>
+              Gets a value indicating whether access to the <see cref = "T:System.Collections.ICollection" /> is synchronized (thread safe).
+            </summary>
+            <value></value>
+            <returns>true if access to the <see cref = "T:System.Collections.ICollection" /> is synchronized (thread safe); otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.SyncRoot">
+            <summary>
+              Gets an object that can be used to synchronize access to the <see cref = "T:System.Collections.ICollection" />.
+            </summary>
+            <value></value>
+            <returns>An object that can be used to synchronize access to the <see cref = "T:System.Collections.ICollection" />.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.IsReadOnly">
+            <summary>
+              Gets a value indicating whether the <see cref = "T:System.Collections.IDictionary" /> object is read-only.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref = "T:System.Collections.IDictionary" /> object is read-only; otherwise, false.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.Item(System.Object)">
+            <summary>
+              Gets or sets the <see cref="T:System.Object"/> with the specified key.
+            </summary>
+            <value></value>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.Keys">
+            <summary>
+              Gets an <see cref = "T:System.Collections.ICollection" /> object containing the keys of the <see
+               cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <value></value>
+            <returns>An <see cref = "T:System.Collections.ICollection" /> object containing the keys of the <see
+               cref = "T:System.Collections.IDictionary" /> object.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.Values">
+            <summary>
+              Gets an <see cref = "T:System.Collections.ICollection" /> object containing the values in the <see
+               cref = "T:System.Collections.IDictionary" /> object.
+            </summary>
+            <value></value>
+            <returns>An <see cref = "T:System.Collections.ICollection" /> object containing the values in the <see
+               cref = "T:System.Collections.IDictionary" /> object.</returns>
+        </member>
+        <member name="P:Castle.Core.ReflectionBasedDictionaryAdapter.System#Collections#IDictionary#IsFixedSize">
+            <summary>
+              Gets a value indicating whether the <see cref = "T:System.Collections.IDictionary" /> object has a fixed size.
+            </summary>
+            <value></value>
+            <returns>true if the <see cref = "T:System.Collections.IDictionary" /> object has a fixed size; otherwise, false.</returns>
+        </member>
+        <member name="T:Castle.Core.Resource.IResource">
+            <summary>
+            Represents a 'streamable' resource. Can
+            be a file, a resource in an assembly.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Resource.IResource.GetStreamReader">
+            <summary>
+            Returns a reader for the stream
+            </summary>
+            <remarks>
+            It's up to the caller to dispose the reader.
+            </remarks>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Resource.IResource.GetStreamReader(System.Text.Encoding)">
+            <summary>
+            Returns a reader for the stream
+            </summary>
+            <remarks>
+            It's up to the caller to dispose the reader.
+            </remarks>
+            <param name="encoding"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Resource.IResource.CreateRelative(System.String)">
+            <summary>
+            Returns an instance of <see cref="T:Castle.Core.Resource.IResource"/>
+            created according to the <c>relativePath</c>
+            using itself as the root.
+            </summary>
+            <param name="relativePath"></param>
+            <returns></returns>
+        </member>
+        <member name="P:Castle.Core.Resource.IResource.FileBasePath">
+            <summary>
+            
+            </summary>
+            <remarks>
+            Only valid for resources that
+            can be obtained through relative paths
+            </remarks>
+        </member>
+        <member name="T:Castle.Core.Resource.AbstractStreamResource">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="F:Castle.Core.Resource.AbstractStreamResource.createStream">
+            <summary>
+            This returns a new stream instance each time it is called.
+            It is the responsibility of the caller to dispose of this stream
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Resource.IResourceFactory">
+            <summary>
+            Depicts the contract for resource factories.
+            </summary>
+        </member>
+        <member name="M:Castle.Core.Resource.IResourceFactory.Accept(Castle.Core.Resource.CustomUri)">
+            <summary>
+            Used to check whether the resource factory
+            is able to deal with the given resource
+            identifier.
+            </summary>
+            <remarks>
+            Implementors should return <c>true</c>
+            only if the given identifier is supported
+            by the resource factory
+            </remarks>
+            <param name="uri"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Resource.IResourceFactory.Create(Castle.Core.Resource.CustomUri)">
+            <summary>
+            Creates an <see cref="T:Castle.Core.Resource.IResource"/> instance
+            for the given resource identifier
+            </summary>
+            <param name="uri"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Castle.Core.Resource.IResourceFactory.Create(Castle.Core.Resource.CustomUri,System.String)">
+            <summary>
+            Creates an <see cref="T:Castle.Core.Resource.IResource"/> instance
+            for the given resource identifier
+            </summary>
+            <param name="uri"></param>
+            <param name="basePath"></param>
+            <returns></returns>
+        </member>
+        <member name="T:Castle.Core.Resource.FileResource">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Resource.StaticContentResource">
+            <summary>
+            Adapts a static string content as an <see cref="T:Castle.Core.Resource.IResource"/>
+            </summary>
+        </member>
+        <member name="T:Castle.Core.Resource.UncResource">
+            <summary>
+            Enable access to files on network shares
+            </summary>
+        </member>
+    </members>
+</doc>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/Castle.Core.3.2.1/readme.txt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10 @@
+Thanks for downloading this Castle package.
+You can find full list of changes in changes.txt
+
+Documentation (work in progress, contributions appreciated):
+Dictionary Adapter	- http://docs.castleproject.org/Tools.Castle-DictionaryAdapter.ashx
+DynamicProxy		- http://docs.castleproject.org/Tools.DynamicProxy.ashx
+Discusssion group: 	- http://groups.google.com/group/castle-project-users
+StackOverflow tags:	- castle-dynamicproxy, castle-dictionaryadapter, castle
+
+Issue tracker: 		- http://issues.castleproject.org/dashboard
\ No newline at end of file
Binary file packages/FirebirdSql.Data.FirebirdClient.4.0.0.0/FirebirdSql.Data.FirebirdClient.4.0.0.0.nupkg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/FirebirdSql.Data.FirebirdClient.4.0.0.0/FirebirdSql.Data.FirebirdClient.4.0.0.0.nuspec	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
+  <metadata>
+    <id>FirebirdSql.Data.FirebirdClient</id>
+    <version>4.0.0.0</version>
+    <title>Firebird ADO.NET Data provider</title>
+    <authors>FirebirdSQL</authors>
+    <owners>FirebirdSQL</owners>
+    <licenseUrl>http://firebird.svn.sourceforge.net/viewvc/firebird/NETProvider/trunk/NETProvider/license.txt</licenseUrl>
+    <projectUrl>http://www.firebirdsql.org/en/net-provider/</projectUrl>
+    <iconUrl>http://www.firebirdsql.org/file/about/ds-firebird-logo-64.png</iconUrl>
+    <requireLicenseAcceptance>false</requireLicenseAcceptance>
+    <description>Firebird ADO.NET Data provider</description>
+    <tags>firebird firebirsql firebirdclient adonet database</tags>
+  </metadata>
+</package>
\ No newline at end of file
Binary file packages/FirebirdSql.Data.FirebirdClient.4.0.0.0/lib/net40-client/FirebirdSql.Data.FirebirdClient.dll has changed
Binary file packages/FirebirdSql.Data.FirebirdClient.4.0.0.0/lib/net45/FirebirdSql.Data.FirebirdClient.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/Microsoft.SqlServer.Compact.4.0.8876.1/Content/web.config.transform	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+<configuration>
+    <system.data>        
+        <DbProviderFactories>
+            <remove invariant="System.Data.SqlServerCe.4.0" />
+            <add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
+        </DbProviderFactories>
+    </system.data>
+</configuration>
\ No newline at end of file
Binary file packages/Microsoft.SqlServer.Compact.4.0.8876.1/Microsoft.SqlServer.Compact.4.0.8876.1.nupkg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/amd64/Microsoft.VC90.CRT/Microsoft.VC90.CRT.manifest	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+    <noInheritable></noInheritable>
+    <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.4148" processorArchitecture="amd64" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
+    <file name="msvcr90.dll" hashalg="SHA1" hash="1b065fdf0cb8516b0553128eae4af39c5f8eeb46"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>Vy8CgQgbu3qH5JHTK0op4kR8114=</dsig:DigestValue></asmv2:hash></file> <file name="msvcp90.dll" hashalg="SHA1" hash="45d3027d87eade77317e92994790598c755b3920"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>QTJu3Gttpt8hhCktGelNeXj4Yp8=</dsig:DigestValue></asmv2:hash></file> <file name="msvcm90.dll" hashalg="SHA1" hash="e77fd69f7c88f34329d8a95c3179f67ead330217"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>1ruqF7/L+m1tqnJVscaOtNRNHIE=</dsig:DigestValue></asmv2:hash></file>
+</assembly>
\ No newline at end of file
Binary file packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/amd64/Microsoft.VC90.CRT/README_ENU.txt has changed
Binary file packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/amd64/Microsoft.VC90.CRT/msvcr90.dll has changed
Binary file packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/amd64/sqlceca40.dll has changed
Binary file packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/amd64/sqlcecompact40.dll has changed
Binary file packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/amd64/sqlceer40EN.dll has changed
Binary file packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/amd64/sqlceme40.dll has changed
Binary file packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/amd64/sqlceqp40.dll has changed
Binary file packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/amd64/sqlcese40.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/x86/Microsoft.VC90.CRT/Microsoft.VC90.CRT.manifest	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+    <noInheritable></noInheritable>
+    <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.4148" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
+    <file name="msvcr90.dll" hashalg="SHA1" hash="98e8006e0a4542e69f1a3555b927758bd76ca07d"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>+CXED+6HzJlSphyMNOn27ujadC0=</dsig:DigestValue></asmv2:hash></file> <file name="msvcp90.dll" hashalg="SHA1" hash="3aec3be680024a46813dee891a753bd58b3f3b12"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>MyKED+9DyS+1XcMeaC0Zlw2vFZ0=</dsig:DigestValue></asmv2:hash></file> <file name="msvcm90.dll" hashalg="SHA1" hash="0195dd0896d74b62531e4f3c771904a3d996450e"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>EeyDE7og6WoPd2oBhYbMEnpFHhY=</dsig:DigestValue></asmv2:hash></file>
+</assembly>
\ No newline at end of file
Binary file packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/x86/Microsoft.VC90.CRT/README_ENU.txt has changed
Binary file packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/x86/Microsoft.VC90.CRT/msvcr90.dll has changed
Binary file packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/x86/sqlceca40.dll has changed
Binary file packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/x86/sqlcecompact40.dll has changed
Binary file packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/x86/sqlceer40EN.dll has changed
Binary file packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/x86/sqlceme40.dll has changed
Binary file packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/x86/sqlceqp40.dll has changed
Binary file packages/Microsoft.SqlServer.Compact.4.0.8876.1/NativeBinaries/x86/sqlcese40.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/Microsoft.SqlServer.Compact.4.0.8876.1/SQLCE_EULA_ENU.rtf	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,774 @@
+{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff38\deff0\stshfdbch11\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033\themelang1033\themelangfe2052\themelangcs1025{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}
+{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New{\*\falt Arial};}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol{\*\falt Bookshelf Symbol 3};}
+{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings{\*\falt Symbol};}{\f11\fbidi \fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt ?l?r ??\'81\'66c};}
+{\f13\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ??????\'a8\'ac???};}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math;}
+{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma{\*\falt ?? ??};}{\f39\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0603020202020204}Trebuchet MS{\*\falt Arial};}
+{\f40\fbidi \fmodern\fcharset128\fprq1{\*\panose 00000000000000000000}@MS Mincho{\*\falt @MS Gothic};}{\f41\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun;}
+{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbmajor\f31501\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ??????\'a8\'ac???};}
+{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}
+{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbminor\f31505\fbidi \fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ??????\'a8\'ac???};}
+{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}{\f42\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}
+{\f43\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\f45\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\f46\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}
+{\f47\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\f48\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\f49\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}
+{\f50\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\f62\fbidi \fmodern\fcharset238\fprq1 Courier New CE{\*\falt Arial};}{\f63\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr{\*\falt Arial};}
+{\f65\fbidi \fmodern\fcharset161\fprq1 Courier New Greek{\*\falt Arial};}{\f66\fbidi \fmodern\fcharset162\fprq1 Courier New Tur{\*\falt Arial};}{\f67\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew){\*\falt Arial};}
+{\f68\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic){\*\falt Arial};}{\f69\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic{\*\falt Arial};}{\f70\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese){\*\falt Arial};}
+{\f154\fbidi \fmodern\fcharset0\fprq1 MS Mincho Western{\*\falt ?l?r ??\'81\'66c};}{\f152\fbidi \fmodern\fcharset238\fprq1 MS Mincho CE{\*\falt ?l?r ??\'81\'66c};}{\f153\fbidi \fmodern\fcharset204\fprq1 MS Mincho Cyr{\*\falt ?l?r ??\'81\'66c};}
+{\f155\fbidi \fmodern\fcharset161\fprq1 MS Mincho Greek{\*\falt ?l?r ??\'81\'66c};}{\f156\fbidi \fmodern\fcharset162\fprq1 MS Mincho Tur{\*\falt ?l?r ??\'81\'66c};}{\f159\fbidi \fmodern\fcharset186\fprq1 MS Mincho Baltic{\*\falt ?l?r ??\'81\'66c};}
+{\f174\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ??????\'a8\'ac???};}{\f382\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}{\f383\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;}{\f385\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}
+{\f386\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f389\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}{\f390\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);}{\f422\fbidi \fswiss\fcharset238\fprq2 Tahoma CE{\*\falt ?? ??};}
+{\f423\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr{\*\falt ?? ??};}{\f425\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek{\*\falt ?? ??};}{\f426\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur{\*\falt ?? ??};}
+{\f427\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew){\*\falt ?? ??};}{\f428\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic){\*\falt ?? ??};}{\f429\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic{\*\falt ?? ??};}
+{\f430\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese){\*\falt ?? ??};}{\f431\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai){\*\falt ?? ??};}{\f432\fbidi \fswiss\fcharset238\fprq2 Trebuchet MS CE{\*\falt Arial};}
+{\f433\fbidi \fswiss\fcharset204\fprq2 Trebuchet MS Cyr{\*\falt Arial};}{\f435\fbidi \fswiss\fcharset161\fprq2 Trebuchet MS Greek{\*\falt Arial};}{\f436\fbidi \fswiss\fcharset162\fprq2 Trebuchet MS Tur{\*\falt Arial};}
+{\f439\fbidi \fswiss\fcharset186\fprq2 Trebuchet MS Baltic{\*\falt Arial};}{\f444\fbidi \fmodern\fcharset0\fprq1 @MS Mincho Western{\*\falt @MS Gothic};}{\f442\fbidi \fmodern\fcharset238\fprq1 @MS Mincho CE{\*\falt @MS Gothic};}
+{\f443\fbidi \fmodern\fcharset204\fprq1 @MS Mincho Cyr{\*\falt @MS Gothic};}{\f445\fbidi \fmodern\fcharset161\fprq1 @MS Mincho Greek{\*\falt @MS Gothic};}{\f446\fbidi \fmodern\fcharset162\fprq1 @MS Mincho Tur{\*\falt @MS Gothic};}
+{\f449\fbidi \fmodern\fcharset186\fprq1 @MS Mincho Baltic{\*\falt @MS Gothic};}{\f454\fbidi \fnil\fcharset0\fprq2 @SimSun Western;}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}
+{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}
+{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}
+{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}
+{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fdbmajor\f31520\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ??????\'a8\'ac???};}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}
+{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}
+{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}
+{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}
+{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}
+{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}
+{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}
+{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}
+{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}
+{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}
+{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fdbminor\f31560\fbidi \fnil\fcharset0\fprq2 SimSun Western{\*\falt ??????\'a8\'ac???};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}
+{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}
+{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \fswiss\fcharset238\fprq2 Arial CE;}
+{\fbiminor\f31579\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;}{\fbiminor\f31581\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\fbiminor\f31582\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\fbiminor\f31583\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}
+{\fbiminor\f31584\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}{\fbiminor\f31585\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\fbiminor\f31586\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;
+\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;
+\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red31\green73\blue125;\ctextone\ctint255\cshade255\red0\green0\blue0;}{\*\defchp \fs22\dbch\af11 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1
+\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \sautoupd \sqformat \spriority0 \styrsid1456345 Normal;}{\s1\ql \fi-357\li357\ri0\sb120\sa120\widctlpar
+\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon0 \snext1 \slink15 \sqformat \styrsid1456345 heading 1;}{\s2\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 
+\ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext2 \slink16 \sqformat \styrsid1456345 heading 2;}{\s3\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar
+\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon0 \snext3 \slink17 \sqformat \styrsid1456345 heading 3;}{\s4\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl3\outlinelevel3\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 
+\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext4 \slink18 \sqformat \styrsid1456345 heading 4;}{\s5\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar
+\tx1792\jclisttab\tx2155\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl4\outlinelevel4\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon0 \snext5 \slink19 \sqformat \styrsid1456345 heading 5;}{\s6\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl5\outlinelevel5\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 
+\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext6 \slink20 \sqformat \styrsid1456345 heading 6;}{\s7\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar
+\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl6\outlinelevel6\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon0 \snext7 \slink21 \sqformat \styrsid1456345 heading 7;}{\s8\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl7\outlinelevel7\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 
+\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext8 \slink22 \sqformat \styrsid1456345 heading 8;}{\s9\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar
+\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl8\outlinelevel8\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon0 \snext9 \slink23 \sqformat \styrsid1456345 heading 9;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\*
+\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1
+\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f0\hich\af0\dbch\af11\cgrid\langnp1033\langfenp1033 \snext11 \ssemihidden \sunhideused Normal Table;}{\*
+\cs15 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink1 \slocked \styrsid1456345 Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af38\afs19 \ltrch\fcs0 \b\f38\fs19 \sbasedon10 \slink2 \slocked \styrsid1456345 
+Heading 2 Char;}{\*\cs17 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink3 \slocked \styrsid1456345 Heading 3 Char;}{\*\cs18 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink4 \slocked \styrsid1456345 
+Heading 4 Char;}{\*\cs19 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink5 \slocked \styrsid1456345 Heading 5 Char;}{\*\cs20 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink6 \slocked \styrsid1456345 
+Heading 6 Char;}{\*\cs21 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink7 \slocked \styrsid1456345 Heading 7 Char;}{\*\cs22 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink8 \slocked \styrsid1456345 
+Heading 8 Char;}{\*\cs23 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink9 \slocked \styrsid1456345 Heading 9 Char;}{\s24\ql \li357\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0 
+\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext24 \styrsid1456345 Body 1;}{
+\s25\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon0 \snext25 \styrsid1456345 Body 2;}{\s26\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext26 \styrsid1456345 Body 3;}{\s27\ql \li1435\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 
+\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext27 \styrsid1456345 Body 4;}{
+\s28\ql \li1803\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1803\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon0 \snext28 \styrsid1456345 Body 5;}{\s29\ql \li2160\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2160\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext29 \styrsid1456345 Body 6;}{\s30\ql \li2506\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 
+\af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext30 \styrsid1456345 Body 7;}{
+\s31\ql \li2863\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon0 \snext31 \styrsid1456345 Body 8;}{\s32\ql \li3221\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext32 \styrsid1456345 Body 9;}{\s33\ql \fi-357\li357\ri0\sb120\sa120\widctlpar
+\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin357\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext33 \styrsid1456345 
+Bullet 1;}{\s34\ql \fi-363\li720\ri0\sb120\sa120\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext34 \styrsid1456345 Bullet 2;}{\s35\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar
+\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon0 \snext35 \slink87 \styrsid1456345 Bullet 3;}{\s36\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext36 \styrsid1456345 Bullet 4;}{\s37\ql \fi-357\li1792\ri0\sb120\sa120\widctlpar
+\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext37 \styrsid1456345 
+Bullet 5;}{\s38\ql \fi-357\li2149\ri0\sb120\sa120\widctlpar\jclisttab\tx2152\wrapdefault\aspalpha\aspnum\faauto\ls6\adjustright\rin0\lin2149\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext38 \styrsid1456345 Bullet 6;}{\s39\ql \fi-357\li2506\ri0\sb120\sa120\widctlpar
+\jclisttab\tx2509\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin2506\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext39 \styrsid1456345 
+Bullet 7;}{\s40\ql \fi-357\li2863\ri0\sb120\sa120\widctlpar\jclisttab\tx2866\wrapdefault\aspalpha\aspnum\faauto\ls8\adjustright\rin0\lin2863\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext40 \styrsid1456345 Bullet 8;}{\s41\ql \fi-358\li3221\ri0\sb120\sa120\widctlpar
+\jclisttab\tx3223\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin3221\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon32 \snext41 \styrsid1456345 Bullet 9;}{\s42\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \styrsid1456345 Heading EULA;}{\s43\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 
+\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 \b\fs28\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \styrsid1456345 
+Heading Software Title;}{\s44\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 
+\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext44 \styrsid1456345 Preamble;}{\s45\ql \li0\ri0\sb120\sa120\widctlpar\brdrb\brdrs\brdrw10\brsp20 
+\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext1 \styrsid1456345 Preamble Border;}{
+\s46\qc \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon0 \snext46 \styrsid1456345 Heading Warranty;}{\s47\ql \fi-360\li360\ri0\sb120\sa120\widctlpar\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls11\outlinelevel0\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \styrsid1456345 Heading 1 Warranty;}{\s48\ql \fi-360\li720\ri0\sb120\sa120\widctlpar
+\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls11\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon0 \snext0 \styrsid1456345 Heading 2 Warranty;}{\s49\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\tx1077\jclisttab\tx1440\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 
+\ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon3 \snext49 \styrsid1456345 Heading 3 Bold;}{\s50\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar
+\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon36 \snext50 \styrsid1456345 Bullet 4 Underline;}{\s51\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 
+\fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext51 \styrsid1456345 Bullet 3 Underline;}{\s52\ql \li720\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0 
+\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon25 \snext52 \styrsid1456345 Body 2 Underline;}{
+\s53\ql \li1077\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin1077\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon26 \snext53 \styrsid1456345 Body 3 Underline;}{\s54\ql \li0\ri0\sb120\sa120\sl480\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext54 \slink55 \styrsid1456345 Body Text Indent;}{\*\cs55 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 
+\sbasedon10 \slink54 \slocked \ssemihidden \styrsid1456345 Body Text Indent Char;}{\s56\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 \rtlch\fcs1 
+\ai\af38\afs19\alang1025 \ltrch\fcs0 \i\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext56 \styrsid1456345 Bullet 4 Italics;}{\*\cs57 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 
+\f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 \styrsid1456345 Body 2 Char;}{\*\cs58 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 \styrsid1456345 Body 3 Char;}{\*\cs59 \additive 
+\rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 \styrsid1456345 Body 4 Char;}{\*\cs60 \additive \rtlch\fcs1 \af38 \ltrch\fcs0 \f38\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 \styrsid1456345 
+Body 1 Char;}{\s61\ql \li0\ri0\sb120\sa120\widctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 
+\b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon44 \snext61 \styrsid1456345 Preamble Border Above;}{\s62\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 
+\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext62 \slink63 \ssemihidden \styrsid1456345 footnote text;}{\*\cs63 \additive \rtlch\fcs1 \af38\afs20 
+\ltrch\fcs0 \f38\fs20 \sbasedon10 \slink62 \slocked \ssemihidden \styrsid1456345 Footnote Text Char;}{\*\cs64 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \super \sbasedon10 \ssemihidden \styrsid1456345 footnote reference;}{
+\s65\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon0 \snext65 \slink66 \ssemihidden \styrsid1456345 endnote text;}{\*\cs66 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 \sbasedon10 \slink65 \slocked \ssemihidden \styrsid1456345 Endnote Text Char;}{\*\cs67 \additive \rtlch\fcs1 \af0 
+\ltrch\fcs0 \super \sbasedon10 \ssemihidden \styrsid1456345 endnote reference;}{\s68\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext68 \slink69 \ssemihidden \styrsid1456345 annotation text;}{\*\cs69 \additive \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20 
+\sbasedon10 \slink68 \slocked \ssemihidden \styrsid1456345 Comment Text Char;}{\*\cs70 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \fs16 \sbasedon10 \ssemihidden \styrsid1456345 annotation reference;}{\s71\ql \li0\ri0\sa160\sl-240\slmult0
+\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext71 \styrsid1456345 Char;}{
+\s72\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon0 \snext72 \styrsid1456345 Char Char Char Char;}{\*\cs73 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 \sbasedon10 \styrsid1456345 Hyperlink;}{\s74\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 
+\rtlch\fcs1 \af38\afs16\alang1025 \ltrch\fcs0 \fs16\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext74 \slink75 \ssemihidden \styrsid1456345 Balloon Text;}{\*\cs75 \additive \rtlch\fcs1 \af38\afs16 
+\ltrch\fcs0 \f38\fs16 \sbasedon10 \slink74 \slocked \ssemihidden \styrsid1456345 Balloon Text Char;}{\*\cs76 \additive \rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 \styrsid1456345 Heading 2 Char1;}{\*
+\cs77 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10 \styrsid1456345 page number;}{\s78\ql \li0\ri0\sa160\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext78 \styrsid1456345 Char Char Char Char1;}{\s79\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 
+\ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \styrsid1456345 Body 0 Bold;}{\s80\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 
+\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \snext0 \styrsid1456345 Body 0;}{\s81\ql \li0\ri0\sb120\sa120\widctlpar
+\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon0 \snext81 \slink82 \styrsid1456345 header;}{\*\cs82 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink81 \slocked \styrsid1456345 Header Char;}{\s83\ql \li0\ri0\sb120\sa120\widctlpar
+\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon0 \snext83 \slink84 \styrsid1456345 footer;}{\*\cs84 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink83 \slocked \ssemihidden \styrsid1456345 Footer Char;}{
+\s85\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af38\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon68 \snext68 \slink86 \ssemihidden \sunhideused \styrsid1456345 annotation subject;}{\*\cs86 \additive \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\f38\fs20 \sbasedon69 \slink85 \slocked \ssemihidden \styrsid1456345 Comment Subject Char;}{\*\cs87 
+\additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 \f38\fs19 \sbasedon10 \slink35 \slocked \styrsid1456345 Bullet 3 Char1;}{\s88\ql \fi-357\li1077\ri0\sb120\sa120\widctlpar\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1077\itap0 
+\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon35 \snext88 \styrsid1456345 Bullet 3 Underlined;}{\*\cs89 \additive \rtlch\fcs1 \af38\afs19 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\langnp1033\langfenp1033 \sbasedon10 \styrsid1456345 Char Char;}{\s90\ql \li0\ri0\sl-240\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 
+\af38\afs20\alang1025 \ltrch\fcs0 \fs18\lang1033\langfe1033\loch\f39\hich\af39\dbch\af11\cgrid\langnp1033\langfenp1033 \snext90 \spriority0 \styrsid1456345 AdditionalSoftware;}{\*\cs91 \additive \rtlch\fcs1 \af38\afs24\alang1025 \ltrch\fcs0 
+\b\f39\fs24\lang1033\langfe1033\langnp1033\langfenp1033 \sbasedon10 \spriority0 \styrsid1456345 Char Char1;}{\s92\ql \fi-358\li1435\ri0\sb120\sa120\widctlpar\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0 
+\rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon36 \snext92 \spriority0 \styrsid1456345 Bullet 4 Underlined;}{\s93\ql \fi-360\li360\ri0\sb120\sa120\widctlpar
+\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls31\adjustright\rin0\lin360\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\f38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 
+\sbasedon0 \snext93 \spriority0 \styrsid1456345 Heading French Warranty;}{\s94\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 
+\fs22\lang1033\langfe1033\loch\f31506\hich\af31506\dbch\af11\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext94 \sqformat \spriority34 \styrsid921734 List Paragraph;}}{\*\listtable{\list\listtemplateid1821544400\listhybrid{\listlevel\levelnfc23\levelnfcn23
+\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
+\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1380\jclisttab\tx1380\lin1380 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
+{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2100\jclisttab\tx2100\lin2100 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext
+\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2820\jclisttab\tx2820\lin2820 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext
+\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3540\jclisttab\tx3540\lin3540 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693
+\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4260\jclisttab\tx4260\lin4260 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689
+\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4980\jclisttab\tx4980\lin4980 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691
+\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5700\jclisttab\tx5700\lin5700 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693
+\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6420\jclisttab\tx6420\lin6420 }{\listname ;}\listid189493747}{\list\listtemplateid176468498\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
+\levelindent0{\leveltext\leveltemplateid692200086\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s41\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693
+\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}
+\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600
+\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }
+{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23
+\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
+\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid196815738}{\list\listtemplateid-1793664660{\listlevel\levelnfc3
+\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s47\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc0\levelnfcn0
+\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s48\fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0
+\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1080\jclisttab\tx1080\lin1080 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1
+\levelspace0\levelindent0{\leveltext\'03(\'03);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
+{\leveltext\'03(\'04);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\'03(\'05);}{\levelnumbers\'02;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}
+\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li2520\jclisttab\tx2520\lin2520 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 
+\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li3240
+\jclisttab\tx3240\lin3240 }{\listname ;}\listid394402059}{\list\listtemplateid1928476992{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 
+\ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 
+\ab\ai0\af39\afs20 \ltrch\fcs0 \b\i0\f39\fs20\fbias0 \fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 
+\ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s49\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 
+\ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers
+\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
+{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
+{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid398796681}{\list\listtemplateid789093748\listhybrid{\listlevel\levelnfc23\levelnfcn23
+\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-317712510\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s34\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
+\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
+\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691
+\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}
+\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040
+\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel
+\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid477573462}
+{\list\listtemplateid-53848358{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s1
+\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s2
+\fi-363\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af38\afs20 \ltrch\fcs0 \b\i0\f38\fs20\fbias0 \s3
+\fi-357\li1077\jclisttab\tx1440\lin1077 }{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 
+\b0\i0\strike0\f39\fs20\ulnone\fbias0 \s4\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 
+\ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\strike0\f39\fs20\ulnone\fbias0 \s5\fi-357\li1792\jclisttab\tx2155\lin1792 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers
+\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s6\fi-357\li2149\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s7\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
+{\leveltext\'02i.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s8\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
+{\leveltext\'02A.;}{\levelnumbers;}\rtlch\fcs1 \ab0\ai0\af39\afs20 \ltrch\fcs0 \b0\i0\f39\fs20\fbias0 \s9\fi-358\li3221\jclisttab\tx3223\lin3221 }{\listname ;}\listid752163927}{\list\listtemplateid-296591990\listhybrid{\listlevel\levelnfc23\levelnfcn23
+\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s40\fi-357\li2863\jclisttab\tx2866\lin2863 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
+\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 
+\fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23
+\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
+\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480
+\jclisttab\tx6480\lin6480 }{\listname ;}\listid810947713}{\list\listtemplateid-1813845996\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}
+\f3\fbias0 \s39\fi-357\li2506\jclisttab\tx2509\lin2506 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }
+{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
+\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
+{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 
+\fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel
+\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
+\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1219436735}{\list\listtemplateid280937824\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0
+\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li1124\lin1124 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
+\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1844\lin1844 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0
+{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2564\lin2564 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689
+\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li3284\lin3284 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 
+\fi-360\li4004\lin4004 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4724\lin4724 }{\listlevel
+\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5444\lin5444 }{\listlevel\levelnfc23\levelnfcn23\leveljc0
+\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li6164\lin6164 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
+\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6884\lin6884 }{\listname ;}\listid1422722544}{\list\listtemplateid303218272\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0
+\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid612407812\'01\u-3913 ?;}{\levelnumbers;}\f3\cf18\fbias0 \s36\fi-358\li1435\jclisttab\tx1437\lin1435 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
+\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 
+\fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23
+\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
+\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480
+\jclisttab\tx6480\lin6480 }{\listname ;}\listid1559511898}{\list\listtemplateid-743794326\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid2033377338
+\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s35\fi-357\li1077\jclisttab\tx1080\lin1077 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}
+\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160
+\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }
+{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23
+\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
+\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
+\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1567649130}{\list\listtemplateid-154908222\listhybrid{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0
+\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-596080174\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \s93\fi-360\li360\jclisttab\tx360\lin360 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0
+\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0
+\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1
+\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
+\levelindent0{\leveltext\leveltemplateid67698713\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0
+{\leveltext\leveltemplateid67698715\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\leveltemplateid67698703\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\leveltemplateid67698713\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\leveltemplateid67698715\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1795057320}{\list\listtemplateid-961874242\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
+\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1175557160\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s37\fi-357\li1792\jclisttab\tx1795\lin1792 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
+\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
+{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691
+\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}
+\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040
+\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel
+\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1848404271}
+{\list\listtemplateid-1802592190\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid1229593488\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s38\fi-357\li2149
+\jclisttab\tx2152\lin2149 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel
+\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23
+\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
+\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
+{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691
+\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}
+\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1877695764}{\list\listtemplateid1186249844\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\leveltemplateid1637229796\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s33\fi-357\li357\jclisttab\tx360\lin357 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691
+\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}
+\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880
+\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel
+\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23
+\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0
+\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0
+{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid2054619191}{\list\listtemplateid758572558\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0
+\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
+\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext
+\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689
+\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 
+\fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\lin4320 }{\listlevel
+\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0
+\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
+\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\lin6480 }{\listname ;}\listid2085955335}{\list\listtemplateid-235387302\listhybrid{\listlevel\levelnfc23\levelnfcn23
+\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1242156798\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\lin360 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
+\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1080\lin1080 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0
+{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li1800\lin1800 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703
+\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2520\lin2520 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 
+\fi-360\li3240\lin3240 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li3960\lin3960 }{\listlevel
+\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li4680\lin4680 }{\listlevel\levelnfc23\levelnfcn23\leveljc0
+\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5400\lin5400 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
+\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6120\lin6120 }{\listname ;}\listid2106606675}}{\*\listoverridetable{\listoverride\listid2054619191\listoverridecount0\ls1}
+{\listoverride\listid477573462\listoverridecount0\ls2}{\listoverride\listid1567649130\listoverridecount0\ls3}{\listoverride\listid1559511898\listoverridecount0\ls4}{\listoverride\listid1848404271\listoverridecount0\ls5}{\listoverride\listid1877695764
+\listoverridecount0\ls6}{\listoverride\listid1219436735\listoverridecount0\ls7}{\listoverride\listid810947713\listoverridecount0\ls8}{\listoverride\listid196815738\listoverridecount0\ls9}{\listoverride\listid398796681\listoverridecount0\ls10}
+{\listoverride\listid394402059\listoverridecount0\ls11}{\listoverride\listid752163927\listoverridecount0\ls12}{\listoverride\listid189493747\listoverridecount0\ls13}{\listoverride\listid2106606675\listoverridecount0\ls14}{\listoverride\listid1559511898
+\listoverridecount0\ls15}{\listoverride\listid1848404271\listoverridecount0\ls16}{\listoverride\listid1848404271\listoverridecount0\ls17}{\listoverride\listid1848404271\listoverridecount0\ls18}{\listoverride\listid1848404271\listoverridecount0\ls19}
+{\listoverride\listid1848404271\listoverridecount0\ls20}{\listoverride\listid1848404271\listoverridecount0\ls21}{\listoverride\listid1848404271\listoverridecount0\ls22}{\listoverride\listid1848404271\listoverridecount0\ls23}{\listoverride\listid1848404271
+\listoverridecount0\ls24}{\listoverride\listid1422722544\listoverridecount0\ls25}{\listoverride\listid1848404271\listoverridecount0\ls26}{\listoverride\listid1848404271\listoverridecount0\ls27}{\listoverride\listid1848404271\listoverridecount0\ls28}
+{\listoverride\listid1559511898\listoverridecount0\ls29}{\listoverride\listid1559511898\listoverridecount0\ls30}{\listoverride\listid1795057320\listoverridecount0\ls31}{\listoverride\listid1559511898\listoverridecount0\ls32}{\listoverride\listid2085955335
+\listoverridecount0\ls33}}{\*\rsidtbl \rsid864014\rsid921734\rsid1456345\rsid1516446\rsid2370159\rsid3171405\rsid3283580\rsid4090875\rsid4281994\rsid5123618\rsid6695507\rsid6971592\rsid7940540\rsid8259195\rsid8404268\rsid10029334\rsid14110967\rsid16150152
+}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\title English}{\creatim\yr2012\mo5\dy29\hr9\min54}{\revtim\yr2012\mo5\dy29\hr9\min55}{\version1}{\edmins0}{\nofpages3}
+{\nofwords1117}{\nofchars6373}{\nofcharsws7476}{\vern49273}}{\*\userprops {\propname db_document_id}\proptype30{\staticval 8666}{\propname ContentTypeId}\proptype30{\staticval 0x010100BDA1A6A220A40A419EFB9E5917ACC6AD}{\propname _CopySource}\proptype30
+{\staticval  }}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw12240\paperh15840\margl720\margr720\margt720\margb720\gutter0\ltrsect 
+\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen
+\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace95\dgvspace180\dghorigin720\dgvorigin720\dghshow2\dgvshow1
+\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\rempersonalinfo\allowfieldendsel
+\wrppunct\asianbrkrule\rsidroot1456345\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0
+{\*\wgrffmtfilter 013f}\nofeaturethrottle1\ilfomacatclnup12{\*\ftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4281994 \chftnsep 
+\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4281994 \chftnsepc 
+\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4281994 \chftnsep 
+\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sb120\sa120\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4281994 \chftnsepc 
+\par }}\ltrpar \sectd \ltrsect\psz1\linex0\headery0\footery0\endnhere\sectlinegrid360\sectdefaultcl\sectrsid1456345\sftnbj {\headerl \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar
+\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 
+\insrsid1456345 
+\par }}{\headerr \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid1456345 
+\par }}{\footerl \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid1456345 
+\par }}{\footerr \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid1456345 
+\par }}{\headerf \ltrpar \pard\plain \ltrpar\s81\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid1456345 
+\par }}{\footerf \ltrpar \pard\plain \ltrpar\s83\ql \li0\ri0\sb120\sa120\widctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38 \ltrch\fcs0 \insrsid1456345 
+\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}
+{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8
+\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar
+\s42\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8259195 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 {\*\bkmkstart _GoBack}{\*\bkmkend _GoBack}\hich\af38\dbch\af13\loch\f38 
+MICROSOFT SOFTWARE LICENSE TERMS}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par }\pard\plain \ltrpar\s43\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrb\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8259195 \rtlch\fcs1 \ab\af38\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid5123618\charrsid5123618 \hich\af38\dbch\af13\loch\f38 MICROSOFT SQL SERVER COMPACT 4.0 SERVICE PACK 1 (SP1)
+}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38  }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8259195 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 
+\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 
+These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. Please read them. They apply to the software named abo\hich\af38\dbch\af13\loch\f38 
+ve, which includes the media on which you received it, if any. The terms also apply to any Microsoft}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s34\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin360\itap0\pararsid8259195 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 
+\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 updates,}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 
+supplements,}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 
+Internet-based services, and}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 
+support services}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par }\pard\plain \ltrpar\s44\ql \li0\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8259195 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 
+\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 
+for this software, unless other terms accompany those items. If so, those terms apply.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid1456345 
+\par }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. IF YOU DO NOT ACCEPT THEM, DO NOT USE THE SOFTWARE.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 
+\fs20\dbch\af13\insrsid1456345 
+\par }\pard\plain \ltrpar\s61\ql \li0\ri0\sb120\sa120\nowidctlpar\brdrt\brdrs\brdrw10\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8259195 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 
+\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 If you comply with these license terms, you have the rights below.}{
+\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 1.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid8259195 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {
+\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 INSTALLATION AND USE RIGHTS. }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid921734 \hich\af38\dbch\af13\loch\f38 a.\tab}}\pard\plain \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0\pararsid8259195 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 
+\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid921734 \hich\af38\dbch\af13\loch\f38 Installation and Use.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 
+\cs57\b0\fs20\dbch\af13\insrsid921734 \hich\af38\dbch\af13\loch\f38  You may install and use any number of copies of the software on your devices to design, develop and test your programs for use with the software.
+\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid921734\charrsid3283580 \hich\af38\dbch\af13\loch\f38 b.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 
+\fs20\dbch\af13\insrsid921734\charrsid3283580 \hich\af38\dbch\af13\loch\f38 Included Microsoft Programs. }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid921734\charrsid3283580 \hich\af38\dbch\af13\loch\f38 
+The software contains the Microsoft Visual C++ 2008 Express}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid921734 \hich\af38\dbch\af13\loch\f38  }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid10029334 
+\hich\af38\dbch\af13\loch\f38 Edition }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid921734 \hich\af38\dbch\af13\loch\f38 components listed below}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 
+\b0\fs20\dbch\af13\insrsid921734\charrsid3283580 \hich\af38\dbch\af13\loch\f38 . You may only use these components with the software.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid8259195 \hich\af38\dbch\af13\loch\f38  }{\rtlch\fcs1 
+\ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid921734\charrsid3283580 \hich\af38\dbch\af13\loch\f38 The Microsoft Visual C++ 2008 Express license terms located at }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf17\insrsid921734\charrsid3283580 
+\hich\af38\dbch\af11\loch\f38 %Program Files%\\Microsoft SQL Server Compact Ed\hich\af38\dbch\af11\loch\f38 ition\\v4.0 }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid921734\charrsid3283580 \hich\af38\dbch\af13\loch\f38 
+apply to your use of them, except that the components listed below may be used for commercial hosting services when used in conjunction with the}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid921734 \hich\af38\dbch\af13\loch\f38 
+ software.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid921734\charrsid3283580 \hich\af38\dbch\af13\loch\f38  }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid921734 
+\par {\listtext\pard\plain\ltrpar \s94 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\insrsid921734\charrsid3283580 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s94\ql \fi-360\li1080\ri0\sb120\sa120\sl276\slmult1
+\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\ls33\adjustright\rin0\lin1080\itap0\pararsid8259195\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\af31506\hich\af31506\dbch\af11\cgrid\langnp1033\langfenp1033 {
+\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20\insrsid921734\charrsid3283580 \hich\af38\dbch\af11\loch\f38 Microsoft_VC90_CRT_x86.msm
+\par {\listtext\pard\plain\ltrpar \s94 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\insrsid921734\charrsid3283580 \loch\af3\dbch\af11\hich\f3 \'b7\tab}\hich\af38\dbch\af11\loch\f38 policy_9_0_Microsoft_VC90_CRT_x86.msm
+\par {\listtext\pard\plain\ltrpar \s94 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\insrsid921734\charrsid3283580 \loch\af3\dbch\af11\hich\f3 \'b7\tab}\hich\af38\dbch\af11\loch\f38 Microsoft_VC90_CRT\hich\af38\dbch\af11\loch\f38 _x86_x64.msm
+\par {\listtext\pard\plain\ltrpar \s94 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\insrsid921734\charrsid3283580 \loch\af3\dbch\af11\hich\f3 \'b7\tab}\hich\af38\dbch\af11\loch\f38 policy_9_0_Microsoft_VC90_CRT_x86_x64.msm
+\par {\listtext\pard\plain\ltrpar \s94 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\insrsid921734\charrsid3283580 \loch\af3\dbch\af11\hich\f3 \'b7\tab}\hich\af38\dbch\af11\loch\f38 VC90.CRT_X86_msvcr90.dll
+\par {\listtext\pard\plain\ltrpar \s94 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1046\langfe1033\langnp1046\insrsid921734\charrsid864014 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 
+\f38\fs20\lang1046\langfe1033\langnp1046\insrsid921734\charrsid864014 \hich\af38\dbch\af11\loch\f38 VC90.CRT_X86_Microsoft.VC90.CRT.manifest
+\par {\listtext\pard\plain\ltrpar \s94 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\insrsid921734\charrsid3283580 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f38\fs20\insrsid921734\charrsid3283580 \hich\af38\dbch\af11\loch\f38 
+VC90.CRT_AMD64_msvcr90.dll
+\par {\listtext\pard\plain\ltrpar \s94 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \f3\fs20\lang1046\langfe1033\langnp1046\insrsid921734\charrsid864014 \loch\af3\dbch\af11\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 
+\f38\fs20\lang1046\langfe1033\langnp1046\insrsid921734\charrsid864014 \hich\af38\dbch\af11\loch\f38 VC90.CRT_AMD64_Microsoft.VC90.CRT.manifest
+\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 2.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid8259195 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {
+\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 a.\tab}}\pard\plain \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0\pararsid8259195 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 
+\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 Distributable Code.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 
+\cs57\b0\fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38  The software contains code that you are permitted to distribute in programs you develop if you comply with the terms below.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 
+\b0\fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 i.\tab}}\pard\plain \ltrpar\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx1080\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0\pararsid8259195 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 
+\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 Right to Use and Distribute.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 
+\cs58\fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 \hich\f38  The code and text files listed below are \'93\loch\f38 \hich\f38 Distributable Code.\'94}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf18\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s50\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0\pararsid8259195 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\ul\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 
+\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 REDIST.TXT Files}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 
+. You may copy and distribute the object code form of code listed in REDIST.TXT files.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s50 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf18\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 
+\hich\af38\dbch\af13\loch\f38 Third Party Distribution}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 
+. You may permit distributors of your programs to copy and distribute the Distributable Code as part of those programs.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\ulnone\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 ii.\tab}}\pard\plain \ltrpar\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0\pararsid8259195 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 
+\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 Dis\hich\af38\dbch\af13\loch\f38 tribution Requirements.}{
+\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs58\fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38  For any Distributable Code you distribute, you must}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf18\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0\pararsid8259195 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 
+\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 add significant primary functionality to it in your programs;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf18\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 
+\hich\af38\dbch\af13\loch\f38 for any Distributable Code having a filename extension of .lib, distribute only the results of running such Di\hich\af38\dbch\af13\loch\f38 stributable Code through a linker with your program;}{\rtlch\fcs1 \af38\afs20 
+\ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf18\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 
+\hich\af38\dbch\af13\loch\f38 distribute Distributable Code included in a setup program only as part of that setup program without modification;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf18\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 
+\hich\af38\dbch\af13\loch\f38 require distributors and external end users to agree to terms that protect it at lea\hich\af38\dbch\af13\loch\f38 st as much as this agreement; }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf18\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 
+\hich\af38\dbch\af13\loch\f38 display your valid copyright notice on your programs; and}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf18\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 
+\hich\af38\dbch\af13\loch\f38 indemnify, defend, and hold harmless Microsoft from any claims, including attorneys\hich\f38 \rquote \loch\f38  fees, related to the distribution or use of your programs.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 
+\fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s49 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 iii.\tab}}\pard\plain \ltrpar\s49\ql \fi-357\li1077\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx1077\wrapdefault\aspalpha\aspnum\faauto\ls10\ilvl2\outlinelevel2\adjustright\rin0\lin1077\itap0\pararsid8259195 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 
+\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 Distribution R\hich\af38\dbch\af13\loch\f38 estrictions.}{
+\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \cs58\fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38  You may not}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf18\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s36\ql \fi-358\li1435\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx1437\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin1435\itap0\pararsid8259195 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 
+\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 alter any copyright, trademark or patent notice in the Distributable Code;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf18\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 
+\hich\af38\dbch\af13\loch\f38 use Microsoft\hich\f38 \rquote \loch\f38 s trademarks in your programs\hich\f38 \rquote \loch\f38  names or in a way that suggests your programs come from or are endorsed by Microsoft;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 
+\fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf18\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 
+\hich\af38\dbch\af13\loch\f38 distribute Distributable Code to run on a platform other than the Windows platform;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf18\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 
+\hich\af38\dbch\af13\loch\f38 include Distributable Code in malicious, deceptive or unlawful programs; or}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s36 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\cf18\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 
+\hich\af38\dbch\af13\loch\f38 modify or distribute the source code of any Distributable Code so that any part of it become\hich\af38\dbch\af13\loch\f38 
+s subject to an Excluded License. An Excluded License is one that requires, as a condition of use, modification or distribution, that}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s37\ql \fi-357\li1792\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx1795\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin1792\itap0\pararsid8259195 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 
+\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 the code be disclosed or distributed in source code form; or}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s37 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 
+others have the right to modify it.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 3.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid8259195 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {
+\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 SCOPE OF LICENSE.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38  \hich\af38\dbch\af13\loch\f38 
+The software is licensed, not sold. This agreement only gives you some rights to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitt
+\hich\af38\dbch\af13\loch\f38 e\hich\af38\dbch\af13\loch\f38 d in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not}{\rtlch\fcs1 \ab0\af38\afs20 
+\ltrch\fcs0 \b0\fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0\pararsid8259195 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 
+\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 work around any technical limitations in the software;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 
+reverse engineer, decompile or disassembl\hich\af38\dbch\af13\loch\f38 e the software, except and only to the extent that applicable law expressly permits, despite this limitation;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+
+\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 
+make more copies of the software than specified in this agreement or allowed by applicable law, despite this limitation;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 
+publish the software \hich\af38\dbch\af13\loch\f38 for others to copy;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 
+rent, lease or lend the software;}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid921734 \hich\af38\dbch\af13\loch\f38  or}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 
+transfer the software or th}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid921734 \hich\af38\dbch\af13\loch\f38 is agreement to any third party. }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345\charrsid921734 
+\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 4.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid8259195 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {
+\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 BACKUP COPY.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 
+ You may make one backup copy of the software. You may use it only to reinstall the software.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 5.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 
+\hich\af38\dbch\af13\loch\f38 DOCUMENTATION.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 
+ Any person that has valid access to your computer or internal network may copy and use the documentation for your internal, reference purposes.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 6.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 
+\hich\af38\dbch\af13\loch\f38 EXPORT RESTRICTIONS.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38  The software is subject to United States export laws and regulations. You must comply w
+\hich\af38\dbch\af13\loch\f38 ith all domestic and international export laws and regulations that apply to the software. These laws include restrictions on destinations, end users and end use. For additional information, see }{\rtlch\fcs1 \ab0\af38\afs20 
+\ltrch\fcs0 \cs73\b0\fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 www.microsoft.com/exporting}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid8404268 .}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 
+\cs73\b0\fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 7.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 
+\hich\af38\dbch\af13\loch\f38 SUPPORT SERVICES. }{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 Because thi\hich\af38\dbch\af13\loch\f38 \hich\f38 s software is \'93\loch\f38 \hich\f38 as is,\'94
+\loch\f38  we may not provide support services for it.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 8.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 
+\hich\af38\dbch\af13\loch\f38 ENTIRE AGREEMENT.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 
+ This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid1456345 
+
+\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 9.\tab}}\pard \ltrpar\s1\ql \fi-360\li360\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin360\itap0\pararsid8259195 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 APPLICABLE LAW.}{\rtlch\fcs1 
+\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 a.\tab}}\pard\plain \ltrpar\s2\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls12\ilvl1\outlinelevel1\adjustright\rin0\lin720\itap0\pararsid8259195 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 
+\b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 United States.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 
+\b0\fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38  If you acquired the software in the Uni\hich\af38\dbch\af13\loch\f38 
+ted States, Washington state law governs the interpretation of this agreement and applies to claims for breach of it, regardless of conflict of laws principles. The laws of the state where you live govern all other claims, including claims under state con
+\hich\af38\dbch\af13\loch\f38 s\hich\af38\dbch\af13\loch\f38 umer protection laws, unfair competition laws, and in tort.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s2 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 b.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 
+\hich\af38\dbch\af13\loch\f38 Outside the United States.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38  If you acquired the software in any other country, the laws of that country apply.}{
+\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 10.\tab}}\pard\plain \ltrpar\s1\ql \fi-357\li357\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx360\wrapdefault\aspalpha\aspnum\faauto\ls12\outlinelevel0\adjustright\rin0\lin357\itap0\pararsid8259195 \rtlch\fcs1 \ab\af38\afs19\alang1025 \ltrch\fcs0 \b\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {
+\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 LEGAL EFFECT.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 
+ This agreement describes certain legal rights. You may have other\hich\af38\dbch\af13\loch\f38 
+ rights under the laws of your country. You may also have rights with respect to the party from whom you acquired the software. This agreement does not change your rights under the laws of your country if the laws of your country do not permit it to do so
+.}{\rtlch\fcs1 \ab0\af38\afs20 \ltrch\fcs0 \b0\fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 11.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 
+\hich\af38\dbch\af13\loch\f38 \hich\f38 DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED \'93\loch\f38 \hich\f38 AS-IS.\'94\loch\f38 
+ YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. YOU MAY HAVE ADDITIONAL CONSUMER RIGHTS UNDER YOUR LOCAL LAWS WHICH THIS AGREEMENT CANNOT CHANGE.\hich\af38\dbch\af13\loch\f38 
+ TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s1 \rtlch\fcs1 \ab\af38\afs20 \ltrch\fcs0 \b\fs20\loch\af38\hich\af38\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 12.\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 
+\hich\af38\dbch\af13\loch\f38 LIMITATION ON AND EXCLUSION OF REMEDIES AND DAMAGES}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\insrsid8404268 \hich\af38\dbch\af11\loch\f38 . YOU CAN RECOVER FROM MICROSOFT AND\hich\af38\dbch\af11\loch\f38 
+ ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\insrsid1456345 
+\par }\pard\plain \ltrpar\s24\ql \li357\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin357\itap0\pararsid8259195 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 This limitation applies to}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 
+\fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s34\ql \fi-363\li720\ri0\sb120\sa120\nowidctlpar
+\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0\pararsid8259195 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 \fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 
+\af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 anything related to the software, services, content (inc\hich\af38\dbch\af13\loch\f38 luding code) on third party Internet sites, or third party programs; and}{
+\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par {\listtext\pard\plain\ltrpar \s34 \rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\loch\af3\hich\af3\dbch\af13\insrsid8404268 \loch\af3\dbch\af13\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 
+claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par }\pard\plain \ltrpar\ql \li360\ri0\sb120\sa120\nowidctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0\pararsid8259195 \rtlch\fcs1 \af38\afs19\alang1025 \ltrch\fcs0 
+\fs19\lang1033\langfe1033\loch\af38\hich\af38\dbch\af11\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid8404268 \hich\af38\dbch\af13\loch\f38 
+It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other d
+\hich\af38\dbch\af13\loch\f38 a\hich\af38\dbch\af13\loch\f38 mages.}{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid1456345 
+\par }{\rtlch\fcs1 \af38\afs20 \ltrch\fcs0 \fs20\dbch\af13\insrsid864014 
+\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a
+9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad
+5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6
+b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0
+0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6
+a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f
+c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512
+0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462
+a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865
+6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b
+4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b
+4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f
+7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87
+615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad
+79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b
+5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab
+999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9
+699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586
+8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6
+0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f
+9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be
+15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979
+3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d
+32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a
+f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86
+e877f0034e16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb
+44f95d843b5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a
+6409fb44d08741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c
+3d9058edf2c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db0256
+5e85f3b9660d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276
+b9f7dec44b7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8
+c33585b5fb9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e
+51440ca2e0088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95
+b21be5ceaf8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff
+6dce591a26ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec6
+9ffb9e65d028d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239
+b75a5bb1e6345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a449
+59d366ad93b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e8
+2db8df9f30254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468
+656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4
+350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d2624
+52282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe5141
+73d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c020000130000000000000000
+0000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000
+000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c0000000000000000000000000019
+0200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b00001600000000
+000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027
+00000000000000000000000000a00900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d0100009b0a00000000}
+{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d
+617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169
+6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363
+656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e}
+{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;
+\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;
+\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;
+\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9;
+\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4;\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7;
+\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font;
+\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid;\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision;
+\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6;
+\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;
+\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis;
+\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;
+\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography;\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 010500000200000018000000
+4d73786d6c322e534158584d4c5265616465722e362e30000000000000000000004a0000
+d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff0900060000000000000000000000010000000100000000000000001000000200000001000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+fffffffffffffffffdffffff04000000feffffff050000000e000000060000000700000008000000090000000a0000000b0000000c0000000d0000000f000000110000001000000022000000feffffff130000001400000015000000160000001700000018000000190000001a0000001b0000001c0000001d0000001e00
+00001f0000002000000021000000feffffff23000000feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffff010000000c6ad98892f1d411a65f0040963251e5000000000000000000000000d0ec
+13dabb3dcd0103000000c01a0000000000004d0073006f004400610074006100530074006f0072006500000000000000000000000000000000000000000000000000000000000000000000000000000000001a000101ffffffffffffffff050000000000000000000000000000000000000000000000d0ec13dabb3dcd01
+d0ec13dabb3dcd01000000000000000000000000c70053005a00db00c300dd004e00c300c800d40053003100c800420044005500d80059004600ca00430051003d003d000000000000000000000000000000000032000101ffffffffffffffff030000000000000000000000000000000000000000000000d0ec13dabb3d
+cd01d0ec13dabb3dcd010000000000000000000000004900740065006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff04000000ffffffff000000000000000000000000000000000000000000000000
+00000000000000000000000000000000c100000000000000010000000200000003000000feffffff0500000006000000070000000800000009000000feffffff0b0000000c0000000d0000000e0000000f000000100000001100000012000000130000001400000015000000160000001700000018000000190000001a00
+00001b0000001c0000001d0000001e0000001f000000200000002100000022000000230000002400000025000000260000002700000028000000290000002a0000002b0000002c0000002d0000002e0000002f00000030000000310000003200000033000000340000003500000036000000370000003800000039000000
+3a0000003b0000003c0000003d0000003e0000003f00000040000000410000004200000043000000440000004500000046000000470000004800000049000000feffffff4b0000004c0000004d0000004e0000004f000000feffffff510000005200000053000000feffffff550000005600000057000000580000005900
+0000feffffff5b0000005c0000005d0000005e0000005f000000600000006100000062000000630000006400000065000000660000006700000068000000690000006a000000feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d227574662d3822207374616e64616c6f6e653d22796573223f3e3c44696374696f6e617279205361766564427956657273696f6e3d22332e362e31382e3022204d
+696e696d756d56657273696f6e3d22332e362e342e302220786d6c6e733d22687474703a2f2f736368656d61732e627573696e6573732d696e746567726974792e636f6d2f6465616c6275696c6465722f323030362f64696374696f6e617279222f3e000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b38463742
+323639442d363344332d343441332d394241302d3130443445313831364130397d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64733a736368656d61526566733e3c
+64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e62757369500072006f007000650072007400690065007300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff000000000000
+000000000000000000000000000000000000000000000000000000000000040000005401000000000000ce00c90032004a0031005500d600cd004a00c4003400d500db00d8005900d3005800450045004100440041003d003d00000000000000000000000000000000003200010102000000080000000600000000000000
+00000000000000000000000000000000d0ec13dabb3dcd01d0ec13dabb3dcd010000000000000000000000004900740065006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff07000000ffffffff0000
+000000000000000000000000000000000000000000000000000000000000000000000a000000f50f000000000000500072006f007000650072007400690065007300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff
+0000000000000000000000000000000000000000000000000000000000000000000000004a00000051010000000000006e6573732d696e746567726974792e636f6d2f6465616c6275696c6465722f323030362f64696374696f6e617279222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f72
+654974656d3e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d227574662d3822207374616e64616c6f6e653d22796573223f3e3c53657373696f6e20786d6c6e733d22687474703a
+2f2f736368656d61732e627573696e6573732d696e746567726974792e636f6d2f6465616c6275696c6465722f323030362f616e7377657273223e3c5661726961626c65204e616d653d22636f6e74726163747265666572656e6365222052656c6576616e743d2266616c7365223e3c56616c75653e323031302d4d4149
+4e422d3030313031333c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d226d73636f6d223e3c56616c75653e66616c73653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d2266696c6574797065223e3c56616c75653e2e7274663c2f56616c7565
+3e3c2f5661726961626c653e3c5661726961626c65204e616d653d226c616e6775616765616c6c223e3c56616c75653e456e676c6973683c2f56616c75653e3c56616c75653e4368696e657365202853696d706c6966696564293c2f56616c75653e3c56616c75653e4368696e6573652028547261646974696f6e616c29
+3c2f56616c75653e3c56616c75653e437a6563683c2f56616c75653e3c56616c75653e4672656e63683c2f56616c75653e3c56616c75653e4765726d616e3c2f56616c75653e3c56616c75653e4974616c69616e3c2f56616c75653e3c56616c75653e4a6170616e6573653c2f56616c75653e3c56616c75653e4b6f7265
+616e3c2f56616c75653e3c56616c75653e506f6c6973683c2f56616c75653e3c56616c75653e506f727475677565736520284272617a696c293c2f56616c75653e3c56616c75653e5275737369616e3c2f56616c75653e3c56616c75653e5370616e6973683c2f56616c75653e3c56616c75653e5475726b6973683c2f56
+616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d225f5f72657175657374646967657374222052656c6576616e743d2266616c7365223e3c56616c75653e3078464532363934364137393337363741383635383139334236383646353743433745453838394237353842444536304337444435
+39313644303831354244424344374335363534444137353735353430323832393342384331414345463833393630344143344634383342454533313330394235394442384434393734454335322c30392044656320323031302032323a32323a3430202d303030303c2f56616c75653e3c2f5661726961626c653e3c5661
+726961626c65204e616d653d225f5f6576656e7476616c69646174696f6e222052656c6576616e743d2266616c7365223e3c56616c75653e2f77455741674b4f3239697043414c623449756d444c2b75437032397970624e71637a6d5230493767414e52424e67333c2f56616c75653e3c2f5661726961626c653e3c5661
+726961626c65204e616d653d2263746c303024706c616365686f6c6465726d61696e24686663657370636f6e74726163747265666572656e6365222052656c6576616e743d2266616c7365223e3c56616c75653e323031302d4d41494e422d3030313031333c2f56616c75653e3c2f5661726961626c653e3c5661726961
+626c65204e616d653d2263616e616461617661696c223e3c56616c75653e747275653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d2263616e6164616672656e6368223e3c56616c75653e747275653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d
+653d2266696c65666f726d6174223e3c56616c75653e66616c73653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d22736f66747761726574797065223e3c56616c75653e467265652c205374616e64616c6f6e6520536f6674776172653c2f56616c75653e3c2f5661726961626c65
+3e3c5661726961626c65204e616d653d2270726f647563746e616d65223e3c56616c75653e53514c2053657276657220436f6d7061637420342e303c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d226e756d6265726f66636f70696573223e3c56616c75653e416e79206e756d6265
+72206f6620636f706965733c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d2270726f6475637476657273696f6e223e3c56616c75653e4e6f6e653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d2276657273696f6e76697369626c65223e3c56
+616c75653e66616c73653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d226368616e6e656c223e3c56616c75653e52657461696c3c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d227374616e64616c6f6e657573657269676874223e3c56616c
+75653e4f6e6c7920746f2064657369676e2c20646576656c6f7020616e64207465737420746865207573657227732070726f6772616d733c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d226d65646961656c656d656e747374656d706c61746573223e3c56616c75653e66616c7365
+3c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d2264697374726962757461626c65636f6465223e3c56616c75653e747275653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d2264697374726962757461626c65636f646574797065223e3c5661
+6c75653e5265646973742e7478743c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d227265646973747478746f6e6c696e65223e3c56616c75653e66616c73653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d22696e7465726e616c7265617373
+69676e6d656e74223e3c56616c75653e66616c73653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d226c6963656e73657472616e73666572223e3c56616c75653e66616c73653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d226f746865726d
+6963726f736f667470726f6772616d73223e3c56616c75653e747275653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d226e65746672616d65776f726b223e3c56616c75653e66616c73653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d226f
+746865726d6963726f736f667470726f6772616d737465726d73223e3c56616c75653e546865207365706172617465206c6963656e7365207465726d73206173736f636961746564207769746820746865206f74686572204d6963726f736f66742070726f6772616d733c2f56616c75653e3c2f5661726961626c653e3c
+5661726961626c65204e616d653d2270726572656c65617365636f6465223e3c56616c75653e66616c73653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d227468697264706172747970726f6772616d73223e3c56616c75653e66616c73653c2f56616c75653e3c2f566172696162
+6c653e3c5661726961626c65204e616d653d2262656e63686d61726b696e67223e3c56616c75653e66616c73653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d226d706567223e3c56616c75653e66616c73653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65
+204e616d653d22696e7465726e657462617365647365727669636573223e3c56616c75653e66616c73653c2f56616c75653e3c2f5661726961626c653e3c5661726961626c65204e616d653d225f5f6576656e7474617267657422204b6e6f776e3d2266616c7365222052656c6576616e743d2266616c7365222f3e3c56
+61726961626c65204e616d653d225f5f6576656e74617267756d656e7422204b6e6f776e3d2266616c7365222052656c6576616e743d2266616c7365222f3e3c5661726961626c65204e616d653d226c61756e6368646976616374696f6e22204b6e6f776e3d2266616c7365222052656c6576616e743d2266616c736522
+2f3e3c5661726961626c65204e616d653d225f5f737064756d6d79746578743122204b6e6f776e3d2266616c7365222052656c6576616e743d2266616c7365222f3e3c5661726961626c65204e616d653d225f5f737064756d6d79746578743222204b6e6f776e3d2266616c7365222052656c6576616e743d2266616c73
+65222f3e3c5661726961626c65204e616d653d226f726967696e61746f72223e3c56616c75653e5245444d4f4e445c64636f7265793c2f56616c75653e3c2f5661726961626c653e3c506172616d65746572204e616d653d2264625f646973706c61795f616c6c5f636f6d6d656e7473223e3c56616c75653e66616c7365
+3c2f56616c75653e3c2f506172616d657465723e3c506172616d65746572204e616d653d2264625f73686f775f73756d6d617279223e3c56616c75653e64697361626c65643c2f56616c75653e3c2f506172616d657465723e3c506172616d65746572204e616d653d2264625f74656d706c6174655f666f726d223e3c56
+616c75653e35323032636439312d396439322d343338612d386637642d3630613864313464336162303c2f56616c75653e3c2f506172616d657465723e3c506172616d65746572204e616d653d2264625f74656d706c6174655f7265666572656e6365223e3c56616c75653e5553455445524d535f4d41494e423c2f5661
+6c75653e3c2f506172616d657465723e3c506172616d65746572204e616d653d2264625f74656d706c6174655f76657273696f6e223e3c56616c75653e32303130313130393c2f56616c75653e3c2f506172616d657465723e3c506172616d65746572204e616d653d2264625f7472616e73616374696f6e5f6578746572
+6e616c5f6c6162656c223e3c56616c75653e323031302d4d41494e422d3030313031333c2f56616c75653e3c2f506172616d657465723e3c506172616d65746572204e616d653d2264625f7472616e73616374696f6e5f6964223e3c56616c75653e333432323c2f56616c75653e3c2f506172616d657465723e3c506172
+616d65746572204e616d653d2264625f766973697465645f7061676573223e3c56616c75653e313c2f56616c75653e3c56616c75653e323c2f56616c75653e3c56616c75653e333c2f56616c75653e3c56616c75653e343c2f56616c75653e3c56616c75653e363c2f56616c75653e3c56616c75653e373c2f56616c7565
+3e3c56616c75653e313c2f56616c75653e3c56616c75653e323c2f56616c75653e3c56616c75653e333c2f56616c75653e3c56616c75653e313c2f56616c75653e3c56616c75653e313c2f56616c75653e3c2f506172616d657465723e3c2f53657373696f6e3e00000000000000000000003c3f786d6c2076657273696f
+6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b36443039393742412d414434442d343732362d423545462d3836333335433431303030437d2220786d6c6e733a64733d22687474
+703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64733a736368656d61526566733e3c64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e627573696e6573732d696e74
+6567726974792e636f6d2f6465616c6275696c6465722f323030362f616e7377657273222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f72654974656d3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d100c7003500
+c3004700c200c400d50056005500ca00dc00c600d30051004a004a003200dd00c600320041003d003d000000000000000000000000000000000032000101ffffffff0b000000090000000000000000000000000000000000000000000000d0ec13dabb3dcd01d0ec13dabb3dcd0100000000000000000000000049007400
+65006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff0a000000ffffffff00000000000000000000000000000000000000000000000000000000000000000000000050000000db000000000000005000
+72006f007000650072007400690065007300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000540000004f01000000000000
+d300c300d4004f005600d400c000440034005500ce00df004400ce005a005100c100df0034005400550051003d003d000000000000000000000000000000000032000100ffffffffffffffff0c0000000000000000000000000000000000000000000000d0ec13dabb3dcd01d0ec13dabb3dcd0100000000000000000000
+00003c3f6d736f2d636f6e74656e74547970653f3e3c466f726d54656d706c6174657320786d6c6e733d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f7368617265706f696e742f76332f636f6e74656e74747970652f666f726d73223e3c446973706c61793e446f63756d656e744c696272
+617279466f726d3c2f446973706c61793e3c456469743e446f63756d656e744c696272617279466f726d3c2f456469743e3c4e65773e446f63756d656e744c696272617279466f726d3c2f4e65773e3c2f466f726d54656d706c617465733e00000000000000000000000000000000000000000000000000000000000000
+0000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b31414533373743362d333532392d344135352d424339422d33343039323543463636
+37307d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64733a736368656d61526566733e3c64733a736368656d615265662064733a7572693d22687474703a2f2f7363
+68656d61732e6d6963726f736f66742e636f6d2f7368617265706f696e742f76332f636f6e74656e74747970652f666f726d73222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f72654974656d3e00000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b35373045334443452d303334382d344237392d424630452d45363530
+38374637393335317d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64733a736368656d61526566733e3c64733a736368656d615265662064733a7572693d22687474
+703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f323030362f6d657461646174612f636f6e74656e7454797065222f3e3c64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f323030362f6d65
+7461646174612f70726f706572746965732f4900740065006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff0d000000ffffffff00000000000000000000000000000000000000000000000000000000
+000000000000000012000000761f000000000000500072006f007000650072007400690065007300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000
+000000000000000000005a00000004040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d227574662d38223f3e3c63743a636f6e74656e7454797065536368656d612063743a5f3d2222206d613a5f3d2222206d613a636f6e74656e74547970654e616d653d22446f6375
+6d656e7422206d613a636f6e74656e745479706549443d223078303130313030424441314136413232304134304134313945464239453539313741434336414422206d613a636f6e74656e745479706556657273696f6e3d22313722206d613a636f6e74656e74547970654465736372697074696f6e3d22437265617465
+2061206e657720646f63756d656e742e22206d613a636f6e74656e745479706553636f70653d2222206d613a76657273696f6e49443d2266343736346339666166646632336436653035343862333630623130346130332220786d6c6e733a63743d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f
+6d2f6f66666963652f323030362f6d657461646174612f636f6e74656e74547970652220786d6c6e733a6d613d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f323030362f6d657461646174612f70726f706572746965732f6d65746141747472696275746573223e0d0a3c
+7873643a736368656d61207461726765744e616d6573706163653d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f323030362f6d657461646174612f70726f7065727469657322206d613a726f6f743d227472756522206d613a6669656c647349443d223732326565636431
+63363230323961373830386363653964376530623264396522206e73323a5f3d222220786d6c6e733a7873643d22687474703a2f2f7777772e77332e6f72672f323030312f584d4c536368656d612220786d6c6e733a703d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f32
+3030362f6d657461646174612f70726f706572746965732220786d6c6e733a6e73323d2235616265626439612d376264662d343438322d393437632d633333353535323462663833223e0d0a3c7873643a696d706f7274206e616d6573706163653d2235616265626439612d376264662d343438322d393437632d633333
+353535323462663833222f3e0d0a3c7873643a656c656d656e74206e616d653d2270726f70657274696573223e0d0a3c7873643a636f6d706c6578547970653e0d0a3c7873643a73657175656e63653e0d0a3c7873643a656c656d656e74206e616d653d22646f63756d656e744d616e6167656d656e74223e0d0a3c7873
+643a636f6d706c6578547970653e0d0a3c7873643a616c6c3e0d0a3c7873643a656c656d656e74207265663d226e73323a4368616e6e656c222f3e0d0a3c7873643a656c656d656e74207265663d226e73323a4f726967696e61746f72222f3e0d0a3c7873643a656c656d656e74207265663d226e73323a50726f647563
+744e616d6522206d696e4f63637572733d2230222f3e0d0a3c7873643a656c656d656e74207265663d226e73323a50726f6475637456657273696f6e22206d696e4f63637572733d2230222f3e0d0a3c7873643a656c656d656e74207265663d226e73323a5075626c6973684461746522206d696e4f63637572733d2230
+222f3e0d0a3c7873643a656c656d656e74207265663d226e73323a5265746972656d656e744461746522206d696e4f63637572733d2230222f3e0d0a3c7873643a656c656d656e74207265663d226e73323a536f6674776172655479706522206d696e4f63637572733d2230222f3e0d0a3c7873643a656c656d656e7420
+7265663d226e73323a4d53636f6d22206d696e4f63637572733d2230222f3e0d0a3c7873643a656c656d656e74207265663d226e73323a53746174757322206d696e4f63637572733d2230222f3e0d0a3c7873643a656c656d656e74207265663d226e73323a4c6963656e73654d6f64656c22206d696e4f63637572733d
+2230222f3e0d0a3c7873643a656c656d656e74207265663d226e73323a50726f64756374494422206d696e4f63637572733d2230222f3e0d0a3c7873643a656c656d656e74207265663d226e73323a4f776e657222206d696e4f63637572733d2230222f3e0d0a3c7873643a656c656d656e74207265663d226e73323a4c
+616e677561676522206d696e4f63637572733d2230222f3e0d0a3c7873643a656c656d656e74207265663d226e73323a46696c6554797065222f3e0d0a3c2f7873643a616c6c3e0d0a3c2f7873643a636f6d706c6578547970653e0d0a3c2f7873643a656c656d656e743e0d0a3c2f7873643a73657175656e63653e0d0a
+3c2f7873643a636f6d706c6578547970653e0d0a3c2f7873643a656c656d656e743e0d0a3c2f7873643a736368656d613e0d0a3c7873643a736368656d61207461726765744e616d6573706163653d2235616265626439612d376264662d343438322d393437632d6333333535353234626638332220656c656d656e7446
+6f726d44656661756c743d227175616c69666965642220786d6c6e733a7873643d22687474703a2f2f7777772e77332e6f72672f323030312f584d4c536368656d612220786d6c6e733a646d733d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f323030362f646f63756d65
+6e744d616e6167656d656e742f7479706573223e0d0a3c7873643a696d706f7274206e616d6573706163653d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f323030362f646f63756d656e744d616e6167656d656e742f7479706573222f3e0d0a3c7873643a656c656d656e
+74206e616d653d224368616e6e656c22206d613a696e6465783d223822206d613a646973706c61794e616d653d224368616e6e656c22206d613a696e7465726e616c4e616d653d224368616e6e656c223e0d0a3c7873643a73696d706c65547970653e0d0a3c7873643a7265737472696374696f6e20626173653d22646d
+733a54657874223e0d0a3c7873643a6d61784c656e6774682076616c75653d22323535222f3e0d0a3c2f7873643a7265737472696374696f6e3e0d0a3c2f7873643a73696d706c65547970653e0d0a3c2f7873643a656c656d656e743e0d0a3c7873643a656c656d656e74206e616d653d224f726967696e61746f722220
+6d613a696e6465783d223922206d613a646973706c61794e616d653d224f726967696e61746f7222206d613a696e7465726e616c4e616d653d224f726967696e61746f72223e0d0a3c7873643a73696d706c65547970653e0d0a3c7873643a7265737472696374696f6e20626173653d22646d733a54657874223e0d0a3c
+7873643a6d61784c656e6774682076616c75653d22323535222f3e0d0a3c2f7873643a7265737472696374696f6e3e0d0a3c2f7873643a73696d706c65547970653e0d0a3c2f7873643a656c656d656e743e0d0a3c7873643a656c656d656e74206e616d653d2250726f647563744e616d6522206d613a696e6465783d22
+313022206e696c6c61626c653d227472756522206d613a646973706c61794e616d653d2250726f647563744e616d6522206d613a64656661756c743d2222206d613a696e7465726e616c4e616d653d2250726f647563744e616d65223e0d0a3c7873643a73696d706c65547970653e0d0a3c7873643a7265737472696374
+696f6e20626173653d22646d733a4e6f7465222f3e0d0a3c2f7873643a73696d706c65547970653e0d0a3c2f7873643a656c656d656e743e0d0a3c7873643a656c656d656e74206e616d653d2250726f6475637456657273696f6e22206d613a696e6465783d22313122206e696c6c61626c653d227472756522206d613a
+646973706c61794e616d653d2250726f6475637456657273696f6e22206d613a696e7465726e616c4e616d653d2250726f6475637456657273696f6e223e0d0a3c7873643a73696d706c65547970653e0d0a3c7873643a7265737472696374696f6e20626173653d22646d733a54657874223e0d0a3c7873643a6d61784c
+656e6774682076616c75653d22323535222f3e0d0a3c2f7873643a7265737472696374696f6e3e0d0a3c2f7873643a73696d706c65547970653e0d0a3c2f7873643a656c656d656e743e0d0a3c7873643a656c656d656e74206e616d653d225075626c6973684461746522206d613a696e6465783d22313222206e696c6c
+61626c653d227472756522206d613a646973706c61794e616d653d225075626c6973684461746522206d613a666f726d61743d22446174654f6e6c7922206d613a696e7465726e616c4e616d653d225075626c69736844617465223e0d0a3c7873643a73696d706c65547970653e0d0a3c7873643a726573747269637469
+6f6e20626173653d22646d733a4461746554696d65222f3e0d0a3c2f7873643a73696d706c65547970653e0d0a3c2f7873643a656c656d656e743e0d0a3c7873643a656c656d656e74206e616d653d225265746972656d656e744461746522206d613a696e6465783d22313322206e696c6c61626c653d22747275652220
+6d613a646973706c61794e616d653d225265746972656d656e744461746522206d613a666f726d61743d22446174654f6e6c7922206d613a696e7465726e616c4e616d653d225265746972656d656e7444617465223e0d0a3c7873643a73696d706c65547970653e0d0a3c7873643a7265737472696374696f6e20626173
+653d22646d733a4461746554696d65222f3e0d0a3c2f7873643a73696d706c65547970653e0d0a3c2f7873643a656c656d656e743e0d0a3c7873643a656c656d656e74206e616d653d22536f6674776172655479706522206d613a696e6465783d22313422206e696c6c61626c653d227472756522206d613a646973706c
+61794e616d653d22536f6674776172655479706522206d613a696e7465726e616c4e616d653d22536f66747761726554797065223e0d0a3c7873643a73696d706c65547970653e0d0a3c7873643a7265737472696374696f6e20626173653d22646d733a54657874223e0d0a3c7873643a6d61784c656e6774682076616c
+75653d22323535222f3e0d0a3c2f7873643a7265737472696374696f6e3e0d0a3c2f7873643a73696d706c65547970653e0d0a3c2f7873643a656c656d656e743e0d0a3c7873643a656c656d656e74206e616d653d224d53636f6d22206d613a696e6465783d22313522206e696c6c61626c653d227472756522206d613a
+646973706c61794e616d653d224d53636f6d22206d613a64656661756c743d223122206d613a696e7465726e616c4e616d653d224d53636f6d223e0d0a3c7873643a73696d706c65547970653e0d0a3c7873643a7265737472696374696f6e20626173653d22646d733a426f6f6c65616e222f3e0d0a3c2f7873643a7369
+6d706c65547970653e0d0a3c2f7873643a656c656d656e743e0d0a3c7873643a656c656d656e74206e616d653d2253746174757322206d613a696e6465783d22313622206e696c6c61626c653d227472756522206d613a646973706c61794e616d653d2253746174757322206d613a696e7465726e616c4e616d653d2253
+7461747573223e0d0a3c7873643a73696d706c65547970653e0d0a3c7873643a7265737472696374696f6e20626173653d22646d733a54657874223e0d0a3c7873643a6d61784c656e6774682076616c75653d22323535222f3e0d0a3c2f7873643a7265737472696374696f6e3e0d0a3c2f7873643a73696d706c655479
+70653e0d0a3c2f7873643a656c656d656e743e0d0a3c7873643a656c656d656e74206e616d653d224c6963656e73654d6f64656c22206d613a696e6465783d22313722206e696c6c61626c653d227472756522206d613a646973706c61794e616d653d224c6963656e73654d6f64656c22206d613a696e7465726e616c4e
+616d653d224c6963656e73654d6f64656c223e0d0a3c7873643a73696d706c65547970653e0d0a3c7873643a7265737472696374696f6e20626173653d22646d733a54657874223e0d0a3c7873643a6d61784c656e6774682076616c75653d22323535222f3e0d0a3c2f7873643a7265737472696374696f6e3e0d0a3c2f
+7873643a73696d706c65547970653e0d0a3c2f7873643a656c656d656e743e0d0a3c7873643a656c656d656e74206e616d653d2250726f64756374494422206d613a696e6465783d22313822206e696c6c61626c653d227472756522206d613a646973706c61794e616d653d2250726f64756374494422206d613a696e74
+65726e616c4e616d653d2250726f647563744944223e0d0a3c7873643a73696d706c65547970653e0d0a3c7873643a7265737472696374696f6e20626173653d22646d733a54657874223e0d0a3c7873643a6d61784c656e6774682076616c75653d22323535222f3e0d0a3c2f7873643a7265737472696374696f6e3e0d
+0a3c2f7873643a73696d706c65547970653e0d0a3c2f7873643a656c656d656e743e0d0a3c7873643a656c656d656e74206e616d653d224f776e657222206d613a696e6465783d22313922206e696c6c61626c653d227472756522206d613a646973706c61794e616d653d224f776e657222206d613a696e7465726e616c
+4e616d653d224f776e6572223e0d0a3c7873643a73696d706c65547970653e0d0a3c7873643a7265737472696374696f6e20626173653d22646d733a54657874223e0d0a3c7873643a6d61784c656e6774682076616c75653d22323535222f3e0d0a3c2f7873643a7265737472696374696f6e3e0d0a3c2f7873643a7369
+6d706c65547970653e0d0a3c2f7873643a656c656d656e743e0d0a3c7873643a656c656d656e74206e616d653d224c616e677561676522206d613a696e6465783d22323022206e696c6c61626c653d227472756522206d613a646973706c61794e616d653d224c616e677561676522206d613a696e7465726e616c4e616d
+653d224c616e6775616765223e0d0a3c7873643a73696d706c65547970653e0d0a3c7873643a7265737472696374696f6e20626173653d22646d733a54657874223e0d0a3c7873643a6d61784c656e6774682076616c75653d22323535222f3e0d0a3c2f7873643a7265737472696374696f6e3e0d0a3c2f7873643a7369
+6d706c65547970653e0d0a3c2f7873643a656c656d656e743e0d0a3c7873643a656c656d656e74206e616d653d2246696c655479706522206d613a696e6465783d22323122206d613a646973706c61794e616d653d2246696c655479706522206d613a696e7465726e616c4e616d653d2246696c6554797065223e0d0a3c
+7873643a73696d706c65547970653e0d0a3c7873643a7265737472696374696f6e20626173653d22646d733a54657874223e0d0a3c7873643a6d61784c656e6774682076616c75653d22323535222f3e0d0a3c2f7873643a7265737472696374696f6e3e0d0a3c2f7873643a73696d706c65547970653e0d0a3c2f787364
+3a656c656d656e743e0d0a3c2f7873643a736368656d613e0d0a3c7873643a736368656d61207461726765744e616d6573706163653d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f7061636b6167652f323030362f6d657461646174612f636f72652d70726f70657274696573
+2220656c656d656e74466f726d44656661756c743d227175616c69666965642220617474726962757465466f726d44656661756c743d22756e7175616c69666965642220626c6f636b44656661756c743d2223616c6c2220786d6c6e733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f
+72672f7061636b6167652f323030362f6d657461646174612f636f72652d70726f706572746965732220786d6c6e733a7873643d22687474703a2f2f7777772e77332e6f72672f323030312f584d4c536368656d612220786d6c6e733a7873693d22687474703a2f2f7777772e77332e6f72672f323030312f584d4c5363
+68656d612d696e7374616e63652220786d6c6e733a64633d22687474703a2f2f7075726c2e6f72672f64632f656c656d656e74732f312e312f2220786d6c6e733a64637465726d733d22687474703a2f2f7075726c2e6f72672f64632f7465726d732f2220786d6c6e733a6f646f633d22687474703a2f2f736368656d61
+732e6d6963726f736f66742e636f6d2f6f66666963652f696e7465726e616c2f323030352f696e7465726e616c446f63756d656e746174696f6e223e0d0a3c7873643a696d706f7274206e616d6573706163653d22687474703a2f2f7075726c2e6f72672f64632f656c656d656e74732f312e312f2220736368656d614c
+6f636174696f6e3d22687474703a2f2f6475626c696e636f72652e6f72672f736368656d61732f786d6c732f7164632f323030332f30342f30322f64632e787364222f3e0d0a3c7873643a696d706f7274206e616d6573706163653d22687474703a2f2f7075726c2e6f72672f64632f7465726d732f2220736368656d61
+4c6f636174696f6e3d22687474703a2f2f6475626c696e636f72652e6f72672f736368656d61732f786d6c732f7164632f323030332f30342f30322f64637465726d732e787364222f3e0d0a3c7873643a656c656d656e74206e616d653d22636f726550726f706572746965732220747970653d2243545f636f72655072
+6f70657274696573222f3e0d0a3c7873643a636f6d706c657854797065206e616d653d2243545f636f726550726f70657274696573223e0d0a3c7873643a616c6c3e0d0a3c7873643a656c656d656e74207265663d2264633a63726561746f7222206d696e4f63637572733d223022206d61784f63637572733d2231222f
+3e0d0a3c7873643a656c656d656e74207265663d2264637465726d733a6372656174656422206d696e4f63637572733d223022206d61784f63637572733d2231222f3e0d0a3c7873643a656c656d656e74207265663d2264633a6964656e74696669657222206d696e4f63637572733d223022206d61784f63637572733d
+2231222f3e0d0a3c7873643a656c656d656e74206e616d653d22636f6e74656e745479706522206d696e4f63637572733d223022206d61784f63637572733d22312220747970653d227873643a737472696e6722206d613a696e6465783d223022206d613a646973706c61794e616d653d22436f6e74656e742054797065
+22206d613a726561644f6e6c793d2274727565222f3e0d0a3c7873643a656c656d656e74207265663d2264633a7469746c6522206d696e4f63637572733d223022206d61784f63637572733d223122206d613a696e6465783d223422206d613a646973706c61794e616d653d225469746c65222f3e0d0a3c7873643a656c
+656d656e74207265663d2264633a7375626a65637422206d696e4f63637572733d223022206d61784f63637572733d2231222f3e0d0a3c7873643a656c656d656e74207265663d2264633a6465736372697074696f6e22206d696e4f63637572733d223022206d61784f63637572733d2231222f3e0d0a3c7873643a656c
+656d656e74206e616d653d226b6579776f72647322206d696e4f63637572733d223022206d61784f63637572733d22312220747970653d227873643a737472696e67222f3e0d0a3c7873643a656c656d656e74207265663d2264633a6c616e677561676522206d696e4f63637572733d223022206d61784f63637572733d
+2231222f3e0d0a3c7873643a656c656d656e74206e616d653d2263617465676f727922206d696e4f63637572733d223022206d61784f63637572733d22312220747970653d227873643a737472696e67222f3e0d0a3c7873643a656c656d656e74206e616d653d2276657273696f6e22206d696e4f63637572733d223022
+206d61784f63637572733d22312220747970653d227873643a737472696e67222f3e0d0a3c7873643a656c656d656e74206e616d653d227265766973696f6e22206d696e4f63637572733d223022206d61784f63637572733d22312220747970653d227873643a737472696e67223e0d0a3c7873643a616e6e6f74617469
+6f6e3e0d0a3c7873643a646f63756d656e746174696f6e3e0d0a202020202020202020202020202020202020202020202020546869732076616c756520696e6469636174657320746865206e756d626572206f66207361766573206f72207265766973696f6e732e20546865206170706c69636174696f6e206973207265
+73706f6e7369626c6520666f72207570646174696e6720746869732076616c75652061667465722065616368207265766973696f6e2e0d0a20202020202020202020202020202020202020203c2f7873643a646f63756d656e746174696f6e3e0d0a3c2f7873643a616e6e6f746174696f6e3e0d0a3c2f7873643a656c65
+6d656e743e0d0a3c7873643a656c656d656e74206e616d653d226c6173744d6f646966696564427922206d696e4f63637572733d223022206d61784f63637572733d22312220747970653d227873643a737472696e67222f3e0d0a3c7873643a656c656d656e74207265663d2264637465726d733a6d6f64696669656422
+206d696e4f63637572733d223022206d61784f63637572733d2231222f3e0d0a3c7873643a656c656d656e74206e616d653d226c6173745072696e74656422206d696e4f63637572733d223022206d61784f63637572733d22312220747970653d227873643a6461746554696d65222f3e0d0a3c7873643a656c656d656e
+74206e616d653d22636f6e74656e7453746174757322206d696e4f63637572733d223022206d61784f63637572733d22312220747970653d227873643a737472696e67222f3e0d0a3c2f7873643a616c6c3e0d0a3c2f7873643a636f6d706c6578547970653e0d0a3c2f7873643a736368656d613e0d0a3c2f63743a636f
+6e74656e7454797065536368656d613e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000006d65746141747472696275746573222f3e3c64733a736368656d615265662064733a7572693d22687474703a2f2f7777772e77332e6f72672f323030312f584d4c536368656d61222f3e3c64733a736368656d615265662064733a7572693d226874
+74703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f323030362f6d657461646174612f70726f70657274696573222f3e3c64733a736368656d615265662064733a7572693d2235616265626439612d376264662d343438322d393437632d633333353535323462663833222f3e3c64733a
+736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f323030362f646f63756d656e744d616e6167656d656e742f7479706573222f3e3c64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6f7065
+6e786d6c666f726d6174732e6f72672f7061636b6167652f323030362f6d657461646174612f636f72652d70726f70657274696573222f3e3c64733a736368656d615265662064733a7572693d22687474703a2f2f7075726c2e6f72672f64632f656c656d656e74732f312e312f222f3e3c64733a736368656d61526566
+2064733a7572693d22687474703a2f2f7075726c2e6f72672f64632f7465726d732f222f3e3c64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6d6963726f736f66742e636f6d2f6f66666963652f696e7465726e616c2f323030352f696e7465726e616c446f63756d656e7461
+74696f6e222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f72654974656d3e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105000000000000}}
\ No newline at end of file
Binary file packages/Microsoft.SqlServer.Compact.4.0.8876.1/lib/net40/System.Data.SqlServerCe.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/Microsoft.SqlServer.Compact.4.0.8876.1/tools/Install.ps1	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,201 @@
+param($installPath, $toolsPath, $package, $project)
+
+Import-Module (Join-Path $toolsPath VS.psd1)
+$nativeBinDirectory = Join-Path $installPath "NativeBinaries"
+if ($project.Type -eq 'Web Site') {
+    $projectRoot = Get-ProjectRoot $project
+    if (!$projectRoot) {
+        return;
+    }
+
+    $binDirectory = Join-Path $projectRoot "bin"
+    $libDirectory = Join-Path $installPath "lib\net40"
+    Add-FilesToDirectory $libDirectory $binDirectory
+    Add-FilesToDirectory $nativeBinDirectory $binDirectory
+}
+elseif($project.ExtenderNames -contains "WebApplication") {
+	$depAsm = Ensure-Folder $Project "_bin_deployableAssemblies";
+	if($depAsm) {
+		$amd64 = Ensure-Folder $depAsm "amd64";
+		if($amd64) {
+			$amd64dir = (Join-Path $nativeBinDirectory "amd64")
+			$crt64 = Ensure-Folder $amd64 "Microsoft.VC90.CRT";
+			if($crt64) {
+				$crt64dir = (Join-Path $amd64dir "Microsoft.VC90.CRT")
+				Add-ProjectItem $crt64 (Join-Path $crt64dir "Microsoft.VC90.CRT.manifest");
+				Add-ProjectItem $crt64 (Join-Path $crt64dir "msvcr90.dll");
+				Add-ProjectItem $crt64 (Join-Path $crt64dir "README_ENU.txt");
+			}
+			Add-ProjectItem $amd64 (Join-Path $amd64dir "sqlceca40.dll");
+			Add-ProjectItem $amd64 (Join-Path $amd64dir "sqlcecompact40.dll");
+			Add-ProjectItem $amd64 (Join-Path $amd64dir "sqlceer40EN.dll");
+			Add-ProjectItem $amd64 (Join-Path $amd64dir "sqlceme40.dll");
+			Add-ProjectItem $amd64 (Join-Path $amd64dir "sqlceqp40.dll");
+			Add-ProjectItem $amd64 (Join-Path $amd64dir "sqlcese40.dll");
+		}
+		$x86 = Ensure-Folder $depAsm "x86";
+		if($x86) {
+			$x86dir = (Join-Path $nativeBinDirectory "x86")
+			$crt32 = Ensure-Folder $x86 "Microsoft.VC90.CRT";
+			if($crt32) {
+				$crt32dir = (Join-Path $x86dir "Microsoft.VC90.CRT")
+				Add-ProjectItem $crt32 (Join-Path $crt32dir "Microsoft.VC90.CRT.manifest");
+				Add-ProjectItem $crt32 (Join-Path $crt32dir "msvcr90.dll");
+				Add-ProjectItem $crt32 (Join-Path $crt32dir "README_ENU.txt");
+			}
+			Add-ProjectItem $x86 (Join-Path $x86dir "sqlceca40.dll");
+			Add-ProjectItem $x86 (Join-Path $x86dir "sqlcecompact40.dll");
+			Add-ProjectItem $x86 (Join-Path $x86dir "sqlceer40EN.dll");
+			Add-ProjectItem $x86 (Join-Path $x86dir "sqlceme40.dll");
+			Add-ProjectItem $x86 (Join-Path $x86dir "sqlceqp40.dll");
+			Add-ProjectItem $x86 (Join-Path $x86dir "sqlcese40.dll");
+		}
+	}
+}
+else {
+    Add-PostBuildEvent $project $installPath
+}
+Remove-Module VS
+# SIG # Begin signature block
+# MIIaYAYJKoZIhvcNAQcCoIIaUTCCGk0CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
+# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
+# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUzLn0cynrkzzelhBdEEQRMs86
+# Sk+gghUtMIIEoDCCA4igAwIBAgIKYRnMkwABAAAAZjANBgkqhkiG9w0BAQUFADB5
+# MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk
+# bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSMwIQYDVQQDExpN
+# aWNyb3NvZnQgQ29kZSBTaWduaW5nIFBDQTAeFw0xMTEwMTAyMDMyMjVaFw0xMzAx
+# MTAyMDMyMjVaMIGDMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ
+# MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
+# MQ0wCwYDVQQLEwRNT1BSMR4wHAYDVQQDExVNaWNyb3NvZnQgQ29ycG9yYXRpb24w
+# ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDuW759ESTjhgbgZv9ItRe9
+# AuS0DDLwcj59LofXTqGxp0Mv92WeMeEyMUWu18EkhCHXLrWEfvo101Mc17ZRHk/O
+# ZrnrtwwC/SlcraiH9soitNW/CHX1inCPY9fvih7pj0MkZFrTh32QbTusds1XNn3o
+# vBBWrJjwiV0uZMavJgleHmMV8T2/Fo+ZiALDMLfBC2AfD3LM1reoNRKGm6ELCuaT
+# W476VJzB8xlfQo0Snx0/kLcnE4MZMoId89mH1CGyPKK2B0/XJKrujfWz2fr5OU+n
+# 6fKvWVL03EGbLxFwY93q3qrxbSEEEFMzu7JPxeFTskFlR2439rzpmxZBkWsuWzDD
+# AgMBAAGjggEdMIIBGTATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUG1IO
+# 8xEqt8CJwxGBPdSWWLmjU24wDgYDVR0PAQH/BAQDAgeAMB8GA1UdIwQYMBaAFMsR
+# 6MrStBZYAck3LjMWFrlMmgofMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwu
+# bWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY0NvZFNpZ1BDQV8wOC0z
+# MS0yMDEwLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93
+# d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljQ29kU2lnUENBXzA4LTMxLTIw
+# MTAuY3J0MA0GCSqGSIb3DQEBBQUAA4IBAQClWzZsrU6baRLjb4oCm2l3w2xkciiI
+# 2T1FbSwYe9QoLxPiWWobwgs0t4r96rmU7Acx5mr0dQTTp9peOgaeEP2pDb2cUUNv
+# /2eUnOHPfPAksDXMg13u2sBvNknAWgpX9nPhnvPjCEw7Pi/M0s3uTyJw9wQfAqZL
+# m7iPXIgONpRsMwe4qa1RoNDC3I4iEr3D34LXVqH33fClIFcQEJ3urIZ0bHGbwfDy
+# wnBep9ttTTdYmU15QNA0XVolrmfrG05GBrCMKR+jEI+lM58j1fi1Rn3g7mOYkEs+
+# BagvsBizWaSvQVOOCAUQLSrJOgZMHC6pMVFWZKyazKyXmCmKl5CH6p22MIIEujCC
+# A6KgAwIBAgIKYQUTNgAAAAAAGjANBgkqhkiG9w0BAQUFADB3MQswCQYDVQQGEwJV
+# UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE
+# ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEwHwYDVQQDExhNaWNyb3NvZnQgVGlt
+# ZS1TdGFtcCBQQ0EwHhcNMTEwNzI1MjA0MjE3WhcNMTIxMDI1MjA0MjE3WjCBszEL
+# MAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1v
+# bmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjENMAsGA1UECxMETU9Q
+# UjEnMCUGA1UECxMebkNpcGhlciBEU0UgRVNOOjE1OUMtQTNGNy0yNTcwMSUwIwYD
+# VQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNlMIIBIjANBgkqhkiG9w0B
+# AQEFAAOCAQ8AMIIBCgKCAQEAnDSYGckJKWOZAhZ1qIhXfaG7qUES/GSRpdYFeL93
+# 3OzmrrhQTsDjGr3tt/34IIpxOapyknKfignlE++RQe1hJWtRre6oQ7VhQiyd8h2x
+# 0vy39Xujc3YTsyuj25RhgFWhD23d2OwW/4V/lp6IfwAujnokumidj8bK9JB5euGb
+# 7wZdfvguw2oVnDwUL+fVlMgiG1HLqVWGIbda80ESOZ/wValOqiUrY/uRcjwPfMCW
+# ctzBo8EIyt7FybXACl+lnAuqcgpdCkB9LpjQq7KIj4aA6H3RvlVr4FgsyDY/+eYR
+# w/BDBYV4AxflLKcpfNPilRcAbNvcrTwZOgLgfWLUzvYdPQIDAQABo4IBCTCCAQUw
+# HQYDVR0OBBYEFPaDiyCHEe6Dy9vehaLSaIY3YXSQMB8GA1UdIwQYMBaAFCM0+NlS
+# RnAK7UD7dvuzK7DDNbMPMFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly9jcmwubWlj
+# cm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY3Jvc29mdFRpbWVTdGFtcFBD
+# QS5jcmwwWAYIKwYBBQUHAQEETDBKMEgGCCsGAQUFBzAChjxodHRwOi8vd3d3Lm1p
+# Y3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY3Jvc29mdFRpbWVTdGFtcFBDQS5jcnQw
+# EwYDVR0lBAwwCgYIKwYBBQUHAwgwDQYJKoZIhvcNAQEFBQADggEBAGL0BQ1P5xtr
+# gudSDN95jKhVgTOX06TKyf6vSNt72m96KE/H0LeJ2NGmmcyRVgA7OOi3Mi/u+c9r
+# 2Zje1gL1QlhSa47aQNwWoLPUvyYVy0hCzNP9tPrkRIlmD0IOXvcEnyNIW7SJQcTa
+# bPg29D/CHhXfmEwAxLLs3l8BAUOcuELWIsiTmp7JpRhn/EeEHpFdm/J297GOch2A
+# djw2EUbKfjpI86/jSfYXM427AGOCnFejVqfDbpCjPpW3/GTRXRjCCwFQY6f889GA
+# noTjMjTdV5VAo21+2usuWgi0EAZeMskJ6TKCcRan+savZpiJ+dmetV8QI6N3gPJN
+# 1igAclCFvOUwggW8MIIDpKADAgECAgphMyYaAAAAAAAxMA0GCSqGSIb3DQEBBQUA
+# MF8xEzARBgoJkiaJk/IsZAEZFgNjb20xGTAXBgoJkiaJk/IsZAEZFgltaWNyb3Nv
+# ZnQxLTArBgNVBAMTJE1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
+# eTAeFw0xMDA4MzEyMjE5MzJaFw0yMDA4MzEyMjI5MzJaMHkxCzAJBgNVBAYTAlVT
+# MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK
+# ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBDb2Rl
+# IFNpZ25pbmcgUENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsnJZ
+# XBkwZL8dmmAgIEKZdlNsPhvWb8zL8epr/pcWEODfOnSDGrcvoDLs/97CQk4j1XIA
+# 2zVXConKriBJ9PBorE1LjaW9eUtxm0cH2v0l3511iM+qc0R/14Hb873yNqTJXEXc
+# r6094CholxqnpXJzVvEXlOT9NZRyoNZ2Xx53RYOFOBbQc1sFumdSjaWyaS/aGQv+
+# knQp4nYvVN0UMFn40o1i/cvJX0YxULknE+RAMM9yKRAoIsc3Tj2gMj2QzaE4BoVc
+# TlaCKCoFMrdL109j59ItYvFFPeesCAD2RqGe0VuMJlPoeqpK8kbPNzw4nrR3XKUX
+# no3LEY9WPMGsCV8D0wIDAQABo4IBXjCCAVowDwYDVR0TAQH/BAUwAwEB/zAdBgNV
+# HQ4EFgQUyxHoytK0FlgByTcuMxYWuUyaCh8wCwYDVR0PBAQDAgGGMBIGCSsGAQQB
+# gjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUCBBYEFP3RMU7TJoqV4ZhgO6gxb6Y8vNgt
+# MBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMB8GA1UdIwQYMBaAFA6sgmBAVieX
+# 5SUT/CrhClOVWeSkMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwubWljcm9z
+# b2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL21pY3Jvc29mdHJvb3RjZXJ0LmNybDBU
+# BggrBgEFBQcBAQRIMEYwRAYIKwYBBQUHMAKGOGh0dHA6Ly93d3cubWljcm9zb2Z0
+# LmNvbS9wa2kvY2VydHMvTWljcm9zb2Z0Um9vdENlcnQuY3J0MA0GCSqGSIb3DQEB
+# BQUAA4ICAQBZOT5/Jkav629AsTK1ausOL26oSffrX3XtTDst10OtC/7L6S0xoyPM
+# fFCYgCFdrD0vTLqiqFac43C7uLT4ebVJcvc+6kF/yuEMF2nLpZwgLfoLUMRWzS3j
+# StK8cOeoDaIDpVbguIpLV/KVQpzx8+/u44YfNDy4VprwUyOFKqSCHJPilAcd8uJO
+# +IyhyugTpZFOyBvSj3KVKnFtmxr4HPBT1mfMIv9cHc2ijL0nsnljVkSiUc356aNY
+# Vt2bAkVEL1/02q7UgjJu/KSVE+Traeepoiy+yCsQDmWOmdv1ovoSJgllOJTxeh9K
+# u9HhVujQeJYYXMk1Fl/dkx1Jji2+rTREHO4QFRoAXd01WyHOmMcJ7oUOjE9tDhNO
+# PXwpSJxy0fNsysHscKNXkld9lI2gG0gDWvfPo2cKdKU27S0vF8jmcjcS9G+xPGeC
+# +VKyjTMWZR4Oit0Q3mT0b85G1NMX6XnEBLTT+yzfH4qerAr7EydAreT54al/RrsH
+# YEdlYEBOsELsTu2zdnnYCjQJbRyAMR/iDlTd5aH75UcQrWSY/1AWLny/BSF64pVB
+# J2nDk4+VyY3YmyGuDVyc8KKuhmiDDGotu3ZrAB2WrfIWe/YWgyS5iM9qqEcxL5rc
+# 43E91wB+YkfRzojJuBj6DnKNwaM9rwJAav9pm5biEKgQtDdQCNbDPTCCBgcwggPv
+# oAMCAQICCmEWaDQAAAAAABwwDQYJKoZIhvcNAQEFBQAwXzETMBEGCgmSJomT8ixk
+# ARkWA2NvbTEZMBcGCgmSJomT8ixkARkWCW1pY3Jvc29mdDEtMCsGA1UEAxMkTWlj
+# cm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTA3MDQwMzEyNTMw
+# OVoXDTIxMDQwMzEzMDMwOVowdzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
+# bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
+# b3JhdGlvbjEhMB8GA1UEAxMYTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBMIIBIjAN
+# BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn6Fssd/bSJIqfGsuGeG94uPFmVEj
+# UK3O3RhOJA/u0afRTK10MCAR6wfVVJUVSZQbQpKumFwwJtoAa+h7veyJBw/3DgSY
+# 8InMH8szJIed8vRnHCz8e+eIHernTqOhwSNTyo36Rc8J0F6v0LBCBKL5pmyTZ9co
+# 3EZTsIbQ5ShGLieshk9VUgzkAyz7apCQMG6H81kwnfp+1pez6CGXfvjSE/MIt1Nt
+# UrRFkJ9IAEpHZhEnKWaol+TTBoFKovmEpxFHFAmCn4TtVXj+AZodUAiFABAwRu23
+# 3iNGu8QtVJ+vHnhBMXfMm987g5OhYQK1HQ2x/PebsgHOIktU//kFw8IgCwIDAQAB
+# o4IBqzCCAacwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUIzT42VJGcArtQPt2
+# +7MrsMM1sw8wCwYDVR0PBAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMIGYBgNVHSME
+# gZAwgY2AFA6sgmBAVieX5SUT/CrhClOVWeSkoWOkYTBfMRMwEQYKCZImiZPyLGQB
+# GRYDY29tMRkwFwYKCZImiZPyLGQBGRYJbWljcm9zb2Z0MS0wKwYDVQQDEyRNaWNy
+# b3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCEHmtFqFKoKWtTHNY9AcT
+# LmUwUAYDVR0fBEkwRzBFoEOgQYY/aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3Br
+# aS9jcmwvcHJvZHVjdHMvbWljcm9zb2Z0cm9vdGNlcnQuY3JsMFQGCCsGAQUFBwEB
+# BEgwRjBEBggrBgEFBQcwAoY4aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9j
+# ZXJ0cy9NaWNyb3NvZnRSb290Q2VydC5jcnQwEwYDVR0lBAwwCgYIKwYBBQUHAwgw
+# DQYJKoZIhvcNAQEFBQADggIBABCXisNcA0Q23em0rXfbznlRTQGxLnRxW20ME6vO
+# vnuPuC7UEqKMbWK4VwLLTiATUJndekDiV7uvWJoc4R0Bhqy7ePKL0Ow7Ae7ivo8K
+# BciNSOLwUxXdT6uS5OeNatWAweaU8gYvhQPpkSokInD79vzkeJkuDfcH4nC8GE6d
+# jmsKcpW4oTmcZy3FUQ7qYlw/FpiLID/iBxoy+cwxSnYxPStyC8jqcD3/hQoT38IK
+# YY7w17gX606Lf8U1K16jv+u8fQtCe9RTciHuMMq7eGVcWwEXChQO0toUmPU8uWZY
+# sy0v5/mFhsxRVuidcJRsrDlM1PZ5v6oYemIp76KbKTQGdxpiyT0ebR+C8AvHLLvP
+# Q7Pl+ex9teOkqHQ1uE7FcSMSJnYLPFKMcVpGQxS8s7OwTWfIn0L/gHkhgJ4VMGbo
+# QhJeGsieIiHQQ+kr6bv0SMws1NgygEwmKkgkX1rqVu+m3pmdyjpvvYEndAYR7nYh
+# v5uCwSdUtrFqPYmhdmG0bqETpr+qR/ASb/2KMmyy/t9RyIwjyWa9nR2HEmQCPS2v
+# WY+45CHltbDKY7R4VAXUQS5QrJSwpXirs6CWdRrZkocTdSIvMqgIbqBbjCW/oO+E
+# yiHW6x5PyZruSeD3AWVviQt9yGnI5m7qp5fOMSn/DsVbXNhNG6HY+i+ePy5VFmvJ
+# E6P9MYIEnTCCBJkCAQEwgYcweTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
+# bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
+# b3JhdGlvbjEjMCEGA1UEAxMaTWljcm9zb2Z0IENvZGUgU2lnbmluZyBQQ0ECCmEZ
+# zJMAAQAAAGYwCQYFKw4DAhoFAKCByjAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIB
+# BDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQU
+# 5Ewl2ZN1e5UHOreMhz8xU6LOSbswagYKKwYBBAGCNwIBDDFcMFqgOIA2AE0AaQBj
+# AHIAbwBzAG8AZgB0ACAAQQBTAFAALgBOAEUAVAAgAFcAZQBiACAAUABhAGcAZQBz
+# oR6AHGh0dHA6Ly93d3cuYXNwLm5ldC93ZWJtYXRyaXgwDQYJKoZIhvcNAQEBBQAE
+# ggEAhGWggVuM7zD4p+Uip1VsBS49+s1IZ6YdlDdohyxU8F/V97heQzNjPSXwmktS
+# egYKWR9js1z1wjCCNTf6+bDG1gwKny/7bXWg9+PAxK3ekQN7iQeYrrTn/bZIj4cF
+# jCU+5OnoHsIy1vVy3BPf69pen0FRl8vf/bAr7nGWFqw6B839JHg0eLl+CwwvFXDb
+# SxP64YYbCCiuMJ5Qqv7WK980eiHTLiTOH+FxYBwCtx88ECdkgdYz81E4VJeMsEyp
+# Ir+LwcEtBJIIEfw0ywqsUHYaZv7cum2Y0IHnvIGsPrTVrkvYBDPz0L8iIFqKLJPr
+# ANPWp1sxv8eLLvClA+Rgt70m2aGCAh0wggIZBgkqhkiG9w0BCQYxggIKMIICBgIB
+# ATCBhTB3MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE
+# BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEwHwYD
+# VQQDExhNaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0ECCmEFEzYAAAAAABowBwYFKw4D
+# AhqgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0x
+# MjA1MDIyMzMzMjFaMCMGCSqGSIb3DQEJBDEWBBRL3gxndfgt72b57C1ZqLai9S1v
+# 0zANBgkqhkiG9w0BAQUFAASCAQA/7eK3ks0kQ7JIqJ/WpaBDssEBMQEzOz7zqeJD
+# /aHV4QMFnTr9Ml4x8Eko1EmmtUPcuJkAlBEakraJPi4GJwnp2VZ6WKR178GBGnPi
+# MP2CkzfC2dFshWSYqpSPv3/JXIhXEjid3LyM2MuYx0DtCJi1AcAMDnEJXnRiDCns
+# WH+CPIZlx16/1txCfzWbWgETqoq7BFMf3uipMrKt5BWjP9yzBz6BNo2O6EbravfV
+# /l6o46cKhfS4WL4tB3sB8JyegFUYZeivBkcVVeu8irDuaqqFmnt2l52SdZOAeXbT
+# TUv1oPuaARhsiGplNGX2a7XHoSjcwiGS1suTw6gSUP7ygxyc
+# SIG # End signature block
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/Microsoft.SqlServer.Compact.4.0.8876.1/tools/Uninstall.ps1	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,203 @@
+param($installPath, $toolsPath, $package, $project)
+
+Import-Module (Join-Path $toolsPath VS.psd1)
+if ($project.Type -eq 'Web Site') {
+    $projectRoot = Get-ProjectRoot $project
+    if (!$projectRoot) {
+        return;
+    }
+
+    $binDirectory = Join-Path $projectRoot "bin"
+    $libDirectory = Join-Path $installPath "lib\net40"
+    $nativeBinDirectory = Join-Path $installPath "NativeBinaries"
+
+    Remove-FilesFromDirectory $libDirectory $binDirectory
+    Remove-FilesFromDirectory $nativeBinDirectory $binDirectory
+}
+elseif($project.ExtenderNames -contains "WebApplication") {
+	$depAsm = Get-ChildProjectItem $Project "_bin_deployableAssemblies";
+	if($depAsm) {
+		$amd64 = Get-ChildProjectItem $depAsm "amd64";
+		if($amd64) {
+			$crt64 = Get-ChildProjectItem $amd64 "Microsoft.VC90.CRT";
+			if($crt64) {
+				Remove-Child $crt64 "Microsoft.VC90.CRT.manifest";
+				Remove-Child $crt64 "msvcr90.dll";
+				Remove-Child $crt64 "README_ENU.txt";
+				Remove-EmptyFolder $crt64;
+			}
+			Remove-Child $amd64 "sqlceca40.dll";
+			Remove-Child $amd64 "sqlcecompact40.dll";
+			Remove-Child $amd64 "sqlceer40EN.dll";
+			Remove-Child $amd64 "sqlceme40.dll";
+			Remove-Child $amd64 "sqlceqp40.dll";
+			Remove-Child $amd64 "sqlcese40.dll";
+			Remove-EmptyFolder $amd64;
+		}
+		$x86 = Get-ChildProjectItem $depAsm "x86";
+		if($x86) {
+			$crt32 = Get-ChildProjectItem $x86 "Microsoft.VC90.CRT";
+			if($crt32) {
+				Remove-Child $crt32 "Microsoft.VC90.CRT.manifest";
+				Remove-Child $crt32 "msvcr90.dll";
+				Remove-Child $crt32 "README_ENU.txt";
+				Remove-EmptyFolder $crt32;
+			}
+			Remove-Child $x86 "sqlceca40.dll";
+			Remove-Child $x86 "sqlcecompact40.dll";
+			Remove-Child $x86 "sqlceer40EN.dll";
+			Remove-Child $x86 "sqlceme40.dll";
+			Remove-Child $x86 "sqlceqp40.dll";
+			Remove-Child $x86 "sqlcese40.dll";
+			Remove-EmptyFolder $x86;
+		}
+	}
+	Remove-EmptyFolder $depAsm
+}
+else {
+    Remove-PostBuildEvent $project $installPath
+}
+Remove-Module VS
+# SIG # Begin signature block
+# MIIaYAYJKoZIhvcNAQcCoIIaUTCCGk0CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
+# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
+# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUxFz3kvDi5XL8NvzuvlFGgHdi
+# C2KgghUtMIIEoDCCA4igAwIBAgIKYRnMkwABAAAAZjANBgkqhkiG9w0BAQUFADB5
+# MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk
+# bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSMwIQYDVQQDExpN
+# aWNyb3NvZnQgQ29kZSBTaWduaW5nIFBDQTAeFw0xMTEwMTAyMDMyMjVaFw0xMzAx
+# MTAyMDMyMjVaMIGDMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ
+# MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
+# MQ0wCwYDVQQLEwRNT1BSMR4wHAYDVQQDExVNaWNyb3NvZnQgQ29ycG9yYXRpb24w
+# ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDuW759ESTjhgbgZv9ItRe9
+# AuS0DDLwcj59LofXTqGxp0Mv92WeMeEyMUWu18EkhCHXLrWEfvo101Mc17ZRHk/O
+# ZrnrtwwC/SlcraiH9soitNW/CHX1inCPY9fvih7pj0MkZFrTh32QbTusds1XNn3o
+# vBBWrJjwiV0uZMavJgleHmMV8T2/Fo+ZiALDMLfBC2AfD3LM1reoNRKGm6ELCuaT
+# W476VJzB8xlfQo0Snx0/kLcnE4MZMoId89mH1CGyPKK2B0/XJKrujfWz2fr5OU+n
+# 6fKvWVL03EGbLxFwY93q3qrxbSEEEFMzu7JPxeFTskFlR2439rzpmxZBkWsuWzDD
+# AgMBAAGjggEdMIIBGTATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUG1IO
+# 8xEqt8CJwxGBPdSWWLmjU24wDgYDVR0PAQH/BAQDAgeAMB8GA1UdIwQYMBaAFMsR
+# 6MrStBZYAck3LjMWFrlMmgofMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwu
+# bWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY0NvZFNpZ1BDQV8wOC0z
+# MS0yMDEwLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93
+# d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljQ29kU2lnUENBXzA4LTMxLTIw
+# MTAuY3J0MA0GCSqGSIb3DQEBBQUAA4IBAQClWzZsrU6baRLjb4oCm2l3w2xkciiI
+# 2T1FbSwYe9QoLxPiWWobwgs0t4r96rmU7Acx5mr0dQTTp9peOgaeEP2pDb2cUUNv
+# /2eUnOHPfPAksDXMg13u2sBvNknAWgpX9nPhnvPjCEw7Pi/M0s3uTyJw9wQfAqZL
+# m7iPXIgONpRsMwe4qa1RoNDC3I4iEr3D34LXVqH33fClIFcQEJ3urIZ0bHGbwfDy
+# wnBep9ttTTdYmU15QNA0XVolrmfrG05GBrCMKR+jEI+lM58j1fi1Rn3g7mOYkEs+
+# BagvsBizWaSvQVOOCAUQLSrJOgZMHC6pMVFWZKyazKyXmCmKl5CH6p22MIIEujCC
+# A6KgAwIBAgIKYQUTNgAAAAAAGjANBgkqhkiG9w0BAQUFADB3MQswCQYDVQQGEwJV
+# UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE
+# ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEwHwYDVQQDExhNaWNyb3NvZnQgVGlt
+# ZS1TdGFtcCBQQ0EwHhcNMTEwNzI1MjA0MjE3WhcNMTIxMDI1MjA0MjE3WjCBszEL
+# MAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1v
+# bmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjENMAsGA1UECxMETU9Q
+# UjEnMCUGA1UECxMebkNpcGhlciBEU0UgRVNOOjE1OUMtQTNGNy0yNTcwMSUwIwYD
+# VQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNlMIIBIjANBgkqhkiG9w0B
+# AQEFAAOCAQ8AMIIBCgKCAQEAnDSYGckJKWOZAhZ1qIhXfaG7qUES/GSRpdYFeL93
+# 3OzmrrhQTsDjGr3tt/34IIpxOapyknKfignlE++RQe1hJWtRre6oQ7VhQiyd8h2x
+# 0vy39Xujc3YTsyuj25RhgFWhD23d2OwW/4V/lp6IfwAujnokumidj8bK9JB5euGb
+# 7wZdfvguw2oVnDwUL+fVlMgiG1HLqVWGIbda80ESOZ/wValOqiUrY/uRcjwPfMCW
+# ctzBo8EIyt7FybXACl+lnAuqcgpdCkB9LpjQq7KIj4aA6H3RvlVr4FgsyDY/+eYR
+# w/BDBYV4AxflLKcpfNPilRcAbNvcrTwZOgLgfWLUzvYdPQIDAQABo4IBCTCCAQUw
+# HQYDVR0OBBYEFPaDiyCHEe6Dy9vehaLSaIY3YXSQMB8GA1UdIwQYMBaAFCM0+NlS
+# RnAK7UD7dvuzK7DDNbMPMFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly9jcmwubWlj
+# cm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY3Jvc29mdFRpbWVTdGFtcFBD
+# QS5jcmwwWAYIKwYBBQUHAQEETDBKMEgGCCsGAQUFBzAChjxodHRwOi8vd3d3Lm1p
+# Y3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY3Jvc29mdFRpbWVTdGFtcFBDQS5jcnQw
+# EwYDVR0lBAwwCgYIKwYBBQUHAwgwDQYJKoZIhvcNAQEFBQADggEBAGL0BQ1P5xtr
+# gudSDN95jKhVgTOX06TKyf6vSNt72m96KE/H0LeJ2NGmmcyRVgA7OOi3Mi/u+c9r
+# 2Zje1gL1QlhSa47aQNwWoLPUvyYVy0hCzNP9tPrkRIlmD0IOXvcEnyNIW7SJQcTa
+# bPg29D/CHhXfmEwAxLLs3l8BAUOcuELWIsiTmp7JpRhn/EeEHpFdm/J297GOch2A
+# djw2EUbKfjpI86/jSfYXM427AGOCnFejVqfDbpCjPpW3/GTRXRjCCwFQY6f889GA
+# noTjMjTdV5VAo21+2usuWgi0EAZeMskJ6TKCcRan+savZpiJ+dmetV8QI6N3gPJN
+# 1igAclCFvOUwggW8MIIDpKADAgECAgphMyYaAAAAAAAxMA0GCSqGSIb3DQEBBQUA
+# MF8xEzARBgoJkiaJk/IsZAEZFgNjb20xGTAXBgoJkiaJk/IsZAEZFgltaWNyb3Nv
+# ZnQxLTArBgNVBAMTJE1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
+# eTAeFw0xMDA4MzEyMjE5MzJaFw0yMDA4MzEyMjI5MzJaMHkxCzAJBgNVBAYTAlVT
+# MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK
+# ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBDb2Rl
+# IFNpZ25pbmcgUENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsnJZ
+# XBkwZL8dmmAgIEKZdlNsPhvWb8zL8epr/pcWEODfOnSDGrcvoDLs/97CQk4j1XIA
+# 2zVXConKriBJ9PBorE1LjaW9eUtxm0cH2v0l3511iM+qc0R/14Hb873yNqTJXEXc
+# r6094CholxqnpXJzVvEXlOT9NZRyoNZ2Xx53RYOFOBbQc1sFumdSjaWyaS/aGQv+
+# knQp4nYvVN0UMFn40o1i/cvJX0YxULknE+RAMM9yKRAoIsc3Tj2gMj2QzaE4BoVc
+# TlaCKCoFMrdL109j59ItYvFFPeesCAD2RqGe0VuMJlPoeqpK8kbPNzw4nrR3XKUX
+# no3LEY9WPMGsCV8D0wIDAQABo4IBXjCCAVowDwYDVR0TAQH/BAUwAwEB/zAdBgNV
+# HQ4EFgQUyxHoytK0FlgByTcuMxYWuUyaCh8wCwYDVR0PBAQDAgGGMBIGCSsGAQQB
+# gjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUCBBYEFP3RMU7TJoqV4ZhgO6gxb6Y8vNgt
+# MBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMB8GA1UdIwQYMBaAFA6sgmBAVieX
+# 5SUT/CrhClOVWeSkMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwubWljcm9z
+# b2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL21pY3Jvc29mdHJvb3RjZXJ0LmNybDBU
+# BggrBgEFBQcBAQRIMEYwRAYIKwYBBQUHMAKGOGh0dHA6Ly93d3cubWljcm9zb2Z0
+# LmNvbS9wa2kvY2VydHMvTWljcm9zb2Z0Um9vdENlcnQuY3J0MA0GCSqGSIb3DQEB
+# BQUAA4ICAQBZOT5/Jkav629AsTK1ausOL26oSffrX3XtTDst10OtC/7L6S0xoyPM
+# fFCYgCFdrD0vTLqiqFac43C7uLT4ebVJcvc+6kF/yuEMF2nLpZwgLfoLUMRWzS3j
+# StK8cOeoDaIDpVbguIpLV/KVQpzx8+/u44YfNDy4VprwUyOFKqSCHJPilAcd8uJO
+# +IyhyugTpZFOyBvSj3KVKnFtmxr4HPBT1mfMIv9cHc2ijL0nsnljVkSiUc356aNY
+# Vt2bAkVEL1/02q7UgjJu/KSVE+Traeepoiy+yCsQDmWOmdv1ovoSJgllOJTxeh9K
+# u9HhVujQeJYYXMk1Fl/dkx1Jji2+rTREHO4QFRoAXd01WyHOmMcJ7oUOjE9tDhNO
+# PXwpSJxy0fNsysHscKNXkld9lI2gG0gDWvfPo2cKdKU27S0vF8jmcjcS9G+xPGeC
+# +VKyjTMWZR4Oit0Q3mT0b85G1NMX6XnEBLTT+yzfH4qerAr7EydAreT54al/RrsH
+# YEdlYEBOsELsTu2zdnnYCjQJbRyAMR/iDlTd5aH75UcQrWSY/1AWLny/BSF64pVB
+# J2nDk4+VyY3YmyGuDVyc8KKuhmiDDGotu3ZrAB2WrfIWe/YWgyS5iM9qqEcxL5rc
+# 43E91wB+YkfRzojJuBj6DnKNwaM9rwJAav9pm5biEKgQtDdQCNbDPTCCBgcwggPv
+# oAMCAQICCmEWaDQAAAAAABwwDQYJKoZIhvcNAQEFBQAwXzETMBEGCgmSJomT8ixk
+# ARkWA2NvbTEZMBcGCgmSJomT8ixkARkWCW1pY3Jvc29mdDEtMCsGA1UEAxMkTWlj
+# cm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTA3MDQwMzEyNTMw
+# OVoXDTIxMDQwMzEzMDMwOVowdzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
+# bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
+# b3JhdGlvbjEhMB8GA1UEAxMYTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBMIIBIjAN
+# BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn6Fssd/bSJIqfGsuGeG94uPFmVEj
+# UK3O3RhOJA/u0afRTK10MCAR6wfVVJUVSZQbQpKumFwwJtoAa+h7veyJBw/3DgSY
+# 8InMH8szJIed8vRnHCz8e+eIHernTqOhwSNTyo36Rc8J0F6v0LBCBKL5pmyTZ9co
+# 3EZTsIbQ5ShGLieshk9VUgzkAyz7apCQMG6H81kwnfp+1pez6CGXfvjSE/MIt1Nt
+# UrRFkJ9IAEpHZhEnKWaol+TTBoFKovmEpxFHFAmCn4TtVXj+AZodUAiFABAwRu23
+# 3iNGu8QtVJ+vHnhBMXfMm987g5OhYQK1HQ2x/PebsgHOIktU//kFw8IgCwIDAQAB
+# o4IBqzCCAacwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUIzT42VJGcArtQPt2
+# +7MrsMM1sw8wCwYDVR0PBAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMIGYBgNVHSME
+# gZAwgY2AFA6sgmBAVieX5SUT/CrhClOVWeSkoWOkYTBfMRMwEQYKCZImiZPyLGQB
+# GRYDY29tMRkwFwYKCZImiZPyLGQBGRYJbWljcm9zb2Z0MS0wKwYDVQQDEyRNaWNy
+# b3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCEHmtFqFKoKWtTHNY9AcT
+# LmUwUAYDVR0fBEkwRzBFoEOgQYY/aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3Br
+# aS9jcmwvcHJvZHVjdHMvbWljcm9zb2Z0cm9vdGNlcnQuY3JsMFQGCCsGAQUFBwEB
+# BEgwRjBEBggrBgEFBQcwAoY4aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9j
+# ZXJ0cy9NaWNyb3NvZnRSb290Q2VydC5jcnQwEwYDVR0lBAwwCgYIKwYBBQUHAwgw
+# DQYJKoZIhvcNAQEFBQADggIBABCXisNcA0Q23em0rXfbznlRTQGxLnRxW20ME6vO
+# vnuPuC7UEqKMbWK4VwLLTiATUJndekDiV7uvWJoc4R0Bhqy7ePKL0Ow7Ae7ivo8K
+# BciNSOLwUxXdT6uS5OeNatWAweaU8gYvhQPpkSokInD79vzkeJkuDfcH4nC8GE6d
+# jmsKcpW4oTmcZy3FUQ7qYlw/FpiLID/iBxoy+cwxSnYxPStyC8jqcD3/hQoT38IK
+# YY7w17gX606Lf8U1K16jv+u8fQtCe9RTciHuMMq7eGVcWwEXChQO0toUmPU8uWZY
+# sy0v5/mFhsxRVuidcJRsrDlM1PZ5v6oYemIp76KbKTQGdxpiyT0ebR+C8AvHLLvP
+# Q7Pl+ex9teOkqHQ1uE7FcSMSJnYLPFKMcVpGQxS8s7OwTWfIn0L/gHkhgJ4VMGbo
+# QhJeGsieIiHQQ+kr6bv0SMws1NgygEwmKkgkX1rqVu+m3pmdyjpvvYEndAYR7nYh
+# v5uCwSdUtrFqPYmhdmG0bqETpr+qR/ASb/2KMmyy/t9RyIwjyWa9nR2HEmQCPS2v
+# WY+45CHltbDKY7R4VAXUQS5QrJSwpXirs6CWdRrZkocTdSIvMqgIbqBbjCW/oO+E
+# yiHW6x5PyZruSeD3AWVviQt9yGnI5m7qp5fOMSn/DsVbXNhNG6HY+i+ePy5VFmvJ
+# E6P9MYIEnTCCBJkCAQEwgYcweTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
+# bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
+# b3JhdGlvbjEjMCEGA1UEAxMaTWljcm9zb2Z0IENvZGUgU2lnbmluZyBQQ0ECCmEZ
+# zJMAAQAAAGYwCQYFKw4DAhoFAKCByjAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIB
+# BDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQU
+# UKkz3i9W+8AubhICw1WW6ANVRt0wagYKKwYBBAGCNwIBDDFcMFqgOIA2AE0AaQBj
+# AHIAbwBzAG8AZgB0ACAAQQBTAFAALgBOAEUAVAAgAFcAZQBiACAAUABhAGcAZQBz
+# oR6AHGh0dHA6Ly93d3cuYXNwLm5ldC93ZWJtYXRyaXgwDQYJKoZIhvcNAQEBBQAE
+# ggEAV8H99PNfnyDdg08ADZuLzs8RUlGWmg6P+Lu8QDRY+74H3ePH+i9zvSGky+yD
+# nuOc8zAKeA+PFi0grh2mvsx+Ut39LLwrWBV3B7/AuXGFKhGz48JLl2ey+9Y7A5wL
+# ttPc7K7T14h3B4Fkc712XCsXLjbnGDR9jjrUE2a8DzhcCm4EggNZHrQH585Xp3XK
+# 4Pou4SW3icJQcp7FCahcR/kJek+6JoZ7BjbBej+fyN2DGq3EQyrxp/doGjk0vrm5
+# OTZEoMLDR+e18mJD4HrI/3y2esElCz9dAMiphxOXvEdADmxy/nwaYtXGbJ6csMsg
+# mAbxq/vHpKQFGRMYDnXGso++daGCAh0wggIZBgkqhkiG9w0BCQYxggIKMIICBgIB
+# ATCBhTB3MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE
+# BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEwHwYD
+# VQQDExhNaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0ECCmEFEzYAAAAAABowBwYFKw4D
+# AhqgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0x
+# MjA1MDIyMzMzMjFaMCMGCSqGSIb3DQEJBDEWBBTOw+FH02QcdgQkavJlNMFAccmG
+# uTANBgkqhkiG9w0BAQUFAASCAQAixk541g+2gi+7DYmtZwDBrcCiaiAsQYwwoQYB
+# vRR4Ngrgk5BHE35HUHmxDZ43p4PB2czDMm7xE5wNS5RDK0us/ab9kXEGZsXlxmCi
+# C162Ujzr/V/WhkBpmqs49Ml2U6+PSTAG0wcp33PjHtuiZ5MK8sz3IHIAeSdMadl+
+# SfNFOFRxTEluPHTc2HGsYkM5y43GMxRLxb+TYbQAOfes/omTUC0A0fyW59XXLB+o
+# 1E6HQzG3uPVj/mmATXxfx6Lsxok9cEoWb7Cw63ZC1uR9VKtVGn5C1GvhkBKUmuV+
+# Dvp+tfoKzZiw4PZCo7o7lu5hr+BxqxieFt43lLlyABBtyQ9a
+# SIG # End signature block
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/Microsoft.SqlServer.Compact.4.0.8876.1/tools/VS.psd1	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,221 @@
+@{
+
+# Script module or binary module file associated with this manifest
+ModuleToProcess = 'VS.psm1'
+
+# Version number of this module.
+ModuleVersion = '0.1'
+
+# ID used to uniquely identify this module
+GUID = 'b1ab5d7d-d317-4c6d-97b8-4620f93082d3'
+
+# Author of this module
+Author = 'Microsoft Corporation'
+
+# Company or vendor of this module
+CompanyName = 'Microsoft Corporation'
+
+# Copyright statement for this module
+Copyright = '(c) 2011 Microsoft Corporation. All rights reserved.'
+
+# Description of the functionality provided by this module
+Description = 'Powershell wrapper for NuGet.VisualStudio'
+
+# Minimum version of the Windows PowerShell engine required by this module
+PowerShellVersion = '2.0'
+
+# Name of the Windows PowerShell host required by this module
+PowerShellHostName = 'Package Manager Host'
+
+# Minimum version of the Windows PowerShell host required by this module
+PowerShellHostVersion = '1.2'
+
+# Minimum version of the .NET Framework required by this module
+DotNetFrameworkVersion = '4.0'
+
+# Minimum version of the common language runtime (CLR) required by this module
+CLRVersion = ''
+
+# Processor architecture (None, X86, Amd64, IA64) required by this module
+ProcessorArchitecture = ''
+
+# Modules that must be imported into the global environment prior to importing this module
+RequiredModules = @()
+
+# Assemblies that must be loaded prior to importing this module
+RequiredAssemblies = @()
+
+# Script files (.ps1) that are run in the caller's environment prior to importing this module
+ScriptsToProcess = @()
+
+# Type files (.ps1xml) to be loaded when importing this module
+TypesToProcess = @()
+
+# Format files (.ps1xml) to be loaded when importing this module
+FormatsToProcess = @()
+
+# Modules to import as nested modules of the module specified in ModuleToProcess
+NestedModules = @('VS.psm1')
+
+# Functions to export from this module
+FunctionsToExport = '*'
+
+# Cmdlets to export from this module
+CmdletsToExport = ''
+
+# Variables to export from this module
+VariablesToExport = ''
+
+# Aliases to export from this module
+AliasesToExport = ''
+
+# List of all files packaged with this module
+FileList = @()
+
+# Private data to pass to the module specified in ModuleToProcess
+PrivateData = ''
+
+}
+# SIG # Begin signature block
+# MIIaYAYJKoZIhvcNAQcCoIIaUTCCGk0CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
+# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
+# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUOXoWcS17lm8Ab8sGlFmVs528
+# M5ygghUtMIIEoDCCA4igAwIBAgIKYRnMkwABAAAAZjANBgkqhkiG9w0BAQUFADB5
+# MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk
+# bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSMwIQYDVQQDExpN
+# aWNyb3NvZnQgQ29kZSBTaWduaW5nIFBDQTAeFw0xMTEwMTAyMDMyMjVaFw0xMzAx
+# MTAyMDMyMjVaMIGDMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ
+# MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
+# MQ0wCwYDVQQLEwRNT1BSMR4wHAYDVQQDExVNaWNyb3NvZnQgQ29ycG9yYXRpb24w
+# ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDuW759ESTjhgbgZv9ItRe9
+# AuS0DDLwcj59LofXTqGxp0Mv92WeMeEyMUWu18EkhCHXLrWEfvo101Mc17ZRHk/O
+# ZrnrtwwC/SlcraiH9soitNW/CHX1inCPY9fvih7pj0MkZFrTh32QbTusds1XNn3o
+# vBBWrJjwiV0uZMavJgleHmMV8T2/Fo+ZiALDMLfBC2AfD3LM1reoNRKGm6ELCuaT
+# W476VJzB8xlfQo0Snx0/kLcnE4MZMoId89mH1CGyPKK2B0/XJKrujfWz2fr5OU+n
+# 6fKvWVL03EGbLxFwY93q3qrxbSEEEFMzu7JPxeFTskFlR2439rzpmxZBkWsuWzDD
+# AgMBAAGjggEdMIIBGTATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUG1IO
+# 8xEqt8CJwxGBPdSWWLmjU24wDgYDVR0PAQH/BAQDAgeAMB8GA1UdIwQYMBaAFMsR
+# 6MrStBZYAck3LjMWFrlMmgofMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwu
+# bWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY0NvZFNpZ1BDQV8wOC0z
+# MS0yMDEwLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93
+# d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljQ29kU2lnUENBXzA4LTMxLTIw
+# MTAuY3J0MA0GCSqGSIb3DQEBBQUAA4IBAQClWzZsrU6baRLjb4oCm2l3w2xkciiI
+# 2T1FbSwYe9QoLxPiWWobwgs0t4r96rmU7Acx5mr0dQTTp9peOgaeEP2pDb2cUUNv
+# /2eUnOHPfPAksDXMg13u2sBvNknAWgpX9nPhnvPjCEw7Pi/M0s3uTyJw9wQfAqZL
+# m7iPXIgONpRsMwe4qa1RoNDC3I4iEr3D34LXVqH33fClIFcQEJ3urIZ0bHGbwfDy
+# wnBep9ttTTdYmU15QNA0XVolrmfrG05GBrCMKR+jEI+lM58j1fi1Rn3g7mOYkEs+
+# BagvsBizWaSvQVOOCAUQLSrJOgZMHC6pMVFWZKyazKyXmCmKl5CH6p22MIIEujCC
+# A6KgAwIBAgIKYQUZlgAAAAAAGzANBgkqhkiG9w0BAQUFADB3MQswCQYDVQQGEwJV
+# UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE
+# ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEwHwYDVQQDExhNaWNyb3NvZnQgVGlt
+# ZS1TdGFtcCBQQ0EwHhcNMTEwNzI1MjA0MjE5WhcNMTIxMDI1MjA0MjE5WjCBszEL
+# MAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1v
+# bmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjENMAsGA1UECxMETU9Q
+# UjEnMCUGA1UECxMebkNpcGhlciBEU0UgRVNOOjlFNzgtODY0Qi0wMzlEMSUwIwYD
+# VQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNlMIIBIjANBgkqhkiG9w0B
+# AQEFAAOCAQ8AMIIBCgKCAQEA08s7U6KfRKN6q01WcVOKd6o3k34BPv2rAqNTqf/R
+# sSLFAJDndW7uGOiBDhPF2GEAvh+gdjsEDQTFBKCo/ENTBqEEBLkLkpgCYjjv1DMS
+# 9ys9e++tRVeFlSCf12M0nGJGjr6u4NmeOfapVf3P53fmNRPvXOi/SJNPGkMHWDiK
+# f4UUbOrJ0Et6gm7L0xVgCBSJlKhbPzrJPyB9bS9YGn3Kiji8w8I5aNgtWBoj7SoQ
+# CFogjIKl7dGXRZKFzMM3g98NmHzF07bgmVPYeAj15SMhB2KGWmppGf1w+VM0gfcl
+# MRmGh4vAVZr9qkw1Ff1b6ZXJq1OYKV8speElD2TF8rAndQIDAQABo4IBCTCCAQUw
+# HQYDVR0OBBYEFHkj56ENvlUsaBgpYoJn1vPhNjhaMB8GA1UdIwQYMBaAFCM0+NlS
+# RnAK7UD7dvuzK7DDNbMPMFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly9jcmwubWlj
+# cm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY3Jvc29mdFRpbWVTdGFtcFBD
+# QS5jcmwwWAYIKwYBBQUHAQEETDBKMEgGCCsGAQUFBzAChjxodHRwOi8vd3d3Lm1p
+# Y3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY3Jvc29mdFRpbWVTdGFtcFBDQS5jcnQw
+# EwYDVR0lBAwwCgYIKwYBBQUHAwgwDQYJKoZIhvcNAQEFBQADggEBAEfCdoFbMd1v
+# 0zyZ8npsfpcTUCwFFxsQuEShtYz0Vs+9sCG0ZG1hHNju6Ov1ku5DohhEw/r67622
+# XH+XbUu1Q/snYXgIVHyx+a+YCrR0xKroLVDEff59TqGZ1icot67Y37GPgyKOzvN5
+# /GEUbb/rzISw36O7WwW36lT1Yh1sJ6ZjS/rjofq734WWZWlTsLZxmGQmZr3F8Vxi
+# vJH0PZxLQgANzzgFFCZa3CoFS39qmTjY3XOZos6MUCSepOv1P4p4zFSZXSVmpEEG
+# KK9JxLRSlOzeAoNk/k3U/0ui/CmA2+4/qzztM4jKvyJg0Fw7BLAKtJhtPKc6T5rR
+# ARYRYopBdqAwggW8MIIDpKADAgECAgphMyYaAAAAAAAxMA0GCSqGSIb3DQEBBQUA
+# MF8xEzARBgoJkiaJk/IsZAEZFgNjb20xGTAXBgoJkiaJk/IsZAEZFgltaWNyb3Nv
+# ZnQxLTArBgNVBAMTJE1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
+# eTAeFw0xMDA4MzEyMjE5MzJaFw0yMDA4MzEyMjI5MzJaMHkxCzAJBgNVBAYTAlVT
+# MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK
+# ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBDb2Rl
+# IFNpZ25pbmcgUENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsnJZ
+# XBkwZL8dmmAgIEKZdlNsPhvWb8zL8epr/pcWEODfOnSDGrcvoDLs/97CQk4j1XIA
+# 2zVXConKriBJ9PBorE1LjaW9eUtxm0cH2v0l3511iM+qc0R/14Hb873yNqTJXEXc
+# r6094CholxqnpXJzVvEXlOT9NZRyoNZ2Xx53RYOFOBbQc1sFumdSjaWyaS/aGQv+
+# knQp4nYvVN0UMFn40o1i/cvJX0YxULknE+RAMM9yKRAoIsc3Tj2gMj2QzaE4BoVc
+# TlaCKCoFMrdL109j59ItYvFFPeesCAD2RqGe0VuMJlPoeqpK8kbPNzw4nrR3XKUX
+# no3LEY9WPMGsCV8D0wIDAQABo4IBXjCCAVowDwYDVR0TAQH/BAUwAwEB/zAdBgNV
+# HQ4EFgQUyxHoytK0FlgByTcuMxYWuUyaCh8wCwYDVR0PBAQDAgGGMBIGCSsGAQQB
+# gjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUCBBYEFP3RMU7TJoqV4ZhgO6gxb6Y8vNgt
+# MBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMB8GA1UdIwQYMBaAFA6sgmBAVieX
+# 5SUT/CrhClOVWeSkMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwubWljcm9z
+# b2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL21pY3Jvc29mdHJvb3RjZXJ0LmNybDBU
+# BggrBgEFBQcBAQRIMEYwRAYIKwYBBQUHMAKGOGh0dHA6Ly93d3cubWljcm9zb2Z0
+# LmNvbS9wa2kvY2VydHMvTWljcm9zb2Z0Um9vdENlcnQuY3J0MA0GCSqGSIb3DQEB
+# BQUAA4ICAQBZOT5/Jkav629AsTK1ausOL26oSffrX3XtTDst10OtC/7L6S0xoyPM
+# fFCYgCFdrD0vTLqiqFac43C7uLT4ebVJcvc+6kF/yuEMF2nLpZwgLfoLUMRWzS3j
+# StK8cOeoDaIDpVbguIpLV/KVQpzx8+/u44YfNDy4VprwUyOFKqSCHJPilAcd8uJO
+# +IyhyugTpZFOyBvSj3KVKnFtmxr4HPBT1mfMIv9cHc2ijL0nsnljVkSiUc356aNY
+# Vt2bAkVEL1/02q7UgjJu/KSVE+Traeepoiy+yCsQDmWOmdv1ovoSJgllOJTxeh9K
+# u9HhVujQeJYYXMk1Fl/dkx1Jji2+rTREHO4QFRoAXd01WyHOmMcJ7oUOjE9tDhNO
+# PXwpSJxy0fNsysHscKNXkld9lI2gG0gDWvfPo2cKdKU27S0vF8jmcjcS9G+xPGeC
+# +VKyjTMWZR4Oit0Q3mT0b85G1NMX6XnEBLTT+yzfH4qerAr7EydAreT54al/RrsH
+# YEdlYEBOsELsTu2zdnnYCjQJbRyAMR/iDlTd5aH75UcQrWSY/1AWLny/BSF64pVB
+# J2nDk4+VyY3YmyGuDVyc8KKuhmiDDGotu3ZrAB2WrfIWe/YWgyS5iM9qqEcxL5rc
+# 43E91wB+YkfRzojJuBj6DnKNwaM9rwJAav9pm5biEKgQtDdQCNbDPTCCBgcwggPv
+# oAMCAQICCmEWaDQAAAAAABwwDQYJKoZIhvcNAQEFBQAwXzETMBEGCgmSJomT8ixk
+# ARkWA2NvbTEZMBcGCgmSJomT8ixkARkWCW1pY3Jvc29mdDEtMCsGA1UEAxMkTWlj
+# cm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTA3MDQwMzEyNTMw
+# OVoXDTIxMDQwMzEzMDMwOVowdzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
+# bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
+# b3JhdGlvbjEhMB8GA1UEAxMYTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBMIIBIjAN
+# BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn6Fssd/bSJIqfGsuGeG94uPFmVEj
+# UK3O3RhOJA/u0afRTK10MCAR6wfVVJUVSZQbQpKumFwwJtoAa+h7veyJBw/3DgSY
+# 8InMH8szJIed8vRnHCz8e+eIHernTqOhwSNTyo36Rc8J0F6v0LBCBKL5pmyTZ9co
+# 3EZTsIbQ5ShGLieshk9VUgzkAyz7apCQMG6H81kwnfp+1pez6CGXfvjSE/MIt1Nt
+# UrRFkJ9IAEpHZhEnKWaol+TTBoFKovmEpxFHFAmCn4TtVXj+AZodUAiFABAwRu23
+# 3iNGu8QtVJ+vHnhBMXfMm987g5OhYQK1HQ2x/PebsgHOIktU//kFw8IgCwIDAQAB
+# o4IBqzCCAacwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUIzT42VJGcArtQPt2
+# +7MrsMM1sw8wCwYDVR0PBAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMIGYBgNVHSME
+# gZAwgY2AFA6sgmBAVieX5SUT/CrhClOVWeSkoWOkYTBfMRMwEQYKCZImiZPyLGQB
+# GRYDY29tMRkwFwYKCZImiZPyLGQBGRYJbWljcm9zb2Z0MS0wKwYDVQQDEyRNaWNy
+# b3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCEHmtFqFKoKWtTHNY9AcT
+# LmUwUAYDVR0fBEkwRzBFoEOgQYY/aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3Br
+# aS9jcmwvcHJvZHVjdHMvbWljcm9zb2Z0cm9vdGNlcnQuY3JsMFQGCCsGAQUFBwEB
+# BEgwRjBEBggrBgEFBQcwAoY4aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9j
+# ZXJ0cy9NaWNyb3NvZnRSb290Q2VydC5jcnQwEwYDVR0lBAwwCgYIKwYBBQUHAwgw
+# DQYJKoZIhvcNAQEFBQADggIBABCXisNcA0Q23em0rXfbznlRTQGxLnRxW20ME6vO
+# vnuPuC7UEqKMbWK4VwLLTiATUJndekDiV7uvWJoc4R0Bhqy7ePKL0Ow7Ae7ivo8K
+# BciNSOLwUxXdT6uS5OeNatWAweaU8gYvhQPpkSokInD79vzkeJkuDfcH4nC8GE6d
+# jmsKcpW4oTmcZy3FUQ7qYlw/FpiLID/iBxoy+cwxSnYxPStyC8jqcD3/hQoT38IK
+# YY7w17gX606Lf8U1K16jv+u8fQtCe9RTciHuMMq7eGVcWwEXChQO0toUmPU8uWZY
+# sy0v5/mFhsxRVuidcJRsrDlM1PZ5v6oYemIp76KbKTQGdxpiyT0ebR+C8AvHLLvP
+# Q7Pl+ex9teOkqHQ1uE7FcSMSJnYLPFKMcVpGQxS8s7OwTWfIn0L/gHkhgJ4VMGbo
+# QhJeGsieIiHQQ+kr6bv0SMws1NgygEwmKkgkX1rqVu+m3pmdyjpvvYEndAYR7nYh
+# v5uCwSdUtrFqPYmhdmG0bqETpr+qR/ASb/2KMmyy/t9RyIwjyWa9nR2HEmQCPS2v
+# WY+45CHltbDKY7R4VAXUQS5QrJSwpXirs6CWdRrZkocTdSIvMqgIbqBbjCW/oO+E
+# yiHW6x5PyZruSeD3AWVviQt9yGnI5m7qp5fOMSn/DsVbXNhNG6HY+i+ePy5VFmvJ
+# E6P9MYIEnTCCBJkCAQEwgYcweTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
+# bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
+# b3JhdGlvbjEjMCEGA1UEAxMaTWljcm9zb2Z0IENvZGUgU2lnbmluZyBQQ0ECCmEZ
+# zJMAAQAAAGYwCQYFKw4DAhoFAKCByjAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIB
+# BDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQU
+# /7FoUja90/kLXKiZGhy99cCrjSYwagYKKwYBBAGCNwIBDDFcMFqgOIA2AE0AaQBj
+# AHIAbwBzAG8AZgB0ACAAQQBTAFAALgBOAEUAVAAgAFcAZQBiACAAUABhAGcAZQBz
+# oR6AHGh0dHA6Ly93d3cuYXNwLm5ldC93ZWJtYXRyaXgwDQYJKoZIhvcNAQEBBQAE
+# ggEATa60pB7MDesagfdU6YnHh8b8FPhF8hxZaLgyvzgBwF2P30+61wtpAnT3Xpef
+# BmEZl0QjOVUeVHggv6sKP4oVpSkejPO8fpreKDCdzEAIQH+ur9eGzD9MDuecrCZH
+# Z304Kp3paR1tBc1sgjHOf9NnmAxqJtA4AUBdg+d2tArgKU7yQ57Sl1D32IrG45nq
+# oOcOEHqA42SfbGo+2W9YO+/Tkx8sCd6KbIvPI4rvUWEpvcd+JwOduVFki7VIHZ3N
+# FF4HBez8XqUDO/h/gzEZChIcdl7mEsDwOIviMK9KgDA51dWlysYotgaUB516kj9j
+# 6LgusKEsDThqj4UJOUHlUnuMm6GCAh0wggIZBgkqhkiG9w0BCQYxggIKMIICBgIB
+# ATCBhTB3MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE
+# BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEwHwYD
+# VQQDExhNaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0ECCmEFGZYAAAAAABswBwYFKw4D
+# AhqgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0x
+# MjA1MDIyMzMzMjFaMCMGCSqGSIb3DQEJBDEWBBQjUNgsmRtonZ33wAxooKgbhaTZ
+# 9DANBgkqhkiG9w0BAQUFAASCAQCDYtEawketme7+m6aEpN7Zg5WaJkN/ms0RijUD
+# YzXTc5gIUDtxzi4tLZMoX5koEMJmV9CO5mvh8ugF08ZgPNTgjw4VLe5vt5bteZ7L
+# lnxMJLmSntvMadmdllsDeHXS+zWeG1mqL5YoUb70JcKPlCzFXJ80HtddYXw0+IXU
+# I5mQqatFvrNR24dLMifN51+2geihs990DYjv1t5JrrfJf2vbT8RPwP2QAhGVYQ/r
+# z9d+k5PoidNCuWwa8Gy38SsIhBoQlSr7B/812I7VkJ1LxgDVW5YwdmaCZulhNOIv
+# XgrQSPBouSZsY62Ru9SbrWmOuh5XzXJUAB1mMf7PTQNXmhcu
+# SIG # End signature block
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/Microsoft.SqlServer.Compact.4.0.8876.1/tools/VS.psm1	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,276 @@
+function Get-VsFileSystem {
+    $componentModel = Get-VSComponentModel
+    $fileSystemProvider = $componentModel.GetService([NuGet.VisualStudio.IFileSystemProvider])
+    $solutionManager = $componentModel.GetService([NuGet.VisualStudio.ISolutionManager])
+    
+    $fileSystem = $fileSystemProvider.GetFileSystem($solutionManager.SolutionDirectory)
+    
+    return $fileSystem
+}
+
+function Add-PostBuildEvent ($project, $installPath) {
+    $currentPostBuildCmd = $project.Properties.Item("PostBuildEvent").Value
+    $sqlCEPostBuildCmd = Get-PostBuildCommand $installPath
+    # Append our post build command if it's not already there
+    if (!$currentPostBuildCmd.Contains($sqlCEPostBuildCmd)) {
+        $project.Properties.Item("PostBuildEvent").Value += $SqlCEPostBuildCmd
+    }
+}
+
+function Add-FilesToDirectory ($srcDirectory, $destDirectory) {
+    ls $srcDirectory -Recurse -Filter *.dll  | %{
+        $srcPath = $_.FullName
+
+        $relativePath = $srcPath.Substring($srcDirectory.Length + 1)
+        $destPath = Join-Path $destDirectory $relativePath
+        
+        $fileSystem = Get-VsFileSystem
+        if (!(Test-Path $destPath)) {
+            $fileStream = $null
+            try {
+                $fileStream = [System.IO.File]::OpenRead($_.FullName)
+                $fileSystem.AddFile($destPath, $fileStream)
+            } catch {
+                # We don't want an exception to surface if we can't add the file for some reason
+            } finally {
+                if ($fileStream -ne $null) {
+                    $fileStream.Dispose()
+                }
+            }
+        }
+    }
+}
+
+function Remove-FilesFromDirectory ($srcDirectory, $destDirectory) {
+    $fileSystem = Get-VsFileSystem
+    
+    ls $srcDirectory -Recurse -Filter *.dll | %{
+        $relativePath = $_.FullName.Substring($srcDirectory.Length + 1)
+        $fileInBin = Join-Path $destDirectory $relativePath
+        if ($fileSystem.FileExists($fileInBin) -and ((Get-Item $fileInBin).Length -eq $_.Length)) {
+            # If a corresponding file exists in bin and has the exact file size as the one inside the package, it's most likely the same file.
+            try {
+                $fileSystem.DeleteFile($fileInBin)
+            } catch {
+                # We don't want an exception to surface if we can't delete the file
+            }
+        }
+    }
+}
+
+function Remove-PostBuildEvent ($project, $installPath) {
+    $sqlCEPostBuildCmd = Get-PostBuildCommand $installPath
+    
+    try {
+        # Get the current Post Build Event cmd
+        $currentPostBuildCmd = $project.Properties.Item("PostBuildEvent").Value
+
+        # Remove our post build command from it (if it's there)
+        $project.Properties.Item("PostBuildEvent").Value = $currentPostBuildCmd.Replace($SqlCEPostBuildCmd, '')
+    } catch {
+        # Accessing $project.Properties might throw
+    }
+}
+
+function Get-PostBuildCommand ($installPath) {
+    Write-Host $dte.Solution.FullName $installPath
+    $solutionDir = [IO.Path]::GetDirectoryName($dte.Solution.FullName) + "\"
+    $path = $installPath.Replace($solutionDir, "`$(SolutionDir)")
+
+    $NativeAssembliesDir = Join-Path $path "NativeBinaries"
+    $x86 = $(Join-Path $NativeAssembliesDir "x86\*.*")
+    $x64 = $(Join-Path $NativeAssembliesDir "amd64\*.*")
+
+    return "
+    if not exist `"`$(TargetDir)x86`" md `"`$(TargetDir)x86`"
+    xcopy /s /y `"$x86`" `"`$(TargetDir)x86`"
+    if not exist `"`$(TargetDir)amd64`" md `"`$(TargetDir)amd64`"
+    xcopy /s /y `"$x64`" `"`$(TargetDir)amd64`""
+}
+
+function Get-ProjectRoot($project) {
+    try {
+        $project.Properties.Item("FullPath").Value
+    } catch {
+
+    }
+}
+
+function Get-ChildProjectItem($parent, $name) {
+	try {
+		return $parent.ProjectItems.Item($name);
+	} catch {
+	
+	}
+}
+
+function Ensure-Folder($parent, $name) {
+	$item = Get-ChildProjectItem $parent $name
+	if(!$item) {
+		$item = (Get-Interface $parent.ProjectItems "EnvDTE.ProjectItems").AddFolder($name)
+	}
+	return $item;
+}
+
+function Remove-Child($parent, $name) {
+	$item = Get-ChildProjectItem $parent $name
+	if($item) {
+		(Get-Interface $item "EnvDTE.ProjectItem").Delete()
+	}
+}
+
+function Remove-EmptyFolder($item) {
+	if($item.ProjectItems.Count -eq 0) {
+		(Get-Interface $item "EnvDTE.ProjectItem").Delete()
+	}
+}
+
+function Add-ProjectItem($item, $src, $itemtype = "None") {
+	$newitem = (Get-Interface $item.ProjectItems "EnvDTE.ProjectItems").AddFromFileCopy($src)
+	$newitem.Properties.Item("ItemType").Value = $itemtype
+}
+
+Export-ModuleMember -function Add-PostBuildEvent, Add-FilesToDirectory, Remove-PostBuildEvent, Remove-FilesFromDirectory, Get-ProjectRoot, Get-ChildProjectItem, Ensure-Folder, Remove-Child, Remove-EmptyFolder, Add-ProjectItem
+# SIG # Begin signature block
+# MIIaYAYJKoZIhvcNAQcCoIIaUTCCGk0CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
+# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
+# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU1qR1FcWhpAaK0NBKT/GqMhu8
+# rkWgghUtMIIEoDCCA4igAwIBAgIKYRnMkwABAAAAZjANBgkqhkiG9w0BAQUFADB5
+# MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk
+# bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSMwIQYDVQQDExpN
+# aWNyb3NvZnQgQ29kZSBTaWduaW5nIFBDQTAeFw0xMTEwMTAyMDMyMjVaFw0xMzAx
+# MTAyMDMyMjVaMIGDMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ
+# MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
+# MQ0wCwYDVQQLEwRNT1BSMR4wHAYDVQQDExVNaWNyb3NvZnQgQ29ycG9yYXRpb24w
+# ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDuW759ESTjhgbgZv9ItRe9
+# AuS0DDLwcj59LofXTqGxp0Mv92WeMeEyMUWu18EkhCHXLrWEfvo101Mc17ZRHk/O
+# ZrnrtwwC/SlcraiH9soitNW/CHX1inCPY9fvih7pj0MkZFrTh32QbTusds1XNn3o
+# vBBWrJjwiV0uZMavJgleHmMV8T2/Fo+ZiALDMLfBC2AfD3LM1reoNRKGm6ELCuaT
+# W476VJzB8xlfQo0Snx0/kLcnE4MZMoId89mH1CGyPKK2B0/XJKrujfWz2fr5OU+n
+# 6fKvWVL03EGbLxFwY93q3qrxbSEEEFMzu7JPxeFTskFlR2439rzpmxZBkWsuWzDD
+# AgMBAAGjggEdMIIBGTATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUG1IO
+# 8xEqt8CJwxGBPdSWWLmjU24wDgYDVR0PAQH/BAQDAgeAMB8GA1UdIwQYMBaAFMsR
+# 6MrStBZYAck3LjMWFrlMmgofMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwu
+# bWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY0NvZFNpZ1BDQV8wOC0z
+# MS0yMDEwLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93
+# d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljQ29kU2lnUENBXzA4LTMxLTIw
+# MTAuY3J0MA0GCSqGSIb3DQEBBQUAA4IBAQClWzZsrU6baRLjb4oCm2l3w2xkciiI
+# 2T1FbSwYe9QoLxPiWWobwgs0t4r96rmU7Acx5mr0dQTTp9peOgaeEP2pDb2cUUNv
+# /2eUnOHPfPAksDXMg13u2sBvNknAWgpX9nPhnvPjCEw7Pi/M0s3uTyJw9wQfAqZL
+# m7iPXIgONpRsMwe4qa1RoNDC3I4iEr3D34LXVqH33fClIFcQEJ3urIZ0bHGbwfDy
+# wnBep9ttTTdYmU15QNA0XVolrmfrG05GBrCMKR+jEI+lM58j1fi1Rn3g7mOYkEs+
+# BagvsBizWaSvQVOOCAUQLSrJOgZMHC6pMVFWZKyazKyXmCmKl5CH6p22MIIEujCC
+# A6KgAwIBAgIKYQUTNgAAAAAAGjANBgkqhkiG9w0BAQUFADB3MQswCQYDVQQGEwJV
+# UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE
+# ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEwHwYDVQQDExhNaWNyb3NvZnQgVGlt
+# ZS1TdGFtcCBQQ0EwHhcNMTEwNzI1MjA0MjE3WhcNMTIxMDI1MjA0MjE3WjCBszEL
+# MAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1v
+# bmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjENMAsGA1UECxMETU9Q
+# UjEnMCUGA1UECxMebkNpcGhlciBEU0UgRVNOOjE1OUMtQTNGNy0yNTcwMSUwIwYD
+# VQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNlMIIBIjANBgkqhkiG9w0B
+# AQEFAAOCAQ8AMIIBCgKCAQEAnDSYGckJKWOZAhZ1qIhXfaG7qUES/GSRpdYFeL93
+# 3OzmrrhQTsDjGr3tt/34IIpxOapyknKfignlE++RQe1hJWtRre6oQ7VhQiyd8h2x
+# 0vy39Xujc3YTsyuj25RhgFWhD23d2OwW/4V/lp6IfwAujnokumidj8bK9JB5euGb
+# 7wZdfvguw2oVnDwUL+fVlMgiG1HLqVWGIbda80ESOZ/wValOqiUrY/uRcjwPfMCW
+# ctzBo8EIyt7FybXACl+lnAuqcgpdCkB9LpjQq7KIj4aA6H3RvlVr4FgsyDY/+eYR
+# w/BDBYV4AxflLKcpfNPilRcAbNvcrTwZOgLgfWLUzvYdPQIDAQABo4IBCTCCAQUw
+# HQYDVR0OBBYEFPaDiyCHEe6Dy9vehaLSaIY3YXSQMB8GA1UdIwQYMBaAFCM0+NlS
+# RnAK7UD7dvuzK7DDNbMPMFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly9jcmwubWlj
+# cm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY3Jvc29mdFRpbWVTdGFtcFBD
+# QS5jcmwwWAYIKwYBBQUHAQEETDBKMEgGCCsGAQUFBzAChjxodHRwOi8vd3d3Lm1p
+# Y3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY3Jvc29mdFRpbWVTdGFtcFBDQS5jcnQw
+# EwYDVR0lBAwwCgYIKwYBBQUHAwgwDQYJKoZIhvcNAQEFBQADggEBAGL0BQ1P5xtr
+# gudSDN95jKhVgTOX06TKyf6vSNt72m96KE/H0LeJ2NGmmcyRVgA7OOi3Mi/u+c9r
+# 2Zje1gL1QlhSa47aQNwWoLPUvyYVy0hCzNP9tPrkRIlmD0IOXvcEnyNIW7SJQcTa
+# bPg29D/CHhXfmEwAxLLs3l8BAUOcuELWIsiTmp7JpRhn/EeEHpFdm/J297GOch2A
+# djw2EUbKfjpI86/jSfYXM427AGOCnFejVqfDbpCjPpW3/GTRXRjCCwFQY6f889GA
+# noTjMjTdV5VAo21+2usuWgi0EAZeMskJ6TKCcRan+savZpiJ+dmetV8QI6N3gPJN
+# 1igAclCFvOUwggW8MIIDpKADAgECAgphMyYaAAAAAAAxMA0GCSqGSIb3DQEBBQUA
+# MF8xEzARBgoJkiaJk/IsZAEZFgNjb20xGTAXBgoJkiaJk/IsZAEZFgltaWNyb3Nv
+# ZnQxLTArBgNVBAMTJE1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
+# eTAeFw0xMDA4MzEyMjE5MzJaFw0yMDA4MzEyMjI5MzJaMHkxCzAJBgNVBAYTAlVT
+# MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK
+# ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBDb2Rl
+# IFNpZ25pbmcgUENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsnJZ
+# XBkwZL8dmmAgIEKZdlNsPhvWb8zL8epr/pcWEODfOnSDGrcvoDLs/97CQk4j1XIA
+# 2zVXConKriBJ9PBorE1LjaW9eUtxm0cH2v0l3511iM+qc0R/14Hb873yNqTJXEXc
+# r6094CholxqnpXJzVvEXlOT9NZRyoNZ2Xx53RYOFOBbQc1sFumdSjaWyaS/aGQv+
+# knQp4nYvVN0UMFn40o1i/cvJX0YxULknE+RAMM9yKRAoIsc3Tj2gMj2QzaE4BoVc
+# TlaCKCoFMrdL109j59ItYvFFPeesCAD2RqGe0VuMJlPoeqpK8kbPNzw4nrR3XKUX
+# no3LEY9WPMGsCV8D0wIDAQABo4IBXjCCAVowDwYDVR0TAQH/BAUwAwEB/zAdBgNV
+# HQ4EFgQUyxHoytK0FlgByTcuMxYWuUyaCh8wCwYDVR0PBAQDAgGGMBIGCSsGAQQB
+# gjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUCBBYEFP3RMU7TJoqV4ZhgO6gxb6Y8vNgt
+# MBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMB8GA1UdIwQYMBaAFA6sgmBAVieX
+# 5SUT/CrhClOVWeSkMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwubWljcm9z
+# b2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL21pY3Jvc29mdHJvb3RjZXJ0LmNybDBU
+# BggrBgEFBQcBAQRIMEYwRAYIKwYBBQUHMAKGOGh0dHA6Ly93d3cubWljcm9zb2Z0
+# LmNvbS9wa2kvY2VydHMvTWljcm9zb2Z0Um9vdENlcnQuY3J0MA0GCSqGSIb3DQEB
+# BQUAA4ICAQBZOT5/Jkav629AsTK1ausOL26oSffrX3XtTDst10OtC/7L6S0xoyPM
+# fFCYgCFdrD0vTLqiqFac43C7uLT4ebVJcvc+6kF/yuEMF2nLpZwgLfoLUMRWzS3j
+# StK8cOeoDaIDpVbguIpLV/KVQpzx8+/u44YfNDy4VprwUyOFKqSCHJPilAcd8uJO
+# +IyhyugTpZFOyBvSj3KVKnFtmxr4HPBT1mfMIv9cHc2ijL0nsnljVkSiUc356aNY
+# Vt2bAkVEL1/02q7UgjJu/KSVE+Traeepoiy+yCsQDmWOmdv1ovoSJgllOJTxeh9K
+# u9HhVujQeJYYXMk1Fl/dkx1Jji2+rTREHO4QFRoAXd01WyHOmMcJ7oUOjE9tDhNO
+# PXwpSJxy0fNsysHscKNXkld9lI2gG0gDWvfPo2cKdKU27S0vF8jmcjcS9G+xPGeC
+# +VKyjTMWZR4Oit0Q3mT0b85G1NMX6XnEBLTT+yzfH4qerAr7EydAreT54al/RrsH
+# YEdlYEBOsELsTu2zdnnYCjQJbRyAMR/iDlTd5aH75UcQrWSY/1AWLny/BSF64pVB
+# J2nDk4+VyY3YmyGuDVyc8KKuhmiDDGotu3ZrAB2WrfIWe/YWgyS5iM9qqEcxL5rc
+# 43E91wB+YkfRzojJuBj6DnKNwaM9rwJAav9pm5biEKgQtDdQCNbDPTCCBgcwggPv
+# oAMCAQICCmEWaDQAAAAAABwwDQYJKoZIhvcNAQEFBQAwXzETMBEGCgmSJomT8ixk
+# ARkWA2NvbTEZMBcGCgmSJomT8ixkARkWCW1pY3Jvc29mdDEtMCsGA1UEAxMkTWlj
+# cm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTA3MDQwMzEyNTMw
+# OVoXDTIxMDQwMzEzMDMwOVowdzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
+# bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
+# b3JhdGlvbjEhMB8GA1UEAxMYTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBMIIBIjAN
+# BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn6Fssd/bSJIqfGsuGeG94uPFmVEj
+# UK3O3RhOJA/u0afRTK10MCAR6wfVVJUVSZQbQpKumFwwJtoAa+h7veyJBw/3DgSY
+# 8InMH8szJIed8vRnHCz8e+eIHernTqOhwSNTyo36Rc8J0F6v0LBCBKL5pmyTZ9co
+# 3EZTsIbQ5ShGLieshk9VUgzkAyz7apCQMG6H81kwnfp+1pez6CGXfvjSE/MIt1Nt
+# UrRFkJ9IAEpHZhEnKWaol+TTBoFKovmEpxFHFAmCn4TtVXj+AZodUAiFABAwRu23
+# 3iNGu8QtVJ+vHnhBMXfMm987g5OhYQK1HQ2x/PebsgHOIktU//kFw8IgCwIDAQAB
+# o4IBqzCCAacwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUIzT42VJGcArtQPt2
+# +7MrsMM1sw8wCwYDVR0PBAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMIGYBgNVHSME
+# gZAwgY2AFA6sgmBAVieX5SUT/CrhClOVWeSkoWOkYTBfMRMwEQYKCZImiZPyLGQB
+# GRYDY29tMRkwFwYKCZImiZPyLGQBGRYJbWljcm9zb2Z0MS0wKwYDVQQDEyRNaWNy
+# b3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCEHmtFqFKoKWtTHNY9AcT
+# LmUwUAYDVR0fBEkwRzBFoEOgQYY/aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3Br
+# aS9jcmwvcHJvZHVjdHMvbWljcm9zb2Z0cm9vdGNlcnQuY3JsMFQGCCsGAQUFBwEB
+# BEgwRjBEBggrBgEFBQcwAoY4aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9j
+# ZXJ0cy9NaWNyb3NvZnRSb290Q2VydC5jcnQwEwYDVR0lBAwwCgYIKwYBBQUHAwgw
+# DQYJKoZIhvcNAQEFBQADggIBABCXisNcA0Q23em0rXfbznlRTQGxLnRxW20ME6vO
+# vnuPuC7UEqKMbWK4VwLLTiATUJndekDiV7uvWJoc4R0Bhqy7ePKL0Ow7Ae7ivo8K
+# BciNSOLwUxXdT6uS5OeNatWAweaU8gYvhQPpkSokInD79vzkeJkuDfcH4nC8GE6d
+# jmsKcpW4oTmcZy3FUQ7qYlw/FpiLID/iBxoy+cwxSnYxPStyC8jqcD3/hQoT38IK
+# YY7w17gX606Lf8U1K16jv+u8fQtCe9RTciHuMMq7eGVcWwEXChQO0toUmPU8uWZY
+# sy0v5/mFhsxRVuidcJRsrDlM1PZ5v6oYemIp76KbKTQGdxpiyT0ebR+C8AvHLLvP
+# Q7Pl+ex9teOkqHQ1uE7FcSMSJnYLPFKMcVpGQxS8s7OwTWfIn0L/gHkhgJ4VMGbo
+# QhJeGsieIiHQQ+kr6bv0SMws1NgygEwmKkgkX1rqVu+m3pmdyjpvvYEndAYR7nYh
+# v5uCwSdUtrFqPYmhdmG0bqETpr+qR/ASb/2KMmyy/t9RyIwjyWa9nR2HEmQCPS2v
+# WY+45CHltbDKY7R4VAXUQS5QrJSwpXirs6CWdRrZkocTdSIvMqgIbqBbjCW/oO+E
+# yiHW6x5PyZruSeD3AWVviQt9yGnI5m7qp5fOMSn/DsVbXNhNG6HY+i+ePy5VFmvJ
+# E6P9MYIEnTCCBJkCAQEwgYcweTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
+# bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
+# b3JhdGlvbjEjMCEGA1UEAxMaTWljcm9zb2Z0IENvZGUgU2lnbmluZyBQQ0ECCmEZ
+# zJMAAQAAAGYwCQYFKw4DAhoFAKCByjAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIB
+# BDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQU
+# 3wFC+NxHvXnIrl0/2K+O4SXKXKQwagYKKwYBBAGCNwIBDDFcMFqgOIA2AE0AaQBj
+# AHIAbwBzAG8AZgB0ACAAQQBTAFAALgBOAEUAVAAgAFcAZQBiACAAUABhAGcAZQBz
+# oR6AHGh0dHA6Ly93d3cuYXNwLm5ldC93ZWJtYXRyaXgwDQYJKoZIhvcNAQEBBQAE
+# ggEAz8PRGRssNn9wrGQuIlxPVC5+NIxBSDJTVuT8z+ZUh166s7D8qU0DEuByCw7S
+# Z+TKZYAM8mnCG1RGPGo4WPD4R3PWBFTObdPpwP25pkqhLxBy6zTVU8q+iPSo/xNg
+# KFMdY41yPnwSff3k+Os7Vl1GZVOcrORrw+iVpIB4b14PY5+e4esGFd8yoHf+bJ9T
+# iG+Z4/6llYMLNClpA26HDpA0XJqPKZrZSmAgiRRdkSLIGRKg8UqD2Fi2QpOvYM+C
+# pQCUoC5X2wOjIDnq5Q/Mf9P+tPFawDAbLlALL9xssamedRugt5Em34Py3bJeYXuW
+# JqZX+rL+NoRBJEMXo7ppnJA5YKGCAh0wggIZBgkqhkiG9w0BCQYxggIKMIICBgIB
+# ATCBhTB3MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE
+# BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEwHwYD
+# VQQDExhNaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0ECCmEFEzYAAAAAABowBwYFKw4D
+# AhqgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0x
+# MjA1MDIyMzMzMjFaMCMGCSqGSIb3DQEJBDEWBBT/f8GnHFPOgw+3JqpQkl902xGy
+# gzANBgkqhkiG9w0BAQUFAASCAQBTzF+Oxk9EWWKUtrw/zfFhpB7N5E84ugrd1+Pi
+# nP8Hn8TkmwHMBIZIys9ckO2fYkcY/CkMrSGoC4WpyplVm5siPH28c2Ty8OyI4VM7
+# OTxxAGs0ll9jpAPfL/y/P+N+DgGxU3rcUAL20XA+XPz8uY2lm0LW0sqxDn8B00oA
+# 8/6YAsIVx2QwCECDGnNw5E33gTvbHKZQSge2g7gN97PvO5gCq0cGbKn4YJYkinJj
+# T3daIhuAW7ik2IRlHwaKd6P+B8Frq8wqT61OiUx4DWBQ0W964c6J5CKcBEbR5H/+
+# UPSB6RPSVSmZa4M4+qK4ot/uasmsmsMFuzqSqUlhZtzfCosg
+# SIG # End signature block
Binary file packages/MySql.Data.6.8.3/MySql.Data.6.8.3.nupkg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/MySql.Data.6.8.3/MySql.Data.6.8.3.nuspec	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
+  <metadata>
+    <id>MySql.Data</id>
+    <version>6.8.3</version>
+    <authors>Oracle Corporation</authors>
+    <owners>Oracle Corporation</owners>
+    <licenseUrl>http://www.gnu.org/licenses/old-licenses/gpl-2.0.html</licenseUrl>
+    <projectUrl>http://www.mysql.com/downloads/connector/net/</projectUrl>
+    <iconUrl>http://www.mysql.com/common/logos/logo-mysql-110x57.png</iconUrl>
+    <requireLicenseAcceptance>false</requireLicenseAcceptance>
+    <description>Connector/Net is a fully-managed ADO.NET driver for MySQL.</description>
+    <tags>MySQL</tags>
+  </metadata>
+</package>
\ No newline at end of file
Binary file packages/MySql.Data.6.8.3/lib/net20-cf/MySql.Data.cf.dll has changed
Binary file packages/MySql.Data.6.8.3/lib/net20/MySql.Data.dll has changed
Binary file packages/MySql.Data.6.8.3/lib/net40/MySql.Data.dll has changed
Binary file packages/MySql.Data.6.8.3/lib/net45/MySql.Data.dll has changed
Binary file packages/MySql.Data.6.8.3/lib/netcore45/MySql.Data.RT.dll has changed
Binary file packages/NUnit.2.6.3/NUnit.2.6.3.nupkg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/NUnit.2.6.3/NUnit.2.6.3.nuspec	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
+  <metadata>
+    <id>NUnit</id>
+    <version>2.6.3</version>
+    <title>NUnit</title>
+    <authors>Charlie Poole</authors>
+    <owners>Charlie Poole</owners>
+    <licenseUrl>http://nunit.org/nuget/license.html</licenseUrl>
+    <projectUrl>http://nunit.org/</projectUrl>
+    <iconUrl>http://nunit.org/nuget/nunit_32x32.png</iconUrl>
+    <requireLicenseAcceptance>false</requireLicenseAcceptance>
+    <description>NUnit features a fluent assert syntax, parameterized, generic and theory tests and is user-extensible. A number of runners, both from the NUnit project and by third parties, are able to execute NUnit tests.
+
+Version 2.6 is the seventh major release of this well-known and well-tested programming tool.
+
+This package includes only the framework assembly. You will need to install the NUnit.Runners package unless you are using a third-party runner.</description>
+    <summary>NUnit is a unit-testing framework for all .Net languages with a strong TDD focus.</summary>
+    <releaseNotes>Version 2.6 is the seventh major release of NUnit.
+
+Unlike earlier versions, this package includes only the framework assembly. You will need to install the NUnit.Runners package unless you are using a third-party runner.
+
+The nunit.mocks assembly is now provided by the NUnit.Mocks package. The pnunit.framework assembly is provided by the pNUnit package.</releaseNotes>
+    <language>en-US</language>
+    <tags>nunit test testing tdd framework fluent assert theory plugin addin</tags>
+  </metadata>
+</package>
\ No newline at end of file
Binary file packages/NUnit.2.6.3/lib/nunit.framework.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/NUnit.2.6.3/lib/nunit.framework.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,10960 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>nunit.framework</name>
+    </assembly>
+    <members>
+        <member name="T:NUnit.Framework.ActionTargets">
+            <summary>
+            The different targets a test action attribute can be applied to
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.ActionTargets.Default">
+            <summary>
+            Default target, which is determined by where the action attribute is attached
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.ActionTargets.Test">
+            <summary>
+            Target a individual test case
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.ActionTargets.Suite">
+            <summary>
+            Target a suite of test cases
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TestDelegate">
+            <summary>
+            Delegate used by tests that execute code and
+            capture any thrown exception.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Assert">
+            <summary>
+            The Assert class contains a collection of static methods that
+            implement the most common assertions used in NUnit.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Assert.#ctor">
+            <summary>
+            We don't actually want any instances of this object, but some people
+            like to inherit from it to add other static methods. Hence, the
+            protected constructor disallows any instances of this object. 
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Equals(System.Object,System.Object)">
+            <summary>
+            The Equals method throws an AssertionException. This is done 
+            to make sure there is no mistake by calling this function.
+            </summary>
+            <param name="a"></param>
+            <param name="b"></param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.ReferenceEquals(System.Object,System.Object)">
+            <summary>
+            override the default ReferenceEquals to throw an AssertionException. This 
+            implementation makes sure there is no mistake in calling this function 
+            as part of Assert. 
+            </summary>
+            <param name="a"></param>
+            <param name="b"></param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Pass(System.String,System.Object[])">
+            <summary>
+            Throws a <see cref="T:NUnit.Framework.SuccessException"/> with the message and arguments 
+            that are passed in. This allows a test to be cut short, with a result
+            of success returned to NUnit.
+            </summary>
+            <param name="message">The message to initialize the <see cref="T:NUnit.Framework.AssertionException"/> with.</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Pass(System.String)">
+            <summary>
+            Throws a <see cref="T:NUnit.Framework.SuccessException"/> with the message and arguments 
+            that are passed in. This allows a test to be cut short, with a result
+            of success returned to NUnit.
+            </summary>
+            <param name="message">The message to initialize the <see cref="T:NUnit.Framework.AssertionException"/> with.</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Pass">
+            <summary>
+            Throws a <see cref="T:NUnit.Framework.SuccessException"/> with the message and arguments 
+            that are passed in. This allows a test to be cut short, with a result
+            of success returned to NUnit.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Fail(System.String,System.Object[])">
+            <summary>
+            Throws an <see cref="T:NUnit.Framework.AssertionException"/> with the message and arguments 
+            that are passed in. This is used by the other Assert functions. 
+            </summary>
+            <param name="message">The message to initialize the <see cref="T:NUnit.Framework.AssertionException"/> with.</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Fail(System.String)">
+            <summary>
+            Throws an <see cref="T:NUnit.Framework.AssertionException"/> with the message that is 
+            passed in. This is used by the other Assert functions. 
+            </summary>
+            <param name="message">The message to initialize the <see cref="T:NUnit.Framework.AssertionException"/> with.</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Fail">
+            <summary>
+            Throws an <see cref="T:NUnit.Framework.AssertionException"/>. 
+            This is used by the other Assert functions. 
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Ignore(System.String,System.Object[])">
+            <summary>
+            Throws an <see cref="T:NUnit.Framework.IgnoreException"/> with the message and arguments 
+            that are passed in.  This causes the test to be reported as ignored.
+            </summary>
+            <param name="message">The message to initialize the <see cref="T:NUnit.Framework.AssertionException"/> with.</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Ignore(System.String)">
+            <summary>
+            Throws an <see cref="T:NUnit.Framework.IgnoreException"/> with the message that is 
+            passed in. This causes the test to be reported as ignored. 
+            </summary>
+            <param name="message">The message to initialize the <see cref="T:NUnit.Framework.AssertionException"/> with.</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Ignore">
+            <summary>
+            Throws an <see cref="T:NUnit.Framework.IgnoreException"/>. 
+            This causes the test to be reported as ignored. 
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Inconclusive(System.String,System.Object[])">
+            <summary>
+            Throws an <see cref="T:NUnit.Framework.InconclusiveException"/> with the message and arguments 
+            that are passed in.  This causes the test to be reported as inconclusive.
+            </summary>
+            <param name="message">The message to initialize the <see cref="T:NUnit.Framework.InconclusiveException"/> with.</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Inconclusive(System.String)">
+            <summary>
+            Throws an <see cref="T:NUnit.Framework.InconclusiveException"/> with the message that is 
+            passed in. This causes the test to be reported as inconclusive. 
+            </summary>
+            <param name="message">The message to initialize the <see cref="T:NUnit.Framework.InconclusiveException"/> with.</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Inconclusive">
+            <summary>
+            Throws an <see cref="T:NUnit.Framework.InconclusiveException"/>. 
+            This causes the test to be reported as Inconclusive. 
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Assert.That(System.Object,NUnit.Framework.Constraints.IResolveConstraint)">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an assertion exception on failure.
+            </summary>
+            <param name="actual">The actual value to test</param>
+            <param name="expression">A Constraint to be applied</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.That(System.Object,NUnit.Framework.Constraints.IResolveConstraint,System.String)">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an assertion exception on failure.
+            </summary>
+            <param name="actual">The actual value to test</param>
+            <param name="expression">A Constraint to be applied</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.That(System.Object,NUnit.Framework.Constraints.IResolveConstraint,System.String,System.Object[])">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an assertion exception on failure.
+            </summary>
+            <param name="actual">The actual value to test</param>
+            <param name="expression">A Constraint expression to be applied</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.That(System.Boolean,System.String,System.Object[])">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary> 
+            <param name="condition">The evaluated condition</param>
+            <param name="message">The message to display if the condition is false</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.That(System.Boolean,System.String)">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary>
+            <param name="condition">The evaluated condition</param>
+            <param name="message">The message to display if the condition is false</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.That(System.Boolean)">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary>
+            <param name="condition">The evaluated condition</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.That``1(NUnit.Framework.Constraints.ActualValueDelegate{``0},NUnit.Framework.Constraints.IResolveConstraint)">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an assertion exception on failure.
+            </summary>
+            <param name="del">An ActualValueDelegate returning the value to be tested</param>
+            <param name="expr">A Constraint expression to be applied</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.That``1(NUnit.Framework.Constraints.ActualValueDelegate{``0},NUnit.Framework.Constraints.IResolveConstraint,System.String)">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an assertion exception on failure.
+            </summary>
+            <param name="del">An ActualValueDelegate returning the value to be tested</param>
+            <param name="expr">A Constraint expression to be applied</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.That``1(NUnit.Framework.Constraints.ActualValueDelegate{``0},NUnit.Framework.Constraints.IResolveConstraint,System.String,System.Object[])">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an assertion exception on failure.
+            </summary>
+            <param name="del">An ActualValueDelegate returning the value to be tested</param>
+            <param name="expr">A Constraint expression to be applied</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.That``1(``0@,NUnit.Framework.Constraints.IResolveConstraint)">
+            <summary>
+            Apply a constraint to a referenced value, succeeding if the constraint
+            is satisfied and throwing an assertion exception on failure.
+            </summary>
+            <param name="actual">The actual value to test</param>
+            <param name="expression">A Constraint to be applied</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.That``1(``0@,NUnit.Framework.Constraints.IResolveConstraint,System.String)">
+            <summary>
+            Apply a constraint to a referenced value, succeeding if the constraint
+            is satisfied and throwing an assertion exception on failure.
+            </summary>
+            <param name="actual">The actual value to test</param>
+            <param name="expression">A Constraint to be applied</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.That``1(``0@,NUnit.Framework.Constraints.IResolveConstraint,System.String,System.Object[])">
+            <summary>
+            Apply a constraint to a referenced value, succeeding if the constraint
+            is satisfied and throwing an assertion exception on failure.
+            </summary>
+            <param name="actual">The actual value to test</param>
+            <param name="expression">A Constraint to be applied</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.That(NUnit.Framework.TestDelegate,NUnit.Framework.Constraints.IResolveConstraint)">
+            <summary>
+            Asserts that the code represented by a delegate throws an exception
+            that satisfies the constraint provided.
+            </summary>
+            <param name="code">A TestDelegate to be executed</param>
+            <param name="constraint">A ThrowsConstraint used in the test</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.ByVal(System.Object,NUnit.Framework.Constraints.IResolveConstraint)">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an assertion exception on failure.
+            Used as a synonym for That in rare cases where a private setter 
+            causes a Visual Basic compilation error.
+            </summary>
+            <param name="actual">The actual value to test</param>
+            <param name="expression">A Constraint to be applied</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.ByVal(System.Object,NUnit.Framework.Constraints.IResolveConstraint,System.String)">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an assertion exception on failure.
+            Used as a synonym for That in rare cases where a private setter 
+            causes a Visual Basic compilation error.
+            </summary>
+            <param name="actual">The actual value to test</param>
+            <param name="expression">A Constraint to be applied</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.ByVal(System.Object,NUnit.Framework.Constraints.IResolveConstraint,System.String,System.Object[])">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an assertion exception on failure. 
+            Used as a synonym for That in rare cases where a private setter 
+            causes a Visual Basic compilation error.
+            </summary>
+            <remarks>
+            This method is provided for use by VB developers needing to test
+            the value of properties with private setters.
+            </remarks>
+            <param name="actual">The actual value to test</param>
+            <param name="expression">A Constraint expression to be applied</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Throws(NUnit.Framework.Constraints.IResolveConstraint,NUnit.Framework.TestDelegate,System.String,System.Object[])">
+            <summary>
+            Verifies that a delegate throws a particular exception when called.
+            </summary>
+            <param name="expression">A constraint to be satisfied by the exception</param>
+            <param name="code">A TestDelegate</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Throws(NUnit.Framework.Constraints.IResolveConstraint,NUnit.Framework.TestDelegate,System.String)">
+            <summary>
+            Verifies that a delegate throws a particular exception when called.
+            </summary>
+            <param name="expression">A constraint to be satisfied by the exception</param>
+            <param name="code">A TestDelegate</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Throws(NUnit.Framework.Constraints.IResolveConstraint,NUnit.Framework.TestDelegate)">
+            <summary>
+            Verifies that a delegate throws a particular exception when called.
+            </summary>
+            <param name="expression">A constraint to be satisfied by the exception</param>
+            <param name="code">A TestDelegate</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Throws(System.Type,NUnit.Framework.TestDelegate,System.String,System.Object[])">
+            <summary>
+            Verifies that a delegate throws a particular exception when called.
+            </summary>
+            <param name="expectedExceptionType">The exception Type expected</param>
+            <param name="code">A TestDelegate</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Throws(System.Type,NUnit.Framework.TestDelegate,System.String)">
+            <summary>
+            Verifies that a delegate throws a particular exception when called.
+            </summary>
+            <param name="expectedExceptionType">The exception Type expected</param>
+            <param name="code">A TestDelegate</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Throws(System.Type,NUnit.Framework.TestDelegate)">
+            <summary>
+            Verifies that a delegate throws a particular exception when called.
+            </summary>
+            <param name="expectedExceptionType">The exception Type expected</param>
+            <param name="code">A TestDelegate</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Throws``1(NUnit.Framework.TestDelegate,System.String,System.Object[])">
+            <summary>
+            Verifies that a delegate throws a particular exception when called.
+            </summary>
+            <typeparam name="T">Type of the expected exception</typeparam>
+            <param name="code">A TestDelegate</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Throws``1(NUnit.Framework.TestDelegate,System.String)">
+            <summary>
+            Verifies that a delegate throws a particular exception when called.
+            </summary>
+            <typeparam name="T">Type of the expected exception</typeparam>
+            <param name="code">A TestDelegate</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Throws``1(NUnit.Framework.TestDelegate)">
+            <summary>
+            Verifies that a delegate throws a particular exception when called.
+            </summary>
+            <typeparam name="T">Type of the expected exception</typeparam>
+            <param name="code">A TestDelegate</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Catch(NUnit.Framework.TestDelegate,System.String,System.Object[])">
+            <summary>
+            Verifies that a delegate throws an exception when called
+            and returns it.
+            </summary>
+            <param name="code">A TestDelegate</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Catch(NUnit.Framework.TestDelegate,System.String)">
+            <summary>
+            Verifies that a delegate throws an exception when called
+            and returns it.
+            </summary>
+            <param name="code">A TestDelegate</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Catch(NUnit.Framework.TestDelegate)">
+            <summary>
+            Verifies that a delegate throws an exception when called
+            and returns it.
+            </summary>
+            <param name="code">A TestDelegate</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Catch(System.Type,NUnit.Framework.TestDelegate,System.String,System.Object[])">
+            <summary>
+            Verifies that a delegate throws an exception of a certain Type
+            or one derived from it when called and returns it.
+            </summary>
+            <param name="expectedExceptionType">The expected Exception Type</param>
+            <param name="code">A TestDelegate</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Catch(System.Type,NUnit.Framework.TestDelegate,System.String)">
+            <summary>
+            Verifies that a delegate throws an exception of a certain Type
+            or one derived from it when called and returns it.
+            </summary>
+            <param name="expectedExceptionType">The expected Exception Type</param>
+            <param name="code">A TestDelegate</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Catch(System.Type,NUnit.Framework.TestDelegate)">
+            <summary>
+            Verifies that a delegate throws an exception of a certain Type
+            or one derived from it when called and returns it.
+            </summary>
+            <param name="expectedExceptionType">The expected Exception Type</param>
+            <param name="code">A TestDelegate</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Catch``1(NUnit.Framework.TestDelegate,System.String,System.Object[])">
+            <summary>
+            Verifies that a delegate throws an exception of a certain Type
+            or one derived from it when called and returns it.
+            </summary>
+            <typeparam name="T">The expected Exception Type</typeparam>
+            <param name="code">A TestDelegate</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Catch``1(NUnit.Framework.TestDelegate,System.String)">
+            <summary>
+            Verifies that a delegate throws an exception of a certain Type
+            or one derived from it when called and returns it.
+            </summary>
+            <typeparam name="T">The expected Exception Type</typeparam>
+            <param name="code">A TestDelegate</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Catch``1(NUnit.Framework.TestDelegate)">
+            <summary>
+            Verifies that a delegate throws an exception of a certain Type
+            or one derived from it when called and returns it.
+            </summary>
+            <typeparam name="T">The expected Exception Type</typeparam>
+            <param name="code">A TestDelegate</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.DoesNotThrow(NUnit.Framework.TestDelegate,System.String,System.Object[])">
+            <summary>
+            Verifies that a delegate does not throw an exception
+            </summary>
+            <param name="code">A TestDelegate</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.DoesNotThrow(NUnit.Framework.TestDelegate,System.String)">
+            <summary>
+            Verifies that a delegate does not throw an exception.
+            </summary>
+            <param name="code">A TestDelegate</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.DoesNotThrow(NUnit.Framework.TestDelegate)">
+            <summary>
+            Verifies that a delegate does not throw an exception.
+            </summary>
+            <param name="code">A TestDelegate</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.True(System.Boolean,System.String,System.Object[])">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary>
+            <param name="condition">The evaluated condition</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.True(System.Boolean,System.String)">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary>
+            <param name="condition">The evaluated condition</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.True(System.Boolean)">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary>
+            <param name="condition">The evaluated condition</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsTrue(System.Boolean,System.String,System.Object[])">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary>
+            <param name="condition">The evaluated condition</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsTrue(System.Boolean,System.String)">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary>
+            <param name="condition">The evaluated condition</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsTrue(System.Boolean)">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary>
+            <param name="condition">The evaluated condition</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.False(System.Boolean,System.String,System.Object[])">
+            <summary>
+            Asserts that a condition is false. If the condition is true the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary> 
+            <param name="condition">The evaluated condition</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.False(System.Boolean,System.String)">
+            <summary>
+            Asserts that a condition is false. If the condition is true the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary> 
+            <param name="condition">The evaluated condition</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.False(System.Boolean)">
+            <summary>
+            Asserts that a condition is false. If the condition is true the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary> 
+            <param name="condition">The evaluated condition</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsFalse(System.Boolean,System.String,System.Object[])">
+            <summary>
+            Asserts that a condition is false. If the condition is true the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary> 
+            <param name="condition">The evaluated condition</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsFalse(System.Boolean,System.String)">
+            <summary>
+            Asserts that a condition is false. If the condition is true the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary> 
+            <param name="condition">The evaluated condition</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsFalse(System.Boolean)">
+            <summary>
+            Asserts that a condition is false. If the condition is true the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>.
+            </summary> 
+            <param name="condition">The evaluated condition</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.NotNull(System.Object,System.String,System.Object[])">
+            <summary>
+            Verifies that the object that is passed in is not equal to <code>null</code>
+            If the object is <code>null</code> then an <see cref="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="anObject">The object that is to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.NotNull(System.Object,System.String)">
+            <summary>
+            Verifies that the object that is passed in is not equal to <code>null</code>
+            If the object is <code>null</code> then an <see cref="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="anObject">The object that is to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.NotNull(System.Object)">
+            <summary>
+            Verifies that the object that is passed in is not equal to <code>null</code>
+            If the object is <code>null</code> then an <see cref="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="anObject">The object that is to be tested</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotNull(System.Object,System.String,System.Object[])">
+            <summary>
+            Verifies that the object that is passed in is not equal to <code>null</code>
+            If the object is <code>null</code> then an <see cref="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="anObject">The object that is to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotNull(System.Object,System.String)">
+            <summary>
+            Verifies that the object that is passed in is not equal to <code>null</code>
+            If the object is <code>null</code> then an <see cref="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="anObject">The object that is to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotNull(System.Object)">
+            <summary>
+            Verifies that the object that is passed in is not equal to <code>null</code>
+            If the object is <code>null</code> then an <see cref="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="anObject">The object that is to be tested</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Null(System.Object,System.String,System.Object[])">
+            <summary>
+            Verifies that the object that is passed in is equal to <code>null</code>
+            If the object is not <code>null</code> then an <see cref="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="anObject">The object that is to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Null(System.Object,System.String)">
+            <summary>
+            Verifies that the object that is passed in is equal to <code>null</code>
+            If the object is not <code>null</code> then an <see cref="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="anObject">The object that is to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Null(System.Object)">
+            <summary>
+            Verifies that the object that is passed in is equal to <code>null</code>
+            If the object is not <code>null</code> then an <see cref="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="anObject">The object that is to be tested</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNull(System.Object,System.String,System.Object[])">
+            <summary>
+            Verifies that the object that is passed in is equal to <code>null</code>
+            If the object is not <code>null</code> then an <see cref="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="anObject">The object that is to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNull(System.Object,System.String)">
+            <summary>
+            Verifies that the object that is passed in is equal to <code>null</code>
+            If the object is not <code>null</code> then an <see cref="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="anObject">The object that is to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNull(System.Object)">
+            <summary>
+            Verifies that the object that is passed in is equal to <code>null</code>
+            If the object is not <code>null</code> then an <see cref="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="anObject">The object that is to be tested</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Int32,System.Int32,System.String,System.Object[])">
+            <summary>
+            Verifies that two ints are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Int32,System.Int32,System.String)">
+            <summary>
+            Verifies that two ints are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Int32,System.Int32)">
+            <summary>
+            Verifies that two ints are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Int64,System.Int64,System.String,System.Object[])">
+            <summary>
+            Verifies that two longs are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Int64,System.Int64,System.String)">
+            <summary>
+            Verifies that two longs are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Int64,System.Int64)">
+            <summary>
+            Verifies that two longs are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.UInt32,System.UInt32,System.String,System.Object[])">
+            <summary>
+            Verifies that two unsigned ints are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.UInt32,System.UInt32,System.String)">
+            <summary>
+            Verifies that two unsigned ints are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.UInt32,System.UInt32)">
+            <summary>
+            Verifies that two unsigned ints are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.UInt64,System.UInt64,System.String,System.Object[])">
+            <summary>
+            Verifies that two unsigned longs are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.UInt64,System.UInt64,System.String)">
+            <summary>
+            Verifies that two unsigned longs are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.UInt64,System.UInt64)">
+            <summary>
+            Verifies that two unsigned longs are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Decimal,System.Decimal,System.String,System.Object[])">
+            <summary>
+            Verifies that two decimals are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Decimal,System.Decimal,System.String)">
+            <summary>
+            Verifies that two decimals are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Decimal,System.Decimal)">
+            <summary>
+            Verifies that two decimals are equal. If they are not, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Double,System.Double,System.Double,System.String,System.Object[])">
+            <summary>
+            Verifies that two doubles are equal considering a delta. If the
+            expected value is infinity then the delta value is ignored. If 
+            they are not equal then an <see cref="T:NUnit.Framework.AssertionException"/> is
+            thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="delta">The maximum acceptable difference between the
+            the expected and the actual</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Double,System.Double,System.Double,System.String)">
+            <summary>
+            Verifies that two doubles are equal considering a delta. If the
+            expected value is infinity then the delta value is ignored. If 
+            they are not equal then an <see cref="T:NUnit.Framework.AssertionException"/> is
+            thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="delta">The maximum acceptable difference between the
+            the expected and the actual</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Double,System.Double,System.Double)">
+            <summary>
+            Verifies that two doubles are equal considering a delta. If the
+            expected value is infinity then the delta value is ignored. If 
+            they are not equal then an <see cref="T:NUnit.Framework.AssertionException"/> is
+            thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="delta">The maximum acceptable difference between the
+            the expected and the actual</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Double,System.Nullable{System.Double},System.Double,System.String,System.Object[])">
+            <summary>
+            Verifies that two doubles are equal considering a delta. If the
+            expected value is infinity then the delta value is ignored. If 
+            they are not equal then an <see cref="T:NUnit.Framework.AssertionException"/> is
+            thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="delta">The maximum acceptable difference between the
+            the expected and the actual</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Double,System.Nullable{System.Double},System.Double,System.String)">
+            <summary>
+            Verifies that two doubles are equal considering a delta. If the
+            expected value is infinity then the delta value is ignored. If 
+            they are not equal then an <see cref="T:NUnit.Framework.AssertionException"/> is
+            thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="delta">The maximum acceptable difference between the
+            the expected and the actual</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Double,System.Nullable{System.Double},System.Double)">
+            <summary>
+            Verifies that two doubles are equal considering a delta. If the
+            expected value is infinity then the delta value is ignored. If 
+            they are not equal then an <see cref="T:NUnit.Framework.AssertionException"/> is
+            thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="delta">The maximum acceptable difference between the
+            the expected and the actual</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Object,System.Object,System.String,System.Object[])">
+            <summary>
+            Verifies that two objects are equal.  Two objects are considered
+            equal if both are null, or if both have the same value. NUnit
+            has special semantics for some object types.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The value that is expected</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Object,System.Object,System.String)">
+            <summary>
+            Verifies that two objects are equal.  Two objects are considered
+            equal if both are null, or if both have the same value. NUnit
+            has special semantics for some object types.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The value that is expected</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreEqual(System.Object,System.Object)">
+            <summary>
+            Verifies that two objects are equal.  Two objects are considered
+            equal if both are null, or if both have the same value. NUnit
+            has special semantics for some object types.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The value that is expected</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Int32,System.Int32,System.String,System.Object[])">
+            <summary>
+            Verifies that two ints are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Int32,System.Int32,System.String)">
+            <summary>
+            Verifies that two ints are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Int32,System.Int32)">
+            <summary>
+            Verifies that two ints are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Int64,System.Int64,System.String,System.Object[])">
+            <summary>
+            Verifies that two longs are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Int64,System.Int64,System.String)">
+            <summary>
+            Verifies that two longs are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Int64,System.Int64)">
+            <summary>
+            Verifies that two longs are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.UInt32,System.UInt32,System.String,System.Object[])">
+            <summary>
+            Verifies that two unsigned ints are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.UInt32,System.UInt32,System.String)">
+            <summary>
+            Verifies that two unsigned ints are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.UInt32,System.UInt32)">
+            <summary>
+            Verifies that two unsigned ints are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.UInt64,System.UInt64,System.String,System.Object[])">
+            <summary>
+            Verifies that two unsigned longs are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.UInt64,System.UInt64,System.String)">
+            <summary>
+            Verifies that two unsigned longs are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.UInt64,System.UInt64)">
+            <summary>
+            Verifies that two unsigned longs are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Decimal,System.Decimal,System.String,System.Object[])">
+            <summary>
+            Verifies that two decimals are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Decimal,System.Decimal,System.String)">
+            <summary>
+            Verifies that two decimals are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Decimal,System.Decimal)">
+            <summary>
+            Verifies that two decimals are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Single,System.Single,System.String,System.Object[])">
+            <summary>
+            Verifies that two floats are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Single,System.Single,System.String)">
+            <summary>
+            Verifies that two floats are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Single,System.Single)">
+            <summary>
+            Verifies that two floats are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Double,System.Double,System.String,System.Object[])">
+            <summary>
+            Verifies that two doubles are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Double,System.Double,System.String)">
+            <summary>
+            Verifies that two doubles are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Double,System.Double)">
+            <summary>
+            Verifies that two doubles are not equal. If they are equal, then an 
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Object,System.Object,System.String,System.Object[])">
+            <summary>
+            Verifies that two objects are not equal.  Two objects are considered
+            equal if both are null, or if both have the same value. NUnit
+            has special semantics for some object types.
+            If they are equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The value that is expected</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Object,System.Object,System.String)">
+            <summary>
+            Verifies that two objects are not equal.  Two objects are considered
+            equal if both are null, or if both have the same value. NUnit
+            has special semantics for some object types.
+            If they are equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The value that is expected</param>
+            <param name="actual">The actual value</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotEqual(System.Object,System.Object)">
+            <summary>
+            Verifies that two objects are not equal.  Two objects are considered
+            equal if both are null, or if both have the same value. NUnit
+            has special semantics for some object types.
+            If they are equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The value that is expected</param>
+            <param name="actual">The actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreSame(System.Object,System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that two objects refer to the same object. If they
+            are not the same an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected object</param>
+            <param name="actual">The actual object</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreSame(System.Object,System.Object,System.String)">
+            <summary>
+            Asserts that two objects refer to the same object. If they
+            are not the same an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected object</param>
+            <param name="actual">The actual object</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreSame(System.Object,System.Object)">
+            <summary>
+            Asserts that two objects refer to the same object. If they
+            are not the same an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected object</param>
+            <param name="actual">The actual object</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotSame(System.Object,System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that two objects do not refer to the same object. If they
+            are the same an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected object</param>
+            <param name="actual">The actual object</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotSame(System.Object,System.Object,System.String)">
+            <summary>
+            Asserts that two objects do not refer to the same object. If they
+            are the same an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected object</param>
+            <param name="actual">The actual object</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AreNotSame(System.Object,System.Object)">
+            <summary>
+            Asserts that two objects do not refer to the same object. If they
+            are the same an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected object</param>
+            <param name="actual">The actual object</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNaN(System.Double,System.String,System.Object[])">
+            <summary>
+            Verifies that the double that is passed in is an <code>NaN</code> value.
+            If the object is not <code>NaN</code> then an <see cref="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="aDouble">The value that is to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNaN(System.Double,System.String)">
+            <summary>
+            Verifies that the double that is passed in is an <code>NaN</code> value.
+            If the object is not <code>NaN</code> then an <see cref="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="aDouble">The value that is to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNaN(System.Double)">
+            <summary>
+            Verifies that the double that is passed in is an <code>NaN</code> value.
+            If the object is not <code>NaN</code> then an <see cref="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="aDouble">The value that is to be tested</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNaN(System.Nullable{System.Double},System.String,System.Object[])">
+            <summary>
+            Verifies that the double that is passed in is an <code>NaN</code> value.
+            If the object is not <code>NaN</code> then an <see cref="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="aDouble">The value that is to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNaN(System.Nullable{System.Double},System.String)">
+            <summary>
+            Verifies that the double that is passed in is an <code>NaN</code> value.
+            If the object is not <code>NaN</code> then an <see cref="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="aDouble">The value that is to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNaN(System.Nullable{System.Double})">
+            <summary>
+            Verifies that the double that is passed in is an <code>NaN</code> value.
+            If the object is not <code>NaN</code> then an <see cref="T:NUnit.Framework.AssertionException"/>
+            is thrown.
+            </summary>
+            <param name="aDouble">The value that is to be tested</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsEmpty(System.String,System.String,System.Object[])">
+            <summary>
+            Assert that a string is empty - that is equal to string.Empty
+            </summary>
+            <param name="aString">The string to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsEmpty(System.String,System.String)">
+            <summary>
+            Assert that a string is empty - that is equal to string.Empty
+            </summary>
+            <param name="aString">The string to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsEmpty(System.String)">
+            <summary>
+            Assert that a string is empty - that is equal to string.Empty
+            </summary>
+            <param name="aString">The string to be tested</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsEmpty(System.Collections.IEnumerable,System.String,System.Object[])">
+            <summary>
+            Assert that an array, list or other collection is empty
+            </summary>
+            <param name="collection">An array, list or other collection implementing ICollection</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsEmpty(System.Collections.IEnumerable,System.String)">
+            <summary>
+            Assert that an array, list or other collection is empty
+            </summary>
+            <param name="collection">An array, list or other collection implementing ICollection</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsEmpty(System.Collections.IEnumerable)">
+            <summary>
+            Assert that an array, list or other collection is empty
+            </summary>
+            <param name="collection">An array, list or other collection implementing ICollection</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotEmpty(System.String,System.String,System.Object[])">
+            <summary>
+            Assert that a string is not empty - that is not equal to string.Empty
+            </summary>
+            <param name="aString">The string to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotEmpty(System.String,System.String)">
+            <summary>
+            Assert that a string is not empty - that is not equal to string.Empty
+            </summary>
+            <param name="aString">The string to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotEmpty(System.String)">
+            <summary>
+            Assert that a string is not empty - that is not equal to string.Empty
+            </summary>
+            <param name="aString">The string to be tested</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotEmpty(System.Collections.IEnumerable,System.String,System.Object[])">
+            <summary>
+            Assert that an array, list or other collection is not empty
+            </summary>
+            <param name="collection">An array, list or other collection implementing ICollection</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotEmpty(System.Collections.IEnumerable,System.String)">
+            <summary>
+            Assert that an array, list or other collection is not empty
+            </summary>
+            <param name="collection">An array, list or other collection implementing ICollection</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotEmpty(System.Collections.IEnumerable)">
+            <summary>
+            Assert that an array, list or other collection is not empty
+            </summary>
+            <param name="collection">An array, list or other collection implementing ICollection</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNullOrEmpty(System.String,System.String,System.Object[])">
+            <summary>
+            Assert that a string is either null or equal to string.Empty
+            </summary>
+            <param name="aString">The string to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNullOrEmpty(System.String,System.String)">
+            <summary>
+            Assert that a string is either null or equal to string.Empty
+            </summary>
+            <param name="aString">The string to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNullOrEmpty(System.String)">
+            <summary>
+            Assert that a string is either null or equal to string.Empty
+            </summary>
+            <param name="aString">The string to be tested</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotNullOrEmpty(System.String,System.String,System.Object[])">
+            <summary>
+            Assert that a string is not null or empty
+            </summary>
+            <param name="aString">The string to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotNullOrEmpty(System.String,System.String)">
+            <summary>
+            Assert that a string is not null or empty
+            </summary>
+            <param name="aString">The string to be tested</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotNullOrEmpty(System.String)">
+            <summary>
+            Assert that a string is not null or empty
+            </summary>
+            <param name="aString">The string to be tested</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsAssignableFrom(System.Type,System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that an object may be assigned a  value of a given Type.
+            </summary>
+            <param name="expected">The expected Type.</param>
+            <param name="actual">The object under examination</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsAssignableFrom(System.Type,System.Object,System.String)">
+            <summary>
+            Asserts that an object may be assigned a  value of a given Type.
+            </summary>
+            <param name="expected">The expected Type.</param>
+            <param name="actual">The object under examination</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsAssignableFrom(System.Type,System.Object)">
+            <summary>
+            Asserts that an object may be assigned a  value of a given Type.
+            </summary>
+            <param name="expected">The expected Type.</param>
+            <param name="actual">The object under examination</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsAssignableFrom``1(System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that an object may be assigned a  value of a given Type.
+            </summary>
+            <typeparam name="T">The expected Type.</typeparam>
+            <param name="actual">The object under examination</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsAssignableFrom``1(System.Object,System.String)">
+            <summary>
+            Asserts that an object may be assigned a  value of a given Type.
+            </summary>
+            <typeparam name="T">The expected Type.</typeparam>
+            <param name="actual">The object under examination</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsAssignableFrom``1(System.Object)">
+            <summary>
+            Asserts that an object may be assigned a  value of a given Type.
+            </summary>
+            <typeparam name="T">The expected Type.</typeparam>
+            <param name="actual">The object under examination</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotAssignableFrom(System.Type,System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that an object may not be assigned a  value of a given Type.
+            </summary>
+            <param name="expected">The expected Type.</param>
+            <param name="actual">The object under examination</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotAssignableFrom(System.Type,System.Object,System.String)">
+            <summary>
+            Asserts that an object may not be assigned a  value of a given Type.
+            </summary>
+            <param name="expected">The expected Type.</param>
+            <param name="actual">The object under examination</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotAssignableFrom(System.Type,System.Object)">
+            <summary>
+            Asserts that an object may not be assigned a  value of a given Type.
+            </summary>
+            <param name="expected">The expected Type.</param>
+            <param name="actual">The object under examination</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotAssignableFrom``1(System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that an object may not be assigned a  value of a given Type.
+            </summary>
+            <typeparam name="T">The expected Type.</typeparam>
+            <param name="actual">The object under examination</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotAssignableFrom``1(System.Object,System.String)">
+            <summary>
+            Asserts that an object may not be assigned a  value of a given Type.
+            </summary>
+            <typeparam name="T">The expected Type.</typeparam>
+            <param name="actual">The object under examination</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotAssignableFrom``1(System.Object)">
+            <summary>
+            Asserts that an object may not be assigned a  value of a given Type.
+            </summary>
+            <typeparam name="T">The expected Type.</typeparam>
+            <param name="actual">The object under examination</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsInstanceOf(System.Type,System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that an object is an instance of a given type.
+            </summary>
+            <param name="expected">The expected Type</param>
+            <param name="actual">The object being examined</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsInstanceOf(System.Type,System.Object,System.String)">
+            <summary>
+            Asserts that an object is an instance of a given type.
+            </summary>
+            <param name="expected">The expected Type</param>
+            <param name="actual">The object being examined</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsInstanceOf(System.Type,System.Object)">
+            <summary>
+            Asserts that an object is an instance of a given type.
+            </summary>
+            <param name="expected">The expected Type</param>
+            <param name="actual">The object being examined</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsInstanceOfType(System.Type,System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that an object is an instance of a given type.
+            </summary>
+            <param name="expected">The expected Type</param>
+            <param name="actual">The object being examined</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsInstanceOfType(System.Type,System.Object,System.String)">
+            <summary>
+            Asserts that an object is an instance of a given type.
+            </summary>
+            <param name="expected">The expected Type</param>
+            <param name="actual">The object being examined</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsInstanceOfType(System.Type,System.Object)">
+            <summary>
+            Asserts that an object is an instance of a given type.
+            </summary>
+            <param name="expected">The expected Type</param>
+            <param name="actual">The object being examined</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsInstanceOf``1(System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that an object is an instance of a given type.
+            </summary>
+            <typeparam name="T">The expected Type</typeparam>
+            <param name="actual">The object being examined</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsInstanceOf``1(System.Object,System.String)">
+            <summary>
+            Asserts that an object is an instance of a given type.
+            </summary>
+            <typeparam name="T">The expected Type</typeparam>
+            <param name="actual">The object being examined</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsInstanceOf``1(System.Object)">
+            <summary>
+            Asserts that an object is an instance of a given type.
+            </summary>
+            <typeparam name="T">The expected Type</typeparam>
+            <param name="actual">The object being examined</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotInstanceOf(System.Type,System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that an object is not an instance of a given type.
+            </summary>
+            <param name="expected">The expected Type</param>
+            <param name="actual">The object being examined</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotInstanceOf(System.Type,System.Object,System.String)">
+            <summary>
+            Asserts that an object is not an instance of a given type.
+            </summary>
+            <param name="expected">The expected Type</param>
+            <param name="actual">The object being examined</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotInstanceOf(System.Type,System.Object)">
+            <summary>
+            Asserts that an object is not an instance of a given type.
+            </summary>
+            <param name="expected">The expected Type</param>
+            <param name="actual">The object being examined</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotInstanceOfType(System.Type,System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that an object is not an instance of a given type.
+            </summary>
+            <param name="expected">The expected Type</param>
+            <param name="actual">The object being examined</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotInstanceOfType(System.Type,System.Object,System.String)">
+            <summary>
+            Asserts that an object is not an instance of a given type.
+            </summary>
+            <param name="expected">The expected Type</param>
+            <param name="actual">The object being examined</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotInstanceOfType(System.Type,System.Object)">
+            <summary>
+            Asserts that an object is not an instance of a given type.
+            </summary>
+            <param name="expected">The expected Type</param>
+            <param name="actual">The object being examined</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotInstanceOf``1(System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that an object is not an instance of a given type.
+            </summary>
+            <typeparam name="T">The expected Type</typeparam>
+            <param name="actual">The object being examined</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotInstanceOf``1(System.Object,System.String)">
+            <summary>
+            Asserts that an object is not an instance of a given type.
+            </summary>
+            <typeparam name="T">The expected Type</typeparam>
+            <param name="actual">The object being examined</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.IsNotInstanceOf``1(System.Object)">
+            <summary>
+            Asserts that an object is not an instance of a given type.
+            </summary>
+            <typeparam name="T">The expected Type</typeparam>
+            <param name="actual">The object being examined</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Int32,System.Int32,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Int32,System.Int32,System.String)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Int32,System.Int32)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.UInt32,System.UInt32,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.UInt32,System.UInt32,System.String)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.UInt32,System.UInt32)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Int64,System.Int64,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Int64,System.Int64,System.String)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Int64,System.Int64)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.UInt64,System.UInt64,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.UInt64,System.UInt64,System.String)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.UInt64,System.UInt64)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Decimal,System.Decimal,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Decimal,System.Decimal,System.String)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Decimal,System.Decimal)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Double,System.Double,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Double,System.Double,System.String)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Double,System.Double)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Single,System.Single,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Single,System.Single,System.String)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.Single,System.Single)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.IComparable,System.IComparable,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.IComparable,System.IComparable,System.String)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Greater(System.IComparable,System.IComparable)">
+            <summary>
+            Verifies that the first value is greater than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Int32,System.Int32,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Int32,System.Int32,System.String)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Int32,System.Int32)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.UInt32,System.UInt32,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.UInt32,System.UInt32,System.String)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.UInt32,System.UInt32)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Int64,System.Int64,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Int64,System.Int64,System.String)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Int64,System.Int64)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.UInt64,System.UInt64,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.UInt64,System.UInt64,System.String)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.UInt64,System.UInt64)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Decimal,System.Decimal,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Decimal,System.Decimal,System.String)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Decimal,System.Decimal)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Double,System.Double,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Double,System.Double,System.String)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Double,System.Double)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Single,System.Single,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Single,System.Single,System.String)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.Single,System.Single)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.IComparable,System.IComparable,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.IComparable,System.IComparable,System.String)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Less(System.IComparable,System.IComparable)">
+            <summary>
+            Verifies that the first value is less than the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Int32,System.Int32,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Int32,System.Int32,System.String)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Int32,System.Int32)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.UInt32,System.UInt32,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.UInt32,System.UInt32,System.String)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.UInt32,System.UInt32)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Int64,System.Int64,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Int64,System.Int64,System.String)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Int64,System.Int64)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.UInt64,System.UInt64,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.UInt64,System.UInt64,System.String)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.UInt64,System.UInt64)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Decimal,System.Decimal,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Decimal,System.Decimal,System.String)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Decimal,System.Decimal)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Double,System.Double,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Double,System.Double,System.String)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Double,System.Double)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Single,System.Single,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Single,System.Single,System.String)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.Single,System.Single)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.IComparable,System.IComparable,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.IComparable,System.IComparable,System.String)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.GreaterOrEqual(System.IComparable,System.IComparable)">
+            <summary>
+            Verifies that the first value is greater than or equal tothe second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be greater</param>
+            <param name="arg2">The second value, expected to be less</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Int32,System.Int32,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Int32,System.Int32,System.String)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Int32,System.Int32)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.UInt32,System.UInt32,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.UInt32,System.UInt32,System.String)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.UInt32,System.UInt32)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Int64,System.Int64,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Int64,System.Int64,System.String)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Int64,System.Int64)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.UInt64,System.UInt64,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.UInt64,System.UInt64,System.String)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.UInt64,System.UInt64)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Decimal,System.Decimal,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Decimal,System.Decimal,System.String)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Decimal,System.Decimal)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Double,System.Double,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Double,System.Double,System.String)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Double,System.Double)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Single,System.Single,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Single,System.Single,System.String)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.Single,System.Single)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.IComparable,System.IComparable,System.String,System.Object[])">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.IComparable,System.IComparable,System.String)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.LessOrEqual(System.IComparable,System.IComparable)">
+            <summary>
+            Verifies that the first value is less than or equal to the second
+            value. If it is not, then an
+            <see cref="T:NUnit.Framework.AssertionException"/> is thrown. 
+            </summary>
+            <param name="arg1">The first value, expected to be less</param>
+            <param name="arg2">The second value, expected to be greater</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Contains(System.Object,System.Collections.ICollection,System.String,System.Object[])">
+            <summary>
+            Asserts that an object is contained in a list.
+            </summary>
+            <param name="expected">The expected object</param>
+            <param name="actual">The list to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Contains(System.Object,System.Collections.ICollection,System.String)">
+            <summary>
+            Asserts that an object is contained in a list.
+            </summary>
+            <param name="expected">The expected object</param>
+            <param name="actual">The list to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.Contains(System.Object,System.Collections.ICollection)">
+            <summary>
+            Asserts that an object is contained in a list.
+            </summary>
+            <param name="expected">The expected object</param>
+            <param name="actual">The list to be examined</param>
+        </member>
+        <member name="M:NUnit.Framework.Assert.AssertDoublesAreEqual(System.Double,System.Double,System.Double,System.String,System.Object[])">
+            <summary>
+            Helper for Assert.AreEqual(double expected, double actual, ...)
+            allowing code generation to work consistently.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="delta">The maximum acceptable difference between the
+            the expected and the actual</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Array of objects to be used in formatting the message</param>
+        </member>
+        <member name="P:NUnit.Framework.Assert.Counter">
+            <summary>
+            Gets the number of assertions executed so far and 
+            resets the counter to zero.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.AssertionHelper">
+            <summary>
+            AssertionHelper is an optional base class for user tests,
+            allowing the use of shorter names for constraints and
+            asserts and avoiding conflict with the definition of 
+            <see cref="T:NUnit.Framework.Is"/>, from which it inherits much of its
+            behavior, in certain mock object frameworks.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ConstraintFactory">
+            <summary>
+            Helper class with properties and methods that supply
+            a number of constraints used in Asserts.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.Exactly(System.Int32)">
+            <summary>
+            Returns a ConstraintExpression, which will apply
+            the following constraint to all members of a collection,
+            succeeding only if a specified number of them succeed.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.Property(System.String)">
+            <summary>
+            Returns a new PropertyConstraintExpression, which will either
+            test for the existence of the named property on the object
+            being tested or apply any following constraint to that property.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.Attribute(System.Type)">
+            <summary>
+            Returns a new AttributeConstraint checking for the
+            presence of a particular attribute on an object.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.Attribute``1">
+            <summary>
+            Returns a new AttributeConstraint checking for the
+            presence of a particular attribute on an object.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.EqualTo(System.Object)">
+            <summary>
+            Returns a constraint that tests two items for equality
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.SameAs(System.Object)">
+            <summary>
+            Returns a constraint that tests that two references are the same object
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.GreaterThan(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is greater than the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.GreaterThanOrEqualTo(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is greater than or equal to the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.AtLeast(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is greater than or equal to the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.LessThan(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is less than the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.LessThanOrEqualTo(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is less than or equal to the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.AtMost(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is less than or equal to the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.TypeOf(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual
+            value is of the exact type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.TypeOf``1">
+            <summary>
+            Returns a constraint that tests whether the actual
+            value is of the exact type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.InstanceOf(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is of the type supplied as an argument or a derived type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.InstanceOf``1">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is of the type supplied as an argument or a derived type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.InstanceOfType(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is of the type supplied as an argument or a derived type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.InstanceOfType``1">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is of the type supplied as an argument or a derived type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.AssignableFrom(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is assignable from the type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.AssignableFrom``1">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is assignable from the type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.AssignableTo(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is assignable from the type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.AssignableTo``1">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is assignable from the type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.EquivalentTo(System.Collections.IEnumerable)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is a collection containing the same elements as the 
+            collection supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.SubsetOf(System.Collections.IEnumerable)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is a subset of the collection supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.Member(System.Object)">
+            <summary>
+            Returns a new CollectionContainsConstraint checking for the
+            presence of a particular object in the collection.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.Contains(System.Object)">
+            <summary>
+            Returns a new CollectionContainsConstraint checking for the
+            presence of a particular object in the collection.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.Contains(System.String)">
+            <summary>
+            Returns a new ContainsConstraint. This constraint
+            will, in turn, make use of the appropriate second-level
+            constraint, depending on the type of the actual argument. 
+            This overload is only used if the item sought is a string,
+            since any other type implies that we are looking for a 
+            collection member.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.StringContaining(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value contains the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.ContainsSubstring(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value contains the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.DoesNotContain(System.String)">
+            <summary>
+            Returns a constraint that fails if the actual
+            value contains the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.StartsWith(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value starts with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.StringStarting(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value starts with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.DoesNotStartWith(System.String)">
+            <summary>
+            Returns a constraint that fails if the actual
+            value starts with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.EndsWith(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value ends with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.StringEnding(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value ends with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.DoesNotEndWith(System.String)">
+            <summary>
+            Returns a constraint that fails if the actual
+            value ends with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.Matches(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value matches the regular expression supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.StringMatching(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value matches the regular expression supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.DoesNotMatch(System.String)">
+            <summary>
+            Returns a constraint that fails if the actual
+            value matches the pattern supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.SamePath(System.String)">
+            <summary>
+            Returns a constraint that tests whether the path provided 
+            is the same as an expected path after canonicalization.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.SubPath(System.String)">
+            <summary>
+            Returns a constraint that tests whether the path provided 
+            is the same path or under an expected path after canonicalization.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.SamePathOrUnder(System.String)">
+            <summary>
+            Returns a constraint that tests whether the path provided 
+            is the same path or under an expected path after canonicalization.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintFactory.InRange``1(``0,``0)">
+            <summary>
+            Returns a constraint that tests whether the actual value falls 
+            within a specified range.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.Not">
+            <summary>
+            Returns a ConstraintExpression that negates any
+            following constraint.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.No">
+            <summary>
+            Returns a ConstraintExpression that negates any
+            following constraint.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.All">
+            <summary>
+            Returns a ConstraintExpression, which will apply
+            the following constraint to all members of a collection,
+            succeeding if all of them succeed.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.Some">
+            <summary>
+            Returns a ConstraintExpression, which will apply
+            the following constraint to all members of a collection,
+            succeeding if at least one of them succeeds.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.None">
+            <summary>
+            Returns a ConstraintExpression, which will apply
+            the following constraint to all members of a collection,
+            succeeding if all of them fail.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.Length">
+            <summary>
+            Returns a new ConstraintExpression, which will apply the following
+            constraint to the Length property of the object being tested.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.Count">
+            <summary>
+            Returns a new ConstraintExpression, which will apply the following
+            constraint to the Count property of the object being tested.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.Message">
+            <summary>
+            Returns a new ConstraintExpression, which will apply the following
+            constraint to the Message property of the object being tested.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.InnerException">
+            <summary>
+            Returns a new ConstraintExpression, which will apply the following
+            constraint to the InnerException property of the object being tested.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.Null">
+            <summary>
+            Returns a constraint that tests for null
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.True">
+            <summary>
+            Returns a constraint that tests for True
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.False">
+            <summary>
+            Returns a constraint that tests for False
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.Positive">
+            <summary>
+            Returns a constraint that tests for a positive value
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.Negative">
+            <summary>
+            Returns a constraint that tests for a negative value
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.NaN">
+            <summary>
+            Returns a constraint that tests for NaN
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.Empty">
+            <summary>
+            Returns a constraint that tests for empty
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.Unique">
+            <summary>
+            Returns a constraint that tests whether a collection 
+            contains all unique items.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.BinarySerializable">
+            <summary>
+            Returns a constraint that tests whether an object graph is serializable in binary format.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.XmlSerializable">
+            <summary>
+            Returns a constraint that tests whether an object graph is serializable in xml format.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintFactory.Ordered">
+            <summary>
+            Returns a constraint that tests whether a collection is ordered
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Expect(System.Object,NUnit.Framework.Constraints.IResolveConstraint)">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an assertion exception on failure. Works
+            identically to Assert.That.
+            </summary>
+            <param name="actual">The actual value to test</param>
+            <param name="expression">A Constraint to be applied</param>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Expect(System.Object,NUnit.Framework.Constraints.IResolveConstraint,System.String)">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an assertion exception on failure. Works
+            identically to Assert.That.
+            </summary>
+            <param name="actual">The actual value to test</param>
+            <param name="expression">A Constraint to be applied</param>
+            <param name="message">The message to be displayed in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Expect(System.Object,NUnit.Framework.Constraints.IResolveConstraint,System.String,System.Object[])">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an assertion exception on failure. Works
+            identically to Assert.That.
+            </summary>
+            <param name="actual">The actual value to test</param>
+            <param name="expression">A Constraint to be applied</param>
+            <param name="message">The message to be displayed in case of failure</param>
+            <param name="args">Arguments to use in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Expect(System.Boolean,System.String,System.Object[])">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>. Works Identically to 
+            <see cref="M:NUnit.Framework.Assert.That(System.Boolean,System.String,System.Object[])"/>.
+            </summary> 
+            <param name="condition">The evaluated condition</param>
+            <param name="message">The message to display if the condition is false</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Expect(System.Boolean,System.String)">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>. Works Identically to
+            <see cref="M:NUnit.Framework.Assert.That(System.Boolean,System.String)"/>.
+            </summary>
+            <param name="condition">The evaluated condition</param>
+            <param name="message">The message to display if the condition is false</param>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Expect(System.Boolean)">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.AssertionException"/>. Works Identically to <see cref="M:NUnit.Framework.Assert.That(System.Boolean)"/>.
+            </summary>
+            <param name="condition">The evaluated condition</param>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Expect``1(NUnit.Framework.Constraints.ActualValueDelegate{``0},NUnit.Framework.Constraints.IResolveConstraint)">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an assertion exception on failure.
+            </summary>
+            <param name="expr">A Constraint expression to be applied</param>
+            <param name="del">An ActualValueDelegate returning the value to be tested</param>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Expect``1(NUnit.Framework.Constraints.ActualValueDelegate{``0},NUnit.Framework.Constraints.IResolveConstraint,System.String)">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an assertion exception on failure.
+            </summary>
+            <param name="expr">A Constraint expression to be applied</param>
+            <param name="del">An ActualValueDelegate returning the value to be tested</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Expect``1(NUnit.Framework.Constraints.ActualValueDelegate{``0},NUnit.Framework.Constraints.IResolveConstraint,System.String,System.Object[])">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an assertion exception on failure.
+            </summary>
+            <param name="del">An ActualValueDelegate returning the value to be tested</param>
+            <param name="expr">A Constraint expression to be applied</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Expect``1(``0@,NUnit.Framework.Constraints.IResolveConstraint)">
+            <summary>
+            Apply a constraint to a referenced value, succeeding if the constraint
+            is satisfied and throwing an assertion exception on failure.
+            </summary>
+            <param name="actual">The actual value to test</param>
+            <param name="expression">A Constraint to be applied</param>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Expect``1(``0@,NUnit.Framework.Constraints.IResolveConstraint,System.String)">
+            <summary>
+            Apply a constraint to a referenced value, succeeding if the constraint
+            is satisfied and throwing an assertion exception on failure.
+            </summary>
+            <param name="actual">The actual value to test</param>
+            <param name="expression">A Constraint to be applied</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Expect``1(``0@,NUnit.Framework.Constraints.IResolveConstraint,System.String,System.Object[])">
+            <summary>
+            Apply a constraint to a referenced value, succeeding if the constraint
+            is satisfied and throwing an assertion exception on failure.
+            </summary>
+            <param name="actual">The actual value to test</param>
+            <param name="expression">A Constraint to be applied</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Expect(NUnit.Framework.TestDelegate,NUnit.Framework.Constraints.IResolveConstraint)">
+            <summary>
+            Asserts that the code represented by a delegate throws an exception
+            that satisfies the constraint provided.
+            </summary>
+            <param name="code">A TestDelegate to be executed</param>
+            <param name="constraint">A ThrowsConstraint used in the test</param>
+        </member>
+        <member name="M:NUnit.Framework.AssertionHelper.Map(System.Collections.ICollection)">
+            <summary>
+            Returns a ListMapper based on a collection.
+            </summary>
+            <param name="original">The original collection</param>
+            <returns></returns>
+        </member>
+        <member name="T:NUnit.Framework.Assume">
+            <summary>
+            Provides static methods to express the assumptions
+            that must be met for a test to give a meaningful
+            result. If an assumption is not met, the test
+            should produce an inconclusive result.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Assume.Equals(System.Object,System.Object)">
+            <summary>
+            The Equals method throws an AssertionException. This is done 
+            to make sure there is no mistake by calling this function.
+            </summary>
+            <param name="a"></param>
+            <param name="b"></param>
+        </member>
+        <member name="M:NUnit.Framework.Assume.ReferenceEquals(System.Object,System.Object)">
+            <summary>
+            override the default ReferenceEquals to throw an AssertionException. This 
+            implementation makes sure there is no mistake in calling this function 
+            as part of Assert. 
+            </summary>
+            <param name="a"></param>
+            <param name="b"></param>
+        </member>
+        <member name="M:NUnit.Framework.Assume.That(System.Object,NUnit.Framework.Constraints.IResolveConstraint)">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an InconclusiveException on failure.
+            </summary>
+            <param name="expression">A Constraint expression to be applied</param>
+            <param name="actual">The actual value to test</param>
+        </member>
+        <member name="M:NUnit.Framework.Assume.That(System.Object,NUnit.Framework.Constraints.IResolveConstraint,System.String)">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an InconclusiveException on failure.
+            </summary>
+            <param name="expression">A Constraint expression to be applied</param>
+            <param name="actual">The actual value to test</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assume.That(System.Object,NUnit.Framework.Constraints.IResolveConstraint,System.String,System.Object[])">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an InconclusiveException on failure.
+            </summary>
+            <param name="expression">A Constraint expression to be applied</param>
+            <param name="actual">The actual value to test</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assume.That(System.Boolean,System.String,System.Object[])">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.InconclusiveException"/>.
+            </summary> 
+            <param name="condition">The evaluated condition</param>
+            <param name="message">The message to display if the condition is false</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assume.That(System.Boolean,System.String)">
+            <summary>
+            Asserts that a condition is true. If the condition is false the method throws
+            an <see cref="T:NUnit.Framework.InconclusiveException"/>.
+            </summary>
+            <param name="condition">The evaluated condition</param>
+            <param name="message">The message to display if the condition is false</param>
+        </member>
+        <member name="M:NUnit.Framework.Assume.That(System.Boolean)">
+            <summary>
+            Asserts that a condition is true. If the condition is false the 
+            method throws an <see cref="T:NUnit.Framework.InconclusiveException"/>.
+            </summary>
+            <param name="condition">The evaluated condition</param>
+        </member>
+        <member name="M:NUnit.Framework.Assume.That``1(NUnit.Framework.Constraints.ActualValueDelegate{``0},NUnit.Framework.Constraints.IResolveConstraint)">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an InconclusiveException on failure.
+            </summary>
+            <param name="expr">A Constraint expression to be applied</param>
+            <param name="del">An ActualValueDelegate returning the value to be tested</param>
+        </member>
+        <member name="M:NUnit.Framework.Assume.That``1(NUnit.Framework.Constraints.ActualValueDelegate{``0},NUnit.Framework.Constraints.IResolveConstraint,System.String)">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an InconclusiveException on failure.
+            </summary>
+            <param name="expr">A Constraint expression to be applied</param>
+            <param name="del">An ActualValueDelegate returning the value to be tested</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assume.That``1(NUnit.Framework.Constraints.ActualValueDelegate{``0},NUnit.Framework.Constraints.IResolveConstraint,System.String,System.Object[])">
+            <summary>
+            Apply a constraint to an actual value, succeeding if the constraint
+            is satisfied and throwing an InconclusiveException on failure.
+            </summary>
+            <param name="del">An ActualValueDelegate returning the value to be tested</param>
+            <param name="expr">A Constraint expression to be applied</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assume.That``1(``0@,NUnit.Framework.Constraints.IResolveConstraint)">
+            <summary>
+            Apply a constraint to a referenced value, succeeding if the constraint
+            is satisfied and throwing an InconclusiveException on failure.
+            </summary>
+            <param name="expression">A Constraint expression to be applied</param>
+            <param name="actual">The actual value to test</param>
+        </member>
+        <member name="M:NUnit.Framework.Assume.That``1(``0@,NUnit.Framework.Constraints.IResolveConstraint,System.String)">
+            <summary>
+            Apply a constraint to a referenced value, succeeding if the constraint
+            is satisfied and throwing an InconclusiveException on failure.
+            </summary>
+            <param name="expression">A Constraint expression to be applied</param>
+            <param name="actual">The actual value to test</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Assume.That``1(``0@,NUnit.Framework.Constraints.IResolveConstraint,System.String,System.Object[])">
+            <summary>
+            Apply a constraint to a referenced value, succeeding if the constraint
+            is satisfied and throwing an InconclusiveException on failure.
+            </summary>
+            <param name="expression">A Constraint expression to be applied</param>
+            <param name="actual">The actual value to test</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Assume.That(NUnit.Framework.TestDelegate,NUnit.Framework.Constraints.IResolveConstraint)">
+            <summary>
+            Asserts that the code represented by a delegate throws an exception
+            that satisfies the constraint provided.
+            </summary>
+            <param name="code">A TestDelegate to be executed</param>
+            <param name="constraint">A ThrowsConstraint used in the test</param>
+        </member>
+        <member name="M:NUnit.Framework.AsyncInvocationRegion.WaitForPendingOperationsToComplete(System.Object)">
+            <summary>
+            Waits for pending asynchronous operations to complete, if appropriate,
+            and returns a proper result of the invocation by unwrapping task results
+            </summary>
+            <param name="invocationResult">The raw result of the method invocation</param>
+            <returns>The unwrapped result, if necessary</returns>
+        </member>
+        <member name="T:NUnit.Framework.CollectionAssert">
+            <summary>
+            A set of Assert methods operationg on one or more collections
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.Equals(System.Object,System.Object)">
+            <summary>
+            The Equals method throws an AssertionException. This is done 
+            to make sure there is no mistake by calling this function.
+            </summary>
+            <param name="a"></param>
+            <param name="b"></param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.ReferenceEquals(System.Object,System.Object)">
+            <summary>
+            override the default ReferenceEquals to throw an AssertionException. This 
+            implementation makes sure there is no mistake in calling this function 
+            as part of Assert. 
+            </summary>
+            <param name="a"></param>
+            <param name="b"></param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AllItemsAreInstancesOfType(System.Collections.IEnumerable,System.Type)">
+            <summary>
+            Asserts that all items contained in collection are of the type specified by expectedType.
+            </summary>
+            <param name="collection">IEnumerable containing objects to be considered</param>
+            <param name="expectedType">System.Type that all objects in collection must be instances of</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AllItemsAreInstancesOfType(System.Collections.IEnumerable,System.Type,System.String)">
+            <summary>
+            Asserts that all items contained in collection are of the type specified by expectedType.
+            </summary>
+            <param name="collection">IEnumerable containing objects to be considered</param>
+            <param name="expectedType">System.Type that all objects in collection must be instances of</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AllItemsAreInstancesOfType(System.Collections.IEnumerable,System.Type,System.String,System.Object[])">
+            <summary>
+            Asserts that all items contained in collection are of the type specified by expectedType.
+            </summary>
+            <param name="collection">IEnumerable containing objects to be considered</param>
+            <param name="expectedType">System.Type that all objects in collection must be instances of</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AllItemsAreNotNull(System.Collections.IEnumerable)">
+            <summary>
+            Asserts that all items contained in collection are not equal to null.
+            </summary>
+            <param name="collection">IEnumerable containing objects to be considered</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AllItemsAreNotNull(System.Collections.IEnumerable,System.String)">
+            <summary>
+            Asserts that all items contained in collection are not equal to null.
+            </summary>
+            <param name="collection">IEnumerable containing objects to be considered</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AllItemsAreNotNull(System.Collections.IEnumerable,System.String,System.Object[])">
+            <summary>
+            Asserts that all items contained in collection are not equal to null.
+            </summary>
+            <param name="collection">IEnumerable of objects to be considered</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AllItemsAreUnique(System.Collections.IEnumerable)">
+            <summary>
+            Ensures that every object contained in collection exists within the collection
+            once and only once.
+            </summary>
+            <param name="collection">IEnumerable of objects to be considered</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AllItemsAreUnique(System.Collections.IEnumerable,System.String)">
+            <summary>
+            Ensures that every object contained in collection exists within the collection
+            once and only once.
+            </summary>
+            <param name="collection">IEnumerable of objects to be considered</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AllItemsAreUnique(System.Collections.IEnumerable,System.String,System.Object[])">
+            <summary>
+            Ensures that every object contained in collection exists within the collection
+            once and only once.
+            </summary>
+            <param name="collection">IEnumerable of objects to be considered</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreEqual(System.Collections.IEnumerable,System.Collections.IEnumerable)">
+            <summary>
+            Asserts that expected and actual are exactly equal.  The collections must have the same count, 
+            and contain the exact same objects in the same order.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreEqual(System.Collections.IEnumerable,System.Collections.IEnumerable,System.Collections.IComparer)">
+            <summary>
+            Asserts that expected and actual are exactly equal.  The collections must have the same count, 
+            and contain the exact same objects in the same order.
+            If comparer is not null then it will be used to compare the objects.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+            <param name="comparer">The IComparer to use in comparing objects from each IEnumerable</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreEqual(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String)">
+            <summary>
+            Asserts that expected and actual are exactly equal.  The collections must have the same count, 
+            and contain the exact same objects in the same order.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreEqual(System.Collections.IEnumerable,System.Collections.IEnumerable,System.Collections.IComparer,System.String)">
+            <summary>
+            Asserts that expected and actual are exactly equal.  The collections must have the same count, 
+            and contain the exact same objects in the same order.
+            If comparer is not null then it will be used to compare the objects.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+            <param name="comparer">The IComparer to use in comparing objects from each IEnumerable</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreEqual(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String,System.Object[])">
+            <summary>
+            Asserts that expected and actual are exactly equal.  The collections must have the same count, 
+            and contain the exact same objects in the same order.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreEqual(System.Collections.IEnumerable,System.Collections.IEnumerable,System.Collections.IComparer,System.String,System.Object[])">
+            <summary>
+            Asserts that expected and actual are exactly equal.  The collections must have the same count, 
+            and contain the exact same objects in the same order.
+            If comparer is not null then it will be used to compare the objects.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+            <param name="comparer">The IComparer to use in comparing objects from each IEnumerable</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreEquivalent(System.Collections.IEnumerable,System.Collections.IEnumerable)">
+            <summary>
+            Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreEquivalent(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String)">
+            <summary>
+            Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreEquivalent(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String,System.Object[])">
+            <summary>
+            Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreNotEqual(System.Collections.IEnumerable,System.Collections.IEnumerable)">
+            <summary>
+            Asserts that expected and actual are not exactly equal.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreNotEqual(System.Collections.IEnumerable,System.Collections.IEnumerable,System.Collections.IComparer)">
+            <summary>
+            Asserts that expected and actual are not exactly equal.
+            If comparer is not null then it will be used to compare the objects.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+            <param name="comparer">The IComparer to use in comparing objects from each IEnumerable</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreNotEqual(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String)">
+            <summary>
+            Asserts that expected and actual are not exactly equal.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreNotEqual(System.Collections.IEnumerable,System.Collections.IEnumerable,System.Collections.IComparer,System.String)">
+            <summary>
+            Asserts that expected and actual are not exactly equal.
+            If comparer is not null then it will be used to compare the objects.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+            <param name="comparer">The IComparer to use in comparing objects from each IEnumerable</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreNotEqual(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String,System.Object[])">
+            <summary>
+            Asserts that expected and actual are not exactly equal.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreNotEqual(System.Collections.IEnumerable,System.Collections.IEnumerable,System.Collections.IComparer,System.String,System.Object[])">
+            <summary>
+            Asserts that expected and actual are not exactly equal.
+            If comparer is not null then it will be used to compare the objects.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+            <param name="comparer">The IComparer to use in comparing objects from each IEnumerable</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreNotEquivalent(System.Collections.IEnumerable,System.Collections.IEnumerable)">
+            <summary>
+            Asserts that expected and actual are not equivalent.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreNotEquivalent(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String)">
+            <summary>
+            Asserts that expected and actual are not equivalent.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.AreNotEquivalent(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String,System.Object[])">
+            <summary>
+            Asserts that expected and actual are not equivalent.
+            </summary>
+            <param name="expected">The first IEnumerable of objects to be considered</param>
+            <param name="actual">The second IEnumerable of objects to be considered</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.Contains(System.Collections.IEnumerable,System.Object)">
+            <summary>
+            Asserts that collection contains actual as an item.
+            </summary>
+            <param name="collection">IEnumerable of objects to be considered</param>
+            <param name="actual">Object to be found within collection</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.Contains(System.Collections.IEnumerable,System.Object,System.String)">
+            <summary>
+            Asserts that collection contains actual as an item.
+            </summary>
+            <param name="collection">IEnumerable of objects to be considered</param>
+            <param name="actual">Object to be found within collection</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.Contains(System.Collections.IEnumerable,System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that collection contains actual as an item.
+            </summary>
+            <param name="collection">IEnumerable of objects to be considered</param>
+            <param name="actual">Object to be found within collection</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.DoesNotContain(System.Collections.IEnumerable,System.Object)">
+            <summary>
+            Asserts that collection does not contain actual as an item.
+            </summary>
+            <param name="collection">IEnumerable of objects to be considered</param>
+            <param name="actual">Object that cannot exist within collection</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.DoesNotContain(System.Collections.IEnumerable,System.Object,System.String)">
+            <summary>
+            Asserts that collection does not contain actual as an item.
+            </summary>
+            <param name="collection">IEnumerable of objects to be considered</param>
+            <param name="actual">Object that cannot exist within collection</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.DoesNotContain(System.Collections.IEnumerable,System.Object,System.String,System.Object[])">
+            <summary>
+            Asserts that collection does not contain actual as an item.
+            </summary>
+            <param name="collection">IEnumerable of objects to be considered</param>
+            <param name="actual">Object that cannot exist within collection</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsNotSubsetOf(System.Collections.IEnumerable,System.Collections.IEnumerable)">
+            <summary>
+            Asserts that superset is not a subject of subset.
+            </summary>
+            <param name="subset">The IEnumerable superset to be considered</param>
+            <param name="superset">The IEnumerable subset to be considered</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsNotSubsetOf(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String)">
+            <summary>
+            Asserts that superset is not a subject of subset.
+            </summary>
+            <param name="subset">The IEnumerable superset to be considered</param>
+            <param name="superset">The IEnumerable subset to be considered</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsNotSubsetOf(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String,System.Object[])">
+            <summary>
+            Asserts that superset is not a subject of subset.
+            </summary>
+            <param name="subset">The IEnumerable superset to be considered</param>
+            <param name="superset">The IEnumerable subset to be considered</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsSubsetOf(System.Collections.IEnumerable,System.Collections.IEnumerable)">
+            <summary>
+            Asserts that superset is a subset of subset.
+            </summary>
+            <param name="subset">The IEnumerable superset to be considered</param>
+            <param name="superset">The IEnumerable subset to be considered</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsSubsetOf(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String)">
+            <summary>
+            Asserts that superset is a subset of subset.
+            </summary>
+            <param name="subset">The IEnumerable superset to be considered</param>
+            <param name="superset">The IEnumerable subset to be considered</param>
+            <param name="message">The message that will be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsSubsetOf(System.Collections.IEnumerable,System.Collections.IEnumerable,System.String,System.Object[])">
+            <summary>
+            Asserts that superset is a subset of subset.
+            </summary>
+            <param name="subset">The IEnumerable superset to be considered</param>
+            <param name="superset">The IEnumerable subset to be considered</param>
+            <param name="message">The message that will be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsEmpty(System.Collections.IEnumerable,System.String,System.Object[])">
+            <summary>
+            Assert that an array, list or other collection is empty
+            </summary>
+            <param name="collection">An array, list or other collection implementing IEnumerable</param>
+            <param name="message">The message to be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsEmpty(System.Collections.IEnumerable,System.String)">
+            <summary>
+            Assert that an array, list or other collection is empty
+            </summary>
+            <param name="collection">An array, list or other collection implementing IEnumerable</param>
+            <param name="message">The message to be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsEmpty(System.Collections.IEnumerable)">
+            <summary>
+            Assert that an array,list or other collection is empty
+            </summary>
+            <param name="collection">An array, list or other collection implementing IEnumerable</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsNotEmpty(System.Collections.IEnumerable,System.String,System.Object[])">
+            <summary>
+            Assert that an array, list or other collection is empty
+            </summary>
+            <param name="collection">An array, list or other collection implementing IEnumerable</param>
+            <param name="message">The message to be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsNotEmpty(System.Collections.IEnumerable,System.String)">
+            <summary>
+            Assert that an array, list or other collection is empty
+            </summary>
+            <param name="collection">An array, list or other collection implementing IEnumerable</param>
+            <param name="message">The message to be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsNotEmpty(System.Collections.IEnumerable)">
+            <summary>
+            Assert that an array,list or other collection is empty
+            </summary>
+            <param name="collection">An array, list or other collection implementing IEnumerable</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsOrdered(System.Collections.IEnumerable,System.String,System.Object[])">
+            <summary>
+            Assert that an array, list or other collection is ordered
+            </summary>
+            <param name="collection">An array, list or other collection implementing IEnumerable</param>
+            <param name="message">The message to be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsOrdered(System.Collections.IEnumerable,System.String)">
+            <summary>
+            Assert that an array, list or other collection is ordered
+            </summary>
+            <param name="collection">An array, list or other collection implementing IEnumerable</param>
+            <param name="message">The message to be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsOrdered(System.Collections.IEnumerable)">
+            <summary>
+            Assert that an array, list or other collection is ordered
+            </summary>
+            <param name="collection">An array, list or other collection implementing IEnumerable</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsOrdered(System.Collections.IEnumerable,System.Collections.IComparer,System.String,System.Object[])">
+            <summary>
+            Assert that an array, list or other collection is ordered
+            </summary>
+            <param name="collection">An array, list or other collection implementing IEnumerable</param>
+            <param name="comparer">A custom comparer to perform the comparisons</param>
+            <param name="message">The message to be displayed on failure</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsOrdered(System.Collections.IEnumerable,System.Collections.IComparer,System.String)">
+            <summary>
+            Assert that an array, list or other collection is ordered
+            </summary>
+            <param name="collection">An array, list or other collection implementing IEnumerable</param>
+            <param name="comparer">A custom comparer to perform the comparisons</param>
+            <param name="message">The message to be displayed on failure</param>
+        </member>
+        <member name="M:NUnit.Framework.CollectionAssert.IsOrdered(System.Collections.IEnumerable,System.Collections.IComparer)">
+            <summary>
+            Assert that an array, list or other collection is ordered
+            </summary>
+            <param name="collection">An array, list or other collection implementing IEnumerable</param>
+            <param name="comparer">A custom comparer to perform the comparisons</param>
+        </member>
+        <member name="T:NUnit.Framework.Contains">
+            <summary>
+            Helper class with properties and methods that supply
+            a number of constraints used in Asserts.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Contains.Item(System.Object)">
+            <summary>
+            Returns a new CollectionContainsConstraint checking for the
+            presence of a particular object in the collection.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Contains.Substring(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value contains the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.DirectoryAssert">
+            <summary>
+            Summary description for DirectoryAssert
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.Equals(System.Object,System.Object)">
+            <summary>
+            The Equals method throws an AssertionException. This is done 
+            to make sure there is no mistake by calling this function.
+            </summary>
+            <param name="a"></param>
+            <param name="b"></param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.ReferenceEquals(System.Object,System.Object)">
+            <summary>
+            override the default ReferenceEquals to throw an AssertionException. This 
+            implementation makes sure there is no mistake in calling this function 
+            as part of Assert. 
+            </summary>
+            <param name="a"></param>
+            <param name="b"></param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.#ctor">
+            <summary>
+            We don't actually want any instances of this object, but some people
+            like to inherit from it to add other static methods. Hence, the
+            protected constructor disallows any instances of this object. 
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.AreEqual(System.IO.DirectoryInfo,System.IO.DirectoryInfo,System.String,System.Object[])">
+            <summary>
+            Verifies that two directories are equal.  Two directories are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A directory containing the value that is expected</param>
+            <param name="actual">A directory containing the actual value</param>
+            <param name="message">The message to display if directories are not equal</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.AreEqual(System.IO.DirectoryInfo,System.IO.DirectoryInfo,System.String)">
+            <summary>
+            Verifies that two directories are equal.  Two directories are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A directory containing the value that is expected</param>
+            <param name="actual">A directory containing the actual value</param>
+            <param name="message">The message to display if directories are not equal</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.AreEqual(System.IO.DirectoryInfo,System.IO.DirectoryInfo)">
+            <summary>
+            Verifies that two directories are equal.  Two directories are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A directory containing the value that is expected</param>
+            <param name="actual">A directory containing the actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.AreEqual(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Verifies that two directories are equal.  Two directories are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A directory path string containing the value that is expected</param>
+            <param name="actual">A directory path string containing the actual value</param>
+            <param name="message">The message to display if directories are not equal</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.AreEqual(System.String,System.String,System.String)">
+            <summary>
+            Verifies that two directories are equal.  Two directories are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A directory path string containing the value that is expected</param>
+            <param name="actual">A directory path string containing the actual value</param>
+            <param name="message">The message to display if directories are not equal</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.AreEqual(System.String,System.String)">
+            <summary>
+            Verifies that two directories are equal.  Two directories are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A directory path string containing the value that is expected</param>
+            <param name="actual">A directory path string containing the actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.AreNotEqual(System.IO.DirectoryInfo,System.IO.DirectoryInfo,System.String,System.Object[])">
+            <summary>
+            Asserts that two directories are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A directory containing the value that is expected</param>
+            <param name="actual">A directory containing the actual value</param>
+            <param name="message">The message to display if directories are not equal</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.AreNotEqual(System.IO.DirectoryInfo,System.IO.DirectoryInfo,System.String)">
+            <summary>
+            Asserts that two directories are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A directory containing the value that is expected</param>
+            <param name="actual">A directory containing the actual value</param>
+            <param name="message">The message to display if directories are not equal</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.AreNotEqual(System.IO.DirectoryInfo,System.IO.DirectoryInfo)">
+            <summary>
+            Asserts that two directories are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A directory containing the value that is expected</param>
+            <param name="actual">A directory containing the actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.AreNotEqual(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that two directories are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A directory path string containing the value that is expected</param>
+            <param name="actual">A directory path string containing the actual value</param>
+            <param name="message">The message to display if directories are equal</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.AreNotEqual(System.String,System.String,System.String)">
+            <summary>
+            Asserts that two directories are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A directory path string containing the value that is expected</param>
+            <param name="actual">A directory path string containing the actual value</param>
+            <param name="message">The message to display if directories are equal</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.AreNotEqual(System.String,System.String)">
+            <summary>
+            Asserts that two directories are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A directory path string containing the value that is expected</param>
+            <param name="actual">A directory path string containing the actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsEmpty(System.IO.DirectoryInfo,System.String,System.Object[])">
+            <summary>
+            Asserts that the directory is empty. If it is not empty
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="message">The message to display if directories are not equal</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsEmpty(System.IO.DirectoryInfo,System.String)">
+            <summary>
+            Asserts that the directory is empty. If it is not empty
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="message">The message to display if directories are not equal</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsEmpty(System.IO.DirectoryInfo)">
+            <summary>
+            Asserts that the directory is empty. If it is not empty
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsEmpty(System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that the directory is empty. If it is not empty
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="message">The message to display if directories are not equal</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsEmpty(System.String,System.String)">
+            <summary>
+            Asserts that the directory is empty. If it is not empty
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="message">The message to display if directories are not equal</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsEmpty(System.String)">
+            <summary>
+            Asserts that the directory is empty. If it is not empty
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsNotEmpty(System.IO.DirectoryInfo,System.String,System.Object[])">
+            <summary>
+            Asserts that the directory is not empty. If it is empty
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="message">The message to display if directories are not equal</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsNotEmpty(System.IO.DirectoryInfo,System.String)">
+            <summary>
+            Asserts that the directory is not empty. If it is empty
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="message">The message to display if directories are not equal</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsNotEmpty(System.IO.DirectoryInfo)">
+            <summary>
+            Asserts that the directory is not empty. If it is empty
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsNotEmpty(System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that the directory is not empty. If it is empty
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="message">The message to display if directories are not equal</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsNotEmpty(System.String,System.String)">
+            <summary>
+            Asserts that the directory is not empty. If it is empty
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="message">The message to display if directories are not equal</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsNotEmpty(System.String)">
+            <summary>
+            Asserts that the directory is not empty. If it is empty
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsWithin(System.IO.DirectoryInfo,System.IO.DirectoryInfo,System.String,System.Object[])">
+            <summary>
+            Asserts that path contains actual as a subdirectory or
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="actual">sub-directory asserted to exist under directory</param>
+            <param name="message">The message to display if directory is not within the path</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsWithin(System.IO.DirectoryInfo,System.IO.DirectoryInfo,System.String)">
+            <summary>
+            Asserts that path contains actual as a subdirectory or
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="actual">sub-directory asserted to exist under directory</param>
+            <param name="message">The message to display if directory is not within the path</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsWithin(System.IO.DirectoryInfo,System.IO.DirectoryInfo)">
+            <summary>
+            Asserts that path contains actual as a subdirectory or
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="actual">sub-directory asserted to exist under directory</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsWithin(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that path contains actual as a subdirectory or
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="actual">sub-directory asserted to exist under directory</param>
+            <param name="message">The message to display if directory is not within the path</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsWithin(System.String,System.String,System.String)">
+            <summary>
+            Asserts that path contains actual as a subdirectory or
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="actual">sub-directory asserted to exist under directory</param>
+            <param name="message">The message to display if directory is not within the path</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsWithin(System.String,System.String)">
+            <summary>
+            Asserts that path contains actual as a subdirectory or
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="actual">sub-directory asserted to exist under directory</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsNotWithin(System.IO.DirectoryInfo,System.IO.DirectoryInfo,System.String,System.Object[])">
+            <summary>
+            Asserts that path does not contain actual as a subdirectory or
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="actual">sub-directory asserted to exist under directory</param>
+            <param name="message">The message to display if directory is not within the path</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsNotWithin(System.IO.DirectoryInfo,System.IO.DirectoryInfo,System.String)">
+            <summary>
+            Asserts that path does not contain actual as a subdirectory or
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="actual">sub-directory asserted to exist under directory</param>
+            <param name="message">The message to display if directory is not within the path</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsNotWithin(System.IO.DirectoryInfo,System.IO.DirectoryInfo)">
+            <summary>
+            Asserts that path does not contain actual as a subdirectory or
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="actual">sub-directory asserted to exist under directory</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsNotWithin(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that path does not contain actual as a subdirectory or
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="actual">sub-directory asserted to exist under directory</param>
+            <param name="message">The message to display if directory is not within the path</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsNotWithin(System.String,System.String,System.String)">
+            <summary>
+            Asserts that path does not contain actual as a subdirectory or
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="actual">sub-directory asserted to exist under directory</param>
+            <param name="message">The message to display if directory is not within the path</param>
+        </member>
+        <member name="M:NUnit.Framework.DirectoryAssert.IsNotWithin(System.String,System.String)">
+            <summary>
+            Asserts that path does not contain actual as a subdirectory or
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="directory">A directory to search</param>
+            <param name="actual">sub-directory asserted to exist under directory</param>
+        </member>
+        <member name="T:NUnit.Framework.FileAssert">
+            <summary>
+            Summary description for FileAssert.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.Equals(System.Object,System.Object)">
+            <summary>
+            The Equals method throws an AssertionException. This is done 
+            to make sure there is no mistake by calling this function.
+            </summary>
+            <param name="a"></param>
+            <param name="b"></param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.ReferenceEquals(System.Object,System.Object)">
+            <summary>
+            override the default ReferenceEquals to throw an AssertionException. This 
+            implementation makes sure there is no mistake in calling this function 
+            as part of Assert. 
+            </summary>
+            <param name="a"></param>
+            <param name="b"></param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.#ctor">
+            <summary>
+            We don't actually want any instances of this object, but some people
+            like to inherit from it to add other static methods. Hence, the
+            protected constructor disallows any instances of this object. 
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreEqual(System.IO.Stream,System.IO.Stream,System.String,System.Object[])">
+            <summary>
+            Verifies that two Streams are equal.  Two Streams are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected Stream</param>
+            <param name="actual">The actual Stream</param>
+            <param name="message">The message to display if Streams are not equal</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreEqual(System.IO.Stream,System.IO.Stream,System.String)">
+            <summary>
+            Verifies that two Streams are equal.  Two Streams are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected Stream</param>
+            <param name="actual">The actual Stream</param>
+            <param name="message">The message to display if objects are not equal</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreEqual(System.IO.Stream,System.IO.Stream)">
+            <summary>
+            Verifies that two Streams are equal.  Two Streams are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected Stream</param>
+            <param name="actual">The actual Stream</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreEqual(System.IO.FileInfo,System.IO.FileInfo,System.String,System.Object[])">
+            <summary>
+            Verifies that two files are equal.  Two files are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A file containing the value that is expected</param>
+            <param name="actual">A file containing the actual value</param>
+            <param name="message">The message to display if Streams are not equal</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreEqual(System.IO.FileInfo,System.IO.FileInfo,System.String)">
+            <summary>
+            Verifies that two files are equal.  Two files are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A file containing the value that is expected</param>
+            <param name="actual">A file containing the actual value</param>
+            <param name="message">The message to display if objects are not equal</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreEqual(System.IO.FileInfo,System.IO.FileInfo)">
+            <summary>
+            Verifies that two files are equal.  Two files are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A file containing the value that is expected</param>
+            <param name="actual">A file containing the actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreEqual(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Verifies that two files are equal.  Two files are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The path to a file containing the value that is expected</param>
+            <param name="actual">The path to a file containing the actual value</param>
+            <param name="message">The message to display if Streams are not equal</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreEqual(System.String,System.String,System.String)">
+            <summary>
+            Verifies that two files are equal.  Two files are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The path to a file containing the value that is expected</param>
+            <param name="actual">The path to a file containing the actual value</param>
+            <param name="message">The message to display if objects are not equal</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreEqual(System.String,System.String)">
+            <summary>
+            Verifies that two files are equal.  Two files are considered
+            equal if both are null, or if both have the same value byte for byte.
+            If they are not equal an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The path to a file containing the value that is expected</param>
+            <param name="actual">The path to a file containing the actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreNotEqual(System.IO.Stream,System.IO.Stream,System.String,System.Object[])">
+            <summary>
+            Asserts that two Streams are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected Stream</param>
+            <param name="actual">The actual Stream</param>
+            <param name="message">The message to be displayed when the two Stream are the same.</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreNotEqual(System.IO.Stream,System.IO.Stream,System.String)">
+            <summary>
+            Asserts that two Streams are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected Stream</param>
+            <param name="actual">The actual Stream</param>
+            <param name="message">The message to be displayed when the Streams are the same.</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreNotEqual(System.IO.Stream,System.IO.Stream)">
+            <summary>
+            Asserts that two Streams are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The expected Stream</param>
+            <param name="actual">The actual Stream</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreNotEqual(System.IO.FileInfo,System.IO.FileInfo,System.String,System.Object[])">
+            <summary>
+            Asserts that two files are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A file containing the value that is expected</param>
+            <param name="actual">A file containing the actual value</param>
+            <param name="message">The message to display if Streams are not equal</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreNotEqual(System.IO.FileInfo,System.IO.FileInfo,System.String)">
+            <summary>
+            Asserts that two files are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A file containing the value that is expected</param>
+            <param name="actual">A file containing the actual value</param>
+            <param name="message">The message to display if objects are not equal</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreNotEqual(System.IO.FileInfo,System.IO.FileInfo)">
+            <summary>
+            Asserts that two files are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">A file containing the value that is expected</param>
+            <param name="actual">A file containing the actual value</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreNotEqual(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that two files are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The path to a file containing the value that is expected</param>
+            <param name="actual">The path to a file containing the actual value</param>
+            <param name="message">The message to display if Streams are not equal</param>
+            <param name="args">Arguments to be used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreNotEqual(System.String,System.String,System.String)">
+            <summary>
+            Asserts that two files are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The path to a file containing the value that is expected</param>
+            <param name="actual">The path to a file containing the actual value</param>
+            <param name="message">The message to display if objects are not equal</param>
+        </member>
+        <member name="M:NUnit.Framework.FileAssert.AreNotEqual(System.String,System.String)">
+            <summary>
+            Asserts that two files are not equal. If they are equal
+            an <see cref="T:NUnit.Framework.AssertionException"/> is thrown.
+            </summary>
+            <param name="expected">The path to a file containing the value that is expected</param>
+            <param name="actual">The path to a file containing the actual value</param>
+        </member>
+        <member name="T:NUnit.Framework.GlobalSettings">
+            <summary>
+            GlobalSettings is a place for setting default values used
+            by the framework in performing asserts.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.GlobalSettings.DefaultFloatingPointTolerance">
+            <summary>
+            Default tolerance for floating point equality
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Guard">
+            <summary>
+            Class used to guard against unexpected argument values
+            by throwing an appropriate exception.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Guard.ArgumentNotNull(System.Object,System.String)">
+            <summary>
+            Throws an exception if an argument is null
+            </summary>
+            <param name="value">The value to be tested</param>
+            <param name="name">The name of the argument</param>
+        </member>
+        <member name="M:NUnit.Framework.Guard.ArgumentNotNullOrEmpty(System.String,System.String)">
+            <summary>
+            Throws an exception if a string argument is null or empty
+            </summary>
+            <param name="value">The value to be tested</param>
+            <param name="name">The name of the argument</param>
+        </member>
+        <member name="T:NUnit.Framework.Has">
+            <summary>
+            Helper class with properties and methods that supply
+            a number of constraints used in Asserts.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Has.Exactly(System.Int32)">
+            <summary>
+            Returns a ConstraintExpression, which will apply
+            the following constraint to all members of a collection,
+            succeeding only if a specified number of them succeed.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Has.Property(System.String)">
+            <summary>
+            Returns a new PropertyConstraintExpression, which will either
+            test for the existence of the named property on the object
+            being tested or apply any following constraint to that property.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Has.Attribute(System.Type)">
+            <summary>
+            Returns a new AttributeConstraint checking for the
+            presence of a particular attribute on an object.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Has.Attribute``1">
+            <summary>
+            Returns a new AttributeConstraint checking for the
+            presence of a particular attribute on an object.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Has.Member(System.Object)">
+            <summary>
+            Returns a new CollectionContainsConstraint checking for the
+            presence of a particular object in the collection.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Has.No">
+            <summary>
+            Returns a ConstraintExpression that negates any
+            following constraint.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Has.All">
+            <summary>
+            Returns a ConstraintExpression, which will apply
+            the following constraint to all members of a collection,
+            succeeding if all of them succeed.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Has.Some">
+            <summary>
+            Returns a ConstraintExpression, which will apply
+            the following constraint to all members of a collection,
+            succeeding if at least one of them succeeds.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Has.None">
+            <summary>
+            Returns a ConstraintExpression, which will apply
+            the following constraint to all members of a collection,
+            succeeding if all of them fail.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Has.Length">
+            <summary>
+            Returns a new ConstraintExpression, which will apply the following
+            constraint to the Length property of the object being tested.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Has.Count">
+            <summary>
+            Returns a new ConstraintExpression, which will apply the following
+            constraint to the Count property of the object being tested.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Has.Message">
+            <summary>
+            Returns a new ConstraintExpression, which will apply the following
+            constraint to the Message property of the object being tested.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Has.InnerException">
+            <summary>
+            Returns a new ConstraintExpression, which will apply the following
+            constraint to the InnerException property of the object being tested.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.IExpectException">
+            <summary>
+            Interface implemented by a user fixture in order to
+            validate any expected exceptions. It is only called
+            for test methods marked with the ExpectedException
+            attribute.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.IExpectException.HandleException(System.Exception)">
+            <summary>
+            Method to handle an expected exception
+            </summary>
+            <param name="ex">The exception to be handled</param>
+        </member>
+        <member name="T:NUnit.Framework.Is">
+            <summary>
+            Helper class with properties and methods that supply
+            a number of constraints used in Asserts.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.EqualTo(System.Object)">
+            <summary>
+            Returns a constraint that tests two items for equality
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.SameAs(System.Object)">
+            <summary>
+            Returns a constraint that tests that two references are the same object
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.GreaterThan(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is greater than the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.GreaterThanOrEqualTo(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is greater than or equal to the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.AtLeast(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is greater than or equal to the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.LessThan(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is less than the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.LessThanOrEqualTo(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is less than or equal to the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.AtMost(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is less than or equal to the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.TypeOf(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual
+            value is of the exact type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.TypeOf``1">
+            <summary>
+            Returns a constraint that tests whether the actual
+            value is of the exact type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.InstanceOf(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is of the type supplied as an argument or a derived type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.InstanceOf``1">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is of the type supplied as an argument or a derived type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.InstanceOfType(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is of the type supplied as an argument or a derived type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.InstanceOfType``1">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is of the type supplied as an argument or a derived type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.AssignableFrom(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is assignable from the type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.AssignableFrom``1">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is assignable from the type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.AssignableTo(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is assignable from the type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.AssignableTo``1">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is assignable from the type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.EquivalentTo(System.Collections.IEnumerable)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is a collection containing the same elements as the 
+            collection supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.SubsetOf(System.Collections.IEnumerable)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is a subset of the collection supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.StringContaining(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value contains the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.StringStarting(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value starts with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.StringEnding(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value ends with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.StringMatching(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value matches the regular expression supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.SamePath(System.String)">
+            <summary>
+            Returns a constraint that tests whether the path provided 
+            is the same as an expected path after canonicalization.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.SubPath(System.String)">
+            <summary>
+            Returns a constraint that tests whether the path provided 
+            is under an expected path after canonicalization.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.SamePathOrUnder(System.String)">
+            <summary>
+            Returns a constraint that tests whether the path provided 
+            is the same path or under an expected path after canonicalization.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Is.InRange``1(``0,``0)">
+            <summary>
+            Returns a constraint that tests whether the actual value falls 
+            within a specified range.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Is.Not">
+            <summary>
+            Returns a ConstraintExpression that negates any
+            following constraint.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Is.All">
+            <summary>
+            Returns a ConstraintExpression, which will apply
+            the following constraint to all members of a collection,
+            succeeding if all of them succeed.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Is.Null">
+            <summary>
+            Returns a constraint that tests for null
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Is.True">
+            <summary>
+            Returns a constraint that tests for True
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Is.False">
+            <summary>
+            Returns a constraint that tests for False
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Is.Positive">
+            <summary>
+            Returns a constraint that tests for a positive value
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Is.Negative">
+            <summary>
+            Returns a constraint that tests for a negative value
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Is.NaN">
+            <summary>
+            Returns a constraint that tests for NaN
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Is.Empty">
+            <summary>
+            Returns a constraint that tests for empty
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Is.Unique">
+            <summary>
+            Returns a constraint that tests whether a collection 
+            contains all unique items.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Is.BinarySerializable">
+            <summary>
+            Returns a constraint that tests whether an object graph is serializable in binary format.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Is.XmlSerializable">
+            <summary>
+            Returns a constraint that tests whether an object graph is serializable in xml format.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Is.Ordered">
+            <summary>
+            Returns a constraint that tests whether a collection is ordered
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.ITestCaseData">
+            <summary>
+            The ITestCaseData interface is implemented by a class
+            that is able to return complete testcases for use by
+            a parameterized test method.
+            
+            NOTE: This interface is used in both the framework
+            and the core, even though that results in two different
+            types. However, sharing the source code guarantees that
+            the various implementations will be compatible and that
+            the core is able to reflect successfully over the
+            framework implementations of ITestCaseData.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ITestCaseData.Arguments">
+            <summary>
+            Gets the argument list to be provided to the test
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ITestCaseData.Result">
+            <summary>
+            Gets the expected result
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ITestCaseData.HasExpectedResult">
+            <summary>
+            Indicates whether a result has been specified.
+            This is necessary because the result may be
+            null, so it's value cannot be checked.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ITestCaseData.ExpectedException">
+            <summary>
+             Gets the expected exception Type
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ITestCaseData.ExpectedExceptionName">
+            <summary>
+            Gets the FullName of the expected exception
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ITestCaseData.TestName">
+            <summary>
+            Gets the name to be used for the test
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ITestCaseData.Description">
+            <summary>
+            Gets the description of the test
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ITestCaseData.Ignored">
+            <summary>
+            Gets a value indicating whether this <see cref="T:NUnit.Framework.ITestCaseData"/> is ignored.
+            </summary>
+            <value><c>true</c> if ignored; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:NUnit.Framework.ITestCaseData.Explicit">
+            <summary>
+            Gets a value indicating whether this <see cref="T:NUnit.Framework.ITestCaseData"/> is explicit.
+            </summary>
+            <value><c>true</c> if explicit; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:NUnit.Framework.ITestCaseData.IgnoreReason">
+            <summary>
+            Gets the ignore reason.
+            </summary>
+            <value>The ignore reason.</value>
+        </member>
+        <member name="T:NUnit.Framework.Iz">
+            <summary>
+            The Iz class is a synonym for Is intended for use in VB,
+            which regards Is as a keyword.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.List">
+            <summary>
+            The List class is a helper class with properties and methods
+            that supply a number of constraints used with lists and collections.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.List.Map(System.Collections.ICollection)">
+            <summary>
+            List.Map returns a ListMapper, which can be used to map
+            the original collection to another collection.
+            </summary>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="T:NUnit.Framework.ListMapper">
+            <summary>
+            ListMapper is used to transform a collection used as an actual argument
+            producing another collection to be used in the assertion.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.ListMapper.#ctor(System.Collections.ICollection)">
+            <summary>
+            Construct a ListMapper based on a collection
+            </summary>
+            <param name="original">The collection to be transformed</param>
+        </member>
+        <member name="M:NUnit.Framework.ListMapper.Property(System.String)">
+            <summary>
+            Produces a collection containing all the values of a property
+            </summary>
+            <param name="name">The collection of property values</param>
+            <returns></returns>
+        </member>
+        <member name="T:NUnit.Framework.Randomizer">
+            <summary>
+            Randomizer returns a set of random values in a repeatable
+            way, to allow re-running of tests if necessary.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Randomizer.GetRandomizer(System.Reflection.MemberInfo)">
+            <summary>
+            Get a randomizer for a particular member, returning
+            one that has already been created if it exists.
+            This ensures that the same values are generated
+            each time the tests are reloaded.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Randomizer.GetRandomizer(System.Reflection.ParameterInfo)">
+            <summary>
+            Get a randomizer for a particular parameter, returning
+            one that has already been created if it exists.
+            This ensures that the same values are generated
+            each time the tests are reloaded.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Randomizer.#ctor">
+            <summary>
+            Construct a randomizer using a random seed
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Randomizer.#ctor(System.Int32)">
+            <summary>
+            Construct a randomizer using a specified seed
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Randomizer.GetDoubles(System.Int32)">
+            <summary>
+            Return an array of random doubles between 0.0 and 1.0.
+            </summary>
+            <param name="count"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Randomizer.GetDoubles(System.Double,System.Double,System.Int32)">
+            <summary>
+            Return an array of random doubles with values in a specified range.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Randomizer.GetInts(System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Return an array of random ints with values in a specified range.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Randomizer.RandomSeed">
+            <summary>
+            Get a random seed for use in creating a randomizer.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.SpecialValue">
+            <summary>
+            The SpecialValue enum is used to represent TestCase arguments
+            that cannot be used as arguments to an Attribute.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.SpecialValue.Null">
+            <summary>
+            Null represents a null value, which cannot be used as an 
+            argument to an attribute under .NET 1.x
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.StringAssert">
+            <summary>
+            Basic Asserts on strings.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.Equals(System.Object,System.Object)">
+            <summary>
+            The Equals method throws an AssertionException. This is done 
+            to make sure there is no mistake by calling this function.
+            </summary>
+            <param name="a"></param>
+            <param name="b"></param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.ReferenceEquals(System.Object,System.Object)">
+            <summary>
+            override the default ReferenceEquals to throw an AssertionException. This 
+            implementation makes sure there is no mistake in calling this function 
+            as part of Assert. 
+            </summary>
+            <param name="a"></param>
+            <param name="b"></param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.Contains(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that a string is found within another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Arguments used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.Contains(System.String,System.String,System.String)">
+            <summary>
+            Asserts that a string is found within another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.Contains(System.String,System.String)">
+            <summary>
+            Asserts that a string is found within another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.DoesNotContain(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that a string is not found within another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Arguments used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.DoesNotContain(System.String,System.String,System.String)">
+            <summary>
+            Asserts that a string is found within another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.DoesNotContain(System.String,System.String)">
+            <summary>
+            Asserts that a string is found within another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.StartsWith(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that a string starts with another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Arguments used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.StartsWith(System.String,System.String,System.String)">
+            <summary>
+            Asserts that a string starts with another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.StartsWith(System.String,System.String)">
+            <summary>
+            Asserts that a string starts with another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.DoesNotStartWith(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that a string does not start with another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Arguments used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.DoesNotStartWith(System.String,System.String,System.String)">
+            <summary>
+            Asserts that a string does not start with another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.DoesNotStartWith(System.String,System.String)">
+            <summary>
+            Asserts that a string does not start with another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.EndsWith(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that a string ends with another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Arguments used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.EndsWith(System.String,System.String,System.String)">
+            <summary>
+            Asserts that a string ends with another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.EndsWith(System.String,System.String)">
+            <summary>
+            Asserts that a string ends with another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.DoesNotEndWith(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that a string does not end with another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Arguments used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.DoesNotEndWith(System.String,System.String,System.String)">
+            <summary>
+            Asserts that a string does not end with another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.DoesNotEndWith(System.String,System.String)">
+            <summary>
+            Asserts that a string does not end with another string.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The string to be examined</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.AreEqualIgnoringCase(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that two strings are equal, without regard to case.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The actual string</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Arguments used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.AreEqualIgnoringCase(System.String,System.String,System.String)">
+            <summary>
+            Asserts that two strings are equal, without regard to case.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The actual string</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.AreEqualIgnoringCase(System.String,System.String)">
+            <summary>
+            Asserts that two strings are equal, without regard to case.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The actual string</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.AreNotEqualIgnoringCase(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that two strings are not equal, without regard to case.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The actual string</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Arguments used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.AreNotEqualIgnoringCase(System.String,System.String,System.String)">
+            <summary>
+            Asserts that two strings are Notequal, without regard to case.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The actual string</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.AreNotEqualIgnoringCase(System.String,System.String)">
+            <summary>
+            Asserts that two strings are not equal, without regard to case.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The actual string</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.IsMatch(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that a string matches an expected regular expression pattern.
+            </summary>
+            <param name="pattern">The regex pattern to be matched</param>
+            <param name="actual">The actual string</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Arguments used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.IsMatch(System.String,System.String,System.String)">
+            <summary>
+            Asserts that a string matches an expected regular expression pattern.
+            </summary>
+            <param name="pattern">The regex pattern to be matched</param>
+            <param name="actual">The actual string</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.IsMatch(System.String,System.String)">
+            <summary>
+            Asserts that a string matches an expected regular expression pattern.
+            </summary>
+            <param name="pattern">The regex pattern to be matched</param>
+            <param name="actual">The actual string</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.DoesNotMatch(System.String,System.String,System.String,System.Object[])">
+            <summary>
+            Asserts that a string does not match an expected regular expression pattern.
+            </summary>
+            <param name="pattern">The regex pattern to be used</param>
+            <param name="actual">The actual string</param>
+            <param name="message">The message to display in case of failure</param>
+            <param name="args">Arguments used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.DoesNotMatch(System.String,System.String,System.String)">
+            <summary>
+            Asserts that a string does not match an expected regular expression pattern.
+            </summary>
+            <param name="pattern">The regex pattern to be used</param>
+            <param name="actual">The actual string</param>
+            <param name="message">The message to display in case of failure</param>
+        </member>
+        <member name="M:NUnit.Framework.StringAssert.DoesNotMatch(System.String,System.String)">
+            <summary>
+            Asserts that a string does not match an expected regular expression pattern.
+            </summary>
+            <param name="pattern">The regex pattern to be used</param>
+            <param name="actual">The actual string</param>
+        </member>
+        <member name="T:NUnit.Framework.TestCaseData">
+            <summary>
+            The TestCaseData class represents a set of arguments
+            and other parameter info to be used for a parameterized
+            test case. It provides a number of instance modifiers
+            for use in initializing the test case.
+            
+            Note: Instance modifiers are getters that return
+            the same instance after modifying it's state.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestCaseData.arguments">
+            <summary>
+            The argument list to be provided to the test
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestCaseData.expectedResult">
+            <summary>
+            The expected result to be returned
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestCaseData.hasExpectedResult">
+            <summary>
+            Set to true if this has an expected result
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestCaseData.expectedExceptionType">
+            <summary>
+             The expected exception Type
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestCaseData.expectedExceptionName">
+            <summary>
+            The FullName of the expected exception
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestCaseData.testName">
+            <summary>
+            The name to be used for the test
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestCaseData.description">
+            <summary>
+            The description of the test
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestCaseData.properties">
+            <summary>
+            A dictionary of properties, used to add information
+            to tests without requiring the class to change.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestCaseData.isIgnored">
+            <summary>
+            If true, indicates that the test case is to be ignored
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestCaseData.isExplicit">
+            <summary>
+            If true, indicates that the test case is marked explicit
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestCaseData.ignoreReason">
+            <summary>
+            The reason for ignoring a test case
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.#ctor(System.Object[])">
+            <summary>
+            Initializes a new instance of the <see cref="T:TestCaseData"/> class.
+            </summary>
+            <param name="args">The arguments.</param>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.#ctor(System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:TestCaseData"/> class.
+            </summary>
+            <param name="arg">The argument.</param>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.#ctor(System.Object,System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:TestCaseData"/> class.
+            </summary>
+            <param name="arg1">The first argument.</param>
+            <param name="arg2">The second argument.</param>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.#ctor(System.Object,System.Object,System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:TestCaseData"/> class.
+            </summary>
+            <param name="arg1">The first argument.</param>
+            <param name="arg2">The second argument.</param>
+            <param name="arg3">The third argument.</param>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.Returns(System.Object)">
+            <summary>
+            Sets the expected result for the test
+            </summary>
+            <param name="result">The expected result</param>
+            <returns>A modified TestCaseData</returns>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.Throws(System.Type)">
+            <summary>
+            Sets the expected exception type for the test
+            </summary>
+            <param name="exceptionType">Type of the expected exception.</param>
+            <returns>The modified TestCaseData instance</returns>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.Throws(System.String)">
+            <summary>
+            Sets the expected exception type for the test
+            </summary>
+            <param name="exceptionName">FullName of the expected exception.</param>
+            <returns>The modified TestCaseData instance</returns>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.SetName(System.String)">
+            <summary>
+            Sets the name of the test case
+            </summary>
+            <returns>The modified TestCaseData instance</returns>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.SetDescription(System.String)">
+            <summary>
+            Sets the description for the test case
+            being constructed.
+            </summary>
+            <param name="description">The description.</param>
+            <returns>The modified TestCaseData instance.</returns>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.SetCategory(System.String)">
+            <summary>
+            Applies a category to the test
+            </summary>
+            <param name="category"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.SetProperty(System.String,System.String)">
+            <summary>
+            Applies a named property to the test
+            </summary>
+            <param name="propName"></param>
+            <param name="propValue"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.SetProperty(System.String,System.Int32)">
+            <summary>
+            Applies a named property to the test
+            </summary>
+            <param name="propName"></param>
+            <param name="propValue"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.SetProperty(System.String,System.Double)">
+            <summary>
+            Applies a named property to the test
+            </summary>
+            <param name="propName"></param>
+            <param name="propValue"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.Ignore">
+            <summary>
+            Ignores this TestCase.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.Ignore(System.String)">
+            <summary>
+            Ignores this TestCase, specifying the reason.
+            </summary>
+            <param name="reason">The reason.</param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.MakeExplicit">
+            <summary>
+            Marks this TestCase as Explicit
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseData.MakeExplicit(System.String)">
+            <summary>
+            Marks this TestCase as Explicit, specifying the reason.
+            </summary>
+            <param name="reason">The reason.</param>
+            <returns></returns>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseData.Arguments">
+            <summary>
+            Gets the argument list to be provided to the test
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseData.Result">
+            <summary>
+            Gets the expected result
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseData.HasExpectedResult">
+            <summary>
+            Returns true if the result has been set
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseData.ExpectedException">
+            <summary>
+             Gets the expected exception Type
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseData.ExpectedExceptionName">
+            <summary>
+            Gets the FullName of the expected exception
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseData.TestName">
+            <summary>
+            Gets the name to be used for the test
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseData.Description">
+            <summary>
+            Gets the description of the test
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseData.Ignored">
+            <summary>
+            Gets a value indicating whether this <see cref="T:NUnit.Framework.ITestCaseData"/> is ignored.
+            </summary>
+            <value><c>true</c> if ignored; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseData.Explicit">
+            <summary>
+            Gets a value indicating whether this <see cref="T:NUnit.Framework.ITestCaseData"/> is explicit.
+            </summary>
+            <value><c>true</c> if explicit; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseData.IgnoreReason">
+            <summary>
+            Gets the ignore reason.
+            </summary>
+            <value>The ignore reason.</value>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseData.Categories">
+            <summary>
+            Gets a list of categories associated with this test.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseData.Properties">
+            <summary>
+            Gets the property dictionary for this test
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TestContext">
+            <summary>
+            Provide the context information of the current test
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.TestContext.#ctor(System.Collections.IDictionary)">
+            <summary>
+            Constructs a TestContext using the provided context dictionary
+            </summary>
+            <param name="context">A context dictionary</param>
+        </member>
+        <member name="P:NUnit.Framework.TestContext.CurrentContext">
+            <summary>
+            Get the current test context. This is created
+            as needed. The user may save the context for
+            use within a test, but it should not be used
+            outside the test for which it is created.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestContext.Test">
+            <summary>
+            Gets a TestAdapter representing the currently executing test in this context.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestContext.Result">
+            <summary>
+            Gets a ResultAdapter representing the current result for the test 
+            executing in this context.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestContext.TestDirectory">
+            <summary>
+            Gets the directory containing the current test assembly.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestContext.WorkDirectory">
+            <summary>
+            Gets the directory to be used for outputing files created
+            by this test run.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TestContext.TestAdapter">
+            <summary>
+            TestAdapter adapts a Test for consumption by
+            the user test code.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.TestContext.TestAdapter.#ctor(System.Collections.IDictionary)">
+            <summary>
+            Constructs a TestAdapter for this context
+            </summary>
+            <param name="context">The context dictionary</param>
+        </member>
+        <member name="P:NUnit.Framework.TestContext.TestAdapter.Name">
+            <summary>
+            The name of the test.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestContext.TestAdapter.FullName">
+            <summary>
+            The FullName of the test
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestContext.TestAdapter.Properties">
+            <summary>
+            The properties of the test.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TestContext.ResultAdapter">
+            <summary>
+            ResultAdapter adapts a TestResult for consumption by
+            the user test code.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.TestContext.ResultAdapter.#ctor(System.Collections.IDictionary)">
+            <summary>
+            Construct a ResultAdapter for a context
+            </summary>
+            <param name="context">The context holding the result</param>
+        </member>
+        <member name="P:NUnit.Framework.TestContext.ResultAdapter.State">
+            <summary>
+            The TestState of current test. This maps to the ResultState
+            used in nunit.core and is subject to change in the future.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestContext.ResultAdapter.Status">
+            <summary>
+            The TestStatus of current test. This enum will be used
+            in future versions of NUnit and so is to be preferred
+            to the TestState value.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TestDetails">
+            <summary>
+            Provides details about a test
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.TestDetails.#ctor(System.Object,System.Reflection.MethodInfo,System.String,System.String,System.Boolean)">
+            <summary>
+             Creates an instance of TestDetails
+            </summary>
+            <param name="fixture">The fixture that the test is a member of, if available.</param>
+            <param name="method">The method that implements the test, if available.</param>
+            <param name="fullName">The full name of the test.</param>
+            <param name="type">A string representing the type of test, e.g. "Test Case".</param>
+            <param name="isSuite">Indicates if the test represents a suite of tests.</param>
+        </member>
+        <member name="P:NUnit.Framework.TestDetails.Fixture">
+            <summary>
+             The fixture that the test is a member of, if available.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestDetails.Method">
+            <summary>
+            The method that implements the test, if available.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestDetails.FullName">
+            <summary>
+            The full name of the test.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestDetails.Type">
+            <summary>
+            A string representing the type of test, e.g. "Test Case".
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestDetails.IsSuite">
+            <summary>
+            Indicates if the test represents a suite of tests.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TestState">
+            <summary>
+            The ResultState enum indicates the result of running a test
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestState.Inconclusive">
+            <summary>
+            The result is inconclusive
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestState.NotRunnable">
+            <summary>
+            The test was not runnable.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestState.Skipped">
+            <summary>
+            The test has been skipped. 
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestState.Ignored">
+            <summary>
+            The test has been ignored.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestState.Success">
+            <summary>
+            The test succeeded
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestState.Failure">
+            <summary>
+            The test failed
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestState.Error">
+            <summary>
+            The test encountered an unexpected exception
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestState.Cancelled">
+            <summary>
+            The test was cancelled by the user
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TestStatus">
+            <summary>
+            The TestStatus enum indicates the result of running a test
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestStatus.Inconclusive">
+            <summary>
+            The test was inconclusive
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestStatus.Skipped">
+            <summary>
+            The test has skipped 
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestStatus.Passed">
+            <summary>
+            The test succeeded
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TestStatus.Failed">
+            <summary>
+            The test failed
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Text">
+            <summary>
+            Helper class with static methods used to supply constraints
+            that operate on strings.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Text.Contains(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value contains the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Text.DoesNotContain(System.String)">
+            <summary>
+            Returns a constraint that fails if the actual
+            value contains the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Text.StartsWith(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value starts with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Text.DoesNotStartWith(System.String)">
+            <summary>
+            Returns a constraint that fails if the actual
+            value starts with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Text.EndsWith(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value ends with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Text.DoesNotEndWith(System.String)">
+            <summary>
+            Returns a constraint that fails if the actual
+            value ends with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Text.Matches(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value matches the Regex pattern supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Text.DoesNotMatch(System.String)">
+            <summary>
+            Returns a constraint that fails if the actual
+            value matches the pattern supplied as an argument.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Text.All">
+            <summary>
+            Returns a ConstraintExpression, which will apply
+            the following constraint to all members of a collection,
+            succeeding if all of them succeed.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TextMessageWriter">
+            <summary>
+            TextMessageWriter writes constraint descriptions and messages
+            in displayable form as a text stream. It tailors the display
+            of individual message components to form the standard message
+            format of NUnit assertion failure messages.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.MessageWriter">
+            <summary>
+            MessageWriter is the abstract base for classes that write
+            constraint descriptions and messages in some form. The
+            class has separate methods for writing various components
+            of a message, allowing implementations to tailor the
+            presentation as needed.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.#ctor">
+            <summary>
+            Construct a MessageWriter given a culture
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.WriteMessageLine(System.String,System.Object[])">
+            <summary>
+            Method to write single line  message with optional args, usually
+            written to precede the general failure message.
+            </summary>
+            <param name="message">The message to be written</param>
+            <param name="args">Any arguments used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.WriteMessageLine(System.Int32,System.String,System.Object[])">
+            <summary>
+            Method to write single line  message with optional args, usually
+            written to precede the general failure message, at a givel 
+            indentation level.
+            </summary>
+            <param name="level">The indentation level of the message</param>
+            <param name="message">The message to be written</param>
+            <param name="args">Any arguments used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.DisplayDifferences(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Display Expected and Actual lines for a constraint. This
+            is called by MessageWriter's default implementation of 
+            WriteMessageTo and provides the generic two-line display. 
+            </summary>
+            <param name="constraint">The constraint that failed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.DisplayDifferences(System.Object,System.Object)">
+            <summary>
+            Display Expected and Actual lines for given values. This
+            method may be called by constraints that need more control over
+            the display of actual and expected values than is provided
+            by the default implementation.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value causing the failure</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.DisplayDifferences(System.Object,System.Object,NUnit.Framework.Constraints.Tolerance)">
+            <summary>
+            Display Expected and Actual lines for given values, including
+            a tolerance value on the Expected line.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value causing the failure</param>
+            <param name="tolerance">The tolerance within which the test was made</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.DisplayStringDifferences(System.String,System.String,System.Int32,System.Boolean,System.Boolean)">
+            <summary>
+            Display the expected and actual string values on separate lines.
+            If the mismatch parameter is >=0, an additional line is displayed
+            line containing a caret that points to the mismatch point.
+            </summary>
+            <param name="expected">The expected string value</param>
+            <param name="actual">The actual string value</param>
+            <param name="mismatch">The point at which the strings don't match or -1</param>
+            <param name="ignoreCase">If true, case is ignored in locating the point where the strings differ</param>
+            <param name="clipping">If true, the strings should be clipped to fit the line</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.WriteConnector(System.String)">
+            <summary>
+            Writes the text for a connector.
+            </summary>
+            <param name="connector">The connector.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.WritePredicate(System.String)">
+            <summary>
+            Writes the text for a predicate.
+            </summary>
+            <param name="predicate">The predicate.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.WriteExpectedValue(System.Object)">
+            <summary>
+            Writes the text for an expected value.
+            </summary>
+            <param name="expected">The expected value.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.WriteModifier(System.String)">
+            <summary>
+            Writes the text for a modifier
+            </summary>
+            <param name="modifier">The modifier.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.WriteActualValue(System.Object)">
+            <summary>
+            Writes the text for an actual value.
+            </summary>
+            <param name="actual">The actual value.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.WriteValue(System.Object)">
+            <summary>
+            Writes the text for a generalized value.
+            </summary>
+            <param name="val">The value.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MessageWriter.WriteCollectionElements(System.Collections.IEnumerable,System.Int32,System.Int32)">
+            <summary>
+            Writes the text for a collection value,
+            starting at a particular point, to a max length
+            </summary>
+            <param name="collection">The collection containing elements to write.</param>
+            <param name="start">The starting point of the elements to write</param>
+            <param name="max">The maximum number of elements to write</param>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.MessageWriter.MaxLineLength">
+            <summary>
+            Abstract method to get the max line length
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TextMessageWriter.Pfx_Expected">
+            <summary>
+            Prefix used for the expected value line of a message
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TextMessageWriter.Pfx_Actual">
+            <summary>
+            Prefix used for the actual value line of a message
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.TextMessageWriter.PrefixLength">
+            <summary>
+            Length of a message prefix
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.#ctor">
+            <summary>
+            Construct a TextMessageWriter
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.#ctor(System.String,System.Object[])">
+            <summary>
+            Construct a TextMessageWriter, specifying a user message
+            and optional formatting arguments.
+            </summary>
+            <param name="userMessage"></param>
+            <param name="args"></param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.WriteMessageLine(System.Int32,System.String,System.Object[])">
+            <summary>
+            Method to write single line  message with optional args, usually
+            written to precede the general failure message, at a givel 
+            indentation level.
+            </summary>
+            <param name="level">The indentation level of the message</param>
+            <param name="message">The message to be written</param>
+            <param name="args">Any arguments used in formatting the message</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.DisplayDifferences(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Display Expected and Actual lines for a constraint. This
+            is called by MessageWriter's default implementation of 
+            WriteMessageTo and provides the generic two-line display. 
+            </summary>
+            <param name="constraint">The constraint that failed</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.DisplayDifferences(System.Object,System.Object)">
+            <summary>
+            Display Expected and Actual lines for given values. This
+            method may be called by constraints that need more control over
+            the display of actual and expected values than is provided
+            by the default implementation.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value causing the failure</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.DisplayDifferences(System.Object,System.Object,NUnit.Framework.Constraints.Tolerance)">
+            <summary>
+            Display Expected and Actual lines for given values, including
+            a tolerance value on the expected line.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value causing the failure</param>
+            <param name="tolerance">The tolerance within which the test was made</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.DisplayStringDifferences(System.String,System.String,System.Int32,System.Boolean,System.Boolean)">
+            <summary>
+            Display the expected and actual string values on separate lines.
+            If the mismatch parameter is >=0, an additional line is displayed
+            line containing a caret that points to the mismatch point.
+            </summary>
+            <param name="expected">The expected string value</param>
+            <param name="actual">The actual string value</param>
+            <param name="mismatch">The point at which the strings don't match or -1</param>
+            <param name="ignoreCase">If true, case is ignored in string comparisons</param>
+            <param name="clipping">If true, clip the strings to fit the max line length</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.WriteConnector(System.String)">
+            <summary>
+            Writes the text for a connector.
+            </summary>
+            <param name="connector">The connector.</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.WritePredicate(System.String)">
+            <summary>
+            Writes the text for a predicate.
+            </summary>
+            <param name="predicate">The predicate.</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.WriteModifier(System.String)">
+            <summary>
+            Write the text for a modifier.
+            </summary>
+            <param name="modifier">The modifier.</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.WriteExpectedValue(System.Object)">
+            <summary>
+            Writes the text for an expected value.
+            </summary>
+            <param name="expected">The expected value.</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.WriteActualValue(System.Object)">
+            <summary>
+            Writes the text for an actual value.
+            </summary>
+            <param name="actual">The actual value.</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.WriteValue(System.Object)">
+            <summary>
+            Writes the text for a generalized value.
+            </summary>
+            <param name="val">The value.</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.WriteCollectionElements(System.Collections.IEnumerable,System.Int32,System.Int32)">
+            <summary>
+            Writes the text for a collection value,
+            starting at a particular point, to a max length
+            </summary>
+            <param name="collection">The collection containing elements to write.</param>
+            <param name="start">The starting point of the elements to write</param>
+            <param name="max">The maximum number of elements to write</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.WriteExpectedLine(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Write the generic 'Expected' line for a constraint
+            </summary>
+            <param name="constraint">The constraint that failed</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.WriteExpectedLine(System.Object)">
+            <summary>
+            Write the generic 'Expected' line for a given value
+            </summary>
+            <param name="expected">The expected value</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.WriteExpectedLine(System.Object,NUnit.Framework.Constraints.Tolerance)">
+            <summary>
+            Write the generic 'Expected' line for a given value
+            and tolerance.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="tolerance">The tolerance within which the test was made</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.WriteActualLine(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Write the generic 'Actual' line for a constraint
+            </summary>
+            <param name="constraint">The constraint for which the actual value is to be written</param>
+        </member>
+        <member name="M:NUnit.Framework.TextMessageWriter.WriteActualLine(System.Object)">
+            <summary>
+            Write the generic 'Actual' line for a given value
+            </summary>
+            <param name="actual">The actual value causing a failure</param>
+        </member>
+        <member name="P:NUnit.Framework.TextMessageWriter.MaxLineLength">
+            <summary>
+            Gets or sets the maximum line length for this writer
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Throws">
+            <summary>
+            Helper class with properties and methods that supply
+            constraints that operate on exceptions.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Throws.TypeOf(System.Type)">
+            <summary>
+            Creates a constraint specifying the exact type of exception expected
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Throws.TypeOf``1">
+            <summary>
+            Creates a constraint specifying the exact type of exception expected
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Throws.InstanceOf(System.Type)">
+            <summary>
+            Creates a constraint specifying the type of exception expected
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Throws.InstanceOf``1">
+            <summary>
+            Creates a constraint specifying the type of exception expected
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Throws.Exception">
+            <summary>
+            Creates a constraint specifying an expected exception
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Throws.InnerException">
+            <summary>
+            Creates a constraint specifying an exception with a given InnerException
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Throws.TargetInvocationException">
+            <summary>
+            Creates a constraint specifying an expected TargetInvocationException
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Throws.ArgumentException">
+            <summary>
+            Creates a constraint specifying an expected TargetInvocationException
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Throws.InvalidOperationException">
+            <summary>
+            Creates a constraint specifying an expected TargetInvocationException
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Throws.Nothing">
+            <summary>
+            Creates a constraint specifying that no exception is thrown
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.CategoryAttribute">
+            <summary>
+            Attribute used to apply a category to a test
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.CategoryAttribute.categoryName">
+            <summary>
+            The name of the category
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.CategoryAttribute.#ctor(System.String)">
+            <summary>
+            Construct attribute for a given category based on
+            a name. The name may not contain the characters ',',
+            '+', '-' or '!'. However, this is not checked in the
+            constructor since it would cause an error to arise at
+            as the test was loaded without giving a clear indication
+            of where the problem is located. The error is handled
+            in NUnitFramework.cs by marking the test as not
+            runnable.
+            </summary>
+            <param name="name">The name of the category</param>
+        </member>
+        <member name="M:NUnit.Framework.CategoryAttribute.#ctor">
+            <summary>
+            Protected constructor uses the Type name as the name
+            of the category.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.CategoryAttribute.Name">
+            <summary>
+            The name of the category
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.DatapointAttribute">
+            <summary>
+            Used to mark a field for use as a datapoint when executing a theory
+            within the same fixture that requires an argument of the field's Type.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.DatapointsAttribute">
+            <summary>
+            Used to mark an array as containing a set of datapoints to be used
+            executing a theory within the same fixture that requires an argument 
+            of the Type of the array elements.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.DescriptionAttribute">
+            <summary>
+            Attribute used to provide descriptive text about a 
+            test case or fixture.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.DescriptionAttribute.#ctor(System.String)">
+            <summary>
+            Construct the attribute
+            </summary>
+            <param name="description">Text describing the test</param>
+        </member>
+        <member name="P:NUnit.Framework.DescriptionAttribute.Description">
+            <summary>
+            Gets the test description
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.MessageMatch">
+            <summary>
+            Enumeration indicating how the expected message parameter is to be used
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.MessageMatch.Exact">
+            Expect an exact match
+        </member>
+        <member name="F:NUnit.Framework.MessageMatch.Contains">
+            Expect a message containing the parameter string
+        </member>
+        <member name="F:NUnit.Framework.MessageMatch.Regex">
+            Match the regular expression provided as a parameter
+        </member>
+        <member name="F:NUnit.Framework.MessageMatch.StartsWith">
+            Expect a message that starts with the parameter string
+        </member>
+        <member name="T:NUnit.Framework.ExpectedExceptionAttribute">
+            <summary>
+            ExpectedExceptionAttribute
+            </summary>
+            
+        </member>
+        <member name="M:NUnit.Framework.ExpectedExceptionAttribute.#ctor">
+            <summary>
+            Constructor for a non-specific exception
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.ExpectedExceptionAttribute.#ctor(System.Type)">
+            <summary>
+            Constructor for a given type of exception
+            </summary>
+            <param name="exceptionType">The type of the expected exception</param>
+        </member>
+        <member name="M:NUnit.Framework.ExpectedExceptionAttribute.#ctor(System.String)">
+            <summary>
+            Constructor for a given exception name
+            </summary>
+            <param name="exceptionName">The full name of the expected exception</param>
+        </member>
+        <member name="P:NUnit.Framework.ExpectedExceptionAttribute.ExpectedException">
+            <summary>
+            Gets or sets the expected exception type
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ExpectedExceptionAttribute.ExpectedExceptionName">
+            <summary>
+            Gets or sets the full Type name of the expected exception
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ExpectedExceptionAttribute.ExpectedMessage">
+            <summary>
+            Gets or sets the expected message text
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ExpectedExceptionAttribute.UserMessage">
+            <summary>
+            Gets or sets the user message displayed in case of failure
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ExpectedExceptionAttribute.MatchType">
+            <summary>
+             Gets or sets the type of match to be performed on the expected message
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ExpectedExceptionAttribute.Handler">
+            <summary>
+             Gets the name of a method to be used as an exception handler
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.ExplicitAttribute">
+            <summary>
+            ExplicitAttribute marks a test or test fixture so that it will
+            only be run if explicitly executed from the gui or command line
+            or if it is included by use of a filter. The test will not be
+            run simply because an enclosing suite is run.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.ExplicitAttribute.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.ExplicitAttribute.#ctor(System.String)">
+            <summary>
+            Constructor with a reason
+            </summary>
+            <param name="reason">The reason test is marked explicit</param>
+        </member>
+        <member name="P:NUnit.Framework.ExplicitAttribute.Reason">
+            <summary>
+            The reason test is marked explicit
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.IgnoreAttribute">
+            <summary>
+            Attribute used to mark a test that is to be ignored.
+            Ignored tests result in a warning message when the
+            tests are run.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.IgnoreAttribute.#ctor">
+            <summary>
+            Constructs the attribute without giving a reason 
+            for ignoring the test.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.IgnoreAttribute.#ctor(System.String)">
+            <summary>
+            Constructs the attribute giving a reason for ignoring the test
+            </summary>
+            <param name="reason">The reason for ignoring the test</param>
+        </member>
+        <member name="P:NUnit.Framework.IgnoreAttribute.Reason">
+            <summary>
+            The reason for ignoring a test
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.IncludeExcludeAttribute">
+            <summary>
+            Abstract base for Attributes that are used to include tests
+            in the test run based on environmental settings.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.IncludeExcludeAttribute.#ctor">
+            <summary>
+            Constructor with no included items specified, for use
+            with named property syntax.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.IncludeExcludeAttribute.#ctor(System.String)">
+            <summary>
+            Constructor taking one or more included items
+            </summary>
+            <param name="include">Comma-delimited list of included items</param>
+        </member>
+        <member name="P:NUnit.Framework.IncludeExcludeAttribute.Include">
+            <summary>
+            Name of the item that is needed in order for
+            a test to run. Multiple itemss may be given,
+            separated by a comma.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.IncludeExcludeAttribute.Exclude">
+            <summary>
+            Name of the item to be excluded. Multiple items
+            may be given, separated by a comma.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.IncludeExcludeAttribute.Reason">
+            <summary>
+            The reason for including or excluding the test
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.PlatformAttribute">
+            <summary>
+            PlatformAttribute is used to mark a test fixture or an
+            individual method as applying to a particular platform only.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.PlatformAttribute.#ctor">
+            <summary>
+            Constructor with no platforms specified, for use
+            with named property syntax.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.PlatformAttribute.#ctor(System.String)">
+            <summary>
+            Constructor taking one or more platforms
+            </summary>
+            <param name="platforms">Comma-deliminted list of platforms</param>
+        </member>
+        <member name="T:NUnit.Framework.CultureAttribute">
+            <summary>
+            CultureAttribute is used to mark a test fixture or an
+            individual method as applying to a particular Culture only.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.CultureAttribute.#ctor">
+            <summary>
+            Constructor with no cultures specified, for use
+            with named property syntax.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.CultureAttribute.#ctor(System.String)">
+            <summary>
+            Constructor taking one or more cultures
+            </summary>
+            <param name="cultures">Comma-deliminted list of cultures</param>
+        </member>
+        <member name="T:NUnit.Framework.CombinatorialAttribute">
+            <summary>
+            Marks a test to use a combinatorial join of any argument data 
+            provided. NUnit will create a test case for every combination of 
+            the arguments provided. This can result in a large number of test
+            cases and so should be used judiciously. This is the default join
+            type, so the attribute need not be used except as documentation.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.PropertyAttribute">
+            <summary>
+            PropertyAttribute is used to attach information to a test as a name/value pair..
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.PropertyAttribute.#ctor(System.String,System.String)">
+            <summary>
+            Construct a PropertyAttribute with a name and string value
+            </summary>
+            <param name="propertyName">The name of the property</param>
+            <param name="propertyValue">The property value</param>
+        </member>
+        <member name="M:NUnit.Framework.PropertyAttribute.#ctor(System.String,System.Int32)">
+            <summary>
+            Construct a PropertyAttribute with a name and int value
+            </summary>
+            <param name="propertyName">The name of the property</param>
+            <param name="propertyValue">The property value</param>
+        </member>
+        <member name="M:NUnit.Framework.PropertyAttribute.#ctor(System.String,System.Double)">
+            <summary>
+            Construct a PropertyAttribute with a name and double value
+            </summary>
+            <param name="propertyName">The name of the property</param>
+            <param name="propertyValue">The property value</param>
+        </member>
+        <member name="M:NUnit.Framework.PropertyAttribute.#ctor">
+            <summary>
+            Constructor for derived classes that set the
+            property dictionary directly.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.PropertyAttribute.#ctor(System.Object)">
+            <summary>
+            Constructor for use by derived classes that use the
+            name of the type as the property name. Derived classes
+            must ensure that the Type of the property value is
+            a standard type supported by the BCL. Any custom
+            types will cause a serialization Exception when
+            in the client.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.PropertyAttribute.Properties">
+            <summary>
+            Gets the property dictionary for this attribute
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.CombinatorialAttribute.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.PairwiseAttribute">
+            <summary>
+            Marks a test to use pairwise join of any argument data provided. 
+            NUnit will attempt too excercise every pair of argument values at 
+            least once, using as small a number of test cases as it can. With
+            only two arguments, this is the same as a combinatorial join.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.PairwiseAttribute.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.SequentialAttribute">
+            <summary>
+            Marks a test to use a sequential join of any argument data
+            provided. NUnit will use arguements for each parameter in
+            sequence, generating test cases up to the largest number
+            of argument values provided and using null for any arguments
+            for which it runs out of values. Normally, this should be
+            used with the same number of arguments for each parameter.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.SequentialAttribute.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.MaxTimeAttribute">
+            <summary>
+            Summary description for MaxTimeAttribute.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.MaxTimeAttribute.#ctor(System.Int32)">
+            <summary>
+            Construct a MaxTimeAttribute, given a time in milliseconds.
+            </summary>
+            <param name="milliseconds">The maximum elapsed time in milliseconds</param>
+        </member>
+        <member name="T:NUnit.Framework.RandomAttribute">
+            <summary>
+            RandomAttribute is used to supply a set of random values
+            to a single parameter of a parameterized test.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.ValuesAttribute">
+            <summary>
+            ValuesAttribute is used to provide literal arguments for
+            an individual parameter of a test.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.ParameterDataAttribute">
+            <summary>
+            Abstract base class for attributes that apply to parameters 
+            and supply data for the parameter.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.ParameterDataAttribute.GetData(System.Reflection.ParameterInfo)">
+            <summary>
+            Gets the data to be provided to the specified parameter
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.ValuesAttribute.data">
+            <summary>
+            The collection of data to be returned. Must
+            be set by any derived attribute classes.
+            We use an object[] so that the individual
+            elements may have their type changed in GetData
+            if necessary.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.ValuesAttribute.#ctor(System.Object)">
+            <summary>
+            Construct with one argument
+            </summary>
+            <param name="arg1"></param>
+        </member>
+        <member name="M:NUnit.Framework.ValuesAttribute.#ctor(System.Object,System.Object)">
+            <summary>
+            Construct with two arguments
+            </summary>
+            <param name="arg1"></param>
+            <param name="arg2"></param>
+        </member>
+        <member name="M:NUnit.Framework.ValuesAttribute.#ctor(System.Object,System.Object,System.Object)">
+            <summary>
+            Construct with three arguments
+            </summary>
+            <param name="arg1"></param>
+            <param name="arg2"></param>
+            <param name="arg3"></param>
+        </member>
+        <member name="M:NUnit.Framework.ValuesAttribute.#ctor(System.Object[])">
+            <summary>
+            Construct with an array of arguments
+            </summary>
+            <param name="args"></param>
+        </member>
+        <member name="M:NUnit.Framework.ValuesAttribute.GetData(System.Reflection.ParameterInfo)">
+            <summary>
+            Get the collection of values to be used as arguments
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.RandomAttribute.#ctor(System.Int32)">
+            <summary>
+            Construct a set of doubles from 0.0 to 1.0,
+            specifying only the count.
+            </summary>
+            <param name="count"></param>
+        </member>
+        <member name="M:NUnit.Framework.RandomAttribute.#ctor(System.Double,System.Double,System.Int32)">
+            <summary>
+            Construct a set of doubles from min to max
+            </summary>
+            <param name="min"></param>
+            <param name="max"></param>
+            <param name="count"></param>
+        </member>
+        <member name="M:NUnit.Framework.RandomAttribute.#ctor(System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Construct a set of ints from min to max
+            </summary>
+            <param name="min"></param>
+            <param name="max"></param>
+            <param name="count"></param>
+        </member>
+        <member name="M:NUnit.Framework.RandomAttribute.GetData(System.Reflection.ParameterInfo)">
+            <summary>
+            Get the collection of values to be used as arguments
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.RangeAttribute">
+            <summary>
+            RangeAttribute is used to supply a range of values to an
+            individual parameter of a parameterized test.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.RangeAttribute.#ctor(System.Int32,System.Int32)">
+            <summary>
+            Construct a range of ints using default step of 1
+            </summary>
+            <param name="from"></param>
+            <param name="to"></param>
+        </member>
+        <member name="M:NUnit.Framework.RangeAttribute.#ctor(System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Construct a range of ints specifying the step size 
+            </summary>
+            <param name="from"></param>
+            <param name="to"></param>
+            <param name="step"></param>
+        </member>
+        <member name="M:NUnit.Framework.RangeAttribute.#ctor(System.Int64,System.Int64,System.Int64)">
+            <summary>
+            Construct a range of longs
+            </summary>
+            <param name="from"></param>
+            <param name="to"></param>
+            <param name="step"></param>
+        </member>
+        <member name="M:NUnit.Framework.RangeAttribute.#ctor(System.Double,System.Double,System.Double)">
+            <summary>
+            Construct a range of doubles
+            </summary>
+            <param name="from"></param>
+            <param name="to"></param>
+            <param name="step"></param>
+        </member>
+        <member name="M:NUnit.Framework.RangeAttribute.#ctor(System.Single,System.Single,System.Single)">
+            <summary>
+            Construct a range of floats
+            </summary>
+            <param name="from"></param>
+            <param name="to"></param>
+            <param name="step"></param>
+        </member>
+        <member name="T:NUnit.Framework.RepeatAttribute">
+            <summary>
+            RepeatAttribute may be applied to test case in order
+            to run it multiple times.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.RepeatAttribute.#ctor(System.Int32)">
+            <summary>
+            Construct a RepeatAttribute
+            </summary>
+            <param name="count">The number of times to run the test</param>
+        </member>
+        <member name="T:NUnit.Framework.RequiredAddinAttribute">
+            <summary>
+            RequiredAddinAttribute may be used to indicate the names of any addins
+            that must be present in order to run some or all of the tests in an
+            assembly. If the addin is not loaded, the entire assembly is marked
+            as NotRunnable.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.RequiredAddinAttribute.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:RequiredAddinAttribute"/> class.
+            </summary>
+            <param name="requiredAddin">The required addin.</param>
+        </member>
+        <member name="P:NUnit.Framework.RequiredAddinAttribute.RequiredAddin">
+            <summary>
+            Gets the name of required addin.
+            </summary>
+            <value>The required addin name.</value>
+        </member>
+        <member name="T:NUnit.Framework.SetCultureAttribute">
+            <summary>
+            Summary description for SetCultureAttribute.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.SetCultureAttribute.#ctor(System.String)">
+            <summary>
+            Construct given the name of a culture
+            </summary>
+            <param name="culture"></param>
+        </member>
+        <member name="T:NUnit.Framework.SetUICultureAttribute">
+            <summary>
+            Summary description for SetUICultureAttribute.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.SetUICultureAttribute.#ctor(System.String)">
+            <summary>
+            Construct given the name of a culture
+            </summary>
+            <param name="culture"></param>
+        </member>
+        <member name="T:NUnit.Framework.SetUpAttribute">
+            <summary>
+            SetUpAttribute is used in a TestFixture to identify a method
+            that is called immediately before each test is run. It is 
+            also used in a SetUpFixture to identify the method that is
+            called once, before any of the subordinate tests are run.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.SetUpFixtureAttribute">
+            <summary>
+            Attribute used to mark a class that contains one-time SetUp 
+            and/or TearDown methods that apply to all the tests in a
+            namespace or an assembly.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.SuiteAttribute">
+            <summary>
+            Attribute used to mark a static (shared in VB) property
+            that returns a list of tests.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TearDownAttribute">
+            <summary>
+            Attribute used in a TestFixture to identify a method that is 
+            called immediately after each test is run. It is also used
+            in a SetUpFixture to identify the method that is called once,
+            after all subordinate tests have run. In either case, the method 
+            is guaranteed to be called, even if an exception is thrown.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TestActionAttribute">
+            <summary>
+            Provide actions to execute before and after tests.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.ITestAction">
+            <summary>
+            When implemented by an attribute, this interface implemented to provide actions to execute before and after tests.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.ITestAction.BeforeTest(NUnit.Framework.TestDetails)">
+            <summary>
+            Executed before each test is run
+            </summary>
+            <param name="testDetails">Provides details about the test that is going to be run.</param>
+        </member>
+        <member name="M:NUnit.Framework.ITestAction.AfterTest(NUnit.Framework.TestDetails)">
+            <summary>
+            Executed after each test is run
+            </summary>
+            <param name="testDetails">Provides details about the test that has just been run.</param>
+        </member>
+        <member name="P:NUnit.Framework.ITestAction.Targets">
+            <summary>
+            Provides the target for the action attribute
+            </summary>
+            <returns>The target for the action attribute</returns>
+        </member>
+        <member name="T:NUnit.Framework.TestAttribute">
+            <summary>
+            Adding this attribute to a method within a <seealso cref="T:NUnit.Framework.TestFixtureAttribute"/> 
+            class makes the method callable from the NUnit test runner. There is a property 
+            called Description which is optional which you can provide a more detailed test
+            description. This class cannot be inherited.
+            </summary>
+            
+            <example>
+            [TestFixture]
+            public class Fixture
+            {
+              [Test]
+              public void MethodToTest()
+              {}
+              
+              [Test(Description = "more detailed description")]
+              publc void TestDescriptionMethod()
+              {}
+            }
+            </example>
+            
+        </member>
+        <member name="P:NUnit.Framework.TestAttribute.Description">
+            <summary>
+            Descriptive text for this test
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TestCaseAttribute">
+            <summary>
+            TestCaseAttribute is used to mark parameterized test cases
+            and provide them with their arguments.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseAttribute.#ctor(System.Object[])">
+            <summary>
+            Construct a TestCaseAttribute with a list of arguments.
+            This constructor is not CLS-Compliant
+            </summary>
+            <param name="arguments"></param>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseAttribute.#ctor(System.Object)">
+            <summary>
+            Construct a TestCaseAttribute with a single argument
+            </summary>
+            <param name="arg"></param>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseAttribute.#ctor(System.Object,System.Object)">
+            <summary>
+            Construct a TestCaseAttribute with a two arguments
+            </summary>
+            <param name="arg1"></param>
+            <param name="arg2"></param>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseAttribute.#ctor(System.Object,System.Object,System.Object)">
+            <summary>
+            Construct a TestCaseAttribute with a three arguments
+            </summary>
+            <param name="arg1"></param>
+            <param name="arg2"></param>
+            <param name="arg3"></param>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.Arguments">
+            <summary>
+            Gets the list of arguments to a test case
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.Result">
+            <summary>
+            Gets or sets the expected result. Use
+            ExpectedResult by preference.
+            </summary>
+            <value>The result.</value>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.ExpectedResult">
+            <summary>
+            Gets or sets the expected result.
+            </summary>
+            <value>The result.</value>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.HasExpectedResult">
+            <summary>
+            Gets a flag indicating whether an expected
+            result has been set.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.Categories">
+            <summary>
+            Gets a list of categories associated with this test;
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.Category">
+            <summary>
+            Gets or sets the category associated with this test.
+            May be a single category or a comma-separated list.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.ExpectedException">
+            <summary>
+            Gets or sets the expected exception.
+            </summary>
+            <value>The expected exception.</value>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.ExpectedExceptionName">
+            <summary>
+            Gets or sets the name the expected exception.
+            </summary>
+            <value>The expected name of the exception.</value>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.ExpectedMessage">
+            <summary>
+            Gets or sets the expected message of the expected exception
+            </summary>
+            <value>The expected message of the exception.</value>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.MatchType">
+            <summary>
+             Gets or sets the type of match to be performed on the expected message
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.Description">
+            <summary>
+            Gets or sets the description.
+            </summary>
+            <value>The description.</value>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.TestName">
+            <summary>
+            Gets or sets the name of the test.
+            </summary>
+            <value>The name of the test.</value>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.Ignore">
+            <summary>
+            Gets or sets the ignored status of the test
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.Ignored">
+            <summary>
+            Gets or sets the ignored status of the test
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.Explicit">
+            <summary>
+            Gets or sets the explicit status of the test
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.Reason">
+            <summary>
+            Gets or sets the reason for not running the test
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseAttribute.IgnoreReason">
+            <summary>
+            Gets or sets the reason for not running the test.
+            Set has the side effect of marking the test as ignored.
+            </summary>
+            <value>The ignore reason.</value>
+        </member>
+        <member name="T:NUnit.Framework.TestCaseSourceAttribute">
+            <summary>
+            FactoryAttribute indicates the source to be used to
+            provide test cases for a test method.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseSourceAttribute.#ctor(System.String)">
+            <summary>
+            Construct with the name of the data source, which must
+            be a property, field or method of the test class itself.
+            </summary>
+            <param name="sourceName">An array of the names of the factories that will provide data</param>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseSourceAttribute.#ctor(System.Type)">
+            <summary>
+            Construct with a Type, which must implement IEnumerable
+            </summary>
+            <param name="sourceType">The Type that will provide data</param>
+        </member>
+        <member name="M:NUnit.Framework.TestCaseSourceAttribute.#ctor(System.Type,System.String)">
+            <summary>
+            Construct with a Type and name.
+            that don't support params arrays.
+            </summary>
+            <param name="sourceType">The Type that will provide data</param>
+            <param name="sourceName">The name of the method, property or field that will provide data</param>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseSourceAttribute.SourceName">
+            <summary>
+            The name of a the method, property or fiend to be used as a source
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseSourceAttribute.SourceType">
+            <summary>
+            A Type to be used as a source
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestCaseSourceAttribute.Category">
+            <summary>
+            Gets or sets the category associated with this test.
+            May be a single category or a comma-separated list.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TestFixtureAttribute">
+            <example>
+            [TestFixture]
+            public class ExampleClass 
+            {}
+            </example>
+        </member>
+        <member name="M:NUnit.Framework.TestFixtureAttribute.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.TestFixtureAttribute.#ctor(System.Object[])">
+            <summary>
+            Construct with a object[] representing a set of arguments. 
+            In .NET 2.0, the arguments may later be separated into
+            type arguments and constructor arguments.
+            </summary>
+            <param name="arguments"></param>
+        </member>
+        <member name="P:NUnit.Framework.TestFixtureAttribute.Description">
+            <summary>
+            Descriptive text for this fixture
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestFixtureAttribute.Category">
+            <summary>
+            Gets and sets the category for this fixture.
+            May be a comma-separated list of categories.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestFixtureAttribute.Categories">
+            <summary>
+            Gets a list of categories for this fixture
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestFixtureAttribute.Arguments">
+            <summary>
+            The arguments originally provided to the attribute
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.TestFixtureAttribute.Ignore">
+            <summary>
+            Gets or sets a value indicating whether this <see cref="T:NUnit.Framework.TestFixtureAttribute"/> should be ignored.
+            </summary>
+            <value><c>true</c> if ignore; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:NUnit.Framework.TestFixtureAttribute.IgnoreReason">
+            <summary>
+            Gets or sets the ignore reason. May set Ignored as a side effect.
+            </summary>
+            <value>The ignore reason.</value>
+        </member>
+        <member name="P:NUnit.Framework.TestFixtureAttribute.TypeArgs">
+            <summary>
+            Get or set the type arguments. If not set
+            explicitly, any leading arguments that are
+            Types are taken as type arguments.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TestFixtureSetUpAttribute">
+            <summary>
+            Attribute used to identify a method that is 
+            called before any tests in a fixture are run.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TestFixtureTearDownAttribute">
+            <summary>
+            Attribute used to identify a method that is called after
+            all the tests in a fixture have run. The method is 
+            guaranteed to be called, even if an exception is thrown.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.TheoryAttribute">
+            <summary>
+            Adding this attribute to a method within a <seealso cref="T:NUnit.Framework.TestFixtureAttribute"/> 
+            class makes the method callable from the NUnit test runner. There is a property 
+            called Description which is optional which you can provide a more detailed test
+            description. This class cannot be inherited.
+            </summary>
+            
+            <example>
+            [TestFixture]
+            public class Fixture
+            {
+              [Test]
+              public void MethodToTest()
+              {}
+              
+              [Test(Description = "more detailed description")]
+              publc void TestDescriptionMethod()
+              {}
+            }
+            </example>
+            
+        </member>
+        <member name="T:NUnit.Framework.TimeoutAttribute">
+            <summary>
+            Used on a method, marks the test with a timeout value in milliseconds. 
+            The test will be run in a separate thread and is cancelled if the timeout 
+            is exceeded. Used on a method or assembly, sets the default timeout 
+            for all contained test methods.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.TimeoutAttribute.#ctor(System.Int32)">
+            <summary>
+            Construct a TimeoutAttribute given a time in milliseconds
+            </summary>
+            <param name="timeout">The timeout value in milliseconds</param>
+        </member>
+        <member name="T:NUnit.Framework.RequiresSTAAttribute">
+            <summary>
+            Marks a test that must run in the STA, causing it
+            to run in a separate thread if necessary.
+            
+            On methods, you may also use STAThreadAttribute
+            to serve the same purpose.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.RequiresSTAAttribute.#ctor">
+            <summary>
+            Construct a RequiresSTAAttribute
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.RequiresMTAAttribute">
+            <summary>
+            Marks a test that must run in the MTA, causing it
+            to run in a separate thread if necessary.
+            
+            On methods, you may also use MTAThreadAttribute
+            to serve the same purpose.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.RequiresMTAAttribute.#ctor">
+            <summary>
+            Construct a RequiresMTAAttribute
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.RequiresThreadAttribute">
+            <summary>
+            Marks a test that must run on a separate thread.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.RequiresThreadAttribute.#ctor">
+            <summary>
+            Construct a RequiresThreadAttribute
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.RequiresThreadAttribute.#ctor(System.Threading.ApartmentState)">
+            <summary>
+            Construct a RequiresThreadAttribute, specifying the apartment
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.ValueSourceAttribute">
+            <summary>
+            ValueSourceAttribute indicates the source to be used to
+            provide data for one parameter of a test method.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.ValueSourceAttribute.#ctor(System.String)">
+            <summary>
+            Construct with the name of the factory - for use with languages
+            that don't support params arrays.
+            </summary>
+            <param name="sourceName">The name of the data source to be used</param>
+        </member>
+        <member name="M:NUnit.Framework.ValueSourceAttribute.#ctor(System.Type,System.String)">
+            <summary>
+            Construct with a Type and name - for use with languages
+            that don't support params arrays.
+            </summary>
+            <param name="sourceType">The Type that will provide data</param>
+            <param name="sourceName">The name of the method, property or field that will provide data</param>
+        </member>
+        <member name="P:NUnit.Framework.ValueSourceAttribute.SourceName">
+            <summary>
+            The name of a the method, property or fiend to be used as a source
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.ValueSourceAttribute.SourceType">
+            <summary>
+            A Type to be used as a source
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.AllItemsConstraint">
+            <summary>
+            AllItemsConstraint applies another constraint to each
+            item in a collection, succeeding if they all succeed.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.PrefixConstraint">
+            <summary>
+            Abstract base class used for prefixes
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.Constraint">
+            <summary>
+            The Constraint class is the base of all built-in constraints
+            within NUnit. It provides the operator overloads used to combine 
+            constraints.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.IResolveConstraint">
+            <summary>
+            The IConstraintExpression interface is implemented by all
+            complete and resolvable constraints and expressions.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.IResolveConstraint.Resolve">
+            <summary>
+            Return the top-level constraint for this expression
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.Constraint.UNSET">
+            <summary>
+            Static UnsetObject used to detect derived constraints
+            failing to set the actual value.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.Constraint.actual">
+            <summary>
+            The actual value being tested against a constraint
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.Constraint.displayName">
+            <summary>
+            The display name of this Constraint for use by ToString()
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.Constraint.argcnt">
+            <summary>
+            Argument fields used by ToString();
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.Constraint.builder">
+            <summary>
+            The builder holding this constraint
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.#ctor">
+            <summary>
+            Construct a constraint with no arguments
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.#ctor(System.Object)">
+            <summary>
+            Construct a constraint with one argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.#ctor(System.Object,System.Object)">
+            <summary>
+            Construct a constraint with two arguments
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.SetBuilder(NUnit.Framework.Constraints.ConstraintBuilder)">
+            <summary>
+            Sets the ConstraintBuilder holding this constraint
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.WriteMessageTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the failure message to the MessageWriter provided
+            as an argument. The default implementation simply passes
+            the constraint and the actual value to the writer, which
+            then displays the constraint description and the value.
+            
+            Constraints that need to provide additional details,
+            such as where the error occured can override this.
+            </summary>
+            <param name="writer">The MessageWriter on which to display the message</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.Matches(System.Object)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.Matches``1(NUnit.Framework.Constraints.ActualValueDelegate{``0})">
+            <summary>
+            Test whether the constraint is satisfied by an
+            ActualValueDelegate that returns the value to be tested.
+            The default implementation simply evaluates the delegate
+            but derived classes may override it to provide for delayed 
+            processing.
+            </summary>
+            <param name="del">An <see cref="T:NUnit.Framework.Constraints.ActualValueDelegate`1"/></param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.Matches``1(``0@)">
+            <summary>
+            Test whether the constraint is satisfied by a given reference.
+            The default implementation simply dereferences the value but
+            derived classes may override it to provide for delayed processing.
+            </summary>
+            <param name="actual">A reference to the value to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the actual value for a failing constraint test to a
+            MessageWriter. The default implementation simply writes
+            the raw value of actual, leaving it to the writer to
+            perform any formatting.
+            </summary>
+            <param name="writer">The writer on which the actual value is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.ToString">
+            <summary>
+            Default override of ToString returns the constraint DisplayName
+            followed by any arguments within angle brackets.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.GetStringRepresentation">
+            <summary>
+            Returns the string representation of this constraint
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.op_BitwiseAnd(NUnit.Framework.Constraints.Constraint,NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            This operator creates a constraint that is satisfied only if both 
+            argument constraints are satisfied.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.op_BitwiseOr(NUnit.Framework.Constraints.Constraint,NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            This operator creates a constraint that is satisfied if either 
+            of the argument constraints is satisfied.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.op_LogicalNot(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            This operator creates a constraint that is satisfied if the 
+            argument constraint is not satisfied.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.After(System.Int32)">
+            <summary>
+            Returns a DelayedConstraint with the specified delay time.
+            </summary>
+            <param name="delayInMilliseconds">The delay in milliseconds.</param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Constraint.After(System.Int32,System.Int32)">
+            <summary>
+            Returns a DelayedConstraint with the specified delay time
+            and polling interval.
+            </summary>
+            <param name="delayInMilliseconds">The delay in milliseconds.</param>
+            <param name="pollingInterval">The interval at which to test the constraint.</param>
+            <returns></returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Constraint.DisplayName">
+            <summary>
+            The display name of this Constraint for use by ToString().
+            The default value is the name of the constraint with
+            trailing "Constraint" removed. Derived classes may set
+            this to another name in their constructors.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Constraint.And">
+            <summary>
+            Returns a ConstraintExpression by appending And
+            to the current constraint.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Constraint.With">
+            <summary>
+            Returns a ConstraintExpression by appending And
+            to the current constraint.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Constraint.Or">
+            <summary>
+            Returns a ConstraintExpression by appending Or
+            to the current constraint.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.Constraint.UnsetObject">
+            <summary>
+            Class used to detect any derived constraints
+            that fail to set the actual value in their
+            Matches override.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.PrefixConstraint.baseConstraint">
+            <summary>
+            The base constraint
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PrefixConstraint.#ctor(NUnit.Framework.Constraints.IResolveConstraint)">
+            <summary>
+            Construct given a base constraint
+            </summary>
+            <param name="resolvable"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AllItemsConstraint.#ctor(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Construct an AllItemsConstraint on top of an existing constraint
+            </summary>
+            <param name="itemConstraint"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AllItemsConstraint.Matches(System.Object)">
+            <summary>
+            Apply the item constraint to each item in the collection,
+            failing if any item fails.
+            </summary>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AllItemsConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a description of this constraint to a MessageWriter
+            </summary>
+            <param name="writer"></param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.AndConstraint">
+            <summary>
+            AndConstraint succeeds only if both members succeed.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.BinaryConstraint">
+            <summary>
+            BinaryConstraint is the abstract base of all constraints
+            that combine two other constraints in some fashion.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.BinaryConstraint.left">
+            <summary>
+            The first constraint being combined
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.BinaryConstraint.right">
+            <summary>
+            The second constraint being combined
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.BinaryConstraint.#ctor(NUnit.Framework.Constraints.Constraint,NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Construct a BinaryConstraint from two other constraints
+            </summary>
+            <param name="left">The first constraint</param>
+            <param name="right">The second constraint</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AndConstraint.#ctor(NUnit.Framework.Constraints.Constraint,NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Create an AndConstraint from two other constraints
+            </summary>
+            <param name="left">The first constraint</param>
+            <param name="right">The second constraint</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AndConstraint.Matches(System.Object)">
+            <summary>
+            Apply both member constraints to an actual value, succeeding 
+            succeeding only if both of them succeed.
+            </summary>
+            <param name="actual">The actual value</param>
+            <returns>True if the constraints both succeeded</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AndConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a description for this contraint to a MessageWriter
+            </summary>
+            <param name="writer">The MessageWriter to receive the description</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AndConstraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the actual value for a failing constraint test to a
+            MessageWriter. The default implementation simply writes
+            the raw value of actual, leaving it to the writer to
+            perform any formatting.
+            </summary>
+            <param name="writer">The writer on which the actual value is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.AssignableFromConstraint">
+            <summary>
+            AssignableFromConstraint is used to test that an object
+            can be assigned from a given Type.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.TypeConstraint">
+            <summary>
+            TypeConstraint is the abstract base for constraints
+            that take a Type as their expected value.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.TypeConstraint.expectedType">
+            <summary>
+            The expected Type used by the constraint
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.TypeConstraint.#ctor(System.Type)">
+            <summary>
+            Construct a TypeConstraint for a given Type
+            </summary>
+            <param name="type"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.TypeConstraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the actual value for a failing constraint test to a
+            MessageWriter. TypeConstraints override this method to write
+            the name of the type.
+            </summary>
+            <param name="writer">The writer on which the actual value is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AssignableFromConstraint.#ctor(System.Type)">
+            <summary>
+            Construct an AssignableFromConstraint for the type provided
+            </summary>
+            <param name="type"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AssignableFromConstraint.Matches(System.Object)">
+            <summary>
+            Test whether an object can be assigned from the specified type
+            </summary>
+            <param name="actual">The object to be tested</param>
+            <returns>True if the object can be assigned a value of the expected Type, otherwise false.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AssignableFromConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a description of this constraint to a MessageWriter
+            </summary>
+            <param name="writer">The MessageWriter to use</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.AssignableToConstraint">
+            <summary>
+            AssignableToConstraint is used to test that an object
+            can be assigned to a given Type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AssignableToConstraint.#ctor(System.Type)">
+            <summary>
+            Construct an AssignableToConstraint for the type provided
+            </summary>
+            <param name="type"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AssignableToConstraint.Matches(System.Object)">
+            <summary>
+            Test whether an object can be assigned to the specified type
+            </summary>
+            <param name="actual">The object to be tested</param>
+            <returns>True if the object can be assigned a value of the expected Type, otherwise false.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AssignableToConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a description of this constraint to a MessageWriter
+            </summary>
+            <param name="writer">The MessageWriter to use</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.AttributeConstraint">
+            <summary>
+            AttributeConstraint tests that a specified attribute is present
+            on a Type or other provider and that the value of the attribute
+            satisfies some other constraint.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AttributeConstraint.#ctor(System.Type,NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Constructs an AttributeConstraint for a specified attriute
+            Type and base constraint.
+            </summary>
+            <param name="type"></param>
+            <param name="baseConstraint"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AttributeConstraint.Matches(System.Object)">
+            <summary>
+            Determines whether the Type or other provider has the 
+            expected attribute and if its value matches the
+            additional constraint specified.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AttributeConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Writes a description of the attribute to the specified writer.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AttributeConstraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Writes the actual value supplied to the specified writer.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AttributeConstraint.GetStringRepresentation">
+            <summary>
+            Returns a string representation of the constraint.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.AttributeExistsConstraint">
+            <summary>
+            AttributeExistsConstraint tests for the presence of a
+            specified attribute on  a Type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AttributeExistsConstraint.#ctor(System.Type)">
+            <summary>
+            Constructs an AttributeExistsConstraint for a specific attribute Type
+            </summary>
+            <param name="type"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AttributeExistsConstraint.Matches(System.Object)">
+            <summary>
+            Tests whether the object provides the expected attribute.
+            </summary>
+            <param name="actual">A Type, MethodInfo, or other ICustomAttributeProvider</param>
+            <returns>True if the expected attribute is present, otherwise false</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AttributeExistsConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Writes the description of the constraint to the specified writer
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.BasicConstraint">
+            <summary>
+            BasicConstraint is the abstract base for constraints that
+            perform a simple comparison to a constant value.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.BasicConstraint.#ctor(System.Object,System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:BasicConstraint"/> class.
+            </summary>
+            <param name="expected">The expected.</param>
+            <param name="description">The description.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.BasicConstraint.Matches(System.Object)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.BasicConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.BinarySerializableConstraint">
+            <summary>
+            BinarySerializableConstraint tests whether 
+            an object is serializable in binary format.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.BinarySerializableConstraint.Matches(System.Object)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.BinarySerializableConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.BinarySerializableConstraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the actual value for a failing constraint test to a
+            MessageWriter. The default implementation simply writes
+            the raw value of actual, leaving it to the writer to
+            perform any formatting.
+            </summary>
+            <param name="writer">The writer on which the actual value is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.BinarySerializableConstraint.GetStringRepresentation">
+            <summary>
+            Returns the string representation
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.CollectionConstraint">
+            <summary>
+            CollectionConstraint is the abstract base class for
+            constraints that operate on collections.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionConstraint.#ctor">
+            <summary>
+            Construct an empty CollectionConstraint
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionConstraint.#ctor(System.Object)">
+            <summary>
+            Construct a CollectionConstraint
+            </summary>
+            <param name="arg"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionConstraint.IsEmpty(System.Collections.IEnumerable)">
+            <summary>
+            Determines whether the specified enumerable is empty.
+            </summary>
+            <param name="enumerable">The enumerable.</param>
+            <returns>
+            	<c>true</c> if the specified enumerable is empty; otherwise, <c>false</c>.
+            </returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionConstraint.Matches(System.Object)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionConstraint.doMatch(System.Collections.IEnumerable)">
+            <summary>
+            Protected method to be implemented by derived classes
+            </summary>
+            <param name="collection"></param>
+            <returns></returns>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.CollectionContainsConstraint">
+            <summary>
+            CollectionContainsConstraint is used to test whether a collection
+            contains an expected object as a member.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.CollectionItemsEqualConstraint">
+            <summary>
+            CollectionItemsEqualConstraint is the abstract base class for all
+            collection constraints that apply some notion of item equality
+            as a part of their operation.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.#ctor">
+            <summary>
+            Construct an empty CollectionConstraint
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.#ctor(System.Object)">
+            <summary>
+            Construct a CollectionConstraint
+            </summary>
+            <param name="arg"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.Using(NUnit.Framework.Constraints.EqualityAdapter)">
+            <summary>
+            Flag the constraint to use the supplied EqualityAdapter.
+            NOTE: For internal use only.
+            </summary>
+            <param name="adapter">The EqualityAdapter to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.Using(System.Collections.IComparer)">
+            <summary>
+            Flag the constraint to use the supplied IComparer object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.Using``1(System.Collections.Generic.IComparer{``0})">
+            <summary>
+            Flag the constraint to use the supplied IComparer object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.Using``1(System.Comparison{``0})">
+            <summary>
+            Flag the constraint to use the supplied Comparison object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.Using(System.Collections.IEqualityComparer)">
+            <summary>
+            Flag the constraint to use the supplied IEqualityComparer object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.Using``1(System.Collections.Generic.IEqualityComparer{``0})">
+            <summary>
+            Flag the constraint to use the supplied IEqualityComparer object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.ItemsEqual(System.Object,System.Object)">
+            <summary>
+            Compares two collection members for equality
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.Tally(System.Collections.IEnumerable)">
+            <summary>
+            Return a new CollectionTally for use in making tests
+            </summary>
+            <param name="c">The collection to be included in the tally</param>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.CollectionItemsEqualConstraint.IgnoreCase">
+            <summary>
+            Flag the constraint to ignore case and return self.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionContainsConstraint.#ctor(System.Object)">
+            <summary>
+            Construct a CollectionContainsConstraint
+            </summary>
+            <param name="expected"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionContainsConstraint.doMatch(System.Collections.IEnumerable)">
+            <summary>
+            Test whether the expected item is contained in the collection
+            </summary>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionContainsConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a descripton of the constraint to a MessageWriter
+            </summary>
+            <param name="writer"></param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.CollectionEquivalentConstraint">
+            <summary>
+            CollectionEquivalentCOnstraint is used to determine whether two
+            collections are equivalent.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionEquivalentConstraint.#ctor(System.Collections.IEnumerable)">
+            <summary>
+            Construct a CollectionEquivalentConstraint
+            </summary>
+            <param name="expected"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionEquivalentConstraint.doMatch(System.Collections.IEnumerable)">
+            <summary>
+            Test whether two collections are equivalent
+            </summary>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionEquivalentConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a description of this constraint to a MessageWriter
+            </summary>
+            <param name="writer"></param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.CollectionOrderedConstraint">
+            <summary>
+            CollectionOrderedConstraint is used to test whether a collection is ordered.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionOrderedConstraint.#ctor">
+            <summary>
+            Construct a CollectionOrderedConstraint
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionOrderedConstraint.Using(System.Collections.IComparer)">
+            <summary>
+            Modifies the constraint to use an IComparer and returns self.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionOrderedConstraint.Using``1(System.Collections.Generic.IComparer{``0})">
+            <summary>
+            Modifies the constraint to use an IComparer&lt;T&gt; and returns self.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionOrderedConstraint.Using``1(System.Comparison{``0})">
+            <summary>
+            Modifies the constraint to use a Comparison&lt;T&gt; and returns self.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionOrderedConstraint.By(System.String)">
+            <summary>
+            Modifies the constraint to test ordering by the value of
+            a specified property and returns self.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionOrderedConstraint.doMatch(System.Collections.IEnumerable)">
+            <summary>
+            Test whether the collection is ordered
+            </summary>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionOrderedConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a description of the constraint to a MessageWriter
+            </summary>
+            <param name="writer"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionOrderedConstraint.GetStringRepresentation">
+            <summary>
+            Returns the string representation of the constraint.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.CollectionOrderedConstraint.Descending">
+            <summary>
+             If used performs a reverse comparison
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.CollectionSubsetConstraint">
+            <summary>
+            CollectionSubsetConstraint is used to determine whether
+            one collection is a subset of another
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionSubsetConstraint.#ctor(System.Collections.IEnumerable)">
+            <summary>
+            Construct a CollectionSubsetConstraint
+            </summary>
+            <param name="expected">The collection that the actual value is expected to be a subset of</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionSubsetConstraint.doMatch(System.Collections.IEnumerable)">
+            <summary>
+            Test whether the actual collection is a subset of 
+            the expected collection provided.
+            </summary>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionSubsetConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a description of this constraint to a MessageWriter
+            </summary>
+            <param name="writer"></param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.CollectionTally">
+            <summary>
+            CollectionTally counts (tallies) the number of
+            occurences of each object in one or more enumerations.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionTally.#ctor(NUnit.Framework.Constraints.NUnitEqualityComparer,System.Collections.IEnumerable)">
+            <summary>
+            Construct a CollectionTally object from a comparer and a collection
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionTally.TryRemove(System.Object)">
+            <summary>
+            Try to remove an object from the tally
+            </summary>
+            <param name="o">The object to remove</param>
+            <returns>True if successful, false if the object was not found</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionTally.TryRemove(System.Collections.IEnumerable)">
+            <summary>
+            Try to remove a set of objects from the tally
+            </summary>
+            <param name="c">The objects to remove</param>
+            <returns>True if successful, false if any object was not found</returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.CollectionTally.Count">
+            <summary>
+            The number of objects remaining in the tally
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ComparisonAdapter">
+            <summary>
+            ComparisonAdapter class centralizes all comparisons of
+            values in NUnit, adapting to the use of any provided
+            IComparer, IComparer&lt;T&gt; or Comparison&lt;T&gt;
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonAdapter.For(System.Collections.IComparer)">
+            <summary>
+            Returns a ComparisonAdapter that wraps an IComparer
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonAdapter.For``1(System.Collections.Generic.IComparer{``0})">
+            <summary>
+            Returns a ComparisonAdapter that wraps an IComparer&lt;T&gt;
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonAdapter.For``1(System.Comparison{``0})">
+            <summary>
+            Returns a ComparisonAdapter that wraps a Comparison&lt;T&gt;
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonAdapter.Compare(System.Object,System.Object)">
+            <summary>
+            Compares two objects
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ComparisonAdapter.Default">
+            <summary>
+            Gets the default ComparisonAdapter, which wraps an
+            NUnitComparer object.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonAdapter.ComparerAdapter.#ctor(System.Collections.IComparer)">
+            <summary>
+            Construct a ComparisonAdapter for an IComparer
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonAdapter.ComparerAdapter.Compare(System.Object,System.Object)">
+            <summary>
+            Compares two objects
+            </summary>
+            <param name="expected"></param>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonAdapter.DefaultComparisonAdapter.#ctor">
+            <summary>
+            Construct a default ComparisonAdapter
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ComparisonAdapter.ComparerAdapter`1">
+            <summary>
+            ComparisonAdapter&lt;T&gt; extends ComparisonAdapter and
+            allows use of an IComparer&lt;T&gt; or Comparison&lt;T&gt;
+            to actually perform the comparison.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonAdapter.ComparerAdapter`1.#ctor(System.Collections.Generic.IComparer{`0})">
+            <summary>
+            Construct a ComparisonAdapter for an IComparer&lt;T&gt;
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonAdapter.ComparerAdapter`1.Compare(System.Object,System.Object)">
+            <summary>
+            Compare a Type T to an object
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonAdapter.ComparisonAdapterForComparison`1.#ctor(System.Comparison{`0})">
+            <summary>
+            Construct a ComparisonAdapter for a Comparison&lt;T&gt;
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonAdapter.ComparisonAdapterForComparison`1.Compare(System.Object,System.Object)">
+            <summary>
+            Compare a Type T to an object
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ComparisonConstraint">
+            <summary>
+            Abstract base class for constraints that compare values to
+            determine if one is greater than, equal to or less than
+            the other. This class supplies the Using modifiers.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.ComparisonConstraint.comparer">
+            <summary>
+            ComparisonAdapter to be used in making the comparison
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonConstraint.#ctor(System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:ComparisonConstraint"/> class.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonConstraint.#ctor(System.Object,System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:ComparisonConstraint"/> class.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonConstraint.Using(System.Collections.IComparer)">
+            <summary>
+            Modifies the constraint to use an IComparer and returns self
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonConstraint.Using``1(System.Collections.Generic.IComparer{``0})">
+            <summary>
+            Modifies the constraint to use an IComparer&lt;T&gt; and returns self
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ComparisonConstraint.Using``1(System.Comparison{``0})">
+            <summary>
+            Modifies the constraint to use a Comparison&lt;T&gt; and returns self
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ActualValueDelegate`1">
+            <summary>
+            Delegate used to delay evaluation of the actual value
+            to be used in evaluating a constraint
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ConstraintBuilder">
+            <summary>
+            ConstraintBuilder maintains the stacks that are used in
+            processing a ConstraintExpression. An OperatorStack
+            is used to hold operators that are waiting for their
+            operands to be reognized. a ConstraintStack holds 
+            input constraints as well as the results of each
+            operator applied.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintBuilder.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:ConstraintBuilder"/> class.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintBuilder.Append(NUnit.Framework.Constraints.ConstraintOperator)">
+            <summary>
+            Appends the specified operator to the expression by first
+            reducing the operator stack and then pushing the new
+            operator on the stack.
+            </summary>
+            <param name="op">The operator to push.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintBuilder.Append(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Appends the specified constraint to the expresson by pushing
+            it on the constraint stack.
+            </summary>
+            <param name="constraint">The constraint to push.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintBuilder.SetTopOperatorRightContext(System.Object)">
+            <summary>
+            Sets the top operator right context.
+            </summary>
+            <param name="rightContext">The right context.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintBuilder.ReduceOperatorStack(System.Int32)">
+            <summary>
+            Reduces the operator stack until the topmost item
+            precedence is greater than or equal to the target precedence.
+            </summary>
+            <param name="targetPrecedence">The target precedence.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintBuilder.Resolve">
+            <summary>
+            Resolves this instance, returning a Constraint. If the builder
+            is not currently in a resolvable state, an exception is thrown.
+            </summary>
+            <returns>The resolved constraint</returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintBuilder.IsResolvable">
+            <summary>
+            Gets a value indicating whether this instance is resolvable.
+            </summary>
+            <value>
+            	<c>true</c> if this instance is resolvable; otherwise, <c>false</c>.
+            </value>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ConstraintBuilder.OperatorStack">
+            <summary>
+            OperatorStack is a type-safe stack for holding ConstraintOperators
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintBuilder.OperatorStack.#ctor(NUnit.Framework.Constraints.ConstraintBuilder)">
+            <summary>
+            Initializes a new instance of the <see cref="T:OperatorStack"/> class.
+            </summary>
+            <param name="builder">The builder.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintBuilder.OperatorStack.Push(NUnit.Framework.Constraints.ConstraintOperator)">
+            <summary>
+            Pushes the specified operator onto the stack.
+            </summary>
+            <param name="op">The op.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintBuilder.OperatorStack.Pop">
+            <summary>
+            Pops the topmost operator from the stack.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintBuilder.OperatorStack.Empty">
+            <summary>
+            Gets a value indicating whether this <see cref="T:OpStack"/> is empty.
+            </summary>
+            <value><c>true</c> if empty; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintBuilder.OperatorStack.Top">
+            <summary>
+            Gets the topmost operator without modifying the stack.
+            </summary>
+            <value>The top.</value>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack">
+            <summary>
+            ConstraintStack is a type-safe stack for holding Constraints
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack.#ctor(NUnit.Framework.Constraints.ConstraintBuilder)">
+            <summary>
+            Initializes a new instance of the <see cref="T:ConstraintStack"/> class.
+            </summary>
+            <param name="builder">The builder.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack.Push(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Pushes the specified constraint. As a side effect,
+            the constraint's builder field is set to the 
+            ConstraintBuilder owning this stack.
+            </summary>
+            <param name="constraint">The constraint.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack.Pop">
+            <summary>
+            Pops this topmost constrait from the stack.
+            As a side effect, the constraint's builder
+            field is set to null.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack.Empty">
+            <summary>
+            Gets a value indicating whether this <see cref="T:ConstraintStack"/> is empty.
+            </summary>
+            <value><c>true</c> if empty; otherwise, <c>false</c>.</value>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack.Top">
+            <summary>
+            Gets the topmost constraint without modifying the stack.
+            </summary>
+            <value>The topmost constraint</value>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ConstraintExpression">
+            <summary>
+            ConstraintExpression represents a compound constraint in the 
+            process of being constructed from a series of syntactic elements.
+            
+            Individual elements are appended to the expression as they are
+            reognized. Once an actual Constraint is appended, the expression
+            returns a resolvable Constraint.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ConstraintExpressionBase">
+            <summary>
+            ConstraintExpressionBase is the abstract base class for the 
+            ConstraintExpression class, which represents a 
+            compound constraint in the process of being constructed 
+            from a series of syntactic elements.
+            
+            NOTE: ConstraintExpressionBase is separate because the
+            ConstraintExpression class was generated in earlier
+            versions of NUnit. The two classes may be combined
+            in a future version.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.ConstraintExpressionBase.builder">
+            <summary>
+            The ConstraintBuilder holding the elements recognized so far
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpressionBase.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:ConstraintExpressionBase"/> class.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpressionBase.#ctor(NUnit.Framework.Constraints.ConstraintBuilder)">
+            <summary>
+            Initializes a new instance of the <see cref="T:ConstraintExpressionBase"/> 
+            class passing in a ConstraintBuilder, which may be pre-populated.
+            </summary>
+            <param name="builder">The builder.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpressionBase.ToString">
+            <summary>
+            Returns a string representation of the expression as it
+            currently stands. This should only be used for testing,
+            since it has the side-effect of resolving the expression.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpressionBase.Append(NUnit.Framework.Constraints.ConstraintOperator)">
+            <summary>
+            Appends an operator to the expression and returns the
+            resulting expression itself.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpressionBase.Append(NUnit.Framework.Constraints.SelfResolvingOperator)">
+            <summary>
+            Appends a self-resolving operator to the expression and
+            returns a new ResolvableConstraintExpression.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpressionBase.Append(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Appends a constraint to the expression and returns that
+            constraint, which is associated with the current state
+            of the expression being built.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:ConstraintExpression"/> class.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.#ctor(NUnit.Framework.Constraints.ConstraintBuilder)">
+            <summary>
+            Initializes a new instance of the <see cref="T:ConstraintExpression"/> 
+            class passing in a ConstraintBuilder, which may be pre-populated.
+            </summary>
+            <param name="builder">The builder.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.Exactly(System.Int32)">
+            <summary>
+            Returns a ConstraintExpression, which will apply
+            the following constraint to all members of a collection,
+            succeeding only if a specified number of them succeed.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.Property(System.String)">
+            <summary>
+            Returns a new PropertyConstraintExpression, which will either
+            test for the existence of the named property on the object
+            being tested or apply any following constraint to that property.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.Attribute(System.Type)">
+            <summary>
+            Returns a new AttributeConstraint checking for the
+            presence of a particular attribute on an object.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.Attribute``1">
+            <summary>
+            Returns a new AttributeConstraint checking for the
+            presence of a particular attribute on an object.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.Matches(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Returns the constraint provided as an argument - used to allow custom
+            custom constraints to easily participate in the syntax.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.Matches``1(System.Predicate{``0})">
+            <summary>
+            Returns the constraint provided as an argument - used to allow custom
+            custom constraints to easily participate in the syntax.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.EqualTo(System.Object)">
+            <summary>
+            Returns a constraint that tests two items for equality
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.SameAs(System.Object)">
+            <summary>
+            Returns a constraint that tests that two references are the same object
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.GreaterThan(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is greater than the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.GreaterThanOrEqualTo(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is greater than or equal to the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.AtLeast(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is greater than or equal to the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.LessThan(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is less than the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.LessThanOrEqualTo(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is less than or equal to the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.AtMost(System.Object)">
+            <summary>
+            Returns a constraint that tests whether the
+            actual value is less than or equal to the suppled argument
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.TypeOf(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual
+            value is of the exact type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.TypeOf``1">
+            <summary>
+            Returns a constraint that tests whether the actual
+            value is of the exact type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.InstanceOf(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is of the type supplied as an argument or a derived type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.InstanceOf``1">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is of the type supplied as an argument or a derived type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.InstanceOfType(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is of the type supplied as an argument or a derived type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.InstanceOfType``1">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is of the type supplied as an argument or a derived type.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.AssignableFrom(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is assignable from the type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.AssignableFrom``1">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is assignable from the type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.AssignableTo(System.Type)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is assignable from the type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.AssignableTo``1">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is assignable from the type supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.EquivalentTo(System.Collections.IEnumerable)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is a collection containing the same elements as the 
+            collection supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.SubsetOf(System.Collections.IEnumerable)">
+            <summary>
+            Returns a constraint that tests whether the actual value
+            is a subset of the collection supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.Member(System.Object)">
+            <summary>
+            Returns a new CollectionContainsConstraint checking for the
+            presence of a particular object in the collection.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.Contains(System.Object)">
+            <summary>
+            Returns a new CollectionContainsConstraint checking for the
+            presence of a particular object in the collection.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.Contains(System.String)">
+            <summary>
+            Returns a new ContainsConstraint. This constraint
+            will, in turn, make use of the appropriate second-level
+            constraint, depending on the type of the actual argument. 
+            This overload is only used if the item sought is a string,
+            since any other type implies that we are looking for a 
+            collection member.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.StringContaining(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value contains the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.ContainsSubstring(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value contains the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.StartsWith(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value starts with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.StringStarting(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value starts with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.EndsWith(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value ends with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.StringEnding(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value ends with the substring supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.Matches(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value matches the regular expression supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.StringMatching(System.String)">
+            <summary>
+            Returns a constraint that succeeds if the actual
+            value matches the regular expression supplied as an argument.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.SamePath(System.String)">
+            <summary>
+            Returns a constraint that tests whether the path provided 
+            is the same as an expected path after canonicalization.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.SubPath(System.String)">
+            <summary>
+            Returns a constraint that tests whether the path provided 
+            is the same path or under an expected path after canonicalization.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.SamePathOrUnder(System.String)">
+            <summary>
+            Returns a constraint that tests whether the path provided 
+            is the same path or under an expected path after canonicalization.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintExpression.InRange``1(``0,``0)">
+            <summary>
+            Returns a constraint that tests whether the actual value falls 
+            within a specified range.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.Not">
+            <summary>
+            Returns a ConstraintExpression that negates any
+            following constraint.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.No">
+            <summary>
+            Returns a ConstraintExpression that negates any
+            following constraint.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.All">
+            <summary>
+            Returns a ConstraintExpression, which will apply
+            the following constraint to all members of a collection,
+            succeeding if all of them succeed.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.Some">
+            <summary>
+            Returns a ConstraintExpression, which will apply
+            the following constraint to all members of a collection,
+            succeeding if at least one of them succeeds.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.None">
+            <summary>
+            Returns a ConstraintExpression, which will apply
+            the following constraint to all members of a collection,
+            succeeding if all of them fail.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.Length">
+            <summary>
+            Returns a new ConstraintExpression, which will apply the following
+            constraint to the Length property of the object being tested.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.Count">
+            <summary>
+            Returns a new ConstraintExpression, which will apply the following
+            constraint to the Count property of the object being tested.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.Message">
+            <summary>
+            Returns a new ConstraintExpression, which will apply the following
+            constraint to the Message property of the object being tested.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.InnerException">
+            <summary>
+            Returns a new ConstraintExpression, which will apply the following
+            constraint to the InnerException property of the object being tested.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.With">
+            <summary>
+            With is currently a NOP - reserved for future use.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.Null">
+            <summary>
+            Returns a constraint that tests for null
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.True">
+            <summary>
+            Returns a constraint that tests for True
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.False">
+            <summary>
+            Returns a constraint that tests for False
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.Positive">
+            <summary>
+            Returns a constraint that tests for a positive value
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.Negative">
+            <summary>
+            Returns a constraint that tests for a negative value
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.NaN">
+            <summary>
+            Returns a constraint that tests for NaN
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.Empty">
+            <summary>
+            Returns a constraint that tests for empty
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.Unique">
+            <summary>
+            Returns a constraint that tests whether a collection 
+            contains all unique items.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.BinarySerializable">
+            <summary>
+            Returns a constraint that tests whether an object graph is serializable in binary format.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.XmlSerializable">
+            <summary>
+            Returns a constraint that tests whether an object graph is serializable in xml format.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintExpression.Ordered">
+            <summary>
+            Returns a constraint that tests whether a collection is ordered
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ContainsConstraint">
+            <summary>
+            ContainsConstraint tests a whether a string contains a substring
+            or a collection contains an object. It postpones the decision of
+            which test to use until the type of the actual argument is known.
+            This allows testing whether a string is contained in a collection
+            or as a substring of another string using the same syntax.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ContainsConstraint.#ctor(System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:NUnit.Framework.Constraints.ContainsConstraint"/> class.
+            </summary>
+            <param name="expected">The expected.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ContainsConstraint.Matches(System.Object)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ContainsConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ContainsConstraint.Using(System.Collections.IComparer)">
+            <summary>
+            Flag the constraint to use the supplied IComparer object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ContainsConstraint.Using``1(System.Collections.Generic.IComparer{``0})">
+            <summary>
+            Flag the constraint to use the supplied IComparer object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ContainsConstraint.Using``1(System.Comparison{``0})">
+            <summary>
+            Flag the constraint to use the supplied Comparison object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ContainsConstraint.Using(System.Collections.IEqualityComparer)">
+            <summary>
+            Flag the constraint to use the supplied IEqualityComparer object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ContainsConstraint.Using``1(System.Collections.Generic.IEqualityComparer{``0})">
+            <summary>
+            Flag the constraint to use the supplied IEqualityComparer object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ContainsConstraint.IgnoreCase">
+            <summary>
+            Flag the constraint to ignore case and return self.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.DelayedConstraint">
+            <summary>
+             Applies a delay to the match so that a match can be evaluated in the future.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.DelayedConstraint.#ctor(NUnit.Framework.Constraints.Constraint,System.Int32)">
+            <summary>
+             Creates a new DelayedConstraint
+            </summary>
+            <param name="baseConstraint">The inner constraint two decorate</param>
+            <param name="delayInMilliseconds">The time interval after which the match is performed</param>
+            <exception cref="T:System.InvalidOperationException">If the value of <paramref name="delayInMilliseconds"/> is less than 0</exception>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.DelayedConstraint.#ctor(NUnit.Framework.Constraints.Constraint,System.Int32,System.Int32)">
+            <summary>
+             Creates a new DelayedConstraint
+            </summary>
+            <param name="baseConstraint">The inner constraint two decorate</param>
+            <param name="delayInMilliseconds">The time interval after which the match is performed</param>
+            <param name="pollingInterval">The time interval used for polling</param>
+            <exception cref="T:System.InvalidOperationException">If the value of <paramref name="delayInMilliseconds"/> is less than 0</exception>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.DelayedConstraint.Matches(System.Object)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True for if the base constraint fails, false if it succeeds</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.DelayedConstraint.Matches``1(NUnit.Framework.Constraints.ActualValueDelegate{``0})">
+            <summary>
+            Test whether the constraint is satisfied by a delegate
+            </summary>
+            <param name="del">The delegate whose value is to be tested</param>
+            <returns>True for if the base constraint fails, false if it succeeds</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.DelayedConstraint.Matches``1(``0@)">
+            <summary>
+            Test whether the constraint is satisfied by a given reference.
+            Overridden to wait for the specified delay period before
+            calling the base constraint with the dereferenced value.
+            </summary>
+            <param name="actual">A reference to the value to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.DelayedConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.DelayedConstraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the actual value for a failing constraint test to a MessageWriter.
+            </summary>
+            <param name="writer">The writer on which the actual value is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.DelayedConstraint.GetStringRepresentation">
+            <summary>
+            Returns the string representation of the constraint.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.EmptyCollectionConstraint">
+            <summary>
+            EmptyCollectionConstraint tests whether a collection is empty. 
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EmptyCollectionConstraint.doMatch(System.Collections.IEnumerable)">
+            <summary>
+            Check that the collection is empty
+            </summary>
+            <param name="collection"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EmptyCollectionConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer"></param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.EmptyConstraint">
+            <summary>
+            EmptyConstraint tests a whether a string or collection is empty,
+            postponing the decision about which test is applied until the
+            type of the actual argument is known.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EmptyConstraint.Matches(System.Object)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EmptyConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.EmptyDirectoryConstraint">
+            <summary>
+            EmptyDirectoryConstraint is used to test that a directory is empty
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EmptyDirectoryConstraint.Matches(System.Object)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EmptyDirectoryConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EmptyDirectoryConstraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the actual value for a failing constraint test to a
+            MessageWriter. The default implementation simply writes
+            the raw value of actual, leaving it to the writer to
+            perform any formatting.
+            </summary>
+            <param name="writer">The writer on which the actual value is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.EmptyStringConstraint">
+            <summary>
+            EmptyStringConstraint tests whether a string is empty.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EmptyStringConstraint.Matches(System.Object)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EmptyStringConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.EndsWithConstraint">
+            <summary>
+            EndsWithConstraint can test whether a string ends
+            with an expected substring.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.StringConstraint">
+            <summary>
+            StringConstraint is the abstract base for constraints
+            that operate on strings. It supports the IgnoreCase
+            modifier for string operations.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.StringConstraint.expected">
+            <summary>
+            The expected value
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.StringConstraint.caseInsensitive">
+            <summary>
+            Indicates whether tests should be case-insensitive
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.StringConstraint.#ctor(System.String)">
+            <summary>
+            Constructs a StringConstraint given an expected value
+            </summary>
+            <param name="expected">The expected value</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.StringConstraint.Matches(System.Object)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.StringConstraint.Matches(System.String)">
+            <summary>
+            Test whether the constraint is satisfied by a given string
+            </summary>
+            <param name="actual">The string to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.StringConstraint.IgnoreCase">
+            <summary>
+            Modify the constraint to ignore case in matching.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EndsWithConstraint.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:EndsWithConstraint"/> class.
+            </summary>
+            <param name="expected">The expected string</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EndsWithConstraint.Matches(System.String)">
+            <summary>
+            Test whether the constraint is matched by the actual value.
+            This is a template method, which calls the IsMatch method
+            of the derived class.
+            </summary>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EndsWithConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.EqualConstraint">
+            <summary>
+            EqualConstraint is able to compare an actual value with the
+            expected value provided in its constructor. Two objects are 
+            considered equal if both are null, or if both have the same 
+            value. NUnit has special semantics for some object types.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.EqualConstraint.clipStrings">
+            <summary>
+            If true, strings in error messages will be clipped
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.EqualConstraint.comparer">
+            <summary>
+            NUnitEqualityComparer used to test equality.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.#ctor(System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:NUnit.Framework.Constraints.EqualConstraint"/> class.
+            </summary>
+            <param name="expected">The expected value.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.Within(System.Object)">
+            <summary>
+            Flag the constraint to use a tolerance when determining equality.
+            </summary>
+            <param name="amount">Tolerance value to be used</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.Comparer(System.Collections.IComparer)">
+            <summary>
+            Flag the constraint to use the supplied IComparer object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.Using(System.Collections.IComparer)">
+            <summary>
+            Flag the constraint to use the supplied IComparer object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.Using``1(System.Collections.Generic.IComparer{``0})">
+            <summary>
+            Flag the constraint to use the supplied IComparer object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.Using``1(System.Comparison{``0})">
+            <summary>
+            Flag the constraint to use the supplied Comparison object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.Using(System.Collections.IEqualityComparer)">
+            <summary>
+            Flag the constraint to use the supplied IEqualityComparer object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.Using``1(System.Collections.Generic.IEqualityComparer{``0})">
+            <summary>
+            Flag the constraint to use the supplied IEqualityComparer object.
+            </summary>
+            <param name="comparer">The IComparer object to use.</param>
+            <returns>Self.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.Matches(System.Object)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.WriteMessageTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a failure message. Overridden to provide custom 
+            failure messages for EqualConstraint.
+            </summary>
+            <param name="writer">The MessageWriter to write to</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write description of this constraint
+            </summary>
+            <param name="writer">The MessageWriter to write to</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.DisplayCollectionDifferences(NUnit.Framework.Constraints.MessageWriter,System.Collections.ICollection,System.Collections.ICollection,System.Int32)">
+            <summary>
+            Display the failure information for two collections that did not match.
+            </summary>
+            <param name="writer">The MessageWriter on which to display</param>
+            <param name="expected">The expected collection.</param>
+            <param name="actual">The actual collection</param>
+            <param name="depth">The depth of this failure in a set of nested collections</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.DisplayTypesAndSizes(NUnit.Framework.Constraints.MessageWriter,System.Collections.IEnumerable,System.Collections.IEnumerable,System.Int32)">
+            <summary>
+            Displays a single line showing the types and sizes of the expected
+            and actual enumerations, collections or arrays. If both are identical, 
+            the value is only shown once.
+            </summary>
+            <param name="writer">The MessageWriter on which to display</param>
+            <param name="expected">The expected collection or array</param>
+            <param name="actual">The actual collection or array</param>
+            <param name="indent">The indentation level for the message line</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.DisplayFailurePoint(NUnit.Framework.Constraints.MessageWriter,System.Collections.IEnumerable,System.Collections.IEnumerable,NUnit.Framework.Constraints.FailurePoint,System.Int32)">
+            <summary>
+            Displays a single line showing the point in the expected and actual
+            arrays at which the comparison failed. If the arrays have different
+            structures or dimensions, both values are shown.
+            </summary>
+            <param name="writer">The MessageWriter on which to display</param>
+            <param name="expected">The expected array</param>
+            <param name="actual">The actual array</param>
+            <param name="failurePoint">Index of the failure point in the underlying collections</param>
+            <param name="indent">The indentation level for the message line</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualConstraint.DisplayEnumerableDifferences(NUnit.Framework.Constraints.MessageWriter,System.Collections.IEnumerable,System.Collections.IEnumerable,System.Int32)">
+            <summary>
+            Display the failure information for two IEnumerables that did not match.
+            </summary>
+            <param name="writer">The MessageWriter on which to display</param>
+            <param name="expected">The expected enumeration.</param>
+            <param name="actual">The actual enumeration</param>
+            <param name="depth">The depth of this failure in a set of nested collections</param>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.EqualConstraint.IgnoreCase">
+            <summary>
+            Flag the constraint to ignore case and return self.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.EqualConstraint.NoClip">
+            <summary>
+            Flag the constraint to suppress string clipping 
+            and return self.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.EqualConstraint.AsCollection">
+            <summary>
+            Flag the constraint to compare arrays as collections
+            and return self.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.EqualConstraint.Ulps">
+            <summary>
+            Switches the .Within() modifier to interpret its tolerance as
+            a distance in representable values (see remarks).
+            </summary>
+            <returns>Self.</returns>
+            <remarks>
+            Ulp stands for "unit in the last place" and describes the minimum
+            amount a given value can change. For any integers, an ulp is 1 whole
+            digit. For floating point values, the accuracy of which is better
+            for smaller numbers and worse for larger numbers, an ulp depends
+            on the size of the number. Using ulps for comparison of floating
+            point results instead of fixed tolerances is safer because it will
+            automatically compensate for the added inaccuracy of larger numbers.
+            </remarks>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.EqualConstraint.Percent">
+            <summary>
+            Switches the .Within() modifier to interpret its tolerance as
+            a percentage that the actual values is allowed to deviate from
+            the expected value.
+            </summary>
+            <returns>Self</returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.EqualConstraint.Days">
+            <summary>
+            Causes the tolerance to be interpreted as a TimeSpan in days.
+            </summary>
+            <returns>Self</returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.EqualConstraint.Hours">
+            <summary>
+            Causes the tolerance to be interpreted as a TimeSpan in hours.
+            </summary>
+            <returns>Self</returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.EqualConstraint.Minutes">
+            <summary>
+            Causes the tolerance to be interpreted as a TimeSpan in minutes.
+            </summary>
+            <returns>Self</returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.EqualConstraint.Seconds">
+            <summary>
+            Causes the tolerance to be interpreted as a TimeSpan in seconds.
+            </summary>
+            <returns>Self</returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.EqualConstraint.Milliseconds">
+            <summary>
+            Causes the tolerance to be interpreted as a TimeSpan in milliseconds.
+            </summary>
+            <returns>Self</returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.EqualConstraint.Ticks">
+            <summary>
+            Causes the tolerance to be interpreted as a TimeSpan in clock ticks.
+            </summary>
+            <returns>Self</returns>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.EqualityAdapter">
+            <summary>
+            EqualityAdapter class handles all equality comparisons
+            that use an IEqualityComparer, IEqualityComparer&lt;T&gt;
+            or a ComparisonAdapter.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualityAdapter.AreEqual(System.Object,System.Object)">
+            <summary>
+            Compares two objects, returning true if they are equal
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualityAdapter.CanCompare(System.Object,System.Object)">
+            <summary>
+            Returns true if the two objects can be compared by this adapter.
+            The base adapter cannot handle IEnumerables except for strings.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualityAdapter.For(System.Collections.IComparer)">
+            <summary>
+            Returns an EqualityAdapter that wraps an IComparer.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualityAdapter.For(System.Collections.IEqualityComparer)">
+            <summary>
+            Returns an EqualityAdapter that wraps an IEqualityComparer.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualityAdapter.For``1(System.Collections.Generic.IEqualityComparer{``0})">
+            <summary>
+            Returns an EqualityAdapter that wraps an IEqualityComparer&lt;T&gt;.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualityAdapter.For``1(System.Collections.Generic.IComparer{``0})">
+            <summary>
+            Returns an EqualityAdapter that wraps an IComparer&lt;T&gt;.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualityAdapter.For``1(System.Comparison{``0})">
+            <summary>
+            Returns an EqualityAdapter that wraps a Comparison&lt;T&gt;.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.EqualityAdapter.ComparerAdapter">
+            <summary>
+            EqualityAdapter that wraps an IComparer.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.EqualityAdapter.GenericEqualityAdapter`1.CanCompare(System.Object,System.Object)">
+            <summary>
+            Returns true if the two objects can be compared by this adapter.
+            Generic adapter requires objects of the specified type.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.EqualityAdapter.ComparerAdapter`1">
+            <summary>
+            EqualityAdapter that wraps an IComparer.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.EqualityAdapterList">
+            <summary>
+            EqualityAdapterList represents a list of EqualityAdapters
+            in a common class across platforms.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ExactCountConstraint">
+            <summary>
+            ExactCountConstraint applies another constraint to each
+            item in a collection, succeeding only if a specified
+            number of items succeed.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ExactCountConstraint.#ctor(System.Int32,NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Construct an ExactCountConstraint on top of an existing constraint
+            </summary>
+            <param name="expectedCount"></param>
+            <param name="itemConstraint"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ExactCountConstraint.Matches(System.Object)">
+            <summary>
+            Apply the item constraint to each item in the collection,
+            succeeding only if the expected number of items pass.
+            </summary>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ExactCountConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a description of this constraint to a MessageWriter
+            </summary>
+            <param name="writer"></param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ExactTypeConstraint">
+            <summary>
+            ExactTypeConstraint is used to test that an object
+            is of the exact type provided in the constructor
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ExactTypeConstraint.#ctor(System.Type)">
+            <summary>
+            Construct an ExactTypeConstraint for a given Type
+            </summary>
+            <param name="type">The expected Type.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ExactTypeConstraint.Matches(System.Object)">
+            <summary>
+            Test that an object is of the exact type specified
+            </summary>
+            <param name="actual">The actual value.</param>
+            <returns>True if the tested object is of the exact type provided, otherwise false.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ExactTypeConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the description of this constraint to a MessageWriter
+            </summary>
+            <param name="writer">The MessageWriter to use</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ExceptionTypeConstraint">
+            <summary>
+            ExceptionTypeConstraint is a special version of ExactTypeConstraint
+            used to provided detailed info about the exception thrown in
+            an error message.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ExceptionTypeConstraint.#ctor(System.Type)">
+            <summary>
+            Constructs an ExceptionTypeConstraint
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ExceptionTypeConstraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the actual value for a failing constraint test to a
+            MessageWriter. Overriden to write additional information 
+            in the case of an Exception.
+            </summary>
+            <param name="writer">The MessageWriter to use</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.FailurePoint">
+            <summary>
+            FailurePoint class represents one point of failure
+            in an equality test.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.FailurePoint.Position">
+            <summary>
+            The location of the failure
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.FailurePoint.ExpectedValue">
+            <summary>
+            The expected value
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.FailurePoint.ActualValue">
+            <summary>
+            The actual value
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.FailurePoint.ExpectedHasData">
+            <summary>
+            Indicates whether the expected value is valid
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.FailurePoint.ActualHasData">
+            <summary>
+            Indicates whether the actual value is valid
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.FailurePointList">
+            <summary>
+            FailurePointList represents a set of FailurePoints
+            in a cross-platform way.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.FalseConstraint">
+            <summary>
+            FalseConstraint tests that the actual value is false
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.FalseConstraint.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:FalseConstraint"/> class.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.FloatingPointNumerics">
+            <summary>Helper routines for working with floating point numbers</summary>
+            <remarks>
+              <para>
+                The floating point comparison code is based on this excellent article:
+                http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
+              </para>
+              <para>
+                "ULP" means Unit in the Last Place and in the context of this library refers to
+                the distance between two adjacent floating point numbers. IEEE floating point
+                numbers can only represent a finite subset of natural numbers, with greater
+                accuracy for smaller numbers and lower accuracy for very large numbers.
+              </para>
+              <para>
+                If a comparison is allowed "2 ulps" of deviation, that means the values are
+                allowed to deviate by up to 2 adjacent floating point values, which might be
+                as low as 0.0000001 for small numbers or as high as 10.0 for large numbers.
+              </para>
+            </remarks>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.FloatingPointNumerics.AreAlmostEqualUlps(System.Single,System.Single,System.Int32)">
+            <summary>Compares two floating point values for equality</summary>
+            <param name="left">First floating point value to be compared</param>
+            <param name="right">Second floating point value t be compared</param>
+            <param name="maxUlps">
+              Maximum number of representable floating point values that are allowed to
+              be between the left and the right floating point values
+            </param>
+            <returns>True if both numbers are equal or close to being equal</returns>
+            <remarks>
+              <para>
+                Floating point values can only represent a finite subset of natural numbers.
+                For example, the values 2.00000000 and 2.00000024 can be stored in a float,
+                but nothing inbetween them.
+              </para>
+              <para>
+                This comparison will count how many possible floating point values are between
+                the left and the right number. If the number of possible values between both
+                numbers is less than or equal to maxUlps, then the numbers are considered as
+                being equal.
+              </para>
+              <para>
+                Implementation partially follows the code outlined here:
+                http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/
+              </para>
+            </remarks>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.FloatingPointNumerics.AreAlmostEqualUlps(System.Double,System.Double,System.Int64)">
+            <summary>Compares two double precision floating point values for equality</summary>
+            <param name="left">First double precision floating point value to be compared</param>
+            <param name="right">Second double precision floating point value t be compared</param>
+            <param name="maxUlps">
+              Maximum number of representable double precision floating point values that are
+              allowed to be between the left and the right double precision floating point values
+            </param>
+            <returns>True if both numbers are equal or close to being equal</returns>
+            <remarks>
+              <para>
+                Double precision floating point values can only represent a limited series of
+                natural numbers. For example, the values 2.0000000000000000 and 2.0000000000000004
+                can be stored in a double, but nothing inbetween them.
+              </para>
+              <para>
+                This comparison will count how many possible double precision floating point
+                values are between the left and the right number. If the number of possible
+                values between both numbers is less than or equal to maxUlps, then the numbers
+                are considered as being equal.
+              </para>
+              <para>
+                Implementation partially follows the code outlined here:
+                http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/
+              </para>
+            </remarks>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.FloatingPointNumerics.ReinterpretAsInt(System.Single)">
+            <summary>
+              Reinterprets the memory contents of a floating point value as an integer value
+            </summary>
+            <param name="value">
+              Floating point value whose memory contents to reinterpret
+            </param>
+            <returns>
+              The memory contents of the floating point value interpreted as an integer
+            </returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.FloatingPointNumerics.ReinterpretAsLong(System.Double)">
+            <summary>
+              Reinterprets the memory contents of a double precision floating point
+              value as an integer value
+            </summary>
+            <param name="value">
+              Double precision floating point value whose memory contents to reinterpret
+            </param>
+            <returns>
+              The memory contents of the double precision floating point value
+              interpreted as an integer
+            </returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.FloatingPointNumerics.ReinterpretAsFloat(System.Int32)">
+            <summary>
+              Reinterprets the memory contents of an integer as a floating point value
+            </summary>
+            <param name="value">Integer value whose memory contents to reinterpret</param>
+            <returns>
+              The memory contents of the integer value interpreted as a floating point value
+            </returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.FloatingPointNumerics.ReinterpretAsDouble(System.Int64)">
+            <summary>
+              Reinterprets the memory contents of an integer value as a double precision
+              floating point value
+            </summary>
+            <param name="value">Integer whose memory contents to reinterpret</param>
+            <returns>
+              The memory contents of the integer interpreted as a double precision
+              floating point value
+            </returns>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.FloatingPointNumerics.FloatIntUnion">
+            <summary>Union of a floating point variable and an integer</summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.FloatingPointNumerics.FloatIntUnion.Float">
+            <summary>The union's value as a floating point variable</summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.FloatingPointNumerics.FloatIntUnion.Int">
+            <summary>The union's value as an integer</summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.FloatingPointNumerics.FloatIntUnion.UInt">
+            <summary>The union's value as an unsigned integer</summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.FloatingPointNumerics.DoubleLongUnion">
+            <summary>Union of a double precision floating point variable and a long</summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.FloatingPointNumerics.DoubleLongUnion.Double">
+            <summary>The union's value as a double precision floating point variable</summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.FloatingPointNumerics.DoubleLongUnion.Long">
+            <summary>The union's value as a long</summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.FloatingPointNumerics.DoubleLongUnion.ULong">
+            <summary>The union's value as an unsigned long</summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.GreaterThanConstraint">
+            <summary>
+            Tests whether a value is greater than the value supplied to its constructor
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.GreaterThanConstraint.expected">
+            <summary>
+            The value against which a comparison is to be made
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.GreaterThanConstraint.#ctor(System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:GreaterThanConstraint"/> class.
+            </summary>
+            <param name="expected">The expected value.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.GreaterThanConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.GreaterThanConstraint.Matches(System.Object)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.GreaterThanOrEqualConstraint">
+            <summary>
+            Tests whether a value is greater than or equal to the value supplied to its constructor
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.GreaterThanOrEqualConstraint.expected">
+            <summary>
+            The value against which a comparison is to be made
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.GreaterThanOrEqualConstraint.#ctor(System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:GreaterThanOrEqualConstraint"/> class.
+            </summary>
+            <param name="expected">The expected value.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.GreaterThanOrEqualConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.GreaterThanOrEqualConstraint.Matches(System.Object)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.InstanceOfTypeConstraint">
+            <summary>
+            InstanceOfTypeConstraint is used to test that an object
+            is of the same type provided or derived from it.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.InstanceOfTypeConstraint.#ctor(System.Type)">
+            <summary>
+            Construct an InstanceOfTypeConstraint for the type provided
+            </summary>
+            <param name="type">The expected Type</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.InstanceOfTypeConstraint.Matches(System.Object)">
+            <summary>
+            Test whether an object is of the specified type or a derived type
+            </summary>
+            <param name="actual">The object to be tested</param>
+            <returns>True if the object is of the provided type or derives from it, otherwise false.</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.InstanceOfTypeConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a description of this constraint to a MessageWriter
+            </summary>
+            <param name="writer">The MessageWriter to use</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.LessThanConstraint">
+            <summary>
+            Tests whether a value is less than the value supplied to its constructor
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.LessThanConstraint.expected">
+            <summary>
+            The value against which a comparison is to be made
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.LessThanConstraint.#ctor(System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:LessThanConstraint"/> class.
+            </summary>
+            <param name="expected">The expected value.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.LessThanConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.LessThanConstraint.Matches(System.Object)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.LessThanOrEqualConstraint">
+            <summary>
+            Tests whether a value is less than or equal to the value supplied to its constructor
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.LessThanOrEqualConstraint.expected">
+            <summary>
+            The value against which a comparison is to be made
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.LessThanOrEqualConstraint.#ctor(System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:LessThanOrEqualConstraint"/> class.
+            </summary>
+            <param name="expected">The expected value.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.LessThanOrEqualConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.LessThanOrEqualConstraint.Matches(System.Object)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.MsgUtils">
+            <summary>
+            Static methods used in creating messages
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.MsgUtils.ELLIPSIS">
+            <summary>
+            Static string used when strings are clipped
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MsgUtils.GetTypeRepresentation(System.Object)">
+            <summary>
+            Returns the representation of a type as used in NUnitLite.
+            This is the same as Type.ToString() except for arrays,
+            which are displayed with their declared sizes.
+            </summary>
+            <param name="obj"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MsgUtils.EscapeControlChars(System.String)">
+            <summary>
+            Converts any control characters in a string 
+            to their escaped representation.
+            </summary>
+            <param name="s">The string to be converted</param>
+            <returns>The converted string</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MsgUtils.GetArrayIndicesAsString(System.Int32[])">
+            <summary>
+            Return the a string representation for a set of indices into an array
+            </summary>
+            <param name="indices">Array of indices for which a string is needed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MsgUtils.GetArrayIndicesFromCollectionIndex(System.Collections.IEnumerable,System.Int32)">
+            <summary>
+            Get an array of indices representing the point in a enumerable, 
+            collection or array corresponding to a single int index into the 
+            collection.
+            </summary>
+            <param name="collection">The collection to which the indices apply</param>
+            <param name="index">Index in the collection</param>
+            <returns>Array of indices</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MsgUtils.ClipString(System.String,System.Int32,System.Int32)">
+            <summary>
+            Clip a string to a given length, starting at a particular offset, returning the clipped
+            string with ellipses representing the removed parts
+            </summary>
+            <param name="s">The string to be clipped</param>
+            <param name="maxStringLength">The maximum permitted length of the result string</param>
+            <param name="clipStart">The point at which to start clipping</param>
+            <returns>The clipped string</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MsgUtils.ClipExpectedAndActual(System.String@,System.String@,System.Int32,System.Int32)">
+            <summary>
+            Clip the expected and actual strings in a coordinated fashion, 
+            so that they may be displayed together.
+            </summary>
+            <param name="expected"></param>
+            <param name="actual"></param>
+            <param name="maxDisplayLength"></param>
+            <param name="mismatch"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.MsgUtils.FindMismatchPosition(System.String,System.String,System.Int32,System.Boolean)">
+            <summary>
+            Shows the position two strings start to differ.  Comparison 
+            starts at the start index.
+            </summary>
+            <param name="expected">The expected string</param>
+            <param name="actual">The actual string</param>
+            <param name="istart">The index in the strings at which comparison should start</param>
+            <param name="ignoreCase">Boolean indicating whether case should be ignored</param>
+            <returns>-1 if no mismatch found, or the index where mismatch found</returns>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.NaNConstraint">
+            <summary>
+            NaNConstraint tests that the actual value is a double or float NaN
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NaNConstraint.Matches(System.Object)">
+            <summary>
+            Test that the actual value is an NaN
+            </summary>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NaNConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a specified writer
+            </summary>
+            <param name="writer"></param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.NoItemConstraint">
+            <summary>
+            NoItemConstraint applies another constraint to each
+            item in a collection, failing if any of them succeeds.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NoItemConstraint.#ctor(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Construct a NoItemConstraint on top of an existing constraint
+            </summary>
+            <param name="itemConstraint"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NoItemConstraint.Matches(System.Object)">
+            <summary>
+            Apply the item constraint to each item in the collection,
+            failing if any item fails.
+            </summary>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NoItemConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a description of this constraint to a MessageWriter
+            </summary>
+            <param name="writer"></param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.NotConstraint">
+            <summary>
+            NotConstraint negates the effect of some other constraint
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NotConstraint.#ctor(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Initializes a new instance of the <see cref="T:NUnit.Framework.Constraints.NotConstraint"/> class.
+            </summary>
+            <param name="baseConstraint">The base constraint to be negated.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NotConstraint.Matches(System.Object)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True for if the base constraint fails, false if it succeeds</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NotConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NotConstraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the actual value for a failing constraint test to a MessageWriter.
+            </summary>
+            <param name="writer">The writer on which the actual value is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.NullConstraint">
+            <summary>
+            NullConstraint tests that the actual value is null
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NullConstraint.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:NullConstraint"/> class.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.NullOrEmptyStringConstraint">
+            <summary>
+            NullEmptyStringConstraint tests whether a string is either null or empty.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NullOrEmptyStringConstraint.#ctor">
+            <summary>
+            Constructs a new NullOrEmptyStringConstraint
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NullOrEmptyStringConstraint.Matches(System.Object)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NullOrEmptyStringConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.Numerics">
+            <summary>
+            The Numerics class contains common operations on numeric values.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Numerics.IsNumericType(System.Object)">
+            <summary>
+            Checks the type of the object, returning true if
+            the object is a numeric type.
+            </summary>
+            <param name="obj">The object to check</param>
+            <returns>true if the object is a numeric type</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Numerics.IsFloatingPointNumeric(System.Object)">
+            <summary>
+            Checks the type of the object, returning true if
+            the object is a floating point numeric type.
+            </summary>
+            <param name="obj">The object to check</param>
+            <returns>true if the object is a floating point numeric type</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Numerics.IsFixedPointNumeric(System.Object)">
+            <summary>
+            Checks the type of the object, returning true if
+            the object is a fixed point numeric type.
+            </summary>
+            <param name="obj">The object to check</param>
+            <returns>true if the object is a fixed point numeric type</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Numerics.AreEqual(System.Object,System.Object,NUnit.Framework.Constraints.Tolerance@)">
+            <summary>
+            Test two numeric values for equality, performing the usual numeric 
+            conversions and using a provided or default tolerance. If the tolerance 
+            provided is Empty, this method may set it to a default tolerance.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <param name="tolerance">A reference to the tolerance in effect</param>
+            <returns>True if the values are equal</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Numerics.Compare(System.Object,System.Object)">
+            <summary>
+            Compare two numeric values, performing the usual numeric conversions.
+            </summary>
+            <param name="expected">The expected value</param>
+            <param name="actual">The actual value</param>
+            <returns>The relationship of the values to each other</returns>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.NUnitComparer">
+            <summary>
+            NUnitComparer encapsulates NUnit's default behavior
+            in comparing two objects.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NUnitComparer.Compare(System.Object,System.Object)">
+            <summary>
+            Compares two objects
+            </summary>
+            <param name="x"></param>
+            <param name="y"></param>
+            <returns></returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.NUnitComparer.Default">
+            <summary>
+            Returns the default NUnitComparer.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.NUnitComparer`1">
+            <summary>
+            Generic version of NUnitComparer
+            </summary>
+            <typeparam name="T"></typeparam>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NUnitComparer`1.Compare(`0,`0)">
+            <summary>
+            Compare two objects of the same type
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.NUnitEqualityComparer">
+            <summary>
+            NUnitEqualityComparer encapsulates NUnit's handling of
+            equality tests between objects.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.INUnitEqualityComparer">
+            <summary>
+            
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.INUnitEqualityComparer.AreEqual(System.Object,System.Object,NUnit.Framework.Constraints.Tolerance@)">
+            <summary>
+            Compares two objects for equality within a tolerance
+            </summary>
+            <param name="x">The first object to compare</param>
+            <param name="y">The second object to compare</param>
+            <param name="tolerance">The tolerance to use in the comparison</param>
+            <returns></returns>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.NUnitEqualityComparer.caseInsensitive">
+            <summary>
+            If true, all string comparisons will ignore case
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.NUnitEqualityComparer.compareAsCollection">
+            <summary>
+            If true, arrays will be treated as collections, allowing
+            those of different dimensions to be compared
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.NUnitEqualityComparer.externalComparers">
+            <summary>
+            Comparison objects used in comparisons for some constraints.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.NUnitEqualityComparer.failurePoints">
+            <summary>
+            List of points at which a failure occured.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.NUnitEqualityComparer.recursionDetector">
+            <summary>
+            RecursionDetector used to check for recursion when
+            evaluating self-referencing enumerables.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NUnitEqualityComparer.AreEqual(System.Object,System.Object,NUnit.Framework.Constraints.Tolerance@)">
+            <summary>
+            Compares two objects for equality within a tolerance, setting
+            the tolerance to the actual tolerance used if an empty
+            tolerance is supplied.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NUnitEqualityComparer.ArraysEqual(System.Array,System.Array,NUnit.Framework.Constraints.Tolerance@)">
+            <summary>
+            Helper method to compare two arrays
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NUnitEqualityComparer.DirectoriesEqual(System.IO.DirectoryInfo,System.IO.DirectoryInfo)">
+            <summary>
+            Method to compare two DirectoryInfo objects
+            </summary>
+            <param name="expected">first directory to compare</param>
+            <param name="actual">second directory to compare</param>
+            <returns>true if equivalent, false if not</returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.NUnitEqualityComparer.Default">
+            <summary>
+            Returns the default NUnitEqualityComparer
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.NUnitEqualityComparer.IgnoreCase">
+            <summary>
+            Gets and sets a flag indicating whether case should
+            be ignored in determining equality.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.NUnitEqualityComparer.CompareAsCollection">
+            <summary>
+            Gets and sets a flag indicating that arrays should be
+            compared as collections, without regard to their shape.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.NUnitEqualityComparer.ExternalComparers">
+            <summary>
+            Gets the list of external comparers to be used to
+            test for equality. They are applied to members of
+            collections, in place of NUnit's own logic.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.NUnitEqualityComparer.FailurePoints">
+            <summary>
+            Gets the list of failure points for the last Match performed.
+            The list consists of objects to be interpreted by the caller.
+            This generally means that the caller may only make use of
+            objects it has placed on the list at a particular depthy.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.NUnitEqualityComparer.RecursionDetector">
+            <summary>
+            RecursionDetector detects when a comparison
+            between two enumerables has reached a point
+            where the same objects that were previously
+            compared are again being compared. This allows
+            the caller to stop the comparison if desired.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NUnitEqualityComparer.RecursionDetector.CheckRecursion(System.Collections.IEnumerable,System.Collections.IEnumerable)">
+            <summary>
+            Check whether two objects have previously
+            been compared, returning true if they have.
+            The two objects are remembered, so that a
+            second call will always return true.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.OrConstraint">
+            <summary>
+            OrConstraint succeeds if either member succeeds
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.OrConstraint.#ctor(NUnit.Framework.Constraints.Constraint,NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Create an OrConstraint from two other constraints
+            </summary>
+            <param name="left">The first constraint</param>
+            <param name="right">The second constraint</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.OrConstraint.Matches(System.Object)">
+            <summary>
+            Apply the member constraints to an actual value, succeeding 
+            succeeding as soon as one of them succeeds.
+            </summary>
+            <param name="actual">The actual value</param>
+            <returns>True if either constraint succeeded</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.OrConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a description for this contraint to a MessageWriter
+            </summary>
+            <param name="writer">The MessageWriter to receive the description</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.PathConstraint">
+            <summary>
+            PathConstraint serves as the abstract base of constraints
+            that operate on paths and provides several helper methods.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.PathConstraint.expectedPath">
+            <summary>
+            The expected path used in the constraint
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.PathConstraint.caseInsensitive">
+            <summary>
+            Flag indicating whether a caseInsensitive comparison should be made
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PathConstraint.#ctor(System.String)">
+            <summary>
+            Construct a PathConstraint for a give expected path
+            </summary>
+            <param name="expectedPath">The expected path</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PathConstraint.Matches(System.Object)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PathConstraint.IsMatch(System.String,System.String)">
+            <summary>
+            Returns true if the expected path and actual path match
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PathConstraint.GetStringRepresentation">
+            <summary>
+            Returns the string representation of this constraint
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PathConstraint.Canonicalize(System.String)">
+            <summary>
+            Transform the provided path to its canonical form so that it 
+            may be more easily be compared with other paths.
+            </summary>
+            <param name="path">The original path</param>
+            <returns>The path in canonical form</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PathConstraint.IsSubPath(System.String,System.String,System.Boolean)">
+            <summary>
+            Test whether one path in canonical form is under another.
+            </summary>
+            <param name="path1">The first path - supposed to be the parent path</param>
+            <param name="path2">The second path - supposed to be the child path</param>
+            <param name="ignoreCase">Indicates whether case should be ignored</param>
+            <returns></returns>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.PathConstraint.IgnoreCase">
+            <summary>
+            Modifies the current instance to be case-insensitve
+            and returns it.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.PathConstraint.RespectCase">
+            <summary>
+            Modifies the current instance to be case-sensitve
+            and returns it.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.PredicateConstraint`1">
+            <summary>
+            Predicate constraint wraps a Predicate in a constraint,
+            returning success if the predicate is true.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PredicateConstraint`1.#ctor(System.Predicate{`0})">
+            <summary>
+            Construct a PredicateConstraint from a predicate
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PredicateConstraint`1.Matches(System.Object)">
+            <summary>
+            Determines whether the predicate succeeds when applied
+            to the actual value.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PredicateConstraint`1.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Writes the description to a MessageWriter
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.PropertyConstraint">
+            <summary>
+            PropertyConstraint extracts a named property and uses
+            its value as the actual value for a chained constraint.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PropertyConstraint.#ctor(System.String,NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Initializes a new instance of the <see cref="T:PropertyConstraint"/> class.
+            </summary>
+            <param name="name">The name.</param>
+            <param name="baseConstraint">The constraint to apply to the property.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PropertyConstraint.Matches(System.Object)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PropertyConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PropertyConstraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the actual value for a failing constraint test to a
+            MessageWriter. The default implementation simply writes
+            the raw value of actual, leaving it to the writer to
+            perform any formatting.
+            </summary>
+            <param name="writer">The writer on which the actual value is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PropertyConstraint.GetStringRepresentation">
+            <summary>
+            Returns the string representation of the constraint.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.PropertyExistsConstraint">
+            <summary>
+            PropertyExistsConstraint tests that a named property
+            exists on the object provided through Match.
+            
+            Originally, PropertyConstraint provided this feature
+            in addition to making optional tests on the vaue
+            of the property. The two constraints are now separate.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PropertyExistsConstraint.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:PropertyExistConstraint"/> class.
+            </summary>
+            <param name="name">The name of the property.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PropertyExistsConstraint.Matches(System.Object)">
+            <summary>
+            Test whether the property exists for a given object
+            </summary>
+            <param name="actual">The object to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PropertyExistsConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PropertyExistsConstraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the actual value for a failing constraint test to a
+            MessageWriter.
+            </summary>
+            <param name="writer">The writer on which the actual value is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PropertyExistsConstraint.GetStringRepresentation">
+            <summary>
+            Returns the string representation of the constraint.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.RangeConstraint`1">
+            <summary>
+            RangeConstraint tests whether two values are within a 
+            specified range.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.RangeConstraint`1.#ctor(`0,`0)">
+            <summary>
+            Initializes a new instance of the <see cref="T:RangeConstraint"/> class.
+            </summary>
+            <param name="from">From.</param>
+            <param name="to">To.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.RangeConstraint`1.Matches(System.Object)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.RangeConstraint`1.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.RegexConstraint">
+            <summary>
+            RegexConstraint can test whether a string matches
+            the pattern provided.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.RegexConstraint.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:RegexConstraint"/> class.
+            </summary>
+            <param name="pattern">The pattern.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.RegexConstraint.Matches(System.String)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.RegexConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ResolvableConstraintExpression">
+            <summary>
+            ResolvableConstraintExpression is used to represent a compound
+            constraint being constructed at a point where the last operator
+            may either terminate the expression or may have additional 
+            qualifying constraints added to it. 
+            
+            It is used, for example, for a Property element or for
+            an Exception element, either of which may be optionally
+            followed by constraints that apply to the property or 
+            exception.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ResolvableConstraintExpression.#ctor">
+            <summary>
+            Create a new instance of ResolvableConstraintExpression
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ResolvableConstraintExpression.#ctor(NUnit.Framework.Constraints.ConstraintBuilder)">
+            <summary>
+            Create a new instance of ResolvableConstraintExpression,
+            passing in a pre-populated ConstraintBuilder.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ResolvableConstraintExpression.NUnit#Framework#Constraints#IResolveConstraint#Resolve">
+            <summary>
+            Resolve the current expression to a Constraint
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ResolvableConstraintExpression.op_BitwiseAnd(NUnit.Framework.Constraints.ResolvableConstraintExpression,NUnit.Framework.Constraints.ResolvableConstraintExpression)">
+            <summary>
+            This operator creates a constraint that is satisfied only if both 
+            argument constraints are satisfied.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ResolvableConstraintExpression.op_BitwiseAnd(NUnit.Framework.Constraints.Constraint,NUnit.Framework.Constraints.ResolvableConstraintExpression)">
+            <summary>
+            This operator creates a constraint that is satisfied only if both 
+            argument constraints are satisfied.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ResolvableConstraintExpression.op_BitwiseAnd(NUnit.Framework.Constraints.ResolvableConstraintExpression,NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            This operator creates a constraint that is satisfied only if both 
+            argument constraints are satisfied.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ResolvableConstraintExpression.op_BitwiseOr(NUnit.Framework.Constraints.ResolvableConstraintExpression,NUnit.Framework.Constraints.ResolvableConstraintExpression)">
+            <summary>
+            This operator creates a constraint that is satisfied if either 
+            of the argument constraints is satisfied.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ResolvableConstraintExpression.op_BitwiseOr(NUnit.Framework.Constraints.ResolvableConstraintExpression,NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            This operator creates a constraint that is satisfied if either 
+            of the argument constraints is satisfied.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ResolvableConstraintExpression.op_BitwiseOr(NUnit.Framework.Constraints.Constraint,NUnit.Framework.Constraints.ResolvableConstraintExpression)">
+            <summary>
+            This operator creates a constraint that is satisfied if either 
+            of the argument constraints is satisfied.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ResolvableConstraintExpression.op_LogicalNot(NUnit.Framework.Constraints.ResolvableConstraintExpression)">
+            <summary>
+            This operator creates a constraint that is satisfied if the 
+            argument constraint is not satisfied.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ResolvableConstraintExpression.And">
+            <summary>
+            Appends an And Operator to the expression
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ResolvableConstraintExpression.Or">
+            <summary>
+            Appends an Or operator to the expression.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ReusableConstraint">
+            <summary>
+            ReusableConstraint wraps a constraint expression after 
+            resolving it so that it can be reused consistently.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ReusableConstraint.#ctor(NUnit.Framework.Constraints.IResolveConstraint)">
+            <summary>
+            Construct a ReusableConstraint from a constraint expression
+            </summary>
+            <param name="c">The expression to be resolved and reused</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ReusableConstraint.op_Implicit(NUnit.Framework.Constraints.Constraint)~NUnit.Framework.Constraints.ReusableConstraint">
+            <summary>
+            Converts a constraint to a ReusableConstraint
+            </summary>
+            <param name="c">The constraint to be converted</param>
+            <returns>A ReusableConstraint</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ReusableConstraint.ToString">
+            <summary>
+            Returns the string representation of the constraint.
+            </summary>
+            <returns>A string representing the constraint</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ReusableConstraint.Resolve">
+            <summary>
+            Resolves the ReusableConstraint by returning the constraint
+            that it originally wrapped.
+            </summary>
+            <returns>A resolved constraint</returns>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.SameAsConstraint">
+            <summary>
+            SameAsConstraint tests whether an object is identical to
+            the object passed to its constructor
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SameAsConstraint.#ctor(System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:SameAsConstraint"/> class.
+            </summary>
+            <param name="expected">The expected object.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SameAsConstraint.Matches(System.Object)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SameAsConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.SamePathConstraint">
+            <summary>
+            Summary description for SamePathConstraint.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SamePathConstraint.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:SamePathConstraint"/> class.
+            </summary>
+            <param name="expected">The expected path</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SamePathConstraint.IsMatch(System.String,System.String)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="expectedPath">The expected path</param>
+            <param name="actualPath">The actual path</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SamePathConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.SamePathOrUnderConstraint">
+            <summary>
+            SamePathOrUnderConstraint tests that one path is under another
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SamePathOrUnderConstraint.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:SamePathOrUnderConstraint"/> class.
+            </summary>
+            <param name="expected">The expected path</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SamePathOrUnderConstraint.IsMatch(System.String,System.String)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="expectedPath">The expected path</param>
+            <param name="actualPath">The actual path</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SamePathOrUnderConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.SomeItemsConstraint">
+            <summary>
+            SomeItemsConstraint applies another constraint to each
+            item in a collection, succeeding if any of them succeeds.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SomeItemsConstraint.#ctor(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Construct a SomeItemsConstraint on top of an existing constraint
+            </summary>
+            <param name="itemConstraint"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SomeItemsConstraint.Matches(System.Object)">
+            <summary>
+            Apply the item constraint to each item in the collection,
+            succeeding if any item succeeds.
+            </summary>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SomeItemsConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a description of this constraint to a MessageWriter
+            </summary>
+            <param name="writer"></param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.StartsWithConstraint">
+            <summary>
+            StartsWithConstraint can test whether a string starts
+            with an expected substring.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.StartsWithConstraint.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:StartsWithConstraint"/> class.
+            </summary>
+            <param name="expected">The expected string</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.StartsWithConstraint.Matches(System.String)">
+            <summary>
+            Test whether the constraint is matched by the actual value.
+            This is a template method, which calls the IsMatch method
+            of the derived class.
+            </summary>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.StartsWithConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.SubPathConstraint">
+            <summary>
+            SubPathConstraint tests that the actual path is under the expected path
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SubPathConstraint.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:SubPathConstraint"/> class.
+            </summary>
+            <param name="expected">The expected path</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SubPathConstraint.IsMatch(System.String,System.String)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="expectedPath">The expected path</param>
+            <param name="actualPath">The actual path</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SubPathConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.SubstringConstraint">
+            <summary>
+            SubstringConstraint can test whether a string contains
+            the expected substring.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SubstringConstraint.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:SubstringConstraint"/> class.
+            </summary>
+            <param name="expected">The expected.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SubstringConstraint.Matches(System.String)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SubstringConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ThrowsConstraint">
+            <summary>
+            ThrowsConstraint is used to test the exception thrown by 
+            a delegate by applying a constraint to it.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ThrowsConstraint.#ctor(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Initializes a new instance of the <see cref="T:NUnit.Framework.Constraints.ThrowsConstraint"/> class,
+            using a constraint to be applied to the exception.
+            </summary>
+            <param name="baseConstraint">A constraint to apply to the caught exception.</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ThrowsConstraint.Matches(System.Object)">
+            <summary>
+            Executes the code of the delegate and captures any exception.
+            If a non-null base constraint was provided, it applies that
+            constraint to the exception.
+            </summary>
+            <param name="actual">A delegate representing the code to be tested</param>
+            <returns>True if an exception is thrown and the constraint succeeds, otherwise false</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ThrowsConstraint.Matches``1(NUnit.Framework.Constraints.ActualValueDelegate{``0})">
+            <summary>
+            Converts an ActualValueDelegate to a TestDelegate
+            before calling the primary overload.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ThrowsConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ThrowsConstraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the actual value for a failing constraint test to a
+            MessageWriter. The default implementation simply writes
+            the raw value of actual, leaving it to the writer to
+            perform any formatting.
+            </summary>
+            <param name="writer">The writer on which the actual value is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ThrowsConstraint.GetStringRepresentation">
+            <summary>
+            Returns the string representation of this constraint
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ThrowsConstraint.ActualException">
+            <summary>
+            Get the actual exception thrown - used by Assert.Throws.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ThrowsNothingConstraint">
+            <summary>
+            ThrowsNothingConstraint tests that a delegate does not
+            throw an exception.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ThrowsNothingConstraint.Matches(System.Object)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True if no exception is thrown, otherwise false</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ThrowsNothingConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ThrowsNothingConstraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the actual value for a failing constraint test to a
+            MessageWriter. Overridden in ThrowsNothingConstraint to write 
+            information about the exception that was actually caught.
+            </summary>
+            <param name="writer">The writer on which the actual value is displayed</param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.Tolerance">
+            <summary>
+            The Tolerance class generalizes the notion of a tolerance
+            within which an equality test succeeds. Normally, it is
+            used with numeric types, but it can be used with any
+            type that supports taking a difference between two 
+            objects and comparing that difference to a value.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Tolerance.#ctor(System.Object)">
+            <summary>
+            Constructs a linear tolerance of a specdified amount
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Tolerance.#ctor(System.Object,NUnit.Framework.Constraints.ToleranceMode)">
+            <summary>
+            Constructs a tolerance given an amount and ToleranceMode
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.Tolerance.CheckLinearAndNumeric">
+            <summary>
+            Tests that the current Tolerance is linear with a 
+            numeric value, throwing an exception if it is not.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Tolerance.Empty">
+            <summary>
+            Returns an empty Tolerance object, equivalent to
+            specifying no tolerance. In most cases, it results
+            in an exact match but for floats and doubles a
+            default tolerance may be used.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Tolerance.Zero">
+            <summary>
+            Returns a zero Tolerance object, equivalent to 
+            specifying an exact match.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Tolerance.Mode">
+            <summary>
+            Gets the ToleranceMode for the current Tolerance
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Tolerance.Value">
+            <summary>
+            Gets the value of the current Tolerance instance.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Tolerance.Percent">
+            <summary>
+            Returns a new tolerance, using the current amount as a percentage.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Tolerance.Ulps">
+            <summary>
+            Returns a new tolerance, using the current amount in Ulps.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Tolerance.Days">
+            <summary>
+            Returns a new tolerance with a TimeSpan as the amount, using 
+            the current amount as a number of days.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Tolerance.Hours">
+            <summary>
+            Returns a new tolerance with a TimeSpan as the amount, using 
+            the current amount as a number of hours.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Tolerance.Minutes">
+            <summary>
+            Returns a new tolerance with a TimeSpan as the amount, using 
+            the current amount as a number of minutes.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Tolerance.Seconds">
+            <summary>
+            Returns a new tolerance with a TimeSpan as the amount, using 
+            the current amount as a number of seconds.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Tolerance.Milliseconds">
+            <summary>
+            Returns a new tolerance with a TimeSpan as the amount, using 
+            the current amount as a number of milliseconds.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Tolerance.Ticks">
+            <summary>
+            Returns a new tolerance with a TimeSpan as the amount, using 
+            the current amount as a number of clock ticks.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.Tolerance.IsEmpty">
+            <summary>
+            Returns true if the current tolerance is empty.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ToleranceMode">
+            <summary>
+            Modes in which the tolerance value for a comparison can be interpreted.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.ToleranceMode.None">
+            <summary>
+            The tolerance was created with a value, without specifying 
+            how the value would be used. This is used to prevent setting
+            the mode more than once and is generally changed to Linear
+            upon execution of the test.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.ToleranceMode.Linear">
+            <summary>
+            The tolerance is used as a numeric range within which
+            two compared values are considered to be equal.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.ToleranceMode.Percent">
+            <summary>
+            Interprets the tolerance as the percentage by which
+            the two compared values my deviate from each other.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.ToleranceMode.Ulps">
+            <summary>
+            Compares two values based in their distance in
+            representable numbers.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.TrueConstraint">
+            <summary>
+            TrueConstraint tests that the actual value is true
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.TrueConstraint.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:TrueConstraint"/> class.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.UniqueItemsConstraint">
+            <summary>
+            UniqueItemsConstraint tests whether all the items in a 
+            collection are unique.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.UniqueItemsConstraint.doMatch(System.Collections.IEnumerable)">
+            <summary>
+            Check that all items are unique.
+            </summary>
+            <param name="actual"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.UniqueItemsConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write a description of this constraint to a MessageWriter
+            </summary>
+            <param name="writer"></param>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.XmlSerializableConstraint">
+            <summary>
+            XmlSerializableConstraint tests whether 
+            an object is serializable in XML format.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.XmlSerializableConstraint.Matches(System.Object)">
+            <summary>
+            Test whether the constraint is satisfied by a given value
+            </summary>
+            <param name="actual">The value to be tested</param>
+            <returns>True for success, false for failure</returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.XmlSerializableConstraint.WriteDescriptionTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the constraint description to a MessageWriter
+            </summary>
+            <param name="writer">The writer on which the description is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.XmlSerializableConstraint.WriteActualValueTo(NUnit.Framework.Constraints.MessageWriter)">
+            <summary>
+            Write the actual value for a failing constraint test to a
+            MessageWriter. The default implementation simply writes
+            the raw value of actual, leaving it to the writer to
+            perform any formatting.
+            </summary>
+            <param name="writer">The writer on which the actual value is displayed</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.XmlSerializableConstraint.GetStringRepresentation">
+            <summary>
+            Returns the string representation of this constraint
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.AllOperator">
+            <summary>
+            Represents a constraint that succeeds if all the 
+            members of a collection match a base constraint.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.CollectionOperator">
+            <summary>
+            Abstract base for operators that indicate how to
+            apply a constraint to items in a collection.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.PrefixOperator">
+            <summary>
+            PrefixOperator takes a single constraint and modifies
+            it's action in some way.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ConstraintOperator">
+            <summary>
+            The ConstraintOperator class is used internally by a
+            ConstraintBuilder to represent an operator that 
+            modifies or combines constraints. 
+            
+            Constraint operators use left and right precedence
+            values to determine whether the top operator on the
+            stack should be reduced before pushing a new operator.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.ConstraintOperator.left_precedence">
+            <summary>
+            The precedence value used when the operator
+            is about to be pushed to the stack.
+            </summary>
+        </member>
+        <member name="F:NUnit.Framework.Constraints.ConstraintOperator.right_precedence">
+            <summary>
+            The precedence value used when the operator
+            is on the top of the stack.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ConstraintOperator.Reduce(NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack)">
+            <summary>
+            Reduce produces a constraint from the operator and 
+            any arguments. It takes the arguments from the constraint 
+            stack and pushes the resulting constraint on it.
+            </summary>
+            <param name="stack"></param>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintOperator.LeftContext">
+            <summary>
+            The syntax element preceding this operator
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintOperator.RightContext">
+            <summary>
+            The syntax element folowing this operator
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintOperator.LeftPrecedence">
+            <summary>
+            The precedence value used when the operator
+            is about to be pushed to the stack.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.ConstraintOperator.RightPrecedence">
+            <summary>
+            The precedence value used when the operator
+            is on the top of the stack.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PrefixOperator.Reduce(NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack)">
+            <summary>
+            Reduce produces a constraint from the operator and 
+            any arguments. It takes the arguments from the constraint 
+            stack and pushes the resulting constraint on it.
+            </summary>
+            <param name="stack"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PrefixOperator.ApplyPrefix(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Returns the constraint created by applying this
+            prefix to another constraint.
+            </summary>
+            <param name="constraint"></param>
+            <returns></returns>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.CollectionOperator.#ctor">
+            <summary>
+            Constructs a CollectionOperator
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AllOperator.ApplyPrefix(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Returns a constraint that will apply the argument
+            to the members of a collection, succeeding if
+            they all succeed.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.AndOperator">
+            <summary>
+            Operator that requires both it's arguments to succeed
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.BinaryOperator">
+            <summary>
+            Abstract base class for all binary operators
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.BinaryOperator.Reduce(NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack)">
+            <summary>
+            Reduce produces a constraint from the operator and 
+            any arguments. It takes the arguments from the constraint 
+            stack and pushes the resulting constraint on it.
+            </summary>
+            <param name="stack"></param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.BinaryOperator.ApplyOperator(NUnit.Framework.Constraints.Constraint,NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Abstract method that produces a constraint by applying
+            the operator to its left and right constraint arguments.
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.BinaryOperator.LeftPrecedence">
+            <summary>
+            Gets the left precedence of the operator
+            </summary>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.BinaryOperator.RightPrecedence">
+            <summary>
+            Gets the right precedence of the operator
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AndOperator.#ctor">
+            <summary>
+            Construct an AndOperator
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AndOperator.ApplyOperator(NUnit.Framework.Constraints.Constraint,NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Apply the operator to produce an AndConstraint
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.AttributeOperator">
+            <summary>
+            Operator that tests for the presence of a particular attribute
+            on a type and optionally applies further tests to the attribute.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.SelfResolvingOperator">
+            <summary>
+            Abstract base class for operators that are able to reduce to a 
+            constraint whether or not another syntactic element follows.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AttributeOperator.#ctor(System.Type)">
+            <summary>
+            Construct an AttributeOperator for a particular Type
+            </summary>
+            <param name="type">The Type of attribute tested</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.AttributeOperator.Reduce(NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack)">
+            <summary>
+            Reduce produces a constraint from the operator and 
+            any arguments. It takes the arguments from the constraint 
+            stack and pushes the resulting constraint on it.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ExactCountOperator">
+            <summary>
+            Represents a constraint that succeeds if the specified 
+            count of members of a collection match a base constraint.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ExactCountOperator.#ctor(System.Int32)">
+            <summary>
+            Construct an ExactCountOperator for a specified count
+            </summary>
+            <param name="expectedCount">The expected count</param>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ExactCountOperator.ApplyPrefix(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Returns a constraint that will apply the argument
+            to the members of a collection, succeeding if
+            none of them succeed.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.NoneOperator">
+            <summary>
+            Represents a constraint that succeeds if none of the 
+            members of a collection match a base constraint.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NoneOperator.ApplyPrefix(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Returns a constraint that will apply the argument
+            to the members of a collection, succeeding if
+            none of them succeed.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.NotOperator">
+            <summary>
+            Negates the test of the constraint it wraps.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NotOperator.#ctor">
+            <summary>
+            Constructs a new NotOperator
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.NotOperator.ApplyPrefix(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Returns a NotConstraint applied to its argument.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.OrOperator">
+            <summary>
+            Operator that requires at least one of it's arguments to succeed
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.OrOperator.#ctor">
+            <summary>
+            Construct an OrOperator
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.OrOperator.ApplyOperator(NUnit.Framework.Constraints.Constraint,NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Apply the operator to produce an OrConstraint
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.PropOperator">
+            <summary>
+            Operator used to test for the presence of a named Property
+            on an object and optionally apply further tests to the
+            value of that property.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PropOperator.#ctor(System.String)">
+            <summary>
+            Constructs a PropOperator for a particular named property
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.PropOperator.Reduce(NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack)">
+            <summary>
+            Reduce produces a constraint from the operator and 
+            any arguments. It takes the arguments from the constraint 
+            stack and pushes the resulting constraint on it.
+            </summary>
+            <param name="stack"></param>
+        </member>
+        <member name="P:NUnit.Framework.Constraints.PropOperator.Name">
+            <summary>
+            Gets the name of the property to which the operator applies
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.SomeOperator">
+            <summary>
+            Represents a constraint that succeeds if any of the 
+            members of a collection match a base constraint.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.SomeOperator.ApplyPrefix(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Returns a constraint that will apply the argument
+            to the members of a collection, succeeding if
+            any of them succeed.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.ThrowsOperator">
+            <summary>
+            Operator that tests that an exception is thrown and
+            optionally applies further tests to the exception.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ThrowsOperator.#ctor">
+            <summary>
+            Construct a ThrowsOperator
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.ThrowsOperator.Reduce(NUnit.Framework.Constraints.ConstraintBuilder.ConstraintStack)">
+            <summary>
+            Reduce produces a constraint from the operator and 
+            any arguments. It takes the arguments from the constraint 
+            stack and pushes the resulting constraint on it.
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.Constraints.WithOperator">
+            <summary>
+            Represents a constraint that simply wraps the
+            constraint provided as an argument, without any
+            further functionality, but which modifes the
+            order of evaluation because of its precedence.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.WithOperator.#ctor">
+            <summary>
+            Constructor for the WithOperator
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.Constraints.WithOperator.ApplyPrefix(NUnit.Framework.Constraints.Constraint)">
+            <summary>
+            Returns a constraint that wraps its argument
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.AssertionException">
+            <summary>
+            Thrown when an assertion failed.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.AssertionException.#ctor(System.String)">
+            <param name="message">The error message that explains 
+            the reason for the exception</param>
+        </member>
+        <member name="M:NUnit.Framework.AssertionException.#ctor(System.String,System.Exception)">
+            <param name="message">The error message that explains 
+            the reason for the exception</param>
+            <param name="inner">The exception that caused the 
+            current exception</param>
+        </member>
+        <member name="M:NUnit.Framework.AssertionException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Serialization Constructor
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.IgnoreException">
+            <summary>
+            Thrown when an assertion failed.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.IgnoreException.#ctor(System.String)">
+            <param name="message"></param>
+        </member>
+        <member name="M:NUnit.Framework.IgnoreException.#ctor(System.String,System.Exception)">
+            <param name="message">The error message that explains 
+            the reason for the exception</param>
+            <param name="inner">The exception that caused the 
+            current exception</param>
+        </member>
+        <member name="M:NUnit.Framework.IgnoreException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Serialization Constructor
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.InconclusiveException">
+            <summary>
+            Thrown when a test executes inconclusively.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.InconclusiveException.#ctor(System.String)">
+            <param name="message">The error message that explains 
+            the reason for the exception</param>
+        </member>
+        <member name="M:NUnit.Framework.InconclusiveException.#ctor(System.String,System.Exception)">
+            <param name="message">The error message that explains 
+            the reason for the exception</param>
+            <param name="inner">The exception that caused the 
+            current exception</param>
+        </member>
+        <member name="M:NUnit.Framework.InconclusiveException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Serialization Constructor
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.SuccessException">
+            <summary>
+            Thrown when an assertion failed.
+            </summary>
+        </member>
+        <member name="M:NUnit.Framework.SuccessException.#ctor(System.String)">
+            <param name="message"></param>
+        </member>
+        <member name="M:NUnit.Framework.SuccessException.#ctor(System.String,System.Exception)">
+            <param name="message">The error message that explains 
+            the reason for the exception</param>
+            <param name="inner">The exception that caused the 
+            current exception</param>
+        </member>
+        <member name="M:NUnit.Framework.SuccessException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Serialization Constructor
+            </summary>
+        </member>
+        <member name="T:NUnit.Framework.INUnitEqualityComparer`1">
+            <summary>
+            
+            </summary>
+            <typeparam name="T"></typeparam>
+        </member>
+        <member name="M:NUnit.Framework.INUnitEqualityComparer`1.AreEqual(`0,`0,NUnit.Framework.Constraints.Tolerance@)">
+            <summary>
+            Compares two objects of a given Type for equality within a tolerance
+            </summary>
+            <param name="x">The first object to compare</param>
+            <param name="y">The second object to compare</param>
+            <param name="tolerance">The tolerance to use in the comparison</param>
+            <returns></returns>
+        </member>
+    </members>
+</doc>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/NUnit.2.6.3/license.txt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,15 @@
+Copyright  2002-2013 Charlie Poole
+Copyright  2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov
+Copyright  2000-2002 Philip A. Craig
+
+This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment (see the following) in the product documentation is required.
+
+Portions Copyright  2002-2013 Charlie Poole or Copyright  2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov or Copyright  2000-2002 Philip A. Craig
+
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source distribution.
Binary file packages/Npgsql.2.0.14.3/Npgsql.2.0.14.3.nupkg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/Npgsql.2.0.14.3/Npgsql.2.0.14.3.nuspec	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
+  <metadata>
+    <id>Npgsql</id>
+    <version>2.0.14.3</version>
+    <title>Npgsql</title>
+    <authors>Francisco Figueiredo Jr.,  Josh Cooley,  Dave Page,  Jon Asher,  Brar Piening,  Chris Morgan,  Hiroshi Saito,  Jon Hanna,  Federico Di Gregorio,  Glen Parker,  Shay Rojansky</authors>
+    <owners>Francisco Figueiredo Jr.,  Josh Cooley,  Dave Page,  Jon Asher,  Brar Piening,  Chris Morgan,  Hiroshi Saito,  Jon Hanna,  Federico Di Gregorio,  Glen Parker,  Shay Rojansky</owners>
+    <licenseUrl>http://www.opensource.org/licenses/bsd-license.php</licenseUrl>
+    <projectUrl>http://project.npgsql.org/</projectUrl>
+    <requireLicenseAcceptance>false</requireLicenseAcceptance>
+    <description>Npgsql is a .Net data provider for Postgresql. It allows any program developed for .Net framework to access database server. It is implemented in 100% C# code. Works with Postgresql 7.x and above.</description>
+    <summary>Npgsql is a .Net data provider for Postgresql.</summary>
+    <releaseNotes>This is a small bugfix release for EF.</releaseNotes>
+    <copyright>Copyright 2002 - 2013 Npgsql Development Team</copyright>
+    <language>en-US</language>
+    <tags>Npgsql postgres data database Postgresql</tags>
+  </metadata>
+</package>
\ No newline at end of file
Binary file packages/Npgsql.2.0.14.3/lib/net20/Mono.Security.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net20/Npgsql.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/Npgsql.2.0.14.3/lib/net20/Npgsql.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4683 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>Npgsql</name>
+    </assembly>
+    <members>
+        <member name="T:NpgsqlTypes.ArrayNativeToBackendTypeConverter">
+            <summary>
+            Handles serialisation of .NET array or IEnumeration to pg format.
+            Arrays of arrays, enumerations of enumerations, arrays of enumerations etc.
+            are treated as multi-dimensional arrays (in much the same manner as an array of arrays
+            is used to emulate multi-dimensional arrays in languages that lack native support for them).
+            If such an enumeration of enumerations is "jagged" (as opposed to rectangular, cuboid,
+            hypercuboid, hyperhypercuboid, etc) then this class will "correctly" serialise it, but pg
+            will raise an error as it doesn't allow jagged arrays.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayNativeToBackendTypeConverter.#ctor(NpgsqlTypes.NpgsqlNativeTypeInfo)">
+            <summary>
+            Create an ArrayNativeToBackendTypeConverter with the element converter passed
+            </summary>
+            <param name="elementConverter">The <see cref="T:NpgsqlTypes.NpgsqlNativeTypeInfo"/> that would be used to serialise the element type.</param>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayNativeToBackendTypeConverter.FromArray(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Serialise the enumeration or array.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.ArrayBackendToNativeTypeConverter">
+            <summary>
+            Handles parsing of pg arrays into .NET arrays.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.TokenEnumeration(System.String)">
+            <summary>
+            Takes a string representation of a pg 1-dimensional array
+            (or a 1-dimensional row within an n-dimensional array)
+            and allows enumeration of the string represenations of each items.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.ArrayChunkEnumeration(System.String)">
+            <summary>
+            Takes a string representation of a pg n-dimensional array
+            and allows enumeration of the string represenations of the next
+            lower level of rows (which in turn can be taken as (n-1)-dimensional arrays.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.RecursiveArrayListEnumeration(System.Collections.ArrayList)">
+            <summary>
+            Takes an ArrayList which may be an ArrayList of ArrayLists, an ArrayList of ArrayLists of ArrayLists
+            and so on and enumerates the items that aren't ArrayLists (the leaf nodes if we think of the ArrayList
+            passed as a tree). Simply uses the ArrayLists' own IEnumerators to get that of the next,
+            pushing them onto a stack until we hit something that isn't an ArrayList.
+            <param name="list"><see cref="T:System.Collections.ArrayList">ArrayList</see> to enumerate</param>
+            <returns><see cref="T:System.Collections.IEnumerable">IEnumerable</see></returns>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.#ctor(NpgsqlTypes.NpgsqlBackendTypeInfo)">
+            <summary>
+            Create a new ArrayBackendToNativeTypeConverter
+            </summary>
+            <param name="elementConverter"><see cref="T:NpgsqlTypes.NpgsqlBackendTypeInfo"/> for the element type.</param>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.ToArray(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Creates an array from pg representation.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.ToArrayList(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Creates an array list from pg represenation of an array.
+            Multidimensional arrays are treated as ArrayLists of ArrayLists
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.ToArray(System.Collections.ArrayList,System.Type)">
+            <summary>
+            Creates an n-dimensional array from an ArrayList of ArrayLists or
+            a 1-dimensional array from something else. 
+            </summary>
+            <param name="list"><see cref="T:System.Collections.ArrayList"/> to convert</param>
+            <returns><see cref="T:System.Array"/> produced.</returns>
+        </member>
+        <member name="T:NpgsqlTypes.ArrayBackendToNativeTypeConverter.IntSetIterator">
+            <summary>
+            Takes an array of ints and treats them like the limits of a set of counters.
+            Retains a matching set of ints that is set to all zeros on the first ++
+            On a ++ it increments the "right-most" int. If that int reaches it's 
+            limit it is set to zero and the one before it is incremented, and so on.
+            
+            Making this a more general purpose class is pretty straight-forward, but we'll just put what we need here.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.BitString">
+            <summary>
+            <para>Implements a bit string; a collection of zero or more bits which can each be 1 or 0.</para>
+            <para>BitString's behave as a list of bools, though like most strings and unlike most collections the position
+            tends to be of as much significance as the value.</para>
+            <para>BitStrings are often used as masks, and are commonly cast to and from other values.</para>
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.BitString.Empty">
+            <summary>
+            Represents the empty string.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.#ctor(System.Collections.Generic.IEnumerable{System.Boolean})">
+            <summary>
+            Create a BitString from an enumeration of boolean values. The BitString will contain
+            those booleans in the order they came in.
+            </summary>
+            <param name="bits">The boolean values.</param>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.#ctor(System.Boolean,System.Int32)">
+            <summary>
+            Creates a BitString filled with a given number of true or false values.
+            </summary>
+            <param name="value">The value to fill the string with.</param>
+            <param name="count">The number of bits to fill.</param>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.#ctor(System.String)">
+            <summary>
+            Creats a bitstring from a <see cref="T:System.String">string</see>.
+            <param name="str">The <see cref="T:System.String">string to copy from</see>.</param>
+            <seealso cref="!:Npgsql.BitString.Parse(System.String)"/>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.#ctor(System.Boolean)">
+            <summary>
+            Creates a single-bit element from a boolean value.
+            </summary>
+            <param name="boolean">The <see cref="T:System.Boolean">bool</see> value which determines whether
+            the bit is 1 or 0.</param>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.#ctor(System.UInt32)">
+            <summary>
+            Creates a bitstring from an unsigned integer value. The string will be the shortest required to
+            contain the integer (e.g. 1 bit for 0 or 1, 2 for 2 or 3, 3 for 4-7, and so on).
+            </summary>
+            <param name="integer">The <see cref="T:System.UInt32">integer</see>.</param>
+            <remarks>This method is not CLS Compliant, and may not be available to some languages.</remarks>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.#ctor(System.Int32)">
+            <summary>
+            Creates a bitstring from an integer value. The string will be the shortest required to
+            contain the integer (e.g. 1 bit for 0 or 1, 2 for 2 or 3, 3 for 4-7, and so on).
+            </summary>
+            <param name="integer">The <see cref="T:System.Int32">integer</see>.</param>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.IndexOf(System.Boolean)">
+            <summary>
+            Finds the first instance of a given value
+            </summary>
+            <param name="item">The value - whether true or false - to search for.</param>
+            <returns>The index of the value found, or -1 if none are present.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Contains(System.Boolean)">
+            <summary>
+            True if there is at least one bit with the value looked for.
+            </summary>
+            <param name="item">The value - true or false - to detect.</param>
+            <returns>True if at least one bit was the same as item, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.CopyTo(System.Boolean[],System.Int32)">
+            <summary>
+            Copies the bitstring to an array of bools.
+            </summary>
+            <param name="array">The <see cref="T:System.Boolean">boolean</see> array to copy to.</param>
+            <param name="arrayIndex">The index in the array to start copying from.</param>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.GetEnumerator">
+            <summary>
+            Returns an enumerator that enumerates through the string.
+            </summary>
+            <returns>The enumerator.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Concat(NpgsqlTypes.BitString)">
+            <summary>
+            Creats a bitstring by concatenating another onto this one.
+            </summary>
+            <param name="append">The string to append to this one.</param>
+            <returns>The combined strings.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Substring(System.Int32,System.Int32)">
+            <summary>
+            Returns a substring of this string.
+            </summary>
+            <param name="start">The position to start from, must be between 0 and the length of the string.</param>
+            <param name="length">The length of the string to return, must be greater than zero, and may not be
+            so large that the start + length exceeds the bounds of this instance.</param>
+            <returns>The Bitstring identified</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Substring(System.Int32)">
+            <summary>
+            Returns a substring of this string.
+            </summary>
+            <param name="start">The position to start from, must be between 0 and the length of the string,
+            the rest of the string is returned.</param>
+            <returns>The Bitstring identified</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.And(NpgsqlTypes.BitString)">
+            <summary>
+            A logical and between this string and another. The two strings must be the same length.
+            </summary>
+            <param name="operand">Another BitString to AND with this one.</param>
+            <returns>A bitstring with 1 where both BitStrings had 1 and 0 otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Or(NpgsqlTypes.BitString)">
+            <summary>
+            A logical or between this string and another. The two strings must be the same length.
+            </summary>
+            <param name="operand">Another BitString to OR with this one.</param>
+            <returns>A bitstring with 1 where either BitString had 1 and 0 otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Xor(NpgsqlTypes.BitString)">
+            <summary>
+            A logical xor between this string and another. The two strings must be the same length.
+            </summary>
+            <param name="operand">Another BitString to XOR with this one.</param>
+            <returns>A bitstring with 1 where one BitStrings and the other had 0,
+            and 0 where they both had 1 or both had 0.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Not">
+            <summary>
+            A bitstring that is the logical inverse of this one.
+            </summary>
+            <returns>A bitstring of the same length as this with 1 where this has 0 and vice-versa.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.LShift(System.Int32)">
+            <summary>
+            Shifts the string operand bits to the left, filling with zeros to produce a
+            string of the same length.
+            </summary>
+            <param name="operand">The number of bits to shift to the left.</param>
+            <returns>A left-shifted bitstring.</returns>
+            <remarks><para>The behaviour of LShift is closer to what one would expect from dealing
+            with PostgreSQL bit-strings than in using the same operations on integers in .NET</para>
+            <para>In particular, negative operands result in a right-shift, and operands greater than
+            the length of the string will shift it entirely, resulting in a zero-filled string.</para>
+            </remarks>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.RShift(System.Int32)">
+            <summary>
+            Shifts the string operand bits to the right, filling with zeros to produce a
+            string of the same length.
+            </summary>
+            <param name="operand">The number of bits to shift to the right.</param>
+            <returns>A right-shifted bitstring.</returns>
+            <remarks><para>The behaviour of RShift is closer to what one would expect from dealing
+            with PostgreSQL bit-strings than in using the same operations on integers in .NET</para>
+            <para>In particular, negative operands result in a left-shift, and operands greater than
+            the length of the string will shift it entirely, resulting in a zero-filled string. It also performs
+            a logical shift, rather than an arithmetic shift, so it always sets the vacated bit positions to zero
+            (like PostgreSQL and like .NET for unsigned integers but not for signed integers).</para>
+            </remarks>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Equals(NpgsqlTypes.BitString)">
+            <summary>
+            Returns true if the this string is identical to the argument passed.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.CompareTo(NpgsqlTypes.BitString)">
+            <summary>
+            Compares two strings. Strings are compared as strings, so while 0 being less than 1 will
+            mean a comparison between two strings of the same size is the same as treating them as numbers,
+            in the case of two strings of differing lengths the comparison starts at the right-most (most significant)
+            bit, and if all bits of the shorter string are exhausted without finding a comparison, then the larger
+            string is deemed to be greater than the shorter (0010 is greater than 0001 but less than 00100).
+            </summary>
+            <param name="other">Another string to compare with this one.</param>
+            <returns>A value if the two strings are identical, an integer less
+            than zero if this is less than the argument, and an integer greater
+            than zero otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.CompareTo(System.Object)">
+            <summary>
+            Compares the string with another object.
+            </summary>
+            <param name="obj">The object to compare with.</param>
+            <returns>If the object is null then this string is considered greater. If the object is another BitString
+            then they are compared as in <see cref="!:CompareTo(Npgsql.BitString)">the explicit comparison for BitStrings</see>
+            in any other case a <see cref="T:System.ArgumentException"/> is thrown.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Equals(System.Object)">
+            <summary>
+            Compares this BitString with an object for equality.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.GetHashCode">
+            <summary>
+            Returns a code for use in hashing operations.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToString(System.String)">
+            <summary>
+            Returns a string representation of the BitString.
+            </summary>
+            <param name="format">
+            A string which can contain a letter and optionally a number which sets a minimum size for the string
+            returned. In each case using the lower-case form of the letter will result in a lower-case string
+            being returned.
+            <list type="table">
+            <item>
+            <term>B</term>
+            <description>A string of 1s and 0s.</description>
+            </item>
+            <item>
+            <term>X</term>
+            <description>An hexadecimal string (will result in an error unless the string's length is divisible by 4).</description>
+            </item>
+            <item>
+            <term>G</term>
+            <description>A string of 1s and 0s in single-quotes preceded by 'B' (Postgres bit string literal syntax).</description>
+            </item>
+            <term>Y</term>
+            <description>An hexadecimal string in single-quotes preceded by 'X' (Postgres bit literal syntax, will result in an error unless the string's length is divisible by 4.</description>
+            </list>
+            <term>C</term>
+            <description>The format produced by format-string "Y" if legal, otherwise that produced by format-string "G".</description>
+            <term>E</term>
+            <description>The most compact safe representation for Postgres. If single bit will be either a 0 or a 1. Otherwise if it
+            can be that produce by format string "Y" it will, otherwise if there are less than 9bits in length it will be that
+            produced by format-string "G". For longer strings that cannot be represented in hexadecimal it will be a string
+            representing the first part of the string in format "Y" followed by the PostgreSQL concatenation operator, followed
+            by the final bits in the format "G". E.g. "X'13DCE'||B'110'"</description>
+            If format is empty or null, it is treated as if "B" had been passed (the default repreesentation, and that
+            generally used by PostgreSQL for display).
+            </param>
+            <returns>The formatted string.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToString">
+            <summary>
+            Returns a string representation for the Bitstring
+            </summary>
+            <returns>A string containing '0' and '1' characters.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToString(System.String,System.IFormatProvider)">
+            <summary>
+            Returns the same string as <see cref="M:NpgsqlTypes.BitString.ToString(System.String)"/>. formatProvider is ignored.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Parse(System.String)">
+            <summary>
+            Parses a string to produce a BitString. Most formats that can be produced by
+            <see cref="M:NpgsqlTypes.BitString.ToString(System.String)"/> can be accepted, but hexadecimal
+            can be interpreted with the preceding X' to mark the following characters as
+            being hexadecimal rather than binary.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_BitwiseAnd(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Performs a logical AND on the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_BitwiseOr(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Performs a logcial OR on the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_ExclusiveOr(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Perofrms a logical EXCLUSIVE-OR on the two operands
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_OnesComplement(NpgsqlTypes.BitString)">
+            <summary>
+            Performs a logical NOT on the operand.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_Addition(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Concatenates the operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_LeftShift(NpgsqlTypes.BitString,System.Int32)">
+            <summary>
+            Left-shifts the string BitString.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_RightShift(NpgsqlTypes.BitString,System.Int32)">
+            <summary>
+            Right-shifts the string BitString.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_Equality(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Compares the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_Inequality(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Compares the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_LessThan(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Compares the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_GreaterThan(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Compares the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_LessThanOrEqual(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Compares the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_GreaterThanOrEqual(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Compares the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToString(System.Text.Encoding)">
+            <summary>
+            Interprets the bitstring as a series of bits in an encoded character string,
+            encoded according to the Encoding passed, and returns that string.
+            The bitstring must contain a whole number of octets(bytes) and also be
+            valid according to the Encoding passed.
+            </summary>
+            <param name="encoding">The <see cref="T:System.Text.Encoding"/> to use in producing the string.</param>
+            <returns>The string that was encoded in the BitString.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToByteEnumerable">
+            <summary>
+            Interprets the bitstring as a series of octets (bytes) and returns those octets. Fails
+            if the Bitstring does not contain a whole number of octets (its length is not evenly
+            divisible by 8).
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToSByteEnumerable">
+            <summary>
+            Interprets the bitstring as a series of signed octets (bytes) and returns those octets. Fails
+            if the Bitstring does not contain a whole number of octets (its length is not evenly
+            divisible by 8).
+            <remarks>This method is not CLS-Compliant and may not be available to languages that cannot
+            handle signed bytes.</remarks>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToUInt16Enumerable">
+            <summary>
+            Interprets the bitstring as a series of unsigned 16-bit integers and returns those integers.
+            Fails if the Bitstring's length is not evenly divisible by 16.
+            <remarks>This method is not CLS-Compliant and may not be available to languages that cannot
+            handle unsigned integers.</remarks>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToInt16Enumerable">
+            <summary>
+            Interprets the bitstring as a series of 16-bit integers and returns those integers.
+            Fails if the Bitstring's length is not evenly divisible by 16.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToUInt32Enumerable">
+            <summary>
+            Interprets the bitstring as a series of unsigned 32-bit integers and returns those integers.
+            Fails if the Bitstring's length is not evenly divisible by 32.
+            <remarks>This method is not CLS-Compliant and may not be available to languages that cannot
+            handle unsigned integers.</remarks>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToInt32Enumerable">
+            <summary>
+            Interprets the bitstring as a series of signed 32-bit integers and returns those integers.
+            Fails if the Bitstring's length is not evenly divisible by 32.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToUInt64Enumerable">
+            <summary>
+            Interprets the bitstring as a series of unsigned 64-bit integers and returns those integers.
+            Fails if the Bitstring's length is not evenly divisible by 64.
+            <remarks>This method is not CLS-Compliant and may not be available to languages that cannot
+            handle unsigned integers.</remarks>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToInt64Enumerable">
+            <summary>
+            Interprets the bitstring as a series of signed 64-bit integers and returns those integers.
+            Fails if the Bitstring's length is not evenly divisible by 64.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.BitString.Length">
+            <summary>
+            The length of the string.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.BitString.Item(System.Int32)">
+            <summary>
+            Retrieves the value of the bit at the given index.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlInterval">
+            <summary>
+            Represents the PostgreSQL interval datatype.
+            <remarks>PostgreSQL differs from .NET in how it's interval type doesn't assume 24 hours in a day
+            (to deal with 23- and 25-hour days caused by daylight savings adjustments) and has a concept
+            of months that doesn't exist in .NET's <see cref="T:System.TimeSpan"/> class. (Neither datatype
+            has any concessions for leap-seconds).
+            <para>For most uses just casting to and from TimeSpan will work correctly — in particular,
+            the results of subtracting one <see cref="T:System.DateTime"/> or the PostgreSQL date, time and
+            timestamp types from another should be the same whether you do so in .NET or PostgreSQL —
+            but if the handling of days and months in PostgreSQL is important to your application then you
+            should use this class instead of <see cref="T:System.TimeSpan"/>.</para>
+            <para>If you don't know whether these differences are important to your application, they
+            probably arent! Just use <see cref="T:System.TimeSpan"/> and do not use this class directly ☺</para>
+            <para>To avoid forcing unnecessary provider-specific concerns on users who need not be concerned
+            with them a call to <see cref="!:IDataRecord.GetValue(int)"/> on a field containing an
+            <see cref="T:NpgsqlTypes.NpgsqlInterval"/> value will return a <see cref="T:System.TimeSpan"/> rather than an
+            <see cref="T:NpgsqlTypes.NpgsqlInterval"/>. If you need the extra functionality of <see cref="T:NpgsqlTypes.NpgsqlInterval"/>
+            then use <see cref="M:Npgsql.NpgsqlDataReader.GetInterval(System.Int32)"/>.</para>
+            </remarks>
+            <seealso cref="P:NpgsqlTypes.NpgsqlInterval.Ticks"/>
+            <seealso cref="M:NpgsqlTypes.NpgsqlInterval.JustifyDays"/>
+            <seealso cref="M:NpgsqlTypes.NpgsqlInterval.JustifyMonths"/>
+            <seealso cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerMicrosecond">
+            <summary>
+            Represents the number of ticks (100ns periods) in one microsecond. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerMillsecond">
+            <summary>
+            Represents the number of ticks (100ns periods) in one millisecond. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerSecond">
+            <summary>
+            Represents the number of ticks (100ns periods) in one second. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerMinute">
+            <summary>
+            Represents the number of ticks (100ns periods) in one minute. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerHour">
+            <summary>
+            Represents the number of ticks (100ns periods) in one hour. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerDay">
+            <summary>
+            Represents the number of ticks (100ns periods) in one day. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.HoursPerDay">
+            <summary>
+            Represents the number of hours in one day (assuming no daylight savings adjustments). This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.DaysPerMonth">
+            <summary>
+            Represents the number of days assumed in one month if month justification or unjustifcation is performed.
+            This is set to 30 for consistency with PostgreSQL. Note that this is means that month adjustments cause
+            a year to be taken as 30 &#xd7; 12 = 360 rather than 356/366 days.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerMonth">
+            <summary>
+            Represents the number of ticks (100ns periods) in one day, assuming 30 days per month. <seealso cref="F:NpgsqlTypes.NpgsqlInterval.DaysPerMonth"/>
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.MonthsPerYear">
+            <summary>
+            Represents the number of months in a year. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.MaxValue">
+            <summary>
+            Represents the maximum <see cref="T:NpgsqlTypes.NpgsqlInterval"/>. This field is read-only.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.MinValue">
+            <summary>
+            Represents the minimum <see cref="T:NpgsqlTypes.NpgsqlInterval"/>. This field is read-only.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.Zero">
+            <summary>
+            Represents the zero <see cref="T:NpgsqlTypes.NpgsqlInterval"/>. This field is read-only.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.Int64)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to the specified number of ticks.
+            </summary>
+            <param name="ticks">A time period expressed in 100ns units.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.TimeSpan)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to hold the same time as a <see cref="T:System.TimeSpan"/>
+            </summary>
+            <param name="timespan">A time period expressed in a <see cref="T:System.TimeSpan"/></param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.Int32,System.Int32,System.Int64)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to the specified number of months, days
+            &amp; ticks.
+            </summary>
+            <param name="months">Number of months.</param>
+            <param name="days">Number of days.</param>
+            <param name="ticks">Number of 100ns units.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.Int32,System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to the specified number of
+            days, hours, minutes &amp; seconds.
+            </summary>
+            <param name="days">Number of days.</param>
+            <param name="hours">Number of hours.</param>
+            <param name="minutes">Number of minutes.</param>
+            <param name="seconds">Number of seconds.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to the specified number of
+            days, hours, minutes, seconds &amp; milliseconds.
+            </summary>
+            <param name="days">Number of days.</param>
+            <param name="hours">Number of hours.</param>
+            <param name="minutes">Number of minutes.</param>
+            <param name="seconds">Number of seconds.</param>
+            <param name="milliseconds">Number of milliseconds.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to the specified number of
+            months, days, hours, minutes, seconds &amp; milliseconds.
+            </summary>
+            <param name="months">Number of months.</param>
+            <param name="days">Number of days.</param>
+            <param name="hours">Number of hours.</param>
+            <param name="minutes">Number of minutes.</param>
+            <param name="seconds">Number of seconds.</param>
+            <param name="milliseconds">Number of milliseconds.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to the specified number of
+            years, months, days, hours, minutes, seconds &amp; milliseconds.
+            <para>Years are calculated exactly equivalent to 12 months.</para>
+            </summary>
+            <param name="years">Number of years.</param>
+            <param name="months">Number of months.</param>
+            <param name="days">Number of days.</param>
+            <param name="hours">Number of hours.</param>
+            <param name="minutes">Number of minutes.</param>
+            <param name="seconds">Number of seconds.</param>
+            <param name="milliseconds">Number of milliseconds.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromTicks(System.Int64)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of ticks.
+            </summary>
+            <param name="ticks">The number of ticks (100ns units) in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of ticks.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromMicroseconds(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of microseconds.
+            </summary>
+            <param name="ticks">The number of microseconds in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of microseconds.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromMilliseconds(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of milliseconds.
+            </summary>
+            <param name="ticks">The number of milliseconds in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of milliseconds.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromSeconds(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of seconds.
+            </summary>
+            <param name="ticks">The number of seconds in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of seconds.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromMinutes(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of minutes.
+            </summary>
+            <param name="ticks">The number of minutes in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of minutes.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromHours(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of hours.
+            </summary>
+            <param name="ticks">The number of hours in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of hours.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromDays(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of days.
+            </summary>
+            <param name="ticks">The number of days in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of days.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromMonths(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of months.
+            </summary>
+            <param name="ticks">The number of months in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of months.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Add(NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Adds another interval to this instance and returns the result.
+            </summary>
+            <param name="interval">An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to add to this instance.</param>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"></see> whose values are the sums of the two instances.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Subtract(NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Subtracts another interval from this instance and returns the result.
+            </summary>
+            <param name="interval">An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to subtract from this instance.</param>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"></see> whose values are the differences of the two instances.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Negate">
+            <summary>
+            Returns an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> whose value is the negated value of this instance.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> whose value is the negated value of this instance.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Duration">
+            <summary>
+            This absolute value of this instance. In the case of some, but not all, components being negative,
+            the rules used for justification are used to determine if the instance is positive or negative.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> whose value is the absolute value of this instance.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.JustifyDays">
+            <summary>
+            Equivalent to PostgreSQL's justify_days function.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> based on this one, but with any hours outside of the range [-23, 23]
+            converted into days.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.UnjustifyDays">
+            <summary>
+            Opposite to PostgreSQL's justify_days function.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> based on this one, but with any days converted to multiples of ±24hours.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.JustifyMonths">
+            <summary>
+            Equivalent to PostgreSQL's justify_months function.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> based on this one, but with any days outside of the range [-30, 30]
+            converted into months.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.UnjustifyMonths">
+            <summary>
+            Opposite to PostgreSQL's justify_months function.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> based on this one, but with any months converted to multiples of ±30days.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.JustifyInterval">
+            <summary>
+            Equivalent to PostgreSQL's justify_interval function.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> based on this one,
+            but with any months converted to multiples of ±30days
+            and then with any days converted to multiples of ±24hours</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.UnjustifyInterval">
+            <summary>
+            Opposite to PostgreSQL's justify_interval function.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> based on this one, but with any months converted to multiples of ±30days and then any days converted to multiples of ±24hours;</returns>
+        </member>
+        <!-- Badly formed XML comment ignored for member "M:NpgsqlTypes.NpgsqlInterval.Canonicalize" -->
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_Implicit(System.TimeSpan)~NpgsqlTypes.NpgsqlInterval">
+            <summary>
+            Implicit cast of a <see cref="T:System.TimeSpan"/> to an <see cref="T:NpgsqlTypes.NpgsqlInterval"/>
+            </summary>
+            <param name="timespan">A <see cref="T:System.TimeSpan"/></param>
+            <returns>An eqivalent, canonical, <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_Explicit(NpgsqlTypes.NpgsqlInterval)~System.TimeSpan">
+            <summary>
+            Implicit cast of an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to a <see cref="T:System.TimeSpan"/>.
+            </summary>
+            <param name="interval">A <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</param>
+            <returns>An equivalent <see cref="T:System.TimeSpan"/>.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Equals(NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Returns true if another <see cref="T:NpgsqlTypes.NpgsqlInterval"/> is exactly the same as this instance.
+            </summary>
+            <param name="other">An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> for comparison.</param>
+            <returns>true if the two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instances are exactly the same,
+            false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Equals(System.Object)">
+            <summary>
+            Returns true if another object is an <see cref="T:NpgsqlTypes.NpgsqlInterval"/>, that is exactly the same as
+            this instance
+            </summary>
+            <param name="obj">An <see cref="T:System.Object"/> for comparison.</param>
+            <returns>true if the argument is an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> and is exactly the same
+            as this one, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Compare(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Compares two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instances.
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</param>
+            <returns>0 if the two are equal or equivalent. A value greater than zero if x is greater than y,
+            a value less than zero if x is less than y.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.GetHashCode">
+            <summary>
+            A hash code suitable for uses with hashing algorithms.
+            </summary>
+            <returns>An signed integer.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.CompareTo(NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Compares this instance with another/
+            </summary>
+            <param name="other">An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare this with.</param>
+            <returns>0 if the instances are equal or equivalent. A value less than zero if
+            this instance is less than the argument. A value greater than zero if this instance
+            is greater than the instance.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.CompareTo(System.Object)">
+            <summary>
+            Compares this instance with another/
+            </summary>
+            <param name="other">An object to compare this with.</param>
+            <returns>0 if the argument is an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> and the instances are equal or equivalent.
+            A value less than zero if the argument is an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> and
+            this instance is less than the argument.
+            A value greater than zero if the argument is an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> and this instance
+            is greater than the instance.</returns>
+            A value greater than zero if the argument is null.
+            <exception cref="T:System.ArgumentException">The argument is not an <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</exception>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Parse(System.String)">
+            <summary>
+            Parses a <see cref="T:System.String"/> and returns a <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instance.
+            Designed to use the formats generally returned by PostgreSQL.
+            </summary>
+            <param name="str">The <see cref="T:System.String"/> to parse.</param>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> represented by the argument.</returns>
+            <exception cref="T:System.ArgumentNullException">The string was null.</exception>
+            <exception cref="T:System.OverflowException">A value obtained from parsing the string exceeded the values allowed for the relevant component.</exception>
+            <exception cref="T:System.FormatException">The string was not in a format that could be parsed to produce an <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</exception>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.TryParse(System.String,NpgsqlTypes.NpgsqlInterval@)">
+            <summary>
+            Attempt to parse a <see cref="T:System.String"/> to produce an <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.
+            </summary>
+            <param name="str">The <see cref="T:System.String"/> to parse.</param>
+            <param name="result">(out) The <see cref="T:NpgsqlTypes.NpgsqlInterval"/> produced, or <see cref="F:NpgsqlTypes.NpgsqlInterval.Zero"/> if the parsing failed.</param>
+            <returns>true if the parsing succeeded, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.ToString">
+            <summary>
+            Create a <see cref="T:System.String"/> representation of the <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instance.
+            The format returned is of the form:
+            [M mon[s]] [d day[s]] [HH:mm:ss[.f[f[f[f[f[f[f[f[f]]]]]]]]]]
+            A zero <see cref="T:NpgsqlTypes.NpgsqlInterval"/> is represented as 00:00:00
+            <remarks>
+            Ticks are 100ns, Postgress resolution is only to 1µs at most. Hence we lose 1 or more decimal
+            precision in storing values in the database. Despite this, this method will output that extra
+            digit of precision. It's forward-compatible with any future increases in resolution up to 100ns,
+            and also makes this ToString() more applicable to any other use-case.
+            </remarks>
+            </summary>
+            <returns>The <see cref="T:System.String"/> representation.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_Addition(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Adds two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> together.
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to add.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to add.</param>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> whose values are the sum of the arguments.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_Subtraction(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Subtracts one <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from another.
+            </summary>
+            <param name="x">The <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to subtract the other from.</param>
+            <param name="y">The <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to subtract from the other.</param>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> whose values are the difference of the arguments</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_Equality(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Returns true if two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> are exactly the same.
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <returns>true if the two arguments are exactly the same, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_Inequality(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Returns false if two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> are exactly the same.
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <returns>false if the two arguments are exactly the same, true otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_LessThan(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Compares two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instances to see if the first is less than the second
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <returns>true if the first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> is less than second, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_LessThanOrEqual(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Compares two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instances to see if the first is less than or equivalent to the second
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <returns>true if the first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> is less than or equivalent to second, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_GreaterThan(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Compares two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instances to see if the first is greater than the second
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <returns>true if the first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> is greater than second, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_GreaterThanOrEqual(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Compares two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instances to see if the first is greater than or equivalent the second
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <returns>true if the first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> is greater than or equivalent to the second, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_UnaryPlus(NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Returns the instance.
+            </summary>
+            <param name="x">An <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</param>
+            <returns>The argument.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_UnaryNegation(NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Negates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instance.
+            </summary>
+            <param name="x">An <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</param>
+            <returns>The negation of the argument.</returns>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Ticks">
+            <summary>
+            The total number of ticks(100ns units) contained. This is the resolution of the
+            <see cref="T:NpgsqlTypes.NpgsqlInterval"/>  type. This ignores the number of days and
+            months held. If you want them included use <see cref="M:NpgsqlTypes.NpgsqlInterval.UnjustifyInterval"/> first.
+            <remarks>The resolution of the PostgreSQL
+            interval type is by default 1µs = 1,000 ns. It may be smaller as follows:
+            <list type="number">
+            <item>
+            <term>interval(0)</term>
+            <description>resolution of 1s (1 second)</description>
+            </item>
+            <item>
+            <term>interval(1)</term>
+            <description>resolution of 100ms = 0.1s (100 milliseconds)</description>
+            </item>
+            <item>
+            <term>interval(2)</term>
+            <description>resolution of 10ms = 0.01s (10 milliseconds)</description>
+            </item>
+            <item>
+            <term>interval(3)</term>
+            <description>resolution of 1ms = 0.001s (1 millisecond)</description>
+            </item>
+            <item>
+            <term>interval(4)</term>
+            <description>resolution of 100µs = 0.0001s (100 microseconds)</description>
+            </item>
+            <item>
+            <term>interval(5)</term>
+            <description>resolution of 10µs = 0.00001s (10 microseconds)</description>
+            </item>
+            <item>
+            <term>interval(6) or interval</term>
+            <description>resolution of 1µs = 0.000001s (1 microsecond)</description>
+            </item>
+            </list>
+            <para>As such, if the 100-nanosecond resolution is significant to an application, a PostgreSQL interval will
+            not suffice for those purposes.</para>
+            <para>In more frequent cases though, the resolution of the interval suffices.
+            <see cref="T:NpgsqlTypes.NpgsqlInterval"/> will always suffice to handle the resolution of any interval value, and upon
+            writing to the database, will be rounded to the resolution used.</para>
+            </remarks>
+            <returns>The number of ticks in the instance.</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Microseconds">
+            <summary>
+            Gets the number of whole microseconds held in the instance.
+            <returns>An  in the range [-999999, 999999].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Milliseconds">
+            <summary>
+            Gets the number of whole milliseconds held in the instance.
+            <returns>An  in the range [-999, 999].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Seconds">
+            <summary>
+            Gets the number of whole seconds held in the instance.
+            <returns>An  in the range [-59, 59].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Minutes">
+            <summary>
+            Gets the number of whole minutes held in the instance.
+            <returns>An  in the range [-59, 59].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Hours">
+            <summary>
+            Gets the number of whole hours held in the instance.
+            <remarks>Note that this can be less than -23 or greater than 23 unless <see cref="M:NpgsqlTypes.NpgsqlInterval.JustifyDays"/>
+            has been used to produce this instance.</remarks>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Days">
+            <summary>
+            Gets the number of days held in the instance.
+            <remarks>Note that this does not pay attention to a time component with -24 or less hours or
+            24 or more hours, unless <see cref="M:NpgsqlTypes.NpgsqlInterval.JustifyDays"/> has been called to produce this instance.</remarks>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Months">
+            <summary>
+            Gets the number of months held in the instance.
+            <remarks>Note that this does not pay attention to a day component with -30 or less days or
+            30 or more days, unless <see cref="M:NpgsqlTypes.NpgsqlInterval.JustifyMonths"/> has been called to produce this instance.</remarks>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Time">
+            <summary>
+            Returns a <see cref="T:System.TimeSpan"/> representing the time component of the instance.
+            <remarks>Note that this may have a value beyond the range ±23:59:59.9999999 unless
+            <see cref="M:NpgsqlTypes.NpgsqlInterval.JustifyDays"/> has been called to produce this instance.</remarks>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalTicks">
+            <summary>
+            The total number of ticks (100ns units) in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalMicroseconds">
+            <summary>
+            The total number of microseconds in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalMilliseconds">
+            <summary>
+            The total number of milliseconds in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalSeconds">
+            <summary>
+            The total number of seconds in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalMinutes">
+            <summary>
+            The total number of minutes in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalHours">
+            <summary>
+            The total number of hours in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalDays">
+            <summary>
+            The total number of days in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalMonths">
+            <summary>
+            The total number of months in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTime.Normalize">
+            <summary>
+            Normalise this time; if it is 24:00:00, convert it to 00:00:00
+            </summary>
+            <returns>This time, normalised</returns>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTime.Ticks">
+            <summary>
+            The total number of ticks(100ns units) contained. This is the resolution of the
+            <see cref="T:NpgsqlTypes.NpgsqlTime"/>  type.
+            <remarks>The resolution of the PostgreSQL
+            interval type is by default 1µs = 1,000 ns. It may be smaller as follows:
+            <list type="number">
+            <item>
+            <term>time(0)</term>
+            <description>resolution of 1s (1 second)</description>
+            </item>
+            <item>
+            <term>time(1)</term>
+            <description>resolution of 100ms = 0.1s (100 milliseconds)</description>
+            </item>
+            <item>
+            <term>time(2)</term>
+            <description>resolution of 10ms = 0.01s (10 milliseconds)</description>
+            </item>
+            <item>
+            <term>time(3)</term>
+            <description>resolution of 1ms = 0.001s (1 millisecond)</description>
+            </item>
+            <item>
+            <term>time(4)</term>
+            <description>resolution of 100µs = 0.0001s (100 microseconds)</description>
+            </item>
+            <item>
+            <term>time(5)</term>
+            <description>resolution of 10µs = 0.00001s (10 microseconds)</description>
+            </item>
+            <item>
+            <term>time(6) or interval</term>
+            <description>resolution of 1µs = 0.000001s (1 microsecond)</description>
+            </item>
+            </list>
+            <para>As such, if the 100-nanosecond resolution is significant to an application, a PostgreSQL time will
+            not suffice for those purposes.</para>
+            <para>In more frequent cases though, the resolution of time suffices.
+            <see cref="T:NpgsqlTypes.NpgsqlTime"/> will always suffice to handle the resolution of any time value, and upon
+            writing to the database, will be rounded to the resolution used.</para>
+            </remarks>
+            <returns>The number of ticks in the instance.</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTime.Microseconds">
+            <summary>
+            Gets the number of whole microseconds held in the instance.
+            <returns>An integer in the range [0, 999999].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTime.Milliseconds">
+            <summary>
+            Gets the number of whole milliseconds held in the instance.
+            <returns>An integer in the range [0, 999].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTime.Seconds">
+            <summary>
+            Gets the number of whole seconds held in the instance.
+            <returns>An interger in the range [0, 59].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTime.Minutes">
+            <summary>
+            Gets the number of whole minutes held in the instance.
+            <returns>An integer in the range [0, 59].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTime.Hours">
+            <summary>
+            Gets the number of whole hours held in the instance.
+            <remarks>Note that the time 24:00:00 can be stored for roundtrip compatibility. Any calculations on such a
+            value will normalised it to 00:00:00.</remarks>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTimeTZ.Normalize">
+            <summary>
+            Normalise this time; if it is 24:00:00, convert it to 00:00:00
+            </summary>
+            <returns>This time, normalised</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTimeTZ.CompareTo(NpgsqlTypes.NpgsqlTimeTZ)">
+            <summary>
+            Compares this with another <see cref="T:NpgsqlTypes.NpgsqlTimeTZ"/>. As per postgres' rules,
+            first the times are compared as if they were both in the same timezone. If they are equal then
+            then timezones are compared (+01:00 being "smaller" than -01:00).
+            </summary>
+            <param name="other">the <see cref="T:NpgsqlTypes.NpgsqlTimeTZ"/> to compare with.</param>
+            <returns>An integer which is 0 if they are equal, &lt; 0 if this is the smaller and &gt; 0 if this is the larger.</returns>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTimeTZ.Microseconds">
+            <summary>
+            Gets the number of whole microseconds held in the instance.
+            <returns>An integer in the range [0, 999999].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTimeTZ.Milliseconds">
+            <summary>
+            Gets the number of whole milliseconds held in the instance.
+            <returns>An integer in the range [0, 999].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTimeTZ.Seconds">
+            <summary>
+            Gets the number of whole seconds held in the instance.
+            <returns>An interger in the range [0, 59].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTimeTZ.Minutes">
+            <summary>
+            Gets the number of whole minutes held in the instance.
+            <returns>An integer in the range [0, 59].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTimeTZ.Hours">
+            <summary>
+            Gets the number of whole hours held in the instance.
+            <remarks>Note that the time 24:00:00 can be stored for roundtrip compatibility. Any calculations on such a
+            value will normalised it to 00:00:00.</remarks>
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.LargeObjectManager">
+            <summary>
+            Summary description for LargeObjectManager.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.BasicBackendToNativeTypeConverter">
+            <summary>
+            Provide event handlers to convert all native supported basic data types from their backend
+            text representation to a .NET object.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToBinary(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Binary data.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToBoolean(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql boolean to a System.Boolean.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToBit(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql bit to a System.Boolean.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToDateTime(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql datetime to a System.DateTime.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToDate(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql date to a System.DateTime.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToTime(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql time to a System.DateTime.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToMoney(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql money to a System.Decimal.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.BasicNativeToBackendTypeConverter">
+            <summary>
+            Provide event handlers to convert the basic native supported data types from
+            native form to backend representation.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToBinary(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Binary data.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToBoolean(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgresql boolean.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToBit(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgresql bit.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToDateTime(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgresql timestamp.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToDate(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgresql date.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToTime(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgresql time.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToMoney(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgres money.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToSingleDouble(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgres double with maximum precision.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.ExtendedBackendToNativeTypeConverter">
+            <summary>
+            Provide event handlers to convert extended native supported data types from their backend
+            text representation to a .NET object.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToPoint(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql point to a System.NpgsqlPoint.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToBox(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql point to a System.RectangleF.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToLSeg(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            LDeg.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToPath(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Path.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToPolygon(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Polygon.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToCircle(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Circle.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToInet(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Inet.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToMacAddress(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            MAC Address.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToInterval(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            interval
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.ExtendedNativeToBackendTypeConverter">
+            <summary>
+            Provide event handlers to convert extended native supported data types from
+            native form to backend representation.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToPoint(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Point.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToBox(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Box.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToLSeg(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            LSeg.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToPath(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Open path.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToPolygon(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Polygon.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToMacAddress(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgres MAC Address.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToCircle(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Circle.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToIPAddress(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgres inet.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToInterval(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgres interval
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlPoint">
+            <summary>
+            Represents a PostgreSQL Point type
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlLSeg">
+            <summary>
+            Represents a PostgreSQL Line Segment type.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlPath">
+            <summary>
+            Represents a PostgreSQL Path type.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlPolygon">
+            <summary>
+            Represents a PostgreSQL Polygon type.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlCircle">
+            <summary>
+            Represents a PostgreSQL Circle type.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlInet">
+            <summary>
+            Represents a PostgreSQL inet type.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlMacAddress">
+            <summary>
+            Represents a PostgreSQL MacAddress type.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlMacAddress.#ctor(System.String)">
+            <summary>
+            
+            </summary>
+            <param name="macAddr">The macAddr parameter must contain a string that can only consist of numbers
+            and upper-case letters as hexadecimal digits. (See PhysicalAddress.Parse method on MSDN)</param>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlTypesHelper">
+            <summary>
+            This class contains helper methods for type conversion between
+            the .Net type system and postgresql.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlTypesHelper.BackendTypeMappingCache">
+            <summary>
+            A cache of basic datatype mappings keyed by server version.  This way we don't
+            have to load the basic type mappings for every connection.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.TryGetBackendTypeInfo(System.String,NpgsqlTypes.NpgsqlBackendTypeInfo@)">
+            <summary>
+            Find a NpgsqlNativeTypeInfo in the default types map that can handle objects
+            of the given NpgsqlDbType.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.TryGetNativeTypeInfo(NpgsqlTypes.NpgsqlDbType,NpgsqlTypes.NpgsqlNativeTypeInfo@)">
+            <summary>
+            Find a NpgsqlNativeTypeInfo in the default types map that can handle objects
+            of the given NpgsqlDbType.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.TryGetNativeTypeInfo(System.Data.DbType,NpgsqlTypes.NpgsqlNativeTypeInfo@)">
+            <summary>
+            Find a NpgsqlNativeTypeInfo in the default types map that can handle objects
+            of the given DbType.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.TryGetNativeTypeInfo(System.Type,NpgsqlTypes.NpgsqlNativeTypeInfo@)">
+            <summary>
+            Find a NpgsqlNativeTypeInfo in the default types map that can handle objects
+            of the given System.Type.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.ConvertBackendStringToSystemType(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+             This method is responsible to convert the string received from the backend
+             to the corresponding NpgsqlType.
+             The given TypeInfo is called upon to do the conversion.
+             If no TypeInfo object is provided, no conversion is performed.
+             </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.PrepareDefaultTypesMap">
+            <summary>
+            Create the one and only native to backend type map.
+            This map is used when formatting native data
+            types to backend representations.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.CreateAndLoadInitialTypesMapping(Npgsql.NpgsqlConnector)">
+            <summary>
+             This method creates (or retrieves from cache) a mapping between type and OID 
+             of all natively supported postgresql data types.
+             This is needed as from one version to another, this mapping can be changed and
+             so we avoid hardcoding them.
+             </summary>
+             <returns>NpgsqlTypeMapping containing all known data types.  The mapping must be
+             cloned before it is modified because it is cached; changes made by one connection may
+             effect another connection.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.LoadTypesMappings(Npgsql.NpgsqlConnector,NpgsqlTypes.NpgsqlBackendTypeMapping,System.Collections.Generic.IEnumerable{NpgsqlTypes.NpgsqlBackendTypeInfo})">
+            <summary>
+            Attempt to map types by issuing a query against pg_type.
+            This function takes a list of NpgsqlTypeInfo and attempts to resolve the OID field
+            of each by querying pg_type.  If the mapping is found, the type info object is
+            updated (OID) and added to the provided NpgsqlTypeMapping object.
+            </summary>
+            <param name="conn">NpgsqlConnector to send query through.</param>
+            <param name="TypeMappings">Mapping object to add types too.</param>
+            <param name="TypeInfoList">List of types that need to have OID's mapped.</param>
+        </member>
+        <member name="T:NpgsqlTypes.ConvertBackendToNativeHandler">
+            <summary>
+            Delegate called to convert the given backend data to its native representation.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.ConvertNativeToBackendHandler">
+            <summary>
+            Delegate called to convert the given native data to its backand representation.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlBackendTypeInfo">
+            <summary>
+            Represents a backend data type.
+            This class can be called upon to convert a backend field representation to a native object.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeInfo.#ctor(System.Int32,System.String,NpgsqlTypes.NpgsqlDbType,System.Data.DbType,System.Type,NpgsqlTypes.ConvertBackendToNativeHandler)">
+            <summary>
+            Construct a new NpgsqlTypeInfo with the given attributes and conversion handlers.
+            </summary>
+            <param name="OID">Type OID provided by the backend server.</param>
+            <param name="Name">Type name provided by the backend server.</param>
+            <param name="NpgsqlDbType">NpgsqlDbType</param>
+            <param name="Type">System type to convert fields of this type to.</param>
+            <param name="ConvertBackendToNative">Data conversion handler.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeInfo.ConvertToNative(System.String,System.Int16,System.Int32)">
+            <summary>
+            Perform a data conversion from a backend representation to 
+            a native object.
+            </summary>
+            <param name="BackendData">Data sent from the backend.</param>
+            <param name="TypeModifier">Type modifier field sent from the backend.</param>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeInfo.OID">
+            <summary>
+            Type OID provided by the backend server.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeInfo.Name">
+            <summary>
+            Type name provided by the backend server.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeInfo.NpgsqlDbType">
+            <summary>
+            NpgsqlDbType.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeInfo.DbType">
+            <summary>
+            NpgsqlDbType.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeInfo.Type">
+            <summary>
+            Provider type to convert fields of this type to.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeInfo.FrameworkType">
+            <summary>
+            System type to convert fields of this type to.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlNativeTypeInfo">
+            <summary>
+            Represents a backend data type.
+            This class can be called upon to convert a native object to its backend field representation,
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeInfo.ArrayOf(NpgsqlTypes.NpgsqlNativeTypeInfo)">
+            <summary>
+            Returns an NpgsqlNativeTypeInfo for an array where the elements are of the type
+            described by the NpgsqlNativeTypeInfo supplied.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeInfo.#ctor(System.String,NpgsqlTypes.NpgsqlDbType,System.Data.DbType,System.Boolean,NpgsqlTypes.ConvertNativeToBackendHandler)">
+            <summary>
+            Construct a new NpgsqlTypeInfo with the given attributes and conversion handlers.
+            </summary>
+            <param name="Name">Type name provided by the backend server.</param>
+            <param name="NpgsqlDbType">NpgsqlDbType</param>
+            <param name="ConvertNativeToBackend">Data conversion handler.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeInfo.ConvertToBackend(System.Object,System.Boolean)">
+            <summary>
+            Perform a data conversion from a native object to
+            a backend representation.
+            DBNull and null values are handled differently depending if a plain query is used
+            When 
+            </summary>
+            <param name="NativeData">Native .NET object to be converted.</param>
+            <param name="ForExtendedQuery">Flag indicating if the conversion has to be done for 
+            plain queries or extended queries</param>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlNativeTypeInfo.Name">
+            <summary>
+            Type name provided by the backend server.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlNativeTypeInfo.NpgsqlDbType">
+            <summary>
+            NpgsqlDbType.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlNativeTypeInfo.DbType">
+            <summary>
+            DbType.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlNativeTypeInfo.Quote">
+            <summary>
+            Apply quoting.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlNativeTypeInfo.UseSize">
+            <summary>
+            Use parameter size information.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlBackendTypeMapping">
+            <summary>
+            Provide mapping between type OID, type name, and a NpgsqlBackendTypeInfo object that represents it.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.#ctor">
+            <summary>
+            Construct an empty mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.#ctor(NpgsqlTypes.NpgsqlBackendTypeMapping)">
+            <summary>
+            Copy constuctor.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.AddType(NpgsqlTypes.NpgsqlBackendTypeInfo)">
+            <summary>
+            Add the given NpgsqlBackendTypeInfo to this mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.AddType(System.Int32,System.String,NpgsqlTypes.NpgsqlDbType,System.Data.DbType,System.Type,NpgsqlTypes.ConvertBackendToNativeHandler)">
+            <summary>
+            Add a new NpgsqlBackendTypeInfo with the given attributes and conversion handlers to this mapping.
+            </summary>
+            <param name="OID">Type OID provided by the backend server.</param>
+            <param name="Name">Type name provided by the backend server.</param>
+            <param name="NpgsqlDbType">NpgsqlDbType</param>
+            <param name="Type">System type to convert fields of this type to.</param>
+            <param name="BackendConvert">Data conversion handler.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.Clone">
+            <summary>
+            Make a shallow copy of this type mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.ContainsOID(System.Int32)">
+            <summary>
+            Determine if a NpgsqlBackendTypeInfo with the given backend type OID exists in this mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.ContainsName(System.String)">
+            <summary>
+            Determine if a NpgsqlBackendTypeInfo with the given backend type name exists in this mapping.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeMapping.Count">
+            <summary>
+            Get the number of type infos held.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeMapping.Item(System.Int32)">
+            <summary>
+            Retrieve the NpgsqlBackendTypeInfo with the given backend type OID, or null if none found.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeMapping.Item(System.String)">
+            <summary>
+            Retrieve the NpgsqlBackendTypeInfo with the given backend type name, or null if none found.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlNativeTypeMapping">
+            <summary>
+            Provide mapping between type Type, NpgsqlDbType and a NpgsqlNativeTypeInfo object that represents it.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.AddType(NpgsqlTypes.NpgsqlNativeTypeInfo)">
+            <summary>
+            Add the given NpgsqlNativeTypeInfo to this mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.AddType(System.String,NpgsqlTypes.NpgsqlDbType,System.Data.DbType,System.Boolean,NpgsqlTypes.ConvertNativeToBackendHandler)">
+            <summary>
+            Add a new NpgsqlNativeTypeInfo with the given attributes and conversion handlers to this mapping.
+            </summary>
+            <param name="Name">Type name provided by the backend server.</param>
+            <param name="NpgsqlDbType">NpgsqlDbType</param>
+            <param name="NativeConvert">Data conversion handler.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.TryGetValue(NpgsqlTypes.NpgsqlDbType,NpgsqlTypes.NpgsqlNativeTypeInfo@)">
+            <summary>
+            Retrieve the NpgsqlNativeTypeInfo with the given NpgsqlDbType.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.TryGetValue(System.Data.DbType,NpgsqlTypes.NpgsqlNativeTypeInfo@)">
+            <summary>
+            Retrieve the NpgsqlNativeTypeInfo with the given DbType.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.TryGetValue(System.Type,NpgsqlTypes.NpgsqlNativeTypeInfo@)">
+            <summary>
+            Retrieve the NpgsqlNativeTypeInfo with the given Type.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.ContainsName(System.String)">
+            <summary>
+            Determine if a NpgsqlNativeTypeInfo with the given backend type name exists in this mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.ContainsNpgsqlDbType(NpgsqlTypes.NpgsqlDbType)">
+            <summary>
+            Determine if a NpgsqlNativeTypeInfo with the given NpgsqlDbType exists in this mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.ContainsType(System.Type)">
+            <summary>
+            Determine if a NpgsqlNativeTypeInfo with the given Type name exists in this mapping.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlNativeTypeMapping.Count">
+            <summary>
+            Get the number of type infos held.
+            </summary>
+        </member>
+        <member name="P:Npgsql.Cache`1.CacheSize">
+            <summary>
+            Set Cache Size. The default value is 20.
+            </summary>
+        </member>
+        <member name="P:Npgsql.Cache`1.Item(System.String)">
+            <summary>
+            Lookup cached entity. null will returned if not match.
+            For both get{} and set{} apply LRU rule.
+            </summary>
+            <param name="key">key</param>
+            <returns></returns>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.#ctor">
+            <summary>
+            Called from constructor of derived class.
+            </summary>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.Finalize">
+            <summary>
+            Finalizer for HashAlgorithm
+            </summary>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.ComputeHash(System.Byte[])">
+            <summary>
+            Computes the entire hash of all the bytes in the byte array.
+            </summary>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.HashCore(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            When overridden in a derived class, drives the hashing function.
+            </summary>
+            <param name="rgb"></param>
+            <param name="start"></param>
+            <param name="size"></param>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.HashFinal">
+            <summary>
+            When overridden in a derived class, this pads and hashes whatever data might be left in the buffers and then returns the hash created.
+            </summary>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.Initialize">
+            <summary>
+            When overridden in a derived class, initializes the object to prepare for hashing.
+            </summary>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.TransformBlock(System.Byte[],System.Int32,System.Int32,System.Byte[],System.Int32)">
+            <summary>
+            Used for stream chaining.  Computes hash as data passes through it.
+            </summary>
+            <param name="inputBuffer">The buffer from which to grab the data to be copied.</param>
+            <param name="inputOffset">The offset into the input buffer to start reading at.</param>
+            <param name="inputCount">The number of bytes to be copied.</param>
+            <param name="outputBuffer">The buffer to write the copied data to.</param>
+            <param name="outputOffset">At what point in the outputBuffer to write the data at.</param>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.TransformFinalBlock(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Used for stream chaining.  Computes hash as data passes through it.  Finishes off the hash.
+            </summary>
+            <param name="inputBuffer">The buffer from which to grab the data to be copied.</param>
+            <param name="inputOffset">The offset into the input buffer to start reading at.</param>
+            <param name="inputCount">The number of bytes to be copied.</param>
+        </member>
+        <member name="P:Npgsql.HashAlgorithm.CanTransformMultipleBlocks">
+            <summary>
+            Get whether or not the hash can transform multiple blocks at a time.
+            Note: MUST be overriden if descendant can transform multiple block
+            on a single call!
+            </summary>
+        </member>
+        <member name="P:Npgsql.HashAlgorithm.Hash">
+            <summary>
+            Gets the previously computed hash.
+            </summary>
+        </member>
+        <member name="P:Npgsql.HashAlgorithm.HashSize">
+            <summary>
+            Returns the size in bits of the hash.
+            </summary>
+        </member>
+        <member name="P:Npgsql.HashAlgorithm.InputBlockSize">
+            <summary>
+            Must be overriden if not 1
+            </summary>
+        </member>
+        <member name="P:Npgsql.HashAlgorithm.OutputBlockSize">
+            <summary>
+            Must be overriden if not 1
+            </summary>
+        </member>
+        <member name="T:Npgsql.MD5">
+            <summary>
+            Common base class for all derived MD5 implementations.
+            </summary>
+        </member>
+        <member name="M:Npgsql.MD5.#ctor">
+            <summary>
+            Called from constructor of derived class.
+            </summary>
+        </member>
+        <member name="M:Npgsql.MD5.Create">
+            <summary>
+            Creates the default derived class.
+            </summary>
+        </member>
+        <member name="T:Npgsql.MD5CryptoServiceProvider">
+            <summary>
+            C# implementation of the MD5 cryptographic hash function.
+            </summary>
+        </member>
+        <member name="M:Npgsql.MD5CryptoServiceProvider.#ctor">
+            <summary>
+            Creates a new MD5CryptoServiceProvider.
+            </summary>
+        </member>
+        <member name="M:Npgsql.MD5CryptoServiceProvider.HashCore(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Drives the hashing function.
+            </summary>
+            <param name="rgb">Byte array containing the data to hash.</param>
+            <param name="start">Where in the input buffer to start.</param>
+            <param name="size">Size in bytes of the data in the buffer to hash.</param>
+        </member>
+        <member name="M:Npgsql.MD5CryptoServiceProvider.HashFinal">
+            <summary>
+            This finalizes the hash.  Takes the data from the chaining variables and returns it.
+            </summary>
+        </member>
+        <member name="M:Npgsql.MD5CryptoServiceProvider.Initialize">
+            <summary>
+            Resets the class after use.  Called automatically after hashing is done.
+            </summary>
+        </member>
+        <member name="M:Npgsql.MD5CryptoServiceProvider.ProcessBlock(System.Byte[],System.Int32)">
+            <summary>
+            This is the meat of the hash function.  It is what processes each block one at a time.
+            </summary>
+            <param name="inputBuffer">Byte array to process data from.</param>
+            <param name="inputOffset">Where in the byte array to start processing.</param>
+        </member>
+        <member name="M:Npgsql.MD5CryptoServiceProvider.ProcessFinalBlock(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Pads and then processes the final block.
+            </summary>
+            <param name="inputBuffer">Buffer to grab data from.</param>
+            <param name="inputOffset">Position in buffer in bytes to get data from.</param>
+            <param name="inputCount">How much data in bytes in the buffer to use.</param>
+        </member>
+        <member name="T:Npgsql.StringRowReaderV3">
+            <summary>
+            Implements <see cref="T:Npgsql.RowReader"/> for version 3 of the protocol.
+            </summary>
+        </member>
+        <member name="T:Npgsql.RowReader">
+            <summary>
+            Reads a row, field by field, allowing a DataRow to be built appropriately.
+            </summary>
+        </member>
+        <member name="T:Npgsql.IStreamOwner">
+            <summary>
+            Marker interface which identifies a class which may take possession of a stream for the duration of
+            it's lifetime (possibly temporarily giving that possession to another class for part of that time.
+            
+            It inherits from IDisposable, since any such class must make sure it leaves the stream in a valid state.
+            
+            The most important such class is that compiler-generated from ProcessBackendResponsesEnum. Of course
+            we can't make that inherit from this interface, alas.
+            </summary>
+        </member>
+        <!-- Badly formed XML comment ignored for member "T:Npgsql.IServerResponseObject" -->
+        <member name="T:Npgsql.RowReader.Streamer">
+            <summary>
+            Reads part of a field, as needed (for <see cref="!:System.Data.IDataRecord.GetChars()"/>
+            and <see cref="!:System.Data.IDataRecord.GetBytes()"/>
+            </summary>
+        </member>
+        <member name="T:Npgsql.RowReader.Streamer`1">
+            <summary>
+            Adds further functionality to stream that is dependant upon the type of data read.
+            </summary>
+        </member>
+        <member name="T:Npgsql.RowReader.CharStreamer">
+            <summary>
+            Completes the implementation of Streamer for char data.
+            </summary>
+        </member>
+        <member name="T:Npgsql.RowReader.ByteStreamer">
+            <summary>
+            Completes the implementation of Streamer for byte data.
+            </summary>
+        </member>
+        <member name="T:Npgsql.StringRowReaderV2">
+            <summary>
+            Implements <see cref="T:Npgsql.RowReader"/> for version 2 of the protocol.
+            </summary>
+        </member>
+        <member name="T:Npgsql.StringRowReaderV2.NullMap">
+            <summary>
+            Encapsulates the null mapping bytes sent at the start of a version 2
+            datarow message, and the process of identifying the nullity of the data
+            at a particular index
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlBackEndKeyData">
+            <summary>
+            This class represents a BackEndKeyData message received
+            from PostgreSQL
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlBind">
+             <summary>
+             This class represents the Bind message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.ClientMessage">
+            <summary>
+            For classes representing messages sent from the client to the server.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCancelRequest">
+             <summary>
+             This class represents the CancelRequest message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlState">
+            <summary> This class represents the base class for the state pattern design pattern
+             implementation.
+             </summary>
+            
+        </member>
+        <member name="M:Npgsql.NpgsqlState.ChangeState(Npgsql.NpgsqlConnector,Npgsql.NpgsqlState)">
+            <summary>
+            This method is used by the states to change the state of the context.
+             </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlState.ProcessBackendResponses(Npgsql.NpgsqlConnector)">
+            <summary>
+             This method is responsible to handle all protocol messages sent from the backend.
+             It holds all the logic to do it.
+             To exchange data, it uses a Mediator object from which it reads/writes information
+             to handle backend requests.
+             </summary>
+            
+        </member>
+        <member name="M:Npgsql.NpgsqlState.ProcessBackendResponsesEnum(Npgsql.NpgsqlConnector)">
+            <summary>
+             This method is responsible to handle all protocol messages sent from the backend.
+             It holds all the logic to do it.
+             To exchange data, it uses a Mediator object from which it reads/writes information
+             to handle backend requests.
+             </summary>
+            
+        </member>
+        <member name="M:Npgsql.NpgsqlState.CheckForContextSocketAvailability(Npgsql.NpgsqlConnector,System.Net.Sockets.SelectMode)">
+            <summary>
+            Checks for context socket availability.
+            Socket.Poll supports integer as microseconds parameter.
+            This limits the usable command timeout value
+            to 2,147 seconds: (2,147 x 1,000,000 less than  max_int).
+            In order to bypass this limit, the availability of
+            the socket is checked in 2,147 seconds cycles
+            </summary>
+            <returns><c>true</c>, if for context socket availability was checked, <c>false</c> otherwise.</returns>
+            <param name="context">Context.</param>
+            <param name="selectMode">Select mode.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlClosedState.ResolveIPHost(System.String)">
+            <summary>
+            Resolve a host name or IP address.
+            This is needed because if you call Dns.Resolve() with an IP address, it will attempt
+            to resolve it as a host name, when it should just convert it to an IP address.
+            </summary>
+            <param name="HostName"></param>
+        </member>
+        <member name="T:Npgsql.NpgsqlCommand">
+            <summary>
+            Represents a SQL statement or function (stored procedure) to execute
+            against a PostgreSQL database. This class cannot be inherited.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> class.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> class with the text of the query.
+            </summary>
+            <param name="cmdText">The text of the query.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.#ctor(System.String,Npgsql.NpgsqlConnection)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> class with the text of the query and a <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>.
+            </summary>
+            <param name="cmdText">The text of the query.</param>
+            <param name="connection">A <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see> that represents the connection to a PostgreSQL server.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.#ctor(System.String,Npgsql.NpgsqlConnection,Npgsql.NpgsqlTransaction)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> class with the text of the query, a <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>, and the <see cref="T:Npgsql.NpgsqlTransaction">NpgsqlTransaction</see>.
+            </summary>
+            <param name="cmdText">The text of the query.</param>
+            <param name="connection">A <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see> that represents the connection to a PostgreSQL server.</param>
+            <param name="transaction">The <see cref="T:Npgsql.NpgsqlTransaction">NpgsqlTransaction</see> in which the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> executes.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.#ctor(System.String,Npgsql.NpgsqlConnector)">
+            <summary>
+            Used to execute internal commands.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.Cancel">
+            <summary>
+            Attempts to cancel the execution of a <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see>.
+            </summary>
+            <remarks>This Method isn't implemented yet.</remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.System#ICloneable#Clone">
+            <summary>
+            Create a new command based on this one.
+            </summary>
+            <returns>A new NpgsqlCommand object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.Clone">
+            <summary>
+            Create a new command based on this one.
+            </summary>
+            <returns>A new NpgsqlCommand object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.CreateDbParameter">
+            <summary>
+            Creates a new instance of an <see cref="T:System.Data.Common.DbParameter">DbParameter</see> object.
+            </summary>
+            <returns>An <see cref="T:System.Data.Common.DbParameter">DbParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.CreateParameter">
+            <summary>
+            Creates a new instance of a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.
+            </summary>
+            <returns>A <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.ExecuteBlind">
+            <summary>
+            Slightly optimised version of ExecuteNonQuery() for internal ues in cases where the number
+            of affected rows is of no interest.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.ExecuteNonQuery">
+            <summary>
+            Executes a SQL statement against the connection and returns the number of rows affected.
+            </summary>
+            <returns>The number of rows affected if known; -1 otherwise.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.ExecuteDbDataReader(System.Data.CommandBehavior)">
+            <summary>
+            Sends the <see cref="P:Npgsql.NpgsqlCommand.CommandText">CommandText</see> to
+            the <see cref="T:Npgsql.NpgsqlConnection">Connection</see> and builds a
+            <see cref="T:Npgsql.NpgsqlDataReader">NpgsqlDataReader</see>
+            using one of the <see cref="T:System.Data.CommandBehavior">CommandBehavior</see> values.
+            </summary>
+            <param name="behavior">One of the <see cref="T:System.Data.CommandBehavior">CommandBehavior</see> values.</param>
+            <returns>A <see cref="T:Npgsql.NpgsqlDataReader">NpgsqlDataReader</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.ExecuteReader">
+            <summary>
+            Sends the <see cref="P:Npgsql.NpgsqlCommand.CommandText">CommandText</see> to
+            the <see cref="T:Npgsql.NpgsqlConnection">Connection</see> and builds a
+            <see cref="T:Npgsql.NpgsqlDataReader">NpgsqlDataReader</see>.
+            </summary>
+            <returns>A <see cref="T:Npgsql.NpgsqlDataReader">NpgsqlDataReader</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.ExecuteReader(System.Data.CommandBehavior)">
+            <summary>
+            Sends the <see cref="P:Npgsql.NpgsqlCommand.CommandText">CommandText</see> to
+            the <see cref="T:Npgsql.NpgsqlConnection">Connection</see> and builds a
+            <see cref="T:Npgsql.NpgsqlDataReader">NpgsqlDataReader</see>
+            using one of the <see cref="T:System.Data.CommandBehavior">CommandBehavior</see> values.
+            </summary>
+            <param name="cb">One of the <see cref="T:System.Data.CommandBehavior">CommandBehavior</see> values.</param>
+            <returns>A <see cref="T:Npgsql.NpgsqlDataReader">NpgsqlDataReader</see> object.</returns>
+            <remarks>Currently the CommandBehavior parameter is ignored.</remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.BindParameters">
+            <summary>
+             This method binds the parameters from parameters collection to the bind
+             message.
+             </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.ExecuteScalar">
+            <summary>
+            Executes the query, and returns the first column of the first row
+            in the result set returned by the query. Extra columns or rows are ignored.
+            </summary>
+            <returns>The first column of the first row in the result set,
+            or a null reference if the result set is empty.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.Prepare">
+            <summary>
+            Creates a prepared version of the command on a PostgreSQL server.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.CheckConnectionState">
+            <summary>
+             This method checks the connection state to see if the connection
+             is set or it is open. If one of this conditions is not met, throws
+             an InvalidOperationException
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.GetCommandText">
+            <summary>
+            This method substitutes the <see cref="P:Npgsql.NpgsqlCommand.Parameters">Parameters</see>, if exist, in the command
+            to their actual values.
+            The parameter name format is <b>:ParameterName</b>.
+            </summary>
+            <returns>A version of <see cref="P:Npgsql.NpgsqlCommand.CommandText">CommandText</see> with the <see cref="P:Npgsql.NpgsqlCommand.Parameters">Parameters</see> inserted.</returns>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.CommandText">
+            <summary>
+            Gets or sets the SQL statement or function (stored procedure) to execute at the data source.
+            </summary>
+            <value>The Transact-SQL statement or stored procedure to execute. The default is an empty string.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.CommandTimeout">
+            <summary>
+            Gets or sets the wait time before terminating the attempt
+            to execute a command and generating an error.
+            </summary>
+            <value>The time (in seconds) to wait for the command to execute.
+            The default is 20 seconds.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.CommandType">
+            <summary>
+            Gets or sets a value indicating how the
+            <see cref="P:Npgsql.NpgsqlCommand.CommandText">CommandText</see> property is to be interpreted.
+            </summary>
+            <value>One of the <see cref="T:System.Data.CommandType">CommandType</see> values. The default is <see cref="T:System.Data.CommandType">CommandType.Text</see>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.Connection">
+            <summary>
+            Gets or sets the <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>
+            used by this instance of the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see>.
+            </summary>
+            <value>The connection to a data source. The default value is a null reference.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.Parameters">
+            <summary>
+            Gets the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see>.
+            </summary>
+            <value>The parameters of the SQL statement or function (stored procedure). The default is an empty collection.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.Transaction">
+            <summary>
+            Gets or sets the <see cref="T:Npgsql.NpgsqlTransaction">NpgsqlTransaction</see>
+            within which the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> executes.
+            </summary>
+            <value>The <see cref="T:Npgsql.NpgsqlTransaction">NpgsqlTransaction</see>.
+            The default value is a null reference.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.UpdatedRowSource">
+            <summary>
+            Gets or sets how command results are applied to the <see cref="T:System.Data.DataRow">DataRow</see>
+            when used by the <see cref="M:System.Data.Common.DbDataAdapter.Update(System.Data.DataSet)">Update</see>
+            method of the <see cref="T:System.Data.Common.DbDataAdapter">DbDataAdapter</see>.
+            </summary>
+            <value>One of the <see cref="T:System.Data.UpdateRowSource">UpdateRowSource</see> values.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.LastInsertedOID">
+            <summary>
+            Returns oid of inserted row. This is only updated when using executenonQuery and when command inserts just a single row. If table is created without oids, this will always be 0.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCommandBuilder">
+            <summary>
+             This class is responsible to create database commands for automatic insert, update and delete operations.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommandBuilder.DeriveParameters(Npgsql.NpgsqlCommand)">
+            <summary>
+            
+             This method is reponsible to derive the command parameter list with values obtained from function definition.
+             It clears the Parameters collection of command. Also, if there is any parameter type which is not supported by Npgsql, an InvalidOperationException will be thrown.
+             Parameters name will be parameter1, parameter2, ...
+             For while, only parameter name and NpgsqlDbType are obtained.
+            </summary>
+             <param name="command">NpgsqlCommand whose function parameters will be obtained.</param>
+        </member>
+        <member name="T:Npgsql.NoticeEventHandler">
+            <summary>
+            Represents the method that handles the <see cref="E:Npgsql.NpgsqlConnection.Notification">Notice</see> events.
+            </summary>
+            <param name="e">A <see cref="T:Npgsql.NpgsqlNoticeEventArgs">NpgsqlNoticeEventArgs</see> that contains the event data.</param>
+        </member>
+        <member name="T:Npgsql.NotificationEventHandler">
+            <summary>
+            Represents the method that handles the <see cref="E:Npgsql.NpgsqlConnection.Notification">Notification</see> events.
+            </summary>
+            <param name="sender">The source of the event.</param>
+            <param name="e">A <see cref="T:Npgsql.NpgsqlNotificationEventArgs">NpgsqlNotificationEventArgs</see> that contains the event data.</param>
+        </member>
+        <member name="T:Npgsql.NpgsqlConnection">
+            <summary>
+            This class represents a connection to a
+            PostgreSQL server.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.#ctor">
+            <summary>
+            Initializes a new instance of the
+            <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see> class.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the
+            <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see> class
+            and sets the <see cref="P:Npgsql.NpgsqlConnection.ConnectionString">ConnectionString</see>.
+            </summary>
+            <param name="ConnectionString">The connection used to open the PostgreSQL database.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.BeginDbTransaction(System.Data.IsolationLevel)">
+            <summary>
+            Begins a database transaction with the specified isolation level.
+            </summary>
+            <param name="isolationLevel">The <see cref="T:System.Data.IsolationLevel">isolation level</see> under which the transaction should run.</param>
+            <returns>An <see cref="T:System.Data.Common.DbTransaction">DbTransaction</see>
+            object representing the new transaction.</returns>
+            <remarks>
+            Currently the IsolationLevel ReadCommitted and Serializable are supported by the PostgreSQL backend.
+            There's no support for nested transactions.
+            </remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.BeginTransaction">
+            <summary>
+            Begins a database transaction.
+            </summary>
+            <returns>A <see cref="T:Npgsql.NpgsqlTransaction">NpgsqlTransaction</see>
+            object representing the new transaction.</returns>
+            <remarks>
+            Currently there's no support for nested transactions.
+            </remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.BeginTransaction(System.Data.IsolationLevel)">
+            <summary>
+            Begins a database transaction with the specified isolation level.
+            </summary>
+            <param name="level">The <see cref="T:System.Data.IsolationLevel">isolation level</see> under which the transaction should run.</param>
+            <returns>A <see cref="T:Npgsql.NpgsqlTransaction">NpgsqlTransaction</see>
+            object representing the new transaction.</returns>
+            <remarks>
+            Currently the IsolationLevel ReadCommitted and Serializable are supported by the PostgreSQL backend.
+            There's no support for nested transactions.
+            </remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.Open">
+            <summary>
+            Opens a database connection with the property settings specified by the
+            <see cref="P:Npgsql.NpgsqlConnection.ConnectionString">ConnectionString</see>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.ChangeDatabase(System.String)">
+            <summary>
+            This method changes the current database by disconnecting from the actual
+            database and connecting to the specified.
+            </summary>
+            <param name="dbName">The name of the database to use in place of the current database.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.Close">
+            <summary>
+            Releases the connection to the database.  If the connection is pooled, it will be
+            made available for re-use.  If it is non-pooled, the actual connection will be shutdown.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.CreateDbCommand">
+            <summary>
+            Creates and returns a <see cref="T:System.Data.Common.DbCommand">DbCommand</see>
+            object associated with the <see cref="T:System.Data.Common.DbConnection">IDbConnection</see>.
+            </summary>
+            <returns>A <see cref="T:System.Data.Common.DbCommand">DbCommand</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.CreateCommand">
+            <summary>
+            Creates and returns a <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see>
+            object associated with the <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>.
+            </summary>
+            <returns>A <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.Dispose(System.Boolean)">
+            <summary>
+            Releases all resources used by the
+            <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>.
+            </summary>
+            <param name="disposing"><b>true</b> when called from Dispose();
+            <b>false</b> when being called from the finalizer.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.System#ICloneable#Clone">
+            <summary>
+            Create a new connection based on this one.
+            </summary>
+            <returns>A new NpgsqlConnection object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.Clone">
+            <summary>
+            Create a new connection based on this one.
+            </summary>
+            <returns>A new NpgsqlConnection object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.DefaultCertificateSelectionCallback(System.Security.Cryptography.X509Certificates.X509CertificateCollection,System.Security.Cryptography.X509Certificates.X509Certificate,System.String,System.Security.Cryptography.X509Certificates.X509CertificateCollection)">
+            <summary>
+            Default SSL CertificateSelectionCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.DefaultCertificateValidationCallback(System.Security.Cryptography.X509Certificates.X509Certificate,System.Int32[])">
+            <summary>
+            Default SSL CertificateValidationCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.DefaultPrivateKeySelectionCallback(System.Security.Cryptography.X509Certificates.X509Certificate,System.String)">
+            <summary>
+            Default SSL PrivateKeySelectionCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.DefaultProvideClientCertificatesCallback(System.Security.Cryptography.X509Certificates.X509CertificateCollection)">
+            <summary>
+            Default SSL ProvideClientCertificatesCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.LogConnectionString">
+            <summary>
+            Write each key/value pair in the connection string to the log.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.GetSchema">
+            <summary>
+            Returns the supported collections
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.GetSchema(System.String)">
+            <summary>
+            Returns the schema collection specified by the collection name.
+            </summary>
+            <param name="collectionName">The collection name.</param>
+            <returns>The collection specified.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.GetSchema(System.String,System.String[])">
+            <summary>
+            Returns the schema collection specified by the collection name filtered by the restrictions.
+            </summary>
+            <param name="collectionName">The collection name.</param>
+            <param name="restrictions">
+            The restriction values to filter the results.  A description of the restrictions is contained
+            in the Restrictions collection.
+            </param>
+            <returns>The collection specified.</returns>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnection.Notice">
+            <summary>
+            Occurs on NoticeResponses from the PostgreSQL backend.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnection.Notification">
+            <summary>
+            Occurs on NotificationResponses from the PostgreSQL backend.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnection.ProvideClientCertificatesCallback">
+            <summary>
+            Called to provide client certificates for SSL handshake.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnection.CertificateSelectionCallback">
+            <summary>
+            Mono.Security.Protocol.Tls.CertificateSelectionCallback delegate.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnection.CertificateValidationCallback">
+            <summary>
+            Mono.Security.Protocol.Tls.CertificateValidationCallback delegate.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnection.PrivateKeySelectionCallback">
+            <summary>
+            Mono.Security.Protocol.Tls.PrivateKeySelectionCallback delegate.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.ConnectionString">
+            <summary>
+            Gets or sets the string used to connect to a PostgreSQL database.
+            Valid values are:
+            <ul>
+            <li>
+            Server:             Address/Name of Postgresql Server;
+            </li>
+            <li>
+            Port:               Port to connect to;
+            </li>
+            <li>
+            Protocol:           Protocol version to use, instead of automatic; Integer 2 or 3;
+            </li>
+            <li>
+            Database:           Database name. Defaults to user name if not specified;
+            </li>
+            <li>
+            User Id:            User name;
+            </li>
+            <li>
+            Password:           Password for clear text authentication;
+            </li>
+            <li>
+            SSL:                True or False. Controls whether to attempt a secure connection. Default = False;
+            </li>
+            <li>
+            Pooling:            True or False. Controls whether connection pooling is used. Default = True;
+            </li>
+            <li>
+            MinPoolSize:        Min size of connection pool;
+            </li>
+            <li>
+            MaxPoolSize:        Max size of connection pool;
+            </li>
+            <li>
+            Timeout:            Time to wait for connection open in seconds. Default is 15.
+            </li>
+            <li>
+            CommandTimeout:     Time to wait for command to finish execution before throw an exception. In seconds. Default is 20.
+            </li>
+            <li>
+            Sslmode:            Mode for ssl connection control. Can be Prefer, Require, Allow or Disable. Default is Disable. Check user manual for explanation of values.
+            </li>
+            <li>
+            ConnectionLifeTime: Time to wait before closing unused connections in the pool in seconds. Default is 15.
+            </li>
+            <li>
+            SyncNotification:   Specifies if Npgsql should use synchronous notifications.
+            </li>
+            <li>
+            SearchPath: Changes search path to specified and public schemas.
+            </li>
+            </ul>
+            </summary>
+            <value>The connection string that includes the server name,
+            the database name, and other parameters needed to establish
+            the initial connection. The default value is an empty string.
+            </value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.Host">
+            <summary>
+            Backend server host name.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.Port">
+            <summary>
+            Backend server port.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.SSL">
+            <summary>
+            If true, the connection will attempt to use SSL.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.ConnectionTimeout">
+            <summary>
+            Gets the time to wait while trying to establish a connection
+            before terminating the attempt and generating an error.
+            </summary>
+            <value>The time (in seconds) to wait for a connection to open. The default value is 15 seconds.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.CommandTimeout">
+            <summary>
+            Gets the time to wait while trying to execute a command
+            before terminating the attempt and generating an error.
+            </summary>
+            <value>The time (in seconds) to wait for a command to complete. The default value is 20 seconds.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.ConnectionLifeTime">
+            <summary>
+            Gets the time to wait before closing unused connections in the pool if the count
+            of all connections exeeds MinPoolSize.
+            </summary>
+            <remarks>
+            If connection pool contains unused connections for ConnectionLifeTime seconds,
+            the half of them will be closed. If there will be unused connections in a second
+            later then again the half of them will be closed and so on.
+            This strategy provide smooth change of connection count in the pool.
+            </remarks>
+            <value>The time (in seconds) to wait. The default value is 15 seconds.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.Database">
+            <summary>
+             Gets the name of the current database or the database to be used after a connection is opened.
+             </summary>
+             <value>The name of the current database or the name of the database to be
+             used after a connection is opened. The default value is the empty string.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.PreloadReader">
+            <summary>
+            Whether datareaders are loaded in their entirety (for compatibility with earlier code).
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.DataSource">
+            <summary>
+            Gets the database server name.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.SyncNotification">
+            <summary>
+            Gets flag indicating if we are using Synchronous notification or not.
+            The default value is false.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.FullState">
+            <summary>
+            Gets the current state of the connection.
+            </summary>
+            <value>A bitwise combination of the <see cref="T:System.Data.ConnectionState">ConnectionState</see> values. The default is <b>Closed</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.State">
+            <summary>
+            Gets whether the current state of the connection is Open or Closed
+            </summary>
+            <value>ConnectionState.Open or ConnectionState.Closed</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.PostgreSqlVersion">
+            <summary>
+            Version of the PostgreSQL backend.
+            This can only be called when there is an active connection.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.BackendProtocolVersion">
+            <summary>
+            Protocol version in use.
+            This can only be called when there is an active connection.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.ProcessID">
+            <summary>
+            Process id of backend server.
+            This can only be called when there is an active connection.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.Connector">
+            <summary>
+            The connector object connected to the backend.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.ConnectionStringValues">
+            <summary>
+            Gets the NpgsqlConnectionStringBuilder containing the parsed connection string values.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.UserName">
+            <summary>
+            User name.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.Password">
+            <summary>
+            Password.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.Pooling">
+            <summary>
+            Determine if connection pooling will be used for this connection.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectionStringBuilder.Clone">
+            <summary>
+            Return an exact copy of this NpgsqlConnectionString.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectionStringBuilder.SetValue(System.String,System.Object)">
+            <summary>
+            This function will set value for known key, both private member and base[key].
+            </summary>
+            <param name="keyword"></param>
+            <param name="value"></param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectionStringBuilder.SetValue(Npgsql.Keywords,System.Object)">
+            <summary>
+            The function will modify private member only, not base[key].
+            </summary>
+            <param name="keyword"></param>
+            <param name="value"></param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectionStringBuilder.Clear">
+            <summary>
+            Clear the member and assign them to the default value.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnectionStringBuilder.Compatible">
+            <summary>
+            Compatibilty version. When possible, behaviour caused by breaking changes will be preserved
+            if this version is less than that where the breaking change was introduced.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnectionStringBuilder.Item(System.String)">
+            <summary>
+            Case insensative accessor for indivual connection string values.
+            </summary>
+        </member>
+        <member name="T:Npgsql.ProvideClientCertificatesCallback">
+            <summary>
+            Represents the method that allows the application to provide a certificate collection to be used for SSL clien authentication
+            </summary>
+            <param name="certificates">A <see cref="T:System.Security.Cryptography.X509Certificates.X509CertificateCollection">X509CertificateCollection</see> to be filled with one or more client certificates.</param>
+        </member>
+        <member name="T:Npgsql.NpgsqlConnector">
+            <summary>
+            !!! Helper class, for compilation only.
+            Connector implements the logic for the Connection Objects to
+            access the physical connection to the database, and isolate
+            the application developer from connection pooling internals.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.#ctor(Npgsql.NpgsqlConnectionStringBuilder,System.Boolean,System.Boolean)">
+            <summary>
+            Constructor.
+            </summary>
+            <param name="Shared">Controls whether the connector can be shared.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.IsValid">
+            <summary>
+            This method checks if the connector is still ok.
+            We try to send a simple query text, select 1 as ConnectionTest;
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.ReleaseResources">
+            <summary>
+            This method is responsible for releasing all resources associated with this Connector.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.ReleasePlansPortals">
+            <summary>
+            This method is responsible to release all portals used by this Connector.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.DefaultCertificateSelectionCallback(System.Security.Cryptography.X509Certificates.X509CertificateCollection,System.Security.Cryptography.X509Certificates.X509Certificate,System.String,System.Security.Cryptography.X509Certificates.X509CertificateCollection)">
+            <summary>
+            Default SSL CertificateSelectionCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.DefaultCertificateValidationCallback(System.Security.Cryptography.X509Certificates.X509Certificate,System.Int32[])">
+            <summary>
+            Default SSL CertificateValidationCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.DefaultPrivateKeySelectionCallback(System.Security.Cryptography.X509Certificates.X509Certificate,System.String)">
+            <summary>
+            Default SSL PrivateKeySelectionCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.DefaultProvideClientCertificatesCallback(System.Security.Cryptography.X509Certificates.X509CertificateCollection)">
+            <summary>
+            Default SSL ProvideClientCertificatesCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.ProcessServerVersion">
+            <summary>
+            This method is required to set all the version dependent features flags.
+            SupportsPrepare means the server can use prepared query plans (7.3+)
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.Open">
+            <summary>
+            Opens the physical connection to the server.
+            </summary>
+            <remarks>Usually called by the RequestConnector
+            Method of the connection pool manager.</remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.Close">
+            <summary>
+            Closes the physical connection to the server.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.NextPortalName">
+            <summary>
+             Returns next portal index.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.NextPlanName">
+            <summary>
+             Returns next plan index.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnector.Notice">
+            <summary>
+            Occurs on NoticeResponses from the PostgreSQL backend.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnector.Notification">
+            <summary>
+            Occurs on NotificationResponses from the PostgreSQL backend.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnector.ProvideClientCertificatesCallback">
+            <summary>
+            Called to provide client certificates for SSL handshake.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnector.CertificateSelectionCallback">
+            <summary>
+            Mono.Security.Protocol.Tls.CertificateSelectionCallback delegate.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnector.CertificateValidationCallback">
+            <summary>
+            Mono.Security.Protocol.Tls.CertificateValidationCallback delegate.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnector.PrivateKeySelectionCallback">
+            <summary>
+            Mono.Security.Protocol.Tls.PrivateKeySelectionCallback delegate.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.State">
+            <summary>
+            Gets the current state of the connection.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.ConnectionString">
+            <summary>
+            Return Connection String.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.ServerVersion">
+            <summary>
+            Version of backend server this connector is connected to.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.BackendProtocolVersion">
+            <summary>
+            Backend protocol version in use by this connector.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.Stream">
+            <summary>
+            The physical connection stream to the backend.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.Socket">
+            <summary>
+            The physical connection socket to the backend.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.IsInitialized">
+            <summary>
+            Reports if this connector is fully connected.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.Mediator">
+            <summary>
+            The connection mediator.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.Transaction">
+            <summary>
+            Report if the connection is in a transaction.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.SupportsPrepare">
+            <summary>
+            Report whether the current connection can support prepare functionality.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlConnectorPool">
+            <summary>
+            This class manages all connector objects, pooled AND non-pooled.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlConnectorPool.ConnectorPoolMgr">
+            <value>Unique static instance of the connector pool
+            mamager.</value>
+        </member>
+        <member name="F:Npgsql.NpgsqlConnectorPool.PooledConnectors">
+            <value>Map of index to unused pooled connectors, avaliable to the
+            next RequestConnector() call.</value>
+            <remarks>This hashmap will be indexed by connection string.
+            This key will hold a list of queues of pooled connectors available to be used.</remarks>
+        </member>
+        <member name="F:Npgsql.NpgsqlConnectorPool.Timer">
+            <value>Timer for tracking unused connections in pools.</value>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.RequestConnector(Npgsql.NpgsqlConnection)">
+            <summary>
+            Searches the shared and pooled connector lists for a
+            matching connector object or creates a new one.
+            </summary>
+            <param name="Connection">The NpgsqlConnection that is requesting
+            the connector. Its ConnectionString will be used to search the
+            pool for available connectors.</param>
+            <returns>A connector object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.RequestPooledConnector(Npgsql.NpgsqlConnection)">
+            <summary>
+            Find a pooled connector.  Handle locking and timeout here.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.RequestPooledConnectorInternal(Npgsql.NpgsqlConnection)">
+            <summary>
+            Find a pooled connector.  Handle shared/non-shared here.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.ReleaseConnector(Npgsql.NpgsqlConnection,Npgsql.NpgsqlConnector)">
+            <summary>
+            Releases a connector, possibly back to the pool for future use.
+            </summary>
+            <remarks>
+            Pooled connectors will be put back into the pool if there is room.
+            Shared connectors should just have their use count decremented
+            since they always stay in the shared pool.
+            </remarks>
+            <param name="Connector">The connector to release.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.ReleasePooledConnector(Npgsql.NpgsqlConnection,Npgsql.NpgsqlConnector)">
+            <summary>
+            Release a pooled connector.  Handle locking here.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.ReleasePooledConnectorInternal(Npgsql.NpgsqlConnection,Npgsql.NpgsqlConnector)">
+            <summary>
+            Release a pooled connector.  Handle shared/non-shared here.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.GetNonPooledConnector(Npgsql.NpgsqlConnection)">
+            <summary>
+            Create a connector without any pooling functionality.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.GetPooledConnector(Npgsql.NpgsqlConnection)">
+            <summary>
+            Find an available pooled connector in the non-shared pool, or create
+            a new one if none found.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.FixPoolCountBecauseOfConnectionDisposeFalse(Npgsql.NpgsqlConnection)">
+            <summary>
+            This method is only called when NpgsqlConnection.Dispose(false) is called which means a
+            finalization. This also means, an NpgsqlConnection was leak. We clear pool count so that
+            client doesn't end running out of connections from pool. When the connection is finalized, its underlying
+            socket is closed.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.UngetNonPooledConnector(Npgsql.NpgsqlConnection,Npgsql.NpgsqlConnector)">
+            <summary>
+            Close the connector.
+            </summary>
+            <param name="Connection"></param>
+            <param name="Connector">Connector to release</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.UngetPooledConnector(Npgsql.NpgsqlConnection,Npgsql.NpgsqlConnector)">
+            <summary>
+            Put a pooled connector into the pool queue.
+            </summary>
+            <param name="Connector">Connector to pool</param>
+        </member>
+        <member name="T:Npgsql.NpgsqlConnectorPool.ConnectorQueue">
+            <summary>
+            A queue with an extra Int32 for keeping track of busy connections.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlConnectorPool.ConnectorQueue.Available">
+            <summary>
+            Connections available to the end user
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlConnectorPool.ConnectorQueue.Busy">
+            <summary>
+            Connections currently in use
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyFormat">
+            <summary>
+            Represents information about COPY operation data transfer format as returned by server.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyFormat.#ctor(System.Byte,System.Int16[])">
+            <summary>
+            Only created when a CopyInResponse or CopyOutResponse is received by NpgsqlState.ProcessBackendResponses()
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyFormat.FieldIsBinary(System.Int32)">
+            <summary>
+            Returns true if this operation is currently active and field at given location is in binary format.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyFormat.IsBinary">
+            <summary>
+            Returns true if this operation is currently active and in binary format.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyFormat.FieldCount">
+            <summary>
+            Returns number of fields if this operation is currently active, otherwise -1
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyIn">
+            <summary>
+            Represents a PostgreSQL COPY FROM STDIN operation with a corresponding SQL statement
+            to execute against a PostgreSQL database
+            and an associated stream used to read data from (if provided by user)
+            or for writing it (when generated by driver).
+            Eg. new NpgsqlCopyIn("COPY mytable FROM STDIN", connection, streamToRead).Start();
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.#ctor(System.String,Npgsql.NpgsqlConnection)">
+            <summary>
+            Creates NpgsqlCommand to run given query upon Start(). Data for the requested COPY IN operation can then be written to CopyData stream followed by a call to End() or Cancel().
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.#ctor(Npgsql.NpgsqlCommand,Npgsql.NpgsqlConnection)">
+            <summary>
+            Given command is run upon Start(). Data for the requested COPY IN operation can then be written to CopyData stream followed by a call to End() or Cancel().
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.#ctor(Npgsql.NpgsqlCommand,Npgsql.NpgsqlConnection,System.IO.Stream)">
+            <summary>
+            Given command is executed upon Start() and all data from fromStream is passed to it as copy data.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.FieldIsBinary(System.Int32)">
+            <summary>
+            Returns true if this operation is currently active and field at given location is in binary format.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.Start">
+            <summary>
+            Command specified upon creation is executed as a non-query.
+            If CopyStream is set upon creation, it will be flushed to server as copy data, and operation will be finished immediately.
+            Otherwise the CopyStream member can be used for writing copy data to server and operation finished with a call to End() or Cancel().
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.End">
+            <summary>
+            Called after writing all data to CopyStream to successfully complete this copy operation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.Cancel(System.String)">
+            <summary>
+            Withdraws an already started copy operation. The operation will fail with given error message.
+            Will do nothing if current operation is not active.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyIn.IsActive">
+            <summary>
+            Returns true if the connection is currently reserved for this operation.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyIn.CopyStream">
+            <summary>
+            The stream provided by user or generated upon Start().
+            User may provide a stream to constructor; it is used to pass to server all data read from it.
+            Otherwise, call to Start() sets this to a writable NpgsqlCopyInStream that passes all data written to it to server.
+            In latter case this is only available while the copy operation is active and null otherwise.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyIn.IsBinary">
+            <summary>
+            Returns true if this operation is currently active and in binary format.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyIn.FieldCount">
+            <summary>
+            Returns number of fields expected on each input row if this operation is currently active, otherwise -1
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyIn.NpgsqlCommand">
+            <summary>
+            The Command used to execute this copy operation.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyIn.CopyBufferSize">
+            <summary>
+            Set before a COPY IN query to define size of internal buffer for reading from given CopyStream.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyInState">
+            <summary>
+            Represents an ongoing COPY FROM STDIN operation.
+            Provides methods to push data to server and end or cancel the operation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInState.StartCopy(Npgsql.NpgsqlConnector,Npgsql.NpgsqlCopyFormat)">
+            <summary>
+            Called from NpgsqlState.ProcessBackendResponses upon CopyInResponse.
+            If CopyStream is already set, it is used to read data to push to server, after which the copy is completed.
+            Otherwise CopyStream is set to a writable NpgsqlCopyInStream that calls SendCopyData each time it is written to.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInState.SendCopyData(Npgsql.NpgsqlConnector,System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Sends given packet to server as a CopyData message.
+            Does not check for notifications! Use another thread for that.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInState.SendCopyDone(Npgsql.NpgsqlConnector)">
+            <summary>
+            Sends CopyDone message to server. Handles responses, ie. may throw an exception.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInState.SendCopyFail(Npgsql.NpgsqlConnector,System.String)">
+            <summary>
+            Sends CopyFail message to server. Handles responses, ie. should always throw an exception:
+            in CopyIn state the server responds to CopyFail with an error response;
+            outside of a CopyIn state the server responds to CopyFail with an error response;
+            without network connection or whatever, there's going to eventually be a failure, timeout or user intervention.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInState.CopyFormat">
+            <summary>
+            Copy format information returned from server.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyInStream">
+            <summary>
+            Stream for writing data to a table on a PostgreSQL version 7.4 or newer database during an active COPY FROM STDIN operation.
+            <b>Passes data exactly as is and when given</b>, so see to it that you use server encoding, correct format and reasonably sized writes!
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.#ctor(Npgsql.NpgsqlConnector)">
+            <summary>
+            Created only by NpgsqlCopyInState.StartCopy()
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.Close">
+            <summary>
+            Successfully completes copying data to server. Returns after operation is finished.
+            Does nothing if this stream is not the active copy operation writer.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.Cancel(System.String)">
+            <summary>
+            Withdraws an already started copy operation. The operation will fail with given error message.
+            Does nothing if this stream is not the active copy operation writer.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.Write(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Writes given bytes to server.
+            Fails if this stream is not the active copy operation writer.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.Flush">
+            <summary>
+            Flushes stream contents to server.
+            Fails if this stream is not the active copy operation writer.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.Read(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Not readable
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.Seek(System.Int64,System.IO.SeekOrigin)">
+            <summary>
+            Not seekable
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.SetLength(System.Int64)">
+            <summary>
+            Not supported
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInStream.IsActive">
+            <summary>
+            True while this stream can be used to write copy data to server
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInStream.CanRead">
+            <summary>
+            False
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInStream.CanWrite">
+            <summary>
+            True
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInStream.CanSeek">
+            <summary>
+            False
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInStream.Length">
+            <summary>
+            Number of bytes written so far
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInStream.Position">
+            <summary>
+            Number of bytes written so far; not settable
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyOut">
+            <summary>
+            Represents a PostgreSQL COPY TO STDOUT operation with a corresponding SQL statement
+            to execute against a PostgreSQL database
+            and an associated stream used to write results to (if provided by user)
+            or for reading the results (when generated by driver).
+            Eg. new NpgsqlCopyOut("COPY (SELECT * FROM mytable) TO STDOUT", connection, streamToWrite).Start();
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOut.#ctor(System.String,Npgsql.NpgsqlConnection)">
+            <summary>
+            Creates NpgsqlCommand to run given query upon Start(), after which CopyStream provides data from database as requested in the query.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOut.#ctor(Npgsql.NpgsqlCommand,Npgsql.NpgsqlConnection)">
+            <summary>
+            Given command is run upon Start(), after which CopyStream provides data from database as requested in the query.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOut.#ctor(Npgsql.NpgsqlCommand,Npgsql.NpgsqlConnection,System.IO.Stream)">
+            <summary>
+            Given command is executed upon Start() and all requested copy data is written to toStream immediately.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOut.FieldIsBinary(System.Int32)">
+            <summary>
+            Returns true if this operation is currently active and field at given location is in binary format.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOut.Start">
+            <summary>
+            Command specified upon creation is executed as a non-query.
+            If CopyStream is set upon creation, all copy data from server will be written to it, and operation will be finished immediately.
+            Otherwise the CopyStream member can be used for reading copy data from server until no more data is available.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOut.End">
+            <summary>
+            Flush generated CopyStream at once. Effectively reads and discard all the rest of copy data from server.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOut.IsActive">
+            <summary>
+            Returns true if the connection is currently reserved for this operation.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOut.CopyStream">
+            <summary>
+            The stream provided by user or generated upon Start()
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOut.NpgsqlCommand">
+            <summary>
+            The Command used to execute this copy operation.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOut.IsBinary">
+            <summary>
+            Returns true if this operation is currently active and in binary format.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOut.FieldCount">
+            <summary>
+            Returns number of fields if this operation is currently active, otherwise -1
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOut.Read">
+            <summary>
+            Faster alternative to using the generated CopyStream.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyOutState">
+            <summary>
+            Represents an ongoing COPY TO STDOUT operation.
+            Provides methods to read data from server or end the operation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutState.StartCopy(Npgsql.NpgsqlConnector,Npgsql.NpgsqlCopyFormat)">
+            <summary>
+            Called from NpgsqlState.ProcessBackendResponses upon CopyOutResponse.
+            If CopyStream is already set, it is used to write data received from server, after which the copy ends.
+            Otherwise CopyStream is set to a readable NpgsqlCopyOutStream that receives data from server.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutState.GetCopyData(Npgsql.NpgsqlConnector)">
+            <summary>
+            Called from NpgsqlOutStream.Read to read copy data from server.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutState.CopyFormat">
+            <summary>
+            Copy format information returned from server.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyOutStream">
+            <summary>
+            Stream for reading data from a table or select on a PostgreSQL version 7.4 or newer database during an active COPY TO STDOUT operation.
+            <b>Passes data exactly as provided by the server.</b>
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.#ctor(Npgsql.NpgsqlConnector)">
+            <summary>
+            Created only by NpgsqlCopyOutState.StartCopy()
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.Close">
+            <summary>
+            Discards copy data as long as server pushes it. Returns after operation is finished.
+            Does nothing if this stream is not the active copy operation reader.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.Write(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Not writable.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.Flush">
+            <summary>
+            Not flushable.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.Read(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Copies data read from server to given byte buffer.
+            Since server returns data row by row, length will differ each time, but it is only zero once the operation ends.
+            Can be mixed with calls to the more efficient NpgsqlCopyOutStream.Read() : byte[] though that would not make much sense.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.Seek(System.Int64,System.IO.SeekOrigin)">
+            <summary>
+            Not seekable
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.SetLength(System.Int64)">
+            <summary>
+            Not supported
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.Read">
+            <summary>
+            Returns a whole row of data from server without extra work.
+            If standard Stream.Read(...) has been called before, it's internal buffers remains are returned.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutStream.IsActive">
+            <summary>
+            True while this stream can be used to read copy data from server
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutStream.CanRead">
+            <summary>
+            True
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutStream.CanWrite">
+            <summary>
+            False
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutStream.CanSeek">
+            <summary>
+            False
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutStream.Length">
+            <summary>
+            Number of bytes read so far
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutStream.Position">
+            <summary>
+            Number of bytes read so far; can not be set.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopySerializer">
+            <summary>
+            Writes given objects into a stream for PostgreSQL COPY in default copy format (not CSV or BINARY).
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlRowUpdatedEventHandler">
+            <summary>
+            Represents the method that handles the <see cref="E:Npgsql.NpgsqlDataAdapter.RowUpdated">RowUpdated</see> events.
+            </summary>
+            <param name="sender">The source of the event.</param>
+            <param name="e">A <see cref="T:NpgsqlRowUpdatedEventArgs">NpgsqlRowUpdatedEventArgs</see> that contains the event data.</param>
+        </member>
+        <member name="T:Npgsql.NpgsqlRowUpdatingEventHandler">
+            <summary>
+            Represents the method that handles the <see cref="E:Npgsql.NpgsqlDataAdapter.RowUpdating">RowUpdating</see> events.
+            </summary>
+            <param name="sender">The source of the event.</param>
+            <param name="e">A <see cref="T:NpgsqlRowUpdatingEventArgs">NpgsqlRowUpdatingEventArgs</see> that contains the event data.</param>
+        </member>
+        <member name="T:Npgsql.NpgsqlDataAdapter">
+            <summary>
+            This class represents an adapter from many commands: select, update, insert and delete to fill <see cref="T:System.Data.DataSet">Datasets.</see>
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlDataReader">
+            <summary>
+            Provides a means of reading a forward-only stream of rows from a PostgreSQL backend.  This class cannot be inherited.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetDataTypeName(System.Int32)">
+            <summary>
+            Return the data type name of the column at index <param name="Index"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetFieldType(System.Int32)">
+            <summary>
+            Return the data type of the column at index <param name="Index"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetProviderSpecificFieldType(System.Int32)">
+            <summary>
+            Return the Npgsql specific data type of the column at requested ordinal.
+            </summary>
+            <param name="ordinal">column position</param>
+            <returns>Appropriate Npgsql type for column.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetName(System.Int32)">
+            <summary>
+            Return the column name of the column at index <param name="Index"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetDataTypeOID(System.Int32)">
+            <summary>
+            Return the data type OID of the column at index <param name="Index"></param>.
+            </summary>
+            FIXME: Why this method returns String?
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetOrdinal(System.String)">
+            <summary>
+            Return the column name of the column named <param name="Name"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetFieldDbType(System.Int32)">
+            <summary>
+            Return the data DbType of the column at index <param name="Index"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetFieldNpgsqlDbType(System.Int32)">
+            <summary>
+            Return the data NpgsqlDbType of the column at index <param name="Index"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetInterval(System.Int32)">
+            <summary>
+            Get the value of a column as a <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.
+            <remarks>If the differences between <see cref="T:NpgsqlTypes.NpgsqlInterval"/> and <see cref="!:System.Timespan"/>
+            in handling of days and months is not important to your application, use <see cref="!:GetTimeSpan()"/>
+            instead.</remarks>
+            </summary>
+            <param name="i">Index of the field to find.</param>
+            <returns><see cref="T:NpgsqlTypes.NpgsqlInterval"/> value of the field.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetGuid(System.Int32)">
+            <summary>
+            Gets the value of a column converted to a Guid.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetInt16(System.Int32)">
+            <summary>
+            Gets the value of a column as Int16.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetInt32(System.Int32)">
+            <summary>
+            Gets the value of a column as Int32.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetInt64(System.Int32)">
+            <summary>
+            Gets the value of a column as Int64.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetFloat(System.Int32)">
+            <summary>
+            Gets the value of a column as Single.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetDouble(System.Int32)">
+            <summary>
+            Gets the value of a column as Double.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetString(System.Int32)">
+            <summary>
+            Gets the value of a column as String.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetDecimal(System.Int32)">
+            <summary>
+            Gets the value of a column as Decimal.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetTimeSpan(System.Int32)">
+            <summary>
+            Gets the value of a column as TimeSpan.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetValues(System.Object[])">
+            <summary>
+            Copy values from each column in the current row into <param name="Values"></param>.
+            </summary>
+            <returns>The number of column values copied.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetProviderSpecificValues(System.Object[])">
+            <summary>
+            Copy values from each column in the current row into <param name="Values"></param>.
+            </summary>
+            <param name="values">An array appropriately sized to store values from all columns.</param>
+            <returns>The number of column values copied.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetBoolean(System.Int32)">
+            <summary>
+            Gets the value of a column as Boolean.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetByte(System.Int32)">
+            <summary>
+            Gets the value of a column as Byte.  Not implemented.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetChar(System.Int32)">
+            <summary>
+            Gets the value of a column as Char.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetDateTime(System.Int32)">
+            <summary>
+            Gets the value of a column as DateTime.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetSchemaTable">
+            <summary>
+            Returns a System.Data.DataTable that describes the column metadata of the DataReader.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetTableNameFromQuery">
+            <summary>
+             This methods parses the command text and tries to get the tablename
+             from it.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlDataReader.ReaderClosed">
+            <summary>
+            Is raised whenever Close() is called.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlDataReader.FieldCount">
+            <summary>
+            Gets the number of columns in the current row.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlDataReader.Item(System.Int32)">
+            <summary>
+            Gets the value of a column in its native format.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlDataReader.Item(System.String)">
+            <summary>
+            Gets the value of a column in its native format.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlDataReader.Depth">
+            <summary>
+            Gets a value indicating the depth of nesting for the current row.  Always returns zero.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlDataReader.IsClosed">
+            <summary>
+            Gets a value indicating whether the data reader is closed.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlDataReader.KeyLookup.primaryKey">
+            <summary>
+            Contains the column names as the keys
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlDataReader.KeyLookup.uniqueColumns">
+            <summary>
+            Contains all unique columns
+            </summary>
+        </member>
+        <member name="T:Npgsql.ForwardsOnlyDataReader">
+            <summary>
+            This is the primary implementation of NpgsqlDataReader. It is the one used in normal cases (where the 
+            preload-reader option is not set in the connection string to resolve some potential backwards-compatibility
+            issues), the only implementation used internally, and in cases where CachingDataReader is used, it is still
+            used to do the actual "leg-work" of turning a response stream from the server into a datareader-style
+            object - with CachingDataReader then filling it's cache from here.
+            </summary>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.GetNextResponseObject">
+            <summary>
+            Iterate through the objects returned through from the server.
+            If it's a CompletedResponse the rowsaffected count is updated appropriately,
+            and we iterate again, otherwise we return it (perhaps updating our cache of pending
+            rows if appropriate).
+            </summary>
+            <returns>The next <see cref="T:Npgsql.IServerResponseObject"/> we will deal with.</returns>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.GetNextRowDescription">
+            <summary>
+            Advances the data reader to the next result, when multiple result sets were returned by the PostgreSQL backend.
+            </summary>
+            <returns>True if the reader was advanced, otherwise false.</returns>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.Dispose(System.Boolean)">
+            <summary>
+            Releases the resources used by the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.Close">
+            <summary>
+            Closes the data reader object.
+            </summary>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.NextResult">
+            <summary>
+            Advances the data reader to the next result, when multiple result sets were returned by the PostgreSQL backend.
+            </summary>
+            <returns>True if the reader was advanced, otherwise false.</returns>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.Read">
+            <summary>
+            Advances the data reader to the next row.
+            </summary>
+            <returns>True if the reader was advanced, otherwise false.</returns>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.GetValue(System.Int32)">
+            <summary>
+            Return the value of the column at index <param name="Index"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.GetBytes(System.Int32,System.Int64,System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Gets raw data from a column.
+            </summary>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.GetChars(System.Int32,System.Int64,System.Char[],System.Int32,System.Int32)">
+            <summary>
+            Gets raw data from a column.
+            </summary>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.IsDBNull(System.Int32)">
+            <summary>
+            Report whether the value in a column is DBNull.
+            </summary>
+        </member>
+        <member name="P:Npgsql.ForwardsOnlyDataReader.RecordsAffected">
+            <summary>
+            Gets the number of rows changed, inserted, or deleted by execution of the SQL statement.
+            </summary>
+        </member>
+        <member name="P:Npgsql.ForwardsOnlyDataReader.HasRows">
+            <summary>
+            Indicates if NpgsqlDatareader has rows to be read.
+            </summary>
+        </member>
+        <member name="T:Npgsql.CachingDataReader">
+            <summary>
+            <para>Provides an implementation of NpgsqlDataReader in which all data is pre-loaded into memory.
+            This operates by first creating a ForwardsOnlyDataReader as usual, and then loading all of it's
+            Rows into memory. There is a general principle that when there is a trade-off between a class design that
+            is more efficient and/or scalable on the one hand and one that is less efficient but has more functionality
+            (in this case the internal-only functionality of caching results) that one can build the less efficent class
+            from the most efficient without significant extra loss in efficiency, but not the other way around. The relationship
+            between ForwardsOnlyDataReader and CachingDataReader is an example of this).</para>
+            <para>Since the interface presented to the user is still forwards-only, queues are used to
+            store this information, so that dequeueing as we go we give the garbage collector the best opportunity
+            possible to reclaim any memory that is no longer in use.</para>
+            <para>ForwardsOnlyDataReader being used to actually
+            obtain the information from the server means that the "leg-work" is still only done (and need only be
+            maintained) in one place.</para>
+            <para>This class exists to allow for certain potential backwards-compatibility issues to be resolved
+            with little effort on the part of affected users. It is considerably less efficient than ForwardsOnlyDataReader
+            and hence never used internally.</para>
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlDescribe">
+             <summary>
+             This class represents the Parse message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlNoticeEventArgs">
+            <summary>
+            EventArgs class to send Notice parameters, which are just NpgsqlError's in a lighter context.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlNoticeEventArgs.Notice">
+            <summary>
+            Notice information.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlError">
+            <summary>
+            This class represents the ErrorResponse and NoticeResponse
+            message sent from PostgreSQL server.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlError.ToString">
+            <summary>
+            Return a string representation of this error object.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Severity">
+            <summary>
+            Severity code.  All versions.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Code">
+            <summary>
+            Error code.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Message">
+            <summary>
+            Terse error message.  All versions.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Detail">
+            <summary>
+            Detailed error message.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Hint">
+            <summary>
+            Suggestion to help resolve the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Position">
+            <summary>
+            Position (one based) within the query string where the error was encounterd.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.InternalPosition">
+            <summary>
+            Position (one based) within the query string where the error was encounterd.  This position refers to an internal command executed for example inside a PL/pgSQL function. PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.InternalQuery">
+            <summary>
+            Internal query string where the error was encounterd.  This position refers to an internal command executed for example inside a PL/pgSQL function. PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Where">
+            <summary>
+            Trace back information.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.File">
+            <summary>
+            Source file (in backend) reporting the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Line">
+            <summary>
+            Source file line number (in backend) reporting the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Routine">
+            <summary>
+            Source routine (in backend) reporting the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.ErrorSql">
+            <summary>
+            String containing the sql sent which produced this error.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.BackendProtocolVersion">
+            <summary>
+            Backend protocol version in use.
+            </summary>
+        </member>
+        <member name="T:Npgsql.LogLevel">
+            <summary>
+            The level of verbosity of the NpgsqlEventLog
+            </summary>
+        </member>
+        <member name="F:Npgsql.LogLevel.None">
+            <summary>
+            Don't log at all
+            </summary>
+        </member>
+        <member name="F:Npgsql.LogLevel.Normal">
+            <summary>
+            Only log the most common issues
+            </summary>
+        </member>
+        <member name="F:Npgsql.LogLevel.Debug">
+            <summary>
+            Log everything
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlEventLog">
+            <summary>
+            This class handles all the Npgsql event and debug logging
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMsg(System.String,Npgsql.LogLevel)">
+            <summary>
+            Writes a string to the Npgsql event log if msglevel is bigger then <see cref="P:Npgsql.NpgsqlEventLog.Level">NpgsqlEventLog.Level</see>
+            </summary>
+            <remarks>
+            This method is obsolete and should no longer be used.
+            It is likely to be removed in future versions of Npgsql
+            </remarks>
+            <param name="message">The message to write to the event log</param>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMsg(System.Resources.ResourceManager,System.String,Npgsql.LogLevel,System.Object[])">
+            <summary>
+            Writes a string to the Npgsql event log if msglevel is bigger then <see cref="P:Npgsql.NpgsqlEventLog.Level">NpgsqlEventLog.Level</see>
+            </summary>
+            <param name="resman">The <see cref="T:System.Resources.ResourceManager">ResourceManager</see> to get the localized resources</param>
+            <param name="ResourceString">The name of the resource that should be fetched by the <see cref="T:System.Resources.ResourceManager">ResourceManager</see></param>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="Parameters">The additional parameters that shall be included into the log-message (must be compatible with the string in the resource):</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogIndexerGet(Npgsql.LogLevel,System.String,System.Object)">
+            <summary>
+            Writes the default log-message for the action of calling the Get-part of an Indexer to the log file.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Indexer</param>
+            <param name="IndexerParam">The parameter given to the Indexer</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogIndexerSet(Npgsql.LogLevel,System.String,System.Object,System.Object)">
+            <summary>
+            Writes the default log-message for the action of calling the Set-part of an Indexer to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Indexer</param>
+            <param name="IndexerParam">The parameter given to the Indexer</param>
+            <param name="value">The value the Indexer is set to</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogPropertyGet(Npgsql.LogLevel,System.String,System.String)">
+            <summary>
+            Writes the default log-message for the action of calling the Get-part of a Property to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Property</param>
+            <param name="PropertyName">The name of the Property</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogPropertySet(Npgsql.LogLevel,System.String,System.String,System.Object)">
+            <summary>
+            Writes the default log-message for the action of calling the Set-part of a Property to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Property</param>
+            <param name="PropertyName">The name of the Property</param>
+            <param name="value">The value the Property is set to</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMethodEnter(Npgsql.LogLevel,System.String,System.String)">
+            <summary>
+            Writes the default log-message for the action of calling a Method without Arguments to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Method</param>
+            <param name="MethodName">The name of the Method</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMethodEnter(Npgsql.LogLevel,System.String,System.String,System.Object)">
+            <summary>
+            Writes the default log-message for the action of calling a Method with one Argument to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Method</param>
+            <param name="MethodName">The name of the Method</param>
+            <param name="MethodParameter">The value of the Argument of the Method</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMethodEnter(Npgsql.LogLevel,System.String,System.String,System.Object,System.Object)">
+            <summary>
+            Writes the default log-message for the action of calling a Method with two Arguments to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Method</param>
+            <param name="MethodName">The name of the Method</param>
+            <param name="MethodParameter1">The value of the first Argument of the Method</param>
+            <param name="MethodParameter2">The value of the second Argument of the Method</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMethodEnter(Npgsql.LogLevel,System.String,System.String,System.Object,System.Object,System.Object)">
+            <summary>
+            Writes the default log-message for the action of calling a Method with three Arguments to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Method</param>
+            <param name="MethodName">The name of the Method</param>
+            <param name="MethodParameter1">The value of the first Argument of the Method</param>
+            <param name="MethodParameter2">The value of the second Argument of the Method</param>
+            <param name="MethodParameter3">The value of the third Argument of the Method</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMethodEnter(Npgsql.LogLevel,System.String,System.String,System.Object[])">
+            <summary>
+            Writes the default log-message for the action of calling a Method with more than three Arguments to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Method</param>
+            <param name="MethodName">The name of the Method</param>
+            <param name="MethodParameters">A <see cref="T:System.Object">Object</see>-Array with zero or more Ojects that are Arguments of the Method.</param>
+        </member>
+        <member name="P:Npgsql.NpgsqlEventLog.Level">
+            <summary>
+             Sets/Returns the level of information to log to the logfile.
+             </summary>
+             <value>The current <see cref="T:Npgsql.LogLevel">LogLevel</see></value>
+        </member>
+        <member name="P:Npgsql.NpgsqlEventLog.LogName">
+            <summary>
+             Sets/Returns the filename to use for logging.
+             </summary>
+             <value>The filename of the current Log file.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlEventLog.EchoMessages">
+            <summary>
+             Sets/Returns whether Log messages should be echoed to the console
+             </summary>
+             <value><b>true</b> if Log messages are echoed to the console, otherwise <b>false</b></value>
+        </member>
+        <member name="T:Npgsql.NpgsqlException">
+            <summary>
+            The exception that is thrown when the PostgreSQL backend reports errors.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlException.#ctor(System.Collections.IList)">
+            <summary>
+            Construct a backend error exception based on a list of one or more
+            backend errors.  The basic Exception.Message will be built from the
+            first (usually the only) error in the list.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlException.ToString">
+            <summary>
+            Format a .NET style exception string.
+            Include all errors in the list, including any hints.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlException.AppendString(System.IO.StringWriter,System.String,System.String)">
+            <summary>
+            Append a line to the given Stream, first checking for zero-length.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Item(System.Int32)">
+            <summary>
+            Provide access to the entire list of errors provided by the PostgreSQL backend.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Severity">
+            <summary>
+            Severity code.  All versions.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Code">
+            <summary>
+            Error code.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.BaseMessage">
+            <summary>
+            Basic error message.  All versions.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Detail">
+            <summary>
+            Detailed error message.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Hint">
+            <summary>
+            Suggestion to help resolve the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Position">
+            <summary>
+            Position (one based) within the query string where the error was encounterd.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Where">
+            <summary>
+            Trace back information.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.File">
+            <summary>
+            Source file (in backend) reporting the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Line">
+            <summary>
+            Source file line number (in backend) reporting the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Routine">
+            <summary>
+            Source routine (in backend) reporting the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.ErrorSql">
+            <summary>
+            String containing the sql sent which produced this error.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Errors">
+            <summary>
+            Returns the entire list of errors provided by the PostgreSQL backend.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlExecute">
+             <summary>
+             This class represents the Parse message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlFactory">
+            <summary>
+            A factory to create instances of various Npgsql objects.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlFactory.CreateCommand">
+            <summary>
+            Creates an NpgsqlCommand object.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlFlush">
+             <summary>
+             This class represents the Parse message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlMediator">
+            <summary>
+             This class is responsible for serving as bridge between the backend
+             protocol handling and the core classes. It is used as the mediator for
+             exchanging data generated/sent from/to backend.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlNotificationEventArgs">
+            <summary>
+            EventArgs class to send Notification parameters.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlNotificationEventArgs.PID">
+            <summary>
+            Process ID of the PostgreSQL backend that sent this notification.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlNotificationEventArgs.Condition">
+            <summary>
+            Condition that triggered that notification.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlNotificationEventArgs.AdditionalInformation">
+            <summary>
+            Additional Information From Notifiying Process (for future use, currently postgres always sets this to an empty string)
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlParameter">
+            <summary>
+             This class represents a parameter to a command that will be sent to server
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> class.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.#ctor(System.String,System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+            class with the parameter m_Name and a value of the new <b>NpgsqlParameter</b>.
+            </summary>
+            <param m_Name="parameterName">The m_Name of the parameter to map.</param>
+            <param m_Name="value">An <see cref="T:System.Object">Object</see> that is the value of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>.</param>
+            <remarks>
+            <p>When you specify an <see cref="T:System.Object">Object</see>
+            in the value parameter, the <see cref="T:System.Data.DbType">DbType</see> is
+            inferred from the .NET Framework type of the <b>Object</b>.</p>
+            <p>When using this constructor, you must be aware of a possible misuse of the constructor which takes a DbType parameter.
+            This happens when calling this constructor passing an int 0 and the compiler thinks you are passing a value of DbType.
+            Use <code> Convert.ToInt32(value) </code> for example to have compiler calling the correct constructor.</p>
+            </remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.#ctor(System.String,NpgsqlTypes.NpgsqlDbType)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+            class with the parameter m_Name and the data type.
+            </summary>
+            <param m_Name="parameterName">The m_Name of the parameter to map.</param>
+            <param m_Name="parameterType">One of the <see cref="T:System.Data.DbType">DbType</see> values.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.#ctor(System.String,NpgsqlTypes.NpgsqlDbType,System.Int32)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+            class with the parameter m_Name, the <see cref="T:System.Data.DbType">DbType</see>, and the size.
+            </summary>
+            <param m_Name="parameterName">The m_Name of the parameter to map.</param>
+            <param m_Name="parameterType">One of the <see cref="T:System.Data.DbType">DbType</see> values.</param>
+            <param m_Name="size">The length of the parameter.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.#ctor(System.String,NpgsqlTypes.NpgsqlDbType,System.Int32,System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+            class with the parameter m_Name, the <see cref="T:System.Data.DbType">DbType</see>, the size,
+            and the source column m_Name.
+            </summary>
+            <param m_Name="parameterName">The m_Name of the parameter to map.</param>
+            <param m_Name="parameterType">One of the <see cref="T:System.Data.DbType">DbType</see> values.</param>
+            <param m_Name="size">The length of the parameter.</param>
+            <param m_Name="sourceColumn">The m_Name of the source column.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.#ctor(System.String,NpgsqlTypes.NpgsqlDbType,System.Int32,System.String,System.Data.ParameterDirection,System.Boolean,System.Byte,System.Byte,System.Data.DataRowVersion,System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+            class with the parameter m_Name, the <see cref="T:System.Data.DbType">DbType</see>, the size,
+            the source column m_Name, a <see cref="T:System.Data.ParameterDirection">ParameterDirection</see>,
+            the precision of the parameter, the scale of the parameter, a
+            <see cref="T:System.Data.DataRowVersion">DataRowVersion</see> to use, and the
+            value of the parameter.
+            </summary>
+            <param m_Name="parameterName">The m_Name of the parameter to map.</param>
+            <param m_Name="parameterType">One of the <see cref="T:System.Data.DbType">DbType</see> values.</param>
+            <param m_Name="size">The length of the parameter.</param>
+            <param m_Name="sourceColumn">The m_Name of the source column.</param>
+            <param m_Name="direction">One of the <see cref="T:System.Data.ParameterDirection">ParameterDirection</see> values.</param>
+            <param m_Name="isNullable"><b>true</b> if the value of the field can be null, otherwise <b>false</b>.</param>
+            <param m_Name="precision">The total number of digits to the left and right of the decimal point to which
+            <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see> is resolved.</param>
+            <param m_Name="scale">The total number of decimal places to which
+            <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see> is resolved.</param>
+            <param m_Name="sourceVersion">One of the <see cref="T:System.Data.DataRowVersion">DataRowVersion</see> values.</param>
+            <param m_Name="value">An <see cref="T:System.Object">Object</see> that is the value
+            of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.Clone">
+            <summary>
+            Creates a new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> that
+            is a copy of the current instance.
+            </summary>
+            <returns>A new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> that is a copy of this instance.</returns>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.Precision">
+            <summary>
+            Gets or sets the maximum number of digits used to represent the
+            <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see> property.
+            </summary>
+            <value>The maximum number of digits used to represent the
+            <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see> property.
+            The default value is 0, which indicates that the data provider
+            sets the precision for <b>Value</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.Scale">
+            <summary>
+            Gets or sets the number of decimal places to which
+            <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see> is resolved.
+            </summary>
+            <value>The number of decimal places to which
+            <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see> is resolved. The default is 0.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.Size">
+            <summary>
+            Gets or sets the maximum size, in bytes, of the data within the column.
+            </summary>
+            <value>The maximum size, in bytes, of the data within the column.
+            The default value is inferred from the parameter value.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.DbType">
+            <summary>
+            Gets or sets the <see cref="T:System.Data.DbType">DbType</see> of the parameter.
+            </summary>
+            <value>One of the <see cref="T:System.Data.DbType">DbType</see> values. The default is <b>String</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.NpgsqlDbType">
+            <summary>
+            Gets or sets the <see cref="T:System.Data.DbType">DbType</see> of the parameter.
+            </summary>
+            <value>One of the <see cref="T:System.Data.DbType">DbType</see> values. The default is <b>String</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.Direction">
+            <summary>
+            Gets or sets a value indicating whether the parameter is input-only,
+            output-only, bidirectional, or a stored procedure return value parameter.
+            </summary>
+            <value>One of the <see cref="T:System.Data.ParameterDirection">ParameterDirection</see>
+            values. The default is <b>Input</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.IsNullable">
+            <summary>
+            Gets or sets a value indicating whether the parameter accepts null values.
+            </summary>
+            <value><b>true</b> if null values are accepted; otherwise, <b>false</b>. The default is <b>false</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.ParameterName">
+            <summary>
+            Gets or sets the m_Name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>.
+            </summary>
+            <value>The m_Name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>.
+            The default is an empty string.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.CleanName">
+            <summary>
+            The m_Name scrubbed of any optional marker
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.SourceColumn">
+            <summary>
+            Gets or sets the m_Name of the source column that is mapped to the
+            <see cref="T:System.Data.DataSet">DataSet</see> and used for loading or
+            returning the <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see>.
+            </summary>
+            <value>The m_Name of the source column that is mapped to the
+            <see cref="T:System.Data.DataSet">DataSet</see>. The default is an empty string.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.SourceVersion">
+            <summary>
+            Gets or sets the <see cref="T:System.Data.DataRowVersion">DataRowVersion</see>
+            to use when loading <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see>.
+            </summary>
+            <value>One of the <see cref="T:System.Data.DataRowVersion">DataRowVersion</see> values.
+            The default is <b>Current</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.Value">
+            <summary>
+            Gets or sets the value of the parameter.
+            </summary>
+            <value>An <see cref="T:System.Object">Object</see> that is the value of the parameter.
+            The default value is null.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.NpgsqlValue">
+            <summary>
+            Gets or sets the value of the parameter.
+            </summary>
+            <value>An <see cref="T:System.Object">Object</see> that is the value of the parameter.
+            The default value is null.</value>
+        </member>
+        <member name="T:Npgsql.NpgsqlParameterCollection">
+            <summary>
+            Represents a collection of parameters relevant to a <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see>
+            as well as their respective mappings to columns in a <see cref="T:System.Data.DataSet">DataSet</see>.
+            This class cannot be inherited.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.#ctor">
+            <summary>
+            Initializes a new instance of the NpgsqlParameterCollection class.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Add(Npgsql.NpgsqlParameter)">
+            <summary>
+            Adds the specified <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see>.
+            </summary>
+            <param name="value">The <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to add to the collection.</param>
+            <returns>The index of the new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Add(System.String,System.Object)">
+            <summary>
+            Adds a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see> given the specified parameter name and value.
+            </summary>
+            <param name="parameterName">The name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>.</param>
+            <param name="value">The Value of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to add to the collection.</param>
+            <returns>The index of the new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+            <remarks>
+            Use caution when using this overload of the
+            <b>Add</b> method to specify integer parameter values.
+            Because this overload takes a <i>value</i> of type Object,
+            you must convert the integral value to an <b>Object</b>
+            type when the value is zero, as the following C# example demonstrates.
+            <code>parameters.Add(":pname", Convert.ToInt32(0));</code>
+            If you do not perform this conversion, the compiler will assume you
+            are attempting to call the NpgsqlParameterCollection.Add(string, DbType) overload.
+            </remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Add(System.String,NpgsqlTypes.NpgsqlDbType)">
+            <summary>
+            Adds a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see> given the parameter name and the data type.
+            </summary>
+            <param name="parameterName">The name of the parameter.</param>
+            <param name="parameterType">One of the DbType values.</param>
+            <returns>The index of the new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Add(System.String,NpgsqlTypes.NpgsqlDbType,System.Int32)">
+            <summary>
+            Adds a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see> with the parameter name, the data type, and the column length.
+            </summary>
+            <param name="parameterName">The name of the parameter.</param>
+            <param name="parameterType">One of the DbType values.</param>
+            <param name="size">The length of the column.</param>
+            <returns>The index of the new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Add(System.String,NpgsqlTypes.NpgsqlDbType,System.Int32,System.String)">
+            <summary>
+            Adds a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see> with the parameter name, the data type, the column length, and the source column name.
+            </summary>
+            <param name="parameterName">The name of the parameter.</param>
+            <param name="parameterType">One of the DbType values.</param>
+            <param name="size">The length of the column.</param>
+            <param name="sourceColumn">The name of the source column.</param>
+            <returns>The index of the new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.RemoveAt(System.String)">
+            <summary>
+            Removes the specified <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> from the collection using the parameter name.
+            </summary>
+            <param name="parameterName">The name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to retrieve.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Contains(System.String)">
+            <summary>
+            Gets a value indicating whether a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> with the specified parameter name exists in the collection.
+            </summary>
+            <param name="parameterName">The name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to find.</param>
+            <returns><b>true</b> if the collection contains the parameter; otherwise, <b>false</b>.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.IndexOf(System.String)">
+            <summary>
+            Gets the location of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> in the collection with a specific parameter name.
+            </summary>
+            <param name="parameterName">The name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to find.</param>
+            <returns>The zero-based location of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> in the collection.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.RemoveAt(System.Int32)">
+            <summary>
+            Removes the specified <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> from the collection using a specific index.
+            </summary>
+            <param name="index">The zero-based index of the parameter.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Insert(System.Int32,System.Object)">
+            <summary>
+            Inserts a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> into the collection at the specified index.
+            </summary>
+            <param name="index">The zero-based index where the parameter is to be inserted within the collection.</param>
+            <param name="value">The <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to add to the collection.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Remove(System.Object)">
+            <summary>
+            Removes the specified <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> from the collection.
+            </summary>
+            <param name="value">The <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to remove from the collection.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Contains(System.Object)">
+            <summary>
+            Gets a value indicating whether a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> exists in the collection.
+            </summary>
+            <param name="value">The value of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to find.</param>
+            <returns>true if the collection contains the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object; otherwise, false.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.TryGetValue(System.String,Npgsql.NpgsqlParameter@)">
+            <summary>
+            Gets a value indicating whether a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> with the specified parameter name exists in the collection.
+            </summary>
+            <param name="parameterName">The name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to find.</param>
+            <param name="parameter">A reference to the requested parameter is returned in this out param if it is found in the list.  This value is null if the parameter is not found.</param>
+            <returns><b>true</b> if the collection contains the parameter and param will contain the parameter; otherwise, <b>false</b>.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Clear">
+            <summary>
+            Removes all items from the collection.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.IndexOf(System.Object)">
+            <summary>
+            Gets the location of a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> in the collection.
+            </summary>
+            <param name="value">The value of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to find.</param>
+            <returns>The zero-based index of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object in the collection.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Add(System.Object)">
+            <summary>
+            Adds the specified <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see>.
+            </summary>
+            <param name="value">The <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to add to the collection.</param>
+            <returns>The zero-based index of the new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.CopyTo(System.Array,System.Int32)">
+            <summary>
+            Copies <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> objects from the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see> to the specified array.
+            </summary>
+            <param name="array">An <see cref="T:System.Array">Array</see> to which to copy the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> objects in the collection.</param>
+            <param name="index">The starting index of the array.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.GetEnumerator">
+            <summary>
+            Returns an enumerator that can iterate through the collection.
+            </summary>
+            <returns>An <see cref="T:System.Collections.IEnumerator">IEnumerator</see> that can be used to iterate through the collection.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.CheckType(System.Object)">
+            <summary>
+            In methods taking an object as argument this method is used to verify
+            that the argument has the type <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+            </summary>
+            <param name="Object">The object to verify</param>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameterCollection.Item(System.String)">
+            <summary>
+            Gets the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> with the specified name.
+            </summary>
+            <param name="parameterName">The name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to retrieve.</param>
+            <value>The <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> with the specified name, or a null reference if the parameter is not found.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameterCollection.Item(System.Int32)">
+            <summary>
+            Gets the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> at the specified index.
+            </summary>
+            <param name="index">The zero-based index of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to retrieve.</param>
+            <value>The <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> at the specified index.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameterCollection.Count">
+            <summary>
+            Gets the number of <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> objects in the collection.
+            </summary>
+            <value>The number of <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> objects in the collection.</value>
+        </member>
+        <member name="T:Npgsql.NpgsqlParameterStatus">
+             <summary>
+             This class represents the ParameterStatus message sent from PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlParse">
+             <summary>
+             This class represents the Parse message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlPasswordPacket">
+            <summary>
+            This class represents a PasswordPacket message sent to backend
+            PostgreSQL.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlPromotableSinglePhaseNotification.Prepare">
+            <summary>
+            Used when a connection is closed
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlQuery">
+            <summary>
+            Summary description for NpgsqlQuery
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlRow">
+            <summary>
+            This is the abstract base class for NpgsqlAsciiRow and NpgsqlBinaryRow.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlRowDescription">
+             <summary>
+             This class represents a RowDescription message sent from
+             the PostgreSQL.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlRowDescription.FieldData">
+            <summary>
+            This struct represents the internal data of the RowDescription message.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlSchema">
+            <summary>
+            Provides the underlying mechanism for reading schema information.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.#ctor(Npgsql.NpgsqlConnection)">
+            <summary>
+            Creates an NpgsqlSchema that can read schema information from the database.
+            </summary>
+            <param name="connection">An open database connection for reading metadata.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetMetaDataCollections">
+            <summary>
+            Returns the MetaDataCollections that lists all possible collections.
+            </summary>
+            <returns>The MetaDataCollections</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetRestrictions">
+            <summary>
+            Returns the Restrictions that contains the meaning and position of the values in the restrictions array.
+            </summary>
+            <returns>The Restrictions</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetDatabases(System.String[])">
+            <summary>
+            Returns the Databases that contains a list of all accessable databases.
+            </summary>
+            <param name="restrictions">The restrictions to filter the collection.</param>
+            <returns>The Databases</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetTables(System.String[])">
+            <summary>
+            Returns the Tables that contains table and view names and the database and schema they come from.
+            </summary>
+            <param name="restrictions">The restrictions to filter the collection.</param>
+            <returns>The Tables</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetColumns(System.String[])">
+            <summary>
+            Returns the Columns that contains information about columns in tables. 
+            </summary>
+            <param name="restrictions">The restrictions to filter the collection.</param>
+            <returns>The Columns.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetViews(System.String[])">
+            <summary>
+            Returns the Views that contains view names and the database and schema they come from.
+            </summary>
+            <param name="restrictions">The restrictions to filter the collection.</param>
+            <returns>The Views</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetUsers(System.String[])">
+            <summary>
+            Returns the Users containing user names and the sysid of those users.
+            </summary>
+            <param name="restrictions">The restrictions to filter the collection.</param>
+            <returns>The Users.</returns>
+        </member>
+        <member name="T:Npgsql.NpgsqlStartupPacket">
+             <summary>
+             This class represents a StartupPacket message of PostgreSQL
+             protocol.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.CompletedResponse">
+            <summary>
+            Represents a completed response message.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlSync">
+             <summary>
+             This class represents the Parse message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlTransaction">
+            <summary>
+            Represents a transaction to be made in a PostgreSQL database. This class cannot be inherited.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlTransaction.Commit">
+            <summary>
+            Commits the database transaction.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlTransaction.Rollback">
+            <summary>
+            Rolls back a transaction from a pending state.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlTransaction.Rollback(System.String)">
+            <summary>
+            Rolls back a transaction from a pending savepoint state.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlTransaction.Save(System.String)">
+            <summary>
+            Creates a transaction save point.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlTransaction.Cancel">
+            <summary>
+            Cancel the transaction without telling the backend about it.  This is
+            used to make the transaction go away when closing a connection.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlTransaction.Connection">
+            <summary>
+            Gets the <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>
+            object associated with the transaction, or a null reference if the
+            transaction is no longer valid.
+            </summary>
+            <value>The <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>
+            object associated with the transaction.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlTransaction.IsolationLevel">
+            <summary>
+            Specifies the <see cref="T:System.Data.IsolationLevel">IsolationLevel</see> for this transaction.
+            </summary>
+            <value>The <see cref="T:System.Data.IsolationLevel">IsolationLevel</see> for this transaction.
+            The default is <b>ReadCommitted</b>.</value>
+        </member>
+        <member name="T:Npgsql.PGUtil">
+            <summary>
+             This class provides many util methods to handle
+             reading and writing of PostgreSQL protocol messages.
+             </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.ConvertProtocolVersion(Npgsql.ProtocolVersion)">
+            <summary>
+             This method takes a ProtocolVersion and returns an integer
+             version number that the Postgres backend will recognize in a
+             startup packet.
+             </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.ExtractServerVersion(System.String)">
+            <summary>
+            This method takes a version string as returned by SELECT VERSION() and returns
+            a valid version string ("7.2.2" for example).
+            This is only needed when running protocol version 2.
+            This does not do any validity checks.
+            </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.ReadString(System.IO.Stream)">
+            <summary>
+             This method gets a C NULL terminated string from the network stream.
+             It keeps reading a byte in each time until a NULL byte is returned.
+             It returns the resultant string of bytes read.
+             This string is sent from backend.
+             </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.ReadBytes(System.IO.Stream,System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Reads requested number of bytes from stream with retries until Stream.Read returns 0 or count is reached.
+            </summary>
+            <param name="stream">Stream to read</param>
+            <param name="buffer">byte buffer to fill</param>
+            <param name="offset">starting position to fill the buffer</param>
+            <param name="count">number of bytes to read</param>
+            <returns>The number of bytes read.  May be less than count if no more bytes are available.</returns>
+        </member>
+        <member name="M:Npgsql.PGUtil.WriteString(System.String,System.IO.Stream)">
+            <summary>
+             This method writes a C NULL terminated string to the network stream.
+             It appends a NULL terminator to the end of the String.
+             </summary>
+            <summary>
+             This method writes a C NULL terminated string to the network stream.
+             It appends a NULL terminator to the end of the String.
+             </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.WriteBytes(System.Byte[],System.IO.Stream)">
+            <summary>
+            This method writes a set of bytes to the stream. It also enables logging of them.
+            </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.WriteLimString(System.String,System.Int32,System.IO.Stream)">
+            <summary>
+             This method writes a C NULL terminated string limited in length to the
+             backend server.
+             It pads the string with null bytes to the size specified.
+             </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.WriteInt32(System.IO.Stream,System.Int32)">
+            <summary>
+            Write a 32-bit integer to the given stream in the correct byte order.
+            </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.ReadInt32(System.IO.Stream)">
+            <summary>
+            Read a 32-bit integer from the given stream in the correct byte order.
+            </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.WriteInt16(System.IO.Stream,System.Int16)">
+            <summary>
+            Write a 16-bit integer to the given stream in the correct byte order.
+            </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.ReadInt16(System.IO.Stream)">
+            <summary>
+            Read a 16-bit integer from the given stream in the correct byte order.
+            </summary>
+        </member>
+        <member name="T:Npgsql.ProtocolVersion">
+            <summary>
+            Represent the frontend/backend protocol version.
+            </summary>
+        </member>
+        <member name="T:Npgsql.ServerVersion">
+            <summary>
+            Represent the backend server version.
+            As this class offers no functionality beyond that offered by <see cref="T:System.Version"/> it has been
+            deprecated in favour of that class.
+            </summary>
+            
+        </member>
+        <member name="M:Npgsql.ServerVersion.ToString">
+            <summary>
+            Returns the string representation of this version in three place dot notation (Major.Minor.Patch).
+            </summary>
+        </member>
+        <member name="P:Npgsql.ServerVersion.Major">
+            <summary>
+            Server version major number.
+            </summary>
+        </member>
+        <member name="P:Npgsql.ServerVersion.Minor">
+            <summary>
+            Server version minor number.
+            </summary>
+        </member>
+        <member name="P:Npgsql.ServerVersion.Patch">
+            <summary>
+            Server version patch level number.
+            </summary>
+        </member>
+        <member name="T:Npgsql.SSPIHandler">
+            <summary>
+            A class to handle everything associated with SSPI authentication
+            </summary>
+        </member>
+        <member name="T:Npgsql.SSPIHandler.SecBufferDesc">
+            <summary>
+            Simplified SecBufferDesc struct with only one SecBuffer
+            </summary>
+        </member>
+    </members>
+</doc>
Binary file packages/Npgsql.2.0.14.3/lib/net20/de/Npgsql.resources.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net20/es/Npgsql.resources.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net20/fi/Npgsql.resources.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net20/fr/Npgsql.resources.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net20/ja/Npgsql.resources.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net20/zh-CN/Npgsql.resources.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net35/Mono.Security.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net35/Npgsql.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/Npgsql.2.0.14.3/lib/net35/Npgsql.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4705 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>Npgsql</name>
+    </assembly>
+    <members>
+        <member name="T:NpgsqlTypes.ArrayNativeToBackendTypeConverter">
+            <summary>
+            Handles serialisation of .NET array or IEnumeration to pg format.
+            Arrays of arrays, enumerations of enumerations, arrays of enumerations etc.
+            are treated as multi-dimensional arrays (in much the same manner as an array of arrays
+            is used to emulate multi-dimensional arrays in languages that lack native support for them).
+            If such an enumeration of enumerations is "jagged" (as opposed to rectangular, cuboid,
+            hypercuboid, hyperhypercuboid, etc) then this class will "correctly" serialise it, but pg
+            will raise an error as it doesn't allow jagged arrays.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayNativeToBackendTypeConverter.#ctor(NpgsqlTypes.NpgsqlNativeTypeInfo)">
+            <summary>
+            Create an ArrayNativeToBackendTypeConverter with the element converter passed
+            </summary>
+            <param name="elementConverter">The <see cref="T:NpgsqlTypes.NpgsqlNativeTypeInfo"/> that would be used to serialise the element type.</param>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayNativeToBackendTypeConverter.FromArray(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Serialise the enumeration or array.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.ArrayBackendToNativeTypeConverter">
+            <summary>
+            Handles parsing of pg arrays into .NET arrays.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.TokenEnumeration(System.String)">
+            <summary>
+            Takes a string representation of a pg 1-dimensional array
+            (or a 1-dimensional row within an n-dimensional array)
+            and allows enumeration of the string represenations of each items.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.ArrayChunkEnumeration(System.String)">
+            <summary>
+            Takes a string representation of a pg n-dimensional array
+            and allows enumeration of the string represenations of the next
+            lower level of rows (which in turn can be taken as (n-1)-dimensional arrays.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.RecursiveArrayListEnumeration(System.Collections.ArrayList)">
+            <summary>
+            Takes an ArrayList which may be an ArrayList of ArrayLists, an ArrayList of ArrayLists of ArrayLists
+            and so on and enumerates the items that aren't ArrayLists (the leaf nodes if we think of the ArrayList
+            passed as a tree). Simply uses the ArrayLists' own IEnumerators to get that of the next,
+            pushing them onto a stack until we hit something that isn't an ArrayList.
+            <param name="list"><see cref="T:System.Collections.ArrayList">ArrayList</see> to enumerate</param>
+            <returns><see cref="T:System.Collections.IEnumerable">IEnumerable</see></returns>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.#ctor(NpgsqlTypes.NpgsqlBackendTypeInfo)">
+            <summary>
+            Create a new ArrayBackendToNativeTypeConverter
+            </summary>
+            <param name="elementConverter"><see cref="T:NpgsqlTypes.NpgsqlBackendTypeInfo"/> for the element type.</param>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.ToArray(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Creates an array from pg representation.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.ToArrayList(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Creates an array list from pg represenation of an array.
+            Multidimensional arrays are treated as ArrayLists of ArrayLists
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.ToArray(System.Collections.ArrayList,System.Type)">
+            <summary>
+            Creates an n-dimensional array from an ArrayList of ArrayLists or
+            a 1-dimensional array from something else. 
+            </summary>
+            <param name="list"><see cref="T:System.Collections.ArrayList"/> to convert</param>
+            <returns><see cref="T:System.Array"/> produced.</returns>
+        </member>
+        <member name="T:NpgsqlTypes.ArrayBackendToNativeTypeConverter.IntSetIterator">
+            <summary>
+            Takes an array of ints and treats them like the limits of a set of counters.
+            Retains a matching set of ints that is set to all zeros on the first ++
+            On a ++ it increments the "right-most" int. If that int reaches it's 
+            limit it is set to zero and the one before it is incremented, and so on.
+            
+            Making this a more general purpose class is pretty straight-forward, but we'll just put what we need here.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.BitString">
+            <summary>
+            <para>Implements a bit string; a collection of zero or more bits which can each be 1 or 0.</para>
+            <para>BitString's behave as a list of bools, though like most strings and unlike most collections the position
+            tends to be of as much significance as the value.</para>
+            <para>BitStrings are often used as masks, and are commonly cast to and from other values.</para>
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.BitString.Empty">
+            <summary>
+            Represents the empty string.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.#ctor(System.Collections.Generic.IEnumerable{System.Boolean})">
+            <summary>
+            Create a BitString from an enumeration of boolean values. The BitString will contain
+            those booleans in the order they came in.
+            </summary>
+            <param name="bits">The boolean values.</param>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.#ctor(System.Boolean,System.Int32)">
+            <summary>
+            Creates a BitString filled with a given number of true or false values.
+            </summary>
+            <param name="value">The value to fill the string with.</param>
+            <param name="count">The number of bits to fill.</param>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.#ctor(System.String)">
+            <summary>
+            Creats a bitstring from a <see cref="T:System.String">string</see>.
+            <param name="str">The <see cref="T:System.String">string to copy from</see>.</param>
+            <seealso cref="!:Npgsql.BitString.Parse(System.String)"/>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.#ctor(System.Boolean)">
+            <summary>
+            Creates a single-bit element from a boolean value.
+            </summary>
+            <param name="boolean">The <see cref="T:System.Boolean">bool</see> value which determines whether
+            the bit is 1 or 0.</param>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.#ctor(System.UInt32)">
+            <summary>
+            Creates a bitstring from an unsigned integer value. The string will be the shortest required to
+            contain the integer (e.g. 1 bit for 0 or 1, 2 for 2 or 3, 3 for 4-7, and so on).
+            </summary>
+            <param name="integer">The <see cref="T:System.UInt32">integer</see>.</param>
+            <remarks>This method is not CLS Compliant, and may not be available to some languages.</remarks>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.#ctor(System.Int32)">
+            <summary>
+            Creates a bitstring from an integer value. The string will be the shortest required to
+            contain the integer (e.g. 1 bit for 0 or 1, 2 for 2 or 3, 3 for 4-7, and so on).
+            </summary>
+            <param name="integer">The <see cref="T:System.Int32">integer</see>.</param>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.IndexOf(System.Boolean)">
+            <summary>
+            Finds the first instance of a given value
+            </summary>
+            <param name="item">The value - whether true or false - to search for.</param>
+            <returns>The index of the value found, or -1 if none are present.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Contains(System.Boolean)">
+            <summary>
+            True if there is at least one bit with the value looked for.
+            </summary>
+            <param name="item">The value - true or false - to detect.</param>
+            <returns>True if at least one bit was the same as item, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.CopyTo(System.Boolean[],System.Int32)">
+            <summary>
+            Copies the bitstring to an array of bools.
+            </summary>
+            <param name="array">The <see cref="T:System.Boolean">boolean</see> array to copy to.</param>
+            <param name="arrayIndex">The index in the array to start copying from.</param>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.GetEnumerator">
+            <summary>
+            Returns an enumerator that enumerates through the string.
+            </summary>
+            <returns>The enumerator.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Concat(NpgsqlTypes.BitString)">
+            <summary>
+            Creats a bitstring by concatenating another onto this one.
+            </summary>
+            <param name="append">The string to append to this one.</param>
+            <returns>The combined strings.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Substring(System.Int32,System.Int32)">
+            <summary>
+            Returns a substring of this string.
+            </summary>
+            <param name="start">The position to start from, must be between 0 and the length of the string.</param>
+            <param name="length">The length of the string to return, must be greater than zero, and may not be
+            so large that the start + length exceeds the bounds of this instance.</param>
+            <returns>The Bitstring identified</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Substring(System.Int32)">
+            <summary>
+            Returns a substring of this string.
+            </summary>
+            <param name="start">The position to start from, must be between 0 and the length of the string,
+            the rest of the string is returned.</param>
+            <returns>The Bitstring identified</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.And(NpgsqlTypes.BitString)">
+            <summary>
+            A logical and between this string and another. The two strings must be the same length.
+            </summary>
+            <param name="operand">Another BitString to AND with this one.</param>
+            <returns>A bitstring with 1 where both BitStrings had 1 and 0 otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Or(NpgsqlTypes.BitString)">
+            <summary>
+            A logical or between this string and another. The two strings must be the same length.
+            </summary>
+            <param name="operand">Another BitString to OR with this one.</param>
+            <returns>A bitstring with 1 where either BitString had 1 and 0 otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Xor(NpgsqlTypes.BitString)">
+            <summary>
+            A logical xor between this string and another. The two strings must be the same length.
+            </summary>
+            <param name="operand">Another BitString to XOR with this one.</param>
+            <returns>A bitstring with 1 where one BitStrings and the other had 0,
+            and 0 where they both had 1 or both had 0.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Not">
+            <summary>
+            A bitstring that is the logical inverse of this one.
+            </summary>
+            <returns>A bitstring of the same length as this with 1 where this has 0 and vice-versa.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.LShift(System.Int32)">
+            <summary>
+            Shifts the string operand bits to the left, filling with zeros to produce a
+            string of the same length.
+            </summary>
+            <param name="operand">The number of bits to shift to the left.</param>
+            <returns>A left-shifted bitstring.</returns>
+            <remarks><para>The behaviour of LShift is closer to what one would expect from dealing
+            with PostgreSQL bit-strings than in using the same operations on integers in .NET</para>
+            <para>In particular, negative operands result in a right-shift, and operands greater than
+            the length of the string will shift it entirely, resulting in a zero-filled string.</para>
+            </remarks>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.RShift(System.Int32)">
+            <summary>
+            Shifts the string operand bits to the right, filling with zeros to produce a
+            string of the same length.
+            </summary>
+            <param name="operand">The number of bits to shift to the right.</param>
+            <returns>A right-shifted bitstring.</returns>
+            <remarks><para>The behaviour of RShift is closer to what one would expect from dealing
+            with PostgreSQL bit-strings than in using the same operations on integers in .NET</para>
+            <para>In particular, negative operands result in a left-shift, and operands greater than
+            the length of the string will shift it entirely, resulting in a zero-filled string. It also performs
+            a logical shift, rather than an arithmetic shift, so it always sets the vacated bit positions to zero
+            (like PostgreSQL and like .NET for unsigned integers but not for signed integers).</para>
+            </remarks>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Equals(NpgsqlTypes.BitString)">
+            <summary>
+            Returns true if the this string is identical to the argument passed.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.CompareTo(NpgsqlTypes.BitString)">
+            <summary>
+            Compares two strings. Strings are compared as strings, so while 0 being less than 1 will
+            mean a comparison between two strings of the same size is the same as treating them as numbers,
+            in the case of two strings of differing lengths the comparison starts at the right-most (most significant)
+            bit, and if all bits of the shorter string are exhausted without finding a comparison, then the larger
+            string is deemed to be greater than the shorter (0010 is greater than 0001 but less than 00100).
+            </summary>
+            <param name="other">Another string to compare with this one.</param>
+            <returns>A value if the two strings are identical, an integer less
+            than zero if this is less than the argument, and an integer greater
+            than zero otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.CompareTo(System.Object)">
+            <summary>
+            Compares the string with another object.
+            </summary>
+            <param name="obj">The object to compare with.</param>
+            <returns>If the object is null then this string is considered greater. If the object is another BitString
+            then they are compared as in <see cref="!:CompareTo(Npgsql.BitString)">the explicit comparison for BitStrings</see>
+            in any other case a <see cref="T:System.ArgumentException"/> is thrown.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Equals(System.Object)">
+            <summary>
+            Compares this BitString with an object for equality.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.GetHashCode">
+            <summary>
+            Returns a code for use in hashing operations.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToString(System.String)">
+            <summary>
+            Returns a string representation of the BitString.
+            </summary>
+            <param name="format">
+            A string which can contain a letter and optionally a number which sets a minimum size for the string
+            returned. In each case using the lower-case form of the letter will result in a lower-case string
+            being returned.
+            <list type="table">
+            <item>
+            <term>B</term>
+            <description>A string of 1s and 0s.</description>
+            </item>
+            <item>
+            <term>X</term>
+            <description>An hexadecimal string (will result in an error unless the string's length is divisible by 4).</description>
+            </item>
+            <item>
+            <term>G</term>
+            <description>A string of 1s and 0s in single-quotes preceded by 'B' (Postgres bit string literal syntax).</description>
+            </item>
+            <term>Y</term>
+            <description>An hexadecimal string in single-quotes preceded by 'X' (Postgres bit literal syntax, will result in an error unless the string's length is divisible by 4.</description>
+            </list>
+            <term>C</term>
+            <description>The format produced by format-string "Y" if legal, otherwise that produced by format-string "G".</description>
+            <term>E</term>
+            <description>The most compact safe representation for Postgres. If single bit will be either a 0 or a 1. Otherwise if it
+            can be that produce by format string "Y" it will, otherwise if there are less than 9bits in length it will be that
+            produced by format-string "G". For longer strings that cannot be represented in hexadecimal it will be a string
+            representing the first part of the string in format "Y" followed by the PostgreSQL concatenation operator, followed
+            by the final bits in the format "G". E.g. "X'13DCE'||B'110'"</description>
+            If format is empty or null, it is treated as if "B" had been passed (the default repreesentation, and that
+            generally used by PostgreSQL for display).
+            </param>
+            <returns>The formatted string.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToString">
+            <summary>
+            Returns a string representation for the Bitstring
+            </summary>
+            <returns>A string containing '0' and '1' characters.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToString(System.String,System.IFormatProvider)">
+            <summary>
+            Returns the same string as <see cref="M:NpgsqlTypes.BitString.ToString(System.String)"/>. formatProvider is ignored.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Parse(System.String)">
+            <summary>
+            Parses a string to produce a BitString. Most formats that can be produced by
+            <see cref="M:NpgsqlTypes.BitString.ToString(System.String)"/> can be accepted, but hexadecimal
+            can be interpreted with the preceding X' to mark the following characters as
+            being hexadecimal rather than binary.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_BitwiseAnd(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Performs a logical AND on the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_BitwiseOr(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Performs a logcial OR on the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_ExclusiveOr(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Perofrms a logical EXCLUSIVE-OR on the two operands
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_OnesComplement(NpgsqlTypes.BitString)">
+            <summary>
+            Performs a logical NOT on the operand.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_Addition(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Concatenates the operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_LeftShift(NpgsqlTypes.BitString,System.Int32)">
+            <summary>
+            Left-shifts the string BitString.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_RightShift(NpgsqlTypes.BitString,System.Int32)">
+            <summary>
+            Right-shifts the string BitString.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_Equality(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Compares the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_Inequality(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Compares the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_LessThan(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Compares the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_GreaterThan(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Compares the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_LessThanOrEqual(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Compares the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_GreaterThanOrEqual(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Compares the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToString(System.Text.Encoding)">
+            <summary>
+            Interprets the bitstring as a series of bits in an encoded character string,
+            encoded according to the Encoding passed, and returns that string.
+            The bitstring must contain a whole number of octets(bytes) and also be
+            valid according to the Encoding passed.
+            </summary>
+            <param name="encoding">The <see cref="T:System.Text.Encoding"/> to use in producing the string.</param>
+            <returns>The string that was encoded in the BitString.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToByteEnumerable">
+            <summary>
+            Interprets the bitstring as a series of octets (bytes) and returns those octets. Fails
+            if the Bitstring does not contain a whole number of octets (its length is not evenly
+            divisible by 8).
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToSByteEnumerable">
+            <summary>
+            Interprets the bitstring as a series of signed octets (bytes) and returns those octets. Fails
+            if the Bitstring does not contain a whole number of octets (its length is not evenly
+            divisible by 8).
+            <remarks>This method is not CLS-Compliant and may not be available to languages that cannot
+            handle signed bytes.</remarks>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToUInt16Enumerable">
+            <summary>
+            Interprets the bitstring as a series of unsigned 16-bit integers and returns those integers.
+            Fails if the Bitstring's length is not evenly divisible by 16.
+            <remarks>This method is not CLS-Compliant and may not be available to languages that cannot
+            handle unsigned integers.</remarks>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToInt16Enumerable">
+            <summary>
+            Interprets the bitstring as a series of 16-bit integers and returns those integers.
+            Fails if the Bitstring's length is not evenly divisible by 16.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToUInt32Enumerable">
+            <summary>
+            Interprets the bitstring as a series of unsigned 32-bit integers and returns those integers.
+            Fails if the Bitstring's length is not evenly divisible by 32.
+            <remarks>This method is not CLS-Compliant and may not be available to languages that cannot
+            handle unsigned integers.</remarks>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToInt32Enumerable">
+            <summary>
+            Interprets the bitstring as a series of signed 32-bit integers and returns those integers.
+            Fails if the Bitstring's length is not evenly divisible by 32.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToUInt64Enumerable">
+            <summary>
+            Interprets the bitstring as a series of unsigned 64-bit integers and returns those integers.
+            Fails if the Bitstring's length is not evenly divisible by 64.
+            <remarks>This method is not CLS-Compliant and may not be available to languages that cannot
+            handle unsigned integers.</remarks>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToInt64Enumerable">
+            <summary>
+            Interprets the bitstring as a series of signed 64-bit integers and returns those integers.
+            Fails if the Bitstring's length is not evenly divisible by 64.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.BitString.Length">
+            <summary>
+            The length of the string.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.BitString.Item(System.Int32)">
+            <summary>
+            Retrieves the value of the bit at the given index.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlInterval">
+            <summary>
+            Represents the PostgreSQL interval datatype.
+            <remarks>PostgreSQL differs from .NET in how it's interval type doesn't assume 24 hours in a day
+            (to deal with 23- and 25-hour days caused by daylight savings adjustments) and has a concept
+            of months that doesn't exist in .NET's <see cref="T:System.TimeSpan"/> class. (Neither datatype
+            has any concessions for leap-seconds).
+            <para>For most uses just casting to and from TimeSpan will work correctly — in particular,
+            the results of subtracting one <see cref="T:System.DateTime"/> or the PostgreSQL date, time and
+            timestamp types from another should be the same whether you do so in .NET or PostgreSQL —
+            but if the handling of days and months in PostgreSQL is important to your application then you
+            should use this class instead of <see cref="T:System.TimeSpan"/>.</para>
+            <para>If you don't know whether these differences are important to your application, they
+            probably arent! Just use <see cref="T:System.TimeSpan"/> and do not use this class directly ☺</para>
+            <para>To avoid forcing unnecessary provider-specific concerns on users who need not be concerned
+            with them a call to <see cref="!:IDataRecord.GetValue(int)"/> on a field containing an
+            <see cref="T:NpgsqlTypes.NpgsqlInterval"/> value will return a <see cref="T:System.TimeSpan"/> rather than an
+            <see cref="T:NpgsqlTypes.NpgsqlInterval"/>. If you need the extra functionality of <see cref="T:NpgsqlTypes.NpgsqlInterval"/>
+            then use <see cref="M:Npgsql.NpgsqlDataReader.GetInterval(System.Int32)"/>.</para>
+            </remarks>
+            <seealso cref="P:NpgsqlTypes.NpgsqlInterval.Ticks"/>
+            <seealso cref="M:NpgsqlTypes.NpgsqlInterval.JustifyDays"/>
+            <seealso cref="M:NpgsqlTypes.NpgsqlInterval.JustifyMonths"/>
+            <seealso cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerMicrosecond">
+            <summary>
+            Represents the number of ticks (100ns periods) in one microsecond. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerMillsecond">
+            <summary>
+            Represents the number of ticks (100ns periods) in one millisecond. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerSecond">
+            <summary>
+            Represents the number of ticks (100ns periods) in one second. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerMinute">
+            <summary>
+            Represents the number of ticks (100ns periods) in one minute. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerHour">
+            <summary>
+            Represents the number of ticks (100ns periods) in one hour. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerDay">
+            <summary>
+            Represents the number of ticks (100ns periods) in one day. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.HoursPerDay">
+            <summary>
+            Represents the number of hours in one day (assuming no daylight savings adjustments). This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.DaysPerMonth">
+            <summary>
+            Represents the number of days assumed in one month if month justification or unjustifcation is performed.
+            This is set to 30 for consistency with PostgreSQL. Note that this is means that month adjustments cause
+            a year to be taken as 30 &#xd7; 12 = 360 rather than 356/366 days.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerMonth">
+            <summary>
+            Represents the number of ticks (100ns periods) in one day, assuming 30 days per month. <seealso cref="F:NpgsqlTypes.NpgsqlInterval.DaysPerMonth"/>
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.MonthsPerYear">
+            <summary>
+            Represents the number of months in a year. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.MaxValue">
+            <summary>
+            Represents the maximum <see cref="T:NpgsqlTypes.NpgsqlInterval"/>. This field is read-only.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.MinValue">
+            <summary>
+            Represents the minimum <see cref="T:NpgsqlTypes.NpgsqlInterval"/>. This field is read-only.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.Zero">
+            <summary>
+            Represents the zero <see cref="T:NpgsqlTypes.NpgsqlInterval"/>. This field is read-only.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.Int64)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to the specified number of ticks.
+            </summary>
+            <param name="ticks">A time period expressed in 100ns units.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.TimeSpan)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to hold the same time as a <see cref="T:System.TimeSpan"/>
+            </summary>
+            <param name="timespan">A time period expressed in a <see cref="T:System.TimeSpan"/></param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.Int32,System.Int32,System.Int64)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to the specified number of months, days
+            &amp; ticks.
+            </summary>
+            <param name="months">Number of months.</param>
+            <param name="days">Number of days.</param>
+            <param name="ticks">Number of 100ns units.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.Int32,System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to the specified number of
+            days, hours, minutes &amp; seconds.
+            </summary>
+            <param name="days">Number of days.</param>
+            <param name="hours">Number of hours.</param>
+            <param name="minutes">Number of minutes.</param>
+            <param name="seconds">Number of seconds.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to the specified number of
+            days, hours, minutes, seconds &amp; milliseconds.
+            </summary>
+            <param name="days">Number of days.</param>
+            <param name="hours">Number of hours.</param>
+            <param name="minutes">Number of minutes.</param>
+            <param name="seconds">Number of seconds.</param>
+            <param name="milliseconds">Number of milliseconds.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to the specified number of
+            months, days, hours, minutes, seconds &amp; milliseconds.
+            </summary>
+            <param name="months">Number of months.</param>
+            <param name="days">Number of days.</param>
+            <param name="hours">Number of hours.</param>
+            <param name="minutes">Number of minutes.</param>
+            <param name="seconds">Number of seconds.</param>
+            <param name="milliseconds">Number of milliseconds.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to the specified number of
+            years, months, days, hours, minutes, seconds &amp; milliseconds.
+            <para>Years are calculated exactly equivalent to 12 months.</para>
+            </summary>
+            <param name="years">Number of years.</param>
+            <param name="months">Number of months.</param>
+            <param name="days">Number of days.</param>
+            <param name="hours">Number of hours.</param>
+            <param name="minutes">Number of minutes.</param>
+            <param name="seconds">Number of seconds.</param>
+            <param name="milliseconds">Number of milliseconds.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromTicks(System.Int64)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of ticks.
+            </summary>
+            <param name="ticks">The number of ticks (100ns units) in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of ticks.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromMicroseconds(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of microseconds.
+            </summary>
+            <param name="ticks">The number of microseconds in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of microseconds.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromMilliseconds(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of milliseconds.
+            </summary>
+            <param name="ticks">The number of milliseconds in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of milliseconds.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromSeconds(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of seconds.
+            </summary>
+            <param name="ticks">The number of seconds in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of seconds.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromMinutes(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of minutes.
+            </summary>
+            <param name="ticks">The number of minutes in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of minutes.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromHours(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of hours.
+            </summary>
+            <param name="ticks">The number of hours in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of hours.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromDays(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of days.
+            </summary>
+            <param name="ticks">The number of days in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of days.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromMonths(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of months.
+            </summary>
+            <param name="ticks">The number of months in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of months.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Add(NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Adds another interval to this instance and returns the result.
+            </summary>
+            <param name="interval">An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to add to this instance.</param>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"></see> whose values are the sums of the two instances.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Subtract(NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Subtracts another interval from this instance and returns the result.
+            </summary>
+            <param name="interval">An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to subtract from this instance.</param>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"></see> whose values are the differences of the two instances.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Negate">
+            <summary>
+            Returns an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> whose value is the negated value of this instance.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> whose value is the negated value of this instance.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Duration">
+            <summary>
+            This absolute value of this instance. In the case of some, but not all, components being negative,
+            the rules used for justification are used to determine if the instance is positive or negative.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> whose value is the absolute value of this instance.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.JustifyDays">
+            <summary>
+            Equivalent to PostgreSQL's justify_days function.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> based on this one, but with any hours outside of the range [-23, 23]
+            converted into days.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.UnjustifyDays">
+            <summary>
+            Opposite to PostgreSQL's justify_days function.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> based on this one, but with any days converted to multiples of ±24hours.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.JustifyMonths">
+            <summary>
+            Equivalent to PostgreSQL's justify_months function.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> based on this one, but with any days outside of the range [-30, 30]
+            converted into months.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.UnjustifyMonths">
+            <summary>
+            Opposite to PostgreSQL's justify_months function.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> based on this one, but with any months converted to multiples of ±30days.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.JustifyInterval">
+            <summary>
+            Equivalent to PostgreSQL's justify_interval function.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> based on this one,
+            but with any months converted to multiples of ±30days
+            and then with any days converted to multiples of ±24hours</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.UnjustifyInterval">
+            <summary>
+            Opposite to PostgreSQL's justify_interval function.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> based on this one, but with any months converted to multiples of ±30days and then any days converted to multiples of ±24hours;</returns>
+        </member>
+        <!-- Badly formed XML comment ignored for member "M:NpgsqlTypes.NpgsqlInterval.Canonicalize" -->
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_Implicit(System.TimeSpan)~NpgsqlTypes.NpgsqlInterval">
+            <summary>
+            Implicit cast of a <see cref="T:System.TimeSpan"/> to an <see cref="T:NpgsqlTypes.NpgsqlInterval"/>
+            </summary>
+            <param name="timespan">A <see cref="T:System.TimeSpan"/></param>
+            <returns>An eqivalent, canonical, <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_Explicit(NpgsqlTypes.NpgsqlInterval)~System.TimeSpan">
+            <summary>
+            Implicit cast of an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to a <see cref="T:System.TimeSpan"/>.
+            </summary>
+            <param name="interval">A <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</param>
+            <returns>An equivalent <see cref="T:System.TimeSpan"/>.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Equals(NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Returns true if another <see cref="T:NpgsqlTypes.NpgsqlInterval"/> is exactly the same as this instance.
+            </summary>
+            <param name="other">An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> for comparison.</param>
+            <returns>true if the two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instances are exactly the same,
+            false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Equals(System.Object)">
+            <summary>
+            Returns true if another object is an <see cref="T:NpgsqlTypes.NpgsqlInterval"/>, that is exactly the same as
+            this instance
+            </summary>
+            <param name="obj">An <see cref="T:System.Object"/> for comparison.</param>
+            <returns>true if the argument is an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> and is exactly the same
+            as this one, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Compare(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Compares two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instances.
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</param>
+            <returns>0 if the two are equal or equivalent. A value greater than zero if x is greater than y,
+            a value less than zero if x is less than y.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.GetHashCode">
+            <summary>
+            A hash code suitable for uses with hashing algorithms.
+            </summary>
+            <returns>An signed integer.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.CompareTo(NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Compares this instance with another/
+            </summary>
+            <param name="other">An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare this with.</param>
+            <returns>0 if the instances are equal or equivalent. A value less than zero if
+            this instance is less than the argument. A value greater than zero if this instance
+            is greater than the instance.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.CompareTo(System.Object)">
+            <summary>
+            Compares this instance with another/
+            </summary>
+            <param name="other">An object to compare this with.</param>
+            <returns>0 if the argument is an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> and the instances are equal or equivalent.
+            A value less than zero if the argument is an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> and
+            this instance is less than the argument.
+            A value greater than zero if the argument is an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> and this instance
+            is greater than the instance.</returns>
+            A value greater than zero if the argument is null.
+            <exception cref="T:System.ArgumentException">The argument is not an <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</exception>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Parse(System.String)">
+            <summary>
+            Parses a <see cref="T:System.String"/> and returns a <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instance.
+            Designed to use the formats generally returned by PostgreSQL.
+            </summary>
+            <param name="str">The <see cref="T:System.String"/> to parse.</param>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> represented by the argument.</returns>
+            <exception cref="T:System.ArgumentNullException">The string was null.</exception>
+            <exception cref="T:System.OverflowException">A value obtained from parsing the string exceeded the values allowed for the relevant component.</exception>
+            <exception cref="T:System.FormatException">The string was not in a format that could be parsed to produce an <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</exception>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.TryParse(System.String,NpgsqlTypes.NpgsqlInterval@)">
+            <summary>
+            Attempt to parse a <see cref="T:System.String"/> to produce an <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.
+            </summary>
+            <param name="str">The <see cref="T:System.String"/> to parse.</param>
+            <param name="result">(out) The <see cref="T:NpgsqlTypes.NpgsqlInterval"/> produced, or <see cref="F:NpgsqlTypes.NpgsqlInterval.Zero"/> if the parsing failed.</param>
+            <returns>true if the parsing succeeded, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.ToString">
+            <summary>
+            Create a <see cref="T:System.String"/> representation of the <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instance.
+            The format returned is of the form:
+            [M mon[s]] [d day[s]] [HH:mm:ss[.f[f[f[f[f[f[f[f[f]]]]]]]]]]
+            A zero <see cref="T:NpgsqlTypes.NpgsqlInterval"/> is represented as 00:00:00
+            <remarks>
+            Ticks are 100ns, Postgress resolution is only to 1µs at most. Hence we lose 1 or more decimal
+            precision in storing values in the database. Despite this, this method will output that extra
+            digit of precision. It's forward-compatible with any future increases in resolution up to 100ns,
+            and also makes this ToString() more applicable to any other use-case.
+            </remarks>
+            </summary>
+            <returns>The <see cref="T:System.String"/> representation.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_Addition(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Adds two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> together.
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to add.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to add.</param>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> whose values are the sum of the arguments.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_Subtraction(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Subtracts one <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from another.
+            </summary>
+            <param name="x">The <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to subtract the other from.</param>
+            <param name="y">The <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to subtract from the other.</param>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> whose values are the difference of the arguments</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_Equality(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Returns true if two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> are exactly the same.
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <returns>true if the two arguments are exactly the same, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_Inequality(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Returns false if two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> are exactly the same.
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <returns>false if the two arguments are exactly the same, true otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_LessThan(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Compares two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instances to see if the first is less than the second
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <returns>true if the first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> is less than second, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_LessThanOrEqual(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Compares two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instances to see if the first is less than or equivalent to the second
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <returns>true if the first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> is less than or equivalent to second, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_GreaterThan(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Compares two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instances to see if the first is greater than the second
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <returns>true if the first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> is greater than second, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_GreaterThanOrEqual(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Compares two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instances to see if the first is greater than or equivalent the second
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <returns>true if the first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> is greater than or equivalent to the second, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_UnaryPlus(NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Returns the instance.
+            </summary>
+            <param name="x">An <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</param>
+            <returns>The argument.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_UnaryNegation(NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Negates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instance.
+            </summary>
+            <param name="x">An <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</param>
+            <returns>The negation of the argument.</returns>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Ticks">
+            <summary>
+            The total number of ticks(100ns units) contained. This is the resolution of the
+            <see cref="T:NpgsqlTypes.NpgsqlInterval"/>  type. This ignores the number of days and
+            months held. If you want them included use <see cref="M:NpgsqlTypes.NpgsqlInterval.UnjustifyInterval"/> first.
+            <remarks>The resolution of the PostgreSQL
+            interval type is by default 1µs = 1,000 ns. It may be smaller as follows:
+            <list type="number">
+            <item>
+            <term>interval(0)</term>
+            <description>resolution of 1s (1 second)</description>
+            </item>
+            <item>
+            <term>interval(1)</term>
+            <description>resolution of 100ms = 0.1s (100 milliseconds)</description>
+            </item>
+            <item>
+            <term>interval(2)</term>
+            <description>resolution of 10ms = 0.01s (10 milliseconds)</description>
+            </item>
+            <item>
+            <term>interval(3)</term>
+            <description>resolution of 1ms = 0.001s (1 millisecond)</description>
+            </item>
+            <item>
+            <term>interval(4)</term>
+            <description>resolution of 100µs = 0.0001s (100 microseconds)</description>
+            </item>
+            <item>
+            <term>interval(5)</term>
+            <description>resolution of 10µs = 0.00001s (10 microseconds)</description>
+            </item>
+            <item>
+            <term>interval(6) or interval</term>
+            <description>resolution of 1µs = 0.000001s (1 microsecond)</description>
+            </item>
+            </list>
+            <para>As such, if the 100-nanosecond resolution is significant to an application, a PostgreSQL interval will
+            not suffice for those purposes.</para>
+            <para>In more frequent cases though, the resolution of the interval suffices.
+            <see cref="T:NpgsqlTypes.NpgsqlInterval"/> will always suffice to handle the resolution of any interval value, and upon
+            writing to the database, will be rounded to the resolution used.</para>
+            </remarks>
+            <returns>The number of ticks in the instance.</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Microseconds">
+            <summary>
+            Gets the number of whole microseconds held in the instance.
+            <returns>An  in the range [-999999, 999999].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Milliseconds">
+            <summary>
+            Gets the number of whole milliseconds held in the instance.
+            <returns>An  in the range [-999, 999].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Seconds">
+            <summary>
+            Gets the number of whole seconds held in the instance.
+            <returns>An  in the range [-59, 59].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Minutes">
+            <summary>
+            Gets the number of whole minutes held in the instance.
+            <returns>An  in the range [-59, 59].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Hours">
+            <summary>
+            Gets the number of whole hours held in the instance.
+            <remarks>Note that this can be less than -23 or greater than 23 unless <see cref="M:NpgsqlTypes.NpgsqlInterval.JustifyDays"/>
+            has been used to produce this instance.</remarks>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Days">
+            <summary>
+            Gets the number of days held in the instance.
+            <remarks>Note that this does not pay attention to a time component with -24 or less hours or
+            24 or more hours, unless <see cref="M:NpgsqlTypes.NpgsqlInterval.JustifyDays"/> has been called to produce this instance.</remarks>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Months">
+            <summary>
+            Gets the number of months held in the instance.
+            <remarks>Note that this does not pay attention to a day component with -30 or less days or
+            30 or more days, unless <see cref="M:NpgsqlTypes.NpgsqlInterval.JustifyMonths"/> has been called to produce this instance.</remarks>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Time">
+            <summary>
+            Returns a <see cref="T:System.TimeSpan"/> representing the time component of the instance.
+            <remarks>Note that this may have a value beyond the range ±23:59:59.9999999 unless
+            <see cref="M:NpgsqlTypes.NpgsqlInterval.JustifyDays"/> has been called to produce this instance.</remarks>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalTicks">
+            <summary>
+            The total number of ticks (100ns units) in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalMicroseconds">
+            <summary>
+            The total number of microseconds in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalMilliseconds">
+            <summary>
+            The total number of milliseconds in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalSeconds">
+            <summary>
+            The total number of seconds in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalMinutes">
+            <summary>
+            The total number of minutes in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalHours">
+            <summary>
+            The total number of hours in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalDays">
+            <summary>
+            The total number of days in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalMonths">
+            <summary>
+            The total number of months in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTime.Normalize">
+            <summary>
+            Normalise this time; if it is 24:00:00, convert it to 00:00:00
+            </summary>
+            <returns>This time, normalised</returns>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTime.Ticks">
+            <summary>
+            The total number of ticks(100ns units) contained. This is the resolution of the
+            <see cref="T:NpgsqlTypes.NpgsqlTime"/>  type.
+            <remarks>The resolution of the PostgreSQL
+            interval type is by default 1µs = 1,000 ns. It may be smaller as follows:
+            <list type="number">
+            <item>
+            <term>time(0)</term>
+            <description>resolution of 1s (1 second)</description>
+            </item>
+            <item>
+            <term>time(1)</term>
+            <description>resolution of 100ms = 0.1s (100 milliseconds)</description>
+            </item>
+            <item>
+            <term>time(2)</term>
+            <description>resolution of 10ms = 0.01s (10 milliseconds)</description>
+            </item>
+            <item>
+            <term>time(3)</term>
+            <description>resolution of 1ms = 0.001s (1 millisecond)</description>
+            </item>
+            <item>
+            <term>time(4)</term>
+            <description>resolution of 100µs = 0.0001s (100 microseconds)</description>
+            </item>
+            <item>
+            <term>time(5)</term>
+            <description>resolution of 10µs = 0.00001s (10 microseconds)</description>
+            </item>
+            <item>
+            <term>time(6) or interval</term>
+            <description>resolution of 1µs = 0.000001s (1 microsecond)</description>
+            </item>
+            </list>
+            <para>As such, if the 100-nanosecond resolution is significant to an application, a PostgreSQL time will
+            not suffice for those purposes.</para>
+            <para>In more frequent cases though, the resolution of time suffices.
+            <see cref="T:NpgsqlTypes.NpgsqlTime"/> will always suffice to handle the resolution of any time value, and upon
+            writing to the database, will be rounded to the resolution used.</para>
+            </remarks>
+            <returns>The number of ticks in the instance.</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTime.Microseconds">
+            <summary>
+            Gets the number of whole microseconds held in the instance.
+            <returns>An integer in the range [0, 999999].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTime.Milliseconds">
+            <summary>
+            Gets the number of whole milliseconds held in the instance.
+            <returns>An integer in the range [0, 999].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTime.Seconds">
+            <summary>
+            Gets the number of whole seconds held in the instance.
+            <returns>An interger in the range [0, 59].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTime.Minutes">
+            <summary>
+            Gets the number of whole minutes held in the instance.
+            <returns>An integer in the range [0, 59].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTime.Hours">
+            <summary>
+            Gets the number of whole hours held in the instance.
+            <remarks>Note that the time 24:00:00 can be stored for roundtrip compatibility. Any calculations on such a
+            value will normalised it to 00:00:00.</remarks>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTimeTZ.Normalize">
+            <summary>
+            Normalise this time; if it is 24:00:00, convert it to 00:00:00
+            </summary>
+            <returns>This time, normalised</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTimeTZ.CompareTo(NpgsqlTypes.NpgsqlTimeTZ)">
+            <summary>
+            Compares this with another <see cref="T:NpgsqlTypes.NpgsqlTimeTZ"/>. As per postgres' rules,
+            first the times are compared as if they were both in the same timezone. If they are equal then
+            then timezones are compared (+01:00 being "smaller" than -01:00).
+            </summary>
+            <param name="other">the <see cref="T:NpgsqlTypes.NpgsqlTimeTZ"/> to compare with.</param>
+            <returns>An integer which is 0 if they are equal, &lt; 0 if this is the smaller and &gt; 0 if this is the larger.</returns>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTimeTZ.Microseconds">
+            <summary>
+            Gets the number of whole microseconds held in the instance.
+            <returns>An integer in the range [0, 999999].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTimeTZ.Milliseconds">
+            <summary>
+            Gets the number of whole milliseconds held in the instance.
+            <returns>An integer in the range [0, 999].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTimeTZ.Seconds">
+            <summary>
+            Gets the number of whole seconds held in the instance.
+            <returns>An interger in the range [0, 59].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTimeTZ.Minutes">
+            <summary>
+            Gets the number of whole minutes held in the instance.
+            <returns>An integer in the range [0, 59].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTimeTZ.Hours">
+            <summary>
+            Gets the number of whole hours held in the instance.
+            <remarks>Note that the time 24:00:00 can be stored for roundtrip compatibility. Any calculations on such a
+            value will normalised it to 00:00:00.</remarks>
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.LargeObjectManager">
+            <summary>
+            Summary description for LargeObjectManager.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.BasicBackendToNativeTypeConverter">
+            <summary>
+            Provide event handlers to convert all native supported basic data types from their backend
+            text representation to a .NET object.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToBinary(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Binary data.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToBoolean(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql boolean to a System.Boolean.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToBit(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql bit to a System.Boolean.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToDateTime(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql datetime to a System.DateTime.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToDate(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql date to a System.DateTime.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToTime(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql time to a System.DateTime.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToMoney(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql money to a System.Decimal.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.BasicNativeToBackendTypeConverter">
+            <summary>
+            Provide event handlers to convert the basic native supported data types from
+            native form to backend representation.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToBinary(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Binary data.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToBoolean(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgresql boolean.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToBit(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgresql bit.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToDateTime(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgresql timestamp.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToDate(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgresql date.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToTime(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgresql time.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToMoney(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgres money.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToSingleDouble(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgres double with maximum precision.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.ExtendedBackendToNativeTypeConverter">
+            <summary>
+            Provide event handlers to convert extended native supported data types from their backend
+            text representation to a .NET object.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToPoint(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql point to a System.NpgsqlPoint.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToBox(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql point to a System.RectangleF.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToLSeg(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            LDeg.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToPath(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Path.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToPolygon(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Polygon.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToCircle(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Circle.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToInet(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Inet.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToMacAddress(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            MAC Address.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToInterval(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            interval
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.ExtendedNativeToBackendTypeConverter">
+            <summary>
+            Provide event handlers to convert extended native supported data types from
+            native form to backend representation.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToPoint(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Point.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToBox(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Box.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToLSeg(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            LSeg.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToPath(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Open path.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToPolygon(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Polygon.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToMacAddress(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgres MAC Address.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToCircle(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Circle.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToIPAddress(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgres inet.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToInterval(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgres interval
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlPoint">
+            <summary>
+            Represents a PostgreSQL Point type
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlLSeg">
+            <summary>
+            Represents a PostgreSQL Line Segment type.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlPath">
+            <summary>
+            Represents a PostgreSQL Path type.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlPolygon">
+            <summary>
+            Represents a PostgreSQL Polygon type.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlCircle">
+            <summary>
+            Represents a PostgreSQL Circle type.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlInet">
+            <summary>
+            Represents a PostgreSQL inet type.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlMacAddress">
+            <summary>
+            Represents a PostgreSQL MacAddress type.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlMacAddress.#ctor(System.String)">
+            <summary>
+            
+            </summary>
+            <param name="macAddr">The macAddr parameter must contain a string that can only consist of numbers
+            and upper-case letters as hexadecimal digits. (See PhysicalAddress.Parse method on MSDN)</param>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlTypesHelper">
+            <summary>
+            This class contains helper methods for type conversion between
+            the .Net type system and postgresql.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlTypesHelper.BackendTypeMappingCache">
+            <summary>
+            A cache of basic datatype mappings keyed by server version.  This way we don't
+            have to load the basic type mappings for every connection.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.TryGetBackendTypeInfo(System.String,NpgsqlTypes.NpgsqlBackendTypeInfo@)">
+            <summary>
+            Find a NpgsqlNativeTypeInfo in the default types map that can handle objects
+            of the given NpgsqlDbType.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.TryGetNativeTypeInfo(NpgsqlTypes.NpgsqlDbType,NpgsqlTypes.NpgsqlNativeTypeInfo@)">
+            <summary>
+            Find a NpgsqlNativeTypeInfo in the default types map that can handle objects
+            of the given NpgsqlDbType.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.TryGetNativeTypeInfo(System.Data.DbType,NpgsqlTypes.NpgsqlNativeTypeInfo@)">
+            <summary>
+            Find a NpgsqlNativeTypeInfo in the default types map that can handle objects
+            of the given DbType.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.TryGetNativeTypeInfo(System.Type,NpgsqlTypes.NpgsqlNativeTypeInfo@)">
+            <summary>
+            Find a NpgsqlNativeTypeInfo in the default types map that can handle objects
+            of the given System.Type.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.ConvertBackendStringToSystemType(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+             This method is responsible to convert the string received from the backend
+             to the corresponding NpgsqlType.
+             The given TypeInfo is called upon to do the conversion.
+             If no TypeInfo object is provided, no conversion is performed.
+             </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.PrepareDefaultTypesMap">
+            <summary>
+            Create the one and only native to backend type map.
+            This map is used when formatting native data
+            types to backend representations.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.CreateAndLoadInitialTypesMapping(Npgsql.NpgsqlConnector)">
+            <summary>
+             This method creates (or retrieves from cache) a mapping between type and OID 
+             of all natively supported postgresql data types.
+             This is needed as from one version to another, this mapping can be changed and
+             so we avoid hardcoding them.
+             </summary>
+             <returns>NpgsqlTypeMapping containing all known data types.  The mapping must be
+             cloned before it is modified because it is cached; changes made by one connection may
+             effect another connection.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.LoadTypesMappings(Npgsql.NpgsqlConnector,NpgsqlTypes.NpgsqlBackendTypeMapping,System.Collections.Generic.IEnumerable{NpgsqlTypes.NpgsqlBackendTypeInfo})">
+            <summary>
+            Attempt to map types by issuing a query against pg_type.
+            This function takes a list of NpgsqlTypeInfo and attempts to resolve the OID field
+            of each by querying pg_type.  If the mapping is found, the type info object is
+            updated (OID) and added to the provided NpgsqlTypeMapping object.
+            </summary>
+            <param name="conn">NpgsqlConnector to send query through.</param>
+            <param name="TypeMappings">Mapping object to add types too.</param>
+            <param name="TypeInfoList">List of types that need to have OID's mapped.</param>
+        </member>
+        <member name="T:NpgsqlTypes.ConvertBackendToNativeHandler">
+            <summary>
+            Delegate called to convert the given backend data to its native representation.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.ConvertNativeToBackendHandler">
+            <summary>
+            Delegate called to convert the given native data to its backand representation.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlBackendTypeInfo">
+            <summary>
+            Represents a backend data type.
+            This class can be called upon to convert a backend field representation to a native object.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeInfo.#ctor(System.Int32,System.String,NpgsqlTypes.NpgsqlDbType,System.Data.DbType,System.Type,NpgsqlTypes.ConvertBackendToNativeHandler)">
+            <summary>
+            Construct a new NpgsqlTypeInfo with the given attributes and conversion handlers.
+            </summary>
+            <param name="OID">Type OID provided by the backend server.</param>
+            <param name="Name">Type name provided by the backend server.</param>
+            <param name="NpgsqlDbType">NpgsqlDbType</param>
+            <param name="Type">System type to convert fields of this type to.</param>
+            <param name="ConvertBackendToNative">Data conversion handler.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeInfo.ConvertToNative(System.String,System.Int16,System.Int32)">
+            <summary>
+            Perform a data conversion from a backend representation to 
+            a native object.
+            </summary>
+            <param name="BackendData">Data sent from the backend.</param>
+            <param name="TypeModifier">Type modifier field sent from the backend.</param>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeInfo.OID">
+            <summary>
+            Type OID provided by the backend server.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeInfo.Name">
+            <summary>
+            Type name provided by the backend server.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeInfo.NpgsqlDbType">
+            <summary>
+            NpgsqlDbType.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeInfo.DbType">
+            <summary>
+            NpgsqlDbType.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeInfo.Type">
+            <summary>
+            Provider type to convert fields of this type to.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeInfo.FrameworkType">
+            <summary>
+            System type to convert fields of this type to.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlNativeTypeInfo">
+            <summary>
+            Represents a backend data type.
+            This class can be called upon to convert a native object to its backend field representation,
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeInfo.ArrayOf(NpgsqlTypes.NpgsqlNativeTypeInfo)">
+            <summary>
+            Returns an NpgsqlNativeTypeInfo for an array where the elements are of the type
+            described by the NpgsqlNativeTypeInfo supplied.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeInfo.#ctor(System.String,NpgsqlTypes.NpgsqlDbType,System.Data.DbType,System.Boolean,NpgsqlTypes.ConvertNativeToBackendHandler)">
+            <summary>
+            Construct a new NpgsqlTypeInfo with the given attributes and conversion handlers.
+            </summary>
+            <param name="Name">Type name provided by the backend server.</param>
+            <param name="NpgsqlDbType">NpgsqlDbType</param>
+            <param name="ConvertNativeToBackend">Data conversion handler.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeInfo.ConvertToBackend(System.Object,System.Boolean)">
+            <summary>
+            Perform a data conversion from a native object to
+            a backend representation.
+            DBNull and null values are handled differently depending if a plain query is used
+            When 
+            </summary>
+            <param name="NativeData">Native .NET object to be converted.</param>
+            <param name="ForExtendedQuery">Flag indicating if the conversion has to be done for 
+            plain queries or extended queries</param>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlNativeTypeInfo.Name">
+            <summary>
+            Type name provided by the backend server.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlNativeTypeInfo.NpgsqlDbType">
+            <summary>
+            NpgsqlDbType.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlNativeTypeInfo.DbType">
+            <summary>
+            DbType.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlNativeTypeInfo.Quote">
+            <summary>
+            Apply quoting.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlNativeTypeInfo.UseSize">
+            <summary>
+            Use parameter size information.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlBackendTypeMapping">
+            <summary>
+            Provide mapping between type OID, type name, and a NpgsqlBackendTypeInfo object that represents it.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.#ctor">
+            <summary>
+            Construct an empty mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.#ctor(NpgsqlTypes.NpgsqlBackendTypeMapping)">
+            <summary>
+            Copy constuctor.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.AddType(NpgsqlTypes.NpgsqlBackendTypeInfo)">
+            <summary>
+            Add the given NpgsqlBackendTypeInfo to this mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.AddType(System.Int32,System.String,NpgsqlTypes.NpgsqlDbType,System.Data.DbType,System.Type,NpgsqlTypes.ConvertBackendToNativeHandler)">
+            <summary>
+            Add a new NpgsqlBackendTypeInfo with the given attributes and conversion handlers to this mapping.
+            </summary>
+            <param name="OID">Type OID provided by the backend server.</param>
+            <param name="Name">Type name provided by the backend server.</param>
+            <param name="NpgsqlDbType">NpgsqlDbType</param>
+            <param name="Type">System type to convert fields of this type to.</param>
+            <param name="BackendConvert">Data conversion handler.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.Clone">
+            <summary>
+            Make a shallow copy of this type mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.ContainsOID(System.Int32)">
+            <summary>
+            Determine if a NpgsqlBackendTypeInfo with the given backend type OID exists in this mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.ContainsName(System.String)">
+            <summary>
+            Determine if a NpgsqlBackendTypeInfo with the given backend type name exists in this mapping.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeMapping.Count">
+            <summary>
+            Get the number of type infos held.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeMapping.Item(System.Int32)">
+            <summary>
+            Retrieve the NpgsqlBackendTypeInfo with the given backend type OID, or null if none found.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeMapping.Item(System.String)">
+            <summary>
+            Retrieve the NpgsqlBackendTypeInfo with the given backend type name, or null if none found.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlNativeTypeMapping">
+            <summary>
+            Provide mapping between type Type, NpgsqlDbType and a NpgsqlNativeTypeInfo object that represents it.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.AddType(NpgsqlTypes.NpgsqlNativeTypeInfo)">
+            <summary>
+            Add the given NpgsqlNativeTypeInfo to this mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.AddType(System.String,NpgsqlTypes.NpgsqlDbType,System.Data.DbType,System.Boolean,NpgsqlTypes.ConvertNativeToBackendHandler)">
+            <summary>
+            Add a new NpgsqlNativeTypeInfo with the given attributes and conversion handlers to this mapping.
+            </summary>
+            <param name="Name">Type name provided by the backend server.</param>
+            <param name="NpgsqlDbType">NpgsqlDbType</param>
+            <param name="NativeConvert">Data conversion handler.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.TryGetValue(NpgsqlTypes.NpgsqlDbType,NpgsqlTypes.NpgsqlNativeTypeInfo@)">
+            <summary>
+            Retrieve the NpgsqlNativeTypeInfo with the given NpgsqlDbType.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.TryGetValue(System.Data.DbType,NpgsqlTypes.NpgsqlNativeTypeInfo@)">
+            <summary>
+            Retrieve the NpgsqlNativeTypeInfo with the given DbType.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.TryGetValue(System.Type,NpgsqlTypes.NpgsqlNativeTypeInfo@)">
+            <summary>
+            Retrieve the NpgsqlNativeTypeInfo with the given Type.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.ContainsName(System.String)">
+            <summary>
+            Determine if a NpgsqlNativeTypeInfo with the given backend type name exists in this mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.ContainsNpgsqlDbType(NpgsqlTypes.NpgsqlDbType)">
+            <summary>
+            Determine if a NpgsqlNativeTypeInfo with the given NpgsqlDbType exists in this mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.ContainsType(System.Type)">
+            <summary>
+            Determine if a NpgsqlNativeTypeInfo with the given Type name exists in this mapping.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlNativeTypeMapping.Count">
+            <summary>
+            Get the number of type infos held.
+            </summary>
+        </member>
+        <member name="M:Npgsql.SqlGenerators.SqlBaseGenerator.GetColumnsForJoin(Npgsql.SqlGenerators.JoinExpression,Npgsql.SqlGenerators.ProjectionExpression,Npgsql.SqlGenerators.VisitedExpression)">
+            <summary>
+            Given a join expression and a projection, fetch all columns in the projection
+            that reference columns in the join.
+            </summary>
+        </member>
+        <member name="M:Npgsql.SqlGenerators.SqlBaseGenerator.GetFromNames(Npgsql.SqlGenerators.InputExpression,System.Collections.Generic.List{System.String})">
+            <summary>
+            Given an InputExpression append all from names (including nested joins) to the list.
+            </summary>
+        </member>
+        <member name="M:Npgsql.SqlGenerators.SqlBaseGenerator.GetReplacementColumn(Npgsql.SqlGenerators.JoinExpression,Npgsql.SqlGenerators.ColumnExpression)">
+            <summary>
+            Get new ColumnExpression that will be used in projection that had it's existing columns moved.
+            These should be simple references to the inner column
+            </summary>
+        </member>
+        <member name="M:Npgsql.SqlGenerators.SqlBaseGenerator.AdjustPropertyAccess(Npgsql.SqlGenerators.ColumnExpression[],System.String)">
+            <summary>
+            Every property accessed in the list of columns must be adjusted for a new scope
+            </summary>
+        </member>
+        <member name="P:Npgsql.Cache`1.CacheSize">
+            <summary>
+            Set Cache Size. The default value is 20.
+            </summary>
+        </member>
+        <member name="P:Npgsql.Cache`1.Item(System.String)">
+            <summary>
+            Lookup cached entity. null will returned if not match.
+            For both get{} and set{} apply LRU rule.
+            </summary>
+            <param name="key">key</param>
+            <returns></returns>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.#ctor">
+            <summary>
+            Called from constructor of derived class.
+            </summary>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.Finalize">
+            <summary>
+            Finalizer for HashAlgorithm
+            </summary>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.ComputeHash(System.Byte[])">
+            <summary>
+            Computes the entire hash of all the bytes in the byte array.
+            </summary>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.HashCore(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            When overridden in a derived class, drives the hashing function.
+            </summary>
+            <param name="rgb"></param>
+            <param name="start"></param>
+            <param name="size"></param>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.HashFinal">
+            <summary>
+            When overridden in a derived class, this pads and hashes whatever data might be left in the buffers and then returns the hash created.
+            </summary>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.Initialize">
+            <summary>
+            When overridden in a derived class, initializes the object to prepare for hashing.
+            </summary>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.TransformBlock(System.Byte[],System.Int32,System.Int32,System.Byte[],System.Int32)">
+            <summary>
+            Used for stream chaining.  Computes hash as data passes through it.
+            </summary>
+            <param name="inputBuffer">The buffer from which to grab the data to be copied.</param>
+            <param name="inputOffset">The offset into the input buffer to start reading at.</param>
+            <param name="inputCount">The number of bytes to be copied.</param>
+            <param name="outputBuffer">The buffer to write the copied data to.</param>
+            <param name="outputOffset">At what point in the outputBuffer to write the data at.</param>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.TransformFinalBlock(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Used for stream chaining.  Computes hash as data passes through it.  Finishes off the hash.
+            </summary>
+            <param name="inputBuffer">The buffer from which to grab the data to be copied.</param>
+            <param name="inputOffset">The offset into the input buffer to start reading at.</param>
+            <param name="inputCount">The number of bytes to be copied.</param>
+        </member>
+        <member name="P:Npgsql.HashAlgorithm.CanTransformMultipleBlocks">
+            <summary>
+            Get whether or not the hash can transform multiple blocks at a time.
+            Note: MUST be overriden if descendant can transform multiple block
+            on a single call!
+            </summary>
+        </member>
+        <member name="P:Npgsql.HashAlgorithm.Hash">
+            <summary>
+            Gets the previously computed hash.
+            </summary>
+        </member>
+        <member name="P:Npgsql.HashAlgorithm.HashSize">
+            <summary>
+            Returns the size in bits of the hash.
+            </summary>
+        </member>
+        <member name="P:Npgsql.HashAlgorithm.InputBlockSize">
+            <summary>
+            Must be overriden if not 1
+            </summary>
+        </member>
+        <member name="P:Npgsql.HashAlgorithm.OutputBlockSize">
+            <summary>
+            Must be overriden if not 1
+            </summary>
+        </member>
+        <member name="T:Npgsql.MD5">
+            <summary>
+            Common base class for all derived MD5 implementations.
+            </summary>
+        </member>
+        <member name="M:Npgsql.MD5.#ctor">
+            <summary>
+            Called from constructor of derived class.
+            </summary>
+        </member>
+        <member name="M:Npgsql.MD5.Create">
+            <summary>
+            Creates the default derived class.
+            </summary>
+        </member>
+        <member name="T:Npgsql.MD5CryptoServiceProvider">
+            <summary>
+            C# implementation of the MD5 cryptographic hash function.
+            </summary>
+        </member>
+        <member name="M:Npgsql.MD5CryptoServiceProvider.#ctor">
+            <summary>
+            Creates a new MD5CryptoServiceProvider.
+            </summary>
+        </member>
+        <member name="M:Npgsql.MD5CryptoServiceProvider.HashCore(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Drives the hashing function.
+            </summary>
+            <param name="rgb">Byte array containing the data to hash.</param>
+            <param name="start">Where in the input buffer to start.</param>
+            <param name="size">Size in bytes of the data in the buffer to hash.</param>
+        </member>
+        <member name="M:Npgsql.MD5CryptoServiceProvider.HashFinal">
+            <summary>
+            This finalizes the hash.  Takes the data from the chaining variables and returns it.
+            </summary>
+        </member>
+        <member name="M:Npgsql.MD5CryptoServiceProvider.Initialize">
+            <summary>
+            Resets the class after use.  Called automatically after hashing is done.
+            </summary>
+        </member>
+        <member name="M:Npgsql.MD5CryptoServiceProvider.ProcessBlock(System.Byte[],System.Int32)">
+            <summary>
+            This is the meat of the hash function.  It is what processes each block one at a time.
+            </summary>
+            <param name="inputBuffer">Byte array to process data from.</param>
+            <param name="inputOffset">Where in the byte array to start processing.</param>
+        </member>
+        <member name="M:Npgsql.MD5CryptoServiceProvider.ProcessFinalBlock(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Pads and then processes the final block.
+            </summary>
+            <param name="inputBuffer">Buffer to grab data from.</param>
+            <param name="inputOffset">Position in buffer in bytes to get data from.</param>
+            <param name="inputCount">How much data in bytes in the buffer to use.</param>
+        </member>
+        <member name="T:Npgsql.StringRowReaderV3">
+            <summary>
+            Implements <see cref="T:Npgsql.RowReader"/> for version 3 of the protocol.
+            </summary>
+        </member>
+        <member name="T:Npgsql.RowReader">
+            <summary>
+            Reads a row, field by field, allowing a DataRow to be built appropriately.
+            </summary>
+        </member>
+        <member name="T:Npgsql.IStreamOwner">
+            <summary>
+            Marker interface which identifies a class which may take possession of a stream for the duration of
+            it's lifetime (possibly temporarily giving that possession to another class for part of that time.
+            
+            It inherits from IDisposable, since any such class must make sure it leaves the stream in a valid state.
+            
+            The most important such class is that compiler-generated from ProcessBackendResponsesEnum. Of course
+            we can't make that inherit from this interface, alas.
+            </summary>
+        </member>
+        <!-- Badly formed XML comment ignored for member "T:Npgsql.IServerResponseObject" -->
+        <member name="T:Npgsql.RowReader.Streamer">
+            <summary>
+            Reads part of a field, as needed (for <see cref="!:System.Data.IDataRecord.GetChars()"/>
+            and <see cref="!:System.Data.IDataRecord.GetBytes()"/>
+            </summary>
+        </member>
+        <member name="T:Npgsql.RowReader.Streamer`1">
+            <summary>
+            Adds further functionality to stream that is dependant upon the type of data read.
+            </summary>
+        </member>
+        <member name="T:Npgsql.RowReader.CharStreamer">
+            <summary>
+            Completes the implementation of Streamer for char data.
+            </summary>
+        </member>
+        <member name="T:Npgsql.RowReader.ByteStreamer">
+            <summary>
+            Completes the implementation of Streamer for byte data.
+            </summary>
+        </member>
+        <member name="T:Npgsql.StringRowReaderV2">
+            <summary>
+            Implements <see cref="T:Npgsql.RowReader"/> for version 2 of the protocol.
+            </summary>
+        </member>
+        <member name="T:Npgsql.StringRowReaderV2.NullMap">
+            <summary>
+            Encapsulates the null mapping bytes sent at the start of a version 2
+            datarow message, and the process of identifying the nullity of the data
+            at a particular index
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlBackEndKeyData">
+            <summary>
+            This class represents a BackEndKeyData message received
+            from PostgreSQL
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlBind">
+             <summary>
+             This class represents the Bind message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.ClientMessage">
+            <summary>
+            For classes representing messages sent from the client to the server.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCancelRequest">
+             <summary>
+             This class represents the CancelRequest message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlState">
+            <summary> This class represents the base class for the state pattern design pattern
+             implementation.
+             </summary>
+            
+        </member>
+        <member name="M:Npgsql.NpgsqlState.ChangeState(Npgsql.NpgsqlConnector,Npgsql.NpgsqlState)">
+            <summary>
+            This method is used by the states to change the state of the context.
+             </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlState.ProcessBackendResponses(Npgsql.NpgsqlConnector)">
+            <summary>
+             This method is responsible to handle all protocol messages sent from the backend.
+             It holds all the logic to do it.
+             To exchange data, it uses a Mediator object from which it reads/writes information
+             to handle backend requests.
+             </summary>
+            
+        </member>
+        <member name="M:Npgsql.NpgsqlState.ProcessBackendResponsesEnum(Npgsql.NpgsqlConnector)">
+            <summary>
+             This method is responsible to handle all protocol messages sent from the backend.
+             It holds all the logic to do it.
+             To exchange data, it uses a Mediator object from which it reads/writes information
+             to handle backend requests.
+             </summary>
+            
+        </member>
+        <member name="M:Npgsql.NpgsqlState.CheckForContextSocketAvailability(Npgsql.NpgsqlConnector,System.Net.Sockets.SelectMode)">
+            <summary>
+            Checks for context socket availability.
+            Socket.Poll supports integer as microseconds parameter.
+            This limits the usable command timeout value
+            to 2,147 seconds: (2,147 x 1,000,000 less than  max_int).
+            In order to bypass this limit, the availability of
+            the socket is checked in 2,147 seconds cycles
+            </summary>
+            <returns><c>true</c>, if for context socket availability was checked, <c>false</c> otherwise.</returns>
+            <param name="context">Context.</param>
+            <param name="selectMode">Select mode.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlClosedState.ResolveIPHost(System.String)">
+            <summary>
+            Resolve a host name or IP address.
+            This is needed because if you call Dns.Resolve() with an IP address, it will attempt
+            to resolve it as a host name, when it should just convert it to an IP address.
+            </summary>
+            <param name="HostName"></param>
+        </member>
+        <member name="T:Npgsql.NpgsqlCommand">
+            <summary>
+            Represents a SQL statement or function (stored procedure) to execute
+            against a PostgreSQL database. This class cannot be inherited.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> class.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> class with the text of the query.
+            </summary>
+            <param name="cmdText">The text of the query.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.#ctor(System.String,Npgsql.NpgsqlConnection)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> class with the text of the query and a <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>.
+            </summary>
+            <param name="cmdText">The text of the query.</param>
+            <param name="connection">A <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see> that represents the connection to a PostgreSQL server.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.#ctor(System.String,Npgsql.NpgsqlConnection,Npgsql.NpgsqlTransaction)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> class with the text of the query, a <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>, and the <see cref="T:Npgsql.NpgsqlTransaction">NpgsqlTransaction</see>.
+            </summary>
+            <param name="cmdText">The text of the query.</param>
+            <param name="connection">A <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see> that represents the connection to a PostgreSQL server.</param>
+            <param name="transaction">The <see cref="T:Npgsql.NpgsqlTransaction">NpgsqlTransaction</see> in which the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> executes.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.#ctor(System.String,Npgsql.NpgsqlConnector)">
+            <summary>
+            Used to execute internal commands.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.Cancel">
+            <summary>
+            Attempts to cancel the execution of a <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see>.
+            </summary>
+            <remarks>This Method isn't implemented yet.</remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.System#ICloneable#Clone">
+            <summary>
+            Create a new command based on this one.
+            </summary>
+            <returns>A new NpgsqlCommand object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.Clone">
+            <summary>
+            Create a new command based on this one.
+            </summary>
+            <returns>A new NpgsqlCommand object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.CreateDbParameter">
+            <summary>
+            Creates a new instance of an <see cref="T:System.Data.Common.DbParameter">DbParameter</see> object.
+            </summary>
+            <returns>An <see cref="T:System.Data.Common.DbParameter">DbParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.CreateParameter">
+            <summary>
+            Creates a new instance of a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.
+            </summary>
+            <returns>A <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.ExecuteBlind">
+            <summary>
+            Slightly optimised version of ExecuteNonQuery() for internal ues in cases where the number
+            of affected rows is of no interest.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.ExecuteNonQuery">
+            <summary>
+            Executes a SQL statement against the connection and returns the number of rows affected.
+            </summary>
+            <returns>The number of rows affected if known; -1 otherwise.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.ExecuteDbDataReader(System.Data.CommandBehavior)">
+            <summary>
+            Sends the <see cref="P:Npgsql.NpgsqlCommand.CommandText">CommandText</see> to
+            the <see cref="T:Npgsql.NpgsqlConnection">Connection</see> and builds a
+            <see cref="T:Npgsql.NpgsqlDataReader">NpgsqlDataReader</see>
+            using one of the <see cref="T:System.Data.CommandBehavior">CommandBehavior</see> values.
+            </summary>
+            <param name="behavior">One of the <see cref="T:System.Data.CommandBehavior">CommandBehavior</see> values.</param>
+            <returns>A <see cref="T:Npgsql.NpgsqlDataReader">NpgsqlDataReader</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.ExecuteReader">
+            <summary>
+            Sends the <see cref="P:Npgsql.NpgsqlCommand.CommandText">CommandText</see> to
+            the <see cref="T:Npgsql.NpgsqlConnection">Connection</see> and builds a
+            <see cref="T:Npgsql.NpgsqlDataReader">NpgsqlDataReader</see>.
+            </summary>
+            <returns>A <see cref="T:Npgsql.NpgsqlDataReader">NpgsqlDataReader</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.ExecuteReader(System.Data.CommandBehavior)">
+            <summary>
+            Sends the <see cref="P:Npgsql.NpgsqlCommand.CommandText">CommandText</see> to
+            the <see cref="T:Npgsql.NpgsqlConnection">Connection</see> and builds a
+            <see cref="T:Npgsql.NpgsqlDataReader">NpgsqlDataReader</see>
+            using one of the <see cref="T:System.Data.CommandBehavior">CommandBehavior</see> values.
+            </summary>
+            <param name="cb">One of the <see cref="T:System.Data.CommandBehavior">CommandBehavior</see> values.</param>
+            <returns>A <see cref="T:Npgsql.NpgsqlDataReader">NpgsqlDataReader</see> object.</returns>
+            <remarks>Currently the CommandBehavior parameter is ignored.</remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.BindParameters">
+            <summary>
+             This method binds the parameters from parameters collection to the bind
+             message.
+             </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.ExecuteScalar">
+            <summary>
+            Executes the query, and returns the first column of the first row
+            in the result set returned by the query. Extra columns or rows are ignored.
+            </summary>
+            <returns>The first column of the first row in the result set,
+            or a null reference if the result set is empty.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.Prepare">
+            <summary>
+            Creates a prepared version of the command on a PostgreSQL server.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.CheckConnectionState">
+            <summary>
+             This method checks the connection state to see if the connection
+             is set or it is open. If one of this conditions is not met, throws
+             an InvalidOperationException
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.GetCommandText">
+            <summary>
+            This method substitutes the <see cref="P:Npgsql.NpgsqlCommand.Parameters">Parameters</see>, if exist, in the command
+            to their actual values.
+            The parameter name format is <b>:ParameterName</b>.
+            </summary>
+            <returns>A version of <see cref="P:Npgsql.NpgsqlCommand.CommandText">CommandText</see> with the <see cref="P:Npgsql.NpgsqlCommand.Parameters">Parameters</see> inserted.</returns>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.CommandText">
+            <summary>
+            Gets or sets the SQL statement or function (stored procedure) to execute at the data source.
+            </summary>
+            <value>The Transact-SQL statement or stored procedure to execute. The default is an empty string.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.CommandTimeout">
+            <summary>
+            Gets or sets the wait time before terminating the attempt
+            to execute a command and generating an error.
+            </summary>
+            <value>The time (in seconds) to wait for the command to execute.
+            The default is 20 seconds.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.CommandType">
+            <summary>
+            Gets or sets a value indicating how the
+            <see cref="P:Npgsql.NpgsqlCommand.CommandText">CommandText</see> property is to be interpreted.
+            </summary>
+            <value>One of the <see cref="T:System.Data.CommandType">CommandType</see> values. The default is <see cref="T:System.Data.CommandType">CommandType.Text</see>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.Connection">
+            <summary>
+            Gets or sets the <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>
+            used by this instance of the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see>.
+            </summary>
+            <value>The connection to a data source. The default value is a null reference.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.Parameters">
+            <summary>
+            Gets the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see>.
+            </summary>
+            <value>The parameters of the SQL statement or function (stored procedure). The default is an empty collection.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.Transaction">
+            <summary>
+            Gets or sets the <see cref="T:Npgsql.NpgsqlTransaction">NpgsqlTransaction</see>
+            within which the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> executes.
+            </summary>
+            <value>The <see cref="T:Npgsql.NpgsqlTransaction">NpgsqlTransaction</see>.
+            The default value is a null reference.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.UpdatedRowSource">
+            <summary>
+            Gets or sets how command results are applied to the <see cref="T:System.Data.DataRow">DataRow</see>
+            when used by the <see cref="M:System.Data.Common.DbDataAdapter.Update(System.Data.DataSet)">Update</see>
+            method of the <see cref="T:System.Data.Common.DbDataAdapter">DbDataAdapter</see>.
+            </summary>
+            <value>One of the <see cref="T:System.Data.UpdateRowSource">UpdateRowSource</see> values.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.LastInsertedOID">
+            <summary>
+            Returns oid of inserted row. This is only updated when using executenonQuery and when command inserts just a single row. If table is created without oids, this will always be 0.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCommandBuilder">
+            <summary>
+             This class is responsible to create database commands for automatic insert, update and delete operations.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommandBuilder.DeriveParameters(Npgsql.NpgsqlCommand)">
+            <summary>
+            
+             This method is reponsible to derive the command parameter list with values obtained from function definition.
+             It clears the Parameters collection of command. Also, if there is any parameter type which is not supported by Npgsql, an InvalidOperationException will be thrown.
+             Parameters name will be parameter1, parameter2, ...
+             For while, only parameter name and NpgsqlDbType are obtained.
+            </summary>
+             <param name="command">NpgsqlCommand whose function parameters will be obtained.</param>
+        </member>
+        <member name="T:Npgsql.NoticeEventHandler">
+            <summary>
+            Represents the method that handles the <see cref="E:Npgsql.NpgsqlConnection.Notification">Notice</see> events.
+            </summary>
+            <param name="e">A <see cref="T:Npgsql.NpgsqlNoticeEventArgs">NpgsqlNoticeEventArgs</see> that contains the event data.</param>
+        </member>
+        <member name="T:Npgsql.NotificationEventHandler">
+            <summary>
+            Represents the method that handles the <see cref="E:Npgsql.NpgsqlConnection.Notification">Notification</see> events.
+            </summary>
+            <param name="sender">The source of the event.</param>
+            <param name="e">A <see cref="T:Npgsql.NpgsqlNotificationEventArgs">NpgsqlNotificationEventArgs</see> that contains the event data.</param>
+        </member>
+        <member name="T:Npgsql.NpgsqlConnection">
+            <summary>
+            This class represents a connection to a
+            PostgreSQL server.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.#ctor">
+            <summary>
+            Initializes a new instance of the
+            <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see> class.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the
+            <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see> class
+            and sets the <see cref="P:Npgsql.NpgsqlConnection.ConnectionString">ConnectionString</see>.
+            </summary>
+            <param name="ConnectionString">The connection used to open the PostgreSQL database.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.BeginDbTransaction(System.Data.IsolationLevel)">
+            <summary>
+            Begins a database transaction with the specified isolation level.
+            </summary>
+            <param name="isolationLevel">The <see cref="T:System.Data.IsolationLevel">isolation level</see> under which the transaction should run.</param>
+            <returns>An <see cref="T:System.Data.Common.DbTransaction">DbTransaction</see>
+            object representing the new transaction.</returns>
+            <remarks>
+            Currently the IsolationLevel ReadCommitted and Serializable are supported by the PostgreSQL backend.
+            There's no support for nested transactions.
+            </remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.BeginTransaction">
+            <summary>
+            Begins a database transaction.
+            </summary>
+            <returns>A <see cref="T:Npgsql.NpgsqlTransaction">NpgsqlTransaction</see>
+            object representing the new transaction.</returns>
+            <remarks>
+            Currently there's no support for nested transactions.
+            </remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.BeginTransaction(System.Data.IsolationLevel)">
+            <summary>
+            Begins a database transaction with the specified isolation level.
+            </summary>
+            <param name="level">The <see cref="T:System.Data.IsolationLevel">isolation level</see> under which the transaction should run.</param>
+            <returns>A <see cref="T:Npgsql.NpgsqlTransaction">NpgsqlTransaction</see>
+            object representing the new transaction.</returns>
+            <remarks>
+            Currently the IsolationLevel ReadCommitted and Serializable are supported by the PostgreSQL backend.
+            There's no support for nested transactions.
+            </remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.Open">
+            <summary>
+            Opens a database connection with the property settings specified by the
+            <see cref="P:Npgsql.NpgsqlConnection.ConnectionString">ConnectionString</see>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.ChangeDatabase(System.String)">
+            <summary>
+            This method changes the current database by disconnecting from the actual
+            database and connecting to the specified.
+            </summary>
+            <param name="dbName">The name of the database to use in place of the current database.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.Close">
+            <summary>
+            Releases the connection to the database.  If the connection is pooled, it will be
+            made available for re-use.  If it is non-pooled, the actual connection will be shutdown.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.CreateDbCommand">
+            <summary>
+            Creates and returns a <see cref="T:System.Data.Common.DbCommand">DbCommand</see>
+            object associated with the <see cref="T:System.Data.Common.DbConnection">IDbConnection</see>.
+            </summary>
+            <returns>A <see cref="T:System.Data.Common.DbCommand">DbCommand</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.CreateCommand">
+            <summary>
+            Creates and returns a <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see>
+            object associated with the <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>.
+            </summary>
+            <returns>A <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.Dispose(System.Boolean)">
+            <summary>
+            Releases all resources used by the
+            <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>.
+            </summary>
+            <param name="disposing"><b>true</b> when called from Dispose();
+            <b>false</b> when being called from the finalizer.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.System#ICloneable#Clone">
+            <summary>
+            Create a new connection based on this one.
+            </summary>
+            <returns>A new NpgsqlConnection object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.Clone">
+            <summary>
+            Create a new connection based on this one.
+            </summary>
+            <returns>A new NpgsqlConnection object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.DefaultCertificateSelectionCallback(System.Security.Cryptography.X509Certificates.X509CertificateCollection,System.Security.Cryptography.X509Certificates.X509Certificate,System.String,System.Security.Cryptography.X509Certificates.X509CertificateCollection)">
+            <summary>
+            Default SSL CertificateSelectionCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.DefaultCertificateValidationCallback(System.Security.Cryptography.X509Certificates.X509Certificate,System.Int32[])">
+            <summary>
+            Default SSL CertificateValidationCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.DefaultPrivateKeySelectionCallback(System.Security.Cryptography.X509Certificates.X509Certificate,System.String)">
+            <summary>
+            Default SSL PrivateKeySelectionCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.DefaultProvideClientCertificatesCallback(System.Security.Cryptography.X509Certificates.X509CertificateCollection)">
+            <summary>
+            Default SSL ProvideClientCertificatesCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.LogConnectionString">
+            <summary>
+            Write each key/value pair in the connection string to the log.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.GetSchema">
+            <summary>
+            Returns the supported collections
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.GetSchema(System.String)">
+            <summary>
+            Returns the schema collection specified by the collection name.
+            </summary>
+            <param name="collectionName">The collection name.</param>
+            <returns>The collection specified.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.GetSchema(System.String,System.String[])">
+            <summary>
+            Returns the schema collection specified by the collection name filtered by the restrictions.
+            </summary>
+            <param name="collectionName">The collection name.</param>
+            <param name="restrictions">
+            The restriction values to filter the results.  A description of the restrictions is contained
+            in the Restrictions collection.
+            </param>
+            <returns>The collection specified.</returns>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnection.Notice">
+            <summary>
+            Occurs on NoticeResponses from the PostgreSQL backend.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnection.Notification">
+            <summary>
+            Occurs on NotificationResponses from the PostgreSQL backend.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnection.ProvideClientCertificatesCallback">
+            <summary>
+            Called to provide client certificates for SSL handshake.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnection.CertificateSelectionCallback">
+            <summary>
+            Mono.Security.Protocol.Tls.CertificateSelectionCallback delegate.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnection.CertificateValidationCallback">
+            <summary>
+            Mono.Security.Protocol.Tls.CertificateValidationCallback delegate.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnection.PrivateKeySelectionCallback">
+            <summary>
+            Mono.Security.Protocol.Tls.PrivateKeySelectionCallback delegate.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.ConnectionString">
+            <summary>
+            Gets or sets the string used to connect to a PostgreSQL database.
+            Valid values are:
+            <ul>
+            <li>
+            Server:             Address/Name of Postgresql Server;
+            </li>
+            <li>
+            Port:               Port to connect to;
+            </li>
+            <li>
+            Protocol:           Protocol version to use, instead of automatic; Integer 2 or 3;
+            </li>
+            <li>
+            Database:           Database name. Defaults to user name if not specified;
+            </li>
+            <li>
+            User Id:            User name;
+            </li>
+            <li>
+            Password:           Password for clear text authentication;
+            </li>
+            <li>
+            SSL:                True or False. Controls whether to attempt a secure connection. Default = False;
+            </li>
+            <li>
+            Pooling:            True or False. Controls whether connection pooling is used. Default = True;
+            </li>
+            <li>
+            MinPoolSize:        Min size of connection pool;
+            </li>
+            <li>
+            MaxPoolSize:        Max size of connection pool;
+            </li>
+            <li>
+            Timeout:            Time to wait for connection open in seconds. Default is 15.
+            </li>
+            <li>
+            CommandTimeout:     Time to wait for command to finish execution before throw an exception. In seconds. Default is 20.
+            </li>
+            <li>
+            Sslmode:            Mode for ssl connection control. Can be Prefer, Require, Allow or Disable. Default is Disable. Check user manual for explanation of values.
+            </li>
+            <li>
+            ConnectionLifeTime: Time to wait before closing unused connections in the pool in seconds. Default is 15.
+            </li>
+            <li>
+            SyncNotification:   Specifies if Npgsql should use synchronous notifications.
+            </li>
+            <li>
+            SearchPath: Changes search path to specified and public schemas.
+            </li>
+            </ul>
+            </summary>
+            <value>The connection string that includes the server name,
+            the database name, and other parameters needed to establish
+            the initial connection. The default value is an empty string.
+            </value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.Host">
+            <summary>
+            Backend server host name.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.Port">
+            <summary>
+            Backend server port.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.SSL">
+            <summary>
+            If true, the connection will attempt to use SSL.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.ConnectionTimeout">
+            <summary>
+            Gets the time to wait while trying to establish a connection
+            before terminating the attempt and generating an error.
+            </summary>
+            <value>The time (in seconds) to wait for a connection to open. The default value is 15 seconds.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.CommandTimeout">
+            <summary>
+            Gets the time to wait while trying to execute a command
+            before terminating the attempt and generating an error.
+            </summary>
+            <value>The time (in seconds) to wait for a command to complete. The default value is 20 seconds.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.ConnectionLifeTime">
+            <summary>
+            Gets the time to wait before closing unused connections in the pool if the count
+            of all connections exeeds MinPoolSize.
+            </summary>
+            <remarks>
+            If connection pool contains unused connections for ConnectionLifeTime seconds,
+            the half of them will be closed. If there will be unused connections in a second
+            later then again the half of them will be closed and so on.
+            This strategy provide smooth change of connection count in the pool.
+            </remarks>
+            <value>The time (in seconds) to wait. The default value is 15 seconds.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.Database">
+            <summary>
+             Gets the name of the current database or the database to be used after a connection is opened.
+             </summary>
+             <value>The name of the current database or the name of the database to be
+             used after a connection is opened. The default value is the empty string.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.PreloadReader">
+            <summary>
+            Whether datareaders are loaded in their entirety (for compatibility with earlier code).
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.DataSource">
+            <summary>
+            Gets the database server name.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.SyncNotification">
+            <summary>
+            Gets flag indicating if we are using Synchronous notification or not.
+            The default value is false.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.FullState">
+            <summary>
+            Gets the current state of the connection.
+            </summary>
+            <value>A bitwise combination of the <see cref="T:System.Data.ConnectionState">ConnectionState</see> values. The default is <b>Closed</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.State">
+            <summary>
+            Gets whether the current state of the connection is Open or Closed
+            </summary>
+            <value>ConnectionState.Open or ConnectionState.Closed</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.PostgreSqlVersion">
+            <summary>
+            Version of the PostgreSQL backend.
+            This can only be called when there is an active connection.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.BackendProtocolVersion">
+            <summary>
+            Protocol version in use.
+            This can only be called when there is an active connection.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.ProcessID">
+            <summary>
+            Process id of backend server.
+            This can only be called when there is an active connection.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.Connector">
+            <summary>
+            The connector object connected to the backend.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.ConnectionStringValues">
+            <summary>
+            Gets the NpgsqlConnectionStringBuilder containing the parsed connection string values.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.UserName">
+            <summary>
+            User name.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.Password">
+            <summary>
+            Password.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.Pooling">
+            <summary>
+            Determine if connection pooling will be used for this connection.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectionStringBuilder.Clone">
+            <summary>
+            Return an exact copy of this NpgsqlConnectionString.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectionStringBuilder.SetValue(System.String,System.Object)">
+            <summary>
+            This function will set value for known key, both private member and base[key].
+            </summary>
+            <param name="keyword"></param>
+            <param name="value"></param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectionStringBuilder.SetValue(Npgsql.Keywords,System.Object)">
+            <summary>
+            The function will modify private member only, not base[key].
+            </summary>
+            <param name="keyword"></param>
+            <param name="value"></param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectionStringBuilder.Clear">
+            <summary>
+            Clear the member and assign them to the default value.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnectionStringBuilder.Compatible">
+            <summary>
+            Compatibilty version. When possible, behaviour caused by breaking changes will be preserved
+            if this version is less than that where the breaking change was introduced.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnectionStringBuilder.Item(System.String)">
+            <summary>
+            Case insensative accessor for indivual connection string values.
+            </summary>
+        </member>
+        <member name="T:Npgsql.ProvideClientCertificatesCallback">
+            <summary>
+            Represents the method that allows the application to provide a certificate collection to be used for SSL clien authentication
+            </summary>
+            <param name="certificates">A <see cref="T:System.Security.Cryptography.X509Certificates.X509CertificateCollection">X509CertificateCollection</see> to be filled with one or more client certificates.</param>
+        </member>
+        <member name="T:Npgsql.NpgsqlConnector">
+            <summary>
+            !!! Helper class, for compilation only.
+            Connector implements the logic for the Connection Objects to
+            access the physical connection to the database, and isolate
+            the application developer from connection pooling internals.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.#ctor(Npgsql.NpgsqlConnectionStringBuilder,System.Boolean,System.Boolean)">
+            <summary>
+            Constructor.
+            </summary>
+            <param name="Shared">Controls whether the connector can be shared.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.IsValid">
+            <summary>
+            This method checks if the connector is still ok.
+            We try to send a simple query text, select 1 as ConnectionTest;
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.ReleaseResources">
+            <summary>
+            This method is responsible for releasing all resources associated with this Connector.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.ReleasePlansPortals">
+            <summary>
+            This method is responsible to release all portals used by this Connector.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.DefaultCertificateSelectionCallback(System.Security.Cryptography.X509Certificates.X509CertificateCollection,System.Security.Cryptography.X509Certificates.X509Certificate,System.String,System.Security.Cryptography.X509Certificates.X509CertificateCollection)">
+            <summary>
+            Default SSL CertificateSelectionCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.DefaultCertificateValidationCallback(System.Security.Cryptography.X509Certificates.X509Certificate,System.Int32[])">
+            <summary>
+            Default SSL CertificateValidationCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.DefaultPrivateKeySelectionCallback(System.Security.Cryptography.X509Certificates.X509Certificate,System.String)">
+            <summary>
+            Default SSL PrivateKeySelectionCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.DefaultProvideClientCertificatesCallback(System.Security.Cryptography.X509Certificates.X509CertificateCollection)">
+            <summary>
+            Default SSL ProvideClientCertificatesCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.ProcessServerVersion">
+            <summary>
+            This method is required to set all the version dependent features flags.
+            SupportsPrepare means the server can use prepared query plans (7.3+)
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.Open">
+            <summary>
+            Opens the physical connection to the server.
+            </summary>
+            <remarks>Usually called by the RequestConnector
+            Method of the connection pool manager.</remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.Close">
+            <summary>
+            Closes the physical connection to the server.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.NextPortalName">
+            <summary>
+             Returns next portal index.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.NextPlanName">
+            <summary>
+             Returns next plan index.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnector.Notice">
+            <summary>
+            Occurs on NoticeResponses from the PostgreSQL backend.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnector.Notification">
+            <summary>
+            Occurs on NotificationResponses from the PostgreSQL backend.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnector.ProvideClientCertificatesCallback">
+            <summary>
+            Called to provide client certificates for SSL handshake.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnector.CertificateSelectionCallback">
+            <summary>
+            Mono.Security.Protocol.Tls.CertificateSelectionCallback delegate.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnector.CertificateValidationCallback">
+            <summary>
+            Mono.Security.Protocol.Tls.CertificateValidationCallback delegate.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnector.PrivateKeySelectionCallback">
+            <summary>
+            Mono.Security.Protocol.Tls.PrivateKeySelectionCallback delegate.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.State">
+            <summary>
+            Gets the current state of the connection.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.ConnectionString">
+            <summary>
+            Return Connection String.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.ServerVersion">
+            <summary>
+            Version of backend server this connector is connected to.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.BackendProtocolVersion">
+            <summary>
+            Backend protocol version in use by this connector.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.Stream">
+            <summary>
+            The physical connection stream to the backend.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.Socket">
+            <summary>
+            The physical connection socket to the backend.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.IsInitialized">
+            <summary>
+            Reports if this connector is fully connected.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.Mediator">
+            <summary>
+            The connection mediator.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.Transaction">
+            <summary>
+            Report if the connection is in a transaction.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.SupportsPrepare">
+            <summary>
+            Report whether the current connection can support prepare functionality.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlConnectorPool">
+            <summary>
+            This class manages all connector objects, pooled AND non-pooled.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlConnectorPool.ConnectorPoolMgr">
+            <value>Unique static instance of the connector pool
+            mamager.</value>
+        </member>
+        <member name="F:Npgsql.NpgsqlConnectorPool.PooledConnectors">
+            <value>Map of index to unused pooled connectors, avaliable to the
+            next RequestConnector() call.</value>
+            <remarks>This hashmap will be indexed by connection string.
+            This key will hold a list of queues of pooled connectors available to be used.</remarks>
+        </member>
+        <member name="F:Npgsql.NpgsqlConnectorPool.Timer">
+            <value>Timer for tracking unused connections in pools.</value>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.RequestConnector(Npgsql.NpgsqlConnection)">
+            <summary>
+            Searches the shared and pooled connector lists for a
+            matching connector object or creates a new one.
+            </summary>
+            <param name="Connection">The NpgsqlConnection that is requesting
+            the connector. Its ConnectionString will be used to search the
+            pool for available connectors.</param>
+            <returns>A connector object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.RequestPooledConnector(Npgsql.NpgsqlConnection)">
+            <summary>
+            Find a pooled connector.  Handle locking and timeout here.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.RequestPooledConnectorInternal(Npgsql.NpgsqlConnection)">
+            <summary>
+            Find a pooled connector.  Handle shared/non-shared here.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.ReleaseConnector(Npgsql.NpgsqlConnection,Npgsql.NpgsqlConnector)">
+            <summary>
+            Releases a connector, possibly back to the pool for future use.
+            </summary>
+            <remarks>
+            Pooled connectors will be put back into the pool if there is room.
+            Shared connectors should just have their use count decremented
+            since they always stay in the shared pool.
+            </remarks>
+            <param name="Connector">The connector to release.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.ReleasePooledConnector(Npgsql.NpgsqlConnection,Npgsql.NpgsqlConnector)">
+            <summary>
+            Release a pooled connector.  Handle locking here.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.ReleasePooledConnectorInternal(Npgsql.NpgsqlConnection,Npgsql.NpgsqlConnector)">
+            <summary>
+            Release a pooled connector.  Handle shared/non-shared here.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.GetNonPooledConnector(Npgsql.NpgsqlConnection)">
+            <summary>
+            Create a connector without any pooling functionality.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.GetPooledConnector(Npgsql.NpgsqlConnection)">
+            <summary>
+            Find an available pooled connector in the non-shared pool, or create
+            a new one if none found.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.FixPoolCountBecauseOfConnectionDisposeFalse(Npgsql.NpgsqlConnection)">
+            <summary>
+            This method is only called when NpgsqlConnection.Dispose(false) is called which means a
+            finalization. This also means, an NpgsqlConnection was leak. We clear pool count so that
+            client doesn't end running out of connections from pool. When the connection is finalized, its underlying
+            socket is closed.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.UngetNonPooledConnector(Npgsql.NpgsqlConnection,Npgsql.NpgsqlConnector)">
+            <summary>
+            Close the connector.
+            </summary>
+            <param name="Connection"></param>
+            <param name="Connector">Connector to release</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.UngetPooledConnector(Npgsql.NpgsqlConnection,Npgsql.NpgsqlConnector)">
+            <summary>
+            Put a pooled connector into the pool queue.
+            </summary>
+            <param name="Connector">Connector to pool</param>
+        </member>
+        <member name="T:Npgsql.NpgsqlConnectorPool.ConnectorQueue">
+            <summary>
+            A queue with an extra Int32 for keeping track of busy connections.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlConnectorPool.ConnectorQueue.Available">
+            <summary>
+            Connections available to the end user
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlConnectorPool.ConnectorQueue.Busy">
+            <summary>
+            Connections currently in use
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyFormat">
+            <summary>
+            Represents information about COPY operation data transfer format as returned by server.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyFormat.#ctor(System.Byte,System.Int16[])">
+            <summary>
+            Only created when a CopyInResponse or CopyOutResponse is received by NpgsqlState.ProcessBackendResponses()
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyFormat.FieldIsBinary(System.Int32)">
+            <summary>
+            Returns true if this operation is currently active and field at given location is in binary format.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyFormat.IsBinary">
+            <summary>
+            Returns true if this operation is currently active and in binary format.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyFormat.FieldCount">
+            <summary>
+            Returns number of fields if this operation is currently active, otherwise -1
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyIn">
+            <summary>
+            Represents a PostgreSQL COPY FROM STDIN operation with a corresponding SQL statement
+            to execute against a PostgreSQL database
+            and an associated stream used to read data from (if provided by user)
+            or for writing it (when generated by driver).
+            Eg. new NpgsqlCopyIn("COPY mytable FROM STDIN", connection, streamToRead).Start();
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.#ctor(System.String,Npgsql.NpgsqlConnection)">
+            <summary>
+            Creates NpgsqlCommand to run given query upon Start(). Data for the requested COPY IN operation can then be written to CopyData stream followed by a call to End() or Cancel().
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.#ctor(Npgsql.NpgsqlCommand,Npgsql.NpgsqlConnection)">
+            <summary>
+            Given command is run upon Start(). Data for the requested COPY IN operation can then be written to CopyData stream followed by a call to End() or Cancel().
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.#ctor(Npgsql.NpgsqlCommand,Npgsql.NpgsqlConnection,System.IO.Stream)">
+            <summary>
+            Given command is executed upon Start() and all data from fromStream is passed to it as copy data.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.FieldIsBinary(System.Int32)">
+            <summary>
+            Returns true if this operation is currently active and field at given location is in binary format.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.Start">
+            <summary>
+            Command specified upon creation is executed as a non-query.
+            If CopyStream is set upon creation, it will be flushed to server as copy data, and operation will be finished immediately.
+            Otherwise the CopyStream member can be used for writing copy data to server and operation finished with a call to End() or Cancel().
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.End">
+            <summary>
+            Called after writing all data to CopyStream to successfully complete this copy operation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.Cancel(System.String)">
+            <summary>
+            Withdraws an already started copy operation. The operation will fail with given error message.
+            Will do nothing if current operation is not active.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyIn.IsActive">
+            <summary>
+            Returns true if the connection is currently reserved for this operation.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyIn.CopyStream">
+            <summary>
+            The stream provided by user or generated upon Start().
+            User may provide a stream to constructor; it is used to pass to server all data read from it.
+            Otherwise, call to Start() sets this to a writable NpgsqlCopyInStream that passes all data written to it to server.
+            In latter case this is only available while the copy operation is active and null otherwise.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyIn.IsBinary">
+            <summary>
+            Returns true if this operation is currently active and in binary format.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyIn.FieldCount">
+            <summary>
+            Returns number of fields expected on each input row if this operation is currently active, otherwise -1
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyIn.NpgsqlCommand">
+            <summary>
+            The Command used to execute this copy operation.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyIn.CopyBufferSize">
+            <summary>
+            Set before a COPY IN query to define size of internal buffer for reading from given CopyStream.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyInState">
+            <summary>
+            Represents an ongoing COPY FROM STDIN operation.
+            Provides methods to push data to server and end or cancel the operation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInState.StartCopy(Npgsql.NpgsqlConnector,Npgsql.NpgsqlCopyFormat)">
+            <summary>
+            Called from NpgsqlState.ProcessBackendResponses upon CopyInResponse.
+            If CopyStream is already set, it is used to read data to push to server, after which the copy is completed.
+            Otherwise CopyStream is set to a writable NpgsqlCopyInStream that calls SendCopyData each time it is written to.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInState.SendCopyData(Npgsql.NpgsqlConnector,System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Sends given packet to server as a CopyData message.
+            Does not check for notifications! Use another thread for that.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInState.SendCopyDone(Npgsql.NpgsqlConnector)">
+            <summary>
+            Sends CopyDone message to server. Handles responses, ie. may throw an exception.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInState.SendCopyFail(Npgsql.NpgsqlConnector,System.String)">
+            <summary>
+            Sends CopyFail message to server. Handles responses, ie. should always throw an exception:
+            in CopyIn state the server responds to CopyFail with an error response;
+            outside of a CopyIn state the server responds to CopyFail with an error response;
+            without network connection or whatever, there's going to eventually be a failure, timeout or user intervention.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInState.CopyFormat">
+            <summary>
+            Copy format information returned from server.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyInStream">
+            <summary>
+            Stream for writing data to a table on a PostgreSQL version 7.4 or newer database during an active COPY FROM STDIN operation.
+            <b>Passes data exactly as is and when given</b>, so see to it that you use server encoding, correct format and reasonably sized writes!
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.#ctor(Npgsql.NpgsqlConnector)">
+            <summary>
+            Created only by NpgsqlCopyInState.StartCopy()
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.Close">
+            <summary>
+            Successfully completes copying data to server. Returns after operation is finished.
+            Does nothing if this stream is not the active copy operation writer.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.Cancel(System.String)">
+            <summary>
+            Withdraws an already started copy operation. The operation will fail with given error message.
+            Does nothing if this stream is not the active copy operation writer.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.Write(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Writes given bytes to server.
+            Fails if this stream is not the active copy operation writer.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.Flush">
+            <summary>
+            Flushes stream contents to server.
+            Fails if this stream is not the active copy operation writer.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.Read(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Not readable
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.Seek(System.Int64,System.IO.SeekOrigin)">
+            <summary>
+            Not seekable
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.SetLength(System.Int64)">
+            <summary>
+            Not supported
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInStream.IsActive">
+            <summary>
+            True while this stream can be used to write copy data to server
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInStream.CanRead">
+            <summary>
+            False
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInStream.CanWrite">
+            <summary>
+            True
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInStream.CanSeek">
+            <summary>
+            False
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInStream.Length">
+            <summary>
+            Number of bytes written so far
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInStream.Position">
+            <summary>
+            Number of bytes written so far; not settable
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyOut">
+            <summary>
+            Represents a PostgreSQL COPY TO STDOUT operation with a corresponding SQL statement
+            to execute against a PostgreSQL database
+            and an associated stream used to write results to (if provided by user)
+            or for reading the results (when generated by driver).
+            Eg. new NpgsqlCopyOut("COPY (SELECT * FROM mytable) TO STDOUT", connection, streamToWrite).Start();
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOut.#ctor(System.String,Npgsql.NpgsqlConnection)">
+            <summary>
+            Creates NpgsqlCommand to run given query upon Start(), after which CopyStream provides data from database as requested in the query.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOut.#ctor(Npgsql.NpgsqlCommand,Npgsql.NpgsqlConnection)">
+            <summary>
+            Given command is run upon Start(), after which CopyStream provides data from database as requested in the query.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOut.#ctor(Npgsql.NpgsqlCommand,Npgsql.NpgsqlConnection,System.IO.Stream)">
+            <summary>
+            Given command is executed upon Start() and all requested copy data is written to toStream immediately.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOut.FieldIsBinary(System.Int32)">
+            <summary>
+            Returns true if this operation is currently active and field at given location is in binary format.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOut.Start">
+            <summary>
+            Command specified upon creation is executed as a non-query.
+            If CopyStream is set upon creation, all copy data from server will be written to it, and operation will be finished immediately.
+            Otherwise the CopyStream member can be used for reading copy data from server until no more data is available.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOut.End">
+            <summary>
+            Flush generated CopyStream at once. Effectively reads and discard all the rest of copy data from server.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOut.IsActive">
+            <summary>
+            Returns true if the connection is currently reserved for this operation.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOut.CopyStream">
+            <summary>
+            The stream provided by user or generated upon Start()
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOut.NpgsqlCommand">
+            <summary>
+            The Command used to execute this copy operation.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOut.IsBinary">
+            <summary>
+            Returns true if this operation is currently active and in binary format.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOut.FieldCount">
+            <summary>
+            Returns number of fields if this operation is currently active, otherwise -1
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOut.Read">
+            <summary>
+            Faster alternative to using the generated CopyStream.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyOutState">
+            <summary>
+            Represents an ongoing COPY TO STDOUT operation.
+            Provides methods to read data from server or end the operation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutState.StartCopy(Npgsql.NpgsqlConnector,Npgsql.NpgsqlCopyFormat)">
+            <summary>
+            Called from NpgsqlState.ProcessBackendResponses upon CopyOutResponse.
+            If CopyStream is already set, it is used to write data received from server, after which the copy ends.
+            Otherwise CopyStream is set to a readable NpgsqlCopyOutStream that receives data from server.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutState.GetCopyData(Npgsql.NpgsqlConnector)">
+            <summary>
+            Called from NpgsqlOutStream.Read to read copy data from server.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutState.CopyFormat">
+            <summary>
+            Copy format information returned from server.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyOutStream">
+            <summary>
+            Stream for reading data from a table or select on a PostgreSQL version 7.4 or newer database during an active COPY TO STDOUT operation.
+            <b>Passes data exactly as provided by the server.</b>
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.#ctor(Npgsql.NpgsqlConnector)">
+            <summary>
+            Created only by NpgsqlCopyOutState.StartCopy()
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.Close">
+            <summary>
+            Discards copy data as long as server pushes it. Returns after operation is finished.
+            Does nothing if this stream is not the active copy operation reader.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.Write(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Not writable.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.Flush">
+            <summary>
+            Not flushable.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.Read(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Copies data read from server to given byte buffer.
+            Since server returns data row by row, length will differ each time, but it is only zero once the operation ends.
+            Can be mixed with calls to the more efficient NpgsqlCopyOutStream.Read() : byte[] though that would not make much sense.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.Seek(System.Int64,System.IO.SeekOrigin)">
+            <summary>
+            Not seekable
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.SetLength(System.Int64)">
+            <summary>
+            Not supported
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.Read">
+            <summary>
+            Returns a whole row of data from server without extra work.
+            If standard Stream.Read(...) has been called before, it's internal buffers remains are returned.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutStream.IsActive">
+            <summary>
+            True while this stream can be used to read copy data from server
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutStream.CanRead">
+            <summary>
+            True
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutStream.CanWrite">
+            <summary>
+            False
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutStream.CanSeek">
+            <summary>
+            False
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutStream.Length">
+            <summary>
+            Number of bytes read so far
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutStream.Position">
+            <summary>
+            Number of bytes read so far; can not be set.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopySerializer">
+            <summary>
+            Writes given objects into a stream for PostgreSQL COPY in default copy format (not CSV or BINARY).
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlRowUpdatedEventHandler">
+            <summary>
+            Represents the method that handles the <see cref="E:Npgsql.NpgsqlDataAdapter.RowUpdated">RowUpdated</see> events.
+            </summary>
+            <param name="sender">The source of the event.</param>
+            <param name="e">A <see cref="T:NpgsqlRowUpdatedEventArgs">NpgsqlRowUpdatedEventArgs</see> that contains the event data.</param>
+        </member>
+        <member name="T:Npgsql.NpgsqlRowUpdatingEventHandler">
+            <summary>
+            Represents the method that handles the <see cref="E:Npgsql.NpgsqlDataAdapter.RowUpdating">RowUpdating</see> events.
+            </summary>
+            <param name="sender">The source of the event.</param>
+            <param name="e">A <see cref="T:NpgsqlRowUpdatingEventArgs">NpgsqlRowUpdatingEventArgs</see> that contains the event data.</param>
+        </member>
+        <member name="T:Npgsql.NpgsqlDataAdapter">
+            <summary>
+            This class represents an adapter from many commands: select, update, insert and delete to fill <see cref="T:System.Data.DataSet">Datasets.</see>
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlDataReader">
+            <summary>
+            Provides a means of reading a forward-only stream of rows from a PostgreSQL backend.  This class cannot be inherited.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetDataTypeName(System.Int32)">
+            <summary>
+            Return the data type name of the column at index <param name="Index"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetFieldType(System.Int32)">
+            <summary>
+            Return the data type of the column at index <param name="Index"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetProviderSpecificFieldType(System.Int32)">
+            <summary>
+            Return the Npgsql specific data type of the column at requested ordinal.
+            </summary>
+            <param name="ordinal">column position</param>
+            <returns>Appropriate Npgsql type for column.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetName(System.Int32)">
+            <summary>
+            Return the column name of the column at index <param name="Index"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetDataTypeOID(System.Int32)">
+            <summary>
+            Return the data type OID of the column at index <param name="Index"></param>.
+            </summary>
+            FIXME: Why this method returns String?
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetOrdinal(System.String)">
+            <summary>
+            Return the column name of the column named <param name="Name"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetFieldDbType(System.Int32)">
+            <summary>
+            Return the data DbType of the column at index <param name="Index"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetFieldNpgsqlDbType(System.Int32)">
+            <summary>
+            Return the data NpgsqlDbType of the column at index <param name="Index"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetInterval(System.Int32)">
+            <summary>
+            Get the value of a column as a <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.
+            <remarks>If the differences between <see cref="T:NpgsqlTypes.NpgsqlInterval"/> and <see cref="!:System.Timespan"/>
+            in handling of days and months is not important to your application, use <see cref="!:GetTimeSpan()"/>
+            instead.</remarks>
+            </summary>
+            <param name="i">Index of the field to find.</param>
+            <returns><see cref="T:NpgsqlTypes.NpgsqlInterval"/> value of the field.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetGuid(System.Int32)">
+            <summary>
+            Gets the value of a column converted to a Guid.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetInt16(System.Int32)">
+            <summary>
+            Gets the value of a column as Int16.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetInt32(System.Int32)">
+            <summary>
+            Gets the value of a column as Int32.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetInt64(System.Int32)">
+            <summary>
+            Gets the value of a column as Int64.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetFloat(System.Int32)">
+            <summary>
+            Gets the value of a column as Single.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetDouble(System.Int32)">
+            <summary>
+            Gets the value of a column as Double.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetString(System.Int32)">
+            <summary>
+            Gets the value of a column as String.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetDecimal(System.Int32)">
+            <summary>
+            Gets the value of a column as Decimal.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetTimeSpan(System.Int32)">
+            <summary>
+            Gets the value of a column as TimeSpan.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetValues(System.Object[])">
+            <summary>
+            Copy values from each column in the current row into <param name="Values"></param>.
+            </summary>
+            <returns>The number of column values copied.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetProviderSpecificValues(System.Object[])">
+            <summary>
+            Copy values from each column in the current row into <param name="Values"></param>.
+            </summary>
+            <param name="values">An array appropriately sized to store values from all columns.</param>
+            <returns>The number of column values copied.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetBoolean(System.Int32)">
+            <summary>
+            Gets the value of a column as Boolean.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetByte(System.Int32)">
+            <summary>
+            Gets the value of a column as Byte.  Not implemented.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetChar(System.Int32)">
+            <summary>
+            Gets the value of a column as Char.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetDateTime(System.Int32)">
+            <summary>
+            Gets the value of a column as DateTime.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetSchemaTable">
+            <summary>
+            Returns a System.Data.DataTable that describes the column metadata of the DataReader.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetTableNameFromQuery">
+            <summary>
+             This methods parses the command text and tries to get the tablename
+             from it.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlDataReader.ReaderClosed">
+            <summary>
+            Is raised whenever Close() is called.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlDataReader.FieldCount">
+            <summary>
+            Gets the number of columns in the current row.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlDataReader.Item(System.Int32)">
+            <summary>
+            Gets the value of a column in its native format.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlDataReader.Item(System.String)">
+            <summary>
+            Gets the value of a column in its native format.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlDataReader.Depth">
+            <summary>
+            Gets a value indicating the depth of nesting for the current row.  Always returns zero.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlDataReader.IsClosed">
+            <summary>
+            Gets a value indicating whether the data reader is closed.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlDataReader.KeyLookup.primaryKey">
+            <summary>
+            Contains the column names as the keys
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlDataReader.KeyLookup.uniqueColumns">
+            <summary>
+            Contains all unique columns
+            </summary>
+        </member>
+        <member name="T:Npgsql.ForwardsOnlyDataReader">
+            <summary>
+            This is the primary implementation of NpgsqlDataReader. It is the one used in normal cases (where the 
+            preload-reader option is not set in the connection string to resolve some potential backwards-compatibility
+            issues), the only implementation used internally, and in cases where CachingDataReader is used, it is still
+            used to do the actual "leg-work" of turning a response stream from the server into a datareader-style
+            object - with CachingDataReader then filling it's cache from here.
+            </summary>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.GetNextResponseObject">
+            <summary>
+            Iterate through the objects returned through from the server.
+            If it's a CompletedResponse the rowsaffected count is updated appropriately,
+            and we iterate again, otherwise we return it (perhaps updating our cache of pending
+            rows if appropriate).
+            </summary>
+            <returns>The next <see cref="T:Npgsql.IServerResponseObject"/> we will deal with.</returns>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.GetNextRowDescription">
+            <summary>
+            Advances the data reader to the next result, when multiple result sets were returned by the PostgreSQL backend.
+            </summary>
+            <returns>True if the reader was advanced, otherwise false.</returns>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.Dispose(System.Boolean)">
+            <summary>
+            Releases the resources used by the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.Close">
+            <summary>
+            Closes the data reader object.
+            </summary>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.NextResult">
+            <summary>
+            Advances the data reader to the next result, when multiple result sets were returned by the PostgreSQL backend.
+            </summary>
+            <returns>True if the reader was advanced, otherwise false.</returns>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.Read">
+            <summary>
+            Advances the data reader to the next row.
+            </summary>
+            <returns>True if the reader was advanced, otherwise false.</returns>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.GetValue(System.Int32)">
+            <summary>
+            Return the value of the column at index <param name="Index"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.GetBytes(System.Int32,System.Int64,System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Gets raw data from a column.
+            </summary>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.GetChars(System.Int32,System.Int64,System.Char[],System.Int32,System.Int32)">
+            <summary>
+            Gets raw data from a column.
+            </summary>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.IsDBNull(System.Int32)">
+            <summary>
+            Report whether the value in a column is DBNull.
+            </summary>
+        </member>
+        <member name="P:Npgsql.ForwardsOnlyDataReader.RecordsAffected">
+            <summary>
+            Gets the number of rows changed, inserted, or deleted by execution of the SQL statement.
+            </summary>
+        </member>
+        <member name="P:Npgsql.ForwardsOnlyDataReader.HasRows">
+            <summary>
+            Indicates if NpgsqlDatareader has rows to be read.
+            </summary>
+        </member>
+        <member name="T:Npgsql.CachingDataReader">
+            <summary>
+            <para>Provides an implementation of NpgsqlDataReader in which all data is pre-loaded into memory.
+            This operates by first creating a ForwardsOnlyDataReader as usual, and then loading all of it's
+            Rows into memory. There is a general principle that when there is a trade-off between a class design that
+            is more efficient and/or scalable on the one hand and one that is less efficient but has more functionality
+            (in this case the internal-only functionality of caching results) that one can build the less efficent class
+            from the most efficient without significant extra loss in efficiency, but not the other way around. The relationship
+            between ForwardsOnlyDataReader and CachingDataReader is an example of this).</para>
+            <para>Since the interface presented to the user is still forwards-only, queues are used to
+            store this information, so that dequeueing as we go we give the garbage collector the best opportunity
+            possible to reclaim any memory that is no longer in use.</para>
+            <para>ForwardsOnlyDataReader being used to actually
+            obtain the information from the server means that the "leg-work" is still only done (and need only be
+            maintained) in one place.</para>
+            <para>This class exists to allow for certain potential backwards-compatibility issues to be resolved
+            with little effort on the part of affected users. It is considerably less efficient than ForwardsOnlyDataReader
+            and hence never used internally.</para>
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlDescribe">
+             <summary>
+             This class represents the Parse message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlNoticeEventArgs">
+            <summary>
+            EventArgs class to send Notice parameters, which are just NpgsqlError's in a lighter context.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlNoticeEventArgs.Notice">
+            <summary>
+            Notice information.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlError">
+            <summary>
+            This class represents the ErrorResponse and NoticeResponse
+            message sent from PostgreSQL server.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlError.ToString">
+            <summary>
+            Return a string representation of this error object.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Severity">
+            <summary>
+            Severity code.  All versions.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Code">
+            <summary>
+            Error code.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Message">
+            <summary>
+            Terse error message.  All versions.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Detail">
+            <summary>
+            Detailed error message.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Hint">
+            <summary>
+            Suggestion to help resolve the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Position">
+            <summary>
+            Position (one based) within the query string where the error was encounterd.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.InternalPosition">
+            <summary>
+            Position (one based) within the query string where the error was encounterd.  This position refers to an internal command executed for example inside a PL/pgSQL function. PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.InternalQuery">
+            <summary>
+            Internal query string where the error was encounterd.  This position refers to an internal command executed for example inside a PL/pgSQL function. PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Where">
+            <summary>
+            Trace back information.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.File">
+            <summary>
+            Source file (in backend) reporting the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Line">
+            <summary>
+            Source file line number (in backend) reporting the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Routine">
+            <summary>
+            Source routine (in backend) reporting the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.ErrorSql">
+            <summary>
+            String containing the sql sent which produced this error.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.BackendProtocolVersion">
+            <summary>
+            Backend protocol version in use.
+            </summary>
+        </member>
+        <member name="T:Npgsql.LogLevel">
+            <summary>
+            The level of verbosity of the NpgsqlEventLog
+            </summary>
+        </member>
+        <member name="F:Npgsql.LogLevel.None">
+            <summary>
+            Don't log at all
+            </summary>
+        </member>
+        <member name="F:Npgsql.LogLevel.Normal">
+            <summary>
+            Only log the most common issues
+            </summary>
+        </member>
+        <member name="F:Npgsql.LogLevel.Debug">
+            <summary>
+            Log everything
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlEventLog">
+            <summary>
+            This class handles all the Npgsql event and debug logging
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMsg(System.String,Npgsql.LogLevel)">
+            <summary>
+            Writes a string to the Npgsql event log if msglevel is bigger then <see cref="P:Npgsql.NpgsqlEventLog.Level">NpgsqlEventLog.Level</see>
+            </summary>
+            <remarks>
+            This method is obsolete and should no longer be used.
+            It is likely to be removed in future versions of Npgsql
+            </remarks>
+            <param name="message">The message to write to the event log</param>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMsg(System.Resources.ResourceManager,System.String,Npgsql.LogLevel,System.Object[])">
+            <summary>
+            Writes a string to the Npgsql event log if msglevel is bigger then <see cref="P:Npgsql.NpgsqlEventLog.Level">NpgsqlEventLog.Level</see>
+            </summary>
+            <param name="resman">The <see cref="T:System.Resources.ResourceManager">ResourceManager</see> to get the localized resources</param>
+            <param name="ResourceString">The name of the resource that should be fetched by the <see cref="T:System.Resources.ResourceManager">ResourceManager</see></param>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="Parameters">The additional parameters that shall be included into the log-message (must be compatible with the string in the resource):</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogIndexerGet(Npgsql.LogLevel,System.String,System.Object)">
+            <summary>
+            Writes the default log-message for the action of calling the Get-part of an Indexer to the log file.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Indexer</param>
+            <param name="IndexerParam">The parameter given to the Indexer</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogIndexerSet(Npgsql.LogLevel,System.String,System.Object,System.Object)">
+            <summary>
+            Writes the default log-message for the action of calling the Set-part of an Indexer to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Indexer</param>
+            <param name="IndexerParam">The parameter given to the Indexer</param>
+            <param name="value">The value the Indexer is set to</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogPropertyGet(Npgsql.LogLevel,System.String,System.String)">
+            <summary>
+            Writes the default log-message for the action of calling the Get-part of a Property to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Property</param>
+            <param name="PropertyName">The name of the Property</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogPropertySet(Npgsql.LogLevel,System.String,System.String,System.Object)">
+            <summary>
+            Writes the default log-message for the action of calling the Set-part of a Property to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Property</param>
+            <param name="PropertyName">The name of the Property</param>
+            <param name="value">The value the Property is set to</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMethodEnter(Npgsql.LogLevel,System.String,System.String)">
+            <summary>
+            Writes the default log-message for the action of calling a Method without Arguments to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Method</param>
+            <param name="MethodName">The name of the Method</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMethodEnter(Npgsql.LogLevel,System.String,System.String,System.Object)">
+            <summary>
+            Writes the default log-message for the action of calling a Method with one Argument to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Method</param>
+            <param name="MethodName">The name of the Method</param>
+            <param name="MethodParameter">The value of the Argument of the Method</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMethodEnter(Npgsql.LogLevel,System.String,System.String,System.Object,System.Object)">
+            <summary>
+            Writes the default log-message for the action of calling a Method with two Arguments to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Method</param>
+            <param name="MethodName">The name of the Method</param>
+            <param name="MethodParameter1">The value of the first Argument of the Method</param>
+            <param name="MethodParameter2">The value of the second Argument of the Method</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMethodEnter(Npgsql.LogLevel,System.String,System.String,System.Object,System.Object,System.Object)">
+            <summary>
+            Writes the default log-message for the action of calling a Method with three Arguments to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Method</param>
+            <param name="MethodName">The name of the Method</param>
+            <param name="MethodParameter1">The value of the first Argument of the Method</param>
+            <param name="MethodParameter2">The value of the second Argument of the Method</param>
+            <param name="MethodParameter3">The value of the third Argument of the Method</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMethodEnter(Npgsql.LogLevel,System.String,System.String,System.Object[])">
+            <summary>
+            Writes the default log-message for the action of calling a Method with more than three Arguments to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Method</param>
+            <param name="MethodName">The name of the Method</param>
+            <param name="MethodParameters">A <see cref="T:System.Object">Object</see>-Array with zero or more Ojects that are Arguments of the Method.</param>
+        </member>
+        <member name="P:Npgsql.NpgsqlEventLog.Level">
+            <summary>
+             Sets/Returns the level of information to log to the logfile.
+             </summary>
+             <value>The current <see cref="T:Npgsql.LogLevel">LogLevel</see></value>
+        </member>
+        <member name="P:Npgsql.NpgsqlEventLog.LogName">
+            <summary>
+             Sets/Returns the filename to use for logging.
+             </summary>
+             <value>The filename of the current Log file.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlEventLog.EchoMessages">
+            <summary>
+             Sets/Returns whether Log messages should be echoed to the console
+             </summary>
+             <value><b>true</b> if Log messages are echoed to the console, otherwise <b>false</b></value>
+        </member>
+        <member name="T:Npgsql.NpgsqlException">
+            <summary>
+            The exception that is thrown when the PostgreSQL backend reports errors.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlException.#ctor(System.Collections.IList)">
+            <summary>
+            Construct a backend error exception based on a list of one or more
+            backend errors.  The basic Exception.Message will be built from the
+            first (usually the only) error in the list.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlException.ToString">
+            <summary>
+            Format a .NET style exception string.
+            Include all errors in the list, including any hints.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlException.AppendString(System.IO.StringWriter,System.String,System.String)">
+            <summary>
+            Append a line to the given Stream, first checking for zero-length.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Item(System.Int32)">
+            <summary>
+            Provide access to the entire list of errors provided by the PostgreSQL backend.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Severity">
+            <summary>
+            Severity code.  All versions.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Code">
+            <summary>
+            Error code.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.BaseMessage">
+            <summary>
+            Basic error message.  All versions.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Detail">
+            <summary>
+            Detailed error message.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Hint">
+            <summary>
+            Suggestion to help resolve the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Position">
+            <summary>
+            Position (one based) within the query string where the error was encounterd.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Where">
+            <summary>
+            Trace back information.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.File">
+            <summary>
+            Source file (in backend) reporting the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Line">
+            <summary>
+            Source file line number (in backend) reporting the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Routine">
+            <summary>
+            Source routine (in backend) reporting the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.ErrorSql">
+            <summary>
+            String containing the sql sent which produced this error.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Errors">
+            <summary>
+            Returns the entire list of errors provided by the PostgreSQL backend.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlExecute">
+             <summary>
+             This class represents the Parse message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlFactory">
+            <summary>
+            A factory to create instances of various Npgsql objects.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlFactory.CreateCommand">
+            <summary>
+            Creates an NpgsqlCommand object.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlFlush">
+             <summary>
+             This class represents the Parse message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlMediator">
+            <summary>
+             This class is responsible for serving as bridge between the backend
+             protocol handling and the core classes. It is used as the mediator for
+             exchanging data generated/sent from/to backend.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlNotificationEventArgs">
+            <summary>
+            EventArgs class to send Notification parameters.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlNotificationEventArgs.PID">
+            <summary>
+            Process ID of the PostgreSQL backend that sent this notification.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlNotificationEventArgs.Condition">
+            <summary>
+            Condition that triggered that notification.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlNotificationEventArgs.AdditionalInformation">
+            <summary>
+            Additional Information From Notifiying Process (for future use, currently postgres always sets this to an empty string)
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlParameter">
+            <summary>
+             This class represents a parameter to a command that will be sent to server
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> class.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.#ctor(System.String,System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+            class with the parameter m_Name and a value of the new <b>NpgsqlParameter</b>.
+            </summary>
+            <param m_Name="parameterName">The m_Name of the parameter to map.</param>
+            <param m_Name="value">An <see cref="T:System.Object">Object</see> that is the value of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>.</param>
+            <remarks>
+            <p>When you specify an <see cref="T:System.Object">Object</see>
+            in the value parameter, the <see cref="T:System.Data.DbType">DbType</see> is
+            inferred from the .NET Framework type of the <b>Object</b>.</p>
+            <p>When using this constructor, you must be aware of a possible misuse of the constructor which takes a DbType parameter.
+            This happens when calling this constructor passing an int 0 and the compiler thinks you are passing a value of DbType.
+            Use <code> Convert.ToInt32(value) </code> for example to have compiler calling the correct constructor.</p>
+            </remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.#ctor(System.String,NpgsqlTypes.NpgsqlDbType)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+            class with the parameter m_Name and the data type.
+            </summary>
+            <param m_Name="parameterName">The m_Name of the parameter to map.</param>
+            <param m_Name="parameterType">One of the <see cref="T:System.Data.DbType">DbType</see> values.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.#ctor(System.String,NpgsqlTypes.NpgsqlDbType,System.Int32)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+            class with the parameter m_Name, the <see cref="T:System.Data.DbType">DbType</see>, and the size.
+            </summary>
+            <param m_Name="parameterName">The m_Name of the parameter to map.</param>
+            <param m_Name="parameterType">One of the <see cref="T:System.Data.DbType">DbType</see> values.</param>
+            <param m_Name="size">The length of the parameter.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.#ctor(System.String,NpgsqlTypes.NpgsqlDbType,System.Int32,System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+            class with the parameter m_Name, the <see cref="T:System.Data.DbType">DbType</see>, the size,
+            and the source column m_Name.
+            </summary>
+            <param m_Name="parameterName">The m_Name of the parameter to map.</param>
+            <param m_Name="parameterType">One of the <see cref="T:System.Data.DbType">DbType</see> values.</param>
+            <param m_Name="size">The length of the parameter.</param>
+            <param m_Name="sourceColumn">The m_Name of the source column.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.#ctor(System.String,NpgsqlTypes.NpgsqlDbType,System.Int32,System.String,System.Data.ParameterDirection,System.Boolean,System.Byte,System.Byte,System.Data.DataRowVersion,System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+            class with the parameter m_Name, the <see cref="T:System.Data.DbType">DbType</see>, the size,
+            the source column m_Name, a <see cref="T:System.Data.ParameterDirection">ParameterDirection</see>,
+            the precision of the parameter, the scale of the parameter, a
+            <see cref="T:System.Data.DataRowVersion">DataRowVersion</see> to use, and the
+            value of the parameter.
+            </summary>
+            <param m_Name="parameterName">The m_Name of the parameter to map.</param>
+            <param m_Name="parameterType">One of the <see cref="T:System.Data.DbType">DbType</see> values.</param>
+            <param m_Name="size">The length of the parameter.</param>
+            <param m_Name="sourceColumn">The m_Name of the source column.</param>
+            <param m_Name="direction">One of the <see cref="T:System.Data.ParameterDirection">ParameterDirection</see> values.</param>
+            <param m_Name="isNullable"><b>true</b> if the value of the field can be null, otherwise <b>false</b>.</param>
+            <param m_Name="precision">The total number of digits to the left and right of the decimal point to which
+            <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see> is resolved.</param>
+            <param m_Name="scale">The total number of decimal places to which
+            <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see> is resolved.</param>
+            <param m_Name="sourceVersion">One of the <see cref="T:System.Data.DataRowVersion">DataRowVersion</see> values.</param>
+            <param m_Name="value">An <see cref="T:System.Object">Object</see> that is the value
+            of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.Clone">
+            <summary>
+            Creates a new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> that
+            is a copy of the current instance.
+            </summary>
+            <returns>A new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> that is a copy of this instance.</returns>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.Precision">
+            <summary>
+            Gets or sets the maximum number of digits used to represent the
+            <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see> property.
+            </summary>
+            <value>The maximum number of digits used to represent the
+            <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see> property.
+            The default value is 0, which indicates that the data provider
+            sets the precision for <b>Value</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.Scale">
+            <summary>
+            Gets or sets the number of decimal places to which
+            <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see> is resolved.
+            </summary>
+            <value>The number of decimal places to which
+            <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see> is resolved. The default is 0.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.Size">
+            <summary>
+            Gets or sets the maximum size, in bytes, of the data within the column.
+            </summary>
+            <value>The maximum size, in bytes, of the data within the column.
+            The default value is inferred from the parameter value.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.DbType">
+            <summary>
+            Gets or sets the <see cref="T:System.Data.DbType">DbType</see> of the parameter.
+            </summary>
+            <value>One of the <see cref="T:System.Data.DbType">DbType</see> values. The default is <b>String</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.NpgsqlDbType">
+            <summary>
+            Gets or sets the <see cref="T:System.Data.DbType">DbType</see> of the parameter.
+            </summary>
+            <value>One of the <see cref="T:System.Data.DbType">DbType</see> values. The default is <b>String</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.Direction">
+            <summary>
+            Gets or sets a value indicating whether the parameter is input-only,
+            output-only, bidirectional, or a stored procedure return value parameter.
+            </summary>
+            <value>One of the <see cref="T:System.Data.ParameterDirection">ParameterDirection</see>
+            values. The default is <b>Input</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.IsNullable">
+            <summary>
+            Gets or sets a value indicating whether the parameter accepts null values.
+            </summary>
+            <value><b>true</b> if null values are accepted; otherwise, <b>false</b>. The default is <b>false</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.ParameterName">
+            <summary>
+            Gets or sets the m_Name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>.
+            </summary>
+            <value>The m_Name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>.
+            The default is an empty string.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.CleanName">
+            <summary>
+            The m_Name scrubbed of any optional marker
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.SourceColumn">
+            <summary>
+            Gets or sets the m_Name of the source column that is mapped to the
+            <see cref="T:System.Data.DataSet">DataSet</see> and used for loading or
+            returning the <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see>.
+            </summary>
+            <value>The m_Name of the source column that is mapped to the
+            <see cref="T:System.Data.DataSet">DataSet</see>. The default is an empty string.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.SourceVersion">
+            <summary>
+            Gets or sets the <see cref="T:System.Data.DataRowVersion">DataRowVersion</see>
+            to use when loading <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see>.
+            </summary>
+            <value>One of the <see cref="T:System.Data.DataRowVersion">DataRowVersion</see> values.
+            The default is <b>Current</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.Value">
+            <summary>
+            Gets or sets the value of the parameter.
+            </summary>
+            <value>An <see cref="T:System.Object">Object</see> that is the value of the parameter.
+            The default value is null.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.NpgsqlValue">
+            <summary>
+            Gets or sets the value of the parameter.
+            </summary>
+            <value>An <see cref="T:System.Object">Object</see> that is the value of the parameter.
+            The default value is null.</value>
+        </member>
+        <member name="T:Npgsql.NpgsqlParameterCollection">
+            <summary>
+            Represents a collection of parameters relevant to a <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see>
+            as well as their respective mappings to columns in a <see cref="T:System.Data.DataSet">DataSet</see>.
+            This class cannot be inherited.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.#ctor">
+            <summary>
+            Initializes a new instance of the NpgsqlParameterCollection class.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Add(Npgsql.NpgsqlParameter)">
+            <summary>
+            Adds the specified <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see>.
+            </summary>
+            <param name="value">The <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to add to the collection.</param>
+            <returns>The index of the new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Add(System.String,System.Object)">
+            <summary>
+            Adds a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see> given the specified parameter name and value.
+            </summary>
+            <param name="parameterName">The name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>.</param>
+            <param name="value">The Value of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to add to the collection.</param>
+            <returns>The index of the new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+            <remarks>
+            Use caution when using this overload of the
+            <b>Add</b> method to specify integer parameter values.
+            Because this overload takes a <i>value</i> of type Object,
+            you must convert the integral value to an <b>Object</b>
+            type when the value is zero, as the following C# example demonstrates.
+            <code>parameters.Add(":pname", Convert.ToInt32(0));</code>
+            If you do not perform this conversion, the compiler will assume you
+            are attempting to call the NpgsqlParameterCollection.Add(string, DbType) overload.
+            </remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Add(System.String,NpgsqlTypes.NpgsqlDbType)">
+            <summary>
+            Adds a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see> given the parameter name and the data type.
+            </summary>
+            <param name="parameterName">The name of the parameter.</param>
+            <param name="parameterType">One of the DbType values.</param>
+            <returns>The index of the new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Add(System.String,NpgsqlTypes.NpgsqlDbType,System.Int32)">
+            <summary>
+            Adds a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see> with the parameter name, the data type, and the column length.
+            </summary>
+            <param name="parameterName">The name of the parameter.</param>
+            <param name="parameterType">One of the DbType values.</param>
+            <param name="size">The length of the column.</param>
+            <returns>The index of the new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Add(System.String,NpgsqlTypes.NpgsqlDbType,System.Int32,System.String)">
+            <summary>
+            Adds a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see> with the parameter name, the data type, the column length, and the source column name.
+            </summary>
+            <param name="parameterName">The name of the parameter.</param>
+            <param name="parameterType">One of the DbType values.</param>
+            <param name="size">The length of the column.</param>
+            <param name="sourceColumn">The name of the source column.</param>
+            <returns>The index of the new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.RemoveAt(System.String)">
+            <summary>
+            Removes the specified <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> from the collection using the parameter name.
+            </summary>
+            <param name="parameterName">The name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to retrieve.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Contains(System.String)">
+            <summary>
+            Gets a value indicating whether a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> with the specified parameter name exists in the collection.
+            </summary>
+            <param name="parameterName">The name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to find.</param>
+            <returns><b>true</b> if the collection contains the parameter; otherwise, <b>false</b>.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.IndexOf(System.String)">
+            <summary>
+            Gets the location of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> in the collection with a specific parameter name.
+            </summary>
+            <param name="parameterName">The name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to find.</param>
+            <returns>The zero-based location of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> in the collection.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.RemoveAt(System.Int32)">
+            <summary>
+            Removes the specified <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> from the collection using a specific index.
+            </summary>
+            <param name="index">The zero-based index of the parameter.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Insert(System.Int32,System.Object)">
+            <summary>
+            Inserts a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> into the collection at the specified index.
+            </summary>
+            <param name="index">The zero-based index where the parameter is to be inserted within the collection.</param>
+            <param name="value">The <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to add to the collection.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Remove(System.Object)">
+            <summary>
+            Removes the specified <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> from the collection.
+            </summary>
+            <param name="value">The <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to remove from the collection.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Contains(System.Object)">
+            <summary>
+            Gets a value indicating whether a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> exists in the collection.
+            </summary>
+            <param name="value">The value of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to find.</param>
+            <returns>true if the collection contains the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object; otherwise, false.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.TryGetValue(System.String,Npgsql.NpgsqlParameter@)">
+            <summary>
+            Gets a value indicating whether a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> with the specified parameter name exists in the collection.
+            </summary>
+            <param name="parameterName">The name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to find.</param>
+            <param name="parameter">A reference to the requested parameter is returned in this out param if it is found in the list.  This value is null if the parameter is not found.</param>
+            <returns><b>true</b> if the collection contains the parameter and param will contain the parameter; otherwise, <b>false</b>.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Clear">
+            <summary>
+            Removes all items from the collection.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.IndexOf(System.Object)">
+            <summary>
+            Gets the location of a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> in the collection.
+            </summary>
+            <param name="value">The value of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to find.</param>
+            <returns>The zero-based index of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object in the collection.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Add(System.Object)">
+            <summary>
+            Adds the specified <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see>.
+            </summary>
+            <param name="value">The <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to add to the collection.</param>
+            <returns>The zero-based index of the new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.CopyTo(System.Array,System.Int32)">
+            <summary>
+            Copies <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> objects from the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see> to the specified array.
+            </summary>
+            <param name="array">An <see cref="T:System.Array">Array</see> to which to copy the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> objects in the collection.</param>
+            <param name="index">The starting index of the array.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.GetEnumerator">
+            <summary>
+            Returns an enumerator that can iterate through the collection.
+            </summary>
+            <returns>An <see cref="T:System.Collections.IEnumerator">IEnumerator</see> that can be used to iterate through the collection.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.CheckType(System.Object)">
+            <summary>
+            In methods taking an object as argument this method is used to verify
+            that the argument has the type <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+            </summary>
+            <param name="Object">The object to verify</param>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameterCollection.Item(System.String)">
+            <summary>
+            Gets the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> with the specified name.
+            </summary>
+            <param name="parameterName">The name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to retrieve.</param>
+            <value>The <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> with the specified name, or a null reference if the parameter is not found.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameterCollection.Item(System.Int32)">
+            <summary>
+            Gets the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> at the specified index.
+            </summary>
+            <param name="index">The zero-based index of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to retrieve.</param>
+            <value>The <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> at the specified index.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameterCollection.Count">
+            <summary>
+            Gets the number of <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> objects in the collection.
+            </summary>
+            <value>The number of <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> objects in the collection.</value>
+        </member>
+        <member name="T:Npgsql.NpgsqlParameterStatus">
+             <summary>
+             This class represents the ParameterStatus message sent from PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlParse">
+             <summary>
+             This class represents the Parse message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlPasswordPacket">
+            <summary>
+            This class represents a PasswordPacket message sent to backend
+            PostgreSQL.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlPromotableSinglePhaseNotification.Prepare">
+            <summary>
+            Used when a connection is closed
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlQuery">
+            <summary>
+            Summary description for NpgsqlQuery
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlRow">
+            <summary>
+            This is the abstract base class for NpgsqlAsciiRow and NpgsqlBinaryRow.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlRowDescription">
+             <summary>
+             This class represents a RowDescription message sent from
+             the PostgreSQL.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlRowDescription.FieldData">
+            <summary>
+            This struct represents the internal data of the RowDescription message.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlSchema">
+            <summary>
+            Provides the underlying mechanism for reading schema information.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.#ctor(Npgsql.NpgsqlConnection)">
+            <summary>
+            Creates an NpgsqlSchema that can read schema information from the database.
+            </summary>
+            <param name="connection">An open database connection for reading metadata.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetMetaDataCollections">
+            <summary>
+            Returns the MetaDataCollections that lists all possible collections.
+            </summary>
+            <returns>The MetaDataCollections</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetRestrictions">
+            <summary>
+            Returns the Restrictions that contains the meaning and position of the values in the restrictions array.
+            </summary>
+            <returns>The Restrictions</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetDatabases(System.String[])">
+            <summary>
+            Returns the Databases that contains a list of all accessable databases.
+            </summary>
+            <param name="restrictions">The restrictions to filter the collection.</param>
+            <returns>The Databases</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetTables(System.String[])">
+            <summary>
+            Returns the Tables that contains table and view names and the database and schema they come from.
+            </summary>
+            <param name="restrictions">The restrictions to filter the collection.</param>
+            <returns>The Tables</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetColumns(System.String[])">
+            <summary>
+            Returns the Columns that contains information about columns in tables. 
+            </summary>
+            <param name="restrictions">The restrictions to filter the collection.</param>
+            <returns>The Columns.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetViews(System.String[])">
+            <summary>
+            Returns the Views that contains view names and the database and schema they come from.
+            </summary>
+            <param name="restrictions">The restrictions to filter the collection.</param>
+            <returns>The Views</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetUsers(System.String[])">
+            <summary>
+            Returns the Users containing user names and the sysid of those users.
+            </summary>
+            <param name="restrictions">The restrictions to filter the collection.</param>
+            <returns>The Users.</returns>
+        </member>
+        <member name="T:Npgsql.NpgsqlStartupPacket">
+             <summary>
+             This class represents a StartupPacket message of PostgreSQL
+             protocol.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.CompletedResponse">
+            <summary>
+            Represents a completed response message.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlSync">
+             <summary>
+             This class represents the Parse message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlTransaction">
+            <summary>
+            Represents a transaction to be made in a PostgreSQL database. This class cannot be inherited.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlTransaction.Commit">
+            <summary>
+            Commits the database transaction.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlTransaction.Rollback">
+            <summary>
+            Rolls back a transaction from a pending state.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlTransaction.Rollback(System.String)">
+            <summary>
+            Rolls back a transaction from a pending savepoint state.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlTransaction.Save(System.String)">
+            <summary>
+            Creates a transaction save point.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlTransaction.Cancel">
+            <summary>
+            Cancel the transaction without telling the backend about it.  This is
+            used to make the transaction go away when closing a connection.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlTransaction.Connection">
+            <summary>
+            Gets the <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>
+            object associated with the transaction, or a null reference if the
+            transaction is no longer valid.
+            </summary>
+            <value>The <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>
+            object associated with the transaction.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlTransaction.IsolationLevel">
+            <summary>
+            Specifies the <see cref="T:System.Data.IsolationLevel">IsolationLevel</see> for this transaction.
+            </summary>
+            <value>The <see cref="T:System.Data.IsolationLevel">IsolationLevel</see> for this transaction.
+            The default is <b>ReadCommitted</b>.</value>
+        </member>
+        <member name="T:Npgsql.PGUtil">
+            <summary>
+             This class provides many util methods to handle
+             reading and writing of PostgreSQL protocol messages.
+             </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.ConvertProtocolVersion(Npgsql.ProtocolVersion)">
+            <summary>
+             This method takes a ProtocolVersion and returns an integer
+             version number that the Postgres backend will recognize in a
+             startup packet.
+             </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.ExtractServerVersion(System.String)">
+            <summary>
+            This method takes a version string as returned by SELECT VERSION() and returns
+            a valid version string ("7.2.2" for example).
+            This is only needed when running protocol version 2.
+            This does not do any validity checks.
+            </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.ReadString(System.IO.Stream)">
+            <summary>
+             This method gets a C NULL terminated string from the network stream.
+             It keeps reading a byte in each time until a NULL byte is returned.
+             It returns the resultant string of bytes read.
+             This string is sent from backend.
+             </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.ReadBytes(System.IO.Stream,System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Reads requested number of bytes from stream with retries until Stream.Read returns 0 or count is reached.
+            </summary>
+            <param name="stream">Stream to read</param>
+            <param name="buffer">byte buffer to fill</param>
+            <param name="offset">starting position to fill the buffer</param>
+            <param name="count">number of bytes to read</param>
+            <returns>The number of bytes read.  May be less than count if no more bytes are available.</returns>
+        </member>
+        <member name="M:Npgsql.PGUtil.WriteString(System.String,System.IO.Stream)">
+            <summary>
+             This method writes a C NULL terminated string to the network stream.
+             It appends a NULL terminator to the end of the String.
+             </summary>
+            <summary>
+             This method writes a C NULL terminated string to the network stream.
+             It appends a NULL terminator to the end of the String.
+             </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.WriteBytes(System.Byte[],System.IO.Stream)">
+            <summary>
+            This method writes a set of bytes to the stream. It also enables logging of them.
+            </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.WriteLimString(System.String,System.Int32,System.IO.Stream)">
+            <summary>
+             This method writes a C NULL terminated string limited in length to the
+             backend server.
+             It pads the string with null bytes to the size specified.
+             </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.WriteInt32(System.IO.Stream,System.Int32)">
+            <summary>
+            Write a 32-bit integer to the given stream in the correct byte order.
+            </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.ReadInt32(System.IO.Stream)">
+            <summary>
+            Read a 32-bit integer from the given stream in the correct byte order.
+            </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.WriteInt16(System.IO.Stream,System.Int16)">
+            <summary>
+            Write a 16-bit integer to the given stream in the correct byte order.
+            </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.ReadInt16(System.IO.Stream)">
+            <summary>
+            Read a 16-bit integer from the given stream in the correct byte order.
+            </summary>
+        </member>
+        <member name="T:Npgsql.ProtocolVersion">
+            <summary>
+            Represent the frontend/backend protocol version.
+            </summary>
+        </member>
+        <member name="T:Npgsql.ServerVersion">
+            <summary>
+            Represent the backend server version.
+            As this class offers no functionality beyond that offered by <see cref="T:System.Version"/> it has been
+            deprecated in favour of that class.
+            </summary>
+            
+        </member>
+        <member name="M:Npgsql.ServerVersion.ToString">
+            <summary>
+            Returns the string representation of this version in three place dot notation (Major.Minor.Patch).
+            </summary>
+        </member>
+        <member name="P:Npgsql.ServerVersion.Major">
+            <summary>
+            Server version major number.
+            </summary>
+        </member>
+        <member name="P:Npgsql.ServerVersion.Minor">
+            <summary>
+            Server version minor number.
+            </summary>
+        </member>
+        <member name="P:Npgsql.ServerVersion.Patch">
+            <summary>
+            Server version patch level number.
+            </summary>
+        </member>
+        <member name="T:Npgsql.SSPIHandler">
+            <summary>
+            A class to handle everything associated with SSPI authentication
+            </summary>
+        </member>
+        <member name="T:Npgsql.SSPIHandler.SecBufferDesc">
+            <summary>
+            Simplified SecBufferDesc struct with only one SecBuffer
+            </summary>
+        </member>
+    </members>
+</doc>
Binary file packages/Npgsql.2.0.14.3/lib/net35/de/Npgsql.resources.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net35/es/Npgsql.resources.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net35/fi/Npgsql.resources.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net35/fr/Npgsql.resources.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net35/ja/Npgsql.resources.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net35/zh-CN/Npgsql.resources.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net40/Mono.Security.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net40/Npgsql.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/Npgsql.2.0.14.3/lib/net40/Npgsql.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4705 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>Npgsql</name>
+    </assembly>
+    <members>
+        <member name="T:NpgsqlTypes.ArrayNativeToBackendTypeConverter">
+            <summary>
+            Handles serialisation of .NET array or IEnumeration to pg format.
+            Arrays of arrays, enumerations of enumerations, arrays of enumerations etc.
+            are treated as multi-dimensional arrays (in much the same manner as an array of arrays
+            is used to emulate multi-dimensional arrays in languages that lack native support for them).
+            If such an enumeration of enumerations is "jagged" (as opposed to rectangular, cuboid,
+            hypercuboid, hyperhypercuboid, etc) then this class will "correctly" serialise it, but pg
+            will raise an error as it doesn't allow jagged arrays.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayNativeToBackendTypeConverter.#ctor(NpgsqlTypes.NpgsqlNativeTypeInfo)">
+            <summary>
+            Create an ArrayNativeToBackendTypeConverter with the element converter passed
+            </summary>
+            <param name="elementConverter">The <see cref="T:NpgsqlTypes.NpgsqlNativeTypeInfo"/> that would be used to serialise the element type.</param>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayNativeToBackendTypeConverter.FromArray(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Serialise the enumeration or array.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.ArrayBackendToNativeTypeConverter">
+            <summary>
+            Handles parsing of pg arrays into .NET arrays.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.TokenEnumeration(System.String)">
+            <summary>
+            Takes a string representation of a pg 1-dimensional array
+            (or a 1-dimensional row within an n-dimensional array)
+            and allows enumeration of the string represenations of each items.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.ArrayChunkEnumeration(System.String)">
+            <summary>
+            Takes a string representation of a pg n-dimensional array
+            and allows enumeration of the string represenations of the next
+            lower level of rows (which in turn can be taken as (n-1)-dimensional arrays.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.RecursiveArrayListEnumeration(System.Collections.ArrayList)">
+            <summary>
+            Takes an ArrayList which may be an ArrayList of ArrayLists, an ArrayList of ArrayLists of ArrayLists
+            and so on and enumerates the items that aren't ArrayLists (the leaf nodes if we think of the ArrayList
+            passed as a tree). Simply uses the ArrayLists' own IEnumerators to get that of the next,
+            pushing them onto a stack until we hit something that isn't an ArrayList.
+            <param name="list"><see cref="T:System.Collections.ArrayList">ArrayList</see> to enumerate</param>
+            <returns><see cref="T:System.Collections.IEnumerable">IEnumerable</see></returns>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.#ctor(NpgsqlTypes.NpgsqlBackendTypeInfo)">
+            <summary>
+            Create a new ArrayBackendToNativeTypeConverter
+            </summary>
+            <param name="elementConverter"><see cref="T:NpgsqlTypes.NpgsqlBackendTypeInfo"/> for the element type.</param>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.ToArray(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Creates an array from pg representation.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.ToArrayList(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Creates an array list from pg represenation of an array.
+            Multidimensional arrays are treated as ArrayLists of ArrayLists
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.ToArray(System.Collections.ArrayList,System.Type)">
+            <summary>
+            Creates an n-dimensional array from an ArrayList of ArrayLists or
+            a 1-dimensional array from something else. 
+            </summary>
+            <param name="list"><see cref="T:System.Collections.ArrayList"/> to convert</param>
+            <returns><see cref="T:System.Array"/> produced.</returns>
+        </member>
+        <member name="T:NpgsqlTypes.ArrayBackendToNativeTypeConverter.IntSetIterator">
+            <summary>
+            Takes an array of ints and treats them like the limits of a set of counters.
+            Retains a matching set of ints that is set to all zeros on the first ++
+            On a ++ it increments the "right-most" int. If that int reaches it's 
+            limit it is set to zero and the one before it is incremented, and so on.
+            
+            Making this a more general purpose class is pretty straight-forward, but we'll just put what we need here.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.BitString">
+            <summary>
+            <para>Implements a bit string; a collection of zero or more bits which can each be 1 or 0.</para>
+            <para>BitString's behave as a list of bools, though like most strings and unlike most collections the position
+            tends to be of as much significance as the value.</para>
+            <para>BitStrings are often used as masks, and are commonly cast to and from other values.</para>
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.BitString.Empty">
+            <summary>
+            Represents the empty string.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.#ctor(System.Collections.Generic.IEnumerable{System.Boolean})">
+            <summary>
+            Create a BitString from an enumeration of boolean values. The BitString will contain
+            those booleans in the order they came in.
+            </summary>
+            <param name="bits">The boolean values.</param>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.#ctor(System.Boolean,System.Int32)">
+            <summary>
+            Creates a BitString filled with a given number of true or false values.
+            </summary>
+            <param name="value">The value to fill the string with.</param>
+            <param name="count">The number of bits to fill.</param>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.#ctor(System.String)">
+            <summary>
+            Creats a bitstring from a <see cref="T:System.String">string</see>.
+            <param name="str">The <see cref="T:System.String">string to copy from</see>.</param>
+            <seealso cref="!:Npgsql.BitString.Parse(System.String)"/>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.#ctor(System.Boolean)">
+            <summary>
+            Creates a single-bit element from a boolean value.
+            </summary>
+            <param name="boolean">The <see cref="T:System.Boolean">bool</see> value which determines whether
+            the bit is 1 or 0.</param>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.#ctor(System.UInt32)">
+            <summary>
+            Creates a bitstring from an unsigned integer value. The string will be the shortest required to
+            contain the integer (e.g. 1 bit for 0 or 1, 2 for 2 or 3, 3 for 4-7, and so on).
+            </summary>
+            <param name="integer">The <see cref="T:System.UInt32">integer</see>.</param>
+            <remarks>This method is not CLS Compliant, and may not be available to some languages.</remarks>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.#ctor(System.Int32)">
+            <summary>
+            Creates a bitstring from an integer value. The string will be the shortest required to
+            contain the integer (e.g. 1 bit for 0 or 1, 2 for 2 or 3, 3 for 4-7, and so on).
+            </summary>
+            <param name="integer">The <see cref="T:System.Int32">integer</see>.</param>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.IndexOf(System.Boolean)">
+            <summary>
+            Finds the first instance of a given value
+            </summary>
+            <param name="item">The value - whether true or false - to search for.</param>
+            <returns>The index of the value found, or -1 if none are present.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Contains(System.Boolean)">
+            <summary>
+            True if there is at least one bit with the value looked for.
+            </summary>
+            <param name="item">The value - true or false - to detect.</param>
+            <returns>True if at least one bit was the same as item, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.CopyTo(System.Boolean[],System.Int32)">
+            <summary>
+            Copies the bitstring to an array of bools.
+            </summary>
+            <param name="array">The <see cref="T:System.Boolean">boolean</see> array to copy to.</param>
+            <param name="arrayIndex">The index in the array to start copying from.</param>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.GetEnumerator">
+            <summary>
+            Returns an enumerator that enumerates through the string.
+            </summary>
+            <returns>The enumerator.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Concat(NpgsqlTypes.BitString)">
+            <summary>
+            Creats a bitstring by concatenating another onto this one.
+            </summary>
+            <param name="append">The string to append to this one.</param>
+            <returns>The combined strings.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Substring(System.Int32,System.Int32)">
+            <summary>
+            Returns a substring of this string.
+            </summary>
+            <param name="start">The position to start from, must be between 0 and the length of the string.</param>
+            <param name="length">The length of the string to return, must be greater than zero, and may not be
+            so large that the start + length exceeds the bounds of this instance.</param>
+            <returns>The Bitstring identified</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Substring(System.Int32)">
+            <summary>
+            Returns a substring of this string.
+            </summary>
+            <param name="start">The position to start from, must be between 0 and the length of the string,
+            the rest of the string is returned.</param>
+            <returns>The Bitstring identified</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.And(NpgsqlTypes.BitString)">
+            <summary>
+            A logical and between this string and another. The two strings must be the same length.
+            </summary>
+            <param name="operand">Another BitString to AND with this one.</param>
+            <returns>A bitstring with 1 where both BitStrings had 1 and 0 otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Or(NpgsqlTypes.BitString)">
+            <summary>
+            A logical or between this string and another. The two strings must be the same length.
+            </summary>
+            <param name="operand">Another BitString to OR with this one.</param>
+            <returns>A bitstring with 1 where either BitString had 1 and 0 otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Xor(NpgsqlTypes.BitString)">
+            <summary>
+            A logical xor between this string and another. The two strings must be the same length.
+            </summary>
+            <param name="operand">Another BitString to XOR with this one.</param>
+            <returns>A bitstring with 1 where one BitStrings and the other had 0,
+            and 0 where they both had 1 or both had 0.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Not">
+            <summary>
+            A bitstring that is the logical inverse of this one.
+            </summary>
+            <returns>A bitstring of the same length as this with 1 where this has 0 and vice-versa.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.LShift(System.Int32)">
+            <summary>
+            Shifts the string operand bits to the left, filling with zeros to produce a
+            string of the same length.
+            </summary>
+            <param name="operand">The number of bits to shift to the left.</param>
+            <returns>A left-shifted bitstring.</returns>
+            <remarks><para>The behaviour of LShift is closer to what one would expect from dealing
+            with PostgreSQL bit-strings than in using the same operations on integers in .NET</para>
+            <para>In particular, negative operands result in a right-shift, and operands greater than
+            the length of the string will shift it entirely, resulting in a zero-filled string.</para>
+            </remarks>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.RShift(System.Int32)">
+            <summary>
+            Shifts the string operand bits to the right, filling with zeros to produce a
+            string of the same length.
+            </summary>
+            <param name="operand">The number of bits to shift to the right.</param>
+            <returns>A right-shifted bitstring.</returns>
+            <remarks><para>The behaviour of RShift is closer to what one would expect from dealing
+            with PostgreSQL bit-strings than in using the same operations on integers in .NET</para>
+            <para>In particular, negative operands result in a left-shift, and operands greater than
+            the length of the string will shift it entirely, resulting in a zero-filled string. It also performs
+            a logical shift, rather than an arithmetic shift, so it always sets the vacated bit positions to zero
+            (like PostgreSQL and like .NET for unsigned integers but not for signed integers).</para>
+            </remarks>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Equals(NpgsqlTypes.BitString)">
+            <summary>
+            Returns true if the this string is identical to the argument passed.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.CompareTo(NpgsqlTypes.BitString)">
+            <summary>
+            Compares two strings. Strings are compared as strings, so while 0 being less than 1 will
+            mean a comparison between two strings of the same size is the same as treating them as numbers,
+            in the case of two strings of differing lengths the comparison starts at the right-most (most significant)
+            bit, and if all bits of the shorter string are exhausted without finding a comparison, then the larger
+            string is deemed to be greater than the shorter (0010 is greater than 0001 but less than 00100).
+            </summary>
+            <param name="other">Another string to compare with this one.</param>
+            <returns>A value if the two strings are identical, an integer less
+            than zero if this is less than the argument, and an integer greater
+            than zero otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.CompareTo(System.Object)">
+            <summary>
+            Compares the string with another object.
+            </summary>
+            <param name="obj">The object to compare with.</param>
+            <returns>If the object is null then this string is considered greater. If the object is another BitString
+            then they are compared as in <see cref="!:CompareTo(Npgsql.BitString)">the explicit comparison for BitStrings</see>
+            in any other case a <see cref="T:System.ArgumentException"/> is thrown.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Equals(System.Object)">
+            <summary>
+            Compares this BitString with an object for equality.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.GetHashCode">
+            <summary>
+            Returns a code for use in hashing operations.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToString(System.String)">
+            <summary>
+            Returns a string representation of the BitString.
+            </summary>
+            <param name="format">
+            A string which can contain a letter and optionally a number which sets a minimum size for the string
+            returned. In each case using the lower-case form of the letter will result in a lower-case string
+            being returned.
+            <list type="table">
+            <item>
+            <term>B</term>
+            <description>A string of 1s and 0s.</description>
+            </item>
+            <item>
+            <term>X</term>
+            <description>An hexadecimal string (will result in an error unless the string's length is divisible by 4).</description>
+            </item>
+            <item>
+            <term>G</term>
+            <description>A string of 1s and 0s in single-quotes preceded by 'B' (Postgres bit string literal syntax).</description>
+            </item>
+            <term>Y</term>
+            <description>An hexadecimal string in single-quotes preceded by 'X' (Postgres bit literal syntax, will result in an error unless the string's length is divisible by 4.</description>
+            </list>
+            <term>C</term>
+            <description>The format produced by format-string "Y" if legal, otherwise that produced by format-string "G".</description>
+            <term>E</term>
+            <description>The most compact safe representation for Postgres. If single bit will be either a 0 or a 1. Otherwise if it
+            can be that produce by format string "Y" it will, otherwise if there are less than 9bits in length it will be that
+            produced by format-string "G". For longer strings that cannot be represented in hexadecimal it will be a string
+            representing the first part of the string in format "Y" followed by the PostgreSQL concatenation operator, followed
+            by the final bits in the format "G". E.g. "X'13DCE'||B'110'"</description>
+            If format is empty or null, it is treated as if "B" had been passed (the default repreesentation, and that
+            generally used by PostgreSQL for display).
+            </param>
+            <returns>The formatted string.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToString">
+            <summary>
+            Returns a string representation for the Bitstring
+            </summary>
+            <returns>A string containing '0' and '1' characters.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToString(System.String,System.IFormatProvider)">
+            <summary>
+            Returns the same string as <see cref="M:NpgsqlTypes.BitString.ToString(System.String)"/>. formatProvider is ignored.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Parse(System.String)">
+            <summary>
+            Parses a string to produce a BitString. Most formats that can be produced by
+            <see cref="M:NpgsqlTypes.BitString.ToString(System.String)"/> can be accepted, but hexadecimal
+            can be interpreted with the preceding X' to mark the following characters as
+            being hexadecimal rather than binary.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_BitwiseAnd(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Performs a logical AND on the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_BitwiseOr(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Performs a logcial OR on the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_ExclusiveOr(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Perofrms a logical EXCLUSIVE-OR on the two operands
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_OnesComplement(NpgsqlTypes.BitString)">
+            <summary>
+            Performs a logical NOT on the operand.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_Addition(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Concatenates the operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_LeftShift(NpgsqlTypes.BitString,System.Int32)">
+            <summary>
+            Left-shifts the string BitString.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_RightShift(NpgsqlTypes.BitString,System.Int32)">
+            <summary>
+            Right-shifts the string BitString.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_Equality(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Compares the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_Inequality(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Compares the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_LessThan(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Compares the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_GreaterThan(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Compares the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_LessThanOrEqual(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Compares the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_GreaterThanOrEqual(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Compares the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToString(System.Text.Encoding)">
+            <summary>
+            Interprets the bitstring as a series of bits in an encoded character string,
+            encoded according to the Encoding passed, and returns that string.
+            The bitstring must contain a whole number of octets(bytes) and also be
+            valid according to the Encoding passed.
+            </summary>
+            <param name="encoding">The <see cref="T:System.Text.Encoding"/> to use in producing the string.</param>
+            <returns>The string that was encoded in the BitString.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToByteEnumerable">
+            <summary>
+            Interprets the bitstring as a series of octets (bytes) and returns those octets. Fails
+            if the Bitstring does not contain a whole number of octets (its length is not evenly
+            divisible by 8).
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToSByteEnumerable">
+            <summary>
+            Interprets the bitstring as a series of signed octets (bytes) and returns those octets. Fails
+            if the Bitstring does not contain a whole number of octets (its length is not evenly
+            divisible by 8).
+            <remarks>This method is not CLS-Compliant and may not be available to languages that cannot
+            handle signed bytes.</remarks>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToUInt16Enumerable">
+            <summary>
+            Interprets the bitstring as a series of unsigned 16-bit integers and returns those integers.
+            Fails if the Bitstring's length is not evenly divisible by 16.
+            <remarks>This method is not CLS-Compliant and may not be available to languages that cannot
+            handle unsigned integers.</remarks>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToInt16Enumerable">
+            <summary>
+            Interprets the bitstring as a series of 16-bit integers and returns those integers.
+            Fails if the Bitstring's length is not evenly divisible by 16.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToUInt32Enumerable">
+            <summary>
+            Interprets the bitstring as a series of unsigned 32-bit integers and returns those integers.
+            Fails if the Bitstring's length is not evenly divisible by 32.
+            <remarks>This method is not CLS-Compliant and may not be available to languages that cannot
+            handle unsigned integers.</remarks>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToInt32Enumerable">
+            <summary>
+            Interprets the bitstring as a series of signed 32-bit integers and returns those integers.
+            Fails if the Bitstring's length is not evenly divisible by 32.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToUInt64Enumerable">
+            <summary>
+            Interprets the bitstring as a series of unsigned 64-bit integers and returns those integers.
+            Fails if the Bitstring's length is not evenly divisible by 64.
+            <remarks>This method is not CLS-Compliant and may not be available to languages that cannot
+            handle unsigned integers.</remarks>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToInt64Enumerable">
+            <summary>
+            Interprets the bitstring as a series of signed 64-bit integers and returns those integers.
+            Fails if the Bitstring's length is not evenly divisible by 64.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.BitString.Length">
+            <summary>
+            The length of the string.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.BitString.Item(System.Int32)">
+            <summary>
+            Retrieves the value of the bit at the given index.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlInterval">
+            <summary>
+            Represents the PostgreSQL interval datatype.
+            <remarks>PostgreSQL differs from .NET in how it's interval type doesn't assume 24 hours in a day
+            (to deal with 23- and 25-hour days caused by daylight savings adjustments) and has a concept
+            of months that doesn't exist in .NET's <see cref="T:System.TimeSpan"/> class. (Neither datatype
+            has any concessions for leap-seconds).
+            <para>For most uses just casting to and from TimeSpan will work correctly — in particular,
+            the results of subtracting one <see cref="T:System.DateTime"/> or the PostgreSQL date, time and
+            timestamp types from another should be the same whether you do so in .NET or PostgreSQL —
+            but if the handling of days and months in PostgreSQL is important to your application then you
+            should use this class instead of <see cref="T:System.TimeSpan"/>.</para>
+            <para>If you don't know whether these differences are important to your application, they
+            probably arent! Just use <see cref="T:System.TimeSpan"/> and do not use this class directly ☺</para>
+            <para>To avoid forcing unnecessary provider-specific concerns on users who need not be concerned
+            with them a call to <see cref="!:IDataRecord.GetValue(int)"/> on a field containing an
+            <see cref="T:NpgsqlTypes.NpgsqlInterval"/> value will return a <see cref="T:System.TimeSpan"/> rather than an
+            <see cref="T:NpgsqlTypes.NpgsqlInterval"/>. If you need the extra functionality of <see cref="T:NpgsqlTypes.NpgsqlInterval"/>
+            then use <see cref="M:Npgsql.NpgsqlDataReader.GetInterval(System.Int32)"/>.</para>
+            </remarks>
+            <seealso cref="P:NpgsqlTypes.NpgsqlInterval.Ticks"/>
+            <seealso cref="M:NpgsqlTypes.NpgsqlInterval.JustifyDays"/>
+            <seealso cref="M:NpgsqlTypes.NpgsqlInterval.JustifyMonths"/>
+            <seealso cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerMicrosecond">
+            <summary>
+            Represents the number of ticks (100ns periods) in one microsecond. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerMillsecond">
+            <summary>
+            Represents the number of ticks (100ns periods) in one millisecond. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerSecond">
+            <summary>
+            Represents the number of ticks (100ns periods) in one second. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerMinute">
+            <summary>
+            Represents the number of ticks (100ns periods) in one minute. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerHour">
+            <summary>
+            Represents the number of ticks (100ns periods) in one hour. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerDay">
+            <summary>
+            Represents the number of ticks (100ns periods) in one day. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.HoursPerDay">
+            <summary>
+            Represents the number of hours in one day (assuming no daylight savings adjustments). This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.DaysPerMonth">
+            <summary>
+            Represents the number of days assumed in one month if month justification or unjustifcation is performed.
+            This is set to 30 for consistency with PostgreSQL. Note that this is means that month adjustments cause
+            a year to be taken as 30 &#xd7; 12 = 360 rather than 356/366 days.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerMonth">
+            <summary>
+            Represents the number of ticks (100ns periods) in one day, assuming 30 days per month. <seealso cref="F:NpgsqlTypes.NpgsqlInterval.DaysPerMonth"/>
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.MonthsPerYear">
+            <summary>
+            Represents the number of months in a year. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.MaxValue">
+            <summary>
+            Represents the maximum <see cref="T:NpgsqlTypes.NpgsqlInterval"/>. This field is read-only.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.MinValue">
+            <summary>
+            Represents the minimum <see cref="T:NpgsqlTypes.NpgsqlInterval"/>. This field is read-only.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.Zero">
+            <summary>
+            Represents the zero <see cref="T:NpgsqlTypes.NpgsqlInterval"/>. This field is read-only.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.Int64)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to the specified number of ticks.
+            </summary>
+            <param name="ticks">A time period expressed in 100ns units.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.TimeSpan)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to hold the same time as a <see cref="T:System.TimeSpan"/>
+            </summary>
+            <param name="timespan">A time period expressed in a <see cref="T:System.TimeSpan"/></param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.Int32,System.Int32,System.Int64)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to the specified number of months, days
+            &amp; ticks.
+            </summary>
+            <param name="months">Number of months.</param>
+            <param name="days">Number of days.</param>
+            <param name="ticks">Number of 100ns units.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.Int32,System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to the specified number of
+            days, hours, minutes &amp; seconds.
+            </summary>
+            <param name="days">Number of days.</param>
+            <param name="hours">Number of hours.</param>
+            <param name="minutes">Number of minutes.</param>
+            <param name="seconds">Number of seconds.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to the specified number of
+            days, hours, minutes, seconds &amp; milliseconds.
+            </summary>
+            <param name="days">Number of days.</param>
+            <param name="hours">Number of hours.</param>
+            <param name="minutes">Number of minutes.</param>
+            <param name="seconds">Number of seconds.</param>
+            <param name="milliseconds">Number of milliseconds.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to the specified number of
+            months, days, hours, minutes, seconds &amp; milliseconds.
+            </summary>
+            <param name="months">Number of months.</param>
+            <param name="days">Number of days.</param>
+            <param name="hours">Number of hours.</param>
+            <param name="minutes">Number of minutes.</param>
+            <param name="seconds">Number of seconds.</param>
+            <param name="milliseconds">Number of milliseconds.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to the specified number of
+            years, months, days, hours, minutes, seconds &amp; milliseconds.
+            <para>Years are calculated exactly equivalent to 12 months.</para>
+            </summary>
+            <param name="years">Number of years.</param>
+            <param name="months">Number of months.</param>
+            <param name="days">Number of days.</param>
+            <param name="hours">Number of hours.</param>
+            <param name="minutes">Number of minutes.</param>
+            <param name="seconds">Number of seconds.</param>
+            <param name="milliseconds">Number of milliseconds.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromTicks(System.Int64)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of ticks.
+            </summary>
+            <param name="ticks">The number of ticks (100ns units) in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of ticks.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromMicroseconds(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of microseconds.
+            </summary>
+            <param name="ticks">The number of microseconds in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of microseconds.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromMilliseconds(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of milliseconds.
+            </summary>
+            <param name="ticks">The number of milliseconds in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of milliseconds.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromSeconds(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of seconds.
+            </summary>
+            <param name="ticks">The number of seconds in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of seconds.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromMinutes(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of minutes.
+            </summary>
+            <param name="ticks">The number of minutes in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of minutes.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromHours(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of hours.
+            </summary>
+            <param name="ticks">The number of hours in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of hours.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromDays(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of days.
+            </summary>
+            <param name="ticks">The number of days in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of days.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromMonths(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of months.
+            </summary>
+            <param name="ticks">The number of months in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of months.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Add(NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Adds another interval to this instance and returns the result.
+            </summary>
+            <param name="interval">An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to add to this instance.</param>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"></see> whose values are the sums of the two instances.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Subtract(NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Subtracts another interval from this instance and returns the result.
+            </summary>
+            <param name="interval">An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to subtract from this instance.</param>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"></see> whose values are the differences of the two instances.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Negate">
+            <summary>
+            Returns an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> whose value is the negated value of this instance.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> whose value is the negated value of this instance.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Duration">
+            <summary>
+            This absolute value of this instance. In the case of some, but not all, components being negative,
+            the rules used for justification are used to determine if the instance is positive or negative.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> whose value is the absolute value of this instance.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.JustifyDays">
+            <summary>
+            Equivalent to PostgreSQL's justify_days function.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> based on this one, but with any hours outside of the range [-23, 23]
+            converted into days.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.UnjustifyDays">
+            <summary>
+            Opposite to PostgreSQL's justify_days function.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> based on this one, but with any days converted to multiples of ±24hours.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.JustifyMonths">
+            <summary>
+            Equivalent to PostgreSQL's justify_months function.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> based on this one, but with any days outside of the range [-30, 30]
+            converted into months.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.UnjustifyMonths">
+            <summary>
+            Opposite to PostgreSQL's justify_months function.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> based on this one, but with any months converted to multiples of ±30days.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.JustifyInterval">
+            <summary>
+            Equivalent to PostgreSQL's justify_interval function.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> based on this one,
+            but with any months converted to multiples of ±30days
+            and then with any days converted to multiples of ±24hours</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.UnjustifyInterval">
+            <summary>
+            Opposite to PostgreSQL's justify_interval function.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> based on this one, but with any months converted to multiples of ±30days and then any days converted to multiples of ±24hours;</returns>
+        </member>
+        <!-- Badly formed XML comment ignored for member "M:NpgsqlTypes.NpgsqlInterval.Canonicalize" -->
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_Implicit(System.TimeSpan)~NpgsqlTypes.NpgsqlInterval">
+            <summary>
+            Implicit cast of a <see cref="T:System.TimeSpan"/> to an <see cref="T:NpgsqlTypes.NpgsqlInterval"/>
+            </summary>
+            <param name="timespan">A <see cref="T:System.TimeSpan"/></param>
+            <returns>An eqivalent, canonical, <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_Explicit(NpgsqlTypes.NpgsqlInterval)~System.TimeSpan">
+            <summary>
+            Implicit cast of an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to a <see cref="T:System.TimeSpan"/>.
+            </summary>
+            <param name="interval">A <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</param>
+            <returns>An equivalent <see cref="T:System.TimeSpan"/>.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Equals(NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Returns true if another <see cref="T:NpgsqlTypes.NpgsqlInterval"/> is exactly the same as this instance.
+            </summary>
+            <param name="other">An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> for comparison.</param>
+            <returns>true if the two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instances are exactly the same,
+            false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Equals(System.Object)">
+            <summary>
+            Returns true if another object is an <see cref="T:NpgsqlTypes.NpgsqlInterval"/>, that is exactly the same as
+            this instance
+            </summary>
+            <param name="obj">An <see cref="T:System.Object"/> for comparison.</param>
+            <returns>true if the argument is an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> and is exactly the same
+            as this one, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Compare(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Compares two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instances.
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</param>
+            <returns>0 if the two are equal or equivalent. A value greater than zero if x is greater than y,
+            a value less than zero if x is less than y.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.GetHashCode">
+            <summary>
+            A hash code suitable for uses with hashing algorithms.
+            </summary>
+            <returns>An signed integer.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.CompareTo(NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Compares this instance with another/
+            </summary>
+            <param name="other">An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare this with.</param>
+            <returns>0 if the instances are equal or equivalent. A value less than zero if
+            this instance is less than the argument. A value greater than zero if this instance
+            is greater than the instance.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.CompareTo(System.Object)">
+            <summary>
+            Compares this instance with another/
+            </summary>
+            <param name="other">An object to compare this with.</param>
+            <returns>0 if the argument is an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> and the instances are equal or equivalent.
+            A value less than zero if the argument is an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> and
+            this instance is less than the argument.
+            A value greater than zero if the argument is an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> and this instance
+            is greater than the instance.</returns>
+            A value greater than zero if the argument is null.
+            <exception cref="T:System.ArgumentException">The argument is not an <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</exception>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Parse(System.String)">
+            <summary>
+            Parses a <see cref="T:System.String"/> and returns a <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instance.
+            Designed to use the formats generally returned by PostgreSQL.
+            </summary>
+            <param name="str">The <see cref="T:System.String"/> to parse.</param>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> represented by the argument.</returns>
+            <exception cref="T:System.ArgumentNullException">The string was null.</exception>
+            <exception cref="T:System.OverflowException">A value obtained from parsing the string exceeded the values allowed for the relevant component.</exception>
+            <exception cref="T:System.FormatException">The string was not in a format that could be parsed to produce an <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</exception>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.TryParse(System.String,NpgsqlTypes.NpgsqlInterval@)">
+            <summary>
+            Attempt to parse a <see cref="T:System.String"/> to produce an <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.
+            </summary>
+            <param name="str">The <see cref="T:System.String"/> to parse.</param>
+            <param name="result">(out) The <see cref="T:NpgsqlTypes.NpgsqlInterval"/> produced, or <see cref="F:NpgsqlTypes.NpgsqlInterval.Zero"/> if the parsing failed.</param>
+            <returns>true if the parsing succeeded, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.ToString">
+            <summary>
+            Create a <see cref="T:System.String"/> representation of the <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instance.
+            The format returned is of the form:
+            [M mon[s]] [d day[s]] [HH:mm:ss[.f[f[f[f[f[f[f[f[f]]]]]]]]]]
+            A zero <see cref="T:NpgsqlTypes.NpgsqlInterval"/> is represented as 00:00:00
+            <remarks>
+            Ticks are 100ns, Postgress resolution is only to 1µs at most. Hence we lose 1 or more decimal
+            precision in storing values in the database. Despite this, this method will output that extra
+            digit of precision. It's forward-compatible with any future increases in resolution up to 100ns,
+            and also makes this ToString() more applicable to any other use-case.
+            </remarks>
+            </summary>
+            <returns>The <see cref="T:System.String"/> representation.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_Addition(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Adds two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> together.
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to add.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to add.</param>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> whose values are the sum of the arguments.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_Subtraction(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Subtracts one <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from another.
+            </summary>
+            <param name="x">The <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to subtract the other from.</param>
+            <param name="y">The <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to subtract from the other.</param>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> whose values are the difference of the arguments</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_Equality(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Returns true if two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> are exactly the same.
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <returns>true if the two arguments are exactly the same, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_Inequality(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Returns false if two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> are exactly the same.
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <returns>false if the two arguments are exactly the same, true otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_LessThan(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Compares two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instances to see if the first is less than the second
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <returns>true if the first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> is less than second, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_LessThanOrEqual(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Compares two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instances to see if the first is less than or equivalent to the second
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <returns>true if the first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> is less than or equivalent to second, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_GreaterThan(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Compares two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instances to see if the first is greater than the second
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <returns>true if the first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> is greater than second, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_GreaterThanOrEqual(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Compares two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instances to see if the first is greater than or equivalent the second
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <returns>true if the first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> is greater than or equivalent to the second, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_UnaryPlus(NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Returns the instance.
+            </summary>
+            <param name="x">An <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</param>
+            <returns>The argument.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_UnaryNegation(NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Negates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instance.
+            </summary>
+            <param name="x">An <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</param>
+            <returns>The negation of the argument.</returns>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Ticks">
+            <summary>
+            The total number of ticks(100ns units) contained. This is the resolution of the
+            <see cref="T:NpgsqlTypes.NpgsqlInterval"/>  type. This ignores the number of days and
+            months held. If you want them included use <see cref="M:NpgsqlTypes.NpgsqlInterval.UnjustifyInterval"/> first.
+            <remarks>The resolution of the PostgreSQL
+            interval type is by default 1µs = 1,000 ns. It may be smaller as follows:
+            <list type="number">
+            <item>
+            <term>interval(0)</term>
+            <description>resolution of 1s (1 second)</description>
+            </item>
+            <item>
+            <term>interval(1)</term>
+            <description>resolution of 100ms = 0.1s (100 milliseconds)</description>
+            </item>
+            <item>
+            <term>interval(2)</term>
+            <description>resolution of 10ms = 0.01s (10 milliseconds)</description>
+            </item>
+            <item>
+            <term>interval(3)</term>
+            <description>resolution of 1ms = 0.001s (1 millisecond)</description>
+            </item>
+            <item>
+            <term>interval(4)</term>
+            <description>resolution of 100µs = 0.0001s (100 microseconds)</description>
+            </item>
+            <item>
+            <term>interval(5)</term>
+            <description>resolution of 10µs = 0.00001s (10 microseconds)</description>
+            </item>
+            <item>
+            <term>interval(6) or interval</term>
+            <description>resolution of 1µs = 0.000001s (1 microsecond)</description>
+            </item>
+            </list>
+            <para>As such, if the 100-nanosecond resolution is significant to an application, a PostgreSQL interval will
+            not suffice for those purposes.</para>
+            <para>In more frequent cases though, the resolution of the interval suffices.
+            <see cref="T:NpgsqlTypes.NpgsqlInterval"/> will always suffice to handle the resolution of any interval value, and upon
+            writing to the database, will be rounded to the resolution used.</para>
+            </remarks>
+            <returns>The number of ticks in the instance.</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Microseconds">
+            <summary>
+            Gets the number of whole microseconds held in the instance.
+            <returns>An  in the range [-999999, 999999].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Milliseconds">
+            <summary>
+            Gets the number of whole milliseconds held in the instance.
+            <returns>An  in the range [-999, 999].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Seconds">
+            <summary>
+            Gets the number of whole seconds held in the instance.
+            <returns>An  in the range [-59, 59].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Minutes">
+            <summary>
+            Gets the number of whole minutes held in the instance.
+            <returns>An  in the range [-59, 59].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Hours">
+            <summary>
+            Gets the number of whole hours held in the instance.
+            <remarks>Note that this can be less than -23 or greater than 23 unless <see cref="M:NpgsqlTypes.NpgsqlInterval.JustifyDays"/>
+            has been used to produce this instance.</remarks>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Days">
+            <summary>
+            Gets the number of days held in the instance.
+            <remarks>Note that this does not pay attention to a time component with -24 or less hours or
+            24 or more hours, unless <see cref="M:NpgsqlTypes.NpgsqlInterval.JustifyDays"/> has been called to produce this instance.</remarks>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Months">
+            <summary>
+            Gets the number of months held in the instance.
+            <remarks>Note that this does not pay attention to a day component with -30 or less days or
+            30 or more days, unless <see cref="M:NpgsqlTypes.NpgsqlInterval.JustifyMonths"/> has been called to produce this instance.</remarks>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Time">
+            <summary>
+            Returns a <see cref="T:System.TimeSpan"/> representing the time component of the instance.
+            <remarks>Note that this may have a value beyond the range ±23:59:59.9999999 unless
+            <see cref="M:NpgsqlTypes.NpgsqlInterval.JustifyDays"/> has been called to produce this instance.</remarks>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalTicks">
+            <summary>
+            The total number of ticks (100ns units) in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalMicroseconds">
+            <summary>
+            The total number of microseconds in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalMilliseconds">
+            <summary>
+            The total number of milliseconds in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalSeconds">
+            <summary>
+            The total number of seconds in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalMinutes">
+            <summary>
+            The total number of minutes in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalHours">
+            <summary>
+            The total number of hours in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalDays">
+            <summary>
+            The total number of days in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalMonths">
+            <summary>
+            The total number of months in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTime.Normalize">
+            <summary>
+            Normalise this time; if it is 24:00:00, convert it to 00:00:00
+            </summary>
+            <returns>This time, normalised</returns>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTime.Ticks">
+            <summary>
+            The total number of ticks(100ns units) contained. This is the resolution of the
+            <see cref="T:NpgsqlTypes.NpgsqlTime"/>  type.
+            <remarks>The resolution of the PostgreSQL
+            interval type is by default 1µs = 1,000 ns. It may be smaller as follows:
+            <list type="number">
+            <item>
+            <term>time(0)</term>
+            <description>resolution of 1s (1 second)</description>
+            </item>
+            <item>
+            <term>time(1)</term>
+            <description>resolution of 100ms = 0.1s (100 milliseconds)</description>
+            </item>
+            <item>
+            <term>time(2)</term>
+            <description>resolution of 10ms = 0.01s (10 milliseconds)</description>
+            </item>
+            <item>
+            <term>time(3)</term>
+            <description>resolution of 1ms = 0.001s (1 millisecond)</description>
+            </item>
+            <item>
+            <term>time(4)</term>
+            <description>resolution of 100µs = 0.0001s (100 microseconds)</description>
+            </item>
+            <item>
+            <term>time(5)</term>
+            <description>resolution of 10µs = 0.00001s (10 microseconds)</description>
+            </item>
+            <item>
+            <term>time(6) or interval</term>
+            <description>resolution of 1µs = 0.000001s (1 microsecond)</description>
+            </item>
+            </list>
+            <para>As such, if the 100-nanosecond resolution is significant to an application, a PostgreSQL time will
+            not suffice for those purposes.</para>
+            <para>In more frequent cases though, the resolution of time suffices.
+            <see cref="T:NpgsqlTypes.NpgsqlTime"/> will always suffice to handle the resolution of any time value, and upon
+            writing to the database, will be rounded to the resolution used.</para>
+            </remarks>
+            <returns>The number of ticks in the instance.</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTime.Microseconds">
+            <summary>
+            Gets the number of whole microseconds held in the instance.
+            <returns>An integer in the range [0, 999999].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTime.Milliseconds">
+            <summary>
+            Gets the number of whole milliseconds held in the instance.
+            <returns>An integer in the range [0, 999].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTime.Seconds">
+            <summary>
+            Gets the number of whole seconds held in the instance.
+            <returns>An interger in the range [0, 59].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTime.Minutes">
+            <summary>
+            Gets the number of whole minutes held in the instance.
+            <returns>An integer in the range [0, 59].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTime.Hours">
+            <summary>
+            Gets the number of whole hours held in the instance.
+            <remarks>Note that the time 24:00:00 can be stored for roundtrip compatibility. Any calculations on such a
+            value will normalised it to 00:00:00.</remarks>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTimeTZ.Normalize">
+            <summary>
+            Normalise this time; if it is 24:00:00, convert it to 00:00:00
+            </summary>
+            <returns>This time, normalised</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTimeTZ.CompareTo(NpgsqlTypes.NpgsqlTimeTZ)">
+            <summary>
+            Compares this with another <see cref="T:NpgsqlTypes.NpgsqlTimeTZ"/>. As per postgres' rules,
+            first the times are compared as if they were both in the same timezone. If they are equal then
+            then timezones are compared (+01:00 being "smaller" than -01:00).
+            </summary>
+            <param name="other">the <see cref="T:NpgsqlTypes.NpgsqlTimeTZ"/> to compare with.</param>
+            <returns>An integer which is 0 if they are equal, &lt; 0 if this is the smaller and &gt; 0 if this is the larger.</returns>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTimeTZ.Microseconds">
+            <summary>
+            Gets the number of whole microseconds held in the instance.
+            <returns>An integer in the range [0, 999999].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTimeTZ.Milliseconds">
+            <summary>
+            Gets the number of whole milliseconds held in the instance.
+            <returns>An integer in the range [0, 999].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTimeTZ.Seconds">
+            <summary>
+            Gets the number of whole seconds held in the instance.
+            <returns>An interger in the range [0, 59].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTimeTZ.Minutes">
+            <summary>
+            Gets the number of whole minutes held in the instance.
+            <returns>An integer in the range [0, 59].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTimeTZ.Hours">
+            <summary>
+            Gets the number of whole hours held in the instance.
+            <remarks>Note that the time 24:00:00 can be stored for roundtrip compatibility. Any calculations on such a
+            value will normalised it to 00:00:00.</remarks>
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.LargeObjectManager">
+            <summary>
+            Summary description for LargeObjectManager.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.BasicBackendToNativeTypeConverter">
+            <summary>
+            Provide event handlers to convert all native supported basic data types from their backend
+            text representation to a .NET object.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToBinary(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Binary data.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToBoolean(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql boolean to a System.Boolean.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToBit(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql bit to a System.Boolean.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToDateTime(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql datetime to a System.DateTime.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToDate(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql date to a System.DateTime.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToTime(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql time to a System.DateTime.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToMoney(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql money to a System.Decimal.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.BasicNativeToBackendTypeConverter">
+            <summary>
+            Provide event handlers to convert the basic native supported data types from
+            native form to backend representation.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToBinary(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Binary data.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToBoolean(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgresql boolean.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToBit(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgresql bit.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToDateTime(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgresql timestamp.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToDate(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgresql date.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToTime(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgresql time.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToMoney(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgres money.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToSingleDouble(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgres double with maximum precision.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.ExtendedBackendToNativeTypeConverter">
+            <summary>
+            Provide event handlers to convert extended native supported data types from their backend
+            text representation to a .NET object.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToPoint(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql point to a System.NpgsqlPoint.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToBox(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql point to a System.RectangleF.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToLSeg(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            LDeg.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToPath(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Path.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToPolygon(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Polygon.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToCircle(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Circle.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToInet(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Inet.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToMacAddress(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            MAC Address.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToInterval(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            interval
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.ExtendedNativeToBackendTypeConverter">
+            <summary>
+            Provide event handlers to convert extended native supported data types from
+            native form to backend representation.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToPoint(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Point.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToBox(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Box.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToLSeg(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            LSeg.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToPath(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Open path.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToPolygon(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Polygon.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToMacAddress(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgres MAC Address.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToCircle(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Circle.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToIPAddress(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgres inet.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToInterval(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgres interval
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlPoint">
+            <summary>
+            Represents a PostgreSQL Point type
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlLSeg">
+            <summary>
+            Represents a PostgreSQL Line Segment type.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlPath">
+            <summary>
+            Represents a PostgreSQL Path type.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlPolygon">
+            <summary>
+            Represents a PostgreSQL Polygon type.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlCircle">
+            <summary>
+            Represents a PostgreSQL Circle type.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlInet">
+            <summary>
+            Represents a PostgreSQL inet type.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlMacAddress">
+            <summary>
+            Represents a PostgreSQL MacAddress type.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlMacAddress.#ctor(System.String)">
+            <summary>
+            
+            </summary>
+            <param name="macAddr">The macAddr parameter must contain a string that can only consist of numbers
+            and upper-case letters as hexadecimal digits. (See PhysicalAddress.Parse method on MSDN)</param>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlTypesHelper">
+            <summary>
+            This class contains helper methods for type conversion between
+            the .Net type system and postgresql.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlTypesHelper.BackendTypeMappingCache">
+            <summary>
+            A cache of basic datatype mappings keyed by server version.  This way we don't
+            have to load the basic type mappings for every connection.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.TryGetBackendTypeInfo(System.String,NpgsqlTypes.NpgsqlBackendTypeInfo@)">
+            <summary>
+            Find a NpgsqlNativeTypeInfo in the default types map that can handle objects
+            of the given NpgsqlDbType.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.TryGetNativeTypeInfo(NpgsqlTypes.NpgsqlDbType,NpgsqlTypes.NpgsqlNativeTypeInfo@)">
+            <summary>
+            Find a NpgsqlNativeTypeInfo in the default types map that can handle objects
+            of the given NpgsqlDbType.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.TryGetNativeTypeInfo(System.Data.DbType,NpgsqlTypes.NpgsqlNativeTypeInfo@)">
+            <summary>
+            Find a NpgsqlNativeTypeInfo in the default types map that can handle objects
+            of the given DbType.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.TryGetNativeTypeInfo(System.Type,NpgsqlTypes.NpgsqlNativeTypeInfo@)">
+            <summary>
+            Find a NpgsqlNativeTypeInfo in the default types map that can handle objects
+            of the given System.Type.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.ConvertBackendStringToSystemType(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+             This method is responsible to convert the string received from the backend
+             to the corresponding NpgsqlType.
+             The given TypeInfo is called upon to do the conversion.
+             If no TypeInfo object is provided, no conversion is performed.
+             </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.PrepareDefaultTypesMap">
+            <summary>
+            Create the one and only native to backend type map.
+            This map is used when formatting native data
+            types to backend representations.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.CreateAndLoadInitialTypesMapping(Npgsql.NpgsqlConnector)">
+            <summary>
+             This method creates (or retrieves from cache) a mapping between type and OID 
+             of all natively supported postgresql data types.
+             This is needed as from one version to another, this mapping can be changed and
+             so we avoid hardcoding them.
+             </summary>
+             <returns>NpgsqlTypeMapping containing all known data types.  The mapping must be
+             cloned before it is modified because it is cached; changes made by one connection may
+             effect another connection.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.LoadTypesMappings(Npgsql.NpgsqlConnector,NpgsqlTypes.NpgsqlBackendTypeMapping,System.Collections.Generic.IEnumerable{NpgsqlTypes.NpgsqlBackendTypeInfo})">
+            <summary>
+            Attempt to map types by issuing a query against pg_type.
+            This function takes a list of NpgsqlTypeInfo and attempts to resolve the OID field
+            of each by querying pg_type.  If the mapping is found, the type info object is
+            updated (OID) and added to the provided NpgsqlTypeMapping object.
+            </summary>
+            <param name="conn">NpgsqlConnector to send query through.</param>
+            <param name="TypeMappings">Mapping object to add types too.</param>
+            <param name="TypeInfoList">List of types that need to have OID's mapped.</param>
+        </member>
+        <member name="T:NpgsqlTypes.ConvertBackendToNativeHandler">
+            <summary>
+            Delegate called to convert the given backend data to its native representation.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.ConvertNativeToBackendHandler">
+            <summary>
+            Delegate called to convert the given native data to its backand representation.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlBackendTypeInfo">
+            <summary>
+            Represents a backend data type.
+            This class can be called upon to convert a backend field representation to a native object.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeInfo.#ctor(System.Int32,System.String,NpgsqlTypes.NpgsqlDbType,System.Data.DbType,System.Type,NpgsqlTypes.ConvertBackendToNativeHandler)">
+            <summary>
+            Construct a new NpgsqlTypeInfo with the given attributes and conversion handlers.
+            </summary>
+            <param name="OID">Type OID provided by the backend server.</param>
+            <param name="Name">Type name provided by the backend server.</param>
+            <param name="NpgsqlDbType">NpgsqlDbType</param>
+            <param name="Type">System type to convert fields of this type to.</param>
+            <param name="ConvertBackendToNative">Data conversion handler.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeInfo.ConvertToNative(System.String,System.Int16,System.Int32)">
+            <summary>
+            Perform a data conversion from a backend representation to 
+            a native object.
+            </summary>
+            <param name="BackendData">Data sent from the backend.</param>
+            <param name="TypeModifier">Type modifier field sent from the backend.</param>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeInfo.OID">
+            <summary>
+            Type OID provided by the backend server.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeInfo.Name">
+            <summary>
+            Type name provided by the backend server.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeInfo.NpgsqlDbType">
+            <summary>
+            NpgsqlDbType.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeInfo.DbType">
+            <summary>
+            NpgsqlDbType.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeInfo.Type">
+            <summary>
+            Provider type to convert fields of this type to.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeInfo.FrameworkType">
+            <summary>
+            System type to convert fields of this type to.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlNativeTypeInfo">
+            <summary>
+            Represents a backend data type.
+            This class can be called upon to convert a native object to its backend field representation,
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeInfo.ArrayOf(NpgsqlTypes.NpgsqlNativeTypeInfo)">
+            <summary>
+            Returns an NpgsqlNativeTypeInfo for an array where the elements are of the type
+            described by the NpgsqlNativeTypeInfo supplied.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeInfo.#ctor(System.String,NpgsqlTypes.NpgsqlDbType,System.Data.DbType,System.Boolean,NpgsqlTypes.ConvertNativeToBackendHandler)">
+            <summary>
+            Construct a new NpgsqlTypeInfo with the given attributes and conversion handlers.
+            </summary>
+            <param name="Name">Type name provided by the backend server.</param>
+            <param name="NpgsqlDbType">NpgsqlDbType</param>
+            <param name="ConvertNativeToBackend">Data conversion handler.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeInfo.ConvertToBackend(System.Object,System.Boolean)">
+            <summary>
+            Perform a data conversion from a native object to
+            a backend representation.
+            DBNull and null values are handled differently depending if a plain query is used
+            When 
+            </summary>
+            <param name="NativeData">Native .NET object to be converted.</param>
+            <param name="ForExtendedQuery">Flag indicating if the conversion has to be done for 
+            plain queries or extended queries</param>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlNativeTypeInfo.Name">
+            <summary>
+            Type name provided by the backend server.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlNativeTypeInfo.NpgsqlDbType">
+            <summary>
+            NpgsqlDbType.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlNativeTypeInfo.DbType">
+            <summary>
+            DbType.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlNativeTypeInfo.Quote">
+            <summary>
+            Apply quoting.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlNativeTypeInfo.UseSize">
+            <summary>
+            Use parameter size information.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlBackendTypeMapping">
+            <summary>
+            Provide mapping between type OID, type name, and a NpgsqlBackendTypeInfo object that represents it.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.#ctor">
+            <summary>
+            Construct an empty mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.#ctor(NpgsqlTypes.NpgsqlBackendTypeMapping)">
+            <summary>
+            Copy constuctor.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.AddType(NpgsqlTypes.NpgsqlBackendTypeInfo)">
+            <summary>
+            Add the given NpgsqlBackendTypeInfo to this mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.AddType(System.Int32,System.String,NpgsqlTypes.NpgsqlDbType,System.Data.DbType,System.Type,NpgsqlTypes.ConvertBackendToNativeHandler)">
+            <summary>
+            Add a new NpgsqlBackendTypeInfo with the given attributes and conversion handlers to this mapping.
+            </summary>
+            <param name="OID">Type OID provided by the backend server.</param>
+            <param name="Name">Type name provided by the backend server.</param>
+            <param name="NpgsqlDbType">NpgsqlDbType</param>
+            <param name="Type">System type to convert fields of this type to.</param>
+            <param name="BackendConvert">Data conversion handler.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.Clone">
+            <summary>
+            Make a shallow copy of this type mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.ContainsOID(System.Int32)">
+            <summary>
+            Determine if a NpgsqlBackendTypeInfo with the given backend type OID exists in this mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.ContainsName(System.String)">
+            <summary>
+            Determine if a NpgsqlBackendTypeInfo with the given backend type name exists in this mapping.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeMapping.Count">
+            <summary>
+            Get the number of type infos held.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeMapping.Item(System.Int32)">
+            <summary>
+            Retrieve the NpgsqlBackendTypeInfo with the given backend type OID, or null if none found.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeMapping.Item(System.String)">
+            <summary>
+            Retrieve the NpgsqlBackendTypeInfo with the given backend type name, or null if none found.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlNativeTypeMapping">
+            <summary>
+            Provide mapping between type Type, NpgsqlDbType and a NpgsqlNativeTypeInfo object that represents it.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.AddType(NpgsqlTypes.NpgsqlNativeTypeInfo)">
+            <summary>
+            Add the given NpgsqlNativeTypeInfo to this mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.AddType(System.String,NpgsqlTypes.NpgsqlDbType,System.Data.DbType,System.Boolean,NpgsqlTypes.ConvertNativeToBackendHandler)">
+            <summary>
+            Add a new NpgsqlNativeTypeInfo with the given attributes and conversion handlers to this mapping.
+            </summary>
+            <param name="Name">Type name provided by the backend server.</param>
+            <param name="NpgsqlDbType">NpgsqlDbType</param>
+            <param name="NativeConvert">Data conversion handler.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.TryGetValue(NpgsqlTypes.NpgsqlDbType,NpgsqlTypes.NpgsqlNativeTypeInfo@)">
+            <summary>
+            Retrieve the NpgsqlNativeTypeInfo with the given NpgsqlDbType.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.TryGetValue(System.Data.DbType,NpgsqlTypes.NpgsqlNativeTypeInfo@)">
+            <summary>
+            Retrieve the NpgsqlNativeTypeInfo with the given DbType.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.TryGetValue(System.Type,NpgsqlTypes.NpgsqlNativeTypeInfo@)">
+            <summary>
+            Retrieve the NpgsqlNativeTypeInfo with the given Type.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.ContainsName(System.String)">
+            <summary>
+            Determine if a NpgsqlNativeTypeInfo with the given backend type name exists in this mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.ContainsNpgsqlDbType(NpgsqlTypes.NpgsqlDbType)">
+            <summary>
+            Determine if a NpgsqlNativeTypeInfo with the given NpgsqlDbType exists in this mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.ContainsType(System.Type)">
+            <summary>
+            Determine if a NpgsqlNativeTypeInfo with the given Type name exists in this mapping.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlNativeTypeMapping.Count">
+            <summary>
+            Get the number of type infos held.
+            </summary>
+        </member>
+        <member name="M:Npgsql.SqlGenerators.SqlBaseGenerator.GetColumnsForJoin(Npgsql.SqlGenerators.JoinExpression,Npgsql.SqlGenerators.ProjectionExpression,Npgsql.SqlGenerators.VisitedExpression)">
+            <summary>
+            Given a join expression and a projection, fetch all columns in the projection
+            that reference columns in the join.
+            </summary>
+        </member>
+        <member name="M:Npgsql.SqlGenerators.SqlBaseGenerator.GetFromNames(Npgsql.SqlGenerators.InputExpression,System.Collections.Generic.List{System.String})">
+            <summary>
+            Given an InputExpression append all from names (including nested joins) to the list.
+            </summary>
+        </member>
+        <member name="M:Npgsql.SqlGenerators.SqlBaseGenerator.GetReplacementColumn(Npgsql.SqlGenerators.JoinExpression,Npgsql.SqlGenerators.ColumnExpression)">
+            <summary>
+            Get new ColumnExpression that will be used in projection that had it's existing columns moved.
+            These should be simple references to the inner column
+            </summary>
+        </member>
+        <member name="M:Npgsql.SqlGenerators.SqlBaseGenerator.AdjustPropertyAccess(Npgsql.SqlGenerators.ColumnExpression[],System.String)">
+            <summary>
+            Every property accessed in the list of columns must be adjusted for a new scope
+            </summary>
+        </member>
+        <member name="P:Npgsql.Cache`1.CacheSize">
+            <summary>
+            Set Cache Size. The default value is 20.
+            </summary>
+        </member>
+        <member name="P:Npgsql.Cache`1.Item(System.String)">
+            <summary>
+            Lookup cached entity. null will returned if not match.
+            For both get{} and set{} apply LRU rule.
+            </summary>
+            <param name="key">key</param>
+            <returns></returns>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.#ctor">
+            <summary>
+            Called from constructor of derived class.
+            </summary>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.Finalize">
+            <summary>
+            Finalizer for HashAlgorithm
+            </summary>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.ComputeHash(System.Byte[])">
+            <summary>
+            Computes the entire hash of all the bytes in the byte array.
+            </summary>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.HashCore(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            When overridden in a derived class, drives the hashing function.
+            </summary>
+            <param name="rgb"></param>
+            <param name="start"></param>
+            <param name="size"></param>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.HashFinal">
+            <summary>
+            When overridden in a derived class, this pads and hashes whatever data might be left in the buffers and then returns the hash created.
+            </summary>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.Initialize">
+            <summary>
+            When overridden in a derived class, initializes the object to prepare for hashing.
+            </summary>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.TransformBlock(System.Byte[],System.Int32,System.Int32,System.Byte[],System.Int32)">
+            <summary>
+            Used for stream chaining.  Computes hash as data passes through it.
+            </summary>
+            <param name="inputBuffer">The buffer from which to grab the data to be copied.</param>
+            <param name="inputOffset">The offset into the input buffer to start reading at.</param>
+            <param name="inputCount">The number of bytes to be copied.</param>
+            <param name="outputBuffer">The buffer to write the copied data to.</param>
+            <param name="outputOffset">At what point in the outputBuffer to write the data at.</param>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.TransformFinalBlock(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Used for stream chaining.  Computes hash as data passes through it.  Finishes off the hash.
+            </summary>
+            <param name="inputBuffer">The buffer from which to grab the data to be copied.</param>
+            <param name="inputOffset">The offset into the input buffer to start reading at.</param>
+            <param name="inputCount">The number of bytes to be copied.</param>
+        </member>
+        <member name="P:Npgsql.HashAlgorithm.CanTransformMultipleBlocks">
+            <summary>
+            Get whether or not the hash can transform multiple blocks at a time.
+            Note: MUST be overriden if descendant can transform multiple block
+            on a single call!
+            </summary>
+        </member>
+        <member name="P:Npgsql.HashAlgorithm.Hash">
+            <summary>
+            Gets the previously computed hash.
+            </summary>
+        </member>
+        <member name="P:Npgsql.HashAlgorithm.HashSize">
+            <summary>
+            Returns the size in bits of the hash.
+            </summary>
+        </member>
+        <member name="P:Npgsql.HashAlgorithm.InputBlockSize">
+            <summary>
+            Must be overriden if not 1
+            </summary>
+        </member>
+        <member name="P:Npgsql.HashAlgorithm.OutputBlockSize">
+            <summary>
+            Must be overriden if not 1
+            </summary>
+        </member>
+        <member name="T:Npgsql.MD5">
+            <summary>
+            Common base class for all derived MD5 implementations.
+            </summary>
+        </member>
+        <member name="M:Npgsql.MD5.#ctor">
+            <summary>
+            Called from constructor of derived class.
+            </summary>
+        </member>
+        <member name="M:Npgsql.MD5.Create">
+            <summary>
+            Creates the default derived class.
+            </summary>
+        </member>
+        <member name="T:Npgsql.MD5CryptoServiceProvider">
+            <summary>
+            C# implementation of the MD5 cryptographic hash function.
+            </summary>
+        </member>
+        <member name="M:Npgsql.MD5CryptoServiceProvider.#ctor">
+            <summary>
+            Creates a new MD5CryptoServiceProvider.
+            </summary>
+        </member>
+        <member name="M:Npgsql.MD5CryptoServiceProvider.HashCore(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Drives the hashing function.
+            </summary>
+            <param name="rgb">Byte array containing the data to hash.</param>
+            <param name="start">Where in the input buffer to start.</param>
+            <param name="size">Size in bytes of the data in the buffer to hash.</param>
+        </member>
+        <member name="M:Npgsql.MD5CryptoServiceProvider.HashFinal">
+            <summary>
+            This finalizes the hash.  Takes the data from the chaining variables and returns it.
+            </summary>
+        </member>
+        <member name="M:Npgsql.MD5CryptoServiceProvider.Initialize">
+            <summary>
+            Resets the class after use.  Called automatically after hashing is done.
+            </summary>
+        </member>
+        <member name="M:Npgsql.MD5CryptoServiceProvider.ProcessBlock(System.Byte[],System.Int32)">
+            <summary>
+            This is the meat of the hash function.  It is what processes each block one at a time.
+            </summary>
+            <param name="inputBuffer">Byte array to process data from.</param>
+            <param name="inputOffset">Where in the byte array to start processing.</param>
+        </member>
+        <member name="M:Npgsql.MD5CryptoServiceProvider.ProcessFinalBlock(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Pads and then processes the final block.
+            </summary>
+            <param name="inputBuffer">Buffer to grab data from.</param>
+            <param name="inputOffset">Position in buffer in bytes to get data from.</param>
+            <param name="inputCount">How much data in bytes in the buffer to use.</param>
+        </member>
+        <member name="T:Npgsql.StringRowReaderV3">
+            <summary>
+            Implements <see cref="T:Npgsql.RowReader"/> for version 3 of the protocol.
+            </summary>
+        </member>
+        <member name="T:Npgsql.RowReader">
+            <summary>
+            Reads a row, field by field, allowing a DataRow to be built appropriately.
+            </summary>
+        </member>
+        <member name="T:Npgsql.IStreamOwner">
+            <summary>
+            Marker interface which identifies a class which may take possession of a stream for the duration of
+            it's lifetime (possibly temporarily giving that possession to another class for part of that time.
+            
+            It inherits from IDisposable, since any such class must make sure it leaves the stream in a valid state.
+            
+            The most important such class is that compiler-generated from ProcessBackendResponsesEnum. Of course
+            we can't make that inherit from this interface, alas.
+            </summary>
+        </member>
+        <!-- Badly formed XML comment ignored for member "T:Npgsql.IServerResponseObject" -->
+        <member name="T:Npgsql.RowReader.Streamer">
+            <summary>
+            Reads part of a field, as needed (for <see cref="!:System.Data.IDataRecord.GetChars()"/>
+            and <see cref="!:System.Data.IDataRecord.GetBytes()"/>
+            </summary>
+        </member>
+        <member name="T:Npgsql.RowReader.Streamer`1">
+            <summary>
+            Adds further functionality to stream that is dependant upon the type of data read.
+            </summary>
+        </member>
+        <member name="T:Npgsql.RowReader.CharStreamer">
+            <summary>
+            Completes the implementation of Streamer for char data.
+            </summary>
+        </member>
+        <member name="T:Npgsql.RowReader.ByteStreamer">
+            <summary>
+            Completes the implementation of Streamer for byte data.
+            </summary>
+        </member>
+        <member name="T:Npgsql.StringRowReaderV2">
+            <summary>
+            Implements <see cref="T:Npgsql.RowReader"/> for version 2 of the protocol.
+            </summary>
+        </member>
+        <member name="T:Npgsql.StringRowReaderV2.NullMap">
+            <summary>
+            Encapsulates the null mapping bytes sent at the start of a version 2
+            datarow message, and the process of identifying the nullity of the data
+            at a particular index
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlBackEndKeyData">
+            <summary>
+            This class represents a BackEndKeyData message received
+            from PostgreSQL
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlBind">
+             <summary>
+             This class represents the Bind message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.ClientMessage">
+            <summary>
+            For classes representing messages sent from the client to the server.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCancelRequest">
+             <summary>
+             This class represents the CancelRequest message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlState">
+            <summary> This class represents the base class for the state pattern design pattern
+             implementation.
+             </summary>
+            
+        </member>
+        <member name="M:Npgsql.NpgsqlState.ChangeState(Npgsql.NpgsqlConnector,Npgsql.NpgsqlState)">
+            <summary>
+            This method is used by the states to change the state of the context.
+             </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlState.ProcessBackendResponses(Npgsql.NpgsqlConnector)">
+            <summary>
+             This method is responsible to handle all protocol messages sent from the backend.
+             It holds all the logic to do it.
+             To exchange data, it uses a Mediator object from which it reads/writes information
+             to handle backend requests.
+             </summary>
+            
+        </member>
+        <member name="M:Npgsql.NpgsqlState.ProcessBackendResponsesEnum(Npgsql.NpgsqlConnector)">
+            <summary>
+             This method is responsible to handle all protocol messages sent from the backend.
+             It holds all the logic to do it.
+             To exchange data, it uses a Mediator object from which it reads/writes information
+             to handle backend requests.
+             </summary>
+            
+        </member>
+        <member name="M:Npgsql.NpgsqlState.CheckForContextSocketAvailability(Npgsql.NpgsqlConnector,System.Net.Sockets.SelectMode)">
+            <summary>
+            Checks for context socket availability.
+            Socket.Poll supports integer as microseconds parameter.
+            This limits the usable command timeout value
+            to 2,147 seconds: (2,147 x 1,000,000 less than  max_int).
+            In order to bypass this limit, the availability of
+            the socket is checked in 2,147 seconds cycles
+            </summary>
+            <returns><c>true</c>, if for context socket availability was checked, <c>false</c> otherwise.</returns>
+            <param name="context">Context.</param>
+            <param name="selectMode">Select mode.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlClosedState.ResolveIPHost(System.String)">
+            <summary>
+            Resolve a host name or IP address.
+            This is needed because if you call Dns.Resolve() with an IP address, it will attempt
+            to resolve it as a host name, when it should just convert it to an IP address.
+            </summary>
+            <param name="HostName"></param>
+        </member>
+        <member name="T:Npgsql.NpgsqlCommand">
+            <summary>
+            Represents a SQL statement or function (stored procedure) to execute
+            against a PostgreSQL database. This class cannot be inherited.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> class.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> class with the text of the query.
+            </summary>
+            <param name="cmdText">The text of the query.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.#ctor(System.String,Npgsql.NpgsqlConnection)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> class with the text of the query and a <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>.
+            </summary>
+            <param name="cmdText">The text of the query.</param>
+            <param name="connection">A <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see> that represents the connection to a PostgreSQL server.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.#ctor(System.String,Npgsql.NpgsqlConnection,Npgsql.NpgsqlTransaction)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> class with the text of the query, a <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>, and the <see cref="T:Npgsql.NpgsqlTransaction">NpgsqlTransaction</see>.
+            </summary>
+            <param name="cmdText">The text of the query.</param>
+            <param name="connection">A <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see> that represents the connection to a PostgreSQL server.</param>
+            <param name="transaction">The <see cref="T:Npgsql.NpgsqlTransaction">NpgsqlTransaction</see> in which the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> executes.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.#ctor(System.String,Npgsql.NpgsqlConnector)">
+            <summary>
+            Used to execute internal commands.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.Cancel">
+            <summary>
+            Attempts to cancel the execution of a <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see>.
+            </summary>
+            <remarks>This Method isn't implemented yet.</remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.System#ICloneable#Clone">
+            <summary>
+            Create a new command based on this one.
+            </summary>
+            <returns>A new NpgsqlCommand object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.Clone">
+            <summary>
+            Create a new command based on this one.
+            </summary>
+            <returns>A new NpgsqlCommand object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.CreateDbParameter">
+            <summary>
+            Creates a new instance of an <see cref="T:System.Data.Common.DbParameter">DbParameter</see> object.
+            </summary>
+            <returns>An <see cref="T:System.Data.Common.DbParameter">DbParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.CreateParameter">
+            <summary>
+            Creates a new instance of a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.
+            </summary>
+            <returns>A <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.ExecuteBlind">
+            <summary>
+            Slightly optimised version of ExecuteNonQuery() for internal ues in cases where the number
+            of affected rows is of no interest.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.ExecuteNonQuery">
+            <summary>
+            Executes a SQL statement against the connection and returns the number of rows affected.
+            </summary>
+            <returns>The number of rows affected if known; -1 otherwise.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.ExecuteDbDataReader(System.Data.CommandBehavior)">
+            <summary>
+            Sends the <see cref="P:Npgsql.NpgsqlCommand.CommandText">CommandText</see> to
+            the <see cref="T:Npgsql.NpgsqlConnection">Connection</see> and builds a
+            <see cref="T:Npgsql.NpgsqlDataReader">NpgsqlDataReader</see>
+            using one of the <see cref="T:System.Data.CommandBehavior">CommandBehavior</see> values.
+            </summary>
+            <param name="behavior">One of the <see cref="T:System.Data.CommandBehavior">CommandBehavior</see> values.</param>
+            <returns>A <see cref="T:Npgsql.NpgsqlDataReader">NpgsqlDataReader</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.ExecuteReader">
+            <summary>
+            Sends the <see cref="P:Npgsql.NpgsqlCommand.CommandText">CommandText</see> to
+            the <see cref="T:Npgsql.NpgsqlConnection">Connection</see> and builds a
+            <see cref="T:Npgsql.NpgsqlDataReader">NpgsqlDataReader</see>.
+            </summary>
+            <returns>A <see cref="T:Npgsql.NpgsqlDataReader">NpgsqlDataReader</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.ExecuteReader(System.Data.CommandBehavior)">
+            <summary>
+            Sends the <see cref="P:Npgsql.NpgsqlCommand.CommandText">CommandText</see> to
+            the <see cref="T:Npgsql.NpgsqlConnection">Connection</see> and builds a
+            <see cref="T:Npgsql.NpgsqlDataReader">NpgsqlDataReader</see>
+            using one of the <see cref="T:System.Data.CommandBehavior">CommandBehavior</see> values.
+            </summary>
+            <param name="cb">One of the <see cref="T:System.Data.CommandBehavior">CommandBehavior</see> values.</param>
+            <returns>A <see cref="T:Npgsql.NpgsqlDataReader">NpgsqlDataReader</see> object.</returns>
+            <remarks>Currently the CommandBehavior parameter is ignored.</remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.BindParameters">
+            <summary>
+             This method binds the parameters from parameters collection to the bind
+             message.
+             </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.ExecuteScalar">
+            <summary>
+            Executes the query, and returns the first column of the first row
+            in the result set returned by the query. Extra columns or rows are ignored.
+            </summary>
+            <returns>The first column of the first row in the result set,
+            or a null reference if the result set is empty.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.Prepare">
+            <summary>
+            Creates a prepared version of the command on a PostgreSQL server.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.CheckConnectionState">
+            <summary>
+             This method checks the connection state to see if the connection
+             is set or it is open. If one of this conditions is not met, throws
+             an InvalidOperationException
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.GetCommandText">
+            <summary>
+            This method substitutes the <see cref="P:Npgsql.NpgsqlCommand.Parameters">Parameters</see>, if exist, in the command
+            to their actual values.
+            The parameter name format is <b>:ParameterName</b>.
+            </summary>
+            <returns>A version of <see cref="P:Npgsql.NpgsqlCommand.CommandText">CommandText</see> with the <see cref="P:Npgsql.NpgsqlCommand.Parameters">Parameters</see> inserted.</returns>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.CommandText">
+            <summary>
+            Gets or sets the SQL statement or function (stored procedure) to execute at the data source.
+            </summary>
+            <value>The Transact-SQL statement or stored procedure to execute. The default is an empty string.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.CommandTimeout">
+            <summary>
+            Gets or sets the wait time before terminating the attempt
+            to execute a command and generating an error.
+            </summary>
+            <value>The time (in seconds) to wait for the command to execute.
+            The default is 20 seconds.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.CommandType">
+            <summary>
+            Gets or sets a value indicating how the
+            <see cref="P:Npgsql.NpgsqlCommand.CommandText">CommandText</see> property is to be interpreted.
+            </summary>
+            <value>One of the <see cref="T:System.Data.CommandType">CommandType</see> values. The default is <see cref="T:System.Data.CommandType">CommandType.Text</see>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.Connection">
+            <summary>
+            Gets or sets the <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>
+            used by this instance of the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see>.
+            </summary>
+            <value>The connection to a data source. The default value is a null reference.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.Parameters">
+            <summary>
+            Gets the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see>.
+            </summary>
+            <value>The parameters of the SQL statement or function (stored procedure). The default is an empty collection.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.Transaction">
+            <summary>
+            Gets or sets the <see cref="T:Npgsql.NpgsqlTransaction">NpgsqlTransaction</see>
+            within which the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> executes.
+            </summary>
+            <value>The <see cref="T:Npgsql.NpgsqlTransaction">NpgsqlTransaction</see>.
+            The default value is a null reference.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.UpdatedRowSource">
+            <summary>
+            Gets or sets how command results are applied to the <see cref="T:System.Data.DataRow">DataRow</see>
+            when used by the <see cref="M:System.Data.Common.DbDataAdapter.Update(System.Data.DataSet)">Update</see>
+            method of the <see cref="T:System.Data.Common.DbDataAdapter">DbDataAdapter</see>.
+            </summary>
+            <value>One of the <see cref="T:System.Data.UpdateRowSource">UpdateRowSource</see> values.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.LastInsertedOID">
+            <summary>
+            Returns oid of inserted row. This is only updated when using executenonQuery and when command inserts just a single row. If table is created without oids, this will always be 0.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCommandBuilder">
+            <summary>
+             This class is responsible to create database commands for automatic insert, update and delete operations.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommandBuilder.DeriveParameters(Npgsql.NpgsqlCommand)">
+            <summary>
+            
+             This method is reponsible to derive the command parameter list with values obtained from function definition.
+             It clears the Parameters collection of command. Also, if there is any parameter type which is not supported by Npgsql, an InvalidOperationException will be thrown.
+             Parameters name will be parameter1, parameter2, ...
+             For while, only parameter name and NpgsqlDbType are obtained.
+            </summary>
+             <param name="command">NpgsqlCommand whose function parameters will be obtained.</param>
+        </member>
+        <member name="T:Npgsql.NoticeEventHandler">
+            <summary>
+            Represents the method that handles the <see cref="E:Npgsql.NpgsqlConnection.Notification">Notice</see> events.
+            </summary>
+            <param name="e">A <see cref="T:Npgsql.NpgsqlNoticeEventArgs">NpgsqlNoticeEventArgs</see> that contains the event data.</param>
+        </member>
+        <member name="T:Npgsql.NotificationEventHandler">
+            <summary>
+            Represents the method that handles the <see cref="E:Npgsql.NpgsqlConnection.Notification">Notification</see> events.
+            </summary>
+            <param name="sender">The source of the event.</param>
+            <param name="e">A <see cref="T:Npgsql.NpgsqlNotificationEventArgs">NpgsqlNotificationEventArgs</see> that contains the event data.</param>
+        </member>
+        <member name="T:Npgsql.NpgsqlConnection">
+            <summary>
+            This class represents a connection to a
+            PostgreSQL server.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.#ctor">
+            <summary>
+            Initializes a new instance of the
+            <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see> class.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the
+            <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see> class
+            and sets the <see cref="P:Npgsql.NpgsqlConnection.ConnectionString">ConnectionString</see>.
+            </summary>
+            <param name="ConnectionString">The connection used to open the PostgreSQL database.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.BeginDbTransaction(System.Data.IsolationLevel)">
+            <summary>
+            Begins a database transaction with the specified isolation level.
+            </summary>
+            <param name="isolationLevel">The <see cref="T:System.Data.IsolationLevel">isolation level</see> under which the transaction should run.</param>
+            <returns>An <see cref="T:System.Data.Common.DbTransaction">DbTransaction</see>
+            object representing the new transaction.</returns>
+            <remarks>
+            Currently the IsolationLevel ReadCommitted and Serializable are supported by the PostgreSQL backend.
+            There's no support for nested transactions.
+            </remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.BeginTransaction">
+            <summary>
+            Begins a database transaction.
+            </summary>
+            <returns>A <see cref="T:Npgsql.NpgsqlTransaction">NpgsqlTransaction</see>
+            object representing the new transaction.</returns>
+            <remarks>
+            Currently there's no support for nested transactions.
+            </remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.BeginTransaction(System.Data.IsolationLevel)">
+            <summary>
+            Begins a database transaction with the specified isolation level.
+            </summary>
+            <param name="level">The <see cref="T:System.Data.IsolationLevel">isolation level</see> under which the transaction should run.</param>
+            <returns>A <see cref="T:Npgsql.NpgsqlTransaction">NpgsqlTransaction</see>
+            object representing the new transaction.</returns>
+            <remarks>
+            Currently the IsolationLevel ReadCommitted and Serializable are supported by the PostgreSQL backend.
+            There's no support for nested transactions.
+            </remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.Open">
+            <summary>
+            Opens a database connection with the property settings specified by the
+            <see cref="P:Npgsql.NpgsqlConnection.ConnectionString">ConnectionString</see>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.ChangeDatabase(System.String)">
+            <summary>
+            This method changes the current database by disconnecting from the actual
+            database and connecting to the specified.
+            </summary>
+            <param name="dbName">The name of the database to use in place of the current database.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.Close">
+            <summary>
+            Releases the connection to the database.  If the connection is pooled, it will be
+            made available for re-use.  If it is non-pooled, the actual connection will be shutdown.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.CreateDbCommand">
+            <summary>
+            Creates and returns a <see cref="T:System.Data.Common.DbCommand">DbCommand</see>
+            object associated with the <see cref="T:System.Data.Common.DbConnection">IDbConnection</see>.
+            </summary>
+            <returns>A <see cref="T:System.Data.Common.DbCommand">DbCommand</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.CreateCommand">
+            <summary>
+            Creates and returns a <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see>
+            object associated with the <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>.
+            </summary>
+            <returns>A <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.Dispose(System.Boolean)">
+            <summary>
+            Releases all resources used by the
+            <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>.
+            </summary>
+            <param name="disposing"><b>true</b> when called from Dispose();
+            <b>false</b> when being called from the finalizer.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.System#ICloneable#Clone">
+            <summary>
+            Create a new connection based on this one.
+            </summary>
+            <returns>A new NpgsqlConnection object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.Clone">
+            <summary>
+            Create a new connection based on this one.
+            </summary>
+            <returns>A new NpgsqlConnection object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.DefaultCertificateSelectionCallback(System.Security.Cryptography.X509Certificates.X509CertificateCollection,System.Security.Cryptography.X509Certificates.X509Certificate,System.String,System.Security.Cryptography.X509Certificates.X509CertificateCollection)">
+            <summary>
+            Default SSL CertificateSelectionCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.DefaultCertificateValidationCallback(System.Security.Cryptography.X509Certificates.X509Certificate,System.Int32[])">
+            <summary>
+            Default SSL CertificateValidationCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.DefaultPrivateKeySelectionCallback(System.Security.Cryptography.X509Certificates.X509Certificate,System.String)">
+            <summary>
+            Default SSL PrivateKeySelectionCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.DefaultProvideClientCertificatesCallback(System.Security.Cryptography.X509Certificates.X509CertificateCollection)">
+            <summary>
+            Default SSL ProvideClientCertificatesCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.LogConnectionString">
+            <summary>
+            Write each key/value pair in the connection string to the log.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.GetSchema">
+            <summary>
+            Returns the supported collections
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.GetSchema(System.String)">
+            <summary>
+            Returns the schema collection specified by the collection name.
+            </summary>
+            <param name="collectionName">The collection name.</param>
+            <returns>The collection specified.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.GetSchema(System.String,System.String[])">
+            <summary>
+            Returns the schema collection specified by the collection name filtered by the restrictions.
+            </summary>
+            <param name="collectionName">The collection name.</param>
+            <param name="restrictions">
+            The restriction values to filter the results.  A description of the restrictions is contained
+            in the Restrictions collection.
+            </param>
+            <returns>The collection specified.</returns>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnection.Notice">
+            <summary>
+            Occurs on NoticeResponses from the PostgreSQL backend.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnection.Notification">
+            <summary>
+            Occurs on NotificationResponses from the PostgreSQL backend.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnection.ProvideClientCertificatesCallback">
+            <summary>
+            Called to provide client certificates for SSL handshake.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnection.CertificateSelectionCallback">
+            <summary>
+            Mono.Security.Protocol.Tls.CertificateSelectionCallback delegate.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnection.CertificateValidationCallback">
+            <summary>
+            Mono.Security.Protocol.Tls.CertificateValidationCallback delegate.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnection.PrivateKeySelectionCallback">
+            <summary>
+            Mono.Security.Protocol.Tls.PrivateKeySelectionCallback delegate.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.ConnectionString">
+            <summary>
+            Gets or sets the string used to connect to a PostgreSQL database.
+            Valid values are:
+            <ul>
+            <li>
+            Server:             Address/Name of Postgresql Server;
+            </li>
+            <li>
+            Port:               Port to connect to;
+            </li>
+            <li>
+            Protocol:           Protocol version to use, instead of automatic; Integer 2 or 3;
+            </li>
+            <li>
+            Database:           Database name. Defaults to user name if not specified;
+            </li>
+            <li>
+            User Id:            User name;
+            </li>
+            <li>
+            Password:           Password for clear text authentication;
+            </li>
+            <li>
+            SSL:                True or False. Controls whether to attempt a secure connection. Default = False;
+            </li>
+            <li>
+            Pooling:            True or False. Controls whether connection pooling is used. Default = True;
+            </li>
+            <li>
+            MinPoolSize:        Min size of connection pool;
+            </li>
+            <li>
+            MaxPoolSize:        Max size of connection pool;
+            </li>
+            <li>
+            Timeout:            Time to wait for connection open in seconds. Default is 15.
+            </li>
+            <li>
+            CommandTimeout:     Time to wait for command to finish execution before throw an exception. In seconds. Default is 20.
+            </li>
+            <li>
+            Sslmode:            Mode for ssl connection control. Can be Prefer, Require, Allow or Disable. Default is Disable. Check user manual for explanation of values.
+            </li>
+            <li>
+            ConnectionLifeTime: Time to wait before closing unused connections in the pool in seconds. Default is 15.
+            </li>
+            <li>
+            SyncNotification:   Specifies if Npgsql should use synchronous notifications.
+            </li>
+            <li>
+            SearchPath: Changes search path to specified and public schemas.
+            </li>
+            </ul>
+            </summary>
+            <value>The connection string that includes the server name,
+            the database name, and other parameters needed to establish
+            the initial connection. The default value is an empty string.
+            </value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.Host">
+            <summary>
+            Backend server host name.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.Port">
+            <summary>
+            Backend server port.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.SSL">
+            <summary>
+            If true, the connection will attempt to use SSL.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.ConnectionTimeout">
+            <summary>
+            Gets the time to wait while trying to establish a connection
+            before terminating the attempt and generating an error.
+            </summary>
+            <value>The time (in seconds) to wait for a connection to open. The default value is 15 seconds.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.CommandTimeout">
+            <summary>
+            Gets the time to wait while trying to execute a command
+            before terminating the attempt and generating an error.
+            </summary>
+            <value>The time (in seconds) to wait for a command to complete. The default value is 20 seconds.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.ConnectionLifeTime">
+            <summary>
+            Gets the time to wait before closing unused connections in the pool if the count
+            of all connections exeeds MinPoolSize.
+            </summary>
+            <remarks>
+            If connection pool contains unused connections for ConnectionLifeTime seconds,
+            the half of them will be closed. If there will be unused connections in a second
+            later then again the half of them will be closed and so on.
+            This strategy provide smooth change of connection count in the pool.
+            </remarks>
+            <value>The time (in seconds) to wait. The default value is 15 seconds.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.Database">
+            <summary>
+             Gets the name of the current database or the database to be used after a connection is opened.
+             </summary>
+             <value>The name of the current database or the name of the database to be
+             used after a connection is opened. The default value is the empty string.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.PreloadReader">
+            <summary>
+            Whether datareaders are loaded in their entirety (for compatibility with earlier code).
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.DataSource">
+            <summary>
+            Gets the database server name.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.SyncNotification">
+            <summary>
+            Gets flag indicating if we are using Synchronous notification or not.
+            The default value is false.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.FullState">
+            <summary>
+            Gets the current state of the connection.
+            </summary>
+            <value>A bitwise combination of the <see cref="T:System.Data.ConnectionState">ConnectionState</see> values. The default is <b>Closed</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.State">
+            <summary>
+            Gets whether the current state of the connection is Open or Closed
+            </summary>
+            <value>ConnectionState.Open or ConnectionState.Closed</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.PostgreSqlVersion">
+            <summary>
+            Version of the PostgreSQL backend.
+            This can only be called when there is an active connection.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.BackendProtocolVersion">
+            <summary>
+            Protocol version in use.
+            This can only be called when there is an active connection.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.ProcessID">
+            <summary>
+            Process id of backend server.
+            This can only be called when there is an active connection.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.Connector">
+            <summary>
+            The connector object connected to the backend.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.ConnectionStringValues">
+            <summary>
+            Gets the NpgsqlConnectionStringBuilder containing the parsed connection string values.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.UserName">
+            <summary>
+            User name.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.Password">
+            <summary>
+            Password.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.Pooling">
+            <summary>
+            Determine if connection pooling will be used for this connection.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectionStringBuilder.Clone">
+            <summary>
+            Return an exact copy of this NpgsqlConnectionString.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectionStringBuilder.SetValue(System.String,System.Object)">
+            <summary>
+            This function will set value for known key, both private member and base[key].
+            </summary>
+            <param name="keyword"></param>
+            <param name="value"></param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectionStringBuilder.SetValue(Npgsql.Keywords,System.Object)">
+            <summary>
+            The function will modify private member only, not base[key].
+            </summary>
+            <param name="keyword"></param>
+            <param name="value"></param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectionStringBuilder.Clear">
+            <summary>
+            Clear the member and assign them to the default value.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnectionStringBuilder.Compatible">
+            <summary>
+            Compatibilty version. When possible, behaviour caused by breaking changes will be preserved
+            if this version is less than that where the breaking change was introduced.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnectionStringBuilder.Item(System.String)">
+            <summary>
+            Case insensative accessor for indivual connection string values.
+            </summary>
+        </member>
+        <member name="T:Npgsql.ProvideClientCertificatesCallback">
+            <summary>
+            Represents the method that allows the application to provide a certificate collection to be used for SSL clien authentication
+            </summary>
+            <param name="certificates">A <see cref="T:System.Security.Cryptography.X509Certificates.X509CertificateCollection">X509CertificateCollection</see> to be filled with one or more client certificates.</param>
+        </member>
+        <member name="T:Npgsql.NpgsqlConnector">
+            <summary>
+            !!! Helper class, for compilation only.
+            Connector implements the logic for the Connection Objects to
+            access the physical connection to the database, and isolate
+            the application developer from connection pooling internals.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.#ctor(Npgsql.NpgsqlConnectionStringBuilder,System.Boolean,System.Boolean)">
+            <summary>
+            Constructor.
+            </summary>
+            <param name="Shared">Controls whether the connector can be shared.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.IsValid">
+            <summary>
+            This method checks if the connector is still ok.
+            We try to send a simple query text, select 1 as ConnectionTest;
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.ReleaseResources">
+            <summary>
+            This method is responsible for releasing all resources associated with this Connector.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.ReleasePlansPortals">
+            <summary>
+            This method is responsible to release all portals used by this Connector.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.DefaultCertificateSelectionCallback(System.Security.Cryptography.X509Certificates.X509CertificateCollection,System.Security.Cryptography.X509Certificates.X509Certificate,System.String,System.Security.Cryptography.X509Certificates.X509CertificateCollection)">
+            <summary>
+            Default SSL CertificateSelectionCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.DefaultCertificateValidationCallback(System.Security.Cryptography.X509Certificates.X509Certificate,System.Int32[])">
+            <summary>
+            Default SSL CertificateValidationCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.DefaultPrivateKeySelectionCallback(System.Security.Cryptography.X509Certificates.X509Certificate,System.String)">
+            <summary>
+            Default SSL PrivateKeySelectionCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.DefaultProvideClientCertificatesCallback(System.Security.Cryptography.X509Certificates.X509CertificateCollection)">
+            <summary>
+            Default SSL ProvideClientCertificatesCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.ProcessServerVersion">
+            <summary>
+            This method is required to set all the version dependent features flags.
+            SupportsPrepare means the server can use prepared query plans (7.3+)
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.Open">
+            <summary>
+            Opens the physical connection to the server.
+            </summary>
+            <remarks>Usually called by the RequestConnector
+            Method of the connection pool manager.</remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.Close">
+            <summary>
+            Closes the physical connection to the server.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.NextPortalName">
+            <summary>
+             Returns next portal index.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.NextPlanName">
+            <summary>
+             Returns next plan index.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnector.Notice">
+            <summary>
+            Occurs on NoticeResponses from the PostgreSQL backend.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnector.Notification">
+            <summary>
+            Occurs on NotificationResponses from the PostgreSQL backend.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnector.ProvideClientCertificatesCallback">
+            <summary>
+            Called to provide client certificates for SSL handshake.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnector.CertificateSelectionCallback">
+            <summary>
+            Mono.Security.Protocol.Tls.CertificateSelectionCallback delegate.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnector.CertificateValidationCallback">
+            <summary>
+            Mono.Security.Protocol.Tls.CertificateValidationCallback delegate.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnector.PrivateKeySelectionCallback">
+            <summary>
+            Mono.Security.Protocol.Tls.PrivateKeySelectionCallback delegate.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.State">
+            <summary>
+            Gets the current state of the connection.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.ConnectionString">
+            <summary>
+            Return Connection String.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.ServerVersion">
+            <summary>
+            Version of backend server this connector is connected to.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.BackendProtocolVersion">
+            <summary>
+            Backend protocol version in use by this connector.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.Stream">
+            <summary>
+            The physical connection stream to the backend.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.Socket">
+            <summary>
+            The physical connection socket to the backend.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.IsInitialized">
+            <summary>
+            Reports if this connector is fully connected.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.Mediator">
+            <summary>
+            The connection mediator.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.Transaction">
+            <summary>
+            Report if the connection is in a transaction.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.SupportsPrepare">
+            <summary>
+            Report whether the current connection can support prepare functionality.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlConnectorPool">
+            <summary>
+            This class manages all connector objects, pooled AND non-pooled.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlConnectorPool.ConnectorPoolMgr">
+            <value>Unique static instance of the connector pool
+            mamager.</value>
+        </member>
+        <member name="F:Npgsql.NpgsqlConnectorPool.PooledConnectors">
+            <value>Map of index to unused pooled connectors, avaliable to the
+            next RequestConnector() call.</value>
+            <remarks>This hashmap will be indexed by connection string.
+            This key will hold a list of queues of pooled connectors available to be used.</remarks>
+        </member>
+        <member name="F:Npgsql.NpgsqlConnectorPool.Timer">
+            <value>Timer for tracking unused connections in pools.</value>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.RequestConnector(Npgsql.NpgsqlConnection)">
+            <summary>
+            Searches the shared and pooled connector lists for a
+            matching connector object or creates a new one.
+            </summary>
+            <param name="Connection">The NpgsqlConnection that is requesting
+            the connector. Its ConnectionString will be used to search the
+            pool for available connectors.</param>
+            <returns>A connector object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.RequestPooledConnector(Npgsql.NpgsqlConnection)">
+            <summary>
+            Find a pooled connector.  Handle locking and timeout here.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.RequestPooledConnectorInternal(Npgsql.NpgsqlConnection)">
+            <summary>
+            Find a pooled connector.  Handle shared/non-shared here.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.ReleaseConnector(Npgsql.NpgsqlConnection,Npgsql.NpgsqlConnector)">
+            <summary>
+            Releases a connector, possibly back to the pool for future use.
+            </summary>
+            <remarks>
+            Pooled connectors will be put back into the pool if there is room.
+            Shared connectors should just have their use count decremented
+            since they always stay in the shared pool.
+            </remarks>
+            <param name="Connector">The connector to release.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.ReleasePooledConnector(Npgsql.NpgsqlConnection,Npgsql.NpgsqlConnector)">
+            <summary>
+            Release a pooled connector.  Handle locking here.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.ReleasePooledConnectorInternal(Npgsql.NpgsqlConnection,Npgsql.NpgsqlConnector)">
+            <summary>
+            Release a pooled connector.  Handle shared/non-shared here.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.GetNonPooledConnector(Npgsql.NpgsqlConnection)">
+            <summary>
+            Create a connector without any pooling functionality.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.GetPooledConnector(Npgsql.NpgsqlConnection)">
+            <summary>
+            Find an available pooled connector in the non-shared pool, or create
+            a new one if none found.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.FixPoolCountBecauseOfConnectionDisposeFalse(Npgsql.NpgsqlConnection)">
+            <summary>
+            This method is only called when NpgsqlConnection.Dispose(false) is called which means a
+            finalization. This also means, an NpgsqlConnection was leak. We clear pool count so that
+            client doesn't end running out of connections from pool. When the connection is finalized, its underlying
+            socket is closed.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.UngetNonPooledConnector(Npgsql.NpgsqlConnection,Npgsql.NpgsqlConnector)">
+            <summary>
+            Close the connector.
+            </summary>
+            <param name="Connection"></param>
+            <param name="Connector">Connector to release</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.UngetPooledConnector(Npgsql.NpgsqlConnection,Npgsql.NpgsqlConnector)">
+            <summary>
+            Put a pooled connector into the pool queue.
+            </summary>
+            <param name="Connector">Connector to pool</param>
+        </member>
+        <member name="T:Npgsql.NpgsqlConnectorPool.ConnectorQueue">
+            <summary>
+            A queue with an extra Int32 for keeping track of busy connections.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlConnectorPool.ConnectorQueue.Available">
+            <summary>
+            Connections available to the end user
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlConnectorPool.ConnectorQueue.Busy">
+            <summary>
+            Connections currently in use
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyFormat">
+            <summary>
+            Represents information about COPY operation data transfer format as returned by server.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyFormat.#ctor(System.Byte,System.Int16[])">
+            <summary>
+            Only created when a CopyInResponse or CopyOutResponse is received by NpgsqlState.ProcessBackendResponses()
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyFormat.FieldIsBinary(System.Int32)">
+            <summary>
+            Returns true if this operation is currently active and field at given location is in binary format.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyFormat.IsBinary">
+            <summary>
+            Returns true if this operation is currently active and in binary format.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyFormat.FieldCount">
+            <summary>
+            Returns number of fields if this operation is currently active, otherwise -1
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyIn">
+            <summary>
+            Represents a PostgreSQL COPY FROM STDIN operation with a corresponding SQL statement
+            to execute against a PostgreSQL database
+            and an associated stream used to read data from (if provided by user)
+            or for writing it (when generated by driver).
+            Eg. new NpgsqlCopyIn("COPY mytable FROM STDIN", connection, streamToRead).Start();
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.#ctor(System.String,Npgsql.NpgsqlConnection)">
+            <summary>
+            Creates NpgsqlCommand to run given query upon Start(). Data for the requested COPY IN operation can then be written to CopyData stream followed by a call to End() or Cancel().
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.#ctor(Npgsql.NpgsqlCommand,Npgsql.NpgsqlConnection)">
+            <summary>
+            Given command is run upon Start(). Data for the requested COPY IN operation can then be written to CopyData stream followed by a call to End() or Cancel().
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.#ctor(Npgsql.NpgsqlCommand,Npgsql.NpgsqlConnection,System.IO.Stream)">
+            <summary>
+            Given command is executed upon Start() and all data from fromStream is passed to it as copy data.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.FieldIsBinary(System.Int32)">
+            <summary>
+            Returns true if this operation is currently active and field at given location is in binary format.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.Start">
+            <summary>
+            Command specified upon creation is executed as a non-query.
+            If CopyStream is set upon creation, it will be flushed to server as copy data, and operation will be finished immediately.
+            Otherwise the CopyStream member can be used for writing copy data to server and operation finished with a call to End() or Cancel().
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.End">
+            <summary>
+            Called after writing all data to CopyStream to successfully complete this copy operation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.Cancel(System.String)">
+            <summary>
+            Withdraws an already started copy operation. The operation will fail with given error message.
+            Will do nothing if current operation is not active.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyIn.IsActive">
+            <summary>
+            Returns true if the connection is currently reserved for this operation.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyIn.CopyStream">
+            <summary>
+            The stream provided by user or generated upon Start().
+            User may provide a stream to constructor; it is used to pass to server all data read from it.
+            Otherwise, call to Start() sets this to a writable NpgsqlCopyInStream that passes all data written to it to server.
+            In latter case this is only available while the copy operation is active and null otherwise.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyIn.IsBinary">
+            <summary>
+            Returns true if this operation is currently active and in binary format.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyIn.FieldCount">
+            <summary>
+            Returns number of fields expected on each input row if this operation is currently active, otherwise -1
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyIn.NpgsqlCommand">
+            <summary>
+            The Command used to execute this copy operation.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyIn.CopyBufferSize">
+            <summary>
+            Set before a COPY IN query to define size of internal buffer for reading from given CopyStream.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyInState">
+            <summary>
+            Represents an ongoing COPY FROM STDIN operation.
+            Provides methods to push data to server and end or cancel the operation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInState.StartCopy(Npgsql.NpgsqlConnector,Npgsql.NpgsqlCopyFormat)">
+            <summary>
+            Called from NpgsqlState.ProcessBackendResponses upon CopyInResponse.
+            If CopyStream is already set, it is used to read data to push to server, after which the copy is completed.
+            Otherwise CopyStream is set to a writable NpgsqlCopyInStream that calls SendCopyData each time it is written to.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInState.SendCopyData(Npgsql.NpgsqlConnector,System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Sends given packet to server as a CopyData message.
+            Does not check for notifications! Use another thread for that.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInState.SendCopyDone(Npgsql.NpgsqlConnector)">
+            <summary>
+            Sends CopyDone message to server. Handles responses, ie. may throw an exception.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInState.SendCopyFail(Npgsql.NpgsqlConnector,System.String)">
+            <summary>
+            Sends CopyFail message to server. Handles responses, ie. should always throw an exception:
+            in CopyIn state the server responds to CopyFail with an error response;
+            outside of a CopyIn state the server responds to CopyFail with an error response;
+            without network connection or whatever, there's going to eventually be a failure, timeout or user intervention.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInState.CopyFormat">
+            <summary>
+            Copy format information returned from server.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyInStream">
+            <summary>
+            Stream for writing data to a table on a PostgreSQL version 7.4 or newer database during an active COPY FROM STDIN operation.
+            <b>Passes data exactly as is and when given</b>, so see to it that you use server encoding, correct format and reasonably sized writes!
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.#ctor(Npgsql.NpgsqlConnector)">
+            <summary>
+            Created only by NpgsqlCopyInState.StartCopy()
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.Close">
+            <summary>
+            Successfully completes copying data to server. Returns after operation is finished.
+            Does nothing if this stream is not the active copy operation writer.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.Cancel(System.String)">
+            <summary>
+            Withdraws an already started copy operation. The operation will fail with given error message.
+            Does nothing if this stream is not the active copy operation writer.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.Write(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Writes given bytes to server.
+            Fails if this stream is not the active copy operation writer.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.Flush">
+            <summary>
+            Flushes stream contents to server.
+            Fails if this stream is not the active copy operation writer.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.Read(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Not readable
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.Seek(System.Int64,System.IO.SeekOrigin)">
+            <summary>
+            Not seekable
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.SetLength(System.Int64)">
+            <summary>
+            Not supported
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInStream.IsActive">
+            <summary>
+            True while this stream can be used to write copy data to server
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInStream.CanRead">
+            <summary>
+            False
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInStream.CanWrite">
+            <summary>
+            True
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInStream.CanSeek">
+            <summary>
+            False
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInStream.Length">
+            <summary>
+            Number of bytes written so far
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInStream.Position">
+            <summary>
+            Number of bytes written so far; not settable
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyOut">
+            <summary>
+            Represents a PostgreSQL COPY TO STDOUT operation with a corresponding SQL statement
+            to execute against a PostgreSQL database
+            and an associated stream used to write results to (if provided by user)
+            or for reading the results (when generated by driver).
+            Eg. new NpgsqlCopyOut("COPY (SELECT * FROM mytable) TO STDOUT", connection, streamToWrite).Start();
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOut.#ctor(System.String,Npgsql.NpgsqlConnection)">
+            <summary>
+            Creates NpgsqlCommand to run given query upon Start(), after which CopyStream provides data from database as requested in the query.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOut.#ctor(Npgsql.NpgsqlCommand,Npgsql.NpgsqlConnection)">
+            <summary>
+            Given command is run upon Start(), after which CopyStream provides data from database as requested in the query.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOut.#ctor(Npgsql.NpgsqlCommand,Npgsql.NpgsqlConnection,System.IO.Stream)">
+            <summary>
+            Given command is executed upon Start() and all requested copy data is written to toStream immediately.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOut.FieldIsBinary(System.Int32)">
+            <summary>
+            Returns true if this operation is currently active and field at given location is in binary format.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOut.Start">
+            <summary>
+            Command specified upon creation is executed as a non-query.
+            If CopyStream is set upon creation, all copy data from server will be written to it, and operation will be finished immediately.
+            Otherwise the CopyStream member can be used for reading copy data from server until no more data is available.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOut.End">
+            <summary>
+            Flush generated CopyStream at once. Effectively reads and discard all the rest of copy data from server.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOut.IsActive">
+            <summary>
+            Returns true if the connection is currently reserved for this operation.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOut.CopyStream">
+            <summary>
+            The stream provided by user or generated upon Start()
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOut.NpgsqlCommand">
+            <summary>
+            The Command used to execute this copy operation.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOut.IsBinary">
+            <summary>
+            Returns true if this operation is currently active and in binary format.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOut.FieldCount">
+            <summary>
+            Returns number of fields if this operation is currently active, otherwise -1
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOut.Read">
+            <summary>
+            Faster alternative to using the generated CopyStream.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyOutState">
+            <summary>
+            Represents an ongoing COPY TO STDOUT operation.
+            Provides methods to read data from server or end the operation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutState.StartCopy(Npgsql.NpgsqlConnector,Npgsql.NpgsqlCopyFormat)">
+            <summary>
+            Called from NpgsqlState.ProcessBackendResponses upon CopyOutResponse.
+            If CopyStream is already set, it is used to write data received from server, after which the copy ends.
+            Otherwise CopyStream is set to a readable NpgsqlCopyOutStream that receives data from server.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutState.GetCopyData(Npgsql.NpgsqlConnector)">
+            <summary>
+            Called from NpgsqlOutStream.Read to read copy data from server.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutState.CopyFormat">
+            <summary>
+            Copy format information returned from server.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyOutStream">
+            <summary>
+            Stream for reading data from a table or select on a PostgreSQL version 7.4 or newer database during an active COPY TO STDOUT operation.
+            <b>Passes data exactly as provided by the server.</b>
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.#ctor(Npgsql.NpgsqlConnector)">
+            <summary>
+            Created only by NpgsqlCopyOutState.StartCopy()
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.Close">
+            <summary>
+            Discards copy data as long as server pushes it. Returns after operation is finished.
+            Does nothing if this stream is not the active copy operation reader.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.Write(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Not writable.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.Flush">
+            <summary>
+            Not flushable.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.Read(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Copies data read from server to given byte buffer.
+            Since server returns data row by row, length will differ each time, but it is only zero once the operation ends.
+            Can be mixed with calls to the more efficient NpgsqlCopyOutStream.Read() : byte[] though that would not make much sense.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.Seek(System.Int64,System.IO.SeekOrigin)">
+            <summary>
+            Not seekable
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.SetLength(System.Int64)">
+            <summary>
+            Not supported
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.Read">
+            <summary>
+            Returns a whole row of data from server without extra work.
+            If standard Stream.Read(...) has been called before, it's internal buffers remains are returned.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutStream.IsActive">
+            <summary>
+            True while this stream can be used to read copy data from server
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutStream.CanRead">
+            <summary>
+            True
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutStream.CanWrite">
+            <summary>
+            False
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutStream.CanSeek">
+            <summary>
+            False
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutStream.Length">
+            <summary>
+            Number of bytes read so far
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutStream.Position">
+            <summary>
+            Number of bytes read so far; can not be set.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopySerializer">
+            <summary>
+            Writes given objects into a stream for PostgreSQL COPY in default copy format (not CSV or BINARY).
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlRowUpdatedEventHandler">
+            <summary>
+            Represents the method that handles the <see cref="E:Npgsql.NpgsqlDataAdapter.RowUpdated">RowUpdated</see> events.
+            </summary>
+            <param name="sender">The source of the event.</param>
+            <param name="e">A <see cref="T:NpgsqlRowUpdatedEventArgs">NpgsqlRowUpdatedEventArgs</see> that contains the event data.</param>
+        </member>
+        <member name="T:Npgsql.NpgsqlRowUpdatingEventHandler">
+            <summary>
+            Represents the method that handles the <see cref="E:Npgsql.NpgsqlDataAdapter.RowUpdating">RowUpdating</see> events.
+            </summary>
+            <param name="sender">The source of the event.</param>
+            <param name="e">A <see cref="T:NpgsqlRowUpdatingEventArgs">NpgsqlRowUpdatingEventArgs</see> that contains the event data.</param>
+        </member>
+        <member name="T:Npgsql.NpgsqlDataAdapter">
+            <summary>
+            This class represents an adapter from many commands: select, update, insert and delete to fill <see cref="T:System.Data.DataSet">Datasets.</see>
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlDataReader">
+            <summary>
+            Provides a means of reading a forward-only stream of rows from a PostgreSQL backend.  This class cannot be inherited.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetDataTypeName(System.Int32)">
+            <summary>
+            Return the data type name of the column at index <param name="Index"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetFieldType(System.Int32)">
+            <summary>
+            Return the data type of the column at index <param name="Index"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetProviderSpecificFieldType(System.Int32)">
+            <summary>
+            Return the Npgsql specific data type of the column at requested ordinal.
+            </summary>
+            <param name="ordinal">column position</param>
+            <returns>Appropriate Npgsql type for column.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetName(System.Int32)">
+            <summary>
+            Return the column name of the column at index <param name="Index"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetDataTypeOID(System.Int32)">
+            <summary>
+            Return the data type OID of the column at index <param name="Index"></param>.
+            </summary>
+            FIXME: Why this method returns String?
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetOrdinal(System.String)">
+            <summary>
+            Return the column name of the column named <param name="Name"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetFieldDbType(System.Int32)">
+            <summary>
+            Return the data DbType of the column at index <param name="Index"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetFieldNpgsqlDbType(System.Int32)">
+            <summary>
+            Return the data NpgsqlDbType of the column at index <param name="Index"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetInterval(System.Int32)">
+            <summary>
+            Get the value of a column as a <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.
+            <remarks>If the differences between <see cref="T:NpgsqlTypes.NpgsqlInterval"/> and <see cref="!:System.Timespan"/>
+            in handling of days and months is not important to your application, use <see cref="!:GetTimeSpan()"/>
+            instead.</remarks>
+            </summary>
+            <param name="i">Index of the field to find.</param>
+            <returns><see cref="T:NpgsqlTypes.NpgsqlInterval"/> value of the field.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetGuid(System.Int32)">
+            <summary>
+            Gets the value of a column converted to a Guid.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetInt16(System.Int32)">
+            <summary>
+            Gets the value of a column as Int16.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetInt32(System.Int32)">
+            <summary>
+            Gets the value of a column as Int32.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetInt64(System.Int32)">
+            <summary>
+            Gets the value of a column as Int64.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetFloat(System.Int32)">
+            <summary>
+            Gets the value of a column as Single.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetDouble(System.Int32)">
+            <summary>
+            Gets the value of a column as Double.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetString(System.Int32)">
+            <summary>
+            Gets the value of a column as String.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetDecimal(System.Int32)">
+            <summary>
+            Gets the value of a column as Decimal.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetTimeSpan(System.Int32)">
+            <summary>
+            Gets the value of a column as TimeSpan.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetValues(System.Object[])">
+            <summary>
+            Copy values from each column in the current row into <param name="Values"></param>.
+            </summary>
+            <returns>The number of column values copied.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetProviderSpecificValues(System.Object[])">
+            <summary>
+            Copy values from each column in the current row into <param name="Values"></param>.
+            </summary>
+            <param name="values">An array appropriately sized to store values from all columns.</param>
+            <returns>The number of column values copied.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetBoolean(System.Int32)">
+            <summary>
+            Gets the value of a column as Boolean.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetByte(System.Int32)">
+            <summary>
+            Gets the value of a column as Byte.  Not implemented.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetChar(System.Int32)">
+            <summary>
+            Gets the value of a column as Char.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetDateTime(System.Int32)">
+            <summary>
+            Gets the value of a column as DateTime.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetSchemaTable">
+            <summary>
+            Returns a System.Data.DataTable that describes the column metadata of the DataReader.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetTableNameFromQuery">
+            <summary>
+             This methods parses the command text and tries to get the tablename
+             from it.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlDataReader.ReaderClosed">
+            <summary>
+            Is raised whenever Close() is called.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlDataReader.FieldCount">
+            <summary>
+            Gets the number of columns in the current row.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlDataReader.Item(System.Int32)">
+            <summary>
+            Gets the value of a column in its native format.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlDataReader.Item(System.String)">
+            <summary>
+            Gets the value of a column in its native format.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlDataReader.Depth">
+            <summary>
+            Gets a value indicating the depth of nesting for the current row.  Always returns zero.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlDataReader.IsClosed">
+            <summary>
+            Gets a value indicating whether the data reader is closed.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlDataReader.KeyLookup.primaryKey">
+            <summary>
+            Contains the column names as the keys
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlDataReader.KeyLookup.uniqueColumns">
+            <summary>
+            Contains all unique columns
+            </summary>
+        </member>
+        <member name="T:Npgsql.ForwardsOnlyDataReader">
+            <summary>
+            This is the primary implementation of NpgsqlDataReader. It is the one used in normal cases (where the 
+            preload-reader option is not set in the connection string to resolve some potential backwards-compatibility
+            issues), the only implementation used internally, and in cases where CachingDataReader is used, it is still
+            used to do the actual "leg-work" of turning a response stream from the server into a datareader-style
+            object - with CachingDataReader then filling it's cache from here.
+            </summary>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.GetNextResponseObject">
+            <summary>
+            Iterate through the objects returned through from the server.
+            If it's a CompletedResponse the rowsaffected count is updated appropriately,
+            and we iterate again, otherwise we return it (perhaps updating our cache of pending
+            rows if appropriate).
+            </summary>
+            <returns>The next <see cref="T:Npgsql.IServerResponseObject"/> we will deal with.</returns>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.GetNextRowDescription">
+            <summary>
+            Advances the data reader to the next result, when multiple result sets were returned by the PostgreSQL backend.
+            </summary>
+            <returns>True if the reader was advanced, otherwise false.</returns>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.Dispose(System.Boolean)">
+            <summary>
+            Releases the resources used by the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.Close">
+            <summary>
+            Closes the data reader object.
+            </summary>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.NextResult">
+            <summary>
+            Advances the data reader to the next result, when multiple result sets were returned by the PostgreSQL backend.
+            </summary>
+            <returns>True if the reader was advanced, otherwise false.</returns>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.Read">
+            <summary>
+            Advances the data reader to the next row.
+            </summary>
+            <returns>True if the reader was advanced, otherwise false.</returns>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.GetValue(System.Int32)">
+            <summary>
+            Return the value of the column at index <param name="Index"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.GetBytes(System.Int32,System.Int64,System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Gets raw data from a column.
+            </summary>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.GetChars(System.Int32,System.Int64,System.Char[],System.Int32,System.Int32)">
+            <summary>
+            Gets raw data from a column.
+            </summary>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.IsDBNull(System.Int32)">
+            <summary>
+            Report whether the value in a column is DBNull.
+            </summary>
+        </member>
+        <member name="P:Npgsql.ForwardsOnlyDataReader.RecordsAffected">
+            <summary>
+            Gets the number of rows changed, inserted, or deleted by execution of the SQL statement.
+            </summary>
+        </member>
+        <member name="P:Npgsql.ForwardsOnlyDataReader.HasRows">
+            <summary>
+            Indicates if NpgsqlDatareader has rows to be read.
+            </summary>
+        </member>
+        <member name="T:Npgsql.CachingDataReader">
+            <summary>
+            <para>Provides an implementation of NpgsqlDataReader in which all data is pre-loaded into memory.
+            This operates by first creating a ForwardsOnlyDataReader as usual, and then loading all of it's
+            Rows into memory. There is a general principle that when there is a trade-off between a class design that
+            is more efficient and/or scalable on the one hand and one that is less efficient but has more functionality
+            (in this case the internal-only functionality of caching results) that one can build the less efficent class
+            from the most efficient without significant extra loss in efficiency, but not the other way around. The relationship
+            between ForwardsOnlyDataReader and CachingDataReader is an example of this).</para>
+            <para>Since the interface presented to the user is still forwards-only, queues are used to
+            store this information, so that dequeueing as we go we give the garbage collector the best opportunity
+            possible to reclaim any memory that is no longer in use.</para>
+            <para>ForwardsOnlyDataReader being used to actually
+            obtain the information from the server means that the "leg-work" is still only done (and need only be
+            maintained) in one place.</para>
+            <para>This class exists to allow for certain potential backwards-compatibility issues to be resolved
+            with little effort on the part of affected users. It is considerably less efficient than ForwardsOnlyDataReader
+            and hence never used internally.</para>
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlDescribe">
+             <summary>
+             This class represents the Parse message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlNoticeEventArgs">
+            <summary>
+            EventArgs class to send Notice parameters, which are just NpgsqlError's in a lighter context.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlNoticeEventArgs.Notice">
+            <summary>
+            Notice information.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlError">
+            <summary>
+            This class represents the ErrorResponse and NoticeResponse
+            message sent from PostgreSQL server.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlError.ToString">
+            <summary>
+            Return a string representation of this error object.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Severity">
+            <summary>
+            Severity code.  All versions.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Code">
+            <summary>
+            Error code.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Message">
+            <summary>
+            Terse error message.  All versions.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Detail">
+            <summary>
+            Detailed error message.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Hint">
+            <summary>
+            Suggestion to help resolve the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Position">
+            <summary>
+            Position (one based) within the query string where the error was encounterd.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.InternalPosition">
+            <summary>
+            Position (one based) within the query string where the error was encounterd.  This position refers to an internal command executed for example inside a PL/pgSQL function. PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.InternalQuery">
+            <summary>
+            Internal query string where the error was encounterd.  This position refers to an internal command executed for example inside a PL/pgSQL function. PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Where">
+            <summary>
+            Trace back information.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.File">
+            <summary>
+            Source file (in backend) reporting the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Line">
+            <summary>
+            Source file line number (in backend) reporting the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Routine">
+            <summary>
+            Source routine (in backend) reporting the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.ErrorSql">
+            <summary>
+            String containing the sql sent which produced this error.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.BackendProtocolVersion">
+            <summary>
+            Backend protocol version in use.
+            </summary>
+        </member>
+        <member name="T:Npgsql.LogLevel">
+            <summary>
+            The level of verbosity of the NpgsqlEventLog
+            </summary>
+        </member>
+        <member name="F:Npgsql.LogLevel.None">
+            <summary>
+            Don't log at all
+            </summary>
+        </member>
+        <member name="F:Npgsql.LogLevel.Normal">
+            <summary>
+            Only log the most common issues
+            </summary>
+        </member>
+        <member name="F:Npgsql.LogLevel.Debug">
+            <summary>
+            Log everything
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlEventLog">
+            <summary>
+            This class handles all the Npgsql event and debug logging
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMsg(System.String,Npgsql.LogLevel)">
+            <summary>
+            Writes a string to the Npgsql event log if msglevel is bigger then <see cref="P:Npgsql.NpgsqlEventLog.Level">NpgsqlEventLog.Level</see>
+            </summary>
+            <remarks>
+            This method is obsolete and should no longer be used.
+            It is likely to be removed in future versions of Npgsql
+            </remarks>
+            <param name="message">The message to write to the event log</param>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMsg(System.Resources.ResourceManager,System.String,Npgsql.LogLevel,System.Object[])">
+            <summary>
+            Writes a string to the Npgsql event log if msglevel is bigger then <see cref="P:Npgsql.NpgsqlEventLog.Level">NpgsqlEventLog.Level</see>
+            </summary>
+            <param name="resman">The <see cref="T:System.Resources.ResourceManager">ResourceManager</see> to get the localized resources</param>
+            <param name="ResourceString">The name of the resource that should be fetched by the <see cref="T:System.Resources.ResourceManager">ResourceManager</see></param>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="Parameters">The additional parameters that shall be included into the log-message (must be compatible with the string in the resource):</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogIndexerGet(Npgsql.LogLevel,System.String,System.Object)">
+            <summary>
+            Writes the default log-message for the action of calling the Get-part of an Indexer to the log file.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Indexer</param>
+            <param name="IndexerParam">The parameter given to the Indexer</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogIndexerSet(Npgsql.LogLevel,System.String,System.Object,System.Object)">
+            <summary>
+            Writes the default log-message for the action of calling the Set-part of an Indexer to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Indexer</param>
+            <param name="IndexerParam">The parameter given to the Indexer</param>
+            <param name="value">The value the Indexer is set to</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogPropertyGet(Npgsql.LogLevel,System.String,System.String)">
+            <summary>
+            Writes the default log-message for the action of calling the Get-part of a Property to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Property</param>
+            <param name="PropertyName">The name of the Property</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogPropertySet(Npgsql.LogLevel,System.String,System.String,System.Object)">
+            <summary>
+            Writes the default log-message for the action of calling the Set-part of a Property to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Property</param>
+            <param name="PropertyName">The name of the Property</param>
+            <param name="value">The value the Property is set to</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMethodEnter(Npgsql.LogLevel,System.String,System.String)">
+            <summary>
+            Writes the default log-message for the action of calling a Method without Arguments to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Method</param>
+            <param name="MethodName">The name of the Method</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMethodEnter(Npgsql.LogLevel,System.String,System.String,System.Object)">
+            <summary>
+            Writes the default log-message for the action of calling a Method with one Argument to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Method</param>
+            <param name="MethodName">The name of the Method</param>
+            <param name="MethodParameter">The value of the Argument of the Method</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMethodEnter(Npgsql.LogLevel,System.String,System.String,System.Object,System.Object)">
+            <summary>
+            Writes the default log-message for the action of calling a Method with two Arguments to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Method</param>
+            <param name="MethodName">The name of the Method</param>
+            <param name="MethodParameter1">The value of the first Argument of the Method</param>
+            <param name="MethodParameter2">The value of the second Argument of the Method</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMethodEnter(Npgsql.LogLevel,System.String,System.String,System.Object,System.Object,System.Object)">
+            <summary>
+            Writes the default log-message for the action of calling a Method with three Arguments to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Method</param>
+            <param name="MethodName">The name of the Method</param>
+            <param name="MethodParameter1">The value of the first Argument of the Method</param>
+            <param name="MethodParameter2">The value of the second Argument of the Method</param>
+            <param name="MethodParameter3">The value of the third Argument of the Method</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMethodEnter(Npgsql.LogLevel,System.String,System.String,System.Object[])">
+            <summary>
+            Writes the default log-message for the action of calling a Method with more than three Arguments to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Method</param>
+            <param name="MethodName">The name of the Method</param>
+            <param name="MethodParameters">A <see cref="T:System.Object">Object</see>-Array with zero or more Ojects that are Arguments of the Method.</param>
+        </member>
+        <member name="P:Npgsql.NpgsqlEventLog.Level">
+            <summary>
+             Sets/Returns the level of information to log to the logfile.
+             </summary>
+             <value>The current <see cref="T:Npgsql.LogLevel">LogLevel</see></value>
+        </member>
+        <member name="P:Npgsql.NpgsqlEventLog.LogName">
+            <summary>
+             Sets/Returns the filename to use for logging.
+             </summary>
+             <value>The filename of the current Log file.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlEventLog.EchoMessages">
+            <summary>
+             Sets/Returns whether Log messages should be echoed to the console
+             </summary>
+             <value><b>true</b> if Log messages are echoed to the console, otherwise <b>false</b></value>
+        </member>
+        <member name="T:Npgsql.NpgsqlException">
+            <summary>
+            The exception that is thrown when the PostgreSQL backend reports errors.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlException.#ctor(System.Collections.IList)">
+            <summary>
+            Construct a backend error exception based on a list of one or more
+            backend errors.  The basic Exception.Message will be built from the
+            first (usually the only) error in the list.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlException.ToString">
+            <summary>
+            Format a .NET style exception string.
+            Include all errors in the list, including any hints.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlException.AppendString(System.IO.StringWriter,System.String,System.String)">
+            <summary>
+            Append a line to the given Stream, first checking for zero-length.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Item(System.Int32)">
+            <summary>
+            Provide access to the entire list of errors provided by the PostgreSQL backend.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Severity">
+            <summary>
+            Severity code.  All versions.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Code">
+            <summary>
+            Error code.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.BaseMessage">
+            <summary>
+            Basic error message.  All versions.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Detail">
+            <summary>
+            Detailed error message.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Hint">
+            <summary>
+            Suggestion to help resolve the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Position">
+            <summary>
+            Position (one based) within the query string where the error was encounterd.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Where">
+            <summary>
+            Trace back information.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.File">
+            <summary>
+            Source file (in backend) reporting the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Line">
+            <summary>
+            Source file line number (in backend) reporting the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Routine">
+            <summary>
+            Source routine (in backend) reporting the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.ErrorSql">
+            <summary>
+            String containing the sql sent which produced this error.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Errors">
+            <summary>
+            Returns the entire list of errors provided by the PostgreSQL backend.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlExecute">
+             <summary>
+             This class represents the Parse message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlFactory">
+            <summary>
+            A factory to create instances of various Npgsql objects.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlFactory.CreateCommand">
+            <summary>
+            Creates an NpgsqlCommand object.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlFlush">
+             <summary>
+             This class represents the Parse message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlMediator">
+            <summary>
+             This class is responsible for serving as bridge between the backend
+             protocol handling and the core classes. It is used as the mediator for
+             exchanging data generated/sent from/to backend.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlNotificationEventArgs">
+            <summary>
+            EventArgs class to send Notification parameters.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlNotificationEventArgs.PID">
+            <summary>
+            Process ID of the PostgreSQL backend that sent this notification.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlNotificationEventArgs.Condition">
+            <summary>
+            Condition that triggered that notification.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlNotificationEventArgs.AdditionalInformation">
+            <summary>
+            Additional Information From Notifiying Process (for future use, currently postgres always sets this to an empty string)
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlParameter">
+            <summary>
+             This class represents a parameter to a command that will be sent to server
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> class.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.#ctor(System.String,System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+            class with the parameter m_Name and a value of the new <b>NpgsqlParameter</b>.
+            </summary>
+            <param m_Name="parameterName">The m_Name of the parameter to map.</param>
+            <param m_Name="value">An <see cref="T:System.Object">Object</see> that is the value of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>.</param>
+            <remarks>
+            <p>When you specify an <see cref="T:System.Object">Object</see>
+            in the value parameter, the <see cref="T:System.Data.DbType">DbType</see> is
+            inferred from the .NET Framework type of the <b>Object</b>.</p>
+            <p>When using this constructor, you must be aware of a possible misuse of the constructor which takes a DbType parameter.
+            This happens when calling this constructor passing an int 0 and the compiler thinks you are passing a value of DbType.
+            Use <code> Convert.ToInt32(value) </code> for example to have compiler calling the correct constructor.</p>
+            </remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.#ctor(System.String,NpgsqlTypes.NpgsqlDbType)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+            class with the parameter m_Name and the data type.
+            </summary>
+            <param m_Name="parameterName">The m_Name of the parameter to map.</param>
+            <param m_Name="parameterType">One of the <see cref="T:System.Data.DbType">DbType</see> values.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.#ctor(System.String,NpgsqlTypes.NpgsqlDbType,System.Int32)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+            class with the parameter m_Name, the <see cref="T:System.Data.DbType">DbType</see>, and the size.
+            </summary>
+            <param m_Name="parameterName">The m_Name of the parameter to map.</param>
+            <param m_Name="parameterType">One of the <see cref="T:System.Data.DbType">DbType</see> values.</param>
+            <param m_Name="size">The length of the parameter.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.#ctor(System.String,NpgsqlTypes.NpgsqlDbType,System.Int32,System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+            class with the parameter m_Name, the <see cref="T:System.Data.DbType">DbType</see>, the size,
+            and the source column m_Name.
+            </summary>
+            <param m_Name="parameterName">The m_Name of the parameter to map.</param>
+            <param m_Name="parameterType">One of the <see cref="T:System.Data.DbType">DbType</see> values.</param>
+            <param m_Name="size">The length of the parameter.</param>
+            <param m_Name="sourceColumn">The m_Name of the source column.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.#ctor(System.String,NpgsqlTypes.NpgsqlDbType,System.Int32,System.String,System.Data.ParameterDirection,System.Boolean,System.Byte,System.Byte,System.Data.DataRowVersion,System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+            class with the parameter m_Name, the <see cref="T:System.Data.DbType">DbType</see>, the size,
+            the source column m_Name, a <see cref="T:System.Data.ParameterDirection">ParameterDirection</see>,
+            the precision of the parameter, the scale of the parameter, a
+            <see cref="T:System.Data.DataRowVersion">DataRowVersion</see> to use, and the
+            value of the parameter.
+            </summary>
+            <param m_Name="parameterName">The m_Name of the parameter to map.</param>
+            <param m_Name="parameterType">One of the <see cref="T:System.Data.DbType">DbType</see> values.</param>
+            <param m_Name="size">The length of the parameter.</param>
+            <param m_Name="sourceColumn">The m_Name of the source column.</param>
+            <param m_Name="direction">One of the <see cref="T:System.Data.ParameterDirection">ParameterDirection</see> values.</param>
+            <param m_Name="isNullable"><b>true</b> if the value of the field can be null, otherwise <b>false</b>.</param>
+            <param m_Name="precision">The total number of digits to the left and right of the decimal point to which
+            <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see> is resolved.</param>
+            <param m_Name="scale">The total number of decimal places to which
+            <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see> is resolved.</param>
+            <param m_Name="sourceVersion">One of the <see cref="T:System.Data.DataRowVersion">DataRowVersion</see> values.</param>
+            <param m_Name="value">An <see cref="T:System.Object">Object</see> that is the value
+            of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.Clone">
+            <summary>
+            Creates a new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> that
+            is a copy of the current instance.
+            </summary>
+            <returns>A new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> that is a copy of this instance.</returns>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.Precision">
+            <summary>
+            Gets or sets the maximum number of digits used to represent the
+            <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see> property.
+            </summary>
+            <value>The maximum number of digits used to represent the
+            <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see> property.
+            The default value is 0, which indicates that the data provider
+            sets the precision for <b>Value</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.Scale">
+            <summary>
+            Gets or sets the number of decimal places to which
+            <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see> is resolved.
+            </summary>
+            <value>The number of decimal places to which
+            <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see> is resolved. The default is 0.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.Size">
+            <summary>
+            Gets or sets the maximum size, in bytes, of the data within the column.
+            </summary>
+            <value>The maximum size, in bytes, of the data within the column.
+            The default value is inferred from the parameter value.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.DbType">
+            <summary>
+            Gets or sets the <see cref="T:System.Data.DbType">DbType</see> of the parameter.
+            </summary>
+            <value>One of the <see cref="T:System.Data.DbType">DbType</see> values. The default is <b>String</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.NpgsqlDbType">
+            <summary>
+            Gets or sets the <see cref="T:System.Data.DbType">DbType</see> of the parameter.
+            </summary>
+            <value>One of the <see cref="T:System.Data.DbType">DbType</see> values. The default is <b>String</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.Direction">
+            <summary>
+            Gets or sets a value indicating whether the parameter is input-only,
+            output-only, bidirectional, or a stored procedure return value parameter.
+            </summary>
+            <value>One of the <see cref="T:System.Data.ParameterDirection">ParameterDirection</see>
+            values. The default is <b>Input</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.IsNullable">
+            <summary>
+            Gets or sets a value indicating whether the parameter accepts null values.
+            </summary>
+            <value><b>true</b> if null values are accepted; otherwise, <b>false</b>. The default is <b>false</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.ParameterName">
+            <summary>
+            Gets or sets the m_Name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>.
+            </summary>
+            <value>The m_Name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>.
+            The default is an empty string.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.CleanName">
+            <summary>
+            The m_Name scrubbed of any optional marker
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.SourceColumn">
+            <summary>
+            Gets or sets the m_Name of the source column that is mapped to the
+            <see cref="T:System.Data.DataSet">DataSet</see> and used for loading or
+            returning the <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see>.
+            </summary>
+            <value>The m_Name of the source column that is mapped to the
+            <see cref="T:System.Data.DataSet">DataSet</see>. The default is an empty string.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.SourceVersion">
+            <summary>
+            Gets or sets the <see cref="T:System.Data.DataRowVersion">DataRowVersion</see>
+            to use when loading <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see>.
+            </summary>
+            <value>One of the <see cref="T:System.Data.DataRowVersion">DataRowVersion</see> values.
+            The default is <b>Current</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.Value">
+            <summary>
+            Gets or sets the value of the parameter.
+            </summary>
+            <value>An <see cref="T:System.Object">Object</see> that is the value of the parameter.
+            The default value is null.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.NpgsqlValue">
+            <summary>
+            Gets or sets the value of the parameter.
+            </summary>
+            <value>An <see cref="T:System.Object">Object</see> that is the value of the parameter.
+            The default value is null.</value>
+        </member>
+        <member name="T:Npgsql.NpgsqlParameterCollection">
+            <summary>
+            Represents a collection of parameters relevant to a <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see>
+            as well as their respective mappings to columns in a <see cref="T:System.Data.DataSet">DataSet</see>.
+            This class cannot be inherited.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.#ctor">
+            <summary>
+            Initializes a new instance of the NpgsqlParameterCollection class.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Add(Npgsql.NpgsqlParameter)">
+            <summary>
+            Adds the specified <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see>.
+            </summary>
+            <param name="value">The <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to add to the collection.</param>
+            <returns>The index of the new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Add(System.String,System.Object)">
+            <summary>
+            Adds a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see> given the specified parameter name and value.
+            </summary>
+            <param name="parameterName">The name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>.</param>
+            <param name="value">The Value of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to add to the collection.</param>
+            <returns>The index of the new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+            <remarks>
+            Use caution when using this overload of the
+            <b>Add</b> method to specify integer parameter values.
+            Because this overload takes a <i>value</i> of type Object,
+            you must convert the integral value to an <b>Object</b>
+            type when the value is zero, as the following C# example demonstrates.
+            <code>parameters.Add(":pname", Convert.ToInt32(0));</code>
+            If you do not perform this conversion, the compiler will assume you
+            are attempting to call the NpgsqlParameterCollection.Add(string, DbType) overload.
+            </remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Add(System.String,NpgsqlTypes.NpgsqlDbType)">
+            <summary>
+            Adds a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see> given the parameter name and the data type.
+            </summary>
+            <param name="parameterName">The name of the parameter.</param>
+            <param name="parameterType">One of the DbType values.</param>
+            <returns>The index of the new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Add(System.String,NpgsqlTypes.NpgsqlDbType,System.Int32)">
+            <summary>
+            Adds a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see> with the parameter name, the data type, and the column length.
+            </summary>
+            <param name="parameterName">The name of the parameter.</param>
+            <param name="parameterType">One of the DbType values.</param>
+            <param name="size">The length of the column.</param>
+            <returns>The index of the new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Add(System.String,NpgsqlTypes.NpgsqlDbType,System.Int32,System.String)">
+            <summary>
+            Adds a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see> with the parameter name, the data type, the column length, and the source column name.
+            </summary>
+            <param name="parameterName">The name of the parameter.</param>
+            <param name="parameterType">One of the DbType values.</param>
+            <param name="size">The length of the column.</param>
+            <param name="sourceColumn">The name of the source column.</param>
+            <returns>The index of the new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.RemoveAt(System.String)">
+            <summary>
+            Removes the specified <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> from the collection using the parameter name.
+            </summary>
+            <param name="parameterName">The name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to retrieve.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Contains(System.String)">
+            <summary>
+            Gets a value indicating whether a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> with the specified parameter name exists in the collection.
+            </summary>
+            <param name="parameterName">The name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to find.</param>
+            <returns><b>true</b> if the collection contains the parameter; otherwise, <b>false</b>.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.IndexOf(System.String)">
+            <summary>
+            Gets the location of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> in the collection with a specific parameter name.
+            </summary>
+            <param name="parameterName">The name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to find.</param>
+            <returns>The zero-based location of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> in the collection.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.RemoveAt(System.Int32)">
+            <summary>
+            Removes the specified <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> from the collection using a specific index.
+            </summary>
+            <param name="index">The zero-based index of the parameter.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Insert(System.Int32,System.Object)">
+            <summary>
+            Inserts a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> into the collection at the specified index.
+            </summary>
+            <param name="index">The zero-based index where the parameter is to be inserted within the collection.</param>
+            <param name="value">The <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to add to the collection.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Remove(System.Object)">
+            <summary>
+            Removes the specified <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> from the collection.
+            </summary>
+            <param name="value">The <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to remove from the collection.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Contains(System.Object)">
+            <summary>
+            Gets a value indicating whether a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> exists in the collection.
+            </summary>
+            <param name="value">The value of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to find.</param>
+            <returns>true if the collection contains the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object; otherwise, false.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.TryGetValue(System.String,Npgsql.NpgsqlParameter@)">
+            <summary>
+            Gets a value indicating whether a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> with the specified parameter name exists in the collection.
+            </summary>
+            <param name="parameterName">The name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to find.</param>
+            <param name="parameter">A reference to the requested parameter is returned in this out param if it is found in the list.  This value is null if the parameter is not found.</param>
+            <returns><b>true</b> if the collection contains the parameter and param will contain the parameter; otherwise, <b>false</b>.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Clear">
+            <summary>
+            Removes all items from the collection.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.IndexOf(System.Object)">
+            <summary>
+            Gets the location of a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> in the collection.
+            </summary>
+            <param name="value">The value of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to find.</param>
+            <returns>The zero-based index of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object in the collection.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Add(System.Object)">
+            <summary>
+            Adds the specified <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see>.
+            </summary>
+            <param name="value">The <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to add to the collection.</param>
+            <returns>The zero-based index of the new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.CopyTo(System.Array,System.Int32)">
+            <summary>
+            Copies <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> objects from the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see> to the specified array.
+            </summary>
+            <param name="array">An <see cref="T:System.Array">Array</see> to which to copy the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> objects in the collection.</param>
+            <param name="index">The starting index of the array.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.GetEnumerator">
+            <summary>
+            Returns an enumerator that can iterate through the collection.
+            </summary>
+            <returns>An <see cref="T:System.Collections.IEnumerator">IEnumerator</see> that can be used to iterate through the collection.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.CheckType(System.Object)">
+            <summary>
+            In methods taking an object as argument this method is used to verify
+            that the argument has the type <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+            </summary>
+            <param name="Object">The object to verify</param>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameterCollection.Item(System.String)">
+            <summary>
+            Gets the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> with the specified name.
+            </summary>
+            <param name="parameterName">The name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to retrieve.</param>
+            <value>The <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> with the specified name, or a null reference if the parameter is not found.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameterCollection.Item(System.Int32)">
+            <summary>
+            Gets the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> at the specified index.
+            </summary>
+            <param name="index">The zero-based index of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to retrieve.</param>
+            <value>The <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> at the specified index.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameterCollection.Count">
+            <summary>
+            Gets the number of <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> objects in the collection.
+            </summary>
+            <value>The number of <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> objects in the collection.</value>
+        </member>
+        <member name="T:Npgsql.NpgsqlParameterStatus">
+             <summary>
+             This class represents the ParameterStatus message sent from PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlParse">
+             <summary>
+             This class represents the Parse message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlPasswordPacket">
+            <summary>
+            This class represents a PasswordPacket message sent to backend
+            PostgreSQL.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlPromotableSinglePhaseNotification.Prepare">
+            <summary>
+            Used when a connection is closed
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlQuery">
+            <summary>
+            Summary description for NpgsqlQuery
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlRow">
+            <summary>
+            This is the abstract base class for NpgsqlAsciiRow and NpgsqlBinaryRow.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlRowDescription">
+             <summary>
+             This class represents a RowDescription message sent from
+             the PostgreSQL.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlRowDescription.FieldData">
+            <summary>
+            This struct represents the internal data of the RowDescription message.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlSchema">
+            <summary>
+            Provides the underlying mechanism for reading schema information.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.#ctor(Npgsql.NpgsqlConnection)">
+            <summary>
+            Creates an NpgsqlSchema that can read schema information from the database.
+            </summary>
+            <param name="connection">An open database connection for reading metadata.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetMetaDataCollections">
+            <summary>
+            Returns the MetaDataCollections that lists all possible collections.
+            </summary>
+            <returns>The MetaDataCollections</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetRestrictions">
+            <summary>
+            Returns the Restrictions that contains the meaning and position of the values in the restrictions array.
+            </summary>
+            <returns>The Restrictions</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetDatabases(System.String[])">
+            <summary>
+            Returns the Databases that contains a list of all accessable databases.
+            </summary>
+            <param name="restrictions">The restrictions to filter the collection.</param>
+            <returns>The Databases</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetTables(System.String[])">
+            <summary>
+            Returns the Tables that contains table and view names and the database and schema they come from.
+            </summary>
+            <param name="restrictions">The restrictions to filter the collection.</param>
+            <returns>The Tables</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetColumns(System.String[])">
+            <summary>
+            Returns the Columns that contains information about columns in tables. 
+            </summary>
+            <param name="restrictions">The restrictions to filter the collection.</param>
+            <returns>The Columns.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetViews(System.String[])">
+            <summary>
+            Returns the Views that contains view names and the database and schema they come from.
+            </summary>
+            <param name="restrictions">The restrictions to filter the collection.</param>
+            <returns>The Views</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetUsers(System.String[])">
+            <summary>
+            Returns the Users containing user names and the sysid of those users.
+            </summary>
+            <param name="restrictions">The restrictions to filter the collection.</param>
+            <returns>The Users.</returns>
+        </member>
+        <member name="T:Npgsql.NpgsqlStartupPacket">
+             <summary>
+             This class represents a StartupPacket message of PostgreSQL
+             protocol.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.CompletedResponse">
+            <summary>
+            Represents a completed response message.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlSync">
+             <summary>
+             This class represents the Parse message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlTransaction">
+            <summary>
+            Represents a transaction to be made in a PostgreSQL database. This class cannot be inherited.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlTransaction.Commit">
+            <summary>
+            Commits the database transaction.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlTransaction.Rollback">
+            <summary>
+            Rolls back a transaction from a pending state.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlTransaction.Rollback(System.String)">
+            <summary>
+            Rolls back a transaction from a pending savepoint state.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlTransaction.Save(System.String)">
+            <summary>
+            Creates a transaction save point.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlTransaction.Cancel">
+            <summary>
+            Cancel the transaction without telling the backend about it.  This is
+            used to make the transaction go away when closing a connection.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlTransaction.Connection">
+            <summary>
+            Gets the <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>
+            object associated with the transaction, or a null reference if the
+            transaction is no longer valid.
+            </summary>
+            <value>The <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>
+            object associated with the transaction.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlTransaction.IsolationLevel">
+            <summary>
+            Specifies the <see cref="T:System.Data.IsolationLevel">IsolationLevel</see> for this transaction.
+            </summary>
+            <value>The <see cref="T:System.Data.IsolationLevel">IsolationLevel</see> for this transaction.
+            The default is <b>ReadCommitted</b>.</value>
+        </member>
+        <member name="T:Npgsql.PGUtil">
+            <summary>
+             This class provides many util methods to handle
+             reading and writing of PostgreSQL protocol messages.
+             </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.ConvertProtocolVersion(Npgsql.ProtocolVersion)">
+            <summary>
+             This method takes a ProtocolVersion and returns an integer
+             version number that the Postgres backend will recognize in a
+             startup packet.
+             </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.ExtractServerVersion(System.String)">
+            <summary>
+            This method takes a version string as returned by SELECT VERSION() and returns
+            a valid version string ("7.2.2" for example).
+            This is only needed when running protocol version 2.
+            This does not do any validity checks.
+            </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.ReadString(System.IO.Stream)">
+            <summary>
+             This method gets a C NULL terminated string from the network stream.
+             It keeps reading a byte in each time until a NULL byte is returned.
+             It returns the resultant string of bytes read.
+             This string is sent from backend.
+             </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.ReadBytes(System.IO.Stream,System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Reads requested number of bytes from stream with retries until Stream.Read returns 0 or count is reached.
+            </summary>
+            <param name="stream">Stream to read</param>
+            <param name="buffer">byte buffer to fill</param>
+            <param name="offset">starting position to fill the buffer</param>
+            <param name="count">number of bytes to read</param>
+            <returns>The number of bytes read.  May be less than count if no more bytes are available.</returns>
+        </member>
+        <member name="M:Npgsql.PGUtil.WriteString(System.String,System.IO.Stream)">
+            <summary>
+             This method writes a C NULL terminated string to the network stream.
+             It appends a NULL terminator to the end of the String.
+             </summary>
+            <summary>
+             This method writes a C NULL terminated string to the network stream.
+             It appends a NULL terminator to the end of the String.
+             </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.WriteBytes(System.Byte[],System.IO.Stream)">
+            <summary>
+            This method writes a set of bytes to the stream. It also enables logging of them.
+            </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.WriteLimString(System.String,System.Int32,System.IO.Stream)">
+            <summary>
+             This method writes a C NULL terminated string limited in length to the
+             backend server.
+             It pads the string with null bytes to the size specified.
+             </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.WriteInt32(System.IO.Stream,System.Int32)">
+            <summary>
+            Write a 32-bit integer to the given stream in the correct byte order.
+            </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.ReadInt32(System.IO.Stream)">
+            <summary>
+            Read a 32-bit integer from the given stream in the correct byte order.
+            </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.WriteInt16(System.IO.Stream,System.Int16)">
+            <summary>
+            Write a 16-bit integer to the given stream in the correct byte order.
+            </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.ReadInt16(System.IO.Stream)">
+            <summary>
+            Read a 16-bit integer from the given stream in the correct byte order.
+            </summary>
+        </member>
+        <member name="T:Npgsql.ProtocolVersion">
+            <summary>
+            Represent the frontend/backend protocol version.
+            </summary>
+        </member>
+        <member name="T:Npgsql.ServerVersion">
+            <summary>
+            Represent the backend server version.
+            As this class offers no functionality beyond that offered by <see cref="T:System.Version"/> it has been
+            deprecated in favour of that class.
+            </summary>
+            
+        </member>
+        <member name="M:Npgsql.ServerVersion.ToString">
+            <summary>
+            Returns the string representation of this version in three place dot notation (Major.Minor.Patch).
+            </summary>
+        </member>
+        <member name="P:Npgsql.ServerVersion.Major">
+            <summary>
+            Server version major number.
+            </summary>
+        </member>
+        <member name="P:Npgsql.ServerVersion.Minor">
+            <summary>
+            Server version minor number.
+            </summary>
+        </member>
+        <member name="P:Npgsql.ServerVersion.Patch">
+            <summary>
+            Server version patch level number.
+            </summary>
+        </member>
+        <member name="T:Npgsql.SSPIHandler">
+            <summary>
+            A class to handle everything associated with SSPI authentication
+            </summary>
+        </member>
+        <member name="T:Npgsql.SSPIHandler.SecBufferDesc">
+            <summary>
+            Simplified SecBufferDesc struct with only one SecBuffer
+            </summary>
+        </member>
+    </members>
+</doc>
Binary file packages/Npgsql.2.0.14.3/lib/net40/de/Npgsql.resources.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net40/es/Npgsql.resources.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net40/fi/Npgsql.resources.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net40/fr/Npgsql.resources.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net40/ja/Npgsql.resources.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net40/zh-CN/Npgsql.resources.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net45/Mono.Security.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net45/Npgsql.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/Npgsql.2.0.14.3/lib/net45/Npgsql.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,4705 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>Npgsql</name>
+    </assembly>
+    <members>
+        <member name="T:NpgsqlTypes.ArrayNativeToBackendTypeConverter">
+            <summary>
+            Handles serialisation of .NET array or IEnumeration to pg format.
+            Arrays of arrays, enumerations of enumerations, arrays of enumerations etc.
+            are treated as multi-dimensional arrays (in much the same manner as an array of arrays
+            is used to emulate multi-dimensional arrays in languages that lack native support for them).
+            If such an enumeration of enumerations is "jagged" (as opposed to rectangular, cuboid,
+            hypercuboid, hyperhypercuboid, etc) then this class will "correctly" serialise it, but pg
+            will raise an error as it doesn't allow jagged arrays.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayNativeToBackendTypeConverter.#ctor(NpgsqlTypes.NpgsqlNativeTypeInfo)">
+            <summary>
+            Create an ArrayNativeToBackendTypeConverter with the element converter passed
+            </summary>
+            <param name="elementConverter">The <see cref="T:NpgsqlTypes.NpgsqlNativeTypeInfo"/> that would be used to serialise the element type.</param>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayNativeToBackendTypeConverter.FromArray(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Serialise the enumeration or array.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.ArrayBackendToNativeTypeConverter">
+            <summary>
+            Handles parsing of pg arrays into .NET arrays.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.TokenEnumeration(System.String)">
+            <summary>
+            Takes a string representation of a pg 1-dimensional array
+            (or a 1-dimensional row within an n-dimensional array)
+            and allows enumeration of the string represenations of each items.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.ArrayChunkEnumeration(System.String)">
+            <summary>
+            Takes a string representation of a pg n-dimensional array
+            and allows enumeration of the string represenations of the next
+            lower level of rows (which in turn can be taken as (n-1)-dimensional arrays.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.RecursiveArrayListEnumeration(System.Collections.ArrayList)">
+            <summary>
+            Takes an ArrayList which may be an ArrayList of ArrayLists, an ArrayList of ArrayLists of ArrayLists
+            and so on and enumerates the items that aren't ArrayLists (the leaf nodes if we think of the ArrayList
+            passed as a tree). Simply uses the ArrayLists' own IEnumerators to get that of the next,
+            pushing them onto a stack until we hit something that isn't an ArrayList.
+            <param name="list"><see cref="T:System.Collections.ArrayList">ArrayList</see> to enumerate</param>
+            <returns><see cref="T:System.Collections.IEnumerable">IEnumerable</see></returns>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.#ctor(NpgsqlTypes.NpgsqlBackendTypeInfo)">
+            <summary>
+            Create a new ArrayBackendToNativeTypeConverter
+            </summary>
+            <param name="elementConverter"><see cref="T:NpgsqlTypes.NpgsqlBackendTypeInfo"/> for the element type.</param>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.ToArray(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Creates an array from pg representation.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.ToArrayList(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Creates an array list from pg represenation of an array.
+            Multidimensional arrays are treated as ArrayLists of ArrayLists
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ArrayBackendToNativeTypeConverter.ToArray(System.Collections.ArrayList,System.Type)">
+            <summary>
+            Creates an n-dimensional array from an ArrayList of ArrayLists or
+            a 1-dimensional array from something else. 
+            </summary>
+            <param name="list"><see cref="T:System.Collections.ArrayList"/> to convert</param>
+            <returns><see cref="T:System.Array"/> produced.</returns>
+        </member>
+        <member name="T:NpgsqlTypes.ArrayBackendToNativeTypeConverter.IntSetIterator">
+            <summary>
+            Takes an array of ints and treats them like the limits of a set of counters.
+            Retains a matching set of ints that is set to all zeros on the first ++
+            On a ++ it increments the "right-most" int. If that int reaches it's 
+            limit it is set to zero and the one before it is incremented, and so on.
+            
+            Making this a more general purpose class is pretty straight-forward, but we'll just put what we need here.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.BitString">
+            <summary>
+            <para>Implements a bit string; a collection of zero or more bits which can each be 1 or 0.</para>
+            <para>BitString's behave as a list of bools, though like most strings and unlike most collections the position
+            tends to be of as much significance as the value.</para>
+            <para>BitStrings are often used as masks, and are commonly cast to and from other values.</para>
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.BitString.Empty">
+            <summary>
+            Represents the empty string.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.#ctor(System.Collections.Generic.IEnumerable{System.Boolean})">
+            <summary>
+            Create a BitString from an enumeration of boolean values. The BitString will contain
+            those booleans in the order they came in.
+            </summary>
+            <param name="bits">The boolean values.</param>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.#ctor(System.Boolean,System.Int32)">
+            <summary>
+            Creates a BitString filled with a given number of true or false values.
+            </summary>
+            <param name="value">The value to fill the string with.</param>
+            <param name="count">The number of bits to fill.</param>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.#ctor(System.String)">
+            <summary>
+            Creats a bitstring from a <see cref="T:System.String">string</see>.
+            <param name="str">The <see cref="T:System.String">string to copy from</see>.</param>
+            <seealso cref="!:Npgsql.BitString.Parse(System.String)"/>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.#ctor(System.Boolean)">
+            <summary>
+            Creates a single-bit element from a boolean value.
+            </summary>
+            <param name="boolean">The <see cref="T:System.Boolean">bool</see> value which determines whether
+            the bit is 1 or 0.</param>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.#ctor(System.UInt32)">
+            <summary>
+            Creates a bitstring from an unsigned integer value. The string will be the shortest required to
+            contain the integer (e.g. 1 bit for 0 or 1, 2 for 2 or 3, 3 for 4-7, and so on).
+            </summary>
+            <param name="integer">The <see cref="T:System.UInt32">integer</see>.</param>
+            <remarks>This method is not CLS Compliant, and may not be available to some languages.</remarks>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.#ctor(System.Int32)">
+            <summary>
+            Creates a bitstring from an integer value. The string will be the shortest required to
+            contain the integer (e.g. 1 bit for 0 or 1, 2 for 2 or 3, 3 for 4-7, and so on).
+            </summary>
+            <param name="integer">The <see cref="T:System.Int32">integer</see>.</param>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.IndexOf(System.Boolean)">
+            <summary>
+            Finds the first instance of a given value
+            </summary>
+            <param name="item">The value - whether true or false - to search for.</param>
+            <returns>The index of the value found, or -1 if none are present.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Contains(System.Boolean)">
+            <summary>
+            True if there is at least one bit with the value looked for.
+            </summary>
+            <param name="item">The value - true or false - to detect.</param>
+            <returns>True if at least one bit was the same as item, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.CopyTo(System.Boolean[],System.Int32)">
+            <summary>
+            Copies the bitstring to an array of bools.
+            </summary>
+            <param name="array">The <see cref="T:System.Boolean">boolean</see> array to copy to.</param>
+            <param name="arrayIndex">The index in the array to start copying from.</param>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.GetEnumerator">
+            <summary>
+            Returns an enumerator that enumerates through the string.
+            </summary>
+            <returns>The enumerator.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Concat(NpgsqlTypes.BitString)">
+            <summary>
+            Creats a bitstring by concatenating another onto this one.
+            </summary>
+            <param name="append">The string to append to this one.</param>
+            <returns>The combined strings.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Substring(System.Int32,System.Int32)">
+            <summary>
+            Returns a substring of this string.
+            </summary>
+            <param name="start">The position to start from, must be between 0 and the length of the string.</param>
+            <param name="length">The length of the string to return, must be greater than zero, and may not be
+            so large that the start + length exceeds the bounds of this instance.</param>
+            <returns>The Bitstring identified</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Substring(System.Int32)">
+            <summary>
+            Returns a substring of this string.
+            </summary>
+            <param name="start">The position to start from, must be between 0 and the length of the string,
+            the rest of the string is returned.</param>
+            <returns>The Bitstring identified</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.And(NpgsqlTypes.BitString)">
+            <summary>
+            A logical and between this string and another. The two strings must be the same length.
+            </summary>
+            <param name="operand">Another BitString to AND with this one.</param>
+            <returns>A bitstring with 1 where both BitStrings had 1 and 0 otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Or(NpgsqlTypes.BitString)">
+            <summary>
+            A logical or between this string and another. The two strings must be the same length.
+            </summary>
+            <param name="operand">Another BitString to OR with this one.</param>
+            <returns>A bitstring with 1 where either BitString had 1 and 0 otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Xor(NpgsqlTypes.BitString)">
+            <summary>
+            A logical xor between this string and another. The two strings must be the same length.
+            </summary>
+            <param name="operand">Another BitString to XOR with this one.</param>
+            <returns>A bitstring with 1 where one BitStrings and the other had 0,
+            and 0 where they both had 1 or both had 0.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Not">
+            <summary>
+            A bitstring that is the logical inverse of this one.
+            </summary>
+            <returns>A bitstring of the same length as this with 1 where this has 0 and vice-versa.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.LShift(System.Int32)">
+            <summary>
+            Shifts the string operand bits to the left, filling with zeros to produce a
+            string of the same length.
+            </summary>
+            <param name="operand">The number of bits to shift to the left.</param>
+            <returns>A left-shifted bitstring.</returns>
+            <remarks><para>The behaviour of LShift is closer to what one would expect from dealing
+            with PostgreSQL bit-strings than in using the same operations on integers in .NET</para>
+            <para>In particular, negative operands result in a right-shift, and operands greater than
+            the length of the string will shift it entirely, resulting in a zero-filled string.</para>
+            </remarks>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.RShift(System.Int32)">
+            <summary>
+            Shifts the string operand bits to the right, filling with zeros to produce a
+            string of the same length.
+            </summary>
+            <param name="operand">The number of bits to shift to the right.</param>
+            <returns>A right-shifted bitstring.</returns>
+            <remarks><para>The behaviour of RShift is closer to what one would expect from dealing
+            with PostgreSQL bit-strings than in using the same operations on integers in .NET</para>
+            <para>In particular, negative operands result in a left-shift, and operands greater than
+            the length of the string will shift it entirely, resulting in a zero-filled string. It also performs
+            a logical shift, rather than an arithmetic shift, so it always sets the vacated bit positions to zero
+            (like PostgreSQL and like .NET for unsigned integers but not for signed integers).</para>
+            </remarks>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Equals(NpgsqlTypes.BitString)">
+            <summary>
+            Returns true if the this string is identical to the argument passed.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.CompareTo(NpgsqlTypes.BitString)">
+            <summary>
+            Compares two strings. Strings are compared as strings, so while 0 being less than 1 will
+            mean a comparison between two strings of the same size is the same as treating them as numbers,
+            in the case of two strings of differing lengths the comparison starts at the right-most (most significant)
+            bit, and if all bits of the shorter string are exhausted without finding a comparison, then the larger
+            string is deemed to be greater than the shorter (0010 is greater than 0001 but less than 00100).
+            </summary>
+            <param name="other">Another string to compare with this one.</param>
+            <returns>A value if the two strings are identical, an integer less
+            than zero if this is less than the argument, and an integer greater
+            than zero otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.CompareTo(System.Object)">
+            <summary>
+            Compares the string with another object.
+            </summary>
+            <param name="obj">The object to compare with.</param>
+            <returns>If the object is null then this string is considered greater. If the object is another BitString
+            then they are compared as in <see cref="!:CompareTo(Npgsql.BitString)">the explicit comparison for BitStrings</see>
+            in any other case a <see cref="T:System.ArgumentException"/> is thrown.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Equals(System.Object)">
+            <summary>
+            Compares this BitString with an object for equality.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.GetHashCode">
+            <summary>
+            Returns a code for use in hashing operations.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToString(System.String)">
+            <summary>
+            Returns a string representation of the BitString.
+            </summary>
+            <param name="format">
+            A string which can contain a letter and optionally a number which sets a minimum size for the string
+            returned. In each case using the lower-case form of the letter will result in a lower-case string
+            being returned.
+            <list type="table">
+            <item>
+            <term>B</term>
+            <description>A string of 1s and 0s.</description>
+            </item>
+            <item>
+            <term>X</term>
+            <description>An hexadecimal string (will result in an error unless the string's length is divisible by 4).</description>
+            </item>
+            <item>
+            <term>G</term>
+            <description>A string of 1s and 0s in single-quotes preceded by 'B' (Postgres bit string literal syntax).</description>
+            </item>
+            <term>Y</term>
+            <description>An hexadecimal string in single-quotes preceded by 'X' (Postgres bit literal syntax, will result in an error unless the string's length is divisible by 4.</description>
+            </list>
+            <term>C</term>
+            <description>The format produced by format-string "Y" if legal, otherwise that produced by format-string "G".</description>
+            <term>E</term>
+            <description>The most compact safe representation for Postgres. If single bit will be either a 0 or a 1. Otherwise if it
+            can be that produce by format string "Y" it will, otherwise if there are less than 9bits in length it will be that
+            produced by format-string "G". For longer strings that cannot be represented in hexadecimal it will be a string
+            representing the first part of the string in format "Y" followed by the PostgreSQL concatenation operator, followed
+            by the final bits in the format "G". E.g. "X'13DCE'||B'110'"</description>
+            If format is empty or null, it is treated as if "B" had been passed (the default repreesentation, and that
+            generally used by PostgreSQL for display).
+            </param>
+            <returns>The formatted string.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToString">
+            <summary>
+            Returns a string representation for the Bitstring
+            </summary>
+            <returns>A string containing '0' and '1' characters.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToString(System.String,System.IFormatProvider)">
+            <summary>
+            Returns the same string as <see cref="M:NpgsqlTypes.BitString.ToString(System.String)"/>. formatProvider is ignored.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.Parse(System.String)">
+            <summary>
+            Parses a string to produce a BitString. Most formats that can be produced by
+            <see cref="M:NpgsqlTypes.BitString.ToString(System.String)"/> can be accepted, but hexadecimal
+            can be interpreted with the preceding X' to mark the following characters as
+            being hexadecimal rather than binary.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_BitwiseAnd(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Performs a logical AND on the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_BitwiseOr(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Performs a logcial OR on the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_ExclusiveOr(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Perofrms a logical EXCLUSIVE-OR on the two operands
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_OnesComplement(NpgsqlTypes.BitString)">
+            <summary>
+            Performs a logical NOT on the operand.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_Addition(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Concatenates the operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_LeftShift(NpgsqlTypes.BitString,System.Int32)">
+            <summary>
+            Left-shifts the string BitString.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_RightShift(NpgsqlTypes.BitString,System.Int32)">
+            <summary>
+            Right-shifts the string BitString.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_Equality(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Compares the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_Inequality(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Compares the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_LessThan(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Compares the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_GreaterThan(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Compares the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_LessThanOrEqual(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Compares the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.op_GreaterThanOrEqual(NpgsqlTypes.BitString,NpgsqlTypes.BitString)">
+            <summary>
+            Compares the two operands.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToString(System.Text.Encoding)">
+            <summary>
+            Interprets the bitstring as a series of bits in an encoded character string,
+            encoded according to the Encoding passed, and returns that string.
+            The bitstring must contain a whole number of octets(bytes) and also be
+            valid according to the Encoding passed.
+            </summary>
+            <param name="encoding">The <see cref="T:System.Text.Encoding"/> to use in producing the string.</param>
+            <returns>The string that was encoded in the BitString.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToByteEnumerable">
+            <summary>
+            Interprets the bitstring as a series of octets (bytes) and returns those octets. Fails
+            if the Bitstring does not contain a whole number of octets (its length is not evenly
+            divisible by 8).
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToSByteEnumerable">
+            <summary>
+            Interprets the bitstring as a series of signed octets (bytes) and returns those octets. Fails
+            if the Bitstring does not contain a whole number of octets (its length is not evenly
+            divisible by 8).
+            <remarks>This method is not CLS-Compliant and may not be available to languages that cannot
+            handle signed bytes.</remarks>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToUInt16Enumerable">
+            <summary>
+            Interprets the bitstring as a series of unsigned 16-bit integers and returns those integers.
+            Fails if the Bitstring's length is not evenly divisible by 16.
+            <remarks>This method is not CLS-Compliant and may not be available to languages that cannot
+            handle unsigned integers.</remarks>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToInt16Enumerable">
+            <summary>
+            Interprets the bitstring as a series of 16-bit integers and returns those integers.
+            Fails if the Bitstring's length is not evenly divisible by 16.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToUInt32Enumerable">
+            <summary>
+            Interprets the bitstring as a series of unsigned 32-bit integers and returns those integers.
+            Fails if the Bitstring's length is not evenly divisible by 32.
+            <remarks>This method is not CLS-Compliant and may not be available to languages that cannot
+            handle unsigned integers.</remarks>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToInt32Enumerable">
+            <summary>
+            Interprets the bitstring as a series of signed 32-bit integers and returns those integers.
+            Fails if the Bitstring's length is not evenly divisible by 32.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToUInt64Enumerable">
+            <summary>
+            Interprets the bitstring as a series of unsigned 64-bit integers and returns those integers.
+            Fails if the Bitstring's length is not evenly divisible by 64.
+            <remarks>This method is not CLS-Compliant and may not be available to languages that cannot
+            handle unsigned integers.</remarks>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BitString.ToInt64Enumerable">
+            <summary>
+            Interprets the bitstring as a series of signed 64-bit integers and returns those integers.
+            Fails if the Bitstring's length is not evenly divisible by 64.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.BitString.Length">
+            <summary>
+            The length of the string.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.BitString.Item(System.Int32)">
+            <summary>
+            Retrieves the value of the bit at the given index.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlInterval">
+            <summary>
+            Represents the PostgreSQL interval datatype.
+            <remarks>PostgreSQL differs from .NET in how it's interval type doesn't assume 24 hours in a day
+            (to deal with 23- and 25-hour days caused by daylight savings adjustments) and has a concept
+            of months that doesn't exist in .NET's <see cref="T:System.TimeSpan"/> class. (Neither datatype
+            has any concessions for leap-seconds).
+            <para>For most uses just casting to and from TimeSpan will work correctly — in particular,
+            the results of subtracting one <see cref="T:System.DateTime"/> or the PostgreSQL date, time and
+            timestamp types from another should be the same whether you do so in .NET or PostgreSQL —
+            but if the handling of days and months in PostgreSQL is important to your application then you
+            should use this class instead of <see cref="T:System.TimeSpan"/>.</para>
+            <para>If you don't know whether these differences are important to your application, they
+            probably arent! Just use <see cref="T:System.TimeSpan"/> and do not use this class directly ☺</para>
+            <para>To avoid forcing unnecessary provider-specific concerns on users who need not be concerned
+            with them a call to <see cref="!:IDataRecord.GetValue(int)"/> on a field containing an
+            <see cref="T:NpgsqlTypes.NpgsqlInterval"/> value will return a <see cref="T:System.TimeSpan"/> rather than an
+            <see cref="T:NpgsqlTypes.NpgsqlInterval"/>. If you need the extra functionality of <see cref="T:NpgsqlTypes.NpgsqlInterval"/>
+            then use <see cref="M:Npgsql.NpgsqlDataReader.GetInterval(System.Int32)"/>.</para>
+            </remarks>
+            <seealso cref="P:NpgsqlTypes.NpgsqlInterval.Ticks"/>
+            <seealso cref="M:NpgsqlTypes.NpgsqlInterval.JustifyDays"/>
+            <seealso cref="M:NpgsqlTypes.NpgsqlInterval.JustifyMonths"/>
+            <seealso cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerMicrosecond">
+            <summary>
+            Represents the number of ticks (100ns periods) in one microsecond. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerMillsecond">
+            <summary>
+            Represents the number of ticks (100ns periods) in one millisecond. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerSecond">
+            <summary>
+            Represents the number of ticks (100ns periods) in one second. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerMinute">
+            <summary>
+            Represents the number of ticks (100ns periods) in one minute. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerHour">
+            <summary>
+            Represents the number of ticks (100ns periods) in one hour. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerDay">
+            <summary>
+            Represents the number of ticks (100ns periods) in one day. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.HoursPerDay">
+            <summary>
+            Represents the number of hours in one day (assuming no daylight savings adjustments). This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.DaysPerMonth">
+            <summary>
+            Represents the number of days assumed in one month if month justification or unjustifcation is performed.
+            This is set to 30 for consistency with PostgreSQL. Note that this is means that month adjustments cause
+            a year to be taken as 30 &#xd7; 12 = 360 rather than 356/366 days.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.TicksPerMonth">
+            <summary>
+            Represents the number of ticks (100ns periods) in one day, assuming 30 days per month. <seealso cref="F:NpgsqlTypes.NpgsqlInterval.DaysPerMonth"/>
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.MonthsPerYear">
+            <summary>
+            Represents the number of months in a year. This field is constant.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.MaxValue">
+            <summary>
+            Represents the maximum <see cref="T:NpgsqlTypes.NpgsqlInterval"/>. This field is read-only.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.MinValue">
+            <summary>
+            Represents the minimum <see cref="T:NpgsqlTypes.NpgsqlInterval"/>. This field is read-only.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlInterval.Zero">
+            <summary>
+            Represents the zero <see cref="T:NpgsqlTypes.NpgsqlInterval"/>. This field is read-only.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.Int64)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to the specified number of ticks.
+            </summary>
+            <param name="ticks">A time period expressed in 100ns units.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.TimeSpan)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to hold the same time as a <see cref="T:System.TimeSpan"/>
+            </summary>
+            <param name="timespan">A time period expressed in a <see cref="T:System.TimeSpan"/></param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.Int32,System.Int32,System.Int64)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to the specified number of months, days
+            &amp; ticks.
+            </summary>
+            <param name="months">Number of months.</param>
+            <param name="days">Number of days.</param>
+            <param name="ticks">Number of 100ns units.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.Int32,System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to the specified number of
+            days, hours, minutes &amp; seconds.
+            </summary>
+            <param name="days">Number of days.</param>
+            <param name="hours">Number of hours.</param>
+            <param name="minutes">Number of minutes.</param>
+            <param name="seconds">Number of seconds.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to the specified number of
+            days, hours, minutes, seconds &amp; milliseconds.
+            </summary>
+            <param name="days">Number of days.</param>
+            <param name="hours">Number of hours.</param>
+            <param name="minutes">Number of minutes.</param>
+            <param name="seconds">Number of seconds.</param>
+            <param name="milliseconds">Number of milliseconds.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to the specified number of
+            months, days, hours, minutes, seconds &amp; milliseconds.
+            </summary>
+            <param name="months">Number of months.</param>
+            <param name="days">Number of days.</param>
+            <param name="hours">Number of hours.</param>
+            <param name="minutes">Number of minutes.</param>
+            <param name="seconds">Number of seconds.</param>
+            <param name="milliseconds">Number of milliseconds.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.#ctor(System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Initializes a new <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to the specified number of
+            years, months, days, hours, minutes, seconds &amp; milliseconds.
+            <para>Years are calculated exactly equivalent to 12 months.</para>
+            </summary>
+            <param name="years">Number of years.</param>
+            <param name="months">Number of months.</param>
+            <param name="days">Number of days.</param>
+            <param name="hours">Number of hours.</param>
+            <param name="minutes">Number of minutes.</param>
+            <param name="seconds">Number of seconds.</param>
+            <param name="milliseconds">Number of milliseconds.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromTicks(System.Int64)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of ticks.
+            </summary>
+            <param name="ticks">The number of ticks (100ns units) in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of ticks.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromMicroseconds(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of microseconds.
+            </summary>
+            <param name="ticks">The number of microseconds in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of microseconds.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromMilliseconds(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of milliseconds.
+            </summary>
+            <param name="ticks">The number of milliseconds in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of milliseconds.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromSeconds(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of seconds.
+            </summary>
+            <param name="ticks">The number of seconds in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of seconds.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromMinutes(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of minutes.
+            </summary>
+            <param name="ticks">The number of minutes in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of minutes.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromHours(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of hours.
+            </summary>
+            <param name="ticks">The number of hours in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of hours.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromDays(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of days.
+            </summary>
+            <param name="ticks">The number of days in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of days.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.FromMonths(System.Double)">
+            <summary>
+            Creates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from a number of months.
+            </summary>
+            <param name="ticks">The number of months in the interval.</param>
+            <returns>A <see cref="M:NpgsqlTypes.NpgsqlInterval.Canonicalize"/>d <see cref="T:NpgsqlTypes.NpgsqlInterval"/> with the given number of months.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Add(NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Adds another interval to this instance and returns the result.
+            </summary>
+            <param name="interval">An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to add to this instance.</param>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"></see> whose values are the sums of the two instances.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Subtract(NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Subtracts another interval from this instance and returns the result.
+            </summary>
+            <param name="interval">An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to subtract from this instance.</param>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"></see> whose values are the differences of the two instances.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Negate">
+            <summary>
+            Returns an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> whose value is the negated value of this instance.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> whose value is the negated value of this instance.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Duration">
+            <summary>
+            This absolute value of this instance. In the case of some, but not all, components being negative,
+            the rules used for justification are used to determine if the instance is positive or negative.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> whose value is the absolute value of this instance.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.JustifyDays">
+            <summary>
+            Equivalent to PostgreSQL's justify_days function.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> based on this one, but with any hours outside of the range [-23, 23]
+            converted into days.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.UnjustifyDays">
+            <summary>
+            Opposite to PostgreSQL's justify_days function.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> based on this one, but with any days converted to multiples of ±24hours.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.JustifyMonths">
+            <summary>
+            Equivalent to PostgreSQL's justify_months function.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> based on this one, but with any days outside of the range [-30, 30]
+            converted into months.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.UnjustifyMonths">
+            <summary>
+            Opposite to PostgreSQL's justify_months function.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> based on this one, but with any months converted to multiples of ±30days.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.JustifyInterval">
+            <summary>
+            Equivalent to PostgreSQL's justify_interval function.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> based on this one,
+            but with any months converted to multiples of ±30days
+            and then with any days converted to multiples of ±24hours</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.UnjustifyInterval">
+            <summary>
+            Opposite to PostgreSQL's justify_interval function.
+            </summary>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> based on this one, but with any months converted to multiples of ±30days and then any days converted to multiples of ±24hours;</returns>
+        </member>
+        <!-- Badly formed XML comment ignored for member "M:NpgsqlTypes.NpgsqlInterval.Canonicalize" -->
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_Implicit(System.TimeSpan)~NpgsqlTypes.NpgsqlInterval">
+            <summary>
+            Implicit cast of a <see cref="T:System.TimeSpan"/> to an <see cref="T:NpgsqlTypes.NpgsqlInterval"/>
+            </summary>
+            <param name="timespan">A <see cref="T:System.TimeSpan"/></param>
+            <returns>An eqivalent, canonical, <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_Explicit(NpgsqlTypes.NpgsqlInterval)~System.TimeSpan">
+            <summary>
+            Implicit cast of an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to a <see cref="T:System.TimeSpan"/>.
+            </summary>
+            <param name="interval">A <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</param>
+            <returns>An equivalent <see cref="T:System.TimeSpan"/>.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Equals(NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Returns true if another <see cref="T:NpgsqlTypes.NpgsqlInterval"/> is exactly the same as this instance.
+            </summary>
+            <param name="other">An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> for comparison.</param>
+            <returns>true if the two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instances are exactly the same,
+            false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Equals(System.Object)">
+            <summary>
+            Returns true if another object is an <see cref="T:NpgsqlTypes.NpgsqlInterval"/>, that is exactly the same as
+            this instance
+            </summary>
+            <param name="obj">An <see cref="T:System.Object"/> for comparison.</param>
+            <returns>true if the argument is an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> and is exactly the same
+            as this one, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Compare(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Compares two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instances.
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</param>
+            <returns>0 if the two are equal or equivalent. A value greater than zero if x is greater than y,
+            a value less than zero if x is less than y.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.GetHashCode">
+            <summary>
+            A hash code suitable for uses with hashing algorithms.
+            </summary>
+            <returns>An signed integer.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.CompareTo(NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Compares this instance with another/
+            </summary>
+            <param name="other">An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare this with.</param>
+            <returns>0 if the instances are equal or equivalent. A value less than zero if
+            this instance is less than the argument. A value greater than zero if this instance
+            is greater than the instance.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.CompareTo(System.Object)">
+            <summary>
+            Compares this instance with another/
+            </summary>
+            <param name="other">An object to compare this with.</param>
+            <returns>0 if the argument is an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> and the instances are equal or equivalent.
+            A value less than zero if the argument is an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> and
+            this instance is less than the argument.
+            A value greater than zero if the argument is an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> and this instance
+            is greater than the instance.</returns>
+            A value greater than zero if the argument is null.
+            <exception cref="T:System.ArgumentException">The argument is not an <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</exception>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.Parse(System.String)">
+            <summary>
+            Parses a <see cref="T:System.String"/> and returns a <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instance.
+            Designed to use the formats generally returned by PostgreSQL.
+            </summary>
+            <param name="str">The <see cref="T:System.String"/> to parse.</param>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> represented by the argument.</returns>
+            <exception cref="T:System.ArgumentNullException">The string was null.</exception>
+            <exception cref="T:System.OverflowException">A value obtained from parsing the string exceeded the values allowed for the relevant component.</exception>
+            <exception cref="T:System.FormatException">The string was not in a format that could be parsed to produce an <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</exception>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.TryParse(System.String,NpgsqlTypes.NpgsqlInterval@)">
+            <summary>
+            Attempt to parse a <see cref="T:System.String"/> to produce an <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.
+            </summary>
+            <param name="str">The <see cref="T:System.String"/> to parse.</param>
+            <param name="result">(out) The <see cref="T:NpgsqlTypes.NpgsqlInterval"/> produced, or <see cref="F:NpgsqlTypes.NpgsqlInterval.Zero"/> if the parsing failed.</param>
+            <returns>true if the parsing succeeded, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.ToString">
+            <summary>
+            Create a <see cref="T:System.String"/> representation of the <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instance.
+            The format returned is of the form:
+            [M mon[s]] [d day[s]] [HH:mm:ss[.f[f[f[f[f[f[f[f[f]]]]]]]]]]
+            A zero <see cref="T:NpgsqlTypes.NpgsqlInterval"/> is represented as 00:00:00
+            <remarks>
+            Ticks are 100ns, Postgress resolution is only to 1µs at most. Hence we lose 1 or more decimal
+            precision in storing values in the database. Despite this, this method will output that extra
+            digit of precision. It's forward-compatible with any future increases in resolution up to 100ns,
+            and also makes this ToString() more applicable to any other use-case.
+            </remarks>
+            </summary>
+            <returns>The <see cref="T:System.String"/> representation.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_Addition(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Adds two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> together.
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to add.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to add.</param>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> whose values are the sum of the arguments.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_Subtraction(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Subtracts one <see cref="T:NpgsqlTypes.NpgsqlInterval"/> from another.
+            </summary>
+            <param name="x">The <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to subtract the other from.</param>
+            <param name="y">The <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to subtract from the other.</param>
+            <returns>An <see cref="T:NpgsqlTypes.NpgsqlInterval"/> whose values are the difference of the arguments</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_Equality(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Returns true if two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> are exactly the same.
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <returns>true if the two arguments are exactly the same, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_Inequality(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Returns false if two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> are exactly the same.
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <returns>false if the two arguments are exactly the same, true otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_LessThan(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Compares two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instances to see if the first is less than the second
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <returns>true if the first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> is less than second, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_LessThanOrEqual(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Compares two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instances to see if the first is less than or equivalent to the second
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <returns>true if the first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> is less than or equivalent to second, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_GreaterThan(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Compares two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instances to see if the first is greater than the second
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <returns>true if the first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> is greater than second, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_GreaterThanOrEqual(NpgsqlTypes.NpgsqlInterval,NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Compares two <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instances to see if the first is greater than or equivalent the second
+            </summary>
+            <param name="x">The first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <param name="y">The second <see cref="T:NpgsqlTypes.NpgsqlInterval"/> to compare.</param>
+            <returns>true if the first <see cref="T:NpgsqlTypes.NpgsqlInterval"/> is greater than or equivalent to the second, false otherwise.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_UnaryPlus(NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Returns the instance.
+            </summary>
+            <param name="x">An <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</param>
+            <returns>The argument.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlInterval.op_UnaryNegation(NpgsqlTypes.NpgsqlInterval)">
+            <summary>
+            Negates an <see cref="T:NpgsqlTypes.NpgsqlInterval"/> instance.
+            </summary>
+            <param name="x">An <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.</param>
+            <returns>The negation of the argument.</returns>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Ticks">
+            <summary>
+            The total number of ticks(100ns units) contained. This is the resolution of the
+            <see cref="T:NpgsqlTypes.NpgsqlInterval"/>  type. This ignores the number of days and
+            months held. If you want them included use <see cref="M:NpgsqlTypes.NpgsqlInterval.UnjustifyInterval"/> first.
+            <remarks>The resolution of the PostgreSQL
+            interval type is by default 1µs = 1,000 ns. It may be smaller as follows:
+            <list type="number">
+            <item>
+            <term>interval(0)</term>
+            <description>resolution of 1s (1 second)</description>
+            </item>
+            <item>
+            <term>interval(1)</term>
+            <description>resolution of 100ms = 0.1s (100 milliseconds)</description>
+            </item>
+            <item>
+            <term>interval(2)</term>
+            <description>resolution of 10ms = 0.01s (10 milliseconds)</description>
+            </item>
+            <item>
+            <term>interval(3)</term>
+            <description>resolution of 1ms = 0.001s (1 millisecond)</description>
+            </item>
+            <item>
+            <term>interval(4)</term>
+            <description>resolution of 100µs = 0.0001s (100 microseconds)</description>
+            </item>
+            <item>
+            <term>interval(5)</term>
+            <description>resolution of 10µs = 0.00001s (10 microseconds)</description>
+            </item>
+            <item>
+            <term>interval(6) or interval</term>
+            <description>resolution of 1µs = 0.000001s (1 microsecond)</description>
+            </item>
+            </list>
+            <para>As such, if the 100-nanosecond resolution is significant to an application, a PostgreSQL interval will
+            not suffice for those purposes.</para>
+            <para>In more frequent cases though, the resolution of the interval suffices.
+            <see cref="T:NpgsqlTypes.NpgsqlInterval"/> will always suffice to handle the resolution of any interval value, and upon
+            writing to the database, will be rounded to the resolution used.</para>
+            </remarks>
+            <returns>The number of ticks in the instance.</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Microseconds">
+            <summary>
+            Gets the number of whole microseconds held in the instance.
+            <returns>An  in the range [-999999, 999999].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Milliseconds">
+            <summary>
+            Gets the number of whole milliseconds held in the instance.
+            <returns>An  in the range [-999, 999].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Seconds">
+            <summary>
+            Gets the number of whole seconds held in the instance.
+            <returns>An  in the range [-59, 59].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Minutes">
+            <summary>
+            Gets the number of whole minutes held in the instance.
+            <returns>An  in the range [-59, 59].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Hours">
+            <summary>
+            Gets the number of whole hours held in the instance.
+            <remarks>Note that this can be less than -23 or greater than 23 unless <see cref="M:NpgsqlTypes.NpgsqlInterval.JustifyDays"/>
+            has been used to produce this instance.</remarks>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Days">
+            <summary>
+            Gets the number of days held in the instance.
+            <remarks>Note that this does not pay attention to a time component with -24 or less hours or
+            24 or more hours, unless <see cref="M:NpgsqlTypes.NpgsqlInterval.JustifyDays"/> has been called to produce this instance.</remarks>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Months">
+            <summary>
+            Gets the number of months held in the instance.
+            <remarks>Note that this does not pay attention to a day component with -30 or less days or
+            30 or more days, unless <see cref="M:NpgsqlTypes.NpgsqlInterval.JustifyMonths"/> has been called to produce this instance.</remarks>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.Time">
+            <summary>
+            Returns a <see cref="T:System.TimeSpan"/> representing the time component of the instance.
+            <remarks>Note that this may have a value beyond the range ±23:59:59.9999999 unless
+            <see cref="M:NpgsqlTypes.NpgsqlInterval.JustifyDays"/> has been called to produce this instance.</remarks>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalTicks">
+            <summary>
+            The total number of ticks (100ns units) in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalMicroseconds">
+            <summary>
+            The total number of microseconds in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalMilliseconds">
+            <summary>
+            The total number of milliseconds in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalSeconds">
+            <summary>
+            The total number of seconds in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalMinutes">
+            <summary>
+            The total number of minutes in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalHours">
+            <summary>
+            The total number of hours in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalDays">
+            <summary>
+            The total number of days in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlInterval.TotalMonths">
+            <summary>
+            The total number of months in the instance, assuming 24 hours in each day and
+            30 days in a month.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTime.Normalize">
+            <summary>
+            Normalise this time; if it is 24:00:00, convert it to 00:00:00
+            </summary>
+            <returns>This time, normalised</returns>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTime.Ticks">
+            <summary>
+            The total number of ticks(100ns units) contained. This is the resolution of the
+            <see cref="T:NpgsqlTypes.NpgsqlTime"/>  type.
+            <remarks>The resolution of the PostgreSQL
+            interval type is by default 1µs = 1,000 ns. It may be smaller as follows:
+            <list type="number">
+            <item>
+            <term>time(0)</term>
+            <description>resolution of 1s (1 second)</description>
+            </item>
+            <item>
+            <term>time(1)</term>
+            <description>resolution of 100ms = 0.1s (100 milliseconds)</description>
+            </item>
+            <item>
+            <term>time(2)</term>
+            <description>resolution of 10ms = 0.01s (10 milliseconds)</description>
+            </item>
+            <item>
+            <term>time(3)</term>
+            <description>resolution of 1ms = 0.001s (1 millisecond)</description>
+            </item>
+            <item>
+            <term>time(4)</term>
+            <description>resolution of 100µs = 0.0001s (100 microseconds)</description>
+            </item>
+            <item>
+            <term>time(5)</term>
+            <description>resolution of 10µs = 0.00001s (10 microseconds)</description>
+            </item>
+            <item>
+            <term>time(6) or interval</term>
+            <description>resolution of 1µs = 0.000001s (1 microsecond)</description>
+            </item>
+            </list>
+            <para>As such, if the 100-nanosecond resolution is significant to an application, a PostgreSQL time will
+            not suffice for those purposes.</para>
+            <para>In more frequent cases though, the resolution of time suffices.
+            <see cref="T:NpgsqlTypes.NpgsqlTime"/> will always suffice to handle the resolution of any time value, and upon
+            writing to the database, will be rounded to the resolution used.</para>
+            </remarks>
+            <returns>The number of ticks in the instance.</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTime.Microseconds">
+            <summary>
+            Gets the number of whole microseconds held in the instance.
+            <returns>An integer in the range [0, 999999].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTime.Milliseconds">
+            <summary>
+            Gets the number of whole milliseconds held in the instance.
+            <returns>An integer in the range [0, 999].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTime.Seconds">
+            <summary>
+            Gets the number of whole seconds held in the instance.
+            <returns>An interger in the range [0, 59].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTime.Minutes">
+            <summary>
+            Gets the number of whole minutes held in the instance.
+            <returns>An integer in the range [0, 59].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTime.Hours">
+            <summary>
+            Gets the number of whole hours held in the instance.
+            <remarks>Note that the time 24:00:00 can be stored for roundtrip compatibility. Any calculations on such a
+            value will normalised it to 00:00:00.</remarks>
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTimeTZ.Normalize">
+            <summary>
+            Normalise this time; if it is 24:00:00, convert it to 00:00:00
+            </summary>
+            <returns>This time, normalised</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTimeTZ.CompareTo(NpgsqlTypes.NpgsqlTimeTZ)">
+            <summary>
+            Compares this with another <see cref="T:NpgsqlTypes.NpgsqlTimeTZ"/>. As per postgres' rules,
+            first the times are compared as if they were both in the same timezone. If they are equal then
+            then timezones are compared (+01:00 being "smaller" than -01:00).
+            </summary>
+            <param name="other">the <see cref="T:NpgsqlTypes.NpgsqlTimeTZ"/> to compare with.</param>
+            <returns>An integer which is 0 if they are equal, &lt; 0 if this is the smaller and &gt; 0 if this is the larger.</returns>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTimeTZ.Microseconds">
+            <summary>
+            Gets the number of whole microseconds held in the instance.
+            <returns>An integer in the range [0, 999999].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTimeTZ.Milliseconds">
+            <summary>
+            Gets the number of whole milliseconds held in the instance.
+            <returns>An integer in the range [0, 999].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTimeTZ.Seconds">
+            <summary>
+            Gets the number of whole seconds held in the instance.
+            <returns>An interger in the range [0, 59].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTimeTZ.Minutes">
+            <summary>
+            Gets the number of whole minutes held in the instance.
+            <returns>An integer in the range [0, 59].</returns>
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlTimeTZ.Hours">
+            <summary>
+            Gets the number of whole hours held in the instance.
+            <remarks>Note that the time 24:00:00 can be stored for roundtrip compatibility. Any calculations on such a
+            value will normalised it to 00:00:00.</remarks>
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.LargeObjectManager">
+            <summary>
+            Summary description for LargeObjectManager.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.BasicBackendToNativeTypeConverter">
+            <summary>
+            Provide event handlers to convert all native supported basic data types from their backend
+            text representation to a .NET object.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToBinary(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Binary data.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToBoolean(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql boolean to a System.Boolean.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToBit(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql bit to a System.Boolean.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToDateTime(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql datetime to a System.DateTime.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToDate(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql date to a System.DateTime.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToTime(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql time to a System.DateTime.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicBackendToNativeTypeConverter.ToMoney(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql money to a System.Decimal.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.BasicNativeToBackendTypeConverter">
+            <summary>
+            Provide event handlers to convert the basic native supported data types from
+            native form to backend representation.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToBinary(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Binary data.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToBoolean(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgresql boolean.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToBit(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgresql bit.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToDateTime(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgresql timestamp.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToDate(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgresql date.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToTime(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgresql time.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToMoney(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgres money.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.BasicNativeToBackendTypeConverter.ToSingleDouble(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgres double with maximum precision.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.ExtendedBackendToNativeTypeConverter">
+            <summary>
+            Provide event handlers to convert extended native supported data types from their backend
+            text representation to a .NET object.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToPoint(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql point to a System.NpgsqlPoint.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToBox(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Convert a postgresql point to a System.RectangleF.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToLSeg(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            LDeg.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToPath(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Path.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToPolygon(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Polygon.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToCircle(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Circle.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToInet(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            Inet.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToMacAddress(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            MAC Address.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedBackendToNativeTypeConverter.ToInterval(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+            interval
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.ExtendedNativeToBackendTypeConverter">
+            <summary>
+            Provide event handlers to convert extended native supported data types from
+            native form to backend representation.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToPoint(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Point.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToBox(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Box.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToLSeg(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            LSeg.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToPath(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Open path.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToPolygon(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Polygon.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToMacAddress(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgres MAC Address.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToCircle(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Circle.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToIPAddress(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgres inet.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.ExtendedNativeToBackendTypeConverter.ToInterval(NpgsqlTypes.NpgsqlNativeTypeInfo,System.Object,System.Boolean)">
+            <summary>
+            Convert to a postgres interval
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlPoint">
+            <summary>
+            Represents a PostgreSQL Point type
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlLSeg">
+            <summary>
+            Represents a PostgreSQL Line Segment type.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlPath">
+            <summary>
+            Represents a PostgreSQL Path type.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlPolygon">
+            <summary>
+            Represents a PostgreSQL Polygon type.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlCircle">
+            <summary>
+            Represents a PostgreSQL Circle type.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlInet">
+            <summary>
+            Represents a PostgreSQL inet type.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlMacAddress">
+            <summary>
+            Represents a PostgreSQL MacAddress type.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlMacAddress.#ctor(System.String)">
+            <summary>
+            
+            </summary>
+            <param name="macAddr">The macAddr parameter must contain a string that can only consist of numbers
+            and upper-case letters as hexadecimal digits. (See PhysicalAddress.Parse method on MSDN)</param>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlTypesHelper">
+            <summary>
+            This class contains helper methods for type conversion between
+            the .Net type system and postgresql.
+            </summary>
+        </member>
+        <member name="F:NpgsqlTypes.NpgsqlTypesHelper.BackendTypeMappingCache">
+            <summary>
+            A cache of basic datatype mappings keyed by server version.  This way we don't
+            have to load the basic type mappings for every connection.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.TryGetBackendTypeInfo(System.String,NpgsqlTypes.NpgsqlBackendTypeInfo@)">
+            <summary>
+            Find a NpgsqlNativeTypeInfo in the default types map that can handle objects
+            of the given NpgsqlDbType.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.TryGetNativeTypeInfo(NpgsqlTypes.NpgsqlDbType,NpgsqlTypes.NpgsqlNativeTypeInfo@)">
+            <summary>
+            Find a NpgsqlNativeTypeInfo in the default types map that can handle objects
+            of the given NpgsqlDbType.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.TryGetNativeTypeInfo(System.Data.DbType,NpgsqlTypes.NpgsqlNativeTypeInfo@)">
+            <summary>
+            Find a NpgsqlNativeTypeInfo in the default types map that can handle objects
+            of the given DbType.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.TryGetNativeTypeInfo(System.Type,NpgsqlTypes.NpgsqlNativeTypeInfo@)">
+            <summary>
+            Find a NpgsqlNativeTypeInfo in the default types map that can handle objects
+            of the given System.Type.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.ConvertBackendStringToSystemType(NpgsqlTypes.NpgsqlBackendTypeInfo,System.String,System.Int16,System.Int32)">
+            <summary>
+             This method is responsible to convert the string received from the backend
+             to the corresponding NpgsqlType.
+             The given TypeInfo is called upon to do the conversion.
+             If no TypeInfo object is provided, no conversion is performed.
+             </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.PrepareDefaultTypesMap">
+            <summary>
+            Create the one and only native to backend type map.
+            This map is used when formatting native data
+            types to backend representations.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.CreateAndLoadInitialTypesMapping(Npgsql.NpgsqlConnector)">
+            <summary>
+             This method creates (or retrieves from cache) a mapping between type and OID 
+             of all natively supported postgresql data types.
+             This is needed as from one version to another, this mapping can be changed and
+             so we avoid hardcoding them.
+             </summary>
+             <returns>NpgsqlTypeMapping containing all known data types.  The mapping must be
+             cloned before it is modified because it is cached; changes made by one connection may
+             effect another connection.</returns>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlTypesHelper.LoadTypesMappings(Npgsql.NpgsqlConnector,NpgsqlTypes.NpgsqlBackendTypeMapping,System.Collections.Generic.IEnumerable{NpgsqlTypes.NpgsqlBackendTypeInfo})">
+            <summary>
+            Attempt to map types by issuing a query against pg_type.
+            This function takes a list of NpgsqlTypeInfo and attempts to resolve the OID field
+            of each by querying pg_type.  If the mapping is found, the type info object is
+            updated (OID) and added to the provided NpgsqlTypeMapping object.
+            </summary>
+            <param name="conn">NpgsqlConnector to send query through.</param>
+            <param name="TypeMappings">Mapping object to add types too.</param>
+            <param name="TypeInfoList">List of types that need to have OID's mapped.</param>
+        </member>
+        <member name="T:NpgsqlTypes.ConvertBackendToNativeHandler">
+            <summary>
+            Delegate called to convert the given backend data to its native representation.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.ConvertNativeToBackendHandler">
+            <summary>
+            Delegate called to convert the given native data to its backand representation.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlBackendTypeInfo">
+            <summary>
+            Represents a backend data type.
+            This class can be called upon to convert a backend field representation to a native object.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeInfo.#ctor(System.Int32,System.String,NpgsqlTypes.NpgsqlDbType,System.Data.DbType,System.Type,NpgsqlTypes.ConvertBackendToNativeHandler)">
+            <summary>
+            Construct a new NpgsqlTypeInfo with the given attributes and conversion handlers.
+            </summary>
+            <param name="OID">Type OID provided by the backend server.</param>
+            <param name="Name">Type name provided by the backend server.</param>
+            <param name="NpgsqlDbType">NpgsqlDbType</param>
+            <param name="Type">System type to convert fields of this type to.</param>
+            <param name="ConvertBackendToNative">Data conversion handler.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeInfo.ConvertToNative(System.String,System.Int16,System.Int32)">
+            <summary>
+            Perform a data conversion from a backend representation to 
+            a native object.
+            </summary>
+            <param name="BackendData">Data sent from the backend.</param>
+            <param name="TypeModifier">Type modifier field sent from the backend.</param>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeInfo.OID">
+            <summary>
+            Type OID provided by the backend server.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeInfo.Name">
+            <summary>
+            Type name provided by the backend server.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeInfo.NpgsqlDbType">
+            <summary>
+            NpgsqlDbType.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeInfo.DbType">
+            <summary>
+            NpgsqlDbType.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeInfo.Type">
+            <summary>
+            Provider type to convert fields of this type to.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeInfo.FrameworkType">
+            <summary>
+            System type to convert fields of this type to.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlNativeTypeInfo">
+            <summary>
+            Represents a backend data type.
+            This class can be called upon to convert a native object to its backend field representation,
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeInfo.ArrayOf(NpgsqlTypes.NpgsqlNativeTypeInfo)">
+            <summary>
+            Returns an NpgsqlNativeTypeInfo for an array where the elements are of the type
+            described by the NpgsqlNativeTypeInfo supplied.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeInfo.#ctor(System.String,NpgsqlTypes.NpgsqlDbType,System.Data.DbType,System.Boolean,NpgsqlTypes.ConvertNativeToBackendHandler)">
+            <summary>
+            Construct a new NpgsqlTypeInfo with the given attributes and conversion handlers.
+            </summary>
+            <param name="Name">Type name provided by the backend server.</param>
+            <param name="NpgsqlDbType">NpgsqlDbType</param>
+            <param name="ConvertNativeToBackend">Data conversion handler.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeInfo.ConvertToBackend(System.Object,System.Boolean)">
+            <summary>
+            Perform a data conversion from a native object to
+            a backend representation.
+            DBNull and null values are handled differently depending if a plain query is used
+            When 
+            </summary>
+            <param name="NativeData">Native .NET object to be converted.</param>
+            <param name="ForExtendedQuery">Flag indicating if the conversion has to be done for 
+            plain queries or extended queries</param>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlNativeTypeInfo.Name">
+            <summary>
+            Type name provided by the backend server.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlNativeTypeInfo.NpgsqlDbType">
+            <summary>
+            NpgsqlDbType.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlNativeTypeInfo.DbType">
+            <summary>
+            DbType.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlNativeTypeInfo.Quote">
+            <summary>
+            Apply quoting.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlNativeTypeInfo.UseSize">
+            <summary>
+            Use parameter size information.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlBackendTypeMapping">
+            <summary>
+            Provide mapping between type OID, type name, and a NpgsqlBackendTypeInfo object that represents it.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.#ctor">
+            <summary>
+            Construct an empty mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.#ctor(NpgsqlTypes.NpgsqlBackendTypeMapping)">
+            <summary>
+            Copy constuctor.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.AddType(NpgsqlTypes.NpgsqlBackendTypeInfo)">
+            <summary>
+            Add the given NpgsqlBackendTypeInfo to this mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.AddType(System.Int32,System.String,NpgsqlTypes.NpgsqlDbType,System.Data.DbType,System.Type,NpgsqlTypes.ConvertBackendToNativeHandler)">
+            <summary>
+            Add a new NpgsqlBackendTypeInfo with the given attributes and conversion handlers to this mapping.
+            </summary>
+            <param name="OID">Type OID provided by the backend server.</param>
+            <param name="Name">Type name provided by the backend server.</param>
+            <param name="NpgsqlDbType">NpgsqlDbType</param>
+            <param name="Type">System type to convert fields of this type to.</param>
+            <param name="BackendConvert">Data conversion handler.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.Clone">
+            <summary>
+            Make a shallow copy of this type mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.ContainsOID(System.Int32)">
+            <summary>
+            Determine if a NpgsqlBackendTypeInfo with the given backend type OID exists in this mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlBackendTypeMapping.ContainsName(System.String)">
+            <summary>
+            Determine if a NpgsqlBackendTypeInfo with the given backend type name exists in this mapping.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeMapping.Count">
+            <summary>
+            Get the number of type infos held.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeMapping.Item(System.Int32)">
+            <summary>
+            Retrieve the NpgsqlBackendTypeInfo with the given backend type OID, or null if none found.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlBackendTypeMapping.Item(System.String)">
+            <summary>
+            Retrieve the NpgsqlBackendTypeInfo with the given backend type name, or null if none found.
+            </summary>
+        </member>
+        <member name="T:NpgsqlTypes.NpgsqlNativeTypeMapping">
+            <summary>
+            Provide mapping between type Type, NpgsqlDbType and a NpgsqlNativeTypeInfo object that represents it.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.AddType(NpgsqlTypes.NpgsqlNativeTypeInfo)">
+            <summary>
+            Add the given NpgsqlNativeTypeInfo to this mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.AddType(System.String,NpgsqlTypes.NpgsqlDbType,System.Data.DbType,System.Boolean,NpgsqlTypes.ConvertNativeToBackendHandler)">
+            <summary>
+            Add a new NpgsqlNativeTypeInfo with the given attributes and conversion handlers to this mapping.
+            </summary>
+            <param name="Name">Type name provided by the backend server.</param>
+            <param name="NpgsqlDbType">NpgsqlDbType</param>
+            <param name="NativeConvert">Data conversion handler.</param>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.TryGetValue(NpgsqlTypes.NpgsqlDbType,NpgsqlTypes.NpgsqlNativeTypeInfo@)">
+            <summary>
+            Retrieve the NpgsqlNativeTypeInfo with the given NpgsqlDbType.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.TryGetValue(System.Data.DbType,NpgsqlTypes.NpgsqlNativeTypeInfo@)">
+            <summary>
+            Retrieve the NpgsqlNativeTypeInfo with the given DbType.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.TryGetValue(System.Type,NpgsqlTypes.NpgsqlNativeTypeInfo@)">
+            <summary>
+            Retrieve the NpgsqlNativeTypeInfo with the given Type.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.ContainsName(System.String)">
+            <summary>
+            Determine if a NpgsqlNativeTypeInfo with the given backend type name exists in this mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.ContainsNpgsqlDbType(NpgsqlTypes.NpgsqlDbType)">
+            <summary>
+            Determine if a NpgsqlNativeTypeInfo with the given NpgsqlDbType exists in this mapping.
+            </summary>
+        </member>
+        <member name="M:NpgsqlTypes.NpgsqlNativeTypeMapping.ContainsType(System.Type)">
+            <summary>
+            Determine if a NpgsqlNativeTypeInfo with the given Type name exists in this mapping.
+            </summary>
+        </member>
+        <member name="P:NpgsqlTypes.NpgsqlNativeTypeMapping.Count">
+            <summary>
+            Get the number of type infos held.
+            </summary>
+        </member>
+        <member name="M:Npgsql.SqlGenerators.SqlBaseGenerator.GetColumnsForJoin(Npgsql.SqlGenerators.JoinExpression,Npgsql.SqlGenerators.ProjectionExpression,Npgsql.SqlGenerators.VisitedExpression)">
+            <summary>
+            Given a join expression and a projection, fetch all columns in the projection
+            that reference columns in the join.
+            </summary>
+        </member>
+        <member name="M:Npgsql.SqlGenerators.SqlBaseGenerator.GetFromNames(Npgsql.SqlGenerators.InputExpression,System.Collections.Generic.List{System.String})">
+            <summary>
+            Given an InputExpression append all from names (including nested joins) to the list.
+            </summary>
+        </member>
+        <member name="M:Npgsql.SqlGenerators.SqlBaseGenerator.GetReplacementColumn(Npgsql.SqlGenerators.JoinExpression,Npgsql.SqlGenerators.ColumnExpression)">
+            <summary>
+            Get new ColumnExpression that will be used in projection that had it's existing columns moved.
+            These should be simple references to the inner column
+            </summary>
+        </member>
+        <member name="M:Npgsql.SqlGenerators.SqlBaseGenerator.AdjustPropertyAccess(Npgsql.SqlGenerators.ColumnExpression[],System.String)">
+            <summary>
+            Every property accessed in the list of columns must be adjusted for a new scope
+            </summary>
+        </member>
+        <member name="P:Npgsql.Cache`1.CacheSize">
+            <summary>
+            Set Cache Size. The default value is 20.
+            </summary>
+        </member>
+        <member name="P:Npgsql.Cache`1.Item(System.String)">
+            <summary>
+            Lookup cached entity. null will returned if not match.
+            For both get{} and set{} apply LRU rule.
+            </summary>
+            <param name="key">key</param>
+            <returns></returns>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.#ctor">
+            <summary>
+            Called from constructor of derived class.
+            </summary>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.Finalize">
+            <summary>
+            Finalizer for HashAlgorithm
+            </summary>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.ComputeHash(System.Byte[])">
+            <summary>
+            Computes the entire hash of all the bytes in the byte array.
+            </summary>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.HashCore(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            When overridden in a derived class, drives the hashing function.
+            </summary>
+            <param name="rgb"></param>
+            <param name="start"></param>
+            <param name="size"></param>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.HashFinal">
+            <summary>
+            When overridden in a derived class, this pads and hashes whatever data might be left in the buffers and then returns the hash created.
+            </summary>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.Initialize">
+            <summary>
+            When overridden in a derived class, initializes the object to prepare for hashing.
+            </summary>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.TransformBlock(System.Byte[],System.Int32,System.Int32,System.Byte[],System.Int32)">
+            <summary>
+            Used for stream chaining.  Computes hash as data passes through it.
+            </summary>
+            <param name="inputBuffer">The buffer from which to grab the data to be copied.</param>
+            <param name="inputOffset">The offset into the input buffer to start reading at.</param>
+            <param name="inputCount">The number of bytes to be copied.</param>
+            <param name="outputBuffer">The buffer to write the copied data to.</param>
+            <param name="outputOffset">At what point in the outputBuffer to write the data at.</param>
+        </member>
+        <member name="M:Npgsql.HashAlgorithm.TransformFinalBlock(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Used for stream chaining.  Computes hash as data passes through it.  Finishes off the hash.
+            </summary>
+            <param name="inputBuffer">The buffer from which to grab the data to be copied.</param>
+            <param name="inputOffset">The offset into the input buffer to start reading at.</param>
+            <param name="inputCount">The number of bytes to be copied.</param>
+        </member>
+        <member name="P:Npgsql.HashAlgorithm.CanTransformMultipleBlocks">
+            <summary>
+            Get whether or not the hash can transform multiple blocks at a time.
+            Note: MUST be overriden if descendant can transform multiple block
+            on a single call!
+            </summary>
+        </member>
+        <member name="P:Npgsql.HashAlgorithm.Hash">
+            <summary>
+            Gets the previously computed hash.
+            </summary>
+        </member>
+        <member name="P:Npgsql.HashAlgorithm.HashSize">
+            <summary>
+            Returns the size in bits of the hash.
+            </summary>
+        </member>
+        <member name="P:Npgsql.HashAlgorithm.InputBlockSize">
+            <summary>
+            Must be overriden if not 1
+            </summary>
+        </member>
+        <member name="P:Npgsql.HashAlgorithm.OutputBlockSize">
+            <summary>
+            Must be overriden if not 1
+            </summary>
+        </member>
+        <member name="T:Npgsql.MD5">
+            <summary>
+            Common base class for all derived MD5 implementations.
+            </summary>
+        </member>
+        <member name="M:Npgsql.MD5.#ctor">
+            <summary>
+            Called from constructor of derived class.
+            </summary>
+        </member>
+        <member name="M:Npgsql.MD5.Create">
+            <summary>
+            Creates the default derived class.
+            </summary>
+        </member>
+        <member name="T:Npgsql.MD5CryptoServiceProvider">
+            <summary>
+            C# implementation of the MD5 cryptographic hash function.
+            </summary>
+        </member>
+        <member name="M:Npgsql.MD5CryptoServiceProvider.#ctor">
+            <summary>
+            Creates a new MD5CryptoServiceProvider.
+            </summary>
+        </member>
+        <member name="M:Npgsql.MD5CryptoServiceProvider.HashCore(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Drives the hashing function.
+            </summary>
+            <param name="rgb">Byte array containing the data to hash.</param>
+            <param name="start">Where in the input buffer to start.</param>
+            <param name="size">Size in bytes of the data in the buffer to hash.</param>
+        </member>
+        <member name="M:Npgsql.MD5CryptoServiceProvider.HashFinal">
+            <summary>
+            This finalizes the hash.  Takes the data from the chaining variables and returns it.
+            </summary>
+        </member>
+        <member name="M:Npgsql.MD5CryptoServiceProvider.Initialize">
+            <summary>
+            Resets the class after use.  Called automatically after hashing is done.
+            </summary>
+        </member>
+        <member name="M:Npgsql.MD5CryptoServiceProvider.ProcessBlock(System.Byte[],System.Int32)">
+            <summary>
+            This is the meat of the hash function.  It is what processes each block one at a time.
+            </summary>
+            <param name="inputBuffer">Byte array to process data from.</param>
+            <param name="inputOffset">Where in the byte array to start processing.</param>
+        </member>
+        <member name="M:Npgsql.MD5CryptoServiceProvider.ProcessFinalBlock(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Pads and then processes the final block.
+            </summary>
+            <param name="inputBuffer">Buffer to grab data from.</param>
+            <param name="inputOffset">Position in buffer in bytes to get data from.</param>
+            <param name="inputCount">How much data in bytes in the buffer to use.</param>
+        </member>
+        <member name="T:Npgsql.StringRowReaderV3">
+            <summary>
+            Implements <see cref="T:Npgsql.RowReader"/> for version 3 of the protocol.
+            </summary>
+        </member>
+        <member name="T:Npgsql.RowReader">
+            <summary>
+            Reads a row, field by field, allowing a DataRow to be built appropriately.
+            </summary>
+        </member>
+        <member name="T:Npgsql.IStreamOwner">
+            <summary>
+            Marker interface which identifies a class which may take possession of a stream for the duration of
+            it's lifetime (possibly temporarily giving that possession to another class for part of that time.
+            
+            It inherits from IDisposable, since any such class must make sure it leaves the stream in a valid state.
+            
+            The most important such class is that compiler-generated from ProcessBackendResponsesEnum. Of course
+            we can't make that inherit from this interface, alas.
+            </summary>
+        </member>
+        <!-- Badly formed XML comment ignored for member "T:Npgsql.IServerResponseObject" -->
+        <member name="T:Npgsql.RowReader.Streamer">
+            <summary>
+            Reads part of a field, as needed (for <see cref="!:System.Data.IDataRecord.GetChars()"/>
+            and <see cref="!:System.Data.IDataRecord.GetBytes()"/>
+            </summary>
+        </member>
+        <member name="T:Npgsql.RowReader.Streamer`1">
+            <summary>
+            Adds further functionality to stream that is dependant upon the type of data read.
+            </summary>
+        </member>
+        <member name="T:Npgsql.RowReader.CharStreamer">
+            <summary>
+            Completes the implementation of Streamer for char data.
+            </summary>
+        </member>
+        <member name="T:Npgsql.RowReader.ByteStreamer">
+            <summary>
+            Completes the implementation of Streamer for byte data.
+            </summary>
+        </member>
+        <member name="T:Npgsql.StringRowReaderV2">
+            <summary>
+            Implements <see cref="T:Npgsql.RowReader"/> for version 2 of the protocol.
+            </summary>
+        </member>
+        <member name="T:Npgsql.StringRowReaderV2.NullMap">
+            <summary>
+            Encapsulates the null mapping bytes sent at the start of a version 2
+            datarow message, and the process of identifying the nullity of the data
+            at a particular index
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlBackEndKeyData">
+            <summary>
+            This class represents a BackEndKeyData message received
+            from PostgreSQL
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlBind">
+             <summary>
+             This class represents the Bind message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.ClientMessage">
+            <summary>
+            For classes representing messages sent from the client to the server.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCancelRequest">
+             <summary>
+             This class represents the CancelRequest message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlState">
+            <summary> This class represents the base class for the state pattern design pattern
+             implementation.
+             </summary>
+            
+        </member>
+        <member name="M:Npgsql.NpgsqlState.ChangeState(Npgsql.NpgsqlConnector,Npgsql.NpgsqlState)">
+            <summary>
+            This method is used by the states to change the state of the context.
+             </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlState.ProcessBackendResponses(Npgsql.NpgsqlConnector)">
+            <summary>
+             This method is responsible to handle all protocol messages sent from the backend.
+             It holds all the logic to do it.
+             To exchange data, it uses a Mediator object from which it reads/writes information
+             to handle backend requests.
+             </summary>
+            
+        </member>
+        <member name="M:Npgsql.NpgsqlState.ProcessBackendResponsesEnum(Npgsql.NpgsqlConnector)">
+            <summary>
+             This method is responsible to handle all protocol messages sent from the backend.
+             It holds all the logic to do it.
+             To exchange data, it uses a Mediator object from which it reads/writes information
+             to handle backend requests.
+             </summary>
+            
+        </member>
+        <member name="M:Npgsql.NpgsqlState.CheckForContextSocketAvailability(Npgsql.NpgsqlConnector,System.Net.Sockets.SelectMode)">
+            <summary>
+            Checks for context socket availability.
+            Socket.Poll supports integer as microseconds parameter.
+            This limits the usable command timeout value
+            to 2,147 seconds: (2,147 x 1,000,000 less than  max_int).
+            In order to bypass this limit, the availability of
+            the socket is checked in 2,147 seconds cycles
+            </summary>
+            <returns><c>true</c>, if for context socket availability was checked, <c>false</c> otherwise.</returns>
+            <param name="context">Context.</param>
+            <param name="selectMode">Select mode.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlClosedState.ResolveIPHost(System.String)">
+            <summary>
+            Resolve a host name or IP address.
+            This is needed because if you call Dns.Resolve() with an IP address, it will attempt
+            to resolve it as a host name, when it should just convert it to an IP address.
+            </summary>
+            <param name="HostName"></param>
+        </member>
+        <member name="T:Npgsql.NpgsqlCommand">
+            <summary>
+            Represents a SQL statement or function (stored procedure) to execute
+            against a PostgreSQL database. This class cannot be inherited.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> class.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> class with the text of the query.
+            </summary>
+            <param name="cmdText">The text of the query.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.#ctor(System.String,Npgsql.NpgsqlConnection)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> class with the text of the query and a <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>.
+            </summary>
+            <param name="cmdText">The text of the query.</param>
+            <param name="connection">A <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see> that represents the connection to a PostgreSQL server.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.#ctor(System.String,Npgsql.NpgsqlConnection,Npgsql.NpgsqlTransaction)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> class with the text of the query, a <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>, and the <see cref="T:Npgsql.NpgsqlTransaction">NpgsqlTransaction</see>.
+            </summary>
+            <param name="cmdText">The text of the query.</param>
+            <param name="connection">A <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see> that represents the connection to a PostgreSQL server.</param>
+            <param name="transaction">The <see cref="T:Npgsql.NpgsqlTransaction">NpgsqlTransaction</see> in which the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> executes.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.#ctor(System.String,Npgsql.NpgsqlConnector)">
+            <summary>
+            Used to execute internal commands.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.Cancel">
+            <summary>
+            Attempts to cancel the execution of a <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see>.
+            </summary>
+            <remarks>This Method isn't implemented yet.</remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.System#ICloneable#Clone">
+            <summary>
+            Create a new command based on this one.
+            </summary>
+            <returns>A new NpgsqlCommand object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.Clone">
+            <summary>
+            Create a new command based on this one.
+            </summary>
+            <returns>A new NpgsqlCommand object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.CreateDbParameter">
+            <summary>
+            Creates a new instance of an <see cref="T:System.Data.Common.DbParameter">DbParameter</see> object.
+            </summary>
+            <returns>An <see cref="T:System.Data.Common.DbParameter">DbParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.CreateParameter">
+            <summary>
+            Creates a new instance of a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.
+            </summary>
+            <returns>A <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.ExecuteBlind">
+            <summary>
+            Slightly optimised version of ExecuteNonQuery() for internal ues in cases where the number
+            of affected rows is of no interest.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.ExecuteNonQuery">
+            <summary>
+            Executes a SQL statement against the connection and returns the number of rows affected.
+            </summary>
+            <returns>The number of rows affected if known; -1 otherwise.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.ExecuteDbDataReader(System.Data.CommandBehavior)">
+            <summary>
+            Sends the <see cref="P:Npgsql.NpgsqlCommand.CommandText">CommandText</see> to
+            the <see cref="T:Npgsql.NpgsqlConnection">Connection</see> and builds a
+            <see cref="T:Npgsql.NpgsqlDataReader">NpgsqlDataReader</see>
+            using one of the <see cref="T:System.Data.CommandBehavior">CommandBehavior</see> values.
+            </summary>
+            <param name="behavior">One of the <see cref="T:System.Data.CommandBehavior">CommandBehavior</see> values.</param>
+            <returns>A <see cref="T:Npgsql.NpgsqlDataReader">NpgsqlDataReader</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.ExecuteReader">
+            <summary>
+            Sends the <see cref="P:Npgsql.NpgsqlCommand.CommandText">CommandText</see> to
+            the <see cref="T:Npgsql.NpgsqlConnection">Connection</see> and builds a
+            <see cref="T:Npgsql.NpgsqlDataReader">NpgsqlDataReader</see>.
+            </summary>
+            <returns>A <see cref="T:Npgsql.NpgsqlDataReader">NpgsqlDataReader</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.ExecuteReader(System.Data.CommandBehavior)">
+            <summary>
+            Sends the <see cref="P:Npgsql.NpgsqlCommand.CommandText">CommandText</see> to
+            the <see cref="T:Npgsql.NpgsqlConnection">Connection</see> and builds a
+            <see cref="T:Npgsql.NpgsqlDataReader">NpgsqlDataReader</see>
+            using one of the <see cref="T:System.Data.CommandBehavior">CommandBehavior</see> values.
+            </summary>
+            <param name="cb">One of the <see cref="T:System.Data.CommandBehavior">CommandBehavior</see> values.</param>
+            <returns>A <see cref="T:Npgsql.NpgsqlDataReader">NpgsqlDataReader</see> object.</returns>
+            <remarks>Currently the CommandBehavior parameter is ignored.</remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.BindParameters">
+            <summary>
+             This method binds the parameters from parameters collection to the bind
+             message.
+             </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.ExecuteScalar">
+            <summary>
+            Executes the query, and returns the first column of the first row
+            in the result set returned by the query. Extra columns or rows are ignored.
+            </summary>
+            <returns>The first column of the first row in the result set,
+            or a null reference if the result set is empty.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.Prepare">
+            <summary>
+            Creates a prepared version of the command on a PostgreSQL server.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.CheckConnectionState">
+            <summary>
+             This method checks the connection state to see if the connection
+             is set or it is open. If one of this conditions is not met, throws
+             an InvalidOperationException
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommand.GetCommandText">
+            <summary>
+            This method substitutes the <see cref="P:Npgsql.NpgsqlCommand.Parameters">Parameters</see>, if exist, in the command
+            to their actual values.
+            The parameter name format is <b>:ParameterName</b>.
+            </summary>
+            <returns>A version of <see cref="P:Npgsql.NpgsqlCommand.CommandText">CommandText</see> with the <see cref="P:Npgsql.NpgsqlCommand.Parameters">Parameters</see> inserted.</returns>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.CommandText">
+            <summary>
+            Gets or sets the SQL statement or function (stored procedure) to execute at the data source.
+            </summary>
+            <value>The Transact-SQL statement or stored procedure to execute. The default is an empty string.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.CommandTimeout">
+            <summary>
+            Gets or sets the wait time before terminating the attempt
+            to execute a command and generating an error.
+            </summary>
+            <value>The time (in seconds) to wait for the command to execute.
+            The default is 20 seconds.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.CommandType">
+            <summary>
+            Gets or sets a value indicating how the
+            <see cref="P:Npgsql.NpgsqlCommand.CommandText">CommandText</see> property is to be interpreted.
+            </summary>
+            <value>One of the <see cref="T:System.Data.CommandType">CommandType</see> values. The default is <see cref="T:System.Data.CommandType">CommandType.Text</see>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.Connection">
+            <summary>
+            Gets or sets the <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>
+            used by this instance of the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see>.
+            </summary>
+            <value>The connection to a data source. The default value is a null reference.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.Parameters">
+            <summary>
+            Gets the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see>.
+            </summary>
+            <value>The parameters of the SQL statement or function (stored procedure). The default is an empty collection.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.Transaction">
+            <summary>
+            Gets or sets the <see cref="T:Npgsql.NpgsqlTransaction">NpgsqlTransaction</see>
+            within which the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> executes.
+            </summary>
+            <value>The <see cref="T:Npgsql.NpgsqlTransaction">NpgsqlTransaction</see>.
+            The default value is a null reference.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.UpdatedRowSource">
+            <summary>
+            Gets or sets how command results are applied to the <see cref="T:System.Data.DataRow">DataRow</see>
+            when used by the <see cref="M:System.Data.Common.DbDataAdapter.Update(System.Data.DataSet)">Update</see>
+            method of the <see cref="T:System.Data.Common.DbDataAdapter">DbDataAdapter</see>.
+            </summary>
+            <value>One of the <see cref="T:System.Data.UpdateRowSource">UpdateRowSource</see> values.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlCommand.LastInsertedOID">
+            <summary>
+            Returns oid of inserted row. This is only updated when using executenonQuery and when command inserts just a single row. If table is created without oids, this will always be 0.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCommandBuilder">
+            <summary>
+             This class is responsible to create database commands for automatic insert, update and delete operations.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCommandBuilder.DeriveParameters(Npgsql.NpgsqlCommand)">
+            <summary>
+            
+             This method is reponsible to derive the command parameter list with values obtained from function definition.
+             It clears the Parameters collection of command. Also, if there is any parameter type which is not supported by Npgsql, an InvalidOperationException will be thrown.
+             Parameters name will be parameter1, parameter2, ...
+             For while, only parameter name and NpgsqlDbType are obtained.
+            </summary>
+             <param name="command">NpgsqlCommand whose function parameters will be obtained.</param>
+        </member>
+        <member name="T:Npgsql.NoticeEventHandler">
+            <summary>
+            Represents the method that handles the <see cref="E:Npgsql.NpgsqlConnection.Notification">Notice</see> events.
+            </summary>
+            <param name="e">A <see cref="T:Npgsql.NpgsqlNoticeEventArgs">NpgsqlNoticeEventArgs</see> that contains the event data.</param>
+        </member>
+        <member name="T:Npgsql.NotificationEventHandler">
+            <summary>
+            Represents the method that handles the <see cref="E:Npgsql.NpgsqlConnection.Notification">Notification</see> events.
+            </summary>
+            <param name="sender">The source of the event.</param>
+            <param name="e">A <see cref="T:Npgsql.NpgsqlNotificationEventArgs">NpgsqlNotificationEventArgs</see> that contains the event data.</param>
+        </member>
+        <member name="T:Npgsql.NpgsqlConnection">
+            <summary>
+            This class represents a connection to a
+            PostgreSQL server.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.#ctor">
+            <summary>
+            Initializes a new instance of the
+            <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see> class.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.#ctor(System.String)">
+            <summary>
+            Initializes a new instance of the
+            <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see> class
+            and sets the <see cref="P:Npgsql.NpgsqlConnection.ConnectionString">ConnectionString</see>.
+            </summary>
+            <param name="ConnectionString">The connection used to open the PostgreSQL database.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.BeginDbTransaction(System.Data.IsolationLevel)">
+            <summary>
+            Begins a database transaction with the specified isolation level.
+            </summary>
+            <param name="isolationLevel">The <see cref="T:System.Data.IsolationLevel">isolation level</see> under which the transaction should run.</param>
+            <returns>An <see cref="T:System.Data.Common.DbTransaction">DbTransaction</see>
+            object representing the new transaction.</returns>
+            <remarks>
+            Currently the IsolationLevel ReadCommitted and Serializable are supported by the PostgreSQL backend.
+            There's no support for nested transactions.
+            </remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.BeginTransaction">
+            <summary>
+            Begins a database transaction.
+            </summary>
+            <returns>A <see cref="T:Npgsql.NpgsqlTransaction">NpgsqlTransaction</see>
+            object representing the new transaction.</returns>
+            <remarks>
+            Currently there's no support for nested transactions.
+            </remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.BeginTransaction(System.Data.IsolationLevel)">
+            <summary>
+            Begins a database transaction with the specified isolation level.
+            </summary>
+            <param name="level">The <see cref="T:System.Data.IsolationLevel">isolation level</see> under which the transaction should run.</param>
+            <returns>A <see cref="T:Npgsql.NpgsqlTransaction">NpgsqlTransaction</see>
+            object representing the new transaction.</returns>
+            <remarks>
+            Currently the IsolationLevel ReadCommitted and Serializable are supported by the PostgreSQL backend.
+            There's no support for nested transactions.
+            </remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.Open">
+            <summary>
+            Opens a database connection with the property settings specified by the
+            <see cref="P:Npgsql.NpgsqlConnection.ConnectionString">ConnectionString</see>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.ChangeDatabase(System.String)">
+            <summary>
+            This method changes the current database by disconnecting from the actual
+            database and connecting to the specified.
+            </summary>
+            <param name="dbName">The name of the database to use in place of the current database.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.Close">
+            <summary>
+            Releases the connection to the database.  If the connection is pooled, it will be
+            made available for re-use.  If it is non-pooled, the actual connection will be shutdown.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.CreateDbCommand">
+            <summary>
+            Creates and returns a <see cref="T:System.Data.Common.DbCommand">DbCommand</see>
+            object associated with the <see cref="T:System.Data.Common.DbConnection">IDbConnection</see>.
+            </summary>
+            <returns>A <see cref="T:System.Data.Common.DbCommand">DbCommand</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.CreateCommand">
+            <summary>
+            Creates and returns a <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see>
+            object associated with the <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>.
+            </summary>
+            <returns>A <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.Dispose(System.Boolean)">
+            <summary>
+            Releases all resources used by the
+            <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>.
+            </summary>
+            <param name="disposing"><b>true</b> when called from Dispose();
+            <b>false</b> when being called from the finalizer.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.System#ICloneable#Clone">
+            <summary>
+            Create a new connection based on this one.
+            </summary>
+            <returns>A new NpgsqlConnection object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.Clone">
+            <summary>
+            Create a new connection based on this one.
+            </summary>
+            <returns>A new NpgsqlConnection object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.DefaultCertificateSelectionCallback(System.Security.Cryptography.X509Certificates.X509CertificateCollection,System.Security.Cryptography.X509Certificates.X509Certificate,System.String,System.Security.Cryptography.X509Certificates.X509CertificateCollection)">
+            <summary>
+            Default SSL CertificateSelectionCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.DefaultCertificateValidationCallback(System.Security.Cryptography.X509Certificates.X509Certificate,System.Int32[])">
+            <summary>
+            Default SSL CertificateValidationCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.DefaultPrivateKeySelectionCallback(System.Security.Cryptography.X509Certificates.X509Certificate,System.String)">
+            <summary>
+            Default SSL PrivateKeySelectionCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.DefaultProvideClientCertificatesCallback(System.Security.Cryptography.X509Certificates.X509CertificateCollection)">
+            <summary>
+            Default SSL ProvideClientCertificatesCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.LogConnectionString">
+            <summary>
+            Write each key/value pair in the connection string to the log.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.GetSchema">
+            <summary>
+            Returns the supported collections
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.GetSchema(System.String)">
+            <summary>
+            Returns the schema collection specified by the collection name.
+            </summary>
+            <param name="collectionName">The collection name.</param>
+            <returns>The collection specified.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnection.GetSchema(System.String,System.String[])">
+            <summary>
+            Returns the schema collection specified by the collection name filtered by the restrictions.
+            </summary>
+            <param name="collectionName">The collection name.</param>
+            <param name="restrictions">
+            The restriction values to filter the results.  A description of the restrictions is contained
+            in the Restrictions collection.
+            </param>
+            <returns>The collection specified.</returns>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnection.Notice">
+            <summary>
+            Occurs on NoticeResponses from the PostgreSQL backend.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnection.Notification">
+            <summary>
+            Occurs on NotificationResponses from the PostgreSQL backend.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnection.ProvideClientCertificatesCallback">
+            <summary>
+            Called to provide client certificates for SSL handshake.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnection.CertificateSelectionCallback">
+            <summary>
+            Mono.Security.Protocol.Tls.CertificateSelectionCallback delegate.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnection.CertificateValidationCallback">
+            <summary>
+            Mono.Security.Protocol.Tls.CertificateValidationCallback delegate.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnection.PrivateKeySelectionCallback">
+            <summary>
+            Mono.Security.Protocol.Tls.PrivateKeySelectionCallback delegate.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.ConnectionString">
+            <summary>
+            Gets or sets the string used to connect to a PostgreSQL database.
+            Valid values are:
+            <ul>
+            <li>
+            Server:             Address/Name of Postgresql Server;
+            </li>
+            <li>
+            Port:               Port to connect to;
+            </li>
+            <li>
+            Protocol:           Protocol version to use, instead of automatic; Integer 2 or 3;
+            </li>
+            <li>
+            Database:           Database name. Defaults to user name if not specified;
+            </li>
+            <li>
+            User Id:            User name;
+            </li>
+            <li>
+            Password:           Password for clear text authentication;
+            </li>
+            <li>
+            SSL:                True or False. Controls whether to attempt a secure connection. Default = False;
+            </li>
+            <li>
+            Pooling:            True or False. Controls whether connection pooling is used. Default = True;
+            </li>
+            <li>
+            MinPoolSize:        Min size of connection pool;
+            </li>
+            <li>
+            MaxPoolSize:        Max size of connection pool;
+            </li>
+            <li>
+            Timeout:            Time to wait for connection open in seconds. Default is 15.
+            </li>
+            <li>
+            CommandTimeout:     Time to wait for command to finish execution before throw an exception. In seconds. Default is 20.
+            </li>
+            <li>
+            Sslmode:            Mode for ssl connection control. Can be Prefer, Require, Allow or Disable. Default is Disable. Check user manual for explanation of values.
+            </li>
+            <li>
+            ConnectionLifeTime: Time to wait before closing unused connections in the pool in seconds. Default is 15.
+            </li>
+            <li>
+            SyncNotification:   Specifies if Npgsql should use synchronous notifications.
+            </li>
+            <li>
+            SearchPath: Changes search path to specified and public schemas.
+            </li>
+            </ul>
+            </summary>
+            <value>The connection string that includes the server name,
+            the database name, and other parameters needed to establish
+            the initial connection. The default value is an empty string.
+            </value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.Host">
+            <summary>
+            Backend server host name.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.Port">
+            <summary>
+            Backend server port.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.SSL">
+            <summary>
+            If true, the connection will attempt to use SSL.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.ConnectionTimeout">
+            <summary>
+            Gets the time to wait while trying to establish a connection
+            before terminating the attempt and generating an error.
+            </summary>
+            <value>The time (in seconds) to wait for a connection to open. The default value is 15 seconds.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.CommandTimeout">
+            <summary>
+            Gets the time to wait while trying to execute a command
+            before terminating the attempt and generating an error.
+            </summary>
+            <value>The time (in seconds) to wait for a command to complete. The default value is 20 seconds.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.ConnectionLifeTime">
+            <summary>
+            Gets the time to wait before closing unused connections in the pool if the count
+            of all connections exeeds MinPoolSize.
+            </summary>
+            <remarks>
+            If connection pool contains unused connections for ConnectionLifeTime seconds,
+            the half of them will be closed. If there will be unused connections in a second
+            later then again the half of them will be closed and so on.
+            This strategy provide smooth change of connection count in the pool.
+            </remarks>
+            <value>The time (in seconds) to wait. The default value is 15 seconds.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.Database">
+            <summary>
+             Gets the name of the current database or the database to be used after a connection is opened.
+             </summary>
+             <value>The name of the current database or the name of the database to be
+             used after a connection is opened. The default value is the empty string.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.PreloadReader">
+            <summary>
+            Whether datareaders are loaded in their entirety (for compatibility with earlier code).
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.DataSource">
+            <summary>
+            Gets the database server name.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.SyncNotification">
+            <summary>
+            Gets flag indicating if we are using Synchronous notification or not.
+            The default value is false.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.FullState">
+            <summary>
+            Gets the current state of the connection.
+            </summary>
+            <value>A bitwise combination of the <see cref="T:System.Data.ConnectionState">ConnectionState</see> values. The default is <b>Closed</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.State">
+            <summary>
+            Gets whether the current state of the connection is Open or Closed
+            </summary>
+            <value>ConnectionState.Open or ConnectionState.Closed</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.PostgreSqlVersion">
+            <summary>
+            Version of the PostgreSQL backend.
+            This can only be called when there is an active connection.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.BackendProtocolVersion">
+            <summary>
+            Protocol version in use.
+            This can only be called when there is an active connection.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.ProcessID">
+            <summary>
+            Process id of backend server.
+            This can only be called when there is an active connection.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.Connector">
+            <summary>
+            The connector object connected to the backend.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.ConnectionStringValues">
+            <summary>
+            Gets the NpgsqlConnectionStringBuilder containing the parsed connection string values.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.UserName">
+            <summary>
+            User name.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.Password">
+            <summary>
+            Password.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnection.Pooling">
+            <summary>
+            Determine if connection pooling will be used for this connection.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectionStringBuilder.Clone">
+            <summary>
+            Return an exact copy of this NpgsqlConnectionString.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectionStringBuilder.SetValue(System.String,System.Object)">
+            <summary>
+            This function will set value for known key, both private member and base[key].
+            </summary>
+            <param name="keyword"></param>
+            <param name="value"></param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectionStringBuilder.SetValue(Npgsql.Keywords,System.Object)">
+            <summary>
+            The function will modify private member only, not base[key].
+            </summary>
+            <param name="keyword"></param>
+            <param name="value"></param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectionStringBuilder.Clear">
+            <summary>
+            Clear the member and assign them to the default value.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnectionStringBuilder.Compatible">
+            <summary>
+            Compatibilty version. When possible, behaviour caused by breaking changes will be preserved
+            if this version is less than that where the breaking change was introduced.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnectionStringBuilder.Item(System.String)">
+            <summary>
+            Case insensative accessor for indivual connection string values.
+            </summary>
+        </member>
+        <member name="T:Npgsql.ProvideClientCertificatesCallback">
+            <summary>
+            Represents the method that allows the application to provide a certificate collection to be used for SSL clien authentication
+            </summary>
+            <param name="certificates">A <see cref="T:System.Security.Cryptography.X509Certificates.X509CertificateCollection">X509CertificateCollection</see> to be filled with one or more client certificates.</param>
+        </member>
+        <member name="T:Npgsql.NpgsqlConnector">
+            <summary>
+            !!! Helper class, for compilation only.
+            Connector implements the logic for the Connection Objects to
+            access the physical connection to the database, and isolate
+            the application developer from connection pooling internals.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.#ctor(Npgsql.NpgsqlConnectionStringBuilder,System.Boolean,System.Boolean)">
+            <summary>
+            Constructor.
+            </summary>
+            <param name="Shared">Controls whether the connector can be shared.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.IsValid">
+            <summary>
+            This method checks if the connector is still ok.
+            We try to send a simple query text, select 1 as ConnectionTest;
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.ReleaseResources">
+            <summary>
+            This method is responsible for releasing all resources associated with this Connector.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.ReleasePlansPortals">
+            <summary>
+            This method is responsible to release all portals used by this Connector.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.DefaultCertificateSelectionCallback(System.Security.Cryptography.X509Certificates.X509CertificateCollection,System.Security.Cryptography.X509Certificates.X509Certificate,System.String,System.Security.Cryptography.X509Certificates.X509CertificateCollection)">
+            <summary>
+            Default SSL CertificateSelectionCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.DefaultCertificateValidationCallback(System.Security.Cryptography.X509Certificates.X509Certificate,System.Int32[])">
+            <summary>
+            Default SSL CertificateValidationCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.DefaultPrivateKeySelectionCallback(System.Security.Cryptography.X509Certificates.X509Certificate,System.String)">
+            <summary>
+            Default SSL PrivateKeySelectionCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.DefaultProvideClientCertificatesCallback(System.Security.Cryptography.X509Certificates.X509CertificateCollection)">
+            <summary>
+            Default SSL ProvideClientCertificatesCallback implementation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.ProcessServerVersion">
+            <summary>
+            This method is required to set all the version dependent features flags.
+            SupportsPrepare means the server can use prepared query plans (7.3+)
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.Open">
+            <summary>
+            Opens the physical connection to the server.
+            </summary>
+            <remarks>Usually called by the RequestConnector
+            Method of the connection pool manager.</remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.Close">
+            <summary>
+            Closes the physical connection to the server.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.NextPortalName">
+            <summary>
+             Returns next portal index.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnector.NextPlanName">
+            <summary>
+             Returns next plan index.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnector.Notice">
+            <summary>
+            Occurs on NoticeResponses from the PostgreSQL backend.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnector.Notification">
+            <summary>
+            Occurs on NotificationResponses from the PostgreSQL backend.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnector.ProvideClientCertificatesCallback">
+            <summary>
+            Called to provide client certificates for SSL handshake.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnector.CertificateSelectionCallback">
+            <summary>
+            Mono.Security.Protocol.Tls.CertificateSelectionCallback delegate.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnector.CertificateValidationCallback">
+            <summary>
+            Mono.Security.Protocol.Tls.CertificateValidationCallback delegate.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlConnector.PrivateKeySelectionCallback">
+            <summary>
+            Mono.Security.Protocol.Tls.PrivateKeySelectionCallback delegate.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.State">
+            <summary>
+            Gets the current state of the connection.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.ConnectionString">
+            <summary>
+            Return Connection String.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.ServerVersion">
+            <summary>
+            Version of backend server this connector is connected to.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.BackendProtocolVersion">
+            <summary>
+            Backend protocol version in use by this connector.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.Stream">
+            <summary>
+            The physical connection stream to the backend.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.Socket">
+            <summary>
+            The physical connection socket to the backend.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.IsInitialized">
+            <summary>
+            Reports if this connector is fully connected.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.Mediator">
+            <summary>
+            The connection mediator.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.Transaction">
+            <summary>
+            Report if the connection is in a transaction.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlConnector.SupportsPrepare">
+            <summary>
+            Report whether the current connection can support prepare functionality.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlConnectorPool">
+            <summary>
+            This class manages all connector objects, pooled AND non-pooled.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlConnectorPool.ConnectorPoolMgr">
+            <value>Unique static instance of the connector pool
+            mamager.</value>
+        </member>
+        <member name="F:Npgsql.NpgsqlConnectorPool.PooledConnectors">
+            <value>Map of index to unused pooled connectors, avaliable to the
+            next RequestConnector() call.</value>
+            <remarks>This hashmap will be indexed by connection string.
+            This key will hold a list of queues of pooled connectors available to be used.</remarks>
+        </member>
+        <member name="F:Npgsql.NpgsqlConnectorPool.Timer">
+            <value>Timer for tracking unused connections in pools.</value>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.RequestConnector(Npgsql.NpgsqlConnection)">
+            <summary>
+            Searches the shared and pooled connector lists for a
+            matching connector object or creates a new one.
+            </summary>
+            <param name="Connection">The NpgsqlConnection that is requesting
+            the connector. Its ConnectionString will be used to search the
+            pool for available connectors.</param>
+            <returns>A connector object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.RequestPooledConnector(Npgsql.NpgsqlConnection)">
+            <summary>
+            Find a pooled connector.  Handle locking and timeout here.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.RequestPooledConnectorInternal(Npgsql.NpgsqlConnection)">
+            <summary>
+            Find a pooled connector.  Handle shared/non-shared here.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.ReleaseConnector(Npgsql.NpgsqlConnection,Npgsql.NpgsqlConnector)">
+            <summary>
+            Releases a connector, possibly back to the pool for future use.
+            </summary>
+            <remarks>
+            Pooled connectors will be put back into the pool if there is room.
+            Shared connectors should just have their use count decremented
+            since they always stay in the shared pool.
+            </remarks>
+            <param name="Connector">The connector to release.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.ReleasePooledConnector(Npgsql.NpgsqlConnection,Npgsql.NpgsqlConnector)">
+            <summary>
+            Release a pooled connector.  Handle locking here.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.ReleasePooledConnectorInternal(Npgsql.NpgsqlConnection,Npgsql.NpgsqlConnector)">
+            <summary>
+            Release a pooled connector.  Handle shared/non-shared here.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.GetNonPooledConnector(Npgsql.NpgsqlConnection)">
+            <summary>
+            Create a connector without any pooling functionality.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.GetPooledConnector(Npgsql.NpgsqlConnection)">
+            <summary>
+            Find an available pooled connector in the non-shared pool, or create
+            a new one if none found.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.FixPoolCountBecauseOfConnectionDisposeFalse(Npgsql.NpgsqlConnection)">
+            <summary>
+            This method is only called when NpgsqlConnection.Dispose(false) is called which means a
+            finalization. This also means, an NpgsqlConnection was leak. We clear pool count so that
+            client doesn't end running out of connections from pool. When the connection is finalized, its underlying
+            socket is closed.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.UngetNonPooledConnector(Npgsql.NpgsqlConnection,Npgsql.NpgsqlConnector)">
+            <summary>
+            Close the connector.
+            </summary>
+            <param name="Connection"></param>
+            <param name="Connector">Connector to release</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlConnectorPool.UngetPooledConnector(Npgsql.NpgsqlConnection,Npgsql.NpgsqlConnector)">
+            <summary>
+            Put a pooled connector into the pool queue.
+            </summary>
+            <param name="Connector">Connector to pool</param>
+        </member>
+        <member name="T:Npgsql.NpgsqlConnectorPool.ConnectorQueue">
+            <summary>
+            A queue with an extra Int32 for keeping track of busy connections.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlConnectorPool.ConnectorQueue.Available">
+            <summary>
+            Connections available to the end user
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlConnectorPool.ConnectorQueue.Busy">
+            <summary>
+            Connections currently in use
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyFormat">
+            <summary>
+            Represents information about COPY operation data transfer format as returned by server.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyFormat.#ctor(System.Byte,System.Int16[])">
+            <summary>
+            Only created when a CopyInResponse or CopyOutResponse is received by NpgsqlState.ProcessBackendResponses()
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyFormat.FieldIsBinary(System.Int32)">
+            <summary>
+            Returns true if this operation is currently active and field at given location is in binary format.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyFormat.IsBinary">
+            <summary>
+            Returns true if this operation is currently active and in binary format.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyFormat.FieldCount">
+            <summary>
+            Returns number of fields if this operation is currently active, otherwise -1
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyIn">
+            <summary>
+            Represents a PostgreSQL COPY FROM STDIN operation with a corresponding SQL statement
+            to execute against a PostgreSQL database
+            and an associated stream used to read data from (if provided by user)
+            or for writing it (when generated by driver).
+            Eg. new NpgsqlCopyIn("COPY mytable FROM STDIN", connection, streamToRead).Start();
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.#ctor(System.String,Npgsql.NpgsqlConnection)">
+            <summary>
+            Creates NpgsqlCommand to run given query upon Start(). Data for the requested COPY IN operation can then be written to CopyData stream followed by a call to End() or Cancel().
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.#ctor(Npgsql.NpgsqlCommand,Npgsql.NpgsqlConnection)">
+            <summary>
+            Given command is run upon Start(). Data for the requested COPY IN operation can then be written to CopyData stream followed by a call to End() or Cancel().
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.#ctor(Npgsql.NpgsqlCommand,Npgsql.NpgsqlConnection,System.IO.Stream)">
+            <summary>
+            Given command is executed upon Start() and all data from fromStream is passed to it as copy data.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.FieldIsBinary(System.Int32)">
+            <summary>
+            Returns true if this operation is currently active and field at given location is in binary format.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.Start">
+            <summary>
+            Command specified upon creation is executed as a non-query.
+            If CopyStream is set upon creation, it will be flushed to server as copy data, and operation will be finished immediately.
+            Otherwise the CopyStream member can be used for writing copy data to server and operation finished with a call to End() or Cancel().
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.End">
+            <summary>
+            Called after writing all data to CopyStream to successfully complete this copy operation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyIn.Cancel(System.String)">
+            <summary>
+            Withdraws an already started copy operation. The operation will fail with given error message.
+            Will do nothing if current operation is not active.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyIn.IsActive">
+            <summary>
+            Returns true if the connection is currently reserved for this operation.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyIn.CopyStream">
+            <summary>
+            The stream provided by user or generated upon Start().
+            User may provide a stream to constructor; it is used to pass to server all data read from it.
+            Otherwise, call to Start() sets this to a writable NpgsqlCopyInStream that passes all data written to it to server.
+            In latter case this is only available while the copy operation is active and null otherwise.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyIn.IsBinary">
+            <summary>
+            Returns true if this operation is currently active and in binary format.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyIn.FieldCount">
+            <summary>
+            Returns number of fields expected on each input row if this operation is currently active, otherwise -1
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyIn.NpgsqlCommand">
+            <summary>
+            The Command used to execute this copy operation.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyIn.CopyBufferSize">
+            <summary>
+            Set before a COPY IN query to define size of internal buffer for reading from given CopyStream.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyInState">
+            <summary>
+            Represents an ongoing COPY FROM STDIN operation.
+            Provides methods to push data to server and end or cancel the operation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInState.StartCopy(Npgsql.NpgsqlConnector,Npgsql.NpgsqlCopyFormat)">
+            <summary>
+            Called from NpgsqlState.ProcessBackendResponses upon CopyInResponse.
+            If CopyStream is already set, it is used to read data to push to server, after which the copy is completed.
+            Otherwise CopyStream is set to a writable NpgsqlCopyInStream that calls SendCopyData each time it is written to.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInState.SendCopyData(Npgsql.NpgsqlConnector,System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Sends given packet to server as a CopyData message.
+            Does not check for notifications! Use another thread for that.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInState.SendCopyDone(Npgsql.NpgsqlConnector)">
+            <summary>
+            Sends CopyDone message to server. Handles responses, ie. may throw an exception.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInState.SendCopyFail(Npgsql.NpgsqlConnector,System.String)">
+            <summary>
+            Sends CopyFail message to server. Handles responses, ie. should always throw an exception:
+            in CopyIn state the server responds to CopyFail with an error response;
+            outside of a CopyIn state the server responds to CopyFail with an error response;
+            without network connection or whatever, there's going to eventually be a failure, timeout or user intervention.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInState.CopyFormat">
+            <summary>
+            Copy format information returned from server.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyInStream">
+            <summary>
+            Stream for writing data to a table on a PostgreSQL version 7.4 or newer database during an active COPY FROM STDIN operation.
+            <b>Passes data exactly as is and when given</b>, so see to it that you use server encoding, correct format and reasonably sized writes!
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.#ctor(Npgsql.NpgsqlConnector)">
+            <summary>
+            Created only by NpgsqlCopyInState.StartCopy()
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.Close">
+            <summary>
+            Successfully completes copying data to server. Returns after operation is finished.
+            Does nothing if this stream is not the active copy operation writer.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.Cancel(System.String)">
+            <summary>
+            Withdraws an already started copy operation. The operation will fail with given error message.
+            Does nothing if this stream is not the active copy operation writer.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.Write(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Writes given bytes to server.
+            Fails if this stream is not the active copy operation writer.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.Flush">
+            <summary>
+            Flushes stream contents to server.
+            Fails if this stream is not the active copy operation writer.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.Read(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Not readable
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.Seek(System.Int64,System.IO.SeekOrigin)">
+            <summary>
+            Not seekable
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyInStream.SetLength(System.Int64)">
+            <summary>
+            Not supported
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInStream.IsActive">
+            <summary>
+            True while this stream can be used to write copy data to server
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInStream.CanRead">
+            <summary>
+            False
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInStream.CanWrite">
+            <summary>
+            True
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInStream.CanSeek">
+            <summary>
+            False
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInStream.Length">
+            <summary>
+            Number of bytes written so far
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyInStream.Position">
+            <summary>
+            Number of bytes written so far; not settable
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyOut">
+            <summary>
+            Represents a PostgreSQL COPY TO STDOUT operation with a corresponding SQL statement
+            to execute against a PostgreSQL database
+            and an associated stream used to write results to (if provided by user)
+            or for reading the results (when generated by driver).
+            Eg. new NpgsqlCopyOut("COPY (SELECT * FROM mytable) TO STDOUT", connection, streamToWrite).Start();
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOut.#ctor(System.String,Npgsql.NpgsqlConnection)">
+            <summary>
+            Creates NpgsqlCommand to run given query upon Start(), after which CopyStream provides data from database as requested in the query.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOut.#ctor(Npgsql.NpgsqlCommand,Npgsql.NpgsqlConnection)">
+            <summary>
+            Given command is run upon Start(), after which CopyStream provides data from database as requested in the query.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOut.#ctor(Npgsql.NpgsqlCommand,Npgsql.NpgsqlConnection,System.IO.Stream)">
+            <summary>
+            Given command is executed upon Start() and all requested copy data is written to toStream immediately.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOut.FieldIsBinary(System.Int32)">
+            <summary>
+            Returns true if this operation is currently active and field at given location is in binary format.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOut.Start">
+            <summary>
+            Command specified upon creation is executed as a non-query.
+            If CopyStream is set upon creation, all copy data from server will be written to it, and operation will be finished immediately.
+            Otherwise the CopyStream member can be used for reading copy data from server until no more data is available.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOut.End">
+            <summary>
+            Flush generated CopyStream at once. Effectively reads and discard all the rest of copy data from server.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOut.IsActive">
+            <summary>
+            Returns true if the connection is currently reserved for this operation.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOut.CopyStream">
+            <summary>
+            The stream provided by user or generated upon Start()
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOut.NpgsqlCommand">
+            <summary>
+            The Command used to execute this copy operation.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOut.IsBinary">
+            <summary>
+            Returns true if this operation is currently active and in binary format.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOut.FieldCount">
+            <summary>
+            Returns number of fields if this operation is currently active, otherwise -1
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOut.Read">
+            <summary>
+            Faster alternative to using the generated CopyStream.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyOutState">
+            <summary>
+            Represents an ongoing COPY TO STDOUT operation.
+            Provides methods to read data from server or end the operation.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutState.StartCopy(Npgsql.NpgsqlConnector,Npgsql.NpgsqlCopyFormat)">
+            <summary>
+            Called from NpgsqlState.ProcessBackendResponses upon CopyOutResponse.
+            If CopyStream is already set, it is used to write data received from server, after which the copy ends.
+            Otherwise CopyStream is set to a readable NpgsqlCopyOutStream that receives data from server.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutState.GetCopyData(Npgsql.NpgsqlConnector)">
+            <summary>
+            Called from NpgsqlOutStream.Read to read copy data from server.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutState.CopyFormat">
+            <summary>
+            Copy format information returned from server.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopyOutStream">
+            <summary>
+            Stream for reading data from a table or select on a PostgreSQL version 7.4 or newer database during an active COPY TO STDOUT operation.
+            <b>Passes data exactly as provided by the server.</b>
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.#ctor(Npgsql.NpgsqlConnector)">
+            <summary>
+            Created only by NpgsqlCopyOutState.StartCopy()
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.Close">
+            <summary>
+            Discards copy data as long as server pushes it. Returns after operation is finished.
+            Does nothing if this stream is not the active copy operation reader.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.Write(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Not writable.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.Flush">
+            <summary>
+            Not flushable.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.Read(System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Copies data read from server to given byte buffer.
+            Since server returns data row by row, length will differ each time, but it is only zero once the operation ends.
+            Can be mixed with calls to the more efficient NpgsqlCopyOutStream.Read() : byte[] though that would not make much sense.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.Seek(System.Int64,System.IO.SeekOrigin)">
+            <summary>
+            Not seekable
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.SetLength(System.Int64)">
+            <summary>
+            Not supported
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlCopyOutStream.Read">
+            <summary>
+            Returns a whole row of data from server without extra work.
+            If standard Stream.Read(...) has been called before, it's internal buffers remains are returned.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutStream.IsActive">
+            <summary>
+            True while this stream can be used to read copy data from server
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutStream.CanRead">
+            <summary>
+            True
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutStream.CanWrite">
+            <summary>
+            False
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutStream.CanSeek">
+            <summary>
+            False
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutStream.Length">
+            <summary>
+            Number of bytes read so far
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlCopyOutStream.Position">
+            <summary>
+            Number of bytes read so far; can not be set.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlCopySerializer">
+            <summary>
+            Writes given objects into a stream for PostgreSQL COPY in default copy format (not CSV or BINARY).
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlRowUpdatedEventHandler">
+            <summary>
+            Represents the method that handles the <see cref="E:Npgsql.NpgsqlDataAdapter.RowUpdated">RowUpdated</see> events.
+            </summary>
+            <param name="sender">The source of the event.</param>
+            <param name="e">A <see cref="T:NpgsqlRowUpdatedEventArgs">NpgsqlRowUpdatedEventArgs</see> that contains the event data.</param>
+        </member>
+        <member name="T:Npgsql.NpgsqlRowUpdatingEventHandler">
+            <summary>
+            Represents the method that handles the <see cref="E:Npgsql.NpgsqlDataAdapter.RowUpdating">RowUpdating</see> events.
+            </summary>
+            <param name="sender">The source of the event.</param>
+            <param name="e">A <see cref="T:NpgsqlRowUpdatingEventArgs">NpgsqlRowUpdatingEventArgs</see> that contains the event data.</param>
+        </member>
+        <member name="T:Npgsql.NpgsqlDataAdapter">
+            <summary>
+            This class represents an adapter from many commands: select, update, insert and delete to fill <see cref="T:System.Data.DataSet">Datasets.</see>
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlDataReader">
+            <summary>
+            Provides a means of reading a forward-only stream of rows from a PostgreSQL backend.  This class cannot be inherited.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetDataTypeName(System.Int32)">
+            <summary>
+            Return the data type name of the column at index <param name="Index"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetFieldType(System.Int32)">
+            <summary>
+            Return the data type of the column at index <param name="Index"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetProviderSpecificFieldType(System.Int32)">
+            <summary>
+            Return the Npgsql specific data type of the column at requested ordinal.
+            </summary>
+            <param name="ordinal">column position</param>
+            <returns>Appropriate Npgsql type for column.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetName(System.Int32)">
+            <summary>
+            Return the column name of the column at index <param name="Index"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetDataTypeOID(System.Int32)">
+            <summary>
+            Return the data type OID of the column at index <param name="Index"></param>.
+            </summary>
+            FIXME: Why this method returns String?
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetOrdinal(System.String)">
+            <summary>
+            Return the column name of the column named <param name="Name"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetFieldDbType(System.Int32)">
+            <summary>
+            Return the data DbType of the column at index <param name="Index"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetFieldNpgsqlDbType(System.Int32)">
+            <summary>
+            Return the data NpgsqlDbType of the column at index <param name="Index"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetInterval(System.Int32)">
+            <summary>
+            Get the value of a column as a <see cref="T:NpgsqlTypes.NpgsqlInterval"/>.
+            <remarks>If the differences between <see cref="T:NpgsqlTypes.NpgsqlInterval"/> and <see cref="!:System.Timespan"/>
+            in handling of days and months is not important to your application, use <see cref="!:GetTimeSpan()"/>
+            instead.</remarks>
+            </summary>
+            <param name="i">Index of the field to find.</param>
+            <returns><see cref="T:NpgsqlTypes.NpgsqlInterval"/> value of the field.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetGuid(System.Int32)">
+            <summary>
+            Gets the value of a column converted to a Guid.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetInt16(System.Int32)">
+            <summary>
+            Gets the value of a column as Int16.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetInt32(System.Int32)">
+            <summary>
+            Gets the value of a column as Int32.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetInt64(System.Int32)">
+            <summary>
+            Gets the value of a column as Int64.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetFloat(System.Int32)">
+            <summary>
+            Gets the value of a column as Single.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetDouble(System.Int32)">
+            <summary>
+            Gets the value of a column as Double.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetString(System.Int32)">
+            <summary>
+            Gets the value of a column as String.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetDecimal(System.Int32)">
+            <summary>
+            Gets the value of a column as Decimal.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetTimeSpan(System.Int32)">
+            <summary>
+            Gets the value of a column as TimeSpan.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetValues(System.Object[])">
+            <summary>
+            Copy values from each column in the current row into <param name="Values"></param>.
+            </summary>
+            <returns>The number of column values copied.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetProviderSpecificValues(System.Object[])">
+            <summary>
+            Copy values from each column in the current row into <param name="Values"></param>.
+            </summary>
+            <param name="values">An array appropriately sized to store values from all columns.</param>
+            <returns>The number of column values copied.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetBoolean(System.Int32)">
+            <summary>
+            Gets the value of a column as Boolean.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetByte(System.Int32)">
+            <summary>
+            Gets the value of a column as Byte.  Not implemented.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetChar(System.Int32)">
+            <summary>
+            Gets the value of a column as Char.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetDateTime(System.Int32)">
+            <summary>
+            Gets the value of a column as DateTime.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetSchemaTable">
+            <summary>
+            Returns a System.Data.DataTable that describes the column metadata of the DataReader.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlDataReader.GetTableNameFromQuery">
+            <summary>
+             This methods parses the command text and tries to get the tablename
+             from it.
+            </summary>
+        </member>
+        <member name="E:Npgsql.NpgsqlDataReader.ReaderClosed">
+            <summary>
+            Is raised whenever Close() is called.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlDataReader.FieldCount">
+            <summary>
+            Gets the number of columns in the current row.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlDataReader.Item(System.Int32)">
+            <summary>
+            Gets the value of a column in its native format.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlDataReader.Item(System.String)">
+            <summary>
+            Gets the value of a column in its native format.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlDataReader.Depth">
+            <summary>
+            Gets a value indicating the depth of nesting for the current row.  Always returns zero.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlDataReader.IsClosed">
+            <summary>
+            Gets a value indicating whether the data reader is closed.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlDataReader.KeyLookup.primaryKey">
+            <summary>
+            Contains the column names as the keys
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlDataReader.KeyLookup.uniqueColumns">
+            <summary>
+            Contains all unique columns
+            </summary>
+        </member>
+        <member name="T:Npgsql.ForwardsOnlyDataReader">
+            <summary>
+            This is the primary implementation of NpgsqlDataReader. It is the one used in normal cases (where the 
+            preload-reader option is not set in the connection string to resolve some potential backwards-compatibility
+            issues), the only implementation used internally, and in cases where CachingDataReader is used, it is still
+            used to do the actual "leg-work" of turning a response stream from the server into a datareader-style
+            object - with CachingDataReader then filling it's cache from here.
+            </summary>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.GetNextResponseObject">
+            <summary>
+            Iterate through the objects returned through from the server.
+            If it's a CompletedResponse the rowsaffected count is updated appropriately,
+            and we iterate again, otherwise we return it (perhaps updating our cache of pending
+            rows if appropriate).
+            </summary>
+            <returns>The next <see cref="T:Npgsql.IServerResponseObject"/> we will deal with.</returns>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.GetNextRowDescription">
+            <summary>
+            Advances the data reader to the next result, when multiple result sets were returned by the PostgreSQL backend.
+            </summary>
+            <returns>True if the reader was advanced, otherwise false.</returns>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.Dispose(System.Boolean)">
+            <summary>
+            Releases the resources used by the <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.Close">
+            <summary>
+            Closes the data reader object.
+            </summary>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.NextResult">
+            <summary>
+            Advances the data reader to the next result, when multiple result sets were returned by the PostgreSQL backend.
+            </summary>
+            <returns>True if the reader was advanced, otherwise false.</returns>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.Read">
+            <summary>
+            Advances the data reader to the next row.
+            </summary>
+            <returns>True if the reader was advanced, otherwise false.</returns>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.GetValue(System.Int32)">
+            <summary>
+            Return the value of the column at index <param name="Index"></param>.
+            </summary>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.GetBytes(System.Int32,System.Int64,System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Gets raw data from a column.
+            </summary>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.GetChars(System.Int32,System.Int64,System.Char[],System.Int32,System.Int32)">
+            <summary>
+            Gets raw data from a column.
+            </summary>
+        </member>
+        <member name="M:Npgsql.ForwardsOnlyDataReader.IsDBNull(System.Int32)">
+            <summary>
+            Report whether the value in a column is DBNull.
+            </summary>
+        </member>
+        <member name="P:Npgsql.ForwardsOnlyDataReader.RecordsAffected">
+            <summary>
+            Gets the number of rows changed, inserted, or deleted by execution of the SQL statement.
+            </summary>
+        </member>
+        <member name="P:Npgsql.ForwardsOnlyDataReader.HasRows">
+            <summary>
+            Indicates if NpgsqlDatareader has rows to be read.
+            </summary>
+        </member>
+        <member name="T:Npgsql.CachingDataReader">
+            <summary>
+            <para>Provides an implementation of NpgsqlDataReader in which all data is pre-loaded into memory.
+            This operates by first creating a ForwardsOnlyDataReader as usual, and then loading all of it's
+            Rows into memory. There is a general principle that when there is a trade-off between a class design that
+            is more efficient and/or scalable on the one hand and one that is less efficient but has more functionality
+            (in this case the internal-only functionality of caching results) that one can build the less efficent class
+            from the most efficient without significant extra loss in efficiency, but not the other way around. The relationship
+            between ForwardsOnlyDataReader and CachingDataReader is an example of this).</para>
+            <para>Since the interface presented to the user is still forwards-only, queues are used to
+            store this information, so that dequeueing as we go we give the garbage collector the best opportunity
+            possible to reclaim any memory that is no longer in use.</para>
+            <para>ForwardsOnlyDataReader being used to actually
+            obtain the information from the server means that the "leg-work" is still only done (and need only be
+            maintained) in one place.</para>
+            <para>This class exists to allow for certain potential backwards-compatibility issues to be resolved
+            with little effort on the part of affected users. It is considerably less efficient than ForwardsOnlyDataReader
+            and hence never used internally.</para>
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlDescribe">
+             <summary>
+             This class represents the Parse message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlNoticeEventArgs">
+            <summary>
+            EventArgs class to send Notice parameters, which are just NpgsqlError's in a lighter context.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlNoticeEventArgs.Notice">
+            <summary>
+            Notice information.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlError">
+            <summary>
+            This class represents the ErrorResponse and NoticeResponse
+            message sent from PostgreSQL server.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlError.ToString">
+            <summary>
+            Return a string representation of this error object.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Severity">
+            <summary>
+            Severity code.  All versions.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Code">
+            <summary>
+            Error code.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Message">
+            <summary>
+            Terse error message.  All versions.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Detail">
+            <summary>
+            Detailed error message.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Hint">
+            <summary>
+            Suggestion to help resolve the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Position">
+            <summary>
+            Position (one based) within the query string where the error was encounterd.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.InternalPosition">
+            <summary>
+            Position (one based) within the query string where the error was encounterd.  This position refers to an internal command executed for example inside a PL/pgSQL function. PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.InternalQuery">
+            <summary>
+            Internal query string where the error was encounterd.  This position refers to an internal command executed for example inside a PL/pgSQL function. PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Where">
+            <summary>
+            Trace back information.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.File">
+            <summary>
+            Source file (in backend) reporting the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Line">
+            <summary>
+            Source file line number (in backend) reporting the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.Routine">
+            <summary>
+            Source routine (in backend) reporting the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.ErrorSql">
+            <summary>
+            String containing the sql sent which produced this error.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlError.BackendProtocolVersion">
+            <summary>
+            Backend protocol version in use.
+            </summary>
+        </member>
+        <member name="T:Npgsql.LogLevel">
+            <summary>
+            The level of verbosity of the NpgsqlEventLog
+            </summary>
+        </member>
+        <member name="F:Npgsql.LogLevel.None">
+            <summary>
+            Don't log at all
+            </summary>
+        </member>
+        <member name="F:Npgsql.LogLevel.Normal">
+            <summary>
+            Only log the most common issues
+            </summary>
+        </member>
+        <member name="F:Npgsql.LogLevel.Debug">
+            <summary>
+            Log everything
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlEventLog">
+            <summary>
+            This class handles all the Npgsql event and debug logging
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMsg(System.String,Npgsql.LogLevel)">
+            <summary>
+            Writes a string to the Npgsql event log if msglevel is bigger then <see cref="P:Npgsql.NpgsqlEventLog.Level">NpgsqlEventLog.Level</see>
+            </summary>
+            <remarks>
+            This method is obsolete and should no longer be used.
+            It is likely to be removed in future versions of Npgsql
+            </remarks>
+            <param name="message">The message to write to the event log</param>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMsg(System.Resources.ResourceManager,System.String,Npgsql.LogLevel,System.Object[])">
+            <summary>
+            Writes a string to the Npgsql event log if msglevel is bigger then <see cref="P:Npgsql.NpgsqlEventLog.Level">NpgsqlEventLog.Level</see>
+            </summary>
+            <param name="resman">The <see cref="T:System.Resources.ResourceManager">ResourceManager</see> to get the localized resources</param>
+            <param name="ResourceString">The name of the resource that should be fetched by the <see cref="T:System.Resources.ResourceManager">ResourceManager</see></param>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="Parameters">The additional parameters that shall be included into the log-message (must be compatible with the string in the resource):</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogIndexerGet(Npgsql.LogLevel,System.String,System.Object)">
+            <summary>
+            Writes the default log-message for the action of calling the Get-part of an Indexer to the log file.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Indexer</param>
+            <param name="IndexerParam">The parameter given to the Indexer</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogIndexerSet(Npgsql.LogLevel,System.String,System.Object,System.Object)">
+            <summary>
+            Writes the default log-message for the action of calling the Set-part of an Indexer to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Indexer</param>
+            <param name="IndexerParam">The parameter given to the Indexer</param>
+            <param name="value">The value the Indexer is set to</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogPropertyGet(Npgsql.LogLevel,System.String,System.String)">
+            <summary>
+            Writes the default log-message for the action of calling the Get-part of a Property to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Property</param>
+            <param name="PropertyName">The name of the Property</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogPropertySet(Npgsql.LogLevel,System.String,System.String,System.Object)">
+            <summary>
+            Writes the default log-message for the action of calling the Set-part of a Property to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Property</param>
+            <param name="PropertyName">The name of the Property</param>
+            <param name="value">The value the Property is set to</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMethodEnter(Npgsql.LogLevel,System.String,System.String)">
+            <summary>
+            Writes the default log-message for the action of calling a Method without Arguments to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Method</param>
+            <param name="MethodName">The name of the Method</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMethodEnter(Npgsql.LogLevel,System.String,System.String,System.Object)">
+            <summary>
+            Writes the default log-message for the action of calling a Method with one Argument to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Method</param>
+            <param name="MethodName">The name of the Method</param>
+            <param name="MethodParameter">The value of the Argument of the Method</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMethodEnter(Npgsql.LogLevel,System.String,System.String,System.Object,System.Object)">
+            <summary>
+            Writes the default log-message for the action of calling a Method with two Arguments to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Method</param>
+            <param name="MethodName">The name of the Method</param>
+            <param name="MethodParameter1">The value of the first Argument of the Method</param>
+            <param name="MethodParameter2">The value of the second Argument of the Method</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMethodEnter(Npgsql.LogLevel,System.String,System.String,System.Object,System.Object,System.Object)">
+            <summary>
+            Writes the default log-message for the action of calling a Method with three Arguments to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Method</param>
+            <param name="MethodName">The name of the Method</param>
+            <param name="MethodParameter1">The value of the first Argument of the Method</param>
+            <param name="MethodParameter2">The value of the second Argument of the Method</param>
+            <param name="MethodParameter3">The value of the third Argument of the Method</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlEventLog.LogMethodEnter(Npgsql.LogLevel,System.String,System.String,System.Object[])">
+            <summary>
+            Writes the default log-message for the action of calling a Method with more than three Arguments to the logfile.
+            </summary>
+            <param name="msglevel">The minimum <see cref="T:Npgsql.LogLevel">LogLevel</see> for which this message should be logged.</param>
+            <param name="ClassName">The name of the class that contains the Method</param>
+            <param name="MethodName">The name of the Method</param>
+            <param name="MethodParameters">A <see cref="T:System.Object">Object</see>-Array with zero or more Ojects that are Arguments of the Method.</param>
+        </member>
+        <member name="P:Npgsql.NpgsqlEventLog.Level">
+            <summary>
+             Sets/Returns the level of information to log to the logfile.
+             </summary>
+             <value>The current <see cref="T:Npgsql.LogLevel">LogLevel</see></value>
+        </member>
+        <member name="P:Npgsql.NpgsqlEventLog.LogName">
+            <summary>
+             Sets/Returns the filename to use for logging.
+             </summary>
+             <value>The filename of the current Log file.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlEventLog.EchoMessages">
+            <summary>
+             Sets/Returns whether Log messages should be echoed to the console
+             </summary>
+             <value><b>true</b> if Log messages are echoed to the console, otherwise <b>false</b></value>
+        </member>
+        <member name="T:Npgsql.NpgsqlException">
+            <summary>
+            The exception that is thrown when the PostgreSQL backend reports errors.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlException.#ctor(System.Collections.IList)">
+            <summary>
+            Construct a backend error exception based on a list of one or more
+            backend errors.  The basic Exception.Message will be built from the
+            first (usually the only) error in the list.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlException.ToString">
+            <summary>
+            Format a .NET style exception string.
+            Include all errors in the list, including any hints.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlException.AppendString(System.IO.StringWriter,System.String,System.String)">
+            <summary>
+            Append a line to the given Stream, first checking for zero-length.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Item(System.Int32)">
+            <summary>
+            Provide access to the entire list of errors provided by the PostgreSQL backend.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Severity">
+            <summary>
+            Severity code.  All versions.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Code">
+            <summary>
+            Error code.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.BaseMessage">
+            <summary>
+            Basic error message.  All versions.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Detail">
+            <summary>
+            Detailed error message.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Hint">
+            <summary>
+            Suggestion to help resolve the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Position">
+            <summary>
+            Position (one based) within the query string where the error was encounterd.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Where">
+            <summary>
+            Trace back information.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.File">
+            <summary>
+            Source file (in backend) reporting the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Line">
+            <summary>
+            Source file line number (in backend) reporting the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Routine">
+            <summary>
+            Source routine (in backend) reporting the error.  PostgreSQL 7.4 and up.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.ErrorSql">
+            <summary>
+            String containing the sql sent which produced this error.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlException.Errors">
+            <summary>
+            Returns the entire list of errors provided by the PostgreSQL backend.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlExecute">
+             <summary>
+             This class represents the Parse message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlFactory">
+            <summary>
+            A factory to create instances of various Npgsql objects.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlFactory.CreateCommand">
+            <summary>
+            Creates an NpgsqlCommand object.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlFlush">
+             <summary>
+             This class represents the Parse message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlMediator">
+            <summary>
+             This class is responsible for serving as bridge between the backend
+             protocol handling and the core classes. It is used as the mediator for
+             exchanging data generated/sent from/to backend.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlNotificationEventArgs">
+            <summary>
+            EventArgs class to send Notification parameters.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlNotificationEventArgs.PID">
+            <summary>
+            Process ID of the PostgreSQL backend that sent this notification.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlNotificationEventArgs.Condition">
+            <summary>
+            Condition that triggered that notification.
+            </summary>
+        </member>
+        <member name="F:Npgsql.NpgsqlNotificationEventArgs.AdditionalInformation">
+            <summary>
+            Additional Information From Notifiying Process (for future use, currently postgres always sets this to an empty string)
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlParameter">
+            <summary>
+             This class represents a parameter to a command that will be sent to server
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.#ctor">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> class.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.#ctor(System.String,System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+            class with the parameter m_Name and a value of the new <b>NpgsqlParameter</b>.
+            </summary>
+            <param m_Name="parameterName">The m_Name of the parameter to map.</param>
+            <param m_Name="value">An <see cref="T:System.Object">Object</see> that is the value of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>.</param>
+            <remarks>
+            <p>When you specify an <see cref="T:System.Object">Object</see>
+            in the value parameter, the <see cref="T:System.Data.DbType">DbType</see> is
+            inferred from the .NET Framework type of the <b>Object</b>.</p>
+            <p>When using this constructor, you must be aware of a possible misuse of the constructor which takes a DbType parameter.
+            This happens when calling this constructor passing an int 0 and the compiler thinks you are passing a value of DbType.
+            Use <code> Convert.ToInt32(value) </code> for example to have compiler calling the correct constructor.</p>
+            </remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.#ctor(System.String,NpgsqlTypes.NpgsqlDbType)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+            class with the parameter m_Name and the data type.
+            </summary>
+            <param m_Name="parameterName">The m_Name of the parameter to map.</param>
+            <param m_Name="parameterType">One of the <see cref="T:System.Data.DbType">DbType</see> values.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.#ctor(System.String,NpgsqlTypes.NpgsqlDbType,System.Int32)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+            class with the parameter m_Name, the <see cref="T:System.Data.DbType">DbType</see>, and the size.
+            </summary>
+            <param m_Name="parameterName">The m_Name of the parameter to map.</param>
+            <param m_Name="parameterType">One of the <see cref="T:System.Data.DbType">DbType</see> values.</param>
+            <param m_Name="size">The length of the parameter.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.#ctor(System.String,NpgsqlTypes.NpgsqlDbType,System.Int32,System.String)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+            class with the parameter m_Name, the <see cref="T:System.Data.DbType">DbType</see>, the size,
+            and the source column m_Name.
+            </summary>
+            <param m_Name="parameterName">The m_Name of the parameter to map.</param>
+            <param m_Name="parameterType">One of the <see cref="T:System.Data.DbType">DbType</see> values.</param>
+            <param m_Name="size">The length of the parameter.</param>
+            <param m_Name="sourceColumn">The m_Name of the source column.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.#ctor(System.String,NpgsqlTypes.NpgsqlDbType,System.Int32,System.String,System.Data.ParameterDirection,System.Boolean,System.Byte,System.Byte,System.Data.DataRowVersion,System.Object)">
+            <summary>
+            Initializes a new instance of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+            class with the parameter m_Name, the <see cref="T:System.Data.DbType">DbType</see>, the size,
+            the source column m_Name, a <see cref="T:System.Data.ParameterDirection">ParameterDirection</see>,
+            the precision of the parameter, the scale of the parameter, a
+            <see cref="T:System.Data.DataRowVersion">DataRowVersion</see> to use, and the
+            value of the parameter.
+            </summary>
+            <param m_Name="parameterName">The m_Name of the parameter to map.</param>
+            <param m_Name="parameterType">One of the <see cref="T:System.Data.DbType">DbType</see> values.</param>
+            <param m_Name="size">The length of the parameter.</param>
+            <param m_Name="sourceColumn">The m_Name of the source column.</param>
+            <param m_Name="direction">One of the <see cref="T:System.Data.ParameterDirection">ParameterDirection</see> values.</param>
+            <param m_Name="isNullable"><b>true</b> if the value of the field can be null, otherwise <b>false</b>.</param>
+            <param m_Name="precision">The total number of digits to the left and right of the decimal point to which
+            <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see> is resolved.</param>
+            <param m_Name="scale">The total number of decimal places to which
+            <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see> is resolved.</param>
+            <param m_Name="sourceVersion">One of the <see cref="T:System.Data.DataRowVersion">DataRowVersion</see> values.</param>
+            <param m_Name="value">An <see cref="T:System.Object">Object</see> that is the value
+            of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameter.Clone">
+            <summary>
+            Creates a new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> that
+            is a copy of the current instance.
+            </summary>
+            <returns>A new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> that is a copy of this instance.</returns>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.Precision">
+            <summary>
+            Gets or sets the maximum number of digits used to represent the
+            <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see> property.
+            </summary>
+            <value>The maximum number of digits used to represent the
+            <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see> property.
+            The default value is 0, which indicates that the data provider
+            sets the precision for <b>Value</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.Scale">
+            <summary>
+            Gets or sets the number of decimal places to which
+            <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see> is resolved.
+            </summary>
+            <value>The number of decimal places to which
+            <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see> is resolved. The default is 0.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.Size">
+            <summary>
+            Gets or sets the maximum size, in bytes, of the data within the column.
+            </summary>
+            <value>The maximum size, in bytes, of the data within the column.
+            The default value is inferred from the parameter value.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.DbType">
+            <summary>
+            Gets or sets the <see cref="T:System.Data.DbType">DbType</see> of the parameter.
+            </summary>
+            <value>One of the <see cref="T:System.Data.DbType">DbType</see> values. The default is <b>String</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.NpgsqlDbType">
+            <summary>
+            Gets or sets the <see cref="T:System.Data.DbType">DbType</see> of the parameter.
+            </summary>
+            <value>One of the <see cref="T:System.Data.DbType">DbType</see> values. The default is <b>String</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.Direction">
+            <summary>
+            Gets or sets a value indicating whether the parameter is input-only,
+            output-only, bidirectional, or a stored procedure return value parameter.
+            </summary>
+            <value>One of the <see cref="T:System.Data.ParameterDirection">ParameterDirection</see>
+            values. The default is <b>Input</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.IsNullable">
+            <summary>
+            Gets or sets a value indicating whether the parameter accepts null values.
+            </summary>
+            <value><b>true</b> if null values are accepted; otherwise, <b>false</b>. The default is <b>false</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.ParameterName">
+            <summary>
+            Gets or sets the m_Name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>.
+            </summary>
+            <value>The m_Name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>.
+            The default is an empty string.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.CleanName">
+            <summary>
+            The m_Name scrubbed of any optional marker
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.SourceColumn">
+            <summary>
+            Gets or sets the m_Name of the source column that is mapped to the
+            <see cref="T:System.Data.DataSet">DataSet</see> and used for loading or
+            returning the <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see>.
+            </summary>
+            <value>The m_Name of the source column that is mapped to the
+            <see cref="T:System.Data.DataSet">DataSet</see>. The default is an empty string.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.SourceVersion">
+            <summary>
+            Gets or sets the <see cref="T:System.Data.DataRowVersion">DataRowVersion</see>
+            to use when loading <see cref="P:Npgsql.NpgsqlParameter.Value">Value</see>.
+            </summary>
+            <value>One of the <see cref="T:System.Data.DataRowVersion">DataRowVersion</see> values.
+            The default is <b>Current</b>.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.Value">
+            <summary>
+            Gets or sets the value of the parameter.
+            </summary>
+            <value>An <see cref="T:System.Object">Object</see> that is the value of the parameter.
+            The default value is null.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameter.NpgsqlValue">
+            <summary>
+            Gets or sets the value of the parameter.
+            </summary>
+            <value>An <see cref="T:System.Object">Object</see> that is the value of the parameter.
+            The default value is null.</value>
+        </member>
+        <member name="T:Npgsql.NpgsqlParameterCollection">
+            <summary>
+            Represents a collection of parameters relevant to a <see cref="T:Npgsql.NpgsqlCommand">NpgsqlCommand</see>
+            as well as their respective mappings to columns in a <see cref="T:System.Data.DataSet">DataSet</see>.
+            This class cannot be inherited.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.#ctor">
+            <summary>
+            Initializes a new instance of the NpgsqlParameterCollection class.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Add(Npgsql.NpgsqlParameter)">
+            <summary>
+            Adds the specified <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see>.
+            </summary>
+            <param name="value">The <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to add to the collection.</param>
+            <returns>The index of the new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Add(System.String,System.Object)">
+            <summary>
+            Adds a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see> given the specified parameter name and value.
+            </summary>
+            <param name="parameterName">The name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>.</param>
+            <param name="value">The Value of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to add to the collection.</param>
+            <returns>The index of the new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+            <remarks>
+            Use caution when using this overload of the
+            <b>Add</b> method to specify integer parameter values.
+            Because this overload takes a <i>value</i> of type Object,
+            you must convert the integral value to an <b>Object</b>
+            type when the value is zero, as the following C# example demonstrates.
+            <code>parameters.Add(":pname", Convert.ToInt32(0));</code>
+            If you do not perform this conversion, the compiler will assume you
+            are attempting to call the NpgsqlParameterCollection.Add(string, DbType) overload.
+            </remarks>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Add(System.String,NpgsqlTypes.NpgsqlDbType)">
+            <summary>
+            Adds a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see> given the parameter name and the data type.
+            </summary>
+            <param name="parameterName">The name of the parameter.</param>
+            <param name="parameterType">One of the DbType values.</param>
+            <returns>The index of the new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Add(System.String,NpgsqlTypes.NpgsqlDbType,System.Int32)">
+            <summary>
+            Adds a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see> with the parameter name, the data type, and the column length.
+            </summary>
+            <param name="parameterName">The name of the parameter.</param>
+            <param name="parameterType">One of the DbType values.</param>
+            <param name="size">The length of the column.</param>
+            <returns>The index of the new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Add(System.String,NpgsqlTypes.NpgsqlDbType,System.Int32,System.String)">
+            <summary>
+            Adds a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see> with the parameter name, the data type, the column length, and the source column name.
+            </summary>
+            <param name="parameterName">The name of the parameter.</param>
+            <param name="parameterType">One of the DbType values.</param>
+            <param name="size">The length of the column.</param>
+            <param name="sourceColumn">The name of the source column.</param>
+            <returns>The index of the new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.RemoveAt(System.String)">
+            <summary>
+            Removes the specified <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> from the collection using the parameter name.
+            </summary>
+            <param name="parameterName">The name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to retrieve.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Contains(System.String)">
+            <summary>
+            Gets a value indicating whether a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> with the specified parameter name exists in the collection.
+            </summary>
+            <param name="parameterName">The name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to find.</param>
+            <returns><b>true</b> if the collection contains the parameter; otherwise, <b>false</b>.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.IndexOf(System.String)">
+            <summary>
+            Gets the location of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> in the collection with a specific parameter name.
+            </summary>
+            <param name="parameterName">The name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to find.</param>
+            <returns>The zero-based location of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> in the collection.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.RemoveAt(System.Int32)">
+            <summary>
+            Removes the specified <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> from the collection using a specific index.
+            </summary>
+            <param name="index">The zero-based index of the parameter.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Insert(System.Int32,System.Object)">
+            <summary>
+            Inserts a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> into the collection at the specified index.
+            </summary>
+            <param name="index">The zero-based index where the parameter is to be inserted within the collection.</param>
+            <param name="value">The <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to add to the collection.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Remove(System.Object)">
+            <summary>
+            Removes the specified <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> from the collection.
+            </summary>
+            <param name="value">The <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to remove from the collection.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Contains(System.Object)">
+            <summary>
+            Gets a value indicating whether a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> exists in the collection.
+            </summary>
+            <param name="value">The value of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to find.</param>
+            <returns>true if the collection contains the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object; otherwise, false.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.TryGetValue(System.String,Npgsql.NpgsqlParameter@)">
+            <summary>
+            Gets a value indicating whether a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> with the specified parameter name exists in the collection.
+            </summary>
+            <param name="parameterName">The name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to find.</param>
+            <param name="parameter">A reference to the requested parameter is returned in this out param if it is found in the list.  This value is null if the parameter is not found.</param>
+            <returns><b>true</b> if the collection contains the parameter and param will contain the parameter; otherwise, <b>false</b>.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Clear">
+            <summary>
+            Removes all items from the collection.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.IndexOf(System.Object)">
+            <summary>
+            Gets the location of a <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> in the collection.
+            </summary>
+            <param name="value">The value of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to find.</param>
+            <returns>The zero-based index of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object in the collection.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.Add(System.Object)">
+            <summary>
+            Adds the specified <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object to the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see>.
+            </summary>
+            <param name="value">The <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to add to the collection.</param>
+            <returns>The zero-based index of the new <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> object.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.CopyTo(System.Array,System.Int32)">
+            <summary>
+            Copies <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> objects from the <see cref="T:Npgsql.NpgsqlParameterCollection">NpgsqlParameterCollection</see> to the specified array.
+            </summary>
+            <param name="array">An <see cref="T:System.Array">Array</see> to which to copy the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> objects in the collection.</param>
+            <param name="index">The starting index of the array.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.GetEnumerator">
+            <summary>
+            Returns an enumerator that can iterate through the collection.
+            </summary>
+            <returns>An <see cref="T:System.Collections.IEnumerator">IEnumerator</see> that can be used to iterate through the collection.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlParameterCollection.CheckType(System.Object)">
+            <summary>
+            In methods taking an object as argument this method is used to verify
+            that the argument has the type <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+            </summary>
+            <param name="Object">The object to verify</param>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameterCollection.Item(System.String)">
+            <summary>
+            Gets the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> with the specified name.
+            </summary>
+            <param name="parameterName">The name of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to retrieve.</param>
+            <value>The <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> with the specified name, or a null reference if the parameter is not found.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameterCollection.Item(System.Int32)">
+            <summary>
+            Gets the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> at the specified index.
+            </summary>
+            <param name="index">The zero-based index of the <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> to retrieve.</param>
+            <value>The <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> at the specified index.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlParameterCollection.Count">
+            <summary>
+            Gets the number of <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> objects in the collection.
+            </summary>
+            <value>The number of <see cref="T:Npgsql.NpgsqlParameter">NpgsqlParameter</see> objects in the collection.</value>
+        </member>
+        <member name="T:Npgsql.NpgsqlParameterStatus">
+             <summary>
+             This class represents the ParameterStatus message sent from PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlParse">
+             <summary>
+             This class represents the Parse message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlPasswordPacket">
+            <summary>
+            This class represents a PasswordPacket message sent to backend
+            PostgreSQL.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlPromotableSinglePhaseNotification.Prepare">
+            <summary>
+            Used when a connection is closed
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlQuery">
+            <summary>
+            Summary description for NpgsqlQuery
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlRow">
+            <summary>
+            This is the abstract base class for NpgsqlAsciiRow and NpgsqlBinaryRow.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlRowDescription">
+             <summary>
+             This class represents a RowDescription message sent from
+             the PostgreSQL.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlRowDescription.FieldData">
+            <summary>
+            This struct represents the internal data of the RowDescription message.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlSchema">
+            <summary>
+            Provides the underlying mechanism for reading schema information.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.#ctor(Npgsql.NpgsqlConnection)">
+            <summary>
+            Creates an NpgsqlSchema that can read schema information from the database.
+            </summary>
+            <param name="connection">An open database connection for reading metadata.</param>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetMetaDataCollections">
+            <summary>
+            Returns the MetaDataCollections that lists all possible collections.
+            </summary>
+            <returns>The MetaDataCollections</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetRestrictions">
+            <summary>
+            Returns the Restrictions that contains the meaning and position of the values in the restrictions array.
+            </summary>
+            <returns>The Restrictions</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetDatabases(System.String[])">
+            <summary>
+            Returns the Databases that contains a list of all accessable databases.
+            </summary>
+            <param name="restrictions">The restrictions to filter the collection.</param>
+            <returns>The Databases</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetTables(System.String[])">
+            <summary>
+            Returns the Tables that contains table and view names and the database and schema they come from.
+            </summary>
+            <param name="restrictions">The restrictions to filter the collection.</param>
+            <returns>The Tables</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetColumns(System.String[])">
+            <summary>
+            Returns the Columns that contains information about columns in tables. 
+            </summary>
+            <param name="restrictions">The restrictions to filter the collection.</param>
+            <returns>The Columns.</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetViews(System.String[])">
+            <summary>
+            Returns the Views that contains view names and the database and schema they come from.
+            </summary>
+            <param name="restrictions">The restrictions to filter the collection.</param>
+            <returns>The Views</returns>
+        </member>
+        <member name="M:Npgsql.NpgsqlSchema.GetUsers(System.String[])">
+            <summary>
+            Returns the Users containing user names and the sysid of those users.
+            </summary>
+            <param name="restrictions">The restrictions to filter the collection.</param>
+            <returns>The Users.</returns>
+        </member>
+        <member name="T:Npgsql.NpgsqlStartupPacket">
+             <summary>
+             This class represents a StartupPacket message of PostgreSQL
+             protocol.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.CompletedResponse">
+            <summary>
+            Represents a completed response message.
+            </summary>
+        </member>
+        <member name="T:Npgsql.NpgsqlSync">
+             <summary>
+             This class represents the Parse message sent to PostgreSQL
+             server.
+             </summary>
+            
+        </member>
+        <member name="T:Npgsql.NpgsqlTransaction">
+            <summary>
+            Represents a transaction to be made in a PostgreSQL database. This class cannot be inherited.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlTransaction.Commit">
+            <summary>
+            Commits the database transaction.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlTransaction.Rollback">
+            <summary>
+            Rolls back a transaction from a pending state.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlTransaction.Rollback(System.String)">
+            <summary>
+            Rolls back a transaction from a pending savepoint state.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlTransaction.Save(System.String)">
+            <summary>
+            Creates a transaction save point.
+            </summary>
+        </member>
+        <member name="M:Npgsql.NpgsqlTransaction.Cancel">
+            <summary>
+            Cancel the transaction without telling the backend about it.  This is
+            used to make the transaction go away when closing a connection.
+            </summary>
+        </member>
+        <member name="P:Npgsql.NpgsqlTransaction.Connection">
+            <summary>
+            Gets the <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>
+            object associated with the transaction, or a null reference if the
+            transaction is no longer valid.
+            </summary>
+            <value>The <see cref="T:Npgsql.NpgsqlConnection">NpgsqlConnection</see>
+            object associated with the transaction.</value>
+        </member>
+        <member name="P:Npgsql.NpgsqlTransaction.IsolationLevel">
+            <summary>
+            Specifies the <see cref="T:System.Data.IsolationLevel">IsolationLevel</see> for this transaction.
+            </summary>
+            <value>The <see cref="T:System.Data.IsolationLevel">IsolationLevel</see> for this transaction.
+            The default is <b>ReadCommitted</b>.</value>
+        </member>
+        <member name="T:Npgsql.PGUtil">
+            <summary>
+             This class provides many util methods to handle
+             reading and writing of PostgreSQL protocol messages.
+             </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.ConvertProtocolVersion(Npgsql.ProtocolVersion)">
+            <summary>
+             This method takes a ProtocolVersion and returns an integer
+             version number that the Postgres backend will recognize in a
+             startup packet.
+             </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.ExtractServerVersion(System.String)">
+            <summary>
+            This method takes a version string as returned by SELECT VERSION() and returns
+            a valid version string ("7.2.2" for example).
+            This is only needed when running protocol version 2.
+            This does not do any validity checks.
+            </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.ReadString(System.IO.Stream)">
+            <summary>
+             This method gets a C NULL terminated string from the network stream.
+             It keeps reading a byte in each time until a NULL byte is returned.
+             It returns the resultant string of bytes read.
+             This string is sent from backend.
+             </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.ReadBytes(System.IO.Stream,System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Reads requested number of bytes from stream with retries until Stream.Read returns 0 or count is reached.
+            </summary>
+            <param name="stream">Stream to read</param>
+            <param name="buffer">byte buffer to fill</param>
+            <param name="offset">starting position to fill the buffer</param>
+            <param name="count">number of bytes to read</param>
+            <returns>The number of bytes read.  May be less than count if no more bytes are available.</returns>
+        </member>
+        <member name="M:Npgsql.PGUtil.WriteString(System.String,System.IO.Stream)">
+            <summary>
+             This method writes a C NULL terminated string to the network stream.
+             It appends a NULL terminator to the end of the String.
+             </summary>
+            <summary>
+             This method writes a C NULL terminated string to the network stream.
+             It appends a NULL terminator to the end of the String.
+             </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.WriteBytes(System.Byte[],System.IO.Stream)">
+            <summary>
+            This method writes a set of bytes to the stream. It also enables logging of them.
+            </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.WriteLimString(System.String,System.Int32,System.IO.Stream)">
+            <summary>
+             This method writes a C NULL terminated string limited in length to the
+             backend server.
+             It pads the string with null bytes to the size specified.
+             </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.WriteInt32(System.IO.Stream,System.Int32)">
+            <summary>
+            Write a 32-bit integer to the given stream in the correct byte order.
+            </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.ReadInt32(System.IO.Stream)">
+            <summary>
+            Read a 32-bit integer from the given stream in the correct byte order.
+            </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.WriteInt16(System.IO.Stream,System.Int16)">
+            <summary>
+            Write a 16-bit integer to the given stream in the correct byte order.
+            </summary>
+        </member>
+        <member name="M:Npgsql.PGUtil.ReadInt16(System.IO.Stream)">
+            <summary>
+            Read a 16-bit integer from the given stream in the correct byte order.
+            </summary>
+        </member>
+        <member name="T:Npgsql.ProtocolVersion">
+            <summary>
+            Represent the frontend/backend protocol version.
+            </summary>
+        </member>
+        <member name="T:Npgsql.ServerVersion">
+            <summary>
+            Represent the backend server version.
+            As this class offers no functionality beyond that offered by <see cref="T:System.Version"/> it has been
+            deprecated in favour of that class.
+            </summary>
+            
+        </member>
+        <member name="M:Npgsql.ServerVersion.ToString">
+            <summary>
+            Returns the string representation of this version in three place dot notation (Major.Minor.Patch).
+            </summary>
+        </member>
+        <member name="P:Npgsql.ServerVersion.Major">
+            <summary>
+            Server version major number.
+            </summary>
+        </member>
+        <member name="P:Npgsql.ServerVersion.Minor">
+            <summary>
+            Server version minor number.
+            </summary>
+        </member>
+        <member name="P:Npgsql.ServerVersion.Patch">
+            <summary>
+            Server version patch level number.
+            </summary>
+        </member>
+        <member name="T:Npgsql.SSPIHandler">
+            <summary>
+            A class to handle everything associated with SSPI authentication
+            </summary>
+        </member>
+        <member name="T:Npgsql.SSPIHandler.SecBufferDesc">
+            <summary>
+            Simplified SecBufferDesc struct with only one SecBuffer
+            </summary>
+        </member>
+    </members>
+</doc>
Binary file packages/Npgsql.2.0.14.3/lib/net45/de/Npgsql.resources.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net45/es/Npgsql.resources.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net45/fi/Npgsql.resources.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net45/fr/Npgsql.resources.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net45/ja/Npgsql.resources.dll has changed
Binary file packages/Npgsql.2.0.14.3/lib/net45/zh-CN/Npgsql.resources.dll has changed
Binary file packages/System.Data.SQLite.1.0.90.0/System.Data.SQLite.1.0.90.0.nupkg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/System.Data.SQLite.1.0.90.0/System.Data.SQLite.1.0.90.0.nuspec	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
+  <metadata>
+    <id>System.Data.SQLite</id>
+    <version>1.0.90.0</version>
+    <title>System.Data.SQLite (x86/x64)</title>
+    <authors>SQLite Development Team</authors>
+    <owners>SQLite Development Team</owners>
+    <licenseUrl>http://www.sqlite.org/copyright.html</licenseUrl>
+    <projectUrl>http://system.data.sqlite.org/</projectUrl>
+    <iconUrl>http://system.data.sqlite.org/images/sqlite32.png</iconUrl>
+    <requireLicenseAcceptance>false</requireLicenseAcceptance>
+    <description>The official SQLite database engine for both x86 and x64 along with the ADO.NET provider.</description>
+    <copyright>Public Domain</copyright>
+    <language>en-US</language>
+    <tags>sqlite database ado.net provider interop</tags>
+  </metadata>
+</package>
\ No newline at end of file
Binary file packages/System.Data.SQLite.1.0.90.0/content/net20/x64/SQLite.Interop.dll has changed
Binary file packages/System.Data.SQLite.1.0.90.0/content/net20/x86/SQLite.Interop.dll has changed
Binary file packages/System.Data.SQLite.1.0.90.0/content/net40/x64/SQLite.Interop.dll has changed
Binary file packages/System.Data.SQLite.1.0.90.0/content/net40/x86/SQLite.Interop.dll has changed
Binary file packages/System.Data.SQLite.1.0.90.0/content/net45/x64/SQLite.Interop.dll has changed
Binary file packages/System.Data.SQLite.1.0.90.0/content/net45/x86/SQLite.Interop.dll has changed
Binary file packages/System.Data.SQLite.1.0.90.0/content/net451/x64/SQLite.Interop.dll has changed
Binary file packages/System.Data.SQLite.1.0.90.0/content/net451/x86/SQLite.Interop.dll has changed
Binary file packages/System.Data.SQLite.1.0.90.0/lib/net20/System.Data.SQLite.Linq.dll has changed
Binary file packages/System.Data.SQLite.1.0.90.0/lib/net20/System.Data.SQLite.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/System.Data.SQLite.1.0.90.0/lib/net20/System.Data.SQLite.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12758 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>System.Data.SQLite</name>
+    </assembly>
+    <members>
+        <member name="T:System.Data.SQLite.AssemblySourceIdAttribute">
+            <summary>
+            Defines a source code identifier custom attribute for an assembly
+            manifest.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.AssemblySourceIdAttribute.#ctor(System.String)">
+            <summary>
+            Constructs an instance of this attribute class using the specified
+            source code identifier value.
+            </summary>
+            <param name="value">
+            The source code identifier value to use.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.AssemblySourceIdAttribute.SourceId">
+            <summary>
+            Gets the source code identifier value.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.AssemblySourceTimeStampAttribute">
+            <summary>
+            Defines a source code time-stamp custom attribute for an assembly
+            manifest.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.AssemblySourceTimeStampAttribute.#ctor(System.String)">
+            <summary>
+            Constructs an instance of this attribute class using the specified
+            source code time-stamp value.
+            </summary>
+            <param name="value">
+            The source code time-stamp value to use.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.AssemblySourceTimeStampAttribute.SourceTimeStamp">
+            <summary>
+            Gets the source code time-stamp value.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteLogCallback">
+             <summary>
+             This is the method signature for the SQLite core library logging callback
+             function for use with sqlite3_log() and the SQLITE_CONFIG_LOG.
+            
+             WARNING: This delegate is used more-or-less directly by native code, do
+                      not modify its type signature.
+             </summary>
+             <param name="pUserData">
+             The extra data associated with this message, if any.
+             </param>
+             <param name="errorCode">
+             The error code associated with this message.
+             </param>
+             <param name="pMessage">
+             The message string to be logged.
+             </param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLite3">
+            <summary>
+            This class implements SQLiteBase completely, and is the guts of the code that interop's SQLite with .NET
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteBase">
+            <summary>
+            This internal class provides the foundation of SQLite support.  It defines all the abstract members needed to implement
+            a SQLite data provider, and inherits from SQLiteConvert which allows for simple translations of string to and from SQLite.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConvert">
+            <summary>
+            This base class provides datatype conversion services for the SQLite provider.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert.FullFormat">
+            <summary>
+            The format string for DateTime values when using the InvariantCulture or CurrentCulture formats.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert.UnixEpoch">
+            <summary>
+            The value for the Unix epoch (e.g. January 1, 1970 at midnight, in UTC).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert.OleAutomationEpochAsJulianDay">
+            <summary>
+            The value of the OLE Automation epoch represented as a Julian day.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._datetimeFormats">
+            <summary>
+            An array of ISO-8601 DateTime formats that we support parsing.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._datetimeFormatUtc">
+            <summary>
+            The internal default format for UTC DateTime values when converting
+            to a string.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._datetimeFormatLocal">
+            <summary>
+            The internal default format for local DateTime values when converting
+            to a string.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._utf8">
+            <summary>
+            An UTF-8 Encoding instance, so we can convert strings to and from UTF-8
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._datetimeFormat">
+            <summary>
+            The default DateTime format for this instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._datetimeKind">
+            <summary>
+            The default DateTimeKind for this instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._datetimeFormatString">
+            <summary>
+            The default DateTime format string for this instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.#ctor(System.Data.SQLite.SQLiteDateFormats,System.DateTimeKind,System.String)">
+            <summary>
+            Initializes the conversion class
+            </summary>
+            <param name="fmt">The default date/time format to use for this instance</param>
+            <param name="kind">The DateTimeKind to use.</param>
+            <param name="fmtString">The DateTime format string to use.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToUTF8(System.String)">
+            <summary>
+            Converts a string to a UTF-8 encoded byte array sized to include a null-terminating character.
+            </summary>
+            <param name="sourceText">The string to convert to UTF-8</param>
+            <returns>A byte array containing the converted string plus an extra 0 terminating byte at the end of the array.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToUTF8(System.DateTime)">
+            <summary>
+            Convert a DateTime to a UTF-8 encoded, zero-terminated byte array.
+            </summary>
+            <remarks>
+            This function is a convenience function, which first calls ToString() on the DateTime, and then calls ToUTF8() with the
+            string result.
+            </remarks>
+            <param name="dateTimeValue">The DateTime to convert.</param>
+            <returns>The UTF-8 encoded string, including a 0 terminating byte at the end of the array.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToString(System.IntPtr,System.Int32)">
+            <summary>
+            Converts a UTF-8 encoded IntPtr of the specified length into a .NET string
+            </summary>
+            <param name="nativestring">The pointer to the memory where the UTF-8 string is encoded</param>
+            <param name="nativestringlen">The number of bytes to decode</param>
+            <returns>A string containing the translated character(s)</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.UTF8ToString(System.IntPtr,System.Int32)">
+            <summary>
+            Converts a UTF-8 encoded IntPtr of the specified length into a .NET string
+            </summary>
+            <param name="nativestring">The pointer to the memory where the UTF-8 string is encoded</param>
+            <param name="nativestringlen">The number of bytes to decode</param>
+            <returns>A string containing the translated character(s)</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.String)">
+            <summary>
+            Converts a string into a DateTime, using the DateTimeFormat, DateTimeKind,
+            and DateTimeFormatString specified for the connection when it was opened.
+            </summary>
+            <remarks>
+            Acceptable ISO8601 DateTime formats are:
+            <list type="bullet">
+            <item><description>THHmmssK</description></item>
+            <item><description>THHmmK</description></item>
+            <item><description>HH:mm:ss.FFFFFFFK</description></item>
+            <item><description>HH:mm:ssK</description></item>
+            <item><description>HH:mmK</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ss.FFFFFFFK</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ssK</description></item>
+            <item><description>yyyy-MM-dd HH:mmK</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ss.FFFFFFFK</description></item>
+            <item><description>yyyy-MM-ddTHH:mmK</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ssK</description></item>
+            <item><description>yyyyMMddHHmmssK</description></item>
+            <item><description>yyyyMMddHHmmK</description></item>
+            <item><description>yyyyMMddTHHmmssFFFFFFFK</description></item>
+            <item><description>THHmmss</description></item>
+            <item><description>THHmm</description></item>
+            <item><description>HH:mm:ss.FFFFFFF</description></item>
+            <item><description>HH:mm:ss</description></item>
+            <item><description>HH:mm</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ss.FFFFFFF</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ss</description></item>
+            <item><description>yyyy-MM-dd HH:mm</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ss.FFFFFFF</description></item>
+            <item><description>yyyy-MM-ddTHH:mm</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ss</description></item>
+            <item><description>yyyyMMddHHmmss</description></item>
+            <item><description>yyyyMMddHHmm</description></item>
+            <item><description>yyyyMMddTHHmmssFFFFFFF</description></item>
+            <item><description>yyyy-MM-dd</description></item>
+            <item><description>yyyyMMdd</description></item>
+            <item><description>yy-MM-dd</description></item>
+            </list>
+            If the string cannot be matched to one of the above formats -OR-
+            the DateTimeFormatString if one was provided, an exception will
+            be thrown.
+            </remarks>
+            <param name="dateText">The string containing either a long integer number of 100-nanosecond units since
+            System.DateTime.MinValue, a Julian day double, an integer number of seconds since the Unix epoch, a
+            culture-independent formatted date and time string, a formatted date and time string in the current
+            culture, or an ISO8601-format string.</param>
+            <returns>A DateTime value</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.String,System.Data.SQLite.SQLiteDateFormats,System.DateTimeKind,System.String)">
+            <summary>
+            Converts a string into a DateTime, using the specified DateTimeFormat,
+            DateTimeKind and DateTimeFormatString.
+            </summary>
+            <remarks>
+            Acceptable ISO8601 DateTime formats are:
+            <list type="bullet">
+            <item><description>THHmmssK</description></item>
+            <item><description>THHmmK</description></item>
+            <item><description>HH:mm:ss.FFFFFFFK</description></item>
+            <item><description>HH:mm:ssK</description></item>
+            <item><description>HH:mmK</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ss.FFFFFFFK</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ssK</description></item>
+            <item><description>yyyy-MM-dd HH:mmK</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ss.FFFFFFFK</description></item>
+            <item><description>yyyy-MM-ddTHH:mmK</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ssK</description></item>
+            <item><description>yyyyMMddHHmmssK</description></item>
+            <item><description>yyyyMMddHHmmK</description></item>
+            <item><description>yyyyMMddTHHmmssFFFFFFFK</description></item>
+            <item><description>THHmmss</description></item>
+            <item><description>THHmm</description></item>
+            <item><description>HH:mm:ss.FFFFFFF</description></item>
+            <item><description>HH:mm:ss</description></item>
+            <item><description>HH:mm</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ss.FFFFFFF</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ss</description></item>
+            <item><description>yyyy-MM-dd HH:mm</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ss.FFFFFFF</description></item>
+            <item><description>yyyy-MM-ddTHH:mm</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ss</description></item>
+            <item><description>yyyyMMddHHmmss</description></item>
+            <item><description>yyyyMMddHHmm</description></item>
+            <item><description>yyyyMMddTHHmmssFFFFFFF</description></item>
+            <item><description>yyyy-MM-dd</description></item>
+            <item><description>yyyyMMdd</description></item>
+            <item><description>yy-MM-dd</description></item>
+            </list>
+            If the string cannot be matched to one of the above formats -OR-
+            the DateTimeFormatString if one was provided, an exception will
+            be thrown.
+            </remarks>
+            <param name="dateText">The string containing either a long integer number of 100-nanosecond units since
+            System.DateTime.MinValue, a Julian day double, an integer number of seconds since the Unix epoch, a
+            culture-independent formatted date and time string, a formatted date and time string in the current
+            culture, or an ISO8601-format string.</param>
+            <param name="format">The SQLiteDateFormats to use.</param>
+            <param name="kind">The DateTimeKind to use.</param>
+            <param name="formatString">The DateTime format string to use.</param>
+            <returns>A DateTime value</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.Double)">
+            <summary>
+            Converts a julianday value into a DateTime
+            </summary>
+            <param name="julianDay">The value to convert</param>
+            <returns>A .NET DateTime</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.Double,System.DateTimeKind)">
+            <summary>
+            Converts a julianday value into a DateTime
+            </summary>
+            <param name="julianDay">The value to convert</param>
+            <param name="kind">The DateTimeKind to use.</param>
+            <returns>A .NET DateTime</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.Int32,System.DateTimeKind)">
+            <summary>
+            Converts the specified number of seconds from the Unix epoch into a
+            <see cref="T:System.DateTime"/> value.
+            </summary>
+            <param name="seconds">
+            The number of whole seconds since the Unix epoch.
+            </param>
+            <param name="kind">
+            Either Utc or Local time.
+            </param>
+            <returns>
+            The new <see cref="T:System.DateTime"/> value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.Int64,System.DateTimeKind)">
+            <summary>
+            Converts the specified number of ticks since the epoch into a
+            <see cref="T:System.DateTime"/> value.
+            </summary>
+            <param name="ticks">
+            The number of whole ticks since the epoch.
+            </param>
+            <param name="kind">
+            Either Utc or Local time.
+            </param>
+            <returns>
+            The new <see cref="T:System.DateTime"/> value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToJulianDay(System.DateTime)">
+            <summary>
+            Converts a DateTime struct to a JulianDay double
+            </summary>
+            <param name="value">The DateTime to convert</param>
+            <returns>The JulianDay value the Datetime represents</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToUnixEpoch(System.DateTime)">
+            <summary>
+            Converts a DateTime struct to the whole number of seconds since the
+            Unix epoch.
+            </summary>
+            <param name="value">The DateTime to convert</param>
+            <returns>The whole number of seconds since the Unix epoch</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.GetDateTimeKindFormat(System.DateTimeKind,System.String)">
+            <summary>
+            Returns the DateTime format string to use for the specified DateTimeKind.
+            If <paramref name="formatString" /> is not null, it will be returned verbatim.
+            </summary>
+            <param name="kind">The DateTimeKind to use.</param>
+            <param name="formatString">The DateTime format string to use.</param>
+            <returns>
+            The DateTime format string to use for the specified DateTimeKind.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToString(System.DateTime)">
+            <summary>
+            Converts a string into a DateTime, using the DateTimeFormat, DateTimeKind,
+            and DateTimeFormatString specified for the connection when it was opened.
+            </summary>
+            <param name="dateValue">The DateTime value to convert</param>
+            <returns>Either a string containing the long integer number of 100-nanosecond units since System.DateTime.MinValue, a
+            Julian day double, an integer number of seconds since the Unix epoch, a culture-independent formatted date and time
+            string, a formatted date and time string in the current culture, or an ISO8601-format date/time string.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.IntPtr,System.Int32)">
+            <summary>
+            Internal function to convert a UTF-8 encoded IntPtr of the specified length to a DateTime.
+            </summary>
+            <remarks>
+            This is a convenience function, which first calls ToString() on the IntPtr to convert it to a string, then calls
+            ToDateTime() on the string to return a DateTime.
+            </remarks>
+            <param name="ptr">A pointer to the UTF-8 encoded string</param>
+            <param name="len">The length in bytes of the string</param>
+            <returns>The parsed DateTime value</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.Split(System.String,System.Char)">
+            <summary>
+            Smart method of splitting a string.  Skips quoted elements, removes the quotes.
+            </summary>
+            <remarks>
+            This split function works somewhat like the String.Split() function in that it breaks apart a string into
+            pieces and returns the pieces as an array.  The primary differences are:
+            <list type="bullet">
+            <item><description>Only one character can be provided as a separator character</description></item>
+            <item><description>Quoted text inside the string is skipped over when searching for the separator, and the quotes are removed.</description></item>
+            </list>
+            Thus, if splitting the following string looking for a comma:<br/>
+            One,Two, "Three, Four", Five<br/>
+            <br/>
+            The resulting array would contain<br/>
+            [0] One<br/>
+            [1] Two<br/>
+            [2] Three, Four<br/>
+            [3] Five<br/>
+            <br/>
+            Note that the leading and trailing spaces were removed from each item during the split.
+            </remarks>
+            <param name="source">Source string to split apart</param>
+            <param name="separator">Separator character</param>
+            <returns>A string array of the split up elements</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.NewSplit(System.String,System.Char,System.Boolean,System.String@)">
+            <summary>
+            Splits the specified string into multiple strings based on a separator
+            and returns the result as an array of strings.
+            </summary>
+            <param name="value">
+            The string to split into pieces based on the separator character.  If
+            this string is null, null will always be returned.  If this string is
+            empty, an array of zero strings will always be returned.
+            </param>
+            <param name="separator">
+            The character used to divide the original string into sub-strings.
+            This character cannot be a backslash or a double-quote; otherwise, no
+            work will be performed and null will be returned.
+            </param>
+            <param name="keepQuote">
+            If this parameter is non-zero, all double-quote characters will be
+            retained in the returned list of strings; otherwise, they will be
+            dropped.
+            </param>
+            <param name="error">
+            Upon failure, this parameter will be modified to contain an appropriate
+            error message.
+            </param>
+            <returns>
+            The new array of strings or null if the input string is null -OR- the
+            separator character is a backslash or a double-quote -OR- the string
+            contains an unbalanced backslash or double-quote character.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToBoolean(System.Object)">
+            <summary>
+            Convert a value to true or false.
+            </summary>
+            <param name="source">A string or number representing true or false</param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToBoolean(System.String)">
+            <summary>
+            Convert a string to true or false.
+            </summary>
+            <param name="source">A string representing true or false</param>
+            <returns></returns>
+            <remarks>
+            "yes", "no", "y", "n", "0", "1", "on", "off" as well as Boolean.FalseString and Boolean.TrueString will all be
+            converted to a proper boolean value.
+            </remarks>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.SQLiteTypeToType(System.Data.SQLite.SQLiteType)">
+            <summary>
+            Converts a SQLiteType to a .NET Type object
+            </summary>
+            <param name="t">The SQLiteType to convert</param>
+            <returns>Returns a .NET Type object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.TypeToDbType(System.Type)">
+            <summary>
+            For a given intrinsic type, return a DbType
+            </summary>
+            <param name="typ">The native type to convert</param>
+            <returns>The corresponding (closest match) DbType</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.DbTypeToColumnSize(System.Data.DbType)">
+            <summary>
+            Returns the ColumnSize for the given DbType
+            </summary>
+            <param name="typ">The DbType to get the size of</param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.DbTypeToTypeName(System.Data.DbType,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            Determines the type name for the given database value type.
+            </summary>
+            <param name="typ">The database value type.</param>
+            <param name="flags">The flags associated with the parent connection object.</param>
+            <returns>The type name or an empty string if it cannot be determined.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.DbTypeToType(System.Data.DbType)">
+            <summary>
+            Convert a DbType to a Type
+            </summary>
+            <param name="typ">The DbType to convert from</param>
+            <returns>The closest-match .NET type</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.TypeToAffinity(System.Type)">
+            <summary>
+            For a given type, return the closest-match SQLite TypeAffinity, which only understands a very limited subset of types.
+            </summary>
+            <param name="typ">The type to evaluate</param>
+            <returns>The SQLite type affinity for that type.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.GetSQLiteDbTypeMap">
+            <summary>
+            Builds and returns a map containing the database column types
+            recognized by this provider.
+            </summary>
+            <returns>
+            A map containing the database column types recognized by this
+            provider.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.TypeNameToDbType(System.String,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            For a given type name, return a closest-match .NET type
+            </summary>
+            <param name="Name">The name of the type to match</param>
+            <param name="flags">The flags associated with the parent connection object.</param>
+            <returns>The .NET DBType the text evaluates to.</returns>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBase.COR_E_EXCEPTION">
+            <summary>
+            The error code used for logging exceptions caught in user-provided
+            code.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.SetMemoryStatus(System.Boolean)">
+            <summary>
+            Sets the status of the memory usage tracking subsystem in the SQLite core library.  By default, this is enabled.
+            If this is disabled, memory usage tracking will not be performed.  This is not really a per-connection value, it is
+            global to the process.
+            </summary>
+            <param name="value">Non-zero to enable memory usage tracking, zero otherwise.</param>
+            <returns>A standard SQLite return code (i.e. zero for success and non-zero for failure).</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.ReleaseMemory">
+            <summary>
+            Attempts to free as much heap memory as possible for the database connection.
+            </summary>
+            <returns>A standard SQLite return code (i.e. zero for success and non-zero for failure).</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Shutdown">
+            <summary>
+            Shutdown the SQLite engine so that it can be restarted with different config options.
+            We depend on auto initialization to recover.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.IsOpen">
+            <summary>
+            Determines if the associated native connection handle is open.
+            </summary>
+            <returns>
+            Non-zero if a database connection is open.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Open(System.String,System.Data.SQLite.SQLiteConnectionFlags,System.Data.SQLite.SQLiteOpenFlagsEnum,System.Int32,System.Boolean)">
+            <summary>
+            Opens a database.
+            </summary>
+            <remarks>
+            Implementers should call SQLiteFunction.BindFunctions() and save the array after opening a connection
+            to bind all attributed user-defined functions and collating sequences to the new connection.
+            </remarks>
+            <param name="strFilename">The filename of the database to open.  SQLite automatically creates it if it doesn't exist.</param>
+            <param name="connectionFlags">The flags associated with the parent connection object</param>
+            <param name="openFlags">The open flags to use when creating the connection</param>
+            <param name="maxPoolSize">The maximum size of the pool for the given filename</param>
+            <param name="usePool">If true, the connection can be pulled from the connection pool</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Close(System.Boolean)">
+            <summary>
+            Closes the currently-open database.
+            </summary>
+            <remarks>
+            After the database has been closed implemeters should call SQLiteFunction.UnbindFunctions() to deallocate all interop allocated
+            memory associated with the user-defined functions and collating sequences tied to the closed connection.
+            </remarks>
+            <param name="canThrow">Non-zero if the operation is allowed to throw exceptions, zero otherwise.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.SetTimeout(System.Int32)">
+            <summary>
+            Sets the busy timeout on the connection.  SQLiteCommand will call this before executing any command.
+            </summary>
+            <param name="nTimeoutMS">The number of milliseconds to wait before returning SQLITE_BUSY</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.GetLastError">
+            <summary>
+            Returns the text of the last error issued by SQLite
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.GetLastError(System.String)">
+            <summary>
+            Returns the text of the last error issued by SQLite -OR- the specified default error text if
+            none is available from the SQLite core library.
+            </summary>
+            <param name="defValue">
+            The error text to return in the event that one is not available from the SQLite core library.
+            </param>
+            <returns>
+            The error text.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.ClearPool">
+            <summary>
+            When pooling is enabled, force this connection to be disposed rather than returned to the pool
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.CountPool">
+            <summary>
+            When pooling is enabled, returns the number of pool entries matching the current file name.
+            </summary>
+            <returns>The number of pool entries matching the current file name.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Prepare(System.Data.SQLite.SQLiteConnection,System.String,System.Data.SQLite.SQLiteStatement,System.UInt32,System.String@)">
+            <summary>
+            Prepares a SQL statement for execution.
+            </summary>
+            <param name="cnn">The source connection preparing the command.  Can be null for any caller except LINQ</param>
+            <param name="strSql">The SQL command text to prepare</param>
+            <param name="previous">The previous statement in a multi-statement command, or null if no previous statement exists</param>
+            <param name="timeoutMS">The timeout to wait before aborting the prepare</param>
+            <param name="strRemain">The remainder of the statement that was not processed.  Each call to prepare parses the
+            SQL up to to either the end of the text or to the first semi-colon delimiter.  The remaining text is returned
+            here for a subsequent call to Prepare() until all the text has been processed.</param>
+            <returns>Returns an initialized SQLiteStatement.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Step(System.Data.SQLite.SQLiteStatement)">
+            <summary>
+            Steps through a prepared statement.
+            </summary>
+            <param name="stmt">The SQLiteStatement to step through</param>
+            <returns>True if a row was returned, False if not.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Reset(System.Data.SQLite.SQLiteStatement)">
+            <summary>
+            Resets a prepared statement so it can be executed again.  If the error returned is SQLITE_SCHEMA,
+            transparently attempt to rebuild the SQL statement and throw an error if that was not possible.
+            </summary>
+            <param name="stmt">The statement to reset</param>
+            <returns>Returns -1 if the schema changed while resetting, 0 if the reset was sucessful or 6 (SQLITE_LOCKED) if the reset failed due to a lock</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Cancel">
+            <summary>
+            Attempts to interrupt the query currently executing on the associated
+            native database connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.BindFunction(System.Data.SQLite.SQLiteFunctionAttribute,System.Data.SQLite.SQLiteFunction,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            This function binds a user-defined functions to the connection.
+            </summary>
+            <param name="functionAttribute">
+            The <see cref="T:System.Data.SQLite.SQLiteFunctionAttribute"/> object instance containing
+            the metadata for the function to be bound.
+            </param>
+            <param name="function">
+            The <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance that implements the
+            function to be bound.
+            </param>
+            <param name="flags">
+            The flags associated with the parent connection object.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.CreateModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            Calls the native SQLite core library in order to create a disposable
+            module containing the implementation of a virtual table.
+            </summary>
+            <param name="module">
+            The module object to be used when creating the native disposable module.
+            </param>
+            <param name="flags">
+            The flags for the associated <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.DisposeModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            Calls the native SQLite core library in order to cleanup the resources
+            associated with a module containing the implementation of a virtual table.
+            </summary>
+            <param name="module">
+            The module object previously passed to the <see cref="M:System.Data.SQLite.SQLiteBase.CreateModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)"/>
+            method.
+            </param>
+            <param name="flags">
+            The flags for the associated <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.DeclareVirtualTable(System.Data.SQLite.SQLiteModule,System.String,System.String@)">
+            <summary>
+            Calls the native SQLite core library in order to declare a virtual table
+            in response to a call into the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/>
+            or <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> virtual table methods.
+            </summary>
+            <param name="module">
+            The virtual table module that is to be responsible for the virtual table
+            being declared.
+            </param>
+            <param name="strSql">
+            The string containing the SQL statement describing the virtual table to
+            be declared.
+            </param>
+            <param name="error">
+            Upon success, the contents of this parameter are undefined.  Upon failure,
+            it should contain an appropriate error message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.DeclareVirtualFunction(System.Data.SQLite.SQLiteModule,System.Int32,System.String,System.String@)">
+            <summary>
+            Calls the native SQLite core library in order to declare a virtual table
+            function in response to a call into the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/>
+            or <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> virtual table methods.
+            </summary>
+            <param name="module">
+            The virtual table module that is to be responsible for the virtual table
+            function being declared.
+            </param>
+            <param name="argumentCount">
+            The number of arguments to the function being declared.
+            </param>
+            <param name="name">
+            The name of the function being declared.
+            </param>
+            <param name="error">
+            Upon success, the contents of this parameter are undefined.  Upon failure,
+            it should contain an appropriate error message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.SetLoadExtension(System.Boolean)">
+            <summary>
+            Enables or disabled extension loading by SQLite.
+            </summary>
+            <param name="bOnOff">
+            True to enable loading of extensions, false to disable.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.LoadExtension(System.String,System.String)">
+            <summary>
+            Loads a SQLite extension library from the named file.
+            </summary>
+            <param name="fileName">
+            The name of the dynamic link library file containing the extension.
+            </param>
+            <param name="procName">
+            The name of the exported function used to initialize the extension.
+            If null, the default "sqlite3_extension_init" will be used.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.SetExtendedResultCodes(System.Boolean)">
+            <summary>
+            Enables or disabled extened result codes returned by SQLite
+            </summary>
+            <param name="bOnOff">true to enable extended result codes, false to disable.</param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.ResultCode">
+            <summary>
+            Returns the numeric result code for the most recent failed SQLite API call
+            associated with the database connection.
+            </summary>
+            <returns>Result code</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.ExtendedResultCode">
+            <summary>
+            Returns the extended numeric result code for the most recent failed SQLite API call
+            associated with the database connection.
+            </summary>
+            <returns>Extended result code</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.LogMessage(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            <summary>
+            Add a log message via the SQLite sqlite3_log interface.
+            </summary>
+            <param name="iErrCode">Error code to be logged with the message.</param>
+            <param name="zMessage">String to be logged.  Unlike the SQLite sqlite3_log()
+            interface, this should be pre-formatted.  Consider using the
+            String.Format() function.</param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.IsInitialized">
+            <summary>
+            Checks if the SQLite core library has been initialized in the current process.
+            </summary>
+            <returns>
+            Non-zero if the SQLite core library has been initialized in the current process,
+            zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.InitializeBackup(System.Data.SQLite.SQLiteConnection,System.String,System.String)">
+            <summary>
+            Creates a new SQLite backup object based on the provided destination
+            database connection.  The source database connection is the one
+            associated with this object.  The source and destination database
+            connections cannot be the same.
+            </summary>
+            <param name="destCnn">The destination database connection.</param>
+            <param name="destName">The destination database name.</param>
+            <param name="sourceName">The source database name.</param>
+            <returns>The newly created backup object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.StepBackup(System.Data.SQLite.SQLiteBackup,System.Int32,System.Boolean@)">
+            <summary>
+            Copies up to N pages from the source database to the destination
+            database associated with the specified backup object.
+            </summary>
+            <param name="backup">The backup object to use.</param>
+            <param name="nPage">
+            The number of pages to copy or negative to copy all remaining pages.
+            </param>
+            <param name="retry">
+            Set to true if the operation needs to be retried due to database
+            locking issues.
+            </param>
+            <returns>
+            True if there are more pages to be copied, false otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.RemainingBackup(System.Data.SQLite.SQLiteBackup)">
+            <summary>
+            Returns the number of pages remaining to be copied from the source
+            database to the destination database associated with the specified
+            backup object.
+            </summary>
+            <param name="backup">The backup object to check.</param>
+            <returns>The number of pages remaining to be copied.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.PageCountBackup(System.Data.SQLite.SQLiteBackup)">
+            <summary>
+            Returns the total number of pages in the source database associated
+            with the specified backup object.
+            </summary>
+            <param name="backup">The backup object to check.</param>
+            <returns>The total number of pages in the source database.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.FinishBackup(System.Data.SQLite.SQLiteBackup)">
+            <summary>
+            Destroys the backup object, rolling back any backup that may be in
+            progess.
+            </summary>
+            <param name="backup">The backup object to destroy.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.FallbackGetErrorString(System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Returns the error message for the specified SQLite return code using
+            the internal static lookup table.
+            </summary>
+            <param name="rc">The SQLite return code.</param>
+            <returns>The error message or null if it cannot be found.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.GetErrorString(System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Returns the error message for the specified SQLite return code using
+            the sqlite3_errstr() function, falling back to the internal lookup
+            table if necessary.
+            </summary>
+            <param name="rc">The SQLite return code.</param>
+            <returns>The error message or null if it cannot be found.</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.Version">
+            <summary>
+            Returns a string representing the active version of SQLite
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.VersionNumber">
+            <summary>
+            Returns an integer representing the active version of SQLite
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.LastInsertRowId">
+            <summary>
+            Returns the rowid of the most recent successful INSERT into the database from this connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.Changes">
+            <summary>
+            Returns the number of changes the last executing insert/update caused.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.MemoryUsed">
+            <summary>
+            Returns the amount of memory (in bytes) currently in use by the SQLite core library.  This is not really a per-connection
+            value, it is global to the process.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.MemoryHighwater">
+            <summary>
+            Returns the maximum amount of memory (in bytes) used by the SQLite core library since the high-water mark was last reset.
+            This is not really a per-connection value, it is global to the process.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.OwnHandle">
+            <summary>
+            Returns non-zero if the underlying native connection handle is owned by this instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.AutoCommit">
+            <summary>
+            Returns non-zero if the given database connection is in autocommit mode.
+            Autocommit mode is on by default.  Autocommit mode is disabled by a BEGIN
+            statement.  Autocommit mode is re-enabled by a COMMIT or ROLLBACK.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLite3._sql">
+            <summary>
+            The opaque pointer returned to us by the sqlite provider
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLite3._functions">
+            <summary>
+            The user-defined functions registered on this connection
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLite3._modules">
+            <summary>
+            The modules created using this connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.#ctor(System.Data.SQLite.SQLiteDateFormats,System.DateTimeKind,System.String,System.IntPtr,System.String,System.Boolean)">
+            <summary>
+            Constructs the object used to interact with the SQLite core library
+            using the UTF-8 text encoding.
+            </summary>
+            <param name="fmt">
+            The DateTime format to be used when converting string values to a
+            DateTime and binding DateTime parameters.
+            </param>
+            <param name="kind">
+            The <see cref="T:System.DateTimeKind"/> to be used when creating DateTime
+            values.
+            </param>
+            <param name="fmtString">
+            The format string to be used when parsing and formatting DateTime
+            values.
+            </param>
+            <param name="db">
+            The native handle to be associated with the database connection.
+            </param>
+            <param name="fileName">
+            The fully qualified file name associated with <paramref name="db "/>.
+            </param>
+            <param name="ownHandle">
+            Non-zero if the newly created object instance will need to dispose
+            of <paramref name="db"/> when it is no longer needed.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.DisposeModules">
+            <summary>
+            This method attempts to dispose of all the <see cref="T:System.Data.SQLite.SQLiteModule"/> derived
+            object instances currently associated with the native database connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.Cancel">
+            <summary>
+            Attempts to interrupt the query currently executing on the associated
+            native database connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.BindFunction(System.Data.SQLite.SQLiteFunctionAttribute,System.Data.SQLite.SQLiteFunction,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            This function binds a user-defined function to the connection.
+            </summary>
+            <param name="functionAttribute">
+            The <see cref="T:System.Data.SQLite.SQLiteFunctionAttribute"/> object instance containing
+            the metadata for the function to be bound.
+            </param>
+            <param name="function">
+            The <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance that implements the
+            function to be bound.
+            </param>
+            <param name="flags">
+            The flags associated with the parent connection object.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.ReleaseMemory">
+            <summary>
+            Attempts to free as much heap memory as possible for the database connection.
+            </summary>
+            <returns>A standard SQLite return code (i.e. zero for success and non-zero for failure).</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.StaticReleaseMemory(System.Int32,System.Boolean,System.Boolean,System.Int32@,System.Boolean@,System.UInt32@)">
+            <summary>
+            Attempts to free N bytes of heap memory by deallocating non-essential memory
+            allocations held by the database library. Memory used to cache database pages
+            to improve performance is an example of non-essential memory.  This is a no-op
+            returning zero if the SQLite core library was not compiled with the compile-time
+            option SQLITE_ENABLE_MEMORY_MANAGEMENT.  Optionally, attempts to reset and/or
+            compact the Win32 native heap, if applicable.
+            </summary>
+            <param name="nBytes">
+            The requested number of bytes to free.
+            </param>
+            <param name="reset">
+            Non-zero to attempt a heap reset.
+            </param>
+            <param name="compact">
+            Non-zero to attempt heap compaction.
+            </param>
+            <param name="nFree">
+            The number of bytes actually freed.  This value may be zero.
+            </param>
+            <param name="resetOk">
+            This value will be non-zero if the heap reset was successful.
+            </param>
+            <param name="nLargest">
+            The size of the largest committed free block in the heap, in bytes.
+            This value will be zero unless heap compaction is enabled.
+            </param>
+            <returns>
+            A standard SQLite return code (i.e. zero for success and non-zero
+            for failure).
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.Shutdown">
+            <summary>
+            Shutdown the SQLite engine so that it can be restarted with different
+            configuration options.  We depend on auto initialization to recover.
+            </summary>
+            <returns>Returns a standard SQLite result code.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.StaticShutdown(System.Boolean)">
+            <summary>
+            Shutdown the SQLite engine so that it can be restarted with different
+            configuration options.  We depend on auto initialization to recover.
+            </summary>
+            <param name="directories">
+            Non-zero to reset the database and temporary directories to their
+            default values, which should be null for both.  This parameter has no
+            effect on non-Windows operating systems.
+            </param>
+            <returns>Returns a standard SQLite result code.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.IsOpen">
+            <summary>
+            Determines if the associated native connection handle is open.
+            </summary>
+            <returns>
+            Non-zero if the associated native connection handle is open.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.CreateModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            Calls the native SQLite core library in order to create a disposable
+            module containing the implementation of a virtual table.
+            </summary>
+            <param name="module">
+            The module object to be used when creating the native disposable module.
+            </param>
+            <param name="flags">
+            The flags for the associated <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.DisposeModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            Calls the native SQLite core library in order to cleanup the resources
+            associated with a module containing the implementation of a virtual table.
+            </summary>
+            <param name="module">
+            The module object previously passed to the <see cref="M:System.Data.SQLite.SQLite3.CreateModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)"/>
+            method.
+            </param>
+            <param name="flags">
+            The flags for the associated <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.DeclareVirtualTable(System.Data.SQLite.SQLiteModule,System.String,System.String@)">
+            <summary>
+            Calls the native SQLite core library in order to declare a virtual table
+            in response to a call into the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/>
+            or <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> virtual table methods.
+            </summary>
+            <param name="module">
+            The virtual table module that is to be responsible for the virtual table
+            being declared.
+            </param>
+            <param name="strSql">
+            The string containing the SQL statement describing the virtual table to
+            be declared.
+            </param>
+            <param name="error">
+            Upon success, the contents of this parameter are undefined.  Upon failure,
+            it should contain an appropriate error message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.DeclareVirtualFunction(System.Data.SQLite.SQLiteModule,System.Int32,System.String,System.String@)">
+            <summary>
+            Calls the native SQLite core library in order to declare a virtual table
+            function in response to a call into the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/>
+            or <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> virtual table methods.
+            </summary>
+            <param name="module">
+            The virtual table module that is to be responsible for the virtual table
+            function being declared.
+            </param>
+            <param name="argumentCount">
+            The number of arguments to the function being declared.
+            </param>
+            <param name="name">
+            The name of the function being declared.
+            </param>
+            <param name="error">
+            Upon success, the contents of this parameter are undefined.  Upon failure,
+            it should contain an appropriate error message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.SetLoadExtension(System.Boolean)">
+            <summary>
+            Enables or disabled extension loading by SQLite.
+            </summary>
+            <param name="bOnOff">
+            True to enable loading of extensions, false to disable.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.LoadExtension(System.String,System.String)">
+            <summary>
+            Loads a SQLite extension library from the named file.
+            </summary>
+            <param name="fileName">
+            The name of the dynamic link library file containing the extension.
+            </param>
+            <param name="procName">
+            The name of the exported function used to initialize the extension.
+            If null, the default "sqlite3_extension_init" will be used.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.SetExtendedResultCodes(System.Boolean)">
+            Enables or disabled extended result codes returned by SQLite
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.ResultCode">
+            Gets the last SQLite error code
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.ExtendedResultCode">
+            Gets the last SQLite extended error code
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.LogMessage(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            Add a log message via the SQLite sqlite3_log interface.
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.StaticLogMessage(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            Add a log message via the SQLite sqlite3_log interface.
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.SetLogCallback(System.Data.SQLite.SQLiteLogCallback)">
+            <summary>
+            Allows the setting of a logging callback invoked by SQLite when a
+            log event occurs.  Only one callback may be set.  If NULL is passed,
+            the logging callback is unregistered.
+            </summary>
+            <param name="func">The callback function to invoke.</param>
+            <returns>Returns a result code</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.InitializeBackup(System.Data.SQLite.SQLiteConnection,System.String,System.String)">
+            <summary>
+            Creates a new SQLite backup object based on the provided destination
+            database connection.  The source database connection is the one
+            associated with this object.  The source and destination database
+            connections cannot be the same.
+            </summary>
+            <param name="destCnn">The destination database connection.</param>
+            <param name="destName">The destination database name.</param>
+            <param name="sourceName">The source database name.</param>
+            <returns>The newly created backup object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.StepBackup(System.Data.SQLite.SQLiteBackup,System.Int32,System.Boolean@)">
+            <summary>
+            Copies up to N pages from the source database to the destination
+            database associated with the specified backup object.
+            </summary>
+            <param name="backup">The backup object to use.</param>
+            <param name="nPage">
+            The number of pages to copy, negative to copy all remaining pages.
+            </param>
+            <param name="retry">
+            Set to true if the operation needs to be retried due to database
+            locking issues; otherwise, set to false.
+            </param>
+            <returns>
+            True if there are more pages to be copied, false otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.RemainingBackup(System.Data.SQLite.SQLiteBackup)">
+            <summary>
+            Returns the number of pages remaining to be copied from the source
+            database to the destination database associated with the specified
+            backup object.
+            </summary>
+            <param name="backup">The backup object to check.</param>
+            <returns>The number of pages remaining to be copied.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.PageCountBackup(System.Data.SQLite.SQLiteBackup)">
+            <summary>
+            Returns the total number of pages in the source database associated
+            with the specified backup object.
+            </summary>
+            <param name="backup">The backup object to check.</param>
+            <returns>The total number of pages in the source database.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.FinishBackup(System.Data.SQLite.SQLiteBackup)">
+            <summary>
+            Destroys the backup object, rolling back any backup that may be in
+            progess.
+            </summary>
+            <param name="backup">The backup object to destroy.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.IsInitialized">
+            <summary>
+            Determines if the SQLite core library has been initialized for the
+            current process.
+            </summary>
+            <returns>
+            A boolean indicating whether or not the SQLite core library has been
+            initialized for the current process.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.StaticIsInitialized">
+            <summary>
+            Determines if the SQLite core library has been initialized for the
+            current process.
+            </summary>
+            <returns>
+            A boolean indicating whether or not the SQLite core library has been
+            initialized for the current process.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.GetValue(System.Data.SQLite.SQLiteStatement,System.Data.SQLite.SQLiteConnectionFlags,System.Int32,System.Data.SQLite.SQLiteType)">
+            <summary>
+            Helper function to retrieve a column of data from an active statement.
+            </summary>
+            <param name="stmt">The statement being step()'d through</param>
+            <param name="flags">The flags associated with the connection.</param>
+            <param name="index">The column index to retrieve</param>
+            <param name="typ">The type of data contained in the column.  If Uninitialized, this function will retrieve the datatype information.</param>
+            <returns>Returns the data in the column</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLite3.OwnHandle">
+            <summary>
+            Returns non-zero if the underlying native connection handle is owned
+            by this instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLite3_UTF16">
+            <summary>
+            Alternate SQLite3 object, overriding many text behaviors to support UTF-16 (Unicode)
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3_UTF16.#ctor(System.Data.SQLite.SQLiteDateFormats,System.DateTimeKind,System.String,System.IntPtr,System.String,System.Boolean)">
+            <summary>
+            Constructs the object used to interact with the SQLite core library
+            using the UTF-8 text encoding.
+            </summary>
+            <param name="fmt">
+            The DateTime format to be used when converting string values to a
+            DateTime and binding DateTime parameters.
+            </param>
+            <param name="kind">
+            The <see cref="T:System.DateTimeKind"/> to be used when creating DateTime
+            values.
+            </param>
+            <param name="fmtString">
+            The format string to be used when parsing and formatting DateTime
+            values.
+            </param>
+            <param name="db">
+            The native handle to be associated with the database connection.
+            </param>
+            <param name="fileName">
+            The fully qualified file name associated with <paramref name="db"/>.
+            </param>
+            <param name="ownHandle">
+            Non-zero if the newly created object instance will need to dispose
+            of <paramref name="db"/> when it is no longer needed.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3_UTF16.ToString(System.IntPtr,System.Int32)">
+            <summary>
+            Overrides SQLiteConvert.ToString() to marshal UTF-16 strings instead of UTF-8
+            </summary>
+            <param name="b">A pointer to a UTF-16 string</param>
+            <param name="nbytelen">The length (IN BYTES) of the string</param>
+            <returns>A .NET string</returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteBackup">
+            <summary>
+            Represents a single SQL backup in SQLite.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._sql">
+            <summary>
+            The underlying SQLite object this backup is bound to.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._sqlite_backup">
+            <summary>
+            The actual backup handle.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._destDb">
+            <summary>
+            The destination database for the backup.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._zDestName">
+            <summary>
+            The destination database name for the backup.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._sourceDb">
+            <summary>
+            The source database for the backup.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._zSourceName">
+            <summary>
+            The source database name for the backup.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._stepResult">
+            <summary>
+            The last result from the StepBackup method of the SQLite3 class.
+            This is used to determine if the call to the FinishBackup method of
+            the SQLite3 class should throw an exception when it receives a non-Ok
+            return code from the core SQLite library.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBackup.#ctor(System.Data.SQLite.SQLiteBase,System.Data.SQLite.SQLiteBackupHandle,System.IntPtr,System.Byte[],System.IntPtr,System.Byte[])">
+            <summary>
+            Initializes the backup.
+            </summary>
+            <param name="sqlbase">The base SQLite object.</param>
+            <param name="backup">The backup handle.</param>
+            <param name="destDb">The destination database for the backup.</param>
+            <param name="zDestName">The destination database name for the backup.</param>
+            <param name="sourceDb">The source database for the backup.</param>
+            <param name="zSourceName">The source database name for the backup.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBackup.Dispose">
+            <summary>
+            Disposes and finalizes the backup.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnectionFlags">
+            <summary>
+            The extra behavioral flags that can be applied to a connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.None">
+            <summary>
+            No extra flags.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogPrepare">
+            <summary>
+            Enable logging of all SQL statements to be prepared.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogPreBind">
+            <summary>
+            Enable logging of all bound parameter types and raw values.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogBind">
+            <summary>
+            Enable logging of all bound parameter strongly typed values.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogCallbackException">
+            <summary>
+            Enable logging of all exceptions caught from user-provided
+            managed code called from native code via delegates.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogBackup">
+            <summary>
+            Enable logging of backup API errors.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.NoExtensionFunctions">
+            <summary>
+            Skip adding the extension functions provided by the native
+            interop assembly.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.BindUInt32AsInt64">
+            <summary>
+            When binding parameter values with the <see cref="T:System.UInt32"/>
+            type, use the interop method that accepts an <see cref="T:System.Int64"/>
+            value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.BindAllAsText">
+            <summary>
+            When binding parameter values, always bind them as though they were
+            plain text (i.e. no numeric, date/time, or other conversions should
+            be attempted).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.GetAllAsText">
+            <summary>
+            When returning column values, always return them as though they were
+            plain text (i.e. no numeric, date/time, or other conversions should
+            be attempted).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.NoLoadExtension">
+            <summary>
+            Prevent this <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance from
+            loading extensions.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.NoCreateModule">
+            <summary>
+            Prevent this <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance from
+            creating virtual table modules.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.NoBindFunctions">
+            <summary>
+            Skip binding any functions provided by other managed assemblies when
+            opening the connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.NoLogModule">
+            <summary>
+            Skip setting the logging related properties of the
+            <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance that was passed to
+            the <see cref="M:System.Data.SQLite.SQLiteConnection.CreateModule(System.Data.SQLite.SQLiteModule)"/> method.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogModuleError">
+            <summary>
+            Enable logging of all virtual table module errors seen by the
+            <see cref="M:System.Data.SQLite.SQLiteModule.SetTableError(System.IntPtr,System.String)"/> method.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogModuleException">
+            <summary>
+            Enable logging of certain virtual table module exceptions that cannot
+            be easily discovered via other means.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.TraceWarning">
+            <summary>
+            Enable tracing of potentially important [non-fatal] error conditions
+            that cannot be easily reported through other means.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.BindAndGetAllAsText">
+            <summary>
+            When binding and returning column values, always treat them as though
+            they were plain text (i.e. no numeric, date/time, or other conversions
+            should be attempted).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogAll">
+            <summary>
+            Enable all logging.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.Default">
+            <summary>
+            The default extra flags for new connections.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteCommand">
+            <summary>
+            SQLite implementation of DbCommand.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand.DefaultConnectionString">
+            <summary>
+            The default connection string to be used when creating a temporary
+            connection to execute a command via the static
+            <see cref="M:System.Data.SQLite.SQLiteCommand.Execute(System.String,System.Data.SQLite.SQLiteExecuteType,System.String,System.Object[])"/> or
+            <see cref="M:System.Data.SQLite.SQLiteCommand.Execute(System.String,System.Data.SQLite.SQLiteExecuteType,System.Data.CommandBehavior,System.String,System.Object[])"/>
+            methods.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._commandText">
+            <summary>
+            The command text this command is based on
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._cnn">
+            <summary>
+            The connection the command is associated with
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._version">
+            <summary>
+            The version of the connection the command is associated with
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._activeReader">
+            <summary>
+            Indicates whether or not a DataReader is active on the command.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._commandTimeout">
+            <summary>
+            The timeout for the command, kludged because SQLite doesn't support per-command timeout values
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._designTimeVisible">
+            <summary>
+            Designer support
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._updateRowSource">
+            <summary>
+            Used by DbDataAdapter to determine updating behavior
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._parameterCollection">
+            <summary>
+            The collection of parameters for the command
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._statementList">
+            <summary>
+            The SQL command text, broken into individual SQL statements as they are executed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._remainingText">
+            <summary>
+            Unprocessed SQL text that has not been executed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._transaction">
+            <summary>
+            Transaction associated with this command
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.#ctor">
+            <overloads>
+             Constructs a new SQLiteCommand
+             </overloads>
+             <summary>
+             Default constructor
+             </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.#ctor(System.String)">
+            <summary>
+            Initializes the command with the given command text
+            </summary>
+            <param name="commandText">The SQL command text</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.#ctor(System.String,System.Data.SQLite.SQLiteConnection)">
+            <summary>
+            Initializes the command with the given SQL command text and attach the command to the specified
+            connection.
+            </summary>
+            <param name="commandText">The SQL command text</param>
+            <param name="connection">The connection to associate with the command</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.#ctor(System.Data.SQLite.SQLiteConnection)">
+            <summary>
+            Initializes the command and associates it with the specified connection.
+            </summary>
+            <param name="connection">The connection to associate with the command</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.#ctor(System.String,System.Data.SQLite.SQLiteConnection,System.Data.SQLite.SQLiteTransaction)">
+            <summary>
+            Initializes a command with the given SQL, connection and transaction
+            </summary>
+            <param name="commandText">The SQL command text</param>
+            <param name="connection">The connection to associate with the command</param>
+            <param name="transaction">The transaction the command should be associated with</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.Dispose(System.Boolean)">
+            <summary>
+            Disposes of the command and clears all member variables
+            </summary>
+            <param name="disposing">Whether or not the class is being explicitly or implicitly disposed</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.GetFlags(System.Data.SQLite.SQLiteCommand)">
+            <summary>
+            This method attempts to query the flags associated with the database
+            connection in use.  If the database connection is disposed, the default
+            flags will be returned.
+            </summary>
+            <param name="command">
+            The command containing the databse connection to query the flags from.
+            </param>
+            <returns>
+            The connection flags value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ClearCommands">
+            <summary>
+            Clears and destroys all statements currently prepared
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.BuildNextCommand">
+            <summary>
+            Builds an array of prepared statements for each complete SQL statement in the command text
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.Cancel">
+            <summary>
+            Not implemented
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.CreateDbParameter">
+            <summary>
+            Forwards to the local CreateParameter() function
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.CreateParameter">
+            <summary>
+            Create a new parameter
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.InitializeForReader">
+            <summary>
+            This function ensures there are no active readers, that we have a valid connection,
+            that the connection is open, that all statements are prepared and all parameters are assigned
+            in preparation for allocating a data reader.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteDbDataReader(System.Data.CommandBehavior)">
+            <summary>
+            Creates a new SQLiteDataReader to execute/iterate the array of SQLite prepared statements
+            </summary>
+            <param name="behavior">The behavior the data reader should adopt</param>
+            <returns>Returns a SQLiteDataReader object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.Execute(System.String,System.Data.SQLite.SQLiteExecuteType,System.String,System.Object[])">
+            <summary>
+            This method creates a new connection, executes the query using the given
+            execution type, closes the connection, and returns the results.  If the
+            connection string is null, a temporary in-memory database connection will
+            be used.
+            </summary>
+            <param name="commandText">
+            The text of the command to be executed.
+            </param>
+            <param name="executeType">
+            The execution type for the command.  This is used to determine which method
+            of the command object to call, which then determines the type of results
+            returned, if any.
+            </param>
+            <param name="connectionString">
+            The connection string to the database to be opened, used, and closed.  If
+            this parameter is null, a temporary in-memory databse will be used.
+            </param>
+            <param name="args">
+            The SQL parameter values to be used when building the command object to be
+            executed, if any.
+            </param>
+            <returns>
+            The results of the query -OR- null if no results were produced from the
+            given execution type.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.Execute(System.String,System.Data.SQLite.SQLiteExecuteType,System.Data.CommandBehavior,System.String,System.Object[])">
+            <summary>
+            This method creates a new connection, executes the query using the given
+            execution type and command behavior, closes the connection, and returns
+            the results.  If the connection string is null, a temporary in-memory
+            database connection will be used.
+            </summary>
+            <param name="commandText">
+            The text of the command to be executed.
+            </param>
+            <param name="executeType">
+            The execution type for the command.  This is used to determine which method
+            of the command object to call, which then determines the type of results
+            returned, if any.
+            </param>
+            <param name="commandBehavior">
+            The command behavior flags for the command.
+            </param>
+            <param name="connectionString">
+            The connection string to the database to be opened, used, and closed.  If
+            this parameter is null, a temporary in-memory databse will be used.
+            </param>
+            <param name="args">
+            The SQL parameter values to be used when building the command object to be
+            executed, if any.
+            </param>
+            <returns>
+            The results of the query -OR- null if no results were produced from the
+            given execution type.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteReader(System.Data.CommandBehavior)">
+            <summary>
+            Overrides the default behavior to return a SQLiteDataReader specialization class
+            </summary>
+            <param name="behavior">The flags to be associated with the reader.</param>
+            <returns>A SQLiteDataReader</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteReader">
+            <summary>
+            Overrides the default behavior of DbDataReader to return a specialized SQLiteDataReader class
+            </summary>
+            <returns>A SQLiteDataReader</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ClearDataReader">
+            <summary>
+            Called by the SQLiteDataReader when the data reader is closed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteNonQuery">
+            <summary>
+            Execute the command and return the number of rows inserted/updated affected by it.
+            </summary>
+            <returns>The number of rows inserted/updated affected by it.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteNonQuery(System.Data.CommandBehavior)">
+            <summary>
+            Execute the command and return the number of rows inserted/updated affected by it.
+            </summary>
+            <param name="behavior">The flags to be associated with the reader.</param>
+            <returns>The number of rows inserted/updated affected by it.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteScalar">
+            <summary>
+            Execute the command and return the first column of the first row of the resultset
+            (if present), or null if no resultset was returned.
+            </summary>
+            <returns>The first column of the first row of the first resultset from the query.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteScalar(System.Data.CommandBehavior)">
+            <summary>
+            Execute the command and return the first column of the first row of the resultset
+            (if present), or null if no resultset was returned.
+            </summary>
+            <param name="behavior">The flags to be associated with the reader.</param>
+            <returns>The first column of the first row of the first resultset from the query.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.Prepare">
+            <summary>
+            Does nothing.  Commands are prepared as they are executed the first time, and kept in prepared state afterwards.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.Clone">
+            <summary>
+            Clones a command, including all its parameters
+            </summary>
+            <returns>A new SQLiteCommand with the same commandtext, connection and parameters</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.CommandText">
+            <summary>
+            The SQL command text associated with the command
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.CommandTimeout">
+            <summary>
+            The amount of time to wait for the connection to become available before erroring out
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.CommandType">
+            <summary>
+            The type of the command.  SQLite only supports CommandType.Text
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.Connection">
+            <summary>
+            The connection associated with this command
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.DbConnection">
+            <summary>
+            Forwards to the local Connection property
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.Parameters">
+            <summary>
+            Returns the SQLiteParameterCollection for the given command
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.DbParameterCollection">
+            <summary>
+            Forwards to the local Parameters property
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.Transaction">
+            <summary>
+            The transaction associated with this command.  SQLite only supports one transaction per connection, so this property forwards to the
+            command's underlying connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.DbTransaction">
+            <summary>
+            Forwards to the local Transaction property
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.UpdatedRowSource">
+            <summary>
+            Sets the method the SQLiteCommandBuilder uses to determine how to update inserted or updated rows in a DataTable.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.DesignTimeVisible">
+            <summary>
+            Determines if the command is visible at design time.  Defaults to True.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteCommandBuilder">
+            <summary>
+            SQLite implementation of DbCommandBuilder.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.#ctor(System.Data.SQLite.SQLiteDataAdapter)">
+            <summary>
+            Initializes the command builder and associates it with the specified data adapter.
+            </summary>
+            <param name="adp"></param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.ApplyParameterInfo(System.Data.Common.DbParameter,System.Data.DataRow,System.Data.StatementType,System.Boolean)">
+            <summary>
+            Minimal amount of parameter processing.  Primarily sets the DbType for the parameter equal to the provider type in the schema
+            </summary>
+            <param name="parameter">The parameter to use in applying custom behaviors to a row</param>
+            <param name="row">The row to apply the parameter to</param>
+            <param name="statementType">The type of statement</param>
+            <param name="whereClause">Whether the application of the parameter is part of a WHERE clause</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetParameterName(System.String)">
+            <summary>
+            Returns a valid named parameter
+            </summary>
+            <param name="parameterName">The name of the parameter</param>
+            <returns>Error</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetParameterName(System.Int32)">
+            <summary>
+            Returns a named parameter for the given ordinal
+            </summary>
+            <param name="parameterOrdinal">The i of the parameter</param>
+            <returns>Error</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetParameterPlaceholder(System.Int32)">
+            <summary>
+            Returns a placeholder character for the specified parameter i.
+            </summary>
+            <param name="parameterOrdinal">The index of the parameter to provide a placeholder for</param>
+            <returns>Returns a named parameter</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.SetRowUpdatingHandler(System.Data.Common.DbDataAdapter)">
+            <summary>
+            Sets the handler for receiving row updating events.  Used by the DbCommandBuilder to autogenerate SQL
+            statements that may not have previously been generated.
+            </summary>
+            <param name="adapter">A data adapter to receive events on.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetDeleteCommand">
+            <summary>
+            Returns the automatically-generated SQLite command to delete rows from the database
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetDeleteCommand(System.Boolean)">
+            <summary>
+            Returns the automatically-generated SQLite command to delete rows from the database
+            </summary>
+            <param name="useColumnsForParameterNames"></param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetUpdateCommand">
+            <summary>
+            Returns the automatically-generated SQLite command to update rows in the database
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetUpdateCommand(System.Boolean)">
+            <summary>
+            Returns the automatically-generated SQLite command to update rows in the database
+            </summary>
+            <param name="useColumnsForParameterNames"></param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetInsertCommand">
+            <summary>
+            Returns the automatically-generated SQLite command to insert rows into the database
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetInsertCommand(System.Boolean)">
+            <summary>
+            Returns the automatically-generated SQLite command to insert rows into the database
+            </summary>
+            <param name="useColumnsForParameterNames"></param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.QuoteIdentifier(System.String)">
+            <summary>
+            Places brackets around an identifier
+            </summary>
+            <param name="unquotedIdentifier">The identifier to quote</param>
+            <returns>The bracketed identifier</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.UnquoteIdentifier(System.String)">
+            <summary>
+            Removes brackets around an identifier
+            </summary>
+            <param name="quotedIdentifier">The quoted (bracketed) identifier</param>
+            <returns>The undecorated identifier</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetSchemaTable(System.Data.Common.DbCommand)">
+            <summary>
+            Override helper, which can help the base command builder choose the right keys for the given query
+            </summary>
+            <param name="sourceCommand"></param>
+            <returns></returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommandBuilder.DataAdapter">
+            <summary>
+            Gets/sets the DataAdapter for this CommandBuilder
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommandBuilder.CatalogLocation">
+            <summary>
+            Overridden to hide its property from the designer
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommandBuilder.CatalogSeparator">
+            <summary>
+            Overridden to hide its property from the designer
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommandBuilder.QuotePrefix">
+            <summary>
+            Overridden to hide its property from the designer
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommandBuilder.QuoteSuffix">
+            <summary>
+            Overridden to hide its property from the designer
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommandBuilder.SchemaSeparator">
+            <summary>
+            Overridden to hide its property from the designer
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.ConnectionEventArgs">
+            <summary>
+            Event data for connection event handlers.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.EventType">
+            <summary>
+            The type of event being raised.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.EventArgs">
+            <summary>
+            The <see cref="T:System.Data.StateChangeEventArgs"/> associated with this event, if any.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.Transaction">
+            <summary>
+            The transaction associated with this event, if any.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.Command">
+            <summary>
+            The command associated with this event, if any.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.DataReader">
+            <summary>
+            The data reader associated with this event, if any.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.CriticalHandle">
+            <summary>
+            The critical handle associated with this event, if any.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.Text">
+            <summary>
+            Command or message text associated with this event, if any.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.Data">
+            <summary>
+            Extra data associated with this event, if any.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.ConnectionEventArgs.#ctor(System.Data.SQLite.SQLiteConnectionEventType,System.Data.StateChangeEventArgs,System.Data.IDbTransaction,System.Data.IDbCommand,System.Data.IDataReader,System.Runtime.InteropServices.CriticalHandle,System.String,System.Object)">
+            <summary>
+            Constructs the object.
+            </summary>
+            <param name="eventType">The type of event being raised.</param>
+            <param name="eventArgs">The base <see cref="F:System.Data.SQLite.ConnectionEventArgs.EventArgs"/> associated
+            with this event, if any.</param>
+            <param name="transaction">The transaction associated with this event, if any.</param>
+            <param name="command">The command associated with this event, if any.</param>
+            <param name="dataReader">The data reader associated with this event, if any.</param>
+            <param name="criticalHandle">The critical handle associated with this event, if any.</param>
+            <param name="text">The command or message text, if any.</param>
+            <param name="data">The extra data, if any.</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnectionEventHandler">
+            <summary>
+            Raised when an event pertaining to a connection occurs.
+            </summary>
+            <param name="sender">The connection involved.</param>
+            <param name="e">Extra information about the event.</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnection">
+            <summary>
+            SQLite implentation of DbConnection.
+            </summary>
+            <remarks>
+            The <see cref="P:System.Data.SQLite.SQLiteConnection.ConnectionString"/> property can contain the following parameter(s), delimited with a semi-colon:
+            <list type="table">
+            <listheader>
+            <term>Parameter</term>
+            <term>Values</term>
+            <term>Required</term>
+            <term>Default</term>
+            </listheader>
+            <item>
+            <description>Data Source</description>
+            <description>
+            This may be a file name, the string ":memory:", or any supported URI (starting with SQLite 3.7.7).
+            Starting with release 1.0.86.0, in order to use more than one consecutive backslash (e.g. for a
+            UNC path), each of the adjoining backslash characters must be doubled (e.g. "\\Network\Share\test.db"
+            would become "\\\\Network\Share\test.db").
+            </description>
+            <description>Y</description>
+            <description></description>
+            </item>
+            <item>
+            <description>Version</description>
+            <description>3</description>
+            <description>N</description>
+            <description>3</description>
+            </item>
+            <item>
+            <description>UseUTF16Encoding</description>
+            <description><b>True</b><br/><b>False</b></description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>DateTimeFormat</description>
+            <description>
+            <b>Ticks</b> - Use the value of DateTime.Ticks.<br/>
+            <b>ISO8601</b> - Use the ISO-8601 format.  Uses the "yyyy-MM-dd HH:mm:ss.FFFFFFFK" format for UTC
+            DateTime values and "yyyy-MM-dd HH:mm:ss.FFFFFFF" format for local DateTime values).<br/>
+            <b>JulianDay</b> - The interval of time in days and fractions of a day since January 1, 4713 BC.<br/>
+            <b>UnixEpoch</b> - The whole number of seconds since the Unix epoch (January 1, 1970).<br/>
+            <b>InvariantCulture</b> - Any culture-independent string value that the .NET Framework can interpret as a valid DateTime.<br/>
+            <b>CurrentCulture</b> - Any string value that the .NET Framework can interpret as a valid DateTime using the current culture.</description>
+            <description>N</description>
+            <description>ISO8601</description>
+            </item>
+            <item>
+            <description>DateTimeKind</description>
+            <description><b>Unspecified</b> - Not specified as either UTC or local time.<br/><b>Utc</b> - The time represented is UTC.<br/><b>Local</b> - The time represented is local time.</description>
+            <description>N</description>
+            <description>Unspecified</description>
+            </item>
+            <item>
+            <description>DateTimeFormatString</description>
+            <description>The exact DateTime format string to use for all formatting and parsing of all DateTime
+            values for this connection.</description>
+            <description>N</description>
+            <description>null</description>
+            </item>
+            <item>
+            <description>BaseSchemaName</description>
+            <description>Some base data classes in the framework (e.g. those that build SQL queries dynamically)
+            assume that an ADO.NET provider cannot support an alternate catalog (i.e. database) without supporting
+            alternate schemas as well; however, SQLite does not fit into this model.  Therefore, this value is used
+            as a placeholder and removed prior to preparing any SQL statements that may contain it.</description>
+            <description>N</description>
+            <description>sqlite_default_schema</description>
+            </item>
+            <item>
+            <description>BinaryGUID</description>
+            <description><b>True</b> - Store GUID columns in binary form<br/><b>False</b> - Store GUID columns as text</description>
+            <description>N</description>
+            <description>True</description>
+            </item>
+            <item>
+            <description>Cache Size</description>
+            <description>{size in bytes}</description>
+            <description>N</description>
+            <description>2000</description>
+            </item>
+            <item>
+            <description>Synchronous</description>
+            <description><b>Normal</b> - Normal file flushing behavior<br/><b>Full</b> - Full flushing after all writes<br/><b>Off</b> - Underlying OS flushes I/O's</description>
+            <description>N</description>
+            <description>Full</description>
+            </item>
+            <item>
+            <description>Page Size</description>
+            <description>{size in bytes}</description>
+            <description>N</description>
+            <description>1024</description>
+            </item>
+            <item>
+            <description>Password</description>
+            <description>{password} - Using this parameter requires that the CryptoAPI based codec be enabled at compile-time for both the native interop assembly and the core managed assemblies; otherwise, using this parameter may result in an exception being thrown when attempting to open the connection.</description>
+            <description>N</description>
+            <description></description>
+            </item>
+            <item>
+            <description>HexPassword</description>
+            <description>{hexPassword} - Must contain a sequence of zero or more hexadecimal encoded byte values without a leading "0x" prefix.  Using this parameter requires that the CryptoAPI based codec be enabled at compile-time for both the native interop assembly and the core managed assemblies; otherwise, using this parameter may result in an exception being thrown when attempting to open the connection.</description>
+            <description>N</description>
+            <description></description>
+            </item>
+            <item>
+            <description>Enlist</description>
+            <description><b>Y</b> - Automatically enlist in distributed transactions<br/><b>N</b> - No automatic enlistment</description>
+            <description>N</description>
+            <description>Y</description>
+            </item>
+            <item>
+            <description>Pooling</description>
+            <description>
+            <b>True</b> - Use connection pooling.<br/>
+            <b>False</b> - Do not use connection pooling.<br/><br/>
+            <b>WARNING:</b> When using the default connection pool implementation,
+            setting this property to True should be avoided by applications that make
+            use of COM (either directly or indirectly) due to possible deadlocks that
+            can occur during the finalization of some COM objects.
+            </description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>FailIfMissing</description>
+            <description><b>True</b> - Don't create the database if it does not exist, throw an error instead<br/><b>False</b> - Automatically create the database if it does not exist</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Max Page Count</description>
+            <description>{size in pages} - Limits the maximum number of pages (limits the size) of the database</description>
+            <description>N</description>
+            <description>0</description>
+            </item>
+            <item>
+            <description>Legacy Format</description>
+            <description><b>True</b> - Use the more compatible legacy 3.x database format<br/><b>False</b> - Use the newer 3.3x database format which compresses numbers more effectively</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Default Timeout</description>
+            <description>{time in seconds}<br/>The default command timeout</description>
+            <description>N</description>
+            <description>30</description>
+            </item>
+            <item>
+            <description>Journal Mode</description>
+            <description><b>Delete</b> - Delete the journal file after a commit<br/><b>Persist</b> - Zero out and leave the journal file on disk after a commit<br/><b>Off</b> - Disable the rollback journal entirely</description>
+            <description>N</description>
+            <description>Delete</description>
+            </item>
+            <item>
+            <description>Read Only</description>
+            <description><b>True</b> - Open the database for read only access<br/><b>False</b> - Open the database for normal read/write access</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Max Pool Size</description>
+            <description>The maximum number of connections for the given connection string that can be in the connection pool</description>
+            <description>N</description>
+            <description>100</description>
+            </item>
+            <item>
+            <description>Default IsolationLevel</description>
+            <description>The default transaciton isolation level</description>
+            <description>N</description>
+            <description>Serializable</description>
+            </item>
+            <item>
+            <description>Foreign Keys</description>
+            <description>Enable foreign key constraints</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Flags</description>
+            <description>Extra behavioral flags for the connection.  See the <see cref="T:System.Data.SQLite.SQLiteConnectionFlags"/> enumeration for possible values.</description>
+            <description>N</description>
+            <description>Default</description>
+            </item>
+            <item>
+            <description>SetDefaults</description>
+            <description>
+            <b>True</b> - Apply the default connection settings to the opened database.<br/>
+            <b>False</b> - Skip applying the default connection settings to the opened database.
+            </description>
+            <description>N</description>
+            <description>True</description>
+            </item>
+            <item>
+            <description>ToFullPath</description>
+            <description>
+            <b>True</b> - Attempt to expand the data source file name to a fully qualified path before opening.<br/>
+            <b>False</b> - Skip attempting to expand the data source file name to a fully qualified path before opening.
+            </description>
+            <description>N</description>
+            <description>True</description>
+            </item>
+            </list>
+            </remarks>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection.DefaultBaseSchemaName">
+            <summary>
+            The default "stub" (i.e. placeholder) base schema name to use when
+            returning column schema information.  Used as the initial value of
+            the BaseSchemaName property.  This should start with "sqlite_*"
+            because those names are reserved for use by SQLite (i.e. they cannot
+            be confused with the names of user objects).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._assembly">
+            <summary>
+            The managed assembly containing this type.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._syncRoot">
+            <summary>
+            Object used to synchronize access to the static instance data
+            for this class.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._connectionState">
+            <summary>
+            State of the current connection
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._connectionString">
+            <summary>
+            The connection string
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._transactionLevel">
+            <summary>
+            Nesting level of the transactions open on the connection
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._disposing">
+            <summary>
+            If set, then the connection is currently being disposed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._defaultIsolation">
+            <summary>
+            The default isolation level for new transactions
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._enlistment">
+            <summary>
+            Whether or not the connection is enlisted in a distrubuted transaction
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._sql">
+            <summary>
+            The base SQLite object to interop with
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._dataSource">
+            <summary>
+            The database filename minus path and extension
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._password">
+            <summary>
+            Temporary password storage, emptied after the database has been opened
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._baseSchemaName">
+            <summary>
+            The "stub" (i.e. placeholder) base schema name to use when returning
+            column schema information.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._flags">
+            <summary>
+            The extra behavioral flags for this connection, if any.  See the
+            <see cref="T:System.Data.SQLite.SQLiteConnectionFlags"/> enumeration for a list of
+            possible values.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._defaultTimeout">
+            <summary>
+            Default command timeout
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._parseViaFramework">
+            <summary>
+            Non-zero if the built-in (i.e. framework provided) connection string
+            parser should be used when opening the connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.#ctor">
+            <overloads>
+             Constructs a new SQLiteConnection object
+             </overloads>
+             <summary>
+             Default constructor
+             </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.#ctor(System.String)">
+            <summary>
+            Initializes the connection with the specified connection string.
+            </summary>
+            <param name="connectionString">The connection string to use.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.#ctor(System.IntPtr,System.String,System.Boolean)">
+            <summary>
+            Initializes the connection with a pre-existing native connection handle.
+            This constructor overload is intended to be used only by the private
+            <see cref="M:System.Data.SQLite.SQLiteModule.CreateOrConnect(System.Boolean,System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="db">
+            The native connection handle to use.
+            </param>
+            <param name="fileName">
+            The file name corresponding to the native connection handle.
+            </param>
+            <param name="ownHandle">
+            Non-zero if this instance owns the native connection handle and
+            should dispose of it when it is no longer needed.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.#ctor(System.String,System.Boolean)">
+            <summary>
+            Initializes the connection with the specified connection string.
+            </summary>
+            <param name="connectionString">
+            The connection string to use.
+            </param>
+            <param name="parseViaFramework">
+            Non-zero to parse the connection string using the built-in (i.e.
+            framework provided) parser when opening the connection.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.#ctor(System.Data.SQLite.SQLiteConnection)">
+            <summary>
+            Clones the settings and connection string from an existing connection.  If the existing connection is already open, this
+            function will open its own connection, enumerate any attached databases of the original connection, and automatically
+            attach to them.
+            </summary>
+            <param name="connection">The connection to copy the settings from.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.OnChanged(System.Data.SQLite.SQLiteConnection,System.Data.SQLite.ConnectionEventArgs)">
+            <summary>
+            Raises the <see cref="E:System.Data.SQLite.SQLiteConnection.Changed"/> event.
+            </summary>
+            <param name="connection">
+            The connection associated with this event.  If this parameter is not
+            null and the specified connection cannot raise events, then the
+            registered event handlers will not be invoked.
+            </param>
+            <param name="e">
+            A <see cref="T:System.Data.SQLite.ConnectionEventArgs"/> that contains the event data.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.CreateHandle(System.IntPtr)">
+            <summary>
+            Creates and returns a new managed database connection handle.  This
+            method is intended to be used by implementations of the
+            <see cref="T:System.Data.SQLite.ISQLiteConnectionPool"/> interface only.  In theory, it
+            could be used by other classes; however, that usage is not supported.
+            </summary>
+            <param name="nativeHandle">
+            This must be a native database connection handle returned by the
+            SQLite core library and it must remain valid and open during the
+            entire duration of the calling method.
+            </param>
+            <returns>
+            The new managed database connection handle or null if it cannot be
+            created.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BackupDatabase(System.Data.SQLite.SQLiteConnection,System.String,System.String,System.Int32,System.Data.SQLite.SQLiteBackupCallback,System.Int32)">
+            <summary>
+            Backs up the database, using the specified database connection as the
+            destination.
+            </summary>
+            <param name="destination">The destination database connection.</param>
+            <param name="destinationName">The destination database name.</param>
+            <param name="sourceName">The source database name.</param>
+            <param name="pages">
+            The number of pages to copy or negative to copy all remaining pages.
+            </param>
+            <param name="callback">
+            The method to invoke between each step of the backup process.  This
+            parameter may be null (i.e. no callbacks will be performed).
+            </param>
+            <param name="retryMilliseconds">
+            The number of milliseconds to sleep after encountering a locking error
+            during the backup process.  A value less than zero means that no sleep
+            should be performed.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BindFunction(System.Data.SQLite.SQLiteFunctionAttribute,System.Data.SQLite.SQLiteFunction)">
+            <summary>
+            Attempts to bind the specified <see cref="T:System.Data.SQLite.SQLiteFunction"/> object
+            instance to this connection.
+            </summary>
+            <param name="functionAttribute">
+            The <see cref="T:System.Data.SQLite.SQLiteFunctionAttribute"/> object instance containing
+            the metadata for the function to be bound.
+            </param>
+            <param name="function">
+            The <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance that implements the
+            function to be bound.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Clone">
+            <summary>
+            Creates a clone of the connection.  All attached databases and user-defined functions are cloned.  If the existing connection is open, the cloned connection
+            will also be opened.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.CreateFile(System.String)">
+            <summary>
+            Creates a database file.  This just creates a zero-byte file which SQLite
+            will turn into a database when the file is opened properly.
+            </summary>
+            <param name="databaseFileName">The file to create</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.OnStateChange(System.Data.ConnectionState,System.Data.StateChangeEventArgs@)">
+            <summary>
+            Raises the state change event when the state of the connection changes
+            </summary>
+            <param name="newState">The new connection state.  If this is different
+            from the previous state, the <see cref="E:System.Data.SQLite.SQLiteConnection.StateChange"/> event is
+            raised.</param>
+            <param name="eventArgs">The event data created for the raised event, if
+            it was actually raised.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.GetFallbackDefaultIsolationLevel">
+            <summary>
+            Determines and returns the fallback default isolation level when one cannot be
+            obtained from an existing connection instance.
+            </summary>
+            <returns>
+            The fallback default isolation level for this connection instance -OR-
+            <see cref="F:System.Data.IsolationLevel.Unspecified"/> if it cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.GetDefaultIsolationLevel">
+            <summary>
+            Determines and returns the default isolation level for this connection instance.
+            </summary>
+            <returns>
+            The default isolation level for this connection instance -OR-
+            <see cref="F:System.Data.IsolationLevel.Unspecified"/> if it cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BeginTransaction(System.Data.IsolationLevel,System.Boolean)">
+            <summary>
+            OBSOLETE.  Creates a new SQLiteTransaction if one isn't already active on the connection.
+            </summary>
+            <param name="isolationLevel">This parameter is ignored.</param>
+            <param name="deferredLock">When TRUE, SQLite defers obtaining a write lock until a write operation is requested.
+            When FALSE, a writelock is obtained immediately.  The default is TRUE, but in a multi-threaded multi-writer
+            environment, one may instead choose to lock the database immediately to avoid any possible writer deadlock.</param>
+            <returns>Returns a SQLiteTransaction object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BeginTransaction(System.Boolean)">
+            <summary>
+            OBSOLETE.  Creates a new SQLiteTransaction if one isn't already active on the connection.
+            </summary>
+            <param name="deferredLock">When TRUE, SQLite defers obtaining a write lock until a write operation is requested.
+            When FALSE, a writelock is obtained immediately.  The default is false, but in a multi-threaded multi-writer
+            environment, one may instead choose to lock the database immediately to avoid any possible writer deadlock.</param>
+            <returns>Returns a SQLiteTransaction object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BeginTransaction(System.Data.IsolationLevel)">
+            <summary>
+            Creates a new <see cref="T:System.Data.SQLite.SQLiteTransaction"/> if one isn't already active on the connection.
+            </summary>
+            <param name="isolationLevel">Supported isolation levels are Serializable, ReadCommitted and Unspecified.</param>
+            <remarks>
+            Unspecified will use the default isolation level specified in the connection string.  If no isolation level is specified in the
+            connection string, Serializable is used.
+            Serializable transactions are the default.  In this mode, the engine gets an immediate lock on the database, and no other threads
+            may begin a transaction.  Other threads may read from the database, but not write.
+            With a ReadCommitted isolation level, locks are deferred and elevated as needed.  It is possible for multiple threads to start
+            a transaction in ReadCommitted mode, but if a thread attempts to commit a transaction while another thread
+            has a ReadCommitted lock, it may timeout or cause a deadlock on both threads until both threads' CommandTimeout's are reached.
+            </remarks>
+            <returns>Returns a SQLiteTransaction object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BeginTransaction">
+            <summary>
+            Creates a new <see cref="T:System.Data.SQLite.SQLiteTransaction"/> if one isn't already
+            active on the connection.
+            </summary>
+            <returns>Returns the new transaction object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BeginDbTransaction(System.Data.IsolationLevel)">
+            <summary>
+            Forwards to the local <see cref="M:System.Data.SQLite.SQLiteConnection.BeginTransaction(System.Data.IsolationLevel)"/> function
+            </summary>
+            <param name="isolationLevel">Supported isolation levels are Unspecified, Serializable, and ReadCommitted</param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ChangeDatabase(System.String)">
+            <summary>
+            This method is not implemented; however, the <see cref="E:System.Data.SQLite.SQLiteConnection.Changed"/>
+            event will still be raised.
+            </summary>
+            <param name="databaseName"></param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Close">
+            <summary>
+            When the database connection is closed, all commands linked to this connection are automatically reset.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ClearPool(System.Data.SQLite.SQLiteConnection)">
+            <summary>
+            Clears the connection pool associated with the connection.  Any other active connections using the same database file
+            will be discarded instead of returned to the pool when they are closed.
+            </summary>
+            <param name="connection"></param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ClearAllPools">
+            <summary>
+            Clears all connection pools.  Any active connections will be discarded instead of sent to the pool when they are closed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.CreateCommand">
+            <summary>
+            Create a new <see cref="T:System.Data.SQLite.SQLiteCommand"/> and associate it with this connection.
+            </summary>
+            <returns>Returns a new command object already assigned to this connection.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.CreateDbCommand">
+            <summary>
+            Forwards to the local <see cref="M:System.Data.SQLite.SQLiteConnection.CreateCommand"/> function.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ParseConnectionString(System.String)">
+            <summary>
+            Parses the connection string into component parts using the custom
+            connection string parser.
+            </summary>
+            <param name="connectionString">The connection string to parse</param>
+            <returns>An array of key-value pairs representing each parameter of the connection string</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ParseConnectionStringViaFramework(System.String,System.Boolean)">
+            <summary>
+            Parses a connection string using the built-in (i.e. framework provided)
+            connection string parser class and returns the key/value pairs.  An
+            exception may be thrown if the connection string is invalid or cannot be
+            parsed.  When compiled for the .NET Compact Framework, the custom
+            connection string parser is always used instead because the framework
+            provided one is unavailable there.
+            </summary>
+            <param name="connectionString">
+            The connection string to parse.
+            </param>
+            <param name="strict">
+            Non-zero to throw an exception if any connection string values are not of
+            the <see cref="T:System.String"/> type.
+            </param>
+            <returns>The list of key/value pairs.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.EnlistTransaction(System.Transactions.Transaction)">
+            <summary>
+            Manual distributed transaction enlistment support
+            </summary>
+            <param name="transaction">The distributed transaction to enlist in</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.FindKey(System.Collections.Generic.SortedList{System.String,System.String},System.String,System.String)">
+            <summary>
+            Looks for a key in the array of key/values of the parameter string.  If not found, return the specified default value
+            </summary>
+            <param name="items">The list to look in</param>
+            <param name="key">The key to find</param>
+            <param name="defValue">The default value to return if the key is not found</param>
+            <returns>The value corresponding to the specified key, or the default value if not found.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.TryParseEnum(System.Type,System.String,System.Boolean)">
+            <summary>
+            Attempts to convert the string value to an enumerated value of the specified type.
+            </summary>
+            <param name="type">The enumerated type to convert the string value to.</param>
+            <param name="value">The string value to be converted.</param>
+            <param name="ignoreCase">Non-zero to make the conversion case-insensitive.</param>
+            <returns>The enumerated value upon success or null upon error.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.TryParseByte(System.String,System.Globalization.NumberStyles,System.Byte@)">
+            <summary>
+            Attempts to convert an input string into a byte value.
+            </summary>
+            <param name="value">
+            The string value to be converted.
+            </param>
+            <param name="style">
+            The number styles to use for the conversion.
+            </param>
+            <param name="result">
+            Upon sucess, this will contain the parsed byte value.
+            Upon failure, the value of this parameter is undefined.
+            </param>
+            <returns>
+            Non-zero upon success; zero on failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.EnableExtensions(System.Boolean)">
+            <summary>
+            Enables or disabled extension loading.
+            </summary>
+            <param name="enable">
+            True to enable loading of extensions, false to disable.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.LoadExtension(System.String)">
+            <summary>
+            Loads a SQLite extension library from the named dynamic link library file.
+            </summary>
+            <param name="fileName">
+            The name of the dynamic link library file containing the extension.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.LoadExtension(System.String,System.String)">
+            <summary>
+            Loads a SQLite extension library from the named dynamic link library file.
+            </summary>
+            <param name="fileName">
+            The name of the dynamic link library file containing the extension.
+            </param>
+            <param name="procName">
+            The name of the exported function used to initialize the extension.
+            If null, the default "sqlite3_extension_init" will be used.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.CreateModule(System.Data.SQLite.SQLiteModule)">
+            <summary>
+            Creates a disposable module containing the implementation of a virtual
+            table.
+            </summary>
+            <param name="module">
+            The module object to be used when creating the disposable module.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.FromHexString(System.String)">
+            <summary>
+            Parses a string containing a sequence of zero or more hexadecimal
+            encoded byte values and returns the resulting byte array.  The
+            "0x" prefix is not allowed on the input string.
+            </summary>
+            <param name="text">
+            The input string containing zero or more hexadecimal encoded byte
+            values.
+            </param>
+            <returns>
+            A byte array containing the parsed byte values or null if an error
+            was encountered.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ToHexString(System.Byte[])">
+            <summary>
+            Creates and returns a string containing the hexadecimal encoded byte
+            values from the input array.
+            </summary>
+            <param name="array">
+            The input array of bytes.
+            </param>
+            <returns>
+            The resulting string or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.FromHexString(System.String,System.String@)">
+            <summary>
+            Parses a string containing a sequence of zero or more hexadecimal
+            encoded byte values and returns the resulting byte array.  The
+            "0x" prefix is not allowed on the input string.
+            </summary>
+            <param name="text">
+            The input string containing zero or more hexadecimal encoded byte
+            values.
+            </param>
+            <param name="error">
+            Upon failure, this will contain an appropriate error message.
+            </param>
+            <returns>
+            A byte array containing the parsed byte values or null if an error
+            was encountered.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Open">
+            <summary>
+            Opens the connection using the parameters found in the <see cref="P:System.Data.SQLite.SQLiteConnection.ConnectionString"/>.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.OpenAndReturn">
+            <summary>
+            Opens the connection using the parameters found in the <see cref="P:System.Data.SQLite.SQLiteConnection.ConnectionString"/> and then returns it.
+            </summary>
+            <returns>The current connection object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Cancel">
+            <summary>
+            This method causes any pending database operation to abort and return at
+            its earliest opportunity.  This routine is typically called in response
+            to a user action such as pressing "Cancel" or Ctrl-C where the user wants
+            a long query operation to halt immediately.  It is safe to call this
+            routine from any thread.  However, it is not safe to call this routine
+            with a database connection that is closed or might close before this method
+            returns.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.GetMemoryStatistics(System.Collections.Generic.IDictionary{System.String,System.Int64}@)">
+            <summary>
+            Returns various global memory statistics for the SQLite core library via
+            a dictionary of key/value pairs.  Currently, only the "MemoryUsed" and
+            "MemoryHighwater" keys are returned and they have values that correspond
+            to the values that could be obtained via the <see cref="P:System.Data.SQLite.SQLiteConnection.MemoryUsed"/>
+            and <see cref="P:System.Data.SQLite.SQLiteConnection.MemoryHighwater"/> connection properties.
+            </summary>
+            <param name="statistics">
+            This dictionary will be populated with the global memory statistics.  It
+            will be created if necessary.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ReleaseMemory">
+            <summary>
+            Attempts to free as much heap memory as possible for this database connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ReleaseMemory(System.Int32,System.Boolean,System.Boolean,System.Int32@,System.Boolean@,System.UInt32@)">
+            <summary>
+            Attempts to free N bytes of heap memory by deallocating non-essential memory
+            allocations held by the database library. Memory used to cache database pages
+            to improve performance is an example of non-essential memory.  This is a no-op
+            returning zero if the SQLite core library was not compiled with the compile-time
+            option SQLITE_ENABLE_MEMORY_MANAGEMENT.  Optionally, attempts to reset and/or
+            compact the Win32 native heap, if applicable.
+            </summary>
+            <param name="nBytes">
+            The requested number of bytes to free.
+            </param>
+            <param name="reset">
+            Non-zero to attempt a heap reset.
+            </param>
+            <param name="compact">
+            Non-zero to attempt heap compaction.
+            </param>
+            <param name="nFree">
+            The number of bytes actually freed.  This value may be zero.
+            </param>
+            <param name="resetOk">
+            This value will be non-zero if the heap reset was successful.
+            </param>
+            <param name="nLargest">
+            The size of the largest committed free block in the heap, in bytes.
+            This value will be zero unless heap compaction is enabled.
+            </param>
+            <returns>
+            A standard SQLite return code (i.e. zero for success and non-zero
+            for failure).
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.SetMemoryStatus(System.Boolean)">
+            <summary>
+            Sets the status of the memory usage tracking subsystem in the SQLite core library.  By default, this is enabled.
+            If this is disabled, memory usage tracking will not be performed.  This is not really a per-connection value, it is
+            global to the process.
+            </summary>
+            <param name="value">Non-zero to enable memory usage tracking, zero otherwise.</param>
+            <returns>A standard SQLite return code (i.e. zero for success and non-zero for failure).</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Shutdown">
+            <summary>
+            Passes a shutdown request to the SQLite core library.  Does not throw
+            an exception if the shutdown request fails.
+            </summary>
+            <returns>
+            A standard SQLite return code (i.e. zero for success and non-zero for
+            failure).
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Shutdown(System.Boolean,System.Boolean)">
+            <summary>
+            Passes a shutdown request to the SQLite core library.  Throws an
+            exception if the shutdown request fails and the no-throw parameter
+            is non-zero.
+            </summary>
+            <param name="directories">
+            Non-zero to reset the database and temporary directories to their
+            default values, which should be null for both.
+            </param>
+            <param name="noThrow">
+            When non-zero, throw an exception if the shutdown request fails.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.SetExtendedResultCodes(System.Boolean)">
+            Enables or disabled extended result codes returned by SQLite
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ResultCode">
+            Enables or disabled extended result codes returned by SQLite
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ExtendedResultCode">
+            Enables or disabled extended result codes returned by SQLite
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.LogMessage(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            Add a log message via the SQLite sqlite3_log interface.
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.LogMessage(System.Int32,System.String)">
+            Add a log message via the SQLite sqlite3_log interface.
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ChangePassword(System.String)">
+            <summary>
+            Change the password (or assign a password) to an open database.
+            </summary>
+            <remarks>
+            No readers or writers may be active for this process.  The database must already be open
+            and if it already was password protected, the existing password must already have been supplied.
+            </remarks>
+            <param name="newPassword">The new password to assign to the database</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ChangePassword(System.Byte[])">
+            <summary>
+            Change the password (or assign a password) to an open database.
+            </summary>
+            <remarks>
+            No readers or writers may be active for this process.  The database must already be open
+            and if it already was password protected, the existing password must already have been supplied.
+            </remarks>
+            <param name="newPassword">The new password to assign to the database</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.SetPassword(System.String)">
+            <summary>
+            Sets the password for a password-protected database.  A password-protected database is
+            unusable for any operation until the password has been set.
+            </summary>
+            <param name="databasePassword">The password for the database</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.SetPassword(System.Byte[])">
+            <summary>
+            Sets the password for a password-protected database.  A password-protected database is
+            unusable for any operation until the password has been set.
+            </summary>
+            <param name="databasePassword">The password for the database</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.SetAvRetry(System.Int32@,System.Int32@)">
+            <summary>
+            Queries or modifies the number of retries or the retry interval (in milliseconds) for
+            certain I/O operations that may fail due to anti-virus software.
+            </summary>
+            <param name="count">The number of times to retry the I/O operation.  A negative value
+            will cause the current count to be queried and replace that negative value.</param>
+            <param name="interval">The number of milliseconds to wait before retrying the I/O
+            operation.  This number is multiplied by the number of retry attempts so far to come
+            up with the final number of milliseconds to wait.  A negative value will cause the
+            current interval to be queried and replace that negative value.</param>
+            <returns>Zero for success, non-zero for error.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.UnwrapString(System.String)">
+            <summary>
+            Removes one set of surrounding single -OR- double quotes from the string
+            value and returns the resulting string value.  If the string is null, empty,
+            or contains quotes that are not balanced, nothing is done and the original
+            string value will be returned.
+            </summary>
+            <param name="value">The string value to process.</param>
+            <returns>
+            The string value, modified to remove one set of surrounding single -OR-
+            double quotes, if applicable.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ExpandFileName(System.String,System.Boolean)">
+            <summary>
+            Expand the filename of the data source, resolving the |DataDirectory|
+            macro as appropriate.
+            </summary>
+            <param name="sourceFile">The database filename to expand</param>
+            <param name="toFullPath">
+            Non-zero if the returned file name should be converted to a full path
+            (except when using the .NET Compact Framework).
+            </param>
+            <returns>The expanded path and filename of the filename</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.GetSchema">
+            <overloads>
+             The following commands are used to extract schema information out of the database.  Valid schema types are:
+             <list type="bullet">
+             <item>
+             <description>MetaDataCollections</description>
+             </item>
+             <item>
+             <description>DataSourceInformation</description>
+             </item>
+             <item>
+             <description>Catalogs</description>
+             </item>
+             <item>
+             <description>Columns</description>
+             </item>
+             <item>
+             <description>ForeignKeys</description>
+             </item>
+             <item>
+             <description>Indexes</description>
+             </item>
+             <item>
+             <description>IndexColumns</description>
+             </item>
+             <item>
+             <description>Tables</description>
+             </item>
+             <item>
+             <description>Views</description>
+             </item>
+             <item>
+             <description>ViewColumns</description>
+             </item>
+             </list>
+             </overloads>
+             <summary>
+             Returns the MetaDataCollections schema
+             </summary>
+             <returns>A DataTable of the MetaDataCollections schema</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.GetSchema(System.String)">
+            <summary>
+            Returns schema information of the specified collection
+            </summary>
+            <param name="collectionName">The schema collection to retrieve</param>
+            <returns>A DataTable of the specified collection</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.GetSchema(System.String,System.String[])">
+            <summary>
+            Retrieves schema information using the specified constraint(s) for the specified collection
+            </summary>
+            <param name="collectionName">The collection to retrieve</param>
+            <param name="restrictionValues">The restrictions to impose</param>
+            <returns>A DataTable of the specified collection</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_MetaDataCollections">
+            <summary>
+            Builds a MetaDataCollections schema datatable
+            </summary>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_DataSourceInformation">
+            <summary>
+            Builds a DataSourceInformation datatable
+            </summary>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_Columns(System.String,System.String,System.String)">
+            <summary>
+            Build a Columns schema
+            </summary>
+            <param name="strCatalog">The catalog (attached database) to query, can be null</param>
+            <param name="strTable">The table to retrieve schema information for, must not be null</param>
+            <param name="strColumn">The column to retrieve schema information for, can be null</param>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_Indexes(System.String,System.String,System.String)">
+            <summary>
+            Returns index information for the given database and catalog
+            </summary>
+            <param name="strCatalog">The catalog (attached database) to query, can be null</param>
+            <param name="strIndex">The name of the index to retrieve information for, can be null</param>
+            <param name="strTable">The table to retrieve index information for, can be null</param>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_Tables(System.String,System.String,System.String)">
+            <summary>
+            Retrieves table schema information for the database and catalog
+            </summary>
+            <param name="strCatalog">The catalog (attached database) to retrieve tables on</param>
+            <param name="strTable">The table to retrieve, can be null</param>
+            <param name="strType">The table type, can be null</param>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_Views(System.String,System.String)">
+            <summary>
+            Retrieves view schema information for the database
+            </summary>
+            <param name="strCatalog">The catalog (attached database) to retrieve views on</param>
+            <param name="strView">The view name, can be null</param>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_Catalogs(System.String)">
+            <summary>
+            Retrieves catalog (attached databases) schema information for the database
+            </summary>
+            <param name="strCatalog">The catalog to retrieve, can be null</param>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_IndexColumns(System.String,System.String,System.String,System.String)">
+            <summary>
+            Returns the base column information for indexes in a database
+            </summary>
+            <param name="strCatalog">The catalog to retrieve indexes for (can be null)</param>
+            <param name="strTable">The table to restrict index information by (can be null)</param>
+            <param name="strIndex">The index to restrict index information by (can be null)</param>
+            <param name="strColumn">The source column to restrict index information by (can be null)</param>
+            <returns>A DataTable containing the results</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_ViewColumns(System.String,System.String,System.String)">
+            <summary>
+            Returns detailed column information for a specified view
+            </summary>
+            <param name="strCatalog">The catalog to retrieve columns for (can be null)</param>
+            <param name="strView">The view to restrict column information by (can be null)</param>
+            <param name="strColumn">The source column to restrict column information by (can be null)</param>
+            <returns>A DataTable containing the results</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_ForeignKeys(System.String,System.String,System.String)">
+            <summary>
+            Retrieves foreign key information from the specified set of filters
+            </summary>
+            <param name="strCatalog">An optional catalog to restrict results on</param>
+            <param name="strTable">An optional table to restrict results on</param>
+            <param name="strKeyName">An optional foreign key name to restrict results on</param>
+            <returns>A DataTable with the results of the query</returns>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection._handlers">
+            <summary>
+            Static variable to store the connection event handlers to call.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.StateChange">
+            <summary>
+            This event is raised whenever the database is opened or closed.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.Changed">
+            <summary>
+            This event is raised when events related to the lifecycle of a
+            SQLiteConnection object occur.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.ConnectionPool">
+            <summary>
+            This property is used to obtain or set the custom connection pool
+            implementation to use, if any.  Setting this property to null will
+            cause the default connection pool implementation to be used.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.PoolCount">
+            <summary>
+            Returns the number of pool entries for the file name associated with this connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.ConnectionString">
+            <summary>
+            The connection string containing the parameters for the connection
+            </summary>
+            <remarks>
+            <list type="table">
+            <listheader>
+            <term>Parameter</term>
+            <term>Values</term>
+            <term>Required</term>
+            <term>Default</term>
+            </listheader>
+            <item>
+            <description>Data Source</description>
+            <description>
+            This may be a file name, the string ":memory:", or any supported URI (starting with SQLite 3.7.7).
+            Starting with release 1.0.86.0, in order to use more than one consecutive backslash (e.g. for a
+            UNC path), each of the adjoining backslash characters must be doubled (e.g. "\\Network\Share\test.db"
+            would become "\\\\Network\Share\test.db").
+            </description>
+            <description>Y</description>
+            <description></description>
+            </item>
+            <item>
+            <description>Version</description>
+            <description>3</description>
+            <description>N</description>
+            <description>3</description>
+            </item>
+            <item>
+            <description>UseUTF16Encoding</description>
+            <description><b>True</b><br/><b>False</b></description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>DateTimeFormat</description>
+            <description>
+            <b>Ticks</b> - Use the value of DateTime.Ticks.<br/>
+            <b>ISO8601</b> - Use the ISO-8601 format.  Uses the "yyyy-MM-dd HH:mm:ss.FFFFFFFK" format for UTC
+            DateTime values and "yyyy-MM-dd HH:mm:ss.FFFFFFF" format for local DateTime values).<br/>
+            <b>JulianDay</b> - The interval of time in days and fractions of a day since January 1, 4713 BC.<br/>
+            <b>UnixEpoch</b> - The whole number of seconds since the Unix epoch (January 1, 1970).<br/>
+            <b>InvariantCulture</b> - Any culture-independent string value that the .NET Framework can interpret as a valid DateTime.<br/>
+            <b>CurrentCulture</b> - Any string value that the .NET Framework can interpret as a valid DateTime using the current culture.</description>
+            <description>N</description>
+            <description>ISO8601</description>
+            </item>
+            <item>
+            <description>DateTimeKind</description>
+            <description><b>Unspecified</b> - Not specified as either UTC or local time.<br/><b>Utc</b> - The time represented is UTC.<br/><b>Local</b> - The time represented is local time.</description>
+            <description>N</description>
+            <description>Unspecified</description>
+            </item>
+            <item>
+            <description>DateTimeFormatString</description>
+            <description>The exact DateTime format string to use for all formatting and parsing of all DateTime
+            values for this connection.</description>
+            <description>N</description>
+            <description>null</description>
+            </item>
+            <item>
+            <description>BaseSchemaName</description>
+            <description>Some base data classes in the framework (e.g. those that build SQL queries dynamically)
+            assume that an ADO.NET provider cannot support an alternate catalog (i.e. database) without supporting
+            alternate schemas as well; however, SQLite does not fit into this model.  Therefore, this value is used
+            as a placeholder and removed prior to preparing any SQL statements that may contain it.</description>
+            <description>N</description>
+            <description>sqlite_default_schema</description>
+            </item>
+            <item>
+            <description>BinaryGUID</description>
+            <description><b>True</b> - Store GUID columns in binary form<br/><b>False</b> - Store GUID columns as text</description>
+            <description>N</description>
+            <description>True</description>
+            </item>
+            <item>
+            <description>Cache Size</description>
+            <description>{size in bytes}</description>
+            <description>N</description>
+            <description>2000</description>
+            </item>
+            <item>
+            <description>Synchronous</description>
+            <description><b>Normal</b> - Normal file flushing behavior<br/><b>Full</b> - Full flushing after all writes<br/><b>Off</b> - Underlying OS flushes I/O's</description>
+            <description>N</description>
+            <description>Full</description>
+            </item>
+            <item>
+            <description>Page Size</description>
+            <description>{size in bytes}</description>
+            <description>N</description>
+            <description>1024</description>
+            </item>
+            <item>
+            <description>Password</description>
+            <description>{password} - Using this parameter requires that the CryptoAPI based codec be enabled at compile-time for both the native interop assembly and the core managed assemblies; otherwise, using this parameter may result in an exception being thrown when attempting to open the connection.</description>
+            <description>N</description>
+            <description></description>
+            </item>
+            <item>
+            <description>HexPassword</description>
+            <description>{hexPassword} - Must contain a sequence of zero or more hexadecimal encoded byte values without a leading "0x" prefix.  Using this parameter requires that the CryptoAPI based codec be enabled at compile-time for both the native interop assembly and the core managed assemblies; otherwise, using this parameter may result in an exception being thrown when attempting to open the connection.</description>
+            <description>N</description>
+            <description></description>
+            </item>
+            <item>
+            <description>Enlist</description>
+            <description><b>Y</b> - Automatically enlist in distributed transactions<br/><b>N</b> - No automatic enlistment</description>
+            <description>N</description>
+            <description>Y</description>
+            </item>
+            <item>
+            <description>Pooling</description>
+            <description>
+            <b>True</b> - Use connection pooling.<br/>
+            <b>False</b> - Do not use connection pooling.<br/><br/>
+            <b>WARNING:</b> When using the default connection pool implementation,
+            setting this property to True should be avoided by applications that
+            make use of COM (either directly or indirectly) due to possible
+            deadlocks that can occur during the finalization of some COM objects.
+            </description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>FailIfMissing</description>
+            <description><b>True</b> - Don't create the database if it does not exist, throw an error instead<br/><b>False</b> - Automatically create the database if it does not exist</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Max Page Count</description>
+            <description>{size in pages} - Limits the maximum number of pages (limits the size) of the database</description>
+            <description>N</description>
+            <description>0</description>
+            </item>
+            <item>
+            <description>Legacy Format</description>
+            <description><b>True</b> - Use the more compatible legacy 3.x database format<br/><b>False</b> - Use the newer 3.3x database format which compresses numbers more effectively</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Default Timeout</description>
+            <description>{time in seconds}<br/>The default command timeout</description>
+            <description>N</description>
+            <description>30</description>
+            </item>
+            <item>
+            <description>Journal Mode</description>
+            <description><b>Delete</b> - Delete the journal file after a commit<br/><b>Persist</b> - Zero out and leave the journal file on disk after a commit<br/><b>Off</b> - Disable the rollback journal entirely</description>
+            <description>N</description>
+            <description>Delete</description>
+            </item>
+            <item>
+            <description>Read Only</description>
+            <description><b>True</b> - Open the database for read only access<br/><b>False</b> - Open the database for normal read/write access</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Max Pool Size</description>
+            <description>The maximum number of connections for the given connection string that can be in the connection pool</description>
+            <description>N</description>
+            <description>100</description>
+            </item>
+            <item>
+            <description>Default IsolationLevel</description>
+            <description>The default transaciton isolation level</description>
+            <description>N</description>
+            <description>Serializable</description>
+            </item>
+            <item>
+            <description>Foreign Keys</description>
+            <description>Enable foreign key constraints</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Flags</description>
+            <description>Extra behavioral flags for the connection.  See the <see cref="T:System.Data.SQLite.SQLiteConnectionFlags"/> enumeration for possible values.</description>
+            <description>N</description>
+            <description>Default</description>
+            </item>
+            <item>
+            <description>SetDefaults</description>
+            <description>
+            <b>True</b> - Apply the default connection settings to the opened database.<br/>
+            <b>False</b> - Skip applying the default connection settings to the opened database.
+            </description>
+            <description>N</description>
+            <description>True</description>
+            </item>
+            <item>
+            <description>ToFullPath</description>
+            <description>
+            <b>True</b> - Attempt to expand the data source file name to a fully qualified path before opening.<br/>
+            <b>False</b> - Skip attempting to expand the data source file name to a fully qualified path before opening.
+            </description>
+            <description>N</description>
+            <description>True</description>
+            </item>
+            </list>
+            </remarks>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.DataSource">
+            <summary>
+            Returns the data source file name without extension or path.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.Database">
+            <summary>
+            Returns the string "main".
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.DefaultTimeout">
+            <summary>
+            Gets/sets the default command timeout for newly-created commands.  This is especially useful for
+            commands used internally such as inside a SQLiteTransaction, where setting the timeout is not possible.
+            This can also be set in the ConnectionString with "Default Timeout"
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.ParseViaFramework">
+            <summary>
+            Non-zero if the built-in (i.e. framework provided) connection string
+            parser should be used when opening the connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.Flags">
+            <summary>
+            Gets/sets the extra behavioral flags for this connection.  See the
+            <see cref="T:System.Data.SQLite.SQLiteConnectionFlags"/> enumeration for a list of
+            possible values.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.OwnHandle">
+            <summary>
+            Returns non-zero if the underlying native connection handle is
+            owned by this instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.ServerVersion">
+            <summary>
+            Returns the version of the underlying SQLite database engine
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.LastInsertRowId">
+            <summary>
+            Returns the rowid of the most recent successful INSERT into the database from this connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.Changes">
+            <summary>
+            Returns the number of rows changed by the last INSERT, UPDATE, or DELETE statement executed on
+            this connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.AutoCommit">
+            <summary>
+            Returns non-zero if the given database connection is in autocommit mode.
+            Autocommit mode is on by default.  Autocommit mode is disabled by a BEGIN
+            statement.  Autocommit mode is re-enabled by a COMMIT or ROLLBACK.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.MemoryUsed">
+            <summary>
+            Returns the amount of memory (in bytes) currently in use by the SQLite core library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.MemoryHighwater">
+            <summary>
+            Returns the maximum amount of memory (in bytes) used by the SQLite core library since the high-water mark was last reset.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.DefineConstants">
+            <summary>
+            Returns a string containing the define constants (i.e. compile-time
+            options) used to compile the core managed assembly, delimited with
+            spaces.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.SQLiteVersion">
+            <summary>
+            Returns the version of the underlying SQLite core library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.SQLiteSourceId">
+            <summary>
+            This method returns the string whose value is the same as the
+            SQLITE_SOURCE_ID C preprocessor macro used when compiling the
+            SQLite core library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.InteropVersion">
+            <summary>
+            This method returns the version of the interop SQLite assembly
+            used.  If the SQLite interop assembly is not in use or the
+            necessary information cannot be obtained for any reason, a null
+            value may be returned.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.InteropSourceId">
+            <summary>
+            This method returns the string whose value contains the unique
+            identifier for the source checkout used to build the interop
+            assembly.  If the SQLite interop assembly is not in use or the
+            necessary information cannot be obtained for any reason, a null
+            value may be returned.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.ProviderVersion">
+            <summary>
+            This method returns the version of the managed components used
+            to interact with the SQLite core library.  If the necessary
+            information cannot be obtained for any reason, a null value may
+            be returned.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.ProviderSourceId">
+            <summary>
+            This method returns the string whose value contains the unique
+            identifier for the source checkout used to build the managed
+            components currently executing.  If the necessary information
+            cannot be obtained for any reason, a null value may be returned.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.State">
+            <summary>
+            Returns the state of the connection.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.Authorize">
+            <summary>
+            This event is raised whenever SQLite encounters an action covered by the
+            authorizer during query preparation.  Changing the value of the
+            <see cref="F:System.Data.SQLite.AuthorizerEventArgs.ReturnCode"/> property will determine if
+            the specific action will be allowed, ignored, or denied.  For the entire
+            duration of the event, the associated connection and statement objects
+            must not be modified, either directly or indirectly, by the called code.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.Update">
+            <summary>
+            This event is raised whenever SQLite makes an update/delete/insert into the database on
+            this connection.  It only applies to the given connection.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.Commit">
+            <summary>
+            This event is raised whenever SQLite is committing a transaction.
+            Return non-zero to trigger a rollback.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.Trace">
+            <summary>
+            This event is raised whenever SQLite statement first begins executing on
+            this connection.  It only applies to the given connection.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.RollBack">
+            <summary>
+            This event is raised whenever SQLite is rolling back a transaction.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.DbProviderFactory">
+            <summary>
+            Returns the <see cref="T:System.Data.SQLite.SQLiteFactory"/> instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SynchronizationModes">
+            <summary>
+            The I/O file cache flushing behavior for the connection
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SynchronizationModes.Normal">
+            <summary>
+            Normal file flushing at critical sections of the code
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SynchronizationModes.Full">
+            <summary>
+            Full file flushing after every write operation
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SynchronizationModes.Off">
+            <summary>
+            Use the default operating system's file flushing, SQLite does not explicitly flush the file buffers after writing
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteAuthorizerEventHandler">
+            <summary>
+            Raised when authorization is required to perform an action contained
+            within a SQL query.
+            </summary>
+            <param name="sender">The connection performing the action.</param>
+            <param name="e">A <see cref="T:System.Data.SQLite.AuthorizerEventArgs"/> that contains the
+            event data.</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteCommitHandler">
+            <summary>
+            Raised when a transaction is about to be committed.  To roll back a transaction, set the
+            rollbackTrans boolean value to true.
+            </summary>
+            <param name="sender">The connection committing the transaction</param>
+            <param name="e">Event arguments on the transaction</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteUpdateEventHandler">
+            <summary>
+            Raised when data is inserted, updated and deleted on a given connection
+            </summary>
+            <param name="sender">The connection committing the transaction</param>
+            <param name="e">The event parameters which triggered the event</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteTraceEventHandler">
+            <summary>
+            Raised when a statement first begins executing on a given connection
+            </summary>
+            <param name="sender">The connection executing the statement</param>
+            <param name="e">Event arguments of the trace</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteBackupCallback">
+            <summary>
+            Raised between each backup step.
+            </summary>
+            <param name="source">
+            The source database connection.
+            </param>
+            <param name="sourceName">
+            The source database name.
+            </param>
+            <param name="destination">
+            The destination database connection.
+            </param>
+            <param name="destinationName">
+            The destination database name.
+            </param>
+            <param name="pages">
+            The number of pages copied with each step.
+            </param>
+            <param name="remainingPages">
+            The number of pages remaining to be copied.
+            </param>
+            <param name="totalPages">
+            The total number of pages in the source database.
+            </param>
+            <param name="retry">
+            Set to true if the operation needs to be retried due to database
+            locking issues; otherwise, set to false.
+            </param>
+            <returns>
+            True to continue with the backup process or false to halt the backup
+            process, rolling back any changes that have been made so far.
+            </returns>
+        </member>
+        <member name="T:System.Data.SQLite.AuthorizerEventArgs">
+            <summary>
+            The data associated with a call into the authorizer.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.UserData">
+            <summary>
+            The user-defined native data associated with this event.  Currently,
+            this will always contain the value of <see cref="F:System.IntPtr.Zero"/>.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.ActionCode">
+            <summary>
+            The action code responsible for the current call into the authorizer.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.Argument1">
+            <summary>
+            The first string argument for the current call into the authorizer.
+            The exact value will vary based on the action code, see the
+            <see cref="T:System.Data.SQLite.SQLiteAuthorizerActionCode"/> enumeration for possible
+            values.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.Argument2">
+            <summary>
+            The second string argument for the current call into the authorizer.
+            The exact value will vary based on the action code, see the
+            <see cref="T:System.Data.SQLite.SQLiteAuthorizerActionCode"/> enumeration for possible
+            values.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.Database">
+            <summary>
+            The database name for the current call into the authorizer, if
+            applicable.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.Context">
+            <summary>
+            The name of the inner-most trigger or view that is responsible for
+            the access attempt or a null value if this access attempt is directly
+            from top-level SQL code.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.ReturnCode">
+            <summary>
+            The return code for the current call into the authorizer.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.AuthorizerEventArgs.#ctor">
+            <summary>
+            Constructs an instance of this class with default property values.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.AuthorizerEventArgs.#ctor(System.IntPtr,System.Data.SQLite.SQLiteAuthorizerActionCode,System.String,System.String,System.String,System.String,System.Data.SQLite.SQLiteAuthorizerReturnCode)">
+            <summary>
+            Constructs an instance of this class with specific property values.
+            </summary>
+            <param name="pUserData">
+            The user-defined native data associated with this event.
+            </param>
+            <param name="actionCode">
+            The authorizer action code.
+            </param>
+            <param name="argument1">
+            The first authorizer argument.
+            </param>
+            <param name="argument2">
+            The second authorizer argument.
+            </param>
+            <param name="database">
+            The database name, if applicable.
+            </param>
+            <param name="context">
+            The name of the inner-most trigger or view that is responsible for
+            the access attempt or a null value if this access attempt is directly
+            from top-level SQL code.
+            </param>
+            <param name="returnCode">
+            The authorizer return code.
+            </param>
+        </member>
+        <member name="T:System.Data.SQLite.UpdateEventType">
+            <summary>
+            Whenever an update event is triggered on a connection, this enum will indicate
+            exactly what type of operation is being performed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventType.Delete">
+            <summary>
+            A row is being deleted from the given database and table
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventType.Insert">
+            <summary>
+            A row is being inserted into the table.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventType.Update">
+            <summary>
+            A row is being updated in the table.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.UpdateEventArgs">
+            <summary>
+            Passed during an Update callback, these event arguments detail the type of update operation being performed
+            on the given connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventArgs.Database">
+            <summary>
+            The name of the database being updated (usually "main" but can be any attached or temporary database)
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventArgs.Table">
+            <summary>
+            The name of the table being updated
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventArgs.Event">
+            <summary>
+            The type of update being performed (insert/update/delete)
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventArgs.RowId">
+            <summary>
+            The RowId affected by this update.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.CommitEventArgs">
+            <summary>
+            Event arguments raised when a transaction is being committed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CommitEventArgs.AbortTransaction">
+            <summary>
+            Set to true to abort the transaction and trigger a rollback
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.TraceEventArgs">
+            <summary>
+            Passed during an Trace callback, these event arguments contain the UTF-8 rendering of the SQL statement text
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TraceEventArgs.Statement">
+            <summary>
+            SQL statement text as the statement first begins executing
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.ISQLiteConnectionPool">
+            <summary>
+            This interface represents a custom connection pool implementation
+            usable by System.Data.SQLite.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteConnectionPool.GetCounts(System.String,System.Collections.Generic.Dictionary{System.String,System.Int32}@,System.Int32@,System.Int32@,System.Int32@)">
+            <summary>
+            Counts the number of pool entries matching the specified file name.
+            </summary>
+            <param name="fileName">
+            The file name to match or null to match all files.
+            </param>
+            <param name="counts">
+            The pool entry counts for each matching file.
+            </param>
+            <param name="openCount">
+            The total number of connections successfully opened from any pool.
+            </param>
+            <param name="closeCount">
+            The total number of connections successfully closed from any pool.
+            </param>
+            <param name="totalCount">
+            The total number of pool entries for all matching files.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteConnectionPool.ClearPool(System.String)">
+            <summary>
+            Disposes of all pooled connections associated with the specified
+            database file name.
+            </summary>
+            <param name="fileName">
+            The database file name.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteConnectionPool.ClearAllPools">
+            <summary>
+            Disposes of all pooled connections.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteConnectionPool.Add(System.String,System.Object,System.Int32)">
+            <summary>
+            Adds a connection to the pool of those associated with the
+            specified database file name.
+            </summary>
+            <param name="fileName">
+            The database file name.
+            </param>
+            <param name="handle">
+            The database connection handle.
+            </param>
+            <param name="version">
+            The connection pool version at the point the database connection
+            handle was received from the connection pool.  This is also the
+            connection pool version that the database connection handle was
+            created under.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteConnectionPool.Remove(System.String,System.Int32,System.Int32@)">
+            <summary>
+            Removes a connection from the pool of those associated with the
+            specified database file name with the intent of using it to
+            interact with the database.
+            </summary>
+            <param name="fileName">
+            The database file name.
+            </param>
+            <param name="maxPoolSize">
+            The new maximum size of the connection pool for the specified
+            database file name.
+            </param>
+            <param name="version">
+            The connection pool version associated with the returned database
+            connection handle, if any.
+            </param>
+            <returns>
+            The database connection handle associated with the specified
+            database file name or null if it cannot be obtained.
+            </returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnectionPool">
+            <summary>
+            This default method implementations in this class should not be used by
+            applications that make use of COM (either directly or indirectly) due
+            to possible deadlocks that can occur during finalization of some COM
+            objects.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool._syncRoot">
+            <summary>
+            This field is used to synchronize access to the private static data
+            in this class.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool._connectionPool">
+            <summary>
+            When this field is non-null, it will be used to provide the
+            implementation of all the connection pool methods; otherwise,
+            the default method implementations will be used.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool._queueList">
+            <summary>
+            The dictionary of connection pools, based on the normalized file
+            name of the SQLite database.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool._poolVersion">
+            <summary>
+            The default version number new pools will get.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool._poolOpened">
+            <summary>
+            The number of connections successfully opened from any pool.
+            This value is incremented by the Remove method.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool._poolClosed">
+            <summary>
+            The number of connections successfully closed from any pool.
+            This value is incremented by the Add method.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.GetCounts(System.String,System.Collections.Generic.Dictionary{System.String,System.Int32}@,System.Int32@,System.Int32@,System.Int32@)">
+            <summary>
+            Counts the number of pool entries matching the specified file name.
+            </summary>
+            <param name="fileName">
+            The file name to match or null to match all files.
+            </param>
+            <param name="counts">
+            The pool entry counts for each matching file.
+            </param>
+            <param name="openCount">
+            The total number of connections successfully opened from any pool.
+            </param>
+            <param name="closeCount">
+            The total number of connections successfully closed from any pool.
+            </param>
+            <param name="totalCount">
+            The total number of pool entries for all matching files.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.ClearPool(System.String)">
+            <summary>
+            Disposes of all pooled connections associated with the specified
+            database file name.
+            </summary>
+            <param name="fileName">
+            The database file name.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.ClearAllPools">
+            <summary>
+            Disposes of all pooled connections.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.Add(System.String,System.Data.SQLite.SQLiteConnectionHandle,System.Int32)">
+            <summary>
+            Adds a connection to the pool of those associated with the
+            specified database file name.
+            </summary>
+            <param name="fileName">
+            The database file name.
+            </param>
+            <param name="handle">
+            The database connection handle.
+            </param>
+            <param name="version">
+            The connection pool version at the point the database connection
+            handle was received from the connection pool.  This is also the
+            connection pool version that the database connection handle was
+            created under.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.Remove(System.String,System.Int32,System.Int32@)">
+            <summary>
+            Removes a connection from the pool of those associated with the
+            specified database file name with the intent of using it to
+            interact with the database.
+            </summary>
+            <param name="fileName">
+            The database file name.
+            </param>
+            <param name="maxPoolSize">
+            The new maximum size of the connection pool for the specified
+            database file name.
+            </param>
+            <param name="version">
+            The connection pool version associated with the returned database
+            connection handle, if any.
+            </param>
+            <returns>
+            The database connection handle associated with the specified
+            database file name or null if it cannot be obtained.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.GetConnectionPool">
+            <summary>
+            This method is used to obtain a reference to the custom connection
+            pool implementation currently in use, if any.
+            </summary>
+            <returns>
+            The custom connection pool implementation or null if the default
+            connection pool implementation should be used.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.SetConnectionPool(System.Data.SQLite.ISQLiteConnectionPool)">
+            <summary>
+            This method is used to set the reference to the custom connection
+            pool implementation to use, if any.
+            </summary>
+            <param name="connectionPool">
+            The custom connection pool implementation to use or null if the
+            default connection pool implementation should be used.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.ResizePool(System.Data.SQLite.SQLiteConnectionPool.PoolQueue,System.Boolean)">
+            <summary>
+            We do not have to thread-lock anything in this function, because it
+            is only called by other functions above which already take the lock.
+            </summary>
+            <param name="queue">
+            The pool queue to resize.
+            </param>
+            <param name="add">
+            If a function intends to add to the pool, this is true, which
+            forces the resize to take one more than it needs from the pool.
+            </param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnectionPool.PoolQueue">
+            <summary>
+            Keeps track of connections made on a specified file.  The PoolVersion
+            dictates whether old objects get returned to the pool or discarded
+            when no longer in use.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool.PoolQueue.Queue">
+            <summary>
+            The queue of weak references to the actual database connection
+            handles.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool.PoolQueue.PoolVersion">
+            <summary>
+            This pool version associated with the database connection
+            handles in this pool queue.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool.PoolQueue.MaxPoolSize">
+            <summary>
+            The maximum size of this pool queue.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.PoolQueue.#ctor(System.Int32,System.Int32)">
+            <summary>
+            Constructs a connection pool queue using the specified version
+            and maximum size.  Normally, all the database connection
+            handles in this pool are associated with a single database file
+            name.
+            </summary>
+            <param name="version">
+            The initial pool version for this connection pool queue.
+            </param>
+            <param name="maxSize">
+            The initial maximum size for this connection pool queue.
+            </param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnectionStringBuilder">
+            <summary>
+            SQLite implementation of DbConnectionStringBuilder.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionStringBuilder._properties">
+            <summary>
+            Properties of this class
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionStringBuilder.#ctor">
+            <overloads>
+            Constructs a new instance of the class
+            </overloads>
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionStringBuilder.#ctor(System.String)">
+            <summary>
+            Constructs a new instance of the class using the specified connection string.
+            </summary>
+            <param name="connectionString">The connection string to parse</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionStringBuilder.Initialize(System.String)">
+            <summary>
+            Private initializer, which assigns the connection string and resets the builder
+            </summary>
+            <param name="cnnString">The connection string to assign</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionStringBuilder.TryGetValue(System.String,System.Object@)">
+            <summary>
+            Helper function for retrieving values from the connectionstring
+            </summary>
+            <param name="keyword">The keyword to retrieve settings for</param>
+            <param name="value">The resulting parameter value</param>
+            <returns>Returns true if the value was found and returned</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionStringBuilder.FallbackGetProperties(System.Collections.Hashtable)">
+            <summary>
+            Fallback method for MONO, which doesn't implement DbConnectionStringBuilder.GetProperties()
+            </summary>
+            <param name="propertyList">The hashtable to fill with property descriptors</param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.Version">
+            <summary>
+            Gets/Sets the default version of the SQLite engine to instantiate.  Currently the only valid value is 3, indicating version 3 of the sqlite library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.SyncMode">
+            <summary>
+            Gets/Sets the synchronization mode (file flushing) of the connection string.  Default is "Normal".
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.UseUTF16Encoding">
+            <summary>
+            Gets/Sets the encoding for the connection string.  The default is "False" which indicates UTF-8 encoding.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.Pooling">
+            <summary>
+            Gets/Sets whether or not to use connection pooling.  The default is "False"
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.BinaryGUID">
+            <summary>
+            Gets/Sets whethor not to store GUID's in binary format.  The default is True
+            which saves space in the database.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.DataSource">
+            <summary>
+            Gets/Sets the filename to open on the connection string.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.Uri">
+            <summary>
+            An alternate to the data source property
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.FullUri">
+            <summary>
+            An alternate to the data source property that uses the SQLite URI syntax.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.DefaultTimeout">
+            <summary>
+            Gets/sets the default command timeout for newly-created commands.  This is especially useful for 
+            commands used internally such as inside a SQLiteTransaction, where setting the timeout is not possible.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.Enlist">
+            <summary>
+            Determines whether or not the connection will automatically participate
+            in the current distributed transaction (if one exists)
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.FailIfMissing">
+            <summary>
+            If set to true, will throw an exception if the database specified in the connection
+            string does not exist.  If false, the database will be created automatically.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.LegacyFormat">
+            <summary>
+            If enabled, uses the legacy 3.xx format for maximum compatibility, but results in larger
+            database sizes.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.ReadOnly">
+            <summary>
+            When enabled, the database will be opened for read-only access and writing will be disabled.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.Password">
+            <summary>
+            Gets/sets the database encryption password
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.HexPassword">
+            <summary>
+            Gets/sets the database encryption hexadecimal password
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.PageSize">
+            <summary>
+            Gets/Sets the page size for the connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.MaxPageCount">
+            <summary>
+            Gets/Sets the maximum number of pages the database may hold
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.CacheSize">
+            <summary>
+            Gets/Sets the cache size for the connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.DateTimeFormat">
+            <summary>
+            Gets/Sets the DateTime format for the connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.DateTimeKind">
+            <summary>
+            Gets/Sets the DateTime kind for the connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.DateTimeFormatString">
+            <summary>
+            Gets/sets the DateTime format string used for formatting
+            and parsing purposes.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.BaseSchemaName">
+            <summary>
+            Gets/Sets the placeholder base schema name used for
+            .NET Framework compatibility purposes.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.JournalMode">
+            <summary>
+            Determines how SQLite handles the transaction journal file.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.DefaultIsolationLevel">
+            <summary>
+            Sets the default isolation level for transactions on the connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.ForeignKeys">
+            <summary>
+            If enabled, use foreign key constraints
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.Flags">
+            <summary>
+            Gets/Sets the extra behavioral flags.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.SetDefaults">
+            <summary>
+            If enabled, apply the default connection settings to opened databases.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.ToFullPath">
+            <summary>
+            If enabled, attempt to resolve the provided data source file name to a
+            full path before opening.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.TypeAffinity">
+            <summary>
+            SQLite has very limited types, and is inherently text-based.  The first 5 types below represent the sum of all types SQLite
+            understands.  The DateTime extension to the spec is for internal use only.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.Uninitialized">
+            <summary>
+            Not used
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.Int64">
+            <summary>
+            All integers in SQLite default to Int64
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.Double">
+            <summary>
+            All floating point numbers in SQLite default to double
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.Text">
+            <summary>
+            The default data type of SQLite is text
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.Blob">
+            <summary>
+            Typically blob types are only seen when returned from a function
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.Null">
+            <summary>
+            Null types can be returned from functions
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.DateTime">
+            <summary>
+            Used internally by this provider
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.None">
+            <summary>
+            Used internally by this provider
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnectionEventType">
+            <summary>
+            These are the event types associated with the
+            <see cref="T:System.Data.SQLite.SQLiteConnectionEventHandler"/>
+            delegate (and its corresponding event) and the
+            <see cref="T:System.Data.SQLite.ConnectionEventArgs"/> class.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.Invalid">
+            <summary>
+            Not used.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.Unknown">
+            <summary>
+            Not used.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.Opening">
+            <summary>
+            The connection is being opened.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.ConnectionString">
+            <summary>
+            The connection string has been parsed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.Opened">
+            <summary>
+            The connection was opened.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.ChangeDatabase">
+            <summary>
+            The <see cref="F:System.Data.SQLite.SQLiteConnectionEventType.ChangeDatabase"/> method was called on the
+            connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.NewTransaction">
+            <summary>
+            A transaction was created using the connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.EnlistTransaction">
+            <summary>
+            The connection was enlisted into a transaction.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.NewCommand">
+            <summary>
+            A command was created using the connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.NewDataReader">
+            <summary>
+            A data reader was created using the connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.NewCriticalHandle">
+            <summary>
+            An instance of a <see cref="T:System.Runtime.InteropServices.CriticalHandle"/> derived class has
+            been created to wrap a native resource.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.Closing">
+            <summary>
+            The connection is being closed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.Closed">
+            <summary>
+            The connection was closed.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteDateFormats">
+             <summary>
+             This implementation of SQLite for ADO.NET can process date/time fields in
+             databases in one of six formats.
+             </summary>
+             <remarks>
+             ISO8601 format is more compatible, readable, fully-processable, but less
+             accurate as it does not provide time down to fractions of a second.
+             JulianDay is the numeric format the SQLite uses internally and is arguably
+             the most compatible with 3rd party tools.  It is not readable as text
+             without post-processing.  Ticks less compatible with 3rd party tools that
+             query the database, and renders the DateTime field unreadable as text
+             without post-processing.  UnixEpoch is more compatible with Unix systems.
+             InvariantCulture allows the configured format for the invariant culture
+             format to be used and is human readable.  CurrentCulture allows the
+             configured format for the current culture to be used and is also human
+             readable.
+            
+             The preferred order of choosing a DateTime format is JulianDay, ISO8601,
+             and then Ticks.  Ticks is mainly present for legacy code support.
+             </remarks>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.Ticks">
+            <summary>
+            Use the value of DateTime.Ticks.  This value is not recommended and is not well supported with LINQ.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.ISO8601">
+            <summary>
+            Use the ISO-8601 format.  Uses the "yyyy-MM-dd HH:mm:ss.FFFFFFFK" format for UTC DateTime values and
+            "yyyy-MM-dd HH:mm:ss.FFFFFFF" format for local DateTime values).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.JulianDay">
+            <summary>
+            The interval of time in days and fractions of a day since January 1, 4713 BC.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.UnixEpoch">
+            <summary>
+            The whole number of seconds since the Unix epoch (January 1, 1970).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.InvariantCulture">
+            <summary>
+            Any culture-independent string value that the .NET Framework can interpret as a valid DateTime.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.CurrentCulture">
+            <summary>
+            Any string value that the .NET Framework can interpret as a valid DateTime using the current culture.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.Default">
+            <summary>
+            The default format for this provider.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteJournalModeEnum">
+             <summary>
+             This enum determines how SQLite treats its journal file.
+             </summary>
+             <remarks>
+             By default SQLite will create and delete the journal file when needed during a transaction.
+             However, for some computers running certain filesystem monitoring tools, the rapid
+             creation and deletion of the journal file can cause those programs to fail, or to interfere with SQLite.
+            
+             If a program or virus scanner is interfering with SQLite's journal file, you may receive errors like "unable to open database file"
+             when starting a transaction.  If this is happening, you may want to change the default journal mode to Persist.
+             </remarks>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Default">
+            <summary>
+            The default mode, this causes SQLite to use the existing journaling mode for the database.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Delete">
+            <summary>
+            SQLite will create and destroy the journal file as-needed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Persist">
+            <summary>
+            When this is set, SQLite will keep the journal file even after a transaction has completed.  It's contents will be erased,
+            and the journal re-used as often as needed.  If it is deleted, it will be recreated the next time it is needed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Off">
+            <summary>
+            This option disables the rollback journal entirely.  Interrupted transactions or a program crash can cause database
+            corruption in this mode!
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Truncate">
+            <summary>
+            SQLite will truncate the journal file to zero-length instead of deleting it.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Memory">
+            <summary>
+            SQLite will store the journal in volatile RAM.  This saves disk I/O but at the expense of database safety and integrity.
+            If the application using SQLite crashes in the middle of a transaction when the MEMORY journaling mode is set, then the
+            database file will very likely go corrupt.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Wal">
+            <summary>
+            SQLite uses a write-ahead log instead of a rollback journal to implement transactions.  The WAL journaling mode is persistent;
+            after being set it stays in effect across multiple database connections and after closing and reopening the database. A database
+            in WAL journaling mode can only be accessed by SQLite version 3.7.0 or later.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteSynchronousEnum">
+            <summary>
+            Possible values for the "synchronous" database setting.  This setting determines
+            how often the database engine calls the xSync method of the VFS.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteSynchronousEnum.Default">
+            <summary>
+            Use the default "synchronous" database setting.  Currently, this should be
+            the same as using the FULL mode.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteSynchronousEnum.Off">
+            <summary>
+            The database engine continues without syncing as soon as it has handed
+            data off to the operating system.  If the application running SQLite
+            crashes, the data will be safe, but the database might become corrupted
+            if the operating system crashes or the computer loses power before that
+            data has been written to the disk surface.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteSynchronousEnum.Normal">
+            <summary>
+            The database engine will still sync at the most critical moments, but
+            less often than in FULL mode.  There is a very small (though non-zero)
+            chance that a power failure at just the wrong time could corrupt the
+            database in NORMAL mode.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteSynchronousEnum.Full">
+            <summary>
+            The database engine will use the xSync method of the VFS to ensure that
+            all content is safely written to the disk surface prior to continuing.
+            This ensures that an operating system crash or power failure will not
+            corrupt the database.  FULL synchronous is very safe, but it is also
+            slower.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteExecuteType">
+            <summary>
+            The requested command execution type.  This controls which method of the
+            <see cref="T:System.Data.SQLite.SQLiteCommand"/> object will be called.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteExecuteType.None">
+            <summary>
+            Do nothing.  No method will be called.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteExecuteType.NonQuery">
+            <summary>
+            The command is not expected to return a result -OR- the result is not
+            needed.  The <see cref="M:System.Data.SQLite.SQLiteCommand.ExecuteNonQuery"/> or
+            <see cref="M:System.Data.SQLite.SQLiteCommand.ExecuteNonQuery(System.Data.CommandBehavior)"/>  method
+            will be called.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteExecuteType.Scalar">
+            <summary>
+            The command is expected to return a scalar result -OR- the result should
+            be limited to a scalar result.  The <see cref="M:System.Data.SQLite.SQLiteCommand.ExecuteScalar"/>
+            or <see cref="M:System.Data.SQLite.SQLiteCommand.ExecuteScalar(System.Data.CommandBehavior)"/> method will
+            be called.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteExecuteType.Reader">
+            <summary>
+            The command is expected to return <see cref="T:System.Data.SQLite.SQLiteDataReader"/> result.
+            The <see cref="M:System.Data.SQLite.SQLiteCommand.ExecuteReader"/> or
+            <see cref="M:System.Data.SQLite.SQLiteCommand.ExecuteReader(System.Data.CommandBehavior)"/> method will
+            be called.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteExecuteType.Default">
+            <summary>
+            Use the default command execution type.  Using this value is the same
+            as using the <see cref="F:System.Data.SQLite.SQLiteExecuteType.NonQuery"/> value.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteAuthorizerActionCode">
+            <summary>
+            The action code responsible for the current call into the authorizer.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.None">
+            <summary>
+            No action is being performed.  This value should not be used from
+            external code.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Copy">
+            <summary>
+            No longer used.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateIndex">
+            <summary>
+            An index will be created.  The action-specific arguments are the
+            index name and the table name.
+            
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTable">
+            <summary>
+            A table will be created.  The action-specific arguments are the
+            table name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTempIndex">
+            <summary>
+            A temporary index will be created.  The action-specific arguments
+            are the index name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTempTable">
+            <summary>
+            A temporary table will be created.  The action-specific arguments
+            are the table name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTempTrigger">
+            <summary>
+            A temporary trigger will be created.  The action-specific arguments
+            are the trigger name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTempView">
+            <summary>
+            A temporary view will be created.  The action-specific arguments are
+            the view name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTrigger">
+            <summary>
+            A trigger will be created.  The action-specific arguments are the
+            trigger name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateView">
+            <summary>
+            A view will be created.  The action-specific arguments are the view
+            name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Delete">
+            <summary>
+            A DELETE statement will be executed.  The action-specific arguments
+            are the table name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropIndex">
+            <summary>
+            An index will be dropped.  The action-specific arguments are the
+            index name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTable">
+            <summary>
+            A table will be dropped.  The action-specific arguments are the tables
+            name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTempIndex">
+            <summary>
+            A temporary index will be dropped.  The action-specific arguments are
+            the index name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTempTable">
+            <summary>
+            A temporary table will be dropped.  The action-specific arguments are
+            the table name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTempTrigger">
+            <summary>
+            A temporary trigger will be dropped.  The action-specific arguments
+            are the trigger name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTempView">
+            <summary>
+            A temporary view will be dropped.  The action-specific arguments are
+            the view name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTrigger">
+            <summary>
+            A trigger will be dropped.  The action-specific arguments are the
+            trigger name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropView">
+            <summary>
+            A view will be dropped.  The action-specific arguments are the view
+            name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Insert">
+            <summary>
+            An INSERT statement will be executed.  The action-specific arguments
+            are the table name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Pragma">
+            <summary>
+            A PRAGMA statement will be executed.  The action-specific arguments
+            are the name of the PRAGMA and the new value or a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Read">
+            <summary>
+            A table column will be read.  The action-specific arguments are the
+            table name and the column name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Select">
+            <summary>
+            A SELECT statement will be executed.  The action-specific arguments
+            are both null values.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Transaction">
+            <summary>
+            A transaction will be started, committed, or rolled back.  The
+            action-specific arguments are the name of the operation (BEGIN,
+            COMMIT, or ROLLBACK) and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Update">
+            <summary>
+            An UPDATE statement will be executed.  The action-specific arguments
+            are the table name and the column name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Attach">
+            <summary>
+            A database will be attached to the connection.  The action-specific
+            arguments are the database file name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Detach">
+            <summary>
+            A database will be detached from the connection.  The action-specific
+            arguments are the database name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.AlterTable">
+            <summary>
+            The schema of a table will be altered.  The action-specific arguments
+            are the database name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Reindex">
+            <summary>
+            An index will be deleted and then recreated.  The action-specific
+            arguments are the index name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Analyze">
+            <summary>
+            A table will be analyzed to gathers statistics about it.  The
+            action-specific arguments are the table name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateVtable">
+            <summary>
+            A virtual table will be created.  The action-specific arguments are
+            the table name and the module name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropVtable">
+            <summary>
+            A virtual table will be dropped.  The action-specific arguments are
+            the table name and the module name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Function">
+            <summary>
+            A SQL function will be called.  The action-specific arguments are a
+            null value and the function name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Savepoint">
+            <summary>
+            A savepoint will be created, released, or rolled back.  The
+            action-specific arguments are the name of the operation (BEGIN,
+            RELEASE, or ROLLBACK) and the savepoint name.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteAuthorizerReturnCode">
+            <summary>
+            The return code for the current call into the authorizer.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerReturnCode.Ok">
+            <summary>
+            The action will be allowed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerReturnCode.Deny">
+            <summary>
+            The overall action will be disallowed and an error message will be
+            returned from the query preparation method.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerReturnCode.Ignore">
+            <summary>
+            The specific action will be disallowed; however, the overall action
+            will continue.  The exact effects of this return code vary depending
+            on the specific action, please refer to the SQLite core library
+            documentation for futher details.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteType">
+            <summary>
+            Class used internally to determine the datatype of a column in a resultset
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteType.Type">
+            <summary>
+            The DbType of the column, or DbType.Object if it cannot be determined
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteType.Affinity">
+            <summary>
+            The affinity of a column, used for expressions or when Type is DbType.Object
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteDataAdapter">
+            <summary>
+            SQLite implementation of DbDataAdapter.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.#ctor">
+            <overloads>
+            This class is just a shell around the DbDataAdapter.  Nothing from
+            DbDataAdapter is overridden here, just a few constructors are defined.
+            </overloads>
+            <summary>
+            Default constructor.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.#ctor(System.Data.SQLite.SQLiteCommand)">
+            <summary>
+            Constructs a data adapter using the specified select command.
+            </summary>
+            <param name="cmd">
+            The select command to associate with the adapter.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.#ctor(System.String,System.Data.SQLite.SQLiteConnection)">
+            <summary>
+            Constructs a data adapter with the supplied select command text and
+            associated with the specified connection.
+            </summary>
+            <param name="commandText">
+            The select command text to associate with the data adapter.
+            </param>
+            <param name="connection">
+            The connection to associate with the select command.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.#ctor(System.String,System.String)">
+            <summary>
+            Constructs a data adapter with the specified select command text,
+            and using the specified database connection string.
+            </summary>
+            <param name="commandText">
+            The select command text to use to construct a select command.
+            </param>
+            <param name="connectionString">
+            A connection string suitable for passing to a new SQLiteConnection,
+            which is associated with the select command.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.#ctor(System.String,System.String,System.Boolean)">
+            <summary>
+            Constructs a data adapter with the specified select command text,
+            and using the specified database connection string.
+            </summary>
+            <param name="commandText">
+            The select command text to use to construct a select command.
+            </param>
+            <param name="connectionString">
+            A connection string suitable for passing to a new SQLiteConnection,
+            which is associated with the select command.
+            </param>
+            <param name="parseViaFramework">
+            Non-zero to parse the connection string using the built-in (i.e.
+            framework provided) parser when opening the connection.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.OnRowUpdating(System.Data.Common.RowUpdatingEventArgs)">
+            <summary>
+            Raised by the underlying DbDataAdapter when a row is being updated
+            </summary>
+            <param name="value">The event's specifics</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.OnRowUpdated(System.Data.Common.RowUpdatedEventArgs)">
+            <summary>
+            Raised by DbDataAdapter after a row is updated
+            </summary>
+            <param name="value">The event's specifics</param>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteDataAdapter.RowUpdating">
+            <summary>
+            Row updating event handler
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteDataAdapter.RowUpdated">
+            <summary>
+            Row updated event handler
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataAdapter.SelectCommand">
+            <summary>
+            Gets/sets the select command for this DataAdapter
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataAdapter.InsertCommand">
+            <summary>
+            Gets/sets the insert command for this DataAdapter
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataAdapter.UpdateCommand">
+            <summary>
+            Gets/sets the update command for this DataAdapter
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataAdapter.DeleteCommand">
+            <summary>
+            Gets/sets the delete command for this DataAdapter
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteDataReader">
+            <summary>
+            SQLite implementation of DbDataReader.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._command">
+            <summary>
+            Underlying command this reader is attached to
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._activeStatementIndex">
+            <summary>
+            Index of the current statement in the command being processed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._activeStatement">
+            <summary>
+            Current statement being Read()
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._readingState">
+            <summary>
+            State of the current statement being processed.
+            -1 = First Step() executed, so the first Read() will be ignored
+             0 = Actively reading
+             1 = Finished reading
+             2 = Non-row-returning statement, no records
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._rowsAffected">
+            <summary>
+            Number of records affected by the insert/update statements executed on the command
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._fieldCount">
+            <summary>
+            Count of fields (columns) in the row-returning statement currently being processed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._fieldIndexes">
+            <summary>
+            Maps the field (column) names to their corresponding indexes within the results.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._fieldTypeArray">
+            <summary>
+            Datatypes of active fields (columns) in the current statement, used for type-restricting data
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._commandBehavior">
+            <summary>
+            The behavior of the datareader
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._disposeCommand">
+            <summary>
+            If set, then dispose of the command object when the reader is finished
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._throwOnDisposed">
+            <summary>
+            If set, then raise an exception when the object is accessed after being disposed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._keyInfo">
+            <summary>
+            An array of rowid's for the active statement if CommandBehavior.KeyInfo is specified
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._version">
+            <summary>
+            Matches the version of the connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._baseSchemaName">
+            <summary>
+            The "stub" (i.e. placeholder) base schema name to use when returning
+            column schema information.  Matches the base schema name used by the
+            associated connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.#ctor(System.Data.SQLite.SQLiteCommand,System.Data.CommandBehavior)">
+            <summary>
+            Internal constructor, initializes the datareader and sets up to begin executing statements
+            </summary>
+            <param name="cmd">The SQLiteCommand this data reader is for</param>
+            <param name="behave">The expected behavior of the data reader</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.Dispose(System.Boolean)">
+            <summary>
+            Dispose of all resources used by this datareader.
+            </summary>
+            <param name="disposing"></param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.Close">
+            <summary>
+            Closes the datareader, potentially closing the connection as well if CommandBehavior.CloseConnection was specified.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.CheckClosed">
+            <summary>
+            Throw an error if the datareader is closed
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.CheckValidRow">
+            <summary>
+            Throw an error if a row is not loaded
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetEnumerator">
+            <summary>
+            Enumerator support
+            </summary>
+            <returns>Returns a DbEnumerator object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.VerifyType(System.Int32,System.Data.DbType)">
+             <summary>
+             SQLite is inherently un-typed.  All datatypes in SQLite are natively strings.  The definition of the columns of a table
+             and the affinity of returned types are all we have to go on to type-restrict data in the reader.
+            
+             This function attempts to verify that the type of data being requested of a column matches the datatype of the column.  In
+             the case of columns that are not backed into a table definition, we attempt to match up the affinity of a column (int, double, string or blob)
+             to a set of known types that closely match that affinity.  It's not an exact science, but its the best we can do.
+             </summary>
+             <returns>
+             This function throws an InvalidTypeCast() exception if the requested type doesn't match the column's definition or affinity.
+             </returns>
+             <param name="i">The index of the column to type-check</param>
+             <param name="typ">The type we want to get out of the column</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetBoolean(System.Int32)">
+            <summary>
+            Retrieves the column as a boolean value
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>bool</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetByte(System.Int32)">
+            <summary>
+            Retrieves the column as a single byte value
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>byte</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetBytes(System.Int32,System.Int64,System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Retrieves a column as an array of bytes (blob)
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <param name="fieldOffset">The zero-based index of where to begin reading the data</param>
+            <param name="buffer">The buffer to write the bytes into</param>
+            <param name="bufferoffset">The zero-based index of where to begin writing into the array</param>
+            <param name="length">The number of bytes to retrieve</param>
+            <returns>The actual number of bytes written into the array</returns>
+            <remarks>
+            To determine the number of bytes in the column, pass a null value for the buffer.  The total length will be returned.
+            </remarks>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetChar(System.Int32)">
+            <summary>
+            Returns the column as a single character
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>char</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetChars(System.Int32,System.Int64,System.Char[],System.Int32,System.Int32)">
+            <summary>
+            Retrieves a column as an array of chars (blob)
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <param name="fieldoffset">The zero-based index of where to begin reading the data</param>
+            <param name="buffer">The buffer to write the characters into</param>
+            <param name="bufferoffset">The zero-based index of where to begin writing into the array</param>
+            <param name="length">The number of bytes to retrieve</param>
+            <returns>The actual number of characters written into the array</returns>
+            <remarks>
+            To determine the number of characters in the column, pass a null value for the buffer.  The total length will be returned.
+            </remarks>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetDataTypeName(System.Int32)">
+            <summary>
+            Retrieves the name of the back-end datatype of the column
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>string</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetDateTime(System.Int32)">
+            <summary>
+            Retrieve the column as a date/time value
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>DateTime</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetDecimal(System.Int32)">
+            <summary>
+            Retrieve the column as a decimal value
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>decimal</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetDouble(System.Int32)">
+            <summary>
+            Returns the column as a double
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>double</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetFieldType(System.Int32)">
+            <summary>
+            Returns the .NET type of a given column
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>Type</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetFloat(System.Int32)">
+            <summary>
+            Returns a column as a float value
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>float</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetGuid(System.Int32)">
+            <summary>
+            Returns the column as a Guid
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>Guid</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetInt16(System.Int32)">
+            <summary>
+            Returns the column as a short
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>Int16</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetInt32(System.Int32)">
+            <summary>
+            Retrieves the column as an int
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>Int32</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetInt64(System.Int32)">
+            <summary>
+            Retrieves the column as a long
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>Int64</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetName(System.Int32)">
+            <summary>
+            Retrieves the name of the column
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>string</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetOrdinal(System.String)">
+            <summary>
+            Retrieves the i of a column, given its name
+            </summary>
+            <param name="name">The name of the column to retrieve</param>
+            <returns>The int i of the column</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetSchemaTable">
+            <summary>
+            Schema information in SQLite is difficult to map into .NET conventions, so a lot of work must be done
+            to gather the necessary information so it can be represented in an ADO.NET manner.
+            </summary>
+            <returns>Returns a DataTable containing the schema information for the active SELECT statement being processed.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetString(System.Int32)">
+            <summary>
+            Retrieves the column as a string
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>string</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetValue(System.Int32)">
+            <summary>
+            Retrieves the column as an object corresponding to the underlying datatype of the column
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetValues(System.Object[])">
+            <summary>
+            Retreives the values of multiple columns, up to the size of the supplied array
+            </summary>
+            <param name="values">The array to fill with values from the columns in the current resultset</param>
+            <returns>The number of columns retrieved</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetValues">
+            <summary>
+            Returns a collection containing all the column names and values for the
+            current row of data in the current resultset, if any.  If there is no
+            current row or no current resultset, an exception may be thrown.
+            </summary>
+            <returns>
+            The collection containing the column name and value information for the
+            current row of data in the current resultset or null if this information
+            cannot be obtained.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.IsDBNull(System.Int32)">
+            <summary>
+            Returns True if the specified column is null
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>True or False</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.NextResult">
+            <summary>
+            Moves to the next resultset in multiple row-returning SQL command.
+            </summary>
+            <returns>True if the command was successful and a new resultset is available, False otherwise.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetFlags(System.Data.SQLite.SQLiteDataReader)">
+            <summary>
+            This method attempts to query the flags associated with the database
+            connection in use.  If the database connection is disposed, the default
+            flags will be returned.
+            </summary>
+            <param name="dataReader">
+            The data reader containing the databse connection to query the flags from.
+            </param>
+            <returns>
+            The connection flags value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetSQLiteType(System.Int32)">
+            <summary>
+            Retrieves the SQLiteType for a given column, and caches it to avoid repetetive interop calls.
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>A SQLiteType structure</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.Read">
+            <summary>
+            Reads the next row from the resultset
+            </summary>
+            <returns>True if a new row was successfully loaded and is ready for processing</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.Depth">
+            <summary>
+            Not implemented.  Returns 0
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.FieldCount">
+            <summary>
+            Returns the number of columns in the current resultset
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.VisibleFieldCount">
+            <summary>
+            Returns the number of visible fields in the current resultset
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.HasRows">
+            <summary>
+            Returns True if the resultset has rows that can be fetched
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.IsClosed">
+            <summary>
+            Returns True if the data reader is closed
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.RecordsAffected">
+            <summary>
+            Retrieve the count of records affected by an update/insert command.  Only valid once the data reader is closed!
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.Item(System.String)">
+            <summary>
+            Indexer to retrieve data from a column given its name
+            </summary>
+            <param name="name">The name of the column to retrieve data for</param>
+            <returns>The value contained in the column</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.Item(System.Int32)">
+            <summary>
+            Indexer to retrieve data from a column given its i
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>The value contained in the column</returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteException">
+            <summary>
+            SQLite exception class.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Private constructor for use with serialization.
+            </summary>
+            <param name="info">
+            Holds the serialized object data about the exception being thrown.
+            </param>
+            <param name="context">
+            Contains contextual information about the source or destination.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.#ctor(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            <summary>
+            Public constructor for generating a SQLite exception given the error
+            code and message.
+            </summary>
+            <param name="errorCode">
+            The SQLite return code to report.
+            </param>
+            <param name="message">
+            Message text to go along with the return code message text.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.#ctor(System.String)">
+            <summary>
+            Public constructor that uses the base class constructor for the error
+            message.
+            </summary>
+            <param name="message">Error message text.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.#ctor">
+            <summary>
+            Public constructor that uses the default base class constructor.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.#ctor(System.String,System.Exception)">
+            <summary>
+            Public constructor that uses the base class constructor for the error
+            message and inner exception.
+            </summary>
+            <param name="message">Error message text.</param>
+            <param name="innerException">The original (inner) exception.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Adds extra information to the serialized object data specific to this
+            class type.  This is only used for serialization.
+            </summary>
+            <param name="info">
+            Holds the serialized object data about the exception being thrown.
+            </param>
+            <param name="context">
+            Contains contextual information about the source or destination.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.GetErrorString(System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Returns the error message for the specified SQLite return code.
+            </summary>
+            <param name="errorCode">The SQLite return code.</param>
+            <returns>The error message or null if it cannot be found.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.GetStockErrorMessage(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            <summary>
+            Returns the composite error message based on the SQLite return code
+            and the optional detailed error message.
+            </summary>
+            <param name="errorCode">The SQLite return code.</param>
+            <param name="message">Optional detailed error message.</param>
+            <returns>Error message text for the return code.</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteException.ResultCode">
+            <summary>
+            Gets the associated SQLite result code for this exception as a
+            <see cref="T:System.Data.SQLite.SQLiteErrorCode"/>.  This property returns the same
+            underlying value as the <see cref="P:System.Data.SQLite.SQLiteException.ErrorCode"/> property.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteException.ErrorCode">
+            <summary>
+            Gets the associated SQLite return code for this exception as an
+            <see cref="T:System.Int32"/>.  For desktop versions of the .NET Framework,
+            this property overrides the property of the same name within the
+            <see cref="T:System.Runtime.InteropServices.ExternalException"/>
+            class.  This property returns the same underlying value as the
+            <see cref="P:System.Data.SQLite.SQLiteException.ResultCode"/> property.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteErrorCode">
+            <summary>
+            SQLite error codes.  Actually, this enumeration represents a return code,
+            which may also indicate success in one of several ways (e.g. SQLITE_OK,
+            SQLITE_ROW, and SQLITE_DONE).  Therefore, the name of this enumeration is
+            something of a misnomer.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Unknown">
+            <summary>
+            The error code is unknown.  This error code
+            is only used by the managed wrapper itself.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Ok">
+            <summary>
+            Successful result
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Error">
+            <summary>
+            SQL error or missing database
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Internal">
+            <summary>
+            Internal logic error in SQLite
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Perm">
+            <summary>
+            Access permission denied
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Abort">
+            <summary>
+            Callback routine requested an abort
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Busy">
+            <summary>
+            The database file is locked
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Locked">
+            <summary>
+            A table in the database is locked
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.NoMem">
+            <summary>
+            A malloc() failed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.ReadOnly">
+            <summary>
+            Attempt to write a readonly database
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Interrupt">
+            <summary>
+            Operation terminated by sqlite3_interrupt()
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.IoErr">
+            <summary>
+            Some kind of disk I/O error occurred
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Corrupt">
+            <summary>
+            The database disk image is malformed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.NotFound">
+            <summary>
+            Unknown opcode in sqlite3_file_control()
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Full">
+            <summary>
+            Insertion failed because database is full
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.CantOpen">
+            <summary>
+            Unable to open the database file
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Protocol">
+            <summary>
+            Database lock protocol error
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Empty">
+            <summary>
+            Database is empty
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Schema">
+            <summary>
+            The database schema changed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.TooBig">
+            <summary>
+            String or BLOB exceeds size limit
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Constraint">
+            <summary>
+            Abort due to constraint violation
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Mismatch">
+            <summary>
+            Data type mismatch
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Misuse">
+            <summary>
+            Library used incorrectly
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.NoLfs">
+            <summary>
+            Uses OS features not supported on host
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Auth">
+            <summary>
+            Authorization denied
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Format">
+            <summary>
+            Auxiliary database format error
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Range">
+            <summary>
+            2nd parameter to sqlite3_bind out of range
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.NotADb">
+            <summary>
+            File opened that is not a database file
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Notice">
+            <summary>
+            Notifications from sqlite3_log()
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Warning">
+            <summary>
+            Warnings from sqlite3_log()
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Row">
+            <summary>
+            sqlite3_step() has another row ready
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Done">
+            <summary>
+            sqlite3_step() has finished executing
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.NonExtendedMask">
+            <summary>
+            Used to mask off extended result codes
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteFactory">
+            <summary>
+            SQLite implementation of <see cref="T:System.Data.Common.DbProviderFactory"/>.
+            </summary>
+            <summary>
+            SQLite implementation of <see cref="T:System.IServiceProvider"/>.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.#ctor">
+            <summary>
+            Constructs a new instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFactory.Instance">
+            <summary>
+            Static instance member which returns an instanced <see cref="T:System.Data.SQLite.SQLiteFactory"/> class.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.CreateCommand">
+            <summary>
+            Creates and returns a new <see cref="T:System.Data.SQLite.SQLiteCommand"/> object.
+            </summary>
+            <returns>The new object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.CreateCommandBuilder">
+            <summary>
+            Creates and returns a new <see cref="T:System.Data.SQLite.SQLiteCommandBuilder"/> object.
+            </summary>
+            <returns>The new object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.CreateConnection">
+            <summary>
+            Creates and returns a new <see cref="T:System.Data.SQLite.SQLiteConnection"/> object.
+            </summary>
+            <returns>The new object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.CreateConnectionStringBuilder">
+            <summary>
+            Creates and returns a new <see cref="T:System.Data.SQLite.SQLiteConnectionStringBuilder"/> object.
+            </summary>
+            <returns>The new object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.CreateDataAdapter">
+            <summary>
+            Creates and returns a new <see cref="T:System.Data.SQLite.SQLiteDataAdapter"/> object.
+            </summary>
+            <returns>The new object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.CreateParameter">
+            <summary>
+            Creates and returns a new <see cref="T:System.Data.SQLite.SQLiteParameter"/> object.
+            </summary>
+            <returns>The new object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.System#IServiceProvider#GetService(System.Type)">
+            <summary>
+            Will provide a <see cref="T:System.IServiceProvider"/> object in .NET 3.5.
+            </summary>
+            <param name="serviceType">The class or interface type to query for.</param>
+            <returns></returns>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteFactory.Log">
+            <summary>
+            This event is raised whenever SQLite raises a logging event.
+            Note that this should be set as one of the first things in the
+            application.  This event is provided for backward compatibility only.
+            New code should use the <see cref="T:System.Data.SQLite.SQLiteLog"/> class instead.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteFunction">
+             <summary>
+             This abstract class is designed to handle user-defined functions easily.  An instance of the derived class is made for each
+             connection to the database.
+             </summary>
+             <remarks>
+             Although there is one instance of a class derived from SQLiteFunction per database connection, the derived class has no access
+             to the underlying connection.  This is necessary to deter implementers from thinking it would be a good idea to make database
+             calls during processing.
+            
+             It is important to distinguish between a per-connection instance, and a per-SQL statement context.  One instance of this class
+             services all SQL statements being stepped through on that connection, and there can be many.  One should never store per-statement
+             information in member variables of user-defined function classes.
+            
+             For aggregate functions, always create and store your per-statement data in the contextData object on the 1st step.  This data will
+             be automatically freed for you (and Dispose() called if the item supports IDisposable) when the statement completes.
+             </remarks>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._base">
+            <summary>
+            The base connection this function is attached to
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._contextDataList">
+            <summary>
+            Internal array used to keep track of aggregate function context data
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._flags">
+            <summary>
+            The connection flags associated with this object (this should be the
+            same value as the flags associated with the parent connection object).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._InvokeFunc">
+            <summary>
+            Holds a reference to the callback function for user functions
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._StepFunc">
+            <summary>
+            Holds a reference to the callbakc function for stepping in an aggregate function
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._FinalFunc">
+            <summary>
+            Holds a reference to the callback function for finalizing an aggregate function
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._CompareFunc">
+            <summary>
+            Holds a reference to the callback function for collation sequences
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._context">
+            <summary>
+            Current context of the current callback.  Only valid during a callback
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._registeredFunctions">
+            <summary>
+            This static list contains all the user-defined functions declared using the proper attributes.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.#ctor">
+            <summary>
+            Internal constructor, initializes the function's internal variables.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.#ctor(System.Data.SQLite.SQLiteDateFormats,System.DateTimeKind,System.String,System.Boolean)">
+            <summary>
+            Constructs an instance of this class using the specified data-type
+            conversion parameters.
+            </summary>
+            <param name="format">
+            The DateTime format to be used when converting string values to a
+            DateTime and binding DateTime parameters.
+            </param>
+            <param name="kind">
+            The <see cref="T:System.DateTimeKind"/> to be used when creating DateTime
+            values.
+            </param>
+            <param name="formatString">
+            The format string to be used when parsing and formatting DateTime
+            values.
+            </param>
+            <param name="utf16">
+            Non-zero to create a UTF-16 data-type conversion context; otherwise,
+            a UTF-8 data-type conversion context will be created.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.Dispose">
+            <summary>
+            Disposes of any active contextData variables that were not automatically cleaned up.  Sometimes this can happen if
+            someone closes the connection while a DataReader is open.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.Dispose(System.Boolean)">
+            <summary>
+            Placeholder for a user-defined disposal routine
+            </summary>
+            <param name="disposing">True if the object is being disposed explicitly</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.Invoke(System.Object[])">
+            <summary>
+            Scalar functions override this method to do their magic.
+            </summary>
+            <remarks>
+            Parameters passed to functions have only an affinity for a certain data type, there is no underlying schema available
+            to force them into a certain type.  Therefore the only types you will ever see as parameters are
+            DBNull.Value, Int64, Double, String or byte[] array.
+            </remarks>
+            <param name="args">The arguments for the command to process</param>
+            <returns>You may return most simple types as a return value, null or DBNull.Value to return null, DateTime, or
+            you may return an Exception-derived class if you wish to return an error to SQLite.  Do not actually throw the error,
+            just return it!</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.Step(System.Object[],System.Int32,System.Object@)">
+            <summary>
+            Aggregate functions override this method to do their magic.
+            </summary>
+            <remarks>
+            Typically you'll be updating whatever you've placed in the contextData field and returning as quickly as possible.
+            </remarks>
+            <param name="args">The arguments for the command to process</param>
+            <param name="stepNumber">The 1-based step number.  This is incrememted each time the step method is called.</param>
+            <param name="contextData">A placeholder for implementers to store contextual data pertaining to the current context.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.Final(System.Object)">
+            <summary>
+            Aggregate functions override this method to finish their aggregate processing.
+            </summary>
+            <remarks>
+            If you implemented your aggregate function properly,
+            you've been recording and keeping track of your data in the contextData object provided, and now at this stage you should have
+            all the information you need in there to figure out what to return.
+            NOTE:  It is possible to arrive here without receiving a previous call to Step(), in which case the contextData will
+            be null.  This can happen when no rows were returned.  You can either return null, or 0 or some other custom return value
+            if that is the case.
+            </remarks>
+            <param name="contextData">Your own assigned contextData, provided for you so you can return your final results.</param>
+            <returns>You may return most simple types as a return value, null or DBNull.Value to return null, DateTime, or
+            you may return an Exception-derived class if you wish to return an error to SQLite.  Do not actually throw the error,
+            just return it!
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.Compare(System.String,System.String)">
+            <summary>
+            User-defined collation sequences override this method to provide a custom string sorting algorithm.
+            </summary>
+            <param name="param1">The first string to compare</param>
+            <param name="param2">The second strnig to compare</param>
+            <returns>1 if param1 is greater than param2, 0 if they are equal, or -1 if param1 is less than param2</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.ConvertParams(System.Int32,System.IntPtr)">
+            <summary>
+            Converts an IntPtr array of context arguments to an object array containing the resolved parameters the pointers point to.
+            </summary>
+            <remarks>
+            Parameters passed to functions have only an affinity for a certain data type, there is no underlying schema available
+            to force them into a certain type.  Therefore the only types you will ever see as parameters are
+            DBNull.Value, Int64, Double, String or byte[] array.
+            </remarks>
+            <param name="nArgs">The number of arguments</param>
+            <param name="argsptr">A pointer to the array of arguments</param>
+            <returns>An object array of the arguments once they've been converted to .NET values</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.SetReturnValue(System.IntPtr,System.Object)">
+            <summary>
+            Takes the return value from Invoke() and Final() and figures out how to return it to SQLite's context.
+            </summary>
+            <param name="context">The context the return value applies to</param>
+            <param name="returnValue">The parameter to return to SQLite</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.ScalarCallback(System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            Internal scalar callback function, which wraps the raw context pointer and calls the virtual Invoke() method.
+            WARNING: Must not throw exceptions.
+            </summary>
+            <param name="context">A raw context pointer</param>
+            <param name="nArgs">Number of arguments passed in</param>
+            <param name="argsptr">A pointer to the array of arguments</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.CompareCallback(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            Internal collation sequence function, which wraps up the raw string pointers and executes the Compare() virtual function.
+            WARNING: Must not throw exceptions.
+            </summary>
+            <param name="ptr">Not used</param>
+            <param name="len1">Length of the string pv1</param>
+            <param name="ptr1">Pointer to the first string to compare</param>
+            <param name="len2">Length of the string pv2</param>
+            <param name="ptr2">Pointer to the second string to compare</param>
+            <returns>Returns -1 if the first string is less than the second.  0 if they are equal, or 1 if the first string is greater
+            than the second.  Returns 0 if an exception is caught.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.CompareCallback16(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            Internal collation sequence function, which wraps up the raw string pointers and executes the Compare() virtual function.
+            WARNING: Must not throw exceptions.
+            </summary>
+            <param name="ptr">Not used</param>
+            <param name="len1">Length of the string pv1</param>
+            <param name="ptr1">Pointer to the first string to compare</param>
+            <param name="len2">Length of the string pv2</param>
+            <param name="ptr2">Pointer to the second string to compare</param>
+            <returns>Returns -1 if the first string is less than the second.  0 if they are equal, or 1 if the first string is greater
+            than the second.  Returns 0 if an exception is caught.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.StepCallback(System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            The internal aggregate Step function callback, which wraps the raw context pointer and calls the virtual Step() method.
+            WARNING: Must not throw exceptions.
+            </summary>
+            <remarks>
+            This function takes care of doing the lookups and getting the important information put together to call the Step() function.
+            That includes pulling out the user's contextData and updating it after the call is made.  We use a sorted list for this so
+            binary searches can be done to find the data.
+            </remarks>
+            <param name="context">A raw context pointer</param>
+            <param name="nArgs">Number of arguments passed in</param>
+            <param name="argsptr">A pointer to the array of arguments</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.FinalCallback(System.IntPtr)">
+            <summary>
+            An internal aggregate Final function callback, which wraps the context pointer and calls the virtual Final() method.
+            WARNING: Must not throw exceptions.
+            </summary>
+            <param name="context">A raw context pointer</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.#cctor">
+            <summary>
+            Using reflection, enumerate all assemblies in the current appdomain looking for classes that
+            have a SQLiteFunctionAttribute attribute, and registering them accordingly.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.RegisterFunction(System.Type)">
+            <summary>
+            Manual method of registering a function.  The type must still have the SQLiteFunctionAttributes in order to work
+            properly, but this is a workaround for the Compact Framework where enumerating assemblies is not currently supported.
+            </summary>
+            <param name="typ">The type of the function to register</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.BindFunctions(System.Data.SQLite.SQLiteBase,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            Called by SQLiteBase derived classes, this function binds all user-defined functions to a connection.
+            It is done this way so that all user-defined functions will access the database using the same encoding scheme
+            as the connection (UTF-8 or UTF-16).
+            </summary>
+            <remarks>
+            The wrapper functions that interop with SQLite will create a unique cookie value, which internally is a pointer to
+            all the wrapped callback functions.  The interop function uses it to map CDecl callbacks to StdCall callbacks.
+            </remarks>
+            <param name="sqlbase">The base object on which the functions are to bind</param>
+            <param name="flags">The flags associated with the parent connection object</param>
+            <returns>Returns a logical list of functions which the connection should retain until it is closed.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.BindFunction(System.Data.SQLite.SQLiteBase,System.Data.SQLite.SQLiteFunctionAttribute,System.Data.SQLite.SQLiteFunction,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            This function binds a user-defined functions to a connection.
+            </summary>
+            <param name="sqliteBase">
+            The <see cref="T:System.Data.SQLite.SQLiteBase"/> object instance associated with the
+            <see cref="T:System.Data.SQLite.SQLiteConnection"/> that the function should be bound to.
+            </param>
+            <param name="functionAttribute">
+            The <see cref="T:System.Data.SQLite.SQLiteFunctionAttribute"/> object instance containing
+            the metadata for the function to be bound.
+            </param>
+            <param name="function">
+            The <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance that implements the
+            function to be bound.
+            </param>
+            <param name="flags">
+            The flags associated with the parent connection object.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteFunction.SQLiteConvert">
+            <summary>
+            Returns a reference to the underlying connection's SQLiteConvert class, which can be used to convert
+            strings and DateTime's into the current connection's encoding schema.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteFunctionEx">
+            <summary>
+            Extends SQLiteFunction and allows an inherited class to obtain the collating sequence associated with a function call.
+            </summary>
+            <remarks>
+            User-defined functions can call the GetCollationSequence() method in this class and use it to compare strings and char arrays.
+            </remarks>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunctionEx.GetCollationSequence">
+            <summary>
+            Obtains the collating sequence in effect for the given function.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:System.Data.SQLite.FunctionType">
+            <summary>
+            The type of user-defined function to declare
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.FunctionType.Scalar">
+            <summary>
+            Scalar functions are designed to be called and return a result immediately.  Examples include ABS(), Upper(), Lower(), etc.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.FunctionType.Aggregate">
+            <summary>
+            Aggregate functions are designed to accumulate data until the end of a call and then return a result gleaned from the accumulated data.
+            Examples include SUM(), COUNT(), AVG(), etc.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.FunctionType.Collation">
+            <summary>
+            Collation sequences are used to sort textual data in a custom manner, and appear in an ORDER BY clause.  Typically text in an ORDER BY is
+            sorted using a straight case-insensitive comparison function.  Custom collating sequences can be used to alter the behavior of text sorting
+            in a user-defined manner.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteCallback">
+            <summary>
+            An internal callback delegate declaration.
+            </summary>
+            <param name="context">Raw native context pointer for the user function.</param>
+            <param name="argc">Total number of arguments to the user function.</param>
+            <param name="argv">Raw native pointer to the array of raw native argument pointers.</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteFinalCallback">
+            <summary>
+            An internal final callback delegate declaration.
+            </summary>
+            <param name="context">Raw context pointer for the user function</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteCollation">
+            <summary>
+            Internal callback delegate for implementing collation sequences
+            </summary>
+            <param name="puser">Not used</param>
+            <param name="len1">Length of the string pv1</param>
+            <param name="pv1">Pointer to the first string to compare</param>
+            <param name="len2">Length of the string pv2</param>
+            <param name="pv2">Pointer to the second string to compare</param>
+            <returns>Returns -1 if the first string is less than the second.  0 if they are equal, or 1 if the first string is greater
+            than the second.</returns>
+        </member>
+        <member name="T:System.Data.SQLite.CollationTypeEnum">
+            <summary>
+            The type of collating sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationTypeEnum.Binary">
+            <summary>
+            The built-in BINARY collating sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationTypeEnum.NoCase">
+            <summary>
+            The built-in NOCASE collating sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationTypeEnum.Reverse">
+            <summary>
+            The built-in REVERSE collating sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationTypeEnum.Custom">
+            <summary>
+            A custom user-defined collating sequence
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.CollationEncodingEnum">
+            <summary>
+            The encoding type the collation sequence uses
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationEncodingEnum.UTF8">
+            <summary>
+            The collation sequence is UTF8
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationEncodingEnum.UTF16LE">
+            <summary>
+            The collation sequence is UTF16 little-endian
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationEncodingEnum.UTF16BE">
+            <summary>
+            The collation sequence is UTF16 big-endian
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.CollationSequence">
+            <summary>
+            A struct describing the collating sequence a function is executing in
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationSequence.Name">
+            <summary>
+            The name of the collating sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationSequence.Type">
+            <summary>
+            The type of collating sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationSequence.Encoding">
+            <summary>
+            The text encoding of the collation sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationSequence._func">
+            <summary>
+            Context of the function that requested the collating sequence
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.CollationSequence.Compare(System.String,System.String)">
+            <summary>
+            Calls the base collating sequence to compare two strings
+            </summary>
+            <param name="s1">The first string to compare</param>
+            <param name="s2">The second string to compare</param>
+            <returns>-1 if s1 is less than s2, 0 if s1 is equal to s2, and 1 if s1 is greater than s2</returns>
+        </member>
+        <member name="M:System.Data.SQLite.CollationSequence.Compare(System.Char[],System.Char[])">
+            <summary>
+            Calls the base collating sequence to compare two character arrays
+            </summary>
+            <param name="c1">The first array to compare</param>
+            <param name="c2">The second array to compare</param>
+            <returns>-1 if c1 is less than c2, 0 if c1 is equal to c2, and 1 if c1 is greater than c2</returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteFunctionAttribute">
+            <summary>
+            A simple custom attribute to enable us to easily find user-defined functions in
+            the loaded assemblies and initialize them in SQLite as connections are made.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunctionAttribute.#ctor">
+            <summary>
+            Default constructor, initializes the internal variables for the function.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunctionAttribute.#ctor(System.String,System.Int32,System.Data.SQLite.FunctionType)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="name">
+            The name of the function, as seen by the SQLite core library.
+            </param>
+            <param name="argumentCount">
+            The number of arguments that the function will accept.
+            </param>
+            <param name="functionType">
+            The type of function being declared.  This will either be Scalar,
+            Aggregate, or Collation.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteFunctionAttribute.Name">
+            <summary>
+            The function's name as it will be used in SQLite command text.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteFunctionAttribute.Arguments">
+            <summary>
+            The number of arguments this function expects.  -1 if the number of arguments is variable.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteFunctionAttribute.FuncType">
+            <summary>
+            The type of function this implementation will be.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteFunctionAttribute.InstanceType">
+            <summary>
+            The <see cref="T:System.Type"/> object instance that describes the class
+            containing the implementation for the associated function.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteKeyReader">
+            <summary>
+            This class provides key info for a given SQLite statement.
+            <remarks>
+            Providing key information for a given statement is non-trivial :(
+            </remarks>
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteKeyReader.#ctor(System.Data.SQLite.SQLiteConnection,System.Data.SQLite.SQLiteDataReader,System.Data.SQLite.SQLiteStatement)">
+            <summary>
+            This function does all the nasty work at determining what keys need to be returned for
+            a given statement.
+            </summary>
+            <param name="cnn"></param>
+            <param name="reader"></param>
+            <param name="stmt"></param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteKeyReader.Sync">
+            <summary>
+            Make sure all the subqueries are open and ready and sync'd with the current rowid
+            of the table they're supporting
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteKeyReader.Reset">
+            <summary>
+            Release any readers on any subqueries
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteKeyReader.AppendSchemaTable(System.Data.DataTable)">
+            <summary>
+            Append all the columns we've added to the original query to the schema
+            </summary>
+            <param name="tbl"></param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteKeyReader.Count">
+            <summary>
+            How many additional columns of keyinfo we're holding
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteKeyReader.KeyInfo">
+            <summary>
+            Used to support CommandBehavior.KeyInfo
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteKeyReader.KeyQuery">
+            <summary>
+            A single sub-query for a given table/database.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.LogEventArgs">
+            <summary>
+            Event data for logging event handlers.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.LogEventArgs.ErrorCode">
+            <summary>
+            The error code.  The type of this object value should be
+            <see cref="T:System.Int32"/> or <see cref="T:System.Data.SQLite.SQLiteErrorCode"/>.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.LogEventArgs.Message">
+            <summary>
+            SQL statement text as the statement first begins executing
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.LogEventArgs.Data">
+            <summary>
+            Extra data associated with this event, if any.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.LogEventArgs.#ctor(System.IntPtr,System.Object,System.String,System.Object)">
+            <summary>
+            Constructs the object.
+            </summary>
+            <param name="pUserData">Should be null.</param>
+            <param name="errorCode">
+            The error code.  The type of this object value should be
+            <see cref="T:System.Int32"/> or <see cref="T:System.Data.SQLite.SQLiteErrorCode"/>.
+            </param>
+            <param name="message">The error message, if any.</param>
+            <param name="data">The extra data, if any.</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteLogEventHandler">
+            <summary>
+            Raised when a log event occurs.
+            </summary>
+            <param name="sender">The current connection</param>
+            <param name="e">Event arguments of the trace</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteLog">
+            <summary>
+            Manages the SQLite custom logging functionality and the associated
+            callback for the whole process.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteLog.syncRoot">
+            <summary>
+            Object used to synchronize access to the static instance data
+            for this class.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteLog._domainUnload">
+            <summary>
+            Member variable to store the AppDomain.DomainUnload event handler.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteLog._defaultHandler">
+            <summary>
+            The default log event handler.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteLog._callback">
+            <summary>
+            The log callback passed to native SQLite engine.  This must live
+            as long as the SQLite library has a pointer to it.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteLog._sql">
+            <summary>
+            The base SQLite object to interop with.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteLog._enabled">
+            <summary>
+            This will be non-zero if logging is currently enabled.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.Initialize">
+            <summary>
+            Initializes the SQLite logging facilities.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.DomainUnload(System.Object,System.EventArgs)">
+            <summary>
+            Handles the AppDomain being unloaded.
+            </summary>
+            <param name="sender">Should be null.</param>
+            <param name="e">The data associated with this event.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.LogMessage(System.String)">
+            <summary>
+            Log a message to all the registered log event handlers without going
+            through the SQLite library.
+            </summary>
+            <param name="message">The message to be logged.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.LogMessage(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            <summary>
+            Log a message to all the registered log event handlers without going
+            through the SQLite library.
+            </summary>
+            <param name="errorCode">The SQLite error code.</param>
+            <param name="message">The message to be logged.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.LogMessage(System.Int32,System.String)">
+            <summary>
+            Log a message to all the registered log event handlers without going
+            through the SQLite library.
+            </summary>
+            <param name="errorCode">The integer error code.</param>
+            <param name="message">The message to be logged.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.LogMessage(System.Object,System.String)">
+            <summary>
+            Log a message to all the registered log event handlers without going
+            through the SQLite library.
+            </summary>
+            <param name="errorCode">
+            The error code.  The type of this object value should be
+            System.Int32 or SQLiteErrorCode.
+            </param>
+            <param name="message">The message to be logged.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.InitializeDefaultHandler">
+            <summary>
+            Creates and initializes the default log event handler.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.AddDefaultHandler">
+            <summary>
+            Adds the default log event handler to the list of handlers.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.RemoveDefaultHandler">
+            <summary>
+            Removes the default log event handler from the list of handlers.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.LogCallback(System.IntPtr,System.Int32,System.IntPtr)">
+             <summary>
+             Internal proxy function that calls any registered application log
+             event handlers.
+            
+             WARNING: This method is used more-or-less directly by native code,
+                      do not modify its type signature.
+             </summary>
+             <param name="pUserData">
+             The extra data associated with this message, if any.
+             </param>
+             <param name="errorCode">
+             The error code associated with this message.
+             </param>
+             <param name="pMessage">
+             The message string to be logged.
+             </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.LogEventHandler(System.Object,System.Data.SQLite.LogEventArgs)">
+            <summary>
+            Default logger.  Currently, uses the Trace class (i.e. sends events
+            to the current trace listeners, if any).
+            </summary>
+            <param name="sender">Should be null.</param>
+            <param name="e">The data associated with this event.</param>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteLog._handlers">
+            <summary>
+            Member variable to store the application log handler to call.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteLog.Log">
+            <summary>
+            This event is raised whenever SQLite raises a logging event.
+            Note that this should be set as one of the first things in the
+            application.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteLog.Enabled">
+            <summary>
+            If this property is true, logging is enabled; otherwise, logging is
+            disabled.  When logging is disabled, no logging events will fire.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteMetaDataCollectionNames">
+            <summary>
+            MetaDataCollections specific to SQLite
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Catalogs">
+            <summary>
+            Returns a list of databases attached to the connection
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Columns">
+            <summary>
+            Returns column information for the specified table
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Indexes">
+            <summary>
+            Returns index information for the optionally-specified table
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.IndexColumns">
+            <summary>
+            Returns base columns for the given index
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Tables">
+            <summary>
+            Returns the tables in the given catalog
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Views">
+            <summary>
+            Returns user-defined views in the given catalog
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.ViewColumns">
+            <summary>
+            Returns underlying column information on the given view
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.ForeignKeys">
+            <summary>
+            Returns foreign key information for the given catalog
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Triggers">
+            <summary>
+            Returns the triggers on the database
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteParameter">
+            <summary>
+            SQLite implementation of DbParameter.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameter._dbType">
+            <summary>
+            The data type of the parameter
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameter._rowVersion">
+            <summary>
+            The version information for mapping the parameter
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameter._objValue">
+            <summary>
+            The value of the data in the parameter
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameter._sourceColumn">
+            <summary>
+            The source column for the parameter
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameter._parameterName">
+            <summary>
+            The column name
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameter._dataSize">
+            <summary>
+            The data size, unused by SQLite
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String)">
+            <summary>
+            Constructs a named parameter given the specified parameter name
+            </summary>
+            <param name="parameterName">The parameter name</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Object)">
+            <summary>
+            Constructs a named parameter given the specified parameter name and initial value
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="value">The initial value of the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType)">
+            <summary>
+            Constructs a named parameter of the specified type
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="dbType">The datatype of the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.String)">
+            <summary>
+            Constructs a named parameter of the specified type and source column reference
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="dbType">The data type</param>
+            <param name="sourceColumn">The source column</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.String,System.Data.DataRowVersion)">
+            <summary>
+            Constructs a named parameter of the specified type, source column and row version
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="dbType">The data type</param>
+            <param name="sourceColumn">The source column</param>
+            <param name="rowVersion">The row version information</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType)">
+            <summary>
+            Constructs an unnamed parameter of the specified data type
+            </summary>
+            <param name="dbType">The datatype of the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.Object)">
+            <summary>
+            Constructs an unnamed parameter of the specified data type and sets the initial value
+            </summary>
+            <param name="dbType">The datatype of the parameter</param>
+            <param name="value">The initial value of the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.String)">
+            <summary>
+            Constructs an unnamed parameter of the specified data type and source column
+            </summary>
+            <param name="dbType">The datatype of the parameter</param>
+            <param name="sourceColumn">The source column</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.String,System.Data.DataRowVersion)">
+            <summary>
+            Constructs an unnamed parameter of the specified data type, source column and row version
+            </summary>
+            <param name="dbType">The data type</param>
+            <param name="sourceColumn">The source column</param>
+            <param name="rowVersion">The row version information</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.Int32)">
+            <summary>
+            Constructs a named parameter of the specified type and size
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.Int32,System.String)">
+            <summary>
+            Constructs a named parameter of the specified type, size and source column
+            </summary>
+            <param name="parameterName">The name of the parameter</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+            <param name="sourceColumn">The source column</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.Int32,System.String,System.Data.DataRowVersion)">
+            <summary>
+            Constructs a named parameter of the specified type, size, source column and row version
+            </summary>
+            <param name="parameterName">The name of the parameter</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+            <param name="sourceColumn">The source column</param>
+            <param name="rowVersion">The row version information</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.Int32,System.Data.ParameterDirection,System.Boolean,System.Byte,System.Byte,System.String,System.Data.DataRowVersion,System.Object)">
+            <summary>
+            Constructs a named parameter of the specified type, size, source column and row version
+            </summary>
+            <param name="parameterName">The name of the parameter</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+            <param name="direction">Only input parameters are supported in SQLite</param>
+            <param name="isNullable">Ignored</param>
+            <param name="precision">Ignored</param>
+            <param name="scale">Ignored</param>
+            <param name="sourceColumn">The source column</param>
+            <param name="rowVersion">The row version information</param>
+            <param name="value">The initial value to assign the parameter</param>   
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.Int32,System.Data.ParameterDirection,System.Byte,System.Byte,System.String,System.Data.DataRowVersion,System.Boolean,System.Object)">
+            <summary>
+            Constructs a named parameter, yet another flavor
+            </summary>
+            <param name="parameterName">The name of the parameter</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+            <param name="direction">Only input parameters are supported in SQLite</param>
+            <param name="precision">Ignored</param>
+            <param name="scale">Ignored</param>
+            <param name="sourceColumn">The source column</param>
+            <param name="rowVersion">The row version information</param>
+            <param name="sourceColumnNullMapping">Whether or not this parameter is for comparing NULL's</param>
+            <param name="value">The intial value to assign the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.Int32)">
+            <summary>
+            Constructs an unnamed parameter of the specified type and size
+            </summary>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.Int32,System.String)">
+            <summary>
+            Constructs an unnamed parameter of the specified type, size, and source column
+            </summary>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+            <param name="sourceColumn">The source column</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.Int32,System.String,System.Data.DataRowVersion)">
+            <summary>
+            Constructs an unnamed parameter of the specified type, size, source column and row version
+            </summary>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+            <param name="sourceColumn">The source column</param>
+            <param name="rowVersion">The row version information</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.ResetDbType">
+            <summary>
+            Resets the DbType of the parameter so it can be inferred from the value
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.Clone">
+            <summary>
+            Clones a parameter
+            </summary>
+            <returns>A new, unassociated SQLiteParameter</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.IsNullable">
+            <summary>
+            Whether or not the parameter can contain a null value
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.DbType">
+            <summary>
+            Returns the datatype of the parameter
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.Direction">
+            <summary>
+            Supports only input parameters
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.ParameterName">
+            <summary>
+            Returns the parameter name
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.Size">
+            <summary>
+            Returns the size of the parameter
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.SourceColumn">
+            <summary>
+            Gets/sets the source column
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.SourceColumnNullMapping">
+            <summary>
+            Used by DbCommandBuilder to determine the mapping for nullable fields
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.SourceVersion">
+            <summary>
+            Gets and sets the row version
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.Value">
+            <summary>
+            Gets and sets the parameter value.  If no datatype was specified, the datatype will assume the type from the value given.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteParameterCollection">
+            <summary>
+            SQLite implementation of DbParameterCollection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameterCollection._command">
+            <summary>
+            The underlying command to which this collection belongs
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameterCollection._parameterList">
+            <summary>
+            The internal array of parameters in this collection
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameterCollection._unboundFlag">
+            <summary>
+            Determines whether or not all parameters have been bound to their statement(s)
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.#ctor(System.Data.SQLite.SQLiteCommand)">
+            <summary>
+            Initializes the collection
+            </summary>
+            <param name="cmd">The command to which the collection belongs</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.GetEnumerator">
+            <summary>
+            Retrieves an enumerator for the collection
+            </summary>
+            <returns>An enumerator for the underlying array</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Add(System.String,System.Data.DbType,System.Int32,System.String)">
+            <summary>
+            Adds a parameter to the collection
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the value</param>
+            <param name="sourceColumn">The source column</param>
+            <returns>A SQLiteParameter object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Add(System.String,System.Data.DbType,System.Int32)">
+            <summary>
+            Adds a parameter to the collection
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the value</param>
+            <returns>A SQLiteParameter object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Add(System.String,System.Data.DbType)">
+            <summary>
+            Adds a parameter to the collection
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="parameterType">The data type</param>
+            <returns>A SQLiteParameter object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Add(System.Data.SQLite.SQLiteParameter)">
+            <summary>
+            Adds a parameter to the collection
+            </summary>
+            <param name="parameter">The parameter to add</param>
+            <returns>A zero-based index of where the parameter is located in the array</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Add(System.Object)">
+            <summary>
+            Adds a parameter to the collection
+            </summary>
+            <param name="value">The parameter to add</param>
+            <returns>A zero-based index of where the parameter is located in the array</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.AddWithValue(System.String,System.Object)">
+            <summary>
+            Adds a named/unnamed parameter and its value to the parameter collection.
+            </summary>
+            <param name="parameterName">Name of the parameter, or null to indicate an unnamed parameter</param>
+            <param name="value">The initial value of the parameter</param>
+            <returns>Returns the SQLiteParameter object created during the call.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.AddRange(System.Data.SQLite.SQLiteParameter[])">
+            <summary>
+            Adds an array of parameters to the collection
+            </summary>
+            <param name="values">The array of parameters to add</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.AddRange(System.Array)">
+            <summary>
+            Adds an array of parameters to the collection
+            </summary>
+            <param name="values">The array of parameters to add</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Clear">
+            <summary>
+            Clears the array and resets the collection
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Contains(System.String)">
+            <summary>
+            Determines if the named parameter exists in the collection
+            </summary>
+            <param name="parameterName">The name of the parameter to check</param>
+            <returns>True if the parameter is in the collection</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Contains(System.Object)">
+            <summary>
+            Determines if the parameter exists in the collection
+            </summary>
+            <param name="value">The SQLiteParameter to check</param>
+            <returns>True if the parameter is in the collection</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.CopyTo(System.Array,System.Int32)">
+            <summary>
+            Not implemented
+            </summary>
+            <param name="array"></param>
+            <param name="index"></param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.GetParameter(System.String)">
+            <summary>
+            Retrieve a parameter by name from the collection
+            </summary>
+            <param name="parameterName">The name of the parameter to fetch</param>
+            <returns>A DbParameter object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.GetParameter(System.Int32)">
+            <summary>
+            Retrieves a parameter by its index in the collection
+            </summary>
+            <param name="index">The index of the parameter to retrieve</param>
+            <returns>A DbParameter object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.IndexOf(System.String)">
+            <summary>
+            Returns the index of a parameter given its name
+            </summary>
+            <param name="parameterName">The name of the parameter to find</param>
+            <returns>-1 if not found, otherwise a zero-based index of the parameter</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.IndexOf(System.Object)">
+            <summary>
+            Returns the index of a parameter
+            </summary>
+            <param name="value">The parameter to find</param>
+            <returns>-1 if not found, otherwise a zero-based index of the parameter</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Insert(System.Int32,System.Object)">
+            <summary>
+            Inserts a parameter into the array at the specified location
+            </summary>
+            <param name="index">The zero-based index to insert the parameter at</param>
+            <param name="value">The parameter to insert</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Remove(System.Object)">
+            <summary>
+            Removes a parameter from the collection
+            </summary>
+            <param name="value">The parameter to remove</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.RemoveAt(System.String)">
+            <summary>
+            Removes a parameter from the collection given its name
+            </summary>
+            <param name="parameterName">The name of the parameter to remove</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.RemoveAt(System.Int32)">
+            <summary>
+            Removes a parameter from the collection given its index
+            </summary>
+            <param name="index">The zero-based parameter index to remove</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.SetParameter(System.String,System.Data.Common.DbParameter)">
+            <summary>
+            Re-assign the named parameter to a new parameter object
+            </summary>
+            <param name="parameterName">The name of the parameter to replace</param>
+            <param name="value">The new parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.SetParameter(System.Int32,System.Data.Common.DbParameter)">
+            <summary>
+            Re-assign a parameter at the specified index
+            </summary>
+            <param name="index">The zero-based index of the parameter to replace</param>
+            <param name="value">The new parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Unbind">
+            <summary>
+            Un-binds all parameters from their statements
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.MapParameters(System.Data.SQLite.SQLiteStatement)">
+            <summary>
+            This function attempts to map all parameters in the collection to all statements in a Command.
+            Since named parameters may span multiple statements, this function makes sure all statements are bound
+            to the same named parameter.  Unnamed parameters are bound in sequence.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.IsSynchronized">
+            <summary>
+            Returns false
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.IsFixedSize">
+            <summary>
+            Returns false
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.IsReadOnly">
+            <summary>
+            Returns false
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.SyncRoot">
+            <summary>
+            Returns null
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.Count">
+            <summary>
+            Returns a count of parameters in the collection
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.Item(System.String)">
+            <summary>
+            Overloaded to specialize the return value of the default indexer
+            </summary>
+            <param name="parameterName">Name of the parameter to get/set</param>
+            <returns>The specified named SQLite parameter</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.Item(System.Int32)">
+            <summary>
+            Overloaded to specialize the return value of the default indexer
+            </summary>
+            <param name="index">The index of the parameter to get/set</param>
+            <returns>The specified SQLite parameter</returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteStatement">
+            <summary>
+            Represents a single SQL statement in SQLite.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._sql">
+            <summary>
+            The underlying SQLite object this statement is bound to
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._sqlStatement">
+            <summary>
+            The command text of this SQL statement
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._sqlite_stmt">
+            <summary>
+            The actual statement pointer
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._unnamedParameters">
+            <summary>
+            An index from which unnamed parameters begin
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._paramNames">
+            <summary>
+            Names of the parameters as SQLite understands them to be
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._paramValues">
+            <summary>
+            Parameters for this statement
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._command">
+            <summary>
+            Command this statement belongs to (if any)
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._flags">
+            <summary>
+            The flags associated with the parent connection object.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.#ctor(System.Data.SQLite.SQLiteBase,System.Data.SQLite.SQLiteConnectionFlags,System.Data.SQLite.SQLiteStatementHandle,System.String,System.Data.SQLite.SQLiteStatement)">
+            <summary>
+            Initializes the statement and attempts to get all information about parameters in the statement
+            </summary>
+            <param name="sqlbase">The base SQLite object</param>
+            <param name="flags">The flags associated with the parent connection object</param>
+            <param name="stmt">The statement</param>
+            <param name="strCommand">The command text for this statement</param>
+            <param name="previous">The previous command in a multi-statement command</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.Dispose">
+            <summary>
+            Disposes and finalizes the statement
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.TryGetChanges(System.Int32@)">
+            <summary>
+            If the underlying database connection is open, fetches the number of changed rows
+            resulting from the most recent query; otherwise, does nothing.
+            </summary>
+            <param name="changes">
+            The number of changes when true is returned.
+            Undefined if false is returned.
+            </param>
+            <returns>Non-zero if the number of changed rows was fetched.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.MapParameter(System.String,System.Data.SQLite.SQLiteParameter)">
+            <summary>
+            Called by SQLiteParameterCollection, this function determines if the specified parameter name belongs to
+            this statement, and if so, keeps a reference to the parameter so it can be bound later.
+            </summary>
+            <param name="s">The parameter name to map</param>
+            <param name="p">The parameter to assign it</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.BindParameters">
+            <summary>
+             Bind all parameters, making sure the caller didn't miss any
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.ToBoolean(System.Object,System.IFormatProvider)">
+            <summary>
+            Attempts to convert an arbitrary object to the Boolean data type.
+            Null object values are converted to false.  Throws a SQLiteException
+            upon failure.
+            </summary>
+            <param name="obj">The object value to convert.</param>
+            <param name="provider">The format provider to use.</param>
+            <returns>The converted boolean value.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.BindParameter(System.Int32,System.Data.SQLite.SQLiteParameter)">
+            <summary>
+            Perform the bind operation for an individual parameter
+            </summary>
+            <param name="index">The index of the parameter to bind</param>
+            <param name="param">The parameter we're binding</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteTransaction">
+            <summary>
+            SQLite implementation of DbTransaction.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteTransaction._cnn">
+            <summary>
+            The connection to which this transaction is bound
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteTransaction.#ctor(System.Data.SQLite.SQLiteConnection,System.Boolean)">
+            <summary>
+            Constructs the transaction object, binding it to the supplied connection
+            </summary>
+            <param name="connection">The connection to open a transaction on</param>
+            <param name="deferredLock">TRUE to defer the writelock, or FALSE to lock immediately</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteTransaction.Dispose(System.Boolean)">
+            <summary>
+            Disposes the transaction.  If it is currently active, any changes are rolled back.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteTransaction.Commit">
+            <summary>
+            Commits the current transaction.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteTransaction.Rollback">
+            <summary>
+            Rolls back the active transaction.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteTransaction.Connection">
+            <summary>
+            Returns the underlying connection to which this transaction applies.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteTransaction.DbConnection">
+            <summary>
+            Forwards to the local Connection property
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteTransaction.IsolationLevel">
+            <summary>
+            Gets the isolation level of the transaction.  SQLite only supports Serializable transactions.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SR">
+            <summary>
+              A strongly-typed resource class, for looking up localized strings, etc.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SR.ResourceManager">
+            <summary>
+              Returns the cached ResourceManager instance used by this class.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SR.Culture">
+            <summary>
+              Overrides the current thread's CurrentUICulture property for all
+              resource lookups using this strongly typed resource class.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SR.DataTypes">
+             <summary>
+               Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot; standalone=&quot;yes&quot;?&gt;
+            &lt;DocumentElement&gt;
+              &lt;DataTypes&gt;
+                &lt;TypeName&gt;smallint&lt;/TypeName&gt;
+                &lt;ProviderDbType&gt;10&lt;/ProviderDbType&gt;
+                &lt;ColumnSize&gt;5&lt;/ColumnSize&gt;
+                &lt;DataType&gt;System.Int16&lt;/DataType&gt;
+                &lt;CreateFormat&gt;smallint&lt;/CreateFormat&gt;
+                &lt;IsAutoIncrementable&gt;false&lt;/IsAutoIncrementable&gt;
+                &lt;IsCaseSensitive&gt;false&lt;/IsCaseSensitive&gt;
+                &lt;IsFixedLength&gt;true&lt;/IsFixedLength&gt;
+                &lt;IsFixedPrecisionScale&gt;true&lt;/IsFixedPrecisionScale&gt;
+                &lt;IsLong&gt;false&lt;/IsLong&gt;
+                &lt;IsNullable&gt;true&lt;/ [rest of string was truncated]&quot;;.
+             </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SR.Keywords">
+            <summary>
+              Looks up a localized string similar to ALL,ALTER,AND,AS,AUTOINCREMENT,BETWEEN,BY,CASE,CHECK,COLLATE,COMMIT,CONSTRAINT,CREATE,CROSS,DEFAULT,DEFERRABLE,DELETE,DISTINCT,DROP,ELSE,ESCAPE,EXCEPT,FOREIGN,FROM,FULL,GROUP,HAVING,IN,INDEX,INNER,INSERT,INTERSECT,INTO,IS,ISNULL,JOIN,LEFT,LIMIT,NATURAL,NOT,NOTNULL,NULL,ON,OR,ORDER,OUTER,PRIMARY,REFERENCES,RIGHT,ROLLBACK,SELECT,SET,TABLE,THEN,TO,TRANSACTION,UNION,UNIQUE,UPDATE,USING,VALUES,WHEN,WHERE.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SR.MetaDataCollections">
+             <summary>
+               Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
+            &lt;DocumentElement&gt;
+              &lt;MetaDataCollections&gt;
+                &lt;CollectionName&gt;MetaDataCollections&lt;/CollectionName&gt;
+                &lt;NumberOfRestrictions&gt;0&lt;/NumberOfRestrictions&gt;
+                &lt;NumberOfIdentifierParts&gt;0&lt;/NumberOfIdentifierParts&gt;
+              &lt;/MetaDataCollections&gt;
+              &lt;MetaDataCollections&gt;
+                &lt;CollectionName&gt;DataSourceInformation&lt;/CollectionName&gt;
+                &lt;NumberOfRestrictions&gt;0&lt;/NumberOfRestrictions&gt;
+                &lt;NumberOfIdentifierParts&gt;0&lt;/NumberOfIdentifierParts&gt;
+              &lt;/MetaDataCollections&gt;
+              &lt;MetaDataC [rest of string was truncated]&quot;;.
+             </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UnsafeNativeMethods.PROCESSOR_ARCHITECTURE">
+            <summary>
+            The name of the environment variable containing the processor
+            architecture of the current process.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.LoadLibrary(System.String)">
+            <summary>
+            This is the P/Invoke method that wraps the native Win32 LoadLibrary
+            function.  See the MSDN documentation for full details on what it
+            does.
+            </summary>
+            <param name="fileName">
+            The name of the executable library.
+            </param>
+            <returns>
+            The native module handle upon success -OR- IntPtr.Zero on failure.
+            </returns>
+        </member>
+        <member name="F:System.Data.SQLite.UnsafeNativeMethods.staticSyncRoot">
+            <summary>
+            This lock is used to protect the static _SQLiteModule and
+            processorArchitecturePlatforms fields, below.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UnsafeNativeMethods.processorArchitecturePlatforms">
+            <summary>
+            Stores the mappings between processor architecture names and platform
+            names.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UnsafeNativeMethods._SQLiteModule">
+            <summary>
+            The native module handle for the native SQLite library or the value
+            IntPtr.Zero.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.#cctor">
+            <summary>
+            For now, this method simply calls the Initialize method.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.Initialize">
+            <summary>
+            Attempts to initialize this class by pre-loading the native SQLite
+            library for the processor architecture of the current process.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.GetBaseDirectory">
+            <summary>
+            Queries and returns the base directory of the current application
+            domain.
+            </summary>
+            <returns>
+            The base directory for the current application domain -OR- null if it
+            cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.FixUpDllFileName(System.String)">
+            <summary>
+            Determines if the dynamic link library file name requires a suffix
+            and adds it if necessary.
+            </summary>
+            <param name="fileName">
+            The original dynamic link library file name to inspect.
+            </param>
+            <returns>
+            The dynamic link library file name, possibly modified to include an
+            extension.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.GetProcessorArchitecture">
+            <summary>
+            Queries and returns the processor architecture of the current
+            process.
+            </summary>
+            <returns>
+            The processor architecture of the current process -OR- null if it
+            cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.GetPlatformName(System.String)">
+            <summary>
+            Given the processor architecture, returns the name of the platform.
+            </summary>
+            <param name="processorArchitecture">
+            The processor architecture to be translated to a platform name.
+            </param>
+            <returns>
+            The platform name for the specified processor architecture -OR- null
+            if it cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.PreLoadSQLiteDll(System.String,System.String)">
+            <summary>
+            Attempts to load the native SQLite library based on the specified
+            directory and processor architecture.
+            </summary>
+            <param name="directory">
+            The base directory to use, null for default (the base directory of
+            the current application domain).  This directory should contain the
+            processor architecture specific sub-directories.
+            </param>
+            <param name="processorArchitecture">
+            The requested processor architecture, null for default (the
+            processor architecture of the current process).  This caller should
+            almost always specify null for this parameter.
+            </param>
+            <returns>
+            The native module handle as returned by LoadLibrary -OR- IntPtr.Zero
+            if the loading fails for any reason.
+            </returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteContext">
+            <summary>
+            This class represents a context from the SQLite core library that can
+            be passed to the sqlite3_result_*() and associated functions.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.ISQLiteNativeHandle">
+            <summary>
+            This interface represents a native handle provided by the SQLite core
+            library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.ISQLiteNativeHandle.NativeHandle">
+            <summary>
+            The native handle value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteContext.pContext">
+            <summary>
+            The native context handle.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.#ctor(System.IntPtr)">
+            <summary>
+            Constructs an instance of this class using the specified native
+            context handle.
+            </summary>
+            <param name="pContext">
+            The native context handle to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetNull">
+            <summary>
+            Sets the context result to NULL.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetDouble(System.Double)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.Double"/>
+            value.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.Double"/> value to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetInt(System.Int32)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.Int32"/>
+            value.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.Int32"/> value to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetInt64(System.Int64)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.Int64"/>
+            value.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.Int64"/> value to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetString(System.String)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.String"/>
+            value.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.String"/> value to use.  This value will be
+            converted to the UTF-8 encoding prior to being used.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetError(System.String)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.String"/>
+            value containing an error message.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.String"/> value containing the error message text.
+            This value will be converted to the UTF-8 encoding prior to being
+            used.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetErrorCode(System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.Data.SQLite.SQLiteErrorCode"/>
+            value.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetErrorTooBig">
+            <summary>
+            Sets the context result to contain the error code SQLITE_TOOBIG.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetErrorNoMemory">
+            <summary>
+            Sets the context result to contain the error code SQLITE_NOMEM.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetBlob(System.Byte[])">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.Byte"/> array
+            value.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.Byte"/> array value to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetZeroBlob(System.Int32)">
+            <summary>
+            Sets the context result to a BLOB of zeros of the specified size.
+            </summary>
+            <param name="value">
+            The number of zero bytes to use for the BLOB context result.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetValue(System.Data.SQLite.SQLiteValue)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.Data.SQLite.SQLiteValue"/>.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.Data.SQLite.SQLiteValue"/> to use.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteContext.NativeHandle">
+            <summary>
+            Returns the underlying SQLite native handle associated with this
+            object instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteValue">
+            <summary>
+            This class represents a value from the SQLite core library that can be
+            passed to the sqlite3_value_*() and associated functions.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteValue.pValue">
+            <summary>
+            The native value handle.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.#ctor(System.IntPtr)">
+            <summary>
+            Constructs an instance of this class using the specified native
+            value handle.
+            </summary>
+            <param name="pValue">
+            The native value handle to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.PreventNativeAccess">
+            <summary>
+            Invalidates the native value handle, thereby preventing further
+            access to it from this object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.ArrayFromSizeAndIntPtr(System.Int32,System.IntPtr)">
+            <summary>
+            Converts a logical array of native pointers to native sqlite3_value
+            structures into a managed array of <see cref="T:System.Data.SQLite.SQLiteValue"/>
+            object instances.
+            </summary>
+            <param name="argc">
+            The number of elements in the logical array of native sqlite3_value
+            structures.
+            </param>
+            <param name="argv">
+            The native pointer to the logical array of native sqlite3_value
+            structures to convert.
+            </param>
+            <returns>
+            The managed array of <see cref="T:System.Data.SQLite.SQLiteValue"/> object instances or
+            null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetTypeAffinity">
+            <summary>
+            Gets and returns the type affinity associated with this value.
+            </summary>
+            <returns>
+            The type affinity associated with this value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetBytes">
+            <summary>
+            Gets and returns the number of bytes associated with this value, if
+            it refers to a UTF-8 encoded string.
+            </summary>
+            <returns>
+            The number of bytes associated with this value.  The returned value
+            may be zero.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetInt">
+            <summary>
+            Gets and returns the <see cref="T:System.Int32"/> associated with this
+            value.
+            </summary>
+            <returns>
+            The <see cref="T:System.Int32"/> associated with this value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetInt64">
+            <summary>
+            Gets and returns the <see cref="T:System.Int64"/> associated with
+            this value.
+            </summary>
+            <returns>
+            The <see cref="T:System.Int64"/> associated with this value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetDouble">
+            <summary>
+            Gets and returns the <see cref="T:System.Double"/> associated with this
+            value.
+            </summary>
+            <returns>
+            The <see cref="T:System.Double"/> associated with this value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetString">
+            <summary>
+            Gets and returns the <see cref="T:System.String"/> associated with this
+            value.
+            </summary>
+            <returns>
+            The <see cref="T:System.String"/> associated with this value.  The value is
+            converted from the UTF-8 encoding prior to being returned.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetBlob">
+            <summary>
+            Gets and returns the <see cref="T:System.Byte"/> array associated with this
+            value.
+            </summary>
+            <returns>
+            The <see cref="T:System.Byte"/> array associated with this value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.Persist">
+            <summary>
+            Uses the native value handle to obtain and store the managed value
+            for this object instance, thus saving it for later use.  The type
+            of the managed value is determined by the type affinity of the
+            native value.  If the type affinity is not recognized by this
+            method, no work is done and false is returned.
+            </summary>
+            <returns>
+            Non-zero if the native value was persisted successfully.
+            </returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteValue.NativeHandle">
+            <summary>
+            Returns the underlying SQLite native handle associated with this
+            object instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteValue.Persisted">
+            <summary>
+            Returns non-zero if the native SQLite value has been successfully
+            persisted as a managed value within this object instance (i.e. the
+            <see cref="P:System.Data.SQLite.SQLiteValue.Value"/> property may then be read successfully).
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteValue.Value">
+            <summary>
+            If the managed value for this object instance is available (i.e. it
+            has been previously persisted via the <see cref="M:System.Data.SQLite.SQLiteValue.Persist"/>) method,
+            that value is returned; otherwise, an exception is thrown.  The
+            returned value may be null.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndexConstraintOp">
+            <summary>
+            These are the allowed values for the operators that are part of a
+            constraint term in the WHERE clause of a query that uses a virtual
+            table.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintOp.EqualTo">
+            <summary>
+            This value represents the equality operator.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintOp.GreaterThan">
+            <summary>
+            This value represents the greater than operator.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintOp.LessThanOrEqualTo">
+            <summary>
+            This value represents the less than or equal to operator.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintOp.LessThan">
+            <summary>
+            This value represents the less than operator.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintOp.GreaterThanOrEqualTo">
+            <summary>
+            This value represents the greater than or equal to operator.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintOp.Match">
+            <summary>
+            This value represents the MATCH operator.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndexConstraint">
+            <summary>
+            This class represents the native sqlite3_index_constraint structure
+            from the SQLite core library.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexConstraint.#ctor(System.Data.SQLite.UnsafeNativeMethods.sqlite3_index_constraint)">
+            <summary>
+            Constructs an instance of this class using the specified native
+            sqlite3_index_constraint structure.
+            </summary>
+            <param name="constraint">
+            The native sqlite3_index_constraint structure to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexConstraint.#ctor(System.Int32,System.Data.SQLite.SQLiteIndexConstraintOp,System.Byte,System.Int32)">
+            <summary>
+            Constructs an instance of this class using the specified field
+            values.
+            </summary>
+            <param name="iColumn">
+            Column on left-hand side of constraint.
+            </param>
+            <param name="op">
+            Constraint operator (<see cref="T:System.Data.SQLite.SQLiteIndexConstraintOp"/>).
+            </param>
+            <param name="usable">
+            True if this constraint is usable.
+            </param>
+            <param name="iTermOffset">
+            Used internally - <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/>
+            should ignore.
+            </param>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraint.iColumn">
+            <summary>
+            Column on left-hand side of constraint.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraint.op">
+            <summary>
+            Constraint operator (<see cref="T:System.Data.SQLite.SQLiteIndexConstraintOp"/>).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraint.usable">
+            <summary>
+            True if this constraint is usable.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraint.iTermOffset">
+            <summary>
+            Used internally - <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/>
+            should ignore.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndexOrderBy">
+            <summary>
+            This class represents the native sqlite3_index_orderby structure from
+            the SQLite core library.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexOrderBy.#ctor(System.Data.SQLite.UnsafeNativeMethods.sqlite3_index_orderby)">
+            <summary>
+            Constructs an instance of this class using the specified native
+            sqlite3_index_orderby structure.
+            </summary>
+            <param name="orderBy">
+            The native sqlite3_index_orderby structure to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexOrderBy.#ctor(System.Int32,System.Byte)">
+            <summary>
+            Constructs an instance of this class using the specified field
+            values.
+            </summary>
+            <param name="iColumn">
+            Column number.
+            </param>
+            <param name="desc">
+            True for DESC.  False for ASC.
+            </param>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexOrderBy.iColumn">
+            <summary>
+            Column number.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexOrderBy.desc">
+            <summary>
+            True for DESC.  False for ASC.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndexConstraintUsage">
+            <summary>
+            This class represents the native sqlite3_index_constraint_usage
+            structure from the SQLite core library.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexConstraintUsage.#ctor(System.Data.SQLite.UnsafeNativeMethods.sqlite3_index_constraint_usage)">
+            <summary>
+            Constructs an instance of this class using the specified native
+            sqlite3_index_constraint_usage structure.
+            </summary>
+            <param name="constraintUsage">
+            The native sqlite3_index_constraint_usage structure to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexConstraintUsage.#ctor(System.Int32,System.Byte)">
+            <summary>
+            Constructs an instance of this class using the specified field
+            values.
+            </summary>
+            <param name="argvIndex">
+            If greater than 0, constraint is part of argv to xFilter.
+            </param>
+            <param name="omit">
+            Do not code a test for this constraint.
+            </param>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintUsage.argvIndex">
+            <summary>
+            If greater than 0, constraint is part of argv to xFilter.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintUsage.omit">
+            <summary>
+            Do not code a test for this constraint.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndexInputs">
+            <summary>
+            This class represents the various inputs provided by the SQLite core
+            library to the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexInputs.#ctor(System.Int32,System.Int32)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="nConstraint">
+            The number of <see cref="T:System.Data.SQLite.SQLiteIndexConstraint"/> instances to
+            pre-allocate space for.
+            </param>
+            <param name="nOrderBy">
+            The number of <see cref="T:System.Data.SQLite.SQLiteIndexOrderBy"/> instances to
+            pre-allocate space for.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexInputs.Constraints">
+            <summary>
+            An array of <see cref="T:System.Data.SQLite.SQLiteIndexConstraint"/> object instances,
+            each containing information supplied by the SQLite core library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexInputs.OrderBys">
+            <summary>
+            An array of <see cref="T:System.Data.SQLite.SQLiteIndexOrderBy"/> object instances,
+            each containing information supplied by the SQLite core library.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndexOutputs">
+            <summary>
+            This class represents the various outputs provided to the SQLite core
+            library by the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexOutputs.#ctor(System.Int32)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="nConstraint">
+            The number of <see cref="T:System.Data.SQLite.SQLiteIndexConstraintUsage"/> instances
+            to pre-allocate space for.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexOutputs.CanUseEstimatedRows">
+            <summary>
+            Determines if the native estimatedRows field can be used, based on
+            the available version of the SQLite core library.
+            </summary>
+            <returns>
+            Non-zero if the <see cref="P:System.Data.SQLite.SQLiteIndexOutputs.EstimatedRows"/> property is supported
+            by the SQLite core library.
+            </returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.ConstraintUsages">
+            <summary>
+            An array of <see cref="T:System.Data.SQLite.SQLiteIndexConstraintUsage"/> object
+            instances, each containing information to be supplied to the SQLite
+            core library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.IndexNumber">
+            <summary>
+            Number used to help identify the selected index.  This value will
+            later be provided to the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/>
+            method.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.IndexString">
+            <summary>
+            String used to help identify the selected index.  This value will
+            later be provided to the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/>
+            method.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.NeedToFreeIndexString">
+            <summary>
+            Non-zero if the index string must be freed by the SQLite core
+            library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.OrderByConsumed">
+            <summary>
+            True if output is already ordered.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.EstimatedCost">
+            <summary>
+            Estimated cost of using this index.  Using a null value here
+            indicates that a default estimated cost value should be used.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.EstimatedRows">
+            <summary>
+            Estimated number of rows returned.  Using a null value here
+            indicates that a default estimated rows value should be used.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndex">
+            <summary>
+            This class represents the various inputs and outputs used with the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndex.#ctor(System.Int32,System.Int32)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="nConstraint">
+            The number of <see cref="T:System.Data.SQLite.SQLiteIndexConstraint"/> (and
+            <see cref="T:System.Data.SQLite.SQLiteIndexConstraintUsage"/>) instances to
+            pre-allocate space for.
+            </param>
+            <param name="nOrderBy">
+            The number of <see cref="T:System.Data.SQLite.SQLiteIndexOrderBy"/> instances to
+            pre-allocate space for.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndex.FromIntPtr(System.IntPtr,System.Data.SQLite.SQLiteIndex@)">
+            <summary>
+            Converts a native pointer to a native sqlite3_index_info structure
+            into a new <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance.
+            </summary>
+            <param name="pIndex">
+            The native pointer to the native sqlite3_index_info structure to
+            convert.
+            </param>
+            <param name="index">
+            Upon success, this parameter will be modified to contain the newly
+            created <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndex.ToIntPtr(System.Data.SQLite.SQLiteIndex,System.IntPtr)">
+            <summary>
+            Populates the outputs of a pre-allocated native sqlite3_index_info
+            structure using an existing <see cref="T:System.Data.SQLite.SQLiteIndex"/> object
+            instance.
+            </summary>
+            <param name="index">
+            The existing <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance containing
+            the output data to use.
+            </param>
+            <param name="pIndex">
+            The native pointer to the pre-allocated native sqlite3_index_info
+            structure.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndex.Inputs">
+            <summary>
+            The <see cref="T:System.Data.SQLite.SQLiteIndexInputs"/> object instance containing
+            the inputs to the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/>
+            method.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndex.Outputs">
+            <summary>
+            The <see cref="T:System.Data.SQLite.SQLiteIndexOutputs"/> object instance containing
+            the outputs from the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/>
+            method.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteVirtualTable">
+            <summary>
+            This class represents a managed virtual table implementation.  It is
+            not sealed and should be used as the base class for any user-defined
+            virtual table classes implemented in managed code.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTable.ModuleNameIndex">
+            <summary>
+            The index within the array of strings provided to the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> and
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> methods containing the
+            name of the module implementing this virtual table.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTable.DatabaseNameIndex">
+            <summary>
+            The index within the array of strings provided to the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> and
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> methods containing the
+            name of the database containing this virtual table.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTable.TableNameIndex">
+            <summary>
+            The index within the array of strings provided to the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> and
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> methods containing the
+            name of the virtual table.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.#ctor(System.String[])">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="arguments">
+            The original array of strings provided to the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> and
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> methods.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.BestIndex(System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            This method should normally be used by the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method in order to
+            perform index selection based on the constraints provided by the
+            SQLite core library.
+            </summary>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance containing all the
+            data for the inputs and outputs relating to index selection.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.Rename(System.String)">
+            <summary>
+            Attempts to record the renaming of the virtual table associated
+            with this object instance.
+            </summary>
+            <param name="name">
+            The new name for the virtual table.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.Dispose">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.Data.SQLite.SQLiteVirtualTable.Dispose"/> method.  Zero if this method is being called
+            from the finalizer.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.Finalize">
+            <summary>
+            Finalizes this object instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTable.Arguments">
+            <summary>
+            The original array of strings provided to the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> and
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> methods.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTable.ModuleName">
+            <summary>
+            The name of the module implementing this virtual table.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTable.DatabaseName">
+            <summary>
+            The name of the database containing this virtual table.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTable.TableName">
+            <summary>
+            The name of the virtual table.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTable.Index">
+            <summary>
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance containing all the
+            data for the inputs and outputs relating to the most recent index
+            selection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTable.NativeHandle">
+            <summary>
+            Returns the underlying SQLite native handle associated with this
+            object instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteVirtualTableCursor">
+            <summary>
+            This class represents a managed virtual table cursor implementation.
+            It is not sealed and should be used as the base class for any
+            user-defined virtual table cursor classes implemented in managed code.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTableCursor.InvalidRowIndex">
+            <summary>
+            This value represents an invalid integer row sequence number.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTableCursor.rowIndex">
+            <summary>
+            The field holds the integer row sequence number for the current row
+            pointed to by this cursor object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.#ctor(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this object instance.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.#ctor">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.TryPersistValues(System.Data.SQLite.SQLiteValue[])">
+            <summary>
+            Attempts to persist the specified <see cref="T:System.Data.SQLite.SQLiteValue"/> object
+            instances in order to make them available after the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method returns.
+            </summary>
+            <param name="values">
+            The array of <see cref="T:System.Data.SQLite.SQLiteValue"/> object instances to be
+            persisted.
+            </param>
+            <returns>
+            The number of <see cref="T:System.Data.SQLite.SQLiteValue"/> object instances that were
+            successfully persisted.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.Filter(System.Int32,System.String,System.Data.SQLite.SQLiteValue[])">
+            <summary>
+            This method should normally be used by the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method in order to
+            perform filtering of the result rows and/or to record the filtering
+            criteria provided by the SQLite core library.
+            </summary>
+            <param name="indexNumber">
+            Number used to help identify the selected index.
+            </param>
+            <param name="indexString">
+            String used to help identify the selected index.
+            </param>
+            <param name="values">
+            The values corresponding to each column in the selected index.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.GetRowIndex">
+            <summary>
+            Determines the integer row sequence number for the current row.
+            </summary>
+            <returns>
+            The integer row sequence number for the current row -OR- zero if
+            it cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.NextRowIndex">
+            <summary>
+            Adjusts the integer row sequence number so that it refers to the
+            next row.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.Dispose">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.Data.SQLite.SQLiteVirtualTableCursor.Dispose"/> method.  Zero if this method is being called
+            from the finalizer.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.Finalize">
+            <summary>
+            Finalizes this object instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursor.Table">
+            <summary>
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this object instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursor.IndexNumber">
+            <summary>
+            Number used to help identify the selected index.  This value will
+            be set via the <see cref="M:System.Data.SQLite.SQLiteVirtualTableCursor.Filter(System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursor.IndexString">
+            <summary>
+            String used to help identify the selected index.  This value will
+            be set via the <see cref="M:System.Data.SQLite.SQLiteVirtualTableCursor.Filter(System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursor.Values">
+            <summary>
+            The values used to filter the rows returned via this cursor object
+            instance.  This value will be set via the <see cref="M:System.Data.SQLite.SQLiteVirtualTableCursor.Filter(System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/>
+            method.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursor.NativeHandle">
+            <summary>
+            Returns the underlying SQLite native handle associated with this
+            object instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.ISQLiteNativeModule">
+            <summary>
+            This interface represents a virtual table implementation written in
+            native code.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            <para>
+            This method is called to create a new instance of a virtual table
+            in response to a CREATE VIRTUAL TABLE statement. The db parameter
+            is a pointer to the SQLite database connection that is executing
+            the CREATE VIRTUAL TABLE statement. The pAux argument is the copy
+            of the client data pointer that was the fourth argument to the
+            sqlite3_create_module() or sqlite3_create_module_v2() call that
+            registered the virtual table module. The argv parameter is an
+            array of argc pointers to null terminated strings. The first
+            string, argv[0], is the name of the module being invoked. The
+            module name is the name provided as the second argument to
+            sqlite3_create_module() and as the argument to the USING clause of
+            the CREATE VIRTUAL TABLE statement that is running. The second,
+            argv[1], is the name of the database in which the new virtual table
+            is being created. The database name is "main" for the primary
+            database, or "temp" for TEMP database, or the name given at the
+            end of the ATTACH statement for attached databases. The third
+            element of the array, argv[2], is the name of the new virtual
+            table, as specified following the TABLE keyword in the CREATE
+            VIRTUAL TABLE statement. If present, the fourth and subsequent
+            strings in the argv[] array report the arguments to the module name
+            in the CREATE VIRTUAL TABLE statement.
+            </para>
+            <para>
+            The job of this method is to construct the new virtual table object
+            (an sqlite3_vtab object) and return a pointer to it in *ppVTab.
+            </para>
+            <para>
+            As part of the task of creating a new sqlite3_vtab structure, this
+            method must invoke sqlite3_declare_vtab() to tell the SQLite core
+            about the columns and datatypes in the virtual table. The
+            sqlite3_declare_vtab() API has the following prototype:
+            </para>
+            <para>
+            <code>
+            int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable)
+            </code>
+            </para>
+            <para>
+            The first argument to sqlite3_declare_vtab() must be the same
+            database connection pointer as the first parameter to this method.
+            The second argument to sqlite3_declare_vtab() must a
+            zero-terminated UTF-8 string that contains a well-formed CREATE
+            TABLE statement that defines the columns in the virtual table and
+            their data types. The name of the table in this CREATE TABLE
+            statement is ignored, as are all constraints. Only the column names
+            and datatypes matter. The CREATE TABLE statement string need not to
+            be held in persistent memory. The string can be deallocated and/or
+            reused as soon as the sqlite3_declare_vtab() routine returns.
+            </para>
+            </summary>
+            <param name="pDb">
+            The native database connection handle.
+            </param>
+            <param name="pAux">
+            The original native pointer value that was provided to the
+            sqlite3_create_module(), sqlite3_create_module_v2() or
+            sqlite3_create_disposable_module() functions.
+            </param>
+            <param name="argc">
+            The number of arguments from the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="argv">
+            The array of string arguments from the CREATE VIRTUAL TABLE
+            statement.
+            </param>
+            <param name="pVtab">
+            Upon success, this parameter must be modified to point to the newly
+            created native sqlite3_vtab derived structure.
+            </param>
+            <param name="pError">
+            Upon failure, this parameter must be modified to point to the error
+            message, with the underlying memory having been obtained from the
+            sqlite3_malloc() function.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            <para>
+            The xConnect method is very similar to xCreate. It has the same
+            parameters and constructs a new sqlite3_vtab structure just like
+            xCreate. And it must also call sqlite3_declare_vtab() like xCreate.
+            </para>
+            <para>
+            The difference is that xConnect is called to establish a new
+            connection to an existing virtual table whereas xCreate is called
+            to create a new virtual table from scratch.
+            </para>
+            <para>
+            The xCreate and xConnect methods are only different when the
+            virtual table has some kind of backing store that must be
+            initialized the first time the virtual table is created. The
+            xCreate method creates and initializes the backing store. The
+            xConnect method just connects to an existing backing store.
+            </para>
+            <para>
+            As an example, consider a virtual table implementation that
+            provides read-only access to existing comma-separated-value (CSV)
+            files on disk. There is no backing store that needs to be created
+            or initialized for such a virtual table (since the CSV files
+            already exist on disk) so the xCreate and xConnect methods will be
+            identical for that module.
+            </para>
+            <para>
+            Another example is a virtual table that implements a full-text
+            index. The xCreate method must create and initialize data
+            structures to hold the dictionary and posting lists for that index.
+            The xConnect method, on the other hand, only has to locate and use
+            an existing dictionary and posting lists that were created by a
+            prior xCreate call.
+            </para>
+            <para>
+            The xConnect method must return SQLITE_OK if it is successful in
+            creating the new virtual table, or SQLITE_ERROR if it is not
+            successful. If not successful, the sqlite3_vtab structure must not
+            be allocated. An error message may optionally be returned in *pzErr
+            if unsuccessful. Space to hold the error message string must be
+            allocated using an SQLite memory allocation function like
+            sqlite3_malloc() or sqlite3_mprintf() as the SQLite core will
+            attempt to free the space using sqlite3_free() after the error has
+            been reported up to the application.
+            </para>
+            <para>
+            The xConnect method is required for every virtual table
+            implementation, though the xCreate and xConnect pointers of the
+            sqlite3_module object may point to the same function the virtual
+            table does not need to initialize backing store.
+            </para>
+            </summary>
+            <param name="pDb">
+            The native database connection handle.
+            </param>
+            <param name="pAux">
+            The original native pointer value that was provided to the
+            sqlite3_create_module(), sqlite3_create_module_v2() or
+            sqlite3_create_disposable_module() functions.
+            </param>
+            <param name="argc">
+            The number of arguments from the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="argv">
+            The array of string arguments from the CREATE VIRTUAL TABLE
+            statement.
+            </param>
+            <param name="pVtab">
+            Upon success, this parameter must be modified to point to the newly
+            created native sqlite3_vtab derived structure.
+            </param>
+            <param name="pError">
+            Upon failure, this parameter must be modified to point to the error
+            message, with the underlying memory having been obtained from the
+            sqlite3_malloc() function.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)">
+            <summary>
+            <para>
+            SQLite uses the xBestIndex method of a virtual table module to
+            determine the best way to access the virtual table. The xBestIndex
+            method has a prototype like this:
+            </para>
+            <code>
+            int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*);
+            </code>
+            <para>
+            The SQLite core communicates with the xBestIndex method by filling
+            in certain fields of the sqlite3_index_info structure and passing a
+            pointer to that structure into xBestIndex as the second parameter.
+            The xBestIndex method fills out other fields of this structure
+            which forms the reply. The sqlite3_index_info structure looks like
+            this:
+            </para>
+            <code>
+             struct sqlite3_index_info {
+               /* Inputs */
+               const int nConstraint;   /* Number of entries in aConstraint */
+               const struct sqlite3_index_constraint {
+                  int iColumn;          /* Column on left-hand side of
+                                         * constraint */
+                  unsigned char op;     /* Constraint operator */
+                  unsigned char usable; /* True if this constraint is usable */
+                  int iTermOffset;      /* Used internally - xBestIndex should
+                                         * ignore */
+               } *const aConstraint;    /* Table of WHERE clause constraints */
+               const int nOrderBy;      /* Number of terms in the ORDER BY
+                                         * clause */
+               const struct sqlite3_index_orderby {
+                  int iColumn;          /* Column number */
+                  unsigned char desc;   /* True for DESC.  False for ASC. */
+               } *const aOrderBy;       /* The ORDER BY clause */
+               /* Outputs */
+               struct sqlite3_index_constraint_usage {
+                 int argvIndex;         /* if greater than zero, constraint is
+                                         * part of argv to xFilter */
+                 unsigned char omit;    /* Do not code a test for this
+                                         * constraint */
+               } *const aConstraintUsage;
+               int idxNum;              /* Number used to identify the index */
+               char *idxStr;            /* String, possibly obtained from
+                                         * sqlite3_malloc() */
+               int needToFreeIdxStr;    /* Free idxStr using sqlite3_free() if
+                                         * true */
+               int orderByConsumed;     /* True if output is already ordered */
+               double estimatedCost;    /* Estimated cost of using this index */
+             };
+            </code>
+            <para>
+            In addition, there are some defined constants:
+            </para>
+            <code>
+             #define SQLITE_INDEX_CONSTRAINT_EQ    2
+             #define SQLITE_INDEX_CONSTRAINT_GT    4
+             #define SQLITE_INDEX_CONSTRAINT_LE    8
+             #define SQLITE_INDEX_CONSTRAINT_LT    16
+             #define SQLITE_INDEX_CONSTRAINT_GE    32
+             #define SQLITE_INDEX_CONSTRAINT_MATCH 64
+            </code>
+            <para>
+            The SQLite core calls the xBestIndex method when it is compiling a
+            query that involves a virtual table. In other words, SQLite calls
+            this method when it is running sqlite3_prepare() or the equivalent.
+            By calling this method, the SQLite core is saying to the virtual
+            table that it needs to access some subset of the rows in the
+            virtual table and it wants to know the most efficient way to do
+            that access. The xBestIndex method replies with information that
+            the SQLite core can then use to conduct an efficient search of the
+            virtual table.
+            </para>
+            <para>
+            While compiling a single SQL query, the SQLite core might call
+            xBestIndex multiple times with different settings in
+            sqlite3_index_info. The SQLite core will then select the
+            combination that appears to give the best performance.
+            </para>
+            <para>
+            Before calling this method, the SQLite core initializes an instance
+            of the sqlite3_index_info structure with information about the
+            query that it is currently trying to process. This information
+            derives mainly from the WHERE clause and ORDER BY or GROUP BY
+            clauses of the query, but also from any ON or USING clauses if the
+            query is a join. The information that the SQLite core provides to
+            the xBestIndex method is held in the part of the structure that is
+            marked as "Inputs". The "Outputs" section is initialized to zero.
+            </para>
+            <para>
+            The information in the sqlite3_index_info structure is ephemeral
+            and may be overwritten or deallocated as soon as the xBestIndex
+            method returns. If the xBestIndex method needs to remember any part
+            of the sqlite3_index_info structure, it should make a copy. Care
+            must be take to store the copy in a place where it will be
+            deallocated, such as in the idxStr field with needToFreeIdxStr set
+            to 1.
+            </para>
+            <para>
+            Note that xBestIndex will always be called before xFilter, since
+            the idxNum and idxStr outputs from xBestIndex are required inputs
+            to xFilter. However, there is no guarantee that xFilter will be
+            called following a successful xBestIndex.
+            </para>
+            <para>
+            The xBestIndex method is required for every virtual table
+            implementation.
+            </para>
+            <para>
+            2.3.1 Inputs
+            </para>
+            <para>
+            The main thing that the SQLite core is trying to communicate to the
+            virtual table is the constraints that are available to limit the
+            number of rows that need to be searched. The aConstraint[] array
+            contains one entry for each constraint. There will be exactly
+            nConstraint entries in that array.
+            </para>
+            <para>
+            Each constraint will correspond to a term in the WHERE clause or in
+            a USING or ON clause that is of the form
+            </para>
+            <code>
+                column OP EXPR
+            </code>
+            <para>
+            Where "column" is a column in the virtual table, OP is an operator
+            like "=" or "&lt;", and EXPR is an arbitrary expression. So, for
+            example, if the WHERE clause contained a term like this:
+            </para>
+            <code>
+                     a = 5
+            </code>
+            <para>
+            Then one of the constraints would be on the "a" column with
+            operator "=" and an expression of "5". Constraints need not have a
+            literal representation of the WHERE clause. The query optimizer
+            might make transformations to the WHERE clause in order to extract
+            as many constraints as it can. So, for example, if the WHERE clause
+            contained something like this:
+            </para>
+            <code>
+                     x BETWEEN 10 AND 100 AND 999&gt;y
+            </code>
+            <para>
+            The query optimizer might translate this into three separate
+            constraints:
+            </para>
+            <code>
+                     x &gt;= 10
+                     x &lt;= 100
+                     y &lt; 999
+            </code>
+            <para>
+            For each constraint, the aConstraint[].iColumn field indicates
+            which column appears on the left-hand side of the constraint. The
+            first column of the virtual table is column 0. The rowid of the
+            virtual table is column -1. The aConstraint[].op field indicates
+            which operator is used. The SQLITE_INDEX_CONSTRAINT_* constants map
+            integer constants into operator values. Columns occur in the order
+            they were defined by the call to sqlite3_declare_vtab() in the
+            xCreate or xConnect method. Hidden columns are counted when
+            determining the column index.
+            </para>
+            <para>
+            The aConstraint[] array contains information about all constraints
+            that apply to the virtual table. But some of the constraints might
+            not be usable because of the way tables are ordered in a join. The
+            xBestIndex method must therefore only consider constraints that
+            have an aConstraint[].usable flag which is true.
+            </para>
+            <para>
+            In addition to WHERE clause constraints, the SQLite core also tells
+            the xBestIndex method about the ORDER BY clause. (In an aggregate
+            query, the SQLite core might put in GROUP BY clause information in
+            place of the ORDER BY clause information, but this fact should not
+            make any difference to the xBestIndex method.) If all terms of the
+            ORDER BY clause are columns in the virtual table, then nOrderBy
+            will be the number of terms in the ORDER BY clause and the
+            aOrderBy[] array will identify the column for each term in the
+            order by clause and whether or not that column is ASC or DESC.
+            </para>
+            <para>
+            2.3.2 Outputs
+            </para>
+            <para>
+            Given all of the information above, the job of the xBestIndex
+            method it to figure out the best way to search the virtual table.
+            </para>
+            <para>
+            The xBestIndex method fills the idxNum and idxStr fields with
+            information that communicates an indexing strategy to the xFilter
+            method. The information in idxNum and idxStr is arbitrary as far as
+            the SQLite core is concerned. The SQLite core just copies the
+            information through to the xFilter method. Any desired meaning can
+            be assigned to idxNum and idxStr as long as xBestIndex and xFilter
+            agree on what that meaning is.
+            </para>
+            <para>
+            The idxStr value may be a string obtained from an SQLite memory
+            allocation function such as sqlite3_mprintf(). If this is the case,
+            then the needToFreeIdxStr flag must be set to true so that the
+            SQLite core will know to call sqlite3_free() on that string when it
+            has finished with it, and thus avoid a memory leak.
+            </para>
+            <para>
+            If the virtual table will output rows in the order specified by the
+            ORDER BY clause, then the orderByConsumed flag may be set to true.
+            If the output is not automatically in the correct order then
+            orderByConsumed must be left in its default false setting. This
+            will indicate to the SQLite core that it will need to do a separate
+            sorting pass over the data after it comes out of the virtual table.
+            </para>
+            <para>
+            The estimatedCost field should be set to the estimated number of
+            disk access operations required to execute this query against the
+            virtual table. The SQLite core will often call xBestIndex multiple
+            times with different constraints, obtain multiple cost estimates,
+            then choose the query plan that gives the lowest estimate.
+            </para>
+            <para>
+            The aConstraintUsage[] array contains one element for each of the
+            nConstraint constraints in the inputs section of the
+            sqlite3_index_info structure. The aConstraintUsage[] array is used
+            by xBestIndex to tell the core how it is using the constraints.
+            </para>
+            <para>
+            The xBestIndex method may set aConstraintUsage[].argvIndex entries
+            to values greater than one. Exactly one entry should be set to 1,
+            another to 2, another to 3, and so forth up to as many or as few as
+            the xBestIndex method wants. The EXPR of the corresponding
+            constraints will then be passed in as the argv[] parameters to
+            xFilter.
+            </para>
+            <para>
+            For example, if the aConstraint[3].argvIndex is set to 1, then when
+            xFilter is called, the argv[0] passed to xFilter will have the EXPR
+            value of the aConstraint[3] constraint.
+            </para>
+            <para>
+            By default, the SQLite core double checks all constraints on each
+            row of the virtual table that it receives. If such a check is
+            redundant, the xBestFilter method can suppress that double-check by
+            setting aConstraintUsage[].omit.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="pIndex">
+            The native pointer to the sqlite3_index_info structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)">
+            <summary>
+            <para>
+            This method releases a connection to a virtual table. Only the
+            sqlite3_vtab object is destroyed. The virtual table is not
+            destroyed and any backing store associated with the virtual table
+            persists. This method undoes the work of xConnect.
+            </para>
+            <para>
+            This method is a destructor for a connection to the virtual table.
+            Contrast this method with xDestroy. The xDestroy is a destructor
+            for the entire virtual table.
+            </para>
+            <para>
+            The xDisconnect method is required for every virtual table
+            implementation, though it is acceptable for the xDisconnect and
+            xDestroy methods to be the same function if that makes sense for
+            the particular virtual table.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)">
+            <summary>
+            <para>
+            This method releases a connection to a virtual table, just like the
+            xDisconnect method, and it also destroys the underlying table
+            implementation. This method undoes the work of xCreate.
+            </para>
+            <para>
+            The xDisconnect method is called whenever a database connection
+            that uses a virtual table is closed. The xDestroy method is only
+            called when a DROP TABLE statement is executed against the virtual
+            table.
+            </para>
+            <para>
+            The xDestroy method is required for every virtual table
+            implementation, though it is acceptable for the xDisconnect and
+            xDestroy methods to be the same function if that makes sense for
+            the particular virtual table.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)">
+            <summary>
+            <para>
+            The xOpen method creates a new cursor used for accessing (read
+            and/or writing) a virtual table. A successful invocation of this
+            method will allocate the memory for the sqlite3_vtab_cursor (or a
+            subclass), initialize the new object, and make *ppCursor point to
+            the new object. The successful call then returns SQLITE_OK.
+            </para>
+            <para>
+            For every successful call to this method, the SQLite core will
+            later invoke the xClose method to destroy the allocated cursor.
+            </para>
+            <para>
+            The xOpen method need not initialize the pVtab field of the
+            sqlite3_vtab_cursor structure. The SQLite core will take care of
+            that chore automatically.
+            </para>
+            <para>
+            A virtual table implementation must be able to support an arbitrary
+            number of simultaneously open cursors.
+            </para>
+            <para>
+            When initially opened, the cursor is in an undefined state. The
+            SQLite core will invoke the xFilter method on the cursor prior to
+            any attempt to position or read from the cursor.
+            </para>
+            <para>
+            The xOpen method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="pCursor">
+            Upon success, this parameter must be modified to point to the newly
+            created native sqlite3_vtab_cursor derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)">
+            <summary>
+            <para>
+            The xClose method closes a cursor previously opened by xOpen. The
+            SQLite core will always call xClose once for each cursor opened
+            using xOpen.
+            </para>
+            <para>
+            This method must release all resources allocated by the
+            corresponding xOpen call. The routine will not be called again even
+            if it returns an error. The SQLite core will not use the
+            sqlite3_vtab_cursor again after it has been closed.
+            </para>
+            <para>
+            The xClose method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            <para>
+            This method begins a search of a virtual table. The first argument
+            is a cursor opened by xOpen. The next two argument define a
+            particular search index previously chosen by xBestIndex. The
+            specific meanings of idxNum and idxStr are unimportant as long as
+            xFilter and xBestIndex agree on what that meaning is.
+            </para>
+            <para>
+            The xBestIndex function may have requested the values of certain
+            expressions using the aConstraintUsage[].argvIndex values of the
+            sqlite3_index_info structure. Those values are passed to xFilter
+            using the argc and argv parameters.
+            </para>
+            <para>
+            If the virtual table contains one or more rows that match the
+            search criteria, then the cursor must be left point at the first
+            row. Subsequent calls to xEof must return false (zero). If there
+            are no rows match, then the cursor must be left in a state that
+            will cause the xEof to return true (non-zero). The SQLite engine
+            will use the xColumn and xRowid methods to access that row content.
+            The xNext method will be used to advance to the next row.
+            </para>
+            <para>
+            This method must return SQLITE_OK if successful, or an sqlite error
+            code if an error occurs.
+            </para>
+            <para>
+            The xFilter method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <param name="idxNum">
+            Number used to help identify the selected index.
+            </param>
+            <param name="idxStr">
+            The native pointer to the UTF-8 encoded string containing the
+            string used to help identify the selected index.
+            </param>
+            <param name="argc">
+            The number of native pointers to sqlite3_value structures specified
+            in <paramref name="argv" />.
+            </param>
+            <param name="argv">
+            An array of native pointers to sqlite3_value structures containing
+            filtering criteria for the selected index.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)">
+            <summary>
+            <para>
+            The xNext method advances a virtual table cursor to the next row of
+            a result set initiated by xFilter. If the cursor is already
+            pointing at the last row when this routine is called, then the
+            cursor no longer points to valid data and a subsequent call to the
+            xEof method must return true (non-zero). If the cursor is
+            successfully advanced to another row of content, then subsequent
+            calls to xEof must return false (zero).
+            </para>
+            <para>
+            This method must return SQLITE_OK if successful, or an sqlite error
+            code if an error occurs.
+            </para>
+            <para>
+            The xNext method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)">
+            <summary>
+            <para>
+            The xEof method must return false (zero) if the specified cursor
+            currently points to a valid row of data, or true (non-zero)
+            otherwise. This method is called by the SQL engine immediately
+            after each xFilter and xNext invocation.
+            </para>
+            <para>
+            The xEof method is required for every virtual table implementation.
+            </para>
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <returns>
+            Non-zero if no more rows are available; zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)">
+            <summary>
+            <para>
+            The SQLite core invokes this method in order to find the value for
+            the N-th column of the current row. N is zero-based so the first
+            column is numbered 0. The xColumn method may return its result back
+            to SQLite using one of the following interface:
+            </para>
+            <code>
+                sqlite3_result_blob()
+                sqlite3_result_double()
+                sqlite3_result_int()
+                sqlite3_result_int64()
+                sqlite3_result_null()
+                sqlite3_result_text()
+                sqlite3_result_text16()
+                sqlite3_result_text16le()
+                sqlite3_result_text16be()
+                sqlite3_result_zeroblob()
+            </code>
+            <para>
+            If the xColumn method implementation calls none of the functions
+            above, then the value of the column defaults to an SQL NULL.
+            </para>
+            <para>
+            To raise an error, the xColumn method should use one of the
+            result_text() methods to set the error message text, then return an
+            appropriate error code. The xColumn method must return SQLITE_OK on
+            success.
+            </para>
+            <para>
+            The xColumn method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <param name="pContext">
+            The native pointer to the sqlite3_context structure to be used
+            for returning the specified column value to the SQLite core
+            library.
+            </param>
+            <param name="index">
+            The zero-based index corresponding to the column containing the
+            value to be returned.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)">
+            <summary>
+            <para>
+            A successful invocation of this method will cause *pRowid to be
+            filled with the rowid of row that the virtual table cursor pCur is
+            currently pointing at. This method returns SQLITE_OK on success. It
+            returns an appropriate error code on failure.
+            </para>
+            <para>
+            The xRowid method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <param name="rowId">
+            Upon success, this parameter must be modified to contain the unique
+            integer row identifier for the current row for the specified cursor.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)">
+            <summary>
+            <para>
+            All changes to a virtual table are made using the xUpdate method.
+            This one method can be used to insert, delete, or update.
+            </para>
+            <para>
+            The argc parameter specifies the number of entries in the argv
+            array. The value of argc will be 1 for a pure delete operation or
+            N+2 for an insert or replace or update where N is the number of
+            columns in the table. In the previous sentence, N includes any
+            hidden columns.
+            </para>
+            <para>
+            Every argv entry will have a non-NULL value in C but may contain
+            the SQL value NULL. In other words, it is always true that
+            argv[i]!=0 for i between 0 and argc-1. However, it might be the
+            case that sqlite3_value_type(argv[i])==SQLITE_NULL.
+            </para>
+            <para>
+            The argv[0] parameter is the rowid of a row in the virtual table
+            to be deleted. If argv[0] is an SQL NULL, then no deletion occurs.
+            </para>
+            <para>
+            The argv[1] parameter is the rowid of a new row to be inserted into
+            the virtual table. If argv[1] is an SQL NULL, then the
+            implementation must choose a rowid for the newly inserted row.
+            Subsequent argv[] entries contain values of the columns of the
+            virtual table, in the order that the columns were declared. The
+            number of columns will match the table declaration that the
+            xConnect or xCreate method made using the sqlite3_declare_vtab()
+            call. All hidden columns are included.
+            </para>
+            <para>
+            When doing an insert without a rowid (argc>1, argv[1] is an SQL
+            NULL), the implementation must set *pRowid to the rowid of the
+            newly inserted row; this will become the value returned by the
+            sqlite3_last_insert_rowid() function. Setting this value in all the
+            other cases is a harmless no-op; the SQLite engine ignores the
+            *pRowid return value if argc==1 or argv[1] is not an SQL NULL.
+            </para>
+            <para>
+            Each call to xUpdate will fall into one of cases shown below. Note
+            that references to argv[i] mean the SQL value held within the
+            argv[i] object, not the argv[i] object itself.
+            </para>
+            <code>
+                argc = 1
+            </code>
+            <para>
+                    The single row with rowid equal to argv[0] is deleted. No
+                    insert occurs.
+            </para>
+            <code>
+                argc > 1
+                argv[0] = NULL
+            </code>
+            <para>
+                    A new row is inserted with a rowid argv[1] and column
+                    values in argv[2] and following. If argv[1] is an SQL NULL,
+                    the a new unique rowid is generated automatically.
+            </para>
+            <code>
+                argc > 1
+                argv[0] ? NULL
+                argv[0] = argv[1]
+            </code>
+            <para>
+                    The row with rowid argv[0] is updated with new values in
+                    argv[2] and following parameters.
+            </para>
+            <code>
+                argc > 1
+                argv[0] ? NULL
+                argv[0] ? argv[1]
+            </code>
+            <para>
+                    The row with rowid argv[0] is updated with rowid argv[1]
+                    and new values in argv[2] and following parameters. This
+                    will occur when an SQL statement updates a rowid, as in
+                    the statement:
+            </para>
+            <code>
+                        UPDATE table SET rowid=rowid+1 WHERE ...;
+            </code>
+            <para>
+            The xUpdate method must return SQLITE_OK if and only if it is
+            successful. If a failure occurs, the xUpdate must return an
+            appropriate error code. On a failure, the pVTab->zErrMsg element
+            may optionally be replaced with error message text stored in memory
+            allocated from SQLite using functions such as sqlite3_mprintf() or
+            sqlite3_malloc().
+            </para>
+            <para>
+            If the xUpdate method violates some constraint of the virtual table
+            (including, but not limited to, attempting to store a value of the
+            wrong datatype, attempting to store a value that is too large or
+            too small, or attempting to change a read-only value) then the
+            xUpdate must fail with an appropriate error code.
+            </para>
+            <para>
+            There might be one or more sqlite3_vtab_cursor objects open and in
+            use on the virtual table instance and perhaps even on the row of
+            the virtual table when the xUpdate method is invoked. The
+            implementation of xUpdate must be prepared for attempts to delete
+            or modify rows of the table out from other existing cursors. If the
+            virtual table cannot accommodate such changes, the xUpdate method
+            must return an error code.
+            </para>
+            <para>
+            The xUpdate method is optional. If the xUpdate pointer in the
+            sqlite3_module for a virtual table is a NULL pointer, then the
+            virtual table is read-only.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="argc">
+            The number of new or modified column values contained in
+            <paramref name="argv" />.
+            </param>
+            <param name="argv">
+            The array of native pointers to sqlite3_value structures containing
+            the new or modified column values, if any.
+            </param>
+            <param name="rowId">
+            Upon success, this parameter must be modified to contain the unique
+            integer row identifier for the row that was inserted, if any.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)">
+            <summary>
+            <para>
+            This method begins a transaction on a virtual table. This is method
+            is optional. The xBegin pointer of sqlite3_module may be NULL.
+            </para>
+            <para>
+            This method is always followed by one call to either the xCommit or
+            xRollback method. Virtual table transactions do not nest, so the
+            xBegin method will not be invoked more than once on a single
+            virtual table without an intervening call to either xCommit or
+            xRollback. Multiple calls to other methods can and likely will
+            occur in between the xBegin and the corresponding xCommit or
+            xRollback.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)">
+            <summary>
+            <para>
+            This method signals the start of a two-phase commit on a virtual
+            table. This is method is optional. The xSync pointer of
+            sqlite3_module may be NULL.
+            </para>
+            <para>
+            This method is only invoked after call to the xBegin method and
+            prior to an xCommit or xRollback. In order to implement two-phase
+            commit, the xSync method on all virtual tables is invoked prior to
+            invoking the xCommit method on any virtual table. If any of the
+            xSync methods fail, the entire transaction is rolled back.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)">
+            <summary>
+            <para>
+            This method causes a virtual table transaction to commit. This is
+            method is optional. The xCommit pointer of sqlite3_module may be
+            NULL.
+            </para>
+            <para>
+            A call to this method always follows a prior call to xBegin and
+            xSync.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)">
+            <summary>
+            <para>
+            This method causes a virtual table transaction to rollback. This is
+            method is optional. The xRollback pointer of sqlite3_module may be
+            NULL.
+            </para>
+            <para>
+            A call to this method always follows a prior call to xBegin.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)">
+            <summary>
+            <para>
+            This method provides notification that the virtual table
+            implementation that the virtual table will be given a new name. If
+            this method returns SQLITE_OK then SQLite renames the table. If
+            this method returns an error code then the renaming is prevented.
+            </para>
+            <para>
+            The xRename method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="nArg">
+            The number of arguments to the function being sought.
+            </param>
+            <param name="zName">
+            The name of the function being sought.
+            </param>
+            <param name="callback">
+            Upon success, this parameter must be modified to contain the
+            delegate responsible for implementing the specified function.
+            </param>
+            <param name="pClientData">
+            Upon success, this parameter must be modified to contain the
+            native user-data pointer associated with
+            <paramref name="callback" />.
+            </param>
+            <returns>
+            Non-zero if the specified function was found; zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)">
+            <summary>
+            <para>
+            This method provides notification that the virtual table
+            implementation that the virtual table will be given a new name. If
+            this method returns SQLITE_OK then SQLite renames the table. If
+            this method returns an error code then the renaming is prevented.
+            </para>
+            <para>
+            The xRename method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="zNew">
+            The native pointer to the UTF-8 encoded string containing the new
+            name for the virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)">
+            <summary>
+            <para>
+            These methods provide the virtual table implementation an
+            opportunity to implement nested transactions. They are always
+            optional and will only be called in SQLite version 3.7.7 and later.
+            </para>
+            <para>
+            When xSavepoint(X,N) is invoked, that is a signal to the virtual
+            table X that it should save its current state as savepoint N. A
+            subsequent call to xRollbackTo(X,R) means that the state of the
+            virtual table should return to what it was when xSavepoint(X,R) was
+            last called. The call to xRollbackTo(X,R) will invalidate all
+            savepoints with N>R; none of the invalided savepoints will be
+            rolled back or released without first being reinitialized by a call
+            to xSavepoint(). A call to xRelease(X,M) invalidates all savepoints
+            where N>=M.
+            </para>
+            <para>
+            None of the xSavepoint(), xRelease(), or xRollbackTo() methods will
+            ever be called except in between calls to xBegin() and either
+            xCommit() or xRollback().
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="iSavepoint">
+            This is an integer identifier under which the the current state of
+            the virtual table should be saved.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)">
+            <summary>
+            <para>
+            These methods provide the virtual table implementation an
+            opportunity to implement nested transactions. They are always
+            optional and will only be called in SQLite version 3.7.7 and later.
+            </para>
+            <para>
+            When xSavepoint(X,N) is invoked, that is a signal to the virtual
+            table X that it should save its current state as savepoint N. A
+            subsequent call to xRollbackTo(X,R) means that the state of the
+            virtual table should return to what it was when xSavepoint(X,R) was
+            last called. The call to xRollbackTo(X,R) will invalidate all
+            savepoints with N>R; none of the invalided savepoints will be
+            rolled back or released without first being reinitialized by a call
+            to xSavepoint(). A call to xRelease(X,M) invalidates all savepoints
+            where N>=M.
+            </para>
+            <para>
+            None of the xSavepoint(), xRelease(), or xRollbackTo() methods will
+            ever be called except in between calls to xBegin() and either
+            xCommit() or xRollback().
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="iSavepoint">
+            This is an integer used to indicate that any saved states with an
+            identifier greater than or equal to this should be deleted by the
+            virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)">
+            <summary>
+            <para>
+            These methods provide the virtual table implementation an
+            opportunity to implement nested transactions. They are always
+            optional and will only be called in SQLite version 3.7.7 and later.
+            </para>
+            <para>
+            When xSavepoint(X,N) is invoked, that is a signal to the virtual
+            table X that it should save its current state as savepoint N. A
+            subsequent call to xRollbackTo(X,R) means that the state of the
+            virtual table should return to what it was when xSavepoint(X,R) was
+            last called. The call to xRollbackTo(X,R) will invalidate all
+            savepoints with N>R; none of the invalided savepoints will be
+            rolled back or released without first being reinitialized by a call
+            to xSavepoint(). A call to xRelease(X,M) invalidates all savepoints
+            where N>=M.
+            </para>
+            <para>
+            None of the xSavepoint(), xRelease(), or xRollbackTo() methods will
+            ever be called except in between calls to xBegin() and either
+            xCommit() or xRollback().
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="iSavepoint">
+            This is an integer identifier used to specify a specific saved
+            state for the virtual table for it to restore itself back to, which
+            should also have the effect of deleting all saved states with an
+            integer identifier greater than this one.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="T:System.Data.SQLite.ISQLiteManagedModule">
+            <summary>
+            This interface represents a virtual table implementation written in
+            managed code.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="connection">
+            The <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="pClientData">
+            The native user-data pointer associated with this module, as it was
+            provided to the SQLite core library when the native module instance
+            was created.
+            </param>
+            <param name="arguments">
+            The module name, database name, virtual table name, and all other
+            arguments passed to the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="table">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="error">
+            Upon failure, this parameter must be modified to contain an error
+            message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="connection">
+            The <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="pClientData">
+            The native user-data pointer associated with this module, as it was
+            provided to the SQLite core library when the native module instance
+            was created.
+            </param>
+            <param name="arguments">
+            The module name, database name, virtual table name, and all other
+            arguments passed to the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="table">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="error">
+            Upon failure, this parameter must be modified to contain an error
+            message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance containing all the
+            data for the inputs and outputs relating to index selection.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="cursor">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance associated
+            with the newly opened virtual table cursor.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="indexNumber">
+            Number used to help identify the selected index.
+            </param>
+            <param name="indexString">
+            String used to help identify the selected index.
+            </param>
+            <param name="values">
+            The values corresponding to each column in the selected index.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <returns>
+            Non-zero if no more rows are available; zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="context">
+            The <see cref="T:System.Data.SQLite.SQLiteContext"/> object instance to be used for
+            returning the specified column value to the SQLite core library.
+            </param>
+            <param name="index">
+            The zero-based index corresponding to the column containing the
+            value to be returned.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="rowId">
+            Upon success, this parameter must be modified to contain the unique
+            integer row identifier for the current row for the specified cursor.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="values">
+            The array of <see cref="T:System.Data.SQLite.SQLiteValue"/> object instances containing
+            the new or modified column values, if any.
+            </param>
+            <param name="rowId">
+            Upon success, this parameter must be modified to contain the unique
+            integer row identifier for the row that was inserted, if any.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Begin(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Sync(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Commit(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Rollback(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="argumentCount">
+            The number of arguments to the function being sought.
+            </param>
+            <param name="name">
+            The name of the function being sought.
+            </param>
+            <param name="function">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance responsible for
+            implementing the specified function.
+            </param>
+            <param name="pClientData">
+            Upon success, this parameter must be modified to contain the
+            native user-data pointer associated with
+            <paramref name="function"/>.
+            </param>
+            <returns>
+            Non-zero if the specified function was found; zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="newName">
+            The new name for the virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="savepoint">
+            This is an integer identifier under which the the current state of
+            the virtual table should be saved.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="savepoint">
+            This is an integer used to indicate that any saved states with an
+            identifier greater than or equal to this should be deleted by the
+            virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="savepoint">
+            This is an integer identifier used to specify a specific saved
+            state for the virtual table for it to restore itself back to, which
+            should also have the effect of deleting all saved states with an
+            integer identifier greater than this one.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="P:System.Data.SQLite.ISQLiteManagedModule.Declared">
+            <summary>
+            Returns non-zero if the schema for the virtual table has been
+            declared.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.ISQLiteManagedModule.Name">
+            <summary>
+            Returns the name of the module as it was registered with the SQLite
+            core library.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteMemory">
+            <summary>
+            This class contains static methods that are used to allocate,
+            manipulate, and free native memory provided by the SQLite core library.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMemory.Allocate(System.Int32)">
+            <summary>
+            Allocates at least the specified number of bytes of native memory
+            via the SQLite core library sqlite3_malloc() function and returns
+            the resulting native pointer.
+            </summary>
+            <param name="size">
+            The number of bytes to allocate.
+            </param>
+            <returns>
+            The native pointer that points to a block of memory of at least the
+            specified size -OR- <see cref="F:System.IntPtr.Zero"/> if the memory could
+            not be allocated.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMemory.Size(System.IntPtr)">
+            <summary>
+            Gets and returns the actual size of the specified memory block that
+            was previously obtained from the <see cref="M:System.Data.SQLite.SQLiteMemory.Allocate(System.Int32)"/> method.
+            </summary>
+            <param name="pMemory">
+            The native pointer to the memory block previously obtained from the
+            <see cref="M:System.Data.SQLite.SQLiteMemory.Allocate(System.Int32)"/> method.
+            </param>
+            <returns>
+            The actual size, in bytes, of the memory block specified via the
+            native pointer.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMemory.Free(System.IntPtr)">
+            <summary>
+            Frees a memory block previously obtained from the
+            <see cref="M:System.Data.SQLite.SQLiteMemory.Allocate(System.Int32)"/> method.
+            </summary>
+            <param name="pMemory">
+            The native pointer to the memory block previously obtained from the
+            <see cref="M:System.Data.SQLite.SQLiteMemory.Allocate(System.Int32)"/> method.
+            </param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteString">
+            <summary>
+            This class contains static methods that are used to deal with native
+            UTF-8 string pointers to be used with the SQLite core library.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteString.ThirtyBits">
+            <summary>
+            This is the maximum possible length for the native UTF-8 encoded
+            strings used with the SQLite core library.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteString.Utf8Encoding">
+            <summary>
+            This is the <see cref="T:System.Text.Encoding"/> object instance used to handle
+            conversions from/to UTF-8.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.GetUtf8BytesFromString(System.String)">
+            <summary>
+            Converts the specified managed string into the UTF-8 encoding and
+            returns the array of bytes containing its representation in that
+            encoding.
+            </summary>
+            <param name="value">
+            The managed string to convert.
+            </param>
+            <returns>
+            The array of bytes containing the representation of the managed
+            string in the UTF-8 encoding or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.GetStringFromUtf8Bytes(System.Byte[])">
+            <summary>
+            Converts the specified array of bytes representing a string in the
+            UTF-8 encoding and returns a managed string.
+            </summary>
+            <param name="bytes">
+            The array of bytes to convert.
+            </param>
+            <returns>
+            The managed string or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.ProbeForUtf8ByteLength(System.IntPtr,System.Int32)">
+            <summary>
+            Probes a native pointer to a string in the UTF-8 encoding for its
+            terminating NUL character, within the specified length limit.
+            </summary>
+            <param name="pValue">
+            The native NUL-terminated string pointer.
+            </param>
+            <param name="limit">
+            The maximum length of the native string, in bytes.
+            </param>
+            <returns>
+            The length of the native string, in bytes -OR- zero if the length
+            could not be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.StringFromUtf8IntPtr(System.IntPtr)">
+            <summary>
+            Converts the specified native NUL-terminated UTF-8 string pointer
+            into a managed string.
+            </summary>
+            <param name="pValue">
+            The native NUL-terminated UTF-8 string pointer.
+            </param>
+            <returns>
+            The managed string or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.StringFromUtf8IntPtr(System.IntPtr,System.Int32)">
+            <summary>
+            Converts the specified native UTF-8 string pointer of the specified
+            length into a managed string.
+            </summary>
+            <param name="pValue">
+            The native UTF-8 string pointer.
+            </param>
+            <param name="length">
+            The length of the native string, in bytes.
+            </param>
+            <returns>
+            The managed string or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.Utf8IntPtrFromString(System.String)">
+            <summary>
+            Converts the specified managed string into a native NUL-terminated
+            UTF-8 string pointer using memory obtained from the SQLite core
+            library.
+            </summary>
+            <param name="value">
+            The managed string to convert.
+            </param>
+            <returns>
+            The native NUL-terminated UTF-8 string pointer or
+            <see cref="F:System.IntPtr.Zero"/> upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.StringArrayFromUtf8SizeAndIntPtr(System.Int32,System.IntPtr)">
+            <summary>
+            Converts a logical array of native NUL-terminated UTF-8 string
+            pointers into an array of managed strings.
+            </summary>
+            <param name="argc">
+            The number of elements in the logical array of native
+            NUL-terminated UTF-8 string pointers.
+            </param>
+            <param name="argv">
+            The native pointer to the logical array of native NUL-terminated
+            UTF-8 string pointers to convert.
+            </param>
+            <returns>
+            The array of managed strings or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.Utf8IntPtrArrayFromStringArray(System.String[])">
+            <summary>
+            Converts an array of managed strings into an array of native
+            NUL-terminated UTF-8 string pointers.
+            </summary>
+            <param name="values">
+            The array of managed strings to convert.
+            </param>
+            <returns>
+            The array of native NUL-terminated UTF-8 string pointers or null
+            upon failure.
+            </returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteBytes">
+            <summary>
+            This class contains static methods that are used to deal with native
+            pointers to memory blocks that logically contain arrays of bytes to be
+            used with the SQLite core library.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBytes.FromIntPtr(System.IntPtr,System.Int32)">
+            <summary>
+            Converts a native pointer to a logical array of bytes of the
+            specified length into a managed byte array.
+            </summary>
+            <param name="pValue">
+            The native pointer to the logical array of bytes to convert.
+            </param>
+            <param name="length">
+            The length, in bytes, of the logical array of bytes to convert.
+            </param>
+            <returns>
+            The managed byte array or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBytes.ToIntPtr(System.Byte[])">
+            <summary>
+            Converts a managed byte array into a native pointer to a logical
+            array of bytes.
+            </summary>
+            <param name="value">
+            The managed byte array to convert.
+            </param>
+            <returns>
+            The native pointer to a logical byte array or null upon failure.
+            </returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteMarshal">
+            <summary>
+            This class contains static methods that are used to perform several
+            low-level data marshalling tasks between native and managed code.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.IntPtrForOffset(System.IntPtr,System.Int32)">
+            <summary>
+            Returns a new <see cref="T:System.IntPtr"/> object instance based on the
+            specified <see cref="T:System.IntPtr"/> object instance and an integer
+            offset.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location that the new
+            <see cref="T:System.IntPtr"/> object instance should point to.
+            </param>
+            <returns>
+            The new <see cref="T:System.IntPtr"/> object instance.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.RoundUp(System.Int32,System.Int32)">
+            <summary>
+            Rounds up an integer size to the next multiple of the alignment.
+            </summary>
+            <param name="size">
+            The size, in bytes, to be rounded up.
+            </param>
+            <param name="alignment">
+            The required alignment for the return value.
+            </param>
+            <returns>
+            The size, in bytes, rounded up to the next multiple of the
+            alignment.  This value may end up being the same as the original
+            size.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.NextOffsetOf(System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Determines the offset, in bytes, of the next structure member.
+            </summary>
+            <param name="offset">
+            The offset, in bytes, of the current structure member.
+            </param>
+            <param name="size">
+            The size, in bytes, of the current structure member.
+            </param>
+            <param name="alignment">
+            The alignment, in bytes, of the next structure member.
+            </param>
+            <returns>
+            The offset, in bytes, of the next structure member.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.ReadInt32(System.IntPtr,System.Int32)">
+            <summary>
+            Reads a <see cref="T:System.Int32"/> value from the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.Int32"/> value to be read is located.
+            </param>
+            <returns>
+            The <see cref="T:System.Int32"/> value at the specified memory location.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.ReadDouble(System.IntPtr,System.Int32)">
+            <summary>
+            Reads a <see cref="T:System.Double"/> value from the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.Double"/> to be read is located.
+            </param>
+            <returns>
+            The <see cref="T:System.Double"/> value at the specified memory location.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.ReadIntPtr(System.IntPtr,System.Int32)">
+            <summary>
+            Reads an <see cref="T:System.IntPtr"/> value from the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.IntPtr"/> value to be read is located.
+            </param>
+            <returns>
+            The <see cref="T:System.IntPtr"/> value at the specified memory location.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.WriteInt32(System.IntPtr,System.Int32,System.Int32)">
+            <summary>
+            Writes an <see cref="T:System.Int32"/> value to the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.Int32"/> value to be written is located.
+            </param>
+            <param name="value">
+            The <see cref="T:System.Int32"/> value to write.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.WriteInt64(System.IntPtr,System.Int32,System.Int64)">
+            <summary>
+            Writes an <see cref="T:System.Int64"/> value to the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.Int64"/> value to be written is located.
+            </param>
+            <param name="value">
+            The <see cref="T:System.Int64"/> value to write.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.WriteDouble(System.IntPtr,System.Int32,System.Double)">
+            <summary>
+            Writes a <see cref="T:System.Double"/> value to the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.Double"/> value to be written is located.
+            </param>
+            <param name="value">
+            The <see cref="T:System.Double"/> value to write.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.WriteIntPtr(System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            Writes a <see cref="T:System.IntPtr"/> value to the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.IntPtr"/> value to be written is located.
+            </param>
+            <param name="value">
+            The <see cref="T:System.IntPtr"/> value to write.
+            </param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteModule">
+            <summary>
+            This class represents a managed virtual table module implementation.
+            It is not sealed and must be used as the base class for any
+            user-defined virtual table module classes implemented in managed code.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.DefaultModuleVersion">
+            <summary>
+            The default version of the native sqlite3_module structure in use.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.nativeModule">
+            <summary>
+            This field is used to store the native sqlite3_module structure
+            associated with this object instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.destroyModule">
+            <summary>
+            This field is used to store the destructor delegate to be passed to
+            the SQLite core library via the sqlite3_create_disposable_module()
+            function.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.disposableModule">
+            <summary>
+            This field is used to store a pointer to the native sqlite3_module
+            structure returned by the sqlite3_create_disposable_module
+            function.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.tables">
+            <summary>
+            This field is used to store the virtual table instances associated
+            with this module.  The native pointer to the sqlite3_vtab derived
+            structure is used to key into this collection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.cursors">
+            <summary>
+            This field is used to store the virtual table cursor instances
+            associated with this module.  The native pointer to the
+            sqlite3_vtab_cursor derived structure is used to key into this
+            collection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.functions">
+            <summary>
+            This field is used to store the virtual table function instances
+            associated with this module.  The case-insensitive function name
+            and the number of arguments (with -1 meaning "any") are used to
+            construct the string that is used to key into this collection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.#ctor(System.String)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="name">
+            The name of the module.  This parameter cannot be null.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CreateDisposableModule(System.IntPtr)">
+            <summary>
+            Calls the native SQLite core library in order to create a new
+            disposable module containing the implementation of a virtual table.
+            </summary>
+            <param name="pDb">
+            The native database connection pointer to use.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xDestroyModule(System.IntPtr)">
+            <summary>
+            This method is called by the SQLite core library when the native
+            module associated with this object instance is being destroyed due
+            to its parent connection being closed.  It may also be called by
+            the "vtshim" module if/when the sqlite3_dispose_module() function
+            is called.
+            </summary>
+            <param name="pClientData">
+            The native user-data pointer associated with this module, as it was
+            provided to the SQLite core library when the native module instance
+            was created.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.AllocateNativeModule">
+            <summary>
+            Creates and returns the native sqlite_module structure using the
+            configured (or default) <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/>
+            interface implementation.
+            </summary>
+            <returns>
+            The native sqlite_module structure using the configured (or
+            default) <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface
+            implementation.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.AllocateNativeModule(System.Data.SQLite.ISQLiteNativeModule)">
+            <summary>
+            Creates and returns the native sqlite_module structure using the
+            specified <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface
+            implementation.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface implementation to
+            use.
+            </param>
+            <returns>
+            The native sqlite_module structure using the specified
+            <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface implementation.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CopyNativeModule(System.Data.SQLite.UnsafeNativeMethods.sqlite3_module)">
+            <summary>
+            Creates a copy of the specified
+            <see cref="T:System.Data.SQLite.UnsafeNativeMethods.sqlite3_module"/> object instance,
+            using default implementations for the contained delegates when
+            necessary.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.UnsafeNativeMethods.sqlite3_module"/> object
+            instance to copy.
+            </param>
+            <returns>
+            The new <see cref="T:System.Data.SQLite.UnsafeNativeMethods.sqlite3_module"/> object
+            instance.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CreateOrConnect(System.Boolean,System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            Calls one of the virtual table initialization methods.
+            </summary>
+            <param name="create">
+            Non-zero to call the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/>
+            method; otherwise, the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/>
+            method will be called.
+            </param>
+            <param name="pDb">
+            The native database connection handle.
+            </param>
+            <param name="pAux">
+            The original native pointer value that was provided to the
+            sqlite3_create_module(), sqlite3_create_module_v2() or
+            sqlite3_create_disposable_module() functions.
+            </param>
+            <param name="argc">
+            The number of arguments from the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="argv">
+            The array of string arguments from the CREATE VIRTUAL TABLE
+            statement.
+            </param>
+            <param name="pVtab">
+            Upon success, this parameter must be modified to point to the newly
+            created native sqlite3_vtab derived structure.
+            </param>
+            <param name="pError">
+            Upon failure, this parameter must be modified to point to the error
+            message, with the underlying memory having been obtained from the
+            sqlite3_malloc() function.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.DestroyOrDisconnect(System.Boolean,System.IntPtr)">
+            <summary>
+            Calls one of the virtual table finalization methods.
+            </summary>
+            <param name="destroy">
+            Non-zero to call the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/>
+            method; otherwise, the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method will be
+            called.
+            </param>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetTableError(System.Data.SQLite.SQLiteModule,System.IntPtr,System.Boolean,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance to be used.
+            </param>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="logErrors">
+            Non-zero if this error message should also be logged using the
+            <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetTableError(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteVirtualTable,System.Boolean,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance to be used.
+            </param>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance used to
+            lookup the native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="logErrors">
+            Non-zero if this error message should also be logged using the
+            <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetCursorError(System.Data.SQLite.SQLiteModule,System.IntPtr,System.Boolean,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance to be used.
+            </param>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure
+            used to get the native pointer to the sqlite3_vtab derived
+            structure.
+            </param>
+            <param name="logErrors">
+            Non-zero if this error message should also be logged using the
+            <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetCursorError(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteVirtualTableCursor,System.Boolean,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance to be used.
+            </param>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance used to
+            lookup the native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="logErrors">
+            Non-zero if this error message should also be logged using the
+            <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.GetNativeModuleImpl">
+            <summary>
+            Gets and returns the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface
+            implementation to be used when creating the native sqlite3_module
+            structure.  Derived classes may override this method to supply an
+            alternate implementation for the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/>
+            interface.
+            </summary>
+            <returns>
+            The <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface implementation to
+            be used when populating the native sqlite3_module structure.  If
+            the returned value is null, the private methods provided by the
+            <see cref="T:System.Data.SQLite.SQLiteModule"/> class and relating to the
+            <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface  will be used to
+            create the necessary delegates.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CreateNativeModuleImpl">
+            <summary>
+            Creates and returns the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/>
+            interface implementation corresponding to the current
+            <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance.
+            </summary>
+            <returns>
+            The <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface implementation
+            corresponding to the current <see cref="T:System.Data.SQLite.SQLiteModule"/> object
+            instance.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.AllocateTable">
+            <summary>
+            Allocates a native sqlite3_vtab derived structure and returns a
+            native pointer to it.
+            </summary>
+            <returns>
+            A native pointer to a native sqlite3_vtab derived structure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.ZeroTable(System.IntPtr)">
+            <summary>
+            Zeros out the fields of a native sqlite3_vtab derived structure.
+            </summary>
+            <param name="pVtab">
+            The native pointer to the native sqlite3_vtab derived structure to
+            zero.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.FreeTable(System.IntPtr)">
+            <summary>
+            Frees a native sqlite3_vtab structure using the provided native
+            pointer to it.
+            </summary>
+            <param name="pVtab">
+            A native pointer to a native sqlite3_vtab derived structure.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.AllocateCursor">
+            <summary>
+            Allocates a native sqlite3_vtab_cursor derived structure and
+            returns a native pointer to it.
+            </summary>
+            <returns>
+            A native pointer to a native sqlite3_vtab_cursor derived structure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.FreeCursor(System.IntPtr)">
+            <summary>
+            Frees a native sqlite3_vtab_cursor structure using the provided
+            native pointer to it.
+            </summary>
+            <param name="pCursor">
+            A native pointer to a native sqlite3_vtab_cursor derived structure.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.TableFromCursor(System.Data.SQLite.SQLiteModule,System.IntPtr)">
+            <summary>
+            Reads and returns the native pointer to the sqlite3_vtab derived
+            structure based on the native pointer to the sqlite3_vtab_cursor
+            derived structure.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance to be used.
+            </param>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure
+            from which to read the native pointer to the sqlite3_vtab derived
+            structure.
+            </param>
+            <returns>
+            The native pointer to the sqlite3_vtab derived structure -OR-
+            <see cref="F:System.IntPtr.Zero"/> if it cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.TableFromCursor(System.IntPtr)">
+            <summary>
+            Reads and returns the native pointer to the sqlite3_vtab derived
+            structure based on the native pointer to the sqlite3_vtab_cursor
+            derived structure.
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure
+            from which to read the native pointer to the sqlite3_vtab derived
+            structure.
+            </param>
+            <returns>
+            The native pointer to the sqlite3_vtab derived structure -OR-
+            <see cref="F:System.IntPtr.Zero"/> if it cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.TableFromIntPtr(System.IntPtr)">
+            <summary>
+            Looks up and returns the <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object
+            instance based on the native pointer to the sqlite3_vtab derived
+            structure.
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance or null if
+            the corresponding one cannot be found.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.TableToIntPtr(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            Allocates and returns a native pointer to a sqlite3_vtab derived
+            structure and creates an association between it and the specified
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance to be used
+            when creating the association.
+            </param>
+            <returns>
+            The native pointer to a sqlite3_vtab derived structure or
+            <see cref="F:System.IntPtr.Zero"/> if the method fails for any reason.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CursorFromIntPtr(System.IntPtr,System.IntPtr)">
+            <summary>
+            Looks up and returns the <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/>
+            object instance based on the native pointer to the
+            sqlite3_vtab_cursor derived structure.
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <returns>
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance or null
+            if the corresponding one cannot be found.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CursorToIntPtr(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            Allocates and returns a native pointer to a sqlite3_vtab_cursor
+            derived structure and creates an association between it and the
+            specified <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance to be
+            used when creating the association.
+            </param>
+            <returns>
+            The native pointer to a sqlite3_vtab_cursor derived structure or
+            <see cref="F:System.IntPtr.Zero"/> if the method fails for any reason.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.GetFunctionKey(System.Int32,System.String,System.Data.SQLite.SQLiteFunction)">
+            <summary>
+            Deterimines the key that should be used to identify and store the
+            <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance for the virtual table
+            (i.e. to be returned via the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method).
+            </summary>
+            <param name="argumentCount">
+            The number of arguments to the virtual table function.
+            </param>
+            <param name="name">
+            The name of the virtual table function.
+            </param>
+            <param name="function">
+            The <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance associated with
+            this virtual table function.
+            </param>
+            <returns>
+            The string that should be used to identify and store the virtual
+            table function instance.  This method cannot return null.  If null
+            is returned from this method, the behavior is undefined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.DeclareTable(System.Data.SQLite.SQLiteConnection,System.String,System.String@)">
+            <summary>
+            Attempts to declare the schema for the virtual table using the
+            specified database connection.
+            </summary>
+            <param name="connection">
+            The <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance to use when
+            declaring the schema of the virtual table.  This parameter may not
+            be null.
+            </param>
+            <param name="sql">
+            The string containing the CREATE TABLE statement that completely
+            describes the schema for the virtual table.  This parameter may not
+            be null.
+            </param>
+            <param name="error">
+            Upon failure, this parameter must be modified to contain an error
+            message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.DeclareFunction(System.Data.SQLite.SQLiteConnection,System.Int32,System.String,System.String@)">
+            <summary>
+            Calls the native SQLite core library in order to declare a virtual
+            table function in response to a call into the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/>
+            or <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> virtual table
+            methods.
+            </summary>
+            <param name="connection">
+            The <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance to use when
+            declaring the schema of the virtual table.
+            </param>
+            <param name="argumentCount">
+            The number of arguments to the function being declared.
+            </param>
+            <param name="name">
+            The name of the function being declared.
+            </param>
+            <param name="error">
+            Upon success, the contents of this parameter are undefined.  Upon
+            failure, it should contain an appropriate error message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetTableError(System.IntPtr,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetTableError(System.Data.SQLite.SQLiteVirtualTable,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance used to
+            lookup the native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetCursorError(System.Data.SQLite.SQLiteVirtualTableCursor,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance used to
+            lookup the native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetEstimatedCost(System.Data.SQLite.SQLiteIndex,System.Nullable{System.Double})">
+            <summary>
+            Modifies the specified <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance
+            to contain the specified estimated cost.
+            </summary>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance to modify.
+            </param>
+            <param name="estimatedCost">
+            The estimated cost value to use.  Using a null value means that the
+            default value provided by the SQLite core library should be used.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetEstimatedCost(System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            Modifies the specified <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance
+            to contain the default estimated cost.
+            </summary>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance to modify.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetEstimatedRows(System.Data.SQLite.SQLiteIndex,System.Nullable{System.Int64})">
+            <summary>
+            Modifies the specified <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance
+            to contain the specified estimated rows.
+            </summary>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance to modify.
+            </param>
+            <param name="estimatedRows">
+            The estimated rows value to use.  Using a null value means that the
+            default value provided by the SQLite core library should be used.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetEstimatedRows(System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            Modifies the specified <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance
+            to contain the default estimated rows.
+            </summary>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance to modify.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pDb">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pAux">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pError">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pDb">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pAux">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pError">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xBestIndex(System.IntPtr,System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <param name="pIndex">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xDisconnect(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xDestroy(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xOpen(System.IntPtr,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </param>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xClose(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="idxNum">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="idxStr">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xNext(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xEof(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="pContext">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xRowId(System.IntPtr,System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xBegin(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xSync(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xCommit(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xRollback(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="nArg">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="zName">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="callback">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xRename(System.IntPtr,System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <param name="zNew">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xSavepoint(System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="iSavepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xRelease(System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="iSavepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xRollbackTo(System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="iSavepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="connection">
+            The <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="pClientData">
+            The native user-data pointer associated with this module, as it was
+            provided to the SQLite core library when the native module instance
+            was created.
+            </param>
+            <param name="arguments">
+            The module name, database name, virtual table name, and all other
+            arguments passed to the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="table">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="error">
+            Upon failure, this parameter must be modified to contain an error
+            message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="connection">
+            The <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="pClientData">
+            The native user-data pointer associated with this module, as it was
+            provided to the SQLite core library when the native module instance
+            was created.
+            </param>
+            <param name="arguments">
+            The module name, database name, virtual table name, and all other
+            arguments passed to the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="table">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="error">
+            Upon failure, this parameter must be modified to contain an error
+            message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance containing all the
+            data for the inputs and outputs relating to index selection.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="cursor">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance associated
+            with the newly opened virtual table cursor.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="indexNumber">
+            Number used to help identify the selected index.
+            </param>
+            <param name="indexString">
+            String used to help identify the selected index.
+            </param>
+            <param name="values">
+            The values corresponding to each column in the selected index.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <returns>
+            Non-zero if no more rows are available; zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="context">
+            The <see cref="T:System.Data.SQLite.SQLiteContext"/> object instance to be used for
+            returning the specified column value to the SQLite core library.
+            </param>
+            <param name="index">
+            The zero-based index corresponding to the column containing the
+            value to be returned.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="rowId">
+            Upon success, this parameter must be modified to contain the unique
+            integer row identifier for the current row for the specified cursor.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="values">
+            The array of <see cref="T:System.Data.SQLite.SQLiteValue"/> object instances containing
+            the new or modified column values, if any.
+            </param>
+            <param name="rowId">
+            Upon success, this parameter must be modified to contain the unique
+            integer row identifier for the row that was inserted, if any.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Begin(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Sync(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Commit(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Rollback(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="argumentCount">
+            The number of arguments to the function being sought.
+            </param>
+            <param name="name">
+            The name of the function being sought.
+            </param>
+            <param name="function">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance responsible for
+            implementing the specified function.
+            </param>
+            <param name="pClientData">
+            Upon success, this parameter must be modified to contain the
+            native user-data pointer associated with
+            <paramref name="function"/>.
+            </param>
+            <returns>
+            Non-zero if the specified function was found; zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="newName">
+            The new name for the virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="savepoint">
+            This is an integer identifier under which the the current state of
+            the virtual table should be saved.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="savepoint">
+            This is an integer used to indicate that any saved states with an
+            identifier greater than or equal to this should be deleted by the
+            virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="savepoint">
+            This is an integer identifier used to specify a specific saved
+            state for the virtual table for it to restore itself back to, which
+            should also have the effect of deleting all saved states with an
+            integer identifier greater than this one.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Dispose">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.Data.SQLite.SQLiteModule.Dispose"/> method.  Zero if this method is being
+            called from the finalizer.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Finalize">
+            <summary>
+            Finalizes this object instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteModule.LogErrorsNoThrow">
+            <summary>
+            Returns or sets a boolean value indicating whether virtual table
+            errors should be logged using the <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteModule.LogExceptionsNoThrow">
+            <summary>
+            Returns or sets a boolean value indicating whether exceptions
+            caught in the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method,
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method, and the
+            <see cref="M:System.Data.SQLite.SQLiteModule.Dispose"/> method should be logged using the
+            <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteModule.LogErrors">
+            <summary>
+            Returns or sets a boolean value indicating whether virtual table
+            errors should be logged using the <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteModule.LogExceptions">
+            <summary>
+            Returns or sets a boolean value indicating whether exceptions
+            caught in the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method,
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method, and the
+            <see cref="M:System.Data.SQLite.SQLiteModule.Dispose"/> method should be logged using the
+            <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteModule.Declared">
+            <summary>
+            Returns non-zero if the schema for the virtual table has been
+            declared.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteModule.Name">
+            <summary>
+            Returns the name of the module as it was registered with the SQLite
+            core library.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteModule.SQLiteNativeModule">
+            <summary>
+            This class implements the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/>
+            interface by forwarding those method calls to the
+            <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance it contains.  If the
+            contained <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance is null, all
+            the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> methods simply generate an
+            error.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.DefaultLogErrors">
+            <summary>
+            This is the value that is always used for the "logErrors"
+            parameter to the various static error handling methods provided
+            by the <see cref="T:System.Data.SQLite.SQLiteModule"/> class.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.ModuleNotAvailableErrorMessage">
+            <summary>
+            This is the error message text used when the contained
+            <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance is not available
+            for any reason.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.module">
+            <summary>
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance used to provide
+            an implementation of the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/>
+            interface.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.#ctor(System.Data.SQLite.SQLiteModule)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance used to provide
+            an implementation of the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/>
+            interface.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.ModuleNotAvailableTableError(System.IntPtr)">
+            <summary>
+            Sets the table error message to one that indicates the native
+            module implementation is not available.
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            The value of <see cref="F:System.Data.SQLite.SQLiteErrorCode.Error"/>.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.ModuleNotAvailableCursorError(System.IntPtr)">
+            <summary>
+            Sets the table error message to one that indicates the native
+            module implementation is not available.
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived
+            structure.
+            </param>
+            <returns>
+            The value of <see cref="F:System.Data.SQLite.SQLiteErrorCode.Error"/>.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pDb">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pAux">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pError">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pDb">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pAux">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pError">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <param name="pIndex">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xDisconnect(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xDestroy(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </param>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xClose(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="idxNum">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="idxStr">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xNext(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xEof(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="pContext">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xBegin(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xSync(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xCommit(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xRollback(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="nArg">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="zName">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="callback">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <param name="zNew">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="iSavepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xRelease(System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="iSavepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="iSavepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.Dispose">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.Dispose"/> method.  Zero if this method is being
+            called from the finalizer.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.Finalize">
+            <summary>
+            Finalizes this object instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator">
+            <summary>
+            This class represents a virtual table cursor to be used with the
+            <see cref="T:System.Data.SQLite.SQLiteModuleEnumerable"/> class.  It is not sealed and may
+            be used as the base class for any user-defined virtual table cursor
+            class that wraps an <see cref="T:System.Collections.IEnumerator"/> object instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.enumerator">
+            <summary>
+            The <see cref="T:System.Collections.IEnumerator"/> instance provided when this cursor
+            was created.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.endOfEnumerator">
+            <summary>
+            This value will be non-zero if false has been returned from the
+            <see cref="M:System.Collections.IEnumerator.MoveNext"/> method.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.#ctor(System.Data.SQLite.SQLiteVirtualTable,System.Collections.IEnumerator)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this object instance.
+            </param>
+            <param name="enumerator">
+            The <see cref="T:System.Collections.IEnumerator"/> instance to expose as a virtual
+            table cursor.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.MoveNext">
+            <summary>
+            Advances to the next row of the virtual table cursor using the
+            <see cref="M:System.Collections.IEnumerator.MoveNext"/> method of the
+            <see cref="T:System.Collections.IEnumerator"/> object instance.
+            </summary>
+            <returns>
+            Non-zero if the current row is valid; zero otherwise.  If zero is
+            returned, no further rows are available.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.Reset">
+            <summary>
+            Resets the virtual table cursor position, also invalidating the
+            current row, using the <see cref="M:System.Collections.IEnumerator.Reset"/> method of
+            the <see cref="T:System.Collections.IEnumerator"/> object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.Close">
+            <summary>
+            Closes the virtual table cursor.  This method must not throw any
+            exceptions.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.CheckClosed">
+            <summary>
+            Throws an <see cref="T:System.InvalidOperationException"/> if the virtual
+            table cursor has been closed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.IDisposable.Dispose"/> method.  Zero if this method is
+            being called from the finalizer.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.Current">
+            <summary>
+            Returns the value for the current row of the virtual table cursor
+            using the <see cref="P:System.Collections.IEnumerator.Current"/> property of the
+            <see cref="T:System.Collections.IEnumerator"/> object instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.EndOfEnumerator">
+            <summary>
+            Returns non-zero if the end of the virtual table cursor has been
+            seen (i.e. no more rows are available, including the current one).
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.IsOpen">
+            <summary>
+            Returns non-zero if the virtual table cursor is open.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteModuleEnumerable">
+             <summary>
+             This class implements a virtual table module that exposes an
+             <see cref="T:System.Collections.IEnumerable"/> object instance as a read-only virtual
+             table.  It is not sealed and may be used as the base class for any
+             user-defined virtual table class that wraps an
+             <see cref="T:System.Collections.IEnumerable"/> object instance.  The following short
+             example shows it being used to treat an array of strings as a table
+             data source:
+             <code>
+               public static class Sample
+               {
+                 public static void Main()
+                 {
+                   using (SQLiteConnection connection = new SQLiteConnection(
+                       "Data Source=:memory:;"))
+                   {
+                     connection.Open();
+            
+                     connection.CreateModule(new SQLiteModuleEnumerable(
+                       "sampleModule", new string[] { "one", "two", "three" }));
+            
+                     using (SQLiteCommand command = connection.CreateCommand())
+                     {
+                       command.CommandText =
+                           "CREATE VIRTUAL TABLE t1 USING sampleModule;";
+            
+                       command.ExecuteNonQuery();
+                     }
+            
+                     using (SQLiteCommand command = connection.CreateCommand())
+                     {
+                       command.CommandText = "SELECT * FROM t1;";
+            
+                       using (SQLiteDataReader dataReader = command.ExecuteReader())
+                       {
+                         while (dataReader.Read())
+                           Console.WriteLine(dataReader[0].ToString());
+                       }
+                     }
+            
+                     connection.Close();
+                   }
+                 }
+               }
+             </code>
+             </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteModuleNoop">
+            <summary>
+            This class implements a virtual table module that does nothing by
+            providing "empty" implementations for all of the
+            <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface methods.  The result
+            codes returned by these "empty" method implementations may be
+            controlled on a per-method basis by using and/or overriding the
+            <see cref="M:System.Data.SQLite.SQLiteModuleNoop.GetDefaultResultCode"/>,
+            <see cref="M:System.Data.SQLite.SQLiteModuleNoop.ResultCodeToEofResult(System.Data.SQLite.SQLiteErrorCode)"/>,
+            <see cref="M:System.Data.SQLite.SQLiteModuleNoop.ResultCodeToFindFunctionResult(System.Data.SQLite.SQLiteErrorCode)"/>,
+            <see cref="M:System.Data.SQLite.SQLiteModuleNoop.GetMethodResultCode(System.String)"/>, and
+            <see cref="M:System.Data.SQLite.SQLiteModuleNoop.SetMethodResultCode(System.String,System.Data.SQLite.SQLiteErrorCode)"/> methods from within derived classes.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModuleNoop.resultCodes">
+            <summary>
+            This field is used to store the <see cref="T:System.Data.SQLite.SQLiteErrorCode"/>
+            values to return, on a per-method basis, for all methods that are
+            part of the <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.#ctor(System.String)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="name">
+            The name of the module.  This parameter cannot be null.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.GetDefaultResultCode">
+            <summary>
+            Determines the default <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value to be
+            returned by methods of the <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/>
+            interface that lack an overridden implementation in all classes
+            derived from the <see cref="T:System.Data.SQLite.SQLiteModuleNoop"/> class.
+            </summary>
+            <returns>
+            The <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value that should be returned
+            by all <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface methods unless
+            a more specific result code has been set for that interface method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.ResultCodeToEofResult(System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Converts a <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value into a boolean
+            return value for use with the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="resultCode">
+            The <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value to convert.
+            </param>
+            <returns>
+            The <see cref="T:System.Boolean"/> value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.ResultCodeToFindFunctionResult(System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Converts a <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value into a boolean
+            return value for use with the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="resultCode">
+            The <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value to convert.
+            </param>
+            <returns>
+            The <see cref="T:System.Boolean"/> value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.GetMethodResultCode(System.String)">
+            <summary>
+            Determines the <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value that should be
+            returned by the specified <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/>
+            interface method if it lack an overridden implementation.  If no
+            specific <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value is available (or set)
+            for the specified method, the <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value
+            returned by the <see cref="M:System.Data.SQLite.SQLiteModuleNoop.GetDefaultResultCode"/> method will be
+            returned instead.
+            </summary>
+            <param name="methodName">
+            The name of the method.  Currently, this method must be part of
+            the <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface.
+            </param>
+            <returns>
+            The <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value that should be returned
+            by the <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.SetMethodResultCode(System.String,System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Sets the <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value that should be
+            returned by the specified <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/>
+            interface method if it lack an overridden implementation.
+            </summary>
+            <param name="methodName">
+            The name of the method.  Currently, this method must be part of
+            the <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface.
+            </param>
+            <param name="resultCode">
+            The <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value that should be returned
+            by the <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface method.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </summary>
+            <param name="connection">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="arguments">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="error">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </summary>
+            <param name="connection">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="arguments">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="error">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Disconnect(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Destroy(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </param>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Close(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <param name="indexNumber">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <param name="indexString">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <param name="values">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Next(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <param name="context">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </param>
+            <param name="values">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Begin(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Begin(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Begin(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Begin(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Sync(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Sync(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Sync(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Sync(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Commit(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Commit(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Commit(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Commit(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Rollback(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rollback(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rollback(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rollback(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argumentCount">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </param>
+            <param name="name">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </param>
+            <param name="function">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </param>
+            <param name="newName">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </param>
+            <param name="savepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </param>
+            <param name="savepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </param>
+            <param name="savepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.IDisposable.Dispose"/> method.  Zero if this method is
+            being called from the finalizer.
+            </param>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModuleEnumerable.declareSql">
+            <summary>
+            The CREATE TABLE statement used to declare the schema for the
+            virtual table.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModuleEnumerable.enumerable">
+            <summary>
+            The <see cref="T:System.Collections.IEnumerable"/> instance containing the backing data
+            for the virtual table.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.#ctor(System.String,System.Collections.IEnumerable)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="name">
+            The name of the module.  This parameter cannot be null.
+            </param>
+            <param name="enumerable">
+            The <see cref="T:System.Collections.IEnumerable"/> instance to expose as a virtual
+            table.  This parameter cannot be null.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.GetSqlForDeclareTable">
+            <summary>
+            Determines the SQL statement used to declare the virtual table.
+            This method should be overridden in derived classes if they require
+            a custom virtual table schema.
+            </summary>
+            <returns>
+            The SQL statement used to declare the virtual table -OR- null if it
+            cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.CursorTypeMismatchError(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            Sets the table error message to one that indicates the virtual
+            table cursor is of the wrong type.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance.
+            </param>
+            <returns>
+            The value of <see cref="F:System.Data.SQLite.SQLiteErrorCode.Error"/>.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.CursorEndOfEnumeratorError(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            Sets the table error message to one that indicates the virtual
+            table cursor has no current row.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance.
+            </param>
+            <returns>
+            The value of <see cref="F:System.Data.SQLite.SQLiteErrorCode.Error"/>.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.GetStringFromObject(System.Data.SQLite.SQLiteVirtualTableCursor,System.Object)">
+            <summary>
+            Determines the string to return as the column value for the object
+            instance value.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="value">
+            The object instance to return a string representation for.
+            </param>
+            <returns>
+            The string representation of the specified object instance or null
+            upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.MakeRowId(System.Int32,System.Int32)">
+            <summary>
+            Constructs an <see cref="T:System.Int64"/> unique row identifier from two
+            <see cref="T:System.Int32"/> values.  The first <see cref="T:System.Int32"/> value
+            must contain the row sequence number for the current row and the
+            second value must contain the hash code of the enumerator value
+            for the current row.
+            </summary>
+            <param name="rowIndex">
+            The integer row sequence number for the current row.
+            </param>
+            <param name="hashCode">
+            The hash code of the enumerator value for the current row.
+            </param>
+            <returns>
+            The unique row identifier or zero upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.GetRowIdFromObject(System.Data.SQLite.SQLiteVirtualTableCursor,System.Object)">
+            <summary>
+            Determines the unique row identifier for the current row.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="value">
+            The object instance to return a unique row identifier for.
+            </param>
+            <returns>
+            The unique row identifier or zero upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </summary>
+            <param name="connection">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="arguments">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="error">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </summary>
+            <param name="connection">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="arguments">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="error">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Disconnect(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Destroy(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </param>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Close(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <param name="indexNumber">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <param name="indexString">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <param name="values">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Next(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <param name="context">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </param>
+            <param name="values">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </param>
+            <param name="newName">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.IDisposable.Dispose"/> method.  Zero if this method is
+            being called from the finalizer.
+            </param>
+        </member>
+        <member name="T:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1">
+            <summary>
+            This class represents a virtual table cursor to be used with the
+            <see cref="T:System.Data.SQLite.SQLiteModuleEnumerable"/> class.  It is not sealed and may
+            be used as the base class for any user-defined virtual table cursor
+            class that wraps an <see cref="T:System.Collections.Generic.IEnumerator`1"/> object instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.enumerator">
+            <summary>
+            The <see cref="T:System.Collections.Generic.IEnumerator`1"/> instance provided when this
+            cursor was created.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.#ctor(System.Data.SQLite.SQLiteVirtualTable,System.Collections.Generic.IEnumerator{`0})">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this object instance.
+            </param>
+            <param name="enumerator">
+            The <see cref="T:System.Collections.Generic.IEnumerator`1"/> instance to expose as a virtual
+            table cursor.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.Close">
+            <summary>
+            Closes the virtual table cursor.  This method must not throw any
+            exceptions.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.IDisposable.Dispose"/> method.  Zero if this method is
+            being called from the finalizer.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.System#Collections#Generic#IEnumerator{T}#Current">
+            <summary>
+            Returns the value for the current row of the virtual table cursor
+            using the <see cref="P:System.Collections.Generic.IEnumerator`1.Current"/> property of the
+            <see cref="T:System.Collections.Generic.IEnumerator`1"/> object instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1">
+            <summary>
+            This class implements a virtual table module that exposes an
+            <see cref="T:System.Collections.Generic.IEnumerable`1"/> object instance as a read-only virtual
+            table.  It is not sealed and may be used as the base class for any
+            user-defined virtual table class that wraps an
+            <see cref="T:System.Collections.Generic.IEnumerable`1"/> object instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.enumerable">
+            <summary>
+            The <see cref="T:System.Collections.Generic.IEnumerable`1"/> instance containing the backing
+            data for the virtual table.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.#ctor(System.String,System.Collections.Generic.IEnumerable{`0})">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="name">
+            The name of the module.  This parameter cannot be null.
+            </param>
+            <param name="enumerable">
+            The <see cref="T:System.Collections.Generic.IEnumerable`1"/> instance to expose as a virtual
+            table.  This parameter cannot be null.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </param>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <param name="context">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.IDisposable.Dispose"/> method.  Zero if this method is
+            being called from the finalizer.
+            </param>
+        </member>
+    </members>
+</doc>
Binary file packages/System.Data.SQLite.1.0.90.0/lib/net40/System.Data.SQLite.Linq.dll has changed
Binary file packages/System.Data.SQLite.1.0.90.0/lib/net40/System.Data.SQLite.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/System.Data.SQLite.1.0.90.0/lib/net40/System.Data.SQLite.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12758 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>System.Data.SQLite</name>
+    </assembly>
+    <members>
+        <member name="T:System.Data.SQLite.AssemblySourceIdAttribute">
+            <summary>
+            Defines a source code identifier custom attribute for an assembly
+            manifest.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.AssemblySourceIdAttribute.#ctor(System.String)">
+            <summary>
+            Constructs an instance of this attribute class using the specified
+            source code identifier value.
+            </summary>
+            <param name="value">
+            The source code identifier value to use.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.AssemblySourceIdAttribute.SourceId">
+            <summary>
+            Gets the source code identifier value.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.AssemblySourceTimeStampAttribute">
+            <summary>
+            Defines a source code time-stamp custom attribute for an assembly
+            manifest.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.AssemblySourceTimeStampAttribute.#ctor(System.String)">
+            <summary>
+            Constructs an instance of this attribute class using the specified
+            source code time-stamp value.
+            </summary>
+            <param name="value">
+            The source code time-stamp value to use.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.AssemblySourceTimeStampAttribute.SourceTimeStamp">
+            <summary>
+            Gets the source code time-stamp value.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteLogCallback">
+             <summary>
+             This is the method signature for the SQLite core library logging callback
+             function for use with sqlite3_log() and the SQLITE_CONFIG_LOG.
+            
+             WARNING: This delegate is used more-or-less directly by native code, do
+                      not modify its type signature.
+             </summary>
+             <param name="pUserData">
+             The extra data associated with this message, if any.
+             </param>
+             <param name="errorCode">
+             The error code associated with this message.
+             </param>
+             <param name="pMessage">
+             The message string to be logged.
+             </param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLite3">
+            <summary>
+            This class implements SQLiteBase completely, and is the guts of the code that interop's SQLite with .NET
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteBase">
+            <summary>
+            This internal class provides the foundation of SQLite support.  It defines all the abstract members needed to implement
+            a SQLite data provider, and inherits from SQLiteConvert which allows for simple translations of string to and from SQLite.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConvert">
+            <summary>
+            This base class provides datatype conversion services for the SQLite provider.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert.FullFormat">
+            <summary>
+            The format string for DateTime values when using the InvariantCulture or CurrentCulture formats.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert.UnixEpoch">
+            <summary>
+            The value for the Unix epoch (e.g. January 1, 1970 at midnight, in UTC).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert.OleAutomationEpochAsJulianDay">
+            <summary>
+            The value of the OLE Automation epoch represented as a Julian day.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._datetimeFormats">
+            <summary>
+            An array of ISO-8601 DateTime formats that we support parsing.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._datetimeFormatUtc">
+            <summary>
+            The internal default format for UTC DateTime values when converting
+            to a string.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._datetimeFormatLocal">
+            <summary>
+            The internal default format for local DateTime values when converting
+            to a string.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._utf8">
+            <summary>
+            An UTF-8 Encoding instance, so we can convert strings to and from UTF-8
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._datetimeFormat">
+            <summary>
+            The default DateTime format for this instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._datetimeKind">
+            <summary>
+            The default DateTimeKind for this instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._datetimeFormatString">
+            <summary>
+            The default DateTime format string for this instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.#ctor(System.Data.SQLite.SQLiteDateFormats,System.DateTimeKind,System.String)">
+            <summary>
+            Initializes the conversion class
+            </summary>
+            <param name="fmt">The default date/time format to use for this instance</param>
+            <param name="kind">The DateTimeKind to use.</param>
+            <param name="fmtString">The DateTime format string to use.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToUTF8(System.String)">
+            <summary>
+            Converts a string to a UTF-8 encoded byte array sized to include a null-terminating character.
+            </summary>
+            <param name="sourceText">The string to convert to UTF-8</param>
+            <returns>A byte array containing the converted string plus an extra 0 terminating byte at the end of the array.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToUTF8(System.DateTime)">
+            <summary>
+            Convert a DateTime to a UTF-8 encoded, zero-terminated byte array.
+            </summary>
+            <remarks>
+            This function is a convenience function, which first calls ToString() on the DateTime, and then calls ToUTF8() with the
+            string result.
+            </remarks>
+            <param name="dateTimeValue">The DateTime to convert.</param>
+            <returns>The UTF-8 encoded string, including a 0 terminating byte at the end of the array.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToString(System.IntPtr,System.Int32)">
+            <summary>
+            Converts a UTF-8 encoded IntPtr of the specified length into a .NET string
+            </summary>
+            <param name="nativestring">The pointer to the memory where the UTF-8 string is encoded</param>
+            <param name="nativestringlen">The number of bytes to decode</param>
+            <returns>A string containing the translated character(s)</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.UTF8ToString(System.IntPtr,System.Int32)">
+            <summary>
+            Converts a UTF-8 encoded IntPtr of the specified length into a .NET string
+            </summary>
+            <param name="nativestring">The pointer to the memory where the UTF-8 string is encoded</param>
+            <param name="nativestringlen">The number of bytes to decode</param>
+            <returns>A string containing the translated character(s)</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.String)">
+            <summary>
+            Converts a string into a DateTime, using the DateTimeFormat, DateTimeKind,
+            and DateTimeFormatString specified for the connection when it was opened.
+            </summary>
+            <remarks>
+            Acceptable ISO8601 DateTime formats are:
+            <list type="bullet">
+            <item><description>THHmmssK</description></item>
+            <item><description>THHmmK</description></item>
+            <item><description>HH:mm:ss.FFFFFFFK</description></item>
+            <item><description>HH:mm:ssK</description></item>
+            <item><description>HH:mmK</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ss.FFFFFFFK</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ssK</description></item>
+            <item><description>yyyy-MM-dd HH:mmK</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ss.FFFFFFFK</description></item>
+            <item><description>yyyy-MM-ddTHH:mmK</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ssK</description></item>
+            <item><description>yyyyMMddHHmmssK</description></item>
+            <item><description>yyyyMMddHHmmK</description></item>
+            <item><description>yyyyMMddTHHmmssFFFFFFFK</description></item>
+            <item><description>THHmmss</description></item>
+            <item><description>THHmm</description></item>
+            <item><description>HH:mm:ss.FFFFFFF</description></item>
+            <item><description>HH:mm:ss</description></item>
+            <item><description>HH:mm</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ss.FFFFFFF</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ss</description></item>
+            <item><description>yyyy-MM-dd HH:mm</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ss.FFFFFFF</description></item>
+            <item><description>yyyy-MM-ddTHH:mm</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ss</description></item>
+            <item><description>yyyyMMddHHmmss</description></item>
+            <item><description>yyyyMMddHHmm</description></item>
+            <item><description>yyyyMMddTHHmmssFFFFFFF</description></item>
+            <item><description>yyyy-MM-dd</description></item>
+            <item><description>yyyyMMdd</description></item>
+            <item><description>yy-MM-dd</description></item>
+            </list>
+            If the string cannot be matched to one of the above formats -OR-
+            the DateTimeFormatString if one was provided, an exception will
+            be thrown.
+            </remarks>
+            <param name="dateText">The string containing either a long integer number of 100-nanosecond units since
+            System.DateTime.MinValue, a Julian day double, an integer number of seconds since the Unix epoch, a
+            culture-independent formatted date and time string, a formatted date and time string in the current
+            culture, or an ISO8601-format string.</param>
+            <returns>A DateTime value</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.String,System.Data.SQLite.SQLiteDateFormats,System.DateTimeKind,System.String)">
+            <summary>
+            Converts a string into a DateTime, using the specified DateTimeFormat,
+            DateTimeKind and DateTimeFormatString.
+            </summary>
+            <remarks>
+            Acceptable ISO8601 DateTime formats are:
+            <list type="bullet">
+            <item><description>THHmmssK</description></item>
+            <item><description>THHmmK</description></item>
+            <item><description>HH:mm:ss.FFFFFFFK</description></item>
+            <item><description>HH:mm:ssK</description></item>
+            <item><description>HH:mmK</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ss.FFFFFFFK</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ssK</description></item>
+            <item><description>yyyy-MM-dd HH:mmK</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ss.FFFFFFFK</description></item>
+            <item><description>yyyy-MM-ddTHH:mmK</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ssK</description></item>
+            <item><description>yyyyMMddHHmmssK</description></item>
+            <item><description>yyyyMMddHHmmK</description></item>
+            <item><description>yyyyMMddTHHmmssFFFFFFFK</description></item>
+            <item><description>THHmmss</description></item>
+            <item><description>THHmm</description></item>
+            <item><description>HH:mm:ss.FFFFFFF</description></item>
+            <item><description>HH:mm:ss</description></item>
+            <item><description>HH:mm</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ss.FFFFFFF</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ss</description></item>
+            <item><description>yyyy-MM-dd HH:mm</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ss.FFFFFFF</description></item>
+            <item><description>yyyy-MM-ddTHH:mm</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ss</description></item>
+            <item><description>yyyyMMddHHmmss</description></item>
+            <item><description>yyyyMMddHHmm</description></item>
+            <item><description>yyyyMMddTHHmmssFFFFFFF</description></item>
+            <item><description>yyyy-MM-dd</description></item>
+            <item><description>yyyyMMdd</description></item>
+            <item><description>yy-MM-dd</description></item>
+            </list>
+            If the string cannot be matched to one of the above formats -OR-
+            the DateTimeFormatString if one was provided, an exception will
+            be thrown.
+            </remarks>
+            <param name="dateText">The string containing either a long integer number of 100-nanosecond units since
+            System.DateTime.MinValue, a Julian day double, an integer number of seconds since the Unix epoch, a
+            culture-independent formatted date and time string, a formatted date and time string in the current
+            culture, or an ISO8601-format string.</param>
+            <param name="format">The SQLiteDateFormats to use.</param>
+            <param name="kind">The DateTimeKind to use.</param>
+            <param name="formatString">The DateTime format string to use.</param>
+            <returns>A DateTime value</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.Double)">
+            <summary>
+            Converts a julianday value into a DateTime
+            </summary>
+            <param name="julianDay">The value to convert</param>
+            <returns>A .NET DateTime</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.Double,System.DateTimeKind)">
+            <summary>
+            Converts a julianday value into a DateTime
+            </summary>
+            <param name="julianDay">The value to convert</param>
+            <param name="kind">The DateTimeKind to use.</param>
+            <returns>A .NET DateTime</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.Int32,System.DateTimeKind)">
+            <summary>
+            Converts the specified number of seconds from the Unix epoch into a
+            <see cref="T:System.DateTime"/> value.
+            </summary>
+            <param name="seconds">
+            The number of whole seconds since the Unix epoch.
+            </param>
+            <param name="kind">
+            Either Utc or Local time.
+            </param>
+            <returns>
+            The new <see cref="T:System.DateTime"/> value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.Int64,System.DateTimeKind)">
+            <summary>
+            Converts the specified number of ticks since the epoch into a
+            <see cref="T:System.DateTime"/> value.
+            </summary>
+            <param name="ticks">
+            The number of whole ticks since the epoch.
+            </param>
+            <param name="kind">
+            Either Utc or Local time.
+            </param>
+            <returns>
+            The new <see cref="T:System.DateTime"/> value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToJulianDay(System.DateTime)">
+            <summary>
+            Converts a DateTime struct to a JulianDay double
+            </summary>
+            <param name="value">The DateTime to convert</param>
+            <returns>The JulianDay value the Datetime represents</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToUnixEpoch(System.DateTime)">
+            <summary>
+            Converts a DateTime struct to the whole number of seconds since the
+            Unix epoch.
+            </summary>
+            <param name="value">The DateTime to convert</param>
+            <returns>The whole number of seconds since the Unix epoch</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.GetDateTimeKindFormat(System.DateTimeKind,System.String)">
+            <summary>
+            Returns the DateTime format string to use for the specified DateTimeKind.
+            If <paramref name="formatString" /> is not null, it will be returned verbatim.
+            </summary>
+            <param name="kind">The DateTimeKind to use.</param>
+            <param name="formatString">The DateTime format string to use.</param>
+            <returns>
+            The DateTime format string to use for the specified DateTimeKind.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToString(System.DateTime)">
+            <summary>
+            Converts a string into a DateTime, using the DateTimeFormat, DateTimeKind,
+            and DateTimeFormatString specified for the connection when it was opened.
+            </summary>
+            <param name="dateValue">The DateTime value to convert</param>
+            <returns>Either a string containing the long integer number of 100-nanosecond units since System.DateTime.MinValue, a
+            Julian day double, an integer number of seconds since the Unix epoch, a culture-independent formatted date and time
+            string, a formatted date and time string in the current culture, or an ISO8601-format date/time string.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.IntPtr,System.Int32)">
+            <summary>
+            Internal function to convert a UTF-8 encoded IntPtr of the specified length to a DateTime.
+            </summary>
+            <remarks>
+            This is a convenience function, which first calls ToString() on the IntPtr to convert it to a string, then calls
+            ToDateTime() on the string to return a DateTime.
+            </remarks>
+            <param name="ptr">A pointer to the UTF-8 encoded string</param>
+            <param name="len">The length in bytes of the string</param>
+            <returns>The parsed DateTime value</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.Split(System.String,System.Char)">
+            <summary>
+            Smart method of splitting a string.  Skips quoted elements, removes the quotes.
+            </summary>
+            <remarks>
+            This split function works somewhat like the String.Split() function in that it breaks apart a string into
+            pieces and returns the pieces as an array.  The primary differences are:
+            <list type="bullet">
+            <item><description>Only one character can be provided as a separator character</description></item>
+            <item><description>Quoted text inside the string is skipped over when searching for the separator, and the quotes are removed.</description></item>
+            </list>
+            Thus, if splitting the following string looking for a comma:<br/>
+            One,Two, "Three, Four", Five<br/>
+            <br/>
+            The resulting array would contain<br/>
+            [0] One<br/>
+            [1] Two<br/>
+            [2] Three, Four<br/>
+            [3] Five<br/>
+            <br/>
+            Note that the leading and trailing spaces were removed from each item during the split.
+            </remarks>
+            <param name="source">Source string to split apart</param>
+            <param name="separator">Separator character</param>
+            <returns>A string array of the split up elements</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.NewSplit(System.String,System.Char,System.Boolean,System.String@)">
+            <summary>
+            Splits the specified string into multiple strings based on a separator
+            and returns the result as an array of strings.
+            </summary>
+            <param name="value">
+            The string to split into pieces based on the separator character.  If
+            this string is null, null will always be returned.  If this string is
+            empty, an array of zero strings will always be returned.
+            </param>
+            <param name="separator">
+            The character used to divide the original string into sub-strings.
+            This character cannot be a backslash or a double-quote; otherwise, no
+            work will be performed and null will be returned.
+            </param>
+            <param name="keepQuote">
+            If this parameter is non-zero, all double-quote characters will be
+            retained in the returned list of strings; otherwise, they will be
+            dropped.
+            </param>
+            <param name="error">
+            Upon failure, this parameter will be modified to contain an appropriate
+            error message.
+            </param>
+            <returns>
+            The new array of strings or null if the input string is null -OR- the
+            separator character is a backslash or a double-quote -OR- the string
+            contains an unbalanced backslash or double-quote character.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToBoolean(System.Object)">
+            <summary>
+            Convert a value to true or false.
+            </summary>
+            <param name="source">A string or number representing true or false</param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToBoolean(System.String)">
+            <summary>
+            Convert a string to true or false.
+            </summary>
+            <param name="source">A string representing true or false</param>
+            <returns></returns>
+            <remarks>
+            "yes", "no", "y", "n", "0", "1", "on", "off" as well as Boolean.FalseString and Boolean.TrueString will all be
+            converted to a proper boolean value.
+            </remarks>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.SQLiteTypeToType(System.Data.SQLite.SQLiteType)">
+            <summary>
+            Converts a SQLiteType to a .NET Type object
+            </summary>
+            <param name="t">The SQLiteType to convert</param>
+            <returns>Returns a .NET Type object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.TypeToDbType(System.Type)">
+            <summary>
+            For a given intrinsic type, return a DbType
+            </summary>
+            <param name="typ">The native type to convert</param>
+            <returns>The corresponding (closest match) DbType</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.DbTypeToColumnSize(System.Data.DbType)">
+            <summary>
+            Returns the ColumnSize for the given DbType
+            </summary>
+            <param name="typ">The DbType to get the size of</param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.DbTypeToTypeName(System.Data.DbType,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            Determines the type name for the given database value type.
+            </summary>
+            <param name="typ">The database value type.</param>
+            <param name="flags">The flags associated with the parent connection object.</param>
+            <returns>The type name or an empty string if it cannot be determined.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.DbTypeToType(System.Data.DbType)">
+            <summary>
+            Convert a DbType to a Type
+            </summary>
+            <param name="typ">The DbType to convert from</param>
+            <returns>The closest-match .NET type</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.TypeToAffinity(System.Type)">
+            <summary>
+            For a given type, return the closest-match SQLite TypeAffinity, which only understands a very limited subset of types.
+            </summary>
+            <param name="typ">The type to evaluate</param>
+            <returns>The SQLite type affinity for that type.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.GetSQLiteDbTypeMap">
+            <summary>
+            Builds and returns a map containing the database column types
+            recognized by this provider.
+            </summary>
+            <returns>
+            A map containing the database column types recognized by this
+            provider.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.TypeNameToDbType(System.String,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            For a given type name, return a closest-match .NET type
+            </summary>
+            <param name="Name">The name of the type to match</param>
+            <param name="flags">The flags associated with the parent connection object.</param>
+            <returns>The .NET DBType the text evaluates to.</returns>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBase.COR_E_EXCEPTION">
+            <summary>
+            The error code used for logging exceptions caught in user-provided
+            code.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.SetMemoryStatus(System.Boolean)">
+            <summary>
+            Sets the status of the memory usage tracking subsystem in the SQLite core library.  By default, this is enabled.
+            If this is disabled, memory usage tracking will not be performed.  This is not really a per-connection value, it is
+            global to the process.
+            </summary>
+            <param name="value">Non-zero to enable memory usage tracking, zero otherwise.</param>
+            <returns>A standard SQLite return code (i.e. zero for success and non-zero for failure).</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.ReleaseMemory">
+            <summary>
+            Attempts to free as much heap memory as possible for the database connection.
+            </summary>
+            <returns>A standard SQLite return code (i.e. zero for success and non-zero for failure).</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Shutdown">
+            <summary>
+            Shutdown the SQLite engine so that it can be restarted with different config options.
+            We depend on auto initialization to recover.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.IsOpen">
+            <summary>
+            Determines if the associated native connection handle is open.
+            </summary>
+            <returns>
+            Non-zero if a database connection is open.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Open(System.String,System.Data.SQLite.SQLiteConnectionFlags,System.Data.SQLite.SQLiteOpenFlagsEnum,System.Int32,System.Boolean)">
+            <summary>
+            Opens a database.
+            </summary>
+            <remarks>
+            Implementers should call SQLiteFunction.BindFunctions() and save the array after opening a connection
+            to bind all attributed user-defined functions and collating sequences to the new connection.
+            </remarks>
+            <param name="strFilename">The filename of the database to open.  SQLite automatically creates it if it doesn't exist.</param>
+            <param name="connectionFlags">The flags associated with the parent connection object</param>
+            <param name="openFlags">The open flags to use when creating the connection</param>
+            <param name="maxPoolSize">The maximum size of the pool for the given filename</param>
+            <param name="usePool">If true, the connection can be pulled from the connection pool</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Close(System.Boolean)">
+            <summary>
+            Closes the currently-open database.
+            </summary>
+            <remarks>
+            After the database has been closed implemeters should call SQLiteFunction.UnbindFunctions() to deallocate all interop allocated
+            memory associated with the user-defined functions and collating sequences tied to the closed connection.
+            </remarks>
+            <param name="canThrow">Non-zero if the operation is allowed to throw exceptions, zero otherwise.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.SetTimeout(System.Int32)">
+            <summary>
+            Sets the busy timeout on the connection.  SQLiteCommand will call this before executing any command.
+            </summary>
+            <param name="nTimeoutMS">The number of milliseconds to wait before returning SQLITE_BUSY</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.GetLastError">
+            <summary>
+            Returns the text of the last error issued by SQLite
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.GetLastError(System.String)">
+            <summary>
+            Returns the text of the last error issued by SQLite -OR- the specified default error text if
+            none is available from the SQLite core library.
+            </summary>
+            <param name="defValue">
+            The error text to return in the event that one is not available from the SQLite core library.
+            </param>
+            <returns>
+            The error text.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.ClearPool">
+            <summary>
+            When pooling is enabled, force this connection to be disposed rather than returned to the pool
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.CountPool">
+            <summary>
+            When pooling is enabled, returns the number of pool entries matching the current file name.
+            </summary>
+            <returns>The number of pool entries matching the current file name.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Prepare(System.Data.SQLite.SQLiteConnection,System.String,System.Data.SQLite.SQLiteStatement,System.UInt32,System.String@)">
+            <summary>
+            Prepares a SQL statement for execution.
+            </summary>
+            <param name="cnn">The source connection preparing the command.  Can be null for any caller except LINQ</param>
+            <param name="strSql">The SQL command text to prepare</param>
+            <param name="previous">The previous statement in a multi-statement command, or null if no previous statement exists</param>
+            <param name="timeoutMS">The timeout to wait before aborting the prepare</param>
+            <param name="strRemain">The remainder of the statement that was not processed.  Each call to prepare parses the
+            SQL up to to either the end of the text or to the first semi-colon delimiter.  The remaining text is returned
+            here for a subsequent call to Prepare() until all the text has been processed.</param>
+            <returns>Returns an initialized SQLiteStatement.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Step(System.Data.SQLite.SQLiteStatement)">
+            <summary>
+            Steps through a prepared statement.
+            </summary>
+            <param name="stmt">The SQLiteStatement to step through</param>
+            <returns>True if a row was returned, False if not.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Reset(System.Data.SQLite.SQLiteStatement)">
+            <summary>
+            Resets a prepared statement so it can be executed again.  If the error returned is SQLITE_SCHEMA,
+            transparently attempt to rebuild the SQL statement and throw an error if that was not possible.
+            </summary>
+            <param name="stmt">The statement to reset</param>
+            <returns>Returns -1 if the schema changed while resetting, 0 if the reset was sucessful or 6 (SQLITE_LOCKED) if the reset failed due to a lock</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Cancel">
+            <summary>
+            Attempts to interrupt the query currently executing on the associated
+            native database connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.BindFunction(System.Data.SQLite.SQLiteFunctionAttribute,System.Data.SQLite.SQLiteFunction,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            This function binds a user-defined functions to the connection.
+            </summary>
+            <param name="functionAttribute">
+            The <see cref="T:System.Data.SQLite.SQLiteFunctionAttribute"/> object instance containing
+            the metadata for the function to be bound.
+            </param>
+            <param name="function">
+            The <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance that implements the
+            function to be bound.
+            </param>
+            <param name="flags">
+            The flags associated with the parent connection object.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.CreateModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            Calls the native SQLite core library in order to create a disposable
+            module containing the implementation of a virtual table.
+            </summary>
+            <param name="module">
+            The module object to be used when creating the native disposable module.
+            </param>
+            <param name="flags">
+            The flags for the associated <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.DisposeModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            Calls the native SQLite core library in order to cleanup the resources
+            associated with a module containing the implementation of a virtual table.
+            </summary>
+            <param name="module">
+            The module object previously passed to the <see cref="M:System.Data.SQLite.SQLiteBase.CreateModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)"/>
+            method.
+            </param>
+            <param name="flags">
+            The flags for the associated <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.DeclareVirtualTable(System.Data.SQLite.SQLiteModule,System.String,System.String@)">
+            <summary>
+            Calls the native SQLite core library in order to declare a virtual table
+            in response to a call into the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/>
+            or <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> virtual table methods.
+            </summary>
+            <param name="module">
+            The virtual table module that is to be responsible for the virtual table
+            being declared.
+            </param>
+            <param name="strSql">
+            The string containing the SQL statement describing the virtual table to
+            be declared.
+            </param>
+            <param name="error">
+            Upon success, the contents of this parameter are undefined.  Upon failure,
+            it should contain an appropriate error message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.DeclareVirtualFunction(System.Data.SQLite.SQLiteModule,System.Int32,System.String,System.String@)">
+            <summary>
+            Calls the native SQLite core library in order to declare a virtual table
+            function in response to a call into the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/>
+            or <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> virtual table methods.
+            </summary>
+            <param name="module">
+            The virtual table module that is to be responsible for the virtual table
+            function being declared.
+            </param>
+            <param name="argumentCount">
+            The number of arguments to the function being declared.
+            </param>
+            <param name="name">
+            The name of the function being declared.
+            </param>
+            <param name="error">
+            Upon success, the contents of this parameter are undefined.  Upon failure,
+            it should contain an appropriate error message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.SetLoadExtension(System.Boolean)">
+            <summary>
+            Enables or disabled extension loading by SQLite.
+            </summary>
+            <param name="bOnOff">
+            True to enable loading of extensions, false to disable.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.LoadExtension(System.String,System.String)">
+            <summary>
+            Loads a SQLite extension library from the named file.
+            </summary>
+            <param name="fileName">
+            The name of the dynamic link library file containing the extension.
+            </param>
+            <param name="procName">
+            The name of the exported function used to initialize the extension.
+            If null, the default "sqlite3_extension_init" will be used.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.SetExtendedResultCodes(System.Boolean)">
+            <summary>
+            Enables or disabled extened result codes returned by SQLite
+            </summary>
+            <param name="bOnOff">true to enable extended result codes, false to disable.</param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.ResultCode">
+            <summary>
+            Returns the numeric result code for the most recent failed SQLite API call
+            associated with the database connection.
+            </summary>
+            <returns>Result code</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.ExtendedResultCode">
+            <summary>
+            Returns the extended numeric result code for the most recent failed SQLite API call
+            associated with the database connection.
+            </summary>
+            <returns>Extended result code</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.LogMessage(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            <summary>
+            Add a log message via the SQLite sqlite3_log interface.
+            </summary>
+            <param name="iErrCode">Error code to be logged with the message.</param>
+            <param name="zMessage">String to be logged.  Unlike the SQLite sqlite3_log()
+            interface, this should be pre-formatted.  Consider using the
+            String.Format() function.</param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.IsInitialized">
+            <summary>
+            Checks if the SQLite core library has been initialized in the current process.
+            </summary>
+            <returns>
+            Non-zero if the SQLite core library has been initialized in the current process,
+            zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.InitializeBackup(System.Data.SQLite.SQLiteConnection,System.String,System.String)">
+            <summary>
+            Creates a new SQLite backup object based on the provided destination
+            database connection.  The source database connection is the one
+            associated with this object.  The source and destination database
+            connections cannot be the same.
+            </summary>
+            <param name="destCnn">The destination database connection.</param>
+            <param name="destName">The destination database name.</param>
+            <param name="sourceName">The source database name.</param>
+            <returns>The newly created backup object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.StepBackup(System.Data.SQLite.SQLiteBackup,System.Int32,System.Boolean@)">
+            <summary>
+            Copies up to N pages from the source database to the destination
+            database associated with the specified backup object.
+            </summary>
+            <param name="backup">The backup object to use.</param>
+            <param name="nPage">
+            The number of pages to copy or negative to copy all remaining pages.
+            </param>
+            <param name="retry">
+            Set to true if the operation needs to be retried due to database
+            locking issues.
+            </param>
+            <returns>
+            True if there are more pages to be copied, false otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.RemainingBackup(System.Data.SQLite.SQLiteBackup)">
+            <summary>
+            Returns the number of pages remaining to be copied from the source
+            database to the destination database associated with the specified
+            backup object.
+            </summary>
+            <param name="backup">The backup object to check.</param>
+            <returns>The number of pages remaining to be copied.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.PageCountBackup(System.Data.SQLite.SQLiteBackup)">
+            <summary>
+            Returns the total number of pages in the source database associated
+            with the specified backup object.
+            </summary>
+            <param name="backup">The backup object to check.</param>
+            <returns>The total number of pages in the source database.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.FinishBackup(System.Data.SQLite.SQLiteBackup)">
+            <summary>
+            Destroys the backup object, rolling back any backup that may be in
+            progess.
+            </summary>
+            <param name="backup">The backup object to destroy.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.FallbackGetErrorString(System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Returns the error message for the specified SQLite return code using
+            the internal static lookup table.
+            </summary>
+            <param name="rc">The SQLite return code.</param>
+            <returns>The error message or null if it cannot be found.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.GetErrorString(System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Returns the error message for the specified SQLite return code using
+            the sqlite3_errstr() function, falling back to the internal lookup
+            table if necessary.
+            </summary>
+            <param name="rc">The SQLite return code.</param>
+            <returns>The error message or null if it cannot be found.</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.Version">
+            <summary>
+            Returns a string representing the active version of SQLite
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.VersionNumber">
+            <summary>
+            Returns an integer representing the active version of SQLite
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.LastInsertRowId">
+            <summary>
+            Returns the rowid of the most recent successful INSERT into the database from this connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.Changes">
+            <summary>
+            Returns the number of changes the last executing insert/update caused.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.MemoryUsed">
+            <summary>
+            Returns the amount of memory (in bytes) currently in use by the SQLite core library.  This is not really a per-connection
+            value, it is global to the process.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.MemoryHighwater">
+            <summary>
+            Returns the maximum amount of memory (in bytes) used by the SQLite core library since the high-water mark was last reset.
+            This is not really a per-connection value, it is global to the process.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.OwnHandle">
+            <summary>
+            Returns non-zero if the underlying native connection handle is owned by this instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.AutoCommit">
+            <summary>
+            Returns non-zero if the given database connection is in autocommit mode.
+            Autocommit mode is on by default.  Autocommit mode is disabled by a BEGIN
+            statement.  Autocommit mode is re-enabled by a COMMIT or ROLLBACK.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLite3._sql">
+            <summary>
+            The opaque pointer returned to us by the sqlite provider
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLite3._functions">
+            <summary>
+            The user-defined functions registered on this connection
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLite3._modules">
+            <summary>
+            The modules created using this connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.#ctor(System.Data.SQLite.SQLiteDateFormats,System.DateTimeKind,System.String,System.IntPtr,System.String,System.Boolean)">
+            <summary>
+            Constructs the object used to interact with the SQLite core library
+            using the UTF-8 text encoding.
+            </summary>
+            <param name="fmt">
+            The DateTime format to be used when converting string values to a
+            DateTime and binding DateTime parameters.
+            </param>
+            <param name="kind">
+            The <see cref="T:System.DateTimeKind"/> to be used when creating DateTime
+            values.
+            </param>
+            <param name="fmtString">
+            The format string to be used when parsing and formatting DateTime
+            values.
+            </param>
+            <param name="db">
+            The native handle to be associated with the database connection.
+            </param>
+            <param name="fileName">
+            The fully qualified file name associated with <paramref name="db "/>.
+            </param>
+            <param name="ownHandle">
+            Non-zero if the newly created object instance will need to dispose
+            of <paramref name="db"/> when it is no longer needed.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.DisposeModules">
+            <summary>
+            This method attempts to dispose of all the <see cref="T:System.Data.SQLite.SQLiteModule"/> derived
+            object instances currently associated with the native database connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.Cancel">
+            <summary>
+            Attempts to interrupt the query currently executing on the associated
+            native database connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.BindFunction(System.Data.SQLite.SQLiteFunctionAttribute,System.Data.SQLite.SQLiteFunction,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            This function binds a user-defined function to the connection.
+            </summary>
+            <param name="functionAttribute">
+            The <see cref="T:System.Data.SQLite.SQLiteFunctionAttribute"/> object instance containing
+            the metadata for the function to be bound.
+            </param>
+            <param name="function">
+            The <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance that implements the
+            function to be bound.
+            </param>
+            <param name="flags">
+            The flags associated with the parent connection object.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.ReleaseMemory">
+            <summary>
+            Attempts to free as much heap memory as possible for the database connection.
+            </summary>
+            <returns>A standard SQLite return code (i.e. zero for success and non-zero for failure).</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.StaticReleaseMemory(System.Int32,System.Boolean,System.Boolean,System.Int32@,System.Boolean@,System.UInt32@)">
+            <summary>
+            Attempts to free N bytes of heap memory by deallocating non-essential memory
+            allocations held by the database library. Memory used to cache database pages
+            to improve performance is an example of non-essential memory.  This is a no-op
+            returning zero if the SQLite core library was not compiled with the compile-time
+            option SQLITE_ENABLE_MEMORY_MANAGEMENT.  Optionally, attempts to reset and/or
+            compact the Win32 native heap, if applicable.
+            </summary>
+            <param name="nBytes">
+            The requested number of bytes to free.
+            </param>
+            <param name="reset">
+            Non-zero to attempt a heap reset.
+            </param>
+            <param name="compact">
+            Non-zero to attempt heap compaction.
+            </param>
+            <param name="nFree">
+            The number of bytes actually freed.  This value may be zero.
+            </param>
+            <param name="resetOk">
+            This value will be non-zero if the heap reset was successful.
+            </param>
+            <param name="nLargest">
+            The size of the largest committed free block in the heap, in bytes.
+            This value will be zero unless heap compaction is enabled.
+            </param>
+            <returns>
+            A standard SQLite return code (i.e. zero for success and non-zero
+            for failure).
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.Shutdown">
+            <summary>
+            Shutdown the SQLite engine so that it can be restarted with different
+            configuration options.  We depend on auto initialization to recover.
+            </summary>
+            <returns>Returns a standard SQLite result code.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.StaticShutdown(System.Boolean)">
+            <summary>
+            Shutdown the SQLite engine so that it can be restarted with different
+            configuration options.  We depend on auto initialization to recover.
+            </summary>
+            <param name="directories">
+            Non-zero to reset the database and temporary directories to their
+            default values, which should be null for both.  This parameter has no
+            effect on non-Windows operating systems.
+            </param>
+            <returns>Returns a standard SQLite result code.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.IsOpen">
+            <summary>
+            Determines if the associated native connection handle is open.
+            </summary>
+            <returns>
+            Non-zero if the associated native connection handle is open.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.CreateModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            Calls the native SQLite core library in order to create a disposable
+            module containing the implementation of a virtual table.
+            </summary>
+            <param name="module">
+            The module object to be used when creating the native disposable module.
+            </param>
+            <param name="flags">
+            The flags for the associated <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.DisposeModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            Calls the native SQLite core library in order to cleanup the resources
+            associated with a module containing the implementation of a virtual table.
+            </summary>
+            <param name="module">
+            The module object previously passed to the <see cref="M:System.Data.SQLite.SQLite3.CreateModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)"/>
+            method.
+            </param>
+            <param name="flags">
+            The flags for the associated <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.DeclareVirtualTable(System.Data.SQLite.SQLiteModule,System.String,System.String@)">
+            <summary>
+            Calls the native SQLite core library in order to declare a virtual table
+            in response to a call into the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/>
+            or <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> virtual table methods.
+            </summary>
+            <param name="module">
+            The virtual table module that is to be responsible for the virtual table
+            being declared.
+            </param>
+            <param name="strSql">
+            The string containing the SQL statement describing the virtual table to
+            be declared.
+            </param>
+            <param name="error">
+            Upon success, the contents of this parameter are undefined.  Upon failure,
+            it should contain an appropriate error message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.DeclareVirtualFunction(System.Data.SQLite.SQLiteModule,System.Int32,System.String,System.String@)">
+            <summary>
+            Calls the native SQLite core library in order to declare a virtual table
+            function in response to a call into the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/>
+            or <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> virtual table methods.
+            </summary>
+            <param name="module">
+            The virtual table module that is to be responsible for the virtual table
+            function being declared.
+            </param>
+            <param name="argumentCount">
+            The number of arguments to the function being declared.
+            </param>
+            <param name="name">
+            The name of the function being declared.
+            </param>
+            <param name="error">
+            Upon success, the contents of this parameter are undefined.  Upon failure,
+            it should contain an appropriate error message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.SetLoadExtension(System.Boolean)">
+            <summary>
+            Enables or disabled extension loading by SQLite.
+            </summary>
+            <param name="bOnOff">
+            True to enable loading of extensions, false to disable.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.LoadExtension(System.String,System.String)">
+            <summary>
+            Loads a SQLite extension library from the named file.
+            </summary>
+            <param name="fileName">
+            The name of the dynamic link library file containing the extension.
+            </param>
+            <param name="procName">
+            The name of the exported function used to initialize the extension.
+            If null, the default "sqlite3_extension_init" will be used.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.SetExtendedResultCodes(System.Boolean)">
+            Enables or disabled extended result codes returned by SQLite
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.ResultCode">
+            Gets the last SQLite error code
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.ExtendedResultCode">
+            Gets the last SQLite extended error code
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.LogMessage(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            Add a log message via the SQLite sqlite3_log interface.
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.StaticLogMessage(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            Add a log message via the SQLite sqlite3_log interface.
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.SetLogCallback(System.Data.SQLite.SQLiteLogCallback)">
+            <summary>
+            Allows the setting of a logging callback invoked by SQLite when a
+            log event occurs.  Only one callback may be set.  If NULL is passed,
+            the logging callback is unregistered.
+            </summary>
+            <param name="func">The callback function to invoke.</param>
+            <returns>Returns a result code</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.InitializeBackup(System.Data.SQLite.SQLiteConnection,System.String,System.String)">
+            <summary>
+            Creates a new SQLite backup object based on the provided destination
+            database connection.  The source database connection is the one
+            associated with this object.  The source and destination database
+            connections cannot be the same.
+            </summary>
+            <param name="destCnn">The destination database connection.</param>
+            <param name="destName">The destination database name.</param>
+            <param name="sourceName">The source database name.</param>
+            <returns>The newly created backup object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.StepBackup(System.Data.SQLite.SQLiteBackup,System.Int32,System.Boolean@)">
+            <summary>
+            Copies up to N pages from the source database to the destination
+            database associated with the specified backup object.
+            </summary>
+            <param name="backup">The backup object to use.</param>
+            <param name="nPage">
+            The number of pages to copy, negative to copy all remaining pages.
+            </param>
+            <param name="retry">
+            Set to true if the operation needs to be retried due to database
+            locking issues; otherwise, set to false.
+            </param>
+            <returns>
+            True if there are more pages to be copied, false otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.RemainingBackup(System.Data.SQLite.SQLiteBackup)">
+            <summary>
+            Returns the number of pages remaining to be copied from the source
+            database to the destination database associated with the specified
+            backup object.
+            </summary>
+            <param name="backup">The backup object to check.</param>
+            <returns>The number of pages remaining to be copied.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.PageCountBackup(System.Data.SQLite.SQLiteBackup)">
+            <summary>
+            Returns the total number of pages in the source database associated
+            with the specified backup object.
+            </summary>
+            <param name="backup">The backup object to check.</param>
+            <returns>The total number of pages in the source database.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.FinishBackup(System.Data.SQLite.SQLiteBackup)">
+            <summary>
+            Destroys the backup object, rolling back any backup that may be in
+            progess.
+            </summary>
+            <param name="backup">The backup object to destroy.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.IsInitialized">
+            <summary>
+            Determines if the SQLite core library has been initialized for the
+            current process.
+            </summary>
+            <returns>
+            A boolean indicating whether or not the SQLite core library has been
+            initialized for the current process.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.StaticIsInitialized">
+            <summary>
+            Determines if the SQLite core library has been initialized for the
+            current process.
+            </summary>
+            <returns>
+            A boolean indicating whether or not the SQLite core library has been
+            initialized for the current process.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.GetValue(System.Data.SQLite.SQLiteStatement,System.Data.SQLite.SQLiteConnectionFlags,System.Int32,System.Data.SQLite.SQLiteType)">
+            <summary>
+            Helper function to retrieve a column of data from an active statement.
+            </summary>
+            <param name="stmt">The statement being step()'d through</param>
+            <param name="flags">The flags associated with the connection.</param>
+            <param name="index">The column index to retrieve</param>
+            <param name="typ">The type of data contained in the column.  If Uninitialized, this function will retrieve the datatype information.</param>
+            <returns>Returns the data in the column</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLite3.OwnHandle">
+            <summary>
+            Returns non-zero if the underlying native connection handle is owned
+            by this instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLite3_UTF16">
+            <summary>
+            Alternate SQLite3 object, overriding many text behaviors to support UTF-16 (Unicode)
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3_UTF16.#ctor(System.Data.SQLite.SQLiteDateFormats,System.DateTimeKind,System.String,System.IntPtr,System.String,System.Boolean)">
+            <summary>
+            Constructs the object used to interact with the SQLite core library
+            using the UTF-8 text encoding.
+            </summary>
+            <param name="fmt">
+            The DateTime format to be used when converting string values to a
+            DateTime and binding DateTime parameters.
+            </param>
+            <param name="kind">
+            The <see cref="T:System.DateTimeKind"/> to be used when creating DateTime
+            values.
+            </param>
+            <param name="fmtString">
+            The format string to be used when parsing and formatting DateTime
+            values.
+            </param>
+            <param name="db">
+            The native handle to be associated with the database connection.
+            </param>
+            <param name="fileName">
+            The fully qualified file name associated with <paramref name="db"/>.
+            </param>
+            <param name="ownHandle">
+            Non-zero if the newly created object instance will need to dispose
+            of <paramref name="db"/> when it is no longer needed.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3_UTF16.ToString(System.IntPtr,System.Int32)">
+            <summary>
+            Overrides SQLiteConvert.ToString() to marshal UTF-16 strings instead of UTF-8
+            </summary>
+            <param name="b">A pointer to a UTF-16 string</param>
+            <param name="nbytelen">The length (IN BYTES) of the string</param>
+            <returns>A .NET string</returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteBackup">
+            <summary>
+            Represents a single SQL backup in SQLite.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._sql">
+            <summary>
+            The underlying SQLite object this backup is bound to.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._sqlite_backup">
+            <summary>
+            The actual backup handle.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._destDb">
+            <summary>
+            The destination database for the backup.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._zDestName">
+            <summary>
+            The destination database name for the backup.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._sourceDb">
+            <summary>
+            The source database for the backup.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._zSourceName">
+            <summary>
+            The source database name for the backup.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._stepResult">
+            <summary>
+            The last result from the StepBackup method of the SQLite3 class.
+            This is used to determine if the call to the FinishBackup method of
+            the SQLite3 class should throw an exception when it receives a non-Ok
+            return code from the core SQLite library.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBackup.#ctor(System.Data.SQLite.SQLiteBase,System.Data.SQLite.SQLiteBackupHandle,System.IntPtr,System.Byte[],System.IntPtr,System.Byte[])">
+            <summary>
+            Initializes the backup.
+            </summary>
+            <param name="sqlbase">The base SQLite object.</param>
+            <param name="backup">The backup handle.</param>
+            <param name="destDb">The destination database for the backup.</param>
+            <param name="zDestName">The destination database name for the backup.</param>
+            <param name="sourceDb">The source database for the backup.</param>
+            <param name="zSourceName">The source database name for the backup.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBackup.Dispose">
+            <summary>
+            Disposes and finalizes the backup.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnectionFlags">
+            <summary>
+            The extra behavioral flags that can be applied to a connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.None">
+            <summary>
+            No extra flags.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogPrepare">
+            <summary>
+            Enable logging of all SQL statements to be prepared.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogPreBind">
+            <summary>
+            Enable logging of all bound parameter types and raw values.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogBind">
+            <summary>
+            Enable logging of all bound parameter strongly typed values.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogCallbackException">
+            <summary>
+            Enable logging of all exceptions caught from user-provided
+            managed code called from native code via delegates.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogBackup">
+            <summary>
+            Enable logging of backup API errors.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.NoExtensionFunctions">
+            <summary>
+            Skip adding the extension functions provided by the native
+            interop assembly.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.BindUInt32AsInt64">
+            <summary>
+            When binding parameter values with the <see cref="T:System.UInt32"/>
+            type, use the interop method that accepts an <see cref="T:System.Int64"/>
+            value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.BindAllAsText">
+            <summary>
+            When binding parameter values, always bind them as though they were
+            plain text (i.e. no numeric, date/time, or other conversions should
+            be attempted).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.GetAllAsText">
+            <summary>
+            When returning column values, always return them as though they were
+            plain text (i.e. no numeric, date/time, or other conversions should
+            be attempted).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.NoLoadExtension">
+            <summary>
+            Prevent this <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance from
+            loading extensions.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.NoCreateModule">
+            <summary>
+            Prevent this <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance from
+            creating virtual table modules.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.NoBindFunctions">
+            <summary>
+            Skip binding any functions provided by other managed assemblies when
+            opening the connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.NoLogModule">
+            <summary>
+            Skip setting the logging related properties of the
+            <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance that was passed to
+            the <see cref="M:System.Data.SQLite.SQLiteConnection.CreateModule(System.Data.SQLite.SQLiteModule)"/> method.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogModuleError">
+            <summary>
+            Enable logging of all virtual table module errors seen by the
+            <see cref="M:System.Data.SQLite.SQLiteModule.SetTableError(System.IntPtr,System.String)"/> method.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogModuleException">
+            <summary>
+            Enable logging of certain virtual table module exceptions that cannot
+            be easily discovered via other means.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.TraceWarning">
+            <summary>
+            Enable tracing of potentially important [non-fatal] error conditions
+            that cannot be easily reported through other means.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.BindAndGetAllAsText">
+            <summary>
+            When binding and returning column values, always treat them as though
+            they were plain text (i.e. no numeric, date/time, or other conversions
+            should be attempted).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogAll">
+            <summary>
+            Enable all logging.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.Default">
+            <summary>
+            The default extra flags for new connections.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteCommand">
+            <summary>
+            SQLite implementation of DbCommand.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand.DefaultConnectionString">
+            <summary>
+            The default connection string to be used when creating a temporary
+            connection to execute a command via the static
+            <see cref="M:System.Data.SQLite.SQLiteCommand.Execute(System.String,System.Data.SQLite.SQLiteExecuteType,System.String,System.Object[])"/> or
+            <see cref="M:System.Data.SQLite.SQLiteCommand.Execute(System.String,System.Data.SQLite.SQLiteExecuteType,System.Data.CommandBehavior,System.String,System.Object[])"/>
+            methods.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._commandText">
+            <summary>
+            The command text this command is based on
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._cnn">
+            <summary>
+            The connection the command is associated with
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._version">
+            <summary>
+            The version of the connection the command is associated with
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._activeReader">
+            <summary>
+            Indicates whether or not a DataReader is active on the command.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._commandTimeout">
+            <summary>
+            The timeout for the command, kludged because SQLite doesn't support per-command timeout values
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._designTimeVisible">
+            <summary>
+            Designer support
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._updateRowSource">
+            <summary>
+            Used by DbDataAdapter to determine updating behavior
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._parameterCollection">
+            <summary>
+            The collection of parameters for the command
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._statementList">
+            <summary>
+            The SQL command text, broken into individual SQL statements as they are executed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._remainingText">
+            <summary>
+            Unprocessed SQL text that has not been executed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._transaction">
+            <summary>
+            Transaction associated with this command
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.#ctor">
+            <overloads>
+             Constructs a new SQLiteCommand
+             </overloads>
+             <summary>
+             Default constructor
+             </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.#ctor(System.String)">
+            <summary>
+            Initializes the command with the given command text
+            </summary>
+            <param name="commandText">The SQL command text</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.#ctor(System.String,System.Data.SQLite.SQLiteConnection)">
+            <summary>
+            Initializes the command with the given SQL command text and attach the command to the specified
+            connection.
+            </summary>
+            <param name="commandText">The SQL command text</param>
+            <param name="connection">The connection to associate with the command</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.#ctor(System.Data.SQLite.SQLiteConnection)">
+            <summary>
+            Initializes the command and associates it with the specified connection.
+            </summary>
+            <param name="connection">The connection to associate with the command</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.#ctor(System.String,System.Data.SQLite.SQLiteConnection,System.Data.SQLite.SQLiteTransaction)">
+            <summary>
+            Initializes a command with the given SQL, connection and transaction
+            </summary>
+            <param name="commandText">The SQL command text</param>
+            <param name="connection">The connection to associate with the command</param>
+            <param name="transaction">The transaction the command should be associated with</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.Dispose(System.Boolean)">
+            <summary>
+            Disposes of the command and clears all member variables
+            </summary>
+            <param name="disposing">Whether or not the class is being explicitly or implicitly disposed</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.GetFlags(System.Data.SQLite.SQLiteCommand)">
+            <summary>
+            This method attempts to query the flags associated with the database
+            connection in use.  If the database connection is disposed, the default
+            flags will be returned.
+            </summary>
+            <param name="command">
+            The command containing the databse connection to query the flags from.
+            </param>
+            <returns>
+            The connection flags value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ClearCommands">
+            <summary>
+            Clears and destroys all statements currently prepared
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.BuildNextCommand">
+            <summary>
+            Builds an array of prepared statements for each complete SQL statement in the command text
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.Cancel">
+            <summary>
+            Not implemented
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.CreateDbParameter">
+            <summary>
+            Forwards to the local CreateParameter() function
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.CreateParameter">
+            <summary>
+            Create a new parameter
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.InitializeForReader">
+            <summary>
+            This function ensures there are no active readers, that we have a valid connection,
+            that the connection is open, that all statements are prepared and all parameters are assigned
+            in preparation for allocating a data reader.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteDbDataReader(System.Data.CommandBehavior)">
+            <summary>
+            Creates a new SQLiteDataReader to execute/iterate the array of SQLite prepared statements
+            </summary>
+            <param name="behavior">The behavior the data reader should adopt</param>
+            <returns>Returns a SQLiteDataReader object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.Execute(System.String,System.Data.SQLite.SQLiteExecuteType,System.String,System.Object[])">
+            <summary>
+            This method creates a new connection, executes the query using the given
+            execution type, closes the connection, and returns the results.  If the
+            connection string is null, a temporary in-memory database connection will
+            be used.
+            </summary>
+            <param name="commandText">
+            The text of the command to be executed.
+            </param>
+            <param name="executeType">
+            The execution type for the command.  This is used to determine which method
+            of the command object to call, which then determines the type of results
+            returned, if any.
+            </param>
+            <param name="connectionString">
+            The connection string to the database to be opened, used, and closed.  If
+            this parameter is null, a temporary in-memory databse will be used.
+            </param>
+            <param name="args">
+            The SQL parameter values to be used when building the command object to be
+            executed, if any.
+            </param>
+            <returns>
+            The results of the query -OR- null if no results were produced from the
+            given execution type.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.Execute(System.String,System.Data.SQLite.SQLiteExecuteType,System.Data.CommandBehavior,System.String,System.Object[])">
+            <summary>
+            This method creates a new connection, executes the query using the given
+            execution type and command behavior, closes the connection, and returns
+            the results.  If the connection string is null, a temporary in-memory
+            database connection will be used.
+            </summary>
+            <param name="commandText">
+            The text of the command to be executed.
+            </param>
+            <param name="executeType">
+            The execution type for the command.  This is used to determine which method
+            of the command object to call, which then determines the type of results
+            returned, if any.
+            </param>
+            <param name="commandBehavior">
+            The command behavior flags for the command.
+            </param>
+            <param name="connectionString">
+            The connection string to the database to be opened, used, and closed.  If
+            this parameter is null, a temporary in-memory databse will be used.
+            </param>
+            <param name="args">
+            The SQL parameter values to be used when building the command object to be
+            executed, if any.
+            </param>
+            <returns>
+            The results of the query -OR- null if no results were produced from the
+            given execution type.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteReader(System.Data.CommandBehavior)">
+            <summary>
+            Overrides the default behavior to return a SQLiteDataReader specialization class
+            </summary>
+            <param name="behavior">The flags to be associated with the reader.</param>
+            <returns>A SQLiteDataReader</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteReader">
+            <summary>
+            Overrides the default behavior of DbDataReader to return a specialized SQLiteDataReader class
+            </summary>
+            <returns>A SQLiteDataReader</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ClearDataReader">
+            <summary>
+            Called by the SQLiteDataReader when the data reader is closed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteNonQuery">
+            <summary>
+            Execute the command and return the number of rows inserted/updated affected by it.
+            </summary>
+            <returns>The number of rows inserted/updated affected by it.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteNonQuery(System.Data.CommandBehavior)">
+            <summary>
+            Execute the command and return the number of rows inserted/updated affected by it.
+            </summary>
+            <param name="behavior">The flags to be associated with the reader.</param>
+            <returns>The number of rows inserted/updated affected by it.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteScalar">
+            <summary>
+            Execute the command and return the first column of the first row of the resultset
+            (if present), or null if no resultset was returned.
+            </summary>
+            <returns>The first column of the first row of the first resultset from the query.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteScalar(System.Data.CommandBehavior)">
+            <summary>
+            Execute the command and return the first column of the first row of the resultset
+            (if present), or null if no resultset was returned.
+            </summary>
+            <param name="behavior">The flags to be associated with the reader.</param>
+            <returns>The first column of the first row of the first resultset from the query.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.Prepare">
+            <summary>
+            Does nothing.  Commands are prepared as they are executed the first time, and kept in prepared state afterwards.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.Clone">
+            <summary>
+            Clones a command, including all its parameters
+            </summary>
+            <returns>A new SQLiteCommand with the same commandtext, connection and parameters</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.CommandText">
+            <summary>
+            The SQL command text associated with the command
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.CommandTimeout">
+            <summary>
+            The amount of time to wait for the connection to become available before erroring out
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.CommandType">
+            <summary>
+            The type of the command.  SQLite only supports CommandType.Text
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.Connection">
+            <summary>
+            The connection associated with this command
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.DbConnection">
+            <summary>
+            Forwards to the local Connection property
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.Parameters">
+            <summary>
+            Returns the SQLiteParameterCollection for the given command
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.DbParameterCollection">
+            <summary>
+            Forwards to the local Parameters property
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.Transaction">
+            <summary>
+            The transaction associated with this command.  SQLite only supports one transaction per connection, so this property forwards to the
+            command's underlying connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.DbTransaction">
+            <summary>
+            Forwards to the local Transaction property
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.UpdatedRowSource">
+            <summary>
+            Sets the method the SQLiteCommandBuilder uses to determine how to update inserted or updated rows in a DataTable.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.DesignTimeVisible">
+            <summary>
+            Determines if the command is visible at design time.  Defaults to True.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteCommandBuilder">
+            <summary>
+            SQLite implementation of DbCommandBuilder.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.#ctor(System.Data.SQLite.SQLiteDataAdapter)">
+            <summary>
+            Initializes the command builder and associates it with the specified data adapter.
+            </summary>
+            <param name="adp"></param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.ApplyParameterInfo(System.Data.Common.DbParameter,System.Data.DataRow,System.Data.StatementType,System.Boolean)">
+            <summary>
+            Minimal amount of parameter processing.  Primarily sets the DbType for the parameter equal to the provider type in the schema
+            </summary>
+            <param name="parameter">The parameter to use in applying custom behaviors to a row</param>
+            <param name="row">The row to apply the parameter to</param>
+            <param name="statementType">The type of statement</param>
+            <param name="whereClause">Whether the application of the parameter is part of a WHERE clause</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetParameterName(System.String)">
+            <summary>
+            Returns a valid named parameter
+            </summary>
+            <param name="parameterName">The name of the parameter</param>
+            <returns>Error</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetParameterName(System.Int32)">
+            <summary>
+            Returns a named parameter for the given ordinal
+            </summary>
+            <param name="parameterOrdinal">The i of the parameter</param>
+            <returns>Error</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetParameterPlaceholder(System.Int32)">
+            <summary>
+            Returns a placeholder character for the specified parameter i.
+            </summary>
+            <param name="parameterOrdinal">The index of the parameter to provide a placeholder for</param>
+            <returns>Returns a named parameter</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.SetRowUpdatingHandler(System.Data.Common.DbDataAdapter)">
+            <summary>
+            Sets the handler for receiving row updating events.  Used by the DbCommandBuilder to autogenerate SQL
+            statements that may not have previously been generated.
+            </summary>
+            <param name="adapter">A data adapter to receive events on.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetDeleteCommand">
+            <summary>
+            Returns the automatically-generated SQLite command to delete rows from the database
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetDeleteCommand(System.Boolean)">
+            <summary>
+            Returns the automatically-generated SQLite command to delete rows from the database
+            </summary>
+            <param name="useColumnsForParameterNames"></param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetUpdateCommand">
+            <summary>
+            Returns the automatically-generated SQLite command to update rows in the database
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetUpdateCommand(System.Boolean)">
+            <summary>
+            Returns the automatically-generated SQLite command to update rows in the database
+            </summary>
+            <param name="useColumnsForParameterNames"></param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetInsertCommand">
+            <summary>
+            Returns the automatically-generated SQLite command to insert rows into the database
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetInsertCommand(System.Boolean)">
+            <summary>
+            Returns the automatically-generated SQLite command to insert rows into the database
+            </summary>
+            <param name="useColumnsForParameterNames"></param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.QuoteIdentifier(System.String)">
+            <summary>
+            Places brackets around an identifier
+            </summary>
+            <param name="unquotedIdentifier">The identifier to quote</param>
+            <returns>The bracketed identifier</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.UnquoteIdentifier(System.String)">
+            <summary>
+            Removes brackets around an identifier
+            </summary>
+            <param name="quotedIdentifier">The quoted (bracketed) identifier</param>
+            <returns>The undecorated identifier</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetSchemaTable(System.Data.Common.DbCommand)">
+            <summary>
+            Override helper, which can help the base command builder choose the right keys for the given query
+            </summary>
+            <param name="sourceCommand"></param>
+            <returns></returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommandBuilder.DataAdapter">
+            <summary>
+            Gets/sets the DataAdapter for this CommandBuilder
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommandBuilder.CatalogLocation">
+            <summary>
+            Overridden to hide its property from the designer
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommandBuilder.CatalogSeparator">
+            <summary>
+            Overridden to hide its property from the designer
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommandBuilder.QuotePrefix">
+            <summary>
+            Overridden to hide its property from the designer
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommandBuilder.QuoteSuffix">
+            <summary>
+            Overridden to hide its property from the designer
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommandBuilder.SchemaSeparator">
+            <summary>
+            Overridden to hide its property from the designer
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.ConnectionEventArgs">
+            <summary>
+            Event data for connection event handlers.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.EventType">
+            <summary>
+            The type of event being raised.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.EventArgs">
+            <summary>
+            The <see cref="T:System.Data.StateChangeEventArgs"/> associated with this event, if any.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.Transaction">
+            <summary>
+            The transaction associated with this event, if any.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.Command">
+            <summary>
+            The command associated with this event, if any.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.DataReader">
+            <summary>
+            The data reader associated with this event, if any.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.CriticalHandle">
+            <summary>
+            The critical handle associated with this event, if any.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.Text">
+            <summary>
+            Command or message text associated with this event, if any.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.Data">
+            <summary>
+            Extra data associated with this event, if any.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.ConnectionEventArgs.#ctor(System.Data.SQLite.SQLiteConnectionEventType,System.Data.StateChangeEventArgs,System.Data.IDbTransaction,System.Data.IDbCommand,System.Data.IDataReader,System.Runtime.InteropServices.CriticalHandle,System.String,System.Object)">
+            <summary>
+            Constructs the object.
+            </summary>
+            <param name="eventType">The type of event being raised.</param>
+            <param name="eventArgs">The base <see cref="F:System.Data.SQLite.ConnectionEventArgs.EventArgs"/> associated
+            with this event, if any.</param>
+            <param name="transaction">The transaction associated with this event, if any.</param>
+            <param name="command">The command associated with this event, if any.</param>
+            <param name="dataReader">The data reader associated with this event, if any.</param>
+            <param name="criticalHandle">The critical handle associated with this event, if any.</param>
+            <param name="text">The command or message text, if any.</param>
+            <param name="data">The extra data, if any.</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnectionEventHandler">
+            <summary>
+            Raised when an event pertaining to a connection occurs.
+            </summary>
+            <param name="sender">The connection involved.</param>
+            <param name="e">Extra information about the event.</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnection">
+            <summary>
+            SQLite implentation of DbConnection.
+            </summary>
+            <remarks>
+            The <see cref="P:System.Data.SQLite.SQLiteConnection.ConnectionString"/> property can contain the following parameter(s), delimited with a semi-colon:
+            <list type="table">
+            <listheader>
+            <term>Parameter</term>
+            <term>Values</term>
+            <term>Required</term>
+            <term>Default</term>
+            </listheader>
+            <item>
+            <description>Data Source</description>
+            <description>
+            This may be a file name, the string ":memory:", or any supported URI (starting with SQLite 3.7.7).
+            Starting with release 1.0.86.0, in order to use more than one consecutive backslash (e.g. for a
+            UNC path), each of the adjoining backslash characters must be doubled (e.g. "\\Network\Share\test.db"
+            would become "\\\\Network\Share\test.db").
+            </description>
+            <description>Y</description>
+            <description></description>
+            </item>
+            <item>
+            <description>Version</description>
+            <description>3</description>
+            <description>N</description>
+            <description>3</description>
+            </item>
+            <item>
+            <description>UseUTF16Encoding</description>
+            <description><b>True</b><br/><b>False</b></description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>DateTimeFormat</description>
+            <description>
+            <b>Ticks</b> - Use the value of DateTime.Ticks.<br/>
+            <b>ISO8601</b> - Use the ISO-8601 format.  Uses the "yyyy-MM-dd HH:mm:ss.FFFFFFFK" format for UTC
+            DateTime values and "yyyy-MM-dd HH:mm:ss.FFFFFFF" format for local DateTime values).<br/>
+            <b>JulianDay</b> - The interval of time in days and fractions of a day since January 1, 4713 BC.<br/>
+            <b>UnixEpoch</b> - The whole number of seconds since the Unix epoch (January 1, 1970).<br/>
+            <b>InvariantCulture</b> - Any culture-independent string value that the .NET Framework can interpret as a valid DateTime.<br/>
+            <b>CurrentCulture</b> - Any string value that the .NET Framework can interpret as a valid DateTime using the current culture.</description>
+            <description>N</description>
+            <description>ISO8601</description>
+            </item>
+            <item>
+            <description>DateTimeKind</description>
+            <description><b>Unspecified</b> - Not specified as either UTC or local time.<br/><b>Utc</b> - The time represented is UTC.<br/><b>Local</b> - The time represented is local time.</description>
+            <description>N</description>
+            <description>Unspecified</description>
+            </item>
+            <item>
+            <description>DateTimeFormatString</description>
+            <description>The exact DateTime format string to use for all formatting and parsing of all DateTime
+            values for this connection.</description>
+            <description>N</description>
+            <description>null</description>
+            </item>
+            <item>
+            <description>BaseSchemaName</description>
+            <description>Some base data classes in the framework (e.g. those that build SQL queries dynamically)
+            assume that an ADO.NET provider cannot support an alternate catalog (i.e. database) without supporting
+            alternate schemas as well; however, SQLite does not fit into this model.  Therefore, this value is used
+            as a placeholder and removed prior to preparing any SQL statements that may contain it.</description>
+            <description>N</description>
+            <description>sqlite_default_schema</description>
+            </item>
+            <item>
+            <description>BinaryGUID</description>
+            <description><b>True</b> - Store GUID columns in binary form<br/><b>False</b> - Store GUID columns as text</description>
+            <description>N</description>
+            <description>True</description>
+            </item>
+            <item>
+            <description>Cache Size</description>
+            <description>{size in bytes}</description>
+            <description>N</description>
+            <description>2000</description>
+            </item>
+            <item>
+            <description>Synchronous</description>
+            <description><b>Normal</b> - Normal file flushing behavior<br/><b>Full</b> - Full flushing after all writes<br/><b>Off</b> - Underlying OS flushes I/O's</description>
+            <description>N</description>
+            <description>Full</description>
+            </item>
+            <item>
+            <description>Page Size</description>
+            <description>{size in bytes}</description>
+            <description>N</description>
+            <description>1024</description>
+            </item>
+            <item>
+            <description>Password</description>
+            <description>{password} - Using this parameter requires that the CryptoAPI based codec be enabled at compile-time for both the native interop assembly and the core managed assemblies; otherwise, using this parameter may result in an exception being thrown when attempting to open the connection.</description>
+            <description>N</description>
+            <description></description>
+            </item>
+            <item>
+            <description>HexPassword</description>
+            <description>{hexPassword} - Must contain a sequence of zero or more hexadecimal encoded byte values without a leading "0x" prefix.  Using this parameter requires that the CryptoAPI based codec be enabled at compile-time for both the native interop assembly and the core managed assemblies; otherwise, using this parameter may result in an exception being thrown when attempting to open the connection.</description>
+            <description>N</description>
+            <description></description>
+            </item>
+            <item>
+            <description>Enlist</description>
+            <description><b>Y</b> - Automatically enlist in distributed transactions<br/><b>N</b> - No automatic enlistment</description>
+            <description>N</description>
+            <description>Y</description>
+            </item>
+            <item>
+            <description>Pooling</description>
+            <description>
+            <b>True</b> - Use connection pooling.<br/>
+            <b>False</b> - Do not use connection pooling.<br/><br/>
+            <b>WARNING:</b> When using the default connection pool implementation,
+            setting this property to True should be avoided by applications that make
+            use of COM (either directly or indirectly) due to possible deadlocks that
+            can occur during the finalization of some COM objects.
+            </description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>FailIfMissing</description>
+            <description><b>True</b> - Don't create the database if it does not exist, throw an error instead<br/><b>False</b> - Automatically create the database if it does not exist</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Max Page Count</description>
+            <description>{size in pages} - Limits the maximum number of pages (limits the size) of the database</description>
+            <description>N</description>
+            <description>0</description>
+            </item>
+            <item>
+            <description>Legacy Format</description>
+            <description><b>True</b> - Use the more compatible legacy 3.x database format<br/><b>False</b> - Use the newer 3.3x database format which compresses numbers more effectively</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Default Timeout</description>
+            <description>{time in seconds}<br/>The default command timeout</description>
+            <description>N</description>
+            <description>30</description>
+            </item>
+            <item>
+            <description>Journal Mode</description>
+            <description><b>Delete</b> - Delete the journal file after a commit<br/><b>Persist</b> - Zero out and leave the journal file on disk after a commit<br/><b>Off</b> - Disable the rollback journal entirely</description>
+            <description>N</description>
+            <description>Delete</description>
+            </item>
+            <item>
+            <description>Read Only</description>
+            <description><b>True</b> - Open the database for read only access<br/><b>False</b> - Open the database for normal read/write access</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Max Pool Size</description>
+            <description>The maximum number of connections for the given connection string that can be in the connection pool</description>
+            <description>N</description>
+            <description>100</description>
+            </item>
+            <item>
+            <description>Default IsolationLevel</description>
+            <description>The default transaciton isolation level</description>
+            <description>N</description>
+            <description>Serializable</description>
+            </item>
+            <item>
+            <description>Foreign Keys</description>
+            <description>Enable foreign key constraints</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Flags</description>
+            <description>Extra behavioral flags for the connection.  See the <see cref="T:System.Data.SQLite.SQLiteConnectionFlags"/> enumeration for possible values.</description>
+            <description>N</description>
+            <description>Default</description>
+            </item>
+            <item>
+            <description>SetDefaults</description>
+            <description>
+            <b>True</b> - Apply the default connection settings to the opened database.<br/>
+            <b>False</b> - Skip applying the default connection settings to the opened database.
+            </description>
+            <description>N</description>
+            <description>True</description>
+            </item>
+            <item>
+            <description>ToFullPath</description>
+            <description>
+            <b>True</b> - Attempt to expand the data source file name to a fully qualified path before opening.<br/>
+            <b>False</b> - Skip attempting to expand the data source file name to a fully qualified path before opening.
+            </description>
+            <description>N</description>
+            <description>True</description>
+            </item>
+            </list>
+            </remarks>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection.DefaultBaseSchemaName">
+            <summary>
+            The default "stub" (i.e. placeholder) base schema name to use when
+            returning column schema information.  Used as the initial value of
+            the BaseSchemaName property.  This should start with "sqlite_*"
+            because those names are reserved for use by SQLite (i.e. they cannot
+            be confused with the names of user objects).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._assembly">
+            <summary>
+            The managed assembly containing this type.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._syncRoot">
+            <summary>
+            Object used to synchronize access to the static instance data
+            for this class.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._connectionState">
+            <summary>
+            State of the current connection
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._connectionString">
+            <summary>
+            The connection string
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._transactionLevel">
+            <summary>
+            Nesting level of the transactions open on the connection
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._disposing">
+            <summary>
+            If set, then the connection is currently being disposed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._defaultIsolation">
+            <summary>
+            The default isolation level for new transactions
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._enlistment">
+            <summary>
+            Whether or not the connection is enlisted in a distrubuted transaction
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._sql">
+            <summary>
+            The base SQLite object to interop with
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._dataSource">
+            <summary>
+            The database filename minus path and extension
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._password">
+            <summary>
+            Temporary password storage, emptied after the database has been opened
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._baseSchemaName">
+            <summary>
+            The "stub" (i.e. placeholder) base schema name to use when returning
+            column schema information.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._flags">
+            <summary>
+            The extra behavioral flags for this connection, if any.  See the
+            <see cref="T:System.Data.SQLite.SQLiteConnectionFlags"/> enumeration for a list of
+            possible values.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._defaultTimeout">
+            <summary>
+            Default command timeout
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._parseViaFramework">
+            <summary>
+            Non-zero if the built-in (i.e. framework provided) connection string
+            parser should be used when opening the connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.#ctor">
+            <overloads>
+             Constructs a new SQLiteConnection object
+             </overloads>
+             <summary>
+             Default constructor
+             </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.#ctor(System.String)">
+            <summary>
+            Initializes the connection with the specified connection string.
+            </summary>
+            <param name="connectionString">The connection string to use.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.#ctor(System.IntPtr,System.String,System.Boolean)">
+            <summary>
+            Initializes the connection with a pre-existing native connection handle.
+            This constructor overload is intended to be used only by the private
+            <see cref="M:System.Data.SQLite.SQLiteModule.CreateOrConnect(System.Boolean,System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="db">
+            The native connection handle to use.
+            </param>
+            <param name="fileName">
+            The file name corresponding to the native connection handle.
+            </param>
+            <param name="ownHandle">
+            Non-zero if this instance owns the native connection handle and
+            should dispose of it when it is no longer needed.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.#ctor(System.String,System.Boolean)">
+            <summary>
+            Initializes the connection with the specified connection string.
+            </summary>
+            <param name="connectionString">
+            The connection string to use.
+            </param>
+            <param name="parseViaFramework">
+            Non-zero to parse the connection string using the built-in (i.e.
+            framework provided) parser when opening the connection.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.#ctor(System.Data.SQLite.SQLiteConnection)">
+            <summary>
+            Clones the settings and connection string from an existing connection.  If the existing connection is already open, this
+            function will open its own connection, enumerate any attached databases of the original connection, and automatically
+            attach to them.
+            </summary>
+            <param name="connection">The connection to copy the settings from.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.OnChanged(System.Data.SQLite.SQLiteConnection,System.Data.SQLite.ConnectionEventArgs)">
+            <summary>
+            Raises the <see cref="E:System.Data.SQLite.SQLiteConnection.Changed"/> event.
+            </summary>
+            <param name="connection">
+            The connection associated with this event.  If this parameter is not
+            null and the specified connection cannot raise events, then the
+            registered event handlers will not be invoked.
+            </param>
+            <param name="e">
+            A <see cref="T:System.Data.SQLite.ConnectionEventArgs"/> that contains the event data.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.CreateHandle(System.IntPtr)">
+            <summary>
+            Creates and returns a new managed database connection handle.  This
+            method is intended to be used by implementations of the
+            <see cref="T:System.Data.SQLite.ISQLiteConnectionPool"/> interface only.  In theory, it
+            could be used by other classes; however, that usage is not supported.
+            </summary>
+            <param name="nativeHandle">
+            This must be a native database connection handle returned by the
+            SQLite core library and it must remain valid and open during the
+            entire duration of the calling method.
+            </param>
+            <returns>
+            The new managed database connection handle or null if it cannot be
+            created.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BackupDatabase(System.Data.SQLite.SQLiteConnection,System.String,System.String,System.Int32,System.Data.SQLite.SQLiteBackupCallback,System.Int32)">
+            <summary>
+            Backs up the database, using the specified database connection as the
+            destination.
+            </summary>
+            <param name="destination">The destination database connection.</param>
+            <param name="destinationName">The destination database name.</param>
+            <param name="sourceName">The source database name.</param>
+            <param name="pages">
+            The number of pages to copy or negative to copy all remaining pages.
+            </param>
+            <param name="callback">
+            The method to invoke between each step of the backup process.  This
+            parameter may be null (i.e. no callbacks will be performed).
+            </param>
+            <param name="retryMilliseconds">
+            The number of milliseconds to sleep after encountering a locking error
+            during the backup process.  A value less than zero means that no sleep
+            should be performed.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BindFunction(System.Data.SQLite.SQLiteFunctionAttribute,System.Data.SQLite.SQLiteFunction)">
+            <summary>
+            Attempts to bind the specified <see cref="T:System.Data.SQLite.SQLiteFunction"/> object
+            instance to this connection.
+            </summary>
+            <param name="functionAttribute">
+            The <see cref="T:System.Data.SQLite.SQLiteFunctionAttribute"/> object instance containing
+            the metadata for the function to be bound.
+            </param>
+            <param name="function">
+            The <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance that implements the
+            function to be bound.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Clone">
+            <summary>
+            Creates a clone of the connection.  All attached databases and user-defined functions are cloned.  If the existing connection is open, the cloned connection
+            will also be opened.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.CreateFile(System.String)">
+            <summary>
+            Creates a database file.  This just creates a zero-byte file which SQLite
+            will turn into a database when the file is opened properly.
+            </summary>
+            <param name="databaseFileName">The file to create</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.OnStateChange(System.Data.ConnectionState,System.Data.StateChangeEventArgs@)">
+            <summary>
+            Raises the state change event when the state of the connection changes
+            </summary>
+            <param name="newState">The new connection state.  If this is different
+            from the previous state, the <see cref="E:System.Data.SQLite.SQLiteConnection.StateChange"/> event is
+            raised.</param>
+            <param name="eventArgs">The event data created for the raised event, if
+            it was actually raised.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.GetFallbackDefaultIsolationLevel">
+            <summary>
+            Determines and returns the fallback default isolation level when one cannot be
+            obtained from an existing connection instance.
+            </summary>
+            <returns>
+            The fallback default isolation level for this connection instance -OR-
+            <see cref="F:System.Data.IsolationLevel.Unspecified"/> if it cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.GetDefaultIsolationLevel">
+            <summary>
+            Determines and returns the default isolation level for this connection instance.
+            </summary>
+            <returns>
+            The default isolation level for this connection instance -OR-
+            <see cref="F:System.Data.IsolationLevel.Unspecified"/> if it cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BeginTransaction(System.Data.IsolationLevel,System.Boolean)">
+            <summary>
+            OBSOLETE.  Creates a new SQLiteTransaction if one isn't already active on the connection.
+            </summary>
+            <param name="isolationLevel">This parameter is ignored.</param>
+            <param name="deferredLock">When TRUE, SQLite defers obtaining a write lock until a write operation is requested.
+            When FALSE, a writelock is obtained immediately.  The default is TRUE, but in a multi-threaded multi-writer
+            environment, one may instead choose to lock the database immediately to avoid any possible writer deadlock.</param>
+            <returns>Returns a SQLiteTransaction object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BeginTransaction(System.Boolean)">
+            <summary>
+            OBSOLETE.  Creates a new SQLiteTransaction if one isn't already active on the connection.
+            </summary>
+            <param name="deferredLock">When TRUE, SQLite defers obtaining a write lock until a write operation is requested.
+            When FALSE, a writelock is obtained immediately.  The default is false, but in a multi-threaded multi-writer
+            environment, one may instead choose to lock the database immediately to avoid any possible writer deadlock.</param>
+            <returns>Returns a SQLiteTransaction object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BeginTransaction(System.Data.IsolationLevel)">
+            <summary>
+            Creates a new <see cref="T:System.Data.SQLite.SQLiteTransaction"/> if one isn't already active on the connection.
+            </summary>
+            <param name="isolationLevel">Supported isolation levels are Serializable, ReadCommitted and Unspecified.</param>
+            <remarks>
+            Unspecified will use the default isolation level specified in the connection string.  If no isolation level is specified in the
+            connection string, Serializable is used.
+            Serializable transactions are the default.  In this mode, the engine gets an immediate lock on the database, and no other threads
+            may begin a transaction.  Other threads may read from the database, but not write.
+            With a ReadCommitted isolation level, locks are deferred and elevated as needed.  It is possible for multiple threads to start
+            a transaction in ReadCommitted mode, but if a thread attempts to commit a transaction while another thread
+            has a ReadCommitted lock, it may timeout or cause a deadlock on both threads until both threads' CommandTimeout's are reached.
+            </remarks>
+            <returns>Returns a SQLiteTransaction object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BeginTransaction">
+            <summary>
+            Creates a new <see cref="T:System.Data.SQLite.SQLiteTransaction"/> if one isn't already
+            active on the connection.
+            </summary>
+            <returns>Returns the new transaction object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BeginDbTransaction(System.Data.IsolationLevel)">
+            <summary>
+            Forwards to the local <see cref="M:System.Data.SQLite.SQLiteConnection.BeginTransaction(System.Data.IsolationLevel)"/> function
+            </summary>
+            <param name="isolationLevel">Supported isolation levels are Unspecified, Serializable, and ReadCommitted</param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ChangeDatabase(System.String)">
+            <summary>
+            This method is not implemented; however, the <see cref="E:System.Data.SQLite.SQLiteConnection.Changed"/>
+            event will still be raised.
+            </summary>
+            <param name="databaseName"></param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Close">
+            <summary>
+            When the database connection is closed, all commands linked to this connection are automatically reset.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ClearPool(System.Data.SQLite.SQLiteConnection)">
+            <summary>
+            Clears the connection pool associated with the connection.  Any other active connections using the same database file
+            will be discarded instead of returned to the pool when they are closed.
+            </summary>
+            <param name="connection"></param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ClearAllPools">
+            <summary>
+            Clears all connection pools.  Any active connections will be discarded instead of sent to the pool when they are closed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.CreateCommand">
+            <summary>
+            Create a new <see cref="T:System.Data.SQLite.SQLiteCommand"/> and associate it with this connection.
+            </summary>
+            <returns>Returns a new command object already assigned to this connection.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.CreateDbCommand">
+            <summary>
+            Forwards to the local <see cref="M:System.Data.SQLite.SQLiteConnection.CreateCommand"/> function.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ParseConnectionString(System.String)">
+            <summary>
+            Parses the connection string into component parts using the custom
+            connection string parser.
+            </summary>
+            <param name="connectionString">The connection string to parse</param>
+            <returns>An array of key-value pairs representing each parameter of the connection string</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ParseConnectionStringViaFramework(System.String,System.Boolean)">
+            <summary>
+            Parses a connection string using the built-in (i.e. framework provided)
+            connection string parser class and returns the key/value pairs.  An
+            exception may be thrown if the connection string is invalid or cannot be
+            parsed.  When compiled for the .NET Compact Framework, the custom
+            connection string parser is always used instead because the framework
+            provided one is unavailable there.
+            </summary>
+            <param name="connectionString">
+            The connection string to parse.
+            </param>
+            <param name="strict">
+            Non-zero to throw an exception if any connection string values are not of
+            the <see cref="T:System.String"/> type.
+            </param>
+            <returns>The list of key/value pairs.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.EnlistTransaction(System.Transactions.Transaction)">
+            <summary>
+            Manual distributed transaction enlistment support
+            </summary>
+            <param name="transaction">The distributed transaction to enlist in</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.FindKey(System.Collections.Generic.SortedList{System.String,System.String},System.String,System.String)">
+            <summary>
+            Looks for a key in the array of key/values of the parameter string.  If not found, return the specified default value
+            </summary>
+            <param name="items">The list to look in</param>
+            <param name="key">The key to find</param>
+            <param name="defValue">The default value to return if the key is not found</param>
+            <returns>The value corresponding to the specified key, or the default value if not found.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.TryParseEnum(System.Type,System.String,System.Boolean)">
+            <summary>
+            Attempts to convert the string value to an enumerated value of the specified type.
+            </summary>
+            <param name="type">The enumerated type to convert the string value to.</param>
+            <param name="value">The string value to be converted.</param>
+            <param name="ignoreCase">Non-zero to make the conversion case-insensitive.</param>
+            <returns>The enumerated value upon success or null upon error.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.TryParseByte(System.String,System.Globalization.NumberStyles,System.Byte@)">
+            <summary>
+            Attempts to convert an input string into a byte value.
+            </summary>
+            <param name="value">
+            The string value to be converted.
+            </param>
+            <param name="style">
+            The number styles to use for the conversion.
+            </param>
+            <param name="result">
+            Upon sucess, this will contain the parsed byte value.
+            Upon failure, the value of this parameter is undefined.
+            </param>
+            <returns>
+            Non-zero upon success; zero on failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.EnableExtensions(System.Boolean)">
+            <summary>
+            Enables or disabled extension loading.
+            </summary>
+            <param name="enable">
+            True to enable loading of extensions, false to disable.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.LoadExtension(System.String)">
+            <summary>
+            Loads a SQLite extension library from the named dynamic link library file.
+            </summary>
+            <param name="fileName">
+            The name of the dynamic link library file containing the extension.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.LoadExtension(System.String,System.String)">
+            <summary>
+            Loads a SQLite extension library from the named dynamic link library file.
+            </summary>
+            <param name="fileName">
+            The name of the dynamic link library file containing the extension.
+            </param>
+            <param name="procName">
+            The name of the exported function used to initialize the extension.
+            If null, the default "sqlite3_extension_init" will be used.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.CreateModule(System.Data.SQLite.SQLiteModule)">
+            <summary>
+            Creates a disposable module containing the implementation of a virtual
+            table.
+            </summary>
+            <param name="module">
+            The module object to be used when creating the disposable module.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.FromHexString(System.String)">
+            <summary>
+            Parses a string containing a sequence of zero or more hexadecimal
+            encoded byte values and returns the resulting byte array.  The
+            "0x" prefix is not allowed on the input string.
+            </summary>
+            <param name="text">
+            The input string containing zero or more hexadecimal encoded byte
+            values.
+            </param>
+            <returns>
+            A byte array containing the parsed byte values or null if an error
+            was encountered.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ToHexString(System.Byte[])">
+            <summary>
+            Creates and returns a string containing the hexadecimal encoded byte
+            values from the input array.
+            </summary>
+            <param name="array">
+            The input array of bytes.
+            </param>
+            <returns>
+            The resulting string or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.FromHexString(System.String,System.String@)">
+            <summary>
+            Parses a string containing a sequence of zero or more hexadecimal
+            encoded byte values and returns the resulting byte array.  The
+            "0x" prefix is not allowed on the input string.
+            </summary>
+            <param name="text">
+            The input string containing zero or more hexadecimal encoded byte
+            values.
+            </param>
+            <param name="error">
+            Upon failure, this will contain an appropriate error message.
+            </param>
+            <returns>
+            A byte array containing the parsed byte values or null if an error
+            was encountered.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Open">
+            <summary>
+            Opens the connection using the parameters found in the <see cref="P:System.Data.SQLite.SQLiteConnection.ConnectionString"/>.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.OpenAndReturn">
+            <summary>
+            Opens the connection using the parameters found in the <see cref="P:System.Data.SQLite.SQLiteConnection.ConnectionString"/> and then returns it.
+            </summary>
+            <returns>The current connection object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Cancel">
+            <summary>
+            This method causes any pending database operation to abort and return at
+            its earliest opportunity.  This routine is typically called in response
+            to a user action such as pressing "Cancel" or Ctrl-C where the user wants
+            a long query operation to halt immediately.  It is safe to call this
+            routine from any thread.  However, it is not safe to call this routine
+            with a database connection that is closed or might close before this method
+            returns.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.GetMemoryStatistics(System.Collections.Generic.IDictionary{System.String,System.Int64}@)">
+            <summary>
+            Returns various global memory statistics for the SQLite core library via
+            a dictionary of key/value pairs.  Currently, only the "MemoryUsed" and
+            "MemoryHighwater" keys are returned and they have values that correspond
+            to the values that could be obtained via the <see cref="P:System.Data.SQLite.SQLiteConnection.MemoryUsed"/>
+            and <see cref="P:System.Data.SQLite.SQLiteConnection.MemoryHighwater"/> connection properties.
+            </summary>
+            <param name="statistics">
+            This dictionary will be populated with the global memory statistics.  It
+            will be created if necessary.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ReleaseMemory">
+            <summary>
+            Attempts to free as much heap memory as possible for this database connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ReleaseMemory(System.Int32,System.Boolean,System.Boolean,System.Int32@,System.Boolean@,System.UInt32@)">
+            <summary>
+            Attempts to free N bytes of heap memory by deallocating non-essential memory
+            allocations held by the database library. Memory used to cache database pages
+            to improve performance is an example of non-essential memory.  This is a no-op
+            returning zero if the SQLite core library was not compiled with the compile-time
+            option SQLITE_ENABLE_MEMORY_MANAGEMENT.  Optionally, attempts to reset and/or
+            compact the Win32 native heap, if applicable.
+            </summary>
+            <param name="nBytes">
+            The requested number of bytes to free.
+            </param>
+            <param name="reset">
+            Non-zero to attempt a heap reset.
+            </param>
+            <param name="compact">
+            Non-zero to attempt heap compaction.
+            </param>
+            <param name="nFree">
+            The number of bytes actually freed.  This value may be zero.
+            </param>
+            <param name="resetOk">
+            This value will be non-zero if the heap reset was successful.
+            </param>
+            <param name="nLargest">
+            The size of the largest committed free block in the heap, in bytes.
+            This value will be zero unless heap compaction is enabled.
+            </param>
+            <returns>
+            A standard SQLite return code (i.e. zero for success and non-zero
+            for failure).
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.SetMemoryStatus(System.Boolean)">
+            <summary>
+            Sets the status of the memory usage tracking subsystem in the SQLite core library.  By default, this is enabled.
+            If this is disabled, memory usage tracking will not be performed.  This is not really a per-connection value, it is
+            global to the process.
+            </summary>
+            <param name="value">Non-zero to enable memory usage tracking, zero otherwise.</param>
+            <returns>A standard SQLite return code (i.e. zero for success and non-zero for failure).</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Shutdown">
+            <summary>
+            Passes a shutdown request to the SQLite core library.  Does not throw
+            an exception if the shutdown request fails.
+            </summary>
+            <returns>
+            A standard SQLite return code (i.e. zero for success and non-zero for
+            failure).
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Shutdown(System.Boolean,System.Boolean)">
+            <summary>
+            Passes a shutdown request to the SQLite core library.  Throws an
+            exception if the shutdown request fails and the no-throw parameter
+            is non-zero.
+            </summary>
+            <param name="directories">
+            Non-zero to reset the database and temporary directories to their
+            default values, which should be null for both.
+            </param>
+            <param name="noThrow">
+            When non-zero, throw an exception if the shutdown request fails.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.SetExtendedResultCodes(System.Boolean)">
+            Enables or disabled extended result codes returned by SQLite
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ResultCode">
+            Enables or disabled extended result codes returned by SQLite
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ExtendedResultCode">
+            Enables or disabled extended result codes returned by SQLite
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.LogMessage(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            Add a log message via the SQLite sqlite3_log interface.
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.LogMessage(System.Int32,System.String)">
+            Add a log message via the SQLite sqlite3_log interface.
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ChangePassword(System.String)">
+            <summary>
+            Change the password (or assign a password) to an open database.
+            </summary>
+            <remarks>
+            No readers or writers may be active for this process.  The database must already be open
+            and if it already was password protected, the existing password must already have been supplied.
+            </remarks>
+            <param name="newPassword">The new password to assign to the database</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ChangePassword(System.Byte[])">
+            <summary>
+            Change the password (or assign a password) to an open database.
+            </summary>
+            <remarks>
+            No readers or writers may be active for this process.  The database must already be open
+            and if it already was password protected, the existing password must already have been supplied.
+            </remarks>
+            <param name="newPassword">The new password to assign to the database</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.SetPassword(System.String)">
+            <summary>
+            Sets the password for a password-protected database.  A password-protected database is
+            unusable for any operation until the password has been set.
+            </summary>
+            <param name="databasePassword">The password for the database</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.SetPassword(System.Byte[])">
+            <summary>
+            Sets the password for a password-protected database.  A password-protected database is
+            unusable for any operation until the password has been set.
+            </summary>
+            <param name="databasePassword">The password for the database</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.SetAvRetry(System.Int32@,System.Int32@)">
+            <summary>
+            Queries or modifies the number of retries or the retry interval (in milliseconds) for
+            certain I/O operations that may fail due to anti-virus software.
+            </summary>
+            <param name="count">The number of times to retry the I/O operation.  A negative value
+            will cause the current count to be queried and replace that negative value.</param>
+            <param name="interval">The number of milliseconds to wait before retrying the I/O
+            operation.  This number is multiplied by the number of retry attempts so far to come
+            up with the final number of milliseconds to wait.  A negative value will cause the
+            current interval to be queried and replace that negative value.</param>
+            <returns>Zero for success, non-zero for error.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.UnwrapString(System.String)">
+            <summary>
+            Removes one set of surrounding single -OR- double quotes from the string
+            value and returns the resulting string value.  If the string is null, empty,
+            or contains quotes that are not balanced, nothing is done and the original
+            string value will be returned.
+            </summary>
+            <param name="value">The string value to process.</param>
+            <returns>
+            The string value, modified to remove one set of surrounding single -OR-
+            double quotes, if applicable.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ExpandFileName(System.String,System.Boolean)">
+            <summary>
+            Expand the filename of the data source, resolving the |DataDirectory|
+            macro as appropriate.
+            </summary>
+            <param name="sourceFile">The database filename to expand</param>
+            <param name="toFullPath">
+            Non-zero if the returned file name should be converted to a full path
+            (except when using the .NET Compact Framework).
+            </param>
+            <returns>The expanded path and filename of the filename</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.GetSchema">
+            <overloads>
+             The following commands are used to extract schema information out of the database.  Valid schema types are:
+             <list type="bullet">
+             <item>
+             <description>MetaDataCollections</description>
+             </item>
+             <item>
+             <description>DataSourceInformation</description>
+             </item>
+             <item>
+             <description>Catalogs</description>
+             </item>
+             <item>
+             <description>Columns</description>
+             </item>
+             <item>
+             <description>ForeignKeys</description>
+             </item>
+             <item>
+             <description>Indexes</description>
+             </item>
+             <item>
+             <description>IndexColumns</description>
+             </item>
+             <item>
+             <description>Tables</description>
+             </item>
+             <item>
+             <description>Views</description>
+             </item>
+             <item>
+             <description>ViewColumns</description>
+             </item>
+             </list>
+             </overloads>
+             <summary>
+             Returns the MetaDataCollections schema
+             </summary>
+             <returns>A DataTable of the MetaDataCollections schema</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.GetSchema(System.String)">
+            <summary>
+            Returns schema information of the specified collection
+            </summary>
+            <param name="collectionName">The schema collection to retrieve</param>
+            <returns>A DataTable of the specified collection</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.GetSchema(System.String,System.String[])">
+            <summary>
+            Retrieves schema information using the specified constraint(s) for the specified collection
+            </summary>
+            <param name="collectionName">The collection to retrieve</param>
+            <param name="restrictionValues">The restrictions to impose</param>
+            <returns>A DataTable of the specified collection</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_MetaDataCollections">
+            <summary>
+            Builds a MetaDataCollections schema datatable
+            </summary>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_DataSourceInformation">
+            <summary>
+            Builds a DataSourceInformation datatable
+            </summary>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_Columns(System.String,System.String,System.String)">
+            <summary>
+            Build a Columns schema
+            </summary>
+            <param name="strCatalog">The catalog (attached database) to query, can be null</param>
+            <param name="strTable">The table to retrieve schema information for, must not be null</param>
+            <param name="strColumn">The column to retrieve schema information for, can be null</param>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_Indexes(System.String,System.String,System.String)">
+            <summary>
+            Returns index information for the given database and catalog
+            </summary>
+            <param name="strCatalog">The catalog (attached database) to query, can be null</param>
+            <param name="strIndex">The name of the index to retrieve information for, can be null</param>
+            <param name="strTable">The table to retrieve index information for, can be null</param>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_Tables(System.String,System.String,System.String)">
+            <summary>
+            Retrieves table schema information for the database and catalog
+            </summary>
+            <param name="strCatalog">The catalog (attached database) to retrieve tables on</param>
+            <param name="strTable">The table to retrieve, can be null</param>
+            <param name="strType">The table type, can be null</param>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_Views(System.String,System.String)">
+            <summary>
+            Retrieves view schema information for the database
+            </summary>
+            <param name="strCatalog">The catalog (attached database) to retrieve views on</param>
+            <param name="strView">The view name, can be null</param>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_Catalogs(System.String)">
+            <summary>
+            Retrieves catalog (attached databases) schema information for the database
+            </summary>
+            <param name="strCatalog">The catalog to retrieve, can be null</param>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_IndexColumns(System.String,System.String,System.String,System.String)">
+            <summary>
+            Returns the base column information for indexes in a database
+            </summary>
+            <param name="strCatalog">The catalog to retrieve indexes for (can be null)</param>
+            <param name="strTable">The table to restrict index information by (can be null)</param>
+            <param name="strIndex">The index to restrict index information by (can be null)</param>
+            <param name="strColumn">The source column to restrict index information by (can be null)</param>
+            <returns>A DataTable containing the results</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_ViewColumns(System.String,System.String,System.String)">
+            <summary>
+            Returns detailed column information for a specified view
+            </summary>
+            <param name="strCatalog">The catalog to retrieve columns for (can be null)</param>
+            <param name="strView">The view to restrict column information by (can be null)</param>
+            <param name="strColumn">The source column to restrict column information by (can be null)</param>
+            <returns>A DataTable containing the results</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_ForeignKeys(System.String,System.String,System.String)">
+            <summary>
+            Retrieves foreign key information from the specified set of filters
+            </summary>
+            <param name="strCatalog">An optional catalog to restrict results on</param>
+            <param name="strTable">An optional table to restrict results on</param>
+            <param name="strKeyName">An optional foreign key name to restrict results on</param>
+            <returns>A DataTable with the results of the query</returns>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection._handlers">
+            <summary>
+            Static variable to store the connection event handlers to call.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.StateChange">
+            <summary>
+            This event is raised whenever the database is opened or closed.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.Changed">
+            <summary>
+            This event is raised when events related to the lifecycle of a
+            SQLiteConnection object occur.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.ConnectionPool">
+            <summary>
+            This property is used to obtain or set the custom connection pool
+            implementation to use, if any.  Setting this property to null will
+            cause the default connection pool implementation to be used.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.PoolCount">
+            <summary>
+            Returns the number of pool entries for the file name associated with this connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.ConnectionString">
+            <summary>
+            The connection string containing the parameters for the connection
+            </summary>
+            <remarks>
+            <list type="table">
+            <listheader>
+            <term>Parameter</term>
+            <term>Values</term>
+            <term>Required</term>
+            <term>Default</term>
+            </listheader>
+            <item>
+            <description>Data Source</description>
+            <description>
+            This may be a file name, the string ":memory:", or any supported URI (starting with SQLite 3.7.7).
+            Starting with release 1.0.86.0, in order to use more than one consecutive backslash (e.g. for a
+            UNC path), each of the adjoining backslash characters must be doubled (e.g. "\\Network\Share\test.db"
+            would become "\\\\Network\Share\test.db").
+            </description>
+            <description>Y</description>
+            <description></description>
+            </item>
+            <item>
+            <description>Version</description>
+            <description>3</description>
+            <description>N</description>
+            <description>3</description>
+            </item>
+            <item>
+            <description>UseUTF16Encoding</description>
+            <description><b>True</b><br/><b>False</b></description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>DateTimeFormat</description>
+            <description>
+            <b>Ticks</b> - Use the value of DateTime.Ticks.<br/>
+            <b>ISO8601</b> - Use the ISO-8601 format.  Uses the "yyyy-MM-dd HH:mm:ss.FFFFFFFK" format for UTC
+            DateTime values and "yyyy-MM-dd HH:mm:ss.FFFFFFF" format for local DateTime values).<br/>
+            <b>JulianDay</b> - The interval of time in days and fractions of a day since January 1, 4713 BC.<br/>
+            <b>UnixEpoch</b> - The whole number of seconds since the Unix epoch (January 1, 1970).<br/>
+            <b>InvariantCulture</b> - Any culture-independent string value that the .NET Framework can interpret as a valid DateTime.<br/>
+            <b>CurrentCulture</b> - Any string value that the .NET Framework can interpret as a valid DateTime using the current culture.</description>
+            <description>N</description>
+            <description>ISO8601</description>
+            </item>
+            <item>
+            <description>DateTimeKind</description>
+            <description><b>Unspecified</b> - Not specified as either UTC or local time.<br/><b>Utc</b> - The time represented is UTC.<br/><b>Local</b> - The time represented is local time.</description>
+            <description>N</description>
+            <description>Unspecified</description>
+            </item>
+            <item>
+            <description>DateTimeFormatString</description>
+            <description>The exact DateTime format string to use for all formatting and parsing of all DateTime
+            values for this connection.</description>
+            <description>N</description>
+            <description>null</description>
+            </item>
+            <item>
+            <description>BaseSchemaName</description>
+            <description>Some base data classes in the framework (e.g. those that build SQL queries dynamically)
+            assume that an ADO.NET provider cannot support an alternate catalog (i.e. database) without supporting
+            alternate schemas as well; however, SQLite does not fit into this model.  Therefore, this value is used
+            as a placeholder and removed prior to preparing any SQL statements that may contain it.</description>
+            <description>N</description>
+            <description>sqlite_default_schema</description>
+            </item>
+            <item>
+            <description>BinaryGUID</description>
+            <description><b>True</b> - Store GUID columns in binary form<br/><b>False</b> - Store GUID columns as text</description>
+            <description>N</description>
+            <description>True</description>
+            </item>
+            <item>
+            <description>Cache Size</description>
+            <description>{size in bytes}</description>
+            <description>N</description>
+            <description>2000</description>
+            </item>
+            <item>
+            <description>Synchronous</description>
+            <description><b>Normal</b> - Normal file flushing behavior<br/><b>Full</b> - Full flushing after all writes<br/><b>Off</b> - Underlying OS flushes I/O's</description>
+            <description>N</description>
+            <description>Full</description>
+            </item>
+            <item>
+            <description>Page Size</description>
+            <description>{size in bytes}</description>
+            <description>N</description>
+            <description>1024</description>
+            </item>
+            <item>
+            <description>Password</description>
+            <description>{password} - Using this parameter requires that the CryptoAPI based codec be enabled at compile-time for both the native interop assembly and the core managed assemblies; otherwise, using this parameter may result in an exception being thrown when attempting to open the connection.</description>
+            <description>N</description>
+            <description></description>
+            </item>
+            <item>
+            <description>HexPassword</description>
+            <description>{hexPassword} - Must contain a sequence of zero or more hexadecimal encoded byte values without a leading "0x" prefix.  Using this parameter requires that the CryptoAPI based codec be enabled at compile-time for both the native interop assembly and the core managed assemblies; otherwise, using this parameter may result in an exception being thrown when attempting to open the connection.</description>
+            <description>N</description>
+            <description></description>
+            </item>
+            <item>
+            <description>Enlist</description>
+            <description><b>Y</b> - Automatically enlist in distributed transactions<br/><b>N</b> - No automatic enlistment</description>
+            <description>N</description>
+            <description>Y</description>
+            </item>
+            <item>
+            <description>Pooling</description>
+            <description>
+            <b>True</b> - Use connection pooling.<br/>
+            <b>False</b> - Do not use connection pooling.<br/><br/>
+            <b>WARNING:</b> When using the default connection pool implementation,
+            setting this property to True should be avoided by applications that
+            make use of COM (either directly or indirectly) due to possible
+            deadlocks that can occur during the finalization of some COM objects.
+            </description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>FailIfMissing</description>
+            <description><b>True</b> - Don't create the database if it does not exist, throw an error instead<br/><b>False</b> - Automatically create the database if it does not exist</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Max Page Count</description>
+            <description>{size in pages} - Limits the maximum number of pages (limits the size) of the database</description>
+            <description>N</description>
+            <description>0</description>
+            </item>
+            <item>
+            <description>Legacy Format</description>
+            <description><b>True</b> - Use the more compatible legacy 3.x database format<br/><b>False</b> - Use the newer 3.3x database format which compresses numbers more effectively</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Default Timeout</description>
+            <description>{time in seconds}<br/>The default command timeout</description>
+            <description>N</description>
+            <description>30</description>
+            </item>
+            <item>
+            <description>Journal Mode</description>
+            <description><b>Delete</b> - Delete the journal file after a commit<br/><b>Persist</b> - Zero out and leave the journal file on disk after a commit<br/><b>Off</b> - Disable the rollback journal entirely</description>
+            <description>N</description>
+            <description>Delete</description>
+            </item>
+            <item>
+            <description>Read Only</description>
+            <description><b>True</b> - Open the database for read only access<br/><b>False</b> - Open the database for normal read/write access</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Max Pool Size</description>
+            <description>The maximum number of connections for the given connection string that can be in the connection pool</description>
+            <description>N</description>
+            <description>100</description>
+            </item>
+            <item>
+            <description>Default IsolationLevel</description>
+            <description>The default transaciton isolation level</description>
+            <description>N</description>
+            <description>Serializable</description>
+            </item>
+            <item>
+            <description>Foreign Keys</description>
+            <description>Enable foreign key constraints</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Flags</description>
+            <description>Extra behavioral flags for the connection.  See the <see cref="T:System.Data.SQLite.SQLiteConnectionFlags"/> enumeration for possible values.</description>
+            <description>N</description>
+            <description>Default</description>
+            </item>
+            <item>
+            <description>SetDefaults</description>
+            <description>
+            <b>True</b> - Apply the default connection settings to the opened database.<br/>
+            <b>False</b> - Skip applying the default connection settings to the opened database.
+            </description>
+            <description>N</description>
+            <description>True</description>
+            </item>
+            <item>
+            <description>ToFullPath</description>
+            <description>
+            <b>True</b> - Attempt to expand the data source file name to a fully qualified path before opening.<br/>
+            <b>False</b> - Skip attempting to expand the data source file name to a fully qualified path before opening.
+            </description>
+            <description>N</description>
+            <description>True</description>
+            </item>
+            </list>
+            </remarks>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.DataSource">
+            <summary>
+            Returns the data source file name without extension or path.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.Database">
+            <summary>
+            Returns the string "main".
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.DefaultTimeout">
+            <summary>
+            Gets/sets the default command timeout for newly-created commands.  This is especially useful for
+            commands used internally such as inside a SQLiteTransaction, where setting the timeout is not possible.
+            This can also be set in the ConnectionString with "Default Timeout"
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.ParseViaFramework">
+            <summary>
+            Non-zero if the built-in (i.e. framework provided) connection string
+            parser should be used when opening the connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.Flags">
+            <summary>
+            Gets/sets the extra behavioral flags for this connection.  See the
+            <see cref="T:System.Data.SQLite.SQLiteConnectionFlags"/> enumeration for a list of
+            possible values.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.OwnHandle">
+            <summary>
+            Returns non-zero if the underlying native connection handle is
+            owned by this instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.ServerVersion">
+            <summary>
+            Returns the version of the underlying SQLite database engine
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.LastInsertRowId">
+            <summary>
+            Returns the rowid of the most recent successful INSERT into the database from this connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.Changes">
+            <summary>
+            Returns the number of rows changed by the last INSERT, UPDATE, or DELETE statement executed on
+            this connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.AutoCommit">
+            <summary>
+            Returns non-zero if the given database connection is in autocommit mode.
+            Autocommit mode is on by default.  Autocommit mode is disabled by a BEGIN
+            statement.  Autocommit mode is re-enabled by a COMMIT or ROLLBACK.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.MemoryUsed">
+            <summary>
+            Returns the amount of memory (in bytes) currently in use by the SQLite core library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.MemoryHighwater">
+            <summary>
+            Returns the maximum amount of memory (in bytes) used by the SQLite core library since the high-water mark was last reset.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.DefineConstants">
+            <summary>
+            Returns a string containing the define constants (i.e. compile-time
+            options) used to compile the core managed assembly, delimited with
+            spaces.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.SQLiteVersion">
+            <summary>
+            Returns the version of the underlying SQLite core library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.SQLiteSourceId">
+            <summary>
+            This method returns the string whose value is the same as the
+            SQLITE_SOURCE_ID C preprocessor macro used when compiling the
+            SQLite core library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.InteropVersion">
+            <summary>
+            This method returns the version of the interop SQLite assembly
+            used.  If the SQLite interop assembly is not in use or the
+            necessary information cannot be obtained for any reason, a null
+            value may be returned.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.InteropSourceId">
+            <summary>
+            This method returns the string whose value contains the unique
+            identifier for the source checkout used to build the interop
+            assembly.  If the SQLite interop assembly is not in use or the
+            necessary information cannot be obtained for any reason, a null
+            value may be returned.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.ProviderVersion">
+            <summary>
+            This method returns the version of the managed components used
+            to interact with the SQLite core library.  If the necessary
+            information cannot be obtained for any reason, a null value may
+            be returned.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.ProviderSourceId">
+            <summary>
+            This method returns the string whose value contains the unique
+            identifier for the source checkout used to build the managed
+            components currently executing.  If the necessary information
+            cannot be obtained for any reason, a null value may be returned.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.State">
+            <summary>
+            Returns the state of the connection.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.Authorize">
+            <summary>
+            This event is raised whenever SQLite encounters an action covered by the
+            authorizer during query preparation.  Changing the value of the
+            <see cref="F:System.Data.SQLite.AuthorizerEventArgs.ReturnCode"/> property will determine if
+            the specific action will be allowed, ignored, or denied.  For the entire
+            duration of the event, the associated connection and statement objects
+            must not be modified, either directly or indirectly, by the called code.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.Update">
+            <summary>
+            This event is raised whenever SQLite makes an update/delete/insert into the database on
+            this connection.  It only applies to the given connection.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.Commit">
+            <summary>
+            This event is raised whenever SQLite is committing a transaction.
+            Return non-zero to trigger a rollback.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.Trace">
+            <summary>
+            This event is raised whenever SQLite statement first begins executing on
+            this connection.  It only applies to the given connection.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.RollBack">
+            <summary>
+            This event is raised whenever SQLite is rolling back a transaction.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.DbProviderFactory">
+            <summary>
+            Returns the <see cref="T:System.Data.SQLite.SQLiteFactory"/> instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SynchronizationModes">
+            <summary>
+            The I/O file cache flushing behavior for the connection
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SynchronizationModes.Normal">
+            <summary>
+            Normal file flushing at critical sections of the code
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SynchronizationModes.Full">
+            <summary>
+            Full file flushing after every write operation
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SynchronizationModes.Off">
+            <summary>
+            Use the default operating system's file flushing, SQLite does not explicitly flush the file buffers after writing
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteAuthorizerEventHandler">
+            <summary>
+            Raised when authorization is required to perform an action contained
+            within a SQL query.
+            </summary>
+            <param name="sender">The connection performing the action.</param>
+            <param name="e">A <see cref="T:System.Data.SQLite.AuthorizerEventArgs"/> that contains the
+            event data.</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteCommitHandler">
+            <summary>
+            Raised when a transaction is about to be committed.  To roll back a transaction, set the
+            rollbackTrans boolean value to true.
+            </summary>
+            <param name="sender">The connection committing the transaction</param>
+            <param name="e">Event arguments on the transaction</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteUpdateEventHandler">
+            <summary>
+            Raised when data is inserted, updated and deleted on a given connection
+            </summary>
+            <param name="sender">The connection committing the transaction</param>
+            <param name="e">The event parameters which triggered the event</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteTraceEventHandler">
+            <summary>
+            Raised when a statement first begins executing on a given connection
+            </summary>
+            <param name="sender">The connection executing the statement</param>
+            <param name="e">Event arguments of the trace</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteBackupCallback">
+            <summary>
+            Raised between each backup step.
+            </summary>
+            <param name="source">
+            The source database connection.
+            </param>
+            <param name="sourceName">
+            The source database name.
+            </param>
+            <param name="destination">
+            The destination database connection.
+            </param>
+            <param name="destinationName">
+            The destination database name.
+            </param>
+            <param name="pages">
+            The number of pages copied with each step.
+            </param>
+            <param name="remainingPages">
+            The number of pages remaining to be copied.
+            </param>
+            <param name="totalPages">
+            The total number of pages in the source database.
+            </param>
+            <param name="retry">
+            Set to true if the operation needs to be retried due to database
+            locking issues; otherwise, set to false.
+            </param>
+            <returns>
+            True to continue with the backup process or false to halt the backup
+            process, rolling back any changes that have been made so far.
+            </returns>
+        </member>
+        <member name="T:System.Data.SQLite.AuthorizerEventArgs">
+            <summary>
+            The data associated with a call into the authorizer.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.UserData">
+            <summary>
+            The user-defined native data associated with this event.  Currently,
+            this will always contain the value of <see cref="F:System.IntPtr.Zero"/>.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.ActionCode">
+            <summary>
+            The action code responsible for the current call into the authorizer.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.Argument1">
+            <summary>
+            The first string argument for the current call into the authorizer.
+            The exact value will vary based on the action code, see the
+            <see cref="T:System.Data.SQLite.SQLiteAuthorizerActionCode"/> enumeration for possible
+            values.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.Argument2">
+            <summary>
+            The second string argument for the current call into the authorizer.
+            The exact value will vary based on the action code, see the
+            <see cref="T:System.Data.SQLite.SQLiteAuthorizerActionCode"/> enumeration for possible
+            values.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.Database">
+            <summary>
+            The database name for the current call into the authorizer, if
+            applicable.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.Context">
+            <summary>
+            The name of the inner-most trigger or view that is responsible for
+            the access attempt or a null value if this access attempt is directly
+            from top-level SQL code.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.ReturnCode">
+            <summary>
+            The return code for the current call into the authorizer.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.AuthorizerEventArgs.#ctor">
+            <summary>
+            Constructs an instance of this class with default property values.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.AuthorizerEventArgs.#ctor(System.IntPtr,System.Data.SQLite.SQLiteAuthorizerActionCode,System.String,System.String,System.String,System.String,System.Data.SQLite.SQLiteAuthorizerReturnCode)">
+            <summary>
+            Constructs an instance of this class with specific property values.
+            </summary>
+            <param name="pUserData">
+            The user-defined native data associated with this event.
+            </param>
+            <param name="actionCode">
+            The authorizer action code.
+            </param>
+            <param name="argument1">
+            The first authorizer argument.
+            </param>
+            <param name="argument2">
+            The second authorizer argument.
+            </param>
+            <param name="database">
+            The database name, if applicable.
+            </param>
+            <param name="context">
+            The name of the inner-most trigger or view that is responsible for
+            the access attempt or a null value if this access attempt is directly
+            from top-level SQL code.
+            </param>
+            <param name="returnCode">
+            The authorizer return code.
+            </param>
+        </member>
+        <member name="T:System.Data.SQLite.UpdateEventType">
+            <summary>
+            Whenever an update event is triggered on a connection, this enum will indicate
+            exactly what type of operation is being performed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventType.Delete">
+            <summary>
+            A row is being deleted from the given database and table
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventType.Insert">
+            <summary>
+            A row is being inserted into the table.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventType.Update">
+            <summary>
+            A row is being updated in the table.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.UpdateEventArgs">
+            <summary>
+            Passed during an Update callback, these event arguments detail the type of update operation being performed
+            on the given connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventArgs.Database">
+            <summary>
+            The name of the database being updated (usually "main" but can be any attached or temporary database)
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventArgs.Table">
+            <summary>
+            The name of the table being updated
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventArgs.Event">
+            <summary>
+            The type of update being performed (insert/update/delete)
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventArgs.RowId">
+            <summary>
+            The RowId affected by this update.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.CommitEventArgs">
+            <summary>
+            Event arguments raised when a transaction is being committed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CommitEventArgs.AbortTransaction">
+            <summary>
+            Set to true to abort the transaction and trigger a rollback
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.TraceEventArgs">
+            <summary>
+            Passed during an Trace callback, these event arguments contain the UTF-8 rendering of the SQL statement text
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TraceEventArgs.Statement">
+            <summary>
+            SQL statement text as the statement first begins executing
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.ISQLiteConnectionPool">
+            <summary>
+            This interface represents a custom connection pool implementation
+            usable by System.Data.SQLite.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteConnectionPool.GetCounts(System.String,System.Collections.Generic.Dictionary{System.String,System.Int32}@,System.Int32@,System.Int32@,System.Int32@)">
+            <summary>
+            Counts the number of pool entries matching the specified file name.
+            </summary>
+            <param name="fileName">
+            The file name to match or null to match all files.
+            </param>
+            <param name="counts">
+            The pool entry counts for each matching file.
+            </param>
+            <param name="openCount">
+            The total number of connections successfully opened from any pool.
+            </param>
+            <param name="closeCount">
+            The total number of connections successfully closed from any pool.
+            </param>
+            <param name="totalCount">
+            The total number of pool entries for all matching files.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteConnectionPool.ClearPool(System.String)">
+            <summary>
+            Disposes of all pooled connections associated with the specified
+            database file name.
+            </summary>
+            <param name="fileName">
+            The database file name.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteConnectionPool.ClearAllPools">
+            <summary>
+            Disposes of all pooled connections.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteConnectionPool.Add(System.String,System.Object,System.Int32)">
+            <summary>
+            Adds a connection to the pool of those associated with the
+            specified database file name.
+            </summary>
+            <param name="fileName">
+            The database file name.
+            </param>
+            <param name="handle">
+            The database connection handle.
+            </param>
+            <param name="version">
+            The connection pool version at the point the database connection
+            handle was received from the connection pool.  This is also the
+            connection pool version that the database connection handle was
+            created under.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteConnectionPool.Remove(System.String,System.Int32,System.Int32@)">
+            <summary>
+            Removes a connection from the pool of those associated with the
+            specified database file name with the intent of using it to
+            interact with the database.
+            </summary>
+            <param name="fileName">
+            The database file name.
+            </param>
+            <param name="maxPoolSize">
+            The new maximum size of the connection pool for the specified
+            database file name.
+            </param>
+            <param name="version">
+            The connection pool version associated with the returned database
+            connection handle, if any.
+            </param>
+            <returns>
+            The database connection handle associated with the specified
+            database file name or null if it cannot be obtained.
+            </returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnectionPool">
+            <summary>
+            This default method implementations in this class should not be used by
+            applications that make use of COM (either directly or indirectly) due
+            to possible deadlocks that can occur during finalization of some COM
+            objects.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool._syncRoot">
+            <summary>
+            This field is used to synchronize access to the private static data
+            in this class.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool._connectionPool">
+            <summary>
+            When this field is non-null, it will be used to provide the
+            implementation of all the connection pool methods; otherwise,
+            the default method implementations will be used.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool._queueList">
+            <summary>
+            The dictionary of connection pools, based on the normalized file
+            name of the SQLite database.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool._poolVersion">
+            <summary>
+            The default version number new pools will get.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool._poolOpened">
+            <summary>
+            The number of connections successfully opened from any pool.
+            This value is incremented by the Remove method.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool._poolClosed">
+            <summary>
+            The number of connections successfully closed from any pool.
+            This value is incremented by the Add method.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.GetCounts(System.String,System.Collections.Generic.Dictionary{System.String,System.Int32}@,System.Int32@,System.Int32@,System.Int32@)">
+            <summary>
+            Counts the number of pool entries matching the specified file name.
+            </summary>
+            <param name="fileName">
+            The file name to match or null to match all files.
+            </param>
+            <param name="counts">
+            The pool entry counts for each matching file.
+            </param>
+            <param name="openCount">
+            The total number of connections successfully opened from any pool.
+            </param>
+            <param name="closeCount">
+            The total number of connections successfully closed from any pool.
+            </param>
+            <param name="totalCount">
+            The total number of pool entries for all matching files.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.ClearPool(System.String)">
+            <summary>
+            Disposes of all pooled connections associated with the specified
+            database file name.
+            </summary>
+            <param name="fileName">
+            The database file name.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.ClearAllPools">
+            <summary>
+            Disposes of all pooled connections.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.Add(System.String,System.Data.SQLite.SQLiteConnectionHandle,System.Int32)">
+            <summary>
+            Adds a connection to the pool of those associated with the
+            specified database file name.
+            </summary>
+            <param name="fileName">
+            The database file name.
+            </param>
+            <param name="handle">
+            The database connection handle.
+            </param>
+            <param name="version">
+            The connection pool version at the point the database connection
+            handle was received from the connection pool.  This is also the
+            connection pool version that the database connection handle was
+            created under.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.Remove(System.String,System.Int32,System.Int32@)">
+            <summary>
+            Removes a connection from the pool of those associated with the
+            specified database file name with the intent of using it to
+            interact with the database.
+            </summary>
+            <param name="fileName">
+            The database file name.
+            </param>
+            <param name="maxPoolSize">
+            The new maximum size of the connection pool for the specified
+            database file name.
+            </param>
+            <param name="version">
+            The connection pool version associated with the returned database
+            connection handle, if any.
+            </param>
+            <returns>
+            The database connection handle associated with the specified
+            database file name or null if it cannot be obtained.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.GetConnectionPool">
+            <summary>
+            This method is used to obtain a reference to the custom connection
+            pool implementation currently in use, if any.
+            </summary>
+            <returns>
+            The custom connection pool implementation or null if the default
+            connection pool implementation should be used.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.SetConnectionPool(System.Data.SQLite.ISQLiteConnectionPool)">
+            <summary>
+            This method is used to set the reference to the custom connection
+            pool implementation to use, if any.
+            </summary>
+            <param name="connectionPool">
+            The custom connection pool implementation to use or null if the
+            default connection pool implementation should be used.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.ResizePool(System.Data.SQLite.SQLiteConnectionPool.PoolQueue,System.Boolean)">
+            <summary>
+            We do not have to thread-lock anything in this function, because it
+            is only called by other functions above which already take the lock.
+            </summary>
+            <param name="queue">
+            The pool queue to resize.
+            </param>
+            <param name="add">
+            If a function intends to add to the pool, this is true, which
+            forces the resize to take one more than it needs from the pool.
+            </param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnectionPool.PoolQueue">
+            <summary>
+            Keeps track of connections made on a specified file.  The PoolVersion
+            dictates whether old objects get returned to the pool or discarded
+            when no longer in use.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool.PoolQueue.Queue">
+            <summary>
+            The queue of weak references to the actual database connection
+            handles.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool.PoolQueue.PoolVersion">
+            <summary>
+            This pool version associated with the database connection
+            handles in this pool queue.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool.PoolQueue.MaxPoolSize">
+            <summary>
+            The maximum size of this pool queue.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.PoolQueue.#ctor(System.Int32,System.Int32)">
+            <summary>
+            Constructs a connection pool queue using the specified version
+            and maximum size.  Normally, all the database connection
+            handles in this pool are associated with a single database file
+            name.
+            </summary>
+            <param name="version">
+            The initial pool version for this connection pool queue.
+            </param>
+            <param name="maxSize">
+            The initial maximum size for this connection pool queue.
+            </param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnectionStringBuilder">
+            <summary>
+            SQLite implementation of DbConnectionStringBuilder.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionStringBuilder._properties">
+            <summary>
+            Properties of this class
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionStringBuilder.#ctor">
+            <overloads>
+            Constructs a new instance of the class
+            </overloads>
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionStringBuilder.#ctor(System.String)">
+            <summary>
+            Constructs a new instance of the class using the specified connection string.
+            </summary>
+            <param name="connectionString">The connection string to parse</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionStringBuilder.Initialize(System.String)">
+            <summary>
+            Private initializer, which assigns the connection string and resets the builder
+            </summary>
+            <param name="cnnString">The connection string to assign</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionStringBuilder.TryGetValue(System.String,System.Object@)">
+            <summary>
+            Helper function for retrieving values from the connectionstring
+            </summary>
+            <param name="keyword">The keyword to retrieve settings for</param>
+            <param name="value">The resulting parameter value</param>
+            <returns>Returns true if the value was found and returned</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionStringBuilder.FallbackGetProperties(System.Collections.Hashtable)">
+            <summary>
+            Fallback method for MONO, which doesn't implement DbConnectionStringBuilder.GetProperties()
+            </summary>
+            <param name="propertyList">The hashtable to fill with property descriptors</param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.Version">
+            <summary>
+            Gets/Sets the default version of the SQLite engine to instantiate.  Currently the only valid value is 3, indicating version 3 of the sqlite library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.SyncMode">
+            <summary>
+            Gets/Sets the synchronization mode (file flushing) of the connection string.  Default is "Normal".
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.UseUTF16Encoding">
+            <summary>
+            Gets/Sets the encoding for the connection string.  The default is "False" which indicates UTF-8 encoding.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.Pooling">
+            <summary>
+            Gets/Sets whether or not to use connection pooling.  The default is "False"
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.BinaryGUID">
+            <summary>
+            Gets/Sets whethor not to store GUID's in binary format.  The default is True
+            which saves space in the database.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.DataSource">
+            <summary>
+            Gets/Sets the filename to open on the connection string.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.Uri">
+            <summary>
+            An alternate to the data source property
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.FullUri">
+            <summary>
+            An alternate to the data source property that uses the SQLite URI syntax.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.DefaultTimeout">
+            <summary>
+            Gets/sets the default command timeout for newly-created commands.  This is especially useful for 
+            commands used internally such as inside a SQLiteTransaction, where setting the timeout is not possible.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.Enlist">
+            <summary>
+            Determines whether or not the connection will automatically participate
+            in the current distributed transaction (if one exists)
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.FailIfMissing">
+            <summary>
+            If set to true, will throw an exception if the database specified in the connection
+            string does not exist.  If false, the database will be created automatically.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.LegacyFormat">
+            <summary>
+            If enabled, uses the legacy 3.xx format for maximum compatibility, but results in larger
+            database sizes.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.ReadOnly">
+            <summary>
+            When enabled, the database will be opened for read-only access and writing will be disabled.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.Password">
+            <summary>
+            Gets/sets the database encryption password
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.HexPassword">
+            <summary>
+            Gets/sets the database encryption hexadecimal password
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.PageSize">
+            <summary>
+            Gets/Sets the page size for the connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.MaxPageCount">
+            <summary>
+            Gets/Sets the maximum number of pages the database may hold
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.CacheSize">
+            <summary>
+            Gets/Sets the cache size for the connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.DateTimeFormat">
+            <summary>
+            Gets/Sets the DateTime format for the connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.DateTimeKind">
+            <summary>
+            Gets/Sets the DateTime kind for the connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.DateTimeFormatString">
+            <summary>
+            Gets/sets the DateTime format string used for formatting
+            and parsing purposes.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.BaseSchemaName">
+            <summary>
+            Gets/Sets the placeholder base schema name used for
+            .NET Framework compatibility purposes.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.JournalMode">
+            <summary>
+            Determines how SQLite handles the transaction journal file.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.DefaultIsolationLevel">
+            <summary>
+            Sets the default isolation level for transactions on the connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.ForeignKeys">
+            <summary>
+            If enabled, use foreign key constraints
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.Flags">
+            <summary>
+            Gets/Sets the extra behavioral flags.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.SetDefaults">
+            <summary>
+            If enabled, apply the default connection settings to opened databases.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.ToFullPath">
+            <summary>
+            If enabled, attempt to resolve the provided data source file name to a
+            full path before opening.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.TypeAffinity">
+            <summary>
+            SQLite has very limited types, and is inherently text-based.  The first 5 types below represent the sum of all types SQLite
+            understands.  The DateTime extension to the spec is for internal use only.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.Uninitialized">
+            <summary>
+            Not used
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.Int64">
+            <summary>
+            All integers in SQLite default to Int64
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.Double">
+            <summary>
+            All floating point numbers in SQLite default to double
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.Text">
+            <summary>
+            The default data type of SQLite is text
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.Blob">
+            <summary>
+            Typically blob types are only seen when returned from a function
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.Null">
+            <summary>
+            Null types can be returned from functions
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.DateTime">
+            <summary>
+            Used internally by this provider
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.None">
+            <summary>
+            Used internally by this provider
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnectionEventType">
+            <summary>
+            These are the event types associated with the
+            <see cref="T:System.Data.SQLite.SQLiteConnectionEventHandler"/>
+            delegate (and its corresponding event) and the
+            <see cref="T:System.Data.SQLite.ConnectionEventArgs"/> class.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.Invalid">
+            <summary>
+            Not used.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.Unknown">
+            <summary>
+            Not used.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.Opening">
+            <summary>
+            The connection is being opened.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.ConnectionString">
+            <summary>
+            The connection string has been parsed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.Opened">
+            <summary>
+            The connection was opened.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.ChangeDatabase">
+            <summary>
+            The <see cref="F:System.Data.SQLite.SQLiteConnectionEventType.ChangeDatabase"/> method was called on the
+            connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.NewTransaction">
+            <summary>
+            A transaction was created using the connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.EnlistTransaction">
+            <summary>
+            The connection was enlisted into a transaction.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.NewCommand">
+            <summary>
+            A command was created using the connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.NewDataReader">
+            <summary>
+            A data reader was created using the connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.NewCriticalHandle">
+            <summary>
+            An instance of a <see cref="T:System.Runtime.InteropServices.CriticalHandle"/> derived class has
+            been created to wrap a native resource.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.Closing">
+            <summary>
+            The connection is being closed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.Closed">
+            <summary>
+            The connection was closed.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteDateFormats">
+             <summary>
+             This implementation of SQLite for ADO.NET can process date/time fields in
+             databases in one of six formats.
+             </summary>
+             <remarks>
+             ISO8601 format is more compatible, readable, fully-processable, but less
+             accurate as it does not provide time down to fractions of a second.
+             JulianDay is the numeric format the SQLite uses internally and is arguably
+             the most compatible with 3rd party tools.  It is not readable as text
+             without post-processing.  Ticks less compatible with 3rd party tools that
+             query the database, and renders the DateTime field unreadable as text
+             without post-processing.  UnixEpoch is more compatible with Unix systems.
+             InvariantCulture allows the configured format for the invariant culture
+             format to be used and is human readable.  CurrentCulture allows the
+             configured format for the current culture to be used and is also human
+             readable.
+            
+             The preferred order of choosing a DateTime format is JulianDay, ISO8601,
+             and then Ticks.  Ticks is mainly present for legacy code support.
+             </remarks>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.Ticks">
+            <summary>
+            Use the value of DateTime.Ticks.  This value is not recommended and is not well supported with LINQ.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.ISO8601">
+            <summary>
+            Use the ISO-8601 format.  Uses the "yyyy-MM-dd HH:mm:ss.FFFFFFFK" format for UTC DateTime values and
+            "yyyy-MM-dd HH:mm:ss.FFFFFFF" format for local DateTime values).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.JulianDay">
+            <summary>
+            The interval of time in days and fractions of a day since January 1, 4713 BC.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.UnixEpoch">
+            <summary>
+            The whole number of seconds since the Unix epoch (January 1, 1970).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.InvariantCulture">
+            <summary>
+            Any culture-independent string value that the .NET Framework can interpret as a valid DateTime.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.CurrentCulture">
+            <summary>
+            Any string value that the .NET Framework can interpret as a valid DateTime using the current culture.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.Default">
+            <summary>
+            The default format for this provider.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteJournalModeEnum">
+             <summary>
+             This enum determines how SQLite treats its journal file.
+             </summary>
+             <remarks>
+             By default SQLite will create and delete the journal file when needed during a transaction.
+             However, for some computers running certain filesystem monitoring tools, the rapid
+             creation and deletion of the journal file can cause those programs to fail, or to interfere with SQLite.
+            
+             If a program or virus scanner is interfering with SQLite's journal file, you may receive errors like "unable to open database file"
+             when starting a transaction.  If this is happening, you may want to change the default journal mode to Persist.
+             </remarks>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Default">
+            <summary>
+            The default mode, this causes SQLite to use the existing journaling mode for the database.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Delete">
+            <summary>
+            SQLite will create and destroy the journal file as-needed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Persist">
+            <summary>
+            When this is set, SQLite will keep the journal file even after a transaction has completed.  It's contents will be erased,
+            and the journal re-used as often as needed.  If it is deleted, it will be recreated the next time it is needed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Off">
+            <summary>
+            This option disables the rollback journal entirely.  Interrupted transactions or a program crash can cause database
+            corruption in this mode!
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Truncate">
+            <summary>
+            SQLite will truncate the journal file to zero-length instead of deleting it.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Memory">
+            <summary>
+            SQLite will store the journal in volatile RAM.  This saves disk I/O but at the expense of database safety and integrity.
+            If the application using SQLite crashes in the middle of a transaction when the MEMORY journaling mode is set, then the
+            database file will very likely go corrupt.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Wal">
+            <summary>
+            SQLite uses a write-ahead log instead of a rollback journal to implement transactions.  The WAL journaling mode is persistent;
+            after being set it stays in effect across multiple database connections and after closing and reopening the database. A database
+            in WAL journaling mode can only be accessed by SQLite version 3.7.0 or later.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteSynchronousEnum">
+            <summary>
+            Possible values for the "synchronous" database setting.  This setting determines
+            how often the database engine calls the xSync method of the VFS.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteSynchronousEnum.Default">
+            <summary>
+            Use the default "synchronous" database setting.  Currently, this should be
+            the same as using the FULL mode.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteSynchronousEnum.Off">
+            <summary>
+            The database engine continues without syncing as soon as it has handed
+            data off to the operating system.  If the application running SQLite
+            crashes, the data will be safe, but the database might become corrupted
+            if the operating system crashes or the computer loses power before that
+            data has been written to the disk surface.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteSynchronousEnum.Normal">
+            <summary>
+            The database engine will still sync at the most critical moments, but
+            less often than in FULL mode.  There is a very small (though non-zero)
+            chance that a power failure at just the wrong time could corrupt the
+            database in NORMAL mode.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteSynchronousEnum.Full">
+            <summary>
+            The database engine will use the xSync method of the VFS to ensure that
+            all content is safely written to the disk surface prior to continuing.
+            This ensures that an operating system crash or power failure will not
+            corrupt the database.  FULL synchronous is very safe, but it is also
+            slower.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteExecuteType">
+            <summary>
+            The requested command execution type.  This controls which method of the
+            <see cref="T:System.Data.SQLite.SQLiteCommand"/> object will be called.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteExecuteType.None">
+            <summary>
+            Do nothing.  No method will be called.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteExecuteType.NonQuery">
+            <summary>
+            The command is not expected to return a result -OR- the result is not
+            needed.  The <see cref="M:System.Data.SQLite.SQLiteCommand.ExecuteNonQuery"/> or
+            <see cref="M:System.Data.SQLite.SQLiteCommand.ExecuteNonQuery(System.Data.CommandBehavior)"/>  method
+            will be called.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteExecuteType.Scalar">
+            <summary>
+            The command is expected to return a scalar result -OR- the result should
+            be limited to a scalar result.  The <see cref="M:System.Data.SQLite.SQLiteCommand.ExecuteScalar"/>
+            or <see cref="M:System.Data.SQLite.SQLiteCommand.ExecuteScalar(System.Data.CommandBehavior)"/> method will
+            be called.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteExecuteType.Reader">
+            <summary>
+            The command is expected to return <see cref="T:System.Data.SQLite.SQLiteDataReader"/> result.
+            The <see cref="M:System.Data.SQLite.SQLiteCommand.ExecuteReader"/> or
+            <see cref="M:System.Data.SQLite.SQLiteCommand.ExecuteReader(System.Data.CommandBehavior)"/> method will
+            be called.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteExecuteType.Default">
+            <summary>
+            Use the default command execution type.  Using this value is the same
+            as using the <see cref="F:System.Data.SQLite.SQLiteExecuteType.NonQuery"/> value.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteAuthorizerActionCode">
+            <summary>
+            The action code responsible for the current call into the authorizer.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.None">
+            <summary>
+            No action is being performed.  This value should not be used from
+            external code.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Copy">
+            <summary>
+            No longer used.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateIndex">
+            <summary>
+            An index will be created.  The action-specific arguments are the
+            index name and the table name.
+            
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTable">
+            <summary>
+            A table will be created.  The action-specific arguments are the
+            table name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTempIndex">
+            <summary>
+            A temporary index will be created.  The action-specific arguments
+            are the index name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTempTable">
+            <summary>
+            A temporary table will be created.  The action-specific arguments
+            are the table name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTempTrigger">
+            <summary>
+            A temporary trigger will be created.  The action-specific arguments
+            are the trigger name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTempView">
+            <summary>
+            A temporary view will be created.  The action-specific arguments are
+            the view name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTrigger">
+            <summary>
+            A trigger will be created.  The action-specific arguments are the
+            trigger name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateView">
+            <summary>
+            A view will be created.  The action-specific arguments are the view
+            name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Delete">
+            <summary>
+            A DELETE statement will be executed.  The action-specific arguments
+            are the table name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropIndex">
+            <summary>
+            An index will be dropped.  The action-specific arguments are the
+            index name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTable">
+            <summary>
+            A table will be dropped.  The action-specific arguments are the tables
+            name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTempIndex">
+            <summary>
+            A temporary index will be dropped.  The action-specific arguments are
+            the index name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTempTable">
+            <summary>
+            A temporary table will be dropped.  The action-specific arguments are
+            the table name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTempTrigger">
+            <summary>
+            A temporary trigger will be dropped.  The action-specific arguments
+            are the trigger name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTempView">
+            <summary>
+            A temporary view will be dropped.  The action-specific arguments are
+            the view name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTrigger">
+            <summary>
+            A trigger will be dropped.  The action-specific arguments are the
+            trigger name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropView">
+            <summary>
+            A view will be dropped.  The action-specific arguments are the view
+            name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Insert">
+            <summary>
+            An INSERT statement will be executed.  The action-specific arguments
+            are the table name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Pragma">
+            <summary>
+            A PRAGMA statement will be executed.  The action-specific arguments
+            are the name of the PRAGMA and the new value or a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Read">
+            <summary>
+            A table column will be read.  The action-specific arguments are the
+            table name and the column name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Select">
+            <summary>
+            A SELECT statement will be executed.  The action-specific arguments
+            are both null values.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Transaction">
+            <summary>
+            A transaction will be started, committed, or rolled back.  The
+            action-specific arguments are the name of the operation (BEGIN,
+            COMMIT, or ROLLBACK) and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Update">
+            <summary>
+            An UPDATE statement will be executed.  The action-specific arguments
+            are the table name and the column name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Attach">
+            <summary>
+            A database will be attached to the connection.  The action-specific
+            arguments are the database file name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Detach">
+            <summary>
+            A database will be detached from the connection.  The action-specific
+            arguments are the database name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.AlterTable">
+            <summary>
+            The schema of a table will be altered.  The action-specific arguments
+            are the database name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Reindex">
+            <summary>
+            An index will be deleted and then recreated.  The action-specific
+            arguments are the index name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Analyze">
+            <summary>
+            A table will be analyzed to gathers statistics about it.  The
+            action-specific arguments are the table name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateVtable">
+            <summary>
+            A virtual table will be created.  The action-specific arguments are
+            the table name and the module name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropVtable">
+            <summary>
+            A virtual table will be dropped.  The action-specific arguments are
+            the table name and the module name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Function">
+            <summary>
+            A SQL function will be called.  The action-specific arguments are a
+            null value and the function name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Savepoint">
+            <summary>
+            A savepoint will be created, released, or rolled back.  The
+            action-specific arguments are the name of the operation (BEGIN,
+            RELEASE, or ROLLBACK) and the savepoint name.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteAuthorizerReturnCode">
+            <summary>
+            The return code for the current call into the authorizer.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerReturnCode.Ok">
+            <summary>
+            The action will be allowed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerReturnCode.Deny">
+            <summary>
+            The overall action will be disallowed and an error message will be
+            returned from the query preparation method.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerReturnCode.Ignore">
+            <summary>
+            The specific action will be disallowed; however, the overall action
+            will continue.  The exact effects of this return code vary depending
+            on the specific action, please refer to the SQLite core library
+            documentation for futher details.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteType">
+            <summary>
+            Class used internally to determine the datatype of a column in a resultset
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteType.Type">
+            <summary>
+            The DbType of the column, or DbType.Object if it cannot be determined
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteType.Affinity">
+            <summary>
+            The affinity of a column, used for expressions or when Type is DbType.Object
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteDataAdapter">
+            <summary>
+            SQLite implementation of DbDataAdapter.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.#ctor">
+            <overloads>
+            This class is just a shell around the DbDataAdapter.  Nothing from
+            DbDataAdapter is overridden here, just a few constructors are defined.
+            </overloads>
+            <summary>
+            Default constructor.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.#ctor(System.Data.SQLite.SQLiteCommand)">
+            <summary>
+            Constructs a data adapter using the specified select command.
+            </summary>
+            <param name="cmd">
+            The select command to associate with the adapter.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.#ctor(System.String,System.Data.SQLite.SQLiteConnection)">
+            <summary>
+            Constructs a data adapter with the supplied select command text and
+            associated with the specified connection.
+            </summary>
+            <param name="commandText">
+            The select command text to associate with the data adapter.
+            </param>
+            <param name="connection">
+            The connection to associate with the select command.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.#ctor(System.String,System.String)">
+            <summary>
+            Constructs a data adapter with the specified select command text,
+            and using the specified database connection string.
+            </summary>
+            <param name="commandText">
+            The select command text to use to construct a select command.
+            </param>
+            <param name="connectionString">
+            A connection string suitable for passing to a new SQLiteConnection,
+            which is associated with the select command.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.#ctor(System.String,System.String,System.Boolean)">
+            <summary>
+            Constructs a data adapter with the specified select command text,
+            and using the specified database connection string.
+            </summary>
+            <param name="commandText">
+            The select command text to use to construct a select command.
+            </param>
+            <param name="connectionString">
+            A connection string suitable for passing to a new SQLiteConnection,
+            which is associated with the select command.
+            </param>
+            <param name="parseViaFramework">
+            Non-zero to parse the connection string using the built-in (i.e.
+            framework provided) parser when opening the connection.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.OnRowUpdating(System.Data.Common.RowUpdatingEventArgs)">
+            <summary>
+            Raised by the underlying DbDataAdapter when a row is being updated
+            </summary>
+            <param name="value">The event's specifics</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.OnRowUpdated(System.Data.Common.RowUpdatedEventArgs)">
+            <summary>
+            Raised by DbDataAdapter after a row is updated
+            </summary>
+            <param name="value">The event's specifics</param>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteDataAdapter.RowUpdating">
+            <summary>
+            Row updating event handler
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteDataAdapter.RowUpdated">
+            <summary>
+            Row updated event handler
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataAdapter.SelectCommand">
+            <summary>
+            Gets/sets the select command for this DataAdapter
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataAdapter.InsertCommand">
+            <summary>
+            Gets/sets the insert command for this DataAdapter
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataAdapter.UpdateCommand">
+            <summary>
+            Gets/sets the update command for this DataAdapter
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataAdapter.DeleteCommand">
+            <summary>
+            Gets/sets the delete command for this DataAdapter
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteDataReader">
+            <summary>
+            SQLite implementation of DbDataReader.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._command">
+            <summary>
+            Underlying command this reader is attached to
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._activeStatementIndex">
+            <summary>
+            Index of the current statement in the command being processed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._activeStatement">
+            <summary>
+            Current statement being Read()
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._readingState">
+            <summary>
+            State of the current statement being processed.
+            -1 = First Step() executed, so the first Read() will be ignored
+             0 = Actively reading
+             1 = Finished reading
+             2 = Non-row-returning statement, no records
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._rowsAffected">
+            <summary>
+            Number of records affected by the insert/update statements executed on the command
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._fieldCount">
+            <summary>
+            Count of fields (columns) in the row-returning statement currently being processed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._fieldIndexes">
+            <summary>
+            Maps the field (column) names to their corresponding indexes within the results.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._fieldTypeArray">
+            <summary>
+            Datatypes of active fields (columns) in the current statement, used for type-restricting data
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._commandBehavior">
+            <summary>
+            The behavior of the datareader
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._disposeCommand">
+            <summary>
+            If set, then dispose of the command object when the reader is finished
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._throwOnDisposed">
+            <summary>
+            If set, then raise an exception when the object is accessed after being disposed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._keyInfo">
+            <summary>
+            An array of rowid's for the active statement if CommandBehavior.KeyInfo is specified
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._version">
+            <summary>
+            Matches the version of the connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._baseSchemaName">
+            <summary>
+            The "stub" (i.e. placeholder) base schema name to use when returning
+            column schema information.  Matches the base schema name used by the
+            associated connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.#ctor(System.Data.SQLite.SQLiteCommand,System.Data.CommandBehavior)">
+            <summary>
+            Internal constructor, initializes the datareader and sets up to begin executing statements
+            </summary>
+            <param name="cmd">The SQLiteCommand this data reader is for</param>
+            <param name="behave">The expected behavior of the data reader</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.Dispose(System.Boolean)">
+            <summary>
+            Dispose of all resources used by this datareader.
+            </summary>
+            <param name="disposing"></param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.Close">
+            <summary>
+            Closes the datareader, potentially closing the connection as well if CommandBehavior.CloseConnection was specified.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.CheckClosed">
+            <summary>
+            Throw an error if the datareader is closed
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.CheckValidRow">
+            <summary>
+            Throw an error if a row is not loaded
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetEnumerator">
+            <summary>
+            Enumerator support
+            </summary>
+            <returns>Returns a DbEnumerator object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.VerifyType(System.Int32,System.Data.DbType)">
+             <summary>
+             SQLite is inherently un-typed.  All datatypes in SQLite are natively strings.  The definition of the columns of a table
+             and the affinity of returned types are all we have to go on to type-restrict data in the reader.
+            
+             This function attempts to verify that the type of data being requested of a column matches the datatype of the column.  In
+             the case of columns that are not backed into a table definition, we attempt to match up the affinity of a column (int, double, string or blob)
+             to a set of known types that closely match that affinity.  It's not an exact science, but its the best we can do.
+             </summary>
+             <returns>
+             This function throws an InvalidTypeCast() exception if the requested type doesn't match the column's definition or affinity.
+             </returns>
+             <param name="i">The index of the column to type-check</param>
+             <param name="typ">The type we want to get out of the column</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetBoolean(System.Int32)">
+            <summary>
+            Retrieves the column as a boolean value
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>bool</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetByte(System.Int32)">
+            <summary>
+            Retrieves the column as a single byte value
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>byte</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetBytes(System.Int32,System.Int64,System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Retrieves a column as an array of bytes (blob)
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <param name="fieldOffset">The zero-based index of where to begin reading the data</param>
+            <param name="buffer">The buffer to write the bytes into</param>
+            <param name="bufferoffset">The zero-based index of where to begin writing into the array</param>
+            <param name="length">The number of bytes to retrieve</param>
+            <returns>The actual number of bytes written into the array</returns>
+            <remarks>
+            To determine the number of bytes in the column, pass a null value for the buffer.  The total length will be returned.
+            </remarks>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetChar(System.Int32)">
+            <summary>
+            Returns the column as a single character
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>char</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetChars(System.Int32,System.Int64,System.Char[],System.Int32,System.Int32)">
+            <summary>
+            Retrieves a column as an array of chars (blob)
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <param name="fieldoffset">The zero-based index of where to begin reading the data</param>
+            <param name="buffer">The buffer to write the characters into</param>
+            <param name="bufferoffset">The zero-based index of where to begin writing into the array</param>
+            <param name="length">The number of bytes to retrieve</param>
+            <returns>The actual number of characters written into the array</returns>
+            <remarks>
+            To determine the number of characters in the column, pass a null value for the buffer.  The total length will be returned.
+            </remarks>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetDataTypeName(System.Int32)">
+            <summary>
+            Retrieves the name of the back-end datatype of the column
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>string</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetDateTime(System.Int32)">
+            <summary>
+            Retrieve the column as a date/time value
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>DateTime</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetDecimal(System.Int32)">
+            <summary>
+            Retrieve the column as a decimal value
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>decimal</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetDouble(System.Int32)">
+            <summary>
+            Returns the column as a double
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>double</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetFieldType(System.Int32)">
+            <summary>
+            Returns the .NET type of a given column
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>Type</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetFloat(System.Int32)">
+            <summary>
+            Returns a column as a float value
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>float</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetGuid(System.Int32)">
+            <summary>
+            Returns the column as a Guid
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>Guid</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetInt16(System.Int32)">
+            <summary>
+            Returns the column as a short
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>Int16</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetInt32(System.Int32)">
+            <summary>
+            Retrieves the column as an int
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>Int32</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetInt64(System.Int32)">
+            <summary>
+            Retrieves the column as a long
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>Int64</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetName(System.Int32)">
+            <summary>
+            Retrieves the name of the column
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>string</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetOrdinal(System.String)">
+            <summary>
+            Retrieves the i of a column, given its name
+            </summary>
+            <param name="name">The name of the column to retrieve</param>
+            <returns>The int i of the column</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetSchemaTable">
+            <summary>
+            Schema information in SQLite is difficult to map into .NET conventions, so a lot of work must be done
+            to gather the necessary information so it can be represented in an ADO.NET manner.
+            </summary>
+            <returns>Returns a DataTable containing the schema information for the active SELECT statement being processed.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetString(System.Int32)">
+            <summary>
+            Retrieves the column as a string
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>string</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetValue(System.Int32)">
+            <summary>
+            Retrieves the column as an object corresponding to the underlying datatype of the column
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetValues(System.Object[])">
+            <summary>
+            Retreives the values of multiple columns, up to the size of the supplied array
+            </summary>
+            <param name="values">The array to fill with values from the columns in the current resultset</param>
+            <returns>The number of columns retrieved</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetValues">
+            <summary>
+            Returns a collection containing all the column names and values for the
+            current row of data in the current resultset, if any.  If there is no
+            current row or no current resultset, an exception may be thrown.
+            </summary>
+            <returns>
+            The collection containing the column name and value information for the
+            current row of data in the current resultset or null if this information
+            cannot be obtained.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.IsDBNull(System.Int32)">
+            <summary>
+            Returns True if the specified column is null
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>True or False</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.NextResult">
+            <summary>
+            Moves to the next resultset in multiple row-returning SQL command.
+            </summary>
+            <returns>True if the command was successful and a new resultset is available, False otherwise.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetFlags(System.Data.SQLite.SQLiteDataReader)">
+            <summary>
+            This method attempts to query the flags associated with the database
+            connection in use.  If the database connection is disposed, the default
+            flags will be returned.
+            </summary>
+            <param name="dataReader">
+            The data reader containing the databse connection to query the flags from.
+            </param>
+            <returns>
+            The connection flags value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetSQLiteType(System.Int32)">
+            <summary>
+            Retrieves the SQLiteType for a given column, and caches it to avoid repetetive interop calls.
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>A SQLiteType structure</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.Read">
+            <summary>
+            Reads the next row from the resultset
+            </summary>
+            <returns>True if a new row was successfully loaded and is ready for processing</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.Depth">
+            <summary>
+            Not implemented.  Returns 0
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.FieldCount">
+            <summary>
+            Returns the number of columns in the current resultset
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.VisibleFieldCount">
+            <summary>
+            Returns the number of visible fields in the current resultset
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.HasRows">
+            <summary>
+            Returns True if the resultset has rows that can be fetched
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.IsClosed">
+            <summary>
+            Returns True if the data reader is closed
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.RecordsAffected">
+            <summary>
+            Retrieve the count of records affected by an update/insert command.  Only valid once the data reader is closed!
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.Item(System.String)">
+            <summary>
+            Indexer to retrieve data from a column given its name
+            </summary>
+            <param name="name">The name of the column to retrieve data for</param>
+            <returns>The value contained in the column</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.Item(System.Int32)">
+            <summary>
+            Indexer to retrieve data from a column given its i
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>The value contained in the column</returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteException">
+            <summary>
+            SQLite exception class.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Private constructor for use with serialization.
+            </summary>
+            <param name="info">
+            Holds the serialized object data about the exception being thrown.
+            </param>
+            <param name="context">
+            Contains contextual information about the source or destination.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.#ctor(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            <summary>
+            Public constructor for generating a SQLite exception given the error
+            code and message.
+            </summary>
+            <param name="errorCode">
+            The SQLite return code to report.
+            </param>
+            <param name="message">
+            Message text to go along with the return code message text.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.#ctor(System.String)">
+            <summary>
+            Public constructor that uses the base class constructor for the error
+            message.
+            </summary>
+            <param name="message">Error message text.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.#ctor">
+            <summary>
+            Public constructor that uses the default base class constructor.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.#ctor(System.String,System.Exception)">
+            <summary>
+            Public constructor that uses the base class constructor for the error
+            message and inner exception.
+            </summary>
+            <param name="message">Error message text.</param>
+            <param name="innerException">The original (inner) exception.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Adds extra information to the serialized object data specific to this
+            class type.  This is only used for serialization.
+            </summary>
+            <param name="info">
+            Holds the serialized object data about the exception being thrown.
+            </param>
+            <param name="context">
+            Contains contextual information about the source or destination.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.GetErrorString(System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Returns the error message for the specified SQLite return code.
+            </summary>
+            <param name="errorCode">The SQLite return code.</param>
+            <returns>The error message or null if it cannot be found.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.GetStockErrorMessage(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            <summary>
+            Returns the composite error message based on the SQLite return code
+            and the optional detailed error message.
+            </summary>
+            <param name="errorCode">The SQLite return code.</param>
+            <param name="message">Optional detailed error message.</param>
+            <returns>Error message text for the return code.</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteException.ResultCode">
+            <summary>
+            Gets the associated SQLite result code for this exception as a
+            <see cref="T:System.Data.SQLite.SQLiteErrorCode"/>.  This property returns the same
+            underlying value as the <see cref="P:System.Data.SQLite.SQLiteException.ErrorCode"/> property.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteException.ErrorCode">
+            <summary>
+            Gets the associated SQLite return code for this exception as an
+            <see cref="T:System.Int32"/>.  For desktop versions of the .NET Framework,
+            this property overrides the property of the same name within the
+            <see cref="T:System.Runtime.InteropServices.ExternalException"/>
+            class.  This property returns the same underlying value as the
+            <see cref="P:System.Data.SQLite.SQLiteException.ResultCode"/> property.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteErrorCode">
+            <summary>
+            SQLite error codes.  Actually, this enumeration represents a return code,
+            which may also indicate success in one of several ways (e.g. SQLITE_OK,
+            SQLITE_ROW, and SQLITE_DONE).  Therefore, the name of this enumeration is
+            something of a misnomer.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Unknown">
+            <summary>
+            The error code is unknown.  This error code
+            is only used by the managed wrapper itself.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Ok">
+            <summary>
+            Successful result
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Error">
+            <summary>
+            SQL error or missing database
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Internal">
+            <summary>
+            Internal logic error in SQLite
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Perm">
+            <summary>
+            Access permission denied
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Abort">
+            <summary>
+            Callback routine requested an abort
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Busy">
+            <summary>
+            The database file is locked
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Locked">
+            <summary>
+            A table in the database is locked
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.NoMem">
+            <summary>
+            A malloc() failed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.ReadOnly">
+            <summary>
+            Attempt to write a readonly database
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Interrupt">
+            <summary>
+            Operation terminated by sqlite3_interrupt()
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.IoErr">
+            <summary>
+            Some kind of disk I/O error occurred
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Corrupt">
+            <summary>
+            The database disk image is malformed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.NotFound">
+            <summary>
+            Unknown opcode in sqlite3_file_control()
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Full">
+            <summary>
+            Insertion failed because database is full
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.CantOpen">
+            <summary>
+            Unable to open the database file
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Protocol">
+            <summary>
+            Database lock protocol error
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Empty">
+            <summary>
+            Database is empty
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Schema">
+            <summary>
+            The database schema changed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.TooBig">
+            <summary>
+            String or BLOB exceeds size limit
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Constraint">
+            <summary>
+            Abort due to constraint violation
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Mismatch">
+            <summary>
+            Data type mismatch
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Misuse">
+            <summary>
+            Library used incorrectly
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.NoLfs">
+            <summary>
+            Uses OS features not supported on host
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Auth">
+            <summary>
+            Authorization denied
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Format">
+            <summary>
+            Auxiliary database format error
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Range">
+            <summary>
+            2nd parameter to sqlite3_bind out of range
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.NotADb">
+            <summary>
+            File opened that is not a database file
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Notice">
+            <summary>
+            Notifications from sqlite3_log()
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Warning">
+            <summary>
+            Warnings from sqlite3_log()
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Row">
+            <summary>
+            sqlite3_step() has another row ready
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Done">
+            <summary>
+            sqlite3_step() has finished executing
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.NonExtendedMask">
+            <summary>
+            Used to mask off extended result codes
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteFactory">
+            <summary>
+            SQLite implementation of <see cref="T:System.Data.Common.DbProviderFactory"/>.
+            </summary>
+            <summary>
+            SQLite implementation of <see cref="T:System.IServiceProvider"/>.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.#ctor">
+            <summary>
+            Constructs a new instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFactory.Instance">
+            <summary>
+            Static instance member which returns an instanced <see cref="T:System.Data.SQLite.SQLiteFactory"/> class.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.CreateCommand">
+            <summary>
+            Creates and returns a new <see cref="T:System.Data.SQLite.SQLiteCommand"/> object.
+            </summary>
+            <returns>The new object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.CreateCommandBuilder">
+            <summary>
+            Creates and returns a new <see cref="T:System.Data.SQLite.SQLiteCommandBuilder"/> object.
+            </summary>
+            <returns>The new object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.CreateConnection">
+            <summary>
+            Creates and returns a new <see cref="T:System.Data.SQLite.SQLiteConnection"/> object.
+            </summary>
+            <returns>The new object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.CreateConnectionStringBuilder">
+            <summary>
+            Creates and returns a new <see cref="T:System.Data.SQLite.SQLiteConnectionStringBuilder"/> object.
+            </summary>
+            <returns>The new object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.CreateDataAdapter">
+            <summary>
+            Creates and returns a new <see cref="T:System.Data.SQLite.SQLiteDataAdapter"/> object.
+            </summary>
+            <returns>The new object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.CreateParameter">
+            <summary>
+            Creates and returns a new <see cref="T:System.Data.SQLite.SQLiteParameter"/> object.
+            </summary>
+            <returns>The new object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.System#IServiceProvider#GetService(System.Type)">
+            <summary>
+            Will provide a <see cref="T:System.IServiceProvider"/> object in .NET 3.5.
+            </summary>
+            <param name="serviceType">The class or interface type to query for.</param>
+            <returns></returns>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteFactory.Log">
+            <summary>
+            This event is raised whenever SQLite raises a logging event.
+            Note that this should be set as one of the first things in the
+            application.  This event is provided for backward compatibility only.
+            New code should use the <see cref="T:System.Data.SQLite.SQLiteLog"/> class instead.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteFunction">
+             <summary>
+             This abstract class is designed to handle user-defined functions easily.  An instance of the derived class is made for each
+             connection to the database.
+             </summary>
+             <remarks>
+             Although there is one instance of a class derived from SQLiteFunction per database connection, the derived class has no access
+             to the underlying connection.  This is necessary to deter implementers from thinking it would be a good idea to make database
+             calls during processing.
+            
+             It is important to distinguish between a per-connection instance, and a per-SQL statement context.  One instance of this class
+             services all SQL statements being stepped through on that connection, and there can be many.  One should never store per-statement
+             information in member variables of user-defined function classes.
+            
+             For aggregate functions, always create and store your per-statement data in the contextData object on the 1st step.  This data will
+             be automatically freed for you (and Dispose() called if the item supports IDisposable) when the statement completes.
+             </remarks>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._base">
+            <summary>
+            The base connection this function is attached to
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._contextDataList">
+            <summary>
+            Internal array used to keep track of aggregate function context data
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._flags">
+            <summary>
+            The connection flags associated with this object (this should be the
+            same value as the flags associated with the parent connection object).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._InvokeFunc">
+            <summary>
+            Holds a reference to the callback function for user functions
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._StepFunc">
+            <summary>
+            Holds a reference to the callbakc function for stepping in an aggregate function
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._FinalFunc">
+            <summary>
+            Holds a reference to the callback function for finalizing an aggregate function
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._CompareFunc">
+            <summary>
+            Holds a reference to the callback function for collation sequences
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._context">
+            <summary>
+            Current context of the current callback.  Only valid during a callback
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._registeredFunctions">
+            <summary>
+            This static list contains all the user-defined functions declared using the proper attributes.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.#ctor">
+            <summary>
+            Internal constructor, initializes the function's internal variables.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.#ctor(System.Data.SQLite.SQLiteDateFormats,System.DateTimeKind,System.String,System.Boolean)">
+            <summary>
+            Constructs an instance of this class using the specified data-type
+            conversion parameters.
+            </summary>
+            <param name="format">
+            The DateTime format to be used when converting string values to a
+            DateTime and binding DateTime parameters.
+            </param>
+            <param name="kind">
+            The <see cref="T:System.DateTimeKind"/> to be used when creating DateTime
+            values.
+            </param>
+            <param name="formatString">
+            The format string to be used when parsing and formatting DateTime
+            values.
+            </param>
+            <param name="utf16">
+            Non-zero to create a UTF-16 data-type conversion context; otherwise,
+            a UTF-8 data-type conversion context will be created.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.Dispose">
+            <summary>
+            Disposes of any active contextData variables that were not automatically cleaned up.  Sometimes this can happen if
+            someone closes the connection while a DataReader is open.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.Dispose(System.Boolean)">
+            <summary>
+            Placeholder for a user-defined disposal routine
+            </summary>
+            <param name="disposing">True if the object is being disposed explicitly</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.Invoke(System.Object[])">
+            <summary>
+            Scalar functions override this method to do their magic.
+            </summary>
+            <remarks>
+            Parameters passed to functions have only an affinity for a certain data type, there is no underlying schema available
+            to force them into a certain type.  Therefore the only types you will ever see as parameters are
+            DBNull.Value, Int64, Double, String or byte[] array.
+            </remarks>
+            <param name="args">The arguments for the command to process</param>
+            <returns>You may return most simple types as a return value, null or DBNull.Value to return null, DateTime, or
+            you may return an Exception-derived class if you wish to return an error to SQLite.  Do not actually throw the error,
+            just return it!</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.Step(System.Object[],System.Int32,System.Object@)">
+            <summary>
+            Aggregate functions override this method to do their magic.
+            </summary>
+            <remarks>
+            Typically you'll be updating whatever you've placed in the contextData field and returning as quickly as possible.
+            </remarks>
+            <param name="args">The arguments for the command to process</param>
+            <param name="stepNumber">The 1-based step number.  This is incrememted each time the step method is called.</param>
+            <param name="contextData">A placeholder for implementers to store contextual data pertaining to the current context.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.Final(System.Object)">
+            <summary>
+            Aggregate functions override this method to finish their aggregate processing.
+            </summary>
+            <remarks>
+            If you implemented your aggregate function properly,
+            you've been recording and keeping track of your data in the contextData object provided, and now at this stage you should have
+            all the information you need in there to figure out what to return.
+            NOTE:  It is possible to arrive here without receiving a previous call to Step(), in which case the contextData will
+            be null.  This can happen when no rows were returned.  You can either return null, or 0 or some other custom return value
+            if that is the case.
+            </remarks>
+            <param name="contextData">Your own assigned contextData, provided for you so you can return your final results.</param>
+            <returns>You may return most simple types as a return value, null or DBNull.Value to return null, DateTime, or
+            you may return an Exception-derived class if you wish to return an error to SQLite.  Do not actually throw the error,
+            just return it!
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.Compare(System.String,System.String)">
+            <summary>
+            User-defined collation sequences override this method to provide a custom string sorting algorithm.
+            </summary>
+            <param name="param1">The first string to compare</param>
+            <param name="param2">The second strnig to compare</param>
+            <returns>1 if param1 is greater than param2, 0 if they are equal, or -1 if param1 is less than param2</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.ConvertParams(System.Int32,System.IntPtr)">
+            <summary>
+            Converts an IntPtr array of context arguments to an object array containing the resolved parameters the pointers point to.
+            </summary>
+            <remarks>
+            Parameters passed to functions have only an affinity for a certain data type, there is no underlying schema available
+            to force them into a certain type.  Therefore the only types you will ever see as parameters are
+            DBNull.Value, Int64, Double, String or byte[] array.
+            </remarks>
+            <param name="nArgs">The number of arguments</param>
+            <param name="argsptr">A pointer to the array of arguments</param>
+            <returns>An object array of the arguments once they've been converted to .NET values</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.SetReturnValue(System.IntPtr,System.Object)">
+            <summary>
+            Takes the return value from Invoke() and Final() and figures out how to return it to SQLite's context.
+            </summary>
+            <param name="context">The context the return value applies to</param>
+            <param name="returnValue">The parameter to return to SQLite</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.ScalarCallback(System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            Internal scalar callback function, which wraps the raw context pointer and calls the virtual Invoke() method.
+            WARNING: Must not throw exceptions.
+            </summary>
+            <param name="context">A raw context pointer</param>
+            <param name="nArgs">Number of arguments passed in</param>
+            <param name="argsptr">A pointer to the array of arguments</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.CompareCallback(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            Internal collation sequence function, which wraps up the raw string pointers and executes the Compare() virtual function.
+            WARNING: Must not throw exceptions.
+            </summary>
+            <param name="ptr">Not used</param>
+            <param name="len1">Length of the string pv1</param>
+            <param name="ptr1">Pointer to the first string to compare</param>
+            <param name="len2">Length of the string pv2</param>
+            <param name="ptr2">Pointer to the second string to compare</param>
+            <returns>Returns -1 if the first string is less than the second.  0 if they are equal, or 1 if the first string is greater
+            than the second.  Returns 0 if an exception is caught.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.CompareCallback16(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            Internal collation sequence function, which wraps up the raw string pointers and executes the Compare() virtual function.
+            WARNING: Must not throw exceptions.
+            </summary>
+            <param name="ptr">Not used</param>
+            <param name="len1">Length of the string pv1</param>
+            <param name="ptr1">Pointer to the first string to compare</param>
+            <param name="len2">Length of the string pv2</param>
+            <param name="ptr2">Pointer to the second string to compare</param>
+            <returns>Returns -1 if the first string is less than the second.  0 if they are equal, or 1 if the first string is greater
+            than the second.  Returns 0 if an exception is caught.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.StepCallback(System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            The internal aggregate Step function callback, which wraps the raw context pointer and calls the virtual Step() method.
+            WARNING: Must not throw exceptions.
+            </summary>
+            <remarks>
+            This function takes care of doing the lookups and getting the important information put together to call the Step() function.
+            That includes pulling out the user's contextData and updating it after the call is made.  We use a sorted list for this so
+            binary searches can be done to find the data.
+            </remarks>
+            <param name="context">A raw context pointer</param>
+            <param name="nArgs">Number of arguments passed in</param>
+            <param name="argsptr">A pointer to the array of arguments</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.FinalCallback(System.IntPtr)">
+            <summary>
+            An internal aggregate Final function callback, which wraps the context pointer and calls the virtual Final() method.
+            WARNING: Must not throw exceptions.
+            </summary>
+            <param name="context">A raw context pointer</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.#cctor">
+            <summary>
+            Using reflection, enumerate all assemblies in the current appdomain looking for classes that
+            have a SQLiteFunctionAttribute attribute, and registering them accordingly.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.RegisterFunction(System.Type)">
+            <summary>
+            Manual method of registering a function.  The type must still have the SQLiteFunctionAttributes in order to work
+            properly, but this is a workaround for the Compact Framework where enumerating assemblies is not currently supported.
+            </summary>
+            <param name="typ">The type of the function to register</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.BindFunctions(System.Data.SQLite.SQLiteBase,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            Called by SQLiteBase derived classes, this function binds all user-defined functions to a connection.
+            It is done this way so that all user-defined functions will access the database using the same encoding scheme
+            as the connection (UTF-8 or UTF-16).
+            </summary>
+            <remarks>
+            The wrapper functions that interop with SQLite will create a unique cookie value, which internally is a pointer to
+            all the wrapped callback functions.  The interop function uses it to map CDecl callbacks to StdCall callbacks.
+            </remarks>
+            <param name="sqlbase">The base object on which the functions are to bind</param>
+            <param name="flags">The flags associated with the parent connection object</param>
+            <returns>Returns a logical list of functions which the connection should retain until it is closed.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.BindFunction(System.Data.SQLite.SQLiteBase,System.Data.SQLite.SQLiteFunctionAttribute,System.Data.SQLite.SQLiteFunction,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            This function binds a user-defined functions to a connection.
+            </summary>
+            <param name="sqliteBase">
+            The <see cref="T:System.Data.SQLite.SQLiteBase"/> object instance associated with the
+            <see cref="T:System.Data.SQLite.SQLiteConnection"/> that the function should be bound to.
+            </param>
+            <param name="functionAttribute">
+            The <see cref="T:System.Data.SQLite.SQLiteFunctionAttribute"/> object instance containing
+            the metadata for the function to be bound.
+            </param>
+            <param name="function">
+            The <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance that implements the
+            function to be bound.
+            </param>
+            <param name="flags">
+            The flags associated with the parent connection object.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteFunction.SQLiteConvert">
+            <summary>
+            Returns a reference to the underlying connection's SQLiteConvert class, which can be used to convert
+            strings and DateTime's into the current connection's encoding schema.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteFunctionEx">
+            <summary>
+            Extends SQLiteFunction and allows an inherited class to obtain the collating sequence associated with a function call.
+            </summary>
+            <remarks>
+            User-defined functions can call the GetCollationSequence() method in this class and use it to compare strings and char arrays.
+            </remarks>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunctionEx.GetCollationSequence">
+            <summary>
+            Obtains the collating sequence in effect for the given function.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:System.Data.SQLite.FunctionType">
+            <summary>
+            The type of user-defined function to declare
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.FunctionType.Scalar">
+            <summary>
+            Scalar functions are designed to be called and return a result immediately.  Examples include ABS(), Upper(), Lower(), etc.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.FunctionType.Aggregate">
+            <summary>
+            Aggregate functions are designed to accumulate data until the end of a call and then return a result gleaned from the accumulated data.
+            Examples include SUM(), COUNT(), AVG(), etc.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.FunctionType.Collation">
+            <summary>
+            Collation sequences are used to sort textual data in a custom manner, and appear in an ORDER BY clause.  Typically text in an ORDER BY is
+            sorted using a straight case-insensitive comparison function.  Custom collating sequences can be used to alter the behavior of text sorting
+            in a user-defined manner.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteCallback">
+            <summary>
+            An internal callback delegate declaration.
+            </summary>
+            <param name="context">Raw native context pointer for the user function.</param>
+            <param name="argc">Total number of arguments to the user function.</param>
+            <param name="argv">Raw native pointer to the array of raw native argument pointers.</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteFinalCallback">
+            <summary>
+            An internal final callback delegate declaration.
+            </summary>
+            <param name="context">Raw context pointer for the user function</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteCollation">
+            <summary>
+            Internal callback delegate for implementing collation sequences
+            </summary>
+            <param name="puser">Not used</param>
+            <param name="len1">Length of the string pv1</param>
+            <param name="pv1">Pointer to the first string to compare</param>
+            <param name="len2">Length of the string pv2</param>
+            <param name="pv2">Pointer to the second string to compare</param>
+            <returns>Returns -1 if the first string is less than the second.  0 if they are equal, or 1 if the first string is greater
+            than the second.</returns>
+        </member>
+        <member name="T:System.Data.SQLite.CollationTypeEnum">
+            <summary>
+            The type of collating sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationTypeEnum.Binary">
+            <summary>
+            The built-in BINARY collating sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationTypeEnum.NoCase">
+            <summary>
+            The built-in NOCASE collating sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationTypeEnum.Reverse">
+            <summary>
+            The built-in REVERSE collating sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationTypeEnum.Custom">
+            <summary>
+            A custom user-defined collating sequence
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.CollationEncodingEnum">
+            <summary>
+            The encoding type the collation sequence uses
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationEncodingEnum.UTF8">
+            <summary>
+            The collation sequence is UTF8
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationEncodingEnum.UTF16LE">
+            <summary>
+            The collation sequence is UTF16 little-endian
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationEncodingEnum.UTF16BE">
+            <summary>
+            The collation sequence is UTF16 big-endian
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.CollationSequence">
+            <summary>
+            A struct describing the collating sequence a function is executing in
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationSequence.Name">
+            <summary>
+            The name of the collating sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationSequence.Type">
+            <summary>
+            The type of collating sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationSequence.Encoding">
+            <summary>
+            The text encoding of the collation sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationSequence._func">
+            <summary>
+            Context of the function that requested the collating sequence
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.CollationSequence.Compare(System.String,System.String)">
+            <summary>
+            Calls the base collating sequence to compare two strings
+            </summary>
+            <param name="s1">The first string to compare</param>
+            <param name="s2">The second string to compare</param>
+            <returns>-1 if s1 is less than s2, 0 if s1 is equal to s2, and 1 if s1 is greater than s2</returns>
+        </member>
+        <member name="M:System.Data.SQLite.CollationSequence.Compare(System.Char[],System.Char[])">
+            <summary>
+            Calls the base collating sequence to compare two character arrays
+            </summary>
+            <param name="c1">The first array to compare</param>
+            <param name="c2">The second array to compare</param>
+            <returns>-1 if c1 is less than c2, 0 if c1 is equal to c2, and 1 if c1 is greater than c2</returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteFunctionAttribute">
+            <summary>
+            A simple custom attribute to enable us to easily find user-defined functions in
+            the loaded assemblies and initialize them in SQLite as connections are made.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunctionAttribute.#ctor">
+            <summary>
+            Default constructor, initializes the internal variables for the function.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunctionAttribute.#ctor(System.String,System.Int32,System.Data.SQLite.FunctionType)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="name">
+            The name of the function, as seen by the SQLite core library.
+            </param>
+            <param name="argumentCount">
+            The number of arguments that the function will accept.
+            </param>
+            <param name="functionType">
+            The type of function being declared.  This will either be Scalar,
+            Aggregate, or Collation.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteFunctionAttribute.Name">
+            <summary>
+            The function's name as it will be used in SQLite command text.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteFunctionAttribute.Arguments">
+            <summary>
+            The number of arguments this function expects.  -1 if the number of arguments is variable.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteFunctionAttribute.FuncType">
+            <summary>
+            The type of function this implementation will be.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteFunctionAttribute.InstanceType">
+            <summary>
+            The <see cref="T:System.Type"/> object instance that describes the class
+            containing the implementation for the associated function.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteKeyReader">
+            <summary>
+            This class provides key info for a given SQLite statement.
+            <remarks>
+            Providing key information for a given statement is non-trivial :(
+            </remarks>
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteKeyReader.#ctor(System.Data.SQLite.SQLiteConnection,System.Data.SQLite.SQLiteDataReader,System.Data.SQLite.SQLiteStatement)">
+            <summary>
+            This function does all the nasty work at determining what keys need to be returned for
+            a given statement.
+            </summary>
+            <param name="cnn"></param>
+            <param name="reader"></param>
+            <param name="stmt"></param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteKeyReader.Sync">
+            <summary>
+            Make sure all the subqueries are open and ready and sync'd with the current rowid
+            of the table they're supporting
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteKeyReader.Reset">
+            <summary>
+            Release any readers on any subqueries
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteKeyReader.AppendSchemaTable(System.Data.DataTable)">
+            <summary>
+            Append all the columns we've added to the original query to the schema
+            </summary>
+            <param name="tbl"></param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteKeyReader.Count">
+            <summary>
+            How many additional columns of keyinfo we're holding
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteKeyReader.KeyInfo">
+            <summary>
+            Used to support CommandBehavior.KeyInfo
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteKeyReader.KeyQuery">
+            <summary>
+            A single sub-query for a given table/database.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.LogEventArgs">
+            <summary>
+            Event data for logging event handlers.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.LogEventArgs.ErrorCode">
+            <summary>
+            The error code.  The type of this object value should be
+            <see cref="T:System.Int32"/> or <see cref="T:System.Data.SQLite.SQLiteErrorCode"/>.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.LogEventArgs.Message">
+            <summary>
+            SQL statement text as the statement first begins executing
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.LogEventArgs.Data">
+            <summary>
+            Extra data associated with this event, if any.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.LogEventArgs.#ctor(System.IntPtr,System.Object,System.String,System.Object)">
+            <summary>
+            Constructs the object.
+            </summary>
+            <param name="pUserData">Should be null.</param>
+            <param name="errorCode">
+            The error code.  The type of this object value should be
+            <see cref="T:System.Int32"/> or <see cref="T:System.Data.SQLite.SQLiteErrorCode"/>.
+            </param>
+            <param name="message">The error message, if any.</param>
+            <param name="data">The extra data, if any.</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteLogEventHandler">
+            <summary>
+            Raised when a log event occurs.
+            </summary>
+            <param name="sender">The current connection</param>
+            <param name="e">Event arguments of the trace</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteLog">
+            <summary>
+            Manages the SQLite custom logging functionality and the associated
+            callback for the whole process.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteLog.syncRoot">
+            <summary>
+            Object used to synchronize access to the static instance data
+            for this class.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteLog._domainUnload">
+            <summary>
+            Member variable to store the AppDomain.DomainUnload event handler.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteLog._defaultHandler">
+            <summary>
+            The default log event handler.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteLog._callback">
+            <summary>
+            The log callback passed to native SQLite engine.  This must live
+            as long as the SQLite library has a pointer to it.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteLog._sql">
+            <summary>
+            The base SQLite object to interop with.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteLog._enabled">
+            <summary>
+            This will be non-zero if logging is currently enabled.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.Initialize">
+            <summary>
+            Initializes the SQLite logging facilities.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.DomainUnload(System.Object,System.EventArgs)">
+            <summary>
+            Handles the AppDomain being unloaded.
+            </summary>
+            <param name="sender">Should be null.</param>
+            <param name="e">The data associated with this event.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.LogMessage(System.String)">
+            <summary>
+            Log a message to all the registered log event handlers without going
+            through the SQLite library.
+            </summary>
+            <param name="message">The message to be logged.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.LogMessage(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            <summary>
+            Log a message to all the registered log event handlers without going
+            through the SQLite library.
+            </summary>
+            <param name="errorCode">The SQLite error code.</param>
+            <param name="message">The message to be logged.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.LogMessage(System.Int32,System.String)">
+            <summary>
+            Log a message to all the registered log event handlers without going
+            through the SQLite library.
+            </summary>
+            <param name="errorCode">The integer error code.</param>
+            <param name="message">The message to be logged.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.LogMessage(System.Object,System.String)">
+            <summary>
+            Log a message to all the registered log event handlers without going
+            through the SQLite library.
+            </summary>
+            <param name="errorCode">
+            The error code.  The type of this object value should be
+            System.Int32 or SQLiteErrorCode.
+            </param>
+            <param name="message">The message to be logged.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.InitializeDefaultHandler">
+            <summary>
+            Creates and initializes the default log event handler.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.AddDefaultHandler">
+            <summary>
+            Adds the default log event handler to the list of handlers.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.RemoveDefaultHandler">
+            <summary>
+            Removes the default log event handler from the list of handlers.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.LogCallback(System.IntPtr,System.Int32,System.IntPtr)">
+             <summary>
+             Internal proxy function that calls any registered application log
+             event handlers.
+            
+             WARNING: This method is used more-or-less directly by native code,
+                      do not modify its type signature.
+             </summary>
+             <param name="pUserData">
+             The extra data associated with this message, if any.
+             </param>
+             <param name="errorCode">
+             The error code associated with this message.
+             </param>
+             <param name="pMessage">
+             The message string to be logged.
+             </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.LogEventHandler(System.Object,System.Data.SQLite.LogEventArgs)">
+            <summary>
+            Default logger.  Currently, uses the Trace class (i.e. sends events
+            to the current trace listeners, if any).
+            </summary>
+            <param name="sender">Should be null.</param>
+            <param name="e">The data associated with this event.</param>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteLog._handlers">
+            <summary>
+            Member variable to store the application log handler to call.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteLog.Log">
+            <summary>
+            This event is raised whenever SQLite raises a logging event.
+            Note that this should be set as one of the first things in the
+            application.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteLog.Enabled">
+            <summary>
+            If this property is true, logging is enabled; otherwise, logging is
+            disabled.  When logging is disabled, no logging events will fire.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteMetaDataCollectionNames">
+            <summary>
+            MetaDataCollections specific to SQLite
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Catalogs">
+            <summary>
+            Returns a list of databases attached to the connection
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Columns">
+            <summary>
+            Returns column information for the specified table
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Indexes">
+            <summary>
+            Returns index information for the optionally-specified table
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.IndexColumns">
+            <summary>
+            Returns base columns for the given index
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Tables">
+            <summary>
+            Returns the tables in the given catalog
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Views">
+            <summary>
+            Returns user-defined views in the given catalog
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.ViewColumns">
+            <summary>
+            Returns underlying column information on the given view
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.ForeignKeys">
+            <summary>
+            Returns foreign key information for the given catalog
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Triggers">
+            <summary>
+            Returns the triggers on the database
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteParameter">
+            <summary>
+            SQLite implementation of DbParameter.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameter._dbType">
+            <summary>
+            The data type of the parameter
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameter._rowVersion">
+            <summary>
+            The version information for mapping the parameter
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameter._objValue">
+            <summary>
+            The value of the data in the parameter
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameter._sourceColumn">
+            <summary>
+            The source column for the parameter
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameter._parameterName">
+            <summary>
+            The column name
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameter._dataSize">
+            <summary>
+            The data size, unused by SQLite
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String)">
+            <summary>
+            Constructs a named parameter given the specified parameter name
+            </summary>
+            <param name="parameterName">The parameter name</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Object)">
+            <summary>
+            Constructs a named parameter given the specified parameter name and initial value
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="value">The initial value of the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType)">
+            <summary>
+            Constructs a named parameter of the specified type
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="dbType">The datatype of the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.String)">
+            <summary>
+            Constructs a named parameter of the specified type and source column reference
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="dbType">The data type</param>
+            <param name="sourceColumn">The source column</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.String,System.Data.DataRowVersion)">
+            <summary>
+            Constructs a named parameter of the specified type, source column and row version
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="dbType">The data type</param>
+            <param name="sourceColumn">The source column</param>
+            <param name="rowVersion">The row version information</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType)">
+            <summary>
+            Constructs an unnamed parameter of the specified data type
+            </summary>
+            <param name="dbType">The datatype of the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.Object)">
+            <summary>
+            Constructs an unnamed parameter of the specified data type and sets the initial value
+            </summary>
+            <param name="dbType">The datatype of the parameter</param>
+            <param name="value">The initial value of the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.String)">
+            <summary>
+            Constructs an unnamed parameter of the specified data type and source column
+            </summary>
+            <param name="dbType">The datatype of the parameter</param>
+            <param name="sourceColumn">The source column</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.String,System.Data.DataRowVersion)">
+            <summary>
+            Constructs an unnamed parameter of the specified data type, source column and row version
+            </summary>
+            <param name="dbType">The data type</param>
+            <param name="sourceColumn">The source column</param>
+            <param name="rowVersion">The row version information</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.Int32)">
+            <summary>
+            Constructs a named parameter of the specified type and size
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.Int32,System.String)">
+            <summary>
+            Constructs a named parameter of the specified type, size and source column
+            </summary>
+            <param name="parameterName">The name of the parameter</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+            <param name="sourceColumn">The source column</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.Int32,System.String,System.Data.DataRowVersion)">
+            <summary>
+            Constructs a named parameter of the specified type, size, source column and row version
+            </summary>
+            <param name="parameterName">The name of the parameter</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+            <param name="sourceColumn">The source column</param>
+            <param name="rowVersion">The row version information</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.Int32,System.Data.ParameterDirection,System.Boolean,System.Byte,System.Byte,System.String,System.Data.DataRowVersion,System.Object)">
+            <summary>
+            Constructs a named parameter of the specified type, size, source column and row version
+            </summary>
+            <param name="parameterName">The name of the parameter</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+            <param name="direction">Only input parameters are supported in SQLite</param>
+            <param name="isNullable">Ignored</param>
+            <param name="precision">Ignored</param>
+            <param name="scale">Ignored</param>
+            <param name="sourceColumn">The source column</param>
+            <param name="rowVersion">The row version information</param>
+            <param name="value">The initial value to assign the parameter</param>   
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.Int32,System.Data.ParameterDirection,System.Byte,System.Byte,System.String,System.Data.DataRowVersion,System.Boolean,System.Object)">
+            <summary>
+            Constructs a named parameter, yet another flavor
+            </summary>
+            <param name="parameterName">The name of the parameter</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+            <param name="direction">Only input parameters are supported in SQLite</param>
+            <param name="precision">Ignored</param>
+            <param name="scale">Ignored</param>
+            <param name="sourceColumn">The source column</param>
+            <param name="rowVersion">The row version information</param>
+            <param name="sourceColumnNullMapping">Whether or not this parameter is for comparing NULL's</param>
+            <param name="value">The intial value to assign the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.Int32)">
+            <summary>
+            Constructs an unnamed parameter of the specified type and size
+            </summary>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.Int32,System.String)">
+            <summary>
+            Constructs an unnamed parameter of the specified type, size, and source column
+            </summary>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+            <param name="sourceColumn">The source column</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.Int32,System.String,System.Data.DataRowVersion)">
+            <summary>
+            Constructs an unnamed parameter of the specified type, size, source column and row version
+            </summary>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+            <param name="sourceColumn">The source column</param>
+            <param name="rowVersion">The row version information</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.ResetDbType">
+            <summary>
+            Resets the DbType of the parameter so it can be inferred from the value
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.Clone">
+            <summary>
+            Clones a parameter
+            </summary>
+            <returns>A new, unassociated SQLiteParameter</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.IsNullable">
+            <summary>
+            Whether or not the parameter can contain a null value
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.DbType">
+            <summary>
+            Returns the datatype of the parameter
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.Direction">
+            <summary>
+            Supports only input parameters
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.ParameterName">
+            <summary>
+            Returns the parameter name
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.Size">
+            <summary>
+            Returns the size of the parameter
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.SourceColumn">
+            <summary>
+            Gets/sets the source column
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.SourceColumnNullMapping">
+            <summary>
+            Used by DbCommandBuilder to determine the mapping for nullable fields
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.SourceVersion">
+            <summary>
+            Gets and sets the row version
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.Value">
+            <summary>
+            Gets and sets the parameter value.  If no datatype was specified, the datatype will assume the type from the value given.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteParameterCollection">
+            <summary>
+            SQLite implementation of DbParameterCollection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameterCollection._command">
+            <summary>
+            The underlying command to which this collection belongs
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameterCollection._parameterList">
+            <summary>
+            The internal array of parameters in this collection
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameterCollection._unboundFlag">
+            <summary>
+            Determines whether or not all parameters have been bound to their statement(s)
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.#ctor(System.Data.SQLite.SQLiteCommand)">
+            <summary>
+            Initializes the collection
+            </summary>
+            <param name="cmd">The command to which the collection belongs</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.GetEnumerator">
+            <summary>
+            Retrieves an enumerator for the collection
+            </summary>
+            <returns>An enumerator for the underlying array</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Add(System.String,System.Data.DbType,System.Int32,System.String)">
+            <summary>
+            Adds a parameter to the collection
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the value</param>
+            <param name="sourceColumn">The source column</param>
+            <returns>A SQLiteParameter object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Add(System.String,System.Data.DbType,System.Int32)">
+            <summary>
+            Adds a parameter to the collection
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the value</param>
+            <returns>A SQLiteParameter object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Add(System.String,System.Data.DbType)">
+            <summary>
+            Adds a parameter to the collection
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="parameterType">The data type</param>
+            <returns>A SQLiteParameter object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Add(System.Data.SQLite.SQLiteParameter)">
+            <summary>
+            Adds a parameter to the collection
+            </summary>
+            <param name="parameter">The parameter to add</param>
+            <returns>A zero-based index of where the parameter is located in the array</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Add(System.Object)">
+            <summary>
+            Adds a parameter to the collection
+            </summary>
+            <param name="value">The parameter to add</param>
+            <returns>A zero-based index of where the parameter is located in the array</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.AddWithValue(System.String,System.Object)">
+            <summary>
+            Adds a named/unnamed parameter and its value to the parameter collection.
+            </summary>
+            <param name="parameterName">Name of the parameter, or null to indicate an unnamed parameter</param>
+            <param name="value">The initial value of the parameter</param>
+            <returns>Returns the SQLiteParameter object created during the call.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.AddRange(System.Data.SQLite.SQLiteParameter[])">
+            <summary>
+            Adds an array of parameters to the collection
+            </summary>
+            <param name="values">The array of parameters to add</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.AddRange(System.Array)">
+            <summary>
+            Adds an array of parameters to the collection
+            </summary>
+            <param name="values">The array of parameters to add</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Clear">
+            <summary>
+            Clears the array and resets the collection
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Contains(System.String)">
+            <summary>
+            Determines if the named parameter exists in the collection
+            </summary>
+            <param name="parameterName">The name of the parameter to check</param>
+            <returns>True if the parameter is in the collection</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Contains(System.Object)">
+            <summary>
+            Determines if the parameter exists in the collection
+            </summary>
+            <param name="value">The SQLiteParameter to check</param>
+            <returns>True if the parameter is in the collection</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.CopyTo(System.Array,System.Int32)">
+            <summary>
+            Not implemented
+            </summary>
+            <param name="array"></param>
+            <param name="index"></param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.GetParameter(System.String)">
+            <summary>
+            Retrieve a parameter by name from the collection
+            </summary>
+            <param name="parameterName">The name of the parameter to fetch</param>
+            <returns>A DbParameter object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.GetParameter(System.Int32)">
+            <summary>
+            Retrieves a parameter by its index in the collection
+            </summary>
+            <param name="index">The index of the parameter to retrieve</param>
+            <returns>A DbParameter object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.IndexOf(System.String)">
+            <summary>
+            Returns the index of a parameter given its name
+            </summary>
+            <param name="parameterName">The name of the parameter to find</param>
+            <returns>-1 if not found, otherwise a zero-based index of the parameter</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.IndexOf(System.Object)">
+            <summary>
+            Returns the index of a parameter
+            </summary>
+            <param name="value">The parameter to find</param>
+            <returns>-1 if not found, otherwise a zero-based index of the parameter</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Insert(System.Int32,System.Object)">
+            <summary>
+            Inserts a parameter into the array at the specified location
+            </summary>
+            <param name="index">The zero-based index to insert the parameter at</param>
+            <param name="value">The parameter to insert</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Remove(System.Object)">
+            <summary>
+            Removes a parameter from the collection
+            </summary>
+            <param name="value">The parameter to remove</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.RemoveAt(System.String)">
+            <summary>
+            Removes a parameter from the collection given its name
+            </summary>
+            <param name="parameterName">The name of the parameter to remove</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.RemoveAt(System.Int32)">
+            <summary>
+            Removes a parameter from the collection given its index
+            </summary>
+            <param name="index">The zero-based parameter index to remove</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.SetParameter(System.String,System.Data.Common.DbParameter)">
+            <summary>
+            Re-assign the named parameter to a new parameter object
+            </summary>
+            <param name="parameterName">The name of the parameter to replace</param>
+            <param name="value">The new parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.SetParameter(System.Int32,System.Data.Common.DbParameter)">
+            <summary>
+            Re-assign a parameter at the specified index
+            </summary>
+            <param name="index">The zero-based index of the parameter to replace</param>
+            <param name="value">The new parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Unbind">
+            <summary>
+            Un-binds all parameters from their statements
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.MapParameters(System.Data.SQLite.SQLiteStatement)">
+            <summary>
+            This function attempts to map all parameters in the collection to all statements in a Command.
+            Since named parameters may span multiple statements, this function makes sure all statements are bound
+            to the same named parameter.  Unnamed parameters are bound in sequence.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.IsSynchronized">
+            <summary>
+            Returns false
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.IsFixedSize">
+            <summary>
+            Returns false
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.IsReadOnly">
+            <summary>
+            Returns false
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.SyncRoot">
+            <summary>
+            Returns null
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.Count">
+            <summary>
+            Returns a count of parameters in the collection
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.Item(System.String)">
+            <summary>
+            Overloaded to specialize the return value of the default indexer
+            </summary>
+            <param name="parameterName">Name of the parameter to get/set</param>
+            <returns>The specified named SQLite parameter</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.Item(System.Int32)">
+            <summary>
+            Overloaded to specialize the return value of the default indexer
+            </summary>
+            <param name="index">The index of the parameter to get/set</param>
+            <returns>The specified SQLite parameter</returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteStatement">
+            <summary>
+            Represents a single SQL statement in SQLite.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._sql">
+            <summary>
+            The underlying SQLite object this statement is bound to
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._sqlStatement">
+            <summary>
+            The command text of this SQL statement
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._sqlite_stmt">
+            <summary>
+            The actual statement pointer
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._unnamedParameters">
+            <summary>
+            An index from which unnamed parameters begin
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._paramNames">
+            <summary>
+            Names of the parameters as SQLite understands them to be
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._paramValues">
+            <summary>
+            Parameters for this statement
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._command">
+            <summary>
+            Command this statement belongs to (if any)
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._flags">
+            <summary>
+            The flags associated with the parent connection object.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.#ctor(System.Data.SQLite.SQLiteBase,System.Data.SQLite.SQLiteConnectionFlags,System.Data.SQLite.SQLiteStatementHandle,System.String,System.Data.SQLite.SQLiteStatement)">
+            <summary>
+            Initializes the statement and attempts to get all information about parameters in the statement
+            </summary>
+            <param name="sqlbase">The base SQLite object</param>
+            <param name="flags">The flags associated with the parent connection object</param>
+            <param name="stmt">The statement</param>
+            <param name="strCommand">The command text for this statement</param>
+            <param name="previous">The previous command in a multi-statement command</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.Dispose">
+            <summary>
+            Disposes and finalizes the statement
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.TryGetChanges(System.Int32@)">
+            <summary>
+            If the underlying database connection is open, fetches the number of changed rows
+            resulting from the most recent query; otherwise, does nothing.
+            </summary>
+            <param name="changes">
+            The number of changes when true is returned.
+            Undefined if false is returned.
+            </param>
+            <returns>Non-zero if the number of changed rows was fetched.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.MapParameter(System.String,System.Data.SQLite.SQLiteParameter)">
+            <summary>
+            Called by SQLiteParameterCollection, this function determines if the specified parameter name belongs to
+            this statement, and if so, keeps a reference to the parameter so it can be bound later.
+            </summary>
+            <param name="s">The parameter name to map</param>
+            <param name="p">The parameter to assign it</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.BindParameters">
+            <summary>
+             Bind all parameters, making sure the caller didn't miss any
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.ToBoolean(System.Object,System.IFormatProvider)">
+            <summary>
+            Attempts to convert an arbitrary object to the Boolean data type.
+            Null object values are converted to false.  Throws a SQLiteException
+            upon failure.
+            </summary>
+            <param name="obj">The object value to convert.</param>
+            <param name="provider">The format provider to use.</param>
+            <returns>The converted boolean value.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.BindParameter(System.Int32,System.Data.SQLite.SQLiteParameter)">
+            <summary>
+            Perform the bind operation for an individual parameter
+            </summary>
+            <param name="index">The index of the parameter to bind</param>
+            <param name="param">The parameter we're binding</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteTransaction">
+            <summary>
+            SQLite implementation of DbTransaction.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteTransaction._cnn">
+            <summary>
+            The connection to which this transaction is bound
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteTransaction.#ctor(System.Data.SQLite.SQLiteConnection,System.Boolean)">
+            <summary>
+            Constructs the transaction object, binding it to the supplied connection
+            </summary>
+            <param name="connection">The connection to open a transaction on</param>
+            <param name="deferredLock">TRUE to defer the writelock, or FALSE to lock immediately</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteTransaction.Dispose(System.Boolean)">
+            <summary>
+            Disposes the transaction.  If it is currently active, any changes are rolled back.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteTransaction.Commit">
+            <summary>
+            Commits the current transaction.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteTransaction.Rollback">
+            <summary>
+            Rolls back the active transaction.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteTransaction.Connection">
+            <summary>
+            Returns the underlying connection to which this transaction applies.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteTransaction.DbConnection">
+            <summary>
+            Forwards to the local Connection property
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteTransaction.IsolationLevel">
+            <summary>
+            Gets the isolation level of the transaction.  SQLite only supports Serializable transactions.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SR">
+            <summary>
+              A strongly-typed resource class, for looking up localized strings, etc.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SR.ResourceManager">
+            <summary>
+              Returns the cached ResourceManager instance used by this class.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SR.Culture">
+            <summary>
+              Overrides the current thread's CurrentUICulture property for all
+              resource lookups using this strongly typed resource class.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SR.DataTypes">
+             <summary>
+               Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot; standalone=&quot;yes&quot;?&gt;
+            &lt;DocumentElement&gt;
+              &lt;DataTypes&gt;
+                &lt;TypeName&gt;smallint&lt;/TypeName&gt;
+                &lt;ProviderDbType&gt;10&lt;/ProviderDbType&gt;
+                &lt;ColumnSize&gt;5&lt;/ColumnSize&gt;
+                &lt;DataType&gt;System.Int16&lt;/DataType&gt;
+                &lt;CreateFormat&gt;smallint&lt;/CreateFormat&gt;
+                &lt;IsAutoIncrementable&gt;false&lt;/IsAutoIncrementable&gt;
+                &lt;IsCaseSensitive&gt;false&lt;/IsCaseSensitive&gt;
+                &lt;IsFixedLength&gt;true&lt;/IsFixedLength&gt;
+                &lt;IsFixedPrecisionScale&gt;true&lt;/IsFixedPrecisionScale&gt;
+                &lt;IsLong&gt;false&lt;/IsLong&gt;
+                &lt;IsNullable&gt;true&lt;/ [rest of string was truncated]&quot;;.
+             </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SR.Keywords">
+            <summary>
+              Looks up a localized string similar to ALL,ALTER,AND,AS,AUTOINCREMENT,BETWEEN,BY,CASE,CHECK,COLLATE,COMMIT,CONSTRAINT,CREATE,CROSS,DEFAULT,DEFERRABLE,DELETE,DISTINCT,DROP,ELSE,ESCAPE,EXCEPT,FOREIGN,FROM,FULL,GROUP,HAVING,IN,INDEX,INNER,INSERT,INTERSECT,INTO,IS,ISNULL,JOIN,LEFT,LIMIT,NATURAL,NOT,NOTNULL,NULL,ON,OR,ORDER,OUTER,PRIMARY,REFERENCES,RIGHT,ROLLBACK,SELECT,SET,TABLE,THEN,TO,TRANSACTION,UNION,UNIQUE,UPDATE,USING,VALUES,WHEN,WHERE.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SR.MetaDataCollections">
+             <summary>
+               Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
+            &lt;DocumentElement&gt;
+              &lt;MetaDataCollections&gt;
+                &lt;CollectionName&gt;MetaDataCollections&lt;/CollectionName&gt;
+                &lt;NumberOfRestrictions&gt;0&lt;/NumberOfRestrictions&gt;
+                &lt;NumberOfIdentifierParts&gt;0&lt;/NumberOfIdentifierParts&gt;
+              &lt;/MetaDataCollections&gt;
+              &lt;MetaDataCollections&gt;
+                &lt;CollectionName&gt;DataSourceInformation&lt;/CollectionName&gt;
+                &lt;NumberOfRestrictions&gt;0&lt;/NumberOfRestrictions&gt;
+                &lt;NumberOfIdentifierParts&gt;0&lt;/NumberOfIdentifierParts&gt;
+              &lt;/MetaDataCollections&gt;
+              &lt;MetaDataC [rest of string was truncated]&quot;;.
+             </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UnsafeNativeMethods.PROCESSOR_ARCHITECTURE">
+            <summary>
+            The name of the environment variable containing the processor
+            architecture of the current process.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.LoadLibrary(System.String)">
+            <summary>
+            This is the P/Invoke method that wraps the native Win32 LoadLibrary
+            function.  See the MSDN documentation for full details on what it
+            does.
+            </summary>
+            <param name="fileName">
+            The name of the executable library.
+            </param>
+            <returns>
+            The native module handle upon success -OR- IntPtr.Zero on failure.
+            </returns>
+        </member>
+        <member name="F:System.Data.SQLite.UnsafeNativeMethods.staticSyncRoot">
+            <summary>
+            This lock is used to protect the static _SQLiteModule and
+            processorArchitecturePlatforms fields, below.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UnsafeNativeMethods.processorArchitecturePlatforms">
+            <summary>
+            Stores the mappings between processor architecture names and platform
+            names.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UnsafeNativeMethods._SQLiteModule">
+            <summary>
+            The native module handle for the native SQLite library or the value
+            IntPtr.Zero.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.#cctor">
+            <summary>
+            For now, this method simply calls the Initialize method.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.Initialize">
+            <summary>
+            Attempts to initialize this class by pre-loading the native SQLite
+            library for the processor architecture of the current process.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.GetBaseDirectory">
+            <summary>
+            Queries and returns the base directory of the current application
+            domain.
+            </summary>
+            <returns>
+            The base directory for the current application domain -OR- null if it
+            cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.FixUpDllFileName(System.String)">
+            <summary>
+            Determines if the dynamic link library file name requires a suffix
+            and adds it if necessary.
+            </summary>
+            <param name="fileName">
+            The original dynamic link library file name to inspect.
+            </param>
+            <returns>
+            The dynamic link library file name, possibly modified to include an
+            extension.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.GetProcessorArchitecture">
+            <summary>
+            Queries and returns the processor architecture of the current
+            process.
+            </summary>
+            <returns>
+            The processor architecture of the current process -OR- null if it
+            cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.GetPlatformName(System.String)">
+            <summary>
+            Given the processor architecture, returns the name of the platform.
+            </summary>
+            <param name="processorArchitecture">
+            The processor architecture to be translated to a platform name.
+            </param>
+            <returns>
+            The platform name for the specified processor architecture -OR- null
+            if it cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.PreLoadSQLiteDll(System.String,System.String)">
+            <summary>
+            Attempts to load the native SQLite library based on the specified
+            directory and processor architecture.
+            </summary>
+            <param name="directory">
+            The base directory to use, null for default (the base directory of
+            the current application domain).  This directory should contain the
+            processor architecture specific sub-directories.
+            </param>
+            <param name="processorArchitecture">
+            The requested processor architecture, null for default (the
+            processor architecture of the current process).  This caller should
+            almost always specify null for this parameter.
+            </param>
+            <returns>
+            The native module handle as returned by LoadLibrary -OR- IntPtr.Zero
+            if the loading fails for any reason.
+            </returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteContext">
+            <summary>
+            This class represents a context from the SQLite core library that can
+            be passed to the sqlite3_result_*() and associated functions.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.ISQLiteNativeHandle">
+            <summary>
+            This interface represents a native handle provided by the SQLite core
+            library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.ISQLiteNativeHandle.NativeHandle">
+            <summary>
+            The native handle value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteContext.pContext">
+            <summary>
+            The native context handle.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.#ctor(System.IntPtr)">
+            <summary>
+            Constructs an instance of this class using the specified native
+            context handle.
+            </summary>
+            <param name="pContext">
+            The native context handle to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetNull">
+            <summary>
+            Sets the context result to NULL.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetDouble(System.Double)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.Double"/>
+            value.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.Double"/> value to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetInt(System.Int32)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.Int32"/>
+            value.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.Int32"/> value to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetInt64(System.Int64)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.Int64"/>
+            value.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.Int64"/> value to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetString(System.String)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.String"/>
+            value.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.String"/> value to use.  This value will be
+            converted to the UTF-8 encoding prior to being used.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetError(System.String)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.String"/>
+            value containing an error message.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.String"/> value containing the error message text.
+            This value will be converted to the UTF-8 encoding prior to being
+            used.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetErrorCode(System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.Data.SQLite.SQLiteErrorCode"/>
+            value.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetErrorTooBig">
+            <summary>
+            Sets the context result to contain the error code SQLITE_TOOBIG.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetErrorNoMemory">
+            <summary>
+            Sets the context result to contain the error code SQLITE_NOMEM.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetBlob(System.Byte[])">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.Byte"/> array
+            value.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.Byte"/> array value to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetZeroBlob(System.Int32)">
+            <summary>
+            Sets the context result to a BLOB of zeros of the specified size.
+            </summary>
+            <param name="value">
+            The number of zero bytes to use for the BLOB context result.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetValue(System.Data.SQLite.SQLiteValue)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.Data.SQLite.SQLiteValue"/>.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.Data.SQLite.SQLiteValue"/> to use.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteContext.NativeHandle">
+            <summary>
+            Returns the underlying SQLite native handle associated with this
+            object instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteValue">
+            <summary>
+            This class represents a value from the SQLite core library that can be
+            passed to the sqlite3_value_*() and associated functions.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteValue.pValue">
+            <summary>
+            The native value handle.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.#ctor(System.IntPtr)">
+            <summary>
+            Constructs an instance of this class using the specified native
+            value handle.
+            </summary>
+            <param name="pValue">
+            The native value handle to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.PreventNativeAccess">
+            <summary>
+            Invalidates the native value handle, thereby preventing further
+            access to it from this object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.ArrayFromSizeAndIntPtr(System.Int32,System.IntPtr)">
+            <summary>
+            Converts a logical array of native pointers to native sqlite3_value
+            structures into a managed array of <see cref="T:System.Data.SQLite.SQLiteValue"/>
+            object instances.
+            </summary>
+            <param name="argc">
+            The number of elements in the logical array of native sqlite3_value
+            structures.
+            </param>
+            <param name="argv">
+            The native pointer to the logical array of native sqlite3_value
+            structures to convert.
+            </param>
+            <returns>
+            The managed array of <see cref="T:System.Data.SQLite.SQLiteValue"/> object instances or
+            null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetTypeAffinity">
+            <summary>
+            Gets and returns the type affinity associated with this value.
+            </summary>
+            <returns>
+            The type affinity associated with this value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetBytes">
+            <summary>
+            Gets and returns the number of bytes associated with this value, if
+            it refers to a UTF-8 encoded string.
+            </summary>
+            <returns>
+            The number of bytes associated with this value.  The returned value
+            may be zero.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetInt">
+            <summary>
+            Gets and returns the <see cref="T:System.Int32"/> associated with this
+            value.
+            </summary>
+            <returns>
+            The <see cref="T:System.Int32"/> associated with this value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetInt64">
+            <summary>
+            Gets and returns the <see cref="T:System.Int64"/> associated with
+            this value.
+            </summary>
+            <returns>
+            The <see cref="T:System.Int64"/> associated with this value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetDouble">
+            <summary>
+            Gets and returns the <see cref="T:System.Double"/> associated with this
+            value.
+            </summary>
+            <returns>
+            The <see cref="T:System.Double"/> associated with this value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetString">
+            <summary>
+            Gets and returns the <see cref="T:System.String"/> associated with this
+            value.
+            </summary>
+            <returns>
+            The <see cref="T:System.String"/> associated with this value.  The value is
+            converted from the UTF-8 encoding prior to being returned.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetBlob">
+            <summary>
+            Gets and returns the <see cref="T:System.Byte"/> array associated with this
+            value.
+            </summary>
+            <returns>
+            The <see cref="T:System.Byte"/> array associated with this value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.Persist">
+            <summary>
+            Uses the native value handle to obtain and store the managed value
+            for this object instance, thus saving it for later use.  The type
+            of the managed value is determined by the type affinity of the
+            native value.  If the type affinity is not recognized by this
+            method, no work is done and false is returned.
+            </summary>
+            <returns>
+            Non-zero if the native value was persisted successfully.
+            </returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteValue.NativeHandle">
+            <summary>
+            Returns the underlying SQLite native handle associated with this
+            object instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteValue.Persisted">
+            <summary>
+            Returns non-zero if the native SQLite value has been successfully
+            persisted as a managed value within this object instance (i.e. the
+            <see cref="P:System.Data.SQLite.SQLiteValue.Value"/> property may then be read successfully).
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteValue.Value">
+            <summary>
+            If the managed value for this object instance is available (i.e. it
+            has been previously persisted via the <see cref="M:System.Data.SQLite.SQLiteValue.Persist"/>) method,
+            that value is returned; otherwise, an exception is thrown.  The
+            returned value may be null.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndexConstraintOp">
+            <summary>
+            These are the allowed values for the operators that are part of a
+            constraint term in the WHERE clause of a query that uses a virtual
+            table.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintOp.EqualTo">
+            <summary>
+            This value represents the equality operator.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintOp.GreaterThan">
+            <summary>
+            This value represents the greater than operator.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintOp.LessThanOrEqualTo">
+            <summary>
+            This value represents the less than or equal to operator.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintOp.LessThan">
+            <summary>
+            This value represents the less than operator.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintOp.GreaterThanOrEqualTo">
+            <summary>
+            This value represents the greater than or equal to operator.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintOp.Match">
+            <summary>
+            This value represents the MATCH operator.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndexConstraint">
+            <summary>
+            This class represents the native sqlite3_index_constraint structure
+            from the SQLite core library.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexConstraint.#ctor(System.Data.SQLite.UnsafeNativeMethods.sqlite3_index_constraint)">
+            <summary>
+            Constructs an instance of this class using the specified native
+            sqlite3_index_constraint structure.
+            </summary>
+            <param name="constraint">
+            The native sqlite3_index_constraint structure to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexConstraint.#ctor(System.Int32,System.Data.SQLite.SQLiteIndexConstraintOp,System.Byte,System.Int32)">
+            <summary>
+            Constructs an instance of this class using the specified field
+            values.
+            </summary>
+            <param name="iColumn">
+            Column on left-hand side of constraint.
+            </param>
+            <param name="op">
+            Constraint operator (<see cref="T:System.Data.SQLite.SQLiteIndexConstraintOp"/>).
+            </param>
+            <param name="usable">
+            True if this constraint is usable.
+            </param>
+            <param name="iTermOffset">
+            Used internally - <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/>
+            should ignore.
+            </param>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraint.iColumn">
+            <summary>
+            Column on left-hand side of constraint.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraint.op">
+            <summary>
+            Constraint operator (<see cref="T:System.Data.SQLite.SQLiteIndexConstraintOp"/>).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraint.usable">
+            <summary>
+            True if this constraint is usable.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraint.iTermOffset">
+            <summary>
+            Used internally - <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/>
+            should ignore.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndexOrderBy">
+            <summary>
+            This class represents the native sqlite3_index_orderby structure from
+            the SQLite core library.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexOrderBy.#ctor(System.Data.SQLite.UnsafeNativeMethods.sqlite3_index_orderby)">
+            <summary>
+            Constructs an instance of this class using the specified native
+            sqlite3_index_orderby structure.
+            </summary>
+            <param name="orderBy">
+            The native sqlite3_index_orderby structure to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexOrderBy.#ctor(System.Int32,System.Byte)">
+            <summary>
+            Constructs an instance of this class using the specified field
+            values.
+            </summary>
+            <param name="iColumn">
+            Column number.
+            </param>
+            <param name="desc">
+            True for DESC.  False for ASC.
+            </param>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexOrderBy.iColumn">
+            <summary>
+            Column number.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexOrderBy.desc">
+            <summary>
+            True for DESC.  False for ASC.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndexConstraintUsage">
+            <summary>
+            This class represents the native sqlite3_index_constraint_usage
+            structure from the SQLite core library.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexConstraintUsage.#ctor(System.Data.SQLite.UnsafeNativeMethods.sqlite3_index_constraint_usage)">
+            <summary>
+            Constructs an instance of this class using the specified native
+            sqlite3_index_constraint_usage structure.
+            </summary>
+            <param name="constraintUsage">
+            The native sqlite3_index_constraint_usage structure to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexConstraintUsage.#ctor(System.Int32,System.Byte)">
+            <summary>
+            Constructs an instance of this class using the specified field
+            values.
+            </summary>
+            <param name="argvIndex">
+            If greater than 0, constraint is part of argv to xFilter.
+            </param>
+            <param name="omit">
+            Do not code a test for this constraint.
+            </param>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintUsage.argvIndex">
+            <summary>
+            If greater than 0, constraint is part of argv to xFilter.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintUsage.omit">
+            <summary>
+            Do not code a test for this constraint.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndexInputs">
+            <summary>
+            This class represents the various inputs provided by the SQLite core
+            library to the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexInputs.#ctor(System.Int32,System.Int32)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="nConstraint">
+            The number of <see cref="T:System.Data.SQLite.SQLiteIndexConstraint"/> instances to
+            pre-allocate space for.
+            </param>
+            <param name="nOrderBy">
+            The number of <see cref="T:System.Data.SQLite.SQLiteIndexOrderBy"/> instances to
+            pre-allocate space for.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexInputs.Constraints">
+            <summary>
+            An array of <see cref="T:System.Data.SQLite.SQLiteIndexConstraint"/> object instances,
+            each containing information supplied by the SQLite core library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexInputs.OrderBys">
+            <summary>
+            An array of <see cref="T:System.Data.SQLite.SQLiteIndexOrderBy"/> object instances,
+            each containing information supplied by the SQLite core library.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndexOutputs">
+            <summary>
+            This class represents the various outputs provided to the SQLite core
+            library by the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexOutputs.#ctor(System.Int32)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="nConstraint">
+            The number of <see cref="T:System.Data.SQLite.SQLiteIndexConstraintUsage"/> instances
+            to pre-allocate space for.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexOutputs.CanUseEstimatedRows">
+            <summary>
+            Determines if the native estimatedRows field can be used, based on
+            the available version of the SQLite core library.
+            </summary>
+            <returns>
+            Non-zero if the <see cref="P:System.Data.SQLite.SQLiteIndexOutputs.EstimatedRows"/> property is supported
+            by the SQLite core library.
+            </returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.ConstraintUsages">
+            <summary>
+            An array of <see cref="T:System.Data.SQLite.SQLiteIndexConstraintUsage"/> object
+            instances, each containing information to be supplied to the SQLite
+            core library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.IndexNumber">
+            <summary>
+            Number used to help identify the selected index.  This value will
+            later be provided to the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/>
+            method.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.IndexString">
+            <summary>
+            String used to help identify the selected index.  This value will
+            later be provided to the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/>
+            method.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.NeedToFreeIndexString">
+            <summary>
+            Non-zero if the index string must be freed by the SQLite core
+            library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.OrderByConsumed">
+            <summary>
+            True if output is already ordered.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.EstimatedCost">
+            <summary>
+            Estimated cost of using this index.  Using a null value here
+            indicates that a default estimated cost value should be used.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.EstimatedRows">
+            <summary>
+            Estimated number of rows returned.  Using a null value here
+            indicates that a default estimated rows value should be used.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndex">
+            <summary>
+            This class represents the various inputs and outputs used with the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndex.#ctor(System.Int32,System.Int32)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="nConstraint">
+            The number of <see cref="T:System.Data.SQLite.SQLiteIndexConstraint"/> (and
+            <see cref="T:System.Data.SQLite.SQLiteIndexConstraintUsage"/>) instances to
+            pre-allocate space for.
+            </param>
+            <param name="nOrderBy">
+            The number of <see cref="T:System.Data.SQLite.SQLiteIndexOrderBy"/> instances to
+            pre-allocate space for.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndex.FromIntPtr(System.IntPtr,System.Data.SQLite.SQLiteIndex@)">
+            <summary>
+            Converts a native pointer to a native sqlite3_index_info structure
+            into a new <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance.
+            </summary>
+            <param name="pIndex">
+            The native pointer to the native sqlite3_index_info structure to
+            convert.
+            </param>
+            <param name="index">
+            Upon success, this parameter will be modified to contain the newly
+            created <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndex.ToIntPtr(System.Data.SQLite.SQLiteIndex,System.IntPtr)">
+            <summary>
+            Populates the outputs of a pre-allocated native sqlite3_index_info
+            structure using an existing <see cref="T:System.Data.SQLite.SQLiteIndex"/> object
+            instance.
+            </summary>
+            <param name="index">
+            The existing <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance containing
+            the output data to use.
+            </param>
+            <param name="pIndex">
+            The native pointer to the pre-allocated native sqlite3_index_info
+            structure.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndex.Inputs">
+            <summary>
+            The <see cref="T:System.Data.SQLite.SQLiteIndexInputs"/> object instance containing
+            the inputs to the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/>
+            method.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndex.Outputs">
+            <summary>
+            The <see cref="T:System.Data.SQLite.SQLiteIndexOutputs"/> object instance containing
+            the outputs from the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/>
+            method.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteVirtualTable">
+            <summary>
+            This class represents a managed virtual table implementation.  It is
+            not sealed and should be used as the base class for any user-defined
+            virtual table classes implemented in managed code.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTable.ModuleNameIndex">
+            <summary>
+            The index within the array of strings provided to the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> and
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> methods containing the
+            name of the module implementing this virtual table.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTable.DatabaseNameIndex">
+            <summary>
+            The index within the array of strings provided to the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> and
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> methods containing the
+            name of the database containing this virtual table.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTable.TableNameIndex">
+            <summary>
+            The index within the array of strings provided to the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> and
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> methods containing the
+            name of the virtual table.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.#ctor(System.String[])">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="arguments">
+            The original array of strings provided to the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> and
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> methods.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.BestIndex(System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            This method should normally be used by the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method in order to
+            perform index selection based on the constraints provided by the
+            SQLite core library.
+            </summary>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance containing all the
+            data for the inputs and outputs relating to index selection.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.Rename(System.String)">
+            <summary>
+            Attempts to record the renaming of the virtual table associated
+            with this object instance.
+            </summary>
+            <param name="name">
+            The new name for the virtual table.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.Dispose">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.Data.SQLite.SQLiteVirtualTable.Dispose"/> method.  Zero if this method is being called
+            from the finalizer.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.Finalize">
+            <summary>
+            Finalizes this object instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTable.Arguments">
+            <summary>
+            The original array of strings provided to the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> and
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> methods.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTable.ModuleName">
+            <summary>
+            The name of the module implementing this virtual table.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTable.DatabaseName">
+            <summary>
+            The name of the database containing this virtual table.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTable.TableName">
+            <summary>
+            The name of the virtual table.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTable.Index">
+            <summary>
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance containing all the
+            data for the inputs and outputs relating to the most recent index
+            selection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTable.NativeHandle">
+            <summary>
+            Returns the underlying SQLite native handle associated with this
+            object instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteVirtualTableCursor">
+            <summary>
+            This class represents a managed virtual table cursor implementation.
+            It is not sealed and should be used as the base class for any
+            user-defined virtual table cursor classes implemented in managed code.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTableCursor.InvalidRowIndex">
+            <summary>
+            This value represents an invalid integer row sequence number.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTableCursor.rowIndex">
+            <summary>
+            The field holds the integer row sequence number for the current row
+            pointed to by this cursor object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.#ctor(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this object instance.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.#ctor">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.TryPersistValues(System.Data.SQLite.SQLiteValue[])">
+            <summary>
+            Attempts to persist the specified <see cref="T:System.Data.SQLite.SQLiteValue"/> object
+            instances in order to make them available after the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method returns.
+            </summary>
+            <param name="values">
+            The array of <see cref="T:System.Data.SQLite.SQLiteValue"/> object instances to be
+            persisted.
+            </param>
+            <returns>
+            The number of <see cref="T:System.Data.SQLite.SQLiteValue"/> object instances that were
+            successfully persisted.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.Filter(System.Int32,System.String,System.Data.SQLite.SQLiteValue[])">
+            <summary>
+            This method should normally be used by the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method in order to
+            perform filtering of the result rows and/or to record the filtering
+            criteria provided by the SQLite core library.
+            </summary>
+            <param name="indexNumber">
+            Number used to help identify the selected index.
+            </param>
+            <param name="indexString">
+            String used to help identify the selected index.
+            </param>
+            <param name="values">
+            The values corresponding to each column in the selected index.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.GetRowIndex">
+            <summary>
+            Determines the integer row sequence number for the current row.
+            </summary>
+            <returns>
+            The integer row sequence number for the current row -OR- zero if
+            it cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.NextRowIndex">
+            <summary>
+            Adjusts the integer row sequence number so that it refers to the
+            next row.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.Dispose">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.Data.SQLite.SQLiteVirtualTableCursor.Dispose"/> method.  Zero if this method is being called
+            from the finalizer.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.Finalize">
+            <summary>
+            Finalizes this object instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursor.Table">
+            <summary>
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this object instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursor.IndexNumber">
+            <summary>
+            Number used to help identify the selected index.  This value will
+            be set via the <see cref="M:System.Data.SQLite.SQLiteVirtualTableCursor.Filter(System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursor.IndexString">
+            <summary>
+            String used to help identify the selected index.  This value will
+            be set via the <see cref="M:System.Data.SQLite.SQLiteVirtualTableCursor.Filter(System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursor.Values">
+            <summary>
+            The values used to filter the rows returned via this cursor object
+            instance.  This value will be set via the <see cref="M:System.Data.SQLite.SQLiteVirtualTableCursor.Filter(System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/>
+            method.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursor.NativeHandle">
+            <summary>
+            Returns the underlying SQLite native handle associated with this
+            object instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.ISQLiteNativeModule">
+            <summary>
+            This interface represents a virtual table implementation written in
+            native code.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            <para>
+            This method is called to create a new instance of a virtual table
+            in response to a CREATE VIRTUAL TABLE statement. The db parameter
+            is a pointer to the SQLite database connection that is executing
+            the CREATE VIRTUAL TABLE statement. The pAux argument is the copy
+            of the client data pointer that was the fourth argument to the
+            sqlite3_create_module() or sqlite3_create_module_v2() call that
+            registered the virtual table module. The argv parameter is an
+            array of argc pointers to null terminated strings. The first
+            string, argv[0], is the name of the module being invoked. The
+            module name is the name provided as the second argument to
+            sqlite3_create_module() and as the argument to the USING clause of
+            the CREATE VIRTUAL TABLE statement that is running. The second,
+            argv[1], is the name of the database in which the new virtual table
+            is being created. The database name is "main" for the primary
+            database, or "temp" for TEMP database, or the name given at the
+            end of the ATTACH statement for attached databases. The third
+            element of the array, argv[2], is the name of the new virtual
+            table, as specified following the TABLE keyword in the CREATE
+            VIRTUAL TABLE statement. If present, the fourth and subsequent
+            strings in the argv[] array report the arguments to the module name
+            in the CREATE VIRTUAL TABLE statement.
+            </para>
+            <para>
+            The job of this method is to construct the new virtual table object
+            (an sqlite3_vtab object) and return a pointer to it in *ppVTab.
+            </para>
+            <para>
+            As part of the task of creating a new sqlite3_vtab structure, this
+            method must invoke sqlite3_declare_vtab() to tell the SQLite core
+            about the columns and datatypes in the virtual table. The
+            sqlite3_declare_vtab() API has the following prototype:
+            </para>
+            <para>
+            <code>
+            int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable)
+            </code>
+            </para>
+            <para>
+            The first argument to sqlite3_declare_vtab() must be the same
+            database connection pointer as the first parameter to this method.
+            The second argument to sqlite3_declare_vtab() must a
+            zero-terminated UTF-8 string that contains a well-formed CREATE
+            TABLE statement that defines the columns in the virtual table and
+            their data types. The name of the table in this CREATE TABLE
+            statement is ignored, as are all constraints. Only the column names
+            and datatypes matter. The CREATE TABLE statement string need not to
+            be held in persistent memory. The string can be deallocated and/or
+            reused as soon as the sqlite3_declare_vtab() routine returns.
+            </para>
+            </summary>
+            <param name="pDb">
+            The native database connection handle.
+            </param>
+            <param name="pAux">
+            The original native pointer value that was provided to the
+            sqlite3_create_module(), sqlite3_create_module_v2() or
+            sqlite3_create_disposable_module() functions.
+            </param>
+            <param name="argc">
+            The number of arguments from the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="argv">
+            The array of string arguments from the CREATE VIRTUAL TABLE
+            statement.
+            </param>
+            <param name="pVtab">
+            Upon success, this parameter must be modified to point to the newly
+            created native sqlite3_vtab derived structure.
+            </param>
+            <param name="pError">
+            Upon failure, this parameter must be modified to point to the error
+            message, with the underlying memory having been obtained from the
+            sqlite3_malloc() function.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            <para>
+            The xConnect method is very similar to xCreate. It has the same
+            parameters and constructs a new sqlite3_vtab structure just like
+            xCreate. And it must also call sqlite3_declare_vtab() like xCreate.
+            </para>
+            <para>
+            The difference is that xConnect is called to establish a new
+            connection to an existing virtual table whereas xCreate is called
+            to create a new virtual table from scratch.
+            </para>
+            <para>
+            The xCreate and xConnect methods are only different when the
+            virtual table has some kind of backing store that must be
+            initialized the first time the virtual table is created. The
+            xCreate method creates and initializes the backing store. The
+            xConnect method just connects to an existing backing store.
+            </para>
+            <para>
+            As an example, consider a virtual table implementation that
+            provides read-only access to existing comma-separated-value (CSV)
+            files on disk. There is no backing store that needs to be created
+            or initialized for such a virtual table (since the CSV files
+            already exist on disk) so the xCreate and xConnect methods will be
+            identical for that module.
+            </para>
+            <para>
+            Another example is a virtual table that implements a full-text
+            index. The xCreate method must create and initialize data
+            structures to hold the dictionary and posting lists for that index.
+            The xConnect method, on the other hand, only has to locate and use
+            an existing dictionary and posting lists that were created by a
+            prior xCreate call.
+            </para>
+            <para>
+            The xConnect method must return SQLITE_OK if it is successful in
+            creating the new virtual table, or SQLITE_ERROR if it is not
+            successful. If not successful, the sqlite3_vtab structure must not
+            be allocated. An error message may optionally be returned in *pzErr
+            if unsuccessful. Space to hold the error message string must be
+            allocated using an SQLite memory allocation function like
+            sqlite3_malloc() or sqlite3_mprintf() as the SQLite core will
+            attempt to free the space using sqlite3_free() after the error has
+            been reported up to the application.
+            </para>
+            <para>
+            The xConnect method is required for every virtual table
+            implementation, though the xCreate and xConnect pointers of the
+            sqlite3_module object may point to the same function the virtual
+            table does not need to initialize backing store.
+            </para>
+            </summary>
+            <param name="pDb">
+            The native database connection handle.
+            </param>
+            <param name="pAux">
+            The original native pointer value that was provided to the
+            sqlite3_create_module(), sqlite3_create_module_v2() or
+            sqlite3_create_disposable_module() functions.
+            </param>
+            <param name="argc">
+            The number of arguments from the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="argv">
+            The array of string arguments from the CREATE VIRTUAL TABLE
+            statement.
+            </param>
+            <param name="pVtab">
+            Upon success, this parameter must be modified to point to the newly
+            created native sqlite3_vtab derived structure.
+            </param>
+            <param name="pError">
+            Upon failure, this parameter must be modified to point to the error
+            message, with the underlying memory having been obtained from the
+            sqlite3_malloc() function.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)">
+            <summary>
+            <para>
+            SQLite uses the xBestIndex method of a virtual table module to
+            determine the best way to access the virtual table. The xBestIndex
+            method has a prototype like this:
+            </para>
+            <code>
+            int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*);
+            </code>
+            <para>
+            The SQLite core communicates with the xBestIndex method by filling
+            in certain fields of the sqlite3_index_info structure and passing a
+            pointer to that structure into xBestIndex as the second parameter.
+            The xBestIndex method fills out other fields of this structure
+            which forms the reply. The sqlite3_index_info structure looks like
+            this:
+            </para>
+            <code>
+             struct sqlite3_index_info {
+               /* Inputs */
+               const int nConstraint;   /* Number of entries in aConstraint */
+               const struct sqlite3_index_constraint {
+                  int iColumn;          /* Column on left-hand side of
+                                         * constraint */
+                  unsigned char op;     /* Constraint operator */
+                  unsigned char usable; /* True if this constraint is usable */
+                  int iTermOffset;      /* Used internally - xBestIndex should
+                                         * ignore */
+               } *const aConstraint;    /* Table of WHERE clause constraints */
+               const int nOrderBy;      /* Number of terms in the ORDER BY
+                                         * clause */
+               const struct sqlite3_index_orderby {
+                  int iColumn;          /* Column number */
+                  unsigned char desc;   /* True for DESC.  False for ASC. */
+               } *const aOrderBy;       /* The ORDER BY clause */
+               /* Outputs */
+               struct sqlite3_index_constraint_usage {
+                 int argvIndex;         /* if greater than zero, constraint is
+                                         * part of argv to xFilter */
+                 unsigned char omit;    /* Do not code a test for this
+                                         * constraint */
+               } *const aConstraintUsage;
+               int idxNum;              /* Number used to identify the index */
+               char *idxStr;            /* String, possibly obtained from
+                                         * sqlite3_malloc() */
+               int needToFreeIdxStr;    /* Free idxStr using sqlite3_free() if
+                                         * true */
+               int orderByConsumed;     /* True if output is already ordered */
+               double estimatedCost;    /* Estimated cost of using this index */
+             };
+            </code>
+            <para>
+            In addition, there are some defined constants:
+            </para>
+            <code>
+             #define SQLITE_INDEX_CONSTRAINT_EQ    2
+             #define SQLITE_INDEX_CONSTRAINT_GT    4
+             #define SQLITE_INDEX_CONSTRAINT_LE    8
+             #define SQLITE_INDEX_CONSTRAINT_LT    16
+             #define SQLITE_INDEX_CONSTRAINT_GE    32
+             #define SQLITE_INDEX_CONSTRAINT_MATCH 64
+            </code>
+            <para>
+            The SQLite core calls the xBestIndex method when it is compiling a
+            query that involves a virtual table. In other words, SQLite calls
+            this method when it is running sqlite3_prepare() or the equivalent.
+            By calling this method, the SQLite core is saying to the virtual
+            table that it needs to access some subset of the rows in the
+            virtual table and it wants to know the most efficient way to do
+            that access. The xBestIndex method replies with information that
+            the SQLite core can then use to conduct an efficient search of the
+            virtual table.
+            </para>
+            <para>
+            While compiling a single SQL query, the SQLite core might call
+            xBestIndex multiple times with different settings in
+            sqlite3_index_info. The SQLite core will then select the
+            combination that appears to give the best performance.
+            </para>
+            <para>
+            Before calling this method, the SQLite core initializes an instance
+            of the sqlite3_index_info structure with information about the
+            query that it is currently trying to process. This information
+            derives mainly from the WHERE clause and ORDER BY or GROUP BY
+            clauses of the query, but also from any ON or USING clauses if the
+            query is a join. The information that the SQLite core provides to
+            the xBestIndex method is held in the part of the structure that is
+            marked as "Inputs". The "Outputs" section is initialized to zero.
+            </para>
+            <para>
+            The information in the sqlite3_index_info structure is ephemeral
+            and may be overwritten or deallocated as soon as the xBestIndex
+            method returns. If the xBestIndex method needs to remember any part
+            of the sqlite3_index_info structure, it should make a copy. Care
+            must be take to store the copy in a place where it will be
+            deallocated, such as in the idxStr field with needToFreeIdxStr set
+            to 1.
+            </para>
+            <para>
+            Note that xBestIndex will always be called before xFilter, since
+            the idxNum and idxStr outputs from xBestIndex are required inputs
+            to xFilter. However, there is no guarantee that xFilter will be
+            called following a successful xBestIndex.
+            </para>
+            <para>
+            The xBestIndex method is required for every virtual table
+            implementation.
+            </para>
+            <para>
+            2.3.1 Inputs
+            </para>
+            <para>
+            The main thing that the SQLite core is trying to communicate to the
+            virtual table is the constraints that are available to limit the
+            number of rows that need to be searched. The aConstraint[] array
+            contains one entry for each constraint. There will be exactly
+            nConstraint entries in that array.
+            </para>
+            <para>
+            Each constraint will correspond to a term in the WHERE clause or in
+            a USING or ON clause that is of the form
+            </para>
+            <code>
+                column OP EXPR
+            </code>
+            <para>
+            Where "column" is a column in the virtual table, OP is an operator
+            like "=" or "&lt;", and EXPR is an arbitrary expression. So, for
+            example, if the WHERE clause contained a term like this:
+            </para>
+            <code>
+                     a = 5
+            </code>
+            <para>
+            Then one of the constraints would be on the "a" column with
+            operator "=" and an expression of "5". Constraints need not have a
+            literal representation of the WHERE clause. The query optimizer
+            might make transformations to the WHERE clause in order to extract
+            as many constraints as it can. So, for example, if the WHERE clause
+            contained something like this:
+            </para>
+            <code>
+                     x BETWEEN 10 AND 100 AND 999&gt;y
+            </code>
+            <para>
+            The query optimizer might translate this into three separate
+            constraints:
+            </para>
+            <code>
+                     x &gt;= 10
+                     x &lt;= 100
+                     y &lt; 999
+            </code>
+            <para>
+            For each constraint, the aConstraint[].iColumn field indicates
+            which column appears on the left-hand side of the constraint. The
+            first column of the virtual table is column 0. The rowid of the
+            virtual table is column -1. The aConstraint[].op field indicates
+            which operator is used. The SQLITE_INDEX_CONSTRAINT_* constants map
+            integer constants into operator values. Columns occur in the order
+            they were defined by the call to sqlite3_declare_vtab() in the
+            xCreate or xConnect method. Hidden columns are counted when
+            determining the column index.
+            </para>
+            <para>
+            The aConstraint[] array contains information about all constraints
+            that apply to the virtual table. But some of the constraints might
+            not be usable because of the way tables are ordered in a join. The
+            xBestIndex method must therefore only consider constraints that
+            have an aConstraint[].usable flag which is true.
+            </para>
+            <para>
+            In addition to WHERE clause constraints, the SQLite core also tells
+            the xBestIndex method about the ORDER BY clause. (In an aggregate
+            query, the SQLite core might put in GROUP BY clause information in
+            place of the ORDER BY clause information, but this fact should not
+            make any difference to the xBestIndex method.) If all terms of the
+            ORDER BY clause are columns in the virtual table, then nOrderBy
+            will be the number of terms in the ORDER BY clause and the
+            aOrderBy[] array will identify the column for each term in the
+            order by clause and whether or not that column is ASC or DESC.
+            </para>
+            <para>
+            2.3.2 Outputs
+            </para>
+            <para>
+            Given all of the information above, the job of the xBestIndex
+            method it to figure out the best way to search the virtual table.
+            </para>
+            <para>
+            The xBestIndex method fills the idxNum and idxStr fields with
+            information that communicates an indexing strategy to the xFilter
+            method. The information in idxNum and idxStr is arbitrary as far as
+            the SQLite core is concerned. The SQLite core just copies the
+            information through to the xFilter method. Any desired meaning can
+            be assigned to idxNum and idxStr as long as xBestIndex and xFilter
+            agree on what that meaning is.
+            </para>
+            <para>
+            The idxStr value may be a string obtained from an SQLite memory
+            allocation function such as sqlite3_mprintf(). If this is the case,
+            then the needToFreeIdxStr flag must be set to true so that the
+            SQLite core will know to call sqlite3_free() on that string when it
+            has finished with it, and thus avoid a memory leak.
+            </para>
+            <para>
+            If the virtual table will output rows in the order specified by the
+            ORDER BY clause, then the orderByConsumed flag may be set to true.
+            If the output is not automatically in the correct order then
+            orderByConsumed must be left in its default false setting. This
+            will indicate to the SQLite core that it will need to do a separate
+            sorting pass over the data after it comes out of the virtual table.
+            </para>
+            <para>
+            The estimatedCost field should be set to the estimated number of
+            disk access operations required to execute this query against the
+            virtual table. The SQLite core will often call xBestIndex multiple
+            times with different constraints, obtain multiple cost estimates,
+            then choose the query plan that gives the lowest estimate.
+            </para>
+            <para>
+            The aConstraintUsage[] array contains one element for each of the
+            nConstraint constraints in the inputs section of the
+            sqlite3_index_info structure. The aConstraintUsage[] array is used
+            by xBestIndex to tell the core how it is using the constraints.
+            </para>
+            <para>
+            The xBestIndex method may set aConstraintUsage[].argvIndex entries
+            to values greater than one. Exactly one entry should be set to 1,
+            another to 2, another to 3, and so forth up to as many or as few as
+            the xBestIndex method wants. The EXPR of the corresponding
+            constraints will then be passed in as the argv[] parameters to
+            xFilter.
+            </para>
+            <para>
+            For example, if the aConstraint[3].argvIndex is set to 1, then when
+            xFilter is called, the argv[0] passed to xFilter will have the EXPR
+            value of the aConstraint[3] constraint.
+            </para>
+            <para>
+            By default, the SQLite core double checks all constraints on each
+            row of the virtual table that it receives. If such a check is
+            redundant, the xBestFilter method can suppress that double-check by
+            setting aConstraintUsage[].omit.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="pIndex">
+            The native pointer to the sqlite3_index_info structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)">
+            <summary>
+            <para>
+            This method releases a connection to a virtual table. Only the
+            sqlite3_vtab object is destroyed. The virtual table is not
+            destroyed and any backing store associated with the virtual table
+            persists. This method undoes the work of xConnect.
+            </para>
+            <para>
+            This method is a destructor for a connection to the virtual table.
+            Contrast this method with xDestroy. The xDestroy is a destructor
+            for the entire virtual table.
+            </para>
+            <para>
+            The xDisconnect method is required for every virtual table
+            implementation, though it is acceptable for the xDisconnect and
+            xDestroy methods to be the same function if that makes sense for
+            the particular virtual table.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)">
+            <summary>
+            <para>
+            This method releases a connection to a virtual table, just like the
+            xDisconnect method, and it also destroys the underlying table
+            implementation. This method undoes the work of xCreate.
+            </para>
+            <para>
+            The xDisconnect method is called whenever a database connection
+            that uses a virtual table is closed. The xDestroy method is only
+            called when a DROP TABLE statement is executed against the virtual
+            table.
+            </para>
+            <para>
+            The xDestroy method is required for every virtual table
+            implementation, though it is acceptable for the xDisconnect and
+            xDestroy methods to be the same function if that makes sense for
+            the particular virtual table.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)">
+            <summary>
+            <para>
+            The xOpen method creates a new cursor used for accessing (read
+            and/or writing) a virtual table. A successful invocation of this
+            method will allocate the memory for the sqlite3_vtab_cursor (or a
+            subclass), initialize the new object, and make *ppCursor point to
+            the new object. The successful call then returns SQLITE_OK.
+            </para>
+            <para>
+            For every successful call to this method, the SQLite core will
+            later invoke the xClose method to destroy the allocated cursor.
+            </para>
+            <para>
+            The xOpen method need not initialize the pVtab field of the
+            sqlite3_vtab_cursor structure. The SQLite core will take care of
+            that chore automatically.
+            </para>
+            <para>
+            A virtual table implementation must be able to support an arbitrary
+            number of simultaneously open cursors.
+            </para>
+            <para>
+            When initially opened, the cursor is in an undefined state. The
+            SQLite core will invoke the xFilter method on the cursor prior to
+            any attempt to position or read from the cursor.
+            </para>
+            <para>
+            The xOpen method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="pCursor">
+            Upon success, this parameter must be modified to point to the newly
+            created native sqlite3_vtab_cursor derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)">
+            <summary>
+            <para>
+            The xClose method closes a cursor previously opened by xOpen. The
+            SQLite core will always call xClose once for each cursor opened
+            using xOpen.
+            </para>
+            <para>
+            This method must release all resources allocated by the
+            corresponding xOpen call. The routine will not be called again even
+            if it returns an error. The SQLite core will not use the
+            sqlite3_vtab_cursor again after it has been closed.
+            </para>
+            <para>
+            The xClose method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            <para>
+            This method begins a search of a virtual table. The first argument
+            is a cursor opened by xOpen. The next two argument define a
+            particular search index previously chosen by xBestIndex. The
+            specific meanings of idxNum and idxStr are unimportant as long as
+            xFilter and xBestIndex agree on what that meaning is.
+            </para>
+            <para>
+            The xBestIndex function may have requested the values of certain
+            expressions using the aConstraintUsage[].argvIndex values of the
+            sqlite3_index_info structure. Those values are passed to xFilter
+            using the argc and argv parameters.
+            </para>
+            <para>
+            If the virtual table contains one or more rows that match the
+            search criteria, then the cursor must be left point at the first
+            row. Subsequent calls to xEof must return false (zero). If there
+            are no rows match, then the cursor must be left in a state that
+            will cause the xEof to return true (non-zero). The SQLite engine
+            will use the xColumn and xRowid methods to access that row content.
+            The xNext method will be used to advance to the next row.
+            </para>
+            <para>
+            This method must return SQLITE_OK if successful, or an sqlite error
+            code if an error occurs.
+            </para>
+            <para>
+            The xFilter method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <param name="idxNum">
+            Number used to help identify the selected index.
+            </param>
+            <param name="idxStr">
+            The native pointer to the UTF-8 encoded string containing the
+            string used to help identify the selected index.
+            </param>
+            <param name="argc">
+            The number of native pointers to sqlite3_value structures specified
+            in <paramref name="argv" />.
+            </param>
+            <param name="argv">
+            An array of native pointers to sqlite3_value structures containing
+            filtering criteria for the selected index.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)">
+            <summary>
+            <para>
+            The xNext method advances a virtual table cursor to the next row of
+            a result set initiated by xFilter. If the cursor is already
+            pointing at the last row when this routine is called, then the
+            cursor no longer points to valid data and a subsequent call to the
+            xEof method must return true (non-zero). If the cursor is
+            successfully advanced to another row of content, then subsequent
+            calls to xEof must return false (zero).
+            </para>
+            <para>
+            This method must return SQLITE_OK if successful, or an sqlite error
+            code if an error occurs.
+            </para>
+            <para>
+            The xNext method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)">
+            <summary>
+            <para>
+            The xEof method must return false (zero) if the specified cursor
+            currently points to a valid row of data, or true (non-zero)
+            otherwise. This method is called by the SQL engine immediately
+            after each xFilter and xNext invocation.
+            </para>
+            <para>
+            The xEof method is required for every virtual table implementation.
+            </para>
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <returns>
+            Non-zero if no more rows are available; zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)">
+            <summary>
+            <para>
+            The SQLite core invokes this method in order to find the value for
+            the N-th column of the current row. N is zero-based so the first
+            column is numbered 0. The xColumn method may return its result back
+            to SQLite using one of the following interface:
+            </para>
+            <code>
+                sqlite3_result_blob()
+                sqlite3_result_double()
+                sqlite3_result_int()
+                sqlite3_result_int64()
+                sqlite3_result_null()
+                sqlite3_result_text()
+                sqlite3_result_text16()
+                sqlite3_result_text16le()
+                sqlite3_result_text16be()
+                sqlite3_result_zeroblob()
+            </code>
+            <para>
+            If the xColumn method implementation calls none of the functions
+            above, then the value of the column defaults to an SQL NULL.
+            </para>
+            <para>
+            To raise an error, the xColumn method should use one of the
+            result_text() methods to set the error message text, then return an
+            appropriate error code. The xColumn method must return SQLITE_OK on
+            success.
+            </para>
+            <para>
+            The xColumn method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <param name="pContext">
+            The native pointer to the sqlite3_context structure to be used
+            for returning the specified column value to the SQLite core
+            library.
+            </param>
+            <param name="index">
+            The zero-based index corresponding to the column containing the
+            value to be returned.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)">
+            <summary>
+            <para>
+            A successful invocation of this method will cause *pRowid to be
+            filled with the rowid of row that the virtual table cursor pCur is
+            currently pointing at. This method returns SQLITE_OK on success. It
+            returns an appropriate error code on failure.
+            </para>
+            <para>
+            The xRowid method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <param name="rowId">
+            Upon success, this parameter must be modified to contain the unique
+            integer row identifier for the current row for the specified cursor.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)">
+            <summary>
+            <para>
+            All changes to a virtual table are made using the xUpdate method.
+            This one method can be used to insert, delete, or update.
+            </para>
+            <para>
+            The argc parameter specifies the number of entries in the argv
+            array. The value of argc will be 1 for a pure delete operation or
+            N+2 for an insert or replace or update where N is the number of
+            columns in the table. In the previous sentence, N includes any
+            hidden columns.
+            </para>
+            <para>
+            Every argv entry will have a non-NULL value in C but may contain
+            the SQL value NULL. In other words, it is always true that
+            argv[i]!=0 for i between 0 and argc-1. However, it might be the
+            case that sqlite3_value_type(argv[i])==SQLITE_NULL.
+            </para>
+            <para>
+            The argv[0] parameter is the rowid of a row in the virtual table
+            to be deleted. If argv[0] is an SQL NULL, then no deletion occurs.
+            </para>
+            <para>
+            The argv[1] parameter is the rowid of a new row to be inserted into
+            the virtual table. If argv[1] is an SQL NULL, then the
+            implementation must choose a rowid for the newly inserted row.
+            Subsequent argv[] entries contain values of the columns of the
+            virtual table, in the order that the columns were declared. The
+            number of columns will match the table declaration that the
+            xConnect or xCreate method made using the sqlite3_declare_vtab()
+            call. All hidden columns are included.
+            </para>
+            <para>
+            When doing an insert without a rowid (argc>1, argv[1] is an SQL
+            NULL), the implementation must set *pRowid to the rowid of the
+            newly inserted row; this will become the value returned by the
+            sqlite3_last_insert_rowid() function. Setting this value in all the
+            other cases is a harmless no-op; the SQLite engine ignores the
+            *pRowid return value if argc==1 or argv[1] is not an SQL NULL.
+            </para>
+            <para>
+            Each call to xUpdate will fall into one of cases shown below. Note
+            that references to argv[i] mean the SQL value held within the
+            argv[i] object, not the argv[i] object itself.
+            </para>
+            <code>
+                argc = 1
+            </code>
+            <para>
+                    The single row with rowid equal to argv[0] is deleted. No
+                    insert occurs.
+            </para>
+            <code>
+                argc > 1
+                argv[0] = NULL
+            </code>
+            <para>
+                    A new row is inserted with a rowid argv[1] and column
+                    values in argv[2] and following. If argv[1] is an SQL NULL,
+                    the a new unique rowid is generated automatically.
+            </para>
+            <code>
+                argc > 1
+                argv[0] ? NULL
+                argv[0] = argv[1]
+            </code>
+            <para>
+                    The row with rowid argv[0] is updated with new values in
+                    argv[2] and following parameters.
+            </para>
+            <code>
+                argc > 1
+                argv[0] ? NULL
+                argv[0] ? argv[1]
+            </code>
+            <para>
+                    The row with rowid argv[0] is updated with rowid argv[1]
+                    and new values in argv[2] and following parameters. This
+                    will occur when an SQL statement updates a rowid, as in
+                    the statement:
+            </para>
+            <code>
+                        UPDATE table SET rowid=rowid+1 WHERE ...;
+            </code>
+            <para>
+            The xUpdate method must return SQLITE_OK if and only if it is
+            successful. If a failure occurs, the xUpdate must return an
+            appropriate error code. On a failure, the pVTab->zErrMsg element
+            may optionally be replaced with error message text stored in memory
+            allocated from SQLite using functions such as sqlite3_mprintf() or
+            sqlite3_malloc().
+            </para>
+            <para>
+            If the xUpdate method violates some constraint of the virtual table
+            (including, but not limited to, attempting to store a value of the
+            wrong datatype, attempting to store a value that is too large or
+            too small, or attempting to change a read-only value) then the
+            xUpdate must fail with an appropriate error code.
+            </para>
+            <para>
+            There might be one or more sqlite3_vtab_cursor objects open and in
+            use on the virtual table instance and perhaps even on the row of
+            the virtual table when the xUpdate method is invoked. The
+            implementation of xUpdate must be prepared for attempts to delete
+            or modify rows of the table out from other existing cursors. If the
+            virtual table cannot accommodate such changes, the xUpdate method
+            must return an error code.
+            </para>
+            <para>
+            The xUpdate method is optional. If the xUpdate pointer in the
+            sqlite3_module for a virtual table is a NULL pointer, then the
+            virtual table is read-only.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="argc">
+            The number of new or modified column values contained in
+            <paramref name="argv" />.
+            </param>
+            <param name="argv">
+            The array of native pointers to sqlite3_value structures containing
+            the new or modified column values, if any.
+            </param>
+            <param name="rowId">
+            Upon success, this parameter must be modified to contain the unique
+            integer row identifier for the row that was inserted, if any.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)">
+            <summary>
+            <para>
+            This method begins a transaction on a virtual table. This is method
+            is optional. The xBegin pointer of sqlite3_module may be NULL.
+            </para>
+            <para>
+            This method is always followed by one call to either the xCommit or
+            xRollback method. Virtual table transactions do not nest, so the
+            xBegin method will not be invoked more than once on a single
+            virtual table without an intervening call to either xCommit or
+            xRollback. Multiple calls to other methods can and likely will
+            occur in between the xBegin and the corresponding xCommit or
+            xRollback.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)">
+            <summary>
+            <para>
+            This method signals the start of a two-phase commit on a virtual
+            table. This is method is optional. The xSync pointer of
+            sqlite3_module may be NULL.
+            </para>
+            <para>
+            This method is only invoked after call to the xBegin method and
+            prior to an xCommit or xRollback. In order to implement two-phase
+            commit, the xSync method on all virtual tables is invoked prior to
+            invoking the xCommit method on any virtual table. If any of the
+            xSync methods fail, the entire transaction is rolled back.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)">
+            <summary>
+            <para>
+            This method causes a virtual table transaction to commit. This is
+            method is optional. The xCommit pointer of sqlite3_module may be
+            NULL.
+            </para>
+            <para>
+            A call to this method always follows a prior call to xBegin and
+            xSync.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)">
+            <summary>
+            <para>
+            This method causes a virtual table transaction to rollback. This is
+            method is optional. The xRollback pointer of sqlite3_module may be
+            NULL.
+            </para>
+            <para>
+            A call to this method always follows a prior call to xBegin.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)">
+            <summary>
+            <para>
+            This method provides notification that the virtual table
+            implementation that the virtual table will be given a new name. If
+            this method returns SQLITE_OK then SQLite renames the table. If
+            this method returns an error code then the renaming is prevented.
+            </para>
+            <para>
+            The xRename method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="nArg">
+            The number of arguments to the function being sought.
+            </param>
+            <param name="zName">
+            The name of the function being sought.
+            </param>
+            <param name="callback">
+            Upon success, this parameter must be modified to contain the
+            delegate responsible for implementing the specified function.
+            </param>
+            <param name="pClientData">
+            Upon success, this parameter must be modified to contain the
+            native user-data pointer associated with
+            <paramref name="callback" />.
+            </param>
+            <returns>
+            Non-zero if the specified function was found; zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)">
+            <summary>
+            <para>
+            This method provides notification that the virtual table
+            implementation that the virtual table will be given a new name. If
+            this method returns SQLITE_OK then SQLite renames the table. If
+            this method returns an error code then the renaming is prevented.
+            </para>
+            <para>
+            The xRename method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="zNew">
+            The native pointer to the UTF-8 encoded string containing the new
+            name for the virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)">
+            <summary>
+            <para>
+            These methods provide the virtual table implementation an
+            opportunity to implement nested transactions. They are always
+            optional and will only be called in SQLite version 3.7.7 and later.
+            </para>
+            <para>
+            When xSavepoint(X,N) is invoked, that is a signal to the virtual
+            table X that it should save its current state as savepoint N. A
+            subsequent call to xRollbackTo(X,R) means that the state of the
+            virtual table should return to what it was when xSavepoint(X,R) was
+            last called. The call to xRollbackTo(X,R) will invalidate all
+            savepoints with N>R; none of the invalided savepoints will be
+            rolled back or released without first being reinitialized by a call
+            to xSavepoint(). A call to xRelease(X,M) invalidates all savepoints
+            where N>=M.
+            </para>
+            <para>
+            None of the xSavepoint(), xRelease(), or xRollbackTo() methods will
+            ever be called except in between calls to xBegin() and either
+            xCommit() or xRollback().
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="iSavepoint">
+            This is an integer identifier under which the the current state of
+            the virtual table should be saved.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)">
+            <summary>
+            <para>
+            These methods provide the virtual table implementation an
+            opportunity to implement nested transactions. They are always
+            optional and will only be called in SQLite version 3.7.7 and later.
+            </para>
+            <para>
+            When xSavepoint(X,N) is invoked, that is a signal to the virtual
+            table X that it should save its current state as savepoint N. A
+            subsequent call to xRollbackTo(X,R) means that the state of the
+            virtual table should return to what it was when xSavepoint(X,R) was
+            last called. The call to xRollbackTo(X,R) will invalidate all
+            savepoints with N>R; none of the invalided savepoints will be
+            rolled back or released without first being reinitialized by a call
+            to xSavepoint(). A call to xRelease(X,M) invalidates all savepoints
+            where N>=M.
+            </para>
+            <para>
+            None of the xSavepoint(), xRelease(), or xRollbackTo() methods will
+            ever be called except in between calls to xBegin() and either
+            xCommit() or xRollback().
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="iSavepoint">
+            This is an integer used to indicate that any saved states with an
+            identifier greater than or equal to this should be deleted by the
+            virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)">
+            <summary>
+            <para>
+            These methods provide the virtual table implementation an
+            opportunity to implement nested transactions. They are always
+            optional and will only be called in SQLite version 3.7.7 and later.
+            </para>
+            <para>
+            When xSavepoint(X,N) is invoked, that is a signal to the virtual
+            table X that it should save its current state as savepoint N. A
+            subsequent call to xRollbackTo(X,R) means that the state of the
+            virtual table should return to what it was when xSavepoint(X,R) was
+            last called. The call to xRollbackTo(X,R) will invalidate all
+            savepoints with N>R; none of the invalided savepoints will be
+            rolled back or released without first being reinitialized by a call
+            to xSavepoint(). A call to xRelease(X,M) invalidates all savepoints
+            where N>=M.
+            </para>
+            <para>
+            None of the xSavepoint(), xRelease(), or xRollbackTo() methods will
+            ever be called except in between calls to xBegin() and either
+            xCommit() or xRollback().
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="iSavepoint">
+            This is an integer identifier used to specify a specific saved
+            state for the virtual table for it to restore itself back to, which
+            should also have the effect of deleting all saved states with an
+            integer identifier greater than this one.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="T:System.Data.SQLite.ISQLiteManagedModule">
+            <summary>
+            This interface represents a virtual table implementation written in
+            managed code.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="connection">
+            The <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="pClientData">
+            The native user-data pointer associated with this module, as it was
+            provided to the SQLite core library when the native module instance
+            was created.
+            </param>
+            <param name="arguments">
+            The module name, database name, virtual table name, and all other
+            arguments passed to the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="table">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="error">
+            Upon failure, this parameter must be modified to contain an error
+            message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="connection">
+            The <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="pClientData">
+            The native user-data pointer associated with this module, as it was
+            provided to the SQLite core library when the native module instance
+            was created.
+            </param>
+            <param name="arguments">
+            The module name, database name, virtual table name, and all other
+            arguments passed to the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="table">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="error">
+            Upon failure, this parameter must be modified to contain an error
+            message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance containing all the
+            data for the inputs and outputs relating to index selection.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="cursor">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance associated
+            with the newly opened virtual table cursor.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="indexNumber">
+            Number used to help identify the selected index.
+            </param>
+            <param name="indexString">
+            String used to help identify the selected index.
+            </param>
+            <param name="values">
+            The values corresponding to each column in the selected index.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <returns>
+            Non-zero if no more rows are available; zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="context">
+            The <see cref="T:System.Data.SQLite.SQLiteContext"/> object instance to be used for
+            returning the specified column value to the SQLite core library.
+            </param>
+            <param name="index">
+            The zero-based index corresponding to the column containing the
+            value to be returned.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="rowId">
+            Upon success, this parameter must be modified to contain the unique
+            integer row identifier for the current row for the specified cursor.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="values">
+            The array of <see cref="T:System.Data.SQLite.SQLiteValue"/> object instances containing
+            the new or modified column values, if any.
+            </param>
+            <param name="rowId">
+            Upon success, this parameter must be modified to contain the unique
+            integer row identifier for the row that was inserted, if any.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Begin(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Sync(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Commit(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Rollback(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="argumentCount">
+            The number of arguments to the function being sought.
+            </param>
+            <param name="name">
+            The name of the function being sought.
+            </param>
+            <param name="function">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance responsible for
+            implementing the specified function.
+            </param>
+            <param name="pClientData">
+            Upon success, this parameter must be modified to contain the
+            native user-data pointer associated with
+            <paramref name="function"/>.
+            </param>
+            <returns>
+            Non-zero if the specified function was found; zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="newName">
+            The new name for the virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="savepoint">
+            This is an integer identifier under which the the current state of
+            the virtual table should be saved.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="savepoint">
+            This is an integer used to indicate that any saved states with an
+            identifier greater than or equal to this should be deleted by the
+            virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="savepoint">
+            This is an integer identifier used to specify a specific saved
+            state for the virtual table for it to restore itself back to, which
+            should also have the effect of deleting all saved states with an
+            integer identifier greater than this one.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="P:System.Data.SQLite.ISQLiteManagedModule.Declared">
+            <summary>
+            Returns non-zero if the schema for the virtual table has been
+            declared.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.ISQLiteManagedModule.Name">
+            <summary>
+            Returns the name of the module as it was registered with the SQLite
+            core library.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteMemory">
+            <summary>
+            This class contains static methods that are used to allocate,
+            manipulate, and free native memory provided by the SQLite core library.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMemory.Allocate(System.Int32)">
+            <summary>
+            Allocates at least the specified number of bytes of native memory
+            via the SQLite core library sqlite3_malloc() function and returns
+            the resulting native pointer.
+            </summary>
+            <param name="size">
+            The number of bytes to allocate.
+            </param>
+            <returns>
+            The native pointer that points to a block of memory of at least the
+            specified size -OR- <see cref="F:System.IntPtr.Zero"/> if the memory could
+            not be allocated.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMemory.Size(System.IntPtr)">
+            <summary>
+            Gets and returns the actual size of the specified memory block that
+            was previously obtained from the <see cref="M:System.Data.SQLite.SQLiteMemory.Allocate(System.Int32)"/> method.
+            </summary>
+            <param name="pMemory">
+            The native pointer to the memory block previously obtained from the
+            <see cref="M:System.Data.SQLite.SQLiteMemory.Allocate(System.Int32)"/> method.
+            </param>
+            <returns>
+            The actual size, in bytes, of the memory block specified via the
+            native pointer.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMemory.Free(System.IntPtr)">
+            <summary>
+            Frees a memory block previously obtained from the
+            <see cref="M:System.Data.SQLite.SQLiteMemory.Allocate(System.Int32)"/> method.
+            </summary>
+            <param name="pMemory">
+            The native pointer to the memory block previously obtained from the
+            <see cref="M:System.Data.SQLite.SQLiteMemory.Allocate(System.Int32)"/> method.
+            </param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteString">
+            <summary>
+            This class contains static methods that are used to deal with native
+            UTF-8 string pointers to be used with the SQLite core library.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteString.ThirtyBits">
+            <summary>
+            This is the maximum possible length for the native UTF-8 encoded
+            strings used with the SQLite core library.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteString.Utf8Encoding">
+            <summary>
+            This is the <see cref="T:System.Text.Encoding"/> object instance used to handle
+            conversions from/to UTF-8.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.GetUtf8BytesFromString(System.String)">
+            <summary>
+            Converts the specified managed string into the UTF-8 encoding and
+            returns the array of bytes containing its representation in that
+            encoding.
+            </summary>
+            <param name="value">
+            The managed string to convert.
+            </param>
+            <returns>
+            The array of bytes containing the representation of the managed
+            string in the UTF-8 encoding or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.GetStringFromUtf8Bytes(System.Byte[])">
+            <summary>
+            Converts the specified array of bytes representing a string in the
+            UTF-8 encoding and returns a managed string.
+            </summary>
+            <param name="bytes">
+            The array of bytes to convert.
+            </param>
+            <returns>
+            The managed string or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.ProbeForUtf8ByteLength(System.IntPtr,System.Int32)">
+            <summary>
+            Probes a native pointer to a string in the UTF-8 encoding for its
+            terminating NUL character, within the specified length limit.
+            </summary>
+            <param name="pValue">
+            The native NUL-terminated string pointer.
+            </param>
+            <param name="limit">
+            The maximum length of the native string, in bytes.
+            </param>
+            <returns>
+            The length of the native string, in bytes -OR- zero if the length
+            could not be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.StringFromUtf8IntPtr(System.IntPtr)">
+            <summary>
+            Converts the specified native NUL-terminated UTF-8 string pointer
+            into a managed string.
+            </summary>
+            <param name="pValue">
+            The native NUL-terminated UTF-8 string pointer.
+            </param>
+            <returns>
+            The managed string or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.StringFromUtf8IntPtr(System.IntPtr,System.Int32)">
+            <summary>
+            Converts the specified native UTF-8 string pointer of the specified
+            length into a managed string.
+            </summary>
+            <param name="pValue">
+            The native UTF-8 string pointer.
+            </param>
+            <param name="length">
+            The length of the native string, in bytes.
+            </param>
+            <returns>
+            The managed string or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.Utf8IntPtrFromString(System.String)">
+            <summary>
+            Converts the specified managed string into a native NUL-terminated
+            UTF-8 string pointer using memory obtained from the SQLite core
+            library.
+            </summary>
+            <param name="value">
+            The managed string to convert.
+            </param>
+            <returns>
+            The native NUL-terminated UTF-8 string pointer or
+            <see cref="F:System.IntPtr.Zero"/> upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.StringArrayFromUtf8SizeAndIntPtr(System.Int32,System.IntPtr)">
+            <summary>
+            Converts a logical array of native NUL-terminated UTF-8 string
+            pointers into an array of managed strings.
+            </summary>
+            <param name="argc">
+            The number of elements in the logical array of native
+            NUL-terminated UTF-8 string pointers.
+            </param>
+            <param name="argv">
+            The native pointer to the logical array of native NUL-terminated
+            UTF-8 string pointers to convert.
+            </param>
+            <returns>
+            The array of managed strings or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.Utf8IntPtrArrayFromStringArray(System.String[])">
+            <summary>
+            Converts an array of managed strings into an array of native
+            NUL-terminated UTF-8 string pointers.
+            </summary>
+            <param name="values">
+            The array of managed strings to convert.
+            </param>
+            <returns>
+            The array of native NUL-terminated UTF-8 string pointers or null
+            upon failure.
+            </returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteBytes">
+            <summary>
+            This class contains static methods that are used to deal with native
+            pointers to memory blocks that logically contain arrays of bytes to be
+            used with the SQLite core library.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBytes.FromIntPtr(System.IntPtr,System.Int32)">
+            <summary>
+            Converts a native pointer to a logical array of bytes of the
+            specified length into a managed byte array.
+            </summary>
+            <param name="pValue">
+            The native pointer to the logical array of bytes to convert.
+            </param>
+            <param name="length">
+            The length, in bytes, of the logical array of bytes to convert.
+            </param>
+            <returns>
+            The managed byte array or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBytes.ToIntPtr(System.Byte[])">
+            <summary>
+            Converts a managed byte array into a native pointer to a logical
+            array of bytes.
+            </summary>
+            <param name="value">
+            The managed byte array to convert.
+            </param>
+            <returns>
+            The native pointer to a logical byte array or null upon failure.
+            </returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteMarshal">
+            <summary>
+            This class contains static methods that are used to perform several
+            low-level data marshalling tasks between native and managed code.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.IntPtrForOffset(System.IntPtr,System.Int32)">
+            <summary>
+            Returns a new <see cref="T:System.IntPtr"/> object instance based on the
+            specified <see cref="T:System.IntPtr"/> object instance and an integer
+            offset.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location that the new
+            <see cref="T:System.IntPtr"/> object instance should point to.
+            </param>
+            <returns>
+            The new <see cref="T:System.IntPtr"/> object instance.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.RoundUp(System.Int32,System.Int32)">
+            <summary>
+            Rounds up an integer size to the next multiple of the alignment.
+            </summary>
+            <param name="size">
+            The size, in bytes, to be rounded up.
+            </param>
+            <param name="alignment">
+            The required alignment for the return value.
+            </param>
+            <returns>
+            The size, in bytes, rounded up to the next multiple of the
+            alignment.  This value may end up being the same as the original
+            size.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.NextOffsetOf(System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Determines the offset, in bytes, of the next structure member.
+            </summary>
+            <param name="offset">
+            The offset, in bytes, of the current structure member.
+            </param>
+            <param name="size">
+            The size, in bytes, of the current structure member.
+            </param>
+            <param name="alignment">
+            The alignment, in bytes, of the next structure member.
+            </param>
+            <returns>
+            The offset, in bytes, of the next structure member.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.ReadInt32(System.IntPtr,System.Int32)">
+            <summary>
+            Reads a <see cref="T:System.Int32"/> value from the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.Int32"/> value to be read is located.
+            </param>
+            <returns>
+            The <see cref="T:System.Int32"/> value at the specified memory location.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.ReadDouble(System.IntPtr,System.Int32)">
+            <summary>
+            Reads a <see cref="T:System.Double"/> value from the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.Double"/> to be read is located.
+            </param>
+            <returns>
+            The <see cref="T:System.Double"/> value at the specified memory location.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.ReadIntPtr(System.IntPtr,System.Int32)">
+            <summary>
+            Reads an <see cref="T:System.IntPtr"/> value from the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.IntPtr"/> value to be read is located.
+            </param>
+            <returns>
+            The <see cref="T:System.IntPtr"/> value at the specified memory location.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.WriteInt32(System.IntPtr,System.Int32,System.Int32)">
+            <summary>
+            Writes an <see cref="T:System.Int32"/> value to the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.Int32"/> value to be written is located.
+            </param>
+            <param name="value">
+            The <see cref="T:System.Int32"/> value to write.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.WriteInt64(System.IntPtr,System.Int32,System.Int64)">
+            <summary>
+            Writes an <see cref="T:System.Int64"/> value to the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.Int64"/> value to be written is located.
+            </param>
+            <param name="value">
+            The <see cref="T:System.Int64"/> value to write.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.WriteDouble(System.IntPtr,System.Int32,System.Double)">
+            <summary>
+            Writes a <see cref="T:System.Double"/> value to the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.Double"/> value to be written is located.
+            </param>
+            <param name="value">
+            The <see cref="T:System.Double"/> value to write.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.WriteIntPtr(System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            Writes a <see cref="T:System.IntPtr"/> value to the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.IntPtr"/> value to be written is located.
+            </param>
+            <param name="value">
+            The <see cref="T:System.IntPtr"/> value to write.
+            </param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteModule">
+            <summary>
+            This class represents a managed virtual table module implementation.
+            It is not sealed and must be used as the base class for any
+            user-defined virtual table module classes implemented in managed code.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.DefaultModuleVersion">
+            <summary>
+            The default version of the native sqlite3_module structure in use.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.nativeModule">
+            <summary>
+            This field is used to store the native sqlite3_module structure
+            associated with this object instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.destroyModule">
+            <summary>
+            This field is used to store the destructor delegate to be passed to
+            the SQLite core library via the sqlite3_create_disposable_module()
+            function.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.disposableModule">
+            <summary>
+            This field is used to store a pointer to the native sqlite3_module
+            structure returned by the sqlite3_create_disposable_module
+            function.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.tables">
+            <summary>
+            This field is used to store the virtual table instances associated
+            with this module.  The native pointer to the sqlite3_vtab derived
+            structure is used to key into this collection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.cursors">
+            <summary>
+            This field is used to store the virtual table cursor instances
+            associated with this module.  The native pointer to the
+            sqlite3_vtab_cursor derived structure is used to key into this
+            collection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.functions">
+            <summary>
+            This field is used to store the virtual table function instances
+            associated with this module.  The case-insensitive function name
+            and the number of arguments (with -1 meaning "any") are used to
+            construct the string that is used to key into this collection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.#ctor(System.String)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="name">
+            The name of the module.  This parameter cannot be null.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CreateDisposableModule(System.IntPtr)">
+            <summary>
+            Calls the native SQLite core library in order to create a new
+            disposable module containing the implementation of a virtual table.
+            </summary>
+            <param name="pDb">
+            The native database connection pointer to use.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xDestroyModule(System.IntPtr)">
+            <summary>
+            This method is called by the SQLite core library when the native
+            module associated with this object instance is being destroyed due
+            to its parent connection being closed.  It may also be called by
+            the "vtshim" module if/when the sqlite3_dispose_module() function
+            is called.
+            </summary>
+            <param name="pClientData">
+            The native user-data pointer associated with this module, as it was
+            provided to the SQLite core library when the native module instance
+            was created.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.AllocateNativeModule">
+            <summary>
+            Creates and returns the native sqlite_module structure using the
+            configured (or default) <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/>
+            interface implementation.
+            </summary>
+            <returns>
+            The native sqlite_module structure using the configured (or
+            default) <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface
+            implementation.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.AllocateNativeModule(System.Data.SQLite.ISQLiteNativeModule)">
+            <summary>
+            Creates and returns the native sqlite_module structure using the
+            specified <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface
+            implementation.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface implementation to
+            use.
+            </param>
+            <returns>
+            The native sqlite_module structure using the specified
+            <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface implementation.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CopyNativeModule(System.Data.SQLite.UnsafeNativeMethods.sqlite3_module)">
+            <summary>
+            Creates a copy of the specified
+            <see cref="T:System.Data.SQLite.UnsafeNativeMethods.sqlite3_module"/> object instance,
+            using default implementations for the contained delegates when
+            necessary.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.UnsafeNativeMethods.sqlite3_module"/> object
+            instance to copy.
+            </param>
+            <returns>
+            The new <see cref="T:System.Data.SQLite.UnsafeNativeMethods.sqlite3_module"/> object
+            instance.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CreateOrConnect(System.Boolean,System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            Calls one of the virtual table initialization methods.
+            </summary>
+            <param name="create">
+            Non-zero to call the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/>
+            method; otherwise, the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/>
+            method will be called.
+            </param>
+            <param name="pDb">
+            The native database connection handle.
+            </param>
+            <param name="pAux">
+            The original native pointer value that was provided to the
+            sqlite3_create_module(), sqlite3_create_module_v2() or
+            sqlite3_create_disposable_module() functions.
+            </param>
+            <param name="argc">
+            The number of arguments from the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="argv">
+            The array of string arguments from the CREATE VIRTUAL TABLE
+            statement.
+            </param>
+            <param name="pVtab">
+            Upon success, this parameter must be modified to point to the newly
+            created native sqlite3_vtab derived structure.
+            </param>
+            <param name="pError">
+            Upon failure, this parameter must be modified to point to the error
+            message, with the underlying memory having been obtained from the
+            sqlite3_malloc() function.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.DestroyOrDisconnect(System.Boolean,System.IntPtr)">
+            <summary>
+            Calls one of the virtual table finalization methods.
+            </summary>
+            <param name="destroy">
+            Non-zero to call the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/>
+            method; otherwise, the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method will be
+            called.
+            </param>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetTableError(System.Data.SQLite.SQLiteModule,System.IntPtr,System.Boolean,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance to be used.
+            </param>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="logErrors">
+            Non-zero if this error message should also be logged using the
+            <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetTableError(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteVirtualTable,System.Boolean,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance to be used.
+            </param>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance used to
+            lookup the native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="logErrors">
+            Non-zero if this error message should also be logged using the
+            <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetCursorError(System.Data.SQLite.SQLiteModule,System.IntPtr,System.Boolean,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance to be used.
+            </param>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure
+            used to get the native pointer to the sqlite3_vtab derived
+            structure.
+            </param>
+            <param name="logErrors">
+            Non-zero if this error message should also be logged using the
+            <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetCursorError(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteVirtualTableCursor,System.Boolean,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance to be used.
+            </param>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance used to
+            lookup the native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="logErrors">
+            Non-zero if this error message should also be logged using the
+            <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.GetNativeModuleImpl">
+            <summary>
+            Gets and returns the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface
+            implementation to be used when creating the native sqlite3_module
+            structure.  Derived classes may override this method to supply an
+            alternate implementation for the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/>
+            interface.
+            </summary>
+            <returns>
+            The <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface implementation to
+            be used when populating the native sqlite3_module structure.  If
+            the returned value is null, the private methods provided by the
+            <see cref="T:System.Data.SQLite.SQLiteModule"/> class and relating to the
+            <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface  will be used to
+            create the necessary delegates.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CreateNativeModuleImpl">
+            <summary>
+            Creates and returns the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/>
+            interface implementation corresponding to the current
+            <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance.
+            </summary>
+            <returns>
+            The <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface implementation
+            corresponding to the current <see cref="T:System.Data.SQLite.SQLiteModule"/> object
+            instance.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.AllocateTable">
+            <summary>
+            Allocates a native sqlite3_vtab derived structure and returns a
+            native pointer to it.
+            </summary>
+            <returns>
+            A native pointer to a native sqlite3_vtab derived structure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.ZeroTable(System.IntPtr)">
+            <summary>
+            Zeros out the fields of a native sqlite3_vtab derived structure.
+            </summary>
+            <param name="pVtab">
+            The native pointer to the native sqlite3_vtab derived structure to
+            zero.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.FreeTable(System.IntPtr)">
+            <summary>
+            Frees a native sqlite3_vtab structure using the provided native
+            pointer to it.
+            </summary>
+            <param name="pVtab">
+            A native pointer to a native sqlite3_vtab derived structure.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.AllocateCursor">
+            <summary>
+            Allocates a native sqlite3_vtab_cursor derived structure and
+            returns a native pointer to it.
+            </summary>
+            <returns>
+            A native pointer to a native sqlite3_vtab_cursor derived structure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.FreeCursor(System.IntPtr)">
+            <summary>
+            Frees a native sqlite3_vtab_cursor structure using the provided
+            native pointer to it.
+            </summary>
+            <param name="pCursor">
+            A native pointer to a native sqlite3_vtab_cursor derived structure.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.TableFromCursor(System.Data.SQLite.SQLiteModule,System.IntPtr)">
+            <summary>
+            Reads and returns the native pointer to the sqlite3_vtab derived
+            structure based on the native pointer to the sqlite3_vtab_cursor
+            derived structure.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance to be used.
+            </param>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure
+            from which to read the native pointer to the sqlite3_vtab derived
+            structure.
+            </param>
+            <returns>
+            The native pointer to the sqlite3_vtab derived structure -OR-
+            <see cref="F:System.IntPtr.Zero"/> if it cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.TableFromCursor(System.IntPtr)">
+            <summary>
+            Reads and returns the native pointer to the sqlite3_vtab derived
+            structure based on the native pointer to the sqlite3_vtab_cursor
+            derived structure.
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure
+            from which to read the native pointer to the sqlite3_vtab derived
+            structure.
+            </param>
+            <returns>
+            The native pointer to the sqlite3_vtab derived structure -OR-
+            <see cref="F:System.IntPtr.Zero"/> if it cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.TableFromIntPtr(System.IntPtr)">
+            <summary>
+            Looks up and returns the <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object
+            instance based on the native pointer to the sqlite3_vtab derived
+            structure.
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance or null if
+            the corresponding one cannot be found.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.TableToIntPtr(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            Allocates and returns a native pointer to a sqlite3_vtab derived
+            structure and creates an association between it and the specified
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance to be used
+            when creating the association.
+            </param>
+            <returns>
+            The native pointer to a sqlite3_vtab derived structure or
+            <see cref="F:System.IntPtr.Zero"/> if the method fails for any reason.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CursorFromIntPtr(System.IntPtr,System.IntPtr)">
+            <summary>
+            Looks up and returns the <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/>
+            object instance based on the native pointer to the
+            sqlite3_vtab_cursor derived structure.
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <returns>
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance or null
+            if the corresponding one cannot be found.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CursorToIntPtr(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            Allocates and returns a native pointer to a sqlite3_vtab_cursor
+            derived structure and creates an association between it and the
+            specified <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance to be
+            used when creating the association.
+            </param>
+            <returns>
+            The native pointer to a sqlite3_vtab_cursor derived structure or
+            <see cref="F:System.IntPtr.Zero"/> if the method fails for any reason.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.GetFunctionKey(System.Int32,System.String,System.Data.SQLite.SQLiteFunction)">
+            <summary>
+            Deterimines the key that should be used to identify and store the
+            <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance for the virtual table
+            (i.e. to be returned via the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method).
+            </summary>
+            <param name="argumentCount">
+            The number of arguments to the virtual table function.
+            </param>
+            <param name="name">
+            The name of the virtual table function.
+            </param>
+            <param name="function">
+            The <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance associated with
+            this virtual table function.
+            </param>
+            <returns>
+            The string that should be used to identify and store the virtual
+            table function instance.  This method cannot return null.  If null
+            is returned from this method, the behavior is undefined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.DeclareTable(System.Data.SQLite.SQLiteConnection,System.String,System.String@)">
+            <summary>
+            Attempts to declare the schema for the virtual table using the
+            specified database connection.
+            </summary>
+            <param name="connection">
+            The <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance to use when
+            declaring the schema of the virtual table.  This parameter may not
+            be null.
+            </param>
+            <param name="sql">
+            The string containing the CREATE TABLE statement that completely
+            describes the schema for the virtual table.  This parameter may not
+            be null.
+            </param>
+            <param name="error">
+            Upon failure, this parameter must be modified to contain an error
+            message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.DeclareFunction(System.Data.SQLite.SQLiteConnection,System.Int32,System.String,System.String@)">
+            <summary>
+            Calls the native SQLite core library in order to declare a virtual
+            table function in response to a call into the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/>
+            or <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> virtual table
+            methods.
+            </summary>
+            <param name="connection">
+            The <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance to use when
+            declaring the schema of the virtual table.
+            </param>
+            <param name="argumentCount">
+            The number of arguments to the function being declared.
+            </param>
+            <param name="name">
+            The name of the function being declared.
+            </param>
+            <param name="error">
+            Upon success, the contents of this parameter are undefined.  Upon
+            failure, it should contain an appropriate error message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetTableError(System.IntPtr,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetTableError(System.Data.SQLite.SQLiteVirtualTable,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance used to
+            lookup the native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetCursorError(System.Data.SQLite.SQLiteVirtualTableCursor,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance used to
+            lookup the native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetEstimatedCost(System.Data.SQLite.SQLiteIndex,System.Nullable{System.Double})">
+            <summary>
+            Modifies the specified <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance
+            to contain the specified estimated cost.
+            </summary>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance to modify.
+            </param>
+            <param name="estimatedCost">
+            The estimated cost value to use.  Using a null value means that the
+            default value provided by the SQLite core library should be used.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetEstimatedCost(System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            Modifies the specified <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance
+            to contain the default estimated cost.
+            </summary>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance to modify.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetEstimatedRows(System.Data.SQLite.SQLiteIndex,System.Nullable{System.Int64})">
+            <summary>
+            Modifies the specified <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance
+            to contain the specified estimated rows.
+            </summary>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance to modify.
+            </param>
+            <param name="estimatedRows">
+            The estimated rows value to use.  Using a null value means that the
+            default value provided by the SQLite core library should be used.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetEstimatedRows(System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            Modifies the specified <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance
+            to contain the default estimated rows.
+            </summary>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance to modify.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pDb">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pAux">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pError">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pDb">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pAux">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pError">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xBestIndex(System.IntPtr,System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <param name="pIndex">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xDisconnect(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xDestroy(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xOpen(System.IntPtr,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </param>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xClose(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="idxNum">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="idxStr">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xNext(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xEof(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="pContext">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xRowId(System.IntPtr,System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xBegin(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xSync(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xCommit(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xRollback(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="nArg">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="zName">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="callback">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xRename(System.IntPtr,System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <param name="zNew">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xSavepoint(System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="iSavepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xRelease(System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="iSavepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xRollbackTo(System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="iSavepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="connection">
+            The <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="pClientData">
+            The native user-data pointer associated with this module, as it was
+            provided to the SQLite core library when the native module instance
+            was created.
+            </param>
+            <param name="arguments">
+            The module name, database name, virtual table name, and all other
+            arguments passed to the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="table">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="error">
+            Upon failure, this parameter must be modified to contain an error
+            message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="connection">
+            The <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="pClientData">
+            The native user-data pointer associated with this module, as it was
+            provided to the SQLite core library when the native module instance
+            was created.
+            </param>
+            <param name="arguments">
+            The module name, database name, virtual table name, and all other
+            arguments passed to the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="table">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="error">
+            Upon failure, this parameter must be modified to contain an error
+            message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance containing all the
+            data for the inputs and outputs relating to index selection.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="cursor">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance associated
+            with the newly opened virtual table cursor.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="indexNumber">
+            Number used to help identify the selected index.
+            </param>
+            <param name="indexString">
+            String used to help identify the selected index.
+            </param>
+            <param name="values">
+            The values corresponding to each column in the selected index.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <returns>
+            Non-zero if no more rows are available; zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="context">
+            The <see cref="T:System.Data.SQLite.SQLiteContext"/> object instance to be used for
+            returning the specified column value to the SQLite core library.
+            </param>
+            <param name="index">
+            The zero-based index corresponding to the column containing the
+            value to be returned.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="rowId">
+            Upon success, this parameter must be modified to contain the unique
+            integer row identifier for the current row for the specified cursor.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="values">
+            The array of <see cref="T:System.Data.SQLite.SQLiteValue"/> object instances containing
+            the new or modified column values, if any.
+            </param>
+            <param name="rowId">
+            Upon success, this parameter must be modified to contain the unique
+            integer row identifier for the row that was inserted, if any.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Begin(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Sync(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Commit(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Rollback(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="argumentCount">
+            The number of arguments to the function being sought.
+            </param>
+            <param name="name">
+            The name of the function being sought.
+            </param>
+            <param name="function">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance responsible for
+            implementing the specified function.
+            </param>
+            <param name="pClientData">
+            Upon success, this parameter must be modified to contain the
+            native user-data pointer associated with
+            <paramref name="function"/>.
+            </param>
+            <returns>
+            Non-zero if the specified function was found; zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="newName">
+            The new name for the virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="savepoint">
+            This is an integer identifier under which the the current state of
+            the virtual table should be saved.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="savepoint">
+            This is an integer used to indicate that any saved states with an
+            identifier greater than or equal to this should be deleted by the
+            virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="savepoint">
+            This is an integer identifier used to specify a specific saved
+            state for the virtual table for it to restore itself back to, which
+            should also have the effect of deleting all saved states with an
+            integer identifier greater than this one.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Dispose">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.Data.SQLite.SQLiteModule.Dispose"/> method.  Zero if this method is being
+            called from the finalizer.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Finalize">
+            <summary>
+            Finalizes this object instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteModule.LogErrorsNoThrow">
+            <summary>
+            Returns or sets a boolean value indicating whether virtual table
+            errors should be logged using the <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteModule.LogExceptionsNoThrow">
+            <summary>
+            Returns or sets a boolean value indicating whether exceptions
+            caught in the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method,
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method, and the
+            <see cref="M:System.Data.SQLite.SQLiteModule.Dispose"/> method should be logged using the
+            <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteModule.LogErrors">
+            <summary>
+            Returns or sets a boolean value indicating whether virtual table
+            errors should be logged using the <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteModule.LogExceptions">
+            <summary>
+            Returns or sets a boolean value indicating whether exceptions
+            caught in the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method,
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method, and the
+            <see cref="M:System.Data.SQLite.SQLiteModule.Dispose"/> method should be logged using the
+            <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteModule.Declared">
+            <summary>
+            Returns non-zero if the schema for the virtual table has been
+            declared.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteModule.Name">
+            <summary>
+            Returns the name of the module as it was registered with the SQLite
+            core library.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteModule.SQLiteNativeModule">
+            <summary>
+            This class implements the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/>
+            interface by forwarding those method calls to the
+            <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance it contains.  If the
+            contained <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance is null, all
+            the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> methods simply generate an
+            error.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.DefaultLogErrors">
+            <summary>
+            This is the value that is always used for the "logErrors"
+            parameter to the various static error handling methods provided
+            by the <see cref="T:System.Data.SQLite.SQLiteModule"/> class.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.ModuleNotAvailableErrorMessage">
+            <summary>
+            This is the error message text used when the contained
+            <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance is not available
+            for any reason.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.module">
+            <summary>
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance used to provide
+            an implementation of the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/>
+            interface.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.#ctor(System.Data.SQLite.SQLiteModule)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance used to provide
+            an implementation of the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/>
+            interface.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.ModuleNotAvailableTableError(System.IntPtr)">
+            <summary>
+            Sets the table error message to one that indicates the native
+            module implementation is not available.
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            The value of <see cref="F:System.Data.SQLite.SQLiteErrorCode.Error"/>.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.ModuleNotAvailableCursorError(System.IntPtr)">
+            <summary>
+            Sets the table error message to one that indicates the native
+            module implementation is not available.
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived
+            structure.
+            </param>
+            <returns>
+            The value of <see cref="F:System.Data.SQLite.SQLiteErrorCode.Error"/>.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pDb">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pAux">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pError">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pDb">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pAux">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pError">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <param name="pIndex">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xDisconnect(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xDestroy(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </param>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xClose(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="idxNum">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="idxStr">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xNext(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xEof(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="pContext">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xBegin(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xSync(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xCommit(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xRollback(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="nArg">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="zName">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="callback">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <param name="zNew">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="iSavepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xRelease(System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="iSavepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="iSavepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.Dispose">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.Dispose"/> method.  Zero if this method is being
+            called from the finalizer.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.Finalize">
+            <summary>
+            Finalizes this object instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator">
+            <summary>
+            This class represents a virtual table cursor to be used with the
+            <see cref="T:System.Data.SQLite.SQLiteModuleEnumerable"/> class.  It is not sealed and may
+            be used as the base class for any user-defined virtual table cursor
+            class that wraps an <see cref="T:System.Collections.IEnumerator"/> object instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.enumerator">
+            <summary>
+            The <see cref="T:System.Collections.IEnumerator"/> instance provided when this cursor
+            was created.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.endOfEnumerator">
+            <summary>
+            This value will be non-zero if false has been returned from the
+            <see cref="M:System.Collections.IEnumerator.MoveNext"/> method.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.#ctor(System.Data.SQLite.SQLiteVirtualTable,System.Collections.IEnumerator)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this object instance.
+            </param>
+            <param name="enumerator">
+            The <see cref="T:System.Collections.IEnumerator"/> instance to expose as a virtual
+            table cursor.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.MoveNext">
+            <summary>
+            Advances to the next row of the virtual table cursor using the
+            <see cref="M:System.Collections.IEnumerator.MoveNext"/> method of the
+            <see cref="T:System.Collections.IEnumerator"/> object instance.
+            </summary>
+            <returns>
+            Non-zero if the current row is valid; zero otherwise.  If zero is
+            returned, no further rows are available.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.Reset">
+            <summary>
+            Resets the virtual table cursor position, also invalidating the
+            current row, using the <see cref="M:System.Collections.IEnumerator.Reset"/> method of
+            the <see cref="T:System.Collections.IEnumerator"/> object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.Close">
+            <summary>
+            Closes the virtual table cursor.  This method must not throw any
+            exceptions.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.CheckClosed">
+            <summary>
+            Throws an <see cref="T:System.InvalidOperationException"/> if the virtual
+            table cursor has been closed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.IDisposable.Dispose"/> method.  Zero if this method is
+            being called from the finalizer.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.Current">
+            <summary>
+            Returns the value for the current row of the virtual table cursor
+            using the <see cref="P:System.Collections.IEnumerator.Current"/> property of the
+            <see cref="T:System.Collections.IEnumerator"/> object instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.EndOfEnumerator">
+            <summary>
+            Returns non-zero if the end of the virtual table cursor has been
+            seen (i.e. no more rows are available, including the current one).
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.IsOpen">
+            <summary>
+            Returns non-zero if the virtual table cursor is open.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteModuleEnumerable">
+             <summary>
+             This class implements a virtual table module that exposes an
+             <see cref="T:System.Collections.IEnumerable"/> object instance as a read-only virtual
+             table.  It is not sealed and may be used as the base class for any
+             user-defined virtual table class that wraps an
+             <see cref="T:System.Collections.IEnumerable"/> object instance.  The following short
+             example shows it being used to treat an array of strings as a table
+             data source:
+             <code>
+               public static class Sample
+               {
+                 public static void Main()
+                 {
+                   using (SQLiteConnection connection = new SQLiteConnection(
+                       "Data Source=:memory:;"))
+                   {
+                     connection.Open();
+            
+                     connection.CreateModule(new SQLiteModuleEnumerable(
+                       "sampleModule", new string[] { "one", "two", "three" }));
+            
+                     using (SQLiteCommand command = connection.CreateCommand())
+                     {
+                       command.CommandText =
+                           "CREATE VIRTUAL TABLE t1 USING sampleModule;";
+            
+                       command.ExecuteNonQuery();
+                     }
+            
+                     using (SQLiteCommand command = connection.CreateCommand())
+                     {
+                       command.CommandText = "SELECT * FROM t1;";
+            
+                       using (SQLiteDataReader dataReader = command.ExecuteReader())
+                       {
+                         while (dataReader.Read())
+                           Console.WriteLine(dataReader[0].ToString());
+                       }
+                     }
+            
+                     connection.Close();
+                   }
+                 }
+               }
+             </code>
+             </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteModuleNoop">
+            <summary>
+            This class implements a virtual table module that does nothing by
+            providing "empty" implementations for all of the
+            <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface methods.  The result
+            codes returned by these "empty" method implementations may be
+            controlled on a per-method basis by using and/or overriding the
+            <see cref="M:System.Data.SQLite.SQLiteModuleNoop.GetDefaultResultCode"/>,
+            <see cref="M:System.Data.SQLite.SQLiteModuleNoop.ResultCodeToEofResult(System.Data.SQLite.SQLiteErrorCode)"/>,
+            <see cref="M:System.Data.SQLite.SQLiteModuleNoop.ResultCodeToFindFunctionResult(System.Data.SQLite.SQLiteErrorCode)"/>,
+            <see cref="M:System.Data.SQLite.SQLiteModuleNoop.GetMethodResultCode(System.String)"/>, and
+            <see cref="M:System.Data.SQLite.SQLiteModuleNoop.SetMethodResultCode(System.String,System.Data.SQLite.SQLiteErrorCode)"/> methods from within derived classes.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModuleNoop.resultCodes">
+            <summary>
+            This field is used to store the <see cref="T:System.Data.SQLite.SQLiteErrorCode"/>
+            values to return, on a per-method basis, for all methods that are
+            part of the <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.#ctor(System.String)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="name">
+            The name of the module.  This parameter cannot be null.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.GetDefaultResultCode">
+            <summary>
+            Determines the default <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value to be
+            returned by methods of the <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/>
+            interface that lack an overridden implementation in all classes
+            derived from the <see cref="T:System.Data.SQLite.SQLiteModuleNoop"/> class.
+            </summary>
+            <returns>
+            The <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value that should be returned
+            by all <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface methods unless
+            a more specific result code has been set for that interface method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.ResultCodeToEofResult(System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Converts a <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value into a boolean
+            return value for use with the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="resultCode">
+            The <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value to convert.
+            </param>
+            <returns>
+            The <see cref="T:System.Boolean"/> value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.ResultCodeToFindFunctionResult(System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Converts a <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value into a boolean
+            return value for use with the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="resultCode">
+            The <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value to convert.
+            </param>
+            <returns>
+            The <see cref="T:System.Boolean"/> value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.GetMethodResultCode(System.String)">
+            <summary>
+            Determines the <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value that should be
+            returned by the specified <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/>
+            interface method if it lack an overridden implementation.  If no
+            specific <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value is available (or set)
+            for the specified method, the <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value
+            returned by the <see cref="M:System.Data.SQLite.SQLiteModuleNoop.GetDefaultResultCode"/> method will be
+            returned instead.
+            </summary>
+            <param name="methodName">
+            The name of the method.  Currently, this method must be part of
+            the <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface.
+            </param>
+            <returns>
+            The <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value that should be returned
+            by the <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.SetMethodResultCode(System.String,System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Sets the <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value that should be
+            returned by the specified <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/>
+            interface method if it lack an overridden implementation.
+            </summary>
+            <param name="methodName">
+            The name of the method.  Currently, this method must be part of
+            the <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface.
+            </param>
+            <param name="resultCode">
+            The <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value that should be returned
+            by the <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface method.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </summary>
+            <param name="connection">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="arguments">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="error">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </summary>
+            <param name="connection">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="arguments">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="error">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Disconnect(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Destroy(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </param>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Close(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <param name="indexNumber">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <param name="indexString">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <param name="values">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Next(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <param name="context">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </param>
+            <param name="values">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Begin(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Begin(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Begin(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Begin(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Sync(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Sync(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Sync(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Sync(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Commit(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Commit(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Commit(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Commit(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Rollback(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rollback(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rollback(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rollback(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argumentCount">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </param>
+            <param name="name">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </param>
+            <param name="function">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </param>
+            <param name="newName">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </param>
+            <param name="savepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </param>
+            <param name="savepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </param>
+            <param name="savepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.IDisposable.Dispose"/> method.  Zero if this method is
+            being called from the finalizer.
+            </param>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModuleEnumerable.declareSql">
+            <summary>
+            The CREATE TABLE statement used to declare the schema for the
+            virtual table.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModuleEnumerable.enumerable">
+            <summary>
+            The <see cref="T:System.Collections.IEnumerable"/> instance containing the backing data
+            for the virtual table.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.#ctor(System.String,System.Collections.IEnumerable)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="name">
+            The name of the module.  This parameter cannot be null.
+            </param>
+            <param name="enumerable">
+            The <see cref="T:System.Collections.IEnumerable"/> instance to expose as a virtual
+            table.  This parameter cannot be null.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.GetSqlForDeclareTable">
+            <summary>
+            Determines the SQL statement used to declare the virtual table.
+            This method should be overridden in derived classes if they require
+            a custom virtual table schema.
+            </summary>
+            <returns>
+            The SQL statement used to declare the virtual table -OR- null if it
+            cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.CursorTypeMismatchError(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            Sets the table error message to one that indicates the virtual
+            table cursor is of the wrong type.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance.
+            </param>
+            <returns>
+            The value of <see cref="F:System.Data.SQLite.SQLiteErrorCode.Error"/>.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.CursorEndOfEnumeratorError(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            Sets the table error message to one that indicates the virtual
+            table cursor has no current row.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance.
+            </param>
+            <returns>
+            The value of <see cref="F:System.Data.SQLite.SQLiteErrorCode.Error"/>.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.GetStringFromObject(System.Data.SQLite.SQLiteVirtualTableCursor,System.Object)">
+            <summary>
+            Determines the string to return as the column value for the object
+            instance value.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="value">
+            The object instance to return a string representation for.
+            </param>
+            <returns>
+            The string representation of the specified object instance or null
+            upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.MakeRowId(System.Int32,System.Int32)">
+            <summary>
+            Constructs an <see cref="T:System.Int64"/> unique row identifier from two
+            <see cref="T:System.Int32"/> values.  The first <see cref="T:System.Int32"/> value
+            must contain the row sequence number for the current row and the
+            second value must contain the hash code of the enumerator value
+            for the current row.
+            </summary>
+            <param name="rowIndex">
+            The integer row sequence number for the current row.
+            </param>
+            <param name="hashCode">
+            The hash code of the enumerator value for the current row.
+            </param>
+            <returns>
+            The unique row identifier or zero upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.GetRowIdFromObject(System.Data.SQLite.SQLiteVirtualTableCursor,System.Object)">
+            <summary>
+            Determines the unique row identifier for the current row.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="value">
+            The object instance to return a unique row identifier for.
+            </param>
+            <returns>
+            The unique row identifier or zero upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </summary>
+            <param name="connection">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="arguments">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="error">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </summary>
+            <param name="connection">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="arguments">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="error">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Disconnect(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Destroy(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </param>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Close(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <param name="indexNumber">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <param name="indexString">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <param name="values">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Next(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <param name="context">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </param>
+            <param name="values">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </param>
+            <param name="newName">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.IDisposable.Dispose"/> method.  Zero if this method is
+            being called from the finalizer.
+            </param>
+        </member>
+        <member name="T:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1">
+            <summary>
+            This class represents a virtual table cursor to be used with the
+            <see cref="T:System.Data.SQLite.SQLiteModuleEnumerable"/> class.  It is not sealed and may
+            be used as the base class for any user-defined virtual table cursor
+            class that wraps an <see cref="T:System.Collections.Generic.IEnumerator`1"/> object instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.enumerator">
+            <summary>
+            The <see cref="T:System.Collections.Generic.IEnumerator`1"/> instance provided when this
+            cursor was created.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.#ctor(System.Data.SQLite.SQLiteVirtualTable,System.Collections.Generic.IEnumerator{`0})">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this object instance.
+            </param>
+            <param name="enumerator">
+            The <see cref="T:System.Collections.Generic.IEnumerator`1"/> instance to expose as a virtual
+            table cursor.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.Close">
+            <summary>
+            Closes the virtual table cursor.  This method must not throw any
+            exceptions.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.IDisposable.Dispose"/> method.  Zero if this method is
+            being called from the finalizer.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.System#Collections#Generic#IEnumerator{T}#Current">
+            <summary>
+            Returns the value for the current row of the virtual table cursor
+            using the <see cref="P:System.Collections.Generic.IEnumerator`1.Current"/> property of the
+            <see cref="T:System.Collections.Generic.IEnumerator`1"/> object instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1">
+            <summary>
+            This class implements a virtual table module that exposes an
+            <see cref="T:System.Collections.Generic.IEnumerable`1"/> object instance as a read-only virtual
+            table.  It is not sealed and may be used as the base class for any
+            user-defined virtual table class that wraps an
+            <see cref="T:System.Collections.Generic.IEnumerable`1"/> object instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.enumerable">
+            <summary>
+            The <see cref="T:System.Collections.Generic.IEnumerable`1"/> instance containing the backing
+            data for the virtual table.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.#ctor(System.String,System.Collections.Generic.IEnumerable{`0})">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="name">
+            The name of the module.  This parameter cannot be null.
+            </param>
+            <param name="enumerable">
+            The <see cref="T:System.Collections.Generic.IEnumerable`1"/> instance to expose as a virtual
+            table.  This parameter cannot be null.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </param>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <param name="context">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.IDisposable.Dispose"/> method.  Zero if this method is
+            being called from the finalizer.
+            </param>
+        </member>
+    </members>
+</doc>
Binary file packages/System.Data.SQLite.1.0.90.0/lib/net45/System.Data.SQLite.Linq.dll has changed
Binary file packages/System.Data.SQLite.1.0.90.0/lib/net45/System.Data.SQLite.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/System.Data.SQLite.1.0.90.0/lib/net45/System.Data.SQLite.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12758 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>System.Data.SQLite</name>
+    </assembly>
+    <members>
+        <member name="T:System.Data.SQLite.AssemblySourceIdAttribute">
+            <summary>
+            Defines a source code identifier custom attribute for an assembly
+            manifest.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.AssemblySourceIdAttribute.#ctor(System.String)">
+            <summary>
+            Constructs an instance of this attribute class using the specified
+            source code identifier value.
+            </summary>
+            <param name="value">
+            The source code identifier value to use.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.AssemblySourceIdAttribute.SourceId">
+            <summary>
+            Gets the source code identifier value.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.AssemblySourceTimeStampAttribute">
+            <summary>
+            Defines a source code time-stamp custom attribute for an assembly
+            manifest.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.AssemblySourceTimeStampAttribute.#ctor(System.String)">
+            <summary>
+            Constructs an instance of this attribute class using the specified
+            source code time-stamp value.
+            </summary>
+            <param name="value">
+            The source code time-stamp value to use.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.AssemblySourceTimeStampAttribute.SourceTimeStamp">
+            <summary>
+            Gets the source code time-stamp value.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteLogCallback">
+             <summary>
+             This is the method signature for the SQLite core library logging callback
+             function for use with sqlite3_log() and the SQLITE_CONFIG_LOG.
+            
+             WARNING: This delegate is used more-or-less directly by native code, do
+                      not modify its type signature.
+             </summary>
+             <param name="pUserData">
+             The extra data associated with this message, if any.
+             </param>
+             <param name="errorCode">
+             The error code associated with this message.
+             </param>
+             <param name="pMessage">
+             The message string to be logged.
+             </param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLite3">
+            <summary>
+            This class implements SQLiteBase completely, and is the guts of the code that interop's SQLite with .NET
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteBase">
+            <summary>
+            This internal class provides the foundation of SQLite support.  It defines all the abstract members needed to implement
+            a SQLite data provider, and inherits from SQLiteConvert which allows for simple translations of string to and from SQLite.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConvert">
+            <summary>
+            This base class provides datatype conversion services for the SQLite provider.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert.FullFormat">
+            <summary>
+            The format string for DateTime values when using the InvariantCulture or CurrentCulture formats.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert.UnixEpoch">
+            <summary>
+            The value for the Unix epoch (e.g. January 1, 1970 at midnight, in UTC).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert.OleAutomationEpochAsJulianDay">
+            <summary>
+            The value of the OLE Automation epoch represented as a Julian day.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._datetimeFormats">
+            <summary>
+            An array of ISO-8601 DateTime formats that we support parsing.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._datetimeFormatUtc">
+            <summary>
+            The internal default format for UTC DateTime values when converting
+            to a string.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._datetimeFormatLocal">
+            <summary>
+            The internal default format for local DateTime values when converting
+            to a string.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._utf8">
+            <summary>
+            An UTF-8 Encoding instance, so we can convert strings to and from UTF-8
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._datetimeFormat">
+            <summary>
+            The default DateTime format for this instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._datetimeKind">
+            <summary>
+            The default DateTimeKind for this instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._datetimeFormatString">
+            <summary>
+            The default DateTime format string for this instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.#ctor(System.Data.SQLite.SQLiteDateFormats,System.DateTimeKind,System.String)">
+            <summary>
+            Initializes the conversion class
+            </summary>
+            <param name="fmt">The default date/time format to use for this instance</param>
+            <param name="kind">The DateTimeKind to use.</param>
+            <param name="fmtString">The DateTime format string to use.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToUTF8(System.String)">
+            <summary>
+            Converts a string to a UTF-8 encoded byte array sized to include a null-terminating character.
+            </summary>
+            <param name="sourceText">The string to convert to UTF-8</param>
+            <returns>A byte array containing the converted string plus an extra 0 terminating byte at the end of the array.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToUTF8(System.DateTime)">
+            <summary>
+            Convert a DateTime to a UTF-8 encoded, zero-terminated byte array.
+            </summary>
+            <remarks>
+            This function is a convenience function, which first calls ToString() on the DateTime, and then calls ToUTF8() with the
+            string result.
+            </remarks>
+            <param name="dateTimeValue">The DateTime to convert.</param>
+            <returns>The UTF-8 encoded string, including a 0 terminating byte at the end of the array.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToString(System.IntPtr,System.Int32)">
+            <summary>
+            Converts a UTF-8 encoded IntPtr of the specified length into a .NET string
+            </summary>
+            <param name="nativestring">The pointer to the memory where the UTF-8 string is encoded</param>
+            <param name="nativestringlen">The number of bytes to decode</param>
+            <returns>A string containing the translated character(s)</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.UTF8ToString(System.IntPtr,System.Int32)">
+            <summary>
+            Converts a UTF-8 encoded IntPtr of the specified length into a .NET string
+            </summary>
+            <param name="nativestring">The pointer to the memory where the UTF-8 string is encoded</param>
+            <param name="nativestringlen">The number of bytes to decode</param>
+            <returns>A string containing the translated character(s)</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.String)">
+            <summary>
+            Converts a string into a DateTime, using the DateTimeFormat, DateTimeKind,
+            and DateTimeFormatString specified for the connection when it was opened.
+            </summary>
+            <remarks>
+            Acceptable ISO8601 DateTime formats are:
+            <list type="bullet">
+            <item><description>THHmmssK</description></item>
+            <item><description>THHmmK</description></item>
+            <item><description>HH:mm:ss.FFFFFFFK</description></item>
+            <item><description>HH:mm:ssK</description></item>
+            <item><description>HH:mmK</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ss.FFFFFFFK</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ssK</description></item>
+            <item><description>yyyy-MM-dd HH:mmK</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ss.FFFFFFFK</description></item>
+            <item><description>yyyy-MM-ddTHH:mmK</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ssK</description></item>
+            <item><description>yyyyMMddHHmmssK</description></item>
+            <item><description>yyyyMMddHHmmK</description></item>
+            <item><description>yyyyMMddTHHmmssFFFFFFFK</description></item>
+            <item><description>THHmmss</description></item>
+            <item><description>THHmm</description></item>
+            <item><description>HH:mm:ss.FFFFFFF</description></item>
+            <item><description>HH:mm:ss</description></item>
+            <item><description>HH:mm</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ss.FFFFFFF</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ss</description></item>
+            <item><description>yyyy-MM-dd HH:mm</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ss.FFFFFFF</description></item>
+            <item><description>yyyy-MM-ddTHH:mm</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ss</description></item>
+            <item><description>yyyyMMddHHmmss</description></item>
+            <item><description>yyyyMMddHHmm</description></item>
+            <item><description>yyyyMMddTHHmmssFFFFFFF</description></item>
+            <item><description>yyyy-MM-dd</description></item>
+            <item><description>yyyyMMdd</description></item>
+            <item><description>yy-MM-dd</description></item>
+            </list>
+            If the string cannot be matched to one of the above formats -OR-
+            the DateTimeFormatString if one was provided, an exception will
+            be thrown.
+            </remarks>
+            <param name="dateText">The string containing either a long integer number of 100-nanosecond units since
+            System.DateTime.MinValue, a Julian day double, an integer number of seconds since the Unix epoch, a
+            culture-independent formatted date and time string, a formatted date and time string in the current
+            culture, or an ISO8601-format string.</param>
+            <returns>A DateTime value</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.String,System.Data.SQLite.SQLiteDateFormats,System.DateTimeKind,System.String)">
+            <summary>
+            Converts a string into a DateTime, using the specified DateTimeFormat,
+            DateTimeKind and DateTimeFormatString.
+            </summary>
+            <remarks>
+            Acceptable ISO8601 DateTime formats are:
+            <list type="bullet">
+            <item><description>THHmmssK</description></item>
+            <item><description>THHmmK</description></item>
+            <item><description>HH:mm:ss.FFFFFFFK</description></item>
+            <item><description>HH:mm:ssK</description></item>
+            <item><description>HH:mmK</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ss.FFFFFFFK</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ssK</description></item>
+            <item><description>yyyy-MM-dd HH:mmK</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ss.FFFFFFFK</description></item>
+            <item><description>yyyy-MM-ddTHH:mmK</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ssK</description></item>
+            <item><description>yyyyMMddHHmmssK</description></item>
+            <item><description>yyyyMMddHHmmK</description></item>
+            <item><description>yyyyMMddTHHmmssFFFFFFFK</description></item>
+            <item><description>THHmmss</description></item>
+            <item><description>THHmm</description></item>
+            <item><description>HH:mm:ss.FFFFFFF</description></item>
+            <item><description>HH:mm:ss</description></item>
+            <item><description>HH:mm</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ss.FFFFFFF</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ss</description></item>
+            <item><description>yyyy-MM-dd HH:mm</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ss.FFFFFFF</description></item>
+            <item><description>yyyy-MM-ddTHH:mm</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ss</description></item>
+            <item><description>yyyyMMddHHmmss</description></item>
+            <item><description>yyyyMMddHHmm</description></item>
+            <item><description>yyyyMMddTHHmmssFFFFFFF</description></item>
+            <item><description>yyyy-MM-dd</description></item>
+            <item><description>yyyyMMdd</description></item>
+            <item><description>yy-MM-dd</description></item>
+            </list>
+            If the string cannot be matched to one of the above formats -OR-
+            the DateTimeFormatString if one was provided, an exception will
+            be thrown.
+            </remarks>
+            <param name="dateText">The string containing either a long integer number of 100-nanosecond units since
+            System.DateTime.MinValue, a Julian day double, an integer number of seconds since the Unix epoch, a
+            culture-independent formatted date and time string, a formatted date and time string in the current
+            culture, or an ISO8601-format string.</param>
+            <param name="format">The SQLiteDateFormats to use.</param>
+            <param name="kind">The DateTimeKind to use.</param>
+            <param name="formatString">The DateTime format string to use.</param>
+            <returns>A DateTime value</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.Double)">
+            <summary>
+            Converts a julianday value into a DateTime
+            </summary>
+            <param name="julianDay">The value to convert</param>
+            <returns>A .NET DateTime</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.Double,System.DateTimeKind)">
+            <summary>
+            Converts a julianday value into a DateTime
+            </summary>
+            <param name="julianDay">The value to convert</param>
+            <param name="kind">The DateTimeKind to use.</param>
+            <returns>A .NET DateTime</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.Int32,System.DateTimeKind)">
+            <summary>
+            Converts the specified number of seconds from the Unix epoch into a
+            <see cref="T:System.DateTime"/> value.
+            </summary>
+            <param name="seconds">
+            The number of whole seconds since the Unix epoch.
+            </param>
+            <param name="kind">
+            Either Utc or Local time.
+            </param>
+            <returns>
+            The new <see cref="T:System.DateTime"/> value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.Int64,System.DateTimeKind)">
+            <summary>
+            Converts the specified number of ticks since the epoch into a
+            <see cref="T:System.DateTime"/> value.
+            </summary>
+            <param name="ticks">
+            The number of whole ticks since the epoch.
+            </param>
+            <param name="kind">
+            Either Utc or Local time.
+            </param>
+            <returns>
+            The new <see cref="T:System.DateTime"/> value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToJulianDay(System.DateTime)">
+            <summary>
+            Converts a DateTime struct to a JulianDay double
+            </summary>
+            <param name="value">The DateTime to convert</param>
+            <returns>The JulianDay value the Datetime represents</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToUnixEpoch(System.DateTime)">
+            <summary>
+            Converts a DateTime struct to the whole number of seconds since the
+            Unix epoch.
+            </summary>
+            <param name="value">The DateTime to convert</param>
+            <returns>The whole number of seconds since the Unix epoch</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.GetDateTimeKindFormat(System.DateTimeKind,System.String)">
+            <summary>
+            Returns the DateTime format string to use for the specified DateTimeKind.
+            If <paramref name="formatString" /> is not null, it will be returned verbatim.
+            </summary>
+            <param name="kind">The DateTimeKind to use.</param>
+            <param name="formatString">The DateTime format string to use.</param>
+            <returns>
+            The DateTime format string to use for the specified DateTimeKind.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToString(System.DateTime)">
+            <summary>
+            Converts a string into a DateTime, using the DateTimeFormat, DateTimeKind,
+            and DateTimeFormatString specified for the connection when it was opened.
+            </summary>
+            <param name="dateValue">The DateTime value to convert</param>
+            <returns>Either a string containing the long integer number of 100-nanosecond units since System.DateTime.MinValue, a
+            Julian day double, an integer number of seconds since the Unix epoch, a culture-independent formatted date and time
+            string, a formatted date and time string in the current culture, or an ISO8601-format date/time string.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.IntPtr,System.Int32)">
+            <summary>
+            Internal function to convert a UTF-8 encoded IntPtr of the specified length to a DateTime.
+            </summary>
+            <remarks>
+            This is a convenience function, which first calls ToString() on the IntPtr to convert it to a string, then calls
+            ToDateTime() on the string to return a DateTime.
+            </remarks>
+            <param name="ptr">A pointer to the UTF-8 encoded string</param>
+            <param name="len">The length in bytes of the string</param>
+            <returns>The parsed DateTime value</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.Split(System.String,System.Char)">
+            <summary>
+            Smart method of splitting a string.  Skips quoted elements, removes the quotes.
+            </summary>
+            <remarks>
+            This split function works somewhat like the String.Split() function in that it breaks apart a string into
+            pieces and returns the pieces as an array.  The primary differences are:
+            <list type="bullet">
+            <item><description>Only one character can be provided as a separator character</description></item>
+            <item><description>Quoted text inside the string is skipped over when searching for the separator, and the quotes are removed.</description></item>
+            </list>
+            Thus, if splitting the following string looking for a comma:<br/>
+            One,Two, "Three, Four", Five<br/>
+            <br/>
+            The resulting array would contain<br/>
+            [0] One<br/>
+            [1] Two<br/>
+            [2] Three, Four<br/>
+            [3] Five<br/>
+            <br/>
+            Note that the leading and trailing spaces were removed from each item during the split.
+            </remarks>
+            <param name="source">Source string to split apart</param>
+            <param name="separator">Separator character</param>
+            <returns>A string array of the split up elements</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.NewSplit(System.String,System.Char,System.Boolean,System.String@)">
+            <summary>
+            Splits the specified string into multiple strings based on a separator
+            and returns the result as an array of strings.
+            </summary>
+            <param name="value">
+            The string to split into pieces based on the separator character.  If
+            this string is null, null will always be returned.  If this string is
+            empty, an array of zero strings will always be returned.
+            </param>
+            <param name="separator">
+            The character used to divide the original string into sub-strings.
+            This character cannot be a backslash or a double-quote; otherwise, no
+            work will be performed and null will be returned.
+            </param>
+            <param name="keepQuote">
+            If this parameter is non-zero, all double-quote characters will be
+            retained in the returned list of strings; otherwise, they will be
+            dropped.
+            </param>
+            <param name="error">
+            Upon failure, this parameter will be modified to contain an appropriate
+            error message.
+            </param>
+            <returns>
+            The new array of strings or null if the input string is null -OR- the
+            separator character is a backslash or a double-quote -OR- the string
+            contains an unbalanced backslash or double-quote character.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToBoolean(System.Object)">
+            <summary>
+            Convert a value to true or false.
+            </summary>
+            <param name="source">A string or number representing true or false</param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToBoolean(System.String)">
+            <summary>
+            Convert a string to true or false.
+            </summary>
+            <param name="source">A string representing true or false</param>
+            <returns></returns>
+            <remarks>
+            "yes", "no", "y", "n", "0", "1", "on", "off" as well as Boolean.FalseString and Boolean.TrueString will all be
+            converted to a proper boolean value.
+            </remarks>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.SQLiteTypeToType(System.Data.SQLite.SQLiteType)">
+            <summary>
+            Converts a SQLiteType to a .NET Type object
+            </summary>
+            <param name="t">The SQLiteType to convert</param>
+            <returns>Returns a .NET Type object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.TypeToDbType(System.Type)">
+            <summary>
+            For a given intrinsic type, return a DbType
+            </summary>
+            <param name="typ">The native type to convert</param>
+            <returns>The corresponding (closest match) DbType</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.DbTypeToColumnSize(System.Data.DbType)">
+            <summary>
+            Returns the ColumnSize for the given DbType
+            </summary>
+            <param name="typ">The DbType to get the size of</param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.DbTypeToTypeName(System.Data.DbType,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            Determines the type name for the given database value type.
+            </summary>
+            <param name="typ">The database value type.</param>
+            <param name="flags">The flags associated with the parent connection object.</param>
+            <returns>The type name or an empty string if it cannot be determined.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.DbTypeToType(System.Data.DbType)">
+            <summary>
+            Convert a DbType to a Type
+            </summary>
+            <param name="typ">The DbType to convert from</param>
+            <returns>The closest-match .NET type</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.TypeToAffinity(System.Type)">
+            <summary>
+            For a given type, return the closest-match SQLite TypeAffinity, which only understands a very limited subset of types.
+            </summary>
+            <param name="typ">The type to evaluate</param>
+            <returns>The SQLite type affinity for that type.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.GetSQLiteDbTypeMap">
+            <summary>
+            Builds and returns a map containing the database column types
+            recognized by this provider.
+            </summary>
+            <returns>
+            A map containing the database column types recognized by this
+            provider.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.TypeNameToDbType(System.String,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            For a given type name, return a closest-match .NET type
+            </summary>
+            <param name="Name">The name of the type to match</param>
+            <param name="flags">The flags associated with the parent connection object.</param>
+            <returns>The .NET DBType the text evaluates to.</returns>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBase.COR_E_EXCEPTION">
+            <summary>
+            The error code used for logging exceptions caught in user-provided
+            code.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.SetMemoryStatus(System.Boolean)">
+            <summary>
+            Sets the status of the memory usage tracking subsystem in the SQLite core library.  By default, this is enabled.
+            If this is disabled, memory usage tracking will not be performed.  This is not really a per-connection value, it is
+            global to the process.
+            </summary>
+            <param name="value">Non-zero to enable memory usage tracking, zero otherwise.</param>
+            <returns>A standard SQLite return code (i.e. zero for success and non-zero for failure).</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.ReleaseMemory">
+            <summary>
+            Attempts to free as much heap memory as possible for the database connection.
+            </summary>
+            <returns>A standard SQLite return code (i.e. zero for success and non-zero for failure).</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Shutdown">
+            <summary>
+            Shutdown the SQLite engine so that it can be restarted with different config options.
+            We depend on auto initialization to recover.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.IsOpen">
+            <summary>
+            Determines if the associated native connection handle is open.
+            </summary>
+            <returns>
+            Non-zero if a database connection is open.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Open(System.String,System.Data.SQLite.SQLiteConnectionFlags,System.Data.SQLite.SQLiteOpenFlagsEnum,System.Int32,System.Boolean)">
+            <summary>
+            Opens a database.
+            </summary>
+            <remarks>
+            Implementers should call SQLiteFunction.BindFunctions() and save the array after opening a connection
+            to bind all attributed user-defined functions and collating sequences to the new connection.
+            </remarks>
+            <param name="strFilename">The filename of the database to open.  SQLite automatically creates it if it doesn't exist.</param>
+            <param name="connectionFlags">The flags associated with the parent connection object</param>
+            <param name="openFlags">The open flags to use when creating the connection</param>
+            <param name="maxPoolSize">The maximum size of the pool for the given filename</param>
+            <param name="usePool">If true, the connection can be pulled from the connection pool</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Close(System.Boolean)">
+            <summary>
+            Closes the currently-open database.
+            </summary>
+            <remarks>
+            After the database has been closed implemeters should call SQLiteFunction.UnbindFunctions() to deallocate all interop allocated
+            memory associated with the user-defined functions and collating sequences tied to the closed connection.
+            </remarks>
+            <param name="canThrow">Non-zero if the operation is allowed to throw exceptions, zero otherwise.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.SetTimeout(System.Int32)">
+            <summary>
+            Sets the busy timeout on the connection.  SQLiteCommand will call this before executing any command.
+            </summary>
+            <param name="nTimeoutMS">The number of milliseconds to wait before returning SQLITE_BUSY</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.GetLastError">
+            <summary>
+            Returns the text of the last error issued by SQLite
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.GetLastError(System.String)">
+            <summary>
+            Returns the text of the last error issued by SQLite -OR- the specified default error text if
+            none is available from the SQLite core library.
+            </summary>
+            <param name="defValue">
+            The error text to return in the event that one is not available from the SQLite core library.
+            </param>
+            <returns>
+            The error text.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.ClearPool">
+            <summary>
+            When pooling is enabled, force this connection to be disposed rather than returned to the pool
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.CountPool">
+            <summary>
+            When pooling is enabled, returns the number of pool entries matching the current file name.
+            </summary>
+            <returns>The number of pool entries matching the current file name.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Prepare(System.Data.SQLite.SQLiteConnection,System.String,System.Data.SQLite.SQLiteStatement,System.UInt32,System.String@)">
+            <summary>
+            Prepares a SQL statement for execution.
+            </summary>
+            <param name="cnn">The source connection preparing the command.  Can be null for any caller except LINQ</param>
+            <param name="strSql">The SQL command text to prepare</param>
+            <param name="previous">The previous statement in a multi-statement command, or null if no previous statement exists</param>
+            <param name="timeoutMS">The timeout to wait before aborting the prepare</param>
+            <param name="strRemain">The remainder of the statement that was not processed.  Each call to prepare parses the
+            SQL up to to either the end of the text or to the first semi-colon delimiter.  The remaining text is returned
+            here for a subsequent call to Prepare() until all the text has been processed.</param>
+            <returns>Returns an initialized SQLiteStatement.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Step(System.Data.SQLite.SQLiteStatement)">
+            <summary>
+            Steps through a prepared statement.
+            </summary>
+            <param name="stmt">The SQLiteStatement to step through</param>
+            <returns>True if a row was returned, False if not.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Reset(System.Data.SQLite.SQLiteStatement)">
+            <summary>
+            Resets a prepared statement so it can be executed again.  If the error returned is SQLITE_SCHEMA,
+            transparently attempt to rebuild the SQL statement and throw an error if that was not possible.
+            </summary>
+            <param name="stmt">The statement to reset</param>
+            <returns>Returns -1 if the schema changed while resetting, 0 if the reset was sucessful or 6 (SQLITE_LOCKED) if the reset failed due to a lock</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Cancel">
+            <summary>
+            Attempts to interrupt the query currently executing on the associated
+            native database connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.BindFunction(System.Data.SQLite.SQLiteFunctionAttribute,System.Data.SQLite.SQLiteFunction,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            This function binds a user-defined functions to the connection.
+            </summary>
+            <param name="functionAttribute">
+            The <see cref="T:System.Data.SQLite.SQLiteFunctionAttribute"/> object instance containing
+            the metadata for the function to be bound.
+            </param>
+            <param name="function">
+            The <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance that implements the
+            function to be bound.
+            </param>
+            <param name="flags">
+            The flags associated with the parent connection object.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.CreateModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            Calls the native SQLite core library in order to create a disposable
+            module containing the implementation of a virtual table.
+            </summary>
+            <param name="module">
+            The module object to be used when creating the native disposable module.
+            </param>
+            <param name="flags">
+            The flags for the associated <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.DisposeModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            Calls the native SQLite core library in order to cleanup the resources
+            associated with a module containing the implementation of a virtual table.
+            </summary>
+            <param name="module">
+            The module object previously passed to the <see cref="M:System.Data.SQLite.SQLiteBase.CreateModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)"/>
+            method.
+            </param>
+            <param name="flags">
+            The flags for the associated <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.DeclareVirtualTable(System.Data.SQLite.SQLiteModule,System.String,System.String@)">
+            <summary>
+            Calls the native SQLite core library in order to declare a virtual table
+            in response to a call into the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/>
+            or <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> virtual table methods.
+            </summary>
+            <param name="module">
+            The virtual table module that is to be responsible for the virtual table
+            being declared.
+            </param>
+            <param name="strSql">
+            The string containing the SQL statement describing the virtual table to
+            be declared.
+            </param>
+            <param name="error">
+            Upon success, the contents of this parameter are undefined.  Upon failure,
+            it should contain an appropriate error message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.DeclareVirtualFunction(System.Data.SQLite.SQLiteModule,System.Int32,System.String,System.String@)">
+            <summary>
+            Calls the native SQLite core library in order to declare a virtual table
+            function in response to a call into the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/>
+            or <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> virtual table methods.
+            </summary>
+            <param name="module">
+            The virtual table module that is to be responsible for the virtual table
+            function being declared.
+            </param>
+            <param name="argumentCount">
+            The number of arguments to the function being declared.
+            </param>
+            <param name="name">
+            The name of the function being declared.
+            </param>
+            <param name="error">
+            Upon success, the contents of this parameter are undefined.  Upon failure,
+            it should contain an appropriate error message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.SetLoadExtension(System.Boolean)">
+            <summary>
+            Enables or disabled extension loading by SQLite.
+            </summary>
+            <param name="bOnOff">
+            True to enable loading of extensions, false to disable.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.LoadExtension(System.String,System.String)">
+            <summary>
+            Loads a SQLite extension library from the named file.
+            </summary>
+            <param name="fileName">
+            The name of the dynamic link library file containing the extension.
+            </param>
+            <param name="procName">
+            The name of the exported function used to initialize the extension.
+            If null, the default "sqlite3_extension_init" will be used.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.SetExtendedResultCodes(System.Boolean)">
+            <summary>
+            Enables or disabled extened result codes returned by SQLite
+            </summary>
+            <param name="bOnOff">true to enable extended result codes, false to disable.</param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.ResultCode">
+            <summary>
+            Returns the numeric result code for the most recent failed SQLite API call
+            associated with the database connection.
+            </summary>
+            <returns>Result code</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.ExtendedResultCode">
+            <summary>
+            Returns the extended numeric result code for the most recent failed SQLite API call
+            associated with the database connection.
+            </summary>
+            <returns>Extended result code</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.LogMessage(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            <summary>
+            Add a log message via the SQLite sqlite3_log interface.
+            </summary>
+            <param name="iErrCode">Error code to be logged with the message.</param>
+            <param name="zMessage">String to be logged.  Unlike the SQLite sqlite3_log()
+            interface, this should be pre-formatted.  Consider using the
+            String.Format() function.</param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.IsInitialized">
+            <summary>
+            Checks if the SQLite core library has been initialized in the current process.
+            </summary>
+            <returns>
+            Non-zero if the SQLite core library has been initialized in the current process,
+            zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.InitializeBackup(System.Data.SQLite.SQLiteConnection,System.String,System.String)">
+            <summary>
+            Creates a new SQLite backup object based on the provided destination
+            database connection.  The source database connection is the one
+            associated with this object.  The source and destination database
+            connections cannot be the same.
+            </summary>
+            <param name="destCnn">The destination database connection.</param>
+            <param name="destName">The destination database name.</param>
+            <param name="sourceName">The source database name.</param>
+            <returns>The newly created backup object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.StepBackup(System.Data.SQLite.SQLiteBackup,System.Int32,System.Boolean@)">
+            <summary>
+            Copies up to N pages from the source database to the destination
+            database associated with the specified backup object.
+            </summary>
+            <param name="backup">The backup object to use.</param>
+            <param name="nPage">
+            The number of pages to copy or negative to copy all remaining pages.
+            </param>
+            <param name="retry">
+            Set to true if the operation needs to be retried due to database
+            locking issues.
+            </param>
+            <returns>
+            True if there are more pages to be copied, false otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.RemainingBackup(System.Data.SQLite.SQLiteBackup)">
+            <summary>
+            Returns the number of pages remaining to be copied from the source
+            database to the destination database associated with the specified
+            backup object.
+            </summary>
+            <param name="backup">The backup object to check.</param>
+            <returns>The number of pages remaining to be copied.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.PageCountBackup(System.Data.SQLite.SQLiteBackup)">
+            <summary>
+            Returns the total number of pages in the source database associated
+            with the specified backup object.
+            </summary>
+            <param name="backup">The backup object to check.</param>
+            <returns>The total number of pages in the source database.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.FinishBackup(System.Data.SQLite.SQLiteBackup)">
+            <summary>
+            Destroys the backup object, rolling back any backup that may be in
+            progess.
+            </summary>
+            <param name="backup">The backup object to destroy.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.FallbackGetErrorString(System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Returns the error message for the specified SQLite return code using
+            the internal static lookup table.
+            </summary>
+            <param name="rc">The SQLite return code.</param>
+            <returns>The error message or null if it cannot be found.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.GetErrorString(System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Returns the error message for the specified SQLite return code using
+            the sqlite3_errstr() function, falling back to the internal lookup
+            table if necessary.
+            </summary>
+            <param name="rc">The SQLite return code.</param>
+            <returns>The error message or null if it cannot be found.</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.Version">
+            <summary>
+            Returns a string representing the active version of SQLite
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.VersionNumber">
+            <summary>
+            Returns an integer representing the active version of SQLite
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.LastInsertRowId">
+            <summary>
+            Returns the rowid of the most recent successful INSERT into the database from this connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.Changes">
+            <summary>
+            Returns the number of changes the last executing insert/update caused.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.MemoryUsed">
+            <summary>
+            Returns the amount of memory (in bytes) currently in use by the SQLite core library.  This is not really a per-connection
+            value, it is global to the process.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.MemoryHighwater">
+            <summary>
+            Returns the maximum amount of memory (in bytes) used by the SQLite core library since the high-water mark was last reset.
+            This is not really a per-connection value, it is global to the process.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.OwnHandle">
+            <summary>
+            Returns non-zero if the underlying native connection handle is owned by this instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.AutoCommit">
+            <summary>
+            Returns non-zero if the given database connection is in autocommit mode.
+            Autocommit mode is on by default.  Autocommit mode is disabled by a BEGIN
+            statement.  Autocommit mode is re-enabled by a COMMIT or ROLLBACK.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLite3._sql">
+            <summary>
+            The opaque pointer returned to us by the sqlite provider
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLite3._functions">
+            <summary>
+            The user-defined functions registered on this connection
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLite3._modules">
+            <summary>
+            The modules created using this connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.#ctor(System.Data.SQLite.SQLiteDateFormats,System.DateTimeKind,System.String,System.IntPtr,System.String,System.Boolean)">
+            <summary>
+            Constructs the object used to interact with the SQLite core library
+            using the UTF-8 text encoding.
+            </summary>
+            <param name="fmt">
+            The DateTime format to be used when converting string values to a
+            DateTime and binding DateTime parameters.
+            </param>
+            <param name="kind">
+            The <see cref="T:System.DateTimeKind"/> to be used when creating DateTime
+            values.
+            </param>
+            <param name="fmtString">
+            The format string to be used when parsing and formatting DateTime
+            values.
+            </param>
+            <param name="db">
+            The native handle to be associated with the database connection.
+            </param>
+            <param name="fileName">
+            The fully qualified file name associated with <paramref name="db "/>.
+            </param>
+            <param name="ownHandle">
+            Non-zero if the newly created object instance will need to dispose
+            of <paramref name="db"/> when it is no longer needed.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.DisposeModules">
+            <summary>
+            This method attempts to dispose of all the <see cref="T:System.Data.SQLite.SQLiteModule"/> derived
+            object instances currently associated with the native database connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.Cancel">
+            <summary>
+            Attempts to interrupt the query currently executing on the associated
+            native database connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.BindFunction(System.Data.SQLite.SQLiteFunctionAttribute,System.Data.SQLite.SQLiteFunction,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            This function binds a user-defined function to the connection.
+            </summary>
+            <param name="functionAttribute">
+            The <see cref="T:System.Data.SQLite.SQLiteFunctionAttribute"/> object instance containing
+            the metadata for the function to be bound.
+            </param>
+            <param name="function">
+            The <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance that implements the
+            function to be bound.
+            </param>
+            <param name="flags">
+            The flags associated with the parent connection object.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.ReleaseMemory">
+            <summary>
+            Attempts to free as much heap memory as possible for the database connection.
+            </summary>
+            <returns>A standard SQLite return code (i.e. zero for success and non-zero for failure).</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.StaticReleaseMemory(System.Int32,System.Boolean,System.Boolean,System.Int32@,System.Boolean@,System.UInt32@)">
+            <summary>
+            Attempts to free N bytes of heap memory by deallocating non-essential memory
+            allocations held by the database library. Memory used to cache database pages
+            to improve performance is an example of non-essential memory.  This is a no-op
+            returning zero if the SQLite core library was not compiled with the compile-time
+            option SQLITE_ENABLE_MEMORY_MANAGEMENT.  Optionally, attempts to reset and/or
+            compact the Win32 native heap, if applicable.
+            </summary>
+            <param name="nBytes">
+            The requested number of bytes to free.
+            </param>
+            <param name="reset">
+            Non-zero to attempt a heap reset.
+            </param>
+            <param name="compact">
+            Non-zero to attempt heap compaction.
+            </param>
+            <param name="nFree">
+            The number of bytes actually freed.  This value may be zero.
+            </param>
+            <param name="resetOk">
+            This value will be non-zero if the heap reset was successful.
+            </param>
+            <param name="nLargest">
+            The size of the largest committed free block in the heap, in bytes.
+            This value will be zero unless heap compaction is enabled.
+            </param>
+            <returns>
+            A standard SQLite return code (i.e. zero for success and non-zero
+            for failure).
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.Shutdown">
+            <summary>
+            Shutdown the SQLite engine so that it can be restarted with different
+            configuration options.  We depend on auto initialization to recover.
+            </summary>
+            <returns>Returns a standard SQLite result code.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.StaticShutdown(System.Boolean)">
+            <summary>
+            Shutdown the SQLite engine so that it can be restarted with different
+            configuration options.  We depend on auto initialization to recover.
+            </summary>
+            <param name="directories">
+            Non-zero to reset the database and temporary directories to their
+            default values, which should be null for both.  This parameter has no
+            effect on non-Windows operating systems.
+            </param>
+            <returns>Returns a standard SQLite result code.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.IsOpen">
+            <summary>
+            Determines if the associated native connection handle is open.
+            </summary>
+            <returns>
+            Non-zero if the associated native connection handle is open.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.CreateModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            Calls the native SQLite core library in order to create a disposable
+            module containing the implementation of a virtual table.
+            </summary>
+            <param name="module">
+            The module object to be used when creating the native disposable module.
+            </param>
+            <param name="flags">
+            The flags for the associated <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.DisposeModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            Calls the native SQLite core library in order to cleanup the resources
+            associated with a module containing the implementation of a virtual table.
+            </summary>
+            <param name="module">
+            The module object previously passed to the <see cref="M:System.Data.SQLite.SQLite3.CreateModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)"/>
+            method.
+            </param>
+            <param name="flags">
+            The flags for the associated <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.DeclareVirtualTable(System.Data.SQLite.SQLiteModule,System.String,System.String@)">
+            <summary>
+            Calls the native SQLite core library in order to declare a virtual table
+            in response to a call into the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/>
+            or <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> virtual table methods.
+            </summary>
+            <param name="module">
+            The virtual table module that is to be responsible for the virtual table
+            being declared.
+            </param>
+            <param name="strSql">
+            The string containing the SQL statement describing the virtual table to
+            be declared.
+            </param>
+            <param name="error">
+            Upon success, the contents of this parameter are undefined.  Upon failure,
+            it should contain an appropriate error message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.DeclareVirtualFunction(System.Data.SQLite.SQLiteModule,System.Int32,System.String,System.String@)">
+            <summary>
+            Calls the native SQLite core library in order to declare a virtual table
+            function in response to a call into the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/>
+            or <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> virtual table methods.
+            </summary>
+            <param name="module">
+            The virtual table module that is to be responsible for the virtual table
+            function being declared.
+            </param>
+            <param name="argumentCount">
+            The number of arguments to the function being declared.
+            </param>
+            <param name="name">
+            The name of the function being declared.
+            </param>
+            <param name="error">
+            Upon success, the contents of this parameter are undefined.  Upon failure,
+            it should contain an appropriate error message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.SetLoadExtension(System.Boolean)">
+            <summary>
+            Enables or disabled extension loading by SQLite.
+            </summary>
+            <param name="bOnOff">
+            True to enable loading of extensions, false to disable.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.LoadExtension(System.String,System.String)">
+            <summary>
+            Loads a SQLite extension library from the named file.
+            </summary>
+            <param name="fileName">
+            The name of the dynamic link library file containing the extension.
+            </param>
+            <param name="procName">
+            The name of the exported function used to initialize the extension.
+            If null, the default "sqlite3_extension_init" will be used.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.SetExtendedResultCodes(System.Boolean)">
+            Enables or disabled extended result codes returned by SQLite
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.ResultCode">
+            Gets the last SQLite error code
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.ExtendedResultCode">
+            Gets the last SQLite extended error code
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.LogMessage(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            Add a log message via the SQLite sqlite3_log interface.
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.StaticLogMessage(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            Add a log message via the SQLite sqlite3_log interface.
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.SetLogCallback(System.Data.SQLite.SQLiteLogCallback)">
+            <summary>
+            Allows the setting of a logging callback invoked by SQLite when a
+            log event occurs.  Only one callback may be set.  If NULL is passed,
+            the logging callback is unregistered.
+            </summary>
+            <param name="func">The callback function to invoke.</param>
+            <returns>Returns a result code</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.InitializeBackup(System.Data.SQLite.SQLiteConnection,System.String,System.String)">
+            <summary>
+            Creates a new SQLite backup object based on the provided destination
+            database connection.  The source database connection is the one
+            associated with this object.  The source and destination database
+            connections cannot be the same.
+            </summary>
+            <param name="destCnn">The destination database connection.</param>
+            <param name="destName">The destination database name.</param>
+            <param name="sourceName">The source database name.</param>
+            <returns>The newly created backup object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.StepBackup(System.Data.SQLite.SQLiteBackup,System.Int32,System.Boolean@)">
+            <summary>
+            Copies up to N pages from the source database to the destination
+            database associated with the specified backup object.
+            </summary>
+            <param name="backup">The backup object to use.</param>
+            <param name="nPage">
+            The number of pages to copy, negative to copy all remaining pages.
+            </param>
+            <param name="retry">
+            Set to true if the operation needs to be retried due to database
+            locking issues; otherwise, set to false.
+            </param>
+            <returns>
+            True if there are more pages to be copied, false otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.RemainingBackup(System.Data.SQLite.SQLiteBackup)">
+            <summary>
+            Returns the number of pages remaining to be copied from the source
+            database to the destination database associated with the specified
+            backup object.
+            </summary>
+            <param name="backup">The backup object to check.</param>
+            <returns>The number of pages remaining to be copied.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.PageCountBackup(System.Data.SQLite.SQLiteBackup)">
+            <summary>
+            Returns the total number of pages in the source database associated
+            with the specified backup object.
+            </summary>
+            <param name="backup">The backup object to check.</param>
+            <returns>The total number of pages in the source database.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.FinishBackup(System.Data.SQLite.SQLiteBackup)">
+            <summary>
+            Destroys the backup object, rolling back any backup that may be in
+            progess.
+            </summary>
+            <param name="backup">The backup object to destroy.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.IsInitialized">
+            <summary>
+            Determines if the SQLite core library has been initialized for the
+            current process.
+            </summary>
+            <returns>
+            A boolean indicating whether or not the SQLite core library has been
+            initialized for the current process.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.StaticIsInitialized">
+            <summary>
+            Determines if the SQLite core library has been initialized for the
+            current process.
+            </summary>
+            <returns>
+            A boolean indicating whether or not the SQLite core library has been
+            initialized for the current process.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.GetValue(System.Data.SQLite.SQLiteStatement,System.Data.SQLite.SQLiteConnectionFlags,System.Int32,System.Data.SQLite.SQLiteType)">
+            <summary>
+            Helper function to retrieve a column of data from an active statement.
+            </summary>
+            <param name="stmt">The statement being step()'d through</param>
+            <param name="flags">The flags associated with the connection.</param>
+            <param name="index">The column index to retrieve</param>
+            <param name="typ">The type of data contained in the column.  If Uninitialized, this function will retrieve the datatype information.</param>
+            <returns>Returns the data in the column</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLite3.OwnHandle">
+            <summary>
+            Returns non-zero if the underlying native connection handle is owned
+            by this instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLite3_UTF16">
+            <summary>
+            Alternate SQLite3 object, overriding many text behaviors to support UTF-16 (Unicode)
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3_UTF16.#ctor(System.Data.SQLite.SQLiteDateFormats,System.DateTimeKind,System.String,System.IntPtr,System.String,System.Boolean)">
+            <summary>
+            Constructs the object used to interact with the SQLite core library
+            using the UTF-8 text encoding.
+            </summary>
+            <param name="fmt">
+            The DateTime format to be used when converting string values to a
+            DateTime and binding DateTime parameters.
+            </param>
+            <param name="kind">
+            The <see cref="T:System.DateTimeKind"/> to be used when creating DateTime
+            values.
+            </param>
+            <param name="fmtString">
+            The format string to be used when parsing and formatting DateTime
+            values.
+            </param>
+            <param name="db">
+            The native handle to be associated with the database connection.
+            </param>
+            <param name="fileName">
+            The fully qualified file name associated with <paramref name="db"/>.
+            </param>
+            <param name="ownHandle">
+            Non-zero if the newly created object instance will need to dispose
+            of <paramref name="db"/> when it is no longer needed.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3_UTF16.ToString(System.IntPtr,System.Int32)">
+            <summary>
+            Overrides SQLiteConvert.ToString() to marshal UTF-16 strings instead of UTF-8
+            </summary>
+            <param name="b">A pointer to a UTF-16 string</param>
+            <param name="nbytelen">The length (IN BYTES) of the string</param>
+            <returns>A .NET string</returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteBackup">
+            <summary>
+            Represents a single SQL backup in SQLite.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._sql">
+            <summary>
+            The underlying SQLite object this backup is bound to.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._sqlite_backup">
+            <summary>
+            The actual backup handle.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._destDb">
+            <summary>
+            The destination database for the backup.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._zDestName">
+            <summary>
+            The destination database name for the backup.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._sourceDb">
+            <summary>
+            The source database for the backup.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._zSourceName">
+            <summary>
+            The source database name for the backup.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._stepResult">
+            <summary>
+            The last result from the StepBackup method of the SQLite3 class.
+            This is used to determine if the call to the FinishBackup method of
+            the SQLite3 class should throw an exception when it receives a non-Ok
+            return code from the core SQLite library.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBackup.#ctor(System.Data.SQLite.SQLiteBase,System.Data.SQLite.SQLiteBackupHandle,System.IntPtr,System.Byte[],System.IntPtr,System.Byte[])">
+            <summary>
+            Initializes the backup.
+            </summary>
+            <param name="sqlbase">The base SQLite object.</param>
+            <param name="backup">The backup handle.</param>
+            <param name="destDb">The destination database for the backup.</param>
+            <param name="zDestName">The destination database name for the backup.</param>
+            <param name="sourceDb">The source database for the backup.</param>
+            <param name="zSourceName">The source database name for the backup.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBackup.Dispose">
+            <summary>
+            Disposes and finalizes the backup.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnectionFlags">
+            <summary>
+            The extra behavioral flags that can be applied to a connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.None">
+            <summary>
+            No extra flags.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogPrepare">
+            <summary>
+            Enable logging of all SQL statements to be prepared.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogPreBind">
+            <summary>
+            Enable logging of all bound parameter types and raw values.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogBind">
+            <summary>
+            Enable logging of all bound parameter strongly typed values.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogCallbackException">
+            <summary>
+            Enable logging of all exceptions caught from user-provided
+            managed code called from native code via delegates.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogBackup">
+            <summary>
+            Enable logging of backup API errors.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.NoExtensionFunctions">
+            <summary>
+            Skip adding the extension functions provided by the native
+            interop assembly.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.BindUInt32AsInt64">
+            <summary>
+            When binding parameter values with the <see cref="T:System.UInt32"/>
+            type, use the interop method that accepts an <see cref="T:System.Int64"/>
+            value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.BindAllAsText">
+            <summary>
+            When binding parameter values, always bind them as though they were
+            plain text (i.e. no numeric, date/time, or other conversions should
+            be attempted).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.GetAllAsText">
+            <summary>
+            When returning column values, always return them as though they were
+            plain text (i.e. no numeric, date/time, or other conversions should
+            be attempted).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.NoLoadExtension">
+            <summary>
+            Prevent this <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance from
+            loading extensions.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.NoCreateModule">
+            <summary>
+            Prevent this <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance from
+            creating virtual table modules.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.NoBindFunctions">
+            <summary>
+            Skip binding any functions provided by other managed assemblies when
+            opening the connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.NoLogModule">
+            <summary>
+            Skip setting the logging related properties of the
+            <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance that was passed to
+            the <see cref="M:System.Data.SQLite.SQLiteConnection.CreateModule(System.Data.SQLite.SQLiteModule)"/> method.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogModuleError">
+            <summary>
+            Enable logging of all virtual table module errors seen by the
+            <see cref="M:System.Data.SQLite.SQLiteModule.SetTableError(System.IntPtr,System.String)"/> method.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogModuleException">
+            <summary>
+            Enable logging of certain virtual table module exceptions that cannot
+            be easily discovered via other means.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.TraceWarning">
+            <summary>
+            Enable tracing of potentially important [non-fatal] error conditions
+            that cannot be easily reported through other means.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.BindAndGetAllAsText">
+            <summary>
+            When binding and returning column values, always treat them as though
+            they were plain text (i.e. no numeric, date/time, or other conversions
+            should be attempted).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogAll">
+            <summary>
+            Enable all logging.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.Default">
+            <summary>
+            The default extra flags for new connections.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteCommand">
+            <summary>
+            SQLite implementation of DbCommand.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand.DefaultConnectionString">
+            <summary>
+            The default connection string to be used when creating a temporary
+            connection to execute a command via the static
+            <see cref="M:System.Data.SQLite.SQLiteCommand.Execute(System.String,System.Data.SQLite.SQLiteExecuteType,System.String,System.Object[])"/> or
+            <see cref="M:System.Data.SQLite.SQLiteCommand.Execute(System.String,System.Data.SQLite.SQLiteExecuteType,System.Data.CommandBehavior,System.String,System.Object[])"/>
+            methods.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._commandText">
+            <summary>
+            The command text this command is based on
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._cnn">
+            <summary>
+            The connection the command is associated with
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._version">
+            <summary>
+            The version of the connection the command is associated with
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._activeReader">
+            <summary>
+            Indicates whether or not a DataReader is active on the command.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._commandTimeout">
+            <summary>
+            The timeout for the command, kludged because SQLite doesn't support per-command timeout values
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._designTimeVisible">
+            <summary>
+            Designer support
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._updateRowSource">
+            <summary>
+            Used by DbDataAdapter to determine updating behavior
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._parameterCollection">
+            <summary>
+            The collection of parameters for the command
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._statementList">
+            <summary>
+            The SQL command text, broken into individual SQL statements as they are executed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._remainingText">
+            <summary>
+            Unprocessed SQL text that has not been executed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._transaction">
+            <summary>
+            Transaction associated with this command
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.#ctor">
+            <overloads>
+             Constructs a new SQLiteCommand
+             </overloads>
+             <summary>
+             Default constructor
+             </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.#ctor(System.String)">
+            <summary>
+            Initializes the command with the given command text
+            </summary>
+            <param name="commandText">The SQL command text</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.#ctor(System.String,System.Data.SQLite.SQLiteConnection)">
+            <summary>
+            Initializes the command with the given SQL command text and attach the command to the specified
+            connection.
+            </summary>
+            <param name="commandText">The SQL command text</param>
+            <param name="connection">The connection to associate with the command</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.#ctor(System.Data.SQLite.SQLiteConnection)">
+            <summary>
+            Initializes the command and associates it with the specified connection.
+            </summary>
+            <param name="connection">The connection to associate with the command</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.#ctor(System.String,System.Data.SQLite.SQLiteConnection,System.Data.SQLite.SQLiteTransaction)">
+            <summary>
+            Initializes a command with the given SQL, connection and transaction
+            </summary>
+            <param name="commandText">The SQL command text</param>
+            <param name="connection">The connection to associate with the command</param>
+            <param name="transaction">The transaction the command should be associated with</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.Dispose(System.Boolean)">
+            <summary>
+            Disposes of the command and clears all member variables
+            </summary>
+            <param name="disposing">Whether or not the class is being explicitly or implicitly disposed</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.GetFlags(System.Data.SQLite.SQLiteCommand)">
+            <summary>
+            This method attempts to query the flags associated with the database
+            connection in use.  If the database connection is disposed, the default
+            flags will be returned.
+            </summary>
+            <param name="command">
+            The command containing the databse connection to query the flags from.
+            </param>
+            <returns>
+            The connection flags value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ClearCommands">
+            <summary>
+            Clears and destroys all statements currently prepared
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.BuildNextCommand">
+            <summary>
+            Builds an array of prepared statements for each complete SQL statement in the command text
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.Cancel">
+            <summary>
+            Not implemented
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.CreateDbParameter">
+            <summary>
+            Forwards to the local CreateParameter() function
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.CreateParameter">
+            <summary>
+            Create a new parameter
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.InitializeForReader">
+            <summary>
+            This function ensures there are no active readers, that we have a valid connection,
+            that the connection is open, that all statements are prepared and all parameters are assigned
+            in preparation for allocating a data reader.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteDbDataReader(System.Data.CommandBehavior)">
+            <summary>
+            Creates a new SQLiteDataReader to execute/iterate the array of SQLite prepared statements
+            </summary>
+            <param name="behavior">The behavior the data reader should adopt</param>
+            <returns>Returns a SQLiteDataReader object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.Execute(System.String,System.Data.SQLite.SQLiteExecuteType,System.String,System.Object[])">
+            <summary>
+            This method creates a new connection, executes the query using the given
+            execution type, closes the connection, and returns the results.  If the
+            connection string is null, a temporary in-memory database connection will
+            be used.
+            </summary>
+            <param name="commandText">
+            The text of the command to be executed.
+            </param>
+            <param name="executeType">
+            The execution type for the command.  This is used to determine which method
+            of the command object to call, which then determines the type of results
+            returned, if any.
+            </param>
+            <param name="connectionString">
+            The connection string to the database to be opened, used, and closed.  If
+            this parameter is null, a temporary in-memory databse will be used.
+            </param>
+            <param name="args">
+            The SQL parameter values to be used when building the command object to be
+            executed, if any.
+            </param>
+            <returns>
+            The results of the query -OR- null if no results were produced from the
+            given execution type.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.Execute(System.String,System.Data.SQLite.SQLiteExecuteType,System.Data.CommandBehavior,System.String,System.Object[])">
+            <summary>
+            This method creates a new connection, executes the query using the given
+            execution type and command behavior, closes the connection, and returns
+            the results.  If the connection string is null, a temporary in-memory
+            database connection will be used.
+            </summary>
+            <param name="commandText">
+            The text of the command to be executed.
+            </param>
+            <param name="executeType">
+            The execution type for the command.  This is used to determine which method
+            of the command object to call, which then determines the type of results
+            returned, if any.
+            </param>
+            <param name="commandBehavior">
+            The command behavior flags for the command.
+            </param>
+            <param name="connectionString">
+            The connection string to the database to be opened, used, and closed.  If
+            this parameter is null, a temporary in-memory databse will be used.
+            </param>
+            <param name="args">
+            The SQL parameter values to be used when building the command object to be
+            executed, if any.
+            </param>
+            <returns>
+            The results of the query -OR- null if no results were produced from the
+            given execution type.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteReader(System.Data.CommandBehavior)">
+            <summary>
+            Overrides the default behavior to return a SQLiteDataReader specialization class
+            </summary>
+            <param name="behavior">The flags to be associated with the reader.</param>
+            <returns>A SQLiteDataReader</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteReader">
+            <summary>
+            Overrides the default behavior of DbDataReader to return a specialized SQLiteDataReader class
+            </summary>
+            <returns>A SQLiteDataReader</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ClearDataReader">
+            <summary>
+            Called by the SQLiteDataReader when the data reader is closed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteNonQuery">
+            <summary>
+            Execute the command and return the number of rows inserted/updated affected by it.
+            </summary>
+            <returns>The number of rows inserted/updated affected by it.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteNonQuery(System.Data.CommandBehavior)">
+            <summary>
+            Execute the command and return the number of rows inserted/updated affected by it.
+            </summary>
+            <param name="behavior">The flags to be associated with the reader.</param>
+            <returns>The number of rows inserted/updated affected by it.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteScalar">
+            <summary>
+            Execute the command and return the first column of the first row of the resultset
+            (if present), or null if no resultset was returned.
+            </summary>
+            <returns>The first column of the first row of the first resultset from the query.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteScalar(System.Data.CommandBehavior)">
+            <summary>
+            Execute the command and return the first column of the first row of the resultset
+            (if present), or null if no resultset was returned.
+            </summary>
+            <param name="behavior">The flags to be associated with the reader.</param>
+            <returns>The first column of the first row of the first resultset from the query.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.Prepare">
+            <summary>
+            Does nothing.  Commands are prepared as they are executed the first time, and kept in prepared state afterwards.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.Clone">
+            <summary>
+            Clones a command, including all its parameters
+            </summary>
+            <returns>A new SQLiteCommand with the same commandtext, connection and parameters</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.CommandText">
+            <summary>
+            The SQL command text associated with the command
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.CommandTimeout">
+            <summary>
+            The amount of time to wait for the connection to become available before erroring out
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.CommandType">
+            <summary>
+            The type of the command.  SQLite only supports CommandType.Text
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.Connection">
+            <summary>
+            The connection associated with this command
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.DbConnection">
+            <summary>
+            Forwards to the local Connection property
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.Parameters">
+            <summary>
+            Returns the SQLiteParameterCollection for the given command
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.DbParameterCollection">
+            <summary>
+            Forwards to the local Parameters property
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.Transaction">
+            <summary>
+            The transaction associated with this command.  SQLite only supports one transaction per connection, so this property forwards to the
+            command's underlying connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.DbTransaction">
+            <summary>
+            Forwards to the local Transaction property
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.UpdatedRowSource">
+            <summary>
+            Sets the method the SQLiteCommandBuilder uses to determine how to update inserted or updated rows in a DataTable.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.DesignTimeVisible">
+            <summary>
+            Determines if the command is visible at design time.  Defaults to True.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteCommandBuilder">
+            <summary>
+            SQLite implementation of DbCommandBuilder.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.#ctor(System.Data.SQLite.SQLiteDataAdapter)">
+            <summary>
+            Initializes the command builder and associates it with the specified data adapter.
+            </summary>
+            <param name="adp"></param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.ApplyParameterInfo(System.Data.Common.DbParameter,System.Data.DataRow,System.Data.StatementType,System.Boolean)">
+            <summary>
+            Minimal amount of parameter processing.  Primarily sets the DbType for the parameter equal to the provider type in the schema
+            </summary>
+            <param name="parameter">The parameter to use in applying custom behaviors to a row</param>
+            <param name="row">The row to apply the parameter to</param>
+            <param name="statementType">The type of statement</param>
+            <param name="whereClause">Whether the application of the parameter is part of a WHERE clause</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetParameterName(System.String)">
+            <summary>
+            Returns a valid named parameter
+            </summary>
+            <param name="parameterName">The name of the parameter</param>
+            <returns>Error</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetParameterName(System.Int32)">
+            <summary>
+            Returns a named parameter for the given ordinal
+            </summary>
+            <param name="parameterOrdinal">The i of the parameter</param>
+            <returns>Error</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetParameterPlaceholder(System.Int32)">
+            <summary>
+            Returns a placeholder character for the specified parameter i.
+            </summary>
+            <param name="parameterOrdinal">The index of the parameter to provide a placeholder for</param>
+            <returns>Returns a named parameter</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.SetRowUpdatingHandler(System.Data.Common.DbDataAdapter)">
+            <summary>
+            Sets the handler for receiving row updating events.  Used by the DbCommandBuilder to autogenerate SQL
+            statements that may not have previously been generated.
+            </summary>
+            <param name="adapter">A data adapter to receive events on.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetDeleteCommand">
+            <summary>
+            Returns the automatically-generated SQLite command to delete rows from the database
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetDeleteCommand(System.Boolean)">
+            <summary>
+            Returns the automatically-generated SQLite command to delete rows from the database
+            </summary>
+            <param name="useColumnsForParameterNames"></param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetUpdateCommand">
+            <summary>
+            Returns the automatically-generated SQLite command to update rows in the database
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetUpdateCommand(System.Boolean)">
+            <summary>
+            Returns the automatically-generated SQLite command to update rows in the database
+            </summary>
+            <param name="useColumnsForParameterNames"></param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetInsertCommand">
+            <summary>
+            Returns the automatically-generated SQLite command to insert rows into the database
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetInsertCommand(System.Boolean)">
+            <summary>
+            Returns the automatically-generated SQLite command to insert rows into the database
+            </summary>
+            <param name="useColumnsForParameterNames"></param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.QuoteIdentifier(System.String)">
+            <summary>
+            Places brackets around an identifier
+            </summary>
+            <param name="unquotedIdentifier">The identifier to quote</param>
+            <returns>The bracketed identifier</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.UnquoteIdentifier(System.String)">
+            <summary>
+            Removes brackets around an identifier
+            </summary>
+            <param name="quotedIdentifier">The quoted (bracketed) identifier</param>
+            <returns>The undecorated identifier</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetSchemaTable(System.Data.Common.DbCommand)">
+            <summary>
+            Override helper, which can help the base command builder choose the right keys for the given query
+            </summary>
+            <param name="sourceCommand"></param>
+            <returns></returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommandBuilder.DataAdapter">
+            <summary>
+            Gets/sets the DataAdapter for this CommandBuilder
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommandBuilder.CatalogLocation">
+            <summary>
+            Overridden to hide its property from the designer
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommandBuilder.CatalogSeparator">
+            <summary>
+            Overridden to hide its property from the designer
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommandBuilder.QuotePrefix">
+            <summary>
+            Overridden to hide its property from the designer
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommandBuilder.QuoteSuffix">
+            <summary>
+            Overridden to hide its property from the designer
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommandBuilder.SchemaSeparator">
+            <summary>
+            Overridden to hide its property from the designer
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.ConnectionEventArgs">
+            <summary>
+            Event data for connection event handlers.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.EventType">
+            <summary>
+            The type of event being raised.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.EventArgs">
+            <summary>
+            The <see cref="T:System.Data.StateChangeEventArgs"/> associated with this event, if any.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.Transaction">
+            <summary>
+            The transaction associated with this event, if any.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.Command">
+            <summary>
+            The command associated with this event, if any.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.DataReader">
+            <summary>
+            The data reader associated with this event, if any.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.CriticalHandle">
+            <summary>
+            The critical handle associated with this event, if any.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.Text">
+            <summary>
+            Command or message text associated with this event, if any.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.Data">
+            <summary>
+            Extra data associated with this event, if any.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.ConnectionEventArgs.#ctor(System.Data.SQLite.SQLiteConnectionEventType,System.Data.StateChangeEventArgs,System.Data.IDbTransaction,System.Data.IDbCommand,System.Data.IDataReader,System.Runtime.InteropServices.CriticalHandle,System.String,System.Object)">
+            <summary>
+            Constructs the object.
+            </summary>
+            <param name="eventType">The type of event being raised.</param>
+            <param name="eventArgs">The base <see cref="F:System.Data.SQLite.ConnectionEventArgs.EventArgs"/> associated
+            with this event, if any.</param>
+            <param name="transaction">The transaction associated with this event, if any.</param>
+            <param name="command">The command associated with this event, if any.</param>
+            <param name="dataReader">The data reader associated with this event, if any.</param>
+            <param name="criticalHandle">The critical handle associated with this event, if any.</param>
+            <param name="text">The command or message text, if any.</param>
+            <param name="data">The extra data, if any.</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnectionEventHandler">
+            <summary>
+            Raised when an event pertaining to a connection occurs.
+            </summary>
+            <param name="sender">The connection involved.</param>
+            <param name="e">Extra information about the event.</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnection">
+            <summary>
+            SQLite implentation of DbConnection.
+            </summary>
+            <remarks>
+            The <see cref="P:System.Data.SQLite.SQLiteConnection.ConnectionString"/> property can contain the following parameter(s), delimited with a semi-colon:
+            <list type="table">
+            <listheader>
+            <term>Parameter</term>
+            <term>Values</term>
+            <term>Required</term>
+            <term>Default</term>
+            </listheader>
+            <item>
+            <description>Data Source</description>
+            <description>
+            This may be a file name, the string ":memory:", or any supported URI (starting with SQLite 3.7.7).
+            Starting with release 1.0.86.0, in order to use more than one consecutive backslash (e.g. for a
+            UNC path), each of the adjoining backslash characters must be doubled (e.g. "\\Network\Share\test.db"
+            would become "\\\\Network\Share\test.db").
+            </description>
+            <description>Y</description>
+            <description></description>
+            </item>
+            <item>
+            <description>Version</description>
+            <description>3</description>
+            <description>N</description>
+            <description>3</description>
+            </item>
+            <item>
+            <description>UseUTF16Encoding</description>
+            <description><b>True</b><br/><b>False</b></description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>DateTimeFormat</description>
+            <description>
+            <b>Ticks</b> - Use the value of DateTime.Ticks.<br/>
+            <b>ISO8601</b> - Use the ISO-8601 format.  Uses the "yyyy-MM-dd HH:mm:ss.FFFFFFFK" format for UTC
+            DateTime values and "yyyy-MM-dd HH:mm:ss.FFFFFFF" format for local DateTime values).<br/>
+            <b>JulianDay</b> - The interval of time in days and fractions of a day since January 1, 4713 BC.<br/>
+            <b>UnixEpoch</b> - The whole number of seconds since the Unix epoch (January 1, 1970).<br/>
+            <b>InvariantCulture</b> - Any culture-independent string value that the .NET Framework can interpret as a valid DateTime.<br/>
+            <b>CurrentCulture</b> - Any string value that the .NET Framework can interpret as a valid DateTime using the current culture.</description>
+            <description>N</description>
+            <description>ISO8601</description>
+            </item>
+            <item>
+            <description>DateTimeKind</description>
+            <description><b>Unspecified</b> - Not specified as either UTC or local time.<br/><b>Utc</b> - The time represented is UTC.<br/><b>Local</b> - The time represented is local time.</description>
+            <description>N</description>
+            <description>Unspecified</description>
+            </item>
+            <item>
+            <description>DateTimeFormatString</description>
+            <description>The exact DateTime format string to use for all formatting and parsing of all DateTime
+            values for this connection.</description>
+            <description>N</description>
+            <description>null</description>
+            </item>
+            <item>
+            <description>BaseSchemaName</description>
+            <description>Some base data classes in the framework (e.g. those that build SQL queries dynamically)
+            assume that an ADO.NET provider cannot support an alternate catalog (i.e. database) without supporting
+            alternate schemas as well; however, SQLite does not fit into this model.  Therefore, this value is used
+            as a placeholder and removed prior to preparing any SQL statements that may contain it.</description>
+            <description>N</description>
+            <description>sqlite_default_schema</description>
+            </item>
+            <item>
+            <description>BinaryGUID</description>
+            <description><b>True</b> - Store GUID columns in binary form<br/><b>False</b> - Store GUID columns as text</description>
+            <description>N</description>
+            <description>True</description>
+            </item>
+            <item>
+            <description>Cache Size</description>
+            <description>{size in bytes}</description>
+            <description>N</description>
+            <description>2000</description>
+            </item>
+            <item>
+            <description>Synchronous</description>
+            <description><b>Normal</b> - Normal file flushing behavior<br/><b>Full</b> - Full flushing after all writes<br/><b>Off</b> - Underlying OS flushes I/O's</description>
+            <description>N</description>
+            <description>Full</description>
+            </item>
+            <item>
+            <description>Page Size</description>
+            <description>{size in bytes}</description>
+            <description>N</description>
+            <description>1024</description>
+            </item>
+            <item>
+            <description>Password</description>
+            <description>{password} - Using this parameter requires that the CryptoAPI based codec be enabled at compile-time for both the native interop assembly and the core managed assemblies; otherwise, using this parameter may result in an exception being thrown when attempting to open the connection.</description>
+            <description>N</description>
+            <description></description>
+            </item>
+            <item>
+            <description>HexPassword</description>
+            <description>{hexPassword} - Must contain a sequence of zero or more hexadecimal encoded byte values without a leading "0x" prefix.  Using this parameter requires that the CryptoAPI based codec be enabled at compile-time for both the native interop assembly and the core managed assemblies; otherwise, using this parameter may result in an exception being thrown when attempting to open the connection.</description>
+            <description>N</description>
+            <description></description>
+            </item>
+            <item>
+            <description>Enlist</description>
+            <description><b>Y</b> - Automatically enlist in distributed transactions<br/><b>N</b> - No automatic enlistment</description>
+            <description>N</description>
+            <description>Y</description>
+            </item>
+            <item>
+            <description>Pooling</description>
+            <description>
+            <b>True</b> - Use connection pooling.<br/>
+            <b>False</b> - Do not use connection pooling.<br/><br/>
+            <b>WARNING:</b> When using the default connection pool implementation,
+            setting this property to True should be avoided by applications that make
+            use of COM (either directly or indirectly) due to possible deadlocks that
+            can occur during the finalization of some COM objects.
+            </description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>FailIfMissing</description>
+            <description><b>True</b> - Don't create the database if it does not exist, throw an error instead<br/><b>False</b> - Automatically create the database if it does not exist</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Max Page Count</description>
+            <description>{size in pages} - Limits the maximum number of pages (limits the size) of the database</description>
+            <description>N</description>
+            <description>0</description>
+            </item>
+            <item>
+            <description>Legacy Format</description>
+            <description><b>True</b> - Use the more compatible legacy 3.x database format<br/><b>False</b> - Use the newer 3.3x database format which compresses numbers more effectively</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Default Timeout</description>
+            <description>{time in seconds}<br/>The default command timeout</description>
+            <description>N</description>
+            <description>30</description>
+            </item>
+            <item>
+            <description>Journal Mode</description>
+            <description><b>Delete</b> - Delete the journal file after a commit<br/><b>Persist</b> - Zero out and leave the journal file on disk after a commit<br/><b>Off</b> - Disable the rollback journal entirely</description>
+            <description>N</description>
+            <description>Delete</description>
+            </item>
+            <item>
+            <description>Read Only</description>
+            <description><b>True</b> - Open the database for read only access<br/><b>False</b> - Open the database for normal read/write access</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Max Pool Size</description>
+            <description>The maximum number of connections for the given connection string that can be in the connection pool</description>
+            <description>N</description>
+            <description>100</description>
+            </item>
+            <item>
+            <description>Default IsolationLevel</description>
+            <description>The default transaciton isolation level</description>
+            <description>N</description>
+            <description>Serializable</description>
+            </item>
+            <item>
+            <description>Foreign Keys</description>
+            <description>Enable foreign key constraints</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Flags</description>
+            <description>Extra behavioral flags for the connection.  See the <see cref="T:System.Data.SQLite.SQLiteConnectionFlags"/> enumeration for possible values.</description>
+            <description>N</description>
+            <description>Default</description>
+            </item>
+            <item>
+            <description>SetDefaults</description>
+            <description>
+            <b>True</b> - Apply the default connection settings to the opened database.<br/>
+            <b>False</b> - Skip applying the default connection settings to the opened database.
+            </description>
+            <description>N</description>
+            <description>True</description>
+            </item>
+            <item>
+            <description>ToFullPath</description>
+            <description>
+            <b>True</b> - Attempt to expand the data source file name to a fully qualified path before opening.<br/>
+            <b>False</b> - Skip attempting to expand the data source file name to a fully qualified path before opening.
+            </description>
+            <description>N</description>
+            <description>True</description>
+            </item>
+            </list>
+            </remarks>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection.DefaultBaseSchemaName">
+            <summary>
+            The default "stub" (i.e. placeholder) base schema name to use when
+            returning column schema information.  Used as the initial value of
+            the BaseSchemaName property.  This should start with "sqlite_*"
+            because those names are reserved for use by SQLite (i.e. they cannot
+            be confused with the names of user objects).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._assembly">
+            <summary>
+            The managed assembly containing this type.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._syncRoot">
+            <summary>
+            Object used to synchronize access to the static instance data
+            for this class.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._connectionState">
+            <summary>
+            State of the current connection
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._connectionString">
+            <summary>
+            The connection string
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._transactionLevel">
+            <summary>
+            Nesting level of the transactions open on the connection
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._disposing">
+            <summary>
+            If set, then the connection is currently being disposed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._defaultIsolation">
+            <summary>
+            The default isolation level for new transactions
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._enlistment">
+            <summary>
+            Whether or not the connection is enlisted in a distrubuted transaction
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._sql">
+            <summary>
+            The base SQLite object to interop with
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._dataSource">
+            <summary>
+            The database filename minus path and extension
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._password">
+            <summary>
+            Temporary password storage, emptied after the database has been opened
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._baseSchemaName">
+            <summary>
+            The "stub" (i.e. placeholder) base schema name to use when returning
+            column schema information.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._flags">
+            <summary>
+            The extra behavioral flags for this connection, if any.  See the
+            <see cref="T:System.Data.SQLite.SQLiteConnectionFlags"/> enumeration for a list of
+            possible values.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._defaultTimeout">
+            <summary>
+            Default command timeout
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._parseViaFramework">
+            <summary>
+            Non-zero if the built-in (i.e. framework provided) connection string
+            parser should be used when opening the connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.#ctor">
+            <overloads>
+             Constructs a new SQLiteConnection object
+             </overloads>
+             <summary>
+             Default constructor
+             </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.#ctor(System.String)">
+            <summary>
+            Initializes the connection with the specified connection string.
+            </summary>
+            <param name="connectionString">The connection string to use.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.#ctor(System.IntPtr,System.String,System.Boolean)">
+            <summary>
+            Initializes the connection with a pre-existing native connection handle.
+            This constructor overload is intended to be used only by the private
+            <see cref="M:System.Data.SQLite.SQLiteModule.CreateOrConnect(System.Boolean,System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="db">
+            The native connection handle to use.
+            </param>
+            <param name="fileName">
+            The file name corresponding to the native connection handle.
+            </param>
+            <param name="ownHandle">
+            Non-zero if this instance owns the native connection handle and
+            should dispose of it when it is no longer needed.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.#ctor(System.String,System.Boolean)">
+            <summary>
+            Initializes the connection with the specified connection string.
+            </summary>
+            <param name="connectionString">
+            The connection string to use.
+            </param>
+            <param name="parseViaFramework">
+            Non-zero to parse the connection string using the built-in (i.e.
+            framework provided) parser when opening the connection.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.#ctor(System.Data.SQLite.SQLiteConnection)">
+            <summary>
+            Clones the settings and connection string from an existing connection.  If the existing connection is already open, this
+            function will open its own connection, enumerate any attached databases of the original connection, and automatically
+            attach to them.
+            </summary>
+            <param name="connection">The connection to copy the settings from.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.OnChanged(System.Data.SQLite.SQLiteConnection,System.Data.SQLite.ConnectionEventArgs)">
+            <summary>
+            Raises the <see cref="E:System.Data.SQLite.SQLiteConnection.Changed"/> event.
+            </summary>
+            <param name="connection">
+            The connection associated with this event.  If this parameter is not
+            null and the specified connection cannot raise events, then the
+            registered event handlers will not be invoked.
+            </param>
+            <param name="e">
+            A <see cref="T:System.Data.SQLite.ConnectionEventArgs"/> that contains the event data.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.CreateHandle(System.IntPtr)">
+            <summary>
+            Creates and returns a new managed database connection handle.  This
+            method is intended to be used by implementations of the
+            <see cref="T:System.Data.SQLite.ISQLiteConnectionPool"/> interface only.  In theory, it
+            could be used by other classes; however, that usage is not supported.
+            </summary>
+            <param name="nativeHandle">
+            This must be a native database connection handle returned by the
+            SQLite core library and it must remain valid and open during the
+            entire duration of the calling method.
+            </param>
+            <returns>
+            The new managed database connection handle or null if it cannot be
+            created.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BackupDatabase(System.Data.SQLite.SQLiteConnection,System.String,System.String,System.Int32,System.Data.SQLite.SQLiteBackupCallback,System.Int32)">
+            <summary>
+            Backs up the database, using the specified database connection as the
+            destination.
+            </summary>
+            <param name="destination">The destination database connection.</param>
+            <param name="destinationName">The destination database name.</param>
+            <param name="sourceName">The source database name.</param>
+            <param name="pages">
+            The number of pages to copy or negative to copy all remaining pages.
+            </param>
+            <param name="callback">
+            The method to invoke between each step of the backup process.  This
+            parameter may be null (i.e. no callbacks will be performed).
+            </param>
+            <param name="retryMilliseconds">
+            The number of milliseconds to sleep after encountering a locking error
+            during the backup process.  A value less than zero means that no sleep
+            should be performed.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BindFunction(System.Data.SQLite.SQLiteFunctionAttribute,System.Data.SQLite.SQLiteFunction)">
+            <summary>
+            Attempts to bind the specified <see cref="T:System.Data.SQLite.SQLiteFunction"/> object
+            instance to this connection.
+            </summary>
+            <param name="functionAttribute">
+            The <see cref="T:System.Data.SQLite.SQLiteFunctionAttribute"/> object instance containing
+            the metadata for the function to be bound.
+            </param>
+            <param name="function">
+            The <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance that implements the
+            function to be bound.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Clone">
+            <summary>
+            Creates a clone of the connection.  All attached databases and user-defined functions are cloned.  If the existing connection is open, the cloned connection
+            will also be opened.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.CreateFile(System.String)">
+            <summary>
+            Creates a database file.  This just creates a zero-byte file which SQLite
+            will turn into a database when the file is opened properly.
+            </summary>
+            <param name="databaseFileName">The file to create</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.OnStateChange(System.Data.ConnectionState,System.Data.StateChangeEventArgs@)">
+            <summary>
+            Raises the state change event when the state of the connection changes
+            </summary>
+            <param name="newState">The new connection state.  If this is different
+            from the previous state, the <see cref="E:System.Data.SQLite.SQLiteConnection.StateChange"/> event is
+            raised.</param>
+            <param name="eventArgs">The event data created for the raised event, if
+            it was actually raised.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.GetFallbackDefaultIsolationLevel">
+            <summary>
+            Determines and returns the fallback default isolation level when one cannot be
+            obtained from an existing connection instance.
+            </summary>
+            <returns>
+            The fallback default isolation level for this connection instance -OR-
+            <see cref="F:System.Data.IsolationLevel.Unspecified"/> if it cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.GetDefaultIsolationLevel">
+            <summary>
+            Determines and returns the default isolation level for this connection instance.
+            </summary>
+            <returns>
+            The default isolation level for this connection instance -OR-
+            <see cref="F:System.Data.IsolationLevel.Unspecified"/> if it cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BeginTransaction(System.Data.IsolationLevel,System.Boolean)">
+            <summary>
+            OBSOLETE.  Creates a new SQLiteTransaction if one isn't already active on the connection.
+            </summary>
+            <param name="isolationLevel">This parameter is ignored.</param>
+            <param name="deferredLock">When TRUE, SQLite defers obtaining a write lock until a write operation is requested.
+            When FALSE, a writelock is obtained immediately.  The default is TRUE, but in a multi-threaded multi-writer
+            environment, one may instead choose to lock the database immediately to avoid any possible writer deadlock.</param>
+            <returns>Returns a SQLiteTransaction object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BeginTransaction(System.Boolean)">
+            <summary>
+            OBSOLETE.  Creates a new SQLiteTransaction if one isn't already active on the connection.
+            </summary>
+            <param name="deferredLock">When TRUE, SQLite defers obtaining a write lock until a write operation is requested.
+            When FALSE, a writelock is obtained immediately.  The default is false, but in a multi-threaded multi-writer
+            environment, one may instead choose to lock the database immediately to avoid any possible writer deadlock.</param>
+            <returns>Returns a SQLiteTransaction object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BeginTransaction(System.Data.IsolationLevel)">
+            <summary>
+            Creates a new <see cref="T:System.Data.SQLite.SQLiteTransaction"/> if one isn't already active on the connection.
+            </summary>
+            <param name="isolationLevel">Supported isolation levels are Serializable, ReadCommitted and Unspecified.</param>
+            <remarks>
+            Unspecified will use the default isolation level specified in the connection string.  If no isolation level is specified in the
+            connection string, Serializable is used.
+            Serializable transactions are the default.  In this mode, the engine gets an immediate lock on the database, and no other threads
+            may begin a transaction.  Other threads may read from the database, but not write.
+            With a ReadCommitted isolation level, locks are deferred and elevated as needed.  It is possible for multiple threads to start
+            a transaction in ReadCommitted mode, but if a thread attempts to commit a transaction while another thread
+            has a ReadCommitted lock, it may timeout or cause a deadlock on both threads until both threads' CommandTimeout's are reached.
+            </remarks>
+            <returns>Returns a SQLiteTransaction object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BeginTransaction">
+            <summary>
+            Creates a new <see cref="T:System.Data.SQLite.SQLiteTransaction"/> if one isn't already
+            active on the connection.
+            </summary>
+            <returns>Returns the new transaction object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BeginDbTransaction(System.Data.IsolationLevel)">
+            <summary>
+            Forwards to the local <see cref="M:System.Data.SQLite.SQLiteConnection.BeginTransaction(System.Data.IsolationLevel)"/> function
+            </summary>
+            <param name="isolationLevel">Supported isolation levels are Unspecified, Serializable, and ReadCommitted</param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ChangeDatabase(System.String)">
+            <summary>
+            This method is not implemented; however, the <see cref="E:System.Data.SQLite.SQLiteConnection.Changed"/>
+            event will still be raised.
+            </summary>
+            <param name="databaseName"></param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Close">
+            <summary>
+            When the database connection is closed, all commands linked to this connection are automatically reset.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ClearPool(System.Data.SQLite.SQLiteConnection)">
+            <summary>
+            Clears the connection pool associated with the connection.  Any other active connections using the same database file
+            will be discarded instead of returned to the pool when they are closed.
+            </summary>
+            <param name="connection"></param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ClearAllPools">
+            <summary>
+            Clears all connection pools.  Any active connections will be discarded instead of sent to the pool when they are closed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.CreateCommand">
+            <summary>
+            Create a new <see cref="T:System.Data.SQLite.SQLiteCommand"/> and associate it with this connection.
+            </summary>
+            <returns>Returns a new command object already assigned to this connection.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.CreateDbCommand">
+            <summary>
+            Forwards to the local <see cref="M:System.Data.SQLite.SQLiteConnection.CreateCommand"/> function.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ParseConnectionString(System.String)">
+            <summary>
+            Parses the connection string into component parts using the custom
+            connection string parser.
+            </summary>
+            <param name="connectionString">The connection string to parse</param>
+            <returns>An array of key-value pairs representing each parameter of the connection string</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ParseConnectionStringViaFramework(System.String,System.Boolean)">
+            <summary>
+            Parses a connection string using the built-in (i.e. framework provided)
+            connection string parser class and returns the key/value pairs.  An
+            exception may be thrown if the connection string is invalid or cannot be
+            parsed.  When compiled for the .NET Compact Framework, the custom
+            connection string parser is always used instead because the framework
+            provided one is unavailable there.
+            </summary>
+            <param name="connectionString">
+            The connection string to parse.
+            </param>
+            <param name="strict">
+            Non-zero to throw an exception if any connection string values are not of
+            the <see cref="T:System.String"/> type.
+            </param>
+            <returns>The list of key/value pairs.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.EnlistTransaction(System.Transactions.Transaction)">
+            <summary>
+            Manual distributed transaction enlistment support
+            </summary>
+            <param name="transaction">The distributed transaction to enlist in</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.FindKey(System.Collections.Generic.SortedList{System.String,System.String},System.String,System.String)">
+            <summary>
+            Looks for a key in the array of key/values of the parameter string.  If not found, return the specified default value
+            </summary>
+            <param name="items">The list to look in</param>
+            <param name="key">The key to find</param>
+            <param name="defValue">The default value to return if the key is not found</param>
+            <returns>The value corresponding to the specified key, or the default value if not found.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.TryParseEnum(System.Type,System.String,System.Boolean)">
+            <summary>
+            Attempts to convert the string value to an enumerated value of the specified type.
+            </summary>
+            <param name="type">The enumerated type to convert the string value to.</param>
+            <param name="value">The string value to be converted.</param>
+            <param name="ignoreCase">Non-zero to make the conversion case-insensitive.</param>
+            <returns>The enumerated value upon success or null upon error.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.TryParseByte(System.String,System.Globalization.NumberStyles,System.Byte@)">
+            <summary>
+            Attempts to convert an input string into a byte value.
+            </summary>
+            <param name="value">
+            The string value to be converted.
+            </param>
+            <param name="style">
+            The number styles to use for the conversion.
+            </param>
+            <param name="result">
+            Upon sucess, this will contain the parsed byte value.
+            Upon failure, the value of this parameter is undefined.
+            </param>
+            <returns>
+            Non-zero upon success; zero on failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.EnableExtensions(System.Boolean)">
+            <summary>
+            Enables or disabled extension loading.
+            </summary>
+            <param name="enable">
+            True to enable loading of extensions, false to disable.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.LoadExtension(System.String)">
+            <summary>
+            Loads a SQLite extension library from the named dynamic link library file.
+            </summary>
+            <param name="fileName">
+            The name of the dynamic link library file containing the extension.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.LoadExtension(System.String,System.String)">
+            <summary>
+            Loads a SQLite extension library from the named dynamic link library file.
+            </summary>
+            <param name="fileName">
+            The name of the dynamic link library file containing the extension.
+            </param>
+            <param name="procName">
+            The name of the exported function used to initialize the extension.
+            If null, the default "sqlite3_extension_init" will be used.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.CreateModule(System.Data.SQLite.SQLiteModule)">
+            <summary>
+            Creates a disposable module containing the implementation of a virtual
+            table.
+            </summary>
+            <param name="module">
+            The module object to be used when creating the disposable module.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.FromHexString(System.String)">
+            <summary>
+            Parses a string containing a sequence of zero or more hexadecimal
+            encoded byte values and returns the resulting byte array.  The
+            "0x" prefix is not allowed on the input string.
+            </summary>
+            <param name="text">
+            The input string containing zero or more hexadecimal encoded byte
+            values.
+            </param>
+            <returns>
+            A byte array containing the parsed byte values or null if an error
+            was encountered.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ToHexString(System.Byte[])">
+            <summary>
+            Creates and returns a string containing the hexadecimal encoded byte
+            values from the input array.
+            </summary>
+            <param name="array">
+            The input array of bytes.
+            </param>
+            <returns>
+            The resulting string or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.FromHexString(System.String,System.String@)">
+            <summary>
+            Parses a string containing a sequence of zero or more hexadecimal
+            encoded byte values and returns the resulting byte array.  The
+            "0x" prefix is not allowed on the input string.
+            </summary>
+            <param name="text">
+            The input string containing zero or more hexadecimal encoded byte
+            values.
+            </param>
+            <param name="error">
+            Upon failure, this will contain an appropriate error message.
+            </param>
+            <returns>
+            A byte array containing the parsed byte values or null if an error
+            was encountered.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Open">
+            <summary>
+            Opens the connection using the parameters found in the <see cref="P:System.Data.SQLite.SQLiteConnection.ConnectionString"/>.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.OpenAndReturn">
+            <summary>
+            Opens the connection using the parameters found in the <see cref="P:System.Data.SQLite.SQLiteConnection.ConnectionString"/> and then returns it.
+            </summary>
+            <returns>The current connection object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Cancel">
+            <summary>
+            This method causes any pending database operation to abort and return at
+            its earliest opportunity.  This routine is typically called in response
+            to a user action such as pressing "Cancel" or Ctrl-C where the user wants
+            a long query operation to halt immediately.  It is safe to call this
+            routine from any thread.  However, it is not safe to call this routine
+            with a database connection that is closed or might close before this method
+            returns.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.GetMemoryStatistics(System.Collections.Generic.IDictionary{System.String,System.Int64}@)">
+            <summary>
+            Returns various global memory statistics for the SQLite core library via
+            a dictionary of key/value pairs.  Currently, only the "MemoryUsed" and
+            "MemoryHighwater" keys are returned and they have values that correspond
+            to the values that could be obtained via the <see cref="P:System.Data.SQLite.SQLiteConnection.MemoryUsed"/>
+            and <see cref="P:System.Data.SQLite.SQLiteConnection.MemoryHighwater"/> connection properties.
+            </summary>
+            <param name="statistics">
+            This dictionary will be populated with the global memory statistics.  It
+            will be created if necessary.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ReleaseMemory">
+            <summary>
+            Attempts to free as much heap memory as possible for this database connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ReleaseMemory(System.Int32,System.Boolean,System.Boolean,System.Int32@,System.Boolean@,System.UInt32@)">
+            <summary>
+            Attempts to free N bytes of heap memory by deallocating non-essential memory
+            allocations held by the database library. Memory used to cache database pages
+            to improve performance is an example of non-essential memory.  This is a no-op
+            returning zero if the SQLite core library was not compiled with the compile-time
+            option SQLITE_ENABLE_MEMORY_MANAGEMENT.  Optionally, attempts to reset and/or
+            compact the Win32 native heap, if applicable.
+            </summary>
+            <param name="nBytes">
+            The requested number of bytes to free.
+            </param>
+            <param name="reset">
+            Non-zero to attempt a heap reset.
+            </param>
+            <param name="compact">
+            Non-zero to attempt heap compaction.
+            </param>
+            <param name="nFree">
+            The number of bytes actually freed.  This value may be zero.
+            </param>
+            <param name="resetOk">
+            This value will be non-zero if the heap reset was successful.
+            </param>
+            <param name="nLargest">
+            The size of the largest committed free block in the heap, in bytes.
+            This value will be zero unless heap compaction is enabled.
+            </param>
+            <returns>
+            A standard SQLite return code (i.e. zero for success and non-zero
+            for failure).
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.SetMemoryStatus(System.Boolean)">
+            <summary>
+            Sets the status of the memory usage tracking subsystem in the SQLite core library.  By default, this is enabled.
+            If this is disabled, memory usage tracking will not be performed.  This is not really a per-connection value, it is
+            global to the process.
+            </summary>
+            <param name="value">Non-zero to enable memory usage tracking, zero otherwise.</param>
+            <returns>A standard SQLite return code (i.e. zero for success and non-zero for failure).</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Shutdown">
+            <summary>
+            Passes a shutdown request to the SQLite core library.  Does not throw
+            an exception if the shutdown request fails.
+            </summary>
+            <returns>
+            A standard SQLite return code (i.e. zero for success and non-zero for
+            failure).
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Shutdown(System.Boolean,System.Boolean)">
+            <summary>
+            Passes a shutdown request to the SQLite core library.  Throws an
+            exception if the shutdown request fails and the no-throw parameter
+            is non-zero.
+            </summary>
+            <param name="directories">
+            Non-zero to reset the database and temporary directories to their
+            default values, which should be null for both.
+            </param>
+            <param name="noThrow">
+            When non-zero, throw an exception if the shutdown request fails.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.SetExtendedResultCodes(System.Boolean)">
+            Enables or disabled extended result codes returned by SQLite
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ResultCode">
+            Enables or disabled extended result codes returned by SQLite
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ExtendedResultCode">
+            Enables or disabled extended result codes returned by SQLite
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.LogMessage(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            Add a log message via the SQLite sqlite3_log interface.
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.LogMessage(System.Int32,System.String)">
+            Add a log message via the SQLite sqlite3_log interface.
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ChangePassword(System.String)">
+            <summary>
+            Change the password (or assign a password) to an open database.
+            </summary>
+            <remarks>
+            No readers or writers may be active for this process.  The database must already be open
+            and if it already was password protected, the existing password must already have been supplied.
+            </remarks>
+            <param name="newPassword">The new password to assign to the database</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ChangePassword(System.Byte[])">
+            <summary>
+            Change the password (or assign a password) to an open database.
+            </summary>
+            <remarks>
+            No readers or writers may be active for this process.  The database must already be open
+            and if it already was password protected, the existing password must already have been supplied.
+            </remarks>
+            <param name="newPassword">The new password to assign to the database</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.SetPassword(System.String)">
+            <summary>
+            Sets the password for a password-protected database.  A password-protected database is
+            unusable for any operation until the password has been set.
+            </summary>
+            <param name="databasePassword">The password for the database</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.SetPassword(System.Byte[])">
+            <summary>
+            Sets the password for a password-protected database.  A password-protected database is
+            unusable for any operation until the password has been set.
+            </summary>
+            <param name="databasePassword">The password for the database</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.SetAvRetry(System.Int32@,System.Int32@)">
+            <summary>
+            Queries or modifies the number of retries or the retry interval (in milliseconds) for
+            certain I/O operations that may fail due to anti-virus software.
+            </summary>
+            <param name="count">The number of times to retry the I/O operation.  A negative value
+            will cause the current count to be queried and replace that negative value.</param>
+            <param name="interval">The number of milliseconds to wait before retrying the I/O
+            operation.  This number is multiplied by the number of retry attempts so far to come
+            up with the final number of milliseconds to wait.  A negative value will cause the
+            current interval to be queried and replace that negative value.</param>
+            <returns>Zero for success, non-zero for error.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.UnwrapString(System.String)">
+            <summary>
+            Removes one set of surrounding single -OR- double quotes from the string
+            value and returns the resulting string value.  If the string is null, empty,
+            or contains quotes that are not balanced, nothing is done and the original
+            string value will be returned.
+            </summary>
+            <param name="value">The string value to process.</param>
+            <returns>
+            The string value, modified to remove one set of surrounding single -OR-
+            double quotes, if applicable.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ExpandFileName(System.String,System.Boolean)">
+            <summary>
+            Expand the filename of the data source, resolving the |DataDirectory|
+            macro as appropriate.
+            </summary>
+            <param name="sourceFile">The database filename to expand</param>
+            <param name="toFullPath">
+            Non-zero if the returned file name should be converted to a full path
+            (except when using the .NET Compact Framework).
+            </param>
+            <returns>The expanded path and filename of the filename</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.GetSchema">
+            <overloads>
+             The following commands are used to extract schema information out of the database.  Valid schema types are:
+             <list type="bullet">
+             <item>
+             <description>MetaDataCollections</description>
+             </item>
+             <item>
+             <description>DataSourceInformation</description>
+             </item>
+             <item>
+             <description>Catalogs</description>
+             </item>
+             <item>
+             <description>Columns</description>
+             </item>
+             <item>
+             <description>ForeignKeys</description>
+             </item>
+             <item>
+             <description>Indexes</description>
+             </item>
+             <item>
+             <description>IndexColumns</description>
+             </item>
+             <item>
+             <description>Tables</description>
+             </item>
+             <item>
+             <description>Views</description>
+             </item>
+             <item>
+             <description>ViewColumns</description>
+             </item>
+             </list>
+             </overloads>
+             <summary>
+             Returns the MetaDataCollections schema
+             </summary>
+             <returns>A DataTable of the MetaDataCollections schema</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.GetSchema(System.String)">
+            <summary>
+            Returns schema information of the specified collection
+            </summary>
+            <param name="collectionName">The schema collection to retrieve</param>
+            <returns>A DataTable of the specified collection</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.GetSchema(System.String,System.String[])">
+            <summary>
+            Retrieves schema information using the specified constraint(s) for the specified collection
+            </summary>
+            <param name="collectionName">The collection to retrieve</param>
+            <param name="restrictionValues">The restrictions to impose</param>
+            <returns>A DataTable of the specified collection</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_MetaDataCollections">
+            <summary>
+            Builds a MetaDataCollections schema datatable
+            </summary>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_DataSourceInformation">
+            <summary>
+            Builds a DataSourceInformation datatable
+            </summary>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_Columns(System.String,System.String,System.String)">
+            <summary>
+            Build a Columns schema
+            </summary>
+            <param name="strCatalog">The catalog (attached database) to query, can be null</param>
+            <param name="strTable">The table to retrieve schema information for, must not be null</param>
+            <param name="strColumn">The column to retrieve schema information for, can be null</param>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_Indexes(System.String,System.String,System.String)">
+            <summary>
+            Returns index information for the given database and catalog
+            </summary>
+            <param name="strCatalog">The catalog (attached database) to query, can be null</param>
+            <param name="strIndex">The name of the index to retrieve information for, can be null</param>
+            <param name="strTable">The table to retrieve index information for, can be null</param>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_Tables(System.String,System.String,System.String)">
+            <summary>
+            Retrieves table schema information for the database and catalog
+            </summary>
+            <param name="strCatalog">The catalog (attached database) to retrieve tables on</param>
+            <param name="strTable">The table to retrieve, can be null</param>
+            <param name="strType">The table type, can be null</param>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_Views(System.String,System.String)">
+            <summary>
+            Retrieves view schema information for the database
+            </summary>
+            <param name="strCatalog">The catalog (attached database) to retrieve views on</param>
+            <param name="strView">The view name, can be null</param>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_Catalogs(System.String)">
+            <summary>
+            Retrieves catalog (attached databases) schema information for the database
+            </summary>
+            <param name="strCatalog">The catalog to retrieve, can be null</param>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_IndexColumns(System.String,System.String,System.String,System.String)">
+            <summary>
+            Returns the base column information for indexes in a database
+            </summary>
+            <param name="strCatalog">The catalog to retrieve indexes for (can be null)</param>
+            <param name="strTable">The table to restrict index information by (can be null)</param>
+            <param name="strIndex">The index to restrict index information by (can be null)</param>
+            <param name="strColumn">The source column to restrict index information by (can be null)</param>
+            <returns>A DataTable containing the results</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_ViewColumns(System.String,System.String,System.String)">
+            <summary>
+            Returns detailed column information for a specified view
+            </summary>
+            <param name="strCatalog">The catalog to retrieve columns for (can be null)</param>
+            <param name="strView">The view to restrict column information by (can be null)</param>
+            <param name="strColumn">The source column to restrict column information by (can be null)</param>
+            <returns>A DataTable containing the results</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_ForeignKeys(System.String,System.String,System.String)">
+            <summary>
+            Retrieves foreign key information from the specified set of filters
+            </summary>
+            <param name="strCatalog">An optional catalog to restrict results on</param>
+            <param name="strTable">An optional table to restrict results on</param>
+            <param name="strKeyName">An optional foreign key name to restrict results on</param>
+            <returns>A DataTable with the results of the query</returns>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection._handlers">
+            <summary>
+            Static variable to store the connection event handlers to call.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.StateChange">
+            <summary>
+            This event is raised whenever the database is opened or closed.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.Changed">
+            <summary>
+            This event is raised when events related to the lifecycle of a
+            SQLiteConnection object occur.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.ConnectionPool">
+            <summary>
+            This property is used to obtain or set the custom connection pool
+            implementation to use, if any.  Setting this property to null will
+            cause the default connection pool implementation to be used.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.PoolCount">
+            <summary>
+            Returns the number of pool entries for the file name associated with this connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.ConnectionString">
+            <summary>
+            The connection string containing the parameters for the connection
+            </summary>
+            <remarks>
+            <list type="table">
+            <listheader>
+            <term>Parameter</term>
+            <term>Values</term>
+            <term>Required</term>
+            <term>Default</term>
+            </listheader>
+            <item>
+            <description>Data Source</description>
+            <description>
+            This may be a file name, the string ":memory:", or any supported URI (starting with SQLite 3.7.7).
+            Starting with release 1.0.86.0, in order to use more than one consecutive backslash (e.g. for a
+            UNC path), each of the adjoining backslash characters must be doubled (e.g. "\\Network\Share\test.db"
+            would become "\\\\Network\Share\test.db").
+            </description>
+            <description>Y</description>
+            <description></description>
+            </item>
+            <item>
+            <description>Version</description>
+            <description>3</description>
+            <description>N</description>
+            <description>3</description>
+            </item>
+            <item>
+            <description>UseUTF16Encoding</description>
+            <description><b>True</b><br/><b>False</b></description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>DateTimeFormat</description>
+            <description>
+            <b>Ticks</b> - Use the value of DateTime.Ticks.<br/>
+            <b>ISO8601</b> - Use the ISO-8601 format.  Uses the "yyyy-MM-dd HH:mm:ss.FFFFFFFK" format for UTC
+            DateTime values and "yyyy-MM-dd HH:mm:ss.FFFFFFF" format for local DateTime values).<br/>
+            <b>JulianDay</b> - The interval of time in days and fractions of a day since January 1, 4713 BC.<br/>
+            <b>UnixEpoch</b> - The whole number of seconds since the Unix epoch (January 1, 1970).<br/>
+            <b>InvariantCulture</b> - Any culture-independent string value that the .NET Framework can interpret as a valid DateTime.<br/>
+            <b>CurrentCulture</b> - Any string value that the .NET Framework can interpret as a valid DateTime using the current culture.</description>
+            <description>N</description>
+            <description>ISO8601</description>
+            </item>
+            <item>
+            <description>DateTimeKind</description>
+            <description><b>Unspecified</b> - Not specified as either UTC or local time.<br/><b>Utc</b> - The time represented is UTC.<br/><b>Local</b> - The time represented is local time.</description>
+            <description>N</description>
+            <description>Unspecified</description>
+            </item>
+            <item>
+            <description>DateTimeFormatString</description>
+            <description>The exact DateTime format string to use for all formatting and parsing of all DateTime
+            values for this connection.</description>
+            <description>N</description>
+            <description>null</description>
+            </item>
+            <item>
+            <description>BaseSchemaName</description>
+            <description>Some base data classes in the framework (e.g. those that build SQL queries dynamically)
+            assume that an ADO.NET provider cannot support an alternate catalog (i.e. database) without supporting
+            alternate schemas as well; however, SQLite does not fit into this model.  Therefore, this value is used
+            as a placeholder and removed prior to preparing any SQL statements that may contain it.</description>
+            <description>N</description>
+            <description>sqlite_default_schema</description>
+            </item>
+            <item>
+            <description>BinaryGUID</description>
+            <description><b>True</b> - Store GUID columns in binary form<br/><b>False</b> - Store GUID columns as text</description>
+            <description>N</description>
+            <description>True</description>
+            </item>
+            <item>
+            <description>Cache Size</description>
+            <description>{size in bytes}</description>
+            <description>N</description>
+            <description>2000</description>
+            </item>
+            <item>
+            <description>Synchronous</description>
+            <description><b>Normal</b> - Normal file flushing behavior<br/><b>Full</b> - Full flushing after all writes<br/><b>Off</b> - Underlying OS flushes I/O's</description>
+            <description>N</description>
+            <description>Full</description>
+            </item>
+            <item>
+            <description>Page Size</description>
+            <description>{size in bytes}</description>
+            <description>N</description>
+            <description>1024</description>
+            </item>
+            <item>
+            <description>Password</description>
+            <description>{password} - Using this parameter requires that the CryptoAPI based codec be enabled at compile-time for both the native interop assembly and the core managed assemblies; otherwise, using this parameter may result in an exception being thrown when attempting to open the connection.</description>
+            <description>N</description>
+            <description></description>
+            </item>
+            <item>
+            <description>HexPassword</description>
+            <description>{hexPassword} - Must contain a sequence of zero or more hexadecimal encoded byte values without a leading "0x" prefix.  Using this parameter requires that the CryptoAPI based codec be enabled at compile-time for both the native interop assembly and the core managed assemblies; otherwise, using this parameter may result in an exception being thrown when attempting to open the connection.</description>
+            <description>N</description>
+            <description></description>
+            </item>
+            <item>
+            <description>Enlist</description>
+            <description><b>Y</b> - Automatically enlist in distributed transactions<br/><b>N</b> - No automatic enlistment</description>
+            <description>N</description>
+            <description>Y</description>
+            </item>
+            <item>
+            <description>Pooling</description>
+            <description>
+            <b>True</b> - Use connection pooling.<br/>
+            <b>False</b> - Do not use connection pooling.<br/><br/>
+            <b>WARNING:</b> When using the default connection pool implementation,
+            setting this property to True should be avoided by applications that
+            make use of COM (either directly or indirectly) due to possible
+            deadlocks that can occur during the finalization of some COM objects.
+            </description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>FailIfMissing</description>
+            <description><b>True</b> - Don't create the database if it does not exist, throw an error instead<br/><b>False</b> - Automatically create the database if it does not exist</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Max Page Count</description>
+            <description>{size in pages} - Limits the maximum number of pages (limits the size) of the database</description>
+            <description>N</description>
+            <description>0</description>
+            </item>
+            <item>
+            <description>Legacy Format</description>
+            <description><b>True</b> - Use the more compatible legacy 3.x database format<br/><b>False</b> - Use the newer 3.3x database format which compresses numbers more effectively</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Default Timeout</description>
+            <description>{time in seconds}<br/>The default command timeout</description>
+            <description>N</description>
+            <description>30</description>
+            </item>
+            <item>
+            <description>Journal Mode</description>
+            <description><b>Delete</b> - Delete the journal file after a commit<br/><b>Persist</b> - Zero out and leave the journal file on disk after a commit<br/><b>Off</b> - Disable the rollback journal entirely</description>
+            <description>N</description>
+            <description>Delete</description>
+            </item>
+            <item>
+            <description>Read Only</description>
+            <description><b>True</b> - Open the database for read only access<br/><b>False</b> - Open the database for normal read/write access</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Max Pool Size</description>
+            <description>The maximum number of connections for the given connection string that can be in the connection pool</description>
+            <description>N</description>
+            <description>100</description>
+            </item>
+            <item>
+            <description>Default IsolationLevel</description>
+            <description>The default transaciton isolation level</description>
+            <description>N</description>
+            <description>Serializable</description>
+            </item>
+            <item>
+            <description>Foreign Keys</description>
+            <description>Enable foreign key constraints</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Flags</description>
+            <description>Extra behavioral flags for the connection.  See the <see cref="T:System.Data.SQLite.SQLiteConnectionFlags"/> enumeration for possible values.</description>
+            <description>N</description>
+            <description>Default</description>
+            </item>
+            <item>
+            <description>SetDefaults</description>
+            <description>
+            <b>True</b> - Apply the default connection settings to the opened database.<br/>
+            <b>False</b> - Skip applying the default connection settings to the opened database.
+            </description>
+            <description>N</description>
+            <description>True</description>
+            </item>
+            <item>
+            <description>ToFullPath</description>
+            <description>
+            <b>True</b> - Attempt to expand the data source file name to a fully qualified path before opening.<br/>
+            <b>False</b> - Skip attempting to expand the data source file name to a fully qualified path before opening.
+            </description>
+            <description>N</description>
+            <description>True</description>
+            </item>
+            </list>
+            </remarks>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.DataSource">
+            <summary>
+            Returns the data source file name without extension or path.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.Database">
+            <summary>
+            Returns the string "main".
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.DefaultTimeout">
+            <summary>
+            Gets/sets the default command timeout for newly-created commands.  This is especially useful for
+            commands used internally such as inside a SQLiteTransaction, where setting the timeout is not possible.
+            This can also be set in the ConnectionString with "Default Timeout"
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.ParseViaFramework">
+            <summary>
+            Non-zero if the built-in (i.e. framework provided) connection string
+            parser should be used when opening the connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.Flags">
+            <summary>
+            Gets/sets the extra behavioral flags for this connection.  See the
+            <see cref="T:System.Data.SQLite.SQLiteConnectionFlags"/> enumeration for a list of
+            possible values.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.OwnHandle">
+            <summary>
+            Returns non-zero if the underlying native connection handle is
+            owned by this instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.ServerVersion">
+            <summary>
+            Returns the version of the underlying SQLite database engine
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.LastInsertRowId">
+            <summary>
+            Returns the rowid of the most recent successful INSERT into the database from this connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.Changes">
+            <summary>
+            Returns the number of rows changed by the last INSERT, UPDATE, or DELETE statement executed on
+            this connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.AutoCommit">
+            <summary>
+            Returns non-zero if the given database connection is in autocommit mode.
+            Autocommit mode is on by default.  Autocommit mode is disabled by a BEGIN
+            statement.  Autocommit mode is re-enabled by a COMMIT or ROLLBACK.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.MemoryUsed">
+            <summary>
+            Returns the amount of memory (in bytes) currently in use by the SQLite core library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.MemoryHighwater">
+            <summary>
+            Returns the maximum amount of memory (in bytes) used by the SQLite core library since the high-water mark was last reset.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.DefineConstants">
+            <summary>
+            Returns a string containing the define constants (i.e. compile-time
+            options) used to compile the core managed assembly, delimited with
+            spaces.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.SQLiteVersion">
+            <summary>
+            Returns the version of the underlying SQLite core library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.SQLiteSourceId">
+            <summary>
+            This method returns the string whose value is the same as the
+            SQLITE_SOURCE_ID C preprocessor macro used when compiling the
+            SQLite core library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.InteropVersion">
+            <summary>
+            This method returns the version of the interop SQLite assembly
+            used.  If the SQLite interop assembly is not in use or the
+            necessary information cannot be obtained for any reason, a null
+            value may be returned.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.InteropSourceId">
+            <summary>
+            This method returns the string whose value contains the unique
+            identifier for the source checkout used to build the interop
+            assembly.  If the SQLite interop assembly is not in use or the
+            necessary information cannot be obtained for any reason, a null
+            value may be returned.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.ProviderVersion">
+            <summary>
+            This method returns the version of the managed components used
+            to interact with the SQLite core library.  If the necessary
+            information cannot be obtained for any reason, a null value may
+            be returned.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.ProviderSourceId">
+            <summary>
+            This method returns the string whose value contains the unique
+            identifier for the source checkout used to build the managed
+            components currently executing.  If the necessary information
+            cannot be obtained for any reason, a null value may be returned.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.State">
+            <summary>
+            Returns the state of the connection.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.Authorize">
+            <summary>
+            This event is raised whenever SQLite encounters an action covered by the
+            authorizer during query preparation.  Changing the value of the
+            <see cref="F:System.Data.SQLite.AuthorizerEventArgs.ReturnCode"/> property will determine if
+            the specific action will be allowed, ignored, or denied.  For the entire
+            duration of the event, the associated connection and statement objects
+            must not be modified, either directly or indirectly, by the called code.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.Update">
+            <summary>
+            This event is raised whenever SQLite makes an update/delete/insert into the database on
+            this connection.  It only applies to the given connection.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.Commit">
+            <summary>
+            This event is raised whenever SQLite is committing a transaction.
+            Return non-zero to trigger a rollback.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.Trace">
+            <summary>
+            This event is raised whenever SQLite statement first begins executing on
+            this connection.  It only applies to the given connection.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.RollBack">
+            <summary>
+            This event is raised whenever SQLite is rolling back a transaction.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.DbProviderFactory">
+            <summary>
+            Returns the <see cref="T:System.Data.SQLite.SQLiteFactory"/> instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SynchronizationModes">
+            <summary>
+            The I/O file cache flushing behavior for the connection
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SynchronizationModes.Normal">
+            <summary>
+            Normal file flushing at critical sections of the code
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SynchronizationModes.Full">
+            <summary>
+            Full file flushing after every write operation
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SynchronizationModes.Off">
+            <summary>
+            Use the default operating system's file flushing, SQLite does not explicitly flush the file buffers after writing
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteAuthorizerEventHandler">
+            <summary>
+            Raised when authorization is required to perform an action contained
+            within a SQL query.
+            </summary>
+            <param name="sender">The connection performing the action.</param>
+            <param name="e">A <see cref="T:System.Data.SQLite.AuthorizerEventArgs"/> that contains the
+            event data.</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteCommitHandler">
+            <summary>
+            Raised when a transaction is about to be committed.  To roll back a transaction, set the
+            rollbackTrans boolean value to true.
+            </summary>
+            <param name="sender">The connection committing the transaction</param>
+            <param name="e">Event arguments on the transaction</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteUpdateEventHandler">
+            <summary>
+            Raised when data is inserted, updated and deleted on a given connection
+            </summary>
+            <param name="sender">The connection committing the transaction</param>
+            <param name="e">The event parameters which triggered the event</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteTraceEventHandler">
+            <summary>
+            Raised when a statement first begins executing on a given connection
+            </summary>
+            <param name="sender">The connection executing the statement</param>
+            <param name="e">Event arguments of the trace</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteBackupCallback">
+            <summary>
+            Raised between each backup step.
+            </summary>
+            <param name="source">
+            The source database connection.
+            </param>
+            <param name="sourceName">
+            The source database name.
+            </param>
+            <param name="destination">
+            The destination database connection.
+            </param>
+            <param name="destinationName">
+            The destination database name.
+            </param>
+            <param name="pages">
+            The number of pages copied with each step.
+            </param>
+            <param name="remainingPages">
+            The number of pages remaining to be copied.
+            </param>
+            <param name="totalPages">
+            The total number of pages in the source database.
+            </param>
+            <param name="retry">
+            Set to true if the operation needs to be retried due to database
+            locking issues; otherwise, set to false.
+            </param>
+            <returns>
+            True to continue with the backup process or false to halt the backup
+            process, rolling back any changes that have been made so far.
+            </returns>
+        </member>
+        <member name="T:System.Data.SQLite.AuthorizerEventArgs">
+            <summary>
+            The data associated with a call into the authorizer.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.UserData">
+            <summary>
+            The user-defined native data associated with this event.  Currently,
+            this will always contain the value of <see cref="F:System.IntPtr.Zero"/>.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.ActionCode">
+            <summary>
+            The action code responsible for the current call into the authorizer.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.Argument1">
+            <summary>
+            The first string argument for the current call into the authorizer.
+            The exact value will vary based on the action code, see the
+            <see cref="T:System.Data.SQLite.SQLiteAuthorizerActionCode"/> enumeration for possible
+            values.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.Argument2">
+            <summary>
+            The second string argument for the current call into the authorizer.
+            The exact value will vary based on the action code, see the
+            <see cref="T:System.Data.SQLite.SQLiteAuthorizerActionCode"/> enumeration for possible
+            values.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.Database">
+            <summary>
+            The database name for the current call into the authorizer, if
+            applicable.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.Context">
+            <summary>
+            The name of the inner-most trigger or view that is responsible for
+            the access attempt or a null value if this access attempt is directly
+            from top-level SQL code.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.ReturnCode">
+            <summary>
+            The return code for the current call into the authorizer.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.AuthorizerEventArgs.#ctor">
+            <summary>
+            Constructs an instance of this class with default property values.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.AuthorizerEventArgs.#ctor(System.IntPtr,System.Data.SQLite.SQLiteAuthorizerActionCode,System.String,System.String,System.String,System.String,System.Data.SQLite.SQLiteAuthorizerReturnCode)">
+            <summary>
+            Constructs an instance of this class with specific property values.
+            </summary>
+            <param name="pUserData">
+            The user-defined native data associated with this event.
+            </param>
+            <param name="actionCode">
+            The authorizer action code.
+            </param>
+            <param name="argument1">
+            The first authorizer argument.
+            </param>
+            <param name="argument2">
+            The second authorizer argument.
+            </param>
+            <param name="database">
+            The database name, if applicable.
+            </param>
+            <param name="context">
+            The name of the inner-most trigger or view that is responsible for
+            the access attempt or a null value if this access attempt is directly
+            from top-level SQL code.
+            </param>
+            <param name="returnCode">
+            The authorizer return code.
+            </param>
+        </member>
+        <member name="T:System.Data.SQLite.UpdateEventType">
+            <summary>
+            Whenever an update event is triggered on a connection, this enum will indicate
+            exactly what type of operation is being performed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventType.Delete">
+            <summary>
+            A row is being deleted from the given database and table
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventType.Insert">
+            <summary>
+            A row is being inserted into the table.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventType.Update">
+            <summary>
+            A row is being updated in the table.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.UpdateEventArgs">
+            <summary>
+            Passed during an Update callback, these event arguments detail the type of update operation being performed
+            on the given connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventArgs.Database">
+            <summary>
+            The name of the database being updated (usually "main" but can be any attached or temporary database)
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventArgs.Table">
+            <summary>
+            The name of the table being updated
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventArgs.Event">
+            <summary>
+            The type of update being performed (insert/update/delete)
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventArgs.RowId">
+            <summary>
+            The RowId affected by this update.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.CommitEventArgs">
+            <summary>
+            Event arguments raised when a transaction is being committed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CommitEventArgs.AbortTransaction">
+            <summary>
+            Set to true to abort the transaction and trigger a rollback
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.TraceEventArgs">
+            <summary>
+            Passed during an Trace callback, these event arguments contain the UTF-8 rendering of the SQL statement text
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TraceEventArgs.Statement">
+            <summary>
+            SQL statement text as the statement first begins executing
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.ISQLiteConnectionPool">
+            <summary>
+            This interface represents a custom connection pool implementation
+            usable by System.Data.SQLite.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteConnectionPool.GetCounts(System.String,System.Collections.Generic.Dictionary{System.String,System.Int32}@,System.Int32@,System.Int32@,System.Int32@)">
+            <summary>
+            Counts the number of pool entries matching the specified file name.
+            </summary>
+            <param name="fileName">
+            The file name to match or null to match all files.
+            </param>
+            <param name="counts">
+            The pool entry counts for each matching file.
+            </param>
+            <param name="openCount">
+            The total number of connections successfully opened from any pool.
+            </param>
+            <param name="closeCount">
+            The total number of connections successfully closed from any pool.
+            </param>
+            <param name="totalCount">
+            The total number of pool entries for all matching files.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteConnectionPool.ClearPool(System.String)">
+            <summary>
+            Disposes of all pooled connections associated with the specified
+            database file name.
+            </summary>
+            <param name="fileName">
+            The database file name.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteConnectionPool.ClearAllPools">
+            <summary>
+            Disposes of all pooled connections.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteConnectionPool.Add(System.String,System.Object,System.Int32)">
+            <summary>
+            Adds a connection to the pool of those associated with the
+            specified database file name.
+            </summary>
+            <param name="fileName">
+            The database file name.
+            </param>
+            <param name="handle">
+            The database connection handle.
+            </param>
+            <param name="version">
+            The connection pool version at the point the database connection
+            handle was received from the connection pool.  This is also the
+            connection pool version that the database connection handle was
+            created under.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteConnectionPool.Remove(System.String,System.Int32,System.Int32@)">
+            <summary>
+            Removes a connection from the pool of those associated with the
+            specified database file name with the intent of using it to
+            interact with the database.
+            </summary>
+            <param name="fileName">
+            The database file name.
+            </param>
+            <param name="maxPoolSize">
+            The new maximum size of the connection pool for the specified
+            database file name.
+            </param>
+            <param name="version">
+            The connection pool version associated with the returned database
+            connection handle, if any.
+            </param>
+            <returns>
+            The database connection handle associated with the specified
+            database file name or null if it cannot be obtained.
+            </returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnectionPool">
+            <summary>
+            This default method implementations in this class should not be used by
+            applications that make use of COM (either directly or indirectly) due
+            to possible deadlocks that can occur during finalization of some COM
+            objects.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool._syncRoot">
+            <summary>
+            This field is used to synchronize access to the private static data
+            in this class.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool._connectionPool">
+            <summary>
+            When this field is non-null, it will be used to provide the
+            implementation of all the connection pool methods; otherwise,
+            the default method implementations will be used.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool._queueList">
+            <summary>
+            The dictionary of connection pools, based on the normalized file
+            name of the SQLite database.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool._poolVersion">
+            <summary>
+            The default version number new pools will get.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool._poolOpened">
+            <summary>
+            The number of connections successfully opened from any pool.
+            This value is incremented by the Remove method.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool._poolClosed">
+            <summary>
+            The number of connections successfully closed from any pool.
+            This value is incremented by the Add method.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.GetCounts(System.String,System.Collections.Generic.Dictionary{System.String,System.Int32}@,System.Int32@,System.Int32@,System.Int32@)">
+            <summary>
+            Counts the number of pool entries matching the specified file name.
+            </summary>
+            <param name="fileName">
+            The file name to match or null to match all files.
+            </param>
+            <param name="counts">
+            The pool entry counts for each matching file.
+            </param>
+            <param name="openCount">
+            The total number of connections successfully opened from any pool.
+            </param>
+            <param name="closeCount">
+            The total number of connections successfully closed from any pool.
+            </param>
+            <param name="totalCount">
+            The total number of pool entries for all matching files.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.ClearPool(System.String)">
+            <summary>
+            Disposes of all pooled connections associated with the specified
+            database file name.
+            </summary>
+            <param name="fileName">
+            The database file name.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.ClearAllPools">
+            <summary>
+            Disposes of all pooled connections.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.Add(System.String,System.Data.SQLite.SQLiteConnectionHandle,System.Int32)">
+            <summary>
+            Adds a connection to the pool of those associated with the
+            specified database file name.
+            </summary>
+            <param name="fileName">
+            The database file name.
+            </param>
+            <param name="handle">
+            The database connection handle.
+            </param>
+            <param name="version">
+            The connection pool version at the point the database connection
+            handle was received from the connection pool.  This is also the
+            connection pool version that the database connection handle was
+            created under.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.Remove(System.String,System.Int32,System.Int32@)">
+            <summary>
+            Removes a connection from the pool of those associated with the
+            specified database file name with the intent of using it to
+            interact with the database.
+            </summary>
+            <param name="fileName">
+            The database file name.
+            </param>
+            <param name="maxPoolSize">
+            The new maximum size of the connection pool for the specified
+            database file name.
+            </param>
+            <param name="version">
+            The connection pool version associated with the returned database
+            connection handle, if any.
+            </param>
+            <returns>
+            The database connection handle associated with the specified
+            database file name or null if it cannot be obtained.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.GetConnectionPool">
+            <summary>
+            This method is used to obtain a reference to the custom connection
+            pool implementation currently in use, if any.
+            </summary>
+            <returns>
+            The custom connection pool implementation or null if the default
+            connection pool implementation should be used.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.SetConnectionPool(System.Data.SQLite.ISQLiteConnectionPool)">
+            <summary>
+            This method is used to set the reference to the custom connection
+            pool implementation to use, if any.
+            </summary>
+            <param name="connectionPool">
+            The custom connection pool implementation to use or null if the
+            default connection pool implementation should be used.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.ResizePool(System.Data.SQLite.SQLiteConnectionPool.PoolQueue,System.Boolean)">
+            <summary>
+            We do not have to thread-lock anything in this function, because it
+            is only called by other functions above which already take the lock.
+            </summary>
+            <param name="queue">
+            The pool queue to resize.
+            </param>
+            <param name="add">
+            If a function intends to add to the pool, this is true, which
+            forces the resize to take one more than it needs from the pool.
+            </param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnectionPool.PoolQueue">
+            <summary>
+            Keeps track of connections made on a specified file.  The PoolVersion
+            dictates whether old objects get returned to the pool or discarded
+            when no longer in use.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool.PoolQueue.Queue">
+            <summary>
+            The queue of weak references to the actual database connection
+            handles.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool.PoolQueue.PoolVersion">
+            <summary>
+            This pool version associated with the database connection
+            handles in this pool queue.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool.PoolQueue.MaxPoolSize">
+            <summary>
+            The maximum size of this pool queue.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.PoolQueue.#ctor(System.Int32,System.Int32)">
+            <summary>
+            Constructs a connection pool queue using the specified version
+            and maximum size.  Normally, all the database connection
+            handles in this pool are associated with a single database file
+            name.
+            </summary>
+            <param name="version">
+            The initial pool version for this connection pool queue.
+            </param>
+            <param name="maxSize">
+            The initial maximum size for this connection pool queue.
+            </param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnectionStringBuilder">
+            <summary>
+            SQLite implementation of DbConnectionStringBuilder.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionStringBuilder._properties">
+            <summary>
+            Properties of this class
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionStringBuilder.#ctor">
+            <overloads>
+            Constructs a new instance of the class
+            </overloads>
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionStringBuilder.#ctor(System.String)">
+            <summary>
+            Constructs a new instance of the class using the specified connection string.
+            </summary>
+            <param name="connectionString">The connection string to parse</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionStringBuilder.Initialize(System.String)">
+            <summary>
+            Private initializer, which assigns the connection string and resets the builder
+            </summary>
+            <param name="cnnString">The connection string to assign</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionStringBuilder.TryGetValue(System.String,System.Object@)">
+            <summary>
+            Helper function for retrieving values from the connectionstring
+            </summary>
+            <param name="keyword">The keyword to retrieve settings for</param>
+            <param name="value">The resulting parameter value</param>
+            <returns>Returns true if the value was found and returned</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionStringBuilder.FallbackGetProperties(System.Collections.Hashtable)">
+            <summary>
+            Fallback method for MONO, which doesn't implement DbConnectionStringBuilder.GetProperties()
+            </summary>
+            <param name="propertyList">The hashtable to fill with property descriptors</param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.Version">
+            <summary>
+            Gets/Sets the default version of the SQLite engine to instantiate.  Currently the only valid value is 3, indicating version 3 of the sqlite library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.SyncMode">
+            <summary>
+            Gets/Sets the synchronization mode (file flushing) of the connection string.  Default is "Normal".
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.UseUTF16Encoding">
+            <summary>
+            Gets/Sets the encoding for the connection string.  The default is "False" which indicates UTF-8 encoding.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.Pooling">
+            <summary>
+            Gets/Sets whether or not to use connection pooling.  The default is "False"
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.BinaryGUID">
+            <summary>
+            Gets/Sets whethor not to store GUID's in binary format.  The default is True
+            which saves space in the database.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.DataSource">
+            <summary>
+            Gets/Sets the filename to open on the connection string.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.Uri">
+            <summary>
+            An alternate to the data source property
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.FullUri">
+            <summary>
+            An alternate to the data source property that uses the SQLite URI syntax.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.DefaultTimeout">
+            <summary>
+            Gets/sets the default command timeout for newly-created commands.  This is especially useful for 
+            commands used internally such as inside a SQLiteTransaction, where setting the timeout is not possible.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.Enlist">
+            <summary>
+            Determines whether or not the connection will automatically participate
+            in the current distributed transaction (if one exists)
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.FailIfMissing">
+            <summary>
+            If set to true, will throw an exception if the database specified in the connection
+            string does not exist.  If false, the database will be created automatically.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.LegacyFormat">
+            <summary>
+            If enabled, uses the legacy 3.xx format for maximum compatibility, but results in larger
+            database sizes.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.ReadOnly">
+            <summary>
+            When enabled, the database will be opened for read-only access and writing will be disabled.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.Password">
+            <summary>
+            Gets/sets the database encryption password
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.HexPassword">
+            <summary>
+            Gets/sets the database encryption hexadecimal password
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.PageSize">
+            <summary>
+            Gets/Sets the page size for the connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.MaxPageCount">
+            <summary>
+            Gets/Sets the maximum number of pages the database may hold
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.CacheSize">
+            <summary>
+            Gets/Sets the cache size for the connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.DateTimeFormat">
+            <summary>
+            Gets/Sets the DateTime format for the connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.DateTimeKind">
+            <summary>
+            Gets/Sets the DateTime kind for the connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.DateTimeFormatString">
+            <summary>
+            Gets/sets the DateTime format string used for formatting
+            and parsing purposes.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.BaseSchemaName">
+            <summary>
+            Gets/Sets the placeholder base schema name used for
+            .NET Framework compatibility purposes.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.JournalMode">
+            <summary>
+            Determines how SQLite handles the transaction journal file.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.DefaultIsolationLevel">
+            <summary>
+            Sets the default isolation level for transactions on the connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.ForeignKeys">
+            <summary>
+            If enabled, use foreign key constraints
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.Flags">
+            <summary>
+            Gets/Sets the extra behavioral flags.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.SetDefaults">
+            <summary>
+            If enabled, apply the default connection settings to opened databases.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.ToFullPath">
+            <summary>
+            If enabled, attempt to resolve the provided data source file name to a
+            full path before opening.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.TypeAffinity">
+            <summary>
+            SQLite has very limited types, and is inherently text-based.  The first 5 types below represent the sum of all types SQLite
+            understands.  The DateTime extension to the spec is for internal use only.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.Uninitialized">
+            <summary>
+            Not used
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.Int64">
+            <summary>
+            All integers in SQLite default to Int64
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.Double">
+            <summary>
+            All floating point numbers in SQLite default to double
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.Text">
+            <summary>
+            The default data type of SQLite is text
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.Blob">
+            <summary>
+            Typically blob types are only seen when returned from a function
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.Null">
+            <summary>
+            Null types can be returned from functions
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.DateTime">
+            <summary>
+            Used internally by this provider
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.None">
+            <summary>
+            Used internally by this provider
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnectionEventType">
+            <summary>
+            These are the event types associated with the
+            <see cref="T:System.Data.SQLite.SQLiteConnectionEventHandler"/>
+            delegate (and its corresponding event) and the
+            <see cref="T:System.Data.SQLite.ConnectionEventArgs"/> class.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.Invalid">
+            <summary>
+            Not used.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.Unknown">
+            <summary>
+            Not used.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.Opening">
+            <summary>
+            The connection is being opened.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.ConnectionString">
+            <summary>
+            The connection string has been parsed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.Opened">
+            <summary>
+            The connection was opened.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.ChangeDatabase">
+            <summary>
+            The <see cref="F:System.Data.SQLite.SQLiteConnectionEventType.ChangeDatabase"/> method was called on the
+            connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.NewTransaction">
+            <summary>
+            A transaction was created using the connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.EnlistTransaction">
+            <summary>
+            The connection was enlisted into a transaction.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.NewCommand">
+            <summary>
+            A command was created using the connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.NewDataReader">
+            <summary>
+            A data reader was created using the connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.NewCriticalHandle">
+            <summary>
+            An instance of a <see cref="T:System.Runtime.InteropServices.CriticalHandle"/> derived class has
+            been created to wrap a native resource.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.Closing">
+            <summary>
+            The connection is being closed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.Closed">
+            <summary>
+            The connection was closed.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteDateFormats">
+             <summary>
+             This implementation of SQLite for ADO.NET can process date/time fields in
+             databases in one of six formats.
+             </summary>
+             <remarks>
+             ISO8601 format is more compatible, readable, fully-processable, but less
+             accurate as it does not provide time down to fractions of a second.
+             JulianDay is the numeric format the SQLite uses internally and is arguably
+             the most compatible with 3rd party tools.  It is not readable as text
+             without post-processing.  Ticks less compatible with 3rd party tools that
+             query the database, and renders the DateTime field unreadable as text
+             without post-processing.  UnixEpoch is more compatible with Unix systems.
+             InvariantCulture allows the configured format for the invariant culture
+             format to be used and is human readable.  CurrentCulture allows the
+             configured format for the current culture to be used and is also human
+             readable.
+            
+             The preferred order of choosing a DateTime format is JulianDay, ISO8601,
+             and then Ticks.  Ticks is mainly present for legacy code support.
+             </remarks>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.Ticks">
+            <summary>
+            Use the value of DateTime.Ticks.  This value is not recommended and is not well supported with LINQ.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.ISO8601">
+            <summary>
+            Use the ISO-8601 format.  Uses the "yyyy-MM-dd HH:mm:ss.FFFFFFFK" format for UTC DateTime values and
+            "yyyy-MM-dd HH:mm:ss.FFFFFFF" format for local DateTime values).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.JulianDay">
+            <summary>
+            The interval of time in days and fractions of a day since January 1, 4713 BC.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.UnixEpoch">
+            <summary>
+            The whole number of seconds since the Unix epoch (January 1, 1970).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.InvariantCulture">
+            <summary>
+            Any culture-independent string value that the .NET Framework can interpret as a valid DateTime.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.CurrentCulture">
+            <summary>
+            Any string value that the .NET Framework can interpret as a valid DateTime using the current culture.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.Default">
+            <summary>
+            The default format for this provider.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteJournalModeEnum">
+             <summary>
+             This enum determines how SQLite treats its journal file.
+             </summary>
+             <remarks>
+             By default SQLite will create and delete the journal file when needed during a transaction.
+             However, for some computers running certain filesystem monitoring tools, the rapid
+             creation and deletion of the journal file can cause those programs to fail, or to interfere with SQLite.
+            
+             If a program or virus scanner is interfering with SQLite's journal file, you may receive errors like "unable to open database file"
+             when starting a transaction.  If this is happening, you may want to change the default journal mode to Persist.
+             </remarks>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Default">
+            <summary>
+            The default mode, this causes SQLite to use the existing journaling mode for the database.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Delete">
+            <summary>
+            SQLite will create and destroy the journal file as-needed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Persist">
+            <summary>
+            When this is set, SQLite will keep the journal file even after a transaction has completed.  It's contents will be erased,
+            and the journal re-used as often as needed.  If it is deleted, it will be recreated the next time it is needed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Off">
+            <summary>
+            This option disables the rollback journal entirely.  Interrupted transactions or a program crash can cause database
+            corruption in this mode!
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Truncate">
+            <summary>
+            SQLite will truncate the journal file to zero-length instead of deleting it.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Memory">
+            <summary>
+            SQLite will store the journal in volatile RAM.  This saves disk I/O but at the expense of database safety and integrity.
+            If the application using SQLite crashes in the middle of a transaction when the MEMORY journaling mode is set, then the
+            database file will very likely go corrupt.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Wal">
+            <summary>
+            SQLite uses a write-ahead log instead of a rollback journal to implement transactions.  The WAL journaling mode is persistent;
+            after being set it stays in effect across multiple database connections and after closing and reopening the database. A database
+            in WAL journaling mode can only be accessed by SQLite version 3.7.0 or later.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteSynchronousEnum">
+            <summary>
+            Possible values for the "synchronous" database setting.  This setting determines
+            how often the database engine calls the xSync method of the VFS.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteSynchronousEnum.Default">
+            <summary>
+            Use the default "synchronous" database setting.  Currently, this should be
+            the same as using the FULL mode.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteSynchronousEnum.Off">
+            <summary>
+            The database engine continues without syncing as soon as it has handed
+            data off to the operating system.  If the application running SQLite
+            crashes, the data will be safe, but the database might become corrupted
+            if the operating system crashes or the computer loses power before that
+            data has been written to the disk surface.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteSynchronousEnum.Normal">
+            <summary>
+            The database engine will still sync at the most critical moments, but
+            less often than in FULL mode.  There is a very small (though non-zero)
+            chance that a power failure at just the wrong time could corrupt the
+            database in NORMAL mode.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteSynchronousEnum.Full">
+            <summary>
+            The database engine will use the xSync method of the VFS to ensure that
+            all content is safely written to the disk surface prior to continuing.
+            This ensures that an operating system crash or power failure will not
+            corrupt the database.  FULL synchronous is very safe, but it is also
+            slower.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteExecuteType">
+            <summary>
+            The requested command execution type.  This controls which method of the
+            <see cref="T:System.Data.SQLite.SQLiteCommand"/> object will be called.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteExecuteType.None">
+            <summary>
+            Do nothing.  No method will be called.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteExecuteType.NonQuery">
+            <summary>
+            The command is not expected to return a result -OR- the result is not
+            needed.  The <see cref="M:System.Data.SQLite.SQLiteCommand.ExecuteNonQuery"/> or
+            <see cref="M:System.Data.SQLite.SQLiteCommand.ExecuteNonQuery(System.Data.CommandBehavior)"/>  method
+            will be called.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteExecuteType.Scalar">
+            <summary>
+            The command is expected to return a scalar result -OR- the result should
+            be limited to a scalar result.  The <see cref="M:System.Data.SQLite.SQLiteCommand.ExecuteScalar"/>
+            or <see cref="M:System.Data.SQLite.SQLiteCommand.ExecuteScalar(System.Data.CommandBehavior)"/> method will
+            be called.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteExecuteType.Reader">
+            <summary>
+            The command is expected to return <see cref="T:System.Data.SQLite.SQLiteDataReader"/> result.
+            The <see cref="M:System.Data.SQLite.SQLiteCommand.ExecuteReader"/> or
+            <see cref="M:System.Data.SQLite.SQLiteCommand.ExecuteReader(System.Data.CommandBehavior)"/> method will
+            be called.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteExecuteType.Default">
+            <summary>
+            Use the default command execution type.  Using this value is the same
+            as using the <see cref="F:System.Data.SQLite.SQLiteExecuteType.NonQuery"/> value.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteAuthorizerActionCode">
+            <summary>
+            The action code responsible for the current call into the authorizer.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.None">
+            <summary>
+            No action is being performed.  This value should not be used from
+            external code.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Copy">
+            <summary>
+            No longer used.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateIndex">
+            <summary>
+            An index will be created.  The action-specific arguments are the
+            index name and the table name.
+            
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTable">
+            <summary>
+            A table will be created.  The action-specific arguments are the
+            table name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTempIndex">
+            <summary>
+            A temporary index will be created.  The action-specific arguments
+            are the index name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTempTable">
+            <summary>
+            A temporary table will be created.  The action-specific arguments
+            are the table name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTempTrigger">
+            <summary>
+            A temporary trigger will be created.  The action-specific arguments
+            are the trigger name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTempView">
+            <summary>
+            A temporary view will be created.  The action-specific arguments are
+            the view name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTrigger">
+            <summary>
+            A trigger will be created.  The action-specific arguments are the
+            trigger name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateView">
+            <summary>
+            A view will be created.  The action-specific arguments are the view
+            name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Delete">
+            <summary>
+            A DELETE statement will be executed.  The action-specific arguments
+            are the table name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropIndex">
+            <summary>
+            An index will be dropped.  The action-specific arguments are the
+            index name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTable">
+            <summary>
+            A table will be dropped.  The action-specific arguments are the tables
+            name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTempIndex">
+            <summary>
+            A temporary index will be dropped.  The action-specific arguments are
+            the index name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTempTable">
+            <summary>
+            A temporary table will be dropped.  The action-specific arguments are
+            the table name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTempTrigger">
+            <summary>
+            A temporary trigger will be dropped.  The action-specific arguments
+            are the trigger name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTempView">
+            <summary>
+            A temporary view will be dropped.  The action-specific arguments are
+            the view name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTrigger">
+            <summary>
+            A trigger will be dropped.  The action-specific arguments are the
+            trigger name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropView">
+            <summary>
+            A view will be dropped.  The action-specific arguments are the view
+            name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Insert">
+            <summary>
+            An INSERT statement will be executed.  The action-specific arguments
+            are the table name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Pragma">
+            <summary>
+            A PRAGMA statement will be executed.  The action-specific arguments
+            are the name of the PRAGMA and the new value or a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Read">
+            <summary>
+            A table column will be read.  The action-specific arguments are the
+            table name and the column name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Select">
+            <summary>
+            A SELECT statement will be executed.  The action-specific arguments
+            are both null values.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Transaction">
+            <summary>
+            A transaction will be started, committed, or rolled back.  The
+            action-specific arguments are the name of the operation (BEGIN,
+            COMMIT, or ROLLBACK) and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Update">
+            <summary>
+            An UPDATE statement will be executed.  The action-specific arguments
+            are the table name and the column name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Attach">
+            <summary>
+            A database will be attached to the connection.  The action-specific
+            arguments are the database file name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Detach">
+            <summary>
+            A database will be detached from the connection.  The action-specific
+            arguments are the database name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.AlterTable">
+            <summary>
+            The schema of a table will be altered.  The action-specific arguments
+            are the database name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Reindex">
+            <summary>
+            An index will be deleted and then recreated.  The action-specific
+            arguments are the index name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Analyze">
+            <summary>
+            A table will be analyzed to gathers statistics about it.  The
+            action-specific arguments are the table name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateVtable">
+            <summary>
+            A virtual table will be created.  The action-specific arguments are
+            the table name and the module name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropVtable">
+            <summary>
+            A virtual table will be dropped.  The action-specific arguments are
+            the table name and the module name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Function">
+            <summary>
+            A SQL function will be called.  The action-specific arguments are a
+            null value and the function name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Savepoint">
+            <summary>
+            A savepoint will be created, released, or rolled back.  The
+            action-specific arguments are the name of the operation (BEGIN,
+            RELEASE, or ROLLBACK) and the savepoint name.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteAuthorizerReturnCode">
+            <summary>
+            The return code for the current call into the authorizer.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerReturnCode.Ok">
+            <summary>
+            The action will be allowed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerReturnCode.Deny">
+            <summary>
+            The overall action will be disallowed and an error message will be
+            returned from the query preparation method.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerReturnCode.Ignore">
+            <summary>
+            The specific action will be disallowed; however, the overall action
+            will continue.  The exact effects of this return code vary depending
+            on the specific action, please refer to the SQLite core library
+            documentation for futher details.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteType">
+            <summary>
+            Class used internally to determine the datatype of a column in a resultset
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteType.Type">
+            <summary>
+            The DbType of the column, or DbType.Object if it cannot be determined
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteType.Affinity">
+            <summary>
+            The affinity of a column, used for expressions or when Type is DbType.Object
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteDataAdapter">
+            <summary>
+            SQLite implementation of DbDataAdapter.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.#ctor">
+            <overloads>
+            This class is just a shell around the DbDataAdapter.  Nothing from
+            DbDataAdapter is overridden here, just a few constructors are defined.
+            </overloads>
+            <summary>
+            Default constructor.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.#ctor(System.Data.SQLite.SQLiteCommand)">
+            <summary>
+            Constructs a data adapter using the specified select command.
+            </summary>
+            <param name="cmd">
+            The select command to associate with the adapter.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.#ctor(System.String,System.Data.SQLite.SQLiteConnection)">
+            <summary>
+            Constructs a data adapter with the supplied select command text and
+            associated with the specified connection.
+            </summary>
+            <param name="commandText">
+            The select command text to associate with the data adapter.
+            </param>
+            <param name="connection">
+            The connection to associate with the select command.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.#ctor(System.String,System.String)">
+            <summary>
+            Constructs a data adapter with the specified select command text,
+            and using the specified database connection string.
+            </summary>
+            <param name="commandText">
+            The select command text to use to construct a select command.
+            </param>
+            <param name="connectionString">
+            A connection string suitable for passing to a new SQLiteConnection,
+            which is associated with the select command.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.#ctor(System.String,System.String,System.Boolean)">
+            <summary>
+            Constructs a data adapter with the specified select command text,
+            and using the specified database connection string.
+            </summary>
+            <param name="commandText">
+            The select command text to use to construct a select command.
+            </param>
+            <param name="connectionString">
+            A connection string suitable for passing to a new SQLiteConnection,
+            which is associated with the select command.
+            </param>
+            <param name="parseViaFramework">
+            Non-zero to parse the connection string using the built-in (i.e.
+            framework provided) parser when opening the connection.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.OnRowUpdating(System.Data.Common.RowUpdatingEventArgs)">
+            <summary>
+            Raised by the underlying DbDataAdapter when a row is being updated
+            </summary>
+            <param name="value">The event's specifics</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.OnRowUpdated(System.Data.Common.RowUpdatedEventArgs)">
+            <summary>
+            Raised by DbDataAdapter after a row is updated
+            </summary>
+            <param name="value">The event's specifics</param>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteDataAdapter.RowUpdating">
+            <summary>
+            Row updating event handler
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteDataAdapter.RowUpdated">
+            <summary>
+            Row updated event handler
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataAdapter.SelectCommand">
+            <summary>
+            Gets/sets the select command for this DataAdapter
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataAdapter.InsertCommand">
+            <summary>
+            Gets/sets the insert command for this DataAdapter
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataAdapter.UpdateCommand">
+            <summary>
+            Gets/sets the update command for this DataAdapter
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataAdapter.DeleteCommand">
+            <summary>
+            Gets/sets the delete command for this DataAdapter
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteDataReader">
+            <summary>
+            SQLite implementation of DbDataReader.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._command">
+            <summary>
+            Underlying command this reader is attached to
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._activeStatementIndex">
+            <summary>
+            Index of the current statement in the command being processed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._activeStatement">
+            <summary>
+            Current statement being Read()
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._readingState">
+            <summary>
+            State of the current statement being processed.
+            -1 = First Step() executed, so the first Read() will be ignored
+             0 = Actively reading
+             1 = Finished reading
+             2 = Non-row-returning statement, no records
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._rowsAffected">
+            <summary>
+            Number of records affected by the insert/update statements executed on the command
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._fieldCount">
+            <summary>
+            Count of fields (columns) in the row-returning statement currently being processed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._fieldIndexes">
+            <summary>
+            Maps the field (column) names to their corresponding indexes within the results.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._fieldTypeArray">
+            <summary>
+            Datatypes of active fields (columns) in the current statement, used for type-restricting data
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._commandBehavior">
+            <summary>
+            The behavior of the datareader
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._disposeCommand">
+            <summary>
+            If set, then dispose of the command object when the reader is finished
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._throwOnDisposed">
+            <summary>
+            If set, then raise an exception when the object is accessed after being disposed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._keyInfo">
+            <summary>
+            An array of rowid's for the active statement if CommandBehavior.KeyInfo is specified
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._version">
+            <summary>
+            Matches the version of the connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._baseSchemaName">
+            <summary>
+            The "stub" (i.e. placeholder) base schema name to use when returning
+            column schema information.  Matches the base schema name used by the
+            associated connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.#ctor(System.Data.SQLite.SQLiteCommand,System.Data.CommandBehavior)">
+            <summary>
+            Internal constructor, initializes the datareader and sets up to begin executing statements
+            </summary>
+            <param name="cmd">The SQLiteCommand this data reader is for</param>
+            <param name="behave">The expected behavior of the data reader</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.Dispose(System.Boolean)">
+            <summary>
+            Dispose of all resources used by this datareader.
+            </summary>
+            <param name="disposing"></param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.Close">
+            <summary>
+            Closes the datareader, potentially closing the connection as well if CommandBehavior.CloseConnection was specified.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.CheckClosed">
+            <summary>
+            Throw an error if the datareader is closed
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.CheckValidRow">
+            <summary>
+            Throw an error if a row is not loaded
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetEnumerator">
+            <summary>
+            Enumerator support
+            </summary>
+            <returns>Returns a DbEnumerator object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.VerifyType(System.Int32,System.Data.DbType)">
+             <summary>
+             SQLite is inherently un-typed.  All datatypes in SQLite are natively strings.  The definition of the columns of a table
+             and the affinity of returned types are all we have to go on to type-restrict data in the reader.
+            
+             This function attempts to verify that the type of data being requested of a column matches the datatype of the column.  In
+             the case of columns that are not backed into a table definition, we attempt to match up the affinity of a column (int, double, string or blob)
+             to a set of known types that closely match that affinity.  It's not an exact science, but its the best we can do.
+             </summary>
+             <returns>
+             This function throws an InvalidTypeCast() exception if the requested type doesn't match the column's definition or affinity.
+             </returns>
+             <param name="i">The index of the column to type-check</param>
+             <param name="typ">The type we want to get out of the column</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetBoolean(System.Int32)">
+            <summary>
+            Retrieves the column as a boolean value
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>bool</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetByte(System.Int32)">
+            <summary>
+            Retrieves the column as a single byte value
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>byte</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetBytes(System.Int32,System.Int64,System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Retrieves a column as an array of bytes (blob)
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <param name="fieldOffset">The zero-based index of where to begin reading the data</param>
+            <param name="buffer">The buffer to write the bytes into</param>
+            <param name="bufferoffset">The zero-based index of where to begin writing into the array</param>
+            <param name="length">The number of bytes to retrieve</param>
+            <returns>The actual number of bytes written into the array</returns>
+            <remarks>
+            To determine the number of bytes in the column, pass a null value for the buffer.  The total length will be returned.
+            </remarks>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetChar(System.Int32)">
+            <summary>
+            Returns the column as a single character
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>char</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetChars(System.Int32,System.Int64,System.Char[],System.Int32,System.Int32)">
+            <summary>
+            Retrieves a column as an array of chars (blob)
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <param name="fieldoffset">The zero-based index of where to begin reading the data</param>
+            <param name="buffer">The buffer to write the characters into</param>
+            <param name="bufferoffset">The zero-based index of where to begin writing into the array</param>
+            <param name="length">The number of bytes to retrieve</param>
+            <returns>The actual number of characters written into the array</returns>
+            <remarks>
+            To determine the number of characters in the column, pass a null value for the buffer.  The total length will be returned.
+            </remarks>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetDataTypeName(System.Int32)">
+            <summary>
+            Retrieves the name of the back-end datatype of the column
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>string</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetDateTime(System.Int32)">
+            <summary>
+            Retrieve the column as a date/time value
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>DateTime</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetDecimal(System.Int32)">
+            <summary>
+            Retrieve the column as a decimal value
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>decimal</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetDouble(System.Int32)">
+            <summary>
+            Returns the column as a double
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>double</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetFieldType(System.Int32)">
+            <summary>
+            Returns the .NET type of a given column
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>Type</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetFloat(System.Int32)">
+            <summary>
+            Returns a column as a float value
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>float</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetGuid(System.Int32)">
+            <summary>
+            Returns the column as a Guid
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>Guid</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetInt16(System.Int32)">
+            <summary>
+            Returns the column as a short
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>Int16</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetInt32(System.Int32)">
+            <summary>
+            Retrieves the column as an int
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>Int32</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetInt64(System.Int32)">
+            <summary>
+            Retrieves the column as a long
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>Int64</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetName(System.Int32)">
+            <summary>
+            Retrieves the name of the column
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>string</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetOrdinal(System.String)">
+            <summary>
+            Retrieves the i of a column, given its name
+            </summary>
+            <param name="name">The name of the column to retrieve</param>
+            <returns>The int i of the column</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetSchemaTable">
+            <summary>
+            Schema information in SQLite is difficult to map into .NET conventions, so a lot of work must be done
+            to gather the necessary information so it can be represented in an ADO.NET manner.
+            </summary>
+            <returns>Returns a DataTable containing the schema information for the active SELECT statement being processed.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetString(System.Int32)">
+            <summary>
+            Retrieves the column as a string
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>string</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetValue(System.Int32)">
+            <summary>
+            Retrieves the column as an object corresponding to the underlying datatype of the column
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetValues(System.Object[])">
+            <summary>
+            Retreives the values of multiple columns, up to the size of the supplied array
+            </summary>
+            <param name="values">The array to fill with values from the columns in the current resultset</param>
+            <returns>The number of columns retrieved</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetValues">
+            <summary>
+            Returns a collection containing all the column names and values for the
+            current row of data in the current resultset, if any.  If there is no
+            current row or no current resultset, an exception may be thrown.
+            </summary>
+            <returns>
+            The collection containing the column name and value information for the
+            current row of data in the current resultset or null if this information
+            cannot be obtained.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.IsDBNull(System.Int32)">
+            <summary>
+            Returns True if the specified column is null
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>True or False</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.NextResult">
+            <summary>
+            Moves to the next resultset in multiple row-returning SQL command.
+            </summary>
+            <returns>True if the command was successful and a new resultset is available, False otherwise.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetFlags(System.Data.SQLite.SQLiteDataReader)">
+            <summary>
+            This method attempts to query the flags associated with the database
+            connection in use.  If the database connection is disposed, the default
+            flags will be returned.
+            </summary>
+            <param name="dataReader">
+            The data reader containing the databse connection to query the flags from.
+            </param>
+            <returns>
+            The connection flags value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetSQLiteType(System.Int32)">
+            <summary>
+            Retrieves the SQLiteType for a given column, and caches it to avoid repetetive interop calls.
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>A SQLiteType structure</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.Read">
+            <summary>
+            Reads the next row from the resultset
+            </summary>
+            <returns>True if a new row was successfully loaded and is ready for processing</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.Depth">
+            <summary>
+            Not implemented.  Returns 0
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.FieldCount">
+            <summary>
+            Returns the number of columns in the current resultset
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.VisibleFieldCount">
+            <summary>
+            Returns the number of visible fields in the current resultset
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.HasRows">
+            <summary>
+            Returns True if the resultset has rows that can be fetched
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.IsClosed">
+            <summary>
+            Returns True if the data reader is closed
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.RecordsAffected">
+            <summary>
+            Retrieve the count of records affected by an update/insert command.  Only valid once the data reader is closed!
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.Item(System.String)">
+            <summary>
+            Indexer to retrieve data from a column given its name
+            </summary>
+            <param name="name">The name of the column to retrieve data for</param>
+            <returns>The value contained in the column</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.Item(System.Int32)">
+            <summary>
+            Indexer to retrieve data from a column given its i
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>The value contained in the column</returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteException">
+            <summary>
+            SQLite exception class.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Private constructor for use with serialization.
+            </summary>
+            <param name="info">
+            Holds the serialized object data about the exception being thrown.
+            </param>
+            <param name="context">
+            Contains contextual information about the source or destination.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.#ctor(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            <summary>
+            Public constructor for generating a SQLite exception given the error
+            code and message.
+            </summary>
+            <param name="errorCode">
+            The SQLite return code to report.
+            </param>
+            <param name="message">
+            Message text to go along with the return code message text.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.#ctor(System.String)">
+            <summary>
+            Public constructor that uses the base class constructor for the error
+            message.
+            </summary>
+            <param name="message">Error message text.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.#ctor">
+            <summary>
+            Public constructor that uses the default base class constructor.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.#ctor(System.String,System.Exception)">
+            <summary>
+            Public constructor that uses the base class constructor for the error
+            message and inner exception.
+            </summary>
+            <param name="message">Error message text.</param>
+            <param name="innerException">The original (inner) exception.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Adds extra information to the serialized object data specific to this
+            class type.  This is only used for serialization.
+            </summary>
+            <param name="info">
+            Holds the serialized object data about the exception being thrown.
+            </param>
+            <param name="context">
+            Contains contextual information about the source or destination.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.GetErrorString(System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Returns the error message for the specified SQLite return code.
+            </summary>
+            <param name="errorCode">The SQLite return code.</param>
+            <returns>The error message or null if it cannot be found.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.GetStockErrorMessage(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            <summary>
+            Returns the composite error message based on the SQLite return code
+            and the optional detailed error message.
+            </summary>
+            <param name="errorCode">The SQLite return code.</param>
+            <param name="message">Optional detailed error message.</param>
+            <returns>Error message text for the return code.</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteException.ResultCode">
+            <summary>
+            Gets the associated SQLite result code for this exception as a
+            <see cref="T:System.Data.SQLite.SQLiteErrorCode"/>.  This property returns the same
+            underlying value as the <see cref="P:System.Data.SQLite.SQLiteException.ErrorCode"/> property.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteException.ErrorCode">
+            <summary>
+            Gets the associated SQLite return code for this exception as an
+            <see cref="T:System.Int32"/>.  For desktop versions of the .NET Framework,
+            this property overrides the property of the same name within the
+            <see cref="T:System.Runtime.InteropServices.ExternalException"/>
+            class.  This property returns the same underlying value as the
+            <see cref="P:System.Data.SQLite.SQLiteException.ResultCode"/> property.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteErrorCode">
+            <summary>
+            SQLite error codes.  Actually, this enumeration represents a return code,
+            which may also indicate success in one of several ways (e.g. SQLITE_OK,
+            SQLITE_ROW, and SQLITE_DONE).  Therefore, the name of this enumeration is
+            something of a misnomer.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Unknown">
+            <summary>
+            The error code is unknown.  This error code
+            is only used by the managed wrapper itself.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Ok">
+            <summary>
+            Successful result
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Error">
+            <summary>
+            SQL error or missing database
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Internal">
+            <summary>
+            Internal logic error in SQLite
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Perm">
+            <summary>
+            Access permission denied
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Abort">
+            <summary>
+            Callback routine requested an abort
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Busy">
+            <summary>
+            The database file is locked
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Locked">
+            <summary>
+            A table in the database is locked
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.NoMem">
+            <summary>
+            A malloc() failed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.ReadOnly">
+            <summary>
+            Attempt to write a readonly database
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Interrupt">
+            <summary>
+            Operation terminated by sqlite3_interrupt()
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.IoErr">
+            <summary>
+            Some kind of disk I/O error occurred
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Corrupt">
+            <summary>
+            The database disk image is malformed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.NotFound">
+            <summary>
+            Unknown opcode in sqlite3_file_control()
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Full">
+            <summary>
+            Insertion failed because database is full
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.CantOpen">
+            <summary>
+            Unable to open the database file
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Protocol">
+            <summary>
+            Database lock protocol error
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Empty">
+            <summary>
+            Database is empty
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Schema">
+            <summary>
+            The database schema changed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.TooBig">
+            <summary>
+            String or BLOB exceeds size limit
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Constraint">
+            <summary>
+            Abort due to constraint violation
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Mismatch">
+            <summary>
+            Data type mismatch
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Misuse">
+            <summary>
+            Library used incorrectly
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.NoLfs">
+            <summary>
+            Uses OS features not supported on host
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Auth">
+            <summary>
+            Authorization denied
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Format">
+            <summary>
+            Auxiliary database format error
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Range">
+            <summary>
+            2nd parameter to sqlite3_bind out of range
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.NotADb">
+            <summary>
+            File opened that is not a database file
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Notice">
+            <summary>
+            Notifications from sqlite3_log()
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Warning">
+            <summary>
+            Warnings from sqlite3_log()
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Row">
+            <summary>
+            sqlite3_step() has another row ready
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Done">
+            <summary>
+            sqlite3_step() has finished executing
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.NonExtendedMask">
+            <summary>
+            Used to mask off extended result codes
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteFactory">
+            <summary>
+            SQLite implementation of <see cref="T:System.Data.Common.DbProviderFactory"/>.
+            </summary>
+            <summary>
+            SQLite implementation of <see cref="T:System.IServiceProvider"/>.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.#ctor">
+            <summary>
+            Constructs a new instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFactory.Instance">
+            <summary>
+            Static instance member which returns an instanced <see cref="T:System.Data.SQLite.SQLiteFactory"/> class.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.CreateCommand">
+            <summary>
+            Creates and returns a new <see cref="T:System.Data.SQLite.SQLiteCommand"/> object.
+            </summary>
+            <returns>The new object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.CreateCommandBuilder">
+            <summary>
+            Creates and returns a new <see cref="T:System.Data.SQLite.SQLiteCommandBuilder"/> object.
+            </summary>
+            <returns>The new object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.CreateConnection">
+            <summary>
+            Creates and returns a new <see cref="T:System.Data.SQLite.SQLiteConnection"/> object.
+            </summary>
+            <returns>The new object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.CreateConnectionStringBuilder">
+            <summary>
+            Creates and returns a new <see cref="T:System.Data.SQLite.SQLiteConnectionStringBuilder"/> object.
+            </summary>
+            <returns>The new object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.CreateDataAdapter">
+            <summary>
+            Creates and returns a new <see cref="T:System.Data.SQLite.SQLiteDataAdapter"/> object.
+            </summary>
+            <returns>The new object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.CreateParameter">
+            <summary>
+            Creates and returns a new <see cref="T:System.Data.SQLite.SQLiteParameter"/> object.
+            </summary>
+            <returns>The new object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.System#IServiceProvider#GetService(System.Type)">
+            <summary>
+            Will provide a <see cref="T:System.IServiceProvider"/> object in .NET 3.5.
+            </summary>
+            <param name="serviceType">The class or interface type to query for.</param>
+            <returns></returns>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteFactory.Log">
+            <summary>
+            This event is raised whenever SQLite raises a logging event.
+            Note that this should be set as one of the first things in the
+            application.  This event is provided for backward compatibility only.
+            New code should use the <see cref="T:System.Data.SQLite.SQLiteLog"/> class instead.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteFunction">
+             <summary>
+             This abstract class is designed to handle user-defined functions easily.  An instance of the derived class is made for each
+             connection to the database.
+             </summary>
+             <remarks>
+             Although there is one instance of a class derived from SQLiteFunction per database connection, the derived class has no access
+             to the underlying connection.  This is necessary to deter implementers from thinking it would be a good idea to make database
+             calls during processing.
+            
+             It is important to distinguish between a per-connection instance, and a per-SQL statement context.  One instance of this class
+             services all SQL statements being stepped through on that connection, and there can be many.  One should never store per-statement
+             information in member variables of user-defined function classes.
+            
+             For aggregate functions, always create and store your per-statement data in the contextData object on the 1st step.  This data will
+             be automatically freed for you (and Dispose() called if the item supports IDisposable) when the statement completes.
+             </remarks>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._base">
+            <summary>
+            The base connection this function is attached to
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._contextDataList">
+            <summary>
+            Internal array used to keep track of aggregate function context data
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._flags">
+            <summary>
+            The connection flags associated with this object (this should be the
+            same value as the flags associated with the parent connection object).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._InvokeFunc">
+            <summary>
+            Holds a reference to the callback function for user functions
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._StepFunc">
+            <summary>
+            Holds a reference to the callbakc function for stepping in an aggregate function
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._FinalFunc">
+            <summary>
+            Holds a reference to the callback function for finalizing an aggregate function
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._CompareFunc">
+            <summary>
+            Holds a reference to the callback function for collation sequences
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._context">
+            <summary>
+            Current context of the current callback.  Only valid during a callback
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._registeredFunctions">
+            <summary>
+            This static list contains all the user-defined functions declared using the proper attributes.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.#ctor">
+            <summary>
+            Internal constructor, initializes the function's internal variables.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.#ctor(System.Data.SQLite.SQLiteDateFormats,System.DateTimeKind,System.String,System.Boolean)">
+            <summary>
+            Constructs an instance of this class using the specified data-type
+            conversion parameters.
+            </summary>
+            <param name="format">
+            The DateTime format to be used when converting string values to a
+            DateTime and binding DateTime parameters.
+            </param>
+            <param name="kind">
+            The <see cref="T:System.DateTimeKind"/> to be used when creating DateTime
+            values.
+            </param>
+            <param name="formatString">
+            The format string to be used when parsing and formatting DateTime
+            values.
+            </param>
+            <param name="utf16">
+            Non-zero to create a UTF-16 data-type conversion context; otherwise,
+            a UTF-8 data-type conversion context will be created.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.Dispose">
+            <summary>
+            Disposes of any active contextData variables that were not automatically cleaned up.  Sometimes this can happen if
+            someone closes the connection while a DataReader is open.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.Dispose(System.Boolean)">
+            <summary>
+            Placeholder for a user-defined disposal routine
+            </summary>
+            <param name="disposing">True if the object is being disposed explicitly</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.Invoke(System.Object[])">
+            <summary>
+            Scalar functions override this method to do their magic.
+            </summary>
+            <remarks>
+            Parameters passed to functions have only an affinity for a certain data type, there is no underlying schema available
+            to force them into a certain type.  Therefore the only types you will ever see as parameters are
+            DBNull.Value, Int64, Double, String or byte[] array.
+            </remarks>
+            <param name="args">The arguments for the command to process</param>
+            <returns>You may return most simple types as a return value, null or DBNull.Value to return null, DateTime, or
+            you may return an Exception-derived class if you wish to return an error to SQLite.  Do not actually throw the error,
+            just return it!</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.Step(System.Object[],System.Int32,System.Object@)">
+            <summary>
+            Aggregate functions override this method to do their magic.
+            </summary>
+            <remarks>
+            Typically you'll be updating whatever you've placed in the contextData field and returning as quickly as possible.
+            </remarks>
+            <param name="args">The arguments for the command to process</param>
+            <param name="stepNumber">The 1-based step number.  This is incrememted each time the step method is called.</param>
+            <param name="contextData">A placeholder for implementers to store contextual data pertaining to the current context.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.Final(System.Object)">
+            <summary>
+            Aggregate functions override this method to finish their aggregate processing.
+            </summary>
+            <remarks>
+            If you implemented your aggregate function properly,
+            you've been recording and keeping track of your data in the contextData object provided, and now at this stage you should have
+            all the information you need in there to figure out what to return.
+            NOTE:  It is possible to arrive here without receiving a previous call to Step(), in which case the contextData will
+            be null.  This can happen when no rows were returned.  You can either return null, or 0 or some other custom return value
+            if that is the case.
+            </remarks>
+            <param name="contextData">Your own assigned contextData, provided for you so you can return your final results.</param>
+            <returns>You may return most simple types as a return value, null or DBNull.Value to return null, DateTime, or
+            you may return an Exception-derived class if you wish to return an error to SQLite.  Do not actually throw the error,
+            just return it!
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.Compare(System.String,System.String)">
+            <summary>
+            User-defined collation sequences override this method to provide a custom string sorting algorithm.
+            </summary>
+            <param name="param1">The first string to compare</param>
+            <param name="param2">The second strnig to compare</param>
+            <returns>1 if param1 is greater than param2, 0 if they are equal, or -1 if param1 is less than param2</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.ConvertParams(System.Int32,System.IntPtr)">
+            <summary>
+            Converts an IntPtr array of context arguments to an object array containing the resolved parameters the pointers point to.
+            </summary>
+            <remarks>
+            Parameters passed to functions have only an affinity for a certain data type, there is no underlying schema available
+            to force them into a certain type.  Therefore the only types you will ever see as parameters are
+            DBNull.Value, Int64, Double, String or byte[] array.
+            </remarks>
+            <param name="nArgs">The number of arguments</param>
+            <param name="argsptr">A pointer to the array of arguments</param>
+            <returns>An object array of the arguments once they've been converted to .NET values</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.SetReturnValue(System.IntPtr,System.Object)">
+            <summary>
+            Takes the return value from Invoke() and Final() and figures out how to return it to SQLite's context.
+            </summary>
+            <param name="context">The context the return value applies to</param>
+            <param name="returnValue">The parameter to return to SQLite</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.ScalarCallback(System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            Internal scalar callback function, which wraps the raw context pointer and calls the virtual Invoke() method.
+            WARNING: Must not throw exceptions.
+            </summary>
+            <param name="context">A raw context pointer</param>
+            <param name="nArgs">Number of arguments passed in</param>
+            <param name="argsptr">A pointer to the array of arguments</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.CompareCallback(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            Internal collation sequence function, which wraps up the raw string pointers and executes the Compare() virtual function.
+            WARNING: Must not throw exceptions.
+            </summary>
+            <param name="ptr">Not used</param>
+            <param name="len1">Length of the string pv1</param>
+            <param name="ptr1">Pointer to the first string to compare</param>
+            <param name="len2">Length of the string pv2</param>
+            <param name="ptr2">Pointer to the second string to compare</param>
+            <returns>Returns -1 if the first string is less than the second.  0 if they are equal, or 1 if the first string is greater
+            than the second.  Returns 0 if an exception is caught.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.CompareCallback16(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            Internal collation sequence function, which wraps up the raw string pointers and executes the Compare() virtual function.
+            WARNING: Must not throw exceptions.
+            </summary>
+            <param name="ptr">Not used</param>
+            <param name="len1">Length of the string pv1</param>
+            <param name="ptr1">Pointer to the first string to compare</param>
+            <param name="len2">Length of the string pv2</param>
+            <param name="ptr2">Pointer to the second string to compare</param>
+            <returns>Returns -1 if the first string is less than the second.  0 if they are equal, or 1 if the first string is greater
+            than the second.  Returns 0 if an exception is caught.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.StepCallback(System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            The internal aggregate Step function callback, which wraps the raw context pointer and calls the virtual Step() method.
+            WARNING: Must not throw exceptions.
+            </summary>
+            <remarks>
+            This function takes care of doing the lookups and getting the important information put together to call the Step() function.
+            That includes pulling out the user's contextData and updating it after the call is made.  We use a sorted list for this so
+            binary searches can be done to find the data.
+            </remarks>
+            <param name="context">A raw context pointer</param>
+            <param name="nArgs">Number of arguments passed in</param>
+            <param name="argsptr">A pointer to the array of arguments</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.FinalCallback(System.IntPtr)">
+            <summary>
+            An internal aggregate Final function callback, which wraps the context pointer and calls the virtual Final() method.
+            WARNING: Must not throw exceptions.
+            </summary>
+            <param name="context">A raw context pointer</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.#cctor">
+            <summary>
+            Using reflection, enumerate all assemblies in the current appdomain looking for classes that
+            have a SQLiteFunctionAttribute attribute, and registering them accordingly.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.RegisterFunction(System.Type)">
+            <summary>
+            Manual method of registering a function.  The type must still have the SQLiteFunctionAttributes in order to work
+            properly, but this is a workaround for the Compact Framework where enumerating assemblies is not currently supported.
+            </summary>
+            <param name="typ">The type of the function to register</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.BindFunctions(System.Data.SQLite.SQLiteBase,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            Called by SQLiteBase derived classes, this function binds all user-defined functions to a connection.
+            It is done this way so that all user-defined functions will access the database using the same encoding scheme
+            as the connection (UTF-8 or UTF-16).
+            </summary>
+            <remarks>
+            The wrapper functions that interop with SQLite will create a unique cookie value, which internally is a pointer to
+            all the wrapped callback functions.  The interop function uses it to map CDecl callbacks to StdCall callbacks.
+            </remarks>
+            <param name="sqlbase">The base object on which the functions are to bind</param>
+            <param name="flags">The flags associated with the parent connection object</param>
+            <returns>Returns a logical list of functions which the connection should retain until it is closed.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.BindFunction(System.Data.SQLite.SQLiteBase,System.Data.SQLite.SQLiteFunctionAttribute,System.Data.SQLite.SQLiteFunction,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            This function binds a user-defined functions to a connection.
+            </summary>
+            <param name="sqliteBase">
+            The <see cref="T:System.Data.SQLite.SQLiteBase"/> object instance associated with the
+            <see cref="T:System.Data.SQLite.SQLiteConnection"/> that the function should be bound to.
+            </param>
+            <param name="functionAttribute">
+            The <see cref="T:System.Data.SQLite.SQLiteFunctionAttribute"/> object instance containing
+            the metadata for the function to be bound.
+            </param>
+            <param name="function">
+            The <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance that implements the
+            function to be bound.
+            </param>
+            <param name="flags">
+            The flags associated with the parent connection object.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteFunction.SQLiteConvert">
+            <summary>
+            Returns a reference to the underlying connection's SQLiteConvert class, which can be used to convert
+            strings and DateTime's into the current connection's encoding schema.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteFunctionEx">
+            <summary>
+            Extends SQLiteFunction and allows an inherited class to obtain the collating sequence associated with a function call.
+            </summary>
+            <remarks>
+            User-defined functions can call the GetCollationSequence() method in this class and use it to compare strings and char arrays.
+            </remarks>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunctionEx.GetCollationSequence">
+            <summary>
+            Obtains the collating sequence in effect for the given function.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:System.Data.SQLite.FunctionType">
+            <summary>
+            The type of user-defined function to declare
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.FunctionType.Scalar">
+            <summary>
+            Scalar functions are designed to be called and return a result immediately.  Examples include ABS(), Upper(), Lower(), etc.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.FunctionType.Aggregate">
+            <summary>
+            Aggregate functions are designed to accumulate data until the end of a call and then return a result gleaned from the accumulated data.
+            Examples include SUM(), COUNT(), AVG(), etc.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.FunctionType.Collation">
+            <summary>
+            Collation sequences are used to sort textual data in a custom manner, and appear in an ORDER BY clause.  Typically text in an ORDER BY is
+            sorted using a straight case-insensitive comparison function.  Custom collating sequences can be used to alter the behavior of text sorting
+            in a user-defined manner.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteCallback">
+            <summary>
+            An internal callback delegate declaration.
+            </summary>
+            <param name="context">Raw native context pointer for the user function.</param>
+            <param name="argc">Total number of arguments to the user function.</param>
+            <param name="argv">Raw native pointer to the array of raw native argument pointers.</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteFinalCallback">
+            <summary>
+            An internal final callback delegate declaration.
+            </summary>
+            <param name="context">Raw context pointer for the user function</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteCollation">
+            <summary>
+            Internal callback delegate for implementing collation sequences
+            </summary>
+            <param name="puser">Not used</param>
+            <param name="len1">Length of the string pv1</param>
+            <param name="pv1">Pointer to the first string to compare</param>
+            <param name="len2">Length of the string pv2</param>
+            <param name="pv2">Pointer to the second string to compare</param>
+            <returns>Returns -1 if the first string is less than the second.  0 if they are equal, or 1 if the first string is greater
+            than the second.</returns>
+        </member>
+        <member name="T:System.Data.SQLite.CollationTypeEnum">
+            <summary>
+            The type of collating sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationTypeEnum.Binary">
+            <summary>
+            The built-in BINARY collating sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationTypeEnum.NoCase">
+            <summary>
+            The built-in NOCASE collating sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationTypeEnum.Reverse">
+            <summary>
+            The built-in REVERSE collating sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationTypeEnum.Custom">
+            <summary>
+            A custom user-defined collating sequence
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.CollationEncodingEnum">
+            <summary>
+            The encoding type the collation sequence uses
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationEncodingEnum.UTF8">
+            <summary>
+            The collation sequence is UTF8
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationEncodingEnum.UTF16LE">
+            <summary>
+            The collation sequence is UTF16 little-endian
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationEncodingEnum.UTF16BE">
+            <summary>
+            The collation sequence is UTF16 big-endian
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.CollationSequence">
+            <summary>
+            A struct describing the collating sequence a function is executing in
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationSequence.Name">
+            <summary>
+            The name of the collating sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationSequence.Type">
+            <summary>
+            The type of collating sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationSequence.Encoding">
+            <summary>
+            The text encoding of the collation sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationSequence._func">
+            <summary>
+            Context of the function that requested the collating sequence
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.CollationSequence.Compare(System.String,System.String)">
+            <summary>
+            Calls the base collating sequence to compare two strings
+            </summary>
+            <param name="s1">The first string to compare</param>
+            <param name="s2">The second string to compare</param>
+            <returns>-1 if s1 is less than s2, 0 if s1 is equal to s2, and 1 if s1 is greater than s2</returns>
+        </member>
+        <member name="M:System.Data.SQLite.CollationSequence.Compare(System.Char[],System.Char[])">
+            <summary>
+            Calls the base collating sequence to compare two character arrays
+            </summary>
+            <param name="c1">The first array to compare</param>
+            <param name="c2">The second array to compare</param>
+            <returns>-1 if c1 is less than c2, 0 if c1 is equal to c2, and 1 if c1 is greater than c2</returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteFunctionAttribute">
+            <summary>
+            A simple custom attribute to enable us to easily find user-defined functions in
+            the loaded assemblies and initialize them in SQLite as connections are made.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunctionAttribute.#ctor">
+            <summary>
+            Default constructor, initializes the internal variables for the function.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunctionAttribute.#ctor(System.String,System.Int32,System.Data.SQLite.FunctionType)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="name">
+            The name of the function, as seen by the SQLite core library.
+            </param>
+            <param name="argumentCount">
+            The number of arguments that the function will accept.
+            </param>
+            <param name="functionType">
+            The type of function being declared.  This will either be Scalar,
+            Aggregate, or Collation.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteFunctionAttribute.Name">
+            <summary>
+            The function's name as it will be used in SQLite command text.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteFunctionAttribute.Arguments">
+            <summary>
+            The number of arguments this function expects.  -1 if the number of arguments is variable.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteFunctionAttribute.FuncType">
+            <summary>
+            The type of function this implementation will be.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteFunctionAttribute.InstanceType">
+            <summary>
+            The <see cref="T:System.Type"/> object instance that describes the class
+            containing the implementation for the associated function.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteKeyReader">
+            <summary>
+            This class provides key info for a given SQLite statement.
+            <remarks>
+            Providing key information for a given statement is non-trivial :(
+            </remarks>
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteKeyReader.#ctor(System.Data.SQLite.SQLiteConnection,System.Data.SQLite.SQLiteDataReader,System.Data.SQLite.SQLiteStatement)">
+            <summary>
+            This function does all the nasty work at determining what keys need to be returned for
+            a given statement.
+            </summary>
+            <param name="cnn"></param>
+            <param name="reader"></param>
+            <param name="stmt"></param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteKeyReader.Sync">
+            <summary>
+            Make sure all the subqueries are open and ready and sync'd with the current rowid
+            of the table they're supporting
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteKeyReader.Reset">
+            <summary>
+            Release any readers on any subqueries
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteKeyReader.AppendSchemaTable(System.Data.DataTable)">
+            <summary>
+            Append all the columns we've added to the original query to the schema
+            </summary>
+            <param name="tbl"></param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteKeyReader.Count">
+            <summary>
+            How many additional columns of keyinfo we're holding
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteKeyReader.KeyInfo">
+            <summary>
+            Used to support CommandBehavior.KeyInfo
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteKeyReader.KeyQuery">
+            <summary>
+            A single sub-query for a given table/database.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.LogEventArgs">
+            <summary>
+            Event data for logging event handlers.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.LogEventArgs.ErrorCode">
+            <summary>
+            The error code.  The type of this object value should be
+            <see cref="T:System.Int32"/> or <see cref="T:System.Data.SQLite.SQLiteErrorCode"/>.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.LogEventArgs.Message">
+            <summary>
+            SQL statement text as the statement first begins executing
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.LogEventArgs.Data">
+            <summary>
+            Extra data associated with this event, if any.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.LogEventArgs.#ctor(System.IntPtr,System.Object,System.String,System.Object)">
+            <summary>
+            Constructs the object.
+            </summary>
+            <param name="pUserData">Should be null.</param>
+            <param name="errorCode">
+            The error code.  The type of this object value should be
+            <see cref="T:System.Int32"/> or <see cref="T:System.Data.SQLite.SQLiteErrorCode"/>.
+            </param>
+            <param name="message">The error message, if any.</param>
+            <param name="data">The extra data, if any.</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteLogEventHandler">
+            <summary>
+            Raised when a log event occurs.
+            </summary>
+            <param name="sender">The current connection</param>
+            <param name="e">Event arguments of the trace</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteLog">
+            <summary>
+            Manages the SQLite custom logging functionality and the associated
+            callback for the whole process.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteLog.syncRoot">
+            <summary>
+            Object used to synchronize access to the static instance data
+            for this class.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteLog._domainUnload">
+            <summary>
+            Member variable to store the AppDomain.DomainUnload event handler.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteLog._defaultHandler">
+            <summary>
+            The default log event handler.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteLog._callback">
+            <summary>
+            The log callback passed to native SQLite engine.  This must live
+            as long as the SQLite library has a pointer to it.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteLog._sql">
+            <summary>
+            The base SQLite object to interop with.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteLog._enabled">
+            <summary>
+            This will be non-zero if logging is currently enabled.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.Initialize">
+            <summary>
+            Initializes the SQLite logging facilities.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.DomainUnload(System.Object,System.EventArgs)">
+            <summary>
+            Handles the AppDomain being unloaded.
+            </summary>
+            <param name="sender">Should be null.</param>
+            <param name="e">The data associated with this event.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.LogMessage(System.String)">
+            <summary>
+            Log a message to all the registered log event handlers without going
+            through the SQLite library.
+            </summary>
+            <param name="message">The message to be logged.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.LogMessage(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            <summary>
+            Log a message to all the registered log event handlers without going
+            through the SQLite library.
+            </summary>
+            <param name="errorCode">The SQLite error code.</param>
+            <param name="message">The message to be logged.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.LogMessage(System.Int32,System.String)">
+            <summary>
+            Log a message to all the registered log event handlers without going
+            through the SQLite library.
+            </summary>
+            <param name="errorCode">The integer error code.</param>
+            <param name="message">The message to be logged.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.LogMessage(System.Object,System.String)">
+            <summary>
+            Log a message to all the registered log event handlers without going
+            through the SQLite library.
+            </summary>
+            <param name="errorCode">
+            The error code.  The type of this object value should be
+            System.Int32 or SQLiteErrorCode.
+            </param>
+            <param name="message">The message to be logged.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.InitializeDefaultHandler">
+            <summary>
+            Creates and initializes the default log event handler.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.AddDefaultHandler">
+            <summary>
+            Adds the default log event handler to the list of handlers.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.RemoveDefaultHandler">
+            <summary>
+            Removes the default log event handler from the list of handlers.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.LogCallback(System.IntPtr,System.Int32,System.IntPtr)">
+             <summary>
+             Internal proxy function that calls any registered application log
+             event handlers.
+            
+             WARNING: This method is used more-or-less directly by native code,
+                      do not modify its type signature.
+             </summary>
+             <param name="pUserData">
+             The extra data associated with this message, if any.
+             </param>
+             <param name="errorCode">
+             The error code associated with this message.
+             </param>
+             <param name="pMessage">
+             The message string to be logged.
+             </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.LogEventHandler(System.Object,System.Data.SQLite.LogEventArgs)">
+            <summary>
+            Default logger.  Currently, uses the Trace class (i.e. sends events
+            to the current trace listeners, if any).
+            </summary>
+            <param name="sender">Should be null.</param>
+            <param name="e">The data associated with this event.</param>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteLog._handlers">
+            <summary>
+            Member variable to store the application log handler to call.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteLog.Log">
+            <summary>
+            This event is raised whenever SQLite raises a logging event.
+            Note that this should be set as one of the first things in the
+            application.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteLog.Enabled">
+            <summary>
+            If this property is true, logging is enabled; otherwise, logging is
+            disabled.  When logging is disabled, no logging events will fire.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteMetaDataCollectionNames">
+            <summary>
+            MetaDataCollections specific to SQLite
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Catalogs">
+            <summary>
+            Returns a list of databases attached to the connection
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Columns">
+            <summary>
+            Returns column information for the specified table
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Indexes">
+            <summary>
+            Returns index information for the optionally-specified table
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.IndexColumns">
+            <summary>
+            Returns base columns for the given index
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Tables">
+            <summary>
+            Returns the tables in the given catalog
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Views">
+            <summary>
+            Returns user-defined views in the given catalog
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.ViewColumns">
+            <summary>
+            Returns underlying column information on the given view
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.ForeignKeys">
+            <summary>
+            Returns foreign key information for the given catalog
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Triggers">
+            <summary>
+            Returns the triggers on the database
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteParameter">
+            <summary>
+            SQLite implementation of DbParameter.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameter._dbType">
+            <summary>
+            The data type of the parameter
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameter._rowVersion">
+            <summary>
+            The version information for mapping the parameter
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameter._objValue">
+            <summary>
+            The value of the data in the parameter
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameter._sourceColumn">
+            <summary>
+            The source column for the parameter
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameter._parameterName">
+            <summary>
+            The column name
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameter._dataSize">
+            <summary>
+            The data size, unused by SQLite
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String)">
+            <summary>
+            Constructs a named parameter given the specified parameter name
+            </summary>
+            <param name="parameterName">The parameter name</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Object)">
+            <summary>
+            Constructs a named parameter given the specified parameter name and initial value
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="value">The initial value of the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType)">
+            <summary>
+            Constructs a named parameter of the specified type
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="dbType">The datatype of the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.String)">
+            <summary>
+            Constructs a named parameter of the specified type and source column reference
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="dbType">The data type</param>
+            <param name="sourceColumn">The source column</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.String,System.Data.DataRowVersion)">
+            <summary>
+            Constructs a named parameter of the specified type, source column and row version
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="dbType">The data type</param>
+            <param name="sourceColumn">The source column</param>
+            <param name="rowVersion">The row version information</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType)">
+            <summary>
+            Constructs an unnamed parameter of the specified data type
+            </summary>
+            <param name="dbType">The datatype of the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.Object)">
+            <summary>
+            Constructs an unnamed parameter of the specified data type and sets the initial value
+            </summary>
+            <param name="dbType">The datatype of the parameter</param>
+            <param name="value">The initial value of the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.String)">
+            <summary>
+            Constructs an unnamed parameter of the specified data type and source column
+            </summary>
+            <param name="dbType">The datatype of the parameter</param>
+            <param name="sourceColumn">The source column</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.String,System.Data.DataRowVersion)">
+            <summary>
+            Constructs an unnamed parameter of the specified data type, source column and row version
+            </summary>
+            <param name="dbType">The data type</param>
+            <param name="sourceColumn">The source column</param>
+            <param name="rowVersion">The row version information</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.Int32)">
+            <summary>
+            Constructs a named parameter of the specified type and size
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.Int32,System.String)">
+            <summary>
+            Constructs a named parameter of the specified type, size and source column
+            </summary>
+            <param name="parameterName">The name of the parameter</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+            <param name="sourceColumn">The source column</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.Int32,System.String,System.Data.DataRowVersion)">
+            <summary>
+            Constructs a named parameter of the specified type, size, source column and row version
+            </summary>
+            <param name="parameterName">The name of the parameter</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+            <param name="sourceColumn">The source column</param>
+            <param name="rowVersion">The row version information</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.Int32,System.Data.ParameterDirection,System.Boolean,System.Byte,System.Byte,System.String,System.Data.DataRowVersion,System.Object)">
+            <summary>
+            Constructs a named parameter of the specified type, size, source column and row version
+            </summary>
+            <param name="parameterName">The name of the parameter</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+            <param name="direction">Only input parameters are supported in SQLite</param>
+            <param name="isNullable">Ignored</param>
+            <param name="precision">Ignored</param>
+            <param name="scale">Ignored</param>
+            <param name="sourceColumn">The source column</param>
+            <param name="rowVersion">The row version information</param>
+            <param name="value">The initial value to assign the parameter</param>   
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.Int32,System.Data.ParameterDirection,System.Byte,System.Byte,System.String,System.Data.DataRowVersion,System.Boolean,System.Object)">
+            <summary>
+            Constructs a named parameter, yet another flavor
+            </summary>
+            <param name="parameterName">The name of the parameter</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+            <param name="direction">Only input parameters are supported in SQLite</param>
+            <param name="precision">Ignored</param>
+            <param name="scale">Ignored</param>
+            <param name="sourceColumn">The source column</param>
+            <param name="rowVersion">The row version information</param>
+            <param name="sourceColumnNullMapping">Whether or not this parameter is for comparing NULL's</param>
+            <param name="value">The intial value to assign the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.Int32)">
+            <summary>
+            Constructs an unnamed parameter of the specified type and size
+            </summary>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.Int32,System.String)">
+            <summary>
+            Constructs an unnamed parameter of the specified type, size, and source column
+            </summary>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+            <param name="sourceColumn">The source column</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.Int32,System.String,System.Data.DataRowVersion)">
+            <summary>
+            Constructs an unnamed parameter of the specified type, size, source column and row version
+            </summary>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+            <param name="sourceColumn">The source column</param>
+            <param name="rowVersion">The row version information</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.ResetDbType">
+            <summary>
+            Resets the DbType of the parameter so it can be inferred from the value
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.Clone">
+            <summary>
+            Clones a parameter
+            </summary>
+            <returns>A new, unassociated SQLiteParameter</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.IsNullable">
+            <summary>
+            Whether or not the parameter can contain a null value
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.DbType">
+            <summary>
+            Returns the datatype of the parameter
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.Direction">
+            <summary>
+            Supports only input parameters
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.ParameterName">
+            <summary>
+            Returns the parameter name
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.Size">
+            <summary>
+            Returns the size of the parameter
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.SourceColumn">
+            <summary>
+            Gets/sets the source column
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.SourceColumnNullMapping">
+            <summary>
+            Used by DbCommandBuilder to determine the mapping for nullable fields
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.SourceVersion">
+            <summary>
+            Gets and sets the row version
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.Value">
+            <summary>
+            Gets and sets the parameter value.  If no datatype was specified, the datatype will assume the type from the value given.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteParameterCollection">
+            <summary>
+            SQLite implementation of DbParameterCollection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameterCollection._command">
+            <summary>
+            The underlying command to which this collection belongs
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameterCollection._parameterList">
+            <summary>
+            The internal array of parameters in this collection
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameterCollection._unboundFlag">
+            <summary>
+            Determines whether or not all parameters have been bound to their statement(s)
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.#ctor(System.Data.SQLite.SQLiteCommand)">
+            <summary>
+            Initializes the collection
+            </summary>
+            <param name="cmd">The command to which the collection belongs</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.GetEnumerator">
+            <summary>
+            Retrieves an enumerator for the collection
+            </summary>
+            <returns>An enumerator for the underlying array</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Add(System.String,System.Data.DbType,System.Int32,System.String)">
+            <summary>
+            Adds a parameter to the collection
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the value</param>
+            <param name="sourceColumn">The source column</param>
+            <returns>A SQLiteParameter object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Add(System.String,System.Data.DbType,System.Int32)">
+            <summary>
+            Adds a parameter to the collection
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the value</param>
+            <returns>A SQLiteParameter object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Add(System.String,System.Data.DbType)">
+            <summary>
+            Adds a parameter to the collection
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="parameterType">The data type</param>
+            <returns>A SQLiteParameter object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Add(System.Data.SQLite.SQLiteParameter)">
+            <summary>
+            Adds a parameter to the collection
+            </summary>
+            <param name="parameter">The parameter to add</param>
+            <returns>A zero-based index of where the parameter is located in the array</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Add(System.Object)">
+            <summary>
+            Adds a parameter to the collection
+            </summary>
+            <param name="value">The parameter to add</param>
+            <returns>A zero-based index of where the parameter is located in the array</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.AddWithValue(System.String,System.Object)">
+            <summary>
+            Adds a named/unnamed parameter and its value to the parameter collection.
+            </summary>
+            <param name="parameterName">Name of the parameter, or null to indicate an unnamed parameter</param>
+            <param name="value">The initial value of the parameter</param>
+            <returns>Returns the SQLiteParameter object created during the call.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.AddRange(System.Data.SQLite.SQLiteParameter[])">
+            <summary>
+            Adds an array of parameters to the collection
+            </summary>
+            <param name="values">The array of parameters to add</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.AddRange(System.Array)">
+            <summary>
+            Adds an array of parameters to the collection
+            </summary>
+            <param name="values">The array of parameters to add</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Clear">
+            <summary>
+            Clears the array and resets the collection
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Contains(System.String)">
+            <summary>
+            Determines if the named parameter exists in the collection
+            </summary>
+            <param name="parameterName">The name of the parameter to check</param>
+            <returns>True if the parameter is in the collection</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Contains(System.Object)">
+            <summary>
+            Determines if the parameter exists in the collection
+            </summary>
+            <param name="value">The SQLiteParameter to check</param>
+            <returns>True if the parameter is in the collection</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.CopyTo(System.Array,System.Int32)">
+            <summary>
+            Not implemented
+            </summary>
+            <param name="array"></param>
+            <param name="index"></param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.GetParameter(System.String)">
+            <summary>
+            Retrieve a parameter by name from the collection
+            </summary>
+            <param name="parameterName">The name of the parameter to fetch</param>
+            <returns>A DbParameter object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.GetParameter(System.Int32)">
+            <summary>
+            Retrieves a parameter by its index in the collection
+            </summary>
+            <param name="index">The index of the parameter to retrieve</param>
+            <returns>A DbParameter object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.IndexOf(System.String)">
+            <summary>
+            Returns the index of a parameter given its name
+            </summary>
+            <param name="parameterName">The name of the parameter to find</param>
+            <returns>-1 if not found, otherwise a zero-based index of the parameter</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.IndexOf(System.Object)">
+            <summary>
+            Returns the index of a parameter
+            </summary>
+            <param name="value">The parameter to find</param>
+            <returns>-1 if not found, otherwise a zero-based index of the parameter</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Insert(System.Int32,System.Object)">
+            <summary>
+            Inserts a parameter into the array at the specified location
+            </summary>
+            <param name="index">The zero-based index to insert the parameter at</param>
+            <param name="value">The parameter to insert</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Remove(System.Object)">
+            <summary>
+            Removes a parameter from the collection
+            </summary>
+            <param name="value">The parameter to remove</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.RemoveAt(System.String)">
+            <summary>
+            Removes a parameter from the collection given its name
+            </summary>
+            <param name="parameterName">The name of the parameter to remove</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.RemoveAt(System.Int32)">
+            <summary>
+            Removes a parameter from the collection given its index
+            </summary>
+            <param name="index">The zero-based parameter index to remove</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.SetParameter(System.String,System.Data.Common.DbParameter)">
+            <summary>
+            Re-assign the named parameter to a new parameter object
+            </summary>
+            <param name="parameterName">The name of the parameter to replace</param>
+            <param name="value">The new parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.SetParameter(System.Int32,System.Data.Common.DbParameter)">
+            <summary>
+            Re-assign a parameter at the specified index
+            </summary>
+            <param name="index">The zero-based index of the parameter to replace</param>
+            <param name="value">The new parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Unbind">
+            <summary>
+            Un-binds all parameters from their statements
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.MapParameters(System.Data.SQLite.SQLiteStatement)">
+            <summary>
+            This function attempts to map all parameters in the collection to all statements in a Command.
+            Since named parameters may span multiple statements, this function makes sure all statements are bound
+            to the same named parameter.  Unnamed parameters are bound in sequence.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.IsSynchronized">
+            <summary>
+            Returns false
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.IsFixedSize">
+            <summary>
+            Returns false
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.IsReadOnly">
+            <summary>
+            Returns false
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.SyncRoot">
+            <summary>
+            Returns null
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.Count">
+            <summary>
+            Returns a count of parameters in the collection
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.Item(System.String)">
+            <summary>
+            Overloaded to specialize the return value of the default indexer
+            </summary>
+            <param name="parameterName">Name of the parameter to get/set</param>
+            <returns>The specified named SQLite parameter</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.Item(System.Int32)">
+            <summary>
+            Overloaded to specialize the return value of the default indexer
+            </summary>
+            <param name="index">The index of the parameter to get/set</param>
+            <returns>The specified SQLite parameter</returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteStatement">
+            <summary>
+            Represents a single SQL statement in SQLite.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._sql">
+            <summary>
+            The underlying SQLite object this statement is bound to
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._sqlStatement">
+            <summary>
+            The command text of this SQL statement
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._sqlite_stmt">
+            <summary>
+            The actual statement pointer
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._unnamedParameters">
+            <summary>
+            An index from which unnamed parameters begin
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._paramNames">
+            <summary>
+            Names of the parameters as SQLite understands them to be
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._paramValues">
+            <summary>
+            Parameters for this statement
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._command">
+            <summary>
+            Command this statement belongs to (if any)
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._flags">
+            <summary>
+            The flags associated with the parent connection object.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.#ctor(System.Data.SQLite.SQLiteBase,System.Data.SQLite.SQLiteConnectionFlags,System.Data.SQLite.SQLiteStatementHandle,System.String,System.Data.SQLite.SQLiteStatement)">
+            <summary>
+            Initializes the statement and attempts to get all information about parameters in the statement
+            </summary>
+            <param name="sqlbase">The base SQLite object</param>
+            <param name="flags">The flags associated with the parent connection object</param>
+            <param name="stmt">The statement</param>
+            <param name="strCommand">The command text for this statement</param>
+            <param name="previous">The previous command in a multi-statement command</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.Dispose">
+            <summary>
+            Disposes and finalizes the statement
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.TryGetChanges(System.Int32@)">
+            <summary>
+            If the underlying database connection is open, fetches the number of changed rows
+            resulting from the most recent query; otherwise, does nothing.
+            </summary>
+            <param name="changes">
+            The number of changes when true is returned.
+            Undefined if false is returned.
+            </param>
+            <returns>Non-zero if the number of changed rows was fetched.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.MapParameter(System.String,System.Data.SQLite.SQLiteParameter)">
+            <summary>
+            Called by SQLiteParameterCollection, this function determines if the specified parameter name belongs to
+            this statement, and if so, keeps a reference to the parameter so it can be bound later.
+            </summary>
+            <param name="s">The parameter name to map</param>
+            <param name="p">The parameter to assign it</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.BindParameters">
+            <summary>
+             Bind all parameters, making sure the caller didn't miss any
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.ToBoolean(System.Object,System.IFormatProvider)">
+            <summary>
+            Attempts to convert an arbitrary object to the Boolean data type.
+            Null object values are converted to false.  Throws a SQLiteException
+            upon failure.
+            </summary>
+            <param name="obj">The object value to convert.</param>
+            <param name="provider">The format provider to use.</param>
+            <returns>The converted boolean value.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.BindParameter(System.Int32,System.Data.SQLite.SQLiteParameter)">
+            <summary>
+            Perform the bind operation for an individual parameter
+            </summary>
+            <param name="index">The index of the parameter to bind</param>
+            <param name="param">The parameter we're binding</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteTransaction">
+            <summary>
+            SQLite implementation of DbTransaction.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteTransaction._cnn">
+            <summary>
+            The connection to which this transaction is bound
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteTransaction.#ctor(System.Data.SQLite.SQLiteConnection,System.Boolean)">
+            <summary>
+            Constructs the transaction object, binding it to the supplied connection
+            </summary>
+            <param name="connection">The connection to open a transaction on</param>
+            <param name="deferredLock">TRUE to defer the writelock, or FALSE to lock immediately</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteTransaction.Dispose(System.Boolean)">
+            <summary>
+            Disposes the transaction.  If it is currently active, any changes are rolled back.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteTransaction.Commit">
+            <summary>
+            Commits the current transaction.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteTransaction.Rollback">
+            <summary>
+            Rolls back the active transaction.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteTransaction.Connection">
+            <summary>
+            Returns the underlying connection to which this transaction applies.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteTransaction.DbConnection">
+            <summary>
+            Forwards to the local Connection property
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteTransaction.IsolationLevel">
+            <summary>
+            Gets the isolation level of the transaction.  SQLite only supports Serializable transactions.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SR">
+            <summary>
+              A strongly-typed resource class, for looking up localized strings, etc.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SR.ResourceManager">
+            <summary>
+              Returns the cached ResourceManager instance used by this class.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SR.Culture">
+            <summary>
+              Overrides the current thread's CurrentUICulture property for all
+              resource lookups using this strongly typed resource class.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SR.DataTypes">
+             <summary>
+               Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot; standalone=&quot;yes&quot;?&gt;
+            &lt;DocumentElement&gt;
+              &lt;DataTypes&gt;
+                &lt;TypeName&gt;smallint&lt;/TypeName&gt;
+                &lt;ProviderDbType&gt;10&lt;/ProviderDbType&gt;
+                &lt;ColumnSize&gt;5&lt;/ColumnSize&gt;
+                &lt;DataType&gt;System.Int16&lt;/DataType&gt;
+                &lt;CreateFormat&gt;smallint&lt;/CreateFormat&gt;
+                &lt;IsAutoIncrementable&gt;false&lt;/IsAutoIncrementable&gt;
+                &lt;IsCaseSensitive&gt;false&lt;/IsCaseSensitive&gt;
+                &lt;IsFixedLength&gt;true&lt;/IsFixedLength&gt;
+                &lt;IsFixedPrecisionScale&gt;true&lt;/IsFixedPrecisionScale&gt;
+                &lt;IsLong&gt;false&lt;/IsLong&gt;
+                &lt;IsNullable&gt;true&lt;/ [rest of string was truncated]&quot;;.
+             </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SR.Keywords">
+            <summary>
+              Looks up a localized string similar to ALL,ALTER,AND,AS,AUTOINCREMENT,BETWEEN,BY,CASE,CHECK,COLLATE,COMMIT,CONSTRAINT,CREATE,CROSS,DEFAULT,DEFERRABLE,DELETE,DISTINCT,DROP,ELSE,ESCAPE,EXCEPT,FOREIGN,FROM,FULL,GROUP,HAVING,IN,INDEX,INNER,INSERT,INTERSECT,INTO,IS,ISNULL,JOIN,LEFT,LIMIT,NATURAL,NOT,NOTNULL,NULL,ON,OR,ORDER,OUTER,PRIMARY,REFERENCES,RIGHT,ROLLBACK,SELECT,SET,TABLE,THEN,TO,TRANSACTION,UNION,UNIQUE,UPDATE,USING,VALUES,WHEN,WHERE.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SR.MetaDataCollections">
+             <summary>
+               Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
+            &lt;DocumentElement&gt;
+              &lt;MetaDataCollections&gt;
+                &lt;CollectionName&gt;MetaDataCollections&lt;/CollectionName&gt;
+                &lt;NumberOfRestrictions&gt;0&lt;/NumberOfRestrictions&gt;
+                &lt;NumberOfIdentifierParts&gt;0&lt;/NumberOfIdentifierParts&gt;
+              &lt;/MetaDataCollections&gt;
+              &lt;MetaDataCollections&gt;
+                &lt;CollectionName&gt;DataSourceInformation&lt;/CollectionName&gt;
+                &lt;NumberOfRestrictions&gt;0&lt;/NumberOfRestrictions&gt;
+                &lt;NumberOfIdentifierParts&gt;0&lt;/NumberOfIdentifierParts&gt;
+              &lt;/MetaDataCollections&gt;
+              &lt;MetaDataC [rest of string was truncated]&quot;;.
+             </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UnsafeNativeMethods.PROCESSOR_ARCHITECTURE">
+            <summary>
+            The name of the environment variable containing the processor
+            architecture of the current process.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.LoadLibrary(System.String)">
+            <summary>
+            This is the P/Invoke method that wraps the native Win32 LoadLibrary
+            function.  See the MSDN documentation for full details on what it
+            does.
+            </summary>
+            <param name="fileName">
+            The name of the executable library.
+            </param>
+            <returns>
+            The native module handle upon success -OR- IntPtr.Zero on failure.
+            </returns>
+        </member>
+        <member name="F:System.Data.SQLite.UnsafeNativeMethods.staticSyncRoot">
+            <summary>
+            This lock is used to protect the static _SQLiteModule and
+            processorArchitecturePlatforms fields, below.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UnsafeNativeMethods.processorArchitecturePlatforms">
+            <summary>
+            Stores the mappings between processor architecture names and platform
+            names.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UnsafeNativeMethods._SQLiteModule">
+            <summary>
+            The native module handle for the native SQLite library or the value
+            IntPtr.Zero.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.#cctor">
+            <summary>
+            For now, this method simply calls the Initialize method.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.Initialize">
+            <summary>
+            Attempts to initialize this class by pre-loading the native SQLite
+            library for the processor architecture of the current process.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.GetBaseDirectory">
+            <summary>
+            Queries and returns the base directory of the current application
+            domain.
+            </summary>
+            <returns>
+            The base directory for the current application domain -OR- null if it
+            cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.FixUpDllFileName(System.String)">
+            <summary>
+            Determines if the dynamic link library file name requires a suffix
+            and adds it if necessary.
+            </summary>
+            <param name="fileName">
+            The original dynamic link library file name to inspect.
+            </param>
+            <returns>
+            The dynamic link library file name, possibly modified to include an
+            extension.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.GetProcessorArchitecture">
+            <summary>
+            Queries and returns the processor architecture of the current
+            process.
+            </summary>
+            <returns>
+            The processor architecture of the current process -OR- null if it
+            cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.GetPlatformName(System.String)">
+            <summary>
+            Given the processor architecture, returns the name of the platform.
+            </summary>
+            <param name="processorArchitecture">
+            The processor architecture to be translated to a platform name.
+            </param>
+            <returns>
+            The platform name for the specified processor architecture -OR- null
+            if it cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.PreLoadSQLiteDll(System.String,System.String)">
+            <summary>
+            Attempts to load the native SQLite library based on the specified
+            directory and processor architecture.
+            </summary>
+            <param name="directory">
+            The base directory to use, null for default (the base directory of
+            the current application domain).  This directory should contain the
+            processor architecture specific sub-directories.
+            </param>
+            <param name="processorArchitecture">
+            The requested processor architecture, null for default (the
+            processor architecture of the current process).  This caller should
+            almost always specify null for this parameter.
+            </param>
+            <returns>
+            The native module handle as returned by LoadLibrary -OR- IntPtr.Zero
+            if the loading fails for any reason.
+            </returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteContext">
+            <summary>
+            This class represents a context from the SQLite core library that can
+            be passed to the sqlite3_result_*() and associated functions.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.ISQLiteNativeHandle">
+            <summary>
+            This interface represents a native handle provided by the SQLite core
+            library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.ISQLiteNativeHandle.NativeHandle">
+            <summary>
+            The native handle value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteContext.pContext">
+            <summary>
+            The native context handle.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.#ctor(System.IntPtr)">
+            <summary>
+            Constructs an instance of this class using the specified native
+            context handle.
+            </summary>
+            <param name="pContext">
+            The native context handle to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetNull">
+            <summary>
+            Sets the context result to NULL.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetDouble(System.Double)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.Double"/>
+            value.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.Double"/> value to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetInt(System.Int32)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.Int32"/>
+            value.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.Int32"/> value to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetInt64(System.Int64)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.Int64"/>
+            value.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.Int64"/> value to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetString(System.String)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.String"/>
+            value.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.String"/> value to use.  This value will be
+            converted to the UTF-8 encoding prior to being used.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetError(System.String)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.String"/>
+            value containing an error message.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.String"/> value containing the error message text.
+            This value will be converted to the UTF-8 encoding prior to being
+            used.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetErrorCode(System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.Data.SQLite.SQLiteErrorCode"/>
+            value.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetErrorTooBig">
+            <summary>
+            Sets the context result to contain the error code SQLITE_TOOBIG.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetErrorNoMemory">
+            <summary>
+            Sets the context result to contain the error code SQLITE_NOMEM.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetBlob(System.Byte[])">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.Byte"/> array
+            value.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.Byte"/> array value to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetZeroBlob(System.Int32)">
+            <summary>
+            Sets the context result to a BLOB of zeros of the specified size.
+            </summary>
+            <param name="value">
+            The number of zero bytes to use for the BLOB context result.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetValue(System.Data.SQLite.SQLiteValue)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.Data.SQLite.SQLiteValue"/>.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.Data.SQLite.SQLiteValue"/> to use.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteContext.NativeHandle">
+            <summary>
+            Returns the underlying SQLite native handle associated with this
+            object instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteValue">
+            <summary>
+            This class represents a value from the SQLite core library that can be
+            passed to the sqlite3_value_*() and associated functions.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteValue.pValue">
+            <summary>
+            The native value handle.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.#ctor(System.IntPtr)">
+            <summary>
+            Constructs an instance of this class using the specified native
+            value handle.
+            </summary>
+            <param name="pValue">
+            The native value handle to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.PreventNativeAccess">
+            <summary>
+            Invalidates the native value handle, thereby preventing further
+            access to it from this object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.ArrayFromSizeAndIntPtr(System.Int32,System.IntPtr)">
+            <summary>
+            Converts a logical array of native pointers to native sqlite3_value
+            structures into a managed array of <see cref="T:System.Data.SQLite.SQLiteValue"/>
+            object instances.
+            </summary>
+            <param name="argc">
+            The number of elements in the logical array of native sqlite3_value
+            structures.
+            </param>
+            <param name="argv">
+            The native pointer to the logical array of native sqlite3_value
+            structures to convert.
+            </param>
+            <returns>
+            The managed array of <see cref="T:System.Data.SQLite.SQLiteValue"/> object instances or
+            null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetTypeAffinity">
+            <summary>
+            Gets and returns the type affinity associated with this value.
+            </summary>
+            <returns>
+            The type affinity associated with this value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetBytes">
+            <summary>
+            Gets and returns the number of bytes associated with this value, if
+            it refers to a UTF-8 encoded string.
+            </summary>
+            <returns>
+            The number of bytes associated with this value.  The returned value
+            may be zero.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetInt">
+            <summary>
+            Gets and returns the <see cref="T:System.Int32"/> associated with this
+            value.
+            </summary>
+            <returns>
+            The <see cref="T:System.Int32"/> associated with this value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetInt64">
+            <summary>
+            Gets and returns the <see cref="T:System.Int64"/> associated with
+            this value.
+            </summary>
+            <returns>
+            The <see cref="T:System.Int64"/> associated with this value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetDouble">
+            <summary>
+            Gets and returns the <see cref="T:System.Double"/> associated with this
+            value.
+            </summary>
+            <returns>
+            The <see cref="T:System.Double"/> associated with this value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetString">
+            <summary>
+            Gets and returns the <see cref="T:System.String"/> associated with this
+            value.
+            </summary>
+            <returns>
+            The <see cref="T:System.String"/> associated with this value.  The value is
+            converted from the UTF-8 encoding prior to being returned.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetBlob">
+            <summary>
+            Gets and returns the <see cref="T:System.Byte"/> array associated with this
+            value.
+            </summary>
+            <returns>
+            The <see cref="T:System.Byte"/> array associated with this value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.Persist">
+            <summary>
+            Uses the native value handle to obtain and store the managed value
+            for this object instance, thus saving it for later use.  The type
+            of the managed value is determined by the type affinity of the
+            native value.  If the type affinity is not recognized by this
+            method, no work is done and false is returned.
+            </summary>
+            <returns>
+            Non-zero if the native value was persisted successfully.
+            </returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteValue.NativeHandle">
+            <summary>
+            Returns the underlying SQLite native handle associated with this
+            object instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteValue.Persisted">
+            <summary>
+            Returns non-zero if the native SQLite value has been successfully
+            persisted as a managed value within this object instance (i.e. the
+            <see cref="P:System.Data.SQLite.SQLiteValue.Value"/> property may then be read successfully).
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteValue.Value">
+            <summary>
+            If the managed value for this object instance is available (i.e. it
+            has been previously persisted via the <see cref="M:System.Data.SQLite.SQLiteValue.Persist"/>) method,
+            that value is returned; otherwise, an exception is thrown.  The
+            returned value may be null.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndexConstraintOp">
+            <summary>
+            These are the allowed values for the operators that are part of a
+            constraint term in the WHERE clause of a query that uses a virtual
+            table.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintOp.EqualTo">
+            <summary>
+            This value represents the equality operator.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintOp.GreaterThan">
+            <summary>
+            This value represents the greater than operator.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintOp.LessThanOrEqualTo">
+            <summary>
+            This value represents the less than or equal to operator.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintOp.LessThan">
+            <summary>
+            This value represents the less than operator.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintOp.GreaterThanOrEqualTo">
+            <summary>
+            This value represents the greater than or equal to operator.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintOp.Match">
+            <summary>
+            This value represents the MATCH operator.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndexConstraint">
+            <summary>
+            This class represents the native sqlite3_index_constraint structure
+            from the SQLite core library.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexConstraint.#ctor(System.Data.SQLite.UnsafeNativeMethods.sqlite3_index_constraint)">
+            <summary>
+            Constructs an instance of this class using the specified native
+            sqlite3_index_constraint structure.
+            </summary>
+            <param name="constraint">
+            The native sqlite3_index_constraint structure to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexConstraint.#ctor(System.Int32,System.Data.SQLite.SQLiteIndexConstraintOp,System.Byte,System.Int32)">
+            <summary>
+            Constructs an instance of this class using the specified field
+            values.
+            </summary>
+            <param name="iColumn">
+            Column on left-hand side of constraint.
+            </param>
+            <param name="op">
+            Constraint operator (<see cref="T:System.Data.SQLite.SQLiteIndexConstraintOp"/>).
+            </param>
+            <param name="usable">
+            True if this constraint is usable.
+            </param>
+            <param name="iTermOffset">
+            Used internally - <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/>
+            should ignore.
+            </param>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraint.iColumn">
+            <summary>
+            Column on left-hand side of constraint.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraint.op">
+            <summary>
+            Constraint operator (<see cref="T:System.Data.SQLite.SQLiteIndexConstraintOp"/>).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraint.usable">
+            <summary>
+            True if this constraint is usable.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraint.iTermOffset">
+            <summary>
+            Used internally - <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/>
+            should ignore.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndexOrderBy">
+            <summary>
+            This class represents the native sqlite3_index_orderby structure from
+            the SQLite core library.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexOrderBy.#ctor(System.Data.SQLite.UnsafeNativeMethods.sqlite3_index_orderby)">
+            <summary>
+            Constructs an instance of this class using the specified native
+            sqlite3_index_orderby structure.
+            </summary>
+            <param name="orderBy">
+            The native sqlite3_index_orderby structure to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexOrderBy.#ctor(System.Int32,System.Byte)">
+            <summary>
+            Constructs an instance of this class using the specified field
+            values.
+            </summary>
+            <param name="iColumn">
+            Column number.
+            </param>
+            <param name="desc">
+            True for DESC.  False for ASC.
+            </param>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexOrderBy.iColumn">
+            <summary>
+            Column number.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexOrderBy.desc">
+            <summary>
+            True for DESC.  False for ASC.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndexConstraintUsage">
+            <summary>
+            This class represents the native sqlite3_index_constraint_usage
+            structure from the SQLite core library.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexConstraintUsage.#ctor(System.Data.SQLite.UnsafeNativeMethods.sqlite3_index_constraint_usage)">
+            <summary>
+            Constructs an instance of this class using the specified native
+            sqlite3_index_constraint_usage structure.
+            </summary>
+            <param name="constraintUsage">
+            The native sqlite3_index_constraint_usage structure to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexConstraintUsage.#ctor(System.Int32,System.Byte)">
+            <summary>
+            Constructs an instance of this class using the specified field
+            values.
+            </summary>
+            <param name="argvIndex">
+            If greater than 0, constraint is part of argv to xFilter.
+            </param>
+            <param name="omit">
+            Do not code a test for this constraint.
+            </param>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintUsage.argvIndex">
+            <summary>
+            If greater than 0, constraint is part of argv to xFilter.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintUsage.omit">
+            <summary>
+            Do not code a test for this constraint.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndexInputs">
+            <summary>
+            This class represents the various inputs provided by the SQLite core
+            library to the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexInputs.#ctor(System.Int32,System.Int32)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="nConstraint">
+            The number of <see cref="T:System.Data.SQLite.SQLiteIndexConstraint"/> instances to
+            pre-allocate space for.
+            </param>
+            <param name="nOrderBy">
+            The number of <see cref="T:System.Data.SQLite.SQLiteIndexOrderBy"/> instances to
+            pre-allocate space for.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexInputs.Constraints">
+            <summary>
+            An array of <see cref="T:System.Data.SQLite.SQLiteIndexConstraint"/> object instances,
+            each containing information supplied by the SQLite core library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexInputs.OrderBys">
+            <summary>
+            An array of <see cref="T:System.Data.SQLite.SQLiteIndexOrderBy"/> object instances,
+            each containing information supplied by the SQLite core library.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndexOutputs">
+            <summary>
+            This class represents the various outputs provided to the SQLite core
+            library by the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexOutputs.#ctor(System.Int32)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="nConstraint">
+            The number of <see cref="T:System.Data.SQLite.SQLiteIndexConstraintUsage"/> instances
+            to pre-allocate space for.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexOutputs.CanUseEstimatedRows">
+            <summary>
+            Determines if the native estimatedRows field can be used, based on
+            the available version of the SQLite core library.
+            </summary>
+            <returns>
+            Non-zero if the <see cref="P:System.Data.SQLite.SQLiteIndexOutputs.EstimatedRows"/> property is supported
+            by the SQLite core library.
+            </returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.ConstraintUsages">
+            <summary>
+            An array of <see cref="T:System.Data.SQLite.SQLiteIndexConstraintUsage"/> object
+            instances, each containing information to be supplied to the SQLite
+            core library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.IndexNumber">
+            <summary>
+            Number used to help identify the selected index.  This value will
+            later be provided to the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/>
+            method.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.IndexString">
+            <summary>
+            String used to help identify the selected index.  This value will
+            later be provided to the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/>
+            method.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.NeedToFreeIndexString">
+            <summary>
+            Non-zero if the index string must be freed by the SQLite core
+            library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.OrderByConsumed">
+            <summary>
+            True if output is already ordered.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.EstimatedCost">
+            <summary>
+            Estimated cost of using this index.  Using a null value here
+            indicates that a default estimated cost value should be used.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.EstimatedRows">
+            <summary>
+            Estimated number of rows returned.  Using a null value here
+            indicates that a default estimated rows value should be used.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndex">
+            <summary>
+            This class represents the various inputs and outputs used with the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndex.#ctor(System.Int32,System.Int32)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="nConstraint">
+            The number of <see cref="T:System.Data.SQLite.SQLiteIndexConstraint"/> (and
+            <see cref="T:System.Data.SQLite.SQLiteIndexConstraintUsage"/>) instances to
+            pre-allocate space for.
+            </param>
+            <param name="nOrderBy">
+            The number of <see cref="T:System.Data.SQLite.SQLiteIndexOrderBy"/> instances to
+            pre-allocate space for.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndex.FromIntPtr(System.IntPtr,System.Data.SQLite.SQLiteIndex@)">
+            <summary>
+            Converts a native pointer to a native sqlite3_index_info structure
+            into a new <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance.
+            </summary>
+            <param name="pIndex">
+            The native pointer to the native sqlite3_index_info structure to
+            convert.
+            </param>
+            <param name="index">
+            Upon success, this parameter will be modified to contain the newly
+            created <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndex.ToIntPtr(System.Data.SQLite.SQLiteIndex,System.IntPtr)">
+            <summary>
+            Populates the outputs of a pre-allocated native sqlite3_index_info
+            structure using an existing <see cref="T:System.Data.SQLite.SQLiteIndex"/> object
+            instance.
+            </summary>
+            <param name="index">
+            The existing <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance containing
+            the output data to use.
+            </param>
+            <param name="pIndex">
+            The native pointer to the pre-allocated native sqlite3_index_info
+            structure.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndex.Inputs">
+            <summary>
+            The <see cref="T:System.Data.SQLite.SQLiteIndexInputs"/> object instance containing
+            the inputs to the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/>
+            method.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndex.Outputs">
+            <summary>
+            The <see cref="T:System.Data.SQLite.SQLiteIndexOutputs"/> object instance containing
+            the outputs from the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/>
+            method.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteVirtualTable">
+            <summary>
+            This class represents a managed virtual table implementation.  It is
+            not sealed and should be used as the base class for any user-defined
+            virtual table classes implemented in managed code.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTable.ModuleNameIndex">
+            <summary>
+            The index within the array of strings provided to the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> and
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> methods containing the
+            name of the module implementing this virtual table.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTable.DatabaseNameIndex">
+            <summary>
+            The index within the array of strings provided to the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> and
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> methods containing the
+            name of the database containing this virtual table.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTable.TableNameIndex">
+            <summary>
+            The index within the array of strings provided to the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> and
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> methods containing the
+            name of the virtual table.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.#ctor(System.String[])">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="arguments">
+            The original array of strings provided to the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> and
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> methods.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.BestIndex(System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            This method should normally be used by the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method in order to
+            perform index selection based on the constraints provided by the
+            SQLite core library.
+            </summary>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance containing all the
+            data for the inputs and outputs relating to index selection.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.Rename(System.String)">
+            <summary>
+            Attempts to record the renaming of the virtual table associated
+            with this object instance.
+            </summary>
+            <param name="name">
+            The new name for the virtual table.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.Dispose">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.Data.SQLite.SQLiteVirtualTable.Dispose"/> method.  Zero if this method is being called
+            from the finalizer.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.Finalize">
+            <summary>
+            Finalizes this object instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTable.Arguments">
+            <summary>
+            The original array of strings provided to the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> and
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> methods.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTable.ModuleName">
+            <summary>
+            The name of the module implementing this virtual table.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTable.DatabaseName">
+            <summary>
+            The name of the database containing this virtual table.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTable.TableName">
+            <summary>
+            The name of the virtual table.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTable.Index">
+            <summary>
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance containing all the
+            data for the inputs and outputs relating to the most recent index
+            selection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTable.NativeHandle">
+            <summary>
+            Returns the underlying SQLite native handle associated with this
+            object instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteVirtualTableCursor">
+            <summary>
+            This class represents a managed virtual table cursor implementation.
+            It is not sealed and should be used as the base class for any
+            user-defined virtual table cursor classes implemented in managed code.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTableCursor.InvalidRowIndex">
+            <summary>
+            This value represents an invalid integer row sequence number.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTableCursor.rowIndex">
+            <summary>
+            The field holds the integer row sequence number for the current row
+            pointed to by this cursor object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.#ctor(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this object instance.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.#ctor">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.TryPersistValues(System.Data.SQLite.SQLiteValue[])">
+            <summary>
+            Attempts to persist the specified <see cref="T:System.Data.SQLite.SQLiteValue"/> object
+            instances in order to make them available after the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method returns.
+            </summary>
+            <param name="values">
+            The array of <see cref="T:System.Data.SQLite.SQLiteValue"/> object instances to be
+            persisted.
+            </param>
+            <returns>
+            The number of <see cref="T:System.Data.SQLite.SQLiteValue"/> object instances that were
+            successfully persisted.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.Filter(System.Int32,System.String,System.Data.SQLite.SQLiteValue[])">
+            <summary>
+            This method should normally be used by the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method in order to
+            perform filtering of the result rows and/or to record the filtering
+            criteria provided by the SQLite core library.
+            </summary>
+            <param name="indexNumber">
+            Number used to help identify the selected index.
+            </param>
+            <param name="indexString">
+            String used to help identify the selected index.
+            </param>
+            <param name="values">
+            The values corresponding to each column in the selected index.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.GetRowIndex">
+            <summary>
+            Determines the integer row sequence number for the current row.
+            </summary>
+            <returns>
+            The integer row sequence number for the current row -OR- zero if
+            it cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.NextRowIndex">
+            <summary>
+            Adjusts the integer row sequence number so that it refers to the
+            next row.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.Dispose">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.Data.SQLite.SQLiteVirtualTableCursor.Dispose"/> method.  Zero if this method is being called
+            from the finalizer.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.Finalize">
+            <summary>
+            Finalizes this object instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursor.Table">
+            <summary>
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this object instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursor.IndexNumber">
+            <summary>
+            Number used to help identify the selected index.  This value will
+            be set via the <see cref="M:System.Data.SQLite.SQLiteVirtualTableCursor.Filter(System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursor.IndexString">
+            <summary>
+            String used to help identify the selected index.  This value will
+            be set via the <see cref="M:System.Data.SQLite.SQLiteVirtualTableCursor.Filter(System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursor.Values">
+            <summary>
+            The values used to filter the rows returned via this cursor object
+            instance.  This value will be set via the <see cref="M:System.Data.SQLite.SQLiteVirtualTableCursor.Filter(System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/>
+            method.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursor.NativeHandle">
+            <summary>
+            Returns the underlying SQLite native handle associated with this
+            object instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.ISQLiteNativeModule">
+            <summary>
+            This interface represents a virtual table implementation written in
+            native code.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            <para>
+            This method is called to create a new instance of a virtual table
+            in response to a CREATE VIRTUAL TABLE statement. The db parameter
+            is a pointer to the SQLite database connection that is executing
+            the CREATE VIRTUAL TABLE statement. The pAux argument is the copy
+            of the client data pointer that was the fourth argument to the
+            sqlite3_create_module() or sqlite3_create_module_v2() call that
+            registered the virtual table module. The argv parameter is an
+            array of argc pointers to null terminated strings. The first
+            string, argv[0], is the name of the module being invoked. The
+            module name is the name provided as the second argument to
+            sqlite3_create_module() and as the argument to the USING clause of
+            the CREATE VIRTUAL TABLE statement that is running. The second,
+            argv[1], is the name of the database in which the new virtual table
+            is being created. The database name is "main" for the primary
+            database, or "temp" for TEMP database, or the name given at the
+            end of the ATTACH statement for attached databases. The third
+            element of the array, argv[2], is the name of the new virtual
+            table, as specified following the TABLE keyword in the CREATE
+            VIRTUAL TABLE statement. If present, the fourth and subsequent
+            strings in the argv[] array report the arguments to the module name
+            in the CREATE VIRTUAL TABLE statement.
+            </para>
+            <para>
+            The job of this method is to construct the new virtual table object
+            (an sqlite3_vtab object) and return a pointer to it in *ppVTab.
+            </para>
+            <para>
+            As part of the task of creating a new sqlite3_vtab structure, this
+            method must invoke sqlite3_declare_vtab() to tell the SQLite core
+            about the columns and datatypes in the virtual table. The
+            sqlite3_declare_vtab() API has the following prototype:
+            </para>
+            <para>
+            <code>
+            int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable)
+            </code>
+            </para>
+            <para>
+            The first argument to sqlite3_declare_vtab() must be the same
+            database connection pointer as the first parameter to this method.
+            The second argument to sqlite3_declare_vtab() must a
+            zero-terminated UTF-8 string that contains a well-formed CREATE
+            TABLE statement that defines the columns in the virtual table and
+            their data types. The name of the table in this CREATE TABLE
+            statement is ignored, as are all constraints. Only the column names
+            and datatypes matter. The CREATE TABLE statement string need not to
+            be held in persistent memory. The string can be deallocated and/or
+            reused as soon as the sqlite3_declare_vtab() routine returns.
+            </para>
+            </summary>
+            <param name="pDb">
+            The native database connection handle.
+            </param>
+            <param name="pAux">
+            The original native pointer value that was provided to the
+            sqlite3_create_module(), sqlite3_create_module_v2() or
+            sqlite3_create_disposable_module() functions.
+            </param>
+            <param name="argc">
+            The number of arguments from the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="argv">
+            The array of string arguments from the CREATE VIRTUAL TABLE
+            statement.
+            </param>
+            <param name="pVtab">
+            Upon success, this parameter must be modified to point to the newly
+            created native sqlite3_vtab derived structure.
+            </param>
+            <param name="pError">
+            Upon failure, this parameter must be modified to point to the error
+            message, with the underlying memory having been obtained from the
+            sqlite3_malloc() function.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            <para>
+            The xConnect method is very similar to xCreate. It has the same
+            parameters and constructs a new sqlite3_vtab structure just like
+            xCreate. And it must also call sqlite3_declare_vtab() like xCreate.
+            </para>
+            <para>
+            The difference is that xConnect is called to establish a new
+            connection to an existing virtual table whereas xCreate is called
+            to create a new virtual table from scratch.
+            </para>
+            <para>
+            The xCreate and xConnect methods are only different when the
+            virtual table has some kind of backing store that must be
+            initialized the first time the virtual table is created. The
+            xCreate method creates and initializes the backing store. The
+            xConnect method just connects to an existing backing store.
+            </para>
+            <para>
+            As an example, consider a virtual table implementation that
+            provides read-only access to existing comma-separated-value (CSV)
+            files on disk. There is no backing store that needs to be created
+            or initialized for such a virtual table (since the CSV files
+            already exist on disk) so the xCreate and xConnect methods will be
+            identical for that module.
+            </para>
+            <para>
+            Another example is a virtual table that implements a full-text
+            index. The xCreate method must create and initialize data
+            structures to hold the dictionary and posting lists for that index.
+            The xConnect method, on the other hand, only has to locate and use
+            an existing dictionary and posting lists that were created by a
+            prior xCreate call.
+            </para>
+            <para>
+            The xConnect method must return SQLITE_OK if it is successful in
+            creating the new virtual table, or SQLITE_ERROR if it is not
+            successful. If not successful, the sqlite3_vtab structure must not
+            be allocated. An error message may optionally be returned in *pzErr
+            if unsuccessful. Space to hold the error message string must be
+            allocated using an SQLite memory allocation function like
+            sqlite3_malloc() or sqlite3_mprintf() as the SQLite core will
+            attempt to free the space using sqlite3_free() after the error has
+            been reported up to the application.
+            </para>
+            <para>
+            The xConnect method is required for every virtual table
+            implementation, though the xCreate and xConnect pointers of the
+            sqlite3_module object may point to the same function the virtual
+            table does not need to initialize backing store.
+            </para>
+            </summary>
+            <param name="pDb">
+            The native database connection handle.
+            </param>
+            <param name="pAux">
+            The original native pointer value that was provided to the
+            sqlite3_create_module(), sqlite3_create_module_v2() or
+            sqlite3_create_disposable_module() functions.
+            </param>
+            <param name="argc">
+            The number of arguments from the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="argv">
+            The array of string arguments from the CREATE VIRTUAL TABLE
+            statement.
+            </param>
+            <param name="pVtab">
+            Upon success, this parameter must be modified to point to the newly
+            created native sqlite3_vtab derived structure.
+            </param>
+            <param name="pError">
+            Upon failure, this parameter must be modified to point to the error
+            message, with the underlying memory having been obtained from the
+            sqlite3_malloc() function.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)">
+            <summary>
+            <para>
+            SQLite uses the xBestIndex method of a virtual table module to
+            determine the best way to access the virtual table. The xBestIndex
+            method has a prototype like this:
+            </para>
+            <code>
+            int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*);
+            </code>
+            <para>
+            The SQLite core communicates with the xBestIndex method by filling
+            in certain fields of the sqlite3_index_info structure and passing a
+            pointer to that structure into xBestIndex as the second parameter.
+            The xBestIndex method fills out other fields of this structure
+            which forms the reply. The sqlite3_index_info structure looks like
+            this:
+            </para>
+            <code>
+             struct sqlite3_index_info {
+               /* Inputs */
+               const int nConstraint;   /* Number of entries in aConstraint */
+               const struct sqlite3_index_constraint {
+                  int iColumn;          /* Column on left-hand side of
+                                         * constraint */
+                  unsigned char op;     /* Constraint operator */
+                  unsigned char usable; /* True if this constraint is usable */
+                  int iTermOffset;      /* Used internally - xBestIndex should
+                                         * ignore */
+               } *const aConstraint;    /* Table of WHERE clause constraints */
+               const int nOrderBy;      /* Number of terms in the ORDER BY
+                                         * clause */
+               const struct sqlite3_index_orderby {
+                  int iColumn;          /* Column number */
+                  unsigned char desc;   /* True for DESC.  False for ASC. */
+               } *const aOrderBy;       /* The ORDER BY clause */
+               /* Outputs */
+               struct sqlite3_index_constraint_usage {
+                 int argvIndex;         /* if greater than zero, constraint is
+                                         * part of argv to xFilter */
+                 unsigned char omit;    /* Do not code a test for this
+                                         * constraint */
+               } *const aConstraintUsage;
+               int idxNum;              /* Number used to identify the index */
+               char *idxStr;            /* String, possibly obtained from
+                                         * sqlite3_malloc() */
+               int needToFreeIdxStr;    /* Free idxStr using sqlite3_free() if
+                                         * true */
+               int orderByConsumed;     /* True if output is already ordered */
+               double estimatedCost;    /* Estimated cost of using this index */
+             };
+            </code>
+            <para>
+            In addition, there are some defined constants:
+            </para>
+            <code>
+             #define SQLITE_INDEX_CONSTRAINT_EQ    2
+             #define SQLITE_INDEX_CONSTRAINT_GT    4
+             #define SQLITE_INDEX_CONSTRAINT_LE    8
+             #define SQLITE_INDEX_CONSTRAINT_LT    16
+             #define SQLITE_INDEX_CONSTRAINT_GE    32
+             #define SQLITE_INDEX_CONSTRAINT_MATCH 64
+            </code>
+            <para>
+            The SQLite core calls the xBestIndex method when it is compiling a
+            query that involves a virtual table. In other words, SQLite calls
+            this method when it is running sqlite3_prepare() or the equivalent.
+            By calling this method, the SQLite core is saying to the virtual
+            table that it needs to access some subset of the rows in the
+            virtual table and it wants to know the most efficient way to do
+            that access. The xBestIndex method replies with information that
+            the SQLite core can then use to conduct an efficient search of the
+            virtual table.
+            </para>
+            <para>
+            While compiling a single SQL query, the SQLite core might call
+            xBestIndex multiple times with different settings in
+            sqlite3_index_info. The SQLite core will then select the
+            combination that appears to give the best performance.
+            </para>
+            <para>
+            Before calling this method, the SQLite core initializes an instance
+            of the sqlite3_index_info structure with information about the
+            query that it is currently trying to process. This information
+            derives mainly from the WHERE clause and ORDER BY or GROUP BY
+            clauses of the query, but also from any ON or USING clauses if the
+            query is a join. The information that the SQLite core provides to
+            the xBestIndex method is held in the part of the structure that is
+            marked as "Inputs". The "Outputs" section is initialized to zero.
+            </para>
+            <para>
+            The information in the sqlite3_index_info structure is ephemeral
+            and may be overwritten or deallocated as soon as the xBestIndex
+            method returns. If the xBestIndex method needs to remember any part
+            of the sqlite3_index_info structure, it should make a copy. Care
+            must be take to store the copy in a place where it will be
+            deallocated, such as in the idxStr field with needToFreeIdxStr set
+            to 1.
+            </para>
+            <para>
+            Note that xBestIndex will always be called before xFilter, since
+            the idxNum and idxStr outputs from xBestIndex are required inputs
+            to xFilter. However, there is no guarantee that xFilter will be
+            called following a successful xBestIndex.
+            </para>
+            <para>
+            The xBestIndex method is required for every virtual table
+            implementation.
+            </para>
+            <para>
+            2.3.1 Inputs
+            </para>
+            <para>
+            The main thing that the SQLite core is trying to communicate to the
+            virtual table is the constraints that are available to limit the
+            number of rows that need to be searched. The aConstraint[] array
+            contains one entry for each constraint. There will be exactly
+            nConstraint entries in that array.
+            </para>
+            <para>
+            Each constraint will correspond to a term in the WHERE clause or in
+            a USING or ON clause that is of the form
+            </para>
+            <code>
+                column OP EXPR
+            </code>
+            <para>
+            Where "column" is a column in the virtual table, OP is an operator
+            like "=" or "&lt;", and EXPR is an arbitrary expression. So, for
+            example, if the WHERE clause contained a term like this:
+            </para>
+            <code>
+                     a = 5
+            </code>
+            <para>
+            Then one of the constraints would be on the "a" column with
+            operator "=" and an expression of "5". Constraints need not have a
+            literal representation of the WHERE clause. The query optimizer
+            might make transformations to the WHERE clause in order to extract
+            as many constraints as it can. So, for example, if the WHERE clause
+            contained something like this:
+            </para>
+            <code>
+                     x BETWEEN 10 AND 100 AND 999&gt;y
+            </code>
+            <para>
+            The query optimizer might translate this into three separate
+            constraints:
+            </para>
+            <code>
+                     x &gt;= 10
+                     x &lt;= 100
+                     y &lt; 999
+            </code>
+            <para>
+            For each constraint, the aConstraint[].iColumn field indicates
+            which column appears on the left-hand side of the constraint. The
+            first column of the virtual table is column 0. The rowid of the
+            virtual table is column -1. The aConstraint[].op field indicates
+            which operator is used. The SQLITE_INDEX_CONSTRAINT_* constants map
+            integer constants into operator values. Columns occur in the order
+            they were defined by the call to sqlite3_declare_vtab() in the
+            xCreate or xConnect method. Hidden columns are counted when
+            determining the column index.
+            </para>
+            <para>
+            The aConstraint[] array contains information about all constraints
+            that apply to the virtual table. But some of the constraints might
+            not be usable because of the way tables are ordered in a join. The
+            xBestIndex method must therefore only consider constraints that
+            have an aConstraint[].usable flag which is true.
+            </para>
+            <para>
+            In addition to WHERE clause constraints, the SQLite core also tells
+            the xBestIndex method about the ORDER BY clause. (In an aggregate
+            query, the SQLite core might put in GROUP BY clause information in
+            place of the ORDER BY clause information, but this fact should not
+            make any difference to the xBestIndex method.) If all terms of the
+            ORDER BY clause are columns in the virtual table, then nOrderBy
+            will be the number of terms in the ORDER BY clause and the
+            aOrderBy[] array will identify the column for each term in the
+            order by clause and whether or not that column is ASC or DESC.
+            </para>
+            <para>
+            2.3.2 Outputs
+            </para>
+            <para>
+            Given all of the information above, the job of the xBestIndex
+            method it to figure out the best way to search the virtual table.
+            </para>
+            <para>
+            The xBestIndex method fills the idxNum and idxStr fields with
+            information that communicates an indexing strategy to the xFilter
+            method. The information in idxNum and idxStr is arbitrary as far as
+            the SQLite core is concerned. The SQLite core just copies the
+            information through to the xFilter method. Any desired meaning can
+            be assigned to idxNum and idxStr as long as xBestIndex and xFilter
+            agree on what that meaning is.
+            </para>
+            <para>
+            The idxStr value may be a string obtained from an SQLite memory
+            allocation function such as sqlite3_mprintf(). If this is the case,
+            then the needToFreeIdxStr flag must be set to true so that the
+            SQLite core will know to call sqlite3_free() on that string when it
+            has finished with it, and thus avoid a memory leak.
+            </para>
+            <para>
+            If the virtual table will output rows in the order specified by the
+            ORDER BY clause, then the orderByConsumed flag may be set to true.
+            If the output is not automatically in the correct order then
+            orderByConsumed must be left in its default false setting. This
+            will indicate to the SQLite core that it will need to do a separate
+            sorting pass over the data after it comes out of the virtual table.
+            </para>
+            <para>
+            The estimatedCost field should be set to the estimated number of
+            disk access operations required to execute this query against the
+            virtual table. The SQLite core will often call xBestIndex multiple
+            times with different constraints, obtain multiple cost estimates,
+            then choose the query plan that gives the lowest estimate.
+            </para>
+            <para>
+            The aConstraintUsage[] array contains one element for each of the
+            nConstraint constraints in the inputs section of the
+            sqlite3_index_info structure. The aConstraintUsage[] array is used
+            by xBestIndex to tell the core how it is using the constraints.
+            </para>
+            <para>
+            The xBestIndex method may set aConstraintUsage[].argvIndex entries
+            to values greater than one. Exactly one entry should be set to 1,
+            another to 2, another to 3, and so forth up to as many or as few as
+            the xBestIndex method wants. The EXPR of the corresponding
+            constraints will then be passed in as the argv[] parameters to
+            xFilter.
+            </para>
+            <para>
+            For example, if the aConstraint[3].argvIndex is set to 1, then when
+            xFilter is called, the argv[0] passed to xFilter will have the EXPR
+            value of the aConstraint[3] constraint.
+            </para>
+            <para>
+            By default, the SQLite core double checks all constraints on each
+            row of the virtual table that it receives. If such a check is
+            redundant, the xBestFilter method can suppress that double-check by
+            setting aConstraintUsage[].omit.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="pIndex">
+            The native pointer to the sqlite3_index_info structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)">
+            <summary>
+            <para>
+            This method releases a connection to a virtual table. Only the
+            sqlite3_vtab object is destroyed. The virtual table is not
+            destroyed and any backing store associated with the virtual table
+            persists. This method undoes the work of xConnect.
+            </para>
+            <para>
+            This method is a destructor for a connection to the virtual table.
+            Contrast this method with xDestroy. The xDestroy is a destructor
+            for the entire virtual table.
+            </para>
+            <para>
+            The xDisconnect method is required for every virtual table
+            implementation, though it is acceptable for the xDisconnect and
+            xDestroy methods to be the same function if that makes sense for
+            the particular virtual table.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)">
+            <summary>
+            <para>
+            This method releases a connection to a virtual table, just like the
+            xDisconnect method, and it also destroys the underlying table
+            implementation. This method undoes the work of xCreate.
+            </para>
+            <para>
+            The xDisconnect method is called whenever a database connection
+            that uses a virtual table is closed. The xDestroy method is only
+            called when a DROP TABLE statement is executed against the virtual
+            table.
+            </para>
+            <para>
+            The xDestroy method is required for every virtual table
+            implementation, though it is acceptable for the xDisconnect and
+            xDestroy methods to be the same function if that makes sense for
+            the particular virtual table.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)">
+            <summary>
+            <para>
+            The xOpen method creates a new cursor used for accessing (read
+            and/or writing) a virtual table. A successful invocation of this
+            method will allocate the memory for the sqlite3_vtab_cursor (or a
+            subclass), initialize the new object, and make *ppCursor point to
+            the new object. The successful call then returns SQLITE_OK.
+            </para>
+            <para>
+            For every successful call to this method, the SQLite core will
+            later invoke the xClose method to destroy the allocated cursor.
+            </para>
+            <para>
+            The xOpen method need not initialize the pVtab field of the
+            sqlite3_vtab_cursor structure. The SQLite core will take care of
+            that chore automatically.
+            </para>
+            <para>
+            A virtual table implementation must be able to support an arbitrary
+            number of simultaneously open cursors.
+            </para>
+            <para>
+            When initially opened, the cursor is in an undefined state. The
+            SQLite core will invoke the xFilter method on the cursor prior to
+            any attempt to position or read from the cursor.
+            </para>
+            <para>
+            The xOpen method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="pCursor">
+            Upon success, this parameter must be modified to point to the newly
+            created native sqlite3_vtab_cursor derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)">
+            <summary>
+            <para>
+            The xClose method closes a cursor previously opened by xOpen. The
+            SQLite core will always call xClose once for each cursor opened
+            using xOpen.
+            </para>
+            <para>
+            This method must release all resources allocated by the
+            corresponding xOpen call. The routine will not be called again even
+            if it returns an error. The SQLite core will not use the
+            sqlite3_vtab_cursor again after it has been closed.
+            </para>
+            <para>
+            The xClose method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            <para>
+            This method begins a search of a virtual table. The first argument
+            is a cursor opened by xOpen. The next two argument define a
+            particular search index previously chosen by xBestIndex. The
+            specific meanings of idxNum and idxStr are unimportant as long as
+            xFilter and xBestIndex agree on what that meaning is.
+            </para>
+            <para>
+            The xBestIndex function may have requested the values of certain
+            expressions using the aConstraintUsage[].argvIndex values of the
+            sqlite3_index_info structure. Those values are passed to xFilter
+            using the argc and argv parameters.
+            </para>
+            <para>
+            If the virtual table contains one or more rows that match the
+            search criteria, then the cursor must be left point at the first
+            row. Subsequent calls to xEof must return false (zero). If there
+            are no rows match, then the cursor must be left in a state that
+            will cause the xEof to return true (non-zero). The SQLite engine
+            will use the xColumn and xRowid methods to access that row content.
+            The xNext method will be used to advance to the next row.
+            </para>
+            <para>
+            This method must return SQLITE_OK if successful, or an sqlite error
+            code if an error occurs.
+            </para>
+            <para>
+            The xFilter method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <param name="idxNum">
+            Number used to help identify the selected index.
+            </param>
+            <param name="idxStr">
+            The native pointer to the UTF-8 encoded string containing the
+            string used to help identify the selected index.
+            </param>
+            <param name="argc">
+            The number of native pointers to sqlite3_value structures specified
+            in <paramref name="argv" />.
+            </param>
+            <param name="argv">
+            An array of native pointers to sqlite3_value structures containing
+            filtering criteria for the selected index.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)">
+            <summary>
+            <para>
+            The xNext method advances a virtual table cursor to the next row of
+            a result set initiated by xFilter. If the cursor is already
+            pointing at the last row when this routine is called, then the
+            cursor no longer points to valid data and a subsequent call to the
+            xEof method must return true (non-zero). If the cursor is
+            successfully advanced to another row of content, then subsequent
+            calls to xEof must return false (zero).
+            </para>
+            <para>
+            This method must return SQLITE_OK if successful, or an sqlite error
+            code if an error occurs.
+            </para>
+            <para>
+            The xNext method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)">
+            <summary>
+            <para>
+            The xEof method must return false (zero) if the specified cursor
+            currently points to a valid row of data, or true (non-zero)
+            otherwise. This method is called by the SQL engine immediately
+            after each xFilter and xNext invocation.
+            </para>
+            <para>
+            The xEof method is required for every virtual table implementation.
+            </para>
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <returns>
+            Non-zero if no more rows are available; zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)">
+            <summary>
+            <para>
+            The SQLite core invokes this method in order to find the value for
+            the N-th column of the current row. N is zero-based so the first
+            column is numbered 0. The xColumn method may return its result back
+            to SQLite using one of the following interface:
+            </para>
+            <code>
+                sqlite3_result_blob()
+                sqlite3_result_double()
+                sqlite3_result_int()
+                sqlite3_result_int64()
+                sqlite3_result_null()
+                sqlite3_result_text()
+                sqlite3_result_text16()
+                sqlite3_result_text16le()
+                sqlite3_result_text16be()
+                sqlite3_result_zeroblob()
+            </code>
+            <para>
+            If the xColumn method implementation calls none of the functions
+            above, then the value of the column defaults to an SQL NULL.
+            </para>
+            <para>
+            To raise an error, the xColumn method should use one of the
+            result_text() methods to set the error message text, then return an
+            appropriate error code. The xColumn method must return SQLITE_OK on
+            success.
+            </para>
+            <para>
+            The xColumn method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <param name="pContext">
+            The native pointer to the sqlite3_context structure to be used
+            for returning the specified column value to the SQLite core
+            library.
+            </param>
+            <param name="index">
+            The zero-based index corresponding to the column containing the
+            value to be returned.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)">
+            <summary>
+            <para>
+            A successful invocation of this method will cause *pRowid to be
+            filled with the rowid of row that the virtual table cursor pCur is
+            currently pointing at. This method returns SQLITE_OK on success. It
+            returns an appropriate error code on failure.
+            </para>
+            <para>
+            The xRowid method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <param name="rowId">
+            Upon success, this parameter must be modified to contain the unique
+            integer row identifier for the current row for the specified cursor.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)">
+            <summary>
+            <para>
+            All changes to a virtual table are made using the xUpdate method.
+            This one method can be used to insert, delete, or update.
+            </para>
+            <para>
+            The argc parameter specifies the number of entries in the argv
+            array. The value of argc will be 1 for a pure delete operation or
+            N+2 for an insert or replace or update where N is the number of
+            columns in the table. In the previous sentence, N includes any
+            hidden columns.
+            </para>
+            <para>
+            Every argv entry will have a non-NULL value in C but may contain
+            the SQL value NULL. In other words, it is always true that
+            argv[i]!=0 for i between 0 and argc-1. However, it might be the
+            case that sqlite3_value_type(argv[i])==SQLITE_NULL.
+            </para>
+            <para>
+            The argv[0] parameter is the rowid of a row in the virtual table
+            to be deleted. If argv[0] is an SQL NULL, then no deletion occurs.
+            </para>
+            <para>
+            The argv[1] parameter is the rowid of a new row to be inserted into
+            the virtual table. If argv[1] is an SQL NULL, then the
+            implementation must choose a rowid for the newly inserted row.
+            Subsequent argv[] entries contain values of the columns of the
+            virtual table, in the order that the columns were declared. The
+            number of columns will match the table declaration that the
+            xConnect or xCreate method made using the sqlite3_declare_vtab()
+            call. All hidden columns are included.
+            </para>
+            <para>
+            When doing an insert without a rowid (argc>1, argv[1] is an SQL
+            NULL), the implementation must set *pRowid to the rowid of the
+            newly inserted row; this will become the value returned by the
+            sqlite3_last_insert_rowid() function. Setting this value in all the
+            other cases is a harmless no-op; the SQLite engine ignores the
+            *pRowid return value if argc==1 or argv[1] is not an SQL NULL.
+            </para>
+            <para>
+            Each call to xUpdate will fall into one of cases shown below. Note
+            that references to argv[i] mean the SQL value held within the
+            argv[i] object, not the argv[i] object itself.
+            </para>
+            <code>
+                argc = 1
+            </code>
+            <para>
+                    The single row with rowid equal to argv[0] is deleted. No
+                    insert occurs.
+            </para>
+            <code>
+                argc > 1
+                argv[0] = NULL
+            </code>
+            <para>
+                    A new row is inserted with a rowid argv[1] and column
+                    values in argv[2] and following. If argv[1] is an SQL NULL,
+                    the a new unique rowid is generated automatically.
+            </para>
+            <code>
+                argc > 1
+                argv[0] ? NULL
+                argv[0] = argv[1]
+            </code>
+            <para>
+                    The row with rowid argv[0] is updated with new values in
+                    argv[2] and following parameters.
+            </para>
+            <code>
+                argc > 1
+                argv[0] ? NULL
+                argv[0] ? argv[1]
+            </code>
+            <para>
+                    The row with rowid argv[0] is updated with rowid argv[1]
+                    and new values in argv[2] and following parameters. This
+                    will occur when an SQL statement updates a rowid, as in
+                    the statement:
+            </para>
+            <code>
+                        UPDATE table SET rowid=rowid+1 WHERE ...;
+            </code>
+            <para>
+            The xUpdate method must return SQLITE_OK if and only if it is
+            successful. If a failure occurs, the xUpdate must return an
+            appropriate error code. On a failure, the pVTab->zErrMsg element
+            may optionally be replaced with error message text stored in memory
+            allocated from SQLite using functions such as sqlite3_mprintf() or
+            sqlite3_malloc().
+            </para>
+            <para>
+            If the xUpdate method violates some constraint of the virtual table
+            (including, but not limited to, attempting to store a value of the
+            wrong datatype, attempting to store a value that is too large or
+            too small, or attempting to change a read-only value) then the
+            xUpdate must fail with an appropriate error code.
+            </para>
+            <para>
+            There might be one or more sqlite3_vtab_cursor objects open and in
+            use on the virtual table instance and perhaps even on the row of
+            the virtual table when the xUpdate method is invoked. The
+            implementation of xUpdate must be prepared for attempts to delete
+            or modify rows of the table out from other existing cursors. If the
+            virtual table cannot accommodate such changes, the xUpdate method
+            must return an error code.
+            </para>
+            <para>
+            The xUpdate method is optional. If the xUpdate pointer in the
+            sqlite3_module for a virtual table is a NULL pointer, then the
+            virtual table is read-only.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="argc">
+            The number of new or modified column values contained in
+            <paramref name="argv" />.
+            </param>
+            <param name="argv">
+            The array of native pointers to sqlite3_value structures containing
+            the new or modified column values, if any.
+            </param>
+            <param name="rowId">
+            Upon success, this parameter must be modified to contain the unique
+            integer row identifier for the row that was inserted, if any.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)">
+            <summary>
+            <para>
+            This method begins a transaction on a virtual table. This is method
+            is optional. The xBegin pointer of sqlite3_module may be NULL.
+            </para>
+            <para>
+            This method is always followed by one call to either the xCommit or
+            xRollback method. Virtual table transactions do not nest, so the
+            xBegin method will not be invoked more than once on a single
+            virtual table without an intervening call to either xCommit or
+            xRollback. Multiple calls to other methods can and likely will
+            occur in between the xBegin and the corresponding xCommit or
+            xRollback.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)">
+            <summary>
+            <para>
+            This method signals the start of a two-phase commit on a virtual
+            table. This is method is optional. The xSync pointer of
+            sqlite3_module may be NULL.
+            </para>
+            <para>
+            This method is only invoked after call to the xBegin method and
+            prior to an xCommit or xRollback. In order to implement two-phase
+            commit, the xSync method on all virtual tables is invoked prior to
+            invoking the xCommit method on any virtual table. If any of the
+            xSync methods fail, the entire transaction is rolled back.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)">
+            <summary>
+            <para>
+            This method causes a virtual table transaction to commit. This is
+            method is optional. The xCommit pointer of sqlite3_module may be
+            NULL.
+            </para>
+            <para>
+            A call to this method always follows a prior call to xBegin and
+            xSync.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)">
+            <summary>
+            <para>
+            This method causes a virtual table transaction to rollback. This is
+            method is optional. The xRollback pointer of sqlite3_module may be
+            NULL.
+            </para>
+            <para>
+            A call to this method always follows a prior call to xBegin.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)">
+            <summary>
+            <para>
+            This method provides notification that the virtual table
+            implementation that the virtual table will be given a new name. If
+            this method returns SQLITE_OK then SQLite renames the table. If
+            this method returns an error code then the renaming is prevented.
+            </para>
+            <para>
+            The xRename method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="nArg">
+            The number of arguments to the function being sought.
+            </param>
+            <param name="zName">
+            The name of the function being sought.
+            </param>
+            <param name="callback">
+            Upon success, this parameter must be modified to contain the
+            delegate responsible for implementing the specified function.
+            </param>
+            <param name="pClientData">
+            Upon success, this parameter must be modified to contain the
+            native user-data pointer associated with
+            <paramref name="callback" />.
+            </param>
+            <returns>
+            Non-zero if the specified function was found; zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)">
+            <summary>
+            <para>
+            This method provides notification that the virtual table
+            implementation that the virtual table will be given a new name. If
+            this method returns SQLITE_OK then SQLite renames the table. If
+            this method returns an error code then the renaming is prevented.
+            </para>
+            <para>
+            The xRename method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="zNew">
+            The native pointer to the UTF-8 encoded string containing the new
+            name for the virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)">
+            <summary>
+            <para>
+            These methods provide the virtual table implementation an
+            opportunity to implement nested transactions. They are always
+            optional and will only be called in SQLite version 3.7.7 and later.
+            </para>
+            <para>
+            When xSavepoint(X,N) is invoked, that is a signal to the virtual
+            table X that it should save its current state as savepoint N. A
+            subsequent call to xRollbackTo(X,R) means that the state of the
+            virtual table should return to what it was when xSavepoint(X,R) was
+            last called. The call to xRollbackTo(X,R) will invalidate all
+            savepoints with N>R; none of the invalided savepoints will be
+            rolled back or released without first being reinitialized by a call
+            to xSavepoint(). A call to xRelease(X,M) invalidates all savepoints
+            where N>=M.
+            </para>
+            <para>
+            None of the xSavepoint(), xRelease(), or xRollbackTo() methods will
+            ever be called except in between calls to xBegin() and either
+            xCommit() or xRollback().
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="iSavepoint">
+            This is an integer identifier under which the the current state of
+            the virtual table should be saved.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)">
+            <summary>
+            <para>
+            These methods provide the virtual table implementation an
+            opportunity to implement nested transactions. They are always
+            optional and will only be called in SQLite version 3.7.7 and later.
+            </para>
+            <para>
+            When xSavepoint(X,N) is invoked, that is a signal to the virtual
+            table X that it should save its current state as savepoint N. A
+            subsequent call to xRollbackTo(X,R) means that the state of the
+            virtual table should return to what it was when xSavepoint(X,R) was
+            last called. The call to xRollbackTo(X,R) will invalidate all
+            savepoints with N>R; none of the invalided savepoints will be
+            rolled back or released without first being reinitialized by a call
+            to xSavepoint(). A call to xRelease(X,M) invalidates all savepoints
+            where N>=M.
+            </para>
+            <para>
+            None of the xSavepoint(), xRelease(), or xRollbackTo() methods will
+            ever be called except in between calls to xBegin() and either
+            xCommit() or xRollback().
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="iSavepoint">
+            This is an integer used to indicate that any saved states with an
+            identifier greater than or equal to this should be deleted by the
+            virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)">
+            <summary>
+            <para>
+            These methods provide the virtual table implementation an
+            opportunity to implement nested transactions. They are always
+            optional and will only be called in SQLite version 3.7.7 and later.
+            </para>
+            <para>
+            When xSavepoint(X,N) is invoked, that is a signal to the virtual
+            table X that it should save its current state as savepoint N. A
+            subsequent call to xRollbackTo(X,R) means that the state of the
+            virtual table should return to what it was when xSavepoint(X,R) was
+            last called. The call to xRollbackTo(X,R) will invalidate all
+            savepoints with N>R; none of the invalided savepoints will be
+            rolled back or released without first being reinitialized by a call
+            to xSavepoint(). A call to xRelease(X,M) invalidates all savepoints
+            where N>=M.
+            </para>
+            <para>
+            None of the xSavepoint(), xRelease(), or xRollbackTo() methods will
+            ever be called except in between calls to xBegin() and either
+            xCommit() or xRollback().
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="iSavepoint">
+            This is an integer identifier used to specify a specific saved
+            state for the virtual table for it to restore itself back to, which
+            should also have the effect of deleting all saved states with an
+            integer identifier greater than this one.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="T:System.Data.SQLite.ISQLiteManagedModule">
+            <summary>
+            This interface represents a virtual table implementation written in
+            managed code.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="connection">
+            The <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="pClientData">
+            The native user-data pointer associated with this module, as it was
+            provided to the SQLite core library when the native module instance
+            was created.
+            </param>
+            <param name="arguments">
+            The module name, database name, virtual table name, and all other
+            arguments passed to the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="table">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="error">
+            Upon failure, this parameter must be modified to contain an error
+            message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="connection">
+            The <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="pClientData">
+            The native user-data pointer associated with this module, as it was
+            provided to the SQLite core library when the native module instance
+            was created.
+            </param>
+            <param name="arguments">
+            The module name, database name, virtual table name, and all other
+            arguments passed to the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="table">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="error">
+            Upon failure, this parameter must be modified to contain an error
+            message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance containing all the
+            data for the inputs and outputs relating to index selection.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="cursor">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance associated
+            with the newly opened virtual table cursor.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="indexNumber">
+            Number used to help identify the selected index.
+            </param>
+            <param name="indexString">
+            String used to help identify the selected index.
+            </param>
+            <param name="values">
+            The values corresponding to each column in the selected index.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <returns>
+            Non-zero if no more rows are available; zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="context">
+            The <see cref="T:System.Data.SQLite.SQLiteContext"/> object instance to be used for
+            returning the specified column value to the SQLite core library.
+            </param>
+            <param name="index">
+            The zero-based index corresponding to the column containing the
+            value to be returned.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="rowId">
+            Upon success, this parameter must be modified to contain the unique
+            integer row identifier for the current row for the specified cursor.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="values">
+            The array of <see cref="T:System.Data.SQLite.SQLiteValue"/> object instances containing
+            the new or modified column values, if any.
+            </param>
+            <param name="rowId">
+            Upon success, this parameter must be modified to contain the unique
+            integer row identifier for the row that was inserted, if any.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Begin(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Sync(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Commit(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Rollback(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="argumentCount">
+            The number of arguments to the function being sought.
+            </param>
+            <param name="name">
+            The name of the function being sought.
+            </param>
+            <param name="function">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance responsible for
+            implementing the specified function.
+            </param>
+            <param name="pClientData">
+            Upon success, this parameter must be modified to contain the
+            native user-data pointer associated with
+            <paramref name="function"/>.
+            </param>
+            <returns>
+            Non-zero if the specified function was found; zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="newName">
+            The new name for the virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="savepoint">
+            This is an integer identifier under which the the current state of
+            the virtual table should be saved.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="savepoint">
+            This is an integer used to indicate that any saved states with an
+            identifier greater than or equal to this should be deleted by the
+            virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="savepoint">
+            This is an integer identifier used to specify a specific saved
+            state for the virtual table for it to restore itself back to, which
+            should also have the effect of deleting all saved states with an
+            integer identifier greater than this one.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="P:System.Data.SQLite.ISQLiteManagedModule.Declared">
+            <summary>
+            Returns non-zero if the schema for the virtual table has been
+            declared.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.ISQLiteManagedModule.Name">
+            <summary>
+            Returns the name of the module as it was registered with the SQLite
+            core library.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteMemory">
+            <summary>
+            This class contains static methods that are used to allocate,
+            manipulate, and free native memory provided by the SQLite core library.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMemory.Allocate(System.Int32)">
+            <summary>
+            Allocates at least the specified number of bytes of native memory
+            via the SQLite core library sqlite3_malloc() function and returns
+            the resulting native pointer.
+            </summary>
+            <param name="size">
+            The number of bytes to allocate.
+            </param>
+            <returns>
+            The native pointer that points to a block of memory of at least the
+            specified size -OR- <see cref="F:System.IntPtr.Zero"/> if the memory could
+            not be allocated.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMemory.Size(System.IntPtr)">
+            <summary>
+            Gets and returns the actual size of the specified memory block that
+            was previously obtained from the <see cref="M:System.Data.SQLite.SQLiteMemory.Allocate(System.Int32)"/> method.
+            </summary>
+            <param name="pMemory">
+            The native pointer to the memory block previously obtained from the
+            <see cref="M:System.Data.SQLite.SQLiteMemory.Allocate(System.Int32)"/> method.
+            </param>
+            <returns>
+            The actual size, in bytes, of the memory block specified via the
+            native pointer.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMemory.Free(System.IntPtr)">
+            <summary>
+            Frees a memory block previously obtained from the
+            <see cref="M:System.Data.SQLite.SQLiteMemory.Allocate(System.Int32)"/> method.
+            </summary>
+            <param name="pMemory">
+            The native pointer to the memory block previously obtained from the
+            <see cref="M:System.Data.SQLite.SQLiteMemory.Allocate(System.Int32)"/> method.
+            </param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteString">
+            <summary>
+            This class contains static methods that are used to deal with native
+            UTF-8 string pointers to be used with the SQLite core library.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteString.ThirtyBits">
+            <summary>
+            This is the maximum possible length for the native UTF-8 encoded
+            strings used with the SQLite core library.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteString.Utf8Encoding">
+            <summary>
+            This is the <see cref="T:System.Text.Encoding"/> object instance used to handle
+            conversions from/to UTF-8.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.GetUtf8BytesFromString(System.String)">
+            <summary>
+            Converts the specified managed string into the UTF-8 encoding and
+            returns the array of bytes containing its representation in that
+            encoding.
+            </summary>
+            <param name="value">
+            The managed string to convert.
+            </param>
+            <returns>
+            The array of bytes containing the representation of the managed
+            string in the UTF-8 encoding or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.GetStringFromUtf8Bytes(System.Byte[])">
+            <summary>
+            Converts the specified array of bytes representing a string in the
+            UTF-8 encoding and returns a managed string.
+            </summary>
+            <param name="bytes">
+            The array of bytes to convert.
+            </param>
+            <returns>
+            The managed string or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.ProbeForUtf8ByteLength(System.IntPtr,System.Int32)">
+            <summary>
+            Probes a native pointer to a string in the UTF-8 encoding for its
+            terminating NUL character, within the specified length limit.
+            </summary>
+            <param name="pValue">
+            The native NUL-terminated string pointer.
+            </param>
+            <param name="limit">
+            The maximum length of the native string, in bytes.
+            </param>
+            <returns>
+            The length of the native string, in bytes -OR- zero if the length
+            could not be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.StringFromUtf8IntPtr(System.IntPtr)">
+            <summary>
+            Converts the specified native NUL-terminated UTF-8 string pointer
+            into a managed string.
+            </summary>
+            <param name="pValue">
+            The native NUL-terminated UTF-8 string pointer.
+            </param>
+            <returns>
+            The managed string or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.StringFromUtf8IntPtr(System.IntPtr,System.Int32)">
+            <summary>
+            Converts the specified native UTF-8 string pointer of the specified
+            length into a managed string.
+            </summary>
+            <param name="pValue">
+            The native UTF-8 string pointer.
+            </param>
+            <param name="length">
+            The length of the native string, in bytes.
+            </param>
+            <returns>
+            The managed string or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.Utf8IntPtrFromString(System.String)">
+            <summary>
+            Converts the specified managed string into a native NUL-terminated
+            UTF-8 string pointer using memory obtained from the SQLite core
+            library.
+            </summary>
+            <param name="value">
+            The managed string to convert.
+            </param>
+            <returns>
+            The native NUL-terminated UTF-8 string pointer or
+            <see cref="F:System.IntPtr.Zero"/> upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.StringArrayFromUtf8SizeAndIntPtr(System.Int32,System.IntPtr)">
+            <summary>
+            Converts a logical array of native NUL-terminated UTF-8 string
+            pointers into an array of managed strings.
+            </summary>
+            <param name="argc">
+            The number of elements in the logical array of native
+            NUL-terminated UTF-8 string pointers.
+            </param>
+            <param name="argv">
+            The native pointer to the logical array of native NUL-terminated
+            UTF-8 string pointers to convert.
+            </param>
+            <returns>
+            The array of managed strings or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.Utf8IntPtrArrayFromStringArray(System.String[])">
+            <summary>
+            Converts an array of managed strings into an array of native
+            NUL-terminated UTF-8 string pointers.
+            </summary>
+            <param name="values">
+            The array of managed strings to convert.
+            </param>
+            <returns>
+            The array of native NUL-terminated UTF-8 string pointers or null
+            upon failure.
+            </returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteBytes">
+            <summary>
+            This class contains static methods that are used to deal with native
+            pointers to memory blocks that logically contain arrays of bytes to be
+            used with the SQLite core library.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBytes.FromIntPtr(System.IntPtr,System.Int32)">
+            <summary>
+            Converts a native pointer to a logical array of bytes of the
+            specified length into a managed byte array.
+            </summary>
+            <param name="pValue">
+            The native pointer to the logical array of bytes to convert.
+            </param>
+            <param name="length">
+            The length, in bytes, of the logical array of bytes to convert.
+            </param>
+            <returns>
+            The managed byte array or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBytes.ToIntPtr(System.Byte[])">
+            <summary>
+            Converts a managed byte array into a native pointer to a logical
+            array of bytes.
+            </summary>
+            <param name="value">
+            The managed byte array to convert.
+            </param>
+            <returns>
+            The native pointer to a logical byte array or null upon failure.
+            </returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteMarshal">
+            <summary>
+            This class contains static methods that are used to perform several
+            low-level data marshalling tasks between native and managed code.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.IntPtrForOffset(System.IntPtr,System.Int32)">
+            <summary>
+            Returns a new <see cref="T:System.IntPtr"/> object instance based on the
+            specified <see cref="T:System.IntPtr"/> object instance and an integer
+            offset.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location that the new
+            <see cref="T:System.IntPtr"/> object instance should point to.
+            </param>
+            <returns>
+            The new <see cref="T:System.IntPtr"/> object instance.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.RoundUp(System.Int32,System.Int32)">
+            <summary>
+            Rounds up an integer size to the next multiple of the alignment.
+            </summary>
+            <param name="size">
+            The size, in bytes, to be rounded up.
+            </param>
+            <param name="alignment">
+            The required alignment for the return value.
+            </param>
+            <returns>
+            The size, in bytes, rounded up to the next multiple of the
+            alignment.  This value may end up being the same as the original
+            size.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.NextOffsetOf(System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Determines the offset, in bytes, of the next structure member.
+            </summary>
+            <param name="offset">
+            The offset, in bytes, of the current structure member.
+            </param>
+            <param name="size">
+            The size, in bytes, of the current structure member.
+            </param>
+            <param name="alignment">
+            The alignment, in bytes, of the next structure member.
+            </param>
+            <returns>
+            The offset, in bytes, of the next structure member.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.ReadInt32(System.IntPtr,System.Int32)">
+            <summary>
+            Reads a <see cref="T:System.Int32"/> value from the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.Int32"/> value to be read is located.
+            </param>
+            <returns>
+            The <see cref="T:System.Int32"/> value at the specified memory location.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.ReadDouble(System.IntPtr,System.Int32)">
+            <summary>
+            Reads a <see cref="T:System.Double"/> value from the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.Double"/> to be read is located.
+            </param>
+            <returns>
+            The <see cref="T:System.Double"/> value at the specified memory location.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.ReadIntPtr(System.IntPtr,System.Int32)">
+            <summary>
+            Reads an <see cref="T:System.IntPtr"/> value from the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.IntPtr"/> value to be read is located.
+            </param>
+            <returns>
+            The <see cref="T:System.IntPtr"/> value at the specified memory location.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.WriteInt32(System.IntPtr,System.Int32,System.Int32)">
+            <summary>
+            Writes an <see cref="T:System.Int32"/> value to the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.Int32"/> value to be written is located.
+            </param>
+            <param name="value">
+            The <see cref="T:System.Int32"/> value to write.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.WriteInt64(System.IntPtr,System.Int32,System.Int64)">
+            <summary>
+            Writes an <see cref="T:System.Int64"/> value to the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.Int64"/> value to be written is located.
+            </param>
+            <param name="value">
+            The <see cref="T:System.Int64"/> value to write.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.WriteDouble(System.IntPtr,System.Int32,System.Double)">
+            <summary>
+            Writes a <see cref="T:System.Double"/> value to the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.Double"/> value to be written is located.
+            </param>
+            <param name="value">
+            The <see cref="T:System.Double"/> value to write.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.WriteIntPtr(System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            Writes a <see cref="T:System.IntPtr"/> value to the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.IntPtr"/> value to be written is located.
+            </param>
+            <param name="value">
+            The <see cref="T:System.IntPtr"/> value to write.
+            </param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteModule">
+            <summary>
+            This class represents a managed virtual table module implementation.
+            It is not sealed and must be used as the base class for any
+            user-defined virtual table module classes implemented in managed code.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.DefaultModuleVersion">
+            <summary>
+            The default version of the native sqlite3_module structure in use.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.nativeModule">
+            <summary>
+            This field is used to store the native sqlite3_module structure
+            associated with this object instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.destroyModule">
+            <summary>
+            This field is used to store the destructor delegate to be passed to
+            the SQLite core library via the sqlite3_create_disposable_module()
+            function.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.disposableModule">
+            <summary>
+            This field is used to store a pointer to the native sqlite3_module
+            structure returned by the sqlite3_create_disposable_module
+            function.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.tables">
+            <summary>
+            This field is used to store the virtual table instances associated
+            with this module.  The native pointer to the sqlite3_vtab derived
+            structure is used to key into this collection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.cursors">
+            <summary>
+            This field is used to store the virtual table cursor instances
+            associated with this module.  The native pointer to the
+            sqlite3_vtab_cursor derived structure is used to key into this
+            collection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.functions">
+            <summary>
+            This field is used to store the virtual table function instances
+            associated with this module.  The case-insensitive function name
+            and the number of arguments (with -1 meaning "any") are used to
+            construct the string that is used to key into this collection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.#ctor(System.String)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="name">
+            The name of the module.  This parameter cannot be null.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CreateDisposableModule(System.IntPtr)">
+            <summary>
+            Calls the native SQLite core library in order to create a new
+            disposable module containing the implementation of a virtual table.
+            </summary>
+            <param name="pDb">
+            The native database connection pointer to use.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xDestroyModule(System.IntPtr)">
+            <summary>
+            This method is called by the SQLite core library when the native
+            module associated with this object instance is being destroyed due
+            to its parent connection being closed.  It may also be called by
+            the "vtshim" module if/when the sqlite3_dispose_module() function
+            is called.
+            </summary>
+            <param name="pClientData">
+            The native user-data pointer associated with this module, as it was
+            provided to the SQLite core library when the native module instance
+            was created.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.AllocateNativeModule">
+            <summary>
+            Creates and returns the native sqlite_module structure using the
+            configured (or default) <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/>
+            interface implementation.
+            </summary>
+            <returns>
+            The native sqlite_module structure using the configured (or
+            default) <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface
+            implementation.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.AllocateNativeModule(System.Data.SQLite.ISQLiteNativeModule)">
+            <summary>
+            Creates and returns the native sqlite_module structure using the
+            specified <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface
+            implementation.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface implementation to
+            use.
+            </param>
+            <returns>
+            The native sqlite_module structure using the specified
+            <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface implementation.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CopyNativeModule(System.Data.SQLite.UnsafeNativeMethods.sqlite3_module)">
+            <summary>
+            Creates a copy of the specified
+            <see cref="T:System.Data.SQLite.UnsafeNativeMethods.sqlite3_module"/> object instance,
+            using default implementations for the contained delegates when
+            necessary.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.UnsafeNativeMethods.sqlite3_module"/> object
+            instance to copy.
+            </param>
+            <returns>
+            The new <see cref="T:System.Data.SQLite.UnsafeNativeMethods.sqlite3_module"/> object
+            instance.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CreateOrConnect(System.Boolean,System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            Calls one of the virtual table initialization methods.
+            </summary>
+            <param name="create">
+            Non-zero to call the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/>
+            method; otherwise, the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/>
+            method will be called.
+            </param>
+            <param name="pDb">
+            The native database connection handle.
+            </param>
+            <param name="pAux">
+            The original native pointer value that was provided to the
+            sqlite3_create_module(), sqlite3_create_module_v2() or
+            sqlite3_create_disposable_module() functions.
+            </param>
+            <param name="argc">
+            The number of arguments from the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="argv">
+            The array of string arguments from the CREATE VIRTUAL TABLE
+            statement.
+            </param>
+            <param name="pVtab">
+            Upon success, this parameter must be modified to point to the newly
+            created native sqlite3_vtab derived structure.
+            </param>
+            <param name="pError">
+            Upon failure, this parameter must be modified to point to the error
+            message, with the underlying memory having been obtained from the
+            sqlite3_malloc() function.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.DestroyOrDisconnect(System.Boolean,System.IntPtr)">
+            <summary>
+            Calls one of the virtual table finalization methods.
+            </summary>
+            <param name="destroy">
+            Non-zero to call the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/>
+            method; otherwise, the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method will be
+            called.
+            </param>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetTableError(System.Data.SQLite.SQLiteModule,System.IntPtr,System.Boolean,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance to be used.
+            </param>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="logErrors">
+            Non-zero if this error message should also be logged using the
+            <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetTableError(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteVirtualTable,System.Boolean,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance to be used.
+            </param>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance used to
+            lookup the native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="logErrors">
+            Non-zero if this error message should also be logged using the
+            <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetCursorError(System.Data.SQLite.SQLiteModule,System.IntPtr,System.Boolean,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance to be used.
+            </param>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure
+            used to get the native pointer to the sqlite3_vtab derived
+            structure.
+            </param>
+            <param name="logErrors">
+            Non-zero if this error message should also be logged using the
+            <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetCursorError(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteVirtualTableCursor,System.Boolean,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance to be used.
+            </param>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance used to
+            lookup the native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="logErrors">
+            Non-zero if this error message should also be logged using the
+            <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.GetNativeModuleImpl">
+            <summary>
+            Gets and returns the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface
+            implementation to be used when creating the native sqlite3_module
+            structure.  Derived classes may override this method to supply an
+            alternate implementation for the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/>
+            interface.
+            </summary>
+            <returns>
+            The <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface implementation to
+            be used when populating the native sqlite3_module structure.  If
+            the returned value is null, the private methods provided by the
+            <see cref="T:System.Data.SQLite.SQLiteModule"/> class and relating to the
+            <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface  will be used to
+            create the necessary delegates.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CreateNativeModuleImpl">
+            <summary>
+            Creates and returns the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/>
+            interface implementation corresponding to the current
+            <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance.
+            </summary>
+            <returns>
+            The <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface implementation
+            corresponding to the current <see cref="T:System.Data.SQLite.SQLiteModule"/> object
+            instance.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.AllocateTable">
+            <summary>
+            Allocates a native sqlite3_vtab derived structure and returns a
+            native pointer to it.
+            </summary>
+            <returns>
+            A native pointer to a native sqlite3_vtab derived structure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.ZeroTable(System.IntPtr)">
+            <summary>
+            Zeros out the fields of a native sqlite3_vtab derived structure.
+            </summary>
+            <param name="pVtab">
+            The native pointer to the native sqlite3_vtab derived structure to
+            zero.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.FreeTable(System.IntPtr)">
+            <summary>
+            Frees a native sqlite3_vtab structure using the provided native
+            pointer to it.
+            </summary>
+            <param name="pVtab">
+            A native pointer to a native sqlite3_vtab derived structure.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.AllocateCursor">
+            <summary>
+            Allocates a native sqlite3_vtab_cursor derived structure and
+            returns a native pointer to it.
+            </summary>
+            <returns>
+            A native pointer to a native sqlite3_vtab_cursor derived structure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.FreeCursor(System.IntPtr)">
+            <summary>
+            Frees a native sqlite3_vtab_cursor structure using the provided
+            native pointer to it.
+            </summary>
+            <param name="pCursor">
+            A native pointer to a native sqlite3_vtab_cursor derived structure.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.TableFromCursor(System.Data.SQLite.SQLiteModule,System.IntPtr)">
+            <summary>
+            Reads and returns the native pointer to the sqlite3_vtab derived
+            structure based on the native pointer to the sqlite3_vtab_cursor
+            derived structure.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance to be used.
+            </param>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure
+            from which to read the native pointer to the sqlite3_vtab derived
+            structure.
+            </param>
+            <returns>
+            The native pointer to the sqlite3_vtab derived structure -OR-
+            <see cref="F:System.IntPtr.Zero"/> if it cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.TableFromCursor(System.IntPtr)">
+            <summary>
+            Reads and returns the native pointer to the sqlite3_vtab derived
+            structure based on the native pointer to the sqlite3_vtab_cursor
+            derived structure.
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure
+            from which to read the native pointer to the sqlite3_vtab derived
+            structure.
+            </param>
+            <returns>
+            The native pointer to the sqlite3_vtab derived structure -OR-
+            <see cref="F:System.IntPtr.Zero"/> if it cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.TableFromIntPtr(System.IntPtr)">
+            <summary>
+            Looks up and returns the <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object
+            instance based on the native pointer to the sqlite3_vtab derived
+            structure.
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance or null if
+            the corresponding one cannot be found.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.TableToIntPtr(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            Allocates and returns a native pointer to a sqlite3_vtab derived
+            structure and creates an association between it and the specified
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance to be used
+            when creating the association.
+            </param>
+            <returns>
+            The native pointer to a sqlite3_vtab derived structure or
+            <see cref="F:System.IntPtr.Zero"/> if the method fails for any reason.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CursorFromIntPtr(System.IntPtr,System.IntPtr)">
+            <summary>
+            Looks up and returns the <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/>
+            object instance based on the native pointer to the
+            sqlite3_vtab_cursor derived structure.
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <returns>
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance or null
+            if the corresponding one cannot be found.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CursorToIntPtr(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            Allocates and returns a native pointer to a sqlite3_vtab_cursor
+            derived structure and creates an association between it and the
+            specified <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance to be
+            used when creating the association.
+            </param>
+            <returns>
+            The native pointer to a sqlite3_vtab_cursor derived structure or
+            <see cref="F:System.IntPtr.Zero"/> if the method fails for any reason.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.GetFunctionKey(System.Int32,System.String,System.Data.SQLite.SQLiteFunction)">
+            <summary>
+            Deterimines the key that should be used to identify and store the
+            <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance for the virtual table
+            (i.e. to be returned via the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method).
+            </summary>
+            <param name="argumentCount">
+            The number of arguments to the virtual table function.
+            </param>
+            <param name="name">
+            The name of the virtual table function.
+            </param>
+            <param name="function">
+            The <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance associated with
+            this virtual table function.
+            </param>
+            <returns>
+            The string that should be used to identify and store the virtual
+            table function instance.  This method cannot return null.  If null
+            is returned from this method, the behavior is undefined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.DeclareTable(System.Data.SQLite.SQLiteConnection,System.String,System.String@)">
+            <summary>
+            Attempts to declare the schema for the virtual table using the
+            specified database connection.
+            </summary>
+            <param name="connection">
+            The <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance to use when
+            declaring the schema of the virtual table.  This parameter may not
+            be null.
+            </param>
+            <param name="sql">
+            The string containing the CREATE TABLE statement that completely
+            describes the schema for the virtual table.  This parameter may not
+            be null.
+            </param>
+            <param name="error">
+            Upon failure, this parameter must be modified to contain an error
+            message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.DeclareFunction(System.Data.SQLite.SQLiteConnection,System.Int32,System.String,System.String@)">
+            <summary>
+            Calls the native SQLite core library in order to declare a virtual
+            table function in response to a call into the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/>
+            or <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> virtual table
+            methods.
+            </summary>
+            <param name="connection">
+            The <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance to use when
+            declaring the schema of the virtual table.
+            </param>
+            <param name="argumentCount">
+            The number of arguments to the function being declared.
+            </param>
+            <param name="name">
+            The name of the function being declared.
+            </param>
+            <param name="error">
+            Upon success, the contents of this parameter are undefined.  Upon
+            failure, it should contain an appropriate error message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetTableError(System.IntPtr,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetTableError(System.Data.SQLite.SQLiteVirtualTable,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance used to
+            lookup the native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetCursorError(System.Data.SQLite.SQLiteVirtualTableCursor,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance used to
+            lookup the native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetEstimatedCost(System.Data.SQLite.SQLiteIndex,System.Nullable{System.Double})">
+            <summary>
+            Modifies the specified <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance
+            to contain the specified estimated cost.
+            </summary>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance to modify.
+            </param>
+            <param name="estimatedCost">
+            The estimated cost value to use.  Using a null value means that the
+            default value provided by the SQLite core library should be used.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetEstimatedCost(System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            Modifies the specified <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance
+            to contain the default estimated cost.
+            </summary>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance to modify.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetEstimatedRows(System.Data.SQLite.SQLiteIndex,System.Nullable{System.Int64})">
+            <summary>
+            Modifies the specified <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance
+            to contain the specified estimated rows.
+            </summary>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance to modify.
+            </param>
+            <param name="estimatedRows">
+            The estimated rows value to use.  Using a null value means that the
+            default value provided by the SQLite core library should be used.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetEstimatedRows(System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            Modifies the specified <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance
+            to contain the default estimated rows.
+            </summary>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance to modify.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pDb">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pAux">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pError">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pDb">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pAux">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pError">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xBestIndex(System.IntPtr,System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <param name="pIndex">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xDisconnect(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xDestroy(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xOpen(System.IntPtr,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </param>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xClose(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="idxNum">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="idxStr">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xNext(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xEof(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="pContext">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xRowId(System.IntPtr,System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xBegin(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xSync(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xCommit(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xRollback(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="nArg">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="zName">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="callback">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xRename(System.IntPtr,System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <param name="zNew">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xSavepoint(System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="iSavepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xRelease(System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="iSavepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xRollbackTo(System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="iSavepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="connection">
+            The <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="pClientData">
+            The native user-data pointer associated with this module, as it was
+            provided to the SQLite core library when the native module instance
+            was created.
+            </param>
+            <param name="arguments">
+            The module name, database name, virtual table name, and all other
+            arguments passed to the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="table">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="error">
+            Upon failure, this parameter must be modified to contain an error
+            message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="connection">
+            The <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="pClientData">
+            The native user-data pointer associated with this module, as it was
+            provided to the SQLite core library when the native module instance
+            was created.
+            </param>
+            <param name="arguments">
+            The module name, database name, virtual table name, and all other
+            arguments passed to the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="table">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="error">
+            Upon failure, this parameter must be modified to contain an error
+            message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance containing all the
+            data for the inputs and outputs relating to index selection.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="cursor">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance associated
+            with the newly opened virtual table cursor.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="indexNumber">
+            Number used to help identify the selected index.
+            </param>
+            <param name="indexString">
+            String used to help identify the selected index.
+            </param>
+            <param name="values">
+            The values corresponding to each column in the selected index.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <returns>
+            Non-zero if no more rows are available; zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="context">
+            The <see cref="T:System.Data.SQLite.SQLiteContext"/> object instance to be used for
+            returning the specified column value to the SQLite core library.
+            </param>
+            <param name="index">
+            The zero-based index corresponding to the column containing the
+            value to be returned.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="rowId">
+            Upon success, this parameter must be modified to contain the unique
+            integer row identifier for the current row for the specified cursor.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="values">
+            The array of <see cref="T:System.Data.SQLite.SQLiteValue"/> object instances containing
+            the new or modified column values, if any.
+            </param>
+            <param name="rowId">
+            Upon success, this parameter must be modified to contain the unique
+            integer row identifier for the row that was inserted, if any.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Begin(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Sync(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Commit(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Rollback(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="argumentCount">
+            The number of arguments to the function being sought.
+            </param>
+            <param name="name">
+            The name of the function being sought.
+            </param>
+            <param name="function">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance responsible for
+            implementing the specified function.
+            </param>
+            <param name="pClientData">
+            Upon success, this parameter must be modified to contain the
+            native user-data pointer associated with
+            <paramref name="function"/>.
+            </param>
+            <returns>
+            Non-zero if the specified function was found; zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="newName">
+            The new name for the virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="savepoint">
+            This is an integer identifier under which the the current state of
+            the virtual table should be saved.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="savepoint">
+            This is an integer used to indicate that any saved states with an
+            identifier greater than or equal to this should be deleted by the
+            virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="savepoint">
+            This is an integer identifier used to specify a specific saved
+            state for the virtual table for it to restore itself back to, which
+            should also have the effect of deleting all saved states with an
+            integer identifier greater than this one.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Dispose">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.Data.SQLite.SQLiteModule.Dispose"/> method.  Zero if this method is being
+            called from the finalizer.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Finalize">
+            <summary>
+            Finalizes this object instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteModule.LogErrorsNoThrow">
+            <summary>
+            Returns or sets a boolean value indicating whether virtual table
+            errors should be logged using the <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteModule.LogExceptionsNoThrow">
+            <summary>
+            Returns or sets a boolean value indicating whether exceptions
+            caught in the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method,
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method, and the
+            <see cref="M:System.Data.SQLite.SQLiteModule.Dispose"/> method should be logged using the
+            <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteModule.LogErrors">
+            <summary>
+            Returns or sets a boolean value indicating whether virtual table
+            errors should be logged using the <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteModule.LogExceptions">
+            <summary>
+            Returns or sets a boolean value indicating whether exceptions
+            caught in the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method,
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method, and the
+            <see cref="M:System.Data.SQLite.SQLiteModule.Dispose"/> method should be logged using the
+            <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteModule.Declared">
+            <summary>
+            Returns non-zero if the schema for the virtual table has been
+            declared.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteModule.Name">
+            <summary>
+            Returns the name of the module as it was registered with the SQLite
+            core library.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteModule.SQLiteNativeModule">
+            <summary>
+            This class implements the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/>
+            interface by forwarding those method calls to the
+            <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance it contains.  If the
+            contained <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance is null, all
+            the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> methods simply generate an
+            error.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.DefaultLogErrors">
+            <summary>
+            This is the value that is always used for the "logErrors"
+            parameter to the various static error handling methods provided
+            by the <see cref="T:System.Data.SQLite.SQLiteModule"/> class.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.ModuleNotAvailableErrorMessage">
+            <summary>
+            This is the error message text used when the contained
+            <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance is not available
+            for any reason.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.module">
+            <summary>
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance used to provide
+            an implementation of the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/>
+            interface.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.#ctor(System.Data.SQLite.SQLiteModule)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance used to provide
+            an implementation of the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/>
+            interface.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.ModuleNotAvailableTableError(System.IntPtr)">
+            <summary>
+            Sets the table error message to one that indicates the native
+            module implementation is not available.
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            The value of <see cref="F:System.Data.SQLite.SQLiteErrorCode.Error"/>.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.ModuleNotAvailableCursorError(System.IntPtr)">
+            <summary>
+            Sets the table error message to one that indicates the native
+            module implementation is not available.
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived
+            structure.
+            </param>
+            <returns>
+            The value of <see cref="F:System.Data.SQLite.SQLiteErrorCode.Error"/>.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pDb">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pAux">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pError">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pDb">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pAux">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pError">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <param name="pIndex">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xDisconnect(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xDestroy(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </param>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xClose(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="idxNum">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="idxStr">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xNext(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xEof(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="pContext">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xBegin(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xSync(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xCommit(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xRollback(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="nArg">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="zName">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="callback">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <param name="zNew">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="iSavepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xRelease(System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="iSavepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="iSavepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.Dispose">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.Dispose"/> method.  Zero if this method is being
+            called from the finalizer.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.Finalize">
+            <summary>
+            Finalizes this object instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator">
+            <summary>
+            This class represents a virtual table cursor to be used with the
+            <see cref="T:System.Data.SQLite.SQLiteModuleEnumerable"/> class.  It is not sealed and may
+            be used as the base class for any user-defined virtual table cursor
+            class that wraps an <see cref="T:System.Collections.IEnumerator"/> object instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.enumerator">
+            <summary>
+            The <see cref="T:System.Collections.IEnumerator"/> instance provided when this cursor
+            was created.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.endOfEnumerator">
+            <summary>
+            This value will be non-zero if false has been returned from the
+            <see cref="M:System.Collections.IEnumerator.MoveNext"/> method.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.#ctor(System.Data.SQLite.SQLiteVirtualTable,System.Collections.IEnumerator)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this object instance.
+            </param>
+            <param name="enumerator">
+            The <see cref="T:System.Collections.IEnumerator"/> instance to expose as a virtual
+            table cursor.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.MoveNext">
+            <summary>
+            Advances to the next row of the virtual table cursor using the
+            <see cref="M:System.Collections.IEnumerator.MoveNext"/> method of the
+            <see cref="T:System.Collections.IEnumerator"/> object instance.
+            </summary>
+            <returns>
+            Non-zero if the current row is valid; zero otherwise.  If zero is
+            returned, no further rows are available.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.Reset">
+            <summary>
+            Resets the virtual table cursor position, also invalidating the
+            current row, using the <see cref="M:System.Collections.IEnumerator.Reset"/> method of
+            the <see cref="T:System.Collections.IEnumerator"/> object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.Close">
+            <summary>
+            Closes the virtual table cursor.  This method must not throw any
+            exceptions.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.CheckClosed">
+            <summary>
+            Throws an <see cref="T:System.InvalidOperationException"/> if the virtual
+            table cursor has been closed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.IDisposable.Dispose"/> method.  Zero if this method is
+            being called from the finalizer.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.Current">
+            <summary>
+            Returns the value for the current row of the virtual table cursor
+            using the <see cref="P:System.Collections.IEnumerator.Current"/> property of the
+            <see cref="T:System.Collections.IEnumerator"/> object instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.EndOfEnumerator">
+            <summary>
+            Returns non-zero if the end of the virtual table cursor has been
+            seen (i.e. no more rows are available, including the current one).
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.IsOpen">
+            <summary>
+            Returns non-zero if the virtual table cursor is open.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteModuleEnumerable">
+             <summary>
+             This class implements a virtual table module that exposes an
+             <see cref="T:System.Collections.IEnumerable"/> object instance as a read-only virtual
+             table.  It is not sealed and may be used as the base class for any
+             user-defined virtual table class that wraps an
+             <see cref="T:System.Collections.IEnumerable"/> object instance.  The following short
+             example shows it being used to treat an array of strings as a table
+             data source:
+             <code>
+               public static class Sample
+               {
+                 public static void Main()
+                 {
+                   using (SQLiteConnection connection = new SQLiteConnection(
+                       "Data Source=:memory:;"))
+                   {
+                     connection.Open();
+            
+                     connection.CreateModule(new SQLiteModuleEnumerable(
+                       "sampleModule", new string[] { "one", "two", "three" }));
+            
+                     using (SQLiteCommand command = connection.CreateCommand())
+                     {
+                       command.CommandText =
+                           "CREATE VIRTUAL TABLE t1 USING sampleModule;";
+            
+                       command.ExecuteNonQuery();
+                     }
+            
+                     using (SQLiteCommand command = connection.CreateCommand())
+                     {
+                       command.CommandText = "SELECT * FROM t1;";
+            
+                       using (SQLiteDataReader dataReader = command.ExecuteReader())
+                       {
+                         while (dataReader.Read())
+                           Console.WriteLine(dataReader[0].ToString());
+                       }
+                     }
+            
+                     connection.Close();
+                   }
+                 }
+               }
+             </code>
+             </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteModuleNoop">
+            <summary>
+            This class implements a virtual table module that does nothing by
+            providing "empty" implementations for all of the
+            <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface methods.  The result
+            codes returned by these "empty" method implementations may be
+            controlled on a per-method basis by using and/or overriding the
+            <see cref="M:System.Data.SQLite.SQLiteModuleNoop.GetDefaultResultCode"/>,
+            <see cref="M:System.Data.SQLite.SQLiteModuleNoop.ResultCodeToEofResult(System.Data.SQLite.SQLiteErrorCode)"/>,
+            <see cref="M:System.Data.SQLite.SQLiteModuleNoop.ResultCodeToFindFunctionResult(System.Data.SQLite.SQLiteErrorCode)"/>,
+            <see cref="M:System.Data.SQLite.SQLiteModuleNoop.GetMethodResultCode(System.String)"/>, and
+            <see cref="M:System.Data.SQLite.SQLiteModuleNoop.SetMethodResultCode(System.String,System.Data.SQLite.SQLiteErrorCode)"/> methods from within derived classes.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModuleNoop.resultCodes">
+            <summary>
+            This field is used to store the <see cref="T:System.Data.SQLite.SQLiteErrorCode"/>
+            values to return, on a per-method basis, for all methods that are
+            part of the <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.#ctor(System.String)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="name">
+            The name of the module.  This parameter cannot be null.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.GetDefaultResultCode">
+            <summary>
+            Determines the default <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value to be
+            returned by methods of the <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/>
+            interface that lack an overridden implementation in all classes
+            derived from the <see cref="T:System.Data.SQLite.SQLiteModuleNoop"/> class.
+            </summary>
+            <returns>
+            The <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value that should be returned
+            by all <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface methods unless
+            a more specific result code has been set for that interface method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.ResultCodeToEofResult(System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Converts a <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value into a boolean
+            return value for use with the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="resultCode">
+            The <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value to convert.
+            </param>
+            <returns>
+            The <see cref="T:System.Boolean"/> value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.ResultCodeToFindFunctionResult(System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Converts a <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value into a boolean
+            return value for use with the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="resultCode">
+            The <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value to convert.
+            </param>
+            <returns>
+            The <see cref="T:System.Boolean"/> value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.GetMethodResultCode(System.String)">
+            <summary>
+            Determines the <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value that should be
+            returned by the specified <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/>
+            interface method if it lack an overridden implementation.  If no
+            specific <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value is available (or set)
+            for the specified method, the <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value
+            returned by the <see cref="M:System.Data.SQLite.SQLiteModuleNoop.GetDefaultResultCode"/> method will be
+            returned instead.
+            </summary>
+            <param name="methodName">
+            The name of the method.  Currently, this method must be part of
+            the <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface.
+            </param>
+            <returns>
+            The <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value that should be returned
+            by the <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.SetMethodResultCode(System.String,System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Sets the <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value that should be
+            returned by the specified <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/>
+            interface method if it lack an overridden implementation.
+            </summary>
+            <param name="methodName">
+            The name of the method.  Currently, this method must be part of
+            the <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface.
+            </param>
+            <param name="resultCode">
+            The <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value that should be returned
+            by the <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface method.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </summary>
+            <param name="connection">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="arguments">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="error">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </summary>
+            <param name="connection">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="arguments">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="error">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Disconnect(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Destroy(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </param>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Close(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <param name="indexNumber">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <param name="indexString">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <param name="values">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Next(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <param name="context">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </param>
+            <param name="values">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Begin(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Begin(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Begin(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Begin(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Sync(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Sync(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Sync(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Sync(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Commit(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Commit(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Commit(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Commit(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Rollback(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rollback(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rollback(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rollback(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argumentCount">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </param>
+            <param name="name">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </param>
+            <param name="function">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </param>
+            <param name="newName">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </param>
+            <param name="savepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </param>
+            <param name="savepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </param>
+            <param name="savepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.IDisposable.Dispose"/> method.  Zero if this method is
+            being called from the finalizer.
+            </param>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModuleEnumerable.declareSql">
+            <summary>
+            The CREATE TABLE statement used to declare the schema for the
+            virtual table.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModuleEnumerable.enumerable">
+            <summary>
+            The <see cref="T:System.Collections.IEnumerable"/> instance containing the backing data
+            for the virtual table.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.#ctor(System.String,System.Collections.IEnumerable)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="name">
+            The name of the module.  This parameter cannot be null.
+            </param>
+            <param name="enumerable">
+            The <see cref="T:System.Collections.IEnumerable"/> instance to expose as a virtual
+            table.  This parameter cannot be null.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.GetSqlForDeclareTable">
+            <summary>
+            Determines the SQL statement used to declare the virtual table.
+            This method should be overridden in derived classes if they require
+            a custom virtual table schema.
+            </summary>
+            <returns>
+            The SQL statement used to declare the virtual table -OR- null if it
+            cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.CursorTypeMismatchError(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            Sets the table error message to one that indicates the virtual
+            table cursor is of the wrong type.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance.
+            </param>
+            <returns>
+            The value of <see cref="F:System.Data.SQLite.SQLiteErrorCode.Error"/>.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.CursorEndOfEnumeratorError(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            Sets the table error message to one that indicates the virtual
+            table cursor has no current row.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance.
+            </param>
+            <returns>
+            The value of <see cref="F:System.Data.SQLite.SQLiteErrorCode.Error"/>.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.GetStringFromObject(System.Data.SQLite.SQLiteVirtualTableCursor,System.Object)">
+            <summary>
+            Determines the string to return as the column value for the object
+            instance value.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="value">
+            The object instance to return a string representation for.
+            </param>
+            <returns>
+            The string representation of the specified object instance or null
+            upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.MakeRowId(System.Int32,System.Int32)">
+            <summary>
+            Constructs an <see cref="T:System.Int64"/> unique row identifier from two
+            <see cref="T:System.Int32"/> values.  The first <see cref="T:System.Int32"/> value
+            must contain the row sequence number for the current row and the
+            second value must contain the hash code of the enumerator value
+            for the current row.
+            </summary>
+            <param name="rowIndex">
+            The integer row sequence number for the current row.
+            </param>
+            <param name="hashCode">
+            The hash code of the enumerator value for the current row.
+            </param>
+            <returns>
+            The unique row identifier or zero upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.GetRowIdFromObject(System.Data.SQLite.SQLiteVirtualTableCursor,System.Object)">
+            <summary>
+            Determines the unique row identifier for the current row.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="value">
+            The object instance to return a unique row identifier for.
+            </param>
+            <returns>
+            The unique row identifier or zero upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </summary>
+            <param name="connection">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="arguments">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="error">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </summary>
+            <param name="connection">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="arguments">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="error">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Disconnect(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Destroy(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </param>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Close(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <param name="indexNumber">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <param name="indexString">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <param name="values">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Next(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <param name="context">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </param>
+            <param name="values">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </param>
+            <param name="newName">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.IDisposable.Dispose"/> method.  Zero if this method is
+            being called from the finalizer.
+            </param>
+        </member>
+        <member name="T:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1">
+            <summary>
+            This class represents a virtual table cursor to be used with the
+            <see cref="T:System.Data.SQLite.SQLiteModuleEnumerable"/> class.  It is not sealed and may
+            be used as the base class for any user-defined virtual table cursor
+            class that wraps an <see cref="T:System.Collections.Generic.IEnumerator`1"/> object instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.enumerator">
+            <summary>
+            The <see cref="T:System.Collections.Generic.IEnumerator`1"/> instance provided when this
+            cursor was created.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.#ctor(System.Data.SQLite.SQLiteVirtualTable,System.Collections.Generic.IEnumerator{`0})">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this object instance.
+            </param>
+            <param name="enumerator">
+            The <see cref="T:System.Collections.Generic.IEnumerator`1"/> instance to expose as a virtual
+            table cursor.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.Close">
+            <summary>
+            Closes the virtual table cursor.  This method must not throw any
+            exceptions.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.IDisposable.Dispose"/> method.  Zero if this method is
+            being called from the finalizer.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.System#Collections#Generic#IEnumerator{T}#Current">
+            <summary>
+            Returns the value for the current row of the virtual table cursor
+            using the <see cref="P:System.Collections.Generic.IEnumerator`1.Current"/> property of the
+            <see cref="T:System.Collections.Generic.IEnumerator`1"/> object instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1">
+            <summary>
+            This class implements a virtual table module that exposes an
+            <see cref="T:System.Collections.Generic.IEnumerable`1"/> object instance as a read-only virtual
+            table.  It is not sealed and may be used as the base class for any
+            user-defined virtual table class that wraps an
+            <see cref="T:System.Collections.Generic.IEnumerable`1"/> object instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.enumerable">
+            <summary>
+            The <see cref="T:System.Collections.Generic.IEnumerable`1"/> instance containing the backing
+            data for the virtual table.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.#ctor(System.String,System.Collections.Generic.IEnumerable{`0})">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="name">
+            The name of the module.  This parameter cannot be null.
+            </param>
+            <param name="enumerable">
+            The <see cref="T:System.Collections.Generic.IEnumerable`1"/> instance to expose as a virtual
+            table.  This parameter cannot be null.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </param>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <param name="context">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.IDisposable.Dispose"/> method.  Zero if this method is
+            being called from the finalizer.
+            </param>
+        </member>
+    </members>
+</doc>
Binary file packages/System.Data.SQLite.1.0.90.0/lib/net451/System.Data.SQLite.Linq.dll has changed
Binary file packages/System.Data.SQLite.1.0.90.0/lib/net451/System.Data.SQLite.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/System.Data.SQLite.1.0.90.0/lib/net451/System.Data.SQLite.xml	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,12758 @@
+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>System.Data.SQLite</name>
+    </assembly>
+    <members>
+        <member name="T:System.Data.SQLite.AssemblySourceIdAttribute">
+            <summary>
+            Defines a source code identifier custom attribute for an assembly
+            manifest.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.AssemblySourceIdAttribute.#ctor(System.String)">
+            <summary>
+            Constructs an instance of this attribute class using the specified
+            source code identifier value.
+            </summary>
+            <param name="value">
+            The source code identifier value to use.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.AssemblySourceIdAttribute.SourceId">
+            <summary>
+            Gets the source code identifier value.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.AssemblySourceTimeStampAttribute">
+            <summary>
+            Defines a source code time-stamp custom attribute for an assembly
+            manifest.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.AssemblySourceTimeStampAttribute.#ctor(System.String)">
+            <summary>
+            Constructs an instance of this attribute class using the specified
+            source code time-stamp value.
+            </summary>
+            <param name="value">
+            The source code time-stamp value to use.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.AssemblySourceTimeStampAttribute.SourceTimeStamp">
+            <summary>
+            Gets the source code time-stamp value.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteLogCallback">
+             <summary>
+             This is the method signature for the SQLite core library logging callback
+             function for use with sqlite3_log() and the SQLITE_CONFIG_LOG.
+            
+             WARNING: This delegate is used more-or-less directly by native code, do
+                      not modify its type signature.
+             </summary>
+             <param name="pUserData">
+             The extra data associated with this message, if any.
+             </param>
+             <param name="errorCode">
+             The error code associated with this message.
+             </param>
+             <param name="pMessage">
+             The message string to be logged.
+             </param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLite3">
+            <summary>
+            This class implements SQLiteBase completely, and is the guts of the code that interop's SQLite with .NET
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteBase">
+            <summary>
+            This internal class provides the foundation of SQLite support.  It defines all the abstract members needed to implement
+            a SQLite data provider, and inherits from SQLiteConvert which allows for simple translations of string to and from SQLite.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConvert">
+            <summary>
+            This base class provides datatype conversion services for the SQLite provider.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert.FullFormat">
+            <summary>
+            The format string for DateTime values when using the InvariantCulture or CurrentCulture formats.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert.UnixEpoch">
+            <summary>
+            The value for the Unix epoch (e.g. January 1, 1970 at midnight, in UTC).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert.OleAutomationEpochAsJulianDay">
+            <summary>
+            The value of the OLE Automation epoch represented as a Julian day.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._datetimeFormats">
+            <summary>
+            An array of ISO-8601 DateTime formats that we support parsing.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._datetimeFormatUtc">
+            <summary>
+            The internal default format for UTC DateTime values when converting
+            to a string.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._datetimeFormatLocal">
+            <summary>
+            The internal default format for local DateTime values when converting
+            to a string.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._utf8">
+            <summary>
+            An UTF-8 Encoding instance, so we can convert strings to and from UTF-8
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._datetimeFormat">
+            <summary>
+            The default DateTime format for this instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._datetimeKind">
+            <summary>
+            The default DateTimeKind for this instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConvert._datetimeFormatString">
+            <summary>
+            The default DateTime format string for this instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.#ctor(System.Data.SQLite.SQLiteDateFormats,System.DateTimeKind,System.String)">
+            <summary>
+            Initializes the conversion class
+            </summary>
+            <param name="fmt">The default date/time format to use for this instance</param>
+            <param name="kind">The DateTimeKind to use.</param>
+            <param name="fmtString">The DateTime format string to use.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToUTF8(System.String)">
+            <summary>
+            Converts a string to a UTF-8 encoded byte array sized to include a null-terminating character.
+            </summary>
+            <param name="sourceText">The string to convert to UTF-8</param>
+            <returns>A byte array containing the converted string plus an extra 0 terminating byte at the end of the array.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToUTF8(System.DateTime)">
+            <summary>
+            Convert a DateTime to a UTF-8 encoded, zero-terminated byte array.
+            </summary>
+            <remarks>
+            This function is a convenience function, which first calls ToString() on the DateTime, and then calls ToUTF8() with the
+            string result.
+            </remarks>
+            <param name="dateTimeValue">The DateTime to convert.</param>
+            <returns>The UTF-8 encoded string, including a 0 terminating byte at the end of the array.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToString(System.IntPtr,System.Int32)">
+            <summary>
+            Converts a UTF-8 encoded IntPtr of the specified length into a .NET string
+            </summary>
+            <param name="nativestring">The pointer to the memory where the UTF-8 string is encoded</param>
+            <param name="nativestringlen">The number of bytes to decode</param>
+            <returns>A string containing the translated character(s)</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.UTF8ToString(System.IntPtr,System.Int32)">
+            <summary>
+            Converts a UTF-8 encoded IntPtr of the specified length into a .NET string
+            </summary>
+            <param name="nativestring">The pointer to the memory where the UTF-8 string is encoded</param>
+            <param name="nativestringlen">The number of bytes to decode</param>
+            <returns>A string containing the translated character(s)</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.String)">
+            <summary>
+            Converts a string into a DateTime, using the DateTimeFormat, DateTimeKind,
+            and DateTimeFormatString specified for the connection when it was opened.
+            </summary>
+            <remarks>
+            Acceptable ISO8601 DateTime formats are:
+            <list type="bullet">
+            <item><description>THHmmssK</description></item>
+            <item><description>THHmmK</description></item>
+            <item><description>HH:mm:ss.FFFFFFFK</description></item>
+            <item><description>HH:mm:ssK</description></item>
+            <item><description>HH:mmK</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ss.FFFFFFFK</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ssK</description></item>
+            <item><description>yyyy-MM-dd HH:mmK</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ss.FFFFFFFK</description></item>
+            <item><description>yyyy-MM-ddTHH:mmK</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ssK</description></item>
+            <item><description>yyyyMMddHHmmssK</description></item>
+            <item><description>yyyyMMddHHmmK</description></item>
+            <item><description>yyyyMMddTHHmmssFFFFFFFK</description></item>
+            <item><description>THHmmss</description></item>
+            <item><description>THHmm</description></item>
+            <item><description>HH:mm:ss.FFFFFFF</description></item>
+            <item><description>HH:mm:ss</description></item>
+            <item><description>HH:mm</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ss.FFFFFFF</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ss</description></item>
+            <item><description>yyyy-MM-dd HH:mm</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ss.FFFFFFF</description></item>
+            <item><description>yyyy-MM-ddTHH:mm</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ss</description></item>
+            <item><description>yyyyMMddHHmmss</description></item>
+            <item><description>yyyyMMddHHmm</description></item>
+            <item><description>yyyyMMddTHHmmssFFFFFFF</description></item>
+            <item><description>yyyy-MM-dd</description></item>
+            <item><description>yyyyMMdd</description></item>
+            <item><description>yy-MM-dd</description></item>
+            </list>
+            If the string cannot be matched to one of the above formats -OR-
+            the DateTimeFormatString if one was provided, an exception will
+            be thrown.
+            </remarks>
+            <param name="dateText">The string containing either a long integer number of 100-nanosecond units since
+            System.DateTime.MinValue, a Julian day double, an integer number of seconds since the Unix epoch, a
+            culture-independent formatted date and time string, a formatted date and time string in the current
+            culture, or an ISO8601-format string.</param>
+            <returns>A DateTime value</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.String,System.Data.SQLite.SQLiteDateFormats,System.DateTimeKind,System.String)">
+            <summary>
+            Converts a string into a DateTime, using the specified DateTimeFormat,
+            DateTimeKind and DateTimeFormatString.
+            </summary>
+            <remarks>
+            Acceptable ISO8601 DateTime formats are:
+            <list type="bullet">
+            <item><description>THHmmssK</description></item>
+            <item><description>THHmmK</description></item>
+            <item><description>HH:mm:ss.FFFFFFFK</description></item>
+            <item><description>HH:mm:ssK</description></item>
+            <item><description>HH:mmK</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ss.FFFFFFFK</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ssK</description></item>
+            <item><description>yyyy-MM-dd HH:mmK</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ss.FFFFFFFK</description></item>
+            <item><description>yyyy-MM-ddTHH:mmK</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ssK</description></item>
+            <item><description>yyyyMMddHHmmssK</description></item>
+            <item><description>yyyyMMddHHmmK</description></item>
+            <item><description>yyyyMMddTHHmmssFFFFFFFK</description></item>
+            <item><description>THHmmss</description></item>
+            <item><description>THHmm</description></item>
+            <item><description>HH:mm:ss.FFFFFFF</description></item>
+            <item><description>HH:mm:ss</description></item>
+            <item><description>HH:mm</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ss.FFFFFFF</description></item>
+            <item><description>yyyy-MM-dd HH:mm:ss</description></item>
+            <item><description>yyyy-MM-dd HH:mm</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ss.FFFFFFF</description></item>
+            <item><description>yyyy-MM-ddTHH:mm</description></item>
+            <item><description>yyyy-MM-ddTHH:mm:ss</description></item>
+            <item><description>yyyyMMddHHmmss</description></item>
+            <item><description>yyyyMMddHHmm</description></item>
+            <item><description>yyyyMMddTHHmmssFFFFFFF</description></item>
+            <item><description>yyyy-MM-dd</description></item>
+            <item><description>yyyyMMdd</description></item>
+            <item><description>yy-MM-dd</description></item>
+            </list>
+            If the string cannot be matched to one of the above formats -OR-
+            the DateTimeFormatString if one was provided, an exception will
+            be thrown.
+            </remarks>
+            <param name="dateText">The string containing either a long integer number of 100-nanosecond units since
+            System.DateTime.MinValue, a Julian day double, an integer number of seconds since the Unix epoch, a
+            culture-independent formatted date and time string, a formatted date and time string in the current
+            culture, or an ISO8601-format string.</param>
+            <param name="format">The SQLiteDateFormats to use.</param>
+            <param name="kind">The DateTimeKind to use.</param>
+            <param name="formatString">The DateTime format string to use.</param>
+            <returns>A DateTime value</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.Double)">
+            <summary>
+            Converts a julianday value into a DateTime
+            </summary>
+            <param name="julianDay">The value to convert</param>
+            <returns>A .NET DateTime</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.Double,System.DateTimeKind)">
+            <summary>
+            Converts a julianday value into a DateTime
+            </summary>
+            <param name="julianDay">The value to convert</param>
+            <param name="kind">The DateTimeKind to use.</param>
+            <returns>A .NET DateTime</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.Int32,System.DateTimeKind)">
+            <summary>
+            Converts the specified number of seconds from the Unix epoch into a
+            <see cref="T:System.DateTime"/> value.
+            </summary>
+            <param name="seconds">
+            The number of whole seconds since the Unix epoch.
+            </param>
+            <param name="kind">
+            Either Utc or Local time.
+            </param>
+            <returns>
+            The new <see cref="T:System.DateTime"/> value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.Int64,System.DateTimeKind)">
+            <summary>
+            Converts the specified number of ticks since the epoch into a
+            <see cref="T:System.DateTime"/> value.
+            </summary>
+            <param name="ticks">
+            The number of whole ticks since the epoch.
+            </param>
+            <param name="kind">
+            Either Utc or Local time.
+            </param>
+            <returns>
+            The new <see cref="T:System.DateTime"/> value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToJulianDay(System.DateTime)">
+            <summary>
+            Converts a DateTime struct to a JulianDay double
+            </summary>
+            <param name="value">The DateTime to convert</param>
+            <returns>The JulianDay value the Datetime represents</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToUnixEpoch(System.DateTime)">
+            <summary>
+            Converts a DateTime struct to the whole number of seconds since the
+            Unix epoch.
+            </summary>
+            <param name="value">The DateTime to convert</param>
+            <returns>The whole number of seconds since the Unix epoch</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.GetDateTimeKindFormat(System.DateTimeKind,System.String)">
+            <summary>
+            Returns the DateTime format string to use for the specified DateTimeKind.
+            If <paramref name="formatString" /> is not null, it will be returned verbatim.
+            </summary>
+            <param name="kind">The DateTimeKind to use.</param>
+            <param name="formatString">The DateTime format string to use.</param>
+            <returns>
+            The DateTime format string to use for the specified DateTimeKind.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToString(System.DateTime)">
+            <summary>
+            Converts a string into a DateTime, using the DateTimeFormat, DateTimeKind,
+            and DateTimeFormatString specified for the connection when it was opened.
+            </summary>
+            <param name="dateValue">The DateTime value to convert</param>
+            <returns>Either a string containing the long integer number of 100-nanosecond units since System.DateTime.MinValue, a
+            Julian day double, an integer number of seconds since the Unix epoch, a culture-independent formatted date and time
+            string, a formatted date and time string in the current culture, or an ISO8601-format date/time string.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToDateTime(System.IntPtr,System.Int32)">
+            <summary>
+            Internal function to convert a UTF-8 encoded IntPtr of the specified length to a DateTime.
+            </summary>
+            <remarks>
+            This is a convenience function, which first calls ToString() on the IntPtr to convert it to a string, then calls
+            ToDateTime() on the string to return a DateTime.
+            </remarks>
+            <param name="ptr">A pointer to the UTF-8 encoded string</param>
+            <param name="len">The length in bytes of the string</param>
+            <returns>The parsed DateTime value</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.Split(System.String,System.Char)">
+            <summary>
+            Smart method of splitting a string.  Skips quoted elements, removes the quotes.
+            </summary>
+            <remarks>
+            This split function works somewhat like the String.Split() function in that it breaks apart a string into
+            pieces and returns the pieces as an array.  The primary differences are:
+            <list type="bullet">
+            <item><description>Only one character can be provided as a separator character</description></item>
+            <item><description>Quoted text inside the string is skipped over when searching for the separator, and the quotes are removed.</description></item>
+            </list>
+            Thus, if splitting the following string looking for a comma:<br/>
+            One,Two, "Three, Four", Five<br/>
+            <br/>
+            The resulting array would contain<br/>
+            [0] One<br/>
+            [1] Two<br/>
+            [2] Three, Four<br/>
+            [3] Five<br/>
+            <br/>
+            Note that the leading and trailing spaces were removed from each item during the split.
+            </remarks>
+            <param name="source">Source string to split apart</param>
+            <param name="separator">Separator character</param>
+            <returns>A string array of the split up elements</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.NewSplit(System.String,System.Char,System.Boolean,System.String@)">
+            <summary>
+            Splits the specified string into multiple strings based on a separator
+            and returns the result as an array of strings.
+            </summary>
+            <param name="value">
+            The string to split into pieces based on the separator character.  If
+            this string is null, null will always be returned.  If this string is
+            empty, an array of zero strings will always be returned.
+            </param>
+            <param name="separator">
+            The character used to divide the original string into sub-strings.
+            This character cannot be a backslash or a double-quote; otherwise, no
+            work will be performed and null will be returned.
+            </param>
+            <param name="keepQuote">
+            If this parameter is non-zero, all double-quote characters will be
+            retained in the returned list of strings; otherwise, they will be
+            dropped.
+            </param>
+            <param name="error">
+            Upon failure, this parameter will be modified to contain an appropriate
+            error message.
+            </param>
+            <returns>
+            The new array of strings or null if the input string is null -OR- the
+            separator character is a backslash or a double-quote -OR- the string
+            contains an unbalanced backslash or double-quote character.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToBoolean(System.Object)">
+            <summary>
+            Convert a value to true or false.
+            </summary>
+            <param name="source">A string or number representing true or false</param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.ToBoolean(System.String)">
+            <summary>
+            Convert a string to true or false.
+            </summary>
+            <param name="source">A string representing true or false</param>
+            <returns></returns>
+            <remarks>
+            "yes", "no", "y", "n", "0", "1", "on", "off" as well as Boolean.FalseString and Boolean.TrueString will all be
+            converted to a proper boolean value.
+            </remarks>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.SQLiteTypeToType(System.Data.SQLite.SQLiteType)">
+            <summary>
+            Converts a SQLiteType to a .NET Type object
+            </summary>
+            <param name="t">The SQLiteType to convert</param>
+            <returns>Returns a .NET Type object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.TypeToDbType(System.Type)">
+            <summary>
+            For a given intrinsic type, return a DbType
+            </summary>
+            <param name="typ">The native type to convert</param>
+            <returns>The corresponding (closest match) DbType</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.DbTypeToColumnSize(System.Data.DbType)">
+            <summary>
+            Returns the ColumnSize for the given DbType
+            </summary>
+            <param name="typ">The DbType to get the size of</param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.DbTypeToTypeName(System.Data.DbType,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            Determines the type name for the given database value type.
+            </summary>
+            <param name="typ">The database value type.</param>
+            <param name="flags">The flags associated with the parent connection object.</param>
+            <returns>The type name or an empty string if it cannot be determined.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.DbTypeToType(System.Data.DbType)">
+            <summary>
+            Convert a DbType to a Type
+            </summary>
+            <param name="typ">The DbType to convert from</param>
+            <returns>The closest-match .NET type</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.TypeToAffinity(System.Type)">
+            <summary>
+            For a given type, return the closest-match SQLite TypeAffinity, which only understands a very limited subset of types.
+            </summary>
+            <param name="typ">The type to evaluate</param>
+            <returns>The SQLite type affinity for that type.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.GetSQLiteDbTypeMap">
+            <summary>
+            Builds and returns a map containing the database column types
+            recognized by this provider.
+            </summary>
+            <returns>
+            A map containing the database column types recognized by this
+            provider.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConvert.TypeNameToDbType(System.String,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            For a given type name, return a closest-match .NET type
+            </summary>
+            <param name="Name">The name of the type to match</param>
+            <param name="flags">The flags associated with the parent connection object.</param>
+            <returns>The .NET DBType the text evaluates to.</returns>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBase.COR_E_EXCEPTION">
+            <summary>
+            The error code used for logging exceptions caught in user-provided
+            code.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.SetMemoryStatus(System.Boolean)">
+            <summary>
+            Sets the status of the memory usage tracking subsystem in the SQLite core library.  By default, this is enabled.
+            If this is disabled, memory usage tracking will not be performed.  This is not really a per-connection value, it is
+            global to the process.
+            </summary>
+            <param name="value">Non-zero to enable memory usage tracking, zero otherwise.</param>
+            <returns>A standard SQLite return code (i.e. zero for success and non-zero for failure).</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.ReleaseMemory">
+            <summary>
+            Attempts to free as much heap memory as possible for the database connection.
+            </summary>
+            <returns>A standard SQLite return code (i.e. zero for success and non-zero for failure).</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Shutdown">
+            <summary>
+            Shutdown the SQLite engine so that it can be restarted with different config options.
+            We depend on auto initialization to recover.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.IsOpen">
+            <summary>
+            Determines if the associated native connection handle is open.
+            </summary>
+            <returns>
+            Non-zero if a database connection is open.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Open(System.String,System.Data.SQLite.SQLiteConnectionFlags,System.Data.SQLite.SQLiteOpenFlagsEnum,System.Int32,System.Boolean)">
+            <summary>
+            Opens a database.
+            </summary>
+            <remarks>
+            Implementers should call SQLiteFunction.BindFunctions() and save the array after opening a connection
+            to bind all attributed user-defined functions and collating sequences to the new connection.
+            </remarks>
+            <param name="strFilename">The filename of the database to open.  SQLite automatically creates it if it doesn't exist.</param>
+            <param name="connectionFlags">The flags associated with the parent connection object</param>
+            <param name="openFlags">The open flags to use when creating the connection</param>
+            <param name="maxPoolSize">The maximum size of the pool for the given filename</param>
+            <param name="usePool">If true, the connection can be pulled from the connection pool</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Close(System.Boolean)">
+            <summary>
+            Closes the currently-open database.
+            </summary>
+            <remarks>
+            After the database has been closed implemeters should call SQLiteFunction.UnbindFunctions() to deallocate all interop allocated
+            memory associated with the user-defined functions and collating sequences tied to the closed connection.
+            </remarks>
+            <param name="canThrow">Non-zero if the operation is allowed to throw exceptions, zero otherwise.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.SetTimeout(System.Int32)">
+            <summary>
+            Sets the busy timeout on the connection.  SQLiteCommand will call this before executing any command.
+            </summary>
+            <param name="nTimeoutMS">The number of milliseconds to wait before returning SQLITE_BUSY</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.GetLastError">
+            <summary>
+            Returns the text of the last error issued by SQLite
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.GetLastError(System.String)">
+            <summary>
+            Returns the text of the last error issued by SQLite -OR- the specified default error text if
+            none is available from the SQLite core library.
+            </summary>
+            <param name="defValue">
+            The error text to return in the event that one is not available from the SQLite core library.
+            </param>
+            <returns>
+            The error text.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.ClearPool">
+            <summary>
+            When pooling is enabled, force this connection to be disposed rather than returned to the pool
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.CountPool">
+            <summary>
+            When pooling is enabled, returns the number of pool entries matching the current file name.
+            </summary>
+            <returns>The number of pool entries matching the current file name.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Prepare(System.Data.SQLite.SQLiteConnection,System.String,System.Data.SQLite.SQLiteStatement,System.UInt32,System.String@)">
+            <summary>
+            Prepares a SQL statement for execution.
+            </summary>
+            <param name="cnn">The source connection preparing the command.  Can be null for any caller except LINQ</param>
+            <param name="strSql">The SQL command text to prepare</param>
+            <param name="previous">The previous statement in a multi-statement command, or null if no previous statement exists</param>
+            <param name="timeoutMS">The timeout to wait before aborting the prepare</param>
+            <param name="strRemain">The remainder of the statement that was not processed.  Each call to prepare parses the
+            SQL up to to either the end of the text or to the first semi-colon delimiter.  The remaining text is returned
+            here for a subsequent call to Prepare() until all the text has been processed.</param>
+            <returns>Returns an initialized SQLiteStatement.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Step(System.Data.SQLite.SQLiteStatement)">
+            <summary>
+            Steps through a prepared statement.
+            </summary>
+            <param name="stmt">The SQLiteStatement to step through</param>
+            <returns>True if a row was returned, False if not.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Reset(System.Data.SQLite.SQLiteStatement)">
+            <summary>
+            Resets a prepared statement so it can be executed again.  If the error returned is SQLITE_SCHEMA,
+            transparently attempt to rebuild the SQL statement and throw an error if that was not possible.
+            </summary>
+            <param name="stmt">The statement to reset</param>
+            <returns>Returns -1 if the schema changed while resetting, 0 if the reset was sucessful or 6 (SQLITE_LOCKED) if the reset failed due to a lock</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.Cancel">
+            <summary>
+            Attempts to interrupt the query currently executing on the associated
+            native database connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.BindFunction(System.Data.SQLite.SQLiteFunctionAttribute,System.Data.SQLite.SQLiteFunction,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            This function binds a user-defined functions to the connection.
+            </summary>
+            <param name="functionAttribute">
+            The <see cref="T:System.Data.SQLite.SQLiteFunctionAttribute"/> object instance containing
+            the metadata for the function to be bound.
+            </param>
+            <param name="function">
+            The <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance that implements the
+            function to be bound.
+            </param>
+            <param name="flags">
+            The flags associated with the parent connection object.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.CreateModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            Calls the native SQLite core library in order to create a disposable
+            module containing the implementation of a virtual table.
+            </summary>
+            <param name="module">
+            The module object to be used when creating the native disposable module.
+            </param>
+            <param name="flags">
+            The flags for the associated <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.DisposeModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            Calls the native SQLite core library in order to cleanup the resources
+            associated with a module containing the implementation of a virtual table.
+            </summary>
+            <param name="module">
+            The module object previously passed to the <see cref="M:System.Data.SQLite.SQLiteBase.CreateModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)"/>
+            method.
+            </param>
+            <param name="flags">
+            The flags for the associated <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.DeclareVirtualTable(System.Data.SQLite.SQLiteModule,System.String,System.String@)">
+            <summary>
+            Calls the native SQLite core library in order to declare a virtual table
+            in response to a call into the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/>
+            or <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> virtual table methods.
+            </summary>
+            <param name="module">
+            The virtual table module that is to be responsible for the virtual table
+            being declared.
+            </param>
+            <param name="strSql">
+            The string containing the SQL statement describing the virtual table to
+            be declared.
+            </param>
+            <param name="error">
+            Upon success, the contents of this parameter are undefined.  Upon failure,
+            it should contain an appropriate error message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.DeclareVirtualFunction(System.Data.SQLite.SQLiteModule,System.Int32,System.String,System.String@)">
+            <summary>
+            Calls the native SQLite core library in order to declare a virtual table
+            function in response to a call into the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/>
+            or <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> virtual table methods.
+            </summary>
+            <param name="module">
+            The virtual table module that is to be responsible for the virtual table
+            function being declared.
+            </param>
+            <param name="argumentCount">
+            The number of arguments to the function being declared.
+            </param>
+            <param name="name">
+            The name of the function being declared.
+            </param>
+            <param name="error">
+            Upon success, the contents of this parameter are undefined.  Upon failure,
+            it should contain an appropriate error message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.SetLoadExtension(System.Boolean)">
+            <summary>
+            Enables or disabled extension loading by SQLite.
+            </summary>
+            <param name="bOnOff">
+            True to enable loading of extensions, false to disable.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.LoadExtension(System.String,System.String)">
+            <summary>
+            Loads a SQLite extension library from the named file.
+            </summary>
+            <param name="fileName">
+            The name of the dynamic link library file containing the extension.
+            </param>
+            <param name="procName">
+            The name of the exported function used to initialize the extension.
+            If null, the default "sqlite3_extension_init" will be used.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.SetExtendedResultCodes(System.Boolean)">
+            <summary>
+            Enables or disabled extened result codes returned by SQLite
+            </summary>
+            <param name="bOnOff">true to enable extended result codes, false to disable.</param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.ResultCode">
+            <summary>
+            Returns the numeric result code for the most recent failed SQLite API call
+            associated with the database connection.
+            </summary>
+            <returns>Result code</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.ExtendedResultCode">
+            <summary>
+            Returns the extended numeric result code for the most recent failed SQLite API call
+            associated with the database connection.
+            </summary>
+            <returns>Extended result code</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.LogMessage(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            <summary>
+            Add a log message via the SQLite sqlite3_log interface.
+            </summary>
+            <param name="iErrCode">Error code to be logged with the message.</param>
+            <param name="zMessage">String to be logged.  Unlike the SQLite sqlite3_log()
+            interface, this should be pre-formatted.  Consider using the
+            String.Format() function.</param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.IsInitialized">
+            <summary>
+            Checks if the SQLite core library has been initialized in the current process.
+            </summary>
+            <returns>
+            Non-zero if the SQLite core library has been initialized in the current process,
+            zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.InitializeBackup(System.Data.SQLite.SQLiteConnection,System.String,System.String)">
+            <summary>
+            Creates a new SQLite backup object based on the provided destination
+            database connection.  The source database connection is the one
+            associated with this object.  The source and destination database
+            connections cannot be the same.
+            </summary>
+            <param name="destCnn">The destination database connection.</param>
+            <param name="destName">The destination database name.</param>
+            <param name="sourceName">The source database name.</param>
+            <returns>The newly created backup object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.StepBackup(System.Data.SQLite.SQLiteBackup,System.Int32,System.Boolean@)">
+            <summary>
+            Copies up to N pages from the source database to the destination
+            database associated with the specified backup object.
+            </summary>
+            <param name="backup">The backup object to use.</param>
+            <param name="nPage">
+            The number of pages to copy or negative to copy all remaining pages.
+            </param>
+            <param name="retry">
+            Set to true if the operation needs to be retried due to database
+            locking issues.
+            </param>
+            <returns>
+            True if there are more pages to be copied, false otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.RemainingBackup(System.Data.SQLite.SQLiteBackup)">
+            <summary>
+            Returns the number of pages remaining to be copied from the source
+            database to the destination database associated with the specified
+            backup object.
+            </summary>
+            <param name="backup">The backup object to check.</param>
+            <returns>The number of pages remaining to be copied.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.PageCountBackup(System.Data.SQLite.SQLiteBackup)">
+            <summary>
+            Returns the total number of pages in the source database associated
+            with the specified backup object.
+            </summary>
+            <param name="backup">The backup object to check.</param>
+            <returns>The total number of pages in the source database.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.FinishBackup(System.Data.SQLite.SQLiteBackup)">
+            <summary>
+            Destroys the backup object, rolling back any backup that may be in
+            progess.
+            </summary>
+            <param name="backup">The backup object to destroy.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.FallbackGetErrorString(System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Returns the error message for the specified SQLite return code using
+            the internal static lookup table.
+            </summary>
+            <param name="rc">The SQLite return code.</param>
+            <returns>The error message or null if it cannot be found.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBase.GetErrorString(System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Returns the error message for the specified SQLite return code using
+            the sqlite3_errstr() function, falling back to the internal lookup
+            table if necessary.
+            </summary>
+            <param name="rc">The SQLite return code.</param>
+            <returns>The error message or null if it cannot be found.</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.Version">
+            <summary>
+            Returns a string representing the active version of SQLite
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.VersionNumber">
+            <summary>
+            Returns an integer representing the active version of SQLite
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.LastInsertRowId">
+            <summary>
+            Returns the rowid of the most recent successful INSERT into the database from this connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.Changes">
+            <summary>
+            Returns the number of changes the last executing insert/update caused.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.MemoryUsed">
+            <summary>
+            Returns the amount of memory (in bytes) currently in use by the SQLite core library.  This is not really a per-connection
+            value, it is global to the process.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.MemoryHighwater">
+            <summary>
+            Returns the maximum amount of memory (in bytes) used by the SQLite core library since the high-water mark was last reset.
+            This is not really a per-connection value, it is global to the process.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.OwnHandle">
+            <summary>
+            Returns non-zero if the underlying native connection handle is owned by this instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteBase.AutoCommit">
+            <summary>
+            Returns non-zero if the given database connection is in autocommit mode.
+            Autocommit mode is on by default.  Autocommit mode is disabled by a BEGIN
+            statement.  Autocommit mode is re-enabled by a COMMIT or ROLLBACK.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLite3._sql">
+            <summary>
+            The opaque pointer returned to us by the sqlite provider
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLite3._functions">
+            <summary>
+            The user-defined functions registered on this connection
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLite3._modules">
+            <summary>
+            The modules created using this connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.#ctor(System.Data.SQLite.SQLiteDateFormats,System.DateTimeKind,System.String,System.IntPtr,System.String,System.Boolean)">
+            <summary>
+            Constructs the object used to interact with the SQLite core library
+            using the UTF-8 text encoding.
+            </summary>
+            <param name="fmt">
+            The DateTime format to be used when converting string values to a
+            DateTime and binding DateTime parameters.
+            </param>
+            <param name="kind">
+            The <see cref="T:System.DateTimeKind"/> to be used when creating DateTime
+            values.
+            </param>
+            <param name="fmtString">
+            The format string to be used when parsing and formatting DateTime
+            values.
+            </param>
+            <param name="db">
+            The native handle to be associated with the database connection.
+            </param>
+            <param name="fileName">
+            The fully qualified file name associated with <paramref name="db "/>.
+            </param>
+            <param name="ownHandle">
+            Non-zero if the newly created object instance will need to dispose
+            of <paramref name="db"/> when it is no longer needed.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.DisposeModules">
+            <summary>
+            This method attempts to dispose of all the <see cref="T:System.Data.SQLite.SQLiteModule"/> derived
+            object instances currently associated with the native database connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.Cancel">
+            <summary>
+            Attempts to interrupt the query currently executing on the associated
+            native database connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.BindFunction(System.Data.SQLite.SQLiteFunctionAttribute,System.Data.SQLite.SQLiteFunction,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            This function binds a user-defined function to the connection.
+            </summary>
+            <param name="functionAttribute">
+            The <see cref="T:System.Data.SQLite.SQLiteFunctionAttribute"/> object instance containing
+            the metadata for the function to be bound.
+            </param>
+            <param name="function">
+            The <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance that implements the
+            function to be bound.
+            </param>
+            <param name="flags">
+            The flags associated with the parent connection object.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.ReleaseMemory">
+            <summary>
+            Attempts to free as much heap memory as possible for the database connection.
+            </summary>
+            <returns>A standard SQLite return code (i.e. zero for success and non-zero for failure).</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.StaticReleaseMemory(System.Int32,System.Boolean,System.Boolean,System.Int32@,System.Boolean@,System.UInt32@)">
+            <summary>
+            Attempts to free N bytes of heap memory by deallocating non-essential memory
+            allocations held by the database library. Memory used to cache database pages
+            to improve performance is an example of non-essential memory.  This is a no-op
+            returning zero if the SQLite core library was not compiled with the compile-time
+            option SQLITE_ENABLE_MEMORY_MANAGEMENT.  Optionally, attempts to reset and/or
+            compact the Win32 native heap, if applicable.
+            </summary>
+            <param name="nBytes">
+            The requested number of bytes to free.
+            </param>
+            <param name="reset">
+            Non-zero to attempt a heap reset.
+            </param>
+            <param name="compact">
+            Non-zero to attempt heap compaction.
+            </param>
+            <param name="nFree">
+            The number of bytes actually freed.  This value may be zero.
+            </param>
+            <param name="resetOk">
+            This value will be non-zero if the heap reset was successful.
+            </param>
+            <param name="nLargest">
+            The size of the largest committed free block in the heap, in bytes.
+            This value will be zero unless heap compaction is enabled.
+            </param>
+            <returns>
+            A standard SQLite return code (i.e. zero for success and non-zero
+            for failure).
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.Shutdown">
+            <summary>
+            Shutdown the SQLite engine so that it can be restarted with different
+            configuration options.  We depend on auto initialization to recover.
+            </summary>
+            <returns>Returns a standard SQLite result code.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.StaticShutdown(System.Boolean)">
+            <summary>
+            Shutdown the SQLite engine so that it can be restarted with different
+            configuration options.  We depend on auto initialization to recover.
+            </summary>
+            <param name="directories">
+            Non-zero to reset the database and temporary directories to their
+            default values, which should be null for both.  This parameter has no
+            effect on non-Windows operating systems.
+            </param>
+            <returns>Returns a standard SQLite result code.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.IsOpen">
+            <summary>
+            Determines if the associated native connection handle is open.
+            </summary>
+            <returns>
+            Non-zero if the associated native connection handle is open.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.CreateModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            Calls the native SQLite core library in order to create a disposable
+            module containing the implementation of a virtual table.
+            </summary>
+            <param name="module">
+            The module object to be used when creating the native disposable module.
+            </param>
+            <param name="flags">
+            The flags for the associated <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.DisposeModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            Calls the native SQLite core library in order to cleanup the resources
+            associated with a module containing the implementation of a virtual table.
+            </summary>
+            <param name="module">
+            The module object previously passed to the <see cref="M:System.Data.SQLite.SQLite3.CreateModule(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteConnectionFlags)"/>
+            method.
+            </param>
+            <param name="flags">
+            The flags for the associated <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.DeclareVirtualTable(System.Data.SQLite.SQLiteModule,System.String,System.String@)">
+            <summary>
+            Calls the native SQLite core library in order to declare a virtual table
+            in response to a call into the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/>
+            or <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> virtual table methods.
+            </summary>
+            <param name="module">
+            The virtual table module that is to be responsible for the virtual table
+            being declared.
+            </param>
+            <param name="strSql">
+            The string containing the SQL statement describing the virtual table to
+            be declared.
+            </param>
+            <param name="error">
+            Upon success, the contents of this parameter are undefined.  Upon failure,
+            it should contain an appropriate error message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.DeclareVirtualFunction(System.Data.SQLite.SQLiteModule,System.Int32,System.String,System.String@)">
+            <summary>
+            Calls the native SQLite core library in order to declare a virtual table
+            function in response to a call into the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/>
+            or <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> virtual table methods.
+            </summary>
+            <param name="module">
+            The virtual table module that is to be responsible for the virtual table
+            function being declared.
+            </param>
+            <param name="argumentCount">
+            The number of arguments to the function being declared.
+            </param>
+            <param name="name">
+            The name of the function being declared.
+            </param>
+            <param name="error">
+            Upon success, the contents of this parameter are undefined.  Upon failure,
+            it should contain an appropriate error message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.SetLoadExtension(System.Boolean)">
+            <summary>
+            Enables or disabled extension loading by SQLite.
+            </summary>
+            <param name="bOnOff">
+            True to enable loading of extensions, false to disable.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.LoadExtension(System.String,System.String)">
+            <summary>
+            Loads a SQLite extension library from the named file.
+            </summary>
+            <param name="fileName">
+            The name of the dynamic link library file containing the extension.
+            </param>
+            <param name="procName">
+            The name of the exported function used to initialize the extension.
+            If null, the default "sqlite3_extension_init" will be used.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.SetExtendedResultCodes(System.Boolean)">
+            Enables or disabled extended result codes returned by SQLite
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.ResultCode">
+            Gets the last SQLite error code
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.ExtendedResultCode">
+            Gets the last SQLite extended error code
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.LogMessage(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            Add a log message via the SQLite sqlite3_log interface.
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.StaticLogMessage(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            Add a log message via the SQLite sqlite3_log interface.
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.SetLogCallback(System.Data.SQLite.SQLiteLogCallback)">
+            <summary>
+            Allows the setting of a logging callback invoked by SQLite when a
+            log event occurs.  Only one callback may be set.  If NULL is passed,
+            the logging callback is unregistered.
+            </summary>
+            <param name="func">The callback function to invoke.</param>
+            <returns>Returns a result code</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.InitializeBackup(System.Data.SQLite.SQLiteConnection,System.String,System.String)">
+            <summary>
+            Creates a new SQLite backup object based on the provided destination
+            database connection.  The source database connection is the one
+            associated with this object.  The source and destination database
+            connections cannot be the same.
+            </summary>
+            <param name="destCnn">The destination database connection.</param>
+            <param name="destName">The destination database name.</param>
+            <param name="sourceName">The source database name.</param>
+            <returns>The newly created backup object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.StepBackup(System.Data.SQLite.SQLiteBackup,System.Int32,System.Boolean@)">
+            <summary>
+            Copies up to N pages from the source database to the destination
+            database associated with the specified backup object.
+            </summary>
+            <param name="backup">The backup object to use.</param>
+            <param name="nPage">
+            The number of pages to copy, negative to copy all remaining pages.
+            </param>
+            <param name="retry">
+            Set to true if the operation needs to be retried due to database
+            locking issues; otherwise, set to false.
+            </param>
+            <returns>
+            True if there are more pages to be copied, false otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.RemainingBackup(System.Data.SQLite.SQLiteBackup)">
+            <summary>
+            Returns the number of pages remaining to be copied from the source
+            database to the destination database associated with the specified
+            backup object.
+            </summary>
+            <param name="backup">The backup object to check.</param>
+            <returns>The number of pages remaining to be copied.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.PageCountBackup(System.Data.SQLite.SQLiteBackup)">
+            <summary>
+            Returns the total number of pages in the source database associated
+            with the specified backup object.
+            </summary>
+            <param name="backup">The backup object to check.</param>
+            <returns>The total number of pages in the source database.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.FinishBackup(System.Data.SQLite.SQLiteBackup)">
+            <summary>
+            Destroys the backup object, rolling back any backup that may be in
+            progess.
+            </summary>
+            <param name="backup">The backup object to destroy.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.IsInitialized">
+            <summary>
+            Determines if the SQLite core library has been initialized for the
+            current process.
+            </summary>
+            <returns>
+            A boolean indicating whether or not the SQLite core library has been
+            initialized for the current process.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.StaticIsInitialized">
+            <summary>
+            Determines if the SQLite core library has been initialized for the
+            current process.
+            </summary>
+            <returns>
+            A boolean indicating whether or not the SQLite core library has been
+            initialized for the current process.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3.GetValue(System.Data.SQLite.SQLiteStatement,System.Data.SQLite.SQLiteConnectionFlags,System.Int32,System.Data.SQLite.SQLiteType)">
+            <summary>
+            Helper function to retrieve a column of data from an active statement.
+            </summary>
+            <param name="stmt">The statement being step()'d through</param>
+            <param name="flags">The flags associated with the connection.</param>
+            <param name="index">The column index to retrieve</param>
+            <param name="typ">The type of data contained in the column.  If Uninitialized, this function will retrieve the datatype information.</param>
+            <returns>Returns the data in the column</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLite3.OwnHandle">
+            <summary>
+            Returns non-zero if the underlying native connection handle is owned
+            by this instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLite3_UTF16">
+            <summary>
+            Alternate SQLite3 object, overriding many text behaviors to support UTF-16 (Unicode)
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3_UTF16.#ctor(System.Data.SQLite.SQLiteDateFormats,System.DateTimeKind,System.String,System.IntPtr,System.String,System.Boolean)">
+            <summary>
+            Constructs the object used to interact with the SQLite core library
+            using the UTF-8 text encoding.
+            </summary>
+            <param name="fmt">
+            The DateTime format to be used when converting string values to a
+            DateTime and binding DateTime parameters.
+            </param>
+            <param name="kind">
+            The <see cref="T:System.DateTimeKind"/> to be used when creating DateTime
+            values.
+            </param>
+            <param name="fmtString">
+            The format string to be used when parsing and formatting DateTime
+            values.
+            </param>
+            <param name="db">
+            The native handle to be associated with the database connection.
+            </param>
+            <param name="fileName">
+            The fully qualified file name associated with <paramref name="db"/>.
+            </param>
+            <param name="ownHandle">
+            Non-zero if the newly created object instance will need to dispose
+            of <paramref name="db"/> when it is no longer needed.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLite3_UTF16.ToString(System.IntPtr,System.Int32)">
+            <summary>
+            Overrides SQLiteConvert.ToString() to marshal UTF-16 strings instead of UTF-8
+            </summary>
+            <param name="b">A pointer to a UTF-16 string</param>
+            <param name="nbytelen">The length (IN BYTES) of the string</param>
+            <returns>A .NET string</returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteBackup">
+            <summary>
+            Represents a single SQL backup in SQLite.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._sql">
+            <summary>
+            The underlying SQLite object this backup is bound to.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._sqlite_backup">
+            <summary>
+            The actual backup handle.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._destDb">
+            <summary>
+            The destination database for the backup.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._zDestName">
+            <summary>
+            The destination database name for the backup.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._sourceDb">
+            <summary>
+            The source database for the backup.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._zSourceName">
+            <summary>
+            The source database name for the backup.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteBackup._stepResult">
+            <summary>
+            The last result from the StepBackup method of the SQLite3 class.
+            This is used to determine if the call to the FinishBackup method of
+            the SQLite3 class should throw an exception when it receives a non-Ok
+            return code from the core SQLite library.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBackup.#ctor(System.Data.SQLite.SQLiteBase,System.Data.SQLite.SQLiteBackupHandle,System.IntPtr,System.Byte[],System.IntPtr,System.Byte[])">
+            <summary>
+            Initializes the backup.
+            </summary>
+            <param name="sqlbase">The base SQLite object.</param>
+            <param name="backup">The backup handle.</param>
+            <param name="destDb">The destination database for the backup.</param>
+            <param name="zDestName">The destination database name for the backup.</param>
+            <param name="sourceDb">The source database for the backup.</param>
+            <param name="zSourceName">The source database name for the backup.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBackup.Dispose">
+            <summary>
+            Disposes and finalizes the backup.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnectionFlags">
+            <summary>
+            The extra behavioral flags that can be applied to a connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.None">
+            <summary>
+            No extra flags.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogPrepare">
+            <summary>
+            Enable logging of all SQL statements to be prepared.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogPreBind">
+            <summary>
+            Enable logging of all bound parameter types and raw values.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogBind">
+            <summary>
+            Enable logging of all bound parameter strongly typed values.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogCallbackException">
+            <summary>
+            Enable logging of all exceptions caught from user-provided
+            managed code called from native code via delegates.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogBackup">
+            <summary>
+            Enable logging of backup API errors.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.NoExtensionFunctions">
+            <summary>
+            Skip adding the extension functions provided by the native
+            interop assembly.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.BindUInt32AsInt64">
+            <summary>
+            When binding parameter values with the <see cref="T:System.UInt32"/>
+            type, use the interop method that accepts an <see cref="T:System.Int64"/>
+            value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.BindAllAsText">
+            <summary>
+            When binding parameter values, always bind them as though they were
+            plain text (i.e. no numeric, date/time, or other conversions should
+            be attempted).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.GetAllAsText">
+            <summary>
+            When returning column values, always return them as though they were
+            plain text (i.e. no numeric, date/time, or other conversions should
+            be attempted).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.NoLoadExtension">
+            <summary>
+            Prevent this <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance from
+            loading extensions.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.NoCreateModule">
+            <summary>
+            Prevent this <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance from
+            creating virtual table modules.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.NoBindFunctions">
+            <summary>
+            Skip binding any functions provided by other managed assemblies when
+            opening the connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.NoLogModule">
+            <summary>
+            Skip setting the logging related properties of the
+            <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance that was passed to
+            the <see cref="M:System.Data.SQLite.SQLiteConnection.CreateModule(System.Data.SQLite.SQLiteModule)"/> method.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogModuleError">
+            <summary>
+            Enable logging of all virtual table module errors seen by the
+            <see cref="M:System.Data.SQLite.SQLiteModule.SetTableError(System.IntPtr,System.String)"/> method.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogModuleException">
+            <summary>
+            Enable logging of certain virtual table module exceptions that cannot
+            be easily discovered via other means.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.TraceWarning">
+            <summary>
+            Enable tracing of potentially important [non-fatal] error conditions
+            that cannot be easily reported through other means.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.BindAndGetAllAsText">
+            <summary>
+            When binding and returning column values, always treat them as though
+            they were plain text (i.e. no numeric, date/time, or other conversions
+            should be attempted).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.LogAll">
+            <summary>
+            Enable all logging.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionFlags.Default">
+            <summary>
+            The default extra flags for new connections.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteCommand">
+            <summary>
+            SQLite implementation of DbCommand.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand.DefaultConnectionString">
+            <summary>
+            The default connection string to be used when creating a temporary
+            connection to execute a command via the static
+            <see cref="M:System.Data.SQLite.SQLiteCommand.Execute(System.String,System.Data.SQLite.SQLiteExecuteType,System.String,System.Object[])"/> or
+            <see cref="M:System.Data.SQLite.SQLiteCommand.Execute(System.String,System.Data.SQLite.SQLiteExecuteType,System.Data.CommandBehavior,System.String,System.Object[])"/>
+            methods.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._commandText">
+            <summary>
+            The command text this command is based on
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._cnn">
+            <summary>
+            The connection the command is associated with
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._version">
+            <summary>
+            The version of the connection the command is associated with
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._activeReader">
+            <summary>
+            Indicates whether or not a DataReader is active on the command.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._commandTimeout">
+            <summary>
+            The timeout for the command, kludged because SQLite doesn't support per-command timeout values
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._designTimeVisible">
+            <summary>
+            Designer support
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._updateRowSource">
+            <summary>
+            Used by DbDataAdapter to determine updating behavior
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._parameterCollection">
+            <summary>
+            The collection of parameters for the command
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._statementList">
+            <summary>
+            The SQL command text, broken into individual SQL statements as they are executed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._remainingText">
+            <summary>
+            Unprocessed SQL text that has not been executed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteCommand._transaction">
+            <summary>
+            Transaction associated with this command
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.#ctor">
+            <overloads>
+             Constructs a new SQLiteCommand
+             </overloads>
+             <summary>
+             Default constructor
+             </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.#ctor(System.String)">
+            <summary>
+            Initializes the command with the given command text
+            </summary>
+            <param name="commandText">The SQL command text</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.#ctor(System.String,System.Data.SQLite.SQLiteConnection)">
+            <summary>
+            Initializes the command with the given SQL command text and attach the command to the specified
+            connection.
+            </summary>
+            <param name="commandText">The SQL command text</param>
+            <param name="connection">The connection to associate with the command</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.#ctor(System.Data.SQLite.SQLiteConnection)">
+            <summary>
+            Initializes the command and associates it with the specified connection.
+            </summary>
+            <param name="connection">The connection to associate with the command</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.#ctor(System.String,System.Data.SQLite.SQLiteConnection,System.Data.SQLite.SQLiteTransaction)">
+            <summary>
+            Initializes a command with the given SQL, connection and transaction
+            </summary>
+            <param name="commandText">The SQL command text</param>
+            <param name="connection">The connection to associate with the command</param>
+            <param name="transaction">The transaction the command should be associated with</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.Dispose(System.Boolean)">
+            <summary>
+            Disposes of the command and clears all member variables
+            </summary>
+            <param name="disposing">Whether or not the class is being explicitly or implicitly disposed</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.GetFlags(System.Data.SQLite.SQLiteCommand)">
+            <summary>
+            This method attempts to query the flags associated with the database
+            connection in use.  If the database connection is disposed, the default
+            flags will be returned.
+            </summary>
+            <param name="command">
+            The command containing the databse connection to query the flags from.
+            </param>
+            <returns>
+            The connection flags value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ClearCommands">
+            <summary>
+            Clears and destroys all statements currently prepared
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.BuildNextCommand">
+            <summary>
+            Builds an array of prepared statements for each complete SQL statement in the command text
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.Cancel">
+            <summary>
+            Not implemented
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.CreateDbParameter">
+            <summary>
+            Forwards to the local CreateParameter() function
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.CreateParameter">
+            <summary>
+            Create a new parameter
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.InitializeForReader">
+            <summary>
+            This function ensures there are no active readers, that we have a valid connection,
+            that the connection is open, that all statements are prepared and all parameters are assigned
+            in preparation for allocating a data reader.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteDbDataReader(System.Data.CommandBehavior)">
+            <summary>
+            Creates a new SQLiteDataReader to execute/iterate the array of SQLite prepared statements
+            </summary>
+            <param name="behavior">The behavior the data reader should adopt</param>
+            <returns>Returns a SQLiteDataReader object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.Execute(System.String,System.Data.SQLite.SQLiteExecuteType,System.String,System.Object[])">
+            <summary>
+            This method creates a new connection, executes the query using the given
+            execution type, closes the connection, and returns the results.  If the
+            connection string is null, a temporary in-memory database connection will
+            be used.
+            </summary>
+            <param name="commandText">
+            The text of the command to be executed.
+            </param>
+            <param name="executeType">
+            The execution type for the command.  This is used to determine which method
+            of the command object to call, which then determines the type of results
+            returned, if any.
+            </param>
+            <param name="connectionString">
+            The connection string to the database to be opened, used, and closed.  If
+            this parameter is null, a temporary in-memory databse will be used.
+            </param>
+            <param name="args">
+            The SQL parameter values to be used when building the command object to be
+            executed, if any.
+            </param>
+            <returns>
+            The results of the query -OR- null if no results were produced from the
+            given execution type.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.Execute(System.String,System.Data.SQLite.SQLiteExecuteType,System.Data.CommandBehavior,System.String,System.Object[])">
+            <summary>
+            This method creates a new connection, executes the query using the given
+            execution type and command behavior, closes the connection, and returns
+            the results.  If the connection string is null, a temporary in-memory
+            database connection will be used.
+            </summary>
+            <param name="commandText">
+            The text of the command to be executed.
+            </param>
+            <param name="executeType">
+            The execution type for the command.  This is used to determine which method
+            of the command object to call, which then determines the type of results
+            returned, if any.
+            </param>
+            <param name="commandBehavior">
+            The command behavior flags for the command.
+            </param>
+            <param name="connectionString">
+            The connection string to the database to be opened, used, and closed.  If
+            this parameter is null, a temporary in-memory databse will be used.
+            </param>
+            <param name="args">
+            The SQL parameter values to be used when building the command object to be
+            executed, if any.
+            </param>
+            <returns>
+            The results of the query -OR- null if no results were produced from the
+            given execution type.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteReader(System.Data.CommandBehavior)">
+            <summary>
+            Overrides the default behavior to return a SQLiteDataReader specialization class
+            </summary>
+            <param name="behavior">The flags to be associated with the reader.</param>
+            <returns>A SQLiteDataReader</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteReader">
+            <summary>
+            Overrides the default behavior of DbDataReader to return a specialized SQLiteDataReader class
+            </summary>
+            <returns>A SQLiteDataReader</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ClearDataReader">
+            <summary>
+            Called by the SQLiteDataReader when the data reader is closed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteNonQuery">
+            <summary>
+            Execute the command and return the number of rows inserted/updated affected by it.
+            </summary>
+            <returns>The number of rows inserted/updated affected by it.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteNonQuery(System.Data.CommandBehavior)">
+            <summary>
+            Execute the command and return the number of rows inserted/updated affected by it.
+            </summary>
+            <param name="behavior">The flags to be associated with the reader.</param>
+            <returns>The number of rows inserted/updated affected by it.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteScalar">
+            <summary>
+            Execute the command and return the first column of the first row of the resultset
+            (if present), or null if no resultset was returned.
+            </summary>
+            <returns>The first column of the first row of the first resultset from the query.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.ExecuteScalar(System.Data.CommandBehavior)">
+            <summary>
+            Execute the command and return the first column of the first row of the resultset
+            (if present), or null if no resultset was returned.
+            </summary>
+            <param name="behavior">The flags to be associated with the reader.</param>
+            <returns>The first column of the first row of the first resultset from the query.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.Prepare">
+            <summary>
+            Does nothing.  Commands are prepared as they are executed the first time, and kept in prepared state afterwards.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommand.Clone">
+            <summary>
+            Clones a command, including all its parameters
+            </summary>
+            <returns>A new SQLiteCommand with the same commandtext, connection and parameters</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.CommandText">
+            <summary>
+            The SQL command text associated with the command
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.CommandTimeout">
+            <summary>
+            The amount of time to wait for the connection to become available before erroring out
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.CommandType">
+            <summary>
+            The type of the command.  SQLite only supports CommandType.Text
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.Connection">
+            <summary>
+            The connection associated with this command
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.DbConnection">
+            <summary>
+            Forwards to the local Connection property
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.Parameters">
+            <summary>
+            Returns the SQLiteParameterCollection for the given command
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.DbParameterCollection">
+            <summary>
+            Forwards to the local Parameters property
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.Transaction">
+            <summary>
+            The transaction associated with this command.  SQLite only supports one transaction per connection, so this property forwards to the
+            command's underlying connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.DbTransaction">
+            <summary>
+            Forwards to the local Transaction property
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.UpdatedRowSource">
+            <summary>
+            Sets the method the SQLiteCommandBuilder uses to determine how to update inserted or updated rows in a DataTable.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommand.DesignTimeVisible">
+            <summary>
+            Determines if the command is visible at design time.  Defaults to True.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteCommandBuilder">
+            <summary>
+            SQLite implementation of DbCommandBuilder.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.#ctor(System.Data.SQLite.SQLiteDataAdapter)">
+            <summary>
+            Initializes the command builder and associates it with the specified data adapter.
+            </summary>
+            <param name="adp"></param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.ApplyParameterInfo(System.Data.Common.DbParameter,System.Data.DataRow,System.Data.StatementType,System.Boolean)">
+            <summary>
+            Minimal amount of parameter processing.  Primarily sets the DbType for the parameter equal to the provider type in the schema
+            </summary>
+            <param name="parameter">The parameter to use in applying custom behaviors to a row</param>
+            <param name="row">The row to apply the parameter to</param>
+            <param name="statementType">The type of statement</param>
+            <param name="whereClause">Whether the application of the parameter is part of a WHERE clause</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetParameterName(System.String)">
+            <summary>
+            Returns a valid named parameter
+            </summary>
+            <param name="parameterName">The name of the parameter</param>
+            <returns>Error</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetParameterName(System.Int32)">
+            <summary>
+            Returns a named parameter for the given ordinal
+            </summary>
+            <param name="parameterOrdinal">The i of the parameter</param>
+            <returns>Error</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetParameterPlaceholder(System.Int32)">
+            <summary>
+            Returns a placeholder character for the specified parameter i.
+            </summary>
+            <param name="parameterOrdinal">The index of the parameter to provide a placeholder for</param>
+            <returns>Returns a named parameter</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.SetRowUpdatingHandler(System.Data.Common.DbDataAdapter)">
+            <summary>
+            Sets the handler for receiving row updating events.  Used by the DbCommandBuilder to autogenerate SQL
+            statements that may not have previously been generated.
+            </summary>
+            <param name="adapter">A data adapter to receive events on.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetDeleteCommand">
+            <summary>
+            Returns the automatically-generated SQLite command to delete rows from the database
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetDeleteCommand(System.Boolean)">
+            <summary>
+            Returns the automatically-generated SQLite command to delete rows from the database
+            </summary>
+            <param name="useColumnsForParameterNames"></param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetUpdateCommand">
+            <summary>
+            Returns the automatically-generated SQLite command to update rows in the database
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetUpdateCommand(System.Boolean)">
+            <summary>
+            Returns the automatically-generated SQLite command to update rows in the database
+            </summary>
+            <param name="useColumnsForParameterNames"></param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetInsertCommand">
+            <summary>
+            Returns the automatically-generated SQLite command to insert rows into the database
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetInsertCommand(System.Boolean)">
+            <summary>
+            Returns the automatically-generated SQLite command to insert rows into the database
+            </summary>
+            <param name="useColumnsForParameterNames"></param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.QuoteIdentifier(System.String)">
+            <summary>
+            Places brackets around an identifier
+            </summary>
+            <param name="unquotedIdentifier">The identifier to quote</param>
+            <returns>The bracketed identifier</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.UnquoteIdentifier(System.String)">
+            <summary>
+            Removes brackets around an identifier
+            </summary>
+            <param name="quotedIdentifier">The quoted (bracketed) identifier</param>
+            <returns>The undecorated identifier</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteCommandBuilder.GetSchemaTable(System.Data.Common.DbCommand)">
+            <summary>
+            Override helper, which can help the base command builder choose the right keys for the given query
+            </summary>
+            <param name="sourceCommand"></param>
+            <returns></returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommandBuilder.DataAdapter">
+            <summary>
+            Gets/sets the DataAdapter for this CommandBuilder
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommandBuilder.CatalogLocation">
+            <summary>
+            Overridden to hide its property from the designer
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommandBuilder.CatalogSeparator">
+            <summary>
+            Overridden to hide its property from the designer
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommandBuilder.QuotePrefix">
+            <summary>
+            Overridden to hide its property from the designer
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommandBuilder.QuoteSuffix">
+            <summary>
+            Overridden to hide its property from the designer
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteCommandBuilder.SchemaSeparator">
+            <summary>
+            Overridden to hide its property from the designer
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.ConnectionEventArgs">
+            <summary>
+            Event data for connection event handlers.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.EventType">
+            <summary>
+            The type of event being raised.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.EventArgs">
+            <summary>
+            The <see cref="T:System.Data.StateChangeEventArgs"/> associated with this event, if any.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.Transaction">
+            <summary>
+            The transaction associated with this event, if any.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.Command">
+            <summary>
+            The command associated with this event, if any.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.DataReader">
+            <summary>
+            The data reader associated with this event, if any.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.CriticalHandle">
+            <summary>
+            The critical handle associated with this event, if any.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.Text">
+            <summary>
+            Command or message text associated with this event, if any.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.ConnectionEventArgs.Data">
+            <summary>
+            Extra data associated with this event, if any.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.ConnectionEventArgs.#ctor(System.Data.SQLite.SQLiteConnectionEventType,System.Data.StateChangeEventArgs,System.Data.IDbTransaction,System.Data.IDbCommand,System.Data.IDataReader,System.Runtime.InteropServices.CriticalHandle,System.String,System.Object)">
+            <summary>
+            Constructs the object.
+            </summary>
+            <param name="eventType">The type of event being raised.</param>
+            <param name="eventArgs">The base <see cref="F:System.Data.SQLite.ConnectionEventArgs.EventArgs"/> associated
+            with this event, if any.</param>
+            <param name="transaction">The transaction associated with this event, if any.</param>
+            <param name="command">The command associated with this event, if any.</param>
+            <param name="dataReader">The data reader associated with this event, if any.</param>
+            <param name="criticalHandle">The critical handle associated with this event, if any.</param>
+            <param name="text">The command or message text, if any.</param>
+            <param name="data">The extra data, if any.</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnectionEventHandler">
+            <summary>
+            Raised when an event pertaining to a connection occurs.
+            </summary>
+            <param name="sender">The connection involved.</param>
+            <param name="e">Extra information about the event.</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnection">
+            <summary>
+            SQLite implentation of DbConnection.
+            </summary>
+            <remarks>
+            The <see cref="P:System.Data.SQLite.SQLiteConnection.ConnectionString"/> property can contain the following parameter(s), delimited with a semi-colon:
+            <list type="table">
+            <listheader>
+            <term>Parameter</term>
+            <term>Values</term>
+            <term>Required</term>
+            <term>Default</term>
+            </listheader>
+            <item>
+            <description>Data Source</description>
+            <description>
+            This may be a file name, the string ":memory:", or any supported URI (starting with SQLite 3.7.7).
+            Starting with release 1.0.86.0, in order to use more than one consecutive backslash (e.g. for a
+            UNC path), each of the adjoining backslash characters must be doubled (e.g. "\\Network\Share\test.db"
+            would become "\\\\Network\Share\test.db").
+            </description>
+            <description>Y</description>
+            <description></description>
+            </item>
+            <item>
+            <description>Version</description>
+            <description>3</description>
+            <description>N</description>
+            <description>3</description>
+            </item>
+            <item>
+            <description>UseUTF16Encoding</description>
+            <description><b>True</b><br/><b>False</b></description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>DateTimeFormat</description>
+            <description>
+            <b>Ticks</b> - Use the value of DateTime.Ticks.<br/>
+            <b>ISO8601</b> - Use the ISO-8601 format.  Uses the "yyyy-MM-dd HH:mm:ss.FFFFFFFK" format for UTC
+            DateTime values and "yyyy-MM-dd HH:mm:ss.FFFFFFF" format for local DateTime values).<br/>
+            <b>JulianDay</b> - The interval of time in days and fractions of a day since January 1, 4713 BC.<br/>
+            <b>UnixEpoch</b> - The whole number of seconds since the Unix epoch (January 1, 1970).<br/>
+            <b>InvariantCulture</b> - Any culture-independent string value that the .NET Framework can interpret as a valid DateTime.<br/>
+            <b>CurrentCulture</b> - Any string value that the .NET Framework can interpret as a valid DateTime using the current culture.</description>
+            <description>N</description>
+            <description>ISO8601</description>
+            </item>
+            <item>
+            <description>DateTimeKind</description>
+            <description><b>Unspecified</b> - Not specified as either UTC or local time.<br/><b>Utc</b> - The time represented is UTC.<br/><b>Local</b> - The time represented is local time.</description>
+            <description>N</description>
+            <description>Unspecified</description>
+            </item>
+            <item>
+            <description>DateTimeFormatString</description>
+            <description>The exact DateTime format string to use for all formatting and parsing of all DateTime
+            values for this connection.</description>
+            <description>N</description>
+            <description>null</description>
+            </item>
+            <item>
+            <description>BaseSchemaName</description>
+            <description>Some base data classes in the framework (e.g. those that build SQL queries dynamically)
+            assume that an ADO.NET provider cannot support an alternate catalog (i.e. database) without supporting
+            alternate schemas as well; however, SQLite does not fit into this model.  Therefore, this value is used
+            as a placeholder and removed prior to preparing any SQL statements that may contain it.</description>
+            <description>N</description>
+            <description>sqlite_default_schema</description>
+            </item>
+            <item>
+            <description>BinaryGUID</description>
+            <description><b>True</b> - Store GUID columns in binary form<br/><b>False</b> - Store GUID columns as text</description>
+            <description>N</description>
+            <description>True</description>
+            </item>
+            <item>
+            <description>Cache Size</description>
+            <description>{size in bytes}</description>
+            <description>N</description>
+            <description>2000</description>
+            </item>
+            <item>
+            <description>Synchronous</description>
+            <description><b>Normal</b> - Normal file flushing behavior<br/><b>Full</b> - Full flushing after all writes<br/><b>Off</b> - Underlying OS flushes I/O's</description>
+            <description>N</description>
+            <description>Full</description>
+            </item>
+            <item>
+            <description>Page Size</description>
+            <description>{size in bytes}</description>
+            <description>N</description>
+            <description>1024</description>
+            </item>
+            <item>
+            <description>Password</description>
+            <description>{password} - Using this parameter requires that the CryptoAPI based codec be enabled at compile-time for both the native interop assembly and the core managed assemblies; otherwise, using this parameter may result in an exception being thrown when attempting to open the connection.</description>
+            <description>N</description>
+            <description></description>
+            </item>
+            <item>
+            <description>HexPassword</description>
+            <description>{hexPassword} - Must contain a sequence of zero or more hexadecimal encoded byte values without a leading "0x" prefix.  Using this parameter requires that the CryptoAPI based codec be enabled at compile-time for both the native interop assembly and the core managed assemblies; otherwise, using this parameter may result in an exception being thrown when attempting to open the connection.</description>
+            <description>N</description>
+            <description></description>
+            </item>
+            <item>
+            <description>Enlist</description>
+            <description><b>Y</b> - Automatically enlist in distributed transactions<br/><b>N</b> - No automatic enlistment</description>
+            <description>N</description>
+            <description>Y</description>
+            </item>
+            <item>
+            <description>Pooling</description>
+            <description>
+            <b>True</b> - Use connection pooling.<br/>
+            <b>False</b> - Do not use connection pooling.<br/><br/>
+            <b>WARNING:</b> When using the default connection pool implementation,
+            setting this property to True should be avoided by applications that make
+            use of COM (either directly or indirectly) due to possible deadlocks that
+            can occur during the finalization of some COM objects.
+            </description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>FailIfMissing</description>
+            <description><b>True</b> - Don't create the database if it does not exist, throw an error instead<br/><b>False</b> - Automatically create the database if it does not exist</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Max Page Count</description>
+            <description>{size in pages} - Limits the maximum number of pages (limits the size) of the database</description>
+            <description>N</description>
+            <description>0</description>
+            </item>
+            <item>
+            <description>Legacy Format</description>
+            <description><b>True</b> - Use the more compatible legacy 3.x database format<br/><b>False</b> - Use the newer 3.3x database format which compresses numbers more effectively</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Default Timeout</description>
+            <description>{time in seconds}<br/>The default command timeout</description>
+            <description>N</description>
+            <description>30</description>
+            </item>
+            <item>
+            <description>Journal Mode</description>
+            <description><b>Delete</b> - Delete the journal file after a commit<br/><b>Persist</b> - Zero out and leave the journal file on disk after a commit<br/><b>Off</b> - Disable the rollback journal entirely</description>
+            <description>N</description>
+            <description>Delete</description>
+            </item>
+            <item>
+            <description>Read Only</description>
+            <description><b>True</b> - Open the database for read only access<br/><b>False</b> - Open the database for normal read/write access</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Max Pool Size</description>
+            <description>The maximum number of connections for the given connection string that can be in the connection pool</description>
+            <description>N</description>
+            <description>100</description>
+            </item>
+            <item>
+            <description>Default IsolationLevel</description>
+            <description>The default transaciton isolation level</description>
+            <description>N</description>
+            <description>Serializable</description>
+            </item>
+            <item>
+            <description>Foreign Keys</description>
+            <description>Enable foreign key constraints</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Flags</description>
+            <description>Extra behavioral flags for the connection.  See the <see cref="T:System.Data.SQLite.SQLiteConnectionFlags"/> enumeration for possible values.</description>
+            <description>N</description>
+            <description>Default</description>
+            </item>
+            <item>
+            <description>SetDefaults</description>
+            <description>
+            <b>True</b> - Apply the default connection settings to the opened database.<br/>
+            <b>False</b> - Skip applying the default connection settings to the opened database.
+            </description>
+            <description>N</description>
+            <description>True</description>
+            </item>
+            <item>
+            <description>ToFullPath</description>
+            <description>
+            <b>True</b> - Attempt to expand the data source file name to a fully qualified path before opening.<br/>
+            <b>False</b> - Skip attempting to expand the data source file name to a fully qualified path before opening.
+            </description>
+            <description>N</description>
+            <description>True</description>
+            </item>
+            </list>
+            </remarks>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection.DefaultBaseSchemaName">
+            <summary>
+            The default "stub" (i.e. placeholder) base schema name to use when
+            returning column schema information.  Used as the initial value of
+            the BaseSchemaName property.  This should start with "sqlite_*"
+            because those names are reserved for use by SQLite (i.e. they cannot
+            be confused with the names of user objects).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._assembly">
+            <summary>
+            The managed assembly containing this type.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._syncRoot">
+            <summary>
+            Object used to synchronize access to the static instance data
+            for this class.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._connectionState">
+            <summary>
+            State of the current connection
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._connectionString">
+            <summary>
+            The connection string
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._transactionLevel">
+            <summary>
+            Nesting level of the transactions open on the connection
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._disposing">
+            <summary>
+            If set, then the connection is currently being disposed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._defaultIsolation">
+            <summary>
+            The default isolation level for new transactions
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._enlistment">
+            <summary>
+            Whether or not the connection is enlisted in a distrubuted transaction
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._sql">
+            <summary>
+            The base SQLite object to interop with
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._dataSource">
+            <summary>
+            The database filename minus path and extension
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._password">
+            <summary>
+            Temporary password storage, emptied after the database has been opened
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._baseSchemaName">
+            <summary>
+            The "stub" (i.e. placeholder) base schema name to use when returning
+            column schema information.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._flags">
+            <summary>
+            The extra behavioral flags for this connection, if any.  See the
+            <see cref="T:System.Data.SQLite.SQLiteConnectionFlags"/> enumeration for a list of
+            possible values.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._defaultTimeout">
+            <summary>
+            Default command timeout
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnection._parseViaFramework">
+            <summary>
+            Non-zero if the built-in (i.e. framework provided) connection string
+            parser should be used when opening the connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.#ctor">
+            <overloads>
+             Constructs a new SQLiteConnection object
+             </overloads>
+             <summary>
+             Default constructor
+             </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.#ctor(System.String)">
+            <summary>
+            Initializes the connection with the specified connection string.
+            </summary>
+            <param name="connectionString">The connection string to use.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.#ctor(System.IntPtr,System.String,System.Boolean)">
+            <summary>
+            Initializes the connection with a pre-existing native connection handle.
+            This constructor overload is intended to be used only by the private
+            <see cref="M:System.Data.SQLite.SQLiteModule.CreateOrConnect(System.Boolean,System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="db">
+            The native connection handle to use.
+            </param>
+            <param name="fileName">
+            The file name corresponding to the native connection handle.
+            </param>
+            <param name="ownHandle">
+            Non-zero if this instance owns the native connection handle and
+            should dispose of it when it is no longer needed.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.#ctor(System.String,System.Boolean)">
+            <summary>
+            Initializes the connection with the specified connection string.
+            </summary>
+            <param name="connectionString">
+            The connection string to use.
+            </param>
+            <param name="parseViaFramework">
+            Non-zero to parse the connection string using the built-in (i.e.
+            framework provided) parser when opening the connection.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.#ctor(System.Data.SQLite.SQLiteConnection)">
+            <summary>
+            Clones the settings and connection string from an existing connection.  If the existing connection is already open, this
+            function will open its own connection, enumerate any attached databases of the original connection, and automatically
+            attach to them.
+            </summary>
+            <param name="connection">The connection to copy the settings from.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.OnChanged(System.Data.SQLite.SQLiteConnection,System.Data.SQLite.ConnectionEventArgs)">
+            <summary>
+            Raises the <see cref="E:System.Data.SQLite.SQLiteConnection.Changed"/> event.
+            </summary>
+            <param name="connection">
+            The connection associated with this event.  If this parameter is not
+            null and the specified connection cannot raise events, then the
+            registered event handlers will not be invoked.
+            </param>
+            <param name="e">
+            A <see cref="T:System.Data.SQLite.ConnectionEventArgs"/> that contains the event data.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.CreateHandle(System.IntPtr)">
+            <summary>
+            Creates and returns a new managed database connection handle.  This
+            method is intended to be used by implementations of the
+            <see cref="T:System.Data.SQLite.ISQLiteConnectionPool"/> interface only.  In theory, it
+            could be used by other classes; however, that usage is not supported.
+            </summary>
+            <param name="nativeHandle">
+            This must be a native database connection handle returned by the
+            SQLite core library and it must remain valid and open during the
+            entire duration of the calling method.
+            </param>
+            <returns>
+            The new managed database connection handle or null if it cannot be
+            created.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BackupDatabase(System.Data.SQLite.SQLiteConnection,System.String,System.String,System.Int32,System.Data.SQLite.SQLiteBackupCallback,System.Int32)">
+            <summary>
+            Backs up the database, using the specified database connection as the
+            destination.
+            </summary>
+            <param name="destination">The destination database connection.</param>
+            <param name="destinationName">The destination database name.</param>
+            <param name="sourceName">The source database name.</param>
+            <param name="pages">
+            The number of pages to copy or negative to copy all remaining pages.
+            </param>
+            <param name="callback">
+            The method to invoke between each step of the backup process.  This
+            parameter may be null (i.e. no callbacks will be performed).
+            </param>
+            <param name="retryMilliseconds">
+            The number of milliseconds to sleep after encountering a locking error
+            during the backup process.  A value less than zero means that no sleep
+            should be performed.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BindFunction(System.Data.SQLite.SQLiteFunctionAttribute,System.Data.SQLite.SQLiteFunction)">
+            <summary>
+            Attempts to bind the specified <see cref="T:System.Data.SQLite.SQLiteFunction"/> object
+            instance to this connection.
+            </summary>
+            <param name="functionAttribute">
+            The <see cref="T:System.Data.SQLite.SQLiteFunctionAttribute"/> object instance containing
+            the metadata for the function to be bound.
+            </param>
+            <param name="function">
+            The <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance that implements the
+            function to be bound.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Clone">
+            <summary>
+            Creates a clone of the connection.  All attached databases and user-defined functions are cloned.  If the existing connection is open, the cloned connection
+            will also be opened.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.CreateFile(System.String)">
+            <summary>
+            Creates a database file.  This just creates a zero-byte file which SQLite
+            will turn into a database when the file is opened properly.
+            </summary>
+            <param name="databaseFileName">The file to create</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.OnStateChange(System.Data.ConnectionState,System.Data.StateChangeEventArgs@)">
+            <summary>
+            Raises the state change event when the state of the connection changes
+            </summary>
+            <param name="newState">The new connection state.  If this is different
+            from the previous state, the <see cref="E:System.Data.SQLite.SQLiteConnection.StateChange"/> event is
+            raised.</param>
+            <param name="eventArgs">The event data created for the raised event, if
+            it was actually raised.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.GetFallbackDefaultIsolationLevel">
+            <summary>
+            Determines and returns the fallback default isolation level when one cannot be
+            obtained from an existing connection instance.
+            </summary>
+            <returns>
+            The fallback default isolation level for this connection instance -OR-
+            <see cref="F:System.Data.IsolationLevel.Unspecified"/> if it cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.GetDefaultIsolationLevel">
+            <summary>
+            Determines and returns the default isolation level for this connection instance.
+            </summary>
+            <returns>
+            The default isolation level for this connection instance -OR-
+            <see cref="F:System.Data.IsolationLevel.Unspecified"/> if it cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BeginTransaction(System.Data.IsolationLevel,System.Boolean)">
+            <summary>
+            OBSOLETE.  Creates a new SQLiteTransaction if one isn't already active on the connection.
+            </summary>
+            <param name="isolationLevel">This parameter is ignored.</param>
+            <param name="deferredLock">When TRUE, SQLite defers obtaining a write lock until a write operation is requested.
+            When FALSE, a writelock is obtained immediately.  The default is TRUE, but in a multi-threaded multi-writer
+            environment, one may instead choose to lock the database immediately to avoid any possible writer deadlock.</param>
+            <returns>Returns a SQLiteTransaction object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BeginTransaction(System.Boolean)">
+            <summary>
+            OBSOLETE.  Creates a new SQLiteTransaction if one isn't already active on the connection.
+            </summary>
+            <param name="deferredLock">When TRUE, SQLite defers obtaining a write lock until a write operation is requested.
+            When FALSE, a writelock is obtained immediately.  The default is false, but in a multi-threaded multi-writer
+            environment, one may instead choose to lock the database immediately to avoid any possible writer deadlock.</param>
+            <returns>Returns a SQLiteTransaction object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BeginTransaction(System.Data.IsolationLevel)">
+            <summary>
+            Creates a new <see cref="T:System.Data.SQLite.SQLiteTransaction"/> if one isn't already active on the connection.
+            </summary>
+            <param name="isolationLevel">Supported isolation levels are Serializable, ReadCommitted and Unspecified.</param>
+            <remarks>
+            Unspecified will use the default isolation level specified in the connection string.  If no isolation level is specified in the
+            connection string, Serializable is used.
+            Serializable transactions are the default.  In this mode, the engine gets an immediate lock on the database, and no other threads
+            may begin a transaction.  Other threads may read from the database, but not write.
+            With a ReadCommitted isolation level, locks are deferred and elevated as needed.  It is possible for multiple threads to start
+            a transaction in ReadCommitted mode, but if a thread attempts to commit a transaction while another thread
+            has a ReadCommitted lock, it may timeout or cause a deadlock on both threads until both threads' CommandTimeout's are reached.
+            </remarks>
+            <returns>Returns a SQLiteTransaction object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BeginTransaction">
+            <summary>
+            Creates a new <see cref="T:System.Data.SQLite.SQLiteTransaction"/> if one isn't already
+            active on the connection.
+            </summary>
+            <returns>Returns the new transaction object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.BeginDbTransaction(System.Data.IsolationLevel)">
+            <summary>
+            Forwards to the local <see cref="M:System.Data.SQLite.SQLiteConnection.BeginTransaction(System.Data.IsolationLevel)"/> function
+            </summary>
+            <param name="isolationLevel">Supported isolation levels are Unspecified, Serializable, and ReadCommitted</param>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ChangeDatabase(System.String)">
+            <summary>
+            This method is not implemented; however, the <see cref="E:System.Data.SQLite.SQLiteConnection.Changed"/>
+            event will still be raised.
+            </summary>
+            <param name="databaseName"></param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Close">
+            <summary>
+            When the database connection is closed, all commands linked to this connection are automatically reset.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ClearPool(System.Data.SQLite.SQLiteConnection)">
+            <summary>
+            Clears the connection pool associated with the connection.  Any other active connections using the same database file
+            will be discarded instead of returned to the pool when they are closed.
+            </summary>
+            <param name="connection"></param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ClearAllPools">
+            <summary>
+            Clears all connection pools.  Any active connections will be discarded instead of sent to the pool when they are closed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.CreateCommand">
+            <summary>
+            Create a new <see cref="T:System.Data.SQLite.SQLiteCommand"/> and associate it with this connection.
+            </summary>
+            <returns>Returns a new command object already assigned to this connection.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.CreateDbCommand">
+            <summary>
+            Forwards to the local <see cref="M:System.Data.SQLite.SQLiteConnection.CreateCommand"/> function.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ParseConnectionString(System.String)">
+            <summary>
+            Parses the connection string into component parts using the custom
+            connection string parser.
+            </summary>
+            <param name="connectionString">The connection string to parse</param>
+            <returns>An array of key-value pairs representing each parameter of the connection string</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ParseConnectionStringViaFramework(System.String,System.Boolean)">
+            <summary>
+            Parses a connection string using the built-in (i.e. framework provided)
+            connection string parser class and returns the key/value pairs.  An
+            exception may be thrown if the connection string is invalid or cannot be
+            parsed.  When compiled for the .NET Compact Framework, the custom
+            connection string parser is always used instead because the framework
+            provided one is unavailable there.
+            </summary>
+            <param name="connectionString">
+            The connection string to parse.
+            </param>
+            <param name="strict">
+            Non-zero to throw an exception if any connection string values are not of
+            the <see cref="T:System.String"/> type.
+            </param>
+            <returns>The list of key/value pairs.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.EnlistTransaction(System.Transactions.Transaction)">
+            <summary>
+            Manual distributed transaction enlistment support
+            </summary>
+            <param name="transaction">The distributed transaction to enlist in</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.FindKey(System.Collections.Generic.SortedList{System.String,System.String},System.String,System.String)">
+            <summary>
+            Looks for a key in the array of key/values of the parameter string.  If not found, return the specified default value
+            </summary>
+            <param name="items">The list to look in</param>
+            <param name="key">The key to find</param>
+            <param name="defValue">The default value to return if the key is not found</param>
+            <returns>The value corresponding to the specified key, or the default value if not found.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.TryParseEnum(System.Type,System.String,System.Boolean)">
+            <summary>
+            Attempts to convert the string value to an enumerated value of the specified type.
+            </summary>
+            <param name="type">The enumerated type to convert the string value to.</param>
+            <param name="value">The string value to be converted.</param>
+            <param name="ignoreCase">Non-zero to make the conversion case-insensitive.</param>
+            <returns>The enumerated value upon success or null upon error.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.TryParseByte(System.String,System.Globalization.NumberStyles,System.Byte@)">
+            <summary>
+            Attempts to convert an input string into a byte value.
+            </summary>
+            <param name="value">
+            The string value to be converted.
+            </param>
+            <param name="style">
+            The number styles to use for the conversion.
+            </param>
+            <param name="result">
+            Upon sucess, this will contain the parsed byte value.
+            Upon failure, the value of this parameter is undefined.
+            </param>
+            <returns>
+            Non-zero upon success; zero on failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.EnableExtensions(System.Boolean)">
+            <summary>
+            Enables or disabled extension loading.
+            </summary>
+            <param name="enable">
+            True to enable loading of extensions, false to disable.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.LoadExtension(System.String)">
+            <summary>
+            Loads a SQLite extension library from the named dynamic link library file.
+            </summary>
+            <param name="fileName">
+            The name of the dynamic link library file containing the extension.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.LoadExtension(System.String,System.String)">
+            <summary>
+            Loads a SQLite extension library from the named dynamic link library file.
+            </summary>
+            <param name="fileName">
+            The name of the dynamic link library file containing the extension.
+            </param>
+            <param name="procName">
+            The name of the exported function used to initialize the extension.
+            If null, the default "sqlite3_extension_init" will be used.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.CreateModule(System.Data.SQLite.SQLiteModule)">
+            <summary>
+            Creates a disposable module containing the implementation of a virtual
+            table.
+            </summary>
+            <param name="module">
+            The module object to be used when creating the disposable module.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.FromHexString(System.String)">
+            <summary>
+            Parses a string containing a sequence of zero or more hexadecimal
+            encoded byte values and returns the resulting byte array.  The
+            "0x" prefix is not allowed on the input string.
+            </summary>
+            <param name="text">
+            The input string containing zero or more hexadecimal encoded byte
+            values.
+            </param>
+            <returns>
+            A byte array containing the parsed byte values or null if an error
+            was encountered.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ToHexString(System.Byte[])">
+            <summary>
+            Creates and returns a string containing the hexadecimal encoded byte
+            values from the input array.
+            </summary>
+            <param name="array">
+            The input array of bytes.
+            </param>
+            <returns>
+            The resulting string or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.FromHexString(System.String,System.String@)">
+            <summary>
+            Parses a string containing a sequence of zero or more hexadecimal
+            encoded byte values and returns the resulting byte array.  The
+            "0x" prefix is not allowed on the input string.
+            </summary>
+            <param name="text">
+            The input string containing zero or more hexadecimal encoded byte
+            values.
+            </param>
+            <param name="error">
+            Upon failure, this will contain an appropriate error message.
+            </param>
+            <returns>
+            A byte array containing the parsed byte values or null if an error
+            was encountered.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Open">
+            <summary>
+            Opens the connection using the parameters found in the <see cref="P:System.Data.SQLite.SQLiteConnection.ConnectionString"/>.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.OpenAndReturn">
+            <summary>
+            Opens the connection using the parameters found in the <see cref="P:System.Data.SQLite.SQLiteConnection.ConnectionString"/> and then returns it.
+            </summary>
+            <returns>The current connection object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Cancel">
+            <summary>
+            This method causes any pending database operation to abort and return at
+            its earliest opportunity.  This routine is typically called in response
+            to a user action such as pressing "Cancel" or Ctrl-C where the user wants
+            a long query operation to halt immediately.  It is safe to call this
+            routine from any thread.  However, it is not safe to call this routine
+            with a database connection that is closed or might close before this method
+            returns.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.GetMemoryStatistics(System.Collections.Generic.IDictionary{System.String,System.Int64}@)">
+            <summary>
+            Returns various global memory statistics for the SQLite core library via
+            a dictionary of key/value pairs.  Currently, only the "MemoryUsed" and
+            "MemoryHighwater" keys are returned and they have values that correspond
+            to the values that could be obtained via the <see cref="P:System.Data.SQLite.SQLiteConnection.MemoryUsed"/>
+            and <see cref="P:System.Data.SQLite.SQLiteConnection.MemoryHighwater"/> connection properties.
+            </summary>
+            <param name="statistics">
+            This dictionary will be populated with the global memory statistics.  It
+            will be created if necessary.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ReleaseMemory">
+            <summary>
+            Attempts to free as much heap memory as possible for this database connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ReleaseMemory(System.Int32,System.Boolean,System.Boolean,System.Int32@,System.Boolean@,System.UInt32@)">
+            <summary>
+            Attempts to free N bytes of heap memory by deallocating non-essential memory
+            allocations held by the database library. Memory used to cache database pages
+            to improve performance is an example of non-essential memory.  This is a no-op
+            returning zero if the SQLite core library was not compiled with the compile-time
+            option SQLITE_ENABLE_MEMORY_MANAGEMENT.  Optionally, attempts to reset and/or
+            compact the Win32 native heap, if applicable.
+            </summary>
+            <param name="nBytes">
+            The requested number of bytes to free.
+            </param>
+            <param name="reset">
+            Non-zero to attempt a heap reset.
+            </param>
+            <param name="compact">
+            Non-zero to attempt heap compaction.
+            </param>
+            <param name="nFree">
+            The number of bytes actually freed.  This value may be zero.
+            </param>
+            <param name="resetOk">
+            This value will be non-zero if the heap reset was successful.
+            </param>
+            <param name="nLargest">
+            The size of the largest committed free block in the heap, in bytes.
+            This value will be zero unless heap compaction is enabled.
+            </param>
+            <returns>
+            A standard SQLite return code (i.e. zero for success and non-zero
+            for failure).
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.SetMemoryStatus(System.Boolean)">
+            <summary>
+            Sets the status of the memory usage tracking subsystem in the SQLite core library.  By default, this is enabled.
+            If this is disabled, memory usage tracking will not be performed.  This is not really a per-connection value, it is
+            global to the process.
+            </summary>
+            <param name="value">Non-zero to enable memory usage tracking, zero otherwise.</param>
+            <returns>A standard SQLite return code (i.e. zero for success and non-zero for failure).</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Shutdown">
+            <summary>
+            Passes a shutdown request to the SQLite core library.  Does not throw
+            an exception if the shutdown request fails.
+            </summary>
+            <returns>
+            A standard SQLite return code (i.e. zero for success and non-zero for
+            failure).
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Shutdown(System.Boolean,System.Boolean)">
+            <summary>
+            Passes a shutdown request to the SQLite core library.  Throws an
+            exception if the shutdown request fails and the no-throw parameter
+            is non-zero.
+            </summary>
+            <param name="directories">
+            Non-zero to reset the database and temporary directories to their
+            default values, which should be null for both.
+            </param>
+            <param name="noThrow">
+            When non-zero, throw an exception if the shutdown request fails.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.SetExtendedResultCodes(System.Boolean)">
+            Enables or disabled extended result codes returned by SQLite
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ResultCode">
+            Enables or disabled extended result codes returned by SQLite
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ExtendedResultCode">
+            Enables or disabled extended result codes returned by SQLite
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.LogMessage(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            Add a log message via the SQLite sqlite3_log interface.
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.LogMessage(System.Int32,System.String)">
+            Add a log message via the SQLite sqlite3_log interface.
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ChangePassword(System.String)">
+            <summary>
+            Change the password (or assign a password) to an open database.
+            </summary>
+            <remarks>
+            No readers or writers may be active for this process.  The database must already be open
+            and if it already was password protected, the existing password must already have been supplied.
+            </remarks>
+            <param name="newPassword">The new password to assign to the database</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ChangePassword(System.Byte[])">
+            <summary>
+            Change the password (or assign a password) to an open database.
+            </summary>
+            <remarks>
+            No readers or writers may be active for this process.  The database must already be open
+            and if it already was password protected, the existing password must already have been supplied.
+            </remarks>
+            <param name="newPassword">The new password to assign to the database</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.SetPassword(System.String)">
+            <summary>
+            Sets the password for a password-protected database.  A password-protected database is
+            unusable for any operation until the password has been set.
+            </summary>
+            <param name="databasePassword">The password for the database</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.SetPassword(System.Byte[])">
+            <summary>
+            Sets the password for a password-protected database.  A password-protected database is
+            unusable for any operation until the password has been set.
+            </summary>
+            <param name="databasePassword">The password for the database</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.SetAvRetry(System.Int32@,System.Int32@)">
+            <summary>
+            Queries or modifies the number of retries or the retry interval (in milliseconds) for
+            certain I/O operations that may fail due to anti-virus software.
+            </summary>
+            <param name="count">The number of times to retry the I/O operation.  A negative value
+            will cause the current count to be queried and replace that negative value.</param>
+            <param name="interval">The number of milliseconds to wait before retrying the I/O
+            operation.  This number is multiplied by the number of retry attempts so far to come
+            up with the final number of milliseconds to wait.  A negative value will cause the
+            current interval to be queried and replace that negative value.</param>
+            <returns>Zero for success, non-zero for error.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.UnwrapString(System.String)">
+            <summary>
+            Removes one set of surrounding single -OR- double quotes from the string
+            value and returns the resulting string value.  If the string is null, empty,
+            or contains quotes that are not balanced, nothing is done and the original
+            string value will be returned.
+            </summary>
+            <param name="value">The string value to process.</param>
+            <returns>
+            The string value, modified to remove one set of surrounding single -OR-
+            double quotes, if applicable.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.ExpandFileName(System.String,System.Boolean)">
+            <summary>
+            Expand the filename of the data source, resolving the |DataDirectory|
+            macro as appropriate.
+            </summary>
+            <param name="sourceFile">The database filename to expand</param>
+            <param name="toFullPath">
+            Non-zero if the returned file name should be converted to a full path
+            (except when using the .NET Compact Framework).
+            </param>
+            <returns>The expanded path and filename of the filename</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.GetSchema">
+            <overloads>
+             The following commands are used to extract schema information out of the database.  Valid schema types are:
+             <list type="bullet">
+             <item>
+             <description>MetaDataCollections</description>
+             </item>
+             <item>
+             <description>DataSourceInformation</description>
+             </item>
+             <item>
+             <description>Catalogs</description>
+             </item>
+             <item>
+             <description>Columns</description>
+             </item>
+             <item>
+             <description>ForeignKeys</description>
+             </item>
+             <item>
+             <description>Indexes</description>
+             </item>
+             <item>
+             <description>IndexColumns</description>
+             </item>
+             <item>
+             <description>Tables</description>
+             </item>
+             <item>
+             <description>Views</description>
+             </item>
+             <item>
+             <description>ViewColumns</description>
+             </item>
+             </list>
+             </overloads>
+             <summary>
+             Returns the MetaDataCollections schema
+             </summary>
+             <returns>A DataTable of the MetaDataCollections schema</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.GetSchema(System.String)">
+            <summary>
+            Returns schema information of the specified collection
+            </summary>
+            <param name="collectionName">The schema collection to retrieve</param>
+            <returns>A DataTable of the specified collection</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.GetSchema(System.String,System.String[])">
+            <summary>
+            Retrieves schema information using the specified constraint(s) for the specified collection
+            </summary>
+            <param name="collectionName">The collection to retrieve</param>
+            <param name="restrictionValues">The restrictions to impose</param>
+            <returns>A DataTable of the specified collection</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_MetaDataCollections">
+            <summary>
+            Builds a MetaDataCollections schema datatable
+            </summary>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_DataSourceInformation">
+            <summary>
+            Builds a DataSourceInformation datatable
+            </summary>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_Columns(System.String,System.String,System.String)">
+            <summary>
+            Build a Columns schema
+            </summary>
+            <param name="strCatalog">The catalog (attached database) to query, can be null</param>
+            <param name="strTable">The table to retrieve schema information for, must not be null</param>
+            <param name="strColumn">The column to retrieve schema information for, can be null</param>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_Indexes(System.String,System.String,System.String)">
+            <summary>
+            Returns index information for the given database and catalog
+            </summary>
+            <param name="strCatalog">The catalog (attached database) to query, can be null</param>
+            <param name="strIndex">The name of the index to retrieve information for, can be null</param>
+            <param name="strTable">The table to retrieve index information for, can be null</param>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_Tables(System.String,System.String,System.String)">
+            <summary>
+            Retrieves table schema information for the database and catalog
+            </summary>
+            <param name="strCatalog">The catalog (attached database) to retrieve tables on</param>
+            <param name="strTable">The table to retrieve, can be null</param>
+            <param name="strType">The table type, can be null</param>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_Views(System.String,System.String)">
+            <summary>
+            Retrieves view schema information for the database
+            </summary>
+            <param name="strCatalog">The catalog (attached database) to retrieve views on</param>
+            <param name="strView">The view name, can be null</param>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_Catalogs(System.String)">
+            <summary>
+            Retrieves catalog (attached databases) schema information for the database
+            </summary>
+            <param name="strCatalog">The catalog to retrieve, can be null</param>
+            <returns>DataTable</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_IndexColumns(System.String,System.String,System.String,System.String)">
+            <summary>
+            Returns the base column information for indexes in a database
+            </summary>
+            <param name="strCatalog">The catalog to retrieve indexes for (can be null)</param>
+            <param name="strTable">The table to restrict index information by (can be null)</param>
+            <param name="strIndex">The index to restrict index information by (can be null)</param>
+            <param name="strColumn">The source column to restrict index information by (can be null)</param>
+            <returns>A DataTable containing the results</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_ViewColumns(System.String,System.String,System.String)">
+            <summary>
+            Returns detailed column information for a specified view
+            </summary>
+            <param name="strCatalog">The catalog to retrieve columns for (can be null)</param>
+            <param name="strView">The view to restrict column information by (can be null)</param>
+            <param name="strColumn">The source column to restrict column information by (can be null)</param>
+            <returns>A DataTable containing the results</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnection.Schema_ForeignKeys(System.String,System.String,System.String)">
+            <summary>
+            Retrieves foreign key information from the specified set of filters
+            </summary>
+            <param name="strCatalog">An optional catalog to restrict results on</param>
+            <param name="strTable">An optional table to restrict results on</param>
+            <param name="strKeyName">An optional foreign key name to restrict results on</param>
+            <returns>A DataTable with the results of the query</returns>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection._handlers">
+            <summary>
+            Static variable to store the connection event handlers to call.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.StateChange">
+            <summary>
+            This event is raised whenever the database is opened or closed.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.Changed">
+            <summary>
+            This event is raised when events related to the lifecycle of a
+            SQLiteConnection object occur.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.ConnectionPool">
+            <summary>
+            This property is used to obtain or set the custom connection pool
+            implementation to use, if any.  Setting this property to null will
+            cause the default connection pool implementation to be used.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.PoolCount">
+            <summary>
+            Returns the number of pool entries for the file name associated with this connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.ConnectionString">
+            <summary>
+            The connection string containing the parameters for the connection
+            </summary>
+            <remarks>
+            <list type="table">
+            <listheader>
+            <term>Parameter</term>
+            <term>Values</term>
+            <term>Required</term>
+            <term>Default</term>
+            </listheader>
+            <item>
+            <description>Data Source</description>
+            <description>
+            This may be a file name, the string ":memory:", or any supported URI (starting with SQLite 3.7.7).
+            Starting with release 1.0.86.0, in order to use more than one consecutive backslash (e.g. for a
+            UNC path), each of the adjoining backslash characters must be doubled (e.g. "\\Network\Share\test.db"
+            would become "\\\\Network\Share\test.db").
+            </description>
+            <description>Y</description>
+            <description></description>
+            </item>
+            <item>
+            <description>Version</description>
+            <description>3</description>
+            <description>N</description>
+            <description>3</description>
+            </item>
+            <item>
+            <description>UseUTF16Encoding</description>
+            <description><b>True</b><br/><b>False</b></description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>DateTimeFormat</description>
+            <description>
+            <b>Ticks</b> - Use the value of DateTime.Ticks.<br/>
+            <b>ISO8601</b> - Use the ISO-8601 format.  Uses the "yyyy-MM-dd HH:mm:ss.FFFFFFFK" format for UTC
+            DateTime values and "yyyy-MM-dd HH:mm:ss.FFFFFFF" format for local DateTime values).<br/>
+            <b>JulianDay</b> - The interval of time in days and fractions of a day since January 1, 4713 BC.<br/>
+            <b>UnixEpoch</b> - The whole number of seconds since the Unix epoch (January 1, 1970).<br/>
+            <b>InvariantCulture</b> - Any culture-independent string value that the .NET Framework can interpret as a valid DateTime.<br/>
+            <b>CurrentCulture</b> - Any string value that the .NET Framework can interpret as a valid DateTime using the current culture.</description>
+            <description>N</description>
+            <description>ISO8601</description>
+            </item>
+            <item>
+            <description>DateTimeKind</description>
+            <description><b>Unspecified</b> - Not specified as either UTC or local time.<br/><b>Utc</b> - The time represented is UTC.<br/><b>Local</b> - The time represented is local time.</description>
+            <description>N</description>
+            <description>Unspecified</description>
+            </item>
+            <item>
+            <description>DateTimeFormatString</description>
+            <description>The exact DateTime format string to use for all formatting and parsing of all DateTime
+            values for this connection.</description>
+            <description>N</description>
+            <description>null</description>
+            </item>
+            <item>
+            <description>BaseSchemaName</description>
+            <description>Some base data classes in the framework (e.g. those that build SQL queries dynamically)
+            assume that an ADO.NET provider cannot support an alternate catalog (i.e. database) without supporting
+            alternate schemas as well; however, SQLite does not fit into this model.  Therefore, this value is used
+            as a placeholder and removed prior to preparing any SQL statements that may contain it.</description>
+            <description>N</description>
+            <description>sqlite_default_schema</description>
+            </item>
+            <item>
+            <description>BinaryGUID</description>
+            <description><b>True</b> - Store GUID columns in binary form<br/><b>False</b> - Store GUID columns as text</description>
+            <description>N</description>
+            <description>True</description>
+            </item>
+            <item>
+            <description>Cache Size</description>
+            <description>{size in bytes}</description>
+            <description>N</description>
+            <description>2000</description>
+            </item>
+            <item>
+            <description>Synchronous</description>
+            <description><b>Normal</b> - Normal file flushing behavior<br/><b>Full</b> - Full flushing after all writes<br/><b>Off</b> - Underlying OS flushes I/O's</description>
+            <description>N</description>
+            <description>Full</description>
+            </item>
+            <item>
+            <description>Page Size</description>
+            <description>{size in bytes}</description>
+            <description>N</description>
+            <description>1024</description>
+            </item>
+            <item>
+            <description>Password</description>
+            <description>{password} - Using this parameter requires that the CryptoAPI based codec be enabled at compile-time for both the native interop assembly and the core managed assemblies; otherwise, using this parameter may result in an exception being thrown when attempting to open the connection.</description>
+            <description>N</description>
+            <description></description>
+            </item>
+            <item>
+            <description>HexPassword</description>
+            <description>{hexPassword} - Must contain a sequence of zero or more hexadecimal encoded byte values without a leading "0x" prefix.  Using this parameter requires that the CryptoAPI based codec be enabled at compile-time for both the native interop assembly and the core managed assemblies; otherwise, using this parameter may result in an exception being thrown when attempting to open the connection.</description>
+            <description>N</description>
+            <description></description>
+            </item>
+            <item>
+            <description>Enlist</description>
+            <description><b>Y</b> - Automatically enlist in distributed transactions<br/><b>N</b> - No automatic enlistment</description>
+            <description>N</description>
+            <description>Y</description>
+            </item>
+            <item>
+            <description>Pooling</description>
+            <description>
+            <b>True</b> - Use connection pooling.<br/>
+            <b>False</b> - Do not use connection pooling.<br/><br/>
+            <b>WARNING:</b> When using the default connection pool implementation,
+            setting this property to True should be avoided by applications that
+            make use of COM (either directly or indirectly) due to possible
+            deadlocks that can occur during the finalization of some COM objects.
+            </description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>FailIfMissing</description>
+            <description><b>True</b> - Don't create the database if it does not exist, throw an error instead<br/><b>False</b> - Automatically create the database if it does not exist</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Max Page Count</description>
+            <description>{size in pages} - Limits the maximum number of pages (limits the size) of the database</description>
+            <description>N</description>
+            <description>0</description>
+            </item>
+            <item>
+            <description>Legacy Format</description>
+            <description><b>True</b> - Use the more compatible legacy 3.x database format<br/><b>False</b> - Use the newer 3.3x database format which compresses numbers more effectively</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Default Timeout</description>
+            <description>{time in seconds}<br/>The default command timeout</description>
+            <description>N</description>
+            <description>30</description>
+            </item>
+            <item>
+            <description>Journal Mode</description>
+            <description><b>Delete</b> - Delete the journal file after a commit<br/><b>Persist</b> - Zero out and leave the journal file on disk after a commit<br/><b>Off</b> - Disable the rollback journal entirely</description>
+            <description>N</description>
+            <description>Delete</description>
+            </item>
+            <item>
+            <description>Read Only</description>
+            <description><b>True</b> - Open the database for read only access<br/><b>False</b> - Open the database for normal read/write access</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Max Pool Size</description>
+            <description>The maximum number of connections for the given connection string that can be in the connection pool</description>
+            <description>N</description>
+            <description>100</description>
+            </item>
+            <item>
+            <description>Default IsolationLevel</description>
+            <description>The default transaciton isolation level</description>
+            <description>N</description>
+            <description>Serializable</description>
+            </item>
+            <item>
+            <description>Foreign Keys</description>
+            <description>Enable foreign key constraints</description>
+            <description>N</description>
+            <description>False</description>
+            </item>
+            <item>
+            <description>Flags</description>
+            <description>Extra behavioral flags for the connection.  See the <see cref="T:System.Data.SQLite.SQLiteConnectionFlags"/> enumeration for possible values.</description>
+            <description>N</description>
+            <description>Default</description>
+            </item>
+            <item>
+            <description>SetDefaults</description>
+            <description>
+            <b>True</b> - Apply the default connection settings to the opened database.<br/>
+            <b>False</b> - Skip applying the default connection settings to the opened database.
+            </description>
+            <description>N</description>
+            <description>True</description>
+            </item>
+            <item>
+            <description>ToFullPath</description>
+            <description>
+            <b>True</b> - Attempt to expand the data source file name to a fully qualified path before opening.<br/>
+            <b>False</b> - Skip attempting to expand the data source file name to a fully qualified path before opening.
+            </description>
+            <description>N</description>
+            <description>True</description>
+            </item>
+            </list>
+            </remarks>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.DataSource">
+            <summary>
+            Returns the data source file name without extension or path.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.Database">
+            <summary>
+            Returns the string "main".
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.DefaultTimeout">
+            <summary>
+            Gets/sets the default command timeout for newly-created commands.  This is especially useful for
+            commands used internally such as inside a SQLiteTransaction, where setting the timeout is not possible.
+            This can also be set in the ConnectionString with "Default Timeout"
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.ParseViaFramework">
+            <summary>
+            Non-zero if the built-in (i.e. framework provided) connection string
+            parser should be used when opening the connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.Flags">
+            <summary>
+            Gets/sets the extra behavioral flags for this connection.  See the
+            <see cref="T:System.Data.SQLite.SQLiteConnectionFlags"/> enumeration for a list of
+            possible values.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.OwnHandle">
+            <summary>
+            Returns non-zero if the underlying native connection handle is
+            owned by this instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.ServerVersion">
+            <summary>
+            Returns the version of the underlying SQLite database engine
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.LastInsertRowId">
+            <summary>
+            Returns the rowid of the most recent successful INSERT into the database from this connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.Changes">
+            <summary>
+            Returns the number of rows changed by the last INSERT, UPDATE, or DELETE statement executed on
+            this connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.AutoCommit">
+            <summary>
+            Returns non-zero if the given database connection is in autocommit mode.
+            Autocommit mode is on by default.  Autocommit mode is disabled by a BEGIN
+            statement.  Autocommit mode is re-enabled by a COMMIT or ROLLBACK.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.MemoryUsed">
+            <summary>
+            Returns the amount of memory (in bytes) currently in use by the SQLite core library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.MemoryHighwater">
+            <summary>
+            Returns the maximum amount of memory (in bytes) used by the SQLite core library since the high-water mark was last reset.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.DefineConstants">
+            <summary>
+            Returns a string containing the define constants (i.e. compile-time
+            options) used to compile the core managed assembly, delimited with
+            spaces.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.SQLiteVersion">
+            <summary>
+            Returns the version of the underlying SQLite core library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.SQLiteSourceId">
+            <summary>
+            This method returns the string whose value is the same as the
+            SQLITE_SOURCE_ID C preprocessor macro used when compiling the
+            SQLite core library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.InteropVersion">
+            <summary>
+            This method returns the version of the interop SQLite assembly
+            used.  If the SQLite interop assembly is not in use or the
+            necessary information cannot be obtained for any reason, a null
+            value may be returned.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.InteropSourceId">
+            <summary>
+            This method returns the string whose value contains the unique
+            identifier for the source checkout used to build the interop
+            assembly.  If the SQLite interop assembly is not in use or the
+            necessary information cannot be obtained for any reason, a null
+            value may be returned.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.ProviderVersion">
+            <summary>
+            This method returns the version of the managed components used
+            to interact with the SQLite core library.  If the necessary
+            information cannot be obtained for any reason, a null value may
+            be returned.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.ProviderSourceId">
+            <summary>
+            This method returns the string whose value contains the unique
+            identifier for the source checkout used to build the managed
+            components currently executing.  If the necessary information
+            cannot be obtained for any reason, a null value may be returned.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.State">
+            <summary>
+            Returns the state of the connection.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.Authorize">
+            <summary>
+            This event is raised whenever SQLite encounters an action covered by the
+            authorizer during query preparation.  Changing the value of the
+            <see cref="F:System.Data.SQLite.AuthorizerEventArgs.ReturnCode"/> property will determine if
+            the specific action will be allowed, ignored, or denied.  For the entire
+            duration of the event, the associated connection and statement objects
+            must not be modified, either directly or indirectly, by the called code.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.Update">
+            <summary>
+            This event is raised whenever SQLite makes an update/delete/insert into the database on
+            this connection.  It only applies to the given connection.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.Commit">
+            <summary>
+            This event is raised whenever SQLite is committing a transaction.
+            Return non-zero to trigger a rollback.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.Trace">
+            <summary>
+            This event is raised whenever SQLite statement first begins executing on
+            this connection.  It only applies to the given connection.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteConnection.RollBack">
+            <summary>
+            This event is raised whenever SQLite is rolling back a transaction.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnection.DbProviderFactory">
+            <summary>
+            Returns the <see cref="T:System.Data.SQLite.SQLiteFactory"/> instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SynchronizationModes">
+            <summary>
+            The I/O file cache flushing behavior for the connection
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SynchronizationModes.Normal">
+            <summary>
+            Normal file flushing at critical sections of the code
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SynchronizationModes.Full">
+            <summary>
+            Full file flushing after every write operation
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SynchronizationModes.Off">
+            <summary>
+            Use the default operating system's file flushing, SQLite does not explicitly flush the file buffers after writing
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteAuthorizerEventHandler">
+            <summary>
+            Raised when authorization is required to perform an action contained
+            within a SQL query.
+            </summary>
+            <param name="sender">The connection performing the action.</param>
+            <param name="e">A <see cref="T:System.Data.SQLite.AuthorizerEventArgs"/> that contains the
+            event data.</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteCommitHandler">
+            <summary>
+            Raised when a transaction is about to be committed.  To roll back a transaction, set the
+            rollbackTrans boolean value to true.
+            </summary>
+            <param name="sender">The connection committing the transaction</param>
+            <param name="e">Event arguments on the transaction</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteUpdateEventHandler">
+            <summary>
+            Raised when data is inserted, updated and deleted on a given connection
+            </summary>
+            <param name="sender">The connection committing the transaction</param>
+            <param name="e">The event parameters which triggered the event</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteTraceEventHandler">
+            <summary>
+            Raised when a statement first begins executing on a given connection
+            </summary>
+            <param name="sender">The connection executing the statement</param>
+            <param name="e">Event arguments of the trace</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteBackupCallback">
+            <summary>
+            Raised between each backup step.
+            </summary>
+            <param name="source">
+            The source database connection.
+            </param>
+            <param name="sourceName">
+            The source database name.
+            </param>
+            <param name="destination">
+            The destination database connection.
+            </param>
+            <param name="destinationName">
+            The destination database name.
+            </param>
+            <param name="pages">
+            The number of pages copied with each step.
+            </param>
+            <param name="remainingPages">
+            The number of pages remaining to be copied.
+            </param>
+            <param name="totalPages">
+            The total number of pages in the source database.
+            </param>
+            <param name="retry">
+            Set to true if the operation needs to be retried due to database
+            locking issues; otherwise, set to false.
+            </param>
+            <returns>
+            True to continue with the backup process or false to halt the backup
+            process, rolling back any changes that have been made so far.
+            </returns>
+        </member>
+        <member name="T:System.Data.SQLite.AuthorizerEventArgs">
+            <summary>
+            The data associated with a call into the authorizer.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.UserData">
+            <summary>
+            The user-defined native data associated with this event.  Currently,
+            this will always contain the value of <see cref="F:System.IntPtr.Zero"/>.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.ActionCode">
+            <summary>
+            The action code responsible for the current call into the authorizer.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.Argument1">
+            <summary>
+            The first string argument for the current call into the authorizer.
+            The exact value will vary based on the action code, see the
+            <see cref="T:System.Data.SQLite.SQLiteAuthorizerActionCode"/> enumeration for possible
+            values.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.Argument2">
+            <summary>
+            The second string argument for the current call into the authorizer.
+            The exact value will vary based on the action code, see the
+            <see cref="T:System.Data.SQLite.SQLiteAuthorizerActionCode"/> enumeration for possible
+            values.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.Database">
+            <summary>
+            The database name for the current call into the authorizer, if
+            applicable.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.Context">
+            <summary>
+            The name of the inner-most trigger or view that is responsible for
+            the access attempt or a null value if this access attempt is directly
+            from top-level SQL code.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.AuthorizerEventArgs.ReturnCode">
+            <summary>
+            The return code for the current call into the authorizer.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.AuthorizerEventArgs.#ctor">
+            <summary>
+            Constructs an instance of this class with default property values.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.AuthorizerEventArgs.#ctor(System.IntPtr,System.Data.SQLite.SQLiteAuthorizerActionCode,System.String,System.String,System.String,System.String,System.Data.SQLite.SQLiteAuthorizerReturnCode)">
+            <summary>
+            Constructs an instance of this class with specific property values.
+            </summary>
+            <param name="pUserData">
+            The user-defined native data associated with this event.
+            </param>
+            <param name="actionCode">
+            The authorizer action code.
+            </param>
+            <param name="argument1">
+            The first authorizer argument.
+            </param>
+            <param name="argument2">
+            The second authorizer argument.
+            </param>
+            <param name="database">
+            The database name, if applicable.
+            </param>
+            <param name="context">
+            The name of the inner-most trigger or view that is responsible for
+            the access attempt or a null value if this access attempt is directly
+            from top-level SQL code.
+            </param>
+            <param name="returnCode">
+            The authorizer return code.
+            </param>
+        </member>
+        <member name="T:System.Data.SQLite.UpdateEventType">
+            <summary>
+            Whenever an update event is triggered on a connection, this enum will indicate
+            exactly what type of operation is being performed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventType.Delete">
+            <summary>
+            A row is being deleted from the given database and table
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventType.Insert">
+            <summary>
+            A row is being inserted into the table.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventType.Update">
+            <summary>
+            A row is being updated in the table.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.UpdateEventArgs">
+            <summary>
+            Passed during an Update callback, these event arguments detail the type of update operation being performed
+            on the given connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventArgs.Database">
+            <summary>
+            The name of the database being updated (usually "main" but can be any attached or temporary database)
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventArgs.Table">
+            <summary>
+            The name of the table being updated
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventArgs.Event">
+            <summary>
+            The type of update being performed (insert/update/delete)
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UpdateEventArgs.RowId">
+            <summary>
+            The RowId affected by this update.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.CommitEventArgs">
+            <summary>
+            Event arguments raised when a transaction is being committed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CommitEventArgs.AbortTransaction">
+            <summary>
+            Set to true to abort the transaction and trigger a rollback
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.TraceEventArgs">
+            <summary>
+            Passed during an Trace callback, these event arguments contain the UTF-8 rendering of the SQL statement text
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TraceEventArgs.Statement">
+            <summary>
+            SQL statement text as the statement first begins executing
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.ISQLiteConnectionPool">
+            <summary>
+            This interface represents a custom connection pool implementation
+            usable by System.Data.SQLite.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteConnectionPool.GetCounts(System.String,System.Collections.Generic.Dictionary{System.String,System.Int32}@,System.Int32@,System.Int32@,System.Int32@)">
+            <summary>
+            Counts the number of pool entries matching the specified file name.
+            </summary>
+            <param name="fileName">
+            The file name to match or null to match all files.
+            </param>
+            <param name="counts">
+            The pool entry counts for each matching file.
+            </param>
+            <param name="openCount">
+            The total number of connections successfully opened from any pool.
+            </param>
+            <param name="closeCount">
+            The total number of connections successfully closed from any pool.
+            </param>
+            <param name="totalCount">
+            The total number of pool entries for all matching files.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteConnectionPool.ClearPool(System.String)">
+            <summary>
+            Disposes of all pooled connections associated with the specified
+            database file name.
+            </summary>
+            <param name="fileName">
+            The database file name.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteConnectionPool.ClearAllPools">
+            <summary>
+            Disposes of all pooled connections.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteConnectionPool.Add(System.String,System.Object,System.Int32)">
+            <summary>
+            Adds a connection to the pool of those associated with the
+            specified database file name.
+            </summary>
+            <param name="fileName">
+            The database file name.
+            </param>
+            <param name="handle">
+            The database connection handle.
+            </param>
+            <param name="version">
+            The connection pool version at the point the database connection
+            handle was received from the connection pool.  This is also the
+            connection pool version that the database connection handle was
+            created under.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteConnectionPool.Remove(System.String,System.Int32,System.Int32@)">
+            <summary>
+            Removes a connection from the pool of those associated with the
+            specified database file name with the intent of using it to
+            interact with the database.
+            </summary>
+            <param name="fileName">
+            The database file name.
+            </param>
+            <param name="maxPoolSize">
+            The new maximum size of the connection pool for the specified
+            database file name.
+            </param>
+            <param name="version">
+            The connection pool version associated with the returned database
+            connection handle, if any.
+            </param>
+            <returns>
+            The database connection handle associated with the specified
+            database file name or null if it cannot be obtained.
+            </returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnectionPool">
+            <summary>
+            This default method implementations in this class should not be used by
+            applications that make use of COM (either directly or indirectly) due
+            to possible deadlocks that can occur during finalization of some COM
+            objects.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool._syncRoot">
+            <summary>
+            This field is used to synchronize access to the private static data
+            in this class.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool._connectionPool">
+            <summary>
+            When this field is non-null, it will be used to provide the
+            implementation of all the connection pool methods; otherwise,
+            the default method implementations will be used.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool._queueList">
+            <summary>
+            The dictionary of connection pools, based on the normalized file
+            name of the SQLite database.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool._poolVersion">
+            <summary>
+            The default version number new pools will get.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool._poolOpened">
+            <summary>
+            The number of connections successfully opened from any pool.
+            This value is incremented by the Remove method.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool._poolClosed">
+            <summary>
+            The number of connections successfully closed from any pool.
+            This value is incremented by the Add method.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.GetCounts(System.String,System.Collections.Generic.Dictionary{System.String,System.Int32}@,System.Int32@,System.Int32@,System.Int32@)">
+            <summary>
+            Counts the number of pool entries matching the specified file name.
+            </summary>
+            <param name="fileName">
+            The file name to match or null to match all files.
+            </param>
+            <param name="counts">
+            The pool entry counts for each matching file.
+            </param>
+            <param name="openCount">
+            The total number of connections successfully opened from any pool.
+            </param>
+            <param name="closeCount">
+            The total number of connections successfully closed from any pool.
+            </param>
+            <param name="totalCount">
+            The total number of pool entries for all matching files.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.ClearPool(System.String)">
+            <summary>
+            Disposes of all pooled connections associated with the specified
+            database file name.
+            </summary>
+            <param name="fileName">
+            The database file name.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.ClearAllPools">
+            <summary>
+            Disposes of all pooled connections.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.Add(System.String,System.Data.SQLite.SQLiteConnectionHandle,System.Int32)">
+            <summary>
+            Adds a connection to the pool of those associated with the
+            specified database file name.
+            </summary>
+            <param name="fileName">
+            The database file name.
+            </param>
+            <param name="handle">
+            The database connection handle.
+            </param>
+            <param name="version">
+            The connection pool version at the point the database connection
+            handle was received from the connection pool.  This is also the
+            connection pool version that the database connection handle was
+            created under.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.Remove(System.String,System.Int32,System.Int32@)">
+            <summary>
+            Removes a connection from the pool of those associated with the
+            specified database file name with the intent of using it to
+            interact with the database.
+            </summary>
+            <param name="fileName">
+            The database file name.
+            </param>
+            <param name="maxPoolSize">
+            The new maximum size of the connection pool for the specified
+            database file name.
+            </param>
+            <param name="version">
+            The connection pool version associated with the returned database
+            connection handle, if any.
+            </param>
+            <returns>
+            The database connection handle associated with the specified
+            database file name or null if it cannot be obtained.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.GetConnectionPool">
+            <summary>
+            This method is used to obtain a reference to the custom connection
+            pool implementation currently in use, if any.
+            </summary>
+            <returns>
+            The custom connection pool implementation or null if the default
+            connection pool implementation should be used.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.SetConnectionPool(System.Data.SQLite.ISQLiteConnectionPool)">
+            <summary>
+            This method is used to set the reference to the custom connection
+            pool implementation to use, if any.
+            </summary>
+            <param name="connectionPool">
+            The custom connection pool implementation to use or null if the
+            default connection pool implementation should be used.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.ResizePool(System.Data.SQLite.SQLiteConnectionPool.PoolQueue,System.Boolean)">
+            <summary>
+            We do not have to thread-lock anything in this function, because it
+            is only called by other functions above which already take the lock.
+            </summary>
+            <param name="queue">
+            The pool queue to resize.
+            </param>
+            <param name="add">
+            If a function intends to add to the pool, this is true, which
+            forces the resize to take one more than it needs from the pool.
+            </param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnectionPool.PoolQueue">
+            <summary>
+            Keeps track of connections made on a specified file.  The PoolVersion
+            dictates whether old objects get returned to the pool or discarded
+            when no longer in use.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool.PoolQueue.Queue">
+            <summary>
+            The queue of weak references to the actual database connection
+            handles.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool.PoolQueue.PoolVersion">
+            <summary>
+            This pool version associated with the database connection
+            handles in this pool queue.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionPool.PoolQueue.MaxPoolSize">
+            <summary>
+            The maximum size of this pool queue.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionPool.PoolQueue.#ctor(System.Int32,System.Int32)">
+            <summary>
+            Constructs a connection pool queue using the specified version
+            and maximum size.  Normally, all the database connection
+            handles in this pool are associated with a single database file
+            name.
+            </summary>
+            <param name="version">
+            The initial pool version for this connection pool queue.
+            </param>
+            <param name="maxSize">
+            The initial maximum size for this connection pool queue.
+            </param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnectionStringBuilder">
+            <summary>
+            SQLite implementation of DbConnectionStringBuilder.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionStringBuilder._properties">
+            <summary>
+            Properties of this class
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionStringBuilder.#ctor">
+            <overloads>
+            Constructs a new instance of the class
+            </overloads>
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionStringBuilder.#ctor(System.String)">
+            <summary>
+            Constructs a new instance of the class using the specified connection string.
+            </summary>
+            <param name="connectionString">The connection string to parse</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionStringBuilder.Initialize(System.String)">
+            <summary>
+            Private initializer, which assigns the connection string and resets the builder
+            </summary>
+            <param name="cnnString">The connection string to assign</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionStringBuilder.TryGetValue(System.String,System.Object@)">
+            <summary>
+            Helper function for retrieving values from the connectionstring
+            </summary>
+            <param name="keyword">The keyword to retrieve settings for</param>
+            <param name="value">The resulting parameter value</param>
+            <returns>Returns true if the value was found and returned</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteConnectionStringBuilder.FallbackGetProperties(System.Collections.Hashtable)">
+            <summary>
+            Fallback method for MONO, which doesn't implement DbConnectionStringBuilder.GetProperties()
+            </summary>
+            <param name="propertyList">The hashtable to fill with property descriptors</param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.Version">
+            <summary>
+            Gets/Sets the default version of the SQLite engine to instantiate.  Currently the only valid value is 3, indicating version 3 of the sqlite library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.SyncMode">
+            <summary>
+            Gets/Sets the synchronization mode (file flushing) of the connection string.  Default is "Normal".
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.UseUTF16Encoding">
+            <summary>
+            Gets/Sets the encoding for the connection string.  The default is "False" which indicates UTF-8 encoding.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.Pooling">
+            <summary>
+            Gets/Sets whether or not to use connection pooling.  The default is "False"
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.BinaryGUID">
+            <summary>
+            Gets/Sets whethor not to store GUID's in binary format.  The default is True
+            which saves space in the database.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.DataSource">
+            <summary>
+            Gets/Sets the filename to open on the connection string.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.Uri">
+            <summary>
+            An alternate to the data source property
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.FullUri">
+            <summary>
+            An alternate to the data source property that uses the SQLite URI syntax.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.DefaultTimeout">
+            <summary>
+            Gets/sets the default command timeout for newly-created commands.  This is especially useful for 
+            commands used internally such as inside a SQLiteTransaction, where setting the timeout is not possible.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.Enlist">
+            <summary>
+            Determines whether or not the connection will automatically participate
+            in the current distributed transaction (if one exists)
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.FailIfMissing">
+            <summary>
+            If set to true, will throw an exception if the database specified in the connection
+            string does not exist.  If false, the database will be created automatically.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.LegacyFormat">
+            <summary>
+            If enabled, uses the legacy 3.xx format for maximum compatibility, but results in larger
+            database sizes.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.ReadOnly">
+            <summary>
+            When enabled, the database will be opened for read-only access and writing will be disabled.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.Password">
+            <summary>
+            Gets/sets the database encryption password
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.HexPassword">
+            <summary>
+            Gets/sets the database encryption hexadecimal password
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.PageSize">
+            <summary>
+            Gets/Sets the page size for the connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.MaxPageCount">
+            <summary>
+            Gets/Sets the maximum number of pages the database may hold
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.CacheSize">
+            <summary>
+            Gets/Sets the cache size for the connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.DateTimeFormat">
+            <summary>
+            Gets/Sets the DateTime format for the connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.DateTimeKind">
+            <summary>
+            Gets/Sets the DateTime kind for the connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.DateTimeFormatString">
+            <summary>
+            Gets/sets the DateTime format string used for formatting
+            and parsing purposes.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.BaseSchemaName">
+            <summary>
+            Gets/Sets the placeholder base schema name used for
+            .NET Framework compatibility purposes.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.JournalMode">
+            <summary>
+            Determines how SQLite handles the transaction journal file.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.DefaultIsolationLevel">
+            <summary>
+            Sets the default isolation level for transactions on the connection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.ForeignKeys">
+            <summary>
+            If enabled, use foreign key constraints
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.Flags">
+            <summary>
+            Gets/Sets the extra behavioral flags.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.SetDefaults">
+            <summary>
+            If enabled, apply the default connection settings to opened databases.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteConnectionStringBuilder.ToFullPath">
+            <summary>
+            If enabled, attempt to resolve the provided data source file name to a
+            full path before opening.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.TypeAffinity">
+            <summary>
+            SQLite has very limited types, and is inherently text-based.  The first 5 types below represent the sum of all types SQLite
+            understands.  The DateTime extension to the spec is for internal use only.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.Uninitialized">
+            <summary>
+            Not used
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.Int64">
+            <summary>
+            All integers in SQLite default to Int64
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.Double">
+            <summary>
+            All floating point numbers in SQLite default to double
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.Text">
+            <summary>
+            The default data type of SQLite is text
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.Blob">
+            <summary>
+            Typically blob types are only seen when returned from a function
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.Null">
+            <summary>
+            Null types can be returned from functions
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.DateTime">
+            <summary>
+            Used internally by this provider
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.TypeAffinity.None">
+            <summary>
+            Used internally by this provider
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteConnectionEventType">
+            <summary>
+            These are the event types associated with the
+            <see cref="T:System.Data.SQLite.SQLiteConnectionEventHandler"/>
+            delegate (and its corresponding event) and the
+            <see cref="T:System.Data.SQLite.ConnectionEventArgs"/> class.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.Invalid">
+            <summary>
+            Not used.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.Unknown">
+            <summary>
+            Not used.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.Opening">
+            <summary>
+            The connection is being opened.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.ConnectionString">
+            <summary>
+            The connection string has been parsed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.Opened">
+            <summary>
+            The connection was opened.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.ChangeDatabase">
+            <summary>
+            The <see cref="F:System.Data.SQLite.SQLiteConnectionEventType.ChangeDatabase"/> method was called on the
+            connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.NewTransaction">
+            <summary>
+            A transaction was created using the connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.EnlistTransaction">
+            <summary>
+            The connection was enlisted into a transaction.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.NewCommand">
+            <summary>
+            A command was created using the connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.NewDataReader">
+            <summary>
+            A data reader was created using the connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.NewCriticalHandle">
+            <summary>
+            An instance of a <see cref="T:System.Runtime.InteropServices.CriticalHandle"/> derived class has
+            been created to wrap a native resource.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.Closing">
+            <summary>
+            The connection is being closed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteConnectionEventType.Closed">
+            <summary>
+            The connection was closed.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteDateFormats">
+             <summary>
+             This implementation of SQLite for ADO.NET can process date/time fields in
+             databases in one of six formats.
+             </summary>
+             <remarks>
+             ISO8601 format is more compatible, readable, fully-processable, but less
+             accurate as it does not provide time down to fractions of a second.
+             JulianDay is the numeric format the SQLite uses internally and is arguably
+             the most compatible with 3rd party tools.  It is not readable as text
+             without post-processing.  Ticks less compatible with 3rd party tools that
+             query the database, and renders the DateTime field unreadable as text
+             without post-processing.  UnixEpoch is more compatible with Unix systems.
+             InvariantCulture allows the configured format for the invariant culture
+             format to be used and is human readable.  CurrentCulture allows the
+             configured format for the current culture to be used and is also human
+             readable.
+            
+             The preferred order of choosing a DateTime format is JulianDay, ISO8601,
+             and then Ticks.  Ticks is mainly present for legacy code support.
+             </remarks>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.Ticks">
+            <summary>
+            Use the value of DateTime.Ticks.  This value is not recommended and is not well supported with LINQ.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.ISO8601">
+            <summary>
+            Use the ISO-8601 format.  Uses the "yyyy-MM-dd HH:mm:ss.FFFFFFFK" format for UTC DateTime values and
+            "yyyy-MM-dd HH:mm:ss.FFFFFFF" format for local DateTime values).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.JulianDay">
+            <summary>
+            The interval of time in days and fractions of a day since January 1, 4713 BC.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.UnixEpoch">
+            <summary>
+            The whole number of seconds since the Unix epoch (January 1, 1970).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.InvariantCulture">
+            <summary>
+            Any culture-independent string value that the .NET Framework can interpret as a valid DateTime.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.CurrentCulture">
+            <summary>
+            Any string value that the .NET Framework can interpret as a valid DateTime using the current culture.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDateFormats.Default">
+            <summary>
+            The default format for this provider.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteJournalModeEnum">
+             <summary>
+             This enum determines how SQLite treats its journal file.
+             </summary>
+             <remarks>
+             By default SQLite will create and delete the journal file when needed during a transaction.
+             However, for some computers running certain filesystem monitoring tools, the rapid
+             creation and deletion of the journal file can cause those programs to fail, or to interfere with SQLite.
+            
+             If a program or virus scanner is interfering with SQLite's journal file, you may receive errors like "unable to open database file"
+             when starting a transaction.  If this is happening, you may want to change the default journal mode to Persist.
+             </remarks>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Default">
+            <summary>
+            The default mode, this causes SQLite to use the existing journaling mode for the database.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Delete">
+            <summary>
+            SQLite will create and destroy the journal file as-needed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Persist">
+            <summary>
+            When this is set, SQLite will keep the journal file even after a transaction has completed.  It's contents will be erased,
+            and the journal re-used as often as needed.  If it is deleted, it will be recreated the next time it is needed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Off">
+            <summary>
+            This option disables the rollback journal entirely.  Interrupted transactions or a program crash can cause database
+            corruption in this mode!
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Truncate">
+            <summary>
+            SQLite will truncate the journal file to zero-length instead of deleting it.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Memory">
+            <summary>
+            SQLite will store the journal in volatile RAM.  This saves disk I/O but at the expense of database safety and integrity.
+            If the application using SQLite crashes in the middle of a transaction when the MEMORY journaling mode is set, then the
+            database file will very likely go corrupt.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteJournalModeEnum.Wal">
+            <summary>
+            SQLite uses a write-ahead log instead of a rollback journal to implement transactions.  The WAL journaling mode is persistent;
+            after being set it stays in effect across multiple database connections and after closing and reopening the database. A database
+            in WAL journaling mode can only be accessed by SQLite version 3.7.0 or later.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteSynchronousEnum">
+            <summary>
+            Possible values for the "synchronous" database setting.  This setting determines
+            how often the database engine calls the xSync method of the VFS.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteSynchronousEnum.Default">
+            <summary>
+            Use the default "synchronous" database setting.  Currently, this should be
+            the same as using the FULL mode.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteSynchronousEnum.Off">
+            <summary>
+            The database engine continues without syncing as soon as it has handed
+            data off to the operating system.  If the application running SQLite
+            crashes, the data will be safe, but the database might become corrupted
+            if the operating system crashes or the computer loses power before that
+            data has been written to the disk surface.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteSynchronousEnum.Normal">
+            <summary>
+            The database engine will still sync at the most critical moments, but
+            less often than in FULL mode.  There is a very small (though non-zero)
+            chance that a power failure at just the wrong time could corrupt the
+            database in NORMAL mode.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteSynchronousEnum.Full">
+            <summary>
+            The database engine will use the xSync method of the VFS to ensure that
+            all content is safely written to the disk surface prior to continuing.
+            This ensures that an operating system crash or power failure will not
+            corrupt the database.  FULL synchronous is very safe, but it is also
+            slower.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteExecuteType">
+            <summary>
+            The requested command execution type.  This controls which method of the
+            <see cref="T:System.Data.SQLite.SQLiteCommand"/> object will be called.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteExecuteType.None">
+            <summary>
+            Do nothing.  No method will be called.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteExecuteType.NonQuery">
+            <summary>
+            The command is not expected to return a result -OR- the result is not
+            needed.  The <see cref="M:System.Data.SQLite.SQLiteCommand.ExecuteNonQuery"/> or
+            <see cref="M:System.Data.SQLite.SQLiteCommand.ExecuteNonQuery(System.Data.CommandBehavior)"/>  method
+            will be called.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteExecuteType.Scalar">
+            <summary>
+            The command is expected to return a scalar result -OR- the result should
+            be limited to a scalar result.  The <see cref="M:System.Data.SQLite.SQLiteCommand.ExecuteScalar"/>
+            or <see cref="M:System.Data.SQLite.SQLiteCommand.ExecuteScalar(System.Data.CommandBehavior)"/> method will
+            be called.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteExecuteType.Reader">
+            <summary>
+            The command is expected to return <see cref="T:System.Data.SQLite.SQLiteDataReader"/> result.
+            The <see cref="M:System.Data.SQLite.SQLiteCommand.ExecuteReader"/> or
+            <see cref="M:System.Data.SQLite.SQLiteCommand.ExecuteReader(System.Data.CommandBehavior)"/> method will
+            be called.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteExecuteType.Default">
+            <summary>
+            Use the default command execution type.  Using this value is the same
+            as using the <see cref="F:System.Data.SQLite.SQLiteExecuteType.NonQuery"/> value.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteAuthorizerActionCode">
+            <summary>
+            The action code responsible for the current call into the authorizer.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.None">
+            <summary>
+            No action is being performed.  This value should not be used from
+            external code.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Copy">
+            <summary>
+            No longer used.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateIndex">
+            <summary>
+            An index will be created.  The action-specific arguments are the
+            index name and the table name.
+            
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTable">
+            <summary>
+            A table will be created.  The action-specific arguments are the
+            table name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTempIndex">
+            <summary>
+            A temporary index will be created.  The action-specific arguments
+            are the index name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTempTable">
+            <summary>
+            A temporary table will be created.  The action-specific arguments
+            are the table name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTempTrigger">
+            <summary>
+            A temporary trigger will be created.  The action-specific arguments
+            are the trigger name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTempView">
+            <summary>
+            A temporary view will be created.  The action-specific arguments are
+            the view name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateTrigger">
+            <summary>
+            A trigger will be created.  The action-specific arguments are the
+            trigger name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateView">
+            <summary>
+            A view will be created.  The action-specific arguments are the view
+            name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Delete">
+            <summary>
+            A DELETE statement will be executed.  The action-specific arguments
+            are the table name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropIndex">
+            <summary>
+            An index will be dropped.  The action-specific arguments are the
+            index name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTable">
+            <summary>
+            A table will be dropped.  The action-specific arguments are the tables
+            name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTempIndex">
+            <summary>
+            A temporary index will be dropped.  The action-specific arguments are
+            the index name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTempTable">
+            <summary>
+            A temporary table will be dropped.  The action-specific arguments are
+            the table name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTempTrigger">
+            <summary>
+            A temporary trigger will be dropped.  The action-specific arguments
+            are the trigger name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTempView">
+            <summary>
+            A temporary view will be dropped.  The action-specific arguments are
+            the view name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropTrigger">
+            <summary>
+            A trigger will be dropped.  The action-specific arguments are the
+            trigger name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropView">
+            <summary>
+            A view will be dropped.  The action-specific arguments are the view
+            name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Insert">
+            <summary>
+            An INSERT statement will be executed.  The action-specific arguments
+            are the table name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Pragma">
+            <summary>
+            A PRAGMA statement will be executed.  The action-specific arguments
+            are the name of the PRAGMA and the new value or a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Read">
+            <summary>
+            A table column will be read.  The action-specific arguments are the
+            table name and the column name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Select">
+            <summary>
+            A SELECT statement will be executed.  The action-specific arguments
+            are both null values.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Transaction">
+            <summary>
+            A transaction will be started, committed, or rolled back.  The
+            action-specific arguments are the name of the operation (BEGIN,
+            COMMIT, or ROLLBACK) and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Update">
+            <summary>
+            An UPDATE statement will be executed.  The action-specific arguments
+            are the table name and the column name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Attach">
+            <summary>
+            A database will be attached to the connection.  The action-specific
+            arguments are the database file name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Detach">
+            <summary>
+            A database will be detached from the connection.  The action-specific
+            arguments are the database name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.AlterTable">
+            <summary>
+            The schema of a table will be altered.  The action-specific arguments
+            are the database name and the table name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Reindex">
+            <summary>
+            An index will be deleted and then recreated.  The action-specific
+            arguments are the index name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Analyze">
+            <summary>
+            A table will be analyzed to gathers statistics about it.  The
+            action-specific arguments are the table name and a null value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.CreateVtable">
+            <summary>
+            A virtual table will be created.  The action-specific arguments are
+            the table name and the module name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.DropVtable">
+            <summary>
+            A virtual table will be dropped.  The action-specific arguments are
+            the table name and the module name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Function">
+            <summary>
+            A SQL function will be called.  The action-specific arguments are a
+            null value and the function name.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerActionCode.Savepoint">
+            <summary>
+            A savepoint will be created, released, or rolled back.  The
+            action-specific arguments are the name of the operation (BEGIN,
+            RELEASE, or ROLLBACK) and the savepoint name.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteAuthorizerReturnCode">
+            <summary>
+            The return code for the current call into the authorizer.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerReturnCode.Ok">
+            <summary>
+            The action will be allowed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerReturnCode.Deny">
+            <summary>
+            The overall action will be disallowed and an error message will be
+            returned from the query preparation method.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteAuthorizerReturnCode.Ignore">
+            <summary>
+            The specific action will be disallowed; however, the overall action
+            will continue.  The exact effects of this return code vary depending
+            on the specific action, please refer to the SQLite core library
+            documentation for futher details.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteType">
+            <summary>
+            Class used internally to determine the datatype of a column in a resultset
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteType.Type">
+            <summary>
+            The DbType of the column, or DbType.Object if it cannot be determined
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteType.Affinity">
+            <summary>
+            The affinity of a column, used for expressions or when Type is DbType.Object
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteDataAdapter">
+            <summary>
+            SQLite implementation of DbDataAdapter.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.#ctor">
+            <overloads>
+            This class is just a shell around the DbDataAdapter.  Nothing from
+            DbDataAdapter is overridden here, just a few constructors are defined.
+            </overloads>
+            <summary>
+            Default constructor.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.#ctor(System.Data.SQLite.SQLiteCommand)">
+            <summary>
+            Constructs a data adapter using the specified select command.
+            </summary>
+            <param name="cmd">
+            The select command to associate with the adapter.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.#ctor(System.String,System.Data.SQLite.SQLiteConnection)">
+            <summary>
+            Constructs a data adapter with the supplied select command text and
+            associated with the specified connection.
+            </summary>
+            <param name="commandText">
+            The select command text to associate with the data adapter.
+            </param>
+            <param name="connection">
+            The connection to associate with the select command.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.#ctor(System.String,System.String)">
+            <summary>
+            Constructs a data adapter with the specified select command text,
+            and using the specified database connection string.
+            </summary>
+            <param name="commandText">
+            The select command text to use to construct a select command.
+            </param>
+            <param name="connectionString">
+            A connection string suitable for passing to a new SQLiteConnection,
+            which is associated with the select command.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.#ctor(System.String,System.String,System.Boolean)">
+            <summary>
+            Constructs a data adapter with the specified select command text,
+            and using the specified database connection string.
+            </summary>
+            <param name="commandText">
+            The select command text to use to construct a select command.
+            </param>
+            <param name="connectionString">
+            A connection string suitable for passing to a new SQLiteConnection,
+            which is associated with the select command.
+            </param>
+            <param name="parseViaFramework">
+            Non-zero to parse the connection string using the built-in (i.e.
+            framework provided) parser when opening the connection.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.OnRowUpdating(System.Data.Common.RowUpdatingEventArgs)">
+            <summary>
+            Raised by the underlying DbDataAdapter when a row is being updated
+            </summary>
+            <param name="value">The event's specifics</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataAdapter.OnRowUpdated(System.Data.Common.RowUpdatedEventArgs)">
+            <summary>
+            Raised by DbDataAdapter after a row is updated
+            </summary>
+            <param name="value">The event's specifics</param>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteDataAdapter.RowUpdating">
+            <summary>
+            Row updating event handler
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteDataAdapter.RowUpdated">
+            <summary>
+            Row updated event handler
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataAdapter.SelectCommand">
+            <summary>
+            Gets/sets the select command for this DataAdapter
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataAdapter.InsertCommand">
+            <summary>
+            Gets/sets the insert command for this DataAdapter
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataAdapter.UpdateCommand">
+            <summary>
+            Gets/sets the update command for this DataAdapter
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataAdapter.DeleteCommand">
+            <summary>
+            Gets/sets the delete command for this DataAdapter
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteDataReader">
+            <summary>
+            SQLite implementation of DbDataReader.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._command">
+            <summary>
+            Underlying command this reader is attached to
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._activeStatementIndex">
+            <summary>
+            Index of the current statement in the command being processed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._activeStatement">
+            <summary>
+            Current statement being Read()
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._readingState">
+            <summary>
+            State of the current statement being processed.
+            -1 = First Step() executed, so the first Read() will be ignored
+             0 = Actively reading
+             1 = Finished reading
+             2 = Non-row-returning statement, no records
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._rowsAffected">
+            <summary>
+            Number of records affected by the insert/update statements executed on the command
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._fieldCount">
+            <summary>
+            Count of fields (columns) in the row-returning statement currently being processed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._fieldIndexes">
+            <summary>
+            Maps the field (column) names to their corresponding indexes within the results.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._fieldTypeArray">
+            <summary>
+            Datatypes of active fields (columns) in the current statement, used for type-restricting data
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._commandBehavior">
+            <summary>
+            The behavior of the datareader
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._disposeCommand">
+            <summary>
+            If set, then dispose of the command object when the reader is finished
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._throwOnDisposed">
+            <summary>
+            If set, then raise an exception when the object is accessed after being disposed.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._keyInfo">
+            <summary>
+            An array of rowid's for the active statement if CommandBehavior.KeyInfo is specified
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._version">
+            <summary>
+            Matches the version of the connection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteDataReader._baseSchemaName">
+            <summary>
+            The "stub" (i.e. placeholder) base schema name to use when returning
+            column schema information.  Matches the base schema name used by the
+            associated connection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.#ctor(System.Data.SQLite.SQLiteCommand,System.Data.CommandBehavior)">
+            <summary>
+            Internal constructor, initializes the datareader and sets up to begin executing statements
+            </summary>
+            <param name="cmd">The SQLiteCommand this data reader is for</param>
+            <param name="behave">The expected behavior of the data reader</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.Dispose(System.Boolean)">
+            <summary>
+            Dispose of all resources used by this datareader.
+            </summary>
+            <param name="disposing"></param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.Close">
+            <summary>
+            Closes the datareader, potentially closing the connection as well if CommandBehavior.CloseConnection was specified.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.CheckClosed">
+            <summary>
+            Throw an error if the datareader is closed
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.CheckValidRow">
+            <summary>
+            Throw an error if a row is not loaded
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetEnumerator">
+            <summary>
+            Enumerator support
+            </summary>
+            <returns>Returns a DbEnumerator object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.VerifyType(System.Int32,System.Data.DbType)">
+             <summary>
+             SQLite is inherently un-typed.  All datatypes in SQLite are natively strings.  The definition of the columns of a table
+             and the affinity of returned types are all we have to go on to type-restrict data in the reader.
+            
+             This function attempts to verify that the type of data being requested of a column matches the datatype of the column.  In
+             the case of columns that are not backed into a table definition, we attempt to match up the affinity of a column (int, double, string or blob)
+             to a set of known types that closely match that affinity.  It's not an exact science, but its the best we can do.
+             </summary>
+             <returns>
+             This function throws an InvalidTypeCast() exception if the requested type doesn't match the column's definition or affinity.
+             </returns>
+             <param name="i">The index of the column to type-check</param>
+             <param name="typ">The type we want to get out of the column</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetBoolean(System.Int32)">
+            <summary>
+            Retrieves the column as a boolean value
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>bool</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetByte(System.Int32)">
+            <summary>
+            Retrieves the column as a single byte value
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>byte</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetBytes(System.Int32,System.Int64,System.Byte[],System.Int32,System.Int32)">
+            <summary>
+            Retrieves a column as an array of bytes (blob)
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <param name="fieldOffset">The zero-based index of where to begin reading the data</param>
+            <param name="buffer">The buffer to write the bytes into</param>
+            <param name="bufferoffset">The zero-based index of where to begin writing into the array</param>
+            <param name="length">The number of bytes to retrieve</param>
+            <returns>The actual number of bytes written into the array</returns>
+            <remarks>
+            To determine the number of bytes in the column, pass a null value for the buffer.  The total length will be returned.
+            </remarks>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetChar(System.Int32)">
+            <summary>
+            Returns the column as a single character
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>char</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetChars(System.Int32,System.Int64,System.Char[],System.Int32,System.Int32)">
+            <summary>
+            Retrieves a column as an array of chars (blob)
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <param name="fieldoffset">The zero-based index of where to begin reading the data</param>
+            <param name="buffer">The buffer to write the characters into</param>
+            <param name="bufferoffset">The zero-based index of where to begin writing into the array</param>
+            <param name="length">The number of bytes to retrieve</param>
+            <returns>The actual number of characters written into the array</returns>
+            <remarks>
+            To determine the number of characters in the column, pass a null value for the buffer.  The total length will be returned.
+            </remarks>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetDataTypeName(System.Int32)">
+            <summary>
+            Retrieves the name of the back-end datatype of the column
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>string</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetDateTime(System.Int32)">
+            <summary>
+            Retrieve the column as a date/time value
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>DateTime</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetDecimal(System.Int32)">
+            <summary>
+            Retrieve the column as a decimal value
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>decimal</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetDouble(System.Int32)">
+            <summary>
+            Returns the column as a double
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>double</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetFieldType(System.Int32)">
+            <summary>
+            Returns the .NET type of a given column
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>Type</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetFloat(System.Int32)">
+            <summary>
+            Returns a column as a float value
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>float</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetGuid(System.Int32)">
+            <summary>
+            Returns the column as a Guid
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>Guid</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetInt16(System.Int32)">
+            <summary>
+            Returns the column as a short
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>Int16</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetInt32(System.Int32)">
+            <summary>
+            Retrieves the column as an int
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>Int32</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetInt64(System.Int32)">
+            <summary>
+            Retrieves the column as a long
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>Int64</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetName(System.Int32)">
+            <summary>
+            Retrieves the name of the column
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>string</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetOrdinal(System.String)">
+            <summary>
+            Retrieves the i of a column, given its name
+            </summary>
+            <param name="name">The name of the column to retrieve</param>
+            <returns>The int i of the column</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetSchemaTable">
+            <summary>
+            Schema information in SQLite is difficult to map into .NET conventions, so a lot of work must be done
+            to gather the necessary information so it can be represented in an ADO.NET manner.
+            </summary>
+            <returns>Returns a DataTable containing the schema information for the active SELECT statement being processed.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetString(System.Int32)">
+            <summary>
+            Retrieves the column as a string
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>string</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetValue(System.Int32)">
+            <summary>
+            Retrieves the column as an object corresponding to the underlying datatype of the column
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetValues(System.Object[])">
+            <summary>
+            Retreives the values of multiple columns, up to the size of the supplied array
+            </summary>
+            <param name="values">The array to fill with values from the columns in the current resultset</param>
+            <returns>The number of columns retrieved</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetValues">
+            <summary>
+            Returns a collection containing all the column names and values for the
+            current row of data in the current resultset, if any.  If there is no
+            current row or no current resultset, an exception may be thrown.
+            </summary>
+            <returns>
+            The collection containing the column name and value information for the
+            current row of data in the current resultset or null if this information
+            cannot be obtained.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.IsDBNull(System.Int32)">
+            <summary>
+            Returns True if the specified column is null
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>True or False</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.NextResult">
+            <summary>
+            Moves to the next resultset in multiple row-returning SQL command.
+            </summary>
+            <returns>True if the command was successful and a new resultset is available, False otherwise.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetFlags(System.Data.SQLite.SQLiteDataReader)">
+            <summary>
+            This method attempts to query the flags associated with the database
+            connection in use.  If the database connection is disposed, the default
+            flags will be returned.
+            </summary>
+            <param name="dataReader">
+            The data reader containing the databse connection to query the flags from.
+            </param>
+            <returns>
+            The connection flags value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.GetSQLiteType(System.Int32)">
+            <summary>
+            Retrieves the SQLiteType for a given column, and caches it to avoid repetetive interop calls.
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>A SQLiteType structure</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteDataReader.Read">
+            <summary>
+            Reads the next row from the resultset
+            </summary>
+            <returns>True if a new row was successfully loaded and is ready for processing</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.Depth">
+            <summary>
+            Not implemented.  Returns 0
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.FieldCount">
+            <summary>
+            Returns the number of columns in the current resultset
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.VisibleFieldCount">
+            <summary>
+            Returns the number of visible fields in the current resultset
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.HasRows">
+            <summary>
+            Returns True if the resultset has rows that can be fetched
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.IsClosed">
+            <summary>
+            Returns True if the data reader is closed
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.RecordsAffected">
+            <summary>
+            Retrieve the count of records affected by an update/insert command.  Only valid once the data reader is closed!
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.Item(System.String)">
+            <summary>
+            Indexer to retrieve data from a column given its name
+            </summary>
+            <param name="name">The name of the column to retrieve data for</param>
+            <returns>The value contained in the column</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteDataReader.Item(System.Int32)">
+            <summary>
+            Indexer to retrieve data from a column given its i
+            </summary>
+            <param name="i">The index of the column to retrieve</param>
+            <returns>The value contained in the column</returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteException">
+            <summary>
+            SQLite exception class.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Private constructor for use with serialization.
+            </summary>
+            <param name="info">
+            Holds the serialized object data about the exception being thrown.
+            </param>
+            <param name="context">
+            Contains contextual information about the source or destination.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.#ctor(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            <summary>
+            Public constructor for generating a SQLite exception given the error
+            code and message.
+            </summary>
+            <param name="errorCode">
+            The SQLite return code to report.
+            </param>
+            <param name="message">
+            Message text to go along with the return code message text.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.#ctor(System.String)">
+            <summary>
+            Public constructor that uses the base class constructor for the error
+            message.
+            </summary>
+            <param name="message">Error message text.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.#ctor">
+            <summary>
+            Public constructor that uses the default base class constructor.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.#ctor(System.String,System.Exception)">
+            <summary>
+            Public constructor that uses the base class constructor for the error
+            message and inner exception.
+            </summary>
+            <param name="message">Error message text.</param>
+            <param name="innerException">The original (inner) exception.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)">
+            <summary>
+            Adds extra information to the serialized object data specific to this
+            class type.  This is only used for serialization.
+            </summary>
+            <param name="info">
+            Holds the serialized object data about the exception being thrown.
+            </param>
+            <param name="context">
+            Contains contextual information about the source or destination.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.GetErrorString(System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Returns the error message for the specified SQLite return code.
+            </summary>
+            <param name="errorCode">The SQLite return code.</param>
+            <returns>The error message or null if it cannot be found.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteException.GetStockErrorMessage(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            <summary>
+            Returns the composite error message based on the SQLite return code
+            and the optional detailed error message.
+            </summary>
+            <param name="errorCode">The SQLite return code.</param>
+            <param name="message">Optional detailed error message.</param>
+            <returns>Error message text for the return code.</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteException.ResultCode">
+            <summary>
+            Gets the associated SQLite result code for this exception as a
+            <see cref="T:System.Data.SQLite.SQLiteErrorCode"/>.  This property returns the same
+            underlying value as the <see cref="P:System.Data.SQLite.SQLiteException.ErrorCode"/> property.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteException.ErrorCode">
+            <summary>
+            Gets the associated SQLite return code for this exception as an
+            <see cref="T:System.Int32"/>.  For desktop versions of the .NET Framework,
+            this property overrides the property of the same name within the
+            <see cref="T:System.Runtime.InteropServices.ExternalException"/>
+            class.  This property returns the same underlying value as the
+            <see cref="P:System.Data.SQLite.SQLiteException.ResultCode"/> property.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteErrorCode">
+            <summary>
+            SQLite error codes.  Actually, this enumeration represents a return code,
+            which may also indicate success in one of several ways (e.g. SQLITE_OK,
+            SQLITE_ROW, and SQLITE_DONE).  Therefore, the name of this enumeration is
+            something of a misnomer.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Unknown">
+            <summary>
+            The error code is unknown.  This error code
+            is only used by the managed wrapper itself.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Ok">
+            <summary>
+            Successful result
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Error">
+            <summary>
+            SQL error or missing database
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Internal">
+            <summary>
+            Internal logic error in SQLite
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Perm">
+            <summary>
+            Access permission denied
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Abort">
+            <summary>
+            Callback routine requested an abort
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Busy">
+            <summary>
+            The database file is locked
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Locked">
+            <summary>
+            A table in the database is locked
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.NoMem">
+            <summary>
+            A malloc() failed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.ReadOnly">
+            <summary>
+            Attempt to write a readonly database
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Interrupt">
+            <summary>
+            Operation terminated by sqlite3_interrupt()
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.IoErr">
+            <summary>
+            Some kind of disk I/O error occurred
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Corrupt">
+            <summary>
+            The database disk image is malformed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.NotFound">
+            <summary>
+            Unknown opcode in sqlite3_file_control()
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Full">
+            <summary>
+            Insertion failed because database is full
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.CantOpen">
+            <summary>
+            Unable to open the database file
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Protocol">
+            <summary>
+            Database lock protocol error
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Empty">
+            <summary>
+            Database is empty
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Schema">
+            <summary>
+            The database schema changed
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.TooBig">
+            <summary>
+            String or BLOB exceeds size limit
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Constraint">
+            <summary>
+            Abort due to constraint violation
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Mismatch">
+            <summary>
+            Data type mismatch
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Misuse">
+            <summary>
+            Library used incorrectly
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.NoLfs">
+            <summary>
+            Uses OS features not supported on host
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Auth">
+            <summary>
+            Authorization denied
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Format">
+            <summary>
+            Auxiliary database format error
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Range">
+            <summary>
+            2nd parameter to sqlite3_bind out of range
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.NotADb">
+            <summary>
+            File opened that is not a database file
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Notice">
+            <summary>
+            Notifications from sqlite3_log()
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Warning">
+            <summary>
+            Warnings from sqlite3_log()
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Row">
+            <summary>
+            sqlite3_step() has another row ready
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.Done">
+            <summary>
+            sqlite3_step() has finished executing
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteErrorCode.NonExtendedMask">
+            <summary>
+            Used to mask off extended result codes
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteFactory">
+            <summary>
+            SQLite implementation of <see cref="T:System.Data.Common.DbProviderFactory"/>.
+            </summary>
+            <summary>
+            SQLite implementation of <see cref="T:System.IServiceProvider"/>.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.#ctor">
+            <summary>
+            Constructs a new instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFactory.Instance">
+            <summary>
+            Static instance member which returns an instanced <see cref="T:System.Data.SQLite.SQLiteFactory"/> class.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.CreateCommand">
+            <summary>
+            Creates and returns a new <see cref="T:System.Data.SQLite.SQLiteCommand"/> object.
+            </summary>
+            <returns>The new object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.CreateCommandBuilder">
+            <summary>
+            Creates and returns a new <see cref="T:System.Data.SQLite.SQLiteCommandBuilder"/> object.
+            </summary>
+            <returns>The new object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.CreateConnection">
+            <summary>
+            Creates and returns a new <see cref="T:System.Data.SQLite.SQLiteConnection"/> object.
+            </summary>
+            <returns>The new object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.CreateConnectionStringBuilder">
+            <summary>
+            Creates and returns a new <see cref="T:System.Data.SQLite.SQLiteConnectionStringBuilder"/> object.
+            </summary>
+            <returns>The new object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.CreateDataAdapter">
+            <summary>
+            Creates and returns a new <see cref="T:System.Data.SQLite.SQLiteDataAdapter"/> object.
+            </summary>
+            <returns>The new object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.CreateParameter">
+            <summary>
+            Creates and returns a new <see cref="T:System.Data.SQLite.SQLiteParameter"/> object.
+            </summary>
+            <returns>The new object.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFactory.System#IServiceProvider#GetService(System.Type)">
+            <summary>
+            Will provide a <see cref="T:System.IServiceProvider"/> object in .NET 3.5.
+            </summary>
+            <param name="serviceType">The class or interface type to query for.</param>
+            <returns></returns>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteFactory.Log">
+            <summary>
+            This event is raised whenever SQLite raises a logging event.
+            Note that this should be set as one of the first things in the
+            application.  This event is provided for backward compatibility only.
+            New code should use the <see cref="T:System.Data.SQLite.SQLiteLog"/> class instead.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteFunction">
+             <summary>
+             This abstract class is designed to handle user-defined functions easily.  An instance of the derived class is made for each
+             connection to the database.
+             </summary>
+             <remarks>
+             Although there is one instance of a class derived from SQLiteFunction per database connection, the derived class has no access
+             to the underlying connection.  This is necessary to deter implementers from thinking it would be a good idea to make database
+             calls during processing.
+            
+             It is important to distinguish between a per-connection instance, and a per-SQL statement context.  One instance of this class
+             services all SQL statements being stepped through on that connection, and there can be many.  One should never store per-statement
+             information in member variables of user-defined function classes.
+            
+             For aggregate functions, always create and store your per-statement data in the contextData object on the 1st step.  This data will
+             be automatically freed for you (and Dispose() called if the item supports IDisposable) when the statement completes.
+             </remarks>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._base">
+            <summary>
+            The base connection this function is attached to
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._contextDataList">
+            <summary>
+            Internal array used to keep track of aggregate function context data
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._flags">
+            <summary>
+            The connection flags associated with this object (this should be the
+            same value as the flags associated with the parent connection object).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._InvokeFunc">
+            <summary>
+            Holds a reference to the callback function for user functions
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._StepFunc">
+            <summary>
+            Holds a reference to the callbakc function for stepping in an aggregate function
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._FinalFunc">
+            <summary>
+            Holds a reference to the callback function for finalizing an aggregate function
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._CompareFunc">
+            <summary>
+            Holds a reference to the callback function for collation sequences
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._context">
+            <summary>
+            Current context of the current callback.  Only valid during a callback
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteFunction._registeredFunctions">
+            <summary>
+            This static list contains all the user-defined functions declared using the proper attributes.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.#ctor">
+            <summary>
+            Internal constructor, initializes the function's internal variables.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.#ctor(System.Data.SQLite.SQLiteDateFormats,System.DateTimeKind,System.String,System.Boolean)">
+            <summary>
+            Constructs an instance of this class using the specified data-type
+            conversion parameters.
+            </summary>
+            <param name="format">
+            The DateTime format to be used when converting string values to a
+            DateTime and binding DateTime parameters.
+            </param>
+            <param name="kind">
+            The <see cref="T:System.DateTimeKind"/> to be used when creating DateTime
+            values.
+            </param>
+            <param name="formatString">
+            The format string to be used when parsing and formatting DateTime
+            values.
+            </param>
+            <param name="utf16">
+            Non-zero to create a UTF-16 data-type conversion context; otherwise,
+            a UTF-8 data-type conversion context will be created.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.Dispose">
+            <summary>
+            Disposes of any active contextData variables that were not automatically cleaned up.  Sometimes this can happen if
+            someone closes the connection while a DataReader is open.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.Dispose(System.Boolean)">
+            <summary>
+            Placeholder for a user-defined disposal routine
+            </summary>
+            <param name="disposing">True if the object is being disposed explicitly</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.Invoke(System.Object[])">
+            <summary>
+            Scalar functions override this method to do their magic.
+            </summary>
+            <remarks>
+            Parameters passed to functions have only an affinity for a certain data type, there is no underlying schema available
+            to force them into a certain type.  Therefore the only types you will ever see as parameters are
+            DBNull.Value, Int64, Double, String or byte[] array.
+            </remarks>
+            <param name="args">The arguments for the command to process</param>
+            <returns>You may return most simple types as a return value, null or DBNull.Value to return null, DateTime, or
+            you may return an Exception-derived class if you wish to return an error to SQLite.  Do not actually throw the error,
+            just return it!</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.Step(System.Object[],System.Int32,System.Object@)">
+            <summary>
+            Aggregate functions override this method to do their magic.
+            </summary>
+            <remarks>
+            Typically you'll be updating whatever you've placed in the contextData field and returning as quickly as possible.
+            </remarks>
+            <param name="args">The arguments for the command to process</param>
+            <param name="stepNumber">The 1-based step number.  This is incrememted each time the step method is called.</param>
+            <param name="contextData">A placeholder for implementers to store contextual data pertaining to the current context.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.Final(System.Object)">
+            <summary>
+            Aggregate functions override this method to finish their aggregate processing.
+            </summary>
+            <remarks>
+            If you implemented your aggregate function properly,
+            you've been recording and keeping track of your data in the contextData object provided, and now at this stage you should have
+            all the information you need in there to figure out what to return.
+            NOTE:  It is possible to arrive here without receiving a previous call to Step(), in which case the contextData will
+            be null.  This can happen when no rows were returned.  You can either return null, or 0 or some other custom return value
+            if that is the case.
+            </remarks>
+            <param name="contextData">Your own assigned contextData, provided for you so you can return your final results.</param>
+            <returns>You may return most simple types as a return value, null or DBNull.Value to return null, DateTime, or
+            you may return an Exception-derived class if you wish to return an error to SQLite.  Do not actually throw the error,
+            just return it!
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.Compare(System.String,System.String)">
+            <summary>
+            User-defined collation sequences override this method to provide a custom string sorting algorithm.
+            </summary>
+            <param name="param1">The first string to compare</param>
+            <param name="param2">The second strnig to compare</param>
+            <returns>1 if param1 is greater than param2, 0 if they are equal, or -1 if param1 is less than param2</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.ConvertParams(System.Int32,System.IntPtr)">
+            <summary>
+            Converts an IntPtr array of context arguments to an object array containing the resolved parameters the pointers point to.
+            </summary>
+            <remarks>
+            Parameters passed to functions have only an affinity for a certain data type, there is no underlying schema available
+            to force them into a certain type.  Therefore the only types you will ever see as parameters are
+            DBNull.Value, Int64, Double, String or byte[] array.
+            </remarks>
+            <param name="nArgs">The number of arguments</param>
+            <param name="argsptr">A pointer to the array of arguments</param>
+            <returns>An object array of the arguments once they've been converted to .NET values</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.SetReturnValue(System.IntPtr,System.Object)">
+            <summary>
+            Takes the return value from Invoke() and Final() and figures out how to return it to SQLite's context.
+            </summary>
+            <param name="context">The context the return value applies to</param>
+            <param name="returnValue">The parameter to return to SQLite</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.ScalarCallback(System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            Internal scalar callback function, which wraps the raw context pointer and calls the virtual Invoke() method.
+            WARNING: Must not throw exceptions.
+            </summary>
+            <param name="context">A raw context pointer</param>
+            <param name="nArgs">Number of arguments passed in</param>
+            <param name="argsptr">A pointer to the array of arguments</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.CompareCallback(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            Internal collation sequence function, which wraps up the raw string pointers and executes the Compare() virtual function.
+            WARNING: Must not throw exceptions.
+            </summary>
+            <param name="ptr">Not used</param>
+            <param name="len1">Length of the string pv1</param>
+            <param name="ptr1">Pointer to the first string to compare</param>
+            <param name="len2">Length of the string pv2</param>
+            <param name="ptr2">Pointer to the second string to compare</param>
+            <returns>Returns -1 if the first string is less than the second.  0 if they are equal, or 1 if the first string is greater
+            than the second.  Returns 0 if an exception is caught.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.CompareCallback16(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            Internal collation sequence function, which wraps up the raw string pointers and executes the Compare() virtual function.
+            WARNING: Must not throw exceptions.
+            </summary>
+            <param name="ptr">Not used</param>
+            <param name="len1">Length of the string pv1</param>
+            <param name="ptr1">Pointer to the first string to compare</param>
+            <param name="len2">Length of the string pv2</param>
+            <param name="ptr2">Pointer to the second string to compare</param>
+            <returns>Returns -1 if the first string is less than the second.  0 if they are equal, or 1 if the first string is greater
+            than the second.  Returns 0 if an exception is caught.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.StepCallback(System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            The internal aggregate Step function callback, which wraps the raw context pointer and calls the virtual Step() method.
+            WARNING: Must not throw exceptions.
+            </summary>
+            <remarks>
+            This function takes care of doing the lookups and getting the important information put together to call the Step() function.
+            That includes pulling out the user's contextData and updating it after the call is made.  We use a sorted list for this so
+            binary searches can be done to find the data.
+            </remarks>
+            <param name="context">A raw context pointer</param>
+            <param name="nArgs">Number of arguments passed in</param>
+            <param name="argsptr">A pointer to the array of arguments</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.FinalCallback(System.IntPtr)">
+            <summary>
+            An internal aggregate Final function callback, which wraps the context pointer and calls the virtual Final() method.
+            WARNING: Must not throw exceptions.
+            </summary>
+            <param name="context">A raw context pointer</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.#cctor">
+            <summary>
+            Using reflection, enumerate all assemblies in the current appdomain looking for classes that
+            have a SQLiteFunctionAttribute attribute, and registering them accordingly.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.RegisterFunction(System.Type)">
+            <summary>
+            Manual method of registering a function.  The type must still have the SQLiteFunctionAttributes in order to work
+            properly, but this is a workaround for the Compact Framework where enumerating assemblies is not currently supported.
+            </summary>
+            <param name="typ">The type of the function to register</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.BindFunctions(System.Data.SQLite.SQLiteBase,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            Called by SQLiteBase derived classes, this function binds all user-defined functions to a connection.
+            It is done this way so that all user-defined functions will access the database using the same encoding scheme
+            as the connection (UTF-8 or UTF-16).
+            </summary>
+            <remarks>
+            The wrapper functions that interop with SQLite will create a unique cookie value, which internally is a pointer to
+            all the wrapped callback functions.  The interop function uses it to map CDecl callbacks to StdCall callbacks.
+            </remarks>
+            <param name="sqlbase">The base object on which the functions are to bind</param>
+            <param name="flags">The flags associated with the parent connection object</param>
+            <returns>Returns a logical list of functions which the connection should retain until it is closed.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunction.BindFunction(System.Data.SQLite.SQLiteBase,System.Data.SQLite.SQLiteFunctionAttribute,System.Data.SQLite.SQLiteFunction,System.Data.SQLite.SQLiteConnectionFlags)">
+            <summary>
+            This function binds a user-defined functions to a connection.
+            </summary>
+            <param name="sqliteBase">
+            The <see cref="T:System.Data.SQLite.SQLiteBase"/> object instance associated with the
+            <see cref="T:System.Data.SQLite.SQLiteConnection"/> that the function should be bound to.
+            </param>
+            <param name="functionAttribute">
+            The <see cref="T:System.Data.SQLite.SQLiteFunctionAttribute"/> object instance containing
+            the metadata for the function to be bound.
+            </param>
+            <param name="function">
+            The <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance that implements the
+            function to be bound.
+            </param>
+            <param name="flags">
+            The flags associated with the parent connection object.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteFunction.SQLiteConvert">
+            <summary>
+            Returns a reference to the underlying connection's SQLiteConvert class, which can be used to convert
+            strings and DateTime's into the current connection's encoding schema.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteFunctionEx">
+            <summary>
+            Extends SQLiteFunction and allows an inherited class to obtain the collating sequence associated with a function call.
+            </summary>
+            <remarks>
+            User-defined functions can call the GetCollationSequence() method in this class and use it to compare strings and char arrays.
+            </remarks>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunctionEx.GetCollationSequence">
+            <summary>
+            Obtains the collating sequence in effect for the given function.
+            </summary>
+            <returns></returns>
+        </member>
+        <member name="T:System.Data.SQLite.FunctionType">
+            <summary>
+            The type of user-defined function to declare
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.FunctionType.Scalar">
+            <summary>
+            Scalar functions are designed to be called and return a result immediately.  Examples include ABS(), Upper(), Lower(), etc.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.FunctionType.Aggregate">
+            <summary>
+            Aggregate functions are designed to accumulate data until the end of a call and then return a result gleaned from the accumulated data.
+            Examples include SUM(), COUNT(), AVG(), etc.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.FunctionType.Collation">
+            <summary>
+            Collation sequences are used to sort textual data in a custom manner, and appear in an ORDER BY clause.  Typically text in an ORDER BY is
+            sorted using a straight case-insensitive comparison function.  Custom collating sequences can be used to alter the behavior of text sorting
+            in a user-defined manner.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteCallback">
+            <summary>
+            An internal callback delegate declaration.
+            </summary>
+            <param name="context">Raw native context pointer for the user function.</param>
+            <param name="argc">Total number of arguments to the user function.</param>
+            <param name="argv">Raw native pointer to the array of raw native argument pointers.</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteFinalCallback">
+            <summary>
+            An internal final callback delegate declaration.
+            </summary>
+            <param name="context">Raw context pointer for the user function</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteCollation">
+            <summary>
+            Internal callback delegate for implementing collation sequences
+            </summary>
+            <param name="puser">Not used</param>
+            <param name="len1">Length of the string pv1</param>
+            <param name="pv1">Pointer to the first string to compare</param>
+            <param name="len2">Length of the string pv2</param>
+            <param name="pv2">Pointer to the second string to compare</param>
+            <returns>Returns -1 if the first string is less than the second.  0 if they are equal, or 1 if the first string is greater
+            than the second.</returns>
+        </member>
+        <member name="T:System.Data.SQLite.CollationTypeEnum">
+            <summary>
+            The type of collating sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationTypeEnum.Binary">
+            <summary>
+            The built-in BINARY collating sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationTypeEnum.NoCase">
+            <summary>
+            The built-in NOCASE collating sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationTypeEnum.Reverse">
+            <summary>
+            The built-in REVERSE collating sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationTypeEnum.Custom">
+            <summary>
+            A custom user-defined collating sequence
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.CollationEncodingEnum">
+            <summary>
+            The encoding type the collation sequence uses
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationEncodingEnum.UTF8">
+            <summary>
+            The collation sequence is UTF8
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationEncodingEnum.UTF16LE">
+            <summary>
+            The collation sequence is UTF16 little-endian
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationEncodingEnum.UTF16BE">
+            <summary>
+            The collation sequence is UTF16 big-endian
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.CollationSequence">
+            <summary>
+            A struct describing the collating sequence a function is executing in
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationSequence.Name">
+            <summary>
+            The name of the collating sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationSequence.Type">
+            <summary>
+            The type of collating sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationSequence.Encoding">
+            <summary>
+            The text encoding of the collation sequence
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.CollationSequence._func">
+            <summary>
+            Context of the function that requested the collating sequence
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.CollationSequence.Compare(System.String,System.String)">
+            <summary>
+            Calls the base collating sequence to compare two strings
+            </summary>
+            <param name="s1">The first string to compare</param>
+            <param name="s2">The second string to compare</param>
+            <returns>-1 if s1 is less than s2, 0 if s1 is equal to s2, and 1 if s1 is greater than s2</returns>
+        </member>
+        <member name="M:System.Data.SQLite.CollationSequence.Compare(System.Char[],System.Char[])">
+            <summary>
+            Calls the base collating sequence to compare two character arrays
+            </summary>
+            <param name="c1">The first array to compare</param>
+            <param name="c2">The second array to compare</param>
+            <returns>-1 if c1 is less than c2, 0 if c1 is equal to c2, and 1 if c1 is greater than c2</returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteFunctionAttribute">
+            <summary>
+            A simple custom attribute to enable us to easily find user-defined functions in
+            the loaded assemblies and initialize them in SQLite as connections are made.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunctionAttribute.#ctor">
+            <summary>
+            Default constructor, initializes the internal variables for the function.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteFunctionAttribute.#ctor(System.String,System.Int32,System.Data.SQLite.FunctionType)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="name">
+            The name of the function, as seen by the SQLite core library.
+            </param>
+            <param name="argumentCount">
+            The number of arguments that the function will accept.
+            </param>
+            <param name="functionType">
+            The type of function being declared.  This will either be Scalar,
+            Aggregate, or Collation.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteFunctionAttribute.Name">
+            <summary>
+            The function's name as it will be used in SQLite command text.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteFunctionAttribute.Arguments">
+            <summary>
+            The number of arguments this function expects.  -1 if the number of arguments is variable.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteFunctionAttribute.FuncType">
+            <summary>
+            The type of function this implementation will be.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteFunctionAttribute.InstanceType">
+            <summary>
+            The <see cref="T:System.Type"/> object instance that describes the class
+            containing the implementation for the associated function.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteKeyReader">
+            <summary>
+            This class provides key info for a given SQLite statement.
+            <remarks>
+            Providing key information for a given statement is non-trivial :(
+            </remarks>
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteKeyReader.#ctor(System.Data.SQLite.SQLiteConnection,System.Data.SQLite.SQLiteDataReader,System.Data.SQLite.SQLiteStatement)">
+            <summary>
+            This function does all the nasty work at determining what keys need to be returned for
+            a given statement.
+            </summary>
+            <param name="cnn"></param>
+            <param name="reader"></param>
+            <param name="stmt"></param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteKeyReader.Sync">
+            <summary>
+            Make sure all the subqueries are open and ready and sync'd with the current rowid
+            of the table they're supporting
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteKeyReader.Reset">
+            <summary>
+            Release any readers on any subqueries
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteKeyReader.AppendSchemaTable(System.Data.DataTable)">
+            <summary>
+            Append all the columns we've added to the original query to the schema
+            </summary>
+            <param name="tbl"></param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteKeyReader.Count">
+            <summary>
+            How many additional columns of keyinfo we're holding
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteKeyReader.KeyInfo">
+            <summary>
+            Used to support CommandBehavior.KeyInfo
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteKeyReader.KeyQuery">
+            <summary>
+            A single sub-query for a given table/database.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.LogEventArgs">
+            <summary>
+            Event data for logging event handlers.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.LogEventArgs.ErrorCode">
+            <summary>
+            The error code.  The type of this object value should be
+            <see cref="T:System.Int32"/> or <see cref="T:System.Data.SQLite.SQLiteErrorCode"/>.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.LogEventArgs.Message">
+            <summary>
+            SQL statement text as the statement first begins executing
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.LogEventArgs.Data">
+            <summary>
+            Extra data associated with this event, if any.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.LogEventArgs.#ctor(System.IntPtr,System.Object,System.String,System.Object)">
+            <summary>
+            Constructs the object.
+            </summary>
+            <param name="pUserData">Should be null.</param>
+            <param name="errorCode">
+            The error code.  The type of this object value should be
+            <see cref="T:System.Int32"/> or <see cref="T:System.Data.SQLite.SQLiteErrorCode"/>.
+            </param>
+            <param name="message">The error message, if any.</param>
+            <param name="data">The extra data, if any.</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteLogEventHandler">
+            <summary>
+            Raised when a log event occurs.
+            </summary>
+            <param name="sender">The current connection</param>
+            <param name="e">Event arguments of the trace</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteLog">
+            <summary>
+            Manages the SQLite custom logging functionality and the associated
+            callback for the whole process.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteLog.syncRoot">
+            <summary>
+            Object used to synchronize access to the static instance data
+            for this class.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteLog._domainUnload">
+            <summary>
+            Member variable to store the AppDomain.DomainUnload event handler.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteLog._defaultHandler">
+            <summary>
+            The default log event handler.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteLog._callback">
+            <summary>
+            The log callback passed to native SQLite engine.  This must live
+            as long as the SQLite library has a pointer to it.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteLog._sql">
+            <summary>
+            The base SQLite object to interop with.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteLog._enabled">
+            <summary>
+            This will be non-zero if logging is currently enabled.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.Initialize">
+            <summary>
+            Initializes the SQLite logging facilities.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.DomainUnload(System.Object,System.EventArgs)">
+            <summary>
+            Handles the AppDomain being unloaded.
+            </summary>
+            <param name="sender">Should be null.</param>
+            <param name="e">The data associated with this event.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.LogMessage(System.String)">
+            <summary>
+            Log a message to all the registered log event handlers without going
+            through the SQLite library.
+            </summary>
+            <param name="message">The message to be logged.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.LogMessage(System.Data.SQLite.SQLiteErrorCode,System.String)">
+            <summary>
+            Log a message to all the registered log event handlers without going
+            through the SQLite library.
+            </summary>
+            <param name="errorCode">The SQLite error code.</param>
+            <param name="message">The message to be logged.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.LogMessage(System.Int32,System.String)">
+            <summary>
+            Log a message to all the registered log event handlers without going
+            through the SQLite library.
+            </summary>
+            <param name="errorCode">The integer error code.</param>
+            <param name="message">The message to be logged.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.LogMessage(System.Object,System.String)">
+            <summary>
+            Log a message to all the registered log event handlers without going
+            through the SQLite library.
+            </summary>
+            <param name="errorCode">
+            The error code.  The type of this object value should be
+            System.Int32 or SQLiteErrorCode.
+            </param>
+            <param name="message">The message to be logged.</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.InitializeDefaultHandler">
+            <summary>
+            Creates and initializes the default log event handler.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.AddDefaultHandler">
+            <summary>
+            Adds the default log event handler to the list of handlers.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.RemoveDefaultHandler">
+            <summary>
+            Removes the default log event handler from the list of handlers.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.LogCallback(System.IntPtr,System.Int32,System.IntPtr)">
+             <summary>
+             Internal proxy function that calls any registered application log
+             event handlers.
+            
+             WARNING: This method is used more-or-less directly by native code,
+                      do not modify its type signature.
+             </summary>
+             <param name="pUserData">
+             The extra data associated with this message, if any.
+             </param>
+             <param name="errorCode">
+             The error code associated with this message.
+             </param>
+             <param name="pMessage">
+             The message string to be logged.
+             </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteLog.LogEventHandler(System.Object,System.Data.SQLite.LogEventArgs)">
+            <summary>
+            Default logger.  Currently, uses the Trace class (i.e. sends events
+            to the current trace listeners, if any).
+            </summary>
+            <param name="sender">Should be null.</param>
+            <param name="e">The data associated with this event.</param>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteLog._handlers">
+            <summary>
+            Member variable to store the application log handler to call.
+            </summary>
+        </member>
+        <member name="E:System.Data.SQLite.SQLiteLog.Log">
+            <summary>
+            This event is raised whenever SQLite raises a logging event.
+            Note that this should be set as one of the first things in the
+            application.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteLog.Enabled">
+            <summary>
+            If this property is true, logging is enabled; otherwise, logging is
+            disabled.  When logging is disabled, no logging events will fire.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteMetaDataCollectionNames">
+            <summary>
+            MetaDataCollections specific to SQLite
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Catalogs">
+            <summary>
+            Returns a list of databases attached to the connection
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Columns">
+            <summary>
+            Returns column information for the specified table
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Indexes">
+            <summary>
+            Returns index information for the optionally-specified table
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.IndexColumns">
+            <summary>
+            Returns base columns for the given index
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Tables">
+            <summary>
+            Returns the tables in the given catalog
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Views">
+            <summary>
+            Returns user-defined views in the given catalog
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.ViewColumns">
+            <summary>
+            Returns underlying column information on the given view
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.ForeignKeys">
+            <summary>
+            Returns foreign key information for the given catalog
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteMetaDataCollectionNames.Triggers">
+            <summary>
+            Returns the triggers on the database
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteParameter">
+            <summary>
+            SQLite implementation of DbParameter.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameter._dbType">
+            <summary>
+            The data type of the parameter
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameter._rowVersion">
+            <summary>
+            The version information for mapping the parameter
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameter._objValue">
+            <summary>
+            The value of the data in the parameter
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameter._sourceColumn">
+            <summary>
+            The source column for the parameter
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameter._parameterName">
+            <summary>
+            The column name
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameter._dataSize">
+            <summary>
+            The data size, unused by SQLite
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor">
+            <summary>
+            Default constructor
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String)">
+            <summary>
+            Constructs a named parameter given the specified parameter name
+            </summary>
+            <param name="parameterName">The parameter name</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Object)">
+            <summary>
+            Constructs a named parameter given the specified parameter name and initial value
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="value">The initial value of the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType)">
+            <summary>
+            Constructs a named parameter of the specified type
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="dbType">The datatype of the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.String)">
+            <summary>
+            Constructs a named parameter of the specified type and source column reference
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="dbType">The data type</param>
+            <param name="sourceColumn">The source column</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.String,System.Data.DataRowVersion)">
+            <summary>
+            Constructs a named parameter of the specified type, source column and row version
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="dbType">The data type</param>
+            <param name="sourceColumn">The source column</param>
+            <param name="rowVersion">The row version information</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType)">
+            <summary>
+            Constructs an unnamed parameter of the specified data type
+            </summary>
+            <param name="dbType">The datatype of the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.Object)">
+            <summary>
+            Constructs an unnamed parameter of the specified data type and sets the initial value
+            </summary>
+            <param name="dbType">The datatype of the parameter</param>
+            <param name="value">The initial value of the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.String)">
+            <summary>
+            Constructs an unnamed parameter of the specified data type and source column
+            </summary>
+            <param name="dbType">The datatype of the parameter</param>
+            <param name="sourceColumn">The source column</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.String,System.Data.DataRowVersion)">
+            <summary>
+            Constructs an unnamed parameter of the specified data type, source column and row version
+            </summary>
+            <param name="dbType">The data type</param>
+            <param name="sourceColumn">The source column</param>
+            <param name="rowVersion">The row version information</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.Int32)">
+            <summary>
+            Constructs a named parameter of the specified type and size
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.Int32,System.String)">
+            <summary>
+            Constructs a named parameter of the specified type, size and source column
+            </summary>
+            <param name="parameterName">The name of the parameter</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+            <param name="sourceColumn">The source column</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.Int32,System.String,System.Data.DataRowVersion)">
+            <summary>
+            Constructs a named parameter of the specified type, size, source column and row version
+            </summary>
+            <param name="parameterName">The name of the parameter</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+            <param name="sourceColumn">The source column</param>
+            <param name="rowVersion">The row version information</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.Int32,System.Data.ParameterDirection,System.Boolean,System.Byte,System.Byte,System.String,System.Data.DataRowVersion,System.Object)">
+            <summary>
+            Constructs a named parameter of the specified type, size, source column and row version
+            </summary>
+            <param name="parameterName">The name of the parameter</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+            <param name="direction">Only input parameters are supported in SQLite</param>
+            <param name="isNullable">Ignored</param>
+            <param name="precision">Ignored</param>
+            <param name="scale">Ignored</param>
+            <param name="sourceColumn">The source column</param>
+            <param name="rowVersion">The row version information</param>
+            <param name="value">The initial value to assign the parameter</param>   
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.String,System.Data.DbType,System.Int32,System.Data.ParameterDirection,System.Byte,System.Byte,System.String,System.Data.DataRowVersion,System.Boolean,System.Object)">
+            <summary>
+            Constructs a named parameter, yet another flavor
+            </summary>
+            <param name="parameterName">The name of the parameter</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+            <param name="direction">Only input parameters are supported in SQLite</param>
+            <param name="precision">Ignored</param>
+            <param name="scale">Ignored</param>
+            <param name="sourceColumn">The source column</param>
+            <param name="rowVersion">The row version information</param>
+            <param name="sourceColumnNullMapping">Whether or not this parameter is for comparing NULL's</param>
+            <param name="value">The intial value to assign the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.Int32)">
+            <summary>
+            Constructs an unnamed parameter of the specified type and size
+            </summary>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.Int32,System.String)">
+            <summary>
+            Constructs an unnamed parameter of the specified type, size, and source column
+            </summary>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+            <param name="sourceColumn">The source column</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.#ctor(System.Data.DbType,System.Int32,System.String,System.Data.DataRowVersion)">
+            <summary>
+            Constructs an unnamed parameter of the specified type, size, source column and row version
+            </summary>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the parameter</param>
+            <param name="sourceColumn">The source column</param>
+            <param name="rowVersion">The row version information</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.ResetDbType">
+            <summary>
+            Resets the DbType of the parameter so it can be inferred from the value
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameter.Clone">
+            <summary>
+            Clones a parameter
+            </summary>
+            <returns>A new, unassociated SQLiteParameter</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.IsNullable">
+            <summary>
+            Whether or not the parameter can contain a null value
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.DbType">
+            <summary>
+            Returns the datatype of the parameter
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.Direction">
+            <summary>
+            Supports only input parameters
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.ParameterName">
+            <summary>
+            Returns the parameter name
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.Size">
+            <summary>
+            Returns the size of the parameter
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.SourceColumn">
+            <summary>
+            Gets/sets the source column
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.SourceColumnNullMapping">
+            <summary>
+            Used by DbCommandBuilder to determine the mapping for nullable fields
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.SourceVersion">
+            <summary>
+            Gets and sets the row version
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameter.Value">
+            <summary>
+            Gets and sets the parameter value.  If no datatype was specified, the datatype will assume the type from the value given.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteParameterCollection">
+            <summary>
+            SQLite implementation of DbParameterCollection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameterCollection._command">
+            <summary>
+            The underlying command to which this collection belongs
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameterCollection._parameterList">
+            <summary>
+            The internal array of parameters in this collection
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteParameterCollection._unboundFlag">
+            <summary>
+            Determines whether or not all parameters have been bound to their statement(s)
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.#ctor(System.Data.SQLite.SQLiteCommand)">
+            <summary>
+            Initializes the collection
+            </summary>
+            <param name="cmd">The command to which the collection belongs</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.GetEnumerator">
+            <summary>
+            Retrieves an enumerator for the collection
+            </summary>
+            <returns>An enumerator for the underlying array</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Add(System.String,System.Data.DbType,System.Int32,System.String)">
+            <summary>
+            Adds a parameter to the collection
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the value</param>
+            <param name="sourceColumn">The source column</param>
+            <returns>A SQLiteParameter object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Add(System.String,System.Data.DbType,System.Int32)">
+            <summary>
+            Adds a parameter to the collection
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="parameterType">The data type</param>
+            <param name="parameterSize">The size of the value</param>
+            <returns>A SQLiteParameter object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Add(System.String,System.Data.DbType)">
+            <summary>
+            Adds a parameter to the collection
+            </summary>
+            <param name="parameterName">The parameter name</param>
+            <param name="parameterType">The data type</param>
+            <returns>A SQLiteParameter object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Add(System.Data.SQLite.SQLiteParameter)">
+            <summary>
+            Adds a parameter to the collection
+            </summary>
+            <param name="parameter">The parameter to add</param>
+            <returns>A zero-based index of where the parameter is located in the array</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Add(System.Object)">
+            <summary>
+            Adds a parameter to the collection
+            </summary>
+            <param name="value">The parameter to add</param>
+            <returns>A zero-based index of where the parameter is located in the array</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.AddWithValue(System.String,System.Object)">
+            <summary>
+            Adds a named/unnamed parameter and its value to the parameter collection.
+            </summary>
+            <param name="parameterName">Name of the parameter, or null to indicate an unnamed parameter</param>
+            <param name="value">The initial value of the parameter</param>
+            <returns>Returns the SQLiteParameter object created during the call.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.AddRange(System.Data.SQLite.SQLiteParameter[])">
+            <summary>
+            Adds an array of parameters to the collection
+            </summary>
+            <param name="values">The array of parameters to add</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.AddRange(System.Array)">
+            <summary>
+            Adds an array of parameters to the collection
+            </summary>
+            <param name="values">The array of parameters to add</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Clear">
+            <summary>
+            Clears the array and resets the collection
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Contains(System.String)">
+            <summary>
+            Determines if the named parameter exists in the collection
+            </summary>
+            <param name="parameterName">The name of the parameter to check</param>
+            <returns>True if the parameter is in the collection</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Contains(System.Object)">
+            <summary>
+            Determines if the parameter exists in the collection
+            </summary>
+            <param name="value">The SQLiteParameter to check</param>
+            <returns>True if the parameter is in the collection</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.CopyTo(System.Array,System.Int32)">
+            <summary>
+            Not implemented
+            </summary>
+            <param name="array"></param>
+            <param name="index"></param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.GetParameter(System.String)">
+            <summary>
+            Retrieve a parameter by name from the collection
+            </summary>
+            <param name="parameterName">The name of the parameter to fetch</param>
+            <returns>A DbParameter object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.GetParameter(System.Int32)">
+            <summary>
+            Retrieves a parameter by its index in the collection
+            </summary>
+            <param name="index">The index of the parameter to retrieve</param>
+            <returns>A DbParameter object</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.IndexOf(System.String)">
+            <summary>
+            Returns the index of a parameter given its name
+            </summary>
+            <param name="parameterName">The name of the parameter to find</param>
+            <returns>-1 if not found, otherwise a zero-based index of the parameter</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.IndexOf(System.Object)">
+            <summary>
+            Returns the index of a parameter
+            </summary>
+            <param name="value">The parameter to find</param>
+            <returns>-1 if not found, otherwise a zero-based index of the parameter</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Insert(System.Int32,System.Object)">
+            <summary>
+            Inserts a parameter into the array at the specified location
+            </summary>
+            <param name="index">The zero-based index to insert the parameter at</param>
+            <param name="value">The parameter to insert</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Remove(System.Object)">
+            <summary>
+            Removes a parameter from the collection
+            </summary>
+            <param name="value">The parameter to remove</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.RemoveAt(System.String)">
+            <summary>
+            Removes a parameter from the collection given its name
+            </summary>
+            <param name="parameterName">The name of the parameter to remove</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.RemoveAt(System.Int32)">
+            <summary>
+            Removes a parameter from the collection given its index
+            </summary>
+            <param name="index">The zero-based parameter index to remove</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.SetParameter(System.String,System.Data.Common.DbParameter)">
+            <summary>
+            Re-assign the named parameter to a new parameter object
+            </summary>
+            <param name="parameterName">The name of the parameter to replace</param>
+            <param name="value">The new parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.SetParameter(System.Int32,System.Data.Common.DbParameter)">
+            <summary>
+            Re-assign a parameter at the specified index
+            </summary>
+            <param name="index">The zero-based index of the parameter to replace</param>
+            <param name="value">The new parameter</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.Unbind">
+            <summary>
+            Un-binds all parameters from their statements
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteParameterCollection.MapParameters(System.Data.SQLite.SQLiteStatement)">
+            <summary>
+            This function attempts to map all parameters in the collection to all statements in a Command.
+            Since named parameters may span multiple statements, this function makes sure all statements are bound
+            to the same named parameter.  Unnamed parameters are bound in sequence.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.IsSynchronized">
+            <summary>
+            Returns false
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.IsFixedSize">
+            <summary>
+            Returns false
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.IsReadOnly">
+            <summary>
+            Returns false
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.SyncRoot">
+            <summary>
+            Returns null
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.Count">
+            <summary>
+            Returns a count of parameters in the collection
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.Item(System.String)">
+            <summary>
+            Overloaded to specialize the return value of the default indexer
+            </summary>
+            <param name="parameterName">Name of the parameter to get/set</param>
+            <returns>The specified named SQLite parameter</returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteParameterCollection.Item(System.Int32)">
+            <summary>
+            Overloaded to specialize the return value of the default indexer
+            </summary>
+            <param name="index">The index of the parameter to get/set</param>
+            <returns>The specified SQLite parameter</returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteStatement">
+            <summary>
+            Represents a single SQL statement in SQLite.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._sql">
+            <summary>
+            The underlying SQLite object this statement is bound to
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._sqlStatement">
+            <summary>
+            The command text of this SQL statement
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._sqlite_stmt">
+            <summary>
+            The actual statement pointer
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._unnamedParameters">
+            <summary>
+            An index from which unnamed parameters begin
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._paramNames">
+            <summary>
+            Names of the parameters as SQLite understands them to be
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._paramValues">
+            <summary>
+            Parameters for this statement
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._command">
+            <summary>
+            Command this statement belongs to (if any)
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteStatement._flags">
+            <summary>
+            The flags associated with the parent connection object.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.#ctor(System.Data.SQLite.SQLiteBase,System.Data.SQLite.SQLiteConnectionFlags,System.Data.SQLite.SQLiteStatementHandle,System.String,System.Data.SQLite.SQLiteStatement)">
+            <summary>
+            Initializes the statement and attempts to get all information about parameters in the statement
+            </summary>
+            <param name="sqlbase">The base SQLite object</param>
+            <param name="flags">The flags associated with the parent connection object</param>
+            <param name="stmt">The statement</param>
+            <param name="strCommand">The command text for this statement</param>
+            <param name="previous">The previous command in a multi-statement command</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.Dispose">
+            <summary>
+            Disposes and finalizes the statement
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.TryGetChanges(System.Int32@)">
+            <summary>
+            If the underlying database connection is open, fetches the number of changed rows
+            resulting from the most recent query; otherwise, does nothing.
+            </summary>
+            <param name="changes">
+            The number of changes when true is returned.
+            Undefined if false is returned.
+            </param>
+            <returns>Non-zero if the number of changed rows was fetched.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.MapParameter(System.String,System.Data.SQLite.SQLiteParameter)">
+            <summary>
+            Called by SQLiteParameterCollection, this function determines if the specified parameter name belongs to
+            this statement, and if so, keeps a reference to the parameter so it can be bound later.
+            </summary>
+            <param name="s">The parameter name to map</param>
+            <param name="p">The parameter to assign it</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.BindParameters">
+            <summary>
+             Bind all parameters, making sure the caller didn't miss any
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.ToBoolean(System.Object,System.IFormatProvider)">
+            <summary>
+            Attempts to convert an arbitrary object to the Boolean data type.
+            Null object values are converted to false.  Throws a SQLiteException
+            upon failure.
+            </summary>
+            <param name="obj">The object value to convert.</param>
+            <param name="provider">The format provider to use.</param>
+            <returns>The converted boolean value.</returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteStatement.BindParameter(System.Int32,System.Data.SQLite.SQLiteParameter)">
+            <summary>
+            Perform the bind operation for an individual parameter
+            </summary>
+            <param name="index">The index of the parameter to bind</param>
+            <param name="param">The parameter we're binding</param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteTransaction">
+            <summary>
+            SQLite implementation of DbTransaction.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteTransaction._cnn">
+            <summary>
+            The connection to which this transaction is bound
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteTransaction.#ctor(System.Data.SQLite.SQLiteConnection,System.Boolean)">
+            <summary>
+            Constructs the transaction object, binding it to the supplied connection
+            </summary>
+            <param name="connection">The connection to open a transaction on</param>
+            <param name="deferredLock">TRUE to defer the writelock, or FALSE to lock immediately</param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteTransaction.Dispose(System.Boolean)">
+            <summary>
+            Disposes the transaction.  If it is currently active, any changes are rolled back.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteTransaction.Commit">
+            <summary>
+            Commits the current transaction.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteTransaction.Rollback">
+            <summary>
+            Rolls back the active transaction.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteTransaction.Connection">
+            <summary>
+            Returns the underlying connection to which this transaction applies.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteTransaction.DbConnection">
+            <summary>
+            Forwards to the local Connection property
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteTransaction.IsolationLevel">
+            <summary>
+            Gets the isolation level of the transaction.  SQLite only supports Serializable transactions.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SR">
+            <summary>
+              A strongly-typed resource class, for looking up localized strings, etc.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SR.ResourceManager">
+            <summary>
+              Returns the cached ResourceManager instance used by this class.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SR.Culture">
+            <summary>
+              Overrides the current thread's CurrentUICulture property for all
+              resource lookups using this strongly typed resource class.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SR.DataTypes">
+             <summary>
+               Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot; standalone=&quot;yes&quot;?&gt;
+            &lt;DocumentElement&gt;
+              &lt;DataTypes&gt;
+                &lt;TypeName&gt;smallint&lt;/TypeName&gt;
+                &lt;ProviderDbType&gt;10&lt;/ProviderDbType&gt;
+                &lt;ColumnSize&gt;5&lt;/ColumnSize&gt;
+                &lt;DataType&gt;System.Int16&lt;/DataType&gt;
+                &lt;CreateFormat&gt;smallint&lt;/CreateFormat&gt;
+                &lt;IsAutoIncrementable&gt;false&lt;/IsAutoIncrementable&gt;
+                &lt;IsCaseSensitive&gt;false&lt;/IsCaseSensitive&gt;
+                &lt;IsFixedLength&gt;true&lt;/IsFixedLength&gt;
+                &lt;IsFixedPrecisionScale&gt;true&lt;/IsFixedPrecisionScale&gt;
+                &lt;IsLong&gt;false&lt;/IsLong&gt;
+                &lt;IsNullable&gt;true&lt;/ [rest of string was truncated]&quot;;.
+             </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SR.Keywords">
+            <summary>
+              Looks up a localized string similar to ALL,ALTER,AND,AS,AUTOINCREMENT,BETWEEN,BY,CASE,CHECK,COLLATE,COMMIT,CONSTRAINT,CREATE,CROSS,DEFAULT,DEFERRABLE,DELETE,DISTINCT,DROP,ELSE,ESCAPE,EXCEPT,FOREIGN,FROM,FULL,GROUP,HAVING,IN,INDEX,INNER,INSERT,INTERSECT,INTO,IS,ISNULL,JOIN,LEFT,LIMIT,NATURAL,NOT,NOTNULL,NULL,ON,OR,ORDER,OUTER,PRIMARY,REFERENCES,RIGHT,ROLLBACK,SELECT,SET,TABLE,THEN,TO,TRANSACTION,UNION,UNIQUE,UPDATE,USING,VALUES,WHEN,WHERE.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SR.MetaDataCollections">
+             <summary>
+               Looks up a localized string similar to &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
+            &lt;DocumentElement&gt;
+              &lt;MetaDataCollections&gt;
+                &lt;CollectionName&gt;MetaDataCollections&lt;/CollectionName&gt;
+                &lt;NumberOfRestrictions&gt;0&lt;/NumberOfRestrictions&gt;
+                &lt;NumberOfIdentifierParts&gt;0&lt;/NumberOfIdentifierParts&gt;
+              &lt;/MetaDataCollections&gt;
+              &lt;MetaDataCollections&gt;
+                &lt;CollectionName&gt;DataSourceInformation&lt;/CollectionName&gt;
+                &lt;NumberOfRestrictions&gt;0&lt;/NumberOfRestrictions&gt;
+                &lt;NumberOfIdentifierParts&gt;0&lt;/NumberOfIdentifierParts&gt;
+              &lt;/MetaDataCollections&gt;
+              &lt;MetaDataC [rest of string was truncated]&quot;;.
+             </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UnsafeNativeMethods.PROCESSOR_ARCHITECTURE">
+            <summary>
+            The name of the environment variable containing the processor
+            architecture of the current process.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.LoadLibrary(System.String)">
+            <summary>
+            This is the P/Invoke method that wraps the native Win32 LoadLibrary
+            function.  See the MSDN documentation for full details on what it
+            does.
+            </summary>
+            <param name="fileName">
+            The name of the executable library.
+            </param>
+            <returns>
+            The native module handle upon success -OR- IntPtr.Zero on failure.
+            </returns>
+        </member>
+        <member name="F:System.Data.SQLite.UnsafeNativeMethods.staticSyncRoot">
+            <summary>
+            This lock is used to protect the static _SQLiteModule and
+            processorArchitecturePlatforms fields, below.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UnsafeNativeMethods.processorArchitecturePlatforms">
+            <summary>
+            Stores the mappings between processor architecture names and platform
+            names.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.UnsafeNativeMethods._SQLiteModule">
+            <summary>
+            The native module handle for the native SQLite library or the value
+            IntPtr.Zero.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.#cctor">
+            <summary>
+            For now, this method simply calls the Initialize method.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.Initialize">
+            <summary>
+            Attempts to initialize this class by pre-loading the native SQLite
+            library for the processor architecture of the current process.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.GetBaseDirectory">
+            <summary>
+            Queries and returns the base directory of the current application
+            domain.
+            </summary>
+            <returns>
+            The base directory for the current application domain -OR- null if it
+            cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.FixUpDllFileName(System.String)">
+            <summary>
+            Determines if the dynamic link library file name requires a suffix
+            and adds it if necessary.
+            </summary>
+            <param name="fileName">
+            The original dynamic link library file name to inspect.
+            </param>
+            <returns>
+            The dynamic link library file name, possibly modified to include an
+            extension.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.GetProcessorArchitecture">
+            <summary>
+            Queries and returns the processor architecture of the current
+            process.
+            </summary>
+            <returns>
+            The processor architecture of the current process -OR- null if it
+            cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.GetPlatformName(System.String)">
+            <summary>
+            Given the processor architecture, returns the name of the platform.
+            </summary>
+            <param name="processorArchitecture">
+            The processor architecture to be translated to a platform name.
+            </param>
+            <returns>
+            The platform name for the specified processor architecture -OR- null
+            if it cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.UnsafeNativeMethods.PreLoadSQLiteDll(System.String,System.String)">
+            <summary>
+            Attempts to load the native SQLite library based on the specified
+            directory and processor architecture.
+            </summary>
+            <param name="directory">
+            The base directory to use, null for default (the base directory of
+            the current application domain).  This directory should contain the
+            processor architecture specific sub-directories.
+            </param>
+            <param name="processorArchitecture">
+            The requested processor architecture, null for default (the
+            processor architecture of the current process).  This caller should
+            almost always specify null for this parameter.
+            </param>
+            <returns>
+            The native module handle as returned by LoadLibrary -OR- IntPtr.Zero
+            if the loading fails for any reason.
+            </returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteContext">
+            <summary>
+            This class represents a context from the SQLite core library that can
+            be passed to the sqlite3_result_*() and associated functions.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.ISQLiteNativeHandle">
+            <summary>
+            This interface represents a native handle provided by the SQLite core
+            library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.ISQLiteNativeHandle.NativeHandle">
+            <summary>
+            The native handle value.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteContext.pContext">
+            <summary>
+            The native context handle.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.#ctor(System.IntPtr)">
+            <summary>
+            Constructs an instance of this class using the specified native
+            context handle.
+            </summary>
+            <param name="pContext">
+            The native context handle to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetNull">
+            <summary>
+            Sets the context result to NULL.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetDouble(System.Double)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.Double"/>
+            value.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.Double"/> value to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetInt(System.Int32)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.Int32"/>
+            value.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.Int32"/> value to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetInt64(System.Int64)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.Int64"/>
+            value.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.Int64"/> value to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetString(System.String)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.String"/>
+            value.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.String"/> value to use.  This value will be
+            converted to the UTF-8 encoding prior to being used.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetError(System.String)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.String"/>
+            value containing an error message.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.String"/> value containing the error message text.
+            This value will be converted to the UTF-8 encoding prior to being
+            used.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetErrorCode(System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.Data.SQLite.SQLiteErrorCode"/>
+            value.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetErrorTooBig">
+            <summary>
+            Sets the context result to contain the error code SQLITE_TOOBIG.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetErrorNoMemory">
+            <summary>
+            Sets the context result to contain the error code SQLITE_NOMEM.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetBlob(System.Byte[])">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.Byte"/> array
+            value.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.Byte"/> array value to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetZeroBlob(System.Int32)">
+            <summary>
+            Sets the context result to a BLOB of zeros of the specified size.
+            </summary>
+            <param name="value">
+            The number of zero bytes to use for the BLOB context result.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteContext.SetValue(System.Data.SQLite.SQLiteValue)">
+            <summary>
+            Sets the context result to the specified <see cref="T:System.Data.SQLite.SQLiteValue"/>.
+            </summary>
+            <param name="value">
+            The <see cref="T:System.Data.SQLite.SQLiteValue"/> to use.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteContext.NativeHandle">
+            <summary>
+            Returns the underlying SQLite native handle associated with this
+            object instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteValue">
+            <summary>
+            This class represents a value from the SQLite core library that can be
+            passed to the sqlite3_value_*() and associated functions.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteValue.pValue">
+            <summary>
+            The native value handle.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.#ctor(System.IntPtr)">
+            <summary>
+            Constructs an instance of this class using the specified native
+            value handle.
+            </summary>
+            <param name="pValue">
+            The native value handle to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.PreventNativeAccess">
+            <summary>
+            Invalidates the native value handle, thereby preventing further
+            access to it from this object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.ArrayFromSizeAndIntPtr(System.Int32,System.IntPtr)">
+            <summary>
+            Converts a logical array of native pointers to native sqlite3_value
+            structures into a managed array of <see cref="T:System.Data.SQLite.SQLiteValue"/>
+            object instances.
+            </summary>
+            <param name="argc">
+            The number of elements in the logical array of native sqlite3_value
+            structures.
+            </param>
+            <param name="argv">
+            The native pointer to the logical array of native sqlite3_value
+            structures to convert.
+            </param>
+            <returns>
+            The managed array of <see cref="T:System.Data.SQLite.SQLiteValue"/> object instances or
+            null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetTypeAffinity">
+            <summary>
+            Gets and returns the type affinity associated with this value.
+            </summary>
+            <returns>
+            The type affinity associated with this value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetBytes">
+            <summary>
+            Gets and returns the number of bytes associated with this value, if
+            it refers to a UTF-8 encoded string.
+            </summary>
+            <returns>
+            The number of bytes associated with this value.  The returned value
+            may be zero.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetInt">
+            <summary>
+            Gets and returns the <see cref="T:System.Int32"/> associated with this
+            value.
+            </summary>
+            <returns>
+            The <see cref="T:System.Int32"/> associated with this value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetInt64">
+            <summary>
+            Gets and returns the <see cref="T:System.Int64"/> associated with
+            this value.
+            </summary>
+            <returns>
+            The <see cref="T:System.Int64"/> associated with this value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetDouble">
+            <summary>
+            Gets and returns the <see cref="T:System.Double"/> associated with this
+            value.
+            </summary>
+            <returns>
+            The <see cref="T:System.Double"/> associated with this value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetString">
+            <summary>
+            Gets and returns the <see cref="T:System.String"/> associated with this
+            value.
+            </summary>
+            <returns>
+            The <see cref="T:System.String"/> associated with this value.  The value is
+            converted from the UTF-8 encoding prior to being returned.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.GetBlob">
+            <summary>
+            Gets and returns the <see cref="T:System.Byte"/> array associated with this
+            value.
+            </summary>
+            <returns>
+            The <see cref="T:System.Byte"/> array associated with this value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteValue.Persist">
+            <summary>
+            Uses the native value handle to obtain and store the managed value
+            for this object instance, thus saving it for later use.  The type
+            of the managed value is determined by the type affinity of the
+            native value.  If the type affinity is not recognized by this
+            method, no work is done and false is returned.
+            </summary>
+            <returns>
+            Non-zero if the native value was persisted successfully.
+            </returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteValue.NativeHandle">
+            <summary>
+            Returns the underlying SQLite native handle associated with this
+            object instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteValue.Persisted">
+            <summary>
+            Returns non-zero if the native SQLite value has been successfully
+            persisted as a managed value within this object instance (i.e. the
+            <see cref="P:System.Data.SQLite.SQLiteValue.Value"/> property may then be read successfully).
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteValue.Value">
+            <summary>
+            If the managed value for this object instance is available (i.e. it
+            has been previously persisted via the <see cref="M:System.Data.SQLite.SQLiteValue.Persist"/>) method,
+            that value is returned; otherwise, an exception is thrown.  The
+            returned value may be null.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndexConstraintOp">
+            <summary>
+            These are the allowed values for the operators that are part of a
+            constraint term in the WHERE clause of a query that uses a virtual
+            table.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintOp.EqualTo">
+            <summary>
+            This value represents the equality operator.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintOp.GreaterThan">
+            <summary>
+            This value represents the greater than operator.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintOp.LessThanOrEqualTo">
+            <summary>
+            This value represents the less than or equal to operator.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintOp.LessThan">
+            <summary>
+            This value represents the less than operator.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintOp.GreaterThanOrEqualTo">
+            <summary>
+            This value represents the greater than or equal to operator.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintOp.Match">
+            <summary>
+            This value represents the MATCH operator.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndexConstraint">
+            <summary>
+            This class represents the native sqlite3_index_constraint structure
+            from the SQLite core library.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexConstraint.#ctor(System.Data.SQLite.UnsafeNativeMethods.sqlite3_index_constraint)">
+            <summary>
+            Constructs an instance of this class using the specified native
+            sqlite3_index_constraint structure.
+            </summary>
+            <param name="constraint">
+            The native sqlite3_index_constraint structure to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexConstraint.#ctor(System.Int32,System.Data.SQLite.SQLiteIndexConstraintOp,System.Byte,System.Int32)">
+            <summary>
+            Constructs an instance of this class using the specified field
+            values.
+            </summary>
+            <param name="iColumn">
+            Column on left-hand side of constraint.
+            </param>
+            <param name="op">
+            Constraint operator (<see cref="T:System.Data.SQLite.SQLiteIndexConstraintOp"/>).
+            </param>
+            <param name="usable">
+            True if this constraint is usable.
+            </param>
+            <param name="iTermOffset">
+            Used internally - <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/>
+            should ignore.
+            </param>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraint.iColumn">
+            <summary>
+            Column on left-hand side of constraint.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraint.op">
+            <summary>
+            Constraint operator (<see cref="T:System.Data.SQLite.SQLiteIndexConstraintOp"/>).
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraint.usable">
+            <summary>
+            True if this constraint is usable.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraint.iTermOffset">
+            <summary>
+            Used internally - <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/>
+            should ignore.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndexOrderBy">
+            <summary>
+            This class represents the native sqlite3_index_orderby structure from
+            the SQLite core library.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexOrderBy.#ctor(System.Data.SQLite.UnsafeNativeMethods.sqlite3_index_orderby)">
+            <summary>
+            Constructs an instance of this class using the specified native
+            sqlite3_index_orderby structure.
+            </summary>
+            <param name="orderBy">
+            The native sqlite3_index_orderby structure to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexOrderBy.#ctor(System.Int32,System.Byte)">
+            <summary>
+            Constructs an instance of this class using the specified field
+            values.
+            </summary>
+            <param name="iColumn">
+            Column number.
+            </param>
+            <param name="desc">
+            True for DESC.  False for ASC.
+            </param>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexOrderBy.iColumn">
+            <summary>
+            Column number.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexOrderBy.desc">
+            <summary>
+            True for DESC.  False for ASC.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndexConstraintUsage">
+            <summary>
+            This class represents the native sqlite3_index_constraint_usage
+            structure from the SQLite core library.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexConstraintUsage.#ctor(System.Data.SQLite.UnsafeNativeMethods.sqlite3_index_constraint_usage)">
+            <summary>
+            Constructs an instance of this class using the specified native
+            sqlite3_index_constraint_usage structure.
+            </summary>
+            <param name="constraintUsage">
+            The native sqlite3_index_constraint_usage structure to use.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexConstraintUsage.#ctor(System.Int32,System.Byte)">
+            <summary>
+            Constructs an instance of this class using the specified field
+            values.
+            </summary>
+            <param name="argvIndex">
+            If greater than 0, constraint is part of argv to xFilter.
+            </param>
+            <param name="omit">
+            Do not code a test for this constraint.
+            </param>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintUsage.argvIndex">
+            <summary>
+            If greater than 0, constraint is part of argv to xFilter.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteIndexConstraintUsage.omit">
+            <summary>
+            Do not code a test for this constraint.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndexInputs">
+            <summary>
+            This class represents the various inputs provided by the SQLite core
+            library to the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexInputs.#ctor(System.Int32,System.Int32)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="nConstraint">
+            The number of <see cref="T:System.Data.SQLite.SQLiteIndexConstraint"/> instances to
+            pre-allocate space for.
+            </param>
+            <param name="nOrderBy">
+            The number of <see cref="T:System.Data.SQLite.SQLiteIndexOrderBy"/> instances to
+            pre-allocate space for.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexInputs.Constraints">
+            <summary>
+            An array of <see cref="T:System.Data.SQLite.SQLiteIndexConstraint"/> object instances,
+            each containing information supplied by the SQLite core library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexInputs.OrderBys">
+            <summary>
+            An array of <see cref="T:System.Data.SQLite.SQLiteIndexOrderBy"/> object instances,
+            each containing information supplied by the SQLite core library.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndexOutputs">
+            <summary>
+            This class represents the various outputs provided to the SQLite core
+            library by the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexOutputs.#ctor(System.Int32)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="nConstraint">
+            The number of <see cref="T:System.Data.SQLite.SQLiteIndexConstraintUsage"/> instances
+            to pre-allocate space for.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndexOutputs.CanUseEstimatedRows">
+            <summary>
+            Determines if the native estimatedRows field can be used, based on
+            the available version of the SQLite core library.
+            </summary>
+            <returns>
+            Non-zero if the <see cref="P:System.Data.SQLite.SQLiteIndexOutputs.EstimatedRows"/> property is supported
+            by the SQLite core library.
+            </returns>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.ConstraintUsages">
+            <summary>
+            An array of <see cref="T:System.Data.SQLite.SQLiteIndexConstraintUsage"/> object
+            instances, each containing information to be supplied to the SQLite
+            core library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.IndexNumber">
+            <summary>
+            Number used to help identify the selected index.  This value will
+            later be provided to the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/>
+            method.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.IndexString">
+            <summary>
+            String used to help identify the selected index.  This value will
+            later be provided to the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/>
+            method.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.NeedToFreeIndexString">
+            <summary>
+            Non-zero if the index string must be freed by the SQLite core
+            library.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.OrderByConsumed">
+            <summary>
+            True if output is already ordered.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.EstimatedCost">
+            <summary>
+            Estimated cost of using this index.  Using a null value here
+            indicates that a default estimated cost value should be used.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndexOutputs.EstimatedRows">
+            <summary>
+            Estimated number of rows returned.  Using a null value here
+            indicates that a default estimated rows value should be used.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteIndex">
+            <summary>
+            This class represents the various inputs and outputs used with the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndex.#ctor(System.Int32,System.Int32)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="nConstraint">
+            The number of <see cref="T:System.Data.SQLite.SQLiteIndexConstraint"/> (and
+            <see cref="T:System.Data.SQLite.SQLiteIndexConstraintUsage"/>) instances to
+            pre-allocate space for.
+            </param>
+            <param name="nOrderBy">
+            The number of <see cref="T:System.Data.SQLite.SQLiteIndexOrderBy"/> instances to
+            pre-allocate space for.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndex.FromIntPtr(System.IntPtr,System.Data.SQLite.SQLiteIndex@)">
+            <summary>
+            Converts a native pointer to a native sqlite3_index_info structure
+            into a new <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance.
+            </summary>
+            <param name="pIndex">
+            The native pointer to the native sqlite3_index_info structure to
+            convert.
+            </param>
+            <param name="index">
+            Upon success, this parameter will be modified to contain the newly
+            created <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteIndex.ToIntPtr(System.Data.SQLite.SQLiteIndex,System.IntPtr)">
+            <summary>
+            Populates the outputs of a pre-allocated native sqlite3_index_info
+            structure using an existing <see cref="T:System.Data.SQLite.SQLiteIndex"/> object
+            instance.
+            </summary>
+            <param name="index">
+            The existing <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance containing
+            the output data to use.
+            </param>
+            <param name="pIndex">
+            The native pointer to the pre-allocated native sqlite3_index_info
+            structure.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndex.Inputs">
+            <summary>
+            The <see cref="T:System.Data.SQLite.SQLiteIndexInputs"/> object instance containing
+            the inputs to the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/>
+            method.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteIndex.Outputs">
+            <summary>
+            The <see cref="T:System.Data.SQLite.SQLiteIndexOutputs"/> object instance containing
+            the outputs from the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/>
+            method.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteVirtualTable">
+            <summary>
+            This class represents a managed virtual table implementation.  It is
+            not sealed and should be used as the base class for any user-defined
+            virtual table classes implemented in managed code.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTable.ModuleNameIndex">
+            <summary>
+            The index within the array of strings provided to the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> and
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> methods containing the
+            name of the module implementing this virtual table.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTable.DatabaseNameIndex">
+            <summary>
+            The index within the array of strings provided to the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> and
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> methods containing the
+            name of the database containing this virtual table.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTable.TableNameIndex">
+            <summary>
+            The index within the array of strings provided to the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> and
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> methods containing the
+            name of the virtual table.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.#ctor(System.String[])">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="arguments">
+            The original array of strings provided to the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> and
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> methods.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.BestIndex(System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            This method should normally be used by the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method in order to
+            perform index selection based on the constraints provided by the
+            SQLite core library.
+            </summary>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance containing all the
+            data for the inputs and outputs relating to index selection.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.Rename(System.String)">
+            <summary>
+            Attempts to record the renaming of the virtual table associated
+            with this object instance.
+            </summary>
+            <param name="name">
+            The new name for the virtual table.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.Dispose">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.Data.SQLite.SQLiteVirtualTable.Dispose"/> method.  Zero if this method is being called
+            from the finalizer.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTable.Finalize">
+            <summary>
+            Finalizes this object instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTable.Arguments">
+            <summary>
+            The original array of strings provided to the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> and
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> methods.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTable.ModuleName">
+            <summary>
+            The name of the module implementing this virtual table.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTable.DatabaseName">
+            <summary>
+            The name of the database containing this virtual table.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTable.TableName">
+            <summary>
+            The name of the virtual table.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTable.Index">
+            <summary>
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance containing all the
+            data for the inputs and outputs relating to the most recent index
+            selection.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTable.NativeHandle">
+            <summary>
+            Returns the underlying SQLite native handle associated with this
+            object instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteVirtualTableCursor">
+            <summary>
+            This class represents a managed virtual table cursor implementation.
+            It is not sealed and should be used as the base class for any
+            user-defined virtual table cursor classes implemented in managed code.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTableCursor.InvalidRowIndex">
+            <summary>
+            This value represents an invalid integer row sequence number.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTableCursor.rowIndex">
+            <summary>
+            The field holds the integer row sequence number for the current row
+            pointed to by this cursor object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.#ctor(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this object instance.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.#ctor">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.TryPersistValues(System.Data.SQLite.SQLiteValue[])">
+            <summary>
+            Attempts to persist the specified <see cref="T:System.Data.SQLite.SQLiteValue"/> object
+            instances in order to make them available after the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method returns.
+            </summary>
+            <param name="values">
+            The array of <see cref="T:System.Data.SQLite.SQLiteValue"/> object instances to be
+            persisted.
+            </param>
+            <returns>
+            The number of <see cref="T:System.Data.SQLite.SQLiteValue"/> object instances that were
+            successfully persisted.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.Filter(System.Int32,System.String,System.Data.SQLite.SQLiteValue[])">
+            <summary>
+            This method should normally be used by the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method in order to
+            perform filtering of the result rows and/or to record the filtering
+            criteria provided by the SQLite core library.
+            </summary>
+            <param name="indexNumber">
+            Number used to help identify the selected index.
+            </param>
+            <param name="indexString">
+            String used to help identify the selected index.
+            </param>
+            <param name="values">
+            The values corresponding to each column in the selected index.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.GetRowIndex">
+            <summary>
+            Determines the integer row sequence number for the current row.
+            </summary>
+            <returns>
+            The integer row sequence number for the current row -OR- zero if
+            it cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.NextRowIndex">
+            <summary>
+            Adjusts the integer row sequence number so that it refers to the
+            next row.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.Dispose">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.Data.SQLite.SQLiteVirtualTableCursor.Dispose"/> method.  Zero if this method is being called
+            from the finalizer.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursor.Finalize">
+            <summary>
+            Finalizes this object instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursor.Table">
+            <summary>
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this object instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursor.IndexNumber">
+            <summary>
+            Number used to help identify the selected index.  This value will
+            be set via the <see cref="M:System.Data.SQLite.SQLiteVirtualTableCursor.Filter(System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursor.IndexString">
+            <summary>
+            String used to help identify the selected index.  This value will
+            be set via the <see cref="M:System.Data.SQLite.SQLiteVirtualTableCursor.Filter(System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursor.Values">
+            <summary>
+            The values used to filter the rows returned via this cursor object
+            instance.  This value will be set via the <see cref="M:System.Data.SQLite.SQLiteVirtualTableCursor.Filter(System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/>
+            method.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursor.NativeHandle">
+            <summary>
+            Returns the underlying SQLite native handle associated with this
+            object instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.ISQLiteNativeModule">
+            <summary>
+            This interface represents a virtual table implementation written in
+            native code.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            <para>
+            This method is called to create a new instance of a virtual table
+            in response to a CREATE VIRTUAL TABLE statement. The db parameter
+            is a pointer to the SQLite database connection that is executing
+            the CREATE VIRTUAL TABLE statement. The pAux argument is the copy
+            of the client data pointer that was the fourth argument to the
+            sqlite3_create_module() or sqlite3_create_module_v2() call that
+            registered the virtual table module. The argv parameter is an
+            array of argc pointers to null terminated strings. The first
+            string, argv[0], is the name of the module being invoked. The
+            module name is the name provided as the second argument to
+            sqlite3_create_module() and as the argument to the USING clause of
+            the CREATE VIRTUAL TABLE statement that is running. The second,
+            argv[1], is the name of the database in which the new virtual table
+            is being created. The database name is "main" for the primary
+            database, or "temp" for TEMP database, or the name given at the
+            end of the ATTACH statement for attached databases. The third
+            element of the array, argv[2], is the name of the new virtual
+            table, as specified following the TABLE keyword in the CREATE
+            VIRTUAL TABLE statement. If present, the fourth and subsequent
+            strings in the argv[] array report the arguments to the module name
+            in the CREATE VIRTUAL TABLE statement.
+            </para>
+            <para>
+            The job of this method is to construct the new virtual table object
+            (an sqlite3_vtab object) and return a pointer to it in *ppVTab.
+            </para>
+            <para>
+            As part of the task of creating a new sqlite3_vtab structure, this
+            method must invoke sqlite3_declare_vtab() to tell the SQLite core
+            about the columns and datatypes in the virtual table. The
+            sqlite3_declare_vtab() API has the following prototype:
+            </para>
+            <para>
+            <code>
+            int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable)
+            </code>
+            </para>
+            <para>
+            The first argument to sqlite3_declare_vtab() must be the same
+            database connection pointer as the first parameter to this method.
+            The second argument to sqlite3_declare_vtab() must a
+            zero-terminated UTF-8 string that contains a well-formed CREATE
+            TABLE statement that defines the columns in the virtual table and
+            their data types. The name of the table in this CREATE TABLE
+            statement is ignored, as are all constraints. Only the column names
+            and datatypes matter. The CREATE TABLE statement string need not to
+            be held in persistent memory. The string can be deallocated and/or
+            reused as soon as the sqlite3_declare_vtab() routine returns.
+            </para>
+            </summary>
+            <param name="pDb">
+            The native database connection handle.
+            </param>
+            <param name="pAux">
+            The original native pointer value that was provided to the
+            sqlite3_create_module(), sqlite3_create_module_v2() or
+            sqlite3_create_disposable_module() functions.
+            </param>
+            <param name="argc">
+            The number of arguments from the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="argv">
+            The array of string arguments from the CREATE VIRTUAL TABLE
+            statement.
+            </param>
+            <param name="pVtab">
+            Upon success, this parameter must be modified to point to the newly
+            created native sqlite3_vtab derived structure.
+            </param>
+            <param name="pError">
+            Upon failure, this parameter must be modified to point to the error
+            message, with the underlying memory having been obtained from the
+            sqlite3_malloc() function.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            <para>
+            The xConnect method is very similar to xCreate. It has the same
+            parameters and constructs a new sqlite3_vtab structure just like
+            xCreate. And it must also call sqlite3_declare_vtab() like xCreate.
+            </para>
+            <para>
+            The difference is that xConnect is called to establish a new
+            connection to an existing virtual table whereas xCreate is called
+            to create a new virtual table from scratch.
+            </para>
+            <para>
+            The xCreate and xConnect methods are only different when the
+            virtual table has some kind of backing store that must be
+            initialized the first time the virtual table is created. The
+            xCreate method creates and initializes the backing store. The
+            xConnect method just connects to an existing backing store.
+            </para>
+            <para>
+            As an example, consider a virtual table implementation that
+            provides read-only access to existing comma-separated-value (CSV)
+            files on disk. There is no backing store that needs to be created
+            or initialized for such a virtual table (since the CSV files
+            already exist on disk) so the xCreate and xConnect methods will be
+            identical for that module.
+            </para>
+            <para>
+            Another example is a virtual table that implements a full-text
+            index. The xCreate method must create and initialize data
+            structures to hold the dictionary and posting lists for that index.
+            The xConnect method, on the other hand, only has to locate and use
+            an existing dictionary and posting lists that were created by a
+            prior xCreate call.
+            </para>
+            <para>
+            The xConnect method must return SQLITE_OK if it is successful in
+            creating the new virtual table, or SQLITE_ERROR if it is not
+            successful. If not successful, the sqlite3_vtab structure must not
+            be allocated. An error message may optionally be returned in *pzErr
+            if unsuccessful. Space to hold the error message string must be
+            allocated using an SQLite memory allocation function like
+            sqlite3_malloc() or sqlite3_mprintf() as the SQLite core will
+            attempt to free the space using sqlite3_free() after the error has
+            been reported up to the application.
+            </para>
+            <para>
+            The xConnect method is required for every virtual table
+            implementation, though the xCreate and xConnect pointers of the
+            sqlite3_module object may point to the same function the virtual
+            table does not need to initialize backing store.
+            </para>
+            </summary>
+            <param name="pDb">
+            The native database connection handle.
+            </param>
+            <param name="pAux">
+            The original native pointer value that was provided to the
+            sqlite3_create_module(), sqlite3_create_module_v2() or
+            sqlite3_create_disposable_module() functions.
+            </param>
+            <param name="argc">
+            The number of arguments from the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="argv">
+            The array of string arguments from the CREATE VIRTUAL TABLE
+            statement.
+            </param>
+            <param name="pVtab">
+            Upon success, this parameter must be modified to point to the newly
+            created native sqlite3_vtab derived structure.
+            </param>
+            <param name="pError">
+            Upon failure, this parameter must be modified to point to the error
+            message, with the underlying memory having been obtained from the
+            sqlite3_malloc() function.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)">
+            <summary>
+            <para>
+            SQLite uses the xBestIndex method of a virtual table module to
+            determine the best way to access the virtual table. The xBestIndex
+            method has a prototype like this:
+            </para>
+            <code>
+            int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*);
+            </code>
+            <para>
+            The SQLite core communicates with the xBestIndex method by filling
+            in certain fields of the sqlite3_index_info structure and passing a
+            pointer to that structure into xBestIndex as the second parameter.
+            The xBestIndex method fills out other fields of this structure
+            which forms the reply. The sqlite3_index_info structure looks like
+            this:
+            </para>
+            <code>
+             struct sqlite3_index_info {
+               /* Inputs */
+               const int nConstraint;   /* Number of entries in aConstraint */
+               const struct sqlite3_index_constraint {
+                  int iColumn;          /* Column on left-hand side of
+                                         * constraint */
+                  unsigned char op;     /* Constraint operator */
+                  unsigned char usable; /* True if this constraint is usable */
+                  int iTermOffset;      /* Used internally - xBestIndex should
+                                         * ignore */
+               } *const aConstraint;    /* Table of WHERE clause constraints */
+               const int nOrderBy;      /* Number of terms in the ORDER BY
+                                         * clause */
+               const struct sqlite3_index_orderby {
+                  int iColumn;          /* Column number */
+                  unsigned char desc;   /* True for DESC.  False for ASC. */
+               } *const aOrderBy;       /* The ORDER BY clause */
+               /* Outputs */
+               struct sqlite3_index_constraint_usage {
+                 int argvIndex;         /* if greater than zero, constraint is
+                                         * part of argv to xFilter */
+                 unsigned char omit;    /* Do not code a test for this
+                                         * constraint */
+               } *const aConstraintUsage;
+               int idxNum;              /* Number used to identify the index */
+               char *idxStr;            /* String, possibly obtained from
+                                         * sqlite3_malloc() */
+               int needToFreeIdxStr;    /* Free idxStr using sqlite3_free() if
+                                         * true */
+               int orderByConsumed;     /* True if output is already ordered */
+               double estimatedCost;    /* Estimated cost of using this index */
+             };
+            </code>
+            <para>
+            In addition, there are some defined constants:
+            </para>
+            <code>
+             #define SQLITE_INDEX_CONSTRAINT_EQ    2
+             #define SQLITE_INDEX_CONSTRAINT_GT    4
+             #define SQLITE_INDEX_CONSTRAINT_LE    8
+             #define SQLITE_INDEX_CONSTRAINT_LT    16
+             #define SQLITE_INDEX_CONSTRAINT_GE    32
+             #define SQLITE_INDEX_CONSTRAINT_MATCH 64
+            </code>
+            <para>
+            The SQLite core calls the xBestIndex method when it is compiling a
+            query that involves a virtual table. In other words, SQLite calls
+            this method when it is running sqlite3_prepare() or the equivalent.
+            By calling this method, the SQLite core is saying to the virtual
+            table that it needs to access some subset of the rows in the
+            virtual table and it wants to know the most efficient way to do
+            that access. The xBestIndex method replies with information that
+            the SQLite core can then use to conduct an efficient search of the
+            virtual table.
+            </para>
+            <para>
+            While compiling a single SQL query, the SQLite core might call
+            xBestIndex multiple times with different settings in
+            sqlite3_index_info. The SQLite core will then select the
+            combination that appears to give the best performance.
+            </para>
+            <para>
+            Before calling this method, the SQLite core initializes an instance
+            of the sqlite3_index_info structure with information about the
+            query that it is currently trying to process. This information
+            derives mainly from the WHERE clause and ORDER BY or GROUP BY
+            clauses of the query, but also from any ON or USING clauses if the
+            query is a join. The information that the SQLite core provides to
+            the xBestIndex method is held in the part of the structure that is
+            marked as "Inputs". The "Outputs" section is initialized to zero.
+            </para>
+            <para>
+            The information in the sqlite3_index_info structure is ephemeral
+            and may be overwritten or deallocated as soon as the xBestIndex
+            method returns. If the xBestIndex method needs to remember any part
+            of the sqlite3_index_info structure, it should make a copy. Care
+            must be take to store the copy in a place where it will be
+            deallocated, such as in the idxStr field with needToFreeIdxStr set
+            to 1.
+            </para>
+            <para>
+            Note that xBestIndex will always be called before xFilter, since
+            the idxNum and idxStr outputs from xBestIndex are required inputs
+            to xFilter. However, there is no guarantee that xFilter will be
+            called following a successful xBestIndex.
+            </para>
+            <para>
+            The xBestIndex method is required for every virtual table
+            implementation.
+            </para>
+            <para>
+            2.3.1 Inputs
+            </para>
+            <para>
+            The main thing that the SQLite core is trying to communicate to the
+            virtual table is the constraints that are available to limit the
+            number of rows that need to be searched. The aConstraint[] array
+            contains one entry for each constraint. There will be exactly
+            nConstraint entries in that array.
+            </para>
+            <para>
+            Each constraint will correspond to a term in the WHERE clause or in
+            a USING or ON clause that is of the form
+            </para>
+            <code>
+                column OP EXPR
+            </code>
+            <para>
+            Where "column" is a column in the virtual table, OP is an operator
+            like "=" or "&lt;", and EXPR is an arbitrary expression. So, for
+            example, if the WHERE clause contained a term like this:
+            </para>
+            <code>
+                     a = 5
+            </code>
+            <para>
+            Then one of the constraints would be on the "a" column with
+            operator "=" and an expression of "5". Constraints need not have a
+            literal representation of the WHERE clause. The query optimizer
+            might make transformations to the WHERE clause in order to extract
+            as many constraints as it can. So, for example, if the WHERE clause
+            contained something like this:
+            </para>
+            <code>
+                     x BETWEEN 10 AND 100 AND 999&gt;y
+            </code>
+            <para>
+            The query optimizer might translate this into three separate
+            constraints:
+            </para>
+            <code>
+                     x &gt;= 10
+                     x &lt;= 100
+                     y &lt; 999
+            </code>
+            <para>
+            For each constraint, the aConstraint[].iColumn field indicates
+            which column appears on the left-hand side of the constraint. The
+            first column of the virtual table is column 0. The rowid of the
+            virtual table is column -1. The aConstraint[].op field indicates
+            which operator is used. The SQLITE_INDEX_CONSTRAINT_* constants map
+            integer constants into operator values. Columns occur in the order
+            they were defined by the call to sqlite3_declare_vtab() in the
+            xCreate or xConnect method. Hidden columns are counted when
+            determining the column index.
+            </para>
+            <para>
+            The aConstraint[] array contains information about all constraints
+            that apply to the virtual table. But some of the constraints might
+            not be usable because of the way tables are ordered in a join. The
+            xBestIndex method must therefore only consider constraints that
+            have an aConstraint[].usable flag which is true.
+            </para>
+            <para>
+            In addition to WHERE clause constraints, the SQLite core also tells
+            the xBestIndex method about the ORDER BY clause. (In an aggregate
+            query, the SQLite core might put in GROUP BY clause information in
+            place of the ORDER BY clause information, but this fact should not
+            make any difference to the xBestIndex method.) If all terms of the
+            ORDER BY clause are columns in the virtual table, then nOrderBy
+            will be the number of terms in the ORDER BY clause and the
+            aOrderBy[] array will identify the column for each term in the
+            order by clause and whether or not that column is ASC or DESC.
+            </para>
+            <para>
+            2.3.2 Outputs
+            </para>
+            <para>
+            Given all of the information above, the job of the xBestIndex
+            method it to figure out the best way to search the virtual table.
+            </para>
+            <para>
+            The xBestIndex method fills the idxNum and idxStr fields with
+            information that communicates an indexing strategy to the xFilter
+            method. The information in idxNum and idxStr is arbitrary as far as
+            the SQLite core is concerned. The SQLite core just copies the
+            information through to the xFilter method. Any desired meaning can
+            be assigned to idxNum and idxStr as long as xBestIndex and xFilter
+            agree on what that meaning is.
+            </para>
+            <para>
+            The idxStr value may be a string obtained from an SQLite memory
+            allocation function such as sqlite3_mprintf(). If this is the case,
+            then the needToFreeIdxStr flag must be set to true so that the
+            SQLite core will know to call sqlite3_free() on that string when it
+            has finished with it, and thus avoid a memory leak.
+            </para>
+            <para>
+            If the virtual table will output rows in the order specified by the
+            ORDER BY clause, then the orderByConsumed flag may be set to true.
+            If the output is not automatically in the correct order then
+            orderByConsumed must be left in its default false setting. This
+            will indicate to the SQLite core that it will need to do a separate
+            sorting pass over the data after it comes out of the virtual table.
+            </para>
+            <para>
+            The estimatedCost field should be set to the estimated number of
+            disk access operations required to execute this query against the
+            virtual table. The SQLite core will often call xBestIndex multiple
+            times with different constraints, obtain multiple cost estimates,
+            then choose the query plan that gives the lowest estimate.
+            </para>
+            <para>
+            The aConstraintUsage[] array contains one element for each of the
+            nConstraint constraints in the inputs section of the
+            sqlite3_index_info structure. The aConstraintUsage[] array is used
+            by xBestIndex to tell the core how it is using the constraints.
+            </para>
+            <para>
+            The xBestIndex method may set aConstraintUsage[].argvIndex entries
+            to values greater than one. Exactly one entry should be set to 1,
+            another to 2, another to 3, and so forth up to as many or as few as
+            the xBestIndex method wants. The EXPR of the corresponding
+            constraints will then be passed in as the argv[] parameters to
+            xFilter.
+            </para>
+            <para>
+            For example, if the aConstraint[3].argvIndex is set to 1, then when
+            xFilter is called, the argv[0] passed to xFilter will have the EXPR
+            value of the aConstraint[3] constraint.
+            </para>
+            <para>
+            By default, the SQLite core double checks all constraints on each
+            row of the virtual table that it receives. If such a check is
+            redundant, the xBestFilter method can suppress that double-check by
+            setting aConstraintUsage[].omit.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="pIndex">
+            The native pointer to the sqlite3_index_info structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)">
+            <summary>
+            <para>
+            This method releases a connection to a virtual table. Only the
+            sqlite3_vtab object is destroyed. The virtual table is not
+            destroyed and any backing store associated with the virtual table
+            persists. This method undoes the work of xConnect.
+            </para>
+            <para>
+            This method is a destructor for a connection to the virtual table.
+            Contrast this method with xDestroy. The xDestroy is a destructor
+            for the entire virtual table.
+            </para>
+            <para>
+            The xDisconnect method is required for every virtual table
+            implementation, though it is acceptable for the xDisconnect and
+            xDestroy methods to be the same function if that makes sense for
+            the particular virtual table.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)">
+            <summary>
+            <para>
+            This method releases a connection to a virtual table, just like the
+            xDisconnect method, and it also destroys the underlying table
+            implementation. This method undoes the work of xCreate.
+            </para>
+            <para>
+            The xDisconnect method is called whenever a database connection
+            that uses a virtual table is closed. The xDestroy method is only
+            called when a DROP TABLE statement is executed against the virtual
+            table.
+            </para>
+            <para>
+            The xDestroy method is required for every virtual table
+            implementation, though it is acceptable for the xDisconnect and
+            xDestroy methods to be the same function if that makes sense for
+            the particular virtual table.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)">
+            <summary>
+            <para>
+            The xOpen method creates a new cursor used for accessing (read
+            and/or writing) a virtual table. A successful invocation of this
+            method will allocate the memory for the sqlite3_vtab_cursor (or a
+            subclass), initialize the new object, and make *ppCursor point to
+            the new object. The successful call then returns SQLITE_OK.
+            </para>
+            <para>
+            For every successful call to this method, the SQLite core will
+            later invoke the xClose method to destroy the allocated cursor.
+            </para>
+            <para>
+            The xOpen method need not initialize the pVtab field of the
+            sqlite3_vtab_cursor structure. The SQLite core will take care of
+            that chore automatically.
+            </para>
+            <para>
+            A virtual table implementation must be able to support an arbitrary
+            number of simultaneously open cursors.
+            </para>
+            <para>
+            When initially opened, the cursor is in an undefined state. The
+            SQLite core will invoke the xFilter method on the cursor prior to
+            any attempt to position or read from the cursor.
+            </para>
+            <para>
+            The xOpen method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="pCursor">
+            Upon success, this parameter must be modified to point to the newly
+            created native sqlite3_vtab_cursor derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)">
+            <summary>
+            <para>
+            The xClose method closes a cursor previously opened by xOpen. The
+            SQLite core will always call xClose once for each cursor opened
+            using xOpen.
+            </para>
+            <para>
+            This method must release all resources allocated by the
+            corresponding xOpen call. The routine will not be called again even
+            if it returns an error. The SQLite core will not use the
+            sqlite3_vtab_cursor again after it has been closed.
+            </para>
+            <para>
+            The xClose method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            <para>
+            This method begins a search of a virtual table. The first argument
+            is a cursor opened by xOpen. The next two argument define a
+            particular search index previously chosen by xBestIndex. The
+            specific meanings of idxNum and idxStr are unimportant as long as
+            xFilter and xBestIndex agree on what that meaning is.
+            </para>
+            <para>
+            The xBestIndex function may have requested the values of certain
+            expressions using the aConstraintUsage[].argvIndex values of the
+            sqlite3_index_info structure. Those values are passed to xFilter
+            using the argc and argv parameters.
+            </para>
+            <para>
+            If the virtual table contains one or more rows that match the
+            search criteria, then the cursor must be left point at the first
+            row. Subsequent calls to xEof must return false (zero). If there
+            are no rows match, then the cursor must be left in a state that
+            will cause the xEof to return true (non-zero). The SQLite engine
+            will use the xColumn and xRowid methods to access that row content.
+            The xNext method will be used to advance to the next row.
+            </para>
+            <para>
+            This method must return SQLITE_OK if successful, or an sqlite error
+            code if an error occurs.
+            </para>
+            <para>
+            The xFilter method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <param name="idxNum">
+            Number used to help identify the selected index.
+            </param>
+            <param name="idxStr">
+            The native pointer to the UTF-8 encoded string containing the
+            string used to help identify the selected index.
+            </param>
+            <param name="argc">
+            The number of native pointers to sqlite3_value structures specified
+            in <paramref name="argv" />.
+            </param>
+            <param name="argv">
+            An array of native pointers to sqlite3_value structures containing
+            filtering criteria for the selected index.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)">
+            <summary>
+            <para>
+            The xNext method advances a virtual table cursor to the next row of
+            a result set initiated by xFilter. If the cursor is already
+            pointing at the last row when this routine is called, then the
+            cursor no longer points to valid data and a subsequent call to the
+            xEof method must return true (non-zero). If the cursor is
+            successfully advanced to another row of content, then subsequent
+            calls to xEof must return false (zero).
+            </para>
+            <para>
+            This method must return SQLITE_OK if successful, or an sqlite error
+            code if an error occurs.
+            </para>
+            <para>
+            The xNext method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)">
+            <summary>
+            <para>
+            The xEof method must return false (zero) if the specified cursor
+            currently points to a valid row of data, or true (non-zero)
+            otherwise. This method is called by the SQL engine immediately
+            after each xFilter and xNext invocation.
+            </para>
+            <para>
+            The xEof method is required for every virtual table implementation.
+            </para>
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <returns>
+            Non-zero if no more rows are available; zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)">
+            <summary>
+            <para>
+            The SQLite core invokes this method in order to find the value for
+            the N-th column of the current row. N is zero-based so the first
+            column is numbered 0. The xColumn method may return its result back
+            to SQLite using one of the following interface:
+            </para>
+            <code>
+                sqlite3_result_blob()
+                sqlite3_result_double()
+                sqlite3_result_int()
+                sqlite3_result_int64()
+                sqlite3_result_null()
+                sqlite3_result_text()
+                sqlite3_result_text16()
+                sqlite3_result_text16le()
+                sqlite3_result_text16be()
+                sqlite3_result_zeroblob()
+            </code>
+            <para>
+            If the xColumn method implementation calls none of the functions
+            above, then the value of the column defaults to an SQL NULL.
+            </para>
+            <para>
+            To raise an error, the xColumn method should use one of the
+            result_text() methods to set the error message text, then return an
+            appropriate error code. The xColumn method must return SQLITE_OK on
+            success.
+            </para>
+            <para>
+            The xColumn method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <param name="pContext">
+            The native pointer to the sqlite3_context structure to be used
+            for returning the specified column value to the SQLite core
+            library.
+            </param>
+            <param name="index">
+            The zero-based index corresponding to the column containing the
+            value to be returned.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)">
+            <summary>
+            <para>
+            A successful invocation of this method will cause *pRowid to be
+            filled with the rowid of row that the virtual table cursor pCur is
+            currently pointing at. This method returns SQLITE_OK on success. It
+            returns an appropriate error code on failure.
+            </para>
+            <para>
+            The xRowid method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <param name="rowId">
+            Upon success, this parameter must be modified to contain the unique
+            integer row identifier for the current row for the specified cursor.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)">
+            <summary>
+            <para>
+            All changes to a virtual table are made using the xUpdate method.
+            This one method can be used to insert, delete, or update.
+            </para>
+            <para>
+            The argc parameter specifies the number of entries in the argv
+            array. The value of argc will be 1 for a pure delete operation or
+            N+2 for an insert or replace or update where N is the number of
+            columns in the table. In the previous sentence, N includes any
+            hidden columns.
+            </para>
+            <para>
+            Every argv entry will have a non-NULL value in C but may contain
+            the SQL value NULL. In other words, it is always true that
+            argv[i]!=0 for i between 0 and argc-1. However, it might be the
+            case that sqlite3_value_type(argv[i])==SQLITE_NULL.
+            </para>
+            <para>
+            The argv[0] parameter is the rowid of a row in the virtual table
+            to be deleted. If argv[0] is an SQL NULL, then no deletion occurs.
+            </para>
+            <para>
+            The argv[1] parameter is the rowid of a new row to be inserted into
+            the virtual table. If argv[1] is an SQL NULL, then the
+            implementation must choose a rowid for the newly inserted row.
+            Subsequent argv[] entries contain values of the columns of the
+            virtual table, in the order that the columns were declared. The
+            number of columns will match the table declaration that the
+            xConnect or xCreate method made using the sqlite3_declare_vtab()
+            call. All hidden columns are included.
+            </para>
+            <para>
+            When doing an insert without a rowid (argc>1, argv[1] is an SQL
+            NULL), the implementation must set *pRowid to the rowid of the
+            newly inserted row; this will become the value returned by the
+            sqlite3_last_insert_rowid() function. Setting this value in all the
+            other cases is a harmless no-op; the SQLite engine ignores the
+            *pRowid return value if argc==1 or argv[1] is not an SQL NULL.
+            </para>
+            <para>
+            Each call to xUpdate will fall into one of cases shown below. Note
+            that references to argv[i] mean the SQL value held within the
+            argv[i] object, not the argv[i] object itself.
+            </para>
+            <code>
+                argc = 1
+            </code>
+            <para>
+                    The single row with rowid equal to argv[0] is deleted. No
+                    insert occurs.
+            </para>
+            <code>
+                argc > 1
+                argv[0] = NULL
+            </code>
+            <para>
+                    A new row is inserted with a rowid argv[1] and column
+                    values in argv[2] and following. If argv[1] is an SQL NULL,
+                    the a new unique rowid is generated automatically.
+            </para>
+            <code>
+                argc > 1
+                argv[0] ? NULL
+                argv[0] = argv[1]
+            </code>
+            <para>
+                    The row with rowid argv[0] is updated with new values in
+                    argv[2] and following parameters.
+            </para>
+            <code>
+                argc > 1
+                argv[0] ? NULL
+                argv[0] ? argv[1]
+            </code>
+            <para>
+                    The row with rowid argv[0] is updated with rowid argv[1]
+                    and new values in argv[2] and following parameters. This
+                    will occur when an SQL statement updates a rowid, as in
+                    the statement:
+            </para>
+            <code>
+                        UPDATE table SET rowid=rowid+1 WHERE ...;
+            </code>
+            <para>
+            The xUpdate method must return SQLITE_OK if and only if it is
+            successful. If a failure occurs, the xUpdate must return an
+            appropriate error code. On a failure, the pVTab->zErrMsg element
+            may optionally be replaced with error message text stored in memory
+            allocated from SQLite using functions such as sqlite3_mprintf() or
+            sqlite3_malloc().
+            </para>
+            <para>
+            If the xUpdate method violates some constraint of the virtual table
+            (including, but not limited to, attempting to store a value of the
+            wrong datatype, attempting to store a value that is too large or
+            too small, or attempting to change a read-only value) then the
+            xUpdate must fail with an appropriate error code.
+            </para>
+            <para>
+            There might be one or more sqlite3_vtab_cursor objects open and in
+            use on the virtual table instance and perhaps even on the row of
+            the virtual table when the xUpdate method is invoked. The
+            implementation of xUpdate must be prepared for attempts to delete
+            or modify rows of the table out from other existing cursors. If the
+            virtual table cannot accommodate such changes, the xUpdate method
+            must return an error code.
+            </para>
+            <para>
+            The xUpdate method is optional. If the xUpdate pointer in the
+            sqlite3_module for a virtual table is a NULL pointer, then the
+            virtual table is read-only.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="argc">
+            The number of new or modified column values contained in
+            <paramref name="argv" />.
+            </param>
+            <param name="argv">
+            The array of native pointers to sqlite3_value structures containing
+            the new or modified column values, if any.
+            </param>
+            <param name="rowId">
+            Upon success, this parameter must be modified to contain the unique
+            integer row identifier for the row that was inserted, if any.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)">
+            <summary>
+            <para>
+            This method begins a transaction on a virtual table. This is method
+            is optional. The xBegin pointer of sqlite3_module may be NULL.
+            </para>
+            <para>
+            This method is always followed by one call to either the xCommit or
+            xRollback method. Virtual table transactions do not nest, so the
+            xBegin method will not be invoked more than once on a single
+            virtual table without an intervening call to either xCommit or
+            xRollback. Multiple calls to other methods can and likely will
+            occur in between the xBegin and the corresponding xCommit or
+            xRollback.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)">
+            <summary>
+            <para>
+            This method signals the start of a two-phase commit on a virtual
+            table. This is method is optional. The xSync pointer of
+            sqlite3_module may be NULL.
+            </para>
+            <para>
+            This method is only invoked after call to the xBegin method and
+            prior to an xCommit or xRollback. In order to implement two-phase
+            commit, the xSync method on all virtual tables is invoked prior to
+            invoking the xCommit method on any virtual table. If any of the
+            xSync methods fail, the entire transaction is rolled back.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)">
+            <summary>
+            <para>
+            This method causes a virtual table transaction to commit. This is
+            method is optional. The xCommit pointer of sqlite3_module may be
+            NULL.
+            </para>
+            <para>
+            A call to this method always follows a prior call to xBegin and
+            xSync.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)">
+            <summary>
+            <para>
+            This method causes a virtual table transaction to rollback. This is
+            method is optional. The xRollback pointer of sqlite3_module may be
+            NULL.
+            </para>
+            <para>
+            A call to this method always follows a prior call to xBegin.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)">
+            <summary>
+            <para>
+            This method provides notification that the virtual table
+            implementation that the virtual table will be given a new name. If
+            this method returns SQLITE_OK then SQLite renames the table. If
+            this method returns an error code then the renaming is prevented.
+            </para>
+            <para>
+            The xRename method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="nArg">
+            The number of arguments to the function being sought.
+            </param>
+            <param name="zName">
+            The name of the function being sought.
+            </param>
+            <param name="callback">
+            Upon success, this parameter must be modified to contain the
+            delegate responsible for implementing the specified function.
+            </param>
+            <param name="pClientData">
+            Upon success, this parameter must be modified to contain the
+            native user-data pointer associated with
+            <paramref name="callback" />.
+            </param>
+            <returns>
+            Non-zero if the specified function was found; zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)">
+            <summary>
+            <para>
+            This method provides notification that the virtual table
+            implementation that the virtual table will be given a new name. If
+            this method returns SQLITE_OK then SQLite renames the table. If
+            this method returns an error code then the renaming is prevented.
+            </para>
+            <para>
+            The xRename method is required for every virtual table
+            implementation.
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="zNew">
+            The native pointer to the UTF-8 encoded string containing the new
+            name for the virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)">
+            <summary>
+            <para>
+            These methods provide the virtual table implementation an
+            opportunity to implement nested transactions. They are always
+            optional and will only be called in SQLite version 3.7.7 and later.
+            </para>
+            <para>
+            When xSavepoint(X,N) is invoked, that is a signal to the virtual
+            table X that it should save its current state as savepoint N. A
+            subsequent call to xRollbackTo(X,R) means that the state of the
+            virtual table should return to what it was when xSavepoint(X,R) was
+            last called. The call to xRollbackTo(X,R) will invalidate all
+            savepoints with N>R; none of the invalided savepoints will be
+            rolled back or released without first being reinitialized by a call
+            to xSavepoint(). A call to xRelease(X,M) invalidates all savepoints
+            where N>=M.
+            </para>
+            <para>
+            None of the xSavepoint(), xRelease(), or xRollbackTo() methods will
+            ever be called except in between calls to xBegin() and either
+            xCommit() or xRollback().
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="iSavepoint">
+            This is an integer identifier under which the the current state of
+            the virtual table should be saved.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)">
+            <summary>
+            <para>
+            These methods provide the virtual table implementation an
+            opportunity to implement nested transactions. They are always
+            optional and will only be called in SQLite version 3.7.7 and later.
+            </para>
+            <para>
+            When xSavepoint(X,N) is invoked, that is a signal to the virtual
+            table X that it should save its current state as savepoint N. A
+            subsequent call to xRollbackTo(X,R) means that the state of the
+            virtual table should return to what it was when xSavepoint(X,R) was
+            last called. The call to xRollbackTo(X,R) will invalidate all
+            savepoints with N>R; none of the invalided savepoints will be
+            rolled back or released without first being reinitialized by a call
+            to xSavepoint(). A call to xRelease(X,M) invalidates all savepoints
+            where N>=M.
+            </para>
+            <para>
+            None of the xSavepoint(), xRelease(), or xRollbackTo() methods will
+            ever be called except in between calls to xBegin() and either
+            xCommit() or xRollback().
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="iSavepoint">
+            This is an integer used to indicate that any saved states with an
+            identifier greater than or equal to this should be deleted by the
+            virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)">
+            <summary>
+            <para>
+            These methods provide the virtual table implementation an
+            opportunity to implement nested transactions. They are always
+            optional and will only be called in SQLite version 3.7.7 and later.
+            </para>
+            <para>
+            When xSavepoint(X,N) is invoked, that is a signal to the virtual
+            table X that it should save its current state as savepoint N. A
+            subsequent call to xRollbackTo(X,R) means that the state of the
+            virtual table should return to what it was when xSavepoint(X,R) was
+            last called. The call to xRollbackTo(X,R) will invalidate all
+            savepoints with N>R; none of the invalided savepoints will be
+            rolled back or released without first being reinitialized by a call
+            to xSavepoint(). A call to xRelease(X,M) invalidates all savepoints
+            where N>=M.
+            </para>
+            <para>
+            None of the xSavepoint(), xRelease(), or xRollbackTo() methods will
+            ever be called except in between calls to xBegin() and either
+            xCommit() or xRollback().
+            </para>
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="iSavepoint">
+            This is an integer identifier used to specify a specific saved
+            state for the virtual table for it to restore itself back to, which
+            should also have the effect of deleting all saved states with an
+            integer identifier greater than this one.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="T:System.Data.SQLite.ISQLiteManagedModule">
+            <summary>
+            This interface represents a virtual table implementation written in
+            managed code.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="connection">
+            The <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="pClientData">
+            The native user-data pointer associated with this module, as it was
+            provided to the SQLite core library when the native module instance
+            was created.
+            </param>
+            <param name="arguments">
+            The module name, database name, virtual table name, and all other
+            arguments passed to the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="table">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="error">
+            Upon failure, this parameter must be modified to contain an error
+            message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="connection">
+            The <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="pClientData">
+            The native user-data pointer associated with this module, as it was
+            provided to the SQLite core library when the native module instance
+            was created.
+            </param>
+            <param name="arguments">
+            The module name, database name, virtual table name, and all other
+            arguments passed to the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="table">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="error">
+            Upon failure, this parameter must be modified to contain an error
+            message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance containing all the
+            data for the inputs and outputs relating to index selection.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="cursor">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance associated
+            with the newly opened virtual table cursor.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="indexNumber">
+            Number used to help identify the selected index.
+            </param>
+            <param name="indexString">
+            String used to help identify the selected index.
+            </param>
+            <param name="values">
+            The values corresponding to each column in the selected index.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <returns>
+            Non-zero if no more rows are available; zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="context">
+            The <see cref="T:System.Data.SQLite.SQLiteContext"/> object instance to be used for
+            returning the specified column value to the SQLite core library.
+            </param>
+            <param name="index">
+            The zero-based index corresponding to the column containing the
+            value to be returned.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="rowId">
+            Upon success, this parameter must be modified to contain the unique
+            integer row identifier for the current row for the specified cursor.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="values">
+            The array of <see cref="T:System.Data.SQLite.SQLiteValue"/> object instances containing
+            the new or modified column values, if any.
+            </param>
+            <param name="rowId">
+            Upon success, this parameter must be modified to contain the unique
+            integer row identifier for the row that was inserted, if any.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Begin(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Sync(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Commit(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Rollback(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="argumentCount">
+            The number of arguments to the function being sought.
+            </param>
+            <param name="name">
+            The name of the function being sought.
+            </param>
+            <param name="function">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance responsible for
+            implementing the specified function.
+            </param>
+            <param name="pClientData">
+            Upon success, this parameter must be modified to contain the
+            native user-data pointer associated with
+            <paramref name="function"/>.
+            </param>
+            <returns>
+            Non-zero if the specified function was found; zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="newName">
+            The new name for the virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="savepoint">
+            This is an integer identifier under which the the current state of
+            the virtual table should be saved.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="savepoint">
+            This is an integer used to indicate that any saved states with an
+            identifier greater than or equal to this should be deleted by the
+            virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.ISQLiteManagedModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="savepoint">
+            This is an integer identifier used to specify a specific saved
+            state for the virtual table for it to restore itself back to, which
+            should also have the effect of deleting all saved states with an
+            integer identifier greater than this one.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="P:System.Data.SQLite.ISQLiteManagedModule.Declared">
+            <summary>
+            Returns non-zero if the schema for the virtual table has been
+            declared.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.ISQLiteManagedModule.Name">
+            <summary>
+            Returns the name of the module as it was registered with the SQLite
+            core library.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteMemory">
+            <summary>
+            This class contains static methods that are used to allocate,
+            manipulate, and free native memory provided by the SQLite core library.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMemory.Allocate(System.Int32)">
+            <summary>
+            Allocates at least the specified number of bytes of native memory
+            via the SQLite core library sqlite3_malloc() function and returns
+            the resulting native pointer.
+            </summary>
+            <param name="size">
+            The number of bytes to allocate.
+            </param>
+            <returns>
+            The native pointer that points to a block of memory of at least the
+            specified size -OR- <see cref="F:System.IntPtr.Zero"/> if the memory could
+            not be allocated.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMemory.Size(System.IntPtr)">
+            <summary>
+            Gets and returns the actual size of the specified memory block that
+            was previously obtained from the <see cref="M:System.Data.SQLite.SQLiteMemory.Allocate(System.Int32)"/> method.
+            </summary>
+            <param name="pMemory">
+            The native pointer to the memory block previously obtained from the
+            <see cref="M:System.Data.SQLite.SQLiteMemory.Allocate(System.Int32)"/> method.
+            </param>
+            <returns>
+            The actual size, in bytes, of the memory block specified via the
+            native pointer.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMemory.Free(System.IntPtr)">
+            <summary>
+            Frees a memory block previously obtained from the
+            <see cref="M:System.Data.SQLite.SQLiteMemory.Allocate(System.Int32)"/> method.
+            </summary>
+            <param name="pMemory">
+            The native pointer to the memory block previously obtained from the
+            <see cref="M:System.Data.SQLite.SQLiteMemory.Allocate(System.Int32)"/> method.
+            </param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteString">
+            <summary>
+            This class contains static methods that are used to deal with native
+            UTF-8 string pointers to be used with the SQLite core library.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteString.ThirtyBits">
+            <summary>
+            This is the maximum possible length for the native UTF-8 encoded
+            strings used with the SQLite core library.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteString.Utf8Encoding">
+            <summary>
+            This is the <see cref="T:System.Text.Encoding"/> object instance used to handle
+            conversions from/to UTF-8.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.GetUtf8BytesFromString(System.String)">
+            <summary>
+            Converts the specified managed string into the UTF-8 encoding and
+            returns the array of bytes containing its representation in that
+            encoding.
+            </summary>
+            <param name="value">
+            The managed string to convert.
+            </param>
+            <returns>
+            The array of bytes containing the representation of the managed
+            string in the UTF-8 encoding or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.GetStringFromUtf8Bytes(System.Byte[])">
+            <summary>
+            Converts the specified array of bytes representing a string in the
+            UTF-8 encoding and returns a managed string.
+            </summary>
+            <param name="bytes">
+            The array of bytes to convert.
+            </param>
+            <returns>
+            The managed string or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.ProbeForUtf8ByteLength(System.IntPtr,System.Int32)">
+            <summary>
+            Probes a native pointer to a string in the UTF-8 encoding for its
+            terminating NUL character, within the specified length limit.
+            </summary>
+            <param name="pValue">
+            The native NUL-terminated string pointer.
+            </param>
+            <param name="limit">
+            The maximum length of the native string, in bytes.
+            </param>
+            <returns>
+            The length of the native string, in bytes -OR- zero if the length
+            could not be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.StringFromUtf8IntPtr(System.IntPtr)">
+            <summary>
+            Converts the specified native NUL-terminated UTF-8 string pointer
+            into a managed string.
+            </summary>
+            <param name="pValue">
+            The native NUL-terminated UTF-8 string pointer.
+            </param>
+            <returns>
+            The managed string or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.StringFromUtf8IntPtr(System.IntPtr,System.Int32)">
+            <summary>
+            Converts the specified native UTF-8 string pointer of the specified
+            length into a managed string.
+            </summary>
+            <param name="pValue">
+            The native UTF-8 string pointer.
+            </param>
+            <param name="length">
+            The length of the native string, in bytes.
+            </param>
+            <returns>
+            The managed string or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.Utf8IntPtrFromString(System.String)">
+            <summary>
+            Converts the specified managed string into a native NUL-terminated
+            UTF-8 string pointer using memory obtained from the SQLite core
+            library.
+            </summary>
+            <param name="value">
+            The managed string to convert.
+            </param>
+            <returns>
+            The native NUL-terminated UTF-8 string pointer or
+            <see cref="F:System.IntPtr.Zero"/> upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.StringArrayFromUtf8SizeAndIntPtr(System.Int32,System.IntPtr)">
+            <summary>
+            Converts a logical array of native NUL-terminated UTF-8 string
+            pointers into an array of managed strings.
+            </summary>
+            <param name="argc">
+            The number of elements in the logical array of native
+            NUL-terminated UTF-8 string pointers.
+            </param>
+            <param name="argv">
+            The native pointer to the logical array of native NUL-terminated
+            UTF-8 string pointers to convert.
+            </param>
+            <returns>
+            The array of managed strings or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteString.Utf8IntPtrArrayFromStringArray(System.String[])">
+            <summary>
+            Converts an array of managed strings into an array of native
+            NUL-terminated UTF-8 string pointers.
+            </summary>
+            <param name="values">
+            The array of managed strings to convert.
+            </param>
+            <returns>
+            The array of native NUL-terminated UTF-8 string pointers or null
+            upon failure.
+            </returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteBytes">
+            <summary>
+            This class contains static methods that are used to deal with native
+            pointers to memory blocks that logically contain arrays of bytes to be
+            used with the SQLite core library.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBytes.FromIntPtr(System.IntPtr,System.Int32)">
+            <summary>
+            Converts a native pointer to a logical array of bytes of the
+            specified length into a managed byte array.
+            </summary>
+            <param name="pValue">
+            The native pointer to the logical array of bytes to convert.
+            </param>
+            <param name="length">
+            The length, in bytes, of the logical array of bytes to convert.
+            </param>
+            <returns>
+            The managed byte array or null upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteBytes.ToIntPtr(System.Byte[])">
+            <summary>
+            Converts a managed byte array into a native pointer to a logical
+            array of bytes.
+            </summary>
+            <param name="value">
+            The managed byte array to convert.
+            </param>
+            <returns>
+            The native pointer to a logical byte array or null upon failure.
+            </returns>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteMarshal">
+            <summary>
+            This class contains static methods that are used to perform several
+            low-level data marshalling tasks between native and managed code.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.IntPtrForOffset(System.IntPtr,System.Int32)">
+            <summary>
+            Returns a new <see cref="T:System.IntPtr"/> object instance based on the
+            specified <see cref="T:System.IntPtr"/> object instance and an integer
+            offset.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location that the new
+            <see cref="T:System.IntPtr"/> object instance should point to.
+            </param>
+            <returns>
+            The new <see cref="T:System.IntPtr"/> object instance.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.RoundUp(System.Int32,System.Int32)">
+            <summary>
+            Rounds up an integer size to the next multiple of the alignment.
+            </summary>
+            <param name="size">
+            The size, in bytes, to be rounded up.
+            </param>
+            <param name="alignment">
+            The required alignment for the return value.
+            </param>
+            <returns>
+            The size, in bytes, rounded up to the next multiple of the
+            alignment.  This value may end up being the same as the original
+            size.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.NextOffsetOf(System.Int32,System.Int32,System.Int32)">
+            <summary>
+            Determines the offset, in bytes, of the next structure member.
+            </summary>
+            <param name="offset">
+            The offset, in bytes, of the current structure member.
+            </param>
+            <param name="size">
+            The size, in bytes, of the current structure member.
+            </param>
+            <param name="alignment">
+            The alignment, in bytes, of the next structure member.
+            </param>
+            <returns>
+            The offset, in bytes, of the next structure member.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.ReadInt32(System.IntPtr,System.Int32)">
+            <summary>
+            Reads a <see cref="T:System.Int32"/> value from the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.Int32"/> value to be read is located.
+            </param>
+            <returns>
+            The <see cref="T:System.Int32"/> value at the specified memory location.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.ReadDouble(System.IntPtr,System.Int32)">
+            <summary>
+            Reads a <see cref="T:System.Double"/> value from the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.Double"/> to be read is located.
+            </param>
+            <returns>
+            The <see cref="T:System.Double"/> value at the specified memory location.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.ReadIntPtr(System.IntPtr,System.Int32)">
+            <summary>
+            Reads an <see cref="T:System.IntPtr"/> value from the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.IntPtr"/> value to be read is located.
+            </param>
+            <returns>
+            The <see cref="T:System.IntPtr"/> value at the specified memory location.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.WriteInt32(System.IntPtr,System.Int32,System.Int32)">
+            <summary>
+            Writes an <see cref="T:System.Int32"/> value to the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.Int32"/> value to be written is located.
+            </param>
+            <param name="value">
+            The <see cref="T:System.Int32"/> value to write.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.WriteInt64(System.IntPtr,System.Int32,System.Int64)">
+            <summary>
+            Writes an <see cref="T:System.Int64"/> value to the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.Int64"/> value to be written is located.
+            </param>
+            <param name="value">
+            The <see cref="T:System.Int64"/> value to write.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.WriteDouble(System.IntPtr,System.Int32,System.Double)">
+            <summary>
+            Writes a <see cref="T:System.Double"/> value to the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.Double"/> value to be written is located.
+            </param>
+            <param name="value">
+            The <see cref="T:System.Double"/> value to write.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteMarshal.WriteIntPtr(System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            Writes a <see cref="T:System.IntPtr"/> value to the specified memory
+            location.
+            </summary>
+            <param name="pointer">
+            The <see cref="T:System.IntPtr"/> object instance representing the base
+            memory location.
+            </param>
+            <param name="offset">
+            The integer offset from the base memory location where the
+            <see cref="T:System.IntPtr"/> value to be written is located.
+            </param>
+            <param name="value">
+            The <see cref="T:System.IntPtr"/> value to write.
+            </param>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteModule">
+            <summary>
+            This class represents a managed virtual table module implementation.
+            It is not sealed and must be used as the base class for any
+            user-defined virtual table module classes implemented in managed code.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.DefaultModuleVersion">
+            <summary>
+            The default version of the native sqlite3_module structure in use.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.nativeModule">
+            <summary>
+            This field is used to store the native sqlite3_module structure
+            associated with this object instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.destroyModule">
+            <summary>
+            This field is used to store the destructor delegate to be passed to
+            the SQLite core library via the sqlite3_create_disposable_module()
+            function.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.disposableModule">
+            <summary>
+            This field is used to store a pointer to the native sqlite3_module
+            structure returned by the sqlite3_create_disposable_module
+            function.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.tables">
+            <summary>
+            This field is used to store the virtual table instances associated
+            with this module.  The native pointer to the sqlite3_vtab derived
+            structure is used to key into this collection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.cursors">
+            <summary>
+            This field is used to store the virtual table cursor instances
+            associated with this module.  The native pointer to the
+            sqlite3_vtab_cursor derived structure is used to key into this
+            collection.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.functions">
+            <summary>
+            This field is used to store the virtual table function instances
+            associated with this module.  The case-insensitive function name
+            and the number of arguments (with -1 meaning "any") are used to
+            construct the string that is used to key into this collection.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.#ctor(System.String)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="name">
+            The name of the module.  This parameter cannot be null.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CreateDisposableModule(System.IntPtr)">
+            <summary>
+            Calls the native SQLite core library in order to create a new
+            disposable module containing the implementation of a virtual table.
+            </summary>
+            <param name="pDb">
+            The native database connection pointer to use.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xDestroyModule(System.IntPtr)">
+            <summary>
+            This method is called by the SQLite core library when the native
+            module associated with this object instance is being destroyed due
+            to its parent connection being closed.  It may also be called by
+            the "vtshim" module if/when the sqlite3_dispose_module() function
+            is called.
+            </summary>
+            <param name="pClientData">
+            The native user-data pointer associated with this module, as it was
+            provided to the SQLite core library when the native module instance
+            was created.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.AllocateNativeModule">
+            <summary>
+            Creates and returns the native sqlite_module structure using the
+            configured (or default) <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/>
+            interface implementation.
+            </summary>
+            <returns>
+            The native sqlite_module structure using the configured (or
+            default) <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface
+            implementation.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.AllocateNativeModule(System.Data.SQLite.ISQLiteNativeModule)">
+            <summary>
+            Creates and returns the native sqlite_module structure using the
+            specified <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface
+            implementation.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface implementation to
+            use.
+            </param>
+            <returns>
+            The native sqlite_module structure using the specified
+            <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface implementation.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CopyNativeModule(System.Data.SQLite.UnsafeNativeMethods.sqlite3_module)">
+            <summary>
+            Creates a copy of the specified
+            <see cref="T:System.Data.SQLite.UnsafeNativeMethods.sqlite3_module"/> object instance,
+            using default implementations for the contained delegates when
+            necessary.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.UnsafeNativeMethods.sqlite3_module"/> object
+            instance to copy.
+            </param>
+            <returns>
+            The new <see cref="T:System.Data.SQLite.UnsafeNativeMethods.sqlite3_module"/> object
+            instance.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CreateOrConnect(System.Boolean,System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            Calls one of the virtual table initialization methods.
+            </summary>
+            <param name="create">
+            Non-zero to call the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/>
+            method; otherwise, the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/>
+            method will be called.
+            </param>
+            <param name="pDb">
+            The native database connection handle.
+            </param>
+            <param name="pAux">
+            The original native pointer value that was provided to the
+            sqlite3_create_module(), sqlite3_create_module_v2() or
+            sqlite3_create_disposable_module() functions.
+            </param>
+            <param name="argc">
+            The number of arguments from the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="argv">
+            The array of string arguments from the CREATE VIRTUAL TABLE
+            statement.
+            </param>
+            <param name="pVtab">
+            Upon success, this parameter must be modified to point to the newly
+            created native sqlite3_vtab derived structure.
+            </param>
+            <param name="pError">
+            Upon failure, this parameter must be modified to point to the error
+            message, with the underlying memory having been obtained from the
+            sqlite3_malloc() function.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.DestroyOrDisconnect(System.Boolean,System.IntPtr)">
+            <summary>
+            Calls one of the virtual table finalization methods.
+            </summary>
+            <param name="destroy">
+            Non-zero to call the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/>
+            method; otherwise, the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method will be
+            called.
+            </param>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetTableError(System.Data.SQLite.SQLiteModule,System.IntPtr,System.Boolean,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance to be used.
+            </param>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="logErrors">
+            Non-zero if this error message should also be logged using the
+            <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetTableError(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteVirtualTable,System.Boolean,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance to be used.
+            </param>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance used to
+            lookup the native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="logErrors">
+            Non-zero if this error message should also be logged using the
+            <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetCursorError(System.Data.SQLite.SQLiteModule,System.IntPtr,System.Boolean,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance to be used.
+            </param>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure
+            used to get the native pointer to the sqlite3_vtab derived
+            structure.
+            </param>
+            <param name="logErrors">
+            Non-zero if this error message should also be logged using the
+            <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetCursorError(System.Data.SQLite.SQLiteModule,System.Data.SQLite.SQLiteVirtualTableCursor,System.Boolean,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance to be used.
+            </param>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance used to
+            lookup the native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="logErrors">
+            Non-zero if this error message should also be logged using the
+            <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.GetNativeModuleImpl">
+            <summary>
+            Gets and returns the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface
+            implementation to be used when creating the native sqlite3_module
+            structure.  Derived classes may override this method to supply an
+            alternate implementation for the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/>
+            interface.
+            </summary>
+            <returns>
+            The <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface implementation to
+            be used when populating the native sqlite3_module structure.  If
+            the returned value is null, the private methods provided by the
+            <see cref="T:System.Data.SQLite.SQLiteModule"/> class and relating to the
+            <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface  will be used to
+            create the necessary delegates.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CreateNativeModuleImpl">
+            <summary>
+            Creates and returns the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/>
+            interface implementation corresponding to the current
+            <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance.
+            </summary>
+            <returns>
+            The <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> interface implementation
+            corresponding to the current <see cref="T:System.Data.SQLite.SQLiteModule"/> object
+            instance.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.AllocateTable">
+            <summary>
+            Allocates a native sqlite3_vtab derived structure and returns a
+            native pointer to it.
+            </summary>
+            <returns>
+            A native pointer to a native sqlite3_vtab derived structure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.ZeroTable(System.IntPtr)">
+            <summary>
+            Zeros out the fields of a native sqlite3_vtab derived structure.
+            </summary>
+            <param name="pVtab">
+            The native pointer to the native sqlite3_vtab derived structure to
+            zero.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.FreeTable(System.IntPtr)">
+            <summary>
+            Frees a native sqlite3_vtab structure using the provided native
+            pointer to it.
+            </summary>
+            <param name="pVtab">
+            A native pointer to a native sqlite3_vtab derived structure.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.AllocateCursor">
+            <summary>
+            Allocates a native sqlite3_vtab_cursor derived structure and
+            returns a native pointer to it.
+            </summary>
+            <returns>
+            A native pointer to a native sqlite3_vtab_cursor derived structure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.FreeCursor(System.IntPtr)">
+            <summary>
+            Frees a native sqlite3_vtab_cursor structure using the provided
+            native pointer to it.
+            </summary>
+            <param name="pCursor">
+            A native pointer to a native sqlite3_vtab_cursor derived structure.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.TableFromCursor(System.Data.SQLite.SQLiteModule,System.IntPtr)">
+            <summary>
+            Reads and returns the native pointer to the sqlite3_vtab derived
+            structure based on the native pointer to the sqlite3_vtab_cursor
+            derived structure.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance to be used.
+            </param>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure
+            from which to read the native pointer to the sqlite3_vtab derived
+            structure.
+            </param>
+            <returns>
+            The native pointer to the sqlite3_vtab derived structure -OR-
+            <see cref="F:System.IntPtr.Zero"/> if it cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.TableFromCursor(System.IntPtr)">
+            <summary>
+            Reads and returns the native pointer to the sqlite3_vtab derived
+            structure based on the native pointer to the sqlite3_vtab_cursor
+            derived structure.
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure
+            from which to read the native pointer to the sqlite3_vtab derived
+            structure.
+            </param>
+            <returns>
+            The native pointer to the sqlite3_vtab derived structure -OR-
+            <see cref="F:System.IntPtr.Zero"/> if it cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.TableFromIntPtr(System.IntPtr)">
+            <summary>
+            Looks up and returns the <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object
+            instance based on the native pointer to the sqlite3_vtab derived
+            structure.
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance or null if
+            the corresponding one cannot be found.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.TableToIntPtr(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            Allocates and returns a native pointer to a sqlite3_vtab derived
+            structure and creates an association between it and the specified
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance to be used
+            when creating the association.
+            </param>
+            <returns>
+            The native pointer to a sqlite3_vtab derived structure or
+            <see cref="F:System.IntPtr.Zero"/> if the method fails for any reason.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CursorFromIntPtr(System.IntPtr,System.IntPtr)">
+            <summary>
+            Looks up and returns the <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/>
+            object instance based on the native pointer to the
+            sqlite3_vtab_cursor derived structure.
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived structure.
+            </param>
+            <returns>
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance or null
+            if the corresponding one cannot be found.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CursorToIntPtr(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            Allocates and returns a native pointer to a sqlite3_vtab_cursor
+            derived structure and creates an association between it and the
+            specified <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance to be
+            used when creating the association.
+            </param>
+            <returns>
+            The native pointer to a sqlite3_vtab_cursor derived structure or
+            <see cref="F:System.IntPtr.Zero"/> if the method fails for any reason.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.GetFunctionKey(System.Int32,System.String,System.Data.SQLite.SQLiteFunction)">
+            <summary>
+            Deterimines the key that should be used to identify and store the
+            <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance for the virtual table
+            (i.e. to be returned via the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method).
+            </summary>
+            <param name="argumentCount">
+            The number of arguments to the virtual table function.
+            </param>
+            <param name="name">
+            The name of the virtual table function.
+            </param>
+            <param name="function">
+            The <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance associated with
+            this virtual table function.
+            </param>
+            <returns>
+            The string that should be used to identify and store the virtual
+            table function instance.  This method cannot return null.  If null
+            is returned from this method, the behavior is undefined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.DeclareTable(System.Data.SQLite.SQLiteConnection,System.String,System.String@)">
+            <summary>
+            Attempts to declare the schema for the virtual table using the
+            specified database connection.
+            </summary>
+            <param name="connection">
+            The <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance to use when
+            declaring the schema of the virtual table.  This parameter may not
+            be null.
+            </param>
+            <param name="sql">
+            The string containing the CREATE TABLE statement that completely
+            describes the schema for the virtual table.  This parameter may not
+            be null.
+            </param>
+            <param name="error">
+            Upon failure, this parameter must be modified to contain an error
+            message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.DeclareFunction(System.Data.SQLite.SQLiteConnection,System.Int32,System.String,System.String@)">
+            <summary>
+            Calls the native SQLite core library in order to declare a virtual
+            table function in response to a call into the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/>
+            or <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> virtual table
+            methods.
+            </summary>
+            <param name="connection">
+            The <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance to use when
+            declaring the schema of the virtual table.
+            </param>
+            <param name="argumentCount">
+            The number of arguments to the function being declared.
+            </param>
+            <param name="name">
+            The name of the function being declared.
+            </param>
+            <param name="error">
+            Upon success, the contents of this parameter are undefined.  Upon
+            failure, it should contain an appropriate error message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetTableError(System.IntPtr,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetTableError(System.Data.SQLite.SQLiteVirtualTable,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance used to
+            lookup the native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetCursorError(System.Data.SQLite.SQLiteVirtualTableCursor,System.String)">
+            <summary>
+            Arranges for the specified error message to be placed into the
+            zErrMsg field of a sqlite3_vtab derived structure, freeing the
+            existing error message, if any.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance used to
+            lookup the native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <param name="error">
+            The error message.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetEstimatedCost(System.Data.SQLite.SQLiteIndex,System.Nullable{System.Double})">
+            <summary>
+            Modifies the specified <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance
+            to contain the specified estimated cost.
+            </summary>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance to modify.
+            </param>
+            <param name="estimatedCost">
+            The estimated cost value to use.  Using a null value means that the
+            default value provided by the SQLite core library should be used.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetEstimatedCost(System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            Modifies the specified <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance
+            to contain the default estimated cost.
+            </summary>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance to modify.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetEstimatedRows(System.Data.SQLite.SQLiteIndex,System.Nullable{System.Int64})">
+            <summary>
+            Modifies the specified <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance
+            to contain the specified estimated rows.
+            </summary>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance to modify.
+            </param>
+            <param name="estimatedRows">
+            The estimated rows value to use.  Using a null value means that the
+            default value provided by the SQLite core library should be used.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SetEstimatedRows(System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            Modifies the specified <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance
+            to contain the default estimated rows.
+            </summary>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance to modify.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pDb">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pAux">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pError">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pDb">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pAux">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pError">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xBestIndex(System.IntPtr,System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <param name="pIndex">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xDisconnect(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xDestroy(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xOpen(System.IntPtr,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </param>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xClose(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="idxNum">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="idxStr">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xNext(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xEof(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="pContext">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xRowId(System.IntPtr,System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xBegin(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xSync(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xCommit(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xRollback(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="nArg">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="zName">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="callback">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xRename(System.IntPtr,System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <param name="zNew">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xSavepoint(System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="iSavepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xRelease(System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="iSavepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.xRollbackTo(System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="iSavepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="connection">
+            The <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="pClientData">
+            The native user-data pointer associated with this module, as it was
+            provided to the SQLite core library when the native module instance
+            was created.
+            </param>
+            <param name="arguments">
+            The module name, database name, virtual table name, and all other
+            arguments passed to the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="table">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="error">
+            Upon failure, this parameter must be modified to contain an error
+            message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="connection">
+            The <see cref="T:System.Data.SQLite.SQLiteConnection"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="pClientData">
+            The native user-data pointer associated with this module, as it was
+            provided to the SQLite core library when the native module instance
+            was created.
+            </param>
+            <param name="arguments">
+            The module name, database name, virtual table name, and all other
+            arguments passed to the CREATE VIRTUAL TABLE statement.
+            </param>
+            <param name="table">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated with
+            the virtual table.
+            </param>
+            <param name="error">
+            Upon failure, this parameter must be modified to contain an error
+            message.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="index">
+            The <see cref="T:System.Data.SQLite.SQLiteIndex"/> object instance containing all the
+            data for the inputs and outputs relating to index selection.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="cursor">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance associated
+            with the newly opened virtual table cursor.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="indexNumber">
+            Number used to help identify the selected index.
+            </param>
+            <param name="indexString">
+            String used to help identify the selected index.
+            </param>
+            <param name="values">
+            The values corresponding to each column in the selected index.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <returns>
+            Non-zero if no more rows are available; zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="context">
+            The <see cref="T:System.Data.SQLite.SQLiteContext"/> object instance to be used for
+            returning the specified column value to the SQLite core library.
+            </param>
+            <param name="index">
+            The zero-based index corresponding to the column containing the
+            value to be returned.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="rowId">
+            Upon success, this parameter must be modified to contain the unique
+            integer row identifier for the current row for the specified cursor.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="values">
+            The array of <see cref="T:System.Data.SQLite.SQLiteValue"/> object instances containing
+            the new or modified column values, if any.
+            </param>
+            <param name="rowId">
+            Upon success, this parameter must be modified to contain the unique
+            integer row identifier for the row that was inserted, if any.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Begin(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Sync(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Commit(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Rollback(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="argumentCount">
+            The number of arguments to the function being sought.
+            </param>
+            <param name="name">
+            The name of the function being sought.
+            </param>
+            <param name="function">
+            Upon success, this parameter must be modified to contain the
+            <see cref="T:System.Data.SQLite.SQLiteFunction"/> object instance responsible for
+            implementing the specified function.
+            </param>
+            <param name="pClientData">
+            Upon success, this parameter must be modified to contain the
+            native user-data pointer associated with
+            <paramref name="function"/>.
+            </param>
+            <returns>
+            Non-zero if the specified function was found; zero otherwise.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="newName">
+            The new name for the virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="savepoint">
+            This is an integer identifier under which the the current state of
+            the virtual table should be saved.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="savepoint">
+            This is an integer used to indicate that any saved states with an
+            identifier greater than or equal to this should be deleted by the
+            virtual table.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            This method is called in response to the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this virtual table.
+            </param>
+            <param name="savepoint">
+            This is an integer identifier used to specify a specific saved
+            state for the virtual table for it to restore itself back to, which
+            should also have the effect of deleting all saved states with an
+            integer identifier greater than this one.
+            </param>
+            <returns>
+            A standard SQLite return code.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Dispose">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.Data.SQLite.SQLiteModule.Dispose"/> method.  Zero if this method is being
+            called from the finalizer.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.Finalize">
+            <summary>
+            Finalizes this object instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteModule.LogErrorsNoThrow">
+            <summary>
+            Returns or sets a boolean value indicating whether virtual table
+            errors should be logged using the <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteModule.LogExceptionsNoThrow">
+            <summary>
+            Returns or sets a boolean value indicating whether exceptions
+            caught in the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method,
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method, and the
+            <see cref="M:System.Data.SQLite.SQLiteModule.Dispose"/> method should be logged using the
+            <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteModule.LogErrors">
+            <summary>
+            Returns or sets a boolean value indicating whether virtual table
+            errors should be logged using the <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteModule.LogExceptions">
+            <summary>
+            Returns or sets a boolean value indicating whether exceptions
+            caught in the
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method,
+            <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method, and the
+            <see cref="M:System.Data.SQLite.SQLiteModule.Dispose"/> method should be logged using the
+            <see cref="T:System.Data.SQLite.SQLiteLog"/> class.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteModule.Declared">
+            <summary>
+            Returns non-zero if the schema for the virtual table has been
+            declared.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteModule.Name">
+            <summary>
+            Returns the name of the module as it was registered with the SQLite
+            core library.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteModule.SQLiteNativeModule">
+            <summary>
+            This class implements the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/>
+            interface by forwarding those method calls to the
+            <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance it contains.  If the
+            contained <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance is null, all
+            the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/> methods simply generate an
+            error.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.DefaultLogErrors">
+            <summary>
+            This is the value that is always used for the "logErrors"
+            parameter to the various static error handling methods provided
+            by the <see cref="T:System.Data.SQLite.SQLiteModule"/> class.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.ModuleNotAvailableErrorMessage">
+            <summary>
+            This is the error message text used when the contained
+            <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance is not available
+            for any reason.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.module">
+            <summary>
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance used to provide
+            an implementation of the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/>
+            interface.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.#ctor(System.Data.SQLite.SQLiteModule)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="module">
+            The <see cref="T:System.Data.SQLite.SQLiteModule"/> object instance used to provide
+            an implementation of the <see cref="T:System.Data.SQLite.ISQLiteNativeModule"/>
+            interface.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.ModuleNotAvailableTableError(System.IntPtr)">
+            <summary>
+            Sets the table error message to one that indicates the native
+            module implementation is not available.
+            </summary>
+            <param name="pVtab">
+            The native pointer to the sqlite3_vtab derived structure.
+            </param>
+            <returns>
+            The value of <see cref="F:System.Data.SQLite.SQLiteErrorCode.Error"/>.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.ModuleNotAvailableCursorError(System.IntPtr)">
+            <summary>
+            Sets the table error message to one that indicates the native
+            module implementation is not available.
+            </summary>
+            <param name="pCursor">
+            The native pointer to the sqlite3_vtab_cursor derived
+            structure.
+            </param>
+            <returns>
+            The value of <see cref="F:System.Data.SQLite.SQLiteErrorCode.Error"/>.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pDb">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pAux">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pError">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCreate(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pDb">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pAux">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pError">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xConnect(System.IntPtr,System.IntPtr,System.Int32,System.IntPtr,System.IntPtr@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <param name="pIndex">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBestIndex(System.IntPtr,System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xDisconnect(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDisconnect(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xDestroy(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xDestroy(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </param>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xOpen(System.IntPtr,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xClose(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xClose(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="idxNum">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="idxStr">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFilter(System.IntPtr,System.Int32,System.IntPtr,System.Int32,System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xNext(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xNext(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xEof(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xEof(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="pContext">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xColumn(System.IntPtr,System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="pCursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRowId(System.IntPtr,System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="argc">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="argv">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xUpdate(System.IntPtr,System.Int32,System.IntPtr,System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xBegin(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xBegin(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xSync(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSync(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xCommit(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xCommit(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xRollback(System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollback(System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="nArg">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="zName">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="callback">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xFindFunction(System.IntPtr,System.Int32,System.IntPtr,System.Data.SQLite.SQLiteCallback@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <param name="zNew">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRename(System.IntPtr,System.IntPtr)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="iSavepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xSavepoint(System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xRelease(System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="iSavepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRelease(System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </summary>
+            <param name="pVtab">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <param name="iSavepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteNativeModule.xRollbackTo(System.IntPtr,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.Dispose">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.Dispose"/> method.  Zero if this method is being
+            called from the finalizer.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModule.SQLiteNativeModule.Finalize">
+            <summary>
+            Finalizes this object instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator">
+            <summary>
+            This class represents a virtual table cursor to be used with the
+            <see cref="T:System.Data.SQLite.SQLiteModuleEnumerable"/> class.  It is not sealed and may
+            be used as the base class for any user-defined virtual table cursor
+            class that wraps an <see cref="T:System.Collections.IEnumerator"/> object instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.enumerator">
+            <summary>
+            The <see cref="T:System.Collections.IEnumerator"/> instance provided when this cursor
+            was created.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.endOfEnumerator">
+            <summary>
+            This value will be non-zero if false has been returned from the
+            <see cref="M:System.Collections.IEnumerator.MoveNext"/> method.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.#ctor(System.Data.SQLite.SQLiteVirtualTable,System.Collections.IEnumerator)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this object instance.
+            </param>
+            <param name="enumerator">
+            The <see cref="T:System.Collections.IEnumerator"/> instance to expose as a virtual
+            table cursor.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.MoveNext">
+            <summary>
+            Advances to the next row of the virtual table cursor using the
+            <see cref="M:System.Collections.IEnumerator.MoveNext"/> method of the
+            <see cref="T:System.Collections.IEnumerator"/> object instance.
+            </summary>
+            <returns>
+            Non-zero if the current row is valid; zero otherwise.  If zero is
+            returned, no further rows are available.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.Reset">
+            <summary>
+            Resets the virtual table cursor position, also invalidating the
+            current row, using the <see cref="M:System.Collections.IEnumerator.Reset"/> method of
+            the <see cref="T:System.Collections.IEnumerator"/> object instance.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.Close">
+            <summary>
+            Closes the virtual table cursor.  This method must not throw any
+            exceptions.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.CheckClosed">
+            <summary>
+            Throws an <see cref="T:System.InvalidOperationException"/> if the virtual
+            table cursor has been closed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.IDisposable.Dispose"/> method.  Zero if this method is
+            being called from the finalizer.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.Current">
+            <summary>
+            Returns the value for the current row of the virtual table cursor
+            using the <see cref="P:System.Collections.IEnumerator.Current"/> property of the
+            <see cref="T:System.Collections.IEnumerator"/> object instance.
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.EndOfEnumerator">
+            <summary>
+            Returns non-zero if the end of the virtual table cursor has been
+            seen (i.e. no more rows are available, including the current one).
+            </summary>
+        </member>
+        <member name="P:System.Data.SQLite.SQLiteVirtualTableCursorEnumerator.IsOpen">
+            <summary>
+            Returns non-zero if the virtual table cursor is open.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteModuleEnumerable">
+             <summary>
+             This class implements a virtual table module that exposes an
+             <see cref="T:System.Collections.IEnumerable"/> object instance as a read-only virtual
+             table.  It is not sealed and may be used as the base class for any
+             user-defined virtual table class that wraps an
+             <see cref="T:System.Collections.IEnumerable"/> object instance.  The following short
+             example shows it being used to treat an array of strings as a table
+             data source:
+             <code>
+               public static class Sample
+               {
+                 public static void Main()
+                 {
+                   using (SQLiteConnection connection = new SQLiteConnection(
+                       "Data Source=:memory:;"))
+                   {
+                     connection.Open();
+            
+                     connection.CreateModule(new SQLiteModuleEnumerable(
+                       "sampleModule", new string[] { "one", "two", "three" }));
+            
+                     using (SQLiteCommand command = connection.CreateCommand())
+                     {
+                       command.CommandText =
+                           "CREATE VIRTUAL TABLE t1 USING sampleModule;";
+            
+                       command.ExecuteNonQuery();
+                     }
+            
+                     using (SQLiteCommand command = connection.CreateCommand())
+                     {
+                       command.CommandText = "SELECT * FROM t1;";
+            
+                       using (SQLiteDataReader dataReader = command.ExecuteReader())
+                       {
+                         while (dataReader.Read())
+                           Console.WriteLine(dataReader[0].ToString());
+                       }
+                     }
+            
+                     connection.Close();
+                   }
+                 }
+               }
+             </code>
+             </summary>
+        </member>
+        <member name="T:System.Data.SQLite.SQLiteModuleNoop">
+            <summary>
+            This class implements a virtual table module that does nothing by
+            providing "empty" implementations for all of the
+            <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface methods.  The result
+            codes returned by these "empty" method implementations may be
+            controlled on a per-method basis by using and/or overriding the
+            <see cref="M:System.Data.SQLite.SQLiteModuleNoop.GetDefaultResultCode"/>,
+            <see cref="M:System.Data.SQLite.SQLiteModuleNoop.ResultCodeToEofResult(System.Data.SQLite.SQLiteErrorCode)"/>,
+            <see cref="M:System.Data.SQLite.SQLiteModuleNoop.ResultCodeToFindFunctionResult(System.Data.SQLite.SQLiteErrorCode)"/>,
+            <see cref="M:System.Data.SQLite.SQLiteModuleNoop.GetMethodResultCode(System.String)"/>, and
+            <see cref="M:System.Data.SQLite.SQLiteModuleNoop.SetMethodResultCode(System.String,System.Data.SQLite.SQLiteErrorCode)"/> methods from within derived classes.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModuleNoop.resultCodes">
+            <summary>
+            This field is used to store the <see cref="T:System.Data.SQLite.SQLiteErrorCode"/>
+            values to return, on a per-method basis, for all methods that are
+            part of the <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.#ctor(System.String)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="name">
+            The name of the module.  This parameter cannot be null.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.GetDefaultResultCode">
+            <summary>
+            Determines the default <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value to be
+            returned by methods of the <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/>
+            interface that lack an overridden implementation in all classes
+            derived from the <see cref="T:System.Data.SQLite.SQLiteModuleNoop"/> class.
+            </summary>
+            <returns>
+            The <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value that should be returned
+            by all <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface methods unless
+            a more specific result code has been set for that interface method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.ResultCodeToEofResult(System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Converts a <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value into a boolean
+            return value for use with the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="resultCode">
+            The <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value to convert.
+            </param>
+            <returns>
+            The <see cref="T:System.Boolean"/> value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.ResultCodeToFindFunctionResult(System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Converts a <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value into a boolean
+            return value for use with the
+            <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="resultCode">
+            The <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value to convert.
+            </param>
+            <returns>
+            The <see cref="T:System.Boolean"/> value.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.GetMethodResultCode(System.String)">
+            <summary>
+            Determines the <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value that should be
+            returned by the specified <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/>
+            interface method if it lack an overridden implementation.  If no
+            specific <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value is available (or set)
+            for the specified method, the <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value
+            returned by the <see cref="M:System.Data.SQLite.SQLiteModuleNoop.GetDefaultResultCode"/> method will be
+            returned instead.
+            </summary>
+            <param name="methodName">
+            The name of the method.  Currently, this method must be part of
+            the <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface.
+            </param>
+            <returns>
+            The <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value that should be returned
+            by the <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.SetMethodResultCode(System.String,System.Data.SQLite.SQLiteErrorCode)">
+            <summary>
+            Sets the <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value that should be
+            returned by the specified <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/>
+            interface method if it lack an overridden implementation.
+            </summary>
+            <param name="methodName">
+            The name of the method.  Currently, this method must be part of
+            the <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface.
+            </param>
+            <param name="resultCode">
+            The <see cref="T:System.Data.SQLite.SQLiteErrorCode"/> value that should be returned
+            by the <see cref="T:System.Data.SQLite.ISQLiteManagedModule"/> interface method.
+            </param>
+            <returns>
+            Non-zero upon success.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </summary>
+            <param name="connection">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="arguments">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="error">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </summary>
+            <param name="connection">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="arguments">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="error">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Disconnect(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Destroy(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </param>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Close(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <param name="indexNumber">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <param name="indexString">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <param name="values">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Next(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <param name="context">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </param>
+            <param name="values">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Begin(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Begin(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Begin(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Begin(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Sync(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Sync(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Sync(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Sync(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Commit(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Commit(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Commit(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Commit(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Rollback(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rollback(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rollback(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rollback(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </param>
+            <param name="argumentCount">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </param>
+            <param name="name">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </param>
+            <param name="function">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.FindFunction(System.Data.SQLite.SQLiteVirtualTable,System.Int32,System.String,System.Data.SQLite.SQLiteFunction@,System.IntPtr@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </param>
+            <param name="newName">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </param>
+            <param name="savepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Savepoint(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </param>
+            <param name="savepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Release(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </param>
+            <param name="savepoint">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RollbackTo(System.Data.SQLite.SQLiteVirtualTable,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleNoop.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.IDisposable.Dispose"/> method.  Zero if this method is
+            being called from the finalizer.
+            </param>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModuleEnumerable.declareSql">
+            <summary>
+            The CREATE TABLE statement used to declare the schema for the
+            virtual table.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.SQLiteModuleEnumerable.enumerable">
+            <summary>
+            The <see cref="T:System.Collections.IEnumerable"/> instance containing the backing data
+            for the virtual table.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.#ctor(System.String,System.Collections.IEnumerable)">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="name">
+            The name of the module.  This parameter cannot be null.
+            </param>
+            <param name="enumerable">
+            The <see cref="T:System.Collections.IEnumerable"/> instance to expose as a virtual
+            table.  This parameter cannot be null.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.GetSqlForDeclareTable">
+            <summary>
+            Determines the SQL statement used to declare the virtual table.
+            This method should be overridden in derived classes if they require
+            a custom virtual table schema.
+            </summary>
+            <returns>
+            The SQL statement used to declare the virtual table -OR- null if it
+            cannot be determined.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.CursorTypeMismatchError(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            Sets the table error message to one that indicates the virtual
+            table cursor is of the wrong type.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance.
+            </param>
+            <returns>
+            The value of <see cref="F:System.Data.SQLite.SQLiteErrorCode.Error"/>.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.CursorEndOfEnumeratorError(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            Sets the table error message to one that indicates the virtual
+            table cursor has no current row.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance.
+            </param>
+            <returns>
+            The value of <see cref="F:System.Data.SQLite.SQLiteErrorCode.Error"/>.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.GetStringFromObject(System.Data.SQLite.SQLiteVirtualTableCursor,System.Object)">
+            <summary>
+            Determines the string to return as the column value for the object
+            instance value.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="value">
+            The object instance to return a string representation for.
+            </param>
+            <returns>
+            The string representation of the specified object instance or null
+            upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.MakeRowId(System.Int32,System.Int32)">
+            <summary>
+            Constructs an <see cref="T:System.Int64"/> unique row identifier from two
+            <see cref="T:System.Int32"/> values.  The first <see cref="T:System.Int32"/> value
+            must contain the row sequence number for the current row and the
+            second value must contain the hash code of the enumerator value
+            for the current row.
+            </summary>
+            <param name="rowIndex">
+            The integer row sequence number for the current row.
+            </param>
+            <param name="hashCode">
+            The hash code of the enumerator value for the current row.
+            </param>
+            <returns>
+            The unique row identifier or zero upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.GetRowIdFromObject(System.Data.SQLite.SQLiteVirtualTableCursor,System.Object)">
+            <summary>
+            Determines the unique row identifier for the current row.
+            </summary>
+            <param name="cursor">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTableCursor"/> object instance
+            associated with the previously opened virtual table cursor to be
+            used.
+            </param>
+            <param name="value">
+            The object instance to return a unique row identifier for.
+            </param>
+            <returns>
+            The unique row identifier or zero upon failure.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </summary>
+            <param name="connection">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="arguments">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="error">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Create(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </summary>
+            <param name="connection">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="pClientData">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="arguments">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <param name="error">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Connect(System.Data.SQLite.SQLiteConnection,System.IntPtr,System.String[],System.Data.SQLite.SQLiteVirtualTable@,System.String@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.BestIndex(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteIndex)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Disconnect(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Disconnect(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Destroy(System.Data.SQLite.SQLiteVirtualTable)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Destroy(System.Data.SQLite.SQLiteVirtualTable)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </param>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Close(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Close(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <param name="indexNumber">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <param name="indexString">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <param name="values">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Filter(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int32,System.String,System.Data.SQLite.SQLiteValue[])"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Next(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Next(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Eof(System.Data.SQLite.SQLiteVirtualTableCursor)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <param name="context">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.RowId(System.Data.SQLite.SQLiteVirtualTableCursor,System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </param>
+            <param name="values">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </param>
+            <param name="rowId">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Update(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteValue[],System.Int64@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </param>
+            <param name="newName">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Rename(System.Data.SQLite.SQLiteVirtualTable,System.String)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.SQLiteModuleEnumerable.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.IDisposable.Dispose"/> method.  Zero if this method is
+            being called from the finalizer.
+            </param>
+        </member>
+        <member name="T:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1">
+            <summary>
+            This class represents a virtual table cursor to be used with the
+            <see cref="T:System.Data.SQLite.SQLiteModuleEnumerable"/> class.  It is not sealed and may
+            be used as the base class for any user-defined virtual table cursor
+            class that wraps an <see cref="T:System.Collections.Generic.IEnumerator`1"/> object instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.enumerator">
+            <summary>
+            The <see cref="T:System.Collections.Generic.IEnumerator`1"/> instance provided when this
+            cursor was created.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.#ctor(System.Data.SQLite.SQLiteVirtualTable,System.Collections.Generic.IEnumerator{`0})">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="table">
+            The <see cref="T:System.Data.SQLite.SQLiteVirtualTable"/> object instance associated
+            with this object instance.
+            </param>
+            <param name="enumerator">
+            The <see cref="T:System.Collections.Generic.IEnumerator`1"/> instance to expose as a virtual
+            table cursor.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.Close">
+            <summary>
+            Closes the virtual table cursor.  This method must not throw any
+            exceptions.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.IDisposable.Dispose"/> method.  Zero if this method is
+            being called from the finalizer.
+            </param>
+        </member>
+        <member name="P:System.Data.SQLite.Generic.SQLiteVirtualTableCursorEnumerator`1.System#Collections#Generic#IEnumerator{T}#Current">
+            <summary>
+            Returns the value for the current row of the virtual table cursor
+            using the <see cref="P:System.Collections.Generic.IEnumerator`1.Current"/> property of the
+            <see cref="T:System.Collections.Generic.IEnumerator`1"/> object instance.
+            </summary>
+        </member>
+        <member name="T:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1">
+            <summary>
+            This class implements a virtual table module that exposes an
+            <see cref="T:System.Collections.Generic.IEnumerable`1"/> object instance as a read-only virtual
+            table.  It is not sealed and may be used as the base class for any
+            user-defined virtual table class that wraps an
+            <see cref="T:System.Collections.Generic.IEnumerable`1"/> object instance.
+            </summary>
+        </member>
+        <member name="F:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.enumerable">
+            <summary>
+            The <see cref="T:System.Collections.Generic.IEnumerable`1"/> instance containing the backing
+            data for the virtual table.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.#ctor(System.String,System.Collections.Generic.IEnumerable{`0})">
+            <summary>
+            Constructs an instance of this class.
+            </summary>
+            <param name="name">
+            The name of the module.  This parameter cannot be null.
+            </param>
+            <param name="enumerable">
+            The <see cref="T:System.Collections.Generic.IEnumerable`1"/> instance to expose as a virtual
+            table.  This parameter cannot be null.
+            </param>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </summary>
+            <param name="table">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </param>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Open(System.Data.SQLite.SQLiteVirtualTable,System.Data.SQLite.SQLiteVirtualTableCursor@)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)">
+            <summary>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </summary>
+            <param name="cursor">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <param name="context">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <param name="index">
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </param>
+            <returns>
+            See the <see cref="M:System.Data.SQLite.ISQLiteManagedModule.Column(System.Data.SQLite.SQLiteVirtualTableCursor,System.Data.SQLite.SQLiteContext,System.Int32)"/> method.
+            </returns>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.CheckDisposed">
+            <summary>
+            Throws an <see cref="T:System.ObjectDisposedException"/> if this object
+            instance has been disposed.
+            </summary>
+        </member>
+        <member name="M:System.Data.SQLite.Generic.SQLiteModuleEnumerable`1.Dispose(System.Boolean)">
+            <summary>
+            Disposes of this object instance.
+            </summary>
+            <param name="disposing">
+            Non-zero if this method is being called from the
+            <see cref="M:System.IDisposable.Dispose"/> method.  Zero if this method is
+            being called from the finalizer.
+            </param>
+        </member>
+    </members>
+</doc>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/System.Data.SQLite.1.0.90.0/tools/install.ps1	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,36 @@
+###############################################################################
+#
+# install.ps1 --
+#
+# Written by Joe Mistachkin.
+# Released to the public domain, use at your own risk!
+#
+###############################################################################
+
+param($installPath, $toolsPath, $package, $project)
+
+$platformNames = "x86", "x64"
+$fileName = "SQLite.Interop.dll"
+$propertyName = "CopyToOutputDirectory"
+
+foreach($platformName in $platformNames) {
+  $folder = $project.ProjectItems.Item($platformName)
+
+  if ($folder -eq $null) {
+    continue
+  }
+
+  $item = $folder.ProjectItems.Item($fileName)
+
+  if ($item -eq $null) {
+    continue
+  }
+
+  $property = $item.Properties.Item($propertyName)
+
+  if ($property -eq $null) {
+    continue
+  }
+
+  $property.Value = 1
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/dotConnect.Express.for.Oracle.8.1.36/content/app.config.transform	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<configuration>
+  <system.data> 
+    <DbProviderFactories> 
+      <add name="dotConnect for Oracle" invariant="Devart.Data.Oracle" description="Devart dotConnect for Oracle" type="Devart.Data.Oracle.OracleProviderFactory, Devart.Data.Oracle, Version=8.1.36.0, Culture=neutral, PublicKeyToken=09af7300eec23701" />
+    </DbProviderFactories> 
+  </system.data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/dotConnect.Express.for.Oracle.8.1.36/content/web.config.transform	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<configuration>
+  <system.data> 
+   <DbProviderFactories> 
+     <add name="dotConnect for Oracle" invariant="Devart.Data.Oracle" description="Devart dotConnect for Oracle" type="Devart.Data.Oracle.OracleProviderFactory, Devart.Data.Oracle, Version=8.1.36.0, Culture=neutral, PublicKeyToken=09af7300eec23701" />
+    </DbProviderFactories> 
+  </system.data>
+</configuration>
\ No newline at end of file
Binary file packages/dotConnect.Express.for.Oracle.8.1.36/dotConnect.Express.for.Oracle.8.1.36.nupkg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/dotConnect.Express.for.Oracle.8.1.36/dotConnect.Express.for.Oracle.8.1.36.nuspec	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
+  <metadata>
+    <id>dotConnect.Express.for.Oracle</id>
+    <version>8.1.36</version>
+    <title>dotConnect Express for Oracle</title>
+    <authors>Devart Software</authors>
+    <owners>Devart Software</owners>
+    <projectUrl>http://www.devart.com/dotconnect/oracle</projectUrl>
+    <iconUrl>http://www.devart.com/content/images/logos/dcoracle-white_fb.png</iconUrl>
+    <requireLicenseAcceptance>false</requireLicenseAcceptance>
+    <description>dotConnect Express for Oracle is a free of charge enhanced database connectivity solution built over ADO.NET architecture and a development framework with a number of innovative technologies. dotConnect offers a complete solution for developing database-related applications and web sites. It introduces new approaches for designing applications and boosts productivity of database application development.</description>
+    <summary>dotConnect Express for Oracle is a free of charge enhanced database connectivity solution built over ADO.NET architecture and a development framework with a number of innovative technologies.</summary>
+    <copyright>Copyright � 1998 - 2013 Devart</copyright>
+    <language>en-US</language>
+    <tags>Oracle ADO.NET provider Database</tags>
+  </metadata>
+</package>
\ No newline at end of file
Binary file packages/dotConnect.Express.for.Oracle.8.1.36/lib/Devart.Data.Oracle.dll has changed
Binary file packages/dotConnect.Express.for.Oracle.8.1.36/lib/Devart.Data.dll has changed
Binary file packages/odp.net.managed.121.1.1/lib/net40/Oracle.ManagedDataAccess.dll has changed
Binary file packages/odp.net.managed.121.1.1/odp.net.managed.121.1.1.nupkg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/odp.net.managed.121.1.1/odp.net.managed.121.1.1.nuspec	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
+  <metadata>
+    <id>odp.net.managed</id>
+    <version>121.1.1</version>
+    <title>Oracle Data Provider for .NET (ODP.NET) Managed Driver</title>
+    <authors>Oracle</authors>
+    <owners>Oracle</owners>
+    <licenseUrl>http://www.oracle.com/technetwork/licenses/ea-license-noexhibits-1938914.html</licenseUrl>
+    <projectUrl>http://www.oracle.com/technetwork/topics/dotnet/index-085163.html</projectUrl>
+    <requireLicenseAcceptance>true</requireLicenseAcceptance>
+    <description>This package contains Oracle Data Provider for .NET (ODP.NET), Managed driver, i.e. Oracle.ManagedDataAccess.dll. Note, this package does not include support for distributed transactions, i.e. Oracle.ManagedDataAccessDTC.dll, as this support is architecture dependent, and only needed at runtime.</description>
+    <releaseNotes>ODP.NET Managed Driver 12c Release 1 - released August 13, 2013.</releaseNotes>
+    <copyright>Copyright (c) Oracle Corporation 1998-2013</copyright>
+    <tags>Oracle ODP.NET</tags>
+  </metadata>
+</package>
\ No newline at end of file
Binary file packages/odp.net.x86.112.3.20/lib/net20/Oracle.DataAccess.dll has changed
Binary file packages/odp.net.x86.112.3.20/lib/net40/Oracle.DataAccess.dll has changed
Binary file packages/odp.net.x86.112.3.20/odp.net.x86.112.3.20.nupkg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/odp.net.x86.112.3.20/odp.net.x86.112.3.20.nuspec	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
+  <metadata>
+    <id>odp.net.x86</id>
+    <version>112.3.20</version>
+    <title>Oracle Data Provier for .NET (ODP.NET) x86</title>
+    <authors>Oracle</authors>
+    <owners>Oracle</owners>
+    <licenseUrl>http://www.oracle.com/technetwork/licenses/odt-lic-152011.html</licenseUrl>
+    <projectUrl>http://www.oracle.com/technetwork/topics/dotnet/index-085163.html</projectUrl>
+    <requireLicenseAcceptance>true</requireLicenseAcceptance>
+    <description>This NuGet package contains Oracle.DataAccess.dll (x86 - both the net20 and net40 versions) needed to compile a project that uses Oracle's ODP.NET Library. Oracle will still need to be installed on the production or development machine in order to connect to Oracle (those libraries are greater than 100MB in size, so it didn't make sense to include them in a NuGet package), but this package will at least allow the project to be successfully built (i.e. if you're using a CI server).</description>
+    <releaseNotes />
+    <copyright />
+    <language />
+    <references>
+      <reference file="Oracle.DataAccess.dll" />
+    </references>
+  </metadata>
+</package>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/packages/repositories.config	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<repositories>
+  <repository path="..\DataProviders\DevartOraclePro\packages.config" />
+  <repository path="..\DataProviders\Firebird\packages.config" />
+  <repository path="..\DataProviders\MySql\packages.config" />
+  <repository path="..\DataProviders\Oracle\packages.config" />
+  <repository path="..\DataProviders\PostgreSQL\packages.config" />
+  <repository path="..\DataProviders\SqlCe\packages.config" />
+  <repository path="..\DataProviders\SQLite\packages.config" />
+  <repository path="..\Examples\CS\packages.config" />
+  <repository path="..\Examples\VB\packages.config" />
+  <repository path="..\Extensions\JointureAddOn\packages.config" />
+  <repository path="..\HowTo\packages.config" />
+  <repository path="..\Tools\Templates\packages.config" />
+  <repository path="..\UnitTests\All\packages.config" />
+  <repository path="..\UnitTests\CS\packages.config" />
+  <repository path="..\UnitTests\Linq\packages.config" />
+</repositories>
\ No newline at end of file